From 05f6bcf211a52848f89b6f2b85b7d6e00ad0e305 Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Mon, 17 Apr 2023 10:10:55 +0200 Subject: [PATCH 001/289] Bump v12.5.0.1 --- CHANGELOG.md | 22 ++++++++++----- README.md | 2 +- RELEASENOTES.md | 45 +++---------------------------- tasmota/include/tasmota_version.h | 2 +- 4 files changed, 21 insertions(+), 50 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a04170531..852b29bbe 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,22 @@ All notable changes to this project will be documented in this file. ## [Unreleased] - Development +## [12.5.0.1] +### Added + +### Breaking Changed + +### Changed + +### Fixed + +### Removed + +## [Released] + +## [12.5.0] 20230417 +- Release Peyton + ## [12.4.0.5] 20230417 ### Added - Matter support for Light and Relays on ESP32 by Stephan Hadinger (#18320) @@ -14,8 +30,6 @@ All notable changes to this project will be documented in this file. - Berry add `searchall()` and `matchall()` to `re` module and pre-compiled patterns (#18429) - Matter automatically exposes all detected Temperature sensors (#18430) -### Breaking Changed - ### Changed - ESP32 LVGL library from v8.3.5 to v8.3.6 (no functional change) @@ -23,8 +37,6 @@ All notable changes to this project will be documented in this file. - ESP32 ``Upload``, ``Upgrade``, ``WebGetConfig``, ``WebQuery`` and ``WebSend`` random HTTP(S) connection timeout set to 5 sec (commit 542eca3) - ESP32 energy monitoring set StartTotalTime regression from v12.3.1.5 (#18385) -### Removed - ## [12.4.0.4] 20230403 ### Added - Matter support simple Relay on Apple Homekit by Stephan Hadinger (#18239) @@ -96,8 +108,6 @@ All notable changes to this project will be documented in this file. - IR panasonic protocol regression from v12.0.2.4 (#18013) - EnergyTotal divided twice during minimal upgrade step regression from v12.3.1.3 (#18024) -## [Released] - ## [12.4.0] 20230216 - Release Peter diff --git a/README.md b/README.md index e41499fbf..efbfc44a9 100644 --- a/README.md +++ b/README.md @@ -32,7 +32,7 @@ Firmware binaries can be downloaded from http://ota.tasmota.com/tasmota/release/ ## Development -[![Dev Version](https://img.shields.io/badge/development%20version-v12.3.x.x-blue.svg)](https://github.com/arendst/Tasmota) +[![Dev Version](https://img.shields.io/badge/development%20version-v12.5.x.x-blue.svg)](https://github.com/arendst/Tasmota) [![Download Dev](https://img.shields.io/badge/download-development-yellow.svg)](http://ota.tasmota.com/tasmota/) [![Tasmota CI](https://github.com/arendst/Tasmota/actions/workflows/build_all_the_things.yml/badge.svg)](https://github.com/arendst/Tasmota/actions/workflows/build_all_the_things.yml) [![Build_development](https://github.com/arendst/Tasmota/actions/workflows/Tasmota_build_devel.yml/badge.svg)](https://github.com/arendst/Tasmota/actions/workflows/Tasmota_build_devel.yml) diff --git a/RELEASENOTES.md b/RELEASENOTES.md index efe231a86..ac781716f 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -75,7 +75,7 @@ Latest released binaries can be downloaded from - http://ota.tasmota.com/tasmota/release Historical binaries can be downloaded from -- http://ota.tasmota.com/tasmota/release-12.4.0 +- http://ota.tasmota.com/tasmota/release-12.5.0 The latter links can be used for OTA upgrades too like ``OtaUrl http://ota.tasmota.com/tasmota/release/tasmota.bin.gz`` @@ -100,7 +100,7 @@ Latest released binaries can be downloaded from - https://ota.tasmota.com/tasmota32/release Historical binaries can be downloaded from -- https://ota.tasmota.com/tasmota32/release-12.4.0 +- https://ota.tasmota.com/tasmota32/release-12.5.0 The latter links can be used for OTA upgrades too like ``OtaUrl https://ota.tasmota.com/tasmota32/release/tasmota32.bin`` @@ -110,50 +110,11 @@ The latter links can be used for OTA upgrades too like ``OtaUrl https://ota.tasm [Complete list](BUILDS.md) of available feature and sensors. -## Changelog v12.4.0.5 +## Changelog v12.5.0.1 ### Added -- Command ``SwitchMode0`` to show or set all SwitchModes -- Support for multiple MCP23008/MCP23017/MCP23S17 as switch/button/relay if enabled with `#define USE_MCP23XXX_DRV` -- Support for multiple PCF8574 as switch/button/relay if enabled with `#define USE_PCF8574` and `#define USE_PCF8574_MODE2` -- Support for PMSA003I Air Quality Sensor by Jean-Pierre Deschamps [#18214](https://github.com/arendst/Tasmota/issues/18214) -- Support for DingTian virtual switch/button/relay [#18223](https://github.com/arendst/Tasmota/issues/18223) -- Support for GDK101 gamma radiation sensor by Petr Novacek [#18390](https://github.com/arendst/Tasmota/issues/18390) -- NTP time request from gateway [#17984](https://github.com/arendst/Tasmota/issues/17984) -- Extended Tariff command for forced tariff [#18080](https://github.com/arendst/Tasmota/issues/18080) -- Display TM1650 commands like TM1637 [#18109](https://github.com/arendst/Tasmota/issues/18109) -- VSC Pio menu bar extensions by @Jason2866 [#18233](https://github.com/arendst/Tasmota/issues/18233) -- Zigbee send Tuya 'magic spell' to unlock devices when pairing [#18144](https://github.com/arendst/Tasmota/issues/18144) -- ESP32 WIP support for 16 shutters using `#define USE_SHUTTER_ESP32` in addition to `USE_SHUTTER` by Stefan Bode [#18295](https://github.com/arendst/Tasmota/issues/18295) -- Berry support for Tensorflow Lite (TFL) by Christiaan Baars [#18119](https://github.com/arendst/Tasmota/issues/18119) -- Berry `webclient` features -- Berry `instrospect.name()` to get names of functions, modules and classes [#18422](https://github.com/arendst/Tasmota/issues/18422) -- Berry add `searchall()` and `matchall()` to `re` module and pre-compiled patterns [#18429](https://github.com/arendst/Tasmota/issues/18429) -- Matter support for Light and Relays by Stephan Hadinger [#18320](https://github.com/arendst/Tasmota/issues/18320) -- Matter automatically exposes all detected Temperature sensors [#18430](https://github.com/arendst/Tasmota/issues/18430) ### Breaking Changed -- Shelly Pro 4PM using standard MCP23xxx driver and needs one time Auto-Configuration ### Changed -- ESP32 Framework (Core) from v2.0.6 to v2.0.7 -- ESP32 LVGL library from v8.3.3 to v8.3.6 (no functional change) -- LibTeleinfo from v1.1.3 to v1.1.5 [#18050](https://github.com/arendst/Tasmota/issues/18050) -- Increase number of (virtual)relays and (virtual)buttons to 32 -- ADC Range oversample from 2 to 32 [#17975](https://github.com/arendst/Tasmota/issues/17975) -- Move #define OTA_URL from user_config.h to board files for better inital support [#18008](https://github.com/arendst/Tasmota/issues/18008) -- Removed absolute url from filesystem [#18148](https://github.com/arendst/Tasmota/issues/18148) ### Fixed -- TuyaMcu v1 sequence fix [#17625](https://github.com/arendst/Tasmota/issues/17625) -- SEN5X floats and units [#17961](https://github.com/arendst/Tasmota/issues/17961) -- Energytotals cannot be set to negative values [#17965](https://github.com/arendst/Tasmota/issues/17965) -- SR04 driver single pin ultrasonic sensor detection [#17966](https://github.com/arendst/Tasmota/issues/17966) -- IR panasonic protocol regression from v12.0.2.4 [#18013](https://github.com/arendst/Tasmota/issues/18013) -- EnergyTotal divided twice during minimal upgrade step regression from v12.3.1.3 [#18024](https://github.com/arendst/Tasmota/issues/18024) -- TuyaMcu v1 timer integer overflow [#18048](https://github.com/arendst/Tasmota/issues/18048) -- PZEM energy monitor stabilize period on larger configs [#18103](https://github.com/arendst/Tasmota/issues/18103) -- Rule topic comparison [#18144](https://github.com/arendst/Tasmota/issues/18144) -- Refactor energy monitoring reducing stack usage and solve inherent exceptions and watchdogs [#18164](https://github.com/arendst/Tasmota/issues/18164) -- ESP32 ``Upload``, ``Upgrade``, ``WebGetConfig``, ``WebQuery`` and ``WebSend`` random HTTP(S) connection timeout set to 5 sec (commit 542eca3) -- ESP32 energy period shows kWh value instead of Wh regression from v12.3.1.5 [#15856](https://github.com/arendst/Tasmota/issues/15856) -- ESP32 energy monitoring set StartTotalTime regression from v12.3.1.5 [#18385](https://github.com/arendst/Tasmota/issues/18385) \ No newline at end of file diff --git a/tasmota/include/tasmota_version.h b/tasmota/include/tasmota_version.h index 8a905cbe8..5d31fe5bd 100644 --- a/tasmota/include/tasmota_version.h +++ b/tasmota/include/tasmota_version.h @@ -20,6 +20,6 @@ #ifndef _TASMOTA_VERSION_H_ #define _TASMOTA_VERSION_H_ -const uint32_t VERSION = 0x0C040005; // 12.4.0.5 +const uint32_t VERSION = 0x0C050001; // 12.5.0.1 #endif // _TASMOTA_VERSION_H_ From 9150de9df8fe7cba4923b815b03ae8d9ec76273a Mon Sep 17 00:00:00 2001 From: s-hadinger <49731213+s-hadinger@users.noreply.github.com> Date: Mon, 17 Apr 2023 20:58:34 +0200 Subject: [PATCH 002/289] Matter try workaround for iOS 16.5beta1 (#18440) --- .../src/embedded/Matter_Commissioning.be | 5 ++++ .../solidified_Matter_Commissioning.h | 29 ++++++++++++++++--- 2 files changed, 30 insertions(+), 4 deletions(-) diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Commissioning.be b/lib/libesp32/berry_matter/src/embedded/Matter_Commissioning.be index 87c9b2881..546c05fb4 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Commissioning.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Commissioning.be @@ -304,6 +304,11 @@ class Matter_Commisioning_Context return fabric end end + # TODO if there is only 1 fabric, we can try to use it anyways + if size(self.device.sessions.fabrics) == 1 + tasmota.log("MTR: *** Could not find fabric, trying only fabric in store", 2) + return self.device.sessions.fabrics[0] + end return nil end diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Commissioning.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Commissioning.h index af2acb9fa..486fbdcdf 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Commissioning.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Commissioning.h @@ -66,7 +66,7 @@ be_local_closure(Matter_Commisioning_Context_find_fabric_by_destination_id, /* 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[21]) { /* constants */ + ( &(const bvalue[25]) { /* constants */ /* K0 */ be_nested_str_weak(crypto), /* K1 */ be_nested_str_weak(tasmota), /* K2 */ be_nested_str_weak(log), @@ -88,10 +88,14 @@ be_local_closure(Matter_Commisioning_Context_find_fabric_by_destination_id, /* /* K18 */ be_nested_str_weak(out), /* K19 */ be_nested_str_weak(MTR_X3A_X20SIGMA1_X3A_X20candidateDestinationId_X3D), /* K20 */ be_nested_str_weak(stop_iteration), + /* K21 */ be_const_int(1), + /* K22 */ be_nested_str_weak(MTR_X3A_X20_X2A_X2A_X2A_X20Could_X20not_X20find_X20fabric_X2C_X20trying_X20only_X20fabric_X20in_X20store), + /* K23 */ be_const_int(2), + /* K24 */ be_const_int(0), }), be_str_weak(find_fabric_by_destination_id), &be_const_str_solidified, - ( &(const binstruction[77]) { /* code */ + ( &(const binstruction[94]) { /* code */ 0xA40E0000, // 0000 IMPORT R3 K0 0xB8120200, // 0001 GETNGBL R4 K1 0x8C100902, // 0002 GETMET R4 R4 K2 @@ -167,8 +171,25 @@ be_local_closure(Matter_Commisioning_Context_find_fabric_by_destination_id, /* 0x58100014, // 0048 LDCONST R4 K20 0xAC100200, // 0049 CATCH R4 1 0 0xB0080000, // 004A RAISE 2 R0 R0 - 0x4C100000, // 004B LDNIL R4 - 0x80040800, // 004C RET 1 R4 + 0x6010000C, // 004B GETGBL R4 G12 + 0x88140106, // 004C GETMBR R5 R0 K6 + 0x88140B07, // 004D GETMBR R5 R5 K7 + 0x88140B08, // 004E GETMBR R5 R5 K8 + 0x7C100200, // 004F CALL R4 1 + 0x1C100915, // 0050 EQ R4 R4 K21 + 0x78120009, // 0051 JMPF R4 #005C + 0xB8120200, // 0052 GETNGBL R4 K1 + 0x8C100902, // 0053 GETMET R4 R4 K2 + 0x58180016, // 0054 LDCONST R6 K22 + 0x581C0017, // 0055 LDCONST R7 K23 + 0x7C100600, // 0056 CALL R4 3 + 0x88100106, // 0057 GETMBR R4 R0 K6 + 0x88100907, // 0058 GETMBR R4 R4 K7 + 0x88100908, // 0059 GETMBR R4 R4 K8 + 0x94100918, // 005A GETIDX R4 R4 K24 + 0x80040800, // 005B RET 1 R4 + 0x4C100000, // 005C LDNIL R4 + 0x80040800, // 005D RET 1 R4 }) ) ); From 4bac940a407c68bca1c6ee2cc4d34bd7f0bb7087 Mon Sep 17 00:00:00 2001 From: s-hadinger <49731213+s-hadinger@users.noreply.github.com> Date: Mon, 17 Apr 2023 21:49:12 +0200 Subject: [PATCH 003/289] Matter add sensors: Humidity, Pressure, Illuminance; optimize memory (#18441) --- CHANGELOG.md | 1 + lib/libesp32/berry/default/berry_conf.h | 2 +- .../berry_matter/src/be_matter_module.c | 12 +- .../src/embedded/Matter_Commissioning.be | 8 +- .../src/embedded/Matter_Device.be | 55 ++- .../berry_matter/src/embedded/Matter_IM.be | 44 +- .../src/embedded/Matter_IM_Message.be | 23 +- .../src/embedded/Matter_Plugin_Sensor.be | 76 ++++ .../embedded/Matter_Plugin_Sensor_Humidity.be | 84 ++++ .../embedded/Matter_Plugin_Sensor_Light.be | 84 ++++ .../embedded/Matter_Plugin_Sensor_Pressure.be | 84 ++++ ...Sensor.be => Matter_Plugin_Sensor_Temp.be} | 69 +--- .../berry_matter/src/embedded/Matter_TLV.be | 16 +- .../solidified_Matter_Commissioning.h | 29 +- .../src/solidify/solidified_Matter_Device.h | 295 +++++++++++--- .../src/solidify/solidified_Matter_IM.h | 376 ++++++++++-------- .../solidify/solidified_Matter_IM_Message.h | 287 ++++++------- .../solidified_Matter_Plugin_Sensor.h | 179 +++++++++ ...solidified_Matter_Plugin_Sensor_Humidity.h | 220 ++++++++++ .../solidified_Matter_Plugin_Sensor_Light.h | 219 ++++++++++ ...solidified_Matter_Plugin_Sensor_Pressure.h | 219 ++++++++++ .../solidified_Matter_Plugin_Sensor_Temp.h | 215 ++++++++++ .../solidified_Matter_Plugin_Temp_Sensor.h | 295 -------------- .../src/solidify/solidified_Matter_TLV.h | 75 ++-- 24 files changed, 2135 insertions(+), 832 deletions(-) create mode 100644 lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor.be create mode 100644 lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor_Humidity.be create mode 100644 lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor_Light.be create mode 100644 lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor_Pressure.be rename lib/libesp32/berry_matter/src/embedded/{Matter_Plugin_Temp_Sensor.be => Matter_Plugin_Sensor_Temp.be} (51%) create mode 100644 lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor.h create mode 100644 lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor_Humidity.h create mode 100644 lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor_Light.h create mode 100644 lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor_Pressure.h create mode 100644 lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor_Temp.h delete mode 100644 lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Temp_Sensor.h diff --git a/CHANGELOG.md b/CHANGELOG.md index 852b29bbe..d1a2655cc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -29,6 +29,7 @@ All notable changes to this project will be documented in this file. - Berry `instrospect.name()` to get names of functions, modules and classes (#18422) - Berry add `searchall()` and `matchall()` to `re` module and pre-compiled patterns (#18429) - Matter automatically exposes all detected Temperature sensors (#18430) +- Matter add sensors: Humidity, Pressure, Illuminance; optimize memory ### Changed - ESP32 LVGL library from v8.3.5 to v8.3.6 (no functional change) diff --git a/lib/libesp32/berry/default/berry_conf.h b/lib/libesp32/berry/default/berry_conf.h index 18d64ad81..d4aa71573 100644 --- a/lib/libesp32/berry/default/berry_conf.h +++ b/lib/libesp32/berry/default/berry_conf.h @@ -226,7 +226,7 @@ #define BE_USE_OS_MODULE 0 #define BE_USE_GLOBAL_MODULE 1 #define BE_USE_SYS_MODULE 1 - #define BE_USE_DEBUG_MODULE 0 + #define BE_USE_DEBUG_MODULE 1 #define BE_USE_GC_MODULE 1 #define BE_USE_SOLIDIFY_MODULE 0 #define BE_USE_INTROSPECT_MODULE 1 diff --git a/lib/libesp32/berry_matter/src/be_matter_module.c b/lib/libesp32/berry_matter/src/be_matter_module.c index 8b5d31b5c..8dbccd3a9 100644 --- a/lib/libesp32/berry_matter/src/be_matter_module.c +++ b/lib/libesp32/berry_matter/src/be_matter_module.c @@ -159,7 +159,11 @@ extern const bclass be_class_Matter_TLV; // need to declare it upfront because #include "solidify/solidified_Matter_Plugin_Light1.h" #include "solidify/solidified_Matter_Plugin_Light2.h" #include "solidify/solidified_Matter_Plugin_Light3.h" -#include "solidify/solidified_Matter_Plugin_Temp_Sensor.h" +#include "solidify/solidified_Matter_Plugin_Sensor.h" +#include "solidify/solidified_Matter_Plugin_Sensor_Pressure.h" +#include "solidify/solidified_Matter_Plugin_Sensor_Temp.h" +#include "solidify/solidified_Matter_Plugin_Sensor_Light.h" +#include "solidify/solidified_Matter_Plugin_Sensor_Humidity.h" /*********************************************************************************************\ * Get a bytes() object of the certificate DAC/PAI_Cert @@ -333,7 +337,11 @@ module matter (scope: global, strings: weak) { Plugin_Light1, class(be_class_Matter_Plugin_Light1) // Dimmable Light Plugin_Light2, class(be_class_Matter_Plugin_Light2) // Color Temperature Light Plugin_Light3, class(be_class_Matter_Plugin_Light3) // Extended Color Light - Plugin_Temp_Sensor, class(be_class_Matter_Plugin_Temp_Sensor) // Temperature Sensor + Plugin_Sensor, class(be_class_Matter_Plugin_Sensor) // Generic Sensor + Plugin_Sensor_Pressure, class(be_class_Matter_Plugin_Sensor_Pressure) // Pressure Sensor + Plugin_Sensor_Temp, class(be_class_Matter_Plugin_Sensor_Temp) // Temperature Sensor + Plugin_Sensor_Light, class(be_class_Matter_Plugin_Sensor_Light) // Light Sensor + Plugin_Sensor_Humidity, class(be_class_Matter_Plugin_Sensor_Humidity) // Humidity Sensor } @const_object_info_end */ diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Commissioning.be b/lib/libesp32/berry_matter/src/embedded/Matter_Commissioning.be index 546c05fb4..7235186e4 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Commissioning.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Commissioning.be @@ -305,10 +305,10 @@ class Matter_Commisioning_Context end end # TODO if there is only 1 fabric, we can try to use it anyways - if size(self.device.sessions.fabrics) == 1 - tasmota.log("MTR: *** Could not find fabric, trying only fabric in store", 2) - return self.device.sessions.fabrics[0] - end + # if size(self.device.sessions.fabrics) == 1 + # tasmota.log("MTR: *** Could not find fabric, trying only fabric in store", 2) + # return self.device.sessions.fabrics[0] + # end return nil end diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Device.be b/lib/libesp32/berry_matter/src/embedded/Matter_Device.be index fddeea62e..f4ce634a9 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Device.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Device.be @@ -147,6 +147,10 @@ class Matter_Device var pairing_code = self.compute_manual_pairing_code() tasmota.log(string.format("MTR: Manual pairing code: %s-%s-%s", pairing_code[0..3], pairing_code[4..6], pairing_code[7..]), 2) + # output MQTT + var qr_code = self.compute_qrcode_content() + tasmota.publish_result(string.format('{"Matter":{"Commissioning":1,"PairingCode":"%s","QRCode":"%s"}}', pairing_code, qr_code), 'Matter') + # compute PBKDF self._compute_pbkdf(self.root_passcode, self.root_iterations, self.root_salt) self.start_basic_commissioning(timeout_s, self.root_iterations, self.root_discriminator, self.root_salt, self.root_w0, #-self.root_w1,-# self.root_L, nil) @@ -202,6 +206,9 @@ class Matter_Device ############################################################# # Stop PASE commissioning, mostly called when CASE is about to start def stop_basic_commissioning() + if self.is_root_commissioning_open() + tasmota.publish_result('{"Matter":{"Commissioning":0}}', 'Matter') + end self.commissioning_open = nil self.mdns_remove_PASE() @@ -548,6 +555,7 @@ class Matter_Device ctx.cluster = cl ctx.attribute = at var finished = cb(pi, ctx, direct) # call the callback with the plugin and the context + # tasmota.log("MTR: gc="+str(tasmota.gc()), 2) if direct && finished return end end end @@ -955,13 +963,55 @@ class Matter_Device var sensor_2 = sensors[k1] if isinstance(sensor_2, map) && sensor_2.contains("Temperature") var temp_rule = k1 + "#Temperature" - self.plugins.push(matter.Plugin_Temp_Sensor(self, endpoint, temp_rule)) + self.plugins.push(matter.Plugin_Sensor_Temp(self, endpoint, temp_rule)) tasmota.log(string.format("MTR: Endpoint:%i Temperature (%s)", endpoint, temp_rule), 2) endpoint += 1 end if endpoint > 0x28 break end end + # pressure sensors + # they are starting at endpoint `40..47` (8 max) + endpoint = 0x28 + for k1:self.k2l(sensors) + var sensor_2 = sensors[k1] + if isinstance(sensor_2, map) && sensor_2.contains("Pressure") + var temp_rule = k1 + "#Pressure" + self.plugins.push(matter.Plugin_Sensor_Pressure(self, endpoint, temp_rule)) + tasmota.log(string.format("MTR: Endpoint:%i Pressure (%s)", endpoint, temp_rule), 2) + endpoint += 1 + end + if endpoint > 0x2F break end + end + + # light sensors + # they are starting at endpoint `48..55` (8 max) + endpoint = 0x30 + for k1:self.k2l(sensors) + var sensor_2 = sensors[k1] + if isinstance(sensor_2, map) && sensor_2.contains("Illuminance") + var temp_rule = k1 + "#Illuminance" + self.plugins.push(matter.Plugin_Sensor_Light(self, endpoint, temp_rule)) + tasmota.log(string.format("MTR: Endpoint:%i Light (%s)", endpoint, temp_rule), 2) + endpoint += 1 + end + if endpoint > 0x38 break end + end + + # huidity sensors + # they are starting at endpoint `56..63` (8 max) + endpoint = 0x38 + for k1:self.k2l(sensors) + var sensor_2 = sensors[k1] + if isinstance(sensor_2, map) && sensor_2.contains("Humidity") + var temp_rule = k1 + "#Humidity" + self.plugins.push(matter.Plugin_Sensor_Humidity(self, endpoint, temp_rule)) + tasmota.log(string.format("MTR: Endpoint:%i Humidity (%s)", endpoint, temp_rule), 2) + endpoint += 1 + end + if endpoint > 0x40 break end + end + end # get keys of a map in sorted order @@ -969,9 +1019,6 @@ class Matter_Device for i:1..size(l)-1 var k = l[i] var j = i while (j > 0) && (l[j-1] > k) l[j] = l[j-1] j -= 1 end l[j] = k end return l end - - # keys to llist - end matter.Device = Matter_Device diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_IM.be b/lib/libesp32/berry_matter/src/embedded/Matter_IM.be index ca6e2efcc..50c17bd82 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_IM.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_IM.be @@ -221,7 +221,11 @@ class Matter_IM attr_name = attr_name ? " (" + attr_name + ")" : "" # Special case to report unsupported item, if pi==nil var res = (pi != nil) ? pi.read_attribute(session, ctx) : nil + var found = true # stop expansion since we have a value + var a1_raw # this is the bytes() block we need to add to response (or nil) if res != nil + var res_str = str(res) # get the value with anonymous tag before it is tagged, for logging + var a1 = matter.AttributeReportIB() a1.attribute_data = matter.AttributeDataIB() a1.attribute_data.data_version = 1 @@ -233,16 +237,15 @@ class Matter_IM var a1_tlv = a1.to_TLV() var a1_len = a1_tlv.encode_len() - var a1_bytes = bytes(a1_len) - var a2 = TLV.create_TLV(TLV.RAW, a1_tlv.tlv2raw(a1_bytes)) + var a1_bytes = bytes(a1_len) # pre-size bytes() to the actual size + a1_raw = a1_tlv.tlv2raw(a1_bytes) + # tasmota.log(string.format("MTR: guessed len=%i actual=%i '%s'", a1_len, size(a1_raw), a1_raw.tohex()), 2) - ret.attribute_reports.push(a2) if !no_log - tasmota.log(string.format("MTR: >Read_Attr (%6i) %s%s - %s", session.local_session_id, str(ctx), attr_name, str(res)), 2) - end - return true # stop expansion since we have a value + tasmota.log(string.format("MTR: >Read_Attr (%6i) %s%s - %s", session.local_session_id, str(ctx), attr_name, res_str), 2) + end elif ctx.status != nil - if direct + if direct # we report an error only if a concrete direct read, not with wildcards var a1 = matter.AttributeReportIB() a1.attribute_status = matter.AttributeStatusIB() a1.attribute_status.path = matter.AttributePathIB() @@ -254,18 +257,33 @@ class Matter_IM var a1_tlv = a1.to_TLV() var a1_len = a1_tlv.encode_len() - var a1_bytes = bytes(a1_len) - var a2 = TLV.create_TLV(TLV.RAW, a1_tlv.tlv2raw(a1_bytes)) - - ret.attribute_reports.push(a2) + var a1_bytes = bytes(a1_len) # pre-size bytes() to the actual size + a1_raw = a1_tlv.tlv2raw(a1_bytes) + tasmota.log(string.format("MTR: >Read_Attr (%6i) %s%s - STATUS: 0x%02X %s", session.local_session_id, str(ctx), attr_name, ctx.status, ctx.status == matter.UNSUPPORTED_ATTRIBUTE ? "UNSUPPORTED_ATTRIBUTE" : ""), 2) - return true end else tasmota.log(string.format("MTR: >Read_Attr (%6i) %s%s - IGNORED", session.local_session_id, str(ctx), attr_name), 2) # ignore if content is nil and status is undefined - return false + found = false end + + # check if we still have enough room in last block + if a1_raw # do we have bytes to add, and it's not zero size + if size(ret.attribute_reports) == 0 + ret.attribute_reports.push(a1_raw) # push raw binary instead of a TLV + else # already blocks present, see if we can add to the latest, or need to create a new block + var last_block = ret.attribute_reports[-1] + if size(last_block) + size(a1_raw) <= matter.IM_ReportData.MAX_MESSAGE + # add to last block + last_block .. a1_raw + else + ret.attribute_reports.push(a1_raw) # push raw binary instead of a TLV + end + end + end + + return found # return true if we had a match end var endpoints = self.device.get_active_endpoints() diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_IM_Message.be b/lib/libesp32/berry_matter/src/embedded/Matter_IM_Message.be index 4b3f3f219..b0cdaa32a 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_IM_Message.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_IM_Message.be @@ -171,26 +171,11 @@ class Matter_IM_ReportData : Matter_IM_Message var data = self.data # TLV data of the response (if any) var was_chunked = data.more_chunked_messages # is this following a chunked packet? - # compute the acceptable size - var msg_sz = 0 # message size up to now - var elements = 0 # number of elements added - var sz_attribute_reports = (data.attribute_reports != nil) ? size(data.attribute_reports) : 0 - if sz_attribute_reports > 0 - msg_sz = data.attribute_reports[0].to_TLV().encode_len() - elements = 1 - end - while msg_sz < self.MAX_MESSAGE && elements < sz_attribute_reports - var next_sz = data.attribute_reports[elements].to_TLV().encode_len() - if msg_sz + next_sz < self.MAX_MESSAGE - msg_sz += next_sz - elements += 1 - else - break - end - end + # the message were grouped by right-sized binaries upfront, we just need to send one block at time + var elements = 1 # number of elements added # tasmota.log(string.format("MTR: exch=%i elements=%i msg_sz=%i total=%i", self.get_exchangeid(), elements, msg_sz, sz_attribute_reports), 3) - var next_elemnts = [] + var next_elemnts if data.attribute_reports != nil next_elemnts = data.attribute_reports[elements .. ] data.attribute_reports = data.attribute_reports[0 .. elements - 1] @@ -222,7 +207,7 @@ class Matter_IM_ReportData : Matter_IM_Message responder.send_response_frame(resp) self.last_counter = resp.message_counter - if size(next_elemnts) > 0 + if next_elemnts != nil && size(next_elemnts) > 0 data.attribute_reports = next_elemnts tasmota.log(string.format("MTR: to_be_sent_later size=%i exch=%i", size(data.attribute_reports), resp.exchange_id), 3) self.ready = false # wait for Status Report before continuing sending diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor.be new file mode 100644 index 000000000..740b34c46 --- /dev/null +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor.be @@ -0,0 +1,76 @@ +# +# Matter_Plugin_Sensor.be - implements the behavior for a generic Sensor +# +# Copyright (C) 2023 Stephan Hadinger & Theo Arends +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +# + +# Matter plug-in for core behavior + +# dummy declaration for solidification +class Matter_Plugin_Device end + +#@ solidify:Matter_Plugin_Sensor,weak + +class Matter_Plugin_Sensor : Matter_Plugin_Device + var tasmota_sensor_filter # Rule-type filter to the value, like "ESP32#Temperature" + var tasmota_sensor_matcher # Actual matcher object + var shadow_value # Last known value + + ############################################################# + # Constructor + def init(device, endpoint, sensor_filter) + super(self).init(device, endpoint) + self.tasmota_sensor_filter = sensor_filter + self.tasmota_sensor_matcher = tasmota.Rule_Matcher.parse(sensor_filter) + end + + ############################################################# + # parse sensor + # + # The device calls regularly `tasmota.read_sensors()` and converts + # it to json. + def parse_sensors(payload) + if self.tasmota_sensor_matcher + var val = self.pre_value(real(self.tasmota_sensor_matcher.match(payload))) + if val != nil + if val != self.shadow_value + self.valued_changed(val) + end + self.shadow_value = val + end + end + end + + ############################################################# + # Called when the value changed compared to shadow value + # + # This must be overriden. + # This is where you call `self.attribute_updated(nil, , )` + def valued_changed(val) + # self.attribute_updated(nil, 0x0402, 0x0000) + end + + ############################################################# + # Pre-process value + # + # This must be overriden. + # This allows to convert the raw sensor value to the target one, typically int + def pre_value(val) + return val + end + +end +matter.Plugin_Sensor = Matter_Plugin_Sensor diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor_Humidity.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor_Humidity.be new file mode 100644 index 000000000..e06a9b54a --- /dev/null +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor_Humidity.be @@ -0,0 +1,84 @@ +# +# Matter_Plugin_Sensor_Pressure.be - implements the behavior for a Pressure Sensor +# +# Copyright (C) 2023 Stephan Hadinger & Theo Arends +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +# + +# Matter plug-in for core behavior + +# dummy declaration for solidification +class Matter_Plugin_Sensor end + +#@ solidify:Matter_Plugin_Sensor_Humidity,weak + +class Matter_Plugin_Sensor_Humidity : Matter_Plugin_Sensor + static var CLUSTERS = { + 0x0405: [0,1,2,0xFFFC,0xFFFD], # Humidity Measurement p.102 - no writable + } + static var TYPES = { 0x0307: 2 } # Humidity Sensor, rev 2 + + ############################################################# + # Pre-process value + # + # This must be overriden. + # This allows to convert the raw sensor value to the target one, typically int + def pre_value(val) + return int(val * 100) # 1/100th of percentage + end + + ############################################################# + # Called when the value changed compared to shadow value + # + # This must be overriden. + # This is where you call `self.attribute_updated(nil, , )` + def valued_changed(val) + self.attribute_updated(nil, 0x0405, 0x0000) + end + + ############################################################# + # read an attribute + # + def read_attribute(session, ctx) + import string + var TLV = matter.TLV + var cluster = ctx.cluster + var attribute = ctx.attribute + + # ==================================================================================================== + if cluster == 0x0405 # ========== Humidity Measurement 2.4 p.98 ========== + if attribute == 0x0000 # ---------- Humidity / u16 ---------- + if self.shadow_value != nil + return TLV.create_TLV(TLV.U2, int(self.shadow_value)) + else + return TLV.create_TLV(TLV.NULL, nil) + end + elif attribute == 0x0001 # ---------- MinMeasuredValue / u16 ---------- + return TLV.create_TLV(TLV.U2, 500) # 0% + elif attribute == 0x0002 # ---------- MaxMeasuredValue / u16 ---------- + return TLV.create_TLV(TLV.U2, 10000) # 100% + elif attribute == 0xFFFC # ---------- FeatureMap / map32 ---------- + return TLV.create_TLV(TLV.U4, 0) # 0 = no Extended Range + elif attribute == 0xFFFD # ---------- ClusterRevision / u2 ---------- + return TLV.create_TLV(TLV.U4, 3) # 3 = New data model format and notation + end + + else + return super(self).read_attribute(session, ctx) + end + end + +end +matter.Plugin_Sensor_Humidity = Matter_Plugin_Sensor_Humidity diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor_Light.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor_Light.be new file mode 100644 index 000000000..27faeef9b --- /dev/null +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor_Light.be @@ -0,0 +1,84 @@ +# +# Matter_Plugin_Sensor_Light.be - implements the behavior for a Light Sensor +# +# Copyright (C) 2023 Stephan Hadinger & Theo Arends +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +# + +# Matter plug-in for core behavior + +# dummy declaration for solidification +class Matter_Plugin_Sensor end + +#@ solidify:Matter_Plugin_Sensor_Light,weak + +class Matter_Plugin_Sensor_Light : Matter_Plugin_Sensor + static var CLUSTERS = { + 0x0400: [0,1,2,0xFFFC,0xFFFD], # Illuminance Measurement p.95 - no writable + } + static var TYPES = { 0x0106: 2 } # Temperature Sensor, rev 2 + + ############################################################# + # Pre-process value + # + # This must be overriden. + # This allows to convert the raw sensor value to the target one, typically int + def pre_value(val) + return int(val) # value in lux + end + + ############################################################# + # Called when the value changed compared to shadow value + # + # This must be overriden. + # This is where you call `self.attribute_updated(nil, , )` + def valued_changed(val) + self.attribute_updated(nil, 0x0400, 0x0000) + end + + ############################################################# + # read an attribute + # + def read_attribute(session, ctx) + import string + var TLV = matter.TLV + var cluster = ctx.cluster + var attribute = ctx.attribute + + # ==================================================================================================== + if cluster == 0x0400 # ========== Illuminance Measurement 2.2 p.95 ========== + if attribute == 0x0000 # ---------- MeasuredValue / i16 ---------- + if self.shadow_value != nil + return TLV.create_TLV(TLV.I2, int(self.shadow_value)) + else + return TLV.create_TLV(TLV.NULL, nil) + end + elif attribute == 0x0001 # ---------- MinMeasuredValue / i16 ---------- + return TLV.create_TLV(TLV.I2, 0) # 0 lux + elif attribute == 0x0002 # ---------- MaxMeasuredValue / i16 ---------- + return TLV.create_TLV(TLV.I2, 10000) # 10000 lux + elif attribute == 0xFFFC # ---------- FeatureMap / map32 ---------- + return TLV.create_TLV(TLV.U4, 0) + elif attribute == 0xFFFD # ---------- ClusterRevision / u2 ---------- + return TLV.create_TLV(TLV.U4, 3) # 3 = New data model format and notation + end + + else + return super(self).read_attribute(session, ctx) + end + end + +end +matter.Plugin_Sensor_Pressure = Matter_Plugin_Sensor_Pressure diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor_Pressure.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor_Pressure.be new file mode 100644 index 000000000..aa6366ce2 --- /dev/null +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor_Pressure.be @@ -0,0 +1,84 @@ +# +# Matter_Plugin_Sensor_Pressure.be - implements the behavior for a Pressure Sensor +# +# Copyright (C) 2023 Stephan Hadinger & Theo Arends +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +# + +# Matter plug-in for core behavior + +# dummy declaration for solidification +class Matter_Plugin_Sensor end + +#@ solidify:Matter_Plugin_Sensor_Pressure,weak + +class Matter_Plugin_Sensor_Pressure : Matter_Plugin_Sensor + static var CLUSTERS = { + 0x0403: [0,1,2,0xFFFC,0xFFFD], # Temperature Measurement p.97 - no writable + } + static var TYPES = { 0x0305: 2 } # Temperature Sensor, rev 2 + + ############################################################# + # Pre-process value + # + # This must be overriden. + # This allows to convert the raw sensor value to the target one, typically int + def pre_value(val) + return int(val) + end + + ############################################################# + # Called when the value changed compared to shadow value + # + # This must be overriden. + # This is where you call `self.attribute_updated(nil, , )` + def valued_changed(val) + self.attribute_updated(nil, 0x0403, 0x0000) + end + + ############################################################# + # read an attribute + # + def read_attribute(session, ctx) + import string + var TLV = matter.TLV + var cluster = ctx.cluster + var attribute = ctx.attribute + + # ==================================================================================================== + if cluster == 0x0403 # ========== Pressure Measurement 2.4 p.98 ========== + if attribute == 0x0000 # ---------- MeasuredValue / i16 ---------- + if self.shadow_value != nil + return TLV.create_TLV(TLV.I2, int(self.shadow_value)) + else + return TLV.create_TLV(TLV.NULL, nil) + end + elif attribute == 0x0001 # ---------- MinMeasuredValue / i16 ---------- + return TLV.create_TLV(TLV.I2, 500) # 500 hPA + elif attribute == 0x0002 # ---------- MaxMeasuredValue / i16 ---------- + return TLV.create_TLV(TLV.I2, 1500) # 1500 hPA + elif attribute == 0xFFFC # ---------- FeatureMap / map32 ---------- + return TLV.create_TLV(TLV.U4, 0) # 0 = no Extended Range + elif attribute == 0xFFFD # ---------- ClusterRevision / u2 ---------- + return TLV.create_TLV(TLV.U4, 3) # 3 = New data model format and notation + end + + else + return super(self).read_attribute(session, ctx) + end + end + +end +matter.Plugin_Sensor_Pressure = Matter_Plugin_Sensor_Pressure diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Temp_Sensor.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor_Temp.be similarity index 51% rename from lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Temp_Sensor.be rename to lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor_Temp.be index 3375bce6d..2ef420a94 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Temp_Sensor.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor_Temp.be @@ -1,5 +1,5 @@ # -# Matter_Plugin_Temp_Sensor.be - implements the behavior for a Temperature Sensor +# Matter_Plugin_Sensor_Temp.be - implements the behavior for a Temperature Sensor # # Copyright (C) 2023 Stephan Hadinger & Theo Arends # @@ -20,56 +20,32 @@ # Matter plug-in for core behavior # dummy declaration for solidification -class Matter_Plugin_Device end +class Matter_Plugin_Sensor end -#@ solidify:Matter_Plugin_Temp_Sensor,weak +#@ solidify:Matter_Plugin_Sensor_Temp,weak -class Matter_Plugin_Temp_Sensor : Matter_Plugin_Device +class Matter_Plugin_Sensor_Temp : Matter_Plugin_Sensor static var CLUSTERS = { - # 0x001D: inherited # Descriptor Cluster 9.5 p.453 - # 0x0003: inherited # Identify 1.2 p.16 - # 0x0004: inherited # Groups 1.3 p.21 0x0402: [0,1,2], # Temperature Measurement p.97 - no writable } static var TYPES = { 0x0302: 2 } # Temperature Sensor, rev 2 - var tasmota_sensor_filter # Rule-type filter to the value, like "ESP32#Temperature" - var tasmota_sensor_matcher # Actual matcher object - var shadow_temperature # fake status for now # TODO - ############################################################# - # Constructor - def init(device, endpoint, sensor_filter) - super(self).init(device, endpoint) - self.tasmota_sensor_filter = sensor_filter - self.tasmota_sensor_matcher = tasmota.Rule_Matcher.parse(sensor_filter) + # Pre-process value + # + # This must be overriden. + # This allows to convert the raw sensor value to the target one, typically int + def pre_value(val) + return int(val * 100) end ############################################################# - # parse sensor + # Called when the value changed compared to shadow value # - # The device calls regularly `tasmota.read_sensors()` and converts - # it to json. - def parse_sensors(payload) - if self.tasmota_sensor_matcher - var val = real(self.tasmota_sensor_matcher.match(payload)) - if val != nil - # import string - # tasmota.log(string.format("MTR: update temperature for endpoint %i - %.1f C", self.endpoint,), 3) - if val != self.shadow_temperature - self.attribute_updated(nil, 0x0402, 0x0000) - end - self.shadow_temperature = val - end - end - end - - ############################################################# - # get_temperature - # - # Update shadow and signal any change - def get_temperature() - return self.shadow_temperature + # This must be overriden. + # This is where you call `self.attribute_updated(nil, , )` + def valued_changed(val) + self.attribute_updated(nil, 0x0402, 0x0000) end ############################################################# @@ -84,8 +60,8 @@ class Matter_Plugin_Temp_Sensor : Matter_Plugin_Device # ==================================================================================================== if cluster == 0x0402 # ========== Temperature Measurement 2.3 p.97 ========== if attribute == 0x0000 # ---------- MeasuredValue / i16 (*100) ---------- - if self.shadow_temperature != nil - return TLV.create_TLV(TLV.I2, int(self.shadow_temperature * 100)) + if self.shadow_value != nil + return TLV.create_TLV(TLV.I2, self.shadow_value) else return TLV.create_TLV(TLV.NULL, nil) end @@ -93,6 +69,10 @@ class Matter_Plugin_Temp_Sensor : Matter_Plugin_Device return TLV.create_TLV(TLV.I2, -5000) # -50 °C elif attribute == 0x0002 # ---------- MaxMeasuredValue / i16 (*100) ---------- return TLV.create_TLV(TLV.I2, 15000) # 150 °C + elif attribute == 0xFFFC # ---------- FeatureMap / map32 ---------- + return TLV.create_TLV(TLV.U4, 0) + elif attribute == 0xFFFD # ---------- ClusterRevision / u2 ---------- + return TLV.create_TLV(TLV.U4, 4) # 4 = New data model format and notation end else @@ -100,10 +80,5 @@ class Matter_Plugin_Temp_Sensor : Matter_Plugin_Device end end - ############################################################# - # every_second - def every_second() - self.get_temperature() # force reading value and sending subscriptions - end end -matter.Plugin_Temp_Sensor = Matter_Plugin_Temp_Sensor +matter.Plugin_Sensor_Temp = Matter_Plugin_Sensor_Temp diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_TLV.be b/lib/libesp32/berry_matter/src/embedded/Matter_TLV.be index 084548102..24c4567e2 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_TLV.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_TLV.be @@ -637,7 +637,11 @@ class Matter_TLV # output each one after the other for v : val_list - v.tlv2raw(b) + if isinstance(v, bytes) + b .. v + else + v.tlv2raw(b) + end end # add 'end of container' @@ -728,9 +732,13 @@ class Matter_TLV # returns `self` to allow calls to be chained def add_obj(tag, obj) if obj != nil - var value = obj.to_TLV() - value.tag_sub = tag - self.val.push(value) + if isinstance(obj, bytes) + self.val.push(obj) + else + var value = obj.to_TLV() + value.tag_sub = tag + self.val.push(value) + end end return self end diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Commissioning.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Commissioning.h index 486fbdcdf..af2acb9fa 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Commissioning.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Commissioning.h @@ -66,7 +66,7 @@ be_local_closure(Matter_Commisioning_Context_find_fabric_by_destination_id, /* 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[25]) { /* constants */ + ( &(const bvalue[21]) { /* constants */ /* K0 */ be_nested_str_weak(crypto), /* K1 */ be_nested_str_weak(tasmota), /* K2 */ be_nested_str_weak(log), @@ -88,14 +88,10 @@ be_local_closure(Matter_Commisioning_Context_find_fabric_by_destination_id, /* /* K18 */ be_nested_str_weak(out), /* K19 */ be_nested_str_weak(MTR_X3A_X20SIGMA1_X3A_X20candidateDestinationId_X3D), /* K20 */ be_nested_str_weak(stop_iteration), - /* K21 */ be_const_int(1), - /* K22 */ be_nested_str_weak(MTR_X3A_X20_X2A_X2A_X2A_X20Could_X20not_X20find_X20fabric_X2C_X20trying_X20only_X20fabric_X20in_X20store), - /* K23 */ be_const_int(2), - /* K24 */ be_const_int(0), }), be_str_weak(find_fabric_by_destination_id), &be_const_str_solidified, - ( &(const binstruction[94]) { /* code */ + ( &(const binstruction[77]) { /* code */ 0xA40E0000, // 0000 IMPORT R3 K0 0xB8120200, // 0001 GETNGBL R4 K1 0x8C100902, // 0002 GETMET R4 R4 K2 @@ -171,25 +167,8 @@ be_local_closure(Matter_Commisioning_Context_find_fabric_by_destination_id, /* 0x58100014, // 0048 LDCONST R4 K20 0xAC100200, // 0049 CATCH R4 1 0 0xB0080000, // 004A RAISE 2 R0 R0 - 0x6010000C, // 004B GETGBL R4 G12 - 0x88140106, // 004C GETMBR R5 R0 K6 - 0x88140B07, // 004D GETMBR R5 R5 K7 - 0x88140B08, // 004E GETMBR R5 R5 K8 - 0x7C100200, // 004F CALL R4 1 - 0x1C100915, // 0050 EQ R4 R4 K21 - 0x78120009, // 0051 JMPF R4 #005C - 0xB8120200, // 0052 GETNGBL R4 K1 - 0x8C100902, // 0053 GETMET R4 R4 K2 - 0x58180016, // 0054 LDCONST R6 K22 - 0x581C0017, // 0055 LDCONST R7 K23 - 0x7C100600, // 0056 CALL R4 3 - 0x88100106, // 0057 GETMBR R4 R0 K6 - 0x88100907, // 0058 GETMBR R4 R4 K7 - 0x88100908, // 0059 GETMBR R4 R4 K8 - 0x94100918, // 005A GETIDX R4 R4 K24 - 0x80040800, // 005B RET 1 R4 - 0x4C100000, // 005C LDNIL R4 - 0x80040800, // 005D RET 1 R4 + 0x4C100000, // 004B LDNIL R4 + 0x80040800, // 004C RET 1 R4 }) ) ); diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Device.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Device.h index c7b55883b..ba71e5d7c 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Device.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Device.h @@ -898,7 +898,7 @@ be_local_closure(Matter_Device_sort_distinct, /* name */ ********************************************************************/ be_local_closure(Matter_Device_stop_basic_commissioning, /* name */ be_nested_proto( - 3, /* nstack */ + 5, /* nstack */ 1, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -906,36 +906,49 @@ be_local_closure(Matter_Device_stop_basic_commissioning, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[ 8]) { /* constants */ - /* K0 */ be_nested_str_weak(commissioning_open), - /* K1 */ be_nested_str_weak(mdns_remove_PASE), - /* K2 */ be_nested_str_weak(commissioning_iterations), - /* K3 */ be_nested_str_weak(commissioning_discriminator), - /* K4 */ be_nested_str_weak(commissioning_salt), - /* K5 */ be_nested_str_weak(commissioning_w0), - /* K6 */ be_nested_str_weak(commissioning_L), - /* K7 */ be_nested_str_weak(commissioning_admin_fabric), + ( &(const bvalue[13]) { /* constants */ + /* K0 */ be_nested_str_weak(is_root_commissioning_open), + /* K1 */ be_nested_str_weak(tasmota), + /* K2 */ be_nested_str_weak(publish_result), + /* K3 */ be_nested_str_weak(_X7B_X22Matter_X22_X3A_X7B_X22Commissioning_X22_X3A0_X7D_X7D), + /* K4 */ be_nested_str_weak(Matter), + /* K5 */ be_nested_str_weak(commissioning_open), + /* K6 */ be_nested_str_weak(mdns_remove_PASE), + /* K7 */ be_nested_str_weak(commissioning_iterations), + /* K8 */ be_nested_str_weak(commissioning_discriminator), + /* K9 */ be_nested_str_weak(commissioning_salt), + /* K10 */ be_nested_str_weak(commissioning_w0), + /* K11 */ be_nested_str_weak(commissioning_L), + /* K12 */ be_nested_str_weak(commissioning_admin_fabric), }), be_str_weak(stop_basic_commissioning), &be_const_str_solidified, - ( &(const binstruction[17]) { /* code */ - 0x4C040000, // 0000 LDNIL R1 - 0x90020001, // 0001 SETMBR R0 K0 R1 - 0x8C040101, // 0002 GETMET R1 R0 K1 - 0x7C040200, // 0003 CALL R1 1 - 0x4C040000, // 0004 LDNIL R1 - 0x90020401, // 0005 SETMBR R0 K2 R1 - 0x4C040000, // 0006 LDNIL R1 - 0x90020601, // 0007 SETMBR R0 K3 R1 + ( &(const binstruction[25]) { /* code */ + 0x8C040100, // 0000 GETMET R1 R0 K0 + 0x7C040200, // 0001 CALL R1 1 + 0x78060004, // 0002 JMPF R1 #0008 + 0xB8060200, // 0003 GETNGBL R1 K1 + 0x8C040302, // 0004 GETMET R1 R1 K2 + 0x580C0003, // 0005 LDCONST R3 K3 + 0x58100004, // 0006 LDCONST R4 K4 + 0x7C040600, // 0007 CALL R1 3 0x4C040000, // 0008 LDNIL R1 - 0x90020801, // 0009 SETMBR R0 K4 R1 - 0x4C040000, // 000A LDNIL R1 - 0x90020A01, // 000B SETMBR R0 K5 R1 + 0x90020A01, // 0009 SETMBR R0 K5 R1 + 0x8C040106, // 000A GETMET R1 R0 K6 + 0x7C040200, // 000B CALL R1 1 0x4C040000, // 000C LDNIL R1 - 0x90020C01, // 000D SETMBR R0 K6 R1 + 0x90020E01, // 000D SETMBR R0 K7 R1 0x4C040000, // 000E LDNIL R1 - 0x90020E01, // 000F SETMBR R0 K7 R1 - 0x80000000, // 0010 RET 0 + 0x90021001, // 000F SETMBR R0 K8 R1 + 0x4C040000, // 0010 LDNIL R1 + 0x90021201, // 0011 SETMBR R0 K9 R1 + 0x4C040000, // 0012 LDNIL R1 + 0x90021401, // 0013 SETMBR R0 K10 R1 + 0x4C040000, // 0014 LDNIL R1 + 0x90021601, // 0015 SETMBR R0 K11 R1 + 0x4C040000, // 0016 LDNIL R1 + 0x90021801, // 0017 SETMBR R0 K12 R1 + 0x80000000, // 0018 RET 0 }) ) ); @@ -1067,7 +1080,7 @@ be_local_closure(Matter_Device_every_250ms, /* name */ ********************************************************************/ be_local_closure(Matter_Device_start_root_basic_commissioning, /* name */ be_nested_proto( - 13, /* nstack */ + 14, /* nstack */ 2, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -1075,7 +1088,7 @@ be_local_closure(Matter_Device_start_root_basic_commissioning, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[19]) { /* constants */ + ( &(const bvalue[23]) { /* constants */ /* K0 */ be_nested_str_weak(string), /* K1 */ be_nested_str_weak(PASE_TIMEOUT), /* K2 */ be_nested_str_weak(compute_manual_pairing_code), @@ -1087,18 +1100,22 @@ be_local_closure(Matter_Device_start_root_basic_commissioning, /* name */ /* K8 */ be_const_int(3), /* K9 */ be_const_int(2147483647), /* K10 */ be_const_int(2), - /* K11 */ be_nested_str_weak(_compute_pbkdf), - /* K12 */ be_nested_str_weak(root_passcode), - /* K13 */ be_nested_str_weak(root_iterations), - /* K14 */ be_nested_str_weak(root_salt), - /* K15 */ be_nested_str_weak(start_basic_commissioning), - /* K16 */ be_nested_str_weak(root_discriminator), - /* K17 */ be_nested_str_weak(root_w0), - /* K18 */ be_nested_str_weak(root_L), + /* K11 */ be_nested_str_weak(compute_qrcode_content), + /* K12 */ be_nested_str_weak(publish_result), + /* K13 */ be_nested_str_weak(_X7B_X22Matter_X22_X3A_X7B_X22Commissioning_X22_X3A1_X2C_X22PairingCode_X22_X3A_X22_X25s_X22_X2C_X22QRCode_X22_X3A_X22_X25s_X22_X7D_X7D), + /* K14 */ be_nested_str_weak(Matter), + /* K15 */ be_nested_str_weak(_compute_pbkdf), + /* K16 */ be_nested_str_weak(root_passcode), + /* K17 */ be_nested_str_weak(root_iterations), + /* K18 */ be_nested_str_weak(root_salt), + /* K19 */ be_nested_str_weak(start_basic_commissioning), + /* K20 */ be_nested_str_weak(root_discriminator), + /* K21 */ be_nested_str_weak(root_w0), + /* K22 */ be_nested_str_weak(root_L), }), be_str_weak(start_root_basic_commissioning), &be_const_str_solidified, - ( &(const binstruction[38]) { /* code */ + ( &(const binstruction[49]) { /* code */ 0xA40A0000, // 0000 IMPORT R2 K0 0x4C0C0000, // 0001 LDNIL R3 0x1C0C0203, // 0002 EQ R3 R1 R3 @@ -1123,20 +1140,31 @@ be_local_closure(Matter_Device_start_root_basic_commissioning, /* name */ 0x581C000A, // 0015 LDCONST R7 K10 0x7C100600, // 0016 CALL R4 3 0x8C10010B, // 0017 GETMET R4 R0 K11 - 0x8818010C, // 0018 GETMBR R6 R0 K12 - 0x881C010D, // 0019 GETMBR R7 R0 K13 - 0x8820010E, // 001A GETMBR R8 R0 K14 - 0x7C100800, // 001B CALL R4 4 - 0x8C10010F, // 001C GETMET R4 R0 K15 - 0x5C180200, // 001D MOVE R6 R1 - 0x881C010D, // 001E GETMBR R7 R0 K13 - 0x88200110, // 001F GETMBR R8 R0 K16 - 0x8824010E, // 0020 GETMBR R9 R0 K14 - 0x88280111, // 0021 GETMBR R10 R0 K17 - 0x882C0112, // 0022 GETMBR R11 R0 K18 - 0x4C300000, // 0023 LDNIL R12 - 0x7C101000, // 0024 CALL R4 8 - 0x80000000, // 0025 RET 0 + 0x7C100200, // 0018 CALL R4 1 + 0xB8160600, // 0019 GETNGBL R5 K3 + 0x8C140B0C, // 001A GETMET R5 R5 K12 + 0x8C1C0505, // 001B GETMET R7 R2 K5 + 0x5824000D, // 001C LDCONST R9 K13 + 0x5C280600, // 001D MOVE R10 R3 + 0x5C2C0800, // 001E MOVE R11 R4 + 0x7C1C0800, // 001F CALL R7 4 + 0x5820000E, // 0020 LDCONST R8 K14 + 0x7C140600, // 0021 CALL R5 3 + 0x8C14010F, // 0022 GETMET R5 R0 K15 + 0x881C0110, // 0023 GETMBR R7 R0 K16 + 0x88200111, // 0024 GETMBR R8 R0 K17 + 0x88240112, // 0025 GETMBR R9 R0 K18 + 0x7C140800, // 0026 CALL R5 4 + 0x8C140113, // 0027 GETMET R5 R0 K19 + 0x5C1C0200, // 0028 MOVE R7 R1 + 0x88200111, // 0029 GETMBR R8 R0 K17 + 0x88240114, // 002A GETMBR R9 R0 K20 + 0x88280112, // 002B GETMBR R10 R0 K18 + 0x882C0115, // 002C GETMBR R11 R0 K21 + 0x88300116, // 002D GETMBR R12 R0 K22 + 0x4C340000, // 002E LDNIL R13 + 0x7C141000, // 002F CALL R5 8 + 0x80000000, // 0030 RET 0 }) ) ); @@ -3294,7 +3322,7 @@ be_local_closure(Matter_Device_autoconf_device, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[34]) { /* constants */ + ( &(const bvalue[46]) { /* constants */ /* K0 */ be_nested_str_weak(string), /* K1 */ be_nested_str_weak(json), /* K2 */ be_const_int(1), @@ -3326,13 +3354,25 @@ be_local_closure(Matter_Device_autoconf_device, /* name */ /* K28 */ be_nested_str_weak(contains), /* K29 */ be_nested_str_weak(Temperature), /* K30 */ be_nested_str_weak(_X23Temperature), - /* K31 */ be_nested_str_weak(Plugin_Temp_Sensor), + /* K31 */ be_nested_str_weak(Plugin_Sensor_Temp), /* K32 */ be_nested_str_weak(MTR_X3A_X20Endpoint_X3A_X25i_X20Temperature_X20_X28_X25s_X29), /* K33 */ be_nested_str_weak(stop_iteration), + /* K34 */ be_nested_str_weak(Pressure), + /* K35 */ be_nested_str_weak(_X23Pressure), + /* K36 */ be_nested_str_weak(Plugin_Sensor_Pressure), + /* K37 */ be_nested_str_weak(MTR_X3A_X20Endpoint_X3A_X25i_X20Pressure_X20_X28_X25s_X29), + /* K38 */ be_nested_str_weak(Illuminance), + /* K39 */ be_nested_str_weak(_X23Illuminance), + /* K40 */ be_nested_str_weak(Plugin_Sensor_Light), + /* K41 */ be_nested_str_weak(MTR_X3A_X20Endpoint_X3A_X25i_X20Light_X20_X28_X25s_X29), + /* K42 */ be_nested_str_weak(Humidity), + /* K43 */ be_nested_str_weak(_X23Humidity), + /* K44 */ be_nested_str_weak(Plugin_Sensor_Humidity), + /* K45 */ be_nested_str_weak(MTR_X3A_X20Endpoint_X3A_X25i_X20Humidity_X20_X28_X25s_X29), }), be_str_weak(autoconf_device), &be_const_str_solidified, - ( &(const binstruction[160]) { /* code */ + ( &(const binstruction[307]) { /* code */ 0xA4060000, // 0000 IMPORT R1 K0 0xA40A0200, // 0001 IMPORT R2 K1 0x580C0002, // 0002 LDCONST R3 K2 @@ -3492,7 +3532,154 @@ be_local_closure(Matter_Device_autoconf_device, /* name */ 0x58280021, // 009C LDCONST R10 K33 0xAC280200, // 009D CATCH R10 1 0 0xB0080000, // 009E RAISE 2 R0 R0 - 0x80000000, // 009F RET 0 + 0x540E0027, // 009F LDINT R3 40 + 0x60280010, // 00A0 GETGBL R10 G16 + 0x8C2C011B, // 00A1 GETMET R11 R0 K27 + 0x5C341200, // 00A2 MOVE R13 R9 + 0x7C2C0400, // 00A3 CALL R11 2 + 0x7C280200, // 00A4 CALL R10 1 + 0xA8020026, // 00A5 EXBLK 0 #00CD + 0x5C2C1400, // 00A6 MOVE R11 R10 + 0x7C2C0000, // 00A7 CALL R11 0 + 0x9430120B, // 00A8 GETIDX R12 R9 R11 + 0x6034000F, // 00A9 GETGBL R13 G15 + 0x5C381800, // 00AA MOVE R14 R12 + 0x603C0013, // 00AB GETGBL R15 G19 + 0x7C340400, // 00AC CALL R13 2 + 0x78360017, // 00AD JMPF R13 #00C6 + 0x8C34191C, // 00AE GETMET R13 R12 K28 + 0x583C0022, // 00AF LDCONST R15 K34 + 0x7C340400, // 00B0 CALL R13 2 + 0x78360013, // 00B1 JMPF R13 #00C6 + 0x00341723, // 00B2 ADD R13 R11 K35 + 0x88380109, // 00B3 GETMBR R14 R0 K9 + 0x8C381D0A, // 00B4 GETMET R14 R14 K10 + 0xB8421600, // 00B5 GETNGBL R16 K11 + 0x8C402124, // 00B6 GETMET R16 R16 K36 + 0x5C480000, // 00B7 MOVE R18 R0 + 0x5C4C0600, // 00B8 MOVE R19 R3 + 0x5C501A00, // 00B9 MOVE R20 R13 + 0x7C400800, // 00BA CALL R16 4 + 0x7C380400, // 00BB CALL R14 2 + 0xB83A1A00, // 00BC GETNGBL R14 K13 + 0x8C381D0E, // 00BD GETMET R14 R14 K14 + 0x8C40030F, // 00BE GETMET R16 R1 K15 + 0x58480025, // 00BF LDCONST R18 K37 + 0x5C4C0600, // 00C0 MOVE R19 R3 + 0x5C501A00, // 00C1 MOVE R20 R13 + 0x7C400800, // 00C2 CALL R16 4 + 0x58440011, // 00C3 LDCONST R17 K17 + 0x7C380600, // 00C4 CALL R14 3 + 0x000C0702, // 00C5 ADD R3 R3 K2 + 0x5436002E, // 00C6 LDINT R13 47 + 0x2434060D, // 00C7 GT R13 R3 R13 + 0x78360000, // 00C8 JMPF R13 #00CA + 0x70020000, // 00C9 JMP #00CB + 0x7001FFDA, // 00CA JMP #00A6 + 0xA8040001, // 00CB EXBLK 1 1 + 0x70020002, // 00CC JMP #00D0 + 0x58280021, // 00CD LDCONST R10 K33 + 0xAC280200, // 00CE CATCH R10 1 0 + 0xB0080000, // 00CF RAISE 2 R0 R0 + 0x540E002F, // 00D0 LDINT R3 48 + 0x60280010, // 00D1 GETGBL R10 G16 + 0x8C2C011B, // 00D2 GETMET R11 R0 K27 + 0x5C341200, // 00D3 MOVE R13 R9 + 0x7C2C0400, // 00D4 CALL R11 2 + 0x7C280200, // 00D5 CALL R10 1 + 0xA8020026, // 00D6 EXBLK 0 #00FE + 0x5C2C1400, // 00D7 MOVE R11 R10 + 0x7C2C0000, // 00D8 CALL R11 0 + 0x9430120B, // 00D9 GETIDX R12 R9 R11 + 0x6034000F, // 00DA GETGBL R13 G15 + 0x5C381800, // 00DB MOVE R14 R12 + 0x603C0013, // 00DC GETGBL R15 G19 + 0x7C340400, // 00DD CALL R13 2 + 0x78360017, // 00DE JMPF R13 #00F7 + 0x8C34191C, // 00DF GETMET R13 R12 K28 + 0x583C0026, // 00E0 LDCONST R15 K38 + 0x7C340400, // 00E1 CALL R13 2 + 0x78360013, // 00E2 JMPF R13 #00F7 + 0x00341727, // 00E3 ADD R13 R11 K39 + 0x88380109, // 00E4 GETMBR R14 R0 K9 + 0x8C381D0A, // 00E5 GETMET R14 R14 K10 + 0xB8421600, // 00E6 GETNGBL R16 K11 + 0x8C402128, // 00E7 GETMET R16 R16 K40 + 0x5C480000, // 00E8 MOVE R18 R0 + 0x5C4C0600, // 00E9 MOVE R19 R3 + 0x5C501A00, // 00EA MOVE R20 R13 + 0x7C400800, // 00EB CALL R16 4 + 0x7C380400, // 00EC CALL R14 2 + 0xB83A1A00, // 00ED GETNGBL R14 K13 + 0x8C381D0E, // 00EE GETMET R14 R14 K14 + 0x8C40030F, // 00EF GETMET R16 R1 K15 + 0x58480029, // 00F0 LDCONST R18 K41 + 0x5C4C0600, // 00F1 MOVE R19 R3 + 0x5C501A00, // 00F2 MOVE R20 R13 + 0x7C400800, // 00F3 CALL R16 4 + 0x58440011, // 00F4 LDCONST R17 K17 + 0x7C380600, // 00F5 CALL R14 3 + 0x000C0702, // 00F6 ADD R3 R3 K2 + 0x54360037, // 00F7 LDINT R13 56 + 0x2434060D, // 00F8 GT R13 R3 R13 + 0x78360000, // 00F9 JMPF R13 #00FB + 0x70020000, // 00FA JMP #00FC + 0x7001FFDA, // 00FB JMP #00D7 + 0xA8040001, // 00FC EXBLK 1 1 + 0x70020002, // 00FD JMP #0101 + 0x58280021, // 00FE LDCONST R10 K33 + 0xAC280200, // 00FF CATCH R10 1 0 + 0xB0080000, // 0100 RAISE 2 R0 R0 + 0x540E0037, // 0101 LDINT R3 56 + 0x60280010, // 0102 GETGBL R10 G16 + 0x8C2C011B, // 0103 GETMET R11 R0 K27 + 0x5C341200, // 0104 MOVE R13 R9 + 0x7C2C0400, // 0105 CALL R11 2 + 0x7C280200, // 0106 CALL R10 1 + 0xA8020026, // 0107 EXBLK 0 #012F + 0x5C2C1400, // 0108 MOVE R11 R10 + 0x7C2C0000, // 0109 CALL R11 0 + 0x9430120B, // 010A GETIDX R12 R9 R11 + 0x6034000F, // 010B GETGBL R13 G15 + 0x5C381800, // 010C MOVE R14 R12 + 0x603C0013, // 010D GETGBL R15 G19 + 0x7C340400, // 010E CALL R13 2 + 0x78360017, // 010F JMPF R13 #0128 + 0x8C34191C, // 0110 GETMET R13 R12 K28 + 0x583C002A, // 0111 LDCONST R15 K42 + 0x7C340400, // 0112 CALL R13 2 + 0x78360013, // 0113 JMPF R13 #0128 + 0x0034172B, // 0114 ADD R13 R11 K43 + 0x88380109, // 0115 GETMBR R14 R0 K9 + 0x8C381D0A, // 0116 GETMET R14 R14 K10 + 0xB8421600, // 0117 GETNGBL R16 K11 + 0x8C40212C, // 0118 GETMET R16 R16 K44 + 0x5C480000, // 0119 MOVE R18 R0 + 0x5C4C0600, // 011A MOVE R19 R3 + 0x5C501A00, // 011B MOVE R20 R13 + 0x7C400800, // 011C CALL R16 4 + 0x7C380400, // 011D CALL R14 2 + 0xB83A1A00, // 011E GETNGBL R14 K13 + 0x8C381D0E, // 011F GETMET R14 R14 K14 + 0x8C40030F, // 0120 GETMET R16 R1 K15 + 0x5848002D, // 0121 LDCONST R18 K45 + 0x5C4C0600, // 0122 MOVE R19 R3 + 0x5C501A00, // 0123 MOVE R20 R13 + 0x7C400800, // 0124 CALL R16 4 + 0x58440011, // 0125 LDCONST R17 K17 + 0x7C380600, // 0126 CALL R14 3 + 0x000C0702, // 0127 ADD R3 R3 K2 + 0x5436003F, // 0128 LDINT R13 64 + 0x2434060D, // 0129 GT R13 R3 R13 + 0x78360000, // 012A JMPF R13 #012C + 0x70020000, // 012B JMP #012D + 0x7001FFDA, // 012C JMP #0108 + 0xA8040001, // 012D EXBLK 1 1 + 0x70020002, // 012E JMP #0132 + 0x58280021, // 012F LDCONST R10 K33 + 0xAC280200, // 0130 CATCH R10 1 0 + 0xB0080000, // 0131 RAISE 2 R0 R0 + 0x80000000, // 0132 RET 0 }) ) ); diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_IM.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_IM.h index 0246ef549..df537be23 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_IM.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_IM.h @@ -1371,7 +1371,7 @@ be_local_closure(Matter_IM__inner_process_read_request, /* name */ 1, /* has sup protos */ ( &(const struct bproto*[ 2]) { be_nested_proto( - 23, /* nstack */ + 25, /* nstack */ 4, /* argc */ 0, /* varg */ 1, /* has upvals */ @@ -1382,7 +1382,7 @@ be_local_closure(Matter_IM__inner_process_read_request, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[39]) { /* constants */ + ( &(const bvalue[40]) { /* constants */ /* K0 */ be_nested_str_weak(string), /* K1 */ be_nested_str_weak(matter), /* K2 */ be_nested_str_weak(TLV), @@ -1404,28 +1404,29 @@ be_local_closure(Matter_IM__inner_process_read_request, /* name */ /* K18 */ be_nested_str_weak(data), /* K19 */ be_nested_str_weak(to_TLV), /* K20 */ be_nested_str_weak(encode_len), - /* K21 */ be_nested_str_weak(create_TLV), - /* K22 */ be_nested_str_weak(RAW), - /* K23 */ be_nested_str_weak(tlv2raw), - /* K24 */ be_nested_str_weak(attribute_reports), - /* K25 */ be_nested_str_weak(push), - /* K26 */ be_nested_str_weak(tasmota), - /* K27 */ be_nested_str_weak(log), - /* K28 */ be_nested_str_weak(format), - /* K29 */ be_nested_str_weak(MTR_X3A_X20_X3ERead_Attr_X20_X28_X256i_X29_X20_X25s_X25s_X20_X2D_X20_X25s), - /* K30 */ be_nested_str_weak(local_session_id), - /* K31 */ be_const_int(2), - /* K32 */ be_nested_str_weak(status), - /* K33 */ be_nested_str_weak(attribute_status), - /* K34 */ be_nested_str_weak(AttributeStatusIB), - /* K35 */ be_nested_str_weak(StatusIB), - /* K36 */ be_nested_str_weak(MTR_X3A_X20_X3ERead_Attr_X20_X28_X256i_X29_X20_X25s_X25s_X20_X2D_X20STATUS_X3A_X200x_X2502X_X20_X25s), - /* K37 */ be_nested_str_weak(UNSUPPORTED_ATTRIBUTE), - /* K38 */ be_nested_str_weak(MTR_X3A_X20_X3ERead_Attr_X20_X28_X256i_X29_X20_X25s_X25s_X20_X2D_X20IGNORED), + /* K21 */ be_nested_str_weak(tlv2raw), + /* K22 */ be_nested_str_weak(tasmota), + /* K23 */ be_nested_str_weak(log), + /* K24 */ be_nested_str_weak(format), + /* K25 */ be_nested_str_weak(MTR_X3A_X20_X3ERead_Attr_X20_X28_X256i_X29_X20_X25s_X25s_X20_X2D_X20_X25s), + /* K26 */ be_nested_str_weak(local_session_id), + /* K27 */ be_const_int(2), + /* K28 */ be_nested_str_weak(status), + /* K29 */ be_nested_str_weak(attribute_status), + /* K30 */ be_nested_str_weak(AttributeStatusIB), + /* K31 */ be_nested_str_weak(StatusIB), + /* K32 */ be_nested_str_weak(MTR_X3A_X20_X3ERead_Attr_X20_X28_X256i_X29_X20_X25s_X25s_X20_X2D_X20STATUS_X3A_X200x_X2502X_X20_X25s), + /* K33 */ be_nested_str_weak(UNSUPPORTED_ATTRIBUTE), + /* K34 */ be_nested_str_weak(MTR_X3A_X20_X3ERead_Attr_X20_X28_X256i_X29_X20_X25s_X25s_X20_X2D_X20IGNORED), + /* K35 */ be_nested_str_weak(attribute_reports), + /* K36 */ be_const_int(0), + /* K37 */ be_nested_str_weak(push), + /* K38 */ be_nested_str_weak(IM_ReportData), + /* K39 */ be_nested_str_weak(MAX_MESSAGE), }), be_str_weak(read_single_attribute), &be_const_str_solidified, - ( &(const binstruction[175]) { /* code */ + ( &(const binstruction[206]) { /* code */ 0xA4120000, // 0000 IMPORT R4 K0 0xB8160200, // 0001 GETNGBL R5 K1 0x88140B02, // 0002 GETMBR R5 R5 K2 @@ -1449,158 +1450,189 @@ be_local_closure(Matter_IM__inner_process_read_request, /* name */ 0x7C1C0600, // 0014 CALL R7 3 0x70020000, // 0015 JMP #0017 0x4C1C0000, // 0016 LDNIL R7 - 0x4C200000, // 0017 LDNIL R8 - 0x20200E08, // 0018 NE R8 R7 R8 - 0x78220041, // 0019 JMPF R8 #005C - 0xB8220200, // 001A GETNGBL R8 K1 - 0x8C20110A, // 001B GETMET R8 R8 K10 - 0x7C200200, // 001C CALL R8 1 - 0xB8260200, // 001D GETNGBL R9 K1 - 0x8C24130C, // 001E GETMET R9 R9 K12 - 0x7C240200, // 001F CALL R9 1 - 0x90221609, // 0020 SETMBR R8 K11 R9 - 0x8824110B, // 0021 GETMBR R9 R8 K11 - 0x90261B0E, // 0022 SETMBR R9 K13 K14 - 0x8824110B, // 0023 GETMBR R9 R8 K11 - 0xB82A0200, // 0024 GETNGBL R10 K1 - 0x8C281510, // 0025 GETMET R10 R10 K16 - 0x7C280200, // 0026 CALL R10 1 - 0x90261E0A, // 0027 SETMBR R9 K15 R10 - 0x8824110B, // 0028 GETMBR R9 R8 K11 - 0x8824130F, // 0029 GETMBR R9 R9 K15 - 0x88280511, // 002A GETMBR R10 R2 K17 - 0x9026220A, // 002B SETMBR R9 K17 R10 - 0x8824110B, // 002C GETMBR R9 R8 K11 - 0x8824130F, // 002D GETMBR R9 R9 K15 - 0x88280504, // 002E GETMBR R10 R2 K4 - 0x9026080A, // 002F SETMBR R9 K4 R10 - 0x8824110B, // 0030 GETMBR R9 R8 K11 - 0x8824130F, // 0031 GETMBR R9 R9 K15 - 0x88280505, // 0032 GETMBR R10 R2 K5 - 0x90260A0A, // 0033 SETMBR R9 K5 R10 - 0x8824110B, // 0034 GETMBR R9 R8 K11 - 0x90262407, // 0035 SETMBR R9 K18 R7 - 0x8C241113, // 0036 GETMET R9 R8 K19 - 0x7C240200, // 0037 CALL R9 1 - 0x8C281314, // 0038 GETMET R10 R9 K20 - 0x7C280200, // 0039 CALL R10 1 - 0x602C0015, // 003A GETGBL R11 G21 - 0x5C301400, // 003B MOVE R12 R10 - 0x7C2C0200, // 003C CALL R11 1 - 0x8C300B15, // 003D GETMET R12 R5 K21 - 0x88380B16, // 003E GETMBR R14 R5 K22 - 0x8C3C1317, // 003F GETMET R15 R9 K23 - 0x5C441600, // 0040 MOVE R17 R11 - 0x7C3C0400, // 0041 CALL R15 2 - 0x7C300600, // 0042 CALL R12 3 - 0x88340118, // 0043 GETMBR R13 R0 K24 - 0x8C341B19, // 0044 GETMET R13 R13 K25 - 0x5C3C1800, // 0045 MOVE R15 R12 - 0x7C340400, // 0046 CALL R13 2 - 0x68340001, // 0047 GETUPV R13 U1 - 0x7436000F, // 0048 JMPT R13 #0059 - 0xB8363400, // 0049 GETNGBL R13 K26 - 0x8C341B1B, // 004A GETMET R13 R13 K27 - 0x8C3C091C, // 004B GETMET R15 R4 K28 - 0x5844001D, // 004C LDCONST R17 K29 - 0x68480000, // 004D GETUPV R18 U0 - 0x8848251E, // 004E GETMBR R18 R18 K30 - 0x604C0008, // 004F GETGBL R19 G8 - 0x5C500400, // 0050 MOVE R20 R2 - 0x7C4C0200, // 0051 CALL R19 1 - 0x5C500C00, // 0052 MOVE R20 R6 - 0x60540008, // 0053 GETGBL R21 G8 - 0x5C580E00, // 0054 MOVE R22 R7 - 0x7C540200, // 0055 CALL R21 1 - 0x7C3C0C00, // 0056 CALL R15 6 - 0x5840001F, // 0057 LDCONST R16 K31 - 0x7C340600, // 0058 CALL R13 3 - 0x50340200, // 0059 LDBOOL R13 1 0 - 0x80041A00, // 005A RET 1 R13 - 0x70020051, // 005B JMP #00AE - 0x88200520, // 005C GETMBR R8 R2 K32 - 0x4C240000, // 005D LDNIL R9 - 0x20201009, // 005E NE R8 R8 R9 - 0x7822003E, // 005F JMPF R8 #009F - 0x780E003C, // 0060 JMPF R3 #009E - 0xB8220200, // 0061 GETNGBL R8 K1 - 0x8C20110A, // 0062 GETMET R8 R8 K10 - 0x7C200200, // 0063 CALL R8 1 - 0xB8260200, // 0064 GETNGBL R9 K1 - 0x8C241322, // 0065 GETMET R9 R9 K34 - 0x7C240200, // 0066 CALL R9 1 - 0x90224209, // 0067 SETMBR R8 K33 R9 - 0x88241121, // 0068 GETMBR R9 R8 K33 - 0xB82A0200, // 0069 GETNGBL R10 K1 - 0x8C281510, // 006A GETMET R10 R10 K16 - 0x7C280200, // 006B CALL R10 1 - 0x90261E0A, // 006C SETMBR R9 K15 R10 - 0x88241121, // 006D GETMBR R9 R8 K33 - 0xB82A0200, // 006E GETNGBL R10 K1 - 0x8C281523, // 006F GETMET R10 R10 K35 - 0x7C280200, // 0070 CALL R10 1 - 0x9026400A, // 0071 SETMBR R9 K32 R10 - 0x88241121, // 0072 GETMBR R9 R8 K33 - 0x8824130F, // 0073 GETMBR R9 R9 K15 - 0x88280511, // 0074 GETMBR R10 R2 K17 - 0x9026220A, // 0075 SETMBR R9 K17 R10 - 0x88241121, // 0076 GETMBR R9 R8 K33 - 0x8824130F, // 0077 GETMBR R9 R9 K15 - 0x88280504, // 0078 GETMBR R10 R2 K4 - 0x9026080A, // 0079 SETMBR R9 K4 R10 - 0x88241121, // 007A GETMBR R9 R8 K33 - 0x8824130F, // 007B GETMBR R9 R9 K15 - 0x88280505, // 007C GETMBR R10 R2 K5 - 0x90260A0A, // 007D SETMBR R9 K5 R10 - 0x88241121, // 007E GETMBR R9 R8 K33 - 0x88241320, // 007F GETMBR R9 R9 K32 - 0x88280520, // 0080 GETMBR R10 R2 K32 - 0x9026400A, // 0081 SETMBR R9 K32 R10 - 0x88240118, // 0082 GETMBR R9 R0 K24 - 0x8C241319, // 0083 GETMET R9 R9 K25 - 0x5C2C1000, // 0084 MOVE R11 R8 - 0x7C240400, // 0085 CALL R9 2 - 0xB8263400, // 0086 GETNGBL R9 K26 - 0x8C24131B, // 0087 GETMET R9 R9 K27 - 0x8C2C091C, // 0088 GETMET R11 R4 K28 - 0x58340024, // 0089 LDCONST R13 K36 - 0x68380000, // 008A GETUPV R14 U0 - 0x88381D1E, // 008B GETMBR R14 R14 K30 - 0x603C0008, // 008C GETGBL R15 G8 - 0x5C400400, // 008D MOVE R16 R2 - 0x7C3C0200, // 008E CALL R15 1 - 0x5C400C00, // 008F MOVE R16 R6 - 0x88440520, // 0090 GETMBR R17 R2 K32 - 0x88480520, // 0091 GETMBR R18 R2 K32 - 0xB84E0200, // 0092 GETNGBL R19 K1 - 0x884C2725, // 0093 GETMBR R19 R19 K37 - 0x1C482413, // 0094 EQ R18 R18 R19 - 0x784A0001, // 0095 JMPF R18 #0098 - 0x58480025, // 0096 LDCONST R18 K37 - 0x70020000, // 0097 JMP #0099 - 0x58480008, // 0098 LDCONST R18 K8 - 0x7C2C0E00, // 0099 CALL R11 7 - 0x5830001F, // 009A LDCONST R12 K31 - 0x7C240600, // 009B CALL R9 3 - 0x50240200, // 009C LDBOOL R9 1 0 - 0x80041200, // 009D RET 1 R9 - 0x7002000E, // 009E JMP #00AE - 0xB8223400, // 009F GETNGBL R8 K26 - 0x8C20111B, // 00A0 GETMET R8 R8 K27 - 0x8C28091C, // 00A1 GETMET R10 R4 K28 - 0x58300026, // 00A2 LDCONST R12 K38 - 0x68340000, // 00A3 GETUPV R13 U0 - 0x88341B1E, // 00A4 GETMBR R13 R13 K30 - 0x60380008, // 00A5 GETGBL R14 G8 - 0x5C3C0400, // 00A6 MOVE R15 R2 - 0x7C380200, // 00A7 CALL R14 1 - 0x5C3C0C00, // 00A8 MOVE R15 R6 - 0x7C280A00, // 00A9 CALL R10 5 - 0x582C001F, // 00AA LDCONST R11 K31 - 0x7C200600, // 00AB CALL R8 3 + 0x50200200, // 0017 LDBOOL R8 1 0 + 0x4C240000, // 0018 LDNIL R9 + 0x4C280000, // 0019 LDNIL R10 + 0x20280E0A, // 001A NE R10 R7 R10 + 0x782A003A, // 001B JMPF R10 #0057 + 0x60280008, // 001C GETGBL R10 G8 + 0x5C2C0E00, // 001D MOVE R11 R7 + 0x7C280200, // 001E CALL R10 1 + 0xB82E0200, // 001F GETNGBL R11 K1 + 0x8C2C170A, // 0020 GETMET R11 R11 K10 + 0x7C2C0200, // 0021 CALL R11 1 + 0xB8320200, // 0022 GETNGBL R12 K1 + 0x8C30190C, // 0023 GETMET R12 R12 K12 + 0x7C300200, // 0024 CALL R12 1 + 0x902E160C, // 0025 SETMBR R11 K11 R12 + 0x8830170B, // 0026 GETMBR R12 R11 K11 + 0x90321B0E, // 0027 SETMBR R12 K13 K14 + 0x8830170B, // 0028 GETMBR R12 R11 K11 + 0xB8360200, // 0029 GETNGBL R13 K1 + 0x8C341B10, // 002A GETMET R13 R13 K16 + 0x7C340200, // 002B CALL R13 1 + 0x90321E0D, // 002C SETMBR R12 K15 R13 + 0x8830170B, // 002D GETMBR R12 R11 K11 + 0x8830190F, // 002E GETMBR R12 R12 K15 + 0x88340511, // 002F GETMBR R13 R2 K17 + 0x9032220D, // 0030 SETMBR R12 K17 R13 + 0x8830170B, // 0031 GETMBR R12 R11 K11 + 0x8830190F, // 0032 GETMBR R12 R12 K15 + 0x88340504, // 0033 GETMBR R13 R2 K4 + 0x9032080D, // 0034 SETMBR R12 K4 R13 + 0x8830170B, // 0035 GETMBR R12 R11 K11 + 0x8830190F, // 0036 GETMBR R12 R12 K15 + 0x88340505, // 0037 GETMBR R13 R2 K5 + 0x90320A0D, // 0038 SETMBR R12 K5 R13 + 0x8830170B, // 0039 GETMBR R12 R11 K11 + 0x90322407, // 003A SETMBR R12 K18 R7 + 0x8C301713, // 003B GETMET R12 R11 K19 + 0x7C300200, // 003C CALL R12 1 + 0x8C341914, // 003D GETMET R13 R12 K20 + 0x7C340200, // 003E CALL R13 1 + 0x60380015, // 003F GETGBL R14 G21 + 0x5C3C1A00, // 0040 MOVE R15 R13 + 0x7C380200, // 0041 CALL R14 1 + 0x8C3C1915, // 0042 GETMET R15 R12 K21 + 0x5C441C00, // 0043 MOVE R17 R14 + 0x7C3C0400, // 0044 CALL R15 2 + 0x5C241E00, // 0045 MOVE R9 R15 + 0x683C0001, // 0046 GETUPV R15 U1 + 0x743E000D, // 0047 JMPT R15 #0056 + 0xB83E2C00, // 0048 GETNGBL R15 K22 + 0x8C3C1F17, // 0049 GETMET R15 R15 K23 + 0x8C440918, // 004A GETMET R17 R4 K24 + 0x584C0019, // 004B LDCONST R19 K25 + 0x68500000, // 004C GETUPV R20 U0 + 0x8850291A, // 004D GETMBR R20 R20 K26 + 0x60540008, // 004E GETGBL R21 G8 + 0x5C580400, // 004F MOVE R22 R2 + 0x7C540200, // 0050 CALL R21 1 + 0x5C580C00, // 0051 MOVE R22 R6 + 0x5C5C1400, // 0052 MOVE R23 R10 + 0x7C440C00, // 0053 CALL R17 6 + 0x5848001B, // 0054 LDCONST R18 K27 + 0x7C3C0600, // 0055 CALL R15 3 + 0x70020055, // 0056 JMP #00AD + 0x8828051C, // 0057 GETMBR R10 R2 K28 + 0x4C2C0000, // 0058 LDNIL R11 + 0x2028140B, // 0059 NE R10 R10 R11 + 0x782A0043, // 005A JMPF R10 #009F + 0x780E0041, // 005B JMPF R3 #009E + 0xB82A0200, // 005C GETNGBL R10 K1 + 0x8C28150A, // 005D GETMET R10 R10 K10 + 0x7C280200, // 005E CALL R10 1 + 0xB82E0200, // 005F GETNGBL R11 K1 + 0x8C2C171E, // 0060 GETMET R11 R11 K30 + 0x7C2C0200, // 0061 CALL R11 1 + 0x902A3A0B, // 0062 SETMBR R10 K29 R11 + 0x882C151D, // 0063 GETMBR R11 R10 K29 + 0xB8320200, // 0064 GETNGBL R12 K1 + 0x8C301910, // 0065 GETMET R12 R12 K16 + 0x7C300200, // 0066 CALL R12 1 + 0x902E1E0C, // 0067 SETMBR R11 K15 R12 + 0x882C151D, // 0068 GETMBR R11 R10 K29 + 0xB8320200, // 0069 GETNGBL R12 K1 + 0x8C30191F, // 006A GETMET R12 R12 K31 + 0x7C300200, // 006B CALL R12 1 + 0x902E380C, // 006C SETMBR R11 K28 R12 + 0x882C151D, // 006D GETMBR R11 R10 K29 + 0x882C170F, // 006E GETMBR R11 R11 K15 + 0x88300511, // 006F GETMBR R12 R2 K17 + 0x902E220C, // 0070 SETMBR R11 K17 R12 + 0x882C151D, // 0071 GETMBR R11 R10 K29 + 0x882C170F, // 0072 GETMBR R11 R11 K15 + 0x88300504, // 0073 GETMBR R12 R2 K4 + 0x902E080C, // 0074 SETMBR R11 K4 R12 + 0x882C151D, // 0075 GETMBR R11 R10 K29 + 0x882C170F, // 0076 GETMBR R11 R11 K15 + 0x88300505, // 0077 GETMBR R12 R2 K5 + 0x902E0A0C, // 0078 SETMBR R11 K5 R12 + 0x882C151D, // 0079 GETMBR R11 R10 K29 + 0x882C171C, // 007A GETMBR R11 R11 K28 + 0x8830051C, // 007B GETMBR R12 R2 K28 + 0x902E380C, // 007C SETMBR R11 K28 R12 + 0x8C2C1513, // 007D GETMET R11 R10 K19 + 0x7C2C0200, // 007E CALL R11 1 + 0x8C301714, // 007F GETMET R12 R11 K20 + 0x7C300200, // 0080 CALL R12 1 + 0x60340015, // 0081 GETGBL R13 G21 + 0x5C381800, // 0082 MOVE R14 R12 + 0x7C340200, // 0083 CALL R13 1 + 0x8C381715, // 0084 GETMET R14 R11 K21 + 0x5C401A00, // 0085 MOVE R16 R13 + 0x7C380400, // 0086 CALL R14 2 + 0x5C241C00, // 0087 MOVE R9 R14 + 0xB83A2C00, // 0088 GETNGBL R14 K22 + 0x8C381D17, // 0089 GETMET R14 R14 K23 + 0x8C400918, // 008A GETMET R16 R4 K24 + 0x58480020, // 008B LDCONST R18 K32 + 0x684C0000, // 008C GETUPV R19 U0 + 0x884C271A, // 008D GETMBR R19 R19 K26 + 0x60500008, // 008E GETGBL R20 G8 + 0x5C540400, // 008F MOVE R21 R2 + 0x7C500200, // 0090 CALL R20 1 + 0x5C540C00, // 0091 MOVE R21 R6 + 0x8858051C, // 0092 GETMBR R22 R2 K28 + 0x885C051C, // 0093 GETMBR R23 R2 K28 + 0xB8620200, // 0094 GETNGBL R24 K1 + 0x88603121, // 0095 GETMBR R24 R24 K33 + 0x1C5C2E18, // 0096 EQ R23 R23 R24 + 0x785E0001, // 0097 JMPF R23 #009A + 0x585C0021, // 0098 LDCONST R23 K33 + 0x70020000, // 0099 JMP #009B + 0x585C0008, // 009A LDCONST R23 K8 + 0x7C400E00, // 009B CALL R16 7 + 0x5844001B, // 009C LDCONST R17 K27 + 0x7C380600, // 009D CALL R14 3 + 0x7002000D, // 009E JMP #00AD + 0xB82A2C00, // 009F GETNGBL R10 K22 + 0x8C281517, // 00A0 GETMET R10 R10 K23 + 0x8C300918, // 00A1 GETMET R12 R4 K24 + 0x58380022, // 00A2 LDCONST R14 K34 + 0x683C0000, // 00A3 GETUPV R15 U0 + 0x883C1F1A, // 00A4 GETMBR R15 R15 K26 + 0x60400008, // 00A5 GETGBL R16 G8 + 0x5C440400, // 00A6 MOVE R17 R2 + 0x7C400200, // 00A7 CALL R16 1 + 0x5C440C00, // 00A8 MOVE R17 R6 + 0x7C300A00, // 00A9 CALL R12 5 + 0x5834001B, // 00AA LDCONST R13 K27 + 0x7C280600, // 00AB CALL R10 3 0x50200000, // 00AC LDBOOL R8 0 0 - 0x80041000, // 00AD RET 1 R8 - 0x80000000, // 00AE RET 0 + 0x7826001E, // 00AD JMPF R9 #00CD + 0x6028000C, // 00AE GETGBL R10 G12 + 0x882C0123, // 00AF GETMBR R11 R0 K35 + 0x7C280200, // 00B0 CALL R10 1 + 0x1C281524, // 00B1 EQ R10 R10 K36 + 0x782A0004, // 00B2 JMPF R10 #00B8 + 0x88280123, // 00B3 GETMBR R10 R0 K35 + 0x8C281525, // 00B4 GETMET R10 R10 K37 + 0x5C301200, // 00B5 MOVE R12 R9 + 0x7C280400, // 00B6 CALL R10 2 + 0x70020014, // 00B7 JMP #00CD + 0x5429FFFE, // 00B8 LDINT R10 -1 + 0x882C0123, // 00B9 GETMBR R11 R0 K35 + 0x9428160A, // 00BA GETIDX R10 R11 R10 + 0x6030000C, // 00BB GETGBL R12 G12 + 0x5C341400, // 00BC MOVE R13 R10 + 0x7C300200, // 00BD CALL R12 1 + 0x6034000C, // 00BE GETGBL R13 G12 + 0x5C381200, // 00BF MOVE R14 R9 + 0x7C340200, // 00C0 CALL R13 1 + 0x0030180D, // 00C1 ADD R12 R12 R13 + 0xB8360200, // 00C2 GETNGBL R13 K1 + 0x88341B26, // 00C3 GETMBR R13 R13 K38 + 0x88341B27, // 00C4 GETMBR R13 R13 K39 + 0x1830180D, // 00C5 LE R12 R12 R13 + 0x78320001, // 00C6 JMPF R12 #00C9 + 0x40301409, // 00C7 CONNECT R12 R10 R9 + 0x70020003, // 00C8 JMP #00CD + 0x882C0123, // 00C9 GETMBR R11 R0 K35 + 0x8C2C1725, // 00CA GETMET R11 R11 K37 + 0x5C341200, // 00CB MOVE R13 R9 + 0x7C2C0400, // 00CC CALL R11 2 + 0x80041000, // 00CD RET 1 R8 }) ), be_nested_proto( diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_IM_Message.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_IM_Message.h index e476fbf5c..b1b6f21da 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_IM_Message.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_IM_Message.h @@ -529,7 +529,7 @@ extern const bclass be_class_Matter_IM_ReportData; ********************************************************************/ be_local_closure(Matter_IM_ReportData_send_im, /* name */ be_nested_proto( - 21, /* nstack */ + 19, /* nstack */ 2, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -537,43 +537,42 @@ be_local_closure(Matter_IM_ReportData_send_im, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[32]) { /* constants */ + ( &(const bvalue[31]) { /* constants */ /* K0 */ be_nested_str_weak(string), /* K1 */ be_nested_str_weak(ready), /* K2 */ be_nested_str_weak(resp), /* K3 */ be_nested_str_weak(data), /* K4 */ be_nested_str_weak(more_chunked_messages), - /* K5 */ be_const_int(0), + /* K5 */ be_const_int(1), /* K6 */ be_nested_str_weak(attribute_reports), - /* K7 */ be_nested_str_weak(to_TLV), - /* K8 */ be_nested_str_weak(encode_len), - /* K9 */ be_const_int(1), - /* K10 */ be_nested_str_weak(MAX_MESSAGE), - /* K11 */ be_const_int(2147483647), - /* K12 */ be_nested_str_weak(tasmota), - /* K13 */ be_nested_str_weak(log), - /* K14 */ be_nested_str_weak(format), - /* K15 */ be_nested_str_weak(MTR_X3A_X20_X2ERead_Attr_X20next_chunk_X20exch_X3D_X25i), - /* K16 */ be_nested_str_weak(get_exchangeid), - /* K17 */ be_const_int(3), - /* K18 */ be_nested_str_weak(MTR_X3A_X20_X2ERead_Attr_X20first_chunk_X20exch_X3D_X25i), - /* K19 */ be_nested_str_weak(tlv2raw), - /* K20 */ be_nested_str_weak(encode_frame), - /* K21 */ be_nested_str_weak(encrypt), - /* K22 */ be_nested_str_weak(MTR_X3A_X20_X3Csnd_X20_X20_X20_X20_X20_X20_X20_X28_X256i_X29_X20id_X3D_X25i_X20exch_X3D_X25i_X20rack_X3D_X25s), - /* K23 */ be_nested_str_weak(session), - /* K24 */ be_nested_str_weak(local_session_id), - /* K25 */ be_nested_str_weak(message_counter), - /* K26 */ be_nested_str_weak(exchange_id), - /* K27 */ be_nested_str_weak(ack_message_counter), - /* K28 */ be_nested_str_weak(send_response_frame), - /* K29 */ be_nested_str_weak(last_counter), - /* K30 */ be_nested_str_weak(MTR_X3A_X20to_be_sent_later_X20size_X3D_X25i_X20exch_X3D_X25i), - /* K31 */ be_nested_str_weak(finish), + /* K7 */ be_const_int(2147483647), + /* K8 */ be_const_int(0), + /* K9 */ be_nested_str_weak(tasmota), + /* K10 */ be_nested_str_weak(log), + /* K11 */ be_nested_str_weak(format), + /* K12 */ be_nested_str_weak(MTR_X3A_X20_X2ERead_Attr_X20next_chunk_X20exch_X3D_X25i), + /* K13 */ be_nested_str_weak(get_exchangeid), + /* K14 */ be_const_int(3), + /* K15 */ be_nested_str_weak(MTR_X3A_X20_X2ERead_Attr_X20first_chunk_X20exch_X3D_X25i), + /* K16 */ be_nested_str_weak(to_TLV), + /* K17 */ be_nested_str_weak(tlv2raw), + /* K18 */ be_nested_str_weak(MAX_MESSAGE), + /* K19 */ be_nested_str_weak(encode_frame), + /* K20 */ be_nested_str_weak(encrypt), + /* K21 */ be_nested_str_weak(MTR_X3A_X20_X3Csnd_X20_X20_X20_X20_X20_X20_X20_X28_X256i_X29_X20id_X3D_X25i_X20exch_X3D_X25i_X20rack_X3D_X25s), + /* K22 */ be_nested_str_weak(session), + /* K23 */ be_nested_str_weak(local_session_id), + /* K24 */ be_nested_str_weak(message_counter), + /* K25 */ be_nested_str_weak(exchange_id), + /* K26 */ be_nested_str_weak(ack_message_counter), + /* K27 */ be_nested_str_weak(send_response_frame), + /* K28 */ be_nested_str_weak(last_counter), + /* K29 */ be_nested_str_weak(MTR_X3A_X20to_be_sent_later_X20size_X3D_X25i_X20exch_X3D_X25i), + /* K30 */ be_nested_str_weak(finish), }), be_str_weak(send_im), &be_const_str_solidified, - ( &(const binstruction[147]) { /* code */ + ( &(const binstruction[109]) { /* code */ 0xA40A0000, // 0000 IMPORT R2 K0 0x880C0101, // 0001 GETMBR R3 R0 K1 0x740E0001, // 0002 JMPT R3 #0005 @@ -583,144 +582,106 @@ be_local_closure(Matter_IM_ReportData_send_im, /* name */ 0x88100103, // 0006 GETMBR R4 R0 K3 0x88140904, // 0007 GETMBR R5 R4 K4 0x58180005, // 0008 LDCONST R6 K5 - 0x581C0005, // 0009 LDCONST R7 K5 + 0x4C1C0000, // 0009 LDNIL R7 0x88200906, // 000A GETMBR R8 R4 K6 0x4C240000, // 000B LDNIL R9 0x20201009, // 000C NE R8 R8 R9 - 0x78220003, // 000D JMPF R8 #0012 - 0x6020000C, // 000E GETGBL R8 G12 + 0x7822000D, // 000D JMPF R8 #001C + 0x40200D07, // 000E CONNECT R8 R6 K7 0x88240906, // 000F GETMBR R9 R4 K6 - 0x7C200200, // 0010 CALL R8 1 - 0x70020000, // 0011 JMP #0013 - 0x58200005, // 0012 LDCONST R8 K5 - 0x24241105, // 0013 GT R9 R8 K5 - 0x78260007, // 0014 JMPF R9 #001D - 0x88240906, // 0015 GETMBR R9 R4 K6 - 0x94241305, // 0016 GETIDX R9 R9 K5 - 0x8C241307, // 0017 GETMET R9 R9 K7 - 0x7C240200, // 0018 CALL R9 1 - 0x8C241308, // 0019 GETMET R9 R9 K8 - 0x7C240200, // 001A CALL R9 1 - 0x5C181200, // 001B MOVE R6 R9 - 0x581C0009, // 001C LDCONST R7 K9 - 0x8824010A, // 001D GETMBR R9 R0 K10 - 0x14240C09, // 001E LT R9 R6 R9 - 0x78260010, // 001F JMPF R9 #0031 - 0x14240E08, // 0020 LT R9 R7 R8 - 0x7826000E, // 0021 JMPF R9 #0031 - 0x88240906, // 0022 GETMBR R9 R4 K6 - 0x94241207, // 0023 GETIDX R9 R9 R7 - 0x8C241307, // 0024 GETMET R9 R9 K7 - 0x7C240200, // 0025 CALL R9 1 - 0x8C241308, // 0026 GETMET R9 R9 K8 - 0x7C240200, // 0027 CALL R9 1 - 0x00280C09, // 0028 ADD R10 R6 R9 - 0x882C010A, // 0029 GETMBR R11 R0 K10 - 0x1428140B, // 002A LT R10 R10 R11 - 0x782A0002, // 002B JMPF R10 #002F - 0x00180C09, // 002C ADD R6 R6 R9 - 0x001C0F09, // 002D ADD R7 R7 K9 - 0x70020000, // 002E JMP #0030 - 0x70020000, // 002F JMP #0031 - 0x7001FFEB, // 0030 JMP #001D - 0x60240012, // 0031 GETGBL R9 G18 - 0x7C240000, // 0032 CALL R9 0 - 0x88280906, // 0033 GETMBR R10 R4 K6 - 0x4C2C0000, // 0034 LDNIL R11 - 0x2028140B, // 0035 NE R10 R10 R11 - 0x782A000D, // 0036 JMPF R10 #0045 - 0x40280F0B, // 0037 CONNECT R10 R7 K11 - 0x882C0906, // 0038 GETMBR R11 R4 K6 - 0x9424160A, // 0039 GETIDX R9 R11 R10 - 0x04300F09, // 003A SUB R12 R7 K9 - 0x40320A0C, // 003B CONNECT R12 K5 R12 - 0x88340906, // 003C GETMBR R13 R4 K6 - 0x94301A0C, // 003D GETIDX R12 R13 R12 - 0x90120C0C, // 003E SETMBR R4 K6 R12 - 0x6030000C, // 003F GETGBL R12 G12 - 0x5C341200, // 0040 MOVE R13 R9 - 0x7C300200, // 0041 CALL R12 1 - 0x24301905, // 0042 GT R12 R12 K5 - 0x9012080C, // 0043 SETMBR R4 K4 R12 - 0x70020001, // 0044 JMP #0047 - 0x50280000, // 0045 LDBOOL R10 0 0 - 0x9012080A, // 0046 SETMBR R4 K4 R10 - 0x78160008, // 0047 JMPF R5 #0051 - 0xB82A1800, // 0048 GETNGBL R10 K12 - 0x8C28150D, // 0049 GETMET R10 R10 K13 - 0x8C30050E, // 004A GETMET R12 R2 K14 - 0x5838000F, // 004B LDCONST R14 K15 - 0x8C3C0110, // 004C GETMET R15 R0 K16 - 0x7C3C0200, // 004D CALL R15 1 - 0x7C300600, // 004E CALL R12 3 - 0x58340011, // 004F LDCONST R13 K17 - 0x7C280600, // 0050 CALL R10 3 - 0x88280904, // 0051 GETMBR R10 R4 K4 - 0x782A000A, // 0052 JMPF R10 #005E - 0x5C280A00, // 0053 MOVE R10 R5 - 0x742A0008, // 0054 JMPT R10 #005E - 0xB82A1800, // 0055 GETNGBL R10 K12 - 0x8C28150D, // 0056 GETMET R10 R10 K13 - 0x8C30050E, // 0057 GETMET R12 R2 K14 - 0x58380012, // 0058 LDCONST R14 K18 - 0x8C3C0110, // 0059 GETMET R15 R0 K16 - 0x7C3C0200, // 005A CALL R15 1 - 0x7C300600, // 005B CALL R12 3 - 0x58340011, // 005C LDCONST R13 K17 - 0x7C280600, // 005D CALL R10 3 - 0x88280103, // 005E GETMBR R10 R0 K3 - 0x8C281507, // 005F GETMET R10 R10 K7 - 0x7C280200, // 0060 CALL R10 1 - 0x8C2C1513, // 0061 GETMET R11 R10 K19 - 0x60340015, // 0062 GETGBL R13 G21 - 0x8838010A, // 0063 GETMBR R14 R0 K10 - 0x7C340200, // 0064 CALL R13 1 - 0x7C2C0400, // 0065 CALL R11 2 - 0x8C300714, // 0066 GETMET R12 R3 K20 - 0x5C381600, // 0067 MOVE R14 R11 - 0x7C300400, // 0068 CALL R12 2 - 0x8C300715, // 0069 GETMET R12 R3 K21 - 0x7C300200, // 006A CALL R12 1 - 0xB8321800, // 006B GETNGBL R12 K12 - 0x8C30190D, // 006C GETMET R12 R12 K13 - 0x8C38050E, // 006D GETMET R14 R2 K14 - 0x58400016, // 006E LDCONST R16 K22 - 0x88440717, // 006F GETMBR R17 R3 K23 - 0x88442318, // 0070 GETMBR R17 R17 K24 - 0x88480719, // 0071 GETMBR R18 R3 K25 - 0x884C071A, // 0072 GETMBR R19 R3 K26 - 0x8850071B, // 0073 GETMBR R20 R3 K27 - 0x7C380C00, // 0074 CALL R14 6 - 0x583C0011, // 0075 LDCONST R15 K17 - 0x7C300600, // 0076 CALL R12 3 - 0x8C30031C, // 0077 GETMET R12 R1 K28 - 0x5C380600, // 0078 MOVE R14 R3 - 0x7C300400, // 0079 CALL R12 2 - 0x88300719, // 007A GETMBR R12 R3 K25 - 0x90023A0C, // 007B SETMBR R0 K29 R12 - 0x6030000C, // 007C GETGBL R12 G12 - 0x5C341200, // 007D MOVE R13 R9 - 0x7C300200, // 007E CALL R12 1 - 0x24301905, // 007F GT R12 R12 K5 - 0x7832000E, // 0080 JMPF R12 #0090 - 0x90120C09, // 0081 SETMBR R4 K6 R9 - 0xB8321800, // 0082 GETNGBL R12 K12 - 0x8C30190D, // 0083 GETMET R12 R12 K13 - 0x8C38050E, // 0084 GETMET R14 R2 K14 - 0x5840001E, // 0085 LDCONST R16 K30 - 0x6044000C, // 0086 GETGBL R17 G12 - 0x88480906, // 0087 GETMBR R18 R4 K6 - 0x7C440200, // 0088 CALL R17 1 - 0x8848071A, // 0089 GETMBR R18 R3 K26 - 0x7C380800, // 008A CALL R14 4 - 0x583C0011, // 008B LDCONST R15 K17 - 0x7C300600, // 008C CALL R12 3 - 0x50300000, // 008D LDBOOL R12 0 0 - 0x9002020C, // 008E SETMBR R0 K1 R12 - 0x70020001, // 008F JMP #0092 - 0x50300200, // 0090 LDBOOL R12 1 0 - 0x90023E0C, // 0091 SETMBR R0 K31 R12 - 0x80000000, // 0092 RET 0 + 0x941C1208, // 0010 GETIDX R7 R9 R8 + 0x04280D05, // 0011 SUB R10 R6 K5 + 0x402A100A, // 0012 CONNECT R10 K8 R10 + 0x882C0906, // 0013 GETMBR R11 R4 K6 + 0x9428160A, // 0014 GETIDX R10 R11 R10 + 0x90120C0A, // 0015 SETMBR R4 K6 R10 + 0x6028000C, // 0016 GETGBL R10 G12 + 0x5C2C0E00, // 0017 MOVE R11 R7 + 0x7C280200, // 0018 CALL R10 1 + 0x24281508, // 0019 GT R10 R10 K8 + 0x9012080A, // 001A SETMBR R4 K4 R10 + 0x70020001, // 001B JMP #001E + 0x50200000, // 001C LDBOOL R8 0 0 + 0x90120808, // 001D SETMBR R4 K4 R8 + 0x78160008, // 001E JMPF R5 #0028 + 0xB8221200, // 001F GETNGBL R8 K9 + 0x8C20110A, // 0020 GETMET R8 R8 K10 + 0x8C28050B, // 0021 GETMET R10 R2 K11 + 0x5830000C, // 0022 LDCONST R12 K12 + 0x8C34010D, // 0023 GETMET R13 R0 K13 + 0x7C340200, // 0024 CALL R13 1 + 0x7C280600, // 0025 CALL R10 3 + 0x582C000E, // 0026 LDCONST R11 K14 + 0x7C200600, // 0027 CALL R8 3 + 0x88200904, // 0028 GETMBR R8 R4 K4 + 0x7822000A, // 0029 JMPF R8 #0035 + 0x5C200A00, // 002A MOVE R8 R5 + 0x74220008, // 002B JMPT R8 #0035 + 0xB8221200, // 002C GETNGBL R8 K9 + 0x8C20110A, // 002D GETMET R8 R8 K10 + 0x8C28050B, // 002E GETMET R10 R2 K11 + 0x5830000F, // 002F LDCONST R12 K15 + 0x8C34010D, // 0030 GETMET R13 R0 K13 + 0x7C340200, // 0031 CALL R13 1 + 0x7C280600, // 0032 CALL R10 3 + 0x582C000E, // 0033 LDCONST R11 K14 + 0x7C200600, // 0034 CALL R8 3 + 0x88200103, // 0035 GETMBR R8 R0 K3 + 0x8C201110, // 0036 GETMET R8 R8 K16 + 0x7C200200, // 0037 CALL R8 1 + 0x8C241111, // 0038 GETMET R9 R8 K17 + 0x602C0015, // 0039 GETGBL R11 G21 + 0x88300112, // 003A GETMBR R12 R0 K18 + 0x7C2C0200, // 003B CALL R11 1 + 0x7C240400, // 003C CALL R9 2 + 0x8C280713, // 003D GETMET R10 R3 K19 + 0x5C301200, // 003E MOVE R12 R9 + 0x7C280400, // 003F CALL R10 2 + 0x8C280714, // 0040 GETMET R10 R3 K20 + 0x7C280200, // 0041 CALL R10 1 + 0xB82A1200, // 0042 GETNGBL R10 K9 + 0x8C28150A, // 0043 GETMET R10 R10 K10 + 0x8C30050B, // 0044 GETMET R12 R2 K11 + 0x58380015, // 0045 LDCONST R14 K21 + 0x883C0716, // 0046 GETMBR R15 R3 K22 + 0x883C1F17, // 0047 GETMBR R15 R15 K23 + 0x88400718, // 0048 GETMBR R16 R3 K24 + 0x88440719, // 0049 GETMBR R17 R3 K25 + 0x8848071A, // 004A GETMBR R18 R3 K26 + 0x7C300C00, // 004B CALL R12 6 + 0x5834000E, // 004C LDCONST R13 K14 + 0x7C280600, // 004D CALL R10 3 + 0x8C28031B, // 004E GETMET R10 R1 K27 + 0x5C300600, // 004F MOVE R12 R3 + 0x7C280400, // 0050 CALL R10 2 + 0x88280718, // 0051 GETMBR R10 R3 K24 + 0x9002380A, // 0052 SETMBR R0 K28 R10 + 0x4C280000, // 0053 LDNIL R10 + 0x20280E0A, // 0054 NE R10 R7 R10 + 0x782A0013, // 0055 JMPF R10 #006A + 0x6028000C, // 0056 GETGBL R10 G12 + 0x5C2C0E00, // 0057 MOVE R11 R7 + 0x7C280200, // 0058 CALL R10 1 + 0x24281508, // 0059 GT R10 R10 K8 + 0x782A000E, // 005A JMPF R10 #006A + 0x90120C07, // 005B SETMBR R4 K6 R7 + 0xB82A1200, // 005C GETNGBL R10 K9 + 0x8C28150A, // 005D GETMET R10 R10 K10 + 0x8C30050B, // 005E GETMET R12 R2 K11 + 0x5838001D, // 005F LDCONST R14 K29 + 0x603C000C, // 0060 GETGBL R15 G12 + 0x88400906, // 0061 GETMBR R16 R4 K6 + 0x7C3C0200, // 0062 CALL R15 1 + 0x88400719, // 0063 GETMBR R16 R3 K25 + 0x7C300800, // 0064 CALL R12 4 + 0x5834000E, // 0065 LDCONST R13 K14 + 0x7C280600, // 0066 CALL R10 3 + 0x50280000, // 0067 LDBOOL R10 0 0 + 0x9002020A, // 0068 SETMBR R0 K1 R10 + 0x70020001, // 0069 JMP #006C + 0x50280200, // 006A LDBOOL R10 1 0 + 0x90023C0A, // 006B SETMBR R0 K30 R10 + 0x80000000, // 006C RET 0 }) ) ); diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor.h new file mode 100644 index 000000000..f38d1d6d6 --- /dev/null +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor.h @@ -0,0 +1,179 @@ +/* Solidification of Matter_Plugin_Sensor.h */ +/********************************************************************\ +* Generated code, don't edit * +\********************************************************************/ +#include "be_constobj.h" + +extern const bclass be_class_Matter_Plugin_Sensor; + +/******************************************************************** +** Solidified function: pre_value +********************************************************************/ +be_local_closure(Matter_Plugin_Sensor_pre_value, /* name */ + be_nested_proto( + 2, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 0, /* has constants */ + NULL, /* no const */ + be_str_weak(pre_value), + &be_const_str_solidified, + ( &(const binstruction[ 1]) { /* code */ + 0x80040200, // 0000 RET 1 R1 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: parse_sensors +********************************************************************/ +be_local_closure(Matter_Plugin_Sensor_parse_sensors, /* name */ + be_nested_proto( + 8, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 5]) { /* constants */ + /* K0 */ be_nested_str_weak(tasmota_sensor_matcher), + /* K1 */ be_nested_str_weak(pre_value), + /* K2 */ be_nested_str_weak(match), + /* K3 */ be_nested_str_weak(shadow_value), + /* K4 */ be_nested_str_weak(valued_changed), + }), + be_str_weak(parse_sensors), + &be_const_str_solidified, + ( &(const binstruction[21]) { /* code */ + 0x88080100, // 0000 GETMBR R2 R0 K0 + 0x780A0011, // 0001 JMPF R2 #0014 + 0x8C080101, // 0002 GETMET R2 R0 K1 + 0x6010000A, // 0003 GETGBL R4 G10 + 0x88140100, // 0004 GETMBR R5 R0 K0 + 0x8C140B02, // 0005 GETMET R5 R5 K2 + 0x5C1C0200, // 0006 MOVE R7 R1 + 0x7C140400, // 0007 CALL R5 2 + 0x7C100200, // 0008 CALL R4 1 + 0x7C080400, // 0009 CALL R2 2 + 0x4C0C0000, // 000A LDNIL R3 + 0x200C0403, // 000B NE R3 R2 R3 + 0x780E0006, // 000C JMPF R3 #0014 + 0x880C0103, // 000D GETMBR R3 R0 K3 + 0x200C0403, // 000E NE R3 R2 R3 + 0x780E0002, // 000F JMPF R3 #0013 + 0x8C0C0104, // 0010 GETMET R3 R0 K4 + 0x5C140400, // 0011 MOVE R5 R2 + 0x7C0C0400, // 0012 CALL R3 2 + 0x90020602, // 0013 SETMBR R0 K3 R2 + 0x80000000, // 0014 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: valued_changed +********************************************************************/ +be_local_closure(Matter_Plugin_Sensor_valued_changed, /* name */ + be_nested_proto( + 2, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 0, /* has constants */ + NULL, /* no const */ + be_str_weak(valued_changed), + &be_const_str_solidified, + ( &(const binstruction[ 1]) { /* code */ + 0x80000000, // 0000 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: init +********************************************************************/ +be_local_closure(Matter_Plugin_Sensor_init, /* name */ + be_nested_proto( + 8, /* nstack */ + 4, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 6]) { /* constants */ + /* K0 */ be_nested_str_weak(init), + /* K1 */ be_nested_str_weak(tasmota_sensor_filter), + /* K2 */ be_nested_str_weak(tasmota_sensor_matcher), + /* K3 */ be_nested_str_weak(tasmota), + /* K4 */ be_nested_str_weak(Rule_Matcher), + /* K5 */ be_nested_str_weak(parse), + }), + be_str_weak(init), + &be_const_str_solidified, + ( &(const binstruction[15]) { /* code */ + 0x60100003, // 0000 GETGBL R4 G3 + 0x5C140000, // 0001 MOVE R5 R0 + 0x7C100200, // 0002 CALL R4 1 + 0x8C100900, // 0003 GETMET R4 R4 K0 + 0x5C180200, // 0004 MOVE R6 R1 + 0x5C1C0400, // 0005 MOVE R7 R2 + 0x7C100600, // 0006 CALL R4 3 + 0x90020203, // 0007 SETMBR R0 K1 R3 + 0xB8120600, // 0008 GETNGBL R4 K3 + 0x88100904, // 0009 GETMBR R4 R4 K4 + 0x8C100905, // 000A GETMET R4 R4 K5 + 0x5C180600, // 000B MOVE R6 R3 + 0x7C100400, // 000C CALL R4 2 + 0x90020404, // 000D SETMBR R0 K2 R4 + 0x80000000, // 000E RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified class: Matter_Plugin_Sensor +********************************************************************/ +extern const bclass be_class_Matter_Plugin_Device; +be_local_class(Matter_Plugin_Sensor, + 3, + &be_class_Matter_Plugin_Device, + be_nested_map(7, + ( (struct bmapnode*) &(const bmapnode[]) { + { be_const_key_weak(tasmota_sensor_matcher, -1), be_const_var(1) }, + { be_const_key_weak(pre_value, 2), be_const_closure(Matter_Plugin_Sensor_pre_value_closure) }, + { be_const_key_weak(parse_sensors, -1), be_const_closure(Matter_Plugin_Sensor_parse_sensors_closure) }, + { be_const_key_weak(shadow_value, -1), be_const_var(2) }, + { be_const_key_weak(tasmota_sensor_filter, 3), be_const_var(0) }, + { be_const_key_weak(init, -1), be_const_closure(Matter_Plugin_Sensor_init_closure) }, + { be_const_key_weak(valued_changed, 0), be_const_closure(Matter_Plugin_Sensor_valued_changed_closure) }, + })), + be_str_weak(Matter_Plugin_Sensor) +); +/*******************************************************************/ + +void be_load_Matter_Plugin_Sensor_class(bvm *vm) { + be_pushntvclass(vm, &be_class_Matter_Plugin_Sensor); + be_setglobal(vm, "Matter_Plugin_Sensor"); + be_pop(vm, 1); +} +/********************************************************************/ +/* End of solidification */ diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor_Humidity.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor_Humidity.h new file mode 100644 index 000000000..88c5d7c55 --- /dev/null +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor_Humidity.h @@ -0,0 +1,220 @@ +/* Solidification of Matter_Plugin_Sensor_Humidity.h */ +/********************************************************************\ +* Generated code, don't edit * +\********************************************************************/ +#include "be_constobj.h" + +extern const bclass be_class_Matter_Plugin_Sensor_Humidity; + +/******************************************************************** +** Solidified function: valued_changed +********************************************************************/ +be_local_closure(Matter_Plugin_Sensor_Humidity_valued_changed, /* name */ + be_nested_proto( + 7, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 2]) { /* constants */ + /* K0 */ be_nested_str_weak(attribute_updated), + /* K1 */ be_const_int(0), + }), + be_str_weak(valued_changed), + &be_const_str_solidified, + ( &(const binstruction[ 6]) { /* code */ + 0x8C080100, // 0000 GETMET R2 R0 K0 + 0x4C100000, // 0001 LDNIL R4 + 0x54160404, // 0002 LDINT R5 1029 + 0x58180001, // 0003 LDCONST R6 K1 + 0x7C080800, // 0004 CALL R2 4 + 0x80000000, // 0005 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: pre_value +********************************************************************/ +be_local_closure(Matter_Plugin_Sensor_Humidity_pre_value, /* name */ + be_nested_proto( + 4, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 0, /* has constants */ + NULL, /* no const */ + be_str_weak(pre_value), + &be_const_str_solidified, + ( &(const binstruction[ 5]) { /* code */ + 0x60080009, // 0000 GETGBL R2 G9 + 0x540E0063, // 0001 LDINT R3 100 + 0x080C0203, // 0002 MUL R3 R1 R3 + 0x7C080200, // 0003 CALL R2 1 + 0x80040400, // 0004 RET 1 R2 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: read_attribute +********************************************************************/ +be_local_closure(Matter_Plugin_Sensor_Humidity_read_attribute, /* name */ + be_nested_proto( + 12, /* nstack */ + 3, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[15]) { /* constants */ + /* K0 */ be_nested_str_weak(string), + /* K1 */ be_nested_str_weak(matter), + /* K2 */ be_nested_str_weak(TLV), + /* K3 */ be_nested_str_weak(cluster), + /* K4 */ be_nested_str_weak(attribute), + /* K5 */ be_const_int(0), + /* K6 */ be_nested_str_weak(shadow_value), + /* K7 */ be_nested_str_weak(create_TLV), + /* K8 */ be_nested_str_weak(U2), + /* K9 */ be_nested_str_weak(NULL), + /* K10 */ be_const_int(1), + /* K11 */ be_const_int(2), + /* K12 */ be_nested_str_weak(U4), + /* K13 */ be_const_int(3), + /* K14 */ be_nested_str_weak(read_attribute), + }), + be_str_weak(read_attribute), + &be_const_str_solidified, + ( &(const binstruction[71]) { /* code */ + 0xA40E0000, // 0000 IMPORT R3 K0 + 0xB8120200, // 0001 GETNGBL R4 K1 + 0x88100902, // 0002 GETMBR R4 R4 K2 + 0x88140503, // 0003 GETMBR R5 R2 K3 + 0x88180504, // 0004 GETMBR R6 R2 K4 + 0x541E0404, // 0005 LDINT R7 1029 + 0x1C1C0A07, // 0006 EQ R7 R5 R7 + 0x781E0035, // 0007 JMPF R7 #003E + 0x1C1C0D05, // 0008 EQ R7 R6 K5 + 0x781E0011, // 0009 JMPF R7 #001C + 0x881C0106, // 000A GETMBR R7 R0 K6 + 0x4C200000, // 000B LDNIL R8 + 0x201C0E08, // 000C NE R7 R7 R8 + 0x781E0007, // 000D JMPF R7 #0016 + 0x8C1C0907, // 000E GETMET R7 R4 K7 + 0x88240908, // 000F GETMBR R9 R4 K8 + 0x60280009, // 0010 GETGBL R10 G9 + 0x882C0106, // 0011 GETMBR R11 R0 K6 + 0x7C280200, // 0012 CALL R10 1 + 0x7C1C0600, // 0013 CALL R7 3 + 0x80040E00, // 0014 RET 1 R7 + 0x70020004, // 0015 JMP #001B + 0x8C1C0907, // 0016 GETMET R7 R4 K7 + 0x88240909, // 0017 GETMBR R9 R4 K9 + 0x4C280000, // 0018 LDNIL R10 + 0x7C1C0600, // 0019 CALL R7 3 + 0x80040E00, // 001A RET 1 R7 + 0x70020020, // 001B JMP #003D + 0x1C1C0D0A, // 001C EQ R7 R6 K10 + 0x781E0005, // 001D JMPF R7 #0024 + 0x8C1C0907, // 001E GETMET R7 R4 K7 + 0x88240908, // 001F GETMBR R9 R4 K8 + 0x542A01F3, // 0020 LDINT R10 500 + 0x7C1C0600, // 0021 CALL R7 3 + 0x80040E00, // 0022 RET 1 R7 + 0x70020018, // 0023 JMP #003D + 0x1C1C0D0B, // 0024 EQ R7 R6 K11 + 0x781E0005, // 0025 JMPF R7 #002C + 0x8C1C0907, // 0026 GETMET R7 R4 K7 + 0x88240908, // 0027 GETMBR R9 R4 K8 + 0x542A270F, // 0028 LDINT R10 10000 + 0x7C1C0600, // 0029 CALL R7 3 + 0x80040E00, // 002A RET 1 R7 + 0x70020010, // 002B JMP #003D + 0x541EFFFB, // 002C LDINT R7 65532 + 0x1C1C0C07, // 002D EQ R7 R6 R7 + 0x781E0005, // 002E JMPF R7 #0035 + 0x8C1C0907, // 002F GETMET R7 R4 K7 + 0x8824090C, // 0030 GETMBR R9 R4 K12 + 0x58280005, // 0031 LDCONST R10 K5 + 0x7C1C0600, // 0032 CALL R7 3 + 0x80040E00, // 0033 RET 1 R7 + 0x70020007, // 0034 JMP #003D + 0x541EFFFC, // 0035 LDINT R7 65533 + 0x1C1C0C07, // 0036 EQ R7 R6 R7 + 0x781E0004, // 0037 JMPF R7 #003D + 0x8C1C0907, // 0038 GETMET R7 R4 K7 + 0x8824090C, // 0039 GETMBR R9 R4 K12 + 0x5828000D, // 003A LDCONST R10 K13 + 0x7C1C0600, // 003B CALL R7 3 + 0x80040E00, // 003C RET 1 R7 + 0x70020007, // 003D JMP #0046 + 0x601C0003, // 003E GETGBL R7 G3 + 0x5C200000, // 003F MOVE R8 R0 + 0x7C1C0200, // 0040 CALL R7 1 + 0x8C1C0F0E, // 0041 GETMET R7 R7 K14 + 0x5C240200, // 0042 MOVE R9 R1 + 0x5C280400, // 0043 MOVE R10 R2 + 0x7C1C0600, // 0044 CALL R7 3 + 0x80040E00, // 0045 RET 1 R7 + 0x80000000, // 0046 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified class: Matter_Plugin_Sensor_Humidity +********************************************************************/ +extern const bclass be_class_Matter_Plugin_Sensor; +be_local_class(Matter_Plugin_Sensor_Humidity, + 0, + &be_class_Matter_Plugin_Sensor, + be_nested_map(5, + ( (struct bmapnode*) &(const bmapnode[]) { + { be_const_key_weak(valued_changed, 3), be_const_closure(Matter_Plugin_Sensor_Humidity_valued_changed_closure) }, + { be_const_key_weak(pre_value, -1), be_const_closure(Matter_Plugin_Sensor_Humidity_pre_value_closure) }, + { be_const_key_weak(read_attribute, -1), be_const_closure(Matter_Plugin_Sensor_Humidity_read_attribute_closure) }, + { be_const_key_weak(TYPES, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { + be_const_map( * be_nested_map(1, + ( (struct bmapnode*) &(const bmapnode[]) { + { be_const_key_int(775, -1), be_const_int(2) }, + })) ) } )) }, + { be_const_key_weak(CLUSTERS, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { + be_const_map( * be_nested_map(1, + ( (struct bmapnode*) &(const bmapnode[]) { + { be_const_key_int(1029, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_list, { + be_const_list( * be_nested_list(5, + ( (struct bvalue*) &(const bvalue[]) { + be_const_int(0), + be_const_int(1), + be_const_int(2), + be_const_int(65532), + be_const_int(65533), + })) ) } )) }, + })) ) } )) }, + })), + be_str_weak(Matter_Plugin_Sensor_Humidity) +); +/*******************************************************************/ + +void be_load_Matter_Plugin_Sensor_Humidity_class(bvm *vm) { + be_pushntvclass(vm, &be_class_Matter_Plugin_Sensor_Humidity); + be_setglobal(vm, "Matter_Plugin_Sensor_Humidity"); + be_pop(vm, 1); +} +/********************************************************************/ +/* End of solidification */ diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor_Light.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor_Light.h new file mode 100644 index 000000000..4cc5a9cd9 --- /dev/null +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor_Light.h @@ -0,0 +1,219 @@ +/* Solidification of Matter_Plugin_Sensor_Light.h */ +/********************************************************************\ +* Generated code, don't edit * +\********************************************************************/ +#include "be_constobj.h" + +extern const bclass be_class_Matter_Plugin_Sensor_Light; + +/******************************************************************** +** Solidified function: valued_changed +********************************************************************/ +be_local_closure(Matter_Plugin_Sensor_Light_valued_changed, /* name */ + be_nested_proto( + 7, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 2]) { /* constants */ + /* K0 */ be_nested_str_weak(attribute_updated), + /* K1 */ be_const_int(0), + }), + be_str_weak(valued_changed), + &be_const_str_solidified, + ( &(const binstruction[ 6]) { /* code */ + 0x8C080100, // 0000 GETMET R2 R0 K0 + 0x4C100000, // 0001 LDNIL R4 + 0x541603FF, // 0002 LDINT R5 1024 + 0x58180001, // 0003 LDCONST R6 K1 + 0x7C080800, // 0004 CALL R2 4 + 0x80000000, // 0005 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: pre_value +********************************************************************/ +be_local_closure(Matter_Plugin_Sensor_Light_pre_value, /* name */ + be_nested_proto( + 4, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 0, /* has constants */ + NULL, /* no const */ + be_str_weak(pre_value), + &be_const_str_solidified, + ( &(const binstruction[ 4]) { /* code */ + 0x60080009, // 0000 GETGBL R2 G9 + 0x5C0C0200, // 0001 MOVE R3 R1 + 0x7C080200, // 0002 CALL R2 1 + 0x80040400, // 0003 RET 1 R2 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: read_attribute +********************************************************************/ +be_local_closure(Matter_Plugin_Sensor_Light_read_attribute, /* name */ + be_nested_proto( + 12, /* nstack */ + 3, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[15]) { /* constants */ + /* K0 */ be_nested_str_weak(string), + /* K1 */ be_nested_str_weak(matter), + /* K2 */ be_nested_str_weak(TLV), + /* K3 */ be_nested_str_weak(cluster), + /* K4 */ be_nested_str_weak(attribute), + /* K5 */ be_const_int(0), + /* K6 */ be_nested_str_weak(shadow_value), + /* K7 */ be_nested_str_weak(create_TLV), + /* K8 */ be_nested_str_weak(I2), + /* K9 */ be_nested_str_weak(NULL), + /* K10 */ be_const_int(1), + /* K11 */ be_const_int(2), + /* K12 */ be_nested_str_weak(U4), + /* K13 */ be_const_int(3), + /* K14 */ be_nested_str_weak(read_attribute), + }), + be_str_weak(read_attribute), + &be_const_str_solidified, + ( &(const binstruction[71]) { /* code */ + 0xA40E0000, // 0000 IMPORT R3 K0 + 0xB8120200, // 0001 GETNGBL R4 K1 + 0x88100902, // 0002 GETMBR R4 R4 K2 + 0x88140503, // 0003 GETMBR R5 R2 K3 + 0x88180504, // 0004 GETMBR R6 R2 K4 + 0x541E03FF, // 0005 LDINT R7 1024 + 0x1C1C0A07, // 0006 EQ R7 R5 R7 + 0x781E0035, // 0007 JMPF R7 #003E + 0x1C1C0D05, // 0008 EQ R7 R6 K5 + 0x781E0011, // 0009 JMPF R7 #001C + 0x881C0106, // 000A GETMBR R7 R0 K6 + 0x4C200000, // 000B LDNIL R8 + 0x201C0E08, // 000C NE R7 R7 R8 + 0x781E0007, // 000D JMPF R7 #0016 + 0x8C1C0907, // 000E GETMET R7 R4 K7 + 0x88240908, // 000F GETMBR R9 R4 K8 + 0x60280009, // 0010 GETGBL R10 G9 + 0x882C0106, // 0011 GETMBR R11 R0 K6 + 0x7C280200, // 0012 CALL R10 1 + 0x7C1C0600, // 0013 CALL R7 3 + 0x80040E00, // 0014 RET 1 R7 + 0x70020004, // 0015 JMP #001B + 0x8C1C0907, // 0016 GETMET R7 R4 K7 + 0x88240909, // 0017 GETMBR R9 R4 K9 + 0x4C280000, // 0018 LDNIL R10 + 0x7C1C0600, // 0019 CALL R7 3 + 0x80040E00, // 001A RET 1 R7 + 0x70020020, // 001B JMP #003D + 0x1C1C0D0A, // 001C EQ R7 R6 K10 + 0x781E0005, // 001D JMPF R7 #0024 + 0x8C1C0907, // 001E GETMET R7 R4 K7 + 0x88240908, // 001F GETMBR R9 R4 K8 + 0x58280005, // 0020 LDCONST R10 K5 + 0x7C1C0600, // 0021 CALL R7 3 + 0x80040E00, // 0022 RET 1 R7 + 0x70020018, // 0023 JMP #003D + 0x1C1C0D0B, // 0024 EQ R7 R6 K11 + 0x781E0005, // 0025 JMPF R7 #002C + 0x8C1C0907, // 0026 GETMET R7 R4 K7 + 0x88240908, // 0027 GETMBR R9 R4 K8 + 0x542A270F, // 0028 LDINT R10 10000 + 0x7C1C0600, // 0029 CALL R7 3 + 0x80040E00, // 002A RET 1 R7 + 0x70020010, // 002B JMP #003D + 0x541EFFFB, // 002C LDINT R7 65532 + 0x1C1C0C07, // 002D EQ R7 R6 R7 + 0x781E0005, // 002E JMPF R7 #0035 + 0x8C1C0907, // 002F GETMET R7 R4 K7 + 0x8824090C, // 0030 GETMBR R9 R4 K12 + 0x58280005, // 0031 LDCONST R10 K5 + 0x7C1C0600, // 0032 CALL R7 3 + 0x80040E00, // 0033 RET 1 R7 + 0x70020007, // 0034 JMP #003D + 0x541EFFFC, // 0035 LDINT R7 65533 + 0x1C1C0C07, // 0036 EQ R7 R6 R7 + 0x781E0004, // 0037 JMPF R7 #003D + 0x8C1C0907, // 0038 GETMET R7 R4 K7 + 0x8824090C, // 0039 GETMBR R9 R4 K12 + 0x5828000D, // 003A LDCONST R10 K13 + 0x7C1C0600, // 003B CALL R7 3 + 0x80040E00, // 003C RET 1 R7 + 0x70020007, // 003D JMP #0046 + 0x601C0003, // 003E GETGBL R7 G3 + 0x5C200000, // 003F MOVE R8 R0 + 0x7C1C0200, // 0040 CALL R7 1 + 0x8C1C0F0E, // 0041 GETMET R7 R7 K14 + 0x5C240200, // 0042 MOVE R9 R1 + 0x5C280400, // 0043 MOVE R10 R2 + 0x7C1C0600, // 0044 CALL R7 3 + 0x80040E00, // 0045 RET 1 R7 + 0x80000000, // 0046 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified class: Matter_Plugin_Sensor_Light +********************************************************************/ +extern const bclass be_class_Matter_Plugin_Sensor; +be_local_class(Matter_Plugin_Sensor_Light, + 0, + &be_class_Matter_Plugin_Sensor, + be_nested_map(5, + ( (struct bmapnode*) &(const bmapnode[]) { + { be_const_key_weak(valued_changed, 3), be_const_closure(Matter_Plugin_Sensor_Light_valued_changed_closure) }, + { be_const_key_weak(pre_value, -1), be_const_closure(Matter_Plugin_Sensor_Light_pre_value_closure) }, + { be_const_key_weak(read_attribute, -1), be_const_closure(Matter_Plugin_Sensor_Light_read_attribute_closure) }, + { be_const_key_weak(TYPES, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { + be_const_map( * be_nested_map(1, + ( (struct bmapnode*) &(const bmapnode[]) { + { be_const_key_int(262, -1), be_const_int(2) }, + })) ) } )) }, + { be_const_key_weak(CLUSTERS, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { + be_const_map( * be_nested_map(1, + ( (struct bmapnode*) &(const bmapnode[]) { + { be_const_key_int(1024, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_list, { + be_const_list( * be_nested_list(5, + ( (struct bvalue*) &(const bvalue[]) { + be_const_int(0), + be_const_int(1), + be_const_int(2), + be_const_int(65532), + be_const_int(65533), + })) ) } )) }, + })) ) } )) }, + })), + be_str_weak(Matter_Plugin_Sensor_Light) +); +/*******************************************************************/ + +void be_load_Matter_Plugin_Sensor_Light_class(bvm *vm) { + be_pushntvclass(vm, &be_class_Matter_Plugin_Sensor_Light); + be_setglobal(vm, "Matter_Plugin_Sensor_Light"); + be_pop(vm, 1); +} +/********************************************************************/ +/* End of solidification */ diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor_Pressure.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor_Pressure.h new file mode 100644 index 000000000..7918e7e0d --- /dev/null +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor_Pressure.h @@ -0,0 +1,219 @@ +/* Solidification of Matter_Plugin_Sensor_Pressure.h */ +/********************************************************************\ +* Generated code, don't edit * +\********************************************************************/ +#include "be_constobj.h" + +extern const bclass be_class_Matter_Plugin_Sensor_Pressure; + +/******************************************************************** +** Solidified function: valued_changed +********************************************************************/ +be_local_closure(Matter_Plugin_Sensor_Pressure_valued_changed, /* name */ + be_nested_proto( + 7, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 2]) { /* constants */ + /* K0 */ be_nested_str_weak(attribute_updated), + /* K1 */ be_const_int(0), + }), + be_str_weak(valued_changed), + &be_const_str_solidified, + ( &(const binstruction[ 6]) { /* code */ + 0x8C080100, // 0000 GETMET R2 R0 K0 + 0x4C100000, // 0001 LDNIL R4 + 0x54160402, // 0002 LDINT R5 1027 + 0x58180001, // 0003 LDCONST R6 K1 + 0x7C080800, // 0004 CALL R2 4 + 0x80000000, // 0005 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: pre_value +********************************************************************/ +be_local_closure(Matter_Plugin_Sensor_Pressure_pre_value, /* name */ + be_nested_proto( + 4, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 0, /* has constants */ + NULL, /* no const */ + be_str_weak(pre_value), + &be_const_str_solidified, + ( &(const binstruction[ 4]) { /* code */ + 0x60080009, // 0000 GETGBL R2 G9 + 0x5C0C0200, // 0001 MOVE R3 R1 + 0x7C080200, // 0002 CALL R2 1 + 0x80040400, // 0003 RET 1 R2 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: read_attribute +********************************************************************/ +be_local_closure(Matter_Plugin_Sensor_Pressure_read_attribute, /* name */ + be_nested_proto( + 12, /* nstack */ + 3, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[15]) { /* constants */ + /* K0 */ be_nested_str_weak(string), + /* K1 */ be_nested_str_weak(matter), + /* K2 */ be_nested_str_weak(TLV), + /* K3 */ be_nested_str_weak(cluster), + /* K4 */ be_nested_str_weak(attribute), + /* K5 */ be_const_int(0), + /* K6 */ be_nested_str_weak(shadow_value), + /* K7 */ be_nested_str_weak(create_TLV), + /* K8 */ be_nested_str_weak(I2), + /* K9 */ be_nested_str_weak(NULL), + /* K10 */ be_const_int(1), + /* K11 */ be_const_int(2), + /* K12 */ be_nested_str_weak(U4), + /* K13 */ be_const_int(3), + /* K14 */ be_nested_str_weak(read_attribute), + }), + be_str_weak(read_attribute), + &be_const_str_solidified, + ( &(const binstruction[71]) { /* code */ + 0xA40E0000, // 0000 IMPORT R3 K0 + 0xB8120200, // 0001 GETNGBL R4 K1 + 0x88100902, // 0002 GETMBR R4 R4 K2 + 0x88140503, // 0003 GETMBR R5 R2 K3 + 0x88180504, // 0004 GETMBR R6 R2 K4 + 0x541E0402, // 0005 LDINT R7 1027 + 0x1C1C0A07, // 0006 EQ R7 R5 R7 + 0x781E0035, // 0007 JMPF R7 #003E + 0x1C1C0D05, // 0008 EQ R7 R6 K5 + 0x781E0011, // 0009 JMPF R7 #001C + 0x881C0106, // 000A GETMBR R7 R0 K6 + 0x4C200000, // 000B LDNIL R8 + 0x201C0E08, // 000C NE R7 R7 R8 + 0x781E0007, // 000D JMPF R7 #0016 + 0x8C1C0907, // 000E GETMET R7 R4 K7 + 0x88240908, // 000F GETMBR R9 R4 K8 + 0x60280009, // 0010 GETGBL R10 G9 + 0x882C0106, // 0011 GETMBR R11 R0 K6 + 0x7C280200, // 0012 CALL R10 1 + 0x7C1C0600, // 0013 CALL R7 3 + 0x80040E00, // 0014 RET 1 R7 + 0x70020004, // 0015 JMP #001B + 0x8C1C0907, // 0016 GETMET R7 R4 K7 + 0x88240909, // 0017 GETMBR R9 R4 K9 + 0x4C280000, // 0018 LDNIL R10 + 0x7C1C0600, // 0019 CALL R7 3 + 0x80040E00, // 001A RET 1 R7 + 0x70020020, // 001B JMP #003D + 0x1C1C0D0A, // 001C EQ R7 R6 K10 + 0x781E0005, // 001D JMPF R7 #0024 + 0x8C1C0907, // 001E GETMET R7 R4 K7 + 0x88240908, // 001F GETMBR R9 R4 K8 + 0x542A01F3, // 0020 LDINT R10 500 + 0x7C1C0600, // 0021 CALL R7 3 + 0x80040E00, // 0022 RET 1 R7 + 0x70020018, // 0023 JMP #003D + 0x1C1C0D0B, // 0024 EQ R7 R6 K11 + 0x781E0005, // 0025 JMPF R7 #002C + 0x8C1C0907, // 0026 GETMET R7 R4 K7 + 0x88240908, // 0027 GETMBR R9 R4 K8 + 0x542A05DB, // 0028 LDINT R10 1500 + 0x7C1C0600, // 0029 CALL R7 3 + 0x80040E00, // 002A RET 1 R7 + 0x70020010, // 002B JMP #003D + 0x541EFFFB, // 002C LDINT R7 65532 + 0x1C1C0C07, // 002D EQ R7 R6 R7 + 0x781E0005, // 002E JMPF R7 #0035 + 0x8C1C0907, // 002F GETMET R7 R4 K7 + 0x8824090C, // 0030 GETMBR R9 R4 K12 + 0x58280005, // 0031 LDCONST R10 K5 + 0x7C1C0600, // 0032 CALL R7 3 + 0x80040E00, // 0033 RET 1 R7 + 0x70020007, // 0034 JMP #003D + 0x541EFFFC, // 0035 LDINT R7 65533 + 0x1C1C0C07, // 0036 EQ R7 R6 R7 + 0x781E0004, // 0037 JMPF R7 #003D + 0x8C1C0907, // 0038 GETMET R7 R4 K7 + 0x8824090C, // 0039 GETMBR R9 R4 K12 + 0x5828000D, // 003A LDCONST R10 K13 + 0x7C1C0600, // 003B CALL R7 3 + 0x80040E00, // 003C RET 1 R7 + 0x70020007, // 003D JMP #0046 + 0x601C0003, // 003E GETGBL R7 G3 + 0x5C200000, // 003F MOVE R8 R0 + 0x7C1C0200, // 0040 CALL R7 1 + 0x8C1C0F0E, // 0041 GETMET R7 R7 K14 + 0x5C240200, // 0042 MOVE R9 R1 + 0x5C280400, // 0043 MOVE R10 R2 + 0x7C1C0600, // 0044 CALL R7 3 + 0x80040E00, // 0045 RET 1 R7 + 0x80000000, // 0046 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified class: Matter_Plugin_Sensor_Pressure +********************************************************************/ +extern const bclass be_class_Matter_Plugin_Sensor; +be_local_class(Matter_Plugin_Sensor_Pressure, + 0, + &be_class_Matter_Plugin_Sensor, + be_nested_map(5, + ( (struct bmapnode*) &(const bmapnode[]) { + { be_const_key_weak(valued_changed, 3), be_const_closure(Matter_Plugin_Sensor_Pressure_valued_changed_closure) }, + { be_const_key_weak(pre_value, -1), be_const_closure(Matter_Plugin_Sensor_Pressure_pre_value_closure) }, + { be_const_key_weak(read_attribute, -1), be_const_closure(Matter_Plugin_Sensor_Pressure_read_attribute_closure) }, + { be_const_key_weak(TYPES, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { + be_const_map( * be_nested_map(1, + ( (struct bmapnode*) &(const bmapnode[]) { + { be_const_key_int(773, -1), be_const_int(2) }, + })) ) } )) }, + { be_const_key_weak(CLUSTERS, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { + be_const_map( * be_nested_map(1, + ( (struct bmapnode*) &(const bmapnode[]) { + { be_const_key_int(1027, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_list, { + be_const_list( * be_nested_list(5, + ( (struct bvalue*) &(const bvalue[]) { + be_const_int(0), + be_const_int(1), + be_const_int(2), + be_const_int(65532), + be_const_int(65533), + })) ) } )) }, + })) ) } )) }, + })), + be_str_weak(Matter_Plugin_Sensor_Pressure) +); +/*******************************************************************/ + +void be_load_Matter_Plugin_Sensor_Pressure_class(bvm *vm) { + be_pushntvclass(vm, &be_class_Matter_Plugin_Sensor_Pressure); + be_setglobal(vm, "Matter_Plugin_Sensor_Pressure"); + be_pop(vm, 1); +} +/********************************************************************/ +/* End of solidification */ diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor_Temp.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor_Temp.h new file mode 100644 index 000000000..99d00d696 --- /dev/null +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor_Temp.h @@ -0,0 +1,215 @@ +/* Solidification of Matter_Plugin_Sensor_Temp.h */ +/********************************************************************\ +* Generated code, don't edit * +\********************************************************************/ +#include "be_constobj.h" + +extern const bclass be_class_Matter_Plugin_Sensor_Temp; + +/******************************************************************** +** Solidified function: valued_changed +********************************************************************/ +be_local_closure(Matter_Plugin_Sensor_Temp_valued_changed, /* name */ + be_nested_proto( + 7, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 2]) { /* constants */ + /* K0 */ be_nested_str_weak(attribute_updated), + /* K1 */ be_const_int(0), + }), + be_str_weak(valued_changed), + &be_const_str_solidified, + ( &(const binstruction[ 6]) { /* code */ + 0x8C080100, // 0000 GETMET R2 R0 K0 + 0x4C100000, // 0001 LDNIL R4 + 0x54160401, // 0002 LDINT R5 1026 + 0x58180001, // 0003 LDCONST R6 K1 + 0x7C080800, // 0004 CALL R2 4 + 0x80000000, // 0005 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: pre_value +********************************************************************/ +be_local_closure(Matter_Plugin_Sensor_Temp_pre_value, /* name */ + be_nested_proto( + 4, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 0, /* has constants */ + NULL, /* no const */ + be_str_weak(pre_value), + &be_const_str_solidified, + ( &(const binstruction[ 5]) { /* code */ + 0x60080009, // 0000 GETGBL R2 G9 + 0x540E0063, // 0001 LDINT R3 100 + 0x080C0203, // 0002 MUL R3 R1 R3 + 0x7C080200, // 0003 CALL R2 1 + 0x80040400, // 0004 RET 1 R2 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: read_attribute +********************************************************************/ +be_local_closure(Matter_Plugin_Sensor_Temp_read_attribute, /* name */ + be_nested_proto( + 11, /* nstack */ + 3, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[14]) { /* constants */ + /* K0 */ be_nested_str_weak(string), + /* K1 */ be_nested_str_weak(matter), + /* K2 */ be_nested_str_weak(TLV), + /* K3 */ be_nested_str_weak(cluster), + /* K4 */ be_nested_str_weak(attribute), + /* K5 */ be_const_int(0), + /* K6 */ be_nested_str_weak(shadow_value), + /* K7 */ be_nested_str_weak(create_TLV), + /* K8 */ be_nested_str_weak(I2), + /* K9 */ be_nested_str_weak(NULL), + /* K10 */ be_const_int(1), + /* K11 */ be_const_int(2), + /* K12 */ be_nested_str_weak(U4), + /* K13 */ be_nested_str_weak(read_attribute), + }), + be_str_weak(read_attribute), + &be_const_str_solidified, + ( &(const binstruction[69]) { /* code */ + 0xA40E0000, // 0000 IMPORT R3 K0 + 0xB8120200, // 0001 GETNGBL R4 K1 + 0x88100902, // 0002 GETMBR R4 R4 K2 + 0x88140503, // 0003 GETMBR R5 R2 K3 + 0x88180504, // 0004 GETMBR R6 R2 K4 + 0x541E0401, // 0005 LDINT R7 1026 + 0x1C1C0A07, // 0006 EQ R7 R5 R7 + 0x781E0033, // 0007 JMPF R7 #003C + 0x1C1C0D05, // 0008 EQ R7 R6 K5 + 0x781E000F, // 0009 JMPF R7 #001A + 0x881C0106, // 000A GETMBR R7 R0 K6 + 0x4C200000, // 000B LDNIL R8 + 0x201C0E08, // 000C NE R7 R7 R8 + 0x781E0005, // 000D JMPF R7 #0014 + 0x8C1C0907, // 000E GETMET R7 R4 K7 + 0x88240908, // 000F GETMBR R9 R4 K8 + 0x88280106, // 0010 GETMBR R10 R0 K6 + 0x7C1C0600, // 0011 CALL R7 3 + 0x80040E00, // 0012 RET 1 R7 + 0x70020004, // 0013 JMP #0019 + 0x8C1C0907, // 0014 GETMET R7 R4 K7 + 0x88240909, // 0015 GETMBR R9 R4 K9 + 0x4C280000, // 0016 LDNIL R10 + 0x7C1C0600, // 0017 CALL R7 3 + 0x80040E00, // 0018 RET 1 R7 + 0x70020020, // 0019 JMP #003B + 0x1C1C0D0A, // 001A EQ R7 R6 K10 + 0x781E0005, // 001B JMPF R7 #0022 + 0x8C1C0907, // 001C GETMET R7 R4 K7 + 0x88240908, // 001D GETMBR R9 R4 K8 + 0x5429EC77, // 001E LDINT R10 -5000 + 0x7C1C0600, // 001F CALL R7 3 + 0x80040E00, // 0020 RET 1 R7 + 0x70020018, // 0021 JMP #003B + 0x1C1C0D0B, // 0022 EQ R7 R6 K11 + 0x781E0005, // 0023 JMPF R7 #002A + 0x8C1C0907, // 0024 GETMET R7 R4 K7 + 0x88240908, // 0025 GETMBR R9 R4 K8 + 0x542A3A97, // 0026 LDINT R10 15000 + 0x7C1C0600, // 0027 CALL R7 3 + 0x80040E00, // 0028 RET 1 R7 + 0x70020010, // 0029 JMP #003B + 0x541EFFFB, // 002A LDINT R7 65532 + 0x1C1C0C07, // 002B EQ R7 R6 R7 + 0x781E0005, // 002C JMPF R7 #0033 + 0x8C1C0907, // 002D GETMET R7 R4 K7 + 0x8824090C, // 002E GETMBR R9 R4 K12 + 0x58280005, // 002F LDCONST R10 K5 + 0x7C1C0600, // 0030 CALL R7 3 + 0x80040E00, // 0031 RET 1 R7 + 0x70020007, // 0032 JMP #003B + 0x541EFFFC, // 0033 LDINT R7 65533 + 0x1C1C0C07, // 0034 EQ R7 R6 R7 + 0x781E0004, // 0035 JMPF R7 #003B + 0x8C1C0907, // 0036 GETMET R7 R4 K7 + 0x8824090C, // 0037 GETMBR R9 R4 K12 + 0x542A0003, // 0038 LDINT R10 4 + 0x7C1C0600, // 0039 CALL R7 3 + 0x80040E00, // 003A RET 1 R7 + 0x70020007, // 003B JMP #0044 + 0x601C0003, // 003C GETGBL R7 G3 + 0x5C200000, // 003D MOVE R8 R0 + 0x7C1C0200, // 003E CALL R7 1 + 0x8C1C0F0D, // 003F GETMET R7 R7 K13 + 0x5C240200, // 0040 MOVE R9 R1 + 0x5C280400, // 0041 MOVE R10 R2 + 0x7C1C0600, // 0042 CALL R7 3 + 0x80040E00, // 0043 RET 1 R7 + 0x80000000, // 0044 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified class: Matter_Plugin_Sensor_Temp +********************************************************************/ +extern const bclass be_class_Matter_Plugin_Sensor; +be_local_class(Matter_Plugin_Sensor_Temp, + 0, + &be_class_Matter_Plugin_Sensor, + be_nested_map(5, + ( (struct bmapnode*) &(const bmapnode[]) { + { be_const_key_weak(valued_changed, 3), be_const_closure(Matter_Plugin_Sensor_Temp_valued_changed_closure) }, + { be_const_key_weak(pre_value, -1), be_const_closure(Matter_Plugin_Sensor_Temp_pre_value_closure) }, + { be_const_key_weak(read_attribute, -1), be_const_closure(Matter_Plugin_Sensor_Temp_read_attribute_closure) }, + { be_const_key_weak(TYPES, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { + be_const_map( * be_nested_map(1, + ( (struct bmapnode*) &(const bmapnode[]) { + { be_const_key_int(770, -1), be_const_int(2) }, + })) ) } )) }, + { be_const_key_weak(CLUSTERS, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { + be_const_map( * be_nested_map(1, + ( (struct bmapnode*) &(const bmapnode[]) { + { be_const_key_int(1026, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_list, { + be_const_list( * be_nested_list(3, + ( (struct bvalue*) &(const bvalue[]) { + be_const_int(0), + be_const_int(1), + be_const_int(2), + })) ) } )) }, + })) ) } )) }, + })), + be_str_weak(Matter_Plugin_Sensor_Temp) +); +/*******************************************************************/ + +void be_load_Matter_Plugin_Sensor_Temp_class(bvm *vm) { + be_pushntvclass(vm, &be_class_Matter_Plugin_Sensor_Temp); + be_setglobal(vm, "Matter_Plugin_Sensor_Temp"); + be_pop(vm, 1); +} +/********************************************************************/ +/* End of solidification */ diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Temp_Sensor.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Temp_Sensor.h deleted file mode 100644 index 0c91b56c3..000000000 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Temp_Sensor.h +++ /dev/null @@ -1,295 +0,0 @@ -/* Solidification of Matter_Plugin_Temp_Sensor.h */ -/********************************************************************\ -* Generated code, don't edit * -\********************************************************************/ -#include "be_constobj.h" - -extern const bclass be_class_Matter_Plugin_Temp_Sensor; - -/******************************************************************** -** Solidified function: get_temperature -********************************************************************/ -be_local_closure(Matter_Plugin_Temp_Sensor_get_temperature, /* name */ - be_nested_proto( - 2, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 1]) { /* constants */ - /* K0 */ be_nested_str_weak(shadow_temperature), - }), - be_str_weak(get_temperature), - &be_const_str_solidified, - ( &(const binstruction[ 2]) { /* code */ - 0x88040100, // 0000 GETMBR R1 R0 K0 - 0x80040200, // 0001 RET 1 R1 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: every_second -********************************************************************/ -be_local_closure(Matter_Plugin_Temp_Sensor_every_second, /* name */ - be_nested_proto( - 3, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 1]) { /* constants */ - /* K0 */ be_nested_str_weak(get_temperature), - }), - be_str_weak(every_second), - &be_const_str_solidified, - ( &(const binstruction[ 3]) { /* code */ - 0x8C040100, // 0000 GETMET R1 R0 K0 - 0x7C040200, // 0001 CALL R1 1 - 0x80000000, // 0002 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: parse_sensors -********************************************************************/ -be_local_closure(Matter_Plugin_Temp_Sensor_parse_sensors, /* name */ - be_nested_proto( - 8, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 5]) { /* constants */ - /* K0 */ be_nested_str_weak(tasmota_sensor_matcher), - /* K1 */ be_nested_str_weak(match), - /* K2 */ be_nested_str_weak(shadow_temperature), - /* K3 */ be_nested_str_weak(attribute_updated), - /* K4 */ be_const_int(0), - }), - be_str_weak(parse_sensors), - &be_const_str_solidified, - ( &(const binstruction[21]) { /* code */ - 0x88080100, // 0000 GETMBR R2 R0 K0 - 0x780A0011, // 0001 JMPF R2 #0014 - 0x6008000A, // 0002 GETGBL R2 G10 - 0x880C0100, // 0003 GETMBR R3 R0 K0 - 0x8C0C0701, // 0004 GETMET R3 R3 K1 - 0x5C140200, // 0005 MOVE R5 R1 - 0x7C0C0400, // 0006 CALL R3 2 - 0x7C080200, // 0007 CALL R2 1 - 0x4C0C0000, // 0008 LDNIL R3 - 0x200C0403, // 0009 NE R3 R2 R3 - 0x780E0008, // 000A JMPF R3 #0014 - 0x880C0102, // 000B GETMBR R3 R0 K2 - 0x200C0403, // 000C NE R3 R2 R3 - 0x780E0004, // 000D JMPF R3 #0013 - 0x8C0C0103, // 000E GETMET R3 R0 K3 - 0x4C140000, // 000F LDNIL R5 - 0x541A0401, // 0010 LDINT R6 1026 - 0x581C0004, // 0011 LDCONST R7 K4 - 0x7C0C0800, // 0012 CALL R3 4 - 0x90020402, // 0013 SETMBR R0 K2 R2 - 0x80000000, // 0014 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: init -********************************************************************/ -be_local_closure(Matter_Plugin_Temp_Sensor_init, /* name */ - be_nested_proto( - 8, /* nstack */ - 4, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 6]) { /* constants */ - /* K0 */ be_nested_str_weak(init), - /* K1 */ be_nested_str_weak(tasmota_sensor_filter), - /* K2 */ be_nested_str_weak(tasmota_sensor_matcher), - /* K3 */ be_nested_str_weak(tasmota), - /* K4 */ be_nested_str_weak(Rule_Matcher), - /* K5 */ be_nested_str_weak(parse), - }), - be_str_weak(init), - &be_const_str_solidified, - ( &(const binstruction[15]) { /* code */ - 0x60100003, // 0000 GETGBL R4 G3 - 0x5C140000, // 0001 MOVE R5 R0 - 0x7C100200, // 0002 CALL R4 1 - 0x8C100900, // 0003 GETMET R4 R4 K0 - 0x5C180200, // 0004 MOVE R6 R1 - 0x5C1C0400, // 0005 MOVE R7 R2 - 0x7C100600, // 0006 CALL R4 3 - 0x90020203, // 0007 SETMBR R0 K1 R3 - 0xB8120600, // 0008 GETNGBL R4 K3 - 0x88100904, // 0009 GETMBR R4 R4 K4 - 0x8C100905, // 000A GETMET R4 R4 K5 - 0x5C180600, // 000B MOVE R6 R3 - 0x7C100400, // 000C CALL R4 2 - 0x90020404, // 000D SETMBR R0 K2 R4 - 0x80000000, // 000E RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: read_attribute -********************************************************************/ -be_local_closure(Matter_Plugin_Temp_Sensor_read_attribute, /* name */ - be_nested_proto( - 13, /* nstack */ - 3, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[13]) { /* constants */ - /* K0 */ be_nested_str_weak(string), - /* K1 */ be_nested_str_weak(matter), - /* K2 */ be_nested_str_weak(TLV), - /* K3 */ be_nested_str_weak(cluster), - /* K4 */ be_nested_str_weak(attribute), - /* K5 */ be_const_int(0), - /* K6 */ be_nested_str_weak(shadow_temperature), - /* K7 */ be_nested_str_weak(create_TLV), - /* K8 */ be_nested_str_weak(I2), - /* K9 */ be_nested_str_weak(NULL), - /* K10 */ be_const_int(1), - /* K11 */ be_const_int(2), - /* K12 */ be_nested_str_weak(read_attribute), - }), - be_str_weak(read_attribute), - &be_const_str_solidified, - ( &(const binstruction[55]) { /* code */ - 0xA40E0000, // 0000 IMPORT R3 K0 - 0xB8120200, // 0001 GETNGBL R4 K1 - 0x88100902, // 0002 GETMBR R4 R4 K2 - 0x88140503, // 0003 GETMBR R5 R2 K3 - 0x88180504, // 0004 GETMBR R6 R2 K4 - 0x541E0401, // 0005 LDINT R7 1026 - 0x1C1C0A07, // 0006 EQ R7 R5 R7 - 0x781E0025, // 0007 JMPF R7 #002E - 0x1C1C0D05, // 0008 EQ R7 R6 K5 - 0x781E0013, // 0009 JMPF R7 #001E - 0x881C0106, // 000A GETMBR R7 R0 K6 - 0x4C200000, // 000B LDNIL R8 - 0x201C0E08, // 000C NE R7 R7 R8 - 0x781E0009, // 000D JMPF R7 #0018 - 0x8C1C0907, // 000E GETMET R7 R4 K7 - 0x88240908, // 000F GETMBR R9 R4 K8 - 0x60280009, // 0010 GETGBL R10 G9 - 0x882C0106, // 0011 GETMBR R11 R0 K6 - 0x54320063, // 0012 LDINT R12 100 - 0x082C160C, // 0013 MUL R11 R11 R12 - 0x7C280200, // 0014 CALL R10 1 - 0x7C1C0600, // 0015 CALL R7 3 - 0x80040E00, // 0016 RET 1 R7 - 0x70020004, // 0017 JMP #001D - 0x8C1C0907, // 0018 GETMET R7 R4 K7 - 0x88240909, // 0019 GETMBR R9 R4 K9 - 0x4C280000, // 001A LDNIL R10 - 0x7C1C0600, // 001B CALL R7 3 - 0x80040E00, // 001C RET 1 R7 - 0x7002000E, // 001D JMP #002D - 0x1C1C0D0A, // 001E EQ R7 R6 K10 - 0x781E0005, // 001F JMPF R7 #0026 - 0x8C1C0907, // 0020 GETMET R7 R4 K7 - 0x88240908, // 0021 GETMBR R9 R4 K8 - 0x5429EC77, // 0022 LDINT R10 -5000 - 0x7C1C0600, // 0023 CALL R7 3 - 0x80040E00, // 0024 RET 1 R7 - 0x70020006, // 0025 JMP #002D - 0x1C1C0D0B, // 0026 EQ R7 R6 K11 - 0x781E0004, // 0027 JMPF R7 #002D - 0x8C1C0907, // 0028 GETMET R7 R4 K7 - 0x88240908, // 0029 GETMBR R9 R4 K8 - 0x542A3A97, // 002A LDINT R10 15000 - 0x7C1C0600, // 002B CALL R7 3 - 0x80040E00, // 002C RET 1 R7 - 0x70020007, // 002D JMP #0036 - 0x601C0003, // 002E GETGBL R7 G3 - 0x5C200000, // 002F MOVE R8 R0 - 0x7C1C0200, // 0030 CALL R7 1 - 0x8C1C0F0C, // 0031 GETMET R7 R7 K12 - 0x5C240200, // 0032 MOVE R9 R1 - 0x5C280400, // 0033 MOVE R10 R2 - 0x7C1C0600, // 0034 CALL R7 3 - 0x80040E00, // 0035 RET 1 R7 - 0x80000000, // 0036 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified class: Matter_Plugin_Temp_Sensor -********************************************************************/ -extern const bclass be_class_Matter_Plugin_Device; -be_local_class(Matter_Plugin_Temp_Sensor, - 3, - &be_class_Matter_Plugin_Device, - be_nested_map(10, - ( (struct bmapnode*) &(const bmapnode[]) { - { be_const_key_weak(TYPES, 7), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { - be_const_map( * be_nested_map(1, - ( (struct bmapnode*) &(const bmapnode[]) { - { be_const_key_int(770, -1), be_const_int(2) }, - })) ) } )) }, - { be_const_key_weak(read_attribute, -1), be_const_closure(Matter_Plugin_Temp_Sensor_read_attribute_closure) }, - { be_const_key_weak(get_temperature, 1), be_const_closure(Matter_Plugin_Temp_Sensor_get_temperature_closure) }, - { be_const_key_weak(init, -1), be_const_closure(Matter_Plugin_Temp_Sensor_init_closure) }, - { be_const_key_weak(CLUSTERS, 9), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { - be_const_map( * be_nested_map(1, - ( (struct bmapnode*) &(const bmapnode[]) { - { be_const_key_int(1026, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_list, { - be_const_list( * be_nested_list(3, - ( (struct bvalue*) &(const bvalue[]) { - be_const_int(0), - be_const_int(1), - be_const_int(2), - })) ) } )) }, - })) ) } )) }, - { be_const_key_weak(every_second, 3), be_const_closure(Matter_Plugin_Temp_Sensor_every_second_closure) }, - { be_const_key_weak(tasmota_sensor_filter, 8), be_const_var(0) }, - { be_const_key_weak(tasmota_sensor_matcher, -1), be_const_var(1) }, - { be_const_key_weak(parse_sensors, -1), be_const_closure(Matter_Plugin_Temp_Sensor_parse_sensors_closure) }, - { be_const_key_weak(shadow_temperature, -1), be_const_var(2) }, - })), - be_str_weak(Matter_Plugin_Temp_Sensor) -); -/*******************************************************************/ - -void be_load_Matter_Plugin_Temp_Sensor_class(bvm *vm) { - be_pushntvclass(vm, &be_class_Matter_Plugin_Temp_Sensor); - be_setglobal(vm, "Matter_Plugin_Temp_Sensor"); - be_pop(vm, 1); -} -/********************************************************************/ -/* End of solidification */ diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_TLV.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_TLV.h index b29cd7a2f..6cc6300b0 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_TLV.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_TLV.h @@ -1861,25 +1861,35 @@ be_local_closure(Matter_TLV_list_add_obj, /* name */ NULL, /* no sub protos */ 1, /* has constants */ ( &(const bvalue[ 4]) { /* constants */ - /* K0 */ be_nested_str_weak(to_TLV), - /* K1 */ be_nested_str_weak(tag_sub), - /* K2 */ be_nested_str_weak(val), - /* K3 */ be_nested_str_weak(push), + /* K0 */ be_nested_str_weak(val), + /* K1 */ be_nested_str_weak(push), + /* K2 */ be_nested_str_weak(to_TLV), + /* K3 */ be_nested_str_weak(tag_sub), }), be_str_weak(add_obj), &be_const_str_solidified, - ( &(const binstruction[11]) { /* code */ + ( &(const binstruction[21]) { /* code */ 0x4C0C0000, // 0000 LDNIL R3 0x200C0403, // 0001 NE R3 R2 R3 - 0x780E0006, // 0002 JMPF R3 #000A - 0x8C0C0500, // 0003 GETMET R3 R2 K0 - 0x7C0C0200, // 0004 CALL R3 1 - 0x900E0201, // 0005 SETMBR R3 K1 R1 - 0x88100102, // 0006 GETMBR R4 R0 K2 - 0x8C100903, // 0007 GETMET R4 R4 K3 - 0x5C180600, // 0008 MOVE R6 R3 - 0x7C100400, // 0009 CALL R4 2 - 0x80040000, // 000A RET 1 R0 + 0x780E0010, // 0002 JMPF R3 #0014 + 0x600C000F, // 0003 GETGBL R3 G15 + 0x5C100400, // 0004 MOVE R4 R2 + 0x60140015, // 0005 GETGBL R5 G21 + 0x7C0C0400, // 0006 CALL R3 2 + 0x780E0004, // 0007 JMPF R3 #000D + 0x880C0100, // 0008 GETMBR R3 R0 K0 + 0x8C0C0701, // 0009 GETMET R3 R3 K1 + 0x5C140400, // 000A MOVE R5 R2 + 0x7C0C0400, // 000B CALL R3 2 + 0x70020006, // 000C JMP #0014 + 0x8C0C0502, // 000D GETMET R3 R2 K2 + 0x7C0C0200, // 000E CALL R3 1 + 0x900E0601, // 000F SETMBR R3 K3 R1 + 0x88100100, // 0010 GETMBR R4 R0 K0 + 0x8C100901, // 0011 GETMET R4 R4 K1 + 0x5C180600, // 0012 MOVE R6 R3 + 0x7C100400, // 0013 CALL R4 2 + 0x80040000, // 0014 RET 1 R0 }) ) ); @@ -2516,7 +2526,7 @@ be_local_closure(Matter_TLV_list_tlv2raw, /* name */ }), be_str_weak(tlv2raw), &be_const_str_solidified, - ( &(const binstruction[37]) { /* code */ + ( &(const binstruction[44]) { /* code */ 0x4C080000, // 0000 LDNIL R2 0x1C080202, // 0001 EQ R2 R1 R2 0x780A0002, // 0002 JMPF R2 #0006 @@ -2538,22 +2548,29 @@ be_local_closure(Matter_TLV_list_tlv2raw, /* name */ 0x600C0010, // 0012 GETGBL R3 G16 0x5C100400, // 0013 MOVE R4 R2 0x7C0C0200, // 0014 CALL R3 1 - 0xA8020005, // 0015 EXBLK 0 #001C + 0xA802000C, // 0015 EXBLK 0 #0023 0x5C100600, // 0016 MOVE R4 R3 0x7C100000, // 0017 CALL R4 0 - 0x8C140905, // 0018 GETMET R5 R4 K5 - 0x5C1C0200, // 0019 MOVE R7 R1 - 0x7C140400, // 001A CALL R5 2 - 0x7001FFF9, // 001B JMP #0016 - 0x580C0006, // 001C LDCONST R3 K6 - 0xAC0C0200, // 001D CATCH R3 1 0 - 0xB0080000, // 001E RAISE 2 R0 R0 - 0x8C0C0307, // 001F GETMET R3 R1 K7 - 0x88140108, // 0020 GETMBR R5 R0 K8 - 0x88140B09, // 0021 GETMBR R5 R5 K9 - 0x5818000A, // 0022 LDCONST R6 K10 - 0x7C0C0600, // 0023 CALL R3 3 - 0x80040200, // 0024 RET 1 R1 + 0x6014000F, // 0018 GETGBL R5 G15 + 0x5C180800, // 0019 MOVE R6 R4 + 0x601C0015, // 001A GETGBL R7 G21 + 0x7C140400, // 001B CALL R5 2 + 0x78160001, // 001C JMPF R5 #001F + 0x40140204, // 001D CONNECT R5 R1 R4 + 0x70020002, // 001E JMP #0022 + 0x8C140905, // 001F GETMET R5 R4 K5 + 0x5C1C0200, // 0020 MOVE R7 R1 + 0x7C140400, // 0021 CALL R5 2 + 0x7001FFF2, // 0022 JMP #0016 + 0x580C0006, // 0023 LDCONST R3 K6 + 0xAC0C0200, // 0024 CATCH R3 1 0 + 0xB0080000, // 0025 RAISE 2 R0 R0 + 0x8C0C0307, // 0026 GETMET R3 R1 K7 + 0x88140108, // 0027 GETMBR R5 R0 K8 + 0x88140B09, // 0028 GETMBR R5 R5 K9 + 0x5818000A, // 0029 LDCONST R6 K10 + 0x7C0C0600, // 002A CALL R3 3 + 0x80040200, // 002B RET 1 R1 }) ) ); From c5e09ef76d0072d058ff45824725ed3c7804e057 Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Tue, 18 Apr 2023 13:37:55 +0200 Subject: [PATCH 004/289] Update changelogs --- CHANGELOG.md | 2 +- RELEASENOTES.md | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d1a2655cc..721b2a5f4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,7 @@ All notable changes to this project will be documented in this file. ## [12.5.0.1] ### Added +- Matter sensors Humidity, Pressure, Illuminance; optimize memory (#18441) ### Breaking Changed @@ -29,7 +30,6 @@ All notable changes to this project will be documented in this file. - Berry `instrospect.name()` to get names of functions, modules and classes (#18422) - Berry add `searchall()` and `matchall()` to `re` module and pre-compiled patterns (#18429) - Matter automatically exposes all detected Temperature sensors (#18430) -- Matter add sensors: Humidity, Pressure, Illuminance; optimize memory ### Changed - ESP32 LVGL library from v8.3.5 to v8.3.6 (no functional change) diff --git a/RELEASENOTES.md b/RELEASENOTES.md index ac781716f..fdbfb0cf8 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -112,6 +112,7 @@ The latter links can be used for OTA upgrades too like ``OtaUrl https://ota.tasm ## Changelog v12.5.0.1 ### Added +- Matter sensors Humidity, Pressure, Illuminance [#18441](https://github.com/arendst/Tasmota/issues/18441) ### Breaking Changed From 2684141722f874540a549326c37646b9c7aa1f36 Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Tue, 18 Apr 2023 15:34:19 +0200 Subject: [PATCH 005/289] Fix ESP8266 Energy Export Active Fix ESP8266 Energy Export Active no update regression from v12.3.1.3 --- CHANGELOG.md | 1 + RELEASENOTES.md | 1 + tasmota/tasmota_xdrv_driver/xdrv_03_energy.ino | 8 +++++++- 3 files changed, 9 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 721b2a5f4..3c71fbfaa 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,7 @@ All notable changes to this project will be documented in this file. ### Changed ### Fixed +- ESP8266 Energy Export Active no update regression from v12.3.1.3 ### Removed diff --git a/RELEASENOTES.md b/RELEASENOTES.md index fdbfb0cf8..9281f00d4 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -119,3 +119,4 @@ The latter links can be used for OTA upgrades too like ``OtaUrl https://ota.tasm ### Changed ### Fixed +- ESP8266 Energy Export Active no update regression from v12.3.1.3 diff --git a/tasmota/tasmota_xdrv_driver/xdrv_03_energy.ino b/tasmota/tasmota_xdrv_driver/xdrv_03_energy.ino index ebbad0f72..6fc75ec08 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_03_energy.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_03_energy.ino @@ -99,6 +99,7 @@ typedef struct { int32_t kWhtoday_delta[ENERGY_MAX_PHASES]; // 1212312345 Wh 10^-5 (deca micro Watt hours) - Overflows to Energy->kWhtoday (HLW and CSE only) int32_t kWhtoday_offset[ENERGY_MAX_PHASES]; // 12312312 Wh * 10^-2 (deca milli Watt hours) - 5764 = 0.05764 kWh = 0.058 kWh = Energy->daily int32_t kWhtoday[ENERGY_MAX_PHASES]; // 12312312 Wh * 10^-2 (deca milli Watt hours) - 5764 = 0.05764 kWh = 0.058 kWh = Energy->daily + int32_t kWhtoday_export[ENERGY_MAX_PHASES]; // 12312312 Wh * 10^-2 (deca milli Watt hours) - 5764 = 0.05764 kWh = 0.058 kWh = Energy->daily int32_t period[ENERGY_MAX_PHASES]; // 12312312 Wh * 10^-2 (deca milli Watt hours) - 5764 = 0.05764 kWh = 0.058 kWh = Energy->daily char* value; @@ -278,7 +279,12 @@ void EnergyUpdateToday(void) { Energy->kWhtoday_delta[i] -= (delta * 1000); Energy->kWhtoday[i] += delta; if (delta < 0) { // Export energy - RtcSettings.energy_kWhexport_ph[i] += ((delta / 100) *-1); + Energy->kWhtoday_export[i] += (delta *-1); + if (Energy->kWhtoday_export[i] > 100) { + int32_t delta_export = Energy->kWhtoday_export[i] / 100; + Energy->kWhtoday_export[i] -= (delta_export * 100); + RtcSettings.energy_kWhexport_ph[i] += delta_export; + } } } From 6f6c43a724839786aa42551bf1961e1310ac14f6 Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Tue, 18 Apr 2023 17:16:29 +0200 Subject: [PATCH 006/289] Add command ``SetOption152 0/1`` Add command ``SetOption152 0/1`` to select two (default) or one pin bistable relay control (#18386) --- CHANGELOG.md | 1 + RELEASENOTES.md | 1 + tasmota/include/tasmota_types.h | 2 +- tasmota/tasmota.ino | 2 ++ tasmota/tasmota_support/support_command.ino | 1 + tasmota/tasmota_support/support_tasmota.ino | 33 +++++++++++++++++---- tools/decode-status.py | 5 ++-- 7 files changed, 37 insertions(+), 8 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3c71fbfaa..f095fdb9f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,7 @@ All notable changes to this project will be documented in this file. ## [12.5.0.1] ### Added - Matter sensors Humidity, Pressure, Illuminance; optimize memory (#18441) +- Command ``SetOption152 0/1`` to select two (default) or one pin bistable relay control (#18386) ### Breaking Changed diff --git a/RELEASENOTES.md b/RELEASENOTES.md index 9281f00d4..e7c1949ab 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -112,6 +112,7 @@ The latter links can be used for OTA upgrades too like ``OtaUrl https://ota.tasm ## Changelog v12.5.0.1 ### Added +- Command ``SetOption152 0/1`` to select two (default) or one pin bistable relay control [#18386](https://github.com/arendst/Tasmota/issues/18386) - Matter sensors Humidity, Pressure, Illuminance [#18441](https://github.com/arendst/Tasmota/issues/18441) ### Breaking Changed diff --git a/tasmota/include/tasmota_types.h b/tasmota/include/tasmota_types.h index 7f947a51d..004b6602b 100644 --- a/tasmota/include/tasmota_types.h +++ b/tasmota/include/tasmota_types.h @@ -185,7 +185,7 @@ typedef union { // Restricted by MISRA-C Rule 18.4 bu uint32_t dns_ipv6_priority : 1; // bit 3 (v12.2.0.6) - SetOption149 - (Wifi) prefer IPv6 DNS resolution to IPv4 address when available. Requires `#define USE_IPV6` uint32_t no_voltage_common : 1; // bit 4 (v12.3.1.5) - SetOption150 - (Energy) Force no voltage/frequency common uint32_t matter_enabled : 1; // bit 5 (v12.3.1.5) - SetOption151 - (Matter) Enable Matter protocol over Wifi - uint32_t spare06 : 1; // bit 6 + uint32_t bistable_single_pin : 1; // bit 6 (v12.5.0.1) - SetOption152 - (Power) Switch between two (0) or one (1) pin bistable relay control uint32_t spare07 : 1; // bit 7 uint32_t spare08 : 1; // bit 8 uint32_t spare09 : 1; // bit 9 diff --git a/tasmota/tasmota.ino b/tasmota/tasmota.ino index 85c0f0d72..cdba8af55 100644 --- a/tasmota/tasmota.ino +++ b/tasmota/tasmota.ino @@ -254,6 +254,7 @@ struct TasmotaGlobal_t { void *log_buffer_mutex; // Control access to log buffer power_t power; // Current copy of Settings->power + power_t power_bistable; // Current state of single pin bistable power power_t rel_inverted; // Relay inverted flag (1 = (0 = On, 1 = Off)) power_t rel_bistable; // Relay bistable bitmap power_t last_power; // Last power set state @@ -430,6 +431,7 @@ void setup(void) { TasmotaGlobal.global_state.data = 0xF; // Init global state (wifi_down, mqtt_down) to solve possible network issues TasmotaGlobal.enable_logging = 1; TasmotaGlobal.seriallog_level = LOG_LEVEL_INFO; // Allow specific serial messages until config loaded + TasmotaGlobal.power_bistable = 0x80000000; RtcRebootLoad(); if (!RtcRebootValid()) { diff --git a/tasmota/tasmota_support/support_command.ino b/tasmota/tasmota_support/support_command.ino index 4637cd09c..a5926b353 100644 --- a/tasmota/tasmota_support/support_command.ino +++ b/tasmota/tasmota_support/support_command.ino @@ -1472,6 +1472,7 @@ void CmndSetoptionBase(bool indexed) { bitWrite(Settings->flag6.data, pindex, XdrvMailbox.payload); switch (pindex) { case 5: // SetOption151 - Matter enabled + case 6: // SetOption152 - (Power) Use single pin bistable TasmotaGlobal.restart_flag = 2; break; } diff --git a/tasmota/tasmota_support/support_tasmota.ino b/tasmota/tasmota_support/support_tasmota.ino index 845f18766..432f7682e 100644 --- a/tasmota/tasmota_support/support_tasmota.ino +++ b/tasmota/tasmota_support/support_tasmota.ino @@ -309,6 +309,7 @@ void SetDevicePower(power_t rpower, uint32_t source) { else { uint32_t port = 0; uint32_t port_next; + power_t bistable = 0; ZeroCrossMomentStart(); @@ -316,12 +317,25 @@ void SetDevicePower(power_t rpower, uint32_t source) { power_t state = rpower &1; port_next = 1; // Select next relay + bool update = true; if (bitRead(TasmotaGlobal.rel_bistable, port)) { - if (!state) { port_next = 2; } // Skip highest relay - port += state; // Relay = Off, Relay = On + if (Settings->flag6.bistable_single_pin) { // SetOption152 - (Power) Use single pin bistable + if (0x80000000 == TasmotaGlobal.power_bistable) { + TasmotaGlobal.power_bistable = TasmotaGlobal.power; // Init last known state + } + update = (bitRead(TasmotaGlobal.power_bistable, port) != state); + if (update) { + bitWrite(TasmotaGlobal.power_bistable, port, state); + bitSet(bistable, port); + } + + } else { + if (!state) { port_next = 2; } // Skip highest relay + port += state; // Relay = Off, Relay = On + } state = 1; // Set pulse } - if (i < MAX_RELAYS) { + if (update && (i < MAX_RELAYS)) { DigitalWrite(GPIO_REL1, port, bitRead(TasmotaGlobal.rel_inverted, port) ? !state : state); } port += port_next; // Select next relay @@ -335,6 +349,11 @@ void SetDevicePower(power_t rpower, uint32_t source) { delay(Settings->param[P_BISTABLE_PULSE]); // SetOption45 - Keep energized for about 5 x operation time for (uint32_t i = 0; i < port; i++) { // Reset up to detected amount of ports if (bitRead(TasmotaGlobal.rel_bistable, i)) { + if (Settings->flag6.bistable_single_pin) { // SetOption152 - (Power) Use single pin bistable + if (!bitRead(bistable, i)) { + continue; + } + } DigitalWrite(GPIO_REL1, i, bitRead(TasmotaGlobal.rel_inverted, i) ? 1 : 0); } } @@ -2218,8 +2237,12 @@ void GpioInit(void) if (i &1) { TasmotaGlobal.devices_present--; } } #endif // ESP8266 - if (bitRead(TasmotaGlobal.rel_bistable, i)) { - if (bi_device &1) { TasmotaGlobal.devices_present--; } + if (!Settings->flag6.bistable_single_pin) { // SetOption152 - (Power) Use single pin bistable + if (bitRead(TasmotaGlobal.rel_bistable, i)) { + if (bi_device &1) { + TasmotaGlobal.devices_present--; + } + } bi_device++; } } diff --git a/tools/decode-status.py b/tools/decode-status.py index 490e8e79a..ebe18e460 100755 --- a/tools/decode-status.py +++ b/tools/decode-status.py @@ -207,7 +207,8 @@ a_setoption = [[ "(Wifi) prefer IPv6 DNS resolution to IPv4 address when available. Requires `#define USE_IPV6`", "(Energy) Force no voltage/frequency common", "(Matter) Enable Matter protocol over Wifi", - "","", + "(Power) Switch between two (0) or one (1) pin bistable relay control", + "", "","","","", "","","","", "","","","", @@ -324,7 +325,7 @@ else: obj = json.load(fp) def StartDecode(): - print ("\n*** decode-status.py v12.4.0.5 by Theo Arends and Jacek Ziolkowski ***") + print ("\n*** decode-status.py v12.5.0.1 by Theo Arends and Jacek Ziolkowski ***") # print("Decoding\n{}".format(obj)) From eb40496e4bf347a5aa86d482554aefcf5d014df5 Mon Sep 17 00:00:00 2001 From: InHi66 <38803741+InHi66@users.noreply.github.com> Date: Tue, 18 Apr 2023 17:20:47 +0200 Subject: [PATCH 007/289] Update xsns_20_novasds.ino (#18444) --- tasmota/tasmota_xsns_sensor/xsns_20_novasds.ino | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tasmota/tasmota_xsns_sensor/xsns_20_novasds.ino b/tasmota/tasmota_xsns_sensor/xsns_20_novasds.ino index 3bd0d3933..20f6d8e30 100644 --- a/tasmota/tasmota_xsns_sensor/xsns_20_novasds.ino +++ b/tasmota/tasmota_xsns_sensor/xsns_20_novasds.ino @@ -231,8 +231,8 @@ void NovaSdsShow(bool json) { #endif // USE_DOMOTICZ #ifdef USE_WEBSERVER } else { - WSContentSend_PD(HTTP_SNS_F_ENVIRONMENTAL_CONCENTRATION, types, "2.5", pm2_5); - WSContentSend_PD(HTTP_SNS_F_ENVIRONMENTAL_CONCENTRATION, types, "10", pm10); + WSContentSend_PD(HTTP_SNS_F_ENVIRONMENTAL_CONCENTRATION, types, "2.5", &pm2_5); + WSContentSend_PD(HTTP_SNS_F_ENVIRONMENTAL_CONCENTRATION, types, "10", &pm10); #endif // USE_WEBSERVER } } From fb98d8954ad7d37a7ac3ecf39a2aa9bc018a145f Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Tue, 18 Apr 2023 17:23:37 +0200 Subject: [PATCH 008/289] Update changelogs --- CHANGELOG.md | 1 + RELEASENOTES.md | 1 + 2 files changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index f095fdb9f..4e35bbded 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,6 +14,7 @@ All notable changes to this project will be documented in this file. ### Fixed - ESP8266 Energy Export Active no update regression from v12.3.1.3 +- NovaSDS GUI values (#18444) ### Removed diff --git a/RELEASENOTES.md b/RELEASENOTES.md index e7c1949ab..0c0f50aad 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -121,3 +121,4 @@ The latter links can be used for OTA upgrades too like ``OtaUrl https://ota.tasm ### Fixed - ESP8266 Energy Export Active no update regression from v12.3.1.3 +- NovaSDS GUI values [#18444](https://github.com/arendst/Tasmota/issues/18444) \ No newline at end of file From a85412fce285e4a8285c4ca95895467a0cb3a90b Mon Sep 17 00:00:00 2001 From: s-hadinger <49731213+s-hadinger@users.noreply.github.com> Date: Tue, 18 Apr 2023 22:27:27 +0200 Subject: [PATCH 009/289] Matter allow `Matter#Initialized` rule once the device is configured (#18451) --- CHANGELOG.md | 1 + .../src/embedded/Matter_Device.be | 28 +- .../src/solidify/solidified_Matter_Device.h | 6344 +++++++++-------- 3 files changed, 3258 insertions(+), 3115 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4e35bbded..fe36cd2e2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,7 @@ All notable changes to this project will be documented in this file. ### Added - Matter sensors Humidity, Pressure, Illuminance; optimize memory (#18441) - Command ``SetOption152 0/1`` to select two (default) or one pin bistable relay control (#18386) +- Matter allow `Matter#Initialized` rule once the device is configured ### Breaking Changed diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Device.be b/lib/libesp32/berry_matter/src/embedded/Matter_Device.be index f4ce634a9..2e0da6cdf 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Device.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Device.be @@ -104,6 +104,8 @@ class Matter_Device self._init_basic_commissioning() tasmota.add_driver(self) + + self.register_commands() end ############################################################# @@ -1011,7 +1013,7 @@ class Matter_Device end if endpoint > 0x40 break end end - + tasmota.publish_result('{"Matter":{"Initialized":1}}', 'Matter') end # get keys of a map in sorted order @@ -1019,6 +1021,30 @@ class Matter_Device for i:1..size(l)-1 var k = l[i] var j = i while (j > 0) && (l[j-1] > k) l[j] = l[j-1] j -= 1 end l[j] = k end return l end + ##################################################################### + # Commands `Mtr___` + ##################################################################### + # + def register_commands() + tasmota.add_cmd("MtrJoin", /cmd_found, idx, payload, payload_json -> self.MtrJoin(cmd_found, idx, payload, payload_json)) + end + + ##################################################################### + # `MtrJoin` + # + # Open or close commissioning + # + def MtrJoin(cmd_found, idx, payload, payload_json) + var payload_int = int(payload) + if payload_int + self.start_root_basic_commissioning() + else + self.stop_basic_commissioning() + end + tasmota.resp_cmnd_done() + end + + end matter.Device = Matter_Device diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Device.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Device.h index ba71e5d7c..813942de2 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Device.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Device.h @@ -57,9 +57,288 @@ be_local_closure(Matter_Device_start_operational_discovery, /* name */ /******************************************************************** -** Solidified function: is_commissioning_open +** Solidified function: start ********************************************************************/ -be_local_closure(Matter_Device_is_commissioning_open, /* name */ +be_local_closure(Matter_Device_start, /* name */ + be_nested_proto( + 7, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 1, /* has sup protos */ + ( &(const struct bproto*[ 1]) { + be_nested_proto( + 2, /* nstack */ + 0, /* argc */ + 0, /* varg */ + 1, /* has upvals */ + ( &(const bupvaldesc[ 1]) { /* upvals */ + be_local_const_upval(1, 0), + }), + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 1]) { /* constants */ + /* K0 */ be_nested_str_weak(_trigger_read_sensors), + }), + be_str_weak(_anonymous_), + &be_const_str_solidified, + ( &(const binstruction[ 4]) { /* code */ + 0x68000000, // 0000 GETUPV R0 U0 + 0x8C000100, // 0001 GETMET R0 R0 K0 + 0x7C000200, // 0002 CALL R0 1 + 0x80000000, // 0003 RET 0 + }) + ), + }), + 1, /* has constants */ + ( &(const bvalue[14]) { /* constants */ + /* K0 */ be_nested_str_weak(started), + /* K1 */ be_nested_str_weak(plugins), + /* K2 */ be_nested_str_weak(push), + /* K3 */ be_nested_str_weak(matter), + /* K4 */ be_nested_str_weak(Plugin_Root), + /* K5 */ be_const_int(0), + /* K6 */ be_nested_str_weak(autoconf_device), + /* K7 */ be_nested_str_weak(tasmota), + /* K8 */ be_nested_str_weak(add_cron), + /* K9 */ be_nested_str_weak(_X2A_X2F30_X20_X2A_X20_X2A_X20_X2A_X20_X2A_X20_X2A), + /* K10 */ be_nested_str_weak(matter_sensors_30s), + /* K11 */ be_nested_str_weak(_start_udp), + /* K12 */ be_nested_str_weak(UDP_PORT), + /* K13 */ be_nested_str_weak(start_mdns_announce_hostnames), + }), + be_str_weak(start), + &be_const_str_solidified, + ( &(const binstruction[28]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x78060000, // 0001 JMPF R1 #0003 + 0x80000200, // 0002 RET 0 + 0x88040101, // 0003 GETMBR R1 R0 K1 + 0x8C040302, // 0004 GETMET R1 R1 K2 + 0xB80E0600, // 0005 GETNGBL R3 K3 + 0x8C0C0704, // 0006 GETMET R3 R3 K4 + 0x5C140000, // 0007 MOVE R5 R0 + 0x58180005, // 0008 LDCONST R6 K5 + 0x7C0C0600, // 0009 CALL R3 3 + 0x7C040400, // 000A CALL R1 2 + 0x8C040106, // 000B GETMET R1 R0 K6 + 0x7C040200, // 000C CALL R1 1 + 0xB8060E00, // 000D GETNGBL R1 K7 + 0x8C040308, // 000E GETMET R1 R1 K8 + 0x580C0009, // 000F LDCONST R3 K9 + 0x84100000, // 0010 CLOSURE R4 P0 + 0x5814000A, // 0011 LDCONST R5 K10 + 0x7C040800, // 0012 CALL R1 4 + 0x8C04010B, // 0013 GETMET R1 R0 K11 + 0x880C010C, // 0014 GETMBR R3 R0 K12 + 0x7C040400, // 0015 CALL R1 2 + 0x8C04010D, // 0016 GETMET R1 R0 K13 + 0x7C040200, // 0017 CALL R1 1 + 0x50040200, // 0018 LDBOOL R1 1 0 + 0x90020001, // 0019 SETMBR R0 K0 R1 + 0xA0000000, // 001A CLOSE R0 + 0x80000000, // 001B RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: mdns_remove_PASE +********************************************************************/ +be_local_closure(Matter_Device_mdns_remove_PASE, /* name */ + be_nested_proto( + 12, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[22]) { /* constants */ + /* K0 */ be_nested_str_weak(mdns), + /* K1 */ be_nested_str_weak(string), + /* K2 */ be_nested_str_weak(mdns_pase_eth), + /* K3 */ be_nested_str_weak(tasmota), + /* K4 */ be_nested_str_weak(log), + /* K5 */ be_nested_str_weak(format), + /* K6 */ be_nested_str_weak(MTR_X3A_X20calling_X20mdns_X2Eremove_service_X28_X25s_X2C_X20_X25s_X2C_X20_X25s_X2C_X20_X25s_X29), + /* K7 */ be_nested_str_weak(_matterc), + /* K8 */ be_nested_str_weak(_udp), + /* K9 */ be_nested_str_weak(commissioning_instance_eth), + /* K10 */ be_nested_str_weak(hostname_eth), + /* K11 */ be_const_int(3), + /* K12 */ be_nested_str_weak(MTR_X3A_X20remove_X20mDNS_X20on_X20_X25s_X20_X27_X25s_X27), + /* K13 */ be_nested_str_weak(eth), + /* K14 */ be_const_int(2), + /* K15 */ be_nested_str_weak(remove_service), + /* K16 */ be_nested_str_weak(mdns_pase_wifi), + /* K17 */ be_nested_str_weak(commissioning_instance_wifi), + /* K18 */ be_nested_str_weak(hostname_wifi), + /* K19 */ be_nested_str_weak(wifi), + /* K20 */ be_nested_str_weak(MTR_X3A_X20Exception), + /* K21 */ be_nested_str_weak(_X7C), + }), + be_str_weak(mdns_remove_PASE), + &be_const_str_solidified, + ( &(const binstruction[83]) { /* code */ + 0xA4060000, // 0000 IMPORT R1 K0 + 0xA40A0200, // 0001 IMPORT R2 K1 + 0xA802003D, // 0002 EXBLK 0 #0041 + 0x880C0102, // 0003 GETMBR R3 R0 K2 + 0x780E001B, // 0004 JMPF R3 #0021 + 0xB80E0600, // 0005 GETNGBL R3 K3 + 0x8C0C0704, // 0006 GETMET R3 R3 K4 + 0x8C140505, // 0007 GETMET R5 R2 K5 + 0x581C0006, // 0008 LDCONST R7 K6 + 0x58200007, // 0009 LDCONST R8 K7 + 0x58240008, // 000A LDCONST R9 K8 + 0x88280109, // 000B GETMBR R10 R0 K9 + 0x882C010A, // 000C GETMBR R11 R0 K10 + 0x7C140C00, // 000D CALL R5 6 + 0x5818000B, // 000E LDCONST R6 K11 + 0x7C0C0600, // 000F CALL R3 3 + 0xB80E0600, // 0010 GETNGBL R3 K3 + 0x8C0C0704, // 0011 GETMET R3 R3 K4 + 0x8C140505, // 0012 GETMET R5 R2 K5 + 0x581C000C, // 0013 LDCONST R7 K12 + 0x5820000D, // 0014 LDCONST R8 K13 + 0x88240109, // 0015 GETMBR R9 R0 K9 + 0x7C140800, // 0016 CALL R5 4 + 0x5818000E, // 0017 LDCONST R6 K14 + 0x7C0C0600, // 0018 CALL R3 3 + 0x500C0000, // 0019 LDBOOL R3 0 0 + 0x90020403, // 001A SETMBR R0 K2 R3 + 0x8C0C030F, // 001B GETMET R3 R1 K15 + 0x58140007, // 001C LDCONST R5 K7 + 0x58180008, // 001D LDCONST R6 K8 + 0x881C0109, // 001E GETMBR R7 R0 K9 + 0x8820010A, // 001F GETMBR R8 R0 K10 + 0x7C0C0A00, // 0020 CALL R3 5 + 0x880C0110, // 0021 GETMBR R3 R0 K16 + 0x780E001B, // 0022 JMPF R3 #003F + 0xB80E0600, // 0023 GETNGBL R3 K3 + 0x8C0C0704, // 0024 GETMET R3 R3 K4 + 0x8C140505, // 0025 GETMET R5 R2 K5 + 0x581C0006, // 0026 LDCONST R7 K6 + 0x58200007, // 0027 LDCONST R8 K7 + 0x58240008, // 0028 LDCONST R9 K8 + 0x88280111, // 0029 GETMBR R10 R0 K17 + 0x882C0112, // 002A GETMBR R11 R0 K18 + 0x7C140C00, // 002B CALL R5 6 + 0x5818000B, // 002C LDCONST R6 K11 + 0x7C0C0600, // 002D CALL R3 3 + 0xB80E0600, // 002E GETNGBL R3 K3 + 0x8C0C0704, // 002F GETMET R3 R3 K4 + 0x8C140505, // 0030 GETMET R5 R2 K5 + 0x581C000C, // 0031 LDCONST R7 K12 + 0x58200013, // 0032 LDCONST R8 K19 + 0x88240111, // 0033 GETMBR R9 R0 K17 + 0x7C140800, // 0034 CALL R5 4 + 0x5818000E, // 0035 LDCONST R6 K14 + 0x7C0C0600, // 0036 CALL R3 3 + 0x500C0000, // 0037 LDBOOL R3 0 0 + 0x90022003, // 0038 SETMBR R0 K16 R3 + 0x8C0C030F, // 0039 GETMET R3 R1 K15 + 0x58140007, // 003A LDCONST R5 K7 + 0x58180008, // 003B LDCONST R6 K8 + 0x881C0111, // 003C GETMBR R7 R0 K17 + 0x88200112, // 003D GETMBR R8 R0 K18 + 0x7C0C0A00, // 003E CALL R3 5 + 0xA8040001, // 003F EXBLK 1 1 + 0x70020010, // 0040 JMP #0052 + 0xAC0C0002, // 0041 CATCH R3 0 2 + 0x7002000D, // 0042 JMP #0051 + 0xB8160600, // 0043 GETNGBL R5 K3 + 0x8C140B04, // 0044 GETMET R5 R5 K4 + 0x601C0008, // 0045 GETGBL R7 G8 + 0x5C200600, // 0046 MOVE R8 R3 + 0x7C1C0200, // 0047 CALL R7 1 + 0x001E2807, // 0048 ADD R7 K20 R7 + 0x001C0F15, // 0049 ADD R7 R7 K21 + 0x60200008, // 004A GETGBL R8 G8 + 0x5C240800, // 004B MOVE R9 R4 + 0x7C200200, // 004C CALL R8 1 + 0x001C0E08, // 004D ADD R7 R7 R8 + 0x5820000E, // 004E LDCONST R8 K14 + 0x7C140600, // 004F CALL R5 3 + 0x70020000, // 0050 JMP #0052 + 0xB0080000, // 0051 RAISE 2 R0 R0 + 0x80000000, // 0052 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: start_commissioning_complete_deferred +********************************************************************/ +be_local_closure(Matter_Device_start_commissioning_complete_deferred, /* name */ + be_nested_proto( + 6, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 1, /* has sup protos */ + ( &(const struct bproto*[ 1]) { + be_nested_proto( + 3, /* nstack */ + 0, /* argc */ + 0, /* varg */ + 1, /* has upvals */ + ( &(const bupvaldesc[ 2]) { /* upvals */ + be_local_const_upval(1, 0), + be_local_const_upval(1, 1), + }), + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 1]) { /* constants */ + /* K0 */ be_nested_str_weak(start_commissioning_complete), + }), + be_str_weak(_X3Clambda_X3E), + &be_const_str_solidified, + ( &(const binstruction[ 5]) { /* code */ + 0x68000000, // 0000 GETUPV R0 U0 + 0x8C000100, // 0001 GETMET R0 R0 K0 + 0x68080001, // 0002 GETUPV R2 U1 + 0x7C000400, // 0003 CALL R0 2 + 0x80040000, // 0004 RET 1 R0 + }) + ), + }), + 1, /* has constants */ + ( &(const bvalue[ 3]) { /* constants */ + /* K0 */ be_nested_str_weak(tasmota), + /* K1 */ be_nested_str_weak(set_timer), + /* K2 */ be_const_int(0), + }), + be_str_weak(start_commissioning_complete_deferred), + &be_const_str_solidified, + ( &(const binstruction[ 7]) { /* code */ + 0xB80A0000, // 0000 GETNGBL R2 K0 + 0x8C080501, // 0001 GETMET R2 R2 K1 + 0x58100002, // 0002 LDCONST R4 K2 + 0x84140000, // 0003 CLOSURE R5 P0 + 0x7C080600, // 0004 CALL R2 3 + 0xA0000000, // 0005 CLOSE R0 + 0x80000000, // 0006 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: save_before_restart +********************************************************************/ +be_local_closure(Matter_Device_save_before_restart, /* name */ be_nested_proto( 3, /* nstack */ 1, /* argc */ @@ -69,16 +348,18 @@ be_local_closure(Matter_Device_is_commissioning_open, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[ 1]) { /* constants */ - /* K0 */ be_nested_str_weak(commissioning_open), + ( &(const bvalue[ 2]) { /* constants */ + /* K0 */ be_nested_str_weak(stop_basic_commissioning), + /* K1 */ be_nested_str_weak(mdns_remove_op_discovery_all_fabrics), }), - be_str_weak(is_commissioning_open), + be_str_weak(save_before_restart), &be_const_str_solidified, - ( &(const binstruction[ 4]) { /* code */ - 0x88040100, // 0000 GETMBR R1 R0 K0 - 0x4C080000, // 0001 LDNIL R2 - 0x20040202, // 0002 NE R1 R1 R2 - 0x80040200, // 0003 RET 1 R1 + ( &(const binstruction[ 5]) { /* code */ + 0x8C040100, // 0000 GETMET R1 R0 K0 + 0x7C040200, // 0001 CALL R1 1 + 0x8C040101, // 0002 GETMET R1 R0 K1 + 0x7C040200, // 0003 CALL R1 1 + 0x80000000, // 0004 RET 0 }) ) ); @@ -86,9 +367,1170 @@ be_local_closure(Matter_Device_is_commissioning_open, /* name */ /******************************************************************** -** Solidified function: received_ack +** Solidified function: _start_udp ********************************************************************/ -be_local_closure(Matter_Device_received_ack, /* name */ +be_local_closure(Matter_Device__start_udp, /* name */ + be_nested_proto( + 6, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 1, /* has sup protos */ + ( &(const struct bproto*[ 1]) { + be_nested_proto( + 8, /* nstack */ + 3, /* argc */ + 0, /* varg */ + 1, /* has upvals */ + ( &(const bupvaldesc[ 1]) { /* upvals */ + be_local_const_upval(1, 0), + }), + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 1]) { /* constants */ + /* K0 */ be_nested_str_weak(msg_received), + }), + be_str_weak(_X3Clambda_X3E), + &be_const_str_solidified, + ( &(const binstruction[ 7]) { /* code */ + 0x680C0000, // 0000 GETUPV R3 U0 + 0x8C0C0700, // 0001 GETMET R3 R3 K0 + 0x5C140000, // 0002 MOVE R5 R0 + 0x5C180200, // 0003 MOVE R6 R1 + 0x5C1C0400, // 0004 MOVE R7 R2 + 0x7C0C0800, // 0005 CALL R3 4 + 0x80040600, // 0006 RET 1 R3 + }) + ), + }), + 1, /* has constants */ + ( &(const bvalue[ 9]) { /* constants */ + /* K0 */ be_nested_str_weak(udp_server), + /* K1 */ be_nested_str_weak(tasmota), + /* K2 */ be_nested_str_weak(log), + /* K3 */ be_nested_str_weak(MTR_X3A_X20starting_X20UDP_X20server_X20on_X20port_X3A_X20), + /* K4 */ be_const_int(2), + /* K5 */ be_nested_str_weak(matter), + /* K6 */ be_nested_str_weak(UDPServer), + /* K7 */ be_nested_str_weak(), + /* K8 */ be_nested_str_weak(start), + }), + be_str_weak(_start_udp), + &be_const_str_solidified, + ( &(const binstruction[27]) { /* code */ + 0x88080100, // 0000 GETMBR R2 R0 K0 + 0x780A0000, // 0001 JMPF R2 #0003 + 0x80000400, // 0002 RET 0 + 0x4C080000, // 0003 LDNIL R2 + 0x1C080202, // 0004 EQ R2 R1 R2 + 0x780A0000, // 0005 JMPF R2 #0007 + 0x540615A3, // 0006 LDINT R1 5540 + 0xB80A0200, // 0007 GETNGBL R2 K1 + 0x8C080502, // 0008 GETMET R2 R2 K2 + 0x60100008, // 0009 GETGBL R4 G8 + 0x5C140200, // 000A MOVE R5 R1 + 0x7C100200, // 000B CALL R4 1 + 0x00120604, // 000C ADD R4 K3 R4 + 0x58140004, // 000D LDCONST R5 K4 + 0x7C080600, // 000E CALL R2 3 + 0xB80A0A00, // 000F GETNGBL R2 K5 + 0x8C080506, // 0010 GETMET R2 R2 K6 + 0x58100007, // 0011 LDCONST R4 K7 + 0x5C140200, // 0012 MOVE R5 R1 + 0x7C080600, // 0013 CALL R2 3 + 0x90020002, // 0014 SETMBR R0 K0 R2 + 0x88080100, // 0015 GETMBR R2 R0 K0 + 0x8C080508, // 0016 GETMET R2 R2 K8 + 0x84100000, // 0017 CLOSURE R4 P0 + 0x7C080400, // 0018 CALL R2 2 + 0xA0000000, // 0019 CLOSE R0 + 0x80000000, // 001A RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: register_commands +********************************************************************/ +be_local_closure(Matter_Device_register_commands, /* name */ + be_nested_proto( + 5, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 1, /* has sup protos */ + ( &(const struct bproto*[ 1]) { + be_nested_proto( + 10, /* nstack */ + 4, /* argc */ + 0, /* varg */ + 1, /* has upvals */ + ( &(const bupvaldesc[ 1]) { /* upvals */ + be_local_const_upval(1, 0), + }), + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 1]) { /* constants */ + /* K0 */ be_nested_str_weak(MtrJoin), + }), + be_str_weak(_X3Clambda_X3E), + &be_const_str_solidified, + ( &(const binstruction[ 8]) { /* code */ + 0x68100000, // 0000 GETUPV R4 U0 + 0x8C100900, // 0001 GETMET R4 R4 K0 + 0x5C180000, // 0002 MOVE R6 R0 + 0x5C1C0200, // 0003 MOVE R7 R1 + 0x5C200400, // 0004 MOVE R8 R2 + 0x5C240600, // 0005 MOVE R9 R3 + 0x7C100A00, // 0006 CALL R4 5 + 0x80040800, // 0007 RET 1 R4 + }) + ), + }), + 1, /* has constants */ + ( &(const bvalue[ 3]) { /* constants */ + /* K0 */ be_nested_str_weak(tasmota), + /* K1 */ be_nested_str_weak(add_cmd), + /* K2 */ be_nested_str_weak(MtrJoin), + }), + be_str_weak(register_commands), + &be_const_str_solidified, + ( &(const binstruction[ 7]) { /* code */ + 0xB8060000, // 0000 GETNGBL R1 K0 + 0x8C040301, // 0001 GETMET R1 R1 K1 + 0x580C0002, // 0002 LDCONST R3 K2 + 0x84100000, // 0003 CLOSURE R4 P0 + 0x7C040600, // 0004 CALL R1 3 + 0xA0000000, // 0005 CLOSE R0 + 0x80000000, // 0006 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: start_basic_commissioning +********************************************************************/ +be_local_closure(Matter_Device_start_basic_commissioning, /* name */ + be_nested_proto( + 13, /* nstack */ + 8, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 1, /* has sup protos */ + ( &(const struct bproto*[ 2]) { + be_nested_proto( + 4, /* nstack */ + 0, /* argc */ + 0, /* varg */ + 1, /* has upvals */ + ( &(const bupvaldesc[ 1]) { /* upvals */ + be_local_const_upval(1, 0), + }), + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 4]) { /* constants */ + /* K0 */ be_nested_str_weak(mdns_announce_PASE), + /* K1 */ be_nested_str_weak(tasmota), + /* K2 */ be_nested_str_weak(remove_rule), + /* K3 */ be_nested_str_weak(Wifi_X23Connected), + }), + be_str_weak(_anonymous_), + &be_const_str_solidified, + ( &(const binstruction[ 9]) { /* code */ + 0x68000000, // 0000 GETUPV R0 U0 + 0x8C000100, // 0001 GETMET R0 R0 K0 + 0x7C000200, // 0002 CALL R0 1 + 0xB8020200, // 0003 GETNGBL R0 K1 + 0x8C000102, // 0004 GETMET R0 R0 K2 + 0x58080003, // 0005 LDCONST R2 K3 + 0x580C0000, // 0006 LDCONST R3 K0 + 0x7C000600, // 0007 CALL R0 3 + 0x80000000, // 0008 RET 0 + }) + ), + be_nested_proto( + 4, /* nstack */ + 0, /* argc */ + 0, /* varg */ + 1, /* has upvals */ + ( &(const bupvaldesc[ 1]) { /* upvals */ + be_local_const_upval(1, 0), + }), + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 4]) { /* constants */ + /* K0 */ be_nested_str_weak(mdns_announce_PASE), + /* K1 */ be_nested_str_weak(tasmota), + /* K2 */ be_nested_str_weak(remove_rule), + /* K3 */ be_nested_str_weak(Eth_X23Connected), + }), + be_str_weak(_anonymous_), + &be_const_str_solidified, + ( &(const binstruction[ 9]) { /* code */ + 0x68000000, // 0000 GETUPV R0 U0 + 0x8C000100, // 0001 GETMET R0 R0 K0 + 0x7C000200, // 0002 CALL R0 1 + 0xB8020200, // 0003 GETNGBL R0 K1 + 0x8C000102, // 0004 GETMET R0 R0 K2 + 0x58080003, // 0005 LDCONST R2 K3 + 0x580C0000, // 0006 LDCONST R3 K0 + 0x7C000600, // 0007 CALL R0 3 + 0x80000000, // 0008 RET 0 + }) + ), + }), + 1, /* has constants */ + ( &(const bvalue[16]) { /* constants */ + /* K0 */ be_nested_str_weak(commissioning_open), + /* K1 */ be_nested_str_weak(tasmota), + /* K2 */ be_nested_str_weak(millis), + /* K3 */ be_nested_str_weak(commissioning_iterations), + /* K4 */ be_nested_str_weak(commissioning_discriminator), + /* K5 */ be_nested_str_weak(commissioning_salt), + /* K6 */ be_nested_str_weak(commissioning_w0), + /* K7 */ be_nested_str_weak(commissioning_L), + /* K8 */ be_nested_str_weak(commissioning_admin_fabric), + /* K9 */ be_nested_str_weak(wifi), + /* K10 */ be_nested_str_weak(up), + /* K11 */ be_nested_str_weak(eth), + /* K12 */ be_nested_str_weak(mdns_announce_PASE), + /* K13 */ be_nested_str_weak(add_rule), + /* K14 */ be_nested_str_weak(Wifi_X23Connected), + /* K15 */ be_nested_str_weak(Eth_X23Connected), + }), + be_str_weak(start_basic_commissioning), + &be_const_str_solidified, + ( &(const binstruction[40]) { /* code */ + 0xB8220200, // 0000 GETNGBL R8 K1 + 0x8C201102, // 0001 GETMET R8 R8 K2 + 0x7C200200, // 0002 CALL R8 1 + 0x542603E7, // 0003 LDINT R9 1000 + 0x08240209, // 0004 MUL R9 R1 R9 + 0x00201009, // 0005 ADD R8 R8 R9 + 0x90020008, // 0006 SETMBR R0 K0 R8 + 0x90020602, // 0007 SETMBR R0 K3 R2 + 0x90020803, // 0008 SETMBR R0 K4 R3 + 0x90020A04, // 0009 SETMBR R0 K5 R4 + 0x90020C05, // 000A SETMBR R0 K6 R5 + 0x90020E06, // 000B SETMBR R0 K7 R6 + 0x90021007, // 000C SETMBR R0 K8 R7 + 0xB8220200, // 000D GETNGBL R8 K1 + 0x8C201109, // 000E GETMET R8 R8 K9 + 0x7C200200, // 000F CALL R8 1 + 0x9420110A, // 0010 GETIDX R8 R8 K10 + 0x74220004, // 0011 JMPT R8 #0017 + 0xB8220200, // 0012 GETNGBL R8 K1 + 0x8C20110B, // 0013 GETMET R8 R8 K11 + 0x7C200200, // 0014 CALL R8 1 + 0x9420110A, // 0015 GETIDX R8 R8 K10 + 0x78220002, // 0016 JMPF R8 #001A + 0x8C20010C, // 0017 GETMET R8 R0 K12 + 0x7C200200, // 0018 CALL R8 1 + 0x7002000B, // 0019 JMP #0026 + 0xB8220200, // 001A GETNGBL R8 K1 + 0x8C20110D, // 001B GETMET R8 R8 K13 + 0x5828000E, // 001C LDCONST R10 K14 + 0x842C0000, // 001D CLOSURE R11 P0 + 0x5830000C, // 001E LDCONST R12 K12 + 0x7C200800, // 001F CALL R8 4 + 0xB8220200, // 0020 GETNGBL R8 K1 + 0x8C20110D, // 0021 GETMET R8 R8 K13 + 0x5828000F, // 0022 LDCONST R10 K15 + 0x842C0001, // 0023 CLOSURE R11 P1 + 0x5830000C, // 0024 LDCONST R12 K12 + 0x7C200800, // 0025 CALL R8 4 + 0xA0000000, // 0026 CLOSE R0 + 0x80000000, // 0027 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: remove_fabric +********************************************************************/ +be_local_closure(Matter_Device_remove_fabric, /* name */ + be_nested_proto( + 9, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[12]) { /* constants */ + /* K0 */ be_nested_str_weak(sessions), + /* K1 */ be_nested_str_weak(find_children_fabrics), + /* K2 */ be_nested_str_weak(get_fabric_index), + /* K3 */ be_nested_str_weak(find_fabric_by_index), + /* K4 */ be_nested_str_weak(message_handler), + /* K5 */ be_nested_str_weak(im), + /* K6 */ be_nested_str_weak(subs_shop), + /* K7 */ be_nested_str_weak(remove_by_fabric), + /* K8 */ be_nested_str_weak(mdns_remove_op_discovery), + /* K9 */ be_nested_str_weak(remove_fabric), + /* K10 */ be_nested_str_weak(stop_iteration), + /* K11 */ be_nested_str_weak(save_fabrics), + }), + be_str_weak(remove_fabric), + &be_const_str_solidified, + ( &(const binstruction[43]) { /* code */ + 0x88080100, // 0000 GETMBR R2 R0 K0 + 0x8C080501, // 0001 GETMET R2 R2 K1 + 0x8C100302, // 0002 GETMET R4 R1 K2 + 0x7C100200, // 0003 CALL R4 1 + 0x7C080400, // 0004 CALL R2 2 + 0x4C0C0000, // 0005 LDNIL R3 + 0x1C0C0403, // 0006 EQ R3 R2 R3 + 0x780E0000, // 0007 JMPF R3 #0009 + 0x80000600, // 0008 RET 0 + 0x600C0010, // 0009 GETGBL R3 G16 + 0x5C100400, // 000A MOVE R4 R2 + 0x7C0C0200, // 000B CALL R3 1 + 0xA8020016, // 000C EXBLK 0 #0024 + 0x5C100600, // 000D MOVE R4 R3 + 0x7C100000, // 000E CALL R4 0 + 0x88140100, // 000F GETMBR R5 R0 K0 + 0x8C140B03, // 0010 GETMET R5 R5 K3 + 0x5C1C0800, // 0011 MOVE R7 R4 + 0x7C140400, // 0012 CALL R5 2 + 0x4C180000, // 0013 LDNIL R6 + 0x20180A06, // 0014 NE R6 R5 R6 + 0x781A000C, // 0015 JMPF R6 #0023 + 0x88180104, // 0016 GETMBR R6 R0 K4 + 0x88180D05, // 0017 GETMBR R6 R6 K5 + 0x88180D06, // 0018 GETMBR R6 R6 K6 + 0x8C180D07, // 0019 GETMET R6 R6 K7 + 0x5C200A00, // 001A MOVE R8 R5 + 0x7C180400, // 001B CALL R6 2 + 0x8C180108, // 001C GETMET R6 R0 K8 + 0x5C200A00, // 001D MOVE R8 R5 + 0x7C180400, // 001E CALL R6 2 + 0x88180100, // 001F GETMBR R6 R0 K0 + 0x8C180D09, // 0020 GETMET R6 R6 K9 + 0x5C200A00, // 0021 MOVE R8 R5 + 0x7C180400, // 0022 CALL R6 2 + 0x7001FFE8, // 0023 JMP #000D + 0x580C000A, // 0024 LDCONST R3 K10 + 0xAC0C0200, // 0025 CATCH R3 1 0 + 0xB0080000, // 0026 RAISE 2 R0 R0 + 0x880C0100, // 0027 GETMBR R3 R0 K0 + 0x8C0C070B, // 0028 GETMET R3 R3 K11 + 0x7C0C0200, // 0029 CALL R3 1 + 0x80000000, // 002A RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: attribute_updated +********************************************************************/ +be_local_closure(Matter_Device_attribute_updated, /* name */ + be_nested_proto( + 10, /* nstack */ + 5, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 9]) { /* constants */ + /* K0 */ be_nested_str_weak(matter), + /* K1 */ be_nested_str_weak(Path), + /* K2 */ be_nested_str_weak(endpoint), + /* K3 */ be_nested_str_weak(cluster), + /* K4 */ be_nested_str_weak(attribute), + /* K5 */ be_nested_str_weak(message_handler), + /* K6 */ be_nested_str_weak(im), + /* K7 */ be_nested_str_weak(subs_shop), + /* K8 */ be_nested_str_weak(attribute_updated_ctx), + }), + be_str_weak(attribute_updated), + &be_const_str_solidified, + ( &(const binstruction[18]) { /* code */ + 0x4C140000, // 0000 LDNIL R5 + 0x1C140805, // 0001 EQ R5 R4 R5 + 0x78160000, // 0002 JMPF R5 #0004 + 0x50100000, // 0003 LDBOOL R4 0 0 + 0xB8160000, // 0004 GETNGBL R5 K0 + 0x8C140B01, // 0005 GETMET R5 R5 K1 + 0x7C140200, // 0006 CALL R5 1 + 0x90160401, // 0007 SETMBR R5 K2 R1 + 0x90160602, // 0008 SETMBR R5 K3 R2 + 0x90160803, // 0009 SETMBR R5 K4 R3 + 0x88180105, // 000A GETMBR R6 R0 K5 + 0x88180D06, // 000B GETMBR R6 R6 K6 + 0x88180D07, // 000C GETMBR R6 R6 K7 + 0x8C180D08, // 000D GETMET R6 R6 K8 + 0x5C200A00, // 000E MOVE R8 R5 + 0x5C240800, // 000F MOVE R9 R4 + 0x7C180600, // 0010 CALL R6 3 + 0x80000000, // 0011 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: _mdns_announce_hostname +********************************************************************/ +be_local_closure(Matter_Device__mdns_announce_hostname, /* name */ + be_nested_proto( + 16, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[28]) { /* constants */ + /* K0 */ be_nested_str_weak(mdns), + /* K1 */ be_nested_str_weak(string), + /* K2 */ be_nested_str_weak(start), + /* K3 */ be_nested_str_weak(tasmota), + /* K4 */ be_nested_str_weak(eth), + /* K5 */ be_nested_str_weak(hostname_eth), + /* K6 */ be_nested_str_weak(replace), + /* K7 */ be_nested_str_weak(find), + /* K8 */ be_nested_str_weak(mac), + /* K9 */ be_nested_str_weak(_X3A), + /* K10 */ be_nested_str_weak(), + /* K11 */ be_nested_str_weak(ipv4only), + /* K12 */ be_nested_str_weak(log), + /* K13 */ be_nested_str_weak(format), + /* K14 */ be_nested_str_weak(MTR_X3A_X20calling_X20mdns_X2Eadd_hostname_X28_X25s_X2C_X20_X25s_X2C_X20_X25s_X29), + /* K15 */ be_nested_str_weak(ip6local), + /* K16 */ be_nested_str_weak(ip), + /* K17 */ be_const_int(3), + /* K18 */ be_nested_str_weak(add_hostname), + /* K19 */ be_nested_str_weak(ip6), + /* K20 */ be_nested_str_weak(MTR_X3A_X20calling_X20mdns_X2Eadd_hostname_X28_X25s_X2C_X20_X25s_X29), + /* K21 */ be_nested_str_weak(wifi), + /* K22 */ be_nested_str_weak(hostname_wifi), + /* K23 */ be_nested_str_weak(MTR_X3A_X20start_X20mDNS_X20on_X20_X25s_X20host_X20_X27_X25s_X2Elocal_X27), + /* K24 */ be_const_int(2), + /* K25 */ be_nested_str_weak(MTR_X3A_X20Exception), + /* K26 */ be_nested_str_weak(_X7C), + /* K27 */ be_nested_str_weak(mdns_announce_op_discovery_all_fabrics), + }), + be_str_weak(_mdns_announce_hostname), + &be_const_str_solidified, + ( &(const binstruction[172]) { /* code */ + 0xA40A0000, // 0000 IMPORT R2 K0 + 0xA40E0200, // 0001 IMPORT R3 K1 + 0x8C100502, // 0002 GETMET R4 R2 K2 + 0x7C100200, // 0003 CALL R4 1 + 0xA8020092, // 0004 EXBLK 0 #0098 + 0x78060040, // 0005 JMPF R1 #0047 + 0xB8120600, // 0006 GETNGBL R4 K3 + 0x8C100904, // 0007 GETMET R4 R4 K4 + 0x7C100200, // 0008 CALL R4 1 + 0x8C140706, // 0009 GETMET R5 R3 K6 + 0x8C1C0907, // 000A GETMET R7 R4 K7 + 0x58240008, // 000B LDCONST R9 K8 + 0x7C1C0400, // 000C CALL R7 2 + 0x58200009, // 000D LDCONST R8 K9 + 0x5824000A, // 000E LDCONST R9 K10 + 0x7C140800, // 000F CALL R5 4 + 0x90020A05, // 0010 SETMBR R0 K5 R5 + 0x8814010B, // 0011 GETMBR R5 R0 K11 + 0x7416001F, // 0012 JMPT R5 #0033 + 0xB8160600, // 0013 GETNGBL R5 K3 + 0x8C140B0C, // 0014 GETMET R5 R5 K12 + 0x8C1C070D, // 0015 GETMET R7 R3 K13 + 0x5824000E, // 0016 LDCONST R9 K14 + 0x88280105, // 0017 GETMBR R10 R0 K5 + 0x8C2C0907, // 0018 GETMET R11 R4 K7 + 0x5834000F, // 0019 LDCONST R13 K15 + 0x5838000A, // 001A LDCONST R14 K10 + 0x7C2C0600, // 001B CALL R11 3 + 0x8C300907, // 001C GETMET R12 R4 K7 + 0x58380010, // 001D LDCONST R14 K16 + 0x583C000A, // 001E LDCONST R15 K10 + 0x7C300600, // 001F CALL R12 3 + 0x7C1C0A00, // 0020 CALL R7 5 + 0x58200011, // 0021 LDCONST R8 K17 + 0x7C140600, // 0022 CALL R5 3 + 0x8C140512, // 0023 GETMET R5 R2 K18 + 0x881C0105, // 0024 GETMBR R7 R0 K5 + 0x8C200907, // 0025 GETMET R8 R4 K7 + 0x5828000F, // 0026 LDCONST R10 K15 + 0x582C000A, // 0027 LDCONST R11 K10 + 0x7C200600, // 0028 CALL R8 3 + 0x8C240907, // 0029 GETMET R9 R4 K7 + 0x582C0010, // 002A LDCONST R11 K16 + 0x5830000A, // 002B LDCONST R12 K10 + 0x7C240600, // 002C CALL R9 3 + 0x8C280907, // 002D GETMET R10 R4 K7 + 0x58300013, // 002E LDCONST R12 K19 + 0x5834000A, // 002F LDCONST R13 K10 + 0x7C280600, // 0030 CALL R10 3 + 0x7C140A00, // 0031 CALL R5 5 + 0x70020012, // 0032 JMP #0046 + 0xB8160600, // 0033 GETNGBL R5 K3 + 0x8C140B0C, // 0034 GETMET R5 R5 K12 + 0x8C1C070D, // 0035 GETMET R7 R3 K13 + 0x58240014, // 0036 LDCONST R9 K20 + 0x88280105, // 0037 GETMBR R10 R0 K5 + 0x8C2C0907, // 0038 GETMET R11 R4 K7 + 0x58340010, // 0039 LDCONST R13 K16 + 0x5838000A, // 003A LDCONST R14 K10 + 0x7C2C0600, // 003B CALL R11 3 + 0x7C1C0800, // 003C CALL R7 4 + 0x58200011, // 003D LDCONST R8 K17 + 0x7C140600, // 003E CALL R5 3 + 0x8C140512, // 003F GETMET R5 R2 K18 + 0x881C0105, // 0040 GETMBR R7 R0 K5 + 0x8C200907, // 0041 GETMET R8 R4 K7 + 0x58280010, // 0042 LDCONST R10 K16 + 0x582C000A, // 0043 LDCONST R11 K10 + 0x7C200600, // 0044 CALL R8 3 + 0x7C140600, // 0045 CALL R5 3 + 0x7002003F, // 0046 JMP #0087 + 0xB8120600, // 0047 GETNGBL R4 K3 + 0x8C100915, // 0048 GETMET R4 R4 K21 + 0x7C100200, // 0049 CALL R4 1 + 0x8C140706, // 004A GETMET R5 R3 K6 + 0x8C1C0907, // 004B GETMET R7 R4 K7 + 0x58240008, // 004C LDCONST R9 K8 + 0x7C1C0400, // 004D CALL R7 2 + 0x58200009, // 004E LDCONST R8 K9 + 0x5824000A, // 004F LDCONST R9 K10 + 0x7C140800, // 0050 CALL R5 4 + 0x90022C05, // 0051 SETMBR R0 K22 R5 + 0x8814010B, // 0052 GETMBR R5 R0 K11 + 0x7416001F, // 0053 JMPT R5 #0074 + 0xB8160600, // 0054 GETNGBL R5 K3 + 0x8C140B0C, // 0055 GETMET R5 R5 K12 + 0x8C1C070D, // 0056 GETMET R7 R3 K13 + 0x5824000E, // 0057 LDCONST R9 K14 + 0x88280116, // 0058 GETMBR R10 R0 K22 + 0x8C2C0907, // 0059 GETMET R11 R4 K7 + 0x5834000F, // 005A LDCONST R13 K15 + 0x5838000A, // 005B LDCONST R14 K10 + 0x7C2C0600, // 005C CALL R11 3 + 0x8C300907, // 005D GETMET R12 R4 K7 + 0x58380010, // 005E LDCONST R14 K16 + 0x583C000A, // 005F LDCONST R15 K10 + 0x7C300600, // 0060 CALL R12 3 + 0x7C1C0A00, // 0061 CALL R7 5 + 0x58200011, // 0062 LDCONST R8 K17 + 0x7C140600, // 0063 CALL R5 3 + 0x8C140512, // 0064 GETMET R5 R2 K18 + 0x881C0116, // 0065 GETMBR R7 R0 K22 + 0x8C200907, // 0066 GETMET R8 R4 K7 + 0x5828000F, // 0067 LDCONST R10 K15 + 0x582C000A, // 0068 LDCONST R11 K10 + 0x7C200600, // 0069 CALL R8 3 + 0x8C240907, // 006A GETMET R9 R4 K7 + 0x582C0010, // 006B LDCONST R11 K16 + 0x5830000A, // 006C LDCONST R12 K10 + 0x7C240600, // 006D CALL R9 3 + 0x8C280907, // 006E GETMET R10 R4 K7 + 0x58300013, // 006F LDCONST R12 K19 + 0x5834000A, // 0070 LDCONST R13 K10 + 0x7C280600, // 0071 CALL R10 3 + 0x7C140A00, // 0072 CALL R5 5 + 0x70020012, // 0073 JMP #0087 + 0xB8160600, // 0074 GETNGBL R5 K3 + 0x8C140B0C, // 0075 GETMET R5 R5 K12 + 0x8C1C070D, // 0076 GETMET R7 R3 K13 + 0x58240014, // 0077 LDCONST R9 K20 + 0x88280105, // 0078 GETMBR R10 R0 K5 + 0x8C2C0907, // 0079 GETMET R11 R4 K7 + 0x58340010, // 007A LDCONST R13 K16 + 0x5838000A, // 007B LDCONST R14 K10 + 0x7C2C0600, // 007C CALL R11 3 + 0x7C1C0800, // 007D CALL R7 4 + 0x58200011, // 007E LDCONST R8 K17 + 0x7C140600, // 007F CALL R5 3 + 0x8C140512, // 0080 GETMET R5 R2 K18 + 0x881C0116, // 0081 GETMBR R7 R0 K22 + 0x8C200907, // 0082 GETMET R8 R4 K7 + 0x58280010, // 0083 LDCONST R10 K16 + 0x582C000A, // 0084 LDCONST R11 K10 + 0x7C200600, // 0085 CALL R8 3 + 0x7C140600, // 0086 CALL R5 3 + 0xB8120600, // 0087 GETNGBL R4 K3 + 0x8C10090C, // 0088 GETMET R4 R4 K12 + 0x8C18070D, // 0089 GETMET R6 R3 K13 + 0x58200017, // 008A LDCONST R8 K23 + 0x78060001, // 008B JMPF R1 #008E + 0x58240004, // 008C LDCONST R9 K4 + 0x70020000, // 008D JMP #008F + 0x58240015, // 008E LDCONST R9 K21 + 0x78060001, // 008F JMPF R1 #0092 + 0x88280105, // 0090 GETMBR R10 R0 K5 + 0x70020000, // 0091 JMP #0093 + 0x88280116, // 0092 GETMBR R10 R0 K22 + 0x7C180800, // 0093 CALL R6 4 + 0x581C0018, // 0094 LDCONST R7 K24 + 0x7C100600, // 0095 CALL R4 3 + 0xA8040001, // 0096 EXBLK 1 1 + 0x70020010, // 0097 JMP #00A9 + 0xAC100002, // 0098 CATCH R4 0 2 + 0x7002000D, // 0099 JMP #00A8 + 0xB81A0600, // 009A GETNGBL R6 K3 + 0x8C180D0C, // 009B GETMET R6 R6 K12 + 0x60200008, // 009C GETGBL R8 G8 + 0x5C240800, // 009D MOVE R9 R4 + 0x7C200200, // 009E CALL R8 1 + 0x00223208, // 009F ADD R8 K25 R8 + 0x0020111A, // 00A0 ADD R8 R8 K26 + 0x60240008, // 00A1 GETGBL R9 G8 + 0x5C280A00, // 00A2 MOVE R10 R5 + 0x7C240200, // 00A3 CALL R9 1 + 0x00201009, // 00A4 ADD R8 R8 R9 + 0x58240018, // 00A5 LDCONST R9 K24 + 0x7C180600, // 00A6 CALL R6 3 + 0x70020000, // 00A7 JMP #00A9 + 0xB0080000, // 00A8 RAISE 2 R0 R0 + 0x8C10011B, // 00A9 GETMET R4 R0 K27 + 0x7C100200, // 00AA CALL R4 1 + 0x80000000, // 00AB RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: autoconf_device +********************************************************************/ +be_local_closure(Matter_Device_autoconf_device, /* name */ + be_nested_proto( + 21, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[49]) { /* constants */ + /* K0 */ be_nested_str_weak(string), + /* K1 */ be_nested_str_weak(json), + /* K2 */ be_const_int(1), + /* K3 */ be_nested_str_weak(light), + /* K4 */ be_nested_str_weak(get), + /* K5 */ be_nested_str_weak(find), + /* K6 */ be_nested_str_weak(channels), + /* K7 */ be_nested_str_weak(), + /* K8 */ be_const_int(0), + /* K9 */ be_nested_str_weak(plugins), + /* K10 */ be_nested_str_weak(push), + /* K11 */ be_nested_str_weak(matter), + /* K12 */ be_nested_str_weak(Plugin_Light1), + /* K13 */ be_nested_str_weak(tasmota), + /* K14 */ be_nested_str_weak(log), + /* K15 */ be_nested_str_weak(format), + /* K16 */ be_nested_str_weak(MTR_X3A_X20Endpoint_X3A_X25i_X20Light_Dimmer), + /* K17 */ be_const_int(2), + /* K18 */ be_nested_str_weak(Plugin_Light2), + /* K19 */ be_nested_str_weak(MTR_X3A_X20Endpoint_X3A_X25i_X20Light_CT), + /* K20 */ be_nested_str_weak(Plugin_Light3), + /* K21 */ be_nested_str_weak(MTR_X3A_X20Endpoint_X3A_X25i_X20Light_RGB), + /* K22 */ be_nested_str_weak(get_power), + /* K23 */ be_nested_str_weak(Plugin_OnOff), + /* K24 */ be_nested_str_weak(MTR_X3A_X20Endpoint_X3A_X25i_X20Relay__X25i), + /* K25 */ be_nested_str_weak(load), + /* K26 */ be_nested_str_weak(read_sensors), + /* K27 */ be_nested_str_weak(k2l), + /* K28 */ be_nested_str_weak(contains), + /* K29 */ be_nested_str_weak(Temperature), + /* K30 */ be_nested_str_weak(_X23Temperature), + /* K31 */ be_nested_str_weak(Plugin_Sensor_Temp), + /* K32 */ be_nested_str_weak(MTR_X3A_X20Endpoint_X3A_X25i_X20Temperature_X20_X28_X25s_X29), + /* K33 */ be_nested_str_weak(stop_iteration), + /* K34 */ be_nested_str_weak(Pressure), + /* K35 */ be_nested_str_weak(_X23Pressure), + /* K36 */ be_nested_str_weak(Plugin_Sensor_Pressure), + /* K37 */ be_nested_str_weak(MTR_X3A_X20Endpoint_X3A_X25i_X20Pressure_X20_X28_X25s_X29), + /* K38 */ be_nested_str_weak(Illuminance), + /* K39 */ be_nested_str_weak(_X23Illuminance), + /* K40 */ be_nested_str_weak(Plugin_Sensor_Light), + /* K41 */ be_nested_str_weak(MTR_X3A_X20Endpoint_X3A_X25i_X20Light_X20_X28_X25s_X29), + /* K42 */ be_nested_str_weak(Humidity), + /* K43 */ be_nested_str_weak(_X23Humidity), + /* K44 */ be_nested_str_weak(Plugin_Sensor_Humidity), + /* K45 */ be_nested_str_weak(MTR_X3A_X20Endpoint_X3A_X25i_X20Humidity_X20_X28_X25s_X29), + /* K46 */ be_nested_str_weak(publish_result), + /* K47 */ be_nested_str_weak(_X7B_X22Matter_X22_X3A_X7B_X22Initialized_X22_X3A1_X7D_X7D), + /* K48 */ be_nested_str_weak(Matter), + }), + be_str_weak(autoconf_device), + &be_const_str_solidified, + ( &(const binstruction[312]) { /* code */ + 0xA4060000, // 0000 IMPORT R1 K0 + 0xA40A0200, // 0001 IMPORT R2 K1 + 0x580C0002, // 0002 LDCONST R3 K2 + 0x50100000, // 0003 LDBOOL R4 0 0 + 0xA4160600, // 0004 IMPORT R5 K3 + 0x8C180B04, // 0005 GETMET R6 R5 K4 + 0x7C180200, // 0006 CALL R6 1 + 0x4C1C0000, // 0007 LDNIL R7 + 0x201C0C07, // 0008 NE R7 R6 R7 + 0x781E003F, // 0009 JMPF R7 #004A + 0x601C000C, // 000A GETGBL R7 G12 + 0x8C200D05, // 000B GETMET R8 R6 K5 + 0x58280006, // 000C LDCONST R10 K6 + 0x582C0007, // 000D LDCONST R11 K7 + 0x7C200600, // 000E CALL R8 3 + 0x7C1C0200, // 000F CALL R7 1 + 0x24200F08, // 0010 GT R8 R7 K8 + 0x78220037, // 0011 JMPF R8 #004A + 0x1C200F02, // 0012 EQ R8 R7 K2 + 0x78220010, // 0013 JMPF R8 #0025 + 0x88200109, // 0014 GETMBR R8 R0 K9 + 0x8C20110A, // 0015 GETMET R8 R8 K10 + 0xB82A1600, // 0016 GETNGBL R10 K11 + 0x8C28150C, // 0017 GETMET R10 R10 K12 + 0x5C300000, // 0018 MOVE R12 R0 + 0x5C340600, // 0019 MOVE R13 R3 + 0x7C280600, // 001A CALL R10 3 + 0x7C200400, // 001B CALL R8 2 + 0xB8221A00, // 001C GETNGBL R8 K13 + 0x8C20110E, // 001D GETMET R8 R8 K14 + 0x8C28030F, // 001E GETMET R10 R1 K15 + 0x58300010, // 001F LDCONST R12 K16 + 0x5C340600, // 0020 MOVE R13 R3 + 0x7C280600, // 0021 CALL R10 3 + 0x582C0011, // 0022 LDCONST R11 K17 + 0x7C200600, // 0023 CALL R8 3 + 0x70020022, // 0024 JMP #0048 + 0x1C200F11, // 0025 EQ R8 R7 K17 + 0x78220010, // 0026 JMPF R8 #0038 + 0x88200109, // 0027 GETMBR R8 R0 K9 + 0x8C20110A, // 0028 GETMET R8 R8 K10 + 0xB82A1600, // 0029 GETNGBL R10 K11 + 0x8C281512, // 002A GETMET R10 R10 K18 + 0x5C300000, // 002B MOVE R12 R0 + 0x5C340600, // 002C MOVE R13 R3 + 0x7C280600, // 002D CALL R10 3 + 0x7C200400, // 002E CALL R8 2 + 0xB8221A00, // 002F GETNGBL R8 K13 + 0x8C20110E, // 0030 GETMET R8 R8 K14 + 0x8C28030F, // 0031 GETMET R10 R1 K15 + 0x58300013, // 0032 LDCONST R12 K19 + 0x5C340600, // 0033 MOVE R13 R3 + 0x7C280600, // 0034 CALL R10 3 + 0x582C0011, // 0035 LDCONST R11 K17 + 0x7C200600, // 0036 CALL R8 3 + 0x7002000F, // 0037 JMP #0048 + 0x88200109, // 0038 GETMBR R8 R0 K9 + 0x8C20110A, // 0039 GETMET R8 R8 K10 + 0xB82A1600, // 003A GETNGBL R10 K11 + 0x8C281514, // 003B GETMET R10 R10 K20 + 0x5C300000, // 003C MOVE R12 R0 + 0x5C340600, // 003D MOVE R13 R3 + 0x7C280600, // 003E CALL R10 3 + 0x7C200400, // 003F CALL R8 2 + 0xB8221A00, // 0040 GETNGBL R8 K13 + 0x8C20110E, // 0041 GETMET R8 R8 K14 + 0x8C28030F, // 0042 GETMET R10 R1 K15 + 0x58300015, // 0043 LDCONST R12 K21 + 0x5C340600, // 0044 MOVE R13 R3 + 0x7C280600, // 0045 CALL R10 3 + 0x582C0011, // 0046 LDCONST R11 K17 + 0x7C200600, // 0047 CALL R8 3 + 0x50100200, // 0048 LDBOOL R4 1 0 + 0x000C0702, // 0049 ADD R3 R3 K2 + 0x601C000C, // 004A GETGBL R7 G12 + 0xB8221A00, // 004B GETNGBL R8 K13 + 0x8C201116, // 004C GETMET R8 R8 K22 + 0x7C200200, // 004D CALL R8 1 + 0x7C1C0200, // 004E CALL R7 1 + 0x58200008, // 004F LDCONST R8 K8 + 0x78120000, // 0050 JMPF R4 #0052 + 0x041C0F02, // 0051 SUB R7 R7 K2 + 0x14241007, // 0052 LT R9 R8 R7 + 0x78260014, // 0053 JMPF R9 #0069 + 0x88240109, // 0054 GETMBR R9 R0 K9 + 0x8C24130A, // 0055 GETMET R9 R9 K10 + 0xB82E1600, // 0056 GETNGBL R11 K11 + 0x8C2C1717, // 0057 GETMET R11 R11 K23 + 0x5C340000, // 0058 MOVE R13 R0 + 0x5C380600, // 0059 MOVE R14 R3 + 0x5C3C1000, // 005A MOVE R15 R8 + 0x7C2C0800, // 005B CALL R11 4 + 0x7C240400, // 005C CALL R9 2 + 0xB8261A00, // 005D GETNGBL R9 K13 + 0x8C24130E, // 005E GETMET R9 R9 K14 + 0x8C2C030F, // 005F GETMET R11 R1 K15 + 0x58340018, // 0060 LDCONST R13 K24 + 0x5C380600, // 0061 MOVE R14 R3 + 0x003C1102, // 0062 ADD R15 R8 K2 + 0x7C2C0800, // 0063 CALL R11 4 + 0x58300011, // 0064 LDCONST R12 K17 + 0x7C240600, // 0065 CALL R9 3 + 0x00201102, // 0066 ADD R8 R8 K2 + 0x000C0702, // 0067 ADD R3 R3 K2 + 0x7001FFE8, // 0068 JMP #0052 + 0x8C240519, // 0069 GETMET R9 R2 K25 + 0xB82E1A00, // 006A GETNGBL R11 K13 + 0x8C2C171A, // 006B GETMET R11 R11 K26 + 0x7C2C0200, // 006C CALL R11 1 + 0x7C240400, // 006D CALL R9 2 + 0x540E001F, // 006E LDINT R3 32 + 0x60280010, // 006F GETGBL R10 G16 + 0x8C2C011B, // 0070 GETMET R11 R0 K27 + 0x5C341200, // 0071 MOVE R13 R9 + 0x7C2C0400, // 0072 CALL R11 2 + 0x7C280200, // 0073 CALL R10 1 + 0xA8020026, // 0074 EXBLK 0 #009C + 0x5C2C1400, // 0075 MOVE R11 R10 + 0x7C2C0000, // 0076 CALL R11 0 + 0x9430120B, // 0077 GETIDX R12 R9 R11 + 0x6034000F, // 0078 GETGBL R13 G15 + 0x5C381800, // 0079 MOVE R14 R12 + 0x603C0013, // 007A GETGBL R15 G19 + 0x7C340400, // 007B CALL R13 2 + 0x78360017, // 007C JMPF R13 #0095 + 0x8C34191C, // 007D GETMET R13 R12 K28 + 0x583C001D, // 007E LDCONST R15 K29 + 0x7C340400, // 007F CALL R13 2 + 0x78360013, // 0080 JMPF R13 #0095 + 0x0034171E, // 0081 ADD R13 R11 K30 + 0x88380109, // 0082 GETMBR R14 R0 K9 + 0x8C381D0A, // 0083 GETMET R14 R14 K10 + 0xB8421600, // 0084 GETNGBL R16 K11 + 0x8C40211F, // 0085 GETMET R16 R16 K31 + 0x5C480000, // 0086 MOVE R18 R0 + 0x5C4C0600, // 0087 MOVE R19 R3 + 0x5C501A00, // 0088 MOVE R20 R13 + 0x7C400800, // 0089 CALL R16 4 + 0x7C380400, // 008A CALL R14 2 + 0xB83A1A00, // 008B GETNGBL R14 K13 + 0x8C381D0E, // 008C GETMET R14 R14 K14 + 0x8C40030F, // 008D GETMET R16 R1 K15 + 0x58480020, // 008E LDCONST R18 K32 + 0x5C4C0600, // 008F MOVE R19 R3 + 0x5C501A00, // 0090 MOVE R20 R13 + 0x7C400800, // 0091 CALL R16 4 + 0x58440011, // 0092 LDCONST R17 K17 + 0x7C380600, // 0093 CALL R14 3 + 0x000C0702, // 0094 ADD R3 R3 K2 + 0x54360027, // 0095 LDINT R13 40 + 0x2434060D, // 0096 GT R13 R3 R13 + 0x78360000, // 0097 JMPF R13 #0099 + 0x70020000, // 0098 JMP #009A + 0x7001FFDA, // 0099 JMP #0075 + 0xA8040001, // 009A EXBLK 1 1 + 0x70020002, // 009B JMP #009F + 0x58280021, // 009C LDCONST R10 K33 + 0xAC280200, // 009D CATCH R10 1 0 + 0xB0080000, // 009E RAISE 2 R0 R0 + 0x540E0027, // 009F LDINT R3 40 + 0x60280010, // 00A0 GETGBL R10 G16 + 0x8C2C011B, // 00A1 GETMET R11 R0 K27 + 0x5C341200, // 00A2 MOVE R13 R9 + 0x7C2C0400, // 00A3 CALL R11 2 + 0x7C280200, // 00A4 CALL R10 1 + 0xA8020026, // 00A5 EXBLK 0 #00CD + 0x5C2C1400, // 00A6 MOVE R11 R10 + 0x7C2C0000, // 00A7 CALL R11 0 + 0x9430120B, // 00A8 GETIDX R12 R9 R11 + 0x6034000F, // 00A9 GETGBL R13 G15 + 0x5C381800, // 00AA MOVE R14 R12 + 0x603C0013, // 00AB GETGBL R15 G19 + 0x7C340400, // 00AC CALL R13 2 + 0x78360017, // 00AD JMPF R13 #00C6 + 0x8C34191C, // 00AE GETMET R13 R12 K28 + 0x583C0022, // 00AF LDCONST R15 K34 + 0x7C340400, // 00B0 CALL R13 2 + 0x78360013, // 00B1 JMPF R13 #00C6 + 0x00341723, // 00B2 ADD R13 R11 K35 + 0x88380109, // 00B3 GETMBR R14 R0 K9 + 0x8C381D0A, // 00B4 GETMET R14 R14 K10 + 0xB8421600, // 00B5 GETNGBL R16 K11 + 0x8C402124, // 00B6 GETMET R16 R16 K36 + 0x5C480000, // 00B7 MOVE R18 R0 + 0x5C4C0600, // 00B8 MOVE R19 R3 + 0x5C501A00, // 00B9 MOVE R20 R13 + 0x7C400800, // 00BA CALL R16 4 + 0x7C380400, // 00BB CALL R14 2 + 0xB83A1A00, // 00BC GETNGBL R14 K13 + 0x8C381D0E, // 00BD GETMET R14 R14 K14 + 0x8C40030F, // 00BE GETMET R16 R1 K15 + 0x58480025, // 00BF LDCONST R18 K37 + 0x5C4C0600, // 00C0 MOVE R19 R3 + 0x5C501A00, // 00C1 MOVE R20 R13 + 0x7C400800, // 00C2 CALL R16 4 + 0x58440011, // 00C3 LDCONST R17 K17 + 0x7C380600, // 00C4 CALL R14 3 + 0x000C0702, // 00C5 ADD R3 R3 K2 + 0x5436002E, // 00C6 LDINT R13 47 + 0x2434060D, // 00C7 GT R13 R3 R13 + 0x78360000, // 00C8 JMPF R13 #00CA + 0x70020000, // 00C9 JMP #00CB + 0x7001FFDA, // 00CA JMP #00A6 + 0xA8040001, // 00CB EXBLK 1 1 + 0x70020002, // 00CC JMP #00D0 + 0x58280021, // 00CD LDCONST R10 K33 + 0xAC280200, // 00CE CATCH R10 1 0 + 0xB0080000, // 00CF RAISE 2 R0 R0 + 0x540E002F, // 00D0 LDINT R3 48 + 0x60280010, // 00D1 GETGBL R10 G16 + 0x8C2C011B, // 00D2 GETMET R11 R0 K27 + 0x5C341200, // 00D3 MOVE R13 R9 + 0x7C2C0400, // 00D4 CALL R11 2 + 0x7C280200, // 00D5 CALL R10 1 + 0xA8020026, // 00D6 EXBLK 0 #00FE + 0x5C2C1400, // 00D7 MOVE R11 R10 + 0x7C2C0000, // 00D8 CALL R11 0 + 0x9430120B, // 00D9 GETIDX R12 R9 R11 + 0x6034000F, // 00DA GETGBL R13 G15 + 0x5C381800, // 00DB MOVE R14 R12 + 0x603C0013, // 00DC GETGBL R15 G19 + 0x7C340400, // 00DD CALL R13 2 + 0x78360017, // 00DE JMPF R13 #00F7 + 0x8C34191C, // 00DF GETMET R13 R12 K28 + 0x583C0026, // 00E0 LDCONST R15 K38 + 0x7C340400, // 00E1 CALL R13 2 + 0x78360013, // 00E2 JMPF R13 #00F7 + 0x00341727, // 00E3 ADD R13 R11 K39 + 0x88380109, // 00E4 GETMBR R14 R0 K9 + 0x8C381D0A, // 00E5 GETMET R14 R14 K10 + 0xB8421600, // 00E6 GETNGBL R16 K11 + 0x8C402128, // 00E7 GETMET R16 R16 K40 + 0x5C480000, // 00E8 MOVE R18 R0 + 0x5C4C0600, // 00E9 MOVE R19 R3 + 0x5C501A00, // 00EA MOVE R20 R13 + 0x7C400800, // 00EB CALL R16 4 + 0x7C380400, // 00EC CALL R14 2 + 0xB83A1A00, // 00ED GETNGBL R14 K13 + 0x8C381D0E, // 00EE GETMET R14 R14 K14 + 0x8C40030F, // 00EF GETMET R16 R1 K15 + 0x58480029, // 00F0 LDCONST R18 K41 + 0x5C4C0600, // 00F1 MOVE R19 R3 + 0x5C501A00, // 00F2 MOVE R20 R13 + 0x7C400800, // 00F3 CALL R16 4 + 0x58440011, // 00F4 LDCONST R17 K17 + 0x7C380600, // 00F5 CALL R14 3 + 0x000C0702, // 00F6 ADD R3 R3 K2 + 0x54360037, // 00F7 LDINT R13 56 + 0x2434060D, // 00F8 GT R13 R3 R13 + 0x78360000, // 00F9 JMPF R13 #00FB + 0x70020000, // 00FA JMP #00FC + 0x7001FFDA, // 00FB JMP #00D7 + 0xA8040001, // 00FC EXBLK 1 1 + 0x70020002, // 00FD JMP #0101 + 0x58280021, // 00FE LDCONST R10 K33 + 0xAC280200, // 00FF CATCH R10 1 0 + 0xB0080000, // 0100 RAISE 2 R0 R0 + 0x540E0037, // 0101 LDINT R3 56 + 0x60280010, // 0102 GETGBL R10 G16 + 0x8C2C011B, // 0103 GETMET R11 R0 K27 + 0x5C341200, // 0104 MOVE R13 R9 + 0x7C2C0400, // 0105 CALL R11 2 + 0x7C280200, // 0106 CALL R10 1 + 0xA8020026, // 0107 EXBLK 0 #012F + 0x5C2C1400, // 0108 MOVE R11 R10 + 0x7C2C0000, // 0109 CALL R11 0 + 0x9430120B, // 010A GETIDX R12 R9 R11 + 0x6034000F, // 010B GETGBL R13 G15 + 0x5C381800, // 010C MOVE R14 R12 + 0x603C0013, // 010D GETGBL R15 G19 + 0x7C340400, // 010E CALL R13 2 + 0x78360017, // 010F JMPF R13 #0128 + 0x8C34191C, // 0110 GETMET R13 R12 K28 + 0x583C002A, // 0111 LDCONST R15 K42 + 0x7C340400, // 0112 CALL R13 2 + 0x78360013, // 0113 JMPF R13 #0128 + 0x0034172B, // 0114 ADD R13 R11 K43 + 0x88380109, // 0115 GETMBR R14 R0 K9 + 0x8C381D0A, // 0116 GETMET R14 R14 K10 + 0xB8421600, // 0117 GETNGBL R16 K11 + 0x8C40212C, // 0118 GETMET R16 R16 K44 + 0x5C480000, // 0119 MOVE R18 R0 + 0x5C4C0600, // 011A MOVE R19 R3 + 0x5C501A00, // 011B MOVE R20 R13 + 0x7C400800, // 011C CALL R16 4 + 0x7C380400, // 011D CALL R14 2 + 0xB83A1A00, // 011E GETNGBL R14 K13 + 0x8C381D0E, // 011F GETMET R14 R14 K14 + 0x8C40030F, // 0120 GETMET R16 R1 K15 + 0x5848002D, // 0121 LDCONST R18 K45 + 0x5C4C0600, // 0122 MOVE R19 R3 + 0x5C501A00, // 0123 MOVE R20 R13 + 0x7C400800, // 0124 CALL R16 4 + 0x58440011, // 0125 LDCONST R17 K17 + 0x7C380600, // 0126 CALL R14 3 + 0x000C0702, // 0127 ADD R3 R3 K2 + 0x5436003F, // 0128 LDINT R13 64 + 0x2434060D, // 0129 GT R13 R3 R13 + 0x78360000, // 012A JMPF R13 #012C + 0x70020000, // 012B JMP #012D + 0x7001FFDA, // 012C JMP #0108 + 0xA8040001, // 012D EXBLK 1 1 + 0x70020002, // 012E JMP #0132 + 0x58280021, // 012F LDCONST R10 K33 + 0xAC280200, // 0130 CATCH R10 1 0 + 0xB0080000, // 0131 RAISE 2 R0 R0 + 0xB82A1A00, // 0132 GETNGBL R10 K13 + 0x8C28152E, // 0133 GETMET R10 R10 K46 + 0x5830002F, // 0134 LDCONST R12 K47 + 0x58340030, // 0135 LDCONST R13 K48 + 0x7C280600, // 0136 CALL R10 3 + 0x80000000, // 0137 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: _trigger_read_sensors +********************************************************************/ +be_local_closure(Matter_Device__trigger_read_sensors, /* name */ + be_nested_proto( + 8, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[11]) { /* constants */ + /* K0 */ be_nested_str_weak(json), + /* K1 */ be_nested_str_weak(tasmota), + /* K2 */ be_nested_str_weak(read_sensors), + /* K3 */ be_nested_str_weak(load), + /* K4 */ be_const_int(0), + /* K5 */ be_nested_str_weak(plugins), + /* K6 */ be_nested_str_weak(parse_sensors), + /* K7 */ be_const_int(1), + /* K8 */ be_nested_str_weak(log), + /* K9 */ be_nested_str_weak(MTR_X3A_X20unable_X20to_X20parse_X20read_sensors_X3A_X20), + /* K10 */ be_const_int(3), + }), + be_str_weak(_trigger_read_sensors), + &be_const_str_solidified, + ( &(const binstruction[37]) { /* code */ + 0xA4060000, // 0000 IMPORT R1 K0 + 0xB80A0200, // 0001 GETNGBL R2 K1 + 0x8C080502, // 0002 GETMET R2 R2 K2 + 0x7C080200, // 0003 CALL R2 1 + 0x4C0C0000, // 0004 LDNIL R3 + 0x1C0C0403, // 0005 EQ R3 R2 R3 + 0x780E0000, // 0006 JMPF R3 #0008 + 0x80000600, // 0007 RET 0 + 0x8C0C0303, // 0008 GETMET R3 R1 K3 + 0x5C140400, // 0009 MOVE R5 R2 + 0x7C0C0400, // 000A CALL R3 2 + 0x4C100000, // 000B LDNIL R4 + 0x20100604, // 000C NE R4 R3 R4 + 0x7812000D, // 000D JMPF R4 #001C + 0x58100004, // 000E LDCONST R4 K4 + 0x6014000C, // 000F GETGBL R5 G12 + 0x88180105, // 0010 GETMBR R6 R0 K5 + 0x7C140200, // 0011 CALL R5 1 + 0x14140805, // 0012 LT R5 R4 R5 + 0x78160006, // 0013 JMPF R5 #001B + 0x88140105, // 0014 GETMBR R5 R0 K5 + 0x94140A04, // 0015 GETIDX R5 R5 R4 + 0x8C140B06, // 0016 GETMET R5 R5 K6 + 0x5C1C0600, // 0017 MOVE R7 R3 + 0x7C140400, // 0018 CALL R5 2 + 0x00100907, // 0019 ADD R4 R4 K7 + 0x7001FFF3, // 001A JMP #000F + 0x70020007, // 001B JMP #0024 + 0xB8120200, // 001C GETNGBL R4 K1 + 0x8C100908, // 001D GETMET R4 R4 K8 + 0x60180008, // 001E GETGBL R6 G8 + 0x5C1C0400, // 001F MOVE R7 R2 + 0x7C180200, // 0020 CALL R6 1 + 0x001A1206, // 0021 ADD R6 K9 R6 + 0x581C000A, // 0022 LDCONST R7 K10 + 0x7C100600, // 0023 CALL R4 3 + 0x80000000, // 0024 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: get_active_endpoints +********************************************************************/ +be_local_closure(Matter_Device_get_active_endpoints, /* name */ + be_nested_proto( + 9, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 6]) { /* constants */ + /* K0 */ be_nested_str_weak(plugins), + /* K1 */ be_nested_str_weak(get_endpoint), + /* K2 */ be_const_int(0), + /* K3 */ be_nested_str_weak(find), + /* K4 */ be_nested_str_weak(push), + /* K5 */ be_nested_str_weak(stop_iteration), + }), + be_str_weak(get_active_endpoints), + &be_const_str_solidified, + ( &(const binstruction[28]) { /* code */ + 0x60080012, // 0000 GETGBL R2 G18 + 0x7C080000, // 0001 CALL R2 0 + 0x600C0010, // 0002 GETGBL R3 G16 + 0x88100100, // 0003 GETMBR R4 R0 K0 + 0x7C0C0200, // 0004 CALL R3 1 + 0xA8020011, // 0005 EXBLK 0 #0018 + 0x5C100600, // 0006 MOVE R4 R3 + 0x7C100000, // 0007 CALL R4 0 + 0x8C140901, // 0008 GETMET R5 R4 K1 + 0x7C140200, // 0009 CALL R5 1 + 0x78060002, // 000A JMPF R1 #000E + 0x1C180B02, // 000B EQ R6 R5 K2 + 0x781A0000, // 000C JMPF R6 #000E + 0x7001FFF7, // 000D JMP #0006 + 0x8C180503, // 000E GETMET R6 R2 K3 + 0x5C200A00, // 000F MOVE R8 R5 + 0x7C180400, // 0010 CALL R6 2 + 0x4C1C0000, // 0011 LDNIL R7 + 0x1C180C07, // 0012 EQ R6 R6 R7 + 0x781A0002, // 0013 JMPF R6 #0017 + 0x8C180504, // 0014 GETMET R6 R2 K4 + 0x5C200A00, // 0015 MOVE R8 R5 + 0x7C180400, // 0016 CALL R6 2 + 0x7001FFED, // 0017 JMP #0006 + 0x580C0005, // 0018 LDCONST R3 K5 + 0xAC0C0200, // 0019 CATCH R3 1 0 + 0xB0080000, // 001A RAISE 2 R0 R0 + 0x80040400, // 001B RET 1 R2 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: msg_send +********************************************************************/ +be_local_closure(Matter_Device_msg_send, /* name */ be_nested_proto( 5, /* nstack */ 2, /* argc */ @@ -100,9 +1542,9 @@ be_local_closure(Matter_Device_received_ack, /* name */ 1, /* has constants */ ( &(const bvalue[ 2]) { /* constants */ /* K0 */ be_nested_str_weak(udp_server), - /* K1 */ be_nested_str_weak(received_ack), + /* K1 */ be_nested_str_weak(send_UDP), }), - be_str_weak(received_ack), + be_str_weak(msg_send), &be_const_str_solidified, ( &(const binstruction[ 5]) { /* code */ 0x88080100, // 0000 GETMBR R2 R0 K0 @@ -117,11 +1559,11 @@ be_local_closure(Matter_Device_received_ack, /* name */ /******************************************************************** -** Solidified function: compute_manual_pairing_code +** Solidified function: stop ********************************************************************/ -be_local_closure(Matter_Device_compute_manual_pairing_code, /* name */ +be_local_closure(Matter_Device_stop, /* name */ be_nested_proto( - 11, /* nstack */ + 4, /* nstack */ 1, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -129,50 +1571,1256 @@ be_local_closure(Matter_Device_compute_manual_pairing_code, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[ 8]) { /* constants */ - /* K0 */ be_nested_str_weak(string), - /* K1 */ be_nested_str_weak(root_discriminator), - /* K2 */ be_nested_str_weak(root_passcode), - /* K3 */ be_nested_str_weak(format), - /* K4 */ be_nested_str_weak(_X251i_X2505i_X2504i), - /* K5 */ be_nested_str_weak(matter), - /* K6 */ be_nested_str_weak(Verhoeff), - /* K7 */ be_nested_str_weak(checksum), + ( &(const bvalue[ 4]) { /* constants */ + /* K0 */ be_nested_str_weak(tasmota), + /* K1 */ be_nested_str_weak(remove_driver), + /* K2 */ be_nested_str_weak(udp_server), + /* K3 */ be_nested_str_weak(stop), }), - be_str_weak(compute_manual_pairing_code), + be_str_weak(stop), &be_const_str_solidified, - ( &(const binstruction[31]) { /* code */ + ( &(const binstruction[10]) { /* code */ + 0xB8060000, // 0000 GETNGBL R1 K0 + 0x8C040301, // 0001 GETMET R1 R1 K1 + 0x5C0C0000, // 0002 MOVE R3 R0 + 0x7C040400, // 0003 CALL R1 2 + 0x88040102, // 0004 GETMBR R1 R0 K2 + 0x78060002, // 0005 JMPF R1 #0009 + 0x88040102, // 0006 GETMBR R1 R0 K2 + 0x8C040303, // 0007 GETMET R1 R1 K3 + 0x7C040200, // 0008 CALL R1 1 + 0x80000000, // 0009 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: msg_received +********************************************************************/ +be_local_closure(Matter_Device_msg_received, /* name */ + be_nested_proto( + 9, /* nstack */ + 4, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 2]) { /* constants */ + /* K0 */ be_nested_str_weak(message_handler), + /* K1 */ be_nested_str_weak(msg_received), + }), + be_str_weak(msg_received), + &be_const_str_solidified, + ( &(const binstruction[ 7]) { /* code */ + 0x88100100, // 0000 GETMBR R4 R0 K0 + 0x8C100901, // 0001 GETMET R4 R4 K1 + 0x5C180200, // 0002 MOVE R6 R1 + 0x5C1C0400, // 0003 MOVE R7 R2 + 0x5C200600, // 0004 MOVE R8 R3 + 0x7C100800, // 0005 CALL R4 4 + 0x80040800, // 0006 RET 1 R4 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: start_operational_discovery_deferred +********************************************************************/ +be_local_closure(Matter_Device_start_operational_discovery_deferred, /* name */ + be_nested_proto( + 6, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 1, /* has sup protos */ + ( &(const struct bproto*[ 1]) { + be_nested_proto( + 3, /* nstack */ + 0, /* argc */ + 0, /* varg */ + 1, /* has upvals */ + ( &(const bupvaldesc[ 2]) { /* upvals */ + be_local_const_upval(1, 0), + be_local_const_upval(1, 1), + }), + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 1]) { /* constants */ + /* K0 */ be_nested_str_weak(start_operational_discovery), + }), + be_str_weak(_X3Clambda_X3E), + &be_const_str_solidified, + ( &(const binstruction[ 5]) { /* code */ + 0x68000000, // 0000 GETUPV R0 U0 + 0x8C000100, // 0001 GETMET R0 R0 K0 + 0x68080001, // 0002 GETUPV R2 U1 + 0x7C000400, // 0003 CALL R0 2 + 0x80040000, // 0004 RET 1 R0 + }) + ), + }), + 1, /* has constants */ + ( &(const bvalue[ 3]) { /* constants */ + /* K0 */ be_nested_str_weak(tasmota), + /* K1 */ be_nested_str_weak(set_timer), + /* K2 */ be_const_int(0), + }), + be_str_weak(start_operational_discovery_deferred), + &be_const_str_solidified, + ( &(const binstruction[ 7]) { /* code */ + 0xB80A0000, // 0000 GETNGBL R2 K0 + 0x8C080501, // 0001 GETMET R2 R2 K1 + 0x58100002, // 0002 LDCONST R4 K2 + 0x84140000, // 0003 CLOSURE R5 P0 + 0x7C080600, // 0004 CALL R2 3 + 0xA0000000, // 0005 CLOSE R0 + 0x80000000, // 0006 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: compute_qrcode_content +********************************************************************/ +be_local_closure(Matter_Device_compute_qrcode_content, /* name */ + be_nested_proto( + 8, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[12]) { /* constants */ + /* K0 */ be_nested_str_weak(resize), + /* K1 */ be_nested_str_weak(setbits), + /* K2 */ be_const_int(3), + /* K3 */ be_nested_str_weak(vendorid), + /* K4 */ be_nested_str_weak(productid), + /* K5 */ be_nested_str_weak(root_discriminator), + /* K6 */ be_nested_str_weak(root_passcode), + /* K7 */ be_const_int(134217727), + /* K8 */ be_nested_str_weak(MT_X3A), + /* K9 */ be_nested_str_weak(matter), + /* K10 */ be_nested_str_weak(Base38), + /* K11 */ be_nested_str_weak(encode), + }), + be_str_weak(compute_qrcode_content), + &be_const_str_solidified, + ( &(const binstruction[40]) { /* code */ + 0x60040015, // 0000 GETGBL R1 G21 + 0x7C040000, // 0001 CALL R1 0 + 0x8C040300, // 0002 GETMET R1 R1 K0 + 0x540E000A, // 0003 LDINT R3 11 + 0x7C040400, // 0004 CALL R1 2 + 0x8C080301, // 0005 GETMET R2 R1 K1 + 0x58100002, // 0006 LDCONST R4 K2 + 0x5416000F, // 0007 LDINT R5 16 + 0x88180103, // 0008 GETMBR R6 R0 K3 + 0x7C080800, // 0009 CALL R2 4 + 0x8C080301, // 000A GETMET R2 R1 K1 + 0x54120012, // 000B LDINT R4 19 + 0x5416000F, // 000C LDINT R5 16 + 0x88180104, // 000D GETMBR R6 R0 K4 + 0x7C080800, // 000E CALL R2 4 + 0x8C080301, // 000F GETMET R2 R1 K1 + 0x54120024, // 0010 LDINT R4 37 + 0x54160007, // 0011 LDINT R5 8 + 0x541A0003, // 0012 LDINT R6 4 + 0x7C080800, // 0013 CALL R2 4 + 0x8C080301, // 0014 GETMET R2 R1 K1 + 0x5412002C, // 0015 LDINT R4 45 + 0x5416000B, // 0016 LDINT R5 12 + 0x88180105, // 0017 GETMBR R6 R0 K5 + 0x541E0FFE, // 0018 LDINT R7 4095 + 0x2C180C07, // 0019 AND R6 R6 R7 + 0x7C080800, // 001A CALL R2 4 + 0x8C080301, // 001B GETMET R2 R1 K1 + 0x54120038, // 001C LDINT R4 57 + 0x5416001A, // 001D LDINT R5 27 + 0x88180106, // 001E GETMBR R6 R0 K6 + 0x2C180D07, // 001F AND R6 R6 K7 + 0x7C080800, // 0020 CALL R2 4 + 0xB80A1200, // 0021 GETNGBL R2 K9 + 0x8808050A, // 0022 GETMBR R2 R2 K10 + 0x8C08050B, // 0023 GETMET R2 R2 K11 + 0x5C100200, // 0024 MOVE R4 R1 + 0x7C080400, // 0025 CALL R2 2 + 0x000A1002, // 0026 ADD R2 K8 R2 + 0x80040400, // 0027 RET 1 R2 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: sort_distinct +********************************************************************/ +be_local_closure(Matter_Device_sort_distinct, /* name */ + be_nested_proto( + 7, /* nstack */ + 1, /* argc */ + 4, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 5]) { /* constants */ + /* K0 */ be_const_class(be_class_Matter_Device), + /* K1 */ be_const_int(1), + /* K2 */ be_const_int(0), + /* K3 */ be_nested_str_weak(stop_iteration), + /* K4 */ be_nested_str_weak(remove), + }), + be_str_weak(sort_distinct), + &be_const_str_solidified, + ( &(const binstruction[53]) { /* code */ + 0x58040000, // 0000 LDCONST R1 K0 + 0x60080010, // 0001 GETGBL R2 G16 + 0x600C000C, // 0002 GETGBL R3 G12 + 0x5C100000, // 0003 MOVE R4 R0 + 0x7C0C0200, // 0004 CALL R3 1 + 0x040C0701, // 0005 SUB R3 R3 K1 + 0x400E0203, // 0006 CONNECT R3 K1 R3 + 0x7C080200, // 0007 CALL R2 1 + 0xA8020010, // 0008 EXBLK 0 #001A + 0x5C0C0400, // 0009 MOVE R3 R2 + 0x7C0C0000, // 000A CALL R3 0 + 0x94100003, // 000B GETIDX R4 R0 R3 + 0x5C140600, // 000C MOVE R5 R3 + 0x24180B02, // 000D GT R6 R5 K2 + 0x781A0008, // 000E JMPF R6 #0018 + 0x04180B01, // 000F SUB R6 R5 K1 + 0x94180006, // 0010 GETIDX R6 R0 R6 + 0x24180C04, // 0011 GT R6 R6 R4 + 0x781A0004, // 0012 JMPF R6 #0018 + 0x04180B01, // 0013 SUB R6 R5 K1 + 0x94180006, // 0014 GETIDX R6 R0 R6 + 0x98000A06, // 0015 SETIDX R0 R5 R6 + 0x04140B01, // 0016 SUB R5 R5 K1 + 0x7001FFF4, // 0017 JMP #000D + 0x98000A04, // 0018 SETIDX R0 R5 R4 + 0x7001FFEE, // 0019 JMP #0009 + 0x58080003, // 001A LDCONST R2 K3 + 0xAC080200, // 001B CATCH R2 1 0 + 0xB0080000, // 001C RAISE 2 R0 R0 + 0x58080001, // 001D LDCONST R2 K1 + 0x600C000C, // 001E GETGBL R3 G12 + 0x5C100000, // 001F MOVE R4 R0 + 0x7C0C0200, // 0020 CALL R3 1 + 0x180C0701, // 0021 LE R3 R3 K1 + 0x780E0000, // 0022 JMPF R3 #0024 + 0x80040000, // 0023 RET 1 R0 + 0x940C0102, // 0024 GETIDX R3 R0 K2 + 0x6010000C, // 0025 GETGBL R4 G12 + 0x5C140000, // 0026 MOVE R5 R0 + 0x7C100200, // 0027 CALL R4 1 + 0x14100404, // 0028 LT R4 R2 R4 + 0x78120009, // 0029 JMPF R4 #0034 + 0x94100002, // 002A GETIDX R4 R0 R2 + 0x1C100803, // 002B EQ R4 R4 R3 + 0x78120003, // 002C JMPF R4 #0031 + 0x8C100104, // 002D GETMET R4 R0 K4 + 0x5C180400, // 002E MOVE R6 R2 + 0x7C100400, // 002F CALL R4 2 + 0x70020001, // 0030 JMP #0033 + 0x940C0002, // 0031 GETIDX R3 R0 R2 + 0x00080501, // 0032 ADD R2 R2 K1 + 0x7001FFF0, // 0033 JMP #0025 + 0x80040000, // 0034 RET 1 R0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: start_mdns_announce_hostnames +********************************************************************/ +be_local_closure(Matter_Device_start_mdns_announce_hostnames, /* name */ + be_nested_proto( + 6, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 1, /* has sup protos */ + ( &(const struct bproto*[ 2]) { + be_nested_proto( + 4, /* nstack */ + 0, /* argc */ + 0, /* varg */ + 1, /* has upvals */ + ( &(const bupvaldesc[ 1]) { /* upvals */ + be_local_const_upval(1, 0), + }), + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 5]) { /* constants */ + /* K0 */ be_nested_str_weak(_mdns_announce_hostname), + /* K1 */ be_nested_str_weak(tasmota), + /* K2 */ be_nested_str_weak(remove_rule), + /* K3 */ be_nested_str_weak(Wifi_X23Connected), + /* K4 */ be_nested_str_weak(matter_mdns_host), + }), + be_str_weak(_anonymous_), + &be_const_str_solidified, + ( &(const binstruction[10]) { /* code */ + 0x68000000, // 0000 GETUPV R0 U0 + 0x8C000100, // 0001 GETMET R0 R0 K0 + 0x50080000, // 0002 LDBOOL R2 0 0 + 0x7C000400, // 0003 CALL R0 2 + 0xB8020200, // 0004 GETNGBL R0 K1 + 0x8C000102, // 0005 GETMET R0 R0 K2 + 0x58080003, // 0006 LDCONST R2 K3 + 0x580C0004, // 0007 LDCONST R3 K4 + 0x7C000600, // 0008 CALL R0 3 + 0x80000000, // 0009 RET 0 + }) + ), + be_nested_proto( + 4, /* nstack */ + 0, /* argc */ + 0, /* varg */ + 1, /* has upvals */ + ( &(const bupvaldesc[ 1]) { /* upvals */ + be_local_const_upval(1, 0), + }), + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 5]) { /* constants */ + /* K0 */ be_nested_str_weak(_mdns_announce_hostname), + /* K1 */ be_nested_str_weak(tasmota), + /* K2 */ be_nested_str_weak(remove_rule), + /* K3 */ be_nested_str_weak(Eth_X23Connected), + /* K4 */ be_nested_str_weak(matter_mdns_host), + }), + be_str_weak(_anonymous_), + &be_const_str_solidified, + ( &(const binstruction[10]) { /* code */ + 0x68000000, // 0000 GETUPV R0 U0 + 0x8C000100, // 0001 GETMET R0 R0 K0 + 0x50080200, // 0002 LDBOOL R2 1 0 + 0x7C000400, // 0003 CALL R0 2 + 0xB8020200, // 0004 GETNGBL R0 K1 + 0x8C000102, // 0005 GETMET R0 R0 K2 + 0x58080003, // 0006 LDCONST R2 K3 + 0x580C0004, // 0007 LDCONST R3 K4 + 0x7C000600, // 0008 CALL R0 3 + 0x80000000, // 0009 RET 0 + }) + ), + }), + 1, /* has constants */ + ( &(const bvalue[ 9]) { /* constants */ + /* K0 */ be_nested_str_weak(tasmota), + /* K1 */ be_nested_str_weak(wifi), + /* K2 */ be_nested_str_weak(up), + /* K3 */ be_nested_str_weak(_mdns_announce_hostname), + /* K4 */ be_nested_str_weak(add_rule), + /* K5 */ be_nested_str_weak(Wifi_X23Connected), + /* K6 */ be_nested_str_weak(matter_mdns_host), + /* K7 */ be_nested_str_weak(eth), + /* K8 */ be_nested_str_weak(Eth_X23Connected), + }), + be_str_weak(start_mdns_announce_hostnames), + &be_const_str_solidified, + ( &(const binstruction[32]) { /* code */ + 0xB8060000, // 0000 GETNGBL R1 K0 + 0x8C040301, // 0001 GETMET R1 R1 K1 + 0x7C040200, // 0002 CALL R1 1 + 0x94040302, // 0003 GETIDX R1 R1 K2 + 0x78060003, // 0004 JMPF R1 #0009 + 0x8C040103, // 0005 GETMET R1 R0 K3 + 0x500C0000, // 0006 LDBOOL R3 0 0 + 0x7C040400, // 0007 CALL R1 2 + 0x70020005, // 0008 JMP #000F + 0xB8060000, // 0009 GETNGBL R1 K0 + 0x8C040304, // 000A GETMET R1 R1 K4 + 0x580C0005, // 000B LDCONST R3 K5 + 0x84100000, // 000C CLOSURE R4 P0 + 0x58140006, // 000D LDCONST R5 K6 + 0x7C040800, // 000E CALL R1 4 + 0xB8060000, // 000F GETNGBL R1 K0 + 0x8C040307, // 0010 GETMET R1 R1 K7 + 0x7C040200, // 0011 CALL R1 1 + 0x94040302, // 0012 GETIDX R1 R1 K2 + 0x78060003, // 0013 JMPF R1 #0018 + 0x8C040103, // 0014 GETMET R1 R0 K3 + 0x500C0200, // 0015 LDBOOL R3 1 0 + 0x7C040400, // 0016 CALL R1 2 + 0x70020005, // 0017 JMP #001E + 0xB8060000, // 0018 GETNGBL R1 K0 + 0x8C040304, // 0019 GETMET R1 R1 K4 + 0x580C0008, // 001A LDCONST R3 K8 + 0x84100001, // 001B CLOSURE R4 P1 + 0x58140006, // 001C LDCONST R5 K6 + 0x7C040800, // 001D CALL R1 4 + 0xA0000000, // 001E CLOSE R0 + 0x80000000, // 001F RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: every_second +********************************************************************/ +be_local_closure(Matter_Device_every_second, /* name */ + be_nested_proto( + 4, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 9]) { /* constants */ + /* K0 */ be_nested_str_weak(sessions), + /* K1 */ be_nested_str_weak(every_second), + /* K2 */ be_nested_str_weak(message_handler), + /* K3 */ be_nested_str_weak(commissioning_open), + /* K4 */ be_nested_str_weak(tasmota), + /* K5 */ be_nested_str_weak(time_reached), + /* K6 */ be_const_int(0), + /* K7 */ be_nested_str_weak(plugins), + /* K8 */ be_const_int(1), + }), + be_str_weak(every_second), + &be_const_str_solidified, + ( &(const binstruction[30]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x8C040301, // 0001 GETMET R1 R1 K1 + 0x7C040200, // 0002 CALL R1 1 + 0x88040102, // 0003 GETMBR R1 R0 K2 + 0x8C040301, // 0004 GETMET R1 R1 K1 + 0x7C040200, // 0005 CALL R1 1 + 0x88040103, // 0006 GETMBR R1 R0 K3 + 0x4C080000, // 0007 LDNIL R2 + 0x20040202, // 0008 NE R1 R1 R2 + 0x78060006, // 0009 JMPF R1 #0011 + 0xB8060800, // 000A GETNGBL R1 K4 + 0x8C040305, // 000B GETMET R1 R1 K5 + 0x880C0103, // 000C GETMBR R3 R0 K3 + 0x7C040400, // 000D CALL R1 2 + 0x78060001, // 000E JMPF R1 #0011 + 0x4C040000, // 000F LDNIL R1 + 0x90020601, // 0010 SETMBR R0 K3 R1 + 0x58040006, // 0011 LDCONST R1 K6 + 0x6008000C, // 0012 GETGBL R2 G12 + 0x880C0107, // 0013 GETMBR R3 R0 K7 + 0x7C080200, // 0014 CALL R2 1 + 0x14080202, // 0015 LT R2 R1 R2 + 0x780A0005, // 0016 JMPF R2 #001D + 0x88080107, // 0017 GETMBR R2 R0 K7 + 0x94080401, // 0018 GETIDX R2 R2 R1 + 0x8C080501, // 0019 GETMET R2 R2 K1 + 0x7C080200, // 001A CALL R2 1 + 0x00040308, // 001B ADD R1 R1 K8 + 0x7001FFF4, // 001C JMP #0012 + 0x80000000, // 001D RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: start_root_basic_commissioning +********************************************************************/ +be_local_closure(Matter_Device_start_root_basic_commissioning, /* name */ + be_nested_proto( + 14, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[23]) { /* constants */ + /* K0 */ be_nested_str_weak(string), + /* K1 */ be_nested_str_weak(PASE_TIMEOUT), + /* K2 */ be_nested_str_weak(compute_manual_pairing_code), + /* K3 */ be_nested_str_weak(tasmota), + /* K4 */ be_nested_str_weak(log), + /* K5 */ be_nested_str_weak(format), + /* K6 */ be_nested_str_weak(MTR_X3A_X20Manual_X20pairing_X20code_X3A_X20_X25s_X2D_X25s_X2D_X25s), + /* K7 */ be_const_int(0), + /* K8 */ be_const_int(3), + /* K9 */ be_const_int(2147483647), + /* K10 */ be_const_int(2), + /* K11 */ be_nested_str_weak(compute_qrcode_content), + /* K12 */ be_nested_str_weak(publish_result), + /* K13 */ be_nested_str_weak(_X7B_X22Matter_X22_X3A_X7B_X22Commissioning_X22_X3A1_X2C_X22PairingCode_X22_X3A_X22_X25s_X22_X2C_X22QRCode_X22_X3A_X22_X25s_X22_X7D_X7D), + /* K14 */ be_nested_str_weak(Matter), + /* K15 */ be_nested_str_weak(_compute_pbkdf), + /* K16 */ be_nested_str_weak(root_passcode), + /* K17 */ be_nested_str_weak(root_iterations), + /* K18 */ be_nested_str_weak(root_salt), + /* K19 */ be_nested_str_weak(start_basic_commissioning), + /* K20 */ be_nested_str_weak(root_discriminator), + /* K21 */ be_nested_str_weak(root_w0), + /* K22 */ be_nested_str_weak(root_L), + }), + be_str_weak(start_root_basic_commissioning), + &be_const_str_solidified, + ( &(const binstruction[49]) { /* code */ + 0xA40A0000, // 0000 IMPORT R2 K0 + 0x4C0C0000, // 0001 LDNIL R3 + 0x1C0C0203, // 0002 EQ R3 R1 R3 + 0x780E0000, // 0003 JMPF R3 #0005 + 0x88040101, // 0004 GETMBR R1 R0 K1 + 0x8C0C0102, // 0005 GETMET R3 R0 K2 + 0x7C0C0200, // 0006 CALL R3 1 + 0xB8120600, // 0007 GETNGBL R4 K3 + 0x8C100904, // 0008 GETMET R4 R4 K4 + 0x8C180505, // 0009 GETMET R6 R2 K5 + 0x58200006, // 000A LDCONST R8 K6 + 0x40260F08, // 000B CONNECT R9 K7 K8 + 0x94240609, // 000C GETIDX R9 R3 R9 + 0x542A0003, // 000D LDINT R10 4 + 0x542E0005, // 000E LDINT R11 6 + 0x4028140B, // 000F CONNECT R10 R10 R11 + 0x9428060A, // 0010 GETIDX R10 R3 R10 + 0x542E0006, // 0011 LDINT R11 7 + 0x402C1709, // 0012 CONNECT R11 R11 K9 + 0x942C060B, // 0013 GETIDX R11 R3 R11 + 0x7C180A00, // 0014 CALL R6 5 + 0x581C000A, // 0015 LDCONST R7 K10 + 0x7C100600, // 0016 CALL R4 3 + 0x8C10010B, // 0017 GETMET R4 R0 K11 + 0x7C100200, // 0018 CALL R4 1 + 0xB8160600, // 0019 GETNGBL R5 K3 + 0x8C140B0C, // 001A GETMET R5 R5 K12 + 0x8C1C0505, // 001B GETMET R7 R2 K5 + 0x5824000D, // 001C LDCONST R9 K13 + 0x5C280600, // 001D MOVE R10 R3 + 0x5C2C0800, // 001E MOVE R11 R4 + 0x7C1C0800, // 001F CALL R7 4 + 0x5820000E, // 0020 LDCONST R8 K14 + 0x7C140600, // 0021 CALL R5 3 + 0x8C14010F, // 0022 GETMET R5 R0 K15 + 0x881C0110, // 0023 GETMBR R7 R0 K16 + 0x88200111, // 0024 GETMBR R8 R0 K17 + 0x88240112, // 0025 GETMBR R9 R0 K18 + 0x7C140800, // 0026 CALL R5 4 + 0x8C140113, // 0027 GETMET R5 R0 K19 + 0x5C1C0200, // 0028 MOVE R7 R1 + 0x88200111, // 0029 GETMBR R8 R0 K17 + 0x88240114, // 002A GETMBR R9 R0 K20 + 0x88280112, // 002B GETMBR R10 R0 K18 + 0x882C0115, // 002C GETMBR R11 R0 K21 + 0x88300116, // 002D GETMBR R12 R0 K22 + 0x4C340000, // 002E LDNIL R13 + 0x7C141000, // 002F CALL R5 8 + 0x80000000, // 0030 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: _init_basic_commissioning +********************************************************************/ +be_local_closure(Matter_Device__init_basic_commissioning, /* name */ + be_nested_proto( + 3, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 4]) { /* constants */ + /* K0 */ be_nested_str_weak(sessions), + /* K1 */ be_nested_str_weak(count_active_fabrics), + /* K2 */ be_const_int(0), + /* K3 */ be_nested_str_weak(start_root_basic_commissioning), + }), + be_str_weak(_init_basic_commissioning), + &be_const_str_solidified, + ( &(const binstruction[ 8]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x8C040301, // 0001 GETMET R1 R1 K1 + 0x7C040200, // 0002 CALL R1 1 + 0x1C040302, // 0003 EQ R1 R1 K2 + 0x78060001, // 0004 JMPF R1 #0007 + 0x8C040103, // 0005 GETMET R1 R0 K3 + 0x7C040200, // 0006 CALL R1 1 + 0x80000000, // 0007 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: init +********************************************************************/ +be_local_closure(Matter_Device_init, /* name */ + be_nested_proto( + 8, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 1, /* has sup protos */ + ( &(const struct bproto*[ 2]) { + be_nested_proto( + 4, /* nstack */ + 0, /* argc */ + 0, /* varg */ + 1, /* has upvals */ + ( &(const bupvaldesc[ 1]) { /* upvals */ + be_local_const_upval(1, 0), + }), + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 5]) { /* constants */ + /* K0 */ be_nested_str_weak(start), + /* K1 */ be_nested_str_weak(tasmota), + /* K2 */ be_nested_str_weak(remove_rule), + /* K3 */ be_nested_str_weak(Wifi_X23Connected), + /* K4 */ be_nested_str_weak(matter_start), + }), + be_str_weak(_anonymous_), + &be_const_str_solidified, + ( &(const binstruction[ 9]) { /* code */ + 0x68000000, // 0000 GETUPV R0 U0 + 0x8C000100, // 0001 GETMET R0 R0 K0 + 0x7C000200, // 0002 CALL R0 1 + 0xB8020200, // 0003 GETNGBL R0 K1 + 0x8C000102, // 0004 GETMET R0 R0 K2 + 0x58080003, // 0005 LDCONST R2 K3 + 0x580C0004, // 0006 LDCONST R3 K4 + 0x7C000600, // 0007 CALL R0 3 + 0x80000000, // 0008 RET 0 + }) + ), + be_nested_proto( + 4, /* nstack */ + 0, /* argc */ + 0, /* varg */ + 1, /* has upvals */ + ( &(const bupvaldesc[ 1]) { /* upvals */ + be_local_const_upval(1, 0), + }), + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 5]) { /* constants */ + /* K0 */ be_nested_str_weak(start), + /* K1 */ be_nested_str_weak(tasmota), + /* K2 */ be_nested_str_weak(remove_rule), + /* K3 */ be_nested_str_weak(Eth_X23Connected), + /* K4 */ be_nested_str_weak(matter_start), + }), + be_str_weak(_anonymous_), + &be_const_str_solidified, + ( &(const binstruction[ 9]) { /* code */ + 0x68000000, // 0000 GETUPV R0 U0 + 0x8C000100, // 0001 GETMET R0 R0 K0 + 0x7C000200, // 0002 CALL R0 1 + 0xB8020200, // 0003 GETNGBL R0 K1 + 0x8C000102, // 0004 GETMET R0 R0 K2 + 0x58080003, // 0005 LDCONST R2 K3 + 0x580C0004, // 0006 LDCONST R3 K4 + 0x7C000600, // 0007 CALL R0 3 + 0x80000000, // 0008 RET 0 + }) + ), + }), + 1, /* has constants */ + ( &(const bvalue[36]) { /* constants */ + /* K0 */ be_nested_str_weak(crypto), + /* K1 */ be_nested_str_weak(string), + /* K2 */ be_nested_str_weak(tasmota), + /* K3 */ be_nested_str_weak(get_option), + /* K4 */ be_nested_str_weak(matter), + /* K5 */ be_nested_str_weak(MATTER_OPTION), + /* K6 */ be_nested_str_weak(UI), + /* K7 */ be_nested_str_weak(started), + /* K8 */ be_nested_str_weak(plugins), + /* K9 */ be_nested_str_weak(vendorid), + /* K10 */ be_nested_str_weak(VENDOR_ID), + /* K11 */ be_nested_str_weak(productid), + /* K12 */ be_nested_str_weak(PRODUCT_ID), + /* K13 */ be_nested_str_weak(root_iterations), + /* K14 */ be_nested_str_weak(PBKDF_ITERATIONS), + /* K15 */ be_nested_str_weak(root_salt), + /* K16 */ be_nested_str_weak(random), + /* K17 */ be_nested_str_weak(ipv4only), + /* K18 */ be_nested_str_weak(load_param), + /* K19 */ be_nested_str_weak(sessions), + /* K20 */ be_nested_str_weak(Session_Store), + /* K21 */ be_nested_str_weak(load_fabrics), + /* K22 */ be_nested_str_weak(message_handler), + /* K23 */ be_nested_str_weak(MessageHandler), + /* K24 */ be_nested_str_weak(ui), + /* K25 */ be_nested_str_weak(wifi), + /* K26 */ be_nested_str_weak(up), + /* K27 */ be_nested_str_weak(eth), + /* K28 */ be_nested_str_weak(start), + /* K29 */ be_nested_str_weak(add_rule), + /* K30 */ be_nested_str_weak(Wifi_X23Connected), + /* K31 */ be_nested_str_weak(matter_start), + /* K32 */ be_nested_str_weak(Eth_X23Connected), + /* K33 */ be_nested_str_weak(_init_basic_commissioning), + /* K34 */ be_nested_str_weak(add_driver), + /* K35 */ be_nested_str_weak(register_commands), + }), + be_str_weak(init), + &be_const_str_solidified, + ( &(const binstruction[93]) { /* code */ 0xA4060000, // 0000 IMPORT R1 K0 - 0x88080101, // 0001 GETMBR R2 R0 K1 - 0x540E0FFE, // 0002 LDINT R3 4095 - 0x2C080403, // 0003 AND R2 R2 R3 - 0x540E0009, // 0004 LDINT R3 10 - 0x3C080403, // 0005 SHR R2 R2 R3 - 0x880C0101, // 0006 GETMBR R3 R0 K1 - 0x541202FF, // 0007 LDINT R4 768 - 0x2C0C0604, // 0008 AND R3 R3 R4 - 0x54120005, // 0009 LDINT R4 6 - 0x380C0604, // 000A SHL R3 R3 R4 - 0x88100102, // 000B GETMBR R4 R0 K2 - 0x54163FFE, // 000C LDINT R5 16383 - 0x2C100805, // 000D AND R4 R4 R5 - 0x300C0604, // 000E OR R3 R3 R4 - 0x88100102, // 000F GETMBR R4 R0 K2 - 0x5416000D, // 0010 LDINT R5 14 - 0x3C100805, // 0011 SHR R4 R4 R5 - 0x8C140303, // 0012 GETMET R5 R1 K3 - 0x581C0004, // 0013 LDCONST R7 K4 - 0x5C200400, // 0014 MOVE R8 R2 - 0x5C240600, // 0015 MOVE R9 R3 - 0x5C280800, // 0016 MOVE R10 R4 - 0x7C140A00, // 0017 CALL R5 5 - 0xB81A0A00, // 0018 GETNGBL R6 K5 - 0x88180D06, // 0019 GETMBR R6 R6 K6 - 0x8C180D07, // 001A GETMET R6 R6 K7 - 0x5C200A00, // 001B MOVE R8 R5 - 0x7C180400, // 001C CALL R6 2 - 0x00140A06, // 001D ADD R5 R5 R6 - 0x80040A00, // 001E RET 1 R5 + 0xA40A0200, // 0001 IMPORT R2 K1 + 0xB80E0400, // 0002 GETNGBL R3 K2 + 0x8C0C0703, // 0003 GETMET R3 R3 K3 + 0xB8160800, // 0004 GETNGBL R5 K4 + 0x88140B05, // 0005 GETMBR R5 R5 K5 + 0x7C0C0400, // 0006 CALL R3 2 + 0x740E0004, // 0007 JMPT R3 #000D + 0xB80E0800, // 0008 GETNGBL R3 K4 + 0x8C0C0706, // 0009 GETMET R3 R3 K6 + 0x5C140000, // 000A MOVE R5 R0 + 0x7C0C0400, // 000B CALL R3 2 + 0x80000600, // 000C RET 0 + 0x500C0000, // 000D LDBOOL R3 0 0 + 0x90020E03, // 000E SETMBR R0 K7 R3 + 0x600C0012, // 000F GETGBL R3 G18 + 0x7C0C0000, // 0010 CALL R3 0 + 0x90021003, // 0011 SETMBR R0 K8 R3 + 0x880C010A, // 0012 GETMBR R3 R0 K10 + 0x90021203, // 0013 SETMBR R0 K9 R3 + 0x880C010C, // 0014 GETMBR R3 R0 K12 + 0x90021603, // 0015 SETMBR R0 K11 R3 + 0x880C010E, // 0016 GETMBR R3 R0 K14 + 0x90021A03, // 0017 SETMBR R0 K13 R3 + 0x8C0C0310, // 0018 GETMET R3 R1 K16 + 0x5416000F, // 0019 LDINT R5 16 + 0x7C0C0400, // 001A CALL R3 2 + 0x90021E03, // 001B SETMBR R0 K15 R3 + 0x500C0000, // 001C LDBOOL R3 0 0 + 0x90022203, // 001D SETMBR R0 K17 R3 + 0x8C0C0112, // 001E GETMET R3 R0 K18 + 0x7C0C0200, // 001F CALL R3 1 + 0xB80E0800, // 0020 GETNGBL R3 K4 + 0x8C0C0714, // 0021 GETMET R3 R3 K20 + 0x7C0C0200, // 0022 CALL R3 1 + 0x90022603, // 0023 SETMBR R0 K19 R3 + 0x880C0113, // 0024 GETMBR R3 R0 K19 + 0x8C0C0715, // 0025 GETMET R3 R3 K21 + 0x7C0C0200, // 0026 CALL R3 1 + 0xB80E0800, // 0027 GETNGBL R3 K4 + 0x8C0C0717, // 0028 GETMET R3 R3 K23 + 0x5C140000, // 0029 MOVE R5 R0 + 0x7C0C0400, // 002A CALL R3 2 + 0x90022C03, // 002B SETMBR R0 K22 R3 + 0xB80E0800, // 002C GETNGBL R3 K4 + 0x8C0C0706, // 002D GETMET R3 R3 K6 + 0x5C140000, // 002E MOVE R5 R0 + 0x7C0C0400, // 002F CALL R3 2 + 0x90023003, // 0030 SETMBR R0 K24 R3 + 0xB80E0400, // 0031 GETNGBL R3 K2 + 0x8C0C0719, // 0032 GETMET R3 R3 K25 + 0x7C0C0200, // 0033 CALL R3 1 + 0x940C071A, // 0034 GETIDX R3 R3 K26 + 0x740E0004, // 0035 JMPT R3 #003B + 0xB80E0400, // 0036 GETNGBL R3 K2 + 0x8C0C071B, // 0037 GETMET R3 R3 K27 + 0x7C0C0200, // 0038 CALL R3 1 + 0x940C071A, // 0039 GETIDX R3 R3 K26 + 0x780E0001, // 003A JMPF R3 #003D + 0x8C0C011C, // 003B GETMET R3 R0 K28 + 0x7C0C0200, // 003C CALL R3 1 + 0xB80E0400, // 003D GETNGBL R3 K2 + 0x8C0C0719, // 003E GETMET R3 R3 K25 + 0x7C0C0200, // 003F CALL R3 1 + 0x940C071A, // 0040 GETIDX R3 R3 K26 + 0x740E0005, // 0041 JMPT R3 #0048 + 0xB80E0400, // 0042 GETNGBL R3 K2 + 0x8C0C071D, // 0043 GETMET R3 R3 K29 + 0x5814001E, // 0044 LDCONST R5 K30 + 0x84180000, // 0045 CLOSURE R6 P0 + 0x581C001F, // 0046 LDCONST R7 K31 + 0x7C0C0800, // 0047 CALL R3 4 + 0xB80E0400, // 0048 GETNGBL R3 K2 + 0x8C0C071B, // 0049 GETMET R3 R3 K27 + 0x7C0C0200, // 004A CALL R3 1 + 0x940C071A, // 004B GETIDX R3 R3 K26 + 0x740E0005, // 004C JMPT R3 #0053 + 0xB80E0400, // 004D GETNGBL R3 K2 + 0x8C0C071D, // 004E GETMET R3 R3 K29 + 0x58140020, // 004F LDCONST R5 K32 + 0x84180001, // 0050 CLOSURE R6 P1 + 0x581C001F, // 0051 LDCONST R7 K31 + 0x7C0C0800, // 0052 CALL R3 4 + 0x8C0C0121, // 0053 GETMET R3 R0 K33 + 0x7C0C0200, // 0054 CALL R3 1 + 0xB80E0400, // 0055 GETNGBL R3 K2 + 0x8C0C0722, // 0056 GETMET R3 R3 K34 + 0x5C140000, // 0057 MOVE R5 R0 + 0x7C0C0400, // 0058 CALL R3 2 + 0x8C0C0123, // 0059 GETMET R3 R0 K35 + 0x7C0C0200, // 005A CALL R3 1 + 0xA0000000, // 005B CLOSE R0 + 0x80000000, // 005C RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: _compute_pbkdf +********************************************************************/ +be_local_closure(Matter_Device__compute_pbkdf, /* name */ + be_nested_proto( + 14, /* nstack */ + 4, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[11]) { /* constants */ + /* K0 */ be_nested_str_weak(crypto), + /* K1 */ be_nested_str_weak(string), + /* K2 */ be_nested_str_weak(add), + /* K3 */ be_nested_str_weak(PBKDF2_HMAC_SHA256), + /* K4 */ be_nested_str_weak(derive), + /* K5 */ be_const_int(0), + /* K6 */ be_nested_str_weak(root_w0), + /* K7 */ be_nested_str_weak(EC_P256), + /* K8 */ be_nested_str_weak(mod), + /* K9 */ be_nested_str_weak(root_L), + /* K10 */ be_nested_str_weak(public_key), + }), + be_str_weak(_compute_pbkdf), + &be_const_str_solidified, + ( &(const binstruction[41]) { /* code */ + 0xA4120000, // 0000 IMPORT R4 K0 + 0xA4160200, // 0001 IMPORT R5 K1 + 0x60180015, // 0002 GETGBL R6 G21 + 0x7C180000, // 0003 CALL R6 0 + 0x8C180D02, // 0004 GETMET R6 R6 K2 + 0x5C200200, // 0005 MOVE R8 R1 + 0x54260003, // 0006 LDINT R9 4 + 0x7C180600, // 0007 CALL R6 3 + 0x8C1C0903, // 0008 GETMET R7 R4 K3 + 0x7C1C0200, // 0009 CALL R7 1 + 0x8C1C0F04, // 000A GETMET R7 R7 K4 + 0x5C240C00, // 000B MOVE R9 R6 + 0x5C280600, // 000C MOVE R10 R3 + 0x5C2C0400, // 000D MOVE R11 R2 + 0x5432004F, // 000E LDINT R12 80 + 0x7C1C0A00, // 000F CALL R7 5 + 0x54220026, // 0010 LDINT R8 39 + 0x40220A08, // 0011 CONNECT R8 K5 R8 + 0x94200E08, // 0012 GETIDX R8 R7 R8 + 0x54260027, // 0013 LDINT R9 40 + 0x542A004E, // 0014 LDINT R10 79 + 0x4024120A, // 0015 CONNECT R9 R9 R10 + 0x94240E09, // 0016 GETIDX R9 R7 R9 + 0x8C280907, // 0017 GETMET R10 R4 K7 + 0x7C280200, // 0018 CALL R10 1 + 0x8C281508, // 0019 GETMET R10 R10 K8 + 0x5C301000, // 001A MOVE R12 R8 + 0x7C280400, // 001B CALL R10 2 + 0x90020C0A, // 001C SETMBR R0 K6 R10 + 0x8C280907, // 001D GETMET R10 R4 K7 + 0x7C280200, // 001E CALL R10 1 + 0x8C281508, // 001F GETMET R10 R10 K8 + 0x5C301200, // 0020 MOVE R12 R9 + 0x7C280400, // 0021 CALL R10 2 + 0x8C2C0907, // 0022 GETMET R11 R4 K7 + 0x7C2C0200, // 0023 CALL R11 1 + 0x8C2C170A, // 0024 GETMET R11 R11 K10 + 0x5C341400, // 0025 MOVE R13 R10 + 0x7C2C0400, // 0026 CALL R11 2 + 0x9002120B, // 0027 SETMBR R0 K9 R11 + 0x80000000, // 0028 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: every_250ms +********************************************************************/ +be_local_closure(Matter_Device_every_250ms, /* name */ + be_nested_proto( + 3, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 2]) { /* constants */ + /* K0 */ be_nested_str_weak(message_handler), + /* K1 */ be_nested_str_weak(every_250ms), + }), + be_str_weak(every_250ms), + &be_const_str_solidified, + ( &(const binstruction[ 4]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x8C040301, // 0001 GETMET R1 R1 K1 + 0x7C040200, // 0002 CALL R1 1 + 0x80000000, // 0003 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: process_attribute_expansion +********************************************************************/ +be_local_closure(Matter_Device_process_attribute_expansion, /* name */ + be_nested_proto( + 29, /* nstack */ + 3, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 1, /* has sup protos */ + ( &(const struct bproto*[ 1]) { + be_nested_proto( + 7, /* nstack */ + 1, /* argc */ + 0, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 5]) { /* constants */ + /* K0 */ be_nested_str_weak(keys), + /* K1 */ be_nested_str_weak(push), + /* K2 */ be_nested_str_weak(stop_iteration), + /* K3 */ be_const_int(1), + /* K4 */ be_const_int(0), + }), + be_str_weak(keys_sorted), + &be_const_str_solidified, + ( &(const binstruction[45]) { /* code */ + 0x60040012, // 0000 GETGBL R1 G18 + 0x7C040000, // 0001 CALL R1 0 + 0x60080010, // 0002 GETGBL R2 G16 + 0x8C0C0100, // 0003 GETMET R3 R0 K0 + 0x7C0C0200, // 0004 CALL R3 1 + 0x7C080200, // 0005 CALL R2 1 + 0xA8020005, // 0006 EXBLK 0 #000D + 0x5C0C0400, // 0007 MOVE R3 R2 + 0x7C0C0000, // 0008 CALL R3 0 + 0x8C100301, // 0009 GETMET R4 R1 K1 + 0x5C180600, // 000A MOVE R6 R3 + 0x7C100400, // 000B CALL R4 2 + 0x7001FFF9, // 000C JMP #0007 + 0x58080002, // 000D LDCONST R2 K2 + 0xAC080200, // 000E CATCH R2 1 0 + 0xB0080000, // 000F RAISE 2 R0 R0 + 0x60080010, // 0010 GETGBL R2 G16 + 0x600C000C, // 0011 GETGBL R3 G12 + 0x5C100200, // 0012 MOVE R4 R1 + 0x7C0C0200, // 0013 CALL R3 1 + 0x040C0703, // 0014 SUB R3 R3 K3 + 0x400E0603, // 0015 CONNECT R3 K3 R3 + 0x7C080200, // 0016 CALL R2 1 + 0xA8020010, // 0017 EXBLK 0 #0029 + 0x5C0C0400, // 0018 MOVE R3 R2 + 0x7C0C0000, // 0019 CALL R3 0 + 0x94100203, // 001A GETIDX R4 R1 R3 + 0x5C140600, // 001B MOVE R5 R3 + 0x24180B04, // 001C GT R6 R5 K4 + 0x781A0008, // 001D JMPF R6 #0027 + 0x04180B03, // 001E SUB R6 R5 K3 + 0x94180206, // 001F GETIDX R6 R1 R6 + 0x24180C04, // 0020 GT R6 R6 R4 + 0x781A0004, // 0021 JMPF R6 #0027 + 0x04180B03, // 0022 SUB R6 R5 K3 + 0x94180206, // 0023 GETIDX R6 R1 R6 + 0x98040A06, // 0024 SETIDX R1 R5 R6 + 0x04140B03, // 0025 SUB R5 R5 K3 + 0x7001FFF4, // 0026 JMP #001C + 0x98040A04, // 0027 SETIDX R1 R5 R4 + 0x7001FFEE, // 0028 JMP #0018 + 0x58080002, // 0029 LDCONST R2 K2 + 0xAC080200, // 002A CATCH R2 1 0 + 0xB0080000, // 002B RAISE 2 R0 R0 + 0x80040200, // 002C RET 1 R1 + }) + ), + }), + 1, /* has constants */ + ( &(const bvalue[22]) { /* constants */ + /* K0 */ be_nested_str_weak(string), + /* K1 */ be_nested_str_weak(endpoint), + /* K2 */ be_nested_str_weak(cluster), + /* K3 */ be_nested_str_weak(attribute), + /* K4 */ be_nested_str_weak(plugins), + /* K5 */ be_nested_str_weak(get_endpoint), + /* K6 */ be_nested_str_weak(contains), + /* K7 */ be_nested_str_weak(get_cluster_list), + /* K8 */ be_nested_str_weak(get_attribute_list), + /* K9 */ be_nested_str_weak(push), + /* K10 */ be_nested_str_weak(stop_iteration), + /* K11 */ be_nested_str_weak(tasmota), + /* K12 */ be_nested_str_weak(log), + /* K13 */ be_nested_str_weak(format), + /* K14 */ be_nested_str_weak(MTR_X3A_X20expansion_X20_X5B_X2502X_X5D_X2504X_X2F_X2504X), + /* K15 */ be_const_int(3), + /* K16 */ be_nested_str_weak(status), + /* K17 */ be_nested_str_weak(matter), + /* K18 */ be_nested_str_weak(UNSUPPORTED_ENDPOINT), + /* K19 */ be_nested_str_weak(UNSUPPORTED_CLUSTER), + /* K20 */ be_nested_str_weak(UNSUPPORTED_ATTRIBUTE), + /* K21 */ be_nested_str_weak(UNREPORTABLE_ATTRIBUTE), + }), + be_str_weak(process_attribute_expansion), + &be_const_str_solidified, + ( &(const binstruction[216]) { /* code */ + 0x840C0000, // 0000 CLOSURE R3 P0 + 0xA4120000, // 0001 IMPORT R4 K0 + 0x88140301, // 0002 GETMBR R5 R1 K1 + 0x50180000, // 0003 LDBOOL R6 0 0 + 0x881C0302, // 0004 GETMBR R7 R1 K2 + 0x50200000, // 0005 LDBOOL R8 0 0 + 0x88240303, // 0006 GETMBR R9 R1 K3 + 0x50280000, // 0007 LDBOOL R10 0 0 + 0x882C0301, // 0008 GETMBR R11 R1 K1 + 0x4C300000, // 0009 LDNIL R12 + 0x202C160C, // 000A NE R11 R11 R12 + 0x782E0007, // 000B JMPF R11 #0014 + 0x882C0302, // 000C GETMBR R11 R1 K2 + 0x4C300000, // 000D LDNIL R12 + 0x202C160C, // 000E NE R11 R11 R12 + 0x782E0003, // 000F JMPF R11 #0014 + 0x882C0303, // 0010 GETMBR R11 R1 K3 + 0x4C300000, // 0011 LDNIL R12 + 0x202C160C, // 0012 NE R11 R11 R12 + 0x742E0000, // 0013 JMPT R11 #0015 + 0x502C0001, // 0014 LDBOOL R11 0 1 + 0x502C0200, // 0015 LDBOOL R11 1 0 + 0x60300013, // 0016 GETGBL R12 G19 + 0x7C300000, // 0017 CALL R12 0 + 0x60340010, // 0018 GETGBL R13 G16 + 0x88380104, // 0019 GETMBR R14 R0 K4 + 0x7C340200, // 001A CALL R13 1 + 0xA8020055, // 001B EXBLK 0 #0072 + 0x5C381A00, // 001C MOVE R14 R13 + 0x7C380000, // 001D CALL R14 0 + 0x8C3C1D05, // 001E GETMET R15 R14 K5 + 0x7C3C0200, // 001F CALL R15 1 + 0x4C400000, // 0020 LDNIL R16 + 0x20400A10, // 0021 NE R16 R5 R16 + 0x78420002, // 0022 JMPF R16 #0026 + 0x20401E05, // 0023 NE R16 R15 R5 + 0x78420000, // 0024 JMPF R16 #0026 + 0x7001FFF5, // 0025 JMP #001C + 0x8C401906, // 0026 GETMET R16 R12 K6 + 0x5C481E00, // 0027 MOVE R18 R15 + 0x7C400400, // 0028 CALL R16 2 + 0x74420002, // 0029 JMPT R16 #002D + 0x60400013, // 002A GETGBL R16 G19 + 0x7C400000, // 002B CALL R16 0 + 0x98301E10, // 002C SETIDX R12 R15 R16 + 0x50180200, // 002D LDBOOL R6 1 0 + 0x8C401D07, // 002E GETMET R16 R14 K7 + 0x5C481E00, // 002F MOVE R18 R15 + 0x7C400400, // 0030 CALL R16 2 + 0x60440010, // 0031 GETGBL R17 G16 + 0x5C482000, // 0032 MOVE R18 R16 + 0x7C440200, // 0033 CALL R17 1 + 0xA8020038, // 0034 EXBLK 0 #006E + 0x5C482200, // 0035 MOVE R18 R17 + 0x7C480000, // 0036 CALL R18 0 + 0x4C4C0000, // 0037 LDNIL R19 + 0x204C0E13, // 0038 NE R19 R7 R19 + 0x784E0002, // 0039 JMPF R19 #003D + 0x204C2407, // 003A NE R19 R18 R7 + 0x784E0000, // 003B JMPF R19 #003D + 0x7001FFF7, // 003C JMP #0035 + 0x944C180F, // 003D GETIDX R19 R12 R15 + 0x8C4C2706, // 003E GETMET R19 R19 K6 + 0x5C542400, // 003F MOVE R21 R18 + 0x7C4C0400, // 0040 CALL R19 2 + 0x744E0003, // 0041 JMPT R19 #0046 + 0x944C180F, // 0042 GETIDX R19 R12 R15 + 0x60500013, // 0043 GETGBL R20 G19 + 0x7C500000, // 0044 CALL R20 0 + 0x984C2414, // 0045 SETIDX R19 R18 R20 + 0x50200200, // 0046 LDBOOL R8 1 0 + 0x8C4C1D08, // 0047 GETMET R19 R14 K8 + 0x5C541E00, // 0048 MOVE R21 R15 + 0x5C582400, // 0049 MOVE R22 R18 + 0x7C4C0600, // 004A CALL R19 3 + 0x60500010, // 004B GETGBL R20 G16 + 0x5C542600, // 004C MOVE R21 R19 + 0x7C500200, // 004D CALL R20 1 + 0xA802001A, // 004E EXBLK 0 #006A + 0x5C542800, // 004F MOVE R21 R20 + 0x7C540000, // 0050 CALL R21 0 + 0x4C580000, // 0051 LDNIL R22 + 0x20581216, // 0052 NE R22 R9 R22 + 0x785A0002, // 0053 JMPF R22 #0057 + 0x20582A09, // 0054 NE R22 R21 R9 + 0x785A0000, // 0055 JMPF R22 #0057 + 0x7001FFF7, // 0056 JMP #004F + 0x9458180F, // 0057 GETIDX R22 R12 R15 + 0x94582C12, // 0058 GETIDX R22 R22 R18 + 0x8C582D06, // 0059 GETMET R22 R22 K6 + 0x5C602A00, // 005A MOVE R24 R21 + 0x7C580400, // 005B CALL R22 2 + 0x745A0004, // 005C JMPT R22 #0062 + 0x9458180F, // 005D GETIDX R22 R12 R15 + 0x94582C12, // 005E GETIDX R22 R22 R18 + 0x605C0012, // 005F GETGBL R23 G18 + 0x7C5C0000, // 0060 CALL R23 0 + 0x98582A17, // 0061 SETIDX R22 R21 R23 + 0x50280200, // 0062 LDBOOL R10 1 0 + 0x9458180F, // 0063 GETIDX R22 R12 R15 + 0x94582C12, // 0064 GETIDX R22 R22 R18 + 0x94582C15, // 0065 GETIDX R22 R22 R21 + 0x8C582D09, // 0066 GETMET R22 R22 K9 + 0x5C601C00, // 0067 MOVE R24 R14 + 0x7C580400, // 0068 CALL R22 2 + 0x7001FFE4, // 0069 JMP #004F + 0x5850000A, // 006A LDCONST R20 K10 + 0xAC500200, // 006B CATCH R20 1 0 + 0xB0080000, // 006C RAISE 2 R0 R0 + 0x7001FFC6, // 006D JMP #0035 + 0x5844000A, // 006E LDCONST R17 K10 + 0xAC440200, // 006F CATCH R17 1 0 + 0xB0080000, // 0070 RAISE 2 R0 R0 + 0x7001FFA9, // 0071 JMP #001C + 0x5834000A, // 0072 LDCONST R13 K10 + 0xAC340200, // 0073 CATCH R13 1 0 + 0xB0080000, // 0074 RAISE 2 R0 R0 + 0x60340010, // 0075 GETGBL R13 G16 + 0x5C380600, // 0076 MOVE R14 R3 + 0x5C3C1800, // 0077 MOVE R15 R12 + 0x7C380200, // 0078 CALL R14 1 + 0x7C340200, // 0079 CALL R13 1 + 0xA802003D, // 007A EXBLK 0 #00B9 + 0x5C381A00, // 007B MOVE R14 R13 + 0x7C380000, // 007C CALL R14 0 + 0x603C0010, // 007D GETGBL R15 G16 + 0x5C400600, // 007E MOVE R16 R3 + 0x9444180E, // 007F GETIDX R17 R12 R14 + 0x7C400200, // 0080 CALL R16 1 + 0x7C3C0200, // 0081 CALL R15 1 + 0xA8020031, // 0082 EXBLK 0 #00B5 + 0x5C401E00, // 0083 MOVE R16 R15 + 0x7C400000, // 0084 CALL R16 0 + 0x60440010, // 0085 GETGBL R17 G16 + 0x5C480600, // 0086 MOVE R18 R3 + 0x944C180E, // 0087 GETIDX R19 R12 R14 + 0x944C2610, // 0088 GETIDX R19 R19 R16 + 0x7C480200, // 0089 CALL R18 1 + 0x7C440200, // 008A CALL R17 1 + 0xA8020024, // 008B EXBLK 0 #00B1 + 0x5C482200, // 008C MOVE R18 R17 + 0x7C480000, // 008D CALL R18 0 + 0x604C0010, // 008E GETGBL R19 G16 + 0x9450180E, // 008F GETIDX R20 R12 R14 + 0x94502810, // 0090 GETIDX R20 R20 R16 + 0x94502812, // 0091 GETIDX R20 R20 R18 + 0x7C4C0200, // 0092 CALL R19 1 + 0xA8020018, // 0093 EXBLK 0 #00AD + 0x5C502600, // 0094 MOVE R20 R19 + 0x7C500000, // 0095 CALL R20 0 + 0xB8561600, // 0096 GETNGBL R21 K11 + 0x8C542B0C, // 0097 GETMET R21 R21 K12 + 0x8C5C090D, // 0098 GETMET R23 R4 K13 + 0x5864000E, // 0099 LDCONST R25 K14 + 0x5C681C00, // 009A MOVE R26 R14 + 0x5C6C2000, // 009B MOVE R27 R16 + 0x5C702400, // 009C MOVE R28 R18 + 0x7C5C0A00, // 009D CALL R23 5 + 0x5860000F, // 009E LDCONST R24 K15 + 0x7C540600, // 009F CALL R21 3 + 0x9006020E, // 00A0 SETMBR R1 K1 R14 + 0x90060410, // 00A1 SETMBR R1 K2 R16 + 0x90060612, // 00A2 SETMBR R1 K3 R18 + 0x5C540400, // 00A3 MOVE R21 R2 + 0x5C582800, // 00A4 MOVE R22 R20 + 0x5C5C0200, // 00A5 MOVE R23 R1 + 0x5C601600, // 00A6 MOVE R24 R11 + 0x7C540600, // 00A7 CALL R21 3 + 0x782E0002, // 00A8 JMPF R11 #00AC + 0x78560001, // 00A9 JMPF R21 #00AC + 0xA8040004, // 00AA EXBLK 1 4 + 0x80002C00, // 00AB RET 0 + 0x7001FFE6, // 00AC JMP #0094 + 0x584C000A, // 00AD LDCONST R19 K10 + 0xAC4C0200, // 00AE CATCH R19 1 0 + 0xB0080000, // 00AF RAISE 2 R0 R0 + 0x7001FFDA, // 00B0 JMP #008C + 0x5844000A, // 00B1 LDCONST R17 K10 + 0xAC440200, // 00B2 CATCH R17 1 0 + 0xB0080000, // 00B3 RAISE 2 R0 R0 + 0x7001FFCD, // 00B4 JMP #0083 + 0x583C000A, // 00B5 LDCONST R15 K10 + 0xAC3C0200, // 00B6 CATCH R15 1 0 + 0xB0080000, // 00B7 RAISE 2 R0 R0 + 0x7001FFC1, // 00B8 JMP #007B + 0x5834000A, // 00B9 LDCONST R13 K10 + 0xAC340200, // 00BA CATCH R13 1 0 + 0xB0080000, // 00BB RAISE 2 R0 R0 + 0x782E0019, // 00BC JMPF R11 #00D7 + 0x5C340C00, // 00BD MOVE R13 R6 + 0x74360003, // 00BE JMPT R13 #00C3 + 0xB8362200, // 00BF GETNGBL R13 K17 + 0x88341B12, // 00C0 GETMBR R13 R13 K18 + 0x9006200D, // 00C1 SETMBR R1 K16 R13 + 0x7002000E, // 00C2 JMP #00D2 + 0x5C341000, // 00C3 MOVE R13 R8 + 0x74360003, // 00C4 JMPT R13 #00C9 + 0xB8362200, // 00C5 GETNGBL R13 K17 + 0x88341B13, // 00C6 GETMBR R13 R13 K19 + 0x9006200D, // 00C7 SETMBR R1 K16 R13 + 0x70020008, // 00C8 JMP #00D2 + 0x5C341400, // 00C9 MOVE R13 R10 + 0x74360003, // 00CA JMPT R13 #00CF + 0xB8362200, // 00CB GETNGBL R13 K17 + 0x88341B14, // 00CC GETMBR R13 R13 K20 + 0x9006200D, // 00CD SETMBR R1 K16 R13 + 0x70020002, // 00CE JMP #00D2 + 0xB8362200, // 00CF GETNGBL R13 K17 + 0x88341B15, // 00D0 GETMBR R13 R13 K21 + 0x9006200D, // 00D1 SETMBR R1 K16 R13 + 0x5C340400, // 00D2 MOVE R13 R2 + 0x4C380000, // 00D3 LDNIL R14 + 0x5C3C0200, // 00D4 MOVE R15 R1 + 0x50400200, // 00D5 LDBOOL R16 1 0 + 0x7C340600, // 00D6 CALL R13 3 + 0x80000000, // 00D7 RET 0 }) ) ); @@ -515,11 +3163,11 @@ be_local_closure(Matter_Device_mdns_announce_PASE, /* name */ /******************************************************************** -** Solidified function: every_second +** Solidified function: stop_basic_commissioning ********************************************************************/ -be_local_closure(Matter_Device_every_second, /* name */ +be_local_closure(Matter_Device_stop_basic_commissioning, /* name */ be_nested_proto( - 4, /* nstack */ + 5, /* nstack */ 1, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -527,50 +3175,49 @@ be_local_closure(Matter_Device_every_second, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[ 9]) { /* constants */ - /* K0 */ be_nested_str_weak(sessions), - /* K1 */ be_nested_str_weak(every_second), - /* K2 */ be_nested_str_weak(message_handler), - /* K3 */ be_nested_str_weak(commissioning_open), - /* K4 */ be_nested_str_weak(tasmota), - /* K5 */ be_nested_str_weak(time_reached), - /* K6 */ be_const_int(0), - /* K7 */ be_nested_str_weak(plugins), - /* K8 */ be_const_int(1), + ( &(const bvalue[13]) { /* constants */ + /* K0 */ be_nested_str_weak(is_root_commissioning_open), + /* K1 */ be_nested_str_weak(tasmota), + /* K2 */ be_nested_str_weak(publish_result), + /* K3 */ be_nested_str_weak(_X7B_X22Matter_X22_X3A_X7B_X22Commissioning_X22_X3A0_X7D_X7D), + /* K4 */ be_nested_str_weak(Matter), + /* K5 */ be_nested_str_weak(commissioning_open), + /* K6 */ be_nested_str_weak(mdns_remove_PASE), + /* K7 */ be_nested_str_weak(commissioning_iterations), + /* K8 */ be_nested_str_weak(commissioning_discriminator), + /* K9 */ be_nested_str_weak(commissioning_salt), + /* K10 */ be_nested_str_weak(commissioning_w0), + /* K11 */ be_nested_str_weak(commissioning_L), + /* K12 */ be_nested_str_weak(commissioning_admin_fabric), }), - be_str_weak(every_second), + be_str_weak(stop_basic_commissioning), &be_const_str_solidified, - ( &(const binstruction[30]) { /* code */ - 0x88040100, // 0000 GETMBR R1 R0 K0 - 0x8C040301, // 0001 GETMET R1 R1 K1 - 0x7C040200, // 0002 CALL R1 1 - 0x88040102, // 0003 GETMBR R1 R0 K2 - 0x8C040301, // 0004 GETMET R1 R1 K1 - 0x7C040200, // 0005 CALL R1 1 - 0x88040103, // 0006 GETMBR R1 R0 K3 - 0x4C080000, // 0007 LDNIL R2 - 0x20040202, // 0008 NE R1 R1 R2 - 0x78060006, // 0009 JMPF R1 #0011 - 0xB8060800, // 000A GETNGBL R1 K4 - 0x8C040305, // 000B GETMET R1 R1 K5 - 0x880C0103, // 000C GETMBR R3 R0 K3 - 0x7C040400, // 000D CALL R1 2 - 0x78060001, // 000E JMPF R1 #0011 - 0x4C040000, // 000F LDNIL R1 - 0x90020601, // 0010 SETMBR R0 K3 R1 - 0x58040006, // 0011 LDCONST R1 K6 - 0x6008000C, // 0012 GETGBL R2 G12 - 0x880C0107, // 0013 GETMBR R3 R0 K7 - 0x7C080200, // 0014 CALL R2 1 - 0x14080202, // 0015 LT R2 R1 R2 - 0x780A0005, // 0016 JMPF R2 #001D - 0x88080107, // 0017 GETMBR R2 R0 K7 - 0x94080401, // 0018 GETIDX R2 R2 R1 - 0x8C080501, // 0019 GETMET R2 R2 K1 - 0x7C080200, // 001A CALL R2 1 - 0x00040308, // 001B ADD R1 R1 K8 - 0x7001FFF4, // 001C JMP #0012 - 0x80000000, // 001D RET 0 + ( &(const binstruction[25]) { /* code */ + 0x8C040100, // 0000 GETMET R1 R0 K0 + 0x7C040200, // 0001 CALL R1 1 + 0x78060004, // 0002 JMPF R1 #0008 + 0xB8060200, // 0003 GETNGBL R1 K1 + 0x8C040302, // 0004 GETMET R1 R1 K2 + 0x580C0003, // 0005 LDCONST R3 K3 + 0x58100004, // 0006 LDCONST R4 K4 + 0x7C040600, // 0007 CALL R1 3 + 0x4C040000, // 0008 LDNIL R1 + 0x90020A01, // 0009 SETMBR R0 K5 R1 + 0x8C040106, // 000A GETMET R1 R0 K6 + 0x7C040200, // 000B CALL R1 1 + 0x4C040000, // 000C LDNIL R1 + 0x90020E01, // 000D SETMBR R0 K7 R1 + 0x4C040000, // 000E LDNIL R1 + 0x90021001, // 000F SETMBR R0 K8 R1 + 0x4C040000, // 0010 LDNIL R1 + 0x90021201, // 0011 SETMBR R0 K9 R1 + 0x4C040000, // 0012 LDNIL R1 + 0x90021401, // 0013 SETMBR R0 K10 R1 + 0x4C040000, // 0014 LDNIL R1 + 0x90021601, // 0015 SETMBR R0 K11 R1 + 0x4C040000, // 0016 LDNIL R1 + 0x90021801, // 0017 SETMBR R0 K12 R1 + 0x80000000, // 0018 RET 0 }) ) ); @@ -578,95 +3225,30 @@ be_local_closure(Matter_Device_every_second, /* name */ /******************************************************************** -** Solidified function: _init_basic_commissioning +** Solidified function: received_ack ********************************************************************/ -be_local_closure(Matter_Device__init_basic_commissioning, /* name */ +be_local_closure(Matter_Device_received_ack, /* name */ be_nested_proto( - 3, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 4]) { /* constants */ - /* K0 */ be_nested_str_weak(sessions), - /* K1 */ be_nested_str_weak(count_active_fabrics), - /* K2 */ be_const_int(0), - /* K3 */ be_nested_str_weak(start_root_basic_commissioning), - }), - be_str_weak(_init_basic_commissioning), - &be_const_str_solidified, - ( &(const binstruction[ 8]) { /* code */ - 0x88040100, // 0000 GETMBR R1 R0 K0 - 0x8C040301, // 0001 GETMET R1 R1 K1 - 0x7C040200, // 0002 CALL R1 1 - 0x1C040302, // 0003 EQ R1 R1 K2 - 0x78060001, // 0004 JMPF R1 #0007 - 0x8C040103, // 0005 GETMET R1 R0 K3 - 0x7C040200, // 0006 CALL R1 1 - 0x80000000, // 0007 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: start_operational_discovery_deferred -********************************************************************/ -be_local_closure(Matter_Device_start_operational_discovery_deferred, /* name */ - be_nested_proto( - 6, /* nstack */ + 5, /* nstack */ 2, /* argc */ 2, /* varg */ 0, /* has upvals */ NULL, /* no upvals */ - 1, /* has sup protos */ - ( &(const struct bproto*[ 1]) { - be_nested_proto( - 3, /* nstack */ - 0, /* argc */ - 0, /* varg */ - 1, /* has upvals */ - ( &(const bupvaldesc[ 2]) { /* upvals */ - be_local_const_upval(1, 0), - be_local_const_upval(1, 1), - }), - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 1]) { /* constants */ - /* K0 */ be_nested_str_weak(start_operational_discovery), - }), - be_str_weak(_X3Clambda_X3E), - &be_const_str_solidified, - ( &(const binstruction[ 5]) { /* code */ - 0x68000000, // 0000 GETUPV R0 U0 - 0x8C000100, // 0001 GETMET R0 R0 K0 - 0x68080001, // 0002 GETUPV R2 U1 - 0x7C000400, // 0003 CALL R0 2 - 0x80040000, // 0004 RET 1 R0 - }) - ), - }), + 0, /* has sup protos */ + NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[ 3]) { /* constants */ - /* K0 */ be_nested_str_weak(tasmota), - /* K1 */ be_nested_str_weak(set_timer), - /* K2 */ be_const_int(0), + ( &(const bvalue[ 2]) { /* constants */ + /* K0 */ be_nested_str_weak(udp_server), + /* K1 */ be_nested_str_weak(received_ack), }), - be_str_weak(start_operational_discovery_deferred), + be_str_weak(received_ack), &be_const_str_solidified, - ( &(const binstruction[ 7]) { /* code */ - 0xB80A0000, // 0000 GETNGBL R2 K0 + ( &(const binstruction[ 5]) { /* code */ + 0x88080100, // 0000 GETMBR R2 R0 K0 0x8C080501, // 0001 GETMET R2 R2 K1 - 0x58100002, // 0002 LDCONST R4 K2 - 0x84140000, // 0003 CLOSURE R5 P0 - 0x7C080600, // 0004 CALL R2 3 - 0xA0000000, // 0005 CLOSE R0 - 0x80000000, // 0006 RET 0 + 0x5C100200, // 0002 MOVE R4 R1 + 0x7C080400, // 0003 CALL R2 2 + 0x80040400, // 0004 RET 1 R2 }) ) ); @@ -674,9 +3256,136 @@ be_local_closure(Matter_Device_start_operational_discovery_deferred, /* name * /******************************************************************** -** Solidified function: mdns_announce_op_discovery_all_fabrics +** Solidified function: load_param ********************************************************************/ -be_local_closure(Matter_Device_mdns_announce_op_discovery_all_fabrics, /* name */ +be_local_closure(Matter_Device_load_param, /* name */ + be_nested_proto( + 12, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[24]) { /* constants */ + /* K0 */ be_nested_str_weak(string), + /* K1 */ be_nested_str_weak(crypto), + /* K2 */ be_nested_str_weak(FILENAME), + /* K3 */ be_nested_str_weak(read), + /* K4 */ be_nested_str_weak(close), + /* K5 */ be_nested_str_weak(json), + /* K6 */ be_nested_str_weak(load), + /* K7 */ be_nested_str_weak(root_discriminator), + /* K8 */ be_nested_str_weak(find), + /* K9 */ be_nested_str_weak(distinguish), + /* K10 */ be_nested_str_weak(root_passcode), + /* K11 */ be_nested_str_weak(passcode), + /* K12 */ be_nested_str_weak(ipv4only), + /* K13 */ be_nested_str_weak(io_error), + /* K14 */ be_nested_str_weak(tasmota), + /* K15 */ be_nested_str_weak(log), + /* K16 */ be_nested_str_weak(MTR_X3A_X20Session_Store_X3A_X3Aload_X20Exception_X3A), + /* K17 */ be_nested_str_weak(_X7C), + /* K18 */ be_const_int(2), + /* K19 */ be_nested_str_weak(random), + /* K20 */ be_nested_str_weak(get), + /* K21 */ be_const_int(0), + /* K22 */ be_nested_str_weak(PASSCODE_DEFAULT), + /* K23 */ be_nested_str_weak(save_param), + }), + be_str_weak(load_param), + &be_const_str_solidified, + ( &(const binstruction[79]) { /* code */ + 0xA4060000, // 0000 IMPORT R1 K0 + 0xA40A0200, // 0001 IMPORT R2 K1 + 0xA802001D, // 0002 EXBLK 0 #0021 + 0x600C0011, // 0003 GETGBL R3 G17 + 0x88100102, // 0004 GETMBR R4 R0 K2 + 0x7C0C0200, // 0005 CALL R3 1 + 0x8C100703, // 0006 GETMET R4 R3 K3 + 0x7C100200, // 0007 CALL R4 1 + 0x8C140704, // 0008 GETMET R5 R3 K4 + 0x7C140200, // 0009 CALL R5 1 + 0xA4160A00, // 000A IMPORT R5 K5 + 0x8C180B06, // 000B GETMET R6 R5 K6 + 0x5C200800, // 000C MOVE R8 R4 + 0x7C180400, // 000D CALL R6 2 + 0x8C1C0D08, // 000E GETMET R7 R6 K8 + 0x58240009, // 000F LDCONST R9 K9 + 0x88280107, // 0010 GETMBR R10 R0 K7 + 0x7C1C0600, // 0011 CALL R7 3 + 0x90020E07, // 0012 SETMBR R0 K7 R7 + 0x8C1C0D08, // 0013 GETMET R7 R6 K8 + 0x5824000B, // 0014 LDCONST R9 K11 + 0x8828010A, // 0015 GETMBR R10 R0 K10 + 0x7C1C0600, // 0016 CALL R7 3 + 0x90021407, // 0017 SETMBR R0 K10 R7 + 0x601C0017, // 0018 GETGBL R7 G23 + 0x8C200D08, // 0019 GETMET R8 R6 K8 + 0x5828000C, // 001A LDCONST R10 K12 + 0x502C0000, // 001B LDBOOL R11 0 0 + 0x7C200600, // 001C CALL R8 3 + 0x7C1C0200, // 001D CALL R7 1 + 0x90021807, // 001E SETMBR R0 K12 R7 + 0xA8040001, // 001F EXBLK 1 1 + 0x70020012, // 0020 JMP #0034 + 0xAC0C0002, // 0021 CATCH R3 0 2 + 0x7002000F, // 0022 JMP #0033 + 0x2014070D, // 0023 NE R5 R3 K13 + 0x7816000C, // 0024 JMPF R5 #0032 + 0xB8161C00, // 0025 GETNGBL R5 K14 + 0x8C140B0F, // 0026 GETMET R5 R5 K15 + 0x601C0008, // 0027 GETGBL R7 G8 + 0x5C200600, // 0028 MOVE R8 R3 + 0x7C1C0200, // 0029 CALL R7 1 + 0x001E2007, // 002A ADD R7 K16 R7 + 0x001C0F11, // 002B ADD R7 R7 K17 + 0x60200008, // 002C GETGBL R8 G8 + 0x5C240800, // 002D MOVE R9 R4 + 0x7C200200, // 002E CALL R8 1 + 0x001C0E08, // 002F ADD R7 R7 R8 + 0x58200012, // 0030 LDCONST R8 K18 + 0x7C140600, // 0031 CALL R5 3 + 0x70020000, // 0032 JMP #0034 + 0xB0080000, // 0033 RAISE 2 R0 R0 + 0x500C0000, // 0034 LDBOOL R3 0 0 + 0x88100107, // 0035 GETMBR R4 R0 K7 + 0x4C140000, // 0036 LDNIL R5 + 0x1C100805, // 0037 EQ R4 R4 R5 + 0x7812000A, // 0038 JMPF R4 #0044 + 0x8C100513, // 0039 GETMET R4 R2 K19 + 0x58180012, // 003A LDCONST R6 K18 + 0x7C100400, // 003B CALL R4 2 + 0x8C100914, // 003C GETMET R4 R4 K20 + 0x58180015, // 003D LDCONST R6 K21 + 0x581C0012, // 003E LDCONST R7 K18 + 0x7C100600, // 003F CALL R4 3 + 0x54160FFE, // 0040 LDINT R5 4095 + 0x2C100805, // 0041 AND R4 R4 R5 + 0x90020E04, // 0042 SETMBR R0 K7 R4 + 0x500C0200, // 0043 LDBOOL R3 1 0 + 0x8810010A, // 0044 GETMBR R4 R0 K10 + 0x4C140000, // 0045 LDNIL R5 + 0x1C100805, // 0046 EQ R4 R4 R5 + 0x78120002, // 0047 JMPF R4 #004B + 0x88100116, // 0048 GETMBR R4 R0 K22 + 0x90021404, // 0049 SETMBR R0 K10 R4 + 0x500C0200, // 004A LDBOOL R3 1 0 + 0x780E0001, // 004B JMPF R3 #004E + 0x8C100117, // 004C GETMET R4 R0 K23 + 0x7C100200, // 004D CALL R4 1 + 0x80000000, // 004E RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: mdns_remove_op_discovery_all_fabrics +********************************************************************/ +be_local_closure(Matter_Device_mdns_remove_op_discovery_all_fabrics, /* name */ be_nested_proto( 6, /* nstack */ 1, /* argc */ @@ -691,10 +3400,10 @@ be_local_closure(Matter_Device_mdns_announce_op_discovery_all_fabrics, /* name /* K1 */ be_nested_str_weak(active_fabrics), /* K2 */ be_nested_str_weak(get_device_id), /* K3 */ be_nested_str_weak(get_fabric_id), - /* K4 */ be_nested_str_weak(mdns_announce_op_discovery), + /* K4 */ be_nested_str_weak(mdns_remove_op_discovery), /* K5 */ be_nested_str_weak(stop_iteration), }), - be_str_weak(mdns_announce_op_discovery_all_fabrics), + be_str_weak(mdns_remove_op_discovery_all_fabrics), &be_const_str_solidified, ( &(const binstruction[22]) { /* code */ 0x60040010, // 0000 GETGBL R1 G16 @@ -811,1594 +3520,6 @@ be_local_closure(Matter_Device_save_param, /* name */ /*******************************************************************/ -/******************************************************************** -** Solidified function: sort_distinct -********************************************************************/ -be_local_closure(Matter_Device_sort_distinct, /* name */ - be_nested_proto( - 7, /* nstack */ - 1, /* argc */ - 4, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 5]) { /* constants */ - /* K0 */ be_const_class(be_class_Matter_Device), - /* K1 */ be_const_int(1), - /* K2 */ be_const_int(0), - /* K3 */ be_nested_str_weak(stop_iteration), - /* K4 */ be_nested_str_weak(remove), - }), - be_str_weak(sort_distinct), - &be_const_str_solidified, - ( &(const binstruction[53]) { /* code */ - 0x58040000, // 0000 LDCONST R1 K0 - 0x60080010, // 0001 GETGBL R2 G16 - 0x600C000C, // 0002 GETGBL R3 G12 - 0x5C100000, // 0003 MOVE R4 R0 - 0x7C0C0200, // 0004 CALL R3 1 - 0x040C0701, // 0005 SUB R3 R3 K1 - 0x400E0203, // 0006 CONNECT R3 K1 R3 - 0x7C080200, // 0007 CALL R2 1 - 0xA8020010, // 0008 EXBLK 0 #001A - 0x5C0C0400, // 0009 MOVE R3 R2 - 0x7C0C0000, // 000A CALL R3 0 - 0x94100003, // 000B GETIDX R4 R0 R3 - 0x5C140600, // 000C MOVE R5 R3 - 0x24180B02, // 000D GT R6 R5 K2 - 0x781A0008, // 000E JMPF R6 #0018 - 0x04180B01, // 000F SUB R6 R5 K1 - 0x94180006, // 0010 GETIDX R6 R0 R6 - 0x24180C04, // 0011 GT R6 R6 R4 - 0x781A0004, // 0012 JMPF R6 #0018 - 0x04180B01, // 0013 SUB R6 R5 K1 - 0x94180006, // 0014 GETIDX R6 R0 R6 - 0x98000A06, // 0015 SETIDX R0 R5 R6 - 0x04140B01, // 0016 SUB R5 R5 K1 - 0x7001FFF4, // 0017 JMP #000D - 0x98000A04, // 0018 SETIDX R0 R5 R4 - 0x7001FFEE, // 0019 JMP #0009 - 0x58080003, // 001A LDCONST R2 K3 - 0xAC080200, // 001B CATCH R2 1 0 - 0xB0080000, // 001C RAISE 2 R0 R0 - 0x58080001, // 001D LDCONST R2 K1 - 0x600C000C, // 001E GETGBL R3 G12 - 0x5C100000, // 001F MOVE R4 R0 - 0x7C0C0200, // 0020 CALL R3 1 - 0x180C0701, // 0021 LE R3 R3 K1 - 0x780E0000, // 0022 JMPF R3 #0024 - 0x80040000, // 0023 RET 1 R0 - 0x940C0102, // 0024 GETIDX R3 R0 K2 - 0x6010000C, // 0025 GETGBL R4 G12 - 0x5C140000, // 0026 MOVE R5 R0 - 0x7C100200, // 0027 CALL R4 1 - 0x14100404, // 0028 LT R4 R2 R4 - 0x78120009, // 0029 JMPF R4 #0034 - 0x94100002, // 002A GETIDX R4 R0 R2 - 0x1C100803, // 002B EQ R4 R4 R3 - 0x78120003, // 002C JMPF R4 #0031 - 0x8C100104, // 002D GETMET R4 R0 K4 - 0x5C180400, // 002E MOVE R6 R2 - 0x7C100400, // 002F CALL R4 2 - 0x70020001, // 0030 JMP #0033 - 0x940C0002, // 0031 GETIDX R3 R0 R2 - 0x00080501, // 0032 ADD R2 R2 K1 - 0x7001FFF0, // 0033 JMP #0025 - 0x80040000, // 0034 RET 1 R0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: stop_basic_commissioning -********************************************************************/ -be_local_closure(Matter_Device_stop_basic_commissioning, /* name */ - be_nested_proto( - 5, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[13]) { /* constants */ - /* K0 */ be_nested_str_weak(is_root_commissioning_open), - /* K1 */ be_nested_str_weak(tasmota), - /* K2 */ be_nested_str_weak(publish_result), - /* K3 */ be_nested_str_weak(_X7B_X22Matter_X22_X3A_X7B_X22Commissioning_X22_X3A0_X7D_X7D), - /* K4 */ be_nested_str_weak(Matter), - /* K5 */ be_nested_str_weak(commissioning_open), - /* K6 */ be_nested_str_weak(mdns_remove_PASE), - /* K7 */ be_nested_str_weak(commissioning_iterations), - /* K8 */ be_nested_str_weak(commissioning_discriminator), - /* K9 */ be_nested_str_weak(commissioning_salt), - /* K10 */ be_nested_str_weak(commissioning_w0), - /* K11 */ be_nested_str_weak(commissioning_L), - /* K12 */ be_nested_str_weak(commissioning_admin_fabric), - }), - be_str_weak(stop_basic_commissioning), - &be_const_str_solidified, - ( &(const binstruction[25]) { /* code */ - 0x8C040100, // 0000 GETMET R1 R0 K0 - 0x7C040200, // 0001 CALL R1 1 - 0x78060004, // 0002 JMPF R1 #0008 - 0xB8060200, // 0003 GETNGBL R1 K1 - 0x8C040302, // 0004 GETMET R1 R1 K2 - 0x580C0003, // 0005 LDCONST R3 K3 - 0x58100004, // 0006 LDCONST R4 K4 - 0x7C040600, // 0007 CALL R1 3 - 0x4C040000, // 0008 LDNIL R1 - 0x90020A01, // 0009 SETMBR R0 K5 R1 - 0x8C040106, // 000A GETMET R1 R0 K6 - 0x7C040200, // 000B CALL R1 1 - 0x4C040000, // 000C LDNIL R1 - 0x90020E01, // 000D SETMBR R0 K7 R1 - 0x4C040000, // 000E LDNIL R1 - 0x90021001, // 000F SETMBR R0 K8 R1 - 0x4C040000, // 0010 LDNIL R1 - 0x90021201, // 0011 SETMBR R0 K9 R1 - 0x4C040000, // 0012 LDNIL R1 - 0x90021401, // 0013 SETMBR R0 K10 R1 - 0x4C040000, // 0014 LDNIL R1 - 0x90021601, // 0015 SETMBR R0 K11 R1 - 0x4C040000, // 0016 LDNIL R1 - 0x90021801, // 0017 SETMBR R0 K12 R1 - 0x80000000, // 0018 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: start -********************************************************************/ -be_local_closure(Matter_Device_start, /* name */ - be_nested_proto( - 7, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 1, /* has sup protos */ - ( &(const struct bproto*[ 1]) { - be_nested_proto( - 2, /* nstack */ - 0, /* argc */ - 0, /* varg */ - 1, /* has upvals */ - ( &(const bupvaldesc[ 1]) { /* upvals */ - be_local_const_upval(1, 0), - }), - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 1]) { /* constants */ - /* K0 */ be_nested_str_weak(_trigger_read_sensors), - }), - be_str_weak(_anonymous_), - &be_const_str_solidified, - ( &(const binstruction[ 4]) { /* code */ - 0x68000000, // 0000 GETUPV R0 U0 - 0x8C000100, // 0001 GETMET R0 R0 K0 - 0x7C000200, // 0002 CALL R0 1 - 0x80000000, // 0003 RET 0 - }) - ), - }), - 1, /* has constants */ - ( &(const bvalue[14]) { /* constants */ - /* K0 */ be_nested_str_weak(started), - /* K1 */ be_nested_str_weak(plugins), - /* K2 */ be_nested_str_weak(push), - /* K3 */ be_nested_str_weak(matter), - /* K4 */ be_nested_str_weak(Plugin_Root), - /* K5 */ be_const_int(0), - /* K6 */ be_nested_str_weak(autoconf_device), - /* K7 */ be_nested_str_weak(tasmota), - /* K8 */ be_nested_str_weak(add_cron), - /* K9 */ be_nested_str_weak(_X2A_X2F30_X20_X2A_X20_X2A_X20_X2A_X20_X2A_X20_X2A), - /* K10 */ be_nested_str_weak(matter_sensors_30s), - /* K11 */ be_nested_str_weak(_start_udp), - /* K12 */ be_nested_str_weak(UDP_PORT), - /* K13 */ be_nested_str_weak(start_mdns_announce_hostnames), - }), - be_str_weak(start), - &be_const_str_solidified, - ( &(const binstruction[28]) { /* code */ - 0x88040100, // 0000 GETMBR R1 R0 K0 - 0x78060000, // 0001 JMPF R1 #0003 - 0x80000200, // 0002 RET 0 - 0x88040101, // 0003 GETMBR R1 R0 K1 - 0x8C040302, // 0004 GETMET R1 R1 K2 - 0xB80E0600, // 0005 GETNGBL R3 K3 - 0x8C0C0704, // 0006 GETMET R3 R3 K4 - 0x5C140000, // 0007 MOVE R5 R0 - 0x58180005, // 0008 LDCONST R6 K5 - 0x7C0C0600, // 0009 CALL R3 3 - 0x7C040400, // 000A CALL R1 2 - 0x8C040106, // 000B GETMET R1 R0 K6 - 0x7C040200, // 000C CALL R1 1 - 0xB8060E00, // 000D GETNGBL R1 K7 - 0x8C040308, // 000E GETMET R1 R1 K8 - 0x580C0009, // 000F LDCONST R3 K9 - 0x84100000, // 0010 CLOSURE R4 P0 - 0x5814000A, // 0011 LDCONST R5 K10 - 0x7C040800, // 0012 CALL R1 4 - 0x8C04010B, // 0013 GETMET R1 R0 K11 - 0x880C010C, // 0014 GETMBR R3 R0 K12 - 0x7C040400, // 0015 CALL R1 2 - 0x8C04010D, // 0016 GETMET R1 R0 K13 - 0x7C040200, // 0017 CALL R1 1 - 0x50040200, // 0018 LDBOOL R1 1 0 - 0x90020001, // 0019 SETMBR R0 K0 R1 - 0xA0000000, // 001A CLOSE R0 - 0x80000000, // 001B RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: every_250ms -********************************************************************/ -be_local_closure(Matter_Device_every_250ms, /* name */ - be_nested_proto( - 3, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 2]) { /* constants */ - /* K0 */ be_nested_str_weak(message_handler), - /* K1 */ be_nested_str_weak(every_250ms), - }), - be_str_weak(every_250ms), - &be_const_str_solidified, - ( &(const binstruction[ 4]) { /* code */ - 0x88040100, // 0000 GETMBR R1 R0 K0 - 0x8C040301, // 0001 GETMET R1 R1 K1 - 0x7C040200, // 0002 CALL R1 1 - 0x80000000, // 0003 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: start_root_basic_commissioning -********************************************************************/ -be_local_closure(Matter_Device_start_root_basic_commissioning, /* name */ - be_nested_proto( - 14, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[23]) { /* constants */ - /* K0 */ be_nested_str_weak(string), - /* K1 */ be_nested_str_weak(PASE_TIMEOUT), - /* K2 */ be_nested_str_weak(compute_manual_pairing_code), - /* K3 */ be_nested_str_weak(tasmota), - /* K4 */ be_nested_str_weak(log), - /* K5 */ be_nested_str_weak(format), - /* K6 */ be_nested_str_weak(MTR_X3A_X20Manual_X20pairing_X20code_X3A_X20_X25s_X2D_X25s_X2D_X25s), - /* K7 */ be_const_int(0), - /* K8 */ be_const_int(3), - /* K9 */ be_const_int(2147483647), - /* K10 */ be_const_int(2), - /* K11 */ be_nested_str_weak(compute_qrcode_content), - /* K12 */ be_nested_str_weak(publish_result), - /* K13 */ be_nested_str_weak(_X7B_X22Matter_X22_X3A_X7B_X22Commissioning_X22_X3A1_X2C_X22PairingCode_X22_X3A_X22_X25s_X22_X2C_X22QRCode_X22_X3A_X22_X25s_X22_X7D_X7D), - /* K14 */ be_nested_str_weak(Matter), - /* K15 */ be_nested_str_weak(_compute_pbkdf), - /* K16 */ be_nested_str_weak(root_passcode), - /* K17 */ be_nested_str_weak(root_iterations), - /* K18 */ be_nested_str_weak(root_salt), - /* K19 */ be_nested_str_weak(start_basic_commissioning), - /* K20 */ be_nested_str_weak(root_discriminator), - /* K21 */ be_nested_str_weak(root_w0), - /* K22 */ be_nested_str_weak(root_L), - }), - be_str_weak(start_root_basic_commissioning), - &be_const_str_solidified, - ( &(const binstruction[49]) { /* code */ - 0xA40A0000, // 0000 IMPORT R2 K0 - 0x4C0C0000, // 0001 LDNIL R3 - 0x1C0C0203, // 0002 EQ R3 R1 R3 - 0x780E0000, // 0003 JMPF R3 #0005 - 0x88040101, // 0004 GETMBR R1 R0 K1 - 0x8C0C0102, // 0005 GETMET R3 R0 K2 - 0x7C0C0200, // 0006 CALL R3 1 - 0xB8120600, // 0007 GETNGBL R4 K3 - 0x8C100904, // 0008 GETMET R4 R4 K4 - 0x8C180505, // 0009 GETMET R6 R2 K5 - 0x58200006, // 000A LDCONST R8 K6 - 0x40260F08, // 000B CONNECT R9 K7 K8 - 0x94240609, // 000C GETIDX R9 R3 R9 - 0x542A0003, // 000D LDINT R10 4 - 0x542E0005, // 000E LDINT R11 6 - 0x4028140B, // 000F CONNECT R10 R10 R11 - 0x9428060A, // 0010 GETIDX R10 R3 R10 - 0x542E0006, // 0011 LDINT R11 7 - 0x402C1709, // 0012 CONNECT R11 R11 K9 - 0x942C060B, // 0013 GETIDX R11 R3 R11 - 0x7C180A00, // 0014 CALL R6 5 - 0x581C000A, // 0015 LDCONST R7 K10 - 0x7C100600, // 0016 CALL R4 3 - 0x8C10010B, // 0017 GETMET R4 R0 K11 - 0x7C100200, // 0018 CALL R4 1 - 0xB8160600, // 0019 GETNGBL R5 K3 - 0x8C140B0C, // 001A GETMET R5 R5 K12 - 0x8C1C0505, // 001B GETMET R7 R2 K5 - 0x5824000D, // 001C LDCONST R9 K13 - 0x5C280600, // 001D MOVE R10 R3 - 0x5C2C0800, // 001E MOVE R11 R4 - 0x7C1C0800, // 001F CALL R7 4 - 0x5820000E, // 0020 LDCONST R8 K14 - 0x7C140600, // 0021 CALL R5 3 - 0x8C14010F, // 0022 GETMET R5 R0 K15 - 0x881C0110, // 0023 GETMBR R7 R0 K16 - 0x88200111, // 0024 GETMBR R8 R0 K17 - 0x88240112, // 0025 GETMBR R9 R0 K18 - 0x7C140800, // 0026 CALL R5 4 - 0x8C140113, // 0027 GETMET R5 R0 K19 - 0x5C1C0200, // 0028 MOVE R7 R1 - 0x88200111, // 0029 GETMBR R8 R0 K17 - 0x88240114, // 002A GETMBR R9 R0 K20 - 0x88280112, // 002B GETMBR R10 R0 K18 - 0x882C0115, // 002C GETMBR R11 R0 K21 - 0x88300116, // 002D GETMBR R12 R0 K22 - 0x4C340000, // 002E LDNIL R13 - 0x7C141000, // 002F CALL R5 8 - 0x80000000, // 0030 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: k2l -********************************************************************/ -be_local_closure(Matter_Device_k2l, /* name */ - be_nested_proto( - 8, /* nstack */ - 1, /* argc */ - 4, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 6]) { /* constants */ - /* K0 */ be_const_class(be_class_Matter_Device), - /* K1 */ be_nested_str_weak(keys), - /* K2 */ be_nested_str_weak(push), - /* K3 */ be_nested_str_weak(stop_iteration), - /* K4 */ be_const_int(1), - /* K5 */ be_const_int(0), - }), - be_str_weak(k2l), - &be_const_str_solidified, - ( &(const binstruction[50]) { /* code */ - 0x58040000, // 0000 LDCONST R1 K0 - 0x60080012, // 0001 GETGBL R2 G18 - 0x7C080000, // 0002 CALL R2 0 - 0x4C0C0000, // 0003 LDNIL R3 - 0x1C0C0003, // 0004 EQ R3 R0 R3 - 0x780E0000, // 0005 JMPF R3 #0007 - 0x80040400, // 0006 RET 1 R2 - 0x600C0010, // 0007 GETGBL R3 G16 - 0x8C100101, // 0008 GETMET R4 R0 K1 - 0x7C100200, // 0009 CALL R4 1 - 0x7C0C0200, // 000A CALL R3 1 - 0xA8020005, // 000B EXBLK 0 #0012 - 0x5C100600, // 000C MOVE R4 R3 - 0x7C100000, // 000D CALL R4 0 - 0x8C140502, // 000E GETMET R5 R2 K2 - 0x5C1C0800, // 000F MOVE R7 R4 - 0x7C140400, // 0010 CALL R5 2 - 0x7001FFF9, // 0011 JMP #000C - 0x580C0003, // 0012 LDCONST R3 K3 - 0xAC0C0200, // 0013 CATCH R3 1 0 - 0xB0080000, // 0014 RAISE 2 R0 R0 - 0x600C0010, // 0015 GETGBL R3 G16 - 0x6010000C, // 0016 GETGBL R4 G12 - 0x5C140400, // 0017 MOVE R5 R2 - 0x7C100200, // 0018 CALL R4 1 - 0x04100904, // 0019 SUB R4 R4 K4 - 0x40120804, // 001A CONNECT R4 K4 R4 - 0x7C0C0200, // 001B CALL R3 1 - 0xA8020010, // 001C EXBLK 0 #002E - 0x5C100600, // 001D MOVE R4 R3 - 0x7C100000, // 001E CALL R4 0 - 0x94140404, // 001F GETIDX R5 R2 R4 - 0x5C180800, // 0020 MOVE R6 R4 - 0x241C0D05, // 0021 GT R7 R6 K5 - 0x781E0008, // 0022 JMPF R7 #002C - 0x041C0D04, // 0023 SUB R7 R6 K4 - 0x941C0407, // 0024 GETIDX R7 R2 R7 - 0x241C0E05, // 0025 GT R7 R7 R5 - 0x781E0004, // 0026 JMPF R7 #002C - 0x041C0D04, // 0027 SUB R7 R6 K4 - 0x941C0407, // 0028 GETIDX R7 R2 R7 - 0x98080C07, // 0029 SETIDX R2 R6 R7 - 0x04180D04, // 002A SUB R6 R6 K4 - 0x7001FFF4, // 002B JMP #0021 - 0x98080C05, // 002C SETIDX R2 R6 R5 - 0x7001FFEE, // 002D JMP #001D - 0x580C0003, // 002E LDCONST R3 K3 - 0xAC0C0200, // 002F CATCH R3 1 0 - 0xB0080000, // 0030 RAISE 2 R0 R0 - 0x80040400, // 0031 RET 1 R2 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: attribute_updated -********************************************************************/ -be_local_closure(Matter_Device_attribute_updated, /* name */ - be_nested_proto( - 10, /* nstack */ - 5, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 9]) { /* constants */ - /* K0 */ be_nested_str_weak(matter), - /* K1 */ be_nested_str_weak(Path), - /* K2 */ be_nested_str_weak(endpoint), - /* K3 */ be_nested_str_weak(cluster), - /* K4 */ be_nested_str_weak(attribute), - /* K5 */ be_nested_str_weak(message_handler), - /* K6 */ be_nested_str_weak(im), - /* K7 */ be_nested_str_weak(subs_shop), - /* K8 */ be_nested_str_weak(attribute_updated_ctx), - }), - be_str_weak(attribute_updated), - &be_const_str_solidified, - ( &(const binstruction[18]) { /* code */ - 0x4C140000, // 0000 LDNIL R5 - 0x1C140805, // 0001 EQ R5 R4 R5 - 0x78160000, // 0002 JMPF R5 #0004 - 0x50100000, // 0003 LDBOOL R4 0 0 - 0xB8160000, // 0004 GETNGBL R5 K0 - 0x8C140B01, // 0005 GETMET R5 R5 K1 - 0x7C140200, // 0006 CALL R5 1 - 0x90160401, // 0007 SETMBR R5 K2 R1 - 0x90160602, // 0008 SETMBR R5 K3 R2 - 0x90160803, // 0009 SETMBR R5 K4 R3 - 0x88180105, // 000A GETMBR R6 R0 K5 - 0x88180D06, // 000B GETMBR R6 R6 K6 - 0x88180D07, // 000C GETMBR R6 R6 K7 - 0x8C180D08, // 000D GETMET R6 R6 K8 - 0x5C200A00, // 000E MOVE R8 R5 - 0x5C240800, // 000F MOVE R9 R4 - 0x7C180600, // 0010 CALL R6 3 - 0x80000000, // 0011 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: _compute_pbkdf -********************************************************************/ -be_local_closure(Matter_Device__compute_pbkdf, /* name */ - be_nested_proto( - 14, /* nstack */ - 4, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[11]) { /* constants */ - /* K0 */ be_nested_str_weak(crypto), - /* K1 */ be_nested_str_weak(string), - /* K2 */ be_nested_str_weak(add), - /* K3 */ be_nested_str_weak(PBKDF2_HMAC_SHA256), - /* K4 */ be_nested_str_weak(derive), - /* K5 */ be_const_int(0), - /* K6 */ be_nested_str_weak(root_w0), - /* K7 */ be_nested_str_weak(EC_P256), - /* K8 */ be_nested_str_weak(mod), - /* K9 */ be_nested_str_weak(root_L), - /* K10 */ be_nested_str_weak(public_key), - }), - be_str_weak(_compute_pbkdf), - &be_const_str_solidified, - ( &(const binstruction[41]) { /* code */ - 0xA4120000, // 0000 IMPORT R4 K0 - 0xA4160200, // 0001 IMPORT R5 K1 - 0x60180015, // 0002 GETGBL R6 G21 - 0x7C180000, // 0003 CALL R6 0 - 0x8C180D02, // 0004 GETMET R6 R6 K2 - 0x5C200200, // 0005 MOVE R8 R1 - 0x54260003, // 0006 LDINT R9 4 - 0x7C180600, // 0007 CALL R6 3 - 0x8C1C0903, // 0008 GETMET R7 R4 K3 - 0x7C1C0200, // 0009 CALL R7 1 - 0x8C1C0F04, // 000A GETMET R7 R7 K4 - 0x5C240C00, // 000B MOVE R9 R6 - 0x5C280600, // 000C MOVE R10 R3 - 0x5C2C0400, // 000D MOVE R11 R2 - 0x5432004F, // 000E LDINT R12 80 - 0x7C1C0A00, // 000F CALL R7 5 - 0x54220026, // 0010 LDINT R8 39 - 0x40220A08, // 0011 CONNECT R8 K5 R8 - 0x94200E08, // 0012 GETIDX R8 R7 R8 - 0x54260027, // 0013 LDINT R9 40 - 0x542A004E, // 0014 LDINT R10 79 - 0x4024120A, // 0015 CONNECT R9 R9 R10 - 0x94240E09, // 0016 GETIDX R9 R7 R9 - 0x8C280907, // 0017 GETMET R10 R4 K7 - 0x7C280200, // 0018 CALL R10 1 - 0x8C281508, // 0019 GETMET R10 R10 K8 - 0x5C301000, // 001A MOVE R12 R8 - 0x7C280400, // 001B CALL R10 2 - 0x90020C0A, // 001C SETMBR R0 K6 R10 - 0x8C280907, // 001D GETMET R10 R4 K7 - 0x7C280200, // 001E CALL R10 1 - 0x8C281508, // 001F GETMET R10 R10 K8 - 0x5C301200, // 0020 MOVE R12 R9 - 0x7C280400, // 0021 CALL R10 2 - 0x8C2C0907, // 0022 GETMET R11 R4 K7 - 0x7C2C0200, // 0023 CALL R11 1 - 0x8C2C170A, // 0024 GETMET R11 R11 K10 - 0x5C341400, // 0025 MOVE R13 R10 - 0x7C2C0400, // 0026 CALL R11 2 - 0x9002120B, // 0027 SETMBR R0 K9 R11 - 0x80000000, // 0028 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: init -********************************************************************/ -be_local_closure(Matter_Device_init, /* name */ - be_nested_proto( - 8, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 1, /* has sup protos */ - ( &(const struct bproto*[ 2]) { - be_nested_proto( - 4, /* nstack */ - 0, /* argc */ - 0, /* varg */ - 1, /* has upvals */ - ( &(const bupvaldesc[ 1]) { /* upvals */ - be_local_const_upval(1, 0), - }), - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 5]) { /* constants */ - /* K0 */ be_nested_str_weak(start), - /* K1 */ be_nested_str_weak(tasmota), - /* K2 */ be_nested_str_weak(remove_rule), - /* K3 */ be_nested_str_weak(Wifi_X23Connected), - /* K4 */ be_nested_str_weak(matter_start), - }), - be_str_weak(_anonymous_), - &be_const_str_solidified, - ( &(const binstruction[ 9]) { /* code */ - 0x68000000, // 0000 GETUPV R0 U0 - 0x8C000100, // 0001 GETMET R0 R0 K0 - 0x7C000200, // 0002 CALL R0 1 - 0xB8020200, // 0003 GETNGBL R0 K1 - 0x8C000102, // 0004 GETMET R0 R0 K2 - 0x58080003, // 0005 LDCONST R2 K3 - 0x580C0004, // 0006 LDCONST R3 K4 - 0x7C000600, // 0007 CALL R0 3 - 0x80000000, // 0008 RET 0 - }) - ), - be_nested_proto( - 4, /* nstack */ - 0, /* argc */ - 0, /* varg */ - 1, /* has upvals */ - ( &(const bupvaldesc[ 1]) { /* upvals */ - be_local_const_upval(1, 0), - }), - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 5]) { /* constants */ - /* K0 */ be_nested_str_weak(start), - /* K1 */ be_nested_str_weak(tasmota), - /* K2 */ be_nested_str_weak(remove_rule), - /* K3 */ be_nested_str_weak(Eth_X23Connected), - /* K4 */ be_nested_str_weak(matter_start), - }), - be_str_weak(_anonymous_), - &be_const_str_solidified, - ( &(const binstruction[ 9]) { /* code */ - 0x68000000, // 0000 GETUPV R0 U0 - 0x8C000100, // 0001 GETMET R0 R0 K0 - 0x7C000200, // 0002 CALL R0 1 - 0xB8020200, // 0003 GETNGBL R0 K1 - 0x8C000102, // 0004 GETMET R0 R0 K2 - 0x58080003, // 0005 LDCONST R2 K3 - 0x580C0004, // 0006 LDCONST R3 K4 - 0x7C000600, // 0007 CALL R0 3 - 0x80000000, // 0008 RET 0 - }) - ), - }), - 1, /* has constants */ - ( &(const bvalue[35]) { /* constants */ - /* K0 */ be_nested_str_weak(crypto), - /* K1 */ be_nested_str_weak(string), - /* K2 */ be_nested_str_weak(tasmota), - /* K3 */ be_nested_str_weak(get_option), - /* K4 */ be_nested_str_weak(matter), - /* K5 */ be_nested_str_weak(MATTER_OPTION), - /* K6 */ be_nested_str_weak(UI), - /* K7 */ be_nested_str_weak(started), - /* K8 */ be_nested_str_weak(plugins), - /* K9 */ be_nested_str_weak(vendorid), - /* K10 */ be_nested_str_weak(VENDOR_ID), - /* K11 */ be_nested_str_weak(productid), - /* K12 */ be_nested_str_weak(PRODUCT_ID), - /* K13 */ be_nested_str_weak(root_iterations), - /* K14 */ be_nested_str_weak(PBKDF_ITERATIONS), - /* K15 */ be_nested_str_weak(root_salt), - /* K16 */ be_nested_str_weak(random), - /* K17 */ be_nested_str_weak(ipv4only), - /* K18 */ be_nested_str_weak(load_param), - /* K19 */ be_nested_str_weak(sessions), - /* K20 */ be_nested_str_weak(Session_Store), - /* K21 */ be_nested_str_weak(load_fabrics), - /* K22 */ be_nested_str_weak(message_handler), - /* K23 */ be_nested_str_weak(MessageHandler), - /* K24 */ be_nested_str_weak(ui), - /* K25 */ be_nested_str_weak(wifi), - /* K26 */ be_nested_str_weak(up), - /* K27 */ be_nested_str_weak(eth), - /* K28 */ be_nested_str_weak(start), - /* K29 */ be_nested_str_weak(add_rule), - /* K30 */ be_nested_str_weak(Wifi_X23Connected), - /* K31 */ be_nested_str_weak(matter_start), - /* K32 */ be_nested_str_weak(Eth_X23Connected), - /* K33 */ be_nested_str_weak(_init_basic_commissioning), - /* K34 */ be_nested_str_weak(add_driver), - }), - be_str_weak(init), - &be_const_str_solidified, - ( &(const binstruction[91]) { /* code */ - 0xA4060000, // 0000 IMPORT R1 K0 - 0xA40A0200, // 0001 IMPORT R2 K1 - 0xB80E0400, // 0002 GETNGBL R3 K2 - 0x8C0C0703, // 0003 GETMET R3 R3 K3 - 0xB8160800, // 0004 GETNGBL R5 K4 - 0x88140B05, // 0005 GETMBR R5 R5 K5 - 0x7C0C0400, // 0006 CALL R3 2 - 0x740E0004, // 0007 JMPT R3 #000D - 0xB80E0800, // 0008 GETNGBL R3 K4 - 0x8C0C0706, // 0009 GETMET R3 R3 K6 - 0x5C140000, // 000A MOVE R5 R0 - 0x7C0C0400, // 000B CALL R3 2 - 0x80000600, // 000C RET 0 - 0x500C0000, // 000D LDBOOL R3 0 0 - 0x90020E03, // 000E SETMBR R0 K7 R3 - 0x600C0012, // 000F GETGBL R3 G18 - 0x7C0C0000, // 0010 CALL R3 0 - 0x90021003, // 0011 SETMBR R0 K8 R3 - 0x880C010A, // 0012 GETMBR R3 R0 K10 - 0x90021203, // 0013 SETMBR R0 K9 R3 - 0x880C010C, // 0014 GETMBR R3 R0 K12 - 0x90021603, // 0015 SETMBR R0 K11 R3 - 0x880C010E, // 0016 GETMBR R3 R0 K14 - 0x90021A03, // 0017 SETMBR R0 K13 R3 - 0x8C0C0310, // 0018 GETMET R3 R1 K16 - 0x5416000F, // 0019 LDINT R5 16 - 0x7C0C0400, // 001A CALL R3 2 - 0x90021E03, // 001B SETMBR R0 K15 R3 - 0x500C0000, // 001C LDBOOL R3 0 0 - 0x90022203, // 001D SETMBR R0 K17 R3 - 0x8C0C0112, // 001E GETMET R3 R0 K18 - 0x7C0C0200, // 001F CALL R3 1 - 0xB80E0800, // 0020 GETNGBL R3 K4 - 0x8C0C0714, // 0021 GETMET R3 R3 K20 - 0x7C0C0200, // 0022 CALL R3 1 - 0x90022603, // 0023 SETMBR R0 K19 R3 - 0x880C0113, // 0024 GETMBR R3 R0 K19 - 0x8C0C0715, // 0025 GETMET R3 R3 K21 - 0x7C0C0200, // 0026 CALL R3 1 - 0xB80E0800, // 0027 GETNGBL R3 K4 - 0x8C0C0717, // 0028 GETMET R3 R3 K23 - 0x5C140000, // 0029 MOVE R5 R0 - 0x7C0C0400, // 002A CALL R3 2 - 0x90022C03, // 002B SETMBR R0 K22 R3 - 0xB80E0800, // 002C GETNGBL R3 K4 - 0x8C0C0706, // 002D GETMET R3 R3 K6 - 0x5C140000, // 002E MOVE R5 R0 - 0x7C0C0400, // 002F CALL R3 2 - 0x90023003, // 0030 SETMBR R0 K24 R3 - 0xB80E0400, // 0031 GETNGBL R3 K2 - 0x8C0C0719, // 0032 GETMET R3 R3 K25 - 0x7C0C0200, // 0033 CALL R3 1 - 0x940C071A, // 0034 GETIDX R3 R3 K26 - 0x740E0004, // 0035 JMPT R3 #003B - 0xB80E0400, // 0036 GETNGBL R3 K2 - 0x8C0C071B, // 0037 GETMET R3 R3 K27 - 0x7C0C0200, // 0038 CALL R3 1 - 0x940C071A, // 0039 GETIDX R3 R3 K26 - 0x780E0001, // 003A JMPF R3 #003D - 0x8C0C011C, // 003B GETMET R3 R0 K28 - 0x7C0C0200, // 003C CALL R3 1 - 0xB80E0400, // 003D GETNGBL R3 K2 - 0x8C0C0719, // 003E GETMET R3 R3 K25 - 0x7C0C0200, // 003F CALL R3 1 - 0x940C071A, // 0040 GETIDX R3 R3 K26 - 0x740E0005, // 0041 JMPT R3 #0048 - 0xB80E0400, // 0042 GETNGBL R3 K2 - 0x8C0C071D, // 0043 GETMET R3 R3 K29 - 0x5814001E, // 0044 LDCONST R5 K30 - 0x84180000, // 0045 CLOSURE R6 P0 - 0x581C001F, // 0046 LDCONST R7 K31 - 0x7C0C0800, // 0047 CALL R3 4 - 0xB80E0400, // 0048 GETNGBL R3 K2 - 0x8C0C071B, // 0049 GETMET R3 R3 K27 - 0x7C0C0200, // 004A CALL R3 1 - 0x940C071A, // 004B GETIDX R3 R3 K26 - 0x740E0005, // 004C JMPT R3 #0053 - 0xB80E0400, // 004D GETNGBL R3 K2 - 0x8C0C071D, // 004E GETMET R3 R3 K29 - 0x58140020, // 004F LDCONST R5 K32 - 0x84180001, // 0050 CLOSURE R6 P1 - 0x581C001F, // 0051 LDCONST R7 K31 - 0x7C0C0800, // 0052 CALL R3 4 - 0x8C0C0121, // 0053 GETMET R3 R0 K33 - 0x7C0C0200, // 0054 CALL R3 1 - 0xB80E0400, // 0055 GETNGBL R3 K2 - 0x8C0C0722, // 0056 GETMET R3 R3 K34 - 0x5C140000, // 0057 MOVE R5 R0 - 0x7C0C0400, // 0058 CALL R3 2 - 0xA0000000, // 0059 CLOSE R0 - 0x80000000, // 005A RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: _start_udp -********************************************************************/ -be_local_closure(Matter_Device__start_udp, /* name */ - be_nested_proto( - 6, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 1, /* has sup protos */ - ( &(const struct bproto*[ 1]) { - be_nested_proto( - 8, /* nstack */ - 3, /* argc */ - 0, /* varg */ - 1, /* has upvals */ - ( &(const bupvaldesc[ 1]) { /* upvals */ - be_local_const_upval(1, 0), - }), - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 1]) { /* constants */ - /* K0 */ be_nested_str_weak(msg_received), - }), - be_str_weak(_X3Clambda_X3E), - &be_const_str_solidified, - ( &(const binstruction[ 7]) { /* code */ - 0x680C0000, // 0000 GETUPV R3 U0 - 0x8C0C0700, // 0001 GETMET R3 R3 K0 - 0x5C140000, // 0002 MOVE R5 R0 - 0x5C180200, // 0003 MOVE R6 R1 - 0x5C1C0400, // 0004 MOVE R7 R2 - 0x7C0C0800, // 0005 CALL R3 4 - 0x80040600, // 0006 RET 1 R3 - }) - ), - }), - 1, /* has constants */ - ( &(const bvalue[ 9]) { /* constants */ - /* K0 */ be_nested_str_weak(udp_server), - /* K1 */ be_nested_str_weak(tasmota), - /* K2 */ be_nested_str_weak(log), - /* K3 */ be_nested_str_weak(MTR_X3A_X20starting_X20UDP_X20server_X20on_X20port_X3A_X20), - /* K4 */ be_const_int(2), - /* K5 */ be_nested_str_weak(matter), - /* K6 */ be_nested_str_weak(UDPServer), - /* K7 */ be_nested_str_weak(), - /* K8 */ be_nested_str_weak(start), - }), - be_str_weak(_start_udp), - &be_const_str_solidified, - ( &(const binstruction[27]) { /* code */ - 0x88080100, // 0000 GETMBR R2 R0 K0 - 0x780A0000, // 0001 JMPF R2 #0003 - 0x80000400, // 0002 RET 0 - 0x4C080000, // 0003 LDNIL R2 - 0x1C080202, // 0004 EQ R2 R1 R2 - 0x780A0000, // 0005 JMPF R2 #0007 - 0x540615A3, // 0006 LDINT R1 5540 - 0xB80A0200, // 0007 GETNGBL R2 K1 - 0x8C080502, // 0008 GETMET R2 R2 K2 - 0x60100008, // 0009 GETGBL R4 G8 - 0x5C140200, // 000A MOVE R5 R1 - 0x7C100200, // 000B CALL R4 1 - 0x00120604, // 000C ADD R4 K3 R4 - 0x58140004, // 000D LDCONST R5 K4 - 0x7C080600, // 000E CALL R2 3 - 0xB80A0A00, // 000F GETNGBL R2 K5 - 0x8C080506, // 0010 GETMET R2 R2 K6 - 0x58100007, // 0011 LDCONST R4 K7 - 0x5C140200, // 0012 MOVE R5 R1 - 0x7C080600, // 0013 CALL R2 3 - 0x90020002, // 0014 SETMBR R0 K0 R2 - 0x88080100, // 0015 GETMBR R2 R0 K0 - 0x8C080508, // 0016 GETMET R2 R2 K8 - 0x84100000, // 0017 CLOSURE R4 P0 - 0x7C080400, // 0018 CALL R2 2 - 0xA0000000, // 0019 CLOSE R0 - 0x80000000, // 001A RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: compute_qrcode_content -********************************************************************/ -be_local_closure(Matter_Device_compute_qrcode_content, /* name */ - be_nested_proto( - 8, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[12]) { /* constants */ - /* K0 */ be_nested_str_weak(resize), - /* K1 */ be_nested_str_weak(setbits), - /* K2 */ be_const_int(3), - /* K3 */ be_nested_str_weak(vendorid), - /* K4 */ be_nested_str_weak(productid), - /* K5 */ be_nested_str_weak(root_discriminator), - /* K6 */ be_nested_str_weak(root_passcode), - /* K7 */ be_const_int(134217727), - /* K8 */ be_nested_str_weak(MT_X3A), - /* K9 */ be_nested_str_weak(matter), - /* K10 */ be_nested_str_weak(Base38), - /* K11 */ be_nested_str_weak(encode), - }), - be_str_weak(compute_qrcode_content), - &be_const_str_solidified, - ( &(const binstruction[40]) { /* code */ - 0x60040015, // 0000 GETGBL R1 G21 - 0x7C040000, // 0001 CALL R1 0 - 0x8C040300, // 0002 GETMET R1 R1 K0 - 0x540E000A, // 0003 LDINT R3 11 - 0x7C040400, // 0004 CALL R1 2 - 0x8C080301, // 0005 GETMET R2 R1 K1 - 0x58100002, // 0006 LDCONST R4 K2 - 0x5416000F, // 0007 LDINT R5 16 - 0x88180103, // 0008 GETMBR R6 R0 K3 - 0x7C080800, // 0009 CALL R2 4 - 0x8C080301, // 000A GETMET R2 R1 K1 - 0x54120012, // 000B LDINT R4 19 - 0x5416000F, // 000C LDINT R5 16 - 0x88180104, // 000D GETMBR R6 R0 K4 - 0x7C080800, // 000E CALL R2 4 - 0x8C080301, // 000F GETMET R2 R1 K1 - 0x54120024, // 0010 LDINT R4 37 - 0x54160007, // 0011 LDINT R5 8 - 0x541A0003, // 0012 LDINT R6 4 - 0x7C080800, // 0013 CALL R2 4 - 0x8C080301, // 0014 GETMET R2 R1 K1 - 0x5412002C, // 0015 LDINT R4 45 - 0x5416000B, // 0016 LDINT R5 12 - 0x88180105, // 0017 GETMBR R6 R0 K5 - 0x541E0FFE, // 0018 LDINT R7 4095 - 0x2C180C07, // 0019 AND R6 R6 R7 - 0x7C080800, // 001A CALL R2 4 - 0x8C080301, // 001B GETMET R2 R1 K1 - 0x54120038, // 001C LDINT R4 57 - 0x5416001A, // 001D LDINT R5 27 - 0x88180106, // 001E GETMBR R6 R0 K6 - 0x2C180D07, // 001F AND R6 R6 K7 - 0x7C080800, // 0020 CALL R2 4 - 0xB80A1200, // 0021 GETNGBL R2 K9 - 0x8808050A, // 0022 GETMBR R2 R2 K10 - 0x8C08050B, // 0023 GETMET R2 R2 K11 - 0x5C100200, // 0024 MOVE R4 R1 - 0x7C080400, // 0025 CALL R2 2 - 0x000A1002, // 0026 ADD R2 K8 R2 - 0x80040400, // 0027 RET 1 R2 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: stop -********************************************************************/ -be_local_closure(Matter_Device_stop, /* name */ - be_nested_proto( - 4, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 4]) { /* constants */ - /* K0 */ be_nested_str_weak(tasmota), - /* K1 */ be_nested_str_weak(remove_driver), - /* K2 */ be_nested_str_weak(udp_server), - /* K3 */ be_nested_str_weak(stop), - }), - be_str_weak(stop), - &be_const_str_solidified, - ( &(const binstruction[10]) { /* code */ - 0xB8060000, // 0000 GETNGBL R1 K0 - 0x8C040301, // 0001 GETMET R1 R1 K1 - 0x5C0C0000, // 0002 MOVE R3 R0 - 0x7C040400, // 0003 CALL R1 2 - 0x88040102, // 0004 GETMBR R1 R0 K2 - 0x78060002, // 0005 JMPF R1 #0009 - 0x88040102, // 0006 GETMBR R1 R0 K2 - 0x8C040303, // 0007 GETMET R1 R1 K3 - 0x7C040200, // 0008 CALL R1 1 - 0x80000000, // 0009 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: start_basic_commissioning -********************************************************************/ -be_local_closure(Matter_Device_start_basic_commissioning, /* name */ - be_nested_proto( - 13, /* nstack */ - 8, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 1, /* has sup protos */ - ( &(const struct bproto*[ 2]) { - be_nested_proto( - 4, /* nstack */ - 0, /* argc */ - 0, /* varg */ - 1, /* has upvals */ - ( &(const bupvaldesc[ 1]) { /* upvals */ - be_local_const_upval(1, 0), - }), - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 4]) { /* constants */ - /* K0 */ be_nested_str_weak(mdns_announce_PASE), - /* K1 */ be_nested_str_weak(tasmota), - /* K2 */ be_nested_str_weak(remove_rule), - /* K3 */ be_nested_str_weak(Wifi_X23Connected), - }), - be_str_weak(_anonymous_), - &be_const_str_solidified, - ( &(const binstruction[ 9]) { /* code */ - 0x68000000, // 0000 GETUPV R0 U0 - 0x8C000100, // 0001 GETMET R0 R0 K0 - 0x7C000200, // 0002 CALL R0 1 - 0xB8020200, // 0003 GETNGBL R0 K1 - 0x8C000102, // 0004 GETMET R0 R0 K2 - 0x58080003, // 0005 LDCONST R2 K3 - 0x580C0000, // 0006 LDCONST R3 K0 - 0x7C000600, // 0007 CALL R0 3 - 0x80000000, // 0008 RET 0 - }) - ), - be_nested_proto( - 4, /* nstack */ - 0, /* argc */ - 0, /* varg */ - 1, /* has upvals */ - ( &(const bupvaldesc[ 1]) { /* upvals */ - be_local_const_upval(1, 0), - }), - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 4]) { /* constants */ - /* K0 */ be_nested_str_weak(mdns_announce_PASE), - /* K1 */ be_nested_str_weak(tasmota), - /* K2 */ be_nested_str_weak(remove_rule), - /* K3 */ be_nested_str_weak(Eth_X23Connected), - }), - be_str_weak(_anonymous_), - &be_const_str_solidified, - ( &(const binstruction[ 9]) { /* code */ - 0x68000000, // 0000 GETUPV R0 U0 - 0x8C000100, // 0001 GETMET R0 R0 K0 - 0x7C000200, // 0002 CALL R0 1 - 0xB8020200, // 0003 GETNGBL R0 K1 - 0x8C000102, // 0004 GETMET R0 R0 K2 - 0x58080003, // 0005 LDCONST R2 K3 - 0x580C0000, // 0006 LDCONST R3 K0 - 0x7C000600, // 0007 CALL R0 3 - 0x80000000, // 0008 RET 0 - }) - ), - }), - 1, /* has constants */ - ( &(const bvalue[16]) { /* constants */ - /* K0 */ be_nested_str_weak(commissioning_open), - /* K1 */ be_nested_str_weak(tasmota), - /* K2 */ be_nested_str_weak(millis), - /* K3 */ be_nested_str_weak(commissioning_iterations), - /* K4 */ be_nested_str_weak(commissioning_discriminator), - /* K5 */ be_nested_str_weak(commissioning_salt), - /* K6 */ be_nested_str_weak(commissioning_w0), - /* K7 */ be_nested_str_weak(commissioning_L), - /* K8 */ be_nested_str_weak(commissioning_admin_fabric), - /* K9 */ be_nested_str_weak(wifi), - /* K10 */ be_nested_str_weak(up), - /* K11 */ be_nested_str_weak(eth), - /* K12 */ be_nested_str_weak(mdns_announce_PASE), - /* K13 */ be_nested_str_weak(add_rule), - /* K14 */ be_nested_str_weak(Wifi_X23Connected), - /* K15 */ be_nested_str_weak(Eth_X23Connected), - }), - be_str_weak(start_basic_commissioning), - &be_const_str_solidified, - ( &(const binstruction[40]) { /* code */ - 0xB8220200, // 0000 GETNGBL R8 K1 - 0x8C201102, // 0001 GETMET R8 R8 K2 - 0x7C200200, // 0002 CALL R8 1 - 0x542603E7, // 0003 LDINT R9 1000 - 0x08240209, // 0004 MUL R9 R1 R9 - 0x00201009, // 0005 ADD R8 R8 R9 - 0x90020008, // 0006 SETMBR R0 K0 R8 - 0x90020602, // 0007 SETMBR R0 K3 R2 - 0x90020803, // 0008 SETMBR R0 K4 R3 - 0x90020A04, // 0009 SETMBR R0 K5 R4 - 0x90020C05, // 000A SETMBR R0 K6 R5 - 0x90020E06, // 000B SETMBR R0 K7 R6 - 0x90021007, // 000C SETMBR R0 K8 R7 - 0xB8220200, // 000D GETNGBL R8 K1 - 0x8C201109, // 000E GETMET R8 R8 K9 - 0x7C200200, // 000F CALL R8 1 - 0x9420110A, // 0010 GETIDX R8 R8 K10 - 0x74220004, // 0011 JMPT R8 #0017 - 0xB8220200, // 0012 GETNGBL R8 K1 - 0x8C20110B, // 0013 GETMET R8 R8 K11 - 0x7C200200, // 0014 CALL R8 1 - 0x9420110A, // 0015 GETIDX R8 R8 K10 - 0x78220002, // 0016 JMPF R8 #001A - 0x8C20010C, // 0017 GETMET R8 R0 K12 - 0x7C200200, // 0018 CALL R8 1 - 0x7002000B, // 0019 JMP #0026 - 0xB8220200, // 001A GETNGBL R8 K1 - 0x8C20110D, // 001B GETMET R8 R8 K13 - 0x5828000E, // 001C LDCONST R10 K14 - 0x842C0000, // 001D CLOSURE R11 P0 - 0x5830000C, // 001E LDCONST R12 K12 - 0x7C200800, // 001F CALL R8 4 - 0xB8220200, // 0020 GETNGBL R8 K1 - 0x8C20110D, // 0021 GETMET R8 R8 K13 - 0x5828000F, // 0022 LDCONST R10 K15 - 0x842C0001, // 0023 CLOSURE R11 P1 - 0x5830000C, // 0024 LDCONST R12 K12 - 0x7C200800, // 0025 CALL R8 4 - 0xA0000000, // 0026 CLOSE R0 - 0x80000000, // 0027 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: remove_fabric -********************************************************************/ -be_local_closure(Matter_Device_remove_fabric, /* name */ - be_nested_proto( - 9, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[12]) { /* constants */ - /* K0 */ be_nested_str_weak(sessions), - /* K1 */ be_nested_str_weak(find_children_fabrics), - /* K2 */ be_nested_str_weak(get_fabric_index), - /* K3 */ be_nested_str_weak(find_fabric_by_index), - /* K4 */ be_nested_str_weak(message_handler), - /* K5 */ be_nested_str_weak(im), - /* K6 */ be_nested_str_weak(subs_shop), - /* K7 */ be_nested_str_weak(remove_by_fabric), - /* K8 */ be_nested_str_weak(mdns_remove_op_discovery), - /* K9 */ be_nested_str_weak(remove_fabric), - /* K10 */ be_nested_str_weak(stop_iteration), - /* K11 */ be_nested_str_weak(save_fabrics), - }), - be_str_weak(remove_fabric), - &be_const_str_solidified, - ( &(const binstruction[43]) { /* code */ - 0x88080100, // 0000 GETMBR R2 R0 K0 - 0x8C080501, // 0001 GETMET R2 R2 K1 - 0x8C100302, // 0002 GETMET R4 R1 K2 - 0x7C100200, // 0003 CALL R4 1 - 0x7C080400, // 0004 CALL R2 2 - 0x4C0C0000, // 0005 LDNIL R3 - 0x1C0C0403, // 0006 EQ R3 R2 R3 - 0x780E0000, // 0007 JMPF R3 #0009 - 0x80000600, // 0008 RET 0 - 0x600C0010, // 0009 GETGBL R3 G16 - 0x5C100400, // 000A MOVE R4 R2 - 0x7C0C0200, // 000B CALL R3 1 - 0xA8020016, // 000C EXBLK 0 #0024 - 0x5C100600, // 000D MOVE R4 R3 - 0x7C100000, // 000E CALL R4 0 - 0x88140100, // 000F GETMBR R5 R0 K0 - 0x8C140B03, // 0010 GETMET R5 R5 K3 - 0x5C1C0800, // 0011 MOVE R7 R4 - 0x7C140400, // 0012 CALL R5 2 - 0x4C180000, // 0013 LDNIL R6 - 0x20180A06, // 0014 NE R6 R5 R6 - 0x781A000C, // 0015 JMPF R6 #0023 - 0x88180104, // 0016 GETMBR R6 R0 K4 - 0x88180D05, // 0017 GETMBR R6 R6 K5 - 0x88180D06, // 0018 GETMBR R6 R6 K6 - 0x8C180D07, // 0019 GETMET R6 R6 K7 - 0x5C200A00, // 001A MOVE R8 R5 - 0x7C180400, // 001B CALL R6 2 - 0x8C180108, // 001C GETMET R6 R0 K8 - 0x5C200A00, // 001D MOVE R8 R5 - 0x7C180400, // 001E CALL R6 2 - 0x88180100, // 001F GETMBR R6 R0 K0 - 0x8C180D09, // 0020 GETMET R6 R6 K9 - 0x5C200A00, // 0021 MOVE R8 R5 - 0x7C180400, // 0022 CALL R6 2 - 0x7001FFE8, // 0023 JMP #000D - 0x580C000A, // 0024 LDCONST R3 K10 - 0xAC0C0200, // 0025 CATCH R3 1 0 - 0xB0080000, // 0026 RAISE 2 R0 R0 - 0x880C0100, // 0027 GETMBR R3 R0 K0 - 0x8C0C070B, // 0028 GETMET R3 R3 K11 - 0x7C0C0200, // 0029 CALL R3 1 - 0x80000000, // 002A RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: invoke_request -********************************************************************/ -be_local_closure(Matter_Device_invoke_request, /* name */ - be_nested_proto( - 12, /* nstack */ - 4, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 8]) { /* constants */ - /* K0 */ be_const_int(0), - /* K1 */ be_nested_str_weak(endpoint), - /* K2 */ be_nested_str_weak(plugins), - /* K3 */ be_nested_str_weak(invoke_request), - /* K4 */ be_const_int(1), - /* K5 */ be_nested_str_weak(status), - /* K6 */ be_nested_str_weak(matter), - /* K7 */ be_nested_str_weak(UNSUPPORTED_ENDPOINT), - }), - be_str_weak(invoke_request), - &be_const_str_solidified, - ( &(const binstruction[24]) { /* code */ - 0x58100000, // 0000 LDCONST R4 K0 - 0x88140701, // 0001 GETMBR R5 R3 K1 - 0x6018000C, // 0002 GETGBL R6 G12 - 0x881C0102, // 0003 GETMBR R7 R0 K2 - 0x7C180200, // 0004 CALL R6 1 - 0x14180806, // 0005 LT R6 R4 R6 - 0x781A000C, // 0006 JMPF R6 #0014 - 0x88180102, // 0007 GETMBR R6 R0 K2 - 0x94180C04, // 0008 GETIDX R6 R6 R4 - 0x881C0D01, // 0009 GETMBR R7 R6 K1 - 0x1C1C0E05, // 000A EQ R7 R7 R5 - 0x781E0005, // 000B JMPF R7 #0012 - 0x8C1C0D03, // 000C GETMET R7 R6 K3 - 0x5C240200, // 000D MOVE R9 R1 - 0x5C280400, // 000E MOVE R10 R2 - 0x5C2C0600, // 000F MOVE R11 R3 - 0x7C1C0800, // 0010 CALL R7 4 - 0x80040E00, // 0011 RET 1 R7 - 0x00100904, // 0012 ADD R4 R4 K4 - 0x7001FFED, // 0013 JMP #0002 - 0xB81A0C00, // 0014 GETNGBL R6 K6 - 0x88180D07, // 0015 GETMBR R6 R6 K7 - 0x900E0A06, // 0016 SETMBR R3 K5 R6 - 0x80000000, // 0017 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: save_before_restart -********************************************************************/ -be_local_closure(Matter_Device_save_before_restart, /* name */ - be_nested_proto( - 3, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 2]) { /* constants */ - /* K0 */ be_nested_str_weak(stop_basic_commissioning), - /* K1 */ be_nested_str_weak(mdns_remove_op_discovery_all_fabrics), - }), - be_str_weak(save_before_restart), - &be_const_str_solidified, - ( &(const binstruction[ 5]) { /* code */ - 0x8C040100, // 0000 GETMET R1 R0 K0 - 0x7C040200, // 0001 CALL R1 1 - 0x8C040101, // 0002 GETMET R1 R0 K1 - 0x7C040200, // 0003 CALL R1 1 - 0x80000000, // 0004 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: _mdns_announce_hostname -********************************************************************/ -be_local_closure(Matter_Device__mdns_announce_hostname, /* name */ - be_nested_proto( - 16, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[28]) { /* constants */ - /* K0 */ be_nested_str_weak(mdns), - /* K1 */ be_nested_str_weak(string), - /* K2 */ be_nested_str_weak(start), - /* K3 */ be_nested_str_weak(tasmota), - /* K4 */ be_nested_str_weak(eth), - /* K5 */ be_nested_str_weak(hostname_eth), - /* K6 */ be_nested_str_weak(replace), - /* K7 */ be_nested_str_weak(find), - /* K8 */ be_nested_str_weak(mac), - /* K9 */ be_nested_str_weak(_X3A), - /* K10 */ be_nested_str_weak(), - /* K11 */ be_nested_str_weak(ipv4only), - /* K12 */ be_nested_str_weak(log), - /* K13 */ be_nested_str_weak(format), - /* K14 */ be_nested_str_weak(MTR_X3A_X20calling_X20mdns_X2Eadd_hostname_X28_X25s_X2C_X20_X25s_X2C_X20_X25s_X29), - /* K15 */ be_nested_str_weak(ip6local), - /* K16 */ be_nested_str_weak(ip), - /* K17 */ be_const_int(3), - /* K18 */ be_nested_str_weak(add_hostname), - /* K19 */ be_nested_str_weak(ip6), - /* K20 */ be_nested_str_weak(MTR_X3A_X20calling_X20mdns_X2Eadd_hostname_X28_X25s_X2C_X20_X25s_X29), - /* K21 */ be_nested_str_weak(wifi), - /* K22 */ be_nested_str_weak(hostname_wifi), - /* K23 */ be_nested_str_weak(MTR_X3A_X20start_X20mDNS_X20on_X20_X25s_X20host_X20_X27_X25s_X2Elocal_X27), - /* K24 */ be_const_int(2), - /* K25 */ be_nested_str_weak(MTR_X3A_X20Exception), - /* K26 */ be_nested_str_weak(_X7C), - /* K27 */ be_nested_str_weak(mdns_announce_op_discovery_all_fabrics), - }), - be_str_weak(_mdns_announce_hostname), - &be_const_str_solidified, - ( &(const binstruction[172]) { /* code */ - 0xA40A0000, // 0000 IMPORT R2 K0 - 0xA40E0200, // 0001 IMPORT R3 K1 - 0x8C100502, // 0002 GETMET R4 R2 K2 - 0x7C100200, // 0003 CALL R4 1 - 0xA8020092, // 0004 EXBLK 0 #0098 - 0x78060040, // 0005 JMPF R1 #0047 - 0xB8120600, // 0006 GETNGBL R4 K3 - 0x8C100904, // 0007 GETMET R4 R4 K4 - 0x7C100200, // 0008 CALL R4 1 - 0x8C140706, // 0009 GETMET R5 R3 K6 - 0x8C1C0907, // 000A GETMET R7 R4 K7 - 0x58240008, // 000B LDCONST R9 K8 - 0x7C1C0400, // 000C CALL R7 2 - 0x58200009, // 000D LDCONST R8 K9 - 0x5824000A, // 000E LDCONST R9 K10 - 0x7C140800, // 000F CALL R5 4 - 0x90020A05, // 0010 SETMBR R0 K5 R5 - 0x8814010B, // 0011 GETMBR R5 R0 K11 - 0x7416001F, // 0012 JMPT R5 #0033 - 0xB8160600, // 0013 GETNGBL R5 K3 - 0x8C140B0C, // 0014 GETMET R5 R5 K12 - 0x8C1C070D, // 0015 GETMET R7 R3 K13 - 0x5824000E, // 0016 LDCONST R9 K14 - 0x88280105, // 0017 GETMBR R10 R0 K5 - 0x8C2C0907, // 0018 GETMET R11 R4 K7 - 0x5834000F, // 0019 LDCONST R13 K15 - 0x5838000A, // 001A LDCONST R14 K10 - 0x7C2C0600, // 001B CALL R11 3 - 0x8C300907, // 001C GETMET R12 R4 K7 - 0x58380010, // 001D LDCONST R14 K16 - 0x583C000A, // 001E LDCONST R15 K10 - 0x7C300600, // 001F CALL R12 3 - 0x7C1C0A00, // 0020 CALL R7 5 - 0x58200011, // 0021 LDCONST R8 K17 - 0x7C140600, // 0022 CALL R5 3 - 0x8C140512, // 0023 GETMET R5 R2 K18 - 0x881C0105, // 0024 GETMBR R7 R0 K5 - 0x8C200907, // 0025 GETMET R8 R4 K7 - 0x5828000F, // 0026 LDCONST R10 K15 - 0x582C000A, // 0027 LDCONST R11 K10 - 0x7C200600, // 0028 CALL R8 3 - 0x8C240907, // 0029 GETMET R9 R4 K7 - 0x582C0010, // 002A LDCONST R11 K16 - 0x5830000A, // 002B LDCONST R12 K10 - 0x7C240600, // 002C CALL R9 3 - 0x8C280907, // 002D GETMET R10 R4 K7 - 0x58300013, // 002E LDCONST R12 K19 - 0x5834000A, // 002F LDCONST R13 K10 - 0x7C280600, // 0030 CALL R10 3 - 0x7C140A00, // 0031 CALL R5 5 - 0x70020012, // 0032 JMP #0046 - 0xB8160600, // 0033 GETNGBL R5 K3 - 0x8C140B0C, // 0034 GETMET R5 R5 K12 - 0x8C1C070D, // 0035 GETMET R7 R3 K13 - 0x58240014, // 0036 LDCONST R9 K20 - 0x88280105, // 0037 GETMBR R10 R0 K5 - 0x8C2C0907, // 0038 GETMET R11 R4 K7 - 0x58340010, // 0039 LDCONST R13 K16 - 0x5838000A, // 003A LDCONST R14 K10 - 0x7C2C0600, // 003B CALL R11 3 - 0x7C1C0800, // 003C CALL R7 4 - 0x58200011, // 003D LDCONST R8 K17 - 0x7C140600, // 003E CALL R5 3 - 0x8C140512, // 003F GETMET R5 R2 K18 - 0x881C0105, // 0040 GETMBR R7 R0 K5 - 0x8C200907, // 0041 GETMET R8 R4 K7 - 0x58280010, // 0042 LDCONST R10 K16 - 0x582C000A, // 0043 LDCONST R11 K10 - 0x7C200600, // 0044 CALL R8 3 - 0x7C140600, // 0045 CALL R5 3 - 0x7002003F, // 0046 JMP #0087 - 0xB8120600, // 0047 GETNGBL R4 K3 - 0x8C100915, // 0048 GETMET R4 R4 K21 - 0x7C100200, // 0049 CALL R4 1 - 0x8C140706, // 004A GETMET R5 R3 K6 - 0x8C1C0907, // 004B GETMET R7 R4 K7 - 0x58240008, // 004C LDCONST R9 K8 - 0x7C1C0400, // 004D CALL R7 2 - 0x58200009, // 004E LDCONST R8 K9 - 0x5824000A, // 004F LDCONST R9 K10 - 0x7C140800, // 0050 CALL R5 4 - 0x90022C05, // 0051 SETMBR R0 K22 R5 - 0x8814010B, // 0052 GETMBR R5 R0 K11 - 0x7416001F, // 0053 JMPT R5 #0074 - 0xB8160600, // 0054 GETNGBL R5 K3 - 0x8C140B0C, // 0055 GETMET R5 R5 K12 - 0x8C1C070D, // 0056 GETMET R7 R3 K13 - 0x5824000E, // 0057 LDCONST R9 K14 - 0x88280116, // 0058 GETMBR R10 R0 K22 - 0x8C2C0907, // 0059 GETMET R11 R4 K7 - 0x5834000F, // 005A LDCONST R13 K15 - 0x5838000A, // 005B LDCONST R14 K10 - 0x7C2C0600, // 005C CALL R11 3 - 0x8C300907, // 005D GETMET R12 R4 K7 - 0x58380010, // 005E LDCONST R14 K16 - 0x583C000A, // 005F LDCONST R15 K10 - 0x7C300600, // 0060 CALL R12 3 - 0x7C1C0A00, // 0061 CALL R7 5 - 0x58200011, // 0062 LDCONST R8 K17 - 0x7C140600, // 0063 CALL R5 3 - 0x8C140512, // 0064 GETMET R5 R2 K18 - 0x881C0116, // 0065 GETMBR R7 R0 K22 - 0x8C200907, // 0066 GETMET R8 R4 K7 - 0x5828000F, // 0067 LDCONST R10 K15 - 0x582C000A, // 0068 LDCONST R11 K10 - 0x7C200600, // 0069 CALL R8 3 - 0x8C240907, // 006A GETMET R9 R4 K7 - 0x582C0010, // 006B LDCONST R11 K16 - 0x5830000A, // 006C LDCONST R12 K10 - 0x7C240600, // 006D CALL R9 3 - 0x8C280907, // 006E GETMET R10 R4 K7 - 0x58300013, // 006F LDCONST R12 K19 - 0x5834000A, // 0070 LDCONST R13 K10 - 0x7C280600, // 0071 CALL R10 3 - 0x7C140A00, // 0072 CALL R5 5 - 0x70020012, // 0073 JMP #0087 - 0xB8160600, // 0074 GETNGBL R5 K3 - 0x8C140B0C, // 0075 GETMET R5 R5 K12 - 0x8C1C070D, // 0076 GETMET R7 R3 K13 - 0x58240014, // 0077 LDCONST R9 K20 - 0x88280105, // 0078 GETMBR R10 R0 K5 - 0x8C2C0907, // 0079 GETMET R11 R4 K7 - 0x58340010, // 007A LDCONST R13 K16 - 0x5838000A, // 007B LDCONST R14 K10 - 0x7C2C0600, // 007C CALL R11 3 - 0x7C1C0800, // 007D CALL R7 4 - 0x58200011, // 007E LDCONST R8 K17 - 0x7C140600, // 007F CALL R5 3 - 0x8C140512, // 0080 GETMET R5 R2 K18 - 0x881C0116, // 0081 GETMBR R7 R0 K22 - 0x8C200907, // 0082 GETMET R8 R4 K7 - 0x58280010, // 0083 LDCONST R10 K16 - 0x582C000A, // 0084 LDCONST R11 K10 - 0x7C200600, // 0085 CALL R8 3 - 0x7C140600, // 0086 CALL R5 3 - 0xB8120600, // 0087 GETNGBL R4 K3 - 0x8C10090C, // 0088 GETMET R4 R4 K12 - 0x8C18070D, // 0089 GETMET R6 R3 K13 - 0x58200017, // 008A LDCONST R8 K23 - 0x78060001, // 008B JMPF R1 #008E - 0x58240004, // 008C LDCONST R9 K4 - 0x70020000, // 008D JMP #008F - 0x58240015, // 008E LDCONST R9 K21 - 0x78060001, // 008F JMPF R1 #0092 - 0x88280105, // 0090 GETMBR R10 R0 K5 - 0x70020000, // 0091 JMP #0093 - 0x88280116, // 0092 GETMBR R10 R0 K22 - 0x7C180800, // 0093 CALL R6 4 - 0x581C0018, // 0094 LDCONST R7 K24 - 0x7C100600, // 0095 CALL R4 3 - 0xA8040001, // 0096 EXBLK 1 1 - 0x70020010, // 0097 JMP #00A9 - 0xAC100002, // 0098 CATCH R4 0 2 - 0x7002000D, // 0099 JMP #00A8 - 0xB81A0600, // 009A GETNGBL R6 K3 - 0x8C180D0C, // 009B GETMET R6 R6 K12 - 0x60200008, // 009C GETGBL R8 G8 - 0x5C240800, // 009D MOVE R9 R4 - 0x7C200200, // 009E CALL R8 1 - 0x00223208, // 009F ADD R8 K25 R8 - 0x0020111A, // 00A0 ADD R8 R8 K26 - 0x60240008, // 00A1 GETGBL R9 G8 - 0x5C280A00, // 00A2 MOVE R10 R5 - 0x7C240200, // 00A3 CALL R9 1 - 0x00201009, // 00A4 ADD R8 R8 R9 - 0x58240018, // 00A5 LDCONST R9 K24 - 0x7C180600, // 00A6 CALL R6 3 - 0x70020000, // 00A7 JMP #00A9 - 0xB0080000, // 00A8 RAISE 2 R0 R0 - 0x8C10011B, // 00A9 GETMET R4 R0 K27 - 0x7C100200, // 00AA CALL R4 1 - 0x80000000, // 00AB RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: _trigger_read_sensors -********************************************************************/ -be_local_closure(Matter_Device__trigger_read_sensors, /* name */ - be_nested_proto( - 8, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[11]) { /* constants */ - /* K0 */ be_nested_str_weak(json), - /* K1 */ be_nested_str_weak(tasmota), - /* K2 */ be_nested_str_weak(read_sensors), - /* K3 */ be_nested_str_weak(load), - /* K4 */ be_const_int(0), - /* K5 */ be_nested_str_weak(plugins), - /* K6 */ be_nested_str_weak(parse_sensors), - /* K7 */ be_const_int(1), - /* K8 */ be_nested_str_weak(log), - /* K9 */ be_nested_str_weak(MTR_X3A_X20unable_X20to_X20parse_X20read_sensors_X3A_X20), - /* K10 */ be_const_int(3), - }), - be_str_weak(_trigger_read_sensors), - &be_const_str_solidified, - ( &(const binstruction[37]) { /* code */ - 0xA4060000, // 0000 IMPORT R1 K0 - 0xB80A0200, // 0001 GETNGBL R2 K1 - 0x8C080502, // 0002 GETMET R2 R2 K2 - 0x7C080200, // 0003 CALL R2 1 - 0x4C0C0000, // 0004 LDNIL R3 - 0x1C0C0403, // 0005 EQ R3 R2 R3 - 0x780E0000, // 0006 JMPF R3 #0008 - 0x80000600, // 0007 RET 0 - 0x8C0C0303, // 0008 GETMET R3 R1 K3 - 0x5C140400, // 0009 MOVE R5 R2 - 0x7C0C0400, // 000A CALL R3 2 - 0x4C100000, // 000B LDNIL R4 - 0x20100604, // 000C NE R4 R3 R4 - 0x7812000D, // 000D JMPF R4 #001C - 0x58100004, // 000E LDCONST R4 K4 - 0x6014000C, // 000F GETGBL R5 G12 - 0x88180105, // 0010 GETMBR R6 R0 K5 - 0x7C140200, // 0011 CALL R5 1 - 0x14140805, // 0012 LT R5 R4 R5 - 0x78160006, // 0013 JMPF R5 #001B - 0x88140105, // 0014 GETMBR R5 R0 K5 - 0x94140A04, // 0015 GETIDX R5 R5 R4 - 0x8C140B06, // 0016 GETMET R5 R5 K6 - 0x5C1C0600, // 0017 MOVE R7 R3 - 0x7C140400, // 0018 CALL R5 2 - 0x00100907, // 0019 ADD R4 R4 K7 - 0x7001FFF3, // 001A JMP #000F - 0x70020007, // 001B JMP #0024 - 0xB8120200, // 001C GETNGBL R4 K1 - 0x8C100908, // 001D GETMET R4 R4 K8 - 0x60180008, // 001E GETGBL R6 G8 - 0x5C1C0400, // 001F MOVE R7 R2 - 0x7C180200, // 0020 CALL R6 1 - 0x001A1206, // 0021 ADD R6 K9 R6 - 0x581C000A, // 0022 LDCONST R7 K10 - 0x7C100600, // 0023 CALL R4 3 - 0x80000000, // 0024 RET 0 - }) - ) -); -/*******************************************************************/ - - /******************************************************************** ** Solidified function: mdns_remove_op_discovery ********************************************************************/ @@ -2529,12 +3650,12 @@ be_local_closure(Matter_Device_mdns_remove_op_discovery, /* name */ /******************************************************************** -** Solidified function: msg_received +** Solidified function: is_root_commissioning_open ********************************************************************/ -be_local_closure(Matter_Device_msg_received, /* name */ +be_local_closure(Matter_Device_is_root_commissioning_open, /* name */ be_nested_proto( - 9, /* nstack */ - 4, /* argc */ + 3, /* nstack */ + 1, /* argc */ 2, /* varg */ 0, /* has upvals */ NULL, /* no upvals */ @@ -2542,19 +3663,52 @@ be_local_closure(Matter_Device_msg_received, /* name */ NULL, /* no sub protos */ 1, /* has constants */ ( &(const bvalue[ 2]) { /* constants */ - /* K0 */ be_nested_str_weak(message_handler), - /* K1 */ be_nested_str_weak(msg_received), + /* K0 */ be_nested_str_weak(commissioning_open), + /* K1 */ be_nested_str_weak(commissioning_admin_fabric), }), - be_str_weak(msg_received), + be_str_weak(is_root_commissioning_open), &be_const_str_solidified, - ( &(const binstruction[ 7]) { /* code */ - 0x88100100, // 0000 GETMBR R4 R0 K0 - 0x8C100901, // 0001 GETMET R4 R4 K1 - 0x5C180200, // 0002 MOVE R6 R1 - 0x5C1C0400, // 0003 MOVE R7 R2 - 0x5C200600, // 0004 MOVE R8 R3 - 0x7C100800, // 0005 CALL R4 4 - 0x80040800, // 0006 RET 1 R4 + ( &(const binstruction[11]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x4C080000, // 0001 LDNIL R2 + 0x20040202, // 0002 NE R1 R1 R2 + 0x78060003, // 0003 JMPF R1 #0008 + 0x88040101, // 0004 GETMBR R1 R0 K1 + 0x4C080000, // 0005 LDNIL R2 + 0x1C040202, // 0006 EQ R1 R1 R2 + 0x74060000, // 0007 JMPT R1 #0009 + 0x50040001, // 0008 LDBOOL R1 0 1 + 0x50040200, // 0009 LDBOOL R1 1 0 + 0x80040200, // 000A RET 1 R1 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: is_commissioning_open +********************************************************************/ +be_local_closure(Matter_Device_is_commissioning_open, /* name */ + be_nested_proto( + 3, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 1]) { /* constants */ + /* K0 */ be_nested_str_weak(commissioning_open), + }), + be_str_weak(is_commissioning_open), + &be_const_str_solidified, + ( &(const binstruction[ 4]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x4C080000, // 0001 LDNIL R2 + 0x20040202, // 0002 NE R1 R1 R2 + 0x80040200, // 0003 RET 1 R1 }) ) ); @@ -2599,11 +3753,11 @@ be_local_closure(Matter_Device_start_commissioning_complete, /* name */ /******************************************************************** -** Solidified function: mdns_remove_PASE +** Solidified function: mdns_announce_op_discovery_all_fabrics ********************************************************************/ -be_local_closure(Matter_Device_mdns_remove_PASE, /* name */ +be_local_closure(Matter_Device_mdns_announce_op_discovery_all_fabrics, /* name */ be_nested_proto( - 12, /* nstack */ + 6, /* nstack */ 1, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -2611,242 +3765,39 @@ be_local_closure(Matter_Device_mdns_remove_PASE, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[22]) { /* constants */ - /* K0 */ be_nested_str_weak(mdns), - /* K1 */ be_nested_str_weak(string), - /* K2 */ be_nested_str_weak(mdns_pase_eth), - /* K3 */ be_nested_str_weak(tasmota), - /* K4 */ be_nested_str_weak(log), - /* K5 */ be_nested_str_weak(format), - /* K6 */ be_nested_str_weak(MTR_X3A_X20calling_X20mdns_X2Eremove_service_X28_X25s_X2C_X20_X25s_X2C_X20_X25s_X2C_X20_X25s_X29), - /* K7 */ be_nested_str_weak(_matterc), - /* K8 */ be_nested_str_weak(_udp), - /* K9 */ be_nested_str_weak(commissioning_instance_eth), - /* K10 */ be_nested_str_weak(hostname_eth), - /* K11 */ be_const_int(3), - /* K12 */ be_nested_str_weak(MTR_X3A_X20remove_X20mDNS_X20on_X20_X25s_X20_X27_X25s_X27), - /* K13 */ be_nested_str_weak(eth), - /* K14 */ be_const_int(2), - /* K15 */ be_nested_str_weak(remove_service), - /* K16 */ be_nested_str_weak(mdns_pase_wifi), - /* K17 */ be_nested_str_weak(commissioning_instance_wifi), - /* K18 */ be_nested_str_weak(hostname_wifi), - /* K19 */ be_nested_str_weak(wifi), - /* K20 */ be_nested_str_weak(MTR_X3A_X20Exception), - /* K21 */ be_nested_str_weak(_X7C), - }), - be_str_weak(mdns_remove_PASE), - &be_const_str_solidified, - ( &(const binstruction[83]) { /* code */ - 0xA4060000, // 0000 IMPORT R1 K0 - 0xA40A0200, // 0001 IMPORT R2 K1 - 0xA802003D, // 0002 EXBLK 0 #0041 - 0x880C0102, // 0003 GETMBR R3 R0 K2 - 0x780E001B, // 0004 JMPF R3 #0021 - 0xB80E0600, // 0005 GETNGBL R3 K3 - 0x8C0C0704, // 0006 GETMET R3 R3 K4 - 0x8C140505, // 0007 GETMET R5 R2 K5 - 0x581C0006, // 0008 LDCONST R7 K6 - 0x58200007, // 0009 LDCONST R8 K7 - 0x58240008, // 000A LDCONST R9 K8 - 0x88280109, // 000B GETMBR R10 R0 K9 - 0x882C010A, // 000C GETMBR R11 R0 K10 - 0x7C140C00, // 000D CALL R5 6 - 0x5818000B, // 000E LDCONST R6 K11 - 0x7C0C0600, // 000F CALL R3 3 - 0xB80E0600, // 0010 GETNGBL R3 K3 - 0x8C0C0704, // 0011 GETMET R3 R3 K4 - 0x8C140505, // 0012 GETMET R5 R2 K5 - 0x581C000C, // 0013 LDCONST R7 K12 - 0x5820000D, // 0014 LDCONST R8 K13 - 0x88240109, // 0015 GETMBR R9 R0 K9 - 0x7C140800, // 0016 CALL R5 4 - 0x5818000E, // 0017 LDCONST R6 K14 - 0x7C0C0600, // 0018 CALL R3 3 - 0x500C0000, // 0019 LDBOOL R3 0 0 - 0x90020403, // 001A SETMBR R0 K2 R3 - 0x8C0C030F, // 001B GETMET R3 R1 K15 - 0x58140007, // 001C LDCONST R5 K7 - 0x58180008, // 001D LDCONST R6 K8 - 0x881C0109, // 001E GETMBR R7 R0 K9 - 0x8820010A, // 001F GETMBR R8 R0 K10 - 0x7C0C0A00, // 0020 CALL R3 5 - 0x880C0110, // 0021 GETMBR R3 R0 K16 - 0x780E001B, // 0022 JMPF R3 #003F - 0xB80E0600, // 0023 GETNGBL R3 K3 - 0x8C0C0704, // 0024 GETMET R3 R3 K4 - 0x8C140505, // 0025 GETMET R5 R2 K5 - 0x581C0006, // 0026 LDCONST R7 K6 - 0x58200007, // 0027 LDCONST R8 K7 - 0x58240008, // 0028 LDCONST R9 K8 - 0x88280111, // 0029 GETMBR R10 R0 K17 - 0x882C0112, // 002A GETMBR R11 R0 K18 - 0x7C140C00, // 002B CALL R5 6 - 0x5818000B, // 002C LDCONST R6 K11 - 0x7C0C0600, // 002D CALL R3 3 - 0xB80E0600, // 002E GETNGBL R3 K3 - 0x8C0C0704, // 002F GETMET R3 R3 K4 - 0x8C140505, // 0030 GETMET R5 R2 K5 - 0x581C000C, // 0031 LDCONST R7 K12 - 0x58200013, // 0032 LDCONST R8 K19 - 0x88240111, // 0033 GETMBR R9 R0 K17 - 0x7C140800, // 0034 CALL R5 4 - 0x5818000E, // 0035 LDCONST R6 K14 - 0x7C0C0600, // 0036 CALL R3 3 - 0x500C0000, // 0037 LDBOOL R3 0 0 - 0x90022003, // 0038 SETMBR R0 K16 R3 - 0x8C0C030F, // 0039 GETMET R3 R1 K15 - 0x58140007, // 003A LDCONST R5 K7 - 0x58180008, // 003B LDCONST R6 K8 - 0x881C0111, // 003C GETMBR R7 R0 K17 - 0x88200112, // 003D GETMBR R8 R0 K18 - 0x7C0C0A00, // 003E CALL R3 5 - 0xA8040001, // 003F EXBLK 1 1 - 0x70020010, // 0040 JMP #0052 - 0xAC0C0002, // 0041 CATCH R3 0 2 - 0x7002000D, // 0042 JMP #0051 - 0xB8160600, // 0043 GETNGBL R5 K3 - 0x8C140B04, // 0044 GETMET R5 R5 K4 - 0x601C0008, // 0045 GETGBL R7 G8 - 0x5C200600, // 0046 MOVE R8 R3 - 0x7C1C0200, // 0047 CALL R7 1 - 0x001E2807, // 0048 ADD R7 K20 R7 - 0x001C0F15, // 0049 ADD R7 R7 K21 - 0x60200008, // 004A GETGBL R8 G8 - 0x5C240800, // 004B MOVE R9 R4 - 0x7C200200, // 004C CALL R8 1 - 0x001C0E08, // 004D ADD R7 R7 R8 - 0x5820000E, // 004E LDCONST R8 K14 - 0x7C140600, // 004F CALL R5 3 - 0x70020000, // 0050 JMP #0052 - 0xB0080000, // 0051 RAISE 2 R0 R0 - 0x80000000, // 0052 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: msg_send -********************************************************************/ -be_local_closure(Matter_Device_msg_send, /* name */ - be_nested_proto( - 5, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 2]) { /* constants */ - /* K0 */ be_nested_str_weak(udp_server), - /* K1 */ be_nested_str_weak(send_UDP), - }), - be_str_weak(msg_send), - &be_const_str_solidified, - ( &(const binstruction[ 5]) { /* code */ - 0x88080100, // 0000 GETMBR R2 R0 K0 - 0x8C080501, // 0001 GETMET R2 R2 K1 - 0x5C100200, // 0002 MOVE R4 R1 - 0x7C080400, // 0003 CALL R2 2 - 0x80040400, // 0004 RET 1 R2 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: is_root_commissioning_open -********************************************************************/ -be_local_closure(Matter_Device_is_root_commissioning_open, /* name */ - be_nested_proto( - 3, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 2]) { /* constants */ - /* K0 */ be_nested_str_weak(commissioning_open), - /* K1 */ be_nested_str_weak(commissioning_admin_fabric), - }), - be_str_weak(is_root_commissioning_open), - &be_const_str_solidified, - ( &(const binstruction[11]) { /* code */ - 0x88040100, // 0000 GETMBR R1 R0 K0 - 0x4C080000, // 0001 LDNIL R2 - 0x20040202, // 0002 NE R1 R1 R2 - 0x78060003, // 0003 JMPF R1 #0008 - 0x88040101, // 0004 GETMBR R1 R0 K1 - 0x4C080000, // 0005 LDNIL R2 - 0x1C040202, // 0006 EQ R1 R1 R2 - 0x74060000, // 0007 JMPT R1 #0009 - 0x50040001, // 0008 LDBOOL R1 0 1 - 0x50040200, // 0009 LDBOOL R1 1 0 - 0x80040200, // 000A RET 1 R1 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: get_active_endpoints -********************************************************************/ -be_local_closure(Matter_Device_get_active_endpoints, /* name */ - be_nested_proto( - 9, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ ( &(const bvalue[ 6]) { /* constants */ - /* K0 */ be_nested_str_weak(plugins), - /* K1 */ be_nested_str_weak(get_endpoint), - /* K2 */ be_const_int(0), - /* K3 */ be_nested_str_weak(find), - /* K4 */ be_nested_str_weak(push), + /* K0 */ be_nested_str_weak(sessions), + /* K1 */ be_nested_str_weak(active_fabrics), + /* K2 */ be_nested_str_weak(get_device_id), + /* K3 */ be_nested_str_weak(get_fabric_id), + /* K4 */ be_nested_str_weak(mdns_announce_op_discovery), /* K5 */ be_nested_str_weak(stop_iteration), }), - be_str_weak(get_active_endpoints), + be_str_weak(mdns_announce_op_discovery_all_fabrics), &be_const_str_solidified, - ( &(const binstruction[28]) { /* code */ - 0x60080012, // 0000 GETGBL R2 G18 - 0x7C080000, // 0001 CALL R2 0 - 0x600C0010, // 0002 GETGBL R3 G16 - 0x88100100, // 0003 GETMBR R4 R0 K0 - 0x7C0C0200, // 0004 CALL R3 1 - 0xA8020011, // 0005 EXBLK 0 #0018 - 0x5C100600, // 0006 MOVE R4 R3 - 0x7C100000, // 0007 CALL R4 0 - 0x8C140901, // 0008 GETMET R5 R4 K1 - 0x7C140200, // 0009 CALL R5 1 - 0x78060002, // 000A JMPF R1 #000E - 0x1C180B02, // 000B EQ R6 R5 K2 - 0x781A0000, // 000C JMPF R6 #000E - 0x7001FFF7, // 000D JMP #0006 - 0x8C180503, // 000E GETMET R6 R2 K3 - 0x5C200A00, // 000F MOVE R8 R5 - 0x7C180400, // 0010 CALL R6 2 - 0x4C1C0000, // 0011 LDNIL R7 - 0x1C180C07, // 0012 EQ R6 R6 R7 - 0x781A0002, // 0013 JMPF R6 #0017 - 0x8C180504, // 0014 GETMET R6 R2 K4 - 0x5C200A00, // 0015 MOVE R8 R5 - 0x7C180400, // 0016 CALL R6 2 - 0x7001FFED, // 0017 JMP #0006 - 0x580C0005, // 0018 LDCONST R3 K5 - 0xAC0C0200, // 0019 CATCH R3 1 0 - 0xB0080000, // 001A RAISE 2 R0 R0 - 0x80040400, // 001B RET 1 R2 + ( &(const binstruction[22]) { /* code */ + 0x60040010, // 0000 GETGBL R1 G16 + 0x88080100, // 0001 GETMBR R2 R0 K0 + 0x8C080501, // 0002 GETMET R2 R2 K1 + 0x7C080200, // 0003 CALL R2 1 + 0x7C040200, // 0004 CALL R1 1 + 0xA802000B, // 0005 EXBLK 0 #0012 + 0x5C080200, // 0006 MOVE R2 R1 + 0x7C080000, // 0007 CALL R2 0 + 0x8C0C0502, // 0008 GETMET R3 R2 K2 + 0x7C0C0200, // 0009 CALL R3 1 + 0x780E0005, // 000A JMPF R3 #0011 + 0x8C0C0503, // 000B GETMET R3 R2 K3 + 0x7C0C0200, // 000C CALL R3 1 + 0x780E0002, // 000D JMPF R3 #0011 + 0x8C0C0104, // 000E GETMET R3 R0 K4 + 0x5C140400, // 000F MOVE R5 R2 + 0x7C0C0400, // 0010 CALL R3 2 + 0x7001FFF3, // 0011 JMP #0006 + 0x58040005, // 0012 LDCONST R1 K5 + 0xAC040200, // 0013 CATCH R1 1 0 + 0xB0080000, // 0014 RAISE 2 R0 R0 + 0x80000000, // 0015 RET 0 }) ) ); @@ -2854,455 +3805,96 @@ be_local_closure(Matter_Device_get_active_endpoints, /* name */ /******************************************************************** -** Solidified function: load_param +** Solidified function: MtrJoin ********************************************************************/ -be_local_closure(Matter_Device_load_param, /* name */ +be_local_closure(Matter_Device_MtrJoin, /* name */ + be_nested_proto( + 8, /* nstack */ + 5, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 4]) { /* constants */ + /* K0 */ be_nested_str_weak(start_root_basic_commissioning), + /* K1 */ be_nested_str_weak(stop_basic_commissioning), + /* K2 */ be_nested_str_weak(tasmota), + /* K3 */ be_nested_str_weak(resp_cmnd_done), + }), + be_str_weak(MtrJoin), + &be_const_str_solidified, + ( &(const binstruction[13]) { /* code */ + 0x60140009, // 0000 GETGBL R5 G9 + 0x5C180600, // 0001 MOVE R6 R3 + 0x7C140200, // 0002 CALL R5 1 + 0x78160002, // 0003 JMPF R5 #0007 + 0x8C180100, // 0004 GETMET R6 R0 K0 + 0x7C180200, // 0005 CALL R6 1 + 0x70020001, // 0006 JMP #0009 + 0x8C180101, // 0007 GETMET R6 R0 K1 + 0x7C180200, // 0008 CALL R6 1 + 0xB81A0400, // 0009 GETNGBL R6 K2 + 0x8C180D03, // 000A GETMET R6 R6 K3 + 0x7C180200, // 000B CALL R6 1 + 0x80000000, // 000C RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: invoke_request +********************************************************************/ +be_local_closure(Matter_Device_invoke_request, /* name */ be_nested_proto( 12, /* nstack */ - 1, /* argc */ + 4, /* argc */ 2, /* varg */ 0, /* has upvals */ NULL, /* no upvals */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[24]) { /* constants */ - /* K0 */ be_nested_str_weak(string), - /* K1 */ be_nested_str_weak(crypto), - /* K2 */ be_nested_str_weak(FILENAME), - /* K3 */ be_nested_str_weak(read), - /* K4 */ be_nested_str_weak(close), - /* K5 */ be_nested_str_weak(json), - /* K6 */ be_nested_str_weak(load), - /* K7 */ be_nested_str_weak(root_discriminator), - /* K8 */ be_nested_str_weak(find), - /* K9 */ be_nested_str_weak(distinguish), - /* K10 */ be_nested_str_weak(root_passcode), - /* K11 */ be_nested_str_weak(passcode), - /* K12 */ be_nested_str_weak(ipv4only), - /* K13 */ be_nested_str_weak(io_error), - /* K14 */ be_nested_str_weak(tasmota), - /* K15 */ be_nested_str_weak(log), - /* K16 */ be_nested_str_weak(MTR_X3A_X20Session_Store_X3A_X3Aload_X20Exception_X3A), - /* K17 */ be_nested_str_weak(_X7C), - /* K18 */ be_const_int(2), - /* K19 */ be_nested_str_weak(random), - /* K20 */ be_nested_str_weak(get), - /* K21 */ be_const_int(0), - /* K22 */ be_nested_str_weak(PASSCODE_DEFAULT), - /* K23 */ be_nested_str_weak(save_param), - }), - be_str_weak(load_param), - &be_const_str_solidified, - ( &(const binstruction[79]) { /* code */ - 0xA4060000, // 0000 IMPORT R1 K0 - 0xA40A0200, // 0001 IMPORT R2 K1 - 0xA802001D, // 0002 EXBLK 0 #0021 - 0x600C0011, // 0003 GETGBL R3 G17 - 0x88100102, // 0004 GETMBR R4 R0 K2 - 0x7C0C0200, // 0005 CALL R3 1 - 0x8C100703, // 0006 GETMET R4 R3 K3 - 0x7C100200, // 0007 CALL R4 1 - 0x8C140704, // 0008 GETMET R5 R3 K4 - 0x7C140200, // 0009 CALL R5 1 - 0xA4160A00, // 000A IMPORT R5 K5 - 0x8C180B06, // 000B GETMET R6 R5 K6 - 0x5C200800, // 000C MOVE R8 R4 - 0x7C180400, // 000D CALL R6 2 - 0x8C1C0D08, // 000E GETMET R7 R6 K8 - 0x58240009, // 000F LDCONST R9 K9 - 0x88280107, // 0010 GETMBR R10 R0 K7 - 0x7C1C0600, // 0011 CALL R7 3 - 0x90020E07, // 0012 SETMBR R0 K7 R7 - 0x8C1C0D08, // 0013 GETMET R7 R6 K8 - 0x5824000B, // 0014 LDCONST R9 K11 - 0x8828010A, // 0015 GETMBR R10 R0 K10 - 0x7C1C0600, // 0016 CALL R7 3 - 0x90021407, // 0017 SETMBR R0 K10 R7 - 0x601C0017, // 0018 GETGBL R7 G23 - 0x8C200D08, // 0019 GETMET R8 R6 K8 - 0x5828000C, // 001A LDCONST R10 K12 - 0x502C0000, // 001B LDBOOL R11 0 0 - 0x7C200600, // 001C CALL R8 3 - 0x7C1C0200, // 001D CALL R7 1 - 0x90021807, // 001E SETMBR R0 K12 R7 - 0xA8040001, // 001F EXBLK 1 1 - 0x70020012, // 0020 JMP #0034 - 0xAC0C0002, // 0021 CATCH R3 0 2 - 0x7002000F, // 0022 JMP #0033 - 0x2014070D, // 0023 NE R5 R3 K13 - 0x7816000C, // 0024 JMPF R5 #0032 - 0xB8161C00, // 0025 GETNGBL R5 K14 - 0x8C140B0F, // 0026 GETMET R5 R5 K15 - 0x601C0008, // 0027 GETGBL R7 G8 - 0x5C200600, // 0028 MOVE R8 R3 - 0x7C1C0200, // 0029 CALL R7 1 - 0x001E2007, // 002A ADD R7 K16 R7 - 0x001C0F11, // 002B ADD R7 R7 K17 - 0x60200008, // 002C GETGBL R8 G8 - 0x5C240800, // 002D MOVE R9 R4 - 0x7C200200, // 002E CALL R8 1 - 0x001C0E08, // 002F ADD R7 R7 R8 - 0x58200012, // 0030 LDCONST R8 K18 - 0x7C140600, // 0031 CALL R5 3 - 0x70020000, // 0032 JMP #0034 - 0xB0080000, // 0033 RAISE 2 R0 R0 - 0x500C0000, // 0034 LDBOOL R3 0 0 - 0x88100107, // 0035 GETMBR R4 R0 K7 - 0x4C140000, // 0036 LDNIL R5 - 0x1C100805, // 0037 EQ R4 R4 R5 - 0x7812000A, // 0038 JMPF R4 #0044 - 0x8C100513, // 0039 GETMET R4 R2 K19 - 0x58180012, // 003A LDCONST R6 K18 - 0x7C100400, // 003B CALL R4 2 - 0x8C100914, // 003C GETMET R4 R4 K20 - 0x58180015, // 003D LDCONST R6 K21 - 0x581C0012, // 003E LDCONST R7 K18 - 0x7C100600, // 003F CALL R4 3 - 0x54160FFE, // 0040 LDINT R5 4095 - 0x2C100805, // 0041 AND R4 R4 R5 - 0x90020E04, // 0042 SETMBR R0 K7 R4 - 0x500C0200, // 0043 LDBOOL R3 1 0 - 0x8810010A, // 0044 GETMBR R4 R0 K10 - 0x4C140000, // 0045 LDNIL R5 - 0x1C100805, // 0046 EQ R4 R4 R5 - 0x78120002, // 0047 JMPF R4 #004B - 0x88100116, // 0048 GETMBR R4 R0 K22 - 0x90021404, // 0049 SETMBR R0 K10 R4 - 0x500C0200, // 004A LDBOOL R3 1 0 - 0x780E0001, // 004B JMPF R3 #004E - 0x8C100117, // 004C GETMET R4 R0 K23 - 0x7C100200, // 004D CALL R4 1 - 0x80000000, // 004E RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: process_attribute_expansion -********************************************************************/ -be_local_closure(Matter_Device_process_attribute_expansion, /* name */ - be_nested_proto( - 29, /* nstack */ - 3, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 1, /* has sup protos */ - ( &(const struct bproto*[ 1]) { - be_nested_proto( - 7, /* nstack */ - 1, /* argc */ - 0, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 5]) { /* constants */ - /* K0 */ be_nested_str_weak(keys), - /* K1 */ be_nested_str_weak(push), - /* K2 */ be_nested_str_weak(stop_iteration), - /* K3 */ be_const_int(1), - /* K4 */ be_const_int(0), - }), - be_str_weak(keys_sorted), - &be_const_str_solidified, - ( &(const binstruction[45]) { /* code */ - 0x60040012, // 0000 GETGBL R1 G18 - 0x7C040000, // 0001 CALL R1 0 - 0x60080010, // 0002 GETGBL R2 G16 - 0x8C0C0100, // 0003 GETMET R3 R0 K0 - 0x7C0C0200, // 0004 CALL R3 1 - 0x7C080200, // 0005 CALL R2 1 - 0xA8020005, // 0006 EXBLK 0 #000D - 0x5C0C0400, // 0007 MOVE R3 R2 - 0x7C0C0000, // 0008 CALL R3 0 - 0x8C100301, // 0009 GETMET R4 R1 K1 - 0x5C180600, // 000A MOVE R6 R3 - 0x7C100400, // 000B CALL R4 2 - 0x7001FFF9, // 000C JMP #0007 - 0x58080002, // 000D LDCONST R2 K2 - 0xAC080200, // 000E CATCH R2 1 0 - 0xB0080000, // 000F RAISE 2 R0 R0 - 0x60080010, // 0010 GETGBL R2 G16 - 0x600C000C, // 0011 GETGBL R3 G12 - 0x5C100200, // 0012 MOVE R4 R1 - 0x7C0C0200, // 0013 CALL R3 1 - 0x040C0703, // 0014 SUB R3 R3 K3 - 0x400E0603, // 0015 CONNECT R3 K3 R3 - 0x7C080200, // 0016 CALL R2 1 - 0xA8020010, // 0017 EXBLK 0 #0029 - 0x5C0C0400, // 0018 MOVE R3 R2 - 0x7C0C0000, // 0019 CALL R3 0 - 0x94100203, // 001A GETIDX R4 R1 R3 - 0x5C140600, // 001B MOVE R5 R3 - 0x24180B04, // 001C GT R6 R5 K4 - 0x781A0008, // 001D JMPF R6 #0027 - 0x04180B03, // 001E SUB R6 R5 K3 - 0x94180206, // 001F GETIDX R6 R1 R6 - 0x24180C04, // 0020 GT R6 R6 R4 - 0x781A0004, // 0021 JMPF R6 #0027 - 0x04180B03, // 0022 SUB R6 R5 K3 - 0x94180206, // 0023 GETIDX R6 R1 R6 - 0x98040A06, // 0024 SETIDX R1 R5 R6 - 0x04140B03, // 0025 SUB R5 R5 K3 - 0x7001FFF4, // 0026 JMP #001C - 0x98040A04, // 0027 SETIDX R1 R5 R4 - 0x7001FFEE, // 0028 JMP #0018 - 0x58080002, // 0029 LDCONST R2 K2 - 0xAC080200, // 002A CATCH R2 1 0 - 0xB0080000, // 002B RAISE 2 R0 R0 - 0x80040200, // 002C RET 1 R1 - }) - ), - }), - 1, /* has constants */ - ( &(const bvalue[22]) { /* constants */ - /* K0 */ be_nested_str_weak(string), + ( &(const bvalue[ 8]) { /* constants */ + /* K0 */ be_const_int(0), /* K1 */ be_nested_str_weak(endpoint), - /* K2 */ be_nested_str_weak(cluster), - /* K3 */ be_nested_str_weak(attribute), - /* K4 */ be_nested_str_weak(plugins), - /* K5 */ be_nested_str_weak(get_endpoint), - /* K6 */ be_nested_str_weak(contains), - /* K7 */ be_nested_str_weak(get_cluster_list), - /* K8 */ be_nested_str_weak(get_attribute_list), - /* K9 */ be_nested_str_weak(push), - /* K10 */ be_nested_str_weak(stop_iteration), - /* K11 */ be_nested_str_weak(tasmota), - /* K12 */ be_nested_str_weak(log), - /* K13 */ be_nested_str_weak(format), - /* K14 */ be_nested_str_weak(MTR_X3A_X20expansion_X20_X5B_X2502X_X5D_X2504X_X2F_X2504X), - /* K15 */ be_const_int(3), - /* K16 */ be_nested_str_weak(status), - /* K17 */ be_nested_str_weak(matter), - /* K18 */ be_nested_str_weak(UNSUPPORTED_ENDPOINT), - /* K19 */ be_nested_str_weak(UNSUPPORTED_CLUSTER), - /* K20 */ be_nested_str_weak(UNSUPPORTED_ATTRIBUTE), - /* K21 */ be_nested_str_weak(UNREPORTABLE_ATTRIBUTE), + /* K2 */ be_nested_str_weak(plugins), + /* K3 */ be_nested_str_weak(invoke_request), + /* K4 */ be_const_int(1), + /* K5 */ be_nested_str_weak(status), + /* K6 */ be_nested_str_weak(matter), + /* K7 */ be_nested_str_weak(UNSUPPORTED_ENDPOINT), }), - be_str_weak(process_attribute_expansion), + be_str_weak(invoke_request), &be_const_str_solidified, - ( &(const binstruction[216]) { /* code */ - 0x840C0000, // 0000 CLOSURE R3 P0 - 0xA4120000, // 0001 IMPORT R4 K0 - 0x88140301, // 0002 GETMBR R5 R1 K1 - 0x50180000, // 0003 LDBOOL R6 0 0 - 0x881C0302, // 0004 GETMBR R7 R1 K2 - 0x50200000, // 0005 LDBOOL R8 0 0 - 0x88240303, // 0006 GETMBR R9 R1 K3 - 0x50280000, // 0007 LDBOOL R10 0 0 - 0x882C0301, // 0008 GETMBR R11 R1 K1 - 0x4C300000, // 0009 LDNIL R12 - 0x202C160C, // 000A NE R11 R11 R12 - 0x782E0007, // 000B JMPF R11 #0014 - 0x882C0302, // 000C GETMBR R11 R1 K2 - 0x4C300000, // 000D LDNIL R12 - 0x202C160C, // 000E NE R11 R11 R12 - 0x782E0003, // 000F JMPF R11 #0014 - 0x882C0303, // 0010 GETMBR R11 R1 K3 - 0x4C300000, // 0011 LDNIL R12 - 0x202C160C, // 0012 NE R11 R11 R12 - 0x742E0000, // 0013 JMPT R11 #0015 - 0x502C0001, // 0014 LDBOOL R11 0 1 - 0x502C0200, // 0015 LDBOOL R11 1 0 - 0x60300013, // 0016 GETGBL R12 G19 - 0x7C300000, // 0017 CALL R12 0 - 0x60340010, // 0018 GETGBL R13 G16 - 0x88380104, // 0019 GETMBR R14 R0 K4 - 0x7C340200, // 001A CALL R13 1 - 0xA8020055, // 001B EXBLK 0 #0072 - 0x5C381A00, // 001C MOVE R14 R13 - 0x7C380000, // 001D CALL R14 0 - 0x8C3C1D05, // 001E GETMET R15 R14 K5 - 0x7C3C0200, // 001F CALL R15 1 - 0x4C400000, // 0020 LDNIL R16 - 0x20400A10, // 0021 NE R16 R5 R16 - 0x78420002, // 0022 JMPF R16 #0026 - 0x20401E05, // 0023 NE R16 R15 R5 - 0x78420000, // 0024 JMPF R16 #0026 - 0x7001FFF5, // 0025 JMP #001C - 0x8C401906, // 0026 GETMET R16 R12 K6 - 0x5C481E00, // 0027 MOVE R18 R15 - 0x7C400400, // 0028 CALL R16 2 - 0x74420002, // 0029 JMPT R16 #002D - 0x60400013, // 002A GETGBL R16 G19 - 0x7C400000, // 002B CALL R16 0 - 0x98301E10, // 002C SETIDX R12 R15 R16 - 0x50180200, // 002D LDBOOL R6 1 0 - 0x8C401D07, // 002E GETMET R16 R14 K7 - 0x5C481E00, // 002F MOVE R18 R15 - 0x7C400400, // 0030 CALL R16 2 - 0x60440010, // 0031 GETGBL R17 G16 - 0x5C482000, // 0032 MOVE R18 R16 - 0x7C440200, // 0033 CALL R17 1 - 0xA8020038, // 0034 EXBLK 0 #006E - 0x5C482200, // 0035 MOVE R18 R17 - 0x7C480000, // 0036 CALL R18 0 - 0x4C4C0000, // 0037 LDNIL R19 - 0x204C0E13, // 0038 NE R19 R7 R19 - 0x784E0002, // 0039 JMPF R19 #003D - 0x204C2407, // 003A NE R19 R18 R7 - 0x784E0000, // 003B JMPF R19 #003D - 0x7001FFF7, // 003C JMP #0035 - 0x944C180F, // 003D GETIDX R19 R12 R15 - 0x8C4C2706, // 003E GETMET R19 R19 K6 - 0x5C542400, // 003F MOVE R21 R18 - 0x7C4C0400, // 0040 CALL R19 2 - 0x744E0003, // 0041 JMPT R19 #0046 - 0x944C180F, // 0042 GETIDX R19 R12 R15 - 0x60500013, // 0043 GETGBL R20 G19 - 0x7C500000, // 0044 CALL R20 0 - 0x984C2414, // 0045 SETIDX R19 R18 R20 - 0x50200200, // 0046 LDBOOL R8 1 0 - 0x8C4C1D08, // 0047 GETMET R19 R14 K8 - 0x5C541E00, // 0048 MOVE R21 R15 - 0x5C582400, // 0049 MOVE R22 R18 - 0x7C4C0600, // 004A CALL R19 3 - 0x60500010, // 004B GETGBL R20 G16 - 0x5C542600, // 004C MOVE R21 R19 - 0x7C500200, // 004D CALL R20 1 - 0xA802001A, // 004E EXBLK 0 #006A - 0x5C542800, // 004F MOVE R21 R20 - 0x7C540000, // 0050 CALL R21 0 - 0x4C580000, // 0051 LDNIL R22 - 0x20581216, // 0052 NE R22 R9 R22 - 0x785A0002, // 0053 JMPF R22 #0057 - 0x20582A09, // 0054 NE R22 R21 R9 - 0x785A0000, // 0055 JMPF R22 #0057 - 0x7001FFF7, // 0056 JMP #004F - 0x9458180F, // 0057 GETIDX R22 R12 R15 - 0x94582C12, // 0058 GETIDX R22 R22 R18 - 0x8C582D06, // 0059 GETMET R22 R22 K6 - 0x5C602A00, // 005A MOVE R24 R21 - 0x7C580400, // 005B CALL R22 2 - 0x745A0004, // 005C JMPT R22 #0062 - 0x9458180F, // 005D GETIDX R22 R12 R15 - 0x94582C12, // 005E GETIDX R22 R22 R18 - 0x605C0012, // 005F GETGBL R23 G18 - 0x7C5C0000, // 0060 CALL R23 0 - 0x98582A17, // 0061 SETIDX R22 R21 R23 - 0x50280200, // 0062 LDBOOL R10 1 0 - 0x9458180F, // 0063 GETIDX R22 R12 R15 - 0x94582C12, // 0064 GETIDX R22 R22 R18 - 0x94582C15, // 0065 GETIDX R22 R22 R21 - 0x8C582D09, // 0066 GETMET R22 R22 K9 - 0x5C601C00, // 0067 MOVE R24 R14 - 0x7C580400, // 0068 CALL R22 2 - 0x7001FFE4, // 0069 JMP #004F - 0x5850000A, // 006A LDCONST R20 K10 - 0xAC500200, // 006B CATCH R20 1 0 - 0xB0080000, // 006C RAISE 2 R0 R0 - 0x7001FFC6, // 006D JMP #0035 - 0x5844000A, // 006E LDCONST R17 K10 - 0xAC440200, // 006F CATCH R17 1 0 - 0xB0080000, // 0070 RAISE 2 R0 R0 - 0x7001FFA9, // 0071 JMP #001C - 0x5834000A, // 0072 LDCONST R13 K10 - 0xAC340200, // 0073 CATCH R13 1 0 - 0xB0080000, // 0074 RAISE 2 R0 R0 - 0x60340010, // 0075 GETGBL R13 G16 - 0x5C380600, // 0076 MOVE R14 R3 - 0x5C3C1800, // 0077 MOVE R15 R12 - 0x7C380200, // 0078 CALL R14 1 - 0x7C340200, // 0079 CALL R13 1 - 0xA802003D, // 007A EXBLK 0 #00B9 - 0x5C381A00, // 007B MOVE R14 R13 - 0x7C380000, // 007C CALL R14 0 - 0x603C0010, // 007D GETGBL R15 G16 - 0x5C400600, // 007E MOVE R16 R3 - 0x9444180E, // 007F GETIDX R17 R12 R14 - 0x7C400200, // 0080 CALL R16 1 - 0x7C3C0200, // 0081 CALL R15 1 - 0xA8020031, // 0082 EXBLK 0 #00B5 - 0x5C401E00, // 0083 MOVE R16 R15 - 0x7C400000, // 0084 CALL R16 0 - 0x60440010, // 0085 GETGBL R17 G16 - 0x5C480600, // 0086 MOVE R18 R3 - 0x944C180E, // 0087 GETIDX R19 R12 R14 - 0x944C2610, // 0088 GETIDX R19 R19 R16 - 0x7C480200, // 0089 CALL R18 1 - 0x7C440200, // 008A CALL R17 1 - 0xA8020024, // 008B EXBLK 0 #00B1 - 0x5C482200, // 008C MOVE R18 R17 - 0x7C480000, // 008D CALL R18 0 - 0x604C0010, // 008E GETGBL R19 G16 - 0x9450180E, // 008F GETIDX R20 R12 R14 - 0x94502810, // 0090 GETIDX R20 R20 R16 - 0x94502812, // 0091 GETIDX R20 R20 R18 - 0x7C4C0200, // 0092 CALL R19 1 - 0xA8020018, // 0093 EXBLK 0 #00AD - 0x5C502600, // 0094 MOVE R20 R19 - 0x7C500000, // 0095 CALL R20 0 - 0xB8561600, // 0096 GETNGBL R21 K11 - 0x8C542B0C, // 0097 GETMET R21 R21 K12 - 0x8C5C090D, // 0098 GETMET R23 R4 K13 - 0x5864000E, // 0099 LDCONST R25 K14 - 0x5C681C00, // 009A MOVE R26 R14 - 0x5C6C2000, // 009B MOVE R27 R16 - 0x5C702400, // 009C MOVE R28 R18 - 0x7C5C0A00, // 009D CALL R23 5 - 0x5860000F, // 009E LDCONST R24 K15 - 0x7C540600, // 009F CALL R21 3 - 0x9006020E, // 00A0 SETMBR R1 K1 R14 - 0x90060410, // 00A1 SETMBR R1 K2 R16 - 0x90060612, // 00A2 SETMBR R1 K3 R18 - 0x5C540400, // 00A3 MOVE R21 R2 - 0x5C582800, // 00A4 MOVE R22 R20 - 0x5C5C0200, // 00A5 MOVE R23 R1 - 0x5C601600, // 00A6 MOVE R24 R11 - 0x7C540600, // 00A7 CALL R21 3 - 0x782E0002, // 00A8 JMPF R11 #00AC - 0x78560001, // 00A9 JMPF R21 #00AC - 0xA8040004, // 00AA EXBLK 1 4 - 0x80002C00, // 00AB RET 0 - 0x7001FFE6, // 00AC JMP #0094 - 0x584C000A, // 00AD LDCONST R19 K10 - 0xAC4C0200, // 00AE CATCH R19 1 0 - 0xB0080000, // 00AF RAISE 2 R0 R0 - 0x7001FFDA, // 00B0 JMP #008C - 0x5844000A, // 00B1 LDCONST R17 K10 - 0xAC440200, // 00B2 CATCH R17 1 0 - 0xB0080000, // 00B3 RAISE 2 R0 R0 - 0x7001FFCD, // 00B4 JMP #0083 - 0x583C000A, // 00B5 LDCONST R15 K10 - 0xAC3C0200, // 00B6 CATCH R15 1 0 - 0xB0080000, // 00B7 RAISE 2 R0 R0 - 0x7001FFC1, // 00B8 JMP #007B - 0x5834000A, // 00B9 LDCONST R13 K10 - 0xAC340200, // 00BA CATCH R13 1 0 - 0xB0080000, // 00BB RAISE 2 R0 R0 - 0x782E0019, // 00BC JMPF R11 #00D7 - 0x5C340C00, // 00BD MOVE R13 R6 - 0x74360003, // 00BE JMPT R13 #00C3 - 0xB8362200, // 00BF GETNGBL R13 K17 - 0x88341B12, // 00C0 GETMBR R13 R13 K18 - 0x9006200D, // 00C1 SETMBR R1 K16 R13 - 0x7002000E, // 00C2 JMP #00D2 - 0x5C341000, // 00C3 MOVE R13 R8 - 0x74360003, // 00C4 JMPT R13 #00C9 - 0xB8362200, // 00C5 GETNGBL R13 K17 - 0x88341B13, // 00C6 GETMBR R13 R13 K19 - 0x9006200D, // 00C7 SETMBR R1 K16 R13 - 0x70020008, // 00C8 JMP #00D2 - 0x5C341400, // 00C9 MOVE R13 R10 - 0x74360003, // 00CA JMPT R13 #00CF - 0xB8362200, // 00CB GETNGBL R13 K17 - 0x88341B14, // 00CC GETMBR R13 R13 K20 - 0x9006200D, // 00CD SETMBR R1 K16 R13 - 0x70020002, // 00CE JMP #00D2 - 0xB8362200, // 00CF GETNGBL R13 K17 - 0x88341B15, // 00D0 GETMBR R13 R13 K21 - 0x9006200D, // 00D1 SETMBR R1 K16 R13 - 0x5C340400, // 00D2 MOVE R13 R2 - 0x4C380000, // 00D3 LDNIL R14 - 0x5C3C0200, // 00D4 MOVE R15 R1 - 0x50400200, // 00D5 LDBOOL R16 1 0 - 0x7C340600, // 00D6 CALL R13 3 - 0x80000000, // 00D7 RET 0 + ( &(const binstruction[24]) { /* code */ + 0x58100000, // 0000 LDCONST R4 K0 + 0x88140701, // 0001 GETMBR R5 R3 K1 + 0x6018000C, // 0002 GETGBL R6 G12 + 0x881C0102, // 0003 GETMBR R7 R0 K2 + 0x7C180200, // 0004 CALL R6 1 + 0x14180806, // 0005 LT R6 R4 R6 + 0x781A000C, // 0006 JMPF R6 #0014 + 0x88180102, // 0007 GETMBR R6 R0 K2 + 0x94180C04, // 0008 GETIDX R6 R6 R4 + 0x881C0D01, // 0009 GETMBR R7 R6 K1 + 0x1C1C0E05, // 000A EQ R7 R7 R5 + 0x781E0005, // 000B JMPF R7 #0012 + 0x8C1C0D03, // 000C GETMET R7 R6 K3 + 0x5C240200, // 000D MOVE R9 R1 + 0x5C280400, // 000E MOVE R10 R2 + 0x5C2C0600, // 000F MOVE R11 R3 + 0x7C1C0800, // 0010 CALL R7 4 + 0x80040E00, // 0011 RET 1 R7 + 0x00100904, // 0012 ADD R4 R4 K4 + 0x7001FFED, // 0013 JMP #0002 + 0xB81A0C00, // 0014 GETNGBL R6 K6 + 0x88180D07, // 0015 GETMBR R6 R6 K7 + 0x900E0A06, // 0016 SETMBR R3 K5 R6 + 0x80000000, // 0017 RET 0 }) ) ); @@ -3310,11 +3902,11 @@ be_local_closure(Matter_Device_process_attribute_expansion, /* name */ /******************************************************************** -** Solidified function: autoconf_device +** Solidified function: compute_manual_pairing_code ********************************************************************/ -be_local_closure(Matter_Device_autoconf_device, /* name */ +be_local_closure(Matter_Device_compute_manual_pairing_code, /* name */ be_nested_proto( - 21, /* nstack */ + 11, /* nstack */ 1, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -3322,496 +3914,50 @@ be_local_closure(Matter_Device_autoconf_device, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[46]) { /* constants */ + ( &(const bvalue[ 8]) { /* constants */ /* K0 */ be_nested_str_weak(string), - /* K1 */ be_nested_str_weak(json), - /* K2 */ be_const_int(1), - /* K3 */ be_nested_str_weak(light), - /* K4 */ be_nested_str_weak(get), - /* K5 */ be_nested_str_weak(find), - /* K6 */ be_nested_str_weak(channels), - /* K7 */ be_nested_str_weak(), - /* K8 */ be_const_int(0), - /* K9 */ be_nested_str_weak(plugins), - /* K10 */ be_nested_str_weak(push), - /* K11 */ be_nested_str_weak(matter), - /* K12 */ be_nested_str_weak(Plugin_Light1), - /* K13 */ be_nested_str_weak(tasmota), - /* K14 */ be_nested_str_weak(log), - /* K15 */ be_nested_str_weak(format), - /* K16 */ be_nested_str_weak(MTR_X3A_X20Endpoint_X3A_X25i_X20Light_Dimmer), - /* K17 */ be_const_int(2), - /* K18 */ be_nested_str_weak(Plugin_Light2), - /* K19 */ be_nested_str_weak(MTR_X3A_X20Endpoint_X3A_X25i_X20Light_CT), - /* K20 */ be_nested_str_weak(Plugin_Light3), - /* K21 */ be_nested_str_weak(MTR_X3A_X20Endpoint_X3A_X25i_X20Light_RGB), - /* K22 */ be_nested_str_weak(get_power), - /* K23 */ be_nested_str_weak(Plugin_OnOff), - /* K24 */ be_nested_str_weak(MTR_X3A_X20Endpoint_X3A_X25i_X20Relay__X25i), - /* K25 */ be_nested_str_weak(load), - /* K26 */ be_nested_str_weak(read_sensors), - /* K27 */ be_nested_str_weak(k2l), - /* K28 */ be_nested_str_weak(contains), - /* K29 */ be_nested_str_weak(Temperature), - /* K30 */ be_nested_str_weak(_X23Temperature), - /* K31 */ be_nested_str_weak(Plugin_Sensor_Temp), - /* K32 */ be_nested_str_weak(MTR_X3A_X20Endpoint_X3A_X25i_X20Temperature_X20_X28_X25s_X29), - /* K33 */ be_nested_str_weak(stop_iteration), - /* K34 */ be_nested_str_weak(Pressure), - /* K35 */ be_nested_str_weak(_X23Pressure), - /* K36 */ be_nested_str_weak(Plugin_Sensor_Pressure), - /* K37 */ be_nested_str_weak(MTR_X3A_X20Endpoint_X3A_X25i_X20Pressure_X20_X28_X25s_X29), - /* K38 */ be_nested_str_weak(Illuminance), - /* K39 */ be_nested_str_weak(_X23Illuminance), - /* K40 */ be_nested_str_weak(Plugin_Sensor_Light), - /* K41 */ be_nested_str_weak(MTR_X3A_X20Endpoint_X3A_X25i_X20Light_X20_X28_X25s_X29), - /* K42 */ be_nested_str_weak(Humidity), - /* K43 */ be_nested_str_weak(_X23Humidity), - /* K44 */ be_nested_str_weak(Plugin_Sensor_Humidity), - /* K45 */ be_nested_str_weak(MTR_X3A_X20Endpoint_X3A_X25i_X20Humidity_X20_X28_X25s_X29), + /* K1 */ be_nested_str_weak(root_discriminator), + /* K2 */ be_nested_str_weak(root_passcode), + /* K3 */ be_nested_str_weak(format), + /* K4 */ be_nested_str_weak(_X251i_X2505i_X2504i), + /* K5 */ be_nested_str_weak(matter), + /* K6 */ be_nested_str_weak(Verhoeff), + /* K7 */ be_nested_str_weak(checksum), }), - be_str_weak(autoconf_device), + be_str_weak(compute_manual_pairing_code), &be_const_str_solidified, - ( &(const binstruction[307]) { /* code */ + ( &(const binstruction[31]) { /* code */ 0xA4060000, // 0000 IMPORT R1 K0 - 0xA40A0200, // 0001 IMPORT R2 K1 - 0x580C0002, // 0002 LDCONST R3 K2 - 0x50100000, // 0003 LDBOOL R4 0 0 - 0xA4160600, // 0004 IMPORT R5 K3 - 0x8C180B04, // 0005 GETMET R6 R5 K4 - 0x7C180200, // 0006 CALL R6 1 - 0x4C1C0000, // 0007 LDNIL R7 - 0x201C0C07, // 0008 NE R7 R6 R7 - 0x781E003F, // 0009 JMPF R7 #004A - 0x601C000C, // 000A GETGBL R7 G12 - 0x8C200D05, // 000B GETMET R8 R6 K5 - 0x58280006, // 000C LDCONST R10 K6 - 0x582C0007, // 000D LDCONST R11 K7 - 0x7C200600, // 000E CALL R8 3 - 0x7C1C0200, // 000F CALL R7 1 - 0x24200F08, // 0010 GT R8 R7 K8 - 0x78220037, // 0011 JMPF R8 #004A - 0x1C200F02, // 0012 EQ R8 R7 K2 - 0x78220010, // 0013 JMPF R8 #0025 - 0x88200109, // 0014 GETMBR R8 R0 K9 - 0x8C20110A, // 0015 GETMET R8 R8 K10 - 0xB82A1600, // 0016 GETNGBL R10 K11 - 0x8C28150C, // 0017 GETMET R10 R10 K12 - 0x5C300000, // 0018 MOVE R12 R0 - 0x5C340600, // 0019 MOVE R13 R3 - 0x7C280600, // 001A CALL R10 3 - 0x7C200400, // 001B CALL R8 2 - 0xB8221A00, // 001C GETNGBL R8 K13 - 0x8C20110E, // 001D GETMET R8 R8 K14 - 0x8C28030F, // 001E GETMET R10 R1 K15 - 0x58300010, // 001F LDCONST R12 K16 - 0x5C340600, // 0020 MOVE R13 R3 - 0x7C280600, // 0021 CALL R10 3 - 0x582C0011, // 0022 LDCONST R11 K17 - 0x7C200600, // 0023 CALL R8 3 - 0x70020022, // 0024 JMP #0048 - 0x1C200F11, // 0025 EQ R8 R7 K17 - 0x78220010, // 0026 JMPF R8 #0038 - 0x88200109, // 0027 GETMBR R8 R0 K9 - 0x8C20110A, // 0028 GETMET R8 R8 K10 - 0xB82A1600, // 0029 GETNGBL R10 K11 - 0x8C281512, // 002A GETMET R10 R10 K18 - 0x5C300000, // 002B MOVE R12 R0 - 0x5C340600, // 002C MOVE R13 R3 - 0x7C280600, // 002D CALL R10 3 - 0x7C200400, // 002E CALL R8 2 - 0xB8221A00, // 002F GETNGBL R8 K13 - 0x8C20110E, // 0030 GETMET R8 R8 K14 - 0x8C28030F, // 0031 GETMET R10 R1 K15 - 0x58300013, // 0032 LDCONST R12 K19 - 0x5C340600, // 0033 MOVE R13 R3 - 0x7C280600, // 0034 CALL R10 3 - 0x582C0011, // 0035 LDCONST R11 K17 - 0x7C200600, // 0036 CALL R8 3 - 0x7002000F, // 0037 JMP #0048 - 0x88200109, // 0038 GETMBR R8 R0 K9 - 0x8C20110A, // 0039 GETMET R8 R8 K10 - 0xB82A1600, // 003A GETNGBL R10 K11 - 0x8C281514, // 003B GETMET R10 R10 K20 - 0x5C300000, // 003C MOVE R12 R0 - 0x5C340600, // 003D MOVE R13 R3 - 0x7C280600, // 003E CALL R10 3 - 0x7C200400, // 003F CALL R8 2 - 0xB8221A00, // 0040 GETNGBL R8 K13 - 0x8C20110E, // 0041 GETMET R8 R8 K14 - 0x8C28030F, // 0042 GETMET R10 R1 K15 - 0x58300015, // 0043 LDCONST R12 K21 - 0x5C340600, // 0044 MOVE R13 R3 - 0x7C280600, // 0045 CALL R10 3 - 0x582C0011, // 0046 LDCONST R11 K17 - 0x7C200600, // 0047 CALL R8 3 - 0x50100200, // 0048 LDBOOL R4 1 0 - 0x000C0702, // 0049 ADD R3 R3 K2 - 0x601C000C, // 004A GETGBL R7 G12 - 0xB8221A00, // 004B GETNGBL R8 K13 - 0x8C201116, // 004C GETMET R8 R8 K22 - 0x7C200200, // 004D CALL R8 1 - 0x7C1C0200, // 004E CALL R7 1 - 0x58200008, // 004F LDCONST R8 K8 - 0x78120000, // 0050 JMPF R4 #0052 - 0x041C0F02, // 0051 SUB R7 R7 K2 - 0x14241007, // 0052 LT R9 R8 R7 - 0x78260014, // 0053 JMPF R9 #0069 - 0x88240109, // 0054 GETMBR R9 R0 K9 - 0x8C24130A, // 0055 GETMET R9 R9 K10 - 0xB82E1600, // 0056 GETNGBL R11 K11 - 0x8C2C1717, // 0057 GETMET R11 R11 K23 - 0x5C340000, // 0058 MOVE R13 R0 - 0x5C380600, // 0059 MOVE R14 R3 - 0x5C3C1000, // 005A MOVE R15 R8 - 0x7C2C0800, // 005B CALL R11 4 - 0x7C240400, // 005C CALL R9 2 - 0xB8261A00, // 005D GETNGBL R9 K13 - 0x8C24130E, // 005E GETMET R9 R9 K14 - 0x8C2C030F, // 005F GETMET R11 R1 K15 - 0x58340018, // 0060 LDCONST R13 K24 - 0x5C380600, // 0061 MOVE R14 R3 - 0x003C1102, // 0062 ADD R15 R8 K2 - 0x7C2C0800, // 0063 CALL R11 4 - 0x58300011, // 0064 LDCONST R12 K17 - 0x7C240600, // 0065 CALL R9 3 - 0x00201102, // 0066 ADD R8 R8 K2 - 0x000C0702, // 0067 ADD R3 R3 K2 - 0x7001FFE8, // 0068 JMP #0052 - 0x8C240519, // 0069 GETMET R9 R2 K25 - 0xB82E1A00, // 006A GETNGBL R11 K13 - 0x8C2C171A, // 006B GETMET R11 R11 K26 - 0x7C2C0200, // 006C CALL R11 1 - 0x7C240400, // 006D CALL R9 2 - 0x540E001F, // 006E LDINT R3 32 - 0x60280010, // 006F GETGBL R10 G16 - 0x8C2C011B, // 0070 GETMET R11 R0 K27 - 0x5C341200, // 0071 MOVE R13 R9 - 0x7C2C0400, // 0072 CALL R11 2 - 0x7C280200, // 0073 CALL R10 1 - 0xA8020026, // 0074 EXBLK 0 #009C - 0x5C2C1400, // 0075 MOVE R11 R10 - 0x7C2C0000, // 0076 CALL R11 0 - 0x9430120B, // 0077 GETIDX R12 R9 R11 - 0x6034000F, // 0078 GETGBL R13 G15 - 0x5C381800, // 0079 MOVE R14 R12 - 0x603C0013, // 007A GETGBL R15 G19 - 0x7C340400, // 007B CALL R13 2 - 0x78360017, // 007C JMPF R13 #0095 - 0x8C34191C, // 007D GETMET R13 R12 K28 - 0x583C001D, // 007E LDCONST R15 K29 - 0x7C340400, // 007F CALL R13 2 - 0x78360013, // 0080 JMPF R13 #0095 - 0x0034171E, // 0081 ADD R13 R11 K30 - 0x88380109, // 0082 GETMBR R14 R0 K9 - 0x8C381D0A, // 0083 GETMET R14 R14 K10 - 0xB8421600, // 0084 GETNGBL R16 K11 - 0x8C40211F, // 0085 GETMET R16 R16 K31 - 0x5C480000, // 0086 MOVE R18 R0 - 0x5C4C0600, // 0087 MOVE R19 R3 - 0x5C501A00, // 0088 MOVE R20 R13 - 0x7C400800, // 0089 CALL R16 4 - 0x7C380400, // 008A CALL R14 2 - 0xB83A1A00, // 008B GETNGBL R14 K13 - 0x8C381D0E, // 008C GETMET R14 R14 K14 - 0x8C40030F, // 008D GETMET R16 R1 K15 - 0x58480020, // 008E LDCONST R18 K32 - 0x5C4C0600, // 008F MOVE R19 R3 - 0x5C501A00, // 0090 MOVE R20 R13 - 0x7C400800, // 0091 CALL R16 4 - 0x58440011, // 0092 LDCONST R17 K17 - 0x7C380600, // 0093 CALL R14 3 - 0x000C0702, // 0094 ADD R3 R3 K2 - 0x54360027, // 0095 LDINT R13 40 - 0x2434060D, // 0096 GT R13 R3 R13 - 0x78360000, // 0097 JMPF R13 #0099 - 0x70020000, // 0098 JMP #009A - 0x7001FFDA, // 0099 JMP #0075 - 0xA8040001, // 009A EXBLK 1 1 - 0x70020002, // 009B JMP #009F - 0x58280021, // 009C LDCONST R10 K33 - 0xAC280200, // 009D CATCH R10 1 0 - 0xB0080000, // 009E RAISE 2 R0 R0 - 0x540E0027, // 009F LDINT R3 40 - 0x60280010, // 00A0 GETGBL R10 G16 - 0x8C2C011B, // 00A1 GETMET R11 R0 K27 - 0x5C341200, // 00A2 MOVE R13 R9 - 0x7C2C0400, // 00A3 CALL R11 2 - 0x7C280200, // 00A4 CALL R10 1 - 0xA8020026, // 00A5 EXBLK 0 #00CD - 0x5C2C1400, // 00A6 MOVE R11 R10 - 0x7C2C0000, // 00A7 CALL R11 0 - 0x9430120B, // 00A8 GETIDX R12 R9 R11 - 0x6034000F, // 00A9 GETGBL R13 G15 - 0x5C381800, // 00AA MOVE R14 R12 - 0x603C0013, // 00AB GETGBL R15 G19 - 0x7C340400, // 00AC CALL R13 2 - 0x78360017, // 00AD JMPF R13 #00C6 - 0x8C34191C, // 00AE GETMET R13 R12 K28 - 0x583C0022, // 00AF LDCONST R15 K34 - 0x7C340400, // 00B0 CALL R13 2 - 0x78360013, // 00B1 JMPF R13 #00C6 - 0x00341723, // 00B2 ADD R13 R11 K35 - 0x88380109, // 00B3 GETMBR R14 R0 K9 - 0x8C381D0A, // 00B4 GETMET R14 R14 K10 - 0xB8421600, // 00B5 GETNGBL R16 K11 - 0x8C402124, // 00B6 GETMET R16 R16 K36 - 0x5C480000, // 00B7 MOVE R18 R0 - 0x5C4C0600, // 00B8 MOVE R19 R3 - 0x5C501A00, // 00B9 MOVE R20 R13 - 0x7C400800, // 00BA CALL R16 4 - 0x7C380400, // 00BB CALL R14 2 - 0xB83A1A00, // 00BC GETNGBL R14 K13 - 0x8C381D0E, // 00BD GETMET R14 R14 K14 - 0x8C40030F, // 00BE GETMET R16 R1 K15 - 0x58480025, // 00BF LDCONST R18 K37 - 0x5C4C0600, // 00C0 MOVE R19 R3 - 0x5C501A00, // 00C1 MOVE R20 R13 - 0x7C400800, // 00C2 CALL R16 4 - 0x58440011, // 00C3 LDCONST R17 K17 - 0x7C380600, // 00C4 CALL R14 3 - 0x000C0702, // 00C5 ADD R3 R3 K2 - 0x5436002E, // 00C6 LDINT R13 47 - 0x2434060D, // 00C7 GT R13 R3 R13 - 0x78360000, // 00C8 JMPF R13 #00CA - 0x70020000, // 00C9 JMP #00CB - 0x7001FFDA, // 00CA JMP #00A6 - 0xA8040001, // 00CB EXBLK 1 1 - 0x70020002, // 00CC JMP #00D0 - 0x58280021, // 00CD LDCONST R10 K33 - 0xAC280200, // 00CE CATCH R10 1 0 - 0xB0080000, // 00CF RAISE 2 R0 R0 - 0x540E002F, // 00D0 LDINT R3 48 - 0x60280010, // 00D1 GETGBL R10 G16 - 0x8C2C011B, // 00D2 GETMET R11 R0 K27 - 0x5C341200, // 00D3 MOVE R13 R9 - 0x7C2C0400, // 00D4 CALL R11 2 - 0x7C280200, // 00D5 CALL R10 1 - 0xA8020026, // 00D6 EXBLK 0 #00FE - 0x5C2C1400, // 00D7 MOVE R11 R10 - 0x7C2C0000, // 00D8 CALL R11 0 - 0x9430120B, // 00D9 GETIDX R12 R9 R11 - 0x6034000F, // 00DA GETGBL R13 G15 - 0x5C381800, // 00DB MOVE R14 R12 - 0x603C0013, // 00DC GETGBL R15 G19 - 0x7C340400, // 00DD CALL R13 2 - 0x78360017, // 00DE JMPF R13 #00F7 - 0x8C34191C, // 00DF GETMET R13 R12 K28 - 0x583C0026, // 00E0 LDCONST R15 K38 - 0x7C340400, // 00E1 CALL R13 2 - 0x78360013, // 00E2 JMPF R13 #00F7 - 0x00341727, // 00E3 ADD R13 R11 K39 - 0x88380109, // 00E4 GETMBR R14 R0 K9 - 0x8C381D0A, // 00E5 GETMET R14 R14 K10 - 0xB8421600, // 00E6 GETNGBL R16 K11 - 0x8C402128, // 00E7 GETMET R16 R16 K40 - 0x5C480000, // 00E8 MOVE R18 R0 - 0x5C4C0600, // 00E9 MOVE R19 R3 - 0x5C501A00, // 00EA MOVE R20 R13 - 0x7C400800, // 00EB CALL R16 4 - 0x7C380400, // 00EC CALL R14 2 - 0xB83A1A00, // 00ED GETNGBL R14 K13 - 0x8C381D0E, // 00EE GETMET R14 R14 K14 - 0x8C40030F, // 00EF GETMET R16 R1 K15 - 0x58480029, // 00F0 LDCONST R18 K41 - 0x5C4C0600, // 00F1 MOVE R19 R3 - 0x5C501A00, // 00F2 MOVE R20 R13 - 0x7C400800, // 00F3 CALL R16 4 - 0x58440011, // 00F4 LDCONST R17 K17 - 0x7C380600, // 00F5 CALL R14 3 - 0x000C0702, // 00F6 ADD R3 R3 K2 - 0x54360037, // 00F7 LDINT R13 56 - 0x2434060D, // 00F8 GT R13 R3 R13 - 0x78360000, // 00F9 JMPF R13 #00FB - 0x70020000, // 00FA JMP #00FC - 0x7001FFDA, // 00FB JMP #00D7 - 0xA8040001, // 00FC EXBLK 1 1 - 0x70020002, // 00FD JMP #0101 - 0x58280021, // 00FE LDCONST R10 K33 - 0xAC280200, // 00FF CATCH R10 1 0 - 0xB0080000, // 0100 RAISE 2 R0 R0 - 0x540E0037, // 0101 LDINT R3 56 - 0x60280010, // 0102 GETGBL R10 G16 - 0x8C2C011B, // 0103 GETMET R11 R0 K27 - 0x5C341200, // 0104 MOVE R13 R9 - 0x7C2C0400, // 0105 CALL R11 2 - 0x7C280200, // 0106 CALL R10 1 - 0xA8020026, // 0107 EXBLK 0 #012F - 0x5C2C1400, // 0108 MOVE R11 R10 - 0x7C2C0000, // 0109 CALL R11 0 - 0x9430120B, // 010A GETIDX R12 R9 R11 - 0x6034000F, // 010B GETGBL R13 G15 - 0x5C381800, // 010C MOVE R14 R12 - 0x603C0013, // 010D GETGBL R15 G19 - 0x7C340400, // 010E CALL R13 2 - 0x78360017, // 010F JMPF R13 #0128 - 0x8C34191C, // 0110 GETMET R13 R12 K28 - 0x583C002A, // 0111 LDCONST R15 K42 - 0x7C340400, // 0112 CALL R13 2 - 0x78360013, // 0113 JMPF R13 #0128 - 0x0034172B, // 0114 ADD R13 R11 K43 - 0x88380109, // 0115 GETMBR R14 R0 K9 - 0x8C381D0A, // 0116 GETMET R14 R14 K10 - 0xB8421600, // 0117 GETNGBL R16 K11 - 0x8C40212C, // 0118 GETMET R16 R16 K44 - 0x5C480000, // 0119 MOVE R18 R0 - 0x5C4C0600, // 011A MOVE R19 R3 - 0x5C501A00, // 011B MOVE R20 R13 - 0x7C400800, // 011C CALL R16 4 - 0x7C380400, // 011D CALL R14 2 - 0xB83A1A00, // 011E GETNGBL R14 K13 - 0x8C381D0E, // 011F GETMET R14 R14 K14 - 0x8C40030F, // 0120 GETMET R16 R1 K15 - 0x5848002D, // 0121 LDCONST R18 K45 - 0x5C4C0600, // 0122 MOVE R19 R3 - 0x5C501A00, // 0123 MOVE R20 R13 - 0x7C400800, // 0124 CALL R16 4 - 0x58440011, // 0125 LDCONST R17 K17 - 0x7C380600, // 0126 CALL R14 3 - 0x000C0702, // 0127 ADD R3 R3 K2 - 0x5436003F, // 0128 LDINT R13 64 - 0x2434060D, // 0129 GT R13 R3 R13 - 0x78360000, // 012A JMPF R13 #012C - 0x70020000, // 012B JMP #012D - 0x7001FFDA, // 012C JMP #0108 - 0xA8040001, // 012D EXBLK 1 1 - 0x70020002, // 012E JMP #0132 - 0x58280021, // 012F LDCONST R10 K33 - 0xAC280200, // 0130 CATCH R10 1 0 - 0xB0080000, // 0131 RAISE 2 R0 R0 - 0x80000000, // 0132 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: start_mdns_announce_hostnames -********************************************************************/ -be_local_closure(Matter_Device_start_mdns_announce_hostnames, /* name */ - be_nested_proto( - 6, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 1, /* has sup protos */ - ( &(const struct bproto*[ 2]) { - be_nested_proto( - 4, /* nstack */ - 0, /* argc */ - 0, /* varg */ - 1, /* has upvals */ - ( &(const bupvaldesc[ 1]) { /* upvals */ - be_local_const_upval(1, 0), - }), - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 5]) { /* constants */ - /* K0 */ be_nested_str_weak(_mdns_announce_hostname), - /* K1 */ be_nested_str_weak(tasmota), - /* K2 */ be_nested_str_weak(remove_rule), - /* K3 */ be_nested_str_weak(Wifi_X23Connected), - /* K4 */ be_nested_str_weak(matter_mdns_host), - }), - be_str_weak(_anonymous_), - &be_const_str_solidified, - ( &(const binstruction[10]) { /* code */ - 0x68000000, // 0000 GETUPV R0 U0 - 0x8C000100, // 0001 GETMET R0 R0 K0 - 0x50080000, // 0002 LDBOOL R2 0 0 - 0x7C000400, // 0003 CALL R0 2 - 0xB8020200, // 0004 GETNGBL R0 K1 - 0x8C000102, // 0005 GETMET R0 R0 K2 - 0x58080003, // 0006 LDCONST R2 K3 - 0x580C0004, // 0007 LDCONST R3 K4 - 0x7C000600, // 0008 CALL R0 3 - 0x80000000, // 0009 RET 0 - }) - ), - be_nested_proto( - 4, /* nstack */ - 0, /* argc */ - 0, /* varg */ - 1, /* has upvals */ - ( &(const bupvaldesc[ 1]) { /* upvals */ - be_local_const_upval(1, 0), - }), - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 5]) { /* constants */ - /* K0 */ be_nested_str_weak(_mdns_announce_hostname), - /* K1 */ be_nested_str_weak(tasmota), - /* K2 */ be_nested_str_weak(remove_rule), - /* K3 */ be_nested_str_weak(Eth_X23Connected), - /* K4 */ be_nested_str_weak(matter_mdns_host), - }), - be_str_weak(_anonymous_), - &be_const_str_solidified, - ( &(const binstruction[10]) { /* code */ - 0x68000000, // 0000 GETUPV R0 U0 - 0x8C000100, // 0001 GETMET R0 R0 K0 - 0x50080200, // 0002 LDBOOL R2 1 0 - 0x7C000400, // 0003 CALL R0 2 - 0xB8020200, // 0004 GETNGBL R0 K1 - 0x8C000102, // 0005 GETMET R0 R0 K2 - 0x58080003, // 0006 LDCONST R2 K3 - 0x580C0004, // 0007 LDCONST R3 K4 - 0x7C000600, // 0008 CALL R0 3 - 0x80000000, // 0009 RET 0 - }) - ), - }), - 1, /* has constants */ - ( &(const bvalue[ 9]) { /* constants */ - /* K0 */ be_nested_str_weak(tasmota), - /* K1 */ be_nested_str_weak(wifi), - /* K2 */ be_nested_str_weak(up), - /* K3 */ be_nested_str_weak(_mdns_announce_hostname), - /* K4 */ be_nested_str_weak(add_rule), - /* K5 */ be_nested_str_weak(Wifi_X23Connected), - /* K6 */ be_nested_str_weak(matter_mdns_host), - /* K7 */ be_nested_str_weak(eth), - /* K8 */ be_nested_str_weak(Eth_X23Connected), - }), - be_str_weak(start_mdns_announce_hostnames), - &be_const_str_solidified, - ( &(const binstruction[32]) { /* code */ - 0xB8060000, // 0000 GETNGBL R1 K0 - 0x8C040301, // 0001 GETMET R1 R1 K1 - 0x7C040200, // 0002 CALL R1 1 - 0x94040302, // 0003 GETIDX R1 R1 K2 - 0x78060003, // 0004 JMPF R1 #0009 - 0x8C040103, // 0005 GETMET R1 R0 K3 - 0x500C0000, // 0006 LDBOOL R3 0 0 - 0x7C040400, // 0007 CALL R1 2 - 0x70020005, // 0008 JMP #000F - 0xB8060000, // 0009 GETNGBL R1 K0 - 0x8C040304, // 000A GETMET R1 R1 K4 - 0x580C0005, // 000B LDCONST R3 K5 - 0x84100000, // 000C CLOSURE R4 P0 - 0x58140006, // 000D LDCONST R5 K6 - 0x7C040800, // 000E CALL R1 4 - 0xB8060000, // 000F GETNGBL R1 K0 - 0x8C040307, // 0010 GETMET R1 R1 K7 - 0x7C040200, // 0011 CALL R1 1 - 0x94040302, // 0012 GETIDX R1 R1 K2 - 0x78060003, // 0013 JMPF R1 #0018 - 0x8C040103, // 0014 GETMET R1 R0 K3 - 0x500C0200, // 0015 LDBOOL R3 1 0 - 0x7C040400, // 0016 CALL R1 2 - 0x70020005, // 0017 JMP #001E - 0xB8060000, // 0018 GETNGBL R1 K0 - 0x8C040304, // 0019 GETMET R1 R1 K4 - 0x580C0008, // 001A LDCONST R3 K8 - 0x84100001, // 001B CLOSURE R4 P1 - 0x58140006, // 001C LDCONST R5 K6 - 0x7C040800, // 001D CALL R1 4 - 0xA0000000, // 001E CLOSE R0 - 0x80000000, // 001F RET 0 + 0x88080101, // 0001 GETMBR R2 R0 K1 + 0x540E0FFE, // 0002 LDINT R3 4095 + 0x2C080403, // 0003 AND R2 R2 R3 + 0x540E0009, // 0004 LDINT R3 10 + 0x3C080403, // 0005 SHR R2 R2 R3 + 0x880C0101, // 0006 GETMBR R3 R0 K1 + 0x541202FF, // 0007 LDINT R4 768 + 0x2C0C0604, // 0008 AND R3 R3 R4 + 0x54120005, // 0009 LDINT R4 6 + 0x380C0604, // 000A SHL R3 R3 R4 + 0x88100102, // 000B GETMBR R4 R0 K2 + 0x54163FFE, // 000C LDINT R5 16383 + 0x2C100805, // 000D AND R4 R4 R5 + 0x300C0604, // 000E OR R3 R3 R4 + 0x88100102, // 000F GETMBR R4 R0 K2 + 0x5416000D, // 0010 LDINT R5 14 + 0x3C100805, // 0011 SHR R4 R4 R5 + 0x8C140303, // 0012 GETMET R5 R1 K3 + 0x581C0004, // 0013 LDCONST R7 K4 + 0x5C200400, // 0014 MOVE R8 R2 + 0x5C240600, // 0015 MOVE R9 R3 + 0x5C280800, // 0016 MOVE R10 R4 + 0x7C140A00, // 0017 CALL R5 5 + 0xB81A0A00, // 0018 GETNGBL R6 K5 + 0x88180D06, // 0019 GETMBR R6 R6 K6 + 0x8C180D07, // 001A GETMET R6 R6 K7 + 0x5C200A00, // 001B MOVE R8 R5 + 0x7C180400, // 001C CALL R6 2 + 0x00140A06, // 001D ADD R5 R5 R6 + 0x80040A00, // 001E RET 1 R5 }) ) ); @@ -3994,111 +4140,79 @@ be_local_closure(Matter_Device_mdns_announce_op_discovery, /* name */ /******************************************************************** -** Solidified function: mdns_remove_op_discovery_all_fabrics +** Solidified function: k2l ********************************************************************/ -be_local_closure(Matter_Device_mdns_remove_op_discovery_all_fabrics, /* name */ +be_local_closure(Matter_Device_k2l, /* name */ be_nested_proto( - 6, /* nstack */ + 8, /* nstack */ 1, /* argc */ - 2, /* varg */ + 4, /* varg */ 0, /* has upvals */ NULL, /* no upvals */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ ( &(const bvalue[ 6]) { /* constants */ - /* K0 */ be_nested_str_weak(sessions), - /* K1 */ be_nested_str_weak(active_fabrics), - /* K2 */ be_nested_str_weak(get_device_id), - /* K3 */ be_nested_str_weak(get_fabric_id), - /* K4 */ be_nested_str_weak(mdns_remove_op_discovery), - /* K5 */ be_nested_str_weak(stop_iteration), + /* K0 */ be_const_class(be_class_Matter_Device), + /* K1 */ be_nested_str_weak(keys), + /* K2 */ be_nested_str_weak(push), + /* K3 */ be_nested_str_weak(stop_iteration), + /* K4 */ be_const_int(1), + /* K5 */ be_const_int(0), }), - be_str_weak(mdns_remove_op_discovery_all_fabrics), + be_str_weak(k2l), &be_const_str_solidified, - ( &(const binstruction[22]) { /* code */ - 0x60040010, // 0000 GETGBL R1 G16 - 0x88080100, // 0001 GETMBR R2 R0 K0 - 0x8C080501, // 0002 GETMET R2 R2 K1 - 0x7C080200, // 0003 CALL R2 1 - 0x7C040200, // 0004 CALL R1 1 - 0xA802000B, // 0005 EXBLK 0 #0012 - 0x5C080200, // 0006 MOVE R2 R1 - 0x7C080000, // 0007 CALL R2 0 - 0x8C0C0502, // 0008 GETMET R3 R2 K2 - 0x7C0C0200, // 0009 CALL R3 1 - 0x780E0005, // 000A JMPF R3 #0011 - 0x8C0C0503, // 000B GETMET R3 R2 K3 - 0x7C0C0200, // 000C CALL R3 1 - 0x780E0002, // 000D JMPF R3 #0011 - 0x8C0C0104, // 000E GETMET R3 R0 K4 - 0x5C140400, // 000F MOVE R5 R2 - 0x7C0C0400, // 0010 CALL R3 2 - 0x7001FFF3, // 0011 JMP #0006 - 0x58040005, // 0012 LDCONST R1 K5 - 0xAC040200, // 0013 CATCH R1 1 0 + ( &(const binstruction[50]) { /* code */ + 0x58040000, // 0000 LDCONST R1 K0 + 0x60080012, // 0001 GETGBL R2 G18 + 0x7C080000, // 0002 CALL R2 0 + 0x4C0C0000, // 0003 LDNIL R3 + 0x1C0C0003, // 0004 EQ R3 R0 R3 + 0x780E0000, // 0005 JMPF R3 #0007 + 0x80040400, // 0006 RET 1 R2 + 0x600C0010, // 0007 GETGBL R3 G16 + 0x8C100101, // 0008 GETMET R4 R0 K1 + 0x7C100200, // 0009 CALL R4 1 + 0x7C0C0200, // 000A CALL R3 1 + 0xA8020005, // 000B EXBLK 0 #0012 + 0x5C100600, // 000C MOVE R4 R3 + 0x7C100000, // 000D CALL R4 0 + 0x8C140502, // 000E GETMET R5 R2 K2 + 0x5C1C0800, // 000F MOVE R7 R4 + 0x7C140400, // 0010 CALL R5 2 + 0x7001FFF9, // 0011 JMP #000C + 0x580C0003, // 0012 LDCONST R3 K3 + 0xAC0C0200, // 0013 CATCH R3 1 0 0xB0080000, // 0014 RAISE 2 R0 R0 - 0x80000000, // 0015 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: start_commissioning_complete_deferred -********************************************************************/ -be_local_closure(Matter_Device_start_commissioning_complete_deferred, /* name */ - be_nested_proto( - 6, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 1, /* has sup protos */ - ( &(const struct bproto*[ 1]) { - be_nested_proto( - 3, /* nstack */ - 0, /* argc */ - 0, /* varg */ - 1, /* has upvals */ - ( &(const bupvaldesc[ 2]) { /* upvals */ - be_local_const_upval(1, 0), - be_local_const_upval(1, 1), - }), - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 1]) { /* constants */ - /* K0 */ be_nested_str_weak(start_commissioning_complete), - }), - be_str_weak(_X3Clambda_X3E), - &be_const_str_solidified, - ( &(const binstruction[ 5]) { /* code */ - 0x68000000, // 0000 GETUPV R0 U0 - 0x8C000100, // 0001 GETMET R0 R0 K0 - 0x68080001, // 0002 GETUPV R2 U1 - 0x7C000400, // 0003 CALL R0 2 - 0x80040000, // 0004 RET 1 R0 - }) - ), - }), - 1, /* has constants */ - ( &(const bvalue[ 3]) { /* constants */ - /* K0 */ be_nested_str_weak(tasmota), - /* K1 */ be_nested_str_weak(set_timer), - /* K2 */ be_const_int(0), - }), - be_str_weak(start_commissioning_complete_deferred), - &be_const_str_solidified, - ( &(const binstruction[ 7]) { /* code */ - 0xB80A0000, // 0000 GETNGBL R2 K0 - 0x8C080501, // 0001 GETMET R2 R2 K1 - 0x58100002, // 0002 LDCONST R4 K2 - 0x84140000, // 0003 CLOSURE R5 P0 - 0x7C080600, // 0004 CALL R2 3 - 0xA0000000, // 0005 CLOSE R0 - 0x80000000, // 0006 RET 0 + 0x600C0010, // 0015 GETGBL R3 G16 + 0x6010000C, // 0016 GETGBL R4 G12 + 0x5C140400, // 0017 MOVE R5 R2 + 0x7C100200, // 0018 CALL R4 1 + 0x04100904, // 0019 SUB R4 R4 K4 + 0x40120804, // 001A CONNECT R4 K4 R4 + 0x7C0C0200, // 001B CALL R3 1 + 0xA8020010, // 001C EXBLK 0 #002E + 0x5C100600, // 001D MOVE R4 R3 + 0x7C100000, // 001E CALL R4 0 + 0x94140404, // 001F GETIDX R5 R2 R4 + 0x5C180800, // 0020 MOVE R6 R4 + 0x241C0D05, // 0021 GT R7 R6 K5 + 0x781E0008, // 0022 JMPF R7 #002C + 0x041C0D04, // 0023 SUB R7 R6 K4 + 0x941C0407, // 0024 GETIDX R7 R2 R7 + 0x241C0E05, // 0025 GT R7 R7 R5 + 0x781E0004, // 0026 JMPF R7 #002C + 0x041C0D04, // 0027 SUB R7 R6 K4 + 0x941C0407, // 0028 GETIDX R7 R2 R7 + 0x98080C07, // 0029 SETIDX R2 R6 R7 + 0x04180D04, // 002A SUB R6 R6 K4 + 0x7001FFF4, // 002B JMP #0021 + 0x98080C05, // 002C SETIDX R2 R6 R5 + 0x7001FFEE, // 002D JMP #001D + 0x580C0003, // 002E LDCONST R3 K3 + 0xAC0C0200, // 002F CATCH R3 1 0 + 0xB0080000, // 0030 RAISE 2 R0 R0 + 0x80040400, // 0031 RET 1 R2 }) ) ); @@ -4111,85 +4225,87 @@ be_local_closure(Matter_Device_start_commissioning_complete_deferred, /* name be_local_class(Matter_Device, 28, NULL, - be_nested_map(77, + be_nested_map(79, ( (struct bmapnode*) &(const bmapnode[]) { - { be_const_key_weak(started, -1), be_const_var(0) }, - { be_const_key_weak(is_commissioning_open, -1), be_const_closure(Matter_Device_is_commissioning_open_closure) }, - { be_const_key_weak(received_ack, 0), be_const_closure(Matter_Device_received_ack_closure) }, - { be_const_key_weak(mdns_remove_op_discovery_all_fabrics, -1), be_const_closure(Matter_Device_mdns_remove_op_discovery_all_fabrics_closure) }, - { be_const_key_weak(mdns_announce_op_discovery, -1), be_const_closure(Matter_Device_mdns_announce_op_discovery_closure) }, - { be_const_key_weak(start_mdns_announce_hostnames, 40), be_const_closure(Matter_Device_start_mdns_announce_hostnames_closure) }, - { be_const_key_weak(k2l, -1), be_const_static_closure(Matter_Device_k2l_closure) }, - { be_const_key_weak(compute_manual_pairing_code, 65), be_const_closure(Matter_Device_compute_manual_pairing_code_closure) }, - { be_const_key_weak(root_w0, -1), be_const_var(26) }, - { be_const_key_weak(mdns_announce_PASE, -1), be_const_closure(Matter_Device_mdns_announce_PASE_closure) }, - { be_const_key_weak(every_second, 42), be_const_closure(Matter_Device_every_second_closure) }, - { be_const_key_weak(process_attribute_expansion, -1), be_const_closure(Matter_Device_process_attribute_expansion_closure) }, - { be_const_key_weak(_init_basic_commissioning, -1), be_const_closure(Matter_Device__init_basic_commissioning_closure) }, - { be_const_key_weak(hostname_eth, -1), be_const_var(16) }, - { be_const_key_weak(vendorid, 22), be_const_var(17) }, - { be_const_key_weak(commissioning_iterations, -1), be_const_var(7) }, - { be_const_key_weak(root_iterations, -1), be_const_var(24) }, - { be_const_key_weak(root_L, 23), be_const_var(27) }, - { be_const_key_weak(VENDOR_ID, 15), be_const_int(65521) }, - { be_const_key_weak(root_passcode, 33), be_const_var(22) }, - { be_const_key_weak(mdns_announce_op_discovery_all_fabrics, -1), be_const_closure(Matter_Device_mdns_announce_op_discovery_all_fabrics_closure) }, - { be_const_key_weak(PBKDF_ITERATIONS, 5), be_const_int(1000) }, - { be_const_key_weak(UDP_PORT, -1), be_const_int(5540) }, - { be_const_key_weak(commissioning_discriminator, 58), be_const_var(8) }, - { be_const_key_weak(stop, -1), be_const_closure(Matter_Device_stop_closure) }, - { be_const_key_weak(stop_basic_commissioning, -1), be_const_closure(Matter_Device_stop_basic_commissioning_closure) }, - { be_const_key_weak(productid, -1), be_const_var(18) }, - { be_const_key_weak(start, -1), be_const_closure(Matter_Device_start_closure) }, - { be_const_key_weak(PASE_TIMEOUT, -1), be_const_int(600) }, - { be_const_key_weak(every_250ms, -1), be_const_closure(Matter_Device_every_250ms_closure) }, - { be_const_key_weak(is_root_commissioning_open, 57), be_const_closure(Matter_Device_is_root_commissioning_open_closure) }, - { be_const_key_weak(hostname_wifi, 6), be_const_var(15) }, - { be_const_key_weak(PASSCODE_DEFAULT, 49), be_const_int(20202021) }, - { be_const_key_weak(commissioning_w0, -1), be_const_var(10) }, - { be_const_key_weak(_compute_pbkdf, 62), be_const_closure(Matter_Device__compute_pbkdf_closure) }, - { be_const_key_weak(msg_send, 47), be_const_closure(Matter_Device_msg_send_closure) }, - { be_const_key_weak(_start_udp, -1), be_const_closure(Matter_Device__start_udp_closure) }, - { be_const_key_weak(start_operational_discovery_deferred, 68), be_const_closure(Matter_Device_start_operational_discovery_deferred_closure) }, - { be_const_key_weak(start_operational_discovery, 52), be_const_closure(Matter_Device_start_operational_discovery_closure) }, - { be_const_key_weak(udp_server, 51), be_const_var(2) }, - { be_const_key_weak(invoke_request, 73), be_const_closure(Matter_Device_invoke_request_closure) }, - { be_const_key_weak(remove_fabric, -1), be_const_closure(Matter_Device_remove_fabric_closure) }, - { be_const_key_weak(mdns_remove_PASE, -1), be_const_closure(Matter_Device_mdns_remove_PASE_closure) }, - { be_const_key_weak(save_before_restart, -1), be_const_closure(Matter_Device_save_before_restart_closure) }, - { be_const_key_weak(mdns_pase_eth, -1), be_const_var(19) }, + { be_const_key_weak(commissioning_w0, 50), be_const_var(10) }, + { be_const_key_weak(start_operational_discovery, 13), be_const_closure(Matter_Device_start_operational_discovery_closure) }, { be_const_key_weak(plugins, -1), be_const_var(1) }, - { be_const_key_weak(_mdns_announce_hostname, -1), be_const_closure(Matter_Device__mdns_announce_hostname_closure) }, - { be_const_key_weak(commissioning_salt, -1), be_const_var(9) }, - { be_const_key_weak(commissioning_instance_eth, -1), be_const_var(14) }, - { be_const_key_weak(PRODUCT_ID, 71), be_const_int(32768) }, - { be_const_key_weak(_trigger_read_sensors, 48), be_const_closure(Matter_Device__trigger_read_sensors_closure) }, - { be_const_key_weak(msg_received, 66), be_const_closure(Matter_Device_msg_received_closure) }, - { be_const_key_weak(ui, 24), be_const_var(5) }, - { be_const_key_weak(start_root_basic_commissioning, 30), be_const_closure(Matter_Device_start_root_basic_commissioning_closure) }, - { be_const_key_weak(root_salt, -1), be_const_var(25) }, - { be_const_key_weak(mdns_remove_op_discovery, -1), be_const_closure(Matter_Device_mdns_remove_op_discovery_closure) }, - { be_const_key_weak(commissioning_instance_wifi, -1), be_const_var(13) }, - { be_const_key_weak(commissioning_admin_fabric, -1), be_const_var(12) }, + { be_const_key_weak(k2l, -1), be_const_static_closure(Matter_Device_k2l_closure) }, + { be_const_key_weak(mdns_remove_PASE, 72), be_const_closure(Matter_Device_mdns_remove_PASE_closure) }, { be_const_key_weak(message_handler, -1), be_const_var(3) }, - { be_const_key_weak(start_commissioning_complete, -1), be_const_closure(Matter_Device_start_commissioning_complete_closure) }, - { be_const_key_weak(mdns_pase_wifi, -1), be_const_var(20) }, + { be_const_key_weak(mdns_announce_op_discovery, 43), be_const_closure(Matter_Device_mdns_announce_op_discovery_closure) }, + { be_const_key_weak(save_before_restart, -1), be_const_closure(Matter_Device_save_before_restart_closure) }, + { be_const_key_weak(_start_udp, -1), be_const_closure(Matter_Device__start_udp_closure) }, { be_const_key_weak(commissioning_open, -1), be_const_var(6) }, - { be_const_key_weak(root_discriminator, -1), be_const_var(21) }, - { be_const_key_weak(commissioning_L, -1), be_const_var(11) }, - { be_const_key_weak(sort_distinct, 35), be_const_static_closure(Matter_Device_sort_distinct_closure) }, - { be_const_key_weak(sessions, -1), be_const_var(4) }, + { be_const_key_weak(root_L, 45), be_const_var(27) }, + { be_const_key_weak(PRODUCT_ID, -1), be_const_int(32768) }, + { be_const_key_weak(root_passcode, -1), be_const_var(22) }, + { be_const_key_weak(compute_manual_pairing_code, 77), be_const_closure(Matter_Device_compute_manual_pairing_code_closure) }, + { be_const_key_weak(UDP_PORT, -1), be_const_int(5540) }, { be_const_key_weak(start_basic_commissioning, -1), be_const_closure(Matter_Device_start_basic_commissioning_closure) }, - { be_const_key_weak(get_active_endpoints, 11), be_const_closure(Matter_Device_get_active_endpoints_closure) }, - { be_const_key_weak(compute_qrcode_content, -1), be_const_closure(Matter_Device_compute_qrcode_content_closure) }, - { be_const_key_weak(ipv4only, -1), be_const_var(23) }, - { be_const_key_weak(load_param, -1), be_const_closure(Matter_Device_load_param_closure) }, - { be_const_key_weak(FILENAME, -1), be_nested_str_weak(_matter_device_X2Ejson) }, + { be_const_key_weak(remove_fabric, -1), be_const_closure(Matter_Device_remove_fabric_closure) }, + { be_const_key_weak(attribute_updated, -1), be_const_closure(Matter_Device_attribute_updated_closure) }, + { be_const_key_weak(_mdns_announce_hostname, 31), be_const_closure(Matter_Device__mdns_announce_hostname_closure) }, { be_const_key_weak(autoconf_device, -1), be_const_closure(Matter_Device_autoconf_device_closure) }, + { be_const_key_weak(_trigger_read_sensors, -1), be_const_closure(Matter_Device__trigger_read_sensors_closure) }, + { be_const_key_weak(get_active_endpoints, -1), be_const_closure(Matter_Device_get_active_endpoints_closure) }, + { be_const_key_weak(commissioning_admin_fabric, -1), be_const_var(12) }, + { be_const_key_weak(msg_send, -1), be_const_closure(Matter_Device_msg_send_closure) }, + { be_const_key_weak(hostname_wifi, 32), be_const_var(15) }, + { be_const_key_weak(productid, -1), be_const_var(18) }, + { be_const_key_weak(msg_received, -1), be_const_closure(Matter_Device_msg_received_closure) }, + { be_const_key_weak(commissioning_discriminator, -1), be_const_var(8) }, + { be_const_key_weak(FILENAME, 46), be_nested_str_weak(_matter_device_X2Ejson) }, + { be_const_key_weak(commissioning_instance_eth, 53), be_const_var(14) }, + { be_const_key_weak(start, 75), be_const_closure(Matter_Device_start_closure) }, + { be_const_key_weak(compute_qrcode_content, -1), be_const_closure(Matter_Device_compute_qrcode_content_closure) }, + { be_const_key_weak(MtrJoin, 33), be_const_closure(Matter_Device_MtrJoin_closure) }, + { be_const_key_weak(stop, -1), be_const_closure(Matter_Device_stop_closure) }, + { be_const_key_weak(root_w0, -1), be_const_var(26) }, + { be_const_key_weak(ui, -1), be_const_var(5) }, + { be_const_key_weak(every_second, -1), be_const_closure(Matter_Device_every_second_closure) }, + { be_const_key_weak(start_root_basic_commissioning, -1), be_const_closure(Matter_Device_start_root_basic_commissioning_closure) }, + { be_const_key_weak(start_mdns_announce_hostnames, -1), be_const_closure(Matter_Device_start_mdns_announce_hostnames_closure) }, + { be_const_key_weak(init, -1), be_const_closure(Matter_Device_init_closure) }, + { be_const_key_weak(_compute_pbkdf, -1), be_const_closure(Matter_Device__compute_pbkdf_closure) }, + { be_const_key_weak(process_attribute_expansion, -1), be_const_closure(Matter_Device_process_attribute_expansion_closure) }, + { be_const_key_weak(PASE_TIMEOUT, 36), be_const_int(600) }, + { be_const_key_weak(mdns_announce_PASE, 40), be_const_closure(Matter_Device_mdns_announce_PASE_closure) }, + { be_const_key_weak(mdns_remove_op_discovery, -1), be_const_closure(Matter_Device_mdns_remove_op_discovery_closure) }, + { be_const_key_weak(commissioning_salt, 39), be_const_var(9) }, + { be_const_key_weak(stop_basic_commissioning, -1), be_const_closure(Matter_Device_stop_basic_commissioning_closure) }, + { be_const_key_weak(every_250ms, -1), be_const_closure(Matter_Device_every_250ms_closure) }, + { be_const_key_weak(root_salt, 41), be_const_var(25) }, + { be_const_key_weak(commissioning_iterations, 6), be_const_var(7) }, + { be_const_key_weak(received_ack, -1), be_const_closure(Matter_Device_received_ack_closure) }, + { be_const_key_weak(VENDOR_ID, -1), be_const_int(65521) }, + { be_const_key_weak(commissioning_L, -1), be_const_var(11) }, + { be_const_key_weak(root_discriminator, -1), be_const_var(21) }, + { be_const_key_weak(ipv4only, -1), be_const_var(23) }, + { be_const_key_weak(load_param, 37), be_const_closure(Matter_Device_load_param_closure) }, + { be_const_key_weak(start_operational_discovery_deferred, 55), be_const_closure(Matter_Device_start_operational_discovery_deferred_closure) }, + { be_const_key_weak(sessions, -1), be_const_var(4) }, + { be_const_key_weak(mdns_remove_op_discovery_all_fabrics, -1), be_const_closure(Matter_Device_mdns_remove_op_discovery_all_fabrics_closure) }, + { be_const_key_weak(register_commands, 52), be_const_closure(Matter_Device_register_commands_closure) }, + { be_const_key_weak(commissioning_instance_wifi, -1), be_const_var(13) }, { be_const_key_weak(save_param, -1), be_const_closure(Matter_Device_save_param_closure) }, - { be_const_key_weak(attribute_updated, 4), be_const_closure(Matter_Device_attribute_updated_closure) }, - { be_const_key_weak(init, 3), be_const_closure(Matter_Device_init_closure) }, + { be_const_key_weak(PBKDF_ITERATIONS, -1), be_const_int(1000) }, + { be_const_key_weak(_init_basic_commissioning, 44), be_const_closure(Matter_Device__init_basic_commissioning_closure) }, + { be_const_key_weak(is_root_commissioning_open, -1), be_const_closure(Matter_Device_is_root_commissioning_open_closure) }, + { be_const_key_weak(root_iterations, -1), be_const_var(24) }, + { be_const_key_weak(is_commissioning_open, -1), be_const_closure(Matter_Device_is_commissioning_open_closure) }, + { be_const_key_weak(udp_server, -1), be_const_var(2) }, + { be_const_key_weak(start_commissioning_complete, -1), be_const_closure(Matter_Device_start_commissioning_complete_closure) }, + { be_const_key_weak(mdns_announce_op_discovery_all_fabrics, -1), be_const_closure(Matter_Device_mdns_announce_op_discovery_all_fabrics_closure) }, + { be_const_key_weak(sort_distinct, 34), be_const_static_closure(Matter_Device_sort_distinct_closure) }, + { be_const_key_weak(started, -1), be_const_var(0) }, + { be_const_key_weak(hostname_eth, -1), be_const_var(16) }, + { be_const_key_weak(invoke_request, -1), be_const_closure(Matter_Device_invoke_request_closure) }, + { be_const_key_weak(mdns_pase_eth, 14), be_const_var(19) }, + { be_const_key_weak(mdns_pase_wifi, -1), be_const_var(20) }, + { be_const_key_weak(PASSCODE_DEFAULT, 11), be_const_int(20202021) }, { be_const_key_weak(start_commissioning_complete_deferred, -1), be_const_closure(Matter_Device_start_commissioning_complete_deferred_closure) }, + { be_const_key_weak(vendorid, 3), be_const_var(17) }, })), be_str_weak(Matter_Device) ); From 65eb9142a26ae596d4b47c8bfc95748682a65bf2 Mon Sep 17 00:00:00 2001 From: s-hadinger <49731213+s-hadinger@users.noreply.github.com> Date: Tue, 18 Apr 2023 23:00:36 +0200 Subject: [PATCH 010/289] Matter fix RemoveFabric arg logging (#18452) --- .../src/embedded/Matter_Plugin_Root.be | 2 +- .../solidify/solidified_Matter_Plugin_Root.h | 132 +++++++++--------- 2 files changed, 67 insertions(+), 67 deletions(-) diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Root.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Root.be index a387ab70f..125dd9cca 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Root.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Root.be @@ -522,6 +522,7 @@ class Matter_Plugin_Root : Matter_Plugin elif command == 0x000A # ---------- RemoveFabric ---------- var index = val.findsubval(0) # FabricIndex + ctx.log = "fabric_index:"+str(index) for fab: self.device.sessions.active_fabrics() if fab.get_fabric_index() == index @@ -533,7 +534,6 @@ class Matter_Plugin_Root : Matter_Plugin end tasmota.log("MTR: RemoveFabric fabric("+str(index)+") not found", 2) ctx.status = matter.INVALID_ACTION - ctx.log = "fabric_index:"+str(index) return nil # trigger a standalone ack end diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Root.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Root.h index b8eed6db6..bc0d5c749 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Root.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Root.h @@ -1301,16 +1301,16 @@ be_local_closure(Matter_Plugin_Root_invoke_request, /* name */ /* K77 */ be_nested_str_weak(format), /* K78 */ be_nested_str_weak(MTR_X3A_X20_X2E_X20_X20_X20_X20_X20_X20_X20_X20_X20_X20Update_X20fabric_X20_X27_X25s_X27_X20label_X3D_X27_X25s_X27), /* K79 */ be_nested_str_weak(get_fabric_id), - /* K80 */ be_nested_str_weak(sessions), - /* K81 */ be_nested_str_weak(active_fabrics), - /* K82 */ be_nested_str_weak(get_fabric_index), - /* K83 */ be_nested_str_weak(MTR_X3A_X20removing_X20fabric_X20), - /* K84 */ be_nested_str_weak(set_timer), - /* K85 */ be_nested_str_weak(stop_iteration), - /* K86 */ be_nested_str_weak(MTR_X3A_X20RemoveFabric_X20fabric_X28), - /* K87 */ be_nested_str_weak(_X29_X20not_X20found), - /* K88 */ be_nested_str_weak(INVALID_ACTION), - /* K89 */ be_nested_str_weak(fabric_index_X3A), + /* K80 */ be_nested_str_weak(fabric_index_X3A), + /* K81 */ be_nested_str_weak(sessions), + /* K82 */ be_nested_str_weak(active_fabrics), + /* K83 */ be_nested_str_weak(get_fabric_index), + /* K84 */ be_nested_str_weak(MTR_X3A_X20removing_X20fabric_X20), + /* K85 */ be_nested_str_weak(set_timer), + /* K86 */ be_nested_str_weak(stop_iteration), + /* K87 */ be_nested_str_weak(MTR_X3A_X20RemoveFabric_X20fabric_X28), + /* K88 */ be_nested_str_weak(_X29_X20not_X20found), + /* K89 */ be_nested_str_weak(INVALID_ACTION), /* K90 */ be_nested_str_weak(MTR_X3A_X20OpenCommissioningWindow_X28timeout_X3D_X25i_X2C_X20passcode_X3D_X25s_X2C_X20discriminator_X3D_X25i_X2C_X20iterations_X3D_X25i_X2C_X20salt_X3D_X25s_X29), /* K91 */ be_nested_str_weak(INVALID_DATA_TYPE), /* K92 */ be_nested_str_weak(MTR_X3A_X20wrong_X20size_X20for_X20PAKE_X20parameters), @@ -1842,63 +1842,63 @@ be_local_closure(Matter_Plugin_Root_invoke_request, /* name */ 0x8C240507, // 0202 GETMET R9 R2 K7 0x582C0006, // 0203 LDCONST R11 K6 0x7C240400, // 0204 CALL R9 2 - 0x60280010, // 0205 GETGBL R10 G16 - 0x882C0115, // 0206 GETMBR R11 R0 K21 - 0x882C1750, // 0207 GETMBR R11 R11 K80 - 0x8C2C1751, // 0208 GETMET R11 R11 K81 - 0x7C2C0200, // 0209 CALL R11 1 - 0x7C280200, // 020A CALL R10 1 - 0xA802001D, // 020B EXBLK 0 #022A - 0x5C2C1400, // 020C MOVE R11 R10 - 0x7C2C0000, // 020D CALL R11 0 - 0x8C301752, // 020E GETMET R12 R11 K82 - 0x7C300200, // 020F CALL R12 1 - 0x1C301809, // 0210 EQ R12 R12 R9 - 0x78320015, // 0211 JMPF R12 #0228 - 0xB8323E00, // 0212 GETNGBL R12 K31 - 0x8C301924, // 0213 GETMET R12 R12 K36 - 0x8C38174F, // 0214 GETMET R14 R11 K79 - 0x7C380200, // 0215 CALL R14 1 - 0x8C381D3F, // 0216 GETMET R14 R14 K63 - 0x7C380200, // 0217 CALL R14 1 - 0x8C381D40, // 0218 GETMET R14 R14 K64 - 0x7C380200, // 0219 CALL R14 1 - 0x8C381D26, // 021A GETMET R14 R14 K38 - 0x7C380200, // 021B CALL R14 1 - 0x003AA60E, // 021C ADD R14 K83 R14 - 0x583C000F, // 021D LDCONST R15 K15 - 0x7C300600, // 021E CALL R12 3 - 0xB8323E00, // 021F GETNGBL R12 K31 - 0x8C301954, // 0220 GETMET R12 R12 K84 - 0x543A07CF, // 0221 LDINT R14 2000 - 0x843C0000, // 0222 CLOSURE R15 P0 + 0x60280008, // 0205 GETGBL R10 G8 + 0x5C2C1200, // 0206 MOVE R11 R9 + 0x7C280200, // 0207 CALL R10 1 + 0x002AA00A, // 0208 ADD R10 K80 R10 + 0x900E480A, // 0209 SETMBR R3 K36 R10 + 0x60280010, // 020A GETGBL R10 G16 + 0x882C0115, // 020B GETMBR R11 R0 K21 + 0x882C1751, // 020C GETMBR R11 R11 K81 + 0x8C2C1752, // 020D GETMET R11 R11 K82 + 0x7C2C0200, // 020E CALL R11 1 + 0x7C280200, // 020F CALL R10 1 + 0xA802001D, // 0210 EXBLK 0 #022F + 0x5C2C1400, // 0211 MOVE R11 R10 + 0x7C2C0000, // 0212 CALL R11 0 + 0x8C301753, // 0213 GETMET R12 R11 K83 + 0x7C300200, // 0214 CALL R12 1 + 0x1C301809, // 0215 EQ R12 R12 R9 + 0x78320015, // 0216 JMPF R12 #022D + 0xB8323E00, // 0217 GETNGBL R12 K31 + 0x8C301924, // 0218 GETMET R12 R12 K36 + 0x8C38174F, // 0219 GETMET R14 R11 K79 + 0x7C380200, // 021A CALL R14 1 + 0x8C381D3F, // 021B GETMET R14 R14 K63 + 0x7C380200, // 021C CALL R14 1 + 0x8C381D40, // 021D GETMET R14 R14 K64 + 0x7C380200, // 021E CALL R14 1 + 0x8C381D26, // 021F GETMET R14 R14 K38 + 0x7C380200, // 0220 CALL R14 1 + 0x003AA80E, // 0221 ADD R14 K84 R14 + 0x583C000F, // 0222 LDCONST R15 K15 0x7C300600, // 0223 CALL R12 3 - 0x50300200, // 0224 LDBOOL R12 1 0 - 0xA0000000, // 0225 CLOSE R0 - 0xA8040001, // 0226 EXBLK 1 1 - 0x80041800, // 0227 RET 1 R12 - 0xA0280000, // 0228 CLOSE R10 - 0x7001FFE1, // 0229 JMP #020C - 0x58280055, // 022A LDCONST R10 K85 - 0xAC280200, // 022B CATCH R10 1 0 - 0xB0080000, // 022C RAISE 2 R0 R0 - 0xB82A3E00, // 022D GETNGBL R10 K31 - 0x8C281524, // 022E GETMET R10 R10 K36 - 0x60300008, // 022F GETGBL R12 G8 - 0x5C341200, // 0230 MOVE R13 R9 - 0x7C300200, // 0231 CALL R12 1 - 0x0032AC0C, // 0232 ADD R12 K86 R12 - 0x00301957, // 0233 ADD R12 R12 K87 - 0x5834000F, // 0234 LDCONST R13 K15 - 0x7C280600, // 0235 CALL R10 3 - 0xB82A0400, // 0236 GETNGBL R10 K2 - 0x88281558, // 0237 GETMBR R10 R10 K88 - 0x900E2E0A, // 0238 SETMBR R3 K23 R10 - 0x60280008, // 0239 GETGBL R10 G8 - 0x5C2C1200, // 023A MOVE R11 R9 - 0x7C280200, // 023B CALL R10 1 - 0x002AB20A, // 023C ADD R10 K89 R10 - 0x900E480A, // 023D SETMBR R3 K36 R10 + 0xB8323E00, // 0224 GETNGBL R12 K31 + 0x8C301955, // 0225 GETMET R12 R12 K85 + 0x543A07CF, // 0226 LDINT R14 2000 + 0x843C0000, // 0227 CLOSURE R15 P0 + 0x7C300600, // 0228 CALL R12 3 + 0x50300200, // 0229 LDBOOL R12 1 0 + 0xA0000000, // 022A CLOSE R0 + 0xA8040001, // 022B EXBLK 1 1 + 0x80041800, // 022C RET 1 R12 + 0xA0280000, // 022D CLOSE R10 + 0x7001FFE1, // 022E JMP #0211 + 0x58280056, // 022F LDCONST R10 K86 + 0xAC280200, // 0230 CATCH R10 1 0 + 0xB0080000, // 0231 RAISE 2 R0 R0 + 0xB82A3E00, // 0232 GETNGBL R10 K31 + 0x8C281524, // 0233 GETMET R10 R10 K36 + 0x60300008, // 0234 GETGBL R12 G8 + 0x5C341200, // 0235 MOVE R13 R9 + 0x7C300200, // 0236 CALL R12 1 + 0x0032AE0C, // 0237 ADD R12 K87 R12 + 0x00301958, // 0238 ADD R12 R12 K88 + 0x5834000F, // 0239 LDCONST R13 K15 + 0x7C280600, // 023A CALL R10 3 + 0xB82A0400, // 023B GETNGBL R10 K2 + 0x88281559, // 023C GETMBR R10 R10 K89 + 0x900E2E0A, // 023D SETMBR R3 K23 R10 0x4C280000, // 023E LDNIL R10 0xA0000000, // 023F CLOSE R0 0x80041400, // 0240 RET 1 R10 From 9f77cfd890efaee82629a7427137b7a157100137 Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Wed, 19 Apr 2023 16:17:04 +0200 Subject: [PATCH 011/289] Fix single pin latching relay power on state Fix single pin latching relay power on state (#18386) --- CHANGELOG.md | 4 ++-- RELEASENOTES.md | 3 ++- tasmota/tasmota.ino | 4 ++-- tasmota/tasmota_support/support_tasmota.ino | 9 +++++---- 4 files changed, 11 insertions(+), 9 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index fe36cd2e2..4307c6f5b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,8 +6,8 @@ All notable changes to this project will be documented in this file. ## [12.5.0.1] ### Added - Matter sensors Humidity, Pressure, Illuminance; optimize memory (#18441) -- Command ``SetOption152 0/1`` to select two (default) or one pin bistable relay control (#18386) -- Matter allow `Matter#Initialized` rule once the device is configured +- Command ``SetOption152 0/1`` to select two (0 = default) pin bistable or one (1) pin latching relay control (#18386) +- Matter allow `Matter#Initialized` rule once the device is configured (#18451) ### Breaking Changed diff --git a/RELEASENOTES.md b/RELEASENOTES.md index 0c0f50aad..1470f9262 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -112,8 +112,9 @@ The latter links can be used for OTA upgrades too like ``OtaUrl https://ota.tasm ## Changelog v12.5.0.1 ### Added -- Command ``SetOption152 0/1`` to select two (default) or one pin bistable relay control [#18386](https://github.com/arendst/Tasmota/issues/18386) +- Command ``SetOption152 0/1`` to select two (0 = default) pin bistable or one (1) pin latching relay control [#18386](https://github.com/arendst/Tasmota/issues/18386) - Matter sensors Humidity, Pressure, Illuminance [#18441](https://github.com/arendst/Tasmota/issues/18441) +- Matter allow `Matter#Initialized` rule once the device is configured [#18451](https://github.com/arendst/Tasmota/issues/18451) ### Breaking Changed diff --git a/tasmota/tasmota.ino b/tasmota/tasmota.ino index cdba8af55..ec4a65f08 100644 --- a/tasmota/tasmota.ino +++ b/tasmota/tasmota.ino @@ -254,7 +254,7 @@ struct TasmotaGlobal_t { void *log_buffer_mutex; // Control access to log buffer power_t power; // Current copy of Settings->power - power_t power_bistable; // Current state of single pin bistable power + power_t power_latching; // Current state of single pin latching power power_t rel_inverted; // Relay inverted flag (1 = (0 = On, 1 = Off)) power_t rel_bistable; // Relay bistable bitmap power_t last_power; // Last power set state @@ -431,7 +431,7 @@ void setup(void) { TasmotaGlobal.global_state.data = 0xF; // Init global state (wifi_down, mqtt_down) to solve possible network issues TasmotaGlobal.enable_logging = 1; TasmotaGlobal.seriallog_level = LOG_LEVEL_INFO; // Allow specific serial messages until config loaded - TasmotaGlobal.power_bistable = 0x80000000; + TasmotaGlobal.power_latching = 0x80000000; RtcRebootLoad(); if (!RtcRebootValid()) { diff --git a/tasmota/tasmota_support/support_tasmota.ino b/tasmota/tasmota_support/support_tasmota.ino index 432f7682e..09ffc5f73 100644 --- a/tasmota/tasmota_support/support_tasmota.ino +++ b/tasmota/tasmota_support/support_tasmota.ino @@ -320,12 +320,12 @@ void SetDevicePower(power_t rpower, uint32_t source) { bool update = true; if (bitRead(TasmotaGlobal.rel_bistable, port)) { if (Settings->flag6.bistable_single_pin) { // SetOption152 - (Power) Use single pin bistable - if (0x80000000 == TasmotaGlobal.power_bistable) { - TasmotaGlobal.power_bistable = TasmotaGlobal.power; // Init last known state + if (0x80000000 == TasmotaGlobal.power_latching) { + TasmotaGlobal.power_latching = TasmotaGlobal.power; // Init last known state } - update = (bitRead(TasmotaGlobal.power_bistable, port) != state); + update = (bitRead(TasmotaGlobal.power_latching, port) != state); if (update) { - bitWrite(TasmotaGlobal.power_bistable, port, state); + bitWrite(TasmotaGlobal.power_latching, port, state); bitSet(bistable, port); } @@ -418,6 +418,7 @@ void SetPowerOnState(void) } else { power_t devices_mask = POWER_MASK >> (POWER_SIZE - TasmotaGlobal.devices_present); if (ResetReasonPowerOn()) { + TasmotaGlobal.power_latching = 0; // Single pin latching relay is powered off after re-applying power switch (Settings->poweronstate) { case POWER_ALL_OFF: case POWER_ALL_OFF_PULSETIME_ON: From b235dffb291075c51730cac3e605ff2478b6f8ed Mon Sep 17 00:00:00 2001 From: s-hadinger <49731213+s-hadinger@users.noreply.github.com> Date: Wed, 19 Apr 2023 23:45:05 +0200 Subject: [PATCH 012/289] Fix Berry hue_bridge (#18459) --- .../src/be_light_state_class.cpp | 12 +++++----- .../berry_tasmota/src/embedded/hue_bridge.be | 2 +- .../src/solidify/solidified_hue_bridge.h | 2 +- .../src/solidify/solidified_i2c_axp192.h | 2 +- .../src/solidify/solidified_i2c_axp202.h | 2 +- tasmota/berry/alexa/hue_test.be | 10 ++++---- tasmota/berry/alexa/light_state.be | 24 +++++++++++++------ 7 files changed, 32 insertions(+), 22 deletions(-) diff --git a/lib/libesp32/berry_tasmota/src/be_light_state_class.cpp b/lib/libesp32/berry_tasmota/src/be_light_state_class.cpp index 5c278dd2d..7d81ce686 100644 --- a/lib/libesp32/berry_tasmota/src/be_light_state_class.cpp +++ b/lib/libesp32/berry_tasmota/src/be_light_state_class.cpp @@ -44,9 +44,9 @@ extern void ls_set_reachable(class LightStateClass* l, int32_t pow); BE_FUNC_CTY extern void ls_signal_change(void) {} BE_FUNC_CTYPE_DECLARE(ls_signal_change, "", "."); -extern int32_t ls_gamma8(int32_t val); BE_FUNC_CTYPE_DECLARE(ls_gamma8, "i", "-i") -extern int32_t ls_gamma10(int32_t val); BE_FUNC_CTYPE_DECLARE(ls_gamma10, "i", "-i") -extern int32_t ls_rev_gamma10(int32_t val); BE_FUNC_CTYPE_DECLARE(ls_rev_gamma10, "i", "-i") +extern int32_t ls_gamma8(int32_t val); BE_FUNC_CTYPE_DECLARE(ls_gamma8, "i", "i") +extern int32_t ls_gamma10(int32_t val); BE_FUNC_CTYPE_DECLARE(ls_gamma10, "i", "i") +extern int32_t ls_rev_gamma10(int32_t val); BE_FUNC_CTYPE_DECLARE(ls_rev_gamma10, "i", "i") // moved to constants array const be_const_member_t light_state_members[] = { @@ -112,9 +112,9 @@ class be_class_light_state (scope: global, name: light_state) { signal_change, ctype_func(ls_signal_change) - gamma8, ctype_func(ls_gamma8) - gamma10, ctype_func(ls_gamma10) - reverse_gamma10, ctype_func(ls_rev_gamma10) + gamma8, static_ctype_func(ls_gamma8) + gamma10, static_ctype_func(ls_gamma10) + reverse_gamma10, static_ctype_func(ls_rev_gamma10) } @const_object_info_end */ diff --git a/lib/libesp32/berry_tasmota/src/embedded/hue_bridge.be b/lib/libesp32/berry_tasmota/src/embedded/hue_bridge.be index 62a0982bf..740fd169d 100644 --- a/lib/libesp32/berry_tasmota/src/embedded/hue_bridge.be +++ b/lib/libesp32/berry_tasmota/src/embedded/hue_bridge.be @@ -23,7 +23,7 @@ hue_bridge.init = def (m) if !manuf manuf = "Tasmota" end self.lights[id] = { 'light': light, 'name':name, 'model': str(model), 'manuf':str(manuf) } - light + return light end def remove_light(id) diff --git a/lib/libesp32/berry_tasmota/src/solidify/solidified_hue_bridge.h b/lib/libesp32/berry_tasmota/src/solidify/solidified_hue_bridge.h index 14f64cfa5..caad7d225 100644 --- a/lib/libesp32/berry_tasmota/src/solidify/solidified_hue_bridge.h +++ b/lib/libesp32/berry_tasmota/src/solidify/solidified_hue_bridge.h @@ -171,7 +171,7 @@ be_local_closure(hue_bridge_monad_add_light, /* name */ 0x7C200200, // 0027 CALL R8 1 0x981E1A08, // 0028 SETIDX R7 K13 R8 0x98180207, // 0029 SETIDX R6 R1 R7 - 0x80000000, // 002A RET 0 + 0x80040400, // 002A RET 1 R2 }) ) ); diff --git a/lib/libesp32/berry_tasmota/src/solidify/solidified_i2c_axp192.h b/lib/libesp32/berry_tasmota/src/solidify/solidified_i2c_axp192.h index 2ef43a553..97c7d8cb3 100644 --- a/lib/libesp32/berry_tasmota/src/solidify/solidified_i2c_axp192.h +++ b/lib/libesp32/berry_tasmota/src/solidify/solidified_i2c_axp192.h @@ -72,7 +72,7 @@ be_local_closure(AXP192_get_bat_power, /* name */ 1, /* has constants */ ( &(const bvalue[ 2]) { /* constants */ /* K0 */ be_nested_str(read24), - /* K1 */ be_const_real_hex(0x3A102DE0), + /* K1 */ be_const_real_hex(0x3A102DE1), }), &be_const_str_get_bat_power, &be_const_str_solidified, diff --git a/lib/libesp32/berry_tasmota/src/solidify/solidified_i2c_axp202.h b/lib/libesp32/berry_tasmota/src/solidify/solidified_i2c_axp202.h index a912b0660..4d8199e1d 100644 --- a/lib/libesp32/berry_tasmota/src/solidify/solidified_i2c_axp202.h +++ b/lib/libesp32/berry_tasmota/src/solidify/solidified_i2c_axp202.h @@ -172,7 +172,7 @@ be_local_closure(AXP202_get_bat_power, /* name */ 1, /* has constants */ ( &(const bvalue[ 2]) { /* constants */ /* K0 */ be_nested_str(read24), - /* K1 */ be_const_real_hex(0x3A102DE0), + /* K1 */ be_const_real_hex(0x3A102DE1), }), &be_const_str_get_bat_power, &be_const_str_solidified, diff --git a/tasmota/berry/alexa/hue_test.be b/tasmota/berry/alexa/hue_test.be index 01d095440..5acb17f3a 100644 --- a/tasmota/berry/alexa/hue_test.be +++ b/tasmota/berry/alexa/hue_test.be @@ -17,13 +17,13 @@ assert(l.power == false) l.set_power(true) assert(l.power == true) -import hue_ntv -print(l._p) -print(hue_ntv.light_state(l)) - -print(hue_ntv.full_state(3, l, "aaa", "bbb", "ccc")) +# import hue_ntv +# print(l._p) +# print(hue_ntv.light_state(l)) +# print(hue_ntv.full_state(3, l, "aaa", "bbb", "ccc")) +import hue_bridge hue_bridge.add_light(10, l, "Synthetic Light", "V1", "DeadParrot") l1 = light_state(light_state.DIMMER) diff --git a/tasmota/berry/alexa/light_state.be b/tasmota/berry/alexa/light_state.be index a9024d428..81175f84b 100644 --- a/tasmota/berry/alexa/light_state.be +++ b/tasmota/berry/alexa/light_state.be @@ -36,11 +36,6 @@ assert(l.ct == 400) assert(l.mode_ct) - - - - - # assert(l.x == 0.215944) # assert(l.y == 0.700957) @@ -69,7 +64,22 @@ c.set_xy(0.422, 0.548) l = light_state(light_state.RGBCT) l.set_rgb(30,40,90) -assert(str(l.get()) == "{'mode_ct': false, 'hue': 230, 'rgb': '1E285A', 'bri': 90, 'channels': [30, 40, 90, 0, 0], 'mode_rgb': true, 'sat': 170}") +assert(str(l.get()) == "{'rgb': '1E285A', 'hue': 230, 'type': 5, 'power': false, 'bri': 90, 'mode_rgb': true, 'sat': 170, 'mode_ct': false, 'channels': [30, 40, 90, 0, 0]}") l.set_ct(340) -assert(str(l.get()) == "{'bri': 90, 'ct': 340, 'mode_ct': true, 'mode_rgb': false, 'channels': [0, 0, 0, 42, 48]}") +assert(str(l.get()) == "{'mode_ct': true, 'ct': 340, 'channels': [0, 0, 0, 42, 48], 'bri': 90, 'type': 5, 'mode_rgb': false, 'power': false}") + +# gamma functions +assert(light_state.gamma8(0) == 0) +assert(light_state.gamma8(100) == 20) +assert(light_state.gamma8(255) == 255) + +assert(light_state.gamma10(0) == 0) +assert(light_state.gamma10(100) == 7) +assert(light_state.gamma10(255) == 25) +assert(light_state.gamma10(1023) == 1023) + +assert(light_state.reverse_gamma10(0) == 0) +assert(light_state.reverse_gamma10(7) == 107) +assert(light_state.reverse_gamma10(25) == 253) +assert(light_state.reverse_gamma10(1023) == 1023) From 11a43ea99b19ef682f02b725c78d5a9557f26055 Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Thu, 20 Apr 2023 20:01:35 +0200 Subject: [PATCH 013/289] Tasmota Core 208 (#18460) * Tasmota Core 2.0.8 * Fix Linker errors --- .github/PULL_REQUEST_TEMPLATE.md | 2 +- CHANGELOG.md | 1 + .../Zip-readonly-FS/src/ZipReadFS.cpp | 24 ++++++++++++------- platformio.ini | 2 +- platformio_tasmota32.ini | 4 ++-- .../xdrv_23_zigbee_7_6_flash_fs.ino | 7 ++++-- 6 files changed, 26 insertions(+), 14 deletions(-) diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index f99a39107..edb419e1c 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -7,7 +7,7 @@ - [ ] Only relevant files were touched - [ ] Only one feature/fix was added per PR and the code change compiles without warnings - [ ] The code change is tested and works with Tasmota core ESP8266 V.2.7.4.9 - - [ ] The code change is tested and works with Tasmota core ESP32 V.2.0.7 + - [ ] The code change is tested and works with Tasmota core ESP32 V.2.0.8 - [ ] I accept the [CLA](https://github.com/arendst/Tasmota/blob/development/CONTRIBUTING.md#contributor-license-agreement-cla). _NOTE: The code change must pass CI tests. **Your PR cannot be merged unless tests pass**_ diff --git a/CHANGELOG.md b/CHANGELOG.md index 4307c6f5b..92464b961 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,7 @@ All notable changes to this project will be documented in this file. ### Breaking Changed ### Changed +- ESP32 Framework (Core) from v2.0.7 to v2.0.8 ### Fixed - ESP8266 Energy Export Active no update regression from v12.3.1.3 diff --git a/lib/libesp32/Zip-readonly-FS/src/ZipReadFS.cpp b/lib/libesp32/Zip-readonly-FS/src/ZipReadFS.cpp index 278802e9b..5e642105b 100644 --- a/lib/libesp32/Zip-readonly-FS/src/ZipReadFS.cpp +++ b/lib/libesp32/Zip-readonly-FS/src/ZipReadFS.cpp @@ -37,7 +37,7 @@ enum LoggingLevels {LOG_LEVEL_NONE, LOG_LEVEL_ERROR, LOG_LEVEL_INFO, LOG_LEVEL_D time_t dos2unixtime(uint32_t dostime) /* Return the Unix time_t value (GMT/UTC time) for the DOS format (local) * time dostime, where dostime is a four byte value (date in most - * significant word, time in least significant word), see dostime() + * significant word, time in least significant word), see dostime() * function. */ { @@ -174,8 +174,6 @@ public: bool setBufferSize(size_t size) { return true; } - - #if ESP_ARDUINO_VERSION > ESP_ARDUINO_VERSION_VAL(2, 0, 5) bool seekDir(long position){ if(!_f){ return false; @@ -189,7 +187,14 @@ public: } return _f.getNextFileName(); } - #endif + String getNextFileName(bool *isDir) + { + if (!_f) { + return ""; + } + return _f.getNextFileName(isDir); + + } protected: File _f; @@ -300,15 +305,12 @@ public: FileImplPtr openNextFile(const char* mode) { return nullptr; // TODO } - - #if ESP_ARDUINO_VERSION > ESP_ARDUINO_VERSION_VAL(2, 0, 5) bool seekDir(long position){ if(!_f){ return false; } return _f.seekDir(position); } - String getNextFileName(void) { if (!_f) { @@ -316,8 +318,14 @@ public: } return _f.getNextFileName(); } - #endif + String getNextFileName(bool *isDir) + { + if (!_f) { + return ""; + } + return _f.getNextFileName(isDir); + } void rewindDirectory(void) { // ignore } diff --git a/platformio.ini b/platformio.ini index 595e9736c..b04fef1ab 100644 --- a/platformio.ini +++ b/platformio.ini @@ -115,7 +115,7 @@ build_flags = ${esp_defaults.build_flags} [core] ; *** Esp8266 Tasmota modified Arduino core based on core 2.7.4. Added Backport for PWM selection -platform = https://github.com/tasmota/platform-espressif8266/releases/download/2023.03.00/platform-espressif8266.zip +platform = https://github.com/tasmota/platform-espressif8266/releases/download/2023.04.00/platform-espressif8266.zip platform_packages = build_unflags = ${esp_defaults.build_unflags} build_flags = ${esp82xx_defaults.build_flags} diff --git a/platformio_tasmota32.ini b/platformio_tasmota32.ini index 8de701529..eb4e6b051 100644 --- a/platformio_tasmota32.ini +++ b/platformio_tasmota32.ini @@ -42,7 +42,7 @@ extra_scripts = pre:pio-tools/add_c_flags.py ${esp_defaults.extra_scripts} [core32] -platform = https://github.com/tasmota/platform-espressif32/releases/download/2023.02.00/platform-espressif32.zip -platform_packages = framework-arduinoespressif32 @ https://github.com/tasmota/arduino-esp32/releases/download/pre2.0.8/framework-arduinoespressif32.zip +platform = https://github.com/tasmota/platform-espressif32/releases/download/2023.04.00/platform-espressif32.zip +platform_packages = build_unflags = ${esp32_defaults.build_unflags} build_flags = ${esp32_defaults.build_flags} diff --git a/tasmota/tasmota_xdrv_driver/xdrv_23_zigbee_7_6_flash_fs.ino b/tasmota/tasmota_xdrv_driver/xdrv_23_zigbee_7_6_flash_fs.ino index 1900e7122..0554c8de4 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_23_zigbee_7_6_flash_fs.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_23_zigbee_7_6_flash_fs.ino @@ -108,7 +108,6 @@ public: } #ifdef ESP32 - #if ESP_ARDUINO_VERSION > ESP_ARDUINO_VERSION_VAL(2, 0, 5) bool seekDir(long position){ return false; // ignore @@ -118,7 +117,11 @@ public: return ""; // ignore } - #endif + String getNextFileName(bool *isDir) + { + return ""; + // ignore + } #endif // ESP32 const char* name() const { From 49d5356ea312db41101ec9a4fd908ddb006cde99 Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Thu, 20 Apr 2023 20:26:07 +0200 Subject: [PATCH 014/289] Show Metrics for ESP32x firmware (#18461) --- pio-tools/name-firmware.py | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/pio-tools/name-firmware.py b/pio-tools/name-firmware.py index 09edb2866..524f712e6 100644 --- a/pio-tools/name-firmware.py +++ b/pio-tools/name-firmware.py @@ -28,5 +28,11 @@ def bin_map_copy(source, target, env): shutil.move(tasmotapiolib.get_source_map_path(env), map_file) if env["PIOPLATFORM"] == "espressif32": shutil.copy(factory, one_bin_file) - -env.AddPostAction("$BUILD_DIR/${PROGNAME}.bin", bin_map_copy) \ No newline at end of file + # Print Metrics for firmware using "map" file + import esp_idf_size + CYAN = '\033[96m' + ENDC = '\033[0m' + print(CYAN + "=============================================================================================" + ENDC) + env.Execute("$PYTHONEXE -m esp_idf_size " + str(map_file.resolve())) + print(CYAN + "=============================================================================================" + ENDC) +env.AddPostAction("$BUILD_DIR/${PROGNAME}.bin", bin_map_copy) From 3c57755bb78540fe0bd1a3e73977cb75bcf90ddf Mon Sep 17 00:00:00 2001 From: s-hadinger <49731213+s-hadinger@users.noreply.github.com> Date: Fri, 21 Apr 2023 08:59:49 +0200 Subject: [PATCH 015/289] Berry fix rules for string comparisons (#18464) --- CHANGELOG.md | 1 + .../src/embedded/rule_matcher.be | 26 ++++++++++++------- .../src/solidify/solidified_rule_matcher.h | 2 +- 3 files changed, 18 insertions(+), 11 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 92464b961..d0fcd033b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -17,6 +17,7 @@ All notable changes to this project will be documented in this file. ### Fixed - ESP8266 Energy Export Active no update regression from v12.3.1.3 - NovaSDS GUI values (#18444) +- Berry fix rules for string comparisons ### Removed diff --git a/lib/libesp32/berry_tasmota/src/embedded/rule_matcher.be b/lib/libesp32/berry_tasmota/src/embedded/rule_matcher.be index a3005e6b1..b28b97b3d 100644 --- a/lib/libesp32/berry_tasmota/src/embedded/rule_matcher.be +++ b/lib/libesp32/berry_tasmota/src/embedded/rule_matcher.be @@ -17,8 +17,8 @@ tasmota.Rule_Matcher.parse("AA#BB#CC") tasmota.Rule_Matcher.parse("AA") # [] -tasmota.Rule_Matcher.parse("AA#BB#CC=2") -# [, , , ] +tasmota.Rule_Matcher.parse("AA#BB#CC==2") +# [, , , ] tasmota.Rule_Matcher.parse("AA#BB#CC>=3.5") # [, , , =' val='3.5'>] @@ -26,8 +26,8 @@ tasmota.Rule_Matcher.parse("AA#BB#CC>=3.5") tasmota.Rule_Matcher.parse("AA#BB#CC!3.5") # [, , ] -tasmota.Rule_Matcher.parse("AA#BB#CC==3=5") -# [, , , ] +tasmota.Rule_Matcher.parse("AA#BB#CC=3=5") +# [, , , ] tasmota.Rule_Matcher.parse("AA#BB#!CC!==3=5") # [, , , ] @@ -39,16 +39,16 @@ tasmota.Rule_Matcher.parse("A#?#B") # [, , ] tasmota.Rule_Matcher.parse("A#?>50") -# [, , ' val='50'>] +# [, , ' val=50>] tasmota.Rule_Matcher.parse("A[1]") -# [, ] +# [, ] tasmota.Rule_Matcher.parse("A[1]#B[2]>3") -# [, , , , ' val='3'>] +# [, , , , ' val=3>] tasmota.Rule_Matcher.parse("A#B[]>3") -# [, , , ' val='3'>] +# [, , , ' val=3>] ################################################################################# @@ -67,7 +67,13 @@ assert(m.match({'aa':{'bb':1}}) == nil) assert(m.match({'aa':{'bb':{'cc':1}}}) == nil) assert(m.match({'aa':{'bb':{'cc':2}}}) == 2) -m = tasmota.Rule_Matcher.parse("AA#?#CC==2") +m = tasmota.Rule_Matcher.parse("AA#BB#CC=Foo") +assert(m.match({'aa':{'bb':{'cc':1}}}) == nil) +assert(m.match({'aa':{'bb':{'cc':'Foo'}}}) == 'Foo') +assert(m.match({'aa':{'bb':{'cc':'foo'}}}) == 'foo') +assert(m.match({'aa':{'bb':{'cc':'foobar'}}}) == nil) + +m = tasmota.Rule_Matcher.parse("AA#?#CC=2") assert(m.match({'aa':1}) == nil) assert(m.match({'aa':{'bb':{'cc':2}}}) == 2) @@ -251,7 +257,7 @@ class Rule_Matcher self.op_value = val_num end else - self.op_value = str(op) + self.op_value = str(op_value) end end diff --git a/lib/libesp32/berry_tasmota/src/solidify/solidified_rule_matcher.h b/lib/libesp32/berry_tasmota/src/solidify/solidified_rule_matcher.h index d00751b01..b8e5bbfb7 100644 --- a/lib/libesp32/berry_tasmota/src/solidify/solidified_rule_matcher.h +++ b/lib/libesp32/berry_tasmota/src/solidify/solidified_rule_matcher.h @@ -789,7 +789,7 @@ be_local_closure(Rule_Matcher_Operator_op_parse, /* name */ 0x90022C13, // 005A SETMBR R0 K22 R19 0x70020003, // 005B JMP #0060 0x60480008, // 005C GETGBL R18 G8 - 0x5C4C0200, // 005D MOVE R19 R1 + 0x5C4C0400, // 005D MOVE R19 R2 0x7C480200, // 005E CALL R18 1 0x90022C12, // 005F SETMBR R0 K22 R18 0x80000000, // 0060 RET 0 From ca88aa2519218c5775bce10b8e3bab2efd6f30e2 Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Fri, 21 Apr 2023 14:24:29 +0200 Subject: [PATCH 016/289] fix c3 map metrics (#18465) --- pio-tools/gzip-firmware.py | 4 ++++ pio-tools/name-firmware.py | 7 ------- platformio_tasmota32.ini | 2 +- 3 files changed, 5 insertions(+), 8 deletions(-) diff --git a/pio-tools/gzip-firmware.py b/pio-tools/gzip-firmware.py index e03418262..19c323300 100644 --- a/pio-tools/gzip-firmware.py +++ b/pio-tools/gzip-firmware.py @@ -20,6 +20,10 @@ def map_gzip(source, target, env): with map_file.open("rb") as fp: with gzip.open(gzip_file, "wb", compresslevel=9) as f: shutil.copyfileobj(fp, f) + if env["PIOPLATFORM"] == "espressif32": + # Print Metrics for firmware using "map" file + import tasmota_metrics + env.Execute("$PYTHONEXE -m tasmota_metrics " + str(map_file.resolve())) # remove map file if map_file.is_file(): diff --git a/pio-tools/name-firmware.py b/pio-tools/name-firmware.py index 524f712e6..47366990d 100644 --- a/pio-tools/name-firmware.py +++ b/pio-tools/name-firmware.py @@ -28,11 +28,4 @@ def bin_map_copy(source, target, env): shutil.move(tasmotapiolib.get_source_map_path(env), map_file) if env["PIOPLATFORM"] == "espressif32": shutil.copy(factory, one_bin_file) - # Print Metrics for firmware using "map" file - import esp_idf_size - CYAN = '\033[96m' - ENDC = '\033[0m' - print(CYAN + "=============================================================================================" + ENDC) - env.Execute("$PYTHONEXE -m esp_idf_size " + str(map_file.resolve())) - print(CYAN + "=============================================================================================" + ENDC) env.AddPostAction("$BUILD_DIR/${PROGNAME}.bin", bin_map_copy) diff --git a/platformio_tasmota32.ini b/platformio_tasmota32.ini index eb4e6b051..cec17d738 100644 --- a/platformio_tasmota32.ini +++ b/platformio_tasmota32.ini @@ -42,7 +42,7 @@ extra_scripts = pre:pio-tools/add_c_flags.py ${esp_defaults.extra_scripts} [core32] -platform = https://github.com/tasmota/platform-espressif32/releases/download/2023.04.00/platform-espressif32.zip +platform = https://github.com/tasmota/platform-espressif32/releases/download/2023.04.01/platform-espressif32.zip platform_packages = build_unflags = ${esp32_defaults.build_unflags} build_flags = ${esp32_defaults.build_flags} From 844db4bc549a73591b3f83ebc60b115f94f5f4e2 Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Fri, 21 Apr 2023 14:57:59 +0200 Subject: [PATCH 017/289] Update changelogs --- CHANGELOG.md | 2 +- RELEASENOTES.md | 10 ++++++---- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d0fcd033b..1365dcecf 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -17,7 +17,7 @@ All notable changes to this project will be documented in this file. ### Fixed - ESP8266 Energy Export Active no update regression from v12.3.1.3 - NovaSDS GUI values (#18444) -- Berry fix rules for string comparisons +- Berry fix rules for string comparisons (#18464) ### Removed diff --git a/RELEASENOTES.md b/RELEASENOTES.md index 1470f9262..a34e698c9 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -36,9 +36,9 @@ While fallback or downgrading is common practice it was never supported due to S This release will be supported from ESP8266/Arduino library Core version **2.7.4.9** due to reported security and stability issues on previous Core version. This will also support gzipped binaries. -This release will be supported from ESP32/Arduino library Core version **2.0.7**. +This release will be supported from ESP32/Arduino library Core version **2.0.8**. -Support of ESP8266 Core versions before 2.7.4.9 and ESP32 Core versions before 2.0.7 have been removed. +Support of ESP8266 Core versions before 2.7.4.9 and ESP32 Core versions before 2.0.8 have been removed. ## Support of TLS @@ -80,7 +80,7 @@ Historical binaries can be downloaded from The latter links can be used for OTA upgrades too like ``OtaUrl http://ota.tasmota.com/tasmota/release/tasmota.bin.gz`` ### ESP32, ESP32-C3, ESP32-S2 and ESP32-S3 based -The following binary downloads have been compiled with ESP32/Arduino library core version **2.0.7**. +The following binary downloads have been compiled with ESP32/Arduino library core version **2.0.8**. - **tasmota32.bin** = The Tasmota version with most drivers including additional sensors and KNX for 4M+ flash. **RECOMMENDED RELEASE BINARY** - **tasmota32xy.bin** = The Tasmota version with most drivers including additional sensors and KNX for ESP32-C3/S2/S3 and 4M+ flash. @@ -119,7 +119,9 @@ The latter links can be used for OTA upgrades too like ``OtaUrl https://ota.tasm ### Breaking Changed ### Changed +- ESP32 Framework (Core) from v2.0.7 to v2.0.8 ### Fixed - ESP8266 Energy Export Active no update regression from v12.3.1.3 -- NovaSDS GUI values [#18444](https://github.com/arendst/Tasmota/issues/18444) \ No newline at end of file +- NovaSDS GUI values [#18444](https://github.com/arendst/Tasmota/issues/18444) +- Berry fix rules for string comparisons [#18464](https://github.com/arendst/Tasmota/issues/18464) \ No newline at end of file From 5a2266289e829939f418da4bd0881fb93e9819cc Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Fri, 21 Apr 2023 16:55:09 +0200 Subject: [PATCH 018/289] Update Sievert --- tasmota/language/af_AF.h | 2 +- tasmota/language/bg_BG.h | 2 +- tasmota/language/ca_AD.h | 2 +- tasmota/language/cs_CZ.h | 2 +- tasmota/language/de_DE.h | 2 +- tasmota/language/el_GR.h | 2 +- tasmota/language/en_GB.h | 2 +- tasmota/language/es_ES.h | 2 +- tasmota/language/fr_FR.h | 2 +- tasmota/language/fy_NL.h | 2 +- tasmota/language/he_HE.h | 2 +- tasmota/language/hu_HU.h | 2 +- tasmota/language/it_IT.h | 2 +- tasmota/language/ko_KO.h | 2 +- tasmota/language/nl_NL.h | 2 +- tasmota/language/pl_PL.h | 2 +- tasmota/language/pt_BR.h | 2 +- tasmota/language/pt_PT.h | 2 +- tasmota/language/ro_RO.h | 2 +- tasmota/language/ru_RU.h | 2 +- tasmota/language/sk_SK.h | 2 +- tasmota/language/sv_SE.h | 2 +- tasmota/language/tr_TR.h | 2 +- tasmota/language/uk_UA.h | 2 +- tasmota/language/vi_VN.h | 2 +- tasmota/language/zh_CN.h | 2 +- tasmota/language/zh_TW.h | 2 +- 27 files changed, 27 insertions(+), 27 deletions(-) diff --git a/tasmota/language/af_AF.h b/tasmota/language/af_AF.h index 067ecf05d..9e3bd4c85 100644 --- a/tasmota/language/af_AF.h +++ b/tasmota/language/af_AF.h @@ -1191,6 +1191,6 @@ // xsns_106_gdk101.ino #define D_AVG_RAD_DOSE "Gemiddelde Stralingsdosis" -#define D_UNIT_US_H "uSv/h" +#define D_UNIT_US_H "µSv/h" #endif // _LANGUAGE_AF_AF_H_ diff --git a/tasmota/language/bg_BG.h b/tasmota/language/bg_BG.h index ca0eabab2..c3cbbc090 100644 --- a/tasmota/language/bg_BG.h +++ b/tasmota/language/bg_BG.h @@ -1191,6 +1191,6 @@ // xsns_106_gdk101.ino #define D_AVG_RAD_DOSE "средна доза радиация" -#define D_UNIT_US_H "uSv/h" +#define D_UNIT_US_H "µSv/h" #endif // _LANGUAGE_BG_BG_H_ diff --git a/tasmota/language/ca_AD.h b/tasmota/language/ca_AD.h index 20b427448..9a4b04e36 100644 --- a/tasmota/language/ca_AD.h +++ b/tasmota/language/ca_AD.h @@ -1191,6 +1191,6 @@ // xsns_106_gdk101.ino #define D_AVG_RAD_DOSE "dosi mitjana de radiació" -#define D_UNIT_US_H "uSv/h" +#define D_UNIT_US_H "µSv/h" #endif // _LANGUAGE_CA_AD_H_ diff --git a/tasmota/language/cs_CZ.h b/tasmota/language/cs_CZ.h index 0752be295..d0afa8994 100644 --- a/tasmota/language/cs_CZ.h +++ b/tasmota/language/cs_CZ.h @@ -1191,6 +1191,6 @@ // xsns_106_gdk101.ino #define D_AVG_RAD_DOSE "průměrná dávka záření" -#define D_UNIT_US_H "uSv/h" +#define D_UNIT_US_H "µSv/h" #endif // _LANGUAGE_CS_CZ_H_ diff --git a/tasmota/language/de_DE.h b/tasmota/language/de_DE.h index 7ced98891..cee4dcf77 100644 --- a/tasmota/language/de_DE.h +++ b/tasmota/language/de_DE.h @@ -1191,6 +1191,6 @@ // xsns_106_gdk101.ino #define D_AVG_RAD_DOSE "durchschnittliche Strahlendosis" -#define D_UNIT_US_H "uSv/h" +#define D_UNIT_US_H "µSv/h" #endif // _LANGUAGE_DE_DE_H_ diff --git a/tasmota/language/el_GR.h b/tasmota/language/el_GR.h index 7228d86bb..cd4943ae5 100644 --- a/tasmota/language/el_GR.h +++ b/tasmota/language/el_GR.h @@ -1191,6 +1191,6 @@ // xsns_106_gdk101.ino #define D_AVG_RAD_DOSE "μέση δόση ακτινοβολίας" -#define D_UNIT_US_H "uSv/h" +#define D_UNIT_US_H "µSv/h" #endif // _LANGUAGE_EL_GR_H_ diff --git a/tasmota/language/en_GB.h b/tasmota/language/en_GB.h index 899a5691c..b3aafeda2 100644 --- a/tasmota/language/en_GB.h +++ b/tasmota/language/en_GB.h @@ -1191,6 +1191,6 @@ // xsns_106_gdk101.ino #define D_AVG_RAD_DOSE "Average Radiation Dose" -#define D_UNIT_US_H "uSv/h" +#define D_UNIT_US_H "µSv/h" #endif // _LANGUAGE_EN_GB_H_ diff --git a/tasmota/language/es_ES.h b/tasmota/language/es_ES.h index 4a8585a01..fa98fe4c2 100644 --- a/tasmota/language/es_ES.h +++ b/tasmota/language/es_ES.h @@ -1191,6 +1191,6 @@ // xsns_106_gdk101.ino #define D_AVG_RAD_DOSE "dosis media de radiación" -#define D_UNIT_US_H "uSv/h" +#define D_UNIT_US_H "µSv/h" #endif // _LANGUAGE_ES_ES_H_ diff --git a/tasmota/language/fr_FR.h b/tasmota/language/fr_FR.h index 3991ac470..85e128b19 100644 --- a/tasmota/language/fr_FR.h +++ b/tasmota/language/fr_FR.h @@ -1192,6 +1192,6 @@ // xsns_106_gdk101.ino #define D_AVG_RAD_DOSE "dose moyenne de rayonnement" -#define D_UNIT_US_H "uSv/h" +#define D_UNIT_US_H "µSv/h" #endif // _LANGUAGE_FR_FR_H_ diff --git a/tasmota/language/fy_NL.h b/tasmota/language/fy_NL.h index eab5616e8..b62305b8e 100644 --- a/tasmota/language/fy_NL.h +++ b/tasmota/language/fy_NL.h @@ -1191,6 +1191,6 @@ // xsns_106_gdk101.ino #define D_AVG_RAD_DOSE "gemiddelde stralingsdosis" -#define D_UNIT_US_H "uSv/h" +#define D_UNIT_US_H "µSv/h" #endif // _LANGUAGE_FY_NL_H_ diff --git a/tasmota/language/he_HE.h b/tasmota/language/he_HE.h index 971d6c3e5..ca11fa22b 100644 --- a/tasmota/language/he_HE.h +++ b/tasmota/language/he_HE.h @@ -1191,6 +1191,6 @@ // xsns_106_gdk101.ino #define D_AVG_RAD_DOSE "מינון קרינה ממוצע" -#define D_UNIT_US_H "uSv/h" +#define D_UNIT_US_H "µSv/h" #endif // _LANGUAGE_HE_HE_H_ diff --git a/tasmota/language/hu_HU.h b/tasmota/language/hu_HU.h index 71944db5a..8b98a4001 100644 --- a/tasmota/language/hu_HU.h +++ b/tasmota/language/hu_HU.h @@ -1194,6 +1194,6 @@ // xsns_106_gdk101.ino #define D_AVG_RAD_DOSE "átlagos sugárdózis" -#define D_UNIT_US_H "uSv/h" +#define D_UNIT_US_H "µSv/h" #endif // _LANGUAGE_HU_HU_H_ diff --git a/tasmota/language/it_IT.h b/tasmota/language/it_IT.h index f04fb0d5c..26d70715a 100644 --- a/tasmota/language/it_IT.h +++ b/tasmota/language/it_IT.h @@ -1191,6 +1191,6 @@ // xsns_106_gdk101.ino #define D_AVG_RAD_DOSE "Dose media radiazioni" -#define D_UNIT_US_H "uSv/h" +#define D_UNIT_US_H "µSv/h" #endif // _LANGUAGE_IT_IT_H_ diff --git a/tasmota/language/ko_KO.h b/tasmota/language/ko_KO.h index 13213e643..e7cb05063 100644 --- a/tasmota/language/ko_KO.h +++ b/tasmota/language/ko_KO.h @@ -1191,6 +1191,6 @@ // xsns_106_gdk101.ino #define D_AVG_RAD_DOSE "average radiation dose" -#define D_UNIT_US_H "uSv/h" +#define D_UNIT_US_H "µSv/h" #endif // _LANGUAGE_KO_KO_H_ diff --git a/tasmota/language/nl_NL.h b/tasmota/language/nl_NL.h index e4fd27026..61f1e73ad 100644 --- a/tasmota/language/nl_NL.h +++ b/tasmota/language/nl_NL.h @@ -1191,6 +1191,6 @@ // xsns_106_gdk101.ino #define D_AVG_RAD_DOSE "gemiddelde stralingsdosis" -#define D_UNIT_US_H "uSv/h" +#define D_UNIT_US_H "µSv/h" #endif // _LANGUAGE_NL_NL_H_ diff --git a/tasmota/language/pl_PL.h b/tasmota/language/pl_PL.h index 71d11945c..fe9696836 100644 --- a/tasmota/language/pl_PL.h +++ b/tasmota/language/pl_PL.h @@ -1191,6 +1191,6 @@ // xsns_106_gdk101.ino #define D_AVG_RAD_DOSE "Średnia Dawka Promieniowania" -#define D_UNIT_US_H "uSv/h" +#define D_UNIT_US_H "µSv/h" #endif // _LANGUAGE_PL_PL_D_H_ diff --git a/tasmota/language/pt_BR.h b/tasmota/language/pt_BR.h index 6d43be611..6d761c635 100644 --- a/tasmota/language/pt_BR.h +++ b/tasmota/language/pt_BR.h @@ -1191,6 +1191,6 @@ // xsns_106_gdk101.ino #define D_AVG_RAD_DOSE "dose média de radiação" -#define D_UNIT_US_H "uSv/h" +#define D_UNIT_US_H "µSv/h" #endif // _LANGUAGE_PT_BR_H_ diff --git a/tasmota/language/pt_PT.h b/tasmota/language/pt_PT.h index a91db261a..04062483d 100644 --- a/tasmota/language/pt_PT.h +++ b/tasmota/language/pt_PT.h @@ -1191,6 +1191,6 @@ // xsns_106_gdk101.ino #define D_AVG_RAD_DOSE "dose média de radiação" -#define D_UNIT_US_H "uSv/h" +#define D_UNIT_US_H "µSv/h" #endif // _LANGUAGE_PT_PT_H_ diff --git a/tasmota/language/ro_RO.h b/tasmota/language/ro_RO.h index f9b5b79b7..cc61f7a62 100644 --- a/tasmota/language/ro_RO.h +++ b/tasmota/language/ro_RO.h @@ -1191,6 +1191,6 @@ // xsns_106_gdk101.ino #define D_AVG_RAD_DOSE "doza medie de radiație" -#define D_UNIT_US_H "uSv/h" +#define D_UNIT_US_H "µSv/h" #endif // _LANGUAGE_RO_RO_H_ diff --git a/tasmota/language/ru_RU.h b/tasmota/language/ru_RU.h index d1192b842..be1bc68bb 100644 --- a/tasmota/language/ru_RU.h +++ b/tasmota/language/ru_RU.h @@ -1191,6 +1191,6 @@ // xsns_106_gdk101.ino #define D_AVG_RAD_DOSE "средняя доза облучения" -#define D_UNIT_US_H "uSv/h" +#define D_UNIT_US_H "µSv/h" #endif // _LANGUAGE_RU_RU_H_ diff --git a/tasmota/language/sk_SK.h b/tasmota/language/sk_SK.h index 30ebb0149..e4adf2d20 100644 --- a/tasmota/language/sk_SK.h +++ b/tasmota/language/sk_SK.h @@ -1191,6 +1191,6 @@ // xsns_106_gdk101.ino #define D_AVG_RAD_DOSE "priemerná dávka žiarenia" -#define D_UNIT_US_H "uSv/h" +#define D_UNIT_US_H "µSv/h" #endif // _LANGUAGE_SK_SK_H_ diff --git a/tasmota/language/sv_SE.h b/tasmota/language/sv_SE.h index 1881739c6..2874e4f7f 100644 --- a/tasmota/language/sv_SE.h +++ b/tasmota/language/sv_SE.h @@ -1191,6 +1191,6 @@ // xsns_106_gdk101.ino #define D_AVG_RAD_DOSE "genomsnittlig stråldos" -#define D_UNIT_US_H "uSv/h" +#define D_UNIT_US_H "µSv/h" #endif // _LANGUAGE_SV_SE_H_ diff --git a/tasmota/language/tr_TR.h b/tasmota/language/tr_TR.h index 7fecfa418..ed0bfd4f3 100644 --- a/tasmota/language/tr_TR.h +++ b/tasmota/language/tr_TR.h @@ -1191,6 +1191,6 @@ // xsns_106_gdk101.ino #define D_AVG_RAD_DOSE "ortalama radyasyon dozu" -#define D_UNIT_US_H "uSv/h" +#define D_UNIT_US_H "µSv/h" #endif // _LANGUAGE_TR_TR_H_ diff --git a/tasmota/language/uk_UA.h b/tasmota/language/uk_UA.h index 70acfb5b0..6f77a9267 100644 --- a/tasmota/language/uk_UA.h +++ b/tasmota/language/uk_UA.h @@ -1191,6 +1191,6 @@ // xsns_106_gdk101.ino #define D_AVG_RAD_DOSE "середня доза радіації" -#define D_UNIT_US_H "uSv/h" +#define D_UNIT_US_H "µSv/h" #endif // _LANGUAGE_UK_UA_H_ diff --git a/tasmota/language/vi_VN.h b/tasmota/language/vi_VN.h index 9a0c740c4..8dede81a6 100644 --- a/tasmota/language/vi_VN.h +++ b/tasmota/language/vi_VN.h @@ -1191,6 +1191,6 @@ // xsns_106_gdk101.ino #define D_AVG_RAD_DOSE "liều bức xạ trung bình" -#define D_UNIT_US_H "uSv/h" +#define D_UNIT_US_H "µSv/h" #endif // _LANGUAGE_VI_VN_H_ diff --git a/tasmota/language/zh_CN.h b/tasmota/language/zh_CN.h index f32ab17bd..4dac8796f 100644 --- a/tasmota/language/zh_CN.h +++ b/tasmota/language/zh_CN.h @@ -1191,6 +1191,6 @@ // xsns_106_gdk101.ino #define D_AVG_RAD_DOSE "平均辐射剂量" -#define D_UNIT_US_H "uSv/h" +#define D_UNIT_US_H "µSv/h" #endif // _LANGUAGE_ZH_CN_H_ diff --git a/tasmota/language/zh_TW.h b/tasmota/language/zh_TW.h index d34686626..6e3689ab4 100644 --- a/tasmota/language/zh_TW.h +++ b/tasmota/language/zh_TW.h @@ -1191,6 +1191,6 @@ // xsns_106_gdk101.ino #define D_AVG_RAD_DOSE "平均輻射劑量" -#define D_UNIT_US_H "uSv/h" +#define D_UNIT_US_H "µSv/h" #endif // _LANGUAGE_ZH_TW_H_ From 112c254d54a535378ccca0beb46ed8dfb91d0ccf Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Fri, 21 Apr 2023 16:56:27 +0200 Subject: [PATCH 019/289] refac firmware-metrics (#18466) * refac firmware-metrics * rm debugging print * fix esp8266 --- pio-tools/gzip-firmware.py | 4 ---- pio-tools/metrics-firmware.py | 9 +++++++++ pio-tools/name-firmware.py | 5 ++++- platformio.ini | 1 + 4 files changed, 14 insertions(+), 5 deletions(-) create mode 100644 pio-tools/metrics-firmware.py diff --git a/pio-tools/gzip-firmware.py b/pio-tools/gzip-firmware.py index 19c323300..e03418262 100644 --- a/pio-tools/gzip-firmware.py +++ b/pio-tools/gzip-firmware.py @@ -20,10 +20,6 @@ def map_gzip(source, target, env): with map_file.open("rb") as fp: with gzip.open(gzip_file, "wb", compresslevel=9) as f: shutil.copyfileobj(fp, f) - if env["PIOPLATFORM"] == "espressif32": - # Print Metrics for firmware using "map" file - import tasmota_metrics - env.Execute("$PYTHONEXE -m tasmota_metrics " + str(map_file.resolve())) # remove map file if map_file.is_file(): diff --git a/pio-tools/metrics-firmware.py b/pio-tools/metrics-firmware.py new file mode 100644 index 000000000..d9fb7a9ad --- /dev/null +++ b/pio-tools/metrics-firmware.py @@ -0,0 +1,9 @@ +Import("env") + +import tasmotapiolib +def firm_metrics(source, target, env): + if env["PIOPLATFORM"] == "espressif32": + import tasmota_metrics + env.Execute("$PYTHONEXE -m tasmota_metrics " + str(tasmotapiolib.get_source_map_path(env).resolve())) + +env.AddPostAction("$BUILD_DIR/${PROGNAME}.bin",firm_metrics) \ No newline at end of file diff --git a/pio-tools/name-firmware.py b/pio-tools/name-firmware.py index 47366990d..6162500da 100644 --- a/pio-tools/name-firmware.py +++ b/pio-tools/name-firmware.py @@ -25,7 +25,10 @@ def bin_map_copy(source, target, env): # copy firmware.bin and map to final destination shutil.copy(firsttarget, bin_file) - shutil.move(tasmotapiolib.get_source_map_path(env), map_file) if env["PIOPLATFORM"] == "espressif32": + # the map file is needed later for fimrmware-metrics.py + shutil.copy(tasmotapiolib.get_source_map_path(env), map_file) shutil.copy(factory, one_bin_file) + else: + shutil.move(tasmotapiolib.get_source_map_path(env), map_file) env.AddPostAction("$BUILD_DIR/${PROGNAME}.bin", bin_map_copy) diff --git a/platformio.ini b/platformio.ini index b04fef1ab..83d80aa24 100644 --- a/platformio.ini +++ b/platformio.ini @@ -73,6 +73,7 @@ extra_scripts = pre:pio-tools/pre_source_dir.py [esp_defaults] extra_scripts = post:pio-tools/name-firmware.py post:pio-tools/gzip-firmware.py + post:pio-tools/metrics-firmware.py post:pio-tools/custom_target.py ; post:pio-tools/obj-dump.py ${scripts_defaults.extra_scripts} From a6aa8924eab0fb1e418afe295d07c6933ab8de1a Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Fri, 21 Apr 2023 18:11:50 +0200 Subject: [PATCH 020/289] Platform version 2023.04.03 (#18467) --- platformio_tasmota32.ini | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platformio_tasmota32.ini b/platformio_tasmota32.ini index cec17d738..9582375b2 100644 --- a/platformio_tasmota32.ini +++ b/platformio_tasmota32.ini @@ -42,7 +42,7 @@ extra_scripts = pre:pio-tools/add_c_flags.py ${esp_defaults.extra_scripts} [core32] -platform = https://github.com/tasmota/platform-espressif32/releases/download/2023.04.01/platform-espressif32.zip +platform = https://github.com/tasmota/platform-espressif32/releases/download/2023.04.02/platform-espressif32.zip platform_packages = build_unflags = ${esp32_defaults.build_unflags} build_flags = ${esp32_defaults.build_flags} From 01ba3d28cd881f39ca6ec9e00406e90b6367534b Mon Sep 17 00:00:00 2001 From: s-hadinger <49731213+s-hadinger@users.noreply.github.com> Date: Fri, 21 Apr 2023 21:59:45 +0200 Subject: [PATCH 021/289] Berry apply fixes from upstream (#18470) * Berry apply fixes from upstream * Fix --- lib/libesp32/berry/default/be_modtab.c | 2 +- lib/libesp32/berry/src/be_constobj.h | 4 +- lib/libesp32/berry/src/be_debug.c | 7 +- lib/libesp32/berry/src/be_jsonlib.c | 16 + lib/libesp32/berry/src/be_module.c | 20 +- lib/libesp32/berry/src/be_module.h | 2 +- lib/libesp32/berry/src/be_vm.c | 81 +- lib/libesp32/berry/src/berry.h | 2170 +++++++++++++++++++++--- 8 files changed, 2042 insertions(+), 260 deletions(-) diff --git a/lib/libesp32/berry/default/be_modtab.c b/lib/libesp32/berry/default/be_modtab.c index d85c26177..5051dd948 100644 --- a/lib/libesp32/berry/default/be_modtab.c +++ b/lib/libesp32/berry/default/be_modtab.c @@ -75,7 +75,7 @@ be_extern_native_module(matter); /* user-defined modules declare end */ /* module list declaration */ -BERRY_LOCAL const bntvmodule* const be_module_table[] = { +BERRY_LOCAL const bntvmodule_t* const be_module_table[] = { /* default modules register */ #if BE_USE_STRING_MODULE &be_native_module(string), diff --git a/lib/libesp32/berry/src/be_constobj.h b/lib/libesp32/berry/src/be_constobj.h index 23b41bea6..3ef55eebd 100644 --- a/lib/libesp32/berry/src/be_constobj.h +++ b/lib/libesp32/berry/src/be_constobj.h @@ -196,7 +196,7 @@ const bvector _name = { \ } #define be_define_const_native_module(_module) \ -const bntvmodule be_native_module(_module) = { \ +const bntvmodule_t be_native_module(_module) = { \ .name = #_module, \ .attrs = NULL, \ .size = 0, \ @@ -422,7 +422,7 @@ const bvector _name = { \ } #define be_define_const_native_module(_module) \ -const bntvmodule be_native_module_##_module = { \ +const bntvmodule_t be_native_module_##_module = { \ #_module, \ 0, 0, \ (bmodule*)&(m_lib##_module) \ diff --git a/lib/libesp32/berry/src/be_debug.c b/lib/libesp32/berry/src/be_debug.c index 2432abaf0..4cd44bf61 100644 --- a/lib/libesp32/berry/src/be_debug.c +++ b/lib/libesp32/berry/src/be_debug.c @@ -49,7 +49,7 @@ static const char* opc2str(bopcode op) void be_print_inst(binstruction ins, int pc, void* fout) { - char __lbuf[INST_BUF_SIZE]; + char __lbuf[INST_BUF_SIZE + 1], __lbuf_tmp[INST_BUF_SIZE]; bopcode op = IGET_OP(ins); logbuf(" %.4X ", pc); @@ -137,7 +137,8 @@ void be_print_inst(binstruction ins, int pc, void* fout) logbuf("%s", opc2str(op)); break; } - logbuf("%s\n", __lbuf); + memcpy(__lbuf_tmp, __lbuf, strlen(__lbuf)); + logbuf("%s\n", __lbuf_tmp); if (fout) { be_fwrite(fout, __lbuf, strlen(__lbuf)); } else { @@ -253,7 +254,7 @@ void be_tracestack(bvm *vm) static void hook_callnative(bvm *vm, int mask) { - bhookinfo info; + bhookinfo_t info; int top = be_top(vm); bcallframe *cf = vm->cf; bclosure *cl = var_toobj(cf->func); diff --git a/lib/libesp32/berry/src/be_jsonlib.c b/lib/libesp32/berry/src/be_jsonlib.c index 9550d642a..db2b20677 100644 --- a/lib/libesp32/berry/src/be_jsonlib.c +++ b/lib/libesp32/berry/src/be_jsonlib.c @@ -202,6 +202,7 @@ static const char* parser_string(bvm *vm, const char *json) static const char* parser_field(bvm *vm, const char *json) { + be_stack_require(vm, 2 + BE_STACK_FREE_MIN); if (json && *json == '"') { json = parser_string(vm, json); if (json) { @@ -368,6 +369,11 @@ static const char* parser_number(bvm *vm, const char *json) static const char* parser_value(bvm *vm, const char *json) { json = skip_space(json); + /* + Each value will push at least one thig to the stack, so we must ensure it's big enough. + We need to take special care to extend the stack in values which have variable length (arrays and objects) + */ + be_stack_require(vm, 1 + BE_STACK_FREE_MIN); switch (*json) { case '{': /* object */ return parser_object(vm, json); @@ -404,6 +410,7 @@ static int m_json_load(bvm *vm) static void make_indent(bvm *vm, int stridx, int indent) { if (indent) { + be_stack_require(vm, 1 + BE_STACK_FREE_MIN); char buf[MAX_INDENT * INDENT_WIDTH + 1]; indent = (indent < MAX_INDENT ? indent : MAX_INDENT) * INDENT_WIDTH; memset(buf, INDENT_CHAR, indent); @@ -417,6 +424,7 @@ static void make_indent(bvm *vm, int stridx, int indent) void string_dump(bvm *vm, int index) { + be_stack_require(vm, 1 + BE_STACK_FREE_MIN); be_tostring(vm, index); /* convert value to string */ be_toescape(vm, index, 'u'); be_pushvalue(vm, index); @@ -424,11 +432,14 @@ void string_dump(bvm *vm, int index) static void object_dump(bvm *vm, int *indent, int idx, int fmt) { + + be_stack_require(vm, 3 + BE_STACK_FREE_MIN); /* 3 pushes outside the loop */ be_getmember(vm, idx, ".p"); be_pushstring(vm, fmt ? "{\n" : "{"); be_pushiter(vm, -2); /* map iterator use 1 register */ *indent += fmt; while (be_iter_hasnext(vm, -3)) { + be_stack_require(vm, 3 + BE_STACK_FREE_MIN); /* 3 pushes inside the loop */ make_indent(vm, -2, fmt ? *indent : 0); be_iter_next(vm, -3); /* key.tostring() */ @@ -463,6 +474,7 @@ static void object_dump(bvm *vm, int *indent, int idx, int fmt) static void array_dump(bvm *vm, int *indent, int idx, int fmt) { + be_stack_require(vm, 3 + BE_STACK_FREE_MIN); be_getmember(vm, idx, ".p"); be_pushstring(vm, fmt ? "[\n" : "["); be_pushiter(vm, -2); @@ -473,6 +485,7 @@ static void array_dump(bvm *vm, int *indent, int idx, int fmt) value_dump(vm, indent, -1, fmt); be_strconcat(vm, -4); be_pop(vm, 2); + be_stack_require(vm, 1 + BE_STACK_FREE_MIN); if (be_iter_hasnext(vm, -3)) { be_pushstring(vm, fmt ? ",\n" : ","); be_strconcat(vm, -3); @@ -494,13 +507,16 @@ static void array_dump(bvm *vm, int *indent, int idx, int fmt) static void value_dump(bvm *vm, int *indent, int idx, int fmt) { + // be_stack_require(vm, 1 + BE_STACK_FREE_MIN); if (is_object(vm, "map", idx)) { /* convert to json object */ object_dump(vm, indent, idx, fmt); } else if (is_object(vm, "list", idx)) { /* convert to json array */ array_dump(vm, indent, idx, fmt); } else if (be_isnil(vm, idx)) { /* convert to json null */ + be_stack_require(vm, 1 + BE_STACK_FREE_MIN); be_pushstring(vm, "null"); } else if (be_isnumber(vm, idx) || be_isbool(vm, idx)) { /* convert to json number and boolean */ + be_stack_require(vm, 1 + BE_STACK_FREE_MIN); be_tostring(vm, idx); be_pushvalue(vm, idx); /* push to top */ } else { /* convert to string */ diff --git a/lib/libesp32/berry/src/be_module.c b/lib/libesp32/berry/src/be_module.c index 2d5e826b6..ff5503011 100644 --- a/lib/libesp32/berry/src/be_module.c +++ b/lib/libesp32/berry/src/be_module.c @@ -36,14 +36,14 @@ #endif #endif -extern BERRY_LOCAL const bntvmodule* const be_module_table[]; +extern BERRY_LOCAL const bntvmodule_t* const be_module_table[]; -static bmodule* native_module(bvm *vm, const bntvmodule *nm, bvalue *dst); +static bmodule* native_module(bvm *vm, const bntvmodule_t *nm, bvalue *dst); -static const bntvmodule* find_native(bstring *path) +static const bntvmodule_t* find_native(bstring *path) { - const bntvmodule *module; - const bntvmodule* const *node = be_module_table; + const bntvmodule_t *module; + const bntvmodule_t* const *node = be_module_table; for (; (module = *node) != NULL; ++node) { if (!strcmp(module->name, str(path))) { return module; @@ -52,11 +52,11 @@ static const bntvmodule* find_native(bstring *path) return NULL; } -static void insert_attrs(bvm *vm, bmap *table, const bntvmodule *nm) +static void insert_attrs(bvm *vm, bmap *table, const bntvmodule_t *nm) { size_t i; for (i = 0; i < nm->size; ++i) { - const bntvmodobj *node = nm->attrs + i; + const bntvmodobj_t *node = nm->attrs + i; bstring *name = be_newstr(vm, node->name); bvalue *v = be_map_insertstr(vm, table, name, NULL); be_assert(node->type <= BE_CMODULE); @@ -88,7 +88,7 @@ static void insert_attrs(bvm *vm, bmap *table, const bntvmodule *nm) } } -static bmodule* new_module(bvm *vm, const bntvmodule *nm) +static bmodule* new_module(bvm *vm, const bntvmodule_t *nm) { bgcobject *gco = be_gcnew(vm, BE_MODULE, bmodule); bmodule *obj = cast_module(gco); @@ -105,7 +105,7 @@ static bmodule* new_module(bvm *vm, const bntvmodule *nm) return obj; } -static bmodule* native_module(bvm *vm, const bntvmodule *nm, bvalue *dst) +static bmodule* native_module(bvm *vm, const bntvmodule_t *nm, bvalue *dst) { if (nm) { bmodule *obj; @@ -221,7 +221,7 @@ static int load_package(bvm *vm, bstring *path) static int load_native(bvm *vm, bstring *path) { - const bntvmodule *nm = find_native(path); + const bntvmodule_t *nm = find_native(path); bmodule *mod = native_module(vm, nm, NULL); if (mod != NULL) { /* the pointer vm->top may be changed */ diff --git a/lib/libesp32/berry/src/be_module.h b/lib/libesp32/berry/src/be_module.h index 26760660f..0d6c76e4b 100644 --- a/lib/libesp32/berry/src/be_module.h +++ b/lib/libesp32/berry/src/be_module.h @@ -16,7 +16,7 @@ typedef struct bmodule { bcommon_header; bmap *table; union infodata { - const bntvmodule *native; + const bntvmodule_t *native; const char *name; const bstring *sname; #ifdef __cplusplus diff --git a/lib/libesp32/berry/src/be_vm.c b/lib/libesp32/berry/src/be_vm.c index ffc55977a..eb2b6ef63 100644 --- a/lib/libesp32/berry/src/be_vm.c +++ b/lib/libesp32/berry/src/be_vm.c @@ -109,31 +109,54 @@ } \ return res -#define relop_rule(op) \ - bbool res; \ - if (var_isint(a) && var_isint(b)) { \ - res = ibinop(op, a, b); \ - } else if (var_isnumber(a) && var_isnumber(b)) { \ - /* res = var2real(a) op var2real(b); */ \ - union bvaldata x, y; /* TASMOTA workaround for ESP32 rev0 bug */ \ - x.i = a->v.i;\ - if (var_isint(a)) { x.r = (breal) x.i; }\ - y.i = b->v.i;\ - if (var_isint(b)) { y.r = (breal) y.i; }\ - res = x.r op y.r; \ - } else if (var_isstr(a) && var_isstr(b)) { \ - bstring *s1 = var_tostr(a), *s2 = var_tostr(b); \ - res = be_strcmp(s1, s2) op 0; \ - } else if (var_isinstance(a)) { \ - binstance *obj = var_toobj(a); \ - object_binop(vm, #op, *a, *b); \ - check_bool(vm, obj, #op); \ - res = var_tobool(vm->top); \ - } else { \ - binop_error(vm, #op, a, b); \ - res = bfalse; /* will not be executed */ \ - } \ - return res +/* when running on ESP32 in IRAM, there is a bug in early chip revision */ +#ifdef ESP32 + #define relop_rule(op) \ + bbool res; \ + if (var_isint(a) && var_isint(b)) { \ + res = ibinop(op, a, b); \ + } else if (var_isnumber(a) && var_isnumber(b)) { \ + /* res = var2real(a) op var2real(b); */ \ + union bvaldata x, y; /* TASMOTA workaround for ESP32 rev0 bug */ \ + x.i = a->v.i;\ + if (var_isint(a)) { x.r = (breal) x.i; }\ + y.i = b->v.i;\ + if (var_isint(b)) { y.r = (breal) y.i; }\ + res = x.r op y.r; \ + } else if (var_isstr(a) && var_isstr(b)) { \ + bstring *s1 = var_tostr(a), *s2 = var_tostr(b); \ + res = be_strcmp(s1, s2) op 0; \ + } else if (var_isinstance(a)) { \ + binstance *obj = var_toobj(a); \ + object_binop(vm, #op, *a, *b); \ + check_bool(vm, obj, #op); \ + res = var_tobool(vm->top); \ + } else { \ + binop_error(vm, #op, a, b); \ + res = bfalse; /* will not be executed */ \ + } \ + return res +#else // ESP32 + #define relop_rule(op) \ + bbool res; \ + if (var_isint(a) && var_isint(b)) { \ + res = ibinop(op, a, b); \ + } else if (var_isnumber(a) && var_isnumber(b)) { \ + res = var2real(a) op var2real(b); \ + } else if (var_isstr(a) && var_isstr(b)) { \ + bstring *s1 = var_tostr(a), *s2 = var_tostr(b); \ + res = be_strcmp(s1, s2) op 0; \ + } else if (var_isinstance(a)) { \ + binstance *obj = var_toobj(a); \ + object_binop(vm, #op, *a, *b); \ + check_bool(vm, obj, #op); \ + res = var_tobool(vm->top); \ + } else { \ + binop_error(vm, #op, a, b); \ + res = bfalse; /* will not be executed */ \ + } \ + return res +#endif // ESP32 #define bitwise_block(op) \ bvalue *dst = RA(), *a = RKB(), *b = RKC(); \ @@ -264,7 +287,6 @@ static bbool obj2bool(bvm *vm, bvalue *var) binstance *obj = var_toobj(var); bstring *tobool = str_literal(vm, "tobool"); /* get operator method */ - // TODO what if `tobool` is static int type = be_instance_member(vm, obj, tobool, vm->top); if (type != BE_NONE && type != BE_NIL) { vm->top[1] = *var; /* move self to argv[0] */ @@ -357,7 +379,6 @@ static bbool object_eqop(bvm *vm, bbool isself = var_isinstance(b) && o == var_toobj(b); /* first, try to call the overloaded operator of the object */ int type = be_instance_member(vm, o, be_newstr(vm, op), vm->top); - // TODO check that method is not static if (basetype(type) == BE_FUNCTION) { /* call method */ bvalue *top = vm->top; top[1] = self; /* move self to argv[0] */ @@ -615,13 +636,17 @@ newframe: /* a new call frame */ if (var_isint(a) && var_isint(b)) { var_setint(dst, ibinop(+, a, b)); } else if (var_isnumber(a) && var_isnumber(b)) { +#ifdef ESP32 /* when running on ESP32 in IRAM, there is a bug in early chip revision */ union bvaldata x, y; // TASMOTA workaround for ESP32 rev0 bug x.i = a->v.i; if (var_isint(a)) { x.r = (breal) x.i; } y.i = b->v.i; if (var_isint(b)) { y.r = (breal) y.i; } - // breal x = var2real(a), y = var2real(b); var_setreal(dst, x.r + y.r); +#else // ESP32 + breal x = var2real(a), y = var2real(b); + var_setreal(dst, x + y); +#endif // ESP32 } else if (var_isstr(a) && var_isstr(b)) { /* strcat */ bstring *s = be_strcat(vm, var_tostr(a), var_tostr(b)); reg = vm->reg; diff --git a/lib/libesp32/berry/src/berry.h b/lib/libesp32/berry/src/berry.h index 70ab0f87c..bae47a590 100644 --- a/lib/libesp32/berry/src/berry.h +++ b/lib/libesp32/berry/src/berry.h @@ -1,10 +1,11 @@ -/******************************************************************** -** Copyright (c) 2018-2020 Guan Wenliang -** This file is part of the Berry default interpreter. -** skiars@qq.com, https://github.com/Skiars/berry -** See Copyright Notice in the LICENSE file or at -** https://github.com/Skiars/berry/blob/master/LICENSE -********************************************************************/ +/** + * @file berry.h + * @brief Main berry entry API + * @details This file is part of the Berry default interpreter. + * @author skiars@qq.com, https://github.com/Skiars/berry + * @copyright (c) 2018-2022 Guan Wenliang MIT License (https://github.com/Skiars/berry/blob/master/LICENSE) + */ + #ifndef BERRY_H #define BERRY_H @@ -17,74 +18,96 @@ extern "C" { #endif -/* do not modify the version number! */ +/** + * @def BERRY_VERSION + * @brief do not modify the version number! + * + */ #define BERRY_VERSION "1.1.0" #if BE_STACK_TOTAL_MAX < BE_STACK_FREE_MIN * 2 #error "The value of the macro BE_STACK_TOTAL_MAX is too small." #endif -/* basic type definition */ #if BE_INTGER_TYPE == 0 - #define BE_INTEGER int - #define BE_INT_FMTLEN "" + #define BE_INTEGER int /**< BE_INTEGER */ + #define BE_INT_FMTLEN "" /**< BE_INT_FMTLEN */ #elif BE_INTGER_TYPE == 1 - #define BE_INTEGER long - #define BE_INT_FMTLEN "l" + #define BE_INTEGER long /**< BE_INTEGER */ + #define BE_INT_FMTLEN "l" /**< BE_INT_FMTLEN */ #elif BE_INTGER_TYPE == 2 - #ifdef _WIN32 - #define BE_INTEGER __int64 - #define BE_INT_FMTLEN "I64" +#ifdef _WIN32 + #define BE_INTEGER __int64 /**< BE_INTEGER */ + #define BE_INT_FMTLEN "I64" /**< BE_INT_FMTLEN */ #else - #define BE_INTEGER long long - #define BE_INT_FMTLEN "ll" - #endif +#define BE_INTEGER long long /**< BE_INTEGER */ +#define BE_INT_FMTLEN "ll" /**< BE_INT_FMTLEN*/ +#endif #else #error "Unsupported integer type for `bint`." #endif -#define BE_INT_FORMAT "%" BE_INT_FMTLEN "d" +#define BE_INT_FORMAT "%" BE_INT_FMTLEN "d" /**< BE_INT_FORMAT */ -typedef uint8_t bbyte; -typedef BE_INTEGER bint; +typedef uint8_t bbyte; /**< bbyte */ +typedef BE_INTEGER bint; /**< bint */ #if BE_USE_SINGLE_FLOAT != 0 - typedef float breal; + typedef float breal; /**< breal */ #else - typedef double breal; +typedef double breal; /**< breal */ #endif -/* boolean values definition */ + + #ifndef __cplusplus - #define bbool _Bool - #define bfalse 0 - #define btrue 1 +#define bbool _Bool /**< bbool */ +#define bfalse 0 /**< bfalse */ +#define btrue 1 /**< btrue */ #else - #define bbool bool - #define bfalse false - #define btrue true + #define bbool bool /**< bbool */ + #define bfalse false /**< bfalse */ + #define btrue true /**< btrue */ #endif -/* error code definition */ +/** + * @enum berrorcode + * @brief error code definition + * + */ enum berrorcode { - BE_OK = 0, - BE_EXIT, - BE_MALLOC_FAIL, - BE_EXCEPTION, - BE_SYNTAX_ERROR, - BE_EXEC_ERROR, - BE_IO_ERROR + BE_OK = 0, /**< BE_OK */ + BE_EXIT, /**< BE_EXIT */ + BE_MALLOC_FAIL, /**< BE_MALLOC_FAIL */ + BE_EXCEPTION, /**< BE_EXCEPTION */ + BE_SYNTAX_ERROR, /**< BE_SYNTAX_ERROR */ + BE_EXEC_ERROR, /**< BE_EXEC_ERROR */ + BE_IO_ERROR /**< BE_IO_ERROR */ }; -/* native-module member type specifier */ -#define BE_CNIL 0 -#define BE_CINT 1 -#define BE_CREAL 2 -#define BE_CBOOL 3 -#define BE_CFUNCTION 4 -#define BE_CSTRING 5 -#define BE_CMODULE 6 +/** + * @{ \name native-module member type specifier. + */ +/** + * \brief native-module member type specifier. + * + */ +#define BE_CNIL 0 /**< BE_CNIL */ +#define BE_CINT 1 /**< BE_CINT */ +#define BE_CREAL 2 /**< BE_CREAL */ +#define BE_CBOOL 3 /**< BE_CBOOL */ +#define BE_CFUNCTION 4 /**< BE_CFUNCTION */ +#define BE_CSTRING 5 /**< BE_CSTRING */ +#define BE_CMODULE 6 /**< BE_CMODULE */ +/** + * @} + */ -/* API function mark */ + +/** + * @def BERRY_API + * @brief API function mark + * + */ #if defined(_WIN32) || defined(__CYGWIN__) /* in Windows */ #if defined(BERRY_MODULE) /* berry extension module */ #define BERRY_API __declspec(dllimport) @@ -95,150 +118,290 @@ enum berrorcode { #define BERRY_API extern #endif -/* only linux */ +/** + * @{ \name only linux. + */ +/** + * \brief only linux + * + */ #if defined(_WIN32) || defined(__CYGWIN__) /* in Windows */ - #define BERRY_LOCAL + #define BERRY_LOCAL /**< BERRY_LOCAL */ #elif defined(__GNUC__) /* in GCC */ - #define BERRY_LOCAL __attribute__ ((visibility ("hidden"))) +#define BERRY_LOCAL __attribute__ ((visibility ("hidden"))) /**< BERRY_LOCAL */ #else /* other platforms */ - #define BERRY_LOCAL + #define BERRY_LOCAL /**< BERRY_LOCAL */ #endif #ifdef __cplusplus #ifdef __cpp_constexpr - #define BE_CONSTEXPR constexpr + #define BE_CONSTEXPR constexpr /**< BE_CONSTEXPR */ #else - #define BE_CONSTEXPR + #define BE_CONSTEXPR /**< BE_CONSTEXPR */ #endif #endif #ifdef __cplusplus -#define BE_EXPORT_VARIABLE extern "C" +#define BE_EXPORT_VARIABLE extern "C" /**< BE_EXPORT_VARIABLE */ #else -#define BE_EXPORT_VARIABLE +#define BE_EXPORT_VARIABLE /**< BE_EXPORT_VARIABLE */ #endif +/** + * @} + */ -typedef struct bvm bvm; /* virtual machine structure */ -typedef int (*bntvfunc)(bvm*); /* native function pointer */ +/** + * @brief virtual machine structure + */ +typedef struct bvm bvm; + +typedef int (*bntvfunc)(bvm*); /**< native function pointer */ + +/** + * @struct bclass + * @brief bclass + */ struct bclass; -/* native function information */ +/** + * @struct bnfuncinfo + * @brief native function information + * + */ typedef struct { - const char *name; - bntvfunc function; + const char *name; /**< name */ + bntvfunc function; /**< function */ } bnfuncinfo; -/* native module object node */ +/** + * @struct bntvmodobj + * @brief bntvmodobj + * + */ typedef struct bntvmodobj { - const char *name; - int type; - union value { - bint i; - breal r; - bbool b; - bntvfunc f; - const char *s; - const void *o; + const char *name; /**< name */ + int type; /**< type */ + union value /**< value */ + { + bint i; /**< i */ + breal r; /**< r */ + bbool b; /**< b */ + bntvfunc f; /**< f */ + const char *s; /**< s */ + const void *o; /**< o */ #ifdef __cplusplus - BE_CONSTEXPR value(bint v) : i(v) {} - BE_CONSTEXPR value(breal v) : r(v) {} - BE_CONSTEXPR value(bbool v) : b(v) {} - BE_CONSTEXPR value(bntvfunc v) : f(v) {} - BE_CONSTEXPR value(const char *v) : s(v) {} - BE_CONSTEXPR value(const void *v) : o(v) {} + BE_CONSTEXPR value(bint v) : i(v) {} /**< i */ + BE_CONSTEXPR value(breal v) : r(v) {} /**< r */ + BE_CONSTEXPR value(bbool v) : b(v) {} /**< b */ + BE_CONSTEXPR value(bntvfunc v) : f(v) {} /**< f */ + BE_CONSTEXPR value(const char *v) : s(v) {} /**< s */ + BE_CONSTEXPR value(const void *v) : o(v) {} /**< o */ #endif - } u; + } u; /**< u */ #ifdef __cplusplus BE_CONSTEXPR bntvmodobj(const char *name) : - name(name), type(BE_CNIL), u(bint(0)) {} + name(name), type(BE_CNIL), u(bint(0)) {} /**< bntvmodobj */ BE_CONSTEXPR bntvmodobj(const char *name, bint v) : - name(name), type(BE_CINT), u(v) {} + name(name), type(BE_CINT), u(v) {} /**< bntvmodobj */ BE_CONSTEXPR bntvmodobj(const char *name, breal v) : - name(name), type(BE_CREAL), u(v) {} + name(name), type(BE_CREAL), u(v) {} /**< bntvmodobj */ BE_CONSTEXPR bntvmodobj(const char *name, bbool v) : - name(name), type(BE_CBOOL), u(v) {} + name(name), type(BE_CBOOL), u(v) {} /**< bntvmodobj */ BE_CONSTEXPR bntvmodobj(const char *name, bntvfunc v) : - name(name), type(BE_CFUNCTION), u(v) {} + name(name), type(BE_CFUNCTION), u(v) {} /**< bntvmodobj */ BE_CONSTEXPR bntvmodobj(const char *name, const char *v) : - name(name), type(BE_CSTRING), u(v) {} + name(name), type(BE_CSTRING), u(v) {} /**< bntvmodobj */ BE_CONSTEXPR bntvmodobj(const char *name, int _tpye, const void *v) : - name(name), type(_tpye), u(v) {} + name(name), type(_tpye), u(v) {} /**< bntvmodobj */ #endif -} bntvmodobj; +} bntvmodobj_t; /**< bntvmodobj_t */ -/* native module object */ +/** + * @struct bntvmodule + * @brief bntvmodule + * + */ typedef struct bntvmodule { - const char *name; /* native module name */ - const bntvmodobj *attrs; /* native module attributes */ - size_t size; /* native module attribute count */ - const struct bmodule *module; /* const module object */ -} bntvmodule; + const char *name; /**< native module name */ + const bntvmodobj_t *attrs; /**< native module attributes */ + size_t size; /**< native module attribute count */ + const struct bmodule *module; /**< const module object */ +} bntvmodule_t; /**< bntvmodule_t */ -/* native class object */ -struct bclass; /* we need only the pointer to `bclass` here */ +/** + * @struct bclass + * @brief native class object + */ +struct bclass; + +/** + * @brief we need only the pointer to `bclass` here + */ typedef const struct bclass *bclass_ptr; -typedef bclass_ptr bclass_array[]; /* array of bclass* pointers, NULL terminated */ -/* native module node definition macro */ +/** + * @brief array of bclass* pointers, NULL terminated + */ +typedef bclass_ptr bclass_array[]; + +/** + * @def be_native_module_nil + * @brief native module node definition macro + * + */ #ifndef __cplusplus #define be_native_module_nil(_name) \ { .name = (_name), .type = BE_CNIL, .u.i = 0 } +/** + * @def be_native_module_int + * @brief be_native_module_int + * + */ #define be_native_module_int(_name, _v) \ { .name = (_name), .type = BE_CINT, .u.i = (bint)(_v) } +/** + * @def be_native_module_real + * @brief be_native_module_real + * + */ #define be_native_module_real(_name, _v) \ { .name = (_name), .type = BE_CREAL, .u.r = (breal)(_v) } +/** + * @def be_native_module_bool + * @brief be_native_module_bool + * + */ #define be_native_module_bool(_name, _b) \ { .name = (_name), .type = BE_CBOOL, .u.b = (bbool)(_b) } +/** + * @def be_native_module_function + * @brief be_native_module_function + * + */ #define be_native_module_function(_name, _f) \ { .name = (_name), .type = BE_CFUNCTION, .u.f = (_f) } +/** + * @def be_native_module_str + * @brief be_native_module_str + * + */ #define be_native_module_str(_name, _s) \ { .name = (_name), .type = BE_CSTRING, .u.s = (_s) } +/** + * @def be_native_module_module + * @brief be_native_module_module + * + */ #define be_native_module_module(_name, _m) \ { .name = (_name), .type = BE_CMODULE, .u.o = &(_m) } #else + +/** + * @def be_native_module_attr_table + * @brief be_native_module_attr_table + * + */ #define be_native_module_nil(_name) \ bntvmodobj(_name) +/** + * @def be_native_module_attr_table + * @brief be_native_module_attr_table + * + */ #define be_native_module_int(_name, _v) \ bntvmodobj(_name, bint(_v)) +/** + * @def be_native_module_attr_table + * @brief be_native_module_attr_table + * + */ #define be_native_module_real(_name, _v) \ bntvmodobj(_name, breal(_v)) +/** + * @def be_native_module_attr_table + * @brief be_native_module_attr_table + * + */ #define be_native_module_bool(_name, _b) \ bntvmodobj(_name, bbool(_b)) +/** + * @def be_native_module_attr_table + * @brief be_native_module_attr_table + * + */ #define be_native_module_function(_name, _f) \ bntvmodobj(_name, _f) +/** + * @def be_native_module_attr_table + * @brief be_native_module_attr_table + * + */ #define be_native_module_str(_name, _s) \ bntvmodobj(_name, _s) +/** + * @def be_native_module_attr_table + * @brief be_native_module_attr_table + * + */ #define be_native_module_module(_name, _m) \ bntvmodobj(_name, BE_CMODULE, &(_m)) #endif +/** + * @def be_native_module_attr_table + * @brief be_native_module_attr_table + * + */ #define be_native_module_attr_table(name) \ static const bntvmodobj name##_attrs[] = +/** + * @def be_native_module + * @brief be_native_module + * + */ #define be_native_module(name) be_native_module_##name + +/** + * @def be_native_class + * @brief be_native_class + * + */ #define be_native_class(name) be_class_##name -/* native module declaration macro */ +/** + * @def be_extern_native_module + * @brief native module declaration macro + * + */ #define be_extern_native_module(name) \ - extern const bntvmodule be_native_module(name) + extern const bntvmodule_t be_native_module(name) -/* native class declaration macro */ +/** + * @def be_extern_native_class + * @brief native class declaration macro + * + */ #define be_extern_native_class(name) \ extern const struct bclass be_native_class(name) -/* native module definition macro */ +/** + * @def be_define_native_module + * @brief native module definition macro + * + */ #ifndef __cplusplus #define be_define_native_module(_name, _init) \ const bntvmodule be_native_module(_name) = { \ @@ -259,8 +422,12 @@ typedef bclass_ptr bclass_array[]; /* array of bclass* pointers, NU } #endif -/* support for solidified berry functions */ -/* native const strings outside of global string hash */ +/** + * @def be_define_local_const_str + * @brief support for solidified berry functions + * native const strings outside of global string hash + * + */ #define be_define_local_const_str(_name, _s, _hash, _len) \ static const bcstring be_local_const_str_##_name = { \ .next = (bgcobject *)NULL, \ @@ -272,7 +439,11 @@ typedef bclass_ptr bclass_array[]; /* array of bclass* pointers, NU .s = _s \ } -/* new version for more compact literals */ +/** + * @def be_nested_const_str + * @brief new version for more compact literals + * + */ #define be_nested_const_str(_s, _hash, _len) \ (bstring*) &(const bcstring) { \ .next = (bgcobject *)NULL, \ @@ -284,312 +455,1881 @@ typedef bclass_ptr bclass_array[]; /* array of bclass* pointers, NU .s = _s \ } +/** + * @def be_local_const_str + * @brief be_local_const_str + * + */ #define be_local_const_str(_name) (bstring*) &be_local_const_str_##_name -/* conditional macro see https://stackoverflow.com/questions/11632219/c-preprocessor-macro-specialisation-based-on-an-argument */ -#define BE_IIF(cond) BE_IIF_ ## cond -#define BE_IIF_0(t, f) f -#define BE_IIF_1(t, f) t +#define BE_IIF(cond) BE_IIF_ ## cond /**< conditional macro see https://stackoverflow.com/questions/11632219/c-preprocessor-macro-specialisation-based-on-an-argument */ +#define BE_IIF_0(t, f) f /**< conditional macro see https://stackoverflow.com/questions/11632219/c-preprocessor-macro-specialisation-based-on-an-argument */ +#define BE_IIF_1(t, f) t /**< conditional macro see https://stackoverflow.com/questions/11632219/c-preprocessor-macro-specialisation-based-on-an-argument */ +/** + * @def be_local_const_upval + * @brief be_local_const_upval + * + */ #if BE_DEBUG_VAR_INFO #define be_local_const_upval(ins, idx) { "", ins, idx } #else #define be_local_const_upval(ins, idx) { ins, idx } #endif -/* conditional block in bproto depending on compilation options */ +/** + * @def PROTO_RUNTIME_BLOCK + * @brief conditional block in bproto depending on compilation options + * + */ #if BE_DEBUG_RUNTIME_INFO - #define PROTO_RUNTIME_BLOCK \ - NULL, /* varinfo */ \ - 0, /* nvarinfo */ + #define PROTO_RUNTIME_BLOCK \ + NULL, /**< varinfo */ \ + 0, /**< nvarinfo */ #else #define PROTO_RUNTIME_BLOCK #endif + +/** + * @def PROTO_VAR_INFO_BLOCK + * @brief PROTO_VAR_INFO_BLOCK + * + */ #if BE_DEBUG_VAR_INFO - #define PROTO_VAR_INFO_BLOCK\ - NULL, /* varinfo */ \ - 0, /* nvarinfo */ + #define PROTO_VAR_INFO_BLOCK \ + NULL, /**< varinfo */ \ + 0, /**< nvarinfo */ #else #define PROTO_VAR_INFO_BLOCK #endif -/* define bproto */ -#define be_define_local_proto(_name, _nstack, _argc, _is_const, _is_subproto, _is_upval) \ +/** + * @def be_define_local_proto + * @brief define bproto + * + */ +#define be_define_local_proto(_name, _nstack, _argc, _is_const, _is_subproto, _is_upval) \ static const bproto _name##_proto = { \ - NULL, /* bgcobject *next */ \ - BE_PROTO, /* type BE_PROTO */ \ - 0x08, /* marked outside of GC */ \ - (_nstack), /* nstack */ \ - BE_IIF(_is_upval)(sizeof(_name##_upvals)/sizeof(bupvaldesc),0),/* nupvals */ \ - (_argc), /* argc */ \ - 0, /* varg */ \ - NULL, /* bgcobject *gray */ \ - BE_IIF(_is_upval)((bupvaldesc*)&_name##_upvals,NULL), /* bupvaldesc *upvals */\ - BE_IIF(_is_const)((bvalue*)&_name##_ktab,NULL), /* ktab */ \ - BE_IIF(_is_subproto)((struct bproto**)&_name##_subproto,NULL),/* bproto **ptab */\ - (binstruction*) &_name##_code, /* code */ \ - be_local_const_str(_name##_str_name), /* name */ \ - sizeof(_name##_code)/sizeof(uint32_t), /* codesize */ \ - BE_IIF(_is_const)(sizeof(_name##_ktab)/sizeof(bvalue),0),/* nconst */ \ - BE_IIF(_is_subproto)(sizeof(_name##_subproto)/sizeof(bproto*),0),/* proto */ \ - be_local_const_str(_name##_str_source), /* source */ \ - PROTO_RUNTIME_BLOCK \ - PROTO_VAR_INFO_BLOCK \ + NULL, /**< bgcobject *next */ \ + BE_PROTO, /**< type BE_PROTO */ \ + 0x08, /**< marked outside of GC */ \ + (_nstack), /**< nstack */ \ + BE_IIF(_is_upval)(sizeof(_name##_upvals)/sizeof(bupvaldesc),0), /**< nupvals */ \ + (_argc), /**< argc */ \ + 0, /**< varg */ \ + NULL, /**< bgcobject *gray */ \ + BE_IIF(_is_upval)((bupvaldesc*)&_name##_upvals,NULL), /**< bupvaldesc *upvals */ \ + BE_IIF(_is_const)((bvalue*)&_name##_ktab,NULL), /**< ktab */ \ + BE_IIF(_is_subproto)((struct bproto**)&_name##_subproto,NULL), /**< bproto **ptab */ \ + (binstruction*) &_name##_code, /**< code */ \ + be_local_const_str(_name##_str_name), /**< name */ \ + sizeof(_name##_code)/sizeof(uint32_t), /**< codesize */ \ + BE_IIF(_is_const)(sizeof(_name##_ktab)/sizeof(bvalue),0), /**< nconst */ \ + BE_IIF(_is_subproto)(sizeof(_name##_subproto)/sizeof(bproto*),0), /**< proto */ \ + be_local_const_str(_name##_str_source), /**< source */ \ + PROTO_RUNTIME_BLOCK /**< */ \ + PROTO_VAR_INFO_BLOCK /**< */ \ } -/* new version for more compact literals */ +/** + * @def be_nested_proto + * @brief new version for more compact literals + * + */ #define be_nested_proto(_nstack, _argc, _varg, _has_upval, _upvals, _has_subproto, _protos, _has_const, _ktab, _fname, _source, _code) \ & (const bproto) { \ - NULL, /* bgcobject *next */ \ - BE_PROTO, /* type BE_PROTO */ \ - 0x08, /* marked outside of GC */ \ - (_nstack), /* nstack */ \ - BE_IIF(_has_upval)(sizeof(*_upvals)/sizeof(bupvaldesc),0), /* nupvals */ \ - (_argc), /* argc */ \ - (_varg), /* varg */ \ - NULL, /* bgcobject *gray */ \ - (bupvaldesc*) _upvals, /* bupvaldesc *upvals */ \ - (bvalue*) _ktab, /* ktab */ \ - (struct bproto**) _protos, /* bproto **ptab */ \ - (binstruction*) _code, /* code */ \ - ((bstring*) _fname), /* name */ \ - sizeof(*_code)/sizeof(binstruction), /* codesize */ \ - BE_IIF(_has_const)(sizeof(*_ktab)/sizeof(bvalue),0), /* nconst */ \ - BE_IIF(_has_subproto)(sizeof(*_protos)/sizeof(bproto*),0), /* proto */ \ - ((bstring*) _source), /* source */ \ - PROTO_RUNTIME_BLOCK \ - PROTO_VAR_INFO_BLOCK \ + NULL, /**< bgcobject *next */ \ + BE_PROTO, /**< type BE_PROTO */ \ + 0x08, /**< marked outside of GC */ \ + (_nstack), /**< nstack */ \ + BE_IIF(_has_upval)(sizeof(*_upvals)/sizeof(bupvaldesc),0), /**< nupvals */ \ + (_argc), /**< argc */ \ + (_varg), /**< varg */ \ + NULL, /**< bgcobject *gray */ \ + (bupvaldesc*) _upvals, /**< bupvaldesc *upvals */ \ + (bvalue*) _ktab, /**< ktab */ \ + (struct bproto**) _protos, /**< bproto **ptab */ \ + (binstruction*) _code, /**< code */ \ + ((bstring*) _fname), /**< name */ \ + sizeof(*_code)/sizeof(binstruction), /**< codesize */ \ + BE_IIF(_has_const)(sizeof(*_ktab)/sizeof(bvalue),0), /**< nconst */ \ + BE_IIF(_has_subproto)(sizeof(*_protos)/sizeof(bproto*),0), /**< proto */ \ + ((bstring*) _source), /**< source */ \ + PROTO_RUNTIME_BLOCK /**< */ \ + PROTO_VAR_INFO_BLOCK /**< */ \ } -#define be_define_local_closure(_name) \ - const bclosure _name##_closure = { \ - NULL, /* bgcobject *next */ \ - BE_CLOSURE, /* type BE_CLOSURE */ \ - GC_CONST, /* marked GC_CONST */ \ - 0, /* nupvals */ \ - NULL, /* bgcobject *gray */ \ - (bproto*) &_name##_proto, /* proto */ \ - { NULL } /* upvals */ \ +/** + * @def be_define_local_closure + * @brief be_define_local_closure + * + */ +#define be_define_local_closure(_name) \ + const bclosure _name##_closure = { \ + NULL, /**< bgcobject *next */ \ + BE_CLOSURE, /**< type BE_CLOSURE */ \ + GC_CONST, /**< marked GC_CONST */ \ + 0, /**< nupvals */ \ + NULL, /**< bgcobject *gray */ \ + (bproto*) &_name##_proto, /**< proto */ \ + { NULL } /**< upvals */ \ } -/* new version for more compact literals */ +/** + * @def be_local_closure + * @brief new version for more compact literals + * + */ #define be_local_closure(_name, _proto) \ static const bclosure _name##_closure = { \ - NULL, /* bgcobject *next */ \ - BE_CLOSURE, /* type BE_CLOSURE */ \ - GC_CONST, /* marked GC_CONST */ \ - 0, /* nupvals */ \ - NULL, /* bgcobject *gray */ \ - (bproto*) _proto, /* proto */ \ - { NULL } /* upvals */ \ + NULL, /**< bgcobject *next */ \ + BE_CLOSURE, /**< type BE_CLOSURE */ \ + GC_CONST, /**< marked GC_CONST */ \ + 0, /**< nupvals */ \ + NULL, /**< bgcobject *gray */ \ + (bproto*) _proto, /**< proto */ \ + { NULL } /**< upvals */ \ } -/* debug hook typedefs */ -#define BE_HOOK_LINE 1 -#define BE_HOOK_CALL 2 -#define BE_HOOK_RET 4 -#define BE_HOOK_EXCEPT 8 +/** + * @{ \name debug hook typedefs. + */ +/** + * \brief debug hook typedefs. + * + */ +#define BE_HOOK_LINE 1 /**< BE_HOOK_LINE */ +#define BE_HOOK_CALL 2 /**< BE_HOOK_CALL */ +#define BE_HOOK_RET 4 /**< BE_HOOK_RET */ +#define BE_HOOK_EXCEPT 8 /**< BE_HOOK_EXCEPT */ +/** + * @} + */ +/** + * @struct bhookinfo + * @brief bhookinfo + * + */ typedef struct bhookinfo { - int type; /* current hook type */ - int line; /* current linenumber */ - const char *source; /* source path information */ - const char *func_name; /* current function name */ - void *data; /* user extended data */ -} bhookinfo; + int type; /**< current hook type */ + int line; /**< current line number */ + const char *source; /**< source path information */ + const char *func_name; /**< current function name */ + void *data; /**< user extended data */ +} bhookinfo_t; /**< bhookinfo_ */ -typedef void(*bntvhook)(bvm *vm, bhookinfo *info); +/** + * @fn void (*bntvhook)(bvm *vm, bhookinfo *info) + * @brief void (*bntvhook)(bvm *vm, bhookinfo *info) + * + * @param vm virtual machine instance + * @param info + */ +typedef void (*bntvhook)(bvm *vm, bhookinfo_t *info); -/* the default assert definition */ +/** + * @def be_assert + * @brief the default assert definition + * + */ #if !BE_DEBUG - #if defined(be_assert) - #undef be_assert - #endif - #define be_assert(expr) ((void)0) +#if defined(be_assert) +#undef be_assert +#endif +#define be_assert(expr) ((void)0) #endif -/* Observability hook */ - -typedef void(*bobshook)(bvm *vm, int event, ...); +/** + * @fn void (*bobshook)(bvm *vm, int event, ...) + * @brief Observability hook + * + * @param vm virtual machine instance + * @param event + */ +typedef void (*bobshook)(bvm *vm, int event, ...); typedef uint32_t(*bmicrosfnct)(void); + +/** + * @enum beobshookevents + * @brief beobshookevents + * + */ enum beobshookevents { - BE_OBS_PCALL_ERROR, /* called when be_callp() returned an error, most likely an exception */ - BE_OBS_GC_START, /* start of GC, arg = allocated size */ - BE_OBS_GC_END, /* end of GC, arg = allocated size */ - BE_OBS_VM_HEARTBEAT, /* VM heartbeat called every million instructions */ - BE_OBS_STACK_RESIZE_START, /* Berry stack resized */ + BE_OBS_PCALL_ERROR, /**< called when be_callp() returned an error, most likely an exception */ + BE_OBS_GC_START, /**< start of GC, arg = allocated size */ + BE_OBS_GC_END, /**< end of GC, arg = allocated size */ + BE_OBS_VM_HEARTBEAT, /**< VM heartbeat called every million instructions */ + BE_OBS_STACK_RESIZE_START, /**< Berry stack resized */ }; -typedef int (*bctypefunc)(bvm*, const void*); +typedef int (*bctypefunc)(bvm*, const void*); /**< bctypefunc */ -/* FFI functions */ +/** + * @def be_writestring + * @note FFI function + * @brief be_writestring + * + */ #define be_writestring(s) be_writebuffer((s), strlen(s)) + +/** + * @def be_writenewline + * @note FFI function + * @brief be_writenewline + * + */ #define be_writenewline() be_writebuffer("\n", 1) +/** + * @def be_return + * @note FFI function + * @brief be_return + * + * @param vm virtual machine instance virtual machine instance + */ #define be_return(vm) return be_returnvalue(vm) + +/** + * @def be_return_nil + * @note FFI function + * @brief be_return_nil + * + * @param vm virtual machine instance virtual machine instance + */ #define be_return_nil(vm) return be_returnnilvalue(vm) +/** + * @def be_loadfile + * @note FFI function + * @brief be_loadfile + * + * @param vm virtual machine instance virtual machine instance + * @param name (???) + */ #define be_loadfile(vm, name) be_loadmode((vm), (name), 0) + +/** + * @def be_loadmodule + * @note FFI function + * @brief be_loadmodule + * + * @param vm virtual machine instance virtual machine instance + * @param name + * + */ #define be_loadmodule(vm, name) be_loadmode((vm), (name), 1) +/** + * @def be_loadstring + * @note FFI function + * @brief be_loadstring + * + * @param vm virtual machine instance virtual machine instance + * @param str (???) + * + */ #define be_loadstring(vm, str) \ be_loadbuffer((vm), "string", (str), strlen(str)) +/** + * @def be_dostring + * @note FFI function + * @brief be_dostring + * + * @param vm virtual machine instance virtual machine instance + * @param s (???) + * + */ #define be_dostring(vm, s) \ (be_loadstring((vm), (s)) || be_pcall((vm), 0)) +/** + * @fn bint be_str2int(const char*, const char**) + * @note FFI function + * @brief (???) + * + * @param str (???) + * @param endstr (???) + * @return (???) + */ BERRY_API bint be_str2int(const char *str, const char **endstr); + +/** + * @fn breal be_str2real(const char*, const char**) + * @note FFI function + * @brief (???) + * + * @param str + * @param endstr (???) + * @return (???) + */ BERRY_API breal be_str2real(const char *str, const char **endstr); BERRY_API const char *be_str2num(bvm *vm, const char *str); +/** + * @fn const char* be_str2num(bvm *vm, const char *str) + * @note FFI function + * @brief (???) + * + * @param vm virtual machine instance virtual machine instance + * @param str (???) + * @return (???) + */ +BERRY_API const char* be_str2num(bvm *vm, const char *str); + +/** + * @fn int be_top(bvm*) + * @note FFI function + * @brief returns the absolute index value of the top element in the virtual stack + * + * This function returns the absolute index value of the top element in the virtual stack. + * This value is also the number of elements in the virtual stack (the capacity of the virtual stack). + * Call this function before adding or subtracting elements in the virtual stack to get the number of parameters of the native function. + * + * @param vm virtual machine instance virtual machine instance + * @return (???) + */ BERRY_API int be_top(bvm *vm); -BERRY_API const char *be_typename(bvm *vm, int index); -BERRY_API const char *be_classname(bvm *vm, int index); + + +/** + * @fn const char* be_typename(bvm *vm, int index) + * @note FFI function + * @brief converts the type of the Berry object into a string and returns it + * + * This function converts the type of the Berry object into a string and returns it. + * For example, it returns "int" for an integer object, and "function" for a function object. + * + * @param vm virtual machine instance virtual machine instance + * @param index index of the object to be operated + * @return string corresponding to the parameter type (see: baselib_type) + */ +BERRY_API const char* be_typename(bvm *vm, int index); + +/** + * @fn const char* be_classname(bvm *vm, int index) + * @note FFI function + * @brief converts the type of the Berry object into a string and returns it. + * + * This function converts the type of the Berry object into a string and returns it. + * For example, it returns "int" for an integer object, and "function" for a function object + * + * @param vm virtual machine instance virtual machine instance + * @param index index of the object to be operated + * @return string corresponding to the parameter type (see: baselib_type) + */ +BERRY_API const char* be_classname(bvm *vm, int index); + +/** + * @fn bool be_classof(bvm*, int) + * @note FFI function + * @brief (???) + * + * @param vm virtual machine instance virtual machine instance + * @param index (???) + * @return (???) + */ BERRY_API bbool be_classof(bvm *vm, int index); + +/** + * @fn int be_strlen(bvm*, int) + * @note FFI function + * @brief length of the specified Berry string + * + * This function returns the number of bytes in the string at index + * (the ’\0’ characters at the end of the Berry string are not counted). + * If the value of the index position is not a string, the be_strlen function will return 0. + * Although the Berry string is compatible with the C string format, + * it is not recommended to use the strlen function of the C standard library to measure the length of the Berry string. + * For Berry strings, be_strlen is faster than strlen and has better compatibility. + * + * @param vm virtual machine instance virtual machine instance + * @param index index of the object to be operated + * @return length + */ BERRY_API int be_strlen(bvm *vm, int index); + +/** + * @fn void be_strconcat(bvm*, int) + * @note FFI function + * @brief splice two Berry strings + * + * This function will concatenate the string at the parameter position of index with the string at the top position of the stack, + * and then put the resulting string into the position indexed by index. + * + * @param vm virtual machine instance virtual machine instance + * @param index (???) + */ BERRY_API void be_strconcat(bvm *vm, int index); + +/** + * @fn void be_pop(bvm*, int) + * @note FFI function + * @brief pops the value at the top of the stack + * + * Note that the value of n cannot exceed the capacity of the stack. + * + * @param vm virtual machine instance virtual machine instance + * @param n number of values to be popped + */ BERRY_API void be_pop(bvm *vm, int n); + +/** + * @fn void be_remove(bvm*, int) + * @note FFI function + * @brief remove a value from the stack + * + * After the value at index is moved out, the following values will be filled forward, + * and the stack capacity will be reduced by one. + * The value of index cannot exceed the capacity of the stack. + * + * @param vm virtual machine instance virtual machine instance + * @param index the object to be removed + */ BERRY_API void be_remove(bvm *vm, int index); + +/** + * @fn int be_absindex(bvm*, int) + * @note FFI function + * @brief absolute index value of a given index value + * + * If index is positive, the return value is the value of index. + * If index is negative, the return value of textttbe_absindex is the absolute index value corresponding to index. + * When index is a negative value (relative index), its index position cannot be lower than the bottom of the stack. + * + * @param vm virtual machine instance virtual machine instance + * @param index index value + * @return absolute index + */ BERRY_API int be_absindex(bvm *vm, int index); +/** + * @fn bool be_isnil(bvm*, int) + * @note FFI function + * @brief value in virtual stack is nil + * + * This function returns whether the value indexed by the parameter index in the virtual stack is nil, + * if it is, it returns 1, otherwise it returns 0 + * + * @param vm virtual machine instance virtual machine instance + * @param index value index + * @return true/false + */ BERRY_API bbool be_isnil(bvm *vm, int index); + +/** + * @fn bool be_isbool(bvm*, int) + * @note FFI function + * @brief value in virtual stack is bool + * + * This function returns whether the value indexed by the parameter index in the virtual stack is bool, + * if it is, it returns 1, otherwise it returns 0 + * + * @param vm virtual machine instance virtual machine instance + * @param index value index + * @return true/false + */ BERRY_API bbool be_isbool(bvm *vm, int index); + +/** + * @fn bool be_isint(bvm*, int) + * @note FFI function + * @brief value in virtual stack is int + * + * This function returns whether the value indexed by the parameter index in the virtual stack is int, + * if it is, it returns 1, otherwise it returns 0 + * + * @param vm virtual machine instance virtual machine instance + * @param index value index + * @return true/false + */ BERRY_API bbool be_isint(bvm *vm, int index); + +/** + * @fn bool be_isreal(bvm*, int) + * @note FFI function + * @brief value in virtual stack is real + * + * This function returns whether the value indexed by the parameter index in the virtual stack is real, + * if it is, it returns 1, otherwise it returns 0 + * + * @param vm virtual machine instance virtual machine instance + * @param index value index + * @return true/false + */ BERRY_API bbool be_isreal(bvm *vm, int index); + +/** + * @fn bool be_isnumber(bvm*, int) + * @note FFI function + * @brief value in virtual stack is number + * + * This function returns whether the value indexed by the parameter index in the virtual stack is number, + * if it is, it returns 1, otherwise it returns 0 + * + * @param vm virtual machine instance virtual machine instance + * @param index value index + * @return true/false + */ BERRY_API bbool be_isnumber(bvm *vm, int index); + +/** + * @fn bool be_isstring(bvm*, int) + * @note FFI function + * @brief value in virtual stack is string + * + * This function returns whether the value indexed by the parameter index in the virtual stack is string, + * if it is, it returns 1, otherwise it returns 0 + * + * @param vm virtual machine instance + * @param index value index + * @return true/false + */ BERRY_API bbool be_isstring(bvm *vm, int index); + +/** + * @fn bool be_isclosure(bvm*, int) + * @note FFI function + * @brief value in virtual stack is closure + * + * This function returns whether the value indexed by the parameter index in the virtual stack is closure, + * if it is, it returns 1, otherwise it returns 0 + * + * @param vm virtual machine instance + * @param index value index + * @return true/false + */ BERRY_API bbool be_isclosure(bvm *vm, int index); + +/** + * @fn bool be_isntvclos(bvm*, int) + * @note FFI function + * @brief value in virtual stack is primitive closure type + * + * This function returns whether the value indexed by the parameter index in the virtual stack is primitive closure type, + * if it is, it returns 1, otherwise it returns 0 + * + * @param vm virtual machine instance + * @param index value index + * @return true/false + */ BERRY_API bbool be_isntvclos(bvm *vm, int index); + +/** + * @fn bool be_isfunction(bvm*, int) + * @note FFI function + * @brief value in virtual stack is function + * + * This function returns whether the value indexed by the parameter index in the virtual stack is function, + * if it is, it returns 1, otherwise it returns 0 + * + * @param vm virtual machine instance virtual machine instance + * @param index value index + * @return true/false + */ BERRY_API bbool be_isfunction(bvm *vm, int index); + +/** + * @fn bool be_isproto(bvm*, int) + * @note FFI function + * @brief value in virtual stack is proto + * + * This function returns whether the value indexed by the parameter index in the virtual stack is proto, + * if it is, it returns 1, otherwise it returns 0 + * + * @param vm virtual machine instance virtual machine instance + * @param index value index + * @return true/false + */ BERRY_API bbool be_isproto(bvm *vm, int index); + +/** + * @fn bool be_isclass(bvm*, int) + * @note FFI function + * @brief value in virtual stack is class + * + * This function returns whether the value indexed by the parameter index in the virtual stack is class, + * if it is, it returns 1, otherwise it returns 0 + * + * @param vm virtual machine instance virtual machine instance + * @param index value index + * @return true/false + */ BERRY_API bbool be_isclass(bvm *vm, int index); + +/** + * @fn bool be_isinstance(bvm*, int) + * @note FFI function + * @brief value in virtual stack is instance + * + * This function returns whether the value indexed by the parameter index in the virtual stack is instance, + * if it is, it returns 1, otherwise it returns 0 + * + * @param vm virtual machine instance virtual machine instance + * @param index value index + * @return true/false + */ BERRY_API bbool be_isinstance(bvm *vm, int index); + +/** + * @fn bool be_ismapinstance(bvm*, int) + * @note FFI function + * @brief value in virtual stack is instance + * + * This function returns whether the value indexed by the parameter index in the virtual stack is + * an instance of class map (or derived). If it is, it returns 1, otherwise it returns 0 + * + * @param vm virtual machine instance virtual machine instance + * @param index value index + * @return true/false + */ BERRY_API bbool be_ismapinstance(bvm *vm, int index); + +/** + * @fn bool be_ismapinstance(bvm*, int) + * @note FFI function + * @brief value in virtual stack is instance + * + * This function returns whether the value indexed by the parameter index in the virtual stack is + * an instance of class list (or derived). If it is, it returns 1, otherwise it returns 0 + * + * @param vm virtual machine instance virtual machine instance + * @param index value index + * @return true/false + */ BERRY_API bbool be_islistinstance(bvm *vm, int index); + +/** + * @fn bool be_ismodule(bvm*, int) + * @note FFI function + * @brief value in virtual stack is module + * + * This function returns whether the value indexed by the parameter index in the virtual stack is module, + * if it is, it returns 1, otherwise it returns 0 + * + * @param vm virtual machine instance virtual machine instance + * @param index value index + * @return true/false + */ BERRY_API bbool be_ismodule(bvm *vm, int index); + +/** + * @fn bool be_islist(bvm*, int) + * @note FFI function + * @brief value in virtual stack is list + * + * This function returns whether the value indexed by the parameter index in the virtual stack is list, + * if it is, it returns 1, otherwise it returns 0 + * + * @param vm virtual machine instance + * @param index value index + * @return true/false + */ BERRY_API bbool be_islist(bvm *vm, int index); + +/** + * @fn bool be_ismap(bvm*, int) + * @note FFI function + * @brief value in virtual stack is map + * + * This function returns whether the value indexed by the parameter index in the virtual stack is map, + * if it is, it returns 1, otherwise it returns 0 + * + * @param vm virtual machine instance + * @param index value index + * @return true/false + */ BERRY_API bbool be_ismap(bvm *vm, int index); + +/** + * @fn bool be_iscomptr(bvm*, int) + * @note FFI function + * @brief value in virtual stack is universal pointer type + * + * This function returns whether the value indexed by the parameter index in the virtual stack is universal pointer type, + * if it is, it returns 1, otherwise it returns 0 + * + * @param vm virtual machine instance + * @param index value index + * @return true/false + */ BERRY_API bbool be_iscomptr(bvm *vm, int index); + +/** + * @fn bool be_iscomobj(bvm*, int) + * @note FFI function + * @brief (???) + * + * @param vm virtual machine instance virtual machine instance + * @param index value index + * @return true/false + */ BERRY_API bbool be_iscomobj(bvm *vm, int index); + +/** + * @fn bool be_isderived(bvm*, int) + * @note FFI function + * @brief (???) + * + * @param vm virtual machine instance virtual machine instance + * @param index value index + * @return true/false + */ BERRY_API bbool be_isderived(bvm *vm, int index); + +/** + * @fn bool be_isbytes(bvm*, int) + * @note FFI function + * @brief value in virtual stack is instance or sub-instance of class bytes + * + * This function returns whether the value indexed by the parameter index in the virtual stack is instance or sub-instance of class bytes, + * if it is, it returns 1, otherwise it returns 0 + * + * @param vm virtual machine instance virtual machine instance + * @param index value index + * @return true/false + */ BERRY_API bbool be_isbytes(bvm *vm, int index); +/** + * @fn bint be_toint(bvm*, int) + * @note FFI function + * @brief virtual stack to integer type + * + * Get the value of the index position of index from the virtual stack and return it as an integer type. + * This function does not check the correctness of the type. + * If the value is an instance, the method toint() is called if it exists. + * + * @param vm virtual machine instance virtual machine instance + * @param index value index + * @return (???) + */ BERRY_API bint be_toint(bvm *vm, int index); + +/** + * @fn breal be_toreal(bvm*, int) + * @note FFI function + * @brief virtual stack to floating-point number type + * + * Get the value of the index position of index from the virtual stack and return it as an floating-point number type. + * This function does not check the correctness of the type. + * + * @param vm virtual machine instance virtual machine instance + * @param index + * @return (???) + */ BERRY_API breal be_toreal(bvm *vm, int index); + +/** + * @fn int be_toindex(bvm*, int) + * @note FFI function + * @brief virtual stack to integer type + * + * Get the value of the index position of index from the virtual stack and return it as an integer type. + * This function does not check the correctness of the type. + * Unlike be_toint, the return value type of be_toindex is int, while the return value of the former is bint. + * + * @param vm virtual machine instance virtual machine instance + * @param index + * @return (???) + */ BERRY_API int be_toindex(bvm *vm, int index); + +/** + * @fn bool be_tobool(bvm*, int) + * @note FFI function + * @brief virtual stack to Boolean type + * + * Get the value of the index position of index from the virtual stack and return it as a Boolean type. + * If the indexed value is not of Boolean type, it will be converted according to the rules in section type_bool, + * and the conversion process will not cause the indexed value to change. + * If the value is an instance, the method tobool() is called if it exists. + * + * @param vm virtual machine instance virtual machine instance + * @param index + * @return (???) + */ BERRY_API bbool be_tobool(bvm *vm, int index); + +/** + * @fn const char* be_tostring(bvm *vm, int index) + * @note FFI function + * @brief virtual stack to string + * + * Get the value of the index position of index from the virtual stack and return it as a string type. + * If the indexed value is not a string type, the indexed value will be converted to a string, + * and the conversion process will replace the value at the indexed position in the virtual stack with the converted string. + * The string returned by this function always ends with ’\0’ characters. + * If the value is an instance, the method tostring() is called if it exists. + * + * @param vm virtual machine instance virtual machine instance + * @param index + * @return (???) + */ BERRY_API const char* be_tostring(bvm *vm, int index); + +/** + * @fn const char* be_toescape(bvm *vm, int index, int mode) + * @note FFI function + * @brief (???) + * + * @param vm virtual machine instance virtual machine instance + * @param index + * @param mode + * @return (???) + */ BERRY_API const char* be_toescape(bvm *vm, int index, int mode); -BERRY_API void* be_tocomptr(bvm* vm, int index); + +/** + * @fn void* be_tocomptr(bvm *vm, int index) + * @note FFI function + * @brief virtual stack to general pointer + * + * Get the value of the index position of index from the virtual stack and return it as a general pointer type. + * This function does not check the correctness of the type. + * + * @param vm virtual machine instance virtual machine instance + * @param index + */ +BERRY_API void* be_tocomptr(bvm *vm, int index); + +/** + * @fn void be_moveto(bvm*, int, int) + * @note FFI function + * @brief (???) + * + * @param vm virtual machine instance virtual machine instance + * @param from + * @param to + */ BERRY_API void be_moveto(bvm *vm, int from, int to); + +/** + * @fn void be_pushnil(bvm*) + * @note FFI function + * @brief Push a nil value onto the virtual stack. + * + * @param vm virtual machine instance + * + */ BERRY_API void be_pushnil(bvm *vm); + +/** + * @fn void be_pushbool(bvm*, int) + * @note FFI function + * @brief Push a Boolean value onto the virtual stack + * + * Push a Boolean value onto the virtual stack. + * The parameter b is the boolean value to be pushed onto the stack. + * When the value is 0, it means false, otherwise it is true. + * + * @param vm virtual machine instance + * @param b + */ BERRY_API void be_pushbool(bvm *vm, int b); + +/** + * @fn void be_pushint(bvm*, bint) + * @note FFI function + * @brief Push an integer value i onto the virtual stack. + * + * @param vm virtual machine instance + * @param i + */ BERRY_API void be_pushint(bvm *vm, bint i); + +/** + * @fn void be_pushreal(bvm*, breal) + * @note FFI function + * @brief Push a floating point value r onto the virtual stack. + * + * @param vm virtual machine instance + * @param r + */ BERRY_API void be_pushreal(bvm *vm, breal r); + +/** + * @fn void be_pushstring(bvm*, const char*) + * @note FFI function + * @brief Push the string str onto the virtual stack. + * + * Push the string str onto the virtual stack. + * The parameter str must point to a C string that ends with a null character ’\0’, + * and a null pointer cannot be passed in. + * + * @param vm virtual machine instance + * @param str + */ BERRY_API void be_pushstring(bvm *vm, const char *str); + +/** + * @fn void be_pushnstring(bvm*, const char*, size_t) + * @note FFI function + * @brief Push the string str of length n onto the virtual stack. + * + * Push the string str of length n onto the virtual stack. + * The length of the string is subject to the parameter n, + * and the null character is not used as the end mark of the string. + * + * @param vm virtual machine instance + * @param str + * @param n + */ BERRY_API void be_pushnstring(bvm *vm, const char *str, size_t n); + +/** + * @fn const char* be_pushfstring(bvm *vm, const char *format, ...) + * @note FFI function + * @brief Push the formatted string into the virtual stack. + * + * Push the formatted string into the virtual stack. + * The parameter format is a formatted string, which contains the text to be pushed onto the stack, + * and the format parameter contains a label, + * which can be replaced by the value specified by the subsequent additional parameter and formatted as required. + * According to the label of the format string, a series of additional parameters may be required, + * and each additional parameter will replace the corresponding % label in the format parameter. + * + * @param vm virtual machine instance + * @param format + * @return (???) + */ BERRY_API const char* be_pushfstring(bvm *vm, const char *format, ...); + +/** + * @fn void* be_pushbuffer(bvm *vm, size_t size) + * @note FFI function + * @brief (???) + * + * @param vm virtual machine instance + * @param size + */ BERRY_API void* be_pushbuffer(bvm *vm, size_t size); + +/** + * @fn void be_pushvalue(bvm*, int) + * @note FFI function + * @brief Push the value with index index onto the top of the virtual stack. + * + * @param vm virtual machine instance + * @param index + */ BERRY_API void be_pushvalue(bvm *vm, int index); + +/** + * @fn void be_pushclosure(bvm*, void*) + * @note FFI function + * @brief (???) + * + * @param vm virtual machine instance + * @param cl + */ BERRY_API void be_pushclosure(bvm *vm, void *cl); + +/** + * @fn void be_pushntvclosure(bvm*, bntvfunc, int) + * @note FFI function + * @brief Push a native closure onto the top of the virtual stack. + * + * Push a native closure onto the top of the virtual stack. + * The parameter f is the C function pointer of the native closure, + * and nupvals is the upvalue number of the closure. + * + * @param vm virtual machine instance + * @param f + * @param nupvals + */ BERRY_API void be_pushntvclosure(bvm *vm, bntvfunc f, int nupvals); + +/** + * @fn void be_pushntvfunction(bvm*, bntvfunc) + * @note FFI function + * @brief Push a native function onto the top of the virtual stack, and the parameter f is the native function pointer. + * + * @param vm virtual machine instance + * @param f + */ BERRY_API void be_pushntvfunction(bvm *vm, bntvfunc f); + +/** + * @fn void be_pushclass(bvm*, const char*, const bnfuncinfo*) + * @note FFI function + * @brief Push a native class onto the top of the virtual stack + * + * Push a native class onto the top of the virtual stack. + * The parameter name is the name of the native class, and the parameter lib is the attribute description of the native class. + * + * @param vm virtual machine instance + * @param name + * @param lib + */ BERRY_API void be_pushclass(bvm *vm, const char *name, const bnfuncinfo *lib); -BERRY_API void be_pushntvclass(bvm *vm, const struct bclass * c); + +/** + * @fn void be_pushntvclass(bvm*, const struct bclass*) + * @note FFI function + * @brief (???) + * + * @param vm virtual machine instance + * @param c + */ +BERRY_API void be_pushntvclass(bvm *vm, const struct bclass *c); + +/** + * @fn void be_pushcomptr(bvm*, void*) + * @note FFI function + * @brief Push a general pointer onto the top of the virtual stack + * + * Push a general pointer onto the top of the virtual stack. + * The general pointer ptr points to a certain C data area. + * Since the content pointed to by this pointer is not maintained by Berry’s garbage collector, + * users have to maintain the life cycle of the data themselves. + * + * @param vm virtual machine instance + * @param ptr + */ BERRY_API void be_pushcomptr(bvm *vm, void *ptr); + +/** + * @fn bool be_pushiter(bvm*, int) + * @note FFI function + * @brief Push an iterator onto the top of the virtual stack. + * + * @param vm virtual machine instance + * @param index + * @return (???) + */ BERRY_API bbool be_pushiter(bvm *vm, int index); +/** + * @fn void be_newlist(bvm*) + * @note FFI function + * @brief creates a new list value + * + * After this function is successfully called, the new list value will be pushed onto the top of the stack. + * list value is an internal representation of a list, not to be confused with an instance of the list class. + * + * @param vm virtual machine instance + */ BERRY_API void be_newlist(bvm *vm); + +/** + * @fn void be_newmap(bvm*) + * @note FFI function + * @brief creates a new map value + * + * After this function is successfully called, the new map value will be pushed onto the top of the stack. + * map value is an internal representation of a list, not to be confused with an instance of the map class. + * + * @param vm virtual machine instance + */ BERRY_API void be_newmap(bvm *vm); + +/** + * @fn void be_newmodule(bvm*) + * @note FFI function + * @brief (???) + * + * @param vm virtual machine instance + */ BERRY_API void be_newmodule(bvm *vm); + +/** + * @fn void be_newcomobj(bvm*, void*, bntvfunc) + * @note FFI function + * @brief (???) + * + * @param vm virtual machine instance + * @param data + * @param destroy + */ BERRY_API void be_newcomobj(bvm *vm, void *data, bntvfunc destroy); + +/** + * @fn void be_newobject(bvm*, const char*) + * @note FFI function + * @brief (???) + * + * @param vm virtual machine instance + * @param name + */ BERRY_API void be_newobject(bvm *vm, const char *name); + +/** + * @fn bool be_copy(bvm*, int) + * @note FFI function + * @brief (???) + * + * @param vm virtual machine instance + * @param index + * @return + */ BERRY_API bbool be_copy(bvm *vm, int index); + +/** + * @fn bool be_setname(bvm*, int, const char*) + * @note FFI function + * @brief (???) + * + * @param vm virtual machine instance + * @param index + * @param name + * @return (???) + */ BERRY_API bbool be_setname(bvm *vm, int index, const char *name); + +/** + * @fn bool be_getglobal(bvm*, const char*) + * @note FFI function + * @brief pushes the global variable with the specified name onto the stack + * + * After this function is called, the global variable named name will be pushed onto the top of the virtual stack + * + * @param vm virtual machine instance + * @param name + * @return (???) + */ BERRY_API bbool be_getglobal(bvm *vm, const char *name); + +/** + * @fn void be_setglobal(bvm*, const char*) + * @note FFI function + * @brief (???) + * + * @param vm virtual machine instance + * @param name + */ BERRY_API void be_setglobal(bvm *vm, const char *name); + +/** + * @fn bool be_getbuiltin(bvm*, const char*) + * @note FFI function + * @brief (???) + * + * @param vm virtual machine instance + * @param name + * @return (???) + */ BERRY_API bbool be_getbuiltin(bvm *vm, const char *name); + +/** + * @fn bool be_setmember(bvm*, int, const char*) + * @note FFI function + * @brief set the value of the member variable of the instance object class + * + * This function will copy the value at the top of the stack to the member k of the index position instance. + * Note that the top element of the stack will not pop up automatically. + * + * @param vm virtual machine instance + * @param index index of the instance object + * @param k name of the member + * @return (???) + */ BERRY_API bbool be_setmember(bvm *vm, int index, const char *k); + +/** + * @fn bool be_getmember(bvm*, int, const char*) + * @note FFI function + * @brief get the value of the member variable of the instance object class + * + * This function pushes the value of the member of the index position instance k onto the top of the virtual stack. + * + * @param vm virtual machine instance + * @param index index of the instance object + * @param k name of the member + * @return (???) + */ BERRY_API bbool be_getmember(bvm *vm, int index, const char *k); + +/** + * @fn bool be_getmethod(bvm*, int, const char*) + * @note FFI function + * @brief (???) + * + * @param vm virtual machine instance + * @param index + * @param k + * @return (???) + */ BERRY_API bbool be_getmethod(bvm *vm, int index, const char *k); + +/** + * @fn bool be_getindex(bvm*, int) + * @note FFI function + * @brief get the value of list or map + * + * This function is used to get an element from the map or list container (internal values, not instances of map or list classes), + * and the index of the element is stored at the top of the stack (relative index is  − 1). + * After calling this function, the value obtained from the container will be pushed onto the top of the stack. + * If there is no subscript pointed to by the container, the value of nil will be pushed onto the top of the stack. + * + * @param vm virtual machine instance + * @param index index of the object to be operated + * @return (???) + */ BERRY_API bbool be_getindex(bvm *vm, int index); + +/** + * @fn bool be_setindex(bvm*, int) + * @note FFI function + * @brief set a value in list or map + * + * This function is used to write an element of the map or list container. + * The index of the value to be written in the virtual stack is  − 1, + * and the index of the subscript of the write position in the virtual stack is  − 2. + * If the element with the specified subscript does not exist in the container, the write operation will fail. + * + * @param vm virtual machine instance + * @param index index of the object to be operated + * @return (???) + */ BERRY_API bbool be_setindex(bvm *vm, int index); + +/** + * @fn void be_getupval(bvm*, int, int) + * @note FFI function + * @brief read an Up Value of the native closure + * + * The read Up Value will be pushed onto the top of the virtual stack. + * + * @param vm virtual machine instance + * @param index the native closure index value of the Up Value to be read + * @param pos position of the Up Value in the native closure Up Value table (numbering starts from 0) + */ BERRY_API void be_getupval(bvm *vm, int index, int pos); + +/** + * @fn bool be_setupval(bvm*, int, int) + * @note FFI function + * @brief set an Up Value of the native closure. + * + * This function obtains a value from the top of the virtual stack and writes it to the target Up Value. + * After the operation is completed, the top value of the stack will not be popped from the stack. + * + * @param vm virtual machine instance + * @param index the native closure index value of the Up Value to be read + * @param pos position of the Up Value in the native closure Up Value table (numbering starts from 0) + * @return (???) + */ BERRY_API bbool be_setupval(bvm *vm, int index, int pos); + +/** + * @fn bool be_setsuper(bvm*, int) + * @note FFI function + * @brief (???) + * + * @param vm virtual machine instance + * @param index + * @return (???) + */ BERRY_API bbool be_setsuper(bvm *vm, int index); + +/** + * @fn void be_getsuper(bvm*, int) + * @note FFI function + * @brief get the parent object of the base class or instance of the class. + * + * If the value at index is a class with a base class, the function will push its base class onto the top of the stack; + * if the value at index is an object with a parent object, + * the function will take its parent The object is pushed onto the top of the stack; otherwise, + * a value of nil is pushed onto the top of the stack. + * + * @param vm virtual machine instance + * @param index the class or object to be operated + */ BERRY_API void be_getsuper(bvm *vm, int index); + +/** + * @fn int be_data_size(bvm*, int) + * @note FFI function + * @brief get the number of elements contained in the container + * + * If the value at index is a Map value or List value, + * the function returns the number of elements contained in the container, otherwise it returns -1. + * + * @param vm virtual machine instance + * @param index index of the container object to be operated + * @return (???) + */ BERRY_API int be_data_size(bvm *vm, int index); + +/** + * @fn void be_data_push(bvm*, int) + * @note FFI function + * @brief append a new element to the end of the container. + * + * The object at index must be a List value. + * This function gets a value from the top of the stack and appends it to the end of the container. + * After the operation is completed, the value at the top of the stack will not be popped from the stack. + * + * @param vm virtual machine instance + * @param index index of the container object to be operate + */ BERRY_API void be_data_push(bvm *vm, int index); + +/** + * @fn bool be_data_insert(bvm*, int) + * @note FFI function + * @brief insert a pair of elements into the container + * + * The object at index must be a List value or a Map value. + * The inserted element forms a pair of key-value pairs. + * The value is stored at the top of the stack, and the key is stored at the previous index on the top of the stack. + * It should be noted that the key inserted into the Map container cannot be a nil value, + * and the key inserted into the List container must be an integer value. + * If the operation is successful, the function will return bture, otherwise it will return bfalse. + * + * @param vm virtual machine instance + * @param index container object to be operated + * @return (???) + */ BERRY_API bbool be_data_insert(bvm *vm, int index); + +/** + * @fn bool be_data_remove(bvm*, int) + * @note FFI function + * @brief remove an element in the container + * + * The object at index must be a List value or Map value. + * For the Map container, the key to delete the element is stored on the top of the virtual stack + * (need to be pressed before the function call); + * for the List container, the index of the element to be deleted is stored on the top of the virtual stack + * (need to be before the function call) push into). + * If the operation is successful, the function will return bture, otherwise it will return bfalse. + * + * @param vm virtual machine instance + * @param index container object to be operated. + * @return (???) + */ BERRY_API bbool be_data_remove(bvm *vm, int index); + +/** + * @fn bool be_data_merge(bvm*, int) + * @note FFI function + * @brief (???) + * + * @param vm virtual machine instance + * @param index + * @return (???) + */ BERRY_API bbool be_data_merge(bvm *vm, int index); + +/** + * @fn void be_data_resize(bvm*, int) + * @note FFI function + * @brief reset the capacity of the container + * + * This function is only available for List containers, and the new capacity is stored on the top of the virtual stack (must be an integer). + * + * @param vm virtual machine instance + * @param index container object to be operated + */ BERRY_API void be_data_resize(bvm *vm, int index); + +/** + * @fn void be_data_reverse(bvm*, int) + * @note FFI function + * @brief (???) + * + * @param vm virtual machine instance + * @param index + */ BERRY_API void be_data_reverse(bvm *vm, int index); + +/** + * @fn int be_iter_next(bvm*, int) + * @note FFI function + * @brief get the next element of the iterator + * + * The iterator object may be an iterator of a List container or a Map container. + * For the List iterator, this function pushes the iteration result value onto the top of the stack, + * while for the Map iterator, it pushes the key value into the previous position and the top of the stack respectively. + * Calling this function will update the iterator. + * If the function returns 0, the call fails, returning 1 to indicate that the current iterator is a List iterator, + * and returning 2 to indicate that the current iterator is a Map iterator. + * + * @param vm virtual machine instance + * @param index iterator to be operated + * @return (???) + */ BERRY_API int be_iter_next(bvm *vm, int index); + +/** + * @fn bool be_iter_hasnext(bvm*, int) + * @note FFI function + * @brief test whether there is another element in the iterator + * + * The iterator object may be an iterator of a List container or a Map container. + * If there are more iterable elements in the iterator, return 1, otherwise return 0. + * + * @param vm virtual machine instance + * @param index iterator to be operated + * @return (???) + */ BERRY_API bbool be_iter_hasnext(bvm *vm, int index); + +/** + * @fn bool be_refcontains(bvm*, int) + * @note FFI function + * @brief test whether there is a reference to the specified object in the reference stack + * + * This function is used to test whether there is a reference to the specified object in the reference stack. + * It must be used in conjunction with be_refpush and be_refpop. + * This API can avoid recursion when traversing objects that have their own references. + * This function is used for the value of an instance type. + * If there is a reference to the object in the reference stack, it returns 1, otherwise it returns 0. + * + * @param vm virtual machine instance + * @param index object to be operated + * @return (???) + */ BERRY_API bbool be_refcontains(bvm *vm, int index); + +/** + * @fn void be_refpush(bvm*, int) + * @note FFI function + * @brief Push the reference of the specified object onto the reference stack. + * + * This function is used for the value of an instance type. + * + * @param vm virtual machine instance + * @param index object to be operated + */ BERRY_API void be_refpush(bvm *vm, int index); + +/** + * @fn void be_refpop(bvm*) + * @note FFI function + * @brief Pop the object at the top of the reference stack + * + * This function is used in pairs with be_refpush + * + * @param vm virtual machine instance + */ BERRY_API void be_refpop(bvm *vm); + +/** + * @fn void be_stack_require(bvm*, int) + * @note FFI function + * @brief tests the amount of free space on the stack and expands the stack space if it is insufficient + * + * If the free capacity of the virtual stack allocated by the VM to the native function is lower than this value, + * an expansion operation will be performed. + * + * @param vm virtual machine instance + * @param count required free stack capacity. + */ BERRY_API void be_stack_require(bvm *vm, int count); + +/** + * @fn bool be_getmodule(bvm*, const char*) + * @note FFI function + * @brief (???) + * + * @param vm virtual machine instance + * @param k + * @return (???) + */ BERRY_API bbool be_getmodule(bvm *vm, const char *k); -/* relop operation APIs */ +/** + * @fn bool be_iseq(bvm*) + * @note relop operation API + * @brief (???) + * + * @param vm virtual machine instance + * @return (???) + */ BERRY_API bbool be_iseq(bvm *vm); + +/** + * @fn bool be_isneq(bvm*) + * @note relop operation API + * @brief (???) + * + * @param vm virtual machine instance + * @return (???) + */ BERRY_API bbool be_isneq(bvm *vm); + +/** + * @fn bool be_islt(bvm*) + * @note relop operation API + * @brief (???) + * + * @param vm virtual machine instance + * @return (???) + */ BERRY_API bbool be_islt(bvm *vm); + +/** + * @fn bool be_isle(bvm*) + * @note relop operation API + * @brief (???) + * + * @param vm virtual machine instance + * @return (???) + */ BERRY_API bbool be_isle(bvm *vm); + +/** + * @fn bool be_isgt(bvm*) + * @note relop operation API + * @brief (???) + * + * @param vm virtual machine instance + * @return (???) + */ BERRY_API bbool be_isgt(bvm *vm); + +/** + * @fn bool be_isge(bvm*) + * @note relop operation API + * @brief (???) + * + * @param vm virtual machine instance + * @return (???) + */ BERRY_API bbool be_isge(bvm *vm); -/* Function call/return APIs */ +/** + * @fn int be_returnvalue(bvm*) + * @note Function call/return API + * @brief (???) + * + * @param vm virtual machine instance + * @return (???) + */ BERRY_API int be_returnvalue(bvm *vm); + +/** + * @fn int be_returnnilvalue(bvm*) + * @note Function call/return API + * @brief (???) + * + * @param vm virtual machine instance + * @return (???) + */ BERRY_API int be_returnnilvalue(bvm *vm); + +/** + * @fn void be_call(bvm*, int) + * @note Function call/return API + * @brief (???) + * + * @param vm virtual machine instance + * @param argc + */ BERRY_API void be_call(bvm *vm, int argc); + +/** + * @fn int be_pcall(bvm*, int) + * @note Function call/return API + * @brief (???) + * + * @param vm virtual machine instance + * @param argc + * @return (???) + */ BERRY_API int be_pcall(bvm *vm, int argc); + +/** + * @fn void be_exit(bvm*, int) + * @note Function call/return API + * @brief (???) + * + * @param vm virtual machine instance + * @param status + */ BERRY_API void be_exit(bvm *vm, int status); -/* exception APIs */ +/** + * @fn void be_raise(bvm*, const char*, const char*) + * @note exception API + * @brief (???) + * + * @param vm virtual machine instance + * @param except + * @param msg + */ __attribute__((noreturn)) BERRY_API void be_raise(bvm *vm, const char *except, const char *msg); + +/** + * @fn int be_getexcept(bvm*, int) + * @note exception API + * @brief (???) + * + * @param vm virtual machine instance + * @param code + * @return (???) + */ BERRY_API int be_getexcept(bvm *vm, int code); + +/** + * @fn void be_dumpvalue(bvm*, int) + * @note exception API + * @brief (???) + * + * @param vm virtual machine instance + * @param index + */ BERRY_API void be_dumpvalue(bvm *vm, int index); + +/** + * @fn void be_dumpexcept(bvm*) + * @note exception API + * @brief (???) + * + * @param vm virtual machine instance + */ BERRY_API void be_dumpexcept(bvm *vm); + +/** + * @fn void be_stop_iteration(bvm*) + * @note exception API + * @brief (???) + * + * @param vm virtual machine instance + */ BERRY_API void be_stop_iteration(bvm *vm); +/** + * @fn void be_regfunc(bvm*, const char*, bntvfunc) + * @note exception API + * @brief register a native function + * + * The specific behavior of this function is related to the value of the BE_USE_PRECOMPILED_OBJECT macro + * (although the FFI is still available when using the compile-time construction technique, + * it cannot dynamically register the built-in variables. + * In this case, please refer to the method of registering the built-in objects. + * + * @param vm virtual machine instance + * @param name name of the native function + * @param f pointer of the native function + */ BERRY_API void be_regfunc(bvm *vm, const char *name, bntvfunc f); + +/** + * @fn void be_regclass(bvm*, const char*, const bnfuncinfo*) + * @note exception API + * @brief (???) + * + * @param vm virtual machine instance + * @param name + * @param lib + */ BERRY_API void be_regclass(bvm *vm, const char *name, const bnfuncinfo *lib); -/* VM management APIs */ +/** + * @fn bvm* be_vm_new(void) + * @note VM management API + * @brief Construct a VM + * + * @return (???) + */ BERRY_API bvm* be_vm_new(void); + +/** + * @fn void be_vm_delete(bvm*) + * @note VM management API + * @brief Destroy a VM + * + * @param vm virtual machine instance + */ BERRY_API void be_vm_delete(bvm *vm); -/* Observability hook */ +/** + * @fn void be_set_obs_hook(bvm*, bobshook) + * @note Observability hook + * @brief (???) + * + * @param vm virtual machine instance + * @param hook + */ BERRY_API void be_set_obs_hook(bvm *vm, bobshook hook); BERRY_API void be_set_obs_micros(bvm *vm, bmicrosfnct micros); + + +/** + * @fn void be_set_ctype_func_hanlder(bvm*, bctypefunc) + * @note Observability hook + * @brief (???) + * + * @param vm virtual machine instance + * @param handler + */ BERRY_API void be_set_ctype_func_hanlder(bvm *vm, bctypefunc handler); + +/** + * @fn bctypefunc be_get_ctype_func_hanlder(bvm*) + * @note Observability hook + * @brief (???) + * + * @param vm virtual machine instance + * @return (???) + */ BERRY_API bctypefunc be_get_ctype_func_hanlder(bvm *vm); -/* code load APIs */ -BERRY_API int be_loadbuffer(bvm *vm, - const char *name, const char *buffer, size_t length); +/** + * @fn int be_loadbuffer(bvm*, const char*, const char*, size_t) + * @note code load API + * @brief load a piece of source code from the buffer and compile it into bytecode + * + * f the compilation is successful, be_loadbuffer will compile the source code into a Berry function and place + * it on the top of the virtual stack. If the compilation encounters an error, be_loadbuffer will return + * an error value of type berrorcode (Section errorcode), and if possible, will store the + * specific error message string at the top of the virtual stack. + * + * @param vm virtual machine instance + * @param name string, which is usually used to mark the source of the source code + * @param buffer buffer for storing the source code + * @param length length of the buffer + * @return (???) + */ +BERRY_API int be_loadbuffer(bvm *vm, const char *name, const char *buffer, size_t length); + +/** + * @fn int be_loadmode(bvm *vm, const char *name, bbool islocal) + * @note code load API + * @brief (???) + * + * @param vm virtual machine instance + * @param name + * @param islocal + * @return (???) + */ BERRY_API int be_loadmode(bvm *vm, const char *name, bbool islocal); + +/** + * @fn int be_loadlib(bvm*, const char*) + * @note code load API + * @brief (???) + * + * @param vm virtual machine instance + * @param path + * @return (???) + */ BERRY_API int be_loadlib(bvm *vm, const char *path); + +/** + * @fn int be_savecode(bvm*, const char*) + * @note code load API + * @brief (???) + * + * @param vm virtual machine instance + * @param name + * @return (???) + */ BERRY_API int be_savecode(bvm *vm, const char *name); -/* module path list APIs */ +/** + * @fn void be_module_path(bvm*) + * @note module path list API + * @brief (???) + * + * @param vm virtual machine instance + */ BERRY_API void be_module_path(bvm *vm); + +/** + * @fn void be_module_path_set(bvm*, const char*) + * @note module path list API + * @brief (???) + * + * @param vm virtual machine instance + * @param path + */ BERRY_API void be_module_path_set(bvm *vm, const char *path); -/* bytes operations */ +/** + * @fn void* be_pushbytes(bvm *vm, const void *buf, size_t len) + * @note bytes operation + * @brief Push a bytes() buffer + * + * @param vm virtual machine instance + * @param buf starting at position + * @param len size + */ BERRY_API void* be_pushbytes(bvm *vm, const void *buf, size_t len); + +/** + * @fn const void* be_tobytes(bvm *vm, int index, size_t *len) + * @note bytes operation + * @brief return virtual stack as a bytes buffer + * + * Get the value of the index position of index from the virtual stack and return it as a bytes buffer. + * The pointer of the buffer is returned, and the size is stored in *len (unless len is NULL). + * This function works only for instances of the bytes class, or returns NULL. + * + * @param vm virtual machine instance + * @param index index from the virtual stac + * @param len size + */ BERRY_API const void* be_tobytes(bvm *vm, int index, size_t *len); -/* debug APIs */ +/** + * @fn void be_sethook(bvm*, const char*) + * @note debug API + * @brief (???) + * + * @param vm virtual machine instance + * @param mask + */ BERRY_API void be_sethook(bvm *vm, const char *mask); + +/** + * @fn void be_setntvhook(bvm*, bntvhook, void*, int) + * @note debug API + * @brief (???) + * + * @param vm virtual machine instance + * @param hook + * @param data + * @param mask + */ BERRY_API void be_setntvhook(bvm *vm, bntvhook hook, void *data, int mask); -/* basic character IO APIs */ +/** + * @fn void be_writebuffer(const char*, size_t) + * @note basic character IO API + * @brief implement on berry_port.c + * + * Output a piece of data to the standard output device, the parameter + * `buffer` is the first address of the output data block, and `length` is + * the length of the output data block. This function outputs to the + * `stdout` file by default. Inside the interpreter, this function is + * usually used as a character stream output, not a binary stream. + * + * @param buffer + * @param length + */ BERRY_API void be_writebuffer(const char *buffer, size_t length); + +/** + * @fn char* be_readstring(char *buffer, size_t size) + * @note basic character IO API + * @brief implement on berry_port.c + * + * Input a piece of data from the standard input device, and read at most + * one row of data each time this function is called. The parameter + * `buffer` is the data buffer passed in by the caller, and the capacity of + * the buffer is `size`. This function will stop reading and return when + * the buffer capacity is used up, otherwise it will return when a newline + * character or end of file character is read. If the function executes + * successfully, it will directly use the `buffer` parameter as the return + * value, otherwise it will return `NULL`. + * + * This function will add the read line breaks to the read data, and each + * time the `be_readstring` function is called, it will continue to read + * from the current position. This function is only called in the + * implementation of the native function `input`, and the `be_readstring` + * function may not be implemented when it is not necessary. + * + * @param buffer + * @param size + * @return (???) + */ BERRY_API char* be_readstring(char *buffer, size_t size); #ifdef __cplusplus From f46b9f4e2d5b99c3d46a22432ae0ab347026e501 Mon Sep 17 00:00:00 2001 From: s-hadinger <49731213+s-hadinger@users.noreply.github.com> Date: Fri, 21 Apr 2023 22:36:00 +0200 Subject: [PATCH 022/289] Update Berry tests from upstream (#18472) --- lib/libesp32/berry/tests/bytes.be | 9 ++++ lib/libesp32/berry/tests/class_static.be | 21 ++++++++ lib/libesp32/berry/tests/introspect.be | 11 ++++ lib/libesp32/berry/tests/json.be | 13 +++++ lib/libesp32/berry/tests/json_advanced.be | 51 +++++++++++++++++++ .../berry/tests/json_test_stack_size.be | 11 ++++ lib/libesp32/berry/tests/map.be | 7 +++ 7 files changed, 123 insertions(+) create mode 100644 lib/libesp32/berry/tests/json_advanced.be create mode 100644 lib/libesp32/berry/tests/json_test_stack_size.be diff --git a/lib/libesp32/berry/tests/bytes.be b/lib/libesp32/berry/tests/bytes.be index d2b2c1573..6a481d62c 100644 --- a/lib/libesp32/berry/tests/bytes.be +++ b/lib/libesp32/berry/tests/bytes.be @@ -248,3 +248,12 @@ assert(bytes("0011223344").reverse(1, nil) == bytes("0044332211")) assert(bytes("0011223344").reverse(nil, nil, 2) == bytes("2233001144")) assert(bytes("001122334455").reverse(nil, nil, 3) == bytes("334455001122")) + +# tobool returns `true` is bytes() is not null, `false` if empty +assert(bool(bytes()) == false) +assert(bytes().tobool() == false) +assert(!bytes()) + +assert(bool(bytes("00")) == true) +assert(bytes("01").tobool() == true) +assert(bytes("02")) diff --git a/lib/libesp32/berry/tests/class_static.be b/lib/libesp32/berry/tests/class_static.be index c86a4a4b3..1b3d0f928 100644 --- a/lib/libesp32/berry/tests/class_static.be +++ b/lib/libesp32/berry/tests/class_static.be @@ -120,3 +120,24 @@ assert(A.a == 1) assert(B.a == A) assert(B.b == 1) assert(B.c == A) + +#- static class get an implicit `_class` variable -# +class A + static def f(x) return _class end +end +assert(A.f() == A) + +#- static class within a class -# +class A + static class B + static def f() return 1 end + def g() return 2 end + end +end +a = A() +b = A.B() +assert(classname(a) == 'A') +assert(classname(b) == 'B') +assert(A.B.f() == 1) +assert(b.g() == 2) +assert(super(B) == nil) diff --git a/lib/libesp32/berry/tests/introspect.be b/lib/libesp32/berry/tests/introspect.be index cb4a612d8..c93033982 100644 --- a/lib/libesp32/berry/tests/introspect.be +++ b/lib/libesp32/berry/tests/introspect.be @@ -31,3 +31,14 @@ assert(a.a == 3) import introspect m = introspect.module("math") # load module `math`, assign to `m` and don't create a global variable assert(type(m.pi) == 'real') + +#- name -# +import string +assert(introspect.name(string) == 'string') +assert(introspect.name(print) == nil) # native C function don't have a registered name +assert(introspect.name("foo") == nil) +class A def a() end static def b() end static var c end +assert(introspect.name(A) == 'A') +assert(introspect.name(A.a) == 'a') +assert(introspect.name(A.b) == 'b') +assert(introspect.name(A.c) == nil) diff --git a/lib/libesp32/berry/tests/json.be b/lib/libesp32/berry/tests/json.be index 92df2f3e6..2165eda8d 100644 --- a/lib/libesp32/berry/tests/json.be +++ b/lib/libesp32/berry/tests/json.be @@ -80,3 +80,16 @@ class map2 : map def init() super(self).init() end end var m = map2() m['key'] = 1 assert_dump(m, '{"key":1}') + +# sweep dumping nested arrays of diffrent sizes +# this tests for any unexpanded stack conditions +for count : 10..200 + var arr = [[]] + var last_arr = arr + for i : 0..count + var pushed = [i] + last_arr.push(pushed) + last_arr = pushed + end + json.dump(arr) +end diff --git a/lib/libesp32/berry/tests/json_advanced.be b/lib/libesp32/berry/tests/json_advanced.be new file mode 100644 index 000000000..72206d9de --- /dev/null +++ b/lib/libesp32/berry/tests/json_advanced.be @@ -0,0 +1,51 @@ +import os +import json + + + +def assert_load_failed(text) + assert(json.load(text) == nil) +end + +var input_file = open("tests/json_test_cases.json", "r") +var test_cases = json.load(input_file.read()) + +# check positive cases +var has_failed_positives = false +for case_name : test_cases["positive"].keys() + var case = test_cases["positive"][case_name] + var val = json.load(case) + if val == nil && case != "null" + print("Failed to load case: " + case_name) + has_failed_positives = true + end +end + +if has_failed_positives + assert(false) +end + +# check negative cases + +var has_failed_negatives = false +for case_name : test_cases["negative"].keys() + var case = test_cases["negative"][case_name] + + var val = json.load(case) + if val != nil + print("Failed to fail case: " + case_name + ", got: " + json.dump(val)) + has_failed_negatives = true + end +end + +if has_failed_negatives + # assert(false) +end + +# check "any" cases, only for crashes + +for case_name : test_cases["any"].keys() + var case = test_cases["any"][case_name] + var val = json.load(case) +end + diff --git a/lib/libesp32/berry/tests/json_test_stack_size.be b/lib/libesp32/berry/tests/json_test_stack_size.be new file mode 100644 index 000000000..f76ff8bb4 --- /dev/null +++ b/lib/libesp32/berry/tests/json_test_stack_size.be @@ -0,0 +1,11 @@ +import json + +# this test must be in a separate file, so that the stack is not expanded yet by other tests + +arr = "{" +for i : 0..1000 + arr += '"k' + str(i) + '": "v' + str(i) + '",' +end +arr += "}" + +json.load(arr) diff --git a/lib/libesp32/berry/tests/map.be b/lib/libesp32/berry/tests/map.be index ca0c4399d..9029faed4 100644 --- a/lib/libesp32/berry/tests/map.be +++ b/lib/libesp32/berry/tests/map.be @@ -30,3 +30,10 @@ m.remove(2) assert(str(m) == '{1: 2}') m.remove(1) assert(str(m) == '{}') + +# allow booleans to be used as keys +m={true:10, false:20} +assert(m.contains(true)) +assert(m.contains(false)) +assert(m[true] == 10) +assert(m[false] == 20) From f5e6ba956d2cbd92ff755812f18c0b1385a5fd21 Mon Sep 17 00:00:00 2001 From: s-hadinger <49731213+s-hadinger@users.noreply.github.com> Date: Fri, 21 Apr 2023 22:36:18 +0200 Subject: [PATCH 023/289] Berry upstream (#18471) --- lib/libesp32/berry/src/be_constobj.h | 2 +- lib/libesp32/berry/src/berry.h | 2 -- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/lib/libesp32/berry/src/be_constobj.h b/lib/libesp32/berry/src/be_constobj.h index 3ef55eebd..485bf85e6 100644 --- a/lib/libesp32/berry/src/be_constobj.h +++ b/lib/libesp32/berry/src/be_constobj.h @@ -422,7 +422,7 @@ const bvector _name = { \ } #define be_define_const_native_module(_module) \ -const bntvmodule_t be_native_module_##_module = { \ +const bntvmodule_t be_native_module_##_module = { \ #_module, \ 0, 0, \ (bmodule*)&(m_lib##_module) \ diff --git a/lib/libesp32/berry/src/berry.h b/lib/libesp32/berry/src/berry.h index bae47a590..1a99b9190 100644 --- a/lib/libesp32/berry/src/berry.h +++ b/lib/libesp32/berry/src/berry.h @@ -765,7 +765,6 @@ BERRY_API bint be_str2int(const char *str, const char **endstr); * @return (???) */ BERRY_API breal be_str2real(const char *str, const char **endstr); -BERRY_API const char *be_str2num(bvm *vm, const char *str); /** * @fn const char* be_str2num(bvm *vm, const char *str) @@ -792,7 +791,6 @@ BERRY_API const char* be_str2num(bvm *vm, const char *str); */ BERRY_API int be_top(bvm *vm); - /** * @fn const char* be_typename(bvm *vm, int index) * @note FFI function From d9eeb8bf57a63e28533be032d5a4378ad0263da9 Mon Sep 17 00:00:00 2001 From: s-hadinger <49731213+s-hadinger@users.noreply.github.com> Date: Fri, 21 Apr 2023 22:42:02 +0200 Subject: [PATCH 024/289] Berry remove superfluous test (#18473) --- lib/libesp32/berry/tests/json_advenced.be | 50 ----------------------- 1 file changed, 50 deletions(-) delete mode 100644 lib/libesp32/berry/tests/json_advenced.be diff --git a/lib/libesp32/berry/tests/json_advenced.be b/lib/libesp32/berry/tests/json_advenced.be deleted file mode 100644 index be3b87e0b..000000000 --- a/lib/libesp32/berry/tests/json_advenced.be +++ /dev/null @@ -1,50 +0,0 @@ -import os -import json - - - -def assert_load_failed(text) - assert(json.load(text) == nil) -end - -var input_file = open("tests/json_test_cases.json", "r") -var test_cases = json.load(input_file.read()) - -# check positive cases -var has_failed_positives = false -for case_name : test_cases["positive"].keys() - var case = test_cases["positive"][case_name] - var val = json.load(case) - if val == nil && case != "null" - print("Failed to load case: " + case_name) - has_failed_positives = true - end -end - -if has_failed_positives - assert(false) -end - -# check negative cases - -var has_failed_negatives = false -for case_name : test_cases["negative"].keys() - var case = test_cases["negative"][case_name] - - var val = json.load(case) - if val != nil - print("Failed to fail case: " + case_name + ", got: " + json.dump(val)) - has_failed_negatives = true - end -end - -if has_failed_negatives - # assert(false) -end - -# check "any" cases, only for crashes - -for case_name : test_cases["any"].keys() - var case = test_cases["any"][case_name] - var val = json.load(case) -end From 045f8b4aec50fb5cf3d44cfda110d24513dd6024 Mon Sep 17 00:00:00 2001 From: s-hadinger <49731213+s-hadinger@users.noreply.github.com> Date: Fri, 21 Apr 2023 23:05:25 +0200 Subject: [PATCH 025/289] Berry fix corruption in debug (#18475) --- lib/libesp32/berry/src/be_debug.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/libesp32/berry/src/be_debug.c b/lib/libesp32/berry/src/be_debug.c index 4cd44bf61..58f81f2b4 100644 --- a/lib/libesp32/berry/src/be_debug.c +++ b/lib/libesp32/berry/src/be_debug.c @@ -137,7 +137,7 @@ void be_print_inst(binstruction ins, int pc, void* fout) logbuf("%s", opc2str(op)); break; } - memcpy(__lbuf_tmp, __lbuf, strlen(__lbuf)); + memcpy(__lbuf_tmp, __lbuf, strlen(__lbuf)+1); logbuf("%s\n", __lbuf_tmp); if (fout) { be_fwrite(fout, __lbuf, strlen(__lbuf)); From a2b9574ec995ceffaa98ac82c5ee335185134640 Mon Sep 17 00:00:00 2001 From: s-hadinger <49731213+s-hadinger@users.noreply.github.com> Date: Sat, 22 Apr 2023 10:14:39 +0200 Subject: [PATCH 026/289] Berry fix solidify script (#18476) --- lib/libesp32/berry_tasmota/solidify_all.be | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/libesp32/berry_tasmota/solidify_all.be b/lib/libesp32/berry_tasmota/solidify_all.be index 81f392870..f24050a65 100755 --- a/lib/libesp32/berry_tasmota/solidify_all.be +++ b/lib/libesp32/berry_tasmota/solidify_all.be @@ -14,7 +14,7 @@ import sys sys.path().push('src/embedded') # allow to import from src/embedded # globals that need to exist to make compilation succeed -var globs = "path,ctypes_bytes_dyn,tasmota,ccronexpr,gpio,light,webclient,load,MD5,lv,light_state,udp," +var globs = "path,ctypes_bytes_dyn,tasmota,ccronexpr,gpio,light,webclient,load,MD5,lv,light_state,udp,I2C_Driver," "lv_clock,lv_clock_icon,lv_signal_arcs,lv_signal_bars,lv_wifi_arcs_icon,lv_wifi_arcs," "lv_wifi_bars_icon,lv_wifi_bars," "_lvgl," From 39094bc07981a1ac2db14159ec03ef60f65f6666 Mon Sep 17 00:00:00 2001 From: s-hadinger <49731213+s-hadinger@users.noreply.github.com> Date: Sat, 22 Apr 2023 23:33:22 +0200 Subject: [PATCH 027/289] Matter persist plugins config (#18486) --- .../berry_matter/src/be_matter_module.c | 4 +- .../src/embedded/Matter_Device.be | 182 +- .../src/embedded/Matter_Plugin.be | 31 +- .../src/embedded/Matter_Plugin_Device.be | 6 +- .../src/embedded/Matter_Plugin_Light0.be | 5 +- .../src/embedded/Matter_Plugin_Light1.be | 5 +- .../src/embedded/Matter_Plugin_Light2.be | 5 +- .../src/embedded/Matter_Plugin_Light3.be | 5 +- .../src/embedded/Matter_Plugin_OnOff.be | 20 +- .../src/embedded/Matter_Plugin_Root.be | 5 +- .../src/embedded/Matter_Plugin_Sensor.be | 21 +- .../embedded/Matter_Plugin_Sensor_Humidity.be | 1 + ...be => Matter_Plugin_Sensor_Illuminance.be} | 7 +- .../embedded/Matter_Plugin_Sensor_Pressure.be | 1 + .../src/embedded/Matter_Plugin_Sensor_Temp.be | 3 +- .../src/embedded/Matter_Session_Store.be | 5 +- .../src/solidify/solidified_Matter_Device.h | 6371 +++++++++-------- .../src/solidify/solidified_Matter_Plugin.h | 726 +- .../solidified_Matter_Plugin_Device.h | 174 +- .../solidified_Matter_Plugin_Light0.h | 296 +- .../solidified_Matter_Plugin_Light1.h | 320 +- .../solidified_Matter_Plugin_Light2.h | 420 +- .../solidified_Matter_Plugin_Light3.h | 388 +- .../solidify/solidified_Matter_Plugin_OnOff.h | 326 +- .../solidify/solidified_Matter_Plugin_Root.h | 32 +- .../solidified_Matter_Plugin_Sensor.h | 194 +- ...solidified_Matter_Plugin_Sensor_Humidity.h | 65 +- ...dified_Matter_Plugin_Sensor_Illuminance.h} | 85 +- ...solidified_Matter_Plugin_Sensor_Pressure.h | 63 +- .../solidified_Matter_Plugin_Sensor_Temp.h | 69 +- .../solidified_Matter_Session_Store.h | 1722 ++--- 31 files changed, 6213 insertions(+), 5344 deletions(-) rename lib/libesp32/berry_matter/src/embedded/{Matter_Plugin_Sensor_Light.be => Matter_Plugin_Sensor_Illuminance.be} (92%) rename lib/libesp32/berry_matter/src/solidify/{solidified_Matter_Plugin_Sensor_Light.h => solidified_Matter_Plugin_Sensor_Illuminance.h} (87%) diff --git a/lib/libesp32/berry_matter/src/be_matter_module.c b/lib/libesp32/berry_matter/src/be_matter_module.c index 8dbccd3a9..c7f4c7d9c 100644 --- a/lib/libesp32/berry_matter/src/be_matter_module.c +++ b/lib/libesp32/berry_matter/src/be_matter_module.c @@ -162,7 +162,7 @@ extern const bclass be_class_Matter_TLV; // need to declare it upfront because #include "solidify/solidified_Matter_Plugin_Sensor.h" #include "solidify/solidified_Matter_Plugin_Sensor_Pressure.h" #include "solidify/solidified_Matter_Plugin_Sensor_Temp.h" -#include "solidify/solidified_Matter_Plugin_Sensor_Light.h" +#include "solidify/solidified_Matter_Plugin_Sensor_Illuminance.h" #include "solidify/solidified_Matter_Plugin_Sensor_Humidity.h" /*********************************************************************************************\ @@ -340,7 +340,7 @@ module matter (scope: global, strings: weak) { Plugin_Sensor, class(be_class_Matter_Plugin_Sensor) // Generic Sensor Plugin_Sensor_Pressure, class(be_class_Matter_Plugin_Sensor_Pressure) // Pressure Sensor Plugin_Sensor_Temp, class(be_class_Matter_Plugin_Sensor_Temp) // Temperature Sensor - Plugin_Sensor_Light, class(be_class_Matter_Plugin_Sensor_Light) // Light Sensor + Plugin_Sensor_Illuminance, class(be_class_Matter_Plugin_Sensor_Illuminance) // Illuminance Sensor Plugin_Sensor_Humidity, class(be_class_Matter_Plugin_Sensor_Humidity) // Humidity Sensor } diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Device.be b/lib/libesp32/berry_matter/src/embedded/Matter_Device.be index 2e0da6cdf..dec7f2c9e 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Device.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Device.be @@ -29,8 +29,10 @@ class Matter_Device static var PASE_TIMEOUT = 10*60 # default open commissioning window (10 minutes) var started # is the Matter Device started (configured, mDNS and UDPServer started) var plugins # list of plugins + var plugins_persist # true if plugins configuration needs to be saved + var plugins_classes # map of registered classes by type name var udp_server # `matter.UDPServer()` object - var message_handler # `matter.MessageHandler()` object + var message_handler # `matter.MessageHandler()` object var sessions # `matter.Session_Store()` objet var ui # Commissioning open @@ -73,14 +75,17 @@ class Matter_Device self.started = false self.plugins = [] + self.plugins_persist = false # plugins need to saved only when the first fabric is associated + self.plugins_classes = {} + self.register_native_classes() # register all native classes self.vendorid = self.VENDOR_ID self.productid = self.PRODUCT_ID self.root_iterations = self.PBKDF_ITERATIONS - self.root_salt = crypto.random(16) # bytes("5350414B453250204B65792053616C74") + self.root_salt = crypto.random(16) self.ipv4only = false self.load_param() - self.sessions = matter.Session_Store() + self.sessions = matter.Session_Store(self) self.sessions.load_fabrics() self.message_handler = matter.MessageHandler(self) self.ui = matter.UI(self) @@ -106,6 +111,10 @@ class Matter_Device tasmota.add_driver(self) self.register_commands() + + if self.sessions.count_active_fabrics() > 0 + self.plugins_persist = true # if there are active fabrics, then we persist plugins configuration + end end ############################################################# @@ -113,9 +122,7 @@ class Matter_Device def start() if self.started return end # abort if already started - # add the default plugin - self.plugins.push(matter.Plugin_Root(self, 0)) - # autoconfigure other plugins + # autoconfigure other plugins if needed self.autoconf_device() # for now read sensors every 30 seconds @@ -596,13 +603,18 @@ class Matter_Device ############################################################# # def save_param() - import json - var j = json.dump({'distinguish':self.root_discriminator, 'passcode':self.root_passcode, 'ipv4only':self.ipv4only}) + import string + var j = string.format('{"distinguish":%i,"passcode":%i,"ipv4only":%s', self.root_discriminator, self.root_passcode, self.ipv4only ? 'true':'false') + if self.plugins_persist + j += ',"config":' + j += self.plugins_to_json() + end + j += '}' try - import string var f = open(self.FILENAME, "w") f.write(j) f.close() + tasmota.log(string.format("MTR: =Saved parameters%s", self.plugins_persist ? " and condiguration" : ""), 2) return j except .. as e, m tasmota.log("MTR: Session_Store::save Exception:" + str(e) + "|" + str(m), 2) @@ -627,6 +639,11 @@ class Matter_Device self.root_discriminator = j.find("distinguish", self.root_discriminator) self.root_passcode = j.find("passcode", self.root_passcode) self.ipv4only = bool(j.find("ipv4only", false)) + var config = j.find("config") + if config + self._load_plugins_config(config) + self.plugins_persist = true + end except .. as e, m if e != "io_error" tasmota.log("MTR: Session_Store::load Exception:" + str(e) + "|" + str(m), 2) @@ -645,6 +662,44 @@ class Matter_Device if dirty self.save_param() end end + ############################################################# + # Load plugins configuration from json + # + # 'config' is a map + # Ex: + # {'32': {'filter': 'AXP192#Temperature', 'type': 'temperature'}, '40': {'filter': 'BMP280#Pressure', 'type': 'pressure'}, '34': {'filter': 'SHT3X#Temperature', 'type': 'temperature'}, '33': {'filter': 'BMP280#Temperature', 'type': 'temperature'}, '1': {'relay': 0, 'type': 'relay'}, '56': {'filter': 'SHT3X#Humidity', 'type': 'humidity'}, '0': {'type': 'root'}} + def _load_plugins_config(config) + import string + + var endpoints = self.k2l_num(config) + tasmota.log("MTR: endpoints to be configured "+str(endpoints), 3) + + for ep: endpoints + try + var plugin_conf = config[str(ep)] + tasmota.log(string.format("MTR: endpoint %i config %s", ep, plugin_conf), 3) + + var pi_class_name = plugin_conf.find('type') + if pi_class_name == nil tasmota.log("MTR: no class name, skipping", 3) continue end + var pi_class = self.plugins_classes.find(pi_class_name) + if pi_class == nil tasmota.log("MTR: unknown class name '"+str(pi_class_name)+"' skipping", 2) continue end + + var pi = pi_class(self, ep, plugin_conf) + self.plugins.push(pi) + + var param_log = '' + for k:self.k2l(plugin_conf) + if k == 'type' continue end + param_log += string.format(" %s:%s", k, plugin_conf[k]) + end + tasmota.log(string.format("MTR: endpoint:%i type:%s%s", ep, pi_class_name, param_log), 2) + except .. as e, m + tasmota.log("MTR: Exception" + str(e) + "|" + str(m), 2) + end + end + + tasmota.publish_result('{"Matter":{"Initialized":1}}', 'Matter') + end ############################################################# # Matter plugin management @@ -916,9 +971,31 @@ class Matter_Device ############################################################# # Autoconfigure device from template # + # Applies only if there are no plugins already configured + ## TODO generate map instead def autoconf_device() import string import json + + if size(self.plugins) > 0 return end # already configured + + var config = self.autoconf_device_map() + tasmota.log("MTR: autoconfig = " + str(config), 3) + self._load_plugins_config(config) + + end + + ############################################################# + # Autoconfigure device from template to map + # + # Applies only if there are no plugins already configured + def autoconf_device_map() + import json + var m = {} + + # add the default plugin + m["0"] = {'type':'root'} + # check if we have a light var endpoint = 1 var light_present = false @@ -929,14 +1006,11 @@ class Matter_Device var channels_count = size(light_status.find('channels', "")) if channels_count > 0 if channels_count == 1 - self.plugins.push(matter.Plugin_Light1(self, endpoint)) - tasmota.log(string.format("MTR: Endpoint:%i Light_Dimmer", endpoint), 2) + m[str(endpoint)] = {'type':'light1'} elif channels_count == 2 - self.plugins.push(matter.Plugin_Light2(self, endpoint)) - tasmota.log(string.format("MTR: Endpoint:%i Light_CT", endpoint), 2) + m[str(endpoint)] = {'type':'light2'} else - self.plugins.push(matter.Plugin_Light3(self, endpoint)) - tasmota.log(string.format("MTR: Endpoint:%i Light_RGB", endpoint), 2) + m[str(endpoint)] = {'type':'light3'} end light_present = true endpoint += 1 @@ -949,8 +1023,7 @@ class Matter_Device if light_present relay_count -= 1 end # last power is taken for lights while relay_index < relay_count - self.plugins.push(matter.Plugin_OnOff(self, endpoint, relay_index)) - tasmota.log(string.format("MTR: Endpoint:%i Relay_%i", endpoint, relay_index + 1), 2) + m[str(endpoint)] = {'type':'relay','relay':relay_index} relay_index += 1 endpoint += 1 end @@ -965,8 +1038,7 @@ class Matter_Device var sensor_2 = sensors[k1] if isinstance(sensor_2, map) && sensor_2.contains("Temperature") var temp_rule = k1 + "#Temperature" - self.plugins.push(matter.Plugin_Sensor_Temp(self, endpoint, temp_rule)) - tasmota.log(string.format("MTR: Endpoint:%i Temperature (%s)", endpoint, temp_rule), 2) + m[str(endpoint)] = {'type':'temperature','filter':temp_rule} endpoint += 1 end if endpoint > 0x28 break end @@ -979,8 +1051,7 @@ class Matter_Device var sensor_2 = sensors[k1] if isinstance(sensor_2, map) && sensor_2.contains("Pressure") var temp_rule = k1 + "#Pressure" - self.plugins.push(matter.Plugin_Sensor_Pressure(self, endpoint, temp_rule)) - tasmota.log(string.format("MTR: Endpoint:%i Pressure (%s)", endpoint, temp_rule), 2) + m[str(endpoint)] = {'type':'pressure','filter':temp_rule} endpoint += 1 end if endpoint > 0x2F break end @@ -993,8 +1064,7 @@ class Matter_Device var sensor_2 = sensors[k1] if isinstance(sensor_2, map) && sensor_2.contains("Illuminance") var temp_rule = k1 + "#Illuminance" - self.plugins.push(matter.Plugin_Sensor_Light(self, endpoint, temp_rule)) - tasmota.log(string.format("MTR: Endpoint:%i Light (%s)", endpoint, temp_rule), 2) + m[str(endpoint)] = {'type':'illuminance','filter':temp_rule} endpoint += 1 end if endpoint > 0x38 break end @@ -1007,13 +1077,13 @@ class Matter_Device var sensor_2 = sensors[k1] if isinstance(sensor_2, map) && sensor_2.contains("Humidity") var temp_rule = k1 + "#Humidity" - self.plugins.push(matter.Plugin_Sensor_Humidity(self, endpoint, temp_rule)) - tasmota.log(string.format("MTR: Endpoint:%i Humidity (%s)", endpoint, temp_rule), 2) + m[str(endpoint)] = {'type':'humidity','filter':temp_rule} endpoint += 1 end if endpoint > 0x40 break end end - tasmota.publish_result('{"Matter":{"Initialized":1}}', 'Matter') + # tasmota.publish_result('{"Matter":{"Initialized":1}}', 'Matter') + return m end # get keys of a map in sorted order @@ -1021,6 +1091,66 @@ class Matter_Device for i:1..size(l)-1 var k = l[i] var j = i while (j > 0) && (l[j-1] > k) l[j] = l[j-1] j -= 1 end l[j] = k end return l end + # get keys of a map in sorted order, as numbers + static def k2l_num(m) var l=[] if m==nil return l end for k:m.keys() l.push(int(k)) end + for i:1..size(l)-1 var k = l[i] var j = i while (j > 0) && (l[j-1] > k) l[j] = l[j-1] j -= 1 end l[j] = k end return l + end + + ############################################################# + # plugins_to_json + # + # Export plugins configuration as a JSON string + def plugins_to_json() + import string + var s = '{' + var i = 0 + while i < size(self.plugins) + var pi = self.plugins[i] + if i > 0 s += ',' end + s += string.format('"%i":%s', pi.get_endpoint(), pi.to_json()) + i += 1 + end + s += '}' + return s + end + + ############################################################# + # register_plugin_class + # + # Adds a class by name + def register_plugin_class(name, cl) + self.plugins_classes[name] = cl + end + + ############################################################# + # register_native_classes + # + # Adds a class by name + def register_native_classes(name, cl) + self.register_plugin_class('root', matter.Plugin_Root) + self.register_plugin_class('light0', matter.Plugin_Light0) + self.register_plugin_class('light1', matter.Plugin_Light1) + self.register_plugin_class('light2', matter.Plugin_Light2) + self.register_plugin_class('light3', matter.Plugin_Light3) + self.register_plugin_class('relay', matter.Plugin_OnOff) + self.register_plugin_class('temperature', matter.Plugin_Sensor_Temp) + self.register_plugin_class('humidity', matter.Plugin_Sensor_Humidity) + self.register_plugin_class('illuminance', matter.Plugin_Sensor_Illuminance) + self.register_plugin_class('pressure', matter.Plugin_Sensor_Pressure) + tasmota.log("MTR: registered classes "+str(self.k2l(self.plugins_classes)), 3) + end + + ##################################################################### + # Events + ##################################################################### + def event_fabrics_saved() + # if the plugins configuration was not persisted and a new fabric is saved, persist it + if self.sessions.count_active_fabrics() > 0 && !self.plugins_persist + self.plugins_persist = true + self.save_param() + end + end + ##################################################################### # Commands `Mtr___` ##################################################################### diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin.be index 60cfe112b..659e39fc4 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin.be @@ -23,6 +23,7 @@ #@ solidify:Matter_Plugin,weak class Matter_Plugin + static var NAME = "generic" # name of the plug-in in json static var CLUSTERS = { 0x001D: [0,1,2,3,0xFFFC,0xFFFD], # Descriptor Cluster 9.5 p.453 } @@ -39,7 +40,10 @@ class Matter_Plugin ############################################################# # Constructor # - def init(device, endpoint) + # device: contains the root device object so the plugin can "call home" + # endpoint: (int) the endpoint number (16 bits) + # arguments: (map) the map for all complementary arguments that are plugin specific + def init(device, endpoint, arguments) self.device = device self.endpoint = endpoint self.clusters = self.consolidate_clusters() @@ -215,6 +219,31 @@ class Matter_Plugin def every_second() self.update_shadow() # force reading value and sending subscriptions end + + ############################################################# + # to_json + # + # generate the json string for parameter of the plug-in + # this function calls a method to be overriden with custom parameters + def to_json() + import string + var s = string.format('{"type":"%s"', self.NAME) + s = self.to_json_parameters(s) + s += '}' + return s + end + + ############################################################# + # to_json_parameters + # + # To be overriden. + # returns a json sub-string to add after endpoint and type name + def to_json_parameters(s) + # s += ',"my_param":"my_value"' + return s + end + + end matter.Plugin = Matter_Plugin diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Device.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Device.be index 864b536bf..d8e728558 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Device.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Device.be @@ -32,9 +32,9 @@ class Matter_Plugin_Device : Matter_Plugin ############################################################# # Constructor - def init(device, endpoint, tasmota_relay_index) - super(self).init(device, endpoint) - end + # def init(device, endpoint, arguments) + # super(self).init(device, endpoint, arguments) + # end ############################################################# # read an attribute diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Light0.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Light0.be index 37d9dff38..0c0b02465 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Light0.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Light0.be @@ -25,6 +25,7 @@ class Matter_Plugin end #@ solidify:Matter_Plugin_Light0,weak class Matter_Plugin_Light0 : Matter_Plugin + static var NAME = "light0" # name of the plug-in in json static var CLUSTERS = { # 0x001D: inherited # Descriptor Cluster 9.5 p.453 0x0003: [0,1,0xFFFC,0xFFFD], # Identify 1.2 p.16 @@ -38,8 +39,8 @@ class Matter_Plugin_Light0 : Matter_Plugin ############################################################# # Constructor - def init(device, endpoint) - super(self).init(device, endpoint) + def init(device, endpoint, arguments) + super(self).init(device, endpoint, arguments) self.shadow_onoff = false end diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Light1.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Light1.be index b917efb01..518b48137 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Light1.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Light1.be @@ -25,6 +25,7 @@ class Matter_Plugin_Light0 end #@ solidify:Matter_Plugin_Light1,weak class Matter_Plugin_Light1 : Matter_Plugin_Light0 + static var NAME = "light1" # name of the plug-in in json static var CLUSTERS = { # 0x001D: inherited # Descriptor Cluster 9.5 p.453 # 0x0003: inherited # Identify 1.2 p.16 @@ -40,8 +41,8 @@ class Matter_Plugin_Light1 : Matter_Plugin_Light0 ############################################################# # Constructor - def init(device, endpoint) - super(self).init(device, endpoint) + def init(device, endpoint, arguments) + super(self).init(device, endpoint, arguments) self.shadow_bri = 0 end diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Light2.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Light2.be index aa2f38207..928d0a8f5 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Light2.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Light2.be @@ -25,6 +25,7 @@ class Matter_Plugin_Light1 end #@ solidify:Matter_Plugin_Light2,weak class Matter_Plugin_Light2 : Matter_Plugin_Light1 + static var NAME = "light2" # name of the plug-in in json static var CLUSTERS = { # 0x001D: inherited # Descriptor Cluster 9.5 p.453 # 0x0003: inherited # Identify 1.2 p.16 @@ -41,8 +42,8 @@ class Matter_Plugin_Light2 : Matter_Plugin_Light1 ############################################################# # Constructor - def init(device, endpoint) - super(self).init(device, endpoint) + def init(device, endpoint, arguments) + super(self).init(device, endpoint, arguments) self.shadow_ct = 325 self.update_ct_minmax() end diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Light3.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Light3.be index 7d797b29a..dec133661 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Light3.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Light3.be @@ -25,6 +25,7 @@ class Matter_Plugin_Light1 end #@ solidify:Matter_Plugin_Light3,weak class Matter_Plugin_Light3 : Matter_Plugin_Light1 + static var NAME = "light3" # name of the plug-in in json static var CLUSTERS = { # 0x001D: inherited # Descriptor Cluster 9.5 p.453 # 0x0003: inherited # Identify 1.2 p.16 @@ -40,8 +41,8 @@ class Matter_Plugin_Light3 : Matter_Plugin_Light1 ############################################################# # Constructor - def init(device, endpoint) - super(self).init(device, endpoint) + def init(device, endpoint, arguments) + super(self).init(device, endpoint, arguments) self.shadow_hue = 0 self.shadow_sat = 0 end diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_OnOff.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_OnOff.be index a62d4fe39..fd6245ee2 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_OnOff.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_OnOff.be @@ -25,6 +25,7 @@ class Matter_Plugin end #@ solidify:Matter_Plugin_OnOff,weak class Matter_Plugin_OnOff : Matter_Plugin + static var NAME = "relay" # name of the plug-in in json static var CLUSTERS = { # 0x001D: inherited # Descriptor Cluster 9.5 p.453 0x0003: [0,1,0xFFFC,0xFFFD], # Identify 1.2 p.16 @@ -40,11 +41,11 @@ class Matter_Plugin_OnOff : Matter_Plugin ############################################################# # Constructor - def init(device, endpoint, tasmota_relay_index) - super(self).init(device, endpoint) + def init(device, endpoint, arguments) + super(self).init(device, endpoint, arguments) self.get_onoff() # read actual value - if tasmota_relay_index == nil tasmota_relay_index = 0 end - self.tasmota_relay_index = tasmota_relay_index + self.tasmota_relay_index = arguments.find('relay') + if self.tasmota_relay_index == nil self.tasmota_relay_index = 0 end end ############################################################# @@ -214,6 +215,17 @@ class Matter_Plugin_OnOff : Matter_Plugin self.attribute_updated(nil, 0x0006, 0x0000) # send to all endpoints end + ############################################################# + # to_json_parameters + # + # To be overriden. + # returns a json sub-string to add after endpoint and type name + def to_json_parameters(s) + import string + s += string.format(',"relay":%i', self.tasmota_relay_index) + return s + end + ############################################################# # every_second def every_second() diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Root.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Root.be index 125dd9cca..dce3c003f 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Root.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Root.be @@ -25,6 +25,7 @@ class Matter_Plugin end #@ solidify:Matter_Plugin_Root,weak class Matter_Plugin_Root : Matter_Plugin + static var NAME = "root" # name of the plug-in in json static var CLUSTERS = { # 0x001D: inherited # Descriptor Cluster 9.5 p.453 0x001F: [0,2,3,4], # Access Control Cluster, p.461 @@ -46,8 +47,8 @@ class Matter_Plugin_Root : Matter_Plugin ############################################################# # Constructor - def init(device, endpoint) - super(self).init(device, endpoint) + def init(device, endpoint, arguments) + super(self).init(device, endpoint, arguments) end ############################################################# diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor.be index 740b34c46..42511fd7e 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor.be @@ -31,10 +31,12 @@ class Matter_Plugin_Sensor : Matter_Plugin_Device ############################################################# # Constructor - def init(device, endpoint, sensor_filter) - super(self).init(device, endpoint) - self.tasmota_sensor_filter = sensor_filter - self.tasmota_sensor_matcher = tasmota.Rule_Matcher.parse(sensor_filter) + def init(device, endpoint, arguments) + super(self).init(device, endpoint, arguments) + self.tasmota_sensor_filter = arguments.find('filter') + if self.tasmota_sensor_filter + self.tasmota_sensor_matcher = tasmota.Rule_Matcher.parse(self.tasmota_sensor_filter) + end end ############################################################# @@ -72,5 +74,16 @@ class Matter_Plugin_Sensor : Matter_Plugin_Device return val end + ############################################################# + # to_json_parameters + # + # To be overriden. + # returns a json sub-string to add after endpoint and type name + def to_json_parameters(s) + import string + s += string.format(',"filter":"%s"', self.tasmota_sensor_filter) + return s + end + end matter.Plugin_Sensor = Matter_Plugin_Sensor diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor_Humidity.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor_Humidity.be index e06a9b54a..1f85523aa 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor_Humidity.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor_Humidity.be @@ -25,6 +25,7 @@ class Matter_Plugin_Sensor end #@ solidify:Matter_Plugin_Sensor_Humidity,weak class Matter_Plugin_Sensor_Humidity : Matter_Plugin_Sensor + static var NAME = "humidity" # name of the plug-in in json static var CLUSTERS = { 0x0405: [0,1,2,0xFFFC,0xFFFD], # Humidity Measurement p.102 - no writable } diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor_Light.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor_Illuminance.be similarity index 92% rename from lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor_Light.be rename to lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor_Illuminance.be index 27faeef9b..bdf631452 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor_Light.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor_Illuminance.be @@ -22,9 +22,10 @@ # dummy declaration for solidification class Matter_Plugin_Sensor end -#@ solidify:Matter_Plugin_Sensor_Light,weak +#@ solidify:Matter_Plugin_Sensor_Illuminance,weak -class Matter_Plugin_Sensor_Light : Matter_Plugin_Sensor +class Matter_Plugin_Sensor_Illuminance : Matter_Plugin_Sensor + static var NAME = "illuminance" # name of the plug-in in json static var CLUSTERS = { 0x0400: [0,1,2,0xFFFC,0xFFFD], # Illuminance Measurement p.95 - no writable } @@ -81,4 +82,4 @@ class Matter_Plugin_Sensor_Light : Matter_Plugin_Sensor end end -matter.Plugin_Sensor_Pressure = Matter_Plugin_Sensor_Pressure +matter.Plugin_Sensor_Illuminance = Matter_Plugin_Sensor_Illuminance diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor_Pressure.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor_Pressure.be index aa6366ce2..c39de113e 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor_Pressure.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor_Pressure.be @@ -25,6 +25,7 @@ class Matter_Plugin_Sensor end #@ solidify:Matter_Plugin_Sensor_Pressure,weak class Matter_Plugin_Sensor_Pressure : Matter_Plugin_Sensor + static var NAME = "pressure" # name of the plug-in in json static var CLUSTERS = { 0x0403: [0,1,2,0xFFFC,0xFFFD], # Temperature Measurement p.97 - no writable } diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor_Temp.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor_Temp.be index 2ef420a94..6dff99c57 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor_Temp.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor_Temp.be @@ -25,8 +25,9 @@ class Matter_Plugin_Sensor end #@ solidify:Matter_Plugin_Sensor_Temp,weak class Matter_Plugin_Sensor_Temp : Matter_Plugin_Sensor + static var NAME = "temperature" # name of the plug-in in json static var CLUSTERS = { - 0x0402: [0,1,2], # Temperature Measurement p.97 - no writable + 0x0402: [0,1,2,0xFFFC,0xFFFD], # Temperature Measurement p.97 - no writable } static var TYPES = { 0x0302: 2 } # Temperature Sensor, rev 2 diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Session_Store.be b/lib/libesp32/berry_matter/src/embedded/Matter_Session_Store.be index 38c40cee0..27dfdd520 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Session_Store.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Session_Store.be @@ -32,12 +32,14 @@ class Matter_Expirable end ################################################################################# ################################################################################# class Matter_Session_Store + var device # device root object var sessions var fabrics # list of provisioned fabrics static var _FABRICS = "_matter_fabrics.json" ############################################################# - def init() + def init(device) + self.device = device self.sessions = matter.Expirable_list() self.fabrics = matter.Expirable_list() end @@ -327,6 +329,7 @@ class Matter_Session_Store f.write(fabs) f.close() tasmota.log(string.format("MTR: =Saved %i fabric(s) and %i session(s)", fabs_size, sessions_saved), 2) + self.device.event_fabrics_saved() # signal event except .. as e, m tasmota.log("MTR: Session_Store::save Exception:" + str(e) + "|" + str(m), 2) end diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Device.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Device.h index 813942de2..b34301182 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Device.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Device.h @@ -7,781 +7,103 @@ extern const bclass be_class_Matter_Device; /******************************************************************** -** Solidified function: start_operational_discovery +** Solidified function: register_plugin_class ********************************************************************/ -be_local_closure(Matter_Device_start_operational_discovery, /* name */ +be_local_closure(Matter_Device_register_plugin_class, /* name */ be_nested_proto( - 9, /* nstack */ - 2, /* argc */ + 4, /* nstack */ + 3, /* argc */ 2, /* varg */ 0, /* has upvals */ NULL, /* no upvals */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[ 9]) { /* constants */ + ( &(const bvalue[ 1]) { /* constants */ + /* K0 */ be_nested_str_weak(plugins_classes), + }), + be_str_weak(register_plugin_class), + &be_const_str_solidified, + ( &(const binstruction[ 3]) { /* code */ + 0x880C0100, // 0000 GETMBR R3 R0 K0 + 0x980C0202, // 0001 SETIDX R3 R1 R2 + 0x80000000, // 0002 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: _compute_pbkdf +********************************************************************/ +be_local_closure(Matter_Device__compute_pbkdf, /* name */ + be_nested_proto( + 14, /* nstack */ + 4, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[11]) { /* constants */ /* K0 */ be_nested_str_weak(crypto), - /* K1 */ be_nested_str_weak(mdns), - /* K2 */ be_nested_str_weak(string), - /* K3 */ be_nested_str_weak(stop_basic_commissioning), - /* K4 */ be_nested_str_weak(root_w0), - /* K5 */ be_nested_str_weak(root_L), - /* K6 */ be_nested_str_weak(set_expire_in_seconds), - /* K7 */ be_nested_str_weak(mdns_announce_op_discovery), - /* K8 */ be_nested_str_weak(get_fabric), - }), - be_str_weak(start_operational_discovery), - &be_const_str_solidified, - ( &(const binstruction[17]) { /* code */ - 0xA40A0000, // 0000 IMPORT R2 K0 - 0xA40E0200, // 0001 IMPORT R3 K1 - 0xA4120400, // 0002 IMPORT R4 K2 - 0x8C140103, // 0003 GETMET R5 R0 K3 - 0x7C140200, // 0004 CALL R5 1 - 0x4C140000, // 0005 LDNIL R5 - 0x90020805, // 0006 SETMBR R0 K4 R5 - 0x4C140000, // 0007 LDNIL R5 - 0x90020A05, // 0008 SETMBR R0 K5 R5 - 0x8C140306, // 0009 GETMET R5 R1 K6 - 0x541E003B, // 000A LDINT R7 60 - 0x7C140400, // 000B CALL R5 2 - 0x8C140107, // 000C GETMET R5 R0 K7 - 0x8C1C0308, // 000D GETMET R7 R1 K8 - 0x7C1C0200, // 000E CALL R7 1 - 0x7C140400, // 000F CALL R5 2 - 0x80000000, // 0010 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: start -********************************************************************/ -be_local_closure(Matter_Device_start, /* name */ - be_nested_proto( - 7, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 1, /* has sup protos */ - ( &(const struct bproto*[ 1]) { - be_nested_proto( - 2, /* nstack */ - 0, /* argc */ - 0, /* varg */ - 1, /* has upvals */ - ( &(const bupvaldesc[ 1]) { /* upvals */ - be_local_const_upval(1, 0), - }), - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 1]) { /* constants */ - /* K0 */ be_nested_str_weak(_trigger_read_sensors), - }), - be_str_weak(_anonymous_), - &be_const_str_solidified, - ( &(const binstruction[ 4]) { /* code */ - 0x68000000, // 0000 GETUPV R0 U0 - 0x8C000100, // 0001 GETMET R0 R0 K0 - 0x7C000200, // 0002 CALL R0 1 - 0x80000000, // 0003 RET 0 - }) - ), - }), - 1, /* has constants */ - ( &(const bvalue[14]) { /* constants */ - /* K0 */ be_nested_str_weak(started), - /* K1 */ be_nested_str_weak(plugins), - /* K2 */ be_nested_str_weak(push), - /* K3 */ be_nested_str_weak(matter), - /* K4 */ be_nested_str_weak(Plugin_Root), - /* K5 */ be_const_int(0), - /* K6 */ be_nested_str_weak(autoconf_device), - /* K7 */ be_nested_str_weak(tasmota), - /* K8 */ be_nested_str_weak(add_cron), - /* K9 */ be_nested_str_weak(_X2A_X2F30_X20_X2A_X20_X2A_X20_X2A_X20_X2A_X20_X2A), - /* K10 */ be_nested_str_weak(matter_sensors_30s), - /* K11 */ be_nested_str_weak(_start_udp), - /* K12 */ be_nested_str_weak(UDP_PORT), - /* K13 */ be_nested_str_weak(start_mdns_announce_hostnames), - }), - be_str_weak(start), - &be_const_str_solidified, - ( &(const binstruction[28]) { /* code */ - 0x88040100, // 0000 GETMBR R1 R0 K0 - 0x78060000, // 0001 JMPF R1 #0003 - 0x80000200, // 0002 RET 0 - 0x88040101, // 0003 GETMBR R1 R0 K1 - 0x8C040302, // 0004 GETMET R1 R1 K2 - 0xB80E0600, // 0005 GETNGBL R3 K3 - 0x8C0C0704, // 0006 GETMET R3 R3 K4 - 0x5C140000, // 0007 MOVE R5 R0 - 0x58180005, // 0008 LDCONST R6 K5 - 0x7C0C0600, // 0009 CALL R3 3 - 0x7C040400, // 000A CALL R1 2 - 0x8C040106, // 000B GETMET R1 R0 K6 - 0x7C040200, // 000C CALL R1 1 - 0xB8060E00, // 000D GETNGBL R1 K7 - 0x8C040308, // 000E GETMET R1 R1 K8 - 0x580C0009, // 000F LDCONST R3 K9 - 0x84100000, // 0010 CLOSURE R4 P0 - 0x5814000A, // 0011 LDCONST R5 K10 - 0x7C040800, // 0012 CALL R1 4 - 0x8C04010B, // 0013 GETMET R1 R0 K11 - 0x880C010C, // 0014 GETMBR R3 R0 K12 - 0x7C040400, // 0015 CALL R1 2 - 0x8C04010D, // 0016 GETMET R1 R0 K13 - 0x7C040200, // 0017 CALL R1 1 - 0x50040200, // 0018 LDBOOL R1 1 0 - 0x90020001, // 0019 SETMBR R0 K0 R1 - 0xA0000000, // 001A CLOSE R0 - 0x80000000, // 001B RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: mdns_remove_PASE -********************************************************************/ -be_local_closure(Matter_Device_mdns_remove_PASE, /* name */ - be_nested_proto( - 12, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[22]) { /* constants */ - /* K0 */ be_nested_str_weak(mdns), /* K1 */ be_nested_str_weak(string), - /* K2 */ be_nested_str_weak(mdns_pase_eth), - /* K3 */ be_nested_str_weak(tasmota), - /* K4 */ be_nested_str_weak(log), - /* K5 */ be_nested_str_weak(format), - /* K6 */ be_nested_str_weak(MTR_X3A_X20calling_X20mdns_X2Eremove_service_X28_X25s_X2C_X20_X25s_X2C_X20_X25s_X2C_X20_X25s_X29), - /* K7 */ be_nested_str_weak(_matterc), - /* K8 */ be_nested_str_weak(_udp), - /* K9 */ be_nested_str_weak(commissioning_instance_eth), - /* K10 */ be_nested_str_weak(hostname_eth), - /* K11 */ be_const_int(3), - /* K12 */ be_nested_str_weak(MTR_X3A_X20remove_X20mDNS_X20on_X20_X25s_X20_X27_X25s_X27), - /* K13 */ be_nested_str_weak(eth), - /* K14 */ be_const_int(2), - /* K15 */ be_nested_str_weak(remove_service), - /* K16 */ be_nested_str_weak(mdns_pase_wifi), - /* K17 */ be_nested_str_weak(commissioning_instance_wifi), - /* K18 */ be_nested_str_weak(hostname_wifi), - /* K19 */ be_nested_str_weak(wifi), - /* K20 */ be_nested_str_weak(MTR_X3A_X20Exception), - /* K21 */ be_nested_str_weak(_X7C), + /* K2 */ be_nested_str_weak(add), + /* K3 */ be_nested_str_weak(PBKDF2_HMAC_SHA256), + /* K4 */ be_nested_str_weak(derive), + /* K5 */ be_const_int(0), + /* K6 */ be_nested_str_weak(root_w0), + /* K7 */ be_nested_str_weak(EC_P256), + /* K8 */ be_nested_str_weak(mod), + /* K9 */ be_nested_str_weak(root_L), + /* K10 */ be_nested_str_weak(public_key), }), - be_str_weak(mdns_remove_PASE), + be_str_weak(_compute_pbkdf), &be_const_str_solidified, - ( &(const binstruction[83]) { /* code */ - 0xA4060000, // 0000 IMPORT R1 K0 - 0xA40A0200, // 0001 IMPORT R2 K1 - 0xA802003D, // 0002 EXBLK 0 #0041 - 0x880C0102, // 0003 GETMBR R3 R0 K2 - 0x780E001B, // 0004 JMPF R3 #0021 - 0xB80E0600, // 0005 GETNGBL R3 K3 - 0x8C0C0704, // 0006 GETMET R3 R3 K4 - 0x8C140505, // 0007 GETMET R5 R2 K5 - 0x581C0006, // 0008 LDCONST R7 K6 - 0x58200007, // 0009 LDCONST R8 K7 - 0x58240008, // 000A LDCONST R9 K8 - 0x88280109, // 000B GETMBR R10 R0 K9 - 0x882C010A, // 000C GETMBR R11 R0 K10 - 0x7C140C00, // 000D CALL R5 6 - 0x5818000B, // 000E LDCONST R6 K11 - 0x7C0C0600, // 000F CALL R3 3 - 0xB80E0600, // 0010 GETNGBL R3 K3 - 0x8C0C0704, // 0011 GETMET R3 R3 K4 - 0x8C140505, // 0012 GETMET R5 R2 K5 - 0x581C000C, // 0013 LDCONST R7 K12 - 0x5820000D, // 0014 LDCONST R8 K13 - 0x88240109, // 0015 GETMBR R9 R0 K9 - 0x7C140800, // 0016 CALL R5 4 - 0x5818000E, // 0017 LDCONST R6 K14 - 0x7C0C0600, // 0018 CALL R3 3 - 0x500C0000, // 0019 LDBOOL R3 0 0 - 0x90020403, // 001A SETMBR R0 K2 R3 - 0x8C0C030F, // 001B GETMET R3 R1 K15 - 0x58140007, // 001C LDCONST R5 K7 - 0x58180008, // 001D LDCONST R6 K8 - 0x881C0109, // 001E GETMBR R7 R0 K9 - 0x8820010A, // 001F GETMBR R8 R0 K10 - 0x7C0C0A00, // 0020 CALL R3 5 - 0x880C0110, // 0021 GETMBR R3 R0 K16 - 0x780E001B, // 0022 JMPF R3 #003F - 0xB80E0600, // 0023 GETNGBL R3 K3 - 0x8C0C0704, // 0024 GETMET R3 R3 K4 - 0x8C140505, // 0025 GETMET R5 R2 K5 - 0x581C0006, // 0026 LDCONST R7 K6 - 0x58200007, // 0027 LDCONST R8 K7 - 0x58240008, // 0028 LDCONST R9 K8 - 0x88280111, // 0029 GETMBR R10 R0 K17 - 0x882C0112, // 002A GETMBR R11 R0 K18 - 0x7C140C00, // 002B CALL R5 6 - 0x5818000B, // 002C LDCONST R6 K11 - 0x7C0C0600, // 002D CALL R3 3 - 0xB80E0600, // 002E GETNGBL R3 K3 - 0x8C0C0704, // 002F GETMET R3 R3 K4 - 0x8C140505, // 0030 GETMET R5 R2 K5 - 0x581C000C, // 0031 LDCONST R7 K12 - 0x58200013, // 0032 LDCONST R8 K19 - 0x88240111, // 0033 GETMBR R9 R0 K17 - 0x7C140800, // 0034 CALL R5 4 - 0x5818000E, // 0035 LDCONST R6 K14 - 0x7C0C0600, // 0036 CALL R3 3 - 0x500C0000, // 0037 LDBOOL R3 0 0 - 0x90022003, // 0038 SETMBR R0 K16 R3 - 0x8C0C030F, // 0039 GETMET R3 R1 K15 - 0x58140007, // 003A LDCONST R5 K7 - 0x58180008, // 003B LDCONST R6 K8 - 0x881C0111, // 003C GETMBR R7 R0 K17 - 0x88200112, // 003D GETMBR R8 R0 K18 - 0x7C0C0A00, // 003E CALL R3 5 - 0xA8040001, // 003F EXBLK 1 1 - 0x70020010, // 0040 JMP #0052 - 0xAC0C0002, // 0041 CATCH R3 0 2 - 0x7002000D, // 0042 JMP #0051 - 0xB8160600, // 0043 GETNGBL R5 K3 - 0x8C140B04, // 0044 GETMET R5 R5 K4 - 0x601C0008, // 0045 GETGBL R7 G8 - 0x5C200600, // 0046 MOVE R8 R3 - 0x7C1C0200, // 0047 CALL R7 1 - 0x001E2807, // 0048 ADD R7 K20 R7 - 0x001C0F15, // 0049 ADD R7 R7 K21 - 0x60200008, // 004A GETGBL R8 G8 - 0x5C240800, // 004B MOVE R9 R4 - 0x7C200200, // 004C CALL R8 1 - 0x001C0E08, // 004D ADD R7 R7 R8 - 0x5820000E, // 004E LDCONST R8 K14 - 0x7C140600, // 004F CALL R5 3 - 0x70020000, // 0050 JMP #0052 - 0xB0080000, // 0051 RAISE 2 R0 R0 - 0x80000000, // 0052 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: start_commissioning_complete_deferred -********************************************************************/ -be_local_closure(Matter_Device_start_commissioning_complete_deferred, /* name */ - be_nested_proto( - 6, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 1, /* has sup protos */ - ( &(const struct bproto*[ 1]) { - be_nested_proto( - 3, /* nstack */ - 0, /* argc */ - 0, /* varg */ - 1, /* has upvals */ - ( &(const bupvaldesc[ 2]) { /* upvals */ - be_local_const_upval(1, 0), - be_local_const_upval(1, 1), - }), - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 1]) { /* constants */ - /* K0 */ be_nested_str_weak(start_commissioning_complete), - }), - be_str_weak(_X3Clambda_X3E), - &be_const_str_solidified, - ( &(const binstruction[ 5]) { /* code */ - 0x68000000, // 0000 GETUPV R0 U0 - 0x8C000100, // 0001 GETMET R0 R0 K0 - 0x68080001, // 0002 GETUPV R2 U1 - 0x7C000400, // 0003 CALL R0 2 - 0x80040000, // 0004 RET 1 R0 - }) - ), - }), - 1, /* has constants */ - ( &(const bvalue[ 3]) { /* constants */ - /* K0 */ be_nested_str_weak(tasmota), - /* K1 */ be_nested_str_weak(set_timer), - /* K2 */ be_const_int(0), - }), - be_str_weak(start_commissioning_complete_deferred), - &be_const_str_solidified, - ( &(const binstruction[ 7]) { /* code */ - 0xB80A0000, // 0000 GETNGBL R2 K0 - 0x8C080501, // 0001 GETMET R2 R2 K1 - 0x58100002, // 0002 LDCONST R4 K2 - 0x84140000, // 0003 CLOSURE R5 P0 - 0x7C080600, // 0004 CALL R2 3 - 0xA0000000, // 0005 CLOSE R0 - 0x80000000, // 0006 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: save_before_restart -********************************************************************/ -be_local_closure(Matter_Device_save_before_restart, /* name */ - be_nested_proto( - 3, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 2]) { /* constants */ - /* K0 */ be_nested_str_weak(stop_basic_commissioning), - /* K1 */ be_nested_str_weak(mdns_remove_op_discovery_all_fabrics), - }), - be_str_weak(save_before_restart), - &be_const_str_solidified, - ( &(const binstruction[ 5]) { /* code */ - 0x8C040100, // 0000 GETMET R1 R0 K0 - 0x7C040200, // 0001 CALL R1 1 - 0x8C040101, // 0002 GETMET R1 R0 K1 - 0x7C040200, // 0003 CALL R1 1 - 0x80000000, // 0004 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: _start_udp -********************************************************************/ -be_local_closure(Matter_Device__start_udp, /* name */ - be_nested_proto( - 6, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 1, /* has sup protos */ - ( &(const struct bproto*[ 1]) { - be_nested_proto( - 8, /* nstack */ - 3, /* argc */ - 0, /* varg */ - 1, /* has upvals */ - ( &(const bupvaldesc[ 1]) { /* upvals */ - be_local_const_upval(1, 0), - }), - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 1]) { /* constants */ - /* K0 */ be_nested_str_weak(msg_received), - }), - be_str_weak(_X3Clambda_X3E), - &be_const_str_solidified, - ( &(const binstruction[ 7]) { /* code */ - 0x680C0000, // 0000 GETUPV R3 U0 - 0x8C0C0700, // 0001 GETMET R3 R3 K0 - 0x5C140000, // 0002 MOVE R5 R0 - 0x5C180200, // 0003 MOVE R6 R1 - 0x5C1C0400, // 0004 MOVE R7 R2 - 0x7C0C0800, // 0005 CALL R3 4 - 0x80040600, // 0006 RET 1 R3 - }) - ), - }), - 1, /* has constants */ - ( &(const bvalue[ 9]) { /* constants */ - /* K0 */ be_nested_str_weak(udp_server), - /* K1 */ be_nested_str_weak(tasmota), - /* K2 */ be_nested_str_weak(log), - /* K3 */ be_nested_str_weak(MTR_X3A_X20starting_X20UDP_X20server_X20on_X20port_X3A_X20), - /* K4 */ be_const_int(2), - /* K5 */ be_nested_str_weak(matter), - /* K6 */ be_nested_str_weak(UDPServer), - /* K7 */ be_nested_str_weak(), - /* K8 */ be_nested_str_weak(start), - }), - be_str_weak(_start_udp), - &be_const_str_solidified, - ( &(const binstruction[27]) { /* code */ - 0x88080100, // 0000 GETMBR R2 R0 K0 - 0x780A0000, // 0001 JMPF R2 #0003 - 0x80000400, // 0002 RET 0 - 0x4C080000, // 0003 LDNIL R2 - 0x1C080202, // 0004 EQ R2 R1 R2 - 0x780A0000, // 0005 JMPF R2 #0007 - 0x540615A3, // 0006 LDINT R1 5540 - 0xB80A0200, // 0007 GETNGBL R2 K1 - 0x8C080502, // 0008 GETMET R2 R2 K2 - 0x60100008, // 0009 GETGBL R4 G8 - 0x5C140200, // 000A MOVE R5 R1 - 0x7C100200, // 000B CALL R4 1 - 0x00120604, // 000C ADD R4 K3 R4 - 0x58140004, // 000D LDCONST R5 K4 - 0x7C080600, // 000E CALL R2 3 - 0xB80A0A00, // 000F GETNGBL R2 K5 - 0x8C080506, // 0010 GETMET R2 R2 K6 - 0x58100007, // 0011 LDCONST R4 K7 - 0x5C140200, // 0012 MOVE R5 R1 - 0x7C080600, // 0013 CALL R2 3 - 0x90020002, // 0014 SETMBR R0 K0 R2 - 0x88080100, // 0015 GETMBR R2 R0 K0 - 0x8C080508, // 0016 GETMET R2 R2 K8 - 0x84100000, // 0017 CLOSURE R4 P0 - 0x7C080400, // 0018 CALL R2 2 - 0xA0000000, // 0019 CLOSE R0 - 0x80000000, // 001A RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: register_commands -********************************************************************/ -be_local_closure(Matter_Device_register_commands, /* name */ - be_nested_proto( - 5, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 1, /* has sup protos */ - ( &(const struct bproto*[ 1]) { - be_nested_proto( - 10, /* nstack */ - 4, /* argc */ - 0, /* varg */ - 1, /* has upvals */ - ( &(const bupvaldesc[ 1]) { /* upvals */ - be_local_const_upval(1, 0), - }), - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 1]) { /* constants */ - /* K0 */ be_nested_str_weak(MtrJoin), - }), - be_str_weak(_X3Clambda_X3E), - &be_const_str_solidified, - ( &(const binstruction[ 8]) { /* code */ - 0x68100000, // 0000 GETUPV R4 U0 - 0x8C100900, // 0001 GETMET R4 R4 K0 - 0x5C180000, // 0002 MOVE R6 R0 - 0x5C1C0200, // 0003 MOVE R7 R1 - 0x5C200400, // 0004 MOVE R8 R2 - 0x5C240600, // 0005 MOVE R9 R3 - 0x7C100A00, // 0006 CALL R4 5 - 0x80040800, // 0007 RET 1 R4 - }) - ), - }), - 1, /* has constants */ - ( &(const bvalue[ 3]) { /* constants */ - /* K0 */ be_nested_str_weak(tasmota), - /* K1 */ be_nested_str_weak(add_cmd), - /* K2 */ be_nested_str_weak(MtrJoin), - }), - be_str_weak(register_commands), - &be_const_str_solidified, - ( &(const binstruction[ 7]) { /* code */ - 0xB8060000, // 0000 GETNGBL R1 K0 - 0x8C040301, // 0001 GETMET R1 R1 K1 - 0x580C0002, // 0002 LDCONST R3 K2 - 0x84100000, // 0003 CLOSURE R4 P0 - 0x7C040600, // 0004 CALL R1 3 - 0xA0000000, // 0005 CLOSE R0 - 0x80000000, // 0006 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: start_basic_commissioning -********************************************************************/ -be_local_closure(Matter_Device_start_basic_commissioning, /* name */ - be_nested_proto( - 13, /* nstack */ - 8, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 1, /* has sup protos */ - ( &(const struct bproto*[ 2]) { - be_nested_proto( - 4, /* nstack */ - 0, /* argc */ - 0, /* varg */ - 1, /* has upvals */ - ( &(const bupvaldesc[ 1]) { /* upvals */ - be_local_const_upval(1, 0), - }), - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 4]) { /* constants */ - /* K0 */ be_nested_str_weak(mdns_announce_PASE), - /* K1 */ be_nested_str_weak(tasmota), - /* K2 */ be_nested_str_weak(remove_rule), - /* K3 */ be_nested_str_weak(Wifi_X23Connected), - }), - be_str_weak(_anonymous_), - &be_const_str_solidified, - ( &(const binstruction[ 9]) { /* code */ - 0x68000000, // 0000 GETUPV R0 U0 - 0x8C000100, // 0001 GETMET R0 R0 K0 - 0x7C000200, // 0002 CALL R0 1 - 0xB8020200, // 0003 GETNGBL R0 K1 - 0x8C000102, // 0004 GETMET R0 R0 K2 - 0x58080003, // 0005 LDCONST R2 K3 - 0x580C0000, // 0006 LDCONST R3 K0 - 0x7C000600, // 0007 CALL R0 3 - 0x80000000, // 0008 RET 0 - }) - ), - be_nested_proto( - 4, /* nstack */ - 0, /* argc */ - 0, /* varg */ - 1, /* has upvals */ - ( &(const bupvaldesc[ 1]) { /* upvals */ - be_local_const_upval(1, 0), - }), - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 4]) { /* constants */ - /* K0 */ be_nested_str_weak(mdns_announce_PASE), - /* K1 */ be_nested_str_weak(tasmota), - /* K2 */ be_nested_str_weak(remove_rule), - /* K3 */ be_nested_str_weak(Eth_X23Connected), - }), - be_str_weak(_anonymous_), - &be_const_str_solidified, - ( &(const binstruction[ 9]) { /* code */ - 0x68000000, // 0000 GETUPV R0 U0 - 0x8C000100, // 0001 GETMET R0 R0 K0 - 0x7C000200, // 0002 CALL R0 1 - 0xB8020200, // 0003 GETNGBL R0 K1 - 0x8C000102, // 0004 GETMET R0 R0 K2 - 0x58080003, // 0005 LDCONST R2 K3 - 0x580C0000, // 0006 LDCONST R3 K0 - 0x7C000600, // 0007 CALL R0 3 - 0x80000000, // 0008 RET 0 - }) - ), - }), - 1, /* has constants */ - ( &(const bvalue[16]) { /* constants */ - /* K0 */ be_nested_str_weak(commissioning_open), - /* K1 */ be_nested_str_weak(tasmota), - /* K2 */ be_nested_str_weak(millis), - /* K3 */ be_nested_str_weak(commissioning_iterations), - /* K4 */ be_nested_str_weak(commissioning_discriminator), - /* K5 */ be_nested_str_weak(commissioning_salt), - /* K6 */ be_nested_str_weak(commissioning_w0), - /* K7 */ be_nested_str_weak(commissioning_L), - /* K8 */ be_nested_str_weak(commissioning_admin_fabric), - /* K9 */ be_nested_str_weak(wifi), - /* K10 */ be_nested_str_weak(up), - /* K11 */ be_nested_str_weak(eth), - /* K12 */ be_nested_str_weak(mdns_announce_PASE), - /* K13 */ be_nested_str_weak(add_rule), - /* K14 */ be_nested_str_weak(Wifi_X23Connected), - /* K15 */ be_nested_str_weak(Eth_X23Connected), - }), - be_str_weak(start_basic_commissioning), - &be_const_str_solidified, - ( &(const binstruction[40]) { /* code */ - 0xB8220200, // 0000 GETNGBL R8 K1 - 0x8C201102, // 0001 GETMET R8 R8 K2 - 0x7C200200, // 0002 CALL R8 1 - 0x542603E7, // 0003 LDINT R9 1000 - 0x08240209, // 0004 MUL R9 R1 R9 - 0x00201009, // 0005 ADD R8 R8 R9 - 0x90020008, // 0006 SETMBR R0 K0 R8 - 0x90020602, // 0007 SETMBR R0 K3 R2 - 0x90020803, // 0008 SETMBR R0 K4 R3 - 0x90020A04, // 0009 SETMBR R0 K5 R4 - 0x90020C05, // 000A SETMBR R0 K6 R5 - 0x90020E06, // 000B SETMBR R0 K7 R6 - 0x90021007, // 000C SETMBR R0 K8 R7 - 0xB8220200, // 000D GETNGBL R8 K1 - 0x8C201109, // 000E GETMET R8 R8 K9 - 0x7C200200, // 000F CALL R8 1 - 0x9420110A, // 0010 GETIDX R8 R8 K10 - 0x74220004, // 0011 JMPT R8 #0017 - 0xB8220200, // 0012 GETNGBL R8 K1 - 0x8C20110B, // 0013 GETMET R8 R8 K11 - 0x7C200200, // 0014 CALL R8 1 - 0x9420110A, // 0015 GETIDX R8 R8 K10 - 0x78220002, // 0016 JMPF R8 #001A - 0x8C20010C, // 0017 GETMET R8 R0 K12 - 0x7C200200, // 0018 CALL R8 1 - 0x7002000B, // 0019 JMP #0026 - 0xB8220200, // 001A GETNGBL R8 K1 - 0x8C20110D, // 001B GETMET R8 R8 K13 - 0x5828000E, // 001C LDCONST R10 K14 - 0x842C0000, // 001D CLOSURE R11 P0 - 0x5830000C, // 001E LDCONST R12 K12 - 0x7C200800, // 001F CALL R8 4 - 0xB8220200, // 0020 GETNGBL R8 K1 - 0x8C20110D, // 0021 GETMET R8 R8 K13 - 0x5828000F, // 0022 LDCONST R10 K15 - 0x842C0001, // 0023 CLOSURE R11 P1 - 0x5830000C, // 0024 LDCONST R12 K12 - 0x7C200800, // 0025 CALL R8 4 - 0xA0000000, // 0026 CLOSE R0 - 0x80000000, // 0027 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: remove_fabric -********************************************************************/ -be_local_closure(Matter_Device_remove_fabric, /* name */ - be_nested_proto( - 9, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[12]) { /* constants */ - /* K0 */ be_nested_str_weak(sessions), - /* K1 */ be_nested_str_weak(find_children_fabrics), - /* K2 */ be_nested_str_weak(get_fabric_index), - /* K3 */ be_nested_str_weak(find_fabric_by_index), - /* K4 */ be_nested_str_weak(message_handler), - /* K5 */ be_nested_str_weak(im), - /* K6 */ be_nested_str_weak(subs_shop), - /* K7 */ be_nested_str_weak(remove_by_fabric), - /* K8 */ be_nested_str_weak(mdns_remove_op_discovery), - /* K9 */ be_nested_str_weak(remove_fabric), - /* K10 */ be_nested_str_weak(stop_iteration), - /* K11 */ be_nested_str_weak(save_fabrics), - }), - be_str_weak(remove_fabric), - &be_const_str_solidified, - ( &(const binstruction[43]) { /* code */ - 0x88080100, // 0000 GETMBR R2 R0 K0 - 0x8C080501, // 0001 GETMET R2 R2 K1 - 0x8C100302, // 0002 GETMET R4 R1 K2 - 0x7C100200, // 0003 CALL R4 1 - 0x7C080400, // 0004 CALL R2 2 - 0x4C0C0000, // 0005 LDNIL R3 - 0x1C0C0403, // 0006 EQ R3 R2 R3 - 0x780E0000, // 0007 JMPF R3 #0009 - 0x80000600, // 0008 RET 0 - 0x600C0010, // 0009 GETGBL R3 G16 - 0x5C100400, // 000A MOVE R4 R2 - 0x7C0C0200, // 000B CALL R3 1 - 0xA8020016, // 000C EXBLK 0 #0024 - 0x5C100600, // 000D MOVE R4 R3 - 0x7C100000, // 000E CALL R4 0 - 0x88140100, // 000F GETMBR R5 R0 K0 - 0x8C140B03, // 0010 GETMET R5 R5 K3 - 0x5C1C0800, // 0011 MOVE R7 R4 - 0x7C140400, // 0012 CALL R5 2 - 0x4C180000, // 0013 LDNIL R6 - 0x20180A06, // 0014 NE R6 R5 R6 - 0x781A000C, // 0015 JMPF R6 #0023 - 0x88180104, // 0016 GETMBR R6 R0 K4 - 0x88180D05, // 0017 GETMBR R6 R6 K5 - 0x88180D06, // 0018 GETMBR R6 R6 K6 - 0x8C180D07, // 0019 GETMET R6 R6 K7 - 0x5C200A00, // 001A MOVE R8 R5 - 0x7C180400, // 001B CALL R6 2 - 0x8C180108, // 001C GETMET R6 R0 K8 - 0x5C200A00, // 001D MOVE R8 R5 - 0x7C180400, // 001E CALL R6 2 - 0x88180100, // 001F GETMBR R6 R0 K0 - 0x8C180D09, // 0020 GETMET R6 R6 K9 - 0x5C200A00, // 0021 MOVE R8 R5 - 0x7C180400, // 0022 CALL R6 2 - 0x7001FFE8, // 0023 JMP #000D - 0x580C000A, // 0024 LDCONST R3 K10 - 0xAC0C0200, // 0025 CATCH R3 1 0 - 0xB0080000, // 0026 RAISE 2 R0 R0 - 0x880C0100, // 0027 GETMBR R3 R0 K0 - 0x8C0C070B, // 0028 GETMET R3 R3 K11 - 0x7C0C0200, // 0029 CALL R3 1 - 0x80000000, // 002A RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: attribute_updated -********************************************************************/ -be_local_closure(Matter_Device_attribute_updated, /* name */ - be_nested_proto( - 10, /* nstack */ - 5, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 9]) { /* constants */ - /* K0 */ be_nested_str_weak(matter), - /* K1 */ be_nested_str_weak(Path), - /* K2 */ be_nested_str_weak(endpoint), - /* K3 */ be_nested_str_weak(cluster), - /* K4 */ be_nested_str_weak(attribute), - /* K5 */ be_nested_str_weak(message_handler), - /* K6 */ be_nested_str_weak(im), - /* K7 */ be_nested_str_weak(subs_shop), - /* K8 */ be_nested_str_weak(attribute_updated_ctx), - }), - be_str_weak(attribute_updated), - &be_const_str_solidified, - ( &(const binstruction[18]) { /* code */ - 0x4C140000, // 0000 LDNIL R5 - 0x1C140805, // 0001 EQ R5 R4 R5 - 0x78160000, // 0002 JMPF R5 #0004 - 0x50100000, // 0003 LDBOOL R4 0 0 - 0xB8160000, // 0004 GETNGBL R5 K0 - 0x8C140B01, // 0005 GETMET R5 R5 K1 - 0x7C140200, // 0006 CALL R5 1 - 0x90160401, // 0007 SETMBR R5 K2 R1 - 0x90160602, // 0008 SETMBR R5 K3 R2 - 0x90160803, // 0009 SETMBR R5 K4 R3 - 0x88180105, // 000A GETMBR R6 R0 K5 - 0x88180D06, // 000B GETMBR R6 R6 K6 - 0x88180D07, // 000C GETMBR R6 R6 K7 - 0x8C180D08, // 000D GETMET R6 R6 K8 - 0x5C200A00, // 000E MOVE R8 R5 - 0x5C240800, // 000F MOVE R9 R4 - 0x7C180600, // 0010 CALL R6 3 - 0x80000000, // 0011 RET 0 + ( &(const binstruction[41]) { /* code */ + 0xA4120000, // 0000 IMPORT R4 K0 + 0xA4160200, // 0001 IMPORT R5 K1 + 0x60180015, // 0002 GETGBL R6 G21 + 0x7C180000, // 0003 CALL R6 0 + 0x8C180D02, // 0004 GETMET R6 R6 K2 + 0x5C200200, // 0005 MOVE R8 R1 + 0x54260003, // 0006 LDINT R9 4 + 0x7C180600, // 0007 CALL R6 3 + 0x8C1C0903, // 0008 GETMET R7 R4 K3 + 0x7C1C0200, // 0009 CALL R7 1 + 0x8C1C0F04, // 000A GETMET R7 R7 K4 + 0x5C240C00, // 000B MOVE R9 R6 + 0x5C280600, // 000C MOVE R10 R3 + 0x5C2C0400, // 000D MOVE R11 R2 + 0x5432004F, // 000E LDINT R12 80 + 0x7C1C0A00, // 000F CALL R7 5 + 0x54220026, // 0010 LDINT R8 39 + 0x40220A08, // 0011 CONNECT R8 K5 R8 + 0x94200E08, // 0012 GETIDX R8 R7 R8 + 0x54260027, // 0013 LDINT R9 40 + 0x542A004E, // 0014 LDINT R10 79 + 0x4024120A, // 0015 CONNECT R9 R9 R10 + 0x94240E09, // 0016 GETIDX R9 R7 R9 + 0x8C280907, // 0017 GETMET R10 R4 K7 + 0x7C280200, // 0018 CALL R10 1 + 0x8C281508, // 0019 GETMET R10 R10 K8 + 0x5C301000, // 001A MOVE R12 R8 + 0x7C280400, // 001B CALL R10 2 + 0x90020C0A, // 001C SETMBR R0 K6 R10 + 0x8C280907, // 001D GETMET R10 R4 K7 + 0x7C280200, // 001E CALL R10 1 + 0x8C281508, // 001F GETMET R10 R10 K8 + 0x5C301200, // 0020 MOVE R12 R9 + 0x7C280400, // 0021 CALL R10 2 + 0x8C2C0907, // 0022 GETMET R11 R4 K7 + 0x7C2C0200, // 0023 CALL R11 1 + 0x8C2C170A, // 0024 GETMET R11 R11 K10 + 0x5C341400, // 0025 MOVE R13 R10 + 0x7C2C0400, // 0026 CALL R11 2 + 0x9002120B, // 0027 SETMBR R0 K9 R11 + 0x80000000, // 0028 RET 0 }) ) ); @@ -1013,545 +335,174 @@ be_local_closure(Matter_Device__mdns_announce_hostname, /* name */ /******************************************************************** -** Solidified function: autoconf_device +** Solidified function: mdns_announce_op_discovery ********************************************************************/ -be_local_closure(Matter_Device_autoconf_device, /* name */ +be_local_closure(Matter_Device_mdns_announce_op_discovery, /* name */ be_nested_proto( - 21, /* nstack */ - 1, /* argc */ + 15, /* nstack */ + 2, /* argc */ 2, /* varg */ 0, /* has upvals */ NULL, /* no upvals */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[49]) { /* constants */ - /* K0 */ be_nested_str_weak(string), - /* K1 */ be_nested_str_weak(json), - /* K2 */ be_const_int(1), - /* K3 */ be_nested_str_weak(light), - /* K4 */ be_nested_str_weak(get), - /* K5 */ be_nested_str_weak(find), - /* K6 */ be_nested_str_weak(channels), - /* K7 */ be_nested_str_weak(), - /* K8 */ be_const_int(0), - /* K9 */ be_nested_str_weak(plugins), - /* K10 */ be_nested_str_weak(push), - /* K11 */ be_nested_str_weak(matter), - /* K12 */ be_nested_str_weak(Plugin_Light1), - /* K13 */ be_nested_str_weak(tasmota), - /* K14 */ be_nested_str_weak(log), + ( &(const bvalue[29]) { /* constants */ + /* K0 */ be_nested_str_weak(mdns), + /* K1 */ be_nested_str_weak(string), + /* K2 */ be_nested_str_weak(get_device_id), + /* K3 */ be_nested_str_weak(copy), + /* K4 */ be_nested_str_weak(reverse), + /* K5 */ be_nested_str_weak(get_fabric_compressed), + /* K6 */ be_nested_str_weak(tohex), + /* K7 */ be_nested_str_weak(_X2D), + /* K8 */ be_nested_str_weak(tasmota), + /* K9 */ be_nested_str_weak(log), + /* K10 */ be_nested_str_weak(MTR_X3A_X20Operational_X20Discovery_X20node_X20_X3D_X20), + /* K11 */ be_const_int(2), + /* K12 */ be_nested_str_weak(eth), + /* K13 */ be_nested_str_weak(find), + /* K14 */ be_nested_str_weak(up), /* K15 */ be_nested_str_weak(format), - /* K16 */ be_nested_str_weak(MTR_X3A_X20Endpoint_X3A_X25i_X20Light_Dimmer), - /* K17 */ be_const_int(2), - /* K18 */ be_nested_str_weak(Plugin_Light2), - /* K19 */ be_nested_str_weak(MTR_X3A_X20Endpoint_X3A_X25i_X20Light_CT), - /* K20 */ be_nested_str_weak(Plugin_Light3), - /* K21 */ be_nested_str_weak(MTR_X3A_X20Endpoint_X3A_X25i_X20Light_RGB), - /* K22 */ be_nested_str_weak(get_power), - /* K23 */ be_nested_str_weak(Plugin_OnOff), - /* K24 */ be_nested_str_weak(MTR_X3A_X20Endpoint_X3A_X25i_X20Relay__X25i), - /* K25 */ be_nested_str_weak(load), - /* K26 */ be_nested_str_weak(read_sensors), - /* K27 */ be_nested_str_weak(k2l), - /* K28 */ be_nested_str_weak(contains), - /* K29 */ be_nested_str_weak(Temperature), - /* K30 */ be_nested_str_weak(_X23Temperature), - /* K31 */ be_nested_str_weak(Plugin_Sensor_Temp), - /* K32 */ be_nested_str_weak(MTR_X3A_X20Endpoint_X3A_X25i_X20Temperature_X20_X28_X25s_X29), - /* K33 */ be_nested_str_weak(stop_iteration), - /* K34 */ be_nested_str_weak(Pressure), - /* K35 */ be_nested_str_weak(_X23Pressure), - /* K36 */ be_nested_str_weak(Plugin_Sensor_Pressure), - /* K37 */ be_nested_str_weak(MTR_X3A_X20Endpoint_X3A_X25i_X20Pressure_X20_X28_X25s_X29), - /* K38 */ be_nested_str_weak(Illuminance), - /* K39 */ be_nested_str_weak(_X23Illuminance), - /* K40 */ be_nested_str_weak(Plugin_Sensor_Light), - /* K41 */ be_nested_str_weak(MTR_X3A_X20Endpoint_X3A_X25i_X20Light_X20_X28_X25s_X29), - /* K42 */ be_nested_str_weak(Humidity), - /* K43 */ be_nested_str_weak(_X23Humidity), - /* K44 */ be_nested_str_weak(Plugin_Sensor_Humidity), - /* K45 */ be_nested_str_weak(MTR_X3A_X20Endpoint_X3A_X25i_X20Humidity_X20_X28_X25s_X29), - /* K46 */ be_nested_str_weak(publish_result), - /* K47 */ be_nested_str_weak(_X7B_X22Matter_X22_X3A_X7B_X22Initialized_X22_X3A1_X7D_X7D), - /* K48 */ be_nested_str_weak(Matter), + /* K16 */ be_nested_str_weak(MTR_X3A_X20adding_X20mDNS_X20on_X20_X25s_X20_X27_X25s_X27_X20ptr_X20to_X20_X60_X25s_X2Elocal_X60), + /* K17 */ be_nested_str_weak(hostname_eth), + /* K18 */ be_const_int(3), + /* K19 */ be_nested_str_weak(add_service), + /* K20 */ be_nested_str_weak(_matter), + /* K21 */ be_nested_str_weak(_tcp), + /* K22 */ be_nested_str_weak(_I), + /* K23 */ be_nested_str_weak(MTR_X3A_X20adding_X20subtype_X3A_X20), + /* K24 */ be_nested_str_weak(add_subtype), + /* K25 */ be_nested_str_weak(wifi), + /* K26 */ be_nested_str_weak(hostname_wifi), + /* K27 */ be_nested_str_weak(MTR_X3A_X20Exception), + /* K28 */ be_nested_str_weak(_X7C), }), - be_str_weak(autoconf_device), + be_str_weak(mdns_announce_op_discovery), &be_const_str_solidified, - ( &(const binstruction[312]) { /* code */ - 0xA4060000, // 0000 IMPORT R1 K0 - 0xA40A0200, // 0001 IMPORT R2 K1 - 0x580C0002, // 0002 LDCONST R3 K2 - 0x50100000, // 0003 LDBOOL R4 0 0 - 0xA4160600, // 0004 IMPORT R5 K3 - 0x8C180B04, // 0005 GETMET R6 R5 K4 - 0x7C180200, // 0006 CALL R6 1 - 0x4C1C0000, // 0007 LDNIL R7 - 0x201C0C07, // 0008 NE R7 R6 R7 - 0x781E003F, // 0009 JMPF R7 #004A - 0x601C000C, // 000A GETGBL R7 G12 - 0x8C200D05, // 000B GETMET R8 R6 K5 - 0x58280006, // 000C LDCONST R10 K6 - 0x582C0007, // 000D LDCONST R11 K7 - 0x7C200600, // 000E CALL R8 3 + ( &(const binstruction[122]) { /* code */ + 0xA40A0000, // 0000 IMPORT R2 K0 + 0xA40E0200, // 0001 IMPORT R3 K1 + 0xA8020064, // 0002 EXBLK 0 #0068 + 0x8C100302, // 0003 GETMET R4 R1 K2 + 0x7C100200, // 0004 CALL R4 1 + 0x8C100903, // 0005 GETMET R4 R4 K3 + 0x7C100200, // 0006 CALL R4 1 + 0x8C100904, // 0007 GETMET R4 R4 K4 + 0x7C100200, // 0008 CALL R4 1 + 0x8C140305, // 0009 GETMET R5 R1 K5 + 0x7C140200, // 000A CALL R5 1 + 0x8C180B06, // 000B GETMET R6 R5 K6 + 0x7C180200, // 000C CALL R6 1 + 0x00180D07, // 000D ADD R6 R6 K7 + 0x8C1C0906, // 000E GETMET R7 R4 K6 0x7C1C0200, // 000F CALL R7 1 - 0x24200F08, // 0010 GT R8 R7 K8 - 0x78220037, // 0011 JMPF R8 #004A - 0x1C200F02, // 0012 EQ R8 R7 K2 - 0x78220010, // 0013 JMPF R8 #0025 - 0x88200109, // 0014 GETMBR R8 R0 K9 - 0x8C20110A, // 0015 GETMET R8 R8 K10 - 0xB82A1600, // 0016 GETNGBL R10 K11 - 0x8C28150C, // 0017 GETMET R10 R10 K12 - 0x5C300000, // 0018 MOVE R12 R0 - 0x5C340600, // 0019 MOVE R13 R3 - 0x7C280600, // 001A CALL R10 3 - 0x7C200400, // 001B CALL R8 2 - 0xB8221A00, // 001C GETNGBL R8 K13 - 0x8C20110E, // 001D GETMET R8 R8 K14 - 0x8C28030F, // 001E GETMET R10 R1 K15 - 0x58300010, // 001F LDCONST R12 K16 - 0x5C340600, // 0020 MOVE R13 R3 - 0x7C280600, // 0021 CALL R10 3 - 0x582C0011, // 0022 LDCONST R11 K17 - 0x7C200600, // 0023 CALL R8 3 - 0x70020022, // 0024 JMP #0048 - 0x1C200F11, // 0025 EQ R8 R7 K17 - 0x78220010, // 0026 JMPF R8 #0038 - 0x88200109, // 0027 GETMBR R8 R0 K9 - 0x8C20110A, // 0028 GETMET R8 R8 K10 - 0xB82A1600, // 0029 GETNGBL R10 K11 - 0x8C281512, // 002A GETMET R10 R10 K18 - 0x5C300000, // 002B MOVE R12 R0 - 0x5C340600, // 002C MOVE R13 R3 - 0x7C280600, // 002D CALL R10 3 - 0x7C200400, // 002E CALL R8 2 - 0xB8221A00, // 002F GETNGBL R8 K13 - 0x8C20110E, // 0030 GETMET R8 R8 K14 - 0x8C28030F, // 0031 GETMET R10 R1 K15 - 0x58300013, // 0032 LDCONST R12 K19 - 0x5C340600, // 0033 MOVE R13 R3 - 0x7C280600, // 0034 CALL R10 3 - 0x582C0011, // 0035 LDCONST R11 K17 + 0x00180C07, // 0010 ADD R6 R6 R7 + 0xB81E1000, // 0011 GETNGBL R7 K8 + 0x8C1C0F09, // 0012 GETMET R7 R7 K9 + 0x00261406, // 0013 ADD R9 K10 R6 + 0x5828000B, // 0014 LDCONST R10 K11 + 0x7C1C0600, // 0015 CALL R7 3 + 0xB81E1000, // 0016 GETNGBL R7 K8 + 0x8C1C0F0C, // 0017 GETMET R7 R7 K12 + 0x7C1C0200, // 0018 CALL R7 1 + 0x8C1C0F0D, // 0019 GETMET R7 R7 K13 + 0x5824000E, // 001A LDCONST R9 K14 + 0x7C1C0400, // 001B CALL R7 2 + 0x781E0020, // 001C JMPF R7 #003E + 0xB81E1000, // 001D GETNGBL R7 K8 + 0x8C1C0F09, // 001E GETMET R7 R7 K9 + 0x8C24070F, // 001F GETMET R9 R3 K15 + 0x582C0010, // 0020 LDCONST R11 K16 + 0x5830000C, // 0021 LDCONST R12 K12 + 0x5C340C00, // 0022 MOVE R13 R6 + 0x88380111, // 0023 GETMBR R14 R0 K17 + 0x7C240A00, // 0024 CALL R9 5 + 0x58280012, // 0025 LDCONST R10 K18 + 0x7C1C0600, // 0026 CALL R7 3 + 0x8C1C0513, // 0027 GETMET R7 R2 K19 + 0x58240014, // 0028 LDCONST R9 K20 + 0x58280015, // 0029 LDCONST R10 K21 + 0x542E15A3, // 002A LDINT R11 5540 + 0x4C300000, // 002B LDNIL R12 + 0x5C340C00, // 002C MOVE R13 R6 + 0x88380111, // 002D GETMBR R14 R0 K17 + 0x7C1C0E00, // 002E CALL R7 7 + 0x8C1C0B06, // 002F GETMET R7 R5 K6 + 0x7C1C0200, // 0030 CALL R7 1 + 0x001E2C07, // 0031 ADD R7 K22 R7 + 0xB8221000, // 0032 GETNGBL R8 K8 + 0x8C201109, // 0033 GETMET R8 R8 K9 + 0x002A2E07, // 0034 ADD R10 K23 R7 + 0x582C0012, // 0035 LDCONST R11 K18 0x7C200600, // 0036 CALL R8 3 - 0x7002000F, // 0037 JMP #0048 - 0x88200109, // 0038 GETMBR R8 R0 K9 - 0x8C20110A, // 0039 GETMET R8 R8 K10 - 0xB82A1600, // 003A GETNGBL R10 K11 - 0x8C281514, // 003B GETMET R10 R10 K20 - 0x5C300000, // 003C MOVE R12 R0 - 0x5C340600, // 003D MOVE R13 R3 - 0x7C280600, // 003E CALL R10 3 - 0x7C200400, // 003F CALL R8 2 - 0xB8221A00, // 0040 GETNGBL R8 K13 - 0x8C20110E, // 0041 GETMET R8 R8 K14 - 0x8C28030F, // 0042 GETMET R10 R1 K15 - 0x58300015, // 0043 LDCONST R12 K21 - 0x5C340600, // 0044 MOVE R13 R3 - 0x7C280600, // 0045 CALL R10 3 - 0x582C0011, // 0046 LDCONST R11 K17 - 0x7C200600, // 0047 CALL R8 3 - 0x50100200, // 0048 LDBOOL R4 1 0 - 0x000C0702, // 0049 ADD R3 R3 K2 - 0x601C000C, // 004A GETGBL R7 G12 - 0xB8221A00, // 004B GETNGBL R8 K13 - 0x8C201116, // 004C GETMET R8 R8 K22 - 0x7C200200, // 004D CALL R8 1 - 0x7C1C0200, // 004E CALL R7 1 - 0x58200008, // 004F LDCONST R8 K8 - 0x78120000, // 0050 JMPF R4 #0052 - 0x041C0F02, // 0051 SUB R7 R7 K2 - 0x14241007, // 0052 LT R9 R8 R7 - 0x78260014, // 0053 JMPF R9 #0069 - 0x88240109, // 0054 GETMBR R9 R0 K9 - 0x8C24130A, // 0055 GETMET R9 R9 K10 - 0xB82E1600, // 0056 GETNGBL R11 K11 - 0x8C2C1717, // 0057 GETMET R11 R11 K23 - 0x5C340000, // 0058 MOVE R13 R0 - 0x5C380600, // 0059 MOVE R14 R3 - 0x5C3C1000, // 005A MOVE R15 R8 - 0x7C2C0800, // 005B CALL R11 4 - 0x7C240400, // 005C CALL R9 2 - 0xB8261A00, // 005D GETNGBL R9 K13 - 0x8C24130E, // 005E GETMET R9 R9 K14 - 0x8C2C030F, // 005F GETMET R11 R1 K15 - 0x58340018, // 0060 LDCONST R13 K24 - 0x5C380600, // 0061 MOVE R14 R3 - 0x003C1102, // 0062 ADD R15 R8 K2 - 0x7C2C0800, // 0063 CALL R11 4 - 0x58300011, // 0064 LDCONST R12 K17 - 0x7C240600, // 0065 CALL R9 3 - 0x00201102, // 0066 ADD R8 R8 K2 - 0x000C0702, // 0067 ADD R3 R3 K2 - 0x7001FFE8, // 0068 JMP #0052 - 0x8C240519, // 0069 GETMET R9 R2 K25 - 0xB82E1A00, // 006A GETNGBL R11 K13 - 0x8C2C171A, // 006B GETMET R11 R11 K26 - 0x7C2C0200, // 006C CALL R11 1 - 0x7C240400, // 006D CALL R9 2 - 0x540E001F, // 006E LDINT R3 32 - 0x60280010, // 006F GETGBL R10 G16 - 0x8C2C011B, // 0070 GETMET R11 R0 K27 - 0x5C341200, // 0071 MOVE R13 R9 - 0x7C2C0400, // 0072 CALL R11 2 - 0x7C280200, // 0073 CALL R10 1 - 0xA8020026, // 0074 EXBLK 0 #009C - 0x5C2C1400, // 0075 MOVE R11 R10 - 0x7C2C0000, // 0076 CALL R11 0 - 0x9430120B, // 0077 GETIDX R12 R9 R11 - 0x6034000F, // 0078 GETGBL R13 G15 - 0x5C381800, // 0079 MOVE R14 R12 - 0x603C0013, // 007A GETGBL R15 G19 - 0x7C340400, // 007B CALL R13 2 - 0x78360017, // 007C JMPF R13 #0095 - 0x8C34191C, // 007D GETMET R13 R12 K28 - 0x583C001D, // 007E LDCONST R15 K29 - 0x7C340400, // 007F CALL R13 2 - 0x78360013, // 0080 JMPF R13 #0095 - 0x0034171E, // 0081 ADD R13 R11 K30 - 0x88380109, // 0082 GETMBR R14 R0 K9 - 0x8C381D0A, // 0083 GETMET R14 R14 K10 - 0xB8421600, // 0084 GETNGBL R16 K11 - 0x8C40211F, // 0085 GETMET R16 R16 K31 - 0x5C480000, // 0086 MOVE R18 R0 - 0x5C4C0600, // 0087 MOVE R19 R3 - 0x5C501A00, // 0088 MOVE R20 R13 - 0x7C400800, // 0089 CALL R16 4 - 0x7C380400, // 008A CALL R14 2 - 0xB83A1A00, // 008B GETNGBL R14 K13 - 0x8C381D0E, // 008C GETMET R14 R14 K14 - 0x8C40030F, // 008D GETMET R16 R1 K15 - 0x58480020, // 008E LDCONST R18 K32 - 0x5C4C0600, // 008F MOVE R19 R3 - 0x5C501A00, // 0090 MOVE R20 R13 - 0x7C400800, // 0091 CALL R16 4 - 0x58440011, // 0092 LDCONST R17 K17 - 0x7C380600, // 0093 CALL R14 3 - 0x000C0702, // 0094 ADD R3 R3 K2 - 0x54360027, // 0095 LDINT R13 40 - 0x2434060D, // 0096 GT R13 R3 R13 - 0x78360000, // 0097 JMPF R13 #0099 - 0x70020000, // 0098 JMP #009A - 0x7001FFDA, // 0099 JMP #0075 - 0xA8040001, // 009A EXBLK 1 1 - 0x70020002, // 009B JMP #009F - 0x58280021, // 009C LDCONST R10 K33 - 0xAC280200, // 009D CATCH R10 1 0 - 0xB0080000, // 009E RAISE 2 R0 R0 - 0x540E0027, // 009F LDINT R3 40 - 0x60280010, // 00A0 GETGBL R10 G16 - 0x8C2C011B, // 00A1 GETMET R11 R0 K27 - 0x5C341200, // 00A2 MOVE R13 R9 - 0x7C2C0400, // 00A3 CALL R11 2 - 0x7C280200, // 00A4 CALL R10 1 - 0xA8020026, // 00A5 EXBLK 0 #00CD - 0x5C2C1400, // 00A6 MOVE R11 R10 - 0x7C2C0000, // 00A7 CALL R11 0 - 0x9430120B, // 00A8 GETIDX R12 R9 R11 - 0x6034000F, // 00A9 GETGBL R13 G15 - 0x5C381800, // 00AA MOVE R14 R12 - 0x603C0013, // 00AB GETGBL R15 G19 - 0x7C340400, // 00AC CALL R13 2 - 0x78360017, // 00AD JMPF R13 #00C6 - 0x8C34191C, // 00AE GETMET R13 R12 K28 - 0x583C0022, // 00AF LDCONST R15 K34 - 0x7C340400, // 00B0 CALL R13 2 - 0x78360013, // 00B1 JMPF R13 #00C6 - 0x00341723, // 00B2 ADD R13 R11 K35 - 0x88380109, // 00B3 GETMBR R14 R0 K9 - 0x8C381D0A, // 00B4 GETMET R14 R14 K10 - 0xB8421600, // 00B5 GETNGBL R16 K11 - 0x8C402124, // 00B6 GETMET R16 R16 K36 - 0x5C480000, // 00B7 MOVE R18 R0 - 0x5C4C0600, // 00B8 MOVE R19 R3 - 0x5C501A00, // 00B9 MOVE R20 R13 - 0x7C400800, // 00BA CALL R16 4 - 0x7C380400, // 00BB CALL R14 2 - 0xB83A1A00, // 00BC GETNGBL R14 K13 - 0x8C381D0E, // 00BD GETMET R14 R14 K14 - 0x8C40030F, // 00BE GETMET R16 R1 K15 - 0x58480025, // 00BF LDCONST R18 K37 - 0x5C4C0600, // 00C0 MOVE R19 R3 - 0x5C501A00, // 00C1 MOVE R20 R13 - 0x7C400800, // 00C2 CALL R16 4 - 0x58440011, // 00C3 LDCONST R17 K17 - 0x7C380600, // 00C4 CALL R14 3 - 0x000C0702, // 00C5 ADD R3 R3 K2 - 0x5436002E, // 00C6 LDINT R13 47 - 0x2434060D, // 00C7 GT R13 R3 R13 - 0x78360000, // 00C8 JMPF R13 #00CA - 0x70020000, // 00C9 JMP #00CB - 0x7001FFDA, // 00CA JMP #00A6 - 0xA8040001, // 00CB EXBLK 1 1 - 0x70020002, // 00CC JMP #00D0 - 0x58280021, // 00CD LDCONST R10 K33 - 0xAC280200, // 00CE CATCH R10 1 0 - 0xB0080000, // 00CF RAISE 2 R0 R0 - 0x540E002F, // 00D0 LDINT R3 48 - 0x60280010, // 00D1 GETGBL R10 G16 - 0x8C2C011B, // 00D2 GETMET R11 R0 K27 - 0x5C341200, // 00D3 MOVE R13 R9 - 0x7C2C0400, // 00D4 CALL R11 2 - 0x7C280200, // 00D5 CALL R10 1 - 0xA8020026, // 00D6 EXBLK 0 #00FE - 0x5C2C1400, // 00D7 MOVE R11 R10 - 0x7C2C0000, // 00D8 CALL R11 0 - 0x9430120B, // 00D9 GETIDX R12 R9 R11 - 0x6034000F, // 00DA GETGBL R13 G15 - 0x5C381800, // 00DB MOVE R14 R12 - 0x603C0013, // 00DC GETGBL R15 G19 - 0x7C340400, // 00DD CALL R13 2 - 0x78360017, // 00DE JMPF R13 #00F7 - 0x8C34191C, // 00DF GETMET R13 R12 K28 - 0x583C0026, // 00E0 LDCONST R15 K38 - 0x7C340400, // 00E1 CALL R13 2 - 0x78360013, // 00E2 JMPF R13 #00F7 - 0x00341727, // 00E3 ADD R13 R11 K39 - 0x88380109, // 00E4 GETMBR R14 R0 K9 - 0x8C381D0A, // 00E5 GETMET R14 R14 K10 - 0xB8421600, // 00E6 GETNGBL R16 K11 - 0x8C402128, // 00E7 GETMET R16 R16 K40 - 0x5C480000, // 00E8 MOVE R18 R0 - 0x5C4C0600, // 00E9 MOVE R19 R3 - 0x5C501A00, // 00EA MOVE R20 R13 - 0x7C400800, // 00EB CALL R16 4 - 0x7C380400, // 00EC CALL R14 2 - 0xB83A1A00, // 00ED GETNGBL R14 K13 - 0x8C381D0E, // 00EE GETMET R14 R14 K14 - 0x8C40030F, // 00EF GETMET R16 R1 K15 - 0x58480029, // 00F0 LDCONST R18 K41 - 0x5C4C0600, // 00F1 MOVE R19 R3 - 0x5C501A00, // 00F2 MOVE R20 R13 - 0x7C400800, // 00F3 CALL R16 4 - 0x58440011, // 00F4 LDCONST R17 K17 - 0x7C380600, // 00F5 CALL R14 3 - 0x000C0702, // 00F6 ADD R3 R3 K2 - 0x54360037, // 00F7 LDINT R13 56 - 0x2434060D, // 00F8 GT R13 R3 R13 - 0x78360000, // 00F9 JMPF R13 #00FB - 0x70020000, // 00FA JMP #00FC - 0x7001FFDA, // 00FB JMP #00D7 - 0xA8040001, // 00FC EXBLK 1 1 - 0x70020002, // 00FD JMP #0101 - 0x58280021, // 00FE LDCONST R10 K33 - 0xAC280200, // 00FF CATCH R10 1 0 - 0xB0080000, // 0100 RAISE 2 R0 R0 - 0x540E0037, // 0101 LDINT R3 56 - 0x60280010, // 0102 GETGBL R10 G16 - 0x8C2C011B, // 0103 GETMET R11 R0 K27 - 0x5C341200, // 0104 MOVE R13 R9 - 0x7C2C0400, // 0105 CALL R11 2 - 0x7C280200, // 0106 CALL R10 1 - 0xA8020026, // 0107 EXBLK 0 #012F - 0x5C2C1400, // 0108 MOVE R11 R10 - 0x7C2C0000, // 0109 CALL R11 0 - 0x9430120B, // 010A GETIDX R12 R9 R11 - 0x6034000F, // 010B GETGBL R13 G15 - 0x5C381800, // 010C MOVE R14 R12 - 0x603C0013, // 010D GETGBL R15 G19 - 0x7C340400, // 010E CALL R13 2 - 0x78360017, // 010F JMPF R13 #0128 - 0x8C34191C, // 0110 GETMET R13 R12 K28 - 0x583C002A, // 0111 LDCONST R15 K42 - 0x7C340400, // 0112 CALL R13 2 - 0x78360013, // 0113 JMPF R13 #0128 - 0x0034172B, // 0114 ADD R13 R11 K43 - 0x88380109, // 0115 GETMBR R14 R0 K9 - 0x8C381D0A, // 0116 GETMET R14 R14 K10 - 0xB8421600, // 0117 GETNGBL R16 K11 - 0x8C40212C, // 0118 GETMET R16 R16 K44 - 0x5C480000, // 0119 MOVE R18 R0 - 0x5C4C0600, // 011A MOVE R19 R3 - 0x5C501A00, // 011B MOVE R20 R13 - 0x7C400800, // 011C CALL R16 4 - 0x7C380400, // 011D CALL R14 2 - 0xB83A1A00, // 011E GETNGBL R14 K13 - 0x8C381D0E, // 011F GETMET R14 R14 K14 - 0x8C40030F, // 0120 GETMET R16 R1 K15 - 0x5848002D, // 0121 LDCONST R18 K45 - 0x5C4C0600, // 0122 MOVE R19 R3 - 0x5C501A00, // 0123 MOVE R20 R13 - 0x7C400800, // 0124 CALL R16 4 - 0x58440011, // 0125 LDCONST R17 K17 - 0x7C380600, // 0126 CALL R14 3 - 0x000C0702, // 0127 ADD R3 R3 K2 - 0x5436003F, // 0128 LDINT R13 64 - 0x2434060D, // 0129 GT R13 R3 R13 - 0x78360000, // 012A JMPF R13 #012C - 0x70020000, // 012B JMP #012D - 0x7001FFDA, // 012C JMP #0108 - 0xA8040001, // 012D EXBLK 1 1 - 0x70020002, // 012E JMP #0132 - 0x58280021, // 012F LDCONST R10 K33 - 0xAC280200, // 0130 CATCH R10 1 0 - 0xB0080000, // 0131 RAISE 2 R0 R0 - 0xB82A1A00, // 0132 GETNGBL R10 K13 - 0x8C28152E, // 0133 GETMET R10 R10 K46 - 0x5830002F, // 0134 LDCONST R12 K47 - 0x58340030, // 0135 LDCONST R13 K48 - 0x7C280600, // 0136 CALL R10 3 - 0x80000000, // 0137 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: _trigger_read_sensors -********************************************************************/ -be_local_closure(Matter_Device__trigger_read_sensors, /* name */ - be_nested_proto( - 8, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[11]) { /* constants */ - /* K0 */ be_nested_str_weak(json), - /* K1 */ be_nested_str_weak(tasmota), - /* K2 */ be_nested_str_weak(read_sensors), - /* K3 */ be_nested_str_weak(load), - /* K4 */ be_const_int(0), - /* K5 */ be_nested_str_weak(plugins), - /* K6 */ be_nested_str_weak(parse_sensors), - /* K7 */ be_const_int(1), - /* K8 */ be_nested_str_weak(log), - /* K9 */ be_nested_str_weak(MTR_X3A_X20unable_X20to_X20parse_X20read_sensors_X3A_X20), - /* K10 */ be_const_int(3), - }), - be_str_weak(_trigger_read_sensors), - &be_const_str_solidified, - ( &(const binstruction[37]) { /* code */ - 0xA4060000, // 0000 IMPORT R1 K0 - 0xB80A0200, // 0001 GETNGBL R2 K1 - 0x8C080502, // 0002 GETMET R2 R2 K2 - 0x7C080200, // 0003 CALL R2 1 - 0x4C0C0000, // 0004 LDNIL R3 - 0x1C0C0403, // 0005 EQ R3 R2 R3 - 0x780E0000, // 0006 JMPF R3 #0008 - 0x80000600, // 0007 RET 0 - 0x8C0C0303, // 0008 GETMET R3 R1 K3 - 0x5C140400, // 0009 MOVE R5 R2 - 0x7C0C0400, // 000A CALL R3 2 - 0x4C100000, // 000B LDNIL R4 - 0x20100604, // 000C NE R4 R3 R4 - 0x7812000D, // 000D JMPF R4 #001C - 0x58100004, // 000E LDCONST R4 K4 - 0x6014000C, // 000F GETGBL R5 G12 - 0x88180105, // 0010 GETMBR R6 R0 K5 - 0x7C140200, // 0011 CALL R5 1 - 0x14140805, // 0012 LT R5 R4 R5 - 0x78160006, // 0013 JMPF R5 #001B - 0x88140105, // 0014 GETMBR R5 R0 K5 - 0x94140A04, // 0015 GETIDX R5 R5 R4 - 0x8C140B06, // 0016 GETMET R5 R5 K6 - 0x5C1C0600, // 0017 MOVE R7 R3 - 0x7C140400, // 0018 CALL R5 2 - 0x00100907, // 0019 ADD R4 R4 K7 - 0x7001FFF3, // 001A JMP #000F - 0x70020007, // 001B JMP #0024 - 0xB8120200, // 001C GETNGBL R4 K1 - 0x8C100908, // 001D GETMET R4 R4 K8 - 0x60180008, // 001E GETGBL R6 G8 - 0x5C1C0400, // 001F MOVE R7 R2 - 0x7C180200, // 0020 CALL R6 1 - 0x001A1206, // 0021 ADD R6 K9 R6 - 0x581C000A, // 0022 LDCONST R7 K10 - 0x7C100600, // 0023 CALL R4 3 - 0x80000000, // 0024 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: get_active_endpoints -********************************************************************/ -be_local_closure(Matter_Device_get_active_endpoints, /* name */ - be_nested_proto( - 9, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 6]) { /* constants */ - /* K0 */ be_nested_str_weak(plugins), - /* K1 */ be_nested_str_weak(get_endpoint), - /* K2 */ be_const_int(0), - /* K3 */ be_nested_str_weak(find), - /* K4 */ be_nested_str_weak(push), - /* K5 */ be_nested_str_weak(stop_iteration), - }), - be_str_weak(get_active_endpoints), - &be_const_str_solidified, - ( &(const binstruction[28]) { /* code */ - 0x60080012, // 0000 GETGBL R2 G18 - 0x7C080000, // 0001 CALL R2 0 - 0x600C0010, // 0002 GETGBL R3 G16 - 0x88100100, // 0003 GETMBR R4 R0 K0 - 0x7C0C0200, // 0004 CALL R3 1 - 0xA8020011, // 0005 EXBLK 0 #0018 - 0x5C100600, // 0006 MOVE R4 R3 - 0x7C100000, // 0007 CALL R4 0 - 0x8C140901, // 0008 GETMET R5 R4 K1 - 0x7C140200, // 0009 CALL R5 1 - 0x78060002, // 000A JMPF R1 #000E - 0x1C180B02, // 000B EQ R6 R5 K2 - 0x781A0000, // 000C JMPF R6 #000E - 0x7001FFF7, // 000D JMP #0006 - 0x8C180503, // 000E GETMET R6 R2 K3 - 0x5C200A00, // 000F MOVE R8 R5 - 0x7C180400, // 0010 CALL R6 2 - 0x4C1C0000, // 0011 LDNIL R7 - 0x1C180C07, // 0012 EQ R6 R6 R7 - 0x781A0002, // 0013 JMPF R6 #0017 - 0x8C180504, // 0014 GETMET R6 R2 K4 - 0x5C200A00, // 0015 MOVE R8 R5 - 0x7C180400, // 0016 CALL R6 2 - 0x7001FFED, // 0017 JMP #0006 - 0x580C0005, // 0018 LDCONST R3 K5 - 0xAC0C0200, // 0019 CATCH R3 1 0 - 0xB0080000, // 001A RAISE 2 R0 R0 - 0x80040400, // 001B RET 1 R2 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: msg_send -********************************************************************/ -be_local_closure(Matter_Device_msg_send, /* name */ - be_nested_proto( - 5, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 2]) { /* constants */ - /* K0 */ be_nested_str_weak(udp_server), - /* K1 */ be_nested_str_weak(send_UDP), - }), - be_str_weak(msg_send), - &be_const_str_solidified, - ( &(const binstruction[ 5]) { /* code */ - 0x88080100, // 0000 GETMBR R2 R0 K0 - 0x8C080501, // 0001 GETMET R2 R2 K1 - 0x5C100200, // 0002 MOVE R4 R1 - 0x7C080400, // 0003 CALL R2 2 - 0x80040400, // 0004 RET 1 R2 + 0x8C200518, // 0037 GETMET R8 R2 K24 + 0x58280014, // 0038 LDCONST R10 K20 + 0x582C0015, // 0039 LDCONST R11 K21 + 0x5C300C00, // 003A MOVE R12 R6 + 0x88340111, // 003B GETMBR R13 R0 K17 + 0x5C380E00, // 003C MOVE R14 R7 + 0x7C200C00, // 003D CALL R8 6 + 0xB81E1000, // 003E GETNGBL R7 K8 + 0x8C1C0F19, // 003F GETMET R7 R7 K25 + 0x7C1C0200, // 0040 CALL R7 1 + 0x8C1C0F0D, // 0041 GETMET R7 R7 K13 + 0x5824000E, // 0042 LDCONST R9 K14 + 0x7C1C0400, // 0043 CALL R7 2 + 0x781E0020, // 0044 JMPF R7 #0066 + 0xB81E1000, // 0045 GETNGBL R7 K8 + 0x8C1C0F09, // 0046 GETMET R7 R7 K9 + 0x8C24070F, // 0047 GETMET R9 R3 K15 + 0x582C0010, // 0048 LDCONST R11 K16 + 0x58300019, // 0049 LDCONST R12 K25 + 0x5C340C00, // 004A MOVE R13 R6 + 0x8838011A, // 004B GETMBR R14 R0 K26 + 0x7C240A00, // 004C CALL R9 5 + 0x58280012, // 004D LDCONST R10 K18 + 0x7C1C0600, // 004E CALL R7 3 + 0x8C1C0513, // 004F GETMET R7 R2 K19 + 0x58240014, // 0050 LDCONST R9 K20 + 0x58280015, // 0051 LDCONST R10 K21 + 0x542E15A3, // 0052 LDINT R11 5540 + 0x4C300000, // 0053 LDNIL R12 + 0x5C340C00, // 0054 MOVE R13 R6 + 0x8838011A, // 0055 GETMBR R14 R0 K26 + 0x7C1C0E00, // 0056 CALL R7 7 + 0x8C1C0B06, // 0057 GETMET R7 R5 K6 + 0x7C1C0200, // 0058 CALL R7 1 + 0x001E2C07, // 0059 ADD R7 K22 R7 + 0xB8221000, // 005A GETNGBL R8 K8 + 0x8C201109, // 005B GETMET R8 R8 K9 + 0x002A2E07, // 005C ADD R10 K23 R7 + 0x582C0012, // 005D LDCONST R11 K18 + 0x7C200600, // 005E CALL R8 3 + 0x8C200518, // 005F GETMET R8 R2 K24 + 0x58280014, // 0060 LDCONST R10 K20 + 0x582C0015, // 0061 LDCONST R11 K21 + 0x5C300C00, // 0062 MOVE R12 R6 + 0x8834011A, // 0063 GETMBR R13 R0 K26 + 0x5C380E00, // 0064 MOVE R14 R7 + 0x7C200C00, // 0065 CALL R8 6 + 0xA8040001, // 0066 EXBLK 1 1 + 0x70020010, // 0067 JMP #0079 + 0xAC100002, // 0068 CATCH R4 0 2 + 0x7002000D, // 0069 JMP #0078 + 0xB81A1000, // 006A GETNGBL R6 K8 + 0x8C180D09, // 006B GETMET R6 R6 K9 + 0x60200008, // 006C GETGBL R8 G8 + 0x5C240800, // 006D MOVE R9 R4 + 0x7C200200, // 006E CALL R8 1 + 0x00223608, // 006F ADD R8 K27 R8 + 0x0020111C, // 0070 ADD R8 R8 K28 + 0x60240008, // 0071 GETGBL R9 G8 + 0x5C280A00, // 0072 MOVE R10 R5 + 0x7C240200, // 0073 CALL R9 1 + 0x00201009, // 0074 ADD R8 R8 R9 + 0x5824000B, // 0075 LDCONST R9 K11 + 0x7C180600, // 0076 CALL R6 3 + 0x70020000, // 0077 JMP #0079 + 0xB0080000, // 0078 RAISE 2 R0 R0 + 0x80000000, // 0079 RET 0 }) ) ); @@ -1597,12 +548,74 @@ be_local_closure(Matter_Device_stop, /* name */ /******************************************************************** -** Solidified function: msg_received +** Solidified function: register_commands ********************************************************************/ -be_local_closure(Matter_Device_msg_received, /* name */ +be_local_closure(Matter_Device_register_commands, /* name */ be_nested_proto( - 9, /* nstack */ - 4, /* argc */ + 5, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 1, /* has sup protos */ + ( &(const struct bproto*[ 1]) { + be_nested_proto( + 10, /* nstack */ + 4, /* argc */ + 0, /* varg */ + 1, /* has upvals */ + ( &(const bupvaldesc[ 1]) { /* upvals */ + be_local_const_upval(1, 0), + }), + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 1]) { /* constants */ + /* K0 */ be_nested_str_weak(MtrJoin), + }), + be_str_weak(_X3Clambda_X3E), + &be_const_str_solidified, + ( &(const binstruction[ 8]) { /* code */ + 0x68100000, // 0000 GETUPV R4 U0 + 0x8C100900, // 0001 GETMET R4 R4 K0 + 0x5C180000, // 0002 MOVE R6 R0 + 0x5C1C0200, // 0003 MOVE R7 R1 + 0x5C200400, // 0004 MOVE R8 R2 + 0x5C240600, // 0005 MOVE R9 R3 + 0x7C100A00, // 0006 CALL R4 5 + 0x80040800, // 0007 RET 1 R4 + }) + ), + }), + 1, /* has constants */ + ( &(const bvalue[ 3]) { /* constants */ + /* K0 */ be_nested_str_weak(tasmota), + /* K1 */ be_nested_str_weak(add_cmd), + /* K2 */ be_nested_str_weak(MtrJoin), + }), + be_str_weak(register_commands), + &be_const_str_solidified, + ( &(const binstruction[ 7]) { /* code */ + 0xB8060000, // 0000 GETNGBL R1 K0 + 0x8C040301, // 0001 GETMET R1 R1 K1 + 0x580C0002, // 0002 LDCONST R3 K2 + 0x84100000, // 0003 CLOSURE R4 P0 + 0x7C040600, // 0004 CALL R1 3 + 0xA0000000, // 0005 CLOSE R0 + 0x80000000, // 0006 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: msg_send +********************************************************************/ +be_local_closure(Matter_Device_msg_send, /* name */ + be_nested_proto( + 5, /* nstack */ + 2, /* argc */ 2, /* varg */ 0, /* has upvals */ NULL, /* no upvals */ @@ -1610,19 +623,180 @@ be_local_closure(Matter_Device_msg_received, /* name */ NULL, /* no sub protos */ 1, /* has constants */ ( &(const bvalue[ 2]) { /* constants */ - /* K0 */ be_nested_str_weak(message_handler), - /* K1 */ be_nested_str_weak(msg_received), + /* K0 */ be_nested_str_weak(udp_server), + /* K1 */ be_nested_str_weak(send_UDP), }), - be_str_weak(msg_received), + be_str_weak(msg_send), &be_const_str_solidified, - ( &(const binstruction[ 7]) { /* code */ - 0x88100100, // 0000 GETMBR R4 R0 K0 - 0x8C100901, // 0001 GETMET R4 R4 K1 - 0x5C180200, // 0002 MOVE R6 R1 - 0x5C1C0400, // 0003 MOVE R7 R2 - 0x5C200600, // 0004 MOVE R8 R3 - 0x7C100800, // 0005 CALL R4 4 - 0x80040800, // 0006 RET 1 R4 + ( &(const binstruction[ 5]) { /* code */ + 0x88080100, // 0000 GETMBR R2 R0 K0 + 0x8C080501, // 0001 GETMET R2 R2 K1 + 0x5C100200, // 0002 MOVE R4 R1 + 0x7C080400, // 0003 CALL R2 2 + 0x80040400, // 0004 RET 1 R2 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: save_param +********************************************************************/ +be_local_closure(Matter_Device_save_param, /* name */ + be_nested_proto( + 10, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[24]) { /* constants */ + /* K0 */ be_nested_str_weak(string), + /* K1 */ be_nested_str_weak(format), + /* K2 */ be_nested_str_weak(_X7B_X22distinguish_X22_X3A_X25i_X2C_X22passcode_X22_X3A_X25i_X2C_X22ipv4only_X22_X3A_X25s), + /* K3 */ be_nested_str_weak(root_discriminator), + /* K4 */ be_nested_str_weak(root_passcode), + /* K5 */ be_nested_str_weak(ipv4only), + /* K6 */ be_nested_str_weak(true), + /* K7 */ be_nested_str_weak(false), + /* K8 */ be_nested_str_weak(plugins_persist), + /* K9 */ be_nested_str_weak(_X2C_X22config_X22_X3A), + /* K10 */ be_nested_str_weak(plugins_to_json), + /* K11 */ be_nested_str_weak(_X7D), + /* K12 */ be_nested_str_weak(FILENAME), + /* K13 */ be_nested_str_weak(w), + /* K14 */ be_nested_str_weak(write), + /* K15 */ be_nested_str_weak(close), + /* K16 */ be_nested_str_weak(tasmota), + /* K17 */ be_nested_str_weak(log), + /* K18 */ be_nested_str_weak(MTR_X3A_X20_X3DSaved_X20_X20_X20_X20_X20parameters_X25s), + /* K19 */ be_nested_str_weak(_X20and_X20condiguration), + /* K20 */ be_nested_str_weak(), + /* K21 */ be_const_int(2), + /* K22 */ be_nested_str_weak(MTR_X3A_X20Session_Store_X3A_X3Asave_X20Exception_X3A), + /* K23 */ be_nested_str_weak(_X7C), + }), + be_str_weak(save_param), + &be_const_str_solidified, + ( &(const binstruction[63]) { /* code */ + 0xA4060000, // 0000 IMPORT R1 K0 + 0x8C080301, // 0001 GETMET R2 R1 K1 + 0x58100002, // 0002 LDCONST R4 K2 + 0x88140103, // 0003 GETMBR R5 R0 K3 + 0x88180104, // 0004 GETMBR R6 R0 K4 + 0x881C0105, // 0005 GETMBR R7 R0 K5 + 0x781E0001, // 0006 JMPF R7 #0009 + 0x581C0006, // 0007 LDCONST R7 K6 + 0x70020000, // 0008 JMP #000A + 0x581C0007, // 0009 LDCONST R7 K7 + 0x7C080A00, // 000A CALL R2 5 + 0x880C0108, // 000B GETMBR R3 R0 K8 + 0x780E0003, // 000C JMPF R3 #0011 + 0x00080509, // 000D ADD R2 R2 K9 + 0x8C0C010A, // 000E GETMET R3 R0 K10 + 0x7C0C0200, // 000F CALL R3 1 + 0x00080403, // 0010 ADD R2 R2 R3 + 0x0008050B, // 0011 ADD R2 R2 K11 + 0xA8020018, // 0012 EXBLK 0 #002C + 0x600C0011, // 0013 GETGBL R3 G17 + 0x8810010C, // 0014 GETMBR R4 R0 K12 + 0x5814000D, // 0015 LDCONST R5 K13 + 0x7C0C0400, // 0016 CALL R3 2 + 0x8C10070E, // 0017 GETMET R4 R3 K14 + 0x5C180400, // 0018 MOVE R6 R2 + 0x7C100400, // 0019 CALL R4 2 + 0x8C10070F, // 001A GETMET R4 R3 K15 + 0x7C100200, // 001B CALL R4 1 + 0xB8122000, // 001C GETNGBL R4 K16 + 0x8C100911, // 001D GETMET R4 R4 K17 + 0x8C180301, // 001E GETMET R6 R1 K1 + 0x58200012, // 001F LDCONST R8 K18 + 0x88240108, // 0020 GETMBR R9 R0 K8 + 0x78260001, // 0021 JMPF R9 #0024 + 0x58240013, // 0022 LDCONST R9 K19 + 0x70020000, // 0023 JMP #0025 + 0x58240014, // 0024 LDCONST R9 K20 + 0x7C180600, // 0025 CALL R6 3 + 0x581C0015, // 0026 LDCONST R7 K21 + 0x7C100600, // 0027 CALL R4 3 + 0xA8040001, // 0028 EXBLK 1 1 + 0x80040400, // 0029 RET 1 R2 + 0xA8040001, // 002A EXBLK 1 1 + 0x70020011, // 002B JMP #003E + 0xAC0C0002, // 002C CATCH R3 0 2 + 0x7002000E, // 002D JMP #003D + 0xB8162000, // 002E GETNGBL R5 K16 + 0x8C140B11, // 002F GETMET R5 R5 K17 + 0x601C0008, // 0030 GETGBL R7 G8 + 0x5C200600, // 0031 MOVE R8 R3 + 0x7C1C0200, // 0032 CALL R7 1 + 0x001E2C07, // 0033 ADD R7 K22 R7 + 0x001C0F17, // 0034 ADD R7 R7 K23 + 0x60200008, // 0035 GETGBL R8 G8 + 0x5C240800, // 0036 MOVE R9 R4 + 0x7C200200, // 0037 CALL R8 1 + 0x001C0E08, // 0038 ADD R7 R7 R8 + 0x58200015, // 0039 LDCONST R8 K21 + 0x7C140600, // 003A CALL R5 3 + 0x80040400, // 003B RET 1 R2 + 0x70020000, // 003C JMP #003E + 0xB0080000, // 003D RAISE 2 R0 R0 + 0x80000000, // 003E RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: mdns_announce_op_discovery_all_fabrics +********************************************************************/ +be_local_closure(Matter_Device_mdns_announce_op_discovery_all_fabrics, /* name */ + be_nested_proto( + 6, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 6]) { /* constants */ + /* K0 */ be_nested_str_weak(sessions), + /* K1 */ be_nested_str_weak(active_fabrics), + /* K2 */ be_nested_str_weak(get_device_id), + /* K3 */ be_nested_str_weak(get_fabric_id), + /* K4 */ be_nested_str_weak(mdns_announce_op_discovery), + /* K5 */ be_nested_str_weak(stop_iteration), + }), + be_str_weak(mdns_announce_op_discovery_all_fabrics), + &be_const_str_solidified, + ( &(const binstruction[22]) { /* code */ + 0x60040010, // 0000 GETGBL R1 G16 + 0x88080100, // 0001 GETMBR R2 R0 K0 + 0x8C080501, // 0002 GETMET R2 R2 K1 + 0x7C080200, // 0003 CALL R2 1 + 0x7C040200, // 0004 CALL R1 1 + 0xA802000B, // 0005 EXBLK 0 #0012 + 0x5C080200, // 0006 MOVE R2 R1 + 0x7C080000, // 0007 CALL R2 0 + 0x8C0C0502, // 0008 GETMET R3 R2 K2 + 0x7C0C0200, // 0009 CALL R3 1 + 0x780E0005, // 000A JMPF R3 #0011 + 0x8C0C0503, // 000B GETMET R3 R2 K3 + 0x7C0C0200, // 000C CALL R3 1 + 0x780E0002, // 000D JMPF R3 #0011 + 0x8C0C0104, // 000E GETMET R3 R0 K4 + 0x5C140400, // 000F MOVE R5 R2 + 0x7C0C0400, // 0010 CALL R3 2 + 0x7001FFF3, // 0011 JMP #0006 + 0x58040005, // 0012 LDCONST R1 K5 + 0xAC040200, // 0013 CATCH R1 1 0 + 0xB0080000, // 0014 RAISE 2 R0 R0 + 0x80000000, // 0015 RET 0 }) ) ); @@ -1689,6 +863,43 @@ be_local_closure(Matter_Device_start_operational_discovery_deferred, /* name * /*******************************************************************/ +/******************************************************************** +** Solidified function: start_commissioning_complete +********************************************************************/ +be_local_closure(Matter_Device_start_commissioning_complete, /* name */ + be_nested_proto( + 6, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 5]) { /* constants */ + /* K0 */ be_nested_str_weak(tasmota), + /* K1 */ be_nested_str_weak(log), + /* K2 */ be_nested_str_weak(MTR_X3A_X20_X2A_X2A_X2A_X20Commissioning_X20complete_X20_X2A_X2A_X2A), + /* K3 */ be_const_int(2), + /* K4 */ be_nested_str_weak(stop_basic_commissioning), + }), + be_str_weak(start_commissioning_complete), + &be_const_str_solidified, + ( &(const binstruction[ 8]) { /* code */ + 0xB80A0000, // 0000 GETNGBL R2 K0 + 0x8C080501, // 0001 GETMET R2 R2 K1 + 0x58100002, // 0002 LDCONST R4 K2 + 0x58140003, // 0003 LDCONST R5 K3 + 0x7C080600, // 0004 CALL R2 3 + 0x8C080104, // 0005 GETMET R2 R0 K4 + 0x7C080200, // 0006 CALL R2 1 + 0x80000000, // 0007 RET 0 + }) + ) +); +/*******************************************************************/ + + /******************************************************************** ** Solidified function: compute_qrcode_content ********************************************************************/ @@ -1766,11 +977,74 @@ be_local_closure(Matter_Device_compute_qrcode_content, /* name */ /******************************************************************** -** Solidified function: sort_distinct +** Solidified function: compute_manual_pairing_code ********************************************************************/ -be_local_closure(Matter_Device_sort_distinct, /* name */ +be_local_closure(Matter_Device_compute_manual_pairing_code, /* name */ be_nested_proto( - 7, /* nstack */ + 11, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 8]) { /* constants */ + /* K0 */ be_nested_str_weak(string), + /* K1 */ be_nested_str_weak(root_discriminator), + /* K2 */ be_nested_str_weak(root_passcode), + /* K3 */ be_nested_str_weak(format), + /* K4 */ be_nested_str_weak(_X251i_X2505i_X2504i), + /* K5 */ be_nested_str_weak(matter), + /* K6 */ be_nested_str_weak(Verhoeff), + /* K7 */ be_nested_str_weak(checksum), + }), + be_str_weak(compute_manual_pairing_code), + &be_const_str_solidified, + ( &(const binstruction[31]) { /* code */ + 0xA4060000, // 0000 IMPORT R1 K0 + 0x88080101, // 0001 GETMBR R2 R0 K1 + 0x540E0FFE, // 0002 LDINT R3 4095 + 0x2C080403, // 0003 AND R2 R2 R3 + 0x540E0009, // 0004 LDINT R3 10 + 0x3C080403, // 0005 SHR R2 R2 R3 + 0x880C0101, // 0006 GETMBR R3 R0 K1 + 0x541202FF, // 0007 LDINT R4 768 + 0x2C0C0604, // 0008 AND R3 R3 R4 + 0x54120005, // 0009 LDINT R4 6 + 0x380C0604, // 000A SHL R3 R3 R4 + 0x88100102, // 000B GETMBR R4 R0 K2 + 0x54163FFE, // 000C LDINT R5 16383 + 0x2C100805, // 000D AND R4 R4 R5 + 0x300C0604, // 000E OR R3 R3 R4 + 0x88100102, // 000F GETMBR R4 R0 K2 + 0x5416000D, // 0010 LDINT R5 14 + 0x3C100805, // 0011 SHR R4 R4 R5 + 0x8C140303, // 0012 GETMET R5 R1 K3 + 0x581C0004, // 0013 LDCONST R7 K4 + 0x5C200400, // 0014 MOVE R8 R2 + 0x5C240600, // 0015 MOVE R9 R3 + 0x5C280800, // 0016 MOVE R10 R4 + 0x7C140A00, // 0017 CALL R5 5 + 0xB81A0A00, // 0018 GETNGBL R6 K5 + 0x88180D06, // 0019 GETMBR R6 R6 K6 + 0x8C180D07, // 001A GETMET R6 R6 K7 + 0x5C200A00, // 001B MOVE R8 R5 + 0x7C180400, // 001C CALL R6 2 + 0x00140A06, // 001D ADD R5 R5 R6 + 0x80040A00, // 001E RET 1 R5 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: k2l +********************************************************************/ +be_local_closure(Matter_Device_k2l, /* name */ + be_nested_proto( + 8, /* nstack */ 1, /* argc */ 4, /* varg */ 0, /* has upvals */ @@ -1778,69 +1052,67 @@ be_local_closure(Matter_Device_sort_distinct, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[ 5]) { /* constants */ + ( &(const bvalue[ 6]) { /* constants */ /* K0 */ be_const_class(be_class_Matter_Device), - /* K1 */ be_const_int(1), - /* K2 */ be_const_int(0), + /* K1 */ be_nested_str_weak(keys), + /* K2 */ be_nested_str_weak(push), /* K3 */ be_nested_str_weak(stop_iteration), - /* K4 */ be_nested_str_weak(remove), + /* K4 */ be_const_int(1), + /* K5 */ be_const_int(0), }), - be_str_weak(sort_distinct), + be_str_weak(k2l), &be_const_str_solidified, - ( &(const binstruction[53]) { /* code */ + ( &(const binstruction[50]) { /* code */ 0x58040000, // 0000 LDCONST R1 K0 - 0x60080010, // 0001 GETGBL R2 G16 - 0x600C000C, // 0002 GETGBL R3 G12 - 0x5C100000, // 0003 MOVE R4 R0 - 0x7C0C0200, // 0004 CALL R3 1 - 0x040C0701, // 0005 SUB R3 R3 K1 - 0x400E0203, // 0006 CONNECT R3 K1 R3 - 0x7C080200, // 0007 CALL R2 1 - 0xA8020010, // 0008 EXBLK 0 #001A - 0x5C0C0400, // 0009 MOVE R3 R2 - 0x7C0C0000, // 000A CALL R3 0 - 0x94100003, // 000B GETIDX R4 R0 R3 - 0x5C140600, // 000C MOVE R5 R3 - 0x24180B02, // 000D GT R6 R5 K2 - 0x781A0008, // 000E JMPF R6 #0018 - 0x04180B01, // 000F SUB R6 R5 K1 - 0x94180006, // 0010 GETIDX R6 R0 R6 - 0x24180C04, // 0011 GT R6 R6 R4 - 0x781A0004, // 0012 JMPF R6 #0018 - 0x04180B01, // 0013 SUB R6 R5 K1 - 0x94180006, // 0014 GETIDX R6 R0 R6 - 0x98000A06, // 0015 SETIDX R0 R5 R6 - 0x04140B01, // 0016 SUB R5 R5 K1 - 0x7001FFF4, // 0017 JMP #000D - 0x98000A04, // 0018 SETIDX R0 R5 R4 - 0x7001FFEE, // 0019 JMP #0009 - 0x58080003, // 001A LDCONST R2 K3 - 0xAC080200, // 001B CATCH R2 1 0 - 0xB0080000, // 001C RAISE 2 R0 R0 - 0x58080001, // 001D LDCONST R2 K1 - 0x600C000C, // 001E GETGBL R3 G12 - 0x5C100000, // 001F MOVE R4 R0 - 0x7C0C0200, // 0020 CALL R3 1 - 0x180C0701, // 0021 LE R3 R3 K1 - 0x780E0000, // 0022 JMPF R3 #0024 - 0x80040000, // 0023 RET 1 R0 - 0x940C0102, // 0024 GETIDX R3 R0 K2 - 0x6010000C, // 0025 GETGBL R4 G12 - 0x5C140000, // 0026 MOVE R5 R0 - 0x7C100200, // 0027 CALL R4 1 - 0x14100404, // 0028 LT R4 R2 R4 - 0x78120009, // 0029 JMPF R4 #0034 - 0x94100002, // 002A GETIDX R4 R0 R2 - 0x1C100803, // 002B EQ R4 R4 R3 - 0x78120003, // 002C JMPF R4 #0031 - 0x8C100104, // 002D GETMET R4 R0 K4 - 0x5C180400, // 002E MOVE R6 R2 - 0x7C100400, // 002F CALL R4 2 - 0x70020001, // 0030 JMP #0033 - 0x940C0002, // 0031 GETIDX R3 R0 R2 - 0x00080501, // 0032 ADD R2 R2 K1 - 0x7001FFF0, // 0033 JMP #0025 - 0x80040000, // 0034 RET 1 R0 + 0x60080012, // 0001 GETGBL R2 G18 + 0x7C080000, // 0002 CALL R2 0 + 0x4C0C0000, // 0003 LDNIL R3 + 0x1C0C0003, // 0004 EQ R3 R0 R3 + 0x780E0000, // 0005 JMPF R3 #0007 + 0x80040400, // 0006 RET 1 R2 + 0x600C0010, // 0007 GETGBL R3 G16 + 0x8C100101, // 0008 GETMET R4 R0 K1 + 0x7C100200, // 0009 CALL R4 1 + 0x7C0C0200, // 000A CALL R3 1 + 0xA8020005, // 000B EXBLK 0 #0012 + 0x5C100600, // 000C MOVE R4 R3 + 0x7C100000, // 000D CALL R4 0 + 0x8C140502, // 000E GETMET R5 R2 K2 + 0x5C1C0800, // 000F MOVE R7 R4 + 0x7C140400, // 0010 CALL R5 2 + 0x7001FFF9, // 0011 JMP #000C + 0x580C0003, // 0012 LDCONST R3 K3 + 0xAC0C0200, // 0013 CATCH R3 1 0 + 0xB0080000, // 0014 RAISE 2 R0 R0 + 0x600C0010, // 0015 GETGBL R3 G16 + 0x6010000C, // 0016 GETGBL R4 G12 + 0x5C140400, // 0017 MOVE R5 R2 + 0x7C100200, // 0018 CALL R4 1 + 0x04100904, // 0019 SUB R4 R4 K4 + 0x40120804, // 001A CONNECT R4 K4 R4 + 0x7C0C0200, // 001B CALL R3 1 + 0xA8020010, // 001C EXBLK 0 #002E + 0x5C100600, // 001D MOVE R4 R3 + 0x7C100000, // 001E CALL R4 0 + 0x94140404, // 001F GETIDX R5 R2 R4 + 0x5C180800, // 0020 MOVE R6 R4 + 0x241C0D05, // 0021 GT R7 R6 K5 + 0x781E0008, // 0022 JMPF R7 #002C + 0x041C0D04, // 0023 SUB R7 R6 K4 + 0x941C0407, // 0024 GETIDX R7 R2 R7 + 0x241C0E05, // 0025 GT R7 R7 R5 + 0x781E0004, // 0026 JMPF R7 #002C + 0x041C0D04, // 0027 SUB R7 R6 K4 + 0x941C0407, // 0028 GETIDX R7 R2 R7 + 0x98080C07, // 0029 SETIDX R2 R6 R7 + 0x04180D04, // 002A SUB R6 R6 K4 + 0x7001FFF4, // 002B JMP #0021 + 0x98080C05, // 002C SETIDX R2 R6 R5 + 0x7001FFEE, // 002D JMP #001D + 0x580C0003, // 002E LDCONST R3 K3 + 0xAC0C0200, // 002F CATCH R3 1 0 + 0xB0080000, // 0030 RAISE 2 R0 R0 + 0x80040400, // 0031 RET 1 R2 }) ) ); @@ -1980,171 +1252,12 @@ be_local_closure(Matter_Device_start_mdns_announce_hostnames, /* name */ /******************************************************************** -** Solidified function: every_second +** Solidified function: MtrJoin ********************************************************************/ -be_local_closure(Matter_Device_every_second, /* name */ +be_local_closure(Matter_Device_MtrJoin, /* name */ be_nested_proto( - 4, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 9]) { /* constants */ - /* K0 */ be_nested_str_weak(sessions), - /* K1 */ be_nested_str_weak(every_second), - /* K2 */ be_nested_str_weak(message_handler), - /* K3 */ be_nested_str_weak(commissioning_open), - /* K4 */ be_nested_str_weak(tasmota), - /* K5 */ be_nested_str_weak(time_reached), - /* K6 */ be_const_int(0), - /* K7 */ be_nested_str_weak(plugins), - /* K8 */ be_const_int(1), - }), - be_str_weak(every_second), - &be_const_str_solidified, - ( &(const binstruction[30]) { /* code */ - 0x88040100, // 0000 GETMBR R1 R0 K0 - 0x8C040301, // 0001 GETMET R1 R1 K1 - 0x7C040200, // 0002 CALL R1 1 - 0x88040102, // 0003 GETMBR R1 R0 K2 - 0x8C040301, // 0004 GETMET R1 R1 K1 - 0x7C040200, // 0005 CALL R1 1 - 0x88040103, // 0006 GETMBR R1 R0 K3 - 0x4C080000, // 0007 LDNIL R2 - 0x20040202, // 0008 NE R1 R1 R2 - 0x78060006, // 0009 JMPF R1 #0011 - 0xB8060800, // 000A GETNGBL R1 K4 - 0x8C040305, // 000B GETMET R1 R1 K5 - 0x880C0103, // 000C GETMBR R3 R0 K3 - 0x7C040400, // 000D CALL R1 2 - 0x78060001, // 000E JMPF R1 #0011 - 0x4C040000, // 000F LDNIL R1 - 0x90020601, // 0010 SETMBR R0 K3 R1 - 0x58040006, // 0011 LDCONST R1 K6 - 0x6008000C, // 0012 GETGBL R2 G12 - 0x880C0107, // 0013 GETMBR R3 R0 K7 - 0x7C080200, // 0014 CALL R2 1 - 0x14080202, // 0015 LT R2 R1 R2 - 0x780A0005, // 0016 JMPF R2 #001D - 0x88080107, // 0017 GETMBR R2 R0 K7 - 0x94080401, // 0018 GETIDX R2 R2 R1 - 0x8C080501, // 0019 GETMET R2 R2 K1 - 0x7C080200, // 001A CALL R2 1 - 0x00040308, // 001B ADD R1 R1 K8 - 0x7001FFF4, // 001C JMP #0012 - 0x80000000, // 001D RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: start_root_basic_commissioning -********************************************************************/ -be_local_closure(Matter_Device_start_root_basic_commissioning, /* name */ - be_nested_proto( - 14, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[23]) { /* constants */ - /* K0 */ be_nested_str_weak(string), - /* K1 */ be_nested_str_weak(PASE_TIMEOUT), - /* K2 */ be_nested_str_weak(compute_manual_pairing_code), - /* K3 */ be_nested_str_weak(tasmota), - /* K4 */ be_nested_str_weak(log), - /* K5 */ be_nested_str_weak(format), - /* K6 */ be_nested_str_weak(MTR_X3A_X20Manual_X20pairing_X20code_X3A_X20_X25s_X2D_X25s_X2D_X25s), - /* K7 */ be_const_int(0), - /* K8 */ be_const_int(3), - /* K9 */ be_const_int(2147483647), - /* K10 */ be_const_int(2), - /* K11 */ be_nested_str_weak(compute_qrcode_content), - /* K12 */ be_nested_str_weak(publish_result), - /* K13 */ be_nested_str_weak(_X7B_X22Matter_X22_X3A_X7B_X22Commissioning_X22_X3A1_X2C_X22PairingCode_X22_X3A_X22_X25s_X22_X2C_X22QRCode_X22_X3A_X22_X25s_X22_X7D_X7D), - /* K14 */ be_nested_str_weak(Matter), - /* K15 */ be_nested_str_weak(_compute_pbkdf), - /* K16 */ be_nested_str_weak(root_passcode), - /* K17 */ be_nested_str_weak(root_iterations), - /* K18 */ be_nested_str_weak(root_salt), - /* K19 */ be_nested_str_weak(start_basic_commissioning), - /* K20 */ be_nested_str_weak(root_discriminator), - /* K21 */ be_nested_str_weak(root_w0), - /* K22 */ be_nested_str_weak(root_L), - }), - be_str_weak(start_root_basic_commissioning), - &be_const_str_solidified, - ( &(const binstruction[49]) { /* code */ - 0xA40A0000, // 0000 IMPORT R2 K0 - 0x4C0C0000, // 0001 LDNIL R3 - 0x1C0C0203, // 0002 EQ R3 R1 R3 - 0x780E0000, // 0003 JMPF R3 #0005 - 0x88040101, // 0004 GETMBR R1 R0 K1 - 0x8C0C0102, // 0005 GETMET R3 R0 K2 - 0x7C0C0200, // 0006 CALL R3 1 - 0xB8120600, // 0007 GETNGBL R4 K3 - 0x8C100904, // 0008 GETMET R4 R4 K4 - 0x8C180505, // 0009 GETMET R6 R2 K5 - 0x58200006, // 000A LDCONST R8 K6 - 0x40260F08, // 000B CONNECT R9 K7 K8 - 0x94240609, // 000C GETIDX R9 R3 R9 - 0x542A0003, // 000D LDINT R10 4 - 0x542E0005, // 000E LDINT R11 6 - 0x4028140B, // 000F CONNECT R10 R10 R11 - 0x9428060A, // 0010 GETIDX R10 R3 R10 - 0x542E0006, // 0011 LDINT R11 7 - 0x402C1709, // 0012 CONNECT R11 R11 K9 - 0x942C060B, // 0013 GETIDX R11 R3 R11 - 0x7C180A00, // 0014 CALL R6 5 - 0x581C000A, // 0015 LDCONST R7 K10 - 0x7C100600, // 0016 CALL R4 3 - 0x8C10010B, // 0017 GETMET R4 R0 K11 - 0x7C100200, // 0018 CALL R4 1 - 0xB8160600, // 0019 GETNGBL R5 K3 - 0x8C140B0C, // 001A GETMET R5 R5 K12 - 0x8C1C0505, // 001B GETMET R7 R2 K5 - 0x5824000D, // 001C LDCONST R9 K13 - 0x5C280600, // 001D MOVE R10 R3 - 0x5C2C0800, // 001E MOVE R11 R4 - 0x7C1C0800, // 001F CALL R7 4 - 0x5820000E, // 0020 LDCONST R8 K14 - 0x7C140600, // 0021 CALL R5 3 - 0x8C14010F, // 0022 GETMET R5 R0 K15 - 0x881C0110, // 0023 GETMBR R7 R0 K16 - 0x88200111, // 0024 GETMBR R8 R0 K17 - 0x88240112, // 0025 GETMBR R9 R0 K18 - 0x7C140800, // 0026 CALL R5 4 - 0x8C140113, // 0027 GETMET R5 R0 K19 - 0x5C1C0200, // 0028 MOVE R7 R1 - 0x88200111, // 0029 GETMBR R8 R0 K17 - 0x88240114, // 002A GETMBR R9 R0 K20 - 0x88280112, // 002B GETMBR R10 R0 K18 - 0x882C0115, // 002C GETMBR R11 R0 K21 - 0x88300116, // 002D GETMBR R12 R0 K22 - 0x4C340000, // 002E LDNIL R13 - 0x7C141000, // 002F CALL R5 8 - 0x80000000, // 0030 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: _init_basic_commissioning -********************************************************************/ -be_local_closure(Matter_Device__init_basic_commissioning, /* name */ - be_nested_proto( - 3, /* nstack */ - 1, /* argc */ + 8, /* nstack */ + 5, /* argc */ 2, /* varg */ 0, /* has upvals */ NULL, /* no upvals */ @@ -2152,346 +1265,27 @@ be_local_closure(Matter_Device__init_basic_commissioning, /* name */ NULL, /* no sub protos */ 1, /* has constants */ ( &(const bvalue[ 4]) { /* constants */ - /* K0 */ be_nested_str_weak(sessions), - /* K1 */ be_nested_str_weak(count_active_fabrics), - /* K2 */ be_const_int(0), - /* K3 */ be_nested_str_weak(start_root_basic_commissioning), - }), - be_str_weak(_init_basic_commissioning), - &be_const_str_solidified, - ( &(const binstruction[ 8]) { /* code */ - 0x88040100, // 0000 GETMBR R1 R0 K0 - 0x8C040301, // 0001 GETMET R1 R1 K1 - 0x7C040200, // 0002 CALL R1 1 - 0x1C040302, // 0003 EQ R1 R1 K2 - 0x78060001, // 0004 JMPF R1 #0007 - 0x8C040103, // 0005 GETMET R1 R0 K3 - 0x7C040200, // 0006 CALL R1 1 - 0x80000000, // 0007 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: init -********************************************************************/ -be_local_closure(Matter_Device_init, /* name */ - be_nested_proto( - 8, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 1, /* has sup protos */ - ( &(const struct bproto*[ 2]) { - be_nested_proto( - 4, /* nstack */ - 0, /* argc */ - 0, /* varg */ - 1, /* has upvals */ - ( &(const bupvaldesc[ 1]) { /* upvals */ - be_local_const_upval(1, 0), - }), - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 5]) { /* constants */ - /* K0 */ be_nested_str_weak(start), - /* K1 */ be_nested_str_weak(tasmota), - /* K2 */ be_nested_str_weak(remove_rule), - /* K3 */ be_nested_str_weak(Wifi_X23Connected), - /* K4 */ be_nested_str_weak(matter_start), - }), - be_str_weak(_anonymous_), - &be_const_str_solidified, - ( &(const binstruction[ 9]) { /* code */ - 0x68000000, // 0000 GETUPV R0 U0 - 0x8C000100, // 0001 GETMET R0 R0 K0 - 0x7C000200, // 0002 CALL R0 1 - 0xB8020200, // 0003 GETNGBL R0 K1 - 0x8C000102, // 0004 GETMET R0 R0 K2 - 0x58080003, // 0005 LDCONST R2 K3 - 0x580C0004, // 0006 LDCONST R3 K4 - 0x7C000600, // 0007 CALL R0 3 - 0x80000000, // 0008 RET 0 - }) - ), - be_nested_proto( - 4, /* nstack */ - 0, /* argc */ - 0, /* varg */ - 1, /* has upvals */ - ( &(const bupvaldesc[ 1]) { /* upvals */ - be_local_const_upval(1, 0), - }), - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 5]) { /* constants */ - /* K0 */ be_nested_str_weak(start), - /* K1 */ be_nested_str_weak(tasmota), - /* K2 */ be_nested_str_weak(remove_rule), - /* K3 */ be_nested_str_weak(Eth_X23Connected), - /* K4 */ be_nested_str_weak(matter_start), - }), - be_str_weak(_anonymous_), - &be_const_str_solidified, - ( &(const binstruction[ 9]) { /* code */ - 0x68000000, // 0000 GETUPV R0 U0 - 0x8C000100, // 0001 GETMET R0 R0 K0 - 0x7C000200, // 0002 CALL R0 1 - 0xB8020200, // 0003 GETNGBL R0 K1 - 0x8C000102, // 0004 GETMET R0 R0 K2 - 0x58080003, // 0005 LDCONST R2 K3 - 0x580C0004, // 0006 LDCONST R3 K4 - 0x7C000600, // 0007 CALL R0 3 - 0x80000000, // 0008 RET 0 - }) - ), - }), - 1, /* has constants */ - ( &(const bvalue[36]) { /* constants */ - /* K0 */ be_nested_str_weak(crypto), - /* K1 */ be_nested_str_weak(string), + /* K0 */ be_nested_str_weak(start_root_basic_commissioning), + /* K1 */ be_nested_str_weak(stop_basic_commissioning), /* K2 */ be_nested_str_weak(tasmota), - /* K3 */ be_nested_str_weak(get_option), - /* K4 */ be_nested_str_weak(matter), - /* K5 */ be_nested_str_weak(MATTER_OPTION), - /* K6 */ be_nested_str_weak(UI), - /* K7 */ be_nested_str_weak(started), - /* K8 */ be_nested_str_weak(plugins), - /* K9 */ be_nested_str_weak(vendorid), - /* K10 */ be_nested_str_weak(VENDOR_ID), - /* K11 */ be_nested_str_weak(productid), - /* K12 */ be_nested_str_weak(PRODUCT_ID), - /* K13 */ be_nested_str_weak(root_iterations), - /* K14 */ be_nested_str_weak(PBKDF_ITERATIONS), - /* K15 */ be_nested_str_weak(root_salt), - /* K16 */ be_nested_str_weak(random), - /* K17 */ be_nested_str_weak(ipv4only), - /* K18 */ be_nested_str_weak(load_param), - /* K19 */ be_nested_str_weak(sessions), - /* K20 */ be_nested_str_weak(Session_Store), - /* K21 */ be_nested_str_weak(load_fabrics), - /* K22 */ be_nested_str_weak(message_handler), - /* K23 */ be_nested_str_weak(MessageHandler), - /* K24 */ be_nested_str_weak(ui), - /* K25 */ be_nested_str_weak(wifi), - /* K26 */ be_nested_str_weak(up), - /* K27 */ be_nested_str_weak(eth), - /* K28 */ be_nested_str_weak(start), - /* K29 */ be_nested_str_weak(add_rule), - /* K30 */ be_nested_str_weak(Wifi_X23Connected), - /* K31 */ be_nested_str_weak(matter_start), - /* K32 */ be_nested_str_weak(Eth_X23Connected), - /* K33 */ be_nested_str_weak(_init_basic_commissioning), - /* K34 */ be_nested_str_weak(add_driver), - /* K35 */ be_nested_str_weak(register_commands), + /* K3 */ be_nested_str_weak(resp_cmnd_done), }), - be_str_weak(init), + be_str_weak(MtrJoin), &be_const_str_solidified, - ( &(const binstruction[93]) { /* code */ - 0xA4060000, // 0000 IMPORT R1 K0 - 0xA40A0200, // 0001 IMPORT R2 K1 - 0xB80E0400, // 0002 GETNGBL R3 K2 - 0x8C0C0703, // 0003 GETMET R3 R3 K3 - 0xB8160800, // 0004 GETNGBL R5 K4 - 0x88140B05, // 0005 GETMBR R5 R5 K5 - 0x7C0C0400, // 0006 CALL R3 2 - 0x740E0004, // 0007 JMPT R3 #000D - 0xB80E0800, // 0008 GETNGBL R3 K4 - 0x8C0C0706, // 0009 GETMET R3 R3 K6 - 0x5C140000, // 000A MOVE R5 R0 - 0x7C0C0400, // 000B CALL R3 2 - 0x80000600, // 000C RET 0 - 0x500C0000, // 000D LDBOOL R3 0 0 - 0x90020E03, // 000E SETMBR R0 K7 R3 - 0x600C0012, // 000F GETGBL R3 G18 - 0x7C0C0000, // 0010 CALL R3 0 - 0x90021003, // 0011 SETMBR R0 K8 R3 - 0x880C010A, // 0012 GETMBR R3 R0 K10 - 0x90021203, // 0013 SETMBR R0 K9 R3 - 0x880C010C, // 0014 GETMBR R3 R0 K12 - 0x90021603, // 0015 SETMBR R0 K11 R3 - 0x880C010E, // 0016 GETMBR R3 R0 K14 - 0x90021A03, // 0017 SETMBR R0 K13 R3 - 0x8C0C0310, // 0018 GETMET R3 R1 K16 - 0x5416000F, // 0019 LDINT R5 16 - 0x7C0C0400, // 001A CALL R3 2 - 0x90021E03, // 001B SETMBR R0 K15 R3 - 0x500C0000, // 001C LDBOOL R3 0 0 - 0x90022203, // 001D SETMBR R0 K17 R3 - 0x8C0C0112, // 001E GETMET R3 R0 K18 - 0x7C0C0200, // 001F CALL R3 1 - 0xB80E0800, // 0020 GETNGBL R3 K4 - 0x8C0C0714, // 0021 GETMET R3 R3 K20 - 0x7C0C0200, // 0022 CALL R3 1 - 0x90022603, // 0023 SETMBR R0 K19 R3 - 0x880C0113, // 0024 GETMBR R3 R0 K19 - 0x8C0C0715, // 0025 GETMET R3 R3 K21 - 0x7C0C0200, // 0026 CALL R3 1 - 0xB80E0800, // 0027 GETNGBL R3 K4 - 0x8C0C0717, // 0028 GETMET R3 R3 K23 - 0x5C140000, // 0029 MOVE R5 R0 - 0x7C0C0400, // 002A CALL R3 2 - 0x90022C03, // 002B SETMBR R0 K22 R3 - 0xB80E0800, // 002C GETNGBL R3 K4 - 0x8C0C0706, // 002D GETMET R3 R3 K6 - 0x5C140000, // 002E MOVE R5 R0 - 0x7C0C0400, // 002F CALL R3 2 - 0x90023003, // 0030 SETMBR R0 K24 R3 - 0xB80E0400, // 0031 GETNGBL R3 K2 - 0x8C0C0719, // 0032 GETMET R3 R3 K25 - 0x7C0C0200, // 0033 CALL R3 1 - 0x940C071A, // 0034 GETIDX R3 R3 K26 - 0x740E0004, // 0035 JMPT R3 #003B - 0xB80E0400, // 0036 GETNGBL R3 K2 - 0x8C0C071B, // 0037 GETMET R3 R3 K27 - 0x7C0C0200, // 0038 CALL R3 1 - 0x940C071A, // 0039 GETIDX R3 R3 K26 - 0x780E0001, // 003A JMPF R3 #003D - 0x8C0C011C, // 003B GETMET R3 R0 K28 - 0x7C0C0200, // 003C CALL R3 1 - 0xB80E0400, // 003D GETNGBL R3 K2 - 0x8C0C0719, // 003E GETMET R3 R3 K25 - 0x7C0C0200, // 003F CALL R3 1 - 0x940C071A, // 0040 GETIDX R3 R3 K26 - 0x740E0005, // 0041 JMPT R3 #0048 - 0xB80E0400, // 0042 GETNGBL R3 K2 - 0x8C0C071D, // 0043 GETMET R3 R3 K29 - 0x5814001E, // 0044 LDCONST R5 K30 - 0x84180000, // 0045 CLOSURE R6 P0 - 0x581C001F, // 0046 LDCONST R7 K31 - 0x7C0C0800, // 0047 CALL R3 4 - 0xB80E0400, // 0048 GETNGBL R3 K2 - 0x8C0C071B, // 0049 GETMET R3 R3 K27 - 0x7C0C0200, // 004A CALL R3 1 - 0x940C071A, // 004B GETIDX R3 R3 K26 - 0x740E0005, // 004C JMPT R3 #0053 - 0xB80E0400, // 004D GETNGBL R3 K2 - 0x8C0C071D, // 004E GETMET R3 R3 K29 - 0x58140020, // 004F LDCONST R5 K32 - 0x84180001, // 0050 CLOSURE R6 P1 - 0x581C001F, // 0051 LDCONST R7 K31 - 0x7C0C0800, // 0052 CALL R3 4 - 0x8C0C0121, // 0053 GETMET R3 R0 K33 - 0x7C0C0200, // 0054 CALL R3 1 - 0xB80E0400, // 0055 GETNGBL R3 K2 - 0x8C0C0722, // 0056 GETMET R3 R3 K34 - 0x5C140000, // 0057 MOVE R5 R0 - 0x7C0C0400, // 0058 CALL R3 2 - 0x8C0C0123, // 0059 GETMET R3 R0 K35 - 0x7C0C0200, // 005A CALL R3 1 - 0xA0000000, // 005B CLOSE R0 - 0x80000000, // 005C RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: _compute_pbkdf -********************************************************************/ -be_local_closure(Matter_Device__compute_pbkdf, /* name */ - be_nested_proto( - 14, /* nstack */ - 4, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[11]) { /* constants */ - /* K0 */ be_nested_str_weak(crypto), - /* K1 */ be_nested_str_weak(string), - /* K2 */ be_nested_str_weak(add), - /* K3 */ be_nested_str_weak(PBKDF2_HMAC_SHA256), - /* K4 */ be_nested_str_weak(derive), - /* K5 */ be_const_int(0), - /* K6 */ be_nested_str_weak(root_w0), - /* K7 */ be_nested_str_weak(EC_P256), - /* K8 */ be_nested_str_weak(mod), - /* K9 */ be_nested_str_weak(root_L), - /* K10 */ be_nested_str_weak(public_key), - }), - be_str_weak(_compute_pbkdf), - &be_const_str_solidified, - ( &(const binstruction[41]) { /* code */ - 0xA4120000, // 0000 IMPORT R4 K0 - 0xA4160200, // 0001 IMPORT R5 K1 - 0x60180015, // 0002 GETGBL R6 G21 - 0x7C180000, // 0003 CALL R6 0 - 0x8C180D02, // 0004 GETMET R6 R6 K2 - 0x5C200200, // 0005 MOVE R8 R1 - 0x54260003, // 0006 LDINT R9 4 - 0x7C180600, // 0007 CALL R6 3 - 0x8C1C0903, // 0008 GETMET R7 R4 K3 - 0x7C1C0200, // 0009 CALL R7 1 - 0x8C1C0F04, // 000A GETMET R7 R7 K4 - 0x5C240C00, // 000B MOVE R9 R6 - 0x5C280600, // 000C MOVE R10 R3 - 0x5C2C0400, // 000D MOVE R11 R2 - 0x5432004F, // 000E LDINT R12 80 - 0x7C1C0A00, // 000F CALL R7 5 - 0x54220026, // 0010 LDINT R8 39 - 0x40220A08, // 0011 CONNECT R8 K5 R8 - 0x94200E08, // 0012 GETIDX R8 R7 R8 - 0x54260027, // 0013 LDINT R9 40 - 0x542A004E, // 0014 LDINT R10 79 - 0x4024120A, // 0015 CONNECT R9 R9 R10 - 0x94240E09, // 0016 GETIDX R9 R7 R9 - 0x8C280907, // 0017 GETMET R10 R4 K7 - 0x7C280200, // 0018 CALL R10 1 - 0x8C281508, // 0019 GETMET R10 R10 K8 - 0x5C301000, // 001A MOVE R12 R8 - 0x7C280400, // 001B CALL R10 2 - 0x90020C0A, // 001C SETMBR R0 K6 R10 - 0x8C280907, // 001D GETMET R10 R4 K7 - 0x7C280200, // 001E CALL R10 1 - 0x8C281508, // 001F GETMET R10 R10 K8 - 0x5C301200, // 0020 MOVE R12 R9 - 0x7C280400, // 0021 CALL R10 2 - 0x8C2C0907, // 0022 GETMET R11 R4 K7 - 0x7C2C0200, // 0023 CALL R11 1 - 0x8C2C170A, // 0024 GETMET R11 R11 K10 - 0x5C341400, // 0025 MOVE R13 R10 - 0x7C2C0400, // 0026 CALL R11 2 - 0x9002120B, // 0027 SETMBR R0 K9 R11 - 0x80000000, // 0028 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: every_250ms -********************************************************************/ -be_local_closure(Matter_Device_every_250ms, /* name */ - be_nested_proto( - 3, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 2]) { /* constants */ - /* K0 */ be_nested_str_weak(message_handler), - /* K1 */ be_nested_str_weak(every_250ms), - }), - be_str_weak(every_250ms), - &be_const_str_solidified, - ( &(const binstruction[ 4]) { /* code */ - 0x88040100, // 0000 GETMBR R1 R0 K0 - 0x8C040301, // 0001 GETMET R1 R1 K1 - 0x7C040200, // 0002 CALL R1 1 - 0x80000000, // 0003 RET 0 + ( &(const binstruction[13]) { /* code */ + 0x60140009, // 0000 GETGBL R5 G9 + 0x5C180600, // 0001 MOVE R6 R3 + 0x7C140200, // 0002 CALL R5 1 + 0x78160002, // 0003 JMPF R5 #0007 + 0x8C180100, // 0004 GETMET R6 R0 K0 + 0x7C180200, // 0005 CALL R6 1 + 0x70020001, // 0006 JMP #0009 + 0x8C180101, // 0007 GETMET R6 R0 K1 + 0x7C180200, // 0008 CALL R6 1 + 0xB81A0400, // 0009 GETNGBL R6 K2 + 0x8C180D03, // 000A GETMET R6 R6 K3 + 0x7C180200, // 000B CALL R6 1 + 0x80000000, // 000C RET 0 }) ) ); @@ -2827,6 +1621,2340 @@ be_local_closure(Matter_Device_process_attribute_expansion, /* name */ /*******************************************************************/ +/******************************************************************** +** Solidified function: received_ack +********************************************************************/ +be_local_closure(Matter_Device_received_ack, /* name */ + be_nested_proto( + 5, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 2]) { /* constants */ + /* K0 */ be_nested_str_weak(udp_server), + /* K1 */ be_nested_str_weak(received_ack), + }), + be_str_weak(received_ack), + &be_const_str_solidified, + ( &(const binstruction[ 5]) { /* code */ + 0x88080100, // 0000 GETMBR R2 R0 K0 + 0x8C080501, // 0001 GETMET R2 R2 K1 + 0x5C100200, // 0002 MOVE R4 R1 + 0x7C080400, // 0003 CALL R2 2 + 0x80040400, // 0004 RET 1 R2 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: _trigger_read_sensors +********************************************************************/ +be_local_closure(Matter_Device__trigger_read_sensors, /* name */ + be_nested_proto( + 8, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[11]) { /* constants */ + /* K0 */ be_nested_str_weak(json), + /* K1 */ be_nested_str_weak(tasmota), + /* K2 */ be_nested_str_weak(read_sensors), + /* K3 */ be_nested_str_weak(load), + /* K4 */ be_const_int(0), + /* K5 */ be_nested_str_weak(plugins), + /* K6 */ be_nested_str_weak(parse_sensors), + /* K7 */ be_const_int(1), + /* K8 */ be_nested_str_weak(log), + /* K9 */ be_nested_str_weak(MTR_X3A_X20unable_X20to_X20parse_X20read_sensors_X3A_X20), + /* K10 */ be_const_int(3), + }), + be_str_weak(_trigger_read_sensors), + &be_const_str_solidified, + ( &(const binstruction[37]) { /* code */ + 0xA4060000, // 0000 IMPORT R1 K0 + 0xB80A0200, // 0001 GETNGBL R2 K1 + 0x8C080502, // 0002 GETMET R2 R2 K2 + 0x7C080200, // 0003 CALL R2 1 + 0x4C0C0000, // 0004 LDNIL R3 + 0x1C0C0403, // 0005 EQ R3 R2 R3 + 0x780E0000, // 0006 JMPF R3 #0008 + 0x80000600, // 0007 RET 0 + 0x8C0C0303, // 0008 GETMET R3 R1 K3 + 0x5C140400, // 0009 MOVE R5 R2 + 0x7C0C0400, // 000A CALL R3 2 + 0x4C100000, // 000B LDNIL R4 + 0x20100604, // 000C NE R4 R3 R4 + 0x7812000D, // 000D JMPF R4 #001C + 0x58100004, // 000E LDCONST R4 K4 + 0x6014000C, // 000F GETGBL R5 G12 + 0x88180105, // 0010 GETMBR R6 R0 K5 + 0x7C140200, // 0011 CALL R5 1 + 0x14140805, // 0012 LT R5 R4 R5 + 0x78160006, // 0013 JMPF R5 #001B + 0x88140105, // 0014 GETMBR R5 R0 K5 + 0x94140A04, // 0015 GETIDX R5 R5 R4 + 0x8C140B06, // 0016 GETMET R5 R5 K6 + 0x5C1C0600, // 0017 MOVE R7 R3 + 0x7C140400, // 0018 CALL R5 2 + 0x00100907, // 0019 ADD R4 R4 K7 + 0x7001FFF3, // 001A JMP #000F + 0x70020007, // 001B JMP #0024 + 0xB8120200, // 001C GETNGBL R4 K1 + 0x8C100908, // 001D GETMET R4 R4 K8 + 0x60180008, // 001E GETGBL R6 G8 + 0x5C1C0400, // 001F MOVE R7 R2 + 0x7C180200, // 0020 CALL R6 1 + 0x001A1206, // 0021 ADD R6 K9 R6 + 0x581C000A, // 0022 LDCONST R7 K10 + 0x7C100600, // 0023 CALL R4 3 + 0x80000000, // 0024 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: is_root_commissioning_open +********************************************************************/ +be_local_closure(Matter_Device_is_root_commissioning_open, /* name */ + be_nested_proto( + 3, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 2]) { /* constants */ + /* K0 */ be_nested_str_weak(commissioning_open), + /* K1 */ be_nested_str_weak(commissioning_admin_fabric), + }), + be_str_weak(is_root_commissioning_open), + &be_const_str_solidified, + ( &(const binstruction[11]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x4C080000, // 0001 LDNIL R2 + 0x20040202, // 0002 NE R1 R1 R2 + 0x78060003, // 0003 JMPF R1 #0008 + 0x88040101, // 0004 GETMBR R1 R0 K1 + 0x4C080000, // 0005 LDNIL R2 + 0x1C040202, // 0006 EQ R1 R1 R2 + 0x74060000, // 0007 JMPT R1 #0009 + 0x50040001, // 0008 LDBOOL R1 0 1 + 0x50040200, // 0009 LDBOOL R1 1 0 + 0x80040200, // 000A RET 1 R1 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: is_commissioning_open +********************************************************************/ +be_local_closure(Matter_Device_is_commissioning_open, /* name */ + be_nested_proto( + 3, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 1]) { /* constants */ + /* K0 */ be_nested_str_weak(commissioning_open), + }), + be_str_weak(is_commissioning_open), + &be_const_str_solidified, + ( &(const binstruction[ 4]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x4C080000, // 0001 LDNIL R2 + 0x20040202, // 0002 NE R1 R1 R2 + 0x80040200, // 0003 RET 1 R1 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: stop_basic_commissioning +********************************************************************/ +be_local_closure(Matter_Device_stop_basic_commissioning, /* name */ + be_nested_proto( + 5, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[13]) { /* constants */ + /* K0 */ be_nested_str_weak(is_root_commissioning_open), + /* K1 */ be_nested_str_weak(tasmota), + /* K2 */ be_nested_str_weak(publish_result), + /* K3 */ be_nested_str_weak(_X7B_X22Matter_X22_X3A_X7B_X22Commissioning_X22_X3A0_X7D_X7D), + /* K4 */ be_nested_str_weak(Matter), + /* K5 */ be_nested_str_weak(commissioning_open), + /* K6 */ be_nested_str_weak(mdns_remove_PASE), + /* K7 */ be_nested_str_weak(commissioning_iterations), + /* K8 */ be_nested_str_weak(commissioning_discriminator), + /* K9 */ be_nested_str_weak(commissioning_salt), + /* K10 */ be_nested_str_weak(commissioning_w0), + /* K11 */ be_nested_str_weak(commissioning_L), + /* K12 */ be_nested_str_weak(commissioning_admin_fabric), + }), + be_str_weak(stop_basic_commissioning), + &be_const_str_solidified, + ( &(const binstruction[25]) { /* code */ + 0x8C040100, // 0000 GETMET R1 R0 K0 + 0x7C040200, // 0001 CALL R1 1 + 0x78060004, // 0002 JMPF R1 #0008 + 0xB8060200, // 0003 GETNGBL R1 K1 + 0x8C040302, // 0004 GETMET R1 R1 K2 + 0x580C0003, // 0005 LDCONST R3 K3 + 0x58100004, // 0006 LDCONST R4 K4 + 0x7C040600, // 0007 CALL R1 3 + 0x4C040000, // 0008 LDNIL R1 + 0x90020A01, // 0009 SETMBR R0 K5 R1 + 0x8C040106, // 000A GETMET R1 R0 K6 + 0x7C040200, // 000B CALL R1 1 + 0x4C040000, // 000C LDNIL R1 + 0x90020E01, // 000D SETMBR R0 K7 R1 + 0x4C040000, // 000E LDNIL R1 + 0x90021001, // 000F SETMBR R0 K8 R1 + 0x4C040000, // 0010 LDNIL R1 + 0x90021201, // 0011 SETMBR R0 K9 R1 + 0x4C040000, // 0012 LDNIL R1 + 0x90021401, // 0013 SETMBR R0 K10 R1 + 0x4C040000, // 0014 LDNIL R1 + 0x90021601, // 0015 SETMBR R0 K11 R1 + 0x4C040000, // 0016 LDNIL R1 + 0x90021801, // 0017 SETMBR R0 K12 R1 + 0x80000000, // 0018 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: start_root_basic_commissioning +********************************************************************/ +be_local_closure(Matter_Device_start_root_basic_commissioning, /* name */ + be_nested_proto( + 14, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[23]) { /* constants */ + /* K0 */ be_nested_str_weak(string), + /* K1 */ be_nested_str_weak(PASE_TIMEOUT), + /* K2 */ be_nested_str_weak(compute_manual_pairing_code), + /* K3 */ be_nested_str_weak(tasmota), + /* K4 */ be_nested_str_weak(log), + /* K5 */ be_nested_str_weak(format), + /* K6 */ be_nested_str_weak(MTR_X3A_X20Manual_X20pairing_X20code_X3A_X20_X25s_X2D_X25s_X2D_X25s), + /* K7 */ be_const_int(0), + /* K8 */ be_const_int(3), + /* K9 */ be_const_int(2147483647), + /* K10 */ be_const_int(2), + /* K11 */ be_nested_str_weak(compute_qrcode_content), + /* K12 */ be_nested_str_weak(publish_result), + /* K13 */ be_nested_str_weak(_X7B_X22Matter_X22_X3A_X7B_X22Commissioning_X22_X3A1_X2C_X22PairingCode_X22_X3A_X22_X25s_X22_X2C_X22QRCode_X22_X3A_X22_X25s_X22_X7D_X7D), + /* K14 */ be_nested_str_weak(Matter), + /* K15 */ be_nested_str_weak(_compute_pbkdf), + /* K16 */ be_nested_str_weak(root_passcode), + /* K17 */ be_nested_str_weak(root_iterations), + /* K18 */ be_nested_str_weak(root_salt), + /* K19 */ be_nested_str_weak(start_basic_commissioning), + /* K20 */ be_nested_str_weak(root_discriminator), + /* K21 */ be_nested_str_weak(root_w0), + /* K22 */ be_nested_str_weak(root_L), + }), + be_str_weak(start_root_basic_commissioning), + &be_const_str_solidified, + ( &(const binstruction[49]) { /* code */ + 0xA40A0000, // 0000 IMPORT R2 K0 + 0x4C0C0000, // 0001 LDNIL R3 + 0x1C0C0203, // 0002 EQ R3 R1 R3 + 0x780E0000, // 0003 JMPF R3 #0005 + 0x88040101, // 0004 GETMBR R1 R0 K1 + 0x8C0C0102, // 0005 GETMET R3 R0 K2 + 0x7C0C0200, // 0006 CALL R3 1 + 0xB8120600, // 0007 GETNGBL R4 K3 + 0x8C100904, // 0008 GETMET R4 R4 K4 + 0x8C180505, // 0009 GETMET R6 R2 K5 + 0x58200006, // 000A LDCONST R8 K6 + 0x40260F08, // 000B CONNECT R9 K7 K8 + 0x94240609, // 000C GETIDX R9 R3 R9 + 0x542A0003, // 000D LDINT R10 4 + 0x542E0005, // 000E LDINT R11 6 + 0x4028140B, // 000F CONNECT R10 R10 R11 + 0x9428060A, // 0010 GETIDX R10 R3 R10 + 0x542E0006, // 0011 LDINT R11 7 + 0x402C1709, // 0012 CONNECT R11 R11 K9 + 0x942C060B, // 0013 GETIDX R11 R3 R11 + 0x7C180A00, // 0014 CALL R6 5 + 0x581C000A, // 0015 LDCONST R7 K10 + 0x7C100600, // 0016 CALL R4 3 + 0x8C10010B, // 0017 GETMET R4 R0 K11 + 0x7C100200, // 0018 CALL R4 1 + 0xB8160600, // 0019 GETNGBL R5 K3 + 0x8C140B0C, // 001A GETMET R5 R5 K12 + 0x8C1C0505, // 001B GETMET R7 R2 K5 + 0x5824000D, // 001C LDCONST R9 K13 + 0x5C280600, // 001D MOVE R10 R3 + 0x5C2C0800, // 001E MOVE R11 R4 + 0x7C1C0800, // 001F CALL R7 4 + 0x5820000E, // 0020 LDCONST R8 K14 + 0x7C140600, // 0021 CALL R5 3 + 0x8C14010F, // 0022 GETMET R5 R0 K15 + 0x881C0110, // 0023 GETMBR R7 R0 K16 + 0x88200111, // 0024 GETMBR R8 R0 K17 + 0x88240112, // 0025 GETMBR R9 R0 K18 + 0x7C140800, // 0026 CALL R5 4 + 0x8C140113, // 0027 GETMET R5 R0 K19 + 0x5C1C0200, // 0028 MOVE R7 R1 + 0x88200111, // 0029 GETMBR R8 R0 K17 + 0x88240114, // 002A GETMBR R9 R0 K20 + 0x88280112, // 002B GETMBR R10 R0 K18 + 0x882C0115, // 002C GETMBR R11 R0 K21 + 0x88300116, // 002D GETMBR R12 R0 K22 + 0x4C340000, // 002E LDNIL R13 + 0x7C141000, // 002F CALL R5 8 + 0x80000000, // 0030 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: attribute_updated +********************************************************************/ +be_local_closure(Matter_Device_attribute_updated, /* name */ + be_nested_proto( + 10, /* nstack */ + 5, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 9]) { /* constants */ + /* K0 */ be_nested_str_weak(matter), + /* K1 */ be_nested_str_weak(Path), + /* K2 */ be_nested_str_weak(endpoint), + /* K3 */ be_nested_str_weak(cluster), + /* K4 */ be_nested_str_weak(attribute), + /* K5 */ be_nested_str_weak(message_handler), + /* K6 */ be_nested_str_weak(im), + /* K7 */ be_nested_str_weak(subs_shop), + /* K8 */ be_nested_str_weak(attribute_updated_ctx), + }), + be_str_weak(attribute_updated), + &be_const_str_solidified, + ( &(const binstruction[18]) { /* code */ + 0x4C140000, // 0000 LDNIL R5 + 0x1C140805, // 0001 EQ R5 R4 R5 + 0x78160000, // 0002 JMPF R5 #0004 + 0x50100000, // 0003 LDBOOL R4 0 0 + 0xB8160000, // 0004 GETNGBL R5 K0 + 0x8C140B01, // 0005 GETMET R5 R5 K1 + 0x7C140200, // 0006 CALL R5 1 + 0x90160401, // 0007 SETMBR R5 K2 R1 + 0x90160602, // 0008 SETMBR R5 K3 R2 + 0x90160803, // 0009 SETMBR R5 K4 R3 + 0x88180105, // 000A GETMBR R6 R0 K5 + 0x88180D06, // 000B GETMBR R6 R6 K6 + 0x88180D07, // 000C GETMBR R6 R6 K7 + 0x8C180D08, // 000D GETMET R6 R6 K8 + 0x5C200A00, // 000E MOVE R8 R5 + 0x5C240800, // 000F MOVE R9 R4 + 0x7C180600, // 0010 CALL R6 3 + 0x80000000, // 0011 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: autoconf_device +********************************************************************/ +be_local_closure(Matter_Device_autoconf_device, /* name */ + be_nested_proto( + 8, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[10]) { /* constants */ + /* K0 */ be_nested_str_weak(string), + /* K1 */ be_nested_str_weak(json), + /* K2 */ be_nested_str_weak(plugins), + /* K3 */ be_const_int(0), + /* K4 */ be_nested_str_weak(autoconf_device_map), + /* K5 */ be_nested_str_weak(tasmota), + /* K6 */ be_nested_str_weak(log), + /* K7 */ be_nested_str_weak(MTR_X3A_X20autoconfig_X20_X3D_X20), + /* K8 */ be_const_int(3), + /* K9 */ be_nested_str_weak(_load_plugins_config), + }), + be_str_weak(autoconf_device), + &be_const_str_solidified, + ( &(const binstruction[22]) { /* code */ + 0xA4060000, // 0000 IMPORT R1 K0 + 0xA40A0200, // 0001 IMPORT R2 K1 + 0x600C000C, // 0002 GETGBL R3 G12 + 0x88100102, // 0003 GETMBR R4 R0 K2 + 0x7C0C0200, // 0004 CALL R3 1 + 0x240C0703, // 0005 GT R3 R3 K3 + 0x780E0000, // 0006 JMPF R3 #0008 + 0x80000600, // 0007 RET 0 + 0x8C0C0104, // 0008 GETMET R3 R0 K4 + 0x7C0C0200, // 0009 CALL R3 1 + 0xB8120A00, // 000A GETNGBL R4 K5 + 0x8C100906, // 000B GETMET R4 R4 K6 + 0x60180008, // 000C GETGBL R6 G8 + 0x5C1C0600, // 000D MOVE R7 R3 + 0x7C180200, // 000E CALL R6 1 + 0x001A0E06, // 000F ADD R6 K7 R6 + 0x581C0008, // 0010 LDCONST R7 K8 + 0x7C100600, // 0011 CALL R4 3 + 0x8C100109, // 0012 GETMET R4 R0 K9 + 0x5C180600, // 0013 MOVE R6 R3 + 0x7C100400, // 0014 CALL R4 2 + 0x80000000, // 0015 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: every_250ms +********************************************************************/ +be_local_closure(Matter_Device_every_250ms, /* name */ + be_nested_proto( + 3, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 2]) { /* constants */ + /* K0 */ be_nested_str_weak(message_handler), + /* K1 */ be_nested_str_weak(every_250ms), + }), + be_str_weak(every_250ms), + &be_const_str_solidified, + ( &(const binstruction[ 4]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x8C040301, // 0001 GETMET R1 R1 K1 + 0x7C040200, // 0002 CALL R1 1 + 0x80000000, // 0003 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: mdns_remove_op_discovery_all_fabrics +********************************************************************/ +be_local_closure(Matter_Device_mdns_remove_op_discovery_all_fabrics, /* name */ + be_nested_proto( + 6, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 6]) { /* constants */ + /* K0 */ be_nested_str_weak(sessions), + /* K1 */ be_nested_str_weak(active_fabrics), + /* K2 */ be_nested_str_weak(get_device_id), + /* K3 */ be_nested_str_weak(get_fabric_id), + /* K4 */ be_nested_str_weak(mdns_remove_op_discovery), + /* K5 */ be_nested_str_weak(stop_iteration), + }), + be_str_weak(mdns_remove_op_discovery_all_fabrics), + &be_const_str_solidified, + ( &(const binstruction[22]) { /* code */ + 0x60040010, // 0000 GETGBL R1 G16 + 0x88080100, // 0001 GETMBR R2 R0 K0 + 0x8C080501, // 0002 GETMET R2 R2 K1 + 0x7C080200, // 0003 CALL R2 1 + 0x7C040200, // 0004 CALL R1 1 + 0xA802000B, // 0005 EXBLK 0 #0012 + 0x5C080200, // 0006 MOVE R2 R1 + 0x7C080000, // 0007 CALL R2 0 + 0x8C0C0502, // 0008 GETMET R3 R2 K2 + 0x7C0C0200, // 0009 CALL R3 1 + 0x780E0005, // 000A JMPF R3 #0011 + 0x8C0C0503, // 000B GETMET R3 R2 K3 + 0x7C0C0200, // 000C CALL R3 1 + 0x780E0002, // 000D JMPF R3 #0011 + 0x8C0C0104, // 000E GETMET R3 R0 K4 + 0x5C140400, // 000F MOVE R5 R2 + 0x7C0C0400, // 0010 CALL R3 2 + 0x7001FFF3, // 0011 JMP #0006 + 0x58040005, // 0012 LDCONST R1 K5 + 0xAC040200, // 0013 CATCH R1 1 0 + 0xB0080000, // 0014 RAISE 2 R0 R0 + 0x80000000, // 0015 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: start_commissioning_complete_deferred +********************************************************************/ +be_local_closure(Matter_Device_start_commissioning_complete_deferred, /* name */ + be_nested_proto( + 6, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 1, /* has sup protos */ + ( &(const struct bproto*[ 1]) { + be_nested_proto( + 3, /* nstack */ + 0, /* argc */ + 0, /* varg */ + 1, /* has upvals */ + ( &(const bupvaldesc[ 2]) { /* upvals */ + be_local_const_upval(1, 0), + be_local_const_upval(1, 1), + }), + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 1]) { /* constants */ + /* K0 */ be_nested_str_weak(start_commissioning_complete), + }), + be_str_weak(_X3Clambda_X3E), + &be_const_str_solidified, + ( &(const binstruction[ 5]) { /* code */ + 0x68000000, // 0000 GETUPV R0 U0 + 0x8C000100, // 0001 GETMET R0 R0 K0 + 0x68080001, // 0002 GETUPV R2 U1 + 0x7C000400, // 0003 CALL R0 2 + 0x80040000, // 0004 RET 1 R0 + }) + ), + }), + 1, /* has constants */ + ( &(const bvalue[ 3]) { /* constants */ + /* K0 */ be_nested_str_weak(tasmota), + /* K1 */ be_nested_str_weak(set_timer), + /* K2 */ be_const_int(0), + }), + be_str_weak(start_commissioning_complete_deferred), + &be_const_str_solidified, + ( &(const binstruction[ 7]) { /* code */ + 0xB80A0000, // 0000 GETNGBL R2 K0 + 0x8C080501, // 0001 GETMET R2 R2 K1 + 0x58100002, // 0002 LDCONST R4 K2 + 0x84140000, // 0003 CLOSURE R5 P0 + 0x7C080600, // 0004 CALL R2 3 + 0xA0000000, // 0005 CLOSE R0 + 0x80000000, // 0006 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: init +********************************************************************/ +be_local_closure(Matter_Device_init, /* name */ + be_nested_proto( + 8, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 1, /* has sup protos */ + ( &(const struct bproto*[ 2]) { + be_nested_proto( + 4, /* nstack */ + 0, /* argc */ + 0, /* varg */ + 1, /* has upvals */ + ( &(const bupvaldesc[ 1]) { /* upvals */ + be_local_const_upval(1, 0), + }), + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 5]) { /* constants */ + /* K0 */ be_nested_str_weak(start), + /* K1 */ be_nested_str_weak(tasmota), + /* K2 */ be_nested_str_weak(remove_rule), + /* K3 */ be_nested_str_weak(Wifi_X23Connected), + /* K4 */ be_nested_str_weak(matter_start), + }), + be_str_weak(_anonymous_), + &be_const_str_solidified, + ( &(const binstruction[ 9]) { /* code */ + 0x68000000, // 0000 GETUPV R0 U0 + 0x8C000100, // 0001 GETMET R0 R0 K0 + 0x7C000200, // 0002 CALL R0 1 + 0xB8020200, // 0003 GETNGBL R0 K1 + 0x8C000102, // 0004 GETMET R0 R0 K2 + 0x58080003, // 0005 LDCONST R2 K3 + 0x580C0004, // 0006 LDCONST R3 K4 + 0x7C000600, // 0007 CALL R0 3 + 0x80000000, // 0008 RET 0 + }) + ), + be_nested_proto( + 4, /* nstack */ + 0, /* argc */ + 0, /* varg */ + 1, /* has upvals */ + ( &(const bupvaldesc[ 1]) { /* upvals */ + be_local_const_upval(1, 0), + }), + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 5]) { /* constants */ + /* K0 */ be_nested_str_weak(start), + /* K1 */ be_nested_str_weak(tasmota), + /* K2 */ be_nested_str_weak(remove_rule), + /* K3 */ be_nested_str_weak(Eth_X23Connected), + /* K4 */ be_nested_str_weak(matter_start), + }), + be_str_weak(_anonymous_), + &be_const_str_solidified, + ( &(const binstruction[ 9]) { /* code */ + 0x68000000, // 0000 GETUPV R0 U0 + 0x8C000100, // 0001 GETMET R0 R0 K0 + 0x7C000200, // 0002 CALL R0 1 + 0xB8020200, // 0003 GETNGBL R0 K1 + 0x8C000102, // 0004 GETMET R0 R0 K2 + 0x58080003, // 0005 LDCONST R2 K3 + 0x580C0004, // 0006 LDCONST R3 K4 + 0x7C000600, // 0007 CALL R0 3 + 0x80000000, // 0008 RET 0 + }) + ), + }), + 1, /* has constants */ + ( &(const bvalue[41]) { /* constants */ + /* K0 */ be_nested_str_weak(crypto), + /* K1 */ be_nested_str_weak(string), + /* K2 */ be_nested_str_weak(tasmota), + /* K3 */ be_nested_str_weak(get_option), + /* K4 */ be_nested_str_weak(matter), + /* K5 */ be_nested_str_weak(MATTER_OPTION), + /* K6 */ be_nested_str_weak(UI), + /* K7 */ be_nested_str_weak(started), + /* K8 */ be_nested_str_weak(plugins), + /* K9 */ be_nested_str_weak(plugins_persist), + /* K10 */ be_nested_str_weak(plugins_classes), + /* K11 */ be_nested_str_weak(register_native_classes), + /* K12 */ be_nested_str_weak(vendorid), + /* K13 */ be_nested_str_weak(VENDOR_ID), + /* K14 */ be_nested_str_weak(productid), + /* K15 */ be_nested_str_weak(PRODUCT_ID), + /* K16 */ be_nested_str_weak(root_iterations), + /* K17 */ be_nested_str_weak(PBKDF_ITERATIONS), + /* K18 */ be_nested_str_weak(root_salt), + /* K19 */ be_nested_str_weak(random), + /* K20 */ be_nested_str_weak(ipv4only), + /* K21 */ be_nested_str_weak(load_param), + /* K22 */ be_nested_str_weak(sessions), + /* K23 */ be_nested_str_weak(Session_Store), + /* K24 */ be_nested_str_weak(load_fabrics), + /* K25 */ be_nested_str_weak(message_handler), + /* K26 */ be_nested_str_weak(MessageHandler), + /* K27 */ be_nested_str_weak(ui), + /* K28 */ be_nested_str_weak(wifi), + /* K29 */ be_nested_str_weak(up), + /* K30 */ be_nested_str_weak(eth), + /* K31 */ be_nested_str_weak(start), + /* K32 */ be_nested_str_weak(add_rule), + /* K33 */ be_nested_str_weak(Wifi_X23Connected), + /* K34 */ be_nested_str_weak(matter_start), + /* K35 */ be_nested_str_weak(Eth_X23Connected), + /* K36 */ be_nested_str_weak(_init_basic_commissioning), + /* K37 */ be_nested_str_weak(add_driver), + /* K38 */ be_nested_str_weak(register_commands), + /* K39 */ be_nested_str_weak(count_active_fabrics), + /* K40 */ be_const_int(0), + }), + be_str_weak(init), + &be_const_str_solidified, + ( &(const binstruction[108]) { /* code */ + 0xA4060000, // 0000 IMPORT R1 K0 + 0xA40A0200, // 0001 IMPORT R2 K1 + 0xB80E0400, // 0002 GETNGBL R3 K2 + 0x8C0C0703, // 0003 GETMET R3 R3 K3 + 0xB8160800, // 0004 GETNGBL R5 K4 + 0x88140B05, // 0005 GETMBR R5 R5 K5 + 0x7C0C0400, // 0006 CALL R3 2 + 0x740E0004, // 0007 JMPT R3 #000D + 0xB80E0800, // 0008 GETNGBL R3 K4 + 0x8C0C0706, // 0009 GETMET R3 R3 K6 + 0x5C140000, // 000A MOVE R5 R0 + 0x7C0C0400, // 000B CALL R3 2 + 0x80000600, // 000C RET 0 + 0x500C0000, // 000D LDBOOL R3 0 0 + 0x90020E03, // 000E SETMBR R0 K7 R3 + 0x600C0012, // 000F GETGBL R3 G18 + 0x7C0C0000, // 0010 CALL R3 0 + 0x90021003, // 0011 SETMBR R0 K8 R3 + 0x500C0000, // 0012 LDBOOL R3 0 0 + 0x90021203, // 0013 SETMBR R0 K9 R3 + 0x600C0013, // 0014 GETGBL R3 G19 + 0x7C0C0000, // 0015 CALL R3 0 + 0x90021403, // 0016 SETMBR R0 K10 R3 + 0x8C0C010B, // 0017 GETMET R3 R0 K11 + 0x7C0C0200, // 0018 CALL R3 1 + 0x880C010D, // 0019 GETMBR R3 R0 K13 + 0x90021803, // 001A SETMBR R0 K12 R3 + 0x880C010F, // 001B GETMBR R3 R0 K15 + 0x90021C03, // 001C SETMBR R0 K14 R3 + 0x880C0111, // 001D GETMBR R3 R0 K17 + 0x90022003, // 001E SETMBR R0 K16 R3 + 0x8C0C0313, // 001F GETMET R3 R1 K19 + 0x5416000F, // 0020 LDINT R5 16 + 0x7C0C0400, // 0021 CALL R3 2 + 0x90022403, // 0022 SETMBR R0 K18 R3 + 0x500C0000, // 0023 LDBOOL R3 0 0 + 0x90022803, // 0024 SETMBR R0 K20 R3 + 0x8C0C0115, // 0025 GETMET R3 R0 K21 + 0x7C0C0200, // 0026 CALL R3 1 + 0xB80E0800, // 0027 GETNGBL R3 K4 + 0x8C0C0717, // 0028 GETMET R3 R3 K23 + 0x5C140000, // 0029 MOVE R5 R0 + 0x7C0C0400, // 002A CALL R3 2 + 0x90022C03, // 002B SETMBR R0 K22 R3 + 0x880C0116, // 002C GETMBR R3 R0 K22 + 0x8C0C0718, // 002D GETMET R3 R3 K24 + 0x7C0C0200, // 002E CALL R3 1 + 0xB80E0800, // 002F GETNGBL R3 K4 + 0x8C0C071A, // 0030 GETMET R3 R3 K26 + 0x5C140000, // 0031 MOVE R5 R0 + 0x7C0C0400, // 0032 CALL R3 2 + 0x90023203, // 0033 SETMBR R0 K25 R3 + 0xB80E0800, // 0034 GETNGBL R3 K4 + 0x8C0C0706, // 0035 GETMET R3 R3 K6 + 0x5C140000, // 0036 MOVE R5 R0 + 0x7C0C0400, // 0037 CALL R3 2 + 0x90023603, // 0038 SETMBR R0 K27 R3 + 0xB80E0400, // 0039 GETNGBL R3 K2 + 0x8C0C071C, // 003A GETMET R3 R3 K28 + 0x7C0C0200, // 003B CALL R3 1 + 0x940C071D, // 003C GETIDX R3 R3 K29 + 0x740E0004, // 003D JMPT R3 #0043 + 0xB80E0400, // 003E GETNGBL R3 K2 + 0x8C0C071E, // 003F GETMET R3 R3 K30 + 0x7C0C0200, // 0040 CALL R3 1 + 0x940C071D, // 0041 GETIDX R3 R3 K29 + 0x780E0001, // 0042 JMPF R3 #0045 + 0x8C0C011F, // 0043 GETMET R3 R0 K31 + 0x7C0C0200, // 0044 CALL R3 1 + 0xB80E0400, // 0045 GETNGBL R3 K2 + 0x8C0C071C, // 0046 GETMET R3 R3 K28 + 0x7C0C0200, // 0047 CALL R3 1 + 0x940C071D, // 0048 GETIDX R3 R3 K29 + 0x740E0005, // 0049 JMPT R3 #0050 + 0xB80E0400, // 004A GETNGBL R3 K2 + 0x8C0C0720, // 004B GETMET R3 R3 K32 + 0x58140021, // 004C LDCONST R5 K33 + 0x84180000, // 004D CLOSURE R6 P0 + 0x581C0022, // 004E LDCONST R7 K34 + 0x7C0C0800, // 004F CALL R3 4 + 0xB80E0400, // 0050 GETNGBL R3 K2 + 0x8C0C071E, // 0051 GETMET R3 R3 K30 + 0x7C0C0200, // 0052 CALL R3 1 + 0x940C071D, // 0053 GETIDX R3 R3 K29 + 0x740E0005, // 0054 JMPT R3 #005B + 0xB80E0400, // 0055 GETNGBL R3 K2 + 0x8C0C0720, // 0056 GETMET R3 R3 K32 + 0x58140023, // 0057 LDCONST R5 K35 + 0x84180001, // 0058 CLOSURE R6 P1 + 0x581C0022, // 0059 LDCONST R7 K34 + 0x7C0C0800, // 005A CALL R3 4 + 0x8C0C0124, // 005B GETMET R3 R0 K36 + 0x7C0C0200, // 005C CALL R3 1 + 0xB80E0400, // 005D GETNGBL R3 K2 + 0x8C0C0725, // 005E GETMET R3 R3 K37 + 0x5C140000, // 005F MOVE R5 R0 + 0x7C0C0400, // 0060 CALL R3 2 + 0x8C0C0126, // 0061 GETMET R3 R0 K38 + 0x7C0C0200, // 0062 CALL R3 1 + 0x880C0116, // 0063 GETMBR R3 R0 K22 + 0x8C0C0727, // 0064 GETMET R3 R3 K39 + 0x7C0C0200, // 0065 CALL R3 1 + 0x240C0728, // 0066 GT R3 R3 K40 + 0x780E0001, // 0067 JMPF R3 #006A + 0x500C0200, // 0068 LDBOOL R3 1 0 + 0x90021203, // 0069 SETMBR R0 K9 R3 + 0xA0000000, // 006A CLOSE R0 + 0x80000000, // 006B RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: _init_basic_commissioning +********************************************************************/ +be_local_closure(Matter_Device__init_basic_commissioning, /* name */ + be_nested_proto( + 3, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 4]) { /* constants */ + /* K0 */ be_nested_str_weak(sessions), + /* K1 */ be_nested_str_weak(count_active_fabrics), + /* K2 */ be_const_int(0), + /* K3 */ be_nested_str_weak(start_root_basic_commissioning), + }), + be_str_weak(_init_basic_commissioning), + &be_const_str_solidified, + ( &(const binstruction[ 8]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x8C040301, // 0001 GETMET R1 R1 K1 + 0x7C040200, // 0002 CALL R1 1 + 0x1C040302, // 0003 EQ R1 R1 K2 + 0x78060001, // 0004 JMPF R1 #0007 + 0x8C040103, // 0005 GETMET R1 R0 K3 + 0x7C040200, // 0006 CALL R1 1 + 0x80000000, // 0007 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: save_before_restart +********************************************************************/ +be_local_closure(Matter_Device_save_before_restart, /* name */ + be_nested_proto( + 3, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 2]) { /* constants */ + /* K0 */ be_nested_str_weak(stop_basic_commissioning), + /* K1 */ be_nested_str_weak(mdns_remove_op_discovery_all_fabrics), + }), + be_str_weak(save_before_restart), + &be_const_str_solidified, + ( &(const binstruction[ 5]) { /* code */ + 0x8C040100, // 0000 GETMET R1 R0 K0 + 0x7C040200, // 0001 CALL R1 1 + 0x8C040101, // 0002 GETMET R1 R0 K1 + 0x7C040200, // 0003 CALL R1 1 + 0x80000000, // 0004 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: start_operational_discovery +********************************************************************/ +be_local_closure(Matter_Device_start_operational_discovery, /* name */ + be_nested_proto( + 9, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 9]) { /* constants */ + /* K0 */ be_nested_str_weak(crypto), + /* K1 */ be_nested_str_weak(mdns), + /* K2 */ be_nested_str_weak(string), + /* K3 */ be_nested_str_weak(stop_basic_commissioning), + /* K4 */ be_nested_str_weak(root_w0), + /* K5 */ be_nested_str_weak(root_L), + /* K6 */ be_nested_str_weak(set_expire_in_seconds), + /* K7 */ be_nested_str_weak(mdns_announce_op_discovery), + /* K8 */ be_nested_str_weak(get_fabric), + }), + be_str_weak(start_operational_discovery), + &be_const_str_solidified, + ( &(const binstruction[17]) { /* code */ + 0xA40A0000, // 0000 IMPORT R2 K0 + 0xA40E0200, // 0001 IMPORT R3 K1 + 0xA4120400, // 0002 IMPORT R4 K2 + 0x8C140103, // 0003 GETMET R5 R0 K3 + 0x7C140200, // 0004 CALL R5 1 + 0x4C140000, // 0005 LDNIL R5 + 0x90020805, // 0006 SETMBR R0 K4 R5 + 0x4C140000, // 0007 LDNIL R5 + 0x90020A05, // 0008 SETMBR R0 K5 R5 + 0x8C140306, // 0009 GETMET R5 R1 K6 + 0x541E003B, // 000A LDINT R7 60 + 0x7C140400, // 000B CALL R5 2 + 0x8C140107, // 000C GETMET R5 R0 K7 + 0x8C1C0308, // 000D GETMET R7 R1 K8 + 0x7C1C0200, // 000E CALL R7 1 + 0x7C140400, // 000F CALL R5 2 + 0x80000000, // 0010 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: start_basic_commissioning +********************************************************************/ +be_local_closure(Matter_Device_start_basic_commissioning, /* name */ + be_nested_proto( + 13, /* nstack */ + 8, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 1, /* has sup protos */ + ( &(const struct bproto*[ 2]) { + be_nested_proto( + 4, /* nstack */ + 0, /* argc */ + 0, /* varg */ + 1, /* has upvals */ + ( &(const bupvaldesc[ 1]) { /* upvals */ + be_local_const_upval(1, 0), + }), + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 4]) { /* constants */ + /* K0 */ be_nested_str_weak(mdns_announce_PASE), + /* K1 */ be_nested_str_weak(tasmota), + /* K2 */ be_nested_str_weak(remove_rule), + /* K3 */ be_nested_str_weak(Wifi_X23Connected), + }), + be_str_weak(_anonymous_), + &be_const_str_solidified, + ( &(const binstruction[ 9]) { /* code */ + 0x68000000, // 0000 GETUPV R0 U0 + 0x8C000100, // 0001 GETMET R0 R0 K0 + 0x7C000200, // 0002 CALL R0 1 + 0xB8020200, // 0003 GETNGBL R0 K1 + 0x8C000102, // 0004 GETMET R0 R0 K2 + 0x58080003, // 0005 LDCONST R2 K3 + 0x580C0000, // 0006 LDCONST R3 K0 + 0x7C000600, // 0007 CALL R0 3 + 0x80000000, // 0008 RET 0 + }) + ), + be_nested_proto( + 4, /* nstack */ + 0, /* argc */ + 0, /* varg */ + 1, /* has upvals */ + ( &(const bupvaldesc[ 1]) { /* upvals */ + be_local_const_upval(1, 0), + }), + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 4]) { /* constants */ + /* K0 */ be_nested_str_weak(mdns_announce_PASE), + /* K1 */ be_nested_str_weak(tasmota), + /* K2 */ be_nested_str_weak(remove_rule), + /* K3 */ be_nested_str_weak(Eth_X23Connected), + }), + be_str_weak(_anonymous_), + &be_const_str_solidified, + ( &(const binstruction[ 9]) { /* code */ + 0x68000000, // 0000 GETUPV R0 U0 + 0x8C000100, // 0001 GETMET R0 R0 K0 + 0x7C000200, // 0002 CALL R0 1 + 0xB8020200, // 0003 GETNGBL R0 K1 + 0x8C000102, // 0004 GETMET R0 R0 K2 + 0x58080003, // 0005 LDCONST R2 K3 + 0x580C0000, // 0006 LDCONST R3 K0 + 0x7C000600, // 0007 CALL R0 3 + 0x80000000, // 0008 RET 0 + }) + ), + }), + 1, /* has constants */ + ( &(const bvalue[16]) { /* constants */ + /* K0 */ be_nested_str_weak(commissioning_open), + /* K1 */ be_nested_str_weak(tasmota), + /* K2 */ be_nested_str_weak(millis), + /* K3 */ be_nested_str_weak(commissioning_iterations), + /* K4 */ be_nested_str_weak(commissioning_discriminator), + /* K5 */ be_nested_str_weak(commissioning_salt), + /* K6 */ be_nested_str_weak(commissioning_w0), + /* K7 */ be_nested_str_weak(commissioning_L), + /* K8 */ be_nested_str_weak(commissioning_admin_fabric), + /* K9 */ be_nested_str_weak(wifi), + /* K10 */ be_nested_str_weak(up), + /* K11 */ be_nested_str_weak(eth), + /* K12 */ be_nested_str_weak(mdns_announce_PASE), + /* K13 */ be_nested_str_weak(add_rule), + /* K14 */ be_nested_str_weak(Wifi_X23Connected), + /* K15 */ be_nested_str_weak(Eth_X23Connected), + }), + be_str_weak(start_basic_commissioning), + &be_const_str_solidified, + ( &(const binstruction[40]) { /* code */ + 0xB8220200, // 0000 GETNGBL R8 K1 + 0x8C201102, // 0001 GETMET R8 R8 K2 + 0x7C200200, // 0002 CALL R8 1 + 0x542603E7, // 0003 LDINT R9 1000 + 0x08240209, // 0004 MUL R9 R1 R9 + 0x00201009, // 0005 ADD R8 R8 R9 + 0x90020008, // 0006 SETMBR R0 K0 R8 + 0x90020602, // 0007 SETMBR R0 K3 R2 + 0x90020803, // 0008 SETMBR R0 K4 R3 + 0x90020A04, // 0009 SETMBR R0 K5 R4 + 0x90020C05, // 000A SETMBR R0 K6 R5 + 0x90020E06, // 000B SETMBR R0 K7 R6 + 0x90021007, // 000C SETMBR R0 K8 R7 + 0xB8220200, // 000D GETNGBL R8 K1 + 0x8C201109, // 000E GETMET R8 R8 K9 + 0x7C200200, // 000F CALL R8 1 + 0x9420110A, // 0010 GETIDX R8 R8 K10 + 0x74220004, // 0011 JMPT R8 #0017 + 0xB8220200, // 0012 GETNGBL R8 K1 + 0x8C20110B, // 0013 GETMET R8 R8 K11 + 0x7C200200, // 0014 CALL R8 1 + 0x9420110A, // 0015 GETIDX R8 R8 K10 + 0x78220002, // 0016 JMPF R8 #001A + 0x8C20010C, // 0017 GETMET R8 R0 K12 + 0x7C200200, // 0018 CALL R8 1 + 0x7002000B, // 0019 JMP #0026 + 0xB8220200, // 001A GETNGBL R8 K1 + 0x8C20110D, // 001B GETMET R8 R8 K13 + 0x5828000E, // 001C LDCONST R10 K14 + 0x842C0000, // 001D CLOSURE R11 P0 + 0x5830000C, // 001E LDCONST R12 K12 + 0x7C200800, // 001F CALL R8 4 + 0xB8220200, // 0020 GETNGBL R8 K1 + 0x8C20110D, // 0021 GETMET R8 R8 K13 + 0x5828000F, // 0022 LDCONST R10 K15 + 0x842C0001, // 0023 CLOSURE R11 P1 + 0x5830000C, // 0024 LDCONST R12 K12 + 0x7C200800, // 0025 CALL R8 4 + 0xA0000000, // 0026 CLOSE R0 + 0x80000000, // 0027 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: msg_received +********************************************************************/ +be_local_closure(Matter_Device_msg_received, /* name */ + be_nested_proto( + 9, /* nstack */ + 4, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 2]) { /* constants */ + /* K0 */ be_nested_str_weak(message_handler), + /* K1 */ be_nested_str_weak(msg_received), + }), + be_str_weak(msg_received), + &be_const_str_solidified, + ( &(const binstruction[ 7]) { /* code */ + 0x88100100, // 0000 GETMBR R4 R0 K0 + 0x8C100901, // 0001 GETMET R4 R4 K1 + 0x5C180200, // 0002 MOVE R6 R1 + 0x5C1C0400, // 0003 MOVE R7 R2 + 0x5C200600, // 0004 MOVE R8 R3 + 0x7C100800, // 0005 CALL R4 4 + 0x80040800, // 0006 RET 1 R4 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: _start_udp +********************************************************************/ +be_local_closure(Matter_Device__start_udp, /* name */ + be_nested_proto( + 6, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 1, /* has sup protos */ + ( &(const struct bproto*[ 1]) { + be_nested_proto( + 8, /* nstack */ + 3, /* argc */ + 0, /* varg */ + 1, /* has upvals */ + ( &(const bupvaldesc[ 1]) { /* upvals */ + be_local_const_upval(1, 0), + }), + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 1]) { /* constants */ + /* K0 */ be_nested_str_weak(msg_received), + }), + be_str_weak(_X3Clambda_X3E), + &be_const_str_solidified, + ( &(const binstruction[ 7]) { /* code */ + 0x680C0000, // 0000 GETUPV R3 U0 + 0x8C0C0700, // 0001 GETMET R3 R3 K0 + 0x5C140000, // 0002 MOVE R5 R0 + 0x5C180200, // 0003 MOVE R6 R1 + 0x5C1C0400, // 0004 MOVE R7 R2 + 0x7C0C0800, // 0005 CALL R3 4 + 0x80040600, // 0006 RET 1 R3 + }) + ), + }), + 1, /* has constants */ + ( &(const bvalue[ 9]) { /* constants */ + /* K0 */ be_nested_str_weak(udp_server), + /* K1 */ be_nested_str_weak(tasmota), + /* K2 */ be_nested_str_weak(log), + /* K3 */ be_nested_str_weak(MTR_X3A_X20starting_X20UDP_X20server_X20on_X20port_X3A_X20), + /* K4 */ be_const_int(2), + /* K5 */ be_nested_str_weak(matter), + /* K6 */ be_nested_str_weak(UDPServer), + /* K7 */ be_nested_str_weak(), + /* K8 */ be_nested_str_weak(start), + }), + be_str_weak(_start_udp), + &be_const_str_solidified, + ( &(const binstruction[27]) { /* code */ + 0x88080100, // 0000 GETMBR R2 R0 K0 + 0x780A0000, // 0001 JMPF R2 #0003 + 0x80000400, // 0002 RET 0 + 0x4C080000, // 0003 LDNIL R2 + 0x1C080202, // 0004 EQ R2 R1 R2 + 0x780A0000, // 0005 JMPF R2 #0007 + 0x540615A3, // 0006 LDINT R1 5540 + 0xB80A0200, // 0007 GETNGBL R2 K1 + 0x8C080502, // 0008 GETMET R2 R2 K2 + 0x60100008, // 0009 GETGBL R4 G8 + 0x5C140200, // 000A MOVE R5 R1 + 0x7C100200, // 000B CALL R4 1 + 0x00120604, // 000C ADD R4 K3 R4 + 0x58140004, // 000D LDCONST R5 K4 + 0x7C080600, // 000E CALL R2 3 + 0xB80A0A00, // 000F GETNGBL R2 K5 + 0x8C080506, // 0010 GETMET R2 R2 K6 + 0x58100007, // 0011 LDCONST R4 K7 + 0x5C140200, // 0012 MOVE R5 R1 + 0x7C080600, // 0013 CALL R2 3 + 0x90020002, // 0014 SETMBR R0 K0 R2 + 0x88080100, // 0015 GETMBR R2 R0 K0 + 0x8C080508, // 0016 GETMET R2 R2 K8 + 0x84100000, // 0017 CLOSURE R4 P0 + 0x7C080400, // 0018 CALL R2 2 + 0xA0000000, // 0019 CLOSE R0 + 0x80000000, // 001A RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: mdns_remove_op_discovery +********************************************************************/ +be_local_closure(Matter_Device_mdns_remove_op_discovery, /* name */ + be_nested_proto( + 14, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[24]) { /* constants */ + /* K0 */ be_nested_str_weak(mdns), + /* K1 */ be_nested_str_weak(string), + /* K2 */ be_nested_str_weak(get_device_id), + /* K3 */ be_nested_str_weak(copy), + /* K4 */ be_nested_str_weak(reverse), + /* K5 */ be_nested_str_weak(get_fabric_compressed), + /* K6 */ be_nested_str_weak(tohex), + /* K7 */ be_nested_str_weak(_X2D), + /* K8 */ be_nested_str_weak(tasmota), + /* K9 */ be_nested_str_weak(eth), + /* K10 */ be_nested_str_weak(find), + /* K11 */ be_nested_str_weak(up), + /* K12 */ be_nested_str_weak(log), + /* K13 */ be_nested_str_weak(format), + /* K14 */ be_nested_str_weak(MTR_X3A_X20remove_X20mDNS_X20on_X20_X25s_X20_X27_X25s_X27), + /* K15 */ be_const_int(2), + /* K16 */ be_nested_str_weak(remove_service), + /* K17 */ be_nested_str_weak(_matter), + /* K18 */ be_nested_str_weak(_tcp), + /* K19 */ be_nested_str_weak(hostname_eth), + /* K20 */ be_nested_str_weak(wifi), + /* K21 */ be_nested_str_weak(hostname_wifi), + /* K22 */ be_nested_str_weak(MTR_X3A_X20Exception), + /* K23 */ be_nested_str_weak(_X7C), + }), + be_str_weak(mdns_remove_op_discovery), + &be_const_str_solidified, + ( &(const binstruction[81]) { /* code */ + 0xA40A0000, // 0000 IMPORT R2 K0 + 0xA40E0200, // 0001 IMPORT R3 K1 + 0xA802003B, // 0002 EXBLK 0 #003F + 0x8C100302, // 0003 GETMET R4 R1 K2 + 0x7C100200, // 0004 CALL R4 1 + 0x8C100903, // 0005 GETMET R4 R4 K3 + 0x7C100200, // 0006 CALL R4 1 + 0x8C100904, // 0007 GETMET R4 R4 K4 + 0x7C100200, // 0008 CALL R4 1 + 0x8C140305, // 0009 GETMET R5 R1 K5 + 0x7C140200, // 000A CALL R5 1 + 0x8C180B06, // 000B GETMET R6 R5 K6 + 0x7C180200, // 000C CALL R6 1 + 0x00180D07, // 000D ADD R6 R6 K7 + 0x8C1C0906, // 000E GETMET R7 R4 K6 + 0x7C1C0200, // 000F CALL R7 1 + 0x00180C07, // 0010 ADD R6 R6 R7 + 0xB81E1000, // 0011 GETNGBL R7 K8 + 0x8C1C0F09, // 0012 GETMET R7 R7 K9 + 0x7C1C0200, // 0013 CALL R7 1 + 0x8C1C0F0A, // 0014 GETMET R7 R7 K10 + 0x5824000B, // 0015 LDCONST R9 K11 + 0x7C1C0400, // 0016 CALL R7 2 + 0x781E000E, // 0017 JMPF R7 #0027 + 0xB81E1000, // 0018 GETNGBL R7 K8 + 0x8C1C0F0C, // 0019 GETMET R7 R7 K12 + 0x8C24070D, // 001A GETMET R9 R3 K13 + 0x582C000E, // 001B LDCONST R11 K14 + 0x58300009, // 001C LDCONST R12 K9 + 0x5C340C00, // 001D MOVE R13 R6 + 0x7C240800, // 001E CALL R9 4 + 0x5828000F, // 001F LDCONST R10 K15 + 0x7C1C0600, // 0020 CALL R7 3 + 0x8C1C0510, // 0021 GETMET R7 R2 K16 + 0x58240011, // 0022 LDCONST R9 K17 + 0x58280012, // 0023 LDCONST R10 K18 + 0x5C2C0C00, // 0024 MOVE R11 R6 + 0x88300113, // 0025 GETMBR R12 R0 K19 + 0x7C1C0A00, // 0026 CALL R7 5 + 0xB81E1000, // 0027 GETNGBL R7 K8 + 0x8C1C0F14, // 0028 GETMET R7 R7 K20 + 0x7C1C0200, // 0029 CALL R7 1 + 0x8C1C0F0A, // 002A GETMET R7 R7 K10 + 0x5824000B, // 002B LDCONST R9 K11 + 0x7C1C0400, // 002C CALL R7 2 + 0x781E000E, // 002D JMPF R7 #003D + 0xB81E1000, // 002E GETNGBL R7 K8 + 0x8C1C0F0C, // 002F GETMET R7 R7 K12 + 0x8C24070D, // 0030 GETMET R9 R3 K13 + 0x582C000E, // 0031 LDCONST R11 K14 + 0x58300014, // 0032 LDCONST R12 K20 + 0x5C340C00, // 0033 MOVE R13 R6 + 0x7C240800, // 0034 CALL R9 4 + 0x5828000F, // 0035 LDCONST R10 K15 + 0x7C1C0600, // 0036 CALL R7 3 + 0x8C1C0510, // 0037 GETMET R7 R2 K16 + 0x58240011, // 0038 LDCONST R9 K17 + 0x58280012, // 0039 LDCONST R10 K18 + 0x5C2C0C00, // 003A MOVE R11 R6 + 0x88300115, // 003B GETMBR R12 R0 K21 + 0x7C1C0A00, // 003C CALL R7 5 + 0xA8040001, // 003D EXBLK 1 1 + 0x70020010, // 003E JMP #0050 + 0xAC100002, // 003F CATCH R4 0 2 + 0x7002000D, // 0040 JMP #004F + 0xB81A1000, // 0041 GETNGBL R6 K8 + 0x8C180D0C, // 0042 GETMET R6 R6 K12 + 0x60200008, // 0043 GETGBL R8 G8 + 0x5C240800, // 0044 MOVE R9 R4 + 0x7C200200, // 0045 CALL R8 1 + 0x00222C08, // 0046 ADD R8 K22 R8 + 0x00201117, // 0047 ADD R8 R8 K23 + 0x60240008, // 0048 GETGBL R9 G8 + 0x5C280A00, // 0049 MOVE R10 R5 + 0x7C240200, // 004A CALL R9 1 + 0x00201009, // 004B ADD R8 R8 R9 + 0x5824000F, // 004C LDCONST R9 K15 + 0x7C180600, // 004D CALL R6 3 + 0x70020000, // 004E JMP #0050 + 0xB0080000, // 004F RAISE 2 R0 R0 + 0x80000000, // 0050 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: load_param +********************************************************************/ +be_local_closure(Matter_Device_load_param, /* name */ + be_nested_proto( + 12, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[27]) { /* constants */ + /* K0 */ be_nested_str_weak(string), + /* K1 */ be_nested_str_weak(crypto), + /* K2 */ be_nested_str_weak(FILENAME), + /* K3 */ be_nested_str_weak(read), + /* K4 */ be_nested_str_weak(close), + /* K5 */ be_nested_str_weak(json), + /* K6 */ be_nested_str_weak(load), + /* K7 */ be_nested_str_weak(root_discriminator), + /* K8 */ be_nested_str_weak(find), + /* K9 */ be_nested_str_weak(distinguish), + /* K10 */ be_nested_str_weak(root_passcode), + /* K11 */ be_nested_str_weak(passcode), + /* K12 */ be_nested_str_weak(ipv4only), + /* K13 */ be_nested_str_weak(config), + /* K14 */ be_nested_str_weak(_load_plugins_config), + /* K15 */ be_nested_str_weak(plugins_persist), + /* K16 */ be_nested_str_weak(io_error), + /* K17 */ be_nested_str_weak(tasmota), + /* K18 */ be_nested_str_weak(log), + /* K19 */ be_nested_str_weak(MTR_X3A_X20Session_Store_X3A_X3Aload_X20Exception_X3A), + /* K20 */ be_nested_str_weak(_X7C), + /* K21 */ be_const_int(2), + /* K22 */ be_nested_str_weak(random), + /* K23 */ be_nested_str_weak(get), + /* K24 */ be_const_int(0), + /* K25 */ be_nested_str_weak(PASSCODE_DEFAULT), + /* K26 */ be_nested_str_weak(save_param), + }), + be_str_weak(load_param), + &be_const_str_solidified, + ( &(const binstruction[88]) { /* code */ + 0xA4060000, // 0000 IMPORT R1 K0 + 0xA40A0200, // 0001 IMPORT R2 K1 + 0xA8020026, // 0002 EXBLK 0 #002A + 0x600C0011, // 0003 GETGBL R3 G17 + 0x88100102, // 0004 GETMBR R4 R0 K2 + 0x7C0C0200, // 0005 CALL R3 1 + 0x8C100703, // 0006 GETMET R4 R3 K3 + 0x7C100200, // 0007 CALL R4 1 + 0x8C140704, // 0008 GETMET R5 R3 K4 + 0x7C140200, // 0009 CALL R5 1 + 0xA4160A00, // 000A IMPORT R5 K5 + 0x8C180B06, // 000B GETMET R6 R5 K6 + 0x5C200800, // 000C MOVE R8 R4 + 0x7C180400, // 000D CALL R6 2 + 0x8C1C0D08, // 000E GETMET R7 R6 K8 + 0x58240009, // 000F LDCONST R9 K9 + 0x88280107, // 0010 GETMBR R10 R0 K7 + 0x7C1C0600, // 0011 CALL R7 3 + 0x90020E07, // 0012 SETMBR R0 K7 R7 + 0x8C1C0D08, // 0013 GETMET R7 R6 K8 + 0x5824000B, // 0014 LDCONST R9 K11 + 0x8828010A, // 0015 GETMBR R10 R0 K10 + 0x7C1C0600, // 0016 CALL R7 3 + 0x90021407, // 0017 SETMBR R0 K10 R7 + 0x601C0017, // 0018 GETGBL R7 G23 + 0x8C200D08, // 0019 GETMET R8 R6 K8 + 0x5828000C, // 001A LDCONST R10 K12 + 0x502C0000, // 001B LDBOOL R11 0 0 + 0x7C200600, // 001C CALL R8 3 + 0x7C1C0200, // 001D CALL R7 1 + 0x90021807, // 001E SETMBR R0 K12 R7 + 0x8C1C0D08, // 001F GETMET R7 R6 K8 + 0x5824000D, // 0020 LDCONST R9 K13 + 0x7C1C0400, // 0021 CALL R7 2 + 0x781E0004, // 0022 JMPF R7 #0028 + 0x8C20010E, // 0023 GETMET R8 R0 K14 + 0x5C280E00, // 0024 MOVE R10 R7 + 0x7C200400, // 0025 CALL R8 2 + 0x50200200, // 0026 LDBOOL R8 1 0 + 0x90021E08, // 0027 SETMBR R0 K15 R8 + 0xA8040001, // 0028 EXBLK 1 1 + 0x70020012, // 0029 JMP #003D + 0xAC0C0002, // 002A CATCH R3 0 2 + 0x7002000F, // 002B JMP #003C + 0x20140710, // 002C NE R5 R3 K16 + 0x7816000C, // 002D JMPF R5 #003B + 0xB8162200, // 002E GETNGBL R5 K17 + 0x8C140B12, // 002F GETMET R5 R5 K18 + 0x601C0008, // 0030 GETGBL R7 G8 + 0x5C200600, // 0031 MOVE R8 R3 + 0x7C1C0200, // 0032 CALL R7 1 + 0x001E2607, // 0033 ADD R7 K19 R7 + 0x001C0F14, // 0034 ADD R7 R7 K20 + 0x60200008, // 0035 GETGBL R8 G8 + 0x5C240800, // 0036 MOVE R9 R4 + 0x7C200200, // 0037 CALL R8 1 + 0x001C0E08, // 0038 ADD R7 R7 R8 + 0x58200015, // 0039 LDCONST R8 K21 + 0x7C140600, // 003A CALL R5 3 + 0x70020000, // 003B JMP #003D + 0xB0080000, // 003C RAISE 2 R0 R0 + 0x500C0000, // 003D LDBOOL R3 0 0 + 0x88100107, // 003E GETMBR R4 R0 K7 + 0x4C140000, // 003F LDNIL R5 + 0x1C100805, // 0040 EQ R4 R4 R5 + 0x7812000A, // 0041 JMPF R4 #004D + 0x8C100516, // 0042 GETMET R4 R2 K22 + 0x58180015, // 0043 LDCONST R6 K21 + 0x7C100400, // 0044 CALL R4 2 + 0x8C100917, // 0045 GETMET R4 R4 K23 + 0x58180018, // 0046 LDCONST R6 K24 + 0x581C0015, // 0047 LDCONST R7 K21 + 0x7C100600, // 0048 CALL R4 3 + 0x54160FFE, // 0049 LDINT R5 4095 + 0x2C100805, // 004A AND R4 R4 R5 + 0x90020E04, // 004B SETMBR R0 K7 R4 + 0x500C0200, // 004C LDBOOL R3 1 0 + 0x8810010A, // 004D GETMBR R4 R0 K10 + 0x4C140000, // 004E LDNIL R5 + 0x1C100805, // 004F EQ R4 R4 R5 + 0x78120002, // 0050 JMPF R4 #0054 + 0x88100119, // 0051 GETMBR R4 R0 K25 + 0x90021404, // 0052 SETMBR R0 K10 R4 + 0x500C0200, // 0053 LDBOOL R3 1 0 + 0x780E0001, // 0054 JMPF R3 #0057 + 0x8C10011A, // 0055 GETMET R4 R0 K26 + 0x7C100200, // 0056 CALL R4 1 + 0x80000000, // 0057 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: _load_plugins_config +********************************************************************/ +be_local_closure(Matter_Device__load_plugins_config, /* name */ + be_nested_proto( + 19, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[27]) { /* constants */ + /* K0 */ be_nested_str_weak(string), + /* K1 */ be_nested_str_weak(k2l_num), + /* K2 */ be_nested_str_weak(tasmota), + /* K3 */ be_nested_str_weak(log), + /* K4 */ be_nested_str_weak(MTR_X3A_X20endpoints_X20to_X20be_X20configured_X20), + /* K5 */ be_const_int(3), + /* K6 */ be_nested_str_weak(format), + /* K7 */ be_nested_str_weak(MTR_X3A_X20endpoint_X20_X25i_X20config_X20_X25s), + /* K8 */ be_nested_str_weak(find), + /* K9 */ be_nested_str_weak(type), + /* K10 */ be_nested_str_weak(MTR_X3A_X20no_X20class_X20name_X2C_X20skipping), + /* K11 */ be_nested_str_weak(plugins_classes), + /* K12 */ be_nested_str_weak(MTR_X3A_X20unknown_X20class_X20name_X20_X27), + /* K13 */ be_nested_str_weak(_X27_X20skipping), + /* K14 */ be_const_int(2), + /* K15 */ be_nested_str_weak(plugins), + /* K16 */ be_nested_str_weak(push), + /* K17 */ be_nested_str_weak(), + /* K18 */ be_nested_str_weak(k2l), + /* K19 */ be_nested_str_weak(_X20_X25s_X3A_X25s), + /* K20 */ be_nested_str_weak(stop_iteration), + /* K21 */ be_nested_str_weak(MTR_X3A_X20endpoint_X3A_X25i_X20type_X3A_X25s_X25s), + /* K22 */ be_nested_str_weak(MTR_X3A_X20Exception), + /* K23 */ be_nested_str_weak(_X7C), + /* K24 */ be_nested_str_weak(publish_result), + /* K25 */ be_nested_str_weak(_X7B_X22Matter_X22_X3A_X7B_X22Initialized_X22_X3A1_X7D_X7D), + /* K26 */ be_nested_str_weak(Matter), + }), + be_str_weak(_load_plugins_config), + &be_const_str_solidified, + ( &(const binstruction[133]) { /* code */ + 0xA40A0000, // 0000 IMPORT R2 K0 + 0x8C0C0101, // 0001 GETMET R3 R0 K1 + 0x5C140200, // 0002 MOVE R5 R1 + 0x7C0C0400, // 0003 CALL R3 2 + 0xB8120400, // 0004 GETNGBL R4 K2 + 0x8C100903, // 0005 GETMET R4 R4 K3 + 0x60180008, // 0006 GETGBL R6 G8 + 0x5C1C0600, // 0007 MOVE R7 R3 + 0x7C180200, // 0008 CALL R6 1 + 0x001A0806, // 0009 ADD R6 K4 R6 + 0x581C0005, // 000A LDCONST R7 K5 + 0x7C100600, // 000B CALL R4 3 + 0x60100010, // 000C GETGBL R4 G16 + 0x5C140600, // 000D MOVE R5 R3 + 0x7C100200, // 000E CALL R4 1 + 0xA802006B, // 000F EXBLK 0 #007C + 0x5C140800, // 0010 MOVE R5 R4 + 0x7C140000, // 0011 CALL R5 0 + 0xA8020056, // 0012 EXBLK 0 #006A + 0x60180008, // 0013 GETGBL R6 G8 + 0x5C1C0A00, // 0014 MOVE R7 R5 + 0x7C180200, // 0015 CALL R6 1 + 0x94180206, // 0016 GETIDX R6 R1 R6 + 0xB81E0400, // 0017 GETNGBL R7 K2 + 0x8C1C0F03, // 0018 GETMET R7 R7 K3 + 0x8C240506, // 0019 GETMET R9 R2 K6 + 0x582C0007, // 001A LDCONST R11 K7 + 0x5C300A00, // 001B MOVE R12 R5 + 0x5C340C00, // 001C MOVE R13 R6 + 0x7C240800, // 001D CALL R9 4 + 0x58280005, // 001E LDCONST R10 K5 + 0x7C1C0600, // 001F CALL R7 3 + 0x8C1C0D08, // 0020 GETMET R7 R6 K8 + 0x58240009, // 0021 LDCONST R9 K9 + 0x7C1C0400, // 0022 CALL R7 2 + 0x4C200000, // 0023 LDNIL R8 + 0x1C200E08, // 0024 EQ R8 R7 R8 + 0x78220006, // 0025 JMPF R8 #002D + 0xB8220400, // 0026 GETNGBL R8 K2 + 0x8C201103, // 0027 GETMET R8 R8 K3 + 0x5828000A, // 0028 LDCONST R10 K10 + 0x582C0005, // 0029 LDCONST R11 K5 + 0x7C200600, // 002A CALL R8 3 + 0xA8040001, // 002B EXBLK 1 1 + 0x7001FFE2, // 002C JMP #0010 + 0x8820010B, // 002D GETMBR R8 R0 K11 + 0x8C201108, // 002E GETMET R8 R8 K8 + 0x5C280E00, // 002F MOVE R10 R7 + 0x7C200400, // 0030 CALL R8 2 + 0x4C240000, // 0031 LDNIL R9 + 0x1C241009, // 0032 EQ R9 R8 R9 + 0x7826000A, // 0033 JMPF R9 #003F + 0xB8260400, // 0034 GETNGBL R9 K2 + 0x8C241303, // 0035 GETMET R9 R9 K3 + 0x602C0008, // 0036 GETGBL R11 G8 + 0x5C300E00, // 0037 MOVE R12 R7 + 0x7C2C0200, // 0038 CALL R11 1 + 0x002E180B, // 0039 ADD R11 K12 R11 + 0x002C170D, // 003A ADD R11 R11 K13 + 0x5830000E, // 003B LDCONST R12 K14 + 0x7C240600, // 003C CALL R9 3 + 0xA8040001, // 003D EXBLK 1 1 + 0x7001FFD0, // 003E JMP #0010 + 0x5C241000, // 003F MOVE R9 R8 + 0x5C280000, // 0040 MOVE R10 R0 + 0x5C2C0A00, // 0041 MOVE R11 R5 + 0x5C300C00, // 0042 MOVE R12 R6 + 0x7C240600, // 0043 CALL R9 3 + 0x8828010F, // 0044 GETMBR R10 R0 K15 + 0x8C281510, // 0045 GETMET R10 R10 K16 + 0x5C301200, // 0046 MOVE R12 R9 + 0x7C280400, // 0047 CALL R10 2 + 0x58280011, // 0048 LDCONST R10 K17 + 0x602C0010, // 0049 GETGBL R11 G16 + 0x8C300112, // 004A GETMET R12 R0 K18 + 0x5C380C00, // 004B MOVE R14 R6 + 0x7C300400, // 004C CALL R12 2 + 0x7C2C0200, // 004D CALL R11 1 + 0xA802000B, // 004E EXBLK 0 #005B + 0x5C301600, // 004F MOVE R12 R11 + 0x7C300000, // 0050 CALL R12 0 + 0x1C341909, // 0051 EQ R13 R12 K9 + 0x78360000, // 0052 JMPF R13 #0054 + 0x7001FFFA, // 0053 JMP #004F + 0x8C340506, // 0054 GETMET R13 R2 K6 + 0x583C0013, // 0055 LDCONST R15 K19 + 0x5C401800, // 0056 MOVE R16 R12 + 0x94440C0C, // 0057 GETIDX R17 R6 R12 + 0x7C340800, // 0058 CALL R13 4 + 0x0028140D, // 0059 ADD R10 R10 R13 + 0x7001FFF3, // 005A JMP #004F + 0x582C0014, // 005B LDCONST R11 K20 + 0xAC2C0200, // 005C CATCH R11 1 0 + 0xB0080000, // 005D RAISE 2 R0 R0 + 0xB82E0400, // 005E GETNGBL R11 K2 + 0x8C2C1703, // 005F GETMET R11 R11 K3 + 0x8C340506, // 0060 GETMET R13 R2 K6 + 0x583C0015, // 0061 LDCONST R15 K21 + 0x5C400A00, // 0062 MOVE R16 R5 + 0x5C440E00, // 0063 MOVE R17 R7 + 0x5C481400, // 0064 MOVE R18 R10 + 0x7C340A00, // 0065 CALL R13 5 + 0x5838000E, // 0066 LDCONST R14 K14 + 0x7C2C0600, // 0067 CALL R11 3 + 0xA8040001, // 0068 EXBLK 1 1 + 0x70020010, // 0069 JMP #007B + 0xAC180002, // 006A CATCH R6 0 2 + 0x7002000D, // 006B JMP #007A + 0xB8220400, // 006C GETNGBL R8 K2 + 0x8C201103, // 006D GETMET R8 R8 K3 + 0x60280008, // 006E GETGBL R10 G8 + 0x5C2C0C00, // 006F MOVE R11 R6 + 0x7C280200, // 0070 CALL R10 1 + 0x002A2C0A, // 0071 ADD R10 K22 R10 + 0x00281517, // 0072 ADD R10 R10 K23 + 0x602C0008, // 0073 GETGBL R11 G8 + 0x5C300E00, // 0074 MOVE R12 R7 + 0x7C2C0200, // 0075 CALL R11 1 + 0x0028140B, // 0076 ADD R10 R10 R11 + 0x582C000E, // 0077 LDCONST R11 K14 + 0x7C200600, // 0078 CALL R8 3 + 0x70020000, // 0079 JMP #007B + 0xB0080000, // 007A RAISE 2 R0 R0 + 0x7001FF93, // 007B JMP #0010 + 0x58100014, // 007C LDCONST R4 K20 + 0xAC100200, // 007D CATCH R4 1 0 + 0xB0080000, // 007E RAISE 2 R0 R0 + 0xB8120400, // 007F GETNGBL R4 K2 + 0x8C100918, // 0080 GETMET R4 R4 K24 + 0x58180019, // 0081 LDCONST R6 K25 + 0x581C001A, // 0082 LDCONST R7 K26 + 0x7C100600, // 0083 CALL R4 3 + 0x80000000, // 0084 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: autoconf_device_map +********************************************************************/ +be_local_closure(Matter_Device_autoconf_device_map, /* name */ + be_nested_proto( + 16, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[36]) { /* constants */ + /* K0 */ be_nested_str_weak(json), + /* K1 */ be_nested_str_weak(0), + /* K2 */ be_nested_str_weak(type), + /* K3 */ be_nested_str_weak(root), + /* K4 */ be_const_int(1), + /* K5 */ be_nested_str_weak(light), + /* K6 */ be_nested_str_weak(get), + /* K7 */ be_nested_str_weak(find), + /* K8 */ be_nested_str_weak(channels), + /* K9 */ be_nested_str_weak(), + /* K10 */ be_const_int(0), + /* K11 */ be_nested_str_weak(light1), + /* K12 */ be_const_int(2), + /* K13 */ be_nested_str_weak(light2), + /* K14 */ be_nested_str_weak(light3), + /* K15 */ be_nested_str_weak(tasmota), + /* K16 */ be_nested_str_weak(get_power), + /* K17 */ be_nested_str_weak(relay), + /* K18 */ be_nested_str_weak(load), + /* K19 */ be_nested_str_weak(read_sensors), + /* K20 */ be_nested_str_weak(k2l), + /* K21 */ be_nested_str_weak(contains), + /* K22 */ be_nested_str_weak(Temperature), + /* K23 */ be_nested_str_weak(_X23Temperature), + /* K24 */ be_nested_str_weak(temperature), + /* K25 */ be_nested_str_weak(filter), + /* K26 */ be_nested_str_weak(stop_iteration), + /* K27 */ be_nested_str_weak(Pressure), + /* K28 */ be_nested_str_weak(_X23Pressure), + /* K29 */ be_nested_str_weak(pressure), + /* K30 */ be_nested_str_weak(Illuminance), + /* K31 */ be_nested_str_weak(_X23Illuminance), + /* K32 */ be_nested_str_weak(illuminance), + /* K33 */ be_nested_str_weak(Humidity), + /* K34 */ be_nested_str_weak(_X23Humidity), + /* K35 */ be_nested_str_weak(humidity), + }), + be_str_weak(autoconf_device_map), + &be_const_str_solidified, + ( &(const binstruction[235]) { /* code */ + 0xA4060000, // 0000 IMPORT R1 K0 + 0x60080013, // 0001 GETGBL R2 G19 + 0x7C080000, // 0002 CALL R2 0 + 0x600C0013, // 0003 GETGBL R3 G19 + 0x7C0C0000, // 0004 CALL R3 0 + 0x980E0503, // 0005 SETIDX R3 K2 K3 + 0x980A0203, // 0006 SETIDX R2 K1 R3 + 0x580C0004, // 0007 LDCONST R3 K4 + 0x50100000, // 0008 LDBOOL R4 0 0 + 0xA4160A00, // 0009 IMPORT R5 K5 + 0x8C180B06, // 000A GETMET R6 R5 K6 + 0x7C180200, // 000B CALL R6 1 + 0x4C1C0000, // 000C LDNIL R7 + 0x201C0C07, // 000D NE R7 R6 R7 + 0x781E0024, // 000E JMPF R7 #0034 + 0x601C000C, // 000F GETGBL R7 G12 + 0x8C200D07, // 0010 GETMET R8 R6 K7 + 0x58280008, // 0011 LDCONST R10 K8 + 0x582C0009, // 0012 LDCONST R11 K9 + 0x7C200600, // 0013 CALL R8 3 + 0x7C1C0200, // 0014 CALL R7 1 + 0x24200F0A, // 0015 GT R8 R7 K10 + 0x7822001C, // 0016 JMPF R8 #0034 + 0x1C200F04, // 0017 EQ R8 R7 K4 + 0x78220007, // 0018 JMPF R8 #0021 + 0x60200008, // 0019 GETGBL R8 G8 + 0x5C240600, // 001A MOVE R9 R3 + 0x7C200200, // 001B CALL R8 1 + 0x60240013, // 001C GETGBL R9 G19 + 0x7C240000, // 001D CALL R9 0 + 0x9826050B, // 001E SETIDX R9 K2 K11 + 0x98081009, // 001F SETIDX R2 R8 R9 + 0x70020010, // 0020 JMP #0032 + 0x1C200F0C, // 0021 EQ R8 R7 K12 + 0x78220007, // 0022 JMPF R8 #002B + 0x60200008, // 0023 GETGBL R8 G8 + 0x5C240600, // 0024 MOVE R9 R3 + 0x7C200200, // 0025 CALL R8 1 + 0x60240013, // 0026 GETGBL R9 G19 + 0x7C240000, // 0027 CALL R9 0 + 0x9826050D, // 0028 SETIDX R9 K2 K13 + 0x98081009, // 0029 SETIDX R2 R8 R9 + 0x70020006, // 002A JMP #0032 + 0x60200008, // 002B GETGBL R8 G8 + 0x5C240600, // 002C MOVE R9 R3 + 0x7C200200, // 002D CALL R8 1 + 0x60240013, // 002E GETGBL R9 G19 + 0x7C240000, // 002F CALL R9 0 + 0x9826050E, // 0030 SETIDX R9 K2 K14 + 0x98081009, // 0031 SETIDX R2 R8 R9 + 0x50100200, // 0032 LDBOOL R4 1 0 + 0x000C0704, // 0033 ADD R3 R3 K4 + 0x601C000C, // 0034 GETGBL R7 G12 + 0xB8221E00, // 0035 GETNGBL R8 K15 + 0x8C201110, // 0036 GETMET R8 R8 K16 + 0x7C200200, // 0037 CALL R8 1 + 0x7C1C0200, // 0038 CALL R7 1 + 0x5820000A, // 0039 LDCONST R8 K10 + 0x78120000, // 003A JMPF R4 #003C + 0x041C0F04, // 003B SUB R7 R7 K4 + 0x14241007, // 003C LT R9 R8 R7 + 0x7826000A, // 003D JMPF R9 #0049 + 0x60240008, // 003E GETGBL R9 G8 + 0x5C280600, // 003F MOVE R10 R3 + 0x7C240200, // 0040 CALL R9 1 + 0x60280013, // 0041 GETGBL R10 G19 + 0x7C280000, // 0042 CALL R10 0 + 0x982A0511, // 0043 SETIDX R10 K2 K17 + 0x982A2208, // 0044 SETIDX R10 K17 R8 + 0x9808120A, // 0045 SETIDX R2 R9 R10 + 0x00201104, // 0046 ADD R8 R8 K4 + 0x000C0704, // 0047 ADD R3 R3 K4 + 0x7001FFF2, // 0048 JMP #003C + 0x8C240312, // 0049 GETMET R9 R1 K18 + 0xB82E1E00, // 004A GETNGBL R11 K15 + 0x8C2C1713, // 004B GETMET R11 R11 K19 + 0x7C2C0200, // 004C CALL R11 1 + 0x7C240400, // 004D CALL R9 2 + 0x540E001F, // 004E LDINT R3 32 + 0x60280010, // 004F GETGBL R10 G16 + 0x8C2C0114, // 0050 GETMET R11 R0 K20 + 0x5C341200, // 0051 MOVE R13 R9 + 0x7C2C0400, // 0052 CALL R11 2 + 0x7C280200, // 0053 CALL R10 1 + 0xA802001C, // 0054 EXBLK 0 #0072 + 0x5C2C1400, // 0055 MOVE R11 R10 + 0x7C2C0000, // 0056 CALL R11 0 + 0x9430120B, // 0057 GETIDX R12 R9 R11 + 0x6034000F, // 0058 GETGBL R13 G15 + 0x5C381800, // 0059 MOVE R14 R12 + 0x603C0013, // 005A GETGBL R15 G19 + 0x7C340400, // 005B CALL R13 2 + 0x7836000D, // 005C JMPF R13 #006B + 0x8C341915, // 005D GETMET R13 R12 K21 + 0x583C0016, // 005E LDCONST R15 K22 + 0x7C340400, // 005F CALL R13 2 + 0x78360009, // 0060 JMPF R13 #006B + 0x00341717, // 0061 ADD R13 R11 K23 + 0x60380008, // 0062 GETGBL R14 G8 + 0x5C3C0600, // 0063 MOVE R15 R3 + 0x7C380200, // 0064 CALL R14 1 + 0x603C0013, // 0065 GETGBL R15 G19 + 0x7C3C0000, // 0066 CALL R15 0 + 0x983E0518, // 0067 SETIDX R15 K2 K24 + 0x983E320D, // 0068 SETIDX R15 K25 R13 + 0x98081C0F, // 0069 SETIDX R2 R14 R15 + 0x000C0704, // 006A ADD R3 R3 K4 + 0x54360027, // 006B LDINT R13 40 + 0x2434060D, // 006C GT R13 R3 R13 + 0x78360000, // 006D JMPF R13 #006F + 0x70020000, // 006E JMP #0070 + 0x7001FFE4, // 006F JMP #0055 + 0xA8040001, // 0070 EXBLK 1 1 + 0x70020002, // 0071 JMP #0075 + 0x5828001A, // 0072 LDCONST R10 K26 + 0xAC280200, // 0073 CATCH R10 1 0 + 0xB0080000, // 0074 RAISE 2 R0 R0 + 0x540E0027, // 0075 LDINT R3 40 + 0x60280010, // 0076 GETGBL R10 G16 + 0x8C2C0114, // 0077 GETMET R11 R0 K20 + 0x5C341200, // 0078 MOVE R13 R9 + 0x7C2C0400, // 0079 CALL R11 2 + 0x7C280200, // 007A CALL R10 1 + 0xA802001C, // 007B EXBLK 0 #0099 + 0x5C2C1400, // 007C MOVE R11 R10 + 0x7C2C0000, // 007D CALL R11 0 + 0x9430120B, // 007E GETIDX R12 R9 R11 + 0x6034000F, // 007F GETGBL R13 G15 + 0x5C381800, // 0080 MOVE R14 R12 + 0x603C0013, // 0081 GETGBL R15 G19 + 0x7C340400, // 0082 CALL R13 2 + 0x7836000D, // 0083 JMPF R13 #0092 + 0x8C341915, // 0084 GETMET R13 R12 K21 + 0x583C001B, // 0085 LDCONST R15 K27 + 0x7C340400, // 0086 CALL R13 2 + 0x78360009, // 0087 JMPF R13 #0092 + 0x0034171C, // 0088 ADD R13 R11 K28 + 0x60380008, // 0089 GETGBL R14 G8 + 0x5C3C0600, // 008A MOVE R15 R3 + 0x7C380200, // 008B CALL R14 1 + 0x603C0013, // 008C GETGBL R15 G19 + 0x7C3C0000, // 008D CALL R15 0 + 0x983E051D, // 008E SETIDX R15 K2 K29 + 0x983E320D, // 008F SETIDX R15 K25 R13 + 0x98081C0F, // 0090 SETIDX R2 R14 R15 + 0x000C0704, // 0091 ADD R3 R3 K4 + 0x5436002E, // 0092 LDINT R13 47 + 0x2434060D, // 0093 GT R13 R3 R13 + 0x78360000, // 0094 JMPF R13 #0096 + 0x70020000, // 0095 JMP #0097 + 0x7001FFE4, // 0096 JMP #007C + 0xA8040001, // 0097 EXBLK 1 1 + 0x70020002, // 0098 JMP #009C + 0x5828001A, // 0099 LDCONST R10 K26 + 0xAC280200, // 009A CATCH R10 1 0 + 0xB0080000, // 009B RAISE 2 R0 R0 + 0x540E002F, // 009C LDINT R3 48 + 0x60280010, // 009D GETGBL R10 G16 + 0x8C2C0114, // 009E GETMET R11 R0 K20 + 0x5C341200, // 009F MOVE R13 R9 + 0x7C2C0400, // 00A0 CALL R11 2 + 0x7C280200, // 00A1 CALL R10 1 + 0xA802001C, // 00A2 EXBLK 0 #00C0 + 0x5C2C1400, // 00A3 MOVE R11 R10 + 0x7C2C0000, // 00A4 CALL R11 0 + 0x9430120B, // 00A5 GETIDX R12 R9 R11 + 0x6034000F, // 00A6 GETGBL R13 G15 + 0x5C381800, // 00A7 MOVE R14 R12 + 0x603C0013, // 00A8 GETGBL R15 G19 + 0x7C340400, // 00A9 CALL R13 2 + 0x7836000D, // 00AA JMPF R13 #00B9 + 0x8C341915, // 00AB GETMET R13 R12 K21 + 0x583C001E, // 00AC LDCONST R15 K30 + 0x7C340400, // 00AD CALL R13 2 + 0x78360009, // 00AE JMPF R13 #00B9 + 0x0034171F, // 00AF ADD R13 R11 K31 + 0x60380008, // 00B0 GETGBL R14 G8 + 0x5C3C0600, // 00B1 MOVE R15 R3 + 0x7C380200, // 00B2 CALL R14 1 + 0x603C0013, // 00B3 GETGBL R15 G19 + 0x7C3C0000, // 00B4 CALL R15 0 + 0x983E0520, // 00B5 SETIDX R15 K2 K32 + 0x983E320D, // 00B6 SETIDX R15 K25 R13 + 0x98081C0F, // 00B7 SETIDX R2 R14 R15 + 0x000C0704, // 00B8 ADD R3 R3 K4 + 0x54360037, // 00B9 LDINT R13 56 + 0x2434060D, // 00BA GT R13 R3 R13 + 0x78360000, // 00BB JMPF R13 #00BD + 0x70020000, // 00BC JMP #00BE + 0x7001FFE4, // 00BD JMP #00A3 + 0xA8040001, // 00BE EXBLK 1 1 + 0x70020002, // 00BF JMP #00C3 + 0x5828001A, // 00C0 LDCONST R10 K26 + 0xAC280200, // 00C1 CATCH R10 1 0 + 0xB0080000, // 00C2 RAISE 2 R0 R0 + 0x540E0037, // 00C3 LDINT R3 56 + 0x60280010, // 00C4 GETGBL R10 G16 + 0x8C2C0114, // 00C5 GETMET R11 R0 K20 + 0x5C341200, // 00C6 MOVE R13 R9 + 0x7C2C0400, // 00C7 CALL R11 2 + 0x7C280200, // 00C8 CALL R10 1 + 0xA802001C, // 00C9 EXBLK 0 #00E7 + 0x5C2C1400, // 00CA MOVE R11 R10 + 0x7C2C0000, // 00CB CALL R11 0 + 0x9430120B, // 00CC GETIDX R12 R9 R11 + 0x6034000F, // 00CD GETGBL R13 G15 + 0x5C381800, // 00CE MOVE R14 R12 + 0x603C0013, // 00CF GETGBL R15 G19 + 0x7C340400, // 00D0 CALL R13 2 + 0x7836000D, // 00D1 JMPF R13 #00E0 + 0x8C341915, // 00D2 GETMET R13 R12 K21 + 0x583C0021, // 00D3 LDCONST R15 K33 + 0x7C340400, // 00D4 CALL R13 2 + 0x78360009, // 00D5 JMPF R13 #00E0 + 0x00341722, // 00D6 ADD R13 R11 K34 + 0x60380008, // 00D7 GETGBL R14 G8 + 0x5C3C0600, // 00D8 MOVE R15 R3 + 0x7C380200, // 00D9 CALL R14 1 + 0x603C0013, // 00DA GETGBL R15 G19 + 0x7C3C0000, // 00DB CALL R15 0 + 0x983E0523, // 00DC SETIDX R15 K2 K35 + 0x983E320D, // 00DD SETIDX R15 K25 R13 + 0x98081C0F, // 00DE SETIDX R2 R14 R15 + 0x000C0704, // 00DF ADD R3 R3 K4 + 0x5436003F, // 00E0 LDINT R13 64 + 0x2434060D, // 00E1 GT R13 R3 R13 + 0x78360000, // 00E2 JMPF R13 #00E4 + 0x70020000, // 00E3 JMP #00E5 + 0x7001FFE4, // 00E4 JMP #00CA + 0xA8040001, // 00E5 EXBLK 1 1 + 0x70020002, // 00E6 JMP #00EA + 0x5828001A, // 00E7 LDCONST R10 K26 + 0xAC280200, // 00E8 CATCH R10 1 0 + 0xB0080000, // 00E9 RAISE 2 R0 R0 + 0x80040400, // 00EA RET 1 R2 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: remove_fabric +********************************************************************/ +be_local_closure(Matter_Device_remove_fabric, /* name */ + be_nested_proto( + 9, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[12]) { /* constants */ + /* K0 */ be_nested_str_weak(sessions), + /* K1 */ be_nested_str_weak(find_children_fabrics), + /* K2 */ be_nested_str_weak(get_fabric_index), + /* K3 */ be_nested_str_weak(find_fabric_by_index), + /* K4 */ be_nested_str_weak(message_handler), + /* K5 */ be_nested_str_weak(im), + /* K6 */ be_nested_str_weak(subs_shop), + /* K7 */ be_nested_str_weak(remove_by_fabric), + /* K8 */ be_nested_str_weak(mdns_remove_op_discovery), + /* K9 */ be_nested_str_weak(remove_fabric), + /* K10 */ be_nested_str_weak(stop_iteration), + /* K11 */ be_nested_str_weak(save_fabrics), + }), + be_str_weak(remove_fabric), + &be_const_str_solidified, + ( &(const binstruction[43]) { /* code */ + 0x88080100, // 0000 GETMBR R2 R0 K0 + 0x8C080501, // 0001 GETMET R2 R2 K1 + 0x8C100302, // 0002 GETMET R4 R1 K2 + 0x7C100200, // 0003 CALL R4 1 + 0x7C080400, // 0004 CALL R2 2 + 0x4C0C0000, // 0005 LDNIL R3 + 0x1C0C0403, // 0006 EQ R3 R2 R3 + 0x780E0000, // 0007 JMPF R3 #0009 + 0x80000600, // 0008 RET 0 + 0x600C0010, // 0009 GETGBL R3 G16 + 0x5C100400, // 000A MOVE R4 R2 + 0x7C0C0200, // 000B CALL R3 1 + 0xA8020016, // 000C EXBLK 0 #0024 + 0x5C100600, // 000D MOVE R4 R3 + 0x7C100000, // 000E CALL R4 0 + 0x88140100, // 000F GETMBR R5 R0 K0 + 0x8C140B03, // 0010 GETMET R5 R5 K3 + 0x5C1C0800, // 0011 MOVE R7 R4 + 0x7C140400, // 0012 CALL R5 2 + 0x4C180000, // 0013 LDNIL R6 + 0x20180A06, // 0014 NE R6 R5 R6 + 0x781A000C, // 0015 JMPF R6 #0023 + 0x88180104, // 0016 GETMBR R6 R0 K4 + 0x88180D05, // 0017 GETMBR R6 R6 K5 + 0x88180D06, // 0018 GETMBR R6 R6 K6 + 0x8C180D07, // 0019 GETMET R6 R6 K7 + 0x5C200A00, // 001A MOVE R8 R5 + 0x7C180400, // 001B CALL R6 2 + 0x8C180108, // 001C GETMET R6 R0 K8 + 0x5C200A00, // 001D MOVE R8 R5 + 0x7C180400, // 001E CALL R6 2 + 0x88180100, // 001F GETMBR R6 R0 K0 + 0x8C180D09, // 0020 GETMET R6 R6 K9 + 0x5C200A00, // 0021 MOVE R8 R5 + 0x7C180400, // 0022 CALL R6 2 + 0x7001FFE8, // 0023 JMP #000D + 0x580C000A, // 0024 LDCONST R3 K10 + 0xAC0C0200, // 0025 CATCH R3 1 0 + 0xB0080000, // 0026 RAISE 2 R0 R0 + 0x880C0100, // 0027 GETMBR R3 R0 K0 + 0x8C0C070B, // 0028 GETMET R3 R3 K11 + 0x7C0C0200, // 0029 CALL R3 1 + 0x80000000, // 002A RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: every_second +********************************************************************/ +be_local_closure(Matter_Device_every_second, /* name */ + be_nested_proto( + 4, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 9]) { /* constants */ + /* K0 */ be_nested_str_weak(sessions), + /* K1 */ be_nested_str_weak(every_second), + /* K2 */ be_nested_str_weak(message_handler), + /* K3 */ be_nested_str_weak(commissioning_open), + /* K4 */ be_nested_str_weak(tasmota), + /* K5 */ be_nested_str_weak(time_reached), + /* K6 */ be_const_int(0), + /* K7 */ be_nested_str_weak(plugins), + /* K8 */ be_const_int(1), + }), + be_str_weak(every_second), + &be_const_str_solidified, + ( &(const binstruction[30]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x8C040301, // 0001 GETMET R1 R1 K1 + 0x7C040200, // 0002 CALL R1 1 + 0x88040102, // 0003 GETMBR R1 R0 K2 + 0x8C040301, // 0004 GETMET R1 R1 K1 + 0x7C040200, // 0005 CALL R1 1 + 0x88040103, // 0006 GETMBR R1 R0 K3 + 0x4C080000, // 0007 LDNIL R2 + 0x20040202, // 0008 NE R1 R1 R2 + 0x78060006, // 0009 JMPF R1 #0011 + 0xB8060800, // 000A GETNGBL R1 K4 + 0x8C040305, // 000B GETMET R1 R1 K5 + 0x880C0103, // 000C GETMBR R3 R0 K3 + 0x7C040400, // 000D CALL R1 2 + 0x78060001, // 000E JMPF R1 #0011 + 0x4C040000, // 000F LDNIL R1 + 0x90020601, // 0010 SETMBR R0 K3 R1 + 0x58040006, // 0011 LDCONST R1 K6 + 0x6008000C, // 0012 GETGBL R2 G12 + 0x880C0107, // 0013 GETMBR R3 R0 K7 + 0x7C080200, // 0014 CALL R2 1 + 0x14080202, // 0015 LT R2 R1 R2 + 0x780A0005, // 0016 JMPF R2 #001D + 0x88080107, // 0017 GETMBR R2 R0 K7 + 0x94080401, // 0018 GETIDX R2 R2 R1 + 0x8C080501, // 0019 GETMET R2 R2 K1 + 0x7C080200, // 001A CALL R2 1 + 0x00040308, // 001B ADD R1 R1 K8 + 0x7001FFF4, // 001C JMP #0012 + 0x80000000, // 001D RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: get_active_endpoints +********************************************************************/ +be_local_closure(Matter_Device_get_active_endpoints, /* name */ + be_nested_proto( + 9, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 6]) { /* constants */ + /* K0 */ be_nested_str_weak(plugins), + /* K1 */ be_nested_str_weak(get_endpoint), + /* K2 */ be_const_int(0), + /* K3 */ be_nested_str_weak(find), + /* K4 */ be_nested_str_weak(push), + /* K5 */ be_nested_str_weak(stop_iteration), + }), + be_str_weak(get_active_endpoints), + &be_const_str_solidified, + ( &(const binstruction[28]) { /* code */ + 0x60080012, // 0000 GETGBL R2 G18 + 0x7C080000, // 0001 CALL R2 0 + 0x600C0010, // 0002 GETGBL R3 G16 + 0x88100100, // 0003 GETMBR R4 R0 K0 + 0x7C0C0200, // 0004 CALL R3 1 + 0xA8020011, // 0005 EXBLK 0 #0018 + 0x5C100600, // 0006 MOVE R4 R3 + 0x7C100000, // 0007 CALL R4 0 + 0x8C140901, // 0008 GETMET R5 R4 K1 + 0x7C140200, // 0009 CALL R5 1 + 0x78060002, // 000A JMPF R1 #000E + 0x1C180B02, // 000B EQ R6 R5 K2 + 0x781A0000, // 000C JMPF R6 #000E + 0x7001FFF7, // 000D JMP #0006 + 0x8C180503, // 000E GETMET R6 R2 K3 + 0x5C200A00, // 000F MOVE R8 R5 + 0x7C180400, // 0010 CALL R6 2 + 0x4C1C0000, // 0011 LDNIL R7 + 0x1C180C07, // 0012 EQ R6 R6 R7 + 0x781A0002, // 0013 JMPF R6 #0017 + 0x8C180504, // 0014 GETMET R6 R2 K4 + 0x5C200A00, // 0015 MOVE R8 R5 + 0x7C180400, // 0016 CALL R6 2 + 0x7001FFED, // 0017 JMP #0006 + 0x580C0005, // 0018 LDCONST R3 K5 + 0xAC0C0200, // 0019 CATCH R3 1 0 + 0xB0080000, // 001A RAISE 2 R0 R0 + 0x80040400, // 001B RET 1 R2 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: invoke_request +********************************************************************/ +be_local_closure(Matter_Device_invoke_request, /* name */ + be_nested_proto( + 12, /* nstack */ + 4, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 8]) { /* constants */ + /* K0 */ be_const_int(0), + /* K1 */ be_nested_str_weak(endpoint), + /* K2 */ be_nested_str_weak(plugins), + /* K3 */ be_nested_str_weak(invoke_request), + /* K4 */ be_const_int(1), + /* K5 */ be_nested_str_weak(status), + /* K6 */ be_nested_str_weak(matter), + /* K7 */ be_nested_str_weak(UNSUPPORTED_ENDPOINT), + }), + be_str_weak(invoke_request), + &be_const_str_solidified, + ( &(const binstruction[24]) { /* code */ + 0x58100000, // 0000 LDCONST R4 K0 + 0x88140701, // 0001 GETMBR R5 R3 K1 + 0x6018000C, // 0002 GETGBL R6 G12 + 0x881C0102, // 0003 GETMBR R7 R0 K2 + 0x7C180200, // 0004 CALL R6 1 + 0x14180806, // 0005 LT R6 R4 R6 + 0x781A000C, // 0006 JMPF R6 #0014 + 0x88180102, // 0007 GETMBR R6 R0 K2 + 0x94180C04, // 0008 GETIDX R6 R6 R4 + 0x881C0D01, // 0009 GETMBR R7 R6 K1 + 0x1C1C0E05, // 000A EQ R7 R7 R5 + 0x781E0005, // 000B JMPF R7 #0012 + 0x8C1C0D03, // 000C GETMET R7 R6 K3 + 0x5C240200, // 000D MOVE R9 R1 + 0x5C280400, // 000E MOVE R10 R2 + 0x5C2C0600, // 000F MOVE R11 R3 + 0x7C1C0800, // 0010 CALL R7 4 + 0x80040E00, // 0011 RET 1 R7 + 0x00100904, // 0012 ADD R4 R4 K4 + 0x7001FFED, // 0013 JMP #0002 + 0xB81A0C00, // 0014 GETNGBL R6 K6 + 0x88180D07, // 0015 GETMBR R6 R6 K7 + 0x900E0A06, // 0016 SETMBR R3 K5 R6 + 0x80000000, // 0017 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: start +********************************************************************/ +be_local_closure(Matter_Device_start, /* name */ + be_nested_proto( + 6, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 1, /* has sup protos */ + ( &(const struct bproto*[ 1]) { + be_nested_proto( + 2, /* nstack */ + 0, /* argc */ + 0, /* varg */ + 1, /* has upvals */ + ( &(const bupvaldesc[ 1]) { /* upvals */ + be_local_const_upval(1, 0), + }), + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 1]) { /* constants */ + /* K0 */ be_nested_str_weak(_trigger_read_sensors), + }), + be_str_weak(_anonymous_), + &be_const_str_solidified, + ( &(const binstruction[ 4]) { /* code */ + 0x68000000, // 0000 GETUPV R0 U0 + 0x8C000100, // 0001 GETMET R0 R0 K0 + 0x7C000200, // 0002 CALL R0 1 + 0x80000000, // 0003 RET 0 + }) + ), + }), + 1, /* has constants */ + ( &(const bvalue[ 9]) { /* constants */ + /* K0 */ be_nested_str_weak(started), + /* K1 */ be_nested_str_weak(autoconf_device), + /* K2 */ be_nested_str_weak(tasmota), + /* K3 */ be_nested_str_weak(add_cron), + /* K4 */ be_nested_str_weak(_X2A_X2F30_X20_X2A_X20_X2A_X20_X2A_X20_X2A_X20_X2A), + /* K5 */ be_nested_str_weak(matter_sensors_30s), + /* K6 */ be_nested_str_weak(_start_udp), + /* K7 */ be_nested_str_weak(UDP_PORT), + /* K8 */ be_nested_str_weak(start_mdns_announce_hostnames), + }), + be_str_weak(start), + &be_const_str_solidified, + ( &(const binstruction[20]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x78060000, // 0001 JMPF R1 #0003 + 0x80000200, // 0002 RET 0 + 0x8C040101, // 0003 GETMET R1 R0 K1 + 0x7C040200, // 0004 CALL R1 1 + 0xB8060400, // 0005 GETNGBL R1 K2 + 0x8C040303, // 0006 GETMET R1 R1 K3 + 0x580C0004, // 0007 LDCONST R3 K4 + 0x84100000, // 0008 CLOSURE R4 P0 + 0x58140005, // 0009 LDCONST R5 K5 + 0x7C040800, // 000A CALL R1 4 + 0x8C040106, // 000B GETMET R1 R0 K6 + 0x880C0107, // 000C GETMBR R3 R0 K7 + 0x7C040400, // 000D CALL R1 2 + 0x8C040108, // 000E GETMET R1 R0 K8 + 0x7C040200, // 000F CALL R1 1 + 0x50040200, // 0010 LDBOOL R1 1 0 + 0x90020001, // 0011 SETMBR R0 K0 R1 + 0xA0000000, // 0012 CLOSE R0 + 0x80000000, // 0013 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: plugins_to_json +********************************************************************/ +be_local_closure(Matter_Device_plugins_to_json, /* name */ + be_nested_proto( + 11, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[11]) { /* constants */ + /* K0 */ be_nested_str_weak(string), + /* K1 */ be_nested_str_weak(_X7B), + /* K2 */ be_const_int(0), + /* K3 */ be_nested_str_weak(plugins), + /* K4 */ be_nested_str_weak(_X2C), + /* K5 */ be_nested_str_weak(format), + /* K6 */ be_nested_str_weak(_X22_X25i_X22_X3A_X25s), + /* K7 */ be_nested_str_weak(get_endpoint), + /* K8 */ be_nested_str_weak(to_json), + /* K9 */ be_const_int(1), + /* K10 */ be_nested_str_weak(_X7D), + }), + be_str_weak(plugins_to_json), + &be_const_str_solidified, + ( &(const binstruction[25]) { /* code */ + 0xA4060000, // 0000 IMPORT R1 K0 + 0x58080001, // 0001 LDCONST R2 K1 + 0x580C0002, // 0002 LDCONST R3 K2 + 0x6010000C, // 0003 GETGBL R4 G12 + 0x88140103, // 0004 GETMBR R5 R0 K3 + 0x7C100200, // 0005 CALL R4 1 + 0x14100604, // 0006 LT R4 R3 R4 + 0x7812000E, // 0007 JMPF R4 #0017 + 0x88100103, // 0008 GETMBR R4 R0 K3 + 0x94100803, // 0009 GETIDX R4 R4 R3 + 0x24140702, // 000A GT R5 R3 K2 + 0x78160000, // 000B JMPF R5 #000D + 0x00080504, // 000C ADD R2 R2 K4 + 0x8C140305, // 000D GETMET R5 R1 K5 + 0x581C0006, // 000E LDCONST R7 K6 + 0x8C200907, // 000F GETMET R8 R4 K7 + 0x7C200200, // 0010 CALL R8 1 + 0x8C240908, // 0011 GETMET R9 R4 K8 + 0x7C240200, // 0012 CALL R9 1 + 0x7C140800, // 0013 CALL R5 4 + 0x00080405, // 0014 ADD R2 R2 R5 + 0x000C0709, // 0015 ADD R3 R3 K9 + 0x7001FFEB, // 0016 JMP #0003 + 0x0008050A, // 0017 ADD R2 R2 K10 + 0x80040400, // 0018 RET 1 R2 + }) + ) +); +/*******************************************************************/ + + /******************************************************************** ** Solidified function: mdns_announce_PASE ********************************************************************/ @@ -3163,61 +4291,112 @@ be_local_closure(Matter_Device_mdns_announce_PASE, /* name */ /******************************************************************** -** Solidified function: stop_basic_commissioning +** Solidified function: register_native_classes ********************************************************************/ -be_local_closure(Matter_Device_stop_basic_commissioning, /* name */ +be_local_closure(Matter_Device_register_native_classes, /* name */ be_nested_proto( - 5, /* nstack */ - 1, /* argc */ + 9, /* nstack */ + 3, /* argc */ 2, /* varg */ 0, /* has upvals */ NULL, /* no upvals */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[13]) { /* constants */ - /* K0 */ be_nested_str_weak(is_root_commissioning_open), - /* K1 */ be_nested_str_weak(tasmota), - /* K2 */ be_nested_str_weak(publish_result), - /* K3 */ be_nested_str_weak(_X7B_X22Matter_X22_X3A_X7B_X22Commissioning_X22_X3A0_X7D_X7D), - /* K4 */ be_nested_str_weak(Matter), - /* K5 */ be_nested_str_weak(commissioning_open), - /* K6 */ be_nested_str_weak(mdns_remove_PASE), - /* K7 */ be_nested_str_weak(commissioning_iterations), - /* K8 */ be_nested_str_weak(commissioning_discriminator), - /* K9 */ be_nested_str_weak(commissioning_salt), - /* K10 */ be_nested_str_weak(commissioning_w0), - /* K11 */ be_nested_str_weak(commissioning_L), - /* K12 */ be_nested_str_weak(commissioning_admin_fabric), + ( &(const bvalue[28]) { /* constants */ + /* K0 */ be_nested_str_weak(register_plugin_class), + /* K1 */ be_nested_str_weak(root), + /* K2 */ be_nested_str_weak(matter), + /* K3 */ be_nested_str_weak(Plugin_Root), + /* K4 */ be_nested_str_weak(light0), + /* K5 */ be_nested_str_weak(Plugin_Light0), + /* K6 */ be_nested_str_weak(light1), + /* K7 */ be_nested_str_weak(Plugin_Light1), + /* K8 */ be_nested_str_weak(light2), + /* K9 */ be_nested_str_weak(Plugin_Light2), + /* K10 */ be_nested_str_weak(light3), + /* K11 */ be_nested_str_weak(Plugin_Light3), + /* K12 */ be_nested_str_weak(relay), + /* K13 */ be_nested_str_weak(Plugin_OnOff), + /* K14 */ be_nested_str_weak(temperature), + /* K15 */ be_nested_str_weak(Plugin_Sensor_Temp), + /* K16 */ be_nested_str_weak(humidity), + /* K17 */ be_nested_str_weak(Plugin_Sensor_Humidity), + /* K18 */ be_nested_str_weak(illuminance), + /* K19 */ be_nested_str_weak(Plugin_Sensor_Illuminance), + /* K20 */ be_nested_str_weak(pressure), + /* K21 */ be_nested_str_weak(Plugin_Sensor_Pressure), + /* K22 */ be_nested_str_weak(tasmota), + /* K23 */ be_nested_str_weak(log), + /* K24 */ be_nested_str_weak(MTR_X3A_X20registered_X20classes_X20), + /* K25 */ be_nested_str_weak(k2l), + /* K26 */ be_nested_str_weak(plugins_classes), + /* K27 */ be_const_int(3), }), - be_str_weak(stop_basic_commissioning), + be_str_weak(register_native_classes), &be_const_str_solidified, - ( &(const binstruction[25]) { /* code */ - 0x8C040100, // 0000 GETMET R1 R0 K0 - 0x7C040200, // 0001 CALL R1 1 - 0x78060004, // 0002 JMPF R1 #0008 - 0xB8060200, // 0003 GETNGBL R1 K1 - 0x8C040302, // 0004 GETMET R1 R1 K2 - 0x580C0003, // 0005 LDCONST R3 K3 - 0x58100004, // 0006 LDCONST R4 K4 - 0x7C040600, // 0007 CALL R1 3 - 0x4C040000, // 0008 LDNIL R1 - 0x90020A01, // 0009 SETMBR R0 K5 R1 - 0x8C040106, // 000A GETMET R1 R0 K6 - 0x7C040200, // 000B CALL R1 1 - 0x4C040000, // 000C LDNIL R1 - 0x90020E01, // 000D SETMBR R0 K7 R1 - 0x4C040000, // 000E LDNIL R1 - 0x90021001, // 000F SETMBR R0 K8 R1 - 0x4C040000, // 0010 LDNIL R1 - 0x90021201, // 0011 SETMBR R0 K9 R1 - 0x4C040000, // 0012 LDNIL R1 - 0x90021401, // 0013 SETMBR R0 K10 R1 - 0x4C040000, // 0014 LDNIL R1 - 0x90021601, // 0015 SETMBR R0 K11 R1 - 0x4C040000, // 0016 LDNIL R1 - 0x90021801, // 0017 SETMBR R0 K12 R1 - 0x80000000, // 0018 RET 0 + ( &(const binstruction[61]) { /* code */ + 0x8C0C0100, // 0000 GETMET R3 R0 K0 + 0x58140001, // 0001 LDCONST R5 K1 + 0xB81A0400, // 0002 GETNGBL R6 K2 + 0x88180D03, // 0003 GETMBR R6 R6 K3 + 0x7C0C0600, // 0004 CALL R3 3 + 0x8C0C0100, // 0005 GETMET R3 R0 K0 + 0x58140004, // 0006 LDCONST R5 K4 + 0xB81A0400, // 0007 GETNGBL R6 K2 + 0x88180D05, // 0008 GETMBR R6 R6 K5 + 0x7C0C0600, // 0009 CALL R3 3 + 0x8C0C0100, // 000A GETMET R3 R0 K0 + 0x58140006, // 000B LDCONST R5 K6 + 0xB81A0400, // 000C GETNGBL R6 K2 + 0x88180D07, // 000D GETMBR R6 R6 K7 + 0x7C0C0600, // 000E CALL R3 3 + 0x8C0C0100, // 000F GETMET R3 R0 K0 + 0x58140008, // 0010 LDCONST R5 K8 + 0xB81A0400, // 0011 GETNGBL R6 K2 + 0x88180D09, // 0012 GETMBR R6 R6 K9 + 0x7C0C0600, // 0013 CALL R3 3 + 0x8C0C0100, // 0014 GETMET R3 R0 K0 + 0x5814000A, // 0015 LDCONST R5 K10 + 0xB81A0400, // 0016 GETNGBL R6 K2 + 0x88180D0B, // 0017 GETMBR R6 R6 K11 + 0x7C0C0600, // 0018 CALL R3 3 + 0x8C0C0100, // 0019 GETMET R3 R0 K0 + 0x5814000C, // 001A LDCONST R5 K12 + 0xB81A0400, // 001B GETNGBL R6 K2 + 0x88180D0D, // 001C GETMBR R6 R6 K13 + 0x7C0C0600, // 001D CALL R3 3 + 0x8C0C0100, // 001E GETMET R3 R0 K0 + 0x5814000E, // 001F LDCONST R5 K14 + 0xB81A0400, // 0020 GETNGBL R6 K2 + 0x88180D0F, // 0021 GETMBR R6 R6 K15 + 0x7C0C0600, // 0022 CALL R3 3 + 0x8C0C0100, // 0023 GETMET R3 R0 K0 + 0x58140010, // 0024 LDCONST R5 K16 + 0xB81A0400, // 0025 GETNGBL R6 K2 + 0x88180D11, // 0026 GETMBR R6 R6 K17 + 0x7C0C0600, // 0027 CALL R3 3 + 0x8C0C0100, // 0028 GETMET R3 R0 K0 + 0x58140012, // 0029 LDCONST R5 K18 + 0xB81A0400, // 002A GETNGBL R6 K2 + 0x88180D13, // 002B GETMBR R6 R6 K19 + 0x7C0C0600, // 002C CALL R3 3 + 0x8C0C0100, // 002D GETMET R3 R0 K0 + 0x58140014, // 002E LDCONST R5 K20 + 0xB81A0400, // 002F GETNGBL R6 K2 + 0x88180D15, // 0030 GETMBR R6 R6 K21 + 0x7C0C0600, // 0031 CALL R3 3 + 0xB80E2C00, // 0032 GETNGBL R3 K22 + 0x8C0C0717, // 0033 GETMET R3 R3 K23 + 0x60140008, // 0034 GETGBL R5 G8 + 0x8C180119, // 0035 GETMET R6 R0 K25 + 0x8820011A, // 0036 GETMBR R8 R0 K26 + 0x7C180400, // 0037 CALL R6 2 + 0x7C140200, // 0038 CALL R5 1 + 0x00163005, // 0039 ADD R5 K24 R5 + 0x5818001B, // 003A LDCONST R6 K27 + 0x7C0C0600, // 003B CALL R3 3 + 0x80000000, // 003C RET 0 }) ) ); @@ -3225,434 +4404,9 @@ be_local_closure(Matter_Device_stop_basic_commissioning, /* name */ /******************************************************************** -** Solidified function: received_ack +** Solidified function: event_fabrics_saved ********************************************************************/ -be_local_closure(Matter_Device_received_ack, /* name */ - be_nested_proto( - 5, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 2]) { /* constants */ - /* K0 */ be_nested_str_weak(udp_server), - /* K1 */ be_nested_str_weak(received_ack), - }), - be_str_weak(received_ack), - &be_const_str_solidified, - ( &(const binstruction[ 5]) { /* code */ - 0x88080100, // 0000 GETMBR R2 R0 K0 - 0x8C080501, // 0001 GETMET R2 R2 K1 - 0x5C100200, // 0002 MOVE R4 R1 - 0x7C080400, // 0003 CALL R2 2 - 0x80040400, // 0004 RET 1 R2 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: load_param -********************************************************************/ -be_local_closure(Matter_Device_load_param, /* name */ - be_nested_proto( - 12, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[24]) { /* constants */ - /* K0 */ be_nested_str_weak(string), - /* K1 */ be_nested_str_weak(crypto), - /* K2 */ be_nested_str_weak(FILENAME), - /* K3 */ be_nested_str_weak(read), - /* K4 */ be_nested_str_weak(close), - /* K5 */ be_nested_str_weak(json), - /* K6 */ be_nested_str_weak(load), - /* K7 */ be_nested_str_weak(root_discriminator), - /* K8 */ be_nested_str_weak(find), - /* K9 */ be_nested_str_weak(distinguish), - /* K10 */ be_nested_str_weak(root_passcode), - /* K11 */ be_nested_str_weak(passcode), - /* K12 */ be_nested_str_weak(ipv4only), - /* K13 */ be_nested_str_weak(io_error), - /* K14 */ be_nested_str_weak(tasmota), - /* K15 */ be_nested_str_weak(log), - /* K16 */ be_nested_str_weak(MTR_X3A_X20Session_Store_X3A_X3Aload_X20Exception_X3A), - /* K17 */ be_nested_str_weak(_X7C), - /* K18 */ be_const_int(2), - /* K19 */ be_nested_str_weak(random), - /* K20 */ be_nested_str_weak(get), - /* K21 */ be_const_int(0), - /* K22 */ be_nested_str_weak(PASSCODE_DEFAULT), - /* K23 */ be_nested_str_weak(save_param), - }), - be_str_weak(load_param), - &be_const_str_solidified, - ( &(const binstruction[79]) { /* code */ - 0xA4060000, // 0000 IMPORT R1 K0 - 0xA40A0200, // 0001 IMPORT R2 K1 - 0xA802001D, // 0002 EXBLK 0 #0021 - 0x600C0011, // 0003 GETGBL R3 G17 - 0x88100102, // 0004 GETMBR R4 R0 K2 - 0x7C0C0200, // 0005 CALL R3 1 - 0x8C100703, // 0006 GETMET R4 R3 K3 - 0x7C100200, // 0007 CALL R4 1 - 0x8C140704, // 0008 GETMET R5 R3 K4 - 0x7C140200, // 0009 CALL R5 1 - 0xA4160A00, // 000A IMPORT R5 K5 - 0x8C180B06, // 000B GETMET R6 R5 K6 - 0x5C200800, // 000C MOVE R8 R4 - 0x7C180400, // 000D CALL R6 2 - 0x8C1C0D08, // 000E GETMET R7 R6 K8 - 0x58240009, // 000F LDCONST R9 K9 - 0x88280107, // 0010 GETMBR R10 R0 K7 - 0x7C1C0600, // 0011 CALL R7 3 - 0x90020E07, // 0012 SETMBR R0 K7 R7 - 0x8C1C0D08, // 0013 GETMET R7 R6 K8 - 0x5824000B, // 0014 LDCONST R9 K11 - 0x8828010A, // 0015 GETMBR R10 R0 K10 - 0x7C1C0600, // 0016 CALL R7 3 - 0x90021407, // 0017 SETMBR R0 K10 R7 - 0x601C0017, // 0018 GETGBL R7 G23 - 0x8C200D08, // 0019 GETMET R8 R6 K8 - 0x5828000C, // 001A LDCONST R10 K12 - 0x502C0000, // 001B LDBOOL R11 0 0 - 0x7C200600, // 001C CALL R8 3 - 0x7C1C0200, // 001D CALL R7 1 - 0x90021807, // 001E SETMBR R0 K12 R7 - 0xA8040001, // 001F EXBLK 1 1 - 0x70020012, // 0020 JMP #0034 - 0xAC0C0002, // 0021 CATCH R3 0 2 - 0x7002000F, // 0022 JMP #0033 - 0x2014070D, // 0023 NE R5 R3 K13 - 0x7816000C, // 0024 JMPF R5 #0032 - 0xB8161C00, // 0025 GETNGBL R5 K14 - 0x8C140B0F, // 0026 GETMET R5 R5 K15 - 0x601C0008, // 0027 GETGBL R7 G8 - 0x5C200600, // 0028 MOVE R8 R3 - 0x7C1C0200, // 0029 CALL R7 1 - 0x001E2007, // 002A ADD R7 K16 R7 - 0x001C0F11, // 002B ADD R7 R7 K17 - 0x60200008, // 002C GETGBL R8 G8 - 0x5C240800, // 002D MOVE R9 R4 - 0x7C200200, // 002E CALL R8 1 - 0x001C0E08, // 002F ADD R7 R7 R8 - 0x58200012, // 0030 LDCONST R8 K18 - 0x7C140600, // 0031 CALL R5 3 - 0x70020000, // 0032 JMP #0034 - 0xB0080000, // 0033 RAISE 2 R0 R0 - 0x500C0000, // 0034 LDBOOL R3 0 0 - 0x88100107, // 0035 GETMBR R4 R0 K7 - 0x4C140000, // 0036 LDNIL R5 - 0x1C100805, // 0037 EQ R4 R4 R5 - 0x7812000A, // 0038 JMPF R4 #0044 - 0x8C100513, // 0039 GETMET R4 R2 K19 - 0x58180012, // 003A LDCONST R6 K18 - 0x7C100400, // 003B CALL R4 2 - 0x8C100914, // 003C GETMET R4 R4 K20 - 0x58180015, // 003D LDCONST R6 K21 - 0x581C0012, // 003E LDCONST R7 K18 - 0x7C100600, // 003F CALL R4 3 - 0x54160FFE, // 0040 LDINT R5 4095 - 0x2C100805, // 0041 AND R4 R4 R5 - 0x90020E04, // 0042 SETMBR R0 K7 R4 - 0x500C0200, // 0043 LDBOOL R3 1 0 - 0x8810010A, // 0044 GETMBR R4 R0 K10 - 0x4C140000, // 0045 LDNIL R5 - 0x1C100805, // 0046 EQ R4 R4 R5 - 0x78120002, // 0047 JMPF R4 #004B - 0x88100116, // 0048 GETMBR R4 R0 K22 - 0x90021404, // 0049 SETMBR R0 K10 R4 - 0x500C0200, // 004A LDBOOL R3 1 0 - 0x780E0001, // 004B JMPF R3 #004E - 0x8C100117, // 004C GETMET R4 R0 K23 - 0x7C100200, // 004D CALL R4 1 - 0x80000000, // 004E RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: mdns_remove_op_discovery_all_fabrics -********************************************************************/ -be_local_closure(Matter_Device_mdns_remove_op_discovery_all_fabrics, /* name */ - be_nested_proto( - 6, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 6]) { /* constants */ - /* K0 */ be_nested_str_weak(sessions), - /* K1 */ be_nested_str_weak(active_fabrics), - /* K2 */ be_nested_str_weak(get_device_id), - /* K3 */ be_nested_str_weak(get_fabric_id), - /* K4 */ be_nested_str_weak(mdns_remove_op_discovery), - /* K5 */ be_nested_str_weak(stop_iteration), - }), - be_str_weak(mdns_remove_op_discovery_all_fabrics), - &be_const_str_solidified, - ( &(const binstruction[22]) { /* code */ - 0x60040010, // 0000 GETGBL R1 G16 - 0x88080100, // 0001 GETMBR R2 R0 K0 - 0x8C080501, // 0002 GETMET R2 R2 K1 - 0x7C080200, // 0003 CALL R2 1 - 0x7C040200, // 0004 CALL R1 1 - 0xA802000B, // 0005 EXBLK 0 #0012 - 0x5C080200, // 0006 MOVE R2 R1 - 0x7C080000, // 0007 CALL R2 0 - 0x8C0C0502, // 0008 GETMET R3 R2 K2 - 0x7C0C0200, // 0009 CALL R3 1 - 0x780E0005, // 000A JMPF R3 #0011 - 0x8C0C0503, // 000B GETMET R3 R2 K3 - 0x7C0C0200, // 000C CALL R3 1 - 0x780E0002, // 000D JMPF R3 #0011 - 0x8C0C0104, // 000E GETMET R3 R0 K4 - 0x5C140400, // 000F MOVE R5 R2 - 0x7C0C0400, // 0010 CALL R3 2 - 0x7001FFF3, // 0011 JMP #0006 - 0x58040005, // 0012 LDCONST R1 K5 - 0xAC040200, // 0013 CATCH R1 1 0 - 0xB0080000, // 0014 RAISE 2 R0 R0 - 0x80000000, // 0015 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: save_param -********************************************************************/ -be_local_closure(Matter_Device_save_param, /* name */ - be_nested_proto( - 10, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[17]) { /* constants */ - /* K0 */ be_nested_str_weak(json), - /* K1 */ be_nested_str_weak(dump), - /* K2 */ be_nested_str_weak(distinguish), - /* K3 */ be_nested_str_weak(root_discriminator), - /* K4 */ be_nested_str_weak(passcode), - /* K5 */ be_nested_str_weak(root_passcode), - /* K6 */ be_nested_str_weak(ipv4only), - /* K7 */ be_nested_str_weak(string), - /* K8 */ be_nested_str_weak(FILENAME), - /* K9 */ be_nested_str_weak(w), - /* K10 */ be_nested_str_weak(write), - /* K11 */ be_nested_str_weak(close), - /* K12 */ be_nested_str_weak(tasmota), - /* K13 */ be_nested_str_weak(log), - /* K14 */ be_nested_str_weak(MTR_X3A_X20Session_Store_X3A_X3Asave_X20Exception_X3A), - /* K15 */ be_nested_str_weak(_X7C), - /* K16 */ be_const_int(2), - }), - be_str_weak(save_param), - &be_const_str_solidified, - ( &(const binstruction[45]) { /* code */ - 0xA4060000, // 0000 IMPORT R1 K0 - 0x8C080301, // 0001 GETMET R2 R1 K1 - 0x60100013, // 0002 GETGBL R4 G19 - 0x7C100000, // 0003 CALL R4 0 - 0x88140103, // 0004 GETMBR R5 R0 K3 - 0x98120405, // 0005 SETIDX R4 K2 R5 - 0x88140105, // 0006 GETMBR R5 R0 K5 - 0x98120805, // 0007 SETIDX R4 K4 R5 - 0x88140106, // 0008 GETMBR R5 R0 K6 - 0x98120C05, // 0009 SETIDX R4 K6 R5 - 0x7C080400, // 000A CALL R2 2 - 0xA802000D, // 000B EXBLK 0 #001A - 0xA40E0E00, // 000C IMPORT R3 K7 - 0x60100011, // 000D GETGBL R4 G17 - 0x88140108, // 000E GETMBR R5 R0 K8 - 0x58180009, // 000F LDCONST R6 K9 - 0x7C100400, // 0010 CALL R4 2 - 0x8C14090A, // 0011 GETMET R5 R4 K10 - 0x5C1C0400, // 0012 MOVE R7 R2 - 0x7C140400, // 0013 CALL R5 2 - 0x8C14090B, // 0014 GETMET R5 R4 K11 - 0x7C140200, // 0015 CALL R5 1 - 0xA8040001, // 0016 EXBLK 1 1 - 0x80040400, // 0017 RET 1 R2 - 0xA8040001, // 0018 EXBLK 1 1 - 0x70020011, // 0019 JMP #002C - 0xAC0C0002, // 001A CATCH R3 0 2 - 0x7002000E, // 001B JMP #002B - 0xB8161800, // 001C GETNGBL R5 K12 - 0x8C140B0D, // 001D GETMET R5 R5 K13 - 0x601C0008, // 001E GETGBL R7 G8 - 0x5C200600, // 001F MOVE R8 R3 - 0x7C1C0200, // 0020 CALL R7 1 - 0x001E1C07, // 0021 ADD R7 K14 R7 - 0x001C0F0F, // 0022 ADD R7 R7 K15 - 0x60200008, // 0023 GETGBL R8 G8 - 0x5C240800, // 0024 MOVE R9 R4 - 0x7C200200, // 0025 CALL R8 1 - 0x001C0E08, // 0026 ADD R7 R7 R8 - 0x58200010, // 0027 LDCONST R8 K16 - 0x7C140600, // 0028 CALL R5 3 - 0x80040400, // 0029 RET 1 R2 - 0x70020000, // 002A JMP #002C - 0xB0080000, // 002B RAISE 2 R0 R0 - 0x80000000, // 002C RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: mdns_remove_op_discovery -********************************************************************/ -be_local_closure(Matter_Device_mdns_remove_op_discovery, /* name */ - be_nested_proto( - 14, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[24]) { /* constants */ - /* K0 */ be_nested_str_weak(mdns), - /* K1 */ be_nested_str_weak(string), - /* K2 */ be_nested_str_weak(get_device_id), - /* K3 */ be_nested_str_weak(copy), - /* K4 */ be_nested_str_weak(reverse), - /* K5 */ be_nested_str_weak(get_fabric_compressed), - /* K6 */ be_nested_str_weak(tohex), - /* K7 */ be_nested_str_weak(_X2D), - /* K8 */ be_nested_str_weak(tasmota), - /* K9 */ be_nested_str_weak(eth), - /* K10 */ be_nested_str_weak(find), - /* K11 */ be_nested_str_weak(up), - /* K12 */ be_nested_str_weak(log), - /* K13 */ be_nested_str_weak(format), - /* K14 */ be_nested_str_weak(MTR_X3A_X20remove_X20mDNS_X20on_X20_X25s_X20_X27_X25s_X27), - /* K15 */ be_const_int(2), - /* K16 */ be_nested_str_weak(remove_service), - /* K17 */ be_nested_str_weak(_matter), - /* K18 */ be_nested_str_weak(_tcp), - /* K19 */ be_nested_str_weak(hostname_eth), - /* K20 */ be_nested_str_weak(wifi), - /* K21 */ be_nested_str_weak(hostname_wifi), - /* K22 */ be_nested_str_weak(MTR_X3A_X20Exception), - /* K23 */ be_nested_str_weak(_X7C), - }), - be_str_weak(mdns_remove_op_discovery), - &be_const_str_solidified, - ( &(const binstruction[81]) { /* code */ - 0xA40A0000, // 0000 IMPORT R2 K0 - 0xA40E0200, // 0001 IMPORT R3 K1 - 0xA802003B, // 0002 EXBLK 0 #003F - 0x8C100302, // 0003 GETMET R4 R1 K2 - 0x7C100200, // 0004 CALL R4 1 - 0x8C100903, // 0005 GETMET R4 R4 K3 - 0x7C100200, // 0006 CALL R4 1 - 0x8C100904, // 0007 GETMET R4 R4 K4 - 0x7C100200, // 0008 CALL R4 1 - 0x8C140305, // 0009 GETMET R5 R1 K5 - 0x7C140200, // 000A CALL R5 1 - 0x8C180B06, // 000B GETMET R6 R5 K6 - 0x7C180200, // 000C CALL R6 1 - 0x00180D07, // 000D ADD R6 R6 K7 - 0x8C1C0906, // 000E GETMET R7 R4 K6 - 0x7C1C0200, // 000F CALL R7 1 - 0x00180C07, // 0010 ADD R6 R6 R7 - 0xB81E1000, // 0011 GETNGBL R7 K8 - 0x8C1C0F09, // 0012 GETMET R7 R7 K9 - 0x7C1C0200, // 0013 CALL R7 1 - 0x8C1C0F0A, // 0014 GETMET R7 R7 K10 - 0x5824000B, // 0015 LDCONST R9 K11 - 0x7C1C0400, // 0016 CALL R7 2 - 0x781E000E, // 0017 JMPF R7 #0027 - 0xB81E1000, // 0018 GETNGBL R7 K8 - 0x8C1C0F0C, // 0019 GETMET R7 R7 K12 - 0x8C24070D, // 001A GETMET R9 R3 K13 - 0x582C000E, // 001B LDCONST R11 K14 - 0x58300009, // 001C LDCONST R12 K9 - 0x5C340C00, // 001D MOVE R13 R6 - 0x7C240800, // 001E CALL R9 4 - 0x5828000F, // 001F LDCONST R10 K15 - 0x7C1C0600, // 0020 CALL R7 3 - 0x8C1C0510, // 0021 GETMET R7 R2 K16 - 0x58240011, // 0022 LDCONST R9 K17 - 0x58280012, // 0023 LDCONST R10 K18 - 0x5C2C0C00, // 0024 MOVE R11 R6 - 0x88300113, // 0025 GETMBR R12 R0 K19 - 0x7C1C0A00, // 0026 CALL R7 5 - 0xB81E1000, // 0027 GETNGBL R7 K8 - 0x8C1C0F14, // 0028 GETMET R7 R7 K20 - 0x7C1C0200, // 0029 CALL R7 1 - 0x8C1C0F0A, // 002A GETMET R7 R7 K10 - 0x5824000B, // 002B LDCONST R9 K11 - 0x7C1C0400, // 002C CALL R7 2 - 0x781E000E, // 002D JMPF R7 #003D - 0xB81E1000, // 002E GETNGBL R7 K8 - 0x8C1C0F0C, // 002F GETMET R7 R7 K12 - 0x8C24070D, // 0030 GETMET R9 R3 K13 - 0x582C000E, // 0031 LDCONST R11 K14 - 0x58300014, // 0032 LDCONST R12 K20 - 0x5C340C00, // 0033 MOVE R13 R6 - 0x7C240800, // 0034 CALL R9 4 - 0x5828000F, // 0035 LDCONST R10 K15 - 0x7C1C0600, // 0036 CALL R7 3 - 0x8C1C0510, // 0037 GETMET R7 R2 K16 - 0x58240011, // 0038 LDCONST R9 K17 - 0x58280012, // 0039 LDCONST R10 K18 - 0x5C2C0C00, // 003A MOVE R11 R6 - 0x88300115, // 003B GETMBR R12 R0 K21 - 0x7C1C0A00, // 003C CALL R7 5 - 0xA8040001, // 003D EXBLK 1 1 - 0x70020010, // 003E JMP #0050 - 0xAC100002, // 003F CATCH R4 0 2 - 0x7002000D, // 0040 JMP #004F - 0xB81A1000, // 0041 GETNGBL R6 K8 - 0x8C180D0C, // 0042 GETMET R6 R6 K12 - 0x60200008, // 0043 GETGBL R8 G8 - 0x5C240800, // 0044 MOVE R9 R4 - 0x7C200200, // 0045 CALL R8 1 - 0x00222C08, // 0046 ADD R8 K22 R8 - 0x00201117, // 0047 ADD R8 R8 K23 - 0x60240008, // 0048 GETGBL R9 G8 - 0x5C280A00, // 0049 MOVE R10 R5 - 0x7C240200, // 004A CALL R9 1 - 0x00201009, // 004B ADD R8 R8 R9 - 0x5824000F, // 004C LDCONST R9 K15 - 0x7C180600, // 004D CALL R6 3 - 0x70020000, // 004E JMP #0050 - 0xB0080000, // 004F RAISE 2 R0 R0 - 0x80000000, // 0050 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: is_root_commissioning_open -********************************************************************/ -be_local_closure(Matter_Device_is_root_commissioning_open, /* name */ +be_local_closure(Matter_Device_event_fabrics_saved, /* name */ be_nested_proto( 3, /* nstack */ 1, /* argc */ @@ -3662,142 +4416,28 @@ be_local_closure(Matter_Device_is_root_commissioning_open, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[ 2]) { /* constants */ - /* K0 */ be_nested_str_weak(commissioning_open), - /* K1 */ be_nested_str_weak(commissioning_admin_fabric), - }), - be_str_weak(is_root_commissioning_open), - &be_const_str_solidified, - ( &(const binstruction[11]) { /* code */ - 0x88040100, // 0000 GETMBR R1 R0 K0 - 0x4C080000, // 0001 LDNIL R2 - 0x20040202, // 0002 NE R1 R1 R2 - 0x78060003, // 0003 JMPF R1 #0008 - 0x88040101, // 0004 GETMBR R1 R0 K1 - 0x4C080000, // 0005 LDNIL R2 - 0x1C040202, // 0006 EQ R1 R1 R2 - 0x74060000, // 0007 JMPT R1 #0009 - 0x50040001, // 0008 LDBOOL R1 0 1 - 0x50040200, // 0009 LDBOOL R1 1 0 - 0x80040200, // 000A RET 1 R1 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: is_commissioning_open -********************************************************************/ -be_local_closure(Matter_Device_is_commissioning_open, /* name */ - be_nested_proto( - 3, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 1]) { /* constants */ - /* K0 */ be_nested_str_weak(commissioning_open), - }), - be_str_weak(is_commissioning_open), - &be_const_str_solidified, - ( &(const binstruction[ 4]) { /* code */ - 0x88040100, // 0000 GETMBR R1 R0 K0 - 0x4C080000, // 0001 LDNIL R2 - 0x20040202, // 0002 NE R1 R1 R2 - 0x80040200, // 0003 RET 1 R1 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: start_commissioning_complete -********************************************************************/ -be_local_closure(Matter_Device_start_commissioning_complete, /* name */ - be_nested_proto( - 6, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ ( &(const bvalue[ 5]) { /* constants */ - /* K0 */ be_nested_str_weak(tasmota), - /* K1 */ be_nested_str_weak(log), - /* K2 */ be_nested_str_weak(MTR_X3A_X20_X2A_X2A_X2A_X20Commissioning_X20complete_X20_X2A_X2A_X2A), - /* K3 */ be_const_int(2), - /* K4 */ be_nested_str_weak(stop_basic_commissioning), - }), - be_str_weak(start_commissioning_complete), - &be_const_str_solidified, - ( &(const binstruction[ 8]) { /* code */ - 0xB80A0000, // 0000 GETNGBL R2 K0 - 0x8C080501, // 0001 GETMET R2 R2 K1 - 0x58100002, // 0002 LDCONST R4 K2 - 0x58140003, // 0003 LDCONST R5 K3 - 0x7C080600, // 0004 CALL R2 3 - 0x8C080104, // 0005 GETMET R2 R0 K4 - 0x7C080200, // 0006 CALL R2 1 - 0x80000000, // 0007 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: mdns_announce_op_discovery_all_fabrics -********************************************************************/ -be_local_closure(Matter_Device_mdns_announce_op_discovery_all_fabrics, /* name */ - be_nested_proto( - 6, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 6]) { /* constants */ /* K0 */ be_nested_str_weak(sessions), - /* K1 */ be_nested_str_weak(active_fabrics), - /* K2 */ be_nested_str_weak(get_device_id), - /* K3 */ be_nested_str_weak(get_fabric_id), - /* K4 */ be_nested_str_weak(mdns_announce_op_discovery), - /* K5 */ be_nested_str_weak(stop_iteration), + /* K1 */ be_nested_str_weak(count_active_fabrics), + /* K2 */ be_const_int(0), + /* K3 */ be_nested_str_weak(plugins_persist), + /* K4 */ be_nested_str_weak(save_param), }), - be_str_weak(mdns_announce_op_discovery_all_fabrics), + be_str_weak(event_fabrics_saved), &be_const_str_solidified, - ( &(const binstruction[22]) { /* code */ - 0x60040010, // 0000 GETGBL R1 G16 - 0x88080100, // 0001 GETMBR R2 R0 K0 - 0x8C080501, // 0002 GETMET R2 R2 K1 - 0x7C080200, // 0003 CALL R2 1 - 0x7C040200, // 0004 CALL R1 1 - 0xA802000B, // 0005 EXBLK 0 #0012 - 0x5C080200, // 0006 MOVE R2 R1 - 0x7C080000, // 0007 CALL R2 0 - 0x8C0C0502, // 0008 GETMET R3 R2 K2 - 0x7C0C0200, // 0009 CALL R3 1 - 0x780E0005, // 000A JMPF R3 #0011 - 0x8C0C0503, // 000B GETMET R3 R2 K3 - 0x7C0C0200, // 000C CALL R3 1 - 0x780E0002, // 000D JMPF R3 #0011 - 0x8C0C0104, // 000E GETMET R3 R0 K4 - 0x5C140400, // 000F MOVE R5 R2 - 0x7C0C0400, // 0010 CALL R3 2 - 0x7001FFF3, // 0011 JMP #0006 - 0x58040005, // 0012 LDCONST R1 K5 - 0xAC040200, // 0013 CATCH R1 1 0 - 0xB0080000, // 0014 RAISE 2 R0 R0 - 0x80000000, // 0015 RET 0 + ( &(const binstruction[12]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x8C040301, // 0001 GETMET R1 R1 K1 + 0x7C040200, // 0002 CALL R1 1 + 0x24040302, // 0003 GT R1 R1 K2 + 0x78060005, // 0004 JMPF R1 #000B + 0x88040103, // 0005 GETMBR R1 R0 K3 + 0x74060003, // 0006 JMPT R1 #000B + 0x50040200, // 0007 LDBOOL R1 1 0 + 0x90020601, // 0008 SETMBR R0 K3 R1 + 0x8C040104, // 0009 GETMET R1 R0 K4 + 0x7C040200, // 000A CALL R1 1 + 0x80000000, // 000B RET 0 }) ) ); @@ -3805,346 +4445,11 @@ be_local_closure(Matter_Device_mdns_announce_op_discovery_all_fabrics, /* name /******************************************************************** -** Solidified function: MtrJoin +** Solidified function: k2l_num ********************************************************************/ -be_local_closure(Matter_Device_MtrJoin, /* name */ +be_local_closure(Matter_Device_k2l_num, /* name */ be_nested_proto( - 8, /* nstack */ - 5, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 4]) { /* constants */ - /* K0 */ be_nested_str_weak(start_root_basic_commissioning), - /* K1 */ be_nested_str_weak(stop_basic_commissioning), - /* K2 */ be_nested_str_weak(tasmota), - /* K3 */ be_nested_str_weak(resp_cmnd_done), - }), - be_str_weak(MtrJoin), - &be_const_str_solidified, - ( &(const binstruction[13]) { /* code */ - 0x60140009, // 0000 GETGBL R5 G9 - 0x5C180600, // 0001 MOVE R6 R3 - 0x7C140200, // 0002 CALL R5 1 - 0x78160002, // 0003 JMPF R5 #0007 - 0x8C180100, // 0004 GETMET R6 R0 K0 - 0x7C180200, // 0005 CALL R6 1 - 0x70020001, // 0006 JMP #0009 - 0x8C180101, // 0007 GETMET R6 R0 K1 - 0x7C180200, // 0008 CALL R6 1 - 0xB81A0400, // 0009 GETNGBL R6 K2 - 0x8C180D03, // 000A GETMET R6 R6 K3 - 0x7C180200, // 000B CALL R6 1 - 0x80000000, // 000C RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: invoke_request -********************************************************************/ -be_local_closure(Matter_Device_invoke_request, /* name */ - be_nested_proto( - 12, /* nstack */ - 4, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 8]) { /* constants */ - /* K0 */ be_const_int(0), - /* K1 */ be_nested_str_weak(endpoint), - /* K2 */ be_nested_str_weak(plugins), - /* K3 */ be_nested_str_weak(invoke_request), - /* K4 */ be_const_int(1), - /* K5 */ be_nested_str_weak(status), - /* K6 */ be_nested_str_weak(matter), - /* K7 */ be_nested_str_weak(UNSUPPORTED_ENDPOINT), - }), - be_str_weak(invoke_request), - &be_const_str_solidified, - ( &(const binstruction[24]) { /* code */ - 0x58100000, // 0000 LDCONST R4 K0 - 0x88140701, // 0001 GETMBR R5 R3 K1 - 0x6018000C, // 0002 GETGBL R6 G12 - 0x881C0102, // 0003 GETMBR R7 R0 K2 - 0x7C180200, // 0004 CALL R6 1 - 0x14180806, // 0005 LT R6 R4 R6 - 0x781A000C, // 0006 JMPF R6 #0014 - 0x88180102, // 0007 GETMBR R6 R0 K2 - 0x94180C04, // 0008 GETIDX R6 R6 R4 - 0x881C0D01, // 0009 GETMBR R7 R6 K1 - 0x1C1C0E05, // 000A EQ R7 R7 R5 - 0x781E0005, // 000B JMPF R7 #0012 - 0x8C1C0D03, // 000C GETMET R7 R6 K3 - 0x5C240200, // 000D MOVE R9 R1 - 0x5C280400, // 000E MOVE R10 R2 - 0x5C2C0600, // 000F MOVE R11 R3 - 0x7C1C0800, // 0010 CALL R7 4 - 0x80040E00, // 0011 RET 1 R7 - 0x00100904, // 0012 ADD R4 R4 K4 - 0x7001FFED, // 0013 JMP #0002 - 0xB81A0C00, // 0014 GETNGBL R6 K6 - 0x88180D07, // 0015 GETMBR R6 R6 K7 - 0x900E0A06, // 0016 SETMBR R3 K5 R6 - 0x80000000, // 0017 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: compute_manual_pairing_code -********************************************************************/ -be_local_closure(Matter_Device_compute_manual_pairing_code, /* name */ - be_nested_proto( - 11, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 8]) { /* constants */ - /* K0 */ be_nested_str_weak(string), - /* K1 */ be_nested_str_weak(root_discriminator), - /* K2 */ be_nested_str_weak(root_passcode), - /* K3 */ be_nested_str_weak(format), - /* K4 */ be_nested_str_weak(_X251i_X2505i_X2504i), - /* K5 */ be_nested_str_weak(matter), - /* K6 */ be_nested_str_weak(Verhoeff), - /* K7 */ be_nested_str_weak(checksum), - }), - be_str_weak(compute_manual_pairing_code), - &be_const_str_solidified, - ( &(const binstruction[31]) { /* code */ - 0xA4060000, // 0000 IMPORT R1 K0 - 0x88080101, // 0001 GETMBR R2 R0 K1 - 0x540E0FFE, // 0002 LDINT R3 4095 - 0x2C080403, // 0003 AND R2 R2 R3 - 0x540E0009, // 0004 LDINT R3 10 - 0x3C080403, // 0005 SHR R2 R2 R3 - 0x880C0101, // 0006 GETMBR R3 R0 K1 - 0x541202FF, // 0007 LDINT R4 768 - 0x2C0C0604, // 0008 AND R3 R3 R4 - 0x54120005, // 0009 LDINT R4 6 - 0x380C0604, // 000A SHL R3 R3 R4 - 0x88100102, // 000B GETMBR R4 R0 K2 - 0x54163FFE, // 000C LDINT R5 16383 - 0x2C100805, // 000D AND R4 R4 R5 - 0x300C0604, // 000E OR R3 R3 R4 - 0x88100102, // 000F GETMBR R4 R0 K2 - 0x5416000D, // 0010 LDINT R5 14 - 0x3C100805, // 0011 SHR R4 R4 R5 - 0x8C140303, // 0012 GETMET R5 R1 K3 - 0x581C0004, // 0013 LDCONST R7 K4 - 0x5C200400, // 0014 MOVE R8 R2 - 0x5C240600, // 0015 MOVE R9 R3 - 0x5C280800, // 0016 MOVE R10 R4 - 0x7C140A00, // 0017 CALL R5 5 - 0xB81A0A00, // 0018 GETNGBL R6 K5 - 0x88180D06, // 0019 GETMBR R6 R6 K6 - 0x8C180D07, // 001A GETMET R6 R6 K7 - 0x5C200A00, // 001B MOVE R8 R5 - 0x7C180400, // 001C CALL R6 2 - 0x00140A06, // 001D ADD R5 R5 R6 - 0x80040A00, // 001E RET 1 R5 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: mdns_announce_op_discovery -********************************************************************/ -be_local_closure(Matter_Device_mdns_announce_op_discovery, /* name */ - be_nested_proto( - 15, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[29]) { /* constants */ - /* K0 */ be_nested_str_weak(mdns), - /* K1 */ be_nested_str_weak(string), - /* K2 */ be_nested_str_weak(get_device_id), - /* K3 */ be_nested_str_weak(copy), - /* K4 */ be_nested_str_weak(reverse), - /* K5 */ be_nested_str_weak(get_fabric_compressed), - /* K6 */ be_nested_str_weak(tohex), - /* K7 */ be_nested_str_weak(_X2D), - /* K8 */ be_nested_str_weak(tasmota), - /* K9 */ be_nested_str_weak(log), - /* K10 */ be_nested_str_weak(MTR_X3A_X20Operational_X20Discovery_X20node_X20_X3D_X20), - /* K11 */ be_const_int(2), - /* K12 */ be_nested_str_weak(eth), - /* K13 */ be_nested_str_weak(find), - /* K14 */ be_nested_str_weak(up), - /* K15 */ be_nested_str_weak(format), - /* K16 */ be_nested_str_weak(MTR_X3A_X20adding_X20mDNS_X20on_X20_X25s_X20_X27_X25s_X27_X20ptr_X20to_X20_X60_X25s_X2Elocal_X60), - /* K17 */ be_nested_str_weak(hostname_eth), - /* K18 */ be_const_int(3), - /* K19 */ be_nested_str_weak(add_service), - /* K20 */ be_nested_str_weak(_matter), - /* K21 */ be_nested_str_weak(_tcp), - /* K22 */ be_nested_str_weak(_I), - /* K23 */ be_nested_str_weak(MTR_X3A_X20adding_X20subtype_X3A_X20), - /* K24 */ be_nested_str_weak(add_subtype), - /* K25 */ be_nested_str_weak(wifi), - /* K26 */ be_nested_str_weak(hostname_wifi), - /* K27 */ be_nested_str_weak(MTR_X3A_X20Exception), - /* K28 */ be_nested_str_weak(_X7C), - }), - be_str_weak(mdns_announce_op_discovery), - &be_const_str_solidified, - ( &(const binstruction[122]) { /* code */ - 0xA40A0000, // 0000 IMPORT R2 K0 - 0xA40E0200, // 0001 IMPORT R3 K1 - 0xA8020064, // 0002 EXBLK 0 #0068 - 0x8C100302, // 0003 GETMET R4 R1 K2 - 0x7C100200, // 0004 CALL R4 1 - 0x8C100903, // 0005 GETMET R4 R4 K3 - 0x7C100200, // 0006 CALL R4 1 - 0x8C100904, // 0007 GETMET R4 R4 K4 - 0x7C100200, // 0008 CALL R4 1 - 0x8C140305, // 0009 GETMET R5 R1 K5 - 0x7C140200, // 000A CALL R5 1 - 0x8C180B06, // 000B GETMET R6 R5 K6 - 0x7C180200, // 000C CALL R6 1 - 0x00180D07, // 000D ADD R6 R6 K7 - 0x8C1C0906, // 000E GETMET R7 R4 K6 - 0x7C1C0200, // 000F CALL R7 1 - 0x00180C07, // 0010 ADD R6 R6 R7 - 0xB81E1000, // 0011 GETNGBL R7 K8 - 0x8C1C0F09, // 0012 GETMET R7 R7 K9 - 0x00261406, // 0013 ADD R9 K10 R6 - 0x5828000B, // 0014 LDCONST R10 K11 - 0x7C1C0600, // 0015 CALL R7 3 - 0xB81E1000, // 0016 GETNGBL R7 K8 - 0x8C1C0F0C, // 0017 GETMET R7 R7 K12 - 0x7C1C0200, // 0018 CALL R7 1 - 0x8C1C0F0D, // 0019 GETMET R7 R7 K13 - 0x5824000E, // 001A LDCONST R9 K14 - 0x7C1C0400, // 001B CALL R7 2 - 0x781E0020, // 001C JMPF R7 #003E - 0xB81E1000, // 001D GETNGBL R7 K8 - 0x8C1C0F09, // 001E GETMET R7 R7 K9 - 0x8C24070F, // 001F GETMET R9 R3 K15 - 0x582C0010, // 0020 LDCONST R11 K16 - 0x5830000C, // 0021 LDCONST R12 K12 - 0x5C340C00, // 0022 MOVE R13 R6 - 0x88380111, // 0023 GETMBR R14 R0 K17 - 0x7C240A00, // 0024 CALL R9 5 - 0x58280012, // 0025 LDCONST R10 K18 - 0x7C1C0600, // 0026 CALL R7 3 - 0x8C1C0513, // 0027 GETMET R7 R2 K19 - 0x58240014, // 0028 LDCONST R9 K20 - 0x58280015, // 0029 LDCONST R10 K21 - 0x542E15A3, // 002A LDINT R11 5540 - 0x4C300000, // 002B LDNIL R12 - 0x5C340C00, // 002C MOVE R13 R6 - 0x88380111, // 002D GETMBR R14 R0 K17 - 0x7C1C0E00, // 002E CALL R7 7 - 0x8C1C0B06, // 002F GETMET R7 R5 K6 - 0x7C1C0200, // 0030 CALL R7 1 - 0x001E2C07, // 0031 ADD R7 K22 R7 - 0xB8221000, // 0032 GETNGBL R8 K8 - 0x8C201109, // 0033 GETMET R8 R8 K9 - 0x002A2E07, // 0034 ADD R10 K23 R7 - 0x582C0012, // 0035 LDCONST R11 K18 - 0x7C200600, // 0036 CALL R8 3 - 0x8C200518, // 0037 GETMET R8 R2 K24 - 0x58280014, // 0038 LDCONST R10 K20 - 0x582C0015, // 0039 LDCONST R11 K21 - 0x5C300C00, // 003A MOVE R12 R6 - 0x88340111, // 003B GETMBR R13 R0 K17 - 0x5C380E00, // 003C MOVE R14 R7 - 0x7C200C00, // 003D CALL R8 6 - 0xB81E1000, // 003E GETNGBL R7 K8 - 0x8C1C0F19, // 003F GETMET R7 R7 K25 - 0x7C1C0200, // 0040 CALL R7 1 - 0x8C1C0F0D, // 0041 GETMET R7 R7 K13 - 0x5824000E, // 0042 LDCONST R9 K14 - 0x7C1C0400, // 0043 CALL R7 2 - 0x781E0020, // 0044 JMPF R7 #0066 - 0xB81E1000, // 0045 GETNGBL R7 K8 - 0x8C1C0F09, // 0046 GETMET R7 R7 K9 - 0x8C24070F, // 0047 GETMET R9 R3 K15 - 0x582C0010, // 0048 LDCONST R11 K16 - 0x58300019, // 0049 LDCONST R12 K25 - 0x5C340C00, // 004A MOVE R13 R6 - 0x8838011A, // 004B GETMBR R14 R0 K26 - 0x7C240A00, // 004C CALL R9 5 - 0x58280012, // 004D LDCONST R10 K18 - 0x7C1C0600, // 004E CALL R7 3 - 0x8C1C0513, // 004F GETMET R7 R2 K19 - 0x58240014, // 0050 LDCONST R9 K20 - 0x58280015, // 0051 LDCONST R10 K21 - 0x542E15A3, // 0052 LDINT R11 5540 - 0x4C300000, // 0053 LDNIL R12 - 0x5C340C00, // 0054 MOVE R13 R6 - 0x8838011A, // 0055 GETMBR R14 R0 K26 - 0x7C1C0E00, // 0056 CALL R7 7 - 0x8C1C0B06, // 0057 GETMET R7 R5 K6 - 0x7C1C0200, // 0058 CALL R7 1 - 0x001E2C07, // 0059 ADD R7 K22 R7 - 0xB8221000, // 005A GETNGBL R8 K8 - 0x8C201109, // 005B GETMET R8 R8 K9 - 0x002A2E07, // 005C ADD R10 K23 R7 - 0x582C0012, // 005D LDCONST R11 K18 - 0x7C200600, // 005E CALL R8 3 - 0x8C200518, // 005F GETMET R8 R2 K24 - 0x58280014, // 0060 LDCONST R10 K20 - 0x582C0015, // 0061 LDCONST R11 K21 - 0x5C300C00, // 0062 MOVE R12 R6 - 0x8834011A, // 0063 GETMBR R13 R0 K26 - 0x5C380E00, // 0064 MOVE R14 R7 - 0x7C200C00, // 0065 CALL R8 6 - 0xA8040001, // 0066 EXBLK 1 1 - 0x70020010, // 0067 JMP #0079 - 0xAC100002, // 0068 CATCH R4 0 2 - 0x7002000D, // 0069 JMP #0078 - 0xB81A1000, // 006A GETNGBL R6 K8 - 0x8C180D09, // 006B GETMET R6 R6 K9 - 0x60200008, // 006C GETGBL R8 G8 - 0x5C240800, // 006D MOVE R9 R4 - 0x7C200200, // 006E CALL R8 1 - 0x00223608, // 006F ADD R8 K27 R8 - 0x0020111C, // 0070 ADD R8 R8 K28 - 0x60240008, // 0071 GETGBL R9 G8 - 0x5C280A00, // 0072 MOVE R10 R5 - 0x7C240200, // 0073 CALL R9 1 - 0x00201009, // 0074 ADD R8 R8 R9 - 0x5824000B, // 0075 LDCONST R9 K11 - 0x7C180600, // 0076 CALL R6 3 - 0x70020000, // 0077 JMP #0079 - 0xB0080000, // 0078 RAISE 2 R0 R0 - 0x80000000, // 0079 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: k2l -********************************************************************/ -be_local_closure(Matter_Device_k2l, /* name */ - be_nested_proto( - 8, /* nstack */ + 9, /* nstack */ 1, /* argc */ 4, /* varg */ 0, /* has upvals */ @@ -4160,9 +4465,9 @@ be_local_closure(Matter_Device_k2l, /* name */ /* K4 */ be_const_int(1), /* K5 */ be_const_int(0), }), - be_str_weak(k2l), + be_str_weak(k2l_num), &be_const_str_solidified, - ( &(const binstruction[50]) { /* code */ + ( &(const binstruction[52]) { /* code */ 0x58040000, // 0000 LDCONST R1 K0 0x60080012, // 0001 GETGBL R2 G18 0x7C080000, // 0002 CALL R2 0 @@ -4174,45 +4479,258 @@ be_local_closure(Matter_Device_k2l, /* name */ 0x8C100101, // 0008 GETMET R4 R0 K1 0x7C100200, // 0009 CALL R4 1 0x7C0C0200, // 000A CALL R3 1 - 0xA8020005, // 000B EXBLK 0 #0012 + 0xA8020007, // 000B EXBLK 0 #0014 0x5C100600, // 000C MOVE R4 R3 0x7C100000, // 000D CALL R4 0 0x8C140502, // 000E GETMET R5 R2 K2 - 0x5C1C0800, // 000F MOVE R7 R4 - 0x7C140400, // 0010 CALL R5 2 - 0x7001FFF9, // 0011 JMP #000C - 0x580C0003, // 0012 LDCONST R3 K3 - 0xAC0C0200, // 0013 CATCH R3 1 0 - 0xB0080000, // 0014 RAISE 2 R0 R0 - 0x600C0010, // 0015 GETGBL R3 G16 - 0x6010000C, // 0016 GETGBL R4 G12 - 0x5C140400, // 0017 MOVE R5 R2 - 0x7C100200, // 0018 CALL R4 1 - 0x04100904, // 0019 SUB R4 R4 K4 - 0x40120804, // 001A CONNECT R4 K4 R4 - 0x7C0C0200, // 001B CALL R3 1 - 0xA8020010, // 001C EXBLK 0 #002E - 0x5C100600, // 001D MOVE R4 R3 - 0x7C100000, // 001E CALL R4 0 - 0x94140404, // 001F GETIDX R5 R2 R4 - 0x5C180800, // 0020 MOVE R6 R4 - 0x241C0D05, // 0021 GT R7 R6 K5 - 0x781E0008, // 0022 JMPF R7 #002C - 0x041C0D04, // 0023 SUB R7 R6 K4 - 0x941C0407, // 0024 GETIDX R7 R2 R7 - 0x241C0E05, // 0025 GT R7 R7 R5 - 0x781E0004, // 0026 JMPF R7 #002C - 0x041C0D04, // 0027 SUB R7 R6 K4 - 0x941C0407, // 0028 GETIDX R7 R2 R7 - 0x98080C07, // 0029 SETIDX R2 R6 R7 - 0x04180D04, // 002A SUB R6 R6 K4 - 0x7001FFF4, // 002B JMP #0021 - 0x98080C05, // 002C SETIDX R2 R6 R5 - 0x7001FFEE, // 002D JMP #001D - 0x580C0003, // 002E LDCONST R3 K3 - 0xAC0C0200, // 002F CATCH R3 1 0 - 0xB0080000, // 0030 RAISE 2 R0 R0 - 0x80040400, // 0031 RET 1 R2 + 0x601C0009, // 000F GETGBL R7 G9 + 0x5C200800, // 0010 MOVE R8 R4 + 0x7C1C0200, // 0011 CALL R7 1 + 0x7C140400, // 0012 CALL R5 2 + 0x7001FFF7, // 0013 JMP #000C + 0x580C0003, // 0014 LDCONST R3 K3 + 0xAC0C0200, // 0015 CATCH R3 1 0 + 0xB0080000, // 0016 RAISE 2 R0 R0 + 0x600C0010, // 0017 GETGBL R3 G16 + 0x6010000C, // 0018 GETGBL R4 G12 + 0x5C140400, // 0019 MOVE R5 R2 + 0x7C100200, // 001A CALL R4 1 + 0x04100904, // 001B SUB R4 R4 K4 + 0x40120804, // 001C CONNECT R4 K4 R4 + 0x7C0C0200, // 001D CALL R3 1 + 0xA8020010, // 001E EXBLK 0 #0030 + 0x5C100600, // 001F MOVE R4 R3 + 0x7C100000, // 0020 CALL R4 0 + 0x94140404, // 0021 GETIDX R5 R2 R4 + 0x5C180800, // 0022 MOVE R6 R4 + 0x241C0D05, // 0023 GT R7 R6 K5 + 0x781E0008, // 0024 JMPF R7 #002E + 0x041C0D04, // 0025 SUB R7 R6 K4 + 0x941C0407, // 0026 GETIDX R7 R2 R7 + 0x241C0E05, // 0027 GT R7 R7 R5 + 0x781E0004, // 0028 JMPF R7 #002E + 0x041C0D04, // 0029 SUB R7 R6 K4 + 0x941C0407, // 002A GETIDX R7 R2 R7 + 0x98080C07, // 002B SETIDX R2 R6 R7 + 0x04180D04, // 002C SUB R6 R6 K4 + 0x7001FFF4, // 002D JMP #0023 + 0x98080C05, // 002E SETIDX R2 R6 R5 + 0x7001FFEE, // 002F JMP #001F + 0x580C0003, // 0030 LDCONST R3 K3 + 0xAC0C0200, // 0031 CATCH R3 1 0 + 0xB0080000, // 0032 RAISE 2 R0 R0 + 0x80040400, // 0033 RET 1 R2 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: mdns_remove_PASE +********************************************************************/ +be_local_closure(Matter_Device_mdns_remove_PASE, /* name */ + be_nested_proto( + 12, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[22]) { /* constants */ + /* K0 */ be_nested_str_weak(mdns), + /* K1 */ be_nested_str_weak(string), + /* K2 */ be_nested_str_weak(mdns_pase_eth), + /* K3 */ be_nested_str_weak(tasmota), + /* K4 */ be_nested_str_weak(log), + /* K5 */ be_nested_str_weak(format), + /* K6 */ be_nested_str_weak(MTR_X3A_X20calling_X20mdns_X2Eremove_service_X28_X25s_X2C_X20_X25s_X2C_X20_X25s_X2C_X20_X25s_X29), + /* K7 */ be_nested_str_weak(_matterc), + /* K8 */ be_nested_str_weak(_udp), + /* K9 */ be_nested_str_weak(commissioning_instance_eth), + /* K10 */ be_nested_str_weak(hostname_eth), + /* K11 */ be_const_int(3), + /* K12 */ be_nested_str_weak(MTR_X3A_X20remove_X20mDNS_X20on_X20_X25s_X20_X27_X25s_X27), + /* K13 */ be_nested_str_weak(eth), + /* K14 */ be_const_int(2), + /* K15 */ be_nested_str_weak(remove_service), + /* K16 */ be_nested_str_weak(mdns_pase_wifi), + /* K17 */ be_nested_str_weak(commissioning_instance_wifi), + /* K18 */ be_nested_str_weak(hostname_wifi), + /* K19 */ be_nested_str_weak(wifi), + /* K20 */ be_nested_str_weak(MTR_X3A_X20Exception), + /* K21 */ be_nested_str_weak(_X7C), + }), + be_str_weak(mdns_remove_PASE), + &be_const_str_solidified, + ( &(const binstruction[83]) { /* code */ + 0xA4060000, // 0000 IMPORT R1 K0 + 0xA40A0200, // 0001 IMPORT R2 K1 + 0xA802003D, // 0002 EXBLK 0 #0041 + 0x880C0102, // 0003 GETMBR R3 R0 K2 + 0x780E001B, // 0004 JMPF R3 #0021 + 0xB80E0600, // 0005 GETNGBL R3 K3 + 0x8C0C0704, // 0006 GETMET R3 R3 K4 + 0x8C140505, // 0007 GETMET R5 R2 K5 + 0x581C0006, // 0008 LDCONST R7 K6 + 0x58200007, // 0009 LDCONST R8 K7 + 0x58240008, // 000A LDCONST R9 K8 + 0x88280109, // 000B GETMBR R10 R0 K9 + 0x882C010A, // 000C GETMBR R11 R0 K10 + 0x7C140C00, // 000D CALL R5 6 + 0x5818000B, // 000E LDCONST R6 K11 + 0x7C0C0600, // 000F CALL R3 3 + 0xB80E0600, // 0010 GETNGBL R3 K3 + 0x8C0C0704, // 0011 GETMET R3 R3 K4 + 0x8C140505, // 0012 GETMET R5 R2 K5 + 0x581C000C, // 0013 LDCONST R7 K12 + 0x5820000D, // 0014 LDCONST R8 K13 + 0x88240109, // 0015 GETMBR R9 R0 K9 + 0x7C140800, // 0016 CALL R5 4 + 0x5818000E, // 0017 LDCONST R6 K14 + 0x7C0C0600, // 0018 CALL R3 3 + 0x500C0000, // 0019 LDBOOL R3 0 0 + 0x90020403, // 001A SETMBR R0 K2 R3 + 0x8C0C030F, // 001B GETMET R3 R1 K15 + 0x58140007, // 001C LDCONST R5 K7 + 0x58180008, // 001D LDCONST R6 K8 + 0x881C0109, // 001E GETMBR R7 R0 K9 + 0x8820010A, // 001F GETMBR R8 R0 K10 + 0x7C0C0A00, // 0020 CALL R3 5 + 0x880C0110, // 0021 GETMBR R3 R0 K16 + 0x780E001B, // 0022 JMPF R3 #003F + 0xB80E0600, // 0023 GETNGBL R3 K3 + 0x8C0C0704, // 0024 GETMET R3 R3 K4 + 0x8C140505, // 0025 GETMET R5 R2 K5 + 0x581C0006, // 0026 LDCONST R7 K6 + 0x58200007, // 0027 LDCONST R8 K7 + 0x58240008, // 0028 LDCONST R9 K8 + 0x88280111, // 0029 GETMBR R10 R0 K17 + 0x882C0112, // 002A GETMBR R11 R0 K18 + 0x7C140C00, // 002B CALL R5 6 + 0x5818000B, // 002C LDCONST R6 K11 + 0x7C0C0600, // 002D CALL R3 3 + 0xB80E0600, // 002E GETNGBL R3 K3 + 0x8C0C0704, // 002F GETMET R3 R3 K4 + 0x8C140505, // 0030 GETMET R5 R2 K5 + 0x581C000C, // 0031 LDCONST R7 K12 + 0x58200013, // 0032 LDCONST R8 K19 + 0x88240111, // 0033 GETMBR R9 R0 K17 + 0x7C140800, // 0034 CALL R5 4 + 0x5818000E, // 0035 LDCONST R6 K14 + 0x7C0C0600, // 0036 CALL R3 3 + 0x500C0000, // 0037 LDBOOL R3 0 0 + 0x90022003, // 0038 SETMBR R0 K16 R3 + 0x8C0C030F, // 0039 GETMET R3 R1 K15 + 0x58140007, // 003A LDCONST R5 K7 + 0x58180008, // 003B LDCONST R6 K8 + 0x881C0111, // 003C GETMBR R7 R0 K17 + 0x88200112, // 003D GETMBR R8 R0 K18 + 0x7C0C0A00, // 003E CALL R3 5 + 0xA8040001, // 003F EXBLK 1 1 + 0x70020010, // 0040 JMP #0052 + 0xAC0C0002, // 0041 CATCH R3 0 2 + 0x7002000D, // 0042 JMP #0051 + 0xB8160600, // 0043 GETNGBL R5 K3 + 0x8C140B04, // 0044 GETMET R5 R5 K4 + 0x601C0008, // 0045 GETGBL R7 G8 + 0x5C200600, // 0046 MOVE R8 R3 + 0x7C1C0200, // 0047 CALL R7 1 + 0x001E2807, // 0048 ADD R7 K20 R7 + 0x001C0F15, // 0049 ADD R7 R7 K21 + 0x60200008, // 004A GETGBL R8 G8 + 0x5C240800, // 004B MOVE R9 R4 + 0x7C200200, // 004C CALL R8 1 + 0x001C0E08, // 004D ADD R7 R7 R8 + 0x5820000E, // 004E LDCONST R8 K14 + 0x7C140600, // 004F CALL R5 3 + 0x70020000, // 0050 JMP #0052 + 0xB0080000, // 0051 RAISE 2 R0 R0 + 0x80000000, // 0052 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: sort_distinct +********************************************************************/ +be_local_closure(Matter_Device_sort_distinct, /* name */ + be_nested_proto( + 7, /* nstack */ + 1, /* argc */ + 4, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 5]) { /* constants */ + /* K0 */ be_const_class(be_class_Matter_Device), + /* K1 */ be_const_int(1), + /* K2 */ be_const_int(0), + /* K3 */ be_nested_str_weak(stop_iteration), + /* K4 */ be_nested_str_weak(remove), + }), + be_str_weak(sort_distinct), + &be_const_str_solidified, + ( &(const binstruction[53]) { /* code */ + 0x58040000, // 0000 LDCONST R1 K0 + 0x60080010, // 0001 GETGBL R2 G16 + 0x600C000C, // 0002 GETGBL R3 G12 + 0x5C100000, // 0003 MOVE R4 R0 + 0x7C0C0200, // 0004 CALL R3 1 + 0x040C0701, // 0005 SUB R3 R3 K1 + 0x400E0203, // 0006 CONNECT R3 K1 R3 + 0x7C080200, // 0007 CALL R2 1 + 0xA8020010, // 0008 EXBLK 0 #001A + 0x5C0C0400, // 0009 MOVE R3 R2 + 0x7C0C0000, // 000A CALL R3 0 + 0x94100003, // 000B GETIDX R4 R0 R3 + 0x5C140600, // 000C MOVE R5 R3 + 0x24180B02, // 000D GT R6 R5 K2 + 0x781A0008, // 000E JMPF R6 #0018 + 0x04180B01, // 000F SUB R6 R5 K1 + 0x94180006, // 0010 GETIDX R6 R0 R6 + 0x24180C04, // 0011 GT R6 R6 R4 + 0x781A0004, // 0012 JMPF R6 #0018 + 0x04180B01, // 0013 SUB R6 R5 K1 + 0x94180006, // 0014 GETIDX R6 R0 R6 + 0x98000A06, // 0015 SETIDX R0 R5 R6 + 0x04140B01, // 0016 SUB R5 R5 K1 + 0x7001FFF4, // 0017 JMP #000D + 0x98000A04, // 0018 SETIDX R0 R5 R4 + 0x7001FFEE, // 0019 JMP #0009 + 0x58080003, // 001A LDCONST R2 K3 + 0xAC080200, // 001B CATCH R2 1 0 + 0xB0080000, // 001C RAISE 2 R0 R0 + 0x58080001, // 001D LDCONST R2 K1 + 0x600C000C, // 001E GETGBL R3 G12 + 0x5C100000, // 001F MOVE R4 R0 + 0x7C0C0200, // 0020 CALL R3 1 + 0x180C0701, // 0021 LE R3 R3 K1 + 0x780E0000, // 0022 JMPF R3 #0024 + 0x80040000, // 0023 RET 1 R0 + 0x940C0102, // 0024 GETIDX R3 R0 K2 + 0x6010000C, // 0025 GETGBL R4 G12 + 0x5C140000, // 0026 MOVE R5 R0 + 0x7C100200, // 0027 CALL R4 1 + 0x14100404, // 0028 LT R4 R2 R4 + 0x78120009, // 0029 JMPF R4 #0034 + 0x94100002, // 002A GETIDX R4 R0 R2 + 0x1C100803, // 002B EQ R4 R4 R3 + 0x78120003, // 002C JMPF R4 #0031 + 0x8C100104, // 002D GETMET R4 R0 K4 + 0x5C180400, // 002E MOVE R6 R2 + 0x7C100400, // 002F CALL R4 2 + 0x70020001, // 0030 JMP #0033 + 0x940C0002, // 0031 GETIDX R3 R0 R2 + 0x00080501, // 0032 ADD R2 R2 K1 + 0x7001FFF0, // 0033 JMP #0025 + 0x80040000, // 0034 RET 1 R0 }) ) ); @@ -4223,89 +4741,98 @@ be_local_closure(Matter_Device_k2l, /* name */ ** Solidified class: Matter_Device ********************************************************************/ be_local_class(Matter_Device, - 28, + 30, NULL, - be_nested_map(79, + be_nested_map(88, ( (struct bmapnode*) &(const bmapnode[]) { - { be_const_key_weak(commissioning_w0, 50), be_const_var(10) }, - { be_const_key_weak(start_operational_discovery, 13), be_const_closure(Matter_Device_start_operational_discovery_closure) }, - { be_const_key_weak(plugins, -1), be_const_var(1) }, - { be_const_key_weak(k2l, -1), be_const_static_closure(Matter_Device_k2l_closure) }, - { be_const_key_weak(mdns_remove_PASE, 72), be_const_closure(Matter_Device_mdns_remove_PASE_closure) }, - { be_const_key_weak(message_handler, -1), be_const_var(3) }, - { be_const_key_weak(mdns_announce_op_discovery, 43), be_const_closure(Matter_Device_mdns_announce_op_discovery_closure) }, - { be_const_key_weak(save_before_restart, -1), be_const_closure(Matter_Device_save_before_restart_closure) }, - { be_const_key_weak(_start_udp, -1), be_const_closure(Matter_Device__start_udp_closure) }, - { be_const_key_weak(commissioning_open, -1), be_const_var(6) }, - { be_const_key_weak(root_L, 45), be_const_var(27) }, - { be_const_key_weak(PRODUCT_ID, -1), be_const_int(32768) }, - { be_const_key_weak(root_passcode, -1), be_const_var(22) }, - { be_const_key_weak(compute_manual_pairing_code, 77), be_const_closure(Matter_Device_compute_manual_pairing_code_closure) }, - { be_const_key_weak(UDP_PORT, -1), be_const_int(5540) }, - { be_const_key_weak(start_basic_commissioning, -1), be_const_closure(Matter_Device_start_basic_commissioning_closure) }, - { be_const_key_weak(remove_fabric, -1), be_const_closure(Matter_Device_remove_fabric_closure) }, - { be_const_key_weak(attribute_updated, -1), be_const_closure(Matter_Device_attribute_updated_closure) }, - { be_const_key_weak(_mdns_announce_hostname, 31), be_const_closure(Matter_Device__mdns_announce_hostname_closure) }, - { be_const_key_weak(autoconf_device, -1), be_const_closure(Matter_Device_autoconf_device_closure) }, - { be_const_key_weak(_trigger_read_sensors, -1), be_const_closure(Matter_Device__trigger_read_sensors_closure) }, - { be_const_key_weak(get_active_endpoints, -1), be_const_closure(Matter_Device_get_active_endpoints_closure) }, - { be_const_key_weak(commissioning_admin_fabric, -1), be_const_var(12) }, - { be_const_key_weak(msg_send, -1), be_const_closure(Matter_Device_msg_send_closure) }, - { be_const_key_weak(hostname_wifi, 32), be_const_var(15) }, - { be_const_key_weak(productid, -1), be_const_var(18) }, - { be_const_key_weak(msg_received, -1), be_const_closure(Matter_Device_msg_received_closure) }, - { be_const_key_weak(commissioning_discriminator, -1), be_const_var(8) }, - { be_const_key_weak(FILENAME, 46), be_nested_str_weak(_matter_device_X2Ejson) }, - { be_const_key_weak(commissioning_instance_eth, 53), be_const_var(14) }, - { be_const_key_weak(start, 75), be_const_closure(Matter_Device_start_closure) }, - { be_const_key_weak(compute_qrcode_content, -1), be_const_closure(Matter_Device_compute_qrcode_content_closure) }, - { be_const_key_weak(MtrJoin, 33), be_const_closure(Matter_Device_MtrJoin_closure) }, - { be_const_key_weak(stop, -1), be_const_closure(Matter_Device_stop_closure) }, - { be_const_key_weak(root_w0, -1), be_const_var(26) }, - { be_const_key_weak(ui, -1), be_const_var(5) }, - { be_const_key_weak(every_second, -1), be_const_closure(Matter_Device_every_second_closure) }, - { be_const_key_weak(start_root_basic_commissioning, -1), be_const_closure(Matter_Device_start_root_basic_commissioning_closure) }, - { be_const_key_weak(start_mdns_announce_hostnames, -1), be_const_closure(Matter_Device_start_mdns_announce_hostnames_closure) }, - { be_const_key_weak(init, -1), be_const_closure(Matter_Device_init_closure) }, + { be_const_key_weak(root_L, -1), be_const_var(29) }, { be_const_key_weak(_compute_pbkdf, -1), be_const_closure(Matter_Device__compute_pbkdf_closure) }, + { be_const_key_weak(_mdns_announce_hostname, -1), be_const_closure(Matter_Device__mdns_announce_hostname_closure) }, + { be_const_key_weak(compute_qrcode_content, -1), be_const_closure(Matter_Device_compute_qrcode_content_closure) }, + { be_const_key_weak(mdns_remove_PASE, 51), be_const_closure(Matter_Device_mdns_remove_PASE_closure) }, + { be_const_key_weak(stop, 56), be_const_closure(Matter_Device_stop_closure) }, + { be_const_key_weak(udp_server, 0), be_const_var(4) }, + { be_const_key_weak(MtrJoin, -1), be_const_closure(Matter_Device_MtrJoin_closure) }, + { be_const_key_weak(commissioning_discriminator, -1), be_const_var(10) }, + { be_const_key_weak(msg_send, 26), be_const_closure(Matter_Device_msg_send_closure) }, + { be_const_key_weak(save_param, 4), be_const_closure(Matter_Device_save_param_closure) }, + { be_const_key_weak(mdns_pase_eth, -1), be_const_var(21) }, + { be_const_key_weak(hostname_eth, -1), be_const_var(18) }, + { be_const_key_weak(productid, -1), be_const_var(20) }, + { be_const_key_weak(vendorid, 69), be_const_var(19) }, + { be_const_key_weak(start_commissioning_complete, 3), be_const_closure(Matter_Device_start_commissioning_complete_closure) }, + { be_const_key_weak(commissioning_salt, -1), be_const_var(11) }, + { be_const_key_weak(commissioning_open, -1), be_const_var(8) }, + { be_const_key_weak(compute_manual_pairing_code, -1), be_const_closure(Matter_Device_compute_manual_pairing_code_closure) }, + { be_const_key_weak(commissioning_L, -1), be_const_var(13) }, + { be_const_key_weak(hostname_wifi, 85), be_const_var(17) }, + { be_const_key_weak(start_mdns_announce_hostnames, -1), be_const_closure(Matter_Device_start_mdns_announce_hostnames_closure) }, + { be_const_key_weak(root_passcode, 7), be_const_var(24) }, { be_const_key_weak(process_attribute_expansion, -1), be_const_closure(Matter_Device_process_attribute_expansion_closure) }, - { be_const_key_weak(PASE_TIMEOUT, 36), be_const_int(600) }, - { be_const_key_weak(mdns_announce_PASE, 40), be_const_closure(Matter_Device_mdns_announce_PASE_closure) }, - { be_const_key_weak(mdns_remove_op_discovery, -1), be_const_closure(Matter_Device_mdns_remove_op_discovery_closure) }, - { be_const_key_weak(commissioning_salt, 39), be_const_var(9) }, - { be_const_key_weak(stop_basic_commissioning, -1), be_const_closure(Matter_Device_stop_basic_commissioning_closure) }, - { be_const_key_weak(every_250ms, -1), be_const_closure(Matter_Device_every_250ms_closure) }, - { be_const_key_weak(root_salt, 41), be_const_var(25) }, - { be_const_key_weak(commissioning_iterations, 6), be_const_var(7) }, - { be_const_key_weak(received_ack, -1), be_const_closure(Matter_Device_received_ack_closure) }, - { be_const_key_weak(VENDOR_ID, -1), be_const_int(65521) }, - { be_const_key_weak(commissioning_L, -1), be_const_var(11) }, - { be_const_key_weak(root_discriminator, -1), be_const_var(21) }, - { be_const_key_weak(ipv4only, -1), be_const_var(23) }, - { be_const_key_weak(load_param, 37), be_const_closure(Matter_Device_load_param_closure) }, - { be_const_key_weak(start_operational_discovery_deferred, 55), be_const_closure(Matter_Device_start_operational_discovery_deferred_closure) }, - { be_const_key_weak(sessions, -1), be_const_var(4) }, - { be_const_key_weak(mdns_remove_op_discovery_all_fabrics, -1), be_const_closure(Matter_Device_mdns_remove_op_discovery_all_fabrics_closure) }, - { be_const_key_weak(register_commands, 52), be_const_closure(Matter_Device_register_commands_closure) }, - { be_const_key_weak(commissioning_instance_wifi, -1), be_const_var(13) }, - { be_const_key_weak(save_param, -1), be_const_closure(Matter_Device_save_param_closure) }, - { be_const_key_weak(PBKDF_ITERATIONS, -1), be_const_int(1000) }, - { be_const_key_weak(_init_basic_commissioning, 44), be_const_closure(Matter_Device__init_basic_commissioning_closure) }, + { be_const_key_weak(received_ack, 12), be_const_closure(Matter_Device_received_ack_closure) }, + { be_const_key_weak(event_fabrics_saved, -1), be_const_closure(Matter_Device_event_fabrics_saved_closure) }, + { be_const_key_weak(start_root_basic_commissioning, 16), be_const_closure(Matter_Device_start_root_basic_commissioning_closure) }, + { be_const_key_weak(ui, -1), be_const_var(7) }, + { be_const_key_weak(PRODUCT_ID, -1), be_const_int(32768) }, + { be_const_key_weak(commissioning_iterations, -1), be_const_var(9) }, + { be_const_key_weak(mdns_announce_op_discovery, 22), be_const_closure(Matter_Device_mdns_announce_op_discovery_closure) }, { be_const_key_weak(is_root_commissioning_open, -1), be_const_closure(Matter_Device_is_root_commissioning_open_closure) }, - { be_const_key_weak(root_iterations, -1), be_const_var(24) }, - { be_const_key_weak(is_commissioning_open, -1), be_const_closure(Matter_Device_is_commissioning_open_closure) }, - { be_const_key_weak(udp_server, -1), be_const_var(2) }, - { be_const_key_weak(start_commissioning_complete, -1), be_const_closure(Matter_Device_start_commissioning_complete_closure) }, - { be_const_key_weak(mdns_announce_op_discovery_all_fabrics, -1), be_const_closure(Matter_Device_mdns_announce_op_discovery_all_fabrics_closure) }, - { be_const_key_weak(sort_distinct, 34), be_const_static_closure(Matter_Device_sort_distinct_closure) }, + { be_const_key_weak(FILENAME, -1), be_nested_str_weak(_matter_device_X2Ejson) }, + { be_const_key_weak(mdns_announce_PASE, 35), be_const_closure(Matter_Device_mdns_announce_PASE_closure) }, + { be_const_key_weak(is_commissioning_open, 44), be_const_closure(Matter_Device_is_commissioning_open_closure) }, + { be_const_key_weak(init, -1), be_const_closure(Matter_Device_init_closure) }, + { be_const_key_weak(stop_basic_commissioning, -1), be_const_closure(Matter_Device_stop_basic_commissioning_closure) }, + { be_const_key_weak(save_before_restart, -1), be_const_closure(Matter_Device_save_before_restart_closure) }, + { be_const_key_weak(plugins_to_json, -1), be_const_closure(Matter_Device_plugins_to_json_closure) }, + { be_const_key_weak(_trigger_read_sensors, 53), be_const_closure(Matter_Device__trigger_read_sensors_closure) }, + { be_const_key_weak(every_250ms, 61), be_const_closure(Matter_Device_every_250ms_closure) }, + { be_const_key_weak(root_w0, -1), be_const_var(28) }, + { be_const_key_weak(mdns_remove_op_discovery_all_fabrics, -1), be_const_closure(Matter_Device_mdns_remove_op_discovery_all_fabrics_closure) }, + { be_const_key_weak(start_commissioning_complete_deferred, 48), be_const_closure(Matter_Device_start_commissioning_complete_deferred_closure) }, + { be_const_key_weak(commissioning_instance_wifi, -1), be_const_var(15) }, + { be_const_key_weak(_init_basic_commissioning, -1), be_const_closure(Matter_Device__init_basic_commissioning_closure) }, { be_const_key_weak(started, -1), be_const_var(0) }, - { be_const_key_weak(hostname_eth, -1), be_const_var(16) }, - { be_const_key_weak(invoke_request, -1), be_const_closure(Matter_Device_invoke_request_closure) }, - { be_const_key_weak(mdns_pase_eth, 14), be_const_var(19) }, - { be_const_key_weak(mdns_pase_wifi, -1), be_const_var(20) }, - { be_const_key_weak(PASSCODE_DEFAULT, 11), be_const_int(20202021) }, - { be_const_key_weak(start_commissioning_complete_deferred, -1), be_const_closure(Matter_Device_start_commissioning_complete_deferred_closure) }, - { be_const_key_weak(vendorid, 3), be_const_var(17) }, + { be_const_key_weak(autoconf_device, -1), be_const_closure(Matter_Device_autoconf_device_closure) }, + { be_const_key_weak(invoke_request, 68), be_const_closure(Matter_Device_invoke_request_closure) }, + { be_const_key_weak(start_operational_discovery, -1), be_const_closure(Matter_Device_start_operational_discovery_closure) }, + { be_const_key_weak(PASE_TIMEOUT, 66), be_const_int(600) }, + { be_const_key_weak(root_salt, 37), be_const_var(27) }, + { be_const_key_weak(get_active_endpoints, -1), be_const_closure(Matter_Device_get_active_endpoints_closure) }, + { be_const_key_weak(message_handler, 47), be_const_var(5) }, + { be_const_key_weak(every_second, -1), be_const_closure(Matter_Device_every_second_closure) }, + { be_const_key_weak(mdns_remove_op_discovery, -1), be_const_closure(Matter_Device_mdns_remove_op_discovery_closure) }, + { be_const_key_weak(mdns_pase_wifi, -1), be_const_var(22) }, + { be_const_key_weak(remove_fabric, -1), be_const_closure(Matter_Device_remove_fabric_closure) }, + { be_const_key_weak(UDP_PORT, -1), be_const_int(5540) }, + { be_const_key_weak(load_param, -1), be_const_closure(Matter_Device_load_param_closure) }, + { be_const_key_weak(_load_plugins_config, -1), be_const_closure(Matter_Device__load_plugins_config_closure) }, + { be_const_key_weak(plugins_classes, -1), be_const_var(3) }, + { be_const_key_weak(autoconf_device_map, -1), be_const_closure(Matter_Device_autoconf_device_map_closure) }, + { be_const_key_weak(attribute_updated, 57), be_const_closure(Matter_Device_attribute_updated_closure) }, + { be_const_key_weak(commissioning_admin_fabric, -1), be_const_var(14) }, + { be_const_key_weak(register_plugin_class, 54), be_const_closure(Matter_Device_register_plugin_class_closure) }, + { be_const_key_weak(commissioning_instance_eth, 70), be_const_var(16) }, + { be_const_key_weak(plugins, 52), be_const_var(1) }, + { be_const_key_weak(PASSCODE_DEFAULT, -1), be_const_int(20202021) }, + { be_const_key_weak(_start_udp, -1), be_const_closure(Matter_Device__start_udp_closure) }, + { be_const_key_weak(start_basic_commissioning, -1), be_const_closure(Matter_Device_start_basic_commissioning_closure) }, + { be_const_key_weak(start, -1), be_const_closure(Matter_Device_start_closure) }, + { be_const_key_weak(msg_received, 38), be_const_closure(Matter_Device_msg_received_closure) }, + { be_const_key_weak(VENDOR_ID, -1), be_const_int(65521) }, + { be_const_key_weak(commissioning_w0, -1), be_const_var(12) }, + { be_const_key_weak(mdns_announce_op_discovery_all_fabrics, 33), be_const_closure(Matter_Device_mdns_announce_op_discovery_all_fabrics_closure) }, + { be_const_key_weak(plugins_persist, 28), be_const_var(2) }, + { be_const_key_weak(register_native_classes, -1), be_const_closure(Matter_Device_register_native_classes_closure) }, + { be_const_key_weak(root_discriminator, 25), be_const_var(23) }, + { be_const_key_weak(k2l_num, -1), be_const_static_closure(Matter_Device_k2l_num_closure) }, + { be_const_key_weak(ipv4only, -1), be_const_var(25) }, + { be_const_key_weak(start_operational_discovery_deferred, 13), be_const_closure(Matter_Device_start_operational_discovery_deferred_closure) }, + { be_const_key_weak(root_iterations, -1), be_const_var(26) }, + { be_const_key_weak(register_commands, 8), be_const_closure(Matter_Device_register_commands_closure) }, + { be_const_key_weak(sessions, -1), be_const_var(6) }, + { be_const_key_weak(k2l, -1), be_const_static_closure(Matter_Device_k2l_closure) }, + { be_const_key_weak(sort_distinct, -1), be_const_static_closure(Matter_Device_sort_distinct_closure) }, + { be_const_key_weak(PBKDF_ITERATIONS, -1), be_const_int(1000) }, })), be_str_weak(Matter_Device) ); diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin.h index dac3fc7df..458456859 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin.h @@ -6,6 +6,372 @@ extern const bclass be_class_Matter_Plugin; +/******************************************************************** +** Solidified function: get_endpoint +********************************************************************/ +be_local_closure(Matter_Plugin_get_endpoint, /* name */ + be_nested_proto( + 2, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 1]) { /* constants */ + /* K0 */ be_nested_str_weak(endpoint), + }), + be_str_weak(get_endpoint), + &be_const_str_solidified, + ( &(const binstruction[ 2]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x80040200, // 0001 RET 1 R1 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: timed_request +********************************************************************/ +be_local_closure(Matter_Plugin_timed_request, /* name */ + be_nested_proto( + 5, /* nstack */ + 4, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 0, /* has constants */ + NULL, /* no const */ + be_str_weak(timed_request), + &be_const_str_solidified, + ( &(const binstruction[ 2]) { /* code */ + 0x4C100000, // 0000 LDNIL R4 + 0x80040800, // 0001 RET 1 R4 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: to_json_parameters +********************************************************************/ +be_local_closure(Matter_Plugin_to_json_parameters, /* name */ + be_nested_proto( + 2, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 0, /* has constants */ + NULL, /* no const */ + be_str_weak(to_json_parameters), + &be_const_str_solidified, + ( &(const binstruction[ 1]) { /* code */ + 0x80040200, // 0000 RET 1 R1 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: read_event +********************************************************************/ +be_local_closure(Matter_Plugin_read_event, /* name */ + be_nested_proto( + 6, /* nstack */ + 5, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 0, /* has constants */ + NULL, /* no const */ + be_str_weak(read_event), + &be_const_str_solidified, + ( &(const binstruction[ 2]) { /* code */ + 0x4C140000, // 0000 LDNIL R5 + 0x80040A00, // 0001 RET 1 R5 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: to_json +********************************************************************/ +be_local_closure(Matter_Plugin_to_json, /* name */ + be_nested_proto( + 6, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 6]) { /* constants */ + /* K0 */ be_nested_str_weak(string), + /* K1 */ be_nested_str_weak(format), + /* K2 */ be_nested_str_weak(_X7B_X22type_X22_X3A_X22_X25s_X22), + /* K3 */ be_nested_str_weak(NAME), + /* K4 */ be_nested_str_weak(to_json_parameters), + /* K5 */ be_nested_str_weak(_X7D), + }), + be_str_weak(to_json), + &be_const_str_solidified, + ( &(const binstruction[11]) { /* code */ + 0xA4060000, // 0000 IMPORT R1 K0 + 0x8C080301, // 0001 GETMET R2 R1 K1 + 0x58100002, // 0002 LDCONST R4 K2 + 0x88140103, // 0003 GETMBR R5 R0 K3 + 0x7C080600, // 0004 CALL R2 3 + 0x8C0C0104, // 0005 GETMET R3 R0 K4 + 0x5C140400, // 0006 MOVE R5 R2 + 0x7C0C0400, // 0007 CALL R3 2 + 0x5C080600, // 0008 MOVE R2 R3 + 0x00080505, // 0009 ADD R2 R2 K5 + 0x80040400, // 000A RET 1 R2 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: subscribe_event +********************************************************************/ +be_local_closure(Matter_Plugin_subscribe_event, /* name */ + be_nested_proto( + 6, /* nstack */ + 5, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 0, /* has constants */ + NULL, /* no const */ + be_str_weak(subscribe_event), + &be_const_str_solidified, + ( &(const binstruction[ 2]) { /* code */ + 0x4C140000, // 0000 LDNIL R5 + 0x80040A00, // 0001 RET 1 R5 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: every_second +********************************************************************/ +be_local_closure(Matter_Plugin_every_second, /* name */ + be_nested_proto( + 3, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 1]) { /* constants */ + /* K0 */ be_nested_str_weak(update_shadow), + }), + be_str_weak(every_second), + &be_const_str_solidified, + ( &(const binstruction[ 3]) { /* code */ + 0x8C040100, // 0000 GETMET R1 R0 K0 + 0x7C040200, // 0001 CALL R1 1 + 0x80000000, // 0002 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: invoke_request +********************************************************************/ +be_local_closure(Matter_Plugin_invoke_request, /* name */ + be_nested_proto( + 5, /* nstack */ + 4, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 0, /* has constants */ + NULL, /* no const */ + be_str_weak(invoke_request), + &be_const_str_solidified, + ( &(const binstruction[ 2]) { /* code */ + 0x4C100000, // 0000 LDNIL R4 + 0x80040800, // 0001 RET 1 R4 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: parse_sensors +********************************************************************/ +be_local_closure(Matter_Plugin_parse_sensors, /* name */ + be_nested_proto( + 2, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 0, /* has constants */ + NULL, /* no const */ + be_str_weak(parse_sensors), + &be_const_str_solidified, + ( &(const binstruction[ 1]) { /* code */ + 0x80000000, // 0000 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: update_shadow +********************************************************************/ +be_local_closure(Matter_Plugin_update_shadow, /* name */ + be_nested_proto( + 1, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 0, /* has constants */ + NULL, /* no const */ + be_str_weak(update_shadow), + &be_const_str_solidified, + ( &(const binstruction[ 1]) { /* code */ + 0x80000000, // 0000 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: write_attribute +********************************************************************/ +be_local_closure(Matter_Plugin_write_attribute, /* name */ + be_nested_proto( + 5, /* nstack */ + 4, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 0, /* has constants */ + NULL, /* no const */ + be_str_weak(write_attribute), + &be_const_str_solidified, + ( &(const binstruction[ 2]) { /* code */ + 0x4C100000, // 0000 LDNIL R4 + 0x80040800, // 0001 RET 1 R4 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: init +********************************************************************/ +be_local_closure(Matter_Plugin_init, /* name */ + be_nested_proto( + 6, /* nstack */ + 4, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 4]) { /* constants */ + /* K0 */ be_nested_str_weak(device), + /* K1 */ be_nested_str_weak(endpoint), + /* K2 */ be_nested_str_weak(clusters), + /* K3 */ be_nested_str_weak(consolidate_clusters), + }), + be_str_weak(init), + &be_const_str_solidified, + ( &(const binstruction[ 6]) { /* code */ + 0x90020001, // 0000 SETMBR R0 K0 R1 + 0x90020202, // 0001 SETMBR R0 K1 R2 + 0x8C100103, // 0002 GETMET R4 R0 K3 + 0x7C100200, // 0003 CALL R4 1 + 0x90020404, // 0004 SETMBR R0 K2 R4 + 0x80000000, // 0005 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: attribute_updated +********************************************************************/ +be_local_closure(Matter_Plugin_attribute_updated, /* name */ + be_nested_proto( + 11, /* nstack */ + 5, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 3]) { /* constants */ + /* K0 */ be_nested_str_weak(endpoint), + /* K1 */ be_nested_str_weak(device), + /* K2 */ be_nested_str_weak(attribute_updated), + }), + be_str_weak(attribute_updated), + &be_const_str_solidified, + ( &(const binstruction[12]) { /* code */ + 0x4C140000, // 0000 LDNIL R5 + 0x1C140205, // 0001 EQ R5 R1 R5 + 0x78160000, // 0002 JMPF R5 #0004 + 0x88040100, // 0003 GETMBR R1 R0 K0 + 0x88140101, // 0004 GETMBR R5 R0 K1 + 0x8C140B02, // 0005 GETMET R5 R5 K2 + 0x5C1C0200, // 0006 MOVE R7 R1 + 0x5C200400, // 0007 MOVE R8 R2 + 0x5C240600, // 0008 MOVE R9 R3 + 0x5C280800, // 0009 MOVE R10 R4 + 0x7C140A00, // 000A CALL R5 5 + 0x80000000, // 000B RET 0 + }) + ) +); +/*******************************************************************/ + + /******************************************************************** ** Solidified function: read_attribute ********************************************************************/ @@ -287,244 +653,6 @@ be_local_closure(Matter_Plugin_consolidate_clusters, /* name */ /*******************************************************************/ -/******************************************************************** -** Solidified function: every_second -********************************************************************/ -be_local_closure(Matter_Plugin_every_second, /* name */ - be_nested_proto( - 3, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 1]) { /* constants */ - /* K0 */ be_nested_str_weak(update_shadow), - }), - be_str_weak(every_second), - &be_const_str_solidified, - ( &(const binstruction[ 3]) { /* code */ - 0x8C040100, // 0000 GETMET R1 R0 K0 - 0x7C040200, // 0001 CALL R1 1 - 0x80000000, // 0002 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: subscribe_attribute -********************************************************************/ -be_local_closure(Matter_Plugin_subscribe_attribute, /* name */ - be_nested_proto( - 6, /* nstack */ - 5, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 0, /* has constants */ - NULL, /* no const */ - be_str_weak(subscribe_attribute), - &be_const_str_solidified, - ( &(const binstruction[ 2]) { /* code */ - 0x4C140000, // 0000 LDNIL R5 - 0x80040A00, // 0001 RET 1 R5 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: subscribe_event -********************************************************************/ -be_local_closure(Matter_Plugin_subscribe_event, /* name */ - be_nested_proto( - 6, /* nstack */ - 5, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 0, /* has constants */ - NULL, /* no const */ - be_str_weak(subscribe_event), - &be_const_str_solidified, - ( &(const binstruction[ 2]) { /* code */ - 0x4C140000, // 0000 LDNIL R5 - 0x80040A00, // 0001 RET 1 R5 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: update_shadow -********************************************************************/ -be_local_closure(Matter_Plugin_update_shadow, /* name */ - be_nested_proto( - 1, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 0, /* has constants */ - NULL, /* no const */ - be_str_weak(update_shadow), - &be_const_str_solidified, - ( &(const binstruction[ 1]) { /* code */ - 0x80000000, // 0000 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: read_event -********************************************************************/ -be_local_closure(Matter_Plugin_read_event, /* name */ - be_nested_proto( - 6, /* nstack */ - 5, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 0, /* has constants */ - NULL, /* no const */ - be_str_weak(read_event), - &be_const_str_solidified, - ( &(const binstruction[ 2]) { /* code */ - 0x4C140000, // 0000 LDNIL R5 - 0x80040A00, // 0001 RET 1 R5 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: get_endpoint -********************************************************************/ -be_local_closure(Matter_Plugin_get_endpoint, /* name */ - be_nested_proto( - 2, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 1]) { /* constants */ - /* K0 */ be_nested_str_weak(endpoint), - }), - be_str_weak(get_endpoint), - &be_const_str_solidified, - ( &(const binstruction[ 2]) { /* code */ - 0x88040100, // 0000 GETMBR R1 R0 K0 - 0x80040200, // 0001 RET 1 R1 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: write_attribute -********************************************************************/ -be_local_closure(Matter_Plugin_write_attribute, /* name */ - be_nested_proto( - 5, /* nstack */ - 4, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 0, /* has constants */ - NULL, /* no const */ - be_str_weak(write_attribute), - &be_const_str_solidified, - ( &(const binstruction[ 2]) { /* code */ - 0x4C100000, // 0000 LDNIL R4 - 0x80040800, // 0001 RET 1 R4 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: init -********************************************************************/ -be_local_closure(Matter_Plugin_init, /* name */ - be_nested_proto( - 5, /* nstack */ - 3, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 4]) { /* constants */ - /* K0 */ be_nested_str_weak(device), - /* K1 */ be_nested_str_weak(endpoint), - /* K2 */ be_nested_str_weak(clusters), - /* K3 */ be_nested_str_weak(consolidate_clusters), - }), - be_str_weak(init), - &be_const_str_solidified, - ( &(const binstruction[ 6]) { /* code */ - 0x90020001, // 0000 SETMBR R0 K0 R1 - 0x90020202, // 0001 SETMBR R0 K1 R2 - 0x8C0C0103, // 0002 GETMET R3 R0 K3 - 0x7C0C0200, // 0003 CALL R3 1 - 0x90020403, // 0004 SETMBR R0 K2 R3 - 0x80000000, // 0005 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: timed_request -********************************************************************/ -be_local_closure(Matter_Plugin_timed_request, /* name */ - be_nested_proto( - 5, /* nstack */ - 4, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 0, /* has constants */ - NULL, /* no const */ - be_str_weak(timed_request), - &be_const_str_solidified, - ( &(const binstruction[ 2]) { /* code */ - 0x4C100000, // 0000 LDNIL R4 - 0x80040800, // 0001 RET 1 R4 - }) - ) -); -/*******************************************************************/ - - /******************************************************************** ** Solidified function: get_attribute_list ********************************************************************/ @@ -605,87 +733,24 @@ be_local_closure(Matter_Plugin_get_cluster_list, /* name */ /******************************************************************** -** Solidified function: parse_sensors +** Solidified function: subscribe_attribute ********************************************************************/ -be_local_closure(Matter_Plugin_parse_sensors, /* name */ +be_local_closure(Matter_Plugin_subscribe_attribute, /* name */ be_nested_proto( - 2, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 0, /* has constants */ - NULL, /* no const */ - be_str_weak(parse_sensors), - &be_const_str_solidified, - ( &(const binstruction[ 1]) { /* code */ - 0x80000000, // 0000 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: invoke_request -********************************************************************/ -be_local_closure(Matter_Plugin_invoke_request, /* name */ - be_nested_proto( - 5, /* nstack */ - 4, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 0, /* has constants */ - NULL, /* no const */ - be_str_weak(invoke_request), - &be_const_str_solidified, - ( &(const binstruction[ 2]) { /* code */ - 0x4C100000, // 0000 LDNIL R4 - 0x80040800, // 0001 RET 1 R4 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: attribute_updated -********************************************************************/ -be_local_closure(Matter_Plugin_attribute_updated, /* name */ - be_nested_proto( - 11, /* nstack */ + 6, /* nstack */ 5, /* argc */ 2, /* varg */ 0, /* has upvals */ NULL, /* no upvals */ 0, /* has sup protos */ NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 3]) { /* constants */ - /* K0 */ be_nested_str_weak(endpoint), - /* K1 */ be_nested_str_weak(device), - /* K2 */ be_nested_str_weak(attribute_updated), - }), - be_str_weak(attribute_updated), + 0, /* has constants */ + NULL, /* no const */ + be_str_weak(subscribe_attribute), &be_const_str_solidified, - ( &(const binstruction[12]) { /* code */ + ( &(const binstruction[ 2]) { /* code */ 0x4C140000, // 0000 LDNIL R5 - 0x1C140205, // 0001 EQ R5 R1 R5 - 0x78160000, // 0002 JMPF R5 #0004 - 0x88040100, // 0003 GETMBR R1 R0 K0 - 0x88140101, // 0004 GETMBR R5 R0 K1 - 0x8C140B02, // 0005 GETMET R5 R5 K2 - 0x5C1C0200, // 0006 MOVE R7 R1 - 0x5C200400, // 0007 MOVE R8 R2 - 0x5C240600, // 0008 MOVE R9 R3 - 0x5C280800, // 0009 MOVE R10 R4 - 0x7C140A00, // 000A CALL R5 5 - 0x80000000, // 000B RET 0 + 0x80040A00, // 0001 RET 1 R5 }) ) ); @@ -698,26 +763,31 @@ be_local_closure(Matter_Plugin_attribute_updated, /* name */ be_local_class(Matter_Plugin, 3, NULL, - be_nested_map(21, + be_nested_map(24, ( (struct bmapnode*) &(const bmapnode[]) { - { be_const_key_weak(read_attribute, -1), be_const_closure(Matter_Plugin_read_attribute_closure) }, - { be_const_key_weak(attribute_updated, 18), be_const_closure(Matter_Plugin_attribute_updated_closure) }, - { be_const_key_weak(consolidate_clusters, -1), be_const_closure(Matter_Plugin_consolidate_clusters_closure) }, - { be_const_key_weak(every_second, -1), be_const_closure(Matter_Plugin_every_second_closure) }, - { be_const_key_weak(subscribe_attribute, 1), be_const_closure(Matter_Plugin_subscribe_attribute_closure) }, - { be_const_key_weak(subscribe_event, -1), be_const_closure(Matter_Plugin_subscribe_event_closure) }, - { be_const_key_weak(device, -1), be_const_var(0) }, - { be_const_key_weak(update_shadow, 17), be_const_closure(Matter_Plugin_update_shadow_closure) }, + { be_const_key_weak(subscribe_attribute, 23), be_const_closure(Matter_Plugin_subscribe_attribute_closure) }, { be_const_key_weak(get_endpoint, -1), be_const_closure(Matter_Plugin_get_endpoint_closure) }, - { be_const_key_weak(invoke_request, -1), be_const_closure(Matter_Plugin_invoke_request_closure) }, - { be_const_key_weak(has, 8), be_const_closure(Matter_Plugin_has_closure) }, - { be_const_key_weak(parse_sensors, 13), be_const_closure(Matter_Plugin_parse_sensors_closure) }, - { be_const_key_weak(init, -1), be_const_closure(Matter_Plugin_init_closure) }, + { be_const_key_weak(timed_request, -1), be_const_closure(Matter_Plugin_timed_request_closure) }, + { be_const_key_weak(device, 21), be_const_var(0) }, + { be_const_key_weak(endpoint, 0), be_const_var(1) }, + { be_const_key_weak(get_cluster_list, 17), be_const_closure(Matter_Plugin_get_cluster_list_closure) }, + { be_const_key_weak(NAME, -1), be_nested_str_weak(generic) }, + { be_const_key_weak(to_json, 5), be_const_closure(Matter_Plugin_to_json_closure) }, { be_const_key_weak(get_attribute_list, -1), be_const_closure(Matter_Plugin_get_attribute_list_closure) }, - { be_const_key_weak(timed_request, 9), be_const_closure(Matter_Plugin_timed_request_closure) }, - { be_const_key_weak(read_event, 11), be_const_closure(Matter_Plugin_read_event_closure) }, - { be_const_key_weak(get_cluster_list, -1), be_const_closure(Matter_Plugin_get_cluster_list_closure) }, - { be_const_key_weak(CLUSTERS, 20), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { + { be_const_key_weak(every_second, 8), be_const_closure(Matter_Plugin_every_second_closure) }, + { be_const_key_weak(clusters, 22), be_const_var(2) }, + { be_const_key_weak(invoke_request, -1), be_const_closure(Matter_Plugin_invoke_request_closure) }, + { be_const_key_weak(parse_sensors, -1), be_const_closure(Matter_Plugin_parse_sensors_closure) }, + { be_const_key_weak(update_shadow, -1), be_const_closure(Matter_Plugin_update_shadow_closure) }, + { be_const_key_weak(consolidate_clusters, -1), be_const_closure(Matter_Plugin_consolidate_clusters_closure) }, + { be_const_key_weak(has, -1), be_const_closure(Matter_Plugin_has_closure) }, + { be_const_key_weak(read_attribute, -1), be_const_closure(Matter_Plugin_read_attribute_closure) }, + { be_const_key_weak(attribute_updated, -1), be_const_closure(Matter_Plugin_attribute_updated_closure) }, + { be_const_key_weak(read_event, 16), be_const_closure(Matter_Plugin_read_event_closure) }, + { be_const_key_weak(write_attribute, 15), be_const_closure(Matter_Plugin_write_attribute_closure) }, + { be_const_key_weak(subscribe_event, 14), be_const_closure(Matter_Plugin_subscribe_event_closure) }, + { be_const_key_weak(init, -1), be_const_closure(Matter_Plugin_init_closure) }, + { be_const_key_weak(CLUSTERS, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { be_const_map( * be_nested_map(1, ( (struct bmapnode*) &(const bmapnode[]) { { be_const_key_int(29, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_list, { @@ -731,9 +801,7 @@ be_local_class(Matter_Plugin, be_const_int(65533), })) ) } )) }, })) ) } )) }, - { be_const_key_weak(write_attribute, -1), be_const_closure(Matter_Plugin_write_attribute_closure) }, - { be_const_key_weak(clusters, -1), be_const_var(2) }, - { be_const_key_weak(endpoint, -1), be_const_var(1) }, + { be_const_key_weak(to_json_parameters, -1), be_const_closure(Matter_Plugin_to_json_parameters_closure) }, })), be_str_weak(Matter_Plugin) ); diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Device.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Device.h index b50a887fe..192e2f3e3 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Device.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Device.h @@ -6,86 +6,6 @@ extern const bclass be_class_Matter_Plugin_Device; -/******************************************************************** -** Solidified function: invoke_request -********************************************************************/ -be_local_closure(Matter_Plugin_Device_invoke_request, /* name */ - be_nested_proto( - 13, /* nstack */ - 4, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[11]) { /* constants */ - /* K0 */ be_nested_str_weak(matter), - /* K1 */ be_nested_str_weak(TLV), - /* K2 */ be_nested_str_weak(cluster), - /* K3 */ be_nested_str_weak(command), - /* K4 */ be_const_int(3), - /* K5 */ be_const_int(0), - /* K6 */ be_const_int(1), - /* K7 */ be_nested_str_weak(Matter_TLV_struct), - /* K8 */ be_nested_str_weak(add_TLV), - /* K9 */ be_nested_str_weak(U2), - /* K10 */ be_nested_str_weak(invoke_request), - }), - be_str_weak(invoke_request), - &be_const_str_solidified, - ( &(const binstruction[45]) { /* code */ - 0xB8120000, // 0000 GETNGBL R4 K0 - 0x88100901, // 0001 GETMBR R4 R4 K1 - 0x88140702, // 0002 GETMBR R5 R3 K2 - 0x88180703, // 0003 GETMBR R6 R3 K3 - 0x1C1C0B04, // 0004 EQ R7 R5 K4 - 0x781E0016, // 0005 JMPF R7 #001D - 0x1C1C0D05, // 0006 EQ R7 R6 K5 - 0x781E0002, // 0007 JMPF R7 #000B - 0x501C0200, // 0008 LDBOOL R7 1 0 - 0x80040E00, // 0009 RET 1 R7 - 0x70020010, // 000A JMP #001C - 0x1C1C0D06, // 000B EQ R7 R6 K6 - 0x781E0009, // 000C JMPF R7 #0017 - 0x8C1C0907, // 000D GETMET R7 R4 K7 - 0x7C1C0200, // 000E CALL R7 1 - 0x8C200F08, // 000F GETMET R8 R7 K8 - 0x58280005, // 0010 LDCONST R10 K5 - 0x882C0909, // 0011 GETMBR R11 R4 K9 - 0x58300005, // 0012 LDCONST R12 K5 - 0x7C200800, // 0013 CALL R8 4 - 0x900E0705, // 0014 SETMBR R3 K3 K5 - 0x80040E00, // 0015 RET 1 R7 - 0x70020004, // 0016 JMP #001C - 0x541E003F, // 0017 LDINT R7 64 - 0x1C1C0C07, // 0018 EQ R7 R6 R7 - 0x781E0001, // 0019 JMPF R7 #001C - 0x501C0200, // 001A LDBOOL R7 1 0 - 0x80040E00, // 001B RET 1 R7 - 0x7002000E, // 001C JMP #002C - 0x541E0003, // 001D LDINT R7 4 - 0x1C1C0A07, // 001E EQ R7 R5 R7 - 0x781E0002, // 001F JMPF R7 #0023 - 0x501C0200, // 0020 LDBOOL R7 1 0 - 0x80040E00, // 0021 RET 1 R7 - 0x70020008, // 0022 JMP #002C - 0x601C0003, // 0023 GETGBL R7 G3 - 0x5C200000, // 0024 MOVE R8 R0 - 0x7C1C0200, // 0025 CALL R7 1 - 0x8C1C0F0A, // 0026 GETMET R7 R7 K10 - 0x5C240200, // 0027 MOVE R9 R1 - 0x5C280400, // 0028 MOVE R10 R2 - 0x5C2C0600, // 0029 MOVE R11 R3 - 0x7C1C0800, // 002A CALL R7 4 - 0x80040E00, // 002B RET 1 R7 - 0x80000000, // 002C RET 0 - }) - ) -); -/*******************************************************************/ - - /******************************************************************** ** Solidified function: read_attribute ********************************************************************/ @@ -200,11 +120,11 @@ be_local_closure(Matter_Plugin_Device_read_attribute, /* name */ /******************************************************************** -** Solidified function: init +** Solidified function: invoke_request ********************************************************************/ -be_local_closure(Matter_Plugin_Device_init, /* name */ +be_local_closure(Matter_Plugin_Device_invoke_request, /* name */ be_nested_proto( - 8, /* nstack */ + 13, /* nstack */ 4, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -212,20 +132,67 @@ be_local_closure(Matter_Plugin_Device_init, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[ 1]) { /* constants */ - /* K0 */ be_nested_str_weak(init), + ( &(const bvalue[11]) { /* constants */ + /* K0 */ be_nested_str_weak(matter), + /* K1 */ be_nested_str_weak(TLV), + /* K2 */ be_nested_str_weak(cluster), + /* K3 */ be_nested_str_weak(command), + /* K4 */ be_const_int(3), + /* K5 */ be_const_int(0), + /* K6 */ be_const_int(1), + /* K7 */ be_nested_str_weak(Matter_TLV_struct), + /* K8 */ be_nested_str_weak(add_TLV), + /* K9 */ be_nested_str_weak(U2), + /* K10 */ be_nested_str_weak(invoke_request), }), - be_str_weak(init), + be_str_weak(invoke_request), &be_const_str_solidified, - ( &(const binstruction[ 8]) { /* code */ - 0x60100003, // 0000 GETGBL R4 G3 - 0x5C140000, // 0001 MOVE R5 R0 - 0x7C100200, // 0002 CALL R4 1 - 0x8C100900, // 0003 GETMET R4 R4 K0 - 0x5C180200, // 0004 MOVE R6 R1 - 0x5C1C0400, // 0005 MOVE R7 R2 - 0x7C100600, // 0006 CALL R4 3 - 0x80000000, // 0007 RET 0 + ( &(const binstruction[45]) { /* code */ + 0xB8120000, // 0000 GETNGBL R4 K0 + 0x88100901, // 0001 GETMBR R4 R4 K1 + 0x88140702, // 0002 GETMBR R5 R3 K2 + 0x88180703, // 0003 GETMBR R6 R3 K3 + 0x1C1C0B04, // 0004 EQ R7 R5 K4 + 0x781E0016, // 0005 JMPF R7 #001D + 0x1C1C0D05, // 0006 EQ R7 R6 K5 + 0x781E0002, // 0007 JMPF R7 #000B + 0x501C0200, // 0008 LDBOOL R7 1 0 + 0x80040E00, // 0009 RET 1 R7 + 0x70020010, // 000A JMP #001C + 0x1C1C0D06, // 000B EQ R7 R6 K6 + 0x781E0009, // 000C JMPF R7 #0017 + 0x8C1C0907, // 000D GETMET R7 R4 K7 + 0x7C1C0200, // 000E CALL R7 1 + 0x8C200F08, // 000F GETMET R8 R7 K8 + 0x58280005, // 0010 LDCONST R10 K5 + 0x882C0909, // 0011 GETMBR R11 R4 K9 + 0x58300005, // 0012 LDCONST R12 K5 + 0x7C200800, // 0013 CALL R8 4 + 0x900E0705, // 0014 SETMBR R3 K3 K5 + 0x80040E00, // 0015 RET 1 R7 + 0x70020004, // 0016 JMP #001C + 0x541E003F, // 0017 LDINT R7 64 + 0x1C1C0C07, // 0018 EQ R7 R6 R7 + 0x781E0001, // 0019 JMPF R7 #001C + 0x501C0200, // 001A LDBOOL R7 1 0 + 0x80040E00, // 001B RET 1 R7 + 0x7002000E, // 001C JMP #002C + 0x541E0003, // 001D LDINT R7 4 + 0x1C1C0A07, // 001E EQ R7 R5 R7 + 0x781E0002, // 001F JMPF R7 #0023 + 0x501C0200, // 0020 LDBOOL R7 1 0 + 0x80040E00, // 0021 RET 1 R7 + 0x70020008, // 0022 JMP #002C + 0x601C0003, // 0023 GETGBL R7 G3 + 0x5C200000, // 0024 MOVE R8 R0 + 0x7C1C0200, // 0025 CALL R7 1 + 0x8C1C0F0A, // 0026 GETMET R7 R7 K10 + 0x5C240200, // 0027 MOVE R9 R1 + 0x5C280400, // 0028 MOVE R10 R2 + 0x5C2C0600, // 0029 MOVE R11 R3 + 0x7C1C0800, // 002A CALL R7 4 + 0x80040E00, // 002B RET 1 R7 + 0x80000000, // 002C RET 0 }) ) ); @@ -239,16 +206,8 @@ extern const bclass be_class_Matter_Plugin; be_local_class(Matter_Plugin_Device, 0, &be_class_Matter_Plugin, - be_nested_map(5, + be_nested_map(4, ( (struct bmapnode*) &(const bmapnode[]) { - { be_const_key_weak(TYPES, 3), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { - be_const_map( * be_nested_map(1, - ( (struct bmapnode*) &(const bmapnode[]) { - { be_const_key_int(0, -1), be_const_int(0) }, - })) ) } )) }, - { be_const_key_weak(read_attribute, -1), be_const_closure(Matter_Plugin_Device_read_attribute_closure) }, - { be_const_key_weak(invoke_request, 1), be_const_closure(Matter_Plugin_Device_invoke_request_closure) }, - { be_const_key_weak(init, -1), be_const_closure(Matter_Plugin_Device_init_closure) }, { be_const_key_weak(CLUSTERS, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { be_const_map( * be_nested_map(2, ( (struct bmapnode*) &(const bmapnode[]) { @@ -268,6 +227,13 @@ be_local_class(Matter_Plugin_Device, be_const_int(65533), })) ) } )) }, })) ) } )) }, + { be_const_key_weak(TYPES, 0), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { + be_const_map( * be_nested_map(1, + ( (struct bmapnode*) &(const bmapnode[]) { + { be_const_key_int(0, -1), be_const_int(0) }, + })) ) } )) }, + { be_const_key_weak(read_attribute, 1), be_const_closure(Matter_Plugin_Device_read_attribute_closure) }, + { be_const_key_weak(invoke_request, -1), be_const_closure(Matter_Plugin_Device_invoke_request_closure) }, })), be_str_weak(Matter_Plugin_Device) ); diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Light0.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Light0.h index 40809e95f..d2eab2b66 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Light0.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Light0.h @@ -6,6 +6,133 @@ extern const bclass be_class_Matter_Plugin_Light0; +/******************************************************************** +** Solidified function: invoke_request +********************************************************************/ +be_local_closure(Matter_Plugin_Light0_invoke_request, /* name */ + be_nested_proto( + 14, /* nstack */ + 4, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[16]) { /* constants */ + /* K0 */ be_nested_str_weak(light), + /* K1 */ be_nested_str_weak(matter), + /* K2 */ be_nested_str_weak(TLV), + /* K3 */ be_nested_str_weak(cluster), + /* K4 */ be_nested_str_weak(command), + /* K5 */ be_const_int(3), + /* K6 */ be_const_int(0), + /* K7 */ be_const_int(1), + /* K8 */ be_nested_str_weak(Matter_TLV_struct), + /* K9 */ be_nested_str_weak(add_TLV), + /* K10 */ be_nested_str_weak(U2), + /* K11 */ be_nested_str_weak(set), + /* K12 */ be_nested_str_weak(power), + /* K13 */ be_nested_str_weak(update_shadow), + /* K14 */ be_const_int(2), + /* K15 */ be_nested_str_weak(shadow_onoff), + }), + be_str_weak(invoke_request), + &be_const_str_solidified, + ( &(const binstruction[87]) { /* code */ + 0xA4120000, // 0000 IMPORT R4 K0 + 0xB8160200, // 0001 GETNGBL R5 K1 + 0x88140B02, // 0002 GETMBR R5 R5 K2 + 0x88180703, // 0003 GETMBR R6 R3 K3 + 0x881C0704, // 0004 GETMBR R7 R3 K4 + 0x1C200D05, // 0005 EQ R8 R6 K5 + 0x78220016, // 0006 JMPF R8 #001E + 0x1C200F06, // 0007 EQ R8 R7 K6 + 0x78220002, // 0008 JMPF R8 #000C + 0x50200200, // 0009 LDBOOL R8 1 0 + 0x80041000, // 000A RET 1 R8 + 0x70020010, // 000B JMP #001D + 0x1C200F07, // 000C EQ R8 R7 K7 + 0x78220009, // 000D JMPF R8 #0018 + 0x8C200B08, // 000E GETMET R8 R5 K8 + 0x7C200200, // 000F CALL R8 1 + 0x8C241109, // 0010 GETMET R9 R8 K9 + 0x582C0006, // 0011 LDCONST R11 K6 + 0x88300B0A, // 0012 GETMBR R12 R5 K10 + 0x58340006, // 0013 LDCONST R13 K6 + 0x7C240800, // 0014 CALL R9 4 + 0x900E0906, // 0015 SETMBR R3 K4 K6 + 0x80041000, // 0016 RET 1 R8 + 0x70020004, // 0017 JMP #001D + 0x5422003F, // 0018 LDINT R8 64 + 0x1C200E08, // 0019 EQ R8 R7 R8 + 0x78220001, // 001A JMPF R8 #001D + 0x50200200, // 001B LDBOOL R8 1 0 + 0x80041000, // 001C RET 1 R8 + 0x70020037, // 001D JMP #0056 + 0x54220003, // 001E LDINT R8 4 + 0x1C200C08, // 001F EQ R8 R6 R8 + 0x78220002, // 0020 JMPF R8 #0024 + 0x50200200, // 0021 LDBOOL R8 1 0 + 0x80041000, // 0022 RET 1 R8 + 0x70020031, // 0023 JMP #0056 + 0x54220004, // 0024 LDINT R8 5 + 0x1C200C08, // 0025 EQ R8 R6 R8 + 0x78220002, // 0026 JMPF R8 #002A + 0x50200200, // 0027 LDBOOL R8 1 0 + 0x80041000, // 0028 RET 1 R8 + 0x7002002B, // 0029 JMP #0056 + 0x54220005, // 002A LDINT R8 6 + 0x1C200C08, // 002B EQ R8 R6 R8 + 0x78220028, // 002C JMPF R8 #0056 + 0x1C200F06, // 002D EQ R8 R7 K6 + 0x7822000A, // 002E JMPF R8 #003A + 0x8C20090B, // 002F GETMET R8 R4 K11 + 0x60280013, // 0030 GETGBL R10 G19 + 0x7C280000, // 0031 CALL R10 0 + 0x502C0000, // 0032 LDBOOL R11 0 0 + 0x982A180B, // 0033 SETIDX R10 K12 R11 + 0x7C200400, // 0034 CALL R8 2 + 0x8C20010D, // 0035 GETMET R8 R0 K13 + 0x7C200200, // 0036 CALL R8 1 + 0x50200200, // 0037 LDBOOL R8 1 0 + 0x80041000, // 0038 RET 1 R8 + 0x7002001B, // 0039 JMP #0056 + 0x1C200F07, // 003A EQ R8 R7 K7 + 0x7822000A, // 003B JMPF R8 #0047 + 0x8C20090B, // 003C GETMET R8 R4 K11 + 0x60280013, // 003D GETGBL R10 G19 + 0x7C280000, // 003E CALL R10 0 + 0x502C0200, // 003F LDBOOL R11 1 0 + 0x982A180B, // 0040 SETIDX R10 K12 R11 + 0x7C200400, // 0041 CALL R8 2 + 0x8C20010D, // 0042 GETMET R8 R0 K13 + 0x7C200200, // 0043 CALL R8 1 + 0x50200200, // 0044 LDBOOL R8 1 0 + 0x80041000, // 0045 RET 1 R8 + 0x7002000E, // 0046 JMP #0056 + 0x1C200F0E, // 0047 EQ R8 R7 K14 + 0x7822000C, // 0048 JMPF R8 #0056 + 0x8C20090B, // 0049 GETMET R8 R4 K11 + 0x60280013, // 004A GETGBL R10 G19 + 0x7C280000, // 004B CALL R10 0 + 0x882C010F, // 004C GETMBR R11 R0 K15 + 0x782E0000, // 004D JMPF R11 #004F + 0x502C0001, // 004E LDBOOL R11 0 1 + 0x502C0200, // 004F LDBOOL R11 1 0 + 0x982A180B, // 0050 SETIDX R10 K12 R11 + 0x7C200400, // 0051 CALL R8 2 + 0x8C20010D, // 0052 GETMET R8 R0 K13 + 0x7C200200, // 0053 CALL R8 1 + 0x50200200, // 0054 LDBOOL R8 1 0 + 0x80041000, // 0055 RET 1 R8 + 0x80000000, // 0056 RET 0 + }) + ) +); +/*******************************************************************/ + + /******************************************************************** ** Solidified function: read_attribute ********************************************************************/ @@ -219,140 +346,13 @@ be_local_closure(Matter_Plugin_Light0_update_shadow, /* name */ /*******************************************************************/ -/******************************************************************** -** Solidified function: invoke_request -********************************************************************/ -be_local_closure(Matter_Plugin_Light0_invoke_request, /* name */ - be_nested_proto( - 14, /* nstack */ - 4, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[16]) { /* constants */ - /* K0 */ be_nested_str_weak(light), - /* K1 */ be_nested_str_weak(matter), - /* K2 */ be_nested_str_weak(TLV), - /* K3 */ be_nested_str_weak(cluster), - /* K4 */ be_nested_str_weak(command), - /* K5 */ be_const_int(3), - /* K6 */ be_const_int(0), - /* K7 */ be_const_int(1), - /* K8 */ be_nested_str_weak(Matter_TLV_struct), - /* K9 */ be_nested_str_weak(add_TLV), - /* K10 */ be_nested_str_weak(U2), - /* K11 */ be_nested_str_weak(set), - /* K12 */ be_nested_str_weak(power), - /* K13 */ be_nested_str_weak(update_shadow), - /* K14 */ be_const_int(2), - /* K15 */ be_nested_str_weak(shadow_onoff), - }), - be_str_weak(invoke_request), - &be_const_str_solidified, - ( &(const binstruction[87]) { /* code */ - 0xA4120000, // 0000 IMPORT R4 K0 - 0xB8160200, // 0001 GETNGBL R5 K1 - 0x88140B02, // 0002 GETMBR R5 R5 K2 - 0x88180703, // 0003 GETMBR R6 R3 K3 - 0x881C0704, // 0004 GETMBR R7 R3 K4 - 0x1C200D05, // 0005 EQ R8 R6 K5 - 0x78220016, // 0006 JMPF R8 #001E - 0x1C200F06, // 0007 EQ R8 R7 K6 - 0x78220002, // 0008 JMPF R8 #000C - 0x50200200, // 0009 LDBOOL R8 1 0 - 0x80041000, // 000A RET 1 R8 - 0x70020010, // 000B JMP #001D - 0x1C200F07, // 000C EQ R8 R7 K7 - 0x78220009, // 000D JMPF R8 #0018 - 0x8C200B08, // 000E GETMET R8 R5 K8 - 0x7C200200, // 000F CALL R8 1 - 0x8C241109, // 0010 GETMET R9 R8 K9 - 0x582C0006, // 0011 LDCONST R11 K6 - 0x88300B0A, // 0012 GETMBR R12 R5 K10 - 0x58340006, // 0013 LDCONST R13 K6 - 0x7C240800, // 0014 CALL R9 4 - 0x900E0906, // 0015 SETMBR R3 K4 K6 - 0x80041000, // 0016 RET 1 R8 - 0x70020004, // 0017 JMP #001D - 0x5422003F, // 0018 LDINT R8 64 - 0x1C200E08, // 0019 EQ R8 R7 R8 - 0x78220001, // 001A JMPF R8 #001D - 0x50200200, // 001B LDBOOL R8 1 0 - 0x80041000, // 001C RET 1 R8 - 0x70020037, // 001D JMP #0056 - 0x54220003, // 001E LDINT R8 4 - 0x1C200C08, // 001F EQ R8 R6 R8 - 0x78220002, // 0020 JMPF R8 #0024 - 0x50200200, // 0021 LDBOOL R8 1 0 - 0x80041000, // 0022 RET 1 R8 - 0x70020031, // 0023 JMP #0056 - 0x54220004, // 0024 LDINT R8 5 - 0x1C200C08, // 0025 EQ R8 R6 R8 - 0x78220002, // 0026 JMPF R8 #002A - 0x50200200, // 0027 LDBOOL R8 1 0 - 0x80041000, // 0028 RET 1 R8 - 0x7002002B, // 0029 JMP #0056 - 0x54220005, // 002A LDINT R8 6 - 0x1C200C08, // 002B EQ R8 R6 R8 - 0x78220028, // 002C JMPF R8 #0056 - 0x1C200F06, // 002D EQ R8 R7 K6 - 0x7822000A, // 002E JMPF R8 #003A - 0x8C20090B, // 002F GETMET R8 R4 K11 - 0x60280013, // 0030 GETGBL R10 G19 - 0x7C280000, // 0031 CALL R10 0 - 0x502C0000, // 0032 LDBOOL R11 0 0 - 0x982A180B, // 0033 SETIDX R10 K12 R11 - 0x7C200400, // 0034 CALL R8 2 - 0x8C20010D, // 0035 GETMET R8 R0 K13 - 0x7C200200, // 0036 CALL R8 1 - 0x50200200, // 0037 LDBOOL R8 1 0 - 0x80041000, // 0038 RET 1 R8 - 0x7002001B, // 0039 JMP #0056 - 0x1C200F07, // 003A EQ R8 R7 K7 - 0x7822000A, // 003B JMPF R8 #0047 - 0x8C20090B, // 003C GETMET R8 R4 K11 - 0x60280013, // 003D GETGBL R10 G19 - 0x7C280000, // 003E CALL R10 0 - 0x502C0200, // 003F LDBOOL R11 1 0 - 0x982A180B, // 0040 SETIDX R10 K12 R11 - 0x7C200400, // 0041 CALL R8 2 - 0x8C20010D, // 0042 GETMET R8 R0 K13 - 0x7C200200, // 0043 CALL R8 1 - 0x50200200, // 0044 LDBOOL R8 1 0 - 0x80041000, // 0045 RET 1 R8 - 0x7002000E, // 0046 JMP #0056 - 0x1C200F0E, // 0047 EQ R8 R7 K14 - 0x7822000C, // 0048 JMPF R8 #0056 - 0x8C20090B, // 0049 GETMET R8 R4 K11 - 0x60280013, // 004A GETGBL R10 G19 - 0x7C280000, // 004B CALL R10 0 - 0x882C010F, // 004C GETMBR R11 R0 K15 - 0x782E0000, // 004D JMPF R11 #004F - 0x502C0001, // 004E LDBOOL R11 0 1 - 0x502C0200, // 004F LDBOOL R11 1 0 - 0x982A180B, // 0050 SETIDX R10 K12 R11 - 0x7C200400, // 0051 CALL R8 2 - 0x8C20010D, // 0052 GETMET R8 R0 K13 - 0x7C200200, // 0053 CALL R8 1 - 0x50200200, // 0054 LDBOOL R8 1 0 - 0x80041000, // 0055 RET 1 R8 - 0x80000000, // 0056 RET 0 - }) - ) -); -/*******************************************************************/ - - /******************************************************************** ** Solidified function: init ********************************************************************/ be_local_closure(Matter_Plugin_Light0_init, /* name */ be_nested_proto( - 7, /* nstack */ - 3, /* argc */ + 9, /* nstack */ + 4, /* argc */ 2, /* varg */ 0, /* has upvals */ NULL, /* no upvals */ @@ -365,17 +365,18 @@ be_local_closure(Matter_Plugin_Light0_init, /* name */ }), be_str_weak(init), &be_const_str_solidified, - ( &(const binstruction[10]) { /* code */ - 0x600C0003, // 0000 GETGBL R3 G3 - 0x5C100000, // 0001 MOVE R4 R0 - 0x7C0C0200, // 0002 CALL R3 1 - 0x8C0C0700, // 0003 GETMET R3 R3 K0 - 0x5C140200, // 0004 MOVE R5 R1 - 0x5C180400, // 0005 MOVE R6 R2 - 0x7C0C0600, // 0006 CALL R3 3 - 0x500C0000, // 0007 LDBOOL R3 0 0 - 0x90020203, // 0008 SETMBR R0 K1 R3 - 0x80000000, // 0009 RET 0 + ( &(const binstruction[11]) { /* code */ + 0x60100003, // 0000 GETGBL R4 G3 + 0x5C140000, // 0001 MOVE R5 R0 + 0x7C100200, // 0002 CALL R4 1 + 0x8C100900, // 0003 GETMET R4 R4 K0 + 0x5C180200, // 0004 MOVE R6 R1 + 0x5C1C0400, // 0005 MOVE R7 R2 + 0x5C200600, // 0006 MOVE R8 R3 + 0x7C100800, // 0007 CALL R4 4 + 0x50100000, // 0008 LDBOOL R4 0 0 + 0x90020204, // 0009 SETMBR R0 K1 R4 + 0x80000000, // 000A RET 0 }) ) ); @@ -389,11 +390,11 @@ extern const bclass be_class_Matter_Plugin; be_local_class(Matter_Plugin_Light0, 1, &be_class_Matter_Plugin, - be_nested_map(7, + be_nested_map(8, ( (struct bmapnode*) &(const bmapnode[]) { - { be_const_key_weak(read_attribute, 4), be_const_closure(Matter_Plugin_Light0_read_attribute_closure) }, - { be_const_key_weak(update_shadow, -1), be_const_closure(Matter_Plugin_Light0_update_shadow_closure) }, - { be_const_key_weak(CLUSTERS, 1), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { + { be_const_key_weak(shadow_onoff, -1), be_const_var(0) }, + { be_const_key_weak(init, -1), be_const_closure(Matter_Plugin_Light0_init_closure) }, + { be_const_key_weak(CLUSTERS, 4), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { be_const_map( * be_nested_map(4, ( (struct bmapnode*) &(const bmapnode[]) { { be_const_key_int(4, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_list, { @@ -431,14 +432,15 @@ be_local_class(Matter_Plugin_Light0, be_const_int(65533), })) ) } )) }, })) ) } )) }, + { be_const_key_weak(invoke_request, 1), be_const_closure(Matter_Plugin_Light0_invoke_request_closure) }, + { be_const_key_weak(read_attribute, 7), be_const_closure(Matter_Plugin_Light0_read_attribute_closure) }, + { be_const_key_weak(update_shadow, -1), be_const_closure(Matter_Plugin_Light0_update_shadow_closure) }, + { be_const_key_weak(NAME, -1), be_nested_str_weak(light0) }, { be_const_key_weak(TYPES, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { be_const_map( * be_nested_map(1, ( (struct bmapnode*) &(const bmapnode[]) { { be_const_key_int(256, -1), be_const_int(2) }, })) ) } )) }, - { be_const_key_weak(invoke_request, 2), be_const_closure(Matter_Plugin_Light0_invoke_request_closure) }, - { be_const_key_weak(init, -1), be_const_closure(Matter_Plugin_Light0_init_closure) }, - { be_const_key_weak(shadow_onoff, -1), be_const_var(0) }, })), be_str_weak(Matter_Plugin_Light0) ); diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Light1.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Light1.h index b19758c0f..54d712ba6 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Light1.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Light1.h @@ -6,6 +6,158 @@ extern const bclass be_class_Matter_Plugin_Light1; +/******************************************************************** +** Solidified function: init +********************************************************************/ +be_local_closure(Matter_Plugin_Light1_init, /* name */ + be_nested_proto( + 9, /* nstack */ + 4, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 3]) { /* constants */ + /* K0 */ be_nested_str_weak(init), + /* K1 */ be_nested_str_weak(shadow_bri), + /* K2 */ be_const_int(0), + }), + be_str_weak(init), + &be_const_str_solidified, + ( &(const binstruction[10]) { /* code */ + 0x60100003, // 0000 GETGBL R4 G3 + 0x5C140000, // 0001 MOVE R5 R0 + 0x7C100200, // 0002 CALL R4 1 + 0x8C100900, // 0003 GETMET R4 R4 K0 + 0x5C180200, // 0004 MOVE R6 R1 + 0x5C1C0400, // 0005 MOVE R7 R2 + 0x5C200600, // 0006 MOVE R8 R3 + 0x7C100800, // 0007 CALL R4 4 + 0x90020302, // 0008 SETMBR R0 K1 K2 + 0x80000000, // 0009 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: read_attribute +********************************************************************/ +be_local_closure(Matter_Plugin_Light1_read_attribute, /* name */ + be_nested_proto( + 11, /* nstack */ + 3, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[14]) { /* constants */ + /* K0 */ be_nested_str_weak(string), + /* K1 */ be_nested_str_weak(matter), + /* K2 */ be_nested_str_weak(TLV), + /* K3 */ be_nested_str_weak(cluster), + /* K4 */ be_nested_str_weak(attribute), + /* K5 */ be_const_int(0), + /* K6 */ be_nested_str_weak(create_TLV), + /* K7 */ be_nested_str_weak(U1), + /* K8 */ be_nested_str_weak(shadow_bri), + /* K9 */ be_const_int(2), + /* K10 */ be_const_int(3), + /* K11 */ be_nested_str_weak(U4), + /* K12 */ be_const_int(1), + /* K13 */ be_nested_str_weak(read_attribute), + }), + be_str_weak(read_attribute), + &be_const_str_solidified, + ( &(const binstruction[77]) { /* code */ + 0xA40E0000, // 0000 IMPORT R3 K0 + 0xB8120200, // 0001 GETNGBL R4 K1 + 0x88100902, // 0002 GETMBR R4 R4 K2 + 0x88140503, // 0003 GETMBR R5 R2 K3 + 0x88180504, // 0004 GETMBR R6 R2 K4 + 0x541E0007, // 0005 LDINT R7 8 + 0x1C1C0A07, // 0006 EQ R7 R5 R7 + 0x781E003B, // 0007 JMPF R7 #0044 + 0x1C1C0D05, // 0008 EQ R7 R6 K5 + 0x781E0005, // 0009 JMPF R7 #0010 + 0x8C1C0906, // 000A GETMET R7 R4 K6 + 0x88240907, // 000B GETMBR R9 R4 K7 + 0x88280108, // 000C GETMBR R10 R0 K8 + 0x7C1C0600, // 000D CALL R7 3 + 0x80040E00, // 000E RET 1 R7 + 0x70020032, // 000F JMP #0043 + 0x1C1C0D09, // 0010 EQ R7 R6 K9 + 0x781E0005, // 0011 JMPF R7 #0018 + 0x8C1C0906, // 0012 GETMET R7 R4 K6 + 0x88240907, // 0013 GETMBR R9 R4 K7 + 0x58280005, // 0014 LDCONST R10 K5 + 0x7C1C0600, // 0015 CALL R7 3 + 0x80040E00, // 0016 RET 1 R7 + 0x7002002A, // 0017 JMP #0043 + 0x1C1C0D0A, // 0018 EQ R7 R6 K10 + 0x781E0005, // 0019 JMPF R7 #0020 + 0x8C1C0906, // 001A GETMET R7 R4 K6 + 0x88240907, // 001B GETMBR R9 R4 K7 + 0x542A00FD, // 001C LDINT R10 254 + 0x7C1C0600, // 001D CALL R7 3 + 0x80040E00, // 001E RET 1 R7 + 0x70020022, // 001F JMP #0043 + 0x541E000E, // 0020 LDINT R7 15 + 0x1C1C0C07, // 0021 EQ R7 R6 R7 + 0x781E0005, // 0022 JMPF R7 #0029 + 0x8C1C0906, // 0023 GETMET R7 R4 K6 + 0x88240907, // 0024 GETMBR R9 R4 K7 + 0x58280005, // 0025 LDCONST R10 K5 + 0x7C1C0600, // 0026 CALL R7 3 + 0x80040E00, // 0027 RET 1 R7 + 0x70020019, // 0028 JMP #0043 + 0x541E0010, // 0029 LDINT R7 17 + 0x1C1C0C07, // 002A EQ R7 R6 R7 + 0x781E0005, // 002B JMPF R7 #0032 + 0x8C1C0906, // 002C GETMET R7 R4 K6 + 0x88240907, // 002D GETMBR R9 R4 K7 + 0x88280108, // 002E GETMBR R10 R0 K8 + 0x7C1C0600, // 002F CALL R7 3 + 0x80040E00, // 0030 RET 1 R7 + 0x70020010, // 0031 JMP #0043 + 0x541EFFFB, // 0032 LDINT R7 65532 + 0x1C1C0C07, // 0033 EQ R7 R6 R7 + 0x781E0005, // 0034 JMPF R7 #003B + 0x8C1C0906, // 0035 GETMET R7 R4 K6 + 0x8824090B, // 0036 GETMBR R9 R4 K11 + 0x5828000C, // 0037 LDCONST R10 K12 + 0x7C1C0600, // 0038 CALL R7 3 + 0x80040E00, // 0039 RET 1 R7 + 0x70020007, // 003A JMP #0043 + 0x541EFFFC, // 003B LDINT R7 65533 + 0x1C1C0C07, // 003C EQ R7 R6 R7 + 0x781E0004, // 003D JMPF R7 #0043 + 0x8C1C0906, // 003E GETMET R7 R4 K6 + 0x8824090B, // 003F GETMBR R9 R4 K11 + 0x542A0004, // 0040 LDINT R10 5 + 0x7C1C0600, // 0041 CALL R7 3 + 0x80040E00, // 0042 RET 1 R7 + 0x70020007, // 0043 JMP #004C + 0x601C0003, // 0044 GETGBL R7 G3 + 0x5C200000, // 0045 MOVE R8 R0 + 0x7C1C0200, // 0046 CALL R7 1 + 0x8C1C0F0D, // 0047 GETMET R7 R7 K13 + 0x5C240200, // 0048 MOVE R9 R1 + 0x5C280400, // 0049 MOVE R10 R2 + 0x7C1C0600, // 004A CALL R7 3 + 0x80040E00, // 004B RET 1 R7 + 0x80000000, // 004C RET 0 + }) + ) +); +/*******************************************************************/ + + /******************************************************************** ** Solidified function: invoke_request ********************************************************************/ @@ -229,157 +381,6 @@ be_local_closure(Matter_Plugin_Light1_update_shadow, /* name */ /*******************************************************************/ -/******************************************************************** -** Solidified function: init -********************************************************************/ -be_local_closure(Matter_Plugin_Light1_init, /* name */ - be_nested_proto( - 7, /* nstack */ - 3, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 3]) { /* constants */ - /* K0 */ be_nested_str_weak(init), - /* K1 */ be_nested_str_weak(shadow_bri), - /* K2 */ be_const_int(0), - }), - be_str_weak(init), - &be_const_str_solidified, - ( &(const binstruction[ 9]) { /* code */ - 0x600C0003, // 0000 GETGBL R3 G3 - 0x5C100000, // 0001 MOVE R4 R0 - 0x7C0C0200, // 0002 CALL R3 1 - 0x8C0C0700, // 0003 GETMET R3 R3 K0 - 0x5C140200, // 0004 MOVE R5 R1 - 0x5C180400, // 0005 MOVE R6 R2 - 0x7C0C0600, // 0006 CALL R3 3 - 0x90020302, // 0007 SETMBR R0 K1 K2 - 0x80000000, // 0008 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: read_attribute -********************************************************************/ -be_local_closure(Matter_Plugin_Light1_read_attribute, /* name */ - be_nested_proto( - 11, /* nstack */ - 3, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[14]) { /* constants */ - /* K0 */ be_nested_str_weak(string), - /* K1 */ be_nested_str_weak(matter), - /* K2 */ be_nested_str_weak(TLV), - /* K3 */ be_nested_str_weak(cluster), - /* K4 */ be_nested_str_weak(attribute), - /* K5 */ be_const_int(0), - /* K6 */ be_nested_str_weak(create_TLV), - /* K7 */ be_nested_str_weak(U1), - /* K8 */ be_nested_str_weak(shadow_bri), - /* K9 */ be_const_int(2), - /* K10 */ be_const_int(3), - /* K11 */ be_nested_str_weak(U4), - /* K12 */ be_const_int(1), - /* K13 */ be_nested_str_weak(read_attribute), - }), - be_str_weak(read_attribute), - &be_const_str_solidified, - ( &(const binstruction[77]) { /* code */ - 0xA40E0000, // 0000 IMPORT R3 K0 - 0xB8120200, // 0001 GETNGBL R4 K1 - 0x88100902, // 0002 GETMBR R4 R4 K2 - 0x88140503, // 0003 GETMBR R5 R2 K3 - 0x88180504, // 0004 GETMBR R6 R2 K4 - 0x541E0007, // 0005 LDINT R7 8 - 0x1C1C0A07, // 0006 EQ R7 R5 R7 - 0x781E003B, // 0007 JMPF R7 #0044 - 0x1C1C0D05, // 0008 EQ R7 R6 K5 - 0x781E0005, // 0009 JMPF R7 #0010 - 0x8C1C0906, // 000A GETMET R7 R4 K6 - 0x88240907, // 000B GETMBR R9 R4 K7 - 0x88280108, // 000C GETMBR R10 R0 K8 - 0x7C1C0600, // 000D CALL R7 3 - 0x80040E00, // 000E RET 1 R7 - 0x70020032, // 000F JMP #0043 - 0x1C1C0D09, // 0010 EQ R7 R6 K9 - 0x781E0005, // 0011 JMPF R7 #0018 - 0x8C1C0906, // 0012 GETMET R7 R4 K6 - 0x88240907, // 0013 GETMBR R9 R4 K7 - 0x58280005, // 0014 LDCONST R10 K5 - 0x7C1C0600, // 0015 CALL R7 3 - 0x80040E00, // 0016 RET 1 R7 - 0x7002002A, // 0017 JMP #0043 - 0x1C1C0D0A, // 0018 EQ R7 R6 K10 - 0x781E0005, // 0019 JMPF R7 #0020 - 0x8C1C0906, // 001A GETMET R7 R4 K6 - 0x88240907, // 001B GETMBR R9 R4 K7 - 0x542A00FD, // 001C LDINT R10 254 - 0x7C1C0600, // 001D CALL R7 3 - 0x80040E00, // 001E RET 1 R7 - 0x70020022, // 001F JMP #0043 - 0x541E000E, // 0020 LDINT R7 15 - 0x1C1C0C07, // 0021 EQ R7 R6 R7 - 0x781E0005, // 0022 JMPF R7 #0029 - 0x8C1C0906, // 0023 GETMET R7 R4 K6 - 0x88240907, // 0024 GETMBR R9 R4 K7 - 0x58280005, // 0025 LDCONST R10 K5 - 0x7C1C0600, // 0026 CALL R7 3 - 0x80040E00, // 0027 RET 1 R7 - 0x70020019, // 0028 JMP #0043 - 0x541E0010, // 0029 LDINT R7 17 - 0x1C1C0C07, // 002A EQ R7 R6 R7 - 0x781E0005, // 002B JMPF R7 #0032 - 0x8C1C0906, // 002C GETMET R7 R4 K6 - 0x88240907, // 002D GETMBR R9 R4 K7 - 0x88280108, // 002E GETMBR R10 R0 K8 - 0x7C1C0600, // 002F CALL R7 3 - 0x80040E00, // 0030 RET 1 R7 - 0x70020010, // 0031 JMP #0043 - 0x541EFFFB, // 0032 LDINT R7 65532 - 0x1C1C0C07, // 0033 EQ R7 R6 R7 - 0x781E0005, // 0034 JMPF R7 #003B - 0x8C1C0906, // 0035 GETMET R7 R4 K6 - 0x8824090B, // 0036 GETMBR R9 R4 K11 - 0x5828000C, // 0037 LDCONST R10 K12 - 0x7C1C0600, // 0038 CALL R7 3 - 0x80040E00, // 0039 RET 1 R7 - 0x70020007, // 003A JMP #0043 - 0x541EFFFC, // 003B LDINT R7 65533 - 0x1C1C0C07, // 003C EQ R7 R6 R7 - 0x781E0004, // 003D JMPF R7 #0043 - 0x8C1C0906, // 003E GETMET R7 R4 K6 - 0x8824090B, // 003F GETMBR R9 R4 K11 - 0x542A0004, // 0040 LDINT R10 5 - 0x7C1C0600, // 0041 CALL R7 3 - 0x80040E00, // 0042 RET 1 R7 - 0x70020007, // 0043 JMP #004C - 0x601C0003, // 0044 GETGBL R7 G3 - 0x5C200000, // 0045 MOVE R8 R0 - 0x7C1C0200, // 0046 CALL R7 1 - 0x8C1C0F0D, // 0047 GETMET R7 R7 K13 - 0x5C240200, // 0048 MOVE R9 R1 - 0x5C280400, // 0049 MOVE R10 R2 - 0x7C1C0600, // 004A CALL R7 3 - 0x80040E00, // 004B RET 1 R7 - 0x80000000, // 004C RET 0 - }) - ) -); -/*******************************************************************/ - - /******************************************************************** ** Solidified class: Matter_Plugin_Light1 ********************************************************************/ @@ -387,19 +388,15 @@ extern const bclass be_class_Matter_Plugin_Light0; be_local_class(Matter_Plugin_Light1, 1, &be_class_Matter_Plugin_Light0, - be_nested_map(7, + be_nested_map(8, ( (struct bmapnode*) &(const bmapnode[]) { - { be_const_key_weak(invoke_request, 1), be_const_closure(Matter_Plugin_Light1_invoke_request_closure) }, - { be_const_key_weak(read_attribute, 4), be_const_closure(Matter_Plugin_Light1_read_attribute_closure) }, - { be_const_key_weak(shadow_bri, -1), be_const_var(0) }, - { be_const_key_weak(TYPES, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { + { be_const_key_weak(TYPES, 7), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { be_const_map( * be_nested_map(1, ( (struct bmapnode*) &(const bmapnode[]) { { be_const_key_int(257, -1), be_const_int(2) }, })) ) } )) }, - { be_const_key_weak(update_shadow, 6), be_const_closure(Matter_Plugin_Light1_update_shadow_closure) }, - { be_const_key_weak(init, -1), be_const_closure(Matter_Plugin_Light1_init_closure) }, - { be_const_key_weak(CLUSTERS, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { + { be_const_key_weak(invoke_request, -1), be_const_closure(Matter_Plugin_Light1_invoke_request_closure) }, + { be_const_key_weak(CLUSTERS, 0), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { be_const_map( * be_nested_map(1, ( (struct bmapnode*) &(const bmapnode[]) { { be_const_key_int(8, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_list, { @@ -414,6 +411,11 @@ be_local_class(Matter_Plugin_Light1, be_const_int(65533), })) ) } )) }, })) ) } )) }, + { be_const_key_weak(init, 1), be_const_closure(Matter_Plugin_Light1_init_closure) }, + { be_const_key_weak(update_shadow, -1), be_const_closure(Matter_Plugin_Light1_update_shadow_closure) }, + { be_const_key_weak(shadow_bri, 4), be_const_var(0) }, + { be_const_key_weak(NAME, -1), be_nested_str_weak(light1) }, + { be_const_key_weak(read_attribute, -1), be_const_closure(Matter_Plugin_Light1_read_attribute_closure) }, })), be_str_weak(Matter_Plugin_Light1) ); diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Light2.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Light2.h index d572d80e2..3ca7c0915 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Light2.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Light2.h @@ -6,206 +6,6 @@ extern const bclass be_class_Matter_Plugin_Light2; -/******************************************************************** -** Solidified function: read_attribute -********************************************************************/ -be_local_closure(Matter_Plugin_Light2_read_attribute, /* name */ - be_nested_proto( - 11, /* nstack */ - 3, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[14]) { /* constants */ - /* K0 */ be_nested_str_weak(string), - /* K1 */ be_nested_str_weak(matter), - /* K2 */ be_nested_str_weak(TLV), - /* K3 */ be_nested_str_weak(cluster), - /* K4 */ be_nested_str_weak(attribute), - /* K5 */ be_nested_str_weak(create_TLV), - /* K6 */ be_nested_str_weak(U1), - /* K7 */ be_nested_str_weak(shadow_ct), - /* K8 */ be_const_int(2), - /* K9 */ be_const_int(0), - /* K10 */ be_nested_str_weak(ct_min), - /* K11 */ be_nested_str_weak(ct_max), - /* K12 */ be_nested_str_weak(U4), - /* K13 */ be_nested_str_weak(read_attribute), - }), - be_str_weak(read_attribute), - &be_const_str_solidified, - ( &(const binstruction[80]) { /* code */ - 0xA40E0000, // 0000 IMPORT R3 K0 - 0xB8120200, // 0001 GETNGBL R4 K1 - 0x88100902, // 0002 GETMBR R4 R4 K2 - 0x88140503, // 0003 GETMBR R5 R2 K3 - 0x88180504, // 0004 GETMBR R6 R2 K4 - 0x541E02FF, // 0005 LDINT R7 768 - 0x1C1C0A07, // 0006 EQ R7 R5 R7 - 0x781E003E, // 0007 JMPF R7 #0047 - 0x541E0006, // 0008 LDINT R7 7 - 0x1C1C0C07, // 0009 EQ R7 R6 R7 - 0x781E0005, // 000A JMPF R7 #0011 - 0x8C1C0905, // 000B GETMET R7 R4 K5 - 0x88240906, // 000C GETMBR R9 R4 K6 - 0x88280107, // 000D GETMBR R10 R0 K7 - 0x7C1C0600, // 000E CALL R7 3 - 0x80040E00, // 000F RET 1 R7 - 0x70020034, // 0010 JMP #0046 - 0x541E0007, // 0011 LDINT R7 8 - 0x1C1C0C07, // 0012 EQ R7 R6 R7 - 0x781E0005, // 0013 JMPF R7 #001A - 0x8C1C0905, // 0014 GETMET R7 R4 K5 - 0x88240906, // 0015 GETMBR R9 R4 K6 - 0x58280008, // 0016 LDCONST R10 K8 - 0x7C1C0600, // 0017 CALL R7 3 - 0x80040E00, // 0018 RET 1 R7 - 0x7002002B, // 0019 JMP #0046 - 0x541E000E, // 001A LDINT R7 15 - 0x1C1C0C07, // 001B EQ R7 R6 R7 - 0x781E0005, // 001C JMPF R7 #0023 - 0x8C1C0905, // 001D GETMET R7 R4 K5 - 0x88240906, // 001E GETMBR R9 R4 K6 - 0x58280009, // 001F LDCONST R10 K9 - 0x7C1C0600, // 0020 CALL R7 3 - 0x80040E00, // 0021 RET 1 R7 - 0x70020022, // 0022 JMP #0046 - 0x541E400A, // 0023 LDINT R7 16395 - 0x1C1C0C07, // 0024 EQ R7 R6 R7 - 0x781E0005, // 0025 JMPF R7 #002C - 0x8C1C0905, // 0026 GETMET R7 R4 K5 - 0x88240906, // 0027 GETMBR R9 R4 K6 - 0x8828010A, // 0028 GETMBR R10 R0 K10 - 0x7C1C0600, // 0029 CALL R7 3 - 0x80040E00, // 002A RET 1 R7 - 0x70020019, // 002B JMP #0046 - 0x541E400B, // 002C LDINT R7 16396 - 0x1C1C0C07, // 002D EQ R7 R6 R7 - 0x781E0005, // 002E JMPF R7 #0035 - 0x8C1C0905, // 002F GETMET R7 R4 K5 - 0x88240906, // 0030 GETMBR R9 R4 K6 - 0x8828010B, // 0031 GETMBR R10 R0 K11 - 0x7C1C0600, // 0032 CALL R7 3 - 0x80040E00, // 0033 RET 1 R7 - 0x70020010, // 0034 JMP #0046 - 0x541EFFFB, // 0035 LDINT R7 65532 - 0x1C1C0C07, // 0036 EQ R7 R6 R7 - 0x781E0005, // 0037 JMPF R7 #003E - 0x8C1C0905, // 0038 GETMET R7 R4 K5 - 0x8824090C, // 0039 GETMBR R9 R4 K12 - 0x542A000F, // 003A LDINT R10 16 - 0x7C1C0600, // 003B CALL R7 3 - 0x80040E00, // 003C RET 1 R7 - 0x70020007, // 003D JMP #0046 - 0x541EFFFC, // 003E LDINT R7 65533 - 0x1C1C0C07, // 003F EQ R7 R6 R7 - 0x781E0004, // 0040 JMPF R7 #0046 - 0x8C1C0905, // 0041 GETMET R7 R4 K5 - 0x8824090C, // 0042 GETMBR R9 R4 K12 - 0x542A0004, // 0043 LDINT R10 5 - 0x7C1C0600, // 0044 CALL R7 3 - 0x80040E00, // 0045 RET 1 R7 - 0x70020007, // 0046 JMP #004F - 0x601C0003, // 0047 GETGBL R7 G3 - 0x5C200000, // 0048 MOVE R8 R0 - 0x7C1C0200, // 0049 CALL R7 1 - 0x8C1C0F0D, // 004A GETMET R7 R7 K13 - 0x5C240200, // 004B MOVE R9 R1 - 0x5C280400, // 004C MOVE R10 R2 - 0x7C1C0600, // 004D CALL R7 3 - 0x80040E00, // 004E RET 1 R7 - 0x80000000, // 004F RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: init -********************************************************************/ -be_local_closure(Matter_Plugin_Light2_init, /* name */ - be_nested_proto( - 7, /* nstack */ - 3, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 3]) { /* constants */ - /* K0 */ be_nested_str_weak(init), - /* K1 */ be_nested_str_weak(shadow_ct), - /* K2 */ be_nested_str_weak(update_ct_minmax), - }), - be_str_weak(init), - &be_const_str_solidified, - ( &(const binstruction[12]) { /* code */ - 0x600C0003, // 0000 GETGBL R3 G3 - 0x5C100000, // 0001 MOVE R4 R0 - 0x7C0C0200, // 0002 CALL R3 1 - 0x8C0C0700, // 0003 GETMET R3 R3 K0 - 0x5C140200, // 0004 MOVE R5 R1 - 0x5C180400, // 0005 MOVE R6 R2 - 0x7C0C0600, // 0006 CALL R3 3 - 0x540E0144, // 0007 LDINT R3 325 - 0x90020203, // 0008 SETMBR R0 K1 R3 - 0x8C0C0102, // 0009 GETMET R3 R0 K2 - 0x7C0C0200, // 000A CALL R3 1 - 0x80000000, // 000B RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: update_ct_minmax -********************************************************************/ -be_local_closure(Matter_Plugin_Light2_update_ct_minmax, /* name */ - be_nested_proto( - 4, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 4]) { /* constants */ - /* K0 */ be_nested_str_weak(tasmota), - /* K1 */ be_nested_str_weak(get_option), - /* K2 */ be_nested_str_weak(ct_min), - /* K3 */ be_nested_str_weak(ct_max), - }), - be_str_weak(update_ct_minmax), - &be_const_str_solidified, - ( &(const binstruction[15]) { /* code */ - 0xB8060000, // 0000 GETNGBL R1 K0 - 0x8C040301, // 0001 GETMET R1 R1 K1 - 0x540E0051, // 0002 LDINT R3 82 - 0x7C040400, // 0003 CALL R1 2 - 0x78060001, // 0004 JMPF R1 #0007 - 0x540A00C7, // 0005 LDINT R2 200 - 0x70020000, // 0006 JMP #0008 - 0x540A0098, // 0007 LDINT R2 153 - 0x90020402, // 0008 SETMBR R0 K2 R2 - 0x78060001, // 0009 JMPF R1 #000C - 0x540A017B, // 000A LDINT R2 380 - 0x70020000, // 000B JMP #000D - 0x540A01F3, // 000C LDINT R2 500 - 0x90020602, // 000D SETMBR R0 K3 R2 - 0x80000000, // 000E RET 0 - }) - ) -); -/*******************************************************************/ - - /******************************************************************** ** Solidified function: invoke_request ********************************************************************/ @@ -370,6 +170,207 @@ be_local_closure(Matter_Plugin_Light2_update_shadow, /* name */ /*******************************************************************/ +/******************************************************************** +** Solidified function: read_attribute +********************************************************************/ +be_local_closure(Matter_Plugin_Light2_read_attribute, /* name */ + be_nested_proto( + 11, /* nstack */ + 3, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[14]) { /* constants */ + /* K0 */ be_nested_str_weak(string), + /* K1 */ be_nested_str_weak(matter), + /* K2 */ be_nested_str_weak(TLV), + /* K3 */ be_nested_str_weak(cluster), + /* K4 */ be_nested_str_weak(attribute), + /* K5 */ be_nested_str_weak(create_TLV), + /* K6 */ be_nested_str_weak(U1), + /* K7 */ be_nested_str_weak(shadow_ct), + /* K8 */ be_const_int(2), + /* K9 */ be_const_int(0), + /* K10 */ be_nested_str_weak(ct_min), + /* K11 */ be_nested_str_weak(ct_max), + /* K12 */ be_nested_str_weak(U4), + /* K13 */ be_nested_str_weak(read_attribute), + }), + be_str_weak(read_attribute), + &be_const_str_solidified, + ( &(const binstruction[80]) { /* code */ + 0xA40E0000, // 0000 IMPORT R3 K0 + 0xB8120200, // 0001 GETNGBL R4 K1 + 0x88100902, // 0002 GETMBR R4 R4 K2 + 0x88140503, // 0003 GETMBR R5 R2 K3 + 0x88180504, // 0004 GETMBR R6 R2 K4 + 0x541E02FF, // 0005 LDINT R7 768 + 0x1C1C0A07, // 0006 EQ R7 R5 R7 + 0x781E003E, // 0007 JMPF R7 #0047 + 0x541E0006, // 0008 LDINT R7 7 + 0x1C1C0C07, // 0009 EQ R7 R6 R7 + 0x781E0005, // 000A JMPF R7 #0011 + 0x8C1C0905, // 000B GETMET R7 R4 K5 + 0x88240906, // 000C GETMBR R9 R4 K6 + 0x88280107, // 000D GETMBR R10 R0 K7 + 0x7C1C0600, // 000E CALL R7 3 + 0x80040E00, // 000F RET 1 R7 + 0x70020034, // 0010 JMP #0046 + 0x541E0007, // 0011 LDINT R7 8 + 0x1C1C0C07, // 0012 EQ R7 R6 R7 + 0x781E0005, // 0013 JMPF R7 #001A + 0x8C1C0905, // 0014 GETMET R7 R4 K5 + 0x88240906, // 0015 GETMBR R9 R4 K6 + 0x58280008, // 0016 LDCONST R10 K8 + 0x7C1C0600, // 0017 CALL R7 3 + 0x80040E00, // 0018 RET 1 R7 + 0x7002002B, // 0019 JMP #0046 + 0x541E000E, // 001A LDINT R7 15 + 0x1C1C0C07, // 001B EQ R7 R6 R7 + 0x781E0005, // 001C JMPF R7 #0023 + 0x8C1C0905, // 001D GETMET R7 R4 K5 + 0x88240906, // 001E GETMBR R9 R4 K6 + 0x58280009, // 001F LDCONST R10 K9 + 0x7C1C0600, // 0020 CALL R7 3 + 0x80040E00, // 0021 RET 1 R7 + 0x70020022, // 0022 JMP #0046 + 0x541E400A, // 0023 LDINT R7 16395 + 0x1C1C0C07, // 0024 EQ R7 R6 R7 + 0x781E0005, // 0025 JMPF R7 #002C + 0x8C1C0905, // 0026 GETMET R7 R4 K5 + 0x88240906, // 0027 GETMBR R9 R4 K6 + 0x8828010A, // 0028 GETMBR R10 R0 K10 + 0x7C1C0600, // 0029 CALL R7 3 + 0x80040E00, // 002A RET 1 R7 + 0x70020019, // 002B JMP #0046 + 0x541E400B, // 002C LDINT R7 16396 + 0x1C1C0C07, // 002D EQ R7 R6 R7 + 0x781E0005, // 002E JMPF R7 #0035 + 0x8C1C0905, // 002F GETMET R7 R4 K5 + 0x88240906, // 0030 GETMBR R9 R4 K6 + 0x8828010B, // 0031 GETMBR R10 R0 K11 + 0x7C1C0600, // 0032 CALL R7 3 + 0x80040E00, // 0033 RET 1 R7 + 0x70020010, // 0034 JMP #0046 + 0x541EFFFB, // 0035 LDINT R7 65532 + 0x1C1C0C07, // 0036 EQ R7 R6 R7 + 0x781E0005, // 0037 JMPF R7 #003E + 0x8C1C0905, // 0038 GETMET R7 R4 K5 + 0x8824090C, // 0039 GETMBR R9 R4 K12 + 0x542A000F, // 003A LDINT R10 16 + 0x7C1C0600, // 003B CALL R7 3 + 0x80040E00, // 003C RET 1 R7 + 0x70020007, // 003D JMP #0046 + 0x541EFFFC, // 003E LDINT R7 65533 + 0x1C1C0C07, // 003F EQ R7 R6 R7 + 0x781E0004, // 0040 JMPF R7 #0046 + 0x8C1C0905, // 0041 GETMET R7 R4 K5 + 0x8824090C, // 0042 GETMBR R9 R4 K12 + 0x542A0004, // 0043 LDINT R10 5 + 0x7C1C0600, // 0044 CALL R7 3 + 0x80040E00, // 0045 RET 1 R7 + 0x70020007, // 0046 JMP #004F + 0x601C0003, // 0047 GETGBL R7 G3 + 0x5C200000, // 0048 MOVE R8 R0 + 0x7C1C0200, // 0049 CALL R7 1 + 0x8C1C0F0D, // 004A GETMET R7 R7 K13 + 0x5C240200, // 004B MOVE R9 R1 + 0x5C280400, // 004C MOVE R10 R2 + 0x7C1C0600, // 004D CALL R7 3 + 0x80040E00, // 004E RET 1 R7 + 0x80000000, // 004F RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: init +********************************************************************/ +be_local_closure(Matter_Plugin_Light2_init, /* name */ + be_nested_proto( + 9, /* nstack */ + 4, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 3]) { /* constants */ + /* K0 */ be_nested_str_weak(init), + /* K1 */ be_nested_str_weak(shadow_ct), + /* K2 */ be_nested_str_weak(update_ct_minmax), + }), + be_str_weak(init), + &be_const_str_solidified, + ( &(const binstruction[13]) { /* code */ + 0x60100003, // 0000 GETGBL R4 G3 + 0x5C140000, // 0001 MOVE R5 R0 + 0x7C100200, // 0002 CALL R4 1 + 0x8C100900, // 0003 GETMET R4 R4 K0 + 0x5C180200, // 0004 MOVE R6 R1 + 0x5C1C0400, // 0005 MOVE R7 R2 + 0x5C200600, // 0006 MOVE R8 R3 + 0x7C100800, // 0007 CALL R4 4 + 0x54120144, // 0008 LDINT R4 325 + 0x90020204, // 0009 SETMBR R0 K1 R4 + 0x8C100102, // 000A GETMET R4 R0 K2 + 0x7C100200, // 000B CALL R4 1 + 0x80000000, // 000C RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: update_ct_minmax +********************************************************************/ +be_local_closure(Matter_Plugin_Light2_update_ct_minmax, /* name */ + be_nested_proto( + 4, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 4]) { /* constants */ + /* K0 */ be_nested_str_weak(tasmota), + /* K1 */ be_nested_str_weak(get_option), + /* K2 */ be_nested_str_weak(ct_min), + /* K3 */ be_nested_str_weak(ct_max), + }), + be_str_weak(update_ct_minmax), + &be_const_str_solidified, + ( &(const binstruction[15]) { /* code */ + 0xB8060000, // 0000 GETNGBL R1 K0 + 0x8C040301, // 0001 GETMET R1 R1 K1 + 0x540E0051, // 0002 LDINT R3 82 + 0x7C040400, // 0003 CALL R1 2 + 0x78060001, // 0004 JMPF R1 #0007 + 0x540A00C7, // 0005 LDINT R2 200 + 0x70020000, // 0006 JMP #0008 + 0x540A0098, // 0007 LDINT R2 153 + 0x90020402, // 0008 SETMBR R0 K2 R2 + 0x78060001, // 0009 JMPF R1 #000C + 0x540A017B, // 000A LDINT R2 380 + 0x70020000, // 000B JMP #000D + 0x540A01F3, // 000C LDINT R2 500 + 0x90020602, // 000D SETMBR R0 K3 R2 + 0x80000000, // 000E RET 0 + }) + ) +); +/*******************************************************************/ + + /******************************************************************** ** Solidified class: Matter_Plugin_Light2 ********************************************************************/ @@ -377,17 +378,19 @@ extern const bclass be_class_Matter_Plugin_Light1; be_local_class(Matter_Plugin_Light2, 3, &be_class_Matter_Plugin_Light1, - be_nested_map(10, + be_nested_map(11, ( (struct bmapnode*) &(const bmapnode[]) { + { be_const_key_weak(update_ct_minmax, -1), be_const_closure(Matter_Plugin_Light2_update_ct_minmax_closure) }, + { be_const_key_weak(update_shadow, -1), be_const_closure(Matter_Plugin_Light2_update_shadow_closure) }, + { be_const_key_weak(NAME, 5), be_nested_str_weak(light2) }, + { be_const_key_weak(read_attribute, 8), be_const_closure(Matter_Plugin_Light2_read_attribute_closure) }, { be_const_key_weak(TYPES, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { be_const_map( * be_nested_map(1, ( (struct bmapnode*) &(const bmapnode[]) { { be_const_key_int(268, -1), be_const_int(2) }, })) ) } )) }, - { be_const_key_weak(shadow_ct, -1), be_const_var(0) }, - { be_const_key_weak(read_attribute, -1), be_const_closure(Matter_Plugin_Light2_read_attribute_closure) }, - { be_const_key_weak(ct_min, 8), be_const_var(1) }, - { be_const_key_weak(CLUSTERS, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { + { be_const_key_weak(ct_min, 1), be_const_var(1) }, + { be_const_key_weak(CLUSTERS, 2), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { be_const_map( * be_nested_map(1, ( (struct bmapnode*) &(const bmapnode[]) { { be_const_key_int(768, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_list, { @@ -402,11 +405,10 @@ be_local_class(Matter_Plugin_Light2, be_const_int(65533), })) ) } )) }, })) ) } )) }, - { be_const_key_weak(init, -1), be_const_closure(Matter_Plugin_Light2_init_closure) }, - { be_const_key_weak(invoke_request, -1), be_const_closure(Matter_Plugin_Light2_invoke_request_closure) }, - { be_const_key_weak(update_ct_minmax, 6), be_const_closure(Matter_Plugin_Light2_update_ct_minmax_closure) }, + { be_const_key_weak(shadow_ct, -1), be_const_var(0) }, { be_const_key_weak(ct_max, -1), be_const_var(2) }, - { be_const_key_weak(update_shadow, -1), be_const_closure(Matter_Plugin_Light2_update_shadow_closure) }, + { be_const_key_weak(init, -1), be_const_closure(Matter_Plugin_Light2_init_closure) }, + { be_const_key_weak(invoke_request, 0), be_const_closure(Matter_Plugin_Light2_invoke_request_closure) }, })), be_str_weak(Matter_Plugin_Light2) ); diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Light3.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Light3.h index 2c86c864a..da74ed5c4 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Light3.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Light3.h @@ -6,186 +6,6 @@ extern const bclass be_class_Matter_Plugin_Light3; -/******************************************************************** -** Solidified function: init -********************************************************************/ -be_local_closure(Matter_Plugin_Light3_init, /* name */ - be_nested_proto( - 7, /* nstack */ - 3, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 4]) { /* constants */ - /* K0 */ be_nested_str_weak(init), - /* K1 */ be_nested_str_weak(shadow_hue), - /* K2 */ be_const_int(0), - /* K3 */ be_nested_str_weak(shadow_sat), - }), - be_str_weak(init), - &be_const_str_solidified, - ( &(const binstruction[10]) { /* code */ - 0x600C0003, // 0000 GETGBL R3 G3 - 0x5C100000, // 0001 MOVE R4 R0 - 0x7C0C0200, // 0002 CALL R3 1 - 0x8C0C0700, // 0003 GETMET R3 R3 K0 - 0x5C140200, // 0004 MOVE R5 R1 - 0x5C180400, // 0005 MOVE R6 R2 - 0x7C0C0600, // 0006 CALL R3 3 - 0x90020302, // 0007 SETMBR R0 K1 K2 - 0x90020702, // 0008 SETMBR R0 K3 K2 - 0x80000000, // 0009 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: read_attribute -********************************************************************/ -be_local_closure(Matter_Plugin_Light3_read_attribute, /* name */ - be_nested_proto( - 11, /* nstack */ - 3, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[13]) { /* constants */ - /* K0 */ be_nested_str_weak(string), - /* K1 */ be_nested_str_weak(matter), - /* K2 */ be_nested_str_weak(TLV), - /* K3 */ be_nested_str_weak(cluster), - /* K4 */ be_nested_str_weak(attribute), - /* K5 */ be_const_int(0), - /* K6 */ be_nested_str_weak(create_TLV), - /* K7 */ be_nested_str_weak(U1), - /* K8 */ be_nested_str_weak(shadow_hue), - /* K9 */ be_const_int(1), - /* K10 */ be_nested_str_weak(shadow_sat), - /* K11 */ be_nested_str_weak(U4), - /* K12 */ be_nested_str_weak(read_attribute), - }), - be_str_weak(read_attribute), - &be_const_str_solidified, - ( &(const binstruction[105]) { /* code */ - 0xA40E0000, // 0000 IMPORT R3 K0 - 0xB8120200, // 0001 GETNGBL R4 K1 - 0x88100902, // 0002 GETMBR R4 R4 K2 - 0x88140503, // 0003 GETMBR R5 R2 K3 - 0x88180504, // 0004 GETMBR R6 R2 K4 - 0x541E02FF, // 0005 LDINT R7 768 - 0x1C1C0A07, // 0006 EQ R7 R5 R7 - 0x781E0057, // 0007 JMPF R7 #0060 - 0x1C1C0D05, // 0008 EQ R7 R6 K5 - 0x781E0005, // 0009 JMPF R7 #0010 - 0x8C1C0906, // 000A GETMET R7 R4 K6 - 0x88240907, // 000B GETMBR R9 R4 K7 - 0x88280108, // 000C GETMBR R10 R0 K8 - 0x7C1C0600, // 000D CALL R7 3 - 0x80040E00, // 000E RET 1 R7 - 0x7002004E, // 000F JMP #005F - 0x1C1C0D09, // 0010 EQ R7 R6 K9 - 0x781E0005, // 0011 JMPF R7 #0018 - 0x8C1C0906, // 0012 GETMET R7 R4 K6 - 0x88240907, // 0013 GETMBR R9 R4 K7 - 0x8828010A, // 0014 GETMBR R10 R0 K10 - 0x7C1C0600, // 0015 CALL R7 3 - 0x80040E00, // 0016 RET 1 R7 - 0x70020046, // 0017 JMP #005F - 0x541E0006, // 0018 LDINT R7 7 - 0x1C1C0C07, // 0019 EQ R7 R6 R7 - 0x781E0005, // 001A JMPF R7 #0021 - 0x8C1C0906, // 001B GETMET R7 R4 K6 - 0x88240907, // 001C GETMBR R9 R4 K7 - 0x58280005, // 001D LDCONST R10 K5 - 0x7C1C0600, // 001E CALL R7 3 - 0x80040E00, // 001F RET 1 R7 - 0x7002003D, // 0020 JMP #005F - 0x541E0007, // 0021 LDINT R7 8 - 0x1C1C0C07, // 0022 EQ R7 R6 R7 - 0x781E0005, // 0023 JMPF R7 #002A - 0x8C1C0906, // 0024 GETMET R7 R4 K6 - 0x88240907, // 0025 GETMBR R9 R4 K7 - 0x58280005, // 0026 LDCONST R10 K5 - 0x7C1C0600, // 0027 CALL R7 3 - 0x80040E00, // 0028 RET 1 R7 - 0x70020034, // 0029 JMP #005F - 0x541E000E, // 002A LDINT R7 15 - 0x1C1C0C07, // 002B EQ R7 R6 R7 - 0x781E0005, // 002C JMPF R7 #0033 - 0x8C1C0906, // 002D GETMET R7 R4 K6 - 0x88240907, // 002E GETMBR R9 R4 K7 - 0x58280005, // 002F LDCONST R10 K5 - 0x7C1C0600, // 0030 CALL R7 3 - 0x80040E00, // 0031 RET 1 R7 - 0x7002002B, // 0032 JMP #005F - 0x541E4000, // 0033 LDINT R7 16385 - 0x1C1C0C07, // 0034 EQ R7 R6 R7 - 0x781E0005, // 0035 JMPF R7 #003C - 0x8C1C0906, // 0036 GETMET R7 R4 K6 - 0x88240907, // 0037 GETMBR R9 R4 K7 - 0x58280005, // 0038 LDCONST R10 K5 - 0x7C1C0600, // 0039 CALL R7 3 - 0x80040E00, // 003A RET 1 R7 - 0x70020022, // 003B JMP #005F - 0x541E4009, // 003C LDINT R7 16394 - 0x1C1C0C07, // 003D EQ R7 R6 R7 - 0x781E0005, // 003E JMPF R7 #0045 - 0x8C1C0906, // 003F GETMET R7 R4 K6 - 0x88240907, // 0040 GETMBR R9 R4 K7 - 0x58280005, // 0041 LDCONST R10 K5 - 0x7C1C0600, // 0042 CALL R7 3 - 0x80040E00, // 0043 RET 1 R7 - 0x70020019, // 0044 JMP #005F - 0x541E000F, // 0045 LDINT R7 16 - 0x1C1C0C07, // 0046 EQ R7 R6 R7 - 0x781E0005, // 0047 JMPF R7 #004E - 0x8C1C0906, // 0048 GETMET R7 R4 K6 - 0x88240907, // 0049 GETMBR R9 R4 K7 - 0x58280005, // 004A LDCONST R10 K5 - 0x7C1C0600, // 004B CALL R7 3 - 0x80040E00, // 004C RET 1 R7 - 0x70020010, // 004D JMP #005F - 0x541EFFFB, // 004E LDINT R7 65532 - 0x1C1C0C07, // 004F EQ R7 R6 R7 - 0x781E0005, // 0050 JMPF R7 #0057 - 0x8C1C0906, // 0051 GETMET R7 R4 K6 - 0x8824090B, // 0052 GETMBR R9 R4 K11 - 0x58280009, // 0053 LDCONST R10 K9 - 0x7C1C0600, // 0054 CALL R7 3 - 0x80040E00, // 0055 RET 1 R7 - 0x70020007, // 0056 JMP #005F - 0x541EFFFC, // 0057 LDINT R7 65533 - 0x1C1C0C07, // 0058 EQ R7 R6 R7 - 0x781E0004, // 0059 JMPF R7 #005F - 0x8C1C0906, // 005A GETMET R7 R4 K6 - 0x8824090B, // 005B GETMBR R9 R4 K11 - 0x542A0004, // 005C LDINT R10 5 - 0x7C1C0600, // 005D CALL R7 3 - 0x80040E00, // 005E RET 1 R7 - 0x70020007, // 005F JMP #0068 - 0x601C0003, // 0060 GETGBL R7 G3 - 0x5C200000, // 0061 MOVE R8 R0 - 0x7C1C0200, // 0062 CALL R7 1 - 0x8C1C0F0C, // 0063 GETMET R7 R7 K12 - 0x5C240200, // 0064 MOVE R9 R1 - 0x5C280400, // 0065 MOVE R10 R2 - 0x7C1C0600, // 0066 CALL R7 3 - 0x80040E00, // 0067 RET 1 R7 - 0x80000000, // 0068 RET 0 - }) - ) -); -/*******************************************************************/ - - /******************************************************************** ** Solidified function: invoke_request ********************************************************************/ @@ -379,6 +199,148 @@ be_local_closure(Matter_Plugin_Light3_invoke_request, /* name */ /*******************************************************************/ +/******************************************************************** +** Solidified function: read_attribute +********************************************************************/ +be_local_closure(Matter_Plugin_Light3_read_attribute, /* name */ + be_nested_proto( + 11, /* nstack */ + 3, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[13]) { /* constants */ + /* K0 */ be_nested_str_weak(string), + /* K1 */ be_nested_str_weak(matter), + /* K2 */ be_nested_str_weak(TLV), + /* K3 */ be_nested_str_weak(cluster), + /* K4 */ be_nested_str_weak(attribute), + /* K5 */ be_const_int(0), + /* K6 */ be_nested_str_weak(create_TLV), + /* K7 */ be_nested_str_weak(U1), + /* K8 */ be_nested_str_weak(shadow_hue), + /* K9 */ be_const_int(1), + /* K10 */ be_nested_str_weak(shadow_sat), + /* K11 */ be_nested_str_weak(U4), + /* K12 */ be_nested_str_weak(read_attribute), + }), + be_str_weak(read_attribute), + &be_const_str_solidified, + ( &(const binstruction[105]) { /* code */ + 0xA40E0000, // 0000 IMPORT R3 K0 + 0xB8120200, // 0001 GETNGBL R4 K1 + 0x88100902, // 0002 GETMBR R4 R4 K2 + 0x88140503, // 0003 GETMBR R5 R2 K3 + 0x88180504, // 0004 GETMBR R6 R2 K4 + 0x541E02FF, // 0005 LDINT R7 768 + 0x1C1C0A07, // 0006 EQ R7 R5 R7 + 0x781E0057, // 0007 JMPF R7 #0060 + 0x1C1C0D05, // 0008 EQ R7 R6 K5 + 0x781E0005, // 0009 JMPF R7 #0010 + 0x8C1C0906, // 000A GETMET R7 R4 K6 + 0x88240907, // 000B GETMBR R9 R4 K7 + 0x88280108, // 000C GETMBR R10 R0 K8 + 0x7C1C0600, // 000D CALL R7 3 + 0x80040E00, // 000E RET 1 R7 + 0x7002004E, // 000F JMP #005F + 0x1C1C0D09, // 0010 EQ R7 R6 K9 + 0x781E0005, // 0011 JMPF R7 #0018 + 0x8C1C0906, // 0012 GETMET R7 R4 K6 + 0x88240907, // 0013 GETMBR R9 R4 K7 + 0x8828010A, // 0014 GETMBR R10 R0 K10 + 0x7C1C0600, // 0015 CALL R7 3 + 0x80040E00, // 0016 RET 1 R7 + 0x70020046, // 0017 JMP #005F + 0x541E0006, // 0018 LDINT R7 7 + 0x1C1C0C07, // 0019 EQ R7 R6 R7 + 0x781E0005, // 001A JMPF R7 #0021 + 0x8C1C0906, // 001B GETMET R7 R4 K6 + 0x88240907, // 001C GETMBR R9 R4 K7 + 0x58280005, // 001D LDCONST R10 K5 + 0x7C1C0600, // 001E CALL R7 3 + 0x80040E00, // 001F RET 1 R7 + 0x7002003D, // 0020 JMP #005F + 0x541E0007, // 0021 LDINT R7 8 + 0x1C1C0C07, // 0022 EQ R7 R6 R7 + 0x781E0005, // 0023 JMPF R7 #002A + 0x8C1C0906, // 0024 GETMET R7 R4 K6 + 0x88240907, // 0025 GETMBR R9 R4 K7 + 0x58280005, // 0026 LDCONST R10 K5 + 0x7C1C0600, // 0027 CALL R7 3 + 0x80040E00, // 0028 RET 1 R7 + 0x70020034, // 0029 JMP #005F + 0x541E000E, // 002A LDINT R7 15 + 0x1C1C0C07, // 002B EQ R7 R6 R7 + 0x781E0005, // 002C JMPF R7 #0033 + 0x8C1C0906, // 002D GETMET R7 R4 K6 + 0x88240907, // 002E GETMBR R9 R4 K7 + 0x58280005, // 002F LDCONST R10 K5 + 0x7C1C0600, // 0030 CALL R7 3 + 0x80040E00, // 0031 RET 1 R7 + 0x7002002B, // 0032 JMP #005F + 0x541E4000, // 0033 LDINT R7 16385 + 0x1C1C0C07, // 0034 EQ R7 R6 R7 + 0x781E0005, // 0035 JMPF R7 #003C + 0x8C1C0906, // 0036 GETMET R7 R4 K6 + 0x88240907, // 0037 GETMBR R9 R4 K7 + 0x58280005, // 0038 LDCONST R10 K5 + 0x7C1C0600, // 0039 CALL R7 3 + 0x80040E00, // 003A RET 1 R7 + 0x70020022, // 003B JMP #005F + 0x541E4009, // 003C LDINT R7 16394 + 0x1C1C0C07, // 003D EQ R7 R6 R7 + 0x781E0005, // 003E JMPF R7 #0045 + 0x8C1C0906, // 003F GETMET R7 R4 K6 + 0x88240907, // 0040 GETMBR R9 R4 K7 + 0x58280005, // 0041 LDCONST R10 K5 + 0x7C1C0600, // 0042 CALL R7 3 + 0x80040E00, // 0043 RET 1 R7 + 0x70020019, // 0044 JMP #005F + 0x541E000F, // 0045 LDINT R7 16 + 0x1C1C0C07, // 0046 EQ R7 R6 R7 + 0x781E0005, // 0047 JMPF R7 #004E + 0x8C1C0906, // 0048 GETMET R7 R4 K6 + 0x88240907, // 0049 GETMBR R9 R4 K7 + 0x58280005, // 004A LDCONST R10 K5 + 0x7C1C0600, // 004B CALL R7 3 + 0x80040E00, // 004C RET 1 R7 + 0x70020010, // 004D JMP #005F + 0x541EFFFB, // 004E LDINT R7 65532 + 0x1C1C0C07, // 004F EQ R7 R6 R7 + 0x781E0005, // 0050 JMPF R7 #0057 + 0x8C1C0906, // 0051 GETMET R7 R4 K6 + 0x8824090B, // 0052 GETMBR R9 R4 K11 + 0x58280009, // 0053 LDCONST R10 K9 + 0x7C1C0600, // 0054 CALL R7 3 + 0x80040E00, // 0055 RET 1 R7 + 0x70020007, // 0056 JMP #005F + 0x541EFFFC, // 0057 LDINT R7 65533 + 0x1C1C0C07, // 0058 EQ R7 R6 R7 + 0x781E0004, // 0059 JMPF R7 #005F + 0x8C1C0906, // 005A GETMET R7 R4 K6 + 0x8824090B, // 005B GETMBR R9 R4 K11 + 0x542A0004, // 005C LDINT R10 5 + 0x7C1C0600, // 005D CALL R7 3 + 0x80040E00, // 005E RET 1 R7 + 0x70020007, // 005F JMP #0068 + 0x601C0003, // 0060 GETGBL R7 G3 + 0x5C200000, // 0061 MOVE R8 R0 + 0x7C1C0200, // 0062 CALL R7 1 + 0x8C1C0F0C, // 0063 GETMET R7 R7 K12 + 0x5C240200, // 0064 MOVE R9 R1 + 0x5C280400, // 0065 MOVE R10 R2 + 0x7C1C0600, // 0066 CALL R7 3 + 0x80040E00, // 0067 RET 1 R7 + 0x80000000, // 0068 RET 0 + }) + ) +); +/*******************************************************************/ + + /******************************************************************** ** Solidified function: update_shadow ********************************************************************/ @@ -479,6 +441,45 @@ be_local_closure(Matter_Plugin_Light3_update_shadow, /* name */ /*******************************************************************/ +/******************************************************************** +** Solidified function: init +********************************************************************/ +be_local_closure(Matter_Plugin_Light3_init, /* name */ + be_nested_proto( + 9, /* nstack */ + 4, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 4]) { /* constants */ + /* K0 */ be_nested_str_weak(init), + /* K1 */ be_nested_str_weak(shadow_hue), + /* K2 */ be_const_int(0), + /* K3 */ be_nested_str_weak(shadow_sat), + }), + be_str_weak(init), + &be_const_str_solidified, + ( &(const binstruction[11]) { /* code */ + 0x60100003, // 0000 GETGBL R4 G3 + 0x5C140000, // 0001 MOVE R5 R0 + 0x7C100200, // 0002 CALL R4 1 + 0x8C100900, // 0003 GETMET R4 R4 K0 + 0x5C180200, // 0004 MOVE R6 R1 + 0x5C1C0400, // 0005 MOVE R7 R2 + 0x5C200600, // 0006 MOVE R8 R3 + 0x7C100800, // 0007 CALL R4 4 + 0x90020302, // 0008 SETMBR R0 K1 K2 + 0x90020702, // 0009 SETMBR R0 K3 K2 + 0x80000000, // 000A RET 0 + }) + ) +); +/*******************************************************************/ + + /******************************************************************** ** Solidified class: Matter_Plugin_Light3 ********************************************************************/ @@ -486,9 +487,21 @@ extern const bclass be_class_Matter_Plugin_Light1; be_local_class(Matter_Plugin_Light3, 2, &be_class_Matter_Plugin_Light1, - be_nested_map(8, + be_nested_map(9, ( (struct bmapnode*) &(const bmapnode[]) { - { be_const_key_weak(CLUSTERS, 7), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { + { be_const_key_weak(init, -1), be_const_closure(Matter_Plugin_Light3_init_closure) }, + { be_const_key_weak(shadow_sat, -1), be_const_var(1) }, + { be_const_key_weak(TYPES, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { + be_const_map( * be_nested_map(1, + ( (struct bmapnode*) &(const bmapnode[]) { + { be_const_key_int(269, -1), be_const_int(2) }, + })) ) } )) }, + { be_const_key_weak(NAME, -1), be_nested_str_weak(light3) }, + { be_const_key_weak(shadow_hue, 8), be_const_var(0) }, + { be_const_key_weak(invoke_request, -1), be_const_closure(Matter_Plugin_Light3_invoke_request_closure) }, + { be_const_key_weak(read_attribute, 0), be_const_closure(Matter_Plugin_Light3_read_attribute_closure) }, + { be_const_key_weak(update_shadow, -1), be_const_closure(Matter_Plugin_Light3_update_shadow_closure) }, + { be_const_key_weak(CLUSTERS, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { be_const_map( * be_nested_map(1, ( (struct bmapnode*) &(const bmapnode[]) { { be_const_key_int(768, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_list, { @@ -505,17 +518,6 @@ be_local_class(Matter_Plugin_Light3, be_const_int(65533), })) ) } )) }, })) ) } )) }, - { be_const_key_weak(invoke_request, -1), be_const_closure(Matter_Plugin_Light3_invoke_request_closure) }, - { be_const_key_weak(TYPES, 0), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { - be_const_map( * be_nested_map(1, - ( (struct bmapnode*) &(const bmapnode[]) { - { be_const_key_int(269, -1), be_const_int(2) }, - })) ) } )) }, - { be_const_key_weak(init, 1), be_const_closure(Matter_Plugin_Light3_init_closure) }, - { be_const_key_weak(shadow_hue, -1), be_const_var(0) }, - { be_const_key_weak(update_shadow, -1), be_const_closure(Matter_Plugin_Light3_update_shadow_closure) }, - { be_const_key_weak(shadow_sat, -1), be_const_var(1) }, - { be_const_key_weak(read_attribute, -1), be_const_closure(Matter_Plugin_Light3_read_attribute_closure) }, })), be_str_weak(Matter_Plugin_Light3) ); diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_OnOff.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_OnOff.h index f0ecd333d..24b8911b4 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_OnOff.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_OnOff.h @@ -6,6 +6,101 @@ extern const bclass be_class_Matter_Plugin_OnOff; +/******************************************************************** +** Solidified function: get_onoff +********************************************************************/ +be_local_closure(Matter_Plugin_OnOff_get_onoff, /* name */ + be_nested_proto( + 5, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 5]) { /* constants */ + /* K0 */ be_nested_str_weak(tasmota), + /* K1 */ be_nested_str_weak(get_power), + /* K2 */ be_nested_str_weak(tasmota_relay_index), + /* K3 */ be_nested_str_weak(shadow_onoff), + /* K4 */ be_nested_str_weak(onoff_changed), + }), + be_str_weak(get_onoff), + &be_const_str_solidified, + ( &(const binstruction[28]) { /* code */ + 0xB8060000, // 0000 GETNGBL R1 K0 + 0x8C040301, // 0001 GETMET R1 R1 K1 + 0x880C0102, // 0002 GETMBR R3 R0 K2 + 0x7C040400, // 0003 CALL R1 2 + 0x4C080000, // 0004 LDNIL R2 + 0x20080202, // 0005 NE R2 R1 R2 + 0x780A000C, // 0006 JMPF R2 #0014 + 0x88080103, // 0007 GETMBR R2 R0 K3 + 0x4C0C0000, // 0008 LDNIL R3 + 0x20080403, // 0009 NE R2 R2 R3 + 0x780A0007, // 000A JMPF R2 #0013 + 0x88080103, // 000B GETMBR R2 R0 K3 + 0x600C0017, // 000C GETGBL R3 G23 + 0x5C100200, // 000D MOVE R4 R1 + 0x7C0C0200, // 000E CALL R3 1 + 0x20080403, // 000F NE R2 R2 R3 + 0x780A0001, // 0010 JMPF R2 #0013 + 0x8C080104, // 0011 GETMET R2 R0 K4 + 0x7C080200, // 0012 CALL R2 1 + 0x90020601, // 0013 SETMBR R0 K3 R1 + 0x88080103, // 0014 GETMBR R2 R0 K3 + 0x4C0C0000, // 0015 LDNIL R3 + 0x1C080403, // 0016 EQ R2 R2 R3 + 0x780A0001, // 0017 JMPF R2 #001A + 0x50080000, // 0018 LDBOOL R2 0 0 + 0x90020602, // 0019 SETMBR R0 K3 R2 + 0x88080103, // 001A GETMBR R2 R0 K3 + 0x80040400, // 001B RET 1 R2 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: set_onoff +********************************************************************/ +be_local_closure(Matter_Plugin_OnOff_set_onoff, /* name */ + be_nested_proto( + 7, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 4]) { /* constants */ + /* K0 */ be_nested_str_weak(tasmota), + /* K1 */ be_nested_str_weak(set_power), + /* K2 */ be_nested_str_weak(tasmota_relay_index), + /* K3 */ be_nested_str_weak(get_onoff), + }), + be_str_weak(set_onoff), + &be_const_str_solidified, + ( &(const binstruction[10]) { /* code */ + 0xB80A0000, // 0000 GETNGBL R2 K0 + 0x8C080501, // 0001 GETMET R2 R2 K1 + 0x88100102, // 0002 GETMBR R4 R0 K2 + 0x60140017, // 0003 GETGBL R5 G23 + 0x5C180200, // 0004 MOVE R6 R1 + 0x7C140200, // 0005 CALL R5 1 + 0x7C080600, // 0006 CALL R2 3 + 0x8C080103, // 0007 GETMET R2 R0 K3 + 0x7C080200, // 0008 CALL R2 1 + 0x80000000, // 0009 RET 0 + }) + ) +); +/*******************************************************************/ + + /******************************************************************** ** Solidified function: invoke_request ********************************************************************/ @@ -163,56 +258,49 @@ be_local_closure(Matter_Plugin_OnOff_invoke_request, /* name */ /******************************************************************** -** Solidified function: get_onoff +** Solidified function: init ********************************************************************/ -be_local_closure(Matter_Plugin_OnOff_get_onoff, /* name */ +be_local_closure(Matter_Plugin_OnOff_init, /* name */ be_nested_proto( - 5, /* nstack */ - 1, /* argc */ + 9, /* nstack */ + 4, /* argc */ 2, /* varg */ 0, /* has upvals */ NULL, /* no upvals */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[ 5]) { /* constants */ - /* K0 */ be_nested_str_weak(tasmota), - /* K1 */ be_nested_str_weak(get_power), + ( &(const bvalue[ 6]) { /* constants */ + /* K0 */ be_nested_str_weak(init), + /* K1 */ be_nested_str_weak(get_onoff), /* K2 */ be_nested_str_weak(tasmota_relay_index), - /* K3 */ be_nested_str_weak(shadow_onoff), - /* K4 */ be_nested_str_weak(onoff_changed), + /* K3 */ be_nested_str_weak(find), + /* K4 */ be_nested_str_weak(relay), + /* K5 */ be_const_int(0), }), - be_str_weak(get_onoff), + be_str_weak(init), &be_const_str_solidified, - ( &(const binstruction[28]) { /* code */ - 0xB8060000, // 0000 GETNGBL R1 K0 - 0x8C040301, // 0001 GETMET R1 R1 K1 - 0x880C0102, // 0002 GETMBR R3 R0 K2 - 0x7C040400, // 0003 CALL R1 2 - 0x4C080000, // 0004 LDNIL R2 - 0x20080202, // 0005 NE R2 R1 R2 - 0x780A000C, // 0006 JMPF R2 #0014 - 0x88080103, // 0007 GETMBR R2 R0 K3 - 0x4C0C0000, // 0008 LDNIL R3 - 0x20080403, // 0009 NE R2 R2 R3 - 0x780A0007, // 000A JMPF R2 #0013 - 0x88080103, // 000B GETMBR R2 R0 K3 - 0x600C0017, // 000C GETGBL R3 G23 - 0x5C100200, // 000D MOVE R4 R1 - 0x7C0C0200, // 000E CALL R3 1 - 0x20080403, // 000F NE R2 R2 R3 - 0x780A0001, // 0010 JMPF R2 #0013 - 0x8C080104, // 0011 GETMET R2 R0 K4 - 0x7C080200, // 0012 CALL R2 1 - 0x90020601, // 0013 SETMBR R0 K3 R1 - 0x88080103, // 0014 GETMBR R2 R0 K3 - 0x4C0C0000, // 0015 LDNIL R3 - 0x1C080403, // 0016 EQ R2 R2 R3 - 0x780A0001, // 0017 JMPF R2 #001A - 0x50080000, // 0018 LDBOOL R2 0 0 - 0x90020602, // 0019 SETMBR R0 K3 R2 - 0x88080103, // 001A GETMBR R2 R0 K3 - 0x80040400, // 001B RET 1 R2 + ( &(const binstruction[20]) { /* code */ + 0x60100003, // 0000 GETGBL R4 G3 + 0x5C140000, // 0001 MOVE R5 R0 + 0x7C100200, // 0002 CALL R4 1 + 0x8C100900, // 0003 GETMET R4 R4 K0 + 0x5C180200, // 0004 MOVE R6 R1 + 0x5C1C0400, // 0005 MOVE R7 R2 + 0x5C200600, // 0006 MOVE R8 R3 + 0x7C100800, // 0007 CALL R4 4 + 0x8C100101, // 0008 GETMET R4 R0 K1 + 0x7C100200, // 0009 CALL R4 1 + 0x8C100703, // 000A GETMET R4 R3 K3 + 0x58180004, // 000B LDCONST R6 K4 + 0x7C100400, // 000C CALL R4 2 + 0x90020404, // 000D SETMBR R0 K2 R4 + 0x88100102, // 000E GETMBR R4 R0 K2 + 0x4C140000, // 000F LDNIL R5 + 0x1C100805, // 0010 EQ R4 R4 R5 + 0x78120000, // 0011 JMPF R4 #0013 + 0x90020505, // 0012 SETMBR R0 K2 K5 + 0x80000000, // 0013 RET 0 }) ) ); @@ -252,9 +340,9 @@ be_local_closure(Matter_Plugin_OnOff_onoff_changed, /* name */ /******************************************************************** -** Solidified function: set_onoff +** Solidified function: to_json_parameters ********************************************************************/ -be_local_closure(Matter_Plugin_OnOff_set_onoff, /* name */ +be_local_closure(Matter_Plugin_OnOff_to_json_parameters, /* name */ be_nested_proto( 7, /* nstack */ 2, /* argc */ @@ -265,24 +353,49 @@ be_local_closure(Matter_Plugin_OnOff_set_onoff, /* name */ NULL, /* no sub protos */ 1, /* has constants */ ( &(const bvalue[ 4]) { /* constants */ - /* K0 */ be_nested_str_weak(tasmota), - /* K1 */ be_nested_str_weak(set_power), - /* K2 */ be_nested_str_weak(tasmota_relay_index), - /* K3 */ be_nested_str_weak(get_onoff), + /* K0 */ be_nested_str_weak(string), + /* K1 */ be_nested_str_weak(format), + /* K2 */ be_nested_str_weak(_X2C_X22relay_X22_X3A_X25i), + /* K3 */ be_nested_str_weak(tasmota_relay_index), }), - be_str_weak(set_onoff), + be_str_weak(to_json_parameters), &be_const_str_solidified, - ( &(const binstruction[10]) { /* code */ - 0xB80A0000, // 0000 GETNGBL R2 K0 - 0x8C080501, // 0001 GETMET R2 R2 K1 - 0x88100102, // 0002 GETMBR R4 R0 K2 - 0x60140017, // 0003 GETGBL R5 G23 - 0x5C180200, // 0004 MOVE R6 R1 - 0x7C140200, // 0005 CALL R5 1 - 0x7C080600, // 0006 CALL R2 3 - 0x8C080103, // 0007 GETMET R2 R0 K3 - 0x7C080200, // 0008 CALL R2 1 - 0x80000000, // 0009 RET 0 + ( &(const binstruction[ 7]) { /* code */ + 0xA40A0000, // 0000 IMPORT R2 K0 + 0x8C0C0501, // 0001 GETMET R3 R2 K1 + 0x58140002, // 0002 LDCONST R5 K2 + 0x88180103, // 0003 GETMBR R6 R0 K3 + 0x7C0C0600, // 0004 CALL R3 3 + 0x00040203, // 0005 ADD R1 R1 R3 + 0x80040200, // 0006 RET 1 R1 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: every_second +********************************************************************/ +be_local_closure(Matter_Plugin_OnOff_every_second, /* name */ + be_nested_proto( + 3, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 1]) { /* constants */ + /* K0 */ be_nested_str_weak(get_onoff), + }), + be_str_weak(every_second), + &be_const_str_solidified, + ( &(const binstruction[ 3]) { /* code */ + 0x8C040100, // 0000 GETMET R1 R0 K0 + 0x7C040200, // 0001 CALL R1 1 + 0x80000000, // 0002 RET 0 }) ) ); @@ -502,77 +615,6 @@ be_local_closure(Matter_Plugin_OnOff_read_attribute, /* name */ /*******************************************************************/ -/******************************************************************** -** Solidified function: init -********************************************************************/ -be_local_closure(Matter_Plugin_OnOff_init, /* name */ - be_nested_proto( - 8, /* nstack */ - 4, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 4]) { /* constants */ - /* K0 */ be_nested_str_weak(init), - /* K1 */ be_nested_str_weak(get_onoff), - /* K2 */ be_const_int(0), - /* K3 */ be_nested_str_weak(tasmota_relay_index), - }), - be_str_weak(init), - &be_const_str_solidified, - ( &(const binstruction[15]) { /* code */ - 0x60100003, // 0000 GETGBL R4 G3 - 0x5C140000, // 0001 MOVE R5 R0 - 0x7C100200, // 0002 CALL R4 1 - 0x8C100900, // 0003 GETMET R4 R4 K0 - 0x5C180200, // 0004 MOVE R6 R1 - 0x5C1C0400, // 0005 MOVE R7 R2 - 0x7C100600, // 0006 CALL R4 3 - 0x8C100101, // 0007 GETMET R4 R0 K1 - 0x7C100200, // 0008 CALL R4 1 - 0x4C100000, // 0009 LDNIL R4 - 0x1C100604, // 000A EQ R4 R3 R4 - 0x78120000, // 000B JMPF R4 #000D - 0x580C0002, // 000C LDCONST R3 K2 - 0x90020603, // 000D SETMBR R0 K3 R3 - 0x80000000, // 000E RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: every_second -********************************************************************/ -be_local_closure(Matter_Plugin_OnOff_every_second, /* name */ - be_nested_proto( - 3, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 1]) { /* constants */ - /* K0 */ be_nested_str_weak(get_onoff), - }), - be_str_weak(every_second), - &be_const_str_solidified, - ( &(const binstruction[ 3]) { /* code */ - 0x8C040100, // 0000 GETMET R1 R0 K0 - 0x7C040200, // 0001 CALL R1 1 - 0x80000000, // 0002 RET 0 - }) - ) -); -/*******************************************************************/ - - /******************************************************************** ** Solidified class: Matter_Plugin_OnOff ********************************************************************/ @@ -580,18 +622,18 @@ extern const bclass be_class_Matter_Plugin; be_local_class(Matter_Plugin_OnOff, 2, &be_class_Matter_Plugin, - be_nested_map(11, + be_nested_map(13, ( (struct bmapnode*) &(const bmapnode[]) { + { be_const_key_weak(shadow_onoff, -1), be_const_var(1) }, + { be_const_key_weak(tasmota_relay_index, -1), be_const_var(0) }, + { be_const_key_weak(get_onoff, -1), be_const_closure(Matter_Plugin_OnOff_get_onoff_closure) }, { be_const_key_weak(every_second, -1), be_const_closure(Matter_Plugin_OnOff_every_second_closure) }, - { be_const_key_weak(get_onoff, 8), be_const_closure(Matter_Plugin_OnOff_get_onoff_closure) }, - { be_const_key_weak(init, -1), be_const_closure(Matter_Plugin_OnOff_init_closure) }, - { be_const_key_weak(shadow_onoff, 5), be_const_var(1) }, - { be_const_key_weak(TYPES, 7), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { - be_const_map( * be_nested_map(1, - ( (struct bmapnode*) &(const bmapnode[]) { - { be_const_key_int(266, -1), be_const_int(2) }, - })) ) } )) }, { be_const_key_weak(read_attribute, -1), be_const_closure(Matter_Plugin_OnOff_read_attribute_closure) }, + { be_const_key_weak(invoke_request, -1), be_const_closure(Matter_Plugin_OnOff_invoke_request_closure) }, + { be_const_key_weak(init, -1), be_const_closure(Matter_Plugin_OnOff_init_closure) }, + { be_const_key_weak(onoff_changed, -1), be_const_closure(Matter_Plugin_OnOff_onoff_changed_closure) }, + { be_const_key_weak(to_json_parameters, -1), be_const_closure(Matter_Plugin_OnOff_to_json_parameters_closure) }, + { be_const_key_weak(NAME, 3), be_nested_str_weak(relay) }, { be_const_key_weak(CLUSTERS, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { be_const_map( * be_nested_map(4, ( (struct bmapnode*) &(const bmapnode[]) { @@ -630,10 +672,12 @@ be_local_class(Matter_Plugin_OnOff, be_const_int(65533), })) ) } )) }, })) ) } )) }, - { be_const_key_weak(set_onoff, -1), be_const_closure(Matter_Plugin_OnOff_set_onoff_closure) }, - { be_const_key_weak(onoff_changed, -1), be_const_closure(Matter_Plugin_OnOff_onoff_changed_closure) }, - { be_const_key_weak(tasmota_relay_index, 2), be_const_var(0) }, - { be_const_key_weak(invoke_request, 0), be_const_closure(Matter_Plugin_OnOff_invoke_request_closure) }, + { be_const_key_weak(set_onoff, 4), be_const_closure(Matter_Plugin_OnOff_set_onoff_closure) }, + { be_const_key_weak(TYPES, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { + be_const_map( * be_nested_map(1, + ( (struct bmapnode*) &(const bmapnode[]) { + { be_const_key_int(266, -1), be_const_int(2) }, + })) ) } )) }, })), be_str_weak(Matter_Plugin_OnOff) ); diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Root.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Root.h index bc0d5c749..0ed2d4962 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Root.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Root.h @@ -1151,8 +1151,8 @@ be_local_closure(Matter_Plugin_Root_write_attribute, /* name */ ********************************************************************/ be_local_closure(Matter_Plugin_Root_init, /* name */ be_nested_proto( - 7, /* nstack */ - 3, /* argc */ + 9, /* nstack */ + 4, /* argc */ 2, /* varg */ 0, /* has upvals */ NULL, /* no upvals */ @@ -1164,15 +1164,16 @@ be_local_closure(Matter_Plugin_Root_init, /* name */ }), be_str_weak(init), &be_const_str_solidified, - ( &(const binstruction[ 8]) { /* code */ - 0x600C0003, // 0000 GETGBL R3 G3 - 0x5C100000, // 0001 MOVE R4 R0 - 0x7C0C0200, // 0002 CALL R3 1 - 0x8C0C0700, // 0003 GETMET R3 R3 K0 - 0x5C140200, // 0004 MOVE R5 R1 - 0x5C180400, // 0005 MOVE R6 R2 - 0x7C0C0600, // 0006 CALL R3 3 - 0x80000000, // 0007 RET 0 + ( &(const binstruction[ 9]) { /* code */ + 0x60100003, // 0000 GETGBL R4 G3 + 0x5C140000, // 0001 MOVE R5 R0 + 0x7C100200, // 0002 CALL R4 1 + 0x8C100900, // 0003 GETMET R4 R4 K0 + 0x5C180200, // 0004 MOVE R6 R1 + 0x5C1C0400, // 0005 MOVE R7 R2 + 0x5C200600, // 0006 MOVE R8 R3 + 0x7C100800, // 0007 CALL R4 4 + 0x80000000, // 0008 RET 0 }) ) ); @@ -2073,15 +2074,17 @@ extern const bclass be_class_Matter_Plugin; be_local_class(Matter_Plugin_Root, 0, &be_class_Matter_Plugin, - be_nested_map(6, + be_nested_map(7, ( (struct bmapnode*) &(const bmapnode[]) { - { be_const_key_weak(read_attribute, -1), be_const_closure(Matter_Plugin_Root_read_attribute_closure) }, - { be_const_key_weak(write_attribute, -1), be_const_closure(Matter_Plugin_Root_write_attribute_closure) }, + { be_const_key_weak(read_attribute, 2), be_const_closure(Matter_Plugin_Root_read_attribute_closure) }, + { be_const_key_weak(NAME, -1), be_nested_str_weak(root) }, + { be_const_key_weak(invoke_request, 6), be_const_closure(Matter_Plugin_Root_invoke_request_closure) }, { be_const_key_weak(TYPES, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { be_const_map( * be_nested_map(1, ( (struct bmapnode*) &(const bmapnode[]) { { be_const_key_int(22, -1), be_const_int(1) }, })) ) } )) }, + { be_const_key_weak(write_attribute, -1), be_const_closure(Matter_Plugin_Root_write_attribute_closure) }, { be_const_key_weak(init, -1), be_const_closure(Matter_Plugin_Root_init_closure) }, { be_const_key_weak(CLUSTERS, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { be_const_map( * be_nested_map(13, @@ -2186,7 +2189,6 @@ be_local_class(Matter_Plugin_Root, be_const_int(8), })) ) } )) }, })) ) } )) }, - { be_const_key_weak(invoke_request, -1), be_const_closure(Matter_Plugin_Root_invoke_request_closure) }, })), be_str_weak(Matter_Plugin_Root) ); diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor.h index f38d1d6d6..8d7e7df1c 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor.h @@ -30,6 +30,118 @@ be_local_closure(Matter_Plugin_Sensor_pre_value, /* name */ /*******************************************************************/ +/******************************************************************** +** Solidified function: init +********************************************************************/ +be_local_closure(Matter_Plugin_Sensor_init, /* name */ + be_nested_proto( + 9, /* nstack */ + 4, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 8]) { /* constants */ + /* K0 */ be_nested_str_weak(init), + /* K1 */ be_nested_str_weak(tasmota_sensor_filter), + /* K2 */ be_nested_str_weak(find), + /* K3 */ be_nested_str_weak(filter), + /* K4 */ be_nested_str_weak(tasmota_sensor_matcher), + /* K5 */ be_nested_str_weak(tasmota), + /* K6 */ be_nested_str_weak(Rule_Matcher), + /* K7 */ be_nested_str_weak(parse), + }), + be_str_weak(init), + &be_const_str_solidified, + ( &(const binstruction[21]) { /* code */ + 0x60100003, // 0000 GETGBL R4 G3 + 0x5C140000, // 0001 MOVE R5 R0 + 0x7C100200, // 0002 CALL R4 1 + 0x8C100900, // 0003 GETMET R4 R4 K0 + 0x5C180200, // 0004 MOVE R6 R1 + 0x5C1C0400, // 0005 MOVE R7 R2 + 0x5C200600, // 0006 MOVE R8 R3 + 0x7C100800, // 0007 CALL R4 4 + 0x8C100702, // 0008 GETMET R4 R3 K2 + 0x58180003, // 0009 LDCONST R6 K3 + 0x7C100400, // 000A CALL R4 2 + 0x90020204, // 000B SETMBR R0 K1 R4 + 0x88100101, // 000C GETMBR R4 R0 K1 + 0x78120005, // 000D JMPF R4 #0014 + 0xB8120A00, // 000E GETNGBL R4 K5 + 0x88100906, // 000F GETMBR R4 R4 K6 + 0x8C100907, // 0010 GETMET R4 R4 K7 + 0x88180101, // 0011 GETMBR R6 R0 K1 + 0x7C100400, // 0012 CALL R4 2 + 0x90020804, // 0013 SETMBR R0 K4 R4 + 0x80000000, // 0014 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: to_json_parameters +********************************************************************/ +be_local_closure(Matter_Plugin_Sensor_to_json_parameters, /* name */ + be_nested_proto( + 7, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 4]) { /* constants */ + /* K0 */ be_nested_str_weak(string), + /* K1 */ be_nested_str_weak(format), + /* K2 */ be_nested_str_weak(_X2C_X22filter_X22_X3A_X22_X25s_X22), + /* K3 */ be_nested_str_weak(tasmota_sensor_filter), + }), + be_str_weak(to_json_parameters), + &be_const_str_solidified, + ( &(const binstruction[ 7]) { /* code */ + 0xA40A0000, // 0000 IMPORT R2 K0 + 0x8C0C0501, // 0001 GETMET R3 R2 K1 + 0x58140002, // 0002 LDCONST R5 K2 + 0x88180103, // 0003 GETMBR R6 R0 K3 + 0x7C0C0600, // 0004 CALL R3 3 + 0x00040203, // 0005 ADD R1 R1 R3 + 0x80040200, // 0006 RET 1 R1 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: valued_changed +********************************************************************/ +be_local_closure(Matter_Plugin_Sensor_valued_changed, /* name */ + be_nested_proto( + 2, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 0, /* has constants */ + NULL, /* no const */ + be_str_weak(valued_changed), + &be_const_str_solidified, + ( &(const binstruction[ 1]) { /* code */ + 0x80000000, // 0000 RET 0 + }) + ) +); +/*******************************************************************/ + + /******************************************************************** ** Solidified function: parse_sensors ********************************************************************/ @@ -80,75 +192,6 @@ be_local_closure(Matter_Plugin_Sensor_parse_sensors, /* name */ /*******************************************************************/ -/******************************************************************** -** Solidified function: valued_changed -********************************************************************/ -be_local_closure(Matter_Plugin_Sensor_valued_changed, /* name */ - be_nested_proto( - 2, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 0, /* has constants */ - NULL, /* no const */ - be_str_weak(valued_changed), - &be_const_str_solidified, - ( &(const binstruction[ 1]) { /* code */ - 0x80000000, // 0000 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: init -********************************************************************/ -be_local_closure(Matter_Plugin_Sensor_init, /* name */ - be_nested_proto( - 8, /* nstack */ - 4, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 6]) { /* constants */ - /* K0 */ be_nested_str_weak(init), - /* K1 */ be_nested_str_weak(tasmota_sensor_filter), - /* K2 */ be_nested_str_weak(tasmota_sensor_matcher), - /* K3 */ be_nested_str_weak(tasmota), - /* K4 */ be_nested_str_weak(Rule_Matcher), - /* K5 */ be_nested_str_weak(parse), - }), - be_str_weak(init), - &be_const_str_solidified, - ( &(const binstruction[15]) { /* code */ - 0x60100003, // 0000 GETGBL R4 G3 - 0x5C140000, // 0001 MOVE R5 R0 - 0x7C100200, // 0002 CALL R4 1 - 0x8C100900, // 0003 GETMET R4 R4 K0 - 0x5C180200, // 0004 MOVE R6 R1 - 0x5C1C0400, // 0005 MOVE R7 R2 - 0x7C100600, // 0006 CALL R4 3 - 0x90020203, // 0007 SETMBR R0 K1 R3 - 0xB8120600, // 0008 GETNGBL R4 K3 - 0x88100904, // 0009 GETMBR R4 R4 K4 - 0x8C100905, // 000A GETMET R4 R4 K5 - 0x5C180600, // 000B MOVE R6 R3 - 0x7C100400, // 000C CALL R4 2 - 0x90020404, // 000D SETMBR R0 K2 R4 - 0x80000000, // 000E RET 0 - }) - ) -); -/*******************************************************************/ - - /******************************************************************** ** Solidified class: Matter_Plugin_Sensor ********************************************************************/ @@ -156,15 +199,16 @@ extern const bclass be_class_Matter_Plugin_Device; be_local_class(Matter_Plugin_Sensor, 3, &be_class_Matter_Plugin_Device, - be_nested_map(7, + be_nested_map(8, ( (struct bmapnode*) &(const bmapnode[]) { - { be_const_key_weak(tasmota_sensor_matcher, -1), be_const_var(1) }, - { be_const_key_weak(pre_value, 2), be_const_closure(Matter_Plugin_Sensor_pre_value_closure) }, + { be_const_key_weak(pre_value, -1), be_const_closure(Matter_Plugin_Sensor_pre_value_closure) }, { be_const_key_weak(parse_sensors, -1), be_const_closure(Matter_Plugin_Sensor_parse_sensors_closure) }, + { be_const_key_weak(tasmota_sensor_filter, 7), be_const_var(0) }, + { be_const_key_weak(init, 6), be_const_closure(Matter_Plugin_Sensor_init_closure) }, + { be_const_key_weak(to_json_parameters, 1), be_const_closure(Matter_Plugin_Sensor_to_json_parameters_closure) }, + { be_const_key_weak(valued_changed, -1), be_const_closure(Matter_Plugin_Sensor_valued_changed_closure) }, { be_const_key_weak(shadow_value, -1), be_const_var(2) }, - { be_const_key_weak(tasmota_sensor_filter, 3), be_const_var(0) }, - { be_const_key_weak(init, -1), be_const_closure(Matter_Plugin_Sensor_init_closure) }, - { be_const_key_weak(valued_changed, 0), be_const_closure(Matter_Plugin_Sensor_valued_changed_closure) }, + { be_const_key_weak(tasmota_sensor_matcher, -1), be_const_var(1) }, })), be_str_weak(Matter_Plugin_Sensor) ); diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor_Humidity.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor_Humidity.h index 88c5d7c55..f04c97ac6 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor_Humidity.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor_Humidity.h @@ -6,6 +6,34 @@ extern const bclass be_class_Matter_Plugin_Sensor_Humidity; +/******************************************************************** +** Solidified function: pre_value +********************************************************************/ +be_local_closure(Matter_Plugin_Sensor_Humidity_pre_value, /* name */ + be_nested_proto( + 4, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 0, /* has constants */ + NULL, /* no const */ + be_str_weak(pre_value), + &be_const_str_solidified, + ( &(const binstruction[ 5]) { /* code */ + 0x60080009, // 0000 GETGBL R2 G9 + 0x540E0063, // 0001 LDINT R3 100 + 0x080C0203, // 0002 MUL R3 R1 R3 + 0x7C080200, // 0003 CALL R2 1 + 0x80040400, // 0004 RET 1 R2 + }) + ) +); +/*******************************************************************/ + + /******************************************************************** ** Solidified function: valued_changed ********************************************************************/ @@ -38,34 +66,6 @@ be_local_closure(Matter_Plugin_Sensor_Humidity_valued_changed, /* name */ /*******************************************************************/ -/******************************************************************** -** Solidified function: pre_value -********************************************************************/ -be_local_closure(Matter_Plugin_Sensor_Humidity_pre_value, /* name */ - be_nested_proto( - 4, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 0, /* has constants */ - NULL, /* no const */ - be_str_weak(pre_value), - &be_const_str_solidified, - ( &(const binstruction[ 5]) { /* code */ - 0x60080009, // 0000 GETGBL R2 G9 - 0x540E0063, // 0001 LDINT R3 100 - 0x080C0203, // 0002 MUL R3 R1 R3 - 0x7C080200, // 0003 CALL R2 1 - 0x80040400, // 0004 RET 1 R2 - }) - ) -); -/*******************************************************************/ - - /******************************************************************** ** Solidified function: read_attribute ********************************************************************/ @@ -183,16 +183,16 @@ extern const bclass be_class_Matter_Plugin_Sensor; be_local_class(Matter_Plugin_Sensor_Humidity, 0, &be_class_Matter_Plugin_Sensor, - be_nested_map(5, + be_nested_map(6, ( (struct bmapnode*) &(const bmapnode[]) { - { be_const_key_weak(valued_changed, 3), be_const_closure(Matter_Plugin_Sensor_Humidity_valued_changed_closure) }, - { be_const_key_weak(pre_value, -1), be_const_closure(Matter_Plugin_Sensor_Humidity_pre_value_closure) }, + { be_const_key_weak(NAME, 1), be_nested_str_weak(humidity) }, { be_const_key_weak(read_attribute, -1), be_const_closure(Matter_Plugin_Sensor_Humidity_read_attribute_closure) }, - { be_const_key_weak(TYPES, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { + { be_const_key_weak(TYPES, 5), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { be_const_map( * be_nested_map(1, ( (struct bmapnode*) &(const bmapnode[]) { { be_const_key_int(775, -1), be_const_int(2) }, })) ) } )) }, + { be_const_key_weak(valued_changed, -1), be_const_closure(Matter_Plugin_Sensor_Humidity_valued_changed_closure) }, { be_const_key_weak(CLUSTERS, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { be_const_map( * be_nested_map(1, ( (struct bmapnode*) &(const bmapnode[]) { @@ -206,6 +206,7 @@ be_local_class(Matter_Plugin_Sensor_Humidity, be_const_int(65533), })) ) } )) }, })) ) } )) }, + { be_const_key_weak(pre_value, -1), be_const_closure(Matter_Plugin_Sensor_Humidity_pre_value_closure) }, })), be_str_weak(Matter_Plugin_Sensor_Humidity) ); diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor_Light.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor_Illuminance.h similarity index 87% rename from lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor_Light.h rename to lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor_Illuminance.h index 4cc5a9cd9..b45eb5f90 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor_Light.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor_Illuminance.h @@ -1,15 +1,42 @@ -/* Solidification of Matter_Plugin_Sensor_Light.h */ +/* Solidification of Matter_Plugin_Sensor_Illuminance.h */ /********************************************************************\ * Generated code, don't edit * \********************************************************************/ #include "be_constobj.h" -extern const bclass be_class_Matter_Plugin_Sensor_Light; +extern const bclass be_class_Matter_Plugin_Sensor_Illuminance; + +/******************************************************************** +** Solidified function: pre_value +********************************************************************/ +be_local_closure(Matter_Plugin_Sensor_Illuminance_pre_value, /* name */ + be_nested_proto( + 4, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 0, /* has constants */ + NULL, /* no const */ + be_str_weak(pre_value), + &be_const_str_solidified, + ( &(const binstruction[ 4]) { /* code */ + 0x60080009, // 0000 GETGBL R2 G9 + 0x5C0C0200, // 0001 MOVE R3 R1 + 0x7C080200, // 0002 CALL R2 1 + 0x80040400, // 0003 RET 1 R2 + }) + ) +); +/*******************************************************************/ + /******************************************************************** ** Solidified function: valued_changed ********************************************************************/ -be_local_closure(Matter_Plugin_Sensor_Light_valued_changed, /* name */ +be_local_closure(Matter_Plugin_Sensor_Illuminance_valued_changed, /* name */ be_nested_proto( 7, /* nstack */ 2, /* argc */ @@ -38,37 +65,10 @@ be_local_closure(Matter_Plugin_Sensor_Light_valued_changed, /* name */ /*******************************************************************/ -/******************************************************************** -** Solidified function: pre_value -********************************************************************/ -be_local_closure(Matter_Plugin_Sensor_Light_pre_value, /* name */ - be_nested_proto( - 4, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 0, /* has constants */ - NULL, /* no const */ - be_str_weak(pre_value), - &be_const_str_solidified, - ( &(const binstruction[ 4]) { /* code */ - 0x60080009, // 0000 GETGBL R2 G9 - 0x5C0C0200, // 0001 MOVE R3 R1 - 0x7C080200, // 0002 CALL R2 1 - 0x80040400, // 0003 RET 1 R2 - }) - ) -); -/*******************************************************************/ - - /******************************************************************** ** Solidified function: read_attribute ********************************************************************/ -be_local_closure(Matter_Plugin_Sensor_Light_read_attribute, /* name */ +be_local_closure(Matter_Plugin_Sensor_Illuminance_read_attribute, /* name */ be_nested_proto( 12, /* nstack */ 3, /* argc */ @@ -176,22 +176,22 @@ be_local_closure(Matter_Plugin_Sensor_Light_read_attribute, /* name */ /******************************************************************** -** Solidified class: Matter_Plugin_Sensor_Light +** Solidified class: Matter_Plugin_Sensor_Illuminance ********************************************************************/ extern const bclass be_class_Matter_Plugin_Sensor; -be_local_class(Matter_Plugin_Sensor_Light, +be_local_class(Matter_Plugin_Sensor_Illuminance, 0, &be_class_Matter_Plugin_Sensor, - be_nested_map(5, + be_nested_map(6, ( (struct bmapnode*) &(const bmapnode[]) { - { be_const_key_weak(valued_changed, 3), be_const_closure(Matter_Plugin_Sensor_Light_valued_changed_closure) }, - { be_const_key_weak(pre_value, -1), be_const_closure(Matter_Plugin_Sensor_Light_pre_value_closure) }, - { be_const_key_weak(read_attribute, -1), be_const_closure(Matter_Plugin_Sensor_Light_read_attribute_closure) }, - { be_const_key_weak(TYPES, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { + { be_const_key_weak(NAME, 1), be_nested_str_weak(illuminance) }, + { be_const_key_weak(read_attribute, -1), be_const_closure(Matter_Plugin_Sensor_Illuminance_read_attribute_closure) }, + { be_const_key_weak(TYPES, 5), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { be_const_map( * be_nested_map(1, ( (struct bmapnode*) &(const bmapnode[]) { { be_const_key_int(262, -1), be_const_int(2) }, })) ) } )) }, + { be_const_key_weak(valued_changed, -1), be_const_closure(Matter_Plugin_Sensor_Illuminance_valued_changed_closure) }, { be_const_key_weak(CLUSTERS, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { be_const_map( * be_nested_map(1, ( (struct bmapnode*) &(const bmapnode[]) { @@ -205,14 +205,15 @@ be_local_class(Matter_Plugin_Sensor_Light, be_const_int(65533), })) ) } )) }, })) ) } )) }, + { be_const_key_weak(pre_value, -1), be_const_closure(Matter_Plugin_Sensor_Illuminance_pre_value_closure) }, })), - be_str_weak(Matter_Plugin_Sensor_Light) + be_str_weak(Matter_Plugin_Sensor_Illuminance) ); /*******************************************************************/ -void be_load_Matter_Plugin_Sensor_Light_class(bvm *vm) { - be_pushntvclass(vm, &be_class_Matter_Plugin_Sensor_Light); - be_setglobal(vm, "Matter_Plugin_Sensor_Light"); +void be_load_Matter_Plugin_Sensor_Illuminance_class(bvm *vm) { + be_pushntvclass(vm, &be_class_Matter_Plugin_Sensor_Illuminance); + be_setglobal(vm, "Matter_Plugin_Sensor_Illuminance"); be_pop(vm, 1); } /********************************************************************/ diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor_Pressure.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor_Pressure.h index 7918e7e0d..61968c3c1 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor_Pressure.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor_Pressure.h @@ -6,6 +6,33 @@ extern const bclass be_class_Matter_Plugin_Sensor_Pressure; +/******************************************************************** +** Solidified function: pre_value +********************************************************************/ +be_local_closure(Matter_Plugin_Sensor_Pressure_pre_value, /* name */ + be_nested_proto( + 4, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 0, /* has constants */ + NULL, /* no const */ + be_str_weak(pre_value), + &be_const_str_solidified, + ( &(const binstruction[ 4]) { /* code */ + 0x60080009, // 0000 GETGBL R2 G9 + 0x5C0C0200, // 0001 MOVE R3 R1 + 0x7C080200, // 0002 CALL R2 1 + 0x80040400, // 0003 RET 1 R2 + }) + ) +); +/*******************************************************************/ + + /******************************************************************** ** Solidified function: valued_changed ********************************************************************/ @@ -38,33 +65,6 @@ be_local_closure(Matter_Plugin_Sensor_Pressure_valued_changed, /* name */ /*******************************************************************/ -/******************************************************************** -** Solidified function: pre_value -********************************************************************/ -be_local_closure(Matter_Plugin_Sensor_Pressure_pre_value, /* name */ - be_nested_proto( - 4, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 0, /* has constants */ - NULL, /* no const */ - be_str_weak(pre_value), - &be_const_str_solidified, - ( &(const binstruction[ 4]) { /* code */ - 0x60080009, // 0000 GETGBL R2 G9 - 0x5C0C0200, // 0001 MOVE R3 R1 - 0x7C080200, // 0002 CALL R2 1 - 0x80040400, // 0003 RET 1 R2 - }) - ) -); -/*******************************************************************/ - - /******************************************************************** ** Solidified function: read_attribute ********************************************************************/ @@ -182,16 +182,16 @@ extern const bclass be_class_Matter_Plugin_Sensor; be_local_class(Matter_Plugin_Sensor_Pressure, 0, &be_class_Matter_Plugin_Sensor, - be_nested_map(5, + be_nested_map(6, ( (struct bmapnode*) &(const bmapnode[]) { - { be_const_key_weak(valued_changed, 3), be_const_closure(Matter_Plugin_Sensor_Pressure_valued_changed_closure) }, - { be_const_key_weak(pre_value, -1), be_const_closure(Matter_Plugin_Sensor_Pressure_pre_value_closure) }, + { be_const_key_weak(NAME, 1), be_nested_str_weak(pressure) }, { be_const_key_weak(read_attribute, -1), be_const_closure(Matter_Plugin_Sensor_Pressure_read_attribute_closure) }, - { be_const_key_weak(TYPES, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { + { be_const_key_weak(TYPES, 5), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { be_const_map( * be_nested_map(1, ( (struct bmapnode*) &(const bmapnode[]) { { be_const_key_int(773, -1), be_const_int(2) }, })) ) } )) }, + { be_const_key_weak(valued_changed, -1), be_const_closure(Matter_Plugin_Sensor_Pressure_valued_changed_closure) }, { be_const_key_weak(CLUSTERS, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { be_const_map( * be_nested_map(1, ( (struct bmapnode*) &(const bmapnode[]) { @@ -205,6 +205,7 @@ be_local_class(Matter_Plugin_Sensor_Pressure, be_const_int(65533), })) ) } )) }, })) ) } )) }, + { be_const_key_weak(pre_value, -1), be_const_closure(Matter_Plugin_Sensor_Pressure_pre_value_closure) }, })), be_str_weak(Matter_Plugin_Sensor_Pressure) ); diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor_Temp.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor_Temp.h index 99d00d696..85e4d894a 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor_Temp.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor_Temp.h @@ -6,6 +6,34 @@ extern const bclass be_class_Matter_Plugin_Sensor_Temp; +/******************************************************************** +** Solidified function: pre_value +********************************************************************/ +be_local_closure(Matter_Plugin_Sensor_Temp_pre_value, /* name */ + be_nested_proto( + 4, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 0, /* has constants */ + NULL, /* no const */ + be_str_weak(pre_value), + &be_const_str_solidified, + ( &(const binstruction[ 5]) { /* code */ + 0x60080009, // 0000 GETGBL R2 G9 + 0x540E0063, // 0001 LDINT R3 100 + 0x080C0203, // 0002 MUL R3 R1 R3 + 0x7C080200, // 0003 CALL R2 1 + 0x80040400, // 0004 RET 1 R2 + }) + ) +); +/*******************************************************************/ + + /******************************************************************** ** Solidified function: valued_changed ********************************************************************/ @@ -38,34 +66,6 @@ be_local_closure(Matter_Plugin_Sensor_Temp_valued_changed, /* name */ /*******************************************************************/ -/******************************************************************** -** Solidified function: pre_value -********************************************************************/ -be_local_closure(Matter_Plugin_Sensor_Temp_pre_value, /* name */ - be_nested_proto( - 4, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 0, /* has constants */ - NULL, /* no const */ - be_str_weak(pre_value), - &be_const_str_solidified, - ( &(const binstruction[ 5]) { /* code */ - 0x60080009, // 0000 GETGBL R2 G9 - 0x540E0063, // 0001 LDINT R3 100 - 0x080C0203, // 0002 MUL R3 R1 R3 - 0x7C080200, // 0003 CALL R2 1 - 0x80040400, // 0004 RET 1 R2 - }) - ) -); -/*******************************************************************/ - - /******************************************************************** ** Solidified function: read_attribute ********************************************************************/ @@ -180,27 +180,30 @@ extern const bclass be_class_Matter_Plugin_Sensor; be_local_class(Matter_Plugin_Sensor_Temp, 0, &be_class_Matter_Plugin_Sensor, - be_nested_map(5, + be_nested_map(6, ( (struct bmapnode*) &(const bmapnode[]) { - { be_const_key_weak(valued_changed, 3), be_const_closure(Matter_Plugin_Sensor_Temp_valued_changed_closure) }, - { be_const_key_weak(pre_value, -1), be_const_closure(Matter_Plugin_Sensor_Temp_pre_value_closure) }, + { be_const_key_weak(NAME, 1), be_nested_str_weak(temperature) }, { be_const_key_weak(read_attribute, -1), be_const_closure(Matter_Plugin_Sensor_Temp_read_attribute_closure) }, - { be_const_key_weak(TYPES, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { + { be_const_key_weak(TYPES, 5), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { be_const_map( * be_nested_map(1, ( (struct bmapnode*) &(const bmapnode[]) { { be_const_key_int(770, -1), be_const_int(2) }, })) ) } )) }, + { be_const_key_weak(valued_changed, -1), be_const_closure(Matter_Plugin_Sensor_Temp_valued_changed_closure) }, { be_const_key_weak(CLUSTERS, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { be_const_map( * be_nested_map(1, ( (struct bmapnode*) &(const bmapnode[]) { { be_const_key_int(1026, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_list, { - be_const_list( * be_nested_list(3, + be_const_list( * be_nested_list(5, ( (struct bvalue*) &(const bvalue[]) { be_const_int(0), be_const_int(1), be_const_int(2), + be_const_int(65532), + be_const_int(65533), })) ) } )) }, })) ) } )) }, + { be_const_key_weak(pre_value, -1), be_const_closure(Matter_Plugin_Sensor_Temp_pre_value_closure) }, })), be_str_weak(Matter_Plugin_Sensor_Temp) ); diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Session_Store.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Session_Store.h index e8a56c331..2417ab096 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Session_Store.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Session_Store.h @@ -7,11 +7,11 @@ extern const bclass be_class_Matter_Session_Store; /******************************************************************** -** Solidified function: gen_local_session_id +** Solidified function: create_fabric ********************************************************************/ -be_local_closure(Matter_Session_Store_gen_local_session_id, /* name */ +be_local_closure(Matter_Session_Store_create_fabric, /* name */ be_nested_proto( - 6, /* nstack */ + 4, /* nstack */ 1, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -19,36 +19,69 @@ be_local_closure(Matter_Session_Store_gen_local_session_id, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[ 6]) { /* constants */ - /* K0 */ be_nested_str_weak(crypto), - /* K1 */ be_nested_str_weak(random), - /* K2 */ be_const_int(2), - /* K3 */ be_nested_str_weak(get), - /* K4 */ be_const_int(0), - /* K5 */ be_nested_str_weak(get_session_by_local_session_id), + ( &(const bvalue[ 2]) { /* constants */ + /* K0 */ be_nested_str_weak(matter), + /* K1 */ be_nested_str_weak(Fabric), }), - be_str_weak(gen_local_session_id), + be_str_weak(create_fabric), &be_const_str_solidified, - ( &(const binstruction[19]) { /* code */ - 0xA4060000, // 0000 IMPORT R1 K0 - 0x50080200, // 0001 LDBOOL R2 1 0 - 0x780A000E, // 0002 JMPF R2 #0012 - 0x8C080301, // 0003 GETMET R2 R1 K1 - 0x58100002, // 0004 LDCONST R4 K2 - 0x7C080400, // 0005 CALL R2 2 - 0x8C080503, // 0006 GETMET R2 R2 K3 - 0x58100004, // 0007 LDCONST R4 K4 - 0x58140002, // 0008 LDCONST R5 K2 - 0x7C080600, // 0009 CALL R2 3 - 0x8C0C0105, // 000A GETMET R3 R0 K5 - 0x5C140400, // 000B MOVE R5 R2 - 0x7C0C0400, // 000C CALL R3 2 - 0x4C100000, // 000D LDNIL R4 - 0x1C0C0604, // 000E EQ R3 R3 R4 - 0x780E0000, // 000F JMPF R3 #0011 - 0x80040400, // 0010 RET 1 R2 - 0x7001FFEE, // 0011 JMP #0001 - 0x80000000, // 0012 RET 0 + ( &(const binstruction[ 5]) { /* code */ + 0xB8060000, // 0000 GETNGBL R1 K0 + 0x8C040301, // 0001 GETMET R1 R1 K1 + 0x5C0C0000, // 0002 MOVE R3 R0 + 0x7C040400, // 0003 CALL R1 2 + 0x80040200, // 0004 RET 1 R1 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: get_session_by_source_node_id +********************************************************************/ +be_local_closure(Matter_Session_Store_get_session_by_source_node_id, /* name */ + be_nested_proto( + 8, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 5]) { /* constants */ + /* K0 */ be_nested_str_weak(sessions), + /* K1 */ be_const_int(0), + /* K2 */ be_nested_str_weak(_source_node_id), + /* K3 */ be_nested_str_weak(update), + /* K4 */ be_const_int(1), + }), + be_str_weak(get_session_by_source_node_id), + &be_const_str_solidified, + ( &(const binstruction[22]) { /* code */ + 0x4C080000, // 0000 LDNIL R2 + 0x1C080202, // 0001 EQ R2 R1 R2 + 0x780A0001, // 0002 JMPF R2 #0005 + 0x4C080000, // 0003 LDNIL R2 + 0x80040400, // 0004 RET 1 R2 + 0x6008000C, // 0005 GETGBL R2 G12 + 0x880C0100, // 0006 GETMBR R3 R0 K0 + 0x7C080200, // 0007 CALL R2 1 + 0x580C0001, // 0008 LDCONST R3 K1 + 0x88100100, // 0009 GETMBR R4 R0 K0 + 0x14140602, // 000A LT R5 R3 R2 + 0x78160008, // 000B JMPF R5 #0015 + 0x94140803, // 000C GETIDX R5 R4 R3 + 0x88180B02, // 000D GETMBR R6 R5 K2 + 0x1C180C01, // 000E EQ R6 R6 R1 + 0x781A0002, // 000F JMPF R6 #0013 + 0x8C180B03, // 0010 GETMET R6 R5 K3 + 0x7C180200, // 0011 CALL R6 1 + 0x80040A00, // 0012 RET 1 R5 + 0x000C0704, // 0013 ADD R3 R3 K4 + 0x7001FFF4, // 0014 JMP #000A + 0x80000000, // 0015 RET 0 }) ) ); @@ -112,298 +145,9 @@ be_local_closure(Matter_Session_Store_remove_redundant_fabric, /* name */ /******************************************************************** -** Solidified function: find_session_by_resumption_id +** Solidified function: active_fabrics ********************************************************************/ -be_local_closure(Matter_Session_Store_find_session_by_resumption_id, /* name */ - be_nested_proto( - 14, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[13]) { /* constants */ - /* K0 */ be_nested_str_weak(string), - /* K1 */ be_const_int(0), - /* K2 */ be_nested_str_weak(sessions), - /* K3 */ be_nested_str_weak(tasmota), - /* K4 */ be_nested_str_weak(log), - /* K5 */ be_nested_str_weak(format), - /* K6 */ be_nested_str_weak(MTR_X3A_X20session_X2Eresumption_id_X3D_X25s_X20vs_X20_X25s), - /* K7 */ be_nested_str_weak(resumption_id), - /* K8 */ be_const_int(3), - /* K9 */ be_nested_str_weak(shared_secret), - /* K10 */ be_nested_str_weak(MTR_X3A_X20session_X2Eshared_secret_X3D_X25s), - /* K11 */ be_nested_str_weak(update), - /* K12 */ be_const_int(1), - }), - be_str_weak(find_session_by_resumption_id), - &be_const_str_solidified, - ( &(const binstruction[49]) { /* code */ - 0xA40A0000, // 0000 IMPORT R2 K0 - 0x5C0C0200, // 0001 MOVE R3 R1 - 0x740E0001, // 0002 JMPT R3 #0005 - 0x4C0C0000, // 0003 LDNIL R3 - 0x80040600, // 0004 RET 1 R3 - 0x580C0001, // 0005 LDCONST R3 K1 - 0x88100102, // 0006 GETMBR R4 R0 K2 - 0x6014000C, // 0007 GETGBL R5 G12 - 0x5C180800, // 0008 MOVE R6 R4 - 0x7C140200, // 0009 CALL R5 1 - 0x14140605, // 000A LT R5 R3 R5 - 0x78160023, // 000B JMPF R5 #0030 - 0x94140803, // 000C GETIDX R5 R4 R3 - 0xB81A0600, // 000D GETNGBL R6 K3 - 0x8C180D04, // 000E GETMET R6 R6 K4 - 0x8C200505, // 000F GETMET R8 R2 K5 - 0x58280006, // 0010 LDCONST R10 K6 - 0x602C0008, // 0011 GETGBL R11 G8 - 0x88300B07, // 0012 GETMBR R12 R5 K7 - 0x7C2C0200, // 0013 CALL R11 1 - 0x60300008, // 0014 GETGBL R12 G8 - 0x5C340200, // 0015 MOVE R13 R1 - 0x7C300200, // 0016 CALL R12 1 - 0x7C200800, // 0017 CALL R8 4 - 0x58240008, // 0018 LDCONST R9 K8 - 0x7C180600, // 0019 CALL R6 3 - 0x88180B07, // 001A GETMBR R6 R5 K7 - 0x1C180C01, // 001B EQ R6 R6 R1 - 0x781A0010, // 001C JMPF R6 #002E - 0x88180B09, // 001D GETMBR R6 R5 K9 - 0x4C1C0000, // 001E LDNIL R7 - 0x20180C07, // 001F NE R6 R6 R7 - 0x781A000C, // 0020 JMPF R6 #002E - 0xB81A0600, // 0021 GETNGBL R6 K3 - 0x8C180D04, // 0022 GETMET R6 R6 K4 - 0x8C200505, // 0023 GETMET R8 R2 K5 - 0x5828000A, // 0024 LDCONST R10 K10 - 0x602C0008, // 0025 GETGBL R11 G8 - 0x88300B09, // 0026 GETMBR R12 R5 K9 - 0x7C2C0200, // 0027 CALL R11 1 - 0x7C200600, // 0028 CALL R8 3 - 0x58240008, // 0029 LDCONST R9 K8 - 0x7C180600, // 002A CALL R6 3 - 0x8C180B0B, // 002B GETMET R6 R5 K11 - 0x7C180200, // 002C CALL R6 1 - 0x80040A00, // 002D RET 1 R5 - 0x000C070C, // 002E ADD R3 R3 K12 - 0x7001FFD6, // 002F JMP #0007 - 0x80000000, // 0030 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: remove_fabric -********************************************************************/ -be_local_closure(Matter_Session_Store_remove_fabric, /* name */ - be_nested_proto( - 8, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 7]) { /* constants */ - /* K0 */ be_const_int(0), - /* K1 */ be_nested_str_weak(sessions), - /* K2 */ be_nested_str_weak(_fabric), - /* K3 */ be_nested_str_weak(remove), - /* K4 */ be_const_int(1), - /* K5 */ be_nested_str_weak(fabrics), - /* K6 */ be_nested_str_weak(find), - }), - be_str_weak(remove_fabric), - &be_const_str_solidified, - ( &(const binstruction[26]) { /* code */ - 0x58080000, // 0000 LDCONST R2 K0 - 0x600C000C, // 0001 GETGBL R3 G12 - 0x88100101, // 0002 GETMBR R4 R0 K1 - 0x7C0C0200, // 0003 CALL R3 1 - 0x140C0403, // 0004 LT R3 R2 R3 - 0x780E000B, // 0005 JMPF R3 #0012 - 0x880C0101, // 0006 GETMBR R3 R0 K1 - 0x940C0602, // 0007 GETIDX R3 R3 R2 - 0x880C0702, // 0008 GETMBR R3 R3 K2 - 0x1C0C0601, // 0009 EQ R3 R3 R1 - 0x780E0004, // 000A JMPF R3 #0010 - 0x880C0101, // 000B GETMBR R3 R0 K1 - 0x8C0C0703, // 000C GETMET R3 R3 K3 - 0x5C140400, // 000D MOVE R5 R2 - 0x7C0C0400, // 000E CALL R3 2 - 0x70020000, // 000F JMP #0011 - 0x00080504, // 0010 ADD R2 R2 K4 - 0x7001FFEE, // 0011 JMP #0001 - 0x880C0105, // 0012 GETMBR R3 R0 K5 - 0x8C0C0703, // 0013 GETMET R3 R3 K3 - 0x88140105, // 0014 GETMBR R5 R0 K5 - 0x8C140B06, // 0015 GETMET R5 R5 K6 - 0x5C1C0200, // 0016 MOVE R7 R1 - 0x7C140400, // 0017 CALL R5 2 - 0x7C0C0400, // 0018 CALL R3 2 - 0x80000000, // 0019 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: find_session_source_id_unsecure -********************************************************************/ -be_local_closure(Matter_Session_Store_find_session_source_id_unsecure, /* name */ - be_nested_proto( - 9, /* nstack */ - 3, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 9]) { /* constants */ - /* K0 */ be_nested_str_weak(get_session_by_source_node_id), - /* K1 */ be_nested_str_weak(matter), - /* K2 */ be_nested_str_weak(Session), - /* K3 */ be_const_int(0), - /* K4 */ be_nested_str_weak(_source_node_id), - /* K5 */ be_nested_str_weak(sessions), - /* K6 */ be_nested_str_weak(push), - /* K7 */ be_nested_str_weak(set_expire_in_seconds), - /* K8 */ be_nested_str_weak(update), - }), - be_str_weak(find_session_source_id_unsecure), - &be_const_str_solidified, - ( &(const binstruction[24]) { /* code */ - 0x8C0C0100, // 0000 GETMET R3 R0 K0 - 0x5C140200, // 0001 MOVE R5 R1 - 0x7C0C0400, // 0002 CALL R3 2 - 0x4C100000, // 0003 LDNIL R4 - 0x1C100604, // 0004 EQ R4 R3 R4 - 0x7812000E, // 0005 JMPF R4 #0015 - 0xB8120200, // 0006 GETNGBL R4 K1 - 0x8C100902, // 0007 GETMET R4 R4 K2 - 0x5C180000, // 0008 MOVE R6 R0 - 0x581C0003, // 0009 LDCONST R7 K3 - 0x58200003, // 000A LDCONST R8 K3 - 0x7C100800, // 000B CALL R4 4 - 0x5C0C0800, // 000C MOVE R3 R4 - 0x900E0801, // 000D SETMBR R3 K4 R1 - 0x88100105, // 000E GETMBR R4 R0 K5 - 0x8C100906, // 000F GETMET R4 R4 K6 - 0x5C180600, // 0010 MOVE R6 R3 - 0x7C100400, // 0011 CALL R4 2 - 0x8C100707, // 0012 GETMET R4 R3 K7 - 0x5C180400, // 0013 MOVE R6 R2 - 0x7C100400, // 0014 CALL R4 2 - 0x8C100708, // 0015 GETMET R4 R3 K8 - 0x7C100200, // 0016 CALL R4 1 - 0x80040600, // 0017 RET 1 R3 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: get_session_by_source_node_id -********************************************************************/ -be_local_closure(Matter_Session_Store_get_session_by_source_node_id, /* name */ - be_nested_proto( - 8, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 5]) { /* constants */ - /* K0 */ be_nested_str_weak(sessions), - /* K1 */ be_const_int(0), - /* K2 */ be_nested_str_weak(_source_node_id), - /* K3 */ be_nested_str_weak(update), - /* K4 */ be_const_int(1), - }), - be_str_weak(get_session_by_source_node_id), - &be_const_str_solidified, - ( &(const binstruction[22]) { /* code */ - 0x4C080000, // 0000 LDNIL R2 - 0x1C080202, // 0001 EQ R2 R1 R2 - 0x780A0001, // 0002 JMPF R2 #0005 - 0x4C080000, // 0003 LDNIL R2 - 0x80040400, // 0004 RET 1 R2 - 0x6008000C, // 0005 GETGBL R2 G12 - 0x880C0100, // 0006 GETMBR R3 R0 K0 - 0x7C080200, // 0007 CALL R2 1 - 0x580C0001, // 0008 LDCONST R3 K1 - 0x88100100, // 0009 GETMBR R4 R0 K0 - 0x14140602, // 000A LT R5 R3 R2 - 0x78160008, // 000B JMPF R5 #0015 - 0x94140803, // 000C GETIDX R5 R4 R3 - 0x88180B02, // 000D GETMBR R6 R5 K2 - 0x1C180C01, // 000E EQ R6 R6 R1 - 0x781A0002, // 000F JMPF R6 #0013 - 0x8C180B03, // 0010 GETMET R6 R5 K3 - 0x7C180200, // 0011 CALL R6 1 - 0x80040A00, // 0012 RET 1 R5 - 0x000C0704, // 0013 ADD R3 R3 K4 - 0x7001FFF4, // 0014 JMP #000A - 0x80000000, // 0015 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: add_session -********************************************************************/ -be_local_closure(Matter_Session_Store_add_session, /* name */ - be_nested_proto( - 6, /* nstack */ - 3, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 3]) { /* constants */ - /* K0 */ be_nested_str_weak(set_expire_in_seconds), - /* K1 */ be_nested_str_weak(sessions), - /* K2 */ be_nested_str_weak(push), - }), - be_str_weak(add_session), - &be_const_str_solidified, - ( &(const binstruction[11]) { /* code */ - 0x4C0C0000, // 0000 LDNIL R3 - 0x200C0403, // 0001 NE R3 R2 R3 - 0x780E0002, // 0002 JMPF R3 #0006 - 0x8C0C0300, // 0003 GETMET R3 R1 K0 - 0x5C140400, // 0004 MOVE R5 R2 - 0x7C0C0400, // 0005 CALL R3 2 - 0x880C0101, // 0006 GETMBR R3 R0 K1 - 0x8C0C0702, // 0007 GETMET R3 R3 K2 - 0x5C140200, // 0008 MOVE R5 R1 - 0x7C0C0400, // 0009 CALL R3 2 - 0x80000000, // 000A RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: count_active_fabrics -********************************************************************/ -be_local_closure(Matter_Session_Store_count_active_fabrics, /* name */ +be_local_closure(Matter_Session_Store_active_fabrics, /* name */ be_nested_proto( 3, /* nstack */ 1, /* argc */ @@ -416,9 +160,9 @@ be_local_closure(Matter_Session_Store_count_active_fabrics, /* name */ ( &(const bvalue[ 3]) { /* constants */ /* K0 */ be_nested_str_weak(remove_expired), /* K1 */ be_nested_str_weak(fabrics), - /* K2 */ be_nested_str_weak(count_persistables), + /* K2 */ be_nested_str_weak(persistables), }), - be_str_weak(count_active_fabrics), + be_str_weak(active_fabrics), &be_const_str_solidified, ( &(const binstruction[ 6]) { /* code */ 0x8C040100, // 0000 GETMET R1 R0 K0 @@ -433,40 +177,6 @@ be_local_closure(Matter_Session_Store_count_active_fabrics, /* name */ /*******************************************************************/ -/******************************************************************** -** Solidified function: remove_expired -********************************************************************/ -be_local_closure(Matter_Session_Store_remove_expired, /* name */ - be_nested_proto( - 3, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 3]) { /* constants */ - /* K0 */ be_nested_str_weak(sessions), - /* K1 */ be_nested_str_weak(every_second), - /* K2 */ be_nested_str_weak(fabrics), - }), - be_str_weak(remove_expired), - &be_const_str_solidified, - ( &(const binstruction[ 7]) { /* code */ - 0x88040100, // 0000 GETMBR R1 R0 K0 - 0x8C040301, // 0001 GETMET R1 R1 K1 - 0x7C040200, // 0002 CALL R1 1 - 0x88040102, // 0003 GETMBR R1 R0 K2 - 0x8C040301, // 0004 GETMET R1 R1 K1 - 0x7C040200, // 0005 CALL R1 1 - 0x80000000, // 0006 RET 0 - }) - ) -); -/*******************************************************************/ - - /******************************************************************** ** Solidified function: find_children_fabrics ********************************************************************/ @@ -562,52 +272,6 @@ be_local_closure(Matter_Session_Store_find_children_fabrics, /* name */ /*******************************************************************/ -/******************************************************************** -** Solidified function: find_fabric_by_index -********************************************************************/ -be_local_closure(Matter_Session_Store_find_fabric_by_index, /* name */ - be_nested_proto( - 6, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 3]) { /* constants */ - /* K0 */ be_nested_str_weak(active_fabrics), - /* K1 */ be_nested_str_weak(get_fabric_index), - /* K2 */ be_nested_str_weak(stop_iteration), - }), - be_str_weak(find_fabric_by_index), - &be_const_str_solidified, - ( &(const binstruction[19]) { /* code */ - 0x60080010, // 0000 GETGBL R2 G16 - 0x8C0C0100, // 0001 GETMET R3 R0 K0 - 0x7C0C0200, // 0002 CALL R3 1 - 0x7C080200, // 0003 CALL R2 1 - 0xA8020008, // 0004 EXBLK 0 #000E - 0x5C0C0400, // 0005 MOVE R3 R2 - 0x7C0C0000, // 0006 CALL R3 0 - 0x8C100701, // 0007 GETMET R4 R3 K1 - 0x7C100200, // 0008 CALL R4 1 - 0x1C100801, // 0009 EQ R4 R4 R1 - 0x78120001, // 000A JMPF R4 #000D - 0xA8040001, // 000B EXBLK 1 1 - 0x80040600, // 000C RET 1 R3 - 0x7001FFF6, // 000D JMP #0005 - 0x58080002, // 000E LDCONST R2 K2 - 0xAC080200, // 000F CATCH R2 1 0 - 0xB0080000, // 0010 RAISE 2 R0 R0 - 0x4C080000, // 0011 LDNIL R2 - 0x80040400, // 0012 RET 1 R2 - }) - ) -); -/*******************************************************************/ - - /******************************************************************** ** Solidified function: next_fabric_idx ********************************************************************/ @@ -663,385 +327,6 @@ be_local_closure(Matter_Session_Store_next_fabric_idx, /* name */ /*******************************************************************/ -/******************************************************************** -** Solidified function: get_session_by_local_session_id -********************************************************************/ -be_local_closure(Matter_Session_Store_get_session_by_local_session_id, /* name */ - be_nested_proto( - 8, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 5]) { /* constants */ - /* K0 */ be_nested_str_weak(sessions), - /* K1 */ be_const_int(0), - /* K2 */ be_nested_str_weak(local_session_id), - /* K3 */ be_nested_str_weak(update), - /* K4 */ be_const_int(1), - }), - be_str_weak(get_session_by_local_session_id), - &be_const_str_solidified, - ( &(const binstruction[22]) { /* code */ - 0x4C080000, // 0000 LDNIL R2 - 0x1C080202, // 0001 EQ R2 R1 R2 - 0x780A0001, // 0002 JMPF R2 #0005 - 0x4C080000, // 0003 LDNIL R2 - 0x80040400, // 0004 RET 1 R2 - 0x6008000C, // 0005 GETGBL R2 G12 - 0x880C0100, // 0006 GETMBR R3 R0 K0 - 0x7C080200, // 0007 CALL R2 1 - 0x580C0001, // 0008 LDCONST R3 K1 - 0x88100100, // 0009 GETMBR R4 R0 K0 - 0x14140602, // 000A LT R5 R3 R2 - 0x78160008, // 000B JMPF R5 #0015 - 0x94140803, // 000C GETIDX R5 R4 R3 - 0x88180B02, // 000D GETMBR R6 R5 K2 - 0x1C180C01, // 000E EQ R6 R6 R1 - 0x781A0002, // 000F JMPF R6 #0013 - 0x8C180B03, // 0010 GETMET R6 R5 K3 - 0x7C180200, // 0011 CALL R6 1 - 0x80040A00, // 0012 RET 1 R5 - 0x000C0704, // 0013 ADD R3 R3 K4 - 0x7001FFF4, // 0014 JMP #000A - 0x80000000, // 0015 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: active_fabrics -********************************************************************/ -be_local_closure(Matter_Session_Store_active_fabrics, /* name */ - be_nested_proto( - 3, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 3]) { /* constants */ - /* K0 */ be_nested_str_weak(remove_expired), - /* K1 */ be_nested_str_weak(fabrics), - /* K2 */ be_nested_str_weak(persistables), - }), - be_str_weak(active_fabrics), - &be_const_str_solidified, - ( &(const binstruction[ 6]) { /* code */ - 0x8C040100, // 0000 GETMET R1 R0 K0 - 0x7C040200, // 0001 CALL R1 1 - 0x88040101, // 0002 GETMBR R1 R0 K1 - 0x8C040302, // 0003 GETMET R1 R1 K2 - 0x7C040200, // 0004 CALL R1 1 - 0x80040200, // 0005 RET 1 R1 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: every_second -********************************************************************/ -be_local_closure(Matter_Session_Store_every_second, /* name */ - be_nested_proto( - 3, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 1]) { /* constants */ - /* K0 */ be_nested_str_weak(remove_expired), - }), - be_str_weak(every_second), - &be_const_str_solidified, - ( &(const binstruction[ 3]) { /* code */ - 0x8C040100, // 0000 GETMET R1 R0 K0 - 0x7C040200, // 0001 CALL R1 1 - 0x80000000, // 0002 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: remove_session -********************************************************************/ -be_local_closure(Matter_Session_Store_remove_session, /* name */ - be_nested_proto( - 7, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 4]) { /* constants */ - /* K0 */ be_const_int(0), - /* K1 */ be_nested_str_weak(sessions), - /* K2 */ be_nested_str_weak(remove), - /* K3 */ be_const_int(1), - }), - be_str_weak(remove_session), - &be_const_str_solidified, - ( &(const binstruction[17]) { /* code */ - 0x58080000, // 0000 LDCONST R2 K0 - 0x880C0101, // 0001 GETMBR R3 R0 K1 - 0x6010000C, // 0002 GETGBL R4 G12 - 0x88140101, // 0003 GETMBR R5 R0 K1 - 0x7C100200, // 0004 CALL R4 1 - 0x14100404, // 0005 LT R4 R2 R4 - 0x78120008, // 0006 JMPF R4 #0010 - 0x94100602, // 0007 GETIDX R4 R3 R2 - 0x1C100801, // 0008 EQ R4 R4 R1 - 0x78120003, // 0009 JMPF R4 #000E - 0x8C100702, // 000A GETMET R4 R3 K2 - 0x5C180400, // 000B MOVE R6 R2 - 0x7C100400, // 000C CALL R4 2 - 0x70020000, // 000D JMP #000F - 0x00080503, // 000E ADD R2 R2 K3 - 0x7001FFF1, // 000F JMP #0002 - 0x80000000, // 0010 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: init -********************************************************************/ -be_local_closure(Matter_Session_Store_init, /* name */ - be_nested_proto( - 3, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 4]) { /* constants */ - /* K0 */ be_nested_str_weak(sessions), - /* K1 */ be_nested_str_weak(matter), - /* K2 */ be_nested_str_weak(Expirable_list), - /* K3 */ be_nested_str_weak(fabrics), - }), - be_str_weak(init), - &be_const_str_solidified, - ( &(const binstruction[ 9]) { /* code */ - 0xB8060200, // 0000 GETNGBL R1 K1 - 0x8C040302, // 0001 GETMET R1 R1 K2 - 0x7C040200, // 0002 CALL R1 1 - 0x90020001, // 0003 SETMBR R0 K0 R1 - 0xB8060200, // 0004 GETNGBL R1 K1 - 0x8C040302, // 0005 GETMET R1 R1 K2 - 0x7C040200, // 0006 CALL R1 1 - 0x90020601, // 0007 SETMBR R0 K3 R1 - 0x80000000, // 0008 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: create_session -********************************************************************/ -be_local_closure(Matter_Session_Store_create_session, /* name */ - be_nested_proto( - 9, /* nstack */ - 3, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 6]) { /* constants */ - /* K0 */ be_nested_str_weak(get_session_by_local_session_id), - /* K1 */ be_nested_str_weak(remove_session), - /* K2 */ be_nested_str_weak(matter), - /* K3 */ be_nested_str_weak(Session), - /* K4 */ be_nested_str_weak(sessions), - /* K5 */ be_nested_str_weak(push), - }), - be_str_weak(create_session), - &be_const_str_solidified, - ( &(const binstruction[21]) { /* code */ - 0x8C0C0100, // 0000 GETMET R3 R0 K0 - 0x5C140200, // 0001 MOVE R5 R1 - 0x7C0C0400, // 0002 CALL R3 2 - 0x4C100000, // 0003 LDNIL R4 - 0x20100604, // 0004 NE R4 R3 R4 - 0x78120002, // 0005 JMPF R4 #0009 - 0x8C100101, // 0006 GETMET R4 R0 K1 - 0x5C180600, // 0007 MOVE R6 R3 - 0x7C100400, // 0008 CALL R4 2 - 0xB8120400, // 0009 GETNGBL R4 K2 - 0x8C100903, // 000A GETMET R4 R4 K3 - 0x5C180000, // 000B MOVE R6 R0 - 0x5C1C0200, // 000C MOVE R7 R1 - 0x5C200400, // 000D MOVE R8 R2 - 0x7C100800, // 000E CALL R4 4 - 0x5C0C0800, // 000F MOVE R3 R4 - 0x88100104, // 0010 GETMBR R4 R0 K4 - 0x8C100905, // 0011 GETMET R4 R4 K5 - 0x5C180600, // 0012 MOVE R6 R3 - 0x7C100400, // 0013 CALL R4 2 - 0x80040600, // 0014 RET 1 R3 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: save_fabrics -********************************************************************/ -be_local_closure(Matter_Session_Store_save_fabrics, /* name */ - be_nested_proto( - 14, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[26]) { /* constants */ - /* K0 */ be_nested_str_weak(json), - /* K1 */ be_nested_str_weak(remove_expired), - /* K2 */ be_const_int(0), - /* K3 */ be_nested_str_weak(fabrics), - /* K4 */ be_nested_str_weak(persistables), - /* K5 */ be_nested_str_weak(_sessions), - /* K6 */ be_const_int(1), - /* K7 */ be_nested_str_weak(stop_iteration), - /* K8 */ be_nested_str_weak(push), - /* K9 */ be_nested_str_weak(tojson), - /* K10 */ be_nested_str_weak(_X5B), - /* K11 */ be_nested_str_weak(concat), - /* K12 */ be_nested_str_weak(_X2C), - /* K13 */ be_nested_str_weak(_X5D), - /* K14 */ be_nested_str_weak(string), - /* K15 */ be_nested_str_weak(_FABRICS), - /* K16 */ be_nested_str_weak(w), - /* K17 */ be_nested_str_weak(write), - /* K18 */ be_nested_str_weak(close), - /* K19 */ be_nested_str_weak(tasmota), - /* K20 */ be_nested_str_weak(log), - /* K21 */ be_nested_str_weak(format), - /* K22 */ be_nested_str_weak(MTR_X3A_X20_X3DSaved_X20_X20_X20_X20_X20_X25i_X20fabric_X28s_X29_X20and_X20_X25i_X20session_X28s_X29), - /* K23 */ be_const_int(2), - /* K24 */ be_nested_str_weak(MTR_X3A_X20Session_Store_X3A_X3Asave_X20Exception_X3A), - /* K25 */ be_nested_str_weak(_X7C), - }), - be_str_weak(save_fabrics), - &be_const_str_solidified, - ( &(const binstruction[84]) { /* code */ - 0xA4060000, // 0000 IMPORT R1 K0 - 0x8C080101, // 0001 GETMET R2 R0 K1 - 0x7C080200, // 0002 CALL R2 1 - 0x58080002, // 0003 LDCONST R2 K2 - 0x600C0012, // 0004 GETGBL R3 G18 - 0x7C0C0000, // 0005 CALL R3 0 - 0x60100010, // 0006 GETGBL R4 G16 - 0x88140103, // 0007 GETMBR R5 R0 K3 - 0x8C140B04, // 0008 GETMET R5 R5 K4 - 0x7C140200, // 0009 CALL R5 1 - 0x7C100200, // 000A CALL R4 1 - 0xA8020013, // 000B EXBLK 0 #0020 - 0x5C140800, // 000C MOVE R5 R4 - 0x7C140000, // 000D CALL R5 0 - 0x60180010, // 000E GETGBL R6 G16 - 0x881C0B05, // 000F GETMBR R7 R5 K5 - 0x8C1C0F04, // 0010 GETMET R7 R7 K4 - 0x7C1C0200, // 0011 CALL R7 1 - 0x7C180200, // 0012 CALL R6 1 - 0xA8020003, // 0013 EXBLK 0 #0018 - 0x5C1C0C00, // 0014 MOVE R7 R6 - 0x7C1C0000, // 0015 CALL R7 0 - 0x00080506, // 0016 ADD R2 R2 K6 - 0x7001FFFB, // 0017 JMP #0014 - 0x58180007, // 0018 LDCONST R6 K7 - 0xAC180200, // 0019 CATCH R6 1 0 - 0xB0080000, // 001A RAISE 2 R0 R0 - 0x8C180708, // 001B GETMET R6 R3 K8 - 0x8C200B09, // 001C GETMET R8 R5 K9 - 0x7C200200, // 001D CALL R8 1 - 0x7C180400, // 001E CALL R6 2 - 0x7001FFEB, // 001F JMP #000C - 0x58100007, // 0020 LDCONST R4 K7 - 0xAC100200, // 0021 CATCH R4 1 0 - 0xB0080000, // 0022 RAISE 2 R0 R0 - 0x6010000C, // 0023 GETGBL R4 G12 - 0x5C140600, // 0024 MOVE R5 R3 - 0x7C100200, // 0025 CALL R4 1 - 0x8C14070B, // 0026 GETMET R5 R3 K11 - 0x581C000C, // 0027 LDCONST R7 K12 - 0x7C140400, // 0028 CALL R5 2 - 0x00161405, // 0029 ADD R5 K10 R5 - 0x00140B0D, // 002A ADD R5 R5 K13 - 0x5C0C0A00, // 002B MOVE R3 R5 - 0xA8020014, // 002C EXBLK 0 #0042 - 0xA4161C00, // 002D IMPORT R5 K14 - 0x60180011, // 002E GETGBL R6 G17 - 0x881C010F, // 002F GETMBR R7 R0 K15 - 0x58200010, // 0030 LDCONST R8 K16 - 0x7C180400, // 0031 CALL R6 2 - 0x8C1C0D11, // 0032 GETMET R7 R6 K17 - 0x5C240600, // 0033 MOVE R9 R3 - 0x7C1C0400, // 0034 CALL R7 2 - 0x8C1C0D12, // 0035 GETMET R7 R6 K18 - 0x7C1C0200, // 0036 CALL R7 1 - 0xB81E2600, // 0037 GETNGBL R7 K19 - 0x8C1C0F14, // 0038 GETMET R7 R7 K20 - 0x8C240B15, // 0039 GETMET R9 R5 K21 - 0x582C0016, // 003A LDCONST R11 K22 - 0x5C300800, // 003B MOVE R12 R4 - 0x5C340400, // 003C MOVE R13 R2 - 0x7C240800, // 003D CALL R9 4 - 0x58280017, // 003E LDCONST R10 K23 - 0x7C1C0600, // 003F CALL R7 3 - 0xA8040001, // 0040 EXBLK 1 1 - 0x70020010, // 0041 JMP #0053 - 0xAC140002, // 0042 CATCH R5 0 2 - 0x7002000D, // 0043 JMP #0052 - 0xB81E2600, // 0044 GETNGBL R7 K19 - 0x8C1C0F14, // 0045 GETMET R7 R7 K20 - 0x60240008, // 0046 GETGBL R9 G8 - 0x5C280A00, // 0047 MOVE R10 R5 - 0x7C240200, // 0048 CALL R9 1 - 0x00263009, // 0049 ADD R9 K24 R9 - 0x00241319, // 004A ADD R9 R9 K25 - 0x60280008, // 004B GETGBL R10 G8 - 0x5C2C0C00, // 004C MOVE R11 R6 - 0x7C280200, // 004D CALL R10 1 - 0x0024120A, // 004E ADD R9 R9 R10 - 0x58280017, // 004F LDCONST R10 K23 - 0x7C1C0600, // 0050 CALL R7 3 - 0x70020000, // 0051 JMP #0053 - 0xB0080000, // 0052 RAISE 2 R0 R0 - 0x80000000, // 0053 RET 0 - }) - ) -); -/*******************************************************************/ - - /******************************************************************** ** Solidified function: load_fabrics ********************************************************************/ @@ -1214,11 +499,11 @@ be_local_closure(Matter_Session_Store_load_fabrics, /* name */ /******************************************************************** -** Solidified function: sessions_active +** Solidified function: count_active_fabrics ********************************************************************/ -be_local_closure(Matter_Session_Store_sessions_active, /* name */ +be_local_closure(Matter_Session_Store_count_active_fabrics, /* name */ be_nested_proto( - 7, /* nstack */ + 3, /* nstack */ 1, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -1226,39 +511,20 @@ be_local_closure(Matter_Session_Store_sessions_active, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[ 6]) { /* constants */ - /* K0 */ be_const_int(0), - /* K1 */ be_nested_str_weak(sessions), - /* K2 */ be_nested_str_weak(get_device_id), - /* K3 */ be_nested_str_weak(get_fabric_id), - /* K4 */ be_nested_str_weak(push), - /* K5 */ be_const_int(1), + ( &(const bvalue[ 3]) { /* constants */ + /* K0 */ be_nested_str_weak(remove_expired), + /* K1 */ be_nested_str_weak(fabrics), + /* K2 */ be_nested_str_weak(count_persistables), }), - be_str_weak(sessions_active), + be_str_weak(count_active_fabrics), &be_const_str_solidified, - ( &(const binstruction[22]) { /* code */ - 0x60040012, // 0000 GETGBL R1 G18 - 0x7C040000, // 0001 CALL R1 0 - 0x58080000, // 0002 LDCONST R2 K0 - 0x600C000C, // 0003 GETGBL R3 G12 - 0x88100101, // 0004 GETMBR R4 R0 K1 - 0x7C0C0200, // 0005 CALL R3 1 - 0x140C0403, // 0006 LT R3 R2 R3 - 0x780E000C, // 0007 JMPF R3 #0015 - 0x880C0101, // 0008 GETMBR R3 R0 K1 - 0x940C0602, // 0009 GETIDX R3 R3 R2 - 0x8C100702, // 000A GETMET R4 R3 K2 - 0x7C100200, // 000B CALL R4 1 - 0x78120005, // 000C JMPF R4 #0013 - 0x8C100703, // 000D GETMET R4 R3 K3 - 0x7C100200, // 000E CALL R4 1 - 0x78120002, // 000F JMPF R4 #0013 - 0x8C100304, // 0010 GETMET R4 R1 K4 - 0x5C180600, // 0011 MOVE R6 R3 - 0x7C100400, // 0012 CALL R4 2 - 0x00080505, // 0013 ADD R2 R2 K5 - 0x7001FFED, // 0014 JMP #0003 - 0x80040200, // 0015 RET 1 R1 + ( &(const binstruction[ 6]) { /* code */ + 0x8C040100, // 0000 GETMET R1 R0 K0 + 0x7C040200, // 0001 CALL R1 1 + 0x88040101, // 0002 GETMBR R1 R0 K1 + 0x8C040302, // 0003 GETMET R1 R1 K2 + 0x7C040200, // 0004 CALL R1 1 + 0x80040200, // 0005 RET 1 R1 }) ) ); @@ -1266,30 +532,101 @@ be_local_closure(Matter_Session_Store_sessions_active, /* name */ /******************************************************************** -** Solidified function: create_fabric +** Solidified function: remove_fabric ********************************************************************/ -be_local_closure(Matter_Session_Store_create_fabric, /* name */ +be_local_closure(Matter_Session_Store_remove_fabric, /* name */ be_nested_proto( - 4, /* nstack */ - 1, /* argc */ + 8, /* nstack */ + 2, /* argc */ 2, /* varg */ 0, /* has upvals */ NULL, /* no upvals */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[ 2]) { /* constants */ - /* K0 */ be_nested_str_weak(matter), - /* K1 */ be_nested_str_weak(Fabric), + ( &(const bvalue[ 7]) { /* constants */ + /* K0 */ be_const_int(0), + /* K1 */ be_nested_str_weak(sessions), + /* K2 */ be_nested_str_weak(_fabric), + /* K3 */ be_nested_str_weak(remove), + /* K4 */ be_const_int(1), + /* K5 */ be_nested_str_weak(fabrics), + /* K6 */ be_nested_str_weak(find), }), - be_str_weak(create_fabric), + be_str_weak(remove_fabric), &be_const_str_solidified, - ( &(const binstruction[ 5]) { /* code */ - 0xB8060000, // 0000 GETNGBL R1 K0 - 0x8C040301, // 0001 GETMET R1 R1 K1 - 0x5C0C0000, // 0002 MOVE R3 R0 - 0x7C040400, // 0003 CALL R1 2 - 0x80040200, // 0004 RET 1 R1 + ( &(const binstruction[26]) { /* code */ + 0x58080000, // 0000 LDCONST R2 K0 + 0x600C000C, // 0001 GETGBL R3 G12 + 0x88100101, // 0002 GETMBR R4 R0 K1 + 0x7C0C0200, // 0003 CALL R3 1 + 0x140C0403, // 0004 LT R3 R2 R3 + 0x780E000B, // 0005 JMPF R3 #0012 + 0x880C0101, // 0006 GETMBR R3 R0 K1 + 0x940C0602, // 0007 GETIDX R3 R3 R2 + 0x880C0702, // 0008 GETMBR R3 R3 K2 + 0x1C0C0601, // 0009 EQ R3 R3 R1 + 0x780E0004, // 000A JMPF R3 #0010 + 0x880C0101, // 000B GETMBR R3 R0 K1 + 0x8C0C0703, // 000C GETMET R3 R3 K3 + 0x5C140400, // 000D MOVE R5 R2 + 0x7C0C0400, // 000E CALL R3 2 + 0x70020000, // 000F JMP #0011 + 0x00080504, // 0010 ADD R2 R2 K4 + 0x7001FFEE, // 0011 JMP #0001 + 0x880C0105, // 0012 GETMBR R3 R0 K5 + 0x8C0C0703, // 0013 GETMET R3 R3 K3 + 0x88140105, // 0014 GETMBR R5 R0 K5 + 0x8C140B06, // 0015 GETMET R5 R5 K6 + 0x5C1C0200, // 0016 MOVE R7 R1 + 0x7C140400, // 0017 CALL R5 2 + 0x7C0C0400, // 0018 CALL R3 2 + 0x80000000, // 0019 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: remove_session +********************************************************************/ +be_local_closure(Matter_Session_Store_remove_session, /* name */ + be_nested_proto( + 7, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 4]) { /* constants */ + /* K0 */ be_const_int(0), + /* K1 */ be_nested_str_weak(sessions), + /* K2 */ be_nested_str_weak(remove), + /* K3 */ be_const_int(1), + }), + be_str_weak(remove_session), + &be_const_str_solidified, + ( &(const binstruction[17]) { /* code */ + 0x58080000, // 0000 LDCONST R2 K0 + 0x880C0101, // 0001 GETMBR R3 R0 K1 + 0x6010000C, // 0002 GETGBL R4 G12 + 0x88140101, // 0003 GETMBR R5 R0 K1 + 0x7C100200, // 0004 CALL R4 1 + 0x14100404, // 0005 LT R4 R2 R4 + 0x78120008, // 0006 JMPF R4 #0010 + 0x94100602, // 0007 GETIDX R4 R3 R2 + 0x1C100801, // 0008 EQ R4 R4 R1 + 0x78120003, // 0009 JMPF R4 #000E + 0x8C100702, // 000A GETMET R4 R3 K2 + 0x5C180400, // 000B MOVE R6 R2 + 0x7C100400, // 000C CALL R4 2 + 0x70020000, // 000D JMP #000F + 0x00080503, // 000E ADD R2 R2 K3 + 0x7001FFF1, // 000F JMP #0002 + 0x80000000, // 0010 RET 0 }) ) ); @@ -1350,40 +687,711 @@ be_local_closure(Matter_Session_Store_add_fabric, /* name */ /*******************************************************************/ +/******************************************************************** +** Solidified function: find_fabric_by_index +********************************************************************/ +be_local_closure(Matter_Session_Store_find_fabric_by_index, /* name */ + be_nested_proto( + 6, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 3]) { /* constants */ + /* K0 */ be_nested_str_weak(active_fabrics), + /* K1 */ be_nested_str_weak(get_fabric_index), + /* K2 */ be_nested_str_weak(stop_iteration), + }), + be_str_weak(find_fabric_by_index), + &be_const_str_solidified, + ( &(const binstruction[19]) { /* code */ + 0x60080010, // 0000 GETGBL R2 G16 + 0x8C0C0100, // 0001 GETMET R3 R0 K0 + 0x7C0C0200, // 0002 CALL R3 1 + 0x7C080200, // 0003 CALL R2 1 + 0xA8020008, // 0004 EXBLK 0 #000E + 0x5C0C0400, // 0005 MOVE R3 R2 + 0x7C0C0000, // 0006 CALL R3 0 + 0x8C100701, // 0007 GETMET R4 R3 K1 + 0x7C100200, // 0008 CALL R4 1 + 0x1C100801, // 0009 EQ R4 R4 R1 + 0x78120001, // 000A JMPF R4 #000D + 0xA8040001, // 000B EXBLK 1 1 + 0x80040600, // 000C RET 1 R3 + 0x7001FFF6, // 000D JMP #0005 + 0x58080002, // 000E LDCONST R2 K2 + 0xAC080200, // 000F CATCH R2 1 0 + 0xB0080000, // 0010 RAISE 2 R0 R0 + 0x4C080000, // 0011 LDNIL R2 + 0x80040400, // 0012 RET 1 R2 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: remove_expired +********************************************************************/ +be_local_closure(Matter_Session_Store_remove_expired, /* name */ + be_nested_proto( + 3, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 3]) { /* constants */ + /* K0 */ be_nested_str_weak(sessions), + /* K1 */ be_nested_str_weak(every_second), + /* K2 */ be_nested_str_weak(fabrics), + }), + be_str_weak(remove_expired), + &be_const_str_solidified, + ( &(const binstruction[ 7]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x8C040301, // 0001 GETMET R1 R1 K1 + 0x7C040200, // 0002 CALL R1 1 + 0x88040102, // 0003 GETMBR R1 R0 K2 + 0x8C040301, // 0004 GETMET R1 R1 K1 + 0x7C040200, // 0005 CALL R1 1 + 0x80000000, // 0006 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: add_session +********************************************************************/ +be_local_closure(Matter_Session_Store_add_session, /* name */ + be_nested_proto( + 6, /* nstack */ + 3, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 3]) { /* constants */ + /* K0 */ be_nested_str_weak(set_expire_in_seconds), + /* K1 */ be_nested_str_weak(sessions), + /* K2 */ be_nested_str_weak(push), + }), + be_str_weak(add_session), + &be_const_str_solidified, + ( &(const binstruction[11]) { /* code */ + 0x4C0C0000, // 0000 LDNIL R3 + 0x200C0403, // 0001 NE R3 R2 R3 + 0x780E0002, // 0002 JMPF R3 #0006 + 0x8C0C0300, // 0003 GETMET R3 R1 K0 + 0x5C140400, // 0004 MOVE R5 R2 + 0x7C0C0400, // 0005 CALL R3 2 + 0x880C0101, // 0006 GETMBR R3 R0 K1 + 0x8C0C0702, // 0007 GETMET R3 R3 K2 + 0x5C140200, // 0008 MOVE R5 R1 + 0x7C0C0400, // 0009 CALL R3 2 + 0x80000000, // 000A RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: create_session +********************************************************************/ +be_local_closure(Matter_Session_Store_create_session, /* name */ + be_nested_proto( + 9, /* nstack */ + 3, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 6]) { /* constants */ + /* K0 */ be_nested_str_weak(get_session_by_local_session_id), + /* K1 */ be_nested_str_weak(remove_session), + /* K2 */ be_nested_str_weak(matter), + /* K3 */ be_nested_str_weak(Session), + /* K4 */ be_nested_str_weak(sessions), + /* K5 */ be_nested_str_weak(push), + }), + be_str_weak(create_session), + &be_const_str_solidified, + ( &(const binstruction[21]) { /* code */ + 0x8C0C0100, // 0000 GETMET R3 R0 K0 + 0x5C140200, // 0001 MOVE R5 R1 + 0x7C0C0400, // 0002 CALL R3 2 + 0x4C100000, // 0003 LDNIL R4 + 0x20100604, // 0004 NE R4 R3 R4 + 0x78120002, // 0005 JMPF R4 #0009 + 0x8C100101, // 0006 GETMET R4 R0 K1 + 0x5C180600, // 0007 MOVE R6 R3 + 0x7C100400, // 0008 CALL R4 2 + 0xB8120400, // 0009 GETNGBL R4 K2 + 0x8C100903, // 000A GETMET R4 R4 K3 + 0x5C180000, // 000B MOVE R6 R0 + 0x5C1C0200, // 000C MOVE R7 R1 + 0x5C200400, // 000D MOVE R8 R2 + 0x7C100800, // 000E CALL R4 4 + 0x5C0C0800, // 000F MOVE R3 R4 + 0x88100104, // 0010 GETMBR R4 R0 K4 + 0x8C100905, // 0011 GETMET R4 R4 K5 + 0x5C180600, // 0012 MOVE R6 R3 + 0x7C100400, // 0013 CALL R4 2 + 0x80040600, // 0014 RET 1 R3 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: init +********************************************************************/ +be_local_closure(Matter_Session_Store_init, /* name */ + be_nested_proto( + 4, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 5]) { /* constants */ + /* K0 */ be_nested_str_weak(device), + /* K1 */ be_nested_str_weak(sessions), + /* K2 */ be_nested_str_weak(matter), + /* K3 */ be_nested_str_weak(Expirable_list), + /* K4 */ be_nested_str_weak(fabrics), + }), + be_str_weak(init), + &be_const_str_solidified, + ( &(const binstruction[10]) { /* code */ + 0x90020001, // 0000 SETMBR R0 K0 R1 + 0xB80A0400, // 0001 GETNGBL R2 K2 + 0x8C080503, // 0002 GETMET R2 R2 K3 + 0x7C080200, // 0003 CALL R2 1 + 0x90020202, // 0004 SETMBR R0 K1 R2 + 0xB80A0400, // 0005 GETNGBL R2 K2 + 0x8C080503, // 0006 GETMET R2 R2 K3 + 0x7C080200, // 0007 CALL R2 1 + 0x90020802, // 0008 SETMBR R0 K4 R2 + 0x80000000, // 0009 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: get_session_by_local_session_id +********************************************************************/ +be_local_closure(Matter_Session_Store_get_session_by_local_session_id, /* name */ + be_nested_proto( + 8, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 5]) { /* constants */ + /* K0 */ be_nested_str_weak(sessions), + /* K1 */ be_const_int(0), + /* K2 */ be_nested_str_weak(local_session_id), + /* K3 */ be_nested_str_weak(update), + /* K4 */ be_const_int(1), + }), + be_str_weak(get_session_by_local_session_id), + &be_const_str_solidified, + ( &(const binstruction[22]) { /* code */ + 0x4C080000, // 0000 LDNIL R2 + 0x1C080202, // 0001 EQ R2 R1 R2 + 0x780A0001, // 0002 JMPF R2 #0005 + 0x4C080000, // 0003 LDNIL R2 + 0x80040400, // 0004 RET 1 R2 + 0x6008000C, // 0005 GETGBL R2 G12 + 0x880C0100, // 0006 GETMBR R3 R0 K0 + 0x7C080200, // 0007 CALL R2 1 + 0x580C0001, // 0008 LDCONST R3 K1 + 0x88100100, // 0009 GETMBR R4 R0 K0 + 0x14140602, // 000A LT R5 R3 R2 + 0x78160008, // 000B JMPF R5 #0015 + 0x94140803, // 000C GETIDX R5 R4 R3 + 0x88180B02, // 000D GETMBR R6 R5 K2 + 0x1C180C01, // 000E EQ R6 R6 R1 + 0x781A0002, // 000F JMPF R6 #0013 + 0x8C180B03, // 0010 GETMET R6 R5 K3 + 0x7C180200, // 0011 CALL R6 1 + 0x80040A00, // 0012 RET 1 R5 + 0x000C0704, // 0013 ADD R3 R3 K4 + 0x7001FFF4, // 0014 JMP #000A + 0x80000000, // 0015 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: every_second +********************************************************************/ +be_local_closure(Matter_Session_Store_every_second, /* name */ + be_nested_proto( + 3, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 1]) { /* constants */ + /* K0 */ be_nested_str_weak(remove_expired), + }), + be_str_weak(every_second), + &be_const_str_solidified, + ( &(const binstruction[ 3]) { /* code */ + 0x8C040100, // 0000 GETMET R1 R0 K0 + 0x7C040200, // 0001 CALL R1 1 + 0x80000000, // 0002 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: find_session_source_id_unsecure +********************************************************************/ +be_local_closure(Matter_Session_Store_find_session_source_id_unsecure, /* name */ + be_nested_proto( + 9, /* nstack */ + 3, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 9]) { /* constants */ + /* K0 */ be_nested_str_weak(get_session_by_source_node_id), + /* K1 */ be_nested_str_weak(matter), + /* K2 */ be_nested_str_weak(Session), + /* K3 */ be_const_int(0), + /* K4 */ be_nested_str_weak(_source_node_id), + /* K5 */ be_nested_str_weak(sessions), + /* K6 */ be_nested_str_weak(push), + /* K7 */ be_nested_str_weak(set_expire_in_seconds), + /* K8 */ be_nested_str_weak(update), + }), + be_str_weak(find_session_source_id_unsecure), + &be_const_str_solidified, + ( &(const binstruction[24]) { /* code */ + 0x8C0C0100, // 0000 GETMET R3 R0 K0 + 0x5C140200, // 0001 MOVE R5 R1 + 0x7C0C0400, // 0002 CALL R3 2 + 0x4C100000, // 0003 LDNIL R4 + 0x1C100604, // 0004 EQ R4 R3 R4 + 0x7812000E, // 0005 JMPF R4 #0015 + 0xB8120200, // 0006 GETNGBL R4 K1 + 0x8C100902, // 0007 GETMET R4 R4 K2 + 0x5C180000, // 0008 MOVE R6 R0 + 0x581C0003, // 0009 LDCONST R7 K3 + 0x58200003, // 000A LDCONST R8 K3 + 0x7C100800, // 000B CALL R4 4 + 0x5C0C0800, // 000C MOVE R3 R4 + 0x900E0801, // 000D SETMBR R3 K4 R1 + 0x88100105, // 000E GETMBR R4 R0 K5 + 0x8C100906, // 000F GETMET R4 R4 K6 + 0x5C180600, // 0010 MOVE R6 R3 + 0x7C100400, // 0011 CALL R4 2 + 0x8C100707, // 0012 GETMET R4 R3 K7 + 0x5C180400, // 0013 MOVE R6 R2 + 0x7C100400, // 0014 CALL R4 2 + 0x8C100708, // 0015 GETMET R4 R3 K8 + 0x7C100200, // 0016 CALL R4 1 + 0x80040600, // 0017 RET 1 R3 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: sessions_active +********************************************************************/ +be_local_closure(Matter_Session_Store_sessions_active, /* name */ + be_nested_proto( + 7, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 6]) { /* constants */ + /* K0 */ be_const_int(0), + /* K1 */ be_nested_str_weak(sessions), + /* K2 */ be_nested_str_weak(get_device_id), + /* K3 */ be_nested_str_weak(get_fabric_id), + /* K4 */ be_nested_str_weak(push), + /* K5 */ be_const_int(1), + }), + be_str_weak(sessions_active), + &be_const_str_solidified, + ( &(const binstruction[22]) { /* code */ + 0x60040012, // 0000 GETGBL R1 G18 + 0x7C040000, // 0001 CALL R1 0 + 0x58080000, // 0002 LDCONST R2 K0 + 0x600C000C, // 0003 GETGBL R3 G12 + 0x88100101, // 0004 GETMBR R4 R0 K1 + 0x7C0C0200, // 0005 CALL R3 1 + 0x140C0403, // 0006 LT R3 R2 R3 + 0x780E000C, // 0007 JMPF R3 #0015 + 0x880C0101, // 0008 GETMBR R3 R0 K1 + 0x940C0602, // 0009 GETIDX R3 R3 R2 + 0x8C100702, // 000A GETMET R4 R3 K2 + 0x7C100200, // 000B CALL R4 1 + 0x78120005, // 000C JMPF R4 #0013 + 0x8C100703, // 000D GETMET R4 R3 K3 + 0x7C100200, // 000E CALL R4 1 + 0x78120002, // 000F JMPF R4 #0013 + 0x8C100304, // 0010 GETMET R4 R1 K4 + 0x5C180600, // 0011 MOVE R6 R3 + 0x7C100400, // 0012 CALL R4 2 + 0x00080505, // 0013 ADD R2 R2 K5 + 0x7001FFED, // 0014 JMP #0003 + 0x80040200, // 0015 RET 1 R1 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: find_session_by_resumption_id +********************************************************************/ +be_local_closure(Matter_Session_Store_find_session_by_resumption_id, /* name */ + be_nested_proto( + 14, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[13]) { /* constants */ + /* K0 */ be_nested_str_weak(string), + /* K1 */ be_const_int(0), + /* K2 */ be_nested_str_weak(sessions), + /* K3 */ be_nested_str_weak(tasmota), + /* K4 */ be_nested_str_weak(log), + /* K5 */ be_nested_str_weak(format), + /* K6 */ be_nested_str_weak(MTR_X3A_X20session_X2Eresumption_id_X3D_X25s_X20vs_X20_X25s), + /* K7 */ be_nested_str_weak(resumption_id), + /* K8 */ be_const_int(3), + /* K9 */ be_nested_str_weak(shared_secret), + /* K10 */ be_nested_str_weak(MTR_X3A_X20session_X2Eshared_secret_X3D_X25s), + /* K11 */ be_nested_str_weak(update), + /* K12 */ be_const_int(1), + }), + be_str_weak(find_session_by_resumption_id), + &be_const_str_solidified, + ( &(const binstruction[49]) { /* code */ + 0xA40A0000, // 0000 IMPORT R2 K0 + 0x5C0C0200, // 0001 MOVE R3 R1 + 0x740E0001, // 0002 JMPT R3 #0005 + 0x4C0C0000, // 0003 LDNIL R3 + 0x80040600, // 0004 RET 1 R3 + 0x580C0001, // 0005 LDCONST R3 K1 + 0x88100102, // 0006 GETMBR R4 R0 K2 + 0x6014000C, // 0007 GETGBL R5 G12 + 0x5C180800, // 0008 MOVE R6 R4 + 0x7C140200, // 0009 CALL R5 1 + 0x14140605, // 000A LT R5 R3 R5 + 0x78160023, // 000B JMPF R5 #0030 + 0x94140803, // 000C GETIDX R5 R4 R3 + 0xB81A0600, // 000D GETNGBL R6 K3 + 0x8C180D04, // 000E GETMET R6 R6 K4 + 0x8C200505, // 000F GETMET R8 R2 K5 + 0x58280006, // 0010 LDCONST R10 K6 + 0x602C0008, // 0011 GETGBL R11 G8 + 0x88300B07, // 0012 GETMBR R12 R5 K7 + 0x7C2C0200, // 0013 CALL R11 1 + 0x60300008, // 0014 GETGBL R12 G8 + 0x5C340200, // 0015 MOVE R13 R1 + 0x7C300200, // 0016 CALL R12 1 + 0x7C200800, // 0017 CALL R8 4 + 0x58240008, // 0018 LDCONST R9 K8 + 0x7C180600, // 0019 CALL R6 3 + 0x88180B07, // 001A GETMBR R6 R5 K7 + 0x1C180C01, // 001B EQ R6 R6 R1 + 0x781A0010, // 001C JMPF R6 #002E + 0x88180B09, // 001D GETMBR R6 R5 K9 + 0x4C1C0000, // 001E LDNIL R7 + 0x20180C07, // 001F NE R6 R6 R7 + 0x781A000C, // 0020 JMPF R6 #002E + 0xB81A0600, // 0021 GETNGBL R6 K3 + 0x8C180D04, // 0022 GETMET R6 R6 K4 + 0x8C200505, // 0023 GETMET R8 R2 K5 + 0x5828000A, // 0024 LDCONST R10 K10 + 0x602C0008, // 0025 GETGBL R11 G8 + 0x88300B09, // 0026 GETMBR R12 R5 K9 + 0x7C2C0200, // 0027 CALL R11 1 + 0x7C200600, // 0028 CALL R8 3 + 0x58240008, // 0029 LDCONST R9 K8 + 0x7C180600, // 002A CALL R6 3 + 0x8C180B0B, // 002B GETMET R6 R5 K11 + 0x7C180200, // 002C CALL R6 1 + 0x80040A00, // 002D RET 1 R5 + 0x000C070C, // 002E ADD R3 R3 K12 + 0x7001FFD6, // 002F JMP #0007 + 0x80000000, // 0030 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: save_fabrics +********************************************************************/ +be_local_closure(Matter_Session_Store_save_fabrics, /* name */ + be_nested_proto( + 14, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[28]) { /* constants */ + /* K0 */ be_nested_str_weak(json), + /* K1 */ be_nested_str_weak(remove_expired), + /* K2 */ be_const_int(0), + /* K3 */ be_nested_str_weak(fabrics), + /* K4 */ be_nested_str_weak(persistables), + /* K5 */ be_nested_str_weak(_sessions), + /* K6 */ be_const_int(1), + /* K7 */ be_nested_str_weak(stop_iteration), + /* K8 */ be_nested_str_weak(push), + /* K9 */ be_nested_str_weak(tojson), + /* K10 */ be_nested_str_weak(_X5B), + /* K11 */ be_nested_str_weak(concat), + /* K12 */ be_nested_str_weak(_X2C), + /* K13 */ be_nested_str_weak(_X5D), + /* K14 */ be_nested_str_weak(string), + /* K15 */ be_nested_str_weak(_FABRICS), + /* K16 */ be_nested_str_weak(w), + /* K17 */ be_nested_str_weak(write), + /* K18 */ be_nested_str_weak(close), + /* K19 */ be_nested_str_weak(tasmota), + /* K20 */ be_nested_str_weak(log), + /* K21 */ be_nested_str_weak(format), + /* K22 */ be_nested_str_weak(MTR_X3A_X20_X3DSaved_X20_X20_X20_X20_X20_X25i_X20fabric_X28s_X29_X20and_X20_X25i_X20session_X28s_X29), + /* K23 */ be_const_int(2), + /* K24 */ be_nested_str_weak(device), + /* K25 */ be_nested_str_weak(event_fabrics_saved), + /* K26 */ be_nested_str_weak(MTR_X3A_X20Session_Store_X3A_X3Asave_X20Exception_X3A), + /* K27 */ be_nested_str_weak(_X7C), + }), + be_str_weak(save_fabrics), + &be_const_str_solidified, + ( &(const binstruction[87]) { /* code */ + 0xA4060000, // 0000 IMPORT R1 K0 + 0x8C080101, // 0001 GETMET R2 R0 K1 + 0x7C080200, // 0002 CALL R2 1 + 0x58080002, // 0003 LDCONST R2 K2 + 0x600C0012, // 0004 GETGBL R3 G18 + 0x7C0C0000, // 0005 CALL R3 0 + 0x60100010, // 0006 GETGBL R4 G16 + 0x88140103, // 0007 GETMBR R5 R0 K3 + 0x8C140B04, // 0008 GETMET R5 R5 K4 + 0x7C140200, // 0009 CALL R5 1 + 0x7C100200, // 000A CALL R4 1 + 0xA8020013, // 000B EXBLK 0 #0020 + 0x5C140800, // 000C MOVE R5 R4 + 0x7C140000, // 000D CALL R5 0 + 0x60180010, // 000E GETGBL R6 G16 + 0x881C0B05, // 000F GETMBR R7 R5 K5 + 0x8C1C0F04, // 0010 GETMET R7 R7 K4 + 0x7C1C0200, // 0011 CALL R7 1 + 0x7C180200, // 0012 CALL R6 1 + 0xA8020003, // 0013 EXBLK 0 #0018 + 0x5C1C0C00, // 0014 MOVE R7 R6 + 0x7C1C0000, // 0015 CALL R7 0 + 0x00080506, // 0016 ADD R2 R2 K6 + 0x7001FFFB, // 0017 JMP #0014 + 0x58180007, // 0018 LDCONST R6 K7 + 0xAC180200, // 0019 CATCH R6 1 0 + 0xB0080000, // 001A RAISE 2 R0 R0 + 0x8C180708, // 001B GETMET R6 R3 K8 + 0x8C200B09, // 001C GETMET R8 R5 K9 + 0x7C200200, // 001D CALL R8 1 + 0x7C180400, // 001E CALL R6 2 + 0x7001FFEB, // 001F JMP #000C + 0x58100007, // 0020 LDCONST R4 K7 + 0xAC100200, // 0021 CATCH R4 1 0 + 0xB0080000, // 0022 RAISE 2 R0 R0 + 0x6010000C, // 0023 GETGBL R4 G12 + 0x5C140600, // 0024 MOVE R5 R3 + 0x7C100200, // 0025 CALL R4 1 + 0x8C14070B, // 0026 GETMET R5 R3 K11 + 0x581C000C, // 0027 LDCONST R7 K12 + 0x7C140400, // 0028 CALL R5 2 + 0x00161405, // 0029 ADD R5 K10 R5 + 0x00140B0D, // 002A ADD R5 R5 K13 + 0x5C0C0A00, // 002B MOVE R3 R5 + 0xA8020017, // 002C EXBLK 0 #0045 + 0xA4161C00, // 002D IMPORT R5 K14 + 0x60180011, // 002E GETGBL R6 G17 + 0x881C010F, // 002F GETMBR R7 R0 K15 + 0x58200010, // 0030 LDCONST R8 K16 + 0x7C180400, // 0031 CALL R6 2 + 0x8C1C0D11, // 0032 GETMET R7 R6 K17 + 0x5C240600, // 0033 MOVE R9 R3 + 0x7C1C0400, // 0034 CALL R7 2 + 0x8C1C0D12, // 0035 GETMET R7 R6 K18 + 0x7C1C0200, // 0036 CALL R7 1 + 0xB81E2600, // 0037 GETNGBL R7 K19 + 0x8C1C0F14, // 0038 GETMET R7 R7 K20 + 0x8C240B15, // 0039 GETMET R9 R5 K21 + 0x582C0016, // 003A LDCONST R11 K22 + 0x5C300800, // 003B MOVE R12 R4 + 0x5C340400, // 003C MOVE R13 R2 + 0x7C240800, // 003D CALL R9 4 + 0x58280017, // 003E LDCONST R10 K23 + 0x7C1C0600, // 003F CALL R7 3 + 0x881C0118, // 0040 GETMBR R7 R0 K24 + 0x8C1C0F19, // 0041 GETMET R7 R7 K25 + 0x7C1C0200, // 0042 CALL R7 1 + 0xA8040001, // 0043 EXBLK 1 1 + 0x70020010, // 0044 JMP #0056 + 0xAC140002, // 0045 CATCH R5 0 2 + 0x7002000D, // 0046 JMP #0055 + 0xB81E2600, // 0047 GETNGBL R7 K19 + 0x8C1C0F14, // 0048 GETMET R7 R7 K20 + 0x60240008, // 0049 GETGBL R9 G8 + 0x5C280A00, // 004A MOVE R10 R5 + 0x7C240200, // 004B CALL R9 1 + 0x00263409, // 004C ADD R9 K26 R9 + 0x0024131B, // 004D ADD R9 R9 K27 + 0x60280008, // 004E GETGBL R10 G8 + 0x5C2C0C00, // 004F MOVE R11 R6 + 0x7C280200, // 0050 CALL R10 1 + 0x0024120A, // 0051 ADD R9 R9 R10 + 0x58280017, // 0052 LDCONST R10 K23 + 0x7C1C0600, // 0053 CALL R7 3 + 0x70020000, // 0054 JMP #0056 + 0xB0080000, // 0055 RAISE 2 R0 R0 + 0x80000000, // 0056 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: gen_local_session_id +********************************************************************/ +be_local_closure(Matter_Session_Store_gen_local_session_id, /* name */ + be_nested_proto( + 6, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 6]) { /* constants */ + /* K0 */ be_nested_str_weak(crypto), + /* K1 */ be_nested_str_weak(random), + /* K2 */ be_const_int(2), + /* K3 */ be_nested_str_weak(get), + /* K4 */ be_const_int(0), + /* K5 */ be_nested_str_weak(get_session_by_local_session_id), + }), + be_str_weak(gen_local_session_id), + &be_const_str_solidified, + ( &(const binstruction[19]) { /* code */ + 0xA4060000, // 0000 IMPORT R1 K0 + 0x50080200, // 0001 LDBOOL R2 1 0 + 0x780A000E, // 0002 JMPF R2 #0012 + 0x8C080301, // 0003 GETMET R2 R1 K1 + 0x58100002, // 0004 LDCONST R4 K2 + 0x7C080400, // 0005 CALL R2 2 + 0x8C080503, // 0006 GETMET R2 R2 K3 + 0x58100004, // 0007 LDCONST R4 K4 + 0x58140002, // 0008 LDCONST R5 K2 + 0x7C080600, // 0009 CALL R2 3 + 0x8C0C0105, // 000A GETMET R3 R0 K5 + 0x5C140400, // 000B MOVE R5 R2 + 0x7C0C0400, // 000C CALL R3 2 + 0x4C100000, // 000D LDNIL R4 + 0x1C0C0604, // 000E EQ R3 R3 R4 + 0x780E0000, // 000F JMPF R3 #0011 + 0x80040400, // 0010 RET 1 R2 + 0x7001FFEE, // 0011 JMP #0001 + 0x80000000, // 0012 RET 0 + }) + ) +); +/*******************************************************************/ + + /******************************************************************** ** Solidified class: Matter_Session_Store ********************************************************************/ be_local_class(Matter_Session_Store, - 2, + 3, NULL, - be_nested_map(26, + be_nested_map(27, ( (struct bmapnode*) &(const bmapnode[]) { - { be_const_key_weak(gen_local_session_id, 25), be_const_closure(Matter_Session_Store_gen_local_session_id_closure) }, - { be_const_key_weak(remove_redundant_fabric, 15), be_const_closure(Matter_Session_Store_remove_redundant_fabric_closure) }, - { be_const_key_weak(find_session_by_resumption_id, -1), be_const_closure(Matter_Session_Store_find_session_by_resumption_id_closure) }, - { be_const_key_weak(fabrics, 5), be_const_var(1) }, - { be_const_key_weak(add_fabric, -1), be_const_closure(Matter_Session_Store_add_fabric_closure) }, + { be_const_key_weak(gen_local_session_id, -1), be_const_closure(Matter_Session_Store_gen_local_session_id_closure) }, { be_const_key_weak(create_fabric, -1), be_const_closure(Matter_Session_Store_create_fabric_closure) }, - { be_const_key_weak(sessions_active, -1), be_const_closure(Matter_Session_Store_sessions_active_closure) }, - { be_const_key_weak(add_session, -1), be_const_closure(Matter_Session_Store_add_session_closure) }, - { be_const_key_weak(count_active_fabrics, -1), be_const_closure(Matter_Session_Store_count_active_fabrics_closure) }, - { be_const_key_weak(remove_expired, 17), be_const_closure(Matter_Session_Store_remove_expired_closure) }, - { be_const_key_weak(_FABRICS, -1), be_nested_str_weak(_matter_fabrics_X2Ejson) }, - { be_const_key_weak(find_fabric_by_index, -1), be_const_closure(Matter_Session_Store_find_fabric_by_index_closure) }, - { be_const_key_weak(sessions, 4), be_const_var(0) }, - { be_const_key_weak(get_session_by_source_node_id, 11), be_const_closure(Matter_Session_Store_get_session_by_source_node_id_closure) }, - { be_const_key_weak(next_fabric_idx, -1), be_const_closure(Matter_Session_Store_next_fabric_idx_closure) }, - { be_const_key_weak(get_session_by_local_session_id, 24), be_const_closure(Matter_Session_Store_get_session_by_local_session_id_closure) }, - { be_const_key_weak(active_fabrics, -1), be_const_closure(Matter_Session_Store_active_fabrics_closure) }, - { be_const_key_weak(every_second, -1), be_const_closure(Matter_Session_Store_every_second_closure) }, - { be_const_key_weak(remove_session, -1), be_const_closure(Matter_Session_Store_remove_session_closure) }, - { be_const_key_weak(init, -1), be_const_closure(Matter_Session_Store_init_closure) }, - { be_const_key_weak(create_session, -1), be_const_closure(Matter_Session_Store_create_session_closure) }, + { be_const_key_weak(get_session_by_source_node_id, -1), be_const_closure(Matter_Session_Store_get_session_by_source_node_id_closure) }, { be_const_key_weak(save_fabrics, -1), be_const_closure(Matter_Session_Store_save_fabrics_closure) }, - { be_const_key_weak(load_fabrics, -1), be_const_closure(Matter_Session_Store_load_fabrics_closure) }, - { be_const_key_weak(remove_fabric, 6), be_const_closure(Matter_Session_Store_remove_fabric_closure) }, - { be_const_key_weak(find_children_fabrics, -1), be_const_closure(Matter_Session_Store_find_children_fabrics_closure) }, - { be_const_key_weak(find_session_source_id_unsecure, -1), be_const_closure(Matter_Session_Store_find_session_source_id_unsecure_closure) }, + { be_const_key_weak(active_fabrics, 10), be_const_closure(Matter_Session_Store_active_fabrics_closure) }, + { be_const_key_weak(find_session_by_resumption_id, 20), be_const_closure(Matter_Session_Store_find_session_by_resumption_id_closure) }, + { be_const_key_weak(sessions_active, -1), be_const_closure(Matter_Session_Store_sessions_active_closure) }, + { be_const_key_weak(sessions, -1), be_const_var(1) }, + { be_const_key_weak(fabrics, -1), be_const_var(2) }, + { be_const_key_weak(load_fabrics, 6), be_const_closure(Matter_Session_Store_load_fabrics_closure) }, + { be_const_key_weak(find_session_source_id_unsecure, 23), be_const_closure(Matter_Session_Store_find_session_source_id_unsecure_closure) }, + { be_const_key_weak(_FABRICS, -1), be_nested_str_weak(_matter_fabrics_X2Ejson) }, + { be_const_key_weak(remove_session, -1), be_const_closure(Matter_Session_Store_remove_session_closure) }, + { be_const_key_weak(remove_fabric, 22), be_const_closure(Matter_Session_Store_remove_fabric_closure) }, + { be_const_key_weak(find_fabric_by_index, 19), be_const_closure(Matter_Session_Store_find_fabric_by_index_closure) }, + { be_const_key_weak(remove_expired, -1), be_const_closure(Matter_Session_Store_remove_expired_closure) }, + { be_const_key_weak(add_session, -1), be_const_closure(Matter_Session_Store_add_session_closure) }, + { be_const_key_weak(remove_redundant_fabric, 11), be_const_closure(Matter_Session_Store_remove_redundant_fabric_closure) }, + { be_const_key_weak(create_session, -1), be_const_closure(Matter_Session_Store_create_session_closure) }, + { be_const_key_weak(get_session_by_local_session_id, -1), be_const_closure(Matter_Session_Store_get_session_by_local_session_id_closure) }, + { be_const_key_weak(init, -1), be_const_closure(Matter_Session_Store_init_closure) }, + { be_const_key_weak(every_second, -1), be_const_closure(Matter_Session_Store_every_second_closure) }, + { be_const_key_weak(add_fabric, -1), be_const_closure(Matter_Session_Store_add_fabric_closure) }, + { be_const_key_weak(count_active_fabrics, -1), be_const_closure(Matter_Session_Store_count_active_fabrics_closure) }, + { be_const_key_weak(device, 5), be_const_var(0) }, + { be_const_key_weak(next_fabric_idx, 3), be_const_closure(Matter_Session_Store_next_fabric_idx_closure) }, + { be_const_key_weak(find_children_fabrics, 0), be_const_closure(Matter_Session_Store_find_children_fabrics_closure) }, })), be_str_weak(Matter_Session_Store) ); From f9e3b25c9b2eecce33a8129d519075126cb2f6e4 Mon Sep 17 00:00:00 2001 From: s-hadinger <49731213+s-hadinger@users.noreply.github.com> Date: Sat, 22 Apr 2023 23:56:35 +0200 Subject: [PATCH 028/289] Matter persist plugins when fabrics (#18487) --- .../src/embedded/Matter_Device.be | 8 ++-- .../src/solidify/solidified_Matter_Device.h | 38 +++++++++++-------- 2 files changed, 26 insertions(+), 20 deletions(-) diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Device.be b/lib/libesp32/berry_matter/src/embedded/Matter_Device.be index dec7f2c9e..23b4e2fde 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Device.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Device.be @@ -111,10 +111,6 @@ class Matter_Device tasmota.add_driver(self) self.register_commands() - - if self.sessions.count_active_fabrics() > 0 - self.plugins_persist = true # if there are active fabrics, then we persist plugins configuration - end end ############################################################# @@ -983,6 +979,10 @@ class Matter_Device tasmota.log("MTR: autoconfig = " + str(config), 3) self._load_plugins_config(config) + if !self.plugins_persist && self.sessions.count_active_fabrics() > 0 + self.plugins_persist = true + self.save_param() + end end ############################################################# diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Device.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Device.h index b34301182..6404ddaf1 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Device.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Device.h @@ -2012,7 +2012,7 @@ be_local_closure(Matter_Device_autoconf_device, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[10]) { /* constants */ + ( &(const bvalue[14]) { /* constants */ /* K0 */ be_nested_str_weak(string), /* K1 */ be_nested_str_weak(json), /* K2 */ be_nested_str_weak(plugins), @@ -2023,10 +2023,14 @@ be_local_closure(Matter_Device_autoconf_device, /* name */ /* K7 */ be_nested_str_weak(MTR_X3A_X20autoconfig_X20_X3D_X20), /* K8 */ be_const_int(3), /* K9 */ be_nested_str_weak(_load_plugins_config), + /* K10 */ be_nested_str_weak(plugins_persist), + /* K11 */ be_nested_str_weak(sessions), + /* K12 */ be_nested_str_weak(count_active_fabrics), + /* K13 */ be_nested_str_weak(save_param), }), be_str_weak(autoconf_device), &be_const_str_solidified, - ( &(const binstruction[22]) { /* code */ + ( &(const binstruction[33]) { /* code */ 0xA4060000, // 0000 IMPORT R1 K0 0xA40A0200, // 0001 IMPORT R2 K1 0x600C000C, // 0002 GETGBL R3 G12 @@ -2048,7 +2052,18 @@ be_local_closure(Matter_Device_autoconf_device, /* name */ 0x8C100109, // 0012 GETMET R4 R0 K9 0x5C180600, // 0013 MOVE R6 R3 0x7C100400, // 0014 CALL R4 2 - 0x80000000, // 0015 RET 0 + 0x8810010A, // 0015 GETMBR R4 R0 K10 + 0x74120008, // 0016 JMPT R4 #0020 + 0x8810010B, // 0017 GETMBR R4 R0 K11 + 0x8C10090C, // 0018 GETMET R4 R4 K12 + 0x7C100200, // 0019 CALL R4 1 + 0x24100903, // 001A GT R4 R4 K3 + 0x78120003, // 001B JMPF R4 #0020 + 0x50100200, // 001C LDBOOL R4 1 0 + 0x90021404, // 001D SETMBR R0 K10 R4 + 0x8C10010D, // 001E GETMET R4 R0 K13 + 0x7C100200, // 001F CALL R4 1 + 0x80000000, // 0020 RET 0 }) ) ); @@ -2275,7 +2290,7 @@ be_local_closure(Matter_Device_init, /* name */ ), }), 1, /* has constants */ - ( &(const bvalue[41]) { /* constants */ + ( &(const bvalue[39]) { /* constants */ /* K0 */ be_nested_str_weak(crypto), /* K1 */ be_nested_str_weak(string), /* K2 */ be_nested_str_weak(tasmota), @@ -2315,12 +2330,10 @@ be_local_closure(Matter_Device_init, /* name */ /* K36 */ be_nested_str_weak(_init_basic_commissioning), /* K37 */ be_nested_str_weak(add_driver), /* K38 */ be_nested_str_weak(register_commands), - /* K39 */ be_nested_str_weak(count_active_fabrics), - /* K40 */ be_const_int(0), }), be_str_weak(init), &be_const_str_solidified, - ( &(const binstruction[108]) { /* code */ + ( &(const binstruction[101]) { /* code */ 0xA4060000, // 0000 IMPORT R1 K0 0xA40A0200, // 0001 IMPORT R2 K1 0xB80E0400, // 0002 GETNGBL R3 K2 @@ -2420,15 +2433,8 @@ be_local_closure(Matter_Device_init, /* name */ 0x7C0C0400, // 0060 CALL R3 2 0x8C0C0126, // 0061 GETMET R3 R0 K38 0x7C0C0200, // 0062 CALL R3 1 - 0x880C0116, // 0063 GETMBR R3 R0 K22 - 0x8C0C0727, // 0064 GETMET R3 R3 K39 - 0x7C0C0200, // 0065 CALL R3 1 - 0x240C0728, // 0066 GT R3 R3 K40 - 0x780E0001, // 0067 JMPF R3 #006A - 0x500C0200, // 0068 LDBOOL R3 1 0 - 0x90021203, // 0069 SETMBR R0 K9 R3 - 0xA0000000, // 006A CLOSE R0 - 0x80000000, // 006B RET 0 + 0xA0000000, // 0063 CLOSE R0 + 0x80000000, // 0064 RET 0 }) ) ); From 799ba675eb523afc2c2b3314e5c04bfe180869e6 Mon Sep 17 00:00:00 2001 From: gemu Date: Sun, 23 Apr 2023 10:19:31 +0200 Subject: [PATCH 029/289] add xpt2046 option for spi bus 2 (#18480) * allow spi bus 2 * xpt spi bus 2 * xpt option bus * xpt option spi bus 2 * exclude c3 * exclude s2 * fix s3 * typo --- .../XPT2046_Touchscreen.cpp | 25 ++++++++++++++-- .../XPT2046_Touchscreen/XPT2046_Touchscreen.h | 6 ++-- tasmota/tasmota_xdrv_driver/xdrv_55_touch.ino | 29 +++++++++++++++++-- .../tasmota_xdsp_display/xdsp_04_ili9341.ino | 2 +- .../xdsp_17_universal.ino | 14 +++++++-- 5 files changed, 66 insertions(+), 10 deletions(-) diff --git a/lib/lib_display/XPT2046_Touchscreen/XPT2046_Touchscreen.cpp b/lib/lib_display/XPT2046_Touchscreen/XPT2046_Touchscreen.cpp index 3b9bc4077..3972f0a49 100755 --- a/lib/lib_display/XPT2046_Touchscreen/XPT2046_Touchscreen.cpp +++ b/lib/lib_display/XPT2046_Touchscreen/XPT2046_Touchscreen.cpp @@ -30,10 +30,31 @@ static XPT2046_Touchscreen *isrPinptr; void isrPin(void); -bool XPT2046_Touchscreen::begin(SPIClass &wspi) -{ +bool XPT2046_Touchscreen::begin(SPIClass &wspi) { + +#ifdef ESP32 + if (!bus) { + _pspi = &wspi; + } else { +#ifndef CONFIG_IDF_TARGET_ESP32C3 +#ifndef CONFIG_IDF_TARGET_ESP32S2 + if (bus == 1) { + _pspi = new SPIClass(HSPI); + } else { +#ifndef CONFIG_IDF_TARGET_ESP32S3 + _pspi = new SPIClass(VSPI); +#endif + } +#endif +#endif + } + //Serial.printf("sclk=%d :: miso=%d, mosi=%d, irq=%d, bus=%d ", sclk, miso, mosi, tirqPin, bus); + _pspi->begin(sclk, miso, mosi, -1); +#else _pspi = &wspi; _pspi->begin(); +#endif + pinMode(csPin, OUTPUT); digitalWrite(csPin, HIGH); if (255 != tirqPin) { diff --git a/lib/lib_display/XPT2046_Touchscreen/XPT2046_Touchscreen.h b/lib/lib_display/XPT2046_Touchscreen/XPT2046_Touchscreen.h index 279bebe8e..30e5066dd 100755 --- a/lib/lib_display/XPT2046_Touchscreen/XPT2046_Touchscreen.h +++ b/lib/lib_display/XPT2046_Touchscreen/XPT2046_Touchscreen.h @@ -47,8 +47,8 @@ public: class XPT2046_Touchscreen { public: - constexpr XPT2046_Touchscreen(uint8_t cspin, uint8_t tirq=255) - : csPin(cspin), tirqPin(tirq) { } + constexpr XPT2046_Touchscreen(uint8_t cspin, uint8_t tirq=255, uint8_t bus=0, uint8_t sclk=0, uint8_t miso=0, uint8_t mosi=0) + : csPin(cspin), tirqPin(tirq), bus(bus), sclk(sclk), miso(miso), mosi(mosi) { } bool begin(SPIClass &wspi = SPI); #if defined(_FLEXIO_SPI_H_) bool begin(FlexIOSPI &wflexspi); @@ -66,7 +66,7 @@ public: private: void update(); - uint8_t csPin, tirqPin, rotation=1; + uint8_t csPin, tirqPin, rotation=1, bus=0, sclk=0, miso=0, mosi=0; int16_t xraw=0, yraw=0, zraw=0; uint32_t msraw=0x80000000; SPIClass *_pspi = nullptr; diff --git a/tasmota/tasmota_xdrv_driver/xdrv_55_touch.ino b/tasmota/tasmota_xdrv_driver/xdrv_55_touch.ino index 69843572b..01bbe97ca 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_55_touch.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_55_touch.ino @@ -228,6 +228,8 @@ bool GT911_Touch_Init(TwoWire *i2c, int8_t irq_pin, int8_t rst_pin, uint16_t xs, if (ESP_OK == GT911_touchp->begin(i2c, irq_pin, rst_pin, xs, ys)) { AddLog(LOG_LEVEL_INFO, PSTR("TI: GT911")); GT911_found = true; + } else { + AddLog(LOG_LEVEL_INFO, PSTR("TI: GT911 failed")); } return GT911_found; } @@ -247,8 +249,31 @@ void GT911_CheckTouch(void) { #include XPT2046_Touchscreen *XPT2046_touchp; -bool XPT2046_Touch_Init(uint16_t CS) { - XPT2046_touchp = new XPT2046_Touchscreen(CS); +bool XPT2046_Touch_Init(uint16_t CS, int8_t irqpin, uint8_t bus) { + int8_t sclk = -1; + int8_t mosi = -1; + int8_t miso = -1; + uint8_t xbus = bus; + bus &= 1; + #ifdef ESP32 + if (PinUsed(GPIO_SPI_CLK, bus) && PinUsed(GPIO_SPI_MISO, bus) && PinUsed(GPIO_SPI_MOSI, bus)) { + // must init SPI with pins + sclk = Pin(GPIO_SPI_CLK, bus); + miso = Pin(GPIO_SPI_MISO, bus); + mosi = Pin(GPIO_SPI_MOSI, bus); + } + #endif // ESP32 + + #ifdef ESP8266 + if (PinUsed(GPIO_SPI_CLK) && PinUsed(GPIO_SPI_MISO) && PinUsed(GPIO_SPI_MOSI)) { + // must init SPI with pins + sclk = Pin(GPIO_SPI_CLK); + miso = Pin(GPIO_SPI_MISO); + mosi = Pin(GPIO_SPI_MOSI); + } + #endif // ESP8266 + + XPT2046_touchp = new XPT2046_Touchscreen(CS, irqpin, xbus, sclk, miso, mosi); XPT2046_found = XPT2046_touchp->begin(); if (XPT2046_found) { AddLog(LOG_LEVEL_INFO, PSTR("TS: XPT2046")); diff --git a/tasmota/tasmota_xdsp_display/xdsp_04_ili9341.ino b/tasmota/tasmota_xdsp_display/xdsp_04_ili9341.ino index 96dae6558..169e223c2 100644 --- a/tasmota/tasmota_xdsp_display/xdsp_04_ili9341.ino +++ b/tasmota/tasmota_xdsp_display/xdsp_04_ili9341.ino @@ -132,7 +132,7 @@ void ILI9341_InitDriver() #endif // ESP32 #ifdef USE_XPT2046 - XPT2046_Touch_Init(Pin(GPIO_XPT2046_CS)); + XPT2046_Touch_Init(Pin(GPIO_XPT2046_CS),-1,0); #endif tft_init_done = true; diff --git a/tasmota/tasmota_xdsp_display/xdsp_17_universal.ino b/tasmota/tasmota_xdsp_display/xdsp_17_universal.ino index c3154cd60..c784ed31c 100644 --- a/tasmota/tasmota_xdsp_display/xdsp_17_universal.ino +++ b/tasmota/tasmota_xdsp_display/xdsp_17_universal.ino @@ -392,9 +392,19 @@ int8_t cs; #ifdef USE_XPT2046 cp = strstr(ddesc, ":TS,"); if (cp) { - cp+=4; + cp += 4; uint8_t touch_cs = replacepin(&cp, Pin(GPIO_XPT2046_CS)); - XPT2046_Touch_Init(touch_cs); + int8_t irqpin = -1; + if (*(cp - 1) == ',') { + irqpin = strtol(cp, &cp, 10); + } + uint8_t bus = 1; + if (*cp == ',') { + cp++; + bus = strtol(cp, &cp, 10); + if (bus < 1) bus = 1; + } + XPT2046_Touch_Init(touch_cs, irqpin, bus - 1); } #endif // USE_XPT2046 From 21bb822dec0cd13f8af66a532297cfa70db4ef7a Mon Sep 17 00:00:00 2001 From: Felix Laevsky Date: Sun, 23 Apr 2023 11:51:00 +0300 Subject: [PATCH 030/289] Fix for ModuleAddress command (#18490) --- tasmota/tasmota_xnrg_energy/xnrg_05_pzem_ac.ino | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/tasmota/tasmota_xnrg_energy/xnrg_05_pzem_ac.ino b/tasmota/tasmota_xnrg_energy/xnrg_05_pzem_ac.ino index 03c0f1e10..a1ca3c610 100644 --- a/tasmota/tasmota_xnrg_energy/xnrg_05_pzem_ac.ino +++ b/tasmota/tasmota_xnrg_energy/xnrg_05_pzem_ac.ino @@ -50,6 +50,7 @@ struct PZEMAC { void PzemAcEverySecond(void) { bool data_ready = PzemAcModbus->ReceiveReady(); + uint16_t addr; if (data_ready) { uint8_t buffer[30]; // At least 5 + (2 * 10) = 25 @@ -95,7 +96,8 @@ void PzemAcEverySecond(void) } PzemAc.send_retry = ENERGY_WATCHDOG; if (ADDR_SEND == PzemAc.address_step) { - PzemAcModbus->Send(0xF8, 0x06, 0x0002, (uint16_t)PzemAc.address); + addr = PzemAc.address; + PzemAcModbus->Send(0xF8, 0x06, 0x0002, 1, (uint16_t *) &addr); PzemAc.address_step--; } else { PzemAcModbus->Send(PZEM_AC_DEVICE_ADDRESS + PzemAc.phase, 0x04, 0, 10); From c1db67ce376ae5bf93c8abc0092632cbe595157d Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Sun, 23 Apr 2023 18:09:33 +0200 Subject: [PATCH 031/289] Refactor GDK101 driver --- .../tasmota_xsns_sensor/xsns_106_gdk101.ino | 263 ++++++++---------- 1 file changed, 121 insertions(+), 142 deletions(-) diff --git a/tasmota/tasmota_xsns_sensor/xsns_106_gdk101.ino b/tasmota/tasmota_xsns_sensor/xsns_106_gdk101.ino index e8cdcb782..cdccf5ce8 100644 --- a/tasmota/tasmota_xsns_sensor/xsns_106_gdk101.ino +++ b/tasmota/tasmota_xsns_sensor/xsns_106_gdk101.ino @@ -1,7 +1,7 @@ /* xsns_106_gdk101.ino - Support for GDK101 gamma radiation sensor - - Copyright (C) 2019 Petr Novacek + + Copyright (C) 2019 Petr Novacek This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -23,37 +23,35 @@ /*********************************************************************************************\ * GDK101 gamma radiation sensor ftlab.co.kr * - * For background information see http://allsmartlab.com/eng/294-2/ + * For background information see http://allsmartlab.com/eng/294-2/ and AN_GDK101_V1.1_I2C.pdf * - * I2C Address: + * I2C Address: * A0 Short, A1 Short : 0x18 * A0 Open, A1 Short : 0x19 * A0 Short, A1 Open : 0x1A * A0 Open, A1 Open : 0x1B \*********************************************************************************************/ -#define XSNS_106 106 +#define XSNS_106 106 -#define XI2C_79 79 // See I2CDEVICES.md +#define XI2C_79 79 // See I2CDEVICES.md // I2C adresses -#define GDK101_ADDRESS1 0x18 -#define GDK101_ADDRESS2 0x19 -#define GDK101_ADDRESS3 0x1A -#define GDK101_ADDRESS4 0x1B +#define GDK101_ADDRESS1 0x18 +#define GDK101_ADDRESS2 0x19 +#define GDK101_ADDRESS3 0x1A +#define GDK101_ADDRESS4 0x1B // I2C register -#define READ_FIRMWARE 0xB4 -#define RESET 0xA0 -#define READ_STATUS 0xB0 -#define READ_MEASURING_TIME 0xB1 -#define READ_10MIN_AVG 0xB2 -#define READ_1MIN_AVG 0xB3 +#define GDK101_RESET 0xA0 +#define GDK101_READ_STATUS 0xB0 +#define GDK101_READ_MEASURING_TIME 0xB1 +#define GDK101_READ_10MIN_AVG 0xB2 +#define GDK101_READ_1MIN_AVG 0xB3 +#define GDK101_READ_FIRMWARE 0xB4 // gdk101 variables -uint8_t gdk101_address; uint8_t gdk101_addresses[] = { GDK101_ADDRESS1, GDK101_ADDRESS2, GDK101_ADDRESS3, GDK101_ADDRESS4 }; -uint8_t gdk101_discovered = false; typedef enum { GDK_STATUS_READY, @@ -82,86 +80,69 @@ typedef struct gdk_avg_dose { uint8_t fractional; } gdk_avg_dose_t; -bool gdk_ready = false; -gdk_fW_version_t fw_version; -gdk_avg_dose_t mea_10min_avg; -gdk_avg_dose_t mea_1min_avg; -gdk_status_data_t gdk_status = {GDK_STATUS_INVALID, false}; -gdk_measuring_time_t gdk_time = {0, 0}; -uint8_t evr10 = 0; -// uint8_t vibr = 0; +struct GDK { + uint32_t time; +// gdk_measuring_time_t time = {0, 0}; + gdk_fW_version_t version; + gdk_avg_dose_t ard_10min; + gdk_avg_dose_t ard_1min; + gdk_status_data_t status = {GDK_STATUS_INVALID, false}; + uint8_t address; + uint8_t evr10 = 0; + bool ready = false; +} Gdk; -#ifdef USE_WEBSERVER -const char HTTP_GDK101_FW[] PROGMEM = "{s}%s " "FW Version" "{m}%d.%d{e}"; -const char HTTP_GDK101_STATUS[] PROGMEM = "{s}%s " "Status" "{m}%d{e}"; -const char HTTP_GDK101_VIB_STATUS[] PROGMEM = "{s}%s " "Vibration Status" "{m}%d{e}"; -const char HTTP_GDK101_MEAS_TIME[] PROGMEM = "{s}%s " "Measurement Time" "{m}%d:%02d{e}"; -#endif // USE_WEBSERVER +/********************************************************************************************/ -bool gdk101_reset(bool *reset); - -void gdk101_err_log(bool ret) { - if(!ret) { +void Gdk101ErrLog(bool ret) { + if (!ret) { DEBUG_SENSOR_LOG("GDK101: I2C read error"); } } -void gdk101_detect(void) -{ - bool ret = false; - bool reset = false; +void Gdk101Detect(void) { for (uint32_t i = 0; i < sizeof(gdk101_addresses); i++) { - gdk101_address = gdk101_addresses[i]; - if (!I2cSetDevice(gdk101_address)) { - continue; // do not make the next step without a confirmed device on the bus + Gdk.address = gdk101_addresses[i]; + if (!I2cSetDevice(Gdk.address)) { + continue; // Do not make the next step without a confirmed device on the bus } - ret = gdk101_reset(&reset); - if(ret) { - if(reset) { + bool reset = false; + bool ret = Gdk101Reset(&reset); + if (ret) { + if (reset) { delay(10); - I2cSetActiveFound(gdk101_address, "GDK101"); - ret = gdk101_get_fw_version(&fw_version); - gdk101_err_log(ret); - gdk_ready = true; + I2cSetActiveFound(Gdk.address, "GDK101"); + ret = Gdk101Firmware(&Gdk.version); + Gdk101ErrLog(ret); + Gdk.ready = true; break; } } } } -void gdk101_init() { - - if (gdk_ready) return; - - gdk101_detect(); - -} - -bool gdk101_reset(bool *reset) { +bool Gdk101Reset(bool *reset) { uint8_t buf; - bool ret = false; - ret = I2cValidRead8(&buf, gdk101_address, RESET); + bool ret = I2cValidRead8(&buf, Gdk.address, GDK101_RESET); if (ret) { - *reset = (bool) buf; + *reset = (bool) buf; // 0 = Reset fail, 1 = Reset success } return ret; } -bool gdk101_get_fw_version(struct gdk_fW_version *fw) { +bool Gdk101Firmware(struct gdk_fW_version *fw) { uint8_t buf[2]; - bool ret = false; - ret = I2cValidRead16LE((uint16_t*) buf, gdk101_address, READ_FIRMWARE); + bool ret = I2cValidRead16LE((uint16_t*) buf, Gdk.address, GDK101_READ_FIRMWARE); if (ret) { - fw->major = buf[0]; - fw->minor = buf[1]; + fw->major = buf[0]; // 0 + fw->minor = buf[1]; // 6 } return ret; } -bool gdk101_get_10min_avg(struct gdk_avg_dose *avg) { +bool Gdk101Ard10min(struct gdk_avg_dose *avg) { uint8_t buf[2]; - bool ret = false; - ret = I2cValidRead16LE((uint16_t*) buf, gdk101_address, READ_10MIN_AVG); + bool ret = I2cValidRead16LE((uint16_t*) buf, Gdk.address, GDK101_READ_10MIN_AVG); if (ret) { avg->integral = buf[0]; avg->fractional = buf[1]; @@ -169,10 +150,9 @@ bool gdk101_get_10min_avg(struct gdk_avg_dose *avg) { return ret; } -bool gdk101_get_1min_avg(struct gdk_avg_dose *avg) { +bool Gdk101Ard1min(struct gdk_avg_dose *avg) { uint8_t buf[2]; - bool ret = false; - ret = I2cValidRead16LE((uint16_t*) buf, gdk101_address, READ_1MIN_AVG); + bool ret = I2cValidRead16LE((uint16_t*) buf, Gdk.address, GDK101_READ_1MIN_AVG); if (ret) { avg->integral = buf[0]; avg->fractional = buf[1]; @@ -180,21 +160,20 @@ bool gdk101_get_1min_avg(struct gdk_avg_dose *avg) { return ret; } -bool gdk101_get_status(struct gdk_status_data *status) { +bool Gdk101Status(struct gdk_status_data *status) { uint8_t buf[2]; - bool ret = false; - ret = I2cValidRead16LE((uint16_t*) buf, gdk101_address, READ_STATUS); + bool ret = I2cValidRead16LE((uint16_t*) buf, Gdk.address, GDK101_READ_STATUS); if (ret) { - status->status = (gdk_status_t) buf[0]; - status->vibration = (bool) buf[1]; + status->status = (gdk_status_t) buf[0]; // 0 = Ready, 1 = 10min Waiting, 2 = Normal + status->vibration = (bool) buf[1]; // 0 = Off, 1 = On } return ret; } -bool gdk101_get_measuring_time(struct gdk_measuring_time *meas_time) { +bool Gdk101MeasuringTime(struct gdk_measuring_time *meas_time) { + // Can return 255 minutes and 60 seconds - Not used in Application Note AN_GDK101_V1.1 uint8_t buf[2]; - bool ret = false; - ret = I2cValidRead16LE((uint16_t*) buf, gdk101_address, READ_MEASURING_TIME); + bool ret = I2cValidRead16LE((uint16_t*) buf, Gdk.address, GDK101_READ_MEASURING_TIME); if (ret) { meas_time->min = buf[0]; meas_time->sec = buf[1]; @@ -202,98 +181,98 @@ bool gdk101_get_measuring_time(struct gdk_measuring_time *meas_time) { return ret; } -void every_second(void) { - if (!gdk_ready) return; - - gdk101_every_second(); - - if (evr10 == 10) { - gdk101_every_10_second(); - evr10 = 1; - } - else { - evr10++; +void Gdk101EverySecond(void) { + bool ret = Gdk101Status(&Gdk.status); + Gdk101ErrLog(ret); + if (Gdk.status.status > GDK_STATUS_READY) { + Gdk.time++; + } else { + Gdk.time = 0; } + Gdk.evr10++; + if (10 == Gdk.evr10) { + Gdk.evr10 = 0; + + ret = Gdk101Ard10min(&Gdk.ard_10min); + Gdk101ErrLog(ret); + ret = Gdk101Ard1min(&Gdk.ard_1min); + Gdk101ErrLog(ret); +// ret = Gdk101MeasuringTime(&Gdk.time); +// Gdk101ErrLog(ret); + } } -void gdk101_every_second(void) { - bool ret = false; +#ifdef USE_WEBSERVER +const char HTTP_GDK101_FW[] PROGMEM = "{s}%s " "FW Version" "{m}%d.%d{e}"; +const char HTTP_GDK101_STATUS[] PROGMEM = "{s}%s " "Status" "{m}%d{e}"; +const char HTTP_GDK101_VIB_STATUS[] PROGMEM = "{s}%s " "Vibration Status" "{m}%d{e}"; +//const char HTTP_GDK101_MEAS_TIME[] PROGMEM = "{s}%s " "Measurement Time" "{m}%d:%02d{e}"; +const char HTTP_GDK101_MEAS_TIME[] PROGMEM = "{s}%s " "Measurement" "{m}%s{e}"; +#endif // USE_WEBSERVER - ret = gdk101_get_status(&gdk_status); - gdk101_err_log(ret); -} -void gdk101_every_10_second(void) { - bool ret = false; - - ret = gdk101_get_10min_avg(&mea_10min_avg); - gdk101_err_log(ret); - ret = gdk101_get_1min_avg(&mea_1min_avg); - gdk101_err_log(ret); - ret = gdk101_get_measuring_time(&gdk_time); - gdk101_err_log(ret); -} - -void gdk101_show(uint8_t json) { +void Gdk101Show(uint8_t json) { char types[16]; strcpy_P(types, PSTR("GDK101")); - if (!gdk_ready) return; - if (json) { ResponseAppend_P(PSTR(",\"%s\":{"), types); - ResponseAppend_P(PSTR("\"FW_V\":%i.%i,"), fw_version.major, fw_version.minor); - ResponseAppend_P(PSTR("\"10MIN_AVG\":%i.%02i,"), mea_10min_avg.integral, mea_10min_avg.fractional); - ResponseAppend_P(PSTR("\"1MIN_AVG\":%i.%02i,"), mea_1min_avg.integral, mea_1min_avg.fractional); - ResponseAppend_P(PSTR("\"STATUS\":%i,"), gdk_status.status); - ResponseAppend_P(PSTR("\"VIBRATION\":%i,"), gdk_status.vibration); - ResponseAppend_P(PSTR("\"MEAS_TIME\":\"%i:%02i\""), gdk_time.min, gdk_time.sec); + ResponseAppend_P(PSTR("\"Firmware\":%i.%i,"), Gdk.version.major, Gdk.version.minor); + ResponseAppend_P(PSTR("\"RadiationAvg10Min\":%i.%02i,"), Gdk.ard_10min.integral, Gdk.ard_10min.fractional); + ResponseAppend_P(PSTR("\"RadiationAvg1Min\":%i.%02i,"), Gdk.ard_1min.integral, Gdk.ard_1min.fractional); + ResponseAppend_P(PSTR("\"Status\":%i,"), Gdk.status.status); + ResponseAppend_P(PSTR("\"Vibration\":%i,"), Gdk.status.vibration); +// ResponseAppend_P(PSTR("\"MeasTime\":\"%i:%02i\""), Gdk.time.min, Gdk.time.sec); + ResponseAppend_P(PSTR("\"Measurement\":\"%s\""), GetDuration(Gdk.time).c_str()); ResponseJsonEnd(); #ifdef USE_WEBSERVER } else { #ifdef GDK101_SHOW_FW_VERSION - WSContentSend_PD(HTTP_GDK101_FW, types, fw_version.major, fw_version.minor); + WSContentSend_PD(HTTP_GDK101_FW, types, Gdk.version.major, Gdk.version.minor); #endif - WSContentSend_PD(HTTP_SNS_AVG_RAD_DOSE, types, "@10", mea_10min_avg.integral, mea_10min_avg.fractional); - WSContentSend_PD(HTTP_SNS_AVG_RAD_DOSE, types, "@1", mea_1min_avg.integral, mea_1min_avg.fractional); + WSContentSend_PD(HTTP_SNS_AVG_RAD_DOSE, types, "10", Gdk.ard_10min.integral, Gdk.ard_10min.fractional); + WSContentSend_PD(HTTP_SNS_AVG_RAD_DOSE, types, "1", Gdk.ard_1min.integral, Gdk.ard_1min.fractional); #ifdef GDK101_SHOW_STATUS - WSContentSend_PD(HTTP_GDK101_STATUS, types, gdk_status.status); + WSContentSend_PD(HTTP_GDK101_STATUS, types, Gdk.status.status); #endif #ifdef GDK101_SHOW_VIBRATION_STATUS - WSContentSend_PD(HTTP_GDK101_VIB_STATUS, types, gdk_status.vibration); -#endif -#ifdef GDK101_SHOW_MEAS_TIME - WSContentSend_PD(HTTP_GDK101_MEAS_TIME, types, gdk_time.min, gdk_time.sec); + WSContentSend_PD(HTTP_GDK101_VIB_STATUS, types, Gdk.status.vibration); #endif +//#ifdef GDK101_SHOW_MEAS_TIME +// WSContentSend_PD(HTTP_GDK101_MEAS_TIME, types, Gdk.time.min, Gdk.time.sec); + WSContentSend_PD(HTTP_GDK101_MEAS_TIME, types, GetDuration(Gdk.time).c_str()); +//#endif #endif // USE_WEBSERVER } } + /*********************************************************************************************\ Interface \*********************************************************************************************/ -bool Xsns106(uint32_t function) -{ - bool result = false; - +bool Xsns106(uint32_t function) { if (!I2cEnabled(XI2C_79)) { return false; } - switch (function) { - case FUNC_INIT: - gdk101_init(); - break; - case FUNC_EVERY_SECOND: - every_second(); - break; - case FUNC_JSON_APPEND: - gdk101_show(1); - break; + bool result = false; + + if (FUNC_INIT == function) { + Gdk101Detect(); + } + else if (Gdk.ready) { + switch (function) { + case FUNC_EVERY_SECOND: + Gdk101EverySecond(); + break; + case FUNC_JSON_APPEND: + Gdk101Show(1); + break; #ifdef USE_WEBSERVER - case FUNC_WEB_SENSOR: - gdk101_show(0); - break; + case FUNC_WEB_SENSOR: + Gdk101Show(0); + break; #endif // USE_WEBSERVER + } } return result; } From 763a8671ab320dd16856da7b8275840a1b93de7b Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Mon, 24 Apr 2023 16:11:54 +0200 Subject: [PATCH 032/289] fix c3 exceptions when using lvgl (#18493) --- lib/libesp32/berry/default/berry_conf.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/libesp32/berry/default/berry_conf.h b/lib/libesp32/berry/default/berry_conf.h index d4aa71573..18d64ad81 100644 --- a/lib/libesp32/berry/default/berry_conf.h +++ b/lib/libesp32/berry/default/berry_conf.h @@ -226,7 +226,7 @@ #define BE_USE_OS_MODULE 0 #define BE_USE_GLOBAL_MODULE 1 #define BE_USE_SYS_MODULE 1 - #define BE_USE_DEBUG_MODULE 1 + #define BE_USE_DEBUG_MODULE 0 #define BE_USE_GC_MODULE 1 #define BE_USE_SOLIDIFY_MODULE 0 #define BE_USE_INTROSPECT_MODULE 1 From 98cad1a192453e48f03b000a358c1aeb40f4d8e9 Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Mon, 24 Apr 2023 16:53:37 +0200 Subject: [PATCH 033/289] Create ST7735S_Air101-LCD_display.ini --- .../ST7735S_Air101-LCD_display.ini | 32 +++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 tasmota/displaydesc/ST7735S_Air101-LCD_display.ini diff --git a/tasmota/displaydesc/ST7735S_Air101-LCD_display.ini b/tasmota/displaydesc/ST7735S_Air101-LCD_display.ini new file mode 100644 index 000000000..daf3ce691 --- /dev/null +++ b/tasmota/displaydesc/ST7735S_Air101-LCD_display.ini @@ -0,0 +1,32 @@ +:H,ST7735S,160,80,16,SPI,1,7,2,3,6,11,10,*,16 +:S,2,1,1,0,30,30 +:I +01,80 +11,80 +B1,3,01,2C,2D +B2,3,01,2C,2D +B3,6,01,2C,2D,01,2C,2D +B4,1,07 +C0,3,A2,04,84 +C1,1,C5 +C2,2,0A,00 +C3,2,8A,2A +C4,2,8A,EE +C5,1,0E +20,0 +36,1,C8 +3A,1,05 +2A,4,00,02,00,7F +2B,4,00,01,00,7F +E0,10,02,1C,07,12,37,32,29,2D,29,25,2B,39,00,01,03,10 +E1,10,03,1D,07,06,2E,2C,29,2D,2E,2E,37,3F,00,00,02,10 +13,80 +29,80 +:o,28 +:O,29 +:A,2A,2B,2C,16 +:R,36 +:0,60,00,18,00 +:i,20,21 +:B,60,1 +# From fba15dea717b98258b0ad5313beac60ad0eac9d5 Mon Sep 17 00:00:00 2001 From: s-hadinger <49731213+s-hadinger@users.noreply.github.com> Date: Mon, 24 Apr 2023 23:01:02 +0200 Subject: [PATCH 034/289] Matter add UI to change endpoints configuration (#18498) --- CHANGELOG.md | 1 + .../src/embedded/Matter_Base38.be | 5 + .../src/embedded/Matter_Device.be | 74 +- .../src/embedded/Matter_MessageHandler.be | 6 +- .../src/embedded/Matter_Plugin.be | 29 +- .../src/embedded/Matter_Plugin_Light0.be | 3 +- .../src/embedded/Matter_Plugin_Light1.be | 3 +- .../src/embedded/Matter_Plugin_Light2.be | 3 +- .../src/embedded/Matter_Plugin_Light3.be | 3 +- .../src/embedded/Matter_Plugin_OnOff.be | 18 +- .../src/embedded/Matter_Plugin_Root.be | 3 +- .../src/embedded/Matter_Plugin_Sensor.be | 14 +- .../embedded/Matter_Plugin_Sensor_Humidity.be | 3 +- .../Matter_Plugin_Sensor_Illuminance.be | 3 +- .../embedded/Matter_Plugin_Sensor_Pressure.be | 3 +- .../src/embedded/Matter_Plugin_Sensor_Temp.be | 3 +- .../src/embedded/Matter_Session.be | 2 +- .../berry_matter/src/embedded/Matter_UI.be | 183 +- .../src/solidify/solidified_Matter_Device.h | 5603 +++++++++-------- .../solidified_Matter_MessageHandler.h | 31 +- .../src/solidify/solidified_Matter_Plugin.h | 567 +- .../solidified_Matter_Plugin_Light0.h | 23 +- .../solidified_Matter_Plugin_Light1.h | 391 +- .../solidified_Matter_Plugin_Light2.h | 351 +- .../solidified_Matter_Plugin_Light3.h | 577 +- .../solidify/solidified_Matter_Plugin_OnOff.h | 374 +- .../solidify/solidified_Matter_Plugin_Root.h | 373 +- .../solidified_Matter_Plugin_Sensor.h | 99 +- ...solidified_Matter_Plugin_Sensor_Humidity.h | 141 +- ...idified_Matter_Plugin_Sensor_Illuminance.h | 139 +- ...solidified_Matter_Plugin_Sensor_Pressure.h | 139 +- .../solidified_Matter_Plugin_Sensor_Temp.h | 141 +- .../src/solidify/solidified_Matter_UI.h | 2260 ++++--- 33 files changed, 6132 insertions(+), 5436 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1365dcecf..acc56390f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,7 @@ All notable changes to this project will be documented in this file. - Matter sensors Humidity, Pressure, Illuminance; optimize memory (#18441) - Command ``SetOption152 0/1`` to select two (0 = default) pin bistable or one (1) pin latching relay control (#18386) - Matter allow `Matter#Initialized` rule once the device is configured (#18451) +- Matter add UI to change endpoints configuration ### Breaking Changed diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Base38.be b/lib/libesp32/berry_matter/src/embedded/Matter_Base38.be index 0992d682d..7a5c84d40 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Base38.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Base38.be @@ -68,4 +68,9 @@ matter.Base38 = Matter_Base38 #- +assert(matter.Base38.encode(bytes("DEADBEEF")) == "C.R.5B6") +assert(matter.Base38.encode(bytes("")) == "") +assert(matter.Base38.encode(bytes("00")) == "00") +assert(matter.Base38.encode(bytes("FFFFFFFF")) == "PLS18R6") + -# diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Device.be b/lib/libesp32/berry_matter/src/embedded/Matter_Device.be index 23b4e2fde..3dc514d64 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Device.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Device.be @@ -21,16 +21,16 @@ class Matter_Device static var UDP_PORT = 5540 # this is the default port for group multicast, we also use it for unicast - static var PASSCODE_DEFAULT = 20202021 static var PBKDF_ITERATIONS = 1000 # I don't see any reason to choose a different number static var VENDOR_ID = 0xFFF1 static var PRODUCT_ID = 0x8000 static var FILENAME = "_matter_device.json" static var PASE_TIMEOUT = 10*60 # default open commissioning window (10 minutes) var started # is the Matter Device started (configured, mDNS and UDPServer started) - var plugins # list of plugins + var plugins # list of plugins instances var plugins_persist # true if plugins configuration needs to be saved var plugins_classes # map of registered classes by type name + var plugins_config # map of JSON configuration for plugins var udp_server # `matter.UDPServer()` object var message_handler # `matter.MessageHandler()` object var sessions # `matter.Session_Store()` objet @@ -600,10 +600,11 @@ class Matter_Device # def save_param() import string + import json var j = string.format('{"distinguish":%i,"passcode":%i,"ipv4only":%s', self.root_discriminator, self.root_passcode, self.ipv4only ? 'true':'false') if self.plugins_persist j += ',"config":' - j += self.plugins_to_json() + j += json.dump(self.plugins_config) end j += '}' try @@ -635,9 +636,9 @@ class Matter_Device self.root_discriminator = j.find("distinguish", self.root_discriminator) self.root_passcode = j.find("passcode", self.root_passcode) self.ipv4only = bool(j.find("ipv4only", false)) - var config = j.find("config") - if config - self._load_plugins_config(config) + self.plugins_config = j.find("config") + if self.plugins_config + self._load_plugins_config(self.plugins_config) self.plugins_persist = true end except .. as e, m @@ -652,7 +653,7 @@ class Matter_Device dirty = true end if self.root_passcode == nil - self.root_passcode = self.PASSCODE_DEFAULT + self.root_passcode = self.generate_random_passcode() dirty = true end if dirty self.save_param() end @@ -975,9 +976,9 @@ class Matter_Device if size(self.plugins) > 0 return end # already configured - var config = self.autoconf_device_map() - tasmota.log("MTR: autoconfig = " + str(config), 3) - self._load_plugins_config(config) + self.plugins_config = self.autoconf_device_map() + tasmota.log("MTR: autoconfig = " + str(self.plugins_config), 3) + self._load_plugins_config(self.plugins_config) if !self.plugins_persist && self.sessions.count_active_fabrics() > 0 self.plugins_persist = true @@ -1096,24 +1097,6 @@ class Matter_Device for i:1..size(l)-1 var k = l[i] var j = i while (j > 0) && (l[j-1] > k) l[j] = l[j-1] j -= 1 end l[j] = k end return l end - ############################################################# - # plugins_to_json - # - # Export plugins configuration as a JSON string - def plugins_to_json() - import string - var s = '{' - var i = 0 - while i < size(self.plugins) - var pi = self.plugins[i] - if i > 0 s += ',' end - s += string.format('"%i":%s', pi.get_endpoint(), pi.to_json()) - i += 1 - end - s += '}' - return s - end - ############################################################# # register_plugin_class # @@ -1122,6 +1105,24 @@ class Matter_Device self.plugins_classes[name] = cl end + ############################################################# + # get_plugin_class_displayname + # + # get a class name light "light0" and return displayname + def get_plugin_class_displayname(name) + var cl = self.plugins_classes.find(name) + return cl ? cl.NAME : "" + end + + ############################################################# + # get_plugin_class_arg + # + # get a class name light "light0" and return the name of the json argumen (or empty) + def get_plugin_class_arg(name) + var cl = self.plugins_classes.find(name) + return cl ? cl.ARG : "" + end + ############################################################# # register_native_classes # @@ -1151,6 +1152,23 @@ class Matter_Device end end + ##################################################################### + # Generate random passcode + ##################################################################### + static var PASSCODE_INVALID = [ 0, 11111111, 22222222, 33333333, 44444444, 55555555, 66666666, 77777777, 88888888, 99999999, 12345678, 87654321] + def generate_random_passcode() + import crypto + var passcode + while true + passcode = crypto.random(4).get(0, 4) & 0x7FFFFFF + if passcode > 0x5F5E0FE continue end # larger than allowed + for inv: self.PASSCODE_INVALID + if passcode == inv passcode = nil end + end + if passcode != nil return passcode end + end + end + ##################################################################### # Commands `Mtr___` ##################################################################### diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_MessageHandler.be b/lib/libesp32/berry_matter/src/embedded/Matter_MessageHandler.be index 6c448b9cd..651731c99 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_MessageHandler.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_MessageHandler.be @@ -203,8 +203,10 @@ class Matter_MessageHandler return ret except .. as e, m tasmota.log("MTR: MessageHandler::msg_received exception: "+str(e)+";"+str(m)) - import debug - debug.traceback() + if self._debug_present + import debug + debug.traceback() + end return false end end diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin.be index 659e39fc4..e36f99d88 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin.be @@ -23,7 +23,10 @@ #@ solidify:Matter_Plugin,weak class Matter_Plugin - static var NAME = "generic" # name of the plug-in in json + static var TYPE = "generic" # name of the plug-in in json + static var NAME = "" # display name of the plug-in + static var ARG = "" # additional argument name (or empty if none) + static var ARG_TYPE = / x -> str(x) # function to convert argument to the right type static var CLUSTERS = { 0x001D: [0,1,2,3,0xFFFC,0xFFFD], # Descriptor Cluster 9.5 p.453 } @@ -220,30 +223,6 @@ class Matter_Plugin self.update_shadow() # force reading value and sending subscriptions end - ############################################################# - # to_json - # - # generate the json string for parameter of the plug-in - # this function calls a method to be overriden with custom parameters - def to_json() - import string - var s = string.format('{"type":"%s"', self.NAME) - s = self.to_json_parameters(s) - s += '}' - return s - end - - ############################################################# - # to_json_parameters - # - # To be overriden. - # returns a json sub-string to add after endpoint and type name - def to_json_parameters(s) - # s += ',"my_param":"my_value"' - return s - end - - end matter.Plugin = Matter_Plugin diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Light0.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Light0.be index 0c0b02465..a5803101d 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Light0.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Light0.be @@ -25,7 +25,8 @@ class Matter_Plugin end #@ solidify:Matter_Plugin_Light0,weak class Matter_Plugin_Light0 : Matter_Plugin - static var NAME = "light0" # name of the plug-in in json + static var TYPE = "light0" # name of the plug-in in json + static var NAME = "Light 0 On" # display name of the plug-in static var CLUSTERS = { # 0x001D: inherited # Descriptor Cluster 9.5 p.453 0x0003: [0,1,0xFFFC,0xFFFD], # Identify 1.2 p.16 diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Light1.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Light1.be index 518b48137..656fbc666 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Light1.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Light1.be @@ -25,7 +25,8 @@ class Matter_Plugin_Light0 end #@ solidify:Matter_Plugin_Light1,weak class Matter_Plugin_Light1 : Matter_Plugin_Light0 - static var NAME = "light1" # name of the plug-in in json + static var TYPE = "light1" # name of the plug-in in json + static var NAME = "Light 1 Dimmer" # display name of the plug-in static var CLUSTERS = { # 0x001D: inherited # Descriptor Cluster 9.5 p.453 # 0x0003: inherited # Identify 1.2 p.16 diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Light2.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Light2.be index 928d0a8f5..8c0cde617 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Light2.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Light2.be @@ -25,7 +25,8 @@ class Matter_Plugin_Light1 end #@ solidify:Matter_Plugin_Light2,weak class Matter_Plugin_Light2 : Matter_Plugin_Light1 - static var NAME = "light2" # name of the plug-in in json + static var TYPE = "light2" # name of the plug-in in json + static var NAME = "Light 2 CT" # display name of the plug-in static var CLUSTERS = { # 0x001D: inherited # Descriptor Cluster 9.5 p.453 # 0x0003: inherited # Identify 1.2 p.16 diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Light3.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Light3.be index dec133661..8e1f63d04 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Light3.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Light3.be @@ -25,7 +25,8 @@ class Matter_Plugin_Light1 end #@ solidify:Matter_Plugin_Light3,weak class Matter_Plugin_Light3 : Matter_Plugin_Light1 - static var NAME = "light3" # name of the plug-in in json + static var TYPE = "light3" # name of the plug-in in json + static var NAME = "Light 3 RGB" # display name of the plug-in static var CLUSTERS = { # 0x001D: inherited # Descriptor Cluster 9.5 p.453 # 0x0003: inherited # Identify 1.2 p.16 diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_OnOff.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_OnOff.be index fd6245ee2..f45a671f8 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_OnOff.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_OnOff.be @@ -25,7 +25,10 @@ class Matter_Plugin end #@ solidify:Matter_Plugin_OnOff,weak class Matter_Plugin_OnOff : Matter_Plugin - static var NAME = "relay" # name of the plug-in in json + static var TYPE = "relay" # name of the plug-in in json + static var NAME = "Relay" # display name of the plug-in + static var ARG = "relay" # additional argument name (or empty if none) + static var ARG_TYPE = / x -> int(x) # function to convert argument to the right type static var CLUSTERS = { # 0x001D: inherited # Descriptor Cluster 9.5 p.453 0x0003: [0,1,0xFFFC,0xFFFD], # Identify 1.2 p.16 @@ -44,7 +47,7 @@ class Matter_Plugin_OnOff : Matter_Plugin def init(device, endpoint, arguments) super(self).init(device, endpoint, arguments) self.get_onoff() # read actual value - self.tasmota_relay_index = arguments.find('relay') + self.tasmota_relay_index = arguments.find(self.ARG #-'relay'-#) if self.tasmota_relay_index == nil self.tasmota_relay_index = 0 end end @@ -215,17 +218,6 @@ class Matter_Plugin_OnOff : Matter_Plugin self.attribute_updated(nil, 0x0006, 0x0000) # send to all endpoints end - ############################################################# - # to_json_parameters - # - # To be overriden. - # returns a json sub-string to add after endpoint and type name - def to_json_parameters(s) - import string - s += string.format(',"relay":%i', self.tasmota_relay_index) - return s - end - ############################################################# # every_second def every_second() diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Root.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Root.be index dce3c003f..0427ed022 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Root.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Root.be @@ -25,7 +25,8 @@ class Matter_Plugin end #@ solidify:Matter_Plugin_Root,weak class Matter_Plugin_Root : Matter_Plugin - static var NAME = "root" # name of the plug-in in json + static var TYPE = "root" # name of the plug-in in json + static var NAME = "Root node" # display name of the plug-in static var CLUSTERS = { # 0x001D: inherited # Descriptor Cluster 9.5 p.453 0x001F: [0,2,3,4], # Access Control Cluster, p.461 diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor.be index 42511fd7e..45b2ee983 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor.be @@ -25,6 +25,7 @@ class Matter_Plugin_Device end #@ solidify:Matter_Plugin_Sensor,weak class Matter_Plugin_Sensor : Matter_Plugin_Device + static var ARG = "filter" # additional argument name (or empty if none) var tasmota_sensor_filter # Rule-type filter to the value, like "ESP32#Temperature" var tasmota_sensor_matcher # Actual matcher object var shadow_value # Last known value @@ -33,7 +34,7 @@ class Matter_Plugin_Sensor : Matter_Plugin_Device # Constructor def init(device, endpoint, arguments) super(self).init(device, endpoint, arguments) - self.tasmota_sensor_filter = arguments.find('filter') + self.tasmota_sensor_filter = arguments.find(self.ARG#-'filter'-#) if self.tasmota_sensor_filter self.tasmota_sensor_matcher = tasmota.Rule_Matcher.parse(self.tasmota_sensor_filter) end @@ -74,16 +75,5 @@ class Matter_Plugin_Sensor : Matter_Plugin_Device return val end - ############################################################# - # to_json_parameters - # - # To be overriden. - # returns a json sub-string to add after endpoint and type name - def to_json_parameters(s) - import string - s += string.format(',"filter":"%s"', self.tasmota_sensor_filter) - return s - end - end matter.Plugin_Sensor = Matter_Plugin_Sensor diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor_Humidity.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor_Humidity.be index 1f85523aa..b31e12965 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor_Humidity.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor_Humidity.be @@ -25,7 +25,8 @@ class Matter_Plugin_Sensor end #@ solidify:Matter_Plugin_Sensor_Humidity,weak class Matter_Plugin_Sensor_Humidity : Matter_Plugin_Sensor - static var NAME = "humidity" # name of the plug-in in json + static var TYPE = "humidity" # name of the plug-in in json + static var NAME = "Humidity" # display name of the plug-in static var CLUSTERS = { 0x0405: [0,1,2,0xFFFC,0xFFFD], # Humidity Measurement p.102 - no writable } diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor_Illuminance.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor_Illuminance.be index bdf631452..f7619bdfb 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor_Illuminance.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor_Illuminance.be @@ -25,7 +25,8 @@ class Matter_Plugin_Sensor end #@ solidify:Matter_Plugin_Sensor_Illuminance,weak class Matter_Plugin_Sensor_Illuminance : Matter_Plugin_Sensor - static var NAME = "illuminance" # name of the plug-in in json + static var TYPE = "illuminance" # name of the plug-in in json + static var NAME = "Illuminance" # display name of the plug-in static var CLUSTERS = { 0x0400: [0,1,2,0xFFFC,0xFFFD], # Illuminance Measurement p.95 - no writable } diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor_Pressure.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor_Pressure.be index c39de113e..47a2110cb 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor_Pressure.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor_Pressure.be @@ -25,7 +25,8 @@ class Matter_Plugin_Sensor end #@ solidify:Matter_Plugin_Sensor_Pressure,weak class Matter_Plugin_Sensor_Pressure : Matter_Plugin_Sensor - static var NAME = "pressure" # name of the plug-in in json + static var TYPE = "pressure" # name of the plug-in in json + static var NAME = "Pressure" # display name of the plug-in static var CLUSTERS = { 0x0403: [0,1,2,0xFFFC,0xFFFD], # Temperature Measurement p.97 - no writable } diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor_Temp.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor_Temp.be index 6dff99c57..9944633be 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor_Temp.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor_Temp.be @@ -25,7 +25,8 @@ class Matter_Plugin_Sensor end #@ solidify:Matter_Plugin_Sensor_Temp,weak class Matter_Plugin_Sensor_Temp : Matter_Plugin_Sensor - static var NAME = "temperature" # name of the plug-in in json + static var TYPE = "temperature" # name of the plug-in in json + static var NAME = "Temperature" # display name of the plug-in static var CLUSTERS = { 0x0402: [0,1,2,0xFFFC,0xFFFD], # Temperature Measurement p.97 - no writable } diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Session.be b/lib/libesp32/berry_matter/src/embedded/Matter_Session.be index 5936c44cf..b0fe0185c 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Session.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Session.be @@ -328,7 +328,7 @@ class Matter_Session : Matter_Expirable end ############################################################# - # Session::to_json() + # Session::tojson() # # convert a single entry as json # returns a JSON string diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_UI.be b/lib/libesp32/berry_matter/src/embedded/Matter_UI.be index 605c55738..5eb86378b 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_UI.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_UI.be @@ -32,6 +32,8 @@ import matter # WebUI for the partition manager ################################################################################# class Matter_UI + static var _CLASSES_TYPES = "root|relay|light0|light1|light2|light3" + "|temperature|pressure|illuminance|humidity" var device def init(device) @@ -64,7 +66,7 @@ class Matter_UI webserver.content_send(string.format("
 Matter %s 

", matter_enabled ? "Enabled" : "Disabled")) - webserver.content_send("

Matter support is experimental.

") + webserver.content_send("

Check the Matter documentation.

") webserver.content_send("
") webserver.content_send(string.format("

") @@ -210,6 +212,79 @@ class Matter_UI end + #- ---------------------------------------------------------------------- -# + #- Show plugins configuration + #- ---------------------------------------------------------------------- -# + def show_plugins_configuration() + import webserver + import string + + webserver.content_send("
 Current Configuration 

") + + webserver.content_send("
") + webserver.content_send("

") + + webserver.content_send("
") + webserver.content_send("") + webserver.content_send("") + + # display one line per plug-in + var endpoints = self.device.k2l_num(self.device.plugins_config) + var i = 0 + while i < size(endpoints) + var ep = endpoints[i] + var conf = self.device.plugins_config[str(ep)] + var typ = conf.find('type') + if !typ continue end + + var arg_name = self.device.get_plugin_class_arg(typ) + var arg = arg_name ? str(conf.find(arg_name, '')) : '' + + webserver.content_send(string.format("", i, ep)) + + webserver.content_send(string.format("")) + webserver.content_send(string.format("", + i, webserver.html_escape(arg))) + + i += 1 + end + + # add an empty line for adding a configuration + webserver.content_send(string.format("", i)) + webserver.content_send(string.format("")) + webserver.content_send(string.format("", i)) + + webserver.content_send("
Ep.TypeParam

") + webserver.content_send("
") + + webserver.content_send("

") + + end + + #- ---------------------------------------------------------------------- -# + #- Show all possible classes for plugin + #- ---------------------------------------------------------------------- -# + def plugin_option(cur) + import webserver + import string + var class_types = string.split(self._CLASSES_TYPES, '|') + + var i = 0 + webserver.content_send("") + while i < size(class_types) + var typ = class_types[i] + var nam = self.device.get_plugin_class_displayname(typ) + webserver.content_send(string.format("", typ, (typ == cur) ? " selected" : "", nam)) + i += 1 + end + end + ####################################################################### # Display the complete page ####################################################################### @@ -224,6 +299,7 @@ class Matter_UI if self.show_enable() self.show_passcode_form() + self.show_plugins_configuration() self.show_fabric_info() end webserver.content_button(webserver.BUTTON_CONFIGURATION) @@ -241,9 +317,7 @@ class Matter_UI import partition_core import persist - - #- check that the partition is valid -# - var p = partition_core.Partition() + var error try @@ -251,6 +325,7 @@ class Matter_UI # Change Passcode and/or Passcode #---------------------------------------------------------------------# if webserver.has_arg("passcode") || webserver.has_arg("discriminator") + tasmota.log(string.format("MTR: /matterc received '%s' command", 'passcode'), 3) if webserver.has_arg("passcode") self.device.root_passcode = int(webserver.arg("passcode")) end @@ -263,17 +338,29 @@ class Matter_UI #- and force restart -# webserver.redirect("/?rst=") + #---------------------------------------------------------------------# + # Enable Matter + #---------------------------------------------------------------------# elif webserver.has_arg("enable") + tasmota.log(string.format("MTR: /matterc received '%s' command", 'enable'), 3) tasmota.cmd("SetOption" + str(matter.MATTER_OPTION) + " 1") #- and force restart -# webserver.redirect("/?rst=") + #---------------------------------------------------------------------# + # Disable Matter + #---------------------------------------------------------------------# elif webserver.has_arg("disable") + tasmota.log(string.format("MTR: /matterc received '%s' command", 'disable'), 3) tasmota.cmd("SetOption" + str(matter.MATTER_OPTION) + " 0") #- and force restart -# webserver.redirect("/?rst=") + #---------------------------------------------------------------------# + # Delete Fabric + #---------------------------------------------------------------------# elif webserver.has_arg("del_fabric") + tasmota.log(string.format("MTR: /matterc received '%s' command", 'del_fabric'), 3) var del_fabric = int(webserver.arg("del_fabric")) var idx = 0 var fabrics = self.device.sessions.fabrics @@ -285,11 +372,87 @@ class Matter_UI idx += 1 end end - - #- and force restart -# + #- reload same page -# webserver.redirect("/matterc?") + #---------------------------------------------------------------------# + # Reset to default auto-configuration + #---------------------------------------------------------------------# + elif webserver.has_arg("auto") + tasmota.log(string.format("MTR: /matterc received '%s' command", 'auto'), 3) + self.device.plugins_persist = false + self.device.save_param() + #- and force restart -# + webserver.redirect("/?rst=") + + #---------------------------------------------------------------------# + # Apply new configuration template + #---------------------------------------------------------------------# + elif webserver.has_arg("config") + var config = {} + + tasmota.log(string.format("MTR: /matterc received '%s' command", 'config'), 3) + # iterate by id + var idx = 0 + var idx_str = string.format("%03i", idx) + while webserver.has_arg('ep'+idx_str) + + var ep = webserver.arg('ep'+idx_str) + var ep_int = int(ep) + var typ = webserver.arg('pi'+idx_str) + var arg = webserver.arg('arg'+idx_str) + tasmota.log(string.format("MTR: ep=%i type=%s arg=%s", ep, typ, arg), 3) + + if ep != '' && typ != '' + + # check if type exists + var typ_class = self.device.plugins_classes.find(typ) + if typ_class != nil + var elt = {'type':typ} + var arg_name = typ_class.ARG + var arg_type = typ_class.ARG_TYPE + if arg && arg_name + elt[arg_name] = arg_type(arg) + end + config[ep] = elt + + else + tasmota.log(string.format("MTR: unknown type = %s", typ), 2) + end + + else + tasmota.log("MTR: skipping parameter", 2) + end + + idx += 1 + idx_str = string.format("%03i", idx) end + + tasmota.log(string.format("MTR: config = %s", str(config)), 3) + + # sanity check + if !config.contains("0") error = "Missing endpoint 0" end + + if error + tasmota.log(string.format("MTR: config error = %s", error), 3) + else + self.device.plugins_config = config + self.device.plugins_persist = true + self.device.save_param() + #- and force restart -# + webserver.redirect("/?rst=") + end + + end + + if error + webserver.content_start("Parameter error") #- title of the web page -# + webserver.content_send_style() #- send standard Tasmota styles -# + webserver.content_send(string.format("

Error:%s

", webserver.html_escape(error))) + webserver.content_button(webserver.BUTTON_CONFIGURATION) #- button back to configuration page -# + webserver.content_stop() #- end of web page -# + end + except .. as e, m tasmota.log(string.format("BRY: Exception> '%s' - %s", e, m), 2) #- display error page -# @@ -298,7 +461,7 @@ class Matter_UI webserver.content_send(string.format("

Exception:
'%s'
%s

", e, m)) - webserver.content_button(webserver.BUTTON_MANAGEMENT) #- button back to management page -# + webserver.content_button(webserver.BUTTON_CONFIGURATION) #- button back to configuration page -# webserver.content_stop() #- end of web page -# end end diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Device.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Device.h index 6404ddaf1..d4d47b146 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Device.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Device.h @@ -6,6 +6,193 @@ extern const bclass be_class_Matter_Device; +/******************************************************************** +** Solidified function: save_param +********************************************************************/ +be_local_closure(Matter_Device_save_param, /* name */ + be_nested_proto( + 11, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[26]) { /* constants */ + /* K0 */ be_nested_str_weak(string), + /* K1 */ be_nested_str_weak(json), + /* K2 */ be_nested_str_weak(format), + /* K3 */ be_nested_str_weak(_X7B_X22distinguish_X22_X3A_X25i_X2C_X22passcode_X22_X3A_X25i_X2C_X22ipv4only_X22_X3A_X25s), + /* K4 */ be_nested_str_weak(root_discriminator), + /* K5 */ be_nested_str_weak(root_passcode), + /* K6 */ be_nested_str_weak(ipv4only), + /* K7 */ be_nested_str_weak(true), + /* K8 */ be_nested_str_weak(false), + /* K9 */ be_nested_str_weak(plugins_persist), + /* K10 */ be_nested_str_weak(_X2C_X22config_X22_X3A), + /* K11 */ be_nested_str_weak(dump), + /* K12 */ be_nested_str_weak(plugins_config), + /* K13 */ be_nested_str_weak(_X7D), + /* K14 */ be_nested_str_weak(FILENAME), + /* K15 */ be_nested_str_weak(w), + /* K16 */ be_nested_str_weak(write), + /* K17 */ be_nested_str_weak(close), + /* K18 */ be_nested_str_weak(tasmota), + /* K19 */ be_nested_str_weak(log), + /* K20 */ be_nested_str_weak(MTR_X3A_X20_X3DSaved_X20_X20_X20_X20_X20parameters_X25s), + /* K21 */ be_nested_str_weak(_X20and_X20condiguration), + /* K22 */ be_nested_str_weak(), + /* K23 */ be_const_int(2), + /* K24 */ be_nested_str_weak(MTR_X3A_X20Session_Store_X3A_X3Asave_X20Exception_X3A), + /* K25 */ be_nested_str_weak(_X7C), + }), + be_str_weak(save_param), + &be_const_str_solidified, + ( &(const binstruction[65]) { /* code */ + 0xA4060000, // 0000 IMPORT R1 K0 + 0xA40A0200, // 0001 IMPORT R2 K1 + 0x8C0C0302, // 0002 GETMET R3 R1 K2 + 0x58140003, // 0003 LDCONST R5 K3 + 0x88180104, // 0004 GETMBR R6 R0 K4 + 0x881C0105, // 0005 GETMBR R7 R0 K5 + 0x88200106, // 0006 GETMBR R8 R0 K6 + 0x78220001, // 0007 JMPF R8 #000A + 0x58200007, // 0008 LDCONST R8 K7 + 0x70020000, // 0009 JMP #000B + 0x58200008, // 000A LDCONST R8 K8 + 0x7C0C0A00, // 000B CALL R3 5 + 0x88100109, // 000C GETMBR R4 R0 K9 + 0x78120004, // 000D JMPF R4 #0013 + 0x000C070A, // 000E ADD R3 R3 K10 + 0x8C10050B, // 000F GETMET R4 R2 K11 + 0x8818010C, // 0010 GETMBR R6 R0 K12 + 0x7C100400, // 0011 CALL R4 2 + 0x000C0604, // 0012 ADD R3 R3 R4 + 0x000C070D, // 0013 ADD R3 R3 K13 + 0xA8020018, // 0014 EXBLK 0 #002E + 0x60100011, // 0015 GETGBL R4 G17 + 0x8814010E, // 0016 GETMBR R5 R0 K14 + 0x5818000F, // 0017 LDCONST R6 K15 + 0x7C100400, // 0018 CALL R4 2 + 0x8C140910, // 0019 GETMET R5 R4 K16 + 0x5C1C0600, // 001A MOVE R7 R3 + 0x7C140400, // 001B CALL R5 2 + 0x8C140911, // 001C GETMET R5 R4 K17 + 0x7C140200, // 001D CALL R5 1 + 0xB8162400, // 001E GETNGBL R5 K18 + 0x8C140B13, // 001F GETMET R5 R5 K19 + 0x8C1C0302, // 0020 GETMET R7 R1 K2 + 0x58240014, // 0021 LDCONST R9 K20 + 0x88280109, // 0022 GETMBR R10 R0 K9 + 0x782A0001, // 0023 JMPF R10 #0026 + 0x58280015, // 0024 LDCONST R10 K21 + 0x70020000, // 0025 JMP #0027 + 0x58280016, // 0026 LDCONST R10 K22 + 0x7C1C0600, // 0027 CALL R7 3 + 0x58200017, // 0028 LDCONST R8 K23 + 0x7C140600, // 0029 CALL R5 3 + 0xA8040001, // 002A EXBLK 1 1 + 0x80040600, // 002B RET 1 R3 + 0xA8040001, // 002C EXBLK 1 1 + 0x70020011, // 002D JMP #0040 + 0xAC100002, // 002E CATCH R4 0 2 + 0x7002000E, // 002F JMP #003F + 0xB81A2400, // 0030 GETNGBL R6 K18 + 0x8C180D13, // 0031 GETMET R6 R6 K19 + 0x60200008, // 0032 GETGBL R8 G8 + 0x5C240800, // 0033 MOVE R9 R4 + 0x7C200200, // 0034 CALL R8 1 + 0x00223008, // 0035 ADD R8 K24 R8 + 0x00201119, // 0036 ADD R8 R8 K25 + 0x60240008, // 0037 GETGBL R9 G8 + 0x5C280A00, // 0038 MOVE R10 R5 + 0x7C240200, // 0039 CALL R9 1 + 0x00201009, // 003A ADD R8 R8 R9 + 0x58240017, // 003B LDCONST R9 K23 + 0x7C180600, // 003C CALL R6 3 + 0x80040600, // 003D RET 1 R3 + 0x70020000, // 003E JMP #0040 + 0xB0080000, // 003F RAISE 2 R0 R0 + 0x80000000, // 0040 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: _trigger_read_sensors +********************************************************************/ +be_local_closure(Matter_Device__trigger_read_sensors, /* name */ + be_nested_proto( + 8, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[11]) { /* constants */ + /* K0 */ be_nested_str_weak(json), + /* K1 */ be_nested_str_weak(tasmota), + /* K2 */ be_nested_str_weak(read_sensors), + /* K3 */ be_nested_str_weak(load), + /* K4 */ be_const_int(0), + /* K5 */ be_nested_str_weak(plugins), + /* K6 */ be_nested_str_weak(parse_sensors), + /* K7 */ be_const_int(1), + /* K8 */ be_nested_str_weak(log), + /* K9 */ be_nested_str_weak(MTR_X3A_X20unable_X20to_X20parse_X20read_sensors_X3A_X20), + /* K10 */ be_const_int(3), + }), + be_str_weak(_trigger_read_sensors), + &be_const_str_solidified, + ( &(const binstruction[37]) { /* code */ + 0xA4060000, // 0000 IMPORT R1 K0 + 0xB80A0200, // 0001 GETNGBL R2 K1 + 0x8C080502, // 0002 GETMET R2 R2 K2 + 0x7C080200, // 0003 CALL R2 1 + 0x4C0C0000, // 0004 LDNIL R3 + 0x1C0C0403, // 0005 EQ R3 R2 R3 + 0x780E0000, // 0006 JMPF R3 #0008 + 0x80000600, // 0007 RET 0 + 0x8C0C0303, // 0008 GETMET R3 R1 K3 + 0x5C140400, // 0009 MOVE R5 R2 + 0x7C0C0400, // 000A CALL R3 2 + 0x4C100000, // 000B LDNIL R4 + 0x20100604, // 000C NE R4 R3 R4 + 0x7812000D, // 000D JMPF R4 #001C + 0x58100004, // 000E LDCONST R4 K4 + 0x6014000C, // 000F GETGBL R5 G12 + 0x88180105, // 0010 GETMBR R6 R0 K5 + 0x7C140200, // 0011 CALL R5 1 + 0x14140805, // 0012 LT R5 R4 R5 + 0x78160006, // 0013 JMPF R5 #001B + 0x88140105, // 0014 GETMBR R5 R0 K5 + 0x94140A04, // 0015 GETIDX R5 R5 R4 + 0x8C140B06, // 0016 GETMET R5 R5 K6 + 0x5C1C0600, // 0017 MOVE R7 R3 + 0x7C140400, // 0018 CALL R5 2 + 0x00100907, // 0019 ADD R4 R4 K7 + 0x7001FFF3, // 001A JMP #000F + 0x70020007, // 001B JMP #0024 + 0xB8120200, // 001C GETNGBL R4 K1 + 0x8C100908, // 001D GETMET R4 R4 K8 + 0x60180008, // 001E GETGBL R6 G8 + 0x5C1C0400, // 001F MOVE R7 R2 + 0x7C180200, // 0020 CALL R6 1 + 0x001A1206, // 0021 ADD R6 K9 R6 + 0x581C000A, // 0022 LDCONST R7 K10 + 0x7C100600, // 0023 CALL R4 3 + 0x80000000, // 0024 RET 0 + }) + ) +); +/*******************************************************************/ + + /******************************************************************** ** Solidified function: register_plugin_class ********************************************************************/ @@ -35,75 +222,72 @@ be_local_closure(Matter_Device_register_plugin_class, /* name */ /******************************************************************** -** Solidified function: _compute_pbkdf +** Solidified function: autoconf_device ********************************************************************/ -be_local_closure(Matter_Device__compute_pbkdf, /* name */ +be_local_closure(Matter_Device_autoconf_device, /* name */ be_nested_proto( - 14, /* nstack */ - 4, /* argc */ + 7, /* nstack */ + 1, /* argc */ 2, /* varg */ 0, /* has upvals */ NULL, /* no upvals */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[11]) { /* constants */ - /* K0 */ be_nested_str_weak(crypto), - /* K1 */ be_nested_str_weak(string), - /* K2 */ be_nested_str_weak(add), - /* K3 */ be_nested_str_weak(PBKDF2_HMAC_SHA256), - /* K4 */ be_nested_str_weak(derive), - /* K5 */ be_const_int(0), - /* K6 */ be_nested_str_weak(root_w0), - /* K7 */ be_nested_str_weak(EC_P256), - /* K8 */ be_nested_str_weak(mod), - /* K9 */ be_nested_str_weak(root_L), - /* K10 */ be_nested_str_weak(public_key), + ( &(const bvalue[15]) { /* constants */ + /* K0 */ be_nested_str_weak(string), + /* K1 */ be_nested_str_weak(json), + /* K2 */ be_nested_str_weak(plugins), + /* K3 */ be_const_int(0), + /* K4 */ be_nested_str_weak(plugins_config), + /* K5 */ be_nested_str_weak(autoconf_device_map), + /* K6 */ be_nested_str_weak(tasmota), + /* K7 */ be_nested_str_weak(log), + /* K8 */ be_nested_str_weak(MTR_X3A_X20autoconfig_X20_X3D_X20), + /* K9 */ be_const_int(3), + /* K10 */ be_nested_str_weak(_load_plugins_config), + /* K11 */ be_nested_str_weak(plugins_persist), + /* K12 */ be_nested_str_weak(sessions), + /* K13 */ be_nested_str_weak(count_active_fabrics), + /* K14 */ be_nested_str_weak(save_param), }), - be_str_weak(_compute_pbkdf), + be_str_weak(autoconf_device), &be_const_str_solidified, - ( &(const binstruction[41]) { /* code */ - 0xA4120000, // 0000 IMPORT R4 K0 - 0xA4160200, // 0001 IMPORT R5 K1 - 0x60180015, // 0002 GETGBL R6 G21 - 0x7C180000, // 0003 CALL R6 0 - 0x8C180D02, // 0004 GETMET R6 R6 K2 - 0x5C200200, // 0005 MOVE R8 R1 - 0x54260003, // 0006 LDINT R9 4 - 0x7C180600, // 0007 CALL R6 3 - 0x8C1C0903, // 0008 GETMET R7 R4 K3 - 0x7C1C0200, // 0009 CALL R7 1 - 0x8C1C0F04, // 000A GETMET R7 R7 K4 - 0x5C240C00, // 000B MOVE R9 R6 - 0x5C280600, // 000C MOVE R10 R3 - 0x5C2C0400, // 000D MOVE R11 R2 - 0x5432004F, // 000E LDINT R12 80 - 0x7C1C0A00, // 000F CALL R7 5 - 0x54220026, // 0010 LDINT R8 39 - 0x40220A08, // 0011 CONNECT R8 K5 R8 - 0x94200E08, // 0012 GETIDX R8 R7 R8 - 0x54260027, // 0013 LDINT R9 40 - 0x542A004E, // 0014 LDINT R10 79 - 0x4024120A, // 0015 CONNECT R9 R9 R10 - 0x94240E09, // 0016 GETIDX R9 R7 R9 - 0x8C280907, // 0017 GETMET R10 R4 K7 - 0x7C280200, // 0018 CALL R10 1 - 0x8C281508, // 0019 GETMET R10 R10 K8 - 0x5C301000, // 001A MOVE R12 R8 - 0x7C280400, // 001B CALL R10 2 - 0x90020C0A, // 001C SETMBR R0 K6 R10 - 0x8C280907, // 001D GETMET R10 R4 K7 - 0x7C280200, // 001E CALL R10 1 - 0x8C281508, // 001F GETMET R10 R10 K8 - 0x5C301200, // 0020 MOVE R12 R9 - 0x7C280400, // 0021 CALL R10 2 - 0x8C2C0907, // 0022 GETMET R11 R4 K7 - 0x7C2C0200, // 0023 CALL R11 1 - 0x8C2C170A, // 0024 GETMET R11 R11 K10 - 0x5C341400, // 0025 MOVE R13 R10 - 0x7C2C0400, // 0026 CALL R11 2 - 0x9002120B, // 0027 SETMBR R0 K9 R11 - 0x80000000, // 0028 RET 0 + ( &(const binstruction[34]) { /* code */ + 0xA4060000, // 0000 IMPORT R1 K0 + 0xA40A0200, // 0001 IMPORT R2 K1 + 0x600C000C, // 0002 GETGBL R3 G12 + 0x88100102, // 0003 GETMBR R4 R0 K2 + 0x7C0C0200, // 0004 CALL R3 1 + 0x240C0703, // 0005 GT R3 R3 K3 + 0x780E0000, // 0006 JMPF R3 #0008 + 0x80000600, // 0007 RET 0 + 0x8C0C0105, // 0008 GETMET R3 R0 K5 + 0x7C0C0200, // 0009 CALL R3 1 + 0x90020803, // 000A SETMBR R0 K4 R3 + 0xB80E0C00, // 000B GETNGBL R3 K6 + 0x8C0C0707, // 000C GETMET R3 R3 K7 + 0x60140008, // 000D GETGBL R5 G8 + 0x88180104, // 000E GETMBR R6 R0 K4 + 0x7C140200, // 000F CALL R5 1 + 0x00161005, // 0010 ADD R5 K8 R5 + 0x58180009, // 0011 LDCONST R6 K9 + 0x7C0C0600, // 0012 CALL R3 3 + 0x8C0C010A, // 0013 GETMET R3 R0 K10 + 0x88140104, // 0014 GETMBR R5 R0 K4 + 0x7C0C0400, // 0015 CALL R3 2 + 0x880C010B, // 0016 GETMBR R3 R0 K11 + 0x740E0008, // 0017 JMPT R3 #0021 + 0x880C010C, // 0018 GETMBR R3 R0 K12 + 0x8C0C070D, // 0019 GETMET R3 R3 K13 + 0x7C0C0200, // 001A CALL R3 1 + 0x240C0703, // 001B GT R3 R3 K3 + 0x780E0003, // 001C JMPF R3 #0021 + 0x500C0200, // 001D LDBOOL R3 1 0 + 0x90021603, // 001E SETMBR R0 K11 R3 + 0x8C0C010E, // 001F GETMET R3 R0 K14 + 0x7C0C0200, // 0020 CALL R3 1 + 0x80000000, // 0021 RET 0 }) ) ); @@ -111,223 +295,506 @@ be_local_closure(Matter_Device__compute_pbkdf, /* name */ /******************************************************************** -** Solidified function: _mdns_announce_hostname +** Solidified function: generate_random_passcode ********************************************************************/ -be_local_closure(Matter_Device__mdns_announce_hostname, /* name */ +be_local_closure(Matter_Device_generate_random_passcode, /* name */ be_nested_proto( - 16, /* nstack */ - 2, /* argc */ + 7, /* nstack */ + 1, /* argc */ 2, /* varg */ 0, /* has upvals */ NULL, /* no upvals */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[28]) { /* constants */ - /* K0 */ be_nested_str_weak(mdns), - /* K1 */ be_nested_str_weak(string), - /* K2 */ be_nested_str_weak(start), - /* K3 */ be_nested_str_weak(tasmota), - /* K4 */ be_nested_str_weak(eth), - /* K5 */ be_nested_str_weak(hostname_eth), - /* K6 */ be_nested_str_weak(replace), - /* K7 */ be_nested_str_weak(find), - /* K8 */ be_nested_str_weak(mac), - /* K9 */ be_nested_str_weak(_X3A), - /* K10 */ be_nested_str_weak(), - /* K11 */ be_nested_str_weak(ipv4only), - /* K12 */ be_nested_str_weak(log), - /* K13 */ be_nested_str_weak(format), - /* K14 */ be_nested_str_weak(MTR_X3A_X20calling_X20mdns_X2Eadd_hostname_X28_X25s_X2C_X20_X25s_X2C_X20_X25s_X29), - /* K15 */ be_nested_str_weak(ip6local), - /* K16 */ be_nested_str_weak(ip), - /* K17 */ be_const_int(3), - /* K18 */ be_nested_str_weak(add_hostname), - /* K19 */ be_nested_str_weak(ip6), - /* K20 */ be_nested_str_weak(MTR_X3A_X20calling_X20mdns_X2Eadd_hostname_X28_X25s_X2C_X20_X25s_X29), - /* K21 */ be_nested_str_weak(wifi), - /* K22 */ be_nested_str_weak(hostname_wifi), - /* K23 */ be_nested_str_weak(MTR_X3A_X20start_X20mDNS_X20on_X20_X25s_X20host_X20_X27_X25s_X2Elocal_X27), - /* K24 */ be_const_int(2), - /* K25 */ be_nested_str_weak(MTR_X3A_X20Exception), - /* K26 */ be_nested_str_weak(_X7C), - /* K27 */ be_nested_str_weak(mdns_announce_op_discovery_all_fabrics), + ( &(const bvalue[ 8]) { /* constants */ + /* K0 */ be_nested_str_weak(crypto), + /* K1 */ be_nested_str_weak(random), + /* K2 */ be_nested_str_weak(get), + /* K3 */ be_const_int(0), + /* K4 */ be_const_int(134217727), + /* K5 */ be_const_int(99999998), + /* K6 */ be_nested_str_weak(PASSCODE_INVALID), + /* K7 */ be_nested_str_weak(stop_iteration), }), - be_str_weak(_mdns_announce_hostname), + be_str_weak(generate_random_passcode), &be_const_str_solidified, - ( &(const binstruction[172]) { /* code */ - 0xA40A0000, // 0000 IMPORT R2 K0 - 0xA40E0200, // 0001 IMPORT R3 K1 - 0x8C100502, // 0002 GETMET R4 R2 K2 - 0x7C100200, // 0003 CALL R4 1 - 0xA8020092, // 0004 EXBLK 0 #0098 - 0x78060040, // 0005 JMPF R1 #0047 - 0xB8120600, // 0006 GETNGBL R4 K3 - 0x8C100904, // 0007 GETMET R4 R4 K4 - 0x7C100200, // 0008 CALL R4 1 - 0x8C140706, // 0009 GETMET R5 R3 K6 - 0x8C1C0907, // 000A GETMET R7 R4 K7 - 0x58240008, // 000B LDCONST R9 K8 - 0x7C1C0400, // 000C CALL R7 2 - 0x58200009, // 000D LDCONST R8 K9 - 0x5824000A, // 000E LDCONST R9 K10 - 0x7C140800, // 000F CALL R5 4 - 0x90020A05, // 0010 SETMBR R0 K5 R5 - 0x8814010B, // 0011 GETMBR R5 R0 K11 - 0x7416001F, // 0012 JMPT R5 #0033 - 0xB8160600, // 0013 GETNGBL R5 K3 - 0x8C140B0C, // 0014 GETMET R5 R5 K12 - 0x8C1C070D, // 0015 GETMET R7 R3 K13 - 0x5824000E, // 0016 LDCONST R9 K14 - 0x88280105, // 0017 GETMBR R10 R0 K5 - 0x8C2C0907, // 0018 GETMET R11 R4 K7 - 0x5834000F, // 0019 LDCONST R13 K15 - 0x5838000A, // 001A LDCONST R14 K10 - 0x7C2C0600, // 001B CALL R11 3 - 0x8C300907, // 001C GETMET R12 R4 K7 - 0x58380010, // 001D LDCONST R14 K16 - 0x583C000A, // 001E LDCONST R15 K10 - 0x7C300600, // 001F CALL R12 3 - 0x7C1C0A00, // 0020 CALL R7 5 - 0x58200011, // 0021 LDCONST R8 K17 - 0x7C140600, // 0022 CALL R5 3 - 0x8C140512, // 0023 GETMET R5 R2 K18 - 0x881C0105, // 0024 GETMBR R7 R0 K5 - 0x8C200907, // 0025 GETMET R8 R4 K7 - 0x5828000F, // 0026 LDCONST R10 K15 - 0x582C000A, // 0027 LDCONST R11 K10 - 0x7C200600, // 0028 CALL R8 3 - 0x8C240907, // 0029 GETMET R9 R4 K7 - 0x582C0010, // 002A LDCONST R11 K16 - 0x5830000A, // 002B LDCONST R12 K10 - 0x7C240600, // 002C CALL R9 3 - 0x8C280907, // 002D GETMET R10 R4 K7 - 0x58300013, // 002E LDCONST R12 K19 - 0x5834000A, // 002F LDCONST R13 K10 - 0x7C280600, // 0030 CALL R10 3 - 0x7C140A00, // 0031 CALL R5 5 - 0x70020012, // 0032 JMP #0046 - 0xB8160600, // 0033 GETNGBL R5 K3 - 0x8C140B0C, // 0034 GETMET R5 R5 K12 - 0x8C1C070D, // 0035 GETMET R7 R3 K13 - 0x58240014, // 0036 LDCONST R9 K20 - 0x88280105, // 0037 GETMBR R10 R0 K5 - 0x8C2C0907, // 0038 GETMET R11 R4 K7 - 0x58340010, // 0039 LDCONST R13 K16 - 0x5838000A, // 003A LDCONST R14 K10 - 0x7C2C0600, // 003B CALL R11 3 - 0x7C1C0800, // 003C CALL R7 4 - 0x58200011, // 003D LDCONST R8 K17 - 0x7C140600, // 003E CALL R5 3 - 0x8C140512, // 003F GETMET R5 R2 K18 - 0x881C0105, // 0040 GETMBR R7 R0 K5 - 0x8C200907, // 0041 GETMET R8 R4 K7 - 0x58280010, // 0042 LDCONST R10 K16 - 0x582C000A, // 0043 LDCONST R11 K10 - 0x7C200600, // 0044 CALL R8 3 - 0x7C140600, // 0045 CALL R5 3 - 0x7002003F, // 0046 JMP #0087 - 0xB8120600, // 0047 GETNGBL R4 K3 - 0x8C100915, // 0048 GETMET R4 R4 K21 - 0x7C100200, // 0049 CALL R4 1 - 0x8C140706, // 004A GETMET R5 R3 K6 - 0x8C1C0907, // 004B GETMET R7 R4 K7 - 0x58240008, // 004C LDCONST R9 K8 - 0x7C1C0400, // 004D CALL R7 2 - 0x58200009, // 004E LDCONST R8 K9 - 0x5824000A, // 004F LDCONST R9 K10 - 0x7C140800, // 0050 CALL R5 4 - 0x90022C05, // 0051 SETMBR R0 K22 R5 - 0x8814010B, // 0052 GETMBR R5 R0 K11 - 0x7416001F, // 0053 JMPT R5 #0074 - 0xB8160600, // 0054 GETNGBL R5 K3 - 0x8C140B0C, // 0055 GETMET R5 R5 K12 - 0x8C1C070D, // 0056 GETMET R7 R3 K13 - 0x5824000E, // 0057 LDCONST R9 K14 - 0x88280116, // 0058 GETMBR R10 R0 K22 - 0x8C2C0907, // 0059 GETMET R11 R4 K7 - 0x5834000F, // 005A LDCONST R13 K15 - 0x5838000A, // 005B LDCONST R14 K10 - 0x7C2C0600, // 005C CALL R11 3 - 0x8C300907, // 005D GETMET R12 R4 K7 - 0x58380010, // 005E LDCONST R14 K16 - 0x583C000A, // 005F LDCONST R15 K10 - 0x7C300600, // 0060 CALL R12 3 - 0x7C1C0A00, // 0061 CALL R7 5 - 0x58200011, // 0062 LDCONST R8 K17 - 0x7C140600, // 0063 CALL R5 3 - 0x8C140512, // 0064 GETMET R5 R2 K18 - 0x881C0116, // 0065 GETMBR R7 R0 K22 - 0x8C200907, // 0066 GETMET R8 R4 K7 - 0x5828000F, // 0067 LDCONST R10 K15 - 0x582C000A, // 0068 LDCONST R11 K10 - 0x7C200600, // 0069 CALL R8 3 - 0x8C240907, // 006A GETMET R9 R4 K7 - 0x582C0010, // 006B LDCONST R11 K16 - 0x5830000A, // 006C LDCONST R12 K10 - 0x7C240600, // 006D CALL R9 3 - 0x8C280907, // 006E GETMET R10 R4 K7 - 0x58300013, // 006F LDCONST R12 K19 - 0x5834000A, // 0070 LDCONST R13 K10 - 0x7C280600, // 0071 CALL R10 3 - 0x7C140A00, // 0072 CALL R5 5 - 0x70020012, // 0073 JMP #0087 - 0xB8160600, // 0074 GETNGBL R5 K3 - 0x8C140B0C, // 0075 GETMET R5 R5 K12 - 0x8C1C070D, // 0076 GETMET R7 R3 K13 - 0x58240014, // 0077 LDCONST R9 K20 - 0x88280105, // 0078 GETMBR R10 R0 K5 - 0x8C2C0907, // 0079 GETMET R11 R4 K7 - 0x58340010, // 007A LDCONST R13 K16 - 0x5838000A, // 007B LDCONST R14 K10 - 0x7C2C0600, // 007C CALL R11 3 - 0x7C1C0800, // 007D CALL R7 4 - 0x58200011, // 007E LDCONST R8 K17 - 0x7C140600, // 007F CALL R5 3 - 0x8C140512, // 0080 GETMET R5 R2 K18 - 0x881C0116, // 0081 GETMBR R7 R0 K22 - 0x8C200907, // 0082 GETMET R8 R4 K7 - 0x58280010, // 0083 LDCONST R10 K16 - 0x582C000A, // 0084 LDCONST R11 K10 - 0x7C200600, // 0085 CALL R8 3 - 0x7C140600, // 0086 CALL R5 3 - 0xB8120600, // 0087 GETNGBL R4 K3 - 0x8C10090C, // 0088 GETMET R4 R4 K12 - 0x8C18070D, // 0089 GETMET R6 R3 K13 - 0x58200017, // 008A LDCONST R8 K23 - 0x78060001, // 008B JMPF R1 #008E - 0x58240004, // 008C LDCONST R9 K4 - 0x70020000, // 008D JMP #008F - 0x58240015, // 008E LDCONST R9 K21 - 0x78060001, // 008F JMPF R1 #0092 - 0x88280105, // 0090 GETMBR R10 R0 K5 - 0x70020000, // 0091 JMP #0093 - 0x88280116, // 0092 GETMBR R10 R0 K22 - 0x7C180800, // 0093 CALL R6 4 - 0x581C0018, // 0094 LDCONST R7 K24 - 0x7C100600, // 0095 CALL R4 3 - 0xA8040001, // 0096 EXBLK 1 1 - 0x70020010, // 0097 JMP #00A9 - 0xAC100002, // 0098 CATCH R4 0 2 - 0x7002000D, // 0099 JMP #00A8 - 0xB81A0600, // 009A GETNGBL R6 K3 - 0x8C180D0C, // 009B GETMET R6 R6 K12 - 0x60200008, // 009C GETGBL R8 G8 - 0x5C240800, // 009D MOVE R9 R4 - 0x7C200200, // 009E CALL R8 1 - 0x00223208, // 009F ADD R8 K25 R8 - 0x0020111A, // 00A0 ADD R8 R8 K26 - 0x60240008, // 00A1 GETGBL R9 G8 - 0x5C280A00, // 00A2 MOVE R10 R5 - 0x7C240200, // 00A3 CALL R9 1 - 0x00201009, // 00A4 ADD R8 R8 R9 - 0x58240018, // 00A5 LDCONST R9 K24 - 0x7C180600, // 00A6 CALL R6 3 - 0x70020000, // 00A7 JMP #00A9 - 0xB0080000, // 00A8 RAISE 2 R0 R0 - 0x8C10011B, // 00A9 GETMET R4 R0 K27 - 0x7C100200, // 00AA CALL R4 1 - 0x80000000, // 00AB RET 0 + ( &(const binstruction[35]) { /* code */ + 0xA4060000, // 0000 IMPORT R1 K0 + 0x4C080000, // 0001 LDNIL R2 + 0x500C0200, // 0002 LDBOOL R3 1 0 + 0x780E001D, // 0003 JMPF R3 #0022 + 0x8C0C0301, // 0004 GETMET R3 R1 K1 + 0x54160003, // 0005 LDINT R5 4 + 0x7C0C0400, // 0006 CALL R3 2 + 0x8C0C0702, // 0007 GETMET R3 R3 K2 + 0x58140003, // 0008 LDCONST R5 K3 + 0x541A0003, // 0009 LDINT R6 4 + 0x7C0C0600, // 000A CALL R3 3 + 0x2C0C0704, // 000B AND R3 R3 K4 + 0x5C080600, // 000C MOVE R2 R3 + 0x240C0505, // 000D GT R3 R2 K5 + 0x780E0000, // 000E JMPF R3 #0010 + 0x7001FFF1, // 000F JMP #0002 + 0x600C0010, // 0010 GETGBL R3 G16 + 0x88100106, // 0011 GETMBR R4 R0 K6 + 0x7C0C0200, // 0012 CALL R3 1 + 0xA8020005, // 0013 EXBLK 0 #001A + 0x5C100600, // 0014 MOVE R4 R3 + 0x7C100000, // 0015 CALL R4 0 + 0x1C140404, // 0016 EQ R5 R2 R4 + 0x78160000, // 0017 JMPF R5 #0019 + 0x4C080000, // 0018 LDNIL R2 + 0x7001FFF9, // 0019 JMP #0014 + 0x580C0007, // 001A LDCONST R3 K7 + 0xAC0C0200, // 001B CATCH R3 1 0 + 0xB0080000, // 001C RAISE 2 R0 R0 + 0x4C0C0000, // 001D LDNIL R3 + 0x200C0403, // 001E NE R3 R2 R3 + 0x780E0000, // 001F JMPF R3 #0021 + 0x80040400, // 0020 RET 1 R2 + 0x7001FFDF, // 0021 JMP #0002 + 0x80000000, // 0022 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: register_commands +********************************************************************/ +be_local_closure(Matter_Device_register_commands, /* name */ + be_nested_proto( + 5, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 1, /* has sup protos */ + ( &(const struct bproto*[ 1]) { + be_nested_proto( + 10, /* nstack */ + 4, /* argc */ + 0, /* varg */ + 1, /* has upvals */ + ( &(const bupvaldesc[ 1]) { /* upvals */ + be_local_const_upval(1, 0), + }), + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 1]) { /* constants */ + /* K0 */ be_nested_str_weak(MtrJoin), + }), + be_str_weak(_X3Clambda_X3E), + &be_const_str_solidified, + ( &(const binstruction[ 8]) { /* code */ + 0x68100000, // 0000 GETUPV R4 U0 + 0x8C100900, // 0001 GETMET R4 R4 K0 + 0x5C180000, // 0002 MOVE R6 R0 + 0x5C1C0200, // 0003 MOVE R7 R1 + 0x5C200400, // 0004 MOVE R8 R2 + 0x5C240600, // 0005 MOVE R9 R3 + 0x7C100A00, // 0006 CALL R4 5 + 0x80040800, // 0007 RET 1 R4 + }) + ), + }), + 1, /* has constants */ + ( &(const bvalue[ 3]) { /* constants */ + /* K0 */ be_nested_str_weak(tasmota), + /* K1 */ be_nested_str_weak(add_cmd), + /* K2 */ be_nested_str_weak(MtrJoin), + }), + be_str_weak(register_commands), + &be_const_str_solidified, + ( &(const binstruction[ 7]) { /* code */ + 0xB8060000, // 0000 GETNGBL R1 K0 + 0x8C040301, // 0001 GETMET R1 R1 K1 + 0x580C0002, // 0002 LDCONST R3 K2 + 0x84100000, // 0003 CLOSURE R4 P0 + 0x7C040600, // 0004 CALL R1 3 + 0xA0000000, // 0005 CLOSE R0 + 0x80000000, // 0006 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: is_commissioning_open +********************************************************************/ +be_local_closure(Matter_Device_is_commissioning_open, /* name */ + be_nested_proto( + 3, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 1]) { /* constants */ + /* K0 */ be_nested_str_weak(commissioning_open), + }), + be_str_weak(is_commissioning_open), + &be_const_str_solidified, + ( &(const binstruction[ 4]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x4C080000, // 0001 LDNIL R2 + 0x20040202, // 0002 NE R1 R1 R2 + 0x80040200, // 0003 RET 1 R1 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: k2l +********************************************************************/ +be_local_closure(Matter_Device_k2l, /* name */ + be_nested_proto( + 8, /* nstack */ + 1, /* argc */ + 4, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 6]) { /* constants */ + /* K0 */ be_const_class(be_class_Matter_Device), + /* K1 */ be_nested_str_weak(keys), + /* K2 */ be_nested_str_weak(push), + /* K3 */ be_nested_str_weak(stop_iteration), + /* K4 */ be_const_int(1), + /* K5 */ be_const_int(0), + }), + be_str_weak(k2l), + &be_const_str_solidified, + ( &(const binstruction[50]) { /* code */ + 0x58040000, // 0000 LDCONST R1 K0 + 0x60080012, // 0001 GETGBL R2 G18 + 0x7C080000, // 0002 CALL R2 0 + 0x4C0C0000, // 0003 LDNIL R3 + 0x1C0C0003, // 0004 EQ R3 R0 R3 + 0x780E0000, // 0005 JMPF R3 #0007 + 0x80040400, // 0006 RET 1 R2 + 0x600C0010, // 0007 GETGBL R3 G16 + 0x8C100101, // 0008 GETMET R4 R0 K1 + 0x7C100200, // 0009 CALL R4 1 + 0x7C0C0200, // 000A CALL R3 1 + 0xA8020005, // 000B EXBLK 0 #0012 + 0x5C100600, // 000C MOVE R4 R3 + 0x7C100000, // 000D CALL R4 0 + 0x8C140502, // 000E GETMET R5 R2 K2 + 0x5C1C0800, // 000F MOVE R7 R4 + 0x7C140400, // 0010 CALL R5 2 + 0x7001FFF9, // 0011 JMP #000C + 0x580C0003, // 0012 LDCONST R3 K3 + 0xAC0C0200, // 0013 CATCH R3 1 0 + 0xB0080000, // 0014 RAISE 2 R0 R0 + 0x600C0010, // 0015 GETGBL R3 G16 + 0x6010000C, // 0016 GETGBL R4 G12 + 0x5C140400, // 0017 MOVE R5 R2 + 0x7C100200, // 0018 CALL R4 1 + 0x04100904, // 0019 SUB R4 R4 K4 + 0x40120804, // 001A CONNECT R4 K4 R4 + 0x7C0C0200, // 001B CALL R3 1 + 0xA8020010, // 001C EXBLK 0 #002E + 0x5C100600, // 001D MOVE R4 R3 + 0x7C100000, // 001E CALL R4 0 + 0x94140404, // 001F GETIDX R5 R2 R4 + 0x5C180800, // 0020 MOVE R6 R4 + 0x241C0D05, // 0021 GT R7 R6 K5 + 0x781E0008, // 0022 JMPF R7 #002C + 0x041C0D04, // 0023 SUB R7 R6 K4 + 0x941C0407, // 0024 GETIDX R7 R2 R7 + 0x241C0E05, // 0025 GT R7 R7 R5 + 0x781E0004, // 0026 JMPF R7 #002C + 0x041C0D04, // 0027 SUB R7 R6 K4 + 0x941C0407, // 0028 GETIDX R7 R2 R7 + 0x98080C07, // 0029 SETIDX R2 R6 R7 + 0x04180D04, // 002A SUB R6 R6 K4 + 0x7001FFF4, // 002B JMP #0021 + 0x98080C05, // 002C SETIDX R2 R6 R5 + 0x7001FFEE, // 002D JMP #001D + 0x580C0003, // 002E LDCONST R3 K3 + 0xAC0C0200, // 002F CATCH R3 1 0 + 0xB0080000, // 0030 RAISE 2 R0 R0 + 0x80040400, // 0031 RET 1 R2 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: start_operational_discovery_deferred +********************************************************************/ +be_local_closure(Matter_Device_start_operational_discovery_deferred, /* name */ + be_nested_proto( + 6, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 1, /* has sup protos */ + ( &(const struct bproto*[ 1]) { + be_nested_proto( + 3, /* nstack */ + 0, /* argc */ + 0, /* varg */ + 1, /* has upvals */ + ( &(const bupvaldesc[ 2]) { /* upvals */ + be_local_const_upval(1, 0), + be_local_const_upval(1, 1), + }), + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 1]) { /* constants */ + /* K0 */ be_nested_str_weak(start_operational_discovery), + }), + be_str_weak(_X3Clambda_X3E), + &be_const_str_solidified, + ( &(const binstruction[ 5]) { /* code */ + 0x68000000, // 0000 GETUPV R0 U0 + 0x8C000100, // 0001 GETMET R0 R0 K0 + 0x68080001, // 0002 GETUPV R2 U1 + 0x7C000400, // 0003 CALL R0 2 + 0x80040000, // 0004 RET 1 R0 + }) + ), + }), + 1, /* has constants */ + ( &(const bvalue[ 3]) { /* constants */ + /* K0 */ be_nested_str_weak(tasmota), + /* K1 */ be_nested_str_weak(set_timer), + /* K2 */ be_const_int(0), + }), + be_str_weak(start_operational_discovery_deferred), + &be_const_str_solidified, + ( &(const binstruction[ 7]) { /* code */ + 0xB80A0000, // 0000 GETNGBL R2 K0 + 0x8C080501, // 0001 GETMET R2 R2 K1 + 0x58100002, // 0002 LDCONST R4 K2 + 0x84140000, // 0003 CLOSURE R5 P0 + 0x7C080600, // 0004 CALL R2 3 + 0xA0000000, // 0005 CLOSE R0 + 0x80000000, // 0006 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: attribute_updated +********************************************************************/ +be_local_closure(Matter_Device_attribute_updated, /* name */ + be_nested_proto( + 10, /* nstack */ + 5, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 9]) { /* constants */ + /* K0 */ be_nested_str_weak(matter), + /* K1 */ be_nested_str_weak(Path), + /* K2 */ be_nested_str_weak(endpoint), + /* K3 */ be_nested_str_weak(cluster), + /* K4 */ be_nested_str_weak(attribute), + /* K5 */ be_nested_str_weak(message_handler), + /* K6 */ be_nested_str_weak(im), + /* K7 */ be_nested_str_weak(subs_shop), + /* K8 */ be_nested_str_weak(attribute_updated_ctx), + }), + be_str_weak(attribute_updated), + &be_const_str_solidified, + ( &(const binstruction[18]) { /* code */ + 0x4C140000, // 0000 LDNIL R5 + 0x1C140805, // 0001 EQ R5 R4 R5 + 0x78160000, // 0002 JMPF R5 #0004 + 0x50100000, // 0003 LDBOOL R4 0 0 + 0xB8160000, // 0004 GETNGBL R5 K0 + 0x8C140B01, // 0005 GETMET R5 R5 K1 + 0x7C140200, // 0006 CALL R5 1 + 0x90160401, // 0007 SETMBR R5 K2 R1 + 0x90160602, // 0008 SETMBR R5 K3 R2 + 0x90160803, // 0009 SETMBR R5 K4 R3 + 0x88180105, // 000A GETMBR R6 R0 K5 + 0x88180D06, // 000B GETMBR R6 R6 K6 + 0x88180D07, // 000C GETMBR R6 R6 K7 + 0x8C180D08, // 000D GETMET R6 R6 K8 + 0x5C200A00, // 000E MOVE R8 R5 + 0x5C240800, // 000F MOVE R9 R4 + 0x7C180600, // 0010 CALL R6 3 + 0x80000000, // 0011 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: compute_qrcode_content +********************************************************************/ +be_local_closure(Matter_Device_compute_qrcode_content, /* name */ + be_nested_proto( + 8, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[12]) { /* constants */ + /* K0 */ be_nested_str_weak(resize), + /* K1 */ be_nested_str_weak(setbits), + /* K2 */ be_const_int(3), + /* K3 */ be_nested_str_weak(vendorid), + /* K4 */ be_nested_str_weak(productid), + /* K5 */ be_nested_str_weak(root_discriminator), + /* K6 */ be_nested_str_weak(root_passcode), + /* K7 */ be_const_int(134217727), + /* K8 */ be_nested_str_weak(MT_X3A), + /* K9 */ be_nested_str_weak(matter), + /* K10 */ be_nested_str_weak(Base38), + /* K11 */ be_nested_str_weak(encode), + }), + be_str_weak(compute_qrcode_content), + &be_const_str_solidified, + ( &(const binstruction[40]) { /* code */ + 0x60040015, // 0000 GETGBL R1 G21 + 0x7C040000, // 0001 CALL R1 0 + 0x8C040300, // 0002 GETMET R1 R1 K0 + 0x540E000A, // 0003 LDINT R3 11 + 0x7C040400, // 0004 CALL R1 2 + 0x8C080301, // 0005 GETMET R2 R1 K1 + 0x58100002, // 0006 LDCONST R4 K2 + 0x5416000F, // 0007 LDINT R5 16 + 0x88180103, // 0008 GETMBR R6 R0 K3 + 0x7C080800, // 0009 CALL R2 4 + 0x8C080301, // 000A GETMET R2 R1 K1 + 0x54120012, // 000B LDINT R4 19 + 0x5416000F, // 000C LDINT R5 16 + 0x88180104, // 000D GETMBR R6 R0 K4 + 0x7C080800, // 000E CALL R2 4 + 0x8C080301, // 000F GETMET R2 R1 K1 + 0x54120024, // 0010 LDINT R4 37 + 0x54160007, // 0011 LDINT R5 8 + 0x541A0003, // 0012 LDINT R6 4 + 0x7C080800, // 0013 CALL R2 4 + 0x8C080301, // 0014 GETMET R2 R1 K1 + 0x5412002C, // 0015 LDINT R4 45 + 0x5416000B, // 0016 LDINT R5 12 + 0x88180105, // 0017 GETMBR R6 R0 K5 + 0x541E0FFE, // 0018 LDINT R7 4095 + 0x2C180C07, // 0019 AND R6 R6 R7 + 0x7C080800, // 001A CALL R2 4 + 0x8C080301, // 001B GETMET R2 R1 K1 + 0x54120038, // 001C LDINT R4 57 + 0x5416001A, // 001D LDINT R5 27 + 0x88180106, // 001E GETMBR R6 R0 K6 + 0x2C180D07, // 001F AND R6 R6 K7 + 0x7C080800, // 0020 CALL R2 4 + 0xB80A1200, // 0021 GETNGBL R2 K9 + 0x8808050A, // 0022 GETMBR R2 R2 K10 + 0x8C08050B, // 0023 GETMET R2 R2 K11 + 0x5C100200, // 0024 MOVE R4 R1 + 0x7C080400, // 0025 CALL R2 2 + 0x000A1002, // 0026 ADD R2 K8 R2 + 0x80040400, // 0027 RET 1 R2 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: sort_distinct +********************************************************************/ +be_local_closure(Matter_Device_sort_distinct, /* name */ + be_nested_proto( + 7, /* nstack */ + 1, /* argc */ + 4, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 5]) { /* constants */ + /* K0 */ be_const_class(be_class_Matter_Device), + /* K1 */ be_const_int(1), + /* K2 */ be_const_int(0), + /* K3 */ be_nested_str_weak(stop_iteration), + /* K4 */ be_nested_str_weak(remove), + }), + be_str_weak(sort_distinct), + &be_const_str_solidified, + ( &(const binstruction[53]) { /* code */ + 0x58040000, // 0000 LDCONST R1 K0 + 0x60080010, // 0001 GETGBL R2 G16 + 0x600C000C, // 0002 GETGBL R3 G12 + 0x5C100000, // 0003 MOVE R4 R0 + 0x7C0C0200, // 0004 CALL R3 1 + 0x040C0701, // 0005 SUB R3 R3 K1 + 0x400E0203, // 0006 CONNECT R3 K1 R3 + 0x7C080200, // 0007 CALL R2 1 + 0xA8020010, // 0008 EXBLK 0 #001A + 0x5C0C0400, // 0009 MOVE R3 R2 + 0x7C0C0000, // 000A CALL R3 0 + 0x94100003, // 000B GETIDX R4 R0 R3 + 0x5C140600, // 000C MOVE R5 R3 + 0x24180B02, // 000D GT R6 R5 K2 + 0x781A0008, // 000E JMPF R6 #0018 + 0x04180B01, // 000F SUB R6 R5 K1 + 0x94180006, // 0010 GETIDX R6 R0 R6 + 0x24180C04, // 0011 GT R6 R6 R4 + 0x781A0004, // 0012 JMPF R6 #0018 + 0x04180B01, // 0013 SUB R6 R5 K1 + 0x94180006, // 0014 GETIDX R6 R0 R6 + 0x98000A06, // 0015 SETIDX R0 R5 R6 + 0x04140B01, // 0016 SUB R5 R5 K1 + 0x7001FFF4, // 0017 JMP #000D + 0x98000A04, // 0018 SETIDX R0 R5 R4 + 0x7001FFEE, // 0019 JMP #0009 + 0x58080003, // 001A LDCONST R2 K3 + 0xAC080200, // 001B CATCH R2 1 0 + 0xB0080000, // 001C RAISE 2 R0 R0 + 0x58080001, // 001D LDCONST R2 K1 + 0x600C000C, // 001E GETGBL R3 G12 + 0x5C100000, // 001F MOVE R4 R0 + 0x7C0C0200, // 0020 CALL R3 1 + 0x180C0701, // 0021 LE R3 R3 K1 + 0x780E0000, // 0022 JMPF R3 #0024 + 0x80040000, // 0023 RET 1 R0 + 0x940C0102, // 0024 GETIDX R3 R0 K2 + 0x6010000C, // 0025 GETGBL R4 G12 + 0x5C140000, // 0026 MOVE R5 R0 + 0x7C100200, // 0027 CALL R4 1 + 0x14100404, // 0028 LT R4 R2 R4 + 0x78120009, // 0029 JMPF R4 #0034 + 0x94100002, // 002A GETIDX R4 R0 R2 + 0x1C100803, // 002B EQ R4 R4 R3 + 0x78120003, // 002C JMPF R4 #0031 + 0x8C100104, // 002D GETMET R4 R0 K4 + 0x5C180400, // 002E MOVE R6 R2 + 0x7C100400, // 002F CALL R4 2 + 0x70020001, // 0030 JMP #0033 + 0x940C0002, // 0031 GETIDX R3 R0 R2 + 0x00080501, // 0032 ADD R2 R2 K1 + 0x7001FFF0, // 0033 JMP #0025 + 0x80040000, // 0034 RET 1 R0 }) ) ); @@ -509,473 +976,6 @@ be_local_closure(Matter_Device_mdns_announce_op_discovery, /* name */ /*******************************************************************/ -/******************************************************************** -** Solidified function: stop -********************************************************************/ -be_local_closure(Matter_Device_stop, /* name */ - be_nested_proto( - 4, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 4]) { /* constants */ - /* K0 */ be_nested_str_weak(tasmota), - /* K1 */ be_nested_str_weak(remove_driver), - /* K2 */ be_nested_str_weak(udp_server), - /* K3 */ be_nested_str_weak(stop), - }), - be_str_weak(stop), - &be_const_str_solidified, - ( &(const binstruction[10]) { /* code */ - 0xB8060000, // 0000 GETNGBL R1 K0 - 0x8C040301, // 0001 GETMET R1 R1 K1 - 0x5C0C0000, // 0002 MOVE R3 R0 - 0x7C040400, // 0003 CALL R1 2 - 0x88040102, // 0004 GETMBR R1 R0 K2 - 0x78060002, // 0005 JMPF R1 #0009 - 0x88040102, // 0006 GETMBR R1 R0 K2 - 0x8C040303, // 0007 GETMET R1 R1 K3 - 0x7C040200, // 0008 CALL R1 1 - 0x80000000, // 0009 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: register_commands -********************************************************************/ -be_local_closure(Matter_Device_register_commands, /* name */ - be_nested_proto( - 5, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 1, /* has sup protos */ - ( &(const struct bproto*[ 1]) { - be_nested_proto( - 10, /* nstack */ - 4, /* argc */ - 0, /* varg */ - 1, /* has upvals */ - ( &(const bupvaldesc[ 1]) { /* upvals */ - be_local_const_upval(1, 0), - }), - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 1]) { /* constants */ - /* K0 */ be_nested_str_weak(MtrJoin), - }), - be_str_weak(_X3Clambda_X3E), - &be_const_str_solidified, - ( &(const binstruction[ 8]) { /* code */ - 0x68100000, // 0000 GETUPV R4 U0 - 0x8C100900, // 0001 GETMET R4 R4 K0 - 0x5C180000, // 0002 MOVE R6 R0 - 0x5C1C0200, // 0003 MOVE R7 R1 - 0x5C200400, // 0004 MOVE R8 R2 - 0x5C240600, // 0005 MOVE R9 R3 - 0x7C100A00, // 0006 CALL R4 5 - 0x80040800, // 0007 RET 1 R4 - }) - ), - }), - 1, /* has constants */ - ( &(const bvalue[ 3]) { /* constants */ - /* K0 */ be_nested_str_weak(tasmota), - /* K1 */ be_nested_str_weak(add_cmd), - /* K2 */ be_nested_str_weak(MtrJoin), - }), - be_str_weak(register_commands), - &be_const_str_solidified, - ( &(const binstruction[ 7]) { /* code */ - 0xB8060000, // 0000 GETNGBL R1 K0 - 0x8C040301, // 0001 GETMET R1 R1 K1 - 0x580C0002, // 0002 LDCONST R3 K2 - 0x84100000, // 0003 CLOSURE R4 P0 - 0x7C040600, // 0004 CALL R1 3 - 0xA0000000, // 0005 CLOSE R0 - 0x80000000, // 0006 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: msg_send -********************************************************************/ -be_local_closure(Matter_Device_msg_send, /* name */ - be_nested_proto( - 5, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 2]) { /* constants */ - /* K0 */ be_nested_str_weak(udp_server), - /* K1 */ be_nested_str_weak(send_UDP), - }), - be_str_weak(msg_send), - &be_const_str_solidified, - ( &(const binstruction[ 5]) { /* code */ - 0x88080100, // 0000 GETMBR R2 R0 K0 - 0x8C080501, // 0001 GETMET R2 R2 K1 - 0x5C100200, // 0002 MOVE R4 R1 - 0x7C080400, // 0003 CALL R2 2 - 0x80040400, // 0004 RET 1 R2 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: save_param -********************************************************************/ -be_local_closure(Matter_Device_save_param, /* name */ - be_nested_proto( - 10, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[24]) { /* constants */ - /* K0 */ be_nested_str_weak(string), - /* K1 */ be_nested_str_weak(format), - /* K2 */ be_nested_str_weak(_X7B_X22distinguish_X22_X3A_X25i_X2C_X22passcode_X22_X3A_X25i_X2C_X22ipv4only_X22_X3A_X25s), - /* K3 */ be_nested_str_weak(root_discriminator), - /* K4 */ be_nested_str_weak(root_passcode), - /* K5 */ be_nested_str_weak(ipv4only), - /* K6 */ be_nested_str_weak(true), - /* K7 */ be_nested_str_weak(false), - /* K8 */ be_nested_str_weak(plugins_persist), - /* K9 */ be_nested_str_weak(_X2C_X22config_X22_X3A), - /* K10 */ be_nested_str_weak(plugins_to_json), - /* K11 */ be_nested_str_weak(_X7D), - /* K12 */ be_nested_str_weak(FILENAME), - /* K13 */ be_nested_str_weak(w), - /* K14 */ be_nested_str_weak(write), - /* K15 */ be_nested_str_weak(close), - /* K16 */ be_nested_str_weak(tasmota), - /* K17 */ be_nested_str_weak(log), - /* K18 */ be_nested_str_weak(MTR_X3A_X20_X3DSaved_X20_X20_X20_X20_X20parameters_X25s), - /* K19 */ be_nested_str_weak(_X20and_X20condiguration), - /* K20 */ be_nested_str_weak(), - /* K21 */ be_const_int(2), - /* K22 */ be_nested_str_weak(MTR_X3A_X20Session_Store_X3A_X3Asave_X20Exception_X3A), - /* K23 */ be_nested_str_weak(_X7C), - }), - be_str_weak(save_param), - &be_const_str_solidified, - ( &(const binstruction[63]) { /* code */ - 0xA4060000, // 0000 IMPORT R1 K0 - 0x8C080301, // 0001 GETMET R2 R1 K1 - 0x58100002, // 0002 LDCONST R4 K2 - 0x88140103, // 0003 GETMBR R5 R0 K3 - 0x88180104, // 0004 GETMBR R6 R0 K4 - 0x881C0105, // 0005 GETMBR R7 R0 K5 - 0x781E0001, // 0006 JMPF R7 #0009 - 0x581C0006, // 0007 LDCONST R7 K6 - 0x70020000, // 0008 JMP #000A - 0x581C0007, // 0009 LDCONST R7 K7 - 0x7C080A00, // 000A CALL R2 5 - 0x880C0108, // 000B GETMBR R3 R0 K8 - 0x780E0003, // 000C JMPF R3 #0011 - 0x00080509, // 000D ADD R2 R2 K9 - 0x8C0C010A, // 000E GETMET R3 R0 K10 - 0x7C0C0200, // 000F CALL R3 1 - 0x00080403, // 0010 ADD R2 R2 R3 - 0x0008050B, // 0011 ADD R2 R2 K11 - 0xA8020018, // 0012 EXBLK 0 #002C - 0x600C0011, // 0013 GETGBL R3 G17 - 0x8810010C, // 0014 GETMBR R4 R0 K12 - 0x5814000D, // 0015 LDCONST R5 K13 - 0x7C0C0400, // 0016 CALL R3 2 - 0x8C10070E, // 0017 GETMET R4 R3 K14 - 0x5C180400, // 0018 MOVE R6 R2 - 0x7C100400, // 0019 CALL R4 2 - 0x8C10070F, // 001A GETMET R4 R3 K15 - 0x7C100200, // 001B CALL R4 1 - 0xB8122000, // 001C GETNGBL R4 K16 - 0x8C100911, // 001D GETMET R4 R4 K17 - 0x8C180301, // 001E GETMET R6 R1 K1 - 0x58200012, // 001F LDCONST R8 K18 - 0x88240108, // 0020 GETMBR R9 R0 K8 - 0x78260001, // 0021 JMPF R9 #0024 - 0x58240013, // 0022 LDCONST R9 K19 - 0x70020000, // 0023 JMP #0025 - 0x58240014, // 0024 LDCONST R9 K20 - 0x7C180600, // 0025 CALL R6 3 - 0x581C0015, // 0026 LDCONST R7 K21 - 0x7C100600, // 0027 CALL R4 3 - 0xA8040001, // 0028 EXBLK 1 1 - 0x80040400, // 0029 RET 1 R2 - 0xA8040001, // 002A EXBLK 1 1 - 0x70020011, // 002B JMP #003E - 0xAC0C0002, // 002C CATCH R3 0 2 - 0x7002000E, // 002D JMP #003D - 0xB8162000, // 002E GETNGBL R5 K16 - 0x8C140B11, // 002F GETMET R5 R5 K17 - 0x601C0008, // 0030 GETGBL R7 G8 - 0x5C200600, // 0031 MOVE R8 R3 - 0x7C1C0200, // 0032 CALL R7 1 - 0x001E2C07, // 0033 ADD R7 K22 R7 - 0x001C0F17, // 0034 ADD R7 R7 K23 - 0x60200008, // 0035 GETGBL R8 G8 - 0x5C240800, // 0036 MOVE R9 R4 - 0x7C200200, // 0037 CALL R8 1 - 0x001C0E08, // 0038 ADD R7 R7 R8 - 0x58200015, // 0039 LDCONST R8 K21 - 0x7C140600, // 003A CALL R5 3 - 0x80040400, // 003B RET 1 R2 - 0x70020000, // 003C JMP #003E - 0xB0080000, // 003D RAISE 2 R0 R0 - 0x80000000, // 003E RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: mdns_announce_op_discovery_all_fabrics -********************************************************************/ -be_local_closure(Matter_Device_mdns_announce_op_discovery_all_fabrics, /* name */ - be_nested_proto( - 6, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 6]) { /* constants */ - /* K0 */ be_nested_str_weak(sessions), - /* K1 */ be_nested_str_weak(active_fabrics), - /* K2 */ be_nested_str_weak(get_device_id), - /* K3 */ be_nested_str_weak(get_fabric_id), - /* K4 */ be_nested_str_weak(mdns_announce_op_discovery), - /* K5 */ be_nested_str_weak(stop_iteration), - }), - be_str_weak(mdns_announce_op_discovery_all_fabrics), - &be_const_str_solidified, - ( &(const binstruction[22]) { /* code */ - 0x60040010, // 0000 GETGBL R1 G16 - 0x88080100, // 0001 GETMBR R2 R0 K0 - 0x8C080501, // 0002 GETMET R2 R2 K1 - 0x7C080200, // 0003 CALL R2 1 - 0x7C040200, // 0004 CALL R1 1 - 0xA802000B, // 0005 EXBLK 0 #0012 - 0x5C080200, // 0006 MOVE R2 R1 - 0x7C080000, // 0007 CALL R2 0 - 0x8C0C0502, // 0008 GETMET R3 R2 K2 - 0x7C0C0200, // 0009 CALL R3 1 - 0x780E0005, // 000A JMPF R3 #0011 - 0x8C0C0503, // 000B GETMET R3 R2 K3 - 0x7C0C0200, // 000C CALL R3 1 - 0x780E0002, // 000D JMPF R3 #0011 - 0x8C0C0104, // 000E GETMET R3 R0 K4 - 0x5C140400, // 000F MOVE R5 R2 - 0x7C0C0400, // 0010 CALL R3 2 - 0x7001FFF3, // 0011 JMP #0006 - 0x58040005, // 0012 LDCONST R1 K5 - 0xAC040200, // 0013 CATCH R1 1 0 - 0xB0080000, // 0014 RAISE 2 R0 R0 - 0x80000000, // 0015 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: start_operational_discovery_deferred -********************************************************************/ -be_local_closure(Matter_Device_start_operational_discovery_deferred, /* name */ - be_nested_proto( - 6, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 1, /* has sup protos */ - ( &(const struct bproto*[ 1]) { - be_nested_proto( - 3, /* nstack */ - 0, /* argc */ - 0, /* varg */ - 1, /* has upvals */ - ( &(const bupvaldesc[ 2]) { /* upvals */ - be_local_const_upval(1, 0), - be_local_const_upval(1, 1), - }), - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 1]) { /* constants */ - /* K0 */ be_nested_str_weak(start_operational_discovery), - }), - be_str_weak(_X3Clambda_X3E), - &be_const_str_solidified, - ( &(const binstruction[ 5]) { /* code */ - 0x68000000, // 0000 GETUPV R0 U0 - 0x8C000100, // 0001 GETMET R0 R0 K0 - 0x68080001, // 0002 GETUPV R2 U1 - 0x7C000400, // 0003 CALL R0 2 - 0x80040000, // 0004 RET 1 R0 - }) - ), - }), - 1, /* has constants */ - ( &(const bvalue[ 3]) { /* constants */ - /* K0 */ be_nested_str_weak(tasmota), - /* K1 */ be_nested_str_weak(set_timer), - /* K2 */ be_const_int(0), - }), - be_str_weak(start_operational_discovery_deferred), - &be_const_str_solidified, - ( &(const binstruction[ 7]) { /* code */ - 0xB80A0000, // 0000 GETNGBL R2 K0 - 0x8C080501, // 0001 GETMET R2 R2 K1 - 0x58100002, // 0002 LDCONST R4 K2 - 0x84140000, // 0003 CLOSURE R5 P0 - 0x7C080600, // 0004 CALL R2 3 - 0xA0000000, // 0005 CLOSE R0 - 0x80000000, // 0006 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: start_commissioning_complete -********************************************************************/ -be_local_closure(Matter_Device_start_commissioning_complete, /* name */ - be_nested_proto( - 6, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 5]) { /* constants */ - /* K0 */ be_nested_str_weak(tasmota), - /* K1 */ be_nested_str_weak(log), - /* K2 */ be_nested_str_weak(MTR_X3A_X20_X2A_X2A_X2A_X20Commissioning_X20complete_X20_X2A_X2A_X2A), - /* K3 */ be_const_int(2), - /* K4 */ be_nested_str_weak(stop_basic_commissioning), - }), - be_str_weak(start_commissioning_complete), - &be_const_str_solidified, - ( &(const binstruction[ 8]) { /* code */ - 0xB80A0000, // 0000 GETNGBL R2 K0 - 0x8C080501, // 0001 GETMET R2 R2 K1 - 0x58100002, // 0002 LDCONST R4 K2 - 0x58140003, // 0003 LDCONST R5 K3 - 0x7C080600, // 0004 CALL R2 3 - 0x8C080104, // 0005 GETMET R2 R0 K4 - 0x7C080200, // 0006 CALL R2 1 - 0x80000000, // 0007 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: compute_qrcode_content -********************************************************************/ -be_local_closure(Matter_Device_compute_qrcode_content, /* name */ - be_nested_proto( - 8, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[12]) { /* constants */ - /* K0 */ be_nested_str_weak(resize), - /* K1 */ be_nested_str_weak(setbits), - /* K2 */ be_const_int(3), - /* K3 */ be_nested_str_weak(vendorid), - /* K4 */ be_nested_str_weak(productid), - /* K5 */ be_nested_str_weak(root_discriminator), - /* K6 */ be_nested_str_weak(root_passcode), - /* K7 */ be_const_int(134217727), - /* K8 */ be_nested_str_weak(MT_X3A), - /* K9 */ be_nested_str_weak(matter), - /* K10 */ be_nested_str_weak(Base38), - /* K11 */ be_nested_str_weak(encode), - }), - be_str_weak(compute_qrcode_content), - &be_const_str_solidified, - ( &(const binstruction[40]) { /* code */ - 0x60040015, // 0000 GETGBL R1 G21 - 0x7C040000, // 0001 CALL R1 0 - 0x8C040300, // 0002 GETMET R1 R1 K0 - 0x540E000A, // 0003 LDINT R3 11 - 0x7C040400, // 0004 CALL R1 2 - 0x8C080301, // 0005 GETMET R2 R1 K1 - 0x58100002, // 0006 LDCONST R4 K2 - 0x5416000F, // 0007 LDINT R5 16 - 0x88180103, // 0008 GETMBR R6 R0 K3 - 0x7C080800, // 0009 CALL R2 4 - 0x8C080301, // 000A GETMET R2 R1 K1 - 0x54120012, // 000B LDINT R4 19 - 0x5416000F, // 000C LDINT R5 16 - 0x88180104, // 000D GETMBR R6 R0 K4 - 0x7C080800, // 000E CALL R2 4 - 0x8C080301, // 000F GETMET R2 R1 K1 - 0x54120024, // 0010 LDINT R4 37 - 0x54160007, // 0011 LDINT R5 8 - 0x541A0003, // 0012 LDINT R6 4 - 0x7C080800, // 0013 CALL R2 4 - 0x8C080301, // 0014 GETMET R2 R1 K1 - 0x5412002C, // 0015 LDINT R4 45 - 0x5416000B, // 0016 LDINT R5 12 - 0x88180105, // 0017 GETMBR R6 R0 K5 - 0x541E0FFE, // 0018 LDINT R7 4095 - 0x2C180C07, // 0019 AND R6 R6 R7 - 0x7C080800, // 001A CALL R2 4 - 0x8C080301, // 001B GETMET R2 R1 K1 - 0x54120038, // 001C LDINT R4 57 - 0x5416001A, // 001D LDINT R5 27 - 0x88180106, // 001E GETMBR R6 R0 K6 - 0x2C180D07, // 001F AND R6 R6 K7 - 0x7C080800, // 0020 CALL R2 4 - 0xB80A1200, // 0021 GETNGBL R2 K9 - 0x8808050A, // 0022 GETMBR R2 R2 K10 - 0x8C08050B, // 0023 GETMET R2 R2 K11 - 0x5C100200, // 0024 MOVE R4 R1 - 0x7C080400, // 0025 CALL R2 2 - 0x000A1002, // 0026 ADD R2 K8 R2 - 0x80040400, // 0027 RET 1 R2 - }) - ) -); -/*******************************************************************/ - - /******************************************************************** ** Solidified function: compute_manual_pairing_code ********************************************************************/ @@ -1039,819 +1039,6 @@ be_local_closure(Matter_Device_compute_manual_pairing_code, /* name */ /*******************************************************************/ -/******************************************************************** -** Solidified function: k2l -********************************************************************/ -be_local_closure(Matter_Device_k2l, /* name */ - be_nested_proto( - 8, /* nstack */ - 1, /* argc */ - 4, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 6]) { /* constants */ - /* K0 */ be_const_class(be_class_Matter_Device), - /* K1 */ be_nested_str_weak(keys), - /* K2 */ be_nested_str_weak(push), - /* K3 */ be_nested_str_weak(stop_iteration), - /* K4 */ be_const_int(1), - /* K5 */ be_const_int(0), - }), - be_str_weak(k2l), - &be_const_str_solidified, - ( &(const binstruction[50]) { /* code */ - 0x58040000, // 0000 LDCONST R1 K0 - 0x60080012, // 0001 GETGBL R2 G18 - 0x7C080000, // 0002 CALL R2 0 - 0x4C0C0000, // 0003 LDNIL R3 - 0x1C0C0003, // 0004 EQ R3 R0 R3 - 0x780E0000, // 0005 JMPF R3 #0007 - 0x80040400, // 0006 RET 1 R2 - 0x600C0010, // 0007 GETGBL R3 G16 - 0x8C100101, // 0008 GETMET R4 R0 K1 - 0x7C100200, // 0009 CALL R4 1 - 0x7C0C0200, // 000A CALL R3 1 - 0xA8020005, // 000B EXBLK 0 #0012 - 0x5C100600, // 000C MOVE R4 R3 - 0x7C100000, // 000D CALL R4 0 - 0x8C140502, // 000E GETMET R5 R2 K2 - 0x5C1C0800, // 000F MOVE R7 R4 - 0x7C140400, // 0010 CALL R5 2 - 0x7001FFF9, // 0011 JMP #000C - 0x580C0003, // 0012 LDCONST R3 K3 - 0xAC0C0200, // 0013 CATCH R3 1 0 - 0xB0080000, // 0014 RAISE 2 R0 R0 - 0x600C0010, // 0015 GETGBL R3 G16 - 0x6010000C, // 0016 GETGBL R4 G12 - 0x5C140400, // 0017 MOVE R5 R2 - 0x7C100200, // 0018 CALL R4 1 - 0x04100904, // 0019 SUB R4 R4 K4 - 0x40120804, // 001A CONNECT R4 K4 R4 - 0x7C0C0200, // 001B CALL R3 1 - 0xA8020010, // 001C EXBLK 0 #002E - 0x5C100600, // 001D MOVE R4 R3 - 0x7C100000, // 001E CALL R4 0 - 0x94140404, // 001F GETIDX R5 R2 R4 - 0x5C180800, // 0020 MOVE R6 R4 - 0x241C0D05, // 0021 GT R7 R6 K5 - 0x781E0008, // 0022 JMPF R7 #002C - 0x041C0D04, // 0023 SUB R7 R6 K4 - 0x941C0407, // 0024 GETIDX R7 R2 R7 - 0x241C0E05, // 0025 GT R7 R7 R5 - 0x781E0004, // 0026 JMPF R7 #002C - 0x041C0D04, // 0027 SUB R7 R6 K4 - 0x941C0407, // 0028 GETIDX R7 R2 R7 - 0x98080C07, // 0029 SETIDX R2 R6 R7 - 0x04180D04, // 002A SUB R6 R6 K4 - 0x7001FFF4, // 002B JMP #0021 - 0x98080C05, // 002C SETIDX R2 R6 R5 - 0x7001FFEE, // 002D JMP #001D - 0x580C0003, // 002E LDCONST R3 K3 - 0xAC0C0200, // 002F CATCH R3 1 0 - 0xB0080000, // 0030 RAISE 2 R0 R0 - 0x80040400, // 0031 RET 1 R2 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: start_mdns_announce_hostnames -********************************************************************/ -be_local_closure(Matter_Device_start_mdns_announce_hostnames, /* name */ - be_nested_proto( - 6, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 1, /* has sup protos */ - ( &(const struct bproto*[ 2]) { - be_nested_proto( - 4, /* nstack */ - 0, /* argc */ - 0, /* varg */ - 1, /* has upvals */ - ( &(const bupvaldesc[ 1]) { /* upvals */ - be_local_const_upval(1, 0), - }), - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 5]) { /* constants */ - /* K0 */ be_nested_str_weak(_mdns_announce_hostname), - /* K1 */ be_nested_str_weak(tasmota), - /* K2 */ be_nested_str_weak(remove_rule), - /* K3 */ be_nested_str_weak(Wifi_X23Connected), - /* K4 */ be_nested_str_weak(matter_mdns_host), - }), - be_str_weak(_anonymous_), - &be_const_str_solidified, - ( &(const binstruction[10]) { /* code */ - 0x68000000, // 0000 GETUPV R0 U0 - 0x8C000100, // 0001 GETMET R0 R0 K0 - 0x50080000, // 0002 LDBOOL R2 0 0 - 0x7C000400, // 0003 CALL R0 2 - 0xB8020200, // 0004 GETNGBL R0 K1 - 0x8C000102, // 0005 GETMET R0 R0 K2 - 0x58080003, // 0006 LDCONST R2 K3 - 0x580C0004, // 0007 LDCONST R3 K4 - 0x7C000600, // 0008 CALL R0 3 - 0x80000000, // 0009 RET 0 - }) - ), - be_nested_proto( - 4, /* nstack */ - 0, /* argc */ - 0, /* varg */ - 1, /* has upvals */ - ( &(const bupvaldesc[ 1]) { /* upvals */ - be_local_const_upval(1, 0), - }), - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 5]) { /* constants */ - /* K0 */ be_nested_str_weak(_mdns_announce_hostname), - /* K1 */ be_nested_str_weak(tasmota), - /* K2 */ be_nested_str_weak(remove_rule), - /* K3 */ be_nested_str_weak(Eth_X23Connected), - /* K4 */ be_nested_str_weak(matter_mdns_host), - }), - be_str_weak(_anonymous_), - &be_const_str_solidified, - ( &(const binstruction[10]) { /* code */ - 0x68000000, // 0000 GETUPV R0 U0 - 0x8C000100, // 0001 GETMET R0 R0 K0 - 0x50080200, // 0002 LDBOOL R2 1 0 - 0x7C000400, // 0003 CALL R0 2 - 0xB8020200, // 0004 GETNGBL R0 K1 - 0x8C000102, // 0005 GETMET R0 R0 K2 - 0x58080003, // 0006 LDCONST R2 K3 - 0x580C0004, // 0007 LDCONST R3 K4 - 0x7C000600, // 0008 CALL R0 3 - 0x80000000, // 0009 RET 0 - }) - ), - }), - 1, /* has constants */ - ( &(const bvalue[ 9]) { /* constants */ - /* K0 */ be_nested_str_weak(tasmota), - /* K1 */ be_nested_str_weak(wifi), - /* K2 */ be_nested_str_weak(up), - /* K3 */ be_nested_str_weak(_mdns_announce_hostname), - /* K4 */ be_nested_str_weak(add_rule), - /* K5 */ be_nested_str_weak(Wifi_X23Connected), - /* K6 */ be_nested_str_weak(matter_mdns_host), - /* K7 */ be_nested_str_weak(eth), - /* K8 */ be_nested_str_weak(Eth_X23Connected), - }), - be_str_weak(start_mdns_announce_hostnames), - &be_const_str_solidified, - ( &(const binstruction[32]) { /* code */ - 0xB8060000, // 0000 GETNGBL R1 K0 - 0x8C040301, // 0001 GETMET R1 R1 K1 - 0x7C040200, // 0002 CALL R1 1 - 0x94040302, // 0003 GETIDX R1 R1 K2 - 0x78060003, // 0004 JMPF R1 #0009 - 0x8C040103, // 0005 GETMET R1 R0 K3 - 0x500C0000, // 0006 LDBOOL R3 0 0 - 0x7C040400, // 0007 CALL R1 2 - 0x70020005, // 0008 JMP #000F - 0xB8060000, // 0009 GETNGBL R1 K0 - 0x8C040304, // 000A GETMET R1 R1 K4 - 0x580C0005, // 000B LDCONST R3 K5 - 0x84100000, // 000C CLOSURE R4 P0 - 0x58140006, // 000D LDCONST R5 K6 - 0x7C040800, // 000E CALL R1 4 - 0xB8060000, // 000F GETNGBL R1 K0 - 0x8C040307, // 0010 GETMET R1 R1 K7 - 0x7C040200, // 0011 CALL R1 1 - 0x94040302, // 0012 GETIDX R1 R1 K2 - 0x78060003, // 0013 JMPF R1 #0018 - 0x8C040103, // 0014 GETMET R1 R0 K3 - 0x500C0200, // 0015 LDBOOL R3 1 0 - 0x7C040400, // 0016 CALL R1 2 - 0x70020005, // 0017 JMP #001E - 0xB8060000, // 0018 GETNGBL R1 K0 - 0x8C040304, // 0019 GETMET R1 R1 K4 - 0x580C0008, // 001A LDCONST R3 K8 - 0x84100001, // 001B CLOSURE R4 P1 - 0x58140006, // 001C LDCONST R5 K6 - 0x7C040800, // 001D CALL R1 4 - 0xA0000000, // 001E CLOSE R0 - 0x80000000, // 001F RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: MtrJoin -********************************************************************/ -be_local_closure(Matter_Device_MtrJoin, /* name */ - be_nested_proto( - 8, /* nstack */ - 5, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 4]) { /* constants */ - /* K0 */ be_nested_str_weak(start_root_basic_commissioning), - /* K1 */ be_nested_str_weak(stop_basic_commissioning), - /* K2 */ be_nested_str_weak(tasmota), - /* K3 */ be_nested_str_weak(resp_cmnd_done), - }), - be_str_weak(MtrJoin), - &be_const_str_solidified, - ( &(const binstruction[13]) { /* code */ - 0x60140009, // 0000 GETGBL R5 G9 - 0x5C180600, // 0001 MOVE R6 R3 - 0x7C140200, // 0002 CALL R5 1 - 0x78160002, // 0003 JMPF R5 #0007 - 0x8C180100, // 0004 GETMET R6 R0 K0 - 0x7C180200, // 0005 CALL R6 1 - 0x70020001, // 0006 JMP #0009 - 0x8C180101, // 0007 GETMET R6 R0 K1 - 0x7C180200, // 0008 CALL R6 1 - 0xB81A0400, // 0009 GETNGBL R6 K2 - 0x8C180D03, // 000A GETMET R6 R6 K3 - 0x7C180200, // 000B CALL R6 1 - 0x80000000, // 000C RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: process_attribute_expansion -********************************************************************/ -be_local_closure(Matter_Device_process_attribute_expansion, /* name */ - be_nested_proto( - 29, /* nstack */ - 3, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 1, /* has sup protos */ - ( &(const struct bproto*[ 1]) { - be_nested_proto( - 7, /* nstack */ - 1, /* argc */ - 0, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 5]) { /* constants */ - /* K0 */ be_nested_str_weak(keys), - /* K1 */ be_nested_str_weak(push), - /* K2 */ be_nested_str_weak(stop_iteration), - /* K3 */ be_const_int(1), - /* K4 */ be_const_int(0), - }), - be_str_weak(keys_sorted), - &be_const_str_solidified, - ( &(const binstruction[45]) { /* code */ - 0x60040012, // 0000 GETGBL R1 G18 - 0x7C040000, // 0001 CALL R1 0 - 0x60080010, // 0002 GETGBL R2 G16 - 0x8C0C0100, // 0003 GETMET R3 R0 K0 - 0x7C0C0200, // 0004 CALL R3 1 - 0x7C080200, // 0005 CALL R2 1 - 0xA8020005, // 0006 EXBLK 0 #000D - 0x5C0C0400, // 0007 MOVE R3 R2 - 0x7C0C0000, // 0008 CALL R3 0 - 0x8C100301, // 0009 GETMET R4 R1 K1 - 0x5C180600, // 000A MOVE R6 R3 - 0x7C100400, // 000B CALL R4 2 - 0x7001FFF9, // 000C JMP #0007 - 0x58080002, // 000D LDCONST R2 K2 - 0xAC080200, // 000E CATCH R2 1 0 - 0xB0080000, // 000F RAISE 2 R0 R0 - 0x60080010, // 0010 GETGBL R2 G16 - 0x600C000C, // 0011 GETGBL R3 G12 - 0x5C100200, // 0012 MOVE R4 R1 - 0x7C0C0200, // 0013 CALL R3 1 - 0x040C0703, // 0014 SUB R3 R3 K3 - 0x400E0603, // 0015 CONNECT R3 K3 R3 - 0x7C080200, // 0016 CALL R2 1 - 0xA8020010, // 0017 EXBLK 0 #0029 - 0x5C0C0400, // 0018 MOVE R3 R2 - 0x7C0C0000, // 0019 CALL R3 0 - 0x94100203, // 001A GETIDX R4 R1 R3 - 0x5C140600, // 001B MOVE R5 R3 - 0x24180B04, // 001C GT R6 R5 K4 - 0x781A0008, // 001D JMPF R6 #0027 - 0x04180B03, // 001E SUB R6 R5 K3 - 0x94180206, // 001F GETIDX R6 R1 R6 - 0x24180C04, // 0020 GT R6 R6 R4 - 0x781A0004, // 0021 JMPF R6 #0027 - 0x04180B03, // 0022 SUB R6 R5 K3 - 0x94180206, // 0023 GETIDX R6 R1 R6 - 0x98040A06, // 0024 SETIDX R1 R5 R6 - 0x04140B03, // 0025 SUB R5 R5 K3 - 0x7001FFF4, // 0026 JMP #001C - 0x98040A04, // 0027 SETIDX R1 R5 R4 - 0x7001FFEE, // 0028 JMP #0018 - 0x58080002, // 0029 LDCONST R2 K2 - 0xAC080200, // 002A CATCH R2 1 0 - 0xB0080000, // 002B RAISE 2 R0 R0 - 0x80040200, // 002C RET 1 R1 - }) - ), - }), - 1, /* has constants */ - ( &(const bvalue[22]) { /* constants */ - /* K0 */ be_nested_str_weak(string), - /* K1 */ be_nested_str_weak(endpoint), - /* K2 */ be_nested_str_weak(cluster), - /* K3 */ be_nested_str_weak(attribute), - /* K4 */ be_nested_str_weak(plugins), - /* K5 */ be_nested_str_weak(get_endpoint), - /* K6 */ be_nested_str_weak(contains), - /* K7 */ be_nested_str_weak(get_cluster_list), - /* K8 */ be_nested_str_weak(get_attribute_list), - /* K9 */ be_nested_str_weak(push), - /* K10 */ be_nested_str_weak(stop_iteration), - /* K11 */ be_nested_str_weak(tasmota), - /* K12 */ be_nested_str_weak(log), - /* K13 */ be_nested_str_weak(format), - /* K14 */ be_nested_str_weak(MTR_X3A_X20expansion_X20_X5B_X2502X_X5D_X2504X_X2F_X2504X), - /* K15 */ be_const_int(3), - /* K16 */ be_nested_str_weak(status), - /* K17 */ be_nested_str_weak(matter), - /* K18 */ be_nested_str_weak(UNSUPPORTED_ENDPOINT), - /* K19 */ be_nested_str_weak(UNSUPPORTED_CLUSTER), - /* K20 */ be_nested_str_weak(UNSUPPORTED_ATTRIBUTE), - /* K21 */ be_nested_str_weak(UNREPORTABLE_ATTRIBUTE), - }), - be_str_weak(process_attribute_expansion), - &be_const_str_solidified, - ( &(const binstruction[216]) { /* code */ - 0x840C0000, // 0000 CLOSURE R3 P0 - 0xA4120000, // 0001 IMPORT R4 K0 - 0x88140301, // 0002 GETMBR R5 R1 K1 - 0x50180000, // 0003 LDBOOL R6 0 0 - 0x881C0302, // 0004 GETMBR R7 R1 K2 - 0x50200000, // 0005 LDBOOL R8 0 0 - 0x88240303, // 0006 GETMBR R9 R1 K3 - 0x50280000, // 0007 LDBOOL R10 0 0 - 0x882C0301, // 0008 GETMBR R11 R1 K1 - 0x4C300000, // 0009 LDNIL R12 - 0x202C160C, // 000A NE R11 R11 R12 - 0x782E0007, // 000B JMPF R11 #0014 - 0x882C0302, // 000C GETMBR R11 R1 K2 - 0x4C300000, // 000D LDNIL R12 - 0x202C160C, // 000E NE R11 R11 R12 - 0x782E0003, // 000F JMPF R11 #0014 - 0x882C0303, // 0010 GETMBR R11 R1 K3 - 0x4C300000, // 0011 LDNIL R12 - 0x202C160C, // 0012 NE R11 R11 R12 - 0x742E0000, // 0013 JMPT R11 #0015 - 0x502C0001, // 0014 LDBOOL R11 0 1 - 0x502C0200, // 0015 LDBOOL R11 1 0 - 0x60300013, // 0016 GETGBL R12 G19 - 0x7C300000, // 0017 CALL R12 0 - 0x60340010, // 0018 GETGBL R13 G16 - 0x88380104, // 0019 GETMBR R14 R0 K4 - 0x7C340200, // 001A CALL R13 1 - 0xA8020055, // 001B EXBLK 0 #0072 - 0x5C381A00, // 001C MOVE R14 R13 - 0x7C380000, // 001D CALL R14 0 - 0x8C3C1D05, // 001E GETMET R15 R14 K5 - 0x7C3C0200, // 001F CALL R15 1 - 0x4C400000, // 0020 LDNIL R16 - 0x20400A10, // 0021 NE R16 R5 R16 - 0x78420002, // 0022 JMPF R16 #0026 - 0x20401E05, // 0023 NE R16 R15 R5 - 0x78420000, // 0024 JMPF R16 #0026 - 0x7001FFF5, // 0025 JMP #001C - 0x8C401906, // 0026 GETMET R16 R12 K6 - 0x5C481E00, // 0027 MOVE R18 R15 - 0x7C400400, // 0028 CALL R16 2 - 0x74420002, // 0029 JMPT R16 #002D - 0x60400013, // 002A GETGBL R16 G19 - 0x7C400000, // 002B CALL R16 0 - 0x98301E10, // 002C SETIDX R12 R15 R16 - 0x50180200, // 002D LDBOOL R6 1 0 - 0x8C401D07, // 002E GETMET R16 R14 K7 - 0x5C481E00, // 002F MOVE R18 R15 - 0x7C400400, // 0030 CALL R16 2 - 0x60440010, // 0031 GETGBL R17 G16 - 0x5C482000, // 0032 MOVE R18 R16 - 0x7C440200, // 0033 CALL R17 1 - 0xA8020038, // 0034 EXBLK 0 #006E - 0x5C482200, // 0035 MOVE R18 R17 - 0x7C480000, // 0036 CALL R18 0 - 0x4C4C0000, // 0037 LDNIL R19 - 0x204C0E13, // 0038 NE R19 R7 R19 - 0x784E0002, // 0039 JMPF R19 #003D - 0x204C2407, // 003A NE R19 R18 R7 - 0x784E0000, // 003B JMPF R19 #003D - 0x7001FFF7, // 003C JMP #0035 - 0x944C180F, // 003D GETIDX R19 R12 R15 - 0x8C4C2706, // 003E GETMET R19 R19 K6 - 0x5C542400, // 003F MOVE R21 R18 - 0x7C4C0400, // 0040 CALL R19 2 - 0x744E0003, // 0041 JMPT R19 #0046 - 0x944C180F, // 0042 GETIDX R19 R12 R15 - 0x60500013, // 0043 GETGBL R20 G19 - 0x7C500000, // 0044 CALL R20 0 - 0x984C2414, // 0045 SETIDX R19 R18 R20 - 0x50200200, // 0046 LDBOOL R8 1 0 - 0x8C4C1D08, // 0047 GETMET R19 R14 K8 - 0x5C541E00, // 0048 MOVE R21 R15 - 0x5C582400, // 0049 MOVE R22 R18 - 0x7C4C0600, // 004A CALL R19 3 - 0x60500010, // 004B GETGBL R20 G16 - 0x5C542600, // 004C MOVE R21 R19 - 0x7C500200, // 004D CALL R20 1 - 0xA802001A, // 004E EXBLK 0 #006A - 0x5C542800, // 004F MOVE R21 R20 - 0x7C540000, // 0050 CALL R21 0 - 0x4C580000, // 0051 LDNIL R22 - 0x20581216, // 0052 NE R22 R9 R22 - 0x785A0002, // 0053 JMPF R22 #0057 - 0x20582A09, // 0054 NE R22 R21 R9 - 0x785A0000, // 0055 JMPF R22 #0057 - 0x7001FFF7, // 0056 JMP #004F - 0x9458180F, // 0057 GETIDX R22 R12 R15 - 0x94582C12, // 0058 GETIDX R22 R22 R18 - 0x8C582D06, // 0059 GETMET R22 R22 K6 - 0x5C602A00, // 005A MOVE R24 R21 - 0x7C580400, // 005B CALL R22 2 - 0x745A0004, // 005C JMPT R22 #0062 - 0x9458180F, // 005D GETIDX R22 R12 R15 - 0x94582C12, // 005E GETIDX R22 R22 R18 - 0x605C0012, // 005F GETGBL R23 G18 - 0x7C5C0000, // 0060 CALL R23 0 - 0x98582A17, // 0061 SETIDX R22 R21 R23 - 0x50280200, // 0062 LDBOOL R10 1 0 - 0x9458180F, // 0063 GETIDX R22 R12 R15 - 0x94582C12, // 0064 GETIDX R22 R22 R18 - 0x94582C15, // 0065 GETIDX R22 R22 R21 - 0x8C582D09, // 0066 GETMET R22 R22 K9 - 0x5C601C00, // 0067 MOVE R24 R14 - 0x7C580400, // 0068 CALL R22 2 - 0x7001FFE4, // 0069 JMP #004F - 0x5850000A, // 006A LDCONST R20 K10 - 0xAC500200, // 006B CATCH R20 1 0 - 0xB0080000, // 006C RAISE 2 R0 R0 - 0x7001FFC6, // 006D JMP #0035 - 0x5844000A, // 006E LDCONST R17 K10 - 0xAC440200, // 006F CATCH R17 1 0 - 0xB0080000, // 0070 RAISE 2 R0 R0 - 0x7001FFA9, // 0071 JMP #001C - 0x5834000A, // 0072 LDCONST R13 K10 - 0xAC340200, // 0073 CATCH R13 1 0 - 0xB0080000, // 0074 RAISE 2 R0 R0 - 0x60340010, // 0075 GETGBL R13 G16 - 0x5C380600, // 0076 MOVE R14 R3 - 0x5C3C1800, // 0077 MOVE R15 R12 - 0x7C380200, // 0078 CALL R14 1 - 0x7C340200, // 0079 CALL R13 1 - 0xA802003D, // 007A EXBLK 0 #00B9 - 0x5C381A00, // 007B MOVE R14 R13 - 0x7C380000, // 007C CALL R14 0 - 0x603C0010, // 007D GETGBL R15 G16 - 0x5C400600, // 007E MOVE R16 R3 - 0x9444180E, // 007F GETIDX R17 R12 R14 - 0x7C400200, // 0080 CALL R16 1 - 0x7C3C0200, // 0081 CALL R15 1 - 0xA8020031, // 0082 EXBLK 0 #00B5 - 0x5C401E00, // 0083 MOVE R16 R15 - 0x7C400000, // 0084 CALL R16 0 - 0x60440010, // 0085 GETGBL R17 G16 - 0x5C480600, // 0086 MOVE R18 R3 - 0x944C180E, // 0087 GETIDX R19 R12 R14 - 0x944C2610, // 0088 GETIDX R19 R19 R16 - 0x7C480200, // 0089 CALL R18 1 - 0x7C440200, // 008A CALL R17 1 - 0xA8020024, // 008B EXBLK 0 #00B1 - 0x5C482200, // 008C MOVE R18 R17 - 0x7C480000, // 008D CALL R18 0 - 0x604C0010, // 008E GETGBL R19 G16 - 0x9450180E, // 008F GETIDX R20 R12 R14 - 0x94502810, // 0090 GETIDX R20 R20 R16 - 0x94502812, // 0091 GETIDX R20 R20 R18 - 0x7C4C0200, // 0092 CALL R19 1 - 0xA8020018, // 0093 EXBLK 0 #00AD - 0x5C502600, // 0094 MOVE R20 R19 - 0x7C500000, // 0095 CALL R20 0 - 0xB8561600, // 0096 GETNGBL R21 K11 - 0x8C542B0C, // 0097 GETMET R21 R21 K12 - 0x8C5C090D, // 0098 GETMET R23 R4 K13 - 0x5864000E, // 0099 LDCONST R25 K14 - 0x5C681C00, // 009A MOVE R26 R14 - 0x5C6C2000, // 009B MOVE R27 R16 - 0x5C702400, // 009C MOVE R28 R18 - 0x7C5C0A00, // 009D CALL R23 5 - 0x5860000F, // 009E LDCONST R24 K15 - 0x7C540600, // 009F CALL R21 3 - 0x9006020E, // 00A0 SETMBR R1 K1 R14 - 0x90060410, // 00A1 SETMBR R1 K2 R16 - 0x90060612, // 00A2 SETMBR R1 K3 R18 - 0x5C540400, // 00A3 MOVE R21 R2 - 0x5C582800, // 00A4 MOVE R22 R20 - 0x5C5C0200, // 00A5 MOVE R23 R1 - 0x5C601600, // 00A6 MOVE R24 R11 - 0x7C540600, // 00A7 CALL R21 3 - 0x782E0002, // 00A8 JMPF R11 #00AC - 0x78560001, // 00A9 JMPF R21 #00AC - 0xA8040004, // 00AA EXBLK 1 4 - 0x80002C00, // 00AB RET 0 - 0x7001FFE6, // 00AC JMP #0094 - 0x584C000A, // 00AD LDCONST R19 K10 - 0xAC4C0200, // 00AE CATCH R19 1 0 - 0xB0080000, // 00AF RAISE 2 R0 R0 - 0x7001FFDA, // 00B0 JMP #008C - 0x5844000A, // 00B1 LDCONST R17 K10 - 0xAC440200, // 00B2 CATCH R17 1 0 - 0xB0080000, // 00B3 RAISE 2 R0 R0 - 0x7001FFCD, // 00B4 JMP #0083 - 0x583C000A, // 00B5 LDCONST R15 K10 - 0xAC3C0200, // 00B6 CATCH R15 1 0 - 0xB0080000, // 00B7 RAISE 2 R0 R0 - 0x7001FFC1, // 00B8 JMP #007B - 0x5834000A, // 00B9 LDCONST R13 K10 - 0xAC340200, // 00BA CATCH R13 1 0 - 0xB0080000, // 00BB RAISE 2 R0 R0 - 0x782E0019, // 00BC JMPF R11 #00D7 - 0x5C340C00, // 00BD MOVE R13 R6 - 0x74360003, // 00BE JMPT R13 #00C3 - 0xB8362200, // 00BF GETNGBL R13 K17 - 0x88341B12, // 00C0 GETMBR R13 R13 K18 - 0x9006200D, // 00C1 SETMBR R1 K16 R13 - 0x7002000E, // 00C2 JMP #00D2 - 0x5C341000, // 00C3 MOVE R13 R8 - 0x74360003, // 00C4 JMPT R13 #00C9 - 0xB8362200, // 00C5 GETNGBL R13 K17 - 0x88341B13, // 00C6 GETMBR R13 R13 K19 - 0x9006200D, // 00C7 SETMBR R1 K16 R13 - 0x70020008, // 00C8 JMP #00D2 - 0x5C341400, // 00C9 MOVE R13 R10 - 0x74360003, // 00CA JMPT R13 #00CF - 0xB8362200, // 00CB GETNGBL R13 K17 - 0x88341B14, // 00CC GETMBR R13 R13 K20 - 0x9006200D, // 00CD SETMBR R1 K16 R13 - 0x70020002, // 00CE JMP #00D2 - 0xB8362200, // 00CF GETNGBL R13 K17 - 0x88341B15, // 00D0 GETMBR R13 R13 K21 - 0x9006200D, // 00D1 SETMBR R1 K16 R13 - 0x5C340400, // 00D2 MOVE R13 R2 - 0x4C380000, // 00D3 LDNIL R14 - 0x5C3C0200, // 00D4 MOVE R15 R1 - 0x50400200, // 00D5 LDBOOL R16 1 0 - 0x7C340600, // 00D6 CALL R13 3 - 0x80000000, // 00D7 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: received_ack -********************************************************************/ -be_local_closure(Matter_Device_received_ack, /* name */ - be_nested_proto( - 5, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 2]) { /* constants */ - /* K0 */ be_nested_str_weak(udp_server), - /* K1 */ be_nested_str_weak(received_ack), - }), - be_str_weak(received_ack), - &be_const_str_solidified, - ( &(const binstruction[ 5]) { /* code */ - 0x88080100, // 0000 GETMBR R2 R0 K0 - 0x8C080501, // 0001 GETMET R2 R2 K1 - 0x5C100200, // 0002 MOVE R4 R1 - 0x7C080400, // 0003 CALL R2 2 - 0x80040400, // 0004 RET 1 R2 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: _trigger_read_sensors -********************************************************************/ -be_local_closure(Matter_Device__trigger_read_sensors, /* name */ - be_nested_proto( - 8, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[11]) { /* constants */ - /* K0 */ be_nested_str_weak(json), - /* K1 */ be_nested_str_weak(tasmota), - /* K2 */ be_nested_str_weak(read_sensors), - /* K3 */ be_nested_str_weak(load), - /* K4 */ be_const_int(0), - /* K5 */ be_nested_str_weak(plugins), - /* K6 */ be_nested_str_weak(parse_sensors), - /* K7 */ be_const_int(1), - /* K8 */ be_nested_str_weak(log), - /* K9 */ be_nested_str_weak(MTR_X3A_X20unable_X20to_X20parse_X20read_sensors_X3A_X20), - /* K10 */ be_const_int(3), - }), - be_str_weak(_trigger_read_sensors), - &be_const_str_solidified, - ( &(const binstruction[37]) { /* code */ - 0xA4060000, // 0000 IMPORT R1 K0 - 0xB80A0200, // 0001 GETNGBL R2 K1 - 0x8C080502, // 0002 GETMET R2 R2 K2 - 0x7C080200, // 0003 CALL R2 1 - 0x4C0C0000, // 0004 LDNIL R3 - 0x1C0C0403, // 0005 EQ R3 R2 R3 - 0x780E0000, // 0006 JMPF R3 #0008 - 0x80000600, // 0007 RET 0 - 0x8C0C0303, // 0008 GETMET R3 R1 K3 - 0x5C140400, // 0009 MOVE R5 R2 - 0x7C0C0400, // 000A CALL R3 2 - 0x4C100000, // 000B LDNIL R4 - 0x20100604, // 000C NE R4 R3 R4 - 0x7812000D, // 000D JMPF R4 #001C - 0x58100004, // 000E LDCONST R4 K4 - 0x6014000C, // 000F GETGBL R5 G12 - 0x88180105, // 0010 GETMBR R6 R0 K5 - 0x7C140200, // 0011 CALL R5 1 - 0x14140805, // 0012 LT R5 R4 R5 - 0x78160006, // 0013 JMPF R5 #001B - 0x88140105, // 0014 GETMBR R5 R0 K5 - 0x94140A04, // 0015 GETIDX R5 R5 R4 - 0x8C140B06, // 0016 GETMET R5 R5 K6 - 0x5C1C0600, // 0017 MOVE R7 R3 - 0x7C140400, // 0018 CALL R5 2 - 0x00100907, // 0019 ADD R4 R4 K7 - 0x7001FFF3, // 001A JMP #000F - 0x70020007, // 001B JMP #0024 - 0xB8120200, // 001C GETNGBL R4 K1 - 0x8C100908, // 001D GETMET R4 R4 K8 - 0x60180008, // 001E GETGBL R6 G8 - 0x5C1C0400, // 001F MOVE R7 R2 - 0x7C180200, // 0020 CALL R6 1 - 0x001A1206, // 0021 ADD R6 K9 R6 - 0x581C000A, // 0022 LDCONST R7 K10 - 0x7C100600, // 0023 CALL R4 3 - 0x80000000, // 0024 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: is_root_commissioning_open -********************************************************************/ -be_local_closure(Matter_Device_is_root_commissioning_open, /* name */ - be_nested_proto( - 3, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 2]) { /* constants */ - /* K0 */ be_nested_str_weak(commissioning_open), - /* K1 */ be_nested_str_weak(commissioning_admin_fabric), - }), - be_str_weak(is_root_commissioning_open), - &be_const_str_solidified, - ( &(const binstruction[11]) { /* code */ - 0x88040100, // 0000 GETMBR R1 R0 K0 - 0x4C080000, // 0001 LDNIL R2 - 0x20040202, // 0002 NE R1 R1 R2 - 0x78060003, // 0003 JMPF R1 #0008 - 0x88040101, // 0004 GETMBR R1 R0 K1 - 0x4C080000, // 0005 LDNIL R2 - 0x1C040202, // 0006 EQ R1 R1 R2 - 0x74060000, // 0007 JMPT R1 #0009 - 0x50040001, // 0008 LDBOOL R1 0 1 - 0x50040200, // 0009 LDBOOL R1 1 0 - 0x80040200, // 000A RET 1 R1 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: is_commissioning_open -********************************************************************/ -be_local_closure(Matter_Device_is_commissioning_open, /* name */ - be_nested_proto( - 3, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 1]) { /* constants */ - /* K0 */ be_nested_str_weak(commissioning_open), - }), - be_str_weak(is_commissioning_open), - &be_const_str_solidified, - ( &(const binstruction[ 4]) { /* code */ - 0x88040100, // 0000 GETMBR R1 R0 K0 - 0x4C080000, // 0001 LDNIL R2 - 0x20040202, // 0002 NE R1 R1 R2 - 0x80040200, // 0003 RET 1 R1 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: stop_basic_commissioning -********************************************************************/ -be_local_closure(Matter_Device_stop_basic_commissioning, /* name */ - be_nested_proto( - 5, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[13]) { /* constants */ - /* K0 */ be_nested_str_weak(is_root_commissioning_open), - /* K1 */ be_nested_str_weak(tasmota), - /* K2 */ be_nested_str_weak(publish_result), - /* K3 */ be_nested_str_weak(_X7B_X22Matter_X22_X3A_X7B_X22Commissioning_X22_X3A0_X7D_X7D), - /* K4 */ be_nested_str_weak(Matter), - /* K5 */ be_nested_str_weak(commissioning_open), - /* K6 */ be_nested_str_weak(mdns_remove_PASE), - /* K7 */ be_nested_str_weak(commissioning_iterations), - /* K8 */ be_nested_str_weak(commissioning_discriminator), - /* K9 */ be_nested_str_weak(commissioning_salt), - /* K10 */ be_nested_str_weak(commissioning_w0), - /* K11 */ be_nested_str_weak(commissioning_L), - /* K12 */ be_nested_str_weak(commissioning_admin_fabric), - }), - be_str_weak(stop_basic_commissioning), - &be_const_str_solidified, - ( &(const binstruction[25]) { /* code */ - 0x8C040100, // 0000 GETMET R1 R0 K0 - 0x7C040200, // 0001 CALL R1 1 - 0x78060004, // 0002 JMPF R1 #0008 - 0xB8060200, // 0003 GETNGBL R1 K1 - 0x8C040302, // 0004 GETMET R1 R1 K2 - 0x580C0003, // 0005 LDCONST R3 K3 - 0x58100004, // 0006 LDCONST R4 K4 - 0x7C040600, // 0007 CALL R1 3 - 0x4C040000, // 0008 LDNIL R1 - 0x90020A01, // 0009 SETMBR R0 K5 R1 - 0x8C040106, // 000A GETMET R1 R0 K6 - 0x7C040200, // 000B CALL R1 1 - 0x4C040000, // 000C LDNIL R1 - 0x90020E01, // 000D SETMBR R0 K7 R1 - 0x4C040000, // 000E LDNIL R1 - 0x90021001, // 000F SETMBR R0 K8 R1 - 0x4C040000, // 0010 LDNIL R1 - 0x90021201, // 0011 SETMBR R0 K9 R1 - 0x4C040000, // 0012 LDNIL R1 - 0x90021401, // 0013 SETMBR R0 K10 R1 - 0x4C040000, // 0014 LDNIL R1 - 0x90021601, // 0015 SETMBR R0 K11 R1 - 0x4C040000, // 0016 LDNIL R1 - 0x90021801, // 0017 SETMBR R0 K12 R1 - 0x80000000, // 0018 RET 0 - }) - ) -); -/*******************************************************************/ - - /******************************************************************** ** Solidified function: start_root_basic_commissioning ********************************************************************/ @@ -1949,263 +1136,36 @@ be_local_closure(Matter_Device_start_root_basic_commissioning, /* name */ /******************************************************************** -** Solidified function: attribute_updated +** Solidified function: start_commissioning_complete ********************************************************************/ -be_local_closure(Matter_Device_attribute_updated, /* name */ - be_nested_proto( - 10, /* nstack */ - 5, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 9]) { /* constants */ - /* K0 */ be_nested_str_weak(matter), - /* K1 */ be_nested_str_weak(Path), - /* K2 */ be_nested_str_weak(endpoint), - /* K3 */ be_nested_str_weak(cluster), - /* K4 */ be_nested_str_weak(attribute), - /* K5 */ be_nested_str_weak(message_handler), - /* K6 */ be_nested_str_weak(im), - /* K7 */ be_nested_str_weak(subs_shop), - /* K8 */ be_nested_str_weak(attribute_updated_ctx), - }), - be_str_weak(attribute_updated), - &be_const_str_solidified, - ( &(const binstruction[18]) { /* code */ - 0x4C140000, // 0000 LDNIL R5 - 0x1C140805, // 0001 EQ R5 R4 R5 - 0x78160000, // 0002 JMPF R5 #0004 - 0x50100000, // 0003 LDBOOL R4 0 0 - 0xB8160000, // 0004 GETNGBL R5 K0 - 0x8C140B01, // 0005 GETMET R5 R5 K1 - 0x7C140200, // 0006 CALL R5 1 - 0x90160401, // 0007 SETMBR R5 K2 R1 - 0x90160602, // 0008 SETMBR R5 K3 R2 - 0x90160803, // 0009 SETMBR R5 K4 R3 - 0x88180105, // 000A GETMBR R6 R0 K5 - 0x88180D06, // 000B GETMBR R6 R6 K6 - 0x88180D07, // 000C GETMBR R6 R6 K7 - 0x8C180D08, // 000D GETMET R6 R6 K8 - 0x5C200A00, // 000E MOVE R8 R5 - 0x5C240800, // 000F MOVE R9 R4 - 0x7C180600, // 0010 CALL R6 3 - 0x80000000, // 0011 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: autoconf_device -********************************************************************/ -be_local_closure(Matter_Device_autoconf_device, /* name */ - be_nested_proto( - 8, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[14]) { /* constants */ - /* K0 */ be_nested_str_weak(string), - /* K1 */ be_nested_str_weak(json), - /* K2 */ be_nested_str_weak(plugins), - /* K3 */ be_const_int(0), - /* K4 */ be_nested_str_weak(autoconf_device_map), - /* K5 */ be_nested_str_weak(tasmota), - /* K6 */ be_nested_str_weak(log), - /* K7 */ be_nested_str_weak(MTR_X3A_X20autoconfig_X20_X3D_X20), - /* K8 */ be_const_int(3), - /* K9 */ be_nested_str_weak(_load_plugins_config), - /* K10 */ be_nested_str_weak(plugins_persist), - /* K11 */ be_nested_str_weak(sessions), - /* K12 */ be_nested_str_weak(count_active_fabrics), - /* K13 */ be_nested_str_weak(save_param), - }), - be_str_weak(autoconf_device), - &be_const_str_solidified, - ( &(const binstruction[33]) { /* code */ - 0xA4060000, // 0000 IMPORT R1 K0 - 0xA40A0200, // 0001 IMPORT R2 K1 - 0x600C000C, // 0002 GETGBL R3 G12 - 0x88100102, // 0003 GETMBR R4 R0 K2 - 0x7C0C0200, // 0004 CALL R3 1 - 0x240C0703, // 0005 GT R3 R3 K3 - 0x780E0000, // 0006 JMPF R3 #0008 - 0x80000600, // 0007 RET 0 - 0x8C0C0104, // 0008 GETMET R3 R0 K4 - 0x7C0C0200, // 0009 CALL R3 1 - 0xB8120A00, // 000A GETNGBL R4 K5 - 0x8C100906, // 000B GETMET R4 R4 K6 - 0x60180008, // 000C GETGBL R6 G8 - 0x5C1C0600, // 000D MOVE R7 R3 - 0x7C180200, // 000E CALL R6 1 - 0x001A0E06, // 000F ADD R6 K7 R6 - 0x581C0008, // 0010 LDCONST R7 K8 - 0x7C100600, // 0011 CALL R4 3 - 0x8C100109, // 0012 GETMET R4 R0 K9 - 0x5C180600, // 0013 MOVE R6 R3 - 0x7C100400, // 0014 CALL R4 2 - 0x8810010A, // 0015 GETMBR R4 R0 K10 - 0x74120008, // 0016 JMPT R4 #0020 - 0x8810010B, // 0017 GETMBR R4 R0 K11 - 0x8C10090C, // 0018 GETMET R4 R4 K12 - 0x7C100200, // 0019 CALL R4 1 - 0x24100903, // 001A GT R4 R4 K3 - 0x78120003, // 001B JMPF R4 #0020 - 0x50100200, // 001C LDBOOL R4 1 0 - 0x90021404, // 001D SETMBR R0 K10 R4 - 0x8C10010D, // 001E GETMET R4 R0 K13 - 0x7C100200, // 001F CALL R4 1 - 0x80000000, // 0020 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: every_250ms -********************************************************************/ -be_local_closure(Matter_Device_every_250ms, /* name */ - be_nested_proto( - 3, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 2]) { /* constants */ - /* K0 */ be_nested_str_weak(message_handler), - /* K1 */ be_nested_str_weak(every_250ms), - }), - be_str_weak(every_250ms), - &be_const_str_solidified, - ( &(const binstruction[ 4]) { /* code */ - 0x88040100, // 0000 GETMBR R1 R0 K0 - 0x8C040301, // 0001 GETMET R1 R1 K1 - 0x7C040200, // 0002 CALL R1 1 - 0x80000000, // 0003 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: mdns_remove_op_discovery_all_fabrics -********************************************************************/ -be_local_closure(Matter_Device_mdns_remove_op_discovery_all_fabrics, /* name */ - be_nested_proto( - 6, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 6]) { /* constants */ - /* K0 */ be_nested_str_weak(sessions), - /* K1 */ be_nested_str_weak(active_fabrics), - /* K2 */ be_nested_str_weak(get_device_id), - /* K3 */ be_nested_str_weak(get_fabric_id), - /* K4 */ be_nested_str_weak(mdns_remove_op_discovery), - /* K5 */ be_nested_str_weak(stop_iteration), - }), - be_str_weak(mdns_remove_op_discovery_all_fabrics), - &be_const_str_solidified, - ( &(const binstruction[22]) { /* code */ - 0x60040010, // 0000 GETGBL R1 G16 - 0x88080100, // 0001 GETMBR R2 R0 K0 - 0x8C080501, // 0002 GETMET R2 R2 K1 - 0x7C080200, // 0003 CALL R2 1 - 0x7C040200, // 0004 CALL R1 1 - 0xA802000B, // 0005 EXBLK 0 #0012 - 0x5C080200, // 0006 MOVE R2 R1 - 0x7C080000, // 0007 CALL R2 0 - 0x8C0C0502, // 0008 GETMET R3 R2 K2 - 0x7C0C0200, // 0009 CALL R3 1 - 0x780E0005, // 000A JMPF R3 #0011 - 0x8C0C0503, // 000B GETMET R3 R2 K3 - 0x7C0C0200, // 000C CALL R3 1 - 0x780E0002, // 000D JMPF R3 #0011 - 0x8C0C0104, // 000E GETMET R3 R0 K4 - 0x5C140400, // 000F MOVE R5 R2 - 0x7C0C0400, // 0010 CALL R3 2 - 0x7001FFF3, // 0011 JMP #0006 - 0x58040005, // 0012 LDCONST R1 K5 - 0xAC040200, // 0013 CATCH R1 1 0 - 0xB0080000, // 0014 RAISE 2 R0 R0 - 0x80000000, // 0015 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: start_commissioning_complete_deferred -********************************************************************/ -be_local_closure(Matter_Device_start_commissioning_complete_deferred, /* name */ +be_local_closure(Matter_Device_start_commissioning_complete, /* name */ be_nested_proto( 6, /* nstack */ 2, /* argc */ 2, /* varg */ 0, /* has upvals */ NULL, /* no upvals */ - 1, /* has sup protos */ - ( &(const struct bproto*[ 1]) { - be_nested_proto( - 3, /* nstack */ - 0, /* argc */ - 0, /* varg */ - 1, /* has upvals */ - ( &(const bupvaldesc[ 2]) { /* upvals */ - be_local_const_upval(1, 0), - be_local_const_upval(1, 1), - }), - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 1]) { /* constants */ - /* K0 */ be_nested_str_weak(start_commissioning_complete), - }), - be_str_weak(_X3Clambda_X3E), - &be_const_str_solidified, - ( &(const binstruction[ 5]) { /* code */ - 0x68000000, // 0000 GETUPV R0 U0 - 0x8C000100, // 0001 GETMET R0 R0 K0 - 0x68080001, // 0002 GETUPV R2 U1 - 0x7C000400, // 0003 CALL R0 2 - 0x80040000, // 0004 RET 1 R0 - }) - ), - }), + 0, /* has sup protos */ + NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[ 3]) { /* constants */ + ( &(const bvalue[ 5]) { /* constants */ /* K0 */ be_nested_str_weak(tasmota), - /* K1 */ be_nested_str_weak(set_timer), - /* K2 */ be_const_int(0), + /* K1 */ be_nested_str_weak(log), + /* K2 */ be_nested_str_weak(MTR_X3A_X20_X2A_X2A_X2A_X20Commissioning_X20complete_X20_X2A_X2A_X2A), + /* K3 */ be_const_int(2), + /* K4 */ be_nested_str_weak(stop_basic_commissioning), }), - be_str_weak(start_commissioning_complete_deferred), + be_str_weak(start_commissioning_complete), &be_const_str_solidified, - ( &(const binstruction[ 7]) { /* code */ + ( &(const binstruction[ 8]) { /* code */ 0xB80A0000, // 0000 GETNGBL R2 K0 0x8C080501, // 0001 GETMET R2 R2 K1 0x58100002, // 0002 LDCONST R4 K2 - 0x84140000, // 0003 CLOSURE R5 P0 + 0x58140003, // 0003 LDCONST R5 K3 0x7C080600, // 0004 CALL R2 3 - 0xA0000000, // 0005 CLOSE R0 - 0x80000000, // 0006 RET 0 + 0x8C080104, // 0005 GETMET R2 R0 K4 + 0x7C080200, // 0006 CALL R2 1 + 0x80000000, // 0007 RET 0 }) ) ); @@ -2442,9 +1402,618 @@ be_local_closure(Matter_Device_init, /* name */ /******************************************************************** -** Solidified function: _init_basic_commissioning +** Solidified function: start ********************************************************************/ -be_local_closure(Matter_Device__init_basic_commissioning, /* name */ +be_local_closure(Matter_Device_start, /* name */ + be_nested_proto( + 6, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 1, /* has sup protos */ + ( &(const struct bproto*[ 1]) { + be_nested_proto( + 2, /* nstack */ + 0, /* argc */ + 0, /* varg */ + 1, /* has upvals */ + ( &(const bupvaldesc[ 1]) { /* upvals */ + be_local_const_upval(1, 0), + }), + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 1]) { /* constants */ + /* K0 */ be_nested_str_weak(_trigger_read_sensors), + }), + be_str_weak(_anonymous_), + &be_const_str_solidified, + ( &(const binstruction[ 4]) { /* code */ + 0x68000000, // 0000 GETUPV R0 U0 + 0x8C000100, // 0001 GETMET R0 R0 K0 + 0x7C000200, // 0002 CALL R0 1 + 0x80000000, // 0003 RET 0 + }) + ), + }), + 1, /* has constants */ + ( &(const bvalue[ 9]) { /* constants */ + /* K0 */ be_nested_str_weak(started), + /* K1 */ be_nested_str_weak(autoconf_device), + /* K2 */ be_nested_str_weak(tasmota), + /* K3 */ be_nested_str_weak(add_cron), + /* K4 */ be_nested_str_weak(_X2A_X2F30_X20_X2A_X20_X2A_X20_X2A_X20_X2A_X20_X2A), + /* K5 */ be_nested_str_weak(matter_sensors_30s), + /* K6 */ be_nested_str_weak(_start_udp), + /* K7 */ be_nested_str_weak(UDP_PORT), + /* K8 */ be_nested_str_weak(start_mdns_announce_hostnames), + }), + be_str_weak(start), + &be_const_str_solidified, + ( &(const binstruction[20]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x78060000, // 0001 JMPF R1 #0003 + 0x80000200, // 0002 RET 0 + 0x8C040101, // 0003 GETMET R1 R0 K1 + 0x7C040200, // 0004 CALL R1 1 + 0xB8060400, // 0005 GETNGBL R1 K2 + 0x8C040303, // 0006 GETMET R1 R1 K3 + 0x580C0004, // 0007 LDCONST R3 K4 + 0x84100000, // 0008 CLOSURE R4 P0 + 0x58140005, // 0009 LDCONST R5 K5 + 0x7C040800, // 000A CALL R1 4 + 0x8C040106, // 000B GETMET R1 R0 K6 + 0x880C0107, // 000C GETMBR R3 R0 K7 + 0x7C040400, // 000D CALL R1 2 + 0x8C040108, // 000E GETMET R1 R0 K8 + 0x7C040200, // 000F CALL R1 1 + 0x50040200, // 0010 LDBOOL R1 1 0 + 0x90020001, // 0011 SETMBR R0 K0 R1 + 0xA0000000, // 0012 CLOSE R0 + 0x80000000, // 0013 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: load_param +********************************************************************/ +be_local_closure(Matter_Device_load_param, /* name */ + be_nested_proto( + 12, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[28]) { /* constants */ + /* K0 */ be_nested_str_weak(string), + /* K1 */ be_nested_str_weak(crypto), + /* K2 */ be_nested_str_weak(FILENAME), + /* K3 */ be_nested_str_weak(read), + /* K4 */ be_nested_str_weak(close), + /* K5 */ be_nested_str_weak(json), + /* K6 */ be_nested_str_weak(load), + /* K7 */ be_nested_str_weak(root_discriminator), + /* K8 */ be_nested_str_weak(find), + /* K9 */ be_nested_str_weak(distinguish), + /* K10 */ be_nested_str_weak(root_passcode), + /* K11 */ be_nested_str_weak(passcode), + /* K12 */ be_nested_str_weak(ipv4only), + /* K13 */ be_nested_str_weak(plugins_config), + /* K14 */ be_nested_str_weak(config), + /* K15 */ be_nested_str_weak(_load_plugins_config), + /* K16 */ be_nested_str_weak(plugins_persist), + /* K17 */ be_nested_str_weak(io_error), + /* K18 */ be_nested_str_weak(tasmota), + /* K19 */ be_nested_str_weak(log), + /* K20 */ be_nested_str_weak(MTR_X3A_X20Session_Store_X3A_X3Aload_X20Exception_X3A), + /* K21 */ be_nested_str_weak(_X7C), + /* K22 */ be_const_int(2), + /* K23 */ be_nested_str_weak(random), + /* K24 */ be_nested_str_weak(get), + /* K25 */ be_const_int(0), + /* K26 */ be_nested_str_weak(generate_random_passcode), + /* K27 */ be_nested_str_weak(save_param), + }), + be_str_weak(load_param), + &be_const_str_solidified, + ( &(const binstruction[91]) { /* code */ + 0xA4060000, // 0000 IMPORT R1 K0 + 0xA40A0200, // 0001 IMPORT R2 K1 + 0xA8020028, // 0002 EXBLK 0 #002C + 0x600C0011, // 0003 GETGBL R3 G17 + 0x88100102, // 0004 GETMBR R4 R0 K2 + 0x7C0C0200, // 0005 CALL R3 1 + 0x8C100703, // 0006 GETMET R4 R3 K3 + 0x7C100200, // 0007 CALL R4 1 + 0x8C140704, // 0008 GETMET R5 R3 K4 + 0x7C140200, // 0009 CALL R5 1 + 0xA4160A00, // 000A IMPORT R5 K5 + 0x8C180B06, // 000B GETMET R6 R5 K6 + 0x5C200800, // 000C MOVE R8 R4 + 0x7C180400, // 000D CALL R6 2 + 0x8C1C0D08, // 000E GETMET R7 R6 K8 + 0x58240009, // 000F LDCONST R9 K9 + 0x88280107, // 0010 GETMBR R10 R0 K7 + 0x7C1C0600, // 0011 CALL R7 3 + 0x90020E07, // 0012 SETMBR R0 K7 R7 + 0x8C1C0D08, // 0013 GETMET R7 R6 K8 + 0x5824000B, // 0014 LDCONST R9 K11 + 0x8828010A, // 0015 GETMBR R10 R0 K10 + 0x7C1C0600, // 0016 CALL R7 3 + 0x90021407, // 0017 SETMBR R0 K10 R7 + 0x601C0017, // 0018 GETGBL R7 G23 + 0x8C200D08, // 0019 GETMET R8 R6 K8 + 0x5828000C, // 001A LDCONST R10 K12 + 0x502C0000, // 001B LDBOOL R11 0 0 + 0x7C200600, // 001C CALL R8 3 + 0x7C1C0200, // 001D CALL R7 1 + 0x90021807, // 001E SETMBR R0 K12 R7 + 0x8C1C0D08, // 001F GETMET R7 R6 K8 + 0x5824000E, // 0020 LDCONST R9 K14 + 0x7C1C0400, // 0021 CALL R7 2 + 0x90021A07, // 0022 SETMBR R0 K13 R7 + 0x881C010D, // 0023 GETMBR R7 R0 K13 + 0x781E0004, // 0024 JMPF R7 #002A + 0x8C1C010F, // 0025 GETMET R7 R0 K15 + 0x8824010D, // 0026 GETMBR R9 R0 K13 + 0x7C1C0400, // 0027 CALL R7 2 + 0x501C0200, // 0028 LDBOOL R7 1 0 + 0x90022007, // 0029 SETMBR R0 K16 R7 + 0xA8040001, // 002A EXBLK 1 1 + 0x70020012, // 002B JMP #003F + 0xAC0C0002, // 002C CATCH R3 0 2 + 0x7002000F, // 002D JMP #003E + 0x20140711, // 002E NE R5 R3 K17 + 0x7816000C, // 002F JMPF R5 #003D + 0xB8162400, // 0030 GETNGBL R5 K18 + 0x8C140B13, // 0031 GETMET R5 R5 K19 + 0x601C0008, // 0032 GETGBL R7 G8 + 0x5C200600, // 0033 MOVE R8 R3 + 0x7C1C0200, // 0034 CALL R7 1 + 0x001E2807, // 0035 ADD R7 K20 R7 + 0x001C0F15, // 0036 ADD R7 R7 K21 + 0x60200008, // 0037 GETGBL R8 G8 + 0x5C240800, // 0038 MOVE R9 R4 + 0x7C200200, // 0039 CALL R8 1 + 0x001C0E08, // 003A ADD R7 R7 R8 + 0x58200016, // 003B LDCONST R8 K22 + 0x7C140600, // 003C CALL R5 3 + 0x70020000, // 003D JMP #003F + 0xB0080000, // 003E RAISE 2 R0 R0 + 0x500C0000, // 003F LDBOOL R3 0 0 + 0x88100107, // 0040 GETMBR R4 R0 K7 + 0x4C140000, // 0041 LDNIL R5 + 0x1C100805, // 0042 EQ R4 R4 R5 + 0x7812000A, // 0043 JMPF R4 #004F + 0x8C100517, // 0044 GETMET R4 R2 K23 + 0x58180016, // 0045 LDCONST R6 K22 + 0x7C100400, // 0046 CALL R4 2 + 0x8C100918, // 0047 GETMET R4 R4 K24 + 0x58180019, // 0048 LDCONST R6 K25 + 0x581C0016, // 0049 LDCONST R7 K22 + 0x7C100600, // 004A CALL R4 3 + 0x54160FFE, // 004B LDINT R5 4095 + 0x2C100805, // 004C AND R4 R4 R5 + 0x90020E04, // 004D SETMBR R0 K7 R4 + 0x500C0200, // 004E LDBOOL R3 1 0 + 0x8810010A, // 004F GETMBR R4 R0 K10 + 0x4C140000, // 0050 LDNIL R5 + 0x1C100805, // 0051 EQ R4 R4 R5 + 0x78120003, // 0052 JMPF R4 #0057 + 0x8C10011A, // 0053 GETMET R4 R0 K26 + 0x7C100200, // 0054 CALL R4 1 + 0x90021404, // 0055 SETMBR R0 K10 R4 + 0x500C0200, // 0056 LDBOOL R3 1 0 + 0x780E0001, // 0057 JMPF R3 #005A + 0x8C10011B, // 0058 GETMET R4 R0 K27 + 0x7C100200, // 0059 CALL R4 1 + 0x80000000, // 005A RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: register_native_classes +********************************************************************/ +be_local_closure(Matter_Device_register_native_classes, /* name */ + be_nested_proto( + 9, /* nstack */ + 3, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[28]) { /* constants */ + /* K0 */ be_nested_str_weak(register_plugin_class), + /* K1 */ be_nested_str_weak(root), + /* K2 */ be_nested_str_weak(matter), + /* K3 */ be_nested_str_weak(Plugin_Root), + /* K4 */ be_nested_str_weak(light0), + /* K5 */ be_nested_str_weak(Plugin_Light0), + /* K6 */ be_nested_str_weak(light1), + /* K7 */ be_nested_str_weak(Plugin_Light1), + /* K8 */ be_nested_str_weak(light2), + /* K9 */ be_nested_str_weak(Plugin_Light2), + /* K10 */ be_nested_str_weak(light3), + /* K11 */ be_nested_str_weak(Plugin_Light3), + /* K12 */ be_nested_str_weak(relay), + /* K13 */ be_nested_str_weak(Plugin_OnOff), + /* K14 */ be_nested_str_weak(temperature), + /* K15 */ be_nested_str_weak(Plugin_Sensor_Temp), + /* K16 */ be_nested_str_weak(humidity), + /* K17 */ be_nested_str_weak(Plugin_Sensor_Humidity), + /* K18 */ be_nested_str_weak(illuminance), + /* K19 */ be_nested_str_weak(Plugin_Sensor_Illuminance), + /* K20 */ be_nested_str_weak(pressure), + /* K21 */ be_nested_str_weak(Plugin_Sensor_Pressure), + /* K22 */ be_nested_str_weak(tasmota), + /* K23 */ be_nested_str_weak(log), + /* K24 */ be_nested_str_weak(MTR_X3A_X20registered_X20classes_X20), + /* K25 */ be_nested_str_weak(k2l), + /* K26 */ be_nested_str_weak(plugins_classes), + /* K27 */ be_const_int(3), + }), + be_str_weak(register_native_classes), + &be_const_str_solidified, + ( &(const binstruction[61]) { /* code */ + 0x8C0C0100, // 0000 GETMET R3 R0 K0 + 0x58140001, // 0001 LDCONST R5 K1 + 0xB81A0400, // 0002 GETNGBL R6 K2 + 0x88180D03, // 0003 GETMBR R6 R6 K3 + 0x7C0C0600, // 0004 CALL R3 3 + 0x8C0C0100, // 0005 GETMET R3 R0 K0 + 0x58140004, // 0006 LDCONST R5 K4 + 0xB81A0400, // 0007 GETNGBL R6 K2 + 0x88180D05, // 0008 GETMBR R6 R6 K5 + 0x7C0C0600, // 0009 CALL R3 3 + 0x8C0C0100, // 000A GETMET R3 R0 K0 + 0x58140006, // 000B LDCONST R5 K6 + 0xB81A0400, // 000C GETNGBL R6 K2 + 0x88180D07, // 000D GETMBR R6 R6 K7 + 0x7C0C0600, // 000E CALL R3 3 + 0x8C0C0100, // 000F GETMET R3 R0 K0 + 0x58140008, // 0010 LDCONST R5 K8 + 0xB81A0400, // 0011 GETNGBL R6 K2 + 0x88180D09, // 0012 GETMBR R6 R6 K9 + 0x7C0C0600, // 0013 CALL R3 3 + 0x8C0C0100, // 0014 GETMET R3 R0 K0 + 0x5814000A, // 0015 LDCONST R5 K10 + 0xB81A0400, // 0016 GETNGBL R6 K2 + 0x88180D0B, // 0017 GETMBR R6 R6 K11 + 0x7C0C0600, // 0018 CALL R3 3 + 0x8C0C0100, // 0019 GETMET R3 R0 K0 + 0x5814000C, // 001A LDCONST R5 K12 + 0xB81A0400, // 001B GETNGBL R6 K2 + 0x88180D0D, // 001C GETMBR R6 R6 K13 + 0x7C0C0600, // 001D CALL R3 3 + 0x8C0C0100, // 001E GETMET R3 R0 K0 + 0x5814000E, // 001F LDCONST R5 K14 + 0xB81A0400, // 0020 GETNGBL R6 K2 + 0x88180D0F, // 0021 GETMBR R6 R6 K15 + 0x7C0C0600, // 0022 CALL R3 3 + 0x8C0C0100, // 0023 GETMET R3 R0 K0 + 0x58140010, // 0024 LDCONST R5 K16 + 0xB81A0400, // 0025 GETNGBL R6 K2 + 0x88180D11, // 0026 GETMBR R6 R6 K17 + 0x7C0C0600, // 0027 CALL R3 3 + 0x8C0C0100, // 0028 GETMET R3 R0 K0 + 0x58140012, // 0029 LDCONST R5 K18 + 0xB81A0400, // 002A GETNGBL R6 K2 + 0x88180D13, // 002B GETMBR R6 R6 K19 + 0x7C0C0600, // 002C CALL R3 3 + 0x8C0C0100, // 002D GETMET R3 R0 K0 + 0x58140014, // 002E LDCONST R5 K20 + 0xB81A0400, // 002F GETNGBL R6 K2 + 0x88180D15, // 0030 GETMBR R6 R6 K21 + 0x7C0C0600, // 0031 CALL R3 3 + 0xB80E2C00, // 0032 GETNGBL R3 K22 + 0x8C0C0717, // 0033 GETMET R3 R3 K23 + 0x60140008, // 0034 GETGBL R5 G8 + 0x8C180119, // 0035 GETMET R6 R0 K25 + 0x8820011A, // 0036 GETMBR R8 R0 K26 + 0x7C180400, // 0037 CALL R6 2 + 0x7C140200, // 0038 CALL R5 1 + 0x00163005, // 0039 ADD R5 K24 R5 + 0x5818001B, // 003A LDCONST R6 K27 + 0x7C0C0600, // 003B CALL R3 3 + 0x80000000, // 003C RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: _mdns_announce_hostname +********************************************************************/ +be_local_closure(Matter_Device__mdns_announce_hostname, /* name */ + be_nested_proto( + 16, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[28]) { /* constants */ + /* K0 */ be_nested_str_weak(mdns), + /* K1 */ be_nested_str_weak(string), + /* K2 */ be_nested_str_weak(start), + /* K3 */ be_nested_str_weak(tasmota), + /* K4 */ be_nested_str_weak(eth), + /* K5 */ be_nested_str_weak(hostname_eth), + /* K6 */ be_nested_str_weak(replace), + /* K7 */ be_nested_str_weak(find), + /* K8 */ be_nested_str_weak(mac), + /* K9 */ be_nested_str_weak(_X3A), + /* K10 */ be_nested_str_weak(), + /* K11 */ be_nested_str_weak(ipv4only), + /* K12 */ be_nested_str_weak(log), + /* K13 */ be_nested_str_weak(format), + /* K14 */ be_nested_str_weak(MTR_X3A_X20calling_X20mdns_X2Eadd_hostname_X28_X25s_X2C_X20_X25s_X2C_X20_X25s_X29), + /* K15 */ be_nested_str_weak(ip6local), + /* K16 */ be_nested_str_weak(ip), + /* K17 */ be_const_int(3), + /* K18 */ be_nested_str_weak(add_hostname), + /* K19 */ be_nested_str_weak(ip6), + /* K20 */ be_nested_str_weak(MTR_X3A_X20calling_X20mdns_X2Eadd_hostname_X28_X25s_X2C_X20_X25s_X29), + /* K21 */ be_nested_str_weak(wifi), + /* K22 */ be_nested_str_weak(hostname_wifi), + /* K23 */ be_nested_str_weak(MTR_X3A_X20start_X20mDNS_X20on_X20_X25s_X20host_X20_X27_X25s_X2Elocal_X27), + /* K24 */ be_const_int(2), + /* K25 */ be_nested_str_weak(MTR_X3A_X20Exception), + /* K26 */ be_nested_str_weak(_X7C), + /* K27 */ be_nested_str_weak(mdns_announce_op_discovery_all_fabrics), + }), + be_str_weak(_mdns_announce_hostname), + &be_const_str_solidified, + ( &(const binstruction[172]) { /* code */ + 0xA40A0000, // 0000 IMPORT R2 K0 + 0xA40E0200, // 0001 IMPORT R3 K1 + 0x8C100502, // 0002 GETMET R4 R2 K2 + 0x7C100200, // 0003 CALL R4 1 + 0xA8020092, // 0004 EXBLK 0 #0098 + 0x78060040, // 0005 JMPF R1 #0047 + 0xB8120600, // 0006 GETNGBL R4 K3 + 0x8C100904, // 0007 GETMET R4 R4 K4 + 0x7C100200, // 0008 CALL R4 1 + 0x8C140706, // 0009 GETMET R5 R3 K6 + 0x8C1C0907, // 000A GETMET R7 R4 K7 + 0x58240008, // 000B LDCONST R9 K8 + 0x7C1C0400, // 000C CALL R7 2 + 0x58200009, // 000D LDCONST R8 K9 + 0x5824000A, // 000E LDCONST R9 K10 + 0x7C140800, // 000F CALL R5 4 + 0x90020A05, // 0010 SETMBR R0 K5 R5 + 0x8814010B, // 0011 GETMBR R5 R0 K11 + 0x7416001F, // 0012 JMPT R5 #0033 + 0xB8160600, // 0013 GETNGBL R5 K3 + 0x8C140B0C, // 0014 GETMET R5 R5 K12 + 0x8C1C070D, // 0015 GETMET R7 R3 K13 + 0x5824000E, // 0016 LDCONST R9 K14 + 0x88280105, // 0017 GETMBR R10 R0 K5 + 0x8C2C0907, // 0018 GETMET R11 R4 K7 + 0x5834000F, // 0019 LDCONST R13 K15 + 0x5838000A, // 001A LDCONST R14 K10 + 0x7C2C0600, // 001B CALL R11 3 + 0x8C300907, // 001C GETMET R12 R4 K7 + 0x58380010, // 001D LDCONST R14 K16 + 0x583C000A, // 001E LDCONST R15 K10 + 0x7C300600, // 001F CALL R12 3 + 0x7C1C0A00, // 0020 CALL R7 5 + 0x58200011, // 0021 LDCONST R8 K17 + 0x7C140600, // 0022 CALL R5 3 + 0x8C140512, // 0023 GETMET R5 R2 K18 + 0x881C0105, // 0024 GETMBR R7 R0 K5 + 0x8C200907, // 0025 GETMET R8 R4 K7 + 0x5828000F, // 0026 LDCONST R10 K15 + 0x582C000A, // 0027 LDCONST R11 K10 + 0x7C200600, // 0028 CALL R8 3 + 0x8C240907, // 0029 GETMET R9 R4 K7 + 0x582C0010, // 002A LDCONST R11 K16 + 0x5830000A, // 002B LDCONST R12 K10 + 0x7C240600, // 002C CALL R9 3 + 0x8C280907, // 002D GETMET R10 R4 K7 + 0x58300013, // 002E LDCONST R12 K19 + 0x5834000A, // 002F LDCONST R13 K10 + 0x7C280600, // 0030 CALL R10 3 + 0x7C140A00, // 0031 CALL R5 5 + 0x70020012, // 0032 JMP #0046 + 0xB8160600, // 0033 GETNGBL R5 K3 + 0x8C140B0C, // 0034 GETMET R5 R5 K12 + 0x8C1C070D, // 0035 GETMET R7 R3 K13 + 0x58240014, // 0036 LDCONST R9 K20 + 0x88280105, // 0037 GETMBR R10 R0 K5 + 0x8C2C0907, // 0038 GETMET R11 R4 K7 + 0x58340010, // 0039 LDCONST R13 K16 + 0x5838000A, // 003A LDCONST R14 K10 + 0x7C2C0600, // 003B CALL R11 3 + 0x7C1C0800, // 003C CALL R7 4 + 0x58200011, // 003D LDCONST R8 K17 + 0x7C140600, // 003E CALL R5 3 + 0x8C140512, // 003F GETMET R5 R2 K18 + 0x881C0105, // 0040 GETMBR R7 R0 K5 + 0x8C200907, // 0041 GETMET R8 R4 K7 + 0x58280010, // 0042 LDCONST R10 K16 + 0x582C000A, // 0043 LDCONST R11 K10 + 0x7C200600, // 0044 CALL R8 3 + 0x7C140600, // 0045 CALL R5 3 + 0x7002003F, // 0046 JMP #0087 + 0xB8120600, // 0047 GETNGBL R4 K3 + 0x8C100915, // 0048 GETMET R4 R4 K21 + 0x7C100200, // 0049 CALL R4 1 + 0x8C140706, // 004A GETMET R5 R3 K6 + 0x8C1C0907, // 004B GETMET R7 R4 K7 + 0x58240008, // 004C LDCONST R9 K8 + 0x7C1C0400, // 004D CALL R7 2 + 0x58200009, // 004E LDCONST R8 K9 + 0x5824000A, // 004F LDCONST R9 K10 + 0x7C140800, // 0050 CALL R5 4 + 0x90022C05, // 0051 SETMBR R0 K22 R5 + 0x8814010B, // 0052 GETMBR R5 R0 K11 + 0x7416001F, // 0053 JMPT R5 #0074 + 0xB8160600, // 0054 GETNGBL R5 K3 + 0x8C140B0C, // 0055 GETMET R5 R5 K12 + 0x8C1C070D, // 0056 GETMET R7 R3 K13 + 0x5824000E, // 0057 LDCONST R9 K14 + 0x88280116, // 0058 GETMBR R10 R0 K22 + 0x8C2C0907, // 0059 GETMET R11 R4 K7 + 0x5834000F, // 005A LDCONST R13 K15 + 0x5838000A, // 005B LDCONST R14 K10 + 0x7C2C0600, // 005C CALL R11 3 + 0x8C300907, // 005D GETMET R12 R4 K7 + 0x58380010, // 005E LDCONST R14 K16 + 0x583C000A, // 005F LDCONST R15 K10 + 0x7C300600, // 0060 CALL R12 3 + 0x7C1C0A00, // 0061 CALL R7 5 + 0x58200011, // 0062 LDCONST R8 K17 + 0x7C140600, // 0063 CALL R5 3 + 0x8C140512, // 0064 GETMET R5 R2 K18 + 0x881C0116, // 0065 GETMBR R7 R0 K22 + 0x8C200907, // 0066 GETMET R8 R4 K7 + 0x5828000F, // 0067 LDCONST R10 K15 + 0x582C000A, // 0068 LDCONST R11 K10 + 0x7C200600, // 0069 CALL R8 3 + 0x8C240907, // 006A GETMET R9 R4 K7 + 0x582C0010, // 006B LDCONST R11 K16 + 0x5830000A, // 006C LDCONST R12 K10 + 0x7C240600, // 006D CALL R9 3 + 0x8C280907, // 006E GETMET R10 R4 K7 + 0x58300013, // 006F LDCONST R12 K19 + 0x5834000A, // 0070 LDCONST R13 K10 + 0x7C280600, // 0071 CALL R10 3 + 0x7C140A00, // 0072 CALL R5 5 + 0x70020012, // 0073 JMP #0087 + 0xB8160600, // 0074 GETNGBL R5 K3 + 0x8C140B0C, // 0075 GETMET R5 R5 K12 + 0x8C1C070D, // 0076 GETMET R7 R3 K13 + 0x58240014, // 0077 LDCONST R9 K20 + 0x88280105, // 0078 GETMBR R10 R0 K5 + 0x8C2C0907, // 0079 GETMET R11 R4 K7 + 0x58340010, // 007A LDCONST R13 K16 + 0x5838000A, // 007B LDCONST R14 K10 + 0x7C2C0600, // 007C CALL R11 3 + 0x7C1C0800, // 007D CALL R7 4 + 0x58200011, // 007E LDCONST R8 K17 + 0x7C140600, // 007F CALL R5 3 + 0x8C140512, // 0080 GETMET R5 R2 K18 + 0x881C0116, // 0081 GETMBR R7 R0 K22 + 0x8C200907, // 0082 GETMET R8 R4 K7 + 0x58280010, // 0083 LDCONST R10 K16 + 0x582C000A, // 0084 LDCONST R11 K10 + 0x7C200600, // 0085 CALL R8 3 + 0x7C140600, // 0086 CALL R5 3 + 0xB8120600, // 0087 GETNGBL R4 K3 + 0x8C10090C, // 0088 GETMET R4 R4 K12 + 0x8C18070D, // 0089 GETMET R6 R3 K13 + 0x58200017, // 008A LDCONST R8 K23 + 0x78060001, // 008B JMPF R1 #008E + 0x58240004, // 008C LDCONST R9 K4 + 0x70020000, // 008D JMP #008F + 0x58240015, // 008E LDCONST R9 K21 + 0x78060001, // 008F JMPF R1 #0092 + 0x88280105, // 0090 GETMBR R10 R0 K5 + 0x70020000, // 0091 JMP #0093 + 0x88280116, // 0092 GETMBR R10 R0 K22 + 0x7C180800, // 0093 CALL R6 4 + 0x581C0018, // 0094 LDCONST R7 K24 + 0x7C100600, // 0095 CALL R4 3 + 0xA8040001, // 0096 EXBLK 1 1 + 0x70020010, // 0097 JMP #00A9 + 0xAC100002, // 0098 CATCH R4 0 2 + 0x7002000D, // 0099 JMP #00A8 + 0xB81A0600, // 009A GETNGBL R6 K3 + 0x8C180D0C, // 009B GETMET R6 R6 K12 + 0x60200008, // 009C GETGBL R8 G8 + 0x5C240800, // 009D MOVE R9 R4 + 0x7C200200, // 009E CALL R8 1 + 0x00223208, // 009F ADD R8 K25 R8 + 0x0020111A, // 00A0 ADD R8 R8 K26 + 0x60240008, // 00A1 GETGBL R9 G8 + 0x5C280A00, // 00A2 MOVE R10 R5 + 0x7C240200, // 00A3 CALL R9 1 + 0x00201009, // 00A4 ADD R8 R8 R9 + 0x58240018, // 00A5 LDCONST R9 K24 + 0x7C180600, // 00A6 CALL R6 3 + 0x70020000, // 00A7 JMP #00A9 + 0xB0080000, // 00A8 RAISE 2 R0 R0 + 0x8C10011B, // 00A9 GETMET R4 R0 K27 + 0x7C100200, // 00AA CALL R4 1 + 0x80000000, // 00AB RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: mdns_remove_op_discovery_all_fabrics +********************************************************************/ +be_local_closure(Matter_Device_mdns_remove_op_discovery_all_fabrics, /* name */ + be_nested_proto( + 6, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 6]) { /* constants */ + /* K0 */ be_nested_str_weak(sessions), + /* K1 */ be_nested_str_weak(active_fabrics), + /* K2 */ be_nested_str_weak(get_device_id), + /* K3 */ be_nested_str_weak(get_fabric_id), + /* K4 */ be_nested_str_weak(mdns_remove_op_discovery), + /* K5 */ be_nested_str_weak(stop_iteration), + }), + be_str_weak(mdns_remove_op_discovery_all_fabrics), + &be_const_str_solidified, + ( &(const binstruction[22]) { /* code */ + 0x60040010, // 0000 GETGBL R1 G16 + 0x88080100, // 0001 GETMBR R2 R0 K0 + 0x8C080501, // 0002 GETMET R2 R2 K1 + 0x7C080200, // 0003 CALL R2 1 + 0x7C040200, // 0004 CALL R1 1 + 0xA802000B, // 0005 EXBLK 0 #0012 + 0x5C080200, // 0006 MOVE R2 R1 + 0x7C080000, // 0007 CALL R2 0 + 0x8C0C0502, // 0008 GETMET R3 R2 K2 + 0x7C0C0200, // 0009 CALL R3 1 + 0x780E0005, // 000A JMPF R3 #0011 + 0x8C0C0503, // 000B GETMET R3 R2 K3 + 0x7C0C0200, // 000C CALL R3 1 + 0x780E0002, // 000D JMPF R3 #0011 + 0x8C0C0104, // 000E GETMET R3 R0 K4 + 0x5C140400, // 000F MOVE R5 R2 + 0x7C0C0400, // 0010 CALL R3 2 + 0x7001FFF3, // 0011 JMP #0006 + 0x58040005, // 0012 LDCONST R1 K5 + 0xAC040200, // 0013 CATCH R1 1 0 + 0xB0080000, // 0014 RAISE 2 R0 R0 + 0x80000000, // 0015 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: event_fabrics_saved +********************************************************************/ +be_local_closure(Matter_Device_event_fabrics_saved, /* name */ be_nested_proto( 3, /* nstack */ 1, /* argc */ @@ -2454,23 +2023,66 @@ be_local_closure(Matter_Device__init_basic_commissioning, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ + ( &(const bvalue[ 5]) { /* constants */ + /* K0 */ be_nested_str_weak(sessions), + /* K1 */ be_nested_str_weak(count_active_fabrics), + /* K2 */ be_const_int(0), + /* K3 */ be_nested_str_weak(plugins_persist), + /* K4 */ be_nested_str_weak(save_param), + }), + be_str_weak(event_fabrics_saved), + &be_const_str_solidified, + ( &(const binstruction[12]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x8C040301, // 0001 GETMET R1 R1 K1 + 0x7C040200, // 0002 CALL R1 1 + 0x24040302, // 0003 GT R1 R1 K2 + 0x78060005, // 0004 JMPF R1 #000B + 0x88040103, // 0005 GETMBR R1 R0 K3 + 0x74060003, // 0006 JMPT R1 #000B + 0x50040200, // 0007 LDBOOL R1 1 0 + 0x90020601, // 0008 SETMBR R0 K3 R1 + 0x8C040104, // 0009 GETMET R1 R0 K4 + 0x7C040200, // 000A CALL R1 1 + 0x80000000, // 000B RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: stop +********************************************************************/ +be_local_closure(Matter_Device_stop, /* name */ + be_nested_proto( + 4, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ ( &(const bvalue[ 4]) { /* constants */ - /* K0 */ be_nested_str_weak(sessions), - /* K1 */ be_nested_str_weak(count_active_fabrics), - /* K2 */ be_const_int(0), - /* K3 */ be_nested_str_weak(start_root_basic_commissioning), + /* K0 */ be_nested_str_weak(tasmota), + /* K1 */ be_nested_str_weak(remove_driver), + /* K2 */ be_nested_str_weak(udp_server), + /* K3 */ be_nested_str_weak(stop), }), - be_str_weak(_init_basic_commissioning), + be_str_weak(stop), &be_const_str_solidified, - ( &(const binstruction[ 8]) { /* code */ - 0x88040100, // 0000 GETMBR R1 R0 K0 + ( &(const binstruction[10]) { /* code */ + 0xB8060000, // 0000 GETNGBL R1 K0 0x8C040301, // 0001 GETMET R1 R1 K1 - 0x7C040200, // 0002 CALL R1 1 - 0x1C040302, // 0003 EQ R1 R1 K2 - 0x78060001, // 0004 JMPF R1 #0007 - 0x8C040103, // 0005 GETMET R1 R0 K3 - 0x7C040200, // 0006 CALL R1 1 - 0x80000000, // 0007 RET 0 + 0x5C0C0000, // 0002 MOVE R3 R0 + 0x7C040400, // 0003 CALL R1 2 + 0x88040102, // 0004 GETMBR R1 R0 K2 + 0x78060002, // 0005 JMPF R1 #0009 + 0x88040102, // 0006 GETMBR R1 R0 K2 + 0x8C040303, // 0007 GETMET R1 R1 K3 + 0x7C040200, // 0008 CALL R1 1 + 0x80000000, // 0009 RET 0 }) ) ); @@ -2478,11 +2090,11 @@ be_local_closure(Matter_Device__init_basic_commissioning, /* name */ /******************************************************************** -** Solidified function: save_before_restart +** Solidified function: stop_basic_commissioning ********************************************************************/ -be_local_closure(Matter_Device_save_before_restart, /* name */ +be_local_closure(Matter_Device_stop_basic_commissioning, /* name */ be_nested_proto( - 3, /* nstack */ + 5, /* nstack */ 1, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -2490,68 +2102,49 @@ be_local_closure(Matter_Device_save_before_restart, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[ 2]) { /* constants */ - /* K0 */ be_nested_str_weak(stop_basic_commissioning), - /* K1 */ be_nested_str_weak(mdns_remove_op_discovery_all_fabrics), + ( &(const bvalue[13]) { /* constants */ + /* K0 */ be_nested_str_weak(is_root_commissioning_open), + /* K1 */ be_nested_str_weak(tasmota), + /* K2 */ be_nested_str_weak(publish_result), + /* K3 */ be_nested_str_weak(_X7B_X22Matter_X22_X3A_X7B_X22Commissioning_X22_X3A0_X7D_X7D), + /* K4 */ be_nested_str_weak(Matter), + /* K5 */ be_nested_str_weak(commissioning_open), + /* K6 */ be_nested_str_weak(mdns_remove_PASE), + /* K7 */ be_nested_str_weak(commissioning_iterations), + /* K8 */ be_nested_str_weak(commissioning_discriminator), + /* K9 */ be_nested_str_weak(commissioning_salt), + /* K10 */ be_nested_str_weak(commissioning_w0), + /* K11 */ be_nested_str_weak(commissioning_L), + /* K12 */ be_nested_str_weak(commissioning_admin_fabric), }), - be_str_weak(save_before_restart), + be_str_weak(stop_basic_commissioning), &be_const_str_solidified, - ( &(const binstruction[ 5]) { /* code */ + ( &(const binstruction[25]) { /* code */ 0x8C040100, // 0000 GETMET R1 R0 K0 0x7C040200, // 0001 CALL R1 1 - 0x8C040101, // 0002 GETMET R1 R0 K1 - 0x7C040200, // 0003 CALL R1 1 - 0x80000000, // 0004 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: start_operational_discovery -********************************************************************/ -be_local_closure(Matter_Device_start_operational_discovery, /* name */ - be_nested_proto( - 9, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 9]) { /* constants */ - /* K0 */ be_nested_str_weak(crypto), - /* K1 */ be_nested_str_weak(mdns), - /* K2 */ be_nested_str_weak(string), - /* K3 */ be_nested_str_weak(stop_basic_commissioning), - /* K4 */ be_nested_str_weak(root_w0), - /* K5 */ be_nested_str_weak(root_L), - /* K6 */ be_nested_str_weak(set_expire_in_seconds), - /* K7 */ be_nested_str_weak(mdns_announce_op_discovery), - /* K8 */ be_nested_str_weak(get_fabric), - }), - be_str_weak(start_operational_discovery), - &be_const_str_solidified, - ( &(const binstruction[17]) { /* code */ - 0xA40A0000, // 0000 IMPORT R2 K0 - 0xA40E0200, // 0001 IMPORT R3 K1 - 0xA4120400, // 0002 IMPORT R4 K2 - 0x8C140103, // 0003 GETMET R5 R0 K3 - 0x7C140200, // 0004 CALL R5 1 - 0x4C140000, // 0005 LDNIL R5 - 0x90020805, // 0006 SETMBR R0 K4 R5 - 0x4C140000, // 0007 LDNIL R5 - 0x90020A05, // 0008 SETMBR R0 K5 R5 - 0x8C140306, // 0009 GETMET R5 R1 K6 - 0x541E003B, // 000A LDINT R7 60 - 0x7C140400, // 000B CALL R5 2 - 0x8C140107, // 000C GETMET R5 R0 K7 - 0x8C1C0308, // 000D GETMET R7 R1 K8 - 0x7C1C0200, // 000E CALL R7 1 - 0x7C140400, // 000F CALL R5 2 - 0x80000000, // 0010 RET 0 + 0x78060004, // 0002 JMPF R1 #0008 + 0xB8060200, // 0003 GETNGBL R1 K1 + 0x8C040302, // 0004 GETMET R1 R1 K2 + 0x580C0003, // 0005 LDCONST R3 K3 + 0x58100004, // 0006 LDCONST R4 K4 + 0x7C040600, // 0007 CALL R1 3 + 0x4C040000, // 0008 LDNIL R1 + 0x90020A01, // 0009 SETMBR R0 K5 R1 + 0x8C040106, // 000A GETMET R1 R0 K6 + 0x7C040200, // 000B CALL R1 1 + 0x4C040000, // 000C LDNIL R1 + 0x90020E01, // 000D SETMBR R0 K7 R1 + 0x4C040000, // 000E LDNIL R1 + 0x90021001, // 000F SETMBR R0 K8 R1 + 0x4C040000, // 0010 LDNIL R1 + 0x90021201, // 0011 SETMBR R0 K9 R1 + 0x4C040000, // 0012 LDNIL R1 + 0x90021401, // 0013 SETMBR R0 K10 R1 + 0x4C040000, // 0014 LDNIL R1 + 0x90021601, // 0015 SETMBR R0 K11 R1 + 0x4C040000, // 0016 LDNIL R1 + 0x90021801, // 0017 SETMBR R0 K12 R1 + 0x80000000, // 0018 RET 0 }) ) ); @@ -2702,12 +2295,12 @@ be_local_closure(Matter_Device_start_basic_commissioning, /* name */ /******************************************************************** -** Solidified function: msg_received +** Solidified function: msg_send ********************************************************************/ -be_local_closure(Matter_Device_msg_received, /* name */ +be_local_closure(Matter_Device_msg_send, /* name */ be_nested_proto( - 9, /* nstack */ - 4, /* argc */ + 5, /* nstack */ + 2, /* argc */ 2, /* varg */ 0, /* has upvals */ NULL, /* no upvals */ @@ -2715,19 +2308,17 @@ be_local_closure(Matter_Device_msg_received, /* name */ NULL, /* no sub protos */ 1, /* has constants */ ( &(const bvalue[ 2]) { /* constants */ - /* K0 */ be_nested_str_weak(message_handler), - /* K1 */ be_nested_str_weak(msg_received), + /* K0 */ be_nested_str_weak(udp_server), + /* K1 */ be_nested_str_weak(send_UDP), }), - be_str_weak(msg_received), + be_str_weak(msg_send), &be_const_str_solidified, - ( &(const binstruction[ 7]) { /* code */ - 0x88100100, // 0000 GETMBR R4 R0 K0 - 0x8C100901, // 0001 GETMET R4 R4 K1 - 0x5C180200, // 0002 MOVE R6 R1 - 0x5C1C0400, // 0003 MOVE R7 R2 - 0x5C200600, // 0004 MOVE R8 R3 - 0x7C100800, // 0005 CALL R4 4 - 0x80040800, // 0006 RET 1 R4 + ( &(const binstruction[ 5]) { /* code */ + 0x88080100, // 0000 GETMBR R2 R0 K0 + 0x8C080501, // 0001 GETMET R2 R2 K1 + 0x5C100200, // 0002 MOVE R4 R1 + 0x7C080400, // 0003 CALL R2 2 + 0x80040400, // 0004 RET 1 R2 }) ) ); @@ -2735,9 +2326,9 @@ be_local_closure(Matter_Device_msg_received, /* name */ /******************************************************************** -** Solidified function: _start_udp +** Solidified function: start_commissioning_complete_deferred ********************************************************************/ -be_local_closure(Matter_Device__start_udp, /* name */ +be_local_closure(Matter_Device_start_commissioning_complete_deferred, /* name */ be_nested_proto( 6, /* nstack */ 2, /* argc */ @@ -2747,74 +2338,47 @@ be_local_closure(Matter_Device__start_udp, /* name */ 1, /* has sup protos */ ( &(const struct bproto*[ 1]) { be_nested_proto( - 8, /* nstack */ - 3, /* argc */ + 3, /* nstack */ + 0, /* argc */ 0, /* varg */ 1, /* has upvals */ - ( &(const bupvaldesc[ 1]) { /* upvals */ + ( &(const bupvaldesc[ 2]) { /* upvals */ be_local_const_upval(1, 0), + be_local_const_upval(1, 1), }), 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ ( &(const bvalue[ 1]) { /* constants */ - /* K0 */ be_nested_str_weak(msg_received), + /* K0 */ be_nested_str_weak(start_commissioning_complete), }), be_str_weak(_X3Clambda_X3E), &be_const_str_solidified, - ( &(const binstruction[ 7]) { /* code */ - 0x680C0000, // 0000 GETUPV R3 U0 - 0x8C0C0700, // 0001 GETMET R3 R3 K0 - 0x5C140000, // 0002 MOVE R5 R0 - 0x5C180200, // 0003 MOVE R6 R1 - 0x5C1C0400, // 0004 MOVE R7 R2 - 0x7C0C0800, // 0005 CALL R3 4 - 0x80040600, // 0006 RET 1 R3 + ( &(const binstruction[ 5]) { /* code */ + 0x68000000, // 0000 GETUPV R0 U0 + 0x8C000100, // 0001 GETMET R0 R0 K0 + 0x68080001, // 0002 GETUPV R2 U1 + 0x7C000400, // 0003 CALL R0 2 + 0x80040000, // 0004 RET 1 R0 }) ), }), 1, /* has constants */ - ( &(const bvalue[ 9]) { /* constants */ - /* K0 */ be_nested_str_weak(udp_server), - /* K1 */ be_nested_str_weak(tasmota), - /* K2 */ be_nested_str_weak(log), - /* K3 */ be_nested_str_weak(MTR_X3A_X20starting_X20UDP_X20server_X20on_X20port_X3A_X20), - /* K4 */ be_const_int(2), - /* K5 */ be_nested_str_weak(matter), - /* K6 */ be_nested_str_weak(UDPServer), - /* K7 */ be_nested_str_weak(), - /* K8 */ be_nested_str_weak(start), + ( &(const bvalue[ 3]) { /* constants */ + /* K0 */ be_nested_str_weak(tasmota), + /* K1 */ be_nested_str_weak(set_timer), + /* K2 */ be_const_int(0), }), - be_str_weak(_start_udp), + be_str_weak(start_commissioning_complete_deferred), &be_const_str_solidified, - ( &(const binstruction[27]) { /* code */ - 0x88080100, // 0000 GETMBR R2 R0 K0 - 0x780A0000, // 0001 JMPF R2 #0003 - 0x80000400, // 0002 RET 0 - 0x4C080000, // 0003 LDNIL R2 - 0x1C080202, // 0004 EQ R2 R1 R2 - 0x780A0000, // 0005 JMPF R2 #0007 - 0x540615A3, // 0006 LDINT R1 5540 - 0xB80A0200, // 0007 GETNGBL R2 K1 - 0x8C080502, // 0008 GETMET R2 R2 K2 - 0x60100008, // 0009 GETGBL R4 G8 - 0x5C140200, // 000A MOVE R5 R1 - 0x7C100200, // 000B CALL R4 1 - 0x00120604, // 000C ADD R4 K3 R4 - 0x58140004, // 000D LDCONST R5 K4 - 0x7C080600, // 000E CALL R2 3 - 0xB80A0A00, // 000F GETNGBL R2 K5 - 0x8C080506, // 0010 GETMET R2 R2 K6 - 0x58100007, // 0011 LDCONST R4 K7 - 0x5C140200, // 0012 MOVE R5 R1 - 0x7C080600, // 0013 CALL R2 3 - 0x90020002, // 0014 SETMBR R0 K0 R2 - 0x88080100, // 0015 GETMBR R2 R0 K0 - 0x8C080508, // 0016 GETMET R2 R2 K8 - 0x84100000, // 0017 CLOSURE R4 P0 - 0x7C080400, // 0018 CALL R2 2 - 0xA0000000, // 0019 CLOSE R0 - 0x80000000, // 001A RET 0 + ( &(const binstruction[ 7]) { /* code */ + 0xB80A0000, // 0000 GETNGBL R2 K0 + 0x8C080501, // 0001 GETMET R2 R2 K1 + 0x58100002, // 0002 LDCONST R4 K2 + 0x84140000, // 0003 CLOSURE R5 P0 + 0x7C080600, // 0004 CALL R2 3 + 0xA0000000, // 0005 CLOSE R0 + 0x80000000, // 0006 RET 0 }) ) ); @@ -2822,140 +2386,11 @@ be_local_closure(Matter_Device__start_udp, /* name */ /******************************************************************** -** Solidified function: mdns_remove_op_discovery +** Solidified function: is_root_commissioning_open ********************************************************************/ -be_local_closure(Matter_Device_mdns_remove_op_discovery, /* name */ +be_local_closure(Matter_Device_is_root_commissioning_open, /* name */ be_nested_proto( - 14, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[24]) { /* constants */ - /* K0 */ be_nested_str_weak(mdns), - /* K1 */ be_nested_str_weak(string), - /* K2 */ be_nested_str_weak(get_device_id), - /* K3 */ be_nested_str_weak(copy), - /* K4 */ be_nested_str_weak(reverse), - /* K5 */ be_nested_str_weak(get_fabric_compressed), - /* K6 */ be_nested_str_weak(tohex), - /* K7 */ be_nested_str_weak(_X2D), - /* K8 */ be_nested_str_weak(tasmota), - /* K9 */ be_nested_str_weak(eth), - /* K10 */ be_nested_str_weak(find), - /* K11 */ be_nested_str_weak(up), - /* K12 */ be_nested_str_weak(log), - /* K13 */ be_nested_str_weak(format), - /* K14 */ be_nested_str_weak(MTR_X3A_X20remove_X20mDNS_X20on_X20_X25s_X20_X27_X25s_X27), - /* K15 */ be_const_int(2), - /* K16 */ be_nested_str_weak(remove_service), - /* K17 */ be_nested_str_weak(_matter), - /* K18 */ be_nested_str_weak(_tcp), - /* K19 */ be_nested_str_weak(hostname_eth), - /* K20 */ be_nested_str_weak(wifi), - /* K21 */ be_nested_str_weak(hostname_wifi), - /* K22 */ be_nested_str_weak(MTR_X3A_X20Exception), - /* K23 */ be_nested_str_weak(_X7C), - }), - be_str_weak(mdns_remove_op_discovery), - &be_const_str_solidified, - ( &(const binstruction[81]) { /* code */ - 0xA40A0000, // 0000 IMPORT R2 K0 - 0xA40E0200, // 0001 IMPORT R3 K1 - 0xA802003B, // 0002 EXBLK 0 #003F - 0x8C100302, // 0003 GETMET R4 R1 K2 - 0x7C100200, // 0004 CALL R4 1 - 0x8C100903, // 0005 GETMET R4 R4 K3 - 0x7C100200, // 0006 CALL R4 1 - 0x8C100904, // 0007 GETMET R4 R4 K4 - 0x7C100200, // 0008 CALL R4 1 - 0x8C140305, // 0009 GETMET R5 R1 K5 - 0x7C140200, // 000A CALL R5 1 - 0x8C180B06, // 000B GETMET R6 R5 K6 - 0x7C180200, // 000C CALL R6 1 - 0x00180D07, // 000D ADD R6 R6 K7 - 0x8C1C0906, // 000E GETMET R7 R4 K6 - 0x7C1C0200, // 000F CALL R7 1 - 0x00180C07, // 0010 ADD R6 R6 R7 - 0xB81E1000, // 0011 GETNGBL R7 K8 - 0x8C1C0F09, // 0012 GETMET R7 R7 K9 - 0x7C1C0200, // 0013 CALL R7 1 - 0x8C1C0F0A, // 0014 GETMET R7 R7 K10 - 0x5824000B, // 0015 LDCONST R9 K11 - 0x7C1C0400, // 0016 CALL R7 2 - 0x781E000E, // 0017 JMPF R7 #0027 - 0xB81E1000, // 0018 GETNGBL R7 K8 - 0x8C1C0F0C, // 0019 GETMET R7 R7 K12 - 0x8C24070D, // 001A GETMET R9 R3 K13 - 0x582C000E, // 001B LDCONST R11 K14 - 0x58300009, // 001C LDCONST R12 K9 - 0x5C340C00, // 001D MOVE R13 R6 - 0x7C240800, // 001E CALL R9 4 - 0x5828000F, // 001F LDCONST R10 K15 - 0x7C1C0600, // 0020 CALL R7 3 - 0x8C1C0510, // 0021 GETMET R7 R2 K16 - 0x58240011, // 0022 LDCONST R9 K17 - 0x58280012, // 0023 LDCONST R10 K18 - 0x5C2C0C00, // 0024 MOVE R11 R6 - 0x88300113, // 0025 GETMBR R12 R0 K19 - 0x7C1C0A00, // 0026 CALL R7 5 - 0xB81E1000, // 0027 GETNGBL R7 K8 - 0x8C1C0F14, // 0028 GETMET R7 R7 K20 - 0x7C1C0200, // 0029 CALL R7 1 - 0x8C1C0F0A, // 002A GETMET R7 R7 K10 - 0x5824000B, // 002B LDCONST R9 K11 - 0x7C1C0400, // 002C CALL R7 2 - 0x781E000E, // 002D JMPF R7 #003D - 0xB81E1000, // 002E GETNGBL R7 K8 - 0x8C1C0F0C, // 002F GETMET R7 R7 K12 - 0x8C24070D, // 0030 GETMET R9 R3 K13 - 0x582C000E, // 0031 LDCONST R11 K14 - 0x58300014, // 0032 LDCONST R12 K20 - 0x5C340C00, // 0033 MOVE R13 R6 - 0x7C240800, // 0034 CALL R9 4 - 0x5828000F, // 0035 LDCONST R10 K15 - 0x7C1C0600, // 0036 CALL R7 3 - 0x8C1C0510, // 0037 GETMET R7 R2 K16 - 0x58240011, // 0038 LDCONST R9 K17 - 0x58280012, // 0039 LDCONST R10 K18 - 0x5C2C0C00, // 003A MOVE R11 R6 - 0x88300115, // 003B GETMBR R12 R0 K21 - 0x7C1C0A00, // 003C CALL R7 5 - 0xA8040001, // 003D EXBLK 1 1 - 0x70020010, // 003E JMP #0050 - 0xAC100002, // 003F CATCH R4 0 2 - 0x7002000D, // 0040 JMP #004F - 0xB81A1000, // 0041 GETNGBL R6 K8 - 0x8C180D0C, // 0042 GETMET R6 R6 K12 - 0x60200008, // 0043 GETGBL R8 G8 - 0x5C240800, // 0044 MOVE R9 R4 - 0x7C200200, // 0045 CALL R8 1 - 0x00222C08, // 0046 ADD R8 K22 R8 - 0x00201117, // 0047 ADD R8 R8 K23 - 0x60240008, // 0048 GETGBL R9 G8 - 0x5C280A00, // 0049 MOVE R10 R5 - 0x7C240200, // 004A CALL R9 1 - 0x00201009, // 004B ADD R8 R8 R9 - 0x5824000F, // 004C LDCONST R9 K15 - 0x7C180600, // 004D CALL R6 3 - 0x70020000, // 004E JMP #0050 - 0xB0080000, // 004F RAISE 2 R0 R0 - 0x80000000, // 0050 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: load_param -********************************************************************/ -be_local_closure(Matter_Device_load_param, /* name */ - be_nested_proto( - 12, /* nstack */ + 3, /* nstack */ 1, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -2963,126 +2398,24 @@ be_local_closure(Matter_Device_load_param, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[27]) { /* constants */ - /* K0 */ be_nested_str_weak(string), - /* K1 */ be_nested_str_weak(crypto), - /* K2 */ be_nested_str_weak(FILENAME), - /* K3 */ be_nested_str_weak(read), - /* K4 */ be_nested_str_weak(close), - /* K5 */ be_nested_str_weak(json), - /* K6 */ be_nested_str_weak(load), - /* K7 */ be_nested_str_weak(root_discriminator), - /* K8 */ be_nested_str_weak(find), - /* K9 */ be_nested_str_weak(distinguish), - /* K10 */ be_nested_str_weak(root_passcode), - /* K11 */ be_nested_str_weak(passcode), - /* K12 */ be_nested_str_weak(ipv4only), - /* K13 */ be_nested_str_weak(config), - /* K14 */ be_nested_str_weak(_load_plugins_config), - /* K15 */ be_nested_str_weak(plugins_persist), - /* K16 */ be_nested_str_weak(io_error), - /* K17 */ be_nested_str_weak(tasmota), - /* K18 */ be_nested_str_weak(log), - /* K19 */ be_nested_str_weak(MTR_X3A_X20Session_Store_X3A_X3Aload_X20Exception_X3A), - /* K20 */ be_nested_str_weak(_X7C), - /* K21 */ be_const_int(2), - /* K22 */ be_nested_str_weak(random), - /* K23 */ be_nested_str_weak(get), - /* K24 */ be_const_int(0), - /* K25 */ be_nested_str_weak(PASSCODE_DEFAULT), - /* K26 */ be_nested_str_weak(save_param), + ( &(const bvalue[ 2]) { /* constants */ + /* K0 */ be_nested_str_weak(commissioning_open), + /* K1 */ be_nested_str_weak(commissioning_admin_fabric), }), - be_str_weak(load_param), + be_str_weak(is_root_commissioning_open), &be_const_str_solidified, - ( &(const binstruction[88]) { /* code */ - 0xA4060000, // 0000 IMPORT R1 K0 - 0xA40A0200, // 0001 IMPORT R2 K1 - 0xA8020026, // 0002 EXBLK 0 #002A - 0x600C0011, // 0003 GETGBL R3 G17 - 0x88100102, // 0004 GETMBR R4 R0 K2 - 0x7C0C0200, // 0005 CALL R3 1 - 0x8C100703, // 0006 GETMET R4 R3 K3 - 0x7C100200, // 0007 CALL R4 1 - 0x8C140704, // 0008 GETMET R5 R3 K4 - 0x7C140200, // 0009 CALL R5 1 - 0xA4160A00, // 000A IMPORT R5 K5 - 0x8C180B06, // 000B GETMET R6 R5 K6 - 0x5C200800, // 000C MOVE R8 R4 - 0x7C180400, // 000D CALL R6 2 - 0x8C1C0D08, // 000E GETMET R7 R6 K8 - 0x58240009, // 000F LDCONST R9 K9 - 0x88280107, // 0010 GETMBR R10 R0 K7 - 0x7C1C0600, // 0011 CALL R7 3 - 0x90020E07, // 0012 SETMBR R0 K7 R7 - 0x8C1C0D08, // 0013 GETMET R7 R6 K8 - 0x5824000B, // 0014 LDCONST R9 K11 - 0x8828010A, // 0015 GETMBR R10 R0 K10 - 0x7C1C0600, // 0016 CALL R7 3 - 0x90021407, // 0017 SETMBR R0 K10 R7 - 0x601C0017, // 0018 GETGBL R7 G23 - 0x8C200D08, // 0019 GETMET R8 R6 K8 - 0x5828000C, // 001A LDCONST R10 K12 - 0x502C0000, // 001B LDBOOL R11 0 0 - 0x7C200600, // 001C CALL R8 3 - 0x7C1C0200, // 001D CALL R7 1 - 0x90021807, // 001E SETMBR R0 K12 R7 - 0x8C1C0D08, // 001F GETMET R7 R6 K8 - 0x5824000D, // 0020 LDCONST R9 K13 - 0x7C1C0400, // 0021 CALL R7 2 - 0x781E0004, // 0022 JMPF R7 #0028 - 0x8C20010E, // 0023 GETMET R8 R0 K14 - 0x5C280E00, // 0024 MOVE R10 R7 - 0x7C200400, // 0025 CALL R8 2 - 0x50200200, // 0026 LDBOOL R8 1 0 - 0x90021E08, // 0027 SETMBR R0 K15 R8 - 0xA8040001, // 0028 EXBLK 1 1 - 0x70020012, // 0029 JMP #003D - 0xAC0C0002, // 002A CATCH R3 0 2 - 0x7002000F, // 002B JMP #003C - 0x20140710, // 002C NE R5 R3 K16 - 0x7816000C, // 002D JMPF R5 #003B - 0xB8162200, // 002E GETNGBL R5 K17 - 0x8C140B12, // 002F GETMET R5 R5 K18 - 0x601C0008, // 0030 GETGBL R7 G8 - 0x5C200600, // 0031 MOVE R8 R3 - 0x7C1C0200, // 0032 CALL R7 1 - 0x001E2607, // 0033 ADD R7 K19 R7 - 0x001C0F14, // 0034 ADD R7 R7 K20 - 0x60200008, // 0035 GETGBL R8 G8 - 0x5C240800, // 0036 MOVE R9 R4 - 0x7C200200, // 0037 CALL R8 1 - 0x001C0E08, // 0038 ADD R7 R7 R8 - 0x58200015, // 0039 LDCONST R8 K21 - 0x7C140600, // 003A CALL R5 3 - 0x70020000, // 003B JMP #003D - 0xB0080000, // 003C RAISE 2 R0 R0 - 0x500C0000, // 003D LDBOOL R3 0 0 - 0x88100107, // 003E GETMBR R4 R0 K7 - 0x4C140000, // 003F LDNIL R5 - 0x1C100805, // 0040 EQ R4 R4 R5 - 0x7812000A, // 0041 JMPF R4 #004D - 0x8C100516, // 0042 GETMET R4 R2 K22 - 0x58180015, // 0043 LDCONST R6 K21 - 0x7C100400, // 0044 CALL R4 2 - 0x8C100917, // 0045 GETMET R4 R4 K23 - 0x58180018, // 0046 LDCONST R6 K24 - 0x581C0015, // 0047 LDCONST R7 K21 - 0x7C100600, // 0048 CALL R4 3 - 0x54160FFE, // 0049 LDINT R5 4095 - 0x2C100805, // 004A AND R4 R4 R5 - 0x90020E04, // 004B SETMBR R0 K7 R4 - 0x500C0200, // 004C LDBOOL R3 1 0 - 0x8810010A, // 004D GETMBR R4 R0 K10 - 0x4C140000, // 004E LDNIL R5 - 0x1C100805, // 004F EQ R4 R4 R5 - 0x78120002, // 0050 JMPF R4 #0054 - 0x88100119, // 0051 GETMBR R4 R0 K25 - 0x90021404, // 0052 SETMBR R0 K10 R4 - 0x500C0200, // 0053 LDBOOL R3 1 0 - 0x780E0001, // 0054 JMPF R3 #0057 - 0x8C10011A, // 0055 GETMET R4 R0 K26 - 0x7C100200, // 0056 CALL R4 1 - 0x80000000, // 0057 RET 0 + ( &(const binstruction[11]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x4C080000, // 0001 LDNIL R2 + 0x20040202, // 0002 NE R1 R1 R2 + 0x78060003, // 0003 JMPF R1 #0008 + 0x88040101, // 0004 GETMBR R1 R0 K1 + 0x4C080000, // 0005 LDNIL R2 + 0x1C040202, // 0006 EQ R1 R1 R2 + 0x74060000, // 0007 JMPT R1 #0009 + 0x50040001, // 0008 LDBOOL R1 0 1 + 0x50040200, // 0009 LDBOOL R1 1 0 + 0x80040200, // 000A RET 1 R1 }) ) ); @@ -3273,6 +2606,78 @@ be_local_closure(Matter_Device__load_plugins_config, /* name */ /*******************************************************************/ +/******************************************************************** +** Solidified function: received_ack +********************************************************************/ +be_local_closure(Matter_Device_received_ack, /* name */ + be_nested_proto( + 5, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 2]) { /* constants */ + /* K0 */ be_nested_str_weak(udp_server), + /* K1 */ be_nested_str_weak(received_ack), + }), + be_str_weak(received_ack), + &be_const_str_solidified, + ( &(const binstruction[ 5]) { /* code */ + 0x88080100, // 0000 GETMBR R2 R0 K0 + 0x8C080501, // 0001 GETMET R2 R2 K1 + 0x5C100200, // 0002 MOVE R4 R1 + 0x7C080400, // 0003 CALL R2 2 + 0x80040400, // 0004 RET 1 R2 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: MtrJoin +********************************************************************/ +be_local_closure(Matter_Device_MtrJoin, /* name */ + be_nested_proto( + 8, /* nstack */ + 5, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 4]) { /* constants */ + /* K0 */ be_nested_str_weak(start_root_basic_commissioning), + /* K1 */ be_nested_str_weak(stop_basic_commissioning), + /* K2 */ be_nested_str_weak(tasmota), + /* K3 */ be_nested_str_weak(resp_cmnd_done), + }), + be_str_weak(MtrJoin), + &be_const_str_solidified, + ( &(const binstruction[13]) { /* code */ + 0x60140009, // 0000 GETGBL R5 G9 + 0x5C180600, // 0001 MOVE R6 R3 + 0x7C140200, // 0002 CALL R5 1 + 0x78160002, // 0003 JMPF R5 #0007 + 0x8C180100, // 0004 GETMET R6 R0 K0 + 0x7C180200, // 0005 CALL R6 1 + 0x70020001, // 0006 JMP #0009 + 0x8C180101, // 0007 GETMET R6 R0 K1 + 0x7C180200, // 0008 CALL R6 1 + 0xB81A0400, // 0009 GETNGBL R6 K2 + 0x8C180D03, // 000A GETMET R6 R6 K3 + 0x7C180200, // 000B CALL R6 1 + 0x80000000, // 000C RET 0 + }) + ) +); +/*******************************************************************/ + + /******************************************************************** ** Solidified function: autoconf_device_map ********************************************************************/ @@ -3648,11 +3053,11 @@ be_local_closure(Matter_Device_remove_fabric, /* name */ /******************************************************************** -** Solidified function: every_second +** Solidified function: _init_basic_commissioning ********************************************************************/ -be_local_closure(Matter_Device_every_second, /* name */ +be_local_closure(Matter_Device__init_basic_commissioning, /* name */ be_nested_proto( - 4, /* nstack */ + 3, /* nstack */ 1, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -3660,50 +3065,23 @@ be_local_closure(Matter_Device_every_second, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[ 9]) { /* constants */ + ( &(const bvalue[ 4]) { /* constants */ /* K0 */ be_nested_str_weak(sessions), - /* K1 */ be_nested_str_weak(every_second), - /* K2 */ be_nested_str_weak(message_handler), - /* K3 */ be_nested_str_weak(commissioning_open), - /* K4 */ be_nested_str_weak(tasmota), - /* K5 */ be_nested_str_weak(time_reached), - /* K6 */ be_const_int(0), - /* K7 */ be_nested_str_weak(plugins), - /* K8 */ be_const_int(1), + /* K1 */ be_nested_str_weak(count_active_fabrics), + /* K2 */ be_const_int(0), + /* K3 */ be_nested_str_weak(start_root_basic_commissioning), }), - be_str_weak(every_second), + be_str_weak(_init_basic_commissioning), &be_const_str_solidified, - ( &(const binstruction[30]) { /* code */ + ( &(const binstruction[ 8]) { /* code */ 0x88040100, // 0000 GETMBR R1 R0 K0 0x8C040301, // 0001 GETMET R1 R1 K1 0x7C040200, // 0002 CALL R1 1 - 0x88040102, // 0003 GETMBR R1 R0 K2 - 0x8C040301, // 0004 GETMET R1 R1 K1 - 0x7C040200, // 0005 CALL R1 1 - 0x88040103, // 0006 GETMBR R1 R0 K3 - 0x4C080000, // 0007 LDNIL R2 - 0x20040202, // 0008 NE R1 R1 R2 - 0x78060006, // 0009 JMPF R1 #0011 - 0xB8060800, // 000A GETNGBL R1 K4 - 0x8C040305, // 000B GETMET R1 R1 K5 - 0x880C0103, // 000C GETMBR R3 R0 K3 - 0x7C040400, // 000D CALL R1 2 - 0x78060001, // 000E JMPF R1 #0011 - 0x4C040000, // 000F LDNIL R1 - 0x90020601, // 0010 SETMBR R0 K3 R1 - 0x58040006, // 0011 LDCONST R1 K6 - 0x6008000C, // 0012 GETGBL R2 G12 - 0x880C0107, // 0013 GETMBR R3 R0 K7 - 0x7C080200, // 0014 CALL R2 1 - 0x14080202, // 0015 LT R2 R1 R2 - 0x780A0005, // 0016 JMPF R2 #001D - 0x88080107, // 0017 GETMBR R2 R0 K7 - 0x94080401, // 0018 GETIDX R2 R2 R1 - 0x8C080501, // 0019 GETMET R2 R2 K1 - 0x7C080200, // 001A CALL R2 1 - 0x00040308, // 001B ADD R1 R1 K8 - 0x7001FFF4, // 001C JMP #0012 - 0x80000000, // 001D RET 0 + 0x1C040302, // 0003 EQ R1 R1 K2 + 0x78060001, // 0004 JMPF R1 #0007 + 0x8C040103, // 0005 GETMET R1 R0 K3 + 0x7C040200, // 0006 CALL R1 1 + 0x80000000, // 0007 RET 0 }) ) ); @@ -3711,57 +3089,563 @@ be_local_closure(Matter_Device_every_second, /* name */ /******************************************************************** -** Solidified function: get_active_endpoints +** Solidified function: every_250ms ********************************************************************/ -be_local_closure(Matter_Device_get_active_endpoints, /* name */ +be_local_closure(Matter_Device_every_250ms, /* name */ be_nested_proto( - 9, /* nstack */ - 2, /* argc */ + 3, /* nstack */ + 1, /* argc */ 2, /* varg */ 0, /* has upvals */ NULL, /* no upvals */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[ 6]) { /* constants */ - /* K0 */ be_nested_str_weak(plugins), - /* K1 */ be_nested_str_weak(get_endpoint), - /* K2 */ be_const_int(0), - /* K3 */ be_nested_str_weak(find), - /* K4 */ be_nested_str_weak(push), - /* K5 */ be_nested_str_weak(stop_iteration), + ( &(const bvalue[ 2]) { /* constants */ + /* K0 */ be_nested_str_weak(message_handler), + /* K1 */ be_nested_str_weak(every_250ms), }), - be_str_weak(get_active_endpoints), + be_str_weak(every_250ms), &be_const_str_solidified, - ( &(const binstruction[28]) { /* code */ - 0x60080012, // 0000 GETGBL R2 G18 - 0x7C080000, // 0001 CALL R2 0 - 0x600C0010, // 0002 GETGBL R3 G16 - 0x88100100, // 0003 GETMBR R4 R0 K0 - 0x7C0C0200, // 0004 CALL R3 1 - 0xA8020011, // 0005 EXBLK 0 #0018 - 0x5C100600, // 0006 MOVE R4 R3 - 0x7C100000, // 0007 CALL R4 0 - 0x8C140901, // 0008 GETMET R5 R4 K1 - 0x7C140200, // 0009 CALL R5 1 - 0x78060002, // 000A JMPF R1 #000E - 0x1C180B02, // 000B EQ R6 R5 K2 - 0x781A0000, // 000C JMPF R6 #000E - 0x7001FFF7, // 000D JMP #0006 - 0x8C180503, // 000E GETMET R6 R2 K3 - 0x5C200A00, // 000F MOVE R8 R5 - 0x7C180400, // 0010 CALL R6 2 - 0x4C1C0000, // 0011 LDNIL R7 - 0x1C180C07, // 0012 EQ R6 R6 R7 - 0x781A0002, // 0013 JMPF R6 #0017 - 0x8C180504, // 0014 GETMET R6 R2 K4 - 0x5C200A00, // 0015 MOVE R8 R5 - 0x7C180400, // 0016 CALL R6 2 - 0x7001FFED, // 0017 JMP #0006 - 0x580C0005, // 0018 LDCONST R3 K5 - 0xAC0C0200, // 0019 CATCH R3 1 0 - 0xB0080000, // 001A RAISE 2 R0 R0 - 0x80040400, // 001B RET 1 R2 + ( &(const binstruction[ 4]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x8C040301, // 0001 GETMET R1 R1 K1 + 0x7C040200, // 0002 CALL R1 1 + 0x80000000, // 0003 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: process_attribute_expansion +********************************************************************/ +be_local_closure(Matter_Device_process_attribute_expansion, /* name */ + be_nested_proto( + 29, /* nstack */ + 3, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 1, /* has sup protos */ + ( &(const struct bproto*[ 1]) { + be_nested_proto( + 7, /* nstack */ + 1, /* argc */ + 0, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 5]) { /* constants */ + /* K0 */ be_nested_str_weak(keys), + /* K1 */ be_nested_str_weak(push), + /* K2 */ be_nested_str_weak(stop_iteration), + /* K3 */ be_const_int(1), + /* K4 */ be_const_int(0), + }), + be_str_weak(keys_sorted), + &be_const_str_solidified, + ( &(const binstruction[45]) { /* code */ + 0x60040012, // 0000 GETGBL R1 G18 + 0x7C040000, // 0001 CALL R1 0 + 0x60080010, // 0002 GETGBL R2 G16 + 0x8C0C0100, // 0003 GETMET R3 R0 K0 + 0x7C0C0200, // 0004 CALL R3 1 + 0x7C080200, // 0005 CALL R2 1 + 0xA8020005, // 0006 EXBLK 0 #000D + 0x5C0C0400, // 0007 MOVE R3 R2 + 0x7C0C0000, // 0008 CALL R3 0 + 0x8C100301, // 0009 GETMET R4 R1 K1 + 0x5C180600, // 000A MOVE R6 R3 + 0x7C100400, // 000B CALL R4 2 + 0x7001FFF9, // 000C JMP #0007 + 0x58080002, // 000D LDCONST R2 K2 + 0xAC080200, // 000E CATCH R2 1 0 + 0xB0080000, // 000F RAISE 2 R0 R0 + 0x60080010, // 0010 GETGBL R2 G16 + 0x600C000C, // 0011 GETGBL R3 G12 + 0x5C100200, // 0012 MOVE R4 R1 + 0x7C0C0200, // 0013 CALL R3 1 + 0x040C0703, // 0014 SUB R3 R3 K3 + 0x400E0603, // 0015 CONNECT R3 K3 R3 + 0x7C080200, // 0016 CALL R2 1 + 0xA8020010, // 0017 EXBLK 0 #0029 + 0x5C0C0400, // 0018 MOVE R3 R2 + 0x7C0C0000, // 0019 CALL R3 0 + 0x94100203, // 001A GETIDX R4 R1 R3 + 0x5C140600, // 001B MOVE R5 R3 + 0x24180B04, // 001C GT R6 R5 K4 + 0x781A0008, // 001D JMPF R6 #0027 + 0x04180B03, // 001E SUB R6 R5 K3 + 0x94180206, // 001F GETIDX R6 R1 R6 + 0x24180C04, // 0020 GT R6 R6 R4 + 0x781A0004, // 0021 JMPF R6 #0027 + 0x04180B03, // 0022 SUB R6 R5 K3 + 0x94180206, // 0023 GETIDX R6 R1 R6 + 0x98040A06, // 0024 SETIDX R1 R5 R6 + 0x04140B03, // 0025 SUB R5 R5 K3 + 0x7001FFF4, // 0026 JMP #001C + 0x98040A04, // 0027 SETIDX R1 R5 R4 + 0x7001FFEE, // 0028 JMP #0018 + 0x58080002, // 0029 LDCONST R2 K2 + 0xAC080200, // 002A CATCH R2 1 0 + 0xB0080000, // 002B RAISE 2 R0 R0 + 0x80040200, // 002C RET 1 R1 + }) + ), + }), + 1, /* has constants */ + ( &(const bvalue[22]) { /* constants */ + /* K0 */ be_nested_str_weak(string), + /* K1 */ be_nested_str_weak(endpoint), + /* K2 */ be_nested_str_weak(cluster), + /* K3 */ be_nested_str_weak(attribute), + /* K4 */ be_nested_str_weak(plugins), + /* K5 */ be_nested_str_weak(get_endpoint), + /* K6 */ be_nested_str_weak(contains), + /* K7 */ be_nested_str_weak(get_cluster_list), + /* K8 */ be_nested_str_weak(get_attribute_list), + /* K9 */ be_nested_str_weak(push), + /* K10 */ be_nested_str_weak(stop_iteration), + /* K11 */ be_nested_str_weak(tasmota), + /* K12 */ be_nested_str_weak(log), + /* K13 */ be_nested_str_weak(format), + /* K14 */ be_nested_str_weak(MTR_X3A_X20expansion_X20_X5B_X2502X_X5D_X2504X_X2F_X2504X), + /* K15 */ be_const_int(3), + /* K16 */ be_nested_str_weak(status), + /* K17 */ be_nested_str_weak(matter), + /* K18 */ be_nested_str_weak(UNSUPPORTED_ENDPOINT), + /* K19 */ be_nested_str_weak(UNSUPPORTED_CLUSTER), + /* K20 */ be_nested_str_weak(UNSUPPORTED_ATTRIBUTE), + /* K21 */ be_nested_str_weak(UNREPORTABLE_ATTRIBUTE), + }), + be_str_weak(process_attribute_expansion), + &be_const_str_solidified, + ( &(const binstruction[216]) { /* code */ + 0x840C0000, // 0000 CLOSURE R3 P0 + 0xA4120000, // 0001 IMPORT R4 K0 + 0x88140301, // 0002 GETMBR R5 R1 K1 + 0x50180000, // 0003 LDBOOL R6 0 0 + 0x881C0302, // 0004 GETMBR R7 R1 K2 + 0x50200000, // 0005 LDBOOL R8 0 0 + 0x88240303, // 0006 GETMBR R9 R1 K3 + 0x50280000, // 0007 LDBOOL R10 0 0 + 0x882C0301, // 0008 GETMBR R11 R1 K1 + 0x4C300000, // 0009 LDNIL R12 + 0x202C160C, // 000A NE R11 R11 R12 + 0x782E0007, // 000B JMPF R11 #0014 + 0x882C0302, // 000C GETMBR R11 R1 K2 + 0x4C300000, // 000D LDNIL R12 + 0x202C160C, // 000E NE R11 R11 R12 + 0x782E0003, // 000F JMPF R11 #0014 + 0x882C0303, // 0010 GETMBR R11 R1 K3 + 0x4C300000, // 0011 LDNIL R12 + 0x202C160C, // 0012 NE R11 R11 R12 + 0x742E0000, // 0013 JMPT R11 #0015 + 0x502C0001, // 0014 LDBOOL R11 0 1 + 0x502C0200, // 0015 LDBOOL R11 1 0 + 0x60300013, // 0016 GETGBL R12 G19 + 0x7C300000, // 0017 CALL R12 0 + 0x60340010, // 0018 GETGBL R13 G16 + 0x88380104, // 0019 GETMBR R14 R0 K4 + 0x7C340200, // 001A CALL R13 1 + 0xA8020055, // 001B EXBLK 0 #0072 + 0x5C381A00, // 001C MOVE R14 R13 + 0x7C380000, // 001D CALL R14 0 + 0x8C3C1D05, // 001E GETMET R15 R14 K5 + 0x7C3C0200, // 001F CALL R15 1 + 0x4C400000, // 0020 LDNIL R16 + 0x20400A10, // 0021 NE R16 R5 R16 + 0x78420002, // 0022 JMPF R16 #0026 + 0x20401E05, // 0023 NE R16 R15 R5 + 0x78420000, // 0024 JMPF R16 #0026 + 0x7001FFF5, // 0025 JMP #001C + 0x8C401906, // 0026 GETMET R16 R12 K6 + 0x5C481E00, // 0027 MOVE R18 R15 + 0x7C400400, // 0028 CALL R16 2 + 0x74420002, // 0029 JMPT R16 #002D + 0x60400013, // 002A GETGBL R16 G19 + 0x7C400000, // 002B CALL R16 0 + 0x98301E10, // 002C SETIDX R12 R15 R16 + 0x50180200, // 002D LDBOOL R6 1 0 + 0x8C401D07, // 002E GETMET R16 R14 K7 + 0x5C481E00, // 002F MOVE R18 R15 + 0x7C400400, // 0030 CALL R16 2 + 0x60440010, // 0031 GETGBL R17 G16 + 0x5C482000, // 0032 MOVE R18 R16 + 0x7C440200, // 0033 CALL R17 1 + 0xA8020038, // 0034 EXBLK 0 #006E + 0x5C482200, // 0035 MOVE R18 R17 + 0x7C480000, // 0036 CALL R18 0 + 0x4C4C0000, // 0037 LDNIL R19 + 0x204C0E13, // 0038 NE R19 R7 R19 + 0x784E0002, // 0039 JMPF R19 #003D + 0x204C2407, // 003A NE R19 R18 R7 + 0x784E0000, // 003B JMPF R19 #003D + 0x7001FFF7, // 003C JMP #0035 + 0x944C180F, // 003D GETIDX R19 R12 R15 + 0x8C4C2706, // 003E GETMET R19 R19 K6 + 0x5C542400, // 003F MOVE R21 R18 + 0x7C4C0400, // 0040 CALL R19 2 + 0x744E0003, // 0041 JMPT R19 #0046 + 0x944C180F, // 0042 GETIDX R19 R12 R15 + 0x60500013, // 0043 GETGBL R20 G19 + 0x7C500000, // 0044 CALL R20 0 + 0x984C2414, // 0045 SETIDX R19 R18 R20 + 0x50200200, // 0046 LDBOOL R8 1 0 + 0x8C4C1D08, // 0047 GETMET R19 R14 K8 + 0x5C541E00, // 0048 MOVE R21 R15 + 0x5C582400, // 0049 MOVE R22 R18 + 0x7C4C0600, // 004A CALL R19 3 + 0x60500010, // 004B GETGBL R20 G16 + 0x5C542600, // 004C MOVE R21 R19 + 0x7C500200, // 004D CALL R20 1 + 0xA802001A, // 004E EXBLK 0 #006A + 0x5C542800, // 004F MOVE R21 R20 + 0x7C540000, // 0050 CALL R21 0 + 0x4C580000, // 0051 LDNIL R22 + 0x20581216, // 0052 NE R22 R9 R22 + 0x785A0002, // 0053 JMPF R22 #0057 + 0x20582A09, // 0054 NE R22 R21 R9 + 0x785A0000, // 0055 JMPF R22 #0057 + 0x7001FFF7, // 0056 JMP #004F + 0x9458180F, // 0057 GETIDX R22 R12 R15 + 0x94582C12, // 0058 GETIDX R22 R22 R18 + 0x8C582D06, // 0059 GETMET R22 R22 K6 + 0x5C602A00, // 005A MOVE R24 R21 + 0x7C580400, // 005B CALL R22 2 + 0x745A0004, // 005C JMPT R22 #0062 + 0x9458180F, // 005D GETIDX R22 R12 R15 + 0x94582C12, // 005E GETIDX R22 R22 R18 + 0x605C0012, // 005F GETGBL R23 G18 + 0x7C5C0000, // 0060 CALL R23 0 + 0x98582A17, // 0061 SETIDX R22 R21 R23 + 0x50280200, // 0062 LDBOOL R10 1 0 + 0x9458180F, // 0063 GETIDX R22 R12 R15 + 0x94582C12, // 0064 GETIDX R22 R22 R18 + 0x94582C15, // 0065 GETIDX R22 R22 R21 + 0x8C582D09, // 0066 GETMET R22 R22 K9 + 0x5C601C00, // 0067 MOVE R24 R14 + 0x7C580400, // 0068 CALL R22 2 + 0x7001FFE4, // 0069 JMP #004F + 0x5850000A, // 006A LDCONST R20 K10 + 0xAC500200, // 006B CATCH R20 1 0 + 0xB0080000, // 006C RAISE 2 R0 R0 + 0x7001FFC6, // 006D JMP #0035 + 0x5844000A, // 006E LDCONST R17 K10 + 0xAC440200, // 006F CATCH R17 1 0 + 0xB0080000, // 0070 RAISE 2 R0 R0 + 0x7001FFA9, // 0071 JMP #001C + 0x5834000A, // 0072 LDCONST R13 K10 + 0xAC340200, // 0073 CATCH R13 1 0 + 0xB0080000, // 0074 RAISE 2 R0 R0 + 0x60340010, // 0075 GETGBL R13 G16 + 0x5C380600, // 0076 MOVE R14 R3 + 0x5C3C1800, // 0077 MOVE R15 R12 + 0x7C380200, // 0078 CALL R14 1 + 0x7C340200, // 0079 CALL R13 1 + 0xA802003D, // 007A EXBLK 0 #00B9 + 0x5C381A00, // 007B MOVE R14 R13 + 0x7C380000, // 007C CALL R14 0 + 0x603C0010, // 007D GETGBL R15 G16 + 0x5C400600, // 007E MOVE R16 R3 + 0x9444180E, // 007F GETIDX R17 R12 R14 + 0x7C400200, // 0080 CALL R16 1 + 0x7C3C0200, // 0081 CALL R15 1 + 0xA8020031, // 0082 EXBLK 0 #00B5 + 0x5C401E00, // 0083 MOVE R16 R15 + 0x7C400000, // 0084 CALL R16 0 + 0x60440010, // 0085 GETGBL R17 G16 + 0x5C480600, // 0086 MOVE R18 R3 + 0x944C180E, // 0087 GETIDX R19 R12 R14 + 0x944C2610, // 0088 GETIDX R19 R19 R16 + 0x7C480200, // 0089 CALL R18 1 + 0x7C440200, // 008A CALL R17 1 + 0xA8020024, // 008B EXBLK 0 #00B1 + 0x5C482200, // 008C MOVE R18 R17 + 0x7C480000, // 008D CALL R18 0 + 0x604C0010, // 008E GETGBL R19 G16 + 0x9450180E, // 008F GETIDX R20 R12 R14 + 0x94502810, // 0090 GETIDX R20 R20 R16 + 0x94502812, // 0091 GETIDX R20 R20 R18 + 0x7C4C0200, // 0092 CALL R19 1 + 0xA8020018, // 0093 EXBLK 0 #00AD + 0x5C502600, // 0094 MOVE R20 R19 + 0x7C500000, // 0095 CALL R20 0 + 0xB8561600, // 0096 GETNGBL R21 K11 + 0x8C542B0C, // 0097 GETMET R21 R21 K12 + 0x8C5C090D, // 0098 GETMET R23 R4 K13 + 0x5864000E, // 0099 LDCONST R25 K14 + 0x5C681C00, // 009A MOVE R26 R14 + 0x5C6C2000, // 009B MOVE R27 R16 + 0x5C702400, // 009C MOVE R28 R18 + 0x7C5C0A00, // 009D CALL R23 5 + 0x5860000F, // 009E LDCONST R24 K15 + 0x7C540600, // 009F CALL R21 3 + 0x9006020E, // 00A0 SETMBR R1 K1 R14 + 0x90060410, // 00A1 SETMBR R1 K2 R16 + 0x90060612, // 00A2 SETMBR R1 K3 R18 + 0x5C540400, // 00A3 MOVE R21 R2 + 0x5C582800, // 00A4 MOVE R22 R20 + 0x5C5C0200, // 00A5 MOVE R23 R1 + 0x5C601600, // 00A6 MOVE R24 R11 + 0x7C540600, // 00A7 CALL R21 3 + 0x782E0002, // 00A8 JMPF R11 #00AC + 0x78560001, // 00A9 JMPF R21 #00AC + 0xA8040004, // 00AA EXBLK 1 4 + 0x80002C00, // 00AB RET 0 + 0x7001FFE6, // 00AC JMP #0094 + 0x584C000A, // 00AD LDCONST R19 K10 + 0xAC4C0200, // 00AE CATCH R19 1 0 + 0xB0080000, // 00AF RAISE 2 R0 R0 + 0x7001FFDA, // 00B0 JMP #008C + 0x5844000A, // 00B1 LDCONST R17 K10 + 0xAC440200, // 00B2 CATCH R17 1 0 + 0xB0080000, // 00B3 RAISE 2 R0 R0 + 0x7001FFCD, // 00B4 JMP #0083 + 0x583C000A, // 00B5 LDCONST R15 K10 + 0xAC3C0200, // 00B6 CATCH R15 1 0 + 0xB0080000, // 00B7 RAISE 2 R0 R0 + 0x7001FFC1, // 00B8 JMP #007B + 0x5834000A, // 00B9 LDCONST R13 K10 + 0xAC340200, // 00BA CATCH R13 1 0 + 0xB0080000, // 00BB RAISE 2 R0 R0 + 0x782E0019, // 00BC JMPF R11 #00D7 + 0x5C340C00, // 00BD MOVE R13 R6 + 0x74360003, // 00BE JMPT R13 #00C3 + 0xB8362200, // 00BF GETNGBL R13 K17 + 0x88341B12, // 00C0 GETMBR R13 R13 K18 + 0x9006200D, // 00C1 SETMBR R1 K16 R13 + 0x7002000E, // 00C2 JMP #00D2 + 0x5C341000, // 00C3 MOVE R13 R8 + 0x74360003, // 00C4 JMPT R13 #00C9 + 0xB8362200, // 00C5 GETNGBL R13 K17 + 0x88341B13, // 00C6 GETMBR R13 R13 K19 + 0x9006200D, // 00C7 SETMBR R1 K16 R13 + 0x70020008, // 00C8 JMP #00D2 + 0x5C341400, // 00C9 MOVE R13 R10 + 0x74360003, // 00CA JMPT R13 #00CF + 0xB8362200, // 00CB GETNGBL R13 K17 + 0x88341B14, // 00CC GETMBR R13 R13 K20 + 0x9006200D, // 00CD SETMBR R1 K16 R13 + 0x70020002, // 00CE JMP #00D2 + 0xB8362200, // 00CF GETNGBL R13 K17 + 0x88341B15, // 00D0 GETMBR R13 R13 K21 + 0x9006200D, // 00D1 SETMBR R1 K16 R13 + 0x5C340400, // 00D2 MOVE R13 R2 + 0x4C380000, // 00D3 LDNIL R14 + 0x5C3C0200, // 00D4 MOVE R15 R1 + 0x50400200, // 00D5 LDBOOL R16 1 0 + 0x7C340600, // 00D6 CALL R13 3 + 0x80000000, // 00D7 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: mdns_remove_PASE +********************************************************************/ +be_local_closure(Matter_Device_mdns_remove_PASE, /* name */ + be_nested_proto( + 12, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[22]) { /* constants */ + /* K0 */ be_nested_str_weak(mdns), + /* K1 */ be_nested_str_weak(string), + /* K2 */ be_nested_str_weak(mdns_pase_eth), + /* K3 */ be_nested_str_weak(tasmota), + /* K4 */ be_nested_str_weak(log), + /* K5 */ be_nested_str_weak(format), + /* K6 */ be_nested_str_weak(MTR_X3A_X20calling_X20mdns_X2Eremove_service_X28_X25s_X2C_X20_X25s_X2C_X20_X25s_X2C_X20_X25s_X29), + /* K7 */ be_nested_str_weak(_matterc), + /* K8 */ be_nested_str_weak(_udp), + /* K9 */ be_nested_str_weak(commissioning_instance_eth), + /* K10 */ be_nested_str_weak(hostname_eth), + /* K11 */ be_const_int(3), + /* K12 */ be_nested_str_weak(MTR_X3A_X20remove_X20mDNS_X20on_X20_X25s_X20_X27_X25s_X27), + /* K13 */ be_nested_str_weak(eth), + /* K14 */ be_const_int(2), + /* K15 */ be_nested_str_weak(remove_service), + /* K16 */ be_nested_str_weak(mdns_pase_wifi), + /* K17 */ be_nested_str_weak(commissioning_instance_wifi), + /* K18 */ be_nested_str_weak(hostname_wifi), + /* K19 */ be_nested_str_weak(wifi), + /* K20 */ be_nested_str_weak(MTR_X3A_X20Exception), + /* K21 */ be_nested_str_weak(_X7C), + }), + be_str_weak(mdns_remove_PASE), + &be_const_str_solidified, + ( &(const binstruction[83]) { /* code */ + 0xA4060000, // 0000 IMPORT R1 K0 + 0xA40A0200, // 0001 IMPORT R2 K1 + 0xA802003D, // 0002 EXBLK 0 #0041 + 0x880C0102, // 0003 GETMBR R3 R0 K2 + 0x780E001B, // 0004 JMPF R3 #0021 + 0xB80E0600, // 0005 GETNGBL R3 K3 + 0x8C0C0704, // 0006 GETMET R3 R3 K4 + 0x8C140505, // 0007 GETMET R5 R2 K5 + 0x581C0006, // 0008 LDCONST R7 K6 + 0x58200007, // 0009 LDCONST R8 K7 + 0x58240008, // 000A LDCONST R9 K8 + 0x88280109, // 000B GETMBR R10 R0 K9 + 0x882C010A, // 000C GETMBR R11 R0 K10 + 0x7C140C00, // 000D CALL R5 6 + 0x5818000B, // 000E LDCONST R6 K11 + 0x7C0C0600, // 000F CALL R3 3 + 0xB80E0600, // 0010 GETNGBL R3 K3 + 0x8C0C0704, // 0011 GETMET R3 R3 K4 + 0x8C140505, // 0012 GETMET R5 R2 K5 + 0x581C000C, // 0013 LDCONST R7 K12 + 0x5820000D, // 0014 LDCONST R8 K13 + 0x88240109, // 0015 GETMBR R9 R0 K9 + 0x7C140800, // 0016 CALL R5 4 + 0x5818000E, // 0017 LDCONST R6 K14 + 0x7C0C0600, // 0018 CALL R3 3 + 0x500C0000, // 0019 LDBOOL R3 0 0 + 0x90020403, // 001A SETMBR R0 K2 R3 + 0x8C0C030F, // 001B GETMET R3 R1 K15 + 0x58140007, // 001C LDCONST R5 K7 + 0x58180008, // 001D LDCONST R6 K8 + 0x881C0109, // 001E GETMBR R7 R0 K9 + 0x8820010A, // 001F GETMBR R8 R0 K10 + 0x7C0C0A00, // 0020 CALL R3 5 + 0x880C0110, // 0021 GETMBR R3 R0 K16 + 0x780E001B, // 0022 JMPF R3 #003F + 0xB80E0600, // 0023 GETNGBL R3 K3 + 0x8C0C0704, // 0024 GETMET R3 R3 K4 + 0x8C140505, // 0025 GETMET R5 R2 K5 + 0x581C0006, // 0026 LDCONST R7 K6 + 0x58200007, // 0027 LDCONST R8 K7 + 0x58240008, // 0028 LDCONST R9 K8 + 0x88280111, // 0029 GETMBR R10 R0 K17 + 0x882C0112, // 002A GETMBR R11 R0 K18 + 0x7C140C00, // 002B CALL R5 6 + 0x5818000B, // 002C LDCONST R6 K11 + 0x7C0C0600, // 002D CALL R3 3 + 0xB80E0600, // 002E GETNGBL R3 K3 + 0x8C0C0704, // 002F GETMET R3 R3 K4 + 0x8C140505, // 0030 GETMET R5 R2 K5 + 0x581C000C, // 0031 LDCONST R7 K12 + 0x58200013, // 0032 LDCONST R8 K19 + 0x88240111, // 0033 GETMBR R9 R0 K17 + 0x7C140800, // 0034 CALL R5 4 + 0x5818000E, // 0035 LDCONST R6 K14 + 0x7C0C0600, // 0036 CALL R3 3 + 0x500C0000, // 0037 LDBOOL R3 0 0 + 0x90022003, // 0038 SETMBR R0 K16 R3 + 0x8C0C030F, // 0039 GETMET R3 R1 K15 + 0x58140007, // 003A LDCONST R5 K7 + 0x58180008, // 003B LDCONST R6 K8 + 0x881C0111, // 003C GETMBR R7 R0 K17 + 0x88200112, // 003D GETMBR R8 R0 K18 + 0x7C0C0A00, // 003E CALL R3 5 + 0xA8040001, // 003F EXBLK 1 1 + 0x70020010, // 0040 JMP #0052 + 0xAC0C0002, // 0041 CATCH R3 0 2 + 0x7002000D, // 0042 JMP #0051 + 0xB8160600, // 0043 GETNGBL R5 K3 + 0x8C140B04, // 0044 GETMET R5 R5 K4 + 0x601C0008, // 0045 GETGBL R7 G8 + 0x5C200600, // 0046 MOVE R8 R3 + 0x7C1C0200, // 0047 CALL R7 1 + 0x001E2807, // 0048 ADD R7 K20 R7 + 0x001C0F15, // 0049 ADD R7 R7 K21 + 0x60200008, // 004A GETGBL R8 G8 + 0x5C240800, // 004B MOVE R9 R4 + 0x7C200200, // 004C CALL R8 1 + 0x001C0E08, // 004D ADD R7 R7 R8 + 0x5820000E, // 004E LDCONST R8 K14 + 0x7C140600, // 004F CALL R5 3 + 0x70020000, // 0050 JMP #0052 + 0xB0080000, // 0051 RAISE 2 R0 R0 + 0x80000000, // 0052 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: _compute_pbkdf +********************************************************************/ +be_local_closure(Matter_Device__compute_pbkdf, /* name */ + be_nested_proto( + 14, /* nstack */ + 4, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[11]) { /* constants */ + /* K0 */ be_nested_str_weak(crypto), + /* K1 */ be_nested_str_weak(string), + /* K2 */ be_nested_str_weak(add), + /* K3 */ be_nested_str_weak(PBKDF2_HMAC_SHA256), + /* K4 */ be_nested_str_weak(derive), + /* K5 */ be_const_int(0), + /* K6 */ be_nested_str_weak(root_w0), + /* K7 */ be_nested_str_weak(EC_P256), + /* K8 */ be_nested_str_weak(mod), + /* K9 */ be_nested_str_weak(root_L), + /* K10 */ be_nested_str_weak(public_key), + }), + be_str_weak(_compute_pbkdf), + &be_const_str_solidified, + ( &(const binstruction[41]) { /* code */ + 0xA4120000, // 0000 IMPORT R4 K0 + 0xA4160200, // 0001 IMPORT R5 K1 + 0x60180015, // 0002 GETGBL R6 G21 + 0x7C180000, // 0003 CALL R6 0 + 0x8C180D02, // 0004 GETMET R6 R6 K2 + 0x5C200200, // 0005 MOVE R8 R1 + 0x54260003, // 0006 LDINT R9 4 + 0x7C180600, // 0007 CALL R6 3 + 0x8C1C0903, // 0008 GETMET R7 R4 K3 + 0x7C1C0200, // 0009 CALL R7 1 + 0x8C1C0F04, // 000A GETMET R7 R7 K4 + 0x5C240C00, // 000B MOVE R9 R6 + 0x5C280600, // 000C MOVE R10 R3 + 0x5C2C0400, // 000D MOVE R11 R2 + 0x5432004F, // 000E LDINT R12 80 + 0x7C1C0A00, // 000F CALL R7 5 + 0x54220026, // 0010 LDINT R8 39 + 0x40220A08, // 0011 CONNECT R8 K5 R8 + 0x94200E08, // 0012 GETIDX R8 R7 R8 + 0x54260027, // 0013 LDINT R9 40 + 0x542A004E, // 0014 LDINT R10 79 + 0x4024120A, // 0015 CONNECT R9 R9 R10 + 0x94240E09, // 0016 GETIDX R9 R7 R9 + 0x8C280907, // 0017 GETMET R10 R4 K7 + 0x7C280200, // 0018 CALL R10 1 + 0x8C281508, // 0019 GETMET R10 R10 K8 + 0x5C301000, // 001A MOVE R12 R8 + 0x7C280400, // 001B CALL R10 2 + 0x90020C0A, // 001C SETMBR R0 K6 R10 + 0x8C280907, // 001D GETMET R10 R4 K7 + 0x7C280200, // 001E CALL R10 1 + 0x8C281508, // 001F GETMET R10 R10 K8 + 0x5C301200, // 0020 MOVE R12 R9 + 0x7C280400, // 0021 CALL R10 2 + 0x8C2C0907, // 0022 GETMET R11 R4 K7 + 0x7C2C0200, // 0023 CALL R11 1 + 0x8C2C170A, // 0024 GETMET R11 R11 K10 + 0x5C341400, // 0025 MOVE R13 R10 + 0x7C2C0400, // 0026 CALL R11 2 + 0x9002120B, // 0027 SETMBR R0 K9 R11 + 0x80000000, // 0028 RET 0 }) ) ); @@ -3825,20 +3709,20 @@ be_local_closure(Matter_Device_invoke_request, /* name */ /******************************************************************** -** Solidified function: start +** Solidified function: _start_udp ********************************************************************/ -be_local_closure(Matter_Device_start, /* name */ +be_local_closure(Matter_Device__start_udp, /* name */ be_nested_proto( 6, /* nstack */ - 1, /* argc */ + 2, /* argc */ 2, /* varg */ 0, /* has upvals */ NULL, /* no upvals */ 1, /* has sup protos */ ( &(const struct bproto*[ 1]) { be_nested_proto( - 2, /* nstack */ - 0, /* argc */ + 8, /* nstack */ + 3, /* argc */ 0, /* varg */ 1, /* has upvals */ ( &(const bupvaldesc[ 1]) { /* upvals */ @@ -3848,113 +3732,63 @@ be_local_closure(Matter_Device_start, /* name */ NULL, /* no sub protos */ 1, /* has constants */ ( &(const bvalue[ 1]) { /* constants */ - /* K0 */ be_nested_str_weak(_trigger_read_sensors), + /* K0 */ be_nested_str_weak(msg_received), }), - be_str_weak(_anonymous_), + be_str_weak(_X3Clambda_X3E), &be_const_str_solidified, - ( &(const binstruction[ 4]) { /* code */ - 0x68000000, // 0000 GETUPV R0 U0 - 0x8C000100, // 0001 GETMET R0 R0 K0 - 0x7C000200, // 0002 CALL R0 1 - 0x80000000, // 0003 RET 0 + ( &(const binstruction[ 7]) { /* code */ + 0x680C0000, // 0000 GETUPV R3 U0 + 0x8C0C0700, // 0001 GETMET R3 R3 K0 + 0x5C140000, // 0002 MOVE R5 R0 + 0x5C180200, // 0003 MOVE R6 R1 + 0x5C1C0400, // 0004 MOVE R7 R2 + 0x7C0C0800, // 0005 CALL R3 4 + 0x80040600, // 0006 RET 1 R3 }) ), }), 1, /* has constants */ ( &(const bvalue[ 9]) { /* constants */ - /* K0 */ be_nested_str_weak(started), - /* K1 */ be_nested_str_weak(autoconf_device), - /* K2 */ be_nested_str_weak(tasmota), - /* K3 */ be_nested_str_weak(add_cron), - /* K4 */ be_nested_str_weak(_X2A_X2F30_X20_X2A_X20_X2A_X20_X2A_X20_X2A_X20_X2A), - /* K5 */ be_nested_str_weak(matter_sensors_30s), - /* K6 */ be_nested_str_weak(_start_udp), - /* K7 */ be_nested_str_weak(UDP_PORT), - /* K8 */ be_nested_str_weak(start_mdns_announce_hostnames), + /* K0 */ be_nested_str_weak(udp_server), + /* K1 */ be_nested_str_weak(tasmota), + /* K2 */ be_nested_str_weak(log), + /* K3 */ be_nested_str_weak(MTR_X3A_X20starting_X20UDP_X20server_X20on_X20port_X3A_X20), + /* K4 */ be_const_int(2), + /* K5 */ be_nested_str_weak(matter), + /* K6 */ be_nested_str_weak(UDPServer), + /* K7 */ be_nested_str_weak(), + /* K8 */ be_nested_str_weak(start), }), - be_str_weak(start), + be_str_weak(_start_udp), &be_const_str_solidified, - ( &(const binstruction[20]) { /* code */ - 0x88040100, // 0000 GETMBR R1 R0 K0 - 0x78060000, // 0001 JMPF R1 #0003 - 0x80000200, // 0002 RET 0 - 0x8C040101, // 0003 GETMET R1 R0 K1 - 0x7C040200, // 0004 CALL R1 1 - 0xB8060400, // 0005 GETNGBL R1 K2 - 0x8C040303, // 0006 GETMET R1 R1 K3 - 0x580C0004, // 0007 LDCONST R3 K4 - 0x84100000, // 0008 CLOSURE R4 P0 - 0x58140005, // 0009 LDCONST R5 K5 - 0x7C040800, // 000A CALL R1 4 - 0x8C040106, // 000B GETMET R1 R0 K6 - 0x880C0107, // 000C GETMBR R3 R0 K7 - 0x7C040400, // 000D CALL R1 2 - 0x8C040108, // 000E GETMET R1 R0 K8 - 0x7C040200, // 000F CALL R1 1 - 0x50040200, // 0010 LDBOOL R1 1 0 - 0x90020001, // 0011 SETMBR R0 K0 R1 - 0xA0000000, // 0012 CLOSE R0 - 0x80000000, // 0013 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: plugins_to_json -********************************************************************/ -be_local_closure(Matter_Device_plugins_to_json, /* name */ - be_nested_proto( - 11, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[11]) { /* constants */ - /* K0 */ be_nested_str_weak(string), - /* K1 */ be_nested_str_weak(_X7B), - /* K2 */ be_const_int(0), - /* K3 */ be_nested_str_weak(plugins), - /* K4 */ be_nested_str_weak(_X2C), - /* K5 */ be_nested_str_weak(format), - /* K6 */ be_nested_str_weak(_X22_X25i_X22_X3A_X25s), - /* K7 */ be_nested_str_weak(get_endpoint), - /* K8 */ be_nested_str_weak(to_json), - /* K9 */ be_const_int(1), - /* K10 */ be_nested_str_weak(_X7D), - }), - be_str_weak(plugins_to_json), - &be_const_str_solidified, - ( &(const binstruction[25]) { /* code */ - 0xA4060000, // 0000 IMPORT R1 K0 - 0x58080001, // 0001 LDCONST R2 K1 - 0x580C0002, // 0002 LDCONST R3 K2 - 0x6010000C, // 0003 GETGBL R4 G12 - 0x88140103, // 0004 GETMBR R5 R0 K3 - 0x7C100200, // 0005 CALL R4 1 - 0x14100604, // 0006 LT R4 R3 R4 - 0x7812000E, // 0007 JMPF R4 #0017 - 0x88100103, // 0008 GETMBR R4 R0 K3 - 0x94100803, // 0009 GETIDX R4 R4 R3 - 0x24140702, // 000A GT R5 R3 K2 - 0x78160000, // 000B JMPF R5 #000D - 0x00080504, // 000C ADD R2 R2 K4 - 0x8C140305, // 000D GETMET R5 R1 K5 - 0x581C0006, // 000E LDCONST R7 K6 - 0x8C200907, // 000F GETMET R8 R4 K7 - 0x7C200200, // 0010 CALL R8 1 - 0x8C240908, // 0011 GETMET R9 R4 K8 - 0x7C240200, // 0012 CALL R9 1 - 0x7C140800, // 0013 CALL R5 4 - 0x00080405, // 0014 ADD R2 R2 R5 - 0x000C0709, // 0015 ADD R3 R3 K9 - 0x7001FFEB, // 0016 JMP #0003 - 0x0008050A, // 0017 ADD R2 R2 K10 - 0x80040400, // 0018 RET 1 R2 + ( &(const binstruction[27]) { /* code */ + 0x88080100, // 0000 GETMBR R2 R0 K0 + 0x780A0000, // 0001 JMPF R2 #0003 + 0x80000400, // 0002 RET 0 + 0x4C080000, // 0003 LDNIL R2 + 0x1C080202, // 0004 EQ R2 R1 R2 + 0x780A0000, // 0005 JMPF R2 #0007 + 0x540615A3, // 0006 LDINT R1 5540 + 0xB80A0200, // 0007 GETNGBL R2 K1 + 0x8C080502, // 0008 GETMET R2 R2 K2 + 0x60100008, // 0009 GETGBL R4 G8 + 0x5C140200, // 000A MOVE R5 R1 + 0x7C100200, // 000B CALL R4 1 + 0x00120604, // 000C ADD R4 K3 R4 + 0x58140004, // 000D LDCONST R5 K4 + 0x7C080600, // 000E CALL R2 3 + 0xB80A0A00, // 000F GETNGBL R2 K5 + 0x8C080506, // 0010 GETMET R2 R2 K6 + 0x58100007, // 0011 LDCONST R4 K7 + 0x5C140200, // 0012 MOVE R5 R1 + 0x7C080600, // 0013 CALL R2 3 + 0x90020002, // 0014 SETMBR R0 K0 R2 + 0x88080100, // 0015 GETMBR R2 R0 K0 + 0x8C080508, // 0016 GETMET R2 R2 K8 + 0x84100000, // 0017 CLOSURE R4 P0 + 0x7C080400, // 0018 CALL R2 2 + 0xA0000000, // 0019 CLOSE R0 + 0x80000000, // 001A RET 0 }) ) ); @@ -4297,112 +4131,49 @@ be_local_closure(Matter_Device_mdns_announce_PASE, /* name */ /******************************************************************** -** Solidified function: register_native_classes +** Solidified function: start_operational_discovery ********************************************************************/ -be_local_closure(Matter_Device_register_native_classes, /* name */ +be_local_closure(Matter_Device_start_operational_discovery, /* name */ be_nested_proto( 9, /* nstack */ - 3, /* argc */ + 2, /* argc */ 2, /* varg */ 0, /* has upvals */ NULL, /* no upvals */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[28]) { /* constants */ - /* K0 */ be_nested_str_weak(register_plugin_class), - /* K1 */ be_nested_str_weak(root), - /* K2 */ be_nested_str_weak(matter), - /* K3 */ be_nested_str_weak(Plugin_Root), - /* K4 */ be_nested_str_weak(light0), - /* K5 */ be_nested_str_weak(Plugin_Light0), - /* K6 */ be_nested_str_weak(light1), - /* K7 */ be_nested_str_weak(Plugin_Light1), - /* K8 */ be_nested_str_weak(light2), - /* K9 */ be_nested_str_weak(Plugin_Light2), - /* K10 */ be_nested_str_weak(light3), - /* K11 */ be_nested_str_weak(Plugin_Light3), - /* K12 */ be_nested_str_weak(relay), - /* K13 */ be_nested_str_weak(Plugin_OnOff), - /* K14 */ be_nested_str_weak(temperature), - /* K15 */ be_nested_str_weak(Plugin_Sensor_Temp), - /* K16 */ be_nested_str_weak(humidity), - /* K17 */ be_nested_str_weak(Plugin_Sensor_Humidity), - /* K18 */ be_nested_str_weak(illuminance), - /* K19 */ be_nested_str_weak(Plugin_Sensor_Illuminance), - /* K20 */ be_nested_str_weak(pressure), - /* K21 */ be_nested_str_weak(Plugin_Sensor_Pressure), - /* K22 */ be_nested_str_weak(tasmota), - /* K23 */ be_nested_str_weak(log), - /* K24 */ be_nested_str_weak(MTR_X3A_X20registered_X20classes_X20), - /* K25 */ be_nested_str_weak(k2l), - /* K26 */ be_nested_str_weak(plugins_classes), - /* K27 */ be_const_int(3), + ( &(const bvalue[ 9]) { /* constants */ + /* K0 */ be_nested_str_weak(crypto), + /* K1 */ be_nested_str_weak(mdns), + /* K2 */ be_nested_str_weak(string), + /* K3 */ be_nested_str_weak(stop_basic_commissioning), + /* K4 */ be_nested_str_weak(root_w0), + /* K5 */ be_nested_str_weak(root_L), + /* K6 */ be_nested_str_weak(set_expire_in_seconds), + /* K7 */ be_nested_str_weak(mdns_announce_op_discovery), + /* K8 */ be_nested_str_weak(get_fabric), }), - be_str_weak(register_native_classes), + be_str_weak(start_operational_discovery), &be_const_str_solidified, - ( &(const binstruction[61]) { /* code */ - 0x8C0C0100, // 0000 GETMET R3 R0 K0 - 0x58140001, // 0001 LDCONST R5 K1 - 0xB81A0400, // 0002 GETNGBL R6 K2 - 0x88180D03, // 0003 GETMBR R6 R6 K3 - 0x7C0C0600, // 0004 CALL R3 3 - 0x8C0C0100, // 0005 GETMET R3 R0 K0 - 0x58140004, // 0006 LDCONST R5 K4 - 0xB81A0400, // 0007 GETNGBL R6 K2 - 0x88180D05, // 0008 GETMBR R6 R6 K5 - 0x7C0C0600, // 0009 CALL R3 3 - 0x8C0C0100, // 000A GETMET R3 R0 K0 - 0x58140006, // 000B LDCONST R5 K6 - 0xB81A0400, // 000C GETNGBL R6 K2 - 0x88180D07, // 000D GETMBR R6 R6 K7 - 0x7C0C0600, // 000E CALL R3 3 - 0x8C0C0100, // 000F GETMET R3 R0 K0 - 0x58140008, // 0010 LDCONST R5 K8 - 0xB81A0400, // 0011 GETNGBL R6 K2 - 0x88180D09, // 0012 GETMBR R6 R6 K9 - 0x7C0C0600, // 0013 CALL R3 3 - 0x8C0C0100, // 0014 GETMET R3 R0 K0 - 0x5814000A, // 0015 LDCONST R5 K10 - 0xB81A0400, // 0016 GETNGBL R6 K2 - 0x88180D0B, // 0017 GETMBR R6 R6 K11 - 0x7C0C0600, // 0018 CALL R3 3 - 0x8C0C0100, // 0019 GETMET R3 R0 K0 - 0x5814000C, // 001A LDCONST R5 K12 - 0xB81A0400, // 001B GETNGBL R6 K2 - 0x88180D0D, // 001C GETMBR R6 R6 K13 - 0x7C0C0600, // 001D CALL R3 3 - 0x8C0C0100, // 001E GETMET R3 R0 K0 - 0x5814000E, // 001F LDCONST R5 K14 - 0xB81A0400, // 0020 GETNGBL R6 K2 - 0x88180D0F, // 0021 GETMBR R6 R6 K15 - 0x7C0C0600, // 0022 CALL R3 3 - 0x8C0C0100, // 0023 GETMET R3 R0 K0 - 0x58140010, // 0024 LDCONST R5 K16 - 0xB81A0400, // 0025 GETNGBL R6 K2 - 0x88180D11, // 0026 GETMBR R6 R6 K17 - 0x7C0C0600, // 0027 CALL R3 3 - 0x8C0C0100, // 0028 GETMET R3 R0 K0 - 0x58140012, // 0029 LDCONST R5 K18 - 0xB81A0400, // 002A GETNGBL R6 K2 - 0x88180D13, // 002B GETMBR R6 R6 K19 - 0x7C0C0600, // 002C CALL R3 3 - 0x8C0C0100, // 002D GETMET R3 R0 K0 - 0x58140014, // 002E LDCONST R5 K20 - 0xB81A0400, // 002F GETNGBL R6 K2 - 0x88180D15, // 0030 GETMBR R6 R6 K21 - 0x7C0C0600, // 0031 CALL R3 3 - 0xB80E2C00, // 0032 GETNGBL R3 K22 - 0x8C0C0717, // 0033 GETMET R3 R3 K23 - 0x60140008, // 0034 GETGBL R5 G8 - 0x8C180119, // 0035 GETMET R6 R0 K25 - 0x8820011A, // 0036 GETMBR R8 R0 K26 - 0x7C180400, // 0037 CALL R6 2 - 0x7C140200, // 0038 CALL R5 1 - 0x00163005, // 0039 ADD R5 K24 R5 - 0x5818001B, // 003A LDCONST R6 K27 - 0x7C0C0600, // 003B CALL R3 3 - 0x80000000, // 003C RET 0 + ( &(const binstruction[17]) { /* code */ + 0xA40A0000, // 0000 IMPORT R2 K0 + 0xA40E0200, // 0001 IMPORT R3 K1 + 0xA4120400, // 0002 IMPORT R4 K2 + 0x8C140103, // 0003 GETMET R5 R0 K3 + 0x7C140200, // 0004 CALL R5 1 + 0x4C140000, // 0005 LDNIL R5 + 0x90020805, // 0006 SETMBR R0 K4 R5 + 0x4C140000, // 0007 LDNIL R5 + 0x90020A05, // 0008 SETMBR R0 K5 R5 + 0x8C140306, // 0009 GETMET R5 R1 K6 + 0x541E003B, // 000A LDINT R7 60 + 0x7C140400, // 000B CALL R5 2 + 0x8C140107, // 000C GETMET R5 R0 K7 + 0x8C1C0308, // 000D GETMET R7 R1 K8 + 0x7C1C0200, // 000E CALL R7 1 + 0x7C140400, // 000F CALL R5 2 + 0x80000000, // 0010 RET 0 }) ) ); @@ -4410,9 +4181,119 @@ be_local_closure(Matter_Device_register_native_classes, /* name */ /******************************************************************** -** Solidified function: event_fabrics_saved +** Solidified function: get_active_endpoints ********************************************************************/ -be_local_closure(Matter_Device_event_fabrics_saved, /* name */ +be_local_closure(Matter_Device_get_active_endpoints, /* name */ + be_nested_proto( + 9, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 6]) { /* constants */ + /* K0 */ be_nested_str_weak(plugins), + /* K1 */ be_nested_str_weak(get_endpoint), + /* K2 */ be_const_int(0), + /* K3 */ be_nested_str_weak(find), + /* K4 */ be_nested_str_weak(push), + /* K5 */ be_nested_str_weak(stop_iteration), + }), + be_str_weak(get_active_endpoints), + &be_const_str_solidified, + ( &(const binstruction[28]) { /* code */ + 0x60080012, // 0000 GETGBL R2 G18 + 0x7C080000, // 0001 CALL R2 0 + 0x600C0010, // 0002 GETGBL R3 G16 + 0x88100100, // 0003 GETMBR R4 R0 K0 + 0x7C0C0200, // 0004 CALL R3 1 + 0xA8020011, // 0005 EXBLK 0 #0018 + 0x5C100600, // 0006 MOVE R4 R3 + 0x7C100000, // 0007 CALL R4 0 + 0x8C140901, // 0008 GETMET R5 R4 K1 + 0x7C140200, // 0009 CALL R5 1 + 0x78060002, // 000A JMPF R1 #000E + 0x1C180B02, // 000B EQ R6 R5 K2 + 0x781A0000, // 000C JMPF R6 #000E + 0x7001FFF7, // 000D JMP #0006 + 0x8C180503, // 000E GETMET R6 R2 K3 + 0x5C200A00, // 000F MOVE R8 R5 + 0x7C180400, // 0010 CALL R6 2 + 0x4C1C0000, // 0011 LDNIL R7 + 0x1C180C07, // 0012 EQ R6 R6 R7 + 0x781A0002, // 0013 JMPF R6 #0017 + 0x8C180504, // 0014 GETMET R6 R2 K4 + 0x5C200A00, // 0015 MOVE R8 R5 + 0x7C180400, // 0016 CALL R6 2 + 0x7001FFED, // 0017 JMP #0006 + 0x580C0005, // 0018 LDCONST R3 K5 + 0xAC0C0200, // 0019 CATCH R3 1 0 + 0xB0080000, // 001A RAISE 2 R0 R0 + 0x80040400, // 001B RET 1 R2 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: mdns_announce_op_discovery_all_fabrics +********************************************************************/ +be_local_closure(Matter_Device_mdns_announce_op_discovery_all_fabrics, /* name */ + be_nested_proto( + 6, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 6]) { /* constants */ + /* K0 */ be_nested_str_weak(sessions), + /* K1 */ be_nested_str_weak(active_fabrics), + /* K2 */ be_nested_str_weak(get_device_id), + /* K3 */ be_nested_str_weak(get_fabric_id), + /* K4 */ be_nested_str_weak(mdns_announce_op_discovery), + /* K5 */ be_nested_str_weak(stop_iteration), + }), + be_str_weak(mdns_announce_op_discovery_all_fabrics), + &be_const_str_solidified, + ( &(const binstruction[22]) { /* code */ + 0x60040010, // 0000 GETGBL R1 G16 + 0x88080100, // 0001 GETMBR R2 R0 K0 + 0x8C080501, // 0002 GETMET R2 R2 K1 + 0x7C080200, // 0003 CALL R2 1 + 0x7C040200, // 0004 CALL R1 1 + 0xA802000B, // 0005 EXBLK 0 #0012 + 0x5C080200, // 0006 MOVE R2 R1 + 0x7C080000, // 0007 CALL R2 0 + 0x8C0C0502, // 0008 GETMET R3 R2 K2 + 0x7C0C0200, // 0009 CALL R3 1 + 0x780E0005, // 000A JMPF R3 #0011 + 0x8C0C0503, // 000B GETMET R3 R2 K3 + 0x7C0C0200, // 000C CALL R3 1 + 0x780E0002, // 000D JMPF R3 #0011 + 0x8C0C0104, // 000E GETMET R3 R0 K4 + 0x5C140400, // 000F MOVE R5 R2 + 0x7C0C0400, // 0010 CALL R3 2 + 0x7001FFF3, // 0011 JMP #0006 + 0x58040005, // 0012 LDCONST R1 K5 + 0xAC040200, // 0013 CATCH R1 1 0 + 0xB0080000, // 0014 RAISE 2 R0 R0 + 0x80000000, // 0015 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: save_before_restart +********************************************************************/ +be_local_closure(Matter_Device_save_before_restart, /* name */ be_nested_proto( 3, /* nstack */ 1, /* argc */ @@ -4422,28 +4303,88 @@ be_local_closure(Matter_Device_event_fabrics_saved, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[ 5]) { /* constants */ - /* K0 */ be_nested_str_weak(sessions), - /* K1 */ be_nested_str_weak(count_active_fabrics), - /* K2 */ be_const_int(0), - /* K3 */ be_nested_str_weak(plugins_persist), - /* K4 */ be_nested_str_weak(save_param), + ( &(const bvalue[ 2]) { /* constants */ + /* K0 */ be_nested_str_weak(stop_basic_commissioning), + /* K1 */ be_nested_str_weak(mdns_remove_op_discovery_all_fabrics), }), - be_str_weak(event_fabrics_saved), + be_str_weak(save_before_restart), &be_const_str_solidified, - ( &(const binstruction[12]) { /* code */ - 0x88040100, // 0000 GETMBR R1 R0 K0 - 0x8C040301, // 0001 GETMET R1 R1 K1 - 0x7C040200, // 0002 CALL R1 1 - 0x24040302, // 0003 GT R1 R1 K2 - 0x78060005, // 0004 JMPF R1 #000B - 0x88040103, // 0005 GETMBR R1 R0 K3 - 0x74060003, // 0006 JMPT R1 #000B - 0x50040200, // 0007 LDBOOL R1 1 0 - 0x90020601, // 0008 SETMBR R0 K3 R1 - 0x8C040104, // 0009 GETMET R1 R0 K4 - 0x7C040200, // 000A CALL R1 1 - 0x80000000, // 000B RET 0 + ( &(const binstruction[ 5]) { /* code */ + 0x8C040100, // 0000 GETMET R1 R0 K0 + 0x7C040200, // 0001 CALL R1 1 + 0x8C040101, // 0002 GETMET R1 R0 K1 + 0x7C040200, // 0003 CALL R1 1 + 0x80000000, // 0004 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: get_plugin_class_arg +********************************************************************/ +be_local_closure(Matter_Device_get_plugin_class_arg, /* name */ + be_nested_proto( + 5, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 4]) { /* constants */ + /* K0 */ be_nested_str_weak(plugins_classes), + /* K1 */ be_nested_str_weak(find), + /* K2 */ be_nested_str_weak(ARG), + /* K3 */ be_nested_str_weak(), + }), + be_str_weak(get_plugin_class_arg), + &be_const_str_solidified, + ( &(const binstruction[ 9]) { /* code */ + 0x88080100, // 0000 GETMBR R2 R0 K0 + 0x8C080501, // 0001 GETMET R2 R2 K1 + 0x5C100200, // 0002 MOVE R4 R1 + 0x7C080400, // 0003 CALL R2 2 + 0x780A0001, // 0004 JMPF R2 #0007 + 0x880C0502, // 0005 GETMBR R3 R2 K2 + 0x70020000, // 0006 JMP #0008 + 0x580C0003, // 0007 LDCONST R3 K3 + 0x80040600, // 0008 RET 1 R3 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: msg_received +********************************************************************/ +be_local_closure(Matter_Device_msg_received, /* name */ + be_nested_proto( + 9, /* nstack */ + 4, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 2]) { /* constants */ + /* K0 */ be_nested_str_weak(message_handler), + /* K1 */ be_nested_str_weak(msg_received), + }), + be_str_weak(msg_received), + &be_const_str_solidified, + ( &(const binstruction[ 7]) { /* code */ + 0x88100100, // 0000 GETMBR R4 R0 K0 + 0x8C100901, // 0001 GETMET R4 R4 K1 + 0x5C180200, // 0002 MOVE R6 R1 + 0x5C1C0400, // 0003 MOVE R7 R2 + 0x5C200600, // 0004 MOVE R8 R3 + 0x7C100800, // 0005 CALL R4 4 + 0x80040800, // 0006 RET 1 R4 }) ) ); @@ -4533,128 +4474,128 @@ be_local_closure(Matter_Device_k2l_num, /* name */ /******************************************************************** -** Solidified function: mdns_remove_PASE +** Solidified function: mdns_remove_op_discovery ********************************************************************/ -be_local_closure(Matter_Device_mdns_remove_PASE, /* name */ +be_local_closure(Matter_Device_mdns_remove_op_discovery, /* name */ be_nested_proto( - 12, /* nstack */ - 1, /* argc */ + 14, /* nstack */ + 2, /* argc */ 2, /* varg */ 0, /* has upvals */ NULL, /* no upvals */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[22]) { /* constants */ + ( &(const bvalue[24]) { /* constants */ /* K0 */ be_nested_str_weak(mdns), /* K1 */ be_nested_str_weak(string), - /* K2 */ be_nested_str_weak(mdns_pase_eth), - /* K3 */ be_nested_str_weak(tasmota), - /* K4 */ be_nested_str_weak(log), - /* K5 */ be_nested_str_weak(format), - /* K6 */ be_nested_str_weak(MTR_X3A_X20calling_X20mdns_X2Eremove_service_X28_X25s_X2C_X20_X25s_X2C_X20_X25s_X2C_X20_X25s_X29), - /* K7 */ be_nested_str_weak(_matterc), - /* K8 */ be_nested_str_weak(_udp), - /* K9 */ be_nested_str_weak(commissioning_instance_eth), - /* K10 */ be_nested_str_weak(hostname_eth), - /* K11 */ be_const_int(3), - /* K12 */ be_nested_str_weak(MTR_X3A_X20remove_X20mDNS_X20on_X20_X25s_X20_X27_X25s_X27), - /* K13 */ be_nested_str_weak(eth), - /* K14 */ be_const_int(2), - /* K15 */ be_nested_str_weak(remove_service), - /* K16 */ be_nested_str_weak(mdns_pase_wifi), - /* K17 */ be_nested_str_weak(commissioning_instance_wifi), - /* K18 */ be_nested_str_weak(hostname_wifi), - /* K19 */ be_nested_str_weak(wifi), - /* K20 */ be_nested_str_weak(MTR_X3A_X20Exception), - /* K21 */ be_nested_str_weak(_X7C), + /* K2 */ be_nested_str_weak(get_device_id), + /* K3 */ be_nested_str_weak(copy), + /* K4 */ be_nested_str_weak(reverse), + /* K5 */ be_nested_str_weak(get_fabric_compressed), + /* K6 */ be_nested_str_weak(tohex), + /* K7 */ be_nested_str_weak(_X2D), + /* K8 */ be_nested_str_weak(tasmota), + /* K9 */ be_nested_str_weak(eth), + /* K10 */ be_nested_str_weak(find), + /* K11 */ be_nested_str_weak(up), + /* K12 */ be_nested_str_weak(log), + /* K13 */ be_nested_str_weak(format), + /* K14 */ be_nested_str_weak(MTR_X3A_X20remove_X20mDNS_X20on_X20_X25s_X20_X27_X25s_X27), + /* K15 */ be_const_int(2), + /* K16 */ be_nested_str_weak(remove_service), + /* K17 */ be_nested_str_weak(_matter), + /* K18 */ be_nested_str_weak(_tcp), + /* K19 */ be_nested_str_weak(hostname_eth), + /* K20 */ be_nested_str_weak(wifi), + /* K21 */ be_nested_str_weak(hostname_wifi), + /* K22 */ be_nested_str_weak(MTR_X3A_X20Exception), + /* K23 */ be_nested_str_weak(_X7C), }), - be_str_weak(mdns_remove_PASE), + be_str_weak(mdns_remove_op_discovery), &be_const_str_solidified, - ( &(const binstruction[83]) { /* code */ - 0xA4060000, // 0000 IMPORT R1 K0 - 0xA40A0200, // 0001 IMPORT R2 K1 - 0xA802003D, // 0002 EXBLK 0 #0041 - 0x880C0102, // 0003 GETMBR R3 R0 K2 - 0x780E001B, // 0004 JMPF R3 #0021 - 0xB80E0600, // 0005 GETNGBL R3 K3 - 0x8C0C0704, // 0006 GETMET R3 R3 K4 - 0x8C140505, // 0007 GETMET R5 R2 K5 - 0x581C0006, // 0008 LDCONST R7 K6 - 0x58200007, // 0009 LDCONST R8 K7 - 0x58240008, // 000A LDCONST R9 K8 - 0x88280109, // 000B GETMBR R10 R0 K9 - 0x882C010A, // 000C GETMBR R11 R0 K10 - 0x7C140C00, // 000D CALL R5 6 - 0x5818000B, // 000E LDCONST R6 K11 - 0x7C0C0600, // 000F CALL R3 3 - 0xB80E0600, // 0010 GETNGBL R3 K3 - 0x8C0C0704, // 0011 GETMET R3 R3 K4 - 0x8C140505, // 0012 GETMET R5 R2 K5 - 0x581C000C, // 0013 LDCONST R7 K12 - 0x5820000D, // 0014 LDCONST R8 K13 - 0x88240109, // 0015 GETMBR R9 R0 K9 - 0x7C140800, // 0016 CALL R5 4 - 0x5818000E, // 0017 LDCONST R6 K14 - 0x7C0C0600, // 0018 CALL R3 3 - 0x500C0000, // 0019 LDBOOL R3 0 0 - 0x90020403, // 001A SETMBR R0 K2 R3 - 0x8C0C030F, // 001B GETMET R3 R1 K15 - 0x58140007, // 001C LDCONST R5 K7 - 0x58180008, // 001D LDCONST R6 K8 - 0x881C0109, // 001E GETMBR R7 R0 K9 - 0x8820010A, // 001F GETMBR R8 R0 K10 - 0x7C0C0A00, // 0020 CALL R3 5 - 0x880C0110, // 0021 GETMBR R3 R0 K16 - 0x780E001B, // 0022 JMPF R3 #003F - 0xB80E0600, // 0023 GETNGBL R3 K3 - 0x8C0C0704, // 0024 GETMET R3 R3 K4 - 0x8C140505, // 0025 GETMET R5 R2 K5 - 0x581C0006, // 0026 LDCONST R7 K6 - 0x58200007, // 0027 LDCONST R8 K7 - 0x58240008, // 0028 LDCONST R9 K8 - 0x88280111, // 0029 GETMBR R10 R0 K17 - 0x882C0112, // 002A GETMBR R11 R0 K18 - 0x7C140C00, // 002B CALL R5 6 - 0x5818000B, // 002C LDCONST R6 K11 - 0x7C0C0600, // 002D CALL R3 3 - 0xB80E0600, // 002E GETNGBL R3 K3 - 0x8C0C0704, // 002F GETMET R3 R3 K4 - 0x8C140505, // 0030 GETMET R5 R2 K5 - 0x581C000C, // 0031 LDCONST R7 K12 - 0x58200013, // 0032 LDCONST R8 K19 - 0x88240111, // 0033 GETMBR R9 R0 K17 - 0x7C140800, // 0034 CALL R5 4 - 0x5818000E, // 0035 LDCONST R6 K14 - 0x7C0C0600, // 0036 CALL R3 3 - 0x500C0000, // 0037 LDBOOL R3 0 0 - 0x90022003, // 0038 SETMBR R0 K16 R3 - 0x8C0C030F, // 0039 GETMET R3 R1 K15 - 0x58140007, // 003A LDCONST R5 K7 - 0x58180008, // 003B LDCONST R6 K8 - 0x881C0111, // 003C GETMBR R7 R0 K17 - 0x88200112, // 003D GETMBR R8 R0 K18 - 0x7C0C0A00, // 003E CALL R3 5 - 0xA8040001, // 003F EXBLK 1 1 - 0x70020010, // 0040 JMP #0052 - 0xAC0C0002, // 0041 CATCH R3 0 2 - 0x7002000D, // 0042 JMP #0051 - 0xB8160600, // 0043 GETNGBL R5 K3 - 0x8C140B04, // 0044 GETMET R5 R5 K4 - 0x601C0008, // 0045 GETGBL R7 G8 - 0x5C200600, // 0046 MOVE R8 R3 - 0x7C1C0200, // 0047 CALL R7 1 - 0x001E2807, // 0048 ADD R7 K20 R7 - 0x001C0F15, // 0049 ADD R7 R7 K21 - 0x60200008, // 004A GETGBL R8 G8 - 0x5C240800, // 004B MOVE R9 R4 - 0x7C200200, // 004C CALL R8 1 - 0x001C0E08, // 004D ADD R7 R7 R8 - 0x5820000E, // 004E LDCONST R8 K14 - 0x7C140600, // 004F CALL R5 3 - 0x70020000, // 0050 JMP #0052 - 0xB0080000, // 0051 RAISE 2 R0 R0 - 0x80000000, // 0052 RET 0 + ( &(const binstruction[81]) { /* code */ + 0xA40A0000, // 0000 IMPORT R2 K0 + 0xA40E0200, // 0001 IMPORT R3 K1 + 0xA802003B, // 0002 EXBLK 0 #003F + 0x8C100302, // 0003 GETMET R4 R1 K2 + 0x7C100200, // 0004 CALL R4 1 + 0x8C100903, // 0005 GETMET R4 R4 K3 + 0x7C100200, // 0006 CALL R4 1 + 0x8C100904, // 0007 GETMET R4 R4 K4 + 0x7C100200, // 0008 CALL R4 1 + 0x8C140305, // 0009 GETMET R5 R1 K5 + 0x7C140200, // 000A CALL R5 1 + 0x8C180B06, // 000B GETMET R6 R5 K6 + 0x7C180200, // 000C CALL R6 1 + 0x00180D07, // 000D ADD R6 R6 K7 + 0x8C1C0906, // 000E GETMET R7 R4 K6 + 0x7C1C0200, // 000F CALL R7 1 + 0x00180C07, // 0010 ADD R6 R6 R7 + 0xB81E1000, // 0011 GETNGBL R7 K8 + 0x8C1C0F09, // 0012 GETMET R7 R7 K9 + 0x7C1C0200, // 0013 CALL R7 1 + 0x8C1C0F0A, // 0014 GETMET R7 R7 K10 + 0x5824000B, // 0015 LDCONST R9 K11 + 0x7C1C0400, // 0016 CALL R7 2 + 0x781E000E, // 0017 JMPF R7 #0027 + 0xB81E1000, // 0018 GETNGBL R7 K8 + 0x8C1C0F0C, // 0019 GETMET R7 R7 K12 + 0x8C24070D, // 001A GETMET R9 R3 K13 + 0x582C000E, // 001B LDCONST R11 K14 + 0x58300009, // 001C LDCONST R12 K9 + 0x5C340C00, // 001D MOVE R13 R6 + 0x7C240800, // 001E CALL R9 4 + 0x5828000F, // 001F LDCONST R10 K15 + 0x7C1C0600, // 0020 CALL R7 3 + 0x8C1C0510, // 0021 GETMET R7 R2 K16 + 0x58240011, // 0022 LDCONST R9 K17 + 0x58280012, // 0023 LDCONST R10 K18 + 0x5C2C0C00, // 0024 MOVE R11 R6 + 0x88300113, // 0025 GETMBR R12 R0 K19 + 0x7C1C0A00, // 0026 CALL R7 5 + 0xB81E1000, // 0027 GETNGBL R7 K8 + 0x8C1C0F14, // 0028 GETMET R7 R7 K20 + 0x7C1C0200, // 0029 CALL R7 1 + 0x8C1C0F0A, // 002A GETMET R7 R7 K10 + 0x5824000B, // 002B LDCONST R9 K11 + 0x7C1C0400, // 002C CALL R7 2 + 0x781E000E, // 002D JMPF R7 #003D + 0xB81E1000, // 002E GETNGBL R7 K8 + 0x8C1C0F0C, // 002F GETMET R7 R7 K12 + 0x8C24070D, // 0030 GETMET R9 R3 K13 + 0x582C000E, // 0031 LDCONST R11 K14 + 0x58300014, // 0032 LDCONST R12 K20 + 0x5C340C00, // 0033 MOVE R13 R6 + 0x7C240800, // 0034 CALL R9 4 + 0x5828000F, // 0035 LDCONST R10 K15 + 0x7C1C0600, // 0036 CALL R7 3 + 0x8C1C0510, // 0037 GETMET R7 R2 K16 + 0x58240011, // 0038 LDCONST R9 K17 + 0x58280012, // 0039 LDCONST R10 K18 + 0x5C2C0C00, // 003A MOVE R11 R6 + 0x88300115, // 003B GETMBR R12 R0 K21 + 0x7C1C0A00, // 003C CALL R7 5 + 0xA8040001, // 003D EXBLK 1 1 + 0x70020010, // 003E JMP #0050 + 0xAC100002, // 003F CATCH R4 0 2 + 0x7002000D, // 0040 JMP #004F + 0xB81A1000, // 0041 GETNGBL R6 K8 + 0x8C180D0C, // 0042 GETMET R6 R6 K12 + 0x60200008, // 0043 GETGBL R8 G8 + 0x5C240800, // 0044 MOVE R9 R4 + 0x7C200200, // 0045 CALL R8 1 + 0x00222C08, // 0046 ADD R8 K22 R8 + 0x00201117, // 0047 ADD R8 R8 K23 + 0x60240008, // 0048 GETGBL R9 G8 + 0x5C280A00, // 0049 MOVE R10 R5 + 0x7C240200, // 004A CALL R9 1 + 0x00201009, // 004B ADD R8 R8 R9 + 0x5824000F, // 004C LDCONST R9 K15 + 0x7C180600, // 004D CALL R6 3 + 0x70020000, // 004E JMP #0050 + 0xB0080000, // 004F RAISE 2 R0 R0 + 0x80000000, // 0050 RET 0 }) ) ); @@ -4662,81 +4603,231 @@ be_local_closure(Matter_Device_mdns_remove_PASE, /* name */ /******************************************************************** -** Solidified function: sort_distinct +** Solidified function: get_plugin_class_displayname ********************************************************************/ -be_local_closure(Matter_Device_sort_distinct, /* name */ +be_local_closure(Matter_Device_get_plugin_class_displayname, /* name */ be_nested_proto( - 7, /* nstack */ - 1, /* argc */ - 4, /* varg */ + 5, /* nstack */ + 2, /* argc */ + 2, /* varg */ 0, /* has upvals */ NULL, /* no upvals */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[ 5]) { /* constants */ - /* K0 */ be_const_class(be_class_Matter_Device), - /* K1 */ be_const_int(1), - /* K2 */ be_const_int(0), - /* K3 */ be_nested_str_weak(stop_iteration), - /* K4 */ be_nested_str_weak(remove), + ( &(const bvalue[ 4]) { /* constants */ + /* K0 */ be_nested_str_weak(plugins_classes), + /* K1 */ be_nested_str_weak(find), + /* K2 */ be_nested_str_weak(NAME), + /* K3 */ be_nested_str_weak(), }), - be_str_weak(sort_distinct), + be_str_weak(get_plugin_class_displayname), &be_const_str_solidified, - ( &(const binstruction[53]) { /* code */ - 0x58040000, // 0000 LDCONST R1 K0 - 0x60080010, // 0001 GETGBL R2 G16 - 0x600C000C, // 0002 GETGBL R3 G12 - 0x5C100000, // 0003 MOVE R4 R0 - 0x7C0C0200, // 0004 CALL R3 1 - 0x040C0701, // 0005 SUB R3 R3 K1 - 0x400E0203, // 0006 CONNECT R3 K1 R3 - 0x7C080200, // 0007 CALL R2 1 - 0xA8020010, // 0008 EXBLK 0 #001A - 0x5C0C0400, // 0009 MOVE R3 R2 - 0x7C0C0000, // 000A CALL R3 0 - 0x94100003, // 000B GETIDX R4 R0 R3 - 0x5C140600, // 000C MOVE R5 R3 - 0x24180B02, // 000D GT R6 R5 K2 - 0x781A0008, // 000E JMPF R6 #0018 - 0x04180B01, // 000F SUB R6 R5 K1 - 0x94180006, // 0010 GETIDX R6 R0 R6 - 0x24180C04, // 0011 GT R6 R6 R4 - 0x781A0004, // 0012 JMPF R6 #0018 - 0x04180B01, // 0013 SUB R6 R5 K1 - 0x94180006, // 0014 GETIDX R6 R0 R6 - 0x98000A06, // 0015 SETIDX R0 R5 R6 - 0x04140B01, // 0016 SUB R5 R5 K1 - 0x7001FFF4, // 0017 JMP #000D - 0x98000A04, // 0018 SETIDX R0 R5 R4 - 0x7001FFEE, // 0019 JMP #0009 - 0x58080003, // 001A LDCONST R2 K3 - 0xAC080200, // 001B CATCH R2 1 0 - 0xB0080000, // 001C RAISE 2 R0 R0 - 0x58080001, // 001D LDCONST R2 K1 - 0x600C000C, // 001E GETGBL R3 G12 - 0x5C100000, // 001F MOVE R4 R0 - 0x7C0C0200, // 0020 CALL R3 1 - 0x180C0701, // 0021 LE R3 R3 K1 - 0x780E0000, // 0022 JMPF R3 #0024 - 0x80040000, // 0023 RET 1 R0 - 0x940C0102, // 0024 GETIDX R3 R0 K2 - 0x6010000C, // 0025 GETGBL R4 G12 - 0x5C140000, // 0026 MOVE R5 R0 - 0x7C100200, // 0027 CALL R4 1 - 0x14100404, // 0028 LT R4 R2 R4 - 0x78120009, // 0029 JMPF R4 #0034 - 0x94100002, // 002A GETIDX R4 R0 R2 - 0x1C100803, // 002B EQ R4 R4 R3 - 0x78120003, // 002C JMPF R4 #0031 - 0x8C100104, // 002D GETMET R4 R0 K4 - 0x5C180400, // 002E MOVE R6 R2 - 0x7C100400, // 002F CALL R4 2 - 0x70020001, // 0030 JMP #0033 - 0x940C0002, // 0031 GETIDX R3 R0 R2 - 0x00080501, // 0032 ADD R2 R2 K1 - 0x7001FFF0, // 0033 JMP #0025 - 0x80040000, // 0034 RET 1 R0 + ( &(const binstruction[ 9]) { /* code */ + 0x88080100, // 0000 GETMBR R2 R0 K0 + 0x8C080501, // 0001 GETMET R2 R2 K1 + 0x5C100200, // 0002 MOVE R4 R1 + 0x7C080400, // 0003 CALL R2 2 + 0x780A0001, // 0004 JMPF R2 #0007 + 0x880C0502, // 0005 GETMBR R3 R2 K2 + 0x70020000, // 0006 JMP #0008 + 0x580C0003, // 0007 LDCONST R3 K3 + 0x80040600, // 0008 RET 1 R3 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: every_second +********************************************************************/ +be_local_closure(Matter_Device_every_second, /* name */ + be_nested_proto( + 4, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 9]) { /* constants */ + /* K0 */ be_nested_str_weak(sessions), + /* K1 */ be_nested_str_weak(every_second), + /* K2 */ be_nested_str_weak(message_handler), + /* K3 */ be_nested_str_weak(commissioning_open), + /* K4 */ be_nested_str_weak(tasmota), + /* K5 */ be_nested_str_weak(time_reached), + /* K6 */ be_const_int(0), + /* K7 */ be_nested_str_weak(plugins), + /* K8 */ be_const_int(1), + }), + be_str_weak(every_second), + &be_const_str_solidified, + ( &(const binstruction[30]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x8C040301, // 0001 GETMET R1 R1 K1 + 0x7C040200, // 0002 CALL R1 1 + 0x88040102, // 0003 GETMBR R1 R0 K2 + 0x8C040301, // 0004 GETMET R1 R1 K1 + 0x7C040200, // 0005 CALL R1 1 + 0x88040103, // 0006 GETMBR R1 R0 K3 + 0x4C080000, // 0007 LDNIL R2 + 0x20040202, // 0008 NE R1 R1 R2 + 0x78060006, // 0009 JMPF R1 #0011 + 0xB8060800, // 000A GETNGBL R1 K4 + 0x8C040305, // 000B GETMET R1 R1 K5 + 0x880C0103, // 000C GETMBR R3 R0 K3 + 0x7C040400, // 000D CALL R1 2 + 0x78060001, // 000E JMPF R1 #0011 + 0x4C040000, // 000F LDNIL R1 + 0x90020601, // 0010 SETMBR R0 K3 R1 + 0x58040006, // 0011 LDCONST R1 K6 + 0x6008000C, // 0012 GETGBL R2 G12 + 0x880C0107, // 0013 GETMBR R3 R0 K7 + 0x7C080200, // 0014 CALL R2 1 + 0x14080202, // 0015 LT R2 R1 R2 + 0x780A0005, // 0016 JMPF R2 #001D + 0x88080107, // 0017 GETMBR R2 R0 K7 + 0x94080401, // 0018 GETIDX R2 R2 R1 + 0x8C080501, // 0019 GETMET R2 R2 K1 + 0x7C080200, // 001A CALL R2 1 + 0x00040308, // 001B ADD R1 R1 K8 + 0x7001FFF4, // 001C JMP #0012 + 0x80000000, // 001D RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: start_mdns_announce_hostnames +********************************************************************/ +be_local_closure(Matter_Device_start_mdns_announce_hostnames, /* name */ + be_nested_proto( + 6, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 1, /* has sup protos */ + ( &(const struct bproto*[ 2]) { + be_nested_proto( + 4, /* nstack */ + 0, /* argc */ + 0, /* varg */ + 1, /* has upvals */ + ( &(const bupvaldesc[ 1]) { /* upvals */ + be_local_const_upval(1, 0), + }), + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 5]) { /* constants */ + /* K0 */ be_nested_str_weak(_mdns_announce_hostname), + /* K1 */ be_nested_str_weak(tasmota), + /* K2 */ be_nested_str_weak(remove_rule), + /* K3 */ be_nested_str_weak(Wifi_X23Connected), + /* K4 */ be_nested_str_weak(matter_mdns_host), + }), + be_str_weak(_anonymous_), + &be_const_str_solidified, + ( &(const binstruction[10]) { /* code */ + 0x68000000, // 0000 GETUPV R0 U0 + 0x8C000100, // 0001 GETMET R0 R0 K0 + 0x50080000, // 0002 LDBOOL R2 0 0 + 0x7C000400, // 0003 CALL R0 2 + 0xB8020200, // 0004 GETNGBL R0 K1 + 0x8C000102, // 0005 GETMET R0 R0 K2 + 0x58080003, // 0006 LDCONST R2 K3 + 0x580C0004, // 0007 LDCONST R3 K4 + 0x7C000600, // 0008 CALL R0 3 + 0x80000000, // 0009 RET 0 + }) + ), + be_nested_proto( + 4, /* nstack */ + 0, /* argc */ + 0, /* varg */ + 1, /* has upvals */ + ( &(const bupvaldesc[ 1]) { /* upvals */ + be_local_const_upval(1, 0), + }), + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 5]) { /* constants */ + /* K0 */ be_nested_str_weak(_mdns_announce_hostname), + /* K1 */ be_nested_str_weak(tasmota), + /* K2 */ be_nested_str_weak(remove_rule), + /* K3 */ be_nested_str_weak(Eth_X23Connected), + /* K4 */ be_nested_str_weak(matter_mdns_host), + }), + be_str_weak(_anonymous_), + &be_const_str_solidified, + ( &(const binstruction[10]) { /* code */ + 0x68000000, // 0000 GETUPV R0 U0 + 0x8C000100, // 0001 GETMET R0 R0 K0 + 0x50080200, // 0002 LDBOOL R2 1 0 + 0x7C000400, // 0003 CALL R0 2 + 0xB8020200, // 0004 GETNGBL R0 K1 + 0x8C000102, // 0005 GETMET R0 R0 K2 + 0x58080003, // 0006 LDCONST R2 K3 + 0x580C0004, // 0007 LDCONST R3 K4 + 0x7C000600, // 0008 CALL R0 3 + 0x80000000, // 0009 RET 0 + }) + ), + }), + 1, /* has constants */ + ( &(const bvalue[ 9]) { /* constants */ + /* K0 */ be_nested_str_weak(tasmota), + /* K1 */ be_nested_str_weak(wifi), + /* K2 */ be_nested_str_weak(up), + /* K3 */ be_nested_str_weak(_mdns_announce_hostname), + /* K4 */ be_nested_str_weak(add_rule), + /* K5 */ be_nested_str_weak(Wifi_X23Connected), + /* K6 */ be_nested_str_weak(matter_mdns_host), + /* K7 */ be_nested_str_weak(eth), + /* K8 */ be_nested_str_weak(Eth_X23Connected), + }), + be_str_weak(start_mdns_announce_hostnames), + &be_const_str_solidified, + ( &(const binstruction[32]) { /* code */ + 0xB8060000, // 0000 GETNGBL R1 K0 + 0x8C040301, // 0001 GETMET R1 R1 K1 + 0x7C040200, // 0002 CALL R1 1 + 0x94040302, // 0003 GETIDX R1 R1 K2 + 0x78060003, // 0004 JMPF R1 #0009 + 0x8C040103, // 0005 GETMET R1 R0 K3 + 0x500C0000, // 0006 LDBOOL R3 0 0 + 0x7C040400, // 0007 CALL R1 2 + 0x70020005, // 0008 JMP #000F + 0xB8060000, // 0009 GETNGBL R1 K0 + 0x8C040304, // 000A GETMET R1 R1 K4 + 0x580C0005, // 000B LDCONST R3 K5 + 0x84100000, // 000C CLOSURE R4 P0 + 0x58140006, // 000D LDCONST R5 K6 + 0x7C040800, // 000E CALL R1 4 + 0xB8060000, // 000F GETNGBL R1 K0 + 0x8C040307, // 0010 GETMET R1 R1 K7 + 0x7C040200, // 0011 CALL R1 1 + 0x94040302, // 0012 GETIDX R1 R1 K2 + 0x78060003, // 0013 JMPF R1 #0018 + 0x8C040103, // 0014 GETMET R1 R0 K3 + 0x500C0200, // 0015 LDBOOL R3 1 0 + 0x7C040400, // 0016 CALL R1 2 + 0x70020005, // 0017 JMP #001E + 0xB8060000, // 0018 GETNGBL R1 K0 + 0x8C040304, // 0019 GETMET R1 R1 K4 + 0x580C0008, // 001A LDCONST R3 K8 + 0x84100001, // 001B CLOSURE R4 P1 + 0x58140006, // 001C LDCONST R5 K6 + 0x7C040800, // 001D CALL R1 4 + 0xA0000000, // 001E CLOSE R0 + 0x80000000, // 001F RET 0 }) ) ); @@ -4747,98 +4838,116 @@ be_local_closure(Matter_Device_sort_distinct, /* name */ ** Solidified class: Matter_Device ********************************************************************/ be_local_class(Matter_Device, - 30, + 31, NULL, - be_nested_map(88, + be_nested_map(91, ( (struct bmapnode*) &(const bmapnode[]) { - { be_const_key_weak(root_L, -1), be_const_var(29) }, - { be_const_key_weak(_compute_pbkdf, -1), be_const_closure(Matter_Device__compute_pbkdf_closure) }, - { be_const_key_weak(_mdns_announce_hostname, -1), be_const_closure(Matter_Device__mdns_announce_hostname_closure) }, - { be_const_key_weak(compute_qrcode_content, -1), be_const_closure(Matter_Device_compute_qrcode_content_closure) }, - { be_const_key_weak(mdns_remove_PASE, 51), be_const_closure(Matter_Device_mdns_remove_PASE_closure) }, - { be_const_key_weak(stop, 56), be_const_closure(Matter_Device_stop_closure) }, - { be_const_key_weak(udp_server, 0), be_const_var(4) }, - { be_const_key_weak(MtrJoin, -1), be_const_closure(Matter_Device_MtrJoin_closure) }, - { be_const_key_weak(commissioning_discriminator, -1), be_const_var(10) }, - { be_const_key_weak(msg_send, 26), be_const_closure(Matter_Device_msg_send_closure) }, - { be_const_key_weak(save_param, 4), be_const_closure(Matter_Device_save_param_closure) }, - { be_const_key_weak(mdns_pase_eth, -1), be_const_var(21) }, - { be_const_key_weak(hostname_eth, -1), be_const_var(18) }, - { be_const_key_weak(productid, -1), be_const_var(20) }, - { be_const_key_weak(vendorid, 69), be_const_var(19) }, - { be_const_key_weak(start_commissioning_complete, 3), be_const_closure(Matter_Device_start_commissioning_complete_closure) }, - { be_const_key_weak(commissioning_salt, -1), be_const_var(11) }, - { be_const_key_weak(commissioning_open, -1), be_const_var(8) }, - { be_const_key_weak(compute_manual_pairing_code, -1), be_const_closure(Matter_Device_compute_manual_pairing_code_closure) }, - { be_const_key_weak(commissioning_L, -1), be_const_var(13) }, - { be_const_key_weak(hostname_wifi, 85), be_const_var(17) }, + { be_const_key_weak(save_param, 26), be_const_closure(Matter_Device_save_param_closure) }, + { be_const_key_weak(_trigger_read_sensors, -1), be_const_closure(Matter_Device__trigger_read_sensors_closure) }, + { be_const_key_weak(root_L, 10), be_const_var(30) }, + { be_const_key_weak(plugins, -1), be_const_var(1) }, + { be_const_key_weak(register_plugin_class, -1), be_const_closure(Matter_Device_register_plugin_class_closure) }, + { be_const_key_weak(commissioning_open, 56), be_const_var(9) }, { be_const_key_weak(start_mdns_announce_hostnames, -1), be_const_closure(Matter_Device_start_mdns_announce_hostnames_closure) }, - { be_const_key_weak(root_passcode, 7), be_const_var(24) }, - { be_const_key_weak(process_attribute_expansion, -1), be_const_closure(Matter_Device_process_attribute_expansion_closure) }, - { be_const_key_weak(received_ack, 12), be_const_closure(Matter_Device_received_ack_closure) }, - { be_const_key_weak(event_fabrics_saved, -1), be_const_closure(Matter_Device_event_fabrics_saved_closure) }, - { be_const_key_weak(start_root_basic_commissioning, 16), be_const_closure(Matter_Device_start_root_basic_commissioning_closure) }, - { be_const_key_weak(ui, -1), be_const_var(7) }, - { be_const_key_weak(PRODUCT_ID, -1), be_const_int(32768) }, - { be_const_key_weak(commissioning_iterations, -1), be_const_var(9) }, - { be_const_key_weak(mdns_announce_op_discovery, 22), be_const_closure(Matter_Device_mdns_announce_op_discovery_closure) }, - { be_const_key_weak(is_root_commissioning_open, -1), be_const_closure(Matter_Device_is_root_commissioning_open_closure) }, - { be_const_key_weak(FILENAME, -1), be_nested_str_weak(_matter_device_X2Ejson) }, - { be_const_key_weak(mdns_announce_PASE, 35), be_const_closure(Matter_Device_mdns_announce_PASE_closure) }, - { be_const_key_weak(is_commissioning_open, 44), be_const_closure(Matter_Device_is_commissioning_open_closure) }, - { be_const_key_weak(init, -1), be_const_closure(Matter_Device_init_closure) }, - { be_const_key_weak(stop_basic_commissioning, -1), be_const_closure(Matter_Device_stop_basic_commissioning_closure) }, - { be_const_key_weak(save_before_restart, -1), be_const_closure(Matter_Device_save_before_restart_closure) }, - { be_const_key_weak(plugins_to_json, -1), be_const_closure(Matter_Device_plugins_to_json_closure) }, - { be_const_key_weak(_trigger_read_sensors, 53), be_const_closure(Matter_Device__trigger_read_sensors_closure) }, - { be_const_key_weak(every_250ms, 61), be_const_closure(Matter_Device_every_250ms_closure) }, - { be_const_key_weak(root_w0, -1), be_const_var(28) }, - { be_const_key_weak(mdns_remove_op_discovery_all_fabrics, -1), be_const_closure(Matter_Device_mdns_remove_op_discovery_all_fabrics_closure) }, - { be_const_key_weak(start_commissioning_complete_deferred, 48), be_const_closure(Matter_Device_start_commissioning_complete_deferred_closure) }, - { be_const_key_weak(commissioning_instance_wifi, -1), be_const_var(15) }, - { be_const_key_weak(_init_basic_commissioning, -1), be_const_closure(Matter_Device__init_basic_commissioning_closure) }, - { be_const_key_weak(started, -1), be_const_var(0) }, - { be_const_key_weak(autoconf_device, -1), be_const_closure(Matter_Device_autoconf_device_closure) }, - { be_const_key_weak(invoke_request, 68), be_const_closure(Matter_Device_invoke_request_closure) }, - { be_const_key_weak(start_operational_discovery, -1), be_const_closure(Matter_Device_start_operational_discovery_closure) }, - { be_const_key_weak(PASE_TIMEOUT, 66), be_const_int(600) }, - { be_const_key_weak(root_salt, 37), be_const_var(27) }, - { be_const_key_weak(get_active_endpoints, -1), be_const_closure(Matter_Device_get_active_endpoints_closure) }, - { be_const_key_weak(message_handler, 47), be_const_var(5) }, - { be_const_key_weak(every_second, -1), be_const_closure(Matter_Device_every_second_closure) }, - { be_const_key_weak(mdns_remove_op_discovery, -1), be_const_closure(Matter_Device_mdns_remove_op_discovery_closure) }, - { be_const_key_weak(mdns_pase_wifi, -1), be_const_var(22) }, - { be_const_key_weak(remove_fabric, -1), be_const_closure(Matter_Device_remove_fabric_closure) }, - { be_const_key_weak(UDP_PORT, -1), be_const_int(5540) }, - { be_const_key_weak(load_param, -1), be_const_closure(Matter_Device_load_param_closure) }, - { be_const_key_weak(_load_plugins_config, -1), be_const_closure(Matter_Device__load_plugins_config_closure) }, + { be_const_key_weak(PASE_TIMEOUT, -1), be_const_int(600) }, { be_const_key_weak(plugins_classes, -1), be_const_var(3) }, - { be_const_key_weak(autoconf_device_map, -1), be_const_closure(Matter_Device_autoconf_device_map_closure) }, - { be_const_key_weak(attribute_updated, 57), be_const_closure(Matter_Device_attribute_updated_closure) }, - { be_const_key_weak(commissioning_admin_fabric, -1), be_const_var(14) }, - { be_const_key_weak(register_plugin_class, 54), be_const_closure(Matter_Device_register_plugin_class_closure) }, - { be_const_key_weak(commissioning_instance_eth, 70), be_const_var(16) }, - { be_const_key_weak(plugins, 52), be_const_var(1) }, - { be_const_key_weak(PASSCODE_DEFAULT, -1), be_const_int(20202021) }, - { be_const_key_weak(_start_udp, -1), be_const_closure(Matter_Device__start_udp_closure) }, - { be_const_key_weak(start_basic_commissioning, -1), be_const_closure(Matter_Device_start_basic_commissioning_closure) }, - { be_const_key_weak(start, -1), be_const_closure(Matter_Device_start_closure) }, - { be_const_key_weak(msg_received, 38), be_const_closure(Matter_Device_msg_received_closure) }, - { be_const_key_weak(VENDOR_ID, -1), be_const_int(65521) }, - { be_const_key_weak(commissioning_w0, -1), be_const_var(12) }, - { be_const_key_weak(mdns_announce_op_discovery_all_fabrics, 33), be_const_closure(Matter_Device_mdns_announce_op_discovery_all_fabrics_closure) }, - { be_const_key_weak(plugins_persist, 28), be_const_var(2) }, - { be_const_key_weak(register_native_classes, -1), be_const_closure(Matter_Device_register_native_classes_closure) }, - { be_const_key_weak(root_discriminator, 25), be_const_var(23) }, - { be_const_key_weak(k2l_num, -1), be_const_static_closure(Matter_Device_k2l_num_closure) }, - { be_const_key_weak(ipv4only, -1), be_const_var(25) }, - { be_const_key_weak(start_operational_discovery_deferred, 13), be_const_closure(Matter_Device_start_operational_discovery_deferred_closure) }, - { be_const_key_weak(root_iterations, -1), be_const_var(26) }, - { be_const_key_weak(register_commands, 8), be_const_closure(Matter_Device_register_commands_closure) }, - { be_const_key_weak(sessions, -1), be_const_var(6) }, - { be_const_key_weak(k2l, -1), be_const_static_closure(Matter_Device_k2l_closure) }, + { be_const_key_weak(autoconf_device, -1), be_const_closure(Matter_Device_autoconf_device_closure) }, + { be_const_key_weak(PASSCODE_INVALID, 16), be_const_simple_instance(be_nested_simple_instance(&be_class_list, { + be_const_list( * be_nested_list(12, + ( (struct bvalue*) &(const bvalue[]) { + be_const_int(0), + be_const_int(11111111), + be_const_int(22222222), + be_const_int(33333333), + be_const_int(44444444), + be_const_int(55555555), + be_const_int(66666666), + be_const_int(77777777), + be_const_int(88888888), + be_const_int(99999999), + be_const_int(12345678), + be_const_int(87654321), + })) ) } )) }, { be_const_key_weak(sort_distinct, -1), be_const_static_closure(Matter_Device_sort_distinct_closure) }, - { be_const_key_weak(PBKDF_ITERATIONS, -1), be_const_int(1000) }, + { be_const_key_weak(root_passcode, -1), be_const_var(25) }, + { be_const_key_weak(generate_random_passcode, 14), be_const_closure(Matter_Device_generate_random_passcode_closure) }, + { be_const_key_weak(hostname_eth, -1), be_const_var(19) }, + { be_const_key_weak(register_commands, 85), be_const_closure(Matter_Device_register_commands_closure) }, + { be_const_key_weak(get_plugin_class_displayname, -1), be_const_closure(Matter_Device_get_plugin_class_displayname_closure) }, + { be_const_key_weak(mdns_remove_op_discovery, -1), be_const_closure(Matter_Device_mdns_remove_op_discovery_closure) }, + { be_const_key_weak(attribute_updated, -1), be_const_closure(Matter_Device_attribute_updated_closure) }, + { be_const_key_weak(productid, 84), be_const_var(21) }, + { be_const_key_weak(ipv4only, 17), be_const_var(26) }, + { be_const_key_weak(UDP_PORT, 68), be_const_int(5540) }, + { be_const_key_weak(register_native_classes, -1), be_const_closure(Matter_Device_register_native_classes_closure) }, + { be_const_key_weak(k2l_num, 65), be_const_static_closure(Matter_Device_k2l_num_closure) }, + { be_const_key_weak(msg_received, -1), be_const_closure(Matter_Device_msg_received_closure) }, + { be_const_key_weak(mdns_announce_op_discovery, 27), be_const_closure(Matter_Device_mdns_announce_op_discovery_closure) }, + { be_const_key_weak(commissioning_L, -1), be_const_var(14) }, + { be_const_key_weak(start_basic_commissioning, 80), be_const_closure(Matter_Device_start_basic_commissioning_closure) }, + { be_const_key_weak(compute_manual_pairing_code, 6), be_const_closure(Matter_Device_compute_manual_pairing_code_closure) }, + { be_const_key_weak(save_before_restart, -1), be_const_closure(Matter_Device_save_before_restart_closure) }, + { be_const_key_weak(message_handler, 89), be_const_var(6) }, + { be_const_key_weak(start_commissioning_complete, -1), be_const_closure(Matter_Device_start_commissioning_complete_closure) }, + { be_const_key_weak(PRODUCT_ID, 24), be_const_int(32768) }, + { be_const_key_weak(msg_send, 11), be_const_closure(Matter_Device_msg_send_closure) }, + { be_const_key_weak(start, -1), be_const_closure(Matter_Device_start_closure) }, + { be_const_key_weak(load_param, 38), be_const_closure(Matter_Device_load_param_closure) }, + { be_const_key_weak(commissioning_salt, 22), be_const_var(12) }, + { be_const_key_weak(root_iterations, -1), be_const_var(27) }, + { be_const_key_weak(vendorid, -1), be_const_var(20) }, + { be_const_key_weak(udp_server, 81), be_const_var(5) }, + { be_const_key_weak(mdns_remove_op_discovery_all_fabrics, 63), be_const_closure(Matter_Device_mdns_remove_op_discovery_all_fabrics_closure) }, + { be_const_key_weak(get_active_endpoints, -1), be_const_closure(Matter_Device_get_active_endpoints_closure) }, + { be_const_key_weak(start_operational_discovery, 51), be_const_closure(Matter_Device_start_operational_discovery_closure) }, + { be_const_key_weak(event_fabrics_saved, -1), be_const_closure(Matter_Device_event_fabrics_saved_closure) }, + { be_const_key_weak(mdns_announce_PASE, -1), be_const_closure(Matter_Device_mdns_announce_PASE_closure) }, + { be_const_key_weak(stop, 2), be_const_closure(Matter_Device_stop_closure) }, + { be_const_key_weak(stop_basic_commissioning, -1), be_const_closure(Matter_Device_stop_basic_commissioning_closure) }, + { be_const_key_weak(plugins_config, 30), be_const_var(4) }, + { be_const_key_weak(invoke_request, -1), be_const_closure(Matter_Device_invoke_request_closure) }, + { be_const_key_weak(is_root_commissioning_open, 82), be_const_closure(Matter_Device_is_root_commissioning_open_closure) }, + { be_const_key_weak(commissioning_instance_eth, 33), be_const_var(17) }, + { be_const_key_weak(mdns_remove_PASE, -1), be_const_closure(Matter_Device_mdns_remove_PASE_closure) }, + { be_const_key_weak(hostname_wifi, 47), be_const_var(18) }, + { be_const_key_weak(FILENAME, -1), be_nested_str_weak(_matter_device_X2Ejson) }, + { be_const_key_weak(process_attribute_expansion, 57), be_const_closure(Matter_Device_process_attribute_expansion_closure) }, + { be_const_key_weak(start_commissioning_complete_deferred, -1), be_const_closure(Matter_Device_start_commissioning_complete_deferred_closure) }, + { be_const_key_weak(commissioning_w0, -1), be_const_var(13) }, + { be_const_key_weak(plugins_persist, 49), be_const_var(2) }, + { be_const_key_weak(start_operational_discovery_deferred, 66), be_const_closure(Matter_Device_start_operational_discovery_deferred_closure) }, + { be_const_key_weak(commissioning_discriminator, 23), be_const_var(11) }, + { be_const_key_weak(commissioning_admin_fabric, -1), be_const_var(15) }, + { be_const_key_weak(autoconf_device_map, -1), be_const_closure(Matter_Device_autoconf_device_map_closure) }, + { be_const_key_weak(remove_fabric, -1), be_const_closure(Matter_Device_remove_fabric_closure) }, + { be_const_key_weak(_init_basic_commissioning, -1), be_const_closure(Matter_Device__init_basic_commissioning_closure) }, + { be_const_key_weak(every_250ms, -1), be_const_closure(Matter_Device_every_250ms_closure) }, + { be_const_key_weak(MtrJoin, -1), be_const_closure(Matter_Device_MtrJoin_closure) }, + { be_const_key_weak(received_ack, 88), be_const_closure(Matter_Device_received_ack_closure) }, + { be_const_key_weak(start_root_basic_commissioning, 54), be_const_closure(Matter_Device_start_root_basic_commissioning_closure) }, + { be_const_key_weak(commissioning_instance_wifi, -1), be_const_var(16) }, + { be_const_key_weak(_compute_pbkdf, -1), be_const_closure(Matter_Device__compute_pbkdf_closure) }, + { be_const_key_weak(PBKDF_ITERATIONS, 48), be_const_int(1000) }, + { be_const_key_weak(_start_udp, -1), be_const_closure(Matter_Device__start_udp_closure) }, + { be_const_key_weak(started, 44), be_const_var(0) }, + { be_const_key_weak(ui, 42), be_const_var(8) }, + { be_const_key_weak(mdns_pase_wifi, 41), be_const_var(23) }, + { be_const_key_weak(root_salt, -1), be_const_var(28) }, + { be_const_key_weak(mdns_announce_op_discovery_all_fabrics, -1), be_const_closure(Matter_Device_mdns_announce_op_discovery_all_fabrics_closure) }, + { be_const_key_weak(sessions, -1), be_const_var(7) }, + { be_const_key_weak(_load_plugins_config, 29), be_const_closure(Matter_Device__load_plugins_config_closure) }, + { be_const_key_weak(get_plugin_class_arg, -1), be_const_closure(Matter_Device_get_plugin_class_arg_closure) }, + { be_const_key_weak(commissioning_iterations, -1), be_const_var(10) }, + { be_const_key_weak(_mdns_announce_hostname, -1), be_const_closure(Matter_Device__mdns_announce_hostname_closure) }, + { be_const_key_weak(VENDOR_ID, -1), be_const_int(65521) }, + { be_const_key_weak(root_discriminator, -1), be_const_var(24) }, + { be_const_key_weak(init, -1), be_const_closure(Matter_Device_init_closure) }, + { be_const_key_weak(root_w0, 90), be_const_var(29) }, + { be_const_key_weak(mdns_pase_eth, -1), be_const_var(22) }, + { be_const_key_weak(every_second, -1), be_const_closure(Matter_Device_every_second_closure) }, + { be_const_key_weak(compute_qrcode_content, -1), be_const_closure(Matter_Device_compute_qrcode_content_closure) }, + { be_const_key_weak(k2l, -1), be_const_static_closure(Matter_Device_k2l_closure) }, + { be_const_key_weak(is_commissioning_open, -1), be_const_closure(Matter_Device_is_commissioning_open_closure) }, })), be_str_weak(Matter_Device) ); diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_MessageHandler.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_MessageHandler.h index a61a98163..4e0419fb8 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_MessageHandler.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_MessageHandler.h @@ -221,7 +221,7 @@ be_local_closure(Matter_MessageHandler_msg_received, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[74]) { /* constants */ + ( &(const bvalue[75]) { /* constants */ /* K0 */ be_nested_str_weak(string), /* K1 */ be_nested_str_weak(matter), /* K2 */ be_nested_str_weak(Frame), @@ -294,12 +294,13 @@ be_local_closure(Matter_MessageHandler_msg_received, /* name */ /* K69 */ be_nested_str_weak(MTR_X3A_X20ignoring_X20unhandled_X20protocol_id_X3A), /* K70 */ be_nested_str_weak(MTR_X3A_X20MessageHandler_X3A_X3Amsg_received_X20exception_X3A_X20), /* K71 */ be_nested_str_weak(_X3B), - /* K72 */ be_nested_str_weak(debug), - /* K73 */ be_nested_str_weak(traceback), + /* K72 */ be_nested_str_weak(_debug_present), + /* K73 */ be_nested_str_weak(debug), + /* K74 */ be_nested_str_weak(traceback), }), be_str_weak(msg_received), &be_const_str_solidified, - ( &(const binstruction[388]) { /* code */ + ( &(const binstruction[390]) { /* code */ 0xA4120000, // 0000 IMPORT R4 K0 0x50140000, // 0001 LDBOOL R5 0 0 0xA802016A, // 0002 EXBLK 0 #016E @@ -665,9 +666,9 @@ be_local_closure(Matter_MessageHandler_msg_received, /* name */ 0xA8040001, // 016A EXBLK 1 1 0x80040A00, // 016B RET 1 R5 0xA8040001, // 016C EXBLK 1 1 - 0x70020014, // 016D JMP #0183 + 0x70020016, // 016D JMP #0185 0xAC180002, // 016E CATCH R6 0 2 - 0x70020011, // 016F JMP #0182 + 0x70020013, // 016F JMP #0184 0xB8220A00, // 0170 GETNGBL R8 K5 0x8C201106, // 0171 GETMET R8 R8 K6 0x60280008, // 0172 GETGBL R10 G8 @@ -680,14 +681,16 @@ be_local_closure(Matter_MessageHandler_msg_received, /* name */ 0x7C2C0200, // 0179 CALL R11 1 0x0028140B, // 017A ADD R10 R10 R11 0x7C200400, // 017B CALL R8 2 - 0xA4229000, // 017C IMPORT R8 K72 - 0x8C241149, // 017D GETMET R9 R8 K73 - 0x7C240200, // 017E CALL R9 1 - 0x50240000, // 017F LDBOOL R9 0 0 - 0x80041200, // 0180 RET 1 R9 - 0x70020000, // 0181 JMP #0183 - 0xB0080000, // 0182 RAISE 2 R0 R0 - 0x80000000, // 0183 RET 0 + 0x88200148, // 017C GETMBR R8 R0 K72 + 0x78220002, // 017D JMPF R8 #0181 + 0xA4229200, // 017E IMPORT R8 K73 + 0x8C24114A, // 017F GETMET R9 R8 K74 + 0x7C240200, // 0180 CALL R9 1 + 0x50200000, // 0181 LDBOOL R8 0 0 + 0x80041000, // 0182 RET 1 R8 + 0x70020000, // 0183 JMP #0185 + 0xB0080000, // 0184 RAISE 2 R0 R0 + 0x80000000, // 0185 RET 0 }) ) ); diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin.h index 458456859..00fe4a9f5 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin.h @@ -7,26 +7,38 @@ extern const bclass be_class_Matter_Plugin; /******************************************************************** -** Solidified function: get_endpoint +** Solidified function: attribute_updated ********************************************************************/ -be_local_closure(Matter_Plugin_get_endpoint, /* name */ +be_local_closure(Matter_Plugin_attribute_updated, /* name */ be_nested_proto( - 2, /* nstack */ - 1, /* argc */ + 11, /* nstack */ + 5, /* argc */ 2, /* varg */ 0, /* has upvals */ NULL, /* no upvals */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[ 1]) { /* constants */ + ( &(const bvalue[ 3]) { /* constants */ /* K0 */ be_nested_str_weak(endpoint), + /* K1 */ be_nested_str_weak(device), + /* K2 */ be_nested_str_weak(attribute_updated), }), - be_str_weak(get_endpoint), + be_str_weak(attribute_updated), &be_const_str_solidified, - ( &(const binstruction[ 2]) { /* code */ - 0x88040100, // 0000 GETMBR R1 R0 K0 - 0x80040200, // 0001 RET 1 R1 + ( &(const binstruction[12]) { /* code */ + 0x4C140000, // 0000 LDNIL R5 + 0x1C140205, // 0001 EQ R5 R1 R5 + 0x78160000, // 0002 JMPF R5 #0004 + 0x88040100, // 0003 GETMBR R1 R0 K0 + 0x88140101, // 0004 GETMBR R5 R0 K1 + 0x8C140B02, // 0005 GETMET R5 R5 K2 + 0x5C1C0200, // 0006 MOVE R7 R1 + 0x5C200400, // 0007 MOVE R8 R2 + 0x5C240600, // 0008 MOVE R9 R3 + 0x5C280800, // 0009 MOVE R10 R4 + 0x7C140A00, // 000A CALL R5 5 + 0x80000000, // 000B RET 0 }) ) ); @@ -59,126 +71,11 @@ be_local_closure(Matter_Plugin_timed_request, /* name */ /******************************************************************** -** Solidified function: to_json_parameters +** Solidified function: get_endpoint ********************************************************************/ -be_local_closure(Matter_Plugin_to_json_parameters, /* name */ +be_local_closure(Matter_Plugin_get_endpoint, /* name */ be_nested_proto( 2, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 0, /* has constants */ - NULL, /* no const */ - be_str_weak(to_json_parameters), - &be_const_str_solidified, - ( &(const binstruction[ 1]) { /* code */ - 0x80040200, // 0000 RET 1 R1 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: read_event -********************************************************************/ -be_local_closure(Matter_Plugin_read_event, /* name */ - be_nested_proto( - 6, /* nstack */ - 5, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 0, /* has constants */ - NULL, /* no const */ - be_str_weak(read_event), - &be_const_str_solidified, - ( &(const binstruction[ 2]) { /* code */ - 0x4C140000, // 0000 LDNIL R5 - 0x80040A00, // 0001 RET 1 R5 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: to_json -********************************************************************/ -be_local_closure(Matter_Plugin_to_json, /* name */ - be_nested_proto( - 6, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 6]) { /* constants */ - /* K0 */ be_nested_str_weak(string), - /* K1 */ be_nested_str_weak(format), - /* K2 */ be_nested_str_weak(_X7B_X22type_X22_X3A_X22_X25s_X22), - /* K3 */ be_nested_str_weak(NAME), - /* K4 */ be_nested_str_weak(to_json_parameters), - /* K5 */ be_nested_str_weak(_X7D), - }), - be_str_weak(to_json), - &be_const_str_solidified, - ( &(const binstruction[11]) { /* code */ - 0xA4060000, // 0000 IMPORT R1 K0 - 0x8C080301, // 0001 GETMET R2 R1 K1 - 0x58100002, // 0002 LDCONST R4 K2 - 0x88140103, // 0003 GETMBR R5 R0 K3 - 0x7C080600, // 0004 CALL R2 3 - 0x8C0C0104, // 0005 GETMET R3 R0 K4 - 0x5C140400, // 0006 MOVE R5 R2 - 0x7C0C0400, // 0007 CALL R3 2 - 0x5C080600, // 0008 MOVE R2 R3 - 0x00080505, // 0009 ADD R2 R2 K5 - 0x80040400, // 000A RET 1 R2 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: subscribe_event -********************************************************************/ -be_local_closure(Matter_Plugin_subscribe_event, /* name */ - be_nested_proto( - 6, /* nstack */ - 5, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 0, /* has constants */ - NULL, /* no const */ - be_str_weak(subscribe_event), - &be_const_str_solidified, - ( &(const binstruction[ 2]) { /* code */ - 0x4C140000, // 0000 LDNIL R5 - 0x80040A00, // 0001 RET 1 R5 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: every_second -********************************************************************/ -be_local_closure(Matter_Plugin_every_second, /* name */ - be_nested_proto( - 3, /* nstack */ 1, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -187,39 +84,13 @@ be_local_closure(Matter_Plugin_every_second, /* name */ NULL, /* no sub protos */ 1, /* has constants */ ( &(const bvalue[ 1]) { /* constants */ - /* K0 */ be_nested_str_weak(update_shadow), + /* K0 */ be_nested_str_weak(endpoint), }), - be_str_weak(every_second), - &be_const_str_solidified, - ( &(const binstruction[ 3]) { /* code */ - 0x8C040100, // 0000 GETMET R1 R0 K0 - 0x7C040200, // 0001 CALL R1 1 - 0x80000000, // 0002 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: invoke_request -********************************************************************/ -be_local_closure(Matter_Plugin_invoke_request, /* name */ - be_nested_proto( - 5, /* nstack */ - 4, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 0, /* has constants */ - NULL, /* no const */ - be_str_weak(invoke_request), + be_str_weak(get_endpoint), &be_const_str_solidified, ( &(const binstruction[ 2]) { /* code */ - 0x4C100000, // 0000 LDNIL R4 - 0x80040800, // 0001 RET 1 R4 + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x80040200, // 0001 RET 1 R1 }) ) ); @@ -227,12 +98,12 @@ be_local_closure(Matter_Plugin_invoke_request, /* name */ /******************************************************************** -** Solidified function: parse_sensors +** Solidified function: subscribe_attribute ********************************************************************/ -be_local_closure(Matter_Plugin_parse_sensors, /* name */ +be_local_closure(Matter_Plugin_subscribe_attribute, /* name */ be_nested_proto( - 2, /* nstack */ - 2, /* argc */ + 6, /* nstack */ + 5, /* argc */ 2, /* varg */ 0, /* has upvals */ NULL, /* no upvals */ @@ -240,59 +111,11 @@ be_local_closure(Matter_Plugin_parse_sensors, /* name */ NULL, /* no sub protos */ 0, /* has constants */ NULL, /* no const */ - be_str_weak(parse_sensors), - &be_const_str_solidified, - ( &(const binstruction[ 1]) { /* code */ - 0x80000000, // 0000 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: update_shadow -********************************************************************/ -be_local_closure(Matter_Plugin_update_shadow, /* name */ - be_nested_proto( - 1, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 0, /* has constants */ - NULL, /* no const */ - be_str_weak(update_shadow), - &be_const_str_solidified, - ( &(const binstruction[ 1]) { /* code */ - 0x80000000, // 0000 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: write_attribute -********************************************************************/ -be_local_closure(Matter_Plugin_write_attribute, /* name */ - be_nested_proto( - 5, /* nstack */ - 4, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 0, /* has constants */ - NULL, /* no const */ - be_str_weak(write_attribute), + be_str_weak(subscribe_attribute), &be_const_str_solidified, ( &(const binstruction[ 2]) { /* code */ - 0x4C100000, // 0000 LDNIL R4 - 0x80040800, // 0001 RET 1 R4 + 0x4C140000, // 0000 LDNIL R5 + 0x80040A00, // 0001 RET 1 R5 }) ) ); @@ -334,38 +157,144 @@ be_local_closure(Matter_Plugin_init, /* name */ /******************************************************************** -** Solidified function: attribute_updated +** Solidified function: write_attribute ********************************************************************/ -be_local_closure(Matter_Plugin_attribute_updated, /* name */ +be_local_closure(Matter_Plugin_write_attribute, /* name */ be_nested_proto( - 11, /* nstack */ - 5, /* argc */ + 5, /* nstack */ + 4, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 0, /* has constants */ + NULL, /* no const */ + be_str_weak(write_attribute), + &be_const_str_solidified, + ( &(const binstruction[ 2]) { /* code */ + 0x4C100000, // 0000 LDNIL R4 + 0x80040800, // 0001 RET 1 R4 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: has +********************************************************************/ +be_local_closure(Matter_Plugin_has, /* name */ + be_nested_proto( + 6, /* nstack */ + 3, /* argc */ 2, /* varg */ 0, /* has upvals */ NULL, /* no upvals */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[ 3]) { /* constants */ - /* K0 */ be_nested_str_weak(endpoint), - /* K1 */ be_nested_str_weak(device), - /* K2 */ be_nested_str_weak(attribute_updated), + ( &(const bvalue[ 4]) { /* constants */ + /* K0 */ be_nested_str_weak(clusters), + /* K1 */ be_nested_str_weak(contains), + /* K2 */ be_nested_str_weak(endpoints), + /* K3 */ be_nested_str_weak(find), }), - be_str_weak(attribute_updated), + be_str_weak(has), &be_const_str_solidified, - ( &(const binstruction[12]) { /* code */ - 0x4C140000, // 0000 LDNIL R5 - 0x1C140205, // 0001 EQ R5 R1 R5 - 0x78160000, // 0002 JMPF R5 #0004 - 0x88040100, // 0003 GETMBR R1 R0 K0 - 0x88140101, // 0004 GETMBR R5 R0 K1 - 0x8C140B02, // 0005 GETMET R5 R5 K2 - 0x5C1C0200, // 0006 MOVE R7 R1 - 0x5C200400, // 0007 MOVE R8 R2 - 0x5C240600, // 0008 MOVE R9 R3 - 0x5C280800, // 0009 MOVE R10 R4 - 0x7C140A00, // 000A CALL R5 5 - 0x80000000, // 000B RET 0 + ( &(const binstruction[15]) { /* code */ + 0x880C0100, // 0000 GETMBR R3 R0 K0 + 0x8C0C0701, // 0001 GETMET R3 R3 K1 + 0x5C140200, // 0002 MOVE R5 R1 + 0x7C0C0400, // 0003 CALL R3 2 + 0x780E0006, // 0004 JMPF R3 #000C + 0x880C0102, // 0005 GETMBR R3 R0 K2 + 0x8C0C0703, // 0006 GETMET R3 R3 K3 + 0x5C140400, // 0007 MOVE R5 R2 + 0x7C0C0400, // 0008 CALL R3 2 + 0x4C100000, // 0009 LDNIL R4 + 0x200C0604, // 000A NE R3 R3 R4 + 0x740E0000, // 000B JMPT R3 #000D + 0x500C0001, // 000C LDBOOL R3 0 1 + 0x500C0200, // 000D LDBOOL R3 1 0 + 0x80040600, // 000E RET 1 R3 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: invoke_request +********************************************************************/ +be_local_closure(Matter_Plugin_invoke_request, /* name */ + be_nested_proto( + 5, /* nstack */ + 4, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 0, /* has constants */ + NULL, /* no const */ + be_str_weak(invoke_request), + &be_const_str_solidified, + ( &(const binstruction[ 2]) { /* code */ + 0x4C100000, // 0000 LDNIL R4 + 0x80040800, // 0001 RET 1 R4 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: update_shadow +********************************************************************/ +be_local_closure(Matter_Plugin_update_shadow, /* name */ + be_nested_proto( + 1, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 0, /* has constants */ + NULL, /* no const */ + be_str_weak(update_shadow), + &be_const_str_solidified, + ( &(const binstruction[ 1]) { /* code */ + 0x80000000, // 0000 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: every_second +********************************************************************/ +be_local_closure(Matter_Plugin_every_second, /* name */ + be_nested_proto( + 3, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 1]) { /* constants */ + /* K0 */ be_nested_str_weak(update_shadow), + }), + be_str_weak(every_second), + &be_const_str_solidified, + ( &(const binstruction[ 3]) { /* code */ + 0x8C040100, // 0000 GETMET R1 R0 K0 + 0x7C040200, // 0001 CALL R1 1 + 0x80000000, // 0002 RET 0 }) ) ); @@ -507,49 +436,6 @@ be_local_closure(Matter_Plugin_read_attribute, /* name */ /*******************************************************************/ -/******************************************************************** -** Solidified function: has -********************************************************************/ -be_local_closure(Matter_Plugin_has, /* name */ - be_nested_proto( - 6, /* nstack */ - 3, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 4]) { /* constants */ - /* K0 */ be_nested_str_weak(clusters), - /* K1 */ be_nested_str_weak(contains), - /* K2 */ be_nested_str_weak(endpoints), - /* K3 */ be_nested_str_weak(find), - }), - be_str_weak(has), - &be_const_str_solidified, - ( &(const binstruction[15]) { /* code */ - 0x880C0100, // 0000 GETMBR R3 R0 K0 - 0x8C0C0701, // 0001 GETMET R3 R3 K1 - 0x5C140200, // 0002 MOVE R5 R1 - 0x7C0C0400, // 0003 CALL R3 2 - 0x780E0006, // 0004 JMPF R3 #000C - 0x880C0102, // 0005 GETMBR R3 R0 K2 - 0x8C0C0703, // 0006 GETMET R3 R3 K3 - 0x5C140400, // 0007 MOVE R5 R2 - 0x7C0C0400, // 0008 CALL R3 2 - 0x4C100000, // 0009 LDNIL R4 - 0x200C0604, // 000A NE R3 R3 R4 - 0x740E0000, // 000B JMPT R3 #000D - 0x500C0001, // 000C LDBOOL R3 0 1 - 0x500C0200, // 000D LDBOOL R3 1 0 - 0x80040600, // 000E RET 1 R3 - }) - ) -); -/*******************************************************************/ - - /******************************************************************** ** Solidified function: consolidate_clusters ********************************************************************/ @@ -653,6 +539,33 @@ be_local_closure(Matter_Plugin_consolidate_clusters, /* name */ /*******************************************************************/ +/******************************************************************** +** Solidified function: +********************************************************************/ +be_local_closure(Matter_Plugin__X3Clambda_X3E, /* name */ + be_nested_proto( + 3, /* nstack */ + 1, /* argc */ + 0, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 0, /* has constants */ + NULL, /* no const */ + be_str_weak(_X3Clambda_X3E), + &be_const_str_solidified, + ( &(const binstruction[ 4]) { /* code */ + 0x60040008, // 0000 GETGBL R1 G8 + 0x5C080000, // 0001 MOVE R2 R0 + 0x7C040200, // 0002 CALL R1 1 + 0x80040200, // 0003 RET 1 R1 + }) + ) +); +/*******************************************************************/ + + /******************************************************************** ** Solidified function: get_attribute_list ********************************************************************/ @@ -686,6 +599,55 @@ be_local_closure(Matter_Plugin_get_attribute_list, /* name */ /*******************************************************************/ +/******************************************************************** +** Solidified function: read_event +********************************************************************/ +be_local_closure(Matter_Plugin_read_event, /* name */ + be_nested_proto( + 6, /* nstack */ + 5, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 0, /* has constants */ + NULL, /* no const */ + be_str_weak(read_event), + &be_const_str_solidified, + ( &(const binstruction[ 2]) { /* code */ + 0x4C140000, // 0000 LDNIL R5 + 0x80040A00, // 0001 RET 1 R5 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: parse_sensors +********************************************************************/ +be_local_closure(Matter_Plugin_parse_sensors, /* name */ + be_nested_proto( + 2, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 0, /* has constants */ + NULL, /* no const */ + be_str_weak(parse_sensors), + &be_const_str_solidified, + ( &(const binstruction[ 1]) { /* code */ + 0x80000000, // 0000 RET 0 + }) + ) +); +/*******************************************************************/ + + /******************************************************************** ** Solidified function: get_cluster_list ********************************************************************/ @@ -733,9 +695,9 @@ be_local_closure(Matter_Plugin_get_cluster_list, /* name */ /******************************************************************** -** Solidified function: subscribe_attribute +** Solidified function: subscribe_event ********************************************************************/ -be_local_closure(Matter_Plugin_subscribe_attribute, /* name */ +be_local_closure(Matter_Plugin_subscribe_event, /* name */ be_nested_proto( 6, /* nstack */ 5, /* argc */ @@ -746,7 +708,7 @@ be_local_closure(Matter_Plugin_subscribe_attribute, /* name */ NULL, /* no sub protos */ 0, /* has constants */ NULL, /* no const */ - be_str_weak(subscribe_attribute), + be_str_weak(subscribe_event), &be_const_str_solidified, ( &(const binstruction[ 2]) { /* code */ 0x4C140000, // 0000 LDNIL R5 @@ -763,30 +725,11 @@ be_local_closure(Matter_Plugin_subscribe_attribute, /* name */ be_local_class(Matter_Plugin, 3, NULL, - be_nested_map(24, + be_nested_map(25, ( (struct bmapnode*) &(const bmapnode[]) { - { be_const_key_weak(subscribe_attribute, 23), be_const_closure(Matter_Plugin_subscribe_attribute_closure) }, - { be_const_key_weak(get_endpoint, -1), be_const_closure(Matter_Plugin_get_endpoint_closure) }, - { be_const_key_weak(timed_request, -1), be_const_closure(Matter_Plugin_timed_request_closure) }, - { be_const_key_weak(device, 21), be_const_var(0) }, - { be_const_key_weak(endpoint, 0), be_const_var(1) }, - { be_const_key_weak(get_cluster_list, 17), be_const_closure(Matter_Plugin_get_cluster_list_closure) }, - { be_const_key_weak(NAME, -1), be_nested_str_weak(generic) }, - { be_const_key_weak(to_json, 5), be_const_closure(Matter_Plugin_to_json_closure) }, - { be_const_key_weak(get_attribute_list, -1), be_const_closure(Matter_Plugin_get_attribute_list_closure) }, - { be_const_key_weak(every_second, 8), be_const_closure(Matter_Plugin_every_second_closure) }, - { be_const_key_weak(clusters, 22), be_const_var(2) }, - { be_const_key_weak(invoke_request, -1), be_const_closure(Matter_Plugin_invoke_request_closure) }, - { be_const_key_weak(parse_sensors, -1), be_const_closure(Matter_Plugin_parse_sensors_closure) }, - { be_const_key_weak(update_shadow, -1), be_const_closure(Matter_Plugin_update_shadow_closure) }, - { be_const_key_weak(consolidate_clusters, -1), be_const_closure(Matter_Plugin_consolidate_clusters_closure) }, - { be_const_key_weak(has, -1), be_const_closure(Matter_Plugin_has_closure) }, - { be_const_key_weak(read_attribute, -1), be_const_closure(Matter_Plugin_read_attribute_closure) }, { be_const_key_weak(attribute_updated, -1), be_const_closure(Matter_Plugin_attribute_updated_closure) }, - { be_const_key_weak(read_event, 16), be_const_closure(Matter_Plugin_read_event_closure) }, - { be_const_key_weak(write_attribute, 15), be_const_closure(Matter_Plugin_write_attribute_closure) }, - { be_const_key_weak(subscribe_event, 14), be_const_closure(Matter_Plugin_subscribe_event_closure) }, - { be_const_key_weak(init, -1), be_const_closure(Matter_Plugin_init_closure) }, + { be_const_key_weak(timed_request, 7), be_const_closure(Matter_Plugin_timed_request_closure) }, + { be_const_key_weak(get_endpoint, -1), be_const_closure(Matter_Plugin_get_endpoint_closure) }, { be_const_key_weak(CLUSTERS, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { be_const_map( * be_nested_map(1, ( (struct bmapnode*) &(const bmapnode[]) { @@ -801,7 +744,27 @@ be_local_class(Matter_Plugin, be_const_int(65533), })) ) } )) }, })) ) } )) }, - { be_const_key_weak(to_json_parameters, -1), be_const_closure(Matter_Plugin_to_json_parameters_closure) }, + { be_const_key_weak(subscribe_attribute, -1), be_const_closure(Matter_Plugin_subscribe_attribute_closure) }, + { be_const_key_weak(init, -1), be_const_closure(Matter_Plugin_init_closure) }, + { be_const_key_weak(subscribe_event, 18), be_const_closure(Matter_Plugin_subscribe_event_closure) }, + { be_const_key_weak(clusters, -1), be_const_var(2) }, + { be_const_key_weak(endpoint, -1), be_const_var(1) }, + { be_const_key_weak(update_shadow, -1), be_const_closure(Matter_Plugin_update_shadow_closure) }, + { be_const_key_weak(write_attribute, 23), be_const_closure(Matter_Plugin_write_attribute_closure) }, + { be_const_key_weak(device, -1), be_const_var(0) }, + { be_const_key_weak(invoke_request, 6), be_const_closure(Matter_Plugin_invoke_request_closure) }, + { be_const_key_weak(read_event, -1), be_const_closure(Matter_Plugin_read_event_closure) }, + { be_const_key_weak(TYPE, 9), be_nested_str_weak(generic) }, + { be_const_key_weak(every_second, -1), be_const_closure(Matter_Plugin_every_second_closure) }, + { be_const_key_weak(get_attribute_list, 17), be_const_closure(Matter_Plugin_get_attribute_list_closure) }, + { be_const_key_weak(ARG_TYPE, -1), be_const_static_closure(Matter_Plugin__X3Clambda_X3E_closure) }, + { be_const_key_weak(read_attribute, -1), be_const_closure(Matter_Plugin_read_attribute_closure) }, + { be_const_key_weak(ARG, 16), be_nested_str_weak() }, + { be_const_key_weak(consolidate_clusters, 13), be_const_closure(Matter_Plugin_consolidate_clusters_closure) }, + { be_const_key_weak(parse_sensors, -1), be_const_closure(Matter_Plugin_parse_sensors_closure) }, + { be_const_key_weak(get_cluster_list, -1), be_const_closure(Matter_Plugin_get_cluster_list_closure) }, + { be_const_key_weak(has, -1), be_const_closure(Matter_Plugin_has_closure) }, + { be_const_key_weak(NAME, 3), be_nested_str_weak() }, })), be_str_weak(Matter_Plugin) ); diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Light0.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Light0.h index d2eab2b66..287a29d30 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Light0.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Light0.h @@ -390,11 +390,17 @@ extern const bclass be_class_Matter_Plugin; be_local_class(Matter_Plugin_Light0, 1, &be_class_Matter_Plugin, - be_nested_map(8, + be_nested_map(9, ( (struct bmapnode*) &(const bmapnode[]) { - { be_const_key_weak(shadow_onoff, -1), be_const_var(0) }, { be_const_key_weak(init, -1), be_const_closure(Matter_Plugin_Light0_init_closure) }, - { be_const_key_weak(CLUSTERS, 4), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { + { be_const_key_weak(shadow_onoff, 8), be_const_var(0) }, + { be_const_key_weak(TYPES, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { + be_const_map( * be_nested_map(1, + ( (struct bmapnode*) &(const bmapnode[]) { + { be_const_key_int(256, -1), be_const_int(2) }, + })) ) } )) }, + { be_const_key_weak(NAME, -1), be_nested_str_weak(Light_X200_X20On) }, + { be_const_key_weak(CLUSTERS, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { be_const_map( * be_nested_map(4, ( (struct bmapnode*) &(const bmapnode[]) { { be_const_key_int(4, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_list, { @@ -432,15 +438,10 @@ be_local_class(Matter_Plugin_Light0, be_const_int(65533), })) ) } )) }, })) ) } )) }, - { be_const_key_weak(invoke_request, 1), be_const_closure(Matter_Plugin_Light0_invoke_request_closure) }, - { be_const_key_weak(read_attribute, 7), be_const_closure(Matter_Plugin_Light0_read_attribute_closure) }, + { be_const_key_weak(invoke_request, -1), be_const_closure(Matter_Plugin_Light0_invoke_request_closure) }, + { be_const_key_weak(read_attribute, 0), be_const_closure(Matter_Plugin_Light0_read_attribute_closure) }, { be_const_key_weak(update_shadow, -1), be_const_closure(Matter_Plugin_Light0_update_shadow_closure) }, - { be_const_key_weak(NAME, -1), be_nested_str_weak(light0) }, - { be_const_key_weak(TYPES, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { - be_const_map( * be_nested_map(1, - ( (struct bmapnode*) &(const bmapnode[]) { - { be_const_key_int(256, -1), be_const_int(2) }, - })) ) } )) }, + { be_const_key_weak(TYPE, -1), be_nested_str_weak(light0) }, })), be_str_weak(Matter_Plugin_Light0) ); diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Light1.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Light1.h index 54d712ba6..b0f2d5523 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Light1.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Light1.h @@ -7,151 +7,69 @@ extern const bclass be_class_Matter_Plugin_Light1; /******************************************************************** -** Solidified function: init +** Solidified function: update_shadow ********************************************************************/ -be_local_closure(Matter_Plugin_Light1_init, /* name */ - be_nested_proto( - 9, /* nstack */ - 4, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 3]) { /* constants */ - /* K0 */ be_nested_str_weak(init), - /* K1 */ be_nested_str_weak(shadow_bri), - /* K2 */ be_const_int(0), - }), - be_str_weak(init), - &be_const_str_solidified, - ( &(const binstruction[10]) { /* code */ - 0x60100003, // 0000 GETGBL R4 G3 - 0x5C140000, // 0001 MOVE R5 R0 - 0x7C100200, // 0002 CALL R4 1 - 0x8C100900, // 0003 GETMET R4 R4 K0 - 0x5C180200, // 0004 MOVE R6 R1 - 0x5C1C0400, // 0005 MOVE R7 R2 - 0x5C200600, // 0006 MOVE R8 R3 - 0x7C100800, // 0007 CALL R4 4 - 0x90020302, // 0008 SETMBR R0 K1 K2 - 0x80000000, // 0009 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: read_attribute -********************************************************************/ -be_local_closure(Matter_Plugin_Light1_read_attribute, /* name */ +be_local_closure(Matter_Plugin_Light1_update_shadow, /* name */ be_nested_proto( 11, /* nstack */ - 3, /* argc */ + 1, /* argc */ 2, /* varg */ 0, /* has upvals */ NULL, /* no upvals */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[14]) { /* constants */ - /* K0 */ be_nested_str_weak(string), - /* K1 */ be_nested_str_weak(matter), - /* K2 */ be_nested_str_weak(TLV), - /* K3 */ be_nested_str_weak(cluster), - /* K4 */ be_nested_str_weak(attribute), - /* K5 */ be_const_int(0), - /* K6 */ be_nested_str_weak(create_TLV), - /* K7 */ be_nested_str_weak(U1), - /* K8 */ be_nested_str_weak(shadow_bri), - /* K9 */ be_const_int(2), - /* K10 */ be_const_int(3), - /* K11 */ be_nested_str_weak(U4), - /* K12 */ be_const_int(1), - /* K13 */ be_nested_str_weak(read_attribute), + ( &(const bvalue[10]) { /* constants */ + /* K0 */ be_nested_str_weak(light), + /* K1 */ be_nested_str_weak(get), + /* K2 */ be_nested_str_weak(find), + /* K3 */ be_nested_str_weak(bri), + /* K4 */ be_nested_str_weak(tasmota), + /* K5 */ be_nested_str_weak(scale_uint), + /* K6 */ be_const_int(0), + /* K7 */ be_nested_str_weak(shadow_bri), + /* K8 */ be_nested_str_weak(attribute_updated), + /* K9 */ be_nested_str_weak(update_shadow), }), - be_str_weak(read_attribute), + be_str_weak(update_shadow), &be_const_str_solidified, - ( &(const binstruction[77]) { /* code */ - 0xA40E0000, // 0000 IMPORT R3 K0 - 0xB8120200, // 0001 GETNGBL R4 K1 - 0x88100902, // 0002 GETMBR R4 R4 K2 - 0x88140503, // 0003 GETMBR R5 R2 K3 - 0x88180504, // 0004 GETMBR R6 R2 K4 - 0x541E0007, // 0005 LDINT R7 8 - 0x1C1C0A07, // 0006 EQ R7 R5 R7 - 0x781E003B, // 0007 JMPF R7 #0044 - 0x1C1C0D05, // 0008 EQ R7 R6 K5 - 0x781E0005, // 0009 JMPF R7 #0010 - 0x8C1C0906, // 000A GETMET R7 R4 K6 - 0x88240907, // 000B GETMBR R9 R4 K7 - 0x88280108, // 000C GETMBR R10 R0 K8 - 0x7C1C0600, // 000D CALL R7 3 - 0x80040E00, // 000E RET 1 R7 - 0x70020032, // 000F JMP #0043 - 0x1C1C0D09, // 0010 EQ R7 R6 K9 - 0x781E0005, // 0011 JMPF R7 #0018 - 0x8C1C0906, // 0012 GETMET R7 R4 K6 - 0x88240907, // 0013 GETMBR R9 R4 K7 - 0x58280005, // 0014 LDCONST R10 K5 - 0x7C1C0600, // 0015 CALL R7 3 - 0x80040E00, // 0016 RET 1 R7 - 0x7002002A, // 0017 JMP #0043 - 0x1C1C0D0A, // 0018 EQ R7 R6 K10 - 0x781E0005, // 0019 JMPF R7 #0020 - 0x8C1C0906, // 001A GETMET R7 R4 K6 - 0x88240907, // 001B GETMBR R9 R4 K7 - 0x542A00FD, // 001C LDINT R10 254 - 0x7C1C0600, // 001D CALL R7 3 - 0x80040E00, // 001E RET 1 R7 - 0x70020022, // 001F JMP #0043 - 0x541E000E, // 0020 LDINT R7 15 - 0x1C1C0C07, // 0021 EQ R7 R6 R7 - 0x781E0005, // 0022 JMPF R7 #0029 - 0x8C1C0906, // 0023 GETMET R7 R4 K6 - 0x88240907, // 0024 GETMBR R9 R4 K7 - 0x58280005, // 0025 LDCONST R10 K5 - 0x7C1C0600, // 0026 CALL R7 3 - 0x80040E00, // 0027 RET 1 R7 - 0x70020019, // 0028 JMP #0043 - 0x541E0010, // 0029 LDINT R7 17 - 0x1C1C0C07, // 002A EQ R7 R6 R7 - 0x781E0005, // 002B JMPF R7 #0032 - 0x8C1C0906, // 002C GETMET R7 R4 K6 - 0x88240907, // 002D GETMBR R9 R4 K7 - 0x88280108, // 002E GETMBR R10 R0 K8 - 0x7C1C0600, // 002F CALL R7 3 - 0x80040E00, // 0030 RET 1 R7 - 0x70020010, // 0031 JMP #0043 - 0x541EFFFB, // 0032 LDINT R7 65532 - 0x1C1C0C07, // 0033 EQ R7 R6 R7 - 0x781E0005, // 0034 JMPF R7 #003B - 0x8C1C0906, // 0035 GETMET R7 R4 K6 - 0x8824090B, // 0036 GETMBR R9 R4 K11 - 0x5828000C, // 0037 LDCONST R10 K12 - 0x7C1C0600, // 0038 CALL R7 3 - 0x80040E00, // 0039 RET 1 R7 - 0x70020007, // 003A JMP #0043 - 0x541EFFFC, // 003B LDINT R7 65533 - 0x1C1C0C07, // 003C EQ R7 R6 R7 - 0x781E0004, // 003D JMPF R7 #0043 - 0x8C1C0906, // 003E GETMET R7 R4 K6 - 0x8824090B, // 003F GETMBR R9 R4 K11 - 0x542A0004, // 0040 LDINT R10 5 - 0x7C1C0600, // 0041 CALL R7 3 - 0x80040E00, // 0042 RET 1 R7 - 0x70020007, // 0043 JMP #004C - 0x601C0003, // 0044 GETGBL R7 G3 - 0x5C200000, // 0045 MOVE R8 R0 - 0x7C1C0200, // 0046 CALL R7 1 - 0x8C1C0F0D, // 0047 GETMET R7 R7 K13 - 0x5C240200, // 0048 MOVE R9 R1 - 0x5C280400, // 0049 MOVE R10 R2 - 0x7C1C0600, // 004A CALL R7 3 - 0x80040E00, // 004B RET 1 R7 - 0x80000000, // 004C RET 0 + ( &(const binstruction[36]) { /* code */ + 0xA4060000, // 0000 IMPORT R1 K0 + 0x8C080301, // 0001 GETMET R2 R1 K1 + 0x7C080200, // 0002 CALL R2 1 + 0x8C0C0502, // 0003 GETMET R3 R2 K2 + 0x58140003, // 0004 LDCONST R5 K3 + 0x4C180000, // 0005 LDNIL R6 + 0x7C0C0600, // 0006 CALL R3 3 + 0x4C100000, // 0007 LDNIL R4 + 0x20100604, // 0008 NE R4 R3 R4 + 0x78120009, // 0009 JMPF R4 #0014 + 0xB8120800, // 000A GETNGBL R4 K4 + 0x8C100905, // 000B GETMET R4 R4 K5 + 0x5C180600, // 000C MOVE R6 R3 + 0x581C0006, // 000D LDCONST R7 K6 + 0x542200FE, // 000E LDINT R8 255 + 0x58240006, // 000F LDCONST R9 K6 + 0x542A00FD, // 0010 LDINT R10 254 + 0x7C100C00, // 0011 CALL R4 6 + 0x5C0C0800, // 0012 MOVE R3 R4 + 0x70020000, // 0013 JMP #0015 + 0x880C0107, // 0014 GETMBR R3 R0 K7 + 0x88100107, // 0015 GETMBR R4 R0 K7 + 0x20100604, // 0016 NE R4 R3 R4 + 0x78120005, // 0017 JMPF R4 #001E + 0x8C100108, // 0018 GETMET R4 R0 K8 + 0x4C180000, // 0019 LDNIL R6 + 0x541E0007, // 001A LDINT R7 8 + 0x58200006, // 001B LDCONST R8 K6 + 0x7C100800, // 001C CALL R4 4 + 0x90020E03, // 001D SETMBR R0 K7 R3 + 0x60100003, // 001E GETGBL R4 G3 + 0x5C140000, // 001F MOVE R5 R0 + 0x7C100200, // 0020 CALL R4 1 + 0x8C100909, // 0021 GETMET R4 R4 K9 + 0x7C100200, // 0022 CALL R4 1 + 0x80000000, // 0023 RET 0 }) ) ); @@ -312,69 +230,151 @@ be_local_closure(Matter_Plugin_Light1_invoke_request, /* name */ /******************************************************************** -** Solidified function: update_shadow +** Solidified function: read_attribute ********************************************************************/ -be_local_closure(Matter_Plugin_Light1_update_shadow, /* name */ +be_local_closure(Matter_Plugin_Light1_read_attribute, /* name */ be_nested_proto( 11, /* nstack */ - 1, /* argc */ + 3, /* argc */ 2, /* varg */ 0, /* has upvals */ NULL, /* no upvals */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[10]) { /* constants */ - /* K0 */ be_nested_str_weak(light), - /* K1 */ be_nested_str_weak(get), - /* K2 */ be_nested_str_weak(find), - /* K3 */ be_nested_str_weak(bri), - /* K4 */ be_nested_str_weak(tasmota), - /* K5 */ be_nested_str_weak(scale_uint), - /* K6 */ be_const_int(0), - /* K7 */ be_nested_str_weak(shadow_bri), - /* K8 */ be_nested_str_weak(attribute_updated), - /* K9 */ be_nested_str_weak(update_shadow), + ( &(const bvalue[14]) { /* constants */ + /* K0 */ be_nested_str_weak(string), + /* K1 */ be_nested_str_weak(matter), + /* K2 */ be_nested_str_weak(TLV), + /* K3 */ be_nested_str_weak(cluster), + /* K4 */ be_nested_str_weak(attribute), + /* K5 */ be_const_int(0), + /* K6 */ be_nested_str_weak(create_TLV), + /* K7 */ be_nested_str_weak(U1), + /* K8 */ be_nested_str_weak(shadow_bri), + /* K9 */ be_const_int(2), + /* K10 */ be_const_int(3), + /* K11 */ be_nested_str_weak(U4), + /* K12 */ be_const_int(1), + /* K13 */ be_nested_str_weak(read_attribute), }), - be_str_weak(update_shadow), + be_str_weak(read_attribute), &be_const_str_solidified, - ( &(const binstruction[36]) { /* code */ - 0xA4060000, // 0000 IMPORT R1 K0 - 0x8C080301, // 0001 GETMET R2 R1 K1 - 0x7C080200, // 0002 CALL R2 1 - 0x8C0C0502, // 0003 GETMET R3 R2 K2 - 0x58140003, // 0004 LDCONST R5 K3 - 0x4C180000, // 0005 LDNIL R6 - 0x7C0C0600, // 0006 CALL R3 3 - 0x4C100000, // 0007 LDNIL R4 - 0x20100604, // 0008 NE R4 R3 R4 - 0x78120009, // 0009 JMPF R4 #0014 - 0xB8120800, // 000A GETNGBL R4 K4 - 0x8C100905, // 000B GETMET R4 R4 K5 - 0x5C180600, // 000C MOVE R6 R3 - 0x581C0006, // 000D LDCONST R7 K6 - 0x542200FE, // 000E LDINT R8 255 - 0x58240006, // 000F LDCONST R9 K6 - 0x542A00FD, // 0010 LDINT R10 254 - 0x7C100C00, // 0011 CALL R4 6 - 0x5C0C0800, // 0012 MOVE R3 R4 - 0x70020000, // 0013 JMP #0015 - 0x880C0107, // 0014 GETMBR R3 R0 K7 - 0x88100107, // 0015 GETMBR R4 R0 K7 - 0x20100604, // 0016 NE R4 R3 R4 - 0x78120005, // 0017 JMPF R4 #001E - 0x8C100108, // 0018 GETMET R4 R0 K8 - 0x4C180000, // 0019 LDNIL R6 - 0x541E0007, // 001A LDINT R7 8 - 0x58200006, // 001B LDCONST R8 K6 - 0x7C100800, // 001C CALL R4 4 - 0x90020E03, // 001D SETMBR R0 K7 R3 - 0x60100003, // 001E GETGBL R4 G3 - 0x5C140000, // 001F MOVE R5 R0 - 0x7C100200, // 0020 CALL R4 1 - 0x8C100909, // 0021 GETMET R4 R4 K9 - 0x7C100200, // 0022 CALL R4 1 - 0x80000000, // 0023 RET 0 + ( &(const binstruction[77]) { /* code */ + 0xA40E0000, // 0000 IMPORT R3 K0 + 0xB8120200, // 0001 GETNGBL R4 K1 + 0x88100902, // 0002 GETMBR R4 R4 K2 + 0x88140503, // 0003 GETMBR R5 R2 K3 + 0x88180504, // 0004 GETMBR R6 R2 K4 + 0x541E0007, // 0005 LDINT R7 8 + 0x1C1C0A07, // 0006 EQ R7 R5 R7 + 0x781E003B, // 0007 JMPF R7 #0044 + 0x1C1C0D05, // 0008 EQ R7 R6 K5 + 0x781E0005, // 0009 JMPF R7 #0010 + 0x8C1C0906, // 000A GETMET R7 R4 K6 + 0x88240907, // 000B GETMBR R9 R4 K7 + 0x88280108, // 000C GETMBR R10 R0 K8 + 0x7C1C0600, // 000D CALL R7 3 + 0x80040E00, // 000E RET 1 R7 + 0x70020032, // 000F JMP #0043 + 0x1C1C0D09, // 0010 EQ R7 R6 K9 + 0x781E0005, // 0011 JMPF R7 #0018 + 0x8C1C0906, // 0012 GETMET R7 R4 K6 + 0x88240907, // 0013 GETMBR R9 R4 K7 + 0x58280005, // 0014 LDCONST R10 K5 + 0x7C1C0600, // 0015 CALL R7 3 + 0x80040E00, // 0016 RET 1 R7 + 0x7002002A, // 0017 JMP #0043 + 0x1C1C0D0A, // 0018 EQ R7 R6 K10 + 0x781E0005, // 0019 JMPF R7 #0020 + 0x8C1C0906, // 001A GETMET R7 R4 K6 + 0x88240907, // 001B GETMBR R9 R4 K7 + 0x542A00FD, // 001C LDINT R10 254 + 0x7C1C0600, // 001D CALL R7 3 + 0x80040E00, // 001E RET 1 R7 + 0x70020022, // 001F JMP #0043 + 0x541E000E, // 0020 LDINT R7 15 + 0x1C1C0C07, // 0021 EQ R7 R6 R7 + 0x781E0005, // 0022 JMPF R7 #0029 + 0x8C1C0906, // 0023 GETMET R7 R4 K6 + 0x88240907, // 0024 GETMBR R9 R4 K7 + 0x58280005, // 0025 LDCONST R10 K5 + 0x7C1C0600, // 0026 CALL R7 3 + 0x80040E00, // 0027 RET 1 R7 + 0x70020019, // 0028 JMP #0043 + 0x541E0010, // 0029 LDINT R7 17 + 0x1C1C0C07, // 002A EQ R7 R6 R7 + 0x781E0005, // 002B JMPF R7 #0032 + 0x8C1C0906, // 002C GETMET R7 R4 K6 + 0x88240907, // 002D GETMBR R9 R4 K7 + 0x88280108, // 002E GETMBR R10 R0 K8 + 0x7C1C0600, // 002F CALL R7 3 + 0x80040E00, // 0030 RET 1 R7 + 0x70020010, // 0031 JMP #0043 + 0x541EFFFB, // 0032 LDINT R7 65532 + 0x1C1C0C07, // 0033 EQ R7 R6 R7 + 0x781E0005, // 0034 JMPF R7 #003B + 0x8C1C0906, // 0035 GETMET R7 R4 K6 + 0x8824090B, // 0036 GETMBR R9 R4 K11 + 0x5828000C, // 0037 LDCONST R10 K12 + 0x7C1C0600, // 0038 CALL R7 3 + 0x80040E00, // 0039 RET 1 R7 + 0x70020007, // 003A JMP #0043 + 0x541EFFFC, // 003B LDINT R7 65533 + 0x1C1C0C07, // 003C EQ R7 R6 R7 + 0x781E0004, // 003D JMPF R7 #0043 + 0x8C1C0906, // 003E GETMET R7 R4 K6 + 0x8824090B, // 003F GETMBR R9 R4 K11 + 0x542A0004, // 0040 LDINT R10 5 + 0x7C1C0600, // 0041 CALL R7 3 + 0x80040E00, // 0042 RET 1 R7 + 0x70020007, // 0043 JMP #004C + 0x601C0003, // 0044 GETGBL R7 G3 + 0x5C200000, // 0045 MOVE R8 R0 + 0x7C1C0200, // 0046 CALL R7 1 + 0x8C1C0F0D, // 0047 GETMET R7 R7 K13 + 0x5C240200, // 0048 MOVE R9 R1 + 0x5C280400, // 0049 MOVE R10 R2 + 0x7C1C0600, // 004A CALL R7 3 + 0x80040E00, // 004B RET 1 R7 + 0x80000000, // 004C RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: init +********************************************************************/ +be_local_closure(Matter_Plugin_Light1_init, /* name */ + be_nested_proto( + 9, /* nstack */ + 4, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 3]) { /* constants */ + /* K0 */ be_nested_str_weak(init), + /* K1 */ be_nested_str_weak(shadow_bri), + /* K2 */ be_const_int(0), + }), + be_str_weak(init), + &be_const_str_solidified, + ( &(const binstruction[10]) { /* code */ + 0x60100003, // 0000 GETGBL R4 G3 + 0x5C140000, // 0001 MOVE R5 R0 + 0x7C100200, // 0002 CALL R4 1 + 0x8C100900, // 0003 GETMET R4 R4 K0 + 0x5C180200, // 0004 MOVE R6 R1 + 0x5C1C0400, // 0005 MOVE R7 R2 + 0x5C200600, // 0006 MOVE R8 R3 + 0x7C100800, // 0007 CALL R4 4 + 0x90020302, // 0008 SETMBR R0 K1 K2 + 0x80000000, // 0009 RET 0 }) ) ); @@ -388,15 +388,17 @@ extern const bclass be_class_Matter_Plugin_Light0; be_local_class(Matter_Plugin_Light1, 1, &be_class_Matter_Plugin_Light0, - be_nested_map(8, + be_nested_map(9, ( (struct bmapnode*) &(const bmapnode[]) { - { be_const_key_weak(TYPES, 7), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { + { be_const_key_weak(init, -1), be_const_closure(Matter_Plugin_Light1_init_closure) }, + { be_const_key_weak(TYPE, -1), be_nested_str_weak(light1) }, + { be_const_key_weak(TYPES, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { be_const_map( * be_nested_map(1, ( (struct bmapnode*) &(const bmapnode[]) { { be_const_key_int(257, -1), be_const_int(2) }, })) ) } )) }, - { be_const_key_weak(invoke_request, -1), be_const_closure(Matter_Plugin_Light1_invoke_request_closure) }, - { be_const_key_weak(CLUSTERS, 0), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { + { be_const_key_weak(NAME, -1), be_nested_str_weak(Light_X201_X20Dimmer) }, + { be_const_key_weak(CLUSTERS, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { be_const_map( * be_nested_map(1, ( (struct bmapnode*) &(const bmapnode[]) { { be_const_key_int(8, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_list, { @@ -411,11 +413,10 @@ be_local_class(Matter_Plugin_Light1, be_const_int(65533), })) ) } )) }, })) ) } )) }, - { be_const_key_weak(init, 1), be_const_closure(Matter_Plugin_Light1_init_closure) }, - { be_const_key_weak(update_shadow, -1), be_const_closure(Matter_Plugin_Light1_update_shadow_closure) }, - { be_const_key_weak(shadow_bri, 4), be_const_var(0) }, - { be_const_key_weak(NAME, -1), be_nested_str_weak(light1) }, - { be_const_key_weak(read_attribute, -1), be_const_closure(Matter_Plugin_Light1_read_attribute_closure) }, + { be_const_key_weak(invoke_request, -1), be_const_closure(Matter_Plugin_Light1_invoke_request_closure) }, + { be_const_key_weak(read_attribute, 0), be_const_closure(Matter_Plugin_Light1_read_attribute_closure) }, + { be_const_key_weak(update_shadow, 8), be_const_closure(Matter_Plugin_Light1_update_shadow_closure) }, + { be_const_key_weak(shadow_bri, -1), be_const_var(0) }, })), be_str_weak(Matter_Plugin_Light1) ); diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Light2.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Light2.h index 3ca7c0915..0cce12e73 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Light2.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Light2.h @@ -6,170 +6,6 @@ extern const bclass be_class_Matter_Plugin_Light2; -/******************************************************************** -** Solidified function: invoke_request -********************************************************************/ -be_local_closure(Matter_Plugin_Light2_invoke_request, /* name */ - be_nested_proto( - 13, /* nstack */ - 4, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[15]) { /* constants */ - /* K0 */ be_nested_str_weak(light), - /* K1 */ be_nested_str_weak(matter), - /* K2 */ be_nested_str_weak(TLV), - /* K3 */ be_nested_str_weak(cluster), - /* K4 */ be_nested_str_weak(command), - /* K5 */ be_nested_str_weak(findsubval), - /* K6 */ be_const_int(0), - /* K7 */ be_nested_str_weak(ct_min), - /* K8 */ be_nested_str_weak(ct_max), - /* K9 */ be_nested_str_weak(set), - /* K10 */ be_nested_str_weak(ct), - /* K11 */ be_nested_str_weak(update_shadow), - /* K12 */ be_nested_str_weak(log), - /* K13 */ be_nested_str_weak(ct_X3A), - /* K14 */ be_nested_str_weak(invoke_request), - }), - be_str_weak(invoke_request), - &be_const_str_solidified, - ( &(const binstruction[65]) { /* code */ - 0xA4120000, // 0000 IMPORT R4 K0 - 0xB8160200, // 0001 GETNGBL R5 K1 - 0x88140B02, // 0002 GETMBR R5 R5 K2 - 0x88180703, // 0003 GETMBR R6 R3 K3 - 0x881C0704, // 0004 GETMBR R7 R3 K4 - 0x542202FF, // 0005 LDINT R8 768 - 0x1C200C08, // 0006 EQ R8 R6 R8 - 0x7822002E, // 0007 JMPF R8 #0037 - 0x54220009, // 0008 LDINT R8 10 - 0x1C200E08, // 0009 EQ R8 R7 R8 - 0x78220019, // 000A JMPF R8 #0025 - 0x8C200505, // 000B GETMET R8 R2 K5 - 0x58280006, // 000C LDCONST R10 K6 - 0x7C200400, // 000D CALL R8 2 - 0x88240107, // 000E GETMBR R9 R0 K7 - 0x14241009, // 000F LT R9 R8 R9 - 0x78260000, // 0010 JMPF R9 #0012 - 0x88200107, // 0011 GETMBR R8 R0 K7 - 0x88240108, // 0012 GETMBR R9 R0 K8 - 0x24241009, // 0013 GT R9 R8 R9 - 0x78260000, // 0014 JMPF R9 #0016 - 0x88200108, // 0015 GETMBR R8 R0 K8 - 0x8C240909, // 0016 GETMET R9 R4 K9 - 0x602C0013, // 0017 GETGBL R11 G19 - 0x7C2C0000, // 0018 CALL R11 0 - 0x982E1408, // 0019 SETIDX R11 K10 R8 - 0x7C240400, // 001A CALL R9 2 - 0x8C24010B, // 001B GETMET R9 R0 K11 - 0x7C240200, // 001C CALL R9 1 - 0x60240008, // 001D GETGBL R9 G8 - 0x5C281000, // 001E MOVE R10 R8 - 0x7C240200, // 001F CALL R9 1 - 0x00261A09, // 0020 ADD R9 K13 R9 - 0x900E1809, // 0021 SETMBR R3 K12 R9 - 0x50240200, // 0022 LDBOOL R9 1 0 - 0x80041200, // 0023 RET 1 R9 - 0x70020010, // 0024 JMP #0036 - 0x54220046, // 0025 LDINT R8 71 - 0x1C200E08, // 0026 EQ R8 R7 R8 - 0x78220002, // 0027 JMPF R8 #002B - 0x50200200, // 0028 LDBOOL R8 1 0 - 0x80041000, // 0029 RET 1 R8 - 0x7002000A, // 002A JMP #0036 - 0x5422004A, // 002B LDINT R8 75 - 0x1C200E08, // 002C EQ R8 R7 R8 - 0x78220002, // 002D JMPF R8 #0031 - 0x50200200, // 002E LDBOOL R8 1 0 - 0x80041000, // 002F RET 1 R8 - 0x70020004, // 0030 JMP #0036 - 0x5422004B, // 0031 LDINT R8 76 - 0x1C200E08, // 0032 EQ R8 R7 R8 - 0x78220001, // 0033 JMPF R8 #0036 - 0x50200200, // 0034 LDBOOL R8 1 0 - 0x80041000, // 0035 RET 1 R8 - 0x70020008, // 0036 JMP #0040 - 0x60200003, // 0037 GETGBL R8 G3 - 0x5C240000, // 0038 MOVE R9 R0 - 0x7C200200, // 0039 CALL R8 1 - 0x8C20110E, // 003A GETMET R8 R8 K14 - 0x5C280200, // 003B MOVE R10 R1 - 0x5C2C0400, // 003C MOVE R11 R2 - 0x5C300600, // 003D MOVE R12 R3 - 0x7C200800, // 003E CALL R8 4 - 0x80041000, // 003F RET 1 R8 - 0x80000000, // 0040 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: update_shadow -********************************************************************/ -be_local_closure(Matter_Plugin_Light2_update_shadow, /* name */ - be_nested_proto( - 9, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 8]) { /* constants */ - /* K0 */ be_nested_str_weak(light), - /* K1 */ be_nested_str_weak(update_ct_minmax), - /* K2 */ be_nested_str_weak(update_shadow), - /* K3 */ be_nested_str_weak(get), - /* K4 */ be_nested_str_weak(find), - /* K5 */ be_nested_str_weak(ct), - /* K6 */ be_nested_str_weak(shadow_ct), - /* K7 */ be_nested_str_weak(attribute_updated), - }), - be_str_weak(update_shadow), - &be_const_str_solidified, - ( &(const binstruction[28]) { /* code */ - 0xA4060000, // 0000 IMPORT R1 K0 - 0x8C080101, // 0001 GETMET R2 R0 K1 - 0x7C080200, // 0002 CALL R2 1 - 0x60080003, // 0003 GETGBL R2 G3 - 0x5C0C0000, // 0004 MOVE R3 R0 - 0x7C080200, // 0005 CALL R2 1 - 0x8C080502, // 0006 GETMET R2 R2 K2 - 0x7C080200, // 0007 CALL R2 1 - 0x8C080303, // 0008 GETMET R2 R1 K3 - 0x7C080200, // 0009 CALL R2 1 - 0x8C0C0504, // 000A GETMET R3 R2 K4 - 0x58140005, // 000B LDCONST R5 K5 - 0x4C180000, // 000C LDNIL R6 - 0x7C0C0600, // 000D CALL R3 3 - 0x4C100000, // 000E LDNIL R4 - 0x1C100604, // 000F EQ R4 R3 R4 - 0x78120000, // 0010 JMPF R4 #0012 - 0x880C0106, // 0011 GETMBR R3 R0 K6 - 0x88100106, // 0012 GETMBR R4 R0 K6 - 0x20100604, // 0013 NE R4 R3 R4 - 0x78120005, // 0014 JMPF R4 #001B - 0x8C100107, // 0015 GETMET R4 R0 K7 - 0x4C180000, // 0016 LDNIL R6 - 0x541E02FF, // 0017 LDINT R7 768 - 0x54220006, // 0018 LDINT R8 7 - 0x7C100800, // 0019 CALL R4 4 - 0x90020C03, // 001A SETMBR R0 K6 R3 - 0x80000000, // 001B RET 0 - }) - ) -); -/*******************************************************************/ - - /******************************************************************** ** Solidified function: read_attribute ********************************************************************/ @@ -288,6 +124,66 @@ be_local_closure(Matter_Plugin_Light2_read_attribute, /* name */ /*******************************************************************/ +/******************************************************************** +** Solidified function: update_shadow +********************************************************************/ +be_local_closure(Matter_Plugin_Light2_update_shadow, /* name */ + be_nested_proto( + 9, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 8]) { /* constants */ + /* K0 */ be_nested_str_weak(light), + /* K1 */ be_nested_str_weak(update_ct_minmax), + /* K2 */ be_nested_str_weak(update_shadow), + /* K3 */ be_nested_str_weak(get), + /* K4 */ be_nested_str_weak(find), + /* K5 */ be_nested_str_weak(ct), + /* K6 */ be_nested_str_weak(shadow_ct), + /* K7 */ be_nested_str_weak(attribute_updated), + }), + be_str_weak(update_shadow), + &be_const_str_solidified, + ( &(const binstruction[28]) { /* code */ + 0xA4060000, // 0000 IMPORT R1 K0 + 0x8C080101, // 0001 GETMET R2 R0 K1 + 0x7C080200, // 0002 CALL R2 1 + 0x60080003, // 0003 GETGBL R2 G3 + 0x5C0C0000, // 0004 MOVE R3 R0 + 0x7C080200, // 0005 CALL R2 1 + 0x8C080502, // 0006 GETMET R2 R2 K2 + 0x7C080200, // 0007 CALL R2 1 + 0x8C080303, // 0008 GETMET R2 R1 K3 + 0x7C080200, // 0009 CALL R2 1 + 0x8C0C0504, // 000A GETMET R3 R2 K4 + 0x58140005, // 000B LDCONST R5 K5 + 0x4C180000, // 000C LDNIL R6 + 0x7C0C0600, // 000D CALL R3 3 + 0x4C100000, // 000E LDNIL R4 + 0x1C100604, // 000F EQ R4 R3 R4 + 0x78120000, // 0010 JMPF R4 #0012 + 0x880C0106, // 0011 GETMBR R3 R0 K6 + 0x88100106, // 0012 GETMBR R4 R0 K6 + 0x20100604, // 0013 NE R4 R3 R4 + 0x78120005, // 0014 JMPF R4 #001B + 0x8C100107, // 0015 GETMET R4 R0 K7 + 0x4C180000, // 0016 LDNIL R6 + 0x541E02FF, // 0017 LDINT R7 768 + 0x54220006, // 0018 LDINT R8 7 + 0x7C100800, // 0019 CALL R4 4 + 0x90020C03, // 001A SETMBR R0 K6 R3 + 0x80000000, // 001B RET 0 + }) + ) +); +/*******************************************************************/ + + /******************************************************************** ** Solidified function: init ********************************************************************/ @@ -371,6 +267,110 @@ be_local_closure(Matter_Plugin_Light2_update_ct_minmax, /* name */ /*******************************************************************/ +/******************************************************************** +** Solidified function: invoke_request +********************************************************************/ +be_local_closure(Matter_Plugin_Light2_invoke_request, /* name */ + be_nested_proto( + 13, /* nstack */ + 4, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[15]) { /* constants */ + /* K0 */ be_nested_str_weak(light), + /* K1 */ be_nested_str_weak(matter), + /* K2 */ be_nested_str_weak(TLV), + /* K3 */ be_nested_str_weak(cluster), + /* K4 */ be_nested_str_weak(command), + /* K5 */ be_nested_str_weak(findsubval), + /* K6 */ be_const_int(0), + /* K7 */ be_nested_str_weak(ct_min), + /* K8 */ be_nested_str_weak(ct_max), + /* K9 */ be_nested_str_weak(set), + /* K10 */ be_nested_str_weak(ct), + /* K11 */ be_nested_str_weak(update_shadow), + /* K12 */ be_nested_str_weak(log), + /* K13 */ be_nested_str_weak(ct_X3A), + /* K14 */ be_nested_str_weak(invoke_request), + }), + be_str_weak(invoke_request), + &be_const_str_solidified, + ( &(const binstruction[65]) { /* code */ + 0xA4120000, // 0000 IMPORT R4 K0 + 0xB8160200, // 0001 GETNGBL R5 K1 + 0x88140B02, // 0002 GETMBR R5 R5 K2 + 0x88180703, // 0003 GETMBR R6 R3 K3 + 0x881C0704, // 0004 GETMBR R7 R3 K4 + 0x542202FF, // 0005 LDINT R8 768 + 0x1C200C08, // 0006 EQ R8 R6 R8 + 0x7822002E, // 0007 JMPF R8 #0037 + 0x54220009, // 0008 LDINT R8 10 + 0x1C200E08, // 0009 EQ R8 R7 R8 + 0x78220019, // 000A JMPF R8 #0025 + 0x8C200505, // 000B GETMET R8 R2 K5 + 0x58280006, // 000C LDCONST R10 K6 + 0x7C200400, // 000D CALL R8 2 + 0x88240107, // 000E GETMBR R9 R0 K7 + 0x14241009, // 000F LT R9 R8 R9 + 0x78260000, // 0010 JMPF R9 #0012 + 0x88200107, // 0011 GETMBR R8 R0 K7 + 0x88240108, // 0012 GETMBR R9 R0 K8 + 0x24241009, // 0013 GT R9 R8 R9 + 0x78260000, // 0014 JMPF R9 #0016 + 0x88200108, // 0015 GETMBR R8 R0 K8 + 0x8C240909, // 0016 GETMET R9 R4 K9 + 0x602C0013, // 0017 GETGBL R11 G19 + 0x7C2C0000, // 0018 CALL R11 0 + 0x982E1408, // 0019 SETIDX R11 K10 R8 + 0x7C240400, // 001A CALL R9 2 + 0x8C24010B, // 001B GETMET R9 R0 K11 + 0x7C240200, // 001C CALL R9 1 + 0x60240008, // 001D GETGBL R9 G8 + 0x5C281000, // 001E MOVE R10 R8 + 0x7C240200, // 001F CALL R9 1 + 0x00261A09, // 0020 ADD R9 K13 R9 + 0x900E1809, // 0021 SETMBR R3 K12 R9 + 0x50240200, // 0022 LDBOOL R9 1 0 + 0x80041200, // 0023 RET 1 R9 + 0x70020010, // 0024 JMP #0036 + 0x54220046, // 0025 LDINT R8 71 + 0x1C200E08, // 0026 EQ R8 R7 R8 + 0x78220002, // 0027 JMPF R8 #002B + 0x50200200, // 0028 LDBOOL R8 1 0 + 0x80041000, // 0029 RET 1 R8 + 0x7002000A, // 002A JMP #0036 + 0x5422004A, // 002B LDINT R8 75 + 0x1C200E08, // 002C EQ R8 R7 R8 + 0x78220002, // 002D JMPF R8 #0031 + 0x50200200, // 002E LDBOOL R8 1 0 + 0x80041000, // 002F RET 1 R8 + 0x70020004, // 0030 JMP #0036 + 0x5422004B, // 0031 LDINT R8 76 + 0x1C200E08, // 0032 EQ R8 R7 R8 + 0x78220001, // 0033 JMPF R8 #0036 + 0x50200200, // 0034 LDBOOL R8 1 0 + 0x80041000, // 0035 RET 1 R8 + 0x70020008, // 0036 JMP #0040 + 0x60200003, // 0037 GETGBL R8 G3 + 0x5C240000, // 0038 MOVE R9 R0 + 0x7C200200, // 0039 CALL R8 1 + 0x8C20110E, // 003A GETMET R8 R8 K14 + 0x5C280200, // 003B MOVE R10 R1 + 0x5C2C0400, // 003C MOVE R11 R2 + 0x5C300600, // 003D MOVE R12 R3 + 0x7C200800, // 003E CALL R8 4 + 0x80041000, // 003F RET 1 R8 + 0x80000000, // 0040 RET 0 + }) + ) +); +/*******************************************************************/ + + /******************************************************************** ** Solidified class: Matter_Plugin_Light2 ********************************************************************/ @@ -378,19 +378,23 @@ extern const bclass be_class_Matter_Plugin_Light1; be_local_class(Matter_Plugin_Light2, 3, &be_class_Matter_Plugin_Light1, - be_nested_map(11, + be_nested_map(12, ( (struct bmapnode*) &(const bmapnode[]) { - { be_const_key_weak(update_ct_minmax, -1), be_const_closure(Matter_Plugin_Light2_update_ct_minmax_closure) }, - { be_const_key_weak(update_shadow, -1), be_const_closure(Matter_Plugin_Light2_update_shadow_closure) }, - { be_const_key_weak(NAME, 5), be_nested_str_weak(light2) }, - { be_const_key_weak(read_attribute, 8), be_const_closure(Matter_Plugin_Light2_read_attribute_closure) }, + { be_const_key_weak(ct_min, -1), be_const_var(1) }, + { be_const_key_weak(shadow_ct, 8), be_const_var(0) }, { be_const_key_weak(TYPES, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { be_const_map( * be_nested_map(1, ( (struct bmapnode*) &(const bmapnode[]) { { be_const_key_int(268, -1), be_const_int(2) }, })) ) } )) }, - { be_const_key_weak(ct_min, 1), be_const_var(1) }, - { be_const_key_weak(CLUSTERS, 2), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { + { be_const_key_weak(ct_max, 7), be_const_var(2) }, + { be_const_key_weak(TYPE, 0), be_nested_str_weak(light2) }, + { be_const_key_weak(read_attribute, -1), be_const_closure(Matter_Plugin_Light2_read_attribute_closure) }, + { be_const_key_weak(NAME, 5), be_nested_str_weak(Light_X202_X20CT) }, + { be_const_key_weak(init, -1), be_const_closure(Matter_Plugin_Light2_init_closure) }, + { be_const_key_weak(update_shadow, 4), be_const_closure(Matter_Plugin_Light2_update_shadow_closure) }, + { be_const_key_weak(update_ct_minmax, -1), be_const_closure(Matter_Plugin_Light2_update_ct_minmax_closure) }, + { be_const_key_weak(CLUSTERS, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { be_const_map( * be_nested_map(1, ( (struct bmapnode*) &(const bmapnode[]) { { be_const_key_int(768, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_list, { @@ -405,10 +409,7 @@ be_local_class(Matter_Plugin_Light2, be_const_int(65533), })) ) } )) }, })) ) } )) }, - { be_const_key_weak(shadow_ct, -1), be_const_var(0) }, - { be_const_key_weak(ct_max, -1), be_const_var(2) }, - { be_const_key_weak(init, -1), be_const_closure(Matter_Plugin_Light2_init_closure) }, - { be_const_key_weak(invoke_request, 0), be_const_closure(Matter_Plugin_Light2_invoke_request_closure) }, + { be_const_key_weak(invoke_request, -1), be_const_closure(Matter_Plugin_Light2_invoke_request_closure) }, })), be_str_weak(Matter_Plugin_Light2) ); diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Light3.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Light3.h index da74ed5c4..b4ebe2fd7 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Light3.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Light3.h @@ -6,6 +6,287 @@ extern const bclass be_class_Matter_Plugin_Light3; +/******************************************************************** +** Solidified function: update_shadow +********************************************************************/ +be_local_closure(Matter_Plugin_Light3_update_shadow, /* name */ + be_nested_proto( + 12, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[13]) { /* constants */ + /* K0 */ be_nested_str_weak(light), + /* K1 */ be_nested_str_weak(update_shadow), + /* K2 */ be_nested_str_weak(get), + /* K3 */ be_nested_str_weak(find), + /* K4 */ be_nested_str_weak(hue), + /* K5 */ be_nested_str_weak(sat), + /* K6 */ be_nested_str_weak(tasmota), + /* K7 */ be_nested_str_weak(scale_uint), + /* K8 */ be_const_int(0), + /* K9 */ be_nested_str_weak(shadow_hue), + /* K10 */ be_nested_str_weak(shadow_sat), + /* K11 */ be_nested_str_weak(attribute_updated), + /* K12 */ be_const_int(1), + }), + be_str_weak(update_shadow), + &be_const_str_solidified, + ( &(const binstruction[63]) { /* code */ + 0xA4060000, // 0000 IMPORT R1 K0 + 0x60080003, // 0001 GETGBL R2 G3 + 0x5C0C0000, // 0002 MOVE R3 R0 + 0x7C080200, // 0003 CALL R2 1 + 0x8C080501, // 0004 GETMET R2 R2 K1 + 0x7C080200, // 0005 CALL R2 1 + 0x8C080302, // 0006 GETMET R2 R1 K2 + 0x7C080200, // 0007 CALL R2 1 + 0x8C0C0503, // 0008 GETMET R3 R2 K3 + 0x58140004, // 0009 LDCONST R5 K4 + 0x4C180000, // 000A LDNIL R6 + 0x7C0C0600, // 000B CALL R3 3 + 0x8C100503, // 000C GETMET R4 R2 K3 + 0x58180005, // 000D LDCONST R6 K5 + 0x4C1C0000, // 000E LDNIL R7 + 0x7C100600, // 000F CALL R4 3 + 0x4C140000, // 0010 LDNIL R5 + 0x20140605, // 0011 NE R5 R3 R5 + 0x78160009, // 0012 JMPF R5 #001D + 0xB8160C00, // 0013 GETNGBL R5 K6 + 0x8C140B07, // 0014 GETMET R5 R5 K7 + 0x5C1C0600, // 0015 MOVE R7 R3 + 0x58200008, // 0016 LDCONST R8 K8 + 0x54260167, // 0017 LDINT R9 360 + 0x58280008, // 0018 LDCONST R10 K8 + 0x542E00FD, // 0019 LDINT R11 254 + 0x7C140C00, // 001A CALL R5 6 + 0x5C0C0A00, // 001B MOVE R3 R5 + 0x70020000, // 001C JMP #001E + 0x880C0109, // 001D GETMBR R3 R0 K9 + 0x4C140000, // 001E LDNIL R5 + 0x20140805, // 001F NE R5 R4 R5 + 0x78160009, // 0020 JMPF R5 #002B + 0xB8160C00, // 0021 GETNGBL R5 K6 + 0x8C140B07, // 0022 GETMET R5 R5 K7 + 0x5C1C0800, // 0023 MOVE R7 R4 + 0x58200008, // 0024 LDCONST R8 K8 + 0x542600FE, // 0025 LDINT R9 255 + 0x58280008, // 0026 LDCONST R10 K8 + 0x542E00FD, // 0027 LDINT R11 254 + 0x7C140C00, // 0028 CALL R5 6 + 0x5C100A00, // 0029 MOVE R4 R5 + 0x70020000, // 002A JMP #002C + 0x8810010A, // 002B GETMBR R4 R0 K10 + 0x88140109, // 002C GETMBR R5 R0 K9 + 0x20140605, // 002D NE R5 R3 R5 + 0x78160005, // 002E JMPF R5 #0035 + 0x8C14010B, // 002F GETMET R5 R0 K11 + 0x4C1C0000, // 0030 LDNIL R7 + 0x542202FF, // 0031 LDINT R8 768 + 0x58240008, // 0032 LDCONST R9 K8 + 0x7C140800, // 0033 CALL R5 4 + 0x90021203, // 0034 SETMBR R0 K9 R3 + 0x8814010A, // 0035 GETMBR R5 R0 K10 + 0x20140805, // 0036 NE R5 R4 R5 + 0x78160005, // 0037 JMPF R5 #003E + 0x8C14010B, // 0038 GETMET R5 R0 K11 + 0x4C1C0000, // 0039 LDNIL R7 + 0x542202FF, // 003A LDINT R8 768 + 0x5824000C, // 003B LDCONST R9 K12 + 0x7C140800, // 003C CALL R5 4 + 0x90021404, // 003D SETMBR R0 K10 R4 + 0x80000000, // 003E RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: read_attribute +********************************************************************/ +be_local_closure(Matter_Plugin_Light3_read_attribute, /* name */ + be_nested_proto( + 11, /* nstack */ + 3, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[13]) { /* constants */ + /* K0 */ be_nested_str_weak(string), + /* K1 */ be_nested_str_weak(matter), + /* K2 */ be_nested_str_weak(TLV), + /* K3 */ be_nested_str_weak(cluster), + /* K4 */ be_nested_str_weak(attribute), + /* K5 */ be_const_int(0), + /* K6 */ be_nested_str_weak(create_TLV), + /* K7 */ be_nested_str_weak(U1), + /* K8 */ be_nested_str_weak(shadow_hue), + /* K9 */ be_const_int(1), + /* K10 */ be_nested_str_weak(shadow_sat), + /* K11 */ be_nested_str_weak(U4), + /* K12 */ be_nested_str_weak(read_attribute), + }), + be_str_weak(read_attribute), + &be_const_str_solidified, + ( &(const binstruction[105]) { /* code */ + 0xA40E0000, // 0000 IMPORT R3 K0 + 0xB8120200, // 0001 GETNGBL R4 K1 + 0x88100902, // 0002 GETMBR R4 R4 K2 + 0x88140503, // 0003 GETMBR R5 R2 K3 + 0x88180504, // 0004 GETMBR R6 R2 K4 + 0x541E02FF, // 0005 LDINT R7 768 + 0x1C1C0A07, // 0006 EQ R7 R5 R7 + 0x781E0057, // 0007 JMPF R7 #0060 + 0x1C1C0D05, // 0008 EQ R7 R6 K5 + 0x781E0005, // 0009 JMPF R7 #0010 + 0x8C1C0906, // 000A GETMET R7 R4 K6 + 0x88240907, // 000B GETMBR R9 R4 K7 + 0x88280108, // 000C GETMBR R10 R0 K8 + 0x7C1C0600, // 000D CALL R7 3 + 0x80040E00, // 000E RET 1 R7 + 0x7002004E, // 000F JMP #005F + 0x1C1C0D09, // 0010 EQ R7 R6 K9 + 0x781E0005, // 0011 JMPF R7 #0018 + 0x8C1C0906, // 0012 GETMET R7 R4 K6 + 0x88240907, // 0013 GETMBR R9 R4 K7 + 0x8828010A, // 0014 GETMBR R10 R0 K10 + 0x7C1C0600, // 0015 CALL R7 3 + 0x80040E00, // 0016 RET 1 R7 + 0x70020046, // 0017 JMP #005F + 0x541E0006, // 0018 LDINT R7 7 + 0x1C1C0C07, // 0019 EQ R7 R6 R7 + 0x781E0005, // 001A JMPF R7 #0021 + 0x8C1C0906, // 001B GETMET R7 R4 K6 + 0x88240907, // 001C GETMBR R9 R4 K7 + 0x58280005, // 001D LDCONST R10 K5 + 0x7C1C0600, // 001E CALL R7 3 + 0x80040E00, // 001F RET 1 R7 + 0x7002003D, // 0020 JMP #005F + 0x541E0007, // 0021 LDINT R7 8 + 0x1C1C0C07, // 0022 EQ R7 R6 R7 + 0x781E0005, // 0023 JMPF R7 #002A + 0x8C1C0906, // 0024 GETMET R7 R4 K6 + 0x88240907, // 0025 GETMBR R9 R4 K7 + 0x58280005, // 0026 LDCONST R10 K5 + 0x7C1C0600, // 0027 CALL R7 3 + 0x80040E00, // 0028 RET 1 R7 + 0x70020034, // 0029 JMP #005F + 0x541E000E, // 002A LDINT R7 15 + 0x1C1C0C07, // 002B EQ R7 R6 R7 + 0x781E0005, // 002C JMPF R7 #0033 + 0x8C1C0906, // 002D GETMET R7 R4 K6 + 0x88240907, // 002E GETMBR R9 R4 K7 + 0x58280005, // 002F LDCONST R10 K5 + 0x7C1C0600, // 0030 CALL R7 3 + 0x80040E00, // 0031 RET 1 R7 + 0x7002002B, // 0032 JMP #005F + 0x541E4000, // 0033 LDINT R7 16385 + 0x1C1C0C07, // 0034 EQ R7 R6 R7 + 0x781E0005, // 0035 JMPF R7 #003C + 0x8C1C0906, // 0036 GETMET R7 R4 K6 + 0x88240907, // 0037 GETMBR R9 R4 K7 + 0x58280005, // 0038 LDCONST R10 K5 + 0x7C1C0600, // 0039 CALL R7 3 + 0x80040E00, // 003A RET 1 R7 + 0x70020022, // 003B JMP #005F + 0x541E4009, // 003C LDINT R7 16394 + 0x1C1C0C07, // 003D EQ R7 R6 R7 + 0x781E0005, // 003E JMPF R7 #0045 + 0x8C1C0906, // 003F GETMET R7 R4 K6 + 0x88240907, // 0040 GETMBR R9 R4 K7 + 0x58280005, // 0041 LDCONST R10 K5 + 0x7C1C0600, // 0042 CALL R7 3 + 0x80040E00, // 0043 RET 1 R7 + 0x70020019, // 0044 JMP #005F + 0x541E000F, // 0045 LDINT R7 16 + 0x1C1C0C07, // 0046 EQ R7 R6 R7 + 0x781E0005, // 0047 JMPF R7 #004E + 0x8C1C0906, // 0048 GETMET R7 R4 K6 + 0x88240907, // 0049 GETMBR R9 R4 K7 + 0x58280005, // 004A LDCONST R10 K5 + 0x7C1C0600, // 004B CALL R7 3 + 0x80040E00, // 004C RET 1 R7 + 0x70020010, // 004D JMP #005F + 0x541EFFFB, // 004E LDINT R7 65532 + 0x1C1C0C07, // 004F EQ R7 R6 R7 + 0x781E0005, // 0050 JMPF R7 #0057 + 0x8C1C0906, // 0051 GETMET R7 R4 K6 + 0x8824090B, // 0052 GETMBR R9 R4 K11 + 0x58280009, // 0053 LDCONST R10 K9 + 0x7C1C0600, // 0054 CALL R7 3 + 0x80040E00, // 0055 RET 1 R7 + 0x70020007, // 0056 JMP #005F + 0x541EFFFC, // 0057 LDINT R7 65533 + 0x1C1C0C07, // 0058 EQ R7 R6 R7 + 0x781E0004, // 0059 JMPF R7 #005F + 0x8C1C0906, // 005A GETMET R7 R4 K6 + 0x8824090B, // 005B GETMBR R9 R4 K11 + 0x542A0004, // 005C LDINT R10 5 + 0x7C1C0600, // 005D CALL R7 3 + 0x80040E00, // 005E RET 1 R7 + 0x70020007, // 005F JMP #0068 + 0x601C0003, // 0060 GETGBL R7 G3 + 0x5C200000, // 0061 MOVE R8 R0 + 0x7C1C0200, // 0062 CALL R7 1 + 0x8C1C0F0C, // 0063 GETMET R7 R7 K12 + 0x5C240200, // 0064 MOVE R9 R1 + 0x5C280400, // 0065 MOVE R10 R2 + 0x7C1C0600, // 0066 CALL R7 3 + 0x80040E00, // 0067 RET 1 R7 + 0x80000000, // 0068 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: init +********************************************************************/ +be_local_closure(Matter_Plugin_Light3_init, /* name */ + be_nested_proto( + 9, /* nstack */ + 4, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 4]) { /* constants */ + /* K0 */ be_nested_str_weak(init), + /* K1 */ be_nested_str_weak(shadow_hue), + /* K2 */ be_const_int(0), + /* K3 */ be_nested_str_weak(shadow_sat), + }), + be_str_weak(init), + &be_const_str_solidified, + ( &(const binstruction[11]) { /* code */ + 0x60100003, // 0000 GETGBL R4 G3 + 0x5C140000, // 0001 MOVE R5 R0 + 0x7C100200, // 0002 CALL R4 1 + 0x8C100900, // 0003 GETMET R4 R4 K0 + 0x5C180200, // 0004 MOVE R6 R1 + 0x5C1C0400, // 0005 MOVE R7 R2 + 0x5C200600, // 0006 MOVE R8 R3 + 0x7C100800, // 0007 CALL R4 4 + 0x90020302, // 0008 SETMBR R0 K1 K2 + 0x90020702, // 0009 SETMBR R0 K3 K2 + 0x80000000, // 000A RET 0 + }) + ) +); +/*******************************************************************/ + + /******************************************************************** ** Solidified function: invoke_request ********************************************************************/ @@ -199,287 +480,6 @@ be_local_closure(Matter_Plugin_Light3_invoke_request, /* name */ /*******************************************************************/ -/******************************************************************** -** Solidified function: read_attribute -********************************************************************/ -be_local_closure(Matter_Plugin_Light3_read_attribute, /* name */ - be_nested_proto( - 11, /* nstack */ - 3, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[13]) { /* constants */ - /* K0 */ be_nested_str_weak(string), - /* K1 */ be_nested_str_weak(matter), - /* K2 */ be_nested_str_weak(TLV), - /* K3 */ be_nested_str_weak(cluster), - /* K4 */ be_nested_str_weak(attribute), - /* K5 */ be_const_int(0), - /* K6 */ be_nested_str_weak(create_TLV), - /* K7 */ be_nested_str_weak(U1), - /* K8 */ be_nested_str_weak(shadow_hue), - /* K9 */ be_const_int(1), - /* K10 */ be_nested_str_weak(shadow_sat), - /* K11 */ be_nested_str_weak(U4), - /* K12 */ be_nested_str_weak(read_attribute), - }), - be_str_weak(read_attribute), - &be_const_str_solidified, - ( &(const binstruction[105]) { /* code */ - 0xA40E0000, // 0000 IMPORT R3 K0 - 0xB8120200, // 0001 GETNGBL R4 K1 - 0x88100902, // 0002 GETMBR R4 R4 K2 - 0x88140503, // 0003 GETMBR R5 R2 K3 - 0x88180504, // 0004 GETMBR R6 R2 K4 - 0x541E02FF, // 0005 LDINT R7 768 - 0x1C1C0A07, // 0006 EQ R7 R5 R7 - 0x781E0057, // 0007 JMPF R7 #0060 - 0x1C1C0D05, // 0008 EQ R7 R6 K5 - 0x781E0005, // 0009 JMPF R7 #0010 - 0x8C1C0906, // 000A GETMET R7 R4 K6 - 0x88240907, // 000B GETMBR R9 R4 K7 - 0x88280108, // 000C GETMBR R10 R0 K8 - 0x7C1C0600, // 000D CALL R7 3 - 0x80040E00, // 000E RET 1 R7 - 0x7002004E, // 000F JMP #005F - 0x1C1C0D09, // 0010 EQ R7 R6 K9 - 0x781E0005, // 0011 JMPF R7 #0018 - 0x8C1C0906, // 0012 GETMET R7 R4 K6 - 0x88240907, // 0013 GETMBR R9 R4 K7 - 0x8828010A, // 0014 GETMBR R10 R0 K10 - 0x7C1C0600, // 0015 CALL R7 3 - 0x80040E00, // 0016 RET 1 R7 - 0x70020046, // 0017 JMP #005F - 0x541E0006, // 0018 LDINT R7 7 - 0x1C1C0C07, // 0019 EQ R7 R6 R7 - 0x781E0005, // 001A JMPF R7 #0021 - 0x8C1C0906, // 001B GETMET R7 R4 K6 - 0x88240907, // 001C GETMBR R9 R4 K7 - 0x58280005, // 001D LDCONST R10 K5 - 0x7C1C0600, // 001E CALL R7 3 - 0x80040E00, // 001F RET 1 R7 - 0x7002003D, // 0020 JMP #005F - 0x541E0007, // 0021 LDINT R7 8 - 0x1C1C0C07, // 0022 EQ R7 R6 R7 - 0x781E0005, // 0023 JMPF R7 #002A - 0x8C1C0906, // 0024 GETMET R7 R4 K6 - 0x88240907, // 0025 GETMBR R9 R4 K7 - 0x58280005, // 0026 LDCONST R10 K5 - 0x7C1C0600, // 0027 CALL R7 3 - 0x80040E00, // 0028 RET 1 R7 - 0x70020034, // 0029 JMP #005F - 0x541E000E, // 002A LDINT R7 15 - 0x1C1C0C07, // 002B EQ R7 R6 R7 - 0x781E0005, // 002C JMPF R7 #0033 - 0x8C1C0906, // 002D GETMET R7 R4 K6 - 0x88240907, // 002E GETMBR R9 R4 K7 - 0x58280005, // 002F LDCONST R10 K5 - 0x7C1C0600, // 0030 CALL R7 3 - 0x80040E00, // 0031 RET 1 R7 - 0x7002002B, // 0032 JMP #005F - 0x541E4000, // 0033 LDINT R7 16385 - 0x1C1C0C07, // 0034 EQ R7 R6 R7 - 0x781E0005, // 0035 JMPF R7 #003C - 0x8C1C0906, // 0036 GETMET R7 R4 K6 - 0x88240907, // 0037 GETMBR R9 R4 K7 - 0x58280005, // 0038 LDCONST R10 K5 - 0x7C1C0600, // 0039 CALL R7 3 - 0x80040E00, // 003A RET 1 R7 - 0x70020022, // 003B JMP #005F - 0x541E4009, // 003C LDINT R7 16394 - 0x1C1C0C07, // 003D EQ R7 R6 R7 - 0x781E0005, // 003E JMPF R7 #0045 - 0x8C1C0906, // 003F GETMET R7 R4 K6 - 0x88240907, // 0040 GETMBR R9 R4 K7 - 0x58280005, // 0041 LDCONST R10 K5 - 0x7C1C0600, // 0042 CALL R7 3 - 0x80040E00, // 0043 RET 1 R7 - 0x70020019, // 0044 JMP #005F - 0x541E000F, // 0045 LDINT R7 16 - 0x1C1C0C07, // 0046 EQ R7 R6 R7 - 0x781E0005, // 0047 JMPF R7 #004E - 0x8C1C0906, // 0048 GETMET R7 R4 K6 - 0x88240907, // 0049 GETMBR R9 R4 K7 - 0x58280005, // 004A LDCONST R10 K5 - 0x7C1C0600, // 004B CALL R7 3 - 0x80040E00, // 004C RET 1 R7 - 0x70020010, // 004D JMP #005F - 0x541EFFFB, // 004E LDINT R7 65532 - 0x1C1C0C07, // 004F EQ R7 R6 R7 - 0x781E0005, // 0050 JMPF R7 #0057 - 0x8C1C0906, // 0051 GETMET R7 R4 K6 - 0x8824090B, // 0052 GETMBR R9 R4 K11 - 0x58280009, // 0053 LDCONST R10 K9 - 0x7C1C0600, // 0054 CALL R7 3 - 0x80040E00, // 0055 RET 1 R7 - 0x70020007, // 0056 JMP #005F - 0x541EFFFC, // 0057 LDINT R7 65533 - 0x1C1C0C07, // 0058 EQ R7 R6 R7 - 0x781E0004, // 0059 JMPF R7 #005F - 0x8C1C0906, // 005A GETMET R7 R4 K6 - 0x8824090B, // 005B GETMBR R9 R4 K11 - 0x542A0004, // 005C LDINT R10 5 - 0x7C1C0600, // 005D CALL R7 3 - 0x80040E00, // 005E RET 1 R7 - 0x70020007, // 005F JMP #0068 - 0x601C0003, // 0060 GETGBL R7 G3 - 0x5C200000, // 0061 MOVE R8 R0 - 0x7C1C0200, // 0062 CALL R7 1 - 0x8C1C0F0C, // 0063 GETMET R7 R7 K12 - 0x5C240200, // 0064 MOVE R9 R1 - 0x5C280400, // 0065 MOVE R10 R2 - 0x7C1C0600, // 0066 CALL R7 3 - 0x80040E00, // 0067 RET 1 R7 - 0x80000000, // 0068 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: update_shadow -********************************************************************/ -be_local_closure(Matter_Plugin_Light3_update_shadow, /* name */ - be_nested_proto( - 12, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[13]) { /* constants */ - /* K0 */ be_nested_str_weak(light), - /* K1 */ be_nested_str_weak(update_shadow), - /* K2 */ be_nested_str_weak(get), - /* K3 */ be_nested_str_weak(find), - /* K4 */ be_nested_str_weak(hue), - /* K5 */ be_nested_str_weak(sat), - /* K6 */ be_nested_str_weak(tasmota), - /* K7 */ be_nested_str_weak(scale_uint), - /* K8 */ be_const_int(0), - /* K9 */ be_nested_str_weak(shadow_hue), - /* K10 */ be_nested_str_weak(shadow_sat), - /* K11 */ be_nested_str_weak(attribute_updated), - /* K12 */ be_const_int(1), - }), - be_str_weak(update_shadow), - &be_const_str_solidified, - ( &(const binstruction[63]) { /* code */ - 0xA4060000, // 0000 IMPORT R1 K0 - 0x60080003, // 0001 GETGBL R2 G3 - 0x5C0C0000, // 0002 MOVE R3 R0 - 0x7C080200, // 0003 CALL R2 1 - 0x8C080501, // 0004 GETMET R2 R2 K1 - 0x7C080200, // 0005 CALL R2 1 - 0x8C080302, // 0006 GETMET R2 R1 K2 - 0x7C080200, // 0007 CALL R2 1 - 0x8C0C0503, // 0008 GETMET R3 R2 K3 - 0x58140004, // 0009 LDCONST R5 K4 - 0x4C180000, // 000A LDNIL R6 - 0x7C0C0600, // 000B CALL R3 3 - 0x8C100503, // 000C GETMET R4 R2 K3 - 0x58180005, // 000D LDCONST R6 K5 - 0x4C1C0000, // 000E LDNIL R7 - 0x7C100600, // 000F CALL R4 3 - 0x4C140000, // 0010 LDNIL R5 - 0x20140605, // 0011 NE R5 R3 R5 - 0x78160009, // 0012 JMPF R5 #001D - 0xB8160C00, // 0013 GETNGBL R5 K6 - 0x8C140B07, // 0014 GETMET R5 R5 K7 - 0x5C1C0600, // 0015 MOVE R7 R3 - 0x58200008, // 0016 LDCONST R8 K8 - 0x54260167, // 0017 LDINT R9 360 - 0x58280008, // 0018 LDCONST R10 K8 - 0x542E00FD, // 0019 LDINT R11 254 - 0x7C140C00, // 001A CALL R5 6 - 0x5C0C0A00, // 001B MOVE R3 R5 - 0x70020000, // 001C JMP #001E - 0x880C0109, // 001D GETMBR R3 R0 K9 - 0x4C140000, // 001E LDNIL R5 - 0x20140805, // 001F NE R5 R4 R5 - 0x78160009, // 0020 JMPF R5 #002B - 0xB8160C00, // 0021 GETNGBL R5 K6 - 0x8C140B07, // 0022 GETMET R5 R5 K7 - 0x5C1C0800, // 0023 MOVE R7 R4 - 0x58200008, // 0024 LDCONST R8 K8 - 0x542600FE, // 0025 LDINT R9 255 - 0x58280008, // 0026 LDCONST R10 K8 - 0x542E00FD, // 0027 LDINT R11 254 - 0x7C140C00, // 0028 CALL R5 6 - 0x5C100A00, // 0029 MOVE R4 R5 - 0x70020000, // 002A JMP #002C - 0x8810010A, // 002B GETMBR R4 R0 K10 - 0x88140109, // 002C GETMBR R5 R0 K9 - 0x20140605, // 002D NE R5 R3 R5 - 0x78160005, // 002E JMPF R5 #0035 - 0x8C14010B, // 002F GETMET R5 R0 K11 - 0x4C1C0000, // 0030 LDNIL R7 - 0x542202FF, // 0031 LDINT R8 768 - 0x58240008, // 0032 LDCONST R9 K8 - 0x7C140800, // 0033 CALL R5 4 - 0x90021203, // 0034 SETMBR R0 K9 R3 - 0x8814010A, // 0035 GETMBR R5 R0 K10 - 0x20140805, // 0036 NE R5 R4 R5 - 0x78160005, // 0037 JMPF R5 #003E - 0x8C14010B, // 0038 GETMET R5 R0 K11 - 0x4C1C0000, // 0039 LDNIL R7 - 0x542202FF, // 003A LDINT R8 768 - 0x5824000C, // 003B LDCONST R9 K12 - 0x7C140800, // 003C CALL R5 4 - 0x90021404, // 003D SETMBR R0 K10 R4 - 0x80000000, // 003E RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: init -********************************************************************/ -be_local_closure(Matter_Plugin_Light3_init, /* name */ - be_nested_proto( - 9, /* nstack */ - 4, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 4]) { /* constants */ - /* K0 */ be_nested_str_weak(init), - /* K1 */ be_nested_str_weak(shadow_hue), - /* K2 */ be_const_int(0), - /* K3 */ be_nested_str_weak(shadow_sat), - }), - be_str_weak(init), - &be_const_str_solidified, - ( &(const binstruction[11]) { /* code */ - 0x60100003, // 0000 GETGBL R4 G3 - 0x5C140000, // 0001 MOVE R5 R0 - 0x7C100200, // 0002 CALL R4 1 - 0x8C100900, // 0003 GETMET R4 R4 K0 - 0x5C180200, // 0004 MOVE R6 R1 - 0x5C1C0400, // 0005 MOVE R7 R2 - 0x5C200600, // 0006 MOVE R8 R3 - 0x7C100800, // 0007 CALL R4 4 - 0x90020302, // 0008 SETMBR R0 K1 K2 - 0x90020702, // 0009 SETMBR R0 K3 K2 - 0x80000000, // 000A RET 0 - }) - ) -); -/*******************************************************************/ - - /******************************************************************** ** Solidified class: Matter_Plugin_Light3 ********************************************************************/ @@ -487,20 +487,15 @@ extern const bclass be_class_Matter_Plugin_Light1; be_local_class(Matter_Plugin_Light3, 2, &be_class_Matter_Plugin_Light1, - be_nested_map(9, + be_nested_map(10, ( (struct bmapnode*) &(const bmapnode[]) { - { be_const_key_weak(init, -1), be_const_closure(Matter_Plugin_Light3_init_closure) }, - { be_const_key_weak(shadow_sat, -1), be_const_var(1) }, { be_const_key_weak(TYPES, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { be_const_map( * be_nested_map(1, ( (struct bmapnode*) &(const bmapnode[]) { { be_const_key_int(269, -1), be_const_int(2) }, })) ) } )) }, - { be_const_key_weak(NAME, -1), be_nested_str_weak(light3) }, + { be_const_key_weak(TYPE, -1), be_nested_str_weak(light3) }, { be_const_key_weak(shadow_hue, 8), be_const_var(0) }, - { be_const_key_weak(invoke_request, -1), be_const_closure(Matter_Plugin_Light3_invoke_request_closure) }, - { be_const_key_weak(read_attribute, 0), be_const_closure(Matter_Plugin_Light3_read_attribute_closure) }, - { be_const_key_weak(update_shadow, -1), be_const_closure(Matter_Plugin_Light3_update_shadow_closure) }, { be_const_key_weak(CLUSTERS, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { be_const_map( * be_nested_map(1, ( (struct bmapnode*) &(const bmapnode[]) { @@ -518,6 +513,12 @@ be_local_class(Matter_Plugin_Light3, be_const_int(65533), })) ) } )) }, })) ) } )) }, + { be_const_key_weak(NAME, 3), be_nested_str_weak(Light_X203_X20RGB) }, + { be_const_key_weak(init, -1), be_const_closure(Matter_Plugin_Light3_init_closure) }, + { be_const_key_weak(shadow_sat, -1), be_const_var(1) }, + { be_const_key_weak(invoke_request, -1), be_const_closure(Matter_Plugin_Light3_invoke_request_closure) }, + { be_const_key_weak(read_attribute, -1), be_const_closure(Matter_Plugin_Light3_read_attribute_closure) }, + { be_const_key_weak(update_shadow, 1), be_const_closure(Matter_Plugin_Light3_update_shadow_closure) }, })), be_str_weak(Matter_Plugin_Light3) ); diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_OnOff.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_OnOff.h index 24b8911b4..509ff2714 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_OnOff.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_OnOff.h @@ -7,94 +7,49 @@ extern const bclass be_class_Matter_Plugin_OnOff; /******************************************************************** -** Solidified function: get_onoff +** Solidified function: init ********************************************************************/ -be_local_closure(Matter_Plugin_OnOff_get_onoff, /* name */ +be_local_closure(Matter_Plugin_OnOff_init, /* name */ be_nested_proto( - 5, /* nstack */ - 1, /* argc */ + 9, /* nstack */ + 4, /* argc */ 2, /* varg */ 0, /* has upvals */ NULL, /* no upvals */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[ 5]) { /* constants */ - /* K0 */ be_nested_str_weak(tasmota), - /* K1 */ be_nested_str_weak(get_power), + ( &(const bvalue[ 6]) { /* constants */ + /* K0 */ be_nested_str_weak(init), + /* K1 */ be_nested_str_weak(get_onoff), /* K2 */ be_nested_str_weak(tasmota_relay_index), - /* K3 */ be_nested_str_weak(shadow_onoff), - /* K4 */ be_nested_str_weak(onoff_changed), + /* K3 */ be_nested_str_weak(find), + /* K4 */ be_nested_str_weak(ARG), + /* K5 */ be_const_int(0), }), - be_str_weak(get_onoff), + be_str_weak(init), &be_const_str_solidified, - ( &(const binstruction[28]) { /* code */ - 0xB8060000, // 0000 GETNGBL R1 K0 - 0x8C040301, // 0001 GETMET R1 R1 K1 - 0x880C0102, // 0002 GETMBR R3 R0 K2 - 0x7C040400, // 0003 CALL R1 2 - 0x4C080000, // 0004 LDNIL R2 - 0x20080202, // 0005 NE R2 R1 R2 - 0x780A000C, // 0006 JMPF R2 #0014 - 0x88080103, // 0007 GETMBR R2 R0 K3 - 0x4C0C0000, // 0008 LDNIL R3 - 0x20080403, // 0009 NE R2 R2 R3 - 0x780A0007, // 000A JMPF R2 #0013 - 0x88080103, // 000B GETMBR R2 R0 K3 - 0x600C0017, // 000C GETGBL R3 G23 - 0x5C100200, // 000D MOVE R4 R1 - 0x7C0C0200, // 000E CALL R3 1 - 0x20080403, // 000F NE R2 R2 R3 - 0x780A0001, // 0010 JMPF R2 #0013 - 0x8C080104, // 0011 GETMET R2 R0 K4 - 0x7C080200, // 0012 CALL R2 1 - 0x90020601, // 0013 SETMBR R0 K3 R1 - 0x88080103, // 0014 GETMBR R2 R0 K3 - 0x4C0C0000, // 0015 LDNIL R3 - 0x1C080403, // 0016 EQ R2 R2 R3 - 0x780A0001, // 0017 JMPF R2 #001A - 0x50080000, // 0018 LDBOOL R2 0 0 - 0x90020602, // 0019 SETMBR R0 K3 R2 - 0x88080103, // 001A GETMBR R2 R0 K3 - 0x80040400, // 001B RET 1 R2 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: set_onoff -********************************************************************/ -be_local_closure(Matter_Plugin_OnOff_set_onoff, /* name */ - be_nested_proto( - 7, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 4]) { /* constants */ - /* K0 */ be_nested_str_weak(tasmota), - /* K1 */ be_nested_str_weak(set_power), - /* K2 */ be_nested_str_weak(tasmota_relay_index), - /* K3 */ be_nested_str_weak(get_onoff), - }), - be_str_weak(set_onoff), - &be_const_str_solidified, - ( &(const binstruction[10]) { /* code */ - 0xB80A0000, // 0000 GETNGBL R2 K0 - 0x8C080501, // 0001 GETMET R2 R2 K1 - 0x88100102, // 0002 GETMBR R4 R0 K2 - 0x60140017, // 0003 GETGBL R5 G23 + ( &(const binstruction[20]) { /* code */ + 0x60100003, // 0000 GETGBL R4 G3 + 0x5C140000, // 0001 MOVE R5 R0 + 0x7C100200, // 0002 CALL R4 1 + 0x8C100900, // 0003 GETMET R4 R4 K0 0x5C180200, // 0004 MOVE R6 R1 - 0x7C140200, // 0005 CALL R5 1 - 0x7C080600, // 0006 CALL R2 3 - 0x8C080103, // 0007 GETMET R2 R0 K3 - 0x7C080200, // 0008 CALL R2 1 - 0x80000000, // 0009 RET 0 + 0x5C1C0400, // 0005 MOVE R7 R2 + 0x5C200600, // 0006 MOVE R8 R3 + 0x7C100800, // 0007 CALL R4 4 + 0x8C100101, // 0008 GETMET R4 R0 K1 + 0x7C100200, // 0009 CALL R4 1 + 0x8C100703, // 000A GETMET R4 R3 K3 + 0x88180104, // 000B GETMBR R6 R0 K4 + 0x7C100400, // 000C CALL R4 2 + 0x90020404, // 000D SETMBR R0 K2 R4 + 0x88100102, // 000E GETMBR R4 R0 K2 + 0x4C140000, // 000F LDNIL R5 + 0x1C100805, // 0010 EQ R4 R4 R5 + 0x78120000, // 0011 JMPF R4 #0013 + 0x90020505, // 0012 SETMBR R0 K2 K5 + 0x80000000, // 0013 RET 0 }) ) ); @@ -258,91 +213,9 @@ be_local_closure(Matter_Plugin_OnOff_invoke_request, /* name */ /******************************************************************** -** Solidified function: init +** Solidified function: set_onoff ********************************************************************/ -be_local_closure(Matter_Plugin_OnOff_init, /* name */ - be_nested_proto( - 9, /* nstack */ - 4, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 6]) { /* constants */ - /* K0 */ be_nested_str_weak(init), - /* K1 */ be_nested_str_weak(get_onoff), - /* K2 */ be_nested_str_weak(tasmota_relay_index), - /* K3 */ be_nested_str_weak(find), - /* K4 */ be_nested_str_weak(relay), - /* K5 */ be_const_int(0), - }), - be_str_weak(init), - &be_const_str_solidified, - ( &(const binstruction[20]) { /* code */ - 0x60100003, // 0000 GETGBL R4 G3 - 0x5C140000, // 0001 MOVE R5 R0 - 0x7C100200, // 0002 CALL R4 1 - 0x8C100900, // 0003 GETMET R4 R4 K0 - 0x5C180200, // 0004 MOVE R6 R1 - 0x5C1C0400, // 0005 MOVE R7 R2 - 0x5C200600, // 0006 MOVE R8 R3 - 0x7C100800, // 0007 CALL R4 4 - 0x8C100101, // 0008 GETMET R4 R0 K1 - 0x7C100200, // 0009 CALL R4 1 - 0x8C100703, // 000A GETMET R4 R3 K3 - 0x58180004, // 000B LDCONST R6 K4 - 0x7C100400, // 000C CALL R4 2 - 0x90020404, // 000D SETMBR R0 K2 R4 - 0x88100102, // 000E GETMBR R4 R0 K2 - 0x4C140000, // 000F LDNIL R5 - 0x1C100805, // 0010 EQ R4 R4 R5 - 0x78120000, // 0011 JMPF R4 #0013 - 0x90020505, // 0012 SETMBR R0 K2 K5 - 0x80000000, // 0013 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: onoff_changed -********************************************************************/ -be_local_closure(Matter_Plugin_OnOff_onoff_changed, /* name */ - be_nested_proto( - 6, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 2]) { /* constants */ - /* K0 */ be_nested_str_weak(attribute_updated), - /* K1 */ be_const_int(0), - }), - be_str_weak(onoff_changed), - &be_const_str_solidified, - ( &(const binstruction[ 6]) { /* code */ - 0x8C040100, // 0000 GETMET R1 R0 K0 - 0x4C0C0000, // 0001 LDNIL R3 - 0x54120005, // 0002 LDINT R4 6 - 0x58140001, // 0003 LDCONST R5 K1 - 0x7C040800, // 0004 CALL R1 4 - 0x80000000, // 0005 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: to_json_parameters -********************************************************************/ -be_local_closure(Matter_Plugin_OnOff_to_json_parameters, /* name */ +be_local_closure(Matter_Plugin_OnOff_set_onoff, /* name */ be_nested_proto( 7, /* nstack */ 2, /* argc */ @@ -353,21 +226,108 @@ be_local_closure(Matter_Plugin_OnOff_to_json_parameters, /* name */ NULL, /* no sub protos */ 1, /* has constants */ ( &(const bvalue[ 4]) { /* constants */ - /* K0 */ be_nested_str_weak(string), - /* K1 */ be_nested_str_weak(format), - /* K2 */ be_nested_str_weak(_X2C_X22relay_X22_X3A_X25i), - /* K3 */ be_nested_str_weak(tasmota_relay_index), + /* K0 */ be_nested_str_weak(tasmota), + /* K1 */ be_nested_str_weak(set_power), + /* K2 */ be_nested_str_weak(tasmota_relay_index), + /* K3 */ be_nested_str_weak(get_onoff), }), - be_str_weak(to_json_parameters), + be_str_weak(set_onoff), &be_const_str_solidified, - ( &(const binstruction[ 7]) { /* code */ - 0xA40A0000, // 0000 IMPORT R2 K0 - 0x8C0C0501, // 0001 GETMET R3 R2 K1 - 0x58140002, // 0002 LDCONST R5 K2 - 0x88180103, // 0003 GETMBR R6 R0 K3 - 0x7C0C0600, // 0004 CALL R3 3 - 0x00040203, // 0005 ADD R1 R1 R3 - 0x80040200, // 0006 RET 1 R1 + ( &(const binstruction[10]) { /* code */ + 0xB80A0000, // 0000 GETNGBL R2 K0 + 0x8C080501, // 0001 GETMET R2 R2 K1 + 0x88100102, // 0002 GETMBR R4 R0 K2 + 0x60140017, // 0003 GETGBL R5 G23 + 0x5C180200, // 0004 MOVE R6 R1 + 0x7C140200, // 0005 CALL R5 1 + 0x7C080600, // 0006 CALL R2 3 + 0x8C080103, // 0007 GETMET R2 R0 K3 + 0x7C080200, // 0008 CALL R2 1 + 0x80000000, // 0009 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: +********************************************************************/ +be_local_closure(Matter_Plugin_OnOff__X3Clambda_X3E, /* name */ + be_nested_proto( + 3, /* nstack */ + 1, /* argc */ + 0, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 0, /* has constants */ + NULL, /* no const */ + be_str_weak(_X3Clambda_X3E), + &be_const_str_solidified, + ( &(const binstruction[ 4]) { /* code */ + 0x60040009, // 0000 GETGBL R1 G9 + 0x5C080000, // 0001 MOVE R2 R0 + 0x7C040200, // 0002 CALL R1 1 + 0x80040200, // 0003 RET 1 R1 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: get_onoff +********************************************************************/ +be_local_closure(Matter_Plugin_OnOff_get_onoff, /* name */ + be_nested_proto( + 5, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 5]) { /* constants */ + /* K0 */ be_nested_str_weak(tasmota), + /* K1 */ be_nested_str_weak(get_power), + /* K2 */ be_nested_str_weak(tasmota_relay_index), + /* K3 */ be_nested_str_weak(shadow_onoff), + /* K4 */ be_nested_str_weak(onoff_changed), + }), + be_str_weak(get_onoff), + &be_const_str_solidified, + ( &(const binstruction[28]) { /* code */ + 0xB8060000, // 0000 GETNGBL R1 K0 + 0x8C040301, // 0001 GETMET R1 R1 K1 + 0x880C0102, // 0002 GETMBR R3 R0 K2 + 0x7C040400, // 0003 CALL R1 2 + 0x4C080000, // 0004 LDNIL R2 + 0x20080202, // 0005 NE R2 R1 R2 + 0x780A000C, // 0006 JMPF R2 #0014 + 0x88080103, // 0007 GETMBR R2 R0 K3 + 0x4C0C0000, // 0008 LDNIL R3 + 0x20080403, // 0009 NE R2 R2 R3 + 0x780A0007, // 000A JMPF R2 #0013 + 0x88080103, // 000B GETMBR R2 R0 K3 + 0x600C0017, // 000C GETGBL R3 G23 + 0x5C100200, // 000D MOVE R4 R1 + 0x7C0C0200, // 000E CALL R3 1 + 0x20080403, // 000F NE R2 R2 R3 + 0x780A0001, // 0010 JMPF R2 #0013 + 0x8C080104, // 0011 GETMET R2 R0 K4 + 0x7C080200, // 0012 CALL R2 1 + 0x90020601, // 0013 SETMBR R0 K3 R1 + 0x88080103, // 0014 GETMBR R2 R0 K3 + 0x4C0C0000, // 0015 LDNIL R3 + 0x1C080403, // 0016 EQ R2 R2 R3 + 0x780A0001, // 0017 JMPF R2 #001A + 0x50080000, // 0018 LDBOOL R2 0 0 + 0x90020602, // 0019 SETMBR R0 K3 R2 + 0x88080103, // 001A GETMBR R2 R0 K3 + 0x80040400, // 001B RET 1 R2 }) ) ); @@ -615,6 +575,38 @@ be_local_closure(Matter_Plugin_OnOff_read_attribute, /* name */ /*******************************************************************/ +/******************************************************************** +** Solidified function: onoff_changed +********************************************************************/ +be_local_closure(Matter_Plugin_OnOff_onoff_changed, /* name */ + be_nested_proto( + 6, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 2]) { /* constants */ + /* K0 */ be_nested_str_weak(attribute_updated), + /* K1 */ be_const_int(0), + }), + be_str_weak(onoff_changed), + &be_const_str_solidified, + ( &(const binstruction[ 6]) { /* code */ + 0x8C040100, // 0000 GETMET R1 R0 K0 + 0x4C0C0000, // 0001 LDNIL R3 + 0x54120005, // 0002 LDINT R4 6 + 0x58140001, // 0003 LDCONST R5 K1 + 0x7C040800, // 0004 CALL R1 4 + 0x80000000, // 0005 RET 0 + }) + ) +); +/*******************************************************************/ + + /******************************************************************** ** Solidified class: Matter_Plugin_OnOff ********************************************************************/ @@ -622,19 +614,20 @@ extern const bclass be_class_Matter_Plugin; be_local_class(Matter_Plugin_OnOff, 2, &be_class_Matter_Plugin, - be_nested_map(13, + be_nested_map(15, ( (struct bmapnode*) &(const bmapnode[]) { - { be_const_key_weak(shadow_onoff, -1), be_const_var(1) }, - { be_const_key_weak(tasmota_relay_index, -1), be_const_var(0) }, - { be_const_key_weak(get_onoff, -1), be_const_closure(Matter_Plugin_OnOff_get_onoff_closure) }, - { be_const_key_weak(every_second, -1), be_const_closure(Matter_Plugin_OnOff_every_second_closure) }, - { be_const_key_weak(read_attribute, -1), be_const_closure(Matter_Plugin_OnOff_read_attribute_closure) }, + { be_const_key_weak(init, 8), be_const_closure(Matter_Plugin_OnOff_init_closure) }, + { be_const_key_weak(TYPES, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { + be_const_map( * be_nested_map(1, + ( (struct bmapnode*) &(const bmapnode[]) { + { be_const_key_int(266, -1), be_const_int(2) }, + })) ) } )) }, { be_const_key_weak(invoke_request, -1), be_const_closure(Matter_Plugin_OnOff_invoke_request_closure) }, - { be_const_key_weak(init, -1), be_const_closure(Matter_Plugin_OnOff_init_closure) }, - { be_const_key_weak(onoff_changed, -1), be_const_closure(Matter_Plugin_OnOff_onoff_changed_closure) }, - { be_const_key_weak(to_json_parameters, -1), be_const_closure(Matter_Plugin_OnOff_to_json_parameters_closure) }, - { be_const_key_weak(NAME, 3), be_nested_str_weak(relay) }, - { be_const_key_weak(CLUSTERS, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { + { be_const_key_weak(set_onoff, -1), be_const_closure(Matter_Plugin_OnOff_set_onoff_closure) }, + { be_const_key_weak(ARG_TYPE, 7), be_const_static_closure(Matter_Plugin_OnOff__X3Clambda_X3E_closure) }, + { be_const_key_weak(tasmota_relay_index, 1), be_const_var(0) }, + { be_const_key_weak(TYPE, -1), be_nested_str_weak(relay) }, + { be_const_key_weak(CLUSTERS, 6), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { be_const_map( * be_nested_map(4, ( (struct bmapnode*) &(const bmapnode[]) { { be_const_key_int(4, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_list, { @@ -672,12 +665,13 @@ be_local_class(Matter_Plugin_OnOff, be_const_int(65533), })) ) } )) }, })) ) } )) }, - { be_const_key_weak(set_onoff, 4), be_const_closure(Matter_Plugin_OnOff_set_onoff_closure) }, - { be_const_key_weak(TYPES, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { - be_const_map( * be_nested_map(1, - ( (struct bmapnode*) &(const bmapnode[]) { - { be_const_key_int(266, -1), be_const_int(2) }, - })) ) } )) }, + { be_const_key_weak(every_second, -1), be_const_closure(Matter_Plugin_OnOff_every_second_closure) }, + { be_const_key_weak(ARG, 11), be_nested_str_weak(relay) }, + { be_const_key_weak(get_onoff, -1), be_const_closure(Matter_Plugin_OnOff_get_onoff_closure) }, + { be_const_key_weak(NAME, -1), be_nested_str_weak(Relay) }, + { be_const_key_weak(read_attribute, -1), be_const_closure(Matter_Plugin_OnOff_read_attribute_closure) }, + { be_const_key_weak(shadow_onoff, -1), be_const_var(1) }, + { be_const_key_weak(onoff_changed, -1), be_const_closure(Matter_Plugin_OnOff_onoff_changed_closure) }, })), be_str_weak(Matter_Plugin_OnOff) ); diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Root.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Root.h index 0ed2d4962..05e8ec97d 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Root.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Root.h @@ -6,6 +6,181 @@ extern const bclass be_class_Matter_Plugin_Root; +/******************************************************************** +** Solidified function: init +********************************************************************/ +be_local_closure(Matter_Plugin_Root_init, /* name */ + be_nested_proto( + 9, /* nstack */ + 4, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 1]) { /* constants */ + /* K0 */ be_nested_str_weak(init), + }), + be_str_weak(init), + &be_const_str_solidified, + ( &(const binstruction[ 9]) { /* code */ + 0x60100003, // 0000 GETGBL R4 G3 + 0x5C140000, // 0001 MOVE R5 R0 + 0x7C100200, // 0002 CALL R4 1 + 0x8C100900, // 0003 GETMET R4 R4 K0 + 0x5C180200, // 0004 MOVE R6 R1 + 0x5C1C0400, // 0005 MOVE R7 R2 + 0x5C200600, // 0006 MOVE R8 R3 + 0x7C100800, // 0007 CALL R4 4 + 0x80000000, // 0008 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: write_attribute +********************************************************************/ +be_local_closure(Matter_Plugin_Root_write_attribute, /* name */ + be_nested_proto( + 13, /* nstack */ + 4, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[15]) { /* constants */ + /* K0 */ be_nested_str_weak(string), + /* K1 */ be_nested_str_weak(matter), + /* K2 */ be_nested_str_weak(TLV), + /* K3 */ be_nested_str_weak(cluster), + /* K4 */ be_nested_str_weak(attribute), + /* K5 */ be_const_int(0), + /* K6 */ be_nested_str_weak(int), + /* K7 */ be_nested_str_weak(int64), + /* K8 */ be_nested_str_weak(_breadcrumb), + /* K9 */ be_nested_str_weak(attribute_updated), + /* K10 */ be_nested_str_weak(endpoint), + /* K11 */ be_nested_str_weak(status), + /* K12 */ be_nested_str_weak(CONSTRAINT_ERROR), + /* K13 */ be_const_int(1), + /* K14 */ be_nested_str_weak(INVALID_ACTION), + }), + be_str_weak(write_attribute), + &be_const_str_solidified, + ( &(const binstruction[102]) { /* code */ + 0xA4120000, // 0000 IMPORT R4 K0 + 0xB8160200, // 0001 GETNGBL R5 K1 + 0x88140B02, // 0002 GETMBR R5 R5 K2 + 0x88180503, // 0003 GETMBR R6 R2 K3 + 0x881C0504, // 0004 GETMBR R7 R2 K4 + 0x5422002F, // 0005 LDINT R8 48 + 0x1C200C08, // 0006 EQ R8 R6 R8 + 0x7822001A, // 0007 JMPF R8 #0023 + 0x1C200F05, // 0008 EQ R8 R7 K5 + 0x78220017, // 0009 JMPF R8 #0022 + 0x60200004, // 000A GETGBL R8 G4 + 0x5C240600, // 000B MOVE R9 R3 + 0x7C200200, // 000C CALL R8 1 + 0x1C201106, // 000D EQ R8 R8 K6 + 0x74220004, // 000E JMPT R8 #0014 + 0x6020000F, // 000F GETGBL R8 G15 + 0x5C240600, // 0010 MOVE R9 R3 + 0xB82A0E00, // 0011 GETNGBL R10 K7 + 0x7C200400, // 0012 CALL R8 2 + 0x78220008, // 0013 JMPF R8 #001D + 0x90061003, // 0014 SETMBR R1 K8 R3 + 0x8C200109, // 0015 GETMET R8 R0 K9 + 0x8828050A, // 0016 GETMBR R10 R2 K10 + 0x882C0503, // 0017 GETMBR R11 R2 K3 + 0x88300504, // 0018 GETMBR R12 R2 K4 + 0x7C200800, // 0019 CALL R8 4 + 0x50200200, // 001A LDBOOL R8 1 0 + 0x80041000, // 001B RET 1 R8 + 0x70020004, // 001C JMP #0022 + 0xB8220200, // 001D GETNGBL R8 K1 + 0x8820110C, // 001E GETMBR R8 R8 K12 + 0x900A1608, // 001F SETMBR R2 K11 R8 + 0x50200000, // 0020 LDBOOL R8 0 0 + 0x80041000, // 0021 RET 1 R8 + 0x70020041, // 0022 JMP #0065 + 0x5422001E, // 0023 LDINT R8 31 + 0x1C200C08, // 0024 EQ R8 R6 R8 + 0x78220004, // 0025 JMPF R8 #002B + 0x1C200F05, // 0026 EQ R8 R7 K5 + 0x78220001, // 0027 JMPF R8 #002A + 0x50200200, // 0028 LDBOOL R8 1 0 + 0x80041000, // 0029 RET 1 R8 + 0x70020039, // 002A JMP #0065 + 0x54220027, // 002B LDINT R8 40 + 0x1C200C08, // 002C EQ R8 R6 R8 + 0x7822000B, // 002D JMPF R8 #003A + 0x54220004, // 002E LDINT R8 5 + 0x1C200E08, // 002F EQ R8 R7 R8 + 0x78220002, // 0030 JMPF R8 #0034 + 0x50200200, // 0031 LDBOOL R8 1 0 + 0x80041000, // 0032 RET 1 R8 + 0x70020004, // 0033 JMP #0039 + 0x54220005, // 0034 LDINT R8 6 + 0x1C200E08, // 0035 EQ R8 R7 R8 + 0x78220001, // 0036 JMPF R8 #0039 + 0x50200200, // 0037 LDBOOL R8 1 0 + 0x80041000, // 0038 RET 1 R8 + 0x7002002A, // 0039 JMP #0065 + 0x54220029, // 003A LDINT R8 42 + 0x1C200C08, // 003B EQ R8 R6 R8 + 0x78220004, // 003C JMPF R8 #0042 + 0x1C200F05, // 003D EQ R8 R7 K5 + 0x78220001, // 003E JMPF R8 #0041 + 0x50200200, // 003F LDBOOL R8 1 0 + 0x80041000, // 0040 RET 1 R8 + 0x70020022, // 0041 JMP #0065 + 0x5422002A, // 0042 LDINT R8 43 + 0x1C200C08, // 0043 EQ R8 R6 R8 + 0x78220007, // 0044 JMPF R8 #004D + 0x1C200F05, // 0045 EQ R8 R7 K5 + 0x78220004, // 0046 JMPF R8 #004C + 0xB8220200, // 0047 GETNGBL R8 K1 + 0x8820110C, // 0048 GETMBR R8 R8 K12 + 0x900A1608, // 0049 SETMBR R2 K11 R8 + 0x50200000, // 004A LDBOOL R8 0 0 + 0x80041000, // 004B RET 1 R8 + 0x70020017, // 004C JMP #0065 + 0x5422002B, // 004D LDINT R8 44 + 0x1C200C08, // 004E EQ R8 R6 R8 + 0x78220009, // 004F JMPF R8 #005A + 0x1C200F05, // 0050 EQ R8 R7 K5 + 0x78220002, // 0051 JMPF R8 #0055 + 0x50200200, // 0052 LDBOOL R8 1 0 + 0x80041000, // 0053 RET 1 R8 + 0x70020003, // 0054 JMP #0059 + 0x1C200F0D, // 0055 EQ R8 R7 K13 + 0x78220001, // 0056 JMPF R8 #0059 + 0x50200200, // 0057 LDBOOL R8 1 0 + 0x80041000, // 0058 RET 1 R8 + 0x7002000A, // 0059 JMP #0065 + 0x54220030, // 005A LDINT R8 49 + 0x1C200C08, // 005B EQ R8 R6 R8 + 0x78220007, // 005C JMPF R8 #0065 + 0x54220003, // 005D LDINT R8 4 + 0x1C200E08, // 005E EQ R8 R7 R8 + 0x78220004, // 005F JMPF R8 #0065 + 0xB8220200, // 0060 GETNGBL R8 K1 + 0x8820110E, // 0061 GETMBR R8 R8 K14 + 0x900A1608, // 0062 SETMBR R2 K11 R8 + 0x50200000, // 0063 LDBOOL R8 0 0 + 0x80041000, // 0064 RET 1 R8 + 0x80000000, // 0065 RET 0 + }) + ) +); +/*******************************************************************/ + + /******************************************************************** ** Solidified function: read_attribute ********************************************************************/ @@ -1005,181 +1180,6 @@ be_local_closure(Matter_Plugin_Root_read_attribute, /* name */ /*******************************************************************/ -/******************************************************************** -** Solidified function: write_attribute -********************************************************************/ -be_local_closure(Matter_Plugin_Root_write_attribute, /* name */ - be_nested_proto( - 13, /* nstack */ - 4, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[15]) { /* constants */ - /* K0 */ be_nested_str_weak(string), - /* K1 */ be_nested_str_weak(matter), - /* K2 */ be_nested_str_weak(TLV), - /* K3 */ be_nested_str_weak(cluster), - /* K4 */ be_nested_str_weak(attribute), - /* K5 */ be_const_int(0), - /* K6 */ be_nested_str_weak(int), - /* K7 */ be_nested_str_weak(int64), - /* K8 */ be_nested_str_weak(_breadcrumb), - /* K9 */ be_nested_str_weak(attribute_updated), - /* K10 */ be_nested_str_weak(endpoint), - /* K11 */ be_nested_str_weak(status), - /* K12 */ be_nested_str_weak(CONSTRAINT_ERROR), - /* K13 */ be_const_int(1), - /* K14 */ be_nested_str_weak(INVALID_ACTION), - }), - be_str_weak(write_attribute), - &be_const_str_solidified, - ( &(const binstruction[102]) { /* code */ - 0xA4120000, // 0000 IMPORT R4 K0 - 0xB8160200, // 0001 GETNGBL R5 K1 - 0x88140B02, // 0002 GETMBR R5 R5 K2 - 0x88180503, // 0003 GETMBR R6 R2 K3 - 0x881C0504, // 0004 GETMBR R7 R2 K4 - 0x5422002F, // 0005 LDINT R8 48 - 0x1C200C08, // 0006 EQ R8 R6 R8 - 0x7822001A, // 0007 JMPF R8 #0023 - 0x1C200F05, // 0008 EQ R8 R7 K5 - 0x78220017, // 0009 JMPF R8 #0022 - 0x60200004, // 000A GETGBL R8 G4 - 0x5C240600, // 000B MOVE R9 R3 - 0x7C200200, // 000C CALL R8 1 - 0x1C201106, // 000D EQ R8 R8 K6 - 0x74220004, // 000E JMPT R8 #0014 - 0x6020000F, // 000F GETGBL R8 G15 - 0x5C240600, // 0010 MOVE R9 R3 - 0xB82A0E00, // 0011 GETNGBL R10 K7 - 0x7C200400, // 0012 CALL R8 2 - 0x78220008, // 0013 JMPF R8 #001D - 0x90061003, // 0014 SETMBR R1 K8 R3 - 0x8C200109, // 0015 GETMET R8 R0 K9 - 0x8828050A, // 0016 GETMBR R10 R2 K10 - 0x882C0503, // 0017 GETMBR R11 R2 K3 - 0x88300504, // 0018 GETMBR R12 R2 K4 - 0x7C200800, // 0019 CALL R8 4 - 0x50200200, // 001A LDBOOL R8 1 0 - 0x80041000, // 001B RET 1 R8 - 0x70020004, // 001C JMP #0022 - 0xB8220200, // 001D GETNGBL R8 K1 - 0x8820110C, // 001E GETMBR R8 R8 K12 - 0x900A1608, // 001F SETMBR R2 K11 R8 - 0x50200000, // 0020 LDBOOL R8 0 0 - 0x80041000, // 0021 RET 1 R8 - 0x70020041, // 0022 JMP #0065 - 0x5422001E, // 0023 LDINT R8 31 - 0x1C200C08, // 0024 EQ R8 R6 R8 - 0x78220004, // 0025 JMPF R8 #002B - 0x1C200F05, // 0026 EQ R8 R7 K5 - 0x78220001, // 0027 JMPF R8 #002A - 0x50200200, // 0028 LDBOOL R8 1 0 - 0x80041000, // 0029 RET 1 R8 - 0x70020039, // 002A JMP #0065 - 0x54220027, // 002B LDINT R8 40 - 0x1C200C08, // 002C EQ R8 R6 R8 - 0x7822000B, // 002D JMPF R8 #003A - 0x54220004, // 002E LDINT R8 5 - 0x1C200E08, // 002F EQ R8 R7 R8 - 0x78220002, // 0030 JMPF R8 #0034 - 0x50200200, // 0031 LDBOOL R8 1 0 - 0x80041000, // 0032 RET 1 R8 - 0x70020004, // 0033 JMP #0039 - 0x54220005, // 0034 LDINT R8 6 - 0x1C200E08, // 0035 EQ R8 R7 R8 - 0x78220001, // 0036 JMPF R8 #0039 - 0x50200200, // 0037 LDBOOL R8 1 0 - 0x80041000, // 0038 RET 1 R8 - 0x7002002A, // 0039 JMP #0065 - 0x54220029, // 003A LDINT R8 42 - 0x1C200C08, // 003B EQ R8 R6 R8 - 0x78220004, // 003C JMPF R8 #0042 - 0x1C200F05, // 003D EQ R8 R7 K5 - 0x78220001, // 003E JMPF R8 #0041 - 0x50200200, // 003F LDBOOL R8 1 0 - 0x80041000, // 0040 RET 1 R8 - 0x70020022, // 0041 JMP #0065 - 0x5422002A, // 0042 LDINT R8 43 - 0x1C200C08, // 0043 EQ R8 R6 R8 - 0x78220007, // 0044 JMPF R8 #004D - 0x1C200F05, // 0045 EQ R8 R7 K5 - 0x78220004, // 0046 JMPF R8 #004C - 0xB8220200, // 0047 GETNGBL R8 K1 - 0x8820110C, // 0048 GETMBR R8 R8 K12 - 0x900A1608, // 0049 SETMBR R2 K11 R8 - 0x50200000, // 004A LDBOOL R8 0 0 - 0x80041000, // 004B RET 1 R8 - 0x70020017, // 004C JMP #0065 - 0x5422002B, // 004D LDINT R8 44 - 0x1C200C08, // 004E EQ R8 R6 R8 - 0x78220009, // 004F JMPF R8 #005A - 0x1C200F05, // 0050 EQ R8 R7 K5 - 0x78220002, // 0051 JMPF R8 #0055 - 0x50200200, // 0052 LDBOOL R8 1 0 - 0x80041000, // 0053 RET 1 R8 - 0x70020003, // 0054 JMP #0059 - 0x1C200F0D, // 0055 EQ R8 R7 K13 - 0x78220001, // 0056 JMPF R8 #0059 - 0x50200200, // 0057 LDBOOL R8 1 0 - 0x80041000, // 0058 RET 1 R8 - 0x7002000A, // 0059 JMP #0065 - 0x54220030, // 005A LDINT R8 49 - 0x1C200C08, // 005B EQ R8 R6 R8 - 0x78220007, // 005C JMPF R8 #0065 - 0x54220003, // 005D LDINT R8 4 - 0x1C200E08, // 005E EQ R8 R7 R8 - 0x78220004, // 005F JMPF R8 #0065 - 0xB8220200, // 0060 GETNGBL R8 K1 - 0x8820110E, // 0061 GETMBR R8 R8 K14 - 0x900A1608, // 0062 SETMBR R2 K11 R8 - 0x50200000, // 0063 LDBOOL R8 0 0 - 0x80041000, // 0064 RET 1 R8 - 0x80000000, // 0065 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: init -********************************************************************/ -be_local_closure(Matter_Plugin_Root_init, /* name */ - be_nested_proto( - 9, /* nstack */ - 4, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 1]) { /* constants */ - /* K0 */ be_nested_str_weak(init), - }), - be_str_weak(init), - &be_const_str_solidified, - ( &(const binstruction[ 9]) { /* code */ - 0x60100003, // 0000 GETGBL R4 G3 - 0x5C140000, // 0001 MOVE R5 R0 - 0x7C100200, // 0002 CALL R4 1 - 0x8C100900, // 0003 GETMET R4 R4 K0 - 0x5C180200, // 0004 MOVE R6 R1 - 0x5C1C0400, // 0005 MOVE R7 R2 - 0x5C200600, // 0006 MOVE R8 R3 - 0x7C100800, // 0007 CALL R4 4 - 0x80000000, // 0008 RET 0 - }) - ) -); -/*******************************************************************/ - - /******************************************************************** ** Solidified function: invoke_request ********************************************************************/ @@ -2074,19 +2074,11 @@ extern const bclass be_class_Matter_Plugin; be_local_class(Matter_Plugin_Root, 0, &be_class_Matter_Plugin, - be_nested_map(7, + be_nested_map(8, ( (struct bmapnode*) &(const bmapnode[]) { - { be_const_key_weak(read_attribute, 2), be_const_closure(Matter_Plugin_Root_read_attribute_closure) }, - { be_const_key_weak(NAME, -1), be_nested_str_weak(root) }, - { be_const_key_weak(invoke_request, 6), be_const_closure(Matter_Plugin_Root_invoke_request_closure) }, - { be_const_key_weak(TYPES, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { - be_const_map( * be_nested_map(1, - ( (struct bmapnode*) &(const bmapnode[]) { - { be_const_key_int(22, -1), be_const_int(1) }, - })) ) } )) }, + { be_const_key_weak(invoke_request, 1), be_const_closure(Matter_Plugin_Root_invoke_request_closure) }, { be_const_key_weak(write_attribute, -1), be_const_closure(Matter_Plugin_Root_write_attribute_closure) }, - { be_const_key_weak(init, -1), be_const_closure(Matter_Plugin_Root_init_closure) }, - { be_const_key_weak(CLUSTERS, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { + { be_const_key_weak(CLUSTERS, 4), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { be_const_map( * be_nested_map(13, ( (struct bmapnode*) &(const bmapnode[]) { { be_const_key_int(52, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_list, { @@ -2188,6 +2180,15 @@ be_local_class(Matter_Plugin_Root, be_const_int(2), be_const_int(8), })) ) } )) }, + })) ) } )) }, + { be_const_key_weak(init, 0), be_const_closure(Matter_Plugin_Root_init_closure) }, + { be_const_key_weak(read_attribute, 7), be_const_closure(Matter_Plugin_Root_read_attribute_closure) }, + { be_const_key_weak(TYPE, -1), be_nested_str_weak(root) }, + { be_const_key_weak(NAME, -1), be_nested_str_weak(Root_X20node) }, + { be_const_key_weak(TYPES, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { + be_const_map( * be_nested_map(1, + ( (struct bmapnode*) &(const bmapnode[]) { + { be_const_key_int(22, -1), be_const_int(1) }, })) ) } )) }, })), be_str_weak(Matter_Plugin_Root) diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor.h index 8d7e7df1c..f91cef2c8 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor.h @@ -47,7 +47,7 @@ be_local_closure(Matter_Plugin_Sensor_init, /* name */ /* K0 */ be_nested_str_weak(init), /* K1 */ be_nested_str_weak(tasmota_sensor_filter), /* K2 */ be_nested_str_weak(find), - /* K3 */ be_nested_str_weak(filter), + /* K3 */ be_nested_str_weak(ARG), /* K4 */ be_nested_str_weak(tasmota_sensor_matcher), /* K5 */ be_nested_str_weak(tasmota), /* K6 */ be_nested_str_weak(Rule_Matcher), @@ -65,7 +65,7 @@ be_local_closure(Matter_Plugin_Sensor_init, /* name */ 0x5C200600, // 0006 MOVE R8 R3 0x7C100800, // 0007 CALL R4 4 0x8C100702, // 0008 GETMET R4 R3 K2 - 0x58180003, // 0009 LDCONST R6 K3 + 0x88180103, // 0009 GETMBR R6 R0 K3 0x7C100400, // 000A CALL R4 2 0x90020204, // 000B SETMBR R0 K1 R4 0x88100101, // 000C GETMBR R4 R0 K1 @@ -83,65 +83,6 @@ be_local_closure(Matter_Plugin_Sensor_init, /* name */ /*******************************************************************/ -/******************************************************************** -** Solidified function: to_json_parameters -********************************************************************/ -be_local_closure(Matter_Plugin_Sensor_to_json_parameters, /* name */ - be_nested_proto( - 7, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 4]) { /* constants */ - /* K0 */ be_nested_str_weak(string), - /* K1 */ be_nested_str_weak(format), - /* K2 */ be_nested_str_weak(_X2C_X22filter_X22_X3A_X22_X25s_X22), - /* K3 */ be_nested_str_weak(tasmota_sensor_filter), - }), - be_str_weak(to_json_parameters), - &be_const_str_solidified, - ( &(const binstruction[ 7]) { /* code */ - 0xA40A0000, // 0000 IMPORT R2 K0 - 0x8C0C0501, // 0001 GETMET R3 R2 K1 - 0x58140002, // 0002 LDCONST R5 K2 - 0x88180103, // 0003 GETMBR R6 R0 K3 - 0x7C0C0600, // 0004 CALL R3 3 - 0x00040203, // 0005 ADD R1 R1 R3 - 0x80040200, // 0006 RET 1 R1 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: valued_changed -********************************************************************/ -be_local_closure(Matter_Plugin_Sensor_valued_changed, /* name */ - be_nested_proto( - 2, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 0, /* has constants */ - NULL, /* no const */ - be_str_weak(valued_changed), - &be_const_str_solidified, - ( &(const binstruction[ 1]) { /* code */ - 0x80000000, // 0000 RET 0 - }) - ) -); -/*******************************************************************/ - - /******************************************************************** ** Solidified function: parse_sensors ********************************************************************/ @@ -192,6 +133,30 @@ be_local_closure(Matter_Plugin_Sensor_parse_sensors, /* name */ /*******************************************************************/ +/******************************************************************** +** Solidified function: valued_changed +********************************************************************/ +be_local_closure(Matter_Plugin_Sensor_valued_changed, /* name */ + be_nested_proto( + 2, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 0, /* has constants */ + NULL, /* no const */ + be_str_weak(valued_changed), + &be_const_str_solidified, + ( &(const binstruction[ 1]) { /* code */ + 0x80000000, // 0000 RET 0 + }) + ) +); +/*******************************************************************/ + + /******************************************************************** ** Solidified class: Matter_Plugin_Sensor ********************************************************************/ @@ -202,13 +167,13 @@ be_local_class(Matter_Plugin_Sensor, be_nested_map(8, ( (struct bmapnode*) &(const bmapnode[]) { { be_const_key_weak(pre_value, -1), be_const_closure(Matter_Plugin_Sensor_pre_value_closure) }, - { be_const_key_weak(parse_sensors, -1), be_const_closure(Matter_Plugin_Sensor_parse_sensors_closure) }, - { be_const_key_weak(tasmota_sensor_filter, 7), be_const_var(0) }, - { be_const_key_weak(init, 6), be_const_closure(Matter_Plugin_Sensor_init_closure) }, - { be_const_key_weak(to_json_parameters, 1), be_const_closure(Matter_Plugin_Sensor_to_json_parameters_closure) }, - { be_const_key_weak(valued_changed, -1), be_const_closure(Matter_Plugin_Sensor_valued_changed_closure) }, { be_const_key_weak(shadow_value, -1), be_const_var(2) }, - { be_const_key_weak(tasmota_sensor_matcher, -1), be_const_var(1) }, + { be_const_key_weak(tasmota_sensor_matcher, 6), be_const_var(1) }, + { be_const_key_weak(init, 1), be_const_closure(Matter_Plugin_Sensor_init_closure) }, + { be_const_key_weak(parse_sensors, -1), be_const_closure(Matter_Plugin_Sensor_parse_sensors_closure) }, + { be_const_key_weak(valued_changed, -1), be_const_closure(Matter_Plugin_Sensor_valued_changed_closure) }, + { be_const_key_weak(tasmota_sensor_filter, -1), be_const_var(0) }, + { be_const_key_weak(ARG, -1), be_nested_str_weak(filter) }, })), be_str_weak(Matter_Plugin_Sensor) ); diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor_Humidity.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor_Humidity.h index f04c97ac6..57146e067 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor_Humidity.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor_Humidity.h @@ -6,66 +6,6 @@ extern const bclass be_class_Matter_Plugin_Sensor_Humidity; -/******************************************************************** -** Solidified function: pre_value -********************************************************************/ -be_local_closure(Matter_Plugin_Sensor_Humidity_pre_value, /* name */ - be_nested_proto( - 4, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 0, /* has constants */ - NULL, /* no const */ - be_str_weak(pre_value), - &be_const_str_solidified, - ( &(const binstruction[ 5]) { /* code */ - 0x60080009, // 0000 GETGBL R2 G9 - 0x540E0063, // 0001 LDINT R3 100 - 0x080C0203, // 0002 MUL R3 R1 R3 - 0x7C080200, // 0003 CALL R2 1 - 0x80040400, // 0004 RET 1 R2 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: valued_changed -********************************************************************/ -be_local_closure(Matter_Plugin_Sensor_Humidity_valued_changed, /* name */ - be_nested_proto( - 7, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 2]) { /* constants */ - /* K0 */ be_nested_str_weak(attribute_updated), - /* K1 */ be_const_int(0), - }), - be_str_weak(valued_changed), - &be_const_str_solidified, - ( &(const binstruction[ 6]) { /* code */ - 0x8C080100, // 0000 GETMET R2 R0 K0 - 0x4C100000, // 0001 LDNIL R4 - 0x54160404, // 0002 LDINT R5 1029 - 0x58180001, // 0003 LDCONST R6 K1 - 0x7C080800, // 0004 CALL R2 4 - 0x80000000, // 0005 RET 0 - }) - ) -); -/*******************************************************************/ - - /******************************************************************** ** Solidified function: read_attribute ********************************************************************/ @@ -176,6 +116,66 @@ be_local_closure(Matter_Plugin_Sensor_Humidity_read_attribute, /* name */ /*******************************************************************/ +/******************************************************************** +** Solidified function: pre_value +********************************************************************/ +be_local_closure(Matter_Plugin_Sensor_Humidity_pre_value, /* name */ + be_nested_proto( + 4, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 0, /* has constants */ + NULL, /* no const */ + be_str_weak(pre_value), + &be_const_str_solidified, + ( &(const binstruction[ 5]) { /* code */ + 0x60080009, // 0000 GETGBL R2 G9 + 0x540E0063, // 0001 LDINT R3 100 + 0x080C0203, // 0002 MUL R3 R1 R3 + 0x7C080200, // 0003 CALL R2 1 + 0x80040400, // 0004 RET 1 R2 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: valued_changed +********************************************************************/ +be_local_closure(Matter_Plugin_Sensor_Humidity_valued_changed, /* name */ + be_nested_proto( + 7, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 2]) { /* constants */ + /* K0 */ be_nested_str_weak(attribute_updated), + /* K1 */ be_const_int(0), + }), + be_str_weak(valued_changed), + &be_const_str_solidified, + ( &(const binstruction[ 6]) { /* code */ + 0x8C080100, // 0000 GETMET R2 R0 K0 + 0x4C100000, // 0001 LDNIL R4 + 0x54160404, // 0002 LDINT R5 1029 + 0x58180001, // 0003 LDCONST R6 K1 + 0x7C080800, // 0004 CALL R2 4 + 0x80000000, // 0005 RET 0 + }) + ) +); +/*******************************************************************/ + + /******************************************************************** ** Solidified class: Matter_Plugin_Sensor_Humidity ********************************************************************/ @@ -183,16 +183,10 @@ extern const bclass be_class_Matter_Plugin_Sensor; be_local_class(Matter_Plugin_Sensor_Humidity, 0, &be_class_Matter_Plugin_Sensor, - be_nested_map(6, + be_nested_map(7, ( (struct bmapnode*) &(const bmapnode[]) { - { be_const_key_weak(NAME, 1), be_nested_str_weak(humidity) }, - { be_const_key_weak(read_attribute, -1), be_const_closure(Matter_Plugin_Sensor_Humidity_read_attribute_closure) }, - { be_const_key_weak(TYPES, 5), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { - be_const_map( * be_nested_map(1, - ( (struct bmapnode*) &(const bmapnode[]) { - { be_const_key_int(775, -1), be_const_int(2) }, - })) ) } )) }, - { be_const_key_weak(valued_changed, -1), be_const_closure(Matter_Plugin_Sensor_Humidity_valued_changed_closure) }, + { be_const_key_weak(read_attribute, 2), be_const_closure(Matter_Plugin_Sensor_Humidity_read_attribute_closure) }, + { be_const_key_weak(pre_value, 5), be_const_closure(Matter_Plugin_Sensor_Humidity_pre_value_closure) }, { be_const_key_weak(CLUSTERS, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { be_const_map( * be_nested_map(1, ( (struct bmapnode*) &(const bmapnode[]) { @@ -206,7 +200,14 @@ be_local_class(Matter_Plugin_Sensor_Humidity, be_const_int(65533), })) ) } )) }, })) ) } )) }, - { be_const_key_weak(pre_value, -1), be_const_closure(Matter_Plugin_Sensor_Humidity_pre_value_closure) }, + { be_const_key_weak(TYPES, 4), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { + be_const_map( * be_nested_map(1, + ( (struct bmapnode*) &(const bmapnode[]) { + { be_const_key_int(775, -1), be_const_int(2) }, + })) ) } )) }, + { be_const_key_weak(TYPE, -1), be_nested_str_weak(humidity) }, + { be_const_key_weak(NAME, -1), be_nested_str_weak(Humidity) }, + { be_const_key_weak(valued_changed, -1), be_const_closure(Matter_Plugin_Sensor_Humidity_valued_changed_closure) }, })), be_str_weak(Matter_Plugin_Sensor_Humidity) ); diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor_Illuminance.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor_Illuminance.h index b45eb5f90..1ac6a351d 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor_Illuminance.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor_Illuminance.h @@ -6,65 +6,6 @@ extern const bclass be_class_Matter_Plugin_Sensor_Illuminance; -/******************************************************************** -** Solidified function: pre_value -********************************************************************/ -be_local_closure(Matter_Plugin_Sensor_Illuminance_pre_value, /* name */ - be_nested_proto( - 4, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 0, /* has constants */ - NULL, /* no const */ - be_str_weak(pre_value), - &be_const_str_solidified, - ( &(const binstruction[ 4]) { /* code */ - 0x60080009, // 0000 GETGBL R2 G9 - 0x5C0C0200, // 0001 MOVE R3 R1 - 0x7C080200, // 0002 CALL R2 1 - 0x80040400, // 0003 RET 1 R2 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: valued_changed -********************************************************************/ -be_local_closure(Matter_Plugin_Sensor_Illuminance_valued_changed, /* name */ - be_nested_proto( - 7, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 2]) { /* constants */ - /* K0 */ be_nested_str_weak(attribute_updated), - /* K1 */ be_const_int(0), - }), - be_str_weak(valued_changed), - &be_const_str_solidified, - ( &(const binstruction[ 6]) { /* code */ - 0x8C080100, // 0000 GETMET R2 R0 K0 - 0x4C100000, // 0001 LDNIL R4 - 0x541603FF, // 0002 LDINT R5 1024 - 0x58180001, // 0003 LDCONST R6 K1 - 0x7C080800, // 0004 CALL R2 4 - 0x80000000, // 0005 RET 0 - }) - ) -); -/*******************************************************************/ - - /******************************************************************** ** Solidified function: read_attribute ********************************************************************/ @@ -175,6 +116,65 @@ be_local_closure(Matter_Plugin_Sensor_Illuminance_read_attribute, /* name */ /*******************************************************************/ +/******************************************************************** +** Solidified function: pre_value +********************************************************************/ +be_local_closure(Matter_Plugin_Sensor_Illuminance_pre_value, /* name */ + be_nested_proto( + 4, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 0, /* has constants */ + NULL, /* no const */ + be_str_weak(pre_value), + &be_const_str_solidified, + ( &(const binstruction[ 4]) { /* code */ + 0x60080009, // 0000 GETGBL R2 G9 + 0x5C0C0200, // 0001 MOVE R3 R1 + 0x7C080200, // 0002 CALL R2 1 + 0x80040400, // 0003 RET 1 R2 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: valued_changed +********************************************************************/ +be_local_closure(Matter_Plugin_Sensor_Illuminance_valued_changed, /* name */ + be_nested_proto( + 7, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 2]) { /* constants */ + /* K0 */ be_nested_str_weak(attribute_updated), + /* K1 */ be_const_int(0), + }), + be_str_weak(valued_changed), + &be_const_str_solidified, + ( &(const binstruction[ 6]) { /* code */ + 0x8C080100, // 0000 GETMET R2 R0 K0 + 0x4C100000, // 0001 LDNIL R4 + 0x541603FF, // 0002 LDINT R5 1024 + 0x58180001, // 0003 LDCONST R6 K1 + 0x7C080800, // 0004 CALL R2 4 + 0x80000000, // 0005 RET 0 + }) + ) +); +/*******************************************************************/ + + /******************************************************************** ** Solidified class: Matter_Plugin_Sensor_Illuminance ********************************************************************/ @@ -182,16 +182,10 @@ extern const bclass be_class_Matter_Plugin_Sensor; be_local_class(Matter_Plugin_Sensor_Illuminance, 0, &be_class_Matter_Plugin_Sensor, - be_nested_map(6, + be_nested_map(7, ( (struct bmapnode*) &(const bmapnode[]) { - { be_const_key_weak(NAME, 1), be_nested_str_weak(illuminance) }, - { be_const_key_weak(read_attribute, -1), be_const_closure(Matter_Plugin_Sensor_Illuminance_read_attribute_closure) }, - { be_const_key_weak(TYPES, 5), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { - be_const_map( * be_nested_map(1, - ( (struct bmapnode*) &(const bmapnode[]) { - { be_const_key_int(262, -1), be_const_int(2) }, - })) ) } )) }, - { be_const_key_weak(valued_changed, -1), be_const_closure(Matter_Plugin_Sensor_Illuminance_valued_changed_closure) }, + { be_const_key_weak(read_attribute, 2), be_const_closure(Matter_Plugin_Sensor_Illuminance_read_attribute_closure) }, + { be_const_key_weak(pre_value, 5), be_const_closure(Matter_Plugin_Sensor_Illuminance_pre_value_closure) }, { be_const_key_weak(CLUSTERS, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { be_const_map( * be_nested_map(1, ( (struct bmapnode*) &(const bmapnode[]) { @@ -205,7 +199,14 @@ be_local_class(Matter_Plugin_Sensor_Illuminance, be_const_int(65533), })) ) } )) }, })) ) } )) }, - { be_const_key_weak(pre_value, -1), be_const_closure(Matter_Plugin_Sensor_Illuminance_pre_value_closure) }, + { be_const_key_weak(TYPES, 4), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { + be_const_map( * be_nested_map(1, + ( (struct bmapnode*) &(const bmapnode[]) { + { be_const_key_int(262, -1), be_const_int(2) }, + })) ) } )) }, + { be_const_key_weak(TYPE, -1), be_nested_str_weak(illuminance) }, + { be_const_key_weak(NAME, -1), be_nested_str_weak(Illuminance) }, + { be_const_key_weak(valued_changed, -1), be_const_closure(Matter_Plugin_Sensor_Illuminance_valued_changed_closure) }, })), be_str_weak(Matter_Plugin_Sensor_Illuminance) ); diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor_Pressure.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor_Pressure.h index 61968c3c1..d0e8aa69d 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor_Pressure.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor_Pressure.h @@ -6,65 +6,6 @@ extern const bclass be_class_Matter_Plugin_Sensor_Pressure; -/******************************************************************** -** Solidified function: pre_value -********************************************************************/ -be_local_closure(Matter_Plugin_Sensor_Pressure_pre_value, /* name */ - be_nested_proto( - 4, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 0, /* has constants */ - NULL, /* no const */ - be_str_weak(pre_value), - &be_const_str_solidified, - ( &(const binstruction[ 4]) { /* code */ - 0x60080009, // 0000 GETGBL R2 G9 - 0x5C0C0200, // 0001 MOVE R3 R1 - 0x7C080200, // 0002 CALL R2 1 - 0x80040400, // 0003 RET 1 R2 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: valued_changed -********************************************************************/ -be_local_closure(Matter_Plugin_Sensor_Pressure_valued_changed, /* name */ - be_nested_proto( - 7, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 2]) { /* constants */ - /* K0 */ be_nested_str_weak(attribute_updated), - /* K1 */ be_const_int(0), - }), - be_str_weak(valued_changed), - &be_const_str_solidified, - ( &(const binstruction[ 6]) { /* code */ - 0x8C080100, // 0000 GETMET R2 R0 K0 - 0x4C100000, // 0001 LDNIL R4 - 0x54160402, // 0002 LDINT R5 1027 - 0x58180001, // 0003 LDCONST R6 K1 - 0x7C080800, // 0004 CALL R2 4 - 0x80000000, // 0005 RET 0 - }) - ) -); -/*******************************************************************/ - - /******************************************************************** ** Solidified function: read_attribute ********************************************************************/ @@ -175,6 +116,65 @@ be_local_closure(Matter_Plugin_Sensor_Pressure_read_attribute, /* name */ /*******************************************************************/ +/******************************************************************** +** Solidified function: pre_value +********************************************************************/ +be_local_closure(Matter_Plugin_Sensor_Pressure_pre_value, /* name */ + be_nested_proto( + 4, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 0, /* has constants */ + NULL, /* no const */ + be_str_weak(pre_value), + &be_const_str_solidified, + ( &(const binstruction[ 4]) { /* code */ + 0x60080009, // 0000 GETGBL R2 G9 + 0x5C0C0200, // 0001 MOVE R3 R1 + 0x7C080200, // 0002 CALL R2 1 + 0x80040400, // 0003 RET 1 R2 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: valued_changed +********************************************************************/ +be_local_closure(Matter_Plugin_Sensor_Pressure_valued_changed, /* name */ + be_nested_proto( + 7, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 2]) { /* constants */ + /* K0 */ be_nested_str_weak(attribute_updated), + /* K1 */ be_const_int(0), + }), + be_str_weak(valued_changed), + &be_const_str_solidified, + ( &(const binstruction[ 6]) { /* code */ + 0x8C080100, // 0000 GETMET R2 R0 K0 + 0x4C100000, // 0001 LDNIL R4 + 0x54160402, // 0002 LDINT R5 1027 + 0x58180001, // 0003 LDCONST R6 K1 + 0x7C080800, // 0004 CALL R2 4 + 0x80000000, // 0005 RET 0 + }) + ) +); +/*******************************************************************/ + + /******************************************************************** ** Solidified class: Matter_Plugin_Sensor_Pressure ********************************************************************/ @@ -182,16 +182,10 @@ extern const bclass be_class_Matter_Plugin_Sensor; be_local_class(Matter_Plugin_Sensor_Pressure, 0, &be_class_Matter_Plugin_Sensor, - be_nested_map(6, + be_nested_map(7, ( (struct bmapnode*) &(const bmapnode[]) { - { be_const_key_weak(NAME, 1), be_nested_str_weak(pressure) }, - { be_const_key_weak(read_attribute, -1), be_const_closure(Matter_Plugin_Sensor_Pressure_read_attribute_closure) }, - { be_const_key_weak(TYPES, 5), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { - be_const_map( * be_nested_map(1, - ( (struct bmapnode*) &(const bmapnode[]) { - { be_const_key_int(773, -1), be_const_int(2) }, - })) ) } )) }, - { be_const_key_weak(valued_changed, -1), be_const_closure(Matter_Plugin_Sensor_Pressure_valued_changed_closure) }, + { be_const_key_weak(read_attribute, 2), be_const_closure(Matter_Plugin_Sensor_Pressure_read_attribute_closure) }, + { be_const_key_weak(pre_value, 5), be_const_closure(Matter_Plugin_Sensor_Pressure_pre_value_closure) }, { be_const_key_weak(CLUSTERS, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { be_const_map( * be_nested_map(1, ( (struct bmapnode*) &(const bmapnode[]) { @@ -205,7 +199,14 @@ be_local_class(Matter_Plugin_Sensor_Pressure, be_const_int(65533), })) ) } )) }, })) ) } )) }, - { be_const_key_weak(pre_value, -1), be_const_closure(Matter_Plugin_Sensor_Pressure_pre_value_closure) }, + { be_const_key_weak(TYPES, 4), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { + be_const_map( * be_nested_map(1, + ( (struct bmapnode*) &(const bmapnode[]) { + { be_const_key_int(773, -1), be_const_int(2) }, + })) ) } )) }, + { be_const_key_weak(TYPE, -1), be_nested_str_weak(pressure) }, + { be_const_key_weak(NAME, -1), be_nested_str_weak(Pressure) }, + { be_const_key_weak(valued_changed, -1), be_const_closure(Matter_Plugin_Sensor_Pressure_valued_changed_closure) }, })), be_str_weak(Matter_Plugin_Sensor_Pressure) ); diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor_Temp.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor_Temp.h index 85e4d894a..48e76493a 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor_Temp.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor_Temp.h @@ -6,66 +6,6 @@ extern const bclass be_class_Matter_Plugin_Sensor_Temp; -/******************************************************************** -** Solidified function: pre_value -********************************************************************/ -be_local_closure(Matter_Plugin_Sensor_Temp_pre_value, /* name */ - be_nested_proto( - 4, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 0, /* has constants */ - NULL, /* no const */ - be_str_weak(pre_value), - &be_const_str_solidified, - ( &(const binstruction[ 5]) { /* code */ - 0x60080009, // 0000 GETGBL R2 G9 - 0x540E0063, // 0001 LDINT R3 100 - 0x080C0203, // 0002 MUL R3 R1 R3 - 0x7C080200, // 0003 CALL R2 1 - 0x80040400, // 0004 RET 1 R2 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: valued_changed -********************************************************************/ -be_local_closure(Matter_Plugin_Sensor_Temp_valued_changed, /* name */ - be_nested_proto( - 7, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 2]) { /* constants */ - /* K0 */ be_nested_str_weak(attribute_updated), - /* K1 */ be_const_int(0), - }), - be_str_weak(valued_changed), - &be_const_str_solidified, - ( &(const binstruction[ 6]) { /* code */ - 0x8C080100, // 0000 GETMET R2 R0 K0 - 0x4C100000, // 0001 LDNIL R4 - 0x54160401, // 0002 LDINT R5 1026 - 0x58180001, // 0003 LDCONST R6 K1 - 0x7C080800, // 0004 CALL R2 4 - 0x80000000, // 0005 RET 0 - }) - ) -); -/*******************************************************************/ - - /******************************************************************** ** Solidified function: read_attribute ********************************************************************/ @@ -173,6 +113,66 @@ be_local_closure(Matter_Plugin_Sensor_Temp_read_attribute, /* name */ /*******************************************************************/ +/******************************************************************** +** Solidified function: pre_value +********************************************************************/ +be_local_closure(Matter_Plugin_Sensor_Temp_pre_value, /* name */ + be_nested_proto( + 4, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 0, /* has constants */ + NULL, /* no const */ + be_str_weak(pre_value), + &be_const_str_solidified, + ( &(const binstruction[ 5]) { /* code */ + 0x60080009, // 0000 GETGBL R2 G9 + 0x540E0063, // 0001 LDINT R3 100 + 0x080C0203, // 0002 MUL R3 R1 R3 + 0x7C080200, // 0003 CALL R2 1 + 0x80040400, // 0004 RET 1 R2 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: valued_changed +********************************************************************/ +be_local_closure(Matter_Plugin_Sensor_Temp_valued_changed, /* name */ + be_nested_proto( + 7, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 2]) { /* constants */ + /* K0 */ be_nested_str_weak(attribute_updated), + /* K1 */ be_const_int(0), + }), + be_str_weak(valued_changed), + &be_const_str_solidified, + ( &(const binstruction[ 6]) { /* code */ + 0x8C080100, // 0000 GETMET R2 R0 K0 + 0x4C100000, // 0001 LDNIL R4 + 0x54160401, // 0002 LDINT R5 1026 + 0x58180001, // 0003 LDCONST R6 K1 + 0x7C080800, // 0004 CALL R2 4 + 0x80000000, // 0005 RET 0 + }) + ) +); +/*******************************************************************/ + + /******************************************************************** ** Solidified class: Matter_Plugin_Sensor_Temp ********************************************************************/ @@ -180,16 +180,10 @@ extern const bclass be_class_Matter_Plugin_Sensor; be_local_class(Matter_Plugin_Sensor_Temp, 0, &be_class_Matter_Plugin_Sensor, - be_nested_map(6, + be_nested_map(7, ( (struct bmapnode*) &(const bmapnode[]) { - { be_const_key_weak(NAME, 1), be_nested_str_weak(temperature) }, - { be_const_key_weak(read_attribute, -1), be_const_closure(Matter_Plugin_Sensor_Temp_read_attribute_closure) }, - { be_const_key_weak(TYPES, 5), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { - be_const_map( * be_nested_map(1, - ( (struct bmapnode*) &(const bmapnode[]) { - { be_const_key_int(770, -1), be_const_int(2) }, - })) ) } )) }, - { be_const_key_weak(valued_changed, -1), be_const_closure(Matter_Plugin_Sensor_Temp_valued_changed_closure) }, + { be_const_key_weak(read_attribute, 2), be_const_closure(Matter_Plugin_Sensor_Temp_read_attribute_closure) }, + { be_const_key_weak(pre_value, 5), be_const_closure(Matter_Plugin_Sensor_Temp_pre_value_closure) }, { be_const_key_weak(CLUSTERS, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { be_const_map( * be_nested_map(1, ( (struct bmapnode*) &(const bmapnode[]) { @@ -203,7 +197,14 @@ be_local_class(Matter_Plugin_Sensor_Temp, be_const_int(65533), })) ) } )) }, })) ) } )) }, - { be_const_key_weak(pre_value, -1), be_const_closure(Matter_Plugin_Sensor_Temp_pre_value_closure) }, + { be_const_key_weak(TYPES, 4), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { + be_const_map( * be_nested_map(1, + ( (struct bmapnode*) &(const bmapnode[]) { + { be_const_key_int(770, -1), be_const_int(2) }, + })) ) } )) }, + { be_const_key_weak(TYPE, -1), be_nested_str_weak(temperature) }, + { be_const_key_weak(NAME, -1), be_nested_str_weak(Temperature) }, + { be_const_key_weak(valued_changed, -1), be_const_closure(Matter_Plugin_Sensor_Temp_valued_changed_closure) }, })), be_str_weak(Matter_Plugin_Sensor_Temp) ); diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_UI.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_UI.h index 350e3a387..5805865d8 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_UI.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_UI.h @@ -6,13 +6,375 @@ extern const bclass be_class_Matter_UI; +/******************************************************************** +** Solidified function: show_commissioning_info +********************************************************************/ +be_local_closure(Matter_UI_show_commissioning_info, /* name */ + be_nested_proto( + 14, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[20]) { /* constants */ + /* K0 */ be_nested_str_weak(webserver), + /* K1 */ be_nested_str_weak(string), + /* K2 */ be_nested_str_weak(device), + /* K3 */ be_nested_str_weak(commissioning_open), + /* K4 */ be_nested_str_weak(tasmota), + /* K5 */ be_nested_str_weak(millis), + /* K6 */ be_const_int(0), + /* K7 */ be_nested_str_weak(content_send), + /* K8 */ be_nested_str_weak(format), + /* K9 */ be_nested_str_weak(_X3Cfieldset_X3E_X3Clegend_X3E_X3Cb_X3E_X26nbsp_X3BCommissioning_X20open_X20for_X20_X25i_X20min_X26nbsp_X3B_X3C_X2Fb_X3E_X3C_X2Flegend_X3E_X3Cp_X3E_X3C_X2Fp_X3E), + /* K10 */ be_nested_str_weak(compute_manual_pairing_code), + /* K11 */ be_nested_str_weak(_X3Cp_X3EManual_X20pairing_X20code_X3A_X3Cbr_X3E_X3Cb_X3E_X25s_X2D_X25s_X2D_X25s_X3C_X2Fb_X3E_X3C_X2Fp_X3E_X3Chr_X3E), + /* K12 */ be_const_int(3), + /* K13 */ be_const_int(2147483647), + /* K14 */ be_nested_str_weak(_X3Cdiv_X3E_X3Ccenter_X3E), + /* K15 */ be_nested_str_weak(compute_qrcode_content), + /* K16 */ be_nested_str_weak(show_qrcode), + /* K17 */ be_nested_str_weak(_X3Cp_X3E_X20_X25s_X3C_X2Fp_X3E), + /* K18 */ be_nested_str_weak(_X3C_X2Fdiv_X3E), + /* K19 */ be_nested_str_weak(_X3Cp_X3E_X3C_X2Fp_X3E_X3C_X2Ffieldset_X3E_X3Cp_X3E_X3C_X2Fp_X3E), + }), + be_str_weak(show_commissioning_info), + &be_const_str_solidified, + ( &(const binstruction[66]) { /* code */ + 0xA4060000, // 0000 IMPORT R1 K0 + 0xA40A0200, // 0001 IMPORT R2 K1 + 0x880C0102, // 0002 GETMBR R3 R0 K2 + 0x880C0703, // 0003 GETMBR R3 R3 K3 + 0xB8120800, // 0004 GETNGBL R4 K4 + 0x8C100905, // 0005 GETMET R4 R4 K5 + 0x7C100200, // 0006 CALL R4 1 + 0x040C0604, // 0007 SUB R3 R3 R4 + 0x541203E7, // 0008 LDINT R4 1000 + 0x0C0C0604, // 0009 DIV R3 R3 R4 + 0x14100706, // 000A LT R4 R3 K6 + 0x78120000, // 000B JMPF R4 #000D + 0x580C0006, // 000C LDCONST R3 K6 + 0x5412001D, // 000D LDINT R4 30 + 0x00100604, // 000E ADD R4 R3 R4 + 0x5416003B, // 000F LDINT R5 60 + 0x0C100805, // 0010 DIV R4 R4 R5 + 0x8C140307, // 0011 GETMET R5 R1 K7 + 0x8C1C0508, // 0012 GETMET R7 R2 K8 + 0x58240009, // 0013 LDCONST R9 K9 + 0x5C280800, // 0014 MOVE R10 R4 + 0x7C1C0600, // 0015 CALL R7 3 + 0x7C140400, // 0016 CALL R5 2 + 0x88140102, // 0017 GETMBR R5 R0 K2 + 0x8C140B0A, // 0018 GETMET R5 R5 K10 + 0x7C140200, // 0019 CALL R5 1 + 0x8C180307, // 001A GETMET R6 R1 K7 + 0x8C200508, // 001B GETMET R8 R2 K8 + 0x5828000B, // 001C LDCONST R10 K11 + 0x402E0D0C, // 001D CONNECT R11 K6 K12 + 0x942C0A0B, // 001E GETIDX R11 R5 R11 + 0x54320003, // 001F LDINT R12 4 + 0x54360005, // 0020 LDINT R13 6 + 0x4030180D, // 0021 CONNECT R12 R12 R13 + 0x94300A0C, // 0022 GETIDX R12 R5 R12 + 0x54360006, // 0023 LDINT R13 7 + 0x40341B0D, // 0024 CONNECT R13 R13 K13 + 0x94340A0D, // 0025 GETIDX R13 R5 R13 + 0x7C200A00, // 0026 CALL R8 5 + 0x7C180400, // 0027 CALL R6 2 + 0x8C180307, // 0028 GETMET R6 R1 K7 + 0x8C200508, // 0029 GETMET R8 R2 K8 + 0x5828000E, // 002A LDCONST R10 K14 + 0x7C200400, // 002B CALL R8 2 + 0x7C180400, // 002C CALL R6 2 + 0x88180102, // 002D GETMBR R6 R0 K2 + 0x8C180D0F, // 002E GETMET R6 R6 K15 + 0x7C180200, // 002F CALL R6 1 + 0x8C1C0110, // 0030 GETMET R7 R0 K16 + 0x5C240C00, // 0031 MOVE R9 R6 + 0x7C1C0400, // 0032 CALL R7 2 + 0x8C1C0307, // 0033 GETMET R7 R1 K7 + 0x8C240508, // 0034 GETMET R9 R2 K8 + 0x582C0011, // 0035 LDCONST R11 K17 + 0x5C300C00, // 0036 MOVE R12 R6 + 0x7C240600, // 0037 CALL R9 3 + 0x7C1C0400, // 0038 CALL R7 2 + 0x8C1C0307, // 0039 GETMET R7 R1 K7 + 0x8C240508, // 003A GETMET R9 R2 K8 + 0x582C0012, // 003B LDCONST R11 K18 + 0x7C240400, // 003C CALL R9 2 + 0x7C1C0400, // 003D CALL R7 2 + 0x8C1C0307, // 003E GETMET R7 R1 K7 + 0x58240013, // 003F LDCONST R9 K19 + 0x7C1C0400, // 0040 CALL R7 2 + 0x80000000, // 0041 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: show_enable +********************************************************************/ +be_local_closure(Matter_UI_show_enable, /* name */ + be_nested_proto( + 11, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[20]) { /* constants */ + /* K0 */ be_nested_str_weak(webserver), + /* K1 */ be_nested_str_weak(string), + /* K2 */ be_nested_str_weak(tasmota), + /* K3 */ be_nested_str_weak(get_option), + /* K4 */ be_nested_str_weak(matter), + /* K5 */ be_nested_str_weak(MATTER_OPTION), + /* K6 */ be_nested_str_weak(content_send), + /* K7 */ be_nested_str_weak(format), + /* K8 */ be_nested_str_weak(_X3Cfieldset_X3E_X3Clegend_X3E_X3Cb_X3E_X26nbsp_X3BMatter_X20_X25s_X26nbsp_X3B_X3C_X2Fb_X3E_X3C_X2Flegend_X3E_X3Cp_X3E_X3C_X2Fp_X3E), + /* K9 */ be_nested_str_weak(Enabled), + /* K10 */ be_nested_str_weak(Disabled), + /* K11 */ be_nested_str_weak(_X3Cp_X20style_X3D_X27width_X3A320px_X3B_X27_X3ECheck_X20the_X20_X3Ca_X20href_X3D_X27https_X3A_X2F_X2Ftasmota_X2Egithub_X2Eio_X2Fdocs_X2FMatter_X2F_X27_X20target_X3D_X27_blank_X27_X3EMatter_X20documentation_X3C_X2Fa_X3E_X2E_X3C_X2Fp_X3E), + /* K12 */ be_nested_str_weak(_X3Cform_X20action_X3D_X27_X2Fmatterc_X27_X20method_X3D_X27post_X27_X20onsubmit_X3D_X27return_X20confirm_X28_X22This_X20will_X20cause_X20a_X20restart_X2E_X22_X29_X3B_X27_X3E), + /* K13 */ be_nested_str_weak(_X3Cp_X3E_X3C_X2Fp_X3E_X3Cbutton_X20name_X3D_X27_X25s_X27_X20class_X3D_X27button_X20bgrn_X27_X3E), + /* K14 */ be_nested_str_weak(disable), + /* K15 */ be_nested_str_weak(enable), + /* K16 */ be_nested_str_weak(Disable), + /* K17 */ be_nested_str_weak(Enable), + /* K18 */ be_nested_str_weak(_X20Matter_X3C_X2Fbutton_X3E_X3C_X2Fform_X3E_X3C_X2Fp_X3E), + /* K19 */ be_nested_str_weak(_X3Cp_X3E_X3C_X2Fp_X3E_X3C_X2Ffieldset_X3E_X3Cp_X3E_X3C_X2Fp_X3E), + }), + be_str_weak(show_enable), + &be_const_str_solidified, + ( &(const binstruction[44]) { /* code */ + 0xA40A0000, // 0000 IMPORT R2 K0 + 0xA40E0200, // 0001 IMPORT R3 K1 + 0xB8120400, // 0002 GETNGBL R4 K2 + 0x8C100903, // 0003 GETMET R4 R4 K3 + 0xB81A0800, // 0004 GETNGBL R6 K4 + 0x88180D05, // 0005 GETMBR R6 R6 K5 + 0x7C100400, // 0006 CALL R4 2 + 0x8C140506, // 0007 GETMET R5 R2 K6 + 0x8C1C0707, // 0008 GETMET R7 R3 K7 + 0x58240008, // 0009 LDCONST R9 K8 + 0x78120001, // 000A JMPF R4 #000D + 0x58280009, // 000B LDCONST R10 K9 + 0x70020000, // 000C JMP #000E + 0x5828000A, // 000D LDCONST R10 K10 + 0x7C1C0600, // 000E CALL R7 3 + 0x7C140400, // 000F CALL R5 2 + 0x8C140506, // 0010 GETMET R5 R2 K6 + 0x581C000B, // 0011 LDCONST R7 K11 + 0x7C140400, // 0012 CALL R5 2 + 0x8C140506, // 0013 GETMET R5 R2 K6 + 0x581C000C, // 0014 LDCONST R7 K12 + 0x7C140400, // 0015 CALL R5 2 + 0x8C140506, // 0016 GETMET R5 R2 K6 + 0x8C1C0707, // 0017 GETMET R7 R3 K7 + 0x5824000D, // 0018 LDCONST R9 K13 + 0x78120001, // 0019 JMPF R4 #001C + 0x5828000E, // 001A LDCONST R10 K14 + 0x70020000, // 001B JMP #001D + 0x5828000F, // 001C LDCONST R10 K15 + 0x7C1C0600, // 001D CALL R7 3 + 0x7C140400, // 001E CALL R5 2 + 0x8C140506, // 001F GETMET R5 R2 K6 + 0x78120001, // 0020 JMPF R4 #0023 + 0x581C0010, // 0021 LDCONST R7 K16 + 0x70020000, // 0022 JMP #0024 + 0x581C0011, // 0023 LDCONST R7 K17 + 0x7C140400, // 0024 CALL R5 2 + 0x8C140506, // 0025 GETMET R5 R2 K6 + 0x581C0012, // 0026 LDCONST R7 K18 + 0x7C140400, // 0027 CALL R5 2 + 0x8C140506, // 0028 GETMET R5 R2 K6 + 0x581C0013, // 0029 LDCONST R7 K19 + 0x7C140400, // 002A CALL R5 2 + 0x80040800, // 002B RET 1 R4 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: init +********************************************************************/ +be_local_closure(Matter_UI_init, /* name */ + be_nested_proto( + 5, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 3]) { /* constants */ + /* K0 */ be_nested_str_weak(device), + /* K1 */ be_nested_str_weak(tasmota), + /* K2 */ be_nested_str_weak(add_driver), + }), + be_str_weak(init), + &be_const_str_solidified, + ( &(const binstruction[ 6]) { /* code */ + 0x90020001, // 0000 SETMBR R0 K0 R1 + 0xB80A0200, // 0001 GETNGBL R2 K1 + 0x8C080502, // 0002 GETMET R2 R2 K2 + 0x5C100000, // 0003 MOVE R4 R0 + 0x7C080400, // 0004 CALL R2 2 + 0x80000000, // 0005 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: show_passcode_form +********************************************************************/ +be_local_closure(Matter_UI_show_passcode_form, /* name */ + be_nested_proto( + 9, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[19]) { /* constants */ + /* K0 */ be_nested_str_weak(webserver), + /* K1 */ be_nested_str_weak(string), + /* K2 */ be_nested_str_weak(content_send), + /* K3 */ be_nested_str_weak(_X3Cfieldset_X3E_X3Clegend_X3E_X3Cb_X3E_X26nbsp_X3BMatter_X20Passcode_X26nbsp_X3B_X3C_X2Fb_X3E_X3C_X2Flegend_X3E_X3Cp_X3E_X3C_X2Fp_X3E), + /* K4 */ be_nested_str_weak(_X3Cform_X20action_X3D_X27_X2Fmatterc_X27_X20method_X3D_X27post_X27_X20onsubmit_X3D_X27return_X20confirm_X28_X22This_X20will_X20cause_X20a_X20restart_X2E_X22_X29_X3B_X27_X3E), + /* K5 */ be_nested_str_weak(_X3Cp_X3EPasscode_X3A_X3C_X2Fp_X3E), + /* K6 */ be_nested_str_weak(format), + /* K7 */ be_nested_str_weak(_X3Cinput_X20type_X3D_X27number_X27_X20min_X3D_X271_X27_X20max_X3D_X2799999998_X27_X20name_X3D_X27passcode_X27_X20value_X3D_X27_X25i_X27_X3E), + /* K8 */ be_nested_str_weak(device), + /* K9 */ be_nested_str_weak(root_passcode), + /* K10 */ be_nested_str_weak(_X3Cp_X3EDistinguish_X20id_X3A_X3C_X2Fp_X3E), + /* K11 */ be_nested_str_weak(_X3Cinput_X20type_X3D_X27number_X27_X20min_X3D_X270_X27_X20max_X3D_X274095_X27_X20name_X3D_X27discriminator_X27_X20value_X3D_X27_X25i_X27_X3E), + /* K12 */ be_nested_str_weak(root_discriminator), + /* K13 */ be_nested_str_weak(_X3Cp_X3E_X3Cinput_X20type_X3D_X27checkbox_X27_X20name_X3D_X27ipv4_X27_X25s_X3EIPv4_X20only_X3C_X2Fp_X3E), + /* K14 */ be_nested_str_weak(ipv4only), + /* K15 */ be_nested_str_weak(_X20checked), + /* K16 */ be_nested_str_weak(), + /* K17 */ be_nested_str_weak(_X3Cp_X3E_X3C_X2Fp_X3E_X3Cbutton_X20name_X3D_X27passcode_X27_X20class_X3D_X27button_X20bgrn_X27_X3EChange_X3C_X2Fbutton_X3E_X3C_X2Fform_X3E_X3C_X2Fp_X3E), + /* K18 */ be_nested_str_weak(_X3Cp_X3E_X3C_X2Fp_X3E_X3C_X2Ffieldset_X3E_X3Cp_X3E_X3C_X2Fp_X3E), + }), + be_str_weak(show_passcode_form), + &be_const_str_solidified, + ( &(const binstruction[46]) { /* code */ + 0xA4060000, // 0000 IMPORT R1 K0 + 0xA40A0200, // 0001 IMPORT R2 K1 + 0x8C0C0302, // 0002 GETMET R3 R1 K2 + 0x58140003, // 0003 LDCONST R5 K3 + 0x7C0C0400, // 0004 CALL R3 2 + 0x8C0C0302, // 0005 GETMET R3 R1 K2 + 0x58140004, // 0006 LDCONST R5 K4 + 0x7C0C0400, // 0007 CALL R3 2 + 0x8C0C0302, // 0008 GETMET R3 R1 K2 + 0x58140005, // 0009 LDCONST R5 K5 + 0x7C0C0400, // 000A CALL R3 2 + 0x8C0C0302, // 000B GETMET R3 R1 K2 + 0x8C140506, // 000C GETMET R5 R2 K6 + 0x581C0007, // 000D LDCONST R7 K7 + 0x88200108, // 000E GETMBR R8 R0 K8 + 0x88201109, // 000F GETMBR R8 R8 K9 + 0x7C140600, // 0010 CALL R5 3 + 0x7C0C0400, // 0011 CALL R3 2 + 0x8C0C0302, // 0012 GETMET R3 R1 K2 + 0x5814000A, // 0013 LDCONST R5 K10 + 0x7C0C0400, // 0014 CALL R3 2 + 0x8C0C0302, // 0015 GETMET R3 R1 K2 + 0x8C140506, // 0016 GETMET R5 R2 K6 + 0x581C000B, // 0017 LDCONST R7 K11 + 0x88200108, // 0018 GETMBR R8 R0 K8 + 0x8820110C, // 0019 GETMBR R8 R8 K12 + 0x7C140600, // 001A CALL R5 3 + 0x7C0C0400, // 001B CALL R3 2 + 0x8C0C0302, // 001C GETMET R3 R1 K2 + 0x8C140506, // 001D GETMET R5 R2 K6 + 0x581C000D, // 001E LDCONST R7 K13 + 0x88200108, // 001F GETMBR R8 R0 K8 + 0x8820110E, // 0020 GETMBR R8 R8 K14 + 0x78220001, // 0021 JMPF R8 #0024 + 0x5820000F, // 0022 LDCONST R8 K15 + 0x70020000, // 0023 JMP #0025 + 0x58200010, // 0024 LDCONST R8 K16 + 0x7C140600, // 0025 CALL R5 3 + 0x7C0C0400, // 0026 CALL R3 2 + 0x8C0C0302, // 0027 GETMET R3 R1 K2 + 0x58140011, // 0028 LDCONST R5 K17 + 0x7C0C0400, // 0029 CALL R3 2 + 0x8C0C0302, // 002A GETMET R3 R1 K2 + 0x58140012, // 002B LDCONST R5 K18 + 0x7C0C0400, // 002C CALL R3 2 + 0x80000000, // 002D RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: web_add_config_button +********************************************************************/ +be_local_closure(Matter_UI_web_add_config_button, /* name */ + be_nested_proto( + 5, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 6]) { /* constants */ + /* K0 */ be_nested_str_weak(webserver), + /* K1 */ be_nested_str_weak(content_send), + /* K2 */ be_nested_str_weak(_X3Cp_X3E_X3Cform_X20id_X3Dac_X20action_X3D_X27matterc_X27_X20style_X3D_X27display_X3A_X20block_X3B_X27_X20method_X3D_X27get_X27_X3E_X3Cbutton_X3E), + /* K3 */ be_nested_str_weak(matter), + /* K4 */ be_nested_str_weak(_LOGO), + /* K5 */ be_nested_str_weak(_X20Configure_X20Matter_X3C_X2Fbutton_X3E_X3C_X2Fform_X3E_X3C_X2Fp_X3E), + }), + be_str_weak(web_add_config_button), + &be_const_str_solidified, + ( &(const binstruction[12]) { /* code */ + 0xA4060000, // 0000 IMPORT R1 K0 + 0x8C080301, // 0001 GETMET R2 R1 K1 + 0x58100002, // 0002 LDCONST R4 K2 + 0x7C080400, // 0003 CALL R2 2 + 0x8C080301, // 0004 GETMET R2 R1 K1 + 0xB8120600, // 0005 GETNGBL R4 K3 + 0x88100904, // 0006 GETMBR R4 R4 K4 + 0x7C080400, // 0007 CALL R2 2 + 0x8C080301, // 0008 GETMET R2 R1 K1 + 0x58100005, // 0009 LDCONST R4 K5 + 0x7C080400, // 000A CALL R2 2 + 0x80000000, // 000B RET 0 + }) + ) +); +/*******************************************************************/ + + /******************************************************************** ** Solidified function: show_fabric_info ********************************************************************/ be_local_closure(Matter_UI_show_fabric_info, /* name */ be_nested_proto( - 17, /* nstack */ - 2, /* argc */ + 16, /* nstack */ + 1, /* argc */ 2, /* varg */ 0, /* has upvals */ NULL, /* no upvals */ @@ -45,7 +407,7 @@ be_local_closure(Matter_UI_show_fabric_info, /* name */ /* K22 */ be_nested_str_weak(Fabric_X3A_X20_X25s_X3Cbr_X3E), /* K23 */ be_nested_str_weak(tohex), /* K24 */ be_nested_str_weak(Device_X3A_X20_X25s_X3Cbr_X3E_X26nbsp_X3B), - /* K25 */ be_nested_str_weak(_X3Cform_X20action_X3D_X27_X2Fmatterc_X27_X20method_X3D_X27post_X27_X3E), + /* K25 */ be_nested_str_weak(_X3Cform_X20action_X3D_X27_X2Fmatterc_X27_X20method_X3D_X27post_X27_X20onsubmit_X3D_X27return_X20confirm_X28_X22Are_X20you_X20sure_X3F_X22_X29_X3B_X27_X3E), /* K26 */ be_nested_str_weak(_X3Cinput_X20name_X3D_X27del_fabric_X27_X20type_X3D_X27hidden_X27_X20value_X3D_X27_X25i_X27_X3E), /* K27 */ be_nested_str_weak(_X3Cbutton_X20name_X3D_X27del_X27_X20class_X3D_X27button_X20bgrn_X27_X3EDelete_X20Fabric_X3C_X2Fbutton_X3E_X3C_X2Fform_X3E_X3C_X2Fp_X3E), /* K28 */ be_nested_str_weak(_X3Cp_X3E_X3C_X2Fp_X3E_X3C_X2Ffieldset_X3E_X3Cp_X3E_X3C_X2Fp_X3E), @@ -54,108 +416,936 @@ be_local_closure(Matter_UI_show_fabric_info, /* name */ be_str_weak(show_fabric_info), &be_const_str_solidified, ( &(const binstruction[102]) { /* code */ + 0xA4060000, // 0000 IMPORT R1 K0 + 0xA40A0200, // 0001 IMPORT R2 K1 + 0x8C0C0302, // 0002 GETMET R3 R1 K2 + 0x58140003, // 0003 LDCONST R5 K3 + 0x7C0C0400, // 0004 CALL R3 2 + 0x8C0C0302, // 0005 GETMET R3 R1 K2 + 0x58140004, // 0006 LDCONST R5 K4 + 0x7C0C0400, // 0007 CALL R3 2 + 0x600C000C, // 0008 GETGBL R3 G12 + 0x88100105, // 0009 GETMBR R4 R0 K5 + 0x88100906, // 000A GETMBR R4 R4 K6 + 0x88100906, // 000B GETMBR R4 R4 K6 + 0x7C0C0200, // 000C CALL R3 1 + 0x1C0C0707, // 000D EQ R3 R3 K7 + 0x780E0003, // 000E JMPF R3 #0013 + 0x8C0C0302, // 000F GETMET R3 R1 K2 + 0x58140008, // 0010 LDCONST R5 K8 + 0x7C0C0400, // 0011 CALL R3 2 + 0x7002004E, // 0012 JMP #0062 + 0x500C0200, // 0013 LDBOOL R3 1 0 + 0x60100010, // 0014 GETGBL R4 G16 + 0x88140105, // 0015 GETMBR R5 R0 K5 + 0x88140B06, // 0016 GETMBR R5 R5 K6 + 0x88140B09, // 0017 GETMBR R5 R5 K9 + 0x8C140B0A, // 0018 GETMET R5 R5 K10 + 0x7C140200, // 0019 CALL R5 1 + 0x7C100200, // 001A CALL R4 1 + 0xA8020042, // 001B EXBLK 0 #005F + 0x5C140800, // 001C MOVE R5 R4 + 0x7C140000, // 001D CALL R5 0 + 0x5C180600, // 001E MOVE R6 R3 + 0x741A0002, // 001F JMPT R6 #0023 + 0x8C180302, // 0020 GETMET R6 R1 K2 + 0x5820000B, // 0021 LDCONST R8 K11 + 0x7C180400, // 0022 CALL R6 2 + 0x500C0000, // 0023 LDBOOL R3 0 0 + 0x88180B0C, // 0024 GETMBR R6 R5 K12 + 0x5C1C0C00, // 0025 MOVE R7 R6 + 0x741E0000, // 0026 JMPT R7 #0028 + 0x5818000D, // 0027 LDCONST R6 K13 + 0x8C1C030E, // 0028 GETMET R7 R1 K14 + 0x5C240C00, // 0029 MOVE R9 R6 + 0x7C1C0400, // 002A CALL R7 2 + 0x5C180E00, // 002B MOVE R6 R7 + 0x8C1C0302, // 002C GETMET R7 R1 K2 + 0x8C24050F, // 002D GETMET R9 R2 K15 + 0x582C0010, // 002E LDCONST R11 K16 + 0x8C300B11, // 002F GETMET R12 R5 K17 + 0x7C300200, // 0030 CALL R12 1 + 0x5C340C00, // 0031 MOVE R13 R6 + 0x7C240800, // 0032 CALL R9 4 + 0x7C1C0400, // 0033 CALL R7 2 + 0x8C1C0B12, // 0034 GETMET R7 R5 K18 + 0x7C1C0200, // 0035 CALL R7 1 + 0x8C1C0F13, // 0036 GETMET R7 R7 K19 + 0x7C1C0200, // 0037 CALL R7 1 + 0x8C1C0F14, // 0038 GETMET R7 R7 K20 + 0x7C1C0200, // 0039 CALL R7 1 + 0x8C200B15, // 003A GETMET R8 R5 K21 + 0x7C200200, // 003B CALL R8 1 + 0x8C201113, // 003C GETMET R8 R8 K19 + 0x7C200200, // 003D CALL R8 1 + 0x8C201114, // 003E GETMET R8 R8 K20 + 0x7C200200, // 003F CALL R8 1 + 0x8C240302, // 0040 GETMET R9 R1 K2 + 0x8C2C050F, // 0041 GETMET R11 R2 K15 + 0x58340016, // 0042 LDCONST R13 K22 + 0x8C380F17, // 0043 GETMET R14 R7 K23 + 0x7C380200, // 0044 CALL R14 1 + 0x7C2C0600, // 0045 CALL R11 3 + 0x7C240400, // 0046 CALL R9 2 + 0x8C240302, // 0047 GETMET R9 R1 K2 + 0x8C2C050F, // 0048 GETMET R11 R2 K15 + 0x58340018, // 0049 LDCONST R13 K24 + 0x8C381117, // 004A GETMET R14 R8 K23 + 0x7C380200, // 004B CALL R14 1 + 0x7C2C0600, // 004C CALL R11 3 + 0x7C240400, // 004D CALL R9 2 + 0x8C240302, // 004E GETMET R9 R1 K2 + 0x582C0019, // 004F LDCONST R11 K25 + 0x7C240400, // 0050 CALL R9 2 + 0x8C240302, // 0051 GETMET R9 R1 K2 + 0x8C2C050F, // 0052 GETMET R11 R2 K15 + 0x5834001A, // 0053 LDCONST R13 K26 + 0x8C380B11, // 0054 GETMET R14 R5 K17 + 0x7C380200, // 0055 CALL R14 1 + 0x7C2C0600, // 0056 CALL R11 3 + 0x7C240400, // 0057 CALL R9 2 + 0x8C240302, // 0058 GETMET R9 R1 K2 + 0x582C001B, // 0059 LDCONST R11 K27 + 0x7C240400, // 005A CALL R9 2 + 0x8C240302, // 005B GETMET R9 R1 K2 + 0x582C001C, // 005C LDCONST R11 K28 + 0x7C240400, // 005D CALL R9 2 + 0x7001FFBC, // 005E JMP #001C + 0x5810001D, // 005F LDCONST R4 K29 + 0xAC100200, // 0060 CATCH R4 1 0 + 0xB0080000, // 0061 RAISE 2 R0 R0 + 0x8C0C0302, // 0062 GETMET R3 R1 K2 + 0x5814001C, // 0063 LDCONST R5 K28 + 0x7C0C0400, // 0064 CALL R3 2 + 0x80000000, // 0065 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: page_part_mgr +********************************************************************/ +be_local_closure(Matter_UI_page_part_mgr, /* name */ + be_nested_proto( + 6, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[13]) { /* constants */ + /* K0 */ be_nested_str_weak(webserver), + /* K1 */ be_nested_str_weak(string), + /* K2 */ be_nested_str_weak(check_privileged_access), + /* K3 */ be_nested_str_weak(content_start), + /* K4 */ be_nested_str_weak(Matter), + /* K5 */ be_nested_str_weak(content_send_style), + /* K6 */ be_nested_str_weak(show_enable), + /* K7 */ be_nested_str_weak(show_passcode_form), + /* K8 */ be_nested_str_weak(show_plugins_configuration), + /* K9 */ be_nested_str_weak(show_fabric_info), + /* K10 */ be_nested_str_weak(content_button), + /* K11 */ be_nested_str_weak(BUTTON_CONFIGURATION), + /* K12 */ be_nested_str_weak(content_stop), + }), + be_str_weak(page_part_mgr), + &be_const_str_solidified, + ( &(const binstruction[27]) { /* code */ + 0xA4060000, // 0000 IMPORT R1 K0 + 0xA40A0200, // 0001 IMPORT R2 K1 + 0x8C0C0302, // 0002 GETMET R3 R1 K2 + 0x7C0C0200, // 0003 CALL R3 1 + 0x740E0001, // 0004 JMPT R3 #0007 + 0x4C0C0000, // 0005 LDNIL R3 + 0x80040600, // 0006 RET 1 R3 + 0x8C0C0303, // 0007 GETMET R3 R1 K3 + 0x58140004, // 0008 LDCONST R5 K4 + 0x7C0C0400, // 0009 CALL R3 2 + 0x8C0C0305, // 000A GETMET R3 R1 K5 + 0x7C0C0200, // 000B CALL R3 1 + 0x8C0C0106, // 000C GETMET R3 R0 K6 + 0x7C0C0200, // 000D CALL R3 1 + 0x780E0005, // 000E JMPF R3 #0015 + 0x8C0C0107, // 000F GETMET R3 R0 K7 + 0x7C0C0200, // 0010 CALL R3 1 + 0x8C0C0108, // 0011 GETMET R3 R0 K8 + 0x7C0C0200, // 0012 CALL R3 1 + 0x8C0C0109, // 0013 GETMET R3 R0 K9 + 0x7C0C0200, // 0014 CALL R3 1 + 0x8C0C030A, // 0015 GETMET R3 R1 K10 + 0x8814030B, // 0016 GETMBR R5 R1 K11 + 0x7C0C0400, // 0017 CALL R3 2 + 0x8C0C030C, // 0018 GETMET R3 R1 K12 + 0x7C0C0200, // 0019 CALL R3 1 + 0x80000000, // 001A RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: page_part_ctl +********************************************************************/ +be_local_closure(Matter_UI_page_part_ctl, /* name */ + be_nested_proto( + 21, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[72]) { /* constants */ + /* K0 */ be_nested_str_weak(webserver), + /* K1 */ be_nested_str_weak(check_privileged_access), + /* K2 */ be_nested_str_weak(string), + /* K3 */ be_nested_str_weak(partition_core), + /* K4 */ be_nested_str_weak(persist), + /* K5 */ be_nested_str_weak(has_arg), + /* K6 */ be_nested_str_weak(passcode), + /* K7 */ be_nested_str_weak(discriminator), + /* K8 */ be_nested_str_weak(tasmota), + /* K9 */ be_nested_str_weak(log), + /* K10 */ be_nested_str_weak(format), + /* K11 */ be_nested_str_weak(MTR_X3A_X20_X2Fmatterc_X20received_X20_X27_X25s_X27_X20command), + /* K12 */ be_const_int(3), + /* K13 */ be_nested_str_weak(device), + /* K14 */ be_nested_str_weak(root_passcode), + /* K15 */ be_nested_str_weak(arg), + /* K16 */ be_nested_str_weak(root_discriminator), + /* K17 */ be_nested_str_weak(ipv4only), + /* K18 */ be_nested_str_weak(ipv4), + /* K19 */ be_nested_str_weak(on), + /* K20 */ be_nested_str_weak(save_param), + /* K21 */ be_nested_str_weak(redirect), + /* K22 */ be_nested_str_weak(_X2F_X3Frst_X3D), + /* K23 */ be_nested_str_weak(enable), + /* K24 */ be_nested_str_weak(cmd), + /* K25 */ be_nested_str_weak(SetOption), + /* K26 */ be_nested_str_weak(matter), + /* K27 */ be_nested_str_weak(MATTER_OPTION), + /* K28 */ be_nested_str_weak(_X201), + /* K29 */ be_nested_str_weak(disable), + /* K30 */ be_nested_str_weak(_X200), + /* K31 */ be_nested_str_weak(del_fabric), + /* K32 */ be_const_int(0), + /* K33 */ be_nested_str_weak(sessions), + /* K34 */ be_nested_str_weak(fabrics), + /* K35 */ be_nested_str_weak(get_fabric_index), + /* K36 */ be_nested_str_weak(remove_fabric), + /* K37 */ be_const_int(1), + /* K38 */ be_nested_str_weak(_X2Fmatterc_X3F), + /* K39 */ be_nested_str_weak(auto), + /* K40 */ be_nested_str_weak(plugins_persist), + /* K41 */ be_nested_str_weak(config), + /* K42 */ be_nested_str_weak(_X2503i), + /* K43 */ be_nested_str_weak(ep), + /* K44 */ be_nested_str_weak(pi), + /* K45 */ be_nested_str_weak(MTR_X3A_X20ep_X3D_X25i_X20type_X3D_X25s_X20arg_X3D_X25s), + /* K46 */ be_nested_str_weak(), + /* K47 */ be_nested_str_weak(plugins_classes), + /* K48 */ be_nested_str_weak(find), + /* K49 */ be_nested_str_weak(type), + /* K50 */ be_nested_str_weak(ARG), + /* K51 */ be_nested_str_weak(ARG_TYPE), + /* K52 */ be_nested_str_weak(MTR_X3A_X20unknown_X20type_X20_X3D_X20_X25s), + /* K53 */ be_const_int(2), + /* K54 */ be_nested_str_weak(MTR_X3A_X20skipping_X20parameter), + /* K55 */ be_nested_str_weak(MTR_X3A_X20config_X20_X3D_X20_X25s), + /* K56 */ be_nested_str_weak(contains), + /* K57 */ be_nested_str_weak(0), + /* K58 */ be_nested_str_weak(Missing_X20endpoint_X200), + /* K59 */ be_nested_str_weak(MTR_X3A_X20config_X20error_X20_X3D_X20_X25s), + /* K60 */ be_nested_str_weak(plugins_config), + /* K61 */ be_nested_str_weak(content_start), + /* K62 */ be_nested_str_weak(Parameter_X20error), + /* K63 */ be_nested_str_weak(content_send_style), + /* K64 */ be_nested_str_weak(content_send), + /* K65 */ be_nested_str_weak(_X3Cp_X20style_X3D_X27width_X3A340px_X3B_X27_X3E_X3Cb_X3EError_X3A_X3C_X2Fb_X3E_X25s_X3C_X2Fp_X3E), + /* K66 */ be_nested_str_weak(html_escape), + /* K67 */ be_nested_str_weak(content_button), + /* K68 */ be_nested_str_weak(BUTTON_CONFIGURATION), + /* K69 */ be_nested_str_weak(content_stop), + /* K70 */ be_nested_str_weak(BRY_X3A_X20Exception_X3E_X20_X27_X25s_X27_X20_X2D_X20_X25s), + /* K71 */ be_nested_str_weak(_X3Cp_X20style_X3D_X27width_X3A340px_X3B_X27_X3E_X3Cb_X3EException_X3A_X3C_X2Fb_X3E_X3Cbr_X3E_X27_X25s_X27_X3Cbr_X3E_X25s_X3C_X2Fp_X3E), + }), + be_str_weak(page_part_ctl), + &be_const_str_solidified, + ( &(const binstruction[356]) { /* code */ + 0xA4060000, // 0000 IMPORT R1 K0 + 0x8C080301, // 0001 GETMET R2 R1 K1 + 0x7C080200, // 0002 CALL R2 1 + 0x740A0001, // 0003 JMPT R2 #0006 + 0x4C080000, // 0004 LDNIL R2 + 0x80040400, // 0005 RET 1 R2 + 0xA40A0400, // 0006 IMPORT R2 K2 + 0xA40E0600, // 0007 IMPORT R3 K3 + 0xA4120800, // 0008 IMPORT R4 K4 + 0x4C140000, // 0009 LDNIL R5 + 0xA8020139, // 000A EXBLK 0 #0145 + 0x8C180305, // 000B GETMET R6 R1 K5 + 0x58200006, // 000C LDCONST R8 K6 + 0x7C180400, // 000D CALL R6 2 + 0x741A0003, // 000E JMPT R6 #0013 + 0x8C180305, // 000F GETMET R6 R1 K5 + 0x58200007, // 0010 LDCONST R8 K7 + 0x7C180400, // 0011 CALL R6 2 + 0x781A002A, // 0012 JMPF R6 #003E + 0xB81A1000, // 0013 GETNGBL R6 K8 + 0x8C180D09, // 0014 GETMET R6 R6 K9 + 0x8C20050A, // 0015 GETMET R8 R2 K10 + 0x5828000B, // 0016 LDCONST R10 K11 + 0x582C0006, // 0017 LDCONST R11 K6 + 0x7C200600, // 0018 CALL R8 3 + 0x5824000C, // 0019 LDCONST R9 K12 + 0x7C180600, // 001A CALL R6 3 + 0x8C180305, // 001B GETMET R6 R1 K5 + 0x58200006, // 001C LDCONST R8 K6 + 0x7C180400, // 001D CALL R6 2 + 0x781A0006, // 001E JMPF R6 #0026 + 0x8818010D, // 001F GETMBR R6 R0 K13 + 0x601C0009, // 0020 GETGBL R7 G9 + 0x8C20030F, // 0021 GETMET R8 R1 K15 + 0x58280006, // 0022 LDCONST R10 K6 + 0x7C200400, // 0023 CALL R8 2 + 0x7C1C0200, // 0024 CALL R7 1 + 0x901A1C07, // 0025 SETMBR R6 K14 R7 + 0x8C180305, // 0026 GETMET R6 R1 K5 + 0x58200007, // 0027 LDCONST R8 K7 + 0x7C180400, // 0028 CALL R6 2 + 0x781A0006, // 0029 JMPF R6 #0031 + 0x8818010D, // 002A GETMBR R6 R0 K13 + 0x601C0009, // 002B GETGBL R7 G9 + 0x8C20030F, // 002C GETMET R8 R1 K15 + 0x58280007, // 002D LDCONST R10 K7 + 0x7C200400, // 002E CALL R8 2 + 0x7C1C0200, // 002F CALL R7 1 + 0x901A2007, // 0030 SETMBR R6 K16 R7 + 0x8818010D, // 0031 GETMBR R6 R0 K13 + 0x8C1C030F, // 0032 GETMET R7 R1 K15 + 0x58240012, // 0033 LDCONST R9 K18 + 0x7C1C0400, // 0034 CALL R7 2 + 0x1C1C0F13, // 0035 EQ R7 R7 K19 + 0x901A2207, // 0036 SETMBR R6 K17 R7 + 0x8818010D, // 0037 GETMBR R6 R0 K13 + 0x8C180D14, // 0038 GETMET R6 R6 K20 + 0x7C180200, // 0039 CALL R6 1 + 0x8C180315, // 003A GETMET R6 R1 K21 + 0x58200016, // 003B LDCONST R8 K22 + 0x7C180400, // 003C CALL R6 2 + 0x700200F1, // 003D JMP #0130 + 0x8C180305, // 003E GETMET R6 R1 K5 + 0x58200017, // 003F LDCONST R8 K23 + 0x7C180400, // 0040 CALL R6 2 + 0x781A0014, // 0041 JMPF R6 #0057 + 0xB81A1000, // 0042 GETNGBL R6 K8 + 0x8C180D09, // 0043 GETMET R6 R6 K9 + 0x8C20050A, // 0044 GETMET R8 R2 K10 + 0x5828000B, // 0045 LDCONST R10 K11 + 0x582C0017, // 0046 LDCONST R11 K23 + 0x7C200600, // 0047 CALL R8 3 + 0x5824000C, // 0048 LDCONST R9 K12 + 0x7C180600, // 0049 CALL R6 3 + 0xB81A1000, // 004A GETNGBL R6 K8 + 0x8C180D18, // 004B GETMET R6 R6 K24 + 0x60200008, // 004C GETGBL R8 G8 + 0xB8263400, // 004D GETNGBL R9 K26 + 0x8824131B, // 004E GETMBR R9 R9 K27 + 0x7C200200, // 004F CALL R8 1 + 0x00223208, // 0050 ADD R8 K25 R8 + 0x0020111C, // 0051 ADD R8 R8 K28 + 0x7C180400, // 0052 CALL R6 2 + 0x8C180315, // 0053 GETMET R6 R1 K21 + 0x58200016, // 0054 LDCONST R8 K22 + 0x7C180400, // 0055 CALL R6 2 + 0x700200D8, // 0056 JMP #0130 + 0x8C180305, // 0057 GETMET R6 R1 K5 + 0x5820001D, // 0058 LDCONST R8 K29 + 0x7C180400, // 0059 CALL R6 2 + 0x781A0014, // 005A JMPF R6 #0070 + 0xB81A1000, // 005B GETNGBL R6 K8 + 0x8C180D09, // 005C GETMET R6 R6 K9 + 0x8C20050A, // 005D GETMET R8 R2 K10 + 0x5828000B, // 005E LDCONST R10 K11 + 0x582C001D, // 005F LDCONST R11 K29 + 0x7C200600, // 0060 CALL R8 3 + 0x5824000C, // 0061 LDCONST R9 K12 + 0x7C180600, // 0062 CALL R6 3 + 0xB81A1000, // 0063 GETNGBL R6 K8 + 0x8C180D18, // 0064 GETMET R6 R6 K24 + 0x60200008, // 0065 GETGBL R8 G8 + 0xB8263400, // 0066 GETNGBL R9 K26 + 0x8824131B, // 0067 GETMBR R9 R9 K27 + 0x7C200200, // 0068 CALL R8 1 + 0x00223208, // 0069 ADD R8 K25 R8 + 0x0020111E, // 006A ADD R8 R8 K30 + 0x7C180400, // 006B CALL R6 2 + 0x8C180315, // 006C GETMET R6 R1 K21 + 0x58200016, // 006D LDCONST R8 K22 + 0x7C180400, // 006E CALL R6 2 + 0x700200BF, // 006F JMP #0130 + 0x8C180305, // 0070 GETMET R6 R1 K5 + 0x5820001F, // 0071 LDCONST R8 K31 + 0x7C180400, // 0072 CALL R6 2 + 0x781A0026, // 0073 JMPF R6 #009B + 0xB81A1000, // 0074 GETNGBL R6 K8 + 0x8C180D09, // 0075 GETMET R6 R6 K9 + 0x8C20050A, // 0076 GETMET R8 R2 K10 + 0x5828000B, // 0077 LDCONST R10 K11 + 0x582C001F, // 0078 LDCONST R11 K31 + 0x7C200600, // 0079 CALL R8 3 + 0x5824000C, // 007A LDCONST R9 K12 + 0x7C180600, // 007B CALL R6 3 + 0x60180009, // 007C GETGBL R6 G9 + 0x8C1C030F, // 007D GETMET R7 R1 K15 + 0x5824001F, // 007E LDCONST R9 K31 + 0x7C1C0400, // 007F CALL R7 2 + 0x7C180200, // 0080 CALL R6 1 + 0x581C0020, // 0081 LDCONST R7 K32 + 0x8820010D, // 0082 GETMBR R8 R0 K13 + 0x88201121, // 0083 GETMBR R8 R8 K33 + 0x88201122, // 0084 GETMBR R8 R8 K34 + 0x6024000C, // 0085 GETGBL R9 G12 + 0x5C281000, // 0086 MOVE R10 R8 + 0x7C240200, // 0087 CALL R9 1 + 0x14240E09, // 0088 LT R9 R7 R9 + 0x7826000C, // 0089 JMPF R9 #0097 + 0x94241007, // 008A GETIDX R9 R8 R7 + 0x8C241323, // 008B GETMET R9 R9 K35 + 0x7C240200, // 008C CALL R9 1 + 0x1C241206, // 008D EQ R9 R9 R6 + 0x78260005, // 008E JMPF R9 #0095 + 0x8824010D, // 008F GETMBR R9 R0 K13 + 0x8C241324, // 0090 GETMET R9 R9 K36 + 0x942C1007, // 0091 GETIDX R11 R8 R7 + 0x7C240400, // 0092 CALL R9 2 + 0x70020002, // 0093 JMP #0097 + 0x70020000, // 0094 JMP #0096 + 0x001C0F25, // 0095 ADD R7 R7 K37 + 0x7001FFED, // 0096 JMP #0085 + 0x8C240315, // 0097 GETMET R9 R1 K21 + 0x582C0026, // 0098 LDCONST R11 K38 + 0x7C240400, // 0099 CALL R9 2 + 0x70020094, // 009A JMP #0130 + 0x8C180305, // 009B GETMET R6 R1 K5 + 0x58200027, // 009C LDCONST R8 K39 + 0x7C180400, // 009D CALL R6 2 + 0x781A0011, // 009E JMPF R6 #00B1 + 0xB81A1000, // 009F GETNGBL R6 K8 + 0x8C180D09, // 00A0 GETMET R6 R6 K9 + 0x8C20050A, // 00A1 GETMET R8 R2 K10 + 0x5828000B, // 00A2 LDCONST R10 K11 + 0x582C0027, // 00A3 LDCONST R11 K39 + 0x7C200600, // 00A4 CALL R8 3 + 0x5824000C, // 00A5 LDCONST R9 K12 + 0x7C180600, // 00A6 CALL R6 3 + 0x8818010D, // 00A7 GETMBR R6 R0 K13 + 0x501C0000, // 00A8 LDBOOL R7 0 0 + 0x901A5007, // 00A9 SETMBR R6 K40 R7 + 0x8818010D, // 00AA GETMBR R6 R0 K13 + 0x8C180D14, // 00AB GETMET R6 R6 K20 + 0x7C180200, // 00AC CALL R6 1 + 0x8C180315, // 00AD GETMET R6 R1 K21 + 0x58200016, // 00AE LDCONST R8 K22 + 0x7C180400, // 00AF CALL R6 2 + 0x7002007E, // 00B0 JMP #0130 + 0x8C180305, // 00B1 GETMET R6 R1 K5 + 0x58200029, // 00B2 LDCONST R8 K41 + 0x7C180400, // 00B3 CALL R6 2 + 0x781A007A, // 00B4 JMPF R6 #0130 + 0x60180013, // 00B5 GETGBL R6 G19 + 0x7C180000, // 00B6 CALL R6 0 + 0xB81E1000, // 00B7 GETNGBL R7 K8 + 0x8C1C0F09, // 00B8 GETMET R7 R7 K9 + 0x8C24050A, // 00B9 GETMET R9 R2 K10 + 0x582C000B, // 00BA LDCONST R11 K11 + 0x58300029, // 00BB LDCONST R12 K41 + 0x7C240600, // 00BC CALL R9 3 + 0x5828000C, // 00BD LDCONST R10 K12 + 0x7C1C0600, // 00BE CALL R7 3 + 0x581C0020, // 00BF LDCONST R7 K32 + 0x8C20050A, // 00C0 GETMET R8 R2 K10 + 0x5828002A, // 00C1 LDCONST R10 K42 + 0x5C2C0E00, // 00C2 MOVE R11 R7 + 0x7C200600, // 00C3 CALL R8 3 + 0x8C240305, // 00C4 GETMET R9 R1 K5 + 0x002E5608, // 00C5 ADD R11 K43 R8 + 0x7C240400, // 00C6 CALL R9 2 + 0x78260043, // 00C7 JMPF R9 #010C + 0x8C24030F, // 00C8 GETMET R9 R1 K15 + 0x002E5608, // 00C9 ADD R11 K43 R8 + 0x7C240400, // 00CA CALL R9 2 + 0x60280009, // 00CB GETGBL R10 G9 + 0x5C2C1200, // 00CC MOVE R11 R9 + 0x7C280200, // 00CD CALL R10 1 + 0x8C2C030F, // 00CE GETMET R11 R1 K15 + 0x00365808, // 00CF ADD R13 K44 R8 + 0x7C2C0400, // 00D0 CALL R11 2 + 0x8C30030F, // 00D1 GETMET R12 R1 K15 + 0x003A1E08, // 00D2 ADD R14 K15 R8 + 0x7C300400, // 00D3 CALL R12 2 + 0xB8361000, // 00D4 GETNGBL R13 K8 + 0x8C341B09, // 00D5 GETMET R13 R13 K9 + 0x8C3C050A, // 00D6 GETMET R15 R2 K10 + 0x5844002D, // 00D7 LDCONST R17 K45 + 0x5C481200, // 00D8 MOVE R18 R9 + 0x5C4C1600, // 00D9 MOVE R19 R11 + 0x5C501800, // 00DA MOVE R20 R12 + 0x7C3C0A00, // 00DB CALL R15 5 + 0x5840000C, // 00DC LDCONST R16 K12 + 0x7C340600, // 00DD CALL R13 3 + 0x2034132E, // 00DE NE R13 R9 K46 + 0x7836001F, // 00DF JMPF R13 #0100 + 0x2034172E, // 00E0 NE R13 R11 K46 + 0x7836001D, // 00E1 JMPF R13 #0100 + 0x8834010D, // 00E2 GETMBR R13 R0 K13 + 0x88341B2F, // 00E3 GETMBR R13 R13 K47 + 0x8C341B30, // 00E4 GETMET R13 R13 K48 + 0x5C3C1600, // 00E5 MOVE R15 R11 + 0x7C340400, // 00E6 CALL R13 2 + 0x4C380000, // 00E7 LDNIL R14 + 0x20381A0E, // 00E8 NE R14 R13 R14 + 0x783A000C, // 00E9 JMPF R14 #00F7 + 0x60380013, // 00EA GETGBL R14 G19 + 0x7C380000, // 00EB CALL R14 0 + 0x983A620B, // 00EC SETIDX R14 K49 R11 + 0x883C1B32, // 00ED GETMBR R15 R13 K50 + 0x88401B33, // 00EE GETMBR R16 R13 K51 + 0x78320004, // 00EF JMPF R12 #00F5 + 0x783E0003, // 00F0 JMPF R15 #00F5 + 0x5C442000, // 00F1 MOVE R17 R16 + 0x5C481800, // 00F2 MOVE R18 R12 + 0x7C440200, // 00F3 CALL R17 1 + 0x98381E11, // 00F4 SETIDX R14 R15 R17 + 0x9818120E, // 00F5 SETIDX R6 R9 R14 + 0x70020007, // 00F6 JMP #00FF + 0xB83A1000, // 00F7 GETNGBL R14 K8 + 0x8C381D09, // 00F8 GETMET R14 R14 K9 + 0x8C40050A, // 00F9 GETMET R16 R2 K10 + 0x58480034, // 00FA LDCONST R18 K52 + 0x5C4C1600, // 00FB MOVE R19 R11 + 0x7C400600, // 00FC CALL R16 3 + 0x58440035, // 00FD LDCONST R17 K53 + 0x7C380600, // 00FE CALL R14 3 + 0x70020004, // 00FF JMP #0105 + 0xB8361000, // 0100 GETNGBL R13 K8 + 0x8C341B09, // 0101 GETMET R13 R13 K9 + 0x583C0036, // 0102 LDCONST R15 K54 + 0x58400035, // 0103 LDCONST R16 K53 + 0x7C340600, // 0104 CALL R13 3 + 0x001C0F25, // 0105 ADD R7 R7 K37 + 0x8C34050A, // 0106 GETMET R13 R2 K10 + 0x583C002A, // 0107 LDCONST R15 K42 + 0x5C400E00, // 0108 MOVE R16 R7 + 0x7C340600, // 0109 CALL R13 3 + 0x5C201A00, // 010A MOVE R8 R13 + 0x7001FFB7, // 010B JMP #00C4 + 0xB8261000, // 010C GETNGBL R9 K8 + 0x8C241309, // 010D GETMET R9 R9 K9 + 0x8C2C050A, // 010E GETMET R11 R2 K10 + 0x58340037, // 010F LDCONST R13 K55 + 0x60380008, // 0110 GETGBL R14 G8 + 0x5C3C0C00, // 0111 MOVE R15 R6 + 0x7C380200, // 0112 CALL R14 1 + 0x7C2C0600, // 0113 CALL R11 3 + 0x5830000C, // 0114 LDCONST R12 K12 + 0x7C240600, // 0115 CALL R9 3 + 0x8C240D38, // 0116 GETMET R9 R6 K56 + 0x582C0039, // 0117 LDCONST R11 K57 + 0x7C240400, // 0118 CALL R9 2 + 0x74260000, // 0119 JMPT R9 #011B + 0x5814003A, // 011A LDCONST R5 K58 + 0x78160008, // 011B JMPF R5 #0125 + 0xB8261000, // 011C GETNGBL R9 K8 + 0x8C241309, // 011D GETMET R9 R9 K9 + 0x8C2C050A, // 011E GETMET R11 R2 K10 + 0x5834003B, // 011F LDCONST R13 K59 + 0x5C380A00, // 0120 MOVE R14 R5 + 0x7C2C0600, // 0121 CALL R11 3 + 0x5830000C, // 0122 LDCONST R12 K12 + 0x7C240600, // 0123 CALL R9 3 + 0x7002000A, // 0124 JMP #0130 + 0x8824010D, // 0125 GETMBR R9 R0 K13 + 0x90267806, // 0126 SETMBR R9 K60 R6 + 0x8824010D, // 0127 GETMBR R9 R0 K13 + 0x50280200, // 0128 LDBOOL R10 1 0 + 0x9026500A, // 0129 SETMBR R9 K40 R10 + 0x8824010D, // 012A GETMBR R9 R0 K13 + 0x8C241314, // 012B GETMET R9 R9 K20 + 0x7C240200, // 012C CALL R9 1 + 0x8C240315, // 012D GETMET R9 R1 K21 + 0x582C0016, // 012E LDCONST R11 K22 + 0x7C240400, // 012F CALL R9 2 + 0x78160011, // 0130 JMPF R5 #0143 + 0x8C18033D, // 0131 GETMET R6 R1 K61 + 0x5820003E, // 0132 LDCONST R8 K62 + 0x7C180400, // 0133 CALL R6 2 + 0x8C18033F, // 0134 GETMET R6 R1 K63 + 0x7C180200, // 0135 CALL R6 1 + 0x8C180340, // 0136 GETMET R6 R1 K64 + 0x8C20050A, // 0137 GETMET R8 R2 K10 + 0x58280041, // 0138 LDCONST R10 K65 + 0x8C2C0342, // 0139 GETMET R11 R1 K66 + 0x5C340A00, // 013A MOVE R13 R5 + 0x7C2C0400, // 013B CALL R11 2 + 0x7C200600, // 013C CALL R8 3 + 0x7C180400, // 013D CALL R6 2 + 0x8C180343, // 013E GETMET R6 R1 K67 + 0x88200344, // 013F GETMBR R8 R1 K68 + 0x7C180400, // 0140 CALL R6 2 + 0x8C180345, // 0141 GETMET R6 R1 K69 + 0x7C180200, // 0142 CALL R6 1 + 0xA8040001, // 0143 EXBLK 1 1 + 0x7002001D, // 0144 JMP #0163 + 0xAC180002, // 0145 CATCH R6 0 2 + 0x7002001A, // 0146 JMP #0162 + 0xB8221000, // 0147 GETNGBL R8 K8 + 0x8C201109, // 0148 GETMET R8 R8 K9 + 0x8C28050A, // 0149 GETMET R10 R2 K10 + 0x58300046, // 014A LDCONST R12 K70 + 0x5C340C00, // 014B MOVE R13 R6 + 0x5C380E00, // 014C MOVE R14 R7 + 0x7C280800, // 014D CALL R10 4 + 0x582C0035, // 014E LDCONST R11 K53 + 0x7C200600, // 014F CALL R8 3 + 0x8C20033D, // 0150 GETMET R8 R1 K61 + 0x5828003E, // 0151 LDCONST R10 K62 + 0x7C200400, // 0152 CALL R8 2 + 0x8C20033F, // 0153 GETMET R8 R1 K63 + 0x7C200200, // 0154 CALL R8 1 + 0x8C200340, // 0155 GETMET R8 R1 K64 + 0x8C28050A, // 0156 GETMET R10 R2 K10 + 0x58300047, // 0157 LDCONST R12 K71 + 0x5C340C00, // 0158 MOVE R13 R6 + 0x5C380E00, // 0159 MOVE R14 R7 + 0x7C280800, // 015A CALL R10 4 + 0x7C200400, // 015B CALL R8 2 + 0x8C200343, // 015C GETMET R8 R1 K67 + 0x88280344, // 015D GETMBR R10 R1 K68 + 0x7C200400, // 015E CALL R8 2 + 0x8C200345, // 015F GETMET R8 R1 K69 + 0x7C200200, // 0160 CALL R8 1 + 0x70020000, // 0161 JMP #0163 + 0xB0080000, // 0162 RAISE 2 R0 R0 + 0x80000000, // 0163 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: web_get_arg +********************************************************************/ +be_local_closure(Matter_UI_web_get_arg, /* name */ + be_nested_proto( + 5, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 7]) { /* constants */ + /* K0 */ be_nested_str_weak(webserver), + /* K1 */ be_nested_str_weak(has_arg), + /* K2 */ be_nested_str_weak(mtc0), + /* K3 */ be_nested_str_weak(device), + /* K4 */ be_nested_str_weak(stop_basic_commissioning), + /* K5 */ be_nested_str_weak(mtc1), + /* K6 */ be_nested_str_weak(start_root_basic_commissioning), + }), + be_str_weak(web_get_arg), + &be_const_str_solidified, + ( &(const binstruction[17]) { /* code */ + 0xA4060000, // 0000 IMPORT R1 K0 + 0x8C080301, // 0001 GETMET R2 R1 K1 + 0x58100002, // 0002 LDCONST R4 K2 + 0x7C080400, // 0003 CALL R2 2 + 0x780A0003, // 0004 JMPF R2 #0009 + 0x88080103, // 0005 GETMBR R2 R0 K3 + 0x8C080504, // 0006 GETMET R2 R2 K4 + 0x7C080200, // 0007 CALL R2 1 + 0x70020006, // 0008 JMP #0010 + 0x8C080301, // 0009 GETMET R2 R1 K1 + 0x58100005, // 000A LDCONST R4 K5 + 0x7C080400, // 000B CALL R2 2 + 0x780A0002, // 000C JMPF R2 #0010 + 0x88080103, // 000D GETMBR R2 R0 K3 + 0x8C080506, // 000E GETMET R2 R2 K6 + 0x7C080200, // 000F CALL R2 1 + 0x80000000, // 0010 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: show_plugins_configuration +********************************************************************/ +be_local_closure(Matter_UI_show_plugins_configuration, /* name */ + be_nested_proto( + 19, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[31]) { /* constants */ + /* K0 */ be_nested_str_weak(webserver), + /* K1 */ be_nested_str_weak(string), + /* K2 */ be_nested_str_weak(content_send), + /* K3 */ be_nested_str_weak(_X3Cfieldset_X3E_X3Clegend_X3E_X3Cb_X3E_X26nbsp_X3BCurrent_X20Configuration_X26nbsp_X3B_X3C_X2Fb_X3E_X3C_X2Flegend_X3E_X3Cp_X3E_X3C_X2Fp_X3E), + /* K4 */ be_nested_str_weak(_X3Cform_X20action_X3D_X27_X2Fmatterc_X27_X20method_X3D_X27post_X27), + /* K5 */ be_nested_str_weak(onsubmit_X3D_X27return_X20confirm_X28_X22This_X20will_X20RESET_X20the_X20configuration_X20to_X20the_X20default_X2E_X20You_X20will_X20need_X20to_X20associate_X20again_X2E_X22_X29_X3B_X27_X3E), + /* K6 */ be_nested_str_weak(_X3Cbutton_X20name_X3D_X27auto_X27_X20class_X3D_X27button_X20bred_X27_X3EReset_X20to_X20default_X3C_X2Fbutton_X3E_X3Cp_X3E_X3C_X2Fp_X3E_X3C_X2Fform_X3E), + /* K7 */ be_nested_str_weak(onsubmit_X3D_X27return_X20confirm_X28_X22Changing_X20the_X20configuration_X20requires_X20to_X20associate_X20again_X2E_X22_X29_X3B_X27_X3E), + /* K8 */ be_nested_str_weak(_X3Ctable_X20style_X3D_X27width_X3A100_X25_X27_X3E), + /* K9 */ be_nested_str_weak(_X3Ctr_X3E_X3Ctd_X20width_X3D_X2735_X27_X3E_X3Cb_X3EEp_X2E_X3C_X2Fb_X3E_X3C_X2Ftd_X3E_X3Ctd_X3E_X3Cb_X3EType_X3C_X2Fb_X3E_X3C_X2Ftd_X3E_X3Ctd_X3E_X3Cb_X3EParam_X3C_X2Fb_X3E_X3C_X2Ftd_X3E_X3C_X2Ftr_X3E), + /* K10 */ be_nested_str_weak(device), + /* K11 */ be_nested_str_weak(k2l_num), + /* K12 */ be_nested_str_weak(plugins_config), + /* K13 */ be_const_int(0), + /* K14 */ be_nested_str_weak(find), + /* K15 */ be_nested_str_weak(type), + /* K16 */ be_nested_str_weak(get_plugin_class_arg), + /* K17 */ be_nested_str_weak(), + /* K18 */ be_nested_str_weak(format), + /* K19 */ be_nested_str_weak(_X3Ctr_X3E_X3Ctd_X3E_X3Cinput_X20type_X3D_X27text_X27_X20name_X3D_X27ep_X2503i_X27_X20maxlength_X3D_X274_X27_X20size_X3D_X273_X27_X20pattern_X3D_X27_X5B0_X2D9_X5D_X7B1_X2C4_X7D_X27_X20value_X3D_X27_X25i_X27_X3E_X3C_X2Ftd_X3E), + /* K20 */ be_nested_str_weak(_X3Ctd_X3E_X3Cselect_X20name_X3D_X27pi_X2503i_X27_X3E), + /* K21 */ be_nested_str_weak(plugin_option), + /* K22 */ be_nested_str_weak(_X3C_X2Fselect_X3E_X3C_X2Ftd_X3E), + /* K23 */ be_nested_str_weak(_X3Ctd_X3E_X3Cfont_X20size_X3D_X27_X2D1_X27_X3E_X3Cinput_X20type_X3D_X27text_X27_X20name_X3D_X27arg_X2503i_X27_X20minlength_X3D_X270_X27_X20size_X3D_X278_X27_X20value_X3D_X27_X25s_X27_X3E_X3C_X2Ffont_X3E_X3C_X2Ftd_X3E), + /* K24 */ be_nested_str_weak(html_escape), + /* K25 */ be_const_int(1), + /* K26 */ be_nested_str_weak(_X3Ctr_X3E_X3Ctd_X3E_X3Cinput_X20type_X3D_X27text_X27_X20name_X3D_X27ep_X2503i_X27_X20maxlength_X3D_X274_X27_X20size_X3D_X273_X27_X20pattern_X3D_X27_X5B0_X2D9_X5D_X7B1_X2C4_X7D_X27_X20value_X3D_X27_X27_X3E_X3C_X2Ftd_X3E), + /* K27 */ be_nested_str_weak(_X3Ctd_X3E_X3Cfont_X20size_X3D_X27_X2D1_X27_X3E_X3Cinput_X20type_X3D_X27text_X27_X20name_X3D_X27arg_X2503i_X27_X20minlength_X3D_X270_X27_X20size_X3D_X278_X27_X20value_X3D_X27_X27_X3E_X3C_X2Ffont_X3E_X3C_X2Ftd_X3E), + /* K28 */ be_nested_str_weak(_X3C_X2Ftable_X3E_X3Cp_X3E_X3C_X2Fp_X3E), + /* K29 */ be_nested_str_weak(_X3Cbutton_X20name_X3D_X27config_X27_X20class_X3D_X27button_X20bgrn_X27_X3EChange_X20configuration_X3C_X2Fbutton_X3E_X3C_X2Fform_X3E), + /* K30 */ be_nested_str_weak(_X3Cp_X3E_X3C_X2Fp_X3E_X3C_X2Ffieldset_X3E_X3Cp_X3E_X3C_X2Fp_X3E), + }), + be_str_weak(show_plugins_configuration), + &be_const_str_solidified, + ( &(const binstruction[135]) { /* code */ + 0xA4060000, // 0000 IMPORT R1 K0 + 0xA40A0200, // 0001 IMPORT R2 K1 + 0x8C0C0302, // 0002 GETMET R3 R1 K2 + 0x58140003, // 0003 LDCONST R5 K3 + 0x7C0C0400, // 0004 CALL R3 2 + 0x8C0C0302, // 0005 GETMET R3 R1 K2 + 0x58140004, // 0006 LDCONST R5 K4 + 0x7C0C0400, // 0007 CALL R3 2 + 0x8C0C0302, // 0008 GETMET R3 R1 K2 + 0x58140005, // 0009 LDCONST R5 K5 + 0x7C0C0400, // 000A CALL R3 2 + 0x8C0C0302, // 000B GETMET R3 R1 K2 + 0x58140006, // 000C LDCONST R5 K6 + 0x7C0C0400, // 000D CALL R3 2 + 0x8C0C0302, // 000E GETMET R3 R1 K2 + 0x58140004, // 000F LDCONST R5 K4 + 0x7C0C0400, // 0010 CALL R3 2 + 0x8C0C0302, // 0011 GETMET R3 R1 K2 + 0x58140007, // 0012 LDCONST R5 K7 + 0x7C0C0400, // 0013 CALL R3 2 + 0x8C0C0302, // 0014 GETMET R3 R1 K2 + 0x58140008, // 0015 LDCONST R5 K8 + 0x7C0C0400, // 0016 CALL R3 2 + 0x8C0C0302, // 0017 GETMET R3 R1 K2 + 0x58140009, // 0018 LDCONST R5 K9 + 0x7C0C0400, // 0019 CALL R3 2 + 0x880C010A, // 001A GETMBR R3 R0 K10 + 0x8C0C070B, // 001B GETMET R3 R3 K11 + 0x8814010A, // 001C GETMBR R5 R0 K10 + 0x88140B0C, // 001D GETMBR R5 R5 K12 + 0x7C0C0400, // 001E CALL R3 2 + 0x5810000D, // 001F LDCONST R4 K13 + 0x6014000C, // 0020 GETGBL R5 G12 + 0x5C180600, // 0021 MOVE R6 R3 + 0x7C140200, // 0022 CALL R5 1 + 0x14140805, // 0023 LT R5 R4 R5 + 0x7816003D, // 0024 JMPF R5 #0063 + 0x94140604, // 0025 GETIDX R5 R3 R4 + 0x8818010A, // 0026 GETMBR R6 R0 K10 + 0x601C0008, // 0027 GETGBL R7 G8 + 0x5C200A00, // 0028 MOVE R8 R5 + 0x7C1C0200, // 0029 CALL R7 1 + 0x88180D0C, // 002A GETMBR R6 R6 K12 + 0x94180C07, // 002B GETIDX R6 R6 R7 + 0x8C200D0E, // 002C GETMET R8 R6 K14 + 0x5828000F, // 002D LDCONST R10 K15 + 0x7C200400, // 002E CALL R8 2 + 0x5C1C1000, // 002F MOVE R7 R8 + 0x5C200E00, // 0030 MOVE R8 R7 + 0x74220000, // 0031 JMPT R8 #0033 + 0x7001FFEC, // 0032 JMP #0020 + 0x8820010A, // 0033 GETMBR R8 R0 K10 + 0x8C201110, // 0034 GETMET R8 R8 K16 + 0x5C280E00, // 0035 MOVE R10 R7 + 0x7C200400, // 0036 CALL R8 2 + 0x78220006, // 0037 JMPF R8 #003F + 0x60240008, // 0038 GETGBL R9 G8 + 0x8C280D0E, // 0039 GETMET R10 R6 K14 + 0x5C301000, // 003A MOVE R12 R8 + 0x58340011, // 003B LDCONST R13 K17 + 0x7C280600, // 003C CALL R10 3 + 0x7C240200, // 003D CALL R9 1 + 0x70020000, // 003E JMP #0040 + 0x58240011, // 003F LDCONST R9 K17 + 0x8C280302, // 0040 GETMET R10 R1 K2 + 0x8C300512, // 0041 GETMET R12 R2 K18 + 0x58380013, // 0042 LDCONST R14 K19 + 0x5C3C0800, // 0043 MOVE R15 R4 + 0x5C400A00, // 0044 MOVE R16 R5 + 0x7C300800, // 0045 CALL R12 4 + 0x7C280400, // 0046 CALL R10 2 + 0x8C280302, // 0047 GETMET R10 R1 K2 + 0x8C300512, // 0048 GETMET R12 R2 K18 + 0x58380014, // 0049 LDCONST R14 K20 + 0x5C3C0800, // 004A MOVE R15 R4 + 0x7C300600, // 004B CALL R12 3 + 0x7C280400, // 004C CALL R10 2 + 0x8C280115, // 004D GETMET R10 R0 K21 + 0x8C300D0E, // 004E GETMET R12 R6 K14 + 0x5838000F, // 004F LDCONST R14 K15 + 0x583C0011, // 0050 LDCONST R15 K17 + 0x7C300600, // 0051 CALL R12 3 + 0x7C280400, // 0052 CALL R10 2 + 0x8C280302, // 0053 GETMET R10 R1 K2 + 0x8C300512, // 0054 GETMET R12 R2 K18 + 0x58380016, // 0055 LDCONST R14 K22 + 0x7C300400, // 0056 CALL R12 2 + 0x7C280400, // 0057 CALL R10 2 + 0x8C280302, // 0058 GETMET R10 R1 K2 + 0x8C300512, // 0059 GETMET R12 R2 K18 + 0x58380017, // 005A LDCONST R14 K23 + 0x5C3C0800, // 005B MOVE R15 R4 + 0x8C400318, // 005C GETMET R16 R1 K24 + 0x5C481200, // 005D MOVE R18 R9 + 0x7C400400, // 005E CALL R16 2 + 0x7C300800, // 005F CALL R12 4 + 0x7C280400, // 0060 CALL R10 2 + 0x00100919, // 0061 ADD R4 R4 K25 + 0x7001FFBC, // 0062 JMP #0020 + 0x8C140302, // 0063 GETMET R5 R1 K2 + 0x8C1C0512, // 0064 GETMET R7 R2 K18 + 0x5824001A, // 0065 LDCONST R9 K26 + 0x5C280800, // 0066 MOVE R10 R4 + 0x7C1C0600, // 0067 CALL R7 3 + 0x7C140400, // 0068 CALL R5 2 + 0x8C140302, // 0069 GETMET R5 R1 K2 + 0x8C1C0512, // 006A GETMET R7 R2 K18 + 0x58240014, // 006B LDCONST R9 K20 + 0x5C280800, // 006C MOVE R10 R4 + 0x7C1C0600, // 006D CALL R7 3 + 0x7C140400, // 006E CALL R5 2 + 0x8C140115, // 006F GETMET R5 R0 K21 + 0x581C0011, // 0070 LDCONST R7 K17 + 0x7C140400, // 0071 CALL R5 2 + 0x8C140302, // 0072 GETMET R5 R1 K2 + 0x8C1C0512, // 0073 GETMET R7 R2 K18 + 0x58240016, // 0074 LDCONST R9 K22 + 0x7C1C0400, // 0075 CALL R7 2 + 0x7C140400, // 0076 CALL R5 2 + 0x8C140302, // 0077 GETMET R5 R1 K2 + 0x8C1C0512, // 0078 GETMET R7 R2 K18 + 0x5824001B, // 0079 LDCONST R9 K27 + 0x5C280800, // 007A MOVE R10 R4 + 0x7C1C0600, // 007B CALL R7 3 + 0x7C140400, // 007C CALL R5 2 + 0x8C140302, // 007D GETMET R5 R1 K2 + 0x581C001C, // 007E LDCONST R7 K28 + 0x7C140400, // 007F CALL R5 2 + 0x8C140302, // 0080 GETMET R5 R1 K2 + 0x581C001D, // 0081 LDCONST R7 K29 + 0x7C140400, // 0082 CALL R5 2 + 0x8C140302, // 0083 GETMET R5 R1 K2 + 0x581C001E, // 0084 LDCONST R7 K30 + 0x7C140400, // 0085 CALL R5 2 + 0x80000000, // 0086 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: plugin_option +********************************************************************/ +be_local_closure(Matter_UI_plugin_option, /* name */ + be_nested_proto( + 16, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[15]) { /* constants */ + /* K0 */ be_nested_str_weak(webserver), + /* K1 */ be_nested_str_weak(string), + /* K2 */ be_nested_str_weak(split), + /* K3 */ be_nested_str_weak(_CLASSES_TYPES), + /* K4 */ be_nested_str_weak(_X7C), + /* K5 */ be_const_int(0), + /* K6 */ be_nested_str_weak(content_send), + /* K7 */ be_nested_str_weak(_X3Coption_X20value_X3D_X27_X27_X3E_X3C_X2Foption_X3E), + /* K8 */ be_nested_str_weak(device), + /* K9 */ be_nested_str_weak(get_plugin_class_displayname), + /* K10 */ be_nested_str_weak(format), + /* K11 */ be_nested_str_weak(_X3Coption_X20value_X3D_X27_X25s_X27_X25s_X3E_X25s_X3C_X2Foption_X3E), + /* K12 */ be_nested_str_weak(_X20selected), + /* K13 */ be_nested_str_weak(), + /* K14 */ be_const_int(1), + }), + be_str_weak(plugin_option), + &be_const_str_solidified, + ( &(const binstruction[35]) { /* code */ 0xA40A0000, // 0000 IMPORT R2 K0 0xA40E0200, // 0001 IMPORT R3 K1 - 0x8C100502, // 0002 GETMET R4 R2 K2 - 0x58180003, // 0003 LDCONST R6 K3 - 0x7C100400, // 0004 CALL R4 2 - 0x8C100502, // 0005 GETMET R4 R2 K2 - 0x58180004, // 0006 LDCONST R6 K4 - 0x7C100400, // 0007 CALL R4 2 - 0x6010000C, // 0008 GETGBL R4 G12 - 0x88140105, // 0009 GETMBR R5 R0 K5 - 0x88140B06, // 000A GETMBR R5 R5 K6 - 0x88140B06, // 000B GETMBR R5 R5 K6 - 0x7C100200, // 000C CALL R4 1 - 0x1C100907, // 000D EQ R4 R4 K7 - 0x78120003, // 000E JMPF R4 #0013 - 0x8C100502, // 000F GETMET R4 R2 K2 - 0x58180008, // 0010 LDCONST R6 K8 - 0x7C100400, // 0011 CALL R4 2 - 0x7002004E, // 0012 JMP #0062 - 0x50100200, // 0013 LDBOOL R4 1 0 - 0x60140010, // 0014 GETGBL R5 G16 - 0x88180105, // 0015 GETMBR R6 R0 K5 - 0x88180D06, // 0016 GETMBR R6 R6 K6 - 0x88180D09, // 0017 GETMBR R6 R6 K9 - 0x8C180D0A, // 0018 GETMET R6 R6 K10 - 0x7C180200, // 0019 CALL R6 1 - 0x7C140200, // 001A CALL R5 1 - 0xA8020042, // 001B EXBLK 0 #005F - 0x5C180A00, // 001C MOVE R6 R5 - 0x7C180000, // 001D CALL R6 0 - 0x5C1C0800, // 001E MOVE R7 R4 - 0x741E0002, // 001F JMPT R7 #0023 - 0x8C1C0502, // 0020 GETMET R7 R2 K2 - 0x5824000B, // 0021 LDCONST R9 K11 - 0x7C1C0400, // 0022 CALL R7 2 - 0x50100000, // 0023 LDBOOL R4 0 0 - 0x881C0D0C, // 0024 GETMBR R7 R6 K12 - 0x5C200E00, // 0025 MOVE R8 R7 - 0x74220000, // 0026 JMPT R8 #0028 - 0x581C000D, // 0027 LDCONST R7 K13 - 0x8C20050E, // 0028 GETMET R8 R2 K14 - 0x5C280E00, // 0029 MOVE R10 R7 - 0x7C200400, // 002A CALL R8 2 - 0x5C1C1000, // 002B MOVE R7 R8 - 0x8C200502, // 002C GETMET R8 R2 K2 - 0x8C28070F, // 002D GETMET R10 R3 K15 - 0x58300010, // 002E LDCONST R12 K16 - 0x8C340D11, // 002F GETMET R13 R6 K17 - 0x7C340200, // 0030 CALL R13 1 - 0x5C380E00, // 0031 MOVE R14 R7 - 0x7C280800, // 0032 CALL R10 4 - 0x7C200400, // 0033 CALL R8 2 - 0x8C200D12, // 0034 GETMET R8 R6 K18 - 0x7C200200, // 0035 CALL R8 1 - 0x8C201113, // 0036 GETMET R8 R8 K19 - 0x7C200200, // 0037 CALL R8 1 - 0x8C201114, // 0038 GETMET R8 R8 K20 - 0x7C200200, // 0039 CALL R8 1 - 0x8C240D15, // 003A GETMET R9 R6 K21 - 0x7C240200, // 003B CALL R9 1 - 0x8C241313, // 003C GETMET R9 R9 K19 - 0x7C240200, // 003D CALL R9 1 - 0x8C241314, // 003E GETMET R9 R9 K20 - 0x7C240200, // 003F CALL R9 1 - 0x8C280502, // 0040 GETMET R10 R2 K2 - 0x8C30070F, // 0041 GETMET R12 R3 K15 - 0x58380016, // 0042 LDCONST R14 K22 - 0x8C3C1117, // 0043 GETMET R15 R8 K23 - 0x7C3C0200, // 0044 CALL R15 1 - 0x7C300600, // 0045 CALL R12 3 - 0x7C280400, // 0046 CALL R10 2 - 0x8C280502, // 0047 GETMET R10 R2 K2 - 0x8C30070F, // 0048 GETMET R12 R3 K15 - 0x58380018, // 0049 LDCONST R14 K24 - 0x8C3C1317, // 004A GETMET R15 R9 K23 - 0x7C3C0200, // 004B CALL R15 1 - 0x7C300600, // 004C CALL R12 3 - 0x7C280400, // 004D CALL R10 2 - 0x8C280502, // 004E GETMET R10 R2 K2 - 0x58300019, // 004F LDCONST R12 K25 - 0x7C280400, // 0050 CALL R10 2 - 0x8C280502, // 0051 GETMET R10 R2 K2 - 0x8C30070F, // 0052 GETMET R12 R3 K15 - 0x5838001A, // 0053 LDCONST R14 K26 - 0x8C3C0D11, // 0054 GETMET R15 R6 K17 - 0x7C3C0200, // 0055 CALL R15 1 - 0x7C300600, // 0056 CALL R12 3 - 0x7C280400, // 0057 CALL R10 2 - 0x8C280502, // 0058 GETMET R10 R2 K2 - 0x5830001B, // 0059 LDCONST R12 K27 - 0x7C280400, // 005A CALL R10 2 - 0x8C280502, // 005B GETMET R10 R2 K2 - 0x5830001C, // 005C LDCONST R12 K28 - 0x7C280400, // 005D CALL R10 2 - 0x7001FFBC, // 005E JMP #001C - 0x5814001D, // 005F LDCONST R5 K29 - 0xAC140200, // 0060 CATCH R5 1 0 - 0xB0080000, // 0061 RAISE 2 R0 R0 - 0x8C100502, // 0062 GETMET R4 R2 K2 - 0x5818001C, // 0063 LDCONST R6 K28 - 0x7C100400, // 0064 CALL R4 2 - 0x80000000, // 0065 RET 0 + 0x8C100702, // 0002 GETMET R4 R3 K2 + 0x88180103, // 0003 GETMBR R6 R0 K3 + 0x581C0004, // 0004 LDCONST R7 K4 + 0x7C100600, // 0005 CALL R4 3 + 0x58140005, // 0006 LDCONST R5 K5 + 0x8C180506, // 0007 GETMET R6 R2 K6 + 0x58200007, // 0008 LDCONST R8 K7 + 0x7C180400, // 0009 CALL R6 2 + 0x6018000C, // 000A GETGBL R6 G12 + 0x5C1C0800, // 000B MOVE R7 R4 + 0x7C180200, // 000C CALL R6 1 + 0x14180A06, // 000D LT R6 R5 R6 + 0x781A0012, // 000E JMPF R6 #0022 + 0x94180805, // 000F GETIDX R6 R4 R5 + 0x881C0108, // 0010 GETMBR R7 R0 K8 + 0x8C1C0F09, // 0011 GETMET R7 R7 K9 + 0x5C240C00, // 0012 MOVE R9 R6 + 0x7C1C0400, // 0013 CALL R7 2 + 0x8C200506, // 0014 GETMET R8 R2 K6 + 0x8C28070A, // 0015 GETMET R10 R3 K10 + 0x5830000B, // 0016 LDCONST R12 K11 + 0x5C340C00, // 0017 MOVE R13 R6 + 0x1C380C01, // 0018 EQ R14 R6 R1 + 0x783A0001, // 0019 JMPF R14 #001C + 0x5838000C, // 001A LDCONST R14 K12 + 0x70020000, // 001B JMP #001D + 0x5838000D, // 001C LDCONST R14 K13 + 0x5C3C0E00, // 001D MOVE R15 R7 + 0x7C280A00, // 001E CALL R10 5 + 0x7C200400, // 001F CALL R8 2 + 0x00140B0E, // 0020 ADD R5 R5 K14 + 0x7001FFE7, // 0021 JMP #000A + 0x80000000, // 0022 RET 0 }) ) ); @@ -283,279 +1473,6 @@ be_local_closure(Matter_UI_web_sensor, /* name */ /*******************************************************************/ -/******************************************************************** -** Solidified function: web_get_arg -********************************************************************/ -be_local_closure(Matter_UI_web_get_arg, /* name */ - be_nested_proto( - 5, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 7]) { /* constants */ - /* K0 */ be_nested_str_weak(webserver), - /* K1 */ be_nested_str_weak(has_arg), - /* K2 */ be_nested_str_weak(mtc0), - /* K3 */ be_nested_str_weak(device), - /* K4 */ be_nested_str_weak(stop_basic_commissioning), - /* K5 */ be_nested_str_weak(mtc1), - /* K6 */ be_nested_str_weak(start_root_basic_commissioning), - }), - be_str_weak(web_get_arg), - &be_const_str_solidified, - ( &(const binstruction[17]) { /* code */ - 0xA4060000, // 0000 IMPORT R1 K0 - 0x8C080301, // 0001 GETMET R2 R1 K1 - 0x58100002, // 0002 LDCONST R4 K2 - 0x7C080400, // 0003 CALL R2 2 - 0x780A0003, // 0004 JMPF R2 #0009 - 0x88080103, // 0005 GETMBR R2 R0 K3 - 0x8C080504, // 0006 GETMET R2 R2 K4 - 0x7C080200, // 0007 CALL R2 1 - 0x70020006, // 0008 JMP #0010 - 0x8C080301, // 0009 GETMET R2 R1 K1 - 0x58100005, // 000A LDCONST R4 K5 - 0x7C080400, // 000B CALL R2 2 - 0x780A0002, // 000C JMPF R2 #0010 - 0x88080103, // 000D GETMBR R2 R0 K3 - 0x8C080506, // 000E GETMET R2 R2 K6 - 0x7C080200, // 000F CALL R2 1 - 0x80000000, // 0010 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: page_part_mgr -********************************************************************/ -be_local_closure(Matter_UI_page_part_mgr, /* name */ - be_nested_proto( - 6, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[12]) { /* constants */ - /* K0 */ be_nested_str_weak(webserver), - /* K1 */ be_nested_str_weak(string), - /* K2 */ be_nested_str_weak(check_privileged_access), - /* K3 */ be_nested_str_weak(content_start), - /* K4 */ be_nested_str_weak(Matter), - /* K5 */ be_nested_str_weak(content_send_style), - /* K6 */ be_nested_str_weak(show_enable), - /* K7 */ be_nested_str_weak(show_passcode_form), - /* K8 */ be_nested_str_weak(show_fabric_info), - /* K9 */ be_nested_str_weak(content_button), - /* K10 */ be_nested_str_weak(BUTTON_CONFIGURATION), - /* K11 */ be_nested_str_weak(content_stop), - }), - be_str_weak(page_part_mgr), - &be_const_str_solidified, - ( &(const binstruction[25]) { /* code */ - 0xA4060000, // 0000 IMPORT R1 K0 - 0xA40A0200, // 0001 IMPORT R2 K1 - 0x8C0C0302, // 0002 GETMET R3 R1 K2 - 0x7C0C0200, // 0003 CALL R3 1 - 0x740E0001, // 0004 JMPT R3 #0007 - 0x4C0C0000, // 0005 LDNIL R3 - 0x80040600, // 0006 RET 1 R3 - 0x8C0C0303, // 0007 GETMET R3 R1 K3 - 0x58140004, // 0008 LDCONST R5 K4 - 0x7C0C0400, // 0009 CALL R3 2 - 0x8C0C0305, // 000A GETMET R3 R1 K5 - 0x7C0C0200, // 000B CALL R3 1 - 0x8C0C0106, // 000C GETMET R3 R0 K6 - 0x7C0C0200, // 000D CALL R3 1 - 0x780E0003, // 000E JMPF R3 #0013 - 0x8C0C0107, // 000F GETMET R3 R0 K7 - 0x7C0C0200, // 0010 CALL R3 1 - 0x8C0C0108, // 0011 GETMET R3 R0 K8 - 0x7C0C0200, // 0012 CALL R3 1 - 0x8C0C0309, // 0013 GETMET R3 R1 K9 - 0x8814030A, // 0014 GETMBR R5 R1 K10 - 0x7C0C0400, // 0015 CALL R3 2 - 0x8C0C030B, // 0016 GETMET R3 R1 K11 - 0x7C0C0200, // 0017 CALL R3 1 - 0x80000000, // 0018 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: web_add_config_button -********************************************************************/ -be_local_closure(Matter_UI_web_add_config_button, /* name */ - be_nested_proto( - 5, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 6]) { /* constants */ - /* K0 */ be_nested_str_weak(webserver), - /* K1 */ be_nested_str_weak(content_send), - /* K2 */ be_nested_str_weak(_X3Cp_X3E_X3Cform_X20id_X3Dac_X20action_X3D_X27matterc_X27_X20style_X3D_X27display_X3A_X20block_X3B_X27_X20method_X3D_X27get_X27_X3E_X3Cbutton_X3E), - /* K3 */ be_nested_str_weak(matter), - /* K4 */ be_nested_str_weak(_LOGO), - /* K5 */ be_nested_str_weak(_X20Configure_X20Matter_X3C_X2Fbutton_X3E_X3C_X2Fform_X3E_X3C_X2Fp_X3E), - }), - be_str_weak(web_add_config_button), - &be_const_str_solidified, - ( &(const binstruction[12]) { /* code */ - 0xA4060000, // 0000 IMPORT R1 K0 - 0x8C080301, // 0001 GETMET R2 R1 K1 - 0x58100002, // 0002 LDCONST R4 K2 - 0x7C080400, // 0003 CALL R2 2 - 0x8C080301, // 0004 GETMET R2 R1 K1 - 0xB8120600, // 0005 GETNGBL R4 K3 - 0x88100904, // 0006 GETMBR R4 R4 K4 - 0x7C080400, // 0007 CALL R2 2 - 0x8C080301, // 0008 GETMET R2 R1 K1 - 0x58100005, // 0009 LDCONST R4 K5 - 0x7C080400, // 000A CALL R2 2 - 0x80000000, // 000B RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: init -********************************************************************/ -be_local_closure(Matter_UI_init, /* name */ - be_nested_proto( - 5, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 3]) { /* constants */ - /* K0 */ be_nested_str_weak(device), - /* K1 */ be_nested_str_weak(tasmota), - /* K2 */ be_nested_str_weak(add_driver), - }), - be_str_weak(init), - &be_const_str_solidified, - ( &(const binstruction[ 6]) { /* code */ - 0x90020001, // 0000 SETMBR R0 K0 R1 - 0xB80A0200, // 0001 GETNGBL R2 K1 - 0x8C080502, // 0002 GETMET R2 R2 K2 - 0x5C100000, // 0003 MOVE R4 R0 - 0x7C080400, // 0004 CALL R2 2 - 0x80000000, // 0005 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: web_add_handler -********************************************************************/ -be_local_closure(Matter_UI_web_add_handler, /* name */ - be_nested_proto( - 7, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 1, /* has sup protos */ - ( &(const struct bproto*[ 2]) { - be_nested_proto( - 2, /* nstack */ - 0, /* argc */ - 0, /* varg */ - 1, /* has upvals */ - ( &(const bupvaldesc[ 1]) { /* upvals */ - be_local_const_upval(1, 0), - }), - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 1]) { /* constants */ - /* K0 */ be_nested_str_weak(page_part_mgr), - }), - be_str_weak(_X3Clambda_X3E), - &be_const_str_solidified, - ( &(const binstruction[ 4]) { /* code */ - 0x68000000, // 0000 GETUPV R0 U0 - 0x8C000100, // 0001 GETMET R0 R0 K0 - 0x7C000200, // 0002 CALL R0 1 - 0x80040000, // 0003 RET 1 R0 - }) - ), - be_nested_proto( - 2, /* nstack */ - 0, /* argc */ - 0, /* varg */ - 1, /* has upvals */ - ( &(const bupvaldesc[ 1]) { /* upvals */ - be_local_const_upval(1, 0), - }), - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 1]) { /* constants */ - /* K0 */ be_nested_str_weak(page_part_ctl), - }), - be_str_weak(_X3Clambda_X3E), - &be_const_str_solidified, - ( &(const binstruction[ 4]) { /* code */ - 0x68000000, // 0000 GETUPV R0 U0 - 0x8C000100, // 0001 GETMET R0 R0 K0 - 0x7C000200, // 0002 CALL R0 1 - 0x80040000, // 0003 RET 1 R0 - }) - ), - }), - 1, /* has constants */ - ( &(const bvalue[ 5]) { /* constants */ - /* K0 */ be_nested_str_weak(webserver), - /* K1 */ be_nested_str_weak(on), - /* K2 */ be_nested_str_weak(_X2Fmatterc), - /* K3 */ be_nested_str_weak(HTTP_GET), - /* K4 */ be_nested_str_weak(HTTP_POST), - }), - be_str_weak(web_add_handler), - &be_const_str_solidified, - ( &(const binstruction[13]) { /* code */ - 0xA4060000, // 0000 IMPORT R1 K0 - 0x8C080301, // 0001 GETMET R2 R1 K1 - 0x58100002, // 0002 LDCONST R4 K2 - 0x84140000, // 0003 CLOSURE R5 P0 - 0x88180303, // 0004 GETMBR R6 R1 K3 - 0x7C080800, // 0005 CALL R2 4 - 0x8C080301, // 0006 GETMET R2 R1 K1 - 0x58100002, // 0007 LDCONST R4 K2 - 0x84140001, // 0008 CLOSURE R5 P1 - 0x88180304, // 0009 GETMBR R6 R1 K4 - 0x7C080800, // 000A CALL R2 4 - 0xA0000000, // 000B CLOSE R0 - 0x80000000, // 000C RET 0 - }) - ) -); -/*******************************************************************/ - - /******************************************************************** ** Solidified function: show_qrcode ********************************************************************/ @@ -723,514 +1640,88 @@ be_local_closure(Matter_UI_show_qrcode, /* name */ /******************************************************************** -** Solidified function: show_passcode_form +** Solidified function: web_add_handler ********************************************************************/ -be_local_closure(Matter_UI_show_passcode_form, /* name */ +be_local_closure(Matter_UI_web_add_handler, /* name */ be_nested_proto( - 9, /* nstack */ + 7, /* nstack */ 1, /* argc */ 2, /* varg */ 0, /* has upvals */ NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[19]) { /* constants */ - /* K0 */ be_nested_str_weak(webserver), - /* K1 */ be_nested_str_weak(string), - /* K2 */ be_nested_str_weak(content_send), - /* K3 */ be_nested_str_weak(_X3Cfieldset_X3E_X3Clegend_X3E_X3Cb_X3E_X26nbsp_X3BMatter_X20Passcode_X26nbsp_X3B_X3C_X2Fb_X3E_X3C_X2Flegend_X3E_X3Cp_X3E_X3C_X2Fp_X3E), - /* K4 */ be_nested_str_weak(_X3Cform_X20action_X3D_X27_X2Fmatterc_X27_X20method_X3D_X27post_X27_X20_X3E), - /* K5 */ be_nested_str_weak(_X3Cp_X3EPasscode_X3A_X3C_X2Fp_X3E), - /* K6 */ be_nested_str_weak(format), - /* K7 */ be_nested_str_weak(_X3Cinput_X20type_X3D_X27number_X27_X20min_X3D_X271_X27_X20max_X3D_X2799999998_X27_X20name_X3D_X27passcode_X27_X20value_X3D_X27_X25i_X27_X3E), - /* K8 */ be_nested_str_weak(device), - /* K9 */ be_nested_str_weak(root_passcode), - /* K10 */ be_nested_str_weak(_X3Cp_X3EDistinguish_X20id_X3A_X3C_X2Fp_X3E), - /* K11 */ be_nested_str_weak(_X3Cinput_X20type_X3D_X27number_X27_X20min_X3D_X270_X27_X20max_X3D_X274095_X27_X20name_X3D_X27discriminator_X27_X20value_X3D_X27_X25i_X27_X3E), - /* K12 */ be_nested_str_weak(root_discriminator), - /* K13 */ be_nested_str_weak(_X3Cp_X3E_X3Cinput_X20type_X3D_X27checkbox_X27_X20name_X3D_X27ipv4_X27_X25s_X3EIPv4_X20only_X3C_X2Fp_X3E), - /* K14 */ be_nested_str_weak(ipv4only), - /* K15 */ be_nested_str_weak(_X20checked), - /* K16 */ be_nested_str_weak(), - /* K17 */ be_nested_str_weak(_X3Cp_X3E_X3C_X2Fp_X3E_X3Cbutton_X20name_X3D_X27passcode_X27_X20class_X3D_X27button_X20bgrn_X27_X3EChange_X3C_X2Fbutton_X3E_X3C_X2Fform_X3E_X3C_X2Fp_X3E), - /* K18 */ be_nested_str_weak(_X3Cp_X3E_X3C_X2Fp_X3E_X3C_X2Ffieldset_X3E_X3Cp_X3E_X3C_X2Fp_X3E), + 1, /* has sup protos */ + ( &(const struct bproto*[ 2]) { + be_nested_proto( + 2, /* nstack */ + 0, /* argc */ + 0, /* varg */ + 1, /* has upvals */ + ( &(const bupvaldesc[ 1]) { /* upvals */ + be_local_const_upval(1, 0), + }), + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 1]) { /* constants */ + /* K0 */ be_nested_str_weak(page_part_mgr), + }), + be_str_weak(_X3Clambda_X3E), + &be_const_str_solidified, + ( &(const binstruction[ 4]) { /* code */ + 0x68000000, // 0000 GETUPV R0 U0 + 0x8C000100, // 0001 GETMET R0 R0 K0 + 0x7C000200, // 0002 CALL R0 1 + 0x80040000, // 0003 RET 1 R0 + }) + ), + be_nested_proto( + 2, /* nstack */ + 0, /* argc */ + 0, /* varg */ + 1, /* has upvals */ + ( &(const bupvaldesc[ 1]) { /* upvals */ + be_local_const_upval(1, 0), + }), + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 1]) { /* constants */ + /* K0 */ be_nested_str_weak(page_part_ctl), + }), + be_str_weak(_X3Clambda_X3E), + &be_const_str_solidified, + ( &(const binstruction[ 4]) { /* code */ + 0x68000000, // 0000 GETUPV R0 U0 + 0x8C000100, // 0001 GETMET R0 R0 K0 + 0x7C000200, // 0002 CALL R0 1 + 0x80040000, // 0003 RET 1 R0 + }) + ), }), - be_str_weak(show_passcode_form), - &be_const_str_solidified, - ( &(const binstruction[46]) { /* code */ - 0xA4060000, // 0000 IMPORT R1 K0 - 0xA40A0200, // 0001 IMPORT R2 K1 - 0x8C0C0302, // 0002 GETMET R3 R1 K2 - 0x58140003, // 0003 LDCONST R5 K3 - 0x7C0C0400, // 0004 CALL R3 2 - 0x8C0C0302, // 0005 GETMET R3 R1 K2 - 0x58140004, // 0006 LDCONST R5 K4 - 0x7C0C0400, // 0007 CALL R3 2 - 0x8C0C0302, // 0008 GETMET R3 R1 K2 - 0x58140005, // 0009 LDCONST R5 K5 - 0x7C0C0400, // 000A CALL R3 2 - 0x8C0C0302, // 000B GETMET R3 R1 K2 - 0x8C140506, // 000C GETMET R5 R2 K6 - 0x581C0007, // 000D LDCONST R7 K7 - 0x88200108, // 000E GETMBR R8 R0 K8 - 0x88201109, // 000F GETMBR R8 R8 K9 - 0x7C140600, // 0010 CALL R5 3 - 0x7C0C0400, // 0011 CALL R3 2 - 0x8C0C0302, // 0012 GETMET R3 R1 K2 - 0x5814000A, // 0013 LDCONST R5 K10 - 0x7C0C0400, // 0014 CALL R3 2 - 0x8C0C0302, // 0015 GETMET R3 R1 K2 - 0x8C140506, // 0016 GETMET R5 R2 K6 - 0x581C000B, // 0017 LDCONST R7 K11 - 0x88200108, // 0018 GETMBR R8 R0 K8 - 0x8820110C, // 0019 GETMBR R8 R8 K12 - 0x7C140600, // 001A CALL R5 3 - 0x7C0C0400, // 001B CALL R3 2 - 0x8C0C0302, // 001C GETMET R3 R1 K2 - 0x8C140506, // 001D GETMET R5 R2 K6 - 0x581C000D, // 001E LDCONST R7 K13 - 0x88200108, // 001F GETMBR R8 R0 K8 - 0x8820110E, // 0020 GETMBR R8 R8 K14 - 0x78220001, // 0021 JMPF R8 #0024 - 0x5820000F, // 0022 LDCONST R8 K15 - 0x70020000, // 0023 JMP #0025 - 0x58200010, // 0024 LDCONST R8 K16 - 0x7C140600, // 0025 CALL R5 3 - 0x7C0C0400, // 0026 CALL R3 2 - 0x8C0C0302, // 0027 GETMET R3 R1 K2 - 0x58140011, // 0028 LDCONST R5 K17 - 0x7C0C0400, // 0029 CALL R3 2 - 0x8C0C0302, // 002A GETMET R3 R1 K2 - 0x58140012, // 002B LDCONST R5 K18 - 0x7C0C0400, // 002C CALL R3 2 - 0x80000000, // 002D RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: show_enable -********************************************************************/ -be_local_closure(Matter_UI_show_enable, /* name */ - be_nested_proto( - 11, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[20]) { /* constants */ + ( &(const bvalue[ 5]) { /* constants */ /* K0 */ be_nested_str_weak(webserver), - /* K1 */ be_nested_str_weak(string), - /* K2 */ be_nested_str_weak(tasmota), - /* K3 */ be_nested_str_weak(get_option), - /* K4 */ be_nested_str_weak(matter), - /* K5 */ be_nested_str_weak(MATTER_OPTION), - /* K6 */ be_nested_str_weak(content_send), - /* K7 */ be_nested_str_weak(format), - /* K8 */ be_nested_str_weak(_X3Cfieldset_X3E_X3Clegend_X3E_X3Cb_X3E_X26nbsp_X3BMatter_X20_X25s_X26nbsp_X3B_X3C_X2Fb_X3E_X3C_X2Flegend_X3E_X3Cp_X3E_X3C_X2Fp_X3E), - /* K9 */ be_nested_str_weak(Enabled), - /* K10 */ be_nested_str_weak(Disabled), - /* K11 */ be_nested_str_weak(_X3Cp_X20style_X3D_X27width_X3A320px_X3B_X27_X3EMatter_X20support_X20is_X20experimental_X2E_X3C_X2Fp_X3E), - /* K12 */ be_nested_str_weak(_X3Cform_X20action_X3D_X27_X2Fmatterc_X27_X20method_X3D_X27post_X27_X20onsubmit_X3D_X27return_X20confirm_X28_X22This_X20will_X20cause_X20a_X20restart_X2E_X22_X29_X3B_X27_X3E), - /* K13 */ be_nested_str_weak(_X3Cp_X3E_X3C_X2Fp_X3E_X3Cbutton_X20name_X3D_X27_X25s_X27_X20class_X3D_X27button_X20bgrn_X27_X3E), - /* K14 */ be_nested_str_weak(disable), - /* K15 */ be_nested_str_weak(enable), - /* K16 */ be_nested_str_weak(Disable), - /* K17 */ be_nested_str_weak(Enable), - /* K18 */ be_nested_str_weak(_X20Matter_X3C_X2Fbutton_X3E_X3C_X2Fform_X3E_X3C_X2Fp_X3E), - /* K19 */ be_nested_str_weak(_X3Cp_X3E_X3C_X2Fp_X3E_X3C_X2Ffieldset_X3E_X3Cp_X3E_X3C_X2Fp_X3E), + /* K1 */ be_nested_str_weak(on), + /* K2 */ be_nested_str_weak(_X2Fmatterc), + /* K3 */ be_nested_str_weak(HTTP_GET), + /* K4 */ be_nested_str_weak(HTTP_POST), }), - be_str_weak(show_enable), + be_str_weak(web_add_handler), &be_const_str_solidified, - ( &(const binstruction[44]) { /* code */ - 0xA40A0000, // 0000 IMPORT R2 K0 - 0xA40E0200, // 0001 IMPORT R3 K1 - 0xB8120400, // 0002 GETNGBL R4 K2 - 0x8C100903, // 0003 GETMET R4 R4 K3 - 0xB81A0800, // 0004 GETNGBL R6 K4 - 0x88180D05, // 0005 GETMBR R6 R6 K5 - 0x7C100400, // 0006 CALL R4 2 - 0x8C140506, // 0007 GETMET R5 R2 K6 - 0x8C1C0707, // 0008 GETMET R7 R3 K7 - 0x58240008, // 0009 LDCONST R9 K8 - 0x78120001, // 000A JMPF R4 #000D - 0x58280009, // 000B LDCONST R10 K9 - 0x70020000, // 000C JMP #000E - 0x5828000A, // 000D LDCONST R10 K10 - 0x7C1C0600, // 000E CALL R7 3 - 0x7C140400, // 000F CALL R5 2 - 0x8C140506, // 0010 GETMET R5 R2 K6 - 0x581C000B, // 0011 LDCONST R7 K11 - 0x7C140400, // 0012 CALL R5 2 - 0x8C140506, // 0013 GETMET R5 R2 K6 - 0x581C000C, // 0014 LDCONST R7 K12 - 0x7C140400, // 0015 CALL R5 2 - 0x8C140506, // 0016 GETMET R5 R2 K6 - 0x8C1C0707, // 0017 GETMET R7 R3 K7 - 0x5824000D, // 0018 LDCONST R9 K13 - 0x78120001, // 0019 JMPF R4 #001C - 0x5828000E, // 001A LDCONST R10 K14 - 0x70020000, // 001B JMP #001D - 0x5828000F, // 001C LDCONST R10 K15 - 0x7C1C0600, // 001D CALL R7 3 - 0x7C140400, // 001E CALL R5 2 - 0x8C140506, // 001F GETMET R5 R2 K6 - 0x78120001, // 0020 JMPF R4 #0023 - 0x581C0010, // 0021 LDCONST R7 K16 - 0x70020000, // 0022 JMP #0024 - 0x581C0011, // 0023 LDCONST R7 K17 - 0x7C140400, // 0024 CALL R5 2 - 0x8C140506, // 0025 GETMET R5 R2 K6 - 0x581C0012, // 0026 LDCONST R7 K18 - 0x7C140400, // 0027 CALL R5 2 - 0x8C140506, // 0028 GETMET R5 R2 K6 - 0x581C0013, // 0029 LDCONST R7 K19 - 0x7C140400, // 002A CALL R5 2 - 0x80040800, // 002B RET 1 R4 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: show_commissioning_info -********************************************************************/ -be_local_closure(Matter_UI_show_commissioning_info, /* name */ - be_nested_proto( - 14, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[20]) { /* constants */ - /* K0 */ be_nested_str_weak(webserver), - /* K1 */ be_nested_str_weak(string), - /* K2 */ be_nested_str_weak(device), - /* K3 */ be_nested_str_weak(commissioning_open), - /* K4 */ be_nested_str_weak(tasmota), - /* K5 */ be_nested_str_weak(millis), - /* K6 */ be_const_int(0), - /* K7 */ be_nested_str_weak(content_send), - /* K8 */ be_nested_str_weak(format), - /* K9 */ be_nested_str_weak(_X3Cfieldset_X3E_X3Clegend_X3E_X3Cb_X3E_X26nbsp_X3BCommissioning_X20open_X20for_X20_X25i_X20min_X26nbsp_X3B_X3C_X2Fb_X3E_X3C_X2Flegend_X3E_X3Cp_X3E_X3C_X2Fp_X3E), - /* K10 */ be_nested_str_weak(compute_manual_pairing_code), - /* K11 */ be_nested_str_weak(_X3Cp_X3EManual_X20pairing_X20code_X3A_X3Cbr_X3E_X3Cb_X3E_X25s_X2D_X25s_X2D_X25s_X3C_X2Fb_X3E_X3C_X2Fp_X3E_X3Chr_X3E), - /* K12 */ be_const_int(3), - /* K13 */ be_const_int(2147483647), - /* K14 */ be_nested_str_weak(_X3Cdiv_X3E_X3Ccenter_X3E), - /* K15 */ be_nested_str_weak(compute_qrcode_content), - /* K16 */ be_nested_str_weak(show_qrcode), - /* K17 */ be_nested_str_weak(_X3Cp_X3E_X20_X25s_X3C_X2Fp_X3E), - /* K18 */ be_nested_str_weak(_X3C_X2Fdiv_X3E), - /* K19 */ be_nested_str_weak(_X3Cp_X3E_X3C_X2Fp_X3E_X3C_X2Ffieldset_X3E_X3Cp_X3E_X3C_X2Fp_X3E), - }), - be_str_weak(show_commissioning_info), - &be_const_str_solidified, - ( &(const binstruction[66]) { /* code */ - 0xA4060000, // 0000 IMPORT R1 K0 - 0xA40A0200, // 0001 IMPORT R2 K1 - 0x880C0102, // 0002 GETMBR R3 R0 K2 - 0x880C0703, // 0003 GETMBR R3 R3 K3 - 0xB8120800, // 0004 GETNGBL R4 K4 - 0x8C100905, // 0005 GETMET R4 R4 K5 - 0x7C100200, // 0006 CALL R4 1 - 0x040C0604, // 0007 SUB R3 R3 R4 - 0x541203E7, // 0008 LDINT R4 1000 - 0x0C0C0604, // 0009 DIV R3 R3 R4 - 0x14100706, // 000A LT R4 R3 K6 - 0x78120000, // 000B JMPF R4 #000D - 0x580C0006, // 000C LDCONST R3 K6 - 0x5412001D, // 000D LDINT R4 30 - 0x00100604, // 000E ADD R4 R3 R4 - 0x5416003B, // 000F LDINT R5 60 - 0x0C100805, // 0010 DIV R4 R4 R5 - 0x8C140307, // 0011 GETMET R5 R1 K7 - 0x8C1C0508, // 0012 GETMET R7 R2 K8 - 0x58240009, // 0013 LDCONST R9 K9 - 0x5C280800, // 0014 MOVE R10 R4 - 0x7C1C0600, // 0015 CALL R7 3 - 0x7C140400, // 0016 CALL R5 2 - 0x88140102, // 0017 GETMBR R5 R0 K2 - 0x8C140B0A, // 0018 GETMET R5 R5 K10 - 0x7C140200, // 0019 CALL R5 1 - 0x8C180307, // 001A GETMET R6 R1 K7 - 0x8C200508, // 001B GETMET R8 R2 K8 - 0x5828000B, // 001C LDCONST R10 K11 - 0x402E0D0C, // 001D CONNECT R11 K6 K12 - 0x942C0A0B, // 001E GETIDX R11 R5 R11 - 0x54320003, // 001F LDINT R12 4 - 0x54360005, // 0020 LDINT R13 6 - 0x4030180D, // 0021 CONNECT R12 R12 R13 - 0x94300A0C, // 0022 GETIDX R12 R5 R12 - 0x54360006, // 0023 LDINT R13 7 - 0x40341B0D, // 0024 CONNECT R13 R13 K13 - 0x94340A0D, // 0025 GETIDX R13 R5 R13 - 0x7C200A00, // 0026 CALL R8 5 - 0x7C180400, // 0027 CALL R6 2 - 0x8C180307, // 0028 GETMET R6 R1 K7 - 0x8C200508, // 0029 GETMET R8 R2 K8 - 0x5828000E, // 002A LDCONST R10 K14 - 0x7C200400, // 002B CALL R8 2 - 0x7C180400, // 002C CALL R6 2 - 0x88180102, // 002D GETMBR R6 R0 K2 - 0x8C180D0F, // 002E GETMET R6 R6 K15 - 0x7C180200, // 002F CALL R6 1 - 0x8C1C0110, // 0030 GETMET R7 R0 K16 - 0x5C240C00, // 0031 MOVE R9 R6 - 0x7C1C0400, // 0032 CALL R7 2 - 0x8C1C0307, // 0033 GETMET R7 R1 K7 - 0x8C240508, // 0034 GETMET R9 R2 K8 - 0x582C0011, // 0035 LDCONST R11 K17 - 0x5C300C00, // 0036 MOVE R12 R6 - 0x7C240600, // 0037 CALL R9 3 - 0x7C1C0400, // 0038 CALL R7 2 - 0x8C1C0307, // 0039 GETMET R7 R1 K7 - 0x8C240508, // 003A GETMET R9 R2 K8 - 0x582C0012, // 003B LDCONST R11 K18 - 0x7C240400, // 003C CALL R9 2 - 0x7C1C0400, // 003D CALL R7 2 - 0x8C1C0307, // 003E GETMET R7 R1 K7 - 0x58240013, // 003F LDCONST R9 K19 - 0x7C1C0400, // 0040 CALL R7 2 - 0x80000000, // 0041 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: page_part_ctl -********************************************************************/ -be_local_closure(Matter_UI_page_part_ctl, /* name */ - be_nested_proto( - 15, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[48]) { /* constants */ - /* K0 */ be_nested_str_weak(webserver), - /* K1 */ be_nested_str_weak(check_privileged_access), - /* K2 */ be_nested_str_weak(string), - /* K3 */ be_nested_str_weak(partition_core), - /* K4 */ be_nested_str_weak(persist), - /* K5 */ be_nested_str_weak(Partition), - /* K6 */ be_nested_str_weak(has_arg), - /* K7 */ be_nested_str_weak(passcode), - /* K8 */ be_nested_str_weak(discriminator), - /* K9 */ be_nested_str_weak(device), - /* K10 */ be_nested_str_weak(root_passcode), - /* K11 */ be_nested_str_weak(arg), - /* K12 */ be_nested_str_weak(root_discriminator), - /* K13 */ be_nested_str_weak(ipv4only), - /* K14 */ be_nested_str_weak(ipv4), - /* K15 */ be_nested_str_weak(on), - /* K16 */ be_nested_str_weak(save_param), - /* K17 */ be_nested_str_weak(redirect), - /* K18 */ be_nested_str_weak(_X2F_X3Frst_X3D), - /* K19 */ be_nested_str_weak(enable), - /* K20 */ be_nested_str_weak(tasmota), - /* K21 */ be_nested_str_weak(cmd), - /* K22 */ be_nested_str_weak(SetOption), - /* K23 */ be_nested_str_weak(matter), - /* K24 */ be_nested_str_weak(MATTER_OPTION), - /* K25 */ be_nested_str_weak(_X201), - /* K26 */ be_nested_str_weak(disable), - /* K27 */ be_nested_str_weak(_X200), - /* K28 */ be_nested_str_weak(del_fabric), - /* K29 */ be_const_int(0), - /* K30 */ be_nested_str_weak(sessions), - /* K31 */ be_nested_str_weak(fabrics), - /* K32 */ be_nested_str_weak(get_fabric_index), - /* K33 */ be_nested_str_weak(remove_fabric), - /* K34 */ be_const_int(1), - /* K35 */ be_nested_str_weak(_X2Fmatterc_X3F), - /* K36 */ be_nested_str_weak(log), - /* K37 */ be_nested_str_weak(format), - /* K38 */ be_nested_str_weak(BRY_X3A_X20Exception_X3E_X20_X27_X25s_X27_X20_X2D_X20_X25s), - /* K39 */ be_const_int(2), - /* K40 */ be_nested_str_weak(content_start), - /* K41 */ be_nested_str_weak(Parameter_X20error), - /* K42 */ be_nested_str_weak(content_send_style), - /* K43 */ be_nested_str_weak(content_send), - /* K44 */ be_nested_str_weak(_X3Cp_X20style_X3D_X27width_X3A340px_X3B_X27_X3E_X3Cb_X3EException_X3A_X3C_X2Fb_X3E_X3Cbr_X3E_X27_X25s_X27_X3Cbr_X3E_X25s_X3C_X2Fp_X3E), - /* K45 */ be_nested_str_weak(content_button), - /* K46 */ be_nested_str_weak(BUTTON_MANAGEMENT), - /* K47 */ be_nested_str_weak(content_stop), - }), - be_str_weak(page_part_ctl), - &be_const_str_solidified, - ( &(const binstruction[156]) { /* code */ + ( &(const binstruction[13]) { /* code */ 0xA4060000, // 0000 IMPORT R1 K0 0x8C080301, // 0001 GETMET R2 R1 K1 - 0x7C080200, // 0002 CALL R2 1 - 0x740A0001, // 0003 JMPT R2 #0006 - 0x4C080000, // 0004 LDNIL R2 - 0x80040400, // 0005 RET 1 R2 - 0xA40A0400, // 0006 IMPORT R2 K2 - 0xA40E0600, // 0007 IMPORT R3 K3 - 0xA4120800, // 0008 IMPORT R4 K4 - 0x8C140705, // 0009 GETMET R5 R3 K5 - 0x7C140200, // 000A CALL R5 1 - 0xA8020070, // 000B EXBLK 0 #007D - 0x8C180306, // 000C GETMET R6 R1 K6 - 0x58200007, // 000D LDCONST R8 K7 - 0x7C180400, // 000E CALL R6 2 - 0x741A0003, // 000F JMPT R6 #0014 - 0x8C180306, // 0010 GETMET R6 R1 K6 - 0x58200008, // 0011 LDCONST R8 K8 - 0x7C180400, // 0012 CALL R6 2 - 0x781A0022, // 0013 JMPF R6 #0037 - 0x8C180306, // 0014 GETMET R6 R1 K6 - 0x58200007, // 0015 LDCONST R8 K7 - 0x7C180400, // 0016 CALL R6 2 - 0x781A0006, // 0017 JMPF R6 #001F - 0x88180109, // 0018 GETMBR R6 R0 K9 - 0x601C0009, // 0019 GETGBL R7 G9 - 0x8C20030B, // 001A GETMET R8 R1 K11 - 0x58280007, // 001B LDCONST R10 K7 - 0x7C200400, // 001C CALL R8 2 - 0x7C1C0200, // 001D CALL R7 1 - 0x901A1407, // 001E SETMBR R6 K10 R7 - 0x8C180306, // 001F GETMET R6 R1 K6 - 0x58200008, // 0020 LDCONST R8 K8 - 0x7C180400, // 0021 CALL R6 2 - 0x781A0006, // 0022 JMPF R6 #002A - 0x88180109, // 0023 GETMBR R6 R0 K9 - 0x601C0009, // 0024 GETGBL R7 G9 - 0x8C20030B, // 0025 GETMET R8 R1 K11 - 0x58280008, // 0026 LDCONST R10 K8 - 0x7C200400, // 0027 CALL R8 2 - 0x7C1C0200, // 0028 CALL R7 1 - 0x901A1807, // 0029 SETMBR R6 K12 R7 - 0x88180109, // 002A GETMBR R6 R0 K9 - 0x8C1C030B, // 002B GETMET R7 R1 K11 - 0x5824000E, // 002C LDCONST R9 K14 - 0x7C1C0400, // 002D CALL R7 2 - 0x1C1C0F0F, // 002E EQ R7 R7 K15 - 0x901A1A07, // 002F SETMBR R6 K13 R7 - 0x88180109, // 0030 GETMBR R6 R0 K9 - 0x8C180D10, // 0031 GETMET R6 R6 K16 - 0x7C180200, // 0032 CALL R6 1 - 0x8C180311, // 0033 GETMET R6 R1 K17 - 0x58200012, // 0034 LDCONST R8 K18 - 0x7C180400, // 0035 CALL R6 2 - 0x70020043, // 0036 JMP #007B - 0x8C180306, // 0037 GETMET R6 R1 K6 - 0x58200013, // 0038 LDCONST R8 K19 - 0x7C180400, // 0039 CALL R6 2 - 0x781A000C, // 003A JMPF R6 #0048 - 0xB81A2800, // 003B GETNGBL R6 K20 - 0x8C180D15, // 003C GETMET R6 R6 K21 - 0x60200008, // 003D GETGBL R8 G8 - 0xB8262E00, // 003E GETNGBL R9 K23 - 0x88241318, // 003F GETMBR R9 R9 K24 - 0x7C200200, // 0040 CALL R8 1 - 0x00222C08, // 0041 ADD R8 K22 R8 - 0x00201119, // 0042 ADD R8 R8 K25 - 0x7C180400, // 0043 CALL R6 2 - 0x8C180311, // 0044 GETMET R6 R1 K17 - 0x58200012, // 0045 LDCONST R8 K18 - 0x7C180400, // 0046 CALL R6 2 - 0x70020032, // 0047 JMP #007B - 0x8C180306, // 0048 GETMET R6 R1 K6 - 0x5820001A, // 0049 LDCONST R8 K26 - 0x7C180400, // 004A CALL R6 2 - 0x781A000C, // 004B JMPF R6 #0059 - 0xB81A2800, // 004C GETNGBL R6 K20 - 0x8C180D15, // 004D GETMET R6 R6 K21 - 0x60200008, // 004E GETGBL R8 G8 - 0xB8262E00, // 004F GETNGBL R9 K23 - 0x88241318, // 0050 GETMBR R9 R9 K24 - 0x7C200200, // 0051 CALL R8 1 - 0x00222C08, // 0052 ADD R8 K22 R8 - 0x0020111B, // 0053 ADD R8 R8 K27 - 0x7C180400, // 0054 CALL R6 2 - 0x8C180311, // 0055 GETMET R6 R1 K17 - 0x58200012, // 0056 LDCONST R8 K18 - 0x7C180400, // 0057 CALL R6 2 - 0x70020021, // 0058 JMP #007B - 0x8C180306, // 0059 GETMET R6 R1 K6 - 0x5820001C, // 005A LDCONST R8 K28 - 0x7C180400, // 005B CALL R6 2 - 0x781A001D, // 005C JMPF R6 #007B - 0x60180009, // 005D GETGBL R6 G9 - 0x8C1C030B, // 005E GETMET R7 R1 K11 - 0x5824001C, // 005F LDCONST R9 K28 - 0x7C1C0400, // 0060 CALL R7 2 - 0x7C180200, // 0061 CALL R6 1 - 0x581C001D, // 0062 LDCONST R7 K29 - 0x88200109, // 0063 GETMBR R8 R0 K9 - 0x8820111E, // 0064 GETMBR R8 R8 K30 - 0x8820111F, // 0065 GETMBR R8 R8 K31 - 0x6024000C, // 0066 GETGBL R9 G12 - 0x5C281000, // 0067 MOVE R10 R8 - 0x7C240200, // 0068 CALL R9 1 - 0x14240E09, // 0069 LT R9 R7 R9 - 0x7826000C, // 006A JMPF R9 #0078 - 0x94241007, // 006B GETIDX R9 R8 R7 - 0x8C241320, // 006C GETMET R9 R9 K32 - 0x7C240200, // 006D CALL R9 1 - 0x1C241206, // 006E EQ R9 R9 R6 - 0x78260005, // 006F JMPF R9 #0076 - 0x88240109, // 0070 GETMBR R9 R0 K9 - 0x8C241321, // 0071 GETMET R9 R9 K33 - 0x942C1007, // 0072 GETIDX R11 R8 R7 - 0x7C240400, // 0073 CALL R9 2 - 0x70020002, // 0074 JMP #0078 - 0x70020000, // 0075 JMP #0077 - 0x001C0F22, // 0076 ADD R7 R7 K34 - 0x7001FFED, // 0077 JMP #0066 - 0x8C240311, // 0078 GETMET R9 R1 K17 - 0x582C0023, // 0079 LDCONST R11 K35 - 0x7C240400, // 007A CALL R9 2 - 0xA8040001, // 007B EXBLK 1 1 - 0x7002001D, // 007C JMP #009B - 0xAC180002, // 007D CATCH R6 0 2 - 0x7002001A, // 007E JMP #009A - 0xB8222800, // 007F GETNGBL R8 K20 - 0x8C201124, // 0080 GETMET R8 R8 K36 - 0x8C280525, // 0081 GETMET R10 R2 K37 - 0x58300026, // 0082 LDCONST R12 K38 - 0x5C340C00, // 0083 MOVE R13 R6 - 0x5C380E00, // 0084 MOVE R14 R7 - 0x7C280800, // 0085 CALL R10 4 - 0x582C0027, // 0086 LDCONST R11 K39 - 0x7C200600, // 0087 CALL R8 3 - 0x8C200328, // 0088 GETMET R8 R1 K40 - 0x58280029, // 0089 LDCONST R10 K41 - 0x7C200400, // 008A CALL R8 2 - 0x8C20032A, // 008B GETMET R8 R1 K42 - 0x7C200200, // 008C CALL R8 1 - 0x8C20032B, // 008D GETMET R8 R1 K43 - 0x8C280525, // 008E GETMET R10 R2 K37 - 0x5830002C, // 008F LDCONST R12 K44 - 0x5C340C00, // 0090 MOVE R13 R6 - 0x5C380E00, // 0091 MOVE R14 R7 - 0x7C280800, // 0092 CALL R10 4 - 0x7C200400, // 0093 CALL R8 2 - 0x8C20032D, // 0094 GETMET R8 R1 K45 - 0x8828032E, // 0095 GETMBR R10 R1 K46 - 0x7C200400, // 0096 CALL R8 2 - 0x8C20032F, // 0097 GETMET R8 R1 K47 - 0x7C200200, // 0098 CALL R8 1 - 0x70020000, // 0099 JMP #009B - 0xB0080000, // 009A RAISE 2 R0 R0 - 0x80000000, // 009B RET 0 + 0x58100002, // 0002 LDCONST R4 K2 + 0x84140000, // 0003 CLOSURE R5 P0 + 0x88180303, // 0004 GETMBR R6 R1 K3 + 0x7C080800, // 0005 CALL R2 4 + 0x8C080301, // 0006 GETMET R2 R1 K1 + 0x58100002, // 0007 LDCONST R4 K2 + 0x84140001, // 0008 CLOSURE R5 P1 + 0x88180304, // 0009 GETMBR R6 R1 K4 + 0x7C080800, // 000A CALL R2 4 + 0xA0000000, // 000B CLOSE R0 + 0x80000000, // 000C RET 0 }) ) ); @@ -1243,21 +1734,24 @@ be_local_closure(Matter_UI_page_part_ctl, /* name */ be_local_class(Matter_UI, 1, NULL, - be_nested_map(13, + be_nested_map(16, ( (struct bmapnode*) &(const bmapnode[]) { - { be_const_key_weak(show_fabric_info, -1), be_const_closure(Matter_UI_show_fabric_info_closure) }, + { be_const_key_weak(_CLASSES_TYPES, -1), be_nested_str_weak(root_X7Crelay_X7Clight0_X7Clight1_X7Clight2_X7Clight3_X7Ctemperature_X7Cpressure_X7Cilluminance_X7Chumidity) }, + { be_const_key_weak(show_commissioning_info, -1), be_const_closure(Matter_UI_show_commissioning_info_closure) }, + { be_const_key_weak(show_enable, 6), be_const_closure(Matter_UI_show_enable_closure) }, + { be_const_key_weak(init, 11), be_const_closure(Matter_UI_init_closure) }, + { be_const_key_weak(show_passcode_form, -1), be_const_closure(Matter_UI_show_passcode_form_closure) }, + { be_const_key_weak(web_add_config_button, 15), be_const_closure(Matter_UI_web_add_config_button_closure) }, + { be_const_key_weak(web_add_handler, -1), be_const_closure(Matter_UI_web_add_handler_closure) }, + { be_const_key_weak(page_part_mgr, -1), be_const_closure(Matter_UI_page_part_mgr_closure) }, { be_const_key_weak(page_part_ctl, -1), be_const_closure(Matter_UI_page_part_ctl_closure) }, { be_const_key_weak(web_get_arg, -1), be_const_closure(Matter_UI_web_get_arg_closure) }, - { be_const_key_weak(page_part_mgr, 8), be_const_closure(Matter_UI_page_part_mgr_closure) }, - { be_const_key_weak(web_add_config_button, -1), be_const_closure(Matter_UI_web_add_config_button_closure) }, - { be_const_key_weak(init, -1), be_const_closure(Matter_UI_init_closure) }, - { be_const_key_weak(web_sensor, 10), be_const_closure(Matter_UI_web_sensor_closure) }, - { be_const_key_weak(web_add_handler, -1), be_const_closure(Matter_UI_web_add_handler_closure) }, - { be_const_key_weak(show_enable, 12), be_const_closure(Matter_UI_show_enable_closure) }, - { be_const_key_weak(show_passcode_form, 1), be_const_closure(Matter_UI_show_passcode_form_closure) }, - { be_const_key_weak(show_qrcode, 5), be_const_closure(Matter_UI_show_qrcode_closure) }, - { be_const_key_weak(show_commissioning_info, -1), be_const_closure(Matter_UI_show_commissioning_info_closure) }, - { be_const_key_weak(device, -1), be_const_var(0) }, + { be_const_key_weak(show_plugins_configuration, 14), be_const_closure(Matter_UI_show_plugins_configuration_closure) }, + { be_const_key_weak(device, 13), be_const_var(0) }, + { be_const_key_weak(web_sensor, -1), be_const_closure(Matter_UI_web_sensor_closure) }, + { be_const_key_weak(show_qrcode, -1), be_const_closure(Matter_UI_show_qrcode_closure) }, + { be_const_key_weak(plugin_option, -1), be_const_closure(Matter_UI_plugin_option_closure) }, + { be_const_key_weak(show_fabric_info, -1), be_const_closure(Matter_UI_show_fabric_info_closure) }, })), be_str_weak(Matter_UI) ); From 39abde258393321f35b9adc78b2c2fcde3dd43de Mon Sep 17 00:00:00 2001 From: stefanbode Date: Tue, 25 Apr 2023 13:46:19 +0200 Subject: [PATCH 035/289] Worked on ESP32 dimmer with Zero cross (#18481) * Worked on ESP32 dimmer with Zero cross Until now the ESP32 does not support zero-cross dimmer. I take a sneak how they did in in ESPhome and adapted the approach to TASMOTA. At the end it works that smooth that likely i will change ESP8266 either so we have a common code. Currently ESP8266 is not touched. There is a minor issue with savedata == default. When changing the dimmer value the interrupts get stopped during write of the config data to flash. * ESP8266 Dimmer added Worked all so well and the code is much smaller. There is no need for reconfiguration on existing users. But there are settings not needed anymore. Will work on the documentation. Anyhow existing installations can upgrade without hickup * Optimized endpoints at dimmer 0 and 100 * Removed debug stuff * Fix Issue at dimmer = 0 * Small bugfix * Final checked Version * Update xsns_01_counter.ino * Add missing func * Update xsns_01_counter.ino * Moved out of the house of counter and build my own one * New ZeroCross Driver * Update xdrv_91_zerocrossDimmer.ino * evolving * Delete xdrv_91_zerocrossDimmer.ino * Add files via upload * Changed drv number from 1 to 68 * Commit to merge --- tasmota/include/tasmota_globals.h | 1 + .../xdrv_04_light_utils.ino | 2 +- .../xdrv_68_zerocrossDimmer.ino | 276 ++++++++++++++++++ .../tasmota_xsns_sensor/xsns_01_counter.ino | 135 +-------- 4 files changed, 280 insertions(+), 134 deletions(-) create mode 100644 tasmota/tasmota_xdrv_driver/xdrv_68_zerocrossDimmer.ino diff --git a/tasmota/include/tasmota_globals.h b/tasmota/include/tasmota_globals.h index 187209279..3518899b0 100644 --- a/tasmota/include/tasmota_globals.h +++ b/tasmota/include/tasmota_globals.h @@ -45,6 +45,7 @@ extern "C" void custom_crash_callback(struct rst_info * rst_info, uint32_t stack extern "C" void resetPins(); extern "C" int startWaveformClockCycles(uint8_t pin, uint32_t highCcys, uint32_t lowCcys, uint32_t runTimeCcys, int8_t alignPhase, uint32_t phaseOffsetCcys, bool autoPwm); +extern "C" void setTimer1Callback(uint32_t (*fn)()); #ifdef USE_SERIAL_BRIDGE void SerialBridgePrintf(PGM_P formatP, ...); #endif diff --git a/tasmota/tasmota_xdrv_driver/xdrv_04_light_utils.ino b/tasmota/tasmota_xdrv_driver/xdrv_04_light_utils.ino index 9567fdd48..0e214b977 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_04_light_utils.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_04_light_utils.ino @@ -40,7 +40,7 @@ const gamma_table_t ac_dimmer_table[] = { // don't put in PROGMEM for performa { 900, 704 }, { 950, 748 }, { 990, 850 }, - { 1024, 1024 }, + { 1023, 1023 }, { 0xFFFF, 0xFFFF } // fail-safe if out of range }; diff --git a/tasmota/tasmota_xdrv_driver/xdrv_68_zerocrossDimmer.ino b/tasmota/tasmota_xdrv_driver/xdrv_68_zerocrossDimmer.ino new file mode 100644 index 000000000..307fabc00 --- /dev/null +++ b/tasmota/tasmota_xdrv_driver/xdrv_68_zerocrossDimmer.ino @@ -0,0 +1,276 @@ +/* + xdrv_68_zerocrossdimmer.ino - Zero-Cross Dimmer support for Tasmota + + Copyright (C) 2023 Stefan Bode + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#ifdef USE_AC_ZERO_CROSS_DIMMER +/*********************************************************************************************\ + * Zero-Cross AC Dimmer PMM 1..xx use +\*********************************************************************************************/ + +#define XDRV_68 68 + +static const uint32_t GATE_ENABLE_TIME = 100; + +struct AC_ZERO_CROSS_DIMMER { + uint32_t cycle_time_us; + /// Time (in micros()) of last ZC signal + uint32_t crossed_zero_at; + /// Time since last ZC pulse to enable gate pin. 0 means not set. + bool timer_iterrupt_started = false; + bool dimmer_in_use = false; + // Check if 50µs timer is running. + uint32_t enable_time_us[MAX_PWMS]; + /// Time since last ZC pulse to disable gate pin. 0 means no disable. + uint32_t disable_time_us[MAX_PWMS]; + uint8_t current_state_in_phase[MAX_PWMS]; // 0=before fire HIGH, 1=HIGH, 2=after setting LOW, 3=before HIGH without setting LOW (POWER ON) + uint32_t lastlight[MAX_PWMS]; + uint16_t detailpower[MAX_PWMS]; // replaces dimmer and light controll 0..10000. required savedata 0. + uint32_t intr_counter = 0; +} ac_zero_cross_dimmer; + + +#ifdef ESP32 + static hw_timer_t *dimmer_timer = nullptr; // NOLINT(cppcoreguidelines-avoid-non-const-global-variables) +#endif + +#define D_PRFX_ZCDIMMER "ZCDimmer" +#define D_CMND_DIMMERSET "Set" + +const char kZCDimmerCommands[] PROGMEM = D_PRFX_ZCDIMMER "|" D_CMND_DIMMERSET; + +void (* const ZCDimmerCommand[])(void) PROGMEM = { + &CmndZCDimmerSet + }; + +void IRAM_ATTR ACDimmerZeroCross(uint32_t time) { + ac_zero_cross_dimmer.dimmer_in_use = false; + ac_zero_cross_dimmer.cycle_time_us = time - ac_zero_cross_dimmer.crossed_zero_at; + ac_zero_cross_dimmer.crossed_zero_at = time; + for (uint8_t i=0; i < MAX_PWMS; i++) { + if (Pin(GPIO_PWM1, i) == -1) continue; + ac_zero_cross_dimmer.dimmer_in_use |= ac_zero_cross_dimmer.lastlight[i] > 0; + // Dimmer is physically off. Skip swich on + ac_zero_cross_dimmer.current_state_in_phase[i] = 0; + if (100 * ac_zero_cross_dimmer.enable_time_us[i] > 95 * ac_zero_cross_dimmer.cycle_time_us ) { + ac_zero_cross_dimmer.current_state_in_phase[i] = 1; + ac_zero_cross_dimmer.disable_time_us[i] = ac_zero_cross_dimmer.cycle_time_us / 2; + } + // If full cycle is required keep pin HIGH, skip LOW by skipping phase + if (100 * ac_zero_cross_dimmer.enable_time_us[i] < 15 * ac_zero_cross_dimmer.cycle_time_us) { + ac_zero_cross_dimmer.current_state_in_phase[i] = 3; + } + } +} + +uint32_t IRAM_ATTR ACDimmerTimer_intr_ESP8266() { + //ACDimmerTimer_intr(); + ACDimmerTimer_intr(); + return 4000; +} + +void ACDimmerInterruptDisable(bool disable) +{ + AddLog(LOG_LEVEL_INFO, PSTR("ZCD: Zero-CrossDimmer enabled: %d"),!disable); + ac_zero_cross_dimmer.timer_iterrupt_started = !disable; + if (disable) { + //stop the interrupt +#ifdef ESP32 + if (dimmer_timer != nullptr) { + timerAlarmDisable(dimmer_timer); + } +#endif +#ifdef ESP8266 + //setTimer1Callback(NULL); +#endif + } else { + for (uint8_t i = 0 ; i < MAX_PWMS; i++) { + if (Pin(GPIO_PWM1, i) != -1) { + pinMode(Pin(GPIO_PWM1, i), OUTPUT); + AddLog(LOG_LEVEL_INFO, PSTR("ZCD: Zero-CrossDimmer Pin %d set"),Pin(GPIO_PWM1, i)); + } + } +#ifdef ESP32 + if (dimmer_timer == nullptr) { + // 80 Divider -> 1 count=1µs + dimmer_timer = timerBegin(0, 80, true); + timerAttachInterrupt(dimmer_timer, &ACDimmerTimer_intr, true); + // For ESP32, we can't use dynamic interval calculation because the timerX functions + // are not callable from ISR (placed in flash storage). + // Here we just use an interrupt firing every 75 µs. + if (Settings->save_data == 0) { + AddLog(LOG_LEVEL_INFO, PSTR("ZCD: Save disabled. High frequency scan enabled. DO NOT USE SAVEDATA if channel is on")); + timerAlarmWrite(dimmer_timer, 30, true); + } else { + AddLog(LOG_LEVEL_INFO, PSTR("ZCD: Save on. 75µs scan enabled")); + timerAlarmWrite(dimmer_timer, 75, true); + } + } + timerAlarmEnable(dimmer_timer); +#endif + +#ifdef ESP8266 + // Uses ESP8266 waveform (soft PWM) class + // PWM and AcDimmer can even run at the same time this way + //setTimer1Callback(&ACDimmerTimer_intr_ESP8266); +#endif + } +} + +void IRAM_ATTR ACDimmerTimer_intr() { + // If no ZC signal received yet. + uint32_t now = micros(); + ac_zero_cross_dimmer.intr_counter++; + if (ac_zero_cross_dimmer.crossed_zero_at == 0) + return; + + uint32_t time_since_zc = now - ac_zero_cross_dimmer.crossed_zero_at; + if (time_since_zc > 10100) { + memset(&ac_zero_cross_dimmer.current_state_in_phase, 0x00, sizeof(ac_zero_cross_dimmer.current_state_in_phase)); + ac_zero_cross_dimmer.crossed_zero_at += ac_zero_cross_dimmer.cycle_time_us; + time_since_zc = now - ac_zero_cross_dimmer.crossed_zero_at; + } + + for (uint8_t i = 0 ; i < MAX_PWMS; i++ ) { + if (Pin(GPIO_PWM1, i) == -1) continue; + switch (ac_zero_cross_dimmer.current_state_in_phase[i]) { + case 1: + if (time_since_zc >= ac_zero_cross_dimmer.disable_time_us[i]) { + digitalWrite(Pin(GPIO_PWM1, i), LOW); + ac_zero_cross_dimmer.current_state_in_phase[i]++; + } + break; + case 0: + case 3: + if (time_since_zc >= ac_zero_cross_dimmer.enable_time_us[i]) { + digitalWrite(Pin(GPIO_PWM1, i), HIGH); + ac_zero_cross_dimmer.current_state_in_phase[i]++; + } + break; + } + } +} + +void ACDimmerControllTrigger(void) { + + if (ac_zero_cross_dimmer.timer_iterrupt_started != ac_zero_cross_dimmer.dimmer_in_use) { + AddLog(LOG_LEVEL_DEBUG_MORE, PSTR("ZCD: ZeroEnable %d --> %d ... change..."),ac_zero_cross_dimmer.timer_iterrupt_started, ac_zero_cross_dimmer.dimmer_in_use); + ACDimmerInterruptDisable(!ac_zero_cross_dimmer.dimmer_in_use); + } + for (uint8_t i = 0; i < MAX_PWMS; i++){ + if (Pin(GPIO_PWM1, i) == -1) continue; + ac_zero_cross_dimmer.lastlight[i] = Light.fade_running ? Light.fade_cur_10[i] : Light.fade_start_10[i]; + ac_zero_cross_dimmer.enable_time_us[i] = (ac_zero_cross_dimmer.cycle_time_us * (1023 - ac_zero_cross_power(ac_zero_cross_dimmer.lastlight[i]))) / 1023; + +#ifdef ESP32 + if (ac_zero_cross_dimmer.detailpower[i]){ + float state = (float)(1 - (ac_zero_cross_dimmer.detailpower[i]/10000.0)); + //state = std::acos(1 - (2 * state)) / 3.14159 * ac_zero_cross_dimmer.cycle_time_us; + state = std::acos(1 - (2 * state)) / 3.14159 * 10000; + //AddLog(LOG_LEVEL_DEBUG_MORE, PSTR("ZCD: Float2: %*_f"),0,&state); + ac_zero_cross_dimmer.enable_time_us[i] = (uint32_t)state; + ac_zero_cross_dimmer.lastlight[i] = 1; + } +#endif + + ac_zero_cross_dimmer.disable_time_us[i] = ac_zero_cross_dimmer.enable_time_us[i] + GATE_ENABLE_TIME; + } + +} + +void ACDimmerLogging(void) +{ + bool alarmEnabled = false; + uint32_t timercounter = ac_zero_cross_dimmer.intr_counter; + +#ifdef ESP32 + if (dimmer_timer != nullptr) { + alarmEnabled = timerAlarmEnabled(dimmer_timer); + timercounter = (uint32_t)timerRead(dimmer_timer); + } +#endif + + AddLog(LOG_LEVEL_DEBUG, PSTR("ZCD: ZeroEnable %d -> %d, Alarm %d, intr: %ld, cycle time: %ld µs"), + ac_zero_cross_dimmer.dimmer_in_use, ac_zero_cross_dimmer.timer_iterrupt_started, alarmEnabled, timercounter, ac_zero_cross_dimmer.cycle_time_us + ); + for (uint8_t i = 0; i < MAX_PWMS; i++){ + if (Pin(GPIO_PWM1, i) == -1) continue; + AddLog(LOG_LEVEL_DEBUG_MORE, PSTR("ZCD: PWM[%d] en: %ld µs, dis: %ld µs, state %d, fade: %d, cur: %d, end: %d, lastlight: %d"), + i+1, ac_zero_cross_dimmer.enable_time_us[i], ac_zero_cross_dimmer.disable_time_us[i], + ac_zero_cross_dimmer.current_state_in_phase[i], Light.fade_cur_10[i], Light.fade_start_10[i], Light.fade_end_10[i], ac_zero_cross_dimmer.lastlight[i] + ); + } + +} + + +/*********************************************************************************************\ + * Commands +\*********************************************************************************************/ + +void CmndZCDimmerSet(void) +{ + if ((XdrvMailbox.index > 0) && (XdrvMailbox.index <= MAX_PWMS)) { + if (XdrvMailbox.data_len > 0) { + ac_zero_cross_dimmer.detailpower[XdrvMailbox.index-1] = (uint16_t)(100 * CharToFloat(XdrvMailbox.data)); + } + ResponseCmndIdxFloat((float)(ac_zero_cross_dimmer.detailpower[XdrvMailbox.index-1]) / 100, 2); + } +} + +/*********************************************************************************************\ + * Interface +\*********************************************************************************************/ + +bool Xdrv68(uint32_t function) +{ + bool result = false; + if (Settings->flag4.zerocross_dimmer) { + switch (function) { + case FUNC_INIT: +#ifdef ESP32 + //ACDimmerInterruptDisable(false); +#endif +#ifdef ESP8266 + setTimer1Callback(&ACDimmerTimer_intr_ESP8266); +#endif + break; + case FUNC_EVERY_SECOND: + ACDimmerLogging(); + break; + case FUNC_EVERY_100_MSECOND: + ACDimmerControllTrigger(); + break; + case FUNC_INTERRUPT_STOP: + AddLog(LOG_LEVEL_DEBUG_MORE, PSTR("ZCD: FUNC_INTERRUPT_STOP")); + ACDimmerInterruptDisable(true); + break; + case FUNC_INTERRUPT_START: + AddLog(LOG_LEVEL_DEBUG_MORE, PSTR("ZCD: FUNC_INTERRUPT_START")); + ACDimmerInterruptDisable(false); + break; + case FUNC_COMMAND: + result = DecodeCommand(kZCDimmerCommands, ZCDimmerCommand); + //result = DecodeCommand(kShutterCommands, ShutterCommand); + + break; + } + } + return result; +} + +#endif // USE_AC_ZERO_CROSS_DIMMER diff --git a/tasmota/tasmota_xsns_sensor/xsns_01_counter.ino b/tasmota/tasmota_xsns_sensor/xsns_01_counter.ino index d427cc7db..b23870503 100644 --- a/tasmota/tasmota_xsns_sensor/xsns_01_counter.ino +++ b/tasmota/tasmota_xsns_sensor/xsns_01_counter.ino @@ -2,7 +2,6 @@ xsns_01_counter.ino - Counter sensors (water meters, electricity meters etc.) sensor support for Tasmota Copyright (C) 2021 Maarten Damen and Theo Arends - Stefan Bode (Zero-Cross Dimmer) This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -48,22 +47,6 @@ struct COUNTER { } Counter; -#ifdef USE_AC_ZERO_CROSS_DIMMER -struct AC_ZERO_CROSS_DIMMER { - bool startReSync = false; // set to TRUE if zero-cross event occurs - bool startMeasurePhase[MAX_COUNTERS] ; // set to TRUE if channel is ON and zero-cross occurs to initiate phase measure on channel - bool pwm_defined[MAX_COUNTERS]; // check if all GPIO are set and zerocross enabled. Then ADD dimmer. - bool PWM_ON[MAX_COUNTERS] ; // internal ON/OFF of the channel - uint32_t current_cycle_ClockCycles = 0; // amount of clock cycles between two zero-cross events. - uint32_t currentPWMCycleCount[MAX_COUNTERS] ; // clock cycle time of PWM channel, required to measure actual phase. [3] is phase of zero-cross - int16_t currentShiftClockCycle[MAX_COUNTERS]; // dynamic phase correction per channel in clock cycles - uint32_t tobe_cycle_timeClockCycles = 0; // clock cycles between zero-cross events. Depend on main frequency and CPU speed - uint32_t lastCycleCount = 0; // Last value of GetCycleCount during zero-cross sychronisation - uint32_t currentSteps = 100; // dynamic value of zero-crosses between two sychronisation intervalls (default=20 == 200ms at 100Hz) - uint32_t high; // cycle counts for PWM high vaule. needs long enough (4µs) to secure fire TRIAC -} ac_zero_cross_dimmer; -#endif //USE_AC_ZERO_CROSS_DIMMER - void IRAM_ATTR CounterIsrArg(void *arg) { uint32_t index = *static_cast(arg); @@ -93,27 +76,7 @@ void IRAM_ATTR CounterIsrArg(void *arg) { // restart PWM each second (german 50Hz has to up to 0.01% deviation) // restart initiated by setting Counter.startReSync = true; #ifdef USE_AC_ZERO_CROSS_DIMMER - // if zero-cross events occur ond channel is on. phase on PWM must be measured - if ( ac_zero_cross_dimmer.startMeasurePhase[index] == true ) { - ac_zero_cross_dimmer.currentPWMCycleCount[index] = ESP.getCycleCount(); - ac_zero_cross_dimmer.startMeasurePhase[index] = false; - } - // if zero-cross event occurs (200ms window, 5-times a second) and device is online for >10sec - if (index == 3 && RtcSettings.pulse_counter[index]%(Settings->pwm_frequency / 5) == 0 && ac_zero_cross_dimmer.pwm_defined[index] && millis() > 10000) { - ac_zero_cross_dimmer.currentPWMCycleCount[index] = ESP.getCycleCount(); - - if (ac_zero_cross_dimmer.lastCycleCount > 0) { - // start phase measure on PWM channels and initiate phase sync with zero-cross. - ac_zero_cross_dimmer.startReSync = true; - for (uint8_t k=0; k < MAX_COUNTERS-1; k++ ) { - if (ac_zero_cross_dimmer.PWM_ON[k] == true) ac_zero_cross_dimmer.startMeasurePhase[k] = true; - } - ac_zero_cross_dimmer.currentSteps = (ac_zero_cross_dimmer.currentPWMCycleCount[index]-ac_zero_cross_dimmer.lastCycleCount+(ac_zero_cross_dimmer.tobe_cycle_timeClockCycles/2))/(ac_zero_cross_dimmer.tobe_cycle_timeClockCycles); - ac_zero_cross_dimmer.current_cycle_ClockCycles = (ac_zero_cross_dimmer.currentPWMCycleCount[index]-ac_zero_cross_dimmer.lastCycleCount)/ac_zero_cross_dimmer.currentSteps; - } - ac_zero_cross_dimmer.lastCycleCount = ac_zero_cross_dimmer.currentPWMCycleCount[index]; - } - + if (index == 3) ACDimmerZeroCross(time); #endif //USE_AC_ZERO_CROSS_DIMMER return; } @@ -162,26 +125,9 @@ bool CounterPinState(void) void CounterInit(void) { + for (uint32_t i = 0; i < MAX_COUNTERS; i++) { if (PinUsed(GPIO_CNTR1, i)) { -#ifdef USE_AC_ZERO_CROSS_DIMMER - if (Settings->flag4.zerocross_dimmer) { - ac_zero_cross_dimmer.current_cycle_ClockCycles = ac_zero_cross_dimmer.tobe_cycle_timeClockCycles = microsecondsToClockCycles(1000000 / Settings->pwm_frequency); - // short fire on PWM to ensure not to hit next sinus curve but trigger the TRIAC. 0.78% of duty cycle (10ms) ~4µs - ac_zero_cross_dimmer.high = ac_zero_cross_dimmer.current_cycle_ClockCycles / 256; - - // Support for dimmer 1-3. Counter4 reseverd for zero-cross signal - if ((i < MAX_COUNTERS-1 && PinUsed(GPIO_PWM1, i)) || ( i == MAX_COUNTERS-1) ) { - ac_zero_cross_dimmer.pwm_defined[i] = true; - if (i == 3) { - AddLog(LOG_LEVEL_INFO, PSTR("ZeroCross initialized")); - } else { - AddLog(LOG_LEVEL_INFO, PSTR("Dimmer: [%d] initialized. READY. Dimmer %d"), i+1, Light.fade_running ? Light.fade_cur_10[i] : Light.fade_start_10[i]); - } - - } - } -#endif //USE_AC_ZERO_CROSS_DIMMER Counter.any_counter = true; pinMode(Pin(GPIO_CNTR1, i), bitRead(Counter.no_pullup, i) ? INPUT : INPUT_PULLUP); if ((0 == Settings->pulse_counter_debounce_low) && (0 == Settings->pulse_counter_debounce_high) && !Settings->flag4.zerocross_dimmer) { @@ -260,78 +206,6 @@ void CounterShow(bool json) } } -#ifdef USE_AC_ZERO_CROSS_DIMMER -void SyncACDimmer(void) -{ - if (ac_zero_cross_dimmer.startReSync ) { - // currently only support one AC Dimmer PWM. Plan to support up to 4 Dimmer on same Phase. - for (uint32_t i = 0; i < MAX_COUNTERS-1; i++) { - if (Light.fade_start_10[i] == 0 && Light.fade_cur_10[i] == 0 && ac_zero_cross_dimmer.PWM_ON[i]==false ) continue; - if (ac_zero_cross_dimmer.pwm_defined[i] && (ac_zero_cross_dimmer.startMeasurePhase[i] == 0 || ac_zero_cross_dimmer.PWM_ON[i] == false ) ) - { - uint32_t phaseStart_ActualClockCycles; // As-Is positon of PWM after Zero Cross - uint32_t phaseStart_ToBeClockCycles; // To be position after zero-cross to fire PWM start - int16_t phaseShift_ClockCycles; // - - - // reset trigger for PWM sync - ac_zero_cross_dimmer.startReSync = false; - // calculate timeoffset to fire PWM based on Dimmer - phaseStart_ToBeClockCycles = (ac_zero_cross_dimmer.tobe_cycle_timeClockCycles * (1024 - ac_zero_cross_power(Light.fade_running ? Light.fade_cur_10[i] : Light.fade_start_10[i]))) / 1024; - - // Limit range to avoid overshoot and undershoot - phaseStart_ToBeClockCycles = tmin(tmax(phaseStart_ToBeClockCycles, 160000), 0.95* ac_zero_cross_dimmer.tobe_cycle_timeClockCycles); - - // Switch OFF dimmer - if (Light.fade_start_10[i] == 0 && !Light.fade_running) { - ac_zero_cross_dimmer.PWM_ON[i]=false; - Light.fade_cur_10[i] = 0; - digitalWrite(Pin(GPIO_PWM1, i), LOW); - //AddLog(LOG_LEVEL_DEBUG_MORE, PSTR("CNT2: [%d], curr: %d, final: %d, fading: %d, phase-shift: %d, ON/OFF: %d"),i, Light.fade_cur_10[i], Light.fade_start_10[i], Light.fade_running, phaseStart_ToBeClockCycles,ac_zero_cross_dimmer.PWM_ON[i]); - continue; - } - // Calculyte clockcycles between zero-cross [3] and start of the current PWM signal [i] - phaseStart_ActualClockCycles = ac_zero_cross_dimmer.currentPWMCycleCount[i]-ac_zero_cross_dimmer.currentPWMCycleCount[3]; - - // Calulate additional or less clockcycles to move current phase position to should be position - phaseShift_ClockCycles = (int32_t)((int32_t)phaseStart_ToBeClockCycles-(int32_t)phaseStart_ActualClockCycles)/100; - - if ( ac_zero_cross_dimmer.PWM_ON[i] == 0 ) { - // because in LOOP calculate the timelag to fire PWM correctly with zero-cross - uint32_t timelag_ClockCycles = (ESP.getCycleCount() - ac_zero_cross_dimmer.currentPWMCycleCount[3])%ac_zero_cross_dimmer.tobe_cycle_timeClockCycles; - timelag_ClockCycles = ((phaseStart_ToBeClockCycles + ac_zero_cross_dimmer.tobe_cycle_timeClockCycles) - timelag_ClockCycles)%ac_zero_cross_dimmer.tobe_cycle_timeClockCycles; - - delayMicroseconds(clockCyclesToMicroseconds(timelag_ClockCycles)); - ac_zero_cross_dimmer.PWM_ON[i]=true; - pinMode(Pin(GPIO_PWM1, i), OUTPUT); - } else { - // currentShiftClockCycle is an I-Controller (not PID) to realign the phase. grace time are 5 clock cycles - ac_zero_cross_dimmer.currentShiftClockCycle[i] += phaseShift_ClockCycles > 5 ? 1 : (phaseShift_ClockCycles < -5 ? -1 : 0); - ac_zero_cross_dimmer.current_cycle_ClockCycles += ac_zero_cross_dimmer.currentShiftClockCycle[i]+phaseShift_ClockCycles; - } -#ifdef ESP8266 - // Find the first GPIO being generated by checking GCC's find-first-set (returns 1 + the bit of the first 1 in an int32_t - startWaveformClockCycles(Pin(GPIO_PWM1, i), ac_zero_cross_dimmer.high, ac_zero_cross_dimmer.current_cycle_ClockCycles - ac_zero_cross_dimmer.high, 0, -1, 0, true); -#endif // ESP8266 -#ifdef ESP32 - // Under investigation. Still not working - double esp32freq = 1000000.0 / clockCyclesToMicroseconds(ac_zero_cross_dimmer.current_cycle_ClockCycles); - ledcSetup(i, esp32freq, 10); - ledcAttachPin(Pin(GPIO_PWM1, i), i); - ledcWrite(i, 5); - -#endif // ESP32 - - AddLog(LOG_LEVEL_DEBUG_MORE, PSTR("CNT: [%d], shift: %d, dimm_time_CCs %d, phaseShift_CCs %d, currentPWMcylce: %lu, current_cycle_CC: %lu, lastcc %lu, currentSteps %lu, currDIM %lu, last delta:%lu"), - i, ac_zero_cross_dimmer.currentShiftClockCycle[i], phaseStart_ToBeClockCycles,phaseShift_ClockCycles,ac_zero_cross_dimmer.currentPWMCycleCount[i],ac_zero_cross_dimmer.current_cycle_ClockCycles , ac_zero_cross_dimmer.lastCycleCount, ac_zero_cross_dimmer.currentSteps, Light.fade_cur_10[i],phaseStart_ActualClockCycles); // Light fading - //AddLog(LOG_LEVEL_DEBUG_MORE, PSTR("CNT: [%d], curr: %d, final: %d, fading: %d, phase-shift: %d, ON/OFF: %d"),i, Light.fade_cur_10[i], Light.fade_start_10[i], Light.fade_running, phaseStart_ToBeClockCycles,ac_zero_cross_dimmer.PWM_ON[i]); - - } // do sync onchannel - } // loop on counter - } // zero cross detected -} // end SyncACDimmer -#endif //USE_AC_ZERO_CROSS_DIMMER - /*********************************************************************************************\ * Commands \*********************************************************************************************/ @@ -406,11 +280,6 @@ bool Xsns01(uint32_t function) case FUNC_JSON_APPEND: CounterShow(1); break; -#ifdef USE_AC_ZERO_CROSS_DIMMER - case FUNC_EVERY_50_MSECOND: - SyncACDimmer(); - break; -#endif //USE_AC_ZERO_CROSS_DIMMER #ifdef USE_WEBSERVER case FUNC_WEB_SENSOR: CounterShow(0); From 074831437f250e91421b76e13438d24c88b8c621 Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Tue, 25 Apr 2023 15:43:41 +0200 Subject: [PATCH 036/289] Update changelogs --- CHANGELOG.md | 3 +- CODE_OWNERS.md | 421 ++++++++++++++++++++++++------------------------ RELEASENOTES.md | 2 + 3 files changed, 215 insertions(+), 211 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index acc56390f..b73586fcf 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,12 +8,13 @@ All notable changes to this project will be documented in this file. - Matter sensors Humidity, Pressure, Illuminance; optimize memory (#18441) - Command ``SetOption152 0/1`` to select two (0 = default) pin bistable or one (1) pin latching relay control (#18386) - Matter allow `Matter#Initialized` rule once the device is configured (#18451) -- Matter add UI to change endpoints configuration +- Matter add UI to change endpoints configuration (#18498) ### Breaking Changed ### Changed - ESP32 Framework (Core) from v2.0.7 to v2.0.8 +- Refactored Zero Cross Dimmer (#18481) ### Fixed - ESP8266 Energy Export Active no update regression from v12.3.1.3 diff --git a/CODE_OWNERS.md b/CODE_OWNERS.md index 2c8374b59..2e9bcfc20 100644 --- a/CODE_OWNERS.md +++ b/CODE_OWNERS.md @@ -7,215 +7,216 @@ In addition to @arendst the following code is mainly owned by: -| Code | Owner -|----------------------------|--------------------------- -| Tasmota Drivers | -| | -| xdrv_01_webserver | @arendst -| xdrv_02_mqtt | @arendst -| xdrv_03_energy | @arendst -| xdrv_04_light | @s-hadinger -| xdrv_05_irremote | @s-hadinger -| xdrv_06_snfbridge | @arendst -| xdrv_07_domoticz | @arendst -| xdrv_08_serial_bridge | Dániel Zoltán Tolnai -| xdrv_09_timers | @arendst -| xdrv_10_rules | @arendst, @barbudor -| xdrv_10_scripter | @gemu -| xdrv_11_knx | @adrian -| xdrv_12_discovery | @arendst, @effelle, @emontnemery -| xdrv_13_display | @gemu, @s-hadinger -| xdrv_14_mp3 | @gemu, @mike2nl -| xdrv_15_pca9685 | Andre Thomas -| xdrv_16_tuyamcu | @btsimonh -| xdrv_17_rcswitch | -| xdrv_18_armtronix_dimmers | @wvdv2002 -| xdrv_19_pz16dz_dimmer | Joel Stein -| xdrv_20_hue | @s-hadinger -| xdrv_21_wemo | @s-hadinger -| xdrv_22_sonoff_ifan | @arendst -| xdrv_23_zigbee | @s-hadinger -| xdrv_24_buzzer | @arendst -| xdrv_25_stepper | Tim Leuscher -| xdrv_26_ariluxrf | @arendst -| xdrv_27_shutter | @stefanbode -| xdrv_28_pcf8574 | @stefanbode -| xdrv_29_deepsleep | @stefanbode -| xdrv_30_exs_dimmer | Andreas Schultz -| xdrv_31_tasmota_client | Andre Thomas -| xdrv_32_hotplug | @BASM -| xdrv_33_nrf24l01 | @staars -| xdrv_34_wemos_motor | Peter Franck -| xdrv_35_pwm_dimmer | Paul C Diem -| xdrv_36_keeloq | he-so -| xdrv_37_sonoff_d1 | @arendst -| xdrv_38_ping | @s-hadinger -| xdrv_39_thermostat | Javier Argita -| xdrv_40_telegram | @arendst -| xdrv_41_tcp_bridge | @s-hadinger -| xdrv_42_i2s_audio | @gemu -| xdrv_43_mlx90640 | @staars -| xdrv_44_miel_hvac | David GWynne -| xdrv_45_shelly_dimmer | James Turton -| xdrv_46_ccloader | @staars -| xdrv_47_ftc532 | Peter Franck -| xdrv_48_timeprop | Colin Law, Thomas Herrmann -| xdrv_49_pid | Colin Law, Thomas Herrmann -| xdrv_50_filesystem | @gemu, @barbudor -| xdrv_51_bs814a2 | Peter Franck -| xdrv_52_berry | @s-hadinger, @staars (ULP) -| xdrv_53_projector_ctrl | Jan Bubík -| xdrv_54_lvgl | @s-hadinger -| xdrv_55_touch | @gemu, @s-hadinger -| xdrv_56_rtc_chips | @arendst, @s-hadinger -| xdrv_57_tasmesh | @staars -| xdrv_58_range_extender | @sillyfrog -| xdrv_59_influxdb | @arendst -| xdrv_60_shift595 | Jacek Ziółkowski -| xdrv_61_ds3502 | f-reiling -| xdrv_62_improv | @arendst -| xdrv_63_modbus_bridge | @jeroenst -| xdrv_64_pca9632 | Pascal Heinrich -| xdrv_65_tuyamcubr | David Gwynne -| xdrv_66_tm1638 | @arendst -| xdrv_67_mcp23xxx | @arendst -| | -| xdrv_79_esp32_ble | @staars, @btsimonh -| xdrv_81_esp32_webcam | @gemu, @philrich -| xdrv_82_esp32_ethernet | @arendst -| xdrv_83_esp32_watch | @gemu -| xdrv_85_esp32_ble_eq3_trv | @btsimonh -| xdrv_86_esp32_sonoff_spm | @arendst -| xdrv_87_esp32_sonoff_tm1621 | @arendst -| xdrv_88_esp32_shelly_pro | @arendst -| xdrv_89_esp32_dali | @eeak +| Code | Owner +|------------------------------|--------------------------- +| Tasmota Drivers | +| | +| xdrv_01_webserver | @arendst +| xdrv_02_mqtt | @arendst +| xdrv_03_energy | @arendst +| xdrv_04_light | @s-hadinger +| xdrv_05_irremote | @s-hadinger +| xdrv_06_snfbridge | @arendst +| xdrv_07_domoticz | @arendst +| xdrv_08_serial_bridge | Dániel Zoltán Tolnai +| xdrv_09_timers | @arendst +| xdrv_10_rules | @arendst, @barbudor +| xdrv_10_scripter | @gemu +| xdrv_11_knx | @adrian +| xdrv_12_discovery | @arendst, @effelle, @emontnemery +| xdrv_13_display | @gemu, @s-hadinger +| xdrv_14_mp3 | @gemu, @mike2nl +| xdrv_15_pca9685 | Andre Thomas +| xdrv_16_tuyamcu | @btsimonh +| xdrv_17_rcswitch | +| xdrv_18_armtronix_dimmers | @wvdv2002 +| xdrv_19_pz16dz_dimmer | Joel Stein +| xdrv_20_hue | @s-hadinger +| xdrv_21_wemo | @s-hadinger +| xdrv_22_sonoff_ifan | @arendst +| xdrv_23_zigbee | @s-hadinger +| xdrv_24_buzzer | @arendst +| xdrv_25_stepper | Tim Leuscher +| xdrv_26_ariluxrf | @arendst +| xdrv_27_shutter | @stefanbode +| xdrv_28_pcf8574 | @stefanbode +| xdrv_29_deepsleep | @stefanbode +| xdrv_30_exs_dimmer | Andreas Schultz +| xdrv_31_tasmota_client | Andre Thomas +| xdrv_32_hotplug | @BASM +| xdrv_33_nrf24l01 | @staars +| xdrv_34_wemos_motor | Peter Franck +| xdrv_35_pwm_dimmer | Paul C Diem +| xdrv_36_keeloq | he-so +| xdrv_37_sonoff_d1 | @arendst +| xdrv_38_ping | @s-hadinger +| xdrv_39_thermostat | Javier Argita +| xdrv_40_telegram | @arendst +| xdrv_41_tcp_bridge | @s-hadinger +| xdrv_42_i2s_audio | @gemu +| xdrv_43_mlx90640 | @staars +| xdrv_44_miel_hvac | David GWynne +| xdrv_45_shelly_dimmer | James Turton +| xdrv_46_ccloader | @staars +| xdrv_47_ftc532 | Peter Franck +| xdrv_48_timeprop | Colin Law, Thomas Herrmann +| xdrv_49_pid | Colin Law, Thomas Herrmann +| xdrv_50_filesystem | @gemu, @barbudor +| xdrv_51_bs814a2 | Peter Franck +| xdrv_52_berry | @s-hadinger, @staars (ULP) +| xdrv_53_projector_ctrl | Jan Bubík +| xdrv_54_lvgl | @s-hadinger +| xdrv_55_touch | @gemu, @s-hadinger +| xdrv_56_rtc_chips | @arendst, @s-hadinger +| xdrv_57_tasmesh | @staars +| xdrv_58_range_extender | @sillyfrog +| xdrv_59_influxdb | @arendst +| xdrv_60_shift595 | Jacek Ziółkowski +| xdrv_61_ds3502 | f-reiling +| xdrv_62_improv | @arendst +| xdrv_63_modbus_bridge | @jeroenst +| xdrv_64_pca9632 | Pascal Heinrich +| xdrv_65_tuyamcubr | David Gwynne +| xdrv_66_tm1638 | @arendst +| xdrv_67_mcp23xxx | @arendst +| xdrv_68_zerocrossDimmer.ino | @stefanbode +| | +| xdrv_79_esp32_ble | @staars, @btsimonh +| xdrv_81_esp32_webcam | @gemu, @philrich +| xdrv_82_esp32_ethernet | @arendst +| xdrv_83_esp32_watch | @gemu +| xdrv_85_esp32_ble_eq3_trv | @btsimonh +| xdrv_86_esp32_sonoff_spm | @arendst +| xdrv_87_esp32_sonoff_tm1621 | @arendst +| xdrv_88_esp32_shelly_pro | @arendst +| xdrv_89_esp32_dali | @eeak | xdrv_90_esp32_dingtian_relay | @barbudor -| | -| xdrv_122_file_settings_demo | @arendst -| xdrv_127_debug | @arendst -| | -| Tasmota Sensors | -| | -| xsns_01_counter | @arendst, @stefanbode -| xsns_02_analog | @arendst, @barbudor -| xsns_03_energy | @arendst -| xsns_04_snfsc | @arendst -| xsns_05_ds18x20 | @arendst -| xsns_06_dht | @arendst -| xsns_07_sht1x | @arendst -| xsns_08_htu | Heiko Krupp -| xsns_09_bmp | @arendst -| xsns_10_bh1750 | @arendst -| xsns_11_veml6070 | @mike2nl -| xsns_12_ads1115 | @syssi, @stefanbode -| xsns_13_ina219 | @stefanbode -| xsns_14_sht3x | Stefan Tibus -| xsns_15_mhz19 | @arendst -| xsns_16_tsl2561 | Joachim Banzhaf -| xsns_17_senseair | @arendst -| xsns_18_pms5003 | @arendst -| xsns_19_mgs | @palich2000 -| xsns_20_novasds | Norbert Richter -| xsns_21_sgp30 | Gerhard Mutz -| xsns_22_sr04 | Nuno Ferreira, @arendst -| xsns_23_me007 | Mathias Buder -| xsns_24_si1145 | -| xsns_25 | -| xsns_26_lm75ad | Andre Thomas -| xsns_27_apds9960 | Shawn Hymel -| xsns_28 | -| xsns_29_mcp230xx | Andre Thomas -| xsns_30_mpr121 | Rene 'Renne' Bartsch -| xsns_31_ccs811 | Gerhard Mutz -| xsns_32_mpu6050 | Oliver Welter -| xsns_33_qmc5883l | Helge Scheunemann -| xsns_34_hx711 | @arendst -| xsns_35_tx20 | Thomas Eckerstorfer, Norbert Richter -| xsns_36_mgc3130 | Christian Baars -| xsns_37_rfsensor | @arendst -| xsns_38_az7798 | @adebeun -| xsns_39_max31855 | Markus Past -| xsns_40_pn532 | Andre Thomas, @md5sum-as -| xsns_41_max44009 | @llagendijk -| xsns_42_scd30 | @frogmore42 -| xsns_43_hre | Jon Little -| xsns_44_sps30 | Gerhard Mutz -| xsns_45_vl53l0x | Gerhard Mutz, Adrian Scillato -| xsns_46_mlx90614 | Gerhard Mutz -| xsns_47_max31865 | Alberto Lopez Siemens -| xsns_48_chirp | Christian Baars -| xsns_49 | -| xsns_50_paj7620 | Christian Baars -| xsns_51_rdm6300 | Gerhard Mutz -| xsns_52_esp32_ibeacon | Gerhard Mutz, @btsimonh -| xsns_52_ibeacon | Gerhard Mutz -| xsns_53_sml | Gerhard Mutz -| xsns_54_ina226 | Stephen Rodgers -| xsns_55_hih_series | -| xsns_56_hpma | David Hunt -| xsns_57_tsl2591 | Markus Bösling -| xsns_58_dht12 | Stefan Oskam -| xsns_59_ds1624 | Leonid Myravje -| xsns_60_gps | Christian Baars, Adrian Scillato -| xsns_61_mi_nrf24 | Christian Baars -| xsns_62_mi_hm10 | Christian Baars -| xsns_62_esp32_mi | Christian Baars -| xsns_63_aht1x | Martin Wagner -| xsns_64_hrxl | Jon Little -| xsns_65_hdc1080 | Luis Teixeira -| xsns_66_iaq | Christian Baars -| xsns_67_as3935 | Martin Wagner -| xsns_68_windmeter | Matteo Albinola -| xsns_69_opentherm | Yuriy Sannikov -| xsns_70_veml6075 | Martin Wagner -| xsns_71_veml7700 | Martin Wagner -| xsns_72_mcp9808 | Martin Wagner -| xsns_73_hp303b | @rjaakke -| xsns_74_lmt01 | @justifiably -| xsns_75_prometheus | @marius, @mhansen, @hansmi -| xsns_76_dyp | Janusz Kostorz -| xsns_77_vl53l1x | Rui Marinho, @Jason2866 -| xsns_78_ezo | Christopher Tremblay -| xsns_79_as608 | @boaschti -| xsns_80_mfrc522 | @arendst -| xsns_81_seesaw_soil | Wayne Ross, Peter Franck -| xsns_82_wiegand | Sigurd Leuther -| xsns_83_neopool | Norbert Richter -| xsns_84_tof10120 | Cyril Pawelko -| xsns_85_mpu6886 | @s-hadinger -| xsns_86_tfminiplus | Raphael Breiting -| xsns_87_can_sniffer | @kwiatek6324, Marius Bezuidenhout -| xsns_87_mcp2515 | Marius Bezuidenhout -| xsns_88_am2320 | Lars Wessels -| xsns_89_t67xx | Alexander Savchenko -| xsns_90_hrg15 | Wouter Breukink -| xsns_91_vindriktning | Marcel Ritter -| xsns_92_scd40 | @frogmore42, @arnold-n -| xsns_93_hm330x | @barbudor -| xsns_94_hdc2010 | Luc Boudreau -| xsns_95_cm1107 | @maksim -| xsns_96_flowratemeter | Norbert Richter -| xsns_97_hyt | Thomas Schnittcher, Adjan Kretz -| xsns_98_sgp40 | Jean-Pierre Deschamps -| xsns_99_luxv30b | Marius Bezuidenhout -| xsns_100_ina3221 | @barbudor -| xsns_101_hmc5883l | Andreas Achtzehn -| xsns_102_ld2410 | @arendst -| xsns_103_sen5x | @tyeth -| xsns_104_pmsa003i | Jean-Pierre Deschamps -| xsns_105_lox_o2 | @ACE1046 -| xsns_106_gdk101 | @Szewcson -| | -| Libraries | -| | -| berry | @s-hadinger -| ext-printf | @s-hadinger -| jsmn | @s-hadinger -| unishox | @s-hadinger -| matter | @s-hadinger -| | -| PlatformIO | -| | -| all | @Jason2866 -| | +| | +| xdrv_122_file_settings_demo | @arendst +| xdrv_127_debug | @arendst +| | +| Tasmota Sensors | +| | +| xsns_01_counter | @arendst, @stefanbode +| xsns_02_analog | @arendst, @barbudor +| xsns_03_energy | @arendst +| xsns_04_snfsc | @arendst +| xsns_05_ds18x20 | @arendst +| xsns_06_dht | @arendst +| xsns_07_sht1x | @arendst +| xsns_08_htu | Heiko Krupp +| xsns_09_bmp | @arendst +| xsns_10_bh1750 | @arendst +| xsns_11_veml6070 | @mike2nl +| xsns_12_ads1115 | @syssi, @stefanbode +| xsns_13_ina219 | @stefanbode +| xsns_14_sht3x | Stefan Tibus +| xsns_15_mhz19 | @arendst +| xsns_16_tsl2561 | Joachim Banzhaf +| xsns_17_senseair | @arendst +| xsns_18_pms5003 | @arendst +| xsns_19_mgs | @palich2000 +| xsns_20_novasds | Norbert Richter +| xsns_21_sgp30 | Gerhard Mutz +| xsns_22_sr04 | Nuno Ferreira, @arendst +| xsns_23_me007 | Mathias Buder +| xsns_24_si1145 | +| xsns_25 | +| xsns_26_lm75ad | Andre Thomas +| xsns_27_apds9960 | Shawn Hymel +| xsns_28 | +| xsns_29_mcp230xx | Andre Thomas +| xsns_30_mpr121 | Rene 'Renne' Bartsch +| xsns_31_ccs811 | Gerhard Mutz +| xsns_32_mpu6050 | Oliver Welter +| xsns_33_qmc5883l | Helge Scheunemann +| xsns_34_hx711 | @arendst +| xsns_35_tx20 | Thomas Eckerstorfer, Norbert Richter +| xsns_36_mgc3130 | Christian Baars +| xsns_37_rfsensor | @arendst +| xsns_38_az7798 | @adebeun +| xsns_39_max31855 | Markus Past +| xsns_40_pn532 | Andre Thomas, @md5sum-as +| xsns_41_max44009 | @llagendijk +| xsns_42_scd30 | @frogmore42 +| xsns_43_hre | Jon Little +| xsns_44_sps30 | Gerhard Mutz +| xsns_45_vl53l0x | Gerhard Mutz, Adrian Scillato +| xsns_46_mlx90614 | Gerhard Mutz +| xsns_47_max31865 | Alberto Lopez Siemens +| xsns_48_chirp | Christian Baars +| xsns_49 | +| xsns_50_paj7620 | Christian Baars +| xsns_51_rdm6300 | Gerhard Mutz +| xsns_52_esp32_ibeacon | Gerhard Mutz, @btsimonh +| xsns_52_ibeacon | Gerhard Mutz +| xsns_53_sml | Gerhard Mutz +| xsns_54_ina226 | Stephen Rodgers +| xsns_55_hih_series | +| xsns_56_hpma | David Hunt +| xsns_57_tsl2591 | Markus Bösling +| xsns_58_dht12 | Stefan Oskam +| xsns_59_ds1624 | Leonid Myravje +| xsns_60_gps | Christian Baars, Adrian Scillato +| xsns_61_mi_nrf24 | Christian Baars +| xsns_62_mi_hm10 | Christian Baars +| xsns_62_esp32_mi | Christian Baars +| xsns_63_aht1x | Martin Wagner +| xsns_64_hrxl | Jon Little +| xsns_65_hdc1080 | Luis Teixeira +| xsns_66_iaq | Christian Baars +| xsns_67_as3935 | Martin Wagner +| xsns_68_windmeter | Matteo Albinola +| xsns_69_opentherm | Yuriy Sannikov +| xsns_70_veml6075 | Martin Wagner +| xsns_71_veml7700 | Martin Wagner +| xsns_72_mcp9808 | Martin Wagner +| xsns_73_hp303b | @rjaakke +| xsns_74_lmt01 | @justifiably +| xsns_75_prometheus | @marius, @mhansen, @hansmi +| xsns_76_dyp | Janusz Kostorz +| xsns_77_vl53l1x | Rui Marinho, @Jason2866 +| xsns_78_ezo | Christopher Tremblay +| xsns_79_as608 | @boaschti +| xsns_80_mfrc522 | @arendst +| xsns_81_seesaw_soil | Wayne Ross, Peter Franck +| xsns_82_wiegand | Sigurd Leuther +| xsns_83_neopool | Norbert Richter +| xsns_84_tof10120 | Cyril Pawelko +| xsns_85_mpu6886 | @s-hadinger +| xsns_86_tfminiplus | Raphael Breiting +| xsns_87_can_sniffer | @kwiatek6324, Marius Bezuidenhout +| xsns_87_mcp2515 | Marius Bezuidenhout +| xsns_88_am2320 | Lars Wessels +| xsns_89_t67xx | Alexander Savchenko +| xsns_90_hrg15 | Wouter Breukink +| xsns_91_vindriktning | Marcel Ritter +| xsns_92_scd40 | @frogmore42, @arnold-n +| xsns_93_hm330x | @barbudor +| xsns_94_hdc2010 | Luc Boudreau +| xsns_95_cm1107 | @maksim +| xsns_96_flowratemeter | Norbert Richter +| xsns_97_hyt | Thomas Schnittcher, Adjan Kretz +| xsns_98_sgp40 | Jean-Pierre Deschamps +| xsns_99_luxv30b | Marius Bezuidenhout +| xsns_100_ina3221 | @barbudor +| xsns_101_hmc5883l | Andreas Achtzehn +| xsns_102_ld2410 | @arendst +| xsns_103_sen5x | @tyeth +| xsns_104_pmsa003i | Jean-Pierre Deschamps +| xsns_105_lox_o2 | @ACE1046 +| xsns_106_gdk101 | @Szewcson +| | +| Libraries | +| | +| berry | @s-hadinger +| ext-printf | @s-hadinger +| jsmn | @s-hadinger +| unishox | @s-hadinger +| matter | @s-hadinger +| | +| PlatformIO | +| | +| all | @Jason2866 +| | diff --git a/RELEASENOTES.md b/RELEASENOTES.md index a34e698c9..88b95bc01 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -115,11 +115,13 @@ The latter links can be used for OTA upgrades too like ``OtaUrl https://ota.tasm - Command ``SetOption152 0/1`` to select two (0 = default) pin bistable or one (1) pin latching relay control [#18386](https://github.com/arendst/Tasmota/issues/18386) - Matter sensors Humidity, Pressure, Illuminance [#18441](https://github.com/arendst/Tasmota/issues/18441) - Matter allow `Matter#Initialized` rule once the device is configured [#18451](https://github.com/arendst/Tasmota/issues/18451) +- Matter add UI to change endpoints configuration [#18498](https://github.com/arendst/Tasmota/issues/18498) ### Breaking Changed ### Changed - ESP32 Framework (Core) from v2.0.7 to v2.0.8 +- Refactored Zero Cross Dimmer [#18481](https://github.com/arendst/Tasmota/issues/18481) ### Fixed - ESP8266 Energy Export Active no update regression from v12.3.1.3 From c8318248bb7d853104e3c288e6c8ba9cd33eb24b Mon Sep 17 00:00:00 2001 From: s-hadinger <49731213+s-hadinger@users.noreply.github.com> Date: Tue, 25 Apr 2023 23:30:23 +0200 Subject: [PATCH 037/289] Matter add support for Shutters (without Tilt) (#18509) --- CHANGELOG.md | 1 + .../berry_matter/src/be_matter_module.c | 2 + .../src/embedded/Matter_Device.be | 71 +- .../src/embedded/Matter_MessageHandler.be | 2 +- .../src/embedded/Matter_Plugin.be | 17 +- .../src/embedded/Matter_Plugin_Device.be | 14 + .../src/embedded/Matter_Plugin_Light0.be | 75 +- .../src/embedded/Matter_Plugin_Light1.be | 11 +- .../src/embedded/Matter_Plugin_Light2.be | 4 +- .../src/embedded/Matter_Plugin_Light3.be | 6 +- .../src/embedded/Matter_Plugin_OnOff.be | 158 +- .../src/embedded/Matter_Plugin_Root.be | 2 +- .../src/embedded/Matter_Plugin_Sensor.be | 8 +- .../embedded/Matter_Plugin_Sensor_Humidity.be | 6 +- .../Matter_Plugin_Sensor_Illuminance.be | 6 +- .../embedded/Matter_Plugin_Sensor_Pressure.be | 6 +- .../src/embedded/Matter_Plugin_Sensor_Temp.be | 6 +- .../src/embedded/Matter_Plugin_Shutter.be | 220 + .../berry_matter/src/embedded/Matter_UI.be | 40 +- .../src/solidify/solidified_Matter_Device.h | 7385 +++++++++-------- .../solidified_Matter_MessageHandler.h | 27 +- .../src/solidify/solidified_Matter_Plugin.h | 627 +- .../solidified_Matter_Plugin_Device.h | 95 +- .../solidified_Matter_Plugin_Light0.h | 384 +- .../solidified_Matter_Plugin_Light1.h | 441 +- .../solidified_Matter_Plugin_Light2.h | 331 +- .../solidified_Matter_Plugin_Light3.h | 572 +- .../solidify/solidified_Matter_Plugin_OnOff.h | 770 +- .../solidify/solidified_Matter_Plugin_Root.h | 180 +- .../solidified_Matter_Plugin_Sensor.h | 10 +- ...solidified_Matter_Plugin_Sensor_Humidity.h | 29 +- ...idified_Matter_Plugin_Sensor_Illuminance.h | 29 +- ...solidified_Matter_Plugin_Sensor_Pressure.h | 29 +- .../solidified_Matter_Plugin_Sensor_Temp.h | 29 +- .../solidified_Matter_Plugin_Shutter.h | 710 ++ .../src/solidify/solidified_Matter_UI.h | 1748 ++-- 36 files changed, 7376 insertions(+), 6675 deletions(-) create mode 100644 lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Shutter.be create mode 100644 lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Shutter.h diff --git a/CHANGELOG.md b/CHANGELOG.md index b73586fcf..3add3bec2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,7 @@ All notable changes to this project will be documented in this file. - Command ``SetOption152 0/1`` to select two (0 = default) pin bistable or one (1) pin latching relay control (#18386) - Matter allow `Matter#Initialized` rule once the device is configured (#18451) - Matter add UI to change endpoints configuration (#18498) +- Matter add support for Shutters (without Tilt) ### Breaking Changed diff --git a/lib/libesp32/berry_matter/src/be_matter_module.c b/lib/libesp32/berry_matter/src/be_matter_module.c index c7f4c7d9c..9a82abce2 100644 --- a/lib/libesp32/berry_matter/src/be_matter_module.c +++ b/lib/libesp32/berry_matter/src/be_matter_module.c @@ -159,6 +159,7 @@ extern const bclass be_class_Matter_TLV; // need to declare it upfront because #include "solidify/solidified_Matter_Plugin_Light1.h" #include "solidify/solidified_Matter_Plugin_Light2.h" #include "solidify/solidified_Matter_Plugin_Light3.h" +#include "solidify/solidified_Matter_Plugin_Shutter.h" #include "solidify/solidified_Matter_Plugin_Sensor.h" #include "solidify/solidified_Matter_Plugin_Sensor_Pressure.h" #include "solidify/solidified_Matter_Plugin_Sensor_Temp.h" @@ -337,6 +338,7 @@ module matter (scope: global, strings: weak) { Plugin_Light1, class(be_class_Matter_Plugin_Light1) // Dimmable Light Plugin_Light2, class(be_class_Matter_Plugin_Light2) // Color Temperature Light Plugin_Light3, class(be_class_Matter_Plugin_Light3) // Extended Color Light + Plugin_Shutter, class(be_class_Matter_Plugin_Shutter) // Shutter Plugin_Sensor, class(be_class_Matter_Plugin_Sensor) // Generic Sensor Plugin_Sensor_Pressure, class(be_class_Matter_Plugin_Sensor_Pressure) // Pressure Sensor Plugin_Sensor_Temp, class(be_class_Matter_Plugin_Sensor_Temp) // Temperature Sensor diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Device.be b/lib/libesp32/berry_matter/src/embedded/Matter_Device.be index 3dc514d64..abd767d8a 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Device.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Device.be @@ -35,6 +35,7 @@ class Matter_Device var message_handler # `matter.MessageHandler()` object var sessions # `matter.Session_Store()` objet var ui + var tick # increment at each tick, avoids to repeat too frequently some actions # Commissioning open var commissioning_open # timestamp for timeout of commissioning (millis()) or `nil` if closed var commissioning_iterations # current PBKDF number of iterations @@ -74,6 +75,7 @@ class Matter_Device end # abort if SetOption 151 is not set self.started = false + self.tick = 0 self.plugins = [] self.plugins_persist = false # plugins need to saved only when the first fabric is associated self.plugins_classes = {} @@ -326,6 +328,12 @@ class Matter_Device end + ############################################################# + # ticks + def every_50ms() + self.tick += 1 + end + ############################################################# # dispatch every 250ms click to sub-objects that need it def every_250ms() @@ -991,6 +999,7 @@ class Matter_Device # # Applies only if there are no plugins already configured def autoconf_device_map() + import string import json var m = {} @@ -1018,15 +1027,46 @@ class Matter_Device end end + # handle shutters before relays (as we steal relays for shutters) + var r_st13 = tasmota.cmd("Status 13", true) # issue `Status 13` + var relays_reserved = [] # list of relays that are used for non-relay (shutters) + tasmota.log("MTR: Status 13 = "+str(r_st13), 3) + + if r_st13.contains('StatusSHT') + r_st13 = r_st13['StatusSHT'] # skip root + # Shutter is enabled, iterate + var idx = 0 + while true + var k = 'SHT' + str(idx) # SHT is zero based + if !r_st13.contains(k) break end # no more SHTxxx + var d = r_st13[k] + tasmota.log(string.format("MTR: '%s' = %s", k, str(d)), 3) + var relay1 = d.find('Relay1', 0) - 1 # relay base 0 or -1 if none + var relay2 = d.find('Relay2', 0) - 1 # relay base 0 or -1 if none + + if relay1 >= 0 relays_reserved.push(relay1) end # mark relay1/2 as non-relays + if relay2 >= 0 relays_reserved.push(relay2) end + + tasmota.log(string.format("MTR: relay1 = %s, relay2 = %s", relay1, relay2), 3) + # add shutter to definition + m[str(endpoint)] = {'type':'shutter','shutter':idx} + endpoint += 1 + idx += 1 + end + + end + # how many relays are present var relay_count = size(tasmota.get_power()) var relay_index = 0 # start at index 0 if light_present relay_count -= 1 end # last power is taken for lights while relay_index < relay_count - m[str(endpoint)] = {'type':'relay','relay':relay_index} + if relays_reserved.find(relay_index) == nil # if relay is actual relay + m[str(endpoint)] = {'type':'relay','relay':relay_index} + endpoint += 1 + end relay_index += 1 - endpoint += 1 end # auto-detect sensors @@ -1101,8 +1141,12 @@ class Matter_Device # register_plugin_class # # Adds a class by name - def register_plugin_class(name, cl) - self.plugins_classes[name] = cl + def register_plugin_class(cl) + import introspect + var typ = introspect.get(cl, 'TYPE') # make sure we don't crash if TYPE does not exist + if typ + self.plugins_classes[typ] = cl + end end ############################################################# @@ -1128,16 +1172,15 @@ class Matter_Device # # Adds a class by name def register_native_classes(name, cl) - self.register_plugin_class('root', matter.Plugin_Root) - self.register_plugin_class('light0', matter.Plugin_Light0) - self.register_plugin_class('light1', matter.Plugin_Light1) - self.register_plugin_class('light2', matter.Plugin_Light2) - self.register_plugin_class('light3', matter.Plugin_Light3) - self.register_plugin_class('relay', matter.Plugin_OnOff) - self.register_plugin_class('temperature', matter.Plugin_Sensor_Temp) - self.register_plugin_class('humidity', matter.Plugin_Sensor_Humidity) - self.register_plugin_class('illuminance', matter.Plugin_Sensor_Illuminance) - self.register_plugin_class('pressure', matter.Plugin_Sensor_Pressure) + # try to register any class that starts with 'Plugin_' + import introspect + import string + for k: introspect.members(matter) + var v = introspect.get(matter, k) + if type(v) == 'class' && string.find(k, "Plugin_") == 0 + self.register_plugin_class(v) + end + end tasmota.log("MTR: registered classes "+str(self.k2l(self.plugins_classes)), 3) end diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_MessageHandler.be b/lib/libesp32/berry_matter/src/embedded/Matter_MessageHandler.be index 651731c99..f68b0c48e 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_MessageHandler.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_MessageHandler.be @@ -203,7 +203,7 @@ class Matter_MessageHandler return ret except .. as e, m tasmota.log("MTR: MessageHandler::msg_received exception: "+str(e)+";"+str(m)) - if self._debug_present + if tasmota._debug_present import debug debug.traceback() end diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin.be index e36f99d88..142987bc3 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin.be @@ -23,7 +23,7 @@ #@ solidify:Matter_Plugin,weak class Matter_Plugin - static var TYPE = "generic" # name of the plug-in in json + static var TYPE = "" # name of the plug-in in json static var NAME = "" # display name of the plug-in static var ARG = "" # additional argument name (or empty if none) static var ARG_TYPE = / x -> str(x) # function to convert argument to the right type @@ -33,6 +33,7 @@ class Matter_Plugin var device # reference to the `device` global object var endpoint # current endpoint var clusters # map from cluster to list of attributes, typically constructed from CLUSTERS hierachy + var tick # tick value when it was last updated ############################################################# # MVC Model @@ -55,15 +56,23 @@ class Matter_Plugin ############################################################# # Stub for updating shadow values (local copies of what we published to the Matter gateway) def update_shadow() + self.tick = self.device.tick + end + + ############################################################# + # Stub for updating shadow values (local copies of what we published to the Matter gateway) + def update_shadow_lazy() + if self.tick != self.device.tick + self.update_shadow() + end end ############################################################# # signal that an attribute has been changed # # If `endpoint` is `nil`, send to all endpoints - def attribute_updated(endpoint, cluster, attribute, fabric_specific) - if endpoint == nil endpoint = self.endpoint end - self.device.attribute_updated(endpoint, cluster, attribute, fabric_specific) + def attribute_updated(cluster, attribute, fabric_specific) + self.device.attribute_updated(self.endpoint, cluster, attribute, fabric_specific) end ############################################################# diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Device.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Device.be index d8e728558..648d008f0 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Device.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Device.be @@ -27,6 +27,7 @@ class Matter_Plugin_Device : Matter_Plugin # 0x001D: inherited # Descriptor Cluster 9.5 p.453 0x0003: [0,1,0xFFFC,0xFFFD], # Identify 1.2 p.16 0x0004: [0,0xFFFC,0xFFFD], # Groups 1.3 p.21 + 0x0005: [0,1,2,3,4,5,0xFFFC,0xFFFD], # Scenes 1.4 p.30 - no writable } static var TYPES = { 0x0000: 0 } # fake type @@ -67,6 +68,14 @@ class Matter_Plugin_Device : Matter_Plugin return TLV.create_TLV(TLV.U4, 4)# "new data model format and notation" end + # ==================================================================================================== + elif cluster == 0x0005 # ========== Scenes 1.4 p.30 - no writable ========== + if attribute == 0xFFFC # ---------- FeatureMap / map32 ---------- + return TLV.create_TLV(TLV.U4, 0) # 0 = no Level Control for Lighting + elif attribute == 0xFFFD # ---------- ClusterRevision / u2 ---------- + return TLV.create_TLV(TLV.U4, 4) # 0 = no Level Control for Lighting + end + else return super(self).read_attribute(session, ctx) end @@ -105,6 +114,11 @@ class Matter_Plugin_Device : Matter_Plugin # TODO return true + # ==================================================================================================== + elif cluster == 0x0005 # ========== Scenes 1.4 p.30 ========== + # TODO + return true + else return super(self).invoke_request(session, val, ctx) end diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Light0.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Light0.be index a5803101d..c4abc2758 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Light0.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Light0.be @@ -20,18 +20,18 @@ # Matter plug-in for core behavior # dummy declaration for solidification -class Matter_Plugin end +class Matter_Plugin_Device end #@ solidify:Matter_Plugin_Light0,weak -class Matter_Plugin_Light0 : Matter_Plugin +class Matter_Plugin_Light0 : Matter_Plugin_Device static var TYPE = "light0" # name of the plug-in in json static var NAME = "Light 0 On" # display name of the plug-in static var CLUSTERS = { # 0x001D: inherited # Descriptor Cluster 9.5 p.453 - 0x0003: [0,1,0xFFFC,0xFFFD], # Identify 1.2 p.16 - 0x0004: [0,0xFFFC,0xFFFD], # Groups 1.3 p.21 - 0x0005: [0,1,2,3,4,5,0xFFFC,0xFFFD], # Scenes 1.4 p.30 - no writable + # 0x0003: inherited # Identify 1.2 p.16 + # 0x0004: inherited # Groups 1.3 p.21 + # 0x0005: inherited # Scenes 1.4 p.30 - no writable 0x0006: [0,0xFFFC,0xFFFD], # On/Off 1.5 p.48 } static var TYPES = { 0x0100: 2 } # OnOff Light, but not actually used because Relay is managed by OnOff @@ -52,7 +52,8 @@ class Matter_Plugin_Light0 : Matter_Plugin import light var light_status = light.get() var pow = light_status.find('power', nil) - if pow != self.shadow_onoff self.attribute_updated(nil, 0x0006, 0x0000) self.shadow_onoff = pow end + if pow != self.shadow_onoff self.attribute_updated(0x0006, 0x0000) self.shadow_onoff = pow end + super(self).update_shadow() end ############################################################# @@ -65,37 +66,8 @@ class Matter_Plugin_Light0 : Matter_Plugin var attribute = ctx.attribute # ==================================================================================================== - if cluster == 0x0003 # ========== Identify 1.2 p.16 ========== - if attribute == 0x0000 # ---------- IdentifyTime / u2 ---------- - return TLV.create_TLV(TLV.U2, 0) # no identification in progress - elif attribute == 0x0001 # ---------- IdentifyType / enum8 ---------- - return TLV.create_TLV(TLV.U1, 0) # IdentifyType = 0x00 None - elif attribute == 0xFFFC # ---------- FeatureMap / map32 ---------- - return TLV.create_TLV(TLV.U4, 0) # no features - elif attribute == 0xFFFD # ---------- ClusterRevision / u2 ---------- - return TLV.create_TLV(TLV.U4, 4) # "new data model format and notation" - end - - # ==================================================================================================== - elif cluster == 0x0004 # ========== Groups 1.3 p.21 ========== - if attribute == 0x0000 # ---------- ---------- - return nil # TODO - elif attribute == 0xFFFC # ---------- FeatureMap / map32 ---------- - return TLV.create_TLV(TLV.U4, 0)# - elif attribute == 0xFFFD # ---------- ClusterRevision / u2 ---------- - return TLV.create_TLV(TLV.U4, 4)# "new data model format and notation" - end - - # ==================================================================================================== - elif cluster == 0x0005 # ========== Scenes 1.4 p.30 - no writable ========== - if attribute == 0xFFFC # ---------- FeatureMap / map32 ---------- - return TLV.create_TLV(TLV.U4, 0) # 0 = no Level Control for Lighting - elif attribute == 0xFFFD # ---------- ClusterRevision / u2 ---------- - return TLV.create_TLV(TLV.U4, 4) # 0 = no Level Control for Lighting - end - - # ==================================================================================================== - elif cluster == 0x0006 # ========== On/Off 1.5 p.48 ========== + if cluster == 0x0006 # ========== On/Off 1.5 p.48 ========== + self.update_shadow_lazy() if attribute == 0x0000 # ---------- OnOff / bool ---------- return TLV.create_TLV(TLV.BOOL, self.shadow_onoff) elif attribute == 0xFFFC # ---------- FeatureMap / map32 ---------- @@ -121,33 +93,8 @@ class Matter_Plugin_Light0 : Matter_Plugin var command = ctx.command # ==================================================================================================== - if cluster == 0x0003 # ========== Identify 1.2 p.16 ========== - - if command == 0x0000 # ---------- Identify ---------- - # ignore - return true - elif command == 0x0001 # ---------- IdentifyQuery ---------- - # create IdentifyQueryResponse - # ID=1 - # 0=Certificate (octstr) - var iqr = TLV.Matter_TLV_struct() - iqr.add_TLV(0, TLV.U2, 0) # Timeout - ctx.command = 0x00 # IdentifyQueryResponse - return iqr - elif command == 0x0040 # ---------- TriggerEffect ---------- - # ignore - return true - end - # ==================================================================================================== - elif cluster == 0x0004 # ========== Groups 1.3 p.21 ========== - # TODO - return true - # ==================================================================================================== - elif cluster == 0x0005 # ========== Scenes 1.4 p.30 ========== - # TODO - return true - # ==================================================================================================== - elif cluster == 0x0006 # ========== On/Off 1.5 p.48 ========== + if cluster == 0x0006 # ========== On/Off 1.5 p.48 ========== + self.update_shadow_lazy() if command == 0x0000 # ---------- Off ---------- light.set({'power':false}) self.update_shadow() diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Light1.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Light1.be index 656fbc666..531f3fd61 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Light1.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Light1.be @@ -54,8 +54,13 @@ class Matter_Plugin_Light1 : Matter_Plugin_Light0 import light var light_status = light.get() var bri = light_status.find('bri', nil) - if bri != nil bri = tasmota.scale_uint(bri, 0, 255, 0, 254) else bri = self.shadow_bri end - if bri != self.shadow_bri self.attribute_updated(nil, 0x0008, 0x0000) self.shadow_bri = bri end + if bri != nil + bri = tasmota.scale_uint(bri, 0, 255, 0, 254) + if bri != self.shadow_bri + self.attribute_updated(0x0008, 0x0000) + self.shadow_bri = bri + end + end super(self).update_shadow() # superclass manages 'power' end @@ -70,6 +75,7 @@ class Matter_Plugin_Light1 : Matter_Plugin_Light0 # ==================================================================================================== if cluster == 0x0008 # ========== Level Control 1.6 p.57 ========== + self.update_shadow_lazy() if attribute == 0x0000 # ---------- CurrentLevel / u1 ---------- return TLV.create_TLV(TLV.U1, self.shadow_bri) elif attribute == 0x0002 # ---------- MinLevel / u1 ---------- @@ -104,6 +110,7 @@ class Matter_Plugin_Light1 : Matter_Plugin_Light0 # ==================================================================================================== if cluster == 0x0008 # ========== Level Control 1.6 p.57 ========== + self.update_shadow_lazy() if command == 0x0000 # ---------- MoveToLevel ---------- var bri_in = val.findsubval(0) # Hue 0..254 var bri = tasmota.scale_uint(bri_in, 0, 254, 0, 255) diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Light2.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Light2.be index 8c0cde617..9eee3be00 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Light2.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Light2.be @@ -59,7 +59,7 @@ class Matter_Plugin_Light2 : Matter_Plugin_Light1 var light_status = light.get() var ct = light_status.find('ct', nil) if ct == nil ct = self.shadow_ct end - if ct != self.shadow_ct self.attribute_updated(nil, 0x0300, 0x0007) self.shadow_ct = ct end + if ct != self.shadow_ct self.attribute_updated(0x0300, 0x0007) self.shadow_ct = ct end end ############################################################# @@ -82,6 +82,7 @@ class Matter_Plugin_Light2 : Matter_Plugin_Light1 # ==================================================================================================== if cluster == 0x0300 # ========== Color Control 3.2 p.111 ========== + self.update_shadow_lazy() if attribute == 0x0007 # ---------- ColorTemperatureMireds / u2 ---------- return TLV.create_TLV(TLV.U1, self.shadow_ct) elif attribute == 0x0008 # ---------- ColorMode / u1 ---------- @@ -117,6 +118,7 @@ class Matter_Plugin_Light2 : Matter_Plugin_Light1 # ==================================================================================================== if cluster == 0x0300 # ========== Color Control 3.2 p.111 ========== + self.update_shadow_lazy() if command == 0x000A # ---------- MoveToColorTemperature ---------- var ct_in = val.findsubval(0) # CT if ct_in < self.ct_min ct_in = self.ct_min end diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Light3.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Light3.be index 8e1f63d04..acdce0837 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Light3.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Light3.be @@ -59,8 +59,8 @@ class Matter_Plugin_Light3 : Matter_Plugin_Light1 var sat = light_status.find('sat', nil) if hue != nil hue = tasmota.scale_uint(hue, 0, 360, 0, 254) else hue = self.shadow_hue end if sat != nil sat = tasmota.scale_uint(sat, 0, 255, 0, 254) else sat = self.shadow_sat end - if hue != self.shadow_hue self.attribute_updated(nil, 0x0300, 0x0000) self.shadow_hue = hue end - if sat != self.shadow_sat self.attribute_updated(nil, 0x0300, 0x0001) self.shadow_sat = sat end + if hue != self.shadow_hue self.attribute_updated(0x0300, 0x0000) self.shadow_hue = hue end + if sat != self.shadow_sat self.attribute_updated(0x0300, 0x0001) self.shadow_sat = sat end end ############################################################# @@ -74,6 +74,7 @@ class Matter_Plugin_Light3 : Matter_Plugin_Light1 # ==================================================================================================== if cluster == 0x0300 # ========== Color Control 3.2 p.111 ========== + self.update_shadow_lazy() if attribute == 0x0000 # ---------- CurrentHue / u1 ---------- return TLV.create_TLV(TLV.U1, self.shadow_hue) elif attribute == 0x0001 # ---------- CurrentSaturation / u2 ---------- @@ -117,6 +118,7 @@ class Matter_Plugin_Light3 : Matter_Plugin_Light1 # ==================================================================================================== if cluster == 0x0300 # ========== Color Control 3.2 p.111 ========== + self.update_shadow_lazy() if command == 0x0000 # ---------- MoveToHue ---------- var hue_in = val.findsubval(0) # Hue 0..254 var hue = tasmota.scale_uint(hue_in, 0, 254, 0, 360) diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_OnOff.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_OnOff.be index f45a671f8..6d1c9bf90 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_OnOff.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_OnOff.be @@ -20,22 +20,21 @@ # Matter plug-in for core behavior # dummy declaration for solidification -class Matter_Plugin end +class Matter_Plugin_Device end #@ solidify:Matter_Plugin_OnOff,weak -class Matter_Plugin_OnOff : Matter_Plugin +class Matter_Plugin_OnOff : Matter_Plugin_Device static var TYPE = "relay" # name of the plug-in in json static var NAME = "Relay" # display name of the plug-in static var ARG = "relay" # additional argument name (or empty if none) static var ARG_TYPE = / x -> int(x) # function to convert argument to the right type static var CLUSTERS = { # 0x001D: inherited # Descriptor Cluster 9.5 p.453 - 0x0003: [0,1,0xFFFC,0xFFFD], # Identify 1.2 p.16 - 0x0004: [0,0xFFFC,0xFFFD], # Groups 1.3 p.21 - 0x0005: [0,1,2,3,4,5,0xFFFC,0xFFFD], # Scenes 1.4 p.30 - no writable + # 0x0003: inherited # Identify 1.2 p.16 + # 0x0004: inherited # Groups 1.3 p.21 + # 0x0005: inherited # Scenes 1.4 p.30 - no writable 0x0006: [0,0xFFFC,0xFFFD], # On/Off 1.5 p.48 - # 0x0008: [0,15,17,0xFFFC,0xFFFD] # Level Control 1.6 p.57 } static var TYPES = { 0x010A: 2 } # On/Off Light @@ -46,32 +45,31 @@ class Matter_Plugin_OnOff : Matter_Plugin # Constructor def init(device, endpoint, arguments) super(self).init(device, endpoint, arguments) - self.get_onoff() # read actual value + self.shadow_onoff = false self.tasmota_relay_index = arguments.find(self.ARG #-'relay'-#) if self.tasmota_relay_index == nil self.tasmota_relay_index = 0 end end + ############################################################# + # Update shadow + # + def update_shadow() + var state = tasmota.get_power(self.tasmota_relay_index) + if state != nil + if self.shadow_onoff != nil && self.shadow_onoff != bool(state) + self.attribute_updated(0x0006, 0x0000) + end + self.shadow_onoff = state + end + super(self).update_shadow() + end + ############################################################# # Model # def set_onoff(v) tasmota.set_power(self.tasmota_relay_index, bool(v)) - self.get_onoff() - end - ############################################################# - # get_onoff - # - # Update shadow and signal any change - def get_onoff() - var state = tasmota.get_power(self.tasmota_relay_index) - if state != nil - if self.shadow_onoff != nil && self.shadow_onoff != bool(state) - self.onoff_changed() # signal any change - end - self.shadow_onoff = state - end - if self.shadow_onoff == nil self.shadow_onoff = false end # avoid any `nil` value when initializing - return self.shadow_onoff + self.update_shadow() end ############################################################# @@ -84,59 +82,16 @@ class Matter_Plugin_OnOff : Matter_Plugin var attribute = ctx.attribute # ==================================================================================================== - if cluster == 0x0003 # ========== Identify 1.2 p.16 ========== - if attribute == 0x0000 # ---------- IdentifyTime / u2 ---------- - return TLV.create_TLV(TLV.U2, 0) # no identification in progress - elif attribute == 0x0001 # ---------- IdentifyType / enum8 ---------- - return TLV.create_TLV(TLV.U1, 0) # IdentifyType = 0x00 None - elif attribute == 0xFFFC # ---------- FeatureMap / map32 ---------- - return TLV.create_TLV(TLV.U4, 0) # no features - elif attribute == 0xFFFD # ---------- ClusterRevision / u2 ---------- - return TLV.create_TLV(TLV.U4, 4) # "new data model format and notation" - end - - # ==================================================================================================== - elif cluster == 0x0004 # ========== Groups 1.3 p.21 ========== - if attribute == 0x0000 # ---------- ---------- - return nil # TODO - elif attribute == 0xFFFC # ---------- FeatureMap / map32 ---------- - return TLV.create_TLV(TLV.U4, 0)# - elif attribute == 0xFFFD # ---------- ClusterRevision / u2 ---------- - return TLV.create_TLV(TLV.U4, 4)# "new data model format and notation" - end - - # ==================================================================================================== - elif cluster == 0x0005 # ========== Scenes 1.4 p.30 - no writable ========== - if attribute == 0xFFFC # ---------- FeatureMap / map32 ---------- - return TLV.create_TLV(TLV.U4, 0) # 0 = no Level Control for Lighting - elif attribute == 0xFFFD # ---------- ClusterRevision / u2 ---------- - return TLV.create_TLV(TLV.U4, 4) # 0 = no Level Control for Lighting - end - - # ==================================================================================================== - elif cluster == 0x0006 # ========== On/Off 1.5 p.48 ========== + if cluster == 0x0006 # ========== On/Off 1.5 p.48 ========== + self.update_shadow_lazy() if attribute == 0x0000 # ---------- OnOff / bool ---------- - return TLV.create_TLV(TLV.BOOL, self.get_onoff()) + return TLV.create_TLV(TLV.BOOL, self.shadow_onoff) elif attribute == 0xFFFC # ---------- FeatureMap / map32 ---------- return TLV.create_TLV(TLV.U4, 0) # 0 = no Level Control for Lighting elif attribute == 0xFFFD # ---------- ClusterRevision / u2 ---------- return TLV.create_TLV(TLV.U4, 4) # 0 = no Level Control for Lighting end - # ==================================================================================================== - elif cluster == 0x0008 # ========== Level Control 1.6 p.57 ========== - if attribute == 0x0000 # ---------- CurrentLevel / u1 ---------- - return TLV.create_TLV(TLV.U1, 0x88) - elif attribute == 0x000F # ---------- Options / map8 ---------- - return TLV.create_TLV(TLV.U1, 0) # 0 = no Level Control for Lighting - elif attribute == 0x0010 # ---------- OnLevel / u1 ---------- - return TLV.create_TLV(TLV.U1, 1) # 0 = no Level Control for Lighting - elif attribute == 0xFFFC # ---------- FeatureMap / map32 ---------- - return TLV.create_TLV(TLV.U4, 0) # 0 = no Level Control for Lighting - elif attribute == 0xFFFD # ---------- ClusterRevision / u2 ---------- - return TLV.create_TLV(TLV.U4, 4) # 0 = no Level Control for Lighting - end - else return super(self).read_attribute(session, ctx) end @@ -153,75 +108,24 @@ class Matter_Plugin_OnOff : Matter_Plugin var command = ctx.command # ==================================================================================================== - if cluster == 0x0003 # ========== Identify 1.2 p.16 ========== - - if command == 0x0000 # ---------- Identify ---------- - # ignore - return true - elif command == 0x0001 # ---------- IdentifyQuery ---------- - # create IdentifyQueryResponse - # ID=1 - # 0=Certificate (octstr) - var iqr = TLV.Matter_TLV_struct() - iqr.add_TLV(0, TLV.U2, 0) # Timeout - ctx.command = 0x00 # IdentifyQueryResponse - return iqr - elif command == 0x0040 # ---------- TriggerEffect ---------- - # ignore - return true - end - # ==================================================================================================== - elif cluster == 0x0004 # ========== Groups 1.3 p.21 ========== - # TODO - return true - # ==================================================================================================== - elif cluster == 0x0005 # ========== Scenes 1.4 p.30 ========== - # TODO - return true - # ==================================================================================================== - elif cluster == 0x0006 # ========== On/Off 1.5 p.48 ========== + if cluster == 0x0006 # ========== On/Off 1.5 p.48 ========== + self.update_shadow_lazy() if command == 0x0000 # ---------- Off ---------- self.set_onoff(false) + self.update_shadow() return true elif command == 0x0001 # ---------- On ---------- self.set_onoff(true) + self.update_shadow() return true elif command == 0x0002 # ---------- Toggle ---------- - self.set_onoff(!self.get_onoff()) - return true - end - # ==================================================================================================== - elif cluster == 0x0008 # ========== Level Control 1.6 p.57 ========== - if command == 0x0000 # ---------- MoveToLevel ---------- - return true - elif command == 0x0001 # ---------- Move ---------- - return true - elif command == 0x0002 # ---------- Step ---------- - return true - elif command == 0x0003 # ---------- Stop ---------- - return true - elif command == 0x0004 # ---------- MoveToLevelWithOnOff ---------- - return true - elif command == 0x0005 # ---------- MoveWithOnOff ---------- - return true - elif command == 0x0006 # ---------- StepWithOnOff ---------- - return true - elif command == 0x0007 # ---------- StopWithOnOff ---------- + self.set_onoff(!self.shadow_onoff) + self.update_shadow() return true end end + end - ############################################################# - # Signal that onoff attribute changed - def onoff_changed() - self.attribute_updated(nil, 0x0006, 0x0000) # send to all endpoints - end - - ############################################################# - # every_second - def every_second() - self.get_onoff() # force reading value and sending subscriptions - end end matter.Plugin_OnOff = Matter_Plugin_OnOff diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Root.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Root.be index 0427ed022..76f2440ff 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Root.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Root.be @@ -616,7 +616,7 @@ class Matter_Plugin_Root : Matter_Plugin if attribute == 0x0000 # ---------- Breadcrumb ---------- if type(write_data) == 'int' || isinstance(write_data, int64) session._breadcrumb = write_data - self.attribute_updated(ctx.endpoint, ctx.cluster, ctx.attribute) # TODO should we have a more generalized way each time a write_attribute is triggered, declare the attribute as changed? + self.attribute_updated(ctx.cluster, ctx.attribute) # TODO should we have a more generalized way each time a write_attribute is triggered, declare the attribute as changed? return true else ctx.status = matter.CONSTRAINT_ERROR diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor.be index 45b2ee983..3f0d2dfd7 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor.be @@ -50,7 +50,7 @@ class Matter_Plugin_Sensor : Matter_Plugin_Device var val = self.pre_value(real(self.tasmota_sensor_matcher.match(payload))) if val != nil if val != self.shadow_value - self.valued_changed(val) + self.value_changed(val) end self.shadow_value = val end @@ -61,9 +61,9 @@ class Matter_Plugin_Sensor : Matter_Plugin_Device # Called when the value changed compared to shadow value # # This must be overriden. - # This is where you call `self.attribute_updated(nil, , )` - def valued_changed(val) - # self.attribute_updated(nil, 0x0402, 0x0000) + # This is where you call `self.attribute_updated(, )` + def value_changed(val) + # self.attribute_updated(0x0402, 0x0000) end ############################################################# diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor_Humidity.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor_Humidity.be index b31e12965..55ccdf992 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor_Humidity.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor_Humidity.be @@ -45,9 +45,9 @@ class Matter_Plugin_Sensor_Humidity : Matter_Plugin_Sensor # Called when the value changed compared to shadow value # # This must be overriden. - # This is where you call `self.attribute_updated(nil, , )` - def valued_changed(val) - self.attribute_updated(nil, 0x0405, 0x0000) + # This is where you call `self.attribute_updated(, )` + def value_changed(val) + self.attribute_updated(0x0405, 0x0000) end ############################################################# diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor_Illuminance.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor_Illuminance.be index f7619bdfb..e676aac18 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor_Illuminance.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor_Illuminance.be @@ -45,9 +45,9 @@ class Matter_Plugin_Sensor_Illuminance : Matter_Plugin_Sensor # Called when the value changed compared to shadow value # # This must be overriden. - # This is where you call `self.attribute_updated(nil, , )` - def valued_changed(val) - self.attribute_updated(nil, 0x0400, 0x0000) + # This is where you call `self.attribute_updated(, )` + def value_changed(val) + self.attribute_updated(0x0400, 0x0000) end ############################################################# diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor_Pressure.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor_Pressure.be index 47a2110cb..60414b0c9 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor_Pressure.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor_Pressure.be @@ -45,9 +45,9 @@ class Matter_Plugin_Sensor_Pressure : Matter_Plugin_Sensor # Called when the value changed compared to shadow value # # This must be overriden. - # This is where you call `self.attribute_updated(nil, , )` - def valued_changed(val) - self.attribute_updated(nil, 0x0403, 0x0000) + # This is where you call `self.attribute_updated(, )` + def value_changed(val) + self.attribute_updated(0x0403, 0x0000) end ############################################################# diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor_Temp.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor_Temp.be index 9944633be..ec411f537 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor_Temp.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor_Temp.be @@ -45,9 +45,9 @@ class Matter_Plugin_Sensor_Temp : Matter_Plugin_Sensor # Called when the value changed compared to shadow value # # This must be overriden. - # This is where you call `self.attribute_updated(nil, , )` - def valued_changed(val) - self.attribute_updated(nil, 0x0402, 0x0000) + # This is where you call `self.attribute_updated(, )` + def value_changed(val) + self.attribute_updated(0x0402, 0x0000) end ############################################################# diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Shutter.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Shutter.be new file mode 100644 index 000000000..408e74ba7 --- /dev/null +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Shutter.be @@ -0,0 +1,220 @@ +# +# Matter_Plugin_Shutter.be - implements the behavior for shutters +# +# Copyright (C) 2023 Stephan Hadinger & Theo Arends +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +# + +# Matter plug-in for core behavior + +# dummy declaration for solidification +class Matter_Plugin_Device end + +#@ solidify:Matter_Plugin_Shutter,weak + +class Matter_Plugin_Shutter : Matter_Plugin_Device + static var TYPE = "shutter" # name of the plug-in in json + static var NAME = "Shutter" # display name of the plug-in + static var ARG = "shutter" # additional argument name (or empty if none) + static var ARG_TYPE = / x -> int(x) # function to convert argument to the right type + static var CLUSTERS = { + # 0x001D: inherited # Descriptor Cluster 9.5 p.453 + # 0x0003: inherited # Identify 1.2 p.16 + # 0x0004: inherited # Groups 1.3 p.21 + # 0x0005: inherited # Scenes 1.4 p.30 - no writable + 0x0102: [0,5,6,7,8,9,0xA,0xB,0xC,0xD,0xE,0xF,0x17,0xFFFC,0xFFFD], # Window Covering 5.3 p.289 + } + static var TYPES = { 0x0202: 2 } # New data model format and notation + + var tasmota_shutter_index # Shutter number in Tasmota (zero based) + var shadow_shutter_pos + var shadow_shutter_target + var shadow_shutter_tilt + var shadow_shutter_direction # 1=opening -1=closing 0=not moving TODO + + ############################################################# + # Constructor + def init(device, endpoint, arguments) + super(self).init(device, endpoint, arguments) + self.tasmota_shutter_index = arguments.find(self.ARG #-'relay'-#) + if self.tasmota_shutter_index == nil self.tasmota_shutter_index = 0 end + end + + ############################################################# + # Update shadow + # + def update_shadow() + var sp = tasmota.cmd("ShutterPosition" + str(self.tasmota_shutter_index + 1), true) + if sp + self.parse_sensors(sp) + end + super(self).update_shadow() + end + + ############################################################# + # read an attribute + # + def read_attribute(session, ctx) + import string + var TLV = matter.TLV + var cluster = ctx.cluster + var attribute = ctx.attribute + + # ==================================================================================================== + if cluster == 0x0102 # ========== Window Covering 5.3 p.289 ========== + self.update_shadow_lazy() + if attribute == 0x0000 # ---------- Type / enum8 ---------- + return TLV.create_TLV(TLV.U1, 0xFF) # 0xFF = unknown type of shutter + elif attribute == 0x0005 # ---------- NumberOfActuationsLift / u16 ---------- + return TLV.create_TLV(TLV.U2, 0) + elif attribute == 0x0006 # ---------- NumberOfActuationsTilt / u16 ---------- + return TLV.create_TLV(TLV.U2, 0) + elif attribute == 0x0007 # ---------- ConfigStatus / u8 ---------- + return TLV.create_TLV(TLV.U1, 1 + 8 + 16) # Operational + Lift Position Aware + Tilt Position Aware + elif attribute == 0x000D # ---------- EndProductType / u8 ---------- + return TLV.create_TLV(TLV.U1, 0xFF) # 0xFF = unknown type of shutter + + elif attribute == 0x0008 # ---------- CurrentPositionLiftPercentage / u8 ---------- + return TLV.create_TLV(TLV.U2, 100 - self.shadow_shutter_pos) + elif attribute == 0x000E # ---------- CurrentPositionLiftPercent100ths / u16 ---------- + return TLV.create_TLV(TLV.U2, (100 - self.shadow_shutter_pos) * 100) + elif attribute == 0x0009 # ---------- CurrentPositionTiltPercentage / u8 ---------- + return TLV.create_TLV(TLV.U2, 100 - self.shadow_shutter_tilt) + elif attribute == 0x000F # ---------- CurrentPositionTiltPercent100ths / u8 ---------- + return TLV.create_TLV(TLV.U2, (100 - self.shadow_shutter_tilt) * 100) + elif attribute == 0x000A # ---------- OperationalStatus / u8 ---------- + var op = self.shadow_shutter_direction == 0 ? 0 : (self.shadow_shutter_direction > 0 ? 1 : 2) + return TLV.create_TLV(TLV.U1, op) # TODO from sensors + elif attribute == 0x000B # ---------- TargetPositionLiftPercent100ths / u16 ---------- + return TLV.create_TLV(TLV.U2, (100 - self.shadow_shutter_target) * 100) + elif attribute == 0x000C # ---------- TargetPositionTiltPercent100ths / u16 ---------- + return TLV.create_TLV(TLV.U1, 0) # TODO + + elif attribute == 0x0017 # ---------- Mode / u8 ---------- + return TLV.create_TLV(TLV.U1, 0) # normal mode + + elif attribute == 0xFFFC # ---------- FeatureMap / map32 ---------- + return TLV.create_TLV(TLV.U4, 3 + 4 + 16) # Lift + Tilt + PA_LF + PA_TL + elif attribute == 0xFFFD # ---------- ClusterRevision / u2 ---------- + return TLV.create_TLV(TLV.U4, 5) # New data model format and notation + end + + else + return super(self).read_attribute(session, ctx) + end + end + + ############################################################# + # Invoke a command + # + # returns a TLV object if successful, contains the response + # or an `int` to indicate a status + def invoke_request(session, val, ctx) + import light + var TLV = matter.TLV + var cluster = ctx.cluster + var command = ctx.command + + # ==================================================================================================== + if cluster == 0x0102 # ========== Window Covering 5.3 p.289 ========== + self.update_shadow_lazy() + if command == 0x0000 # ---------- UpOrOpen ---------- + tasmota.cmd("ShutterStopOpen"+str(self.tasmota_shutter_index+1), true) + self.update_shadow() + return true + elif command == 0x0001 # ---------- DownOrClose ---------- + tasmota.cmd("ShutterStopClose"+str(self.tasmota_shutter_index+1), true) + self.update_shadow() + return true + elif command == 0x0002 # ---------- StopMotion ---------- + tasmota.cmd("ShutterStop"+str(self.tasmota_shutter_index+1), true) + self.update_shadow() + return true + elif command == 0x0005 # ---------- GoToLiftPercentage ---------- + tasmota.log("MTR: Tilt = "+str(val), 2) + var pos_100 = val.findsubval(0) + if pos_100 != nil + pos_100 = pos_100 / 100 + tasmota.cmd("ShutterStopPosition"+str(self.tasmota_shutter_index+1) + " " + str(100 - pos_100), true) + ctx.log = "pos%:"+str(pos_100) + self.update_shadow() + end + return true + elif command == 0x0008 # ---------- GoToTiltPercentage ---------- + var tilt = val.findsubval(0) + if tilt != nil + tilt = tilt / 10 + ctx.log = "tilt%:"+str(tilt) + end + return true + end + + else + return super(self).invoke_request(session, val, ctx) + end + + end + + ############################################################# + # parse sensor + # + # The device calls regularly `tasmota.read_sensors()` and converts + # it to json. + def parse_sensors(payload) + import string + var k = "Shutter" + str(self.tasmota_shutter_index + 1) + if payload.contains(k) + var v = payload[k] + # tasmota.log(string.format("MTR: getting shutter values(%i): %s", self.endpoint, str(v)), 2) + # Position + var val_pos = v.find("Position") + if val_pos != nil + if val_pos != self.shadow_shutter_pos + # self.attribute_updated(0x0102, 0x0008) # CurrentPositionLiftPercentage + self.attribute_updated(0x0102, 0x000E) # CurrentPositionLiftPercent100ths + end + self.shadow_shutter_pos = val_pos + end + # Tilt + var val_tilt = v.find("Tilt") + if val_tilt != nil + if val_tilt != self.shadow_shutter_tilt + # self.attribute_updated(0x0102, 0x0009) # CurrentPositionTiltPercentage + self.attribute_updated(0x0102, 0x000F) # CurrentPositionTiltPercent100ths + end + self.shadow_shutter_tilt = val_tilt + end + # Direction + var val_dir = v.find("Direction") + if val_dir != nil + if val_dir != self.shadow_shutter_direction + self.attribute_updated(0x0102, 0x000A) # OperationalStatus + end + self.shadow_shutter_direction = val_dir + end + # Target + var val_target = v.find("Target") + if val_target != nil + if val_target != self.shadow_shutter_target + self.attribute_updated(0x0102, 0x000B) # TargetPositionLiftPercent100ths + end + self.shadow_shutter_target = val_target + end + # + end + end + +end +matter.Plugin_Shutter = Matter_Plugin_Shutter diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_UI.be b/lib/libesp32/berry_matter/src/embedded/Matter_UI.be index 5eb86378b..a2633b34c 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_UI.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_UI.be @@ -32,7 +32,8 @@ import matter # WebUI for the partition manager ################################################################################# class Matter_UI - static var _CLASSES_TYPES = "root|relay|light0|light1|light2|light3" + static var _ROOT_TYPES = "root" + static var _CLASSES_TYPES = "|relay|light0|light1|light2|light3|shutter" "|temperature|pressure|illuminance|humidity" var device @@ -179,7 +180,7 @@ class Matter_UI import string webserver.content_send("
 Fabrics 

") - webserver.content_send("

Existing fabrics:

") + webserver.content_send("

Associated fabrics:

") if size(self.device.sessions.sessions) == 0 webserver.content_send("

None

") @@ -233,11 +234,27 @@ class Matter_UI # display one line per plug-in var endpoints = self.device.k2l_num(self.device.plugins_config) var i = 0 + + # special case for root node + if endpoints[0] == 0 + var ep = endpoints[i] + var conf = self.device.plugins_config[str(ep)] + var typ = conf.find('type') + + webserver.content_send(string.format("", i)) + webserver.content_send(string.format("")) + webserver.content_send(" ") + + i += 1 + end + while i < size(endpoints) var ep = endpoints[i] var conf = self.device.plugins_config[str(ep)] var typ = conf.find('type') - if !typ continue end + if !typ i += 1 continue end var arg_name = self.device.get_plugin_class_arg(typ) var arg = arg_name ? str(conf.find(arg_name, '')) : '' @@ -245,7 +262,7 @@ class Matter_UI webserver.content_send(string.format("", i, ep)) webserver.content_send(string.format("")) webserver.content_send(string.format("", i, webserver.html_escape(arg))) @@ -256,7 +273,7 @@ class Matter_UI # add an empty line for adding a configuration webserver.content_send(string.format("", i)) webserver.content_send(string.format("")) webserver.content_send(string.format("", i)) @@ -270,17 +287,20 @@ class Matter_UI #- ---------------------------------------------------------------------- -# #- Show all possible classes for plugin #- ---------------------------------------------------------------------- -# - def plugin_option(cur) + def plugin_option(cur, class_list) import webserver import string - var class_types = string.split(self._CLASSES_TYPES, '|') + var class_types = class_list ? string.split(class_list, '|') : [] var i = 0 - webserver.content_send("") while i < size(class_types) var typ = class_types[i] - var nam = self.device.get_plugin_class_displayname(typ) - webserver.content_send(string.format("", typ, (typ == cur) ? " selected" : "", nam)) + if typ == '' + webserver.content_send("") + else + var nam = self.device.get_plugin_class_displayname(typ) + webserver.content_send(string.format("", typ, (typ == cur) ? " selected" : "", nam)) + end i += 1 end end diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Device.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Device.h index d4d47b146..3c48befb9 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Device.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Device.h @@ -6,6 +6,150 @@ extern const bclass be_class_Matter_Device; +/******************************************************************** +** Solidified function: start +********************************************************************/ +be_local_closure(Matter_Device_start, /* name */ + be_nested_proto( + 6, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 1, /* has sup protos */ + ( &(const struct bproto*[ 1]) { + be_nested_proto( + 2, /* nstack */ + 0, /* argc */ + 0, /* varg */ + 1, /* has upvals */ + ( &(const bupvaldesc[ 1]) { /* upvals */ + be_local_const_upval(1, 0), + }), + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 1]) { /* constants */ + /* K0 */ be_nested_str_weak(_trigger_read_sensors), + }), + be_str_weak(_anonymous_), + &be_const_str_solidified, + ( &(const binstruction[ 4]) { /* code */ + 0x68000000, // 0000 GETUPV R0 U0 + 0x8C000100, // 0001 GETMET R0 R0 K0 + 0x7C000200, // 0002 CALL R0 1 + 0x80000000, // 0003 RET 0 + }) + ), + }), + 1, /* has constants */ + ( &(const bvalue[ 9]) { /* constants */ + /* K0 */ be_nested_str_weak(started), + /* K1 */ be_nested_str_weak(autoconf_device), + /* K2 */ be_nested_str_weak(tasmota), + /* K3 */ be_nested_str_weak(add_cron), + /* K4 */ be_nested_str_weak(_X2A_X2F30_X20_X2A_X20_X2A_X20_X2A_X20_X2A_X20_X2A), + /* K5 */ be_nested_str_weak(matter_sensors_30s), + /* K6 */ be_nested_str_weak(_start_udp), + /* K7 */ be_nested_str_weak(UDP_PORT), + /* K8 */ be_nested_str_weak(start_mdns_announce_hostnames), + }), + be_str_weak(start), + &be_const_str_solidified, + ( &(const binstruction[20]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x78060000, // 0001 JMPF R1 #0003 + 0x80000200, // 0002 RET 0 + 0x8C040101, // 0003 GETMET R1 R0 K1 + 0x7C040200, // 0004 CALL R1 1 + 0xB8060400, // 0005 GETNGBL R1 K2 + 0x8C040303, // 0006 GETMET R1 R1 K3 + 0x580C0004, // 0007 LDCONST R3 K4 + 0x84100000, // 0008 CLOSURE R4 P0 + 0x58140005, // 0009 LDCONST R5 K5 + 0x7C040800, // 000A CALL R1 4 + 0x8C040106, // 000B GETMET R1 R0 K6 + 0x880C0107, // 000C GETMBR R3 R0 K7 + 0x7C040400, // 000D CALL R1 2 + 0x8C040108, // 000E GETMET R1 R0 K8 + 0x7C040200, // 000F CALL R1 1 + 0x50040200, // 0010 LDBOOL R1 1 0 + 0x90020001, // 0011 SETMBR R0 K0 R1 + 0xA0000000, // 0012 CLOSE R0 + 0x80000000, // 0013 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: generate_random_passcode +********************************************************************/ +be_local_closure(Matter_Device_generate_random_passcode, /* name */ + be_nested_proto( + 7, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 8]) { /* constants */ + /* K0 */ be_nested_str_weak(crypto), + /* K1 */ be_nested_str_weak(random), + /* K2 */ be_nested_str_weak(get), + /* K3 */ be_const_int(0), + /* K4 */ be_const_int(134217727), + /* K5 */ be_const_int(99999998), + /* K6 */ be_nested_str_weak(PASSCODE_INVALID), + /* K7 */ be_nested_str_weak(stop_iteration), + }), + be_str_weak(generate_random_passcode), + &be_const_str_solidified, + ( &(const binstruction[35]) { /* code */ + 0xA4060000, // 0000 IMPORT R1 K0 + 0x4C080000, // 0001 LDNIL R2 + 0x500C0200, // 0002 LDBOOL R3 1 0 + 0x780E001D, // 0003 JMPF R3 #0022 + 0x8C0C0301, // 0004 GETMET R3 R1 K1 + 0x54160003, // 0005 LDINT R5 4 + 0x7C0C0400, // 0006 CALL R3 2 + 0x8C0C0702, // 0007 GETMET R3 R3 K2 + 0x58140003, // 0008 LDCONST R5 K3 + 0x541A0003, // 0009 LDINT R6 4 + 0x7C0C0600, // 000A CALL R3 3 + 0x2C0C0704, // 000B AND R3 R3 K4 + 0x5C080600, // 000C MOVE R2 R3 + 0x240C0505, // 000D GT R3 R2 K5 + 0x780E0000, // 000E JMPF R3 #0010 + 0x7001FFF1, // 000F JMP #0002 + 0x600C0010, // 0010 GETGBL R3 G16 + 0x88100106, // 0011 GETMBR R4 R0 K6 + 0x7C0C0200, // 0012 CALL R3 1 + 0xA8020005, // 0013 EXBLK 0 #001A + 0x5C100600, // 0014 MOVE R4 R3 + 0x7C100000, // 0015 CALL R4 0 + 0x1C140404, // 0016 EQ R5 R2 R4 + 0x78160000, // 0017 JMPF R5 #0019 + 0x4C080000, // 0018 LDNIL R2 + 0x7001FFF9, // 0019 JMP #0014 + 0x580C0007, // 001A LDCONST R3 K7 + 0xAC0C0200, // 001B CATCH R3 1 0 + 0xB0080000, // 001C RAISE 2 R0 R0 + 0x4C0C0000, // 001D LDNIL R3 + 0x200C0403, // 001E NE R3 R2 R3 + 0x780E0000, // 001F JMPF R3 #0021 + 0x80040400, // 0020 RET 1 R2 + 0x7001FFDF, // 0021 JMP #0002 + 0x80000000, // 0022 RET 0 + }) + ) +); +/*******************************************************************/ + + /******************************************************************** ** Solidified function: save_param ********************************************************************/ @@ -121,6 +265,545 @@ be_local_closure(Matter_Device_save_param, /* name */ /*******************************************************************/ +/******************************************************************** +** Solidified function: remove_fabric +********************************************************************/ +be_local_closure(Matter_Device_remove_fabric, /* name */ + be_nested_proto( + 9, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[12]) { /* constants */ + /* K0 */ be_nested_str_weak(sessions), + /* K1 */ be_nested_str_weak(find_children_fabrics), + /* K2 */ be_nested_str_weak(get_fabric_index), + /* K3 */ be_nested_str_weak(find_fabric_by_index), + /* K4 */ be_nested_str_weak(message_handler), + /* K5 */ be_nested_str_weak(im), + /* K6 */ be_nested_str_weak(subs_shop), + /* K7 */ be_nested_str_weak(remove_by_fabric), + /* K8 */ be_nested_str_weak(mdns_remove_op_discovery), + /* K9 */ be_nested_str_weak(remove_fabric), + /* K10 */ be_nested_str_weak(stop_iteration), + /* K11 */ be_nested_str_weak(save_fabrics), + }), + be_str_weak(remove_fabric), + &be_const_str_solidified, + ( &(const binstruction[43]) { /* code */ + 0x88080100, // 0000 GETMBR R2 R0 K0 + 0x8C080501, // 0001 GETMET R2 R2 K1 + 0x8C100302, // 0002 GETMET R4 R1 K2 + 0x7C100200, // 0003 CALL R4 1 + 0x7C080400, // 0004 CALL R2 2 + 0x4C0C0000, // 0005 LDNIL R3 + 0x1C0C0403, // 0006 EQ R3 R2 R3 + 0x780E0000, // 0007 JMPF R3 #0009 + 0x80000600, // 0008 RET 0 + 0x600C0010, // 0009 GETGBL R3 G16 + 0x5C100400, // 000A MOVE R4 R2 + 0x7C0C0200, // 000B CALL R3 1 + 0xA8020016, // 000C EXBLK 0 #0024 + 0x5C100600, // 000D MOVE R4 R3 + 0x7C100000, // 000E CALL R4 0 + 0x88140100, // 000F GETMBR R5 R0 K0 + 0x8C140B03, // 0010 GETMET R5 R5 K3 + 0x5C1C0800, // 0011 MOVE R7 R4 + 0x7C140400, // 0012 CALL R5 2 + 0x4C180000, // 0013 LDNIL R6 + 0x20180A06, // 0014 NE R6 R5 R6 + 0x781A000C, // 0015 JMPF R6 #0023 + 0x88180104, // 0016 GETMBR R6 R0 K4 + 0x88180D05, // 0017 GETMBR R6 R6 K5 + 0x88180D06, // 0018 GETMBR R6 R6 K6 + 0x8C180D07, // 0019 GETMET R6 R6 K7 + 0x5C200A00, // 001A MOVE R8 R5 + 0x7C180400, // 001B CALL R6 2 + 0x8C180108, // 001C GETMET R6 R0 K8 + 0x5C200A00, // 001D MOVE R8 R5 + 0x7C180400, // 001E CALL R6 2 + 0x88180100, // 001F GETMBR R6 R0 K0 + 0x8C180D09, // 0020 GETMET R6 R6 K9 + 0x5C200A00, // 0021 MOVE R8 R5 + 0x7C180400, // 0022 CALL R6 2 + 0x7001FFE8, // 0023 JMP #000D + 0x580C000A, // 0024 LDCONST R3 K10 + 0xAC0C0200, // 0025 CATCH R3 1 0 + 0xB0080000, // 0026 RAISE 2 R0 R0 + 0x880C0100, // 0027 GETMBR R3 R0 K0 + 0x8C0C070B, // 0028 GETMET R3 R3 K11 + 0x7C0C0200, // 0029 CALL R3 1 + 0x80000000, // 002A RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: _start_udp +********************************************************************/ +be_local_closure(Matter_Device__start_udp, /* name */ + be_nested_proto( + 6, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 1, /* has sup protos */ + ( &(const struct bproto*[ 1]) { + be_nested_proto( + 8, /* nstack */ + 3, /* argc */ + 0, /* varg */ + 1, /* has upvals */ + ( &(const bupvaldesc[ 1]) { /* upvals */ + be_local_const_upval(1, 0), + }), + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 1]) { /* constants */ + /* K0 */ be_nested_str_weak(msg_received), + }), + be_str_weak(_X3Clambda_X3E), + &be_const_str_solidified, + ( &(const binstruction[ 7]) { /* code */ + 0x680C0000, // 0000 GETUPV R3 U0 + 0x8C0C0700, // 0001 GETMET R3 R3 K0 + 0x5C140000, // 0002 MOVE R5 R0 + 0x5C180200, // 0003 MOVE R6 R1 + 0x5C1C0400, // 0004 MOVE R7 R2 + 0x7C0C0800, // 0005 CALL R3 4 + 0x80040600, // 0006 RET 1 R3 + }) + ), + }), + 1, /* has constants */ + ( &(const bvalue[ 9]) { /* constants */ + /* K0 */ be_nested_str_weak(udp_server), + /* K1 */ be_nested_str_weak(tasmota), + /* K2 */ be_nested_str_weak(log), + /* K3 */ be_nested_str_weak(MTR_X3A_X20starting_X20UDP_X20server_X20on_X20port_X3A_X20), + /* K4 */ be_const_int(2), + /* K5 */ be_nested_str_weak(matter), + /* K6 */ be_nested_str_weak(UDPServer), + /* K7 */ be_nested_str_weak(), + /* K8 */ be_nested_str_weak(start), + }), + be_str_weak(_start_udp), + &be_const_str_solidified, + ( &(const binstruction[27]) { /* code */ + 0x88080100, // 0000 GETMBR R2 R0 K0 + 0x780A0000, // 0001 JMPF R2 #0003 + 0x80000400, // 0002 RET 0 + 0x4C080000, // 0003 LDNIL R2 + 0x1C080202, // 0004 EQ R2 R1 R2 + 0x780A0000, // 0005 JMPF R2 #0007 + 0x540615A3, // 0006 LDINT R1 5540 + 0xB80A0200, // 0007 GETNGBL R2 K1 + 0x8C080502, // 0008 GETMET R2 R2 K2 + 0x60100008, // 0009 GETGBL R4 G8 + 0x5C140200, // 000A MOVE R5 R1 + 0x7C100200, // 000B CALL R4 1 + 0x00120604, // 000C ADD R4 K3 R4 + 0x58140004, // 000D LDCONST R5 K4 + 0x7C080600, // 000E CALL R2 3 + 0xB80A0A00, // 000F GETNGBL R2 K5 + 0x8C080506, // 0010 GETMET R2 R2 K6 + 0x58100007, // 0011 LDCONST R4 K7 + 0x5C140200, // 0012 MOVE R5 R1 + 0x7C080600, // 0013 CALL R2 3 + 0x90020002, // 0014 SETMBR R0 K0 R2 + 0x88080100, // 0015 GETMBR R2 R0 K0 + 0x8C080508, // 0016 GETMET R2 R2 K8 + 0x84100000, // 0017 CLOSURE R4 P0 + 0x7C080400, // 0018 CALL R2 2 + 0xA0000000, // 0019 CLOSE R0 + 0x80000000, // 001A RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: every_50ms +********************************************************************/ +be_local_closure(Matter_Device_every_50ms, /* name */ + be_nested_proto( + 2, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 2]) { /* constants */ + /* K0 */ be_nested_str_weak(tick), + /* K1 */ be_const_int(1), + }), + be_str_weak(every_50ms), + &be_const_str_solidified, + ( &(const binstruction[ 4]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x00040301, // 0001 ADD R1 R1 K1 + 0x90020001, // 0002 SETMBR R0 K0 R1 + 0x80000000, // 0003 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: stop +********************************************************************/ +be_local_closure(Matter_Device_stop, /* name */ + be_nested_proto( + 4, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 4]) { /* constants */ + /* K0 */ be_nested_str_weak(tasmota), + /* K1 */ be_nested_str_weak(remove_driver), + /* K2 */ be_nested_str_weak(udp_server), + /* K3 */ be_nested_str_weak(stop), + }), + be_str_weak(stop), + &be_const_str_solidified, + ( &(const binstruction[10]) { /* code */ + 0xB8060000, // 0000 GETNGBL R1 K0 + 0x8C040301, // 0001 GETMET R1 R1 K1 + 0x5C0C0000, // 0002 MOVE R3 R0 + 0x7C040400, // 0003 CALL R1 2 + 0x88040102, // 0004 GETMBR R1 R0 K2 + 0x78060002, // 0005 JMPF R1 #0009 + 0x88040102, // 0006 GETMBR R1 R0 K2 + 0x8C040303, // 0007 GETMET R1 R1 K3 + 0x7C040200, // 0008 CALL R1 1 + 0x80000000, // 0009 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: start_commissioning_complete +********************************************************************/ +be_local_closure(Matter_Device_start_commissioning_complete, /* name */ + be_nested_proto( + 6, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 5]) { /* constants */ + /* K0 */ be_nested_str_weak(tasmota), + /* K1 */ be_nested_str_weak(log), + /* K2 */ be_nested_str_weak(MTR_X3A_X20_X2A_X2A_X2A_X20Commissioning_X20complete_X20_X2A_X2A_X2A), + /* K3 */ be_const_int(2), + /* K4 */ be_nested_str_weak(stop_basic_commissioning), + }), + be_str_weak(start_commissioning_complete), + &be_const_str_solidified, + ( &(const binstruction[ 8]) { /* code */ + 0xB80A0000, // 0000 GETNGBL R2 K0 + 0x8C080501, // 0001 GETMET R2 R2 K1 + 0x58100002, // 0002 LDCONST R4 K2 + 0x58140003, // 0003 LDCONST R5 K3 + 0x7C080600, // 0004 CALL R2 3 + 0x8C080104, // 0005 GETMET R2 R0 K4 + 0x7C080200, // 0006 CALL R2 1 + 0x80000000, // 0007 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: register_commands +********************************************************************/ +be_local_closure(Matter_Device_register_commands, /* name */ + be_nested_proto( + 5, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 1, /* has sup protos */ + ( &(const struct bproto*[ 1]) { + be_nested_proto( + 10, /* nstack */ + 4, /* argc */ + 0, /* varg */ + 1, /* has upvals */ + ( &(const bupvaldesc[ 1]) { /* upvals */ + be_local_const_upval(1, 0), + }), + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 1]) { /* constants */ + /* K0 */ be_nested_str_weak(MtrJoin), + }), + be_str_weak(_X3Clambda_X3E), + &be_const_str_solidified, + ( &(const binstruction[ 8]) { /* code */ + 0x68100000, // 0000 GETUPV R4 U0 + 0x8C100900, // 0001 GETMET R4 R4 K0 + 0x5C180000, // 0002 MOVE R6 R0 + 0x5C1C0200, // 0003 MOVE R7 R1 + 0x5C200400, // 0004 MOVE R8 R2 + 0x5C240600, // 0005 MOVE R9 R3 + 0x7C100A00, // 0006 CALL R4 5 + 0x80040800, // 0007 RET 1 R4 + }) + ), + }), + 1, /* has constants */ + ( &(const bvalue[ 3]) { /* constants */ + /* K0 */ be_nested_str_weak(tasmota), + /* K1 */ be_nested_str_weak(add_cmd), + /* K2 */ be_nested_str_weak(MtrJoin), + }), + be_str_weak(register_commands), + &be_const_str_solidified, + ( &(const binstruction[ 7]) { /* code */ + 0xB8060000, // 0000 GETNGBL R1 K0 + 0x8C040301, // 0001 GETMET R1 R1 K1 + 0x580C0002, // 0002 LDCONST R3 K2 + 0x84100000, // 0003 CLOSURE R4 P0 + 0x7C040600, // 0004 CALL R1 3 + 0xA0000000, // 0005 CLOSE R0 + 0x80000000, // 0006 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: start_operational_discovery_deferred +********************************************************************/ +be_local_closure(Matter_Device_start_operational_discovery_deferred, /* name */ + be_nested_proto( + 6, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 1, /* has sup protos */ + ( &(const struct bproto*[ 1]) { + be_nested_proto( + 3, /* nstack */ + 0, /* argc */ + 0, /* varg */ + 1, /* has upvals */ + ( &(const bupvaldesc[ 2]) { /* upvals */ + be_local_const_upval(1, 0), + be_local_const_upval(1, 1), + }), + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 1]) { /* constants */ + /* K0 */ be_nested_str_weak(start_operational_discovery), + }), + be_str_weak(_X3Clambda_X3E), + &be_const_str_solidified, + ( &(const binstruction[ 5]) { /* code */ + 0x68000000, // 0000 GETUPV R0 U0 + 0x8C000100, // 0001 GETMET R0 R0 K0 + 0x68080001, // 0002 GETUPV R2 U1 + 0x7C000400, // 0003 CALL R0 2 + 0x80040000, // 0004 RET 1 R0 + }) + ), + }), + 1, /* has constants */ + ( &(const bvalue[ 3]) { /* constants */ + /* K0 */ be_nested_str_weak(tasmota), + /* K1 */ be_nested_str_weak(set_timer), + /* K2 */ be_const_int(0), + }), + be_str_weak(start_operational_discovery_deferred), + &be_const_str_solidified, + ( &(const binstruction[ 7]) { /* code */ + 0xB80A0000, // 0000 GETNGBL R2 K0 + 0x8C080501, // 0001 GETMET R2 R2 K1 + 0x58100002, // 0002 LDCONST R4 K2 + 0x84140000, // 0003 CLOSURE R5 P0 + 0x7C080600, // 0004 CALL R2 3 + 0xA0000000, // 0005 CLOSE R0 + 0x80000000, // 0006 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: register_native_classes +********************************************************************/ +be_local_closure(Matter_Device_register_native_classes, /* name */ + be_nested_proto( + 12, /* nstack */ + 3, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[17]) { /* constants */ + /* K0 */ be_nested_str_weak(introspect), + /* K1 */ be_nested_str_weak(string), + /* K2 */ be_nested_str_weak(members), + /* K3 */ be_nested_str_weak(matter), + /* K4 */ be_nested_str_weak(get), + /* K5 */ be_nested_str_weak(class), + /* K6 */ be_nested_str_weak(find), + /* K7 */ be_nested_str_weak(Plugin_), + /* K8 */ be_const_int(0), + /* K9 */ be_nested_str_weak(register_plugin_class), + /* K10 */ be_nested_str_weak(stop_iteration), + /* K11 */ be_nested_str_weak(tasmota), + /* K12 */ be_nested_str_weak(log), + /* K13 */ be_nested_str_weak(MTR_X3A_X20registered_X20classes_X20), + /* K14 */ be_nested_str_weak(k2l), + /* K15 */ be_nested_str_weak(plugins_classes), + /* K16 */ be_const_int(3), + }), + be_str_weak(register_native_classes), + &be_const_str_solidified, + ( &(const binstruction[43]) { /* code */ + 0xA40E0000, // 0000 IMPORT R3 K0 + 0xA4120200, // 0001 IMPORT R4 K1 + 0x60140010, // 0002 GETGBL R5 G16 + 0x8C180702, // 0003 GETMET R6 R3 K2 + 0xB8220600, // 0004 GETNGBL R8 K3 + 0x7C180400, // 0005 CALL R6 2 + 0x7C140200, // 0006 CALL R5 1 + 0xA8020014, // 0007 EXBLK 0 #001D + 0x5C180A00, // 0008 MOVE R6 R5 + 0x7C180000, // 0009 CALL R6 0 + 0x8C1C0704, // 000A GETMET R7 R3 K4 + 0xB8260600, // 000B GETNGBL R9 K3 + 0x5C280C00, // 000C MOVE R10 R6 + 0x7C1C0600, // 000D CALL R7 3 + 0x60200004, // 000E GETGBL R8 G4 + 0x5C240E00, // 000F MOVE R9 R7 + 0x7C200200, // 0010 CALL R8 1 + 0x1C201105, // 0011 EQ R8 R8 K5 + 0x78220008, // 0012 JMPF R8 #001C + 0x8C200906, // 0013 GETMET R8 R4 K6 + 0x5C280C00, // 0014 MOVE R10 R6 + 0x582C0007, // 0015 LDCONST R11 K7 + 0x7C200600, // 0016 CALL R8 3 + 0x1C201108, // 0017 EQ R8 R8 K8 + 0x78220002, // 0018 JMPF R8 #001C + 0x8C200109, // 0019 GETMET R8 R0 K9 + 0x5C280E00, // 001A MOVE R10 R7 + 0x7C200400, // 001B CALL R8 2 + 0x7001FFEA, // 001C JMP #0008 + 0x5814000A, // 001D LDCONST R5 K10 + 0xAC140200, // 001E CATCH R5 1 0 + 0xB0080000, // 001F RAISE 2 R0 R0 + 0xB8161600, // 0020 GETNGBL R5 K11 + 0x8C140B0C, // 0021 GETMET R5 R5 K12 + 0x601C0008, // 0022 GETGBL R7 G8 + 0x8C20010E, // 0023 GETMET R8 R0 K14 + 0x8828010F, // 0024 GETMBR R10 R0 K15 + 0x7C200400, // 0025 CALL R8 2 + 0x7C1C0200, // 0026 CALL R7 1 + 0x001E1A07, // 0027 ADD R7 K13 R7 + 0x58200010, // 0028 LDCONST R8 K16 + 0x7C140600, // 0029 CALL R5 3 + 0x80000000, // 002A RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: stop_basic_commissioning +********************************************************************/ +be_local_closure(Matter_Device_stop_basic_commissioning, /* name */ + be_nested_proto( + 5, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[13]) { /* constants */ + /* K0 */ be_nested_str_weak(is_root_commissioning_open), + /* K1 */ be_nested_str_weak(tasmota), + /* K2 */ be_nested_str_weak(publish_result), + /* K3 */ be_nested_str_weak(_X7B_X22Matter_X22_X3A_X7B_X22Commissioning_X22_X3A0_X7D_X7D), + /* K4 */ be_nested_str_weak(Matter), + /* K5 */ be_nested_str_weak(commissioning_open), + /* K6 */ be_nested_str_weak(mdns_remove_PASE), + /* K7 */ be_nested_str_weak(commissioning_iterations), + /* K8 */ be_nested_str_weak(commissioning_discriminator), + /* K9 */ be_nested_str_weak(commissioning_salt), + /* K10 */ be_nested_str_weak(commissioning_w0), + /* K11 */ be_nested_str_weak(commissioning_L), + /* K12 */ be_nested_str_weak(commissioning_admin_fabric), + }), + be_str_weak(stop_basic_commissioning), + &be_const_str_solidified, + ( &(const binstruction[25]) { /* code */ + 0x8C040100, // 0000 GETMET R1 R0 K0 + 0x7C040200, // 0001 CALL R1 1 + 0x78060004, // 0002 JMPF R1 #0008 + 0xB8060200, // 0003 GETNGBL R1 K1 + 0x8C040302, // 0004 GETMET R1 R1 K2 + 0x580C0003, // 0005 LDCONST R3 K3 + 0x58100004, // 0006 LDCONST R4 K4 + 0x7C040600, // 0007 CALL R1 3 + 0x4C040000, // 0008 LDNIL R1 + 0x90020A01, // 0009 SETMBR R0 K5 R1 + 0x8C040106, // 000A GETMET R1 R0 K6 + 0x7C040200, // 000B CALL R1 1 + 0x4C040000, // 000C LDNIL R1 + 0x90020E01, // 000D SETMBR R0 K7 R1 + 0x4C040000, // 000E LDNIL R1 + 0x90021001, // 000F SETMBR R0 K8 R1 + 0x4C040000, // 0010 LDNIL R1 + 0x90021201, // 0011 SETMBR R0 K9 R1 + 0x4C040000, // 0012 LDNIL R1 + 0x90021401, // 0013 SETMBR R0 K10 R1 + 0x4C040000, // 0014 LDNIL R1 + 0x90021601, // 0015 SETMBR R0 K11 R1 + 0x4C040000, // 0016 LDNIL R1 + 0x90021801, // 0017 SETMBR R0 K12 R1 + 0x80000000, // 0018 RET 0 + }) + ) +); +/*******************************************************************/ + + /******************************************************************** ** Solidified function: _trigger_read_sensors ********************************************************************/ @@ -194,239 +877,9 @@ be_local_closure(Matter_Device__trigger_read_sensors, /* name */ /******************************************************************** -** Solidified function: register_plugin_class +** Solidified function: _init_basic_commissioning ********************************************************************/ -be_local_closure(Matter_Device_register_plugin_class, /* name */ - be_nested_proto( - 4, /* nstack */ - 3, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 1]) { /* constants */ - /* K0 */ be_nested_str_weak(plugins_classes), - }), - be_str_weak(register_plugin_class), - &be_const_str_solidified, - ( &(const binstruction[ 3]) { /* code */ - 0x880C0100, // 0000 GETMBR R3 R0 K0 - 0x980C0202, // 0001 SETIDX R3 R1 R2 - 0x80000000, // 0002 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: autoconf_device -********************************************************************/ -be_local_closure(Matter_Device_autoconf_device, /* name */ - be_nested_proto( - 7, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[15]) { /* constants */ - /* K0 */ be_nested_str_weak(string), - /* K1 */ be_nested_str_weak(json), - /* K2 */ be_nested_str_weak(plugins), - /* K3 */ be_const_int(0), - /* K4 */ be_nested_str_weak(plugins_config), - /* K5 */ be_nested_str_weak(autoconf_device_map), - /* K6 */ be_nested_str_weak(tasmota), - /* K7 */ be_nested_str_weak(log), - /* K8 */ be_nested_str_weak(MTR_X3A_X20autoconfig_X20_X3D_X20), - /* K9 */ be_const_int(3), - /* K10 */ be_nested_str_weak(_load_plugins_config), - /* K11 */ be_nested_str_weak(plugins_persist), - /* K12 */ be_nested_str_weak(sessions), - /* K13 */ be_nested_str_weak(count_active_fabrics), - /* K14 */ be_nested_str_weak(save_param), - }), - be_str_weak(autoconf_device), - &be_const_str_solidified, - ( &(const binstruction[34]) { /* code */ - 0xA4060000, // 0000 IMPORT R1 K0 - 0xA40A0200, // 0001 IMPORT R2 K1 - 0x600C000C, // 0002 GETGBL R3 G12 - 0x88100102, // 0003 GETMBR R4 R0 K2 - 0x7C0C0200, // 0004 CALL R3 1 - 0x240C0703, // 0005 GT R3 R3 K3 - 0x780E0000, // 0006 JMPF R3 #0008 - 0x80000600, // 0007 RET 0 - 0x8C0C0105, // 0008 GETMET R3 R0 K5 - 0x7C0C0200, // 0009 CALL R3 1 - 0x90020803, // 000A SETMBR R0 K4 R3 - 0xB80E0C00, // 000B GETNGBL R3 K6 - 0x8C0C0707, // 000C GETMET R3 R3 K7 - 0x60140008, // 000D GETGBL R5 G8 - 0x88180104, // 000E GETMBR R6 R0 K4 - 0x7C140200, // 000F CALL R5 1 - 0x00161005, // 0010 ADD R5 K8 R5 - 0x58180009, // 0011 LDCONST R6 K9 - 0x7C0C0600, // 0012 CALL R3 3 - 0x8C0C010A, // 0013 GETMET R3 R0 K10 - 0x88140104, // 0014 GETMBR R5 R0 K4 - 0x7C0C0400, // 0015 CALL R3 2 - 0x880C010B, // 0016 GETMBR R3 R0 K11 - 0x740E0008, // 0017 JMPT R3 #0021 - 0x880C010C, // 0018 GETMBR R3 R0 K12 - 0x8C0C070D, // 0019 GETMET R3 R3 K13 - 0x7C0C0200, // 001A CALL R3 1 - 0x240C0703, // 001B GT R3 R3 K3 - 0x780E0003, // 001C JMPF R3 #0021 - 0x500C0200, // 001D LDBOOL R3 1 0 - 0x90021603, // 001E SETMBR R0 K11 R3 - 0x8C0C010E, // 001F GETMET R3 R0 K14 - 0x7C0C0200, // 0020 CALL R3 1 - 0x80000000, // 0021 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: generate_random_passcode -********************************************************************/ -be_local_closure(Matter_Device_generate_random_passcode, /* name */ - be_nested_proto( - 7, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 8]) { /* constants */ - /* K0 */ be_nested_str_weak(crypto), - /* K1 */ be_nested_str_weak(random), - /* K2 */ be_nested_str_weak(get), - /* K3 */ be_const_int(0), - /* K4 */ be_const_int(134217727), - /* K5 */ be_const_int(99999998), - /* K6 */ be_nested_str_weak(PASSCODE_INVALID), - /* K7 */ be_nested_str_weak(stop_iteration), - }), - be_str_weak(generate_random_passcode), - &be_const_str_solidified, - ( &(const binstruction[35]) { /* code */ - 0xA4060000, // 0000 IMPORT R1 K0 - 0x4C080000, // 0001 LDNIL R2 - 0x500C0200, // 0002 LDBOOL R3 1 0 - 0x780E001D, // 0003 JMPF R3 #0022 - 0x8C0C0301, // 0004 GETMET R3 R1 K1 - 0x54160003, // 0005 LDINT R5 4 - 0x7C0C0400, // 0006 CALL R3 2 - 0x8C0C0702, // 0007 GETMET R3 R3 K2 - 0x58140003, // 0008 LDCONST R5 K3 - 0x541A0003, // 0009 LDINT R6 4 - 0x7C0C0600, // 000A CALL R3 3 - 0x2C0C0704, // 000B AND R3 R3 K4 - 0x5C080600, // 000C MOVE R2 R3 - 0x240C0505, // 000D GT R3 R2 K5 - 0x780E0000, // 000E JMPF R3 #0010 - 0x7001FFF1, // 000F JMP #0002 - 0x600C0010, // 0010 GETGBL R3 G16 - 0x88100106, // 0011 GETMBR R4 R0 K6 - 0x7C0C0200, // 0012 CALL R3 1 - 0xA8020005, // 0013 EXBLK 0 #001A - 0x5C100600, // 0014 MOVE R4 R3 - 0x7C100000, // 0015 CALL R4 0 - 0x1C140404, // 0016 EQ R5 R2 R4 - 0x78160000, // 0017 JMPF R5 #0019 - 0x4C080000, // 0018 LDNIL R2 - 0x7001FFF9, // 0019 JMP #0014 - 0x580C0007, // 001A LDCONST R3 K7 - 0xAC0C0200, // 001B CATCH R3 1 0 - 0xB0080000, // 001C RAISE 2 R0 R0 - 0x4C0C0000, // 001D LDNIL R3 - 0x200C0403, // 001E NE R3 R2 R3 - 0x780E0000, // 001F JMPF R3 #0021 - 0x80040400, // 0020 RET 1 R2 - 0x7001FFDF, // 0021 JMP #0002 - 0x80000000, // 0022 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: register_commands -********************************************************************/ -be_local_closure(Matter_Device_register_commands, /* name */ - be_nested_proto( - 5, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 1, /* has sup protos */ - ( &(const struct bproto*[ 1]) { - be_nested_proto( - 10, /* nstack */ - 4, /* argc */ - 0, /* varg */ - 1, /* has upvals */ - ( &(const bupvaldesc[ 1]) { /* upvals */ - be_local_const_upval(1, 0), - }), - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 1]) { /* constants */ - /* K0 */ be_nested_str_weak(MtrJoin), - }), - be_str_weak(_X3Clambda_X3E), - &be_const_str_solidified, - ( &(const binstruction[ 8]) { /* code */ - 0x68100000, // 0000 GETUPV R4 U0 - 0x8C100900, // 0001 GETMET R4 R4 K0 - 0x5C180000, // 0002 MOVE R6 R0 - 0x5C1C0200, // 0003 MOVE R7 R1 - 0x5C200400, // 0004 MOVE R8 R2 - 0x5C240600, // 0005 MOVE R9 R3 - 0x7C100A00, // 0006 CALL R4 5 - 0x80040800, // 0007 RET 1 R4 - }) - ), - }), - 1, /* has constants */ - ( &(const bvalue[ 3]) { /* constants */ - /* K0 */ be_nested_str_weak(tasmota), - /* K1 */ be_nested_str_weak(add_cmd), - /* K2 */ be_nested_str_weak(MtrJoin), - }), - be_str_weak(register_commands), - &be_const_str_solidified, - ( &(const binstruction[ 7]) { /* code */ - 0xB8060000, // 0000 GETNGBL R1 K0 - 0x8C040301, // 0001 GETMET R1 R1 K1 - 0x580C0002, // 0002 LDCONST R3 K2 - 0x84100000, // 0003 CLOSURE R4 P0 - 0x7C040600, // 0004 CALL R1 3 - 0xA0000000, // 0005 CLOSE R0 - 0x80000000, // 0006 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: is_commissioning_open -********************************************************************/ -be_local_closure(Matter_Device_is_commissioning_open, /* name */ +be_local_closure(Matter_Device__init_basic_commissioning, /* name */ be_nested_proto( 3, /* nstack */ 1, /* argc */ @@ -436,207 +889,23 @@ be_local_closure(Matter_Device_is_commissioning_open, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[ 1]) { /* constants */ - /* K0 */ be_nested_str_weak(commissioning_open), - }), - be_str_weak(is_commissioning_open), - &be_const_str_solidified, - ( &(const binstruction[ 4]) { /* code */ - 0x88040100, // 0000 GETMBR R1 R0 K0 - 0x4C080000, // 0001 LDNIL R2 - 0x20040202, // 0002 NE R1 R1 R2 - 0x80040200, // 0003 RET 1 R1 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: k2l -********************************************************************/ -be_local_closure(Matter_Device_k2l, /* name */ - be_nested_proto( - 8, /* nstack */ - 1, /* argc */ - 4, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 6]) { /* constants */ - /* K0 */ be_const_class(be_class_Matter_Device), - /* K1 */ be_nested_str_weak(keys), - /* K2 */ be_nested_str_weak(push), - /* K3 */ be_nested_str_weak(stop_iteration), - /* K4 */ be_const_int(1), - /* K5 */ be_const_int(0), - }), - be_str_weak(k2l), - &be_const_str_solidified, - ( &(const binstruction[50]) { /* code */ - 0x58040000, // 0000 LDCONST R1 K0 - 0x60080012, // 0001 GETGBL R2 G18 - 0x7C080000, // 0002 CALL R2 0 - 0x4C0C0000, // 0003 LDNIL R3 - 0x1C0C0003, // 0004 EQ R3 R0 R3 - 0x780E0000, // 0005 JMPF R3 #0007 - 0x80040400, // 0006 RET 1 R2 - 0x600C0010, // 0007 GETGBL R3 G16 - 0x8C100101, // 0008 GETMET R4 R0 K1 - 0x7C100200, // 0009 CALL R4 1 - 0x7C0C0200, // 000A CALL R3 1 - 0xA8020005, // 000B EXBLK 0 #0012 - 0x5C100600, // 000C MOVE R4 R3 - 0x7C100000, // 000D CALL R4 0 - 0x8C140502, // 000E GETMET R5 R2 K2 - 0x5C1C0800, // 000F MOVE R7 R4 - 0x7C140400, // 0010 CALL R5 2 - 0x7001FFF9, // 0011 JMP #000C - 0x580C0003, // 0012 LDCONST R3 K3 - 0xAC0C0200, // 0013 CATCH R3 1 0 - 0xB0080000, // 0014 RAISE 2 R0 R0 - 0x600C0010, // 0015 GETGBL R3 G16 - 0x6010000C, // 0016 GETGBL R4 G12 - 0x5C140400, // 0017 MOVE R5 R2 - 0x7C100200, // 0018 CALL R4 1 - 0x04100904, // 0019 SUB R4 R4 K4 - 0x40120804, // 001A CONNECT R4 K4 R4 - 0x7C0C0200, // 001B CALL R3 1 - 0xA8020010, // 001C EXBLK 0 #002E - 0x5C100600, // 001D MOVE R4 R3 - 0x7C100000, // 001E CALL R4 0 - 0x94140404, // 001F GETIDX R5 R2 R4 - 0x5C180800, // 0020 MOVE R6 R4 - 0x241C0D05, // 0021 GT R7 R6 K5 - 0x781E0008, // 0022 JMPF R7 #002C - 0x041C0D04, // 0023 SUB R7 R6 K4 - 0x941C0407, // 0024 GETIDX R7 R2 R7 - 0x241C0E05, // 0025 GT R7 R7 R5 - 0x781E0004, // 0026 JMPF R7 #002C - 0x041C0D04, // 0027 SUB R7 R6 K4 - 0x941C0407, // 0028 GETIDX R7 R2 R7 - 0x98080C07, // 0029 SETIDX R2 R6 R7 - 0x04180D04, // 002A SUB R6 R6 K4 - 0x7001FFF4, // 002B JMP #0021 - 0x98080C05, // 002C SETIDX R2 R6 R5 - 0x7001FFEE, // 002D JMP #001D - 0x580C0003, // 002E LDCONST R3 K3 - 0xAC0C0200, // 002F CATCH R3 1 0 - 0xB0080000, // 0030 RAISE 2 R0 R0 - 0x80040400, // 0031 RET 1 R2 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: start_operational_discovery_deferred -********************************************************************/ -be_local_closure(Matter_Device_start_operational_discovery_deferred, /* name */ - be_nested_proto( - 6, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 1, /* has sup protos */ - ( &(const struct bproto*[ 1]) { - be_nested_proto( - 3, /* nstack */ - 0, /* argc */ - 0, /* varg */ - 1, /* has upvals */ - ( &(const bupvaldesc[ 2]) { /* upvals */ - be_local_const_upval(1, 0), - be_local_const_upval(1, 1), - }), - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 1]) { /* constants */ - /* K0 */ be_nested_str_weak(start_operational_discovery), - }), - be_str_weak(_X3Clambda_X3E), - &be_const_str_solidified, - ( &(const binstruction[ 5]) { /* code */ - 0x68000000, // 0000 GETUPV R0 U0 - 0x8C000100, // 0001 GETMET R0 R0 K0 - 0x68080001, // 0002 GETUPV R2 U1 - 0x7C000400, // 0003 CALL R0 2 - 0x80040000, // 0004 RET 1 R0 - }) - ), - }), - 1, /* has constants */ - ( &(const bvalue[ 3]) { /* constants */ - /* K0 */ be_nested_str_weak(tasmota), - /* K1 */ be_nested_str_weak(set_timer), + ( &(const bvalue[ 4]) { /* constants */ + /* K0 */ be_nested_str_weak(sessions), + /* K1 */ be_nested_str_weak(count_active_fabrics), /* K2 */ be_const_int(0), + /* K3 */ be_nested_str_weak(start_root_basic_commissioning), }), - be_str_weak(start_operational_discovery_deferred), + be_str_weak(_init_basic_commissioning), &be_const_str_solidified, - ( &(const binstruction[ 7]) { /* code */ - 0xB80A0000, // 0000 GETNGBL R2 K0 - 0x8C080501, // 0001 GETMET R2 R2 K1 - 0x58100002, // 0002 LDCONST R4 K2 - 0x84140000, // 0003 CLOSURE R5 P0 - 0x7C080600, // 0004 CALL R2 3 - 0xA0000000, // 0005 CLOSE R0 - 0x80000000, // 0006 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: attribute_updated -********************************************************************/ -be_local_closure(Matter_Device_attribute_updated, /* name */ - be_nested_proto( - 10, /* nstack */ - 5, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 9]) { /* constants */ - /* K0 */ be_nested_str_weak(matter), - /* K1 */ be_nested_str_weak(Path), - /* K2 */ be_nested_str_weak(endpoint), - /* K3 */ be_nested_str_weak(cluster), - /* K4 */ be_nested_str_weak(attribute), - /* K5 */ be_nested_str_weak(message_handler), - /* K6 */ be_nested_str_weak(im), - /* K7 */ be_nested_str_weak(subs_shop), - /* K8 */ be_nested_str_weak(attribute_updated_ctx), - }), - be_str_weak(attribute_updated), - &be_const_str_solidified, - ( &(const binstruction[18]) { /* code */ - 0x4C140000, // 0000 LDNIL R5 - 0x1C140805, // 0001 EQ R5 R4 R5 - 0x78160000, // 0002 JMPF R5 #0004 - 0x50100000, // 0003 LDBOOL R4 0 0 - 0xB8160000, // 0004 GETNGBL R5 K0 - 0x8C140B01, // 0005 GETMET R5 R5 K1 - 0x7C140200, // 0006 CALL R5 1 - 0x90160401, // 0007 SETMBR R5 K2 R1 - 0x90160602, // 0008 SETMBR R5 K3 R2 - 0x90160803, // 0009 SETMBR R5 K4 R3 - 0x88180105, // 000A GETMBR R6 R0 K5 - 0x88180D06, // 000B GETMBR R6 R6 K6 - 0x88180D07, // 000C GETMBR R6 R6 K7 - 0x8C180D08, // 000D GETMET R6 R6 K8 - 0x5C200A00, // 000E MOVE R8 R5 - 0x5C240800, // 000F MOVE R9 R4 - 0x7C180600, // 0010 CALL R6 3 - 0x80000000, // 0011 RET 0 + ( &(const binstruction[ 8]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x8C040301, // 0001 GETMET R1 R1 K1 + 0x7C040200, // 0002 CALL R1 1 + 0x1C040302, // 0003 EQ R1 R1 K2 + 0x78060001, // 0004 JMPF R1 #0007 + 0x8C040103, // 0005 GETMET R1 R0 K3 + 0x7C040200, // 0006 CALL R1 1 + 0x80000000, // 0007 RET 0 }) ) ); @@ -719,6 +988,212 @@ be_local_closure(Matter_Device_compute_qrcode_content, /* name */ /*******************************************************************/ +/******************************************************************** +** Solidified function: get_active_endpoints +********************************************************************/ +be_local_closure(Matter_Device_get_active_endpoints, /* name */ + be_nested_proto( + 9, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 6]) { /* constants */ + /* K0 */ be_nested_str_weak(plugins), + /* K1 */ be_nested_str_weak(get_endpoint), + /* K2 */ be_const_int(0), + /* K3 */ be_nested_str_weak(find), + /* K4 */ be_nested_str_weak(push), + /* K5 */ be_nested_str_weak(stop_iteration), + }), + be_str_weak(get_active_endpoints), + &be_const_str_solidified, + ( &(const binstruction[28]) { /* code */ + 0x60080012, // 0000 GETGBL R2 G18 + 0x7C080000, // 0001 CALL R2 0 + 0x600C0010, // 0002 GETGBL R3 G16 + 0x88100100, // 0003 GETMBR R4 R0 K0 + 0x7C0C0200, // 0004 CALL R3 1 + 0xA8020011, // 0005 EXBLK 0 #0018 + 0x5C100600, // 0006 MOVE R4 R3 + 0x7C100000, // 0007 CALL R4 0 + 0x8C140901, // 0008 GETMET R5 R4 K1 + 0x7C140200, // 0009 CALL R5 1 + 0x78060002, // 000A JMPF R1 #000E + 0x1C180B02, // 000B EQ R6 R5 K2 + 0x781A0000, // 000C JMPF R6 #000E + 0x7001FFF7, // 000D JMP #0006 + 0x8C180503, // 000E GETMET R6 R2 K3 + 0x5C200A00, // 000F MOVE R8 R5 + 0x7C180400, // 0010 CALL R6 2 + 0x4C1C0000, // 0011 LDNIL R7 + 0x1C180C07, // 0012 EQ R6 R6 R7 + 0x781A0002, // 0013 JMPF R6 #0017 + 0x8C180504, // 0014 GETMET R6 R2 K4 + 0x5C200A00, // 0015 MOVE R8 R5 + 0x7C180400, // 0016 CALL R6 2 + 0x7001FFED, // 0017 JMP #0006 + 0x580C0005, // 0018 LDCONST R3 K5 + 0xAC0C0200, // 0019 CATCH R3 1 0 + 0xB0080000, // 001A RAISE 2 R0 R0 + 0x80040400, // 001B RET 1 R2 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: attribute_updated +********************************************************************/ +be_local_closure(Matter_Device_attribute_updated, /* name */ + be_nested_proto( + 10, /* nstack */ + 5, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 9]) { /* constants */ + /* K0 */ be_nested_str_weak(matter), + /* K1 */ be_nested_str_weak(Path), + /* K2 */ be_nested_str_weak(endpoint), + /* K3 */ be_nested_str_weak(cluster), + /* K4 */ be_nested_str_weak(attribute), + /* K5 */ be_nested_str_weak(message_handler), + /* K6 */ be_nested_str_weak(im), + /* K7 */ be_nested_str_weak(subs_shop), + /* K8 */ be_nested_str_weak(attribute_updated_ctx), + }), + be_str_weak(attribute_updated), + &be_const_str_solidified, + ( &(const binstruction[18]) { /* code */ + 0x4C140000, // 0000 LDNIL R5 + 0x1C140805, // 0001 EQ R5 R4 R5 + 0x78160000, // 0002 JMPF R5 #0004 + 0x50100000, // 0003 LDBOOL R4 0 0 + 0xB8160000, // 0004 GETNGBL R5 K0 + 0x8C140B01, // 0005 GETMET R5 R5 K1 + 0x7C140200, // 0006 CALL R5 1 + 0x90160401, // 0007 SETMBR R5 K2 R1 + 0x90160602, // 0008 SETMBR R5 K3 R2 + 0x90160803, // 0009 SETMBR R5 K4 R3 + 0x88180105, // 000A GETMBR R6 R0 K5 + 0x88180D06, // 000B GETMBR R6 R6 K6 + 0x88180D07, // 000C GETMBR R6 R6 K7 + 0x8C180D08, // 000D GETMET R6 R6 K8 + 0x5C200A00, // 000E MOVE R8 R5 + 0x5C240800, // 000F MOVE R9 R4 + 0x7C180600, // 0010 CALL R6 3 + 0x80000000, // 0011 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: invoke_request +********************************************************************/ +be_local_closure(Matter_Device_invoke_request, /* name */ + be_nested_proto( + 12, /* nstack */ + 4, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 8]) { /* constants */ + /* K0 */ be_const_int(0), + /* K1 */ be_nested_str_weak(endpoint), + /* K2 */ be_nested_str_weak(plugins), + /* K3 */ be_nested_str_weak(invoke_request), + /* K4 */ be_const_int(1), + /* K5 */ be_nested_str_weak(status), + /* K6 */ be_nested_str_weak(matter), + /* K7 */ be_nested_str_weak(UNSUPPORTED_ENDPOINT), + }), + be_str_weak(invoke_request), + &be_const_str_solidified, + ( &(const binstruction[24]) { /* code */ + 0x58100000, // 0000 LDCONST R4 K0 + 0x88140701, // 0001 GETMBR R5 R3 K1 + 0x6018000C, // 0002 GETGBL R6 G12 + 0x881C0102, // 0003 GETMBR R7 R0 K2 + 0x7C180200, // 0004 CALL R6 1 + 0x14180806, // 0005 LT R6 R4 R6 + 0x781A000C, // 0006 JMPF R6 #0014 + 0x88180102, // 0007 GETMBR R6 R0 K2 + 0x94180C04, // 0008 GETIDX R6 R6 R4 + 0x881C0D01, // 0009 GETMBR R7 R6 K1 + 0x1C1C0E05, // 000A EQ R7 R7 R5 + 0x781E0005, // 000B JMPF R7 #0012 + 0x8C1C0D03, // 000C GETMET R7 R6 K3 + 0x5C240200, // 000D MOVE R9 R1 + 0x5C280400, // 000E MOVE R10 R2 + 0x5C2C0600, // 000F MOVE R11 R3 + 0x7C1C0800, // 0010 CALL R7 4 + 0x80040E00, // 0011 RET 1 R7 + 0x00100904, // 0012 ADD R4 R4 K4 + 0x7001FFED, // 0013 JMP #0002 + 0xB81A0C00, // 0014 GETNGBL R6 K6 + 0x88180D07, // 0015 GETMBR R6 R6 K7 + 0x900E0A06, // 0016 SETMBR R3 K5 R6 + 0x80000000, // 0017 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: event_fabrics_saved +********************************************************************/ +be_local_closure(Matter_Device_event_fabrics_saved, /* name */ + be_nested_proto( + 3, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 5]) { /* constants */ + /* K0 */ be_nested_str_weak(sessions), + /* K1 */ be_nested_str_weak(count_active_fabrics), + /* K2 */ be_const_int(0), + /* K3 */ be_nested_str_weak(plugins_persist), + /* K4 */ be_nested_str_weak(save_param), + }), + be_str_weak(event_fabrics_saved), + &be_const_str_solidified, + ( &(const binstruction[12]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x8C040301, // 0001 GETMET R1 R1 K1 + 0x7C040200, // 0002 CALL R1 1 + 0x24040302, // 0003 GT R1 R1 K2 + 0x78060005, // 0004 JMPF R1 #000B + 0x88040103, // 0005 GETMBR R1 R0 K3 + 0x74060003, // 0006 JMPT R1 #000B + 0x50040200, // 0007 LDBOOL R1 1 0 + 0x90020601, // 0008 SETMBR R0 K3 R1 + 0x8C040104, // 0009 GETMET R1 R0 K4 + 0x7C040200, // 000A CALL R1 1 + 0x80000000, // 000B RET 0 + }) + ) +); +/*******************************************************************/ + + /******************************************************************** ** Solidified function: sort_distinct ********************************************************************/ @@ -801,6 +1276,88 @@ be_local_closure(Matter_Device_sort_distinct, /* name */ /*******************************************************************/ +/******************************************************************** +** Solidified function: k2l_num +********************************************************************/ +be_local_closure(Matter_Device_k2l_num, /* name */ + be_nested_proto( + 9, /* nstack */ + 1, /* argc */ + 4, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 6]) { /* constants */ + /* K0 */ be_const_class(be_class_Matter_Device), + /* K1 */ be_nested_str_weak(keys), + /* K2 */ be_nested_str_weak(push), + /* K3 */ be_nested_str_weak(stop_iteration), + /* K4 */ be_const_int(1), + /* K5 */ be_const_int(0), + }), + be_str_weak(k2l_num), + &be_const_str_solidified, + ( &(const binstruction[52]) { /* code */ + 0x58040000, // 0000 LDCONST R1 K0 + 0x60080012, // 0001 GETGBL R2 G18 + 0x7C080000, // 0002 CALL R2 0 + 0x4C0C0000, // 0003 LDNIL R3 + 0x1C0C0003, // 0004 EQ R3 R0 R3 + 0x780E0000, // 0005 JMPF R3 #0007 + 0x80040400, // 0006 RET 1 R2 + 0x600C0010, // 0007 GETGBL R3 G16 + 0x8C100101, // 0008 GETMET R4 R0 K1 + 0x7C100200, // 0009 CALL R4 1 + 0x7C0C0200, // 000A CALL R3 1 + 0xA8020007, // 000B EXBLK 0 #0014 + 0x5C100600, // 000C MOVE R4 R3 + 0x7C100000, // 000D CALL R4 0 + 0x8C140502, // 000E GETMET R5 R2 K2 + 0x601C0009, // 000F GETGBL R7 G9 + 0x5C200800, // 0010 MOVE R8 R4 + 0x7C1C0200, // 0011 CALL R7 1 + 0x7C140400, // 0012 CALL R5 2 + 0x7001FFF7, // 0013 JMP #000C + 0x580C0003, // 0014 LDCONST R3 K3 + 0xAC0C0200, // 0015 CATCH R3 1 0 + 0xB0080000, // 0016 RAISE 2 R0 R0 + 0x600C0010, // 0017 GETGBL R3 G16 + 0x6010000C, // 0018 GETGBL R4 G12 + 0x5C140400, // 0019 MOVE R5 R2 + 0x7C100200, // 001A CALL R4 1 + 0x04100904, // 001B SUB R4 R4 K4 + 0x40120804, // 001C CONNECT R4 K4 R4 + 0x7C0C0200, // 001D CALL R3 1 + 0xA8020010, // 001E EXBLK 0 #0030 + 0x5C100600, // 001F MOVE R4 R3 + 0x7C100000, // 0020 CALL R4 0 + 0x94140404, // 0021 GETIDX R5 R2 R4 + 0x5C180800, // 0022 MOVE R6 R4 + 0x241C0D05, // 0023 GT R7 R6 K5 + 0x781E0008, // 0024 JMPF R7 #002E + 0x041C0D04, // 0025 SUB R7 R6 K4 + 0x941C0407, // 0026 GETIDX R7 R2 R7 + 0x241C0E05, // 0027 GT R7 R7 R5 + 0x781E0004, // 0028 JMPF R7 #002E + 0x041C0D04, // 0029 SUB R7 R6 K4 + 0x941C0407, // 002A GETIDX R7 R2 R7 + 0x98080C07, // 002B SETIDX R2 R6 R7 + 0x04180D04, // 002C SUB R6 R6 K4 + 0x7001FFF4, // 002D JMP #0023 + 0x98080C05, // 002E SETIDX R2 R6 R5 + 0x7001FFEE, // 002F JMP #001F + 0x580C0003, // 0030 LDCONST R3 K3 + 0xAC0C0200, // 0031 CATCH R3 1 0 + 0xB0080000, // 0032 RAISE 2 R0 R0 + 0x80040400, // 0033 RET 1 R2 + }) + ) +); +/*******************************************************************/ + + /******************************************************************** ** Solidified function: mdns_announce_op_discovery ********************************************************************/ @@ -977,1084 +1534,9 @@ be_local_closure(Matter_Device_mdns_announce_op_discovery, /* name */ /******************************************************************** -** Solidified function: compute_manual_pairing_code +** Solidified function: every_second ********************************************************************/ -be_local_closure(Matter_Device_compute_manual_pairing_code, /* name */ - be_nested_proto( - 11, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 8]) { /* constants */ - /* K0 */ be_nested_str_weak(string), - /* K1 */ be_nested_str_weak(root_discriminator), - /* K2 */ be_nested_str_weak(root_passcode), - /* K3 */ be_nested_str_weak(format), - /* K4 */ be_nested_str_weak(_X251i_X2505i_X2504i), - /* K5 */ be_nested_str_weak(matter), - /* K6 */ be_nested_str_weak(Verhoeff), - /* K7 */ be_nested_str_weak(checksum), - }), - be_str_weak(compute_manual_pairing_code), - &be_const_str_solidified, - ( &(const binstruction[31]) { /* code */ - 0xA4060000, // 0000 IMPORT R1 K0 - 0x88080101, // 0001 GETMBR R2 R0 K1 - 0x540E0FFE, // 0002 LDINT R3 4095 - 0x2C080403, // 0003 AND R2 R2 R3 - 0x540E0009, // 0004 LDINT R3 10 - 0x3C080403, // 0005 SHR R2 R2 R3 - 0x880C0101, // 0006 GETMBR R3 R0 K1 - 0x541202FF, // 0007 LDINT R4 768 - 0x2C0C0604, // 0008 AND R3 R3 R4 - 0x54120005, // 0009 LDINT R4 6 - 0x380C0604, // 000A SHL R3 R3 R4 - 0x88100102, // 000B GETMBR R4 R0 K2 - 0x54163FFE, // 000C LDINT R5 16383 - 0x2C100805, // 000D AND R4 R4 R5 - 0x300C0604, // 000E OR R3 R3 R4 - 0x88100102, // 000F GETMBR R4 R0 K2 - 0x5416000D, // 0010 LDINT R5 14 - 0x3C100805, // 0011 SHR R4 R4 R5 - 0x8C140303, // 0012 GETMET R5 R1 K3 - 0x581C0004, // 0013 LDCONST R7 K4 - 0x5C200400, // 0014 MOVE R8 R2 - 0x5C240600, // 0015 MOVE R9 R3 - 0x5C280800, // 0016 MOVE R10 R4 - 0x7C140A00, // 0017 CALL R5 5 - 0xB81A0A00, // 0018 GETNGBL R6 K5 - 0x88180D06, // 0019 GETMBR R6 R6 K6 - 0x8C180D07, // 001A GETMET R6 R6 K7 - 0x5C200A00, // 001B MOVE R8 R5 - 0x7C180400, // 001C CALL R6 2 - 0x00140A06, // 001D ADD R5 R5 R6 - 0x80040A00, // 001E RET 1 R5 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: start_root_basic_commissioning -********************************************************************/ -be_local_closure(Matter_Device_start_root_basic_commissioning, /* name */ - be_nested_proto( - 14, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[23]) { /* constants */ - /* K0 */ be_nested_str_weak(string), - /* K1 */ be_nested_str_weak(PASE_TIMEOUT), - /* K2 */ be_nested_str_weak(compute_manual_pairing_code), - /* K3 */ be_nested_str_weak(tasmota), - /* K4 */ be_nested_str_weak(log), - /* K5 */ be_nested_str_weak(format), - /* K6 */ be_nested_str_weak(MTR_X3A_X20Manual_X20pairing_X20code_X3A_X20_X25s_X2D_X25s_X2D_X25s), - /* K7 */ be_const_int(0), - /* K8 */ be_const_int(3), - /* K9 */ be_const_int(2147483647), - /* K10 */ be_const_int(2), - /* K11 */ be_nested_str_weak(compute_qrcode_content), - /* K12 */ be_nested_str_weak(publish_result), - /* K13 */ be_nested_str_weak(_X7B_X22Matter_X22_X3A_X7B_X22Commissioning_X22_X3A1_X2C_X22PairingCode_X22_X3A_X22_X25s_X22_X2C_X22QRCode_X22_X3A_X22_X25s_X22_X7D_X7D), - /* K14 */ be_nested_str_weak(Matter), - /* K15 */ be_nested_str_weak(_compute_pbkdf), - /* K16 */ be_nested_str_weak(root_passcode), - /* K17 */ be_nested_str_weak(root_iterations), - /* K18 */ be_nested_str_weak(root_salt), - /* K19 */ be_nested_str_weak(start_basic_commissioning), - /* K20 */ be_nested_str_weak(root_discriminator), - /* K21 */ be_nested_str_weak(root_w0), - /* K22 */ be_nested_str_weak(root_L), - }), - be_str_weak(start_root_basic_commissioning), - &be_const_str_solidified, - ( &(const binstruction[49]) { /* code */ - 0xA40A0000, // 0000 IMPORT R2 K0 - 0x4C0C0000, // 0001 LDNIL R3 - 0x1C0C0203, // 0002 EQ R3 R1 R3 - 0x780E0000, // 0003 JMPF R3 #0005 - 0x88040101, // 0004 GETMBR R1 R0 K1 - 0x8C0C0102, // 0005 GETMET R3 R0 K2 - 0x7C0C0200, // 0006 CALL R3 1 - 0xB8120600, // 0007 GETNGBL R4 K3 - 0x8C100904, // 0008 GETMET R4 R4 K4 - 0x8C180505, // 0009 GETMET R6 R2 K5 - 0x58200006, // 000A LDCONST R8 K6 - 0x40260F08, // 000B CONNECT R9 K7 K8 - 0x94240609, // 000C GETIDX R9 R3 R9 - 0x542A0003, // 000D LDINT R10 4 - 0x542E0005, // 000E LDINT R11 6 - 0x4028140B, // 000F CONNECT R10 R10 R11 - 0x9428060A, // 0010 GETIDX R10 R3 R10 - 0x542E0006, // 0011 LDINT R11 7 - 0x402C1709, // 0012 CONNECT R11 R11 K9 - 0x942C060B, // 0013 GETIDX R11 R3 R11 - 0x7C180A00, // 0014 CALL R6 5 - 0x581C000A, // 0015 LDCONST R7 K10 - 0x7C100600, // 0016 CALL R4 3 - 0x8C10010B, // 0017 GETMET R4 R0 K11 - 0x7C100200, // 0018 CALL R4 1 - 0xB8160600, // 0019 GETNGBL R5 K3 - 0x8C140B0C, // 001A GETMET R5 R5 K12 - 0x8C1C0505, // 001B GETMET R7 R2 K5 - 0x5824000D, // 001C LDCONST R9 K13 - 0x5C280600, // 001D MOVE R10 R3 - 0x5C2C0800, // 001E MOVE R11 R4 - 0x7C1C0800, // 001F CALL R7 4 - 0x5820000E, // 0020 LDCONST R8 K14 - 0x7C140600, // 0021 CALL R5 3 - 0x8C14010F, // 0022 GETMET R5 R0 K15 - 0x881C0110, // 0023 GETMBR R7 R0 K16 - 0x88200111, // 0024 GETMBR R8 R0 K17 - 0x88240112, // 0025 GETMBR R9 R0 K18 - 0x7C140800, // 0026 CALL R5 4 - 0x8C140113, // 0027 GETMET R5 R0 K19 - 0x5C1C0200, // 0028 MOVE R7 R1 - 0x88200111, // 0029 GETMBR R8 R0 K17 - 0x88240114, // 002A GETMBR R9 R0 K20 - 0x88280112, // 002B GETMBR R10 R0 K18 - 0x882C0115, // 002C GETMBR R11 R0 K21 - 0x88300116, // 002D GETMBR R12 R0 K22 - 0x4C340000, // 002E LDNIL R13 - 0x7C141000, // 002F CALL R5 8 - 0x80000000, // 0030 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: start_commissioning_complete -********************************************************************/ -be_local_closure(Matter_Device_start_commissioning_complete, /* name */ - be_nested_proto( - 6, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 5]) { /* constants */ - /* K0 */ be_nested_str_weak(tasmota), - /* K1 */ be_nested_str_weak(log), - /* K2 */ be_nested_str_weak(MTR_X3A_X20_X2A_X2A_X2A_X20Commissioning_X20complete_X20_X2A_X2A_X2A), - /* K3 */ be_const_int(2), - /* K4 */ be_nested_str_weak(stop_basic_commissioning), - }), - be_str_weak(start_commissioning_complete), - &be_const_str_solidified, - ( &(const binstruction[ 8]) { /* code */ - 0xB80A0000, // 0000 GETNGBL R2 K0 - 0x8C080501, // 0001 GETMET R2 R2 K1 - 0x58100002, // 0002 LDCONST R4 K2 - 0x58140003, // 0003 LDCONST R5 K3 - 0x7C080600, // 0004 CALL R2 3 - 0x8C080104, // 0005 GETMET R2 R0 K4 - 0x7C080200, // 0006 CALL R2 1 - 0x80000000, // 0007 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: init -********************************************************************/ -be_local_closure(Matter_Device_init, /* name */ - be_nested_proto( - 8, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 1, /* has sup protos */ - ( &(const struct bproto*[ 2]) { - be_nested_proto( - 4, /* nstack */ - 0, /* argc */ - 0, /* varg */ - 1, /* has upvals */ - ( &(const bupvaldesc[ 1]) { /* upvals */ - be_local_const_upval(1, 0), - }), - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 5]) { /* constants */ - /* K0 */ be_nested_str_weak(start), - /* K1 */ be_nested_str_weak(tasmota), - /* K2 */ be_nested_str_weak(remove_rule), - /* K3 */ be_nested_str_weak(Wifi_X23Connected), - /* K4 */ be_nested_str_weak(matter_start), - }), - be_str_weak(_anonymous_), - &be_const_str_solidified, - ( &(const binstruction[ 9]) { /* code */ - 0x68000000, // 0000 GETUPV R0 U0 - 0x8C000100, // 0001 GETMET R0 R0 K0 - 0x7C000200, // 0002 CALL R0 1 - 0xB8020200, // 0003 GETNGBL R0 K1 - 0x8C000102, // 0004 GETMET R0 R0 K2 - 0x58080003, // 0005 LDCONST R2 K3 - 0x580C0004, // 0006 LDCONST R3 K4 - 0x7C000600, // 0007 CALL R0 3 - 0x80000000, // 0008 RET 0 - }) - ), - be_nested_proto( - 4, /* nstack */ - 0, /* argc */ - 0, /* varg */ - 1, /* has upvals */ - ( &(const bupvaldesc[ 1]) { /* upvals */ - be_local_const_upval(1, 0), - }), - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 5]) { /* constants */ - /* K0 */ be_nested_str_weak(start), - /* K1 */ be_nested_str_weak(tasmota), - /* K2 */ be_nested_str_weak(remove_rule), - /* K3 */ be_nested_str_weak(Eth_X23Connected), - /* K4 */ be_nested_str_weak(matter_start), - }), - be_str_weak(_anonymous_), - &be_const_str_solidified, - ( &(const binstruction[ 9]) { /* code */ - 0x68000000, // 0000 GETUPV R0 U0 - 0x8C000100, // 0001 GETMET R0 R0 K0 - 0x7C000200, // 0002 CALL R0 1 - 0xB8020200, // 0003 GETNGBL R0 K1 - 0x8C000102, // 0004 GETMET R0 R0 K2 - 0x58080003, // 0005 LDCONST R2 K3 - 0x580C0004, // 0006 LDCONST R3 K4 - 0x7C000600, // 0007 CALL R0 3 - 0x80000000, // 0008 RET 0 - }) - ), - }), - 1, /* has constants */ - ( &(const bvalue[39]) { /* constants */ - /* K0 */ be_nested_str_weak(crypto), - /* K1 */ be_nested_str_weak(string), - /* K2 */ be_nested_str_weak(tasmota), - /* K3 */ be_nested_str_weak(get_option), - /* K4 */ be_nested_str_weak(matter), - /* K5 */ be_nested_str_weak(MATTER_OPTION), - /* K6 */ be_nested_str_weak(UI), - /* K7 */ be_nested_str_weak(started), - /* K8 */ be_nested_str_weak(plugins), - /* K9 */ be_nested_str_weak(plugins_persist), - /* K10 */ be_nested_str_weak(plugins_classes), - /* K11 */ be_nested_str_weak(register_native_classes), - /* K12 */ be_nested_str_weak(vendorid), - /* K13 */ be_nested_str_weak(VENDOR_ID), - /* K14 */ be_nested_str_weak(productid), - /* K15 */ be_nested_str_weak(PRODUCT_ID), - /* K16 */ be_nested_str_weak(root_iterations), - /* K17 */ be_nested_str_weak(PBKDF_ITERATIONS), - /* K18 */ be_nested_str_weak(root_salt), - /* K19 */ be_nested_str_weak(random), - /* K20 */ be_nested_str_weak(ipv4only), - /* K21 */ be_nested_str_weak(load_param), - /* K22 */ be_nested_str_weak(sessions), - /* K23 */ be_nested_str_weak(Session_Store), - /* K24 */ be_nested_str_weak(load_fabrics), - /* K25 */ be_nested_str_weak(message_handler), - /* K26 */ be_nested_str_weak(MessageHandler), - /* K27 */ be_nested_str_weak(ui), - /* K28 */ be_nested_str_weak(wifi), - /* K29 */ be_nested_str_weak(up), - /* K30 */ be_nested_str_weak(eth), - /* K31 */ be_nested_str_weak(start), - /* K32 */ be_nested_str_weak(add_rule), - /* K33 */ be_nested_str_weak(Wifi_X23Connected), - /* K34 */ be_nested_str_weak(matter_start), - /* K35 */ be_nested_str_weak(Eth_X23Connected), - /* K36 */ be_nested_str_weak(_init_basic_commissioning), - /* K37 */ be_nested_str_weak(add_driver), - /* K38 */ be_nested_str_weak(register_commands), - }), - be_str_weak(init), - &be_const_str_solidified, - ( &(const binstruction[101]) { /* code */ - 0xA4060000, // 0000 IMPORT R1 K0 - 0xA40A0200, // 0001 IMPORT R2 K1 - 0xB80E0400, // 0002 GETNGBL R3 K2 - 0x8C0C0703, // 0003 GETMET R3 R3 K3 - 0xB8160800, // 0004 GETNGBL R5 K4 - 0x88140B05, // 0005 GETMBR R5 R5 K5 - 0x7C0C0400, // 0006 CALL R3 2 - 0x740E0004, // 0007 JMPT R3 #000D - 0xB80E0800, // 0008 GETNGBL R3 K4 - 0x8C0C0706, // 0009 GETMET R3 R3 K6 - 0x5C140000, // 000A MOVE R5 R0 - 0x7C0C0400, // 000B CALL R3 2 - 0x80000600, // 000C RET 0 - 0x500C0000, // 000D LDBOOL R3 0 0 - 0x90020E03, // 000E SETMBR R0 K7 R3 - 0x600C0012, // 000F GETGBL R3 G18 - 0x7C0C0000, // 0010 CALL R3 0 - 0x90021003, // 0011 SETMBR R0 K8 R3 - 0x500C0000, // 0012 LDBOOL R3 0 0 - 0x90021203, // 0013 SETMBR R0 K9 R3 - 0x600C0013, // 0014 GETGBL R3 G19 - 0x7C0C0000, // 0015 CALL R3 0 - 0x90021403, // 0016 SETMBR R0 K10 R3 - 0x8C0C010B, // 0017 GETMET R3 R0 K11 - 0x7C0C0200, // 0018 CALL R3 1 - 0x880C010D, // 0019 GETMBR R3 R0 K13 - 0x90021803, // 001A SETMBR R0 K12 R3 - 0x880C010F, // 001B GETMBR R3 R0 K15 - 0x90021C03, // 001C SETMBR R0 K14 R3 - 0x880C0111, // 001D GETMBR R3 R0 K17 - 0x90022003, // 001E SETMBR R0 K16 R3 - 0x8C0C0313, // 001F GETMET R3 R1 K19 - 0x5416000F, // 0020 LDINT R5 16 - 0x7C0C0400, // 0021 CALL R3 2 - 0x90022403, // 0022 SETMBR R0 K18 R3 - 0x500C0000, // 0023 LDBOOL R3 0 0 - 0x90022803, // 0024 SETMBR R0 K20 R3 - 0x8C0C0115, // 0025 GETMET R3 R0 K21 - 0x7C0C0200, // 0026 CALL R3 1 - 0xB80E0800, // 0027 GETNGBL R3 K4 - 0x8C0C0717, // 0028 GETMET R3 R3 K23 - 0x5C140000, // 0029 MOVE R5 R0 - 0x7C0C0400, // 002A CALL R3 2 - 0x90022C03, // 002B SETMBR R0 K22 R3 - 0x880C0116, // 002C GETMBR R3 R0 K22 - 0x8C0C0718, // 002D GETMET R3 R3 K24 - 0x7C0C0200, // 002E CALL R3 1 - 0xB80E0800, // 002F GETNGBL R3 K4 - 0x8C0C071A, // 0030 GETMET R3 R3 K26 - 0x5C140000, // 0031 MOVE R5 R0 - 0x7C0C0400, // 0032 CALL R3 2 - 0x90023203, // 0033 SETMBR R0 K25 R3 - 0xB80E0800, // 0034 GETNGBL R3 K4 - 0x8C0C0706, // 0035 GETMET R3 R3 K6 - 0x5C140000, // 0036 MOVE R5 R0 - 0x7C0C0400, // 0037 CALL R3 2 - 0x90023603, // 0038 SETMBR R0 K27 R3 - 0xB80E0400, // 0039 GETNGBL R3 K2 - 0x8C0C071C, // 003A GETMET R3 R3 K28 - 0x7C0C0200, // 003B CALL R3 1 - 0x940C071D, // 003C GETIDX R3 R3 K29 - 0x740E0004, // 003D JMPT R3 #0043 - 0xB80E0400, // 003E GETNGBL R3 K2 - 0x8C0C071E, // 003F GETMET R3 R3 K30 - 0x7C0C0200, // 0040 CALL R3 1 - 0x940C071D, // 0041 GETIDX R3 R3 K29 - 0x780E0001, // 0042 JMPF R3 #0045 - 0x8C0C011F, // 0043 GETMET R3 R0 K31 - 0x7C0C0200, // 0044 CALL R3 1 - 0xB80E0400, // 0045 GETNGBL R3 K2 - 0x8C0C071C, // 0046 GETMET R3 R3 K28 - 0x7C0C0200, // 0047 CALL R3 1 - 0x940C071D, // 0048 GETIDX R3 R3 K29 - 0x740E0005, // 0049 JMPT R3 #0050 - 0xB80E0400, // 004A GETNGBL R3 K2 - 0x8C0C0720, // 004B GETMET R3 R3 K32 - 0x58140021, // 004C LDCONST R5 K33 - 0x84180000, // 004D CLOSURE R6 P0 - 0x581C0022, // 004E LDCONST R7 K34 - 0x7C0C0800, // 004F CALL R3 4 - 0xB80E0400, // 0050 GETNGBL R3 K2 - 0x8C0C071E, // 0051 GETMET R3 R3 K30 - 0x7C0C0200, // 0052 CALL R3 1 - 0x940C071D, // 0053 GETIDX R3 R3 K29 - 0x740E0005, // 0054 JMPT R3 #005B - 0xB80E0400, // 0055 GETNGBL R3 K2 - 0x8C0C0720, // 0056 GETMET R3 R3 K32 - 0x58140023, // 0057 LDCONST R5 K35 - 0x84180001, // 0058 CLOSURE R6 P1 - 0x581C0022, // 0059 LDCONST R7 K34 - 0x7C0C0800, // 005A CALL R3 4 - 0x8C0C0124, // 005B GETMET R3 R0 K36 - 0x7C0C0200, // 005C CALL R3 1 - 0xB80E0400, // 005D GETNGBL R3 K2 - 0x8C0C0725, // 005E GETMET R3 R3 K37 - 0x5C140000, // 005F MOVE R5 R0 - 0x7C0C0400, // 0060 CALL R3 2 - 0x8C0C0126, // 0061 GETMET R3 R0 K38 - 0x7C0C0200, // 0062 CALL R3 1 - 0xA0000000, // 0063 CLOSE R0 - 0x80000000, // 0064 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: start -********************************************************************/ -be_local_closure(Matter_Device_start, /* name */ - be_nested_proto( - 6, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 1, /* has sup protos */ - ( &(const struct bproto*[ 1]) { - be_nested_proto( - 2, /* nstack */ - 0, /* argc */ - 0, /* varg */ - 1, /* has upvals */ - ( &(const bupvaldesc[ 1]) { /* upvals */ - be_local_const_upval(1, 0), - }), - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 1]) { /* constants */ - /* K0 */ be_nested_str_weak(_trigger_read_sensors), - }), - be_str_weak(_anonymous_), - &be_const_str_solidified, - ( &(const binstruction[ 4]) { /* code */ - 0x68000000, // 0000 GETUPV R0 U0 - 0x8C000100, // 0001 GETMET R0 R0 K0 - 0x7C000200, // 0002 CALL R0 1 - 0x80000000, // 0003 RET 0 - }) - ), - }), - 1, /* has constants */ - ( &(const bvalue[ 9]) { /* constants */ - /* K0 */ be_nested_str_weak(started), - /* K1 */ be_nested_str_weak(autoconf_device), - /* K2 */ be_nested_str_weak(tasmota), - /* K3 */ be_nested_str_weak(add_cron), - /* K4 */ be_nested_str_weak(_X2A_X2F30_X20_X2A_X20_X2A_X20_X2A_X20_X2A_X20_X2A), - /* K5 */ be_nested_str_weak(matter_sensors_30s), - /* K6 */ be_nested_str_weak(_start_udp), - /* K7 */ be_nested_str_weak(UDP_PORT), - /* K8 */ be_nested_str_weak(start_mdns_announce_hostnames), - }), - be_str_weak(start), - &be_const_str_solidified, - ( &(const binstruction[20]) { /* code */ - 0x88040100, // 0000 GETMBR R1 R0 K0 - 0x78060000, // 0001 JMPF R1 #0003 - 0x80000200, // 0002 RET 0 - 0x8C040101, // 0003 GETMET R1 R0 K1 - 0x7C040200, // 0004 CALL R1 1 - 0xB8060400, // 0005 GETNGBL R1 K2 - 0x8C040303, // 0006 GETMET R1 R1 K3 - 0x580C0004, // 0007 LDCONST R3 K4 - 0x84100000, // 0008 CLOSURE R4 P0 - 0x58140005, // 0009 LDCONST R5 K5 - 0x7C040800, // 000A CALL R1 4 - 0x8C040106, // 000B GETMET R1 R0 K6 - 0x880C0107, // 000C GETMBR R3 R0 K7 - 0x7C040400, // 000D CALL R1 2 - 0x8C040108, // 000E GETMET R1 R0 K8 - 0x7C040200, // 000F CALL R1 1 - 0x50040200, // 0010 LDBOOL R1 1 0 - 0x90020001, // 0011 SETMBR R0 K0 R1 - 0xA0000000, // 0012 CLOSE R0 - 0x80000000, // 0013 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: load_param -********************************************************************/ -be_local_closure(Matter_Device_load_param, /* name */ - be_nested_proto( - 12, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[28]) { /* constants */ - /* K0 */ be_nested_str_weak(string), - /* K1 */ be_nested_str_weak(crypto), - /* K2 */ be_nested_str_weak(FILENAME), - /* K3 */ be_nested_str_weak(read), - /* K4 */ be_nested_str_weak(close), - /* K5 */ be_nested_str_weak(json), - /* K6 */ be_nested_str_weak(load), - /* K7 */ be_nested_str_weak(root_discriminator), - /* K8 */ be_nested_str_weak(find), - /* K9 */ be_nested_str_weak(distinguish), - /* K10 */ be_nested_str_weak(root_passcode), - /* K11 */ be_nested_str_weak(passcode), - /* K12 */ be_nested_str_weak(ipv4only), - /* K13 */ be_nested_str_weak(plugins_config), - /* K14 */ be_nested_str_weak(config), - /* K15 */ be_nested_str_weak(_load_plugins_config), - /* K16 */ be_nested_str_weak(plugins_persist), - /* K17 */ be_nested_str_weak(io_error), - /* K18 */ be_nested_str_weak(tasmota), - /* K19 */ be_nested_str_weak(log), - /* K20 */ be_nested_str_weak(MTR_X3A_X20Session_Store_X3A_X3Aload_X20Exception_X3A), - /* K21 */ be_nested_str_weak(_X7C), - /* K22 */ be_const_int(2), - /* K23 */ be_nested_str_weak(random), - /* K24 */ be_nested_str_weak(get), - /* K25 */ be_const_int(0), - /* K26 */ be_nested_str_weak(generate_random_passcode), - /* K27 */ be_nested_str_weak(save_param), - }), - be_str_weak(load_param), - &be_const_str_solidified, - ( &(const binstruction[91]) { /* code */ - 0xA4060000, // 0000 IMPORT R1 K0 - 0xA40A0200, // 0001 IMPORT R2 K1 - 0xA8020028, // 0002 EXBLK 0 #002C - 0x600C0011, // 0003 GETGBL R3 G17 - 0x88100102, // 0004 GETMBR R4 R0 K2 - 0x7C0C0200, // 0005 CALL R3 1 - 0x8C100703, // 0006 GETMET R4 R3 K3 - 0x7C100200, // 0007 CALL R4 1 - 0x8C140704, // 0008 GETMET R5 R3 K4 - 0x7C140200, // 0009 CALL R5 1 - 0xA4160A00, // 000A IMPORT R5 K5 - 0x8C180B06, // 000B GETMET R6 R5 K6 - 0x5C200800, // 000C MOVE R8 R4 - 0x7C180400, // 000D CALL R6 2 - 0x8C1C0D08, // 000E GETMET R7 R6 K8 - 0x58240009, // 000F LDCONST R9 K9 - 0x88280107, // 0010 GETMBR R10 R0 K7 - 0x7C1C0600, // 0011 CALL R7 3 - 0x90020E07, // 0012 SETMBR R0 K7 R7 - 0x8C1C0D08, // 0013 GETMET R7 R6 K8 - 0x5824000B, // 0014 LDCONST R9 K11 - 0x8828010A, // 0015 GETMBR R10 R0 K10 - 0x7C1C0600, // 0016 CALL R7 3 - 0x90021407, // 0017 SETMBR R0 K10 R7 - 0x601C0017, // 0018 GETGBL R7 G23 - 0x8C200D08, // 0019 GETMET R8 R6 K8 - 0x5828000C, // 001A LDCONST R10 K12 - 0x502C0000, // 001B LDBOOL R11 0 0 - 0x7C200600, // 001C CALL R8 3 - 0x7C1C0200, // 001D CALL R7 1 - 0x90021807, // 001E SETMBR R0 K12 R7 - 0x8C1C0D08, // 001F GETMET R7 R6 K8 - 0x5824000E, // 0020 LDCONST R9 K14 - 0x7C1C0400, // 0021 CALL R7 2 - 0x90021A07, // 0022 SETMBR R0 K13 R7 - 0x881C010D, // 0023 GETMBR R7 R0 K13 - 0x781E0004, // 0024 JMPF R7 #002A - 0x8C1C010F, // 0025 GETMET R7 R0 K15 - 0x8824010D, // 0026 GETMBR R9 R0 K13 - 0x7C1C0400, // 0027 CALL R7 2 - 0x501C0200, // 0028 LDBOOL R7 1 0 - 0x90022007, // 0029 SETMBR R0 K16 R7 - 0xA8040001, // 002A EXBLK 1 1 - 0x70020012, // 002B JMP #003F - 0xAC0C0002, // 002C CATCH R3 0 2 - 0x7002000F, // 002D JMP #003E - 0x20140711, // 002E NE R5 R3 K17 - 0x7816000C, // 002F JMPF R5 #003D - 0xB8162400, // 0030 GETNGBL R5 K18 - 0x8C140B13, // 0031 GETMET R5 R5 K19 - 0x601C0008, // 0032 GETGBL R7 G8 - 0x5C200600, // 0033 MOVE R8 R3 - 0x7C1C0200, // 0034 CALL R7 1 - 0x001E2807, // 0035 ADD R7 K20 R7 - 0x001C0F15, // 0036 ADD R7 R7 K21 - 0x60200008, // 0037 GETGBL R8 G8 - 0x5C240800, // 0038 MOVE R9 R4 - 0x7C200200, // 0039 CALL R8 1 - 0x001C0E08, // 003A ADD R7 R7 R8 - 0x58200016, // 003B LDCONST R8 K22 - 0x7C140600, // 003C CALL R5 3 - 0x70020000, // 003D JMP #003F - 0xB0080000, // 003E RAISE 2 R0 R0 - 0x500C0000, // 003F LDBOOL R3 0 0 - 0x88100107, // 0040 GETMBR R4 R0 K7 - 0x4C140000, // 0041 LDNIL R5 - 0x1C100805, // 0042 EQ R4 R4 R5 - 0x7812000A, // 0043 JMPF R4 #004F - 0x8C100517, // 0044 GETMET R4 R2 K23 - 0x58180016, // 0045 LDCONST R6 K22 - 0x7C100400, // 0046 CALL R4 2 - 0x8C100918, // 0047 GETMET R4 R4 K24 - 0x58180019, // 0048 LDCONST R6 K25 - 0x581C0016, // 0049 LDCONST R7 K22 - 0x7C100600, // 004A CALL R4 3 - 0x54160FFE, // 004B LDINT R5 4095 - 0x2C100805, // 004C AND R4 R4 R5 - 0x90020E04, // 004D SETMBR R0 K7 R4 - 0x500C0200, // 004E LDBOOL R3 1 0 - 0x8810010A, // 004F GETMBR R4 R0 K10 - 0x4C140000, // 0050 LDNIL R5 - 0x1C100805, // 0051 EQ R4 R4 R5 - 0x78120003, // 0052 JMPF R4 #0057 - 0x8C10011A, // 0053 GETMET R4 R0 K26 - 0x7C100200, // 0054 CALL R4 1 - 0x90021404, // 0055 SETMBR R0 K10 R4 - 0x500C0200, // 0056 LDBOOL R3 1 0 - 0x780E0001, // 0057 JMPF R3 #005A - 0x8C10011B, // 0058 GETMET R4 R0 K27 - 0x7C100200, // 0059 CALL R4 1 - 0x80000000, // 005A RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: register_native_classes -********************************************************************/ -be_local_closure(Matter_Device_register_native_classes, /* name */ - be_nested_proto( - 9, /* nstack */ - 3, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[28]) { /* constants */ - /* K0 */ be_nested_str_weak(register_plugin_class), - /* K1 */ be_nested_str_weak(root), - /* K2 */ be_nested_str_weak(matter), - /* K3 */ be_nested_str_weak(Plugin_Root), - /* K4 */ be_nested_str_weak(light0), - /* K5 */ be_nested_str_weak(Plugin_Light0), - /* K6 */ be_nested_str_weak(light1), - /* K7 */ be_nested_str_weak(Plugin_Light1), - /* K8 */ be_nested_str_weak(light2), - /* K9 */ be_nested_str_weak(Plugin_Light2), - /* K10 */ be_nested_str_weak(light3), - /* K11 */ be_nested_str_weak(Plugin_Light3), - /* K12 */ be_nested_str_weak(relay), - /* K13 */ be_nested_str_weak(Plugin_OnOff), - /* K14 */ be_nested_str_weak(temperature), - /* K15 */ be_nested_str_weak(Plugin_Sensor_Temp), - /* K16 */ be_nested_str_weak(humidity), - /* K17 */ be_nested_str_weak(Plugin_Sensor_Humidity), - /* K18 */ be_nested_str_weak(illuminance), - /* K19 */ be_nested_str_weak(Plugin_Sensor_Illuminance), - /* K20 */ be_nested_str_weak(pressure), - /* K21 */ be_nested_str_weak(Plugin_Sensor_Pressure), - /* K22 */ be_nested_str_weak(tasmota), - /* K23 */ be_nested_str_weak(log), - /* K24 */ be_nested_str_weak(MTR_X3A_X20registered_X20classes_X20), - /* K25 */ be_nested_str_weak(k2l), - /* K26 */ be_nested_str_weak(plugins_classes), - /* K27 */ be_const_int(3), - }), - be_str_weak(register_native_classes), - &be_const_str_solidified, - ( &(const binstruction[61]) { /* code */ - 0x8C0C0100, // 0000 GETMET R3 R0 K0 - 0x58140001, // 0001 LDCONST R5 K1 - 0xB81A0400, // 0002 GETNGBL R6 K2 - 0x88180D03, // 0003 GETMBR R6 R6 K3 - 0x7C0C0600, // 0004 CALL R3 3 - 0x8C0C0100, // 0005 GETMET R3 R0 K0 - 0x58140004, // 0006 LDCONST R5 K4 - 0xB81A0400, // 0007 GETNGBL R6 K2 - 0x88180D05, // 0008 GETMBR R6 R6 K5 - 0x7C0C0600, // 0009 CALL R3 3 - 0x8C0C0100, // 000A GETMET R3 R0 K0 - 0x58140006, // 000B LDCONST R5 K6 - 0xB81A0400, // 000C GETNGBL R6 K2 - 0x88180D07, // 000D GETMBR R6 R6 K7 - 0x7C0C0600, // 000E CALL R3 3 - 0x8C0C0100, // 000F GETMET R3 R0 K0 - 0x58140008, // 0010 LDCONST R5 K8 - 0xB81A0400, // 0011 GETNGBL R6 K2 - 0x88180D09, // 0012 GETMBR R6 R6 K9 - 0x7C0C0600, // 0013 CALL R3 3 - 0x8C0C0100, // 0014 GETMET R3 R0 K0 - 0x5814000A, // 0015 LDCONST R5 K10 - 0xB81A0400, // 0016 GETNGBL R6 K2 - 0x88180D0B, // 0017 GETMBR R6 R6 K11 - 0x7C0C0600, // 0018 CALL R3 3 - 0x8C0C0100, // 0019 GETMET R3 R0 K0 - 0x5814000C, // 001A LDCONST R5 K12 - 0xB81A0400, // 001B GETNGBL R6 K2 - 0x88180D0D, // 001C GETMBR R6 R6 K13 - 0x7C0C0600, // 001D CALL R3 3 - 0x8C0C0100, // 001E GETMET R3 R0 K0 - 0x5814000E, // 001F LDCONST R5 K14 - 0xB81A0400, // 0020 GETNGBL R6 K2 - 0x88180D0F, // 0021 GETMBR R6 R6 K15 - 0x7C0C0600, // 0022 CALL R3 3 - 0x8C0C0100, // 0023 GETMET R3 R0 K0 - 0x58140010, // 0024 LDCONST R5 K16 - 0xB81A0400, // 0025 GETNGBL R6 K2 - 0x88180D11, // 0026 GETMBR R6 R6 K17 - 0x7C0C0600, // 0027 CALL R3 3 - 0x8C0C0100, // 0028 GETMET R3 R0 K0 - 0x58140012, // 0029 LDCONST R5 K18 - 0xB81A0400, // 002A GETNGBL R6 K2 - 0x88180D13, // 002B GETMBR R6 R6 K19 - 0x7C0C0600, // 002C CALL R3 3 - 0x8C0C0100, // 002D GETMET R3 R0 K0 - 0x58140014, // 002E LDCONST R5 K20 - 0xB81A0400, // 002F GETNGBL R6 K2 - 0x88180D15, // 0030 GETMBR R6 R6 K21 - 0x7C0C0600, // 0031 CALL R3 3 - 0xB80E2C00, // 0032 GETNGBL R3 K22 - 0x8C0C0717, // 0033 GETMET R3 R3 K23 - 0x60140008, // 0034 GETGBL R5 G8 - 0x8C180119, // 0035 GETMET R6 R0 K25 - 0x8820011A, // 0036 GETMBR R8 R0 K26 - 0x7C180400, // 0037 CALL R6 2 - 0x7C140200, // 0038 CALL R5 1 - 0x00163005, // 0039 ADD R5 K24 R5 - 0x5818001B, // 003A LDCONST R6 K27 - 0x7C0C0600, // 003B CALL R3 3 - 0x80000000, // 003C RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: _mdns_announce_hostname -********************************************************************/ -be_local_closure(Matter_Device__mdns_announce_hostname, /* name */ - be_nested_proto( - 16, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[28]) { /* constants */ - /* K0 */ be_nested_str_weak(mdns), - /* K1 */ be_nested_str_weak(string), - /* K2 */ be_nested_str_weak(start), - /* K3 */ be_nested_str_weak(tasmota), - /* K4 */ be_nested_str_weak(eth), - /* K5 */ be_nested_str_weak(hostname_eth), - /* K6 */ be_nested_str_weak(replace), - /* K7 */ be_nested_str_weak(find), - /* K8 */ be_nested_str_weak(mac), - /* K9 */ be_nested_str_weak(_X3A), - /* K10 */ be_nested_str_weak(), - /* K11 */ be_nested_str_weak(ipv4only), - /* K12 */ be_nested_str_weak(log), - /* K13 */ be_nested_str_weak(format), - /* K14 */ be_nested_str_weak(MTR_X3A_X20calling_X20mdns_X2Eadd_hostname_X28_X25s_X2C_X20_X25s_X2C_X20_X25s_X29), - /* K15 */ be_nested_str_weak(ip6local), - /* K16 */ be_nested_str_weak(ip), - /* K17 */ be_const_int(3), - /* K18 */ be_nested_str_weak(add_hostname), - /* K19 */ be_nested_str_weak(ip6), - /* K20 */ be_nested_str_weak(MTR_X3A_X20calling_X20mdns_X2Eadd_hostname_X28_X25s_X2C_X20_X25s_X29), - /* K21 */ be_nested_str_weak(wifi), - /* K22 */ be_nested_str_weak(hostname_wifi), - /* K23 */ be_nested_str_weak(MTR_X3A_X20start_X20mDNS_X20on_X20_X25s_X20host_X20_X27_X25s_X2Elocal_X27), - /* K24 */ be_const_int(2), - /* K25 */ be_nested_str_weak(MTR_X3A_X20Exception), - /* K26 */ be_nested_str_weak(_X7C), - /* K27 */ be_nested_str_weak(mdns_announce_op_discovery_all_fabrics), - }), - be_str_weak(_mdns_announce_hostname), - &be_const_str_solidified, - ( &(const binstruction[172]) { /* code */ - 0xA40A0000, // 0000 IMPORT R2 K0 - 0xA40E0200, // 0001 IMPORT R3 K1 - 0x8C100502, // 0002 GETMET R4 R2 K2 - 0x7C100200, // 0003 CALL R4 1 - 0xA8020092, // 0004 EXBLK 0 #0098 - 0x78060040, // 0005 JMPF R1 #0047 - 0xB8120600, // 0006 GETNGBL R4 K3 - 0x8C100904, // 0007 GETMET R4 R4 K4 - 0x7C100200, // 0008 CALL R4 1 - 0x8C140706, // 0009 GETMET R5 R3 K6 - 0x8C1C0907, // 000A GETMET R7 R4 K7 - 0x58240008, // 000B LDCONST R9 K8 - 0x7C1C0400, // 000C CALL R7 2 - 0x58200009, // 000D LDCONST R8 K9 - 0x5824000A, // 000E LDCONST R9 K10 - 0x7C140800, // 000F CALL R5 4 - 0x90020A05, // 0010 SETMBR R0 K5 R5 - 0x8814010B, // 0011 GETMBR R5 R0 K11 - 0x7416001F, // 0012 JMPT R5 #0033 - 0xB8160600, // 0013 GETNGBL R5 K3 - 0x8C140B0C, // 0014 GETMET R5 R5 K12 - 0x8C1C070D, // 0015 GETMET R7 R3 K13 - 0x5824000E, // 0016 LDCONST R9 K14 - 0x88280105, // 0017 GETMBR R10 R0 K5 - 0x8C2C0907, // 0018 GETMET R11 R4 K7 - 0x5834000F, // 0019 LDCONST R13 K15 - 0x5838000A, // 001A LDCONST R14 K10 - 0x7C2C0600, // 001B CALL R11 3 - 0x8C300907, // 001C GETMET R12 R4 K7 - 0x58380010, // 001D LDCONST R14 K16 - 0x583C000A, // 001E LDCONST R15 K10 - 0x7C300600, // 001F CALL R12 3 - 0x7C1C0A00, // 0020 CALL R7 5 - 0x58200011, // 0021 LDCONST R8 K17 - 0x7C140600, // 0022 CALL R5 3 - 0x8C140512, // 0023 GETMET R5 R2 K18 - 0x881C0105, // 0024 GETMBR R7 R0 K5 - 0x8C200907, // 0025 GETMET R8 R4 K7 - 0x5828000F, // 0026 LDCONST R10 K15 - 0x582C000A, // 0027 LDCONST R11 K10 - 0x7C200600, // 0028 CALL R8 3 - 0x8C240907, // 0029 GETMET R9 R4 K7 - 0x582C0010, // 002A LDCONST R11 K16 - 0x5830000A, // 002B LDCONST R12 K10 - 0x7C240600, // 002C CALL R9 3 - 0x8C280907, // 002D GETMET R10 R4 K7 - 0x58300013, // 002E LDCONST R12 K19 - 0x5834000A, // 002F LDCONST R13 K10 - 0x7C280600, // 0030 CALL R10 3 - 0x7C140A00, // 0031 CALL R5 5 - 0x70020012, // 0032 JMP #0046 - 0xB8160600, // 0033 GETNGBL R5 K3 - 0x8C140B0C, // 0034 GETMET R5 R5 K12 - 0x8C1C070D, // 0035 GETMET R7 R3 K13 - 0x58240014, // 0036 LDCONST R9 K20 - 0x88280105, // 0037 GETMBR R10 R0 K5 - 0x8C2C0907, // 0038 GETMET R11 R4 K7 - 0x58340010, // 0039 LDCONST R13 K16 - 0x5838000A, // 003A LDCONST R14 K10 - 0x7C2C0600, // 003B CALL R11 3 - 0x7C1C0800, // 003C CALL R7 4 - 0x58200011, // 003D LDCONST R8 K17 - 0x7C140600, // 003E CALL R5 3 - 0x8C140512, // 003F GETMET R5 R2 K18 - 0x881C0105, // 0040 GETMBR R7 R0 K5 - 0x8C200907, // 0041 GETMET R8 R4 K7 - 0x58280010, // 0042 LDCONST R10 K16 - 0x582C000A, // 0043 LDCONST R11 K10 - 0x7C200600, // 0044 CALL R8 3 - 0x7C140600, // 0045 CALL R5 3 - 0x7002003F, // 0046 JMP #0087 - 0xB8120600, // 0047 GETNGBL R4 K3 - 0x8C100915, // 0048 GETMET R4 R4 K21 - 0x7C100200, // 0049 CALL R4 1 - 0x8C140706, // 004A GETMET R5 R3 K6 - 0x8C1C0907, // 004B GETMET R7 R4 K7 - 0x58240008, // 004C LDCONST R9 K8 - 0x7C1C0400, // 004D CALL R7 2 - 0x58200009, // 004E LDCONST R8 K9 - 0x5824000A, // 004F LDCONST R9 K10 - 0x7C140800, // 0050 CALL R5 4 - 0x90022C05, // 0051 SETMBR R0 K22 R5 - 0x8814010B, // 0052 GETMBR R5 R0 K11 - 0x7416001F, // 0053 JMPT R5 #0074 - 0xB8160600, // 0054 GETNGBL R5 K3 - 0x8C140B0C, // 0055 GETMET R5 R5 K12 - 0x8C1C070D, // 0056 GETMET R7 R3 K13 - 0x5824000E, // 0057 LDCONST R9 K14 - 0x88280116, // 0058 GETMBR R10 R0 K22 - 0x8C2C0907, // 0059 GETMET R11 R4 K7 - 0x5834000F, // 005A LDCONST R13 K15 - 0x5838000A, // 005B LDCONST R14 K10 - 0x7C2C0600, // 005C CALL R11 3 - 0x8C300907, // 005D GETMET R12 R4 K7 - 0x58380010, // 005E LDCONST R14 K16 - 0x583C000A, // 005F LDCONST R15 K10 - 0x7C300600, // 0060 CALL R12 3 - 0x7C1C0A00, // 0061 CALL R7 5 - 0x58200011, // 0062 LDCONST R8 K17 - 0x7C140600, // 0063 CALL R5 3 - 0x8C140512, // 0064 GETMET R5 R2 K18 - 0x881C0116, // 0065 GETMBR R7 R0 K22 - 0x8C200907, // 0066 GETMET R8 R4 K7 - 0x5828000F, // 0067 LDCONST R10 K15 - 0x582C000A, // 0068 LDCONST R11 K10 - 0x7C200600, // 0069 CALL R8 3 - 0x8C240907, // 006A GETMET R9 R4 K7 - 0x582C0010, // 006B LDCONST R11 K16 - 0x5830000A, // 006C LDCONST R12 K10 - 0x7C240600, // 006D CALL R9 3 - 0x8C280907, // 006E GETMET R10 R4 K7 - 0x58300013, // 006F LDCONST R12 K19 - 0x5834000A, // 0070 LDCONST R13 K10 - 0x7C280600, // 0071 CALL R10 3 - 0x7C140A00, // 0072 CALL R5 5 - 0x70020012, // 0073 JMP #0087 - 0xB8160600, // 0074 GETNGBL R5 K3 - 0x8C140B0C, // 0075 GETMET R5 R5 K12 - 0x8C1C070D, // 0076 GETMET R7 R3 K13 - 0x58240014, // 0077 LDCONST R9 K20 - 0x88280105, // 0078 GETMBR R10 R0 K5 - 0x8C2C0907, // 0079 GETMET R11 R4 K7 - 0x58340010, // 007A LDCONST R13 K16 - 0x5838000A, // 007B LDCONST R14 K10 - 0x7C2C0600, // 007C CALL R11 3 - 0x7C1C0800, // 007D CALL R7 4 - 0x58200011, // 007E LDCONST R8 K17 - 0x7C140600, // 007F CALL R5 3 - 0x8C140512, // 0080 GETMET R5 R2 K18 - 0x881C0116, // 0081 GETMBR R7 R0 K22 - 0x8C200907, // 0082 GETMET R8 R4 K7 - 0x58280010, // 0083 LDCONST R10 K16 - 0x582C000A, // 0084 LDCONST R11 K10 - 0x7C200600, // 0085 CALL R8 3 - 0x7C140600, // 0086 CALL R5 3 - 0xB8120600, // 0087 GETNGBL R4 K3 - 0x8C10090C, // 0088 GETMET R4 R4 K12 - 0x8C18070D, // 0089 GETMET R6 R3 K13 - 0x58200017, // 008A LDCONST R8 K23 - 0x78060001, // 008B JMPF R1 #008E - 0x58240004, // 008C LDCONST R9 K4 - 0x70020000, // 008D JMP #008F - 0x58240015, // 008E LDCONST R9 K21 - 0x78060001, // 008F JMPF R1 #0092 - 0x88280105, // 0090 GETMBR R10 R0 K5 - 0x70020000, // 0091 JMP #0093 - 0x88280116, // 0092 GETMBR R10 R0 K22 - 0x7C180800, // 0093 CALL R6 4 - 0x581C0018, // 0094 LDCONST R7 K24 - 0x7C100600, // 0095 CALL R4 3 - 0xA8040001, // 0096 EXBLK 1 1 - 0x70020010, // 0097 JMP #00A9 - 0xAC100002, // 0098 CATCH R4 0 2 - 0x7002000D, // 0099 JMP #00A8 - 0xB81A0600, // 009A GETNGBL R6 K3 - 0x8C180D0C, // 009B GETMET R6 R6 K12 - 0x60200008, // 009C GETGBL R8 G8 - 0x5C240800, // 009D MOVE R9 R4 - 0x7C200200, // 009E CALL R8 1 - 0x00223208, // 009F ADD R8 K25 R8 - 0x0020111A, // 00A0 ADD R8 R8 K26 - 0x60240008, // 00A1 GETGBL R9 G8 - 0x5C280A00, // 00A2 MOVE R10 R5 - 0x7C240200, // 00A3 CALL R9 1 - 0x00201009, // 00A4 ADD R8 R8 R9 - 0x58240018, // 00A5 LDCONST R9 K24 - 0x7C180600, // 00A6 CALL R6 3 - 0x70020000, // 00A7 JMP #00A9 - 0xB0080000, // 00A8 RAISE 2 R0 R0 - 0x8C10011B, // 00A9 GETMET R4 R0 K27 - 0x7C100200, // 00AA CALL R4 1 - 0x80000000, // 00AB RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: mdns_remove_op_discovery_all_fabrics -********************************************************************/ -be_local_closure(Matter_Device_mdns_remove_op_discovery_all_fabrics, /* name */ - be_nested_proto( - 6, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 6]) { /* constants */ - /* K0 */ be_nested_str_weak(sessions), - /* K1 */ be_nested_str_weak(active_fabrics), - /* K2 */ be_nested_str_weak(get_device_id), - /* K3 */ be_nested_str_weak(get_fabric_id), - /* K4 */ be_nested_str_weak(mdns_remove_op_discovery), - /* K5 */ be_nested_str_weak(stop_iteration), - }), - be_str_weak(mdns_remove_op_discovery_all_fabrics), - &be_const_str_solidified, - ( &(const binstruction[22]) { /* code */ - 0x60040010, // 0000 GETGBL R1 G16 - 0x88080100, // 0001 GETMBR R2 R0 K0 - 0x8C080501, // 0002 GETMET R2 R2 K1 - 0x7C080200, // 0003 CALL R2 1 - 0x7C040200, // 0004 CALL R1 1 - 0xA802000B, // 0005 EXBLK 0 #0012 - 0x5C080200, // 0006 MOVE R2 R1 - 0x7C080000, // 0007 CALL R2 0 - 0x8C0C0502, // 0008 GETMET R3 R2 K2 - 0x7C0C0200, // 0009 CALL R3 1 - 0x780E0005, // 000A JMPF R3 #0011 - 0x8C0C0503, // 000B GETMET R3 R2 K3 - 0x7C0C0200, // 000C CALL R3 1 - 0x780E0002, // 000D JMPF R3 #0011 - 0x8C0C0104, // 000E GETMET R3 R0 K4 - 0x5C140400, // 000F MOVE R5 R2 - 0x7C0C0400, // 0010 CALL R3 2 - 0x7001FFF3, // 0011 JMP #0006 - 0x58040005, // 0012 LDCONST R1 K5 - 0xAC040200, // 0013 CATCH R1 1 0 - 0xB0080000, // 0014 RAISE 2 R0 R0 - 0x80000000, // 0015 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: event_fabrics_saved -********************************************************************/ -be_local_closure(Matter_Device_event_fabrics_saved, /* name */ - be_nested_proto( - 3, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 5]) { /* constants */ - /* K0 */ be_nested_str_weak(sessions), - /* K1 */ be_nested_str_weak(count_active_fabrics), - /* K2 */ be_const_int(0), - /* K3 */ be_nested_str_weak(plugins_persist), - /* K4 */ be_nested_str_weak(save_param), - }), - be_str_weak(event_fabrics_saved), - &be_const_str_solidified, - ( &(const binstruction[12]) { /* code */ - 0x88040100, // 0000 GETMBR R1 R0 K0 - 0x8C040301, // 0001 GETMET R1 R1 K1 - 0x7C040200, // 0002 CALL R1 1 - 0x24040302, // 0003 GT R1 R1 K2 - 0x78060005, // 0004 JMPF R1 #000B - 0x88040103, // 0005 GETMBR R1 R0 K3 - 0x74060003, // 0006 JMPT R1 #000B - 0x50040200, // 0007 LDBOOL R1 1 0 - 0x90020601, // 0008 SETMBR R0 K3 R1 - 0x8C040104, // 0009 GETMET R1 R0 K4 - 0x7C040200, // 000A CALL R1 1 - 0x80000000, // 000B RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: stop -********************************************************************/ -be_local_closure(Matter_Device_stop, /* name */ +be_local_closure(Matter_Device_every_second, /* name */ be_nested_proto( 4, /* nstack */ 1, /* argc */ @@ -2064,25 +1546,50 @@ be_local_closure(Matter_Device_stop, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[ 4]) { /* constants */ - /* K0 */ be_nested_str_weak(tasmota), - /* K1 */ be_nested_str_weak(remove_driver), - /* K2 */ be_nested_str_weak(udp_server), - /* K3 */ be_nested_str_weak(stop), + ( &(const bvalue[ 9]) { /* constants */ + /* K0 */ be_nested_str_weak(sessions), + /* K1 */ be_nested_str_weak(every_second), + /* K2 */ be_nested_str_weak(message_handler), + /* K3 */ be_nested_str_weak(commissioning_open), + /* K4 */ be_nested_str_weak(tasmota), + /* K5 */ be_nested_str_weak(time_reached), + /* K6 */ be_const_int(0), + /* K7 */ be_nested_str_weak(plugins), + /* K8 */ be_const_int(1), }), - be_str_weak(stop), + be_str_weak(every_second), &be_const_str_solidified, - ( &(const binstruction[10]) { /* code */ - 0xB8060000, // 0000 GETNGBL R1 K0 + ( &(const binstruction[30]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 0x8C040301, // 0001 GETMET R1 R1 K1 - 0x5C0C0000, // 0002 MOVE R3 R0 - 0x7C040400, // 0003 CALL R1 2 - 0x88040102, // 0004 GETMBR R1 R0 K2 - 0x78060002, // 0005 JMPF R1 #0009 - 0x88040102, // 0006 GETMBR R1 R0 K2 - 0x8C040303, // 0007 GETMET R1 R1 K3 - 0x7C040200, // 0008 CALL R1 1 - 0x80000000, // 0009 RET 0 + 0x7C040200, // 0002 CALL R1 1 + 0x88040102, // 0003 GETMBR R1 R0 K2 + 0x8C040301, // 0004 GETMET R1 R1 K1 + 0x7C040200, // 0005 CALL R1 1 + 0x88040103, // 0006 GETMBR R1 R0 K3 + 0x4C080000, // 0007 LDNIL R2 + 0x20040202, // 0008 NE R1 R1 R2 + 0x78060006, // 0009 JMPF R1 #0011 + 0xB8060800, // 000A GETNGBL R1 K4 + 0x8C040305, // 000B GETMET R1 R1 K5 + 0x880C0103, // 000C GETMBR R3 R0 K3 + 0x7C040400, // 000D CALL R1 2 + 0x78060001, // 000E JMPF R1 #0011 + 0x4C040000, // 000F LDNIL R1 + 0x90020601, // 0010 SETMBR R0 K3 R1 + 0x58040006, // 0011 LDCONST R1 K6 + 0x6008000C, // 0012 GETGBL R2 G12 + 0x880C0107, // 0013 GETMBR R3 R0 K7 + 0x7C080200, // 0014 CALL R2 1 + 0x14080202, // 0015 LT R2 R1 R2 + 0x780A0005, // 0016 JMPF R2 #001D + 0x88080107, // 0017 GETMBR R2 R0 K7 + 0x94080401, // 0018 GETIDX R2 R2 R1 + 0x8C080501, // 0019 GETMET R2 R2 K1 + 0x7C080200, // 001A CALL R2 1 + 0x00040308, // 001B ADD R1 R1 K8 + 0x7001FFF4, // 001C JMP #0012 + 0x80000000, // 001D RET 0 }) ) ); @@ -2090,214 +1597,9 @@ be_local_closure(Matter_Device_stop, /* name */ /******************************************************************** -** Solidified function: stop_basic_commissioning +** Solidified function: get_plugin_class_arg ********************************************************************/ -be_local_closure(Matter_Device_stop_basic_commissioning, /* name */ - be_nested_proto( - 5, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[13]) { /* constants */ - /* K0 */ be_nested_str_weak(is_root_commissioning_open), - /* K1 */ be_nested_str_weak(tasmota), - /* K2 */ be_nested_str_weak(publish_result), - /* K3 */ be_nested_str_weak(_X7B_X22Matter_X22_X3A_X7B_X22Commissioning_X22_X3A0_X7D_X7D), - /* K4 */ be_nested_str_weak(Matter), - /* K5 */ be_nested_str_weak(commissioning_open), - /* K6 */ be_nested_str_weak(mdns_remove_PASE), - /* K7 */ be_nested_str_weak(commissioning_iterations), - /* K8 */ be_nested_str_weak(commissioning_discriminator), - /* K9 */ be_nested_str_weak(commissioning_salt), - /* K10 */ be_nested_str_weak(commissioning_w0), - /* K11 */ be_nested_str_weak(commissioning_L), - /* K12 */ be_nested_str_weak(commissioning_admin_fabric), - }), - be_str_weak(stop_basic_commissioning), - &be_const_str_solidified, - ( &(const binstruction[25]) { /* code */ - 0x8C040100, // 0000 GETMET R1 R0 K0 - 0x7C040200, // 0001 CALL R1 1 - 0x78060004, // 0002 JMPF R1 #0008 - 0xB8060200, // 0003 GETNGBL R1 K1 - 0x8C040302, // 0004 GETMET R1 R1 K2 - 0x580C0003, // 0005 LDCONST R3 K3 - 0x58100004, // 0006 LDCONST R4 K4 - 0x7C040600, // 0007 CALL R1 3 - 0x4C040000, // 0008 LDNIL R1 - 0x90020A01, // 0009 SETMBR R0 K5 R1 - 0x8C040106, // 000A GETMET R1 R0 K6 - 0x7C040200, // 000B CALL R1 1 - 0x4C040000, // 000C LDNIL R1 - 0x90020E01, // 000D SETMBR R0 K7 R1 - 0x4C040000, // 000E LDNIL R1 - 0x90021001, // 000F SETMBR R0 K8 R1 - 0x4C040000, // 0010 LDNIL R1 - 0x90021201, // 0011 SETMBR R0 K9 R1 - 0x4C040000, // 0012 LDNIL R1 - 0x90021401, // 0013 SETMBR R0 K10 R1 - 0x4C040000, // 0014 LDNIL R1 - 0x90021601, // 0015 SETMBR R0 K11 R1 - 0x4C040000, // 0016 LDNIL R1 - 0x90021801, // 0017 SETMBR R0 K12 R1 - 0x80000000, // 0018 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: start_basic_commissioning -********************************************************************/ -be_local_closure(Matter_Device_start_basic_commissioning, /* name */ - be_nested_proto( - 13, /* nstack */ - 8, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 1, /* has sup protos */ - ( &(const struct bproto*[ 2]) { - be_nested_proto( - 4, /* nstack */ - 0, /* argc */ - 0, /* varg */ - 1, /* has upvals */ - ( &(const bupvaldesc[ 1]) { /* upvals */ - be_local_const_upval(1, 0), - }), - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 4]) { /* constants */ - /* K0 */ be_nested_str_weak(mdns_announce_PASE), - /* K1 */ be_nested_str_weak(tasmota), - /* K2 */ be_nested_str_weak(remove_rule), - /* K3 */ be_nested_str_weak(Wifi_X23Connected), - }), - be_str_weak(_anonymous_), - &be_const_str_solidified, - ( &(const binstruction[ 9]) { /* code */ - 0x68000000, // 0000 GETUPV R0 U0 - 0x8C000100, // 0001 GETMET R0 R0 K0 - 0x7C000200, // 0002 CALL R0 1 - 0xB8020200, // 0003 GETNGBL R0 K1 - 0x8C000102, // 0004 GETMET R0 R0 K2 - 0x58080003, // 0005 LDCONST R2 K3 - 0x580C0000, // 0006 LDCONST R3 K0 - 0x7C000600, // 0007 CALL R0 3 - 0x80000000, // 0008 RET 0 - }) - ), - be_nested_proto( - 4, /* nstack */ - 0, /* argc */ - 0, /* varg */ - 1, /* has upvals */ - ( &(const bupvaldesc[ 1]) { /* upvals */ - be_local_const_upval(1, 0), - }), - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 4]) { /* constants */ - /* K0 */ be_nested_str_weak(mdns_announce_PASE), - /* K1 */ be_nested_str_weak(tasmota), - /* K2 */ be_nested_str_weak(remove_rule), - /* K3 */ be_nested_str_weak(Eth_X23Connected), - }), - be_str_weak(_anonymous_), - &be_const_str_solidified, - ( &(const binstruction[ 9]) { /* code */ - 0x68000000, // 0000 GETUPV R0 U0 - 0x8C000100, // 0001 GETMET R0 R0 K0 - 0x7C000200, // 0002 CALL R0 1 - 0xB8020200, // 0003 GETNGBL R0 K1 - 0x8C000102, // 0004 GETMET R0 R0 K2 - 0x58080003, // 0005 LDCONST R2 K3 - 0x580C0000, // 0006 LDCONST R3 K0 - 0x7C000600, // 0007 CALL R0 3 - 0x80000000, // 0008 RET 0 - }) - ), - }), - 1, /* has constants */ - ( &(const bvalue[16]) { /* constants */ - /* K0 */ be_nested_str_weak(commissioning_open), - /* K1 */ be_nested_str_weak(tasmota), - /* K2 */ be_nested_str_weak(millis), - /* K3 */ be_nested_str_weak(commissioning_iterations), - /* K4 */ be_nested_str_weak(commissioning_discriminator), - /* K5 */ be_nested_str_weak(commissioning_salt), - /* K6 */ be_nested_str_weak(commissioning_w0), - /* K7 */ be_nested_str_weak(commissioning_L), - /* K8 */ be_nested_str_weak(commissioning_admin_fabric), - /* K9 */ be_nested_str_weak(wifi), - /* K10 */ be_nested_str_weak(up), - /* K11 */ be_nested_str_weak(eth), - /* K12 */ be_nested_str_weak(mdns_announce_PASE), - /* K13 */ be_nested_str_weak(add_rule), - /* K14 */ be_nested_str_weak(Wifi_X23Connected), - /* K15 */ be_nested_str_weak(Eth_X23Connected), - }), - be_str_weak(start_basic_commissioning), - &be_const_str_solidified, - ( &(const binstruction[40]) { /* code */ - 0xB8220200, // 0000 GETNGBL R8 K1 - 0x8C201102, // 0001 GETMET R8 R8 K2 - 0x7C200200, // 0002 CALL R8 1 - 0x542603E7, // 0003 LDINT R9 1000 - 0x08240209, // 0004 MUL R9 R1 R9 - 0x00201009, // 0005 ADD R8 R8 R9 - 0x90020008, // 0006 SETMBR R0 K0 R8 - 0x90020602, // 0007 SETMBR R0 K3 R2 - 0x90020803, // 0008 SETMBR R0 K4 R3 - 0x90020A04, // 0009 SETMBR R0 K5 R4 - 0x90020C05, // 000A SETMBR R0 K6 R5 - 0x90020E06, // 000B SETMBR R0 K7 R6 - 0x90021007, // 000C SETMBR R0 K8 R7 - 0xB8220200, // 000D GETNGBL R8 K1 - 0x8C201109, // 000E GETMET R8 R8 K9 - 0x7C200200, // 000F CALL R8 1 - 0x9420110A, // 0010 GETIDX R8 R8 K10 - 0x74220004, // 0011 JMPT R8 #0017 - 0xB8220200, // 0012 GETNGBL R8 K1 - 0x8C20110B, // 0013 GETMET R8 R8 K11 - 0x7C200200, // 0014 CALL R8 1 - 0x9420110A, // 0015 GETIDX R8 R8 K10 - 0x78220002, // 0016 JMPF R8 #001A - 0x8C20010C, // 0017 GETMET R8 R0 K12 - 0x7C200200, // 0018 CALL R8 1 - 0x7002000B, // 0019 JMP #0026 - 0xB8220200, // 001A GETNGBL R8 K1 - 0x8C20110D, // 001B GETMET R8 R8 K13 - 0x5828000E, // 001C LDCONST R10 K14 - 0x842C0000, // 001D CLOSURE R11 P0 - 0x5830000C, // 001E LDCONST R12 K12 - 0x7C200800, // 001F CALL R8 4 - 0xB8220200, // 0020 GETNGBL R8 K1 - 0x8C20110D, // 0021 GETMET R8 R8 K13 - 0x5828000F, // 0022 LDCONST R10 K15 - 0x842C0001, // 0023 CLOSURE R11 P1 - 0x5830000C, // 0024 LDCONST R12 K12 - 0x7C200800, // 0025 CALL R8 4 - 0xA0000000, // 0026 CLOSE R0 - 0x80000000, // 0027 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: msg_send -********************************************************************/ -be_local_closure(Matter_Device_msg_send, /* name */ +be_local_closure(Matter_Device_get_plugin_class_arg, /* name */ be_nested_proto( 5, /* nstack */ 2, /* argc */ @@ -2307,78 +1609,24 @@ be_local_closure(Matter_Device_msg_send, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[ 2]) { /* constants */ - /* K0 */ be_nested_str_weak(udp_server), - /* K1 */ be_nested_str_weak(send_UDP), + ( &(const bvalue[ 4]) { /* constants */ + /* K0 */ be_nested_str_weak(plugins_classes), + /* K1 */ be_nested_str_weak(find), + /* K2 */ be_nested_str_weak(ARG), + /* K3 */ be_nested_str_weak(), }), - be_str_weak(msg_send), + be_str_weak(get_plugin_class_arg), &be_const_str_solidified, - ( &(const binstruction[ 5]) { /* code */ + ( &(const binstruction[ 9]) { /* code */ 0x88080100, // 0000 GETMBR R2 R0 K0 0x8C080501, // 0001 GETMET R2 R2 K1 0x5C100200, // 0002 MOVE R4 R1 0x7C080400, // 0003 CALL R2 2 - 0x80040400, // 0004 RET 1 R2 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: start_commissioning_complete_deferred -********************************************************************/ -be_local_closure(Matter_Device_start_commissioning_complete_deferred, /* name */ - be_nested_proto( - 6, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 1, /* has sup protos */ - ( &(const struct bproto*[ 1]) { - be_nested_proto( - 3, /* nstack */ - 0, /* argc */ - 0, /* varg */ - 1, /* has upvals */ - ( &(const bupvaldesc[ 2]) { /* upvals */ - be_local_const_upval(1, 0), - be_local_const_upval(1, 1), - }), - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 1]) { /* constants */ - /* K0 */ be_nested_str_weak(start_commissioning_complete), - }), - be_str_weak(_X3Clambda_X3E), - &be_const_str_solidified, - ( &(const binstruction[ 5]) { /* code */ - 0x68000000, // 0000 GETUPV R0 U0 - 0x8C000100, // 0001 GETMET R0 R0 K0 - 0x68080001, // 0002 GETUPV R2 U1 - 0x7C000400, // 0003 CALL R0 2 - 0x80040000, // 0004 RET 1 R0 - }) - ), - }), - 1, /* has constants */ - ( &(const bvalue[ 3]) { /* constants */ - /* K0 */ be_nested_str_weak(tasmota), - /* K1 */ be_nested_str_weak(set_timer), - /* K2 */ be_const_int(0), - }), - be_str_weak(start_commissioning_complete_deferred), - &be_const_str_solidified, - ( &(const binstruction[ 7]) { /* code */ - 0xB80A0000, // 0000 GETNGBL R2 K0 - 0x8C080501, // 0001 GETMET R2 R2 K1 - 0x58100002, // 0002 LDCONST R4 K2 - 0x84140000, // 0003 CLOSURE R5 P0 - 0x7C080600, // 0004 CALL R2 3 - 0xA0000000, // 0005 CLOSE R0 - 0x80000000, // 0006 RET 0 + 0x780A0001, // 0004 JMPF R2 #0007 + 0x880C0502, // 0005 GETMBR R3 R2 K2 + 0x70020000, // 0006 JMP #0008 + 0x580C0003, // 0007 LDCONST R3 K3 + 0x80040600, // 0008 RET 1 R3 }) ) ); @@ -2422,1379 +1670,6 @@ be_local_closure(Matter_Device_is_root_commissioning_open, /* name */ /*******************************************************************/ -/******************************************************************** -** Solidified function: _load_plugins_config -********************************************************************/ -be_local_closure(Matter_Device__load_plugins_config, /* name */ - be_nested_proto( - 19, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[27]) { /* constants */ - /* K0 */ be_nested_str_weak(string), - /* K1 */ be_nested_str_weak(k2l_num), - /* K2 */ be_nested_str_weak(tasmota), - /* K3 */ be_nested_str_weak(log), - /* K4 */ be_nested_str_weak(MTR_X3A_X20endpoints_X20to_X20be_X20configured_X20), - /* K5 */ be_const_int(3), - /* K6 */ be_nested_str_weak(format), - /* K7 */ be_nested_str_weak(MTR_X3A_X20endpoint_X20_X25i_X20config_X20_X25s), - /* K8 */ be_nested_str_weak(find), - /* K9 */ be_nested_str_weak(type), - /* K10 */ be_nested_str_weak(MTR_X3A_X20no_X20class_X20name_X2C_X20skipping), - /* K11 */ be_nested_str_weak(plugins_classes), - /* K12 */ be_nested_str_weak(MTR_X3A_X20unknown_X20class_X20name_X20_X27), - /* K13 */ be_nested_str_weak(_X27_X20skipping), - /* K14 */ be_const_int(2), - /* K15 */ be_nested_str_weak(plugins), - /* K16 */ be_nested_str_weak(push), - /* K17 */ be_nested_str_weak(), - /* K18 */ be_nested_str_weak(k2l), - /* K19 */ be_nested_str_weak(_X20_X25s_X3A_X25s), - /* K20 */ be_nested_str_weak(stop_iteration), - /* K21 */ be_nested_str_weak(MTR_X3A_X20endpoint_X3A_X25i_X20type_X3A_X25s_X25s), - /* K22 */ be_nested_str_weak(MTR_X3A_X20Exception), - /* K23 */ be_nested_str_weak(_X7C), - /* K24 */ be_nested_str_weak(publish_result), - /* K25 */ be_nested_str_weak(_X7B_X22Matter_X22_X3A_X7B_X22Initialized_X22_X3A1_X7D_X7D), - /* K26 */ be_nested_str_weak(Matter), - }), - be_str_weak(_load_plugins_config), - &be_const_str_solidified, - ( &(const binstruction[133]) { /* code */ - 0xA40A0000, // 0000 IMPORT R2 K0 - 0x8C0C0101, // 0001 GETMET R3 R0 K1 - 0x5C140200, // 0002 MOVE R5 R1 - 0x7C0C0400, // 0003 CALL R3 2 - 0xB8120400, // 0004 GETNGBL R4 K2 - 0x8C100903, // 0005 GETMET R4 R4 K3 - 0x60180008, // 0006 GETGBL R6 G8 - 0x5C1C0600, // 0007 MOVE R7 R3 - 0x7C180200, // 0008 CALL R6 1 - 0x001A0806, // 0009 ADD R6 K4 R6 - 0x581C0005, // 000A LDCONST R7 K5 - 0x7C100600, // 000B CALL R4 3 - 0x60100010, // 000C GETGBL R4 G16 - 0x5C140600, // 000D MOVE R5 R3 - 0x7C100200, // 000E CALL R4 1 - 0xA802006B, // 000F EXBLK 0 #007C - 0x5C140800, // 0010 MOVE R5 R4 - 0x7C140000, // 0011 CALL R5 0 - 0xA8020056, // 0012 EXBLK 0 #006A - 0x60180008, // 0013 GETGBL R6 G8 - 0x5C1C0A00, // 0014 MOVE R7 R5 - 0x7C180200, // 0015 CALL R6 1 - 0x94180206, // 0016 GETIDX R6 R1 R6 - 0xB81E0400, // 0017 GETNGBL R7 K2 - 0x8C1C0F03, // 0018 GETMET R7 R7 K3 - 0x8C240506, // 0019 GETMET R9 R2 K6 - 0x582C0007, // 001A LDCONST R11 K7 - 0x5C300A00, // 001B MOVE R12 R5 - 0x5C340C00, // 001C MOVE R13 R6 - 0x7C240800, // 001D CALL R9 4 - 0x58280005, // 001E LDCONST R10 K5 - 0x7C1C0600, // 001F CALL R7 3 - 0x8C1C0D08, // 0020 GETMET R7 R6 K8 - 0x58240009, // 0021 LDCONST R9 K9 - 0x7C1C0400, // 0022 CALL R7 2 - 0x4C200000, // 0023 LDNIL R8 - 0x1C200E08, // 0024 EQ R8 R7 R8 - 0x78220006, // 0025 JMPF R8 #002D - 0xB8220400, // 0026 GETNGBL R8 K2 - 0x8C201103, // 0027 GETMET R8 R8 K3 - 0x5828000A, // 0028 LDCONST R10 K10 - 0x582C0005, // 0029 LDCONST R11 K5 - 0x7C200600, // 002A CALL R8 3 - 0xA8040001, // 002B EXBLK 1 1 - 0x7001FFE2, // 002C JMP #0010 - 0x8820010B, // 002D GETMBR R8 R0 K11 - 0x8C201108, // 002E GETMET R8 R8 K8 - 0x5C280E00, // 002F MOVE R10 R7 - 0x7C200400, // 0030 CALL R8 2 - 0x4C240000, // 0031 LDNIL R9 - 0x1C241009, // 0032 EQ R9 R8 R9 - 0x7826000A, // 0033 JMPF R9 #003F - 0xB8260400, // 0034 GETNGBL R9 K2 - 0x8C241303, // 0035 GETMET R9 R9 K3 - 0x602C0008, // 0036 GETGBL R11 G8 - 0x5C300E00, // 0037 MOVE R12 R7 - 0x7C2C0200, // 0038 CALL R11 1 - 0x002E180B, // 0039 ADD R11 K12 R11 - 0x002C170D, // 003A ADD R11 R11 K13 - 0x5830000E, // 003B LDCONST R12 K14 - 0x7C240600, // 003C CALL R9 3 - 0xA8040001, // 003D EXBLK 1 1 - 0x7001FFD0, // 003E JMP #0010 - 0x5C241000, // 003F MOVE R9 R8 - 0x5C280000, // 0040 MOVE R10 R0 - 0x5C2C0A00, // 0041 MOVE R11 R5 - 0x5C300C00, // 0042 MOVE R12 R6 - 0x7C240600, // 0043 CALL R9 3 - 0x8828010F, // 0044 GETMBR R10 R0 K15 - 0x8C281510, // 0045 GETMET R10 R10 K16 - 0x5C301200, // 0046 MOVE R12 R9 - 0x7C280400, // 0047 CALL R10 2 - 0x58280011, // 0048 LDCONST R10 K17 - 0x602C0010, // 0049 GETGBL R11 G16 - 0x8C300112, // 004A GETMET R12 R0 K18 - 0x5C380C00, // 004B MOVE R14 R6 - 0x7C300400, // 004C CALL R12 2 - 0x7C2C0200, // 004D CALL R11 1 - 0xA802000B, // 004E EXBLK 0 #005B - 0x5C301600, // 004F MOVE R12 R11 - 0x7C300000, // 0050 CALL R12 0 - 0x1C341909, // 0051 EQ R13 R12 K9 - 0x78360000, // 0052 JMPF R13 #0054 - 0x7001FFFA, // 0053 JMP #004F - 0x8C340506, // 0054 GETMET R13 R2 K6 - 0x583C0013, // 0055 LDCONST R15 K19 - 0x5C401800, // 0056 MOVE R16 R12 - 0x94440C0C, // 0057 GETIDX R17 R6 R12 - 0x7C340800, // 0058 CALL R13 4 - 0x0028140D, // 0059 ADD R10 R10 R13 - 0x7001FFF3, // 005A JMP #004F - 0x582C0014, // 005B LDCONST R11 K20 - 0xAC2C0200, // 005C CATCH R11 1 0 - 0xB0080000, // 005D RAISE 2 R0 R0 - 0xB82E0400, // 005E GETNGBL R11 K2 - 0x8C2C1703, // 005F GETMET R11 R11 K3 - 0x8C340506, // 0060 GETMET R13 R2 K6 - 0x583C0015, // 0061 LDCONST R15 K21 - 0x5C400A00, // 0062 MOVE R16 R5 - 0x5C440E00, // 0063 MOVE R17 R7 - 0x5C481400, // 0064 MOVE R18 R10 - 0x7C340A00, // 0065 CALL R13 5 - 0x5838000E, // 0066 LDCONST R14 K14 - 0x7C2C0600, // 0067 CALL R11 3 - 0xA8040001, // 0068 EXBLK 1 1 - 0x70020010, // 0069 JMP #007B - 0xAC180002, // 006A CATCH R6 0 2 - 0x7002000D, // 006B JMP #007A - 0xB8220400, // 006C GETNGBL R8 K2 - 0x8C201103, // 006D GETMET R8 R8 K3 - 0x60280008, // 006E GETGBL R10 G8 - 0x5C2C0C00, // 006F MOVE R11 R6 - 0x7C280200, // 0070 CALL R10 1 - 0x002A2C0A, // 0071 ADD R10 K22 R10 - 0x00281517, // 0072 ADD R10 R10 K23 - 0x602C0008, // 0073 GETGBL R11 G8 - 0x5C300E00, // 0074 MOVE R12 R7 - 0x7C2C0200, // 0075 CALL R11 1 - 0x0028140B, // 0076 ADD R10 R10 R11 - 0x582C000E, // 0077 LDCONST R11 K14 - 0x7C200600, // 0078 CALL R8 3 - 0x70020000, // 0079 JMP #007B - 0xB0080000, // 007A RAISE 2 R0 R0 - 0x7001FF93, // 007B JMP #0010 - 0x58100014, // 007C LDCONST R4 K20 - 0xAC100200, // 007D CATCH R4 1 0 - 0xB0080000, // 007E RAISE 2 R0 R0 - 0xB8120400, // 007F GETNGBL R4 K2 - 0x8C100918, // 0080 GETMET R4 R4 K24 - 0x58180019, // 0081 LDCONST R6 K25 - 0x581C001A, // 0082 LDCONST R7 K26 - 0x7C100600, // 0083 CALL R4 3 - 0x80000000, // 0084 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: received_ack -********************************************************************/ -be_local_closure(Matter_Device_received_ack, /* name */ - be_nested_proto( - 5, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 2]) { /* constants */ - /* K0 */ be_nested_str_weak(udp_server), - /* K1 */ be_nested_str_weak(received_ack), - }), - be_str_weak(received_ack), - &be_const_str_solidified, - ( &(const binstruction[ 5]) { /* code */ - 0x88080100, // 0000 GETMBR R2 R0 K0 - 0x8C080501, // 0001 GETMET R2 R2 K1 - 0x5C100200, // 0002 MOVE R4 R1 - 0x7C080400, // 0003 CALL R2 2 - 0x80040400, // 0004 RET 1 R2 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: MtrJoin -********************************************************************/ -be_local_closure(Matter_Device_MtrJoin, /* name */ - be_nested_proto( - 8, /* nstack */ - 5, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 4]) { /* constants */ - /* K0 */ be_nested_str_weak(start_root_basic_commissioning), - /* K1 */ be_nested_str_weak(stop_basic_commissioning), - /* K2 */ be_nested_str_weak(tasmota), - /* K3 */ be_nested_str_weak(resp_cmnd_done), - }), - be_str_weak(MtrJoin), - &be_const_str_solidified, - ( &(const binstruction[13]) { /* code */ - 0x60140009, // 0000 GETGBL R5 G9 - 0x5C180600, // 0001 MOVE R6 R3 - 0x7C140200, // 0002 CALL R5 1 - 0x78160002, // 0003 JMPF R5 #0007 - 0x8C180100, // 0004 GETMET R6 R0 K0 - 0x7C180200, // 0005 CALL R6 1 - 0x70020001, // 0006 JMP #0009 - 0x8C180101, // 0007 GETMET R6 R0 K1 - 0x7C180200, // 0008 CALL R6 1 - 0xB81A0400, // 0009 GETNGBL R6 K2 - 0x8C180D03, // 000A GETMET R6 R6 K3 - 0x7C180200, // 000B CALL R6 1 - 0x80000000, // 000C RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: autoconf_device_map -********************************************************************/ -be_local_closure(Matter_Device_autoconf_device_map, /* name */ - be_nested_proto( - 16, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[36]) { /* constants */ - /* K0 */ be_nested_str_weak(json), - /* K1 */ be_nested_str_weak(0), - /* K2 */ be_nested_str_weak(type), - /* K3 */ be_nested_str_weak(root), - /* K4 */ be_const_int(1), - /* K5 */ be_nested_str_weak(light), - /* K6 */ be_nested_str_weak(get), - /* K7 */ be_nested_str_weak(find), - /* K8 */ be_nested_str_weak(channels), - /* K9 */ be_nested_str_weak(), - /* K10 */ be_const_int(0), - /* K11 */ be_nested_str_weak(light1), - /* K12 */ be_const_int(2), - /* K13 */ be_nested_str_weak(light2), - /* K14 */ be_nested_str_weak(light3), - /* K15 */ be_nested_str_weak(tasmota), - /* K16 */ be_nested_str_weak(get_power), - /* K17 */ be_nested_str_weak(relay), - /* K18 */ be_nested_str_weak(load), - /* K19 */ be_nested_str_weak(read_sensors), - /* K20 */ be_nested_str_weak(k2l), - /* K21 */ be_nested_str_weak(contains), - /* K22 */ be_nested_str_weak(Temperature), - /* K23 */ be_nested_str_weak(_X23Temperature), - /* K24 */ be_nested_str_weak(temperature), - /* K25 */ be_nested_str_weak(filter), - /* K26 */ be_nested_str_weak(stop_iteration), - /* K27 */ be_nested_str_weak(Pressure), - /* K28 */ be_nested_str_weak(_X23Pressure), - /* K29 */ be_nested_str_weak(pressure), - /* K30 */ be_nested_str_weak(Illuminance), - /* K31 */ be_nested_str_weak(_X23Illuminance), - /* K32 */ be_nested_str_weak(illuminance), - /* K33 */ be_nested_str_weak(Humidity), - /* K34 */ be_nested_str_weak(_X23Humidity), - /* K35 */ be_nested_str_weak(humidity), - }), - be_str_weak(autoconf_device_map), - &be_const_str_solidified, - ( &(const binstruction[235]) { /* code */ - 0xA4060000, // 0000 IMPORT R1 K0 - 0x60080013, // 0001 GETGBL R2 G19 - 0x7C080000, // 0002 CALL R2 0 - 0x600C0013, // 0003 GETGBL R3 G19 - 0x7C0C0000, // 0004 CALL R3 0 - 0x980E0503, // 0005 SETIDX R3 K2 K3 - 0x980A0203, // 0006 SETIDX R2 K1 R3 - 0x580C0004, // 0007 LDCONST R3 K4 - 0x50100000, // 0008 LDBOOL R4 0 0 - 0xA4160A00, // 0009 IMPORT R5 K5 - 0x8C180B06, // 000A GETMET R6 R5 K6 - 0x7C180200, // 000B CALL R6 1 - 0x4C1C0000, // 000C LDNIL R7 - 0x201C0C07, // 000D NE R7 R6 R7 - 0x781E0024, // 000E JMPF R7 #0034 - 0x601C000C, // 000F GETGBL R7 G12 - 0x8C200D07, // 0010 GETMET R8 R6 K7 - 0x58280008, // 0011 LDCONST R10 K8 - 0x582C0009, // 0012 LDCONST R11 K9 - 0x7C200600, // 0013 CALL R8 3 - 0x7C1C0200, // 0014 CALL R7 1 - 0x24200F0A, // 0015 GT R8 R7 K10 - 0x7822001C, // 0016 JMPF R8 #0034 - 0x1C200F04, // 0017 EQ R8 R7 K4 - 0x78220007, // 0018 JMPF R8 #0021 - 0x60200008, // 0019 GETGBL R8 G8 - 0x5C240600, // 001A MOVE R9 R3 - 0x7C200200, // 001B CALL R8 1 - 0x60240013, // 001C GETGBL R9 G19 - 0x7C240000, // 001D CALL R9 0 - 0x9826050B, // 001E SETIDX R9 K2 K11 - 0x98081009, // 001F SETIDX R2 R8 R9 - 0x70020010, // 0020 JMP #0032 - 0x1C200F0C, // 0021 EQ R8 R7 K12 - 0x78220007, // 0022 JMPF R8 #002B - 0x60200008, // 0023 GETGBL R8 G8 - 0x5C240600, // 0024 MOVE R9 R3 - 0x7C200200, // 0025 CALL R8 1 - 0x60240013, // 0026 GETGBL R9 G19 - 0x7C240000, // 0027 CALL R9 0 - 0x9826050D, // 0028 SETIDX R9 K2 K13 - 0x98081009, // 0029 SETIDX R2 R8 R9 - 0x70020006, // 002A JMP #0032 - 0x60200008, // 002B GETGBL R8 G8 - 0x5C240600, // 002C MOVE R9 R3 - 0x7C200200, // 002D CALL R8 1 - 0x60240013, // 002E GETGBL R9 G19 - 0x7C240000, // 002F CALL R9 0 - 0x9826050E, // 0030 SETIDX R9 K2 K14 - 0x98081009, // 0031 SETIDX R2 R8 R9 - 0x50100200, // 0032 LDBOOL R4 1 0 - 0x000C0704, // 0033 ADD R3 R3 K4 - 0x601C000C, // 0034 GETGBL R7 G12 - 0xB8221E00, // 0035 GETNGBL R8 K15 - 0x8C201110, // 0036 GETMET R8 R8 K16 - 0x7C200200, // 0037 CALL R8 1 - 0x7C1C0200, // 0038 CALL R7 1 - 0x5820000A, // 0039 LDCONST R8 K10 - 0x78120000, // 003A JMPF R4 #003C - 0x041C0F04, // 003B SUB R7 R7 K4 - 0x14241007, // 003C LT R9 R8 R7 - 0x7826000A, // 003D JMPF R9 #0049 - 0x60240008, // 003E GETGBL R9 G8 - 0x5C280600, // 003F MOVE R10 R3 - 0x7C240200, // 0040 CALL R9 1 - 0x60280013, // 0041 GETGBL R10 G19 - 0x7C280000, // 0042 CALL R10 0 - 0x982A0511, // 0043 SETIDX R10 K2 K17 - 0x982A2208, // 0044 SETIDX R10 K17 R8 - 0x9808120A, // 0045 SETIDX R2 R9 R10 - 0x00201104, // 0046 ADD R8 R8 K4 - 0x000C0704, // 0047 ADD R3 R3 K4 - 0x7001FFF2, // 0048 JMP #003C - 0x8C240312, // 0049 GETMET R9 R1 K18 - 0xB82E1E00, // 004A GETNGBL R11 K15 - 0x8C2C1713, // 004B GETMET R11 R11 K19 - 0x7C2C0200, // 004C CALL R11 1 - 0x7C240400, // 004D CALL R9 2 - 0x540E001F, // 004E LDINT R3 32 - 0x60280010, // 004F GETGBL R10 G16 - 0x8C2C0114, // 0050 GETMET R11 R0 K20 - 0x5C341200, // 0051 MOVE R13 R9 - 0x7C2C0400, // 0052 CALL R11 2 - 0x7C280200, // 0053 CALL R10 1 - 0xA802001C, // 0054 EXBLK 0 #0072 - 0x5C2C1400, // 0055 MOVE R11 R10 - 0x7C2C0000, // 0056 CALL R11 0 - 0x9430120B, // 0057 GETIDX R12 R9 R11 - 0x6034000F, // 0058 GETGBL R13 G15 - 0x5C381800, // 0059 MOVE R14 R12 - 0x603C0013, // 005A GETGBL R15 G19 - 0x7C340400, // 005B CALL R13 2 - 0x7836000D, // 005C JMPF R13 #006B - 0x8C341915, // 005D GETMET R13 R12 K21 - 0x583C0016, // 005E LDCONST R15 K22 - 0x7C340400, // 005F CALL R13 2 - 0x78360009, // 0060 JMPF R13 #006B - 0x00341717, // 0061 ADD R13 R11 K23 - 0x60380008, // 0062 GETGBL R14 G8 - 0x5C3C0600, // 0063 MOVE R15 R3 - 0x7C380200, // 0064 CALL R14 1 - 0x603C0013, // 0065 GETGBL R15 G19 - 0x7C3C0000, // 0066 CALL R15 0 - 0x983E0518, // 0067 SETIDX R15 K2 K24 - 0x983E320D, // 0068 SETIDX R15 K25 R13 - 0x98081C0F, // 0069 SETIDX R2 R14 R15 - 0x000C0704, // 006A ADD R3 R3 K4 - 0x54360027, // 006B LDINT R13 40 - 0x2434060D, // 006C GT R13 R3 R13 - 0x78360000, // 006D JMPF R13 #006F - 0x70020000, // 006E JMP #0070 - 0x7001FFE4, // 006F JMP #0055 - 0xA8040001, // 0070 EXBLK 1 1 - 0x70020002, // 0071 JMP #0075 - 0x5828001A, // 0072 LDCONST R10 K26 - 0xAC280200, // 0073 CATCH R10 1 0 - 0xB0080000, // 0074 RAISE 2 R0 R0 - 0x540E0027, // 0075 LDINT R3 40 - 0x60280010, // 0076 GETGBL R10 G16 - 0x8C2C0114, // 0077 GETMET R11 R0 K20 - 0x5C341200, // 0078 MOVE R13 R9 - 0x7C2C0400, // 0079 CALL R11 2 - 0x7C280200, // 007A CALL R10 1 - 0xA802001C, // 007B EXBLK 0 #0099 - 0x5C2C1400, // 007C MOVE R11 R10 - 0x7C2C0000, // 007D CALL R11 0 - 0x9430120B, // 007E GETIDX R12 R9 R11 - 0x6034000F, // 007F GETGBL R13 G15 - 0x5C381800, // 0080 MOVE R14 R12 - 0x603C0013, // 0081 GETGBL R15 G19 - 0x7C340400, // 0082 CALL R13 2 - 0x7836000D, // 0083 JMPF R13 #0092 - 0x8C341915, // 0084 GETMET R13 R12 K21 - 0x583C001B, // 0085 LDCONST R15 K27 - 0x7C340400, // 0086 CALL R13 2 - 0x78360009, // 0087 JMPF R13 #0092 - 0x0034171C, // 0088 ADD R13 R11 K28 - 0x60380008, // 0089 GETGBL R14 G8 - 0x5C3C0600, // 008A MOVE R15 R3 - 0x7C380200, // 008B CALL R14 1 - 0x603C0013, // 008C GETGBL R15 G19 - 0x7C3C0000, // 008D CALL R15 0 - 0x983E051D, // 008E SETIDX R15 K2 K29 - 0x983E320D, // 008F SETIDX R15 K25 R13 - 0x98081C0F, // 0090 SETIDX R2 R14 R15 - 0x000C0704, // 0091 ADD R3 R3 K4 - 0x5436002E, // 0092 LDINT R13 47 - 0x2434060D, // 0093 GT R13 R3 R13 - 0x78360000, // 0094 JMPF R13 #0096 - 0x70020000, // 0095 JMP #0097 - 0x7001FFE4, // 0096 JMP #007C - 0xA8040001, // 0097 EXBLK 1 1 - 0x70020002, // 0098 JMP #009C - 0x5828001A, // 0099 LDCONST R10 K26 - 0xAC280200, // 009A CATCH R10 1 0 - 0xB0080000, // 009B RAISE 2 R0 R0 - 0x540E002F, // 009C LDINT R3 48 - 0x60280010, // 009D GETGBL R10 G16 - 0x8C2C0114, // 009E GETMET R11 R0 K20 - 0x5C341200, // 009F MOVE R13 R9 - 0x7C2C0400, // 00A0 CALL R11 2 - 0x7C280200, // 00A1 CALL R10 1 - 0xA802001C, // 00A2 EXBLK 0 #00C0 - 0x5C2C1400, // 00A3 MOVE R11 R10 - 0x7C2C0000, // 00A4 CALL R11 0 - 0x9430120B, // 00A5 GETIDX R12 R9 R11 - 0x6034000F, // 00A6 GETGBL R13 G15 - 0x5C381800, // 00A7 MOVE R14 R12 - 0x603C0013, // 00A8 GETGBL R15 G19 - 0x7C340400, // 00A9 CALL R13 2 - 0x7836000D, // 00AA JMPF R13 #00B9 - 0x8C341915, // 00AB GETMET R13 R12 K21 - 0x583C001E, // 00AC LDCONST R15 K30 - 0x7C340400, // 00AD CALL R13 2 - 0x78360009, // 00AE JMPF R13 #00B9 - 0x0034171F, // 00AF ADD R13 R11 K31 - 0x60380008, // 00B0 GETGBL R14 G8 - 0x5C3C0600, // 00B1 MOVE R15 R3 - 0x7C380200, // 00B2 CALL R14 1 - 0x603C0013, // 00B3 GETGBL R15 G19 - 0x7C3C0000, // 00B4 CALL R15 0 - 0x983E0520, // 00B5 SETIDX R15 K2 K32 - 0x983E320D, // 00B6 SETIDX R15 K25 R13 - 0x98081C0F, // 00B7 SETIDX R2 R14 R15 - 0x000C0704, // 00B8 ADD R3 R3 K4 - 0x54360037, // 00B9 LDINT R13 56 - 0x2434060D, // 00BA GT R13 R3 R13 - 0x78360000, // 00BB JMPF R13 #00BD - 0x70020000, // 00BC JMP #00BE - 0x7001FFE4, // 00BD JMP #00A3 - 0xA8040001, // 00BE EXBLK 1 1 - 0x70020002, // 00BF JMP #00C3 - 0x5828001A, // 00C0 LDCONST R10 K26 - 0xAC280200, // 00C1 CATCH R10 1 0 - 0xB0080000, // 00C2 RAISE 2 R0 R0 - 0x540E0037, // 00C3 LDINT R3 56 - 0x60280010, // 00C4 GETGBL R10 G16 - 0x8C2C0114, // 00C5 GETMET R11 R0 K20 - 0x5C341200, // 00C6 MOVE R13 R9 - 0x7C2C0400, // 00C7 CALL R11 2 - 0x7C280200, // 00C8 CALL R10 1 - 0xA802001C, // 00C9 EXBLK 0 #00E7 - 0x5C2C1400, // 00CA MOVE R11 R10 - 0x7C2C0000, // 00CB CALL R11 0 - 0x9430120B, // 00CC GETIDX R12 R9 R11 - 0x6034000F, // 00CD GETGBL R13 G15 - 0x5C381800, // 00CE MOVE R14 R12 - 0x603C0013, // 00CF GETGBL R15 G19 - 0x7C340400, // 00D0 CALL R13 2 - 0x7836000D, // 00D1 JMPF R13 #00E0 - 0x8C341915, // 00D2 GETMET R13 R12 K21 - 0x583C0021, // 00D3 LDCONST R15 K33 - 0x7C340400, // 00D4 CALL R13 2 - 0x78360009, // 00D5 JMPF R13 #00E0 - 0x00341722, // 00D6 ADD R13 R11 K34 - 0x60380008, // 00D7 GETGBL R14 G8 - 0x5C3C0600, // 00D8 MOVE R15 R3 - 0x7C380200, // 00D9 CALL R14 1 - 0x603C0013, // 00DA GETGBL R15 G19 - 0x7C3C0000, // 00DB CALL R15 0 - 0x983E0523, // 00DC SETIDX R15 K2 K35 - 0x983E320D, // 00DD SETIDX R15 K25 R13 - 0x98081C0F, // 00DE SETIDX R2 R14 R15 - 0x000C0704, // 00DF ADD R3 R3 K4 - 0x5436003F, // 00E0 LDINT R13 64 - 0x2434060D, // 00E1 GT R13 R3 R13 - 0x78360000, // 00E2 JMPF R13 #00E4 - 0x70020000, // 00E3 JMP #00E5 - 0x7001FFE4, // 00E4 JMP #00CA - 0xA8040001, // 00E5 EXBLK 1 1 - 0x70020002, // 00E6 JMP #00EA - 0x5828001A, // 00E7 LDCONST R10 K26 - 0xAC280200, // 00E8 CATCH R10 1 0 - 0xB0080000, // 00E9 RAISE 2 R0 R0 - 0x80040400, // 00EA RET 1 R2 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: remove_fabric -********************************************************************/ -be_local_closure(Matter_Device_remove_fabric, /* name */ - be_nested_proto( - 9, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[12]) { /* constants */ - /* K0 */ be_nested_str_weak(sessions), - /* K1 */ be_nested_str_weak(find_children_fabrics), - /* K2 */ be_nested_str_weak(get_fabric_index), - /* K3 */ be_nested_str_weak(find_fabric_by_index), - /* K4 */ be_nested_str_weak(message_handler), - /* K5 */ be_nested_str_weak(im), - /* K6 */ be_nested_str_weak(subs_shop), - /* K7 */ be_nested_str_weak(remove_by_fabric), - /* K8 */ be_nested_str_weak(mdns_remove_op_discovery), - /* K9 */ be_nested_str_weak(remove_fabric), - /* K10 */ be_nested_str_weak(stop_iteration), - /* K11 */ be_nested_str_weak(save_fabrics), - }), - be_str_weak(remove_fabric), - &be_const_str_solidified, - ( &(const binstruction[43]) { /* code */ - 0x88080100, // 0000 GETMBR R2 R0 K0 - 0x8C080501, // 0001 GETMET R2 R2 K1 - 0x8C100302, // 0002 GETMET R4 R1 K2 - 0x7C100200, // 0003 CALL R4 1 - 0x7C080400, // 0004 CALL R2 2 - 0x4C0C0000, // 0005 LDNIL R3 - 0x1C0C0403, // 0006 EQ R3 R2 R3 - 0x780E0000, // 0007 JMPF R3 #0009 - 0x80000600, // 0008 RET 0 - 0x600C0010, // 0009 GETGBL R3 G16 - 0x5C100400, // 000A MOVE R4 R2 - 0x7C0C0200, // 000B CALL R3 1 - 0xA8020016, // 000C EXBLK 0 #0024 - 0x5C100600, // 000D MOVE R4 R3 - 0x7C100000, // 000E CALL R4 0 - 0x88140100, // 000F GETMBR R5 R0 K0 - 0x8C140B03, // 0010 GETMET R5 R5 K3 - 0x5C1C0800, // 0011 MOVE R7 R4 - 0x7C140400, // 0012 CALL R5 2 - 0x4C180000, // 0013 LDNIL R6 - 0x20180A06, // 0014 NE R6 R5 R6 - 0x781A000C, // 0015 JMPF R6 #0023 - 0x88180104, // 0016 GETMBR R6 R0 K4 - 0x88180D05, // 0017 GETMBR R6 R6 K5 - 0x88180D06, // 0018 GETMBR R6 R6 K6 - 0x8C180D07, // 0019 GETMET R6 R6 K7 - 0x5C200A00, // 001A MOVE R8 R5 - 0x7C180400, // 001B CALL R6 2 - 0x8C180108, // 001C GETMET R6 R0 K8 - 0x5C200A00, // 001D MOVE R8 R5 - 0x7C180400, // 001E CALL R6 2 - 0x88180100, // 001F GETMBR R6 R0 K0 - 0x8C180D09, // 0020 GETMET R6 R6 K9 - 0x5C200A00, // 0021 MOVE R8 R5 - 0x7C180400, // 0022 CALL R6 2 - 0x7001FFE8, // 0023 JMP #000D - 0x580C000A, // 0024 LDCONST R3 K10 - 0xAC0C0200, // 0025 CATCH R3 1 0 - 0xB0080000, // 0026 RAISE 2 R0 R0 - 0x880C0100, // 0027 GETMBR R3 R0 K0 - 0x8C0C070B, // 0028 GETMET R3 R3 K11 - 0x7C0C0200, // 0029 CALL R3 1 - 0x80000000, // 002A RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: _init_basic_commissioning -********************************************************************/ -be_local_closure(Matter_Device__init_basic_commissioning, /* name */ - be_nested_proto( - 3, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 4]) { /* constants */ - /* K0 */ be_nested_str_weak(sessions), - /* K1 */ be_nested_str_weak(count_active_fabrics), - /* K2 */ be_const_int(0), - /* K3 */ be_nested_str_weak(start_root_basic_commissioning), - }), - be_str_weak(_init_basic_commissioning), - &be_const_str_solidified, - ( &(const binstruction[ 8]) { /* code */ - 0x88040100, // 0000 GETMBR R1 R0 K0 - 0x8C040301, // 0001 GETMET R1 R1 K1 - 0x7C040200, // 0002 CALL R1 1 - 0x1C040302, // 0003 EQ R1 R1 K2 - 0x78060001, // 0004 JMPF R1 #0007 - 0x8C040103, // 0005 GETMET R1 R0 K3 - 0x7C040200, // 0006 CALL R1 1 - 0x80000000, // 0007 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: every_250ms -********************************************************************/ -be_local_closure(Matter_Device_every_250ms, /* name */ - be_nested_proto( - 3, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 2]) { /* constants */ - /* K0 */ be_nested_str_weak(message_handler), - /* K1 */ be_nested_str_weak(every_250ms), - }), - be_str_weak(every_250ms), - &be_const_str_solidified, - ( &(const binstruction[ 4]) { /* code */ - 0x88040100, // 0000 GETMBR R1 R0 K0 - 0x8C040301, // 0001 GETMET R1 R1 K1 - 0x7C040200, // 0002 CALL R1 1 - 0x80000000, // 0003 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: process_attribute_expansion -********************************************************************/ -be_local_closure(Matter_Device_process_attribute_expansion, /* name */ - be_nested_proto( - 29, /* nstack */ - 3, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 1, /* has sup protos */ - ( &(const struct bproto*[ 1]) { - be_nested_proto( - 7, /* nstack */ - 1, /* argc */ - 0, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 5]) { /* constants */ - /* K0 */ be_nested_str_weak(keys), - /* K1 */ be_nested_str_weak(push), - /* K2 */ be_nested_str_weak(stop_iteration), - /* K3 */ be_const_int(1), - /* K4 */ be_const_int(0), - }), - be_str_weak(keys_sorted), - &be_const_str_solidified, - ( &(const binstruction[45]) { /* code */ - 0x60040012, // 0000 GETGBL R1 G18 - 0x7C040000, // 0001 CALL R1 0 - 0x60080010, // 0002 GETGBL R2 G16 - 0x8C0C0100, // 0003 GETMET R3 R0 K0 - 0x7C0C0200, // 0004 CALL R3 1 - 0x7C080200, // 0005 CALL R2 1 - 0xA8020005, // 0006 EXBLK 0 #000D - 0x5C0C0400, // 0007 MOVE R3 R2 - 0x7C0C0000, // 0008 CALL R3 0 - 0x8C100301, // 0009 GETMET R4 R1 K1 - 0x5C180600, // 000A MOVE R6 R3 - 0x7C100400, // 000B CALL R4 2 - 0x7001FFF9, // 000C JMP #0007 - 0x58080002, // 000D LDCONST R2 K2 - 0xAC080200, // 000E CATCH R2 1 0 - 0xB0080000, // 000F RAISE 2 R0 R0 - 0x60080010, // 0010 GETGBL R2 G16 - 0x600C000C, // 0011 GETGBL R3 G12 - 0x5C100200, // 0012 MOVE R4 R1 - 0x7C0C0200, // 0013 CALL R3 1 - 0x040C0703, // 0014 SUB R3 R3 K3 - 0x400E0603, // 0015 CONNECT R3 K3 R3 - 0x7C080200, // 0016 CALL R2 1 - 0xA8020010, // 0017 EXBLK 0 #0029 - 0x5C0C0400, // 0018 MOVE R3 R2 - 0x7C0C0000, // 0019 CALL R3 0 - 0x94100203, // 001A GETIDX R4 R1 R3 - 0x5C140600, // 001B MOVE R5 R3 - 0x24180B04, // 001C GT R6 R5 K4 - 0x781A0008, // 001D JMPF R6 #0027 - 0x04180B03, // 001E SUB R6 R5 K3 - 0x94180206, // 001F GETIDX R6 R1 R6 - 0x24180C04, // 0020 GT R6 R6 R4 - 0x781A0004, // 0021 JMPF R6 #0027 - 0x04180B03, // 0022 SUB R6 R5 K3 - 0x94180206, // 0023 GETIDX R6 R1 R6 - 0x98040A06, // 0024 SETIDX R1 R5 R6 - 0x04140B03, // 0025 SUB R5 R5 K3 - 0x7001FFF4, // 0026 JMP #001C - 0x98040A04, // 0027 SETIDX R1 R5 R4 - 0x7001FFEE, // 0028 JMP #0018 - 0x58080002, // 0029 LDCONST R2 K2 - 0xAC080200, // 002A CATCH R2 1 0 - 0xB0080000, // 002B RAISE 2 R0 R0 - 0x80040200, // 002C RET 1 R1 - }) - ), - }), - 1, /* has constants */ - ( &(const bvalue[22]) { /* constants */ - /* K0 */ be_nested_str_weak(string), - /* K1 */ be_nested_str_weak(endpoint), - /* K2 */ be_nested_str_weak(cluster), - /* K3 */ be_nested_str_weak(attribute), - /* K4 */ be_nested_str_weak(plugins), - /* K5 */ be_nested_str_weak(get_endpoint), - /* K6 */ be_nested_str_weak(contains), - /* K7 */ be_nested_str_weak(get_cluster_list), - /* K8 */ be_nested_str_weak(get_attribute_list), - /* K9 */ be_nested_str_weak(push), - /* K10 */ be_nested_str_weak(stop_iteration), - /* K11 */ be_nested_str_weak(tasmota), - /* K12 */ be_nested_str_weak(log), - /* K13 */ be_nested_str_weak(format), - /* K14 */ be_nested_str_weak(MTR_X3A_X20expansion_X20_X5B_X2502X_X5D_X2504X_X2F_X2504X), - /* K15 */ be_const_int(3), - /* K16 */ be_nested_str_weak(status), - /* K17 */ be_nested_str_weak(matter), - /* K18 */ be_nested_str_weak(UNSUPPORTED_ENDPOINT), - /* K19 */ be_nested_str_weak(UNSUPPORTED_CLUSTER), - /* K20 */ be_nested_str_weak(UNSUPPORTED_ATTRIBUTE), - /* K21 */ be_nested_str_weak(UNREPORTABLE_ATTRIBUTE), - }), - be_str_weak(process_attribute_expansion), - &be_const_str_solidified, - ( &(const binstruction[216]) { /* code */ - 0x840C0000, // 0000 CLOSURE R3 P0 - 0xA4120000, // 0001 IMPORT R4 K0 - 0x88140301, // 0002 GETMBR R5 R1 K1 - 0x50180000, // 0003 LDBOOL R6 0 0 - 0x881C0302, // 0004 GETMBR R7 R1 K2 - 0x50200000, // 0005 LDBOOL R8 0 0 - 0x88240303, // 0006 GETMBR R9 R1 K3 - 0x50280000, // 0007 LDBOOL R10 0 0 - 0x882C0301, // 0008 GETMBR R11 R1 K1 - 0x4C300000, // 0009 LDNIL R12 - 0x202C160C, // 000A NE R11 R11 R12 - 0x782E0007, // 000B JMPF R11 #0014 - 0x882C0302, // 000C GETMBR R11 R1 K2 - 0x4C300000, // 000D LDNIL R12 - 0x202C160C, // 000E NE R11 R11 R12 - 0x782E0003, // 000F JMPF R11 #0014 - 0x882C0303, // 0010 GETMBR R11 R1 K3 - 0x4C300000, // 0011 LDNIL R12 - 0x202C160C, // 0012 NE R11 R11 R12 - 0x742E0000, // 0013 JMPT R11 #0015 - 0x502C0001, // 0014 LDBOOL R11 0 1 - 0x502C0200, // 0015 LDBOOL R11 1 0 - 0x60300013, // 0016 GETGBL R12 G19 - 0x7C300000, // 0017 CALL R12 0 - 0x60340010, // 0018 GETGBL R13 G16 - 0x88380104, // 0019 GETMBR R14 R0 K4 - 0x7C340200, // 001A CALL R13 1 - 0xA8020055, // 001B EXBLK 0 #0072 - 0x5C381A00, // 001C MOVE R14 R13 - 0x7C380000, // 001D CALL R14 0 - 0x8C3C1D05, // 001E GETMET R15 R14 K5 - 0x7C3C0200, // 001F CALL R15 1 - 0x4C400000, // 0020 LDNIL R16 - 0x20400A10, // 0021 NE R16 R5 R16 - 0x78420002, // 0022 JMPF R16 #0026 - 0x20401E05, // 0023 NE R16 R15 R5 - 0x78420000, // 0024 JMPF R16 #0026 - 0x7001FFF5, // 0025 JMP #001C - 0x8C401906, // 0026 GETMET R16 R12 K6 - 0x5C481E00, // 0027 MOVE R18 R15 - 0x7C400400, // 0028 CALL R16 2 - 0x74420002, // 0029 JMPT R16 #002D - 0x60400013, // 002A GETGBL R16 G19 - 0x7C400000, // 002B CALL R16 0 - 0x98301E10, // 002C SETIDX R12 R15 R16 - 0x50180200, // 002D LDBOOL R6 1 0 - 0x8C401D07, // 002E GETMET R16 R14 K7 - 0x5C481E00, // 002F MOVE R18 R15 - 0x7C400400, // 0030 CALL R16 2 - 0x60440010, // 0031 GETGBL R17 G16 - 0x5C482000, // 0032 MOVE R18 R16 - 0x7C440200, // 0033 CALL R17 1 - 0xA8020038, // 0034 EXBLK 0 #006E - 0x5C482200, // 0035 MOVE R18 R17 - 0x7C480000, // 0036 CALL R18 0 - 0x4C4C0000, // 0037 LDNIL R19 - 0x204C0E13, // 0038 NE R19 R7 R19 - 0x784E0002, // 0039 JMPF R19 #003D - 0x204C2407, // 003A NE R19 R18 R7 - 0x784E0000, // 003B JMPF R19 #003D - 0x7001FFF7, // 003C JMP #0035 - 0x944C180F, // 003D GETIDX R19 R12 R15 - 0x8C4C2706, // 003E GETMET R19 R19 K6 - 0x5C542400, // 003F MOVE R21 R18 - 0x7C4C0400, // 0040 CALL R19 2 - 0x744E0003, // 0041 JMPT R19 #0046 - 0x944C180F, // 0042 GETIDX R19 R12 R15 - 0x60500013, // 0043 GETGBL R20 G19 - 0x7C500000, // 0044 CALL R20 0 - 0x984C2414, // 0045 SETIDX R19 R18 R20 - 0x50200200, // 0046 LDBOOL R8 1 0 - 0x8C4C1D08, // 0047 GETMET R19 R14 K8 - 0x5C541E00, // 0048 MOVE R21 R15 - 0x5C582400, // 0049 MOVE R22 R18 - 0x7C4C0600, // 004A CALL R19 3 - 0x60500010, // 004B GETGBL R20 G16 - 0x5C542600, // 004C MOVE R21 R19 - 0x7C500200, // 004D CALL R20 1 - 0xA802001A, // 004E EXBLK 0 #006A - 0x5C542800, // 004F MOVE R21 R20 - 0x7C540000, // 0050 CALL R21 0 - 0x4C580000, // 0051 LDNIL R22 - 0x20581216, // 0052 NE R22 R9 R22 - 0x785A0002, // 0053 JMPF R22 #0057 - 0x20582A09, // 0054 NE R22 R21 R9 - 0x785A0000, // 0055 JMPF R22 #0057 - 0x7001FFF7, // 0056 JMP #004F - 0x9458180F, // 0057 GETIDX R22 R12 R15 - 0x94582C12, // 0058 GETIDX R22 R22 R18 - 0x8C582D06, // 0059 GETMET R22 R22 K6 - 0x5C602A00, // 005A MOVE R24 R21 - 0x7C580400, // 005B CALL R22 2 - 0x745A0004, // 005C JMPT R22 #0062 - 0x9458180F, // 005D GETIDX R22 R12 R15 - 0x94582C12, // 005E GETIDX R22 R22 R18 - 0x605C0012, // 005F GETGBL R23 G18 - 0x7C5C0000, // 0060 CALL R23 0 - 0x98582A17, // 0061 SETIDX R22 R21 R23 - 0x50280200, // 0062 LDBOOL R10 1 0 - 0x9458180F, // 0063 GETIDX R22 R12 R15 - 0x94582C12, // 0064 GETIDX R22 R22 R18 - 0x94582C15, // 0065 GETIDX R22 R22 R21 - 0x8C582D09, // 0066 GETMET R22 R22 K9 - 0x5C601C00, // 0067 MOVE R24 R14 - 0x7C580400, // 0068 CALL R22 2 - 0x7001FFE4, // 0069 JMP #004F - 0x5850000A, // 006A LDCONST R20 K10 - 0xAC500200, // 006B CATCH R20 1 0 - 0xB0080000, // 006C RAISE 2 R0 R0 - 0x7001FFC6, // 006D JMP #0035 - 0x5844000A, // 006E LDCONST R17 K10 - 0xAC440200, // 006F CATCH R17 1 0 - 0xB0080000, // 0070 RAISE 2 R0 R0 - 0x7001FFA9, // 0071 JMP #001C - 0x5834000A, // 0072 LDCONST R13 K10 - 0xAC340200, // 0073 CATCH R13 1 0 - 0xB0080000, // 0074 RAISE 2 R0 R0 - 0x60340010, // 0075 GETGBL R13 G16 - 0x5C380600, // 0076 MOVE R14 R3 - 0x5C3C1800, // 0077 MOVE R15 R12 - 0x7C380200, // 0078 CALL R14 1 - 0x7C340200, // 0079 CALL R13 1 - 0xA802003D, // 007A EXBLK 0 #00B9 - 0x5C381A00, // 007B MOVE R14 R13 - 0x7C380000, // 007C CALL R14 0 - 0x603C0010, // 007D GETGBL R15 G16 - 0x5C400600, // 007E MOVE R16 R3 - 0x9444180E, // 007F GETIDX R17 R12 R14 - 0x7C400200, // 0080 CALL R16 1 - 0x7C3C0200, // 0081 CALL R15 1 - 0xA8020031, // 0082 EXBLK 0 #00B5 - 0x5C401E00, // 0083 MOVE R16 R15 - 0x7C400000, // 0084 CALL R16 0 - 0x60440010, // 0085 GETGBL R17 G16 - 0x5C480600, // 0086 MOVE R18 R3 - 0x944C180E, // 0087 GETIDX R19 R12 R14 - 0x944C2610, // 0088 GETIDX R19 R19 R16 - 0x7C480200, // 0089 CALL R18 1 - 0x7C440200, // 008A CALL R17 1 - 0xA8020024, // 008B EXBLK 0 #00B1 - 0x5C482200, // 008C MOVE R18 R17 - 0x7C480000, // 008D CALL R18 0 - 0x604C0010, // 008E GETGBL R19 G16 - 0x9450180E, // 008F GETIDX R20 R12 R14 - 0x94502810, // 0090 GETIDX R20 R20 R16 - 0x94502812, // 0091 GETIDX R20 R20 R18 - 0x7C4C0200, // 0092 CALL R19 1 - 0xA8020018, // 0093 EXBLK 0 #00AD - 0x5C502600, // 0094 MOVE R20 R19 - 0x7C500000, // 0095 CALL R20 0 - 0xB8561600, // 0096 GETNGBL R21 K11 - 0x8C542B0C, // 0097 GETMET R21 R21 K12 - 0x8C5C090D, // 0098 GETMET R23 R4 K13 - 0x5864000E, // 0099 LDCONST R25 K14 - 0x5C681C00, // 009A MOVE R26 R14 - 0x5C6C2000, // 009B MOVE R27 R16 - 0x5C702400, // 009C MOVE R28 R18 - 0x7C5C0A00, // 009D CALL R23 5 - 0x5860000F, // 009E LDCONST R24 K15 - 0x7C540600, // 009F CALL R21 3 - 0x9006020E, // 00A0 SETMBR R1 K1 R14 - 0x90060410, // 00A1 SETMBR R1 K2 R16 - 0x90060612, // 00A2 SETMBR R1 K3 R18 - 0x5C540400, // 00A3 MOVE R21 R2 - 0x5C582800, // 00A4 MOVE R22 R20 - 0x5C5C0200, // 00A5 MOVE R23 R1 - 0x5C601600, // 00A6 MOVE R24 R11 - 0x7C540600, // 00A7 CALL R21 3 - 0x782E0002, // 00A8 JMPF R11 #00AC - 0x78560001, // 00A9 JMPF R21 #00AC - 0xA8040004, // 00AA EXBLK 1 4 - 0x80002C00, // 00AB RET 0 - 0x7001FFE6, // 00AC JMP #0094 - 0x584C000A, // 00AD LDCONST R19 K10 - 0xAC4C0200, // 00AE CATCH R19 1 0 - 0xB0080000, // 00AF RAISE 2 R0 R0 - 0x7001FFDA, // 00B0 JMP #008C - 0x5844000A, // 00B1 LDCONST R17 K10 - 0xAC440200, // 00B2 CATCH R17 1 0 - 0xB0080000, // 00B3 RAISE 2 R0 R0 - 0x7001FFCD, // 00B4 JMP #0083 - 0x583C000A, // 00B5 LDCONST R15 K10 - 0xAC3C0200, // 00B6 CATCH R15 1 0 - 0xB0080000, // 00B7 RAISE 2 R0 R0 - 0x7001FFC1, // 00B8 JMP #007B - 0x5834000A, // 00B9 LDCONST R13 K10 - 0xAC340200, // 00BA CATCH R13 1 0 - 0xB0080000, // 00BB RAISE 2 R0 R0 - 0x782E0019, // 00BC JMPF R11 #00D7 - 0x5C340C00, // 00BD MOVE R13 R6 - 0x74360003, // 00BE JMPT R13 #00C3 - 0xB8362200, // 00BF GETNGBL R13 K17 - 0x88341B12, // 00C0 GETMBR R13 R13 K18 - 0x9006200D, // 00C1 SETMBR R1 K16 R13 - 0x7002000E, // 00C2 JMP #00D2 - 0x5C341000, // 00C3 MOVE R13 R8 - 0x74360003, // 00C4 JMPT R13 #00C9 - 0xB8362200, // 00C5 GETNGBL R13 K17 - 0x88341B13, // 00C6 GETMBR R13 R13 K19 - 0x9006200D, // 00C7 SETMBR R1 K16 R13 - 0x70020008, // 00C8 JMP #00D2 - 0x5C341400, // 00C9 MOVE R13 R10 - 0x74360003, // 00CA JMPT R13 #00CF - 0xB8362200, // 00CB GETNGBL R13 K17 - 0x88341B14, // 00CC GETMBR R13 R13 K20 - 0x9006200D, // 00CD SETMBR R1 K16 R13 - 0x70020002, // 00CE JMP #00D2 - 0xB8362200, // 00CF GETNGBL R13 K17 - 0x88341B15, // 00D0 GETMBR R13 R13 K21 - 0x9006200D, // 00D1 SETMBR R1 K16 R13 - 0x5C340400, // 00D2 MOVE R13 R2 - 0x4C380000, // 00D3 LDNIL R14 - 0x5C3C0200, // 00D4 MOVE R15 R1 - 0x50400200, // 00D5 LDBOOL R16 1 0 - 0x7C340600, // 00D6 CALL R13 3 - 0x80000000, // 00D7 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: mdns_remove_PASE -********************************************************************/ -be_local_closure(Matter_Device_mdns_remove_PASE, /* name */ - be_nested_proto( - 12, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[22]) { /* constants */ - /* K0 */ be_nested_str_weak(mdns), - /* K1 */ be_nested_str_weak(string), - /* K2 */ be_nested_str_weak(mdns_pase_eth), - /* K3 */ be_nested_str_weak(tasmota), - /* K4 */ be_nested_str_weak(log), - /* K5 */ be_nested_str_weak(format), - /* K6 */ be_nested_str_weak(MTR_X3A_X20calling_X20mdns_X2Eremove_service_X28_X25s_X2C_X20_X25s_X2C_X20_X25s_X2C_X20_X25s_X29), - /* K7 */ be_nested_str_weak(_matterc), - /* K8 */ be_nested_str_weak(_udp), - /* K9 */ be_nested_str_weak(commissioning_instance_eth), - /* K10 */ be_nested_str_weak(hostname_eth), - /* K11 */ be_const_int(3), - /* K12 */ be_nested_str_weak(MTR_X3A_X20remove_X20mDNS_X20on_X20_X25s_X20_X27_X25s_X27), - /* K13 */ be_nested_str_weak(eth), - /* K14 */ be_const_int(2), - /* K15 */ be_nested_str_weak(remove_service), - /* K16 */ be_nested_str_weak(mdns_pase_wifi), - /* K17 */ be_nested_str_weak(commissioning_instance_wifi), - /* K18 */ be_nested_str_weak(hostname_wifi), - /* K19 */ be_nested_str_weak(wifi), - /* K20 */ be_nested_str_weak(MTR_X3A_X20Exception), - /* K21 */ be_nested_str_weak(_X7C), - }), - be_str_weak(mdns_remove_PASE), - &be_const_str_solidified, - ( &(const binstruction[83]) { /* code */ - 0xA4060000, // 0000 IMPORT R1 K0 - 0xA40A0200, // 0001 IMPORT R2 K1 - 0xA802003D, // 0002 EXBLK 0 #0041 - 0x880C0102, // 0003 GETMBR R3 R0 K2 - 0x780E001B, // 0004 JMPF R3 #0021 - 0xB80E0600, // 0005 GETNGBL R3 K3 - 0x8C0C0704, // 0006 GETMET R3 R3 K4 - 0x8C140505, // 0007 GETMET R5 R2 K5 - 0x581C0006, // 0008 LDCONST R7 K6 - 0x58200007, // 0009 LDCONST R8 K7 - 0x58240008, // 000A LDCONST R9 K8 - 0x88280109, // 000B GETMBR R10 R0 K9 - 0x882C010A, // 000C GETMBR R11 R0 K10 - 0x7C140C00, // 000D CALL R5 6 - 0x5818000B, // 000E LDCONST R6 K11 - 0x7C0C0600, // 000F CALL R3 3 - 0xB80E0600, // 0010 GETNGBL R3 K3 - 0x8C0C0704, // 0011 GETMET R3 R3 K4 - 0x8C140505, // 0012 GETMET R5 R2 K5 - 0x581C000C, // 0013 LDCONST R7 K12 - 0x5820000D, // 0014 LDCONST R8 K13 - 0x88240109, // 0015 GETMBR R9 R0 K9 - 0x7C140800, // 0016 CALL R5 4 - 0x5818000E, // 0017 LDCONST R6 K14 - 0x7C0C0600, // 0018 CALL R3 3 - 0x500C0000, // 0019 LDBOOL R3 0 0 - 0x90020403, // 001A SETMBR R0 K2 R3 - 0x8C0C030F, // 001B GETMET R3 R1 K15 - 0x58140007, // 001C LDCONST R5 K7 - 0x58180008, // 001D LDCONST R6 K8 - 0x881C0109, // 001E GETMBR R7 R0 K9 - 0x8820010A, // 001F GETMBR R8 R0 K10 - 0x7C0C0A00, // 0020 CALL R3 5 - 0x880C0110, // 0021 GETMBR R3 R0 K16 - 0x780E001B, // 0022 JMPF R3 #003F - 0xB80E0600, // 0023 GETNGBL R3 K3 - 0x8C0C0704, // 0024 GETMET R3 R3 K4 - 0x8C140505, // 0025 GETMET R5 R2 K5 - 0x581C0006, // 0026 LDCONST R7 K6 - 0x58200007, // 0027 LDCONST R8 K7 - 0x58240008, // 0028 LDCONST R9 K8 - 0x88280111, // 0029 GETMBR R10 R0 K17 - 0x882C0112, // 002A GETMBR R11 R0 K18 - 0x7C140C00, // 002B CALL R5 6 - 0x5818000B, // 002C LDCONST R6 K11 - 0x7C0C0600, // 002D CALL R3 3 - 0xB80E0600, // 002E GETNGBL R3 K3 - 0x8C0C0704, // 002F GETMET R3 R3 K4 - 0x8C140505, // 0030 GETMET R5 R2 K5 - 0x581C000C, // 0031 LDCONST R7 K12 - 0x58200013, // 0032 LDCONST R8 K19 - 0x88240111, // 0033 GETMBR R9 R0 K17 - 0x7C140800, // 0034 CALL R5 4 - 0x5818000E, // 0035 LDCONST R6 K14 - 0x7C0C0600, // 0036 CALL R3 3 - 0x500C0000, // 0037 LDBOOL R3 0 0 - 0x90022003, // 0038 SETMBR R0 K16 R3 - 0x8C0C030F, // 0039 GETMET R3 R1 K15 - 0x58140007, // 003A LDCONST R5 K7 - 0x58180008, // 003B LDCONST R6 K8 - 0x881C0111, // 003C GETMBR R7 R0 K17 - 0x88200112, // 003D GETMBR R8 R0 K18 - 0x7C0C0A00, // 003E CALL R3 5 - 0xA8040001, // 003F EXBLK 1 1 - 0x70020010, // 0040 JMP #0052 - 0xAC0C0002, // 0041 CATCH R3 0 2 - 0x7002000D, // 0042 JMP #0051 - 0xB8160600, // 0043 GETNGBL R5 K3 - 0x8C140B04, // 0044 GETMET R5 R5 K4 - 0x601C0008, // 0045 GETGBL R7 G8 - 0x5C200600, // 0046 MOVE R8 R3 - 0x7C1C0200, // 0047 CALL R7 1 - 0x001E2807, // 0048 ADD R7 K20 R7 - 0x001C0F15, // 0049 ADD R7 R7 K21 - 0x60200008, // 004A GETGBL R8 G8 - 0x5C240800, // 004B MOVE R9 R4 - 0x7C200200, // 004C CALL R8 1 - 0x001C0E08, // 004D ADD R7 R7 R8 - 0x5820000E, // 004E LDCONST R8 K14 - 0x7C140600, // 004F CALL R5 3 - 0x70020000, // 0050 JMP #0052 - 0xB0080000, // 0051 RAISE 2 R0 R0 - 0x80000000, // 0052 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: _compute_pbkdf -********************************************************************/ -be_local_closure(Matter_Device__compute_pbkdf, /* name */ - be_nested_proto( - 14, /* nstack */ - 4, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[11]) { /* constants */ - /* K0 */ be_nested_str_weak(crypto), - /* K1 */ be_nested_str_weak(string), - /* K2 */ be_nested_str_weak(add), - /* K3 */ be_nested_str_weak(PBKDF2_HMAC_SHA256), - /* K4 */ be_nested_str_weak(derive), - /* K5 */ be_const_int(0), - /* K6 */ be_nested_str_weak(root_w0), - /* K7 */ be_nested_str_weak(EC_P256), - /* K8 */ be_nested_str_weak(mod), - /* K9 */ be_nested_str_weak(root_L), - /* K10 */ be_nested_str_weak(public_key), - }), - be_str_weak(_compute_pbkdf), - &be_const_str_solidified, - ( &(const binstruction[41]) { /* code */ - 0xA4120000, // 0000 IMPORT R4 K0 - 0xA4160200, // 0001 IMPORT R5 K1 - 0x60180015, // 0002 GETGBL R6 G21 - 0x7C180000, // 0003 CALL R6 0 - 0x8C180D02, // 0004 GETMET R6 R6 K2 - 0x5C200200, // 0005 MOVE R8 R1 - 0x54260003, // 0006 LDINT R9 4 - 0x7C180600, // 0007 CALL R6 3 - 0x8C1C0903, // 0008 GETMET R7 R4 K3 - 0x7C1C0200, // 0009 CALL R7 1 - 0x8C1C0F04, // 000A GETMET R7 R7 K4 - 0x5C240C00, // 000B MOVE R9 R6 - 0x5C280600, // 000C MOVE R10 R3 - 0x5C2C0400, // 000D MOVE R11 R2 - 0x5432004F, // 000E LDINT R12 80 - 0x7C1C0A00, // 000F CALL R7 5 - 0x54220026, // 0010 LDINT R8 39 - 0x40220A08, // 0011 CONNECT R8 K5 R8 - 0x94200E08, // 0012 GETIDX R8 R7 R8 - 0x54260027, // 0013 LDINT R9 40 - 0x542A004E, // 0014 LDINT R10 79 - 0x4024120A, // 0015 CONNECT R9 R9 R10 - 0x94240E09, // 0016 GETIDX R9 R7 R9 - 0x8C280907, // 0017 GETMET R10 R4 K7 - 0x7C280200, // 0018 CALL R10 1 - 0x8C281508, // 0019 GETMET R10 R10 K8 - 0x5C301000, // 001A MOVE R12 R8 - 0x7C280400, // 001B CALL R10 2 - 0x90020C0A, // 001C SETMBR R0 K6 R10 - 0x8C280907, // 001D GETMET R10 R4 K7 - 0x7C280200, // 001E CALL R10 1 - 0x8C281508, // 001F GETMET R10 R10 K8 - 0x5C301200, // 0020 MOVE R12 R9 - 0x7C280400, // 0021 CALL R10 2 - 0x8C2C0907, // 0022 GETMET R11 R4 K7 - 0x7C2C0200, // 0023 CALL R11 1 - 0x8C2C170A, // 0024 GETMET R11 R11 K10 - 0x5C341400, // 0025 MOVE R13 R10 - 0x7C2C0400, // 0026 CALL R11 2 - 0x9002120B, // 0027 SETMBR R0 K9 R11 - 0x80000000, // 0028 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: invoke_request -********************************************************************/ -be_local_closure(Matter_Device_invoke_request, /* name */ - be_nested_proto( - 12, /* nstack */ - 4, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 8]) { /* constants */ - /* K0 */ be_const_int(0), - /* K1 */ be_nested_str_weak(endpoint), - /* K2 */ be_nested_str_weak(plugins), - /* K3 */ be_nested_str_weak(invoke_request), - /* K4 */ be_const_int(1), - /* K5 */ be_nested_str_weak(status), - /* K6 */ be_nested_str_weak(matter), - /* K7 */ be_nested_str_weak(UNSUPPORTED_ENDPOINT), - }), - be_str_weak(invoke_request), - &be_const_str_solidified, - ( &(const binstruction[24]) { /* code */ - 0x58100000, // 0000 LDCONST R4 K0 - 0x88140701, // 0001 GETMBR R5 R3 K1 - 0x6018000C, // 0002 GETGBL R6 G12 - 0x881C0102, // 0003 GETMBR R7 R0 K2 - 0x7C180200, // 0004 CALL R6 1 - 0x14180806, // 0005 LT R6 R4 R6 - 0x781A000C, // 0006 JMPF R6 #0014 - 0x88180102, // 0007 GETMBR R6 R0 K2 - 0x94180C04, // 0008 GETIDX R6 R6 R4 - 0x881C0D01, // 0009 GETMBR R7 R6 K1 - 0x1C1C0E05, // 000A EQ R7 R7 R5 - 0x781E0005, // 000B JMPF R7 #0012 - 0x8C1C0D03, // 000C GETMET R7 R6 K3 - 0x5C240200, // 000D MOVE R9 R1 - 0x5C280400, // 000E MOVE R10 R2 - 0x5C2C0600, // 000F MOVE R11 R3 - 0x7C1C0800, // 0010 CALL R7 4 - 0x80040E00, // 0011 RET 1 R7 - 0x00100904, // 0012 ADD R4 R4 K4 - 0x7001FFED, // 0013 JMP #0002 - 0xB81A0C00, // 0014 GETNGBL R6 K6 - 0x88180D07, // 0015 GETMBR R6 R6 K7 - 0x900E0A06, // 0016 SETMBR R3 K5 R6 - 0x80000000, // 0017 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: _start_udp -********************************************************************/ -be_local_closure(Matter_Device__start_udp, /* name */ - be_nested_proto( - 6, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 1, /* has sup protos */ - ( &(const struct bproto*[ 1]) { - be_nested_proto( - 8, /* nstack */ - 3, /* argc */ - 0, /* varg */ - 1, /* has upvals */ - ( &(const bupvaldesc[ 1]) { /* upvals */ - be_local_const_upval(1, 0), - }), - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 1]) { /* constants */ - /* K0 */ be_nested_str_weak(msg_received), - }), - be_str_weak(_X3Clambda_X3E), - &be_const_str_solidified, - ( &(const binstruction[ 7]) { /* code */ - 0x680C0000, // 0000 GETUPV R3 U0 - 0x8C0C0700, // 0001 GETMET R3 R3 K0 - 0x5C140000, // 0002 MOVE R5 R0 - 0x5C180200, // 0003 MOVE R6 R1 - 0x5C1C0400, // 0004 MOVE R7 R2 - 0x7C0C0800, // 0005 CALL R3 4 - 0x80040600, // 0006 RET 1 R3 - }) - ), - }), - 1, /* has constants */ - ( &(const bvalue[ 9]) { /* constants */ - /* K0 */ be_nested_str_weak(udp_server), - /* K1 */ be_nested_str_weak(tasmota), - /* K2 */ be_nested_str_weak(log), - /* K3 */ be_nested_str_weak(MTR_X3A_X20starting_X20UDP_X20server_X20on_X20port_X3A_X20), - /* K4 */ be_const_int(2), - /* K5 */ be_nested_str_weak(matter), - /* K6 */ be_nested_str_weak(UDPServer), - /* K7 */ be_nested_str_weak(), - /* K8 */ be_nested_str_weak(start), - }), - be_str_weak(_start_udp), - &be_const_str_solidified, - ( &(const binstruction[27]) { /* code */ - 0x88080100, // 0000 GETMBR R2 R0 K0 - 0x780A0000, // 0001 JMPF R2 #0003 - 0x80000400, // 0002 RET 0 - 0x4C080000, // 0003 LDNIL R2 - 0x1C080202, // 0004 EQ R2 R1 R2 - 0x780A0000, // 0005 JMPF R2 #0007 - 0x540615A3, // 0006 LDINT R1 5540 - 0xB80A0200, // 0007 GETNGBL R2 K1 - 0x8C080502, // 0008 GETMET R2 R2 K2 - 0x60100008, // 0009 GETGBL R4 G8 - 0x5C140200, // 000A MOVE R5 R1 - 0x7C100200, // 000B CALL R4 1 - 0x00120604, // 000C ADD R4 K3 R4 - 0x58140004, // 000D LDCONST R5 K4 - 0x7C080600, // 000E CALL R2 3 - 0xB80A0A00, // 000F GETNGBL R2 K5 - 0x8C080506, // 0010 GETMET R2 R2 K6 - 0x58100007, // 0011 LDCONST R4 K7 - 0x5C140200, // 0012 MOVE R5 R1 - 0x7C080600, // 0013 CALL R2 3 - 0x90020002, // 0014 SETMBR R0 K0 R2 - 0x88080100, // 0015 GETMBR R2 R0 K0 - 0x8C080508, // 0016 GETMET R2 R2 K8 - 0x84100000, // 0017 CLOSURE R4 P0 - 0x7C080400, // 0018 CALL R2 2 - 0xA0000000, // 0019 CLOSE R0 - 0x80000000, // 001A RET 0 - }) - ) -); -/*******************************************************************/ - - /******************************************************************** ** Solidified function: mdns_announce_PASE ********************************************************************/ @@ -4131,119 +2006,11 @@ be_local_closure(Matter_Device_mdns_announce_PASE, /* name */ /******************************************************************** -** Solidified function: start_operational_discovery +** Solidified function: autoconf_device_map ********************************************************************/ -be_local_closure(Matter_Device_start_operational_discovery, /* name */ +be_local_closure(Matter_Device_autoconf_device_map, /* name */ be_nested_proto( - 9, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 9]) { /* constants */ - /* K0 */ be_nested_str_weak(crypto), - /* K1 */ be_nested_str_weak(mdns), - /* K2 */ be_nested_str_weak(string), - /* K3 */ be_nested_str_weak(stop_basic_commissioning), - /* K4 */ be_nested_str_weak(root_w0), - /* K5 */ be_nested_str_weak(root_L), - /* K6 */ be_nested_str_weak(set_expire_in_seconds), - /* K7 */ be_nested_str_weak(mdns_announce_op_discovery), - /* K8 */ be_nested_str_weak(get_fabric), - }), - be_str_weak(start_operational_discovery), - &be_const_str_solidified, - ( &(const binstruction[17]) { /* code */ - 0xA40A0000, // 0000 IMPORT R2 K0 - 0xA40E0200, // 0001 IMPORT R3 K1 - 0xA4120400, // 0002 IMPORT R4 K2 - 0x8C140103, // 0003 GETMET R5 R0 K3 - 0x7C140200, // 0004 CALL R5 1 - 0x4C140000, // 0005 LDNIL R5 - 0x90020805, // 0006 SETMBR R0 K4 R5 - 0x4C140000, // 0007 LDNIL R5 - 0x90020A05, // 0008 SETMBR R0 K5 R5 - 0x8C140306, // 0009 GETMET R5 R1 K6 - 0x541E003B, // 000A LDINT R7 60 - 0x7C140400, // 000B CALL R5 2 - 0x8C140107, // 000C GETMET R5 R0 K7 - 0x8C1C0308, // 000D GETMET R7 R1 K8 - 0x7C1C0200, // 000E CALL R7 1 - 0x7C140400, // 000F CALL R5 2 - 0x80000000, // 0010 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: get_active_endpoints -********************************************************************/ -be_local_closure(Matter_Device_get_active_endpoints, /* name */ - be_nested_proto( - 9, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 6]) { /* constants */ - /* K0 */ be_nested_str_weak(plugins), - /* K1 */ be_nested_str_weak(get_endpoint), - /* K2 */ be_const_int(0), - /* K3 */ be_nested_str_weak(find), - /* K4 */ be_nested_str_weak(push), - /* K5 */ be_nested_str_weak(stop_iteration), - }), - be_str_weak(get_active_endpoints), - &be_const_str_solidified, - ( &(const binstruction[28]) { /* code */ - 0x60080012, // 0000 GETGBL R2 G18 - 0x7C080000, // 0001 CALL R2 0 - 0x600C0010, // 0002 GETGBL R3 G16 - 0x88100100, // 0003 GETMBR R4 R0 K0 - 0x7C0C0200, // 0004 CALL R3 1 - 0xA8020011, // 0005 EXBLK 0 #0018 - 0x5C100600, // 0006 MOVE R4 R3 - 0x7C100000, // 0007 CALL R4 0 - 0x8C140901, // 0008 GETMET R5 R4 K1 - 0x7C140200, // 0009 CALL R5 1 - 0x78060002, // 000A JMPF R1 #000E - 0x1C180B02, // 000B EQ R6 R5 K2 - 0x781A0000, // 000C JMPF R6 #000E - 0x7001FFF7, // 000D JMP #0006 - 0x8C180503, // 000E GETMET R6 R2 K3 - 0x5C200A00, // 000F MOVE R8 R5 - 0x7C180400, // 0010 CALL R6 2 - 0x4C1C0000, // 0011 LDNIL R7 - 0x1C180C07, // 0012 EQ R6 R6 R7 - 0x781A0002, // 0013 JMPF R6 #0017 - 0x8C180504, // 0014 GETMET R6 R2 K4 - 0x5C200A00, // 0015 MOVE R8 R5 - 0x7C180400, // 0016 CALL R6 2 - 0x7001FFED, // 0017 JMP #0006 - 0x580C0005, // 0018 LDCONST R3 K5 - 0xAC0C0200, // 0019 CATCH R3 1 0 - 0xB0080000, // 001A RAISE 2 R0 R0 - 0x80040400, // 001B RET 1 R2 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: mdns_announce_op_discovery_all_fabrics -********************************************************************/ -be_local_closure(Matter_Device_mdns_announce_op_discovery_all_fabrics, /* name */ - be_nested_proto( - 6, /* nstack */ + 22, /* nstack */ 1, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -4251,39 +2018,388 @@ be_local_closure(Matter_Device_mdns_announce_op_discovery_all_fabrics, /* name 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[ 6]) { /* constants */ - /* K0 */ be_nested_str_weak(sessions), - /* K1 */ be_nested_str_weak(active_fabrics), - /* K2 */ be_nested_str_weak(get_device_id), - /* K3 */ be_nested_str_weak(get_fabric_id), - /* K4 */ be_nested_str_weak(mdns_announce_op_discovery), - /* K5 */ be_nested_str_weak(stop_iteration), + ( &(const bvalue[51]) { /* constants */ + /* K0 */ be_nested_str_weak(string), + /* K1 */ be_nested_str_weak(json), + /* K2 */ be_nested_str_weak(0), + /* K3 */ be_nested_str_weak(type), + /* K4 */ be_nested_str_weak(root), + /* K5 */ be_const_int(1), + /* K6 */ be_nested_str_weak(light), + /* K7 */ be_nested_str_weak(get), + /* K8 */ be_nested_str_weak(find), + /* K9 */ be_nested_str_weak(channels), + /* K10 */ be_nested_str_weak(), + /* K11 */ be_const_int(0), + /* K12 */ be_nested_str_weak(light1), + /* K13 */ be_const_int(2), + /* K14 */ be_nested_str_weak(light2), + /* K15 */ be_nested_str_weak(light3), + /* K16 */ be_nested_str_weak(tasmota), + /* K17 */ be_nested_str_weak(cmd), + /* K18 */ be_nested_str_weak(Status_X2013), + /* K19 */ be_nested_str_weak(log), + /* K20 */ be_nested_str_weak(MTR_X3A_X20Status_X2013_X20_X3D_X20), + /* K21 */ be_const_int(3), + /* K22 */ be_nested_str_weak(contains), + /* K23 */ be_nested_str_weak(StatusSHT), + /* K24 */ be_nested_str_weak(SHT), + /* K25 */ be_nested_str_weak(format), + /* K26 */ be_nested_str_weak(MTR_X3A_X20_X27_X25s_X27_X20_X3D_X20_X25s), + /* K27 */ be_nested_str_weak(Relay1), + /* K28 */ be_nested_str_weak(Relay2), + /* K29 */ be_nested_str_weak(push), + /* K30 */ be_nested_str_weak(MTR_X3A_X20relay1_X20_X3D_X20_X25s_X2C_X20relay2_X20_X3D_X20_X25s), + /* K31 */ be_nested_str_weak(shutter), + /* K32 */ be_nested_str_weak(get_power), + /* K33 */ be_nested_str_weak(relay), + /* K34 */ be_nested_str_weak(load), + /* K35 */ be_nested_str_weak(read_sensors), + /* K36 */ be_nested_str_weak(k2l), + /* K37 */ be_nested_str_weak(Temperature), + /* K38 */ be_nested_str_weak(_X23Temperature), + /* K39 */ be_nested_str_weak(temperature), + /* K40 */ be_nested_str_weak(filter), + /* K41 */ be_nested_str_weak(stop_iteration), + /* K42 */ be_nested_str_weak(Pressure), + /* K43 */ be_nested_str_weak(_X23Pressure), + /* K44 */ be_nested_str_weak(pressure), + /* K45 */ be_nested_str_weak(Illuminance), + /* K46 */ be_nested_str_weak(_X23Illuminance), + /* K47 */ be_nested_str_weak(illuminance), + /* K48 */ be_nested_str_weak(Humidity), + /* K49 */ be_nested_str_weak(_X23Humidity), + /* K50 */ be_nested_str_weak(humidity), }), - be_str_weak(mdns_announce_op_discovery_all_fabrics), + be_str_weak(autoconf_device_map), &be_const_str_solidified, - ( &(const binstruction[22]) { /* code */ - 0x60040010, // 0000 GETGBL R1 G16 - 0x88080100, // 0001 GETMBR R2 R0 K0 - 0x8C080501, // 0002 GETMET R2 R2 K1 - 0x7C080200, // 0003 CALL R2 1 - 0x7C040200, // 0004 CALL R1 1 - 0xA802000B, // 0005 EXBLK 0 #0012 - 0x5C080200, // 0006 MOVE R2 R1 - 0x7C080000, // 0007 CALL R2 0 - 0x8C0C0502, // 0008 GETMET R3 R2 K2 - 0x7C0C0200, // 0009 CALL R3 1 - 0x780E0005, // 000A JMPF R3 #0011 - 0x8C0C0503, // 000B GETMET R3 R2 K3 - 0x7C0C0200, // 000C CALL R3 1 - 0x780E0002, // 000D JMPF R3 #0011 - 0x8C0C0104, // 000E GETMET R3 R0 K4 - 0x5C140400, // 000F MOVE R5 R2 - 0x7C0C0400, // 0010 CALL R3 2 - 0x7001FFF3, // 0011 JMP #0006 - 0x58040005, // 0012 LDCONST R1 K5 - 0xAC040200, // 0013 CATCH R1 1 0 - 0xB0080000, // 0014 RAISE 2 R0 R0 - 0x80000000, // 0015 RET 0 + ( &(const binstruction[326]) { /* code */ + 0xA4060000, // 0000 IMPORT R1 K0 + 0xA40A0200, // 0001 IMPORT R2 K1 + 0x600C0013, // 0002 GETGBL R3 G19 + 0x7C0C0000, // 0003 CALL R3 0 + 0x60100013, // 0004 GETGBL R4 G19 + 0x7C100000, // 0005 CALL R4 0 + 0x98120704, // 0006 SETIDX R4 K3 K4 + 0x980E0404, // 0007 SETIDX R3 K2 R4 + 0x58100005, // 0008 LDCONST R4 K5 + 0x50140000, // 0009 LDBOOL R5 0 0 + 0xA41A0C00, // 000A IMPORT R6 K6 + 0x8C1C0D07, // 000B GETMET R7 R6 K7 + 0x7C1C0200, // 000C CALL R7 1 + 0x4C200000, // 000D LDNIL R8 + 0x20200E08, // 000E NE R8 R7 R8 + 0x78220024, // 000F JMPF R8 #0035 + 0x6020000C, // 0010 GETGBL R8 G12 + 0x8C240F08, // 0011 GETMET R9 R7 K8 + 0x582C0009, // 0012 LDCONST R11 K9 + 0x5830000A, // 0013 LDCONST R12 K10 + 0x7C240600, // 0014 CALL R9 3 + 0x7C200200, // 0015 CALL R8 1 + 0x2424110B, // 0016 GT R9 R8 K11 + 0x7826001C, // 0017 JMPF R9 #0035 + 0x1C241105, // 0018 EQ R9 R8 K5 + 0x78260007, // 0019 JMPF R9 #0022 + 0x60240008, // 001A GETGBL R9 G8 + 0x5C280800, // 001B MOVE R10 R4 + 0x7C240200, // 001C CALL R9 1 + 0x60280013, // 001D GETGBL R10 G19 + 0x7C280000, // 001E CALL R10 0 + 0x982A070C, // 001F SETIDX R10 K3 K12 + 0x980C120A, // 0020 SETIDX R3 R9 R10 + 0x70020010, // 0021 JMP #0033 + 0x1C24110D, // 0022 EQ R9 R8 K13 + 0x78260007, // 0023 JMPF R9 #002C + 0x60240008, // 0024 GETGBL R9 G8 + 0x5C280800, // 0025 MOVE R10 R4 + 0x7C240200, // 0026 CALL R9 1 + 0x60280013, // 0027 GETGBL R10 G19 + 0x7C280000, // 0028 CALL R10 0 + 0x982A070E, // 0029 SETIDX R10 K3 K14 + 0x980C120A, // 002A SETIDX R3 R9 R10 + 0x70020006, // 002B JMP #0033 + 0x60240008, // 002C GETGBL R9 G8 + 0x5C280800, // 002D MOVE R10 R4 + 0x7C240200, // 002E CALL R9 1 + 0x60280013, // 002F GETGBL R10 G19 + 0x7C280000, // 0030 CALL R10 0 + 0x982A070F, // 0031 SETIDX R10 K3 K15 + 0x980C120A, // 0032 SETIDX R3 R9 R10 + 0x50140200, // 0033 LDBOOL R5 1 0 + 0x00100905, // 0034 ADD R4 R4 K5 + 0xB8222000, // 0035 GETNGBL R8 K16 + 0x8C201111, // 0036 GETMET R8 R8 K17 + 0x58280012, // 0037 LDCONST R10 K18 + 0x502C0200, // 0038 LDBOOL R11 1 0 + 0x7C200600, // 0039 CALL R8 3 + 0x60240012, // 003A GETGBL R9 G18 + 0x7C240000, // 003B CALL R9 0 + 0xB82A2000, // 003C GETNGBL R10 K16 + 0x8C281513, // 003D GETMET R10 R10 K19 + 0x60300008, // 003E GETGBL R12 G8 + 0x5C341000, // 003F MOVE R13 R8 + 0x7C300200, // 0040 CALL R12 1 + 0x0032280C, // 0041 ADD R12 K20 R12 + 0x58340015, // 0042 LDCONST R13 K21 + 0x7C280600, // 0043 CALL R10 3 + 0x8C281116, // 0044 GETMET R10 R8 K22 + 0x58300017, // 0045 LDCONST R12 K23 + 0x7C280400, // 0046 CALL R10 2 + 0x782A0040, // 0047 JMPF R10 #0089 + 0x94201117, // 0048 GETIDX R8 R8 K23 + 0x5828000B, // 0049 LDCONST R10 K11 + 0x502C0200, // 004A LDBOOL R11 1 0 + 0x782E003C, // 004B JMPF R11 #0089 + 0x602C0008, // 004C GETGBL R11 G8 + 0x5C301400, // 004D MOVE R12 R10 + 0x7C2C0200, // 004E CALL R11 1 + 0x002E300B, // 004F ADD R11 K24 R11 + 0x8C301116, // 0050 GETMET R12 R8 K22 + 0x5C381600, // 0051 MOVE R14 R11 + 0x7C300400, // 0052 CALL R12 2 + 0x74320000, // 0053 JMPT R12 #0055 + 0x70020033, // 0054 JMP #0089 + 0x9430100B, // 0055 GETIDX R12 R8 R11 + 0xB8362000, // 0056 GETNGBL R13 K16 + 0x8C341B13, // 0057 GETMET R13 R13 K19 + 0x8C3C0319, // 0058 GETMET R15 R1 K25 + 0x5844001A, // 0059 LDCONST R17 K26 + 0x5C481600, // 005A MOVE R18 R11 + 0x604C0008, // 005B GETGBL R19 G8 + 0x5C501800, // 005C MOVE R20 R12 + 0x7C4C0200, // 005D CALL R19 1 + 0x7C3C0800, // 005E CALL R15 4 + 0x58400015, // 005F LDCONST R16 K21 + 0x7C340600, // 0060 CALL R13 3 + 0x8C341908, // 0061 GETMET R13 R12 K8 + 0x583C001B, // 0062 LDCONST R15 K27 + 0x5840000B, // 0063 LDCONST R16 K11 + 0x7C340600, // 0064 CALL R13 3 + 0x04341B05, // 0065 SUB R13 R13 K5 + 0x8C381908, // 0066 GETMET R14 R12 K8 + 0x5840001C, // 0067 LDCONST R16 K28 + 0x5844000B, // 0068 LDCONST R17 K11 + 0x7C380600, // 0069 CALL R14 3 + 0x04381D05, // 006A SUB R14 R14 K5 + 0x283C1B0B, // 006B GE R15 R13 K11 + 0x783E0002, // 006C JMPF R15 #0070 + 0x8C3C131D, // 006D GETMET R15 R9 K29 + 0x5C441A00, // 006E MOVE R17 R13 + 0x7C3C0400, // 006F CALL R15 2 + 0x283C1D0B, // 0070 GE R15 R14 K11 + 0x783E0002, // 0071 JMPF R15 #0075 + 0x8C3C131D, // 0072 GETMET R15 R9 K29 + 0x5C441C00, // 0073 MOVE R17 R14 + 0x7C3C0400, // 0074 CALL R15 2 + 0xB83E2000, // 0075 GETNGBL R15 K16 + 0x8C3C1F13, // 0076 GETMET R15 R15 K19 + 0x8C440319, // 0077 GETMET R17 R1 K25 + 0x584C001E, // 0078 LDCONST R19 K30 + 0x5C501A00, // 0079 MOVE R20 R13 + 0x5C541C00, // 007A MOVE R21 R14 + 0x7C440800, // 007B CALL R17 4 + 0x58480015, // 007C LDCONST R18 K21 + 0x7C3C0600, // 007D CALL R15 3 + 0x603C0008, // 007E GETGBL R15 G8 + 0x5C400800, // 007F MOVE R16 R4 + 0x7C3C0200, // 0080 CALL R15 1 + 0x60400013, // 0081 GETGBL R16 G19 + 0x7C400000, // 0082 CALL R16 0 + 0x9842071F, // 0083 SETIDX R16 K3 K31 + 0x98423E0A, // 0084 SETIDX R16 K31 R10 + 0x980C1E10, // 0085 SETIDX R3 R15 R16 + 0x00100905, // 0086 ADD R4 R4 K5 + 0x00281505, // 0087 ADD R10 R10 K5 + 0x7001FFC0, // 0088 JMP #004A + 0x6028000C, // 0089 GETGBL R10 G12 + 0xB82E2000, // 008A GETNGBL R11 K16 + 0x8C2C1720, // 008B GETMET R11 R11 K32 + 0x7C2C0200, // 008C CALL R11 1 + 0x7C280200, // 008D CALL R10 1 + 0x582C000B, // 008E LDCONST R11 K11 + 0x78160000, // 008F JMPF R5 #0091 + 0x04281505, // 0090 SUB R10 R10 K5 + 0x1430160A, // 0091 LT R12 R11 R10 + 0x78320010, // 0092 JMPF R12 #00A4 + 0x8C301308, // 0093 GETMET R12 R9 K8 + 0x5C381600, // 0094 MOVE R14 R11 + 0x7C300400, // 0095 CALL R12 2 + 0x4C340000, // 0096 LDNIL R13 + 0x1C30180D, // 0097 EQ R12 R12 R13 + 0x78320008, // 0098 JMPF R12 #00A2 + 0x60300008, // 0099 GETGBL R12 G8 + 0x5C340800, // 009A MOVE R13 R4 + 0x7C300200, // 009B CALL R12 1 + 0x60340013, // 009C GETGBL R13 G19 + 0x7C340000, // 009D CALL R13 0 + 0x98360721, // 009E SETIDX R13 K3 K33 + 0x9836420B, // 009F SETIDX R13 K33 R11 + 0x980C180D, // 00A0 SETIDX R3 R12 R13 + 0x00100905, // 00A1 ADD R4 R4 K5 + 0x002C1705, // 00A2 ADD R11 R11 K5 + 0x7001FFEC, // 00A3 JMP #0091 + 0x8C300522, // 00A4 GETMET R12 R2 K34 + 0xB83A2000, // 00A5 GETNGBL R14 K16 + 0x8C381D23, // 00A6 GETMET R14 R14 K35 + 0x7C380200, // 00A7 CALL R14 1 + 0x7C300400, // 00A8 CALL R12 2 + 0x5412001F, // 00A9 LDINT R4 32 + 0x60340010, // 00AA GETGBL R13 G16 + 0x8C380124, // 00AB GETMET R14 R0 K36 + 0x5C401800, // 00AC MOVE R16 R12 + 0x7C380400, // 00AD CALL R14 2 + 0x7C340200, // 00AE CALL R13 1 + 0xA802001C, // 00AF EXBLK 0 #00CD + 0x5C381A00, // 00B0 MOVE R14 R13 + 0x7C380000, // 00B1 CALL R14 0 + 0x943C180E, // 00B2 GETIDX R15 R12 R14 + 0x6040000F, // 00B3 GETGBL R16 G15 + 0x5C441E00, // 00B4 MOVE R17 R15 + 0x60480013, // 00B5 GETGBL R18 G19 + 0x7C400400, // 00B6 CALL R16 2 + 0x7842000D, // 00B7 JMPF R16 #00C6 + 0x8C401F16, // 00B8 GETMET R16 R15 K22 + 0x58480025, // 00B9 LDCONST R18 K37 + 0x7C400400, // 00BA CALL R16 2 + 0x78420009, // 00BB JMPF R16 #00C6 + 0x00401D26, // 00BC ADD R16 R14 K38 + 0x60440008, // 00BD GETGBL R17 G8 + 0x5C480800, // 00BE MOVE R18 R4 + 0x7C440200, // 00BF CALL R17 1 + 0x60480013, // 00C0 GETGBL R18 G19 + 0x7C480000, // 00C1 CALL R18 0 + 0x984A0727, // 00C2 SETIDX R18 K3 K39 + 0x984A5010, // 00C3 SETIDX R18 K40 R16 + 0x980C2212, // 00C4 SETIDX R3 R17 R18 + 0x00100905, // 00C5 ADD R4 R4 K5 + 0x54420027, // 00C6 LDINT R16 40 + 0x24400810, // 00C7 GT R16 R4 R16 + 0x78420000, // 00C8 JMPF R16 #00CA + 0x70020000, // 00C9 JMP #00CB + 0x7001FFE4, // 00CA JMP #00B0 + 0xA8040001, // 00CB EXBLK 1 1 + 0x70020002, // 00CC JMP #00D0 + 0x58340029, // 00CD LDCONST R13 K41 + 0xAC340200, // 00CE CATCH R13 1 0 + 0xB0080000, // 00CF RAISE 2 R0 R0 + 0x54120027, // 00D0 LDINT R4 40 + 0x60340010, // 00D1 GETGBL R13 G16 + 0x8C380124, // 00D2 GETMET R14 R0 K36 + 0x5C401800, // 00D3 MOVE R16 R12 + 0x7C380400, // 00D4 CALL R14 2 + 0x7C340200, // 00D5 CALL R13 1 + 0xA802001C, // 00D6 EXBLK 0 #00F4 + 0x5C381A00, // 00D7 MOVE R14 R13 + 0x7C380000, // 00D8 CALL R14 0 + 0x943C180E, // 00D9 GETIDX R15 R12 R14 + 0x6040000F, // 00DA GETGBL R16 G15 + 0x5C441E00, // 00DB MOVE R17 R15 + 0x60480013, // 00DC GETGBL R18 G19 + 0x7C400400, // 00DD CALL R16 2 + 0x7842000D, // 00DE JMPF R16 #00ED + 0x8C401F16, // 00DF GETMET R16 R15 K22 + 0x5848002A, // 00E0 LDCONST R18 K42 + 0x7C400400, // 00E1 CALL R16 2 + 0x78420009, // 00E2 JMPF R16 #00ED + 0x00401D2B, // 00E3 ADD R16 R14 K43 + 0x60440008, // 00E4 GETGBL R17 G8 + 0x5C480800, // 00E5 MOVE R18 R4 + 0x7C440200, // 00E6 CALL R17 1 + 0x60480013, // 00E7 GETGBL R18 G19 + 0x7C480000, // 00E8 CALL R18 0 + 0x984A072C, // 00E9 SETIDX R18 K3 K44 + 0x984A5010, // 00EA SETIDX R18 K40 R16 + 0x980C2212, // 00EB SETIDX R3 R17 R18 + 0x00100905, // 00EC ADD R4 R4 K5 + 0x5442002E, // 00ED LDINT R16 47 + 0x24400810, // 00EE GT R16 R4 R16 + 0x78420000, // 00EF JMPF R16 #00F1 + 0x70020000, // 00F0 JMP #00F2 + 0x7001FFE4, // 00F1 JMP #00D7 + 0xA8040001, // 00F2 EXBLK 1 1 + 0x70020002, // 00F3 JMP #00F7 + 0x58340029, // 00F4 LDCONST R13 K41 + 0xAC340200, // 00F5 CATCH R13 1 0 + 0xB0080000, // 00F6 RAISE 2 R0 R0 + 0x5412002F, // 00F7 LDINT R4 48 + 0x60340010, // 00F8 GETGBL R13 G16 + 0x8C380124, // 00F9 GETMET R14 R0 K36 + 0x5C401800, // 00FA MOVE R16 R12 + 0x7C380400, // 00FB CALL R14 2 + 0x7C340200, // 00FC CALL R13 1 + 0xA802001C, // 00FD EXBLK 0 #011B + 0x5C381A00, // 00FE MOVE R14 R13 + 0x7C380000, // 00FF CALL R14 0 + 0x943C180E, // 0100 GETIDX R15 R12 R14 + 0x6040000F, // 0101 GETGBL R16 G15 + 0x5C441E00, // 0102 MOVE R17 R15 + 0x60480013, // 0103 GETGBL R18 G19 + 0x7C400400, // 0104 CALL R16 2 + 0x7842000D, // 0105 JMPF R16 #0114 + 0x8C401F16, // 0106 GETMET R16 R15 K22 + 0x5848002D, // 0107 LDCONST R18 K45 + 0x7C400400, // 0108 CALL R16 2 + 0x78420009, // 0109 JMPF R16 #0114 + 0x00401D2E, // 010A ADD R16 R14 K46 + 0x60440008, // 010B GETGBL R17 G8 + 0x5C480800, // 010C MOVE R18 R4 + 0x7C440200, // 010D CALL R17 1 + 0x60480013, // 010E GETGBL R18 G19 + 0x7C480000, // 010F CALL R18 0 + 0x984A072F, // 0110 SETIDX R18 K3 K47 + 0x984A5010, // 0111 SETIDX R18 K40 R16 + 0x980C2212, // 0112 SETIDX R3 R17 R18 + 0x00100905, // 0113 ADD R4 R4 K5 + 0x54420037, // 0114 LDINT R16 56 + 0x24400810, // 0115 GT R16 R4 R16 + 0x78420000, // 0116 JMPF R16 #0118 + 0x70020000, // 0117 JMP #0119 + 0x7001FFE4, // 0118 JMP #00FE + 0xA8040001, // 0119 EXBLK 1 1 + 0x70020002, // 011A JMP #011E + 0x58340029, // 011B LDCONST R13 K41 + 0xAC340200, // 011C CATCH R13 1 0 + 0xB0080000, // 011D RAISE 2 R0 R0 + 0x54120037, // 011E LDINT R4 56 + 0x60340010, // 011F GETGBL R13 G16 + 0x8C380124, // 0120 GETMET R14 R0 K36 + 0x5C401800, // 0121 MOVE R16 R12 + 0x7C380400, // 0122 CALL R14 2 + 0x7C340200, // 0123 CALL R13 1 + 0xA802001C, // 0124 EXBLK 0 #0142 + 0x5C381A00, // 0125 MOVE R14 R13 + 0x7C380000, // 0126 CALL R14 0 + 0x943C180E, // 0127 GETIDX R15 R12 R14 + 0x6040000F, // 0128 GETGBL R16 G15 + 0x5C441E00, // 0129 MOVE R17 R15 + 0x60480013, // 012A GETGBL R18 G19 + 0x7C400400, // 012B CALL R16 2 + 0x7842000D, // 012C JMPF R16 #013B + 0x8C401F16, // 012D GETMET R16 R15 K22 + 0x58480030, // 012E LDCONST R18 K48 + 0x7C400400, // 012F CALL R16 2 + 0x78420009, // 0130 JMPF R16 #013B + 0x00401D31, // 0131 ADD R16 R14 K49 + 0x60440008, // 0132 GETGBL R17 G8 + 0x5C480800, // 0133 MOVE R18 R4 + 0x7C440200, // 0134 CALL R17 1 + 0x60480013, // 0135 GETGBL R18 G19 + 0x7C480000, // 0136 CALL R18 0 + 0x984A0732, // 0137 SETIDX R18 K3 K50 + 0x984A5010, // 0138 SETIDX R18 K40 R16 + 0x980C2212, // 0139 SETIDX R3 R17 R18 + 0x00100905, // 013A ADD R4 R4 K5 + 0x5442003F, // 013B LDINT R16 64 + 0x24400810, // 013C GT R16 R4 R16 + 0x78420000, // 013D JMPF R16 #013F + 0x70020000, // 013E JMP #0140 + 0x7001FFE4, // 013F JMP #0125 + 0xA8040001, // 0140 EXBLK 1 1 + 0x70020002, // 0141 JMP #0145 + 0x58340029, // 0142 LDCONST R13 K41 + 0xAC340200, // 0143 CATCH R13 1 0 + 0xB0080000, // 0144 RAISE 2 R0 R0 + 0x80040600, // 0145 RET 1 R3 }) ) ); @@ -4291,9 +2407,9 @@ be_local_closure(Matter_Device_mdns_announce_op_discovery_all_fabrics, /* name /******************************************************************** -** Solidified function: save_before_restart +** Solidified function: is_commissioning_open ********************************************************************/ -be_local_closure(Matter_Device_save_before_restart, /* name */ +be_local_closure(Matter_Device_is_commissioning_open, /* name */ be_nested_proto( 3, /* nstack */ 1, /* argc */ @@ -4303,18 +2419,16 @@ be_local_closure(Matter_Device_save_before_restart, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[ 2]) { /* constants */ - /* K0 */ be_nested_str_weak(stop_basic_commissioning), - /* K1 */ be_nested_str_weak(mdns_remove_op_discovery_all_fabrics), + ( &(const bvalue[ 1]) { /* constants */ + /* K0 */ be_nested_str_weak(commissioning_open), }), - be_str_weak(save_before_restart), + be_str_weak(is_commissioning_open), &be_const_str_solidified, - ( &(const binstruction[ 5]) { /* code */ - 0x8C040100, // 0000 GETMET R1 R0 K0 - 0x7C040200, // 0001 CALL R1 1 - 0x8C040101, // 0002 GETMET R1 R0 K1 - 0x7C040200, // 0003 CALL R1 1 - 0x80000000, // 0004 RET 0 + ( &(const binstruction[ 4]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x4C080000, // 0001 LDNIL R2 + 0x20040202, // 0002 NE R1 R1 R2 + 0x80040200, // 0003 RET 1 R1 }) ) ); @@ -4322,151 +2436,231 @@ be_local_closure(Matter_Device_save_before_restart, /* name */ /******************************************************************** -** Solidified function: get_plugin_class_arg +** Solidified function: init ********************************************************************/ -be_local_closure(Matter_Device_get_plugin_class_arg, /* name */ +be_local_closure(Matter_Device_init, /* name */ be_nested_proto( - 5, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 4]) { /* constants */ - /* K0 */ be_nested_str_weak(plugins_classes), - /* K1 */ be_nested_str_weak(find), - /* K2 */ be_nested_str_weak(ARG), - /* K3 */ be_nested_str_weak(), - }), - be_str_weak(get_plugin_class_arg), - &be_const_str_solidified, - ( &(const binstruction[ 9]) { /* code */ - 0x88080100, // 0000 GETMBR R2 R0 K0 - 0x8C080501, // 0001 GETMET R2 R2 K1 - 0x5C100200, // 0002 MOVE R4 R1 - 0x7C080400, // 0003 CALL R2 2 - 0x780A0001, // 0004 JMPF R2 #0007 - 0x880C0502, // 0005 GETMBR R3 R2 K2 - 0x70020000, // 0006 JMP #0008 - 0x580C0003, // 0007 LDCONST R3 K3 - 0x80040600, // 0008 RET 1 R3 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: msg_received -********************************************************************/ -be_local_closure(Matter_Device_msg_received, /* name */ - be_nested_proto( - 9, /* nstack */ - 4, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 2]) { /* constants */ - /* K0 */ be_nested_str_weak(message_handler), - /* K1 */ be_nested_str_weak(msg_received), - }), - be_str_weak(msg_received), - &be_const_str_solidified, - ( &(const binstruction[ 7]) { /* code */ - 0x88100100, // 0000 GETMBR R4 R0 K0 - 0x8C100901, // 0001 GETMET R4 R4 K1 - 0x5C180200, // 0002 MOVE R6 R1 - 0x5C1C0400, // 0003 MOVE R7 R2 - 0x5C200600, // 0004 MOVE R8 R3 - 0x7C100800, // 0005 CALL R4 4 - 0x80040800, // 0006 RET 1 R4 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: k2l_num -********************************************************************/ -be_local_closure(Matter_Device_k2l_num, /* name */ - be_nested_proto( - 9, /* nstack */ + 8, /* nstack */ 1, /* argc */ - 4, /* varg */ + 2, /* varg */ 0, /* has upvals */ NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 6]) { /* constants */ - /* K0 */ be_const_class(be_class_Matter_Device), - /* K1 */ be_nested_str_weak(keys), - /* K2 */ be_nested_str_weak(push), - /* K3 */ be_nested_str_weak(stop_iteration), - /* K4 */ be_const_int(1), - /* K5 */ be_const_int(0), + 1, /* has sup protos */ + ( &(const struct bproto*[ 2]) { + be_nested_proto( + 4, /* nstack */ + 0, /* argc */ + 0, /* varg */ + 1, /* has upvals */ + ( &(const bupvaldesc[ 1]) { /* upvals */ + be_local_const_upval(1, 0), + }), + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 5]) { /* constants */ + /* K0 */ be_nested_str_weak(start), + /* K1 */ be_nested_str_weak(tasmota), + /* K2 */ be_nested_str_weak(remove_rule), + /* K3 */ be_nested_str_weak(Wifi_X23Connected), + /* K4 */ be_nested_str_weak(matter_start), + }), + be_str_weak(_anonymous_), + &be_const_str_solidified, + ( &(const binstruction[ 9]) { /* code */ + 0x68000000, // 0000 GETUPV R0 U0 + 0x8C000100, // 0001 GETMET R0 R0 K0 + 0x7C000200, // 0002 CALL R0 1 + 0xB8020200, // 0003 GETNGBL R0 K1 + 0x8C000102, // 0004 GETMET R0 R0 K2 + 0x58080003, // 0005 LDCONST R2 K3 + 0x580C0004, // 0006 LDCONST R3 K4 + 0x7C000600, // 0007 CALL R0 3 + 0x80000000, // 0008 RET 0 + }) + ), + be_nested_proto( + 4, /* nstack */ + 0, /* argc */ + 0, /* varg */ + 1, /* has upvals */ + ( &(const bupvaldesc[ 1]) { /* upvals */ + be_local_const_upval(1, 0), + }), + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 5]) { /* constants */ + /* K0 */ be_nested_str_weak(start), + /* K1 */ be_nested_str_weak(tasmota), + /* K2 */ be_nested_str_weak(remove_rule), + /* K3 */ be_nested_str_weak(Eth_X23Connected), + /* K4 */ be_nested_str_weak(matter_start), + }), + be_str_weak(_anonymous_), + &be_const_str_solidified, + ( &(const binstruction[ 9]) { /* code */ + 0x68000000, // 0000 GETUPV R0 U0 + 0x8C000100, // 0001 GETMET R0 R0 K0 + 0x7C000200, // 0002 CALL R0 1 + 0xB8020200, // 0003 GETNGBL R0 K1 + 0x8C000102, // 0004 GETMET R0 R0 K2 + 0x58080003, // 0005 LDCONST R2 K3 + 0x580C0004, // 0006 LDCONST R3 K4 + 0x7C000600, // 0007 CALL R0 3 + 0x80000000, // 0008 RET 0 + }) + ), }), - be_str_weak(k2l_num), + 1, /* has constants */ + ( &(const bvalue[41]) { /* constants */ + /* K0 */ be_nested_str_weak(crypto), + /* K1 */ be_nested_str_weak(string), + /* K2 */ be_nested_str_weak(tasmota), + /* K3 */ be_nested_str_weak(get_option), + /* K4 */ be_nested_str_weak(matter), + /* K5 */ be_nested_str_weak(MATTER_OPTION), + /* K6 */ be_nested_str_weak(UI), + /* K7 */ be_nested_str_weak(started), + /* K8 */ be_nested_str_weak(tick), + /* K9 */ be_const_int(0), + /* K10 */ be_nested_str_weak(plugins), + /* K11 */ be_nested_str_weak(plugins_persist), + /* K12 */ be_nested_str_weak(plugins_classes), + /* K13 */ be_nested_str_weak(register_native_classes), + /* K14 */ be_nested_str_weak(vendorid), + /* K15 */ be_nested_str_weak(VENDOR_ID), + /* K16 */ be_nested_str_weak(productid), + /* K17 */ be_nested_str_weak(PRODUCT_ID), + /* K18 */ be_nested_str_weak(root_iterations), + /* K19 */ be_nested_str_weak(PBKDF_ITERATIONS), + /* K20 */ be_nested_str_weak(root_salt), + /* K21 */ be_nested_str_weak(random), + /* K22 */ be_nested_str_weak(ipv4only), + /* K23 */ be_nested_str_weak(load_param), + /* K24 */ be_nested_str_weak(sessions), + /* K25 */ be_nested_str_weak(Session_Store), + /* K26 */ be_nested_str_weak(load_fabrics), + /* K27 */ be_nested_str_weak(message_handler), + /* K28 */ be_nested_str_weak(MessageHandler), + /* K29 */ be_nested_str_weak(ui), + /* K30 */ be_nested_str_weak(wifi), + /* K31 */ be_nested_str_weak(up), + /* K32 */ be_nested_str_weak(eth), + /* K33 */ be_nested_str_weak(start), + /* K34 */ be_nested_str_weak(add_rule), + /* K35 */ be_nested_str_weak(Wifi_X23Connected), + /* K36 */ be_nested_str_weak(matter_start), + /* K37 */ be_nested_str_weak(Eth_X23Connected), + /* K38 */ be_nested_str_weak(_init_basic_commissioning), + /* K39 */ be_nested_str_weak(add_driver), + /* K40 */ be_nested_str_weak(register_commands), + }), + be_str_weak(init), &be_const_str_solidified, - ( &(const binstruction[52]) { /* code */ - 0x58040000, // 0000 LDCONST R1 K0 - 0x60080012, // 0001 GETGBL R2 G18 - 0x7C080000, // 0002 CALL R2 0 - 0x4C0C0000, // 0003 LDNIL R3 - 0x1C0C0003, // 0004 EQ R3 R0 R3 - 0x780E0000, // 0005 JMPF R3 #0007 - 0x80040400, // 0006 RET 1 R2 - 0x600C0010, // 0007 GETGBL R3 G16 - 0x8C100101, // 0008 GETMET R4 R0 K1 - 0x7C100200, // 0009 CALL R4 1 - 0x7C0C0200, // 000A CALL R3 1 - 0xA8020007, // 000B EXBLK 0 #0014 - 0x5C100600, // 000C MOVE R4 R3 - 0x7C100000, // 000D CALL R4 0 - 0x8C140502, // 000E GETMET R5 R2 K2 - 0x601C0009, // 000F GETGBL R7 G9 - 0x5C200800, // 0010 MOVE R8 R4 - 0x7C1C0200, // 0011 CALL R7 1 - 0x7C140400, // 0012 CALL R5 2 - 0x7001FFF7, // 0013 JMP #000C - 0x580C0003, // 0014 LDCONST R3 K3 - 0xAC0C0200, // 0015 CATCH R3 1 0 - 0xB0080000, // 0016 RAISE 2 R0 R0 - 0x600C0010, // 0017 GETGBL R3 G16 - 0x6010000C, // 0018 GETGBL R4 G12 - 0x5C140400, // 0019 MOVE R5 R2 - 0x7C100200, // 001A CALL R4 1 - 0x04100904, // 001B SUB R4 R4 K4 - 0x40120804, // 001C CONNECT R4 K4 R4 - 0x7C0C0200, // 001D CALL R3 1 - 0xA8020010, // 001E EXBLK 0 #0030 - 0x5C100600, // 001F MOVE R4 R3 - 0x7C100000, // 0020 CALL R4 0 - 0x94140404, // 0021 GETIDX R5 R2 R4 - 0x5C180800, // 0022 MOVE R6 R4 - 0x241C0D05, // 0023 GT R7 R6 K5 - 0x781E0008, // 0024 JMPF R7 #002E - 0x041C0D04, // 0025 SUB R7 R6 K4 - 0x941C0407, // 0026 GETIDX R7 R2 R7 - 0x241C0E05, // 0027 GT R7 R7 R5 - 0x781E0004, // 0028 JMPF R7 #002E - 0x041C0D04, // 0029 SUB R7 R6 K4 - 0x941C0407, // 002A GETIDX R7 R2 R7 - 0x98080C07, // 002B SETIDX R2 R6 R7 - 0x04180D04, // 002C SUB R6 R6 K4 - 0x7001FFF4, // 002D JMP #0023 - 0x98080C05, // 002E SETIDX R2 R6 R5 - 0x7001FFEE, // 002F JMP #001F - 0x580C0003, // 0030 LDCONST R3 K3 - 0xAC0C0200, // 0031 CATCH R3 1 0 - 0xB0080000, // 0032 RAISE 2 R0 R0 - 0x80040400, // 0033 RET 1 R2 + ( &(const binstruction[102]) { /* code */ + 0xA4060000, // 0000 IMPORT R1 K0 + 0xA40A0200, // 0001 IMPORT R2 K1 + 0xB80E0400, // 0002 GETNGBL R3 K2 + 0x8C0C0703, // 0003 GETMET R3 R3 K3 + 0xB8160800, // 0004 GETNGBL R5 K4 + 0x88140B05, // 0005 GETMBR R5 R5 K5 + 0x7C0C0400, // 0006 CALL R3 2 + 0x740E0004, // 0007 JMPT R3 #000D + 0xB80E0800, // 0008 GETNGBL R3 K4 + 0x8C0C0706, // 0009 GETMET R3 R3 K6 + 0x5C140000, // 000A MOVE R5 R0 + 0x7C0C0400, // 000B CALL R3 2 + 0x80000600, // 000C RET 0 + 0x500C0000, // 000D LDBOOL R3 0 0 + 0x90020E03, // 000E SETMBR R0 K7 R3 + 0x90021109, // 000F SETMBR R0 K8 K9 + 0x600C0012, // 0010 GETGBL R3 G18 + 0x7C0C0000, // 0011 CALL R3 0 + 0x90021403, // 0012 SETMBR R0 K10 R3 + 0x500C0000, // 0013 LDBOOL R3 0 0 + 0x90021603, // 0014 SETMBR R0 K11 R3 + 0x600C0013, // 0015 GETGBL R3 G19 + 0x7C0C0000, // 0016 CALL R3 0 + 0x90021803, // 0017 SETMBR R0 K12 R3 + 0x8C0C010D, // 0018 GETMET R3 R0 K13 + 0x7C0C0200, // 0019 CALL R3 1 + 0x880C010F, // 001A GETMBR R3 R0 K15 + 0x90021C03, // 001B SETMBR R0 K14 R3 + 0x880C0111, // 001C GETMBR R3 R0 K17 + 0x90022003, // 001D SETMBR R0 K16 R3 + 0x880C0113, // 001E GETMBR R3 R0 K19 + 0x90022403, // 001F SETMBR R0 K18 R3 + 0x8C0C0315, // 0020 GETMET R3 R1 K21 + 0x5416000F, // 0021 LDINT R5 16 + 0x7C0C0400, // 0022 CALL R3 2 + 0x90022803, // 0023 SETMBR R0 K20 R3 + 0x500C0000, // 0024 LDBOOL R3 0 0 + 0x90022C03, // 0025 SETMBR R0 K22 R3 + 0x8C0C0117, // 0026 GETMET R3 R0 K23 + 0x7C0C0200, // 0027 CALL R3 1 + 0xB80E0800, // 0028 GETNGBL R3 K4 + 0x8C0C0719, // 0029 GETMET R3 R3 K25 + 0x5C140000, // 002A MOVE R5 R0 + 0x7C0C0400, // 002B CALL R3 2 + 0x90023003, // 002C SETMBR R0 K24 R3 + 0x880C0118, // 002D GETMBR R3 R0 K24 + 0x8C0C071A, // 002E GETMET R3 R3 K26 + 0x7C0C0200, // 002F CALL R3 1 + 0xB80E0800, // 0030 GETNGBL R3 K4 + 0x8C0C071C, // 0031 GETMET R3 R3 K28 + 0x5C140000, // 0032 MOVE R5 R0 + 0x7C0C0400, // 0033 CALL R3 2 + 0x90023603, // 0034 SETMBR R0 K27 R3 + 0xB80E0800, // 0035 GETNGBL R3 K4 + 0x8C0C0706, // 0036 GETMET R3 R3 K6 + 0x5C140000, // 0037 MOVE R5 R0 + 0x7C0C0400, // 0038 CALL R3 2 + 0x90023A03, // 0039 SETMBR R0 K29 R3 + 0xB80E0400, // 003A GETNGBL R3 K2 + 0x8C0C071E, // 003B GETMET R3 R3 K30 + 0x7C0C0200, // 003C CALL R3 1 + 0x940C071F, // 003D GETIDX R3 R3 K31 + 0x740E0004, // 003E JMPT R3 #0044 + 0xB80E0400, // 003F GETNGBL R3 K2 + 0x8C0C0720, // 0040 GETMET R3 R3 K32 + 0x7C0C0200, // 0041 CALL R3 1 + 0x940C071F, // 0042 GETIDX R3 R3 K31 + 0x780E0001, // 0043 JMPF R3 #0046 + 0x8C0C0121, // 0044 GETMET R3 R0 K33 + 0x7C0C0200, // 0045 CALL R3 1 + 0xB80E0400, // 0046 GETNGBL R3 K2 + 0x8C0C071E, // 0047 GETMET R3 R3 K30 + 0x7C0C0200, // 0048 CALL R3 1 + 0x940C071F, // 0049 GETIDX R3 R3 K31 + 0x740E0005, // 004A JMPT R3 #0051 + 0xB80E0400, // 004B GETNGBL R3 K2 + 0x8C0C0722, // 004C GETMET R3 R3 K34 + 0x58140023, // 004D LDCONST R5 K35 + 0x84180000, // 004E CLOSURE R6 P0 + 0x581C0024, // 004F LDCONST R7 K36 + 0x7C0C0800, // 0050 CALL R3 4 + 0xB80E0400, // 0051 GETNGBL R3 K2 + 0x8C0C0720, // 0052 GETMET R3 R3 K32 + 0x7C0C0200, // 0053 CALL R3 1 + 0x940C071F, // 0054 GETIDX R3 R3 K31 + 0x740E0005, // 0055 JMPT R3 #005C + 0xB80E0400, // 0056 GETNGBL R3 K2 + 0x8C0C0722, // 0057 GETMET R3 R3 K34 + 0x58140025, // 0058 LDCONST R5 K37 + 0x84180001, // 0059 CLOSURE R6 P1 + 0x581C0024, // 005A LDCONST R7 K36 + 0x7C0C0800, // 005B CALL R3 4 + 0x8C0C0126, // 005C GETMET R3 R0 K38 + 0x7C0C0200, // 005D CALL R3 1 + 0xB80E0400, // 005E GETNGBL R3 K2 + 0x8C0C0727, // 005F GETMET R3 R3 K39 + 0x5C140000, // 0060 MOVE R5 R0 + 0x7C0C0400, // 0061 CALL R3 2 + 0x8C0C0128, // 0062 GETMET R3 R0 K40 + 0x7C0C0200, // 0063 CALL R3 1 + 0xA0000000, // 0064 CLOSE R0 + 0x80000000, // 0065 RET 0 }) ) ); @@ -4603,11 +2797,11 @@ be_local_closure(Matter_Device_mdns_remove_op_discovery, /* name */ /******************************************************************** -** Solidified function: get_plugin_class_displayname +** Solidified function: _mdns_announce_hostname ********************************************************************/ -be_local_closure(Matter_Device_get_plugin_class_displayname, /* name */ +be_local_closure(Matter_Device__mdns_announce_hostname, /* name */ be_nested_proto( - 5, /* nstack */ + 16, /* nstack */ 2, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -4615,87 +2809,211 @@ be_local_closure(Matter_Device_get_plugin_class_displayname, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[ 4]) { /* constants */ - /* K0 */ be_nested_str_weak(plugins_classes), - /* K1 */ be_nested_str_weak(find), - /* K2 */ be_nested_str_weak(NAME), - /* K3 */ be_nested_str_weak(), + ( &(const bvalue[28]) { /* constants */ + /* K0 */ be_nested_str_weak(mdns), + /* K1 */ be_nested_str_weak(string), + /* K2 */ be_nested_str_weak(start), + /* K3 */ be_nested_str_weak(tasmota), + /* K4 */ be_nested_str_weak(eth), + /* K5 */ be_nested_str_weak(hostname_eth), + /* K6 */ be_nested_str_weak(replace), + /* K7 */ be_nested_str_weak(find), + /* K8 */ be_nested_str_weak(mac), + /* K9 */ be_nested_str_weak(_X3A), + /* K10 */ be_nested_str_weak(), + /* K11 */ be_nested_str_weak(ipv4only), + /* K12 */ be_nested_str_weak(log), + /* K13 */ be_nested_str_weak(format), + /* K14 */ be_nested_str_weak(MTR_X3A_X20calling_X20mdns_X2Eadd_hostname_X28_X25s_X2C_X20_X25s_X2C_X20_X25s_X29), + /* K15 */ be_nested_str_weak(ip6local), + /* K16 */ be_nested_str_weak(ip), + /* K17 */ be_const_int(3), + /* K18 */ be_nested_str_weak(add_hostname), + /* K19 */ be_nested_str_weak(ip6), + /* K20 */ be_nested_str_weak(MTR_X3A_X20calling_X20mdns_X2Eadd_hostname_X28_X25s_X2C_X20_X25s_X29), + /* K21 */ be_nested_str_weak(wifi), + /* K22 */ be_nested_str_weak(hostname_wifi), + /* K23 */ be_nested_str_weak(MTR_X3A_X20start_X20mDNS_X20on_X20_X25s_X20host_X20_X27_X25s_X2Elocal_X27), + /* K24 */ be_const_int(2), + /* K25 */ be_nested_str_weak(MTR_X3A_X20Exception), + /* K26 */ be_nested_str_weak(_X7C), + /* K27 */ be_nested_str_weak(mdns_announce_op_discovery_all_fabrics), }), - be_str_weak(get_plugin_class_displayname), + be_str_weak(_mdns_announce_hostname), &be_const_str_solidified, - ( &(const binstruction[ 9]) { /* code */ - 0x88080100, // 0000 GETMBR R2 R0 K0 - 0x8C080501, // 0001 GETMET R2 R2 K1 - 0x5C100200, // 0002 MOVE R4 R1 - 0x7C080400, // 0003 CALL R2 2 - 0x780A0001, // 0004 JMPF R2 #0007 - 0x880C0502, // 0005 GETMBR R3 R2 K2 - 0x70020000, // 0006 JMP #0008 - 0x580C0003, // 0007 LDCONST R3 K3 - 0x80040600, // 0008 RET 1 R3 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: every_second -********************************************************************/ -be_local_closure(Matter_Device_every_second, /* name */ - be_nested_proto( - 4, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 9]) { /* constants */ - /* K0 */ be_nested_str_weak(sessions), - /* K1 */ be_nested_str_weak(every_second), - /* K2 */ be_nested_str_weak(message_handler), - /* K3 */ be_nested_str_weak(commissioning_open), - /* K4 */ be_nested_str_weak(tasmota), - /* K5 */ be_nested_str_weak(time_reached), - /* K6 */ be_const_int(0), - /* K7 */ be_nested_str_weak(plugins), - /* K8 */ be_const_int(1), - }), - be_str_weak(every_second), - &be_const_str_solidified, - ( &(const binstruction[30]) { /* code */ - 0x88040100, // 0000 GETMBR R1 R0 K0 - 0x8C040301, // 0001 GETMET R1 R1 K1 - 0x7C040200, // 0002 CALL R1 1 - 0x88040102, // 0003 GETMBR R1 R0 K2 - 0x8C040301, // 0004 GETMET R1 R1 K1 - 0x7C040200, // 0005 CALL R1 1 - 0x88040103, // 0006 GETMBR R1 R0 K3 - 0x4C080000, // 0007 LDNIL R2 - 0x20040202, // 0008 NE R1 R1 R2 - 0x78060006, // 0009 JMPF R1 #0011 - 0xB8060800, // 000A GETNGBL R1 K4 - 0x8C040305, // 000B GETMET R1 R1 K5 - 0x880C0103, // 000C GETMBR R3 R0 K3 - 0x7C040400, // 000D CALL R1 2 - 0x78060001, // 000E JMPF R1 #0011 - 0x4C040000, // 000F LDNIL R1 - 0x90020601, // 0010 SETMBR R0 K3 R1 - 0x58040006, // 0011 LDCONST R1 K6 - 0x6008000C, // 0012 GETGBL R2 G12 - 0x880C0107, // 0013 GETMBR R3 R0 K7 - 0x7C080200, // 0014 CALL R2 1 - 0x14080202, // 0015 LT R2 R1 R2 - 0x780A0005, // 0016 JMPF R2 #001D - 0x88080107, // 0017 GETMBR R2 R0 K7 - 0x94080401, // 0018 GETIDX R2 R2 R1 - 0x8C080501, // 0019 GETMET R2 R2 K1 - 0x7C080200, // 001A CALL R2 1 - 0x00040308, // 001B ADD R1 R1 K8 - 0x7001FFF4, // 001C JMP #0012 - 0x80000000, // 001D RET 0 + ( &(const binstruction[172]) { /* code */ + 0xA40A0000, // 0000 IMPORT R2 K0 + 0xA40E0200, // 0001 IMPORT R3 K1 + 0x8C100502, // 0002 GETMET R4 R2 K2 + 0x7C100200, // 0003 CALL R4 1 + 0xA8020092, // 0004 EXBLK 0 #0098 + 0x78060040, // 0005 JMPF R1 #0047 + 0xB8120600, // 0006 GETNGBL R4 K3 + 0x8C100904, // 0007 GETMET R4 R4 K4 + 0x7C100200, // 0008 CALL R4 1 + 0x8C140706, // 0009 GETMET R5 R3 K6 + 0x8C1C0907, // 000A GETMET R7 R4 K7 + 0x58240008, // 000B LDCONST R9 K8 + 0x7C1C0400, // 000C CALL R7 2 + 0x58200009, // 000D LDCONST R8 K9 + 0x5824000A, // 000E LDCONST R9 K10 + 0x7C140800, // 000F CALL R5 4 + 0x90020A05, // 0010 SETMBR R0 K5 R5 + 0x8814010B, // 0011 GETMBR R5 R0 K11 + 0x7416001F, // 0012 JMPT R5 #0033 + 0xB8160600, // 0013 GETNGBL R5 K3 + 0x8C140B0C, // 0014 GETMET R5 R5 K12 + 0x8C1C070D, // 0015 GETMET R7 R3 K13 + 0x5824000E, // 0016 LDCONST R9 K14 + 0x88280105, // 0017 GETMBR R10 R0 K5 + 0x8C2C0907, // 0018 GETMET R11 R4 K7 + 0x5834000F, // 0019 LDCONST R13 K15 + 0x5838000A, // 001A LDCONST R14 K10 + 0x7C2C0600, // 001B CALL R11 3 + 0x8C300907, // 001C GETMET R12 R4 K7 + 0x58380010, // 001D LDCONST R14 K16 + 0x583C000A, // 001E LDCONST R15 K10 + 0x7C300600, // 001F CALL R12 3 + 0x7C1C0A00, // 0020 CALL R7 5 + 0x58200011, // 0021 LDCONST R8 K17 + 0x7C140600, // 0022 CALL R5 3 + 0x8C140512, // 0023 GETMET R5 R2 K18 + 0x881C0105, // 0024 GETMBR R7 R0 K5 + 0x8C200907, // 0025 GETMET R8 R4 K7 + 0x5828000F, // 0026 LDCONST R10 K15 + 0x582C000A, // 0027 LDCONST R11 K10 + 0x7C200600, // 0028 CALL R8 3 + 0x8C240907, // 0029 GETMET R9 R4 K7 + 0x582C0010, // 002A LDCONST R11 K16 + 0x5830000A, // 002B LDCONST R12 K10 + 0x7C240600, // 002C CALL R9 3 + 0x8C280907, // 002D GETMET R10 R4 K7 + 0x58300013, // 002E LDCONST R12 K19 + 0x5834000A, // 002F LDCONST R13 K10 + 0x7C280600, // 0030 CALL R10 3 + 0x7C140A00, // 0031 CALL R5 5 + 0x70020012, // 0032 JMP #0046 + 0xB8160600, // 0033 GETNGBL R5 K3 + 0x8C140B0C, // 0034 GETMET R5 R5 K12 + 0x8C1C070D, // 0035 GETMET R7 R3 K13 + 0x58240014, // 0036 LDCONST R9 K20 + 0x88280105, // 0037 GETMBR R10 R0 K5 + 0x8C2C0907, // 0038 GETMET R11 R4 K7 + 0x58340010, // 0039 LDCONST R13 K16 + 0x5838000A, // 003A LDCONST R14 K10 + 0x7C2C0600, // 003B CALL R11 3 + 0x7C1C0800, // 003C CALL R7 4 + 0x58200011, // 003D LDCONST R8 K17 + 0x7C140600, // 003E CALL R5 3 + 0x8C140512, // 003F GETMET R5 R2 K18 + 0x881C0105, // 0040 GETMBR R7 R0 K5 + 0x8C200907, // 0041 GETMET R8 R4 K7 + 0x58280010, // 0042 LDCONST R10 K16 + 0x582C000A, // 0043 LDCONST R11 K10 + 0x7C200600, // 0044 CALL R8 3 + 0x7C140600, // 0045 CALL R5 3 + 0x7002003F, // 0046 JMP #0087 + 0xB8120600, // 0047 GETNGBL R4 K3 + 0x8C100915, // 0048 GETMET R4 R4 K21 + 0x7C100200, // 0049 CALL R4 1 + 0x8C140706, // 004A GETMET R5 R3 K6 + 0x8C1C0907, // 004B GETMET R7 R4 K7 + 0x58240008, // 004C LDCONST R9 K8 + 0x7C1C0400, // 004D CALL R7 2 + 0x58200009, // 004E LDCONST R8 K9 + 0x5824000A, // 004F LDCONST R9 K10 + 0x7C140800, // 0050 CALL R5 4 + 0x90022C05, // 0051 SETMBR R0 K22 R5 + 0x8814010B, // 0052 GETMBR R5 R0 K11 + 0x7416001F, // 0053 JMPT R5 #0074 + 0xB8160600, // 0054 GETNGBL R5 K3 + 0x8C140B0C, // 0055 GETMET R5 R5 K12 + 0x8C1C070D, // 0056 GETMET R7 R3 K13 + 0x5824000E, // 0057 LDCONST R9 K14 + 0x88280116, // 0058 GETMBR R10 R0 K22 + 0x8C2C0907, // 0059 GETMET R11 R4 K7 + 0x5834000F, // 005A LDCONST R13 K15 + 0x5838000A, // 005B LDCONST R14 K10 + 0x7C2C0600, // 005C CALL R11 3 + 0x8C300907, // 005D GETMET R12 R4 K7 + 0x58380010, // 005E LDCONST R14 K16 + 0x583C000A, // 005F LDCONST R15 K10 + 0x7C300600, // 0060 CALL R12 3 + 0x7C1C0A00, // 0061 CALL R7 5 + 0x58200011, // 0062 LDCONST R8 K17 + 0x7C140600, // 0063 CALL R5 3 + 0x8C140512, // 0064 GETMET R5 R2 K18 + 0x881C0116, // 0065 GETMBR R7 R0 K22 + 0x8C200907, // 0066 GETMET R8 R4 K7 + 0x5828000F, // 0067 LDCONST R10 K15 + 0x582C000A, // 0068 LDCONST R11 K10 + 0x7C200600, // 0069 CALL R8 3 + 0x8C240907, // 006A GETMET R9 R4 K7 + 0x582C0010, // 006B LDCONST R11 K16 + 0x5830000A, // 006C LDCONST R12 K10 + 0x7C240600, // 006D CALL R9 3 + 0x8C280907, // 006E GETMET R10 R4 K7 + 0x58300013, // 006F LDCONST R12 K19 + 0x5834000A, // 0070 LDCONST R13 K10 + 0x7C280600, // 0071 CALL R10 3 + 0x7C140A00, // 0072 CALL R5 5 + 0x70020012, // 0073 JMP #0087 + 0xB8160600, // 0074 GETNGBL R5 K3 + 0x8C140B0C, // 0075 GETMET R5 R5 K12 + 0x8C1C070D, // 0076 GETMET R7 R3 K13 + 0x58240014, // 0077 LDCONST R9 K20 + 0x88280105, // 0078 GETMBR R10 R0 K5 + 0x8C2C0907, // 0079 GETMET R11 R4 K7 + 0x58340010, // 007A LDCONST R13 K16 + 0x5838000A, // 007B LDCONST R14 K10 + 0x7C2C0600, // 007C CALL R11 3 + 0x7C1C0800, // 007D CALL R7 4 + 0x58200011, // 007E LDCONST R8 K17 + 0x7C140600, // 007F CALL R5 3 + 0x8C140512, // 0080 GETMET R5 R2 K18 + 0x881C0116, // 0081 GETMBR R7 R0 K22 + 0x8C200907, // 0082 GETMET R8 R4 K7 + 0x58280010, // 0083 LDCONST R10 K16 + 0x582C000A, // 0084 LDCONST R11 K10 + 0x7C200600, // 0085 CALL R8 3 + 0x7C140600, // 0086 CALL R5 3 + 0xB8120600, // 0087 GETNGBL R4 K3 + 0x8C10090C, // 0088 GETMET R4 R4 K12 + 0x8C18070D, // 0089 GETMET R6 R3 K13 + 0x58200017, // 008A LDCONST R8 K23 + 0x78060001, // 008B JMPF R1 #008E + 0x58240004, // 008C LDCONST R9 K4 + 0x70020000, // 008D JMP #008F + 0x58240015, // 008E LDCONST R9 K21 + 0x78060001, // 008F JMPF R1 #0092 + 0x88280105, // 0090 GETMBR R10 R0 K5 + 0x70020000, // 0091 JMP #0093 + 0x88280116, // 0092 GETMBR R10 R0 K22 + 0x7C180800, // 0093 CALL R6 4 + 0x581C0018, // 0094 LDCONST R7 K24 + 0x7C100600, // 0095 CALL R4 3 + 0xA8040001, // 0096 EXBLK 1 1 + 0x70020010, // 0097 JMP #00A9 + 0xAC100002, // 0098 CATCH R4 0 2 + 0x7002000D, // 0099 JMP #00A8 + 0xB81A0600, // 009A GETNGBL R6 K3 + 0x8C180D0C, // 009B GETMET R6 R6 K12 + 0x60200008, // 009C GETGBL R8 G8 + 0x5C240800, // 009D MOVE R9 R4 + 0x7C200200, // 009E CALL R8 1 + 0x00223208, // 009F ADD R8 K25 R8 + 0x0020111A, // 00A0 ADD R8 R8 K26 + 0x60240008, // 00A1 GETGBL R9 G8 + 0x5C280A00, // 00A2 MOVE R10 R5 + 0x7C240200, // 00A3 CALL R9 1 + 0x00201009, // 00A4 ADD R8 R8 R9 + 0x58240018, // 00A5 LDCONST R9 K24 + 0x7C180600, // 00A6 CALL R6 3 + 0x70020000, // 00A7 JMP #00A9 + 0xB0080000, // 00A8 RAISE 2 R0 R0 + 0x8C10011B, // 00A9 GETMET R4 R0 K27 + 0x7C100200, // 00AA CALL R4 1 + 0x80000000, // 00AB RET 0 }) ) ); @@ -4834,25 +3152,1888 @@ be_local_closure(Matter_Device_start_mdns_announce_hostnames, /* name */ /*******************************************************************/ +/******************************************************************** +** Solidified function: MtrJoin +********************************************************************/ +be_local_closure(Matter_Device_MtrJoin, /* name */ + be_nested_proto( + 8, /* nstack */ + 5, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 4]) { /* constants */ + /* K0 */ be_nested_str_weak(start_root_basic_commissioning), + /* K1 */ be_nested_str_weak(stop_basic_commissioning), + /* K2 */ be_nested_str_weak(tasmota), + /* K3 */ be_nested_str_weak(resp_cmnd_done), + }), + be_str_weak(MtrJoin), + &be_const_str_solidified, + ( &(const binstruction[13]) { /* code */ + 0x60140009, // 0000 GETGBL R5 G9 + 0x5C180600, // 0001 MOVE R6 R3 + 0x7C140200, // 0002 CALL R5 1 + 0x78160002, // 0003 JMPF R5 #0007 + 0x8C180100, // 0004 GETMET R6 R0 K0 + 0x7C180200, // 0005 CALL R6 1 + 0x70020001, // 0006 JMP #0009 + 0x8C180101, // 0007 GETMET R6 R0 K1 + 0x7C180200, // 0008 CALL R6 1 + 0xB81A0400, // 0009 GETNGBL R6 K2 + 0x8C180D03, // 000A GETMET R6 R6 K3 + 0x7C180200, // 000B CALL R6 1 + 0x80000000, // 000C RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: _load_plugins_config +********************************************************************/ +be_local_closure(Matter_Device__load_plugins_config, /* name */ + be_nested_proto( + 19, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[27]) { /* constants */ + /* K0 */ be_nested_str_weak(string), + /* K1 */ be_nested_str_weak(k2l_num), + /* K2 */ be_nested_str_weak(tasmota), + /* K3 */ be_nested_str_weak(log), + /* K4 */ be_nested_str_weak(MTR_X3A_X20endpoints_X20to_X20be_X20configured_X20), + /* K5 */ be_const_int(3), + /* K6 */ be_nested_str_weak(format), + /* K7 */ be_nested_str_weak(MTR_X3A_X20endpoint_X20_X25i_X20config_X20_X25s), + /* K8 */ be_nested_str_weak(find), + /* K9 */ be_nested_str_weak(type), + /* K10 */ be_nested_str_weak(MTR_X3A_X20no_X20class_X20name_X2C_X20skipping), + /* K11 */ be_nested_str_weak(plugins_classes), + /* K12 */ be_nested_str_weak(MTR_X3A_X20unknown_X20class_X20name_X20_X27), + /* K13 */ be_nested_str_weak(_X27_X20skipping), + /* K14 */ be_const_int(2), + /* K15 */ be_nested_str_weak(plugins), + /* K16 */ be_nested_str_weak(push), + /* K17 */ be_nested_str_weak(), + /* K18 */ be_nested_str_weak(k2l), + /* K19 */ be_nested_str_weak(_X20_X25s_X3A_X25s), + /* K20 */ be_nested_str_weak(stop_iteration), + /* K21 */ be_nested_str_weak(MTR_X3A_X20endpoint_X3A_X25i_X20type_X3A_X25s_X25s), + /* K22 */ be_nested_str_weak(MTR_X3A_X20Exception), + /* K23 */ be_nested_str_weak(_X7C), + /* K24 */ be_nested_str_weak(publish_result), + /* K25 */ be_nested_str_weak(_X7B_X22Matter_X22_X3A_X7B_X22Initialized_X22_X3A1_X7D_X7D), + /* K26 */ be_nested_str_weak(Matter), + }), + be_str_weak(_load_plugins_config), + &be_const_str_solidified, + ( &(const binstruction[133]) { /* code */ + 0xA40A0000, // 0000 IMPORT R2 K0 + 0x8C0C0101, // 0001 GETMET R3 R0 K1 + 0x5C140200, // 0002 MOVE R5 R1 + 0x7C0C0400, // 0003 CALL R3 2 + 0xB8120400, // 0004 GETNGBL R4 K2 + 0x8C100903, // 0005 GETMET R4 R4 K3 + 0x60180008, // 0006 GETGBL R6 G8 + 0x5C1C0600, // 0007 MOVE R7 R3 + 0x7C180200, // 0008 CALL R6 1 + 0x001A0806, // 0009 ADD R6 K4 R6 + 0x581C0005, // 000A LDCONST R7 K5 + 0x7C100600, // 000B CALL R4 3 + 0x60100010, // 000C GETGBL R4 G16 + 0x5C140600, // 000D MOVE R5 R3 + 0x7C100200, // 000E CALL R4 1 + 0xA802006B, // 000F EXBLK 0 #007C + 0x5C140800, // 0010 MOVE R5 R4 + 0x7C140000, // 0011 CALL R5 0 + 0xA8020056, // 0012 EXBLK 0 #006A + 0x60180008, // 0013 GETGBL R6 G8 + 0x5C1C0A00, // 0014 MOVE R7 R5 + 0x7C180200, // 0015 CALL R6 1 + 0x94180206, // 0016 GETIDX R6 R1 R6 + 0xB81E0400, // 0017 GETNGBL R7 K2 + 0x8C1C0F03, // 0018 GETMET R7 R7 K3 + 0x8C240506, // 0019 GETMET R9 R2 K6 + 0x582C0007, // 001A LDCONST R11 K7 + 0x5C300A00, // 001B MOVE R12 R5 + 0x5C340C00, // 001C MOVE R13 R6 + 0x7C240800, // 001D CALL R9 4 + 0x58280005, // 001E LDCONST R10 K5 + 0x7C1C0600, // 001F CALL R7 3 + 0x8C1C0D08, // 0020 GETMET R7 R6 K8 + 0x58240009, // 0021 LDCONST R9 K9 + 0x7C1C0400, // 0022 CALL R7 2 + 0x4C200000, // 0023 LDNIL R8 + 0x1C200E08, // 0024 EQ R8 R7 R8 + 0x78220006, // 0025 JMPF R8 #002D + 0xB8220400, // 0026 GETNGBL R8 K2 + 0x8C201103, // 0027 GETMET R8 R8 K3 + 0x5828000A, // 0028 LDCONST R10 K10 + 0x582C0005, // 0029 LDCONST R11 K5 + 0x7C200600, // 002A CALL R8 3 + 0xA8040001, // 002B EXBLK 1 1 + 0x7001FFE2, // 002C JMP #0010 + 0x8820010B, // 002D GETMBR R8 R0 K11 + 0x8C201108, // 002E GETMET R8 R8 K8 + 0x5C280E00, // 002F MOVE R10 R7 + 0x7C200400, // 0030 CALL R8 2 + 0x4C240000, // 0031 LDNIL R9 + 0x1C241009, // 0032 EQ R9 R8 R9 + 0x7826000A, // 0033 JMPF R9 #003F + 0xB8260400, // 0034 GETNGBL R9 K2 + 0x8C241303, // 0035 GETMET R9 R9 K3 + 0x602C0008, // 0036 GETGBL R11 G8 + 0x5C300E00, // 0037 MOVE R12 R7 + 0x7C2C0200, // 0038 CALL R11 1 + 0x002E180B, // 0039 ADD R11 K12 R11 + 0x002C170D, // 003A ADD R11 R11 K13 + 0x5830000E, // 003B LDCONST R12 K14 + 0x7C240600, // 003C CALL R9 3 + 0xA8040001, // 003D EXBLK 1 1 + 0x7001FFD0, // 003E JMP #0010 + 0x5C241000, // 003F MOVE R9 R8 + 0x5C280000, // 0040 MOVE R10 R0 + 0x5C2C0A00, // 0041 MOVE R11 R5 + 0x5C300C00, // 0042 MOVE R12 R6 + 0x7C240600, // 0043 CALL R9 3 + 0x8828010F, // 0044 GETMBR R10 R0 K15 + 0x8C281510, // 0045 GETMET R10 R10 K16 + 0x5C301200, // 0046 MOVE R12 R9 + 0x7C280400, // 0047 CALL R10 2 + 0x58280011, // 0048 LDCONST R10 K17 + 0x602C0010, // 0049 GETGBL R11 G16 + 0x8C300112, // 004A GETMET R12 R0 K18 + 0x5C380C00, // 004B MOVE R14 R6 + 0x7C300400, // 004C CALL R12 2 + 0x7C2C0200, // 004D CALL R11 1 + 0xA802000B, // 004E EXBLK 0 #005B + 0x5C301600, // 004F MOVE R12 R11 + 0x7C300000, // 0050 CALL R12 0 + 0x1C341909, // 0051 EQ R13 R12 K9 + 0x78360000, // 0052 JMPF R13 #0054 + 0x7001FFFA, // 0053 JMP #004F + 0x8C340506, // 0054 GETMET R13 R2 K6 + 0x583C0013, // 0055 LDCONST R15 K19 + 0x5C401800, // 0056 MOVE R16 R12 + 0x94440C0C, // 0057 GETIDX R17 R6 R12 + 0x7C340800, // 0058 CALL R13 4 + 0x0028140D, // 0059 ADD R10 R10 R13 + 0x7001FFF3, // 005A JMP #004F + 0x582C0014, // 005B LDCONST R11 K20 + 0xAC2C0200, // 005C CATCH R11 1 0 + 0xB0080000, // 005D RAISE 2 R0 R0 + 0xB82E0400, // 005E GETNGBL R11 K2 + 0x8C2C1703, // 005F GETMET R11 R11 K3 + 0x8C340506, // 0060 GETMET R13 R2 K6 + 0x583C0015, // 0061 LDCONST R15 K21 + 0x5C400A00, // 0062 MOVE R16 R5 + 0x5C440E00, // 0063 MOVE R17 R7 + 0x5C481400, // 0064 MOVE R18 R10 + 0x7C340A00, // 0065 CALL R13 5 + 0x5838000E, // 0066 LDCONST R14 K14 + 0x7C2C0600, // 0067 CALL R11 3 + 0xA8040001, // 0068 EXBLK 1 1 + 0x70020010, // 0069 JMP #007B + 0xAC180002, // 006A CATCH R6 0 2 + 0x7002000D, // 006B JMP #007A + 0xB8220400, // 006C GETNGBL R8 K2 + 0x8C201103, // 006D GETMET R8 R8 K3 + 0x60280008, // 006E GETGBL R10 G8 + 0x5C2C0C00, // 006F MOVE R11 R6 + 0x7C280200, // 0070 CALL R10 1 + 0x002A2C0A, // 0071 ADD R10 K22 R10 + 0x00281517, // 0072 ADD R10 R10 K23 + 0x602C0008, // 0073 GETGBL R11 G8 + 0x5C300E00, // 0074 MOVE R12 R7 + 0x7C2C0200, // 0075 CALL R11 1 + 0x0028140B, // 0076 ADD R10 R10 R11 + 0x582C000E, // 0077 LDCONST R11 K14 + 0x7C200600, // 0078 CALL R8 3 + 0x70020000, // 0079 JMP #007B + 0xB0080000, // 007A RAISE 2 R0 R0 + 0x7001FF93, // 007B JMP #0010 + 0x58100014, // 007C LDCONST R4 K20 + 0xAC100200, // 007D CATCH R4 1 0 + 0xB0080000, // 007E RAISE 2 R0 R0 + 0xB8120400, // 007F GETNGBL R4 K2 + 0x8C100918, // 0080 GETMET R4 R4 K24 + 0x58180019, // 0081 LDCONST R6 K25 + 0x581C001A, // 0082 LDCONST R7 K26 + 0x7C100600, // 0083 CALL R4 3 + 0x80000000, // 0084 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: save_before_restart +********************************************************************/ +be_local_closure(Matter_Device_save_before_restart, /* name */ + be_nested_proto( + 3, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 2]) { /* constants */ + /* K0 */ be_nested_str_weak(stop_basic_commissioning), + /* K1 */ be_nested_str_weak(mdns_remove_op_discovery_all_fabrics), + }), + be_str_weak(save_before_restart), + &be_const_str_solidified, + ( &(const binstruction[ 5]) { /* code */ + 0x8C040100, // 0000 GETMET R1 R0 K0 + 0x7C040200, // 0001 CALL R1 1 + 0x8C040101, // 0002 GETMET R1 R0 K1 + 0x7C040200, // 0003 CALL R1 1 + 0x80000000, // 0004 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: start_root_basic_commissioning +********************************************************************/ +be_local_closure(Matter_Device_start_root_basic_commissioning, /* name */ + be_nested_proto( + 14, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[23]) { /* constants */ + /* K0 */ be_nested_str_weak(string), + /* K1 */ be_nested_str_weak(PASE_TIMEOUT), + /* K2 */ be_nested_str_weak(compute_manual_pairing_code), + /* K3 */ be_nested_str_weak(tasmota), + /* K4 */ be_nested_str_weak(log), + /* K5 */ be_nested_str_weak(format), + /* K6 */ be_nested_str_weak(MTR_X3A_X20Manual_X20pairing_X20code_X3A_X20_X25s_X2D_X25s_X2D_X25s), + /* K7 */ be_const_int(0), + /* K8 */ be_const_int(3), + /* K9 */ be_const_int(2147483647), + /* K10 */ be_const_int(2), + /* K11 */ be_nested_str_weak(compute_qrcode_content), + /* K12 */ be_nested_str_weak(publish_result), + /* K13 */ be_nested_str_weak(_X7B_X22Matter_X22_X3A_X7B_X22Commissioning_X22_X3A1_X2C_X22PairingCode_X22_X3A_X22_X25s_X22_X2C_X22QRCode_X22_X3A_X22_X25s_X22_X7D_X7D), + /* K14 */ be_nested_str_weak(Matter), + /* K15 */ be_nested_str_weak(_compute_pbkdf), + /* K16 */ be_nested_str_weak(root_passcode), + /* K17 */ be_nested_str_weak(root_iterations), + /* K18 */ be_nested_str_weak(root_salt), + /* K19 */ be_nested_str_weak(start_basic_commissioning), + /* K20 */ be_nested_str_weak(root_discriminator), + /* K21 */ be_nested_str_weak(root_w0), + /* K22 */ be_nested_str_weak(root_L), + }), + be_str_weak(start_root_basic_commissioning), + &be_const_str_solidified, + ( &(const binstruction[49]) { /* code */ + 0xA40A0000, // 0000 IMPORT R2 K0 + 0x4C0C0000, // 0001 LDNIL R3 + 0x1C0C0203, // 0002 EQ R3 R1 R3 + 0x780E0000, // 0003 JMPF R3 #0005 + 0x88040101, // 0004 GETMBR R1 R0 K1 + 0x8C0C0102, // 0005 GETMET R3 R0 K2 + 0x7C0C0200, // 0006 CALL R3 1 + 0xB8120600, // 0007 GETNGBL R4 K3 + 0x8C100904, // 0008 GETMET R4 R4 K4 + 0x8C180505, // 0009 GETMET R6 R2 K5 + 0x58200006, // 000A LDCONST R8 K6 + 0x40260F08, // 000B CONNECT R9 K7 K8 + 0x94240609, // 000C GETIDX R9 R3 R9 + 0x542A0003, // 000D LDINT R10 4 + 0x542E0005, // 000E LDINT R11 6 + 0x4028140B, // 000F CONNECT R10 R10 R11 + 0x9428060A, // 0010 GETIDX R10 R3 R10 + 0x542E0006, // 0011 LDINT R11 7 + 0x402C1709, // 0012 CONNECT R11 R11 K9 + 0x942C060B, // 0013 GETIDX R11 R3 R11 + 0x7C180A00, // 0014 CALL R6 5 + 0x581C000A, // 0015 LDCONST R7 K10 + 0x7C100600, // 0016 CALL R4 3 + 0x8C10010B, // 0017 GETMET R4 R0 K11 + 0x7C100200, // 0018 CALL R4 1 + 0xB8160600, // 0019 GETNGBL R5 K3 + 0x8C140B0C, // 001A GETMET R5 R5 K12 + 0x8C1C0505, // 001B GETMET R7 R2 K5 + 0x5824000D, // 001C LDCONST R9 K13 + 0x5C280600, // 001D MOVE R10 R3 + 0x5C2C0800, // 001E MOVE R11 R4 + 0x7C1C0800, // 001F CALL R7 4 + 0x5820000E, // 0020 LDCONST R8 K14 + 0x7C140600, // 0021 CALL R5 3 + 0x8C14010F, // 0022 GETMET R5 R0 K15 + 0x881C0110, // 0023 GETMBR R7 R0 K16 + 0x88200111, // 0024 GETMBR R8 R0 K17 + 0x88240112, // 0025 GETMBR R9 R0 K18 + 0x7C140800, // 0026 CALL R5 4 + 0x8C140113, // 0027 GETMET R5 R0 K19 + 0x5C1C0200, // 0028 MOVE R7 R1 + 0x88200111, // 0029 GETMBR R8 R0 K17 + 0x88240114, // 002A GETMBR R9 R0 K20 + 0x88280112, // 002B GETMBR R10 R0 K18 + 0x882C0115, // 002C GETMBR R11 R0 K21 + 0x88300116, // 002D GETMBR R12 R0 K22 + 0x4C340000, // 002E LDNIL R13 + 0x7C141000, // 002F CALL R5 8 + 0x80000000, // 0030 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: received_ack +********************************************************************/ +be_local_closure(Matter_Device_received_ack, /* name */ + be_nested_proto( + 5, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 2]) { /* constants */ + /* K0 */ be_nested_str_weak(udp_server), + /* K1 */ be_nested_str_weak(received_ack), + }), + be_str_weak(received_ack), + &be_const_str_solidified, + ( &(const binstruction[ 5]) { /* code */ + 0x88080100, // 0000 GETMBR R2 R0 K0 + 0x8C080501, // 0001 GETMET R2 R2 K1 + 0x5C100200, // 0002 MOVE R4 R1 + 0x7C080400, // 0003 CALL R2 2 + 0x80040400, // 0004 RET 1 R2 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: _compute_pbkdf +********************************************************************/ +be_local_closure(Matter_Device__compute_pbkdf, /* name */ + be_nested_proto( + 14, /* nstack */ + 4, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[11]) { /* constants */ + /* K0 */ be_nested_str_weak(crypto), + /* K1 */ be_nested_str_weak(string), + /* K2 */ be_nested_str_weak(add), + /* K3 */ be_nested_str_weak(PBKDF2_HMAC_SHA256), + /* K4 */ be_nested_str_weak(derive), + /* K5 */ be_const_int(0), + /* K6 */ be_nested_str_weak(root_w0), + /* K7 */ be_nested_str_weak(EC_P256), + /* K8 */ be_nested_str_weak(mod), + /* K9 */ be_nested_str_weak(root_L), + /* K10 */ be_nested_str_weak(public_key), + }), + be_str_weak(_compute_pbkdf), + &be_const_str_solidified, + ( &(const binstruction[41]) { /* code */ + 0xA4120000, // 0000 IMPORT R4 K0 + 0xA4160200, // 0001 IMPORT R5 K1 + 0x60180015, // 0002 GETGBL R6 G21 + 0x7C180000, // 0003 CALL R6 0 + 0x8C180D02, // 0004 GETMET R6 R6 K2 + 0x5C200200, // 0005 MOVE R8 R1 + 0x54260003, // 0006 LDINT R9 4 + 0x7C180600, // 0007 CALL R6 3 + 0x8C1C0903, // 0008 GETMET R7 R4 K3 + 0x7C1C0200, // 0009 CALL R7 1 + 0x8C1C0F04, // 000A GETMET R7 R7 K4 + 0x5C240C00, // 000B MOVE R9 R6 + 0x5C280600, // 000C MOVE R10 R3 + 0x5C2C0400, // 000D MOVE R11 R2 + 0x5432004F, // 000E LDINT R12 80 + 0x7C1C0A00, // 000F CALL R7 5 + 0x54220026, // 0010 LDINT R8 39 + 0x40220A08, // 0011 CONNECT R8 K5 R8 + 0x94200E08, // 0012 GETIDX R8 R7 R8 + 0x54260027, // 0013 LDINT R9 40 + 0x542A004E, // 0014 LDINT R10 79 + 0x4024120A, // 0015 CONNECT R9 R9 R10 + 0x94240E09, // 0016 GETIDX R9 R7 R9 + 0x8C280907, // 0017 GETMET R10 R4 K7 + 0x7C280200, // 0018 CALL R10 1 + 0x8C281508, // 0019 GETMET R10 R10 K8 + 0x5C301000, // 001A MOVE R12 R8 + 0x7C280400, // 001B CALL R10 2 + 0x90020C0A, // 001C SETMBR R0 K6 R10 + 0x8C280907, // 001D GETMET R10 R4 K7 + 0x7C280200, // 001E CALL R10 1 + 0x8C281508, // 001F GETMET R10 R10 K8 + 0x5C301200, // 0020 MOVE R12 R9 + 0x7C280400, // 0021 CALL R10 2 + 0x8C2C0907, // 0022 GETMET R11 R4 K7 + 0x7C2C0200, // 0023 CALL R11 1 + 0x8C2C170A, // 0024 GETMET R11 R11 K10 + 0x5C341400, // 0025 MOVE R13 R10 + 0x7C2C0400, // 0026 CALL R11 2 + 0x9002120B, // 0027 SETMBR R0 K9 R11 + 0x80000000, // 0028 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: start_commissioning_complete_deferred +********************************************************************/ +be_local_closure(Matter_Device_start_commissioning_complete_deferred, /* name */ + be_nested_proto( + 6, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 1, /* has sup protos */ + ( &(const struct bproto*[ 1]) { + be_nested_proto( + 3, /* nstack */ + 0, /* argc */ + 0, /* varg */ + 1, /* has upvals */ + ( &(const bupvaldesc[ 2]) { /* upvals */ + be_local_const_upval(1, 0), + be_local_const_upval(1, 1), + }), + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 1]) { /* constants */ + /* K0 */ be_nested_str_weak(start_commissioning_complete), + }), + be_str_weak(_X3Clambda_X3E), + &be_const_str_solidified, + ( &(const binstruction[ 5]) { /* code */ + 0x68000000, // 0000 GETUPV R0 U0 + 0x8C000100, // 0001 GETMET R0 R0 K0 + 0x68080001, // 0002 GETUPV R2 U1 + 0x7C000400, // 0003 CALL R0 2 + 0x80040000, // 0004 RET 1 R0 + }) + ), + }), + 1, /* has constants */ + ( &(const bvalue[ 3]) { /* constants */ + /* K0 */ be_nested_str_weak(tasmota), + /* K1 */ be_nested_str_weak(set_timer), + /* K2 */ be_const_int(0), + }), + be_str_weak(start_commissioning_complete_deferred), + &be_const_str_solidified, + ( &(const binstruction[ 7]) { /* code */ + 0xB80A0000, // 0000 GETNGBL R2 K0 + 0x8C080501, // 0001 GETMET R2 R2 K1 + 0x58100002, // 0002 LDCONST R4 K2 + 0x84140000, // 0003 CLOSURE R5 P0 + 0x7C080600, // 0004 CALL R2 3 + 0xA0000000, // 0005 CLOSE R0 + 0x80000000, // 0006 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: start_basic_commissioning +********************************************************************/ +be_local_closure(Matter_Device_start_basic_commissioning, /* name */ + be_nested_proto( + 13, /* nstack */ + 8, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 1, /* has sup protos */ + ( &(const struct bproto*[ 2]) { + be_nested_proto( + 4, /* nstack */ + 0, /* argc */ + 0, /* varg */ + 1, /* has upvals */ + ( &(const bupvaldesc[ 1]) { /* upvals */ + be_local_const_upval(1, 0), + }), + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 4]) { /* constants */ + /* K0 */ be_nested_str_weak(mdns_announce_PASE), + /* K1 */ be_nested_str_weak(tasmota), + /* K2 */ be_nested_str_weak(remove_rule), + /* K3 */ be_nested_str_weak(Wifi_X23Connected), + }), + be_str_weak(_anonymous_), + &be_const_str_solidified, + ( &(const binstruction[ 9]) { /* code */ + 0x68000000, // 0000 GETUPV R0 U0 + 0x8C000100, // 0001 GETMET R0 R0 K0 + 0x7C000200, // 0002 CALL R0 1 + 0xB8020200, // 0003 GETNGBL R0 K1 + 0x8C000102, // 0004 GETMET R0 R0 K2 + 0x58080003, // 0005 LDCONST R2 K3 + 0x580C0000, // 0006 LDCONST R3 K0 + 0x7C000600, // 0007 CALL R0 3 + 0x80000000, // 0008 RET 0 + }) + ), + be_nested_proto( + 4, /* nstack */ + 0, /* argc */ + 0, /* varg */ + 1, /* has upvals */ + ( &(const bupvaldesc[ 1]) { /* upvals */ + be_local_const_upval(1, 0), + }), + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 4]) { /* constants */ + /* K0 */ be_nested_str_weak(mdns_announce_PASE), + /* K1 */ be_nested_str_weak(tasmota), + /* K2 */ be_nested_str_weak(remove_rule), + /* K3 */ be_nested_str_weak(Eth_X23Connected), + }), + be_str_weak(_anonymous_), + &be_const_str_solidified, + ( &(const binstruction[ 9]) { /* code */ + 0x68000000, // 0000 GETUPV R0 U0 + 0x8C000100, // 0001 GETMET R0 R0 K0 + 0x7C000200, // 0002 CALL R0 1 + 0xB8020200, // 0003 GETNGBL R0 K1 + 0x8C000102, // 0004 GETMET R0 R0 K2 + 0x58080003, // 0005 LDCONST R2 K3 + 0x580C0000, // 0006 LDCONST R3 K0 + 0x7C000600, // 0007 CALL R0 3 + 0x80000000, // 0008 RET 0 + }) + ), + }), + 1, /* has constants */ + ( &(const bvalue[16]) { /* constants */ + /* K0 */ be_nested_str_weak(commissioning_open), + /* K1 */ be_nested_str_weak(tasmota), + /* K2 */ be_nested_str_weak(millis), + /* K3 */ be_nested_str_weak(commissioning_iterations), + /* K4 */ be_nested_str_weak(commissioning_discriminator), + /* K5 */ be_nested_str_weak(commissioning_salt), + /* K6 */ be_nested_str_weak(commissioning_w0), + /* K7 */ be_nested_str_weak(commissioning_L), + /* K8 */ be_nested_str_weak(commissioning_admin_fabric), + /* K9 */ be_nested_str_weak(wifi), + /* K10 */ be_nested_str_weak(up), + /* K11 */ be_nested_str_weak(eth), + /* K12 */ be_nested_str_weak(mdns_announce_PASE), + /* K13 */ be_nested_str_weak(add_rule), + /* K14 */ be_nested_str_weak(Wifi_X23Connected), + /* K15 */ be_nested_str_weak(Eth_X23Connected), + }), + be_str_weak(start_basic_commissioning), + &be_const_str_solidified, + ( &(const binstruction[40]) { /* code */ + 0xB8220200, // 0000 GETNGBL R8 K1 + 0x8C201102, // 0001 GETMET R8 R8 K2 + 0x7C200200, // 0002 CALL R8 1 + 0x542603E7, // 0003 LDINT R9 1000 + 0x08240209, // 0004 MUL R9 R1 R9 + 0x00201009, // 0005 ADD R8 R8 R9 + 0x90020008, // 0006 SETMBR R0 K0 R8 + 0x90020602, // 0007 SETMBR R0 K3 R2 + 0x90020803, // 0008 SETMBR R0 K4 R3 + 0x90020A04, // 0009 SETMBR R0 K5 R4 + 0x90020C05, // 000A SETMBR R0 K6 R5 + 0x90020E06, // 000B SETMBR R0 K7 R6 + 0x90021007, // 000C SETMBR R0 K8 R7 + 0xB8220200, // 000D GETNGBL R8 K1 + 0x8C201109, // 000E GETMET R8 R8 K9 + 0x7C200200, // 000F CALL R8 1 + 0x9420110A, // 0010 GETIDX R8 R8 K10 + 0x74220004, // 0011 JMPT R8 #0017 + 0xB8220200, // 0012 GETNGBL R8 K1 + 0x8C20110B, // 0013 GETMET R8 R8 K11 + 0x7C200200, // 0014 CALL R8 1 + 0x9420110A, // 0015 GETIDX R8 R8 K10 + 0x78220002, // 0016 JMPF R8 #001A + 0x8C20010C, // 0017 GETMET R8 R0 K12 + 0x7C200200, // 0018 CALL R8 1 + 0x7002000B, // 0019 JMP #0026 + 0xB8220200, // 001A GETNGBL R8 K1 + 0x8C20110D, // 001B GETMET R8 R8 K13 + 0x5828000E, // 001C LDCONST R10 K14 + 0x842C0000, // 001D CLOSURE R11 P0 + 0x5830000C, // 001E LDCONST R12 K12 + 0x7C200800, // 001F CALL R8 4 + 0xB8220200, // 0020 GETNGBL R8 K1 + 0x8C20110D, // 0021 GETMET R8 R8 K13 + 0x5828000F, // 0022 LDCONST R10 K15 + 0x842C0001, // 0023 CLOSURE R11 P1 + 0x5830000C, // 0024 LDCONST R12 K12 + 0x7C200800, // 0025 CALL R8 4 + 0xA0000000, // 0026 CLOSE R0 + 0x80000000, // 0027 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: mdns_announce_op_discovery_all_fabrics +********************************************************************/ +be_local_closure(Matter_Device_mdns_announce_op_discovery_all_fabrics, /* name */ + be_nested_proto( + 6, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 6]) { /* constants */ + /* K0 */ be_nested_str_weak(sessions), + /* K1 */ be_nested_str_weak(active_fabrics), + /* K2 */ be_nested_str_weak(get_device_id), + /* K3 */ be_nested_str_weak(get_fabric_id), + /* K4 */ be_nested_str_weak(mdns_announce_op_discovery), + /* K5 */ be_nested_str_weak(stop_iteration), + }), + be_str_weak(mdns_announce_op_discovery_all_fabrics), + &be_const_str_solidified, + ( &(const binstruction[22]) { /* code */ + 0x60040010, // 0000 GETGBL R1 G16 + 0x88080100, // 0001 GETMBR R2 R0 K0 + 0x8C080501, // 0002 GETMET R2 R2 K1 + 0x7C080200, // 0003 CALL R2 1 + 0x7C040200, // 0004 CALL R1 1 + 0xA802000B, // 0005 EXBLK 0 #0012 + 0x5C080200, // 0006 MOVE R2 R1 + 0x7C080000, // 0007 CALL R2 0 + 0x8C0C0502, // 0008 GETMET R3 R2 K2 + 0x7C0C0200, // 0009 CALL R3 1 + 0x780E0005, // 000A JMPF R3 #0011 + 0x8C0C0503, // 000B GETMET R3 R2 K3 + 0x7C0C0200, // 000C CALL R3 1 + 0x780E0002, // 000D JMPF R3 #0011 + 0x8C0C0104, // 000E GETMET R3 R0 K4 + 0x5C140400, // 000F MOVE R5 R2 + 0x7C0C0400, // 0010 CALL R3 2 + 0x7001FFF3, // 0011 JMP #0006 + 0x58040005, // 0012 LDCONST R1 K5 + 0xAC040200, // 0013 CATCH R1 1 0 + 0xB0080000, // 0014 RAISE 2 R0 R0 + 0x80000000, // 0015 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: load_param +********************************************************************/ +be_local_closure(Matter_Device_load_param, /* name */ + be_nested_proto( + 12, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[28]) { /* constants */ + /* K0 */ be_nested_str_weak(string), + /* K1 */ be_nested_str_weak(crypto), + /* K2 */ be_nested_str_weak(FILENAME), + /* K3 */ be_nested_str_weak(read), + /* K4 */ be_nested_str_weak(close), + /* K5 */ be_nested_str_weak(json), + /* K6 */ be_nested_str_weak(load), + /* K7 */ be_nested_str_weak(root_discriminator), + /* K8 */ be_nested_str_weak(find), + /* K9 */ be_nested_str_weak(distinguish), + /* K10 */ be_nested_str_weak(root_passcode), + /* K11 */ be_nested_str_weak(passcode), + /* K12 */ be_nested_str_weak(ipv4only), + /* K13 */ be_nested_str_weak(plugins_config), + /* K14 */ be_nested_str_weak(config), + /* K15 */ be_nested_str_weak(_load_plugins_config), + /* K16 */ be_nested_str_weak(plugins_persist), + /* K17 */ be_nested_str_weak(io_error), + /* K18 */ be_nested_str_weak(tasmota), + /* K19 */ be_nested_str_weak(log), + /* K20 */ be_nested_str_weak(MTR_X3A_X20Session_Store_X3A_X3Aload_X20Exception_X3A), + /* K21 */ be_nested_str_weak(_X7C), + /* K22 */ be_const_int(2), + /* K23 */ be_nested_str_weak(random), + /* K24 */ be_nested_str_weak(get), + /* K25 */ be_const_int(0), + /* K26 */ be_nested_str_weak(generate_random_passcode), + /* K27 */ be_nested_str_weak(save_param), + }), + be_str_weak(load_param), + &be_const_str_solidified, + ( &(const binstruction[91]) { /* code */ + 0xA4060000, // 0000 IMPORT R1 K0 + 0xA40A0200, // 0001 IMPORT R2 K1 + 0xA8020028, // 0002 EXBLK 0 #002C + 0x600C0011, // 0003 GETGBL R3 G17 + 0x88100102, // 0004 GETMBR R4 R0 K2 + 0x7C0C0200, // 0005 CALL R3 1 + 0x8C100703, // 0006 GETMET R4 R3 K3 + 0x7C100200, // 0007 CALL R4 1 + 0x8C140704, // 0008 GETMET R5 R3 K4 + 0x7C140200, // 0009 CALL R5 1 + 0xA4160A00, // 000A IMPORT R5 K5 + 0x8C180B06, // 000B GETMET R6 R5 K6 + 0x5C200800, // 000C MOVE R8 R4 + 0x7C180400, // 000D CALL R6 2 + 0x8C1C0D08, // 000E GETMET R7 R6 K8 + 0x58240009, // 000F LDCONST R9 K9 + 0x88280107, // 0010 GETMBR R10 R0 K7 + 0x7C1C0600, // 0011 CALL R7 3 + 0x90020E07, // 0012 SETMBR R0 K7 R7 + 0x8C1C0D08, // 0013 GETMET R7 R6 K8 + 0x5824000B, // 0014 LDCONST R9 K11 + 0x8828010A, // 0015 GETMBR R10 R0 K10 + 0x7C1C0600, // 0016 CALL R7 3 + 0x90021407, // 0017 SETMBR R0 K10 R7 + 0x601C0017, // 0018 GETGBL R7 G23 + 0x8C200D08, // 0019 GETMET R8 R6 K8 + 0x5828000C, // 001A LDCONST R10 K12 + 0x502C0000, // 001B LDBOOL R11 0 0 + 0x7C200600, // 001C CALL R8 3 + 0x7C1C0200, // 001D CALL R7 1 + 0x90021807, // 001E SETMBR R0 K12 R7 + 0x8C1C0D08, // 001F GETMET R7 R6 K8 + 0x5824000E, // 0020 LDCONST R9 K14 + 0x7C1C0400, // 0021 CALL R7 2 + 0x90021A07, // 0022 SETMBR R0 K13 R7 + 0x881C010D, // 0023 GETMBR R7 R0 K13 + 0x781E0004, // 0024 JMPF R7 #002A + 0x8C1C010F, // 0025 GETMET R7 R0 K15 + 0x8824010D, // 0026 GETMBR R9 R0 K13 + 0x7C1C0400, // 0027 CALL R7 2 + 0x501C0200, // 0028 LDBOOL R7 1 0 + 0x90022007, // 0029 SETMBR R0 K16 R7 + 0xA8040001, // 002A EXBLK 1 1 + 0x70020012, // 002B JMP #003F + 0xAC0C0002, // 002C CATCH R3 0 2 + 0x7002000F, // 002D JMP #003E + 0x20140711, // 002E NE R5 R3 K17 + 0x7816000C, // 002F JMPF R5 #003D + 0xB8162400, // 0030 GETNGBL R5 K18 + 0x8C140B13, // 0031 GETMET R5 R5 K19 + 0x601C0008, // 0032 GETGBL R7 G8 + 0x5C200600, // 0033 MOVE R8 R3 + 0x7C1C0200, // 0034 CALL R7 1 + 0x001E2807, // 0035 ADD R7 K20 R7 + 0x001C0F15, // 0036 ADD R7 R7 K21 + 0x60200008, // 0037 GETGBL R8 G8 + 0x5C240800, // 0038 MOVE R9 R4 + 0x7C200200, // 0039 CALL R8 1 + 0x001C0E08, // 003A ADD R7 R7 R8 + 0x58200016, // 003B LDCONST R8 K22 + 0x7C140600, // 003C CALL R5 3 + 0x70020000, // 003D JMP #003F + 0xB0080000, // 003E RAISE 2 R0 R0 + 0x500C0000, // 003F LDBOOL R3 0 0 + 0x88100107, // 0040 GETMBR R4 R0 K7 + 0x4C140000, // 0041 LDNIL R5 + 0x1C100805, // 0042 EQ R4 R4 R5 + 0x7812000A, // 0043 JMPF R4 #004F + 0x8C100517, // 0044 GETMET R4 R2 K23 + 0x58180016, // 0045 LDCONST R6 K22 + 0x7C100400, // 0046 CALL R4 2 + 0x8C100918, // 0047 GETMET R4 R4 K24 + 0x58180019, // 0048 LDCONST R6 K25 + 0x581C0016, // 0049 LDCONST R7 K22 + 0x7C100600, // 004A CALL R4 3 + 0x54160FFE, // 004B LDINT R5 4095 + 0x2C100805, // 004C AND R4 R4 R5 + 0x90020E04, // 004D SETMBR R0 K7 R4 + 0x500C0200, // 004E LDBOOL R3 1 0 + 0x8810010A, // 004F GETMBR R4 R0 K10 + 0x4C140000, // 0050 LDNIL R5 + 0x1C100805, // 0051 EQ R4 R4 R5 + 0x78120003, // 0052 JMPF R4 #0057 + 0x8C10011A, // 0053 GETMET R4 R0 K26 + 0x7C100200, // 0054 CALL R4 1 + 0x90021404, // 0055 SETMBR R0 K10 R4 + 0x500C0200, // 0056 LDBOOL R3 1 0 + 0x780E0001, // 0057 JMPF R3 #005A + 0x8C10011B, // 0058 GETMET R4 R0 K27 + 0x7C100200, // 0059 CALL R4 1 + 0x80000000, // 005A RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: k2l +********************************************************************/ +be_local_closure(Matter_Device_k2l, /* name */ + be_nested_proto( + 8, /* nstack */ + 1, /* argc */ + 4, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 6]) { /* constants */ + /* K0 */ be_const_class(be_class_Matter_Device), + /* K1 */ be_nested_str_weak(keys), + /* K2 */ be_nested_str_weak(push), + /* K3 */ be_nested_str_weak(stop_iteration), + /* K4 */ be_const_int(1), + /* K5 */ be_const_int(0), + }), + be_str_weak(k2l), + &be_const_str_solidified, + ( &(const binstruction[50]) { /* code */ + 0x58040000, // 0000 LDCONST R1 K0 + 0x60080012, // 0001 GETGBL R2 G18 + 0x7C080000, // 0002 CALL R2 0 + 0x4C0C0000, // 0003 LDNIL R3 + 0x1C0C0003, // 0004 EQ R3 R0 R3 + 0x780E0000, // 0005 JMPF R3 #0007 + 0x80040400, // 0006 RET 1 R2 + 0x600C0010, // 0007 GETGBL R3 G16 + 0x8C100101, // 0008 GETMET R4 R0 K1 + 0x7C100200, // 0009 CALL R4 1 + 0x7C0C0200, // 000A CALL R3 1 + 0xA8020005, // 000B EXBLK 0 #0012 + 0x5C100600, // 000C MOVE R4 R3 + 0x7C100000, // 000D CALL R4 0 + 0x8C140502, // 000E GETMET R5 R2 K2 + 0x5C1C0800, // 000F MOVE R7 R4 + 0x7C140400, // 0010 CALL R5 2 + 0x7001FFF9, // 0011 JMP #000C + 0x580C0003, // 0012 LDCONST R3 K3 + 0xAC0C0200, // 0013 CATCH R3 1 0 + 0xB0080000, // 0014 RAISE 2 R0 R0 + 0x600C0010, // 0015 GETGBL R3 G16 + 0x6010000C, // 0016 GETGBL R4 G12 + 0x5C140400, // 0017 MOVE R5 R2 + 0x7C100200, // 0018 CALL R4 1 + 0x04100904, // 0019 SUB R4 R4 K4 + 0x40120804, // 001A CONNECT R4 K4 R4 + 0x7C0C0200, // 001B CALL R3 1 + 0xA8020010, // 001C EXBLK 0 #002E + 0x5C100600, // 001D MOVE R4 R3 + 0x7C100000, // 001E CALL R4 0 + 0x94140404, // 001F GETIDX R5 R2 R4 + 0x5C180800, // 0020 MOVE R6 R4 + 0x241C0D05, // 0021 GT R7 R6 K5 + 0x781E0008, // 0022 JMPF R7 #002C + 0x041C0D04, // 0023 SUB R7 R6 K4 + 0x941C0407, // 0024 GETIDX R7 R2 R7 + 0x241C0E05, // 0025 GT R7 R7 R5 + 0x781E0004, // 0026 JMPF R7 #002C + 0x041C0D04, // 0027 SUB R7 R6 K4 + 0x941C0407, // 0028 GETIDX R7 R2 R7 + 0x98080C07, // 0029 SETIDX R2 R6 R7 + 0x04180D04, // 002A SUB R6 R6 K4 + 0x7001FFF4, // 002B JMP #0021 + 0x98080C05, // 002C SETIDX R2 R6 R5 + 0x7001FFEE, // 002D JMP #001D + 0x580C0003, // 002E LDCONST R3 K3 + 0xAC0C0200, // 002F CATCH R3 1 0 + 0xB0080000, // 0030 RAISE 2 R0 R0 + 0x80040400, // 0031 RET 1 R2 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: autoconf_device +********************************************************************/ +be_local_closure(Matter_Device_autoconf_device, /* name */ + be_nested_proto( + 7, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[15]) { /* constants */ + /* K0 */ be_nested_str_weak(string), + /* K1 */ be_nested_str_weak(json), + /* K2 */ be_nested_str_weak(plugins), + /* K3 */ be_const_int(0), + /* K4 */ be_nested_str_weak(plugins_config), + /* K5 */ be_nested_str_weak(autoconf_device_map), + /* K6 */ be_nested_str_weak(tasmota), + /* K7 */ be_nested_str_weak(log), + /* K8 */ be_nested_str_weak(MTR_X3A_X20autoconfig_X20_X3D_X20), + /* K9 */ be_const_int(3), + /* K10 */ be_nested_str_weak(_load_plugins_config), + /* K11 */ be_nested_str_weak(plugins_persist), + /* K12 */ be_nested_str_weak(sessions), + /* K13 */ be_nested_str_weak(count_active_fabrics), + /* K14 */ be_nested_str_weak(save_param), + }), + be_str_weak(autoconf_device), + &be_const_str_solidified, + ( &(const binstruction[34]) { /* code */ + 0xA4060000, // 0000 IMPORT R1 K0 + 0xA40A0200, // 0001 IMPORT R2 K1 + 0x600C000C, // 0002 GETGBL R3 G12 + 0x88100102, // 0003 GETMBR R4 R0 K2 + 0x7C0C0200, // 0004 CALL R3 1 + 0x240C0703, // 0005 GT R3 R3 K3 + 0x780E0000, // 0006 JMPF R3 #0008 + 0x80000600, // 0007 RET 0 + 0x8C0C0105, // 0008 GETMET R3 R0 K5 + 0x7C0C0200, // 0009 CALL R3 1 + 0x90020803, // 000A SETMBR R0 K4 R3 + 0xB80E0C00, // 000B GETNGBL R3 K6 + 0x8C0C0707, // 000C GETMET R3 R3 K7 + 0x60140008, // 000D GETGBL R5 G8 + 0x88180104, // 000E GETMBR R6 R0 K4 + 0x7C140200, // 000F CALL R5 1 + 0x00161005, // 0010 ADD R5 K8 R5 + 0x58180009, // 0011 LDCONST R6 K9 + 0x7C0C0600, // 0012 CALL R3 3 + 0x8C0C010A, // 0013 GETMET R3 R0 K10 + 0x88140104, // 0014 GETMBR R5 R0 K4 + 0x7C0C0400, // 0015 CALL R3 2 + 0x880C010B, // 0016 GETMBR R3 R0 K11 + 0x740E0008, // 0017 JMPT R3 #0021 + 0x880C010C, // 0018 GETMBR R3 R0 K12 + 0x8C0C070D, // 0019 GETMET R3 R3 K13 + 0x7C0C0200, // 001A CALL R3 1 + 0x240C0703, // 001B GT R3 R3 K3 + 0x780E0003, // 001C JMPF R3 #0021 + 0x500C0200, // 001D LDBOOL R3 1 0 + 0x90021603, // 001E SETMBR R0 K11 R3 + 0x8C0C010E, // 001F GETMET R3 R0 K14 + 0x7C0C0200, // 0020 CALL R3 1 + 0x80000000, // 0021 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: process_attribute_expansion +********************************************************************/ +be_local_closure(Matter_Device_process_attribute_expansion, /* name */ + be_nested_proto( + 29, /* nstack */ + 3, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 1, /* has sup protos */ + ( &(const struct bproto*[ 1]) { + be_nested_proto( + 7, /* nstack */ + 1, /* argc */ + 0, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 5]) { /* constants */ + /* K0 */ be_nested_str_weak(keys), + /* K1 */ be_nested_str_weak(push), + /* K2 */ be_nested_str_weak(stop_iteration), + /* K3 */ be_const_int(1), + /* K4 */ be_const_int(0), + }), + be_str_weak(keys_sorted), + &be_const_str_solidified, + ( &(const binstruction[45]) { /* code */ + 0x60040012, // 0000 GETGBL R1 G18 + 0x7C040000, // 0001 CALL R1 0 + 0x60080010, // 0002 GETGBL R2 G16 + 0x8C0C0100, // 0003 GETMET R3 R0 K0 + 0x7C0C0200, // 0004 CALL R3 1 + 0x7C080200, // 0005 CALL R2 1 + 0xA8020005, // 0006 EXBLK 0 #000D + 0x5C0C0400, // 0007 MOVE R3 R2 + 0x7C0C0000, // 0008 CALL R3 0 + 0x8C100301, // 0009 GETMET R4 R1 K1 + 0x5C180600, // 000A MOVE R6 R3 + 0x7C100400, // 000B CALL R4 2 + 0x7001FFF9, // 000C JMP #0007 + 0x58080002, // 000D LDCONST R2 K2 + 0xAC080200, // 000E CATCH R2 1 0 + 0xB0080000, // 000F RAISE 2 R0 R0 + 0x60080010, // 0010 GETGBL R2 G16 + 0x600C000C, // 0011 GETGBL R3 G12 + 0x5C100200, // 0012 MOVE R4 R1 + 0x7C0C0200, // 0013 CALL R3 1 + 0x040C0703, // 0014 SUB R3 R3 K3 + 0x400E0603, // 0015 CONNECT R3 K3 R3 + 0x7C080200, // 0016 CALL R2 1 + 0xA8020010, // 0017 EXBLK 0 #0029 + 0x5C0C0400, // 0018 MOVE R3 R2 + 0x7C0C0000, // 0019 CALL R3 0 + 0x94100203, // 001A GETIDX R4 R1 R3 + 0x5C140600, // 001B MOVE R5 R3 + 0x24180B04, // 001C GT R6 R5 K4 + 0x781A0008, // 001D JMPF R6 #0027 + 0x04180B03, // 001E SUB R6 R5 K3 + 0x94180206, // 001F GETIDX R6 R1 R6 + 0x24180C04, // 0020 GT R6 R6 R4 + 0x781A0004, // 0021 JMPF R6 #0027 + 0x04180B03, // 0022 SUB R6 R5 K3 + 0x94180206, // 0023 GETIDX R6 R1 R6 + 0x98040A06, // 0024 SETIDX R1 R5 R6 + 0x04140B03, // 0025 SUB R5 R5 K3 + 0x7001FFF4, // 0026 JMP #001C + 0x98040A04, // 0027 SETIDX R1 R5 R4 + 0x7001FFEE, // 0028 JMP #0018 + 0x58080002, // 0029 LDCONST R2 K2 + 0xAC080200, // 002A CATCH R2 1 0 + 0xB0080000, // 002B RAISE 2 R0 R0 + 0x80040200, // 002C RET 1 R1 + }) + ), + }), + 1, /* has constants */ + ( &(const bvalue[22]) { /* constants */ + /* K0 */ be_nested_str_weak(string), + /* K1 */ be_nested_str_weak(endpoint), + /* K2 */ be_nested_str_weak(cluster), + /* K3 */ be_nested_str_weak(attribute), + /* K4 */ be_nested_str_weak(plugins), + /* K5 */ be_nested_str_weak(get_endpoint), + /* K6 */ be_nested_str_weak(contains), + /* K7 */ be_nested_str_weak(get_cluster_list), + /* K8 */ be_nested_str_weak(get_attribute_list), + /* K9 */ be_nested_str_weak(push), + /* K10 */ be_nested_str_weak(stop_iteration), + /* K11 */ be_nested_str_weak(tasmota), + /* K12 */ be_nested_str_weak(log), + /* K13 */ be_nested_str_weak(format), + /* K14 */ be_nested_str_weak(MTR_X3A_X20expansion_X20_X5B_X2502X_X5D_X2504X_X2F_X2504X), + /* K15 */ be_const_int(3), + /* K16 */ be_nested_str_weak(status), + /* K17 */ be_nested_str_weak(matter), + /* K18 */ be_nested_str_weak(UNSUPPORTED_ENDPOINT), + /* K19 */ be_nested_str_weak(UNSUPPORTED_CLUSTER), + /* K20 */ be_nested_str_weak(UNSUPPORTED_ATTRIBUTE), + /* K21 */ be_nested_str_weak(UNREPORTABLE_ATTRIBUTE), + }), + be_str_weak(process_attribute_expansion), + &be_const_str_solidified, + ( &(const binstruction[216]) { /* code */ + 0x840C0000, // 0000 CLOSURE R3 P0 + 0xA4120000, // 0001 IMPORT R4 K0 + 0x88140301, // 0002 GETMBR R5 R1 K1 + 0x50180000, // 0003 LDBOOL R6 0 0 + 0x881C0302, // 0004 GETMBR R7 R1 K2 + 0x50200000, // 0005 LDBOOL R8 0 0 + 0x88240303, // 0006 GETMBR R9 R1 K3 + 0x50280000, // 0007 LDBOOL R10 0 0 + 0x882C0301, // 0008 GETMBR R11 R1 K1 + 0x4C300000, // 0009 LDNIL R12 + 0x202C160C, // 000A NE R11 R11 R12 + 0x782E0007, // 000B JMPF R11 #0014 + 0x882C0302, // 000C GETMBR R11 R1 K2 + 0x4C300000, // 000D LDNIL R12 + 0x202C160C, // 000E NE R11 R11 R12 + 0x782E0003, // 000F JMPF R11 #0014 + 0x882C0303, // 0010 GETMBR R11 R1 K3 + 0x4C300000, // 0011 LDNIL R12 + 0x202C160C, // 0012 NE R11 R11 R12 + 0x742E0000, // 0013 JMPT R11 #0015 + 0x502C0001, // 0014 LDBOOL R11 0 1 + 0x502C0200, // 0015 LDBOOL R11 1 0 + 0x60300013, // 0016 GETGBL R12 G19 + 0x7C300000, // 0017 CALL R12 0 + 0x60340010, // 0018 GETGBL R13 G16 + 0x88380104, // 0019 GETMBR R14 R0 K4 + 0x7C340200, // 001A CALL R13 1 + 0xA8020055, // 001B EXBLK 0 #0072 + 0x5C381A00, // 001C MOVE R14 R13 + 0x7C380000, // 001D CALL R14 0 + 0x8C3C1D05, // 001E GETMET R15 R14 K5 + 0x7C3C0200, // 001F CALL R15 1 + 0x4C400000, // 0020 LDNIL R16 + 0x20400A10, // 0021 NE R16 R5 R16 + 0x78420002, // 0022 JMPF R16 #0026 + 0x20401E05, // 0023 NE R16 R15 R5 + 0x78420000, // 0024 JMPF R16 #0026 + 0x7001FFF5, // 0025 JMP #001C + 0x8C401906, // 0026 GETMET R16 R12 K6 + 0x5C481E00, // 0027 MOVE R18 R15 + 0x7C400400, // 0028 CALL R16 2 + 0x74420002, // 0029 JMPT R16 #002D + 0x60400013, // 002A GETGBL R16 G19 + 0x7C400000, // 002B CALL R16 0 + 0x98301E10, // 002C SETIDX R12 R15 R16 + 0x50180200, // 002D LDBOOL R6 1 0 + 0x8C401D07, // 002E GETMET R16 R14 K7 + 0x5C481E00, // 002F MOVE R18 R15 + 0x7C400400, // 0030 CALL R16 2 + 0x60440010, // 0031 GETGBL R17 G16 + 0x5C482000, // 0032 MOVE R18 R16 + 0x7C440200, // 0033 CALL R17 1 + 0xA8020038, // 0034 EXBLK 0 #006E + 0x5C482200, // 0035 MOVE R18 R17 + 0x7C480000, // 0036 CALL R18 0 + 0x4C4C0000, // 0037 LDNIL R19 + 0x204C0E13, // 0038 NE R19 R7 R19 + 0x784E0002, // 0039 JMPF R19 #003D + 0x204C2407, // 003A NE R19 R18 R7 + 0x784E0000, // 003B JMPF R19 #003D + 0x7001FFF7, // 003C JMP #0035 + 0x944C180F, // 003D GETIDX R19 R12 R15 + 0x8C4C2706, // 003E GETMET R19 R19 K6 + 0x5C542400, // 003F MOVE R21 R18 + 0x7C4C0400, // 0040 CALL R19 2 + 0x744E0003, // 0041 JMPT R19 #0046 + 0x944C180F, // 0042 GETIDX R19 R12 R15 + 0x60500013, // 0043 GETGBL R20 G19 + 0x7C500000, // 0044 CALL R20 0 + 0x984C2414, // 0045 SETIDX R19 R18 R20 + 0x50200200, // 0046 LDBOOL R8 1 0 + 0x8C4C1D08, // 0047 GETMET R19 R14 K8 + 0x5C541E00, // 0048 MOVE R21 R15 + 0x5C582400, // 0049 MOVE R22 R18 + 0x7C4C0600, // 004A CALL R19 3 + 0x60500010, // 004B GETGBL R20 G16 + 0x5C542600, // 004C MOVE R21 R19 + 0x7C500200, // 004D CALL R20 1 + 0xA802001A, // 004E EXBLK 0 #006A + 0x5C542800, // 004F MOVE R21 R20 + 0x7C540000, // 0050 CALL R21 0 + 0x4C580000, // 0051 LDNIL R22 + 0x20581216, // 0052 NE R22 R9 R22 + 0x785A0002, // 0053 JMPF R22 #0057 + 0x20582A09, // 0054 NE R22 R21 R9 + 0x785A0000, // 0055 JMPF R22 #0057 + 0x7001FFF7, // 0056 JMP #004F + 0x9458180F, // 0057 GETIDX R22 R12 R15 + 0x94582C12, // 0058 GETIDX R22 R22 R18 + 0x8C582D06, // 0059 GETMET R22 R22 K6 + 0x5C602A00, // 005A MOVE R24 R21 + 0x7C580400, // 005B CALL R22 2 + 0x745A0004, // 005C JMPT R22 #0062 + 0x9458180F, // 005D GETIDX R22 R12 R15 + 0x94582C12, // 005E GETIDX R22 R22 R18 + 0x605C0012, // 005F GETGBL R23 G18 + 0x7C5C0000, // 0060 CALL R23 0 + 0x98582A17, // 0061 SETIDX R22 R21 R23 + 0x50280200, // 0062 LDBOOL R10 1 0 + 0x9458180F, // 0063 GETIDX R22 R12 R15 + 0x94582C12, // 0064 GETIDX R22 R22 R18 + 0x94582C15, // 0065 GETIDX R22 R22 R21 + 0x8C582D09, // 0066 GETMET R22 R22 K9 + 0x5C601C00, // 0067 MOVE R24 R14 + 0x7C580400, // 0068 CALL R22 2 + 0x7001FFE4, // 0069 JMP #004F + 0x5850000A, // 006A LDCONST R20 K10 + 0xAC500200, // 006B CATCH R20 1 0 + 0xB0080000, // 006C RAISE 2 R0 R0 + 0x7001FFC6, // 006D JMP #0035 + 0x5844000A, // 006E LDCONST R17 K10 + 0xAC440200, // 006F CATCH R17 1 0 + 0xB0080000, // 0070 RAISE 2 R0 R0 + 0x7001FFA9, // 0071 JMP #001C + 0x5834000A, // 0072 LDCONST R13 K10 + 0xAC340200, // 0073 CATCH R13 1 0 + 0xB0080000, // 0074 RAISE 2 R0 R0 + 0x60340010, // 0075 GETGBL R13 G16 + 0x5C380600, // 0076 MOVE R14 R3 + 0x5C3C1800, // 0077 MOVE R15 R12 + 0x7C380200, // 0078 CALL R14 1 + 0x7C340200, // 0079 CALL R13 1 + 0xA802003D, // 007A EXBLK 0 #00B9 + 0x5C381A00, // 007B MOVE R14 R13 + 0x7C380000, // 007C CALL R14 0 + 0x603C0010, // 007D GETGBL R15 G16 + 0x5C400600, // 007E MOVE R16 R3 + 0x9444180E, // 007F GETIDX R17 R12 R14 + 0x7C400200, // 0080 CALL R16 1 + 0x7C3C0200, // 0081 CALL R15 1 + 0xA8020031, // 0082 EXBLK 0 #00B5 + 0x5C401E00, // 0083 MOVE R16 R15 + 0x7C400000, // 0084 CALL R16 0 + 0x60440010, // 0085 GETGBL R17 G16 + 0x5C480600, // 0086 MOVE R18 R3 + 0x944C180E, // 0087 GETIDX R19 R12 R14 + 0x944C2610, // 0088 GETIDX R19 R19 R16 + 0x7C480200, // 0089 CALL R18 1 + 0x7C440200, // 008A CALL R17 1 + 0xA8020024, // 008B EXBLK 0 #00B1 + 0x5C482200, // 008C MOVE R18 R17 + 0x7C480000, // 008D CALL R18 0 + 0x604C0010, // 008E GETGBL R19 G16 + 0x9450180E, // 008F GETIDX R20 R12 R14 + 0x94502810, // 0090 GETIDX R20 R20 R16 + 0x94502812, // 0091 GETIDX R20 R20 R18 + 0x7C4C0200, // 0092 CALL R19 1 + 0xA8020018, // 0093 EXBLK 0 #00AD + 0x5C502600, // 0094 MOVE R20 R19 + 0x7C500000, // 0095 CALL R20 0 + 0xB8561600, // 0096 GETNGBL R21 K11 + 0x8C542B0C, // 0097 GETMET R21 R21 K12 + 0x8C5C090D, // 0098 GETMET R23 R4 K13 + 0x5864000E, // 0099 LDCONST R25 K14 + 0x5C681C00, // 009A MOVE R26 R14 + 0x5C6C2000, // 009B MOVE R27 R16 + 0x5C702400, // 009C MOVE R28 R18 + 0x7C5C0A00, // 009D CALL R23 5 + 0x5860000F, // 009E LDCONST R24 K15 + 0x7C540600, // 009F CALL R21 3 + 0x9006020E, // 00A0 SETMBR R1 K1 R14 + 0x90060410, // 00A1 SETMBR R1 K2 R16 + 0x90060612, // 00A2 SETMBR R1 K3 R18 + 0x5C540400, // 00A3 MOVE R21 R2 + 0x5C582800, // 00A4 MOVE R22 R20 + 0x5C5C0200, // 00A5 MOVE R23 R1 + 0x5C601600, // 00A6 MOVE R24 R11 + 0x7C540600, // 00A7 CALL R21 3 + 0x782E0002, // 00A8 JMPF R11 #00AC + 0x78560001, // 00A9 JMPF R21 #00AC + 0xA8040004, // 00AA EXBLK 1 4 + 0x80002C00, // 00AB RET 0 + 0x7001FFE6, // 00AC JMP #0094 + 0x584C000A, // 00AD LDCONST R19 K10 + 0xAC4C0200, // 00AE CATCH R19 1 0 + 0xB0080000, // 00AF RAISE 2 R0 R0 + 0x7001FFDA, // 00B0 JMP #008C + 0x5844000A, // 00B1 LDCONST R17 K10 + 0xAC440200, // 00B2 CATCH R17 1 0 + 0xB0080000, // 00B3 RAISE 2 R0 R0 + 0x7001FFCD, // 00B4 JMP #0083 + 0x583C000A, // 00B5 LDCONST R15 K10 + 0xAC3C0200, // 00B6 CATCH R15 1 0 + 0xB0080000, // 00B7 RAISE 2 R0 R0 + 0x7001FFC1, // 00B8 JMP #007B + 0x5834000A, // 00B9 LDCONST R13 K10 + 0xAC340200, // 00BA CATCH R13 1 0 + 0xB0080000, // 00BB RAISE 2 R0 R0 + 0x782E0019, // 00BC JMPF R11 #00D7 + 0x5C340C00, // 00BD MOVE R13 R6 + 0x74360003, // 00BE JMPT R13 #00C3 + 0xB8362200, // 00BF GETNGBL R13 K17 + 0x88341B12, // 00C0 GETMBR R13 R13 K18 + 0x9006200D, // 00C1 SETMBR R1 K16 R13 + 0x7002000E, // 00C2 JMP #00D2 + 0x5C341000, // 00C3 MOVE R13 R8 + 0x74360003, // 00C4 JMPT R13 #00C9 + 0xB8362200, // 00C5 GETNGBL R13 K17 + 0x88341B13, // 00C6 GETMBR R13 R13 K19 + 0x9006200D, // 00C7 SETMBR R1 K16 R13 + 0x70020008, // 00C8 JMP #00D2 + 0x5C341400, // 00C9 MOVE R13 R10 + 0x74360003, // 00CA JMPT R13 #00CF + 0xB8362200, // 00CB GETNGBL R13 K17 + 0x88341B14, // 00CC GETMBR R13 R13 K20 + 0x9006200D, // 00CD SETMBR R1 K16 R13 + 0x70020002, // 00CE JMP #00D2 + 0xB8362200, // 00CF GETNGBL R13 K17 + 0x88341B15, // 00D0 GETMBR R13 R13 K21 + 0x9006200D, // 00D1 SETMBR R1 K16 R13 + 0x5C340400, // 00D2 MOVE R13 R2 + 0x4C380000, // 00D3 LDNIL R14 + 0x5C3C0200, // 00D4 MOVE R15 R1 + 0x50400200, // 00D5 LDBOOL R16 1 0 + 0x7C340600, // 00D6 CALL R13 3 + 0x80000000, // 00D7 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: msg_send +********************************************************************/ +be_local_closure(Matter_Device_msg_send, /* name */ + be_nested_proto( + 5, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 2]) { /* constants */ + /* K0 */ be_nested_str_weak(udp_server), + /* K1 */ be_nested_str_weak(send_UDP), + }), + be_str_weak(msg_send), + &be_const_str_solidified, + ( &(const binstruction[ 5]) { /* code */ + 0x88080100, // 0000 GETMBR R2 R0 K0 + 0x8C080501, // 0001 GETMET R2 R2 K1 + 0x5C100200, // 0002 MOVE R4 R1 + 0x7C080400, // 0003 CALL R2 2 + 0x80040400, // 0004 RET 1 R2 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: get_plugin_class_displayname +********************************************************************/ +be_local_closure(Matter_Device_get_plugin_class_displayname, /* name */ + be_nested_proto( + 5, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 4]) { /* constants */ + /* K0 */ be_nested_str_weak(plugins_classes), + /* K1 */ be_nested_str_weak(find), + /* K2 */ be_nested_str_weak(NAME), + /* K3 */ be_nested_str_weak(), + }), + be_str_weak(get_plugin_class_displayname), + &be_const_str_solidified, + ( &(const binstruction[ 9]) { /* code */ + 0x88080100, // 0000 GETMBR R2 R0 K0 + 0x8C080501, // 0001 GETMET R2 R2 K1 + 0x5C100200, // 0002 MOVE R4 R1 + 0x7C080400, // 0003 CALL R2 2 + 0x780A0001, // 0004 JMPF R2 #0007 + 0x880C0502, // 0005 GETMBR R3 R2 K2 + 0x70020000, // 0006 JMP #0008 + 0x580C0003, // 0007 LDCONST R3 K3 + 0x80040600, // 0008 RET 1 R3 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: mdns_remove_op_discovery_all_fabrics +********************************************************************/ +be_local_closure(Matter_Device_mdns_remove_op_discovery_all_fabrics, /* name */ + be_nested_proto( + 6, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 6]) { /* constants */ + /* K0 */ be_nested_str_weak(sessions), + /* K1 */ be_nested_str_weak(active_fabrics), + /* K2 */ be_nested_str_weak(get_device_id), + /* K3 */ be_nested_str_weak(get_fabric_id), + /* K4 */ be_nested_str_weak(mdns_remove_op_discovery), + /* K5 */ be_nested_str_weak(stop_iteration), + }), + be_str_weak(mdns_remove_op_discovery_all_fabrics), + &be_const_str_solidified, + ( &(const binstruction[22]) { /* code */ + 0x60040010, // 0000 GETGBL R1 G16 + 0x88080100, // 0001 GETMBR R2 R0 K0 + 0x8C080501, // 0002 GETMET R2 R2 K1 + 0x7C080200, // 0003 CALL R2 1 + 0x7C040200, // 0004 CALL R1 1 + 0xA802000B, // 0005 EXBLK 0 #0012 + 0x5C080200, // 0006 MOVE R2 R1 + 0x7C080000, // 0007 CALL R2 0 + 0x8C0C0502, // 0008 GETMET R3 R2 K2 + 0x7C0C0200, // 0009 CALL R3 1 + 0x780E0005, // 000A JMPF R3 #0011 + 0x8C0C0503, // 000B GETMET R3 R2 K3 + 0x7C0C0200, // 000C CALL R3 1 + 0x780E0002, // 000D JMPF R3 #0011 + 0x8C0C0104, // 000E GETMET R3 R0 K4 + 0x5C140400, // 000F MOVE R5 R2 + 0x7C0C0400, // 0010 CALL R3 2 + 0x7001FFF3, // 0011 JMP #0006 + 0x58040005, // 0012 LDCONST R1 K5 + 0xAC040200, // 0013 CATCH R1 1 0 + 0xB0080000, // 0014 RAISE 2 R0 R0 + 0x80000000, // 0015 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: msg_received +********************************************************************/ +be_local_closure(Matter_Device_msg_received, /* name */ + be_nested_proto( + 9, /* nstack */ + 4, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 2]) { /* constants */ + /* K0 */ be_nested_str_weak(message_handler), + /* K1 */ be_nested_str_weak(msg_received), + }), + be_str_weak(msg_received), + &be_const_str_solidified, + ( &(const binstruction[ 7]) { /* code */ + 0x88100100, // 0000 GETMBR R4 R0 K0 + 0x8C100901, // 0001 GETMET R4 R4 K1 + 0x5C180200, // 0002 MOVE R6 R1 + 0x5C1C0400, // 0003 MOVE R7 R2 + 0x5C200600, // 0004 MOVE R8 R3 + 0x7C100800, // 0005 CALL R4 4 + 0x80040800, // 0006 RET 1 R4 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: start_operational_discovery +********************************************************************/ +be_local_closure(Matter_Device_start_operational_discovery, /* name */ + be_nested_proto( + 9, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 9]) { /* constants */ + /* K0 */ be_nested_str_weak(crypto), + /* K1 */ be_nested_str_weak(mdns), + /* K2 */ be_nested_str_weak(string), + /* K3 */ be_nested_str_weak(stop_basic_commissioning), + /* K4 */ be_nested_str_weak(root_w0), + /* K5 */ be_nested_str_weak(root_L), + /* K6 */ be_nested_str_weak(set_expire_in_seconds), + /* K7 */ be_nested_str_weak(mdns_announce_op_discovery), + /* K8 */ be_nested_str_weak(get_fabric), + }), + be_str_weak(start_operational_discovery), + &be_const_str_solidified, + ( &(const binstruction[17]) { /* code */ + 0xA40A0000, // 0000 IMPORT R2 K0 + 0xA40E0200, // 0001 IMPORT R3 K1 + 0xA4120400, // 0002 IMPORT R4 K2 + 0x8C140103, // 0003 GETMET R5 R0 K3 + 0x7C140200, // 0004 CALL R5 1 + 0x4C140000, // 0005 LDNIL R5 + 0x90020805, // 0006 SETMBR R0 K4 R5 + 0x4C140000, // 0007 LDNIL R5 + 0x90020A05, // 0008 SETMBR R0 K5 R5 + 0x8C140306, // 0009 GETMET R5 R1 K6 + 0x541E003B, // 000A LDINT R7 60 + 0x7C140400, // 000B CALL R5 2 + 0x8C140107, // 000C GETMET R5 R0 K7 + 0x8C1C0308, // 000D GETMET R7 R1 K8 + 0x7C1C0200, // 000E CALL R7 1 + 0x7C140400, // 000F CALL R5 2 + 0x80000000, // 0010 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: every_250ms +********************************************************************/ +be_local_closure(Matter_Device_every_250ms, /* name */ + be_nested_proto( + 3, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 2]) { /* constants */ + /* K0 */ be_nested_str_weak(message_handler), + /* K1 */ be_nested_str_weak(every_250ms), + }), + be_str_weak(every_250ms), + &be_const_str_solidified, + ( &(const binstruction[ 4]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x8C040301, // 0001 GETMET R1 R1 K1 + 0x7C040200, // 0002 CALL R1 1 + 0x80000000, // 0003 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: register_plugin_class +********************************************************************/ +be_local_closure(Matter_Device_register_plugin_class, /* name */ + be_nested_proto( + 7, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 4]) { /* constants */ + /* K0 */ be_nested_str_weak(introspect), + /* K1 */ be_nested_str_weak(get), + /* K2 */ be_nested_str_weak(TYPE), + /* K3 */ be_nested_str_weak(plugins_classes), + }), + be_str_weak(register_plugin_class), + &be_const_str_solidified, + ( &(const binstruction[ 9]) { /* code */ + 0xA40A0000, // 0000 IMPORT R2 K0 + 0x8C0C0501, // 0001 GETMET R3 R2 K1 + 0x5C140200, // 0002 MOVE R5 R1 + 0x58180002, // 0003 LDCONST R6 K2 + 0x7C0C0600, // 0004 CALL R3 3 + 0x780E0001, // 0005 JMPF R3 #0008 + 0x88100103, // 0006 GETMBR R4 R0 K3 + 0x98100601, // 0007 SETIDX R4 R3 R1 + 0x80000000, // 0008 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: mdns_remove_PASE +********************************************************************/ +be_local_closure(Matter_Device_mdns_remove_PASE, /* name */ + be_nested_proto( + 12, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[22]) { /* constants */ + /* K0 */ be_nested_str_weak(mdns), + /* K1 */ be_nested_str_weak(string), + /* K2 */ be_nested_str_weak(mdns_pase_eth), + /* K3 */ be_nested_str_weak(tasmota), + /* K4 */ be_nested_str_weak(log), + /* K5 */ be_nested_str_weak(format), + /* K6 */ be_nested_str_weak(MTR_X3A_X20calling_X20mdns_X2Eremove_service_X28_X25s_X2C_X20_X25s_X2C_X20_X25s_X2C_X20_X25s_X29), + /* K7 */ be_nested_str_weak(_matterc), + /* K8 */ be_nested_str_weak(_udp), + /* K9 */ be_nested_str_weak(commissioning_instance_eth), + /* K10 */ be_nested_str_weak(hostname_eth), + /* K11 */ be_const_int(3), + /* K12 */ be_nested_str_weak(MTR_X3A_X20remove_X20mDNS_X20on_X20_X25s_X20_X27_X25s_X27), + /* K13 */ be_nested_str_weak(eth), + /* K14 */ be_const_int(2), + /* K15 */ be_nested_str_weak(remove_service), + /* K16 */ be_nested_str_weak(mdns_pase_wifi), + /* K17 */ be_nested_str_weak(commissioning_instance_wifi), + /* K18 */ be_nested_str_weak(hostname_wifi), + /* K19 */ be_nested_str_weak(wifi), + /* K20 */ be_nested_str_weak(MTR_X3A_X20Exception), + /* K21 */ be_nested_str_weak(_X7C), + }), + be_str_weak(mdns_remove_PASE), + &be_const_str_solidified, + ( &(const binstruction[83]) { /* code */ + 0xA4060000, // 0000 IMPORT R1 K0 + 0xA40A0200, // 0001 IMPORT R2 K1 + 0xA802003D, // 0002 EXBLK 0 #0041 + 0x880C0102, // 0003 GETMBR R3 R0 K2 + 0x780E001B, // 0004 JMPF R3 #0021 + 0xB80E0600, // 0005 GETNGBL R3 K3 + 0x8C0C0704, // 0006 GETMET R3 R3 K4 + 0x8C140505, // 0007 GETMET R5 R2 K5 + 0x581C0006, // 0008 LDCONST R7 K6 + 0x58200007, // 0009 LDCONST R8 K7 + 0x58240008, // 000A LDCONST R9 K8 + 0x88280109, // 000B GETMBR R10 R0 K9 + 0x882C010A, // 000C GETMBR R11 R0 K10 + 0x7C140C00, // 000D CALL R5 6 + 0x5818000B, // 000E LDCONST R6 K11 + 0x7C0C0600, // 000F CALL R3 3 + 0xB80E0600, // 0010 GETNGBL R3 K3 + 0x8C0C0704, // 0011 GETMET R3 R3 K4 + 0x8C140505, // 0012 GETMET R5 R2 K5 + 0x581C000C, // 0013 LDCONST R7 K12 + 0x5820000D, // 0014 LDCONST R8 K13 + 0x88240109, // 0015 GETMBR R9 R0 K9 + 0x7C140800, // 0016 CALL R5 4 + 0x5818000E, // 0017 LDCONST R6 K14 + 0x7C0C0600, // 0018 CALL R3 3 + 0x500C0000, // 0019 LDBOOL R3 0 0 + 0x90020403, // 001A SETMBR R0 K2 R3 + 0x8C0C030F, // 001B GETMET R3 R1 K15 + 0x58140007, // 001C LDCONST R5 K7 + 0x58180008, // 001D LDCONST R6 K8 + 0x881C0109, // 001E GETMBR R7 R0 K9 + 0x8820010A, // 001F GETMBR R8 R0 K10 + 0x7C0C0A00, // 0020 CALL R3 5 + 0x880C0110, // 0021 GETMBR R3 R0 K16 + 0x780E001B, // 0022 JMPF R3 #003F + 0xB80E0600, // 0023 GETNGBL R3 K3 + 0x8C0C0704, // 0024 GETMET R3 R3 K4 + 0x8C140505, // 0025 GETMET R5 R2 K5 + 0x581C0006, // 0026 LDCONST R7 K6 + 0x58200007, // 0027 LDCONST R8 K7 + 0x58240008, // 0028 LDCONST R9 K8 + 0x88280111, // 0029 GETMBR R10 R0 K17 + 0x882C0112, // 002A GETMBR R11 R0 K18 + 0x7C140C00, // 002B CALL R5 6 + 0x5818000B, // 002C LDCONST R6 K11 + 0x7C0C0600, // 002D CALL R3 3 + 0xB80E0600, // 002E GETNGBL R3 K3 + 0x8C0C0704, // 002F GETMET R3 R3 K4 + 0x8C140505, // 0030 GETMET R5 R2 K5 + 0x581C000C, // 0031 LDCONST R7 K12 + 0x58200013, // 0032 LDCONST R8 K19 + 0x88240111, // 0033 GETMBR R9 R0 K17 + 0x7C140800, // 0034 CALL R5 4 + 0x5818000E, // 0035 LDCONST R6 K14 + 0x7C0C0600, // 0036 CALL R3 3 + 0x500C0000, // 0037 LDBOOL R3 0 0 + 0x90022003, // 0038 SETMBR R0 K16 R3 + 0x8C0C030F, // 0039 GETMET R3 R1 K15 + 0x58140007, // 003A LDCONST R5 K7 + 0x58180008, // 003B LDCONST R6 K8 + 0x881C0111, // 003C GETMBR R7 R0 K17 + 0x88200112, // 003D GETMBR R8 R0 K18 + 0x7C0C0A00, // 003E CALL R3 5 + 0xA8040001, // 003F EXBLK 1 1 + 0x70020010, // 0040 JMP #0052 + 0xAC0C0002, // 0041 CATCH R3 0 2 + 0x7002000D, // 0042 JMP #0051 + 0xB8160600, // 0043 GETNGBL R5 K3 + 0x8C140B04, // 0044 GETMET R5 R5 K4 + 0x601C0008, // 0045 GETGBL R7 G8 + 0x5C200600, // 0046 MOVE R8 R3 + 0x7C1C0200, // 0047 CALL R7 1 + 0x001E2807, // 0048 ADD R7 K20 R7 + 0x001C0F15, // 0049 ADD R7 R7 K21 + 0x60200008, // 004A GETGBL R8 G8 + 0x5C240800, // 004B MOVE R9 R4 + 0x7C200200, // 004C CALL R8 1 + 0x001C0E08, // 004D ADD R7 R7 R8 + 0x5820000E, // 004E LDCONST R8 K14 + 0x7C140600, // 004F CALL R5 3 + 0x70020000, // 0050 JMP #0052 + 0xB0080000, // 0051 RAISE 2 R0 R0 + 0x80000000, // 0052 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: compute_manual_pairing_code +********************************************************************/ +be_local_closure(Matter_Device_compute_manual_pairing_code, /* name */ + be_nested_proto( + 11, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 8]) { /* constants */ + /* K0 */ be_nested_str_weak(string), + /* K1 */ be_nested_str_weak(root_discriminator), + /* K2 */ be_nested_str_weak(root_passcode), + /* K3 */ be_nested_str_weak(format), + /* K4 */ be_nested_str_weak(_X251i_X2505i_X2504i), + /* K5 */ be_nested_str_weak(matter), + /* K6 */ be_nested_str_weak(Verhoeff), + /* K7 */ be_nested_str_weak(checksum), + }), + be_str_weak(compute_manual_pairing_code), + &be_const_str_solidified, + ( &(const binstruction[31]) { /* code */ + 0xA4060000, // 0000 IMPORT R1 K0 + 0x88080101, // 0001 GETMBR R2 R0 K1 + 0x540E0FFE, // 0002 LDINT R3 4095 + 0x2C080403, // 0003 AND R2 R2 R3 + 0x540E0009, // 0004 LDINT R3 10 + 0x3C080403, // 0005 SHR R2 R2 R3 + 0x880C0101, // 0006 GETMBR R3 R0 K1 + 0x541202FF, // 0007 LDINT R4 768 + 0x2C0C0604, // 0008 AND R3 R3 R4 + 0x54120005, // 0009 LDINT R4 6 + 0x380C0604, // 000A SHL R3 R3 R4 + 0x88100102, // 000B GETMBR R4 R0 K2 + 0x54163FFE, // 000C LDINT R5 16383 + 0x2C100805, // 000D AND R4 R4 R5 + 0x300C0604, // 000E OR R3 R3 R4 + 0x88100102, // 000F GETMBR R4 R0 K2 + 0x5416000D, // 0010 LDINT R5 14 + 0x3C100805, // 0011 SHR R4 R4 R5 + 0x8C140303, // 0012 GETMET R5 R1 K3 + 0x581C0004, // 0013 LDCONST R7 K4 + 0x5C200400, // 0014 MOVE R8 R2 + 0x5C240600, // 0015 MOVE R9 R3 + 0x5C280800, // 0016 MOVE R10 R4 + 0x7C140A00, // 0017 CALL R5 5 + 0xB81A0A00, // 0018 GETNGBL R6 K5 + 0x88180D06, // 0019 GETMBR R6 R6 K6 + 0x8C180D07, // 001A GETMET R6 R6 K7 + 0x5C200A00, // 001B MOVE R8 R5 + 0x7C180400, // 001C CALL R6 2 + 0x00140A06, // 001D ADD R5 R5 R6 + 0x80040A00, // 001E RET 1 R5 + }) + ) +); +/*******************************************************************/ + + /******************************************************************** ** Solidified class: Matter_Device ********************************************************************/ be_local_class(Matter_Device, - 31, + 32, NULL, - be_nested_map(91, + be_nested_map(93, ( (struct bmapnode*) &(const bmapnode[]) { - { be_const_key_weak(save_param, 26), be_const_closure(Matter_Device_save_param_closure) }, - { be_const_key_weak(_trigger_read_sensors, -1), be_const_closure(Matter_Device__trigger_read_sensors_closure) }, - { be_const_key_weak(root_L, 10), be_const_var(30) }, - { be_const_key_weak(plugins, -1), be_const_var(1) }, + { be_const_key_weak(message_handler, -1), be_const_var(6) }, + { be_const_key_weak(generate_random_passcode, -1), be_const_closure(Matter_Device_generate_random_passcode_closure) }, + { be_const_key_weak(save_param, -1), be_const_closure(Matter_Device_save_param_closure) }, + { be_const_key_weak(mdns_pase_wifi, -1), be_const_var(24) }, + { be_const_key_weak(remove_fabric, 28), be_const_closure(Matter_Device_remove_fabric_closure) }, + { be_const_key_weak(_start_udp, -1), be_const_closure(Matter_Device__start_udp_closure) }, + { be_const_key_weak(root_iterations, -1), be_const_var(28) }, + { be_const_key_weak(commissioning_discriminator, -1), be_const_var(12) }, + { be_const_key_weak(commissioning_w0, -1), be_const_var(14) }, + { be_const_key_weak(compute_manual_pairing_code, 66), be_const_closure(Matter_Device_compute_manual_pairing_code_closure) }, + { be_const_key_weak(root_discriminator, -1), be_const_var(25) }, + { be_const_key_weak(stop, -1), be_const_closure(Matter_Device_stop_closure) }, + { be_const_key_weak(mdns_remove_PASE, 22), be_const_closure(Matter_Device_mdns_remove_PASE_closure) }, + { be_const_key_weak(plugins_config, -1), be_const_var(4) }, + { be_const_key_weak(start_commissioning_complete, -1), be_const_closure(Matter_Device_start_commissioning_complete_closure) }, + { be_const_key_weak(_trigger_read_sensors, 62), be_const_closure(Matter_Device__trigger_read_sensors_closure) }, { be_const_key_weak(register_plugin_class, -1), be_const_closure(Matter_Device_register_plugin_class_closure) }, - { be_const_key_weak(commissioning_open, 56), be_const_var(9) }, + { be_const_key_weak(root_passcode, 12), be_const_var(26) }, + { be_const_key_weak(every_250ms, 19), be_const_closure(Matter_Device_every_250ms_closure) }, + { be_const_key_weak(commissioning_instance_eth, -1), be_const_var(18) }, + { be_const_key_weak(vendorid, -1), be_const_var(21) }, + { be_const_key_weak(register_native_classes, 89), be_const_closure(Matter_Device_register_native_classes_closure) }, + { be_const_key_weak(start_operational_discovery, 15), be_const_closure(Matter_Device_start_operational_discovery_closure) }, + { be_const_key_weak(_init_basic_commissioning, -1), be_const_closure(Matter_Device__init_basic_commissioning_closure) }, + { be_const_key_weak(compute_qrcode_content, -1), be_const_closure(Matter_Device_compute_qrcode_content_closure) }, + { be_const_key_weak(is_root_commissioning_open, -1), be_const_closure(Matter_Device_is_root_commissioning_open_closure) }, + { be_const_key_weak(commissioning_open, -1), be_const_var(10) }, + { be_const_key_weak(commissioning_instance_wifi, -1), be_const_var(17) }, + { be_const_key_weak(msg_received, -1), be_const_closure(Matter_Device_msg_received_closure) }, + { be_const_key_weak(get_active_endpoints, -1), be_const_closure(Matter_Device_get_active_endpoints_closure) }, + { be_const_key_weak(MtrJoin, -1), be_const_closure(Matter_Device_MtrJoin_closure) }, + { be_const_key_weak(productid, 73), be_const_var(22) }, + { be_const_key_weak(invoke_request, -1), be_const_closure(Matter_Device_invoke_request_closure) }, + { be_const_key_weak(get_plugin_class_displayname, 59), be_const_closure(Matter_Device_get_plugin_class_displayname_closure) }, + { be_const_key_weak(event_fabrics_saved, -1), be_const_closure(Matter_Device_event_fabrics_saved_closure) }, + { be_const_key_weak(start, 86), be_const_closure(Matter_Device_start_closure) }, + { be_const_key_weak(k2l_num, -1), be_const_static_closure(Matter_Device_k2l_num_closure) }, + { be_const_key_weak(mdns_announce_op_discovery, -1), be_const_closure(Matter_Device_mdns_announce_op_discovery_closure) }, + { be_const_key_weak(root_salt, -1), be_const_var(29) }, + { be_const_key_weak(every_second, 78), be_const_closure(Matter_Device_every_second_closure) }, + { be_const_key_weak(commissioning_L, -1), be_const_var(15) }, + { be_const_key_weak(hostname_wifi, 18), be_const_var(19) }, + { be_const_key_weak(get_plugin_class_arg, 61), be_const_closure(Matter_Device_get_plugin_class_arg_closure) }, + { be_const_key_weak(started, 84), be_const_var(0) }, + { be_const_key_weak(root_w0, 25), be_const_var(30) }, + { be_const_key_weak(mdns_announce_PASE, -1), be_const_closure(Matter_Device_mdns_announce_PASE_closure) }, + { be_const_key_weak(autoconf_device_map, 82), be_const_closure(Matter_Device_autoconf_device_map_closure) }, + { be_const_key_weak(every_50ms, -1), be_const_closure(Matter_Device_every_50ms_closure) }, + { be_const_key_weak(commissioning_admin_fabric, -1), be_const_var(16) }, + { be_const_key_weak(msg_send, 30), be_const_closure(Matter_Device_msg_send_closure) }, + { be_const_key_weak(commissioning_salt, -1), be_const_var(13) }, + { be_const_key_weak(plugins, -1), be_const_var(1) }, + { be_const_key_weak(PBKDF_ITERATIONS, -1), be_const_int(1000) }, + { be_const_key_weak(_mdns_announce_hostname, 50), be_const_closure(Matter_Device__mdns_announce_hostname_closure) }, { be_const_key_weak(start_mdns_announce_hostnames, -1), be_const_closure(Matter_Device_start_mdns_announce_hostnames_closure) }, - { be_const_key_weak(PASE_TIMEOUT, -1), be_const_int(600) }, - { be_const_key_weak(plugins_classes, -1), be_const_var(3) }, - { be_const_key_weak(autoconf_device, -1), be_const_closure(Matter_Device_autoconf_device_closure) }, - { be_const_key_weak(PASSCODE_INVALID, 16), be_const_simple_instance(be_nested_simple_instance(&be_class_list, { + { be_const_key_weak(attribute_updated, 49), be_const_closure(Matter_Device_attribute_updated_closure) }, + { be_const_key_weak(PRODUCT_ID, -1), be_const_int(32768) }, + { be_const_key_weak(root_L, -1), be_const_var(31) }, + { be_const_key_weak(register_commands, 77), be_const_closure(Matter_Device_register_commands_closure) }, + { be_const_key_weak(plugins_persist, -1), be_const_var(2) }, + { be_const_key_weak(init, 57), be_const_closure(Matter_Device_init_closure) }, + { be_const_key_weak(_compute_pbkdf, -1), be_const_closure(Matter_Device__compute_pbkdf_closure) }, + { be_const_key_weak(hostname_eth, -1), be_const_var(20) }, + { be_const_key_weak(received_ack, -1), be_const_closure(Matter_Device_received_ack_closure) }, + { be_const_key_weak(VENDOR_ID, -1), be_const_int(65521) }, + { be_const_key_weak(FILENAME, -1), be_nested_str_weak(_matter_device_X2Ejson) }, + { be_const_key_weak(load_param, -1), be_const_closure(Matter_Device_load_param_closure) }, + { be_const_key_weak(mdns_announce_op_discovery_all_fabrics, -1), be_const_closure(Matter_Device_mdns_announce_op_discovery_all_fabrics_closure) }, + { be_const_key_weak(tick, 70), be_const_var(9) }, + { be_const_key_weak(udp_server, 67), be_const_var(5) }, + { be_const_key_weak(start_basic_commissioning, -1), be_const_closure(Matter_Device_start_basic_commissioning_closure) }, + { be_const_key_weak(k2l, -1), be_const_static_closure(Matter_Device_k2l_closure) }, + { be_const_key_weak(PASSCODE_INVALID, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_list, { be_const_list( * be_nested_list(12, ( (struct bvalue*) &(const bvalue[]) { be_const_int(0), @@ -4868,86 +5049,26 @@ be_local_class(Matter_Device, be_const_int(12345678), be_const_int(87654321), })) ) } )) }, - { be_const_key_weak(sort_distinct, -1), be_const_static_closure(Matter_Device_sort_distinct_closure) }, - { be_const_key_weak(root_passcode, -1), be_const_var(25) }, - { be_const_key_weak(generate_random_passcode, 14), be_const_closure(Matter_Device_generate_random_passcode_closure) }, - { be_const_key_weak(hostname_eth, -1), be_const_var(19) }, - { be_const_key_weak(register_commands, 85), be_const_closure(Matter_Device_register_commands_closure) }, - { be_const_key_weak(get_plugin_class_displayname, -1), be_const_closure(Matter_Device_get_plugin_class_displayname_closure) }, + { be_const_key_weak(start_root_basic_commissioning, -1), be_const_closure(Matter_Device_start_root_basic_commissioning_closure) }, + { be_const_key_weak(autoconf_device, -1), be_const_closure(Matter_Device_autoconf_device_closure) }, + { be_const_key_weak(save_before_restart, 56), be_const_closure(Matter_Device_save_before_restart_closure) }, + { be_const_key_weak(process_attribute_expansion, -1), be_const_closure(Matter_Device_process_attribute_expansion_closure) }, + { be_const_key_weak(_load_plugins_config, -1), be_const_closure(Matter_Device__load_plugins_config_closure) }, + { be_const_key_weak(mdns_pase_eth, -1), be_const_var(23) }, + { be_const_key_weak(PASE_TIMEOUT, 33), be_const_int(600) }, + { be_const_key_weak(is_commissioning_open, 31), be_const_closure(Matter_Device_is_commissioning_open_closure) }, + { be_const_key_weak(mdns_remove_op_discovery_all_fabrics, -1), be_const_closure(Matter_Device_mdns_remove_op_discovery_all_fabrics_closure) }, { be_const_key_weak(mdns_remove_op_discovery, -1), be_const_closure(Matter_Device_mdns_remove_op_discovery_closure) }, - { be_const_key_weak(attribute_updated, -1), be_const_closure(Matter_Device_attribute_updated_closure) }, - { be_const_key_weak(productid, 84), be_const_var(21) }, - { be_const_key_weak(ipv4only, 17), be_const_var(26) }, - { be_const_key_weak(UDP_PORT, 68), be_const_int(5540) }, - { be_const_key_weak(register_native_classes, -1), be_const_closure(Matter_Device_register_native_classes_closure) }, - { be_const_key_weak(k2l_num, 65), be_const_static_closure(Matter_Device_k2l_num_closure) }, - { be_const_key_weak(msg_received, -1), be_const_closure(Matter_Device_msg_received_closure) }, - { be_const_key_weak(mdns_announce_op_discovery, 27), be_const_closure(Matter_Device_mdns_announce_op_discovery_closure) }, - { be_const_key_weak(commissioning_L, -1), be_const_var(14) }, - { be_const_key_weak(start_basic_commissioning, 80), be_const_closure(Matter_Device_start_basic_commissioning_closure) }, - { be_const_key_weak(compute_manual_pairing_code, 6), be_const_closure(Matter_Device_compute_manual_pairing_code_closure) }, - { be_const_key_weak(save_before_restart, -1), be_const_closure(Matter_Device_save_before_restart_closure) }, - { be_const_key_weak(message_handler, 89), be_const_var(6) }, - { be_const_key_weak(start_commissioning_complete, -1), be_const_closure(Matter_Device_start_commissioning_complete_closure) }, - { be_const_key_weak(PRODUCT_ID, 24), be_const_int(32768) }, - { be_const_key_weak(msg_send, 11), be_const_closure(Matter_Device_msg_send_closure) }, - { be_const_key_weak(start, -1), be_const_closure(Matter_Device_start_closure) }, - { be_const_key_weak(load_param, 38), be_const_closure(Matter_Device_load_param_closure) }, - { be_const_key_weak(commissioning_salt, 22), be_const_var(12) }, - { be_const_key_weak(root_iterations, -1), be_const_var(27) }, - { be_const_key_weak(vendorid, -1), be_const_var(20) }, - { be_const_key_weak(udp_server, 81), be_const_var(5) }, - { be_const_key_weak(mdns_remove_op_discovery_all_fabrics, 63), be_const_closure(Matter_Device_mdns_remove_op_discovery_all_fabrics_closure) }, - { be_const_key_weak(get_active_endpoints, -1), be_const_closure(Matter_Device_get_active_endpoints_closure) }, - { be_const_key_weak(start_operational_discovery, 51), be_const_closure(Matter_Device_start_operational_discovery_closure) }, - { be_const_key_weak(event_fabrics_saved, -1), be_const_closure(Matter_Device_event_fabrics_saved_closure) }, - { be_const_key_weak(mdns_announce_PASE, -1), be_const_closure(Matter_Device_mdns_announce_PASE_closure) }, - { be_const_key_weak(stop, 2), be_const_closure(Matter_Device_stop_closure) }, - { be_const_key_weak(stop_basic_commissioning, -1), be_const_closure(Matter_Device_stop_basic_commissioning_closure) }, - { be_const_key_weak(plugins_config, 30), be_const_var(4) }, - { be_const_key_weak(invoke_request, -1), be_const_closure(Matter_Device_invoke_request_closure) }, - { be_const_key_weak(is_root_commissioning_open, 82), be_const_closure(Matter_Device_is_root_commissioning_open_closure) }, - { be_const_key_weak(commissioning_instance_eth, 33), be_const_var(17) }, - { be_const_key_weak(mdns_remove_PASE, -1), be_const_closure(Matter_Device_mdns_remove_PASE_closure) }, - { be_const_key_weak(hostname_wifi, 47), be_const_var(18) }, - { be_const_key_weak(FILENAME, -1), be_nested_str_weak(_matter_device_X2Ejson) }, - { be_const_key_weak(process_attribute_expansion, 57), be_const_closure(Matter_Device_process_attribute_expansion_closure) }, - { be_const_key_weak(start_commissioning_complete_deferred, -1), be_const_closure(Matter_Device_start_commissioning_complete_deferred_closure) }, - { be_const_key_weak(commissioning_w0, -1), be_const_var(13) }, - { be_const_key_weak(plugins_persist, 49), be_const_var(2) }, - { be_const_key_weak(start_operational_discovery_deferred, 66), be_const_closure(Matter_Device_start_operational_discovery_deferred_closure) }, - { be_const_key_weak(commissioning_discriminator, 23), be_const_var(11) }, - { be_const_key_weak(commissioning_admin_fabric, -1), be_const_var(15) }, - { be_const_key_weak(autoconf_device_map, -1), be_const_closure(Matter_Device_autoconf_device_map_closure) }, - { be_const_key_weak(remove_fabric, -1), be_const_closure(Matter_Device_remove_fabric_closure) }, - { be_const_key_weak(_init_basic_commissioning, -1), be_const_closure(Matter_Device__init_basic_commissioning_closure) }, - { be_const_key_weak(every_250ms, -1), be_const_closure(Matter_Device_every_250ms_closure) }, - { be_const_key_weak(MtrJoin, -1), be_const_closure(Matter_Device_MtrJoin_closure) }, - { be_const_key_weak(received_ack, 88), be_const_closure(Matter_Device_received_ack_closure) }, - { be_const_key_weak(start_root_basic_commissioning, 54), be_const_closure(Matter_Device_start_root_basic_commissioning_closure) }, - { be_const_key_weak(commissioning_instance_wifi, -1), be_const_var(16) }, - { be_const_key_weak(_compute_pbkdf, -1), be_const_closure(Matter_Device__compute_pbkdf_closure) }, - { be_const_key_weak(PBKDF_ITERATIONS, 48), be_const_int(1000) }, - { be_const_key_weak(_start_udp, -1), be_const_closure(Matter_Device__start_udp_closure) }, - { be_const_key_weak(started, 44), be_const_var(0) }, - { be_const_key_weak(ui, 42), be_const_var(8) }, - { be_const_key_weak(mdns_pase_wifi, 41), be_const_var(23) }, - { be_const_key_weak(root_salt, -1), be_const_var(28) }, - { be_const_key_weak(mdns_announce_op_discovery_all_fabrics, -1), be_const_closure(Matter_Device_mdns_announce_op_discovery_all_fabrics_closure) }, + { be_const_key_weak(ui, -1), be_const_var(8) }, { be_const_key_weak(sessions, -1), be_const_var(7) }, - { be_const_key_weak(_load_plugins_config, 29), be_const_closure(Matter_Device__load_plugins_config_closure) }, - { be_const_key_weak(get_plugin_class_arg, -1), be_const_closure(Matter_Device_get_plugin_class_arg_closure) }, - { be_const_key_weak(commissioning_iterations, -1), be_const_var(10) }, - { be_const_key_weak(_mdns_announce_hostname, -1), be_const_closure(Matter_Device__mdns_announce_hostname_closure) }, - { be_const_key_weak(VENDOR_ID, -1), be_const_int(65521) }, - { be_const_key_weak(root_discriminator, -1), be_const_var(24) }, - { be_const_key_weak(init, -1), be_const_closure(Matter_Device_init_closure) }, - { be_const_key_weak(root_w0, 90), be_const_var(29) }, - { be_const_key_weak(mdns_pase_eth, -1), be_const_var(22) }, - { be_const_key_weak(every_second, -1), be_const_closure(Matter_Device_every_second_closure) }, - { be_const_key_weak(compute_qrcode_content, -1), be_const_closure(Matter_Device_compute_qrcode_content_closure) }, - { be_const_key_weak(k2l, -1), be_const_static_closure(Matter_Device_k2l_closure) }, - { be_const_key_weak(is_commissioning_open, -1), be_const_closure(Matter_Device_is_commissioning_open_closure) }, + { be_const_key_weak(plugins_classes, -1), be_const_var(3) }, + { be_const_key_weak(sort_distinct, 47), be_const_static_closure(Matter_Device_sort_distinct_closure) }, + { be_const_key_weak(commissioning_iterations, 16), be_const_var(11) }, + { be_const_key_weak(UDP_PORT, -1), be_const_int(5540) }, + { be_const_key_weak(stop_basic_commissioning, -1), be_const_closure(Matter_Device_stop_basic_commissioning_closure) }, + { be_const_key_weak(start_commissioning_complete_deferred, 9), be_const_closure(Matter_Device_start_commissioning_complete_deferred_closure) }, + { be_const_key_weak(ipv4only, 3), be_const_var(27) }, + { be_const_key_weak(start_operational_discovery_deferred, 0), be_const_closure(Matter_Device_start_operational_discovery_deferred_closure) }, })), be_str_weak(Matter_Device) ); diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_MessageHandler.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_MessageHandler.h index 4e0419fb8..a94a7c160 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_MessageHandler.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_MessageHandler.h @@ -300,7 +300,7 @@ be_local_closure(Matter_MessageHandler_msg_received, /* name */ }), be_str_weak(msg_received), &be_const_str_solidified, - ( &(const binstruction[390]) { /* code */ + ( &(const binstruction[391]) { /* code */ 0xA4120000, // 0000 IMPORT R4 K0 0x50140000, // 0001 LDBOOL R5 0 0 0xA802016A, // 0002 EXBLK 0 #016E @@ -666,9 +666,9 @@ be_local_closure(Matter_MessageHandler_msg_received, /* name */ 0xA8040001, // 016A EXBLK 1 1 0x80040A00, // 016B RET 1 R5 0xA8040001, // 016C EXBLK 1 1 - 0x70020016, // 016D JMP #0185 + 0x70020017, // 016D JMP #0186 0xAC180002, // 016E CATCH R6 0 2 - 0x70020013, // 016F JMP #0184 + 0x70020014, // 016F JMP #0185 0xB8220A00, // 0170 GETNGBL R8 K5 0x8C201106, // 0171 GETMET R8 R8 K6 0x60280008, // 0172 GETGBL R10 G8 @@ -681,16 +681,17 @@ be_local_closure(Matter_MessageHandler_msg_received, /* name */ 0x7C2C0200, // 0179 CALL R11 1 0x0028140B, // 017A ADD R10 R10 R11 0x7C200400, // 017B CALL R8 2 - 0x88200148, // 017C GETMBR R8 R0 K72 - 0x78220002, // 017D JMPF R8 #0181 - 0xA4229200, // 017E IMPORT R8 K73 - 0x8C24114A, // 017F GETMET R9 R8 K74 - 0x7C240200, // 0180 CALL R9 1 - 0x50200000, // 0181 LDBOOL R8 0 0 - 0x80041000, // 0182 RET 1 R8 - 0x70020000, // 0183 JMP #0185 - 0xB0080000, // 0184 RAISE 2 R0 R0 - 0x80000000, // 0185 RET 0 + 0xB8220A00, // 017C GETNGBL R8 K5 + 0x88201148, // 017D GETMBR R8 R8 K72 + 0x78220002, // 017E JMPF R8 #0182 + 0xA4229200, // 017F IMPORT R8 K73 + 0x8C24114A, // 0180 GETMET R9 R8 K74 + 0x7C240200, // 0181 CALL R9 1 + 0x50200000, // 0182 LDBOOL R8 0 0 + 0x80041000, // 0183 RET 1 R8 + 0x70020000, // 0184 JMP #0186 + 0xB0080000, // 0185 RAISE 2 R0 R0 + 0x80000000, // 0186 RET 0 }) ) ); diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin.h index 00fe4a9f5..1455906aa 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin.h @@ -7,100 +7,9 @@ extern const bclass be_class_Matter_Plugin; /******************************************************************** -** Solidified function: attribute_updated +** Solidified function: read_event ********************************************************************/ -be_local_closure(Matter_Plugin_attribute_updated, /* name */ - be_nested_proto( - 11, /* nstack */ - 5, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 3]) { /* constants */ - /* K0 */ be_nested_str_weak(endpoint), - /* K1 */ be_nested_str_weak(device), - /* K2 */ be_nested_str_weak(attribute_updated), - }), - be_str_weak(attribute_updated), - &be_const_str_solidified, - ( &(const binstruction[12]) { /* code */ - 0x4C140000, // 0000 LDNIL R5 - 0x1C140205, // 0001 EQ R5 R1 R5 - 0x78160000, // 0002 JMPF R5 #0004 - 0x88040100, // 0003 GETMBR R1 R0 K0 - 0x88140101, // 0004 GETMBR R5 R0 K1 - 0x8C140B02, // 0005 GETMET R5 R5 K2 - 0x5C1C0200, // 0006 MOVE R7 R1 - 0x5C200400, // 0007 MOVE R8 R2 - 0x5C240600, // 0008 MOVE R9 R3 - 0x5C280800, // 0009 MOVE R10 R4 - 0x7C140A00, // 000A CALL R5 5 - 0x80000000, // 000B RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: timed_request -********************************************************************/ -be_local_closure(Matter_Plugin_timed_request, /* name */ - be_nested_proto( - 5, /* nstack */ - 4, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 0, /* has constants */ - NULL, /* no const */ - be_str_weak(timed_request), - &be_const_str_solidified, - ( &(const binstruction[ 2]) { /* code */ - 0x4C100000, // 0000 LDNIL R4 - 0x80040800, // 0001 RET 1 R4 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: get_endpoint -********************************************************************/ -be_local_closure(Matter_Plugin_get_endpoint, /* name */ - be_nested_proto( - 2, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 1]) { /* constants */ - /* K0 */ be_nested_str_weak(endpoint), - }), - be_str_weak(get_endpoint), - &be_const_str_solidified, - ( &(const binstruction[ 2]) { /* code */ - 0x88040100, // 0000 GETMBR R1 R0 K0 - 0x80040200, // 0001 RET 1 R1 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: subscribe_attribute -********************************************************************/ -be_local_closure(Matter_Plugin_subscribe_attribute, /* name */ +be_local_closure(Matter_Plugin_read_event, /* name */ be_nested_proto( 6, /* nstack */ 5, /* argc */ @@ -111,7 +20,7 @@ be_local_closure(Matter_Plugin_subscribe_attribute, /* name */ NULL, /* no sub protos */ 0, /* has constants */ NULL, /* no const */ - be_str_weak(subscribe_attribute), + be_str_weak(read_event), &be_const_str_solidified, ( &(const binstruction[ 2]) { /* code */ 0x4C140000, // 0000 LDNIL R5 @@ -122,40 +31,6 @@ be_local_closure(Matter_Plugin_subscribe_attribute, /* name */ /*******************************************************************/ -/******************************************************************** -** Solidified function: init -********************************************************************/ -be_local_closure(Matter_Plugin_init, /* name */ - be_nested_proto( - 6, /* nstack */ - 4, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 4]) { /* constants */ - /* K0 */ be_nested_str_weak(device), - /* K1 */ be_nested_str_weak(endpoint), - /* K2 */ be_nested_str_weak(clusters), - /* K3 */ be_nested_str_weak(consolidate_clusters), - }), - be_str_weak(init), - &be_const_str_solidified, - ( &(const binstruction[ 6]) { /* code */ - 0x90020001, // 0000 SETMBR R0 K0 R1 - 0x90020202, // 0001 SETMBR R0 K1 R2 - 0x8C100103, // 0002 GETMET R4 R0 K3 - 0x7C100200, // 0003 CALL R4 1 - 0x90020404, // 0004 SETMBR R0 K2 R4 - 0x80000000, // 0005 RET 0 - }) - ) -); -/*******************************************************************/ - - /******************************************************************** ** Solidified function: write_attribute ********************************************************************/ @@ -182,12 +57,47 @@ be_local_closure(Matter_Plugin_write_attribute, /* name */ /******************************************************************** -** Solidified function: has +** Solidified function: attribute_updated ********************************************************************/ -be_local_closure(Matter_Plugin_has, /* name */ +be_local_closure(Matter_Plugin_attribute_updated, /* name */ be_nested_proto( - 6, /* nstack */ - 3, /* argc */ + 10, /* nstack */ + 4, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 3]) { /* constants */ + /* K0 */ be_nested_str_weak(device), + /* K1 */ be_nested_str_weak(attribute_updated), + /* K2 */ be_nested_str_weak(endpoint), + }), + be_str_weak(attribute_updated), + &be_const_str_solidified, + ( &(const binstruction[ 8]) { /* code */ + 0x88100100, // 0000 GETMBR R4 R0 K0 + 0x8C100901, // 0001 GETMET R4 R4 K1 + 0x88180102, // 0002 GETMBR R6 R0 K2 + 0x5C1C0200, // 0003 MOVE R7 R1 + 0x5C200400, // 0004 MOVE R8 R2 + 0x5C240600, // 0005 MOVE R9 R3 + 0x7C100A00, // 0006 CALL R4 5 + 0x80000000, // 0007 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: get_cluster_list +********************************************************************/ +be_local_closure(Matter_Plugin_get_cluster_list, /* name */ + be_nested_proto( + 8, /* nstack */ + 2, /* argc */ 2, /* varg */ 0, /* has upvals */ NULL, /* no upvals */ @@ -196,53 +106,31 @@ be_local_closure(Matter_Plugin_has, /* name */ 1, /* has constants */ ( &(const bvalue[ 4]) { /* constants */ /* K0 */ be_nested_str_weak(clusters), - /* K1 */ be_nested_str_weak(contains), - /* K2 */ be_nested_str_weak(endpoints), - /* K3 */ be_nested_str_weak(find), + /* K1 */ be_nested_str_weak(keys), + /* K2 */ be_nested_str_weak(push), + /* K3 */ be_nested_str_weak(stop_iteration), }), - be_str_weak(has), + be_str_weak(get_cluster_list), &be_const_str_solidified, - ( &(const binstruction[15]) { /* code */ - 0x880C0100, // 0000 GETMBR R3 R0 K0 - 0x8C0C0701, // 0001 GETMET R3 R3 K1 - 0x5C140200, // 0002 MOVE R5 R1 - 0x7C0C0400, // 0003 CALL R3 2 - 0x780E0006, // 0004 JMPF R3 #000C - 0x880C0102, // 0005 GETMBR R3 R0 K2 - 0x8C0C0703, // 0006 GETMET R3 R3 K3 - 0x5C140400, // 0007 MOVE R5 R2 - 0x7C0C0400, // 0008 CALL R3 2 - 0x4C100000, // 0009 LDNIL R4 - 0x200C0604, // 000A NE R3 R3 R4 - 0x740E0000, // 000B JMPT R3 #000D - 0x500C0001, // 000C LDBOOL R3 0 1 - 0x500C0200, // 000D LDBOOL R3 1 0 - 0x80040600, // 000E RET 1 R3 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: invoke_request -********************************************************************/ -be_local_closure(Matter_Plugin_invoke_request, /* name */ - be_nested_proto( - 5, /* nstack */ - 4, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 0, /* has constants */ - NULL, /* no const */ - be_str_weak(invoke_request), - &be_const_str_solidified, - ( &(const binstruction[ 2]) { /* code */ - 0x4C100000, // 0000 LDNIL R4 - 0x80040800, // 0001 RET 1 R4 + ( &(const binstruction[18]) { /* code */ + 0x60080012, // 0000 GETGBL R2 G18 + 0x7C080000, // 0001 CALL R2 0 + 0x600C0010, // 0002 GETGBL R3 G16 + 0x88100100, // 0003 GETMBR R4 R0 K0 + 0x8C100901, // 0004 GETMET R4 R4 K1 + 0x7C100200, // 0005 CALL R4 1 + 0x7C0C0200, // 0006 CALL R3 1 + 0xA8020005, // 0007 EXBLK 0 #000E + 0x5C100600, // 0008 MOVE R4 R3 + 0x7C100000, // 0009 CALL R4 0 + 0x8C140502, // 000A GETMET R5 R2 K2 + 0x5C1C0800, // 000B MOVE R7 R4 + 0x7C140400, // 000C CALL R5 2 + 0x7001FFF9, // 000D JMP #0008 + 0x580C0003, // 000E LDCONST R3 K3 + 0xAC0C0200, // 000F CATCH R3 1 0 + 0xB0080000, // 0010 RAISE 2 R0 R0 + 0x80040400, // 0011 RET 1 R2 }) ) ); @@ -254,31 +142,7 @@ be_local_closure(Matter_Plugin_invoke_request, /* name */ ********************************************************************/ be_local_closure(Matter_Plugin_update_shadow, /* name */ be_nested_proto( - 1, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 0, /* has constants */ - NULL, /* no const */ - be_str_weak(update_shadow), - &be_const_str_solidified, - ( &(const binstruction[ 1]) { /* code */ - 0x80000000, // 0000 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: every_second -********************************************************************/ -be_local_closure(Matter_Plugin_every_second, /* name */ - be_nested_proto( - 3, /* nstack */ + 2, /* nstack */ 1, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -286,15 +150,17 @@ be_local_closure(Matter_Plugin_every_second, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[ 1]) { /* constants */ - /* K0 */ be_nested_str_weak(update_shadow), + ( &(const bvalue[ 2]) { /* constants */ + /* K0 */ be_nested_str_weak(tick), + /* K1 */ be_nested_str_weak(device), }), - be_str_weak(every_second), + be_str_weak(update_shadow), &be_const_str_solidified, - ( &(const binstruction[ 3]) { /* code */ - 0x8C040100, // 0000 GETMET R1 R0 K0 - 0x7C040200, // 0001 CALL R1 1 - 0x80000000, // 0002 RET 0 + ( &(const binstruction[ 4]) { /* code */ + 0x88040101, // 0000 GETMBR R1 R0 K1 + 0x88040300, // 0001 GETMBR R1 R1 K0 + 0x90020001, // 0002 SETMBR R0 K0 R1 + 0x80000000, // 0003 RET 0 }) ) ); @@ -539,33 +405,6 @@ be_local_closure(Matter_Plugin_consolidate_clusters, /* name */ /*******************************************************************/ -/******************************************************************** -** Solidified function: -********************************************************************/ -be_local_closure(Matter_Plugin__X3Clambda_X3E, /* name */ - be_nested_proto( - 3, /* nstack */ - 1, /* argc */ - 0, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 0, /* has constants */ - NULL, /* no const */ - be_str_weak(_X3Clambda_X3E), - &be_const_str_solidified, - ( &(const binstruction[ 4]) { /* code */ - 0x60040008, // 0000 GETGBL R1 G8 - 0x5C080000, // 0001 MOVE R2 R0 - 0x7C040200, // 0002 CALL R1 1 - 0x80040200, // 0003 RET 1 R1 - }) - ) -); -/*******************************************************************/ - - /******************************************************************** ** Solidified function: get_attribute_list ********************************************************************/ @@ -600,12 +439,12 @@ be_local_closure(Matter_Plugin_get_attribute_list, /* name */ /******************************************************************** -** Solidified function: read_event +** Solidified function: timed_request ********************************************************************/ -be_local_closure(Matter_Plugin_read_event, /* name */ +be_local_closure(Matter_Plugin_timed_request, /* name */ be_nested_proto( - 6, /* nstack */ - 5, /* argc */ + 5, /* nstack */ + 4, /* argc */ 2, /* varg */ 0, /* has upvals */ NULL, /* no upvals */ @@ -613,11 +452,11 @@ be_local_closure(Matter_Plugin_read_event, /* name */ NULL, /* no sub protos */ 0, /* has constants */ NULL, /* no const */ - be_str_weak(read_event), + be_str_weak(timed_request), &be_const_str_solidified, ( &(const binstruction[ 2]) { /* code */ - 0x4C140000, // 0000 LDNIL R5 - 0x80040A00, // 0001 RET 1 R5 + 0x4C100000, // 0000 LDNIL R4 + 0x80040800, // 0001 RET 1 R4 }) ) ); @@ -649,12 +488,213 @@ be_local_closure(Matter_Plugin_parse_sensors, /* name */ /******************************************************************** -** Solidified function: get_cluster_list +** Solidified function: update_shadow_lazy ********************************************************************/ -be_local_closure(Matter_Plugin_get_cluster_list, /* name */ +be_local_closure(Matter_Plugin_update_shadow_lazy, /* name */ be_nested_proto( - 8, /* nstack */ - 2, /* argc */ + 3, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 3]) { /* constants */ + /* K0 */ be_nested_str_weak(tick), + /* K1 */ be_nested_str_weak(device), + /* K2 */ be_nested_str_weak(update_shadow), + }), + be_str_weak(update_shadow_lazy), + &be_const_str_solidified, + ( &(const binstruction[ 8]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x88080101, // 0001 GETMBR R2 R0 K1 + 0x88080500, // 0002 GETMBR R2 R2 K0 + 0x20040202, // 0003 NE R1 R1 R2 + 0x78060001, // 0004 JMPF R1 #0007 + 0x8C040102, // 0005 GETMET R1 R0 K2 + 0x7C040200, // 0006 CALL R1 1 + 0x80000000, // 0007 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: +********************************************************************/ +be_local_closure(Matter_Plugin__X3Clambda_X3E, /* name */ + be_nested_proto( + 3, /* nstack */ + 1, /* argc */ + 0, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 0, /* has constants */ + NULL, /* no const */ + be_str_weak(_X3Clambda_X3E), + &be_const_str_solidified, + ( &(const binstruction[ 4]) { /* code */ + 0x60040008, // 0000 GETGBL R1 G8 + 0x5C080000, // 0001 MOVE R2 R0 + 0x7C040200, // 0002 CALL R1 1 + 0x80040200, // 0003 RET 1 R1 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: get_endpoint +********************************************************************/ +be_local_closure(Matter_Plugin_get_endpoint, /* name */ + be_nested_proto( + 2, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 1]) { /* constants */ + /* K0 */ be_nested_str_weak(endpoint), + }), + be_str_weak(get_endpoint), + &be_const_str_solidified, + ( &(const binstruction[ 2]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x80040200, // 0001 RET 1 R1 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: subscribe_attribute +********************************************************************/ +be_local_closure(Matter_Plugin_subscribe_attribute, /* name */ + be_nested_proto( + 6, /* nstack */ + 5, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 0, /* has constants */ + NULL, /* no const */ + be_str_weak(subscribe_attribute), + &be_const_str_solidified, + ( &(const binstruction[ 2]) { /* code */ + 0x4C140000, // 0000 LDNIL R5 + 0x80040A00, // 0001 RET 1 R5 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: every_second +********************************************************************/ +be_local_closure(Matter_Plugin_every_second, /* name */ + be_nested_proto( + 3, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 1]) { /* constants */ + /* K0 */ be_nested_str_weak(update_shadow), + }), + be_str_weak(every_second), + &be_const_str_solidified, + ( &(const binstruction[ 3]) { /* code */ + 0x8C040100, // 0000 GETMET R1 R0 K0 + 0x7C040200, // 0001 CALL R1 1 + 0x80000000, // 0002 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: invoke_request +********************************************************************/ +be_local_closure(Matter_Plugin_invoke_request, /* name */ + be_nested_proto( + 5, /* nstack */ + 4, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 0, /* has constants */ + NULL, /* no const */ + be_str_weak(invoke_request), + &be_const_str_solidified, + ( &(const binstruction[ 2]) { /* code */ + 0x4C100000, // 0000 LDNIL R4 + 0x80040800, // 0001 RET 1 R4 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: init +********************************************************************/ +be_local_closure(Matter_Plugin_init, /* name */ + be_nested_proto( + 6, /* nstack */ + 4, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 4]) { /* constants */ + /* K0 */ be_nested_str_weak(device), + /* K1 */ be_nested_str_weak(endpoint), + /* K2 */ be_nested_str_weak(clusters), + /* K3 */ be_nested_str_weak(consolidate_clusters), + }), + be_str_weak(init), + &be_const_str_solidified, + ( &(const binstruction[ 6]) { /* code */ + 0x90020001, // 0000 SETMBR R0 K0 R1 + 0x90020202, // 0001 SETMBR R0 K1 R2 + 0x8C100103, // 0002 GETMET R4 R0 K3 + 0x7C100200, // 0003 CALL R4 1 + 0x90020404, // 0004 SETMBR R0 K2 R4 + 0x80000000, // 0005 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: has +********************************************************************/ +be_local_closure(Matter_Plugin_has, /* name */ + be_nested_proto( + 6, /* nstack */ + 3, /* argc */ 2, /* varg */ 0, /* has upvals */ NULL, /* no upvals */ @@ -663,31 +703,28 @@ be_local_closure(Matter_Plugin_get_cluster_list, /* name */ 1, /* has constants */ ( &(const bvalue[ 4]) { /* constants */ /* K0 */ be_nested_str_weak(clusters), - /* K1 */ be_nested_str_weak(keys), - /* K2 */ be_nested_str_weak(push), - /* K3 */ be_nested_str_weak(stop_iteration), + /* K1 */ be_nested_str_weak(contains), + /* K2 */ be_nested_str_weak(endpoints), + /* K3 */ be_nested_str_weak(find), }), - be_str_weak(get_cluster_list), + be_str_weak(has), &be_const_str_solidified, - ( &(const binstruction[18]) { /* code */ - 0x60080012, // 0000 GETGBL R2 G18 - 0x7C080000, // 0001 CALL R2 0 - 0x600C0010, // 0002 GETGBL R3 G16 - 0x88100100, // 0003 GETMBR R4 R0 K0 - 0x8C100901, // 0004 GETMET R4 R4 K1 - 0x7C100200, // 0005 CALL R4 1 - 0x7C0C0200, // 0006 CALL R3 1 - 0xA8020005, // 0007 EXBLK 0 #000E - 0x5C100600, // 0008 MOVE R4 R3 - 0x7C100000, // 0009 CALL R4 0 - 0x8C140502, // 000A GETMET R5 R2 K2 - 0x5C1C0800, // 000B MOVE R7 R4 - 0x7C140400, // 000C CALL R5 2 - 0x7001FFF9, // 000D JMP #0008 - 0x580C0003, // 000E LDCONST R3 K3 - 0xAC0C0200, // 000F CATCH R3 1 0 - 0xB0080000, // 0010 RAISE 2 R0 R0 - 0x80040400, // 0011 RET 1 R2 + ( &(const binstruction[15]) { /* code */ + 0x880C0100, // 0000 GETMBR R3 R0 K0 + 0x8C0C0701, // 0001 GETMET R3 R3 K1 + 0x5C140200, // 0002 MOVE R5 R1 + 0x7C0C0400, // 0003 CALL R3 2 + 0x780E0006, // 0004 JMPF R3 #000C + 0x880C0102, // 0005 GETMBR R3 R0 K2 + 0x8C0C0703, // 0006 GETMET R3 R3 K3 + 0x5C140400, // 0007 MOVE R5 R2 + 0x7C0C0400, // 0008 CALL R3 2 + 0x4C100000, // 0009 LDNIL R4 + 0x200C0604, // 000A NE R3 R3 R4 + 0x740E0000, // 000B JMPT R3 #000D + 0x500C0001, // 000C LDBOOL R3 0 1 + 0x500C0200, // 000D LDBOOL R3 1 0 + 0x80040600, // 000E RET 1 R3 }) ) ); @@ -723,13 +760,18 @@ be_local_closure(Matter_Plugin_subscribe_event, /* name */ ** Solidified class: Matter_Plugin ********************************************************************/ be_local_class(Matter_Plugin, - 3, + 4, NULL, - be_nested_map(25, + be_nested_map(27, ( (struct bmapnode*) &(const bmapnode[]) { - { be_const_key_weak(attribute_updated, -1), be_const_closure(Matter_Plugin_attribute_updated_closure) }, - { be_const_key_weak(timed_request, 7), be_const_closure(Matter_Plugin_timed_request_closure) }, - { be_const_key_weak(get_endpoint, -1), be_const_closure(Matter_Plugin_get_endpoint_closure) }, + { be_const_key_weak(read_event, 6), be_const_closure(Matter_Plugin_read_event_closure) }, + { be_const_key_weak(TYPE, 18), be_nested_str_weak() }, + { be_const_key_weak(update_shadow, -1), be_const_closure(Matter_Plugin_update_shadow_closure) }, + { be_const_key_weak(get_attribute_list, -1), be_const_closure(Matter_Plugin_get_attribute_list_closure) }, + { be_const_key_weak(init, -1), be_const_closure(Matter_Plugin_init_closure) }, + { be_const_key_weak(tick, -1), be_const_var(3) }, + { be_const_key_weak(ARG, -1), be_nested_str_weak() }, + { be_const_key_weak(get_cluster_list, 2), be_const_closure(Matter_Plugin_get_cluster_list_closure) }, { be_const_key_weak(CLUSTERS, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { be_const_map( * be_nested_map(1, ( (struct bmapnode*) &(const bmapnode[]) { @@ -744,27 +786,24 @@ be_local_class(Matter_Plugin, be_const_int(65533), })) ) } )) }, })) ) } )) }, - { be_const_key_weak(subscribe_attribute, -1), be_const_closure(Matter_Plugin_subscribe_attribute_closure) }, - { be_const_key_weak(init, -1), be_const_closure(Matter_Plugin_init_closure) }, - { be_const_key_weak(subscribe_event, 18), be_const_closure(Matter_Plugin_subscribe_event_closure) }, - { be_const_key_weak(clusters, -1), be_const_var(2) }, - { be_const_key_weak(endpoint, -1), be_const_var(1) }, - { be_const_key_weak(update_shadow, -1), be_const_closure(Matter_Plugin_update_shadow_closure) }, - { be_const_key_weak(write_attribute, 23), be_const_closure(Matter_Plugin_write_attribute_closure) }, - { be_const_key_weak(device, -1), be_const_var(0) }, - { be_const_key_weak(invoke_request, 6), be_const_closure(Matter_Plugin_invoke_request_closure) }, - { be_const_key_weak(read_event, -1), be_const_closure(Matter_Plugin_read_event_closure) }, - { be_const_key_weak(TYPE, 9), be_nested_str_weak(generic) }, - { be_const_key_weak(every_second, -1), be_const_closure(Matter_Plugin_every_second_closure) }, - { be_const_key_weak(get_attribute_list, 17), be_const_closure(Matter_Plugin_get_attribute_list_closure) }, - { be_const_key_weak(ARG_TYPE, -1), be_const_static_closure(Matter_Plugin__X3Clambda_X3E_closure) }, - { be_const_key_weak(read_attribute, -1), be_const_closure(Matter_Plugin_read_attribute_closure) }, - { be_const_key_weak(ARG, 16), be_nested_str_weak() }, - { be_const_key_weak(consolidate_clusters, 13), be_const_closure(Matter_Plugin_consolidate_clusters_closure) }, { be_const_key_weak(parse_sensors, -1), be_const_closure(Matter_Plugin_parse_sensors_closure) }, - { be_const_key_weak(get_cluster_list, -1), be_const_closure(Matter_Plugin_get_cluster_list_closure) }, - { be_const_key_weak(has, -1), be_const_closure(Matter_Plugin_has_closure) }, + { be_const_key_weak(clusters, -1), be_const_var(2) }, + { be_const_key_weak(consolidate_clusters, -1), be_const_closure(Matter_Plugin_consolidate_clusters_closure) }, { be_const_key_weak(NAME, 3), be_nested_str_weak() }, + { be_const_key_weak(subscribe_attribute, 20), be_const_closure(Matter_Plugin_subscribe_attribute_closure) }, + { be_const_key_weak(timed_request, -1), be_const_closure(Matter_Plugin_timed_request_closure) }, + { be_const_key_weak(read_attribute, 9), be_const_closure(Matter_Plugin_read_attribute_closure) }, + { be_const_key_weak(write_attribute, 13), be_const_closure(Matter_Plugin_write_attribute_closure) }, + { be_const_key_weak(update_shadow_lazy, -1), be_const_closure(Matter_Plugin_update_shadow_lazy_closure) }, + { be_const_key_weak(ARG_TYPE, -1), be_const_static_closure(Matter_Plugin__X3Clambda_X3E_closure) }, + { be_const_key_weak(get_endpoint, -1), be_const_closure(Matter_Plugin_get_endpoint_closure) }, + { be_const_key_weak(endpoint, -1), be_const_var(1) }, + { be_const_key_weak(every_second, -1), be_const_closure(Matter_Plugin_every_second_closure) }, + { be_const_key_weak(attribute_updated, 8), be_const_closure(Matter_Plugin_attribute_updated_closure) }, + { be_const_key_weak(invoke_request, -1), be_const_closure(Matter_Plugin_invoke_request_closure) }, + { be_const_key_weak(device, 4), be_const_var(0) }, + { be_const_key_weak(has, -1), be_const_closure(Matter_Plugin_has_closure) }, + { be_const_key_weak(subscribe_event, -1), be_const_closure(Matter_Plugin_subscribe_event_closure) }, })), be_str_weak(Matter_Plugin) ); diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Device.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Device.h index 192e2f3e3..054d6a0db 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Device.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Device.h @@ -36,7 +36,7 @@ be_local_closure(Matter_Plugin_Device_read_attribute, /* name */ }), be_str_weak(read_attribute), &be_const_str_solidified, - ( &(const binstruction[76]) { /* code */ + ( &(const binstruction[97]) { /* code */ 0xA40E0000, // 0000 IMPORT R3 K0 0xB8120200, // 0001 GETNGBL R4 K1 0x88100902, // 0002 GETMBR R4 R4 K2 @@ -77,7 +77,7 @@ be_local_closure(Matter_Plugin_Device_read_attribute, /* name */ 0x542A0003, // 0025 LDINT R10 4 0x7C1C0600, // 0026 CALL R7 3 0x80040E00, // 0027 RET 1 R7 - 0x70020021, // 0028 JMP #004B + 0x70020036, // 0028 JMP #0060 0x541E0003, // 0029 LDINT R7 4 0x1C1C0A07, // 002A EQ R7 R5 R7 0x781E0016, // 002B JMPF R7 #0043 @@ -103,16 +103,37 @@ be_local_closure(Matter_Plugin_Device_read_attribute, /* name */ 0x542A0003, // 003F LDINT R10 4 0x7C1C0600, // 0040 CALL R7 3 0x80040E00, // 0041 RET 1 R7 - 0x70020007, // 0042 JMP #004B - 0x601C0003, // 0043 GETGBL R7 G3 - 0x5C200000, // 0044 MOVE R8 R0 - 0x7C1C0200, // 0045 CALL R7 1 - 0x8C1C0F0C, // 0046 GETMET R7 R7 K12 - 0x5C240200, // 0047 MOVE R9 R1 - 0x5C280400, // 0048 MOVE R10 R2 - 0x7C1C0600, // 0049 CALL R7 3 - 0x80040E00, // 004A RET 1 R7 - 0x80000000, // 004B RET 0 + 0x7002001C, // 0042 JMP #0060 + 0x541E0004, // 0043 LDINT R7 5 + 0x1C1C0A07, // 0044 EQ R7 R5 R7 + 0x781E0011, // 0045 JMPF R7 #0058 + 0x541EFFFB, // 0046 LDINT R7 65532 + 0x1C1C0C07, // 0047 EQ R7 R6 R7 + 0x781E0005, // 0048 JMPF R7 #004F + 0x8C1C0907, // 0049 GETMET R7 R4 K7 + 0x8824090B, // 004A GETMBR R9 R4 K11 + 0x58280006, // 004B LDCONST R10 K6 + 0x7C1C0600, // 004C CALL R7 3 + 0x80040E00, // 004D RET 1 R7 + 0x70020007, // 004E JMP #0057 + 0x541EFFFC, // 004F LDINT R7 65533 + 0x1C1C0C07, // 0050 EQ R7 R6 R7 + 0x781E0004, // 0051 JMPF R7 #0057 + 0x8C1C0907, // 0052 GETMET R7 R4 K7 + 0x8824090B, // 0053 GETMBR R9 R4 K11 + 0x542A0003, // 0054 LDINT R10 4 + 0x7C1C0600, // 0055 CALL R7 3 + 0x80040E00, // 0056 RET 1 R7 + 0x70020007, // 0057 JMP #0060 + 0x601C0003, // 0058 GETGBL R7 G3 + 0x5C200000, // 0059 MOVE R8 R0 + 0x7C1C0200, // 005A CALL R7 1 + 0x8C1C0F0C, // 005B GETMET R7 R7 K12 + 0x5C240200, // 005C MOVE R9 R1 + 0x5C280400, // 005D MOVE R10 R2 + 0x7C1C0600, // 005E CALL R7 3 + 0x80040E00, // 005F RET 1 R7 + 0x80000000, // 0060 RET 0 }) ) ); @@ -147,7 +168,7 @@ be_local_closure(Matter_Plugin_Device_invoke_request, /* name */ }), be_str_weak(invoke_request), &be_const_str_solidified, - ( &(const binstruction[45]) { /* code */ + ( &(const binstruction[51]) { /* code */ 0xB8120000, // 0000 GETNGBL R4 K0 0x88100901, // 0001 GETMBR R4 R4 K1 0x88140702, // 0002 GETMBR R5 R3 K2 @@ -176,23 +197,29 @@ be_local_closure(Matter_Plugin_Device_invoke_request, /* name */ 0x781E0001, // 0019 JMPF R7 #001C 0x501C0200, // 001A LDBOOL R7 1 0 0x80040E00, // 001B RET 1 R7 - 0x7002000E, // 001C JMP #002C + 0x70020014, // 001C JMP #0032 0x541E0003, // 001D LDINT R7 4 0x1C1C0A07, // 001E EQ R7 R5 R7 0x781E0002, // 001F JMPF R7 #0023 0x501C0200, // 0020 LDBOOL R7 1 0 0x80040E00, // 0021 RET 1 R7 - 0x70020008, // 0022 JMP #002C - 0x601C0003, // 0023 GETGBL R7 G3 - 0x5C200000, // 0024 MOVE R8 R0 - 0x7C1C0200, // 0025 CALL R7 1 - 0x8C1C0F0A, // 0026 GETMET R7 R7 K10 - 0x5C240200, // 0027 MOVE R9 R1 - 0x5C280400, // 0028 MOVE R10 R2 - 0x5C2C0600, // 0029 MOVE R11 R3 - 0x7C1C0800, // 002A CALL R7 4 - 0x80040E00, // 002B RET 1 R7 - 0x80000000, // 002C RET 0 + 0x7002000E, // 0022 JMP #0032 + 0x541E0004, // 0023 LDINT R7 5 + 0x1C1C0A07, // 0024 EQ R7 R5 R7 + 0x781E0002, // 0025 JMPF R7 #0029 + 0x501C0200, // 0026 LDBOOL R7 1 0 + 0x80040E00, // 0027 RET 1 R7 + 0x70020008, // 0028 JMP #0032 + 0x601C0003, // 0029 GETGBL R7 G3 + 0x5C200000, // 002A MOVE R8 R0 + 0x7C1C0200, // 002B CALL R7 1 + 0x8C1C0F0A, // 002C GETMET R7 R7 K10 + 0x5C240200, // 002D MOVE R9 R1 + 0x5C280400, // 002E MOVE R10 R2 + 0x5C2C0600, // 002F MOVE R11 R3 + 0x7C1C0800, // 0030 CALL R7 4 + 0x80040E00, // 0031 RET 1 R7 + 0x80000000, // 0032 RET 0 }) ) ); @@ -209,8 +236,16 @@ be_local_class(Matter_Plugin_Device, be_nested_map(4, ( (struct bmapnode*) &(const bmapnode[]) { { be_const_key_weak(CLUSTERS, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { - be_const_map( * be_nested_map(2, + be_const_map( * be_nested_map(3, ( (struct bmapnode*) &(const bmapnode[]) { + { be_const_key_int(3, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_list, { + be_const_list( * be_nested_list(4, + ( (struct bvalue*) &(const bvalue[]) { + be_const_int(0), + be_const_int(1), + be_const_int(65532), + be_const_int(65533), + })) ) } )) }, { be_const_key_int(4, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_list, { be_const_list( * be_nested_list(3, ( (struct bvalue*) &(const bvalue[]) { @@ -218,11 +253,15 @@ be_local_class(Matter_Plugin_Device, be_const_int(65532), be_const_int(65533), })) ) } )) }, - { be_const_key_int(3, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_list, { - be_const_list( * be_nested_list(4, + { be_const_key_int(5, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_list, { + be_const_list( * be_nested_list(8, ( (struct bvalue*) &(const bvalue[]) { be_const_int(0), be_const_int(1), + be_const_int(2), + be_const_int(3), + be_const_int(4), + be_const_int(5), be_const_int(65532), be_const_int(65533), })) ) } )) }, diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Light0.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Light0.h index 287a29d30..7de68c853 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Light0.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Light0.h @@ -11,7 +11,7 @@ extern const bclass be_class_Matter_Plugin_Light0; ********************************************************************/ be_local_closure(Matter_Plugin_Light0_invoke_request, /* name */ be_nested_proto( - 14, /* nstack */ + 12, /* nstack */ 4, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -19,114 +19,76 @@ be_local_closure(Matter_Plugin_Light0_invoke_request, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[16]) { /* constants */ + ( &(const bvalue[13]) { /* constants */ /* K0 */ be_nested_str_weak(light), /* K1 */ be_nested_str_weak(matter), /* K2 */ be_nested_str_weak(TLV), /* K3 */ be_nested_str_weak(cluster), /* K4 */ be_nested_str_weak(command), - /* K5 */ be_const_int(3), + /* K5 */ be_nested_str_weak(update_shadow_lazy), /* K6 */ be_const_int(0), - /* K7 */ be_const_int(1), - /* K8 */ be_nested_str_weak(Matter_TLV_struct), - /* K9 */ be_nested_str_weak(add_TLV), - /* K10 */ be_nested_str_weak(U2), - /* K11 */ be_nested_str_weak(set), - /* K12 */ be_nested_str_weak(power), - /* K13 */ be_nested_str_weak(update_shadow), - /* K14 */ be_const_int(2), - /* K15 */ be_nested_str_weak(shadow_onoff), + /* K7 */ be_nested_str_weak(set), + /* K8 */ be_nested_str_weak(power), + /* K9 */ be_nested_str_weak(update_shadow), + /* K10 */ be_const_int(1), + /* K11 */ be_const_int(2), + /* K12 */ be_nested_str_weak(shadow_onoff), }), be_str_weak(invoke_request), &be_const_str_solidified, - ( &(const binstruction[87]) { /* code */ + ( &(const binstruction[52]) { /* code */ 0xA4120000, // 0000 IMPORT R4 K0 0xB8160200, // 0001 GETNGBL R5 K1 0x88140B02, // 0002 GETMBR R5 R5 K2 0x88180703, // 0003 GETMBR R6 R3 K3 0x881C0704, // 0004 GETMBR R7 R3 K4 - 0x1C200D05, // 0005 EQ R8 R6 K5 - 0x78220016, // 0006 JMPF R8 #001E - 0x1C200F06, // 0007 EQ R8 R7 K6 - 0x78220002, // 0008 JMPF R8 #000C - 0x50200200, // 0009 LDBOOL R8 1 0 - 0x80041000, // 000A RET 1 R8 - 0x70020010, // 000B JMP #001D - 0x1C200F07, // 000C EQ R8 R7 K7 - 0x78220009, // 000D JMPF R8 #0018 - 0x8C200B08, // 000E GETMET R8 R5 K8 - 0x7C200200, // 000F CALL R8 1 - 0x8C241109, // 0010 GETMET R9 R8 K9 - 0x582C0006, // 0011 LDCONST R11 K6 - 0x88300B0A, // 0012 GETMBR R12 R5 K10 - 0x58340006, // 0013 LDCONST R13 K6 - 0x7C240800, // 0014 CALL R9 4 - 0x900E0906, // 0015 SETMBR R3 K4 K6 - 0x80041000, // 0016 RET 1 R8 - 0x70020004, // 0017 JMP #001D - 0x5422003F, // 0018 LDINT R8 64 - 0x1C200E08, // 0019 EQ R8 R7 R8 - 0x78220001, // 001A JMPF R8 #001D - 0x50200200, // 001B LDBOOL R8 1 0 - 0x80041000, // 001C RET 1 R8 - 0x70020037, // 001D JMP #0056 - 0x54220003, // 001E LDINT R8 4 - 0x1C200C08, // 001F EQ R8 R6 R8 - 0x78220002, // 0020 JMPF R8 #0024 + 0x54220005, // 0005 LDINT R8 6 + 0x1C200C08, // 0006 EQ R8 R6 R8 + 0x7822002A, // 0007 JMPF R8 #0033 + 0x8C200105, // 0008 GETMET R8 R0 K5 + 0x7C200200, // 0009 CALL R8 1 + 0x1C200F06, // 000A EQ R8 R7 K6 + 0x7822000A, // 000B JMPF R8 #0017 + 0x8C200907, // 000C GETMET R8 R4 K7 + 0x60280013, // 000D GETGBL R10 G19 + 0x7C280000, // 000E CALL R10 0 + 0x502C0000, // 000F LDBOOL R11 0 0 + 0x982A100B, // 0010 SETIDX R10 K8 R11 + 0x7C200400, // 0011 CALL R8 2 + 0x8C200109, // 0012 GETMET R8 R0 K9 + 0x7C200200, // 0013 CALL R8 1 + 0x50200200, // 0014 LDBOOL R8 1 0 + 0x80041000, // 0015 RET 1 R8 + 0x7002001B, // 0016 JMP #0033 + 0x1C200F0A, // 0017 EQ R8 R7 K10 + 0x7822000A, // 0018 JMPF R8 #0024 + 0x8C200907, // 0019 GETMET R8 R4 K7 + 0x60280013, // 001A GETGBL R10 G19 + 0x7C280000, // 001B CALL R10 0 + 0x502C0200, // 001C LDBOOL R11 1 0 + 0x982A100B, // 001D SETIDX R10 K8 R11 + 0x7C200400, // 001E CALL R8 2 + 0x8C200109, // 001F GETMET R8 R0 K9 + 0x7C200200, // 0020 CALL R8 1 0x50200200, // 0021 LDBOOL R8 1 0 0x80041000, // 0022 RET 1 R8 - 0x70020031, // 0023 JMP #0056 - 0x54220004, // 0024 LDINT R8 5 - 0x1C200C08, // 0025 EQ R8 R6 R8 - 0x78220002, // 0026 JMPF R8 #002A - 0x50200200, // 0027 LDBOOL R8 1 0 - 0x80041000, // 0028 RET 1 R8 - 0x7002002B, // 0029 JMP #0056 - 0x54220005, // 002A LDINT R8 6 - 0x1C200C08, // 002B EQ R8 R6 R8 - 0x78220028, // 002C JMPF R8 #0056 - 0x1C200F06, // 002D EQ R8 R7 K6 - 0x7822000A, // 002E JMPF R8 #003A - 0x8C20090B, // 002F GETMET R8 R4 K11 - 0x60280013, // 0030 GETGBL R10 G19 - 0x7C280000, // 0031 CALL R10 0 - 0x502C0000, // 0032 LDBOOL R11 0 0 - 0x982A180B, // 0033 SETIDX R10 K12 R11 - 0x7C200400, // 0034 CALL R8 2 - 0x8C20010D, // 0035 GETMET R8 R0 K13 - 0x7C200200, // 0036 CALL R8 1 - 0x50200200, // 0037 LDBOOL R8 1 0 - 0x80041000, // 0038 RET 1 R8 - 0x7002001B, // 0039 JMP #0056 - 0x1C200F07, // 003A EQ R8 R7 K7 - 0x7822000A, // 003B JMPF R8 #0047 - 0x8C20090B, // 003C GETMET R8 R4 K11 - 0x60280013, // 003D GETGBL R10 G19 - 0x7C280000, // 003E CALL R10 0 - 0x502C0200, // 003F LDBOOL R11 1 0 - 0x982A180B, // 0040 SETIDX R10 K12 R11 - 0x7C200400, // 0041 CALL R8 2 - 0x8C20010D, // 0042 GETMET R8 R0 K13 - 0x7C200200, // 0043 CALL R8 1 - 0x50200200, // 0044 LDBOOL R8 1 0 - 0x80041000, // 0045 RET 1 R8 - 0x7002000E, // 0046 JMP #0056 - 0x1C200F0E, // 0047 EQ R8 R7 K14 - 0x7822000C, // 0048 JMPF R8 #0056 - 0x8C20090B, // 0049 GETMET R8 R4 K11 - 0x60280013, // 004A GETGBL R10 G19 - 0x7C280000, // 004B CALL R10 0 - 0x882C010F, // 004C GETMBR R11 R0 K15 - 0x782E0000, // 004D JMPF R11 #004F - 0x502C0001, // 004E LDBOOL R11 0 1 - 0x502C0200, // 004F LDBOOL R11 1 0 - 0x982A180B, // 0050 SETIDX R10 K12 R11 - 0x7C200400, // 0051 CALL R8 2 - 0x8C20010D, // 0052 GETMET R8 R0 K13 - 0x7C200200, // 0053 CALL R8 1 - 0x50200200, // 0054 LDBOOL R8 1 0 - 0x80041000, // 0055 RET 1 R8 - 0x80000000, // 0056 RET 0 + 0x7002000E, // 0023 JMP #0033 + 0x1C200F0B, // 0024 EQ R8 R7 K11 + 0x7822000C, // 0025 JMPF R8 #0033 + 0x8C200907, // 0026 GETMET R8 R4 K7 + 0x60280013, // 0027 GETGBL R10 G19 + 0x7C280000, // 0028 CALL R10 0 + 0x882C010C, // 0029 GETMBR R11 R0 K12 + 0x782E0000, // 002A JMPF R11 #002C + 0x502C0001, // 002B LDBOOL R11 0 1 + 0x502C0200, // 002C LDBOOL R11 1 0 + 0x982A100B, // 002D SETIDX R10 K8 R11 + 0x7C200400, // 002E CALL R8 2 + 0x8C200109, // 002F GETMET R8 R0 K9 + 0x7C200200, // 0030 CALL R8 1 + 0x50200200, // 0031 LDBOOL R8 1 0 + 0x80041000, // 0032 RET 1 R8 + 0x80000000, // 0033 RET 0 }) ) ); @@ -146,152 +108,68 @@ be_local_closure(Matter_Plugin_Light0_read_attribute, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[15]) { /* constants */ + ( &(const bvalue[12]) { /* constants */ /* K0 */ be_nested_str_weak(string), /* K1 */ be_nested_str_weak(matter), /* K2 */ be_nested_str_weak(TLV), /* K3 */ be_nested_str_weak(cluster), /* K4 */ be_nested_str_weak(attribute), - /* K5 */ be_const_int(3), + /* K5 */ be_nested_str_weak(update_shadow_lazy), /* K6 */ be_const_int(0), /* K7 */ be_nested_str_weak(create_TLV), - /* K8 */ be_nested_str_weak(U2), - /* K9 */ be_const_int(1), - /* K10 */ be_nested_str_weak(U1), - /* K11 */ be_nested_str_weak(U4), - /* K12 */ be_nested_str_weak(BOOL), - /* K13 */ be_nested_str_weak(shadow_onoff), - /* K14 */ be_nested_str_weak(read_attribute), + /* K8 */ be_nested_str_weak(BOOL), + /* K9 */ be_nested_str_weak(shadow_onoff), + /* K10 */ be_nested_str_weak(U4), + /* K11 */ be_nested_str_weak(read_attribute), }), be_str_weak(read_attribute), &be_const_str_solidified, - ( &(const binstruction[126]) { /* code */ + ( &(const binstruction[45]) { /* code */ 0xA40E0000, // 0000 IMPORT R3 K0 0xB8120200, // 0001 GETNGBL R4 K1 0x88100902, // 0002 GETMBR R4 R4 K2 0x88140503, // 0003 GETMBR R5 R2 K3 0x88180504, // 0004 GETMBR R6 R2 K4 - 0x1C1C0B05, // 0005 EQ R7 R5 K5 - 0x781E0021, // 0006 JMPF R7 #0029 - 0x1C1C0D06, // 0007 EQ R7 R6 K6 - 0x781E0005, // 0008 JMPF R7 #000F - 0x8C1C0907, // 0009 GETMET R7 R4 K7 - 0x88240908, // 000A GETMBR R9 R4 K8 - 0x58280006, // 000B LDCONST R10 K6 - 0x7C1C0600, // 000C CALL R7 3 - 0x80040E00, // 000D RET 1 R7 - 0x70020018, // 000E JMP #0028 - 0x1C1C0D09, // 000F EQ R7 R6 K9 - 0x781E0005, // 0010 JMPF R7 #0017 - 0x8C1C0907, // 0011 GETMET R7 R4 K7 - 0x8824090A, // 0012 GETMBR R9 R4 K10 - 0x58280006, // 0013 LDCONST R10 K6 - 0x7C1C0600, // 0014 CALL R7 3 - 0x80040E00, // 0015 RET 1 R7 - 0x70020010, // 0016 JMP #0028 - 0x541EFFFB, // 0017 LDINT R7 65532 - 0x1C1C0C07, // 0018 EQ R7 R6 R7 - 0x781E0005, // 0019 JMPF R7 #0020 - 0x8C1C0907, // 001A GETMET R7 R4 K7 - 0x8824090B, // 001B GETMBR R9 R4 K11 - 0x58280006, // 001C LDCONST R10 K6 - 0x7C1C0600, // 001D CALL R7 3 - 0x80040E00, // 001E RET 1 R7 - 0x70020007, // 001F JMP #0028 - 0x541EFFFC, // 0020 LDINT R7 65533 - 0x1C1C0C07, // 0021 EQ R7 R6 R7 - 0x781E0004, // 0022 JMPF R7 #0028 - 0x8C1C0907, // 0023 GETMET R7 R4 K7 - 0x8824090B, // 0024 GETMBR R9 R4 K11 - 0x542A0003, // 0025 LDINT R10 4 - 0x7C1C0600, // 0026 CALL R7 3 - 0x80040E00, // 0027 RET 1 R7 - 0x70020053, // 0028 JMP #007D - 0x541E0003, // 0029 LDINT R7 4 - 0x1C1C0A07, // 002A EQ R7 R5 R7 - 0x781E0016, // 002B JMPF R7 #0043 - 0x1C1C0D06, // 002C EQ R7 R6 K6 - 0x781E0002, // 002D JMPF R7 #0031 - 0x4C1C0000, // 002E LDNIL R7 - 0x80040E00, // 002F RET 1 R7 - 0x70020010, // 0030 JMP #0042 - 0x541EFFFB, // 0031 LDINT R7 65532 - 0x1C1C0C07, // 0032 EQ R7 R6 R7 - 0x781E0005, // 0033 JMPF R7 #003A - 0x8C1C0907, // 0034 GETMET R7 R4 K7 - 0x8824090B, // 0035 GETMBR R9 R4 K11 - 0x58280006, // 0036 LDCONST R10 K6 - 0x7C1C0600, // 0037 CALL R7 3 - 0x80040E00, // 0038 RET 1 R7 - 0x70020007, // 0039 JMP #0042 - 0x541EFFFC, // 003A LDINT R7 65533 - 0x1C1C0C07, // 003B EQ R7 R6 R7 - 0x781E0004, // 003C JMPF R7 #0042 - 0x8C1C0907, // 003D GETMET R7 R4 K7 - 0x8824090B, // 003E GETMBR R9 R4 K11 - 0x542A0003, // 003F LDINT R10 4 - 0x7C1C0600, // 0040 CALL R7 3 - 0x80040E00, // 0041 RET 1 R7 - 0x70020039, // 0042 JMP #007D - 0x541E0004, // 0043 LDINT R7 5 - 0x1C1C0A07, // 0044 EQ R7 R5 R7 - 0x781E0011, // 0045 JMPF R7 #0058 - 0x541EFFFB, // 0046 LDINT R7 65532 - 0x1C1C0C07, // 0047 EQ R7 R6 R7 - 0x781E0005, // 0048 JMPF R7 #004F - 0x8C1C0907, // 0049 GETMET R7 R4 K7 - 0x8824090B, // 004A GETMBR R9 R4 K11 - 0x58280006, // 004B LDCONST R10 K6 - 0x7C1C0600, // 004C CALL R7 3 - 0x80040E00, // 004D RET 1 R7 - 0x70020007, // 004E JMP #0057 - 0x541EFFFC, // 004F LDINT R7 65533 - 0x1C1C0C07, // 0050 EQ R7 R6 R7 - 0x781E0004, // 0051 JMPF R7 #0057 - 0x8C1C0907, // 0052 GETMET R7 R4 K7 - 0x8824090B, // 0053 GETMBR R9 R4 K11 - 0x542A0003, // 0054 LDINT R10 4 - 0x7C1C0600, // 0055 CALL R7 3 - 0x80040E00, // 0056 RET 1 R7 - 0x70020024, // 0057 JMP #007D - 0x541E0005, // 0058 LDINT R7 6 - 0x1C1C0A07, // 0059 EQ R7 R5 R7 - 0x781E0019, // 005A JMPF R7 #0075 - 0x1C1C0D06, // 005B EQ R7 R6 K6 - 0x781E0005, // 005C JMPF R7 #0063 - 0x8C1C0907, // 005D GETMET R7 R4 K7 - 0x8824090C, // 005E GETMBR R9 R4 K12 - 0x8828010D, // 005F GETMBR R10 R0 K13 - 0x7C1C0600, // 0060 CALL R7 3 - 0x80040E00, // 0061 RET 1 R7 - 0x70020010, // 0062 JMP #0074 - 0x541EFFFB, // 0063 LDINT R7 65532 - 0x1C1C0C07, // 0064 EQ R7 R6 R7 - 0x781E0005, // 0065 JMPF R7 #006C - 0x8C1C0907, // 0066 GETMET R7 R4 K7 - 0x8824090B, // 0067 GETMBR R9 R4 K11 - 0x58280006, // 0068 LDCONST R10 K6 - 0x7C1C0600, // 0069 CALL R7 3 - 0x80040E00, // 006A RET 1 R7 - 0x70020007, // 006B JMP #0074 - 0x541EFFFC, // 006C LDINT R7 65533 - 0x1C1C0C07, // 006D EQ R7 R6 R7 - 0x781E0004, // 006E JMPF R7 #0074 - 0x8C1C0907, // 006F GETMET R7 R4 K7 - 0x8824090B, // 0070 GETMBR R9 R4 K11 - 0x542A0003, // 0071 LDINT R10 4 - 0x7C1C0600, // 0072 CALL R7 3 - 0x80040E00, // 0073 RET 1 R7 - 0x70020007, // 0074 JMP #007D - 0x601C0003, // 0075 GETGBL R7 G3 - 0x5C200000, // 0076 MOVE R8 R0 - 0x7C1C0200, // 0077 CALL R7 1 - 0x8C1C0F0E, // 0078 GETMET R7 R7 K14 - 0x5C240200, // 0079 MOVE R9 R1 - 0x5C280400, // 007A MOVE R10 R2 - 0x7C1C0600, // 007B CALL R7 3 - 0x80040E00, // 007C RET 1 R7 - 0x80000000, // 007D RET 0 + 0x541E0005, // 0005 LDINT R7 6 + 0x1C1C0A07, // 0006 EQ R7 R5 R7 + 0x781E001B, // 0007 JMPF R7 #0024 + 0x8C1C0105, // 0008 GETMET R7 R0 K5 + 0x7C1C0200, // 0009 CALL R7 1 + 0x1C1C0D06, // 000A EQ R7 R6 K6 + 0x781E0005, // 000B JMPF R7 #0012 + 0x8C1C0907, // 000C GETMET R7 R4 K7 + 0x88240908, // 000D GETMBR R9 R4 K8 + 0x88280109, // 000E GETMBR R10 R0 K9 + 0x7C1C0600, // 000F CALL R7 3 + 0x80040E00, // 0010 RET 1 R7 + 0x70020010, // 0011 JMP #0023 + 0x541EFFFB, // 0012 LDINT R7 65532 + 0x1C1C0C07, // 0013 EQ R7 R6 R7 + 0x781E0005, // 0014 JMPF R7 #001B + 0x8C1C0907, // 0015 GETMET R7 R4 K7 + 0x8824090A, // 0016 GETMBR R9 R4 K10 + 0x58280006, // 0017 LDCONST R10 K6 + 0x7C1C0600, // 0018 CALL R7 3 + 0x80040E00, // 0019 RET 1 R7 + 0x70020007, // 001A JMP #0023 + 0x541EFFFC, // 001B LDINT R7 65533 + 0x1C1C0C07, // 001C EQ R7 R6 R7 + 0x781E0004, // 001D JMPF R7 #0023 + 0x8C1C0907, // 001E GETMET R7 R4 K7 + 0x8824090A, // 001F GETMBR R9 R4 K10 + 0x542A0003, // 0020 LDINT R10 4 + 0x7C1C0600, // 0021 CALL R7 3 + 0x80040E00, // 0022 RET 1 R7 + 0x70020007, // 0023 JMP #002C + 0x601C0003, // 0024 GETGBL R7 G3 + 0x5C200000, // 0025 MOVE R8 R0 + 0x7C1C0200, // 0026 CALL R7 1 + 0x8C1C0F0B, // 0027 GETMET R7 R7 K11 + 0x5C240200, // 0028 MOVE R9 R1 + 0x5C280400, // 0029 MOVE R10 R2 + 0x7C1C0600, // 002A CALL R7 3 + 0x80040E00, // 002B RET 1 R7 + 0x80000000, // 002C RET 0 }) ) ); @@ -303,7 +181,7 @@ be_local_closure(Matter_Plugin_Light0_read_attribute, /* name */ ********************************************************************/ be_local_closure(Matter_Plugin_Light0_update_shadow, /* name */ be_nested_proto( - 9, /* nstack */ + 8, /* nstack */ 1, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -311,7 +189,7 @@ be_local_closure(Matter_Plugin_Light0_update_shadow, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[ 7]) { /* constants */ + ( &(const bvalue[ 8]) { /* constants */ /* K0 */ be_nested_str_weak(light), /* K1 */ be_nested_str_weak(get), /* K2 */ be_nested_str_weak(find), @@ -319,10 +197,11 @@ be_local_closure(Matter_Plugin_Light0_update_shadow, /* name */ /* K4 */ be_nested_str_weak(shadow_onoff), /* K5 */ be_nested_str_weak(attribute_updated), /* K6 */ be_const_int(0), + /* K7 */ be_nested_str_weak(update_shadow), }), be_str_weak(update_shadow), &be_const_str_solidified, - ( &(const binstruction[17]) { /* code */ + ( &(const binstruction[21]) { /* code */ 0xA4060000, // 0000 IMPORT R1 K0 0x8C080301, // 0001 GETMET R2 R1 K1 0x7C080200, // 0002 CALL R2 1 @@ -332,14 +211,18 @@ be_local_closure(Matter_Plugin_Light0_update_shadow, /* name */ 0x7C0C0600, // 0006 CALL R3 3 0x88100104, // 0007 GETMBR R4 R0 K4 0x20100604, // 0008 NE R4 R3 R4 - 0x78120005, // 0009 JMPF R4 #0010 + 0x78120004, // 0009 JMPF R4 #000F 0x8C100105, // 000A GETMET R4 R0 K5 - 0x4C180000, // 000B LDNIL R6 - 0x541E0005, // 000C LDINT R7 6 - 0x58200006, // 000D LDCONST R8 K6 - 0x7C100800, // 000E CALL R4 4 - 0x90020803, // 000F SETMBR R0 K4 R3 - 0x80000000, // 0010 RET 0 + 0x541A0005, // 000B LDINT R6 6 + 0x581C0006, // 000C LDCONST R7 K6 + 0x7C100600, // 000D CALL R4 3 + 0x90020803, // 000E SETMBR R0 K4 R3 + 0x60100003, // 000F GETGBL R4 G3 + 0x5C140000, // 0010 MOVE R5 R0 + 0x7C100200, // 0011 CALL R4 1 + 0x8C100907, // 0012 GETMET R4 R4 K7 + 0x7C100200, // 0013 CALL R4 1 + 0x80000000, // 0014 RET 0 }) ) ); @@ -386,10 +269,10 @@ be_local_closure(Matter_Plugin_Light0_init, /* name */ /******************************************************************** ** Solidified class: Matter_Plugin_Light0 ********************************************************************/ -extern const bclass be_class_Matter_Plugin; +extern const bclass be_class_Matter_Plugin_Device; be_local_class(Matter_Plugin_Light0, 1, - &be_class_Matter_Plugin, + &be_class_Matter_Plugin_Device, be_nested_map(9, ( (struct bmapnode*) &(const bmapnode[]) { { be_const_key_weak(init, -1), be_const_closure(Matter_Plugin_Light0_init_closure) }, @@ -401,41 +284,14 @@ be_local_class(Matter_Plugin_Light0, })) ) } )) }, { be_const_key_weak(NAME, -1), be_nested_str_weak(Light_X200_X20On) }, { be_const_key_weak(CLUSTERS, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { - be_const_map( * be_nested_map(4, + be_const_map( * be_nested_map(1, ( (struct bmapnode*) &(const bmapnode[]) { - { be_const_key_int(4, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_list, { - be_const_list( * be_nested_list(3, - ( (struct bvalue*) &(const bvalue[]) { - be_const_int(0), - be_const_int(65532), - be_const_int(65533), - })) ) } )) }, - { be_const_key_int(5, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_list, { - be_const_list( * be_nested_list(8, - ( (struct bvalue*) &(const bvalue[]) { - be_const_int(0), - be_const_int(1), - be_const_int(2), - be_const_int(3), - be_const_int(4), - be_const_int(5), - be_const_int(65532), - be_const_int(65533), - })) ) } )) }, { be_const_key_int(6, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_list, { be_const_list( * be_nested_list(3, ( (struct bvalue*) &(const bvalue[]) { be_const_int(0), be_const_int(65532), be_const_int(65533), - })) ) } )) }, - { be_const_key_int(3, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_list, { - be_const_list( * be_nested_list(4, - ( (struct bvalue*) &(const bvalue[]) { - be_const_int(0), - be_const_int(1), - be_const_int(65532), - be_const_int(65533), })) ) } )) }, })) ) } )) }, { be_const_key_weak(invoke_request, -1), be_const_closure(Matter_Plugin_Light0_invoke_request_closure) }, diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Light1.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Light1.h index b0f2d5523..4fad7a876 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Light1.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Light1.h @@ -33,7 +33,7 @@ be_local_closure(Matter_Plugin_Light1_update_shadow, /* name */ }), be_str_weak(update_shadow), &be_const_str_solidified, - ( &(const binstruction[36]) { /* code */ + ( &(const binstruction[33]) { /* code */ 0xA4060000, // 0000 IMPORT R1 K0 0x8C080301, // 0001 GETMET R2 R1 K1 0x7C080200, // 0002 CALL R2 1 @@ -43,7 +43,7 @@ be_local_closure(Matter_Plugin_Light1_update_shadow, /* name */ 0x7C0C0600, // 0006 CALL R3 3 0x4C100000, // 0007 LDNIL R4 0x20100604, // 0008 NE R4 R3 R4 - 0x78120009, // 0009 JMPF R4 #0014 + 0x78120010, // 0009 JMPF R4 #001B 0xB8120800, // 000A GETNGBL R4 K4 0x8C100905, // 000B GETMET R4 R4 K5 0x5C180600, // 000C MOVE R6 R3 @@ -53,23 +53,20 @@ be_local_closure(Matter_Plugin_Light1_update_shadow, /* name */ 0x542A00FD, // 0010 LDINT R10 254 0x7C100C00, // 0011 CALL R4 6 0x5C0C0800, // 0012 MOVE R3 R4 - 0x70020000, // 0013 JMP #0015 - 0x880C0107, // 0014 GETMBR R3 R0 K7 - 0x88100107, // 0015 GETMBR R4 R0 K7 - 0x20100604, // 0016 NE R4 R3 R4 - 0x78120005, // 0017 JMPF R4 #001E - 0x8C100108, // 0018 GETMET R4 R0 K8 - 0x4C180000, // 0019 LDNIL R6 - 0x541E0007, // 001A LDINT R7 8 - 0x58200006, // 001B LDCONST R8 K6 - 0x7C100800, // 001C CALL R4 4 - 0x90020E03, // 001D SETMBR R0 K7 R3 - 0x60100003, // 001E GETGBL R4 G3 - 0x5C140000, // 001F MOVE R5 R0 - 0x7C100200, // 0020 CALL R4 1 - 0x8C100909, // 0021 GETMET R4 R4 K9 - 0x7C100200, // 0022 CALL R4 1 - 0x80000000, // 0023 RET 0 + 0x88100107, // 0013 GETMBR R4 R0 K7 + 0x20100604, // 0014 NE R4 R3 R4 + 0x78120004, // 0015 JMPF R4 #001B + 0x8C100108, // 0016 GETMET R4 R0 K8 + 0x541A0007, // 0017 LDINT R6 8 + 0x581C0006, // 0018 LDCONST R7 K6 + 0x7C100600, // 0019 CALL R4 3 + 0x90020E03, // 001A SETMBR R0 K7 R3 + 0x60100003, // 001B GETGBL R4 G3 + 0x5C140000, // 001C MOVE R5 R0 + 0x7C100200, // 001D CALL R4 1 + 0x8C100909, // 001E GETMET R4 R4 K9 + 0x7C100200, // 001F CALL R4 1 + 0x80000000, // 0020 RET 0 }) ) ); @@ -89,30 +86,31 @@ be_local_closure(Matter_Plugin_Light1_invoke_request, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[19]) { /* constants */ + ( &(const bvalue[20]) { /* constants */ /* K0 */ be_nested_str_weak(light), /* K1 */ be_nested_str_weak(matter), /* K2 */ be_nested_str_weak(TLV), /* K3 */ be_nested_str_weak(cluster), /* K4 */ be_nested_str_weak(command), - /* K5 */ be_const_int(0), - /* K6 */ be_nested_str_weak(findsubval), - /* K7 */ be_nested_str_weak(tasmota), - /* K8 */ be_nested_str_weak(scale_uint), - /* K9 */ be_nested_str_weak(set), - /* K10 */ be_nested_str_weak(bri), - /* K11 */ be_nested_str_weak(update_shadow), - /* K12 */ be_nested_str_weak(log), - /* K13 */ be_nested_str_weak(bri_X3A), - /* K14 */ be_const_int(1), - /* K15 */ be_const_int(2), - /* K16 */ be_const_int(3), - /* K17 */ be_nested_str_weak(power), - /* K18 */ be_nested_str_weak(invoke_request), + /* K5 */ be_nested_str_weak(update_shadow_lazy), + /* K6 */ be_const_int(0), + /* K7 */ be_nested_str_weak(findsubval), + /* K8 */ be_nested_str_weak(tasmota), + /* K9 */ be_nested_str_weak(scale_uint), + /* K10 */ be_nested_str_weak(set), + /* K11 */ be_nested_str_weak(bri), + /* K12 */ be_nested_str_weak(update_shadow), + /* K13 */ be_nested_str_weak(log), + /* K14 */ be_nested_str_weak(bri_X3A), + /* K15 */ be_const_int(1), + /* K16 */ be_const_int(2), + /* K17 */ be_const_int(3), + /* K18 */ be_nested_str_weak(power), + /* K19 */ be_nested_str_weak(invoke_request), }), be_str_weak(invoke_request), &be_const_str_solidified, - ( &(const binstruction[110]) { /* code */ + ( &(const binstruction[112]) { /* code */ 0xA4120000, // 0000 IMPORT R4 K0 0xB8160200, // 0001 GETNGBL R5 K1 0x88140B02, // 0002 GETMBR R5 R5 K2 @@ -120,109 +118,111 @@ be_local_closure(Matter_Plugin_Light1_invoke_request, /* name */ 0x881C0704, // 0004 GETMBR R7 R3 K4 0x54220007, // 0005 LDINT R8 8 0x1C200C08, // 0006 EQ R8 R6 R8 - 0x7822005B, // 0007 JMPF R8 #0064 - 0x1C200F05, // 0008 EQ R8 R7 K5 - 0x78220019, // 0009 JMPF R8 #0024 - 0x8C200506, // 000A GETMET R8 R2 K6 - 0x58280005, // 000B LDCONST R10 K5 - 0x7C200400, // 000C CALL R8 2 - 0xB8260E00, // 000D GETNGBL R9 K7 - 0x8C241308, // 000E GETMET R9 R9 K8 - 0x5C2C1000, // 000F MOVE R11 R8 - 0x58300005, // 0010 LDCONST R12 K5 - 0x543600FD, // 0011 LDINT R13 254 - 0x58380005, // 0012 LDCONST R14 K5 - 0x543E00FE, // 0013 LDINT R15 255 - 0x7C240C00, // 0014 CALL R9 6 - 0x8C280909, // 0015 GETMET R10 R4 K9 - 0x60300013, // 0016 GETGBL R12 G19 - 0x7C300000, // 0017 CALL R12 0 - 0x98321409, // 0018 SETIDX R12 K10 R9 - 0x7C280400, // 0019 CALL R10 2 - 0x8C28010B, // 001A GETMET R10 R0 K11 - 0x7C280200, // 001B CALL R10 1 - 0x60280008, // 001C GETGBL R10 G8 - 0x5C2C1000, // 001D MOVE R11 R8 - 0x7C280200, // 001E CALL R10 1 - 0x002A1A0A, // 001F ADD R10 K13 R10 - 0x900E180A, // 0020 SETMBR R3 K12 R10 - 0x50280200, // 0021 LDBOOL R10 1 0 - 0x80041400, // 0022 RET 1 R10 - 0x7002003E, // 0023 JMP #0063 - 0x1C200F0E, // 0024 EQ R8 R7 K14 - 0x78220002, // 0025 JMPF R8 #0029 - 0x50200200, // 0026 LDBOOL R8 1 0 - 0x80041000, // 0027 RET 1 R8 - 0x70020039, // 0028 JMP #0063 - 0x1C200F0F, // 0029 EQ R8 R7 K15 - 0x78220002, // 002A JMPF R8 #002E - 0x50200200, // 002B LDBOOL R8 1 0 - 0x80041000, // 002C RET 1 R8 - 0x70020034, // 002D JMP #0063 - 0x1C200F10, // 002E EQ R8 R7 K16 - 0x78220002, // 002F JMPF R8 #0033 - 0x50200200, // 0030 LDBOOL R8 1 0 - 0x80041000, // 0031 RET 1 R8 - 0x7002002F, // 0032 JMP #0063 - 0x54220003, // 0033 LDINT R8 4 - 0x1C200E08, // 0034 EQ R8 R7 R8 - 0x7822001B, // 0035 JMPF R8 #0052 - 0x8C200506, // 0036 GETMET R8 R2 K6 - 0x58280005, // 0037 LDCONST R10 K5 - 0x7C200400, // 0038 CALL R8 2 - 0xB8260E00, // 0039 GETNGBL R9 K7 - 0x8C241308, // 003A GETMET R9 R9 K8 - 0x5C2C1000, // 003B MOVE R11 R8 - 0x58300005, // 003C LDCONST R12 K5 - 0x543600FD, // 003D LDINT R13 254 - 0x58380005, // 003E LDCONST R14 K5 - 0x543E00FE, // 003F LDINT R15 255 - 0x7C240C00, // 0040 CALL R9 6 - 0x24281305, // 0041 GT R10 R9 K5 - 0x8C2C0909, // 0042 GETMET R11 R4 K9 - 0x60340013, // 0043 GETGBL R13 G19 - 0x7C340000, // 0044 CALL R13 0 - 0x98361409, // 0045 SETIDX R13 K10 R9 - 0x9836220A, // 0046 SETIDX R13 K17 R10 - 0x7C2C0400, // 0047 CALL R11 2 - 0x8C2C010B, // 0048 GETMET R11 R0 K11 - 0x7C2C0200, // 0049 CALL R11 1 - 0x602C0008, // 004A GETGBL R11 G8 - 0x5C301000, // 004B MOVE R12 R8 - 0x7C2C0200, // 004C CALL R11 1 - 0x002E1A0B, // 004D ADD R11 K13 R11 - 0x900E180B, // 004E SETMBR R3 K12 R11 - 0x502C0200, // 004F LDBOOL R11 1 0 - 0x80041600, // 0050 RET 1 R11 - 0x70020010, // 0051 JMP #0063 - 0x54220004, // 0052 LDINT R8 5 - 0x1C200E08, // 0053 EQ R8 R7 R8 - 0x78220002, // 0054 JMPF R8 #0058 - 0x50200200, // 0055 LDBOOL R8 1 0 - 0x80041000, // 0056 RET 1 R8 - 0x7002000A, // 0057 JMP #0063 - 0x54220005, // 0058 LDINT R8 6 - 0x1C200E08, // 0059 EQ R8 R7 R8 - 0x78220002, // 005A JMPF R8 #005E - 0x50200200, // 005B LDBOOL R8 1 0 - 0x80041000, // 005C RET 1 R8 - 0x70020004, // 005D JMP #0063 - 0x54220006, // 005E LDINT R8 7 - 0x1C200E08, // 005F EQ R8 R7 R8 - 0x78220001, // 0060 JMPF R8 #0063 - 0x50200200, // 0061 LDBOOL R8 1 0 - 0x80041000, // 0062 RET 1 R8 - 0x70020008, // 0063 JMP #006D - 0x60200003, // 0064 GETGBL R8 G3 - 0x5C240000, // 0065 MOVE R9 R0 - 0x7C200200, // 0066 CALL R8 1 - 0x8C201112, // 0067 GETMET R8 R8 K18 - 0x5C280200, // 0068 MOVE R10 R1 - 0x5C2C0400, // 0069 MOVE R11 R2 - 0x5C300600, // 006A MOVE R12 R3 - 0x7C200800, // 006B CALL R8 4 - 0x80041000, // 006C RET 1 R8 - 0x80000000, // 006D RET 0 + 0x7822005D, // 0007 JMPF R8 #0066 + 0x8C200105, // 0008 GETMET R8 R0 K5 + 0x7C200200, // 0009 CALL R8 1 + 0x1C200F06, // 000A EQ R8 R7 K6 + 0x78220019, // 000B JMPF R8 #0026 + 0x8C200507, // 000C GETMET R8 R2 K7 + 0x58280006, // 000D LDCONST R10 K6 + 0x7C200400, // 000E CALL R8 2 + 0xB8261000, // 000F GETNGBL R9 K8 + 0x8C241309, // 0010 GETMET R9 R9 K9 + 0x5C2C1000, // 0011 MOVE R11 R8 + 0x58300006, // 0012 LDCONST R12 K6 + 0x543600FD, // 0013 LDINT R13 254 + 0x58380006, // 0014 LDCONST R14 K6 + 0x543E00FE, // 0015 LDINT R15 255 + 0x7C240C00, // 0016 CALL R9 6 + 0x8C28090A, // 0017 GETMET R10 R4 K10 + 0x60300013, // 0018 GETGBL R12 G19 + 0x7C300000, // 0019 CALL R12 0 + 0x98321609, // 001A SETIDX R12 K11 R9 + 0x7C280400, // 001B CALL R10 2 + 0x8C28010C, // 001C GETMET R10 R0 K12 + 0x7C280200, // 001D CALL R10 1 + 0x60280008, // 001E GETGBL R10 G8 + 0x5C2C1000, // 001F MOVE R11 R8 + 0x7C280200, // 0020 CALL R10 1 + 0x002A1C0A, // 0021 ADD R10 K14 R10 + 0x900E1A0A, // 0022 SETMBR R3 K13 R10 + 0x50280200, // 0023 LDBOOL R10 1 0 + 0x80041400, // 0024 RET 1 R10 + 0x7002003E, // 0025 JMP #0065 + 0x1C200F0F, // 0026 EQ R8 R7 K15 + 0x78220002, // 0027 JMPF R8 #002B + 0x50200200, // 0028 LDBOOL R8 1 0 + 0x80041000, // 0029 RET 1 R8 + 0x70020039, // 002A JMP #0065 + 0x1C200F10, // 002B EQ R8 R7 K16 + 0x78220002, // 002C JMPF R8 #0030 + 0x50200200, // 002D LDBOOL R8 1 0 + 0x80041000, // 002E RET 1 R8 + 0x70020034, // 002F JMP #0065 + 0x1C200F11, // 0030 EQ R8 R7 K17 + 0x78220002, // 0031 JMPF R8 #0035 + 0x50200200, // 0032 LDBOOL R8 1 0 + 0x80041000, // 0033 RET 1 R8 + 0x7002002F, // 0034 JMP #0065 + 0x54220003, // 0035 LDINT R8 4 + 0x1C200E08, // 0036 EQ R8 R7 R8 + 0x7822001B, // 0037 JMPF R8 #0054 + 0x8C200507, // 0038 GETMET R8 R2 K7 + 0x58280006, // 0039 LDCONST R10 K6 + 0x7C200400, // 003A CALL R8 2 + 0xB8261000, // 003B GETNGBL R9 K8 + 0x8C241309, // 003C GETMET R9 R9 K9 + 0x5C2C1000, // 003D MOVE R11 R8 + 0x58300006, // 003E LDCONST R12 K6 + 0x543600FD, // 003F LDINT R13 254 + 0x58380006, // 0040 LDCONST R14 K6 + 0x543E00FE, // 0041 LDINT R15 255 + 0x7C240C00, // 0042 CALL R9 6 + 0x24281306, // 0043 GT R10 R9 K6 + 0x8C2C090A, // 0044 GETMET R11 R4 K10 + 0x60340013, // 0045 GETGBL R13 G19 + 0x7C340000, // 0046 CALL R13 0 + 0x98361609, // 0047 SETIDX R13 K11 R9 + 0x9836240A, // 0048 SETIDX R13 K18 R10 + 0x7C2C0400, // 0049 CALL R11 2 + 0x8C2C010C, // 004A GETMET R11 R0 K12 + 0x7C2C0200, // 004B CALL R11 1 + 0x602C0008, // 004C GETGBL R11 G8 + 0x5C301000, // 004D MOVE R12 R8 + 0x7C2C0200, // 004E CALL R11 1 + 0x002E1C0B, // 004F ADD R11 K14 R11 + 0x900E1A0B, // 0050 SETMBR R3 K13 R11 + 0x502C0200, // 0051 LDBOOL R11 1 0 + 0x80041600, // 0052 RET 1 R11 + 0x70020010, // 0053 JMP #0065 + 0x54220004, // 0054 LDINT R8 5 + 0x1C200E08, // 0055 EQ R8 R7 R8 + 0x78220002, // 0056 JMPF R8 #005A + 0x50200200, // 0057 LDBOOL R8 1 0 + 0x80041000, // 0058 RET 1 R8 + 0x7002000A, // 0059 JMP #0065 + 0x54220005, // 005A LDINT R8 6 + 0x1C200E08, // 005B EQ R8 R7 R8 + 0x78220002, // 005C JMPF R8 #0060 + 0x50200200, // 005D LDBOOL R8 1 0 + 0x80041000, // 005E RET 1 R8 + 0x70020004, // 005F JMP #0065 + 0x54220006, // 0060 LDINT R8 7 + 0x1C200E08, // 0061 EQ R8 R7 R8 + 0x78220001, // 0062 JMPF R8 #0065 + 0x50200200, // 0063 LDBOOL R8 1 0 + 0x80041000, // 0064 RET 1 R8 + 0x70020008, // 0065 JMP #006F + 0x60200003, // 0066 GETGBL R8 G3 + 0x5C240000, // 0067 MOVE R9 R0 + 0x7C200200, // 0068 CALL R8 1 + 0x8C201113, // 0069 GETMET R8 R8 K19 + 0x5C280200, // 006A MOVE R10 R1 + 0x5C2C0400, // 006B MOVE R11 R2 + 0x5C300600, // 006C MOVE R12 R3 + 0x7C200800, // 006D CALL R8 4 + 0x80041000, // 006E RET 1 R8 + 0x80000000, // 006F RET 0 }) ) ); @@ -242,25 +242,26 @@ be_local_closure(Matter_Plugin_Light1_read_attribute, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[14]) { /* constants */ + ( &(const bvalue[15]) { /* constants */ /* K0 */ be_nested_str_weak(string), /* K1 */ be_nested_str_weak(matter), /* K2 */ be_nested_str_weak(TLV), /* K3 */ be_nested_str_weak(cluster), /* K4 */ be_nested_str_weak(attribute), - /* K5 */ be_const_int(0), - /* K6 */ be_nested_str_weak(create_TLV), - /* K7 */ be_nested_str_weak(U1), - /* K8 */ be_nested_str_weak(shadow_bri), - /* K9 */ be_const_int(2), - /* K10 */ be_const_int(3), - /* K11 */ be_nested_str_weak(U4), - /* K12 */ be_const_int(1), - /* K13 */ be_nested_str_weak(read_attribute), + /* K5 */ be_nested_str_weak(update_shadow_lazy), + /* K6 */ be_const_int(0), + /* K7 */ be_nested_str_weak(create_TLV), + /* K8 */ be_nested_str_weak(U1), + /* K9 */ be_nested_str_weak(shadow_bri), + /* K10 */ be_const_int(2), + /* K11 */ be_const_int(3), + /* K12 */ be_nested_str_weak(U4), + /* K13 */ be_const_int(1), + /* K14 */ be_nested_str_weak(read_attribute), }), be_str_weak(read_attribute), &be_const_str_solidified, - ( &(const binstruction[77]) { /* code */ + ( &(const binstruction[79]) { /* code */ 0xA40E0000, // 0000 IMPORT R3 K0 0xB8120200, // 0001 GETNGBL R4 K1 0x88100902, // 0002 GETMBR R4 R4 K2 @@ -268,76 +269,78 @@ be_local_closure(Matter_Plugin_Light1_read_attribute, /* name */ 0x88180504, // 0004 GETMBR R6 R2 K4 0x541E0007, // 0005 LDINT R7 8 0x1C1C0A07, // 0006 EQ R7 R5 R7 - 0x781E003B, // 0007 JMPF R7 #0044 - 0x1C1C0D05, // 0008 EQ R7 R6 K5 - 0x781E0005, // 0009 JMPF R7 #0010 - 0x8C1C0906, // 000A GETMET R7 R4 K6 - 0x88240907, // 000B GETMBR R9 R4 K7 - 0x88280108, // 000C GETMBR R10 R0 K8 - 0x7C1C0600, // 000D CALL R7 3 - 0x80040E00, // 000E RET 1 R7 - 0x70020032, // 000F JMP #0043 - 0x1C1C0D09, // 0010 EQ R7 R6 K9 - 0x781E0005, // 0011 JMPF R7 #0018 - 0x8C1C0906, // 0012 GETMET R7 R4 K6 - 0x88240907, // 0013 GETMBR R9 R4 K7 - 0x58280005, // 0014 LDCONST R10 K5 - 0x7C1C0600, // 0015 CALL R7 3 - 0x80040E00, // 0016 RET 1 R7 - 0x7002002A, // 0017 JMP #0043 - 0x1C1C0D0A, // 0018 EQ R7 R6 K10 - 0x781E0005, // 0019 JMPF R7 #0020 - 0x8C1C0906, // 001A GETMET R7 R4 K6 - 0x88240907, // 001B GETMBR R9 R4 K7 - 0x542A00FD, // 001C LDINT R10 254 - 0x7C1C0600, // 001D CALL R7 3 - 0x80040E00, // 001E RET 1 R7 - 0x70020022, // 001F JMP #0043 - 0x541E000E, // 0020 LDINT R7 15 - 0x1C1C0C07, // 0021 EQ R7 R6 R7 - 0x781E0005, // 0022 JMPF R7 #0029 - 0x8C1C0906, // 0023 GETMET R7 R4 K6 - 0x88240907, // 0024 GETMBR R9 R4 K7 - 0x58280005, // 0025 LDCONST R10 K5 - 0x7C1C0600, // 0026 CALL R7 3 - 0x80040E00, // 0027 RET 1 R7 - 0x70020019, // 0028 JMP #0043 - 0x541E0010, // 0029 LDINT R7 17 - 0x1C1C0C07, // 002A EQ R7 R6 R7 - 0x781E0005, // 002B JMPF R7 #0032 - 0x8C1C0906, // 002C GETMET R7 R4 K6 - 0x88240907, // 002D GETMBR R9 R4 K7 - 0x88280108, // 002E GETMBR R10 R0 K8 - 0x7C1C0600, // 002F CALL R7 3 - 0x80040E00, // 0030 RET 1 R7 - 0x70020010, // 0031 JMP #0043 - 0x541EFFFB, // 0032 LDINT R7 65532 - 0x1C1C0C07, // 0033 EQ R7 R6 R7 - 0x781E0005, // 0034 JMPF R7 #003B - 0x8C1C0906, // 0035 GETMET R7 R4 K6 - 0x8824090B, // 0036 GETMBR R9 R4 K11 - 0x5828000C, // 0037 LDCONST R10 K12 - 0x7C1C0600, // 0038 CALL R7 3 - 0x80040E00, // 0039 RET 1 R7 - 0x70020007, // 003A JMP #0043 - 0x541EFFFC, // 003B LDINT R7 65533 - 0x1C1C0C07, // 003C EQ R7 R6 R7 - 0x781E0004, // 003D JMPF R7 #0043 - 0x8C1C0906, // 003E GETMET R7 R4 K6 - 0x8824090B, // 003F GETMBR R9 R4 K11 - 0x542A0004, // 0040 LDINT R10 5 - 0x7C1C0600, // 0041 CALL R7 3 - 0x80040E00, // 0042 RET 1 R7 - 0x70020007, // 0043 JMP #004C - 0x601C0003, // 0044 GETGBL R7 G3 - 0x5C200000, // 0045 MOVE R8 R0 - 0x7C1C0200, // 0046 CALL R7 1 - 0x8C1C0F0D, // 0047 GETMET R7 R7 K13 - 0x5C240200, // 0048 MOVE R9 R1 - 0x5C280400, // 0049 MOVE R10 R2 - 0x7C1C0600, // 004A CALL R7 3 - 0x80040E00, // 004B RET 1 R7 - 0x80000000, // 004C RET 0 + 0x781E003D, // 0007 JMPF R7 #0046 + 0x8C1C0105, // 0008 GETMET R7 R0 K5 + 0x7C1C0200, // 0009 CALL R7 1 + 0x1C1C0D06, // 000A EQ R7 R6 K6 + 0x781E0005, // 000B JMPF R7 #0012 + 0x8C1C0907, // 000C GETMET R7 R4 K7 + 0x88240908, // 000D GETMBR R9 R4 K8 + 0x88280109, // 000E GETMBR R10 R0 K9 + 0x7C1C0600, // 000F CALL R7 3 + 0x80040E00, // 0010 RET 1 R7 + 0x70020032, // 0011 JMP #0045 + 0x1C1C0D0A, // 0012 EQ R7 R6 K10 + 0x781E0005, // 0013 JMPF R7 #001A + 0x8C1C0907, // 0014 GETMET R7 R4 K7 + 0x88240908, // 0015 GETMBR R9 R4 K8 + 0x58280006, // 0016 LDCONST R10 K6 + 0x7C1C0600, // 0017 CALL R7 3 + 0x80040E00, // 0018 RET 1 R7 + 0x7002002A, // 0019 JMP #0045 + 0x1C1C0D0B, // 001A EQ R7 R6 K11 + 0x781E0005, // 001B JMPF R7 #0022 + 0x8C1C0907, // 001C GETMET R7 R4 K7 + 0x88240908, // 001D GETMBR R9 R4 K8 + 0x542A00FD, // 001E LDINT R10 254 + 0x7C1C0600, // 001F CALL R7 3 + 0x80040E00, // 0020 RET 1 R7 + 0x70020022, // 0021 JMP #0045 + 0x541E000E, // 0022 LDINT R7 15 + 0x1C1C0C07, // 0023 EQ R7 R6 R7 + 0x781E0005, // 0024 JMPF R7 #002B + 0x8C1C0907, // 0025 GETMET R7 R4 K7 + 0x88240908, // 0026 GETMBR R9 R4 K8 + 0x58280006, // 0027 LDCONST R10 K6 + 0x7C1C0600, // 0028 CALL R7 3 + 0x80040E00, // 0029 RET 1 R7 + 0x70020019, // 002A JMP #0045 + 0x541E0010, // 002B LDINT R7 17 + 0x1C1C0C07, // 002C EQ R7 R6 R7 + 0x781E0005, // 002D JMPF R7 #0034 + 0x8C1C0907, // 002E GETMET R7 R4 K7 + 0x88240908, // 002F GETMBR R9 R4 K8 + 0x88280109, // 0030 GETMBR R10 R0 K9 + 0x7C1C0600, // 0031 CALL R7 3 + 0x80040E00, // 0032 RET 1 R7 + 0x70020010, // 0033 JMP #0045 + 0x541EFFFB, // 0034 LDINT R7 65532 + 0x1C1C0C07, // 0035 EQ R7 R6 R7 + 0x781E0005, // 0036 JMPF R7 #003D + 0x8C1C0907, // 0037 GETMET R7 R4 K7 + 0x8824090C, // 0038 GETMBR R9 R4 K12 + 0x5828000D, // 0039 LDCONST R10 K13 + 0x7C1C0600, // 003A CALL R7 3 + 0x80040E00, // 003B RET 1 R7 + 0x70020007, // 003C JMP #0045 + 0x541EFFFC, // 003D LDINT R7 65533 + 0x1C1C0C07, // 003E EQ R7 R6 R7 + 0x781E0004, // 003F JMPF R7 #0045 + 0x8C1C0907, // 0040 GETMET R7 R4 K7 + 0x8824090C, // 0041 GETMBR R9 R4 K12 + 0x542A0004, // 0042 LDINT R10 5 + 0x7C1C0600, // 0043 CALL R7 3 + 0x80040E00, // 0044 RET 1 R7 + 0x70020007, // 0045 JMP #004E + 0x601C0003, // 0046 GETGBL R7 G3 + 0x5C200000, // 0047 MOVE R8 R0 + 0x7C1C0200, // 0048 CALL R7 1 + 0x8C1C0F0E, // 0049 GETMET R7 R7 K14 + 0x5C240200, // 004A MOVE R9 R1 + 0x5C280400, // 004B MOVE R10 R2 + 0x7C1C0600, // 004C CALL R7 3 + 0x80040E00, // 004D RET 1 R7 + 0x80000000, // 004E RET 0 }) ) ); diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Light2.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Light2.h index 0cce12e73..50328f5df 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Light2.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Light2.h @@ -19,25 +19,26 @@ be_local_closure(Matter_Plugin_Light2_read_attribute, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[14]) { /* constants */ + ( &(const bvalue[15]) { /* constants */ /* K0 */ be_nested_str_weak(string), /* K1 */ be_nested_str_weak(matter), /* K2 */ be_nested_str_weak(TLV), /* K3 */ be_nested_str_weak(cluster), /* K4 */ be_nested_str_weak(attribute), - /* K5 */ be_nested_str_weak(create_TLV), - /* K6 */ be_nested_str_weak(U1), - /* K7 */ be_nested_str_weak(shadow_ct), - /* K8 */ be_const_int(2), - /* K9 */ be_const_int(0), - /* K10 */ be_nested_str_weak(ct_min), - /* K11 */ be_nested_str_weak(ct_max), - /* K12 */ be_nested_str_weak(U4), - /* K13 */ be_nested_str_weak(read_attribute), + /* K5 */ be_nested_str_weak(update_shadow_lazy), + /* K6 */ be_nested_str_weak(create_TLV), + /* K7 */ be_nested_str_weak(U1), + /* K8 */ be_nested_str_weak(shadow_ct), + /* K9 */ be_const_int(2), + /* K10 */ be_const_int(0), + /* K11 */ be_nested_str_weak(ct_min), + /* K12 */ be_nested_str_weak(ct_max), + /* K13 */ be_nested_str_weak(U4), + /* K14 */ be_nested_str_weak(read_attribute), }), be_str_weak(read_attribute), &be_const_str_solidified, - ( &(const binstruction[80]) { /* code */ + ( &(const binstruction[82]) { /* code */ 0xA40E0000, // 0000 IMPORT R3 K0 0xB8120200, // 0001 GETNGBL R4 K1 0x88100902, // 0002 GETMBR R4 R4 K2 @@ -45,79 +46,81 @@ be_local_closure(Matter_Plugin_Light2_read_attribute, /* name */ 0x88180504, // 0004 GETMBR R6 R2 K4 0x541E02FF, // 0005 LDINT R7 768 0x1C1C0A07, // 0006 EQ R7 R5 R7 - 0x781E003E, // 0007 JMPF R7 #0047 - 0x541E0006, // 0008 LDINT R7 7 - 0x1C1C0C07, // 0009 EQ R7 R6 R7 - 0x781E0005, // 000A JMPF R7 #0011 - 0x8C1C0905, // 000B GETMET R7 R4 K5 - 0x88240906, // 000C GETMBR R9 R4 K6 - 0x88280107, // 000D GETMBR R10 R0 K7 - 0x7C1C0600, // 000E CALL R7 3 - 0x80040E00, // 000F RET 1 R7 - 0x70020034, // 0010 JMP #0046 - 0x541E0007, // 0011 LDINT R7 8 - 0x1C1C0C07, // 0012 EQ R7 R6 R7 - 0x781E0005, // 0013 JMPF R7 #001A - 0x8C1C0905, // 0014 GETMET R7 R4 K5 - 0x88240906, // 0015 GETMBR R9 R4 K6 - 0x58280008, // 0016 LDCONST R10 K8 - 0x7C1C0600, // 0017 CALL R7 3 - 0x80040E00, // 0018 RET 1 R7 - 0x7002002B, // 0019 JMP #0046 - 0x541E000E, // 001A LDINT R7 15 - 0x1C1C0C07, // 001B EQ R7 R6 R7 - 0x781E0005, // 001C JMPF R7 #0023 - 0x8C1C0905, // 001D GETMET R7 R4 K5 - 0x88240906, // 001E GETMBR R9 R4 K6 - 0x58280009, // 001F LDCONST R10 K9 - 0x7C1C0600, // 0020 CALL R7 3 - 0x80040E00, // 0021 RET 1 R7 - 0x70020022, // 0022 JMP #0046 - 0x541E400A, // 0023 LDINT R7 16395 - 0x1C1C0C07, // 0024 EQ R7 R6 R7 - 0x781E0005, // 0025 JMPF R7 #002C - 0x8C1C0905, // 0026 GETMET R7 R4 K5 - 0x88240906, // 0027 GETMBR R9 R4 K6 - 0x8828010A, // 0028 GETMBR R10 R0 K10 - 0x7C1C0600, // 0029 CALL R7 3 - 0x80040E00, // 002A RET 1 R7 - 0x70020019, // 002B JMP #0046 - 0x541E400B, // 002C LDINT R7 16396 - 0x1C1C0C07, // 002D EQ R7 R6 R7 - 0x781E0005, // 002E JMPF R7 #0035 - 0x8C1C0905, // 002F GETMET R7 R4 K5 - 0x88240906, // 0030 GETMBR R9 R4 K6 - 0x8828010B, // 0031 GETMBR R10 R0 K11 - 0x7C1C0600, // 0032 CALL R7 3 - 0x80040E00, // 0033 RET 1 R7 - 0x70020010, // 0034 JMP #0046 - 0x541EFFFB, // 0035 LDINT R7 65532 - 0x1C1C0C07, // 0036 EQ R7 R6 R7 - 0x781E0005, // 0037 JMPF R7 #003E - 0x8C1C0905, // 0038 GETMET R7 R4 K5 - 0x8824090C, // 0039 GETMBR R9 R4 K12 - 0x542A000F, // 003A LDINT R10 16 - 0x7C1C0600, // 003B CALL R7 3 - 0x80040E00, // 003C RET 1 R7 - 0x70020007, // 003D JMP #0046 - 0x541EFFFC, // 003E LDINT R7 65533 - 0x1C1C0C07, // 003F EQ R7 R6 R7 - 0x781E0004, // 0040 JMPF R7 #0046 - 0x8C1C0905, // 0041 GETMET R7 R4 K5 - 0x8824090C, // 0042 GETMBR R9 R4 K12 - 0x542A0004, // 0043 LDINT R10 5 - 0x7C1C0600, // 0044 CALL R7 3 - 0x80040E00, // 0045 RET 1 R7 - 0x70020007, // 0046 JMP #004F - 0x601C0003, // 0047 GETGBL R7 G3 - 0x5C200000, // 0048 MOVE R8 R0 - 0x7C1C0200, // 0049 CALL R7 1 - 0x8C1C0F0D, // 004A GETMET R7 R7 K13 - 0x5C240200, // 004B MOVE R9 R1 - 0x5C280400, // 004C MOVE R10 R2 - 0x7C1C0600, // 004D CALL R7 3 - 0x80040E00, // 004E RET 1 R7 - 0x80000000, // 004F RET 0 + 0x781E0040, // 0007 JMPF R7 #0049 + 0x8C1C0105, // 0008 GETMET R7 R0 K5 + 0x7C1C0200, // 0009 CALL R7 1 + 0x541E0006, // 000A LDINT R7 7 + 0x1C1C0C07, // 000B EQ R7 R6 R7 + 0x781E0005, // 000C JMPF R7 #0013 + 0x8C1C0906, // 000D GETMET R7 R4 K6 + 0x88240907, // 000E GETMBR R9 R4 K7 + 0x88280108, // 000F GETMBR R10 R0 K8 + 0x7C1C0600, // 0010 CALL R7 3 + 0x80040E00, // 0011 RET 1 R7 + 0x70020034, // 0012 JMP #0048 + 0x541E0007, // 0013 LDINT R7 8 + 0x1C1C0C07, // 0014 EQ R7 R6 R7 + 0x781E0005, // 0015 JMPF R7 #001C + 0x8C1C0906, // 0016 GETMET R7 R4 K6 + 0x88240907, // 0017 GETMBR R9 R4 K7 + 0x58280009, // 0018 LDCONST R10 K9 + 0x7C1C0600, // 0019 CALL R7 3 + 0x80040E00, // 001A RET 1 R7 + 0x7002002B, // 001B JMP #0048 + 0x541E000E, // 001C LDINT R7 15 + 0x1C1C0C07, // 001D EQ R7 R6 R7 + 0x781E0005, // 001E JMPF R7 #0025 + 0x8C1C0906, // 001F GETMET R7 R4 K6 + 0x88240907, // 0020 GETMBR R9 R4 K7 + 0x5828000A, // 0021 LDCONST R10 K10 + 0x7C1C0600, // 0022 CALL R7 3 + 0x80040E00, // 0023 RET 1 R7 + 0x70020022, // 0024 JMP #0048 + 0x541E400A, // 0025 LDINT R7 16395 + 0x1C1C0C07, // 0026 EQ R7 R6 R7 + 0x781E0005, // 0027 JMPF R7 #002E + 0x8C1C0906, // 0028 GETMET R7 R4 K6 + 0x88240907, // 0029 GETMBR R9 R4 K7 + 0x8828010B, // 002A GETMBR R10 R0 K11 + 0x7C1C0600, // 002B CALL R7 3 + 0x80040E00, // 002C RET 1 R7 + 0x70020019, // 002D JMP #0048 + 0x541E400B, // 002E LDINT R7 16396 + 0x1C1C0C07, // 002F EQ R7 R6 R7 + 0x781E0005, // 0030 JMPF R7 #0037 + 0x8C1C0906, // 0031 GETMET R7 R4 K6 + 0x88240907, // 0032 GETMBR R9 R4 K7 + 0x8828010C, // 0033 GETMBR R10 R0 K12 + 0x7C1C0600, // 0034 CALL R7 3 + 0x80040E00, // 0035 RET 1 R7 + 0x70020010, // 0036 JMP #0048 + 0x541EFFFB, // 0037 LDINT R7 65532 + 0x1C1C0C07, // 0038 EQ R7 R6 R7 + 0x781E0005, // 0039 JMPF R7 #0040 + 0x8C1C0906, // 003A GETMET R7 R4 K6 + 0x8824090D, // 003B GETMBR R9 R4 K13 + 0x542A000F, // 003C LDINT R10 16 + 0x7C1C0600, // 003D CALL R7 3 + 0x80040E00, // 003E RET 1 R7 + 0x70020007, // 003F JMP #0048 + 0x541EFFFC, // 0040 LDINT R7 65533 + 0x1C1C0C07, // 0041 EQ R7 R6 R7 + 0x781E0004, // 0042 JMPF R7 #0048 + 0x8C1C0906, // 0043 GETMET R7 R4 K6 + 0x8824090D, // 0044 GETMBR R9 R4 K13 + 0x542A0004, // 0045 LDINT R10 5 + 0x7C1C0600, // 0046 CALL R7 3 + 0x80040E00, // 0047 RET 1 R7 + 0x70020007, // 0048 JMP #0051 + 0x601C0003, // 0049 GETGBL R7 G3 + 0x5C200000, // 004A MOVE R8 R0 + 0x7C1C0200, // 004B CALL R7 1 + 0x8C1C0F0E, // 004C GETMET R7 R7 K14 + 0x5C240200, // 004D MOVE R9 R1 + 0x5C280400, // 004E MOVE R10 R2 + 0x7C1C0600, // 004F CALL R7 3 + 0x80040E00, // 0050 RET 1 R7 + 0x80000000, // 0051 RET 0 }) ) ); @@ -129,7 +132,7 @@ be_local_closure(Matter_Plugin_Light2_read_attribute, /* name */ ********************************************************************/ be_local_closure(Matter_Plugin_Light2_update_shadow, /* name */ be_nested_proto( - 9, /* nstack */ + 8, /* nstack */ 1, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -149,7 +152,7 @@ be_local_closure(Matter_Plugin_Light2_update_shadow, /* name */ }), be_str_weak(update_shadow), &be_const_str_solidified, - ( &(const binstruction[28]) { /* code */ + ( &(const binstruction[27]) { /* code */ 0xA4060000, // 0000 IMPORT R1 K0 0x8C080101, // 0001 GETMET R2 R0 K1 0x7C080200, // 0002 CALL R2 1 @@ -170,14 +173,13 @@ be_local_closure(Matter_Plugin_Light2_update_shadow, /* name */ 0x880C0106, // 0011 GETMBR R3 R0 K6 0x88100106, // 0012 GETMBR R4 R0 K6 0x20100604, // 0013 NE R4 R3 R4 - 0x78120005, // 0014 JMPF R4 #001B + 0x78120004, // 0014 JMPF R4 #001A 0x8C100107, // 0015 GETMET R4 R0 K7 - 0x4C180000, // 0016 LDNIL R6 - 0x541E02FF, // 0017 LDINT R7 768 - 0x54220006, // 0018 LDINT R8 7 - 0x7C100800, // 0019 CALL R4 4 - 0x90020C03, // 001A SETMBR R0 K6 R3 - 0x80000000, // 001B RET 0 + 0x541A02FF, // 0016 LDINT R6 768 + 0x541E0006, // 0017 LDINT R7 7 + 0x7C100600, // 0018 CALL R4 3 + 0x90020C03, // 0019 SETMBR R0 K6 R3 + 0x80000000, // 001A RET 0 }) ) ); @@ -280,26 +282,27 @@ be_local_closure(Matter_Plugin_Light2_invoke_request, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[15]) { /* constants */ + ( &(const bvalue[16]) { /* constants */ /* K0 */ be_nested_str_weak(light), /* K1 */ be_nested_str_weak(matter), /* K2 */ be_nested_str_weak(TLV), /* K3 */ be_nested_str_weak(cluster), /* K4 */ be_nested_str_weak(command), - /* K5 */ be_nested_str_weak(findsubval), - /* K6 */ be_const_int(0), - /* K7 */ be_nested_str_weak(ct_min), - /* K8 */ be_nested_str_weak(ct_max), - /* K9 */ be_nested_str_weak(set), - /* K10 */ be_nested_str_weak(ct), - /* K11 */ be_nested_str_weak(update_shadow), - /* K12 */ be_nested_str_weak(log), - /* K13 */ be_nested_str_weak(ct_X3A), - /* K14 */ be_nested_str_weak(invoke_request), + /* K5 */ be_nested_str_weak(update_shadow_lazy), + /* K6 */ be_nested_str_weak(findsubval), + /* K7 */ be_const_int(0), + /* K8 */ be_nested_str_weak(ct_min), + /* K9 */ be_nested_str_weak(ct_max), + /* K10 */ be_nested_str_weak(set), + /* K11 */ be_nested_str_weak(ct), + /* K12 */ be_nested_str_weak(update_shadow), + /* K13 */ be_nested_str_weak(log), + /* K14 */ be_nested_str_weak(ct_X3A), + /* K15 */ be_nested_str_weak(invoke_request), }), be_str_weak(invoke_request), &be_const_str_solidified, - ( &(const binstruction[65]) { /* code */ + ( &(const binstruction[67]) { /* code */ 0xA4120000, // 0000 IMPORT R4 K0 0xB8160200, // 0001 GETNGBL R5 K1 0x88140B02, // 0002 GETMBR R5 R5 K2 @@ -307,64 +310,66 @@ be_local_closure(Matter_Plugin_Light2_invoke_request, /* name */ 0x881C0704, // 0004 GETMBR R7 R3 K4 0x542202FF, // 0005 LDINT R8 768 0x1C200C08, // 0006 EQ R8 R6 R8 - 0x7822002E, // 0007 JMPF R8 #0037 - 0x54220009, // 0008 LDINT R8 10 - 0x1C200E08, // 0009 EQ R8 R7 R8 - 0x78220019, // 000A JMPF R8 #0025 - 0x8C200505, // 000B GETMET R8 R2 K5 - 0x58280006, // 000C LDCONST R10 K6 - 0x7C200400, // 000D CALL R8 2 - 0x88240107, // 000E GETMBR R9 R0 K7 - 0x14241009, // 000F LT R9 R8 R9 - 0x78260000, // 0010 JMPF R9 #0012 - 0x88200107, // 0011 GETMBR R8 R0 K7 - 0x88240108, // 0012 GETMBR R9 R0 K8 - 0x24241009, // 0013 GT R9 R8 R9 - 0x78260000, // 0014 JMPF R9 #0016 - 0x88200108, // 0015 GETMBR R8 R0 K8 - 0x8C240909, // 0016 GETMET R9 R4 K9 - 0x602C0013, // 0017 GETGBL R11 G19 - 0x7C2C0000, // 0018 CALL R11 0 - 0x982E1408, // 0019 SETIDX R11 K10 R8 - 0x7C240400, // 001A CALL R9 2 - 0x8C24010B, // 001B GETMET R9 R0 K11 - 0x7C240200, // 001C CALL R9 1 - 0x60240008, // 001D GETGBL R9 G8 - 0x5C281000, // 001E MOVE R10 R8 - 0x7C240200, // 001F CALL R9 1 - 0x00261A09, // 0020 ADD R9 K13 R9 - 0x900E1809, // 0021 SETMBR R3 K12 R9 - 0x50240200, // 0022 LDBOOL R9 1 0 - 0x80041200, // 0023 RET 1 R9 - 0x70020010, // 0024 JMP #0036 - 0x54220046, // 0025 LDINT R8 71 - 0x1C200E08, // 0026 EQ R8 R7 R8 - 0x78220002, // 0027 JMPF R8 #002B - 0x50200200, // 0028 LDBOOL R8 1 0 - 0x80041000, // 0029 RET 1 R8 - 0x7002000A, // 002A JMP #0036 - 0x5422004A, // 002B LDINT R8 75 - 0x1C200E08, // 002C EQ R8 R7 R8 - 0x78220002, // 002D JMPF R8 #0031 - 0x50200200, // 002E LDBOOL R8 1 0 - 0x80041000, // 002F RET 1 R8 - 0x70020004, // 0030 JMP #0036 - 0x5422004B, // 0031 LDINT R8 76 - 0x1C200E08, // 0032 EQ R8 R7 R8 - 0x78220001, // 0033 JMPF R8 #0036 - 0x50200200, // 0034 LDBOOL R8 1 0 - 0x80041000, // 0035 RET 1 R8 - 0x70020008, // 0036 JMP #0040 - 0x60200003, // 0037 GETGBL R8 G3 - 0x5C240000, // 0038 MOVE R9 R0 - 0x7C200200, // 0039 CALL R8 1 - 0x8C20110E, // 003A GETMET R8 R8 K14 - 0x5C280200, // 003B MOVE R10 R1 - 0x5C2C0400, // 003C MOVE R11 R2 - 0x5C300600, // 003D MOVE R12 R3 - 0x7C200800, // 003E CALL R8 4 - 0x80041000, // 003F RET 1 R8 - 0x80000000, // 0040 RET 0 + 0x78220030, // 0007 JMPF R8 #0039 + 0x8C200105, // 0008 GETMET R8 R0 K5 + 0x7C200200, // 0009 CALL R8 1 + 0x54220009, // 000A LDINT R8 10 + 0x1C200E08, // 000B EQ R8 R7 R8 + 0x78220019, // 000C JMPF R8 #0027 + 0x8C200506, // 000D GETMET R8 R2 K6 + 0x58280007, // 000E LDCONST R10 K7 + 0x7C200400, // 000F CALL R8 2 + 0x88240108, // 0010 GETMBR R9 R0 K8 + 0x14241009, // 0011 LT R9 R8 R9 + 0x78260000, // 0012 JMPF R9 #0014 + 0x88200108, // 0013 GETMBR R8 R0 K8 + 0x88240109, // 0014 GETMBR R9 R0 K9 + 0x24241009, // 0015 GT R9 R8 R9 + 0x78260000, // 0016 JMPF R9 #0018 + 0x88200109, // 0017 GETMBR R8 R0 K9 + 0x8C24090A, // 0018 GETMET R9 R4 K10 + 0x602C0013, // 0019 GETGBL R11 G19 + 0x7C2C0000, // 001A CALL R11 0 + 0x982E1608, // 001B SETIDX R11 K11 R8 + 0x7C240400, // 001C CALL R9 2 + 0x8C24010C, // 001D GETMET R9 R0 K12 + 0x7C240200, // 001E CALL R9 1 + 0x60240008, // 001F GETGBL R9 G8 + 0x5C281000, // 0020 MOVE R10 R8 + 0x7C240200, // 0021 CALL R9 1 + 0x00261C09, // 0022 ADD R9 K14 R9 + 0x900E1A09, // 0023 SETMBR R3 K13 R9 + 0x50240200, // 0024 LDBOOL R9 1 0 + 0x80041200, // 0025 RET 1 R9 + 0x70020010, // 0026 JMP #0038 + 0x54220046, // 0027 LDINT R8 71 + 0x1C200E08, // 0028 EQ R8 R7 R8 + 0x78220002, // 0029 JMPF R8 #002D + 0x50200200, // 002A LDBOOL R8 1 0 + 0x80041000, // 002B RET 1 R8 + 0x7002000A, // 002C JMP #0038 + 0x5422004A, // 002D LDINT R8 75 + 0x1C200E08, // 002E EQ R8 R7 R8 + 0x78220002, // 002F JMPF R8 #0033 + 0x50200200, // 0030 LDBOOL R8 1 0 + 0x80041000, // 0031 RET 1 R8 + 0x70020004, // 0032 JMP #0038 + 0x5422004B, // 0033 LDINT R8 76 + 0x1C200E08, // 0034 EQ R8 R7 R8 + 0x78220001, // 0035 JMPF R8 #0038 + 0x50200200, // 0036 LDBOOL R8 1 0 + 0x80041000, // 0037 RET 1 R8 + 0x70020008, // 0038 JMP #0042 + 0x60200003, // 0039 GETGBL R8 G3 + 0x5C240000, // 003A MOVE R9 R0 + 0x7C200200, // 003B CALL R8 1 + 0x8C20110F, // 003C GETMET R8 R8 K15 + 0x5C280200, // 003D MOVE R10 R1 + 0x5C2C0400, // 003E MOVE R11 R2 + 0x5C300600, // 003F MOVE R12 R3 + 0x7C200800, // 0040 CALL R8 4 + 0x80041000, // 0041 RET 1 R8 + 0x80000000, // 0042 RET 0 }) ) ); diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Light3.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Light3.h index b4ebe2fd7..abfb7e030 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Light3.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Light3.h @@ -36,7 +36,7 @@ be_local_closure(Matter_Plugin_Light3_update_shadow, /* name */ }), be_str_weak(update_shadow), &be_const_str_solidified, - ( &(const binstruction[63]) { /* code */ + ( &(const binstruction[61]) { /* code */ 0xA4060000, // 0000 IMPORT R1 K0 0x60080003, // 0001 GETGBL R2 G3 0x5C0C0000, // 0002 MOVE R3 R0 @@ -83,23 +83,21 @@ be_local_closure(Matter_Plugin_Light3_update_shadow, /* name */ 0x8810010A, // 002B GETMBR R4 R0 K10 0x88140109, // 002C GETMBR R5 R0 K9 0x20140605, // 002D NE R5 R3 R5 - 0x78160005, // 002E JMPF R5 #0035 + 0x78160004, // 002E JMPF R5 #0034 0x8C14010B, // 002F GETMET R5 R0 K11 - 0x4C1C0000, // 0030 LDNIL R7 - 0x542202FF, // 0031 LDINT R8 768 - 0x58240008, // 0032 LDCONST R9 K8 - 0x7C140800, // 0033 CALL R5 4 - 0x90021203, // 0034 SETMBR R0 K9 R3 - 0x8814010A, // 0035 GETMBR R5 R0 K10 - 0x20140805, // 0036 NE R5 R4 R5 - 0x78160005, // 0037 JMPF R5 #003E - 0x8C14010B, // 0038 GETMET R5 R0 K11 - 0x4C1C0000, // 0039 LDNIL R7 - 0x542202FF, // 003A LDINT R8 768 - 0x5824000C, // 003B LDCONST R9 K12 - 0x7C140800, // 003C CALL R5 4 - 0x90021404, // 003D SETMBR R0 K10 R4 - 0x80000000, // 003E RET 0 + 0x541E02FF, // 0030 LDINT R7 768 + 0x58200008, // 0031 LDCONST R8 K8 + 0x7C140600, // 0032 CALL R5 3 + 0x90021203, // 0033 SETMBR R0 K9 R3 + 0x8814010A, // 0034 GETMBR R5 R0 K10 + 0x20140805, // 0035 NE R5 R4 R5 + 0x78160004, // 0036 JMPF R5 #003C + 0x8C14010B, // 0037 GETMET R5 R0 K11 + 0x541E02FF, // 0038 LDINT R7 768 + 0x5820000C, // 0039 LDCONST R8 K12 + 0x7C140600, // 003A CALL R5 3 + 0x90021404, // 003B SETMBR R0 K10 R4 + 0x80000000, // 003C RET 0 }) ) ); @@ -119,24 +117,25 @@ be_local_closure(Matter_Plugin_Light3_read_attribute, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[13]) { /* constants */ + ( &(const bvalue[14]) { /* constants */ /* K0 */ be_nested_str_weak(string), /* K1 */ be_nested_str_weak(matter), /* K2 */ be_nested_str_weak(TLV), /* K3 */ be_nested_str_weak(cluster), /* K4 */ be_nested_str_weak(attribute), - /* K5 */ be_const_int(0), - /* K6 */ be_nested_str_weak(create_TLV), - /* K7 */ be_nested_str_weak(U1), - /* K8 */ be_nested_str_weak(shadow_hue), - /* K9 */ be_const_int(1), - /* K10 */ be_nested_str_weak(shadow_sat), - /* K11 */ be_nested_str_weak(U4), - /* K12 */ be_nested_str_weak(read_attribute), + /* K5 */ be_nested_str_weak(update_shadow_lazy), + /* K6 */ be_const_int(0), + /* K7 */ be_nested_str_weak(create_TLV), + /* K8 */ be_nested_str_weak(U1), + /* K9 */ be_nested_str_weak(shadow_hue), + /* K10 */ be_const_int(1), + /* K11 */ be_nested_str_weak(shadow_sat), + /* K12 */ be_nested_str_weak(U4), + /* K13 */ be_nested_str_weak(read_attribute), }), be_str_weak(read_attribute), &be_const_str_solidified, - ( &(const binstruction[105]) { /* code */ + ( &(const binstruction[107]) { /* code */ 0xA40E0000, // 0000 IMPORT R3 K0 0xB8120200, // 0001 GETNGBL R4 K1 0x88100902, // 0002 GETMBR R4 R4 K2 @@ -144,104 +143,106 @@ be_local_closure(Matter_Plugin_Light3_read_attribute, /* name */ 0x88180504, // 0004 GETMBR R6 R2 K4 0x541E02FF, // 0005 LDINT R7 768 0x1C1C0A07, // 0006 EQ R7 R5 R7 - 0x781E0057, // 0007 JMPF R7 #0060 - 0x1C1C0D05, // 0008 EQ R7 R6 K5 - 0x781E0005, // 0009 JMPF R7 #0010 - 0x8C1C0906, // 000A GETMET R7 R4 K6 - 0x88240907, // 000B GETMBR R9 R4 K7 - 0x88280108, // 000C GETMBR R10 R0 K8 - 0x7C1C0600, // 000D CALL R7 3 - 0x80040E00, // 000E RET 1 R7 - 0x7002004E, // 000F JMP #005F - 0x1C1C0D09, // 0010 EQ R7 R6 K9 - 0x781E0005, // 0011 JMPF R7 #0018 - 0x8C1C0906, // 0012 GETMET R7 R4 K6 - 0x88240907, // 0013 GETMBR R9 R4 K7 - 0x8828010A, // 0014 GETMBR R10 R0 K10 - 0x7C1C0600, // 0015 CALL R7 3 - 0x80040E00, // 0016 RET 1 R7 - 0x70020046, // 0017 JMP #005F - 0x541E0006, // 0018 LDINT R7 7 - 0x1C1C0C07, // 0019 EQ R7 R6 R7 - 0x781E0005, // 001A JMPF R7 #0021 - 0x8C1C0906, // 001B GETMET R7 R4 K6 - 0x88240907, // 001C GETMBR R9 R4 K7 - 0x58280005, // 001D LDCONST R10 K5 - 0x7C1C0600, // 001E CALL R7 3 - 0x80040E00, // 001F RET 1 R7 - 0x7002003D, // 0020 JMP #005F - 0x541E0007, // 0021 LDINT R7 8 - 0x1C1C0C07, // 0022 EQ R7 R6 R7 - 0x781E0005, // 0023 JMPF R7 #002A - 0x8C1C0906, // 0024 GETMET R7 R4 K6 - 0x88240907, // 0025 GETMBR R9 R4 K7 - 0x58280005, // 0026 LDCONST R10 K5 - 0x7C1C0600, // 0027 CALL R7 3 - 0x80040E00, // 0028 RET 1 R7 - 0x70020034, // 0029 JMP #005F - 0x541E000E, // 002A LDINT R7 15 - 0x1C1C0C07, // 002B EQ R7 R6 R7 - 0x781E0005, // 002C JMPF R7 #0033 - 0x8C1C0906, // 002D GETMET R7 R4 K6 - 0x88240907, // 002E GETMBR R9 R4 K7 - 0x58280005, // 002F LDCONST R10 K5 - 0x7C1C0600, // 0030 CALL R7 3 - 0x80040E00, // 0031 RET 1 R7 - 0x7002002B, // 0032 JMP #005F - 0x541E4000, // 0033 LDINT R7 16385 - 0x1C1C0C07, // 0034 EQ R7 R6 R7 - 0x781E0005, // 0035 JMPF R7 #003C - 0x8C1C0906, // 0036 GETMET R7 R4 K6 - 0x88240907, // 0037 GETMBR R9 R4 K7 - 0x58280005, // 0038 LDCONST R10 K5 - 0x7C1C0600, // 0039 CALL R7 3 - 0x80040E00, // 003A RET 1 R7 - 0x70020022, // 003B JMP #005F - 0x541E4009, // 003C LDINT R7 16394 - 0x1C1C0C07, // 003D EQ R7 R6 R7 - 0x781E0005, // 003E JMPF R7 #0045 - 0x8C1C0906, // 003F GETMET R7 R4 K6 - 0x88240907, // 0040 GETMBR R9 R4 K7 - 0x58280005, // 0041 LDCONST R10 K5 - 0x7C1C0600, // 0042 CALL R7 3 - 0x80040E00, // 0043 RET 1 R7 - 0x70020019, // 0044 JMP #005F - 0x541E000F, // 0045 LDINT R7 16 - 0x1C1C0C07, // 0046 EQ R7 R6 R7 - 0x781E0005, // 0047 JMPF R7 #004E - 0x8C1C0906, // 0048 GETMET R7 R4 K6 - 0x88240907, // 0049 GETMBR R9 R4 K7 - 0x58280005, // 004A LDCONST R10 K5 - 0x7C1C0600, // 004B CALL R7 3 - 0x80040E00, // 004C RET 1 R7 - 0x70020010, // 004D JMP #005F - 0x541EFFFB, // 004E LDINT R7 65532 - 0x1C1C0C07, // 004F EQ R7 R6 R7 - 0x781E0005, // 0050 JMPF R7 #0057 - 0x8C1C0906, // 0051 GETMET R7 R4 K6 - 0x8824090B, // 0052 GETMBR R9 R4 K11 - 0x58280009, // 0053 LDCONST R10 K9 - 0x7C1C0600, // 0054 CALL R7 3 - 0x80040E00, // 0055 RET 1 R7 - 0x70020007, // 0056 JMP #005F - 0x541EFFFC, // 0057 LDINT R7 65533 - 0x1C1C0C07, // 0058 EQ R7 R6 R7 - 0x781E0004, // 0059 JMPF R7 #005F - 0x8C1C0906, // 005A GETMET R7 R4 K6 - 0x8824090B, // 005B GETMBR R9 R4 K11 - 0x542A0004, // 005C LDINT R10 5 - 0x7C1C0600, // 005D CALL R7 3 - 0x80040E00, // 005E RET 1 R7 - 0x70020007, // 005F JMP #0068 - 0x601C0003, // 0060 GETGBL R7 G3 - 0x5C200000, // 0061 MOVE R8 R0 - 0x7C1C0200, // 0062 CALL R7 1 - 0x8C1C0F0C, // 0063 GETMET R7 R7 K12 - 0x5C240200, // 0064 MOVE R9 R1 - 0x5C280400, // 0065 MOVE R10 R2 - 0x7C1C0600, // 0066 CALL R7 3 - 0x80040E00, // 0067 RET 1 R7 - 0x80000000, // 0068 RET 0 + 0x781E0059, // 0007 JMPF R7 #0062 + 0x8C1C0105, // 0008 GETMET R7 R0 K5 + 0x7C1C0200, // 0009 CALL R7 1 + 0x1C1C0D06, // 000A EQ R7 R6 K6 + 0x781E0005, // 000B JMPF R7 #0012 + 0x8C1C0907, // 000C GETMET R7 R4 K7 + 0x88240908, // 000D GETMBR R9 R4 K8 + 0x88280109, // 000E GETMBR R10 R0 K9 + 0x7C1C0600, // 000F CALL R7 3 + 0x80040E00, // 0010 RET 1 R7 + 0x7002004E, // 0011 JMP #0061 + 0x1C1C0D0A, // 0012 EQ R7 R6 K10 + 0x781E0005, // 0013 JMPF R7 #001A + 0x8C1C0907, // 0014 GETMET R7 R4 K7 + 0x88240908, // 0015 GETMBR R9 R4 K8 + 0x8828010B, // 0016 GETMBR R10 R0 K11 + 0x7C1C0600, // 0017 CALL R7 3 + 0x80040E00, // 0018 RET 1 R7 + 0x70020046, // 0019 JMP #0061 + 0x541E0006, // 001A LDINT R7 7 + 0x1C1C0C07, // 001B EQ R7 R6 R7 + 0x781E0005, // 001C JMPF R7 #0023 + 0x8C1C0907, // 001D GETMET R7 R4 K7 + 0x88240908, // 001E GETMBR R9 R4 K8 + 0x58280006, // 001F LDCONST R10 K6 + 0x7C1C0600, // 0020 CALL R7 3 + 0x80040E00, // 0021 RET 1 R7 + 0x7002003D, // 0022 JMP #0061 + 0x541E0007, // 0023 LDINT R7 8 + 0x1C1C0C07, // 0024 EQ R7 R6 R7 + 0x781E0005, // 0025 JMPF R7 #002C + 0x8C1C0907, // 0026 GETMET R7 R4 K7 + 0x88240908, // 0027 GETMBR R9 R4 K8 + 0x58280006, // 0028 LDCONST R10 K6 + 0x7C1C0600, // 0029 CALL R7 3 + 0x80040E00, // 002A RET 1 R7 + 0x70020034, // 002B JMP #0061 + 0x541E000E, // 002C LDINT R7 15 + 0x1C1C0C07, // 002D EQ R7 R6 R7 + 0x781E0005, // 002E JMPF R7 #0035 + 0x8C1C0907, // 002F GETMET R7 R4 K7 + 0x88240908, // 0030 GETMBR R9 R4 K8 + 0x58280006, // 0031 LDCONST R10 K6 + 0x7C1C0600, // 0032 CALL R7 3 + 0x80040E00, // 0033 RET 1 R7 + 0x7002002B, // 0034 JMP #0061 + 0x541E4000, // 0035 LDINT R7 16385 + 0x1C1C0C07, // 0036 EQ R7 R6 R7 + 0x781E0005, // 0037 JMPF R7 #003E + 0x8C1C0907, // 0038 GETMET R7 R4 K7 + 0x88240908, // 0039 GETMBR R9 R4 K8 + 0x58280006, // 003A LDCONST R10 K6 + 0x7C1C0600, // 003B CALL R7 3 + 0x80040E00, // 003C RET 1 R7 + 0x70020022, // 003D JMP #0061 + 0x541E4009, // 003E LDINT R7 16394 + 0x1C1C0C07, // 003F EQ R7 R6 R7 + 0x781E0005, // 0040 JMPF R7 #0047 + 0x8C1C0907, // 0041 GETMET R7 R4 K7 + 0x88240908, // 0042 GETMBR R9 R4 K8 + 0x58280006, // 0043 LDCONST R10 K6 + 0x7C1C0600, // 0044 CALL R7 3 + 0x80040E00, // 0045 RET 1 R7 + 0x70020019, // 0046 JMP #0061 + 0x541E000F, // 0047 LDINT R7 16 + 0x1C1C0C07, // 0048 EQ R7 R6 R7 + 0x781E0005, // 0049 JMPF R7 #0050 + 0x8C1C0907, // 004A GETMET R7 R4 K7 + 0x88240908, // 004B GETMBR R9 R4 K8 + 0x58280006, // 004C LDCONST R10 K6 + 0x7C1C0600, // 004D CALL R7 3 + 0x80040E00, // 004E RET 1 R7 + 0x70020010, // 004F JMP #0061 + 0x541EFFFB, // 0050 LDINT R7 65532 + 0x1C1C0C07, // 0051 EQ R7 R6 R7 + 0x781E0005, // 0052 JMPF R7 #0059 + 0x8C1C0907, // 0053 GETMET R7 R4 K7 + 0x8824090C, // 0054 GETMBR R9 R4 K12 + 0x5828000A, // 0055 LDCONST R10 K10 + 0x7C1C0600, // 0056 CALL R7 3 + 0x80040E00, // 0057 RET 1 R7 + 0x70020007, // 0058 JMP #0061 + 0x541EFFFC, // 0059 LDINT R7 65533 + 0x1C1C0C07, // 005A EQ R7 R6 R7 + 0x781E0004, // 005B JMPF R7 #0061 + 0x8C1C0907, // 005C GETMET R7 R4 K7 + 0x8824090C, // 005D GETMBR R9 R4 K12 + 0x542A0004, // 005E LDINT R10 5 + 0x7C1C0600, // 005F CALL R7 3 + 0x80040E00, // 0060 RET 1 R7 + 0x70020007, // 0061 JMP #006A + 0x601C0003, // 0062 GETGBL R7 G3 + 0x5C200000, // 0063 MOVE R8 R0 + 0x7C1C0200, // 0064 CALL R7 1 + 0x8C1C0F0D, // 0065 GETMET R7 R7 K13 + 0x5C240200, // 0066 MOVE R9 R1 + 0x5C280400, // 0067 MOVE R10 R2 + 0x7C1C0600, // 0068 CALL R7 3 + 0x80040E00, // 0069 RET 1 R7 + 0x80000000, // 006A RET 0 }) ) ); @@ -300,32 +301,33 @@ be_local_closure(Matter_Plugin_Light3_invoke_request, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[21]) { /* constants */ + ( &(const bvalue[22]) { /* constants */ /* K0 */ be_nested_str_weak(light), /* K1 */ be_nested_str_weak(matter), /* K2 */ be_nested_str_weak(TLV), /* K3 */ be_nested_str_weak(cluster), /* K4 */ be_nested_str_weak(command), - /* K5 */ be_const_int(0), - /* K6 */ be_nested_str_weak(findsubval), - /* K7 */ be_nested_str_weak(tasmota), - /* K8 */ be_nested_str_weak(scale_uint), - /* K9 */ be_nested_str_weak(set), - /* K10 */ be_nested_str_weak(hue), - /* K11 */ be_nested_str_weak(update_shadow), - /* K12 */ be_nested_str_weak(log), - /* K13 */ be_nested_str_weak(hue_X3A), - /* K14 */ be_const_int(1), - /* K15 */ be_const_int(2), - /* K16 */ be_const_int(3), - /* K17 */ be_nested_str_weak(sat), - /* K18 */ be_nested_str_weak(sat_X3A), - /* K19 */ be_nested_str_weak(_X20sat_X3A), - /* K20 */ be_nested_str_weak(invoke_request), + /* K5 */ be_nested_str_weak(update_shadow_lazy), + /* K6 */ be_const_int(0), + /* K7 */ be_nested_str_weak(findsubval), + /* K8 */ be_nested_str_weak(tasmota), + /* K9 */ be_nested_str_weak(scale_uint), + /* K10 */ be_nested_str_weak(set), + /* K11 */ be_nested_str_weak(hue), + /* K12 */ be_nested_str_weak(update_shadow), + /* K13 */ be_nested_str_weak(log), + /* K14 */ be_nested_str_weak(hue_X3A), + /* K15 */ be_const_int(1), + /* K16 */ be_const_int(2), + /* K17 */ be_const_int(3), + /* K18 */ be_nested_str_weak(sat), + /* K19 */ be_nested_str_weak(sat_X3A), + /* K20 */ be_nested_str_weak(_X20sat_X3A), + /* K21 */ be_nested_str_weak(invoke_request), }), be_str_weak(invoke_request), &be_const_str_solidified, - ( &(const binstruction[148]) { /* code */ + ( &(const binstruction[150]) { /* code */ 0xA4120000, // 0000 IMPORT R4 K0 0xB8160200, // 0001 GETNGBL R5 K1 0x88140B02, // 0002 GETMBR R5 R5 K2 @@ -333,147 +335,149 @@ be_local_closure(Matter_Plugin_Light3_invoke_request, /* name */ 0x881C0704, // 0004 GETMBR R7 R3 K4 0x542202FF, // 0005 LDINT R8 768 0x1C200C08, // 0006 EQ R8 R6 R8 - 0x78220081, // 0007 JMPF R8 #008A - 0x1C200F05, // 0008 EQ R8 R7 K5 - 0x78220019, // 0009 JMPF R8 #0024 - 0x8C200506, // 000A GETMET R8 R2 K6 - 0x58280005, // 000B LDCONST R10 K5 - 0x7C200400, // 000C CALL R8 2 - 0xB8260E00, // 000D GETNGBL R9 K7 - 0x8C241308, // 000E GETMET R9 R9 K8 - 0x5C2C1000, // 000F MOVE R11 R8 - 0x58300005, // 0010 LDCONST R12 K5 - 0x543600FD, // 0011 LDINT R13 254 - 0x58380005, // 0012 LDCONST R14 K5 - 0x543E0167, // 0013 LDINT R15 360 - 0x7C240C00, // 0014 CALL R9 6 - 0x8C280909, // 0015 GETMET R10 R4 K9 - 0x60300013, // 0016 GETGBL R12 G19 - 0x7C300000, // 0017 CALL R12 0 - 0x98321409, // 0018 SETIDX R12 K10 R9 - 0x7C280400, // 0019 CALL R10 2 - 0x8C28010B, // 001A GETMET R10 R0 K11 - 0x7C280200, // 001B CALL R10 1 - 0x60280008, // 001C GETGBL R10 G8 - 0x5C2C1000, // 001D MOVE R11 R8 - 0x7C280200, // 001E CALL R10 1 - 0x002A1A0A, // 001F ADD R10 K13 R10 - 0x900E180A, // 0020 SETMBR R3 K12 R10 - 0x50280200, // 0021 LDBOOL R10 1 0 - 0x80041400, // 0022 RET 1 R10 - 0x70020064, // 0023 JMP #0089 - 0x1C200F0E, // 0024 EQ R8 R7 K14 - 0x78220002, // 0025 JMPF R8 #0029 - 0x50200200, // 0026 LDBOOL R8 1 0 - 0x80041000, // 0027 RET 1 R8 - 0x7002005F, // 0028 JMP #0089 - 0x1C200F0F, // 0029 EQ R8 R7 K15 - 0x78220002, // 002A JMPF R8 #002E - 0x50200200, // 002B LDBOOL R8 1 0 - 0x80041000, // 002C RET 1 R8 - 0x7002005A, // 002D JMP #0089 - 0x1C200F10, // 002E EQ R8 R7 K16 - 0x78220019, // 002F JMPF R8 #004A - 0x8C200506, // 0030 GETMET R8 R2 K6 - 0x58280005, // 0031 LDCONST R10 K5 - 0x7C200400, // 0032 CALL R8 2 - 0xB8260E00, // 0033 GETNGBL R9 K7 - 0x8C241308, // 0034 GETMET R9 R9 K8 - 0x5C2C1000, // 0035 MOVE R11 R8 - 0x58300005, // 0036 LDCONST R12 K5 - 0x543600FD, // 0037 LDINT R13 254 - 0x58380005, // 0038 LDCONST R14 K5 - 0x543E00FE, // 0039 LDINT R15 255 - 0x7C240C00, // 003A CALL R9 6 - 0x8C280909, // 003B GETMET R10 R4 K9 - 0x60300013, // 003C GETGBL R12 G19 - 0x7C300000, // 003D CALL R12 0 - 0x98322209, // 003E SETIDX R12 K17 R9 - 0x7C280400, // 003F CALL R10 2 - 0x8C28010B, // 0040 GETMET R10 R0 K11 - 0x7C280200, // 0041 CALL R10 1 - 0x60280008, // 0042 GETGBL R10 G8 - 0x5C2C1000, // 0043 MOVE R11 R8 - 0x7C280200, // 0044 CALL R10 1 - 0x002A240A, // 0045 ADD R10 K18 R10 - 0x900E180A, // 0046 SETMBR R3 K12 R10 - 0x50280200, // 0047 LDBOOL R10 1 0 - 0x80041400, // 0048 RET 1 R10 - 0x7002003E, // 0049 JMP #0089 - 0x54220003, // 004A LDINT R8 4 - 0x1C200E08, // 004B EQ R8 R7 R8 - 0x78220002, // 004C JMPF R8 #0050 - 0x50200200, // 004D LDBOOL R8 1 0 - 0x80041000, // 004E RET 1 R8 - 0x70020038, // 004F JMP #0089 - 0x54220004, // 0050 LDINT R8 5 - 0x1C200E08, // 0051 EQ R8 R7 R8 - 0x78220002, // 0052 JMPF R8 #0056 - 0x50200200, // 0053 LDBOOL R8 1 0 - 0x80041000, // 0054 RET 1 R8 - 0x70020032, // 0055 JMP #0089 - 0x54220005, // 0056 LDINT R8 6 - 0x1C200E08, // 0057 EQ R8 R7 R8 - 0x7822002A, // 0058 JMPF R8 #0084 - 0x8C200506, // 0059 GETMET R8 R2 K6 - 0x58280005, // 005A LDCONST R10 K5 - 0x7C200400, // 005B CALL R8 2 - 0xB8260E00, // 005C GETNGBL R9 K7 - 0x8C241308, // 005D GETMET R9 R9 K8 - 0x5C2C1000, // 005E MOVE R11 R8 - 0x58300005, // 005F LDCONST R12 K5 - 0x543600FD, // 0060 LDINT R13 254 - 0x58380005, // 0061 LDCONST R14 K5 - 0x543E0167, // 0062 LDINT R15 360 - 0x7C240C00, // 0063 CALL R9 6 - 0x8C280506, // 0064 GETMET R10 R2 K6 - 0x5830000E, // 0065 LDCONST R12 K14 - 0x7C280400, // 0066 CALL R10 2 - 0xB82E0E00, // 0067 GETNGBL R11 K7 - 0x8C2C1708, // 0068 GETMET R11 R11 K8 - 0x5C341400, // 0069 MOVE R13 R10 - 0x58380005, // 006A LDCONST R14 K5 - 0x543E00FD, // 006B LDINT R15 254 - 0x58400005, // 006C LDCONST R16 K5 - 0x544600FE, // 006D LDINT R17 255 - 0x7C2C0C00, // 006E CALL R11 6 - 0x8C300909, // 006F GETMET R12 R4 K9 - 0x60380013, // 0070 GETGBL R14 G19 - 0x7C380000, // 0071 CALL R14 0 - 0x983A1409, // 0072 SETIDX R14 K10 R9 - 0x983A220B, // 0073 SETIDX R14 K17 R11 - 0x7C300400, // 0074 CALL R12 2 - 0x8C30010B, // 0075 GETMET R12 R0 K11 - 0x7C300200, // 0076 CALL R12 1 - 0x60300008, // 0077 GETGBL R12 G8 - 0x5C341000, // 0078 MOVE R13 R8 - 0x7C300200, // 0079 CALL R12 1 - 0x00321A0C, // 007A ADD R12 K13 R12 - 0x00301913, // 007B ADD R12 R12 K19 - 0x60340008, // 007C GETGBL R13 G8 - 0x5C381400, // 007D MOVE R14 R10 - 0x7C340200, // 007E CALL R13 1 - 0x0030180D, // 007F ADD R12 R12 R13 - 0x900E180C, // 0080 SETMBR R3 K12 R12 - 0x50300200, // 0081 LDBOOL R12 1 0 - 0x80041800, // 0082 RET 1 R12 - 0x70020004, // 0083 JMP #0089 - 0x54220046, // 0084 LDINT R8 71 - 0x1C200E08, // 0085 EQ R8 R7 R8 - 0x78220001, // 0086 JMPF R8 #0089 - 0x50200200, // 0087 LDBOOL R8 1 0 - 0x80041000, // 0088 RET 1 R8 - 0x70020008, // 0089 JMP #0093 - 0x60200003, // 008A GETGBL R8 G3 - 0x5C240000, // 008B MOVE R9 R0 - 0x7C200200, // 008C CALL R8 1 - 0x8C201114, // 008D GETMET R8 R8 K20 - 0x5C280200, // 008E MOVE R10 R1 - 0x5C2C0400, // 008F MOVE R11 R2 - 0x5C300600, // 0090 MOVE R12 R3 - 0x7C200800, // 0091 CALL R8 4 - 0x80041000, // 0092 RET 1 R8 - 0x80000000, // 0093 RET 0 + 0x78220083, // 0007 JMPF R8 #008C + 0x8C200105, // 0008 GETMET R8 R0 K5 + 0x7C200200, // 0009 CALL R8 1 + 0x1C200F06, // 000A EQ R8 R7 K6 + 0x78220019, // 000B JMPF R8 #0026 + 0x8C200507, // 000C GETMET R8 R2 K7 + 0x58280006, // 000D LDCONST R10 K6 + 0x7C200400, // 000E CALL R8 2 + 0xB8261000, // 000F GETNGBL R9 K8 + 0x8C241309, // 0010 GETMET R9 R9 K9 + 0x5C2C1000, // 0011 MOVE R11 R8 + 0x58300006, // 0012 LDCONST R12 K6 + 0x543600FD, // 0013 LDINT R13 254 + 0x58380006, // 0014 LDCONST R14 K6 + 0x543E0167, // 0015 LDINT R15 360 + 0x7C240C00, // 0016 CALL R9 6 + 0x8C28090A, // 0017 GETMET R10 R4 K10 + 0x60300013, // 0018 GETGBL R12 G19 + 0x7C300000, // 0019 CALL R12 0 + 0x98321609, // 001A SETIDX R12 K11 R9 + 0x7C280400, // 001B CALL R10 2 + 0x8C28010C, // 001C GETMET R10 R0 K12 + 0x7C280200, // 001D CALL R10 1 + 0x60280008, // 001E GETGBL R10 G8 + 0x5C2C1000, // 001F MOVE R11 R8 + 0x7C280200, // 0020 CALL R10 1 + 0x002A1C0A, // 0021 ADD R10 K14 R10 + 0x900E1A0A, // 0022 SETMBR R3 K13 R10 + 0x50280200, // 0023 LDBOOL R10 1 0 + 0x80041400, // 0024 RET 1 R10 + 0x70020064, // 0025 JMP #008B + 0x1C200F0F, // 0026 EQ R8 R7 K15 + 0x78220002, // 0027 JMPF R8 #002B + 0x50200200, // 0028 LDBOOL R8 1 0 + 0x80041000, // 0029 RET 1 R8 + 0x7002005F, // 002A JMP #008B + 0x1C200F10, // 002B EQ R8 R7 K16 + 0x78220002, // 002C JMPF R8 #0030 + 0x50200200, // 002D LDBOOL R8 1 0 + 0x80041000, // 002E RET 1 R8 + 0x7002005A, // 002F JMP #008B + 0x1C200F11, // 0030 EQ R8 R7 K17 + 0x78220019, // 0031 JMPF R8 #004C + 0x8C200507, // 0032 GETMET R8 R2 K7 + 0x58280006, // 0033 LDCONST R10 K6 + 0x7C200400, // 0034 CALL R8 2 + 0xB8261000, // 0035 GETNGBL R9 K8 + 0x8C241309, // 0036 GETMET R9 R9 K9 + 0x5C2C1000, // 0037 MOVE R11 R8 + 0x58300006, // 0038 LDCONST R12 K6 + 0x543600FD, // 0039 LDINT R13 254 + 0x58380006, // 003A LDCONST R14 K6 + 0x543E00FE, // 003B LDINT R15 255 + 0x7C240C00, // 003C CALL R9 6 + 0x8C28090A, // 003D GETMET R10 R4 K10 + 0x60300013, // 003E GETGBL R12 G19 + 0x7C300000, // 003F CALL R12 0 + 0x98322409, // 0040 SETIDX R12 K18 R9 + 0x7C280400, // 0041 CALL R10 2 + 0x8C28010C, // 0042 GETMET R10 R0 K12 + 0x7C280200, // 0043 CALL R10 1 + 0x60280008, // 0044 GETGBL R10 G8 + 0x5C2C1000, // 0045 MOVE R11 R8 + 0x7C280200, // 0046 CALL R10 1 + 0x002A260A, // 0047 ADD R10 K19 R10 + 0x900E1A0A, // 0048 SETMBR R3 K13 R10 + 0x50280200, // 0049 LDBOOL R10 1 0 + 0x80041400, // 004A RET 1 R10 + 0x7002003E, // 004B JMP #008B + 0x54220003, // 004C LDINT R8 4 + 0x1C200E08, // 004D EQ R8 R7 R8 + 0x78220002, // 004E JMPF R8 #0052 + 0x50200200, // 004F LDBOOL R8 1 0 + 0x80041000, // 0050 RET 1 R8 + 0x70020038, // 0051 JMP #008B + 0x54220004, // 0052 LDINT R8 5 + 0x1C200E08, // 0053 EQ R8 R7 R8 + 0x78220002, // 0054 JMPF R8 #0058 + 0x50200200, // 0055 LDBOOL R8 1 0 + 0x80041000, // 0056 RET 1 R8 + 0x70020032, // 0057 JMP #008B + 0x54220005, // 0058 LDINT R8 6 + 0x1C200E08, // 0059 EQ R8 R7 R8 + 0x7822002A, // 005A JMPF R8 #0086 + 0x8C200507, // 005B GETMET R8 R2 K7 + 0x58280006, // 005C LDCONST R10 K6 + 0x7C200400, // 005D CALL R8 2 + 0xB8261000, // 005E GETNGBL R9 K8 + 0x8C241309, // 005F GETMET R9 R9 K9 + 0x5C2C1000, // 0060 MOVE R11 R8 + 0x58300006, // 0061 LDCONST R12 K6 + 0x543600FD, // 0062 LDINT R13 254 + 0x58380006, // 0063 LDCONST R14 K6 + 0x543E0167, // 0064 LDINT R15 360 + 0x7C240C00, // 0065 CALL R9 6 + 0x8C280507, // 0066 GETMET R10 R2 K7 + 0x5830000F, // 0067 LDCONST R12 K15 + 0x7C280400, // 0068 CALL R10 2 + 0xB82E1000, // 0069 GETNGBL R11 K8 + 0x8C2C1709, // 006A GETMET R11 R11 K9 + 0x5C341400, // 006B MOVE R13 R10 + 0x58380006, // 006C LDCONST R14 K6 + 0x543E00FD, // 006D LDINT R15 254 + 0x58400006, // 006E LDCONST R16 K6 + 0x544600FE, // 006F LDINT R17 255 + 0x7C2C0C00, // 0070 CALL R11 6 + 0x8C30090A, // 0071 GETMET R12 R4 K10 + 0x60380013, // 0072 GETGBL R14 G19 + 0x7C380000, // 0073 CALL R14 0 + 0x983A1609, // 0074 SETIDX R14 K11 R9 + 0x983A240B, // 0075 SETIDX R14 K18 R11 + 0x7C300400, // 0076 CALL R12 2 + 0x8C30010C, // 0077 GETMET R12 R0 K12 + 0x7C300200, // 0078 CALL R12 1 + 0x60300008, // 0079 GETGBL R12 G8 + 0x5C341000, // 007A MOVE R13 R8 + 0x7C300200, // 007B CALL R12 1 + 0x00321C0C, // 007C ADD R12 K14 R12 + 0x00301914, // 007D ADD R12 R12 K20 + 0x60340008, // 007E GETGBL R13 G8 + 0x5C381400, // 007F MOVE R14 R10 + 0x7C340200, // 0080 CALL R13 1 + 0x0030180D, // 0081 ADD R12 R12 R13 + 0x900E1A0C, // 0082 SETMBR R3 K13 R12 + 0x50300200, // 0083 LDBOOL R12 1 0 + 0x80041800, // 0084 RET 1 R12 + 0x70020004, // 0085 JMP #008B + 0x54220046, // 0086 LDINT R8 71 + 0x1C200E08, // 0087 EQ R8 R7 R8 + 0x78220001, // 0088 JMPF R8 #008B + 0x50200200, // 0089 LDBOOL R8 1 0 + 0x80041000, // 008A RET 1 R8 + 0x70020008, // 008B JMP #0095 + 0x60200003, // 008C GETGBL R8 G3 + 0x5C240000, // 008D MOVE R9 R0 + 0x7C200200, // 008E CALL R8 1 + 0x8C201115, // 008F GETMET R8 R8 K21 + 0x5C280200, // 0090 MOVE R10 R1 + 0x5C2C0400, // 0091 MOVE R11 R2 + 0x5C300600, // 0092 MOVE R12 R3 + 0x7C200800, // 0093 CALL R8 4 + 0x80041000, // 0094 RET 1 R8 + 0x80000000, // 0095 RET 0 }) ) ); diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_OnOff.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_OnOff.h index 509ff2714..07ce40c5a 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_OnOff.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_OnOff.h @@ -6,250 +6,6 @@ extern const bclass be_class_Matter_Plugin_OnOff; -/******************************************************************** -** Solidified function: init -********************************************************************/ -be_local_closure(Matter_Plugin_OnOff_init, /* name */ - be_nested_proto( - 9, /* nstack */ - 4, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 6]) { /* constants */ - /* K0 */ be_nested_str_weak(init), - /* K1 */ be_nested_str_weak(get_onoff), - /* K2 */ be_nested_str_weak(tasmota_relay_index), - /* K3 */ be_nested_str_weak(find), - /* K4 */ be_nested_str_weak(ARG), - /* K5 */ be_const_int(0), - }), - be_str_weak(init), - &be_const_str_solidified, - ( &(const binstruction[20]) { /* code */ - 0x60100003, // 0000 GETGBL R4 G3 - 0x5C140000, // 0001 MOVE R5 R0 - 0x7C100200, // 0002 CALL R4 1 - 0x8C100900, // 0003 GETMET R4 R4 K0 - 0x5C180200, // 0004 MOVE R6 R1 - 0x5C1C0400, // 0005 MOVE R7 R2 - 0x5C200600, // 0006 MOVE R8 R3 - 0x7C100800, // 0007 CALL R4 4 - 0x8C100101, // 0008 GETMET R4 R0 K1 - 0x7C100200, // 0009 CALL R4 1 - 0x8C100703, // 000A GETMET R4 R3 K3 - 0x88180104, // 000B GETMBR R6 R0 K4 - 0x7C100400, // 000C CALL R4 2 - 0x90020404, // 000D SETMBR R0 K2 R4 - 0x88100102, // 000E GETMBR R4 R0 K2 - 0x4C140000, // 000F LDNIL R5 - 0x1C100805, // 0010 EQ R4 R4 R5 - 0x78120000, // 0011 JMPF R4 #0013 - 0x90020505, // 0012 SETMBR R0 K2 K5 - 0x80000000, // 0013 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: invoke_request -********************************************************************/ -be_local_closure(Matter_Plugin_OnOff_invoke_request, /* name */ - be_nested_proto( - 13, /* nstack */ - 4, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[13]) { /* constants */ - /* K0 */ be_nested_str_weak(matter), - /* K1 */ be_nested_str_weak(TLV), - /* K2 */ be_nested_str_weak(cluster), - /* K3 */ be_nested_str_weak(command), - /* K4 */ be_const_int(3), - /* K5 */ be_const_int(0), - /* K6 */ be_const_int(1), - /* K7 */ be_nested_str_weak(Matter_TLV_struct), - /* K8 */ be_nested_str_weak(add_TLV), - /* K9 */ be_nested_str_weak(U2), - /* K10 */ be_nested_str_weak(set_onoff), - /* K11 */ be_const_int(2), - /* K12 */ be_nested_str_weak(get_onoff), - }), - be_str_weak(invoke_request), - &be_const_str_solidified, - ( &(const binstruction[119]) { /* code */ - 0xB8120000, // 0000 GETNGBL R4 K0 - 0x88100901, // 0001 GETMBR R4 R4 K1 - 0x88140702, // 0002 GETMBR R5 R3 K2 - 0x88180703, // 0003 GETMBR R6 R3 K3 - 0x1C1C0B04, // 0004 EQ R7 R5 K4 - 0x781E0016, // 0005 JMPF R7 #001D - 0x1C1C0D05, // 0006 EQ R7 R6 K5 - 0x781E0002, // 0007 JMPF R7 #000B - 0x501C0200, // 0008 LDBOOL R7 1 0 - 0x80040E00, // 0009 RET 1 R7 - 0x70020010, // 000A JMP #001C - 0x1C1C0D06, // 000B EQ R7 R6 K6 - 0x781E0009, // 000C JMPF R7 #0017 - 0x8C1C0907, // 000D GETMET R7 R4 K7 - 0x7C1C0200, // 000E CALL R7 1 - 0x8C200F08, // 000F GETMET R8 R7 K8 - 0x58280005, // 0010 LDCONST R10 K5 - 0x882C0909, // 0011 GETMBR R11 R4 K9 - 0x58300005, // 0012 LDCONST R12 K5 - 0x7C200800, // 0013 CALL R8 4 - 0x900E0705, // 0014 SETMBR R3 K3 K5 - 0x80040E00, // 0015 RET 1 R7 - 0x70020004, // 0016 JMP #001C - 0x541E003F, // 0017 LDINT R7 64 - 0x1C1C0C07, // 0018 EQ R7 R6 R7 - 0x781E0001, // 0019 JMPF R7 #001C - 0x501C0200, // 001A LDBOOL R7 1 0 - 0x80040E00, // 001B RET 1 R7 - 0x70020058, // 001C JMP #0076 - 0x541E0003, // 001D LDINT R7 4 - 0x1C1C0A07, // 001E EQ R7 R5 R7 - 0x781E0002, // 001F JMPF R7 #0023 - 0x501C0200, // 0020 LDBOOL R7 1 0 - 0x80040E00, // 0021 RET 1 R7 - 0x70020052, // 0022 JMP #0076 - 0x541E0004, // 0023 LDINT R7 5 - 0x1C1C0A07, // 0024 EQ R7 R5 R7 - 0x781E0002, // 0025 JMPF R7 #0029 - 0x501C0200, // 0026 LDBOOL R7 1 0 - 0x80040E00, // 0027 RET 1 R7 - 0x7002004C, // 0028 JMP #0076 - 0x541E0005, // 0029 LDINT R7 6 - 0x1C1C0A07, // 002A EQ R7 R5 R7 - 0x781E001B, // 002B JMPF R7 #0048 - 0x1C1C0D05, // 002C EQ R7 R6 K5 - 0x781E0005, // 002D JMPF R7 #0034 - 0x8C1C010A, // 002E GETMET R7 R0 K10 - 0x50240000, // 002F LDBOOL R9 0 0 - 0x7C1C0400, // 0030 CALL R7 2 - 0x501C0200, // 0031 LDBOOL R7 1 0 - 0x80040E00, // 0032 RET 1 R7 - 0x70020012, // 0033 JMP #0047 - 0x1C1C0D06, // 0034 EQ R7 R6 K6 - 0x781E0005, // 0035 JMPF R7 #003C - 0x8C1C010A, // 0036 GETMET R7 R0 K10 - 0x50240200, // 0037 LDBOOL R9 1 0 - 0x7C1C0400, // 0038 CALL R7 2 - 0x501C0200, // 0039 LDBOOL R7 1 0 - 0x80040E00, // 003A RET 1 R7 - 0x7002000A, // 003B JMP #0047 - 0x1C1C0D0B, // 003C EQ R7 R6 K11 - 0x781E0008, // 003D JMPF R7 #0047 - 0x8C1C010A, // 003E GETMET R7 R0 K10 - 0x8C24010C, // 003F GETMET R9 R0 K12 - 0x7C240200, // 0040 CALL R9 1 - 0x78260000, // 0041 JMPF R9 #0043 - 0x50240001, // 0042 LDBOOL R9 0 1 - 0x50240200, // 0043 LDBOOL R9 1 0 - 0x7C1C0400, // 0044 CALL R7 2 - 0x501C0200, // 0045 LDBOOL R7 1 0 - 0x80040E00, // 0046 RET 1 R7 - 0x7002002D, // 0047 JMP #0076 - 0x541E0007, // 0048 LDINT R7 8 - 0x1C1C0A07, // 0049 EQ R7 R5 R7 - 0x781E002A, // 004A JMPF R7 #0076 - 0x1C1C0D05, // 004B EQ R7 R6 K5 - 0x781E0002, // 004C JMPF R7 #0050 - 0x501C0200, // 004D LDBOOL R7 1 0 - 0x80040E00, // 004E RET 1 R7 - 0x70020025, // 004F JMP #0076 - 0x1C1C0D06, // 0050 EQ R7 R6 K6 - 0x781E0002, // 0051 JMPF R7 #0055 - 0x501C0200, // 0052 LDBOOL R7 1 0 - 0x80040E00, // 0053 RET 1 R7 - 0x70020020, // 0054 JMP #0076 - 0x1C1C0D0B, // 0055 EQ R7 R6 K11 - 0x781E0002, // 0056 JMPF R7 #005A - 0x501C0200, // 0057 LDBOOL R7 1 0 - 0x80040E00, // 0058 RET 1 R7 - 0x7002001B, // 0059 JMP #0076 - 0x1C1C0D04, // 005A EQ R7 R6 K4 - 0x781E0002, // 005B JMPF R7 #005F - 0x501C0200, // 005C LDBOOL R7 1 0 - 0x80040E00, // 005D RET 1 R7 - 0x70020016, // 005E JMP #0076 - 0x541E0003, // 005F LDINT R7 4 - 0x1C1C0C07, // 0060 EQ R7 R6 R7 - 0x781E0002, // 0061 JMPF R7 #0065 - 0x501C0200, // 0062 LDBOOL R7 1 0 - 0x80040E00, // 0063 RET 1 R7 - 0x70020010, // 0064 JMP #0076 - 0x541E0004, // 0065 LDINT R7 5 - 0x1C1C0C07, // 0066 EQ R7 R6 R7 - 0x781E0002, // 0067 JMPF R7 #006B - 0x501C0200, // 0068 LDBOOL R7 1 0 - 0x80040E00, // 0069 RET 1 R7 - 0x7002000A, // 006A JMP #0076 - 0x541E0005, // 006B LDINT R7 6 - 0x1C1C0C07, // 006C EQ R7 R6 R7 - 0x781E0002, // 006D JMPF R7 #0071 - 0x501C0200, // 006E LDBOOL R7 1 0 - 0x80040E00, // 006F RET 1 R7 - 0x70020004, // 0070 JMP #0076 - 0x541E0006, // 0071 LDINT R7 7 - 0x1C1C0C07, // 0072 EQ R7 R6 R7 - 0x781E0001, // 0073 JMPF R7 #0076 - 0x501C0200, // 0074 LDBOOL R7 1 0 - 0x80040E00, // 0075 RET 1 R7 - 0x80000000, // 0076 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: set_onoff -********************************************************************/ -be_local_closure(Matter_Plugin_OnOff_set_onoff, /* name */ - be_nested_proto( - 7, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 4]) { /* constants */ - /* K0 */ be_nested_str_weak(tasmota), - /* K1 */ be_nested_str_weak(set_power), - /* K2 */ be_nested_str_weak(tasmota_relay_index), - /* K3 */ be_nested_str_weak(get_onoff), - }), - be_str_weak(set_onoff), - &be_const_str_solidified, - ( &(const binstruction[10]) { /* code */ - 0xB80A0000, // 0000 GETNGBL R2 K0 - 0x8C080501, // 0001 GETMET R2 R2 K1 - 0x88100102, // 0002 GETMBR R4 R0 K2 - 0x60140017, // 0003 GETGBL R5 G23 - 0x5C180200, // 0004 MOVE R6 R1 - 0x7C140200, // 0005 CALL R5 1 - 0x7C080600, // 0006 CALL R2 3 - 0x8C080103, // 0007 GETMET R2 R0 K3 - 0x7C080200, // 0008 CALL R2 1 - 0x80000000, // 0009 RET 0 - }) - ) -); -/*******************************************************************/ - - /******************************************************************** ** Solidified function: ********************************************************************/ @@ -278,11 +34,138 @@ be_local_closure(Matter_Plugin_OnOff__X3Clambda_X3E, /* name */ /******************************************************************** -** Solidified function: get_onoff +** Solidified function: invoke_request ********************************************************************/ -be_local_closure(Matter_Plugin_OnOff_get_onoff, /* name */ +be_local_closure(Matter_Plugin_OnOff_invoke_request, /* name */ be_nested_proto( - 5, /* nstack */ + 10, /* nstack */ + 4, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[11]) { /* constants */ + /* K0 */ be_nested_str_weak(matter), + /* K1 */ be_nested_str_weak(TLV), + /* K2 */ be_nested_str_weak(cluster), + /* K3 */ be_nested_str_weak(command), + /* K4 */ be_nested_str_weak(update_shadow_lazy), + /* K5 */ be_const_int(0), + /* K6 */ be_nested_str_weak(set_onoff), + /* K7 */ be_nested_str_weak(update_shadow), + /* K8 */ be_const_int(1), + /* K9 */ be_const_int(2), + /* K10 */ be_nested_str_weak(shadow_onoff), + }), + be_str_weak(invoke_request), + &be_const_str_solidified, + ( &(const binstruction[42]) { /* code */ + 0xB8120000, // 0000 GETNGBL R4 K0 + 0x88100901, // 0001 GETMBR R4 R4 K1 + 0x88140702, // 0002 GETMBR R5 R3 K2 + 0x88180703, // 0003 GETMBR R6 R3 K3 + 0x541E0005, // 0004 LDINT R7 6 + 0x1C1C0A07, // 0005 EQ R7 R5 R7 + 0x781E0021, // 0006 JMPF R7 #0029 + 0x8C1C0104, // 0007 GETMET R7 R0 K4 + 0x7C1C0200, // 0008 CALL R7 1 + 0x1C1C0D05, // 0009 EQ R7 R6 K5 + 0x781E0007, // 000A JMPF R7 #0013 + 0x8C1C0106, // 000B GETMET R7 R0 K6 + 0x50240000, // 000C LDBOOL R9 0 0 + 0x7C1C0400, // 000D CALL R7 2 + 0x8C1C0107, // 000E GETMET R7 R0 K7 + 0x7C1C0200, // 000F CALL R7 1 + 0x501C0200, // 0010 LDBOOL R7 1 0 + 0x80040E00, // 0011 RET 1 R7 + 0x70020015, // 0012 JMP #0029 + 0x1C1C0D08, // 0013 EQ R7 R6 K8 + 0x781E0007, // 0014 JMPF R7 #001D + 0x8C1C0106, // 0015 GETMET R7 R0 K6 + 0x50240200, // 0016 LDBOOL R9 1 0 + 0x7C1C0400, // 0017 CALL R7 2 + 0x8C1C0107, // 0018 GETMET R7 R0 K7 + 0x7C1C0200, // 0019 CALL R7 1 + 0x501C0200, // 001A LDBOOL R7 1 0 + 0x80040E00, // 001B RET 1 R7 + 0x7002000B, // 001C JMP #0029 + 0x1C1C0D09, // 001D EQ R7 R6 K9 + 0x781E0009, // 001E JMPF R7 #0029 + 0x8C1C0106, // 001F GETMET R7 R0 K6 + 0x8824010A, // 0020 GETMBR R9 R0 K10 + 0x78260000, // 0021 JMPF R9 #0023 + 0x50240001, // 0022 LDBOOL R9 0 1 + 0x50240200, // 0023 LDBOOL R9 1 0 + 0x7C1C0400, // 0024 CALL R7 2 + 0x8C1C0107, // 0025 GETMET R7 R0 K7 + 0x7C1C0200, // 0026 CALL R7 1 + 0x501C0200, // 0027 LDBOOL R7 1 0 + 0x80040E00, // 0028 RET 1 R7 + 0x80000000, // 0029 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: init +********************************************************************/ +be_local_closure(Matter_Plugin_OnOff_init, /* name */ + be_nested_proto( + 9, /* nstack */ + 4, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 6]) { /* constants */ + /* K0 */ be_nested_str_weak(init), + /* K1 */ be_nested_str_weak(shadow_onoff), + /* K2 */ be_nested_str_weak(tasmota_relay_index), + /* K3 */ be_nested_str_weak(find), + /* K4 */ be_nested_str_weak(ARG), + /* K5 */ be_const_int(0), + }), + be_str_weak(init), + &be_const_str_solidified, + ( &(const binstruction[20]) { /* code */ + 0x60100003, // 0000 GETGBL R4 G3 + 0x5C140000, // 0001 MOVE R5 R0 + 0x7C100200, // 0002 CALL R4 1 + 0x8C100900, // 0003 GETMET R4 R4 K0 + 0x5C180200, // 0004 MOVE R6 R1 + 0x5C1C0400, // 0005 MOVE R7 R2 + 0x5C200600, // 0006 MOVE R8 R3 + 0x7C100800, // 0007 CALL R4 4 + 0x50100000, // 0008 LDBOOL R4 0 0 + 0x90020204, // 0009 SETMBR R0 K1 R4 + 0x8C100703, // 000A GETMET R4 R3 K3 + 0x88180104, // 000B GETMBR R6 R0 K4 + 0x7C100400, // 000C CALL R4 2 + 0x90020404, // 000D SETMBR R0 K2 R4 + 0x88100102, // 000E GETMBR R4 R0 K2 + 0x4C140000, // 000F LDNIL R5 + 0x1C100805, // 0010 EQ R4 R4 R5 + 0x78120000, // 0011 JMPF R4 #0013 + 0x90020505, // 0012 SETMBR R0 K2 K5 + 0x80000000, // 0013 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: update_shadow +********************************************************************/ +be_local_closure(Matter_Plugin_OnOff_update_shadow, /* name */ + be_nested_proto( + 6, /* nstack */ 1, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -290,14 +173,16 @@ be_local_closure(Matter_Plugin_OnOff_get_onoff, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[ 5]) { /* constants */ + ( &(const bvalue[ 7]) { /* constants */ /* K0 */ be_nested_str_weak(tasmota), /* K1 */ be_nested_str_weak(get_power), /* K2 */ be_nested_str_weak(tasmota_relay_index), /* K3 */ be_nested_str_weak(shadow_onoff), - /* K4 */ be_nested_str_weak(onoff_changed), + /* K4 */ be_nested_str_weak(attribute_updated), + /* K5 */ be_const_int(0), + /* K6 */ be_nested_str_weak(update_shadow), }), - be_str_weak(get_onoff), + be_str_weak(update_shadow), &be_const_str_solidified, ( &(const binstruction[28]) { /* code */ 0xB8060000, // 0000 GETNGBL R1 K0 @@ -306,28 +191,28 @@ be_local_closure(Matter_Plugin_OnOff_get_onoff, /* name */ 0x7C040400, // 0003 CALL R1 2 0x4C080000, // 0004 LDNIL R2 0x20080202, // 0005 NE R2 R1 R2 - 0x780A000C, // 0006 JMPF R2 #0014 + 0x780A000E, // 0006 JMPF R2 #0016 0x88080103, // 0007 GETMBR R2 R0 K3 0x4C0C0000, // 0008 LDNIL R3 0x20080403, // 0009 NE R2 R2 R3 - 0x780A0007, // 000A JMPF R2 #0013 + 0x780A0009, // 000A JMPF R2 #0015 0x88080103, // 000B GETMBR R2 R0 K3 0x600C0017, // 000C GETGBL R3 G23 0x5C100200, // 000D MOVE R4 R1 0x7C0C0200, // 000E CALL R3 1 0x20080403, // 000F NE R2 R2 R3 - 0x780A0001, // 0010 JMPF R2 #0013 + 0x780A0003, // 0010 JMPF R2 #0015 0x8C080104, // 0011 GETMET R2 R0 K4 - 0x7C080200, // 0012 CALL R2 1 - 0x90020601, // 0013 SETMBR R0 K3 R1 - 0x88080103, // 0014 GETMBR R2 R0 K3 - 0x4C0C0000, // 0015 LDNIL R3 - 0x1C080403, // 0016 EQ R2 R2 R3 - 0x780A0001, // 0017 JMPF R2 #001A - 0x50080000, // 0018 LDBOOL R2 0 0 - 0x90020602, // 0019 SETMBR R0 K3 R2 - 0x88080103, // 001A GETMBR R2 R0 K3 - 0x80040400, // 001B RET 1 R2 + 0x54120005, // 0012 LDINT R4 6 + 0x58140005, // 0013 LDCONST R5 K5 + 0x7C080600, // 0014 CALL R2 3 + 0x90020601, // 0015 SETMBR R0 K3 R1 + 0x60080003, // 0016 GETGBL R2 G3 + 0x5C0C0000, // 0017 MOVE R3 R0 + 0x7C080200, // 0018 CALL R2 1 + 0x8C080506, // 0019 GETMET R2 R2 K6 + 0x7C080200, // 001A CALL R2 1 + 0x80000000, // 001B RET 0 }) ) ); @@ -335,27 +220,37 @@ be_local_closure(Matter_Plugin_OnOff_get_onoff, /* name */ /******************************************************************** -** Solidified function: every_second +** Solidified function: set_onoff ********************************************************************/ -be_local_closure(Matter_Plugin_OnOff_every_second, /* name */ +be_local_closure(Matter_Plugin_OnOff_set_onoff, /* name */ be_nested_proto( - 3, /* nstack */ - 1, /* argc */ + 7, /* nstack */ + 2, /* argc */ 2, /* varg */ 0, /* has upvals */ NULL, /* no upvals */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[ 1]) { /* constants */ - /* K0 */ be_nested_str_weak(get_onoff), + ( &(const bvalue[ 4]) { /* constants */ + /* K0 */ be_nested_str_weak(tasmota), + /* K1 */ be_nested_str_weak(set_power), + /* K2 */ be_nested_str_weak(tasmota_relay_index), + /* K3 */ be_nested_str_weak(update_shadow), }), - be_str_weak(every_second), + be_str_weak(set_onoff), &be_const_str_solidified, - ( &(const binstruction[ 3]) { /* code */ - 0x8C040100, // 0000 GETMET R1 R0 K0 - 0x7C040200, // 0001 CALL R1 1 - 0x80000000, // 0002 RET 0 + ( &(const binstruction[10]) { /* code */ + 0xB80A0000, // 0000 GETNGBL R2 K0 + 0x8C080501, // 0001 GETMET R2 R2 K1 + 0x88100102, // 0002 GETMBR R4 R0 K2 + 0x60140017, // 0003 GETGBL R5 G23 + 0x5C180200, // 0004 MOVE R6 R1 + 0x7C140200, // 0005 CALL R5 1 + 0x7C080600, // 0006 CALL R2 3 + 0x8C080103, // 0007 GETMET R2 R0 K3 + 0x7C080200, // 0008 CALL R2 1 + 0x80000000, // 0009 RET 0 }) ) ); @@ -367,7 +262,7 @@ be_local_closure(Matter_Plugin_OnOff_every_second, /* name */ ********************************************************************/ be_local_closure(Matter_Plugin_OnOff_read_attribute, /* name */ be_nested_proto( - 12, /* nstack */ + 11, /* nstack */ 3, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -375,232 +270,68 @@ be_local_closure(Matter_Plugin_OnOff_read_attribute, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[15]) { /* constants */ + ( &(const bvalue[12]) { /* constants */ /* K0 */ be_nested_str_weak(string), /* K1 */ be_nested_str_weak(matter), /* K2 */ be_nested_str_weak(TLV), /* K3 */ be_nested_str_weak(cluster), /* K4 */ be_nested_str_weak(attribute), - /* K5 */ be_const_int(3), + /* K5 */ be_nested_str_weak(update_shadow_lazy), /* K6 */ be_const_int(0), /* K7 */ be_nested_str_weak(create_TLV), - /* K8 */ be_nested_str_weak(U2), - /* K9 */ be_const_int(1), - /* K10 */ be_nested_str_weak(U1), - /* K11 */ be_nested_str_weak(U4), - /* K12 */ be_nested_str_weak(BOOL), - /* K13 */ be_nested_str_weak(get_onoff), - /* K14 */ be_nested_str_weak(read_attribute), + /* K8 */ be_nested_str_weak(BOOL), + /* K9 */ be_nested_str_weak(shadow_onoff), + /* K10 */ be_nested_str_weak(U4), + /* K11 */ be_nested_str_weak(read_attribute), }), be_str_weak(read_attribute), &be_const_str_solidified, - ( &(const binstruction[174]) { /* code */ + ( &(const binstruction[45]) { /* code */ 0xA40E0000, // 0000 IMPORT R3 K0 0xB8120200, // 0001 GETNGBL R4 K1 0x88100902, // 0002 GETMBR R4 R4 K2 0x88140503, // 0003 GETMBR R5 R2 K3 0x88180504, // 0004 GETMBR R6 R2 K4 - 0x1C1C0B05, // 0005 EQ R7 R5 K5 - 0x781E0021, // 0006 JMPF R7 #0029 - 0x1C1C0D06, // 0007 EQ R7 R6 K6 - 0x781E0005, // 0008 JMPF R7 #000F - 0x8C1C0907, // 0009 GETMET R7 R4 K7 - 0x88240908, // 000A GETMBR R9 R4 K8 - 0x58280006, // 000B LDCONST R10 K6 - 0x7C1C0600, // 000C CALL R7 3 - 0x80040E00, // 000D RET 1 R7 - 0x70020018, // 000E JMP #0028 - 0x1C1C0D09, // 000F EQ R7 R6 K9 - 0x781E0005, // 0010 JMPF R7 #0017 - 0x8C1C0907, // 0011 GETMET R7 R4 K7 - 0x8824090A, // 0012 GETMBR R9 R4 K10 - 0x58280006, // 0013 LDCONST R10 K6 - 0x7C1C0600, // 0014 CALL R7 3 - 0x80040E00, // 0015 RET 1 R7 - 0x70020010, // 0016 JMP #0028 - 0x541EFFFB, // 0017 LDINT R7 65532 - 0x1C1C0C07, // 0018 EQ R7 R6 R7 - 0x781E0005, // 0019 JMPF R7 #0020 - 0x8C1C0907, // 001A GETMET R7 R4 K7 - 0x8824090B, // 001B GETMBR R9 R4 K11 - 0x58280006, // 001C LDCONST R10 K6 - 0x7C1C0600, // 001D CALL R7 3 - 0x80040E00, // 001E RET 1 R7 - 0x70020007, // 001F JMP #0028 - 0x541EFFFC, // 0020 LDINT R7 65533 - 0x1C1C0C07, // 0021 EQ R7 R6 R7 - 0x781E0004, // 0022 JMPF R7 #0028 - 0x8C1C0907, // 0023 GETMET R7 R4 K7 - 0x8824090B, // 0024 GETMBR R9 R4 K11 - 0x542A0003, // 0025 LDINT R10 4 - 0x7C1C0600, // 0026 CALL R7 3 - 0x80040E00, // 0027 RET 1 R7 - 0x70020083, // 0028 JMP #00AD - 0x541E0003, // 0029 LDINT R7 4 - 0x1C1C0A07, // 002A EQ R7 R5 R7 - 0x781E0016, // 002B JMPF R7 #0043 - 0x1C1C0D06, // 002C EQ R7 R6 K6 - 0x781E0002, // 002D JMPF R7 #0031 - 0x4C1C0000, // 002E LDNIL R7 - 0x80040E00, // 002F RET 1 R7 - 0x70020010, // 0030 JMP #0042 - 0x541EFFFB, // 0031 LDINT R7 65532 - 0x1C1C0C07, // 0032 EQ R7 R6 R7 - 0x781E0005, // 0033 JMPF R7 #003A - 0x8C1C0907, // 0034 GETMET R7 R4 K7 - 0x8824090B, // 0035 GETMBR R9 R4 K11 - 0x58280006, // 0036 LDCONST R10 K6 - 0x7C1C0600, // 0037 CALL R7 3 - 0x80040E00, // 0038 RET 1 R7 - 0x70020007, // 0039 JMP #0042 - 0x541EFFFC, // 003A LDINT R7 65533 - 0x1C1C0C07, // 003B EQ R7 R6 R7 - 0x781E0004, // 003C JMPF R7 #0042 - 0x8C1C0907, // 003D GETMET R7 R4 K7 - 0x8824090B, // 003E GETMBR R9 R4 K11 - 0x542A0003, // 003F LDINT R10 4 - 0x7C1C0600, // 0040 CALL R7 3 - 0x80040E00, // 0041 RET 1 R7 - 0x70020069, // 0042 JMP #00AD - 0x541E0004, // 0043 LDINT R7 5 - 0x1C1C0A07, // 0044 EQ R7 R5 R7 - 0x781E0011, // 0045 JMPF R7 #0058 - 0x541EFFFB, // 0046 LDINT R7 65532 - 0x1C1C0C07, // 0047 EQ R7 R6 R7 - 0x781E0005, // 0048 JMPF R7 #004F - 0x8C1C0907, // 0049 GETMET R7 R4 K7 - 0x8824090B, // 004A GETMBR R9 R4 K11 - 0x58280006, // 004B LDCONST R10 K6 - 0x7C1C0600, // 004C CALL R7 3 - 0x80040E00, // 004D RET 1 R7 - 0x70020007, // 004E JMP #0057 - 0x541EFFFC, // 004F LDINT R7 65533 - 0x1C1C0C07, // 0050 EQ R7 R6 R7 - 0x781E0004, // 0051 JMPF R7 #0057 - 0x8C1C0907, // 0052 GETMET R7 R4 K7 - 0x8824090B, // 0053 GETMBR R9 R4 K11 - 0x542A0003, // 0054 LDINT R10 4 - 0x7C1C0600, // 0055 CALL R7 3 - 0x80040E00, // 0056 RET 1 R7 - 0x70020054, // 0057 JMP #00AD - 0x541E0005, // 0058 LDINT R7 6 - 0x1C1C0A07, // 0059 EQ R7 R5 R7 - 0x781E001A, // 005A JMPF R7 #0076 - 0x1C1C0D06, // 005B EQ R7 R6 K6 - 0x781E0006, // 005C JMPF R7 #0064 - 0x8C1C0907, // 005D GETMET R7 R4 K7 - 0x8824090C, // 005E GETMBR R9 R4 K12 - 0x8C28010D, // 005F GETMET R10 R0 K13 - 0x7C280200, // 0060 CALL R10 1 - 0x7C1C0600, // 0061 CALL R7 3 - 0x80040E00, // 0062 RET 1 R7 - 0x70020010, // 0063 JMP #0075 - 0x541EFFFB, // 0064 LDINT R7 65532 - 0x1C1C0C07, // 0065 EQ R7 R6 R7 - 0x781E0005, // 0066 JMPF R7 #006D - 0x8C1C0907, // 0067 GETMET R7 R4 K7 - 0x8824090B, // 0068 GETMBR R9 R4 K11 - 0x58280006, // 0069 LDCONST R10 K6 - 0x7C1C0600, // 006A CALL R7 3 - 0x80040E00, // 006B RET 1 R7 - 0x70020007, // 006C JMP #0075 - 0x541EFFFC, // 006D LDINT R7 65533 - 0x1C1C0C07, // 006E EQ R7 R6 R7 - 0x781E0004, // 006F JMPF R7 #0075 - 0x8C1C0907, // 0070 GETMET R7 R4 K7 - 0x8824090B, // 0071 GETMBR R9 R4 K11 - 0x542A0003, // 0072 LDINT R10 4 - 0x7C1C0600, // 0073 CALL R7 3 - 0x80040E00, // 0074 RET 1 R7 - 0x70020036, // 0075 JMP #00AD - 0x541E0007, // 0076 LDINT R7 8 - 0x1C1C0A07, // 0077 EQ R7 R5 R7 - 0x781E002B, // 0078 JMPF R7 #00A5 - 0x1C1C0D06, // 0079 EQ R7 R6 K6 - 0x781E0005, // 007A JMPF R7 #0081 - 0x8C1C0907, // 007B GETMET R7 R4 K7 - 0x8824090A, // 007C GETMBR R9 R4 K10 - 0x542A0087, // 007D LDINT R10 136 - 0x7C1C0600, // 007E CALL R7 3 - 0x80040E00, // 007F RET 1 R7 - 0x70020022, // 0080 JMP #00A4 - 0x541E000E, // 0081 LDINT R7 15 - 0x1C1C0C07, // 0082 EQ R7 R6 R7 - 0x781E0005, // 0083 JMPF R7 #008A - 0x8C1C0907, // 0084 GETMET R7 R4 K7 - 0x8824090A, // 0085 GETMBR R9 R4 K10 - 0x58280006, // 0086 LDCONST R10 K6 - 0x7C1C0600, // 0087 CALL R7 3 - 0x80040E00, // 0088 RET 1 R7 - 0x70020019, // 0089 JMP #00A4 - 0x541E000F, // 008A LDINT R7 16 - 0x1C1C0C07, // 008B EQ R7 R6 R7 - 0x781E0005, // 008C JMPF R7 #0093 - 0x8C1C0907, // 008D GETMET R7 R4 K7 - 0x8824090A, // 008E GETMBR R9 R4 K10 - 0x58280009, // 008F LDCONST R10 K9 - 0x7C1C0600, // 0090 CALL R7 3 - 0x80040E00, // 0091 RET 1 R7 - 0x70020010, // 0092 JMP #00A4 - 0x541EFFFB, // 0093 LDINT R7 65532 - 0x1C1C0C07, // 0094 EQ R7 R6 R7 - 0x781E0005, // 0095 JMPF R7 #009C - 0x8C1C0907, // 0096 GETMET R7 R4 K7 - 0x8824090B, // 0097 GETMBR R9 R4 K11 - 0x58280006, // 0098 LDCONST R10 K6 - 0x7C1C0600, // 0099 CALL R7 3 - 0x80040E00, // 009A RET 1 R7 - 0x70020007, // 009B JMP #00A4 - 0x541EFFFC, // 009C LDINT R7 65533 - 0x1C1C0C07, // 009D EQ R7 R6 R7 - 0x781E0004, // 009E JMPF R7 #00A4 - 0x8C1C0907, // 009F GETMET R7 R4 K7 - 0x8824090B, // 00A0 GETMBR R9 R4 K11 - 0x542A0003, // 00A1 LDINT R10 4 - 0x7C1C0600, // 00A2 CALL R7 3 - 0x80040E00, // 00A3 RET 1 R7 - 0x70020007, // 00A4 JMP #00AD - 0x601C0003, // 00A5 GETGBL R7 G3 - 0x5C200000, // 00A6 MOVE R8 R0 - 0x7C1C0200, // 00A7 CALL R7 1 - 0x8C1C0F0E, // 00A8 GETMET R7 R7 K14 - 0x5C240200, // 00A9 MOVE R9 R1 - 0x5C280400, // 00AA MOVE R10 R2 - 0x7C1C0600, // 00AB CALL R7 3 - 0x80040E00, // 00AC RET 1 R7 - 0x80000000, // 00AD RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: onoff_changed -********************************************************************/ -be_local_closure(Matter_Plugin_OnOff_onoff_changed, /* name */ - be_nested_proto( - 6, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 2]) { /* constants */ - /* K0 */ be_nested_str_weak(attribute_updated), - /* K1 */ be_const_int(0), - }), - be_str_weak(onoff_changed), - &be_const_str_solidified, - ( &(const binstruction[ 6]) { /* code */ - 0x8C040100, // 0000 GETMET R1 R0 K0 - 0x4C0C0000, // 0001 LDNIL R3 - 0x54120005, // 0002 LDINT R4 6 - 0x58140001, // 0003 LDCONST R5 K1 - 0x7C040800, // 0004 CALL R1 4 - 0x80000000, // 0005 RET 0 + 0x541E0005, // 0005 LDINT R7 6 + 0x1C1C0A07, // 0006 EQ R7 R5 R7 + 0x781E001B, // 0007 JMPF R7 #0024 + 0x8C1C0105, // 0008 GETMET R7 R0 K5 + 0x7C1C0200, // 0009 CALL R7 1 + 0x1C1C0D06, // 000A EQ R7 R6 K6 + 0x781E0005, // 000B JMPF R7 #0012 + 0x8C1C0907, // 000C GETMET R7 R4 K7 + 0x88240908, // 000D GETMBR R9 R4 K8 + 0x88280109, // 000E GETMBR R10 R0 K9 + 0x7C1C0600, // 000F CALL R7 3 + 0x80040E00, // 0010 RET 1 R7 + 0x70020010, // 0011 JMP #0023 + 0x541EFFFB, // 0012 LDINT R7 65532 + 0x1C1C0C07, // 0013 EQ R7 R6 R7 + 0x781E0005, // 0014 JMPF R7 #001B + 0x8C1C0907, // 0015 GETMET R7 R4 K7 + 0x8824090A, // 0016 GETMBR R9 R4 K10 + 0x58280006, // 0017 LDCONST R10 K6 + 0x7C1C0600, // 0018 CALL R7 3 + 0x80040E00, // 0019 RET 1 R7 + 0x70020007, // 001A JMP #0023 + 0x541EFFFC, // 001B LDINT R7 65533 + 0x1C1C0C07, // 001C EQ R7 R6 R7 + 0x781E0004, // 001D JMPF R7 #0023 + 0x8C1C0907, // 001E GETMET R7 R4 K7 + 0x8824090A, // 001F GETMBR R9 R4 K10 + 0x542A0003, // 0020 LDINT R10 4 + 0x7C1C0600, // 0021 CALL R7 3 + 0x80040E00, // 0022 RET 1 R7 + 0x70020007, // 0023 JMP #002C + 0x601C0003, // 0024 GETGBL R7 G3 + 0x5C200000, // 0025 MOVE R8 R0 + 0x7C1C0200, // 0026 CALL R7 1 + 0x8C1C0F0B, // 0027 GETMET R7 R7 K11 + 0x5C240200, // 0028 MOVE R9 R1 + 0x5C280400, // 0029 MOVE R10 R2 + 0x7C1C0600, // 002A CALL R7 3 + 0x80040E00, // 002B RET 1 R7 + 0x80000000, // 002C RET 0 }) ) ); @@ -610,45 +341,25 @@ be_local_closure(Matter_Plugin_OnOff_onoff_changed, /* name */ /******************************************************************** ** Solidified class: Matter_Plugin_OnOff ********************************************************************/ -extern const bclass be_class_Matter_Plugin; +extern const bclass be_class_Matter_Plugin_Device; be_local_class(Matter_Plugin_OnOff, 2, - &be_class_Matter_Plugin, - be_nested_map(15, + &be_class_Matter_Plugin_Device, + be_nested_map(13, ( (struct bmapnode*) &(const bmapnode[]) { - { be_const_key_weak(init, 8), be_const_closure(Matter_Plugin_OnOff_init_closure) }, - { be_const_key_weak(TYPES, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { + { be_const_key_weak(ARG, 4), be_nested_str_weak(relay) }, + { be_const_key_weak(tasmota_relay_index, -1), be_const_var(0) }, + { be_const_key_weak(TYPE, -1), be_nested_str_weak(relay) }, + { be_const_key_weak(ARG_TYPE, -1), be_const_static_closure(Matter_Plugin_OnOff__X3Clambda_X3E_closure) }, + { be_const_key_weak(shadow_onoff, -1), be_const_var(1) }, + { be_const_key_weak(invoke_request, -1), be_const_closure(Matter_Plugin_OnOff_invoke_request_closure) }, + { be_const_key_weak(init, -1), be_const_closure(Matter_Plugin_OnOff_init_closure) }, + { be_const_key_weak(update_shadow, -1), be_const_closure(Matter_Plugin_OnOff_update_shadow_closure) }, + { be_const_key_weak(read_attribute, -1), be_const_closure(Matter_Plugin_OnOff_read_attribute_closure) }, + { be_const_key_weak(NAME, -1), be_nested_str_weak(Relay) }, + { be_const_key_weak(CLUSTERS, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { be_const_map( * be_nested_map(1, ( (struct bmapnode*) &(const bmapnode[]) { - { be_const_key_int(266, -1), be_const_int(2) }, - })) ) } )) }, - { be_const_key_weak(invoke_request, -1), be_const_closure(Matter_Plugin_OnOff_invoke_request_closure) }, - { be_const_key_weak(set_onoff, -1), be_const_closure(Matter_Plugin_OnOff_set_onoff_closure) }, - { be_const_key_weak(ARG_TYPE, 7), be_const_static_closure(Matter_Plugin_OnOff__X3Clambda_X3E_closure) }, - { be_const_key_weak(tasmota_relay_index, 1), be_const_var(0) }, - { be_const_key_weak(TYPE, -1), be_nested_str_weak(relay) }, - { be_const_key_weak(CLUSTERS, 6), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { - be_const_map( * be_nested_map(4, - ( (struct bmapnode*) &(const bmapnode[]) { - { be_const_key_int(4, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_list, { - be_const_list( * be_nested_list(3, - ( (struct bvalue*) &(const bvalue[]) { - be_const_int(0), - be_const_int(65532), - be_const_int(65533), - })) ) } )) }, - { be_const_key_int(5, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_list, { - be_const_list( * be_nested_list(8, - ( (struct bvalue*) &(const bvalue[]) { - be_const_int(0), - be_const_int(1), - be_const_int(2), - be_const_int(3), - be_const_int(4), - be_const_int(5), - be_const_int(65532), - be_const_int(65533), - })) ) } )) }, { be_const_key_int(6, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_list, { be_const_list( * be_nested_list(3, ( (struct bvalue*) &(const bvalue[]) { @@ -656,22 +367,13 @@ be_local_class(Matter_Plugin_OnOff, be_const_int(65532), be_const_int(65533), })) ) } )) }, - { be_const_key_int(3, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_list, { - be_const_list( * be_nested_list(4, - ( (struct bvalue*) &(const bvalue[]) { - be_const_int(0), - be_const_int(1), - be_const_int(65532), - be_const_int(65533), })) ) } )) }, + { be_const_key_weak(set_onoff, 8), be_const_closure(Matter_Plugin_OnOff_set_onoff_closure) }, + { be_const_key_weak(TYPES, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { + be_const_map( * be_nested_map(1, + ( (struct bmapnode*) &(const bmapnode[]) { + { be_const_key_int(266, -1), be_const_int(2) }, })) ) } )) }, - { be_const_key_weak(every_second, -1), be_const_closure(Matter_Plugin_OnOff_every_second_closure) }, - { be_const_key_weak(ARG, 11), be_nested_str_weak(relay) }, - { be_const_key_weak(get_onoff, -1), be_const_closure(Matter_Plugin_OnOff_get_onoff_closure) }, - { be_const_key_weak(NAME, -1), be_nested_str_weak(Relay) }, - { be_const_key_weak(read_attribute, -1), be_const_closure(Matter_Plugin_OnOff_read_attribute_closure) }, - { be_const_key_weak(shadow_onoff, -1), be_const_var(1) }, - { be_const_key_weak(onoff_changed, -1), be_const_closure(Matter_Plugin_OnOff_onoff_changed_closure) }, })), be_str_weak(Matter_Plugin_OnOff) ); diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Root.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Root.h index 05e8ec97d..2e52225b9 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Root.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Root.h @@ -45,7 +45,7 @@ be_local_closure(Matter_Plugin_Root_init, /* name */ ********************************************************************/ be_local_closure(Matter_Plugin_Root_write_attribute, /* name */ be_nested_proto( - 13, /* nstack */ + 12, /* nstack */ 4, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -53,7 +53,7 @@ be_local_closure(Matter_Plugin_Root_write_attribute, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[15]) { /* constants */ + ( &(const bvalue[14]) { /* constants */ /* K0 */ be_nested_str_weak(string), /* K1 */ be_nested_str_weak(matter), /* K2 */ be_nested_str_weak(TLV), @@ -64,15 +64,14 @@ be_local_closure(Matter_Plugin_Root_write_attribute, /* name */ /* K7 */ be_nested_str_weak(int64), /* K8 */ be_nested_str_weak(_breadcrumb), /* K9 */ be_nested_str_weak(attribute_updated), - /* K10 */ be_nested_str_weak(endpoint), - /* K11 */ be_nested_str_weak(status), - /* K12 */ be_nested_str_weak(CONSTRAINT_ERROR), - /* K13 */ be_const_int(1), - /* K14 */ be_nested_str_weak(INVALID_ACTION), + /* K10 */ be_nested_str_weak(status), + /* K11 */ be_nested_str_weak(CONSTRAINT_ERROR), + /* K12 */ be_const_int(1), + /* K13 */ be_nested_str_weak(INVALID_ACTION), }), be_str_weak(write_attribute), &be_const_str_solidified, - ( &(const binstruction[102]) { /* code */ + ( &(const binstruction[101]) { /* code */ 0xA4120000, // 0000 IMPORT R4 K0 0xB8160200, // 0001 GETNGBL R5 K1 0x88140B02, // 0002 GETMBR R5 R5 K2 @@ -80,9 +79,9 @@ be_local_closure(Matter_Plugin_Root_write_attribute, /* name */ 0x881C0504, // 0004 GETMBR R7 R2 K4 0x5422002F, // 0005 LDINT R8 48 0x1C200C08, // 0006 EQ R8 R6 R8 - 0x7822001A, // 0007 JMPF R8 #0023 + 0x78220019, // 0007 JMPF R8 #0022 0x1C200F05, // 0008 EQ R8 R7 K5 - 0x78220017, // 0009 JMPF R8 #0022 + 0x78220016, // 0009 JMPF R8 #0021 0x60200004, // 000A GETGBL R8 G4 0x5C240600, // 000B MOVE R9 R3 0x7C200200, // 000C CALL R8 1 @@ -92,89 +91,88 @@ be_local_closure(Matter_Plugin_Root_write_attribute, /* name */ 0x5C240600, // 0010 MOVE R9 R3 0xB82A0E00, // 0011 GETNGBL R10 K7 0x7C200400, // 0012 CALL R8 2 - 0x78220008, // 0013 JMPF R8 #001D + 0x78220007, // 0013 JMPF R8 #001C 0x90061003, // 0014 SETMBR R1 K8 R3 0x8C200109, // 0015 GETMET R8 R0 K9 - 0x8828050A, // 0016 GETMBR R10 R2 K10 - 0x882C0503, // 0017 GETMBR R11 R2 K3 - 0x88300504, // 0018 GETMBR R12 R2 K4 - 0x7C200800, // 0019 CALL R8 4 - 0x50200200, // 001A LDBOOL R8 1 0 - 0x80041000, // 001B RET 1 R8 - 0x70020004, // 001C JMP #0022 - 0xB8220200, // 001D GETNGBL R8 K1 - 0x8820110C, // 001E GETMBR R8 R8 K12 - 0x900A1608, // 001F SETMBR R2 K11 R8 - 0x50200000, // 0020 LDBOOL R8 0 0 - 0x80041000, // 0021 RET 1 R8 - 0x70020041, // 0022 JMP #0065 - 0x5422001E, // 0023 LDINT R8 31 - 0x1C200C08, // 0024 EQ R8 R6 R8 - 0x78220004, // 0025 JMPF R8 #002B - 0x1C200F05, // 0026 EQ R8 R7 K5 - 0x78220001, // 0027 JMPF R8 #002A - 0x50200200, // 0028 LDBOOL R8 1 0 - 0x80041000, // 0029 RET 1 R8 - 0x70020039, // 002A JMP #0065 - 0x54220027, // 002B LDINT R8 40 - 0x1C200C08, // 002C EQ R8 R6 R8 - 0x7822000B, // 002D JMPF R8 #003A - 0x54220004, // 002E LDINT R8 5 - 0x1C200E08, // 002F EQ R8 R7 R8 - 0x78220002, // 0030 JMPF R8 #0034 - 0x50200200, // 0031 LDBOOL R8 1 0 - 0x80041000, // 0032 RET 1 R8 - 0x70020004, // 0033 JMP #0039 - 0x54220005, // 0034 LDINT R8 6 - 0x1C200E08, // 0035 EQ R8 R7 R8 - 0x78220001, // 0036 JMPF R8 #0039 - 0x50200200, // 0037 LDBOOL R8 1 0 - 0x80041000, // 0038 RET 1 R8 - 0x7002002A, // 0039 JMP #0065 - 0x54220029, // 003A LDINT R8 42 - 0x1C200C08, // 003B EQ R8 R6 R8 - 0x78220004, // 003C JMPF R8 #0042 - 0x1C200F05, // 003D EQ R8 R7 K5 - 0x78220001, // 003E JMPF R8 #0041 - 0x50200200, // 003F LDBOOL R8 1 0 - 0x80041000, // 0040 RET 1 R8 - 0x70020022, // 0041 JMP #0065 - 0x5422002A, // 0042 LDINT R8 43 - 0x1C200C08, // 0043 EQ R8 R6 R8 - 0x78220007, // 0044 JMPF R8 #004D - 0x1C200F05, // 0045 EQ R8 R7 K5 - 0x78220004, // 0046 JMPF R8 #004C - 0xB8220200, // 0047 GETNGBL R8 K1 - 0x8820110C, // 0048 GETMBR R8 R8 K12 - 0x900A1608, // 0049 SETMBR R2 K11 R8 - 0x50200000, // 004A LDBOOL R8 0 0 - 0x80041000, // 004B RET 1 R8 - 0x70020017, // 004C JMP #0065 - 0x5422002B, // 004D LDINT R8 44 - 0x1C200C08, // 004E EQ R8 R6 R8 - 0x78220009, // 004F JMPF R8 #005A - 0x1C200F05, // 0050 EQ R8 R7 K5 - 0x78220002, // 0051 JMPF R8 #0055 - 0x50200200, // 0052 LDBOOL R8 1 0 - 0x80041000, // 0053 RET 1 R8 - 0x70020003, // 0054 JMP #0059 - 0x1C200F0D, // 0055 EQ R8 R7 K13 - 0x78220001, // 0056 JMPF R8 #0059 - 0x50200200, // 0057 LDBOOL R8 1 0 - 0x80041000, // 0058 RET 1 R8 - 0x7002000A, // 0059 JMP #0065 - 0x54220030, // 005A LDINT R8 49 - 0x1C200C08, // 005B EQ R8 R6 R8 - 0x78220007, // 005C JMPF R8 #0065 - 0x54220003, // 005D LDINT R8 4 - 0x1C200E08, // 005E EQ R8 R7 R8 - 0x78220004, // 005F JMPF R8 #0065 - 0xB8220200, // 0060 GETNGBL R8 K1 - 0x8820110E, // 0061 GETMBR R8 R8 K14 - 0x900A1608, // 0062 SETMBR R2 K11 R8 - 0x50200000, // 0063 LDBOOL R8 0 0 - 0x80041000, // 0064 RET 1 R8 - 0x80000000, // 0065 RET 0 + 0x88280503, // 0016 GETMBR R10 R2 K3 + 0x882C0504, // 0017 GETMBR R11 R2 K4 + 0x7C200600, // 0018 CALL R8 3 + 0x50200200, // 0019 LDBOOL R8 1 0 + 0x80041000, // 001A RET 1 R8 + 0x70020004, // 001B JMP #0021 + 0xB8220200, // 001C GETNGBL R8 K1 + 0x8820110B, // 001D GETMBR R8 R8 K11 + 0x900A1408, // 001E SETMBR R2 K10 R8 + 0x50200000, // 001F LDBOOL R8 0 0 + 0x80041000, // 0020 RET 1 R8 + 0x70020041, // 0021 JMP #0064 + 0x5422001E, // 0022 LDINT R8 31 + 0x1C200C08, // 0023 EQ R8 R6 R8 + 0x78220004, // 0024 JMPF R8 #002A + 0x1C200F05, // 0025 EQ R8 R7 K5 + 0x78220001, // 0026 JMPF R8 #0029 + 0x50200200, // 0027 LDBOOL R8 1 0 + 0x80041000, // 0028 RET 1 R8 + 0x70020039, // 0029 JMP #0064 + 0x54220027, // 002A LDINT R8 40 + 0x1C200C08, // 002B EQ R8 R6 R8 + 0x7822000B, // 002C JMPF R8 #0039 + 0x54220004, // 002D LDINT R8 5 + 0x1C200E08, // 002E EQ R8 R7 R8 + 0x78220002, // 002F JMPF R8 #0033 + 0x50200200, // 0030 LDBOOL R8 1 0 + 0x80041000, // 0031 RET 1 R8 + 0x70020004, // 0032 JMP #0038 + 0x54220005, // 0033 LDINT R8 6 + 0x1C200E08, // 0034 EQ R8 R7 R8 + 0x78220001, // 0035 JMPF R8 #0038 + 0x50200200, // 0036 LDBOOL R8 1 0 + 0x80041000, // 0037 RET 1 R8 + 0x7002002A, // 0038 JMP #0064 + 0x54220029, // 0039 LDINT R8 42 + 0x1C200C08, // 003A EQ R8 R6 R8 + 0x78220004, // 003B JMPF R8 #0041 + 0x1C200F05, // 003C EQ R8 R7 K5 + 0x78220001, // 003D JMPF R8 #0040 + 0x50200200, // 003E LDBOOL R8 1 0 + 0x80041000, // 003F RET 1 R8 + 0x70020022, // 0040 JMP #0064 + 0x5422002A, // 0041 LDINT R8 43 + 0x1C200C08, // 0042 EQ R8 R6 R8 + 0x78220007, // 0043 JMPF R8 #004C + 0x1C200F05, // 0044 EQ R8 R7 K5 + 0x78220004, // 0045 JMPF R8 #004B + 0xB8220200, // 0046 GETNGBL R8 K1 + 0x8820110B, // 0047 GETMBR R8 R8 K11 + 0x900A1408, // 0048 SETMBR R2 K10 R8 + 0x50200000, // 0049 LDBOOL R8 0 0 + 0x80041000, // 004A RET 1 R8 + 0x70020017, // 004B JMP #0064 + 0x5422002B, // 004C LDINT R8 44 + 0x1C200C08, // 004D EQ R8 R6 R8 + 0x78220009, // 004E JMPF R8 #0059 + 0x1C200F05, // 004F EQ R8 R7 K5 + 0x78220002, // 0050 JMPF R8 #0054 + 0x50200200, // 0051 LDBOOL R8 1 0 + 0x80041000, // 0052 RET 1 R8 + 0x70020003, // 0053 JMP #0058 + 0x1C200F0C, // 0054 EQ R8 R7 K12 + 0x78220001, // 0055 JMPF R8 #0058 + 0x50200200, // 0056 LDBOOL R8 1 0 + 0x80041000, // 0057 RET 1 R8 + 0x7002000A, // 0058 JMP #0064 + 0x54220030, // 0059 LDINT R8 49 + 0x1C200C08, // 005A EQ R8 R6 R8 + 0x78220007, // 005B JMPF R8 #0064 + 0x54220003, // 005C LDINT R8 4 + 0x1C200E08, // 005D EQ R8 R7 R8 + 0x78220004, // 005E JMPF R8 #0064 + 0xB8220200, // 005F GETNGBL R8 K1 + 0x8820110D, // 0060 GETMBR R8 R8 K13 + 0x900A1408, // 0061 SETMBR R2 K10 R8 + 0x50200000, // 0062 LDBOOL R8 0 0 + 0x80041000, // 0063 RET 1 R8 + 0x80000000, // 0064 RET 0 }) ) ); diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor.h index f91cef2c8..53e80ddfa 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor.h @@ -101,7 +101,7 @@ be_local_closure(Matter_Plugin_Sensor_parse_sensors, /* name */ /* K1 */ be_nested_str_weak(pre_value), /* K2 */ be_nested_str_weak(match), /* K3 */ be_nested_str_weak(shadow_value), - /* K4 */ be_nested_str_weak(valued_changed), + /* K4 */ be_nested_str_weak(value_changed), }), be_str_weak(parse_sensors), &be_const_str_solidified, @@ -134,9 +134,9 @@ be_local_closure(Matter_Plugin_Sensor_parse_sensors, /* name */ /******************************************************************** -** Solidified function: valued_changed +** Solidified function: value_changed ********************************************************************/ -be_local_closure(Matter_Plugin_Sensor_valued_changed, /* name */ +be_local_closure(Matter_Plugin_Sensor_value_changed, /* name */ be_nested_proto( 2, /* nstack */ 2, /* argc */ @@ -147,7 +147,7 @@ be_local_closure(Matter_Plugin_Sensor_valued_changed, /* name */ NULL, /* no sub protos */ 0, /* has constants */ NULL, /* no const */ - be_str_weak(valued_changed), + be_str_weak(value_changed), &be_const_str_solidified, ( &(const binstruction[ 1]) { /* code */ 0x80000000, // 0000 RET 0 @@ -171,7 +171,7 @@ be_local_class(Matter_Plugin_Sensor, { be_const_key_weak(tasmota_sensor_matcher, 6), be_const_var(1) }, { be_const_key_weak(init, 1), be_const_closure(Matter_Plugin_Sensor_init_closure) }, { be_const_key_weak(parse_sensors, -1), be_const_closure(Matter_Plugin_Sensor_parse_sensors_closure) }, - { be_const_key_weak(valued_changed, -1), be_const_closure(Matter_Plugin_Sensor_valued_changed_closure) }, + { be_const_key_weak(value_changed, -1), be_const_closure(Matter_Plugin_Sensor_value_changed_closure) }, { be_const_key_weak(tasmota_sensor_filter, -1), be_const_var(0) }, { be_const_key_weak(ARG, -1), be_nested_str_weak(filter) }, })), diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor_Humidity.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor_Humidity.h index 57146e067..995146e41 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor_Humidity.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor_Humidity.h @@ -145,11 +145,11 @@ be_local_closure(Matter_Plugin_Sensor_Humidity_pre_value, /* name */ /******************************************************************** -** Solidified function: valued_changed +** Solidified function: value_changed ********************************************************************/ -be_local_closure(Matter_Plugin_Sensor_Humidity_valued_changed, /* name */ +be_local_closure(Matter_Plugin_Sensor_Humidity_value_changed, /* name */ be_nested_proto( - 7, /* nstack */ + 6, /* nstack */ 2, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -161,15 +161,14 @@ be_local_closure(Matter_Plugin_Sensor_Humidity_valued_changed, /* name */ /* K0 */ be_nested_str_weak(attribute_updated), /* K1 */ be_const_int(0), }), - be_str_weak(valued_changed), + be_str_weak(value_changed), &be_const_str_solidified, - ( &(const binstruction[ 6]) { /* code */ + ( &(const binstruction[ 5]) { /* code */ 0x8C080100, // 0000 GETMET R2 R0 K0 - 0x4C100000, // 0001 LDNIL R4 - 0x54160404, // 0002 LDINT R5 1029 - 0x58180001, // 0003 LDCONST R6 K1 - 0x7C080800, // 0004 CALL R2 4 - 0x80000000, // 0005 RET 0 + 0x54120404, // 0001 LDINT R4 1029 + 0x58140001, // 0002 LDCONST R5 K1 + 0x7C080600, // 0003 CALL R2 3 + 0x80000000, // 0004 RET 0 }) ) ); @@ -186,7 +185,7 @@ be_local_class(Matter_Plugin_Sensor_Humidity, be_nested_map(7, ( (struct bmapnode*) &(const bmapnode[]) { { be_const_key_weak(read_attribute, 2), be_const_closure(Matter_Plugin_Sensor_Humidity_read_attribute_closure) }, - { be_const_key_weak(pre_value, 5), be_const_closure(Matter_Plugin_Sensor_Humidity_pre_value_closure) }, + { be_const_key_weak(pre_value, 4), be_const_closure(Matter_Plugin_Sensor_Humidity_pre_value_closure) }, { be_const_key_weak(CLUSTERS, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { be_const_map( * be_nested_map(1, ( (struct bmapnode*) &(const bmapnode[]) { @@ -200,14 +199,14 @@ be_local_class(Matter_Plugin_Sensor_Humidity, be_const_int(65533), })) ) } )) }, })) ) } )) }, - { be_const_key_weak(TYPES, 4), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { + { be_const_key_weak(TYPE, 6), be_nested_str_weak(humidity) }, + { be_const_key_weak(NAME, -1), be_nested_str_weak(Humidity) }, + { be_const_key_weak(value_changed, -1), be_const_closure(Matter_Plugin_Sensor_Humidity_value_changed_closure) }, + { be_const_key_weak(TYPES, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { be_const_map( * be_nested_map(1, ( (struct bmapnode*) &(const bmapnode[]) { { be_const_key_int(775, -1), be_const_int(2) }, })) ) } )) }, - { be_const_key_weak(TYPE, -1), be_nested_str_weak(humidity) }, - { be_const_key_weak(NAME, -1), be_nested_str_weak(Humidity) }, - { be_const_key_weak(valued_changed, -1), be_const_closure(Matter_Plugin_Sensor_Humidity_valued_changed_closure) }, })), be_str_weak(Matter_Plugin_Sensor_Humidity) ); diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor_Illuminance.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor_Illuminance.h index 1ac6a351d..13650c269 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor_Illuminance.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor_Illuminance.h @@ -144,11 +144,11 @@ be_local_closure(Matter_Plugin_Sensor_Illuminance_pre_value, /* name */ /******************************************************************** -** Solidified function: valued_changed +** Solidified function: value_changed ********************************************************************/ -be_local_closure(Matter_Plugin_Sensor_Illuminance_valued_changed, /* name */ +be_local_closure(Matter_Plugin_Sensor_Illuminance_value_changed, /* name */ be_nested_proto( - 7, /* nstack */ + 6, /* nstack */ 2, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -160,15 +160,14 @@ be_local_closure(Matter_Plugin_Sensor_Illuminance_valued_changed, /* name */ /* K0 */ be_nested_str_weak(attribute_updated), /* K1 */ be_const_int(0), }), - be_str_weak(valued_changed), + be_str_weak(value_changed), &be_const_str_solidified, - ( &(const binstruction[ 6]) { /* code */ + ( &(const binstruction[ 5]) { /* code */ 0x8C080100, // 0000 GETMET R2 R0 K0 - 0x4C100000, // 0001 LDNIL R4 - 0x541603FF, // 0002 LDINT R5 1024 - 0x58180001, // 0003 LDCONST R6 K1 - 0x7C080800, // 0004 CALL R2 4 - 0x80000000, // 0005 RET 0 + 0x541203FF, // 0001 LDINT R4 1024 + 0x58140001, // 0002 LDCONST R5 K1 + 0x7C080600, // 0003 CALL R2 3 + 0x80000000, // 0004 RET 0 }) ) ); @@ -185,7 +184,7 @@ be_local_class(Matter_Plugin_Sensor_Illuminance, be_nested_map(7, ( (struct bmapnode*) &(const bmapnode[]) { { be_const_key_weak(read_attribute, 2), be_const_closure(Matter_Plugin_Sensor_Illuminance_read_attribute_closure) }, - { be_const_key_weak(pre_value, 5), be_const_closure(Matter_Plugin_Sensor_Illuminance_pre_value_closure) }, + { be_const_key_weak(pre_value, 4), be_const_closure(Matter_Plugin_Sensor_Illuminance_pre_value_closure) }, { be_const_key_weak(CLUSTERS, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { be_const_map( * be_nested_map(1, ( (struct bmapnode*) &(const bmapnode[]) { @@ -199,14 +198,14 @@ be_local_class(Matter_Plugin_Sensor_Illuminance, be_const_int(65533), })) ) } )) }, })) ) } )) }, - { be_const_key_weak(TYPES, 4), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { + { be_const_key_weak(TYPE, 6), be_nested_str_weak(illuminance) }, + { be_const_key_weak(NAME, -1), be_nested_str_weak(Illuminance) }, + { be_const_key_weak(value_changed, -1), be_const_closure(Matter_Plugin_Sensor_Illuminance_value_changed_closure) }, + { be_const_key_weak(TYPES, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { be_const_map( * be_nested_map(1, ( (struct bmapnode*) &(const bmapnode[]) { { be_const_key_int(262, -1), be_const_int(2) }, })) ) } )) }, - { be_const_key_weak(TYPE, -1), be_nested_str_weak(illuminance) }, - { be_const_key_weak(NAME, -1), be_nested_str_weak(Illuminance) }, - { be_const_key_weak(valued_changed, -1), be_const_closure(Matter_Plugin_Sensor_Illuminance_valued_changed_closure) }, })), be_str_weak(Matter_Plugin_Sensor_Illuminance) ); diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor_Pressure.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor_Pressure.h index d0e8aa69d..c36f76084 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor_Pressure.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor_Pressure.h @@ -144,11 +144,11 @@ be_local_closure(Matter_Plugin_Sensor_Pressure_pre_value, /* name */ /******************************************************************** -** Solidified function: valued_changed +** Solidified function: value_changed ********************************************************************/ -be_local_closure(Matter_Plugin_Sensor_Pressure_valued_changed, /* name */ +be_local_closure(Matter_Plugin_Sensor_Pressure_value_changed, /* name */ be_nested_proto( - 7, /* nstack */ + 6, /* nstack */ 2, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -160,15 +160,14 @@ be_local_closure(Matter_Plugin_Sensor_Pressure_valued_changed, /* name */ /* K0 */ be_nested_str_weak(attribute_updated), /* K1 */ be_const_int(0), }), - be_str_weak(valued_changed), + be_str_weak(value_changed), &be_const_str_solidified, - ( &(const binstruction[ 6]) { /* code */ + ( &(const binstruction[ 5]) { /* code */ 0x8C080100, // 0000 GETMET R2 R0 K0 - 0x4C100000, // 0001 LDNIL R4 - 0x54160402, // 0002 LDINT R5 1027 - 0x58180001, // 0003 LDCONST R6 K1 - 0x7C080800, // 0004 CALL R2 4 - 0x80000000, // 0005 RET 0 + 0x54120402, // 0001 LDINT R4 1027 + 0x58140001, // 0002 LDCONST R5 K1 + 0x7C080600, // 0003 CALL R2 3 + 0x80000000, // 0004 RET 0 }) ) ); @@ -185,7 +184,7 @@ be_local_class(Matter_Plugin_Sensor_Pressure, be_nested_map(7, ( (struct bmapnode*) &(const bmapnode[]) { { be_const_key_weak(read_attribute, 2), be_const_closure(Matter_Plugin_Sensor_Pressure_read_attribute_closure) }, - { be_const_key_weak(pre_value, 5), be_const_closure(Matter_Plugin_Sensor_Pressure_pre_value_closure) }, + { be_const_key_weak(pre_value, 4), be_const_closure(Matter_Plugin_Sensor_Pressure_pre_value_closure) }, { be_const_key_weak(CLUSTERS, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { be_const_map( * be_nested_map(1, ( (struct bmapnode*) &(const bmapnode[]) { @@ -199,14 +198,14 @@ be_local_class(Matter_Plugin_Sensor_Pressure, be_const_int(65533), })) ) } )) }, })) ) } )) }, - { be_const_key_weak(TYPES, 4), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { + { be_const_key_weak(TYPE, 6), be_nested_str_weak(pressure) }, + { be_const_key_weak(NAME, -1), be_nested_str_weak(Pressure) }, + { be_const_key_weak(value_changed, -1), be_const_closure(Matter_Plugin_Sensor_Pressure_value_changed_closure) }, + { be_const_key_weak(TYPES, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { be_const_map( * be_nested_map(1, ( (struct bmapnode*) &(const bmapnode[]) { { be_const_key_int(773, -1), be_const_int(2) }, })) ) } )) }, - { be_const_key_weak(TYPE, -1), be_nested_str_weak(pressure) }, - { be_const_key_weak(NAME, -1), be_nested_str_weak(Pressure) }, - { be_const_key_weak(valued_changed, -1), be_const_closure(Matter_Plugin_Sensor_Pressure_valued_changed_closure) }, })), be_str_weak(Matter_Plugin_Sensor_Pressure) ); diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor_Temp.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor_Temp.h index 48e76493a..4fdf3b743 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor_Temp.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor_Temp.h @@ -142,11 +142,11 @@ be_local_closure(Matter_Plugin_Sensor_Temp_pre_value, /* name */ /******************************************************************** -** Solidified function: valued_changed +** Solidified function: value_changed ********************************************************************/ -be_local_closure(Matter_Plugin_Sensor_Temp_valued_changed, /* name */ +be_local_closure(Matter_Plugin_Sensor_Temp_value_changed, /* name */ be_nested_proto( - 7, /* nstack */ + 6, /* nstack */ 2, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -158,15 +158,14 @@ be_local_closure(Matter_Plugin_Sensor_Temp_valued_changed, /* name */ /* K0 */ be_nested_str_weak(attribute_updated), /* K1 */ be_const_int(0), }), - be_str_weak(valued_changed), + be_str_weak(value_changed), &be_const_str_solidified, - ( &(const binstruction[ 6]) { /* code */ + ( &(const binstruction[ 5]) { /* code */ 0x8C080100, // 0000 GETMET R2 R0 K0 - 0x4C100000, // 0001 LDNIL R4 - 0x54160401, // 0002 LDINT R5 1026 - 0x58180001, // 0003 LDCONST R6 K1 - 0x7C080800, // 0004 CALL R2 4 - 0x80000000, // 0005 RET 0 + 0x54120401, // 0001 LDINT R4 1026 + 0x58140001, // 0002 LDCONST R5 K1 + 0x7C080600, // 0003 CALL R2 3 + 0x80000000, // 0004 RET 0 }) ) ); @@ -183,7 +182,7 @@ be_local_class(Matter_Plugin_Sensor_Temp, be_nested_map(7, ( (struct bmapnode*) &(const bmapnode[]) { { be_const_key_weak(read_attribute, 2), be_const_closure(Matter_Plugin_Sensor_Temp_read_attribute_closure) }, - { be_const_key_weak(pre_value, 5), be_const_closure(Matter_Plugin_Sensor_Temp_pre_value_closure) }, + { be_const_key_weak(pre_value, 4), be_const_closure(Matter_Plugin_Sensor_Temp_pre_value_closure) }, { be_const_key_weak(CLUSTERS, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { be_const_map( * be_nested_map(1, ( (struct bmapnode*) &(const bmapnode[]) { @@ -197,14 +196,14 @@ be_local_class(Matter_Plugin_Sensor_Temp, be_const_int(65533), })) ) } )) }, })) ) } )) }, - { be_const_key_weak(TYPES, 4), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { + { be_const_key_weak(TYPE, 6), be_nested_str_weak(temperature) }, + { be_const_key_weak(NAME, -1), be_nested_str_weak(Temperature) }, + { be_const_key_weak(value_changed, -1), be_const_closure(Matter_Plugin_Sensor_Temp_value_changed_closure) }, + { be_const_key_weak(TYPES, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { be_const_map( * be_nested_map(1, ( (struct bmapnode*) &(const bmapnode[]) { { be_const_key_int(770, -1), be_const_int(2) }, })) ) } )) }, - { be_const_key_weak(TYPE, -1), be_nested_str_weak(temperature) }, - { be_const_key_weak(NAME, -1), be_nested_str_weak(Temperature) }, - { be_const_key_weak(valued_changed, -1), be_const_closure(Matter_Plugin_Sensor_Temp_valued_changed_closure) }, })), be_str_weak(Matter_Plugin_Sensor_Temp) ); diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Shutter.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Shutter.h new file mode 100644 index 000000000..bdf05f9db --- /dev/null +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Shutter.h @@ -0,0 +1,710 @@ +/* Solidification of Matter_Plugin_Shutter.h */ +/********************************************************************\ +* Generated code, don't edit * +\********************************************************************/ +#include "be_constobj.h" + +extern const bclass be_class_Matter_Plugin_Shutter; + +/******************************************************************** +** Solidified function: +********************************************************************/ +be_local_closure(Matter_Plugin_Shutter__X3Clambda_X3E, /* name */ + be_nested_proto( + 3, /* nstack */ + 1, /* argc */ + 0, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 0, /* has constants */ + NULL, /* no const */ + be_str_weak(_X3Clambda_X3E), + &be_const_str_solidified, + ( &(const binstruction[ 4]) { /* code */ + 0x60040009, // 0000 GETGBL R1 G9 + 0x5C080000, // 0001 MOVE R2 R0 + 0x7C040200, // 0002 CALL R1 1 + 0x80040200, // 0003 RET 1 R1 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: read_attribute +********************************************************************/ +be_local_closure(Matter_Plugin_Shutter_read_attribute, /* name */ + be_nested_proto( + 12, /* nstack */ + 3, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[19]) { /* constants */ + /* K0 */ be_nested_str_weak(string), + /* K1 */ be_nested_str_weak(matter), + /* K2 */ be_nested_str_weak(TLV), + /* K3 */ be_nested_str_weak(cluster), + /* K4 */ be_nested_str_weak(attribute), + /* K5 */ be_nested_str_weak(update_shadow_lazy), + /* K6 */ be_const_int(0), + /* K7 */ be_nested_str_weak(create_TLV), + /* K8 */ be_nested_str_weak(U1), + /* K9 */ be_nested_str_weak(U2), + /* K10 */ be_const_int(1), + /* K11 */ be_nested_str_weak(shadow_shutter_pos), + /* K12 */ be_nested_str_weak(shadow_shutter_tilt), + /* K13 */ be_nested_str_weak(shadow_shutter_direction), + /* K14 */ be_const_int(2), + /* K15 */ be_nested_str_weak(shadow_shutter_target), + /* K16 */ be_nested_str_weak(U4), + /* K17 */ be_const_int(3), + /* K18 */ be_nested_str_weak(read_attribute), + }), + be_str_weak(read_attribute), + &be_const_str_solidified, + ( &(const binstruction[186]) { /* code */ + 0xA40E0000, // 0000 IMPORT R3 K0 + 0xB8120200, // 0001 GETNGBL R4 K1 + 0x88100902, // 0002 GETMBR R4 R4 K2 + 0x88140503, // 0003 GETMBR R5 R2 K3 + 0x88180504, // 0004 GETMBR R6 R2 K4 + 0x541E0101, // 0005 LDINT R7 258 + 0x1C1C0A07, // 0006 EQ R7 R5 R7 + 0x781E00A8, // 0007 JMPF R7 #00B1 + 0x8C1C0105, // 0008 GETMET R7 R0 K5 + 0x7C1C0200, // 0009 CALL R7 1 + 0x1C1C0D06, // 000A EQ R7 R6 K6 + 0x781E0005, // 000B JMPF R7 #0012 + 0x8C1C0907, // 000C GETMET R7 R4 K7 + 0x88240908, // 000D GETMBR R9 R4 K8 + 0x542A00FE, // 000E LDINT R10 255 + 0x7C1C0600, // 000F CALL R7 3 + 0x80040E00, // 0010 RET 1 R7 + 0x7002009D, // 0011 JMP #00B0 + 0x541E0004, // 0012 LDINT R7 5 + 0x1C1C0C07, // 0013 EQ R7 R6 R7 + 0x781E0005, // 0014 JMPF R7 #001B + 0x8C1C0907, // 0015 GETMET R7 R4 K7 + 0x88240909, // 0016 GETMBR R9 R4 K9 + 0x58280006, // 0017 LDCONST R10 K6 + 0x7C1C0600, // 0018 CALL R7 3 + 0x80040E00, // 0019 RET 1 R7 + 0x70020094, // 001A JMP #00B0 + 0x541E0005, // 001B LDINT R7 6 + 0x1C1C0C07, // 001C EQ R7 R6 R7 + 0x781E0005, // 001D JMPF R7 #0024 + 0x8C1C0907, // 001E GETMET R7 R4 K7 + 0x88240909, // 001F GETMBR R9 R4 K9 + 0x58280006, // 0020 LDCONST R10 K6 + 0x7C1C0600, // 0021 CALL R7 3 + 0x80040E00, // 0022 RET 1 R7 + 0x7002008B, // 0023 JMP #00B0 + 0x541E0006, // 0024 LDINT R7 7 + 0x1C1C0C07, // 0025 EQ R7 R6 R7 + 0x781E0008, // 0026 JMPF R7 #0030 + 0x8C1C0907, // 0027 GETMET R7 R4 K7 + 0x88240908, // 0028 GETMBR R9 R4 K8 + 0x542A0007, // 0029 LDINT R10 8 + 0x002A140A, // 002A ADD R10 K10 R10 + 0x542E000F, // 002B LDINT R11 16 + 0x0028140B, // 002C ADD R10 R10 R11 + 0x7C1C0600, // 002D CALL R7 3 + 0x80040E00, // 002E RET 1 R7 + 0x7002007F, // 002F JMP #00B0 + 0x541E000C, // 0030 LDINT R7 13 + 0x1C1C0C07, // 0031 EQ R7 R6 R7 + 0x781E0005, // 0032 JMPF R7 #0039 + 0x8C1C0907, // 0033 GETMET R7 R4 K7 + 0x88240908, // 0034 GETMBR R9 R4 K8 + 0x542A00FE, // 0035 LDINT R10 255 + 0x7C1C0600, // 0036 CALL R7 3 + 0x80040E00, // 0037 RET 1 R7 + 0x70020076, // 0038 JMP #00B0 + 0x541E0007, // 0039 LDINT R7 8 + 0x1C1C0C07, // 003A EQ R7 R6 R7 + 0x781E0007, // 003B JMPF R7 #0044 + 0x8C1C0907, // 003C GETMET R7 R4 K7 + 0x88240909, // 003D GETMBR R9 R4 K9 + 0x542A0063, // 003E LDINT R10 100 + 0x882C010B, // 003F GETMBR R11 R0 K11 + 0x0428140B, // 0040 SUB R10 R10 R11 + 0x7C1C0600, // 0041 CALL R7 3 + 0x80040E00, // 0042 RET 1 R7 + 0x7002006B, // 0043 JMP #00B0 + 0x541E000D, // 0044 LDINT R7 14 + 0x1C1C0C07, // 0045 EQ R7 R6 R7 + 0x781E0009, // 0046 JMPF R7 #0051 + 0x8C1C0907, // 0047 GETMET R7 R4 K7 + 0x88240909, // 0048 GETMBR R9 R4 K9 + 0x542A0063, // 0049 LDINT R10 100 + 0x882C010B, // 004A GETMBR R11 R0 K11 + 0x0428140B, // 004B SUB R10 R10 R11 + 0x542E0063, // 004C LDINT R11 100 + 0x0828140B, // 004D MUL R10 R10 R11 + 0x7C1C0600, // 004E CALL R7 3 + 0x80040E00, // 004F RET 1 R7 + 0x7002005E, // 0050 JMP #00B0 + 0x541E0008, // 0051 LDINT R7 9 + 0x1C1C0C07, // 0052 EQ R7 R6 R7 + 0x781E0007, // 0053 JMPF R7 #005C + 0x8C1C0907, // 0054 GETMET R7 R4 K7 + 0x88240909, // 0055 GETMBR R9 R4 K9 + 0x542A0063, // 0056 LDINT R10 100 + 0x882C010C, // 0057 GETMBR R11 R0 K12 + 0x0428140B, // 0058 SUB R10 R10 R11 + 0x7C1C0600, // 0059 CALL R7 3 + 0x80040E00, // 005A RET 1 R7 + 0x70020053, // 005B JMP #00B0 + 0x541E000E, // 005C LDINT R7 15 + 0x1C1C0C07, // 005D EQ R7 R6 R7 + 0x781E0009, // 005E JMPF R7 #0069 + 0x8C1C0907, // 005F GETMET R7 R4 K7 + 0x88240909, // 0060 GETMBR R9 R4 K9 + 0x542A0063, // 0061 LDINT R10 100 + 0x882C010C, // 0062 GETMBR R11 R0 K12 + 0x0428140B, // 0063 SUB R10 R10 R11 + 0x542E0063, // 0064 LDINT R11 100 + 0x0828140B, // 0065 MUL R10 R10 R11 + 0x7C1C0600, // 0066 CALL R7 3 + 0x80040E00, // 0067 RET 1 R7 + 0x70020046, // 0068 JMP #00B0 + 0x541E0009, // 0069 LDINT R7 10 + 0x1C1C0C07, // 006A EQ R7 R6 R7 + 0x781E0010, // 006B JMPF R7 #007D + 0x881C010D, // 006C GETMBR R7 R0 K13 + 0x1C1C0F06, // 006D EQ R7 R7 K6 + 0x781E0001, // 006E JMPF R7 #0071 + 0x581C0006, // 006F LDCONST R7 K6 + 0x70020005, // 0070 JMP #0077 + 0x881C010D, // 0071 GETMBR R7 R0 K13 + 0x241C0F06, // 0072 GT R7 R7 K6 + 0x781E0001, // 0073 JMPF R7 #0076 + 0x581C000A, // 0074 LDCONST R7 K10 + 0x70020000, // 0075 JMP #0077 + 0x581C000E, // 0076 LDCONST R7 K14 + 0x8C200907, // 0077 GETMET R8 R4 K7 + 0x88280908, // 0078 GETMBR R10 R4 K8 + 0x5C2C0E00, // 0079 MOVE R11 R7 + 0x7C200600, // 007A CALL R8 3 + 0x80041000, // 007B RET 1 R8 + 0x70020032, // 007C JMP #00B0 + 0x541E000A, // 007D LDINT R7 11 + 0x1C1C0C07, // 007E EQ R7 R6 R7 + 0x781E0009, // 007F JMPF R7 #008A + 0x8C1C0907, // 0080 GETMET R7 R4 K7 + 0x88240909, // 0081 GETMBR R9 R4 K9 + 0x542A0063, // 0082 LDINT R10 100 + 0x882C010F, // 0083 GETMBR R11 R0 K15 + 0x0428140B, // 0084 SUB R10 R10 R11 + 0x542E0063, // 0085 LDINT R11 100 + 0x0828140B, // 0086 MUL R10 R10 R11 + 0x7C1C0600, // 0087 CALL R7 3 + 0x80040E00, // 0088 RET 1 R7 + 0x70020025, // 0089 JMP #00B0 + 0x541E000B, // 008A LDINT R7 12 + 0x1C1C0C07, // 008B EQ R7 R6 R7 + 0x781E0005, // 008C JMPF R7 #0093 + 0x8C1C0907, // 008D GETMET R7 R4 K7 + 0x88240908, // 008E GETMBR R9 R4 K8 + 0x58280006, // 008F LDCONST R10 K6 + 0x7C1C0600, // 0090 CALL R7 3 + 0x80040E00, // 0091 RET 1 R7 + 0x7002001C, // 0092 JMP #00B0 + 0x541E0016, // 0093 LDINT R7 23 + 0x1C1C0C07, // 0094 EQ R7 R6 R7 + 0x781E0005, // 0095 JMPF R7 #009C + 0x8C1C0907, // 0096 GETMET R7 R4 K7 + 0x88240908, // 0097 GETMBR R9 R4 K8 + 0x58280006, // 0098 LDCONST R10 K6 + 0x7C1C0600, // 0099 CALL R7 3 + 0x80040E00, // 009A RET 1 R7 + 0x70020013, // 009B JMP #00B0 + 0x541EFFFB, // 009C LDINT R7 65532 + 0x1C1C0C07, // 009D EQ R7 R6 R7 + 0x781E0008, // 009E JMPF R7 #00A8 + 0x8C1C0907, // 009F GETMET R7 R4 K7 + 0x88240910, // 00A0 GETMBR R9 R4 K16 + 0x542A0003, // 00A1 LDINT R10 4 + 0x002A220A, // 00A2 ADD R10 K17 R10 + 0x542E000F, // 00A3 LDINT R11 16 + 0x0028140B, // 00A4 ADD R10 R10 R11 + 0x7C1C0600, // 00A5 CALL R7 3 + 0x80040E00, // 00A6 RET 1 R7 + 0x70020007, // 00A7 JMP #00B0 + 0x541EFFFC, // 00A8 LDINT R7 65533 + 0x1C1C0C07, // 00A9 EQ R7 R6 R7 + 0x781E0004, // 00AA JMPF R7 #00B0 + 0x8C1C0907, // 00AB GETMET R7 R4 K7 + 0x88240910, // 00AC GETMBR R9 R4 K16 + 0x542A0004, // 00AD LDINT R10 5 + 0x7C1C0600, // 00AE CALL R7 3 + 0x80040E00, // 00AF RET 1 R7 + 0x70020007, // 00B0 JMP #00B9 + 0x601C0003, // 00B1 GETGBL R7 G3 + 0x5C200000, // 00B2 MOVE R8 R0 + 0x7C1C0200, // 00B3 CALL R7 1 + 0x8C1C0F12, // 00B4 GETMET R7 R7 K18 + 0x5C240200, // 00B5 MOVE R9 R1 + 0x5C280400, // 00B6 MOVE R10 R2 + 0x7C1C0600, // 00B7 CALL R7 3 + 0x80040E00, // 00B8 RET 1 R7 + 0x80000000, // 00B9 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: init +********************************************************************/ +be_local_closure(Matter_Plugin_Shutter_init, /* name */ + be_nested_proto( + 9, /* nstack */ + 4, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 5]) { /* constants */ + /* K0 */ be_nested_str_weak(init), + /* K1 */ be_nested_str_weak(tasmota_shutter_index), + /* K2 */ be_nested_str_weak(find), + /* K3 */ be_nested_str_weak(ARG), + /* K4 */ be_const_int(0), + }), + be_str_weak(init), + &be_const_str_solidified, + ( &(const binstruction[18]) { /* code */ + 0x60100003, // 0000 GETGBL R4 G3 + 0x5C140000, // 0001 MOVE R5 R0 + 0x7C100200, // 0002 CALL R4 1 + 0x8C100900, // 0003 GETMET R4 R4 K0 + 0x5C180200, // 0004 MOVE R6 R1 + 0x5C1C0400, // 0005 MOVE R7 R2 + 0x5C200600, // 0006 MOVE R8 R3 + 0x7C100800, // 0007 CALL R4 4 + 0x8C100702, // 0008 GETMET R4 R3 K2 + 0x88180103, // 0009 GETMBR R6 R0 K3 + 0x7C100400, // 000A CALL R4 2 + 0x90020204, // 000B SETMBR R0 K1 R4 + 0x88100101, // 000C GETMBR R4 R0 K1 + 0x4C140000, // 000D LDNIL R5 + 0x1C100805, // 000E EQ R4 R4 R5 + 0x78120000, // 000F JMPF R4 #0011 + 0x90020304, // 0010 SETMBR R0 K1 K4 + 0x80000000, // 0011 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: update_shadow +********************************************************************/ +be_local_closure(Matter_Plugin_Shutter_update_shadow, /* name */ + be_nested_proto( + 5, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 7]) { /* constants */ + /* K0 */ be_nested_str_weak(tasmota), + /* K1 */ be_nested_str_weak(cmd), + /* K2 */ be_nested_str_weak(ShutterPosition), + /* K3 */ be_nested_str_weak(tasmota_shutter_index), + /* K4 */ be_const_int(1), + /* K5 */ be_nested_str_weak(parse_sensors), + /* K6 */ be_nested_str_weak(update_shadow), + }), + be_str_weak(update_shadow), + &be_const_str_solidified, + ( &(const binstruction[19]) { /* code */ + 0xB8060000, // 0000 GETNGBL R1 K0 + 0x8C040301, // 0001 GETMET R1 R1 K1 + 0x600C0008, // 0002 GETGBL R3 G8 + 0x88100103, // 0003 GETMBR R4 R0 K3 + 0x00100904, // 0004 ADD R4 R4 K4 + 0x7C0C0200, // 0005 CALL R3 1 + 0x000E0403, // 0006 ADD R3 K2 R3 + 0x50100200, // 0007 LDBOOL R4 1 0 + 0x7C040600, // 0008 CALL R1 3 + 0x78060002, // 0009 JMPF R1 #000D + 0x8C080105, // 000A GETMET R2 R0 K5 + 0x5C100200, // 000B MOVE R4 R1 + 0x7C080400, // 000C CALL R2 2 + 0x60080003, // 000D GETGBL R2 G3 + 0x5C0C0000, // 000E MOVE R3 R0 + 0x7C080200, // 000F CALL R2 1 + 0x8C080506, // 0010 GETMET R2 R2 K6 + 0x7C080200, // 0011 CALL R2 1 + 0x80000000, // 0012 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: invoke_request +********************************************************************/ +be_local_closure(Matter_Plugin_Shutter_invoke_request, /* name */ + be_nested_proto( + 14, /* nstack */ + 4, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[24]) { /* constants */ + /* K0 */ be_nested_str_weak(light), + /* K1 */ be_nested_str_weak(matter), + /* K2 */ be_nested_str_weak(TLV), + /* K3 */ be_nested_str_weak(cluster), + /* K4 */ be_nested_str_weak(command), + /* K5 */ be_nested_str_weak(update_shadow_lazy), + /* K6 */ be_const_int(0), + /* K7 */ be_nested_str_weak(tasmota), + /* K8 */ be_nested_str_weak(cmd), + /* K9 */ be_nested_str_weak(ShutterStopOpen), + /* K10 */ be_nested_str_weak(tasmota_shutter_index), + /* K11 */ be_const_int(1), + /* K12 */ be_nested_str_weak(update_shadow), + /* K13 */ be_nested_str_weak(ShutterStopClose), + /* K14 */ be_const_int(2), + /* K15 */ be_nested_str_weak(ShutterStop), + /* K16 */ be_nested_str_weak(log), + /* K17 */ be_nested_str_weak(MTR_X3A_X20Tilt_X20_X3D_X20), + /* K18 */ be_nested_str_weak(findsubval), + /* K19 */ be_nested_str_weak(ShutterStopPosition), + /* K20 */ be_nested_str_weak(_X20), + /* K21 */ be_nested_str_weak(pos_X25_X3A), + /* K22 */ be_nested_str_weak(tilt_X25_X3A), + /* K23 */ be_nested_str_weak(invoke_request), + }), + be_str_weak(invoke_request), + &be_const_str_solidified, + ( &(const binstruction[131]) { /* code */ + 0xA4120000, // 0000 IMPORT R4 K0 + 0xB8160200, // 0001 GETNGBL R5 K1 + 0x88140B02, // 0002 GETMBR R5 R5 K2 + 0x88180703, // 0003 GETMBR R6 R3 K3 + 0x881C0704, // 0004 GETMBR R7 R3 K4 + 0x54220101, // 0005 LDINT R8 258 + 0x1C200C08, // 0006 EQ R8 R6 R8 + 0x78220070, // 0007 JMPF R8 #0079 + 0x8C200105, // 0008 GETMET R8 R0 K5 + 0x7C200200, // 0009 CALL R8 1 + 0x1C200F06, // 000A EQ R8 R7 K6 + 0x7822000D, // 000B JMPF R8 #001A + 0xB8220E00, // 000C GETNGBL R8 K7 + 0x8C201108, // 000D GETMET R8 R8 K8 + 0x60280008, // 000E GETGBL R10 G8 + 0x882C010A, // 000F GETMBR R11 R0 K10 + 0x002C170B, // 0010 ADD R11 R11 K11 + 0x7C280200, // 0011 CALL R10 1 + 0x002A120A, // 0012 ADD R10 K9 R10 + 0x502C0200, // 0013 LDBOOL R11 1 0 + 0x7C200600, // 0014 CALL R8 3 + 0x8C20010C, // 0015 GETMET R8 R0 K12 + 0x7C200200, // 0016 CALL R8 1 + 0x50200200, // 0017 LDBOOL R8 1 0 + 0x80041000, // 0018 RET 1 R8 + 0x7002005D, // 0019 JMP #0078 + 0x1C200F0B, // 001A EQ R8 R7 K11 + 0x7822000D, // 001B JMPF R8 #002A + 0xB8220E00, // 001C GETNGBL R8 K7 + 0x8C201108, // 001D GETMET R8 R8 K8 + 0x60280008, // 001E GETGBL R10 G8 + 0x882C010A, // 001F GETMBR R11 R0 K10 + 0x002C170B, // 0020 ADD R11 R11 K11 + 0x7C280200, // 0021 CALL R10 1 + 0x002A1A0A, // 0022 ADD R10 K13 R10 + 0x502C0200, // 0023 LDBOOL R11 1 0 + 0x7C200600, // 0024 CALL R8 3 + 0x8C20010C, // 0025 GETMET R8 R0 K12 + 0x7C200200, // 0026 CALL R8 1 + 0x50200200, // 0027 LDBOOL R8 1 0 + 0x80041000, // 0028 RET 1 R8 + 0x7002004D, // 0029 JMP #0078 + 0x1C200F0E, // 002A EQ R8 R7 K14 + 0x7822000D, // 002B JMPF R8 #003A + 0xB8220E00, // 002C GETNGBL R8 K7 + 0x8C201108, // 002D GETMET R8 R8 K8 + 0x60280008, // 002E GETGBL R10 G8 + 0x882C010A, // 002F GETMBR R11 R0 K10 + 0x002C170B, // 0030 ADD R11 R11 K11 + 0x7C280200, // 0031 CALL R10 1 + 0x002A1E0A, // 0032 ADD R10 K15 R10 + 0x502C0200, // 0033 LDBOOL R11 1 0 + 0x7C200600, // 0034 CALL R8 3 + 0x8C20010C, // 0035 GETMET R8 R0 K12 + 0x7C200200, // 0036 CALL R8 1 + 0x50200200, // 0037 LDBOOL R8 1 0 + 0x80041000, // 0038 RET 1 R8 + 0x7002003D, // 0039 JMP #0078 + 0x54220004, // 003A LDINT R8 5 + 0x1C200E08, // 003B EQ R8 R7 R8 + 0x78220028, // 003C JMPF R8 #0066 + 0xB8220E00, // 003D GETNGBL R8 K7 + 0x8C201110, // 003E GETMET R8 R8 K16 + 0x60280008, // 003F GETGBL R10 G8 + 0x5C2C0400, // 0040 MOVE R11 R2 + 0x7C280200, // 0041 CALL R10 1 + 0x002A220A, // 0042 ADD R10 K17 R10 + 0x582C000E, // 0043 LDCONST R11 K14 + 0x7C200600, // 0044 CALL R8 3 + 0x8C200512, // 0045 GETMET R8 R2 K18 + 0x58280006, // 0046 LDCONST R10 K6 + 0x7C200400, // 0047 CALL R8 2 + 0x4C240000, // 0048 LDNIL R9 + 0x20241009, // 0049 NE R9 R8 R9 + 0x78260017, // 004A JMPF R9 #0063 + 0x54260063, // 004B LDINT R9 100 + 0x0C201009, // 004C DIV R8 R8 R9 + 0xB8260E00, // 004D GETNGBL R9 K7 + 0x8C241308, // 004E GETMET R9 R9 K8 + 0x602C0008, // 004F GETGBL R11 G8 + 0x8830010A, // 0050 GETMBR R12 R0 K10 + 0x0030190B, // 0051 ADD R12 R12 K11 + 0x7C2C0200, // 0052 CALL R11 1 + 0x002E260B, // 0053 ADD R11 K19 R11 + 0x002C1714, // 0054 ADD R11 R11 K20 + 0x60300008, // 0055 GETGBL R12 G8 + 0x54360063, // 0056 LDINT R13 100 + 0x04341A08, // 0057 SUB R13 R13 R8 + 0x7C300200, // 0058 CALL R12 1 + 0x002C160C, // 0059 ADD R11 R11 R12 + 0x50300200, // 005A LDBOOL R12 1 0 + 0x7C240600, // 005B CALL R9 3 + 0x60240008, // 005C GETGBL R9 G8 + 0x5C281000, // 005D MOVE R10 R8 + 0x7C240200, // 005E CALL R9 1 + 0x00262A09, // 005F ADD R9 K21 R9 + 0x900E2009, // 0060 SETMBR R3 K16 R9 + 0x8C24010C, // 0061 GETMET R9 R0 K12 + 0x7C240200, // 0062 CALL R9 1 + 0x50240200, // 0063 LDBOOL R9 1 0 + 0x80041200, // 0064 RET 1 R9 + 0x70020011, // 0065 JMP #0078 + 0x54220007, // 0066 LDINT R8 8 + 0x1C200E08, // 0067 EQ R8 R7 R8 + 0x7822000E, // 0068 JMPF R8 #0078 + 0x8C200512, // 0069 GETMET R8 R2 K18 + 0x58280006, // 006A LDCONST R10 K6 + 0x7C200400, // 006B CALL R8 2 + 0x4C240000, // 006C LDNIL R9 + 0x20241009, // 006D NE R9 R8 R9 + 0x78260006, // 006E JMPF R9 #0076 + 0x54260009, // 006F LDINT R9 10 + 0x0C201009, // 0070 DIV R8 R8 R9 + 0x60240008, // 0071 GETGBL R9 G8 + 0x5C281000, // 0072 MOVE R10 R8 + 0x7C240200, // 0073 CALL R9 1 + 0x00262C09, // 0074 ADD R9 K22 R9 + 0x900E2009, // 0075 SETMBR R3 K16 R9 + 0x50240200, // 0076 LDBOOL R9 1 0 + 0x80041200, // 0077 RET 1 R9 + 0x70020008, // 0078 JMP #0082 + 0x60200003, // 0079 GETGBL R8 G3 + 0x5C240000, // 007A MOVE R9 R0 + 0x7C200200, // 007B CALL R8 1 + 0x8C201117, // 007C GETMET R8 R8 K23 + 0x5C280200, // 007D MOVE R10 R1 + 0x5C2C0400, // 007E MOVE R11 R2 + 0x5C300600, // 007F MOVE R12 R3 + 0x7C200800, // 0080 CALL R8 4 + 0x80041000, // 0081 RET 1 R8 + 0x80000000, // 0082 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: parse_sensors +********************************************************************/ +be_local_closure(Matter_Plugin_Shutter_parse_sensors, /* name */ + be_nested_proto( + 13, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[15]) { /* constants */ + /* K0 */ be_nested_str_weak(string), + /* K1 */ be_nested_str_weak(Shutter), + /* K2 */ be_nested_str_weak(tasmota_shutter_index), + /* K3 */ be_const_int(1), + /* K4 */ be_nested_str_weak(contains), + /* K5 */ be_nested_str_weak(find), + /* K6 */ be_nested_str_weak(Position), + /* K7 */ be_nested_str_weak(shadow_shutter_pos), + /* K8 */ be_nested_str_weak(attribute_updated), + /* K9 */ be_nested_str_weak(Tilt), + /* K10 */ be_nested_str_weak(shadow_shutter_tilt), + /* K11 */ be_nested_str_weak(Direction), + /* K12 */ be_nested_str_weak(shadow_shutter_direction), + /* K13 */ be_nested_str_weak(Target), + /* K14 */ be_nested_str_weak(shadow_shutter_target), + }), + be_str_weak(parse_sensors), + &be_const_str_solidified, + ( &(const binstruction[68]) { /* code */ + 0xA40A0000, // 0000 IMPORT R2 K0 + 0x600C0008, // 0001 GETGBL R3 G8 + 0x88100102, // 0002 GETMBR R4 R0 K2 + 0x00100903, // 0003 ADD R4 R4 K3 + 0x7C0C0200, // 0004 CALL R3 1 + 0x000E0203, // 0005 ADD R3 K1 R3 + 0x8C100304, // 0006 GETMET R4 R1 K4 + 0x5C180600, // 0007 MOVE R6 R3 + 0x7C100400, // 0008 CALL R4 2 + 0x78120038, // 0009 JMPF R4 #0043 + 0x94100203, // 000A GETIDX R4 R1 R3 + 0x8C140905, // 000B GETMET R5 R4 K5 + 0x581C0006, // 000C LDCONST R7 K6 + 0x7C140400, // 000D CALL R5 2 + 0x4C180000, // 000E LDNIL R6 + 0x20180A06, // 000F NE R6 R5 R6 + 0x781A0007, // 0010 JMPF R6 #0019 + 0x88180107, // 0011 GETMBR R6 R0 K7 + 0x20180A06, // 0012 NE R6 R5 R6 + 0x781A0003, // 0013 JMPF R6 #0018 + 0x8C180108, // 0014 GETMET R6 R0 K8 + 0x54220101, // 0015 LDINT R8 258 + 0x5426000D, // 0016 LDINT R9 14 + 0x7C180600, // 0017 CALL R6 3 + 0x90020E05, // 0018 SETMBR R0 K7 R5 + 0x8C180905, // 0019 GETMET R6 R4 K5 + 0x58200009, // 001A LDCONST R8 K9 + 0x7C180400, // 001B CALL R6 2 + 0x4C1C0000, // 001C LDNIL R7 + 0x201C0C07, // 001D NE R7 R6 R7 + 0x781E0007, // 001E JMPF R7 #0027 + 0x881C010A, // 001F GETMBR R7 R0 K10 + 0x201C0C07, // 0020 NE R7 R6 R7 + 0x781E0003, // 0021 JMPF R7 #0026 + 0x8C1C0108, // 0022 GETMET R7 R0 K8 + 0x54260101, // 0023 LDINT R9 258 + 0x542A000E, // 0024 LDINT R10 15 + 0x7C1C0600, // 0025 CALL R7 3 + 0x90021406, // 0026 SETMBR R0 K10 R6 + 0x8C1C0905, // 0027 GETMET R7 R4 K5 + 0x5824000B, // 0028 LDCONST R9 K11 + 0x7C1C0400, // 0029 CALL R7 2 + 0x4C200000, // 002A LDNIL R8 + 0x20200E08, // 002B NE R8 R7 R8 + 0x78220007, // 002C JMPF R8 #0035 + 0x8820010C, // 002D GETMBR R8 R0 K12 + 0x20200E08, // 002E NE R8 R7 R8 + 0x78220003, // 002F JMPF R8 #0034 + 0x8C200108, // 0030 GETMET R8 R0 K8 + 0x542A0101, // 0031 LDINT R10 258 + 0x542E0009, // 0032 LDINT R11 10 + 0x7C200600, // 0033 CALL R8 3 + 0x90021807, // 0034 SETMBR R0 K12 R7 + 0x8C200905, // 0035 GETMET R8 R4 K5 + 0x5828000D, // 0036 LDCONST R10 K13 + 0x7C200400, // 0037 CALL R8 2 + 0x4C240000, // 0038 LDNIL R9 + 0x20241009, // 0039 NE R9 R8 R9 + 0x78260007, // 003A JMPF R9 #0043 + 0x8824010E, // 003B GETMBR R9 R0 K14 + 0x20241009, // 003C NE R9 R8 R9 + 0x78260003, // 003D JMPF R9 #0042 + 0x8C240108, // 003E GETMET R9 R0 K8 + 0x542E0101, // 003F LDINT R11 258 + 0x5432000A, // 0040 LDINT R12 11 + 0x7C240600, // 0041 CALL R9 3 + 0x90021C08, // 0042 SETMBR R0 K14 R8 + 0x80000000, // 0043 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified class: Matter_Plugin_Shutter +********************************************************************/ +extern const bclass be_class_Matter_Plugin_Device; +be_local_class(Matter_Plugin_Shutter, + 5, + &be_class_Matter_Plugin_Device, + be_nested_map(16, + ( (struct bmapnode*) &(const bmapnode[]) { + { be_const_key_weak(ARG_TYPE, -1), be_const_static_closure(Matter_Plugin_Shutter__X3Clambda_X3E_closure) }, + { be_const_key_weak(shadow_shutter_pos, -1), be_const_var(1) }, + { be_const_key_weak(CLUSTERS, 14), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { + be_const_map( * be_nested_map(1, + ( (struct bmapnode*) &(const bmapnode[]) { + { be_const_key_int(258, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_list, { + be_const_list( * be_nested_list(15, + ( (struct bvalue*) &(const bvalue[]) { + be_const_int(0), + be_const_int(5), + be_const_int(6), + be_const_int(7), + be_const_int(8), + be_const_int(9), + be_const_int(10), + be_const_int(11), + be_const_int(12), + be_const_int(13), + be_const_int(14), + be_const_int(15), + be_const_int(23), + be_const_int(65532), + be_const_int(65533), + })) ) } )) }, + })) ) } )) }, + { be_const_key_weak(init, -1), be_const_closure(Matter_Plugin_Shutter_init_closure) }, + { be_const_key_weak(shadow_shutter_direction, -1), be_const_var(4) }, + { be_const_key_weak(shadow_shutter_target, 15), be_const_var(2) }, + { be_const_key_weak(NAME, 1), be_nested_str_weak(Shutter) }, + { be_const_key_weak(ARG, -1), be_nested_str_weak(shutter) }, + { be_const_key_weak(invoke_request, -1), be_const_closure(Matter_Plugin_Shutter_invoke_request_closure) }, + { be_const_key_weak(tasmota_shutter_index, -1), be_const_var(0) }, + { be_const_key_weak(read_attribute, 2), be_const_closure(Matter_Plugin_Shutter_read_attribute_closure) }, + { be_const_key_weak(shadow_shutter_tilt, 8), be_const_var(3) }, + { be_const_key_weak(parse_sensors, -1), be_const_closure(Matter_Plugin_Shutter_parse_sensors_closure) }, + { be_const_key_weak(TYPE, 4), be_nested_str_weak(shutter) }, + { be_const_key_weak(TYPES, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { + be_const_map( * be_nested_map(1, + ( (struct bmapnode*) &(const bmapnode[]) { + { be_const_key_int(514, -1), be_const_int(2) }, + })) ) } )) }, + { be_const_key_weak(update_shadow, -1), be_const_closure(Matter_Plugin_Shutter_update_shadow_closure) }, + })), + be_str_weak(Matter_Plugin_Shutter) +); +/*******************************************************************/ + +void be_load_Matter_Plugin_Shutter_class(bvm *vm) { + be_pushntvclass(vm, &be_class_Matter_Plugin_Shutter); + be_setglobal(vm, "Matter_Plugin_Shutter"); + be_pop(vm, 1); +} +/********************************************************************/ +/* End of solidification */ diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_UI.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_UI.h index 5805865d8..424cf1b1d 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_UI.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_UI.h @@ -6,6 +6,309 @@ extern const bclass be_class_Matter_UI; +/******************************************************************** +** Solidified function: show_plugins_configuration +********************************************************************/ +be_local_closure(Matter_UI_show_plugins_configuration, /* name */ + be_nested_proto( + 19, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[35]) { /* constants */ + /* K0 */ be_nested_str_weak(webserver), + /* K1 */ be_nested_str_weak(string), + /* K2 */ be_nested_str_weak(content_send), + /* K3 */ be_nested_str_weak(_X3Cfieldset_X3E_X3Clegend_X3E_X3Cb_X3E_X26nbsp_X3BCurrent_X20Configuration_X26nbsp_X3B_X3C_X2Fb_X3E_X3C_X2Flegend_X3E_X3Cp_X3E_X3C_X2Fp_X3E), + /* K4 */ be_nested_str_weak(_X3Cform_X20action_X3D_X27_X2Fmatterc_X27_X20method_X3D_X27post_X27), + /* K5 */ be_nested_str_weak(onsubmit_X3D_X27return_X20confirm_X28_X22This_X20will_X20RESET_X20the_X20configuration_X20to_X20the_X20default_X2E_X20You_X20will_X20need_X20to_X20associate_X20again_X2E_X22_X29_X3B_X27_X3E), + /* K6 */ be_nested_str_weak(_X3Cbutton_X20name_X3D_X27auto_X27_X20class_X3D_X27button_X20bred_X27_X3EReset_X20to_X20default_X3C_X2Fbutton_X3E_X3Cp_X3E_X3C_X2Fp_X3E_X3C_X2Fform_X3E), + /* K7 */ be_nested_str_weak(onsubmit_X3D_X27return_X20confirm_X28_X22Changing_X20the_X20configuration_X20requires_X20to_X20associate_X20again_X2E_X22_X29_X3B_X27_X3E), + /* K8 */ be_nested_str_weak(_X3Ctable_X20style_X3D_X27width_X3A100_X25_X27_X3E), + /* K9 */ be_nested_str_weak(_X3Ctr_X3E_X3Ctd_X20width_X3D_X2735_X27_X3E_X3Cb_X3EEp_X2E_X3C_X2Fb_X3E_X3C_X2Ftd_X3E_X3Ctd_X3E_X3Cb_X3EType_X3C_X2Fb_X3E_X3C_X2Ftd_X3E_X3Ctd_X3E_X3Cb_X3EParam_X3C_X2Fb_X3E_X3C_X2Ftd_X3E_X3C_X2Ftr_X3E), + /* K10 */ be_nested_str_weak(device), + /* K11 */ be_nested_str_weak(k2l_num), + /* K12 */ be_nested_str_weak(plugins_config), + /* K13 */ be_const_int(0), + /* K14 */ be_nested_str_weak(find), + /* K15 */ be_nested_str_weak(type), + /* K16 */ be_nested_str_weak(format), + /* K17 */ be_nested_str_weak(_X3Ctr_X3E_X3Ctd_X3E_X3Cinput_X20type_X3D_X27text_X27_X20name_X3D_X27ep_X2503i_X27_X20maxlength_X3D_X274_X27_X20size_X3D_X273_X27_X20value_X3D_X270_X27_X20readonly_X3E_X3C_X2Ftd_X3E), + /* K18 */ be_nested_str_weak(_X3Ctd_X3E_X3Cselect_X20name_X3D_X27pi_X2503i_X27_X3E), + /* K19 */ be_nested_str_weak(plugin_option), + /* K20 */ be_nested_str_weak(), + /* K21 */ be_nested_str_weak(_ROOT_TYPES), + /* K22 */ be_nested_str_weak(_X3C_X2Fselect_X3E_X3C_X2Ftd_X3E), + /* K23 */ be_nested_str_weak(_X3Ctd_X3E_X3Cfont_X20size_X3D_X27_X2D1_X27_X3E_X26nbsp_X3B_X3C_X2Ffont_X3E_X3C_X2Ftd_X3E), + /* K24 */ be_const_int(1), + /* K25 */ be_nested_str_weak(get_plugin_class_arg), + /* K26 */ be_nested_str_weak(_X3Ctr_X3E_X3Ctd_X3E_X3Cinput_X20type_X3D_X27text_X27_X20name_X3D_X27ep_X2503i_X27_X20maxlength_X3D_X274_X27_X20size_X3D_X273_X27_X20pattern_X3D_X27_X5B0_X2D9_X5D_X7B1_X2C4_X7D_X27_X20value_X3D_X27_X25i_X27_X3E_X3C_X2Ftd_X3E), + /* K27 */ be_nested_str_weak(_CLASSES_TYPES), + /* K28 */ be_nested_str_weak(_X3Ctd_X3E_X3Cfont_X20size_X3D_X27_X2D1_X27_X3E_X3Cinput_X20type_X3D_X27text_X27_X20name_X3D_X27arg_X2503i_X27_X20minlength_X3D_X270_X27_X20size_X3D_X278_X27_X20value_X3D_X27_X25s_X27_X3E_X3C_X2Ffont_X3E_X3C_X2Ftd_X3E), + /* K29 */ be_nested_str_weak(html_escape), + /* K30 */ be_nested_str_weak(_X3Ctr_X3E_X3Ctd_X3E_X3Cinput_X20type_X3D_X27text_X27_X20name_X3D_X27ep_X2503i_X27_X20maxlength_X3D_X274_X27_X20size_X3D_X273_X27_X20pattern_X3D_X27_X5B0_X2D9_X5D_X7B1_X2C4_X7D_X27_X20value_X3D_X27_X27_X3E_X3C_X2Ftd_X3E), + /* K31 */ be_nested_str_weak(_X3Ctd_X3E_X3Cfont_X20size_X3D_X27_X2D1_X27_X3E_X3Cinput_X20type_X3D_X27text_X27_X20name_X3D_X27arg_X2503i_X27_X20minlength_X3D_X270_X27_X20size_X3D_X278_X27_X20value_X3D_X27_X27_X3E_X3C_X2Ffont_X3E_X3C_X2Ftd_X3E), + /* K32 */ be_nested_str_weak(_X3C_X2Ftable_X3E_X3Cp_X3E_X3C_X2Fp_X3E), + /* K33 */ be_nested_str_weak(_X3Cbutton_X20name_X3D_X27config_X27_X20class_X3D_X27button_X20bgrn_X27_X3EChange_X20configuration_X3C_X2Fbutton_X3E_X3C_X2Fform_X3E), + /* K34 */ be_nested_str_weak(_X3Cp_X3E_X3C_X2Fp_X3E_X3C_X2Ffieldset_X3E_X3Cp_X3E_X3C_X2Fp_X3E), + }), + be_str_weak(show_plugins_configuration), + &be_const_str_solidified, + ( &(const binstruction[180]) { /* code */ + 0xA4060000, // 0000 IMPORT R1 K0 + 0xA40A0200, // 0001 IMPORT R2 K1 + 0x8C0C0302, // 0002 GETMET R3 R1 K2 + 0x58140003, // 0003 LDCONST R5 K3 + 0x7C0C0400, // 0004 CALL R3 2 + 0x8C0C0302, // 0005 GETMET R3 R1 K2 + 0x58140004, // 0006 LDCONST R5 K4 + 0x7C0C0400, // 0007 CALL R3 2 + 0x8C0C0302, // 0008 GETMET R3 R1 K2 + 0x58140005, // 0009 LDCONST R5 K5 + 0x7C0C0400, // 000A CALL R3 2 + 0x8C0C0302, // 000B GETMET R3 R1 K2 + 0x58140006, // 000C LDCONST R5 K6 + 0x7C0C0400, // 000D CALL R3 2 + 0x8C0C0302, // 000E GETMET R3 R1 K2 + 0x58140004, // 000F LDCONST R5 K4 + 0x7C0C0400, // 0010 CALL R3 2 + 0x8C0C0302, // 0011 GETMET R3 R1 K2 + 0x58140007, // 0012 LDCONST R5 K7 + 0x7C0C0400, // 0013 CALL R3 2 + 0x8C0C0302, // 0014 GETMET R3 R1 K2 + 0x58140008, // 0015 LDCONST R5 K8 + 0x7C0C0400, // 0016 CALL R3 2 + 0x8C0C0302, // 0017 GETMET R3 R1 K2 + 0x58140009, // 0018 LDCONST R5 K9 + 0x7C0C0400, // 0019 CALL R3 2 + 0x880C010A, // 001A GETMBR R3 R0 K10 + 0x8C0C070B, // 001B GETMET R3 R3 K11 + 0x8814010A, // 001C GETMBR R5 R0 K10 + 0x88140B0C, // 001D GETMBR R5 R5 K12 + 0x7C0C0400, // 001E CALL R3 2 + 0x5810000D, // 001F LDCONST R4 K13 + 0x9414070D, // 0020 GETIDX R5 R3 K13 + 0x1C140B0D, // 0021 EQ R5 R5 K13 + 0x78160026, // 0022 JMPF R5 #004A + 0x94140604, // 0023 GETIDX R5 R3 R4 + 0x8818010A, // 0024 GETMBR R6 R0 K10 + 0x601C0008, // 0025 GETGBL R7 G8 + 0x5C200A00, // 0026 MOVE R8 R5 + 0x7C1C0200, // 0027 CALL R7 1 + 0x88180D0C, // 0028 GETMBR R6 R6 K12 + 0x94180C07, // 0029 GETIDX R6 R6 R7 + 0x8C200D0E, // 002A GETMET R8 R6 K14 + 0x5828000F, // 002B LDCONST R10 K15 + 0x7C200400, // 002C CALL R8 2 + 0x5C1C1000, // 002D MOVE R7 R8 + 0x8C200302, // 002E GETMET R8 R1 K2 + 0x8C280510, // 002F GETMET R10 R2 K16 + 0x58300011, // 0030 LDCONST R12 K17 + 0x5C340800, // 0031 MOVE R13 R4 + 0x7C280600, // 0032 CALL R10 3 + 0x7C200400, // 0033 CALL R8 2 + 0x8C200302, // 0034 GETMET R8 R1 K2 + 0x8C280510, // 0035 GETMET R10 R2 K16 + 0x58300012, // 0036 LDCONST R12 K18 + 0x5C340800, // 0037 MOVE R13 R4 + 0x7C280600, // 0038 CALL R10 3 + 0x7C200400, // 0039 CALL R8 2 + 0x8C200113, // 003A GETMET R8 R0 K19 + 0x8C280D0E, // 003B GETMET R10 R6 K14 + 0x5830000F, // 003C LDCONST R12 K15 + 0x58340014, // 003D LDCONST R13 K20 + 0x7C280600, // 003E CALL R10 3 + 0x882C0115, // 003F GETMBR R11 R0 K21 + 0x7C200600, // 0040 CALL R8 3 + 0x8C200302, // 0041 GETMET R8 R1 K2 + 0x8C280510, // 0042 GETMET R10 R2 K16 + 0x58300016, // 0043 LDCONST R12 K22 + 0x7C280400, // 0044 CALL R10 2 + 0x7C200400, // 0045 CALL R8 2 + 0x8C200302, // 0046 GETMET R8 R1 K2 + 0x58280017, // 0047 LDCONST R10 K23 + 0x7C200400, // 0048 CALL R8 2 + 0x00100918, // 0049 ADD R4 R4 K24 + 0x6014000C, // 004A GETGBL R5 G12 + 0x5C180600, // 004B MOVE R6 R3 + 0x7C140200, // 004C CALL R5 1 + 0x14140805, // 004D LT R5 R4 R5 + 0x7816003F, // 004E JMPF R5 #008F + 0x94140604, // 004F GETIDX R5 R3 R4 + 0x8818010A, // 0050 GETMBR R6 R0 K10 + 0x601C0008, // 0051 GETGBL R7 G8 + 0x5C200A00, // 0052 MOVE R8 R5 + 0x7C1C0200, // 0053 CALL R7 1 + 0x88180D0C, // 0054 GETMBR R6 R6 K12 + 0x94180C07, // 0055 GETIDX R6 R6 R7 + 0x8C200D0E, // 0056 GETMET R8 R6 K14 + 0x5828000F, // 0057 LDCONST R10 K15 + 0x7C200400, // 0058 CALL R8 2 + 0x5C1C1000, // 0059 MOVE R7 R8 + 0x5C200E00, // 005A MOVE R8 R7 + 0x74220001, // 005B JMPT R8 #005E + 0x00100918, // 005C ADD R4 R4 K24 + 0x7001FFEB, // 005D JMP #004A + 0x8820010A, // 005E GETMBR R8 R0 K10 + 0x8C201119, // 005F GETMET R8 R8 K25 + 0x5C280E00, // 0060 MOVE R10 R7 + 0x7C200400, // 0061 CALL R8 2 + 0x78220006, // 0062 JMPF R8 #006A + 0x60240008, // 0063 GETGBL R9 G8 + 0x8C280D0E, // 0064 GETMET R10 R6 K14 + 0x5C301000, // 0065 MOVE R12 R8 + 0x58340014, // 0066 LDCONST R13 K20 + 0x7C280600, // 0067 CALL R10 3 + 0x7C240200, // 0068 CALL R9 1 + 0x70020000, // 0069 JMP #006B + 0x58240014, // 006A LDCONST R9 K20 + 0x8C280302, // 006B GETMET R10 R1 K2 + 0x8C300510, // 006C GETMET R12 R2 K16 + 0x5838001A, // 006D LDCONST R14 K26 + 0x5C3C0800, // 006E MOVE R15 R4 + 0x5C400A00, // 006F MOVE R16 R5 + 0x7C300800, // 0070 CALL R12 4 + 0x7C280400, // 0071 CALL R10 2 + 0x8C280302, // 0072 GETMET R10 R1 K2 + 0x8C300510, // 0073 GETMET R12 R2 K16 + 0x58380012, // 0074 LDCONST R14 K18 + 0x5C3C0800, // 0075 MOVE R15 R4 + 0x7C300600, // 0076 CALL R12 3 + 0x7C280400, // 0077 CALL R10 2 + 0x8C280113, // 0078 GETMET R10 R0 K19 + 0x8C300D0E, // 0079 GETMET R12 R6 K14 + 0x5838000F, // 007A LDCONST R14 K15 + 0x583C0014, // 007B LDCONST R15 K20 + 0x7C300600, // 007C CALL R12 3 + 0x8834011B, // 007D GETMBR R13 R0 K27 + 0x7C280600, // 007E CALL R10 3 + 0x8C280302, // 007F GETMET R10 R1 K2 + 0x8C300510, // 0080 GETMET R12 R2 K16 + 0x58380016, // 0081 LDCONST R14 K22 + 0x7C300400, // 0082 CALL R12 2 + 0x7C280400, // 0083 CALL R10 2 + 0x8C280302, // 0084 GETMET R10 R1 K2 + 0x8C300510, // 0085 GETMET R12 R2 K16 + 0x5838001C, // 0086 LDCONST R14 K28 + 0x5C3C0800, // 0087 MOVE R15 R4 + 0x8C40031D, // 0088 GETMET R16 R1 K29 + 0x5C481200, // 0089 MOVE R18 R9 + 0x7C400400, // 008A CALL R16 2 + 0x7C300800, // 008B CALL R12 4 + 0x7C280400, // 008C CALL R10 2 + 0x00100918, // 008D ADD R4 R4 K24 + 0x7001FFBA, // 008E JMP #004A + 0x8C140302, // 008F GETMET R5 R1 K2 + 0x8C1C0510, // 0090 GETMET R7 R2 K16 + 0x5824001E, // 0091 LDCONST R9 K30 + 0x5C280800, // 0092 MOVE R10 R4 + 0x7C1C0600, // 0093 CALL R7 3 + 0x7C140400, // 0094 CALL R5 2 + 0x8C140302, // 0095 GETMET R5 R1 K2 + 0x8C1C0510, // 0096 GETMET R7 R2 K16 + 0x58240012, // 0097 LDCONST R9 K18 + 0x5C280800, // 0098 MOVE R10 R4 + 0x7C1C0600, // 0099 CALL R7 3 + 0x7C140400, // 009A CALL R5 2 + 0x8C140113, // 009B GETMET R5 R0 K19 + 0x581C0014, // 009C LDCONST R7 K20 + 0x8820011B, // 009D GETMBR R8 R0 K27 + 0x7C140600, // 009E CALL R5 3 + 0x8C140302, // 009F GETMET R5 R1 K2 + 0x8C1C0510, // 00A0 GETMET R7 R2 K16 + 0x58240016, // 00A1 LDCONST R9 K22 + 0x7C1C0400, // 00A2 CALL R7 2 + 0x7C140400, // 00A3 CALL R5 2 + 0x8C140302, // 00A4 GETMET R5 R1 K2 + 0x8C1C0510, // 00A5 GETMET R7 R2 K16 + 0x5824001F, // 00A6 LDCONST R9 K31 + 0x5C280800, // 00A7 MOVE R10 R4 + 0x7C1C0600, // 00A8 CALL R7 3 + 0x7C140400, // 00A9 CALL R5 2 + 0x8C140302, // 00AA GETMET R5 R1 K2 + 0x581C0020, // 00AB LDCONST R7 K32 + 0x7C140400, // 00AC CALL R5 2 + 0x8C140302, // 00AD GETMET R5 R1 K2 + 0x581C0021, // 00AE LDCONST R7 K33 + 0x7C140400, // 00AF CALL R5 2 + 0x8C140302, // 00B0 GETMET R5 R1 K2 + 0x581C0022, // 00B1 LDCONST R7 K34 + 0x7C140400, // 00B2 CALL R5 2 + 0x80000000, // 00B3 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: page_part_mgr +********************************************************************/ +be_local_closure(Matter_UI_page_part_mgr, /* name */ + be_nested_proto( + 6, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[13]) { /* constants */ + /* K0 */ be_nested_str_weak(webserver), + /* K1 */ be_nested_str_weak(string), + /* K2 */ be_nested_str_weak(check_privileged_access), + /* K3 */ be_nested_str_weak(content_start), + /* K4 */ be_nested_str_weak(Matter), + /* K5 */ be_nested_str_weak(content_send_style), + /* K6 */ be_nested_str_weak(show_enable), + /* K7 */ be_nested_str_weak(show_passcode_form), + /* K8 */ be_nested_str_weak(show_plugins_configuration), + /* K9 */ be_nested_str_weak(show_fabric_info), + /* K10 */ be_nested_str_weak(content_button), + /* K11 */ be_nested_str_weak(BUTTON_CONFIGURATION), + /* K12 */ be_nested_str_weak(content_stop), + }), + be_str_weak(page_part_mgr), + &be_const_str_solidified, + ( &(const binstruction[27]) { /* code */ + 0xA4060000, // 0000 IMPORT R1 K0 + 0xA40A0200, // 0001 IMPORT R2 K1 + 0x8C0C0302, // 0002 GETMET R3 R1 K2 + 0x7C0C0200, // 0003 CALL R3 1 + 0x740E0001, // 0004 JMPT R3 #0007 + 0x4C0C0000, // 0005 LDNIL R3 + 0x80040600, // 0006 RET 1 R3 + 0x8C0C0303, // 0007 GETMET R3 R1 K3 + 0x58140004, // 0008 LDCONST R5 K4 + 0x7C0C0400, // 0009 CALL R3 2 + 0x8C0C0305, // 000A GETMET R3 R1 K5 + 0x7C0C0200, // 000B CALL R3 1 + 0x8C0C0106, // 000C GETMET R3 R0 K6 + 0x7C0C0200, // 000D CALL R3 1 + 0x780E0005, // 000E JMPF R3 #0015 + 0x8C0C0107, // 000F GETMET R3 R0 K7 + 0x7C0C0200, // 0010 CALL R3 1 + 0x8C0C0108, // 0011 GETMET R3 R0 K8 + 0x7C0C0200, // 0012 CALL R3 1 + 0x8C0C0109, // 0013 GETMET R3 R0 K9 + 0x7C0C0200, // 0014 CALL R3 1 + 0x8C0C030A, // 0015 GETMET R3 R1 K10 + 0x8814030B, // 0016 GETMBR R5 R1 K11 + 0x7C0C0400, // 0017 CALL R3 2 + 0x8C0C030C, // 0018 GETMET R3 R1 K12 + 0x7C0C0200, // 0019 CALL R3 1 + 0x80000000, // 001A RET 0 + }) + ) +); +/*******************************************************************/ + + /******************************************************************** ** Solidified function: show_commissioning_info ********************************************************************/ @@ -117,87 +420,88 @@ be_local_closure(Matter_UI_show_commissioning_info, /* name */ /******************************************************************** -** Solidified function: show_enable +** Solidified function: web_add_handler ********************************************************************/ -be_local_closure(Matter_UI_show_enable, /* name */ +be_local_closure(Matter_UI_web_add_handler, /* name */ be_nested_proto( - 11, /* nstack */ - 2, /* argc */ + 7, /* nstack */ + 1, /* argc */ 2, /* varg */ 0, /* has upvals */ NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[20]) { /* constants */ - /* K0 */ be_nested_str_weak(webserver), - /* K1 */ be_nested_str_weak(string), - /* K2 */ be_nested_str_weak(tasmota), - /* K3 */ be_nested_str_weak(get_option), - /* K4 */ be_nested_str_weak(matter), - /* K5 */ be_nested_str_weak(MATTER_OPTION), - /* K6 */ be_nested_str_weak(content_send), - /* K7 */ be_nested_str_weak(format), - /* K8 */ be_nested_str_weak(_X3Cfieldset_X3E_X3Clegend_X3E_X3Cb_X3E_X26nbsp_X3BMatter_X20_X25s_X26nbsp_X3B_X3C_X2Fb_X3E_X3C_X2Flegend_X3E_X3Cp_X3E_X3C_X2Fp_X3E), - /* K9 */ be_nested_str_weak(Enabled), - /* K10 */ be_nested_str_weak(Disabled), - /* K11 */ be_nested_str_weak(_X3Cp_X20style_X3D_X27width_X3A320px_X3B_X27_X3ECheck_X20the_X20_X3Ca_X20href_X3D_X27https_X3A_X2F_X2Ftasmota_X2Egithub_X2Eio_X2Fdocs_X2FMatter_X2F_X27_X20target_X3D_X27_blank_X27_X3EMatter_X20documentation_X3C_X2Fa_X3E_X2E_X3C_X2Fp_X3E), - /* K12 */ be_nested_str_weak(_X3Cform_X20action_X3D_X27_X2Fmatterc_X27_X20method_X3D_X27post_X27_X20onsubmit_X3D_X27return_X20confirm_X28_X22This_X20will_X20cause_X20a_X20restart_X2E_X22_X29_X3B_X27_X3E), - /* K13 */ be_nested_str_weak(_X3Cp_X3E_X3C_X2Fp_X3E_X3Cbutton_X20name_X3D_X27_X25s_X27_X20class_X3D_X27button_X20bgrn_X27_X3E), - /* K14 */ be_nested_str_weak(disable), - /* K15 */ be_nested_str_weak(enable), - /* K16 */ be_nested_str_weak(Disable), - /* K17 */ be_nested_str_weak(Enable), - /* K18 */ be_nested_str_weak(_X20Matter_X3C_X2Fbutton_X3E_X3C_X2Fform_X3E_X3C_X2Fp_X3E), - /* K19 */ be_nested_str_weak(_X3Cp_X3E_X3C_X2Fp_X3E_X3C_X2Ffieldset_X3E_X3Cp_X3E_X3C_X2Fp_X3E), + 1, /* has sup protos */ + ( &(const struct bproto*[ 2]) { + be_nested_proto( + 2, /* nstack */ + 0, /* argc */ + 0, /* varg */ + 1, /* has upvals */ + ( &(const bupvaldesc[ 1]) { /* upvals */ + be_local_const_upval(1, 0), + }), + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 1]) { /* constants */ + /* K0 */ be_nested_str_weak(page_part_mgr), + }), + be_str_weak(_X3Clambda_X3E), + &be_const_str_solidified, + ( &(const binstruction[ 4]) { /* code */ + 0x68000000, // 0000 GETUPV R0 U0 + 0x8C000100, // 0001 GETMET R0 R0 K0 + 0x7C000200, // 0002 CALL R0 1 + 0x80040000, // 0003 RET 1 R0 + }) + ), + be_nested_proto( + 2, /* nstack */ + 0, /* argc */ + 0, /* varg */ + 1, /* has upvals */ + ( &(const bupvaldesc[ 1]) { /* upvals */ + be_local_const_upval(1, 0), + }), + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 1]) { /* constants */ + /* K0 */ be_nested_str_weak(page_part_ctl), + }), + be_str_weak(_X3Clambda_X3E), + &be_const_str_solidified, + ( &(const binstruction[ 4]) { /* code */ + 0x68000000, // 0000 GETUPV R0 U0 + 0x8C000100, // 0001 GETMET R0 R0 K0 + 0x7C000200, // 0002 CALL R0 1 + 0x80040000, // 0003 RET 1 R0 + }) + ), }), - be_str_weak(show_enable), + 1, /* has constants */ + ( &(const bvalue[ 5]) { /* constants */ + /* K0 */ be_nested_str_weak(webserver), + /* K1 */ be_nested_str_weak(on), + /* K2 */ be_nested_str_weak(_X2Fmatterc), + /* K3 */ be_nested_str_weak(HTTP_GET), + /* K4 */ be_nested_str_weak(HTTP_POST), + }), + be_str_weak(web_add_handler), &be_const_str_solidified, - ( &(const binstruction[44]) { /* code */ - 0xA40A0000, // 0000 IMPORT R2 K0 - 0xA40E0200, // 0001 IMPORT R3 K1 - 0xB8120400, // 0002 GETNGBL R4 K2 - 0x8C100903, // 0003 GETMET R4 R4 K3 - 0xB81A0800, // 0004 GETNGBL R6 K4 - 0x88180D05, // 0005 GETMBR R6 R6 K5 - 0x7C100400, // 0006 CALL R4 2 - 0x8C140506, // 0007 GETMET R5 R2 K6 - 0x8C1C0707, // 0008 GETMET R7 R3 K7 - 0x58240008, // 0009 LDCONST R9 K8 - 0x78120001, // 000A JMPF R4 #000D - 0x58280009, // 000B LDCONST R10 K9 - 0x70020000, // 000C JMP #000E - 0x5828000A, // 000D LDCONST R10 K10 - 0x7C1C0600, // 000E CALL R7 3 - 0x7C140400, // 000F CALL R5 2 - 0x8C140506, // 0010 GETMET R5 R2 K6 - 0x581C000B, // 0011 LDCONST R7 K11 - 0x7C140400, // 0012 CALL R5 2 - 0x8C140506, // 0013 GETMET R5 R2 K6 - 0x581C000C, // 0014 LDCONST R7 K12 - 0x7C140400, // 0015 CALL R5 2 - 0x8C140506, // 0016 GETMET R5 R2 K6 - 0x8C1C0707, // 0017 GETMET R7 R3 K7 - 0x5824000D, // 0018 LDCONST R9 K13 - 0x78120001, // 0019 JMPF R4 #001C - 0x5828000E, // 001A LDCONST R10 K14 - 0x70020000, // 001B JMP #001D - 0x5828000F, // 001C LDCONST R10 K15 - 0x7C1C0600, // 001D CALL R7 3 - 0x7C140400, // 001E CALL R5 2 - 0x8C140506, // 001F GETMET R5 R2 K6 - 0x78120001, // 0020 JMPF R4 #0023 - 0x581C0010, // 0021 LDCONST R7 K16 - 0x70020000, // 0022 JMP #0024 - 0x581C0011, // 0023 LDCONST R7 K17 - 0x7C140400, // 0024 CALL R5 2 - 0x8C140506, // 0025 GETMET R5 R2 K6 - 0x581C0012, // 0026 LDCONST R7 K18 - 0x7C140400, // 0027 CALL R5 2 - 0x8C140506, // 0028 GETMET R5 R2 K6 - 0x581C0013, // 0029 LDCONST R7 K19 - 0x7C140400, // 002A CALL R5 2 - 0x80040800, // 002B RET 1 R4 + ( &(const binstruction[13]) { /* code */ + 0xA4060000, // 0000 IMPORT R1 K0 + 0x8C080301, // 0001 GETMET R2 R1 K1 + 0x58100002, // 0002 LDCONST R4 K2 + 0x84140000, // 0003 CLOSURE R5 P0 + 0x88180303, // 0004 GETMBR R6 R1 K3 + 0x7C080800, // 0005 CALL R2 4 + 0x8C080301, // 0006 GETMET R2 R1 K1 + 0x58100002, // 0007 LDCONST R4 K2 + 0x84140001, // 0008 CLOSURE R5 P1 + 0x88180304, // 0009 GETMBR R6 R1 K4 + 0x7C080800, // 000A CALL R2 4 + 0xA0000000, // 000B CLOSE R0 + 0x80000000, // 000C RET 0 }) ) ); @@ -205,32 +509,47 @@ be_local_closure(Matter_UI_show_enable, /* name */ /******************************************************************** -** Solidified function: init +** Solidified function: web_get_arg ********************************************************************/ -be_local_closure(Matter_UI_init, /* name */ +be_local_closure(Matter_UI_web_get_arg, /* name */ be_nested_proto( 5, /* nstack */ - 2, /* argc */ + 1, /* argc */ 2, /* varg */ 0, /* has upvals */ NULL, /* no upvals */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[ 3]) { /* constants */ - /* K0 */ be_nested_str_weak(device), - /* K1 */ be_nested_str_weak(tasmota), - /* K2 */ be_nested_str_weak(add_driver), + ( &(const bvalue[ 7]) { /* constants */ + /* K0 */ be_nested_str_weak(webserver), + /* K1 */ be_nested_str_weak(has_arg), + /* K2 */ be_nested_str_weak(mtc0), + /* K3 */ be_nested_str_weak(device), + /* K4 */ be_nested_str_weak(stop_basic_commissioning), + /* K5 */ be_nested_str_weak(mtc1), + /* K6 */ be_nested_str_weak(start_root_basic_commissioning), }), - be_str_weak(init), + be_str_weak(web_get_arg), &be_const_str_solidified, - ( &(const binstruction[ 6]) { /* code */ - 0x90020001, // 0000 SETMBR R0 K0 R1 - 0xB80A0200, // 0001 GETNGBL R2 K1 - 0x8C080502, // 0002 GETMET R2 R2 K2 - 0x5C100000, // 0003 MOVE R4 R0 - 0x7C080400, // 0004 CALL R2 2 - 0x80000000, // 0005 RET 0 + ( &(const binstruction[17]) { /* code */ + 0xA4060000, // 0000 IMPORT R1 K0 + 0x8C080301, // 0001 GETMET R2 R1 K1 + 0x58100002, // 0002 LDCONST R4 K2 + 0x7C080400, // 0003 CALL R2 2 + 0x780A0003, // 0004 JMPF R2 #0009 + 0x88080103, // 0005 GETMBR R2 R0 K3 + 0x8C080504, // 0006 GETMET R2 R2 K4 + 0x7C080200, // 0007 CALL R2 1 + 0x70020006, // 0008 JMP #0010 + 0x8C080301, // 0009 GETMET R2 R1 K1 + 0x58100005, // 000A LDCONST R4 K5 + 0x7C080400, // 000B CALL R2 2 + 0x780A0002, // 000C JMPF R2 #0010 + 0x88080103, // 000D GETMBR R2 R0 K3 + 0x8C080506, // 000E GETMET R2 R2 K6 + 0x7C080200, // 000F CALL R2 1 + 0x80000000, // 0010 RET 0 }) ) ); @@ -326,268 +645,6 @@ be_local_closure(Matter_UI_show_passcode_form, /* name */ /*******************************************************************/ -/******************************************************************** -** Solidified function: web_add_config_button -********************************************************************/ -be_local_closure(Matter_UI_web_add_config_button, /* name */ - be_nested_proto( - 5, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 6]) { /* constants */ - /* K0 */ be_nested_str_weak(webserver), - /* K1 */ be_nested_str_weak(content_send), - /* K2 */ be_nested_str_weak(_X3Cp_X3E_X3Cform_X20id_X3Dac_X20action_X3D_X27matterc_X27_X20style_X3D_X27display_X3A_X20block_X3B_X27_X20method_X3D_X27get_X27_X3E_X3Cbutton_X3E), - /* K3 */ be_nested_str_weak(matter), - /* K4 */ be_nested_str_weak(_LOGO), - /* K5 */ be_nested_str_weak(_X20Configure_X20Matter_X3C_X2Fbutton_X3E_X3C_X2Fform_X3E_X3C_X2Fp_X3E), - }), - be_str_weak(web_add_config_button), - &be_const_str_solidified, - ( &(const binstruction[12]) { /* code */ - 0xA4060000, // 0000 IMPORT R1 K0 - 0x8C080301, // 0001 GETMET R2 R1 K1 - 0x58100002, // 0002 LDCONST R4 K2 - 0x7C080400, // 0003 CALL R2 2 - 0x8C080301, // 0004 GETMET R2 R1 K1 - 0xB8120600, // 0005 GETNGBL R4 K3 - 0x88100904, // 0006 GETMBR R4 R4 K4 - 0x7C080400, // 0007 CALL R2 2 - 0x8C080301, // 0008 GETMET R2 R1 K1 - 0x58100005, // 0009 LDCONST R4 K5 - 0x7C080400, // 000A CALL R2 2 - 0x80000000, // 000B RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: show_fabric_info -********************************************************************/ -be_local_closure(Matter_UI_show_fabric_info, /* name */ - be_nested_proto( - 16, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[30]) { /* constants */ - /* K0 */ be_nested_str_weak(webserver), - /* K1 */ be_nested_str_weak(string), - /* K2 */ be_nested_str_weak(content_send), - /* K3 */ be_nested_str_weak(_X3Cfieldset_X3E_X3Clegend_X3E_X3Cb_X3E_X26nbsp_X3BFabrics_X26nbsp_X3B_X3C_X2Fb_X3E_X3C_X2Flegend_X3E_X3Cp_X3E_X3C_X2Fp_X3E), - /* K4 */ be_nested_str_weak(_X3Cp_X3EExisting_X20fabrics_X3A_X3C_X2Fp_X3E), - /* K5 */ be_nested_str_weak(device), - /* K6 */ be_nested_str_weak(sessions), - /* K7 */ be_const_int(0), - /* K8 */ be_nested_str_weak(_X3Cp_X3E_X3Cb_X3ENone_X3C_X2Fb_X3E_X3C_X2Fp_X3E), - /* K9 */ be_nested_str_weak(fabrics), - /* K10 */ be_nested_str_weak(persistables), - /* K11 */ be_nested_str_weak(_X3Chr_X3E), - /* K12 */ be_nested_str_weak(fabric_label), - /* K13 */ be_nested_str_weak(_X3CNo_X20label_X3E), - /* K14 */ be_nested_str_weak(html_escape), - /* K15 */ be_nested_str_weak(format), - /* K16 */ be_nested_str_weak(_X3Cfieldset_X3E_X3Clegend_X3E_X3Cb_X3E_X26nbsp_X3B_X23_X25i_X20_X25s_X26nbsp_X3B_X3C_X2Fb_X3E_X3C_X2Flegend_X3E_X3Cp_X3E_X3C_X2Fp_X3E), - /* K17 */ be_nested_str_weak(get_fabric_index), - /* K18 */ be_nested_str_weak(get_fabric_id), - /* K19 */ be_nested_str_weak(copy), - /* K20 */ be_nested_str_weak(reverse), - /* K21 */ be_nested_str_weak(get_device_id), - /* K22 */ be_nested_str_weak(Fabric_X3A_X20_X25s_X3Cbr_X3E), - /* K23 */ be_nested_str_weak(tohex), - /* K24 */ be_nested_str_weak(Device_X3A_X20_X25s_X3Cbr_X3E_X26nbsp_X3B), - /* K25 */ be_nested_str_weak(_X3Cform_X20action_X3D_X27_X2Fmatterc_X27_X20method_X3D_X27post_X27_X20onsubmit_X3D_X27return_X20confirm_X28_X22Are_X20you_X20sure_X3F_X22_X29_X3B_X27_X3E), - /* K26 */ be_nested_str_weak(_X3Cinput_X20name_X3D_X27del_fabric_X27_X20type_X3D_X27hidden_X27_X20value_X3D_X27_X25i_X27_X3E), - /* K27 */ be_nested_str_weak(_X3Cbutton_X20name_X3D_X27del_X27_X20class_X3D_X27button_X20bgrn_X27_X3EDelete_X20Fabric_X3C_X2Fbutton_X3E_X3C_X2Fform_X3E_X3C_X2Fp_X3E), - /* K28 */ be_nested_str_weak(_X3Cp_X3E_X3C_X2Fp_X3E_X3C_X2Ffieldset_X3E_X3Cp_X3E_X3C_X2Fp_X3E), - /* K29 */ be_nested_str_weak(stop_iteration), - }), - be_str_weak(show_fabric_info), - &be_const_str_solidified, - ( &(const binstruction[102]) { /* code */ - 0xA4060000, // 0000 IMPORT R1 K0 - 0xA40A0200, // 0001 IMPORT R2 K1 - 0x8C0C0302, // 0002 GETMET R3 R1 K2 - 0x58140003, // 0003 LDCONST R5 K3 - 0x7C0C0400, // 0004 CALL R3 2 - 0x8C0C0302, // 0005 GETMET R3 R1 K2 - 0x58140004, // 0006 LDCONST R5 K4 - 0x7C0C0400, // 0007 CALL R3 2 - 0x600C000C, // 0008 GETGBL R3 G12 - 0x88100105, // 0009 GETMBR R4 R0 K5 - 0x88100906, // 000A GETMBR R4 R4 K6 - 0x88100906, // 000B GETMBR R4 R4 K6 - 0x7C0C0200, // 000C CALL R3 1 - 0x1C0C0707, // 000D EQ R3 R3 K7 - 0x780E0003, // 000E JMPF R3 #0013 - 0x8C0C0302, // 000F GETMET R3 R1 K2 - 0x58140008, // 0010 LDCONST R5 K8 - 0x7C0C0400, // 0011 CALL R3 2 - 0x7002004E, // 0012 JMP #0062 - 0x500C0200, // 0013 LDBOOL R3 1 0 - 0x60100010, // 0014 GETGBL R4 G16 - 0x88140105, // 0015 GETMBR R5 R0 K5 - 0x88140B06, // 0016 GETMBR R5 R5 K6 - 0x88140B09, // 0017 GETMBR R5 R5 K9 - 0x8C140B0A, // 0018 GETMET R5 R5 K10 - 0x7C140200, // 0019 CALL R5 1 - 0x7C100200, // 001A CALL R4 1 - 0xA8020042, // 001B EXBLK 0 #005F - 0x5C140800, // 001C MOVE R5 R4 - 0x7C140000, // 001D CALL R5 0 - 0x5C180600, // 001E MOVE R6 R3 - 0x741A0002, // 001F JMPT R6 #0023 - 0x8C180302, // 0020 GETMET R6 R1 K2 - 0x5820000B, // 0021 LDCONST R8 K11 - 0x7C180400, // 0022 CALL R6 2 - 0x500C0000, // 0023 LDBOOL R3 0 0 - 0x88180B0C, // 0024 GETMBR R6 R5 K12 - 0x5C1C0C00, // 0025 MOVE R7 R6 - 0x741E0000, // 0026 JMPT R7 #0028 - 0x5818000D, // 0027 LDCONST R6 K13 - 0x8C1C030E, // 0028 GETMET R7 R1 K14 - 0x5C240C00, // 0029 MOVE R9 R6 - 0x7C1C0400, // 002A CALL R7 2 - 0x5C180E00, // 002B MOVE R6 R7 - 0x8C1C0302, // 002C GETMET R7 R1 K2 - 0x8C24050F, // 002D GETMET R9 R2 K15 - 0x582C0010, // 002E LDCONST R11 K16 - 0x8C300B11, // 002F GETMET R12 R5 K17 - 0x7C300200, // 0030 CALL R12 1 - 0x5C340C00, // 0031 MOVE R13 R6 - 0x7C240800, // 0032 CALL R9 4 - 0x7C1C0400, // 0033 CALL R7 2 - 0x8C1C0B12, // 0034 GETMET R7 R5 K18 - 0x7C1C0200, // 0035 CALL R7 1 - 0x8C1C0F13, // 0036 GETMET R7 R7 K19 - 0x7C1C0200, // 0037 CALL R7 1 - 0x8C1C0F14, // 0038 GETMET R7 R7 K20 - 0x7C1C0200, // 0039 CALL R7 1 - 0x8C200B15, // 003A GETMET R8 R5 K21 - 0x7C200200, // 003B CALL R8 1 - 0x8C201113, // 003C GETMET R8 R8 K19 - 0x7C200200, // 003D CALL R8 1 - 0x8C201114, // 003E GETMET R8 R8 K20 - 0x7C200200, // 003F CALL R8 1 - 0x8C240302, // 0040 GETMET R9 R1 K2 - 0x8C2C050F, // 0041 GETMET R11 R2 K15 - 0x58340016, // 0042 LDCONST R13 K22 - 0x8C380F17, // 0043 GETMET R14 R7 K23 - 0x7C380200, // 0044 CALL R14 1 - 0x7C2C0600, // 0045 CALL R11 3 - 0x7C240400, // 0046 CALL R9 2 - 0x8C240302, // 0047 GETMET R9 R1 K2 - 0x8C2C050F, // 0048 GETMET R11 R2 K15 - 0x58340018, // 0049 LDCONST R13 K24 - 0x8C381117, // 004A GETMET R14 R8 K23 - 0x7C380200, // 004B CALL R14 1 - 0x7C2C0600, // 004C CALL R11 3 - 0x7C240400, // 004D CALL R9 2 - 0x8C240302, // 004E GETMET R9 R1 K2 - 0x582C0019, // 004F LDCONST R11 K25 - 0x7C240400, // 0050 CALL R9 2 - 0x8C240302, // 0051 GETMET R9 R1 K2 - 0x8C2C050F, // 0052 GETMET R11 R2 K15 - 0x5834001A, // 0053 LDCONST R13 K26 - 0x8C380B11, // 0054 GETMET R14 R5 K17 - 0x7C380200, // 0055 CALL R14 1 - 0x7C2C0600, // 0056 CALL R11 3 - 0x7C240400, // 0057 CALL R9 2 - 0x8C240302, // 0058 GETMET R9 R1 K2 - 0x582C001B, // 0059 LDCONST R11 K27 - 0x7C240400, // 005A CALL R9 2 - 0x8C240302, // 005B GETMET R9 R1 K2 - 0x582C001C, // 005C LDCONST R11 K28 - 0x7C240400, // 005D CALL R9 2 - 0x7001FFBC, // 005E JMP #001C - 0x5810001D, // 005F LDCONST R4 K29 - 0xAC100200, // 0060 CATCH R4 1 0 - 0xB0080000, // 0061 RAISE 2 R0 R0 - 0x8C0C0302, // 0062 GETMET R3 R1 K2 - 0x5814001C, // 0063 LDCONST R5 K28 - 0x7C0C0400, // 0064 CALL R3 2 - 0x80000000, // 0065 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: page_part_mgr -********************************************************************/ -be_local_closure(Matter_UI_page_part_mgr, /* name */ - be_nested_proto( - 6, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[13]) { /* constants */ - /* K0 */ be_nested_str_weak(webserver), - /* K1 */ be_nested_str_weak(string), - /* K2 */ be_nested_str_weak(check_privileged_access), - /* K3 */ be_nested_str_weak(content_start), - /* K4 */ be_nested_str_weak(Matter), - /* K5 */ be_nested_str_weak(content_send_style), - /* K6 */ be_nested_str_weak(show_enable), - /* K7 */ be_nested_str_weak(show_passcode_form), - /* K8 */ be_nested_str_weak(show_plugins_configuration), - /* K9 */ be_nested_str_weak(show_fabric_info), - /* K10 */ be_nested_str_weak(content_button), - /* K11 */ be_nested_str_weak(BUTTON_CONFIGURATION), - /* K12 */ be_nested_str_weak(content_stop), - }), - be_str_weak(page_part_mgr), - &be_const_str_solidified, - ( &(const binstruction[27]) { /* code */ - 0xA4060000, // 0000 IMPORT R1 K0 - 0xA40A0200, // 0001 IMPORT R2 K1 - 0x8C0C0302, // 0002 GETMET R3 R1 K2 - 0x7C0C0200, // 0003 CALL R3 1 - 0x740E0001, // 0004 JMPT R3 #0007 - 0x4C0C0000, // 0005 LDNIL R3 - 0x80040600, // 0006 RET 1 R3 - 0x8C0C0303, // 0007 GETMET R3 R1 K3 - 0x58140004, // 0008 LDCONST R5 K4 - 0x7C0C0400, // 0009 CALL R3 2 - 0x8C0C0305, // 000A GETMET R3 R1 K5 - 0x7C0C0200, // 000B CALL R3 1 - 0x8C0C0106, // 000C GETMET R3 R0 K6 - 0x7C0C0200, // 000D CALL R3 1 - 0x780E0005, // 000E JMPF R3 #0015 - 0x8C0C0107, // 000F GETMET R3 R0 K7 - 0x7C0C0200, // 0010 CALL R3 1 - 0x8C0C0108, // 0011 GETMET R3 R0 K8 - 0x7C0C0200, // 0012 CALL R3 1 - 0x8C0C0109, // 0013 GETMET R3 R0 K9 - 0x7C0C0200, // 0014 CALL R3 1 - 0x8C0C030A, // 0015 GETMET R3 R1 K10 - 0x8814030B, // 0016 GETMBR R5 R1 K11 - 0x7C0C0400, // 0017 CALL R3 2 - 0x8C0C030C, // 0018 GETMET R3 R1 K12 - 0x7C0C0200, // 0019 CALL R3 1 - 0x80000000, // 001A RET 0 - }) - ) -); -/*******************************************************************/ - - /******************************************************************** ** Solidified function: page_part_ctl ********************************************************************/ @@ -1041,9 +1098,9 @@ be_local_closure(Matter_UI_page_part_ctl, /* name */ /******************************************************************** -** Solidified function: web_get_arg +** Solidified function: web_add_config_button ********************************************************************/ -be_local_closure(Matter_UI_web_get_arg, /* name */ +be_local_closure(Matter_UI_web_add_config_button, /* name */ be_nested_proto( 5, /* nstack */ 1, /* argc */ @@ -1053,420 +1110,29 @@ be_local_closure(Matter_UI_web_get_arg, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[ 7]) { /* constants */ + ( &(const bvalue[ 6]) { /* constants */ /* K0 */ be_nested_str_weak(webserver), - /* K1 */ be_nested_str_weak(has_arg), - /* K2 */ be_nested_str_weak(mtc0), - /* K3 */ be_nested_str_weak(device), - /* K4 */ be_nested_str_weak(stop_basic_commissioning), - /* K5 */ be_nested_str_weak(mtc1), - /* K6 */ be_nested_str_weak(start_root_basic_commissioning), + /* K1 */ be_nested_str_weak(content_send), + /* K2 */ be_nested_str_weak(_X3Cp_X3E_X3Cform_X20id_X3Dac_X20action_X3D_X27matterc_X27_X20style_X3D_X27display_X3A_X20block_X3B_X27_X20method_X3D_X27get_X27_X3E_X3Cbutton_X3E), + /* K3 */ be_nested_str_weak(matter), + /* K4 */ be_nested_str_weak(_LOGO), + /* K5 */ be_nested_str_weak(_X20Configure_X20Matter_X3C_X2Fbutton_X3E_X3C_X2Fform_X3E_X3C_X2Fp_X3E), }), - be_str_weak(web_get_arg), + be_str_weak(web_add_config_button), &be_const_str_solidified, - ( &(const binstruction[17]) { /* code */ + ( &(const binstruction[12]) { /* code */ 0xA4060000, // 0000 IMPORT R1 K0 0x8C080301, // 0001 GETMET R2 R1 K1 0x58100002, // 0002 LDCONST R4 K2 0x7C080400, // 0003 CALL R2 2 - 0x780A0003, // 0004 JMPF R2 #0009 - 0x88080103, // 0005 GETMBR R2 R0 K3 - 0x8C080504, // 0006 GETMET R2 R2 K4 - 0x7C080200, // 0007 CALL R2 1 - 0x70020006, // 0008 JMP #0010 - 0x8C080301, // 0009 GETMET R2 R1 K1 - 0x58100005, // 000A LDCONST R4 K5 - 0x7C080400, // 000B CALL R2 2 - 0x780A0002, // 000C JMPF R2 #0010 - 0x88080103, // 000D GETMBR R2 R0 K3 - 0x8C080506, // 000E GETMET R2 R2 K6 - 0x7C080200, // 000F CALL R2 1 - 0x80000000, // 0010 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: show_plugins_configuration -********************************************************************/ -be_local_closure(Matter_UI_show_plugins_configuration, /* name */ - be_nested_proto( - 19, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[31]) { /* constants */ - /* K0 */ be_nested_str_weak(webserver), - /* K1 */ be_nested_str_weak(string), - /* K2 */ be_nested_str_weak(content_send), - /* K3 */ be_nested_str_weak(_X3Cfieldset_X3E_X3Clegend_X3E_X3Cb_X3E_X26nbsp_X3BCurrent_X20Configuration_X26nbsp_X3B_X3C_X2Fb_X3E_X3C_X2Flegend_X3E_X3Cp_X3E_X3C_X2Fp_X3E), - /* K4 */ be_nested_str_weak(_X3Cform_X20action_X3D_X27_X2Fmatterc_X27_X20method_X3D_X27post_X27), - /* K5 */ be_nested_str_weak(onsubmit_X3D_X27return_X20confirm_X28_X22This_X20will_X20RESET_X20the_X20configuration_X20to_X20the_X20default_X2E_X20You_X20will_X20need_X20to_X20associate_X20again_X2E_X22_X29_X3B_X27_X3E), - /* K6 */ be_nested_str_weak(_X3Cbutton_X20name_X3D_X27auto_X27_X20class_X3D_X27button_X20bred_X27_X3EReset_X20to_X20default_X3C_X2Fbutton_X3E_X3Cp_X3E_X3C_X2Fp_X3E_X3C_X2Fform_X3E), - /* K7 */ be_nested_str_weak(onsubmit_X3D_X27return_X20confirm_X28_X22Changing_X20the_X20configuration_X20requires_X20to_X20associate_X20again_X2E_X22_X29_X3B_X27_X3E), - /* K8 */ be_nested_str_weak(_X3Ctable_X20style_X3D_X27width_X3A100_X25_X27_X3E), - /* K9 */ be_nested_str_weak(_X3Ctr_X3E_X3Ctd_X20width_X3D_X2735_X27_X3E_X3Cb_X3EEp_X2E_X3C_X2Fb_X3E_X3C_X2Ftd_X3E_X3Ctd_X3E_X3Cb_X3EType_X3C_X2Fb_X3E_X3C_X2Ftd_X3E_X3Ctd_X3E_X3Cb_X3EParam_X3C_X2Fb_X3E_X3C_X2Ftd_X3E_X3C_X2Ftr_X3E), - /* K10 */ be_nested_str_weak(device), - /* K11 */ be_nested_str_weak(k2l_num), - /* K12 */ be_nested_str_weak(plugins_config), - /* K13 */ be_const_int(0), - /* K14 */ be_nested_str_weak(find), - /* K15 */ be_nested_str_weak(type), - /* K16 */ be_nested_str_weak(get_plugin_class_arg), - /* K17 */ be_nested_str_weak(), - /* K18 */ be_nested_str_weak(format), - /* K19 */ be_nested_str_weak(_X3Ctr_X3E_X3Ctd_X3E_X3Cinput_X20type_X3D_X27text_X27_X20name_X3D_X27ep_X2503i_X27_X20maxlength_X3D_X274_X27_X20size_X3D_X273_X27_X20pattern_X3D_X27_X5B0_X2D9_X5D_X7B1_X2C4_X7D_X27_X20value_X3D_X27_X25i_X27_X3E_X3C_X2Ftd_X3E), - /* K20 */ be_nested_str_weak(_X3Ctd_X3E_X3Cselect_X20name_X3D_X27pi_X2503i_X27_X3E), - /* K21 */ be_nested_str_weak(plugin_option), - /* K22 */ be_nested_str_weak(_X3C_X2Fselect_X3E_X3C_X2Ftd_X3E), - /* K23 */ be_nested_str_weak(_X3Ctd_X3E_X3Cfont_X20size_X3D_X27_X2D1_X27_X3E_X3Cinput_X20type_X3D_X27text_X27_X20name_X3D_X27arg_X2503i_X27_X20minlength_X3D_X270_X27_X20size_X3D_X278_X27_X20value_X3D_X27_X25s_X27_X3E_X3C_X2Ffont_X3E_X3C_X2Ftd_X3E), - /* K24 */ be_nested_str_weak(html_escape), - /* K25 */ be_const_int(1), - /* K26 */ be_nested_str_weak(_X3Ctr_X3E_X3Ctd_X3E_X3Cinput_X20type_X3D_X27text_X27_X20name_X3D_X27ep_X2503i_X27_X20maxlength_X3D_X274_X27_X20size_X3D_X273_X27_X20pattern_X3D_X27_X5B0_X2D9_X5D_X7B1_X2C4_X7D_X27_X20value_X3D_X27_X27_X3E_X3C_X2Ftd_X3E), - /* K27 */ be_nested_str_weak(_X3Ctd_X3E_X3Cfont_X20size_X3D_X27_X2D1_X27_X3E_X3Cinput_X20type_X3D_X27text_X27_X20name_X3D_X27arg_X2503i_X27_X20minlength_X3D_X270_X27_X20size_X3D_X278_X27_X20value_X3D_X27_X27_X3E_X3C_X2Ffont_X3E_X3C_X2Ftd_X3E), - /* K28 */ be_nested_str_weak(_X3C_X2Ftable_X3E_X3Cp_X3E_X3C_X2Fp_X3E), - /* K29 */ be_nested_str_weak(_X3Cbutton_X20name_X3D_X27config_X27_X20class_X3D_X27button_X20bgrn_X27_X3EChange_X20configuration_X3C_X2Fbutton_X3E_X3C_X2Fform_X3E), - /* K30 */ be_nested_str_weak(_X3Cp_X3E_X3C_X2Fp_X3E_X3C_X2Ffieldset_X3E_X3Cp_X3E_X3C_X2Fp_X3E), - }), - be_str_weak(show_plugins_configuration), - &be_const_str_solidified, - ( &(const binstruction[135]) { /* code */ - 0xA4060000, // 0000 IMPORT R1 K0 - 0xA40A0200, // 0001 IMPORT R2 K1 - 0x8C0C0302, // 0002 GETMET R3 R1 K2 - 0x58140003, // 0003 LDCONST R5 K3 - 0x7C0C0400, // 0004 CALL R3 2 - 0x8C0C0302, // 0005 GETMET R3 R1 K2 - 0x58140004, // 0006 LDCONST R5 K4 - 0x7C0C0400, // 0007 CALL R3 2 - 0x8C0C0302, // 0008 GETMET R3 R1 K2 - 0x58140005, // 0009 LDCONST R5 K5 - 0x7C0C0400, // 000A CALL R3 2 - 0x8C0C0302, // 000B GETMET R3 R1 K2 - 0x58140006, // 000C LDCONST R5 K6 - 0x7C0C0400, // 000D CALL R3 2 - 0x8C0C0302, // 000E GETMET R3 R1 K2 - 0x58140004, // 000F LDCONST R5 K4 - 0x7C0C0400, // 0010 CALL R3 2 - 0x8C0C0302, // 0011 GETMET R3 R1 K2 - 0x58140007, // 0012 LDCONST R5 K7 - 0x7C0C0400, // 0013 CALL R3 2 - 0x8C0C0302, // 0014 GETMET R3 R1 K2 - 0x58140008, // 0015 LDCONST R5 K8 - 0x7C0C0400, // 0016 CALL R3 2 - 0x8C0C0302, // 0017 GETMET R3 R1 K2 - 0x58140009, // 0018 LDCONST R5 K9 - 0x7C0C0400, // 0019 CALL R3 2 - 0x880C010A, // 001A GETMBR R3 R0 K10 - 0x8C0C070B, // 001B GETMET R3 R3 K11 - 0x8814010A, // 001C GETMBR R5 R0 K10 - 0x88140B0C, // 001D GETMBR R5 R5 K12 - 0x7C0C0400, // 001E CALL R3 2 - 0x5810000D, // 001F LDCONST R4 K13 - 0x6014000C, // 0020 GETGBL R5 G12 - 0x5C180600, // 0021 MOVE R6 R3 - 0x7C140200, // 0022 CALL R5 1 - 0x14140805, // 0023 LT R5 R4 R5 - 0x7816003D, // 0024 JMPF R5 #0063 - 0x94140604, // 0025 GETIDX R5 R3 R4 - 0x8818010A, // 0026 GETMBR R6 R0 K10 - 0x601C0008, // 0027 GETGBL R7 G8 - 0x5C200A00, // 0028 MOVE R8 R5 - 0x7C1C0200, // 0029 CALL R7 1 - 0x88180D0C, // 002A GETMBR R6 R6 K12 - 0x94180C07, // 002B GETIDX R6 R6 R7 - 0x8C200D0E, // 002C GETMET R8 R6 K14 - 0x5828000F, // 002D LDCONST R10 K15 - 0x7C200400, // 002E CALL R8 2 - 0x5C1C1000, // 002F MOVE R7 R8 - 0x5C200E00, // 0030 MOVE R8 R7 - 0x74220000, // 0031 JMPT R8 #0033 - 0x7001FFEC, // 0032 JMP #0020 - 0x8820010A, // 0033 GETMBR R8 R0 K10 - 0x8C201110, // 0034 GETMET R8 R8 K16 - 0x5C280E00, // 0035 MOVE R10 R7 - 0x7C200400, // 0036 CALL R8 2 - 0x78220006, // 0037 JMPF R8 #003F - 0x60240008, // 0038 GETGBL R9 G8 - 0x8C280D0E, // 0039 GETMET R10 R6 K14 - 0x5C301000, // 003A MOVE R12 R8 - 0x58340011, // 003B LDCONST R13 K17 - 0x7C280600, // 003C CALL R10 3 - 0x7C240200, // 003D CALL R9 1 - 0x70020000, // 003E JMP #0040 - 0x58240011, // 003F LDCONST R9 K17 - 0x8C280302, // 0040 GETMET R10 R1 K2 - 0x8C300512, // 0041 GETMET R12 R2 K18 - 0x58380013, // 0042 LDCONST R14 K19 - 0x5C3C0800, // 0043 MOVE R15 R4 - 0x5C400A00, // 0044 MOVE R16 R5 - 0x7C300800, // 0045 CALL R12 4 - 0x7C280400, // 0046 CALL R10 2 - 0x8C280302, // 0047 GETMET R10 R1 K2 - 0x8C300512, // 0048 GETMET R12 R2 K18 - 0x58380014, // 0049 LDCONST R14 K20 - 0x5C3C0800, // 004A MOVE R15 R4 - 0x7C300600, // 004B CALL R12 3 - 0x7C280400, // 004C CALL R10 2 - 0x8C280115, // 004D GETMET R10 R0 K21 - 0x8C300D0E, // 004E GETMET R12 R6 K14 - 0x5838000F, // 004F LDCONST R14 K15 - 0x583C0011, // 0050 LDCONST R15 K17 - 0x7C300600, // 0051 CALL R12 3 - 0x7C280400, // 0052 CALL R10 2 - 0x8C280302, // 0053 GETMET R10 R1 K2 - 0x8C300512, // 0054 GETMET R12 R2 K18 - 0x58380016, // 0055 LDCONST R14 K22 - 0x7C300400, // 0056 CALL R12 2 - 0x7C280400, // 0057 CALL R10 2 - 0x8C280302, // 0058 GETMET R10 R1 K2 - 0x8C300512, // 0059 GETMET R12 R2 K18 - 0x58380017, // 005A LDCONST R14 K23 - 0x5C3C0800, // 005B MOVE R15 R4 - 0x8C400318, // 005C GETMET R16 R1 K24 - 0x5C481200, // 005D MOVE R18 R9 - 0x7C400400, // 005E CALL R16 2 - 0x7C300800, // 005F CALL R12 4 - 0x7C280400, // 0060 CALL R10 2 - 0x00100919, // 0061 ADD R4 R4 K25 - 0x7001FFBC, // 0062 JMP #0020 - 0x8C140302, // 0063 GETMET R5 R1 K2 - 0x8C1C0512, // 0064 GETMET R7 R2 K18 - 0x5824001A, // 0065 LDCONST R9 K26 - 0x5C280800, // 0066 MOVE R10 R4 - 0x7C1C0600, // 0067 CALL R7 3 - 0x7C140400, // 0068 CALL R5 2 - 0x8C140302, // 0069 GETMET R5 R1 K2 - 0x8C1C0512, // 006A GETMET R7 R2 K18 - 0x58240014, // 006B LDCONST R9 K20 - 0x5C280800, // 006C MOVE R10 R4 - 0x7C1C0600, // 006D CALL R7 3 - 0x7C140400, // 006E CALL R5 2 - 0x8C140115, // 006F GETMET R5 R0 K21 - 0x581C0011, // 0070 LDCONST R7 K17 - 0x7C140400, // 0071 CALL R5 2 - 0x8C140302, // 0072 GETMET R5 R1 K2 - 0x8C1C0512, // 0073 GETMET R7 R2 K18 - 0x58240016, // 0074 LDCONST R9 K22 - 0x7C1C0400, // 0075 CALL R7 2 - 0x7C140400, // 0076 CALL R5 2 - 0x8C140302, // 0077 GETMET R5 R1 K2 - 0x8C1C0512, // 0078 GETMET R7 R2 K18 - 0x5824001B, // 0079 LDCONST R9 K27 - 0x5C280800, // 007A MOVE R10 R4 - 0x7C1C0600, // 007B CALL R7 3 - 0x7C140400, // 007C CALL R5 2 - 0x8C140302, // 007D GETMET R5 R1 K2 - 0x581C001C, // 007E LDCONST R7 K28 - 0x7C140400, // 007F CALL R5 2 - 0x8C140302, // 0080 GETMET R5 R1 K2 - 0x581C001D, // 0081 LDCONST R7 K29 - 0x7C140400, // 0082 CALL R5 2 - 0x8C140302, // 0083 GETMET R5 R1 K2 - 0x581C001E, // 0084 LDCONST R7 K30 - 0x7C140400, // 0085 CALL R5 2 - 0x80000000, // 0086 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: plugin_option -********************************************************************/ -be_local_closure(Matter_UI_plugin_option, /* name */ - be_nested_proto( - 16, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[15]) { /* constants */ - /* K0 */ be_nested_str_weak(webserver), - /* K1 */ be_nested_str_weak(string), - /* K2 */ be_nested_str_weak(split), - /* K3 */ be_nested_str_weak(_CLASSES_TYPES), - /* K4 */ be_nested_str_weak(_X7C), - /* K5 */ be_const_int(0), - /* K6 */ be_nested_str_weak(content_send), - /* K7 */ be_nested_str_weak(_X3Coption_X20value_X3D_X27_X27_X3E_X3C_X2Foption_X3E), - /* K8 */ be_nested_str_weak(device), - /* K9 */ be_nested_str_weak(get_plugin_class_displayname), - /* K10 */ be_nested_str_weak(format), - /* K11 */ be_nested_str_weak(_X3Coption_X20value_X3D_X27_X25s_X27_X25s_X3E_X25s_X3C_X2Foption_X3E), - /* K12 */ be_nested_str_weak(_X20selected), - /* K13 */ be_nested_str_weak(), - /* K14 */ be_const_int(1), - }), - be_str_weak(plugin_option), - &be_const_str_solidified, - ( &(const binstruction[35]) { /* code */ - 0xA40A0000, // 0000 IMPORT R2 K0 - 0xA40E0200, // 0001 IMPORT R3 K1 - 0x8C100702, // 0002 GETMET R4 R3 K2 - 0x88180103, // 0003 GETMBR R6 R0 K3 - 0x581C0004, // 0004 LDCONST R7 K4 - 0x7C100600, // 0005 CALL R4 3 - 0x58140005, // 0006 LDCONST R5 K5 - 0x8C180506, // 0007 GETMET R6 R2 K6 - 0x58200007, // 0008 LDCONST R8 K7 - 0x7C180400, // 0009 CALL R6 2 - 0x6018000C, // 000A GETGBL R6 G12 - 0x5C1C0800, // 000B MOVE R7 R4 - 0x7C180200, // 000C CALL R6 1 - 0x14180A06, // 000D LT R6 R5 R6 - 0x781A0012, // 000E JMPF R6 #0022 - 0x94180805, // 000F GETIDX R6 R4 R5 - 0x881C0108, // 0010 GETMBR R7 R0 K8 - 0x8C1C0F09, // 0011 GETMET R7 R7 K9 - 0x5C240C00, // 0012 MOVE R9 R6 - 0x7C1C0400, // 0013 CALL R7 2 - 0x8C200506, // 0014 GETMET R8 R2 K6 - 0x8C28070A, // 0015 GETMET R10 R3 K10 - 0x5830000B, // 0016 LDCONST R12 K11 - 0x5C340C00, // 0017 MOVE R13 R6 - 0x1C380C01, // 0018 EQ R14 R6 R1 - 0x783A0001, // 0019 JMPF R14 #001C - 0x5838000C, // 001A LDCONST R14 K12 - 0x70020000, // 001B JMP #001D - 0x5838000D, // 001C LDCONST R14 K13 - 0x5C3C0E00, // 001D MOVE R15 R7 - 0x7C280A00, // 001E CALL R10 5 - 0x7C200400, // 001F CALL R8 2 - 0x00140B0E, // 0020 ADD R5 R5 K14 - 0x7001FFE7, // 0021 JMP #000A - 0x80000000, // 0022 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: web_sensor -********************************************************************/ -be_local_closure(Matter_UI_web_sensor, /* name */ - be_nested_proto( - 13, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[25]) { /* constants */ - /* K0 */ be_nested_str_weak(webserver), - /* K1 */ be_nested_str_weak(string), - /* K2 */ be_nested_str_weak(tasmota), - /* K3 */ be_nested_str_weak(get_option), - /* K4 */ be_nested_str_weak(matter), - /* K5 */ be_nested_str_weak(MATTER_OPTION), - /* K6 */ be_nested_str_weak(device), - /* K7 */ be_nested_str_weak(is_root_commissioning_open), - /* K8 */ be_nested_str_weak(show_commissioning_info), - /* K9 */ be_nested_str_weak(sessions), - /* K10 */ be_nested_str_weak(count_active_fabrics), - /* K11 */ be_const_int(0), - /* K12 */ be_nested_str_weak(content_send), - /* K13 */ be_nested_str_weak(format), - /* K14 */ be_nested_str_weak(_X3Cdiv_X20style_X3D_X27text_X2Dalign_X3Aright_X3Bfont_X2Dsize_X3A11px_X3Bcolor_X3A_X23aaa_X3B_X27_X3E_X25s_X3C_X2Fdiv_X3E), - /* K15 */ be_nested_str_weak(No_X20active_X20association), - /* K16 */ be_const_int(1), - /* K17 */ be_nested_str_weak(_X20active_X20association), - /* K18 */ be_nested_str_weak(s), - /* K19 */ be_nested_str_weak(), - /* K20 */ be_nested_str_weak(_X3Cbutton_X20onclick_X3D_X27la_X28_X22_X26mtc_X25i_X3D1_X22_X29_X3B_X27_X3E), - /* K21 */ be_nested_str_weak(commissioning_open), - /* K22 */ be_nested_str_weak(_LOGO), - /* K23 */ be_nested_str_weak(_X20Open_X20Commissioning_X3C_X2Fbutton_X3E), - /* K24 */ be_nested_str_weak(_X20Close_X20Commissioning_X3C_X2Fbutton_X3E), - }), - be_str_weak(web_sensor), - &be_const_str_solidified, - ( &(const binstruction[72]) { /* code */ - 0xA4060000, // 0000 IMPORT R1 K0 - 0xA40A0200, // 0001 IMPORT R2 K1 - 0xB80E0400, // 0002 GETNGBL R3 K2 - 0x8C0C0703, // 0003 GETMET R3 R3 K3 - 0xB8160800, // 0004 GETNGBL R5 K4 - 0x88140B05, // 0005 GETMBR R5 R5 K5 - 0x7C0C0400, // 0006 CALL R3 2 - 0x780E003E, // 0007 JMPF R3 #0047 - 0x88100106, // 0008 GETMBR R4 R0 K6 - 0x8C100907, // 0009 GETMET R4 R4 K7 - 0x7C100200, // 000A CALL R4 1 - 0x78120001, // 000B JMPF R4 #000E - 0x8C100108, // 000C GETMET R4 R0 K8 - 0x7C100200, // 000D CALL R4 1 - 0x88100106, // 000E GETMBR R4 R0 K6 - 0x88100909, // 000F GETMBR R4 R4 K9 - 0x8C10090A, // 0010 GETMET R4 R4 K10 - 0x7C100200, // 0011 CALL R4 1 - 0x1C14090B, // 0012 EQ R5 R4 K11 - 0x78160006, // 0013 JMPF R5 #001B - 0x8C14030C, // 0014 GETMET R5 R1 K12 - 0x8C1C050D, // 0015 GETMET R7 R2 K13 - 0x5824000E, // 0016 LDCONST R9 K14 - 0x5828000F, // 0017 LDCONST R10 K15 - 0x7C1C0600, // 0018 CALL R7 3 - 0x7C140400, // 0019 CALL R5 2 - 0x7002000E, // 001A JMP #002A - 0x24140910, // 001B GT R5 R4 K16 - 0x8C18030C, // 001C GETMET R6 R1 K12 - 0x8C20050D, // 001D GETMET R8 R2 K13 - 0x5828000E, // 001E LDCONST R10 K14 - 0x602C0008, // 001F GETGBL R11 G8 - 0x5C300800, // 0020 MOVE R12 R4 - 0x7C2C0200, // 0021 CALL R11 1 - 0x002C1711, // 0022 ADD R11 R11 K17 - 0x78160001, // 0023 JMPF R5 #0026 - 0x58300012, // 0024 LDCONST R12 K18 - 0x70020000, // 0025 JMP #0027 - 0x58300013, // 0026 LDCONST R12 K19 - 0x002C160C, // 0027 ADD R11 R11 R12 - 0x7C200600, // 0028 CALL R8 3 - 0x7C180400, // 0029 CALL R6 2 - 0x8C14030C, // 002A GETMET R5 R1 K12 - 0x8C1C050D, // 002B GETMET R7 R2 K13 - 0x58240014, // 002C LDCONST R9 K20 - 0x88280106, // 002D GETMBR R10 R0 K6 - 0x88281515, // 002E GETMBR R10 R10 K21 - 0x4C2C0000, // 002F LDNIL R11 - 0x1C28140B, // 0030 EQ R10 R10 R11 - 0x782A0001, // 0031 JMPF R10 #0034 - 0x58280010, // 0032 LDCONST R10 K16 - 0x70020000, // 0033 JMP #0035 - 0x5828000B, // 0034 LDCONST R10 K11 - 0x7C1C0600, // 0035 CALL R7 3 - 0x7C140400, // 0036 CALL R5 2 - 0x8C14030C, // 0037 GETMET R5 R1 K12 - 0xB81E0800, // 0038 GETNGBL R7 K4 - 0x881C0F16, // 0039 GETMBR R7 R7 K22 - 0x7C140400, // 003A CALL R5 2 - 0x88140106, // 003B GETMBR R5 R0 K6 - 0x88140B15, // 003C GETMBR R5 R5 K21 - 0x4C180000, // 003D LDNIL R6 - 0x1C140A06, // 003E EQ R5 R5 R6 - 0x78160003, // 003F JMPF R5 #0044 - 0x8C14030C, // 0040 GETMET R5 R1 K12 - 0x581C0017, // 0041 LDCONST R7 K23 - 0x7C140400, // 0042 CALL R5 2 - 0x70020002, // 0043 JMP #0047 - 0x8C14030C, // 0044 GETMET R5 R1 K12 - 0x581C0018, // 0045 LDCONST R7 K24 - 0x7C140400, // 0046 CALL R5 2 - 0x80000000, // 0047 RET 0 + 0x8C080301, // 0004 GETMET R2 R1 K1 + 0xB8120600, // 0005 GETNGBL R4 K3 + 0x88100904, // 0006 GETMBR R4 R4 K4 + 0x7C080400, // 0007 CALL R2 2 + 0x8C080301, // 0008 GETMET R2 R1 K1 + 0x58100005, // 0009 LDCONST R4 K5 + 0x7C080400, // 000A CALL R2 2 + 0x80000000, // 000B RET 0 }) ) ); @@ -1640,88 +1306,477 @@ be_local_closure(Matter_UI_show_qrcode, /* name */ /******************************************************************** -** Solidified function: web_add_handler +** Solidified function: plugin_option ********************************************************************/ -be_local_closure(Matter_UI_web_add_handler, /* name */ +be_local_closure(Matter_UI_plugin_option, /* name */ be_nested_proto( - 7, /* nstack */ + 17, /* nstack */ + 3, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[14]) { /* constants */ + /* K0 */ be_nested_str_weak(webserver), + /* K1 */ be_nested_str_weak(string), + /* K2 */ be_nested_str_weak(split), + /* K3 */ be_nested_str_weak(_X7C), + /* K4 */ be_const_int(0), + /* K5 */ be_nested_str_weak(), + /* K6 */ be_nested_str_weak(content_send), + /* K7 */ be_nested_str_weak(_X3Coption_X20value_X3D_X27_X27_X3E_X3C_X2Foption_X3E), + /* K8 */ be_nested_str_weak(device), + /* K9 */ be_nested_str_weak(get_plugin_class_displayname), + /* K10 */ be_nested_str_weak(format), + /* K11 */ be_nested_str_weak(_X3Coption_X20value_X3D_X27_X25s_X27_X25s_X3E_X25s_X3C_X2Foption_X3E), + /* K12 */ be_nested_str_weak(_X20selected), + /* K13 */ be_const_int(1), + }), + be_str_weak(plugin_option), + &be_const_str_solidified, + ( &(const binstruction[42]) { /* code */ + 0xA40E0000, // 0000 IMPORT R3 K0 + 0xA4120200, // 0001 IMPORT R4 K1 + 0x780A0004, // 0002 JMPF R2 #0008 + 0x8C140902, // 0003 GETMET R5 R4 K2 + 0x5C1C0400, // 0004 MOVE R7 R2 + 0x58200003, // 0005 LDCONST R8 K3 + 0x7C140600, // 0006 CALL R5 3 + 0x70020001, // 0007 JMP #000A + 0x60140012, // 0008 GETGBL R5 G18 + 0x7C140000, // 0009 CALL R5 0 + 0x58180004, // 000A LDCONST R6 K4 + 0x601C000C, // 000B GETGBL R7 G12 + 0x5C200A00, // 000C MOVE R8 R5 + 0x7C1C0200, // 000D CALL R7 1 + 0x141C0C07, // 000E LT R7 R6 R7 + 0x781E0018, // 000F JMPF R7 #0029 + 0x941C0A06, // 0010 GETIDX R7 R5 R6 + 0x1C200F05, // 0011 EQ R8 R7 K5 + 0x78220003, // 0012 JMPF R8 #0017 + 0x8C200706, // 0013 GETMET R8 R3 K6 + 0x58280007, // 0014 LDCONST R10 K7 + 0x7C200400, // 0015 CALL R8 2 + 0x7002000F, // 0016 JMP #0027 + 0x88200108, // 0017 GETMBR R8 R0 K8 + 0x8C201109, // 0018 GETMET R8 R8 K9 + 0x5C280E00, // 0019 MOVE R10 R7 + 0x7C200400, // 001A CALL R8 2 + 0x8C240706, // 001B GETMET R9 R3 K6 + 0x8C2C090A, // 001C GETMET R11 R4 K10 + 0x5834000B, // 001D LDCONST R13 K11 + 0x5C380E00, // 001E MOVE R14 R7 + 0x1C3C0E01, // 001F EQ R15 R7 R1 + 0x783E0001, // 0020 JMPF R15 #0023 + 0x583C000C, // 0021 LDCONST R15 K12 + 0x70020000, // 0022 JMP #0024 + 0x583C0005, // 0023 LDCONST R15 K5 + 0x5C401000, // 0024 MOVE R16 R8 + 0x7C2C0A00, // 0025 CALL R11 5 + 0x7C240400, // 0026 CALL R9 2 + 0x00180D0D, // 0027 ADD R6 R6 K13 + 0x7001FFE1, // 0028 JMP #000B + 0x80000000, // 0029 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: show_enable +********************************************************************/ +be_local_closure(Matter_UI_show_enable, /* name */ + be_nested_proto( + 11, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[20]) { /* constants */ + /* K0 */ be_nested_str_weak(webserver), + /* K1 */ be_nested_str_weak(string), + /* K2 */ be_nested_str_weak(tasmota), + /* K3 */ be_nested_str_weak(get_option), + /* K4 */ be_nested_str_weak(matter), + /* K5 */ be_nested_str_weak(MATTER_OPTION), + /* K6 */ be_nested_str_weak(content_send), + /* K7 */ be_nested_str_weak(format), + /* K8 */ be_nested_str_weak(_X3Cfieldset_X3E_X3Clegend_X3E_X3Cb_X3E_X26nbsp_X3BMatter_X20_X25s_X26nbsp_X3B_X3C_X2Fb_X3E_X3C_X2Flegend_X3E_X3Cp_X3E_X3C_X2Fp_X3E), + /* K9 */ be_nested_str_weak(Enabled), + /* K10 */ be_nested_str_weak(Disabled), + /* K11 */ be_nested_str_weak(_X3Cp_X20style_X3D_X27width_X3A320px_X3B_X27_X3ECheck_X20the_X20_X3Ca_X20href_X3D_X27https_X3A_X2F_X2Ftasmota_X2Egithub_X2Eio_X2Fdocs_X2FMatter_X2F_X27_X20target_X3D_X27_blank_X27_X3EMatter_X20documentation_X3C_X2Fa_X3E_X2E_X3C_X2Fp_X3E), + /* K12 */ be_nested_str_weak(_X3Cform_X20action_X3D_X27_X2Fmatterc_X27_X20method_X3D_X27post_X27_X20onsubmit_X3D_X27return_X20confirm_X28_X22This_X20will_X20cause_X20a_X20restart_X2E_X22_X29_X3B_X27_X3E), + /* K13 */ be_nested_str_weak(_X3Cp_X3E_X3C_X2Fp_X3E_X3Cbutton_X20name_X3D_X27_X25s_X27_X20class_X3D_X27button_X20bgrn_X27_X3E), + /* K14 */ be_nested_str_weak(disable), + /* K15 */ be_nested_str_weak(enable), + /* K16 */ be_nested_str_weak(Disable), + /* K17 */ be_nested_str_weak(Enable), + /* K18 */ be_nested_str_weak(_X20Matter_X3C_X2Fbutton_X3E_X3C_X2Fform_X3E_X3C_X2Fp_X3E), + /* K19 */ be_nested_str_weak(_X3Cp_X3E_X3C_X2Fp_X3E_X3C_X2Ffieldset_X3E_X3Cp_X3E_X3C_X2Fp_X3E), + }), + be_str_weak(show_enable), + &be_const_str_solidified, + ( &(const binstruction[44]) { /* code */ + 0xA40A0000, // 0000 IMPORT R2 K0 + 0xA40E0200, // 0001 IMPORT R3 K1 + 0xB8120400, // 0002 GETNGBL R4 K2 + 0x8C100903, // 0003 GETMET R4 R4 K3 + 0xB81A0800, // 0004 GETNGBL R6 K4 + 0x88180D05, // 0005 GETMBR R6 R6 K5 + 0x7C100400, // 0006 CALL R4 2 + 0x8C140506, // 0007 GETMET R5 R2 K6 + 0x8C1C0707, // 0008 GETMET R7 R3 K7 + 0x58240008, // 0009 LDCONST R9 K8 + 0x78120001, // 000A JMPF R4 #000D + 0x58280009, // 000B LDCONST R10 K9 + 0x70020000, // 000C JMP #000E + 0x5828000A, // 000D LDCONST R10 K10 + 0x7C1C0600, // 000E CALL R7 3 + 0x7C140400, // 000F CALL R5 2 + 0x8C140506, // 0010 GETMET R5 R2 K6 + 0x581C000B, // 0011 LDCONST R7 K11 + 0x7C140400, // 0012 CALL R5 2 + 0x8C140506, // 0013 GETMET R5 R2 K6 + 0x581C000C, // 0014 LDCONST R7 K12 + 0x7C140400, // 0015 CALL R5 2 + 0x8C140506, // 0016 GETMET R5 R2 K6 + 0x8C1C0707, // 0017 GETMET R7 R3 K7 + 0x5824000D, // 0018 LDCONST R9 K13 + 0x78120001, // 0019 JMPF R4 #001C + 0x5828000E, // 001A LDCONST R10 K14 + 0x70020000, // 001B JMP #001D + 0x5828000F, // 001C LDCONST R10 K15 + 0x7C1C0600, // 001D CALL R7 3 + 0x7C140400, // 001E CALL R5 2 + 0x8C140506, // 001F GETMET R5 R2 K6 + 0x78120001, // 0020 JMPF R4 #0023 + 0x581C0010, // 0021 LDCONST R7 K16 + 0x70020000, // 0022 JMP #0024 + 0x581C0011, // 0023 LDCONST R7 K17 + 0x7C140400, // 0024 CALL R5 2 + 0x8C140506, // 0025 GETMET R5 R2 K6 + 0x581C0012, // 0026 LDCONST R7 K18 + 0x7C140400, // 0027 CALL R5 2 + 0x8C140506, // 0028 GETMET R5 R2 K6 + 0x581C0013, // 0029 LDCONST R7 K19 + 0x7C140400, // 002A CALL R5 2 + 0x80040800, // 002B RET 1 R4 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: web_sensor +********************************************************************/ +be_local_closure(Matter_UI_web_sensor, /* name */ + be_nested_proto( + 13, /* nstack */ 1, /* argc */ 2, /* varg */ 0, /* has upvals */ NULL, /* no upvals */ - 1, /* has sup protos */ - ( &(const struct bproto*[ 2]) { - be_nested_proto( - 2, /* nstack */ - 0, /* argc */ - 0, /* varg */ - 1, /* has upvals */ - ( &(const bupvaldesc[ 1]) { /* upvals */ - be_local_const_upval(1, 0), - }), - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 1]) { /* constants */ - /* K0 */ be_nested_str_weak(page_part_mgr), - }), - be_str_weak(_X3Clambda_X3E), - &be_const_str_solidified, - ( &(const binstruction[ 4]) { /* code */ - 0x68000000, // 0000 GETUPV R0 U0 - 0x8C000100, // 0001 GETMET R0 R0 K0 - 0x7C000200, // 0002 CALL R0 1 - 0x80040000, // 0003 RET 1 R0 - }) - ), - be_nested_proto( - 2, /* nstack */ - 0, /* argc */ - 0, /* varg */ - 1, /* has upvals */ - ( &(const bupvaldesc[ 1]) { /* upvals */ - be_local_const_upval(1, 0), - }), - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 1]) { /* constants */ - /* K0 */ be_nested_str_weak(page_part_ctl), - }), - be_str_weak(_X3Clambda_X3E), - &be_const_str_solidified, - ( &(const binstruction[ 4]) { /* code */ - 0x68000000, // 0000 GETUPV R0 U0 - 0x8C000100, // 0001 GETMET R0 R0 K0 - 0x7C000200, // 0002 CALL R0 1 - 0x80040000, // 0003 RET 1 R0 - }) - ), - }), + 0, /* has sup protos */ + NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[ 5]) { /* constants */ + ( &(const bvalue[25]) { /* constants */ /* K0 */ be_nested_str_weak(webserver), - /* K1 */ be_nested_str_weak(on), - /* K2 */ be_nested_str_weak(_X2Fmatterc), - /* K3 */ be_nested_str_weak(HTTP_GET), - /* K4 */ be_nested_str_weak(HTTP_POST), + /* K1 */ be_nested_str_weak(string), + /* K2 */ be_nested_str_weak(tasmota), + /* K3 */ be_nested_str_weak(get_option), + /* K4 */ be_nested_str_weak(matter), + /* K5 */ be_nested_str_weak(MATTER_OPTION), + /* K6 */ be_nested_str_weak(device), + /* K7 */ be_nested_str_weak(is_root_commissioning_open), + /* K8 */ be_nested_str_weak(show_commissioning_info), + /* K9 */ be_nested_str_weak(sessions), + /* K10 */ be_nested_str_weak(count_active_fabrics), + /* K11 */ be_const_int(0), + /* K12 */ be_nested_str_weak(content_send), + /* K13 */ be_nested_str_weak(format), + /* K14 */ be_nested_str_weak(_X3Cdiv_X20style_X3D_X27text_X2Dalign_X3Aright_X3Bfont_X2Dsize_X3A11px_X3Bcolor_X3A_X23aaa_X3B_X27_X3E_X25s_X3C_X2Fdiv_X3E), + /* K15 */ be_nested_str_weak(No_X20active_X20association), + /* K16 */ be_const_int(1), + /* K17 */ be_nested_str_weak(_X20active_X20association), + /* K18 */ be_nested_str_weak(s), + /* K19 */ be_nested_str_weak(), + /* K20 */ be_nested_str_weak(_X3Cbutton_X20onclick_X3D_X27la_X28_X22_X26mtc_X25i_X3D1_X22_X29_X3B_X27_X3E), + /* K21 */ be_nested_str_weak(commissioning_open), + /* K22 */ be_nested_str_weak(_LOGO), + /* K23 */ be_nested_str_weak(_X20Open_X20Commissioning_X3C_X2Fbutton_X3E), + /* K24 */ be_nested_str_weak(_X20Close_X20Commissioning_X3C_X2Fbutton_X3E), }), - be_str_weak(web_add_handler), + be_str_weak(web_sensor), &be_const_str_solidified, - ( &(const binstruction[13]) { /* code */ + ( &(const binstruction[72]) { /* code */ 0xA4060000, // 0000 IMPORT R1 K0 - 0x8C080301, // 0001 GETMET R2 R1 K1 - 0x58100002, // 0002 LDCONST R4 K2 - 0x84140000, // 0003 CLOSURE R5 P0 - 0x88180303, // 0004 GETMBR R6 R1 K3 - 0x7C080800, // 0005 CALL R2 4 - 0x8C080301, // 0006 GETMET R2 R1 K1 - 0x58100002, // 0007 LDCONST R4 K2 - 0x84140001, // 0008 CLOSURE R5 P1 - 0x88180304, // 0009 GETMBR R6 R1 K4 - 0x7C080800, // 000A CALL R2 4 - 0xA0000000, // 000B CLOSE R0 - 0x80000000, // 000C RET 0 + 0xA40A0200, // 0001 IMPORT R2 K1 + 0xB80E0400, // 0002 GETNGBL R3 K2 + 0x8C0C0703, // 0003 GETMET R3 R3 K3 + 0xB8160800, // 0004 GETNGBL R5 K4 + 0x88140B05, // 0005 GETMBR R5 R5 K5 + 0x7C0C0400, // 0006 CALL R3 2 + 0x780E003E, // 0007 JMPF R3 #0047 + 0x88100106, // 0008 GETMBR R4 R0 K6 + 0x8C100907, // 0009 GETMET R4 R4 K7 + 0x7C100200, // 000A CALL R4 1 + 0x78120001, // 000B JMPF R4 #000E + 0x8C100108, // 000C GETMET R4 R0 K8 + 0x7C100200, // 000D CALL R4 1 + 0x88100106, // 000E GETMBR R4 R0 K6 + 0x88100909, // 000F GETMBR R4 R4 K9 + 0x8C10090A, // 0010 GETMET R4 R4 K10 + 0x7C100200, // 0011 CALL R4 1 + 0x1C14090B, // 0012 EQ R5 R4 K11 + 0x78160006, // 0013 JMPF R5 #001B + 0x8C14030C, // 0014 GETMET R5 R1 K12 + 0x8C1C050D, // 0015 GETMET R7 R2 K13 + 0x5824000E, // 0016 LDCONST R9 K14 + 0x5828000F, // 0017 LDCONST R10 K15 + 0x7C1C0600, // 0018 CALL R7 3 + 0x7C140400, // 0019 CALL R5 2 + 0x7002000E, // 001A JMP #002A + 0x24140910, // 001B GT R5 R4 K16 + 0x8C18030C, // 001C GETMET R6 R1 K12 + 0x8C20050D, // 001D GETMET R8 R2 K13 + 0x5828000E, // 001E LDCONST R10 K14 + 0x602C0008, // 001F GETGBL R11 G8 + 0x5C300800, // 0020 MOVE R12 R4 + 0x7C2C0200, // 0021 CALL R11 1 + 0x002C1711, // 0022 ADD R11 R11 K17 + 0x78160001, // 0023 JMPF R5 #0026 + 0x58300012, // 0024 LDCONST R12 K18 + 0x70020000, // 0025 JMP #0027 + 0x58300013, // 0026 LDCONST R12 K19 + 0x002C160C, // 0027 ADD R11 R11 R12 + 0x7C200600, // 0028 CALL R8 3 + 0x7C180400, // 0029 CALL R6 2 + 0x8C14030C, // 002A GETMET R5 R1 K12 + 0x8C1C050D, // 002B GETMET R7 R2 K13 + 0x58240014, // 002C LDCONST R9 K20 + 0x88280106, // 002D GETMBR R10 R0 K6 + 0x88281515, // 002E GETMBR R10 R10 K21 + 0x4C2C0000, // 002F LDNIL R11 + 0x1C28140B, // 0030 EQ R10 R10 R11 + 0x782A0001, // 0031 JMPF R10 #0034 + 0x58280010, // 0032 LDCONST R10 K16 + 0x70020000, // 0033 JMP #0035 + 0x5828000B, // 0034 LDCONST R10 K11 + 0x7C1C0600, // 0035 CALL R7 3 + 0x7C140400, // 0036 CALL R5 2 + 0x8C14030C, // 0037 GETMET R5 R1 K12 + 0xB81E0800, // 0038 GETNGBL R7 K4 + 0x881C0F16, // 0039 GETMBR R7 R7 K22 + 0x7C140400, // 003A CALL R5 2 + 0x88140106, // 003B GETMBR R5 R0 K6 + 0x88140B15, // 003C GETMBR R5 R5 K21 + 0x4C180000, // 003D LDNIL R6 + 0x1C140A06, // 003E EQ R5 R5 R6 + 0x78160003, // 003F JMPF R5 #0044 + 0x8C14030C, // 0040 GETMET R5 R1 K12 + 0x581C0017, // 0041 LDCONST R7 K23 + 0x7C140400, // 0042 CALL R5 2 + 0x70020002, // 0043 JMP #0047 + 0x8C14030C, // 0044 GETMET R5 R1 K12 + 0x581C0018, // 0045 LDCONST R7 K24 + 0x7C140400, // 0046 CALL R5 2 + 0x80000000, // 0047 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: init +********************************************************************/ +be_local_closure(Matter_UI_init, /* name */ + be_nested_proto( + 5, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 3]) { /* constants */ + /* K0 */ be_nested_str_weak(device), + /* K1 */ be_nested_str_weak(tasmota), + /* K2 */ be_nested_str_weak(add_driver), + }), + be_str_weak(init), + &be_const_str_solidified, + ( &(const binstruction[ 6]) { /* code */ + 0x90020001, // 0000 SETMBR R0 K0 R1 + 0xB80A0200, // 0001 GETNGBL R2 K1 + 0x8C080502, // 0002 GETMET R2 R2 K2 + 0x5C100000, // 0003 MOVE R4 R0 + 0x7C080400, // 0004 CALL R2 2 + 0x80000000, // 0005 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: show_fabric_info +********************************************************************/ +be_local_closure(Matter_UI_show_fabric_info, /* name */ + be_nested_proto( + 16, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[30]) { /* constants */ + /* K0 */ be_nested_str_weak(webserver), + /* K1 */ be_nested_str_weak(string), + /* K2 */ be_nested_str_weak(content_send), + /* K3 */ be_nested_str_weak(_X3Cfieldset_X3E_X3Clegend_X3E_X3Cb_X3E_X26nbsp_X3BFabrics_X26nbsp_X3B_X3C_X2Fb_X3E_X3C_X2Flegend_X3E_X3Cp_X3E_X3C_X2Fp_X3E), + /* K4 */ be_nested_str_weak(_X3Cp_X3EAssociated_X20fabrics_X3A_X3C_X2Fp_X3E), + /* K5 */ be_nested_str_weak(device), + /* K6 */ be_nested_str_weak(sessions), + /* K7 */ be_const_int(0), + /* K8 */ be_nested_str_weak(_X3Cp_X3E_X3Cb_X3ENone_X3C_X2Fb_X3E_X3C_X2Fp_X3E), + /* K9 */ be_nested_str_weak(fabrics), + /* K10 */ be_nested_str_weak(persistables), + /* K11 */ be_nested_str_weak(_X3Chr_X3E), + /* K12 */ be_nested_str_weak(fabric_label), + /* K13 */ be_nested_str_weak(_X3CNo_X20label_X3E), + /* K14 */ be_nested_str_weak(html_escape), + /* K15 */ be_nested_str_weak(format), + /* K16 */ be_nested_str_weak(_X3Cfieldset_X3E_X3Clegend_X3E_X3Cb_X3E_X26nbsp_X3B_X23_X25i_X20_X25s_X26nbsp_X3B_X3C_X2Fb_X3E_X3C_X2Flegend_X3E_X3Cp_X3E_X3C_X2Fp_X3E), + /* K17 */ be_nested_str_weak(get_fabric_index), + /* K18 */ be_nested_str_weak(get_fabric_id), + /* K19 */ be_nested_str_weak(copy), + /* K20 */ be_nested_str_weak(reverse), + /* K21 */ be_nested_str_weak(get_device_id), + /* K22 */ be_nested_str_weak(Fabric_X3A_X20_X25s_X3Cbr_X3E), + /* K23 */ be_nested_str_weak(tohex), + /* K24 */ be_nested_str_weak(Device_X3A_X20_X25s_X3Cbr_X3E_X26nbsp_X3B), + /* K25 */ be_nested_str_weak(_X3Cform_X20action_X3D_X27_X2Fmatterc_X27_X20method_X3D_X27post_X27_X20onsubmit_X3D_X27return_X20confirm_X28_X22Are_X20you_X20sure_X3F_X22_X29_X3B_X27_X3E), + /* K26 */ be_nested_str_weak(_X3Cinput_X20name_X3D_X27del_fabric_X27_X20type_X3D_X27hidden_X27_X20value_X3D_X27_X25i_X27_X3E), + /* K27 */ be_nested_str_weak(_X3Cbutton_X20name_X3D_X27del_X27_X20class_X3D_X27button_X20bgrn_X27_X3EDelete_X20Fabric_X3C_X2Fbutton_X3E_X3C_X2Fform_X3E_X3C_X2Fp_X3E), + /* K28 */ be_nested_str_weak(_X3Cp_X3E_X3C_X2Fp_X3E_X3C_X2Ffieldset_X3E_X3Cp_X3E_X3C_X2Fp_X3E), + /* K29 */ be_nested_str_weak(stop_iteration), + }), + be_str_weak(show_fabric_info), + &be_const_str_solidified, + ( &(const binstruction[102]) { /* code */ + 0xA4060000, // 0000 IMPORT R1 K0 + 0xA40A0200, // 0001 IMPORT R2 K1 + 0x8C0C0302, // 0002 GETMET R3 R1 K2 + 0x58140003, // 0003 LDCONST R5 K3 + 0x7C0C0400, // 0004 CALL R3 2 + 0x8C0C0302, // 0005 GETMET R3 R1 K2 + 0x58140004, // 0006 LDCONST R5 K4 + 0x7C0C0400, // 0007 CALL R3 2 + 0x600C000C, // 0008 GETGBL R3 G12 + 0x88100105, // 0009 GETMBR R4 R0 K5 + 0x88100906, // 000A GETMBR R4 R4 K6 + 0x88100906, // 000B GETMBR R4 R4 K6 + 0x7C0C0200, // 000C CALL R3 1 + 0x1C0C0707, // 000D EQ R3 R3 K7 + 0x780E0003, // 000E JMPF R3 #0013 + 0x8C0C0302, // 000F GETMET R3 R1 K2 + 0x58140008, // 0010 LDCONST R5 K8 + 0x7C0C0400, // 0011 CALL R3 2 + 0x7002004E, // 0012 JMP #0062 + 0x500C0200, // 0013 LDBOOL R3 1 0 + 0x60100010, // 0014 GETGBL R4 G16 + 0x88140105, // 0015 GETMBR R5 R0 K5 + 0x88140B06, // 0016 GETMBR R5 R5 K6 + 0x88140B09, // 0017 GETMBR R5 R5 K9 + 0x8C140B0A, // 0018 GETMET R5 R5 K10 + 0x7C140200, // 0019 CALL R5 1 + 0x7C100200, // 001A CALL R4 1 + 0xA8020042, // 001B EXBLK 0 #005F + 0x5C140800, // 001C MOVE R5 R4 + 0x7C140000, // 001D CALL R5 0 + 0x5C180600, // 001E MOVE R6 R3 + 0x741A0002, // 001F JMPT R6 #0023 + 0x8C180302, // 0020 GETMET R6 R1 K2 + 0x5820000B, // 0021 LDCONST R8 K11 + 0x7C180400, // 0022 CALL R6 2 + 0x500C0000, // 0023 LDBOOL R3 0 0 + 0x88180B0C, // 0024 GETMBR R6 R5 K12 + 0x5C1C0C00, // 0025 MOVE R7 R6 + 0x741E0000, // 0026 JMPT R7 #0028 + 0x5818000D, // 0027 LDCONST R6 K13 + 0x8C1C030E, // 0028 GETMET R7 R1 K14 + 0x5C240C00, // 0029 MOVE R9 R6 + 0x7C1C0400, // 002A CALL R7 2 + 0x5C180E00, // 002B MOVE R6 R7 + 0x8C1C0302, // 002C GETMET R7 R1 K2 + 0x8C24050F, // 002D GETMET R9 R2 K15 + 0x582C0010, // 002E LDCONST R11 K16 + 0x8C300B11, // 002F GETMET R12 R5 K17 + 0x7C300200, // 0030 CALL R12 1 + 0x5C340C00, // 0031 MOVE R13 R6 + 0x7C240800, // 0032 CALL R9 4 + 0x7C1C0400, // 0033 CALL R7 2 + 0x8C1C0B12, // 0034 GETMET R7 R5 K18 + 0x7C1C0200, // 0035 CALL R7 1 + 0x8C1C0F13, // 0036 GETMET R7 R7 K19 + 0x7C1C0200, // 0037 CALL R7 1 + 0x8C1C0F14, // 0038 GETMET R7 R7 K20 + 0x7C1C0200, // 0039 CALL R7 1 + 0x8C200B15, // 003A GETMET R8 R5 K21 + 0x7C200200, // 003B CALL R8 1 + 0x8C201113, // 003C GETMET R8 R8 K19 + 0x7C200200, // 003D CALL R8 1 + 0x8C201114, // 003E GETMET R8 R8 K20 + 0x7C200200, // 003F CALL R8 1 + 0x8C240302, // 0040 GETMET R9 R1 K2 + 0x8C2C050F, // 0041 GETMET R11 R2 K15 + 0x58340016, // 0042 LDCONST R13 K22 + 0x8C380F17, // 0043 GETMET R14 R7 K23 + 0x7C380200, // 0044 CALL R14 1 + 0x7C2C0600, // 0045 CALL R11 3 + 0x7C240400, // 0046 CALL R9 2 + 0x8C240302, // 0047 GETMET R9 R1 K2 + 0x8C2C050F, // 0048 GETMET R11 R2 K15 + 0x58340018, // 0049 LDCONST R13 K24 + 0x8C381117, // 004A GETMET R14 R8 K23 + 0x7C380200, // 004B CALL R14 1 + 0x7C2C0600, // 004C CALL R11 3 + 0x7C240400, // 004D CALL R9 2 + 0x8C240302, // 004E GETMET R9 R1 K2 + 0x582C0019, // 004F LDCONST R11 K25 + 0x7C240400, // 0050 CALL R9 2 + 0x8C240302, // 0051 GETMET R9 R1 K2 + 0x8C2C050F, // 0052 GETMET R11 R2 K15 + 0x5834001A, // 0053 LDCONST R13 K26 + 0x8C380B11, // 0054 GETMET R14 R5 K17 + 0x7C380200, // 0055 CALL R14 1 + 0x7C2C0600, // 0056 CALL R11 3 + 0x7C240400, // 0057 CALL R9 2 + 0x8C240302, // 0058 GETMET R9 R1 K2 + 0x582C001B, // 0059 LDCONST R11 K27 + 0x7C240400, // 005A CALL R9 2 + 0x8C240302, // 005B GETMET R9 R1 K2 + 0x582C001C, // 005C LDCONST R11 K28 + 0x7C240400, // 005D CALL R9 2 + 0x7001FFBC, // 005E JMP #001C + 0x5810001D, // 005F LDCONST R4 K29 + 0xAC100200, // 0060 CATCH R4 1 0 + 0xB0080000, // 0061 RAISE 2 R0 R0 + 0x8C0C0302, // 0062 GETMET R3 R1 K2 + 0x5814001C, // 0063 LDCONST R5 K28 + 0x7C0C0400, // 0064 CALL R3 2 + 0x80000000, // 0065 RET 0 }) ) ); @@ -1734,24 +1789,25 @@ be_local_closure(Matter_UI_web_add_handler, /* name */ be_local_class(Matter_UI, 1, NULL, - be_nested_map(16, + be_nested_map(17, ( (struct bmapnode*) &(const bmapnode[]) { - { be_const_key_weak(_CLASSES_TYPES, -1), be_nested_str_weak(root_X7Crelay_X7Clight0_X7Clight1_X7Clight2_X7Clight3_X7Ctemperature_X7Cpressure_X7Cilluminance_X7Chumidity) }, - { be_const_key_weak(show_commissioning_info, -1), be_const_closure(Matter_UI_show_commissioning_info_closure) }, - { be_const_key_weak(show_enable, 6), be_const_closure(Matter_UI_show_enable_closure) }, - { be_const_key_weak(init, 11), be_const_closure(Matter_UI_init_closure) }, - { be_const_key_weak(show_passcode_form, -1), be_const_closure(Matter_UI_show_passcode_form_closure) }, - { be_const_key_weak(web_add_config_button, 15), be_const_closure(Matter_UI_web_add_config_button_closure) }, + { be_const_key_weak(show_plugins_configuration, -1), be_const_closure(Matter_UI_show_plugins_configuration_closure) }, + { be_const_key_weak(_CLASSES_TYPES, 2), be_nested_str_weak(_X7Crelay_X7Clight0_X7Clight1_X7Clight2_X7Clight3_X7Cshutter_X7Ctemperature_X7Cpressure_X7Cilluminance_X7Chumidity) }, + { be_const_key_weak(show_fabric_info, 7), be_const_closure(Matter_UI_show_fabric_info_closure) }, + { be_const_key_weak(init, -1), be_const_closure(Matter_UI_init_closure) }, { be_const_key_weak(web_add_handler, -1), be_const_closure(Matter_UI_web_add_handler_closure) }, - { be_const_key_weak(page_part_mgr, -1), be_const_closure(Matter_UI_page_part_mgr_closure) }, - { be_const_key_weak(page_part_ctl, -1), be_const_closure(Matter_UI_page_part_ctl_closure) }, - { be_const_key_weak(web_get_arg, -1), be_const_closure(Matter_UI_web_get_arg_closure) }, - { be_const_key_weak(show_plugins_configuration, 14), be_const_closure(Matter_UI_show_plugins_configuration_closure) }, - { be_const_key_weak(device, 13), be_const_var(0) }, - { be_const_key_weak(web_sensor, -1), be_const_closure(Matter_UI_web_sensor_closure) }, - { be_const_key_weak(show_qrcode, -1), be_const_closure(Matter_UI_show_qrcode_closure) }, + { be_const_key_weak(_ROOT_TYPES, 11), be_nested_str_weak(root) }, + { be_const_key_weak(show_commissioning_info, 16), be_const_closure(Matter_UI_show_commissioning_info_closure) }, + { be_const_key_weak(device, -1), be_const_var(0) }, + { be_const_key_weak(web_add_config_button, -1), be_const_closure(Matter_UI_web_add_config_button_closure) }, + { be_const_key_weak(page_part_ctl, 5), be_const_closure(Matter_UI_page_part_ctl_closure) }, + { be_const_key_weak(web_get_arg, 13), be_const_closure(Matter_UI_web_get_arg_closure) }, + { be_const_key_weak(web_sensor, 12), be_const_closure(Matter_UI_web_sensor_closure) }, + { be_const_key_weak(show_enable, 14), be_const_closure(Matter_UI_show_enable_closure) }, { be_const_key_weak(plugin_option, -1), be_const_closure(Matter_UI_plugin_option_closure) }, - { be_const_key_weak(show_fabric_info, -1), be_const_closure(Matter_UI_show_fabric_info_closure) }, + { be_const_key_weak(show_qrcode, -1), be_const_closure(Matter_UI_show_qrcode_closure) }, + { be_const_key_weak(page_part_mgr, 3), be_const_closure(Matter_UI_page_part_mgr_closure) }, + { be_const_key_weak(show_passcode_form, -1), be_const_closure(Matter_UI_show_passcode_form_closure) }, })), be_str_weak(Matter_UI) ); From f6763eb37b7638da82c21b3062cbda7cbee39909 Mon Sep 17 00:00:00 2001 From: Christian Baars Date: Wed, 26 Apr 2023 08:39:29 +0200 Subject: [PATCH 038/289] Berry: add BLE server/advertiser (#18494) --- lib/libesp32/berry_tasmota/src/be_MI32_lib.c | 7 + tasmota/include/xsns_62_esp32_mi.h | 59 +++- .../xdrv_52_3_berry_MI32.ino | 39 ++- .../tasmota_xsns_sensor/xsns_62_esp32_mi.ino | 312 +++++++++++++++++- 4 files changed, 396 insertions(+), 21 deletions(-) diff --git a/lib/libesp32/berry_tasmota/src/be_MI32_lib.c b/lib/libesp32/berry_tasmota/src/be_MI32_lib.c index 89f2757fa..22c0a0bc6 100644 --- a/lib/libesp32/berry_tasmota/src/be_MI32_lib.c +++ b/lib/libesp32/berry_tasmota/src/be_MI32_lib.c @@ -44,12 +44,17 @@ module MI32 (scope: global) { * To use: `import BLE` *******************************************************************/ +extern int be_BLE_init(bvm *vm); + extern void be_BLE_reg_conn_cb(void* function, uint8_t *buffer); BE_FUNC_CTYPE_DECLARE(be_BLE_reg_conn_cb, "", "cc"); extern void be_BLE_reg_adv_cb(void* function, uint8_t *buffer); BE_FUNC_CTYPE_DECLARE(be_BLE_reg_adv_cb, "", "c[c]"); +extern void be_BLE_reg_server_cb(void* function, uint8_t *buffer); +BE_FUNC_CTYPE_DECLARE(be_BLE_reg_server_cb, "", "c[c]"); + extern void be_BLE_set_MAC(struct bvm *vm, uint8_t *buf, size_t size, uint8_t type); BE_FUNC_CTYPE_DECLARE(be_BLE_set_MAC, "", "@(bytes)~[i]"); @@ -73,6 +78,7 @@ BE_FUNC_CTYPE_DECLARE(be_BLE_adv_block, "", "@(bytes)~[i]"); /* @const_object_info_begin module BLE (scope: global) { + init, func(be_BLE_init) conn_cb, ctype_func(be_BLE_reg_conn_cb) set_svc, ctype_func(be_BLE_set_service) run, ctype_func(be_BLE_run) @@ -81,6 +87,7 @@ module BLE (scope: global) { set_MAC, ctype_func(be_BLE_set_MAC) adv_watch, ctype_func(be_BLE_adv_watch) adv_block, ctype_func(be_BLE_adv_block) + serv_cb, ctype_func(be_BLE_reg_server_cb) } @const_object_info_end */ diff --git a/tasmota/include/xsns_62_esp32_mi.h b/tasmota/include/xsns_62_esp32_mi.h index 8418554df..52e221d1f 100644 --- a/tasmota/include/xsns_62_esp32_mi.h +++ b/tasmota/include/xsns_62_esp32_mi.h @@ -148,6 +148,7 @@ struct MI32connectionContextBerry_t{ NimBLEUUID serviceUUID; NimBLEUUID charUUID; uint16_t returnCharUUID; + uint16_t handle; uint8_t MAC[6]; uint8_t * buffer; uint8_t operation; @@ -162,17 +163,29 @@ struct MI32notificationBuffer_t{ uint16_t returnCharUUID; }; +struct BLEqueueBuffer_t{ + union{ + uint8_t *buffer; + int32_t value; + }; + size_t length; + uint16_t returnCharUUID; + uint16_t handle; + uint16_t type; +}; + struct { // uint32_t period; // set manually in addition to TELE-period, is set to TELE-period after start TaskHandle_t ScanTask = nullptr; TaskHandle_t ConnTask = nullptr; + TaskHandle_t ServerTask = nullptr; MI32connectionContextBerry_t *conCtx = nullptr; union { struct { uint32_t init:1; uint32_t connected:1; uint32_t autoScan:1; - uint32_t canScan:1; + // uint32_t canScan:1; uint32_t runningScan:1; uint32_t updateScan:1; uint32_t deleteScanTask:1; @@ -191,6 +204,11 @@ struct { uint32_t triggerNextConnJob:1; uint32_t readyForNextConnJob:1; uint32_t discoverAttributes:1; + + uint32_t triggerNextServerJob:1; + uint32_t readyForNextServerJob:1; + uint32_t triggerBerryServerCB:1; + uint32_t deleteServerTask:1; }; uint32_t all = 0; } mode; @@ -218,8 +236,9 @@ struct { uint8_t HKinfoMsg = 0; char hk_setup_code[11]; #endif //USE_MI_HOMEKIT - void *beConnCB; + void *beConnCB; void *beAdvCB; + void *beServerCB; uint8_t *beAdvBuf; uint8_t infoMsg = 0; } MI32; @@ -379,7 +398,7 @@ const char kMI32DeviceType[] PROGMEM = {"Flora|MJ_HT_V1|LYWSD02|LYWSD03|CGG1|CGD const char kMI32_ConnErrorMsg[] PROGMEM = "no Error|could not connect|did disconnect|got no service|got no characteristic|can not read|can not notify|can not write|did not write|notify time out"; -const char kMI32_BLEInfoMsg[] PROGMEM = "Scan ended|Got Notification|Did connect|Did disconnect|Still connected|Start passive scanning|Start active scanning"; +const char kMI32_BLEInfoMsg[] PROGMEM = "Scan ended|Got Notification|Did connect|Did disconnect|Still connected|Start passive scanning|Start active scanning|Server characteristic set|Server advertisement set|Server scan response set|Server client did connect|Server client did disconnect"; const char kMI32_HKInfoMsg[] PROGMEM = "HAP core started|HAP core did not start!!|HAP controller disconnected|HAP controller connected|HAP outlet added"; @@ -397,6 +416,33 @@ enum MI32_Commands { // commands useable in console or rules enum MI32_TASK { MI32_TASK_SCAN = 0, MI32_TASK_CONN = 1, + MI32_TASK_SERV = 2, +}; + +enum BLE_CLIENT_OP { +BLE_OP_READ = 1, +BLE_OP_WRITE, +BLE_OP_SUBSCRIBE, +BLE_OP_UNSUBSCRIBE, //maybe used later +BLE_OP_DISCONNECT, +BLE_OP_GET_NOTIFICATION = 103, +}; + +enum BLE_SERVER_OP { +//commands +BLE_OP_SET_ADV = 201, +BLE_OP_SET_SCAN_RESP, +BLE_OP_SET_CHARACTERISTIC = 211, +//response +BLE_OP_ON_READ = 221, +BLE_OP_ON_WRITE, +BLE_OP_ON_UNSUBSCRIBE, +BLE_OP_ON_SUBSCRIBE_TO_NOTIFICATIONS, +BLE_OP_ON_SUBSCRIBE_TO_INDICATIONS, +BLE_OP_ON_SUBSCRIBE_TO_NOTIFICATIONS_AND_INDICATIONS, +BLE_OP_ON_CONNECT, +BLE_OP_ON_DISCONNECT, +BLE_OP_ON_STATUS, }; enum MI32_ConnErrorMsg { @@ -419,7 +465,12 @@ enum MI32_BLEInfoMsg { MI32_DID_DISCONNECT, MI32_STILL_CONNECTED, MI32_START_SCANNING_PASSIVE, - MI32_START_SCANNING_ACTIVE + MI32_START_SCANNING_ACTIVE, + MI32_SERV_CHARACTERISTIC_ADDED, + MI32_SERV_ADVERTISEMENT_ADDED, + MI32_SERV_SCANRESPONSE_ADDED, + MI32_SERV_CLIENT_CONNECTED, + MI32_SERV_CLIENT_DISCONNECTED }; enum MI32_HKInfoMsg { diff --git a/tasmota/tasmota_xdrv_driver/xdrv_52_3_berry_MI32.ino b/tasmota/tasmota_xdrv_driver/xdrv_52_3_berry_MI32.ino index 52f9c02e0..eb5e9ed33 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_52_3_berry_MI32.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_52_3_berry_MI32.ino @@ -74,9 +74,11 @@ extern "C" { /******************************************************************** ** BLE - generic BLE functions -********************************************************************/ +********************************************************************/ + extern bool MI32checkBLEinitialization(); extern void MI32setBerryAdvCB(void* function, uint8_t *buffer); extern void MI32setBerryConnCB(void* function, uint8_t *buffer); + extern void MI32setBerryServerCB(void* function, uint8_t *buffer); extern bool MI32runBerryConnection(uint8_t operation, bbool response); extern bool MI32setBerryCtxSvc(const char *Svc, bbool discoverAttributes); extern bool MI32setBerryCtxChr(const char *Chr); @@ -84,12 +86,25 @@ extern "C" { extern bool MI32addMACtoBlockList(uint8_t *MAC, uint8_t type); extern bool MI32addMACtoWatchList(uint8_t *MAC, uint8_t type); + int be_BLE_init(bvm *vm); + int be_BLE_init(bvm *vm) { + if (MI32checkBLEinitialization() == true){ + be_return(vm); + } + be_raise(vm, "ble_error", "BLE: device not initialized"); + be_return_nil(vm); + } void be_BLE_reg_conn_cb(void* function, uint8_t *buffer); void be_BLE_reg_conn_cb(void* function, uint8_t *buffer){ MI32setBerryConnCB(function,buffer); } + void be_BLE_reg_server_cb(void* function, uint8_t *buffer); + void be_BLE_reg_server_cb(void* function, uint8_t *buffer){ + MI32setBerryServerCB(function,buffer); + } + void be_BLE_reg_adv_cb(void* function, uint8_t *buffer); void be_BLE_reg_adv_cb(void* function, uint8_t *buffer){ if(function == 0){ @@ -193,7 +208,9 @@ BLE.set_chr BLE.set_MAC BLE.run(op, optional: bool response) + be_BLE_op: +# client 1 read 2 write 3 subscribe @@ -205,8 +222,28 @@ be_BLE_op: 13 subscribe once, then disconnect 14 unsubscribe once, then disconnect - maybe later +#server +__commands +201 add/set advertisement +202 add/set scan response + +211 add/set characteristic + +__response +221 onRead +222 onWrite +223 unsubscribed +224 subscribed to notifications +225 subscribed to indications +226 subscribed to notifications and indications +227 onConnect +228 onDisconnect +229 onStatus + + BLE.conn_cb(cb,buffer) BLE.adv_cb(cb,buffer) +BLE.serv_cb(cb,buffer) BLE.adv_watch(MAC) BLE.adv_block(MAC) diff --git a/tasmota/tasmota_xsns_sensor/xsns_62_esp32_mi.ino b/tasmota/tasmota_xsns_sensor/xsns_62_esp32_mi.ino index b57503b2c..4e188e0b9 100644 --- a/tasmota/tasmota_xsns_sensor/xsns_62_esp32_mi.ino +++ b/tasmota/tasmota_xsns_sensor/xsns_62_esp32_mi.ino @@ -163,9 +163,77 @@ class MI32AdvCallbacks: public NimBLEAdvertisedDeviceCallbacks { }; }; +static std::queue BLEmessageQueue; + +class MI32ServerCallbacks: public NimBLEServerCallbacks { + void onConnect(NimBLEServer* pServer, ble_gap_conn_desc* desc) { + BLEqueueBuffer_t q; + q.length = 6; + q.type = BLE_OP_ON_CONNECT; + q.buffer = new uint8_t[q.length]; + memcpy(q.buffer,desc->peer_ota_addr.val,6); + BLEmessageQueue.push(q); + MI32.infoMsg = MI32_SERV_CLIENT_CONNECTED; + }; + void onDisconnect(NimBLEServer* pServer) { + BLEqueueBuffer_t q; + q.length = 0; + q.type = BLE_OP_ON_DISCONNECT; + memset(MI32.conCtx->MAC,0,6); + BLEmessageQueue.push(q); + MI32.infoMsg = MI32_SERV_CLIENT_DISCONNECTED; + NimBLEDevice::startAdvertising(); + }; +}; + +class MI32CharacteristicCallbacks: public NimBLECharacteristicCallbacks { + void onRead(NimBLECharacteristic* pCharacteristic){ + BLEqueueBuffer_t q; + q.length = 0; + q.type = BLE_OP_ON_READ; + q.returnCharUUID = pCharacteristic->getUUID().getNative()->u16.value; + q.handle = pCharacteristic->getHandle(); + BLEmessageQueue.push(q); + }; + + void onWrite(NimBLECharacteristic* pCharacteristic) { + BLEqueueBuffer_t q; + q.type = BLE_OP_ON_WRITE; + q.returnCharUUID = pCharacteristic->getUUID().getNative()->u16.value; + q.handle = pCharacteristic->getHandle(); + q.length = pCharacteristic->getDataLength(); + q.buffer = new uint8_t[q.length]; + memcpy(q.buffer,pCharacteristic->getValue(),pCharacteristic->getDataLength()); + BLEmessageQueue.push(q); + }; + + /** The status returned in status is defined in NimBLECharacteristic.h. + * The value returned in code is the NimBLE host return code. + */ + void onStatus(NimBLECharacteristic* pCharacteristic, Status status, int code) { + BLEqueueBuffer_t q; + q.length = 0; + q.type = BLE_OP_ON_STATUS; + q.returnCharUUID = pCharacteristic->getUUID().getNative()->u16.value; + q.handle = pCharacteristic->getHandle(); + q.value = code; + BLEmessageQueue.push(q); + }; + + void onSubscribe(NimBLECharacteristic* pCharacteristic, ble_gap_conn_desc* desc, uint16_t subValue) { + BLEqueueBuffer_t q; + q.length = 0; + q.type = BLE_OP_ON_UNSUBSCRIBE + subValue; + q.returnCharUUID = pCharacteristic->getUUID().getNative()->u16.value; + q.handle = pCharacteristic->getHandle(); + BLEmessageQueue.push(q); + }; +}; + static MI32AdvCallbacks MI32ScanCallbacks; static MI32SensorCallback MI32SensorCB; +static MI32CharacteristicCallbacks MI32ChrCallback; static NimBLEClient* MI32Client; static std::queue MI32NotificationQueue; @@ -653,8 +721,9 @@ void MI32Init(void) { if (!MI32.mode.init) { NimBLEDevice::setScanFilterMode(CONFIG_BTDM_SCAN_DUPL_TYPE_DATA_DEVICE); NimBLEDevice::setScanDuplicateCacheSize(40); // will not be perfect for every situation (few vs many BLE devices nearby) - NimBLEDevice::init(""); - AddLog(LOG_LEVEL_INFO,PSTR("M32: Init BLE device")); + const std::string name(TasmotaGlobal.hostname); + NimBLEDevice::init(name); + AddLog(LOG_LEVEL_INFO,PSTR("M32: Init BLE device: %s"),TasmotaGlobal.hostname); MI32.mode.init = 1; MI32.mode.readyForNextConnJob = 1; MI32StartTask(MI32_TASK_SCAN); // Let's get started !! @@ -672,21 +741,41 @@ void MI32Init(void) { \*********************************************************************************************/ extern "C" { + bool MI32checkBLEinitialization(){ + return (MI32.mode.init && Settings->flag5.mi32_enable); + } + + bool MI32runBerryServer(uint16_t operation, bool response){ + MI32.conCtx->operation = operation; + MI32.conCtx->response = response; + AddLog(LOG_LEVEL_DEBUG,PSTR("BLE: Berry server op: %d, response: %u"),MI32.conCtx->operation, MI32.conCtx->response); + if(MI32.mode.readyForNextServerJob == 0){ + MI32.mode.triggerNextServerJob = 0; + AddLog(LOG_LEVEL_DEBUG,PSTR("M32: old server job not finished yet!!")); + return false; + } + MI32.mode.triggerNextServerJob = 1; + return true; + } + bool MI32runBerryConnection(uint8_t operation, bool response){ if(MI32.conCtx != nullptr){ + if(operation > 200){ + return MI32runBerryServer(operation,response); + } MI32.conCtx->oneOp = (operation > 9); MI32.conCtx->operation = operation%10; MI32.conCtx->response = response; - AddLog(LOG_LEVEL_DEBUG,PSTR("M32: Berry connection op: %d, addrType: %d, oneOp: %u, response: %u"),MI32.conCtx->operation, MI32.conCtx->addrType, MI32.conCtx->oneOp, MI32.conCtx->response); + AddLog(LOG_LEVEL_DEBUG,PSTR("BLE: Berry connection op: %d, addrType: %d, oneOp: %u, response: %u"),MI32.conCtx->operation, MI32.conCtx->addrType, MI32.conCtx->oneOp, MI32.conCtx->response); if(MI32.conCtx->oneOp){ MI32StartConnectionTask(); } else{ if(MI32.mode.connected){ - AddLog(LOG_LEVEL_DEBUG,PSTR("M32: continue connection job")); + AddLog(LOG_LEVEL_DEBUG,PSTR("BLE: continue connection job")); MI32.mode.triggerNextConnJob = 1; if(!MI32.mode.readyForNextConnJob){ - AddLog(LOG_LEVEL_DEBUG,PSTR("M32: old connection job not finished yet!!")); + AddLog(LOG_LEVEL_DEBUG,PSTR("BLE: old connection job not finished yet!!")); } } else{ @@ -704,7 +793,24 @@ extern "C" { } MI32.conCtx->buffer = buffer; MI32.beConnCB = function; - AddLog(LOG_LEVEL_INFO,PSTR("M32: Connection Ctx created")); + AddLog(LOG_LEVEL_INFO,PSTR("BLE: Connection Ctx created")); + } + + void MI32setBerryServerCB(void* function, uint8_t *buffer){ + if(function == nullptr || buffer == nullptr) + { + MI32.mode.deleteServerTask = 1; + MI32.beServerCB = nullptr; + AddLog(LOG_LEVEL_INFO,PSTR("BLE: Server session stopping")); + return; + } + if(MI32.conCtx == nullptr){ + MI32.conCtx = new MI32connectionContextBerry_t; + } + MI32.conCtx->buffer = buffer; + MI32.beServerCB = function; + MI32StartTask(MI32_TASK_SERV); + AddLog(LOG_LEVEL_INFO,PSTR("BLE: Server Ctx created")); } bool MI32setBerryCtxSvc(const char *Svc, bool discoverAttributes){ @@ -723,7 +829,7 @@ extern "C" { AddLog(LOG_LEVEL_DEBUG,PSTR("M32: CHR: %s"),MI32.conCtx->charUUID.toString().c_str()); uint16_t _uuid = MI32.conCtx->charUUID.getNative()->u16.value; //if not "notify op" -> present requested characteristic as return UUID MI32.conCtx->returnCharUUID = _uuid; - AddLog(LOG_LEVEL_DEBUG,PSTR("M32: return UUID: %04x"),MI32.conCtx->returnCharUUID); + AddLog(LOG_LEVEL_DEBUG,PSTR("M32: return 16-bit UUID: %04x"),MI32.conCtx->returnCharUUID); return true; } return false; @@ -846,7 +952,7 @@ extern "C" { case 5: //HAP_EVENT_PAIRING_STARTED MI32suspendScanTask(); default: - vTaskResume(MI32.ScanTask); + MI32resumeScanTask(); } if(event==4){ MI32.HKinfoMsg = MI32_HAP_CONTROLLER_DISCONNECTED; @@ -1042,7 +1148,11 @@ void MI32saveConfig(){ \*********************************************************************************************/ void MI32suspendScanTask(void){ - if (MI32.ScanTask != nullptr) vTaskSuspend(MI32.ScanTask); + if (MI32.ScanTask != nullptr && MI32.mode.runningScan == 1) vTaskSuspend(MI32.ScanTask); +} + +void MI32resumeScanTask(void){ + if (MI32.ScanTask != nullptr && MI32.mode.runningScan == 1) vTaskResume(MI32.ScanTask); } void MI32StartTask(uint32_t task){ @@ -1057,15 +1167,22 @@ void MI32StartTask(uint32_t task){ MI32.mode.deleteScanTask = 1; MI32StartConnectionTask(); break; + case MI32_TASK_SERV: + MI32.mode.deleteScanTask = 1; + MI32StartServerTask(); + break; default: break; } } +// Scan task section + void MI32StartScanTask(){ - if (MI32.mode.connected) return; + if (MI32.mode.connected == 1) return; if(MI32.ScanTask!=nullptr) vTaskDelete(MI32.ScanTask); MI32.mode.runningScan = 1; + MI32.mode.deleteScanTask = 0; xTaskCreatePinnedToCore( MI32ScanTask, /* Function to implement the task */ "MI32ScanTask", /* Name of the task */ @@ -1098,13 +1215,14 @@ void MI32ScanTask(void *pvParameters){ uint32_t timer = 0; for(;;){ - vTaskDelay(1000/ portTICK_PERIOD_MS); - if(MI32.mode.deleteScanTask){ + vTaskDelay(100/ portTICK_PERIOD_MS); + if(MI32.mode.deleteScanTask == 1){ MI32Scan->stop(); MI32.mode.runningScan = 0; + MI32.ScanTask = nullptr; break; } - if(MI32.mode.updateScan){ + if(MI32.mode.updateScan == 1){ MI32Scan->stop(); MI32Scan->setActiveScan(MI32.option.activeScan == 1); MI32Scan->start(0,true); @@ -1115,6 +1233,8 @@ void MI32ScanTask(void *pvParameters){ vTaskDelete( NULL ); } +// connection task section + bool MI32ConnectActiveSensor(){ // only use inside a task !! if(MI32.conCtx->operation == 5) { return false; @@ -1307,6 +1427,144 @@ void MI32ConnectionTask(void *pvParameters){ vTaskDelete( NULL ); } +// server task section + +bool MI32StartServerTask(){ + AddLog(LOG_LEVEL_DEBUG,PSTR("BLE: Server task ... start")); + MI32NotificationQueue = {}; + xTaskCreatePinnedToCore( + MI32ServerTask, /* Function to implement the task */ + "MI32ServerTask", /* Name of the task */ + 8192, /* Stack size in words */ + NULL, /* Task input parameter */ + 2, /* Priority of the task */ + &MI32.ServerTask, /* Task handle. */ + 0); /* Core where the task should run */ + return true; +} + +void MI32ServerSetAdv(NimBLEServer *pServer, std::vector& servicesToStart, bool &shallStartServices); +void MI32ServerSetAdv(NimBLEServer *pServer, std::vector& servicesToStart, bool &shallStartServices){ + NimBLEAdvertising *pAdvertising = NimBLEDevice::getAdvertising(); + BLEqueueBuffer_t q; + q.length = 0; + if(shallStartServices && MI32.conCtx->operation == BLE_OP_SET_ADV){ + q.buffer = new uint8_t[256]; + for (auto & pService : servicesToStart) { + pService->start(); + } + shallStartServices = false; // only do this at the first run + if(servicesToStart.size() != 0){ + pServer->start(); // only start server when svc and chr do exist + uint32_t idx = 0; + for (auto & pService : servicesToStart) { + std::vector characteristics = pService->getCharacteristics(); + for (auto & pCharacteristic : characteristics) { + uint16_t handle = pCharacteristic->getHandle(); // now we have handles, so pass them to Berry + q.buffer[idx] = (uint8_t)handle>>8; + q.buffer[idx+1] = (uint8_t)handle&0xff; + if (idx > 254) break; // limit to 127 characteristics + idx += 2; + } + } + q.length = idx; + } + servicesToStart.clear(); // release vector + } + NimBLEAdvertisementData adv; + adv.addData((char *)&MI32.conCtx->buffer[1], MI32.conCtx->buffer[0]); + if(MI32.conCtx->operation == BLE_OP_SET_ADV){ + pAdvertising->setAdvertisementData(adv); // replace whole advertisement with our custom data from the Berry side + pAdvertising->start(); + } else + { + pAdvertising->setScanResponseData(adv); + pAdvertising->setScanResponse(true); + } + + MI32.infoMsg = MI32_SERV_SCANRESPONSE_ADDED + (MI32.conCtx->operation - BLE_OP_SET_SCAN_RESP); // .. ADV or SCAN RESPONSE + q.type = MI32.conCtx->operation; + q.returnCharUUID = 0; // does not matter + q.handle = 0; //dito + BLEmessageQueue.push(q); +} + +void MI32ServerSetCharacteristic(NimBLEServer *pServer, std::vector& servicesToStart, bool &shallStartServices); +void MI32ServerSetCharacteristic(NimBLEServer *pServer, std::vector& servicesToStart, bool &shallStartServices){ + MI32.conCtx->error = MI32_CONN_NO_ERROR; + NimBLEService *pService = pServer->getServiceByUUID(MI32.conCtx->serviceUUID); // retrieve ... + if(pService == nullptr){ + pService = pServer->createService(MI32.conCtx->serviceUUID); //... or create service. + if(pService == nullptr){ + MI32.conCtx->error = MI32_CONN_NO_SERVICE; + return; + } + + if(shallStartServices){ + servicesToStart.push_back(pService); + } + } + NimBLECharacteristic *pCharacteristic = pService->getCharacteristic(MI32.conCtx->charUUID); // again retrieve ... + if(pCharacteristic == nullptr){ + uint32_t _writeRSP = MI32.conCtx->response ? NIMBLE_PROPERTY::WRITE : NIMBLE_PROPERTY::WRITE_NR; + pCharacteristic = pService->createCharacteristic(MI32.conCtx->charUUID, + NIMBLE_PROPERTY::READ | + _writeRSP | + NIMBLE_PROPERTY::NOTIFY | + NIMBLE_PROPERTY::INDICATE); //... or create characteristic. + if(pCharacteristic == nullptr){ + MI32.conCtx->error = MI32_CONN_NO_CHARACTERISTIC; + return; + } + pCharacteristic->setCallbacks(&MI32ChrCallback); + MI32.infoMsg = MI32_SERV_CHARACTERISTIC_ADDED; + } + pCharacteristic->setValue(MI32.conCtx->buffer + 1, MI32.conCtx->buffer[0]); // set value + pCharacteristic->notify(true); // always notify .. for now + BLEqueueBuffer_t q; + q.length = 0; + q.type = BLE_OP_SET_CHARACTERISTIC; + q.returnCharUUID = pCharacteristic->getUUID().getNative()->u16.value; + q.handle = pCharacteristic->getHandle(); // this returns "-1", no valid handle yet :( + BLEmessageQueue.push(q); +} + +void MI32ServerTask(void *pvParameters){ + MI32.conCtx->error = MI32_CONN_NO_ERROR; + NimBLEServer *pServer = NimBLEDevice::createServer(); + pServer->setCallbacks(new MI32ServerCallbacks()); + MI32.mode.readyForNextServerJob = 1; + MI32.mode.deleteServerTask = 0; + std::vector servicesToStart; + bool shallStartServices = true; //will start service at the first call MI32ServerSetAdv() + + for(;;){ + while(MI32.mode.triggerNextServerJob == 0){ + if(MI32.mode.deleteServerTask == 1){ + delete MI32.conCtx; + MI32.conCtx = nullptr; + pServer->stopAdvertising(); + MI32StartTask(MI32_TASK_SCAN); + vTaskDelete( NULL ); + } + vTaskDelay(50/ portTICK_PERIOD_MS); + } + MI32.mode.readyForNextServerJob = 0; + switch(MI32.conCtx->operation){ + case BLE_OP_SET_ADV: case BLE_OP_SET_SCAN_RESP: + MI32ServerSetAdv(pServer, servicesToStart, shallStartServices); + break; + case BLE_OP_SET_CHARACTERISTIC: + MI32ServerSetCharacteristic(pServer, servicesToStart, shallStartServices); + break; + } + + MI32.mode.triggerNextServerJob = 0; + MI32.mode.readyForNextServerJob = 1; + MI32.mode.triggerBerryServerCB = 1; + } +} + /*********************************************************************************************\ * parse the response from advertisements \*********************************************************************************************/ @@ -1720,6 +1978,28 @@ void MI32Every50mSecond(){ } MI32.mode.triggerBerryConnCB = 0; } + + if(!BLEmessageQueue.empty()){ + BLEqueueBuffer_t q = BLEmessageQueue.front(); + BLEmessageQueue.pop(); + MI32.conCtx->returnCharUUID = q.returnCharUUID; + MI32.conCtx->handle = q.handle; + MI32.conCtx->operation = q.type; + MI32.conCtx->error = 0; + if(q.length != 0){ + MI32.conCtx->buffer[0] = q.length; + memcpy(MI32.conCtx->buffer + 1,q.buffer,q.length); + delete q.buffer; + } + if(MI32.beServerCB != nullptr){ + void (*func_ptr)(int, int, int, int) = (void (*)(int, int, int, int))MI32.beServerCB; + char _message[32]; + GetTextIndexed(_message, sizeof(_message), MI32.conCtx->error, kMI32_ConnErrorMsg); + AddLog(LOG_LEVEL_DEBUG,PSTR("M32: BryCbMsg: %s"),_message); + func_ptr(MI32.conCtx->error, MI32.conCtx->operation , MI32.conCtx->returnCharUUID, MI32.conCtx->handle); + } + } + if(MI32.infoMsg > 0){ char _message[32]; GetTextIndexed(_message, sizeof(_message), MI32.infoMsg-1, kMI32_BLEInfoMsg); @@ -2057,7 +2337,7 @@ void MI32InitGUI(void){ WSContentSend_P(PSTR("")); WSContentSpaceButton(BUTTON_MAIN); WSContentStop(); - vTaskResume(MI32.ScanTask); + MI32resumeScanTask(); } void MI32HandleWebGUI(void){ @@ -2246,7 +2526,7 @@ void MI32Show(bool json) MI32addHistory(MI32.energy_history,Energy->active_power[0],100); //TODO: which value?? #endif //USE_MI_ESP32_ENERGY #endif //USE_MI_EXT_GUI - vTaskResume(MI32.ScanTask); + MI32resumeScanTask(); #ifdef USE_WEBSERVER } else { MI32suspendScanTask(); @@ -2309,7 +2589,7 @@ void MI32Show(bool json) #endif //USE_MI_EXT_GUI #endif // USE_WEBSERVER } - vTaskResume(MI32.ScanTask); + MI32resumeScanTask(); } int ExtStopBLE(){ From bec24baa7544fd0e02947634575a3acbabc28e7d Mon Sep 17 00:00:00 2001 From: stefanbode Date: Wed, 26 Apr 2023 08:39:49 +0200 Subject: [PATCH 039/289] Changes JSON message to actual position and not outdated (#18502) * Report actual position in JSON * Update xdrv_27_shutter.ino * Update xdrv_27_esp32_shutter.ino * copy&paste error --- .../xdrv_27_esp32_shutter.ino | 19 +++++-------------- .../tasmota_xdrv_driver/xdrv_27_shutter.ino | 7 +++++++ 2 files changed, 12 insertions(+), 14 deletions(-) diff --git a/tasmota/tasmota_xdrv_driver/xdrv_27_esp32_shutter.ino b/tasmota/tasmota_xdrv_driver/xdrv_27_esp32_shutter.ino index 6b3499f4d..6f1c9b853 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_27_esp32_shutter.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_27_esp32_shutter.ino @@ -1595,11 +1595,6 @@ void CmndShutterCloseTime(void) ShutterSettings.shutter_closetime[XdrvMailbox.index -1] = (uint16_t)(10 * CharToFloat(XdrvMailbox.data)); ShutterInit(); } -/* - char time_chr[10]; - dtostrfd((float)(ShutterSettings.shutter_closetime[XdrvMailbox.index -1]) / 10, 1, time_chr); - ResponseCmndIdxChar(time_chr); -*/ ResponseCmndIdxFloat((float)(ShutterSettings.shutter_closetime[XdrvMailbox.index -1]) / 10, 1); } } @@ -1612,11 +1607,6 @@ void CmndShutterMotorDelay(void) ShutterInit(); //AddLog(LOG_LEVEL_DEBUG, PSTR("SHT: Shtr Init1. realdelay %d"),Shutter[XdrvMailbox.index -1].motordelay); } -/* - char time_chr[10]; - dtostrfd((float)(Shutter[XdrvMailbox.index -1].motordelay) / STEPS_PER_SECOND, 2, time_chr); - ResponseCmndIdxChar(time_chr); -*/ ResponseCmndIdxFloat((float)(Shutter[XdrvMailbox.index -1].motordelay) / STEPS_PER_SECOND, 2); } } @@ -2192,11 +2182,12 @@ bool Xdrv27(uint32_t function) break; case FUNC_JSON_APPEND: for (uint8_t i = 0; i < TasmotaGlobal.shutters_present; i++) { - uint8_t position = (ShutterSettings.shutter_options[i] & 1) ? 100 - ShutterSettings.shutter_position[i] : ShutterSettings.shutter_position[i]; - uint8_t target = (ShutterSettings.shutter_options[i] & 1) ? 100 - ShutterRealToPercentPosition(Shutter[i].target_position, i) : ShutterRealToPercentPosition(Shutter[i].target_position, i); + uint8_t position = ShutterRealToPercentPosition(Shutter[i].real_position, i); + uint8_t target = ShutterRealToPercentPosition(Shutter[i].target_position, i); ResponseAppend_P(","); - ResponseAppend_P(JSON_SHUTTER_POS, i+1, position, Shutter[i].direction,target, Shutter[i].tilt_real_pos); + ResponseAppend_P(JSON_SHUTTER_POS, i+1, ((ShutterSettings.shutter_options[i] & 1) ? 100 - position : position), Shutter[i].direction, + ((ShutterSettings.shutter_options[i] & 1) ? 100 - target : target), Shutter[i].tilt_real_pos); #ifdef USE_DOMOTICZ if ((0 == TasmotaGlobal.tele_period) && (0 == i)) { DomoticzSensor(DZ_SHUTTER, position); @@ -2308,6 +2299,6 @@ void CmndShutterUnitTest(void) { } #else void CmndShutterUnitTest(void) {} -#endif +#endif // SHUTTER_UNITTEST #endif // ESP32 diff --git a/tasmota/tasmota_xdrv_driver/xdrv_27_shutter.ino b/tasmota/tasmota_xdrv_driver/xdrv_27_shutter.ino index 18940e681..566778289 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_27_shutter.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_27_shutter.ino @@ -1922,6 +1922,13 @@ bool Xdrv27(uint32_t function) result = DecodeCommand(kShutterCommands, ShutterCommand); } break; + for (uint8_t i = counter; i <= counterend; i++) { + XdrvMailbox.index = i; + XdrvMailbox.payload = rescue_payload; + XdrvMailbox.data_len = rescue_data_len; + result = DecodeCommand(kShutterCommands, ShutterCommand); + } + break; case FUNC_JSON_APPEND: for (uint8_t i = 0; i < TasmotaGlobal.shutters_present; i++) { uint8_t position = (Settings->shutter_options[i] & 1) ? 100 - Settings->shutter_position[i] : Settings->shutter_position[i]; From afbdb3d54f29b5878a452d3f976e2031c1698173 Mon Sep 17 00:00:00 2001 From: stefanbode Date: Wed, 26 Apr 2023 11:39:59 +0200 Subject: [PATCH 040/289] Added TILTCONFIG to status13 message for MATTER support (#18512) --- tasmota/tasmota_xdrv_driver/xdrv_27_esp32_shutter.ino | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/tasmota/tasmota_xdrv_driver/xdrv_27_esp32_shutter.ino b/tasmota/tasmota_xdrv_driver/xdrv_27_esp32_shutter.ino index 6f1c9b853..bb7aec959 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_27_esp32_shutter.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_27_esp32_shutter.ino @@ -327,11 +327,14 @@ bool ShutterStatus(void) { ResponseAppend_P(PSTR("\"" D_STATUS13_SHUTTER "%d\":{\"Relay1\":%d,\"Relay2\":%d,\"Open\":%d,\"Close\":%d," "\"50perc\":%d,\"Delay\":%d,\"Opt\":\"%s\"," "\"Calib\":[%d,%d,%d,%d,%d]," - "\"Mode\":\"%d\"}"), + "\"Mode\":\"%d\"," + "\"TiltConfig\":[%d,%d,%d,%d,%d]}"), i, ShutterSettings.shutter_startrelay[i], ShutterSettings.shutter_startrelay[i] +1, ShutterSettings.shutter_opentime[i], ShutterSettings.shutter_closetime[i], ShutterSettings.shutter_set50percent[i], ShutterSettings.shutter_motordelay[i], GetBinary8(Settings->shutter_options[i], 4).c_str(), ShutterSettings.shuttercoeff[0][i], ShutterSettings.shuttercoeff[1][i], ShutterSettings.shuttercoeff[2][i], ShutterSettings.shuttercoeff[3][i], ShutterSettings.shuttercoeff[4][i], - ShutterSettings.shutter_mode); + ShutterSettings.shutter_mode, + ShutterSettings.shutter_tilt_config[0][i], ShutterSettings.shutter_tilt_config[1][i], ShutterSettings.shutter_tilt_config[2][i], ShutterSettings.shutter_tilt_config[3][i], ShutterSettings.shutter_tilt_config[4][i] + ); } ResponseJsonEndEnd(); return true; From 4c685967e6a2319bc88042f6ec74986987e67de9 Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Wed, 26 Apr 2023 14:10:11 +0200 Subject: [PATCH 041/289] Update changelogs --- CHANGELOG.md | 4 ++-- RELEASENOTES.md | 3 ++- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3add3bec2..cc77eec5a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,8 +8,8 @@ All notable changes to this project will be documented in this file. - Matter sensors Humidity, Pressure, Illuminance; optimize memory (#18441) - Command ``SetOption152 0/1`` to select two (0 = default) pin bistable or one (1) pin latching relay control (#18386) - Matter allow `Matter#Initialized` rule once the device is configured (#18451) -- Matter add UI to change endpoints configuration (#18498) -- Matter add support for Shutters (without Tilt) +- Matter UI to change endpoints configuration (#18498) +- Matter support for Shutters (without Tilt) (#18509) ### Breaking Changed diff --git a/RELEASENOTES.md b/RELEASENOTES.md index 88b95bc01..c30e4cfa6 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -115,7 +115,8 @@ The latter links can be used for OTA upgrades too like ``OtaUrl https://ota.tasm - Command ``SetOption152 0/1`` to select two (0 = default) pin bistable or one (1) pin latching relay control [#18386](https://github.com/arendst/Tasmota/issues/18386) - Matter sensors Humidity, Pressure, Illuminance [#18441](https://github.com/arendst/Tasmota/issues/18441) - Matter allow `Matter#Initialized` rule once the device is configured [#18451](https://github.com/arendst/Tasmota/issues/18451) -- Matter add UI to change endpoints configuration [#18498](https://github.com/arendst/Tasmota/issues/18498) +- Matter UI to change endpoints configuration [#18498](https://github.com/arendst/Tasmota/issues/18498) +- Matter support for Shutters (without Tilt) [#18509](https://github.com/arendst/Tasmota/issues/18509) ### Breaking Changed From ee9d086abacbec1d9d0d4d5850212661ad0656e3 Mon Sep 17 00:00:00 2001 From: Jeroen Date: Wed, 26 Apr 2023 22:27:53 +0200 Subject: [PATCH 042/289] Solved: ModbusBridge reading int16 returns uint16 (#18524) https://github.com/arendst/Tasmota/issues/18522 Co-authored-by: JeroenSt --- tasmota/tasmota_xdrv_driver/xdrv_63_modbus_bridge.ino | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tasmota/tasmota_xdrv_driver/xdrv_63_modbus_bridge.ino b/tasmota/tasmota_xdrv_driver/xdrv_63_modbus_bridge.ino index f75217fd1..570cf7049 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_63_modbus_bridge.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_63_modbus_bridge.ino @@ -485,7 +485,7 @@ void ModbusBridgeHandle(void) ((uint8_t *)&value)[0] = modbusBridge.buffer[dataOffset + 3 + (count * 4)]; } if (modbusBridge.type == ModbusBridgeType::mb_int32) - snprintf(svalue, MBR_MAX_VALUE_LENGTH, "%d", value); + snprintf(svalue, MBR_MAX_VALUE_LENGTH, "%d", (int32_t)value); else snprintf(svalue, MBR_MAX_VALUE_LENGTH, "%u", value); } @@ -506,7 +506,7 @@ void ModbusBridgeHandle(void) ((uint8_t *)&value)[0] = modbusBridge.buffer[dataOffset + 1 + (count * 2)]; } if (modbusBridge.type == ModbusBridgeType::mb_int16) - snprintf(svalue, MBR_MAX_VALUE_LENGTH, "%d", value); + snprintf(svalue, MBR_MAX_VALUE_LENGTH, "%d", (int16_t)value); else snprintf(svalue, MBR_MAX_VALUE_LENGTH, "%u", value); } @@ -515,7 +515,7 @@ void ModbusBridgeHandle(void) { uint8_t value = modbusBridge.buffer[dataOffset + (count * 1)]; if (modbusBridge.type == ModbusBridgeType::mb_int8) - snprintf(svalue, MBR_MAX_VALUE_LENGTH, "%d", value); + snprintf(svalue, MBR_MAX_VALUE_LENGTH, "%d", (int8_t)value); else snprintf(svalue, MBR_MAX_VALUE_LENGTH, "%u", value); } From 670232178457bd0418bec3a0e429b0c7b7fa7868 Mon Sep 17 00:00:00 2001 From: s-hadinger <49731213+s-hadinger@users.noreply.github.com> Date: Wed, 26 Apr 2023 22:53:26 +0200 Subject: [PATCH 043/289] Matter shutter with tilt (#18525) --- .../berry_matter/src/be_matter_module.c | 2 + .../src/embedded/Matter_Device.be | 5 +- .../src/embedded/Matter_Plugin_Shutter.be | 29 +- .../src/embedded/Matter_Plugin_ShutterTilt.be | 114 +++++ .../berry_matter/src/embedded/Matter_UI.be | 2 +- .../src/solidify/solidified_Matter_Device.h | 465 +++++++++--------- .../solidified_Matter_Plugin_Shutter.h | 336 +++++-------- .../solidified_Matter_Plugin_ShutterTilt.h | 219 +++++++++ .../src/solidify/solidified_Matter_UI.h | 2 +- .../xdrv_52_3_berry_zigbee.ino | 5 +- 10 files changed, 715 insertions(+), 464 deletions(-) create mode 100644 lib/libesp32/berry_matter/src/embedded/Matter_Plugin_ShutterTilt.be create mode 100644 lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_ShutterTilt.h diff --git a/lib/libesp32/berry_matter/src/be_matter_module.c b/lib/libesp32/berry_matter/src/be_matter_module.c index 9a82abce2..459518fee 100644 --- a/lib/libesp32/berry_matter/src/be_matter_module.c +++ b/lib/libesp32/berry_matter/src/be_matter_module.c @@ -160,6 +160,7 @@ extern const bclass be_class_Matter_TLV; // need to declare it upfront because #include "solidify/solidified_Matter_Plugin_Light2.h" #include "solidify/solidified_Matter_Plugin_Light3.h" #include "solidify/solidified_Matter_Plugin_Shutter.h" +#include "solidify/solidified_Matter_Plugin_ShutterTilt.h" #include "solidify/solidified_Matter_Plugin_Sensor.h" #include "solidify/solidified_Matter_Plugin_Sensor_Pressure.h" #include "solidify/solidified_Matter_Plugin_Sensor_Temp.h" @@ -339,6 +340,7 @@ module matter (scope: global, strings: weak) { Plugin_Light2, class(be_class_Matter_Plugin_Light2) // Color Temperature Light Plugin_Light3, class(be_class_Matter_Plugin_Light3) // Extended Color Light Plugin_Shutter, class(be_class_Matter_Plugin_Shutter) // Shutter + Plugin_ShutterTilt, class(be_class_Matter_Plugin_ShutterTilt) // Shutter + Tilt Plugin_Sensor, class(be_class_Matter_Plugin_Sensor) // Generic Sensor Plugin_Sensor_Pressure, class(be_class_Matter_Plugin_Sensor_Pressure) // Pressure Sensor Plugin_Sensor_Temp, class(be_class_Matter_Plugin_Sensor_Temp) // Temperature Sensor diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Device.be b/lib/libesp32/berry_matter/src/embedded/Matter_Device.be index abd767d8a..e96321fb8 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Device.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Device.be @@ -1048,8 +1048,11 @@ class Matter_Device if relay2 >= 0 relays_reserved.push(relay2) end tasmota.log(string.format("MTR: relay1 = %s, relay2 = %s", relay1, relay2), 3) + # is there tilt support + var tilt_array = d.find('TiltConfig') + var tilt_config = tilt_array && (tilt_array[2] > 0) # add shutter to definition - m[str(endpoint)] = {'type':'shutter','shutter':idx} + m[str(endpoint)] = {'type': tilt_config ? 'shutter+tilt' : 'shutter', 'shutter':idx} endpoint += 1 idx += 1 end diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Shutter.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Shutter.be index 408e74ba7..c3e0f38df 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Shutter.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Shutter.be @@ -34,7 +34,7 @@ class Matter_Plugin_Shutter : Matter_Plugin_Device # 0x0003: inherited # Identify 1.2 p.16 # 0x0004: inherited # Groups 1.3 p.21 # 0x0005: inherited # Scenes 1.4 p.30 - no writable - 0x0102: [0,5,6,7,8,9,0xA,0xB,0xC,0xD,0xE,0xF,0x17,0xFFFC,0xFFFD], # Window Covering 5.3 p.289 + 0x0102: [0,5,7,0xA,0xB,0xD,0xE,0x17,0xFFFC,0xFFFD], # Window Covering 5.3 p.289 } static var TYPES = { 0x0202: 2 } # New data model format and notation @@ -79,34 +79,24 @@ class Matter_Plugin_Shutter : Matter_Plugin_Device return TLV.create_TLV(TLV.U1, 0xFF) # 0xFF = unknown type of shutter elif attribute == 0x0005 # ---------- NumberOfActuationsLift / u16 ---------- return TLV.create_TLV(TLV.U2, 0) - elif attribute == 0x0006 # ---------- NumberOfActuationsTilt / u16 ---------- - return TLV.create_TLV(TLV.U2, 0) elif attribute == 0x0007 # ---------- ConfigStatus / u8 ---------- - return TLV.create_TLV(TLV.U1, 1 + 8 + 16) # Operational + Lift Position Aware + Tilt Position Aware + return TLV.create_TLV(TLV.U1, 1 + 8) # Operational + Lift Position Aware elif attribute == 0x000D # ---------- EndProductType / u8 ---------- return TLV.create_TLV(TLV.U1, 0xFF) # 0xFF = unknown type of shutter - elif attribute == 0x0008 # ---------- CurrentPositionLiftPercentage / u8 ---------- - return TLV.create_TLV(TLV.U2, 100 - self.shadow_shutter_pos) elif attribute == 0x000E # ---------- CurrentPositionLiftPercent100ths / u16 ---------- return TLV.create_TLV(TLV.U2, (100 - self.shadow_shutter_pos) * 100) - elif attribute == 0x0009 # ---------- CurrentPositionTiltPercentage / u8 ---------- - return TLV.create_TLV(TLV.U2, 100 - self.shadow_shutter_tilt) - elif attribute == 0x000F # ---------- CurrentPositionTiltPercent100ths / u8 ---------- - return TLV.create_TLV(TLV.U2, (100 - self.shadow_shutter_tilt) * 100) elif attribute == 0x000A # ---------- OperationalStatus / u8 ---------- var op = self.shadow_shutter_direction == 0 ? 0 : (self.shadow_shutter_direction > 0 ? 1 : 2) - return TLV.create_TLV(TLV.U1, op) # TODO from sensors + return TLV.create_TLV(TLV.U1, op) elif attribute == 0x000B # ---------- TargetPositionLiftPercent100ths / u16 ---------- return TLV.create_TLV(TLV.U2, (100 - self.shadow_shutter_target) * 100) - elif attribute == 0x000C # ---------- TargetPositionTiltPercent100ths / u16 ---------- - return TLV.create_TLV(TLV.U1, 0) # TODO elif attribute == 0x0017 # ---------- Mode / u8 ---------- return TLV.create_TLV(TLV.U1, 0) # normal mode elif attribute == 0xFFFC # ---------- FeatureMap / map32 ---------- - return TLV.create_TLV(TLV.U4, 3 + 4 + 16) # Lift + Tilt + PA_LF + PA_TL + return TLV.create_TLV(TLV.U4, 1 + 4) # Lift + PA_LF elif attribute == 0xFFFD # ---------- ClusterRevision / u2 ---------- return TLV.create_TLV(TLV.U4, 5) # New data model format and notation end @@ -152,13 +142,6 @@ class Matter_Plugin_Shutter : Matter_Plugin_Device self.update_shadow() end return true - elif command == 0x0008 # ---------- GoToTiltPercentage ---------- - var tilt = val.findsubval(0) - if tilt != nil - tilt = tilt / 10 - ctx.log = "tilt%:"+str(tilt) - end - return true end else @@ -182,16 +165,14 @@ class Matter_Plugin_Shutter : Matter_Plugin_Device var val_pos = v.find("Position") if val_pos != nil if val_pos != self.shadow_shutter_pos - # self.attribute_updated(0x0102, 0x0008) # CurrentPositionLiftPercentage self.attribute_updated(0x0102, 0x000E) # CurrentPositionLiftPercent100ths end self.shadow_shutter_pos = val_pos end - # Tilt + # Tilt - we can keep it here knowing that it won't change if not implemented var val_tilt = v.find("Tilt") if val_tilt != nil if val_tilt != self.shadow_shutter_tilt - # self.attribute_updated(0x0102, 0x0009) # CurrentPositionTiltPercentage self.attribute_updated(0x0102, 0x000F) # CurrentPositionTiltPercent100ths end self.shadow_shutter_tilt = val_tilt diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_ShutterTilt.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_ShutterTilt.be new file mode 100644 index 000000000..7d8adb7b4 --- /dev/null +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_ShutterTilt.be @@ -0,0 +1,114 @@ +# +# Matter_Plugin_ShutterTilt.be - implements the behavior for shutters with tilt control +# +# Copyright (C) 2023 Stephan Hadinger & Theo Arends +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +# + +# Matter plug-in for core behavior + +# dummy declaration for solidification +class Matter_Plugin_Shutter end + +#@ solidify:Matter_Plugin_ShutterTilt,weak + +class Matter_Plugin_ShutterTilt : Matter_Plugin_Shutter + static var TYPE = "shutter+tilt" # name of the plug-in in json + static var NAME = "Shutter + Tilt" # display name of the plug-in + # inherited static var ARG = "shutter" # additional argument name (or empty if none) + # inherited static var ARG_TYPE = / x -> int(x) # function to convert argument to the right type + static var CLUSTERS = { + # 0x001D: inherited # Descriptor Cluster 9.5 p.453 + # 0x0003: inherited # Identify 1.2 p.16 + # 0x0004: inherited # Groups 1.3 p.21 + # 0x0005: inherited # Scenes 1.4 p.30 - no writable + 0x0102: [7,0xC,0xF,0xFFFC], # Window Covering 5.3 p.289 + } + # inherited static var TYPES = { 0x0202: 2 } # New data model format and notation + + # below is inherited + # var tasmota_shutter_index # Shutter number in Tasmota (zero based) + # var shadow_shutter_pos + # var shadow_shutter_target + # var shadow_shutter_tilt + # var shadow_shutter_direction # 1=opening -1=closing 0=not moving TODO + + ############################################################# + # Constructor inherited + + ############################################################# + # Update shadow inherited + + ############################################################# + # read an attribute + # + def read_attribute(session, ctx) + import string + var TLV = matter.TLV + var cluster = ctx.cluster + var attribute = ctx.attribute + + # ==================================================================================================== + if cluster == 0x0102 # ========== Window Covering 5.3 p.289 ========== + self.update_shadow_lazy() + if attribute == 0x0007 # ---------- ConfigStatus / u8 ---------- + return TLV.create_TLV(TLV.U1, 1 + 8 + 16) # Operational + Lift Position Aware + Tilt Position Aware + + elif attribute == 0x000F # ---------- CurrentPositionTiltPercent100ths / u8 ---------- + return TLV.create_TLV(TLV.U2, (100 - self.shadow_shutter_tilt) * 100) + elif attribute == 0x000C # ---------- TargetPositionTiltPercent100ths / u16 ---------- + return TLV.create_TLV(TLV.U1, 0) # TODO + + elif attribute == 0xFFFC # ---------- FeatureMap / map32 ---------- + return TLV.create_TLV(TLV.U4, 3 + 4 + 16) # Lift + Tilt + PA_LF + PA_TL + end + end + # else + return super(self).read_attribute(session, ctx) + end + + ############################################################# + # Invoke a command + # + # returns a TLV object if successful, contains the response + # or an `int` to indicate a status + def invoke_request(session, val, ctx) + import light + var TLV = matter.TLV + var cluster = ctx.cluster + var command = ctx.command + + # ==================================================================================================== + if cluster == 0x0102 # ========== Window Covering 5.3 p.289 ========== + self.update_shadow_lazy() + if command == 0x0008 # ---------- GoToTiltPercentage ---------- + var tilt = val.findsubval(0) + if tilt != nil + tilt = tilt / 10 + ctx.log = "tilt%:"+str(tilt) + end + return true + end + end + # else + return super(self).invoke_request(session, val, ctx) + + end + + ############################################################# + # parse sensor inherited + +end +matter.Plugin_ShutterTilt = Matter_Plugin_ShutterTilt diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_UI.be b/lib/libesp32/berry_matter/src/embedded/Matter_UI.be index a2633b34c..cfc9e4cfc 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_UI.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_UI.be @@ -33,7 +33,7 @@ import matter ################################################################################# class Matter_UI static var _ROOT_TYPES = "root" - static var _CLASSES_TYPES = "|relay|light0|light1|light2|light3|shutter" + static var _CLASSES_TYPES = "|relay|light0|light1|light2|light3|shutter|shutter+tilt" "|temperature|pressure|illuminance|humidity" var device diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Device.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Device.h index 3c48befb9..57409987c 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Device.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Device.h @@ -2018,7 +2018,7 @@ be_local_closure(Matter_Device_autoconf_device_map, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[51]) { /* constants */ + ( &(const bvalue[53]) { /* constants */ /* K0 */ be_nested_str_weak(string), /* K1 */ be_nested_str_weak(json), /* K2 */ be_nested_str_weak(0), @@ -2050,30 +2050,32 @@ be_local_closure(Matter_Device_autoconf_device_map, /* name */ /* K28 */ be_nested_str_weak(Relay2), /* K29 */ be_nested_str_weak(push), /* K30 */ be_nested_str_weak(MTR_X3A_X20relay1_X20_X3D_X20_X25s_X2C_X20relay2_X20_X3D_X20_X25s), - /* K31 */ be_nested_str_weak(shutter), - /* K32 */ be_nested_str_weak(get_power), - /* K33 */ be_nested_str_weak(relay), - /* K34 */ be_nested_str_weak(load), - /* K35 */ be_nested_str_weak(read_sensors), - /* K36 */ be_nested_str_weak(k2l), - /* K37 */ be_nested_str_weak(Temperature), - /* K38 */ be_nested_str_weak(_X23Temperature), - /* K39 */ be_nested_str_weak(temperature), - /* K40 */ be_nested_str_weak(filter), - /* K41 */ be_nested_str_weak(stop_iteration), - /* K42 */ be_nested_str_weak(Pressure), - /* K43 */ be_nested_str_weak(_X23Pressure), - /* K44 */ be_nested_str_weak(pressure), - /* K45 */ be_nested_str_weak(Illuminance), - /* K46 */ be_nested_str_weak(_X23Illuminance), - /* K47 */ be_nested_str_weak(illuminance), - /* K48 */ be_nested_str_weak(Humidity), - /* K49 */ be_nested_str_weak(_X23Humidity), - /* K50 */ be_nested_str_weak(humidity), + /* K31 */ be_nested_str_weak(TiltConfig), + /* K32 */ be_nested_str_weak(shutter_X2Btilt), + /* K33 */ be_nested_str_weak(shutter), + /* K34 */ be_nested_str_weak(get_power), + /* K35 */ be_nested_str_weak(relay), + /* K36 */ be_nested_str_weak(load), + /* K37 */ be_nested_str_weak(read_sensors), + /* K38 */ be_nested_str_weak(k2l), + /* K39 */ be_nested_str_weak(Temperature), + /* K40 */ be_nested_str_weak(_X23Temperature), + /* K41 */ be_nested_str_weak(temperature), + /* K42 */ be_nested_str_weak(filter), + /* K43 */ be_nested_str_weak(stop_iteration), + /* K44 */ be_nested_str_weak(Pressure), + /* K45 */ be_nested_str_weak(_X23Pressure), + /* K46 */ be_nested_str_weak(pressure), + /* K47 */ be_nested_str_weak(Illuminance), + /* K48 */ be_nested_str_weak(_X23Illuminance), + /* K49 */ be_nested_str_weak(illuminance), + /* K50 */ be_nested_str_weak(Humidity), + /* K51 */ be_nested_str_weak(_X23Humidity), + /* K52 */ be_nested_str_weak(humidity), }), be_str_weak(autoconf_device_map), &be_const_str_solidified, - ( &(const binstruction[326]) { /* code */ + ( &(const binstruction[339]) { /* code */ 0xA4060000, // 0000 IMPORT R1 K0 0xA40A0200, // 0001 IMPORT R2 K1 0x600C0013, // 0002 GETGBL R3 G19 @@ -2145,11 +2147,11 @@ be_local_closure(Matter_Device_autoconf_device_map, /* name */ 0x8C281116, // 0044 GETMET R10 R8 K22 0x58300017, // 0045 LDCONST R12 K23 0x7C280400, // 0046 CALL R10 2 - 0x782A0040, // 0047 JMPF R10 #0089 + 0x782A004D, // 0047 JMPF R10 #0096 0x94201117, // 0048 GETIDX R8 R8 K23 0x5828000B, // 0049 LDCONST R10 K11 0x502C0200, // 004A LDBOOL R11 1 0 - 0x782E003C, // 004B JMPF R11 #0089 + 0x782E0049, // 004B JMPF R11 #0096 0x602C0008, // 004C GETGBL R11 G8 0x5C301400, // 004D MOVE R12 R10 0x7C2C0200, // 004E CALL R11 1 @@ -2158,7 +2160,7 @@ be_local_closure(Matter_Device_autoconf_device_map, /* name */ 0x5C381600, // 0051 MOVE R14 R11 0x7C300400, // 0052 CALL R12 2 0x74320000, // 0053 JMPT R12 #0055 - 0x70020033, // 0054 JMP #0089 + 0x70020040, // 0054 JMP #0096 0x9430100B, // 0055 GETIDX R12 R8 R11 0xB8362000, // 0056 GETNGBL R13 K16 0x8C341B13, // 0057 GETMET R13 R13 K19 @@ -2200,206 +2202,219 @@ be_local_closure(Matter_Device_autoconf_device_map, /* name */ 0x7C440800, // 007B CALL R17 4 0x58480015, // 007C LDCONST R18 K21 0x7C3C0600, // 007D CALL R15 3 - 0x603C0008, // 007E GETGBL R15 G8 - 0x5C400800, // 007F MOVE R16 R4 - 0x7C3C0200, // 0080 CALL R15 1 - 0x60400013, // 0081 GETGBL R16 G19 - 0x7C400000, // 0082 CALL R16 0 - 0x9842071F, // 0083 SETIDX R16 K3 K31 - 0x98423E0A, // 0084 SETIDX R16 K31 R10 - 0x980C1E10, // 0085 SETIDX R3 R15 R16 - 0x00100905, // 0086 ADD R4 R4 K5 - 0x00281505, // 0087 ADD R10 R10 K5 - 0x7001FFC0, // 0088 JMP #004A - 0x6028000C, // 0089 GETGBL R10 G12 - 0xB82E2000, // 008A GETNGBL R11 K16 - 0x8C2C1720, // 008B GETMET R11 R11 K32 - 0x7C2C0200, // 008C CALL R11 1 - 0x7C280200, // 008D CALL R10 1 - 0x582C000B, // 008E LDCONST R11 K11 - 0x78160000, // 008F JMPF R5 #0091 - 0x04281505, // 0090 SUB R10 R10 K5 - 0x1430160A, // 0091 LT R12 R11 R10 - 0x78320010, // 0092 JMPF R12 #00A4 - 0x8C301308, // 0093 GETMET R12 R9 K8 - 0x5C381600, // 0094 MOVE R14 R11 - 0x7C300400, // 0095 CALL R12 2 - 0x4C340000, // 0096 LDNIL R13 - 0x1C30180D, // 0097 EQ R12 R12 R13 - 0x78320008, // 0098 JMPF R12 #00A2 - 0x60300008, // 0099 GETGBL R12 G8 - 0x5C340800, // 009A MOVE R13 R4 - 0x7C300200, // 009B CALL R12 1 - 0x60340013, // 009C GETGBL R13 G19 - 0x7C340000, // 009D CALL R13 0 - 0x98360721, // 009E SETIDX R13 K3 K33 - 0x9836420B, // 009F SETIDX R13 K33 R11 - 0x980C180D, // 00A0 SETIDX R3 R12 R13 - 0x00100905, // 00A1 ADD R4 R4 K5 - 0x002C1705, // 00A2 ADD R11 R11 K5 - 0x7001FFEC, // 00A3 JMP #0091 - 0x8C300522, // 00A4 GETMET R12 R2 K34 - 0xB83A2000, // 00A5 GETNGBL R14 K16 - 0x8C381D23, // 00A6 GETMET R14 R14 K35 - 0x7C380200, // 00A7 CALL R14 1 - 0x7C300400, // 00A8 CALL R12 2 - 0x5412001F, // 00A9 LDINT R4 32 - 0x60340010, // 00AA GETGBL R13 G16 - 0x8C380124, // 00AB GETMET R14 R0 K36 - 0x5C401800, // 00AC MOVE R16 R12 - 0x7C380400, // 00AD CALL R14 2 - 0x7C340200, // 00AE CALL R13 1 - 0xA802001C, // 00AF EXBLK 0 #00CD - 0x5C381A00, // 00B0 MOVE R14 R13 - 0x7C380000, // 00B1 CALL R14 0 - 0x943C180E, // 00B2 GETIDX R15 R12 R14 - 0x6040000F, // 00B3 GETGBL R16 G15 - 0x5C441E00, // 00B4 MOVE R17 R15 - 0x60480013, // 00B5 GETGBL R18 G19 - 0x7C400400, // 00B6 CALL R16 2 - 0x7842000D, // 00B7 JMPF R16 #00C6 - 0x8C401F16, // 00B8 GETMET R16 R15 K22 - 0x58480025, // 00B9 LDCONST R18 K37 - 0x7C400400, // 00BA CALL R16 2 - 0x78420009, // 00BB JMPF R16 #00C6 - 0x00401D26, // 00BC ADD R16 R14 K38 - 0x60440008, // 00BD GETGBL R17 G8 - 0x5C480800, // 00BE MOVE R18 R4 - 0x7C440200, // 00BF CALL R17 1 - 0x60480013, // 00C0 GETGBL R18 G19 - 0x7C480000, // 00C1 CALL R18 0 - 0x984A0727, // 00C2 SETIDX R18 K3 K39 - 0x984A5010, // 00C3 SETIDX R18 K40 R16 - 0x980C2212, // 00C4 SETIDX R3 R17 R18 - 0x00100905, // 00C5 ADD R4 R4 K5 - 0x54420027, // 00C6 LDINT R16 40 - 0x24400810, // 00C7 GT R16 R4 R16 - 0x78420000, // 00C8 JMPF R16 #00CA - 0x70020000, // 00C9 JMP #00CB - 0x7001FFE4, // 00CA JMP #00B0 - 0xA8040001, // 00CB EXBLK 1 1 - 0x70020002, // 00CC JMP #00D0 - 0x58340029, // 00CD LDCONST R13 K41 - 0xAC340200, // 00CE CATCH R13 1 0 - 0xB0080000, // 00CF RAISE 2 R0 R0 - 0x54120027, // 00D0 LDINT R4 40 - 0x60340010, // 00D1 GETGBL R13 G16 - 0x8C380124, // 00D2 GETMET R14 R0 K36 - 0x5C401800, // 00D3 MOVE R16 R12 - 0x7C380400, // 00D4 CALL R14 2 - 0x7C340200, // 00D5 CALL R13 1 - 0xA802001C, // 00D6 EXBLK 0 #00F4 - 0x5C381A00, // 00D7 MOVE R14 R13 - 0x7C380000, // 00D8 CALL R14 0 - 0x943C180E, // 00D9 GETIDX R15 R12 R14 - 0x6040000F, // 00DA GETGBL R16 G15 - 0x5C441E00, // 00DB MOVE R17 R15 - 0x60480013, // 00DC GETGBL R18 G19 - 0x7C400400, // 00DD CALL R16 2 - 0x7842000D, // 00DE JMPF R16 #00ED - 0x8C401F16, // 00DF GETMET R16 R15 K22 - 0x5848002A, // 00E0 LDCONST R18 K42 - 0x7C400400, // 00E1 CALL R16 2 - 0x78420009, // 00E2 JMPF R16 #00ED - 0x00401D2B, // 00E3 ADD R16 R14 K43 - 0x60440008, // 00E4 GETGBL R17 G8 - 0x5C480800, // 00E5 MOVE R18 R4 - 0x7C440200, // 00E6 CALL R17 1 - 0x60480013, // 00E7 GETGBL R18 G19 - 0x7C480000, // 00E8 CALL R18 0 - 0x984A072C, // 00E9 SETIDX R18 K3 K44 - 0x984A5010, // 00EA SETIDX R18 K40 R16 - 0x980C2212, // 00EB SETIDX R3 R17 R18 - 0x00100905, // 00EC ADD R4 R4 K5 - 0x5442002E, // 00ED LDINT R16 47 - 0x24400810, // 00EE GT R16 R4 R16 - 0x78420000, // 00EF JMPF R16 #00F1 - 0x70020000, // 00F0 JMP #00F2 - 0x7001FFE4, // 00F1 JMP #00D7 - 0xA8040001, // 00F2 EXBLK 1 1 - 0x70020002, // 00F3 JMP #00F7 - 0x58340029, // 00F4 LDCONST R13 K41 - 0xAC340200, // 00F5 CATCH R13 1 0 - 0xB0080000, // 00F6 RAISE 2 R0 R0 - 0x5412002F, // 00F7 LDINT R4 48 - 0x60340010, // 00F8 GETGBL R13 G16 - 0x8C380124, // 00F9 GETMET R14 R0 K36 - 0x5C401800, // 00FA MOVE R16 R12 - 0x7C380400, // 00FB CALL R14 2 - 0x7C340200, // 00FC CALL R13 1 - 0xA802001C, // 00FD EXBLK 0 #011B - 0x5C381A00, // 00FE MOVE R14 R13 - 0x7C380000, // 00FF CALL R14 0 - 0x943C180E, // 0100 GETIDX R15 R12 R14 - 0x6040000F, // 0101 GETGBL R16 G15 - 0x5C441E00, // 0102 MOVE R17 R15 - 0x60480013, // 0103 GETGBL R18 G19 - 0x7C400400, // 0104 CALL R16 2 - 0x7842000D, // 0105 JMPF R16 #0114 - 0x8C401F16, // 0106 GETMET R16 R15 K22 - 0x5848002D, // 0107 LDCONST R18 K45 - 0x7C400400, // 0108 CALL R16 2 - 0x78420009, // 0109 JMPF R16 #0114 - 0x00401D2E, // 010A ADD R16 R14 K46 - 0x60440008, // 010B GETGBL R17 G8 - 0x5C480800, // 010C MOVE R18 R4 - 0x7C440200, // 010D CALL R17 1 - 0x60480013, // 010E GETGBL R18 G19 - 0x7C480000, // 010F CALL R18 0 - 0x984A072F, // 0110 SETIDX R18 K3 K47 - 0x984A5010, // 0111 SETIDX R18 K40 R16 - 0x980C2212, // 0112 SETIDX R3 R17 R18 - 0x00100905, // 0113 ADD R4 R4 K5 - 0x54420037, // 0114 LDINT R16 56 - 0x24400810, // 0115 GT R16 R4 R16 - 0x78420000, // 0116 JMPF R16 #0118 - 0x70020000, // 0117 JMP #0119 - 0x7001FFE4, // 0118 JMP #00FE - 0xA8040001, // 0119 EXBLK 1 1 - 0x70020002, // 011A JMP #011E - 0x58340029, // 011B LDCONST R13 K41 - 0xAC340200, // 011C CATCH R13 1 0 - 0xB0080000, // 011D RAISE 2 R0 R0 - 0x54120037, // 011E LDINT R4 56 - 0x60340010, // 011F GETGBL R13 G16 - 0x8C380124, // 0120 GETMET R14 R0 K36 - 0x5C401800, // 0121 MOVE R16 R12 - 0x7C380400, // 0122 CALL R14 2 - 0x7C340200, // 0123 CALL R13 1 - 0xA802001C, // 0124 EXBLK 0 #0142 - 0x5C381A00, // 0125 MOVE R14 R13 - 0x7C380000, // 0126 CALL R14 0 - 0x943C180E, // 0127 GETIDX R15 R12 R14 - 0x6040000F, // 0128 GETGBL R16 G15 - 0x5C441E00, // 0129 MOVE R17 R15 - 0x60480013, // 012A GETGBL R18 G19 - 0x7C400400, // 012B CALL R16 2 - 0x7842000D, // 012C JMPF R16 #013B - 0x8C401F16, // 012D GETMET R16 R15 K22 - 0x58480030, // 012E LDCONST R18 K48 - 0x7C400400, // 012F CALL R16 2 - 0x78420009, // 0130 JMPF R16 #013B - 0x00401D31, // 0131 ADD R16 R14 K49 - 0x60440008, // 0132 GETGBL R17 G8 - 0x5C480800, // 0133 MOVE R18 R4 - 0x7C440200, // 0134 CALL R17 1 - 0x60480013, // 0135 GETGBL R18 G19 - 0x7C480000, // 0136 CALL R18 0 - 0x984A0732, // 0137 SETIDX R18 K3 K50 - 0x984A5010, // 0138 SETIDX R18 K40 R16 - 0x980C2212, // 0139 SETIDX R3 R17 R18 - 0x00100905, // 013A ADD R4 R4 K5 - 0x5442003F, // 013B LDINT R16 64 - 0x24400810, // 013C GT R16 R4 R16 - 0x78420000, // 013D JMPF R16 #013F - 0x70020000, // 013E JMP #0140 - 0x7001FFE4, // 013F JMP #0125 - 0xA8040001, // 0140 EXBLK 1 1 - 0x70020002, // 0141 JMP #0145 - 0x58340029, // 0142 LDCONST R13 K41 - 0xAC340200, // 0143 CATCH R13 1 0 - 0xB0080000, // 0144 RAISE 2 R0 R0 - 0x80040600, // 0145 RET 1 R3 + 0x8C3C1908, // 007E GETMET R15 R12 K8 + 0x5844001F, // 007F LDCONST R17 K31 + 0x7C3C0400, // 0080 CALL R15 2 + 0x783E0002, // 0081 JMPF R15 #0085 + 0x94401F0D, // 0082 GETIDX R16 R15 K13 + 0x2440210B, // 0083 GT R16 R16 K11 + 0x74420000, // 0084 JMPT R16 #0086 + 0x50400001, // 0085 LDBOOL R16 0 1 + 0x50400200, // 0086 LDBOOL R16 1 0 + 0x60440008, // 0087 GETGBL R17 G8 + 0x5C480800, // 0088 MOVE R18 R4 + 0x7C440200, // 0089 CALL R17 1 + 0x60480013, // 008A GETGBL R18 G19 + 0x7C480000, // 008B CALL R18 0 + 0x78420001, // 008C JMPF R16 #008F + 0x584C0020, // 008D LDCONST R19 K32 + 0x70020000, // 008E JMP #0090 + 0x584C0021, // 008F LDCONST R19 K33 + 0x984A0613, // 0090 SETIDX R18 K3 R19 + 0x984A420A, // 0091 SETIDX R18 K33 R10 + 0x980C2212, // 0092 SETIDX R3 R17 R18 + 0x00100905, // 0093 ADD R4 R4 K5 + 0x00281505, // 0094 ADD R10 R10 K5 + 0x7001FFB3, // 0095 JMP #004A + 0x6028000C, // 0096 GETGBL R10 G12 + 0xB82E2000, // 0097 GETNGBL R11 K16 + 0x8C2C1722, // 0098 GETMET R11 R11 K34 + 0x7C2C0200, // 0099 CALL R11 1 + 0x7C280200, // 009A CALL R10 1 + 0x582C000B, // 009B LDCONST R11 K11 + 0x78160000, // 009C JMPF R5 #009E + 0x04281505, // 009D SUB R10 R10 K5 + 0x1430160A, // 009E LT R12 R11 R10 + 0x78320010, // 009F JMPF R12 #00B1 + 0x8C301308, // 00A0 GETMET R12 R9 K8 + 0x5C381600, // 00A1 MOVE R14 R11 + 0x7C300400, // 00A2 CALL R12 2 + 0x4C340000, // 00A3 LDNIL R13 + 0x1C30180D, // 00A4 EQ R12 R12 R13 + 0x78320008, // 00A5 JMPF R12 #00AF + 0x60300008, // 00A6 GETGBL R12 G8 + 0x5C340800, // 00A7 MOVE R13 R4 + 0x7C300200, // 00A8 CALL R12 1 + 0x60340013, // 00A9 GETGBL R13 G19 + 0x7C340000, // 00AA CALL R13 0 + 0x98360723, // 00AB SETIDX R13 K3 K35 + 0x9836460B, // 00AC SETIDX R13 K35 R11 + 0x980C180D, // 00AD SETIDX R3 R12 R13 + 0x00100905, // 00AE ADD R4 R4 K5 + 0x002C1705, // 00AF ADD R11 R11 K5 + 0x7001FFEC, // 00B0 JMP #009E + 0x8C300524, // 00B1 GETMET R12 R2 K36 + 0xB83A2000, // 00B2 GETNGBL R14 K16 + 0x8C381D25, // 00B3 GETMET R14 R14 K37 + 0x7C380200, // 00B4 CALL R14 1 + 0x7C300400, // 00B5 CALL R12 2 + 0x5412001F, // 00B6 LDINT R4 32 + 0x60340010, // 00B7 GETGBL R13 G16 + 0x8C380126, // 00B8 GETMET R14 R0 K38 + 0x5C401800, // 00B9 MOVE R16 R12 + 0x7C380400, // 00BA CALL R14 2 + 0x7C340200, // 00BB CALL R13 1 + 0xA802001C, // 00BC EXBLK 0 #00DA + 0x5C381A00, // 00BD MOVE R14 R13 + 0x7C380000, // 00BE CALL R14 0 + 0x943C180E, // 00BF GETIDX R15 R12 R14 + 0x6040000F, // 00C0 GETGBL R16 G15 + 0x5C441E00, // 00C1 MOVE R17 R15 + 0x60480013, // 00C2 GETGBL R18 G19 + 0x7C400400, // 00C3 CALL R16 2 + 0x7842000D, // 00C4 JMPF R16 #00D3 + 0x8C401F16, // 00C5 GETMET R16 R15 K22 + 0x58480027, // 00C6 LDCONST R18 K39 + 0x7C400400, // 00C7 CALL R16 2 + 0x78420009, // 00C8 JMPF R16 #00D3 + 0x00401D28, // 00C9 ADD R16 R14 K40 + 0x60440008, // 00CA GETGBL R17 G8 + 0x5C480800, // 00CB MOVE R18 R4 + 0x7C440200, // 00CC CALL R17 1 + 0x60480013, // 00CD GETGBL R18 G19 + 0x7C480000, // 00CE CALL R18 0 + 0x984A0729, // 00CF SETIDX R18 K3 K41 + 0x984A5410, // 00D0 SETIDX R18 K42 R16 + 0x980C2212, // 00D1 SETIDX R3 R17 R18 + 0x00100905, // 00D2 ADD R4 R4 K5 + 0x54420027, // 00D3 LDINT R16 40 + 0x24400810, // 00D4 GT R16 R4 R16 + 0x78420000, // 00D5 JMPF R16 #00D7 + 0x70020000, // 00D6 JMP #00D8 + 0x7001FFE4, // 00D7 JMP #00BD + 0xA8040001, // 00D8 EXBLK 1 1 + 0x70020002, // 00D9 JMP #00DD + 0x5834002B, // 00DA LDCONST R13 K43 + 0xAC340200, // 00DB CATCH R13 1 0 + 0xB0080000, // 00DC RAISE 2 R0 R0 + 0x54120027, // 00DD LDINT R4 40 + 0x60340010, // 00DE GETGBL R13 G16 + 0x8C380126, // 00DF GETMET R14 R0 K38 + 0x5C401800, // 00E0 MOVE R16 R12 + 0x7C380400, // 00E1 CALL R14 2 + 0x7C340200, // 00E2 CALL R13 1 + 0xA802001C, // 00E3 EXBLK 0 #0101 + 0x5C381A00, // 00E4 MOVE R14 R13 + 0x7C380000, // 00E5 CALL R14 0 + 0x943C180E, // 00E6 GETIDX R15 R12 R14 + 0x6040000F, // 00E7 GETGBL R16 G15 + 0x5C441E00, // 00E8 MOVE R17 R15 + 0x60480013, // 00E9 GETGBL R18 G19 + 0x7C400400, // 00EA CALL R16 2 + 0x7842000D, // 00EB JMPF R16 #00FA + 0x8C401F16, // 00EC GETMET R16 R15 K22 + 0x5848002C, // 00ED LDCONST R18 K44 + 0x7C400400, // 00EE CALL R16 2 + 0x78420009, // 00EF JMPF R16 #00FA + 0x00401D2D, // 00F0 ADD R16 R14 K45 + 0x60440008, // 00F1 GETGBL R17 G8 + 0x5C480800, // 00F2 MOVE R18 R4 + 0x7C440200, // 00F3 CALL R17 1 + 0x60480013, // 00F4 GETGBL R18 G19 + 0x7C480000, // 00F5 CALL R18 0 + 0x984A072E, // 00F6 SETIDX R18 K3 K46 + 0x984A5410, // 00F7 SETIDX R18 K42 R16 + 0x980C2212, // 00F8 SETIDX R3 R17 R18 + 0x00100905, // 00F9 ADD R4 R4 K5 + 0x5442002E, // 00FA LDINT R16 47 + 0x24400810, // 00FB GT R16 R4 R16 + 0x78420000, // 00FC JMPF R16 #00FE + 0x70020000, // 00FD JMP #00FF + 0x7001FFE4, // 00FE JMP #00E4 + 0xA8040001, // 00FF EXBLK 1 1 + 0x70020002, // 0100 JMP #0104 + 0x5834002B, // 0101 LDCONST R13 K43 + 0xAC340200, // 0102 CATCH R13 1 0 + 0xB0080000, // 0103 RAISE 2 R0 R0 + 0x5412002F, // 0104 LDINT R4 48 + 0x60340010, // 0105 GETGBL R13 G16 + 0x8C380126, // 0106 GETMET R14 R0 K38 + 0x5C401800, // 0107 MOVE R16 R12 + 0x7C380400, // 0108 CALL R14 2 + 0x7C340200, // 0109 CALL R13 1 + 0xA802001C, // 010A EXBLK 0 #0128 + 0x5C381A00, // 010B MOVE R14 R13 + 0x7C380000, // 010C CALL R14 0 + 0x943C180E, // 010D GETIDX R15 R12 R14 + 0x6040000F, // 010E GETGBL R16 G15 + 0x5C441E00, // 010F MOVE R17 R15 + 0x60480013, // 0110 GETGBL R18 G19 + 0x7C400400, // 0111 CALL R16 2 + 0x7842000D, // 0112 JMPF R16 #0121 + 0x8C401F16, // 0113 GETMET R16 R15 K22 + 0x5848002F, // 0114 LDCONST R18 K47 + 0x7C400400, // 0115 CALL R16 2 + 0x78420009, // 0116 JMPF R16 #0121 + 0x00401D30, // 0117 ADD R16 R14 K48 + 0x60440008, // 0118 GETGBL R17 G8 + 0x5C480800, // 0119 MOVE R18 R4 + 0x7C440200, // 011A CALL R17 1 + 0x60480013, // 011B GETGBL R18 G19 + 0x7C480000, // 011C CALL R18 0 + 0x984A0731, // 011D SETIDX R18 K3 K49 + 0x984A5410, // 011E SETIDX R18 K42 R16 + 0x980C2212, // 011F SETIDX R3 R17 R18 + 0x00100905, // 0120 ADD R4 R4 K5 + 0x54420037, // 0121 LDINT R16 56 + 0x24400810, // 0122 GT R16 R4 R16 + 0x78420000, // 0123 JMPF R16 #0125 + 0x70020000, // 0124 JMP #0126 + 0x7001FFE4, // 0125 JMP #010B + 0xA8040001, // 0126 EXBLK 1 1 + 0x70020002, // 0127 JMP #012B + 0x5834002B, // 0128 LDCONST R13 K43 + 0xAC340200, // 0129 CATCH R13 1 0 + 0xB0080000, // 012A RAISE 2 R0 R0 + 0x54120037, // 012B LDINT R4 56 + 0x60340010, // 012C GETGBL R13 G16 + 0x8C380126, // 012D GETMET R14 R0 K38 + 0x5C401800, // 012E MOVE R16 R12 + 0x7C380400, // 012F CALL R14 2 + 0x7C340200, // 0130 CALL R13 1 + 0xA802001C, // 0131 EXBLK 0 #014F + 0x5C381A00, // 0132 MOVE R14 R13 + 0x7C380000, // 0133 CALL R14 0 + 0x943C180E, // 0134 GETIDX R15 R12 R14 + 0x6040000F, // 0135 GETGBL R16 G15 + 0x5C441E00, // 0136 MOVE R17 R15 + 0x60480013, // 0137 GETGBL R18 G19 + 0x7C400400, // 0138 CALL R16 2 + 0x7842000D, // 0139 JMPF R16 #0148 + 0x8C401F16, // 013A GETMET R16 R15 K22 + 0x58480032, // 013B LDCONST R18 K50 + 0x7C400400, // 013C CALL R16 2 + 0x78420009, // 013D JMPF R16 #0148 + 0x00401D33, // 013E ADD R16 R14 K51 + 0x60440008, // 013F GETGBL R17 G8 + 0x5C480800, // 0140 MOVE R18 R4 + 0x7C440200, // 0141 CALL R17 1 + 0x60480013, // 0142 GETGBL R18 G19 + 0x7C480000, // 0143 CALL R18 0 + 0x984A0734, // 0144 SETIDX R18 K3 K52 + 0x984A5410, // 0145 SETIDX R18 K42 R16 + 0x980C2212, // 0146 SETIDX R3 R17 R18 + 0x00100905, // 0147 ADD R4 R4 K5 + 0x5442003F, // 0148 LDINT R16 64 + 0x24400810, // 0149 GT R16 R4 R16 + 0x78420000, // 014A JMPF R16 #014C + 0x70020000, // 014B JMP #014D + 0x7001FFE4, // 014C JMP #0132 + 0xA8040001, // 014D EXBLK 1 1 + 0x70020002, // 014E JMP #0152 + 0x5834002B, // 014F LDCONST R13 K43 + 0xAC340200, // 0150 CATCH R13 1 0 + 0xB0080000, // 0151 RAISE 2 R0 R0 + 0x80040600, // 0152 RET 1 R3 }) ) ); diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Shutter.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Shutter.h index bdf05f9db..54edf5622 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Shutter.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Shutter.h @@ -46,7 +46,7 @@ be_local_closure(Matter_Plugin_Shutter_read_attribute, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[19]) { /* constants */ + ( &(const bvalue[17]) { /* constants */ /* K0 */ be_nested_str_weak(string), /* K1 */ be_nested_str_weak(matter), /* K2 */ be_nested_str_weak(TLV), @@ -59,17 +59,15 @@ be_local_closure(Matter_Plugin_Shutter_read_attribute, /* name */ /* K9 */ be_nested_str_weak(U2), /* K10 */ be_const_int(1), /* K11 */ be_nested_str_weak(shadow_shutter_pos), - /* K12 */ be_nested_str_weak(shadow_shutter_tilt), - /* K13 */ be_nested_str_weak(shadow_shutter_direction), - /* K14 */ be_const_int(2), - /* K15 */ be_nested_str_weak(shadow_shutter_target), - /* K16 */ be_nested_str_weak(U4), - /* K17 */ be_const_int(3), - /* K18 */ be_nested_str_weak(read_attribute), + /* K12 */ be_nested_str_weak(shadow_shutter_direction), + /* K13 */ be_const_int(2), + /* K14 */ be_nested_str_weak(shadow_shutter_target), + /* K15 */ be_nested_str_weak(U4), + /* K16 */ be_nested_str_weak(read_attribute), }), be_str_weak(read_attribute), &be_const_str_solidified, - ( &(const binstruction[186]) { /* code */ + ( &(const binstruction[129]) { /* code */ 0xA40E0000, // 0000 IMPORT R3 K0 0xB8120200, // 0001 GETNGBL R4 K1 0x88100902, // 0002 GETMBR R4 R4 K2 @@ -77,7 +75,7 @@ be_local_closure(Matter_Plugin_Shutter_read_attribute, /* name */ 0x88180504, // 0004 GETMBR R6 R2 K4 0x541E0101, // 0005 LDINT R7 258 0x1C1C0A07, // 0006 EQ R7 R5 R7 - 0x781E00A8, // 0007 JMPF R7 #00B1 + 0x781E006F, // 0007 JMPF R7 #0078 0x8C1C0105, // 0008 GETMET R7 R0 K5 0x7C1C0200, // 0009 CALL R7 1 0x1C1C0D06, // 000A EQ R7 R6 K6 @@ -87,7 +85,7 @@ be_local_closure(Matter_Plugin_Shutter_read_attribute, /* name */ 0x542A00FE, // 000E LDINT R10 255 0x7C1C0600, // 000F CALL R7 3 0x80040E00, // 0010 RET 1 R7 - 0x7002009D, // 0011 JMP #00B0 + 0x70020064, // 0011 JMP #0077 0x541E0004, // 0012 LDINT R7 5 0x1C1C0C07, // 0013 EQ R7 R6 R7 0x781E0005, // 0014 JMPF R7 #001B @@ -96,166 +94,109 @@ be_local_closure(Matter_Plugin_Shutter_read_attribute, /* name */ 0x58280006, // 0017 LDCONST R10 K6 0x7C1C0600, // 0018 CALL R7 3 0x80040E00, // 0019 RET 1 R7 - 0x70020094, // 001A JMP #00B0 - 0x541E0005, // 001B LDINT R7 6 + 0x7002005B, // 001A JMP #0077 + 0x541E0006, // 001B LDINT R7 7 0x1C1C0C07, // 001C EQ R7 R6 R7 - 0x781E0005, // 001D JMPF R7 #0024 + 0x781E0006, // 001D JMPF R7 #0025 0x8C1C0907, // 001E GETMET R7 R4 K7 - 0x88240909, // 001F GETMBR R9 R4 K9 - 0x58280006, // 0020 LDCONST R10 K6 - 0x7C1C0600, // 0021 CALL R7 3 - 0x80040E00, // 0022 RET 1 R7 - 0x7002008B, // 0023 JMP #00B0 - 0x541E0006, // 0024 LDINT R7 7 - 0x1C1C0C07, // 0025 EQ R7 R6 R7 - 0x781E0008, // 0026 JMPF R7 #0030 - 0x8C1C0907, // 0027 GETMET R7 R4 K7 - 0x88240908, // 0028 GETMBR R9 R4 K8 - 0x542A0007, // 0029 LDINT R10 8 - 0x002A140A, // 002A ADD R10 K10 R10 - 0x542E000F, // 002B LDINT R11 16 - 0x0028140B, // 002C ADD R10 R10 R11 - 0x7C1C0600, // 002D CALL R7 3 - 0x80040E00, // 002E RET 1 R7 - 0x7002007F, // 002F JMP #00B0 - 0x541E000C, // 0030 LDINT R7 13 - 0x1C1C0C07, // 0031 EQ R7 R6 R7 - 0x781E0005, // 0032 JMPF R7 #0039 - 0x8C1C0907, // 0033 GETMET R7 R4 K7 - 0x88240908, // 0034 GETMBR R9 R4 K8 - 0x542A00FE, // 0035 LDINT R10 255 - 0x7C1C0600, // 0036 CALL R7 3 - 0x80040E00, // 0037 RET 1 R7 - 0x70020076, // 0038 JMP #00B0 - 0x541E0007, // 0039 LDINT R7 8 - 0x1C1C0C07, // 003A EQ R7 R6 R7 - 0x781E0007, // 003B JMPF R7 #0044 - 0x8C1C0907, // 003C GETMET R7 R4 K7 - 0x88240909, // 003D GETMBR R9 R4 K9 - 0x542A0063, // 003E LDINT R10 100 - 0x882C010B, // 003F GETMBR R11 R0 K11 - 0x0428140B, // 0040 SUB R10 R10 R11 - 0x7C1C0600, // 0041 CALL R7 3 - 0x80040E00, // 0042 RET 1 R7 - 0x7002006B, // 0043 JMP #00B0 - 0x541E000D, // 0044 LDINT R7 14 - 0x1C1C0C07, // 0045 EQ R7 R6 R7 - 0x781E0009, // 0046 JMPF R7 #0051 - 0x8C1C0907, // 0047 GETMET R7 R4 K7 - 0x88240909, // 0048 GETMBR R9 R4 K9 - 0x542A0063, // 0049 LDINT R10 100 - 0x882C010B, // 004A GETMBR R11 R0 K11 - 0x0428140B, // 004B SUB R10 R10 R11 - 0x542E0063, // 004C LDINT R11 100 - 0x0828140B, // 004D MUL R10 R10 R11 - 0x7C1C0600, // 004E CALL R7 3 - 0x80040E00, // 004F RET 1 R7 - 0x7002005E, // 0050 JMP #00B0 - 0x541E0008, // 0051 LDINT R7 9 - 0x1C1C0C07, // 0052 EQ R7 R6 R7 - 0x781E0007, // 0053 JMPF R7 #005C - 0x8C1C0907, // 0054 GETMET R7 R4 K7 - 0x88240909, // 0055 GETMBR R9 R4 K9 - 0x542A0063, // 0056 LDINT R10 100 - 0x882C010C, // 0057 GETMBR R11 R0 K12 - 0x0428140B, // 0058 SUB R10 R10 R11 + 0x88240908, // 001F GETMBR R9 R4 K8 + 0x542A0007, // 0020 LDINT R10 8 + 0x002A140A, // 0021 ADD R10 K10 R10 + 0x7C1C0600, // 0022 CALL R7 3 + 0x80040E00, // 0023 RET 1 R7 + 0x70020051, // 0024 JMP #0077 + 0x541E000C, // 0025 LDINT R7 13 + 0x1C1C0C07, // 0026 EQ R7 R6 R7 + 0x781E0005, // 0027 JMPF R7 #002E + 0x8C1C0907, // 0028 GETMET R7 R4 K7 + 0x88240908, // 0029 GETMBR R9 R4 K8 + 0x542A00FE, // 002A LDINT R10 255 + 0x7C1C0600, // 002B CALL R7 3 + 0x80040E00, // 002C RET 1 R7 + 0x70020048, // 002D JMP #0077 + 0x541E000D, // 002E LDINT R7 14 + 0x1C1C0C07, // 002F EQ R7 R6 R7 + 0x781E0009, // 0030 JMPF R7 #003B + 0x8C1C0907, // 0031 GETMET R7 R4 K7 + 0x88240909, // 0032 GETMBR R9 R4 K9 + 0x542A0063, // 0033 LDINT R10 100 + 0x882C010B, // 0034 GETMBR R11 R0 K11 + 0x0428140B, // 0035 SUB R10 R10 R11 + 0x542E0063, // 0036 LDINT R11 100 + 0x0828140B, // 0037 MUL R10 R10 R11 + 0x7C1C0600, // 0038 CALL R7 3 + 0x80040E00, // 0039 RET 1 R7 + 0x7002003B, // 003A JMP #0077 + 0x541E0009, // 003B LDINT R7 10 + 0x1C1C0C07, // 003C EQ R7 R6 R7 + 0x781E0010, // 003D JMPF R7 #004F + 0x881C010C, // 003E GETMBR R7 R0 K12 + 0x1C1C0F06, // 003F EQ R7 R7 K6 + 0x781E0001, // 0040 JMPF R7 #0043 + 0x581C0006, // 0041 LDCONST R7 K6 + 0x70020005, // 0042 JMP #0049 + 0x881C010C, // 0043 GETMBR R7 R0 K12 + 0x241C0F06, // 0044 GT R7 R7 K6 + 0x781E0001, // 0045 JMPF R7 #0048 + 0x581C000A, // 0046 LDCONST R7 K10 + 0x70020000, // 0047 JMP #0049 + 0x581C000D, // 0048 LDCONST R7 K13 + 0x8C200907, // 0049 GETMET R8 R4 K7 + 0x88280908, // 004A GETMBR R10 R4 K8 + 0x5C2C0E00, // 004B MOVE R11 R7 + 0x7C200600, // 004C CALL R8 3 + 0x80041000, // 004D RET 1 R8 + 0x70020027, // 004E JMP #0077 + 0x541E000A, // 004F LDINT R7 11 + 0x1C1C0C07, // 0050 EQ R7 R6 R7 + 0x781E0009, // 0051 JMPF R7 #005C + 0x8C1C0907, // 0052 GETMET R7 R4 K7 + 0x88240909, // 0053 GETMBR R9 R4 K9 + 0x542A0063, // 0054 LDINT R10 100 + 0x882C010E, // 0055 GETMBR R11 R0 K14 + 0x0428140B, // 0056 SUB R10 R10 R11 + 0x542E0063, // 0057 LDINT R11 100 + 0x0828140B, // 0058 MUL R10 R10 R11 0x7C1C0600, // 0059 CALL R7 3 0x80040E00, // 005A RET 1 R7 - 0x70020053, // 005B JMP #00B0 - 0x541E000E, // 005C LDINT R7 15 + 0x7002001A, // 005B JMP #0077 + 0x541E0016, // 005C LDINT R7 23 0x1C1C0C07, // 005D EQ R7 R6 R7 - 0x781E0009, // 005E JMPF R7 #0069 + 0x781E0005, // 005E JMPF R7 #0065 0x8C1C0907, // 005F GETMET R7 R4 K7 - 0x88240909, // 0060 GETMBR R9 R4 K9 - 0x542A0063, // 0061 LDINT R10 100 - 0x882C010C, // 0062 GETMBR R11 R0 K12 - 0x0428140B, // 0063 SUB R10 R10 R11 - 0x542E0063, // 0064 LDINT R11 100 - 0x0828140B, // 0065 MUL R10 R10 R11 - 0x7C1C0600, // 0066 CALL R7 3 - 0x80040E00, // 0067 RET 1 R7 - 0x70020046, // 0068 JMP #00B0 - 0x541E0009, // 0069 LDINT R7 10 - 0x1C1C0C07, // 006A EQ R7 R6 R7 - 0x781E0010, // 006B JMPF R7 #007D - 0x881C010D, // 006C GETMBR R7 R0 K13 - 0x1C1C0F06, // 006D EQ R7 R7 K6 - 0x781E0001, // 006E JMPF R7 #0071 - 0x581C0006, // 006F LDCONST R7 K6 - 0x70020005, // 0070 JMP #0077 - 0x881C010D, // 0071 GETMBR R7 R0 K13 - 0x241C0F06, // 0072 GT R7 R7 K6 - 0x781E0001, // 0073 JMPF R7 #0076 - 0x581C000A, // 0074 LDCONST R7 K10 - 0x70020000, // 0075 JMP #0077 - 0x581C000E, // 0076 LDCONST R7 K14 - 0x8C200907, // 0077 GETMET R8 R4 K7 - 0x88280908, // 0078 GETMBR R10 R4 K8 - 0x5C2C0E00, // 0079 MOVE R11 R7 - 0x7C200600, // 007A CALL R8 3 - 0x80041000, // 007B RET 1 R8 - 0x70020032, // 007C JMP #00B0 - 0x541E000A, // 007D LDINT R7 11 - 0x1C1C0C07, // 007E EQ R7 R6 R7 - 0x781E0009, // 007F JMPF R7 #008A - 0x8C1C0907, // 0080 GETMET R7 R4 K7 - 0x88240909, // 0081 GETMBR R9 R4 K9 - 0x542A0063, // 0082 LDINT R10 100 - 0x882C010F, // 0083 GETMBR R11 R0 K15 - 0x0428140B, // 0084 SUB R10 R10 R11 - 0x542E0063, // 0085 LDINT R11 100 - 0x0828140B, // 0086 MUL R10 R10 R11 - 0x7C1C0600, // 0087 CALL R7 3 - 0x80040E00, // 0088 RET 1 R7 - 0x70020025, // 0089 JMP #00B0 - 0x541E000B, // 008A LDINT R7 12 - 0x1C1C0C07, // 008B EQ R7 R6 R7 - 0x781E0005, // 008C JMPF R7 #0093 - 0x8C1C0907, // 008D GETMET R7 R4 K7 - 0x88240908, // 008E GETMBR R9 R4 K8 - 0x58280006, // 008F LDCONST R10 K6 - 0x7C1C0600, // 0090 CALL R7 3 - 0x80040E00, // 0091 RET 1 R7 - 0x7002001C, // 0092 JMP #00B0 - 0x541E0016, // 0093 LDINT R7 23 - 0x1C1C0C07, // 0094 EQ R7 R6 R7 - 0x781E0005, // 0095 JMPF R7 #009C - 0x8C1C0907, // 0096 GETMET R7 R4 K7 - 0x88240908, // 0097 GETMBR R9 R4 K8 - 0x58280006, // 0098 LDCONST R10 K6 - 0x7C1C0600, // 0099 CALL R7 3 - 0x80040E00, // 009A RET 1 R7 - 0x70020013, // 009B JMP #00B0 - 0x541EFFFB, // 009C LDINT R7 65532 - 0x1C1C0C07, // 009D EQ R7 R6 R7 - 0x781E0008, // 009E JMPF R7 #00A8 - 0x8C1C0907, // 009F GETMET R7 R4 K7 - 0x88240910, // 00A0 GETMBR R9 R4 K16 - 0x542A0003, // 00A1 LDINT R10 4 - 0x002A220A, // 00A2 ADD R10 K17 R10 - 0x542E000F, // 00A3 LDINT R11 16 - 0x0028140B, // 00A4 ADD R10 R10 R11 - 0x7C1C0600, // 00A5 CALL R7 3 - 0x80040E00, // 00A6 RET 1 R7 - 0x70020007, // 00A7 JMP #00B0 - 0x541EFFFC, // 00A8 LDINT R7 65533 - 0x1C1C0C07, // 00A9 EQ R7 R6 R7 - 0x781E0004, // 00AA JMPF R7 #00B0 - 0x8C1C0907, // 00AB GETMET R7 R4 K7 - 0x88240910, // 00AC GETMBR R9 R4 K16 - 0x542A0004, // 00AD LDINT R10 5 - 0x7C1C0600, // 00AE CALL R7 3 - 0x80040E00, // 00AF RET 1 R7 - 0x70020007, // 00B0 JMP #00B9 - 0x601C0003, // 00B1 GETGBL R7 G3 - 0x5C200000, // 00B2 MOVE R8 R0 - 0x7C1C0200, // 00B3 CALL R7 1 - 0x8C1C0F12, // 00B4 GETMET R7 R7 K18 - 0x5C240200, // 00B5 MOVE R9 R1 - 0x5C280400, // 00B6 MOVE R10 R2 - 0x7C1C0600, // 00B7 CALL R7 3 - 0x80040E00, // 00B8 RET 1 R7 - 0x80000000, // 00B9 RET 0 + 0x88240908, // 0060 GETMBR R9 R4 K8 + 0x58280006, // 0061 LDCONST R10 K6 + 0x7C1C0600, // 0062 CALL R7 3 + 0x80040E00, // 0063 RET 1 R7 + 0x70020011, // 0064 JMP #0077 + 0x541EFFFB, // 0065 LDINT R7 65532 + 0x1C1C0C07, // 0066 EQ R7 R6 R7 + 0x781E0006, // 0067 JMPF R7 #006F + 0x8C1C0907, // 0068 GETMET R7 R4 K7 + 0x8824090F, // 0069 GETMBR R9 R4 K15 + 0x542A0003, // 006A LDINT R10 4 + 0x002A140A, // 006B ADD R10 K10 R10 + 0x7C1C0600, // 006C CALL R7 3 + 0x80040E00, // 006D RET 1 R7 + 0x70020007, // 006E JMP #0077 + 0x541EFFFC, // 006F LDINT R7 65533 + 0x1C1C0C07, // 0070 EQ R7 R6 R7 + 0x781E0004, // 0071 JMPF R7 #0077 + 0x8C1C0907, // 0072 GETMET R7 R4 K7 + 0x8824090F, // 0073 GETMBR R9 R4 K15 + 0x542A0004, // 0074 LDINT R10 5 + 0x7C1C0600, // 0075 CALL R7 3 + 0x80040E00, // 0076 RET 1 R7 + 0x70020007, // 0077 JMP #0080 + 0x601C0003, // 0078 GETGBL R7 G3 + 0x5C200000, // 0079 MOVE R8 R0 + 0x7C1C0200, // 007A CALL R7 1 + 0x8C1C0F10, // 007B GETMET R7 R7 K16 + 0x5C240200, // 007C MOVE R9 R1 + 0x5C280400, // 007D MOVE R10 R2 + 0x7C1C0600, // 007E CALL R7 3 + 0x80040E00, // 007F RET 1 R7 + 0x80000000, // 0080 RET 0 }) ) ); @@ -372,7 +313,7 @@ be_local_closure(Matter_Plugin_Shutter_invoke_request, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[24]) { /* constants */ + ( &(const bvalue[23]) { /* constants */ /* K0 */ be_nested_str_weak(light), /* K1 */ be_nested_str_weak(matter), /* K2 */ be_nested_str_weak(TLV), @@ -395,12 +336,11 @@ be_local_closure(Matter_Plugin_Shutter_invoke_request, /* name */ /* K19 */ be_nested_str_weak(ShutterStopPosition), /* K20 */ be_nested_str_weak(_X20), /* K21 */ be_nested_str_weak(pos_X25_X3A), - /* K22 */ be_nested_str_weak(tilt_X25_X3A), - /* K23 */ be_nested_str_weak(invoke_request), + /* K22 */ be_nested_str_weak(invoke_request), }), be_str_weak(invoke_request), &be_const_str_solidified, - ( &(const binstruction[131]) { /* code */ + ( &(const binstruction[112]) { /* code */ 0xA4120000, // 0000 IMPORT R4 K0 0xB8160200, // 0001 GETNGBL R5 K1 0x88140B02, // 0002 GETMBR R5 R5 K2 @@ -408,7 +348,7 @@ be_local_closure(Matter_Plugin_Shutter_invoke_request, /* name */ 0x881C0704, // 0004 GETMBR R7 R3 K4 0x54220101, // 0005 LDINT R8 258 0x1C200C08, // 0006 EQ R8 R6 R8 - 0x78220070, // 0007 JMPF R8 #0079 + 0x7822005D, // 0007 JMPF R8 #0066 0x8C200105, // 0008 GETMET R8 R0 K5 0x7C200200, // 0009 CALL R8 1 0x1C200F06, // 000A EQ R8 R7 K6 @@ -426,7 +366,7 @@ be_local_closure(Matter_Plugin_Shutter_invoke_request, /* name */ 0x7C200200, // 0016 CALL R8 1 0x50200200, // 0017 LDBOOL R8 1 0 0x80041000, // 0018 RET 1 R8 - 0x7002005D, // 0019 JMP #0078 + 0x7002004A, // 0019 JMP #0065 0x1C200F0B, // 001A EQ R8 R7 K11 0x7822000D, // 001B JMPF R8 #002A 0xB8220E00, // 001C GETNGBL R8 K7 @@ -442,7 +382,7 @@ be_local_closure(Matter_Plugin_Shutter_invoke_request, /* name */ 0x7C200200, // 0026 CALL R8 1 0x50200200, // 0027 LDBOOL R8 1 0 0x80041000, // 0028 RET 1 R8 - 0x7002004D, // 0029 JMP #0078 + 0x7002003A, // 0029 JMP #0065 0x1C200F0E, // 002A EQ R8 R7 K14 0x7822000D, // 002B JMPF R8 #003A 0xB8220E00, // 002C GETNGBL R8 K7 @@ -458,10 +398,10 @@ be_local_closure(Matter_Plugin_Shutter_invoke_request, /* name */ 0x7C200200, // 0036 CALL R8 1 0x50200200, // 0037 LDBOOL R8 1 0 0x80041000, // 0038 RET 1 R8 - 0x7002003D, // 0039 JMP #0078 + 0x7002002A, // 0039 JMP #0065 0x54220004, // 003A LDINT R8 5 0x1C200E08, // 003B EQ R8 R7 R8 - 0x78220028, // 003C JMPF R8 #0066 + 0x78220027, // 003C JMPF R8 #0065 0xB8220E00, // 003D GETNGBL R8 K7 0x8C201110, // 003E GETMET R8 R8 K16 0x60280008, // 003F GETGBL R10 G8 @@ -502,36 +442,17 @@ be_local_closure(Matter_Plugin_Shutter_invoke_request, /* name */ 0x7C240200, // 0062 CALL R9 1 0x50240200, // 0063 LDBOOL R9 1 0 0x80041200, // 0064 RET 1 R9 - 0x70020011, // 0065 JMP #0078 - 0x54220007, // 0066 LDINT R8 8 - 0x1C200E08, // 0067 EQ R8 R7 R8 - 0x7822000E, // 0068 JMPF R8 #0078 - 0x8C200512, // 0069 GETMET R8 R2 K18 - 0x58280006, // 006A LDCONST R10 K6 - 0x7C200400, // 006B CALL R8 2 - 0x4C240000, // 006C LDNIL R9 - 0x20241009, // 006D NE R9 R8 R9 - 0x78260006, // 006E JMPF R9 #0076 - 0x54260009, // 006F LDINT R9 10 - 0x0C201009, // 0070 DIV R8 R8 R9 - 0x60240008, // 0071 GETGBL R9 G8 - 0x5C281000, // 0072 MOVE R10 R8 - 0x7C240200, // 0073 CALL R9 1 - 0x00262C09, // 0074 ADD R9 K22 R9 - 0x900E2009, // 0075 SETMBR R3 K16 R9 - 0x50240200, // 0076 LDBOOL R9 1 0 - 0x80041200, // 0077 RET 1 R9 - 0x70020008, // 0078 JMP #0082 - 0x60200003, // 0079 GETGBL R8 G3 - 0x5C240000, // 007A MOVE R9 R0 - 0x7C200200, // 007B CALL R8 1 - 0x8C201117, // 007C GETMET R8 R8 K23 - 0x5C280200, // 007D MOVE R10 R1 - 0x5C2C0400, // 007E MOVE R11 R2 - 0x5C300600, // 007F MOVE R12 R3 - 0x7C200800, // 0080 CALL R8 4 - 0x80041000, // 0081 RET 1 R8 - 0x80000000, // 0082 RET 0 + 0x70020008, // 0065 JMP #006F + 0x60200003, // 0066 GETGBL R8 G3 + 0x5C240000, // 0067 MOVE R9 R0 + 0x7C200200, // 0068 CALL R8 1 + 0x8C201116, // 0069 GETMET R8 R8 K22 + 0x5C280200, // 006A MOVE R10 R1 + 0x5C2C0400, // 006B MOVE R11 R2 + 0x5C300600, // 006C MOVE R12 R3 + 0x7C200800, // 006D CALL R8 4 + 0x80041000, // 006E RET 1 R8 + 0x80000000, // 006F RET 0 }) ) ); @@ -660,20 +581,15 @@ be_local_class(Matter_Plugin_Shutter, be_const_map( * be_nested_map(1, ( (struct bmapnode*) &(const bmapnode[]) { { be_const_key_int(258, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_list, { - be_const_list( * be_nested_list(15, + be_const_list( * be_nested_list(10, ( (struct bvalue*) &(const bvalue[]) { be_const_int(0), be_const_int(5), - be_const_int(6), be_const_int(7), - be_const_int(8), - be_const_int(9), be_const_int(10), be_const_int(11), - be_const_int(12), be_const_int(13), be_const_int(14), - be_const_int(15), be_const_int(23), be_const_int(65532), be_const_int(65533), diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_ShutterTilt.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_ShutterTilt.h new file mode 100644 index 000000000..8126a9e45 --- /dev/null +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_ShutterTilt.h @@ -0,0 +1,219 @@ +/* Solidification of Matter_Plugin_ShutterTilt.h */ +/********************************************************************\ +* Generated code, don't edit * +\********************************************************************/ +#include "be_constobj.h" + +extern const bclass be_class_Matter_Plugin_ShutterTilt; + +/******************************************************************** +** Solidified function: invoke_request +********************************************************************/ +be_local_closure(Matter_Plugin_ShutterTilt_invoke_request, /* name */ + be_nested_proto( + 13, /* nstack */ + 4, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[11]) { /* constants */ + /* K0 */ be_nested_str_weak(light), + /* K1 */ be_nested_str_weak(matter), + /* K2 */ be_nested_str_weak(TLV), + /* K3 */ be_nested_str_weak(cluster), + /* K4 */ be_nested_str_weak(command), + /* K5 */ be_nested_str_weak(update_shadow_lazy), + /* K6 */ be_nested_str_weak(findsubval), + /* K7 */ be_const_int(0), + /* K8 */ be_nested_str_weak(log), + /* K9 */ be_nested_str_weak(tilt_X25_X3A), + /* K10 */ be_nested_str_weak(invoke_request), + }), + be_str_weak(invoke_request), + &be_const_str_solidified, + ( &(const binstruction[37]) { /* code */ + 0xA4120000, // 0000 IMPORT R4 K0 + 0xB8160200, // 0001 GETNGBL R5 K1 + 0x88140B02, // 0002 GETMBR R5 R5 K2 + 0x88180703, // 0003 GETMBR R6 R3 K3 + 0x881C0704, // 0004 GETMBR R7 R3 K4 + 0x54220101, // 0005 LDINT R8 258 + 0x1C200C08, // 0006 EQ R8 R6 R8 + 0x78220013, // 0007 JMPF R8 #001C + 0x8C200105, // 0008 GETMET R8 R0 K5 + 0x7C200200, // 0009 CALL R8 1 + 0x54220007, // 000A LDINT R8 8 + 0x1C200E08, // 000B EQ R8 R7 R8 + 0x7822000E, // 000C JMPF R8 #001C + 0x8C200506, // 000D GETMET R8 R2 K6 + 0x58280007, // 000E LDCONST R10 K7 + 0x7C200400, // 000F CALL R8 2 + 0x4C240000, // 0010 LDNIL R9 + 0x20241009, // 0011 NE R9 R8 R9 + 0x78260006, // 0012 JMPF R9 #001A + 0x54260009, // 0013 LDINT R9 10 + 0x0C201009, // 0014 DIV R8 R8 R9 + 0x60240008, // 0015 GETGBL R9 G8 + 0x5C281000, // 0016 MOVE R10 R8 + 0x7C240200, // 0017 CALL R9 1 + 0x00261209, // 0018 ADD R9 K9 R9 + 0x900E1009, // 0019 SETMBR R3 K8 R9 + 0x50240200, // 001A LDBOOL R9 1 0 + 0x80041200, // 001B RET 1 R9 + 0x60200003, // 001C GETGBL R8 G3 + 0x5C240000, // 001D MOVE R9 R0 + 0x7C200200, // 001E CALL R8 1 + 0x8C20110A, // 001F GETMET R8 R8 K10 + 0x5C280200, // 0020 MOVE R10 R1 + 0x5C2C0400, // 0021 MOVE R11 R2 + 0x5C300600, // 0022 MOVE R12 R3 + 0x7C200800, // 0023 CALL R8 4 + 0x80041000, // 0024 RET 1 R8 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: read_attribute +********************************************************************/ +be_local_closure(Matter_Plugin_ShutterTilt_read_attribute, /* name */ + be_nested_proto( + 12, /* nstack */ + 3, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[15]) { /* constants */ + /* K0 */ be_nested_str_weak(string), + /* K1 */ be_nested_str_weak(matter), + /* K2 */ be_nested_str_weak(TLV), + /* K3 */ be_nested_str_weak(cluster), + /* K4 */ be_nested_str_weak(attribute), + /* K5 */ be_nested_str_weak(update_shadow_lazy), + /* K6 */ be_nested_str_weak(create_TLV), + /* K7 */ be_nested_str_weak(U1), + /* K8 */ be_const_int(1), + /* K9 */ be_nested_str_weak(U2), + /* K10 */ be_nested_str_weak(shadow_shutter_tilt), + /* K11 */ be_const_int(0), + /* K12 */ be_nested_str_weak(U4), + /* K13 */ be_const_int(3), + /* K14 */ be_nested_str_weak(read_attribute), + }), + be_str_weak(read_attribute), + &be_const_str_solidified, + ( &(const binstruction[63]) { /* code */ + 0xA40E0000, // 0000 IMPORT R3 K0 + 0xB8120200, // 0001 GETNGBL R4 K1 + 0x88100902, // 0002 GETMBR R4 R4 K2 + 0x88140503, // 0003 GETMBR R5 R2 K3 + 0x88180504, // 0004 GETMBR R6 R2 K4 + 0x541E0101, // 0005 LDINT R7 258 + 0x1C1C0A07, // 0006 EQ R7 R5 R7 + 0x781E002E, // 0007 JMPF R7 #0037 + 0x8C1C0105, // 0008 GETMET R7 R0 K5 + 0x7C1C0200, // 0009 CALL R7 1 + 0x541E0006, // 000A LDINT R7 7 + 0x1C1C0C07, // 000B EQ R7 R6 R7 + 0x781E0008, // 000C JMPF R7 #0016 + 0x8C1C0906, // 000D GETMET R7 R4 K6 + 0x88240907, // 000E GETMBR R9 R4 K7 + 0x542A0007, // 000F LDINT R10 8 + 0x002A100A, // 0010 ADD R10 K8 R10 + 0x542E000F, // 0011 LDINT R11 16 + 0x0028140B, // 0012 ADD R10 R10 R11 + 0x7C1C0600, // 0013 CALL R7 3 + 0x80040E00, // 0014 RET 1 R7 + 0x70020020, // 0015 JMP #0037 + 0x541E000E, // 0016 LDINT R7 15 + 0x1C1C0C07, // 0017 EQ R7 R6 R7 + 0x781E0009, // 0018 JMPF R7 #0023 + 0x8C1C0906, // 0019 GETMET R7 R4 K6 + 0x88240909, // 001A GETMBR R9 R4 K9 + 0x542A0063, // 001B LDINT R10 100 + 0x882C010A, // 001C GETMBR R11 R0 K10 + 0x0428140B, // 001D SUB R10 R10 R11 + 0x542E0063, // 001E LDINT R11 100 + 0x0828140B, // 001F MUL R10 R10 R11 + 0x7C1C0600, // 0020 CALL R7 3 + 0x80040E00, // 0021 RET 1 R7 + 0x70020013, // 0022 JMP #0037 + 0x541E000B, // 0023 LDINT R7 12 + 0x1C1C0C07, // 0024 EQ R7 R6 R7 + 0x781E0005, // 0025 JMPF R7 #002C + 0x8C1C0906, // 0026 GETMET R7 R4 K6 + 0x88240907, // 0027 GETMBR R9 R4 K7 + 0x5828000B, // 0028 LDCONST R10 K11 + 0x7C1C0600, // 0029 CALL R7 3 + 0x80040E00, // 002A RET 1 R7 + 0x7002000A, // 002B JMP #0037 + 0x541EFFFB, // 002C LDINT R7 65532 + 0x1C1C0C07, // 002D EQ R7 R6 R7 + 0x781E0007, // 002E JMPF R7 #0037 + 0x8C1C0906, // 002F GETMET R7 R4 K6 + 0x8824090C, // 0030 GETMBR R9 R4 K12 + 0x542A0003, // 0031 LDINT R10 4 + 0x002A1A0A, // 0032 ADD R10 K13 R10 + 0x542E000F, // 0033 LDINT R11 16 + 0x0028140B, // 0034 ADD R10 R10 R11 + 0x7C1C0600, // 0035 CALL R7 3 + 0x80040E00, // 0036 RET 1 R7 + 0x601C0003, // 0037 GETGBL R7 G3 + 0x5C200000, // 0038 MOVE R8 R0 + 0x7C1C0200, // 0039 CALL R7 1 + 0x8C1C0F0E, // 003A GETMET R7 R7 K14 + 0x5C240200, // 003B MOVE R9 R1 + 0x5C280400, // 003C MOVE R10 R2 + 0x7C1C0600, // 003D CALL R7 3 + 0x80040E00, // 003E RET 1 R7 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified class: Matter_Plugin_ShutterTilt +********************************************************************/ +extern const bclass be_class_Matter_Plugin_Shutter; +be_local_class(Matter_Plugin_ShutterTilt, + 0, + &be_class_Matter_Plugin_Shutter, + be_nested_map(5, + ( (struct bmapnode*) &(const bmapnode[]) { + { be_const_key_weak(TYPE, 1), be_nested_str_weak(shutter_X2Btilt) }, + { be_const_key_weak(NAME, -1), be_nested_str_weak(Shutter_X20_X2B_X20Tilt) }, + { be_const_key_weak(invoke_request, 3), be_const_closure(Matter_Plugin_ShutterTilt_invoke_request_closure) }, + { be_const_key_weak(read_attribute, -1), be_const_closure(Matter_Plugin_ShutterTilt_read_attribute_closure) }, + { be_const_key_weak(CLUSTERS, 0), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { + be_const_map( * be_nested_map(1, + ( (struct bmapnode*) &(const bmapnode[]) { + { be_const_key_int(258, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_list, { + be_const_list( * be_nested_list(4, + ( (struct bvalue*) &(const bvalue[]) { + be_const_int(7), + be_const_int(12), + be_const_int(15), + be_const_int(65532), + })) ) } )) }, + })) ) } )) }, + })), + be_str_weak(Matter_Plugin_ShutterTilt) +); +/*******************************************************************/ + +void be_load_Matter_Plugin_ShutterTilt_class(bvm *vm) { + be_pushntvclass(vm, &be_class_Matter_Plugin_ShutterTilt); + be_setglobal(vm, "Matter_Plugin_ShutterTilt"); + be_pop(vm, 1); +} +/********************************************************************/ +/* End of solidification */ diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_UI.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_UI.h index 424cf1b1d..189b99c1e 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_UI.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_UI.h @@ -1792,7 +1792,7 @@ be_local_class(Matter_UI, be_nested_map(17, ( (struct bmapnode*) &(const bmapnode[]) { { be_const_key_weak(show_plugins_configuration, -1), be_const_closure(Matter_UI_show_plugins_configuration_closure) }, - { be_const_key_weak(_CLASSES_TYPES, 2), be_nested_str_weak(_X7Crelay_X7Clight0_X7Clight1_X7Clight2_X7Clight3_X7Cshutter_X7Ctemperature_X7Cpressure_X7Cilluminance_X7Chumidity) }, + { be_const_key_weak(_CLASSES_TYPES, 2), be_nested_str_weak(_X7Crelay_X7Clight0_X7Clight1_X7Clight2_X7Clight3_X7Cshutter_X7Cshutter_X2Btilt_X7Ctemperature_X7Cpressure_X7Cilluminance_X7Chumidity) }, { be_const_key_weak(show_fabric_info, 7), be_const_closure(Matter_UI_show_fabric_info_closure) }, { be_const_key_weak(init, -1), be_const_closure(Matter_UI_init_closure) }, { be_const_key_weak(web_add_handler, -1), be_const_closure(Matter_UI_web_add_handler_closure) }, diff --git a/tasmota/tasmota_xdrv_driver/xdrv_52_3_berry_zigbee.ino b/tasmota/tasmota_xdrv_driver/xdrv_52_3_berry_zigbee.ino index de58aeb91..7e93e3751 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_52_3_berry_zigbee.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_52_3_berry_zigbee.ino @@ -214,9 +214,9 @@ extern "C" { extern const be_ctypes_structure_t be_zigbee_zcl_frame_struct = { sizeof(ZCLFrame), /* size in bytes */ - 12, /* number of elements */ + 13, /* number of elements */ nullptr, - (const be_ctypes_structure_item_t[12]) { + (const be_ctypes_structure_item_t[13]) { { "cluster", offsetof(ZCLFrame, cluster), 0, 0, ctypes_u16, 0 }, { "cluster_specific", offsetof(ZCLFrame, clusterSpecific), 0, 0, ctypes_u8, 0 }, { "cmd", offsetof(ZCLFrame, cmd), 0, 0, ctypes_u8, 0 }, @@ -227,6 +227,7 @@ extern "C" { { "need_response", offsetof(ZCLFrame, needResponse), 0, 0, ctypes_u8, 0 }, { "payload_ptr", offsetof(ZCLFrame, payload), 0, 0, ctypes_ptr32, 0 }, { "shortaddr", offsetof(ZCLFrame, shortaddr), 0, 0, ctypes_u16, 0 }, + { "srcendpoint", offsetof(ZCLFrame, srcendpoint), 0, 0, ctypes_u8, 0 }, { "transactseq", offsetof(ZCLFrame, transactseq), 0, 0, ctypes_u8, 0 }, { "transactseq_set", offsetof(ZCLFrame, transacSet), 0, 0, ctypes_u8, 0 }, }}; From 60855bf367f7ee62cf22196e700f606a1dd72160 Mon Sep 17 00:00:00 2001 From: stefanbode Date: Thu, 27 Apr 2023 08:03:00 +0200 Subject: [PATCH 044/289] Enabled ZCDimmerSet for ESP8266 (#18518) * Enabled ZCDimmerSet for ESP8266 - Increased interrupts time to get stablity. Savedata issue is gone. - Increased accuracy to trigger an on sinus curve. - Enabled high resolution trigger ZCDimmerSet for ESP8266 * Update xdrv_68_zerocrossDimmer.ino --- .../xdrv_68_zerocrossDimmer.ino | 101 ++++++++++-------- 1 file changed, 59 insertions(+), 42 deletions(-) diff --git a/tasmota/tasmota_xdrv_driver/xdrv_68_zerocrossDimmer.ino b/tasmota/tasmota_xdrv_driver/xdrv_68_zerocrossDimmer.ino index 307fabc00..890b3bb3b 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_68_zerocrossDimmer.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_68_zerocrossDimmer.ino @@ -24,23 +24,25 @@ #define XDRV_68 68 -static const uint32_t GATE_ENABLE_TIME = 100; +static const uint8_t GATE_ENABLE_TIME = 100; +static const uint8_t MIN_PERCENT = 5; +static const uint8_t MAX_PERCENT = 99; +static const uint8_t TRIGGER_PERIOD = 75; struct AC_ZERO_CROSS_DIMMER { - uint32_t cycle_time_us; - /// Time (in micros()) of last ZC signal - uint32_t crossed_zero_at; - /// Time since last ZC pulse to enable gate pin. 0 means not set. - bool timer_iterrupt_started = false; - bool dimmer_in_use = false; - // Check if 50µs timer is running. - uint32_t enable_time_us[MAX_PWMS]; - /// Time since last ZC pulse to disable gate pin. 0 means no disable. - uint32_t disable_time_us[MAX_PWMS]; - uint8_t current_state_in_phase[MAX_PWMS]; // 0=before fire HIGH, 1=HIGH, 2=after setting LOW, 3=before HIGH without setting LOW (POWER ON) - uint32_t lastlight[MAX_PWMS]; - uint16_t detailpower[MAX_PWMS]; // replaces dimmer and light controll 0..10000. required savedata 0. - uint32_t intr_counter = 0; + uint32_t cycle_time_us; // Time (in micros()) of last ZC signal + uint32_t crossed_zero_at; // Time (in micros()) of last ZC signal + bool timer_iterrupt_started = false; // verification of the interrupt running + bool dimmer_in_use = false; // Check if interrupt has to be run. Is stopped if all lights off + uint32_t enable_time_us[MAX_PWMS]; // Time since last ZC pulse to enable gate pin. 0 means no disable. + uint32_t disable_time_us[MAX_PWMS]; // Time since last ZC pulse to disable gate pin. 0 means no disable. + uint8_t current_state_in_phase[MAX_PWMS]; // 0=before fire HIGH, 1=HIGH, 2=after setting LOW, 3=before HIGH without setting LOW (POWER ON) + uint32_t lastlight[MAX_PWMS]; // Store the light value. Set 1 if controlled through ZCDimmerSet + uint16_t detailpower[MAX_PWMS]; // replaces dimmer and light controll 0..10000. required savedata 0. + uint32_t accurracy[MAX_PWMS]; // offset of the time to fire the triac and the real time when it fired + uint8_t triggertime = GATE_ENABLE_TIME; // copy of the Time for the gate keep open to start TRIAC + uint32_t intr_counter = 0; // counter internally on interrerupt calls + uint32_t missed_zero_cross; // count up all missed Zero-cross events. } ac_zero_cross_dimmer; @@ -49,12 +51,13 @@ struct AC_ZERO_CROSS_DIMMER { #endif #define D_PRFX_ZCDIMMER "ZCDimmer" -#define D_CMND_DIMMERSET "Set" +#define D_CMND_DIMMERSET "Set" // Set percent as float value for dimmer +#define D_CMND_GATEENABLE "GateTime" // Override the GATE ON time DEBUG PURPOSE -const char kZCDimmerCommands[] PROGMEM = D_PRFX_ZCDIMMER "|" D_CMND_DIMMERSET; +const char kZCDimmerCommands[] PROGMEM = D_PRFX_ZCDIMMER "|" D_CMND_DIMMERSET "|" D_CMND_GATEENABLE; void (* const ZCDimmerCommand[])(void) PROGMEM = { - &CmndZCDimmerSet + &CmndZCDimmerSet//,&CmndZCGateEnableTime }; void IRAM_ATTR ACDimmerZeroCross(uint32_t time) { @@ -66,12 +69,12 @@ void IRAM_ATTR ACDimmerZeroCross(uint32_t time) { ac_zero_cross_dimmer.dimmer_in_use |= ac_zero_cross_dimmer.lastlight[i] > 0; // Dimmer is physically off. Skip swich on ac_zero_cross_dimmer.current_state_in_phase[i] = 0; - if (100 * ac_zero_cross_dimmer.enable_time_us[i] > 95 * ac_zero_cross_dimmer.cycle_time_us ) { + if (100 * ac_zero_cross_dimmer.enable_time_us[i] > MAX_PERCENT * ac_zero_cross_dimmer.cycle_time_us ) { ac_zero_cross_dimmer.current_state_in_phase[i] = 1; ac_zero_cross_dimmer.disable_time_us[i] = ac_zero_cross_dimmer.cycle_time_us / 2; } // If full cycle is required keep pin HIGH, skip LOW by skipping phase - if (100 * ac_zero_cross_dimmer.enable_time_us[i] < 15 * ac_zero_cross_dimmer.cycle_time_us) { + if (100 * ac_zero_cross_dimmer.enable_time_us[i] < MIN_PERCENT * ac_zero_cross_dimmer.cycle_time_us) { ac_zero_cross_dimmer.current_state_in_phase[i] = 3; } } @@ -112,13 +115,7 @@ void ACDimmerInterruptDisable(bool disable) // For ESP32, we can't use dynamic interval calculation because the timerX functions // are not callable from ISR (placed in flash storage). // Here we just use an interrupt firing every 75 µs. - if (Settings->save_data == 0) { - AddLog(LOG_LEVEL_INFO, PSTR("ZCD: Save disabled. High frequency scan enabled. DO NOT USE SAVEDATA if channel is on")); - timerAlarmWrite(dimmer_timer, 30, true); - } else { - AddLog(LOG_LEVEL_INFO, PSTR("ZCD: Save on. 75µs scan enabled")); - timerAlarmWrite(dimmer_timer, 75, true); - } + timerAlarmWrite(dimmer_timer, TRIGGER_PERIOD , true); } timerAlarmEnable(dimmer_timer); #endif @@ -139,9 +136,12 @@ void IRAM_ATTR ACDimmerTimer_intr() { return; uint32_t time_since_zc = now - ac_zero_cross_dimmer.crossed_zero_at; + + // Check for missed Zero-Cross event. Single failure will correct if (time_since_zc > 10100) { memset(&ac_zero_cross_dimmer.current_state_in_phase, 0x00, sizeof(ac_zero_cross_dimmer.current_state_in_phase)); ac_zero_cross_dimmer.crossed_zero_at += ac_zero_cross_dimmer.cycle_time_us; + ac_zero_cross_dimmer.missed_zero_cross++; time_since_zc = now - ac_zero_cross_dimmer.crossed_zero_at; } @@ -149,6 +149,7 @@ void IRAM_ATTR ACDimmerTimer_intr() { if (Pin(GPIO_PWM1, i) == -1) continue; switch (ac_zero_cross_dimmer.current_state_in_phase[i]) { case 1: + // Switch off does not need high accuracy. Happens at the next 75µs trigger if (time_since_zc >= ac_zero_cross_dimmer.disable_time_us[i]) { digitalWrite(Pin(GPIO_PWM1, i), LOW); ac_zero_cross_dimmer.current_state_in_phase[i]++; @@ -156,9 +157,17 @@ void IRAM_ATTR ACDimmerTimer_intr() { break; case 0: case 3: + if (time_since_zc + TRIGGER_PERIOD >= ac_zero_cross_dimmer.enable_time_us[i]){ + // Very close to the fire event. Loop the last µseconds to wait. + while (time_since_zc < ac_zero_cross_dimmer.enable_time_us[i]) { + now = micros(); + time_since_zc = now - ac_zero_cross_dimmer.crossed_zero_at; + } + } if (time_since_zc >= ac_zero_cross_dimmer.enable_time_us[i]) { digitalWrite(Pin(GPIO_PWM1, i), HIGH); ac_zero_cross_dimmer.current_state_in_phase[i]++; + ac_zero_cross_dimmer.accurracy[i] = time_since_zc-ac_zero_cross_dimmer.enable_time_us[i]; } break; } @@ -173,21 +182,25 @@ void ACDimmerControllTrigger(void) { } for (uint8_t i = 0; i < MAX_PWMS; i++){ if (Pin(GPIO_PWM1, i) == -1) continue; - ac_zero_cross_dimmer.lastlight[i] = Light.fade_running ? Light.fade_cur_10[i] : Light.fade_start_10[i]; + + if (ac_zero_cross_dimmer.detailpower[i]){ + ac_zero_cross_dimmer.lastlight[i] = changeUIntScale(ac_zero_cross_dimmer.detailpower[i]/10, 0, 1000, 0, 1023); + } else { + ac_zero_cross_dimmer.lastlight[i] = Light.fade_running ? Light.fade_cur_10[i] : Light.fade_start_10[i]; + } ac_zero_cross_dimmer.enable_time_us[i] = (ac_zero_cross_dimmer.cycle_time_us * (1023 - ac_zero_cross_power(ac_zero_cross_dimmer.lastlight[i]))) / 1023; #ifdef ESP32 if (ac_zero_cross_dimmer.detailpower[i]){ float state = (float)(1 - (ac_zero_cross_dimmer.detailpower[i]/10000.0)); //state = std::acos(1 - (2 * state)) / 3.14159 * ac_zero_cross_dimmer.cycle_time_us; - state = std::acos(1 - (2 * state)) / 3.14159 * 10000; + state = std::acos(1 - (2 * state)) / 3.14159 * ac_zero_cross_dimmer.cycle_time_us; //AddLog(LOG_LEVEL_DEBUG_MORE, PSTR("ZCD: Float2: %*_f"),0,&state); ac_zero_cross_dimmer.enable_time_us[i] = (uint32_t)state; - ac_zero_cross_dimmer.lastlight[i] = 1; } #endif - ac_zero_cross_dimmer.disable_time_us[i] = ac_zero_cross_dimmer.enable_time_us[i] + GATE_ENABLE_TIME; + ac_zero_cross_dimmer.disable_time_us[i] = ac_zero_cross_dimmer.enable_time_us[i] + ac_zero_cross_dimmer.triggertime; } } @@ -204,17 +217,18 @@ void ACDimmerLogging(void) } #endif - AddLog(LOG_LEVEL_DEBUG, PSTR("ZCD: ZeroEnable %d -> %d, Alarm %d, intr: %ld, cycle time: %ld µs"), - ac_zero_cross_dimmer.dimmer_in_use, ac_zero_cross_dimmer.timer_iterrupt_started, alarmEnabled, timercounter, ac_zero_cross_dimmer.cycle_time_us + AddLog(LOG_LEVEL_DEBUG, PSTR("ZCD: ZeroEnable %d -> %d, Alarm %d, intr: %ld, cycle time: %ld µs, missed zc %ld"), + ac_zero_cross_dimmer.dimmer_in_use, ac_zero_cross_dimmer.timer_iterrupt_started, alarmEnabled, timercounter, + ac_zero_cross_dimmer.cycle_time_us, ac_zero_cross_dimmer.missed_zero_cross ); for (uint8_t i = 0; i < MAX_PWMS; i++){ if (Pin(GPIO_PWM1, i) == -1) continue; - AddLog(LOG_LEVEL_DEBUG_MORE, PSTR("ZCD: PWM[%d] en: %ld µs, dis: %ld µs, state %d, fade: %d, cur: %d, end: %d, lastlight: %d"), + AddLog(LOG_LEVEL_DEBUG_MORE, PSTR("ZCD: PWM[%d] en: %ld µs, dis: %ld µs, state %d, fade: %d, cur: %d, end: %d, lastlight: %d, acc: %ld"), i+1, ac_zero_cross_dimmer.enable_time_us[i], ac_zero_cross_dimmer.disable_time_us[i], - ac_zero_cross_dimmer.current_state_in_phase[i], Light.fade_cur_10[i], Light.fade_start_10[i], Light.fade_end_10[i], ac_zero_cross_dimmer.lastlight[i] + ac_zero_cross_dimmer.current_state_in_phase[i], Light.fade_cur_10[i], Light.fade_start_10[i], Light.fade_end_10[i], ac_zero_cross_dimmer.lastlight[i], + ac_zero_cross_dimmer.accurracy[i] ); } - } @@ -232,6 +246,14 @@ void CmndZCDimmerSet(void) } } +/* void CmndZCGateEnableTime(void) +{ + if (XdrvMailbox.payload > 0) { + ac_zero_cross_dimmer.triggertime = XdrvMailbox.payload; + } + ResponseCmndNumber(ac_zero_cross_dimmer.triggertime); +} */ + /*********************************************************************************************\ * Interface \*********************************************************************************************/ @@ -256,21 +278,16 @@ bool Xdrv68(uint32_t function) ACDimmerControllTrigger(); break; case FUNC_INTERRUPT_STOP: - AddLog(LOG_LEVEL_DEBUG_MORE, PSTR("ZCD: FUNC_INTERRUPT_STOP")); ACDimmerInterruptDisable(true); break; case FUNC_INTERRUPT_START: - AddLog(LOG_LEVEL_DEBUG_MORE, PSTR("ZCD: FUNC_INTERRUPT_START")); ACDimmerInterruptDisable(false); break; case FUNC_COMMAND: result = DecodeCommand(kZCDimmerCommands, ZCDimmerCommand); - //result = DecodeCommand(kShutterCommands, ShutterCommand); - break; } - } + } return result; } - #endif // USE_AC_ZERO_CROSS_DIMMER From e4e2fcdc6d30574e5d924e0174d5ef58d0c0906c Mon Sep 17 00:00:00 2001 From: s-hadinger <49731213+s-hadinger@users.noreply.github.com> Date: Thu, 27 Apr 2023 08:54:57 +0200 Subject: [PATCH 045/289] Matter reduce logging for CASE authentication (#18527) --- .../src/embedded/Matter_Commissioning.be | 134 +- .../solidified_Matter_Commissioning.h | 2190 +++++++---------- 2 files changed, 899 insertions(+), 1425 deletions(-) diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Commissioning.be b/lib/libesp32/berry_matter/src/embedded/Matter_Commissioning.be index 7235186e4..a77ea792d 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Commissioning.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Commissioning.be @@ -358,12 +358,12 @@ class Matter_Commisioning_Context var Resume1MICPayload = ec.decrypt(encrypted) var decrypted_tag = ec.tag() - tasmota.log("****************************************", 4) - tasmota.log("MTR: * s1rk = " + s1rk.tohex(), 4) - tasmota.log("MTR: * tag = " + tag.tohex(), 4) - tasmota.log("MTR: * Resume1MICPayload = " + Resume1MICPayload.tohex(), 4) - tasmota.log("MTR: * decrypted_tag = " + decrypted_tag.tohex(), 4) - tasmota.log("****************************************", 4) + # tasmota.log("****************************************", 4) + # tasmota.log("MTR: * s1rk = " + s1rk.tohex(), 4) + # tasmota.log("MTR: * tag = " + tag.tohex(), 4) + # tasmota.log("MTR: * Resume1MICPayload = " + Resume1MICPayload.tohex(), 4) + # tasmota.log("MTR: * decrypted_tag = " + decrypted_tag.tohex(), 4) + # tasmota.log("****************************************", 4) if tag == decrypted_tag session._fabric = session_resumption._fabric session._source_node_id = msg.source_node_id @@ -391,13 +391,13 @@ class Matter_Commisioning_Context sigma2resume.responderSessionID = session.__future_local_session_id sigma2resume.sigma2ResumeMIC = Resume2MIC - tasmota.log("****************************************", 4) - tasmota.log("MTR: * s2rk = " + s2rk.tohex(), 4) - tasmota.log("MTR: * s2rk_salt = " + s2rk_salt.tohex(), 4) - tasmota.log("MTR: * new_resumption_id = " + session.resumption_id.tohex(), 4) - tasmota.log("MTR: * responderSessionID= " + str(session.__future_local_session_id), 4) - tasmota.log("MTR: * sigma2ResumeMIC = " + Resume2MIC.tohex(), 4) - tasmota.log("****************************************", 4) + # tasmota.log("****************************************", 4) + # tasmota.log("MTR: * s2rk = " + s2rk.tohex(), 4) + # tasmota.log("MTR: * s2rk_salt = " + s2rk_salt.tohex(), 4) + # tasmota.log("MTR: * new_resumption_id = " + session.resumption_id.tohex(), 4) + # tasmota.log("MTR: * responderSessionID= " + str(session.__future_local_session_id), 4) + # tasmota.log("MTR: * sigma2ResumeMIC = " + Resume2MIC.tohex(), 4) + # tasmota.log("****************************************", 4) # # compute session key, p.178 var session_keys = crypto.HKDF_SHA256().derive(session.shared_secret #- input key -#, sigma1.initiatorRandom + session.resumption_id #- salt -#, @@ -408,16 +408,16 @@ class Matter_Commisioning_Context var ac = session_keys[32..47] var created = tasmota.rtc()['utc'] - tasmota.log("MTR: ******************************", 4) - tasmota.log("MTR: I2RKey =" + i2r.tohex(), 4) - tasmota.log("MTR: R2IKey =" + r2i.tohex(), 4) - tasmota.log("MTR: AC =" + ac.tohex(), 4) - tasmota.log("MTR: ******************************", 4) + # tasmota.log("MTR: ******************************", 4) + # tasmota.log("MTR: I2RKey =" + i2r.tohex(), 4) + # tasmota.log("MTR: R2IKey =" + r2i.tohex(), 4) + # tasmota.log("MTR: AC =" + ac.tohex(), 4) + # tasmota.log("MTR: ******************************", 4) var sigma2resume_raw = sigma2resume.tlv2raw() session.__Msg1 = nil - tasmota.log("MTR: sigma2resume: " + matter.inspect(sigma2resume), 4) - tasmota.log("MTR: sigma2resume_raw: " + sigma2resume_raw.tohex(), 4) + # tasmota.log("MTR: sigma2resume: " + matter.inspect(sigma2resume), 4) + # tasmota.log("MTR: sigma2resume_raw: " + sigma2resume_raw.tohex(), 4) # now package the response message var resp = msg.build_response(0x33 #-sigma-2-resume-#, true) @@ -493,40 +493,40 @@ class Matter_Commisioning_Context sigma2_tbedata.add_TLV(4, matter.TLV.B2, session.resumption_id) # compute TranscriptHash = Crypto_Hash(message = Msg1) - tasmota.log("****************************************", 4) + # tasmota.log("****************************************", 4) session.__Msg1 = sigma1.Msg1 - tasmota.log("MTR: * resumptionid = " + session.resumption_id.tohex(), 4) - tasmota.log("MTR: * MSG1 = " + session.__Msg1.tohex(), 4) + # tasmota.log("MTR: * resumptionid = " + session.resumption_id.tohex(), 4) + # tasmota.log("MTR: * MSG1 = " + session.__Msg1.tohex(), 4) var TranscriptHash = crypto.SHA256().update(session.__Msg1).out() - tasmota.log("MTR: TranscriptHash =" + TranscriptHash.tohex(), 4) + # tasmota.log("MTR: TranscriptHash =" + TranscriptHash.tohex(), 4) # Compute S2K, p.175 var s2k_info = bytes().fromstring(self.S2K_Info) var s2k_salt = session.get_ipk_group_key() + responderRandom + session.__responder_pub + TranscriptHash var s2k = crypto.HKDF_SHA256().derive(session.shared_secret, s2k_salt, s2k_info, 16) - tasmota.log("MTR: * SharedSecret = " + session.shared_secret.tohex(), 4) - tasmota.log("MTR: * s2k_salt = " + s2k_salt.tohex(), 4) - tasmota.log("MTR: * s2k = " + s2k.tohex(), 4) + # tasmota.log("MTR: * SharedSecret = " + session.shared_secret.tohex(), 4) + # tasmota.log("MTR: * s2k_salt = " + s2k_salt.tohex(), 4) + # tasmota.log("MTR: * s2k = " + s2k.tohex(), 4) var sigma2_tbedata_raw = sigma2_tbedata.tlv2raw() - tasmota.log("MTR: * TBEData2Raw = " + sigma2_tbedata_raw.tohex(), 4) + # tasmota.log("MTR: * TBEData2Raw = " + sigma2_tbedata_raw.tohex(), 4) # // `AES_CCM.init(secret_key:bytes(16 or 32), iv:bytes(7..13), aad:bytes(), data_len:int, tag_len:int) -> instance` var aes = crypto.AES_CCM(s2k, bytes().fromstring(self.TBEData2_Nonce), bytes(), size(sigma2_tbedata_raw), 16) var TBEData2Encrypted = aes.encrypt(sigma2_tbedata_raw) + aes.tag() - tasmota.log("MTR: * TBEData2Enc = " + TBEData2Encrypted.tohex(), 4) - tasmota.log("****************************************", 4) + # tasmota.log("MTR: * TBEData2Enc = " + TBEData2Encrypted.tohex(), 4) + # tasmota.log("****************************************", 4) var sigma2 = matter.Sigma2() sigma2.responderRandom = responderRandom sigma2.responderSessionId = session.__future_local_session_id sigma2.responderEphPubKey = session.__responder_pub sigma2.encrypted2 = TBEData2Encrypted - tasmota.log("MTR: sigma2: " + matter.inspect(sigma2), 4) + # tasmota.log("MTR: sigma2: " + matter.inspect(sigma2), 4) var sigma2_raw = sigma2.tlv2raw() session.__Msg2 = sigma2_raw - tasmota.log("MTR: sigma2_raw: " + sigma2_raw.tohex(), 4) + # tasmota.log("MTR: sigma2_raw: " + sigma2_raw.tohex(), 4) # now package the response message var resp = msg.build_response(0x31 #-sigma-2-#, true) # no reliable flag @@ -550,22 +550,22 @@ class Matter_Commisioning_Context var session = msg.session var sigma3 = matter.Sigma3().parse(msg.raw, msg.app_payload_idx) - tasmota.log("****************************************", 4) + # tasmota.log("****************************************", 4) # compute TranscriptHash = Crypto_Hash(message = Msg1 || Msg2) var TranscriptHash = crypto.SHA256().update(session.__Msg1).update(session.__Msg2).out() - tasmota.log("MTR: * session = " + str(session), 4) - tasmota.log("MTR: .ipk_epoch_key=" + str(session.get_ipk_epoch_key()), 4) - tasmota.log("MTR: .fabric_compr = " + str(session.get_fabric_compressed()), 4) - tasmota.log("MTR: * ipk_group_key = " + session.get_ipk_group_key().tohex(), 4) - tasmota.log("MTR: * TranscriptHash= " + TranscriptHash.tohex(), 4) + # tasmota.log("MTR: * session = " + str(session), 4) + # tasmota.log("MTR: .ipk_epoch_key=" + str(session.get_ipk_epoch_key()), 4) + # tasmota.log("MTR: .fabric_compr = " + str(session.get_fabric_compressed()), 4) + # tasmota.log("MTR: * ipk_group_key = " + session.get_ipk_group_key().tohex(), 4) + # tasmota.log("MTR: * TranscriptHash= " + TranscriptHash.tohex(), 4) var s3k_info = bytes().fromstring(self.S3K_Info) var s3k = crypto.HKDF_SHA256().derive(session.shared_secret, session.get_ipk_group_key() + TranscriptHash, s3k_info, 16) - tasmota.log("****************************************", 4) - tasmota.log("MTR: * s3k_salt = " + (session.get_ipk_group_key() + TranscriptHash).tohex(), 4) - tasmota.log("MTR: * s3k = " + s3k.tohex(), 4) - tasmota.log("****************************************", 4) + # tasmota.log("****************************************", 4) + # tasmota.log("MTR: * s3k_salt = " + (session.get_ipk_group_key() + TranscriptHash).tohex(), 4) + # tasmota.log("MTR: * s3k = " + s3k.tohex(), 4) + # tasmota.log("****************************************", 4) # decrypt var encrypted = sigma3.TBEData3Encrypted[0..-17] @@ -573,10 +573,10 @@ class Matter_Commisioning_Context var ec = crypto.AES_CCM(s3k, bytes().fromstring(self.TBEData3_Nonce), bytes(), size(encrypted), 16) var TBEData3 = ec.decrypt(encrypted) var TBETag3 = ec.tag() - tasmota.log("MTR: * TBEData3 = " + TBEData3.tohex(), 4) - tasmota.log("MTR: * TBETag3 = " + TBETag3.tohex(), 4) - tasmota.log("MTR: * tag_sent = " + tag.tohex(), 4) - tasmota.log("****************************************", 4) + # tasmota.log("MTR: * TBEData3 = " + TBEData3.tohex(), 4) + # tasmota.log("MTR: * TBETag3 = " + TBETag3.tohex(), 4) + # tasmota.log("MTR: * tag_sent = " + tag.tohex(), 4) + # tasmota.log("****************************************", 4) if TBETag3 != tag tasmota.log("MTR: Tag don't match", 2) @@ -586,13 +586,13 @@ class Matter_Commisioning_Context end var TBEData3TLV = matter.TLV.parse(TBEData3) - tasmota.log("MTR: * TBEData3TLV = " + str(TBEData3TLV), 4) + # tasmota.log("MTR: * TBEData3TLV = " + str(TBEData3TLV), 4) var initiatorNOC = TBEData3TLV.findsubval(1) var initiatorICAC = TBEData3TLV.findsubval(2) var ec_signature = TBEData3TLV.findsubval(3) - tasmota.log("MTR: * initiatorNOC = " + str(initiatorNOC), 4) - tasmota.log("MTR: * initiatorICAC = " + str(initiatorICAC), 4) - tasmota.log("MTR: * ec_signature = " + str(ec_signature), 4) + # tasmota.log("MTR: * initiatorNOC = " + str(initiatorNOC), 4) + # tasmota.log("MTR: * initiatorICAC = " + str(initiatorICAC), 4) + # tasmota.log("MTR: * ec_signature = " + str(ec_signature), 4) # Success = Crypto_VerifyChain(certificates = [TBEData3.initiatorNOC, TBEData3.initiatorICAC, TrustedRCAC]), when TBEData3.initiatorICAC is present # TODO var initiatorNOCTLV = matter.TLV.parse(initiatorNOC) @@ -608,13 +608,13 @@ class Matter_Commisioning_Context sigma3_tbs.add_TLV(2, matter.TLV.B1, initiatorICAC) sigma3_tbs.add_TLV(3, matter.TLV.B1, session.__initiator_pub) sigma3_tbs.add_TLV(4, matter.TLV.B1, session.__responder_pub) - tasmota.log("MTR: * sigma3_tbs = " + str(sigma3_tbs), 4) + # tasmota.log("MTR: * sigma3_tbs = " + str(sigma3_tbs), 4) var sigma3_tbs_raw = sigma3_tbs.tlv2raw() - tasmota.log("MTR: * sigma3_tbs_raw= " + sigma3_tbs_raw.tohex(), 4) + # tasmota.log("MTR: * sigma3_tbs_raw= " + sigma3_tbs_raw.tohex(), 4) - tasmota.log("MTR: * initiatorNOCPubKey= " + initiatorNOCPubKey.tohex(), 4) - tasmota.log("MTR: * ec_signature = " + ec_signature.tohex(), 4) - tasmota.log("****************************************", 4) + # tasmota.log("MTR: * initiatorNOCPubKey= " + initiatorNOCPubKey.tohex(), 4) + # tasmota.log("MTR: * ec_signature = " + ec_signature.tohex(), 4) + # tasmota.log("****************************************", 4) # `crypto.EC_P256().ecdsa_verify_sha256(public_key:bytes(65), message:bytes(), hash:bytes()) -> bool` var sigma3_tbs_valid = crypto.EC_P256().ecdsa_verify_sha256(initiatorNOCPubKey, sigma3_tbs_raw, ec_signature) @@ -631,17 +631,17 @@ class Matter_Commisioning_Context end TranscriptHash = crypto.SHA256().update(session.__Msg1).update(session.__Msg2).update(sigma3.Msg3).out() - tasmota.log("MTR: * __Msg1 = " + session.__Msg1.tohex(), 4) - tasmota.log("MTR: * __Msg2 = " + session.__Msg2.tohex(), 4) - tasmota.log("MTR: * __Msg3 = " + sigma3.Msg3.tohex(), 4) - tasmota.log("MTR: * TranscriptHash = " + TranscriptHash.tohex(), 4) + # tasmota.log("MTR: * __Msg1 = " + session.__Msg1.tohex(), 4) + # tasmota.log("MTR: * __Msg2 = " + session.__Msg2.tohex(), 4) + # tasmota.log("MTR: * __Msg3 = " + sigma3.Msg3.tohex(), 4) + # tasmota.log("MTR: * TranscriptHash = " + TranscriptHash.tohex(), 4) # we can now free __Msg1 and __Msg2 session.__Msg1 = nil session.__Msg2 = nil - tasmota.log("MTR: ******************************", 4) - tasmota.log("MTR: shared_secret =" + session.shared_secret.tohex(), 4) - tasmota.log("MTR: ipk + hash =" + (session.get_ipk_group_key() + TranscriptHash).tohex(), 4) + # tasmota.log("MTR: ******************************", 4) + # tasmota.log("MTR: shared_secret =" + session.shared_secret.tohex(), 4) + # tasmota.log("MTR: ipk + hash =" + (session.get_ipk_group_key() + TranscriptHash).tohex(), 4) # compute session key var session_keys = crypto.HKDF_SHA256().derive(session.shared_secret #- input key -#, session.get_ipk_group_key() + TranscriptHash #- salt -#, @@ -652,11 +652,11 @@ class Matter_Commisioning_Context var ac = session_keys[32..47] var created = tasmota.rtc()['utc'] - tasmota.log("MTR: ******************************", 4) - tasmota.log("MTR: I2RKey =" + i2r.tohex(), 4) - tasmota.log("MTR: R2IKey =" + r2i.tohex(), 4) - tasmota.log("MTR: AC =" + ac.tohex(), 4) - tasmota.log("MTR: ******************************", 4) + # tasmota.log("MTR: ******************************", 4) + # tasmota.log("MTR: I2RKey =" + i2r.tohex(), 4) + # tasmota.log("MTR: R2IKey =" + r2i.tohex(), 4) + # tasmota.log("MTR: AC =" + ac.tohex(), 4) + # tasmota.log("MTR: ******************************", 4) # StatusReport(GeneralCode: SUCCESS, ProtocolId: SECURE_CHANNEL, ProtocolCode: SESSION_ESTABLISHMENT_SUCCESS) self.send_status_report(msg, 0x00, 0x0000, 0x0000, true) diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Commissioning.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Commissioning.h index af2acb9fa..f37665721 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Commissioning.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Commissioning.h @@ -885,7 +885,7 @@ be_local_closure(Matter_Commisioning_Context_parse_Sigma3, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[101]) { /* constants */ + ( &(const bvalue[69]) { /* constants */ /* K0 */ be_nested_str_weak(crypto), /* K1 */ be_nested_str_weak(opcode), /* K2 */ be_nested_str_weak(local_session_id), @@ -903,94 +903,62 @@ be_local_closure(Matter_Commisioning_Context_parse_Sigma3, /* name */ /* K14 */ be_nested_str_weak(parse), /* K15 */ be_nested_str_weak(raw), /* K16 */ be_nested_str_weak(app_payload_idx), - /* K17 */ be_nested_str_weak(_X2A_X2A_X2A_X2A_X2A_X2A_X2A_X2A_X2A_X2A_X2A_X2A_X2A_X2A_X2A_X2A_X2A_X2A_X2A_X2A_X2A_X2A_X2A_X2A_X2A_X2A_X2A_X2A_X2A_X2A_X2A_X2A_X2A_X2A_X2A_X2A_X2A_X2A_X2A_X2A), - /* K18 */ be_nested_str_weak(SHA256), - /* K19 */ be_nested_str_weak(update), - /* K20 */ be_nested_str_weak(__Msg1), - /* K21 */ be_nested_str_weak(__Msg2), - /* K22 */ be_nested_str_weak(out), - /* K23 */ be_nested_str_weak(MTR_X3A_X20_X2A_X20session_X20_X20_X20_X20_X20_X20_X20_X3D_X20), - /* K24 */ be_nested_str_weak(MTR_X3A_X20_X20_X20_X2Eipk_epoch_key_X3D), - /* K25 */ be_nested_str_weak(get_ipk_epoch_key), - /* K26 */ be_nested_str_weak(MTR_X3A_X20_X20_X20_X2Efabric_compr_X20_X3D_X20), - /* K27 */ be_nested_str_weak(get_fabric_compressed), - /* K28 */ be_nested_str_weak(MTR_X3A_X20_X2A_X20ipk_group_key_X20_X3D_X20), - /* K29 */ be_nested_str_weak(get_ipk_group_key), - /* K30 */ be_nested_str_weak(tohex), - /* K31 */ be_nested_str_weak(MTR_X3A_X20_X2A_X20TranscriptHash_X3D_X20), - /* K32 */ be_nested_str_weak(fromstring), - /* K33 */ be_nested_str_weak(S3K_Info), - /* K34 */ be_nested_str_weak(HKDF_SHA256), - /* K35 */ be_nested_str_weak(derive), - /* K36 */ be_nested_str_weak(shared_secret), - /* K37 */ be_nested_str_weak(MTR_X3A_X20_X2A_X20s3k_salt_X20_X20_X20_X20_X20_X20_X3D_X20), - /* K38 */ be_nested_str_weak(MTR_X3A_X20_X2A_X20s3k_X20_X20_X20_X20_X20_X20_X20_X20_X20_X20_X20_X3D_X20), - /* K39 */ be_nested_str_weak(TBEData3Encrypted), - /* K40 */ be_const_int(2147483647), - /* K41 */ be_nested_str_weak(AES_CCM), - /* K42 */ be_nested_str_weak(TBEData3_Nonce), - /* K43 */ be_nested_str_weak(decrypt), - /* K44 */ be_nested_str_weak(tag), - /* K45 */ be_nested_str_weak(MTR_X3A_X20_X2A_X20TBEData3_X20_X20_X20_X20_X20_X20_X3D_X20), - /* K46 */ be_nested_str_weak(MTR_X3A_X20_X2A_X20TBETag3_X20_X20_X20_X20_X20_X20_X20_X3D_X20), - /* K47 */ be_nested_str_weak(MTR_X3A_X20_X2A_X20tag_sent_X20_X20_X20_X20_X20_X20_X3D_X20), - /* K48 */ be_nested_str_weak(MTR_X3A_X20Tag_X20don_X27t_X20match), - /* K49 */ be_nested_str_weak(TLV), - /* K50 */ be_nested_str_weak(MTR_X3A_X20_X2A_X20TBEData3TLV_X20_X20_X20_X3D_X20), - /* K51 */ be_nested_str_weak(findsubval), - /* K52 */ be_const_int(3), - /* K53 */ be_nested_str_weak(MTR_X3A_X20_X2A_X20initiatorNOC_X20_X20_X3D_X20), - /* K54 */ be_nested_str_weak(MTR_X3A_X20_X2A_X20initiatorICAC_X20_X3D_X20), - /* K55 */ be_nested_str_weak(MTR_X3A_X20_X2A_X20ec_signature_X20_X20_X3D_X20), - /* K56 */ be_nested_str_weak(MTR_X3A_X20initiatorNOCTLV_X20_X3D_X20), - /* K57 */ be_nested_str_weak(findsub), - /* K58 */ be_nested_str_weak(int), - /* K59 */ be_nested_str_weak(peer_node_id), - /* K60 */ be_nested_str_weak(int64), - /* K61 */ be_nested_str_weak(fromu32), - /* K62 */ be_nested_str_weak(tobytes), - /* K63 */ be_nested_str_weak(MTR_X3A_X20initiatorFabricId_X3D), - /* K64 */ be_nested_str_weak(Matter_TLV_struct), - /* K65 */ be_nested_str_weak(add_TLV), - /* K66 */ be_nested_str_weak(B1), - /* K67 */ be_nested_str_weak(__initiator_pub), - /* K68 */ be_nested_str_weak(__responder_pub), - /* K69 */ be_nested_str_weak(MTR_X3A_X20_X2A_X20sigma3_tbs_X20_X20_X20_X20_X3D_X20), - /* K70 */ be_nested_str_weak(tlv2raw), - /* K71 */ be_nested_str_weak(MTR_X3A_X20_X2A_X20sigma3_tbs_raw_X3D_X20), - /* K72 */ be_nested_str_weak(MTR_X3A_X20_X2A_X20initiatorNOCPubKey_X3D_X20), - /* K73 */ be_nested_str_weak(MTR_X3A_X20_X2A_X20ec_signature_X20_X20_X20_X20_X20_X20_X3D_X20), - /* K74 */ be_nested_str_weak(EC_P256), - /* K75 */ be_nested_str_weak(ecdsa_verify_sha256), - /* K76 */ be_nested_str_weak(MTR_X3A_X20sigma3_tbs_X20does_X20not_X20have_X20a_X20valid_X20signature), - /* K77 */ be_nested_str_weak(MTR_X3A_X20_X2A_X2A_X2A_X2A_X2A_X2A_X2A_X2A_X2A_X2A_X2A_X2A_X2A_X2A_X2A_X2A_X2A_X2A_X2A_X20Invalid_X20signature_X2C_X20trying_X20anyways), - /* K78 */ be_nested_str_weak(MTR_X3A_X20Sigma3_X20verified_X2C_X20computing_X20new_X20keys), - /* K79 */ be_nested_str_weak(Msg3), - /* K80 */ be_nested_str_weak(MTR_X3A_X20_X2A_X20__Msg1_X20_X20_X20_X20_X20_X20_X20_X20_X20_X20_X20_X20_X3D_X20), - /* K81 */ be_nested_str_weak(MTR_X3A_X20_X2A_X20__Msg2_X20_X20_X20_X20_X20_X20_X20_X20_X20_X20_X20_X20_X3D_X20), - /* K82 */ be_nested_str_weak(MTR_X3A_X20_X2A_X20__Msg3_X20_X20_X20_X20_X20_X20_X20_X20_X20_X20_X20_X20_X3D_X20), - /* K83 */ be_nested_str_weak(MTR_X3A_X20_X2A_X20TranscriptHash_X20_X20_X20_X20_X3D_X20), - /* K84 */ be_nested_str_weak(MTR_X3A_X20_X2A_X2A_X2A_X2A_X2A_X2A_X2A_X2A_X2A_X2A_X2A_X2A_X2A_X2A_X2A_X2A_X2A_X2A_X2A_X2A_X2A_X2A_X2A_X2A_X2A_X2A_X2A_X2A_X2A_X2A), - /* K85 */ be_nested_str_weak(MTR_X3A_X20shared_secret_X20_X3D), - /* K86 */ be_nested_str_weak(MTR_X3A_X20ipk_X20_X2B_X20hash_X20_X20_X20_X20_X3D), - /* K87 */ be_nested_str_weak(SEKeys_Info), - /* K88 */ be_nested_str_weak(rtc), - /* K89 */ be_nested_str_weak(utc), - /* K90 */ be_nested_str_weak(MTR_X3A_X20I2RKey_X20_X20_X20_X20_X20_X20_X3D), - /* K91 */ be_nested_str_weak(MTR_X3A_X20R2IKey_X20_X20_X20_X20_X20_X20_X3D), - /* K92 */ be_nested_str_weak(MTR_X3A_X20AC_X20_X20_X20_X20_X20_X20_X20_X20_X20_X20_X3D), - /* K93 */ be_nested_str_weak(close), - /* K94 */ be_nested_str_weak(set_keys), - /* K95 */ be_nested_str_weak(_breadcrumb), - /* K96 */ be_nested_str_weak(counter_snd_next), - /* K97 */ be_nested_str_weak(set_persist), - /* K98 */ be_nested_str_weak(set_no_expiration), - /* K99 */ be_nested_str_weak(persist_to_fabric), - /* K100 */ be_nested_str_weak(save), + /* K17 */ be_nested_str_weak(SHA256), + /* K18 */ be_nested_str_weak(update), + /* K19 */ be_nested_str_weak(__Msg1), + /* K20 */ be_nested_str_weak(__Msg2), + /* K21 */ be_nested_str_weak(out), + /* K22 */ be_nested_str_weak(fromstring), + /* K23 */ be_nested_str_weak(S3K_Info), + /* K24 */ be_nested_str_weak(HKDF_SHA256), + /* K25 */ be_nested_str_weak(derive), + /* K26 */ be_nested_str_weak(shared_secret), + /* K27 */ be_nested_str_weak(get_ipk_group_key), + /* K28 */ be_nested_str_weak(TBEData3Encrypted), + /* K29 */ be_const_int(2147483647), + /* K30 */ be_nested_str_weak(AES_CCM), + /* K31 */ be_nested_str_weak(TBEData3_Nonce), + /* K32 */ be_nested_str_weak(decrypt), + /* K33 */ be_nested_str_weak(tag), + /* K34 */ be_nested_str_weak(MTR_X3A_X20Tag_X20don_X27t_X20match), + /* K35 */ be_nested_str_weak(TLV), + /* K36 */ be_nested_str_weak(findsubval), + /* K37 */ be_const_int(3), + /* K38 */ be_nested_str_weak(MTR_X3A_X20initiatorNOCTLV_X20_X3D_X20), + /* K39 */ be_nested_str_weak(findsub), + /* K40 */ be_nested_str_weak(int), + /* K41 */ be_nested_str_weak(peer_node_id), + /* K42 */ be_nested_str_weak(int64), + /* K43 */ be_nested_str_weak(fromu32), + /* K44 */ be_nested_str_weak(tobytes), + /* K45 */ be_nested_str_weak(MTR_X3A_X20initiatorFabricId_X3D), + /* K46 */ be_nested_str_weak(Matter_TLV_struct), + /* K47 */ be_nested_str_weak(add_TLV), + /* K48 */ be_nested_str_weak(B1), + /* K49 */ be_nested_str_weak(__initiator_pub), + /* K50 */ be_nested_str_weak(__responder_pub), + /* K51 */ be_nested_str_weak(tlv2raw), + /* K52 */ be_nested_str_weak(EC_P256), + /* K53 */ be_nested_str_weak(ecdsa_verify_sha256), + /* K54 */ be_nested_str_weak(MTR_X3A_X20sigma3_tbs_X20does_X20not_X20have_X20a_X20valid_X20signature), + /* K55 */ be_nested_str_weak(MTR_X3A_X20_X2A_X2A_X2A_X2A_X2A_X2A_X2A_X2A_X2A_X2A_X2A_X2A_X2A_X2A_X2A_X2A_X2A_X2A_X2A_X20Invalid_X20signature_X2C_X20trying_X20anyways), + /* K56 */ be_nested_str_weak(MTR_X3A_X20Sigma3_X20verified_X2C_X20computing_X20new_X20keys), + /* K57 */ be_nested_str_weak(Msg3), + /* K58 */ be_nested_str_weak(SEKeys_Info), + /* K59 */ be_nested_str_weak(rtc), + /* K60 */ be_nested_str_weak(utc), + /* K61 */ be_nested_str_weak(close), + /* K62 */ be_nested_str_weak(set_keys), + /* K63 */ be_nested_str_weak(_breadcrumb), + /* K64 */ be_nested_str_weak(counter_snd_next), + /* K65 */ be_nested_str_weak(set_persist), + /* K66 */ be_nested_str_weak(set_no_expiration), + /* K67 */ be_nested_str_weak(persist_to_fabric), + /* K68 */ be_nested_str_weak(save), }), be_str_weak(parse_Sigma3), &be_const_str_solidified, - ( &(const binstruction[554]) { /* code */ + ( &(const binstruction[303]) { /* code */ 0xA40A0000, // 0000 IMPORT R2 K0 0x880C0301, // 0001 GETMBR R3 R1 K1 0x54120031, // 0002 LDINT R4 50 @@ -1024,527 +992,276 @@ be_local_closure(Matter_Commisioning_Context_parse_Sigma3, /* name */ 0x8818030F, // 001E GETMBR R6 R1 K15 0x881C0310, // 001F GETMBR R7 R1 K16 0x7C100600, // 0020 CALL R4 3 - 0xB8160A00, // 0021 GETNGBL R5 K5 - 0x8C140B06, // 0022 GETMET R5 R5 K6 - 0x581C0011, // 0023 LDCONST R7 K17 - 0x54220003, // 0024 LDINT R8 4 - 0x7C140600, // 0025 CALL R5 3 - 0x8C140512, // 0026 GETMET R5 R2 K18 - 0x7C140200, // 0027 CALL R5 1 - 0x8C140B13, // 0028 GETMET R5 R5 K19 - 0x881C0714, // 0029 GETMBR R7 R3 K20 - 0x7C140400, // 002A CALL R5 2 - 0x8C140B13, // 002B GETMET R5 R5 K19 - 0x881C0715, // 002C GETMBR R7 R3 K21 - 0x7C140400, // 002D CALL R5 2 - 0x8C140B16, // 002E GETMET R5 R5 K22 - 0x7C140200, // 002F CALL R5 1 - 0xB81A0A00, // 0030 GETNGBL R6 K5 - 0x8C180D06, // 0031 GETMET R6 R6 K6 - 0x60200008, // 0032 GETGBL R8 G8 - 0x5C240600, // 0033 MOVE R9 R3 - 0x7C200200, // 0034 CALL R8 1 - 0x00222E08, // 0035 ADD R8 K23 R8 - 0x54260003, // 0036 LDINT R9 4 - 0x7C180600, // 0037 CALL R6 3 - 0xB81A0A00, // 0038 GETNGBL R6 K5 - 0x8C180D06, // 0039 GETMET R6 R6 K6 - 0x60200008, // 003A GETGBL R8 G8 - 0x8C240719, // 003B GETMET R9 R3 K25 - 0x7C240200, // 003C CALL R9 1 - 0x7C200200, // 003D CALL R8 1 - 0x00223008, // 003E ADD R8 K24 R8 - 0x54260003, // 003F LDINT R9 4 - 0x7C180600, // 0040 CALL R6 3 - 0xB81A0A00, // 0041 GETNGBL R6 K5 - 0x8C180D06, // 0042 GETMET R6 R6 K6 - 0x60200008, // 0043 GETGBL R8 G8 - 0x8C24071B, // 0044 GETMET R9 R3 K27 - 0x7C240200, // 0045 CALL R9 1 - 0x7C200200, // 0046 CALL R8 1 - 0x00223408, // 0047 ADD R8 K26 R8 - 0x54260003, // 0048 LDINT R9 4 - 0x7C180600, // 0049 CALL R6 3 - 0xB81A0A00, // 004A GETNGBL R6 K5 - 0x8C180D06, // 004B GETMET R6 R6 K6 - 0x8C20071D, // 004C GETMET R8 R3 K29 - 0x7C200200, // 004D CALL R8 1 - 0x8C20111E, // 004E GETMET R8 R8 K30 - 0x7C200200, // 004F CALL R8 1 - 0x00223808, // 0050 ADD R8 K28 R8 - 0x54260003, // 0051 LDINT R9 4 - 0x7C180600, // 0052 CALL R6 3 - 0xB81A0A00, // 0053 GETNGBL R6 K5 - 0x8C180D06, // 0054 GETMET R6 R6 K6 - 0x8C200B1E, // 0055 GETMET R8 R5 K30 - 0x7C200200, // 0056 CALL R8 1 - 0x00223E08, // 0057 ADD R8 K31 R8 - 0x54260003, // 0058 LDINT R9 4 - 0x7C180600, // 0059 CALL R6 3 - 0x60180015, // 005A GETGBL R6 G21 - 0x7C180000, // 005B CALL R6 0 - 0x8C180D20, // 005C GETMET R6 R6 K32 - 0x88200121, // 005D GETMBR R8 R0 K33 - 0x7C180400, // 005E CALL R6 2 - 0x8C1C0522, // 005F GETMET R7 R2 K34 - 0x7C1C0200, // 0060 CALL R7 1 - 0x8C1C0F23, // 0061 GETMET R7 R7 K35 - 0x88240724, // 0062 GETMBR R9 R3 K36 - 0x8C28071D, // 0063 GETMET R10 R3 K29 - 0x7C280200, // 0064 CALL R10 1 - 0x00281405, // 0065 ADD R10 R10 R5 - 0x5C2C0C00, // 0066 MOVE R11 R6 - 0x5432000F, // 0067 LDINT R12 16 - 0x7C1C0A00, // 0068 CALL R7 5 - 0xB8220A00, // 0069 GETNGBL R8 K5 - 0x8C201106, // 006A GETMET R8 R8 K6 - 0x58280011, // 006B LDCONST R10 K17 - 0x542E0003, // 006C LDINT R11 4 - 0x7C200600, // 006D CALL R8 3 - 0xB8220A00, // 006E GETNGBL R8 K5 - 0x8C201106, // 006F GETMET R8 R8 K6 - 0x8C28071D, // 0070 GETMET R10 R3 K29 - 0x7C280200, // 0071 CALL R10 1 - 0x00281405, // 0072 ADD R10 R10 R5 - 0x8C28151E, // 0073 GETMET R10 R10 K30 - 0x7C280200, // 0074 CALL R10 1 - 0x002A4A0A, // 0075 ADD R10 K37 R10 - 0x542E0003, // 0076 LDINT R11 4 - 0x7C200600, // 0077 CALL R8 3 - 0xB8220A00, // 0078 GETNGBL R8 K5 - 0x8C201106, // 0079 GETMET R8 R8 K6 - 0x8C280F1E, // 007A GETMET R10 R7 K30 - 0x7C280200, // 007B CALL R10 1 - 0x002A4C0A, // 007C ADD R10 K38 R10 - 0x542E0003, // 007D LDINT R11 4 - 0x7C200600, // 007E CALL R8 3 - 0xB8220A00, // 007F GETNGBL R8 K5 - 0x8C201106, // 0080 GETMET R8 R8 K6 - 0x58280011, // 0081 LDCONST R10 K17 - 0x542E0003, // 0082 LDINT R11 4 - 0x7C200600, // 0083 CALL R8 3 - 0x5421FFEE, // 0084 LDINT R8 -17 - 0x40220608, // 0085 CONNECT R8 K3 R8 - 0x88240927, // 0086 GETMBR R9 R4 K39 - 0x94201208, // 0087 GETIDX R8 R9 R8 - 0x5429FFEF, // 0088 LDINT R10 -16 - 0x40281528, // 0089 CONNECT R10 R10 K40 - 0x882C0927, // 008A GETMBR R11 R4 K39 - 0x9424160A, // 008B GETIDX R9 R11 R10 - 0x8C300529, // 008C GETMET R12 R2 K41 - 0x5C380E00, // 008D MOVE R14 R7 - 0x603C0015, // 008E GETGBL R15 G21 - 0x7C3C0000, // 008F CALL R15 0 - 0x8C3C1F20, // 0090 GETMET R15 R15 K32 - 0x8844012A, // 0091 GETMBR R17 R0 K42 - 0x7C3C0400, // 0092 CALL R15 2 - 0x60400015, // 0093 GETGBL R16 G21 - 0x7C400000, // 0094 CALL R16 0 - 0x6044000C, // 0095 GETGBL R17 G12 - 0x5C481000, // 0096 MOVE R18 R8 - 0x7C440200, // 0097 CALL R17 1 - 0x544A000F, // 0098 LDINT R18 16 - 0x7C300C00, // 0099 CALL R12 6 - 0x5C281800, // 009A MOVE R10 R12 - 0x8C30152B, // 009B GETMET R12 R10 K43 - 0x5C381000, // 009C MOVE R14 R8 - 0x7C300400, // 009D CALL R12 2 - 0x5C2C1800, // 009E MOVE R11 R12 - 0x8C30152C, // 009F GETMET R12 R10 K44 - 0x7C300200, // 00A0 CALL R12 1 - 0xB8360A00, // 00A1 GETNGBL R13 K5 - 0x8C341B06, // 00A2 GETMET R13 R13 K6 - 0x8C3C171E, // 00A3 GETMET R15 R11 K30 - 0x7C3C0200, // 00A4 CALL R15 1 - 0x003E5A0F, // 00A5 ADD R15 K45 R15 - 0x54420003, // 00A6 LDINT R16 4 - 0x7C340600, // 00A7 CALL R13 3 - 0xB8360A00, // 00A8 GETNGBL R13 K5 - 0x8C341B06, // 00A9 GETMET R13 R13 K6 - 0x8C3C191E, // 00AA GETMET R15 R12 K30 - 0x7C3C0200, // 00AB CALL R15 1 - 0x003E5C0F, // 00AC ADD R15 K46 R15 - 0x54420003, // 00AD LDINT R16 4 - 0x7C340600, // 00AE CALL R13 3 - 0xB8360A00, // 00AF GETNGBL R13 K5 - 0x8C341B06, // 00B0 GETMET R13 R13 K6 - 0x8C3C131E, // 00B1 GETMET R15 R9 K30 - 0x7C3C0200, // 00B2 CALL R15 1 - 0x003E5E0F, // 00B3 ADD R15 K47 R15 - 0x54420003, // 00B4 LDINT R16 4 - 0x7C340600, // 00B5 CALL R13 3 - 0xB8360A00, // 00B6 GETNGBL R13 K5 - 0x8C341B06, // 00B7 GETMET R13 R13 K6 - 0x583C0011, // 00B8 LDCONST R15 K17 - 0x54420003, // 00B9 LDINT R16 4 - 0x7C340600, // 00BA CALL R13 3 - 0x20341809, // 00BB NE R13 R12 R9 - 0x78360012, // 00BC JMPF R13 #00D0 - 0xB8360A00, // 00BD GETNGBL R13 K5 - 0x8C341B06, // 00BE GETMET R13 R13 K6 - 0x583C0030, // 00BF LDCONST R15 K48 - 0x58400008, // 00C0 LDCONST R16 K8 - 0x7C340600, // 00C1 CALL R13 3 - 0xB8360A00, // 00C2 GETNGBL R13 K5 - 0x8C341B06, // 00C3 GETMET R13 R13 K6 - 0x583C0007, // 00C4 LDCONST R15 K7 - 0x58400008, // 00C5 LDCONST R16 K8 - 0x7C340600, // 00C6 CALL R13 3 - 0x8C340109, // 00C7 GETMET R13 R0 K9 - 0x5C3C0200, // 00C8 MOVE R15 R1 - 0x5840000A, // 00C9 LDCONST R16 K10 - 0x58440003, // 00CA LDCONST R17 K3 - 0x58480008, // 00CB LDCONST R18 K8 - 0x504C0000, // 00CC LDBOOL R19 0 0 - 0x7C340C00, // 00CD CALL R13 6 - 0x50340000, // 00CE LDBOOL R13 0 0 - 0x80041A00, // 00CF RET 1 R13 - 0xB8361800, // 00D0 GETNGBL R13 K12 - 0x88341B31, // 00D1 GETMBR R13 R13 K49 - 0x8C341B0E, // 00D2 GETMET R13 R13 K14 - 0x5C3C1600, // 00D3 MOVE R15 R11 - 0x7C340400, // 00D4 CALL R13 2 - 0xB83A0A00, // 00D5 GETNGBL R14 K5 - 0x8C381D06, // 00D6 GETMET R14 R14 K6 - 0x60400008, // 00D7 GETGBL R16 G8 - 0x5C441A00, // 00D8 MOVE R17 R13 - 0x7C400200, // 00D9 CALL R16 1 - 0x00426410, // 00DA ADD R16 K50 R16 - 0x54460003, // 00DB LDINT R17 4 - 0x7C380600, // 00DC CALL R14 3 - 0x8C381B33, // 00DD GETMET R14 R13 K51 - 0x5840000A, // 00DE LDCONST R16 K10 - 0x7C380400, // 00DF CALL R14 2 - 0x8C3C1B33, // 00E0 GETMET R15 R13 K51 - 0x58440008, // 00E1 LDCONST R17 K8 - 0x7C3C0400, // 00E2 CALL R15 2 - 0x8C401B33, // 00E3 GETMET R16 R13 K51 - 0x58480034, // 00E4 LDCONST R18 K52 - 0x7C400400, // 00E5 CALL R16 2 - 0xB8460A00, // 00E6 GETNGBL R17 K5 - 0x8C442306, // 00E7 GETMET R17 R17 K6 - 0x604C0008, // 00E8 GETGBL R19 G8 - 0x5C501C00, // 00E9 MOVE R20 R14 - 0x7C4C0200, // 00EA CALL R19 1 - 0x004E6A13, // 00EB ADD R19 K53 R19 - 0x54520003, // 00EC LDINT R20 4 - 0x7C440600, // 00ED CALL R17 3 - 0xB8460A00, // 00EE GETNGBL R17 K5 - 0x8C442306, // 00EF GETMET R17 R17 K6 - 0x604C0008, // 00F0 GETGBL R19 G8 - 0x5C501E00, // 00F1 MOVE R20 R15 - 0x7C4C0200, // 00F2 CALL R19 1 - 0x004E6C13, // 00F3 ADD R19 K54 R19 - 0x54520003, // 00F4 LDINT R20 4 - 0x7C440600, // 00F5 CALL R17 3 - 0xB8460A00, // 00F6 GETNGBL R17 K5 - 0x8C442306, // 00F7 GETMET R17 R17 K6 - 0x604C0008, // 00F8 GETGBL R19 G8 - 0x5C502000, // 00F9 MOVE R20 R16 - 0x7C4C0200, // 00FA CALL R19 1 - 0x004E6E13, // 00FB ADD R19 K55 R19 - 0x54520003, // 00FC LDINT R20 4 - 0x7C440600, // 00FD CALL R17 3 - 0xB8461800, // 00FE GETNGBL R17 K12 - 0x88442331, // 00FF GETMBR R17 R17 K49 - 0x8C44230E, // 0100 GETMET R17 R17 K14 - 0x5C4C1C00, // 0101 MOVE R19 R14 - 0x7C440400, // 0102 CALL R17 2 - 0xB84A0A00, // 0103 GETNGBL R18 K5 - 0x8C482506, // 0104 GETMET R18 R18 K6 - 0x60500008, // 0105 GETGBL R20 G8 - 0x5C542200, // 0106 MOVE R21 R17 - 0x7C500200, // 0107 CALL R20 1 - 0x00527014, // 0108 ADD R20 K56 R20 - 0x58540034, // 0109 LDCONST R21 K52 - 0x7C480600, // 010A CALL R18 3 - 0x8C482333, // 010B GETMET R18 R17 K51 - 0x54520008, // 010C LDINT R20 9 - 0x7C480400, // 010D CALL R18 2 - 0x8C4C2339, // 010E GETMET R19 R17 K57 - 0x54560005, // 010F LDINT R21 6 - 0x7C4C0400, // 0110 CALL R19 2 - 0x8C502733, // 0111 GETMET R20 R19 K51 - 0x545A0010, // 0112 LDINT R22 17 - 0x7C500400, // 0113 CALL R20 2 - 0x60540004, // 0114 GETGBL R21 G4 - 0x5C582800, // 0115 MOVE R22 R20 - 0x7C540200, // 0116 CALL R21 1 - 0x1C542B3A, // 0117 EQ R21 R21 K58 - 0x78560007, // 0118 JMPF R21 #0121 - 0xB8567800, // 0119 GETNGBL R21 K60 - 0x8C542B3D, // 011A GETMET R21 R21 K61 - 0x5C5C2800, // 011B MOVE R23 R20 - 0x7C540400, // 011C CALL R21 2 - 0x8C542B3E, // 011D GETMET R21 R21 K62 - 0x7C540200, // 011E CALL R21 1 - 0x900E7615, // 011F SETMBR R3 K59 R21 - 0x70020002, // 0120 JMP #0124 - 0x8C54293E, // 0121 GETMET R21 R20 K62 - 0x7C540200, // 0122 CALL R21 1 - 0x900E7615, // 0123 SETMBR R3 K59 R21 - 0xB8560A00, // 0124 GETNGBL R21 K5 - 0x8C542B06, // 0125 GETMET R21 R21 K6 - 0x605C0008, // 0126 GETGBL R23 G8 - 0x8860073B, // 0127 GETMBR R24 R3 K59 - 0x7C5C0200, // 0128 CALL R23 1 - 0x005E7E17, // 0129 ADD R23 K63 R23 - 0x58600034, // 012A LDCONST R24 K52 - 0x7C540600, // 012B CALL R21 3 - 0xB8561800, // 012C GETNGBL R21 K12 - 0x88542B31, // 012D GETMBR R21 R21 K49 - 0x8C542B40, // 012E GETMET R21 R21 K64 - 0x7C540200, // 012F CALL R21 1 - 0x8C582B41, // 0130 GETMET R22 R21 K65 - 0x5860000A, // 0131 LDCONST R24 K10 - 0xB8661800, // 0132 GETNGBL R25 K12 - 0x88643331, // 0133 GETMBR R25 R25 K49 - 0x88643342, // 0134 GETMBR R25 R25 K66 - 0x5C681C00, // 0135 MOVE R26 R14 - 0x7C580800, // 0136 CALL R22 4 - 0x8C582B41, // 0137 GETMET R22 R21 K65 - 0x58600008, // 0138 LDCONST R24 K8 - 0xB8661800, // 0139 GETNGBL R25 K12 - 0x88643331, // 013A GETMBR R25 R25 K49 - 0x88643342, // 013B GETMBR R25 R25 K66 - 0x5C681E00, // 013C MOVE R26 R15 - 0x7C580800, // 013D CALL R22 4 - 0x8C582B41, // 013E GETMET R22 R21 K65 - 0x58600034, // 013F LDCONST R24 K52 - 0xB8661800, // 0140 GETNGBL R25 K12 - 0x88643331, // 0141 GETMBR R25 R25 K49 - 0x88643342, // 0142 GETMBR R25 R25 K66 - 0x88680743, // 0143 GETMBR R26 R3 K67 - 0x7C580800, // 0144 CALL R22 4 - 0x8C582B41, // 0145 GETMET R22 R21 K65 - 0x54620003, // 0146 LDINT R24 4 - 0xB8661800, // 0147 GETNGBL R25 K12 - 0x88643331, // 0148 GETMBR R25 R25 K49 - 0x88643342, // 0149 GETMBR R25 R25 K66 - 0x88680744, // 014A GETMBR R26 R3 K68 - 0x7C580800, // 014B CALL R22 4 - 0xB85A0A00, // 014C GETNGBL R22 K5 - 0x8C582D06, // 014D GETMET R22 R22 K6 - 0x60600008, // 014E GETGBL R24 G8 - 0x5C642A00, // 014F MOVE R25 R21 - 0x7C600200, // 0150 CALL R24 1 - 0x00628A18, // 0151 ADD R24 K69 R24 - 0x54660003, // 0152 LDINT R25 4 - 0x7C580600, // 0153 CALL R22 3 - 0x8C582B46, // 0154 GETMET R22 R21 K70 - 0x7C580200, // 0155 CALL R22 1 - 0xB85E0A00, // 0156 GETNGBL R23 K5 - 0x8C5C2F06, // 0157 GETMET R23 R23 K6 - 0x8C642D1E, // 0158 GETMET R25 R22 K30 - 0x7C640200, // 0159 CALL R25 1 - 0x00668E19, // 015A ADD R25 K71 R25 - 0x546A0003, // 015B LDINT R26 4 - 0x7C5C0600, // 015C CALL R23 3 - 0xB85E0A00, // 015D GETNGBL R23 K5 - 0x8C5C2F06, // 015E GETMET R23 R23 K6 - 0x8C64251E, // 015F GETMET R25 R18 K30 - 0x7C640200, // 0160 CALL R25 1 - 0x00669019, // 0161 ADD R25 K72 R25 - 0x546A0003, // 0162 LDINT R26 4 - 0x7C5C0600, // 0163 CALL R23 3 - 0xB85E0A00, // 0164 GETNGBL R23 K5 - 0x8C5C2F06, // 0165 GETMET R23 R23 K6 - 0x8C64211E, // 0166 GETMET R25 R16 K30 - 0x7C640200, // 0167 CALL R25 1 - 0x00669219, // 0168 ADD R25 K73 R25 - 0x546A0003, // 0169 LDINT R26 4 - 0x7C5C0600, // 016A CALL R23 3 - 0xB85E0A00, // 016B GETNGBL R23 K5 - 0x8C5C2F06, // 016C GETMET R23 R23 K6 - 0x58640011, // 016D LDCONST R25 K17 - 0x546A0003, // 016E LDINT R26 4 - 0x7C5C0600, // 016F CALL R23 3 - 0x8C5C054A, // 0170 GETMET R23 R2 K74 - 0x7C5C0200, // 0171 CALL R23 1 - 0x8C5C2F4B, // 0172 GETMET R23 R23 K75 - 0x5C642400, // 0173 MOVE R25 R18 - 0x5C682C00, // 0174 MOVE R26 R22 - 0x5C6C2000, // 0175 MOVE R27 R16 - 0x7C5C0800, // 0176 CALL R23 4 - 0x5C602E00, // 0177 MOVE R24 R23 - 0x7462000A, // 0178 JMPT R24 #0184 - 0xB8620A00, // 0179 GETNGBL R24 K5 - 0x8C603106, // 017A GETMET R24 R24 K6 - 0x5868004C, // 017B LDCONST R26 K76 - 0x586C0008, // 017C LDCONST R27 K8 - 0x7C600600, // 017D CALL R24 3 - 0xB8620A00, // 017E GETNGBL R24 K5 - 0x8C603106, // 017F GETMET R24 R24 K6 - 0x5868004D, // 0180 LDCONST R26 K77 - 0x586C0008, // 0181 LDCONST R27 K8 - 0x7C600600, // 0182 CALL R24 3 - 0x70020004, // 0183 JMP #0189 - 0xB8620A00, // 0184 GETNGBL R24 K5 - 0x8C603106, // 0185 GETMET R24 R24 K6 - 0x5868004E, // 0186 LDCONST R26 K78 - 0x586C0034, // 0187 LDCONST R27 K52 - 0x7C600600, // 0188 CALL R24 3 - 0x8C600512, // 0189 GETMET R24 R2 K18 - 0x7C600200, // 018A CALL R24 1 - 0x8C603113, // 018B GETMET R24 R24 K19 - 0x88680714, // 018C GETMBR R26 R3 K20 - 0x7C600400, // 018D CALL R24 2 - 0x8C603113, // 018E GETMET R24 R24 K19 - 0x88680715, // 018F GETMBR R26 R3 K21 - 0x7C600400, // 0190 CALL R24 2 - 0x8C603113, // 0191 GETMET R24 R24 K19 - 0x8868094F, // 0192 GETMBR R26 R4 K79 - 0x7C600400, // 0193 CALL R24 2 - 0x8C603116, // 0194 GETMET R24 R24 K22 - 0x7C600200, // 0195 CALL R24 1 - 0x5C143000, // 0196 MOVE R5 R24 - 0xB8620A00, // 0197 GETNGBL R24 K5 - 0x8C603106, // 0198 GETMET R24 R24 K6 - 0x88680714, // 0199 GETMBR R26 R3 K20 - 0x8C68351E, // 019A GETMET R26 R26 K30 - 0x7C680200, // 019B CALL R26 1 - 0x006AA01A, // 019C ADD R26 K80 R26 - 0x546E0003, // 019D LDINT R27 4 - 0x7C600600, // 019E CALL R24 3 - 0xB8620A00, // 019F GETNGBL R24 K5 - 0x8C603106, // 01A0 GETMET R24 R24 K6 - 0x88680715, // 01A1 GETMBR R26 R3 K21 - 0x8C68351E, // 01A2 GETMET R26 R26 K30 - 0x7C680200, // 01A3 CALL R26 1 - 0x006AA21A, // 01A4 ADD R26 K81 R26 - 0x546E0003, // 01A5 LDINT R27 4 - 0x7C600600, // 01A6 CALL R24 3 - 0xB8620A00, // 01A7 GETNGBL R24 K5 - 0x8C603106, // 01A8 GETMET R24 R24 K6 - 0x8868094F, // 01A9 GETMBR R26 R4 K79 - 0x8C68351E, // 01AA GETMET R26 R26 K30 - 0x7C680200, // 01AB CALL R26 1 - 0x006AA41A, // 01AC ADD R26 K82 R26 - 0x546E0003, // 01AD LDINT R27 4 - 0x7C600600, // 01AE CALL R24 3 - 0xB8620A00, // 01AF GETNGBL R24 K5 - 0x8C603106, // 01B0 GETMET R24 R24 K6 - 0x8C680B1E, // 01B1 GETMET R26 R5 K30 - 0x7C680200, // 01B2 CALL R26 1 - 0x006AA61A, // 01B3 ADD R26 K83 R26 - 0x546E0003, // 01B4 LDINT R27 4 - 0x7C600600, // 01B5 CALL R24 3 - 0x4C600000, // 01B6 LDNIL R24 - 0x900E2818, // 01B7 SETMBR R3 K20 R24 - 0x4C600000, // 01B8 LDNIL R24 - 0x900E2A18, // 01B9 SETMBR R3 K21 R24 - 0xB8620A00, // 01BA GETNGBL R24 K5 - 0x8C603106, // 01BB GETMET R24 R24 K6 - 0x58680054, // 01BC LDCONST R26 K84 - 0x546E0003, // 01BD LDINT R27 4 - 0x7C600600, // 01BE CALL R24 3 - 0xB8620A00, // 01BF GETNGBL R24 K5 - 0x8C603106, // 01C0 GETMET R24 R24 K6 - 0x88680724, // 01C1 GETMBR R26 R3 K36 - 0x8C68351E, // 01C2 GETMET R26 R26 K30 - 0x7C680200, // 01C3 CALL R26 1 - 0x006AAA1A, // 01C4 ADD R26 K85 R26 - 0x546E0003, // 01C5 LDINT R27 4 - 0x7C600600, // 01C6 CALL R24 3 - 0xB8620A00, // 01C7 GETNGBL R24 K5 - 0x8C603106, // 01C8 GETMET R24 R24 K6 - 0x8C68071D, // 01C9 GETMET R26 R3 K29 - 0x7C680200, // 01CA CALL R26 1 - 0x00683405, // 01CB ADD R26 R26 R5 - 0x8C68351E, // 01CC GETMET R26 R26 K30 - 0x7C680200, // 01CD CALL R26 1 - 0x006AAC1A, // 01CE ADD R26 K86 R26 - 0x546E0003, // 01CF LDINT R27 4 - 0x7C600600, // 01D0 CALL R24 3 - 0x8C600522, // 01D1 GETMET R24 R2 K34 - 0x7C600200, // 01D2 CALL R24 1 - 0x8C603123, // 01D3 GETMET R24 R24 K35 - 0x88680724, // 01D4 GETMBR R26 R3 K36 - 0x8C6C071D, // 01D5 GETMET R27 R3 K29 - 0x7C6C0200, // 01D6 CALL R27 1 - 0x006C3605, // 01D7 ADD R27 R27 R5 - 0x60700015, // 01D8 GETGBL R28 G21 - 0x7C700000, // 01D9 CALL R28 0 - 0x8C703920, // 01DA GETMET R28 R28 K32 - 0x88780157, // 01DB GETMBR R30 R0 K87 - 0x7C700400, // 01DC CALL R28 2 - 0x5476002F, // 01DD LDINT R29 48 - 0x7C600A00, // 01DE CALL R24 5 - 0x5466000E, // 01DF LDINT R25 15 - 0x40660619, // 01E0 CONNECT R25 K3 R25 - 0x94643019, // 01E1 GETIDX R25 R24 R25 - 0x546A000F, // 01E2 LDINT R26 16 - 0x546E001E, // 01E3 LDINT R27 31 - 0x4068341B, // 01E4 CONNECT R26 R26 R27 - 0x9468301A, // 01E5 GETIDX R26 R24 R26 - 0x546E001F, // 01E6 LDINT R27 32 - 0x5472002E, // 01E7 LDINT R28 47 - 0x406C361C, // 01E8 CONNECT R27 R27 R28 - 0x946C301B, // 01E9 GETIDX R27 R24 R27 - 0xB8720A00, // 01EA GETNGBL R28 K5 - 0x8C703958, // 01EB GETMET R28 R28 K88 - 0x7C700200, // 01EC CALL R28 1 - 0x94703959, // 01ED GETIDX R28 R28 K89 - 0xB8760A00, // 01EE GETNGBL R29 K5 - 0x8C743B06, // 01EF GETMET R29 R29 K6 - 0x587C0054, // 01F0 LDCONST R31 K84 - 0x54820003, // 01F1 LDINT R32 4 - 0x7C740600, // 01F2 CALL R29 3 - 0xB8760A00, // 01F3 GETNGBL R29 K5 - 0x8C743B06, // 01F4 GETMET R29 R29 K6 - 0x8C7C331E, // 01F5 GETMET R31 R25 K30 - 0x7C7C0200, // 01F6 CALL R31 1 - 0x007EB41F, // 01F7 ADD R31 K90 R31 - 0x54820003, // 01F8 LDINT R32 4 - 0x7C740600, // 01F9 CALL R29 3 - 0xB8760A00, // 01FA GETNGBL R29 K5 - 0x8C743B06, // 01FB GETMET R29 R29 K6 - 0x8C7C351E, // 01FC GETMET R31 R26 K30 - 0x7C7C0200, // 01FD CALL R31 1 - 0x007EB61F, // 01FE ADD R31 K91 R31 - 0x54820003, // 01FF LDINT R32 4 - 0x7C740600, // 0200 CALL R29 3 - 0xB8760A00, // 0201 GETNGBL R29 K5 - 0x8C743B06, // 0202 GETMET R29 R29 K6 - 0x8C7C371E, // 0203 GETMET R31 R27 K30 - 0x7C7C0200, // 0204 CALL R31 1 - 0x007EB81F, // 0205 ADD R31 K92 R31 - 0x54820003, // 0206 LDINT R32 4 - 0x7C740600, // 0207 CALL R29 3 - 0xB8760A00, // 0208 GETNGBL R29 K5 - 0x8C743B06, // 0209 GETMET R29 R29 K6 - 0x587C0054, // 020A LDCONST R31 K84 - 0x54820003, // 020B LDINT R32 4 - 0x7C740600, // 020C CALL R29 3 - 0x8C740109, // 020D GETMET R29 R0 K9 - 0x5C7C0200, // 020E MOVE R31 R1 - 0x58800003, // 020F LDCONST R32 K3 - 0x58840003, // 0210 LDCONST R33 K3 - 0x58880003, // 0211 LDCONST R34 K3 - 0x508C0200, // 0212 LDBOOL R35 1 0 - 0x7C740C00, // 0213 CALL R29 6 - 0x8C74075D, // 0214 GETMET R29 R3 K93 - 0x7C740200, // 0215 CALL R29 1 - 0x8C74075E, // 0216 GETMET R29 R3 K94 - 0x5C7C3200, // 0217 MOVE R31 R25 - 0x5C803400, // 0218 MOVE R32 R26 - 0x5C843600, // 0219 MOVE R33 R27 - 0x5C883800, // 021A MOVE R34 R28 - 0x7C740A00, // 021B CALL R29 5 - 0x900EBF03, // 021C SETMBR R3 K95 K3 - 0x8C740760, // 021D GETMET R29 R3 K96 - 0x7C740200, // 021E CALL R29 1 - 0x8C740761, // 021F GETMET R29 R3 K97 - 0x507C0200, // 0220 LDBOOL R31 1 0 - 0x7C740400, // 0221 CALL R29 2 - 0x8C740762, // 0222 GETMET R29 R3 K98 - 0x7C740200, // 0223 CALL R29 1 - 0x8C740763, // 0224 GETMET R29 R3 K99 - 0x7C740200, // 0225 CALL R29 1 - 0x8C740764, // 0226 GETMET R29 R3 K100 - 0x7C740200, // 0227 CALL R29 1 - 0x50740200, // 0228 LDBOOL R29 1 0 - 0x80043A00, // 0229 RET 1 R29 + 0x8C140511, // 0021 GETMET R5 R2 K17 + 0x7C140200, // 0022 CALL R5 1 + 0x8C140B12, // 0023 GETMET R5 R5 K18 + 0x881C0713, // 0024 GETMBR R7 R3 K19 + 0x7C140400, // 0025 CALL R5 2 + 0x8C140B12, // 0026 GETMET R5 R5 K18 + 0x881C0714, // 0027 GETMBR R7 R3 K20 + 0x7C140400, // 0028 CALL R5 2 + 0x8C140B15, // 0029 GETMET R5 R5 K21 + 0x7C140200, // 002A CALL R5 1 + 0x60180015, // 002B GETGBL R6 G21 + 0x7C180000, // 002C CALL R6 0 + 0x8C180D16, // 002D GETMET R6 R6 K22 + 0x88200117, // 002E GETMBR R8 R0 K23 + 0x7C180400, // 002F CALL R6 2 + 0x8C1C0518, // 0030 GETMET R7 R2 K24 + 0x7C1C0200, // 0031 CALL R7 1 + 0x8C1C0F19, // 0032 GETMET R7 R7 K25 + 0x8824071A, // 0033 GETMBR R9 R3 K26 + 0x8C28071B, // 0034 GETMET R10 R3 K27 + 0x7C280200, // 0035 CALL R10 1 + 0x00281405, // 0036 ADD R10 R10 R5 + 0x5C2C0C00, // 0037 MOVE R11 R6 + 0x5432000F, // 0038 LDINT R12 16 + 0x7C1C0A00, // 0039 CALL R7 5 + 0x5421FFEE, // 003A LDINT R8 -17 + 0x40220608, // 003B CONNECT R8 K3 R8 + 0x8824091C, // 003C GETMBR R9 R4 K28 + 0x94201208, // 003D GETIDX R8 R9 R8 + 0x5429FFEF, // 003E LDINT R10 -16 + 0x4028151D, // 003F CONNECT R10 R10 K29 + 0x882C091C, // 0040 GETMBR R11 R4 K28 + 0x9424160A, // 0041 GETIDX R9 R11 R10 + 0x8C30051E, // 0042 GETMET R12 R2 K30 + 0x5C380E00, // 0043 MOVE R14 R7 + 0x603C0015, // 0044 GETGBL R15 G21 + 0x7C3C0000, // 0045 CALL R15 0 + 0x8C3C1F16, // 0046 GETMET R15 R15 K22 + 0x8844011F, // 0047 GETMBR R17 R0 K31 + 0x7C3C0400, // 0048 CALL R15 2 + 0x60400015, // 0049 GETGBL R16 G21 + 0x7C400000, // 004A CALL R16 0 + 0x6044000C, // 004B GETGBL R17 G12 + 0x5C481000, // 004C MOVE R18 R8 + 0x7C440200, // 004D CALL R17 1 + 0x544A000F, // 004E LDINT R18 16 + 0x7C300C00, // 004F CALL R12 6 + 0x5C281800, // 0050 MOVE R10 R12 + 0x8C301520, // 0051 GETMET R12 R10 K32 + 0x5C381000, // 0052 MOVE R14 R8 + 0x7C300400, // 0053 CALL R12 2 + 0x5C2C1800, // 0054 MOVE R11 R12 + 0x8C301521, // 0055 GETMET R12 R10 K33 + 0x7C300200, // 0056 CALL R12 1 + 0x20341809, // 0057 NE R13 R12 R9 + 0x78360012, // 0058 JMPF R13 #006C + 0xB8360A00, // 0059 GETNGBL R13 K5 + 0x8C341B06, // 005A GETMET R13 R13 K6 + 0x583C0022, // 005B LDCONST R15 K34 + 0x58400008, // 005C LDCONST R16 K8 + 0x7C340600, // 005D CALL R13 3 + 0xB8360A00, // 005E GETNGBL R13 K5 + 0x8C341B06, // 005F GETMET R13 R13 K6 + 0x583C0007, // 0060 LDCONST R15 K7 + 0x58400008, // 0061 LDCONST R16 K8 + 0x7C340600, // 0062 CALL R13 3 + 0x8C340109, // 0063 GETMET R13 R0 K9 + 0x5C3C0200, // 0064 MOVE R15 R1 + 0x5840000A, // 0065 LDCONST R16 K10 + 0x58440003, // 0066 LDCONST R17 K3 + 0x58480008, // 0067 LDCONST R18 K8 + 0x504C0000, // 0068 LDBOOL R19 0 0 + 0x7C340C00, // 0069 CALL R13 6 + 0x50340000, // 006A LDBOOL R13 0 0 + 0x80041A00, // 006B RET 1 R13 + 0xB8361800, // 006C GETNGBL R13 K12 + 0x88341B23, // 006D GETMBR R13 R13 K35 + 0x8C341B0E, // 006E GETMET R13 R13 K14 + 0x5C3C1600, // 006F MOVE R15 R11 + 0x7C340400, // 0070 CALL R13 2 + 0x8C381B24, // 0071 GETMET R14 R13 K36 + 0x5840000A, // 0072 LDCONST R16 K10 + 0x7C380400, // 0073 CALL R14 2 + 0x8C3C1B24, // 0074 GETMET R15 R13 K36 + 0x58440008, // 0075 LDCONST R17 K8 + 0x7C3C0400, // 0076 CALL R15 2 + 0x8C401B24, // 0077 GETMET R16 R13 K36 + 0x58480025, // 0078 LDCONST R18 K37 + 0x7C400400, // 0079 CALL R16 2 + 0xB8461800, // 007A GETNGBL R17 K12 + 0x88442323, // 007B GETMBR R17 R17 K35 + 0x8C44230E, // 007C GETMET R17 R17 K14 + 0x5C4C1C00, // 007D MOVE R19 R14 + 0x7C440400, // 007E CALL R17 2 + 0xB84A0A00, // 007F GETNGBL R18 K5 + 0x8C482506, // 0080 GETMET R18 R18 K6 + 0x60500008, // 0081 GETGBL R20 G8 + 0x5C542200, // 0082 MOVE R21 R17 + 0x7C500200, // 0083 CALL R20 1 + 0x00524C14, // 0084 ADD R20 K38 R20 + 0x58540025, // 0085 LDCONST R21 K37 + 0x7C480600, // 0086 CALL R18 3 + 0x8C482324, // 0087 GETMET R18 R17 K36 + 0x54520008, // 0088 LDINT R20 9 + 0x7C480400, // 0089 CALL R18 2 + 0x8C4C2327, // 008A GETMET R19 R17 K39 + 0x54560005, // 008B LDINT R21 6 + 0x7C4C0400, // 008C CALL R19 2 + 0x8C502724, // 008D GETMET R20 R19 K36 + 0x545A0010, // 008E LDINT R22 17 + 0x7C500400, // 008F CALL R20 2 + 0x60540004, // 0090 GETGBL R21 G4 + 0x5C582800, // 0091 MOVE R22 R20 + 0x7C540200, // 0092 CALL R21 1 + 0x1C542B28, // 0093 EQ R21 R21 K40 + 0x78560007, // 0094 JMPF R21 #009D + 0xB8565400, // 0095 GETNGBL R21 K42 + 0x8C542B2B, // 0096 GETMET R21 R21 K43 + 0x5C5C2800, // 0097 MOVE R23 R20 + 0x7C540400, // 0098 CALL R21 2 + 0x8C542B2C, // 0099 GETMET R21 R21 K44 + 0x7C540200, // 009A CALL R21 1 + 0x900E5215, // 009B SETMBR R3 K41 R21 + 0x70020002, // 009C JMP #00A0 + 0x8C54292C, // 009D GETMET R21 R20 K44 + 0x7C540200, // 009E CALL R21 1 + 0x900E5215, // 009F SETMBR R3 K41 R21 + 0xB8560A00, // 00A0 GETNGBL R21 K5 + 0x8C542B06, // 00A1 GETMET R21 R21 K6 + 0x605C0008, // 00A2 GETGBL R23 G8 + 0x88600729, // 00A3 GETMBR R24 R3 K41 + 0x7C5C0200, // 00A4 CALL R23 1 + 0x005E5A17, // 00A5 ADD R23 K45 R23 + 0x58600025, // 00A6 LDCONST R24 K37 + 0x7C540600, // 00A7 CALL R21 3 + 0xB8561800, // 00A8 GETNGBL R21 K12 + 0x88542B23, // 00A9 GETMBR R21 R21 K35 + 0x8C542B2E, // 00AA GETMET R21 R21 K46 + 0x7C540200, // 00AB CALL R21 1 + 0x8C582B2F, // 00AC GETMET R22 R21 K47 + 0x5860000A, // 00AD LDCONST R24 K10 + 0xB8661800, // 00AE GETNGBL R25 K12 + 0x88643323, // 00AF GETMBR R25 R25 K35 + 0x88643330, // 00B0 GETMBR R25 R25 K48 + 0x5C681C00, // 00B1 MOVE R26 R14 + 0x7C580800, // 00B2 CALL R22 4 + 0x8C582B2F, // 00B3 GETMET R22 R21 K47 + 0x58600008, // 00B4 LDCONST R24 K8 + 0xB8661800, // 00B5 GETNGBL R25 K12 + 0x88643323, // 00B6 GETMBR R25 R25 K35 + 0x88643330, // 00B7 GETMBR R25 R25 K48 + 0x5C681E00, // 00B8 MOVE R26 R15 + 0x7C580800, // 00B9 CALL R22 4 + 0x8C582B2F, // 00BA GETMET R22 R21 K47 + 0x58600025, // 00BB LDCONST R24 K37 + 0xB8661800, // 00BC GETNGBL R25 K12 + 0x88643323, // 00BD GETMBR R25 R25 K35 + 0x88643330, // 00BE GETMBR R25 R25 K48 + 0x88680731, // 00BF GETMBR R26 R3 K49 + 0x7C580800, // 00C0 CALL R22 4 + 0x8C582B2F, // 00C1 GETMET R22 R21 K47 + 0x54620003, // 00C2 LDINT R24 4 + 0xB8661800, // 00C3 GETNGBL R25 K12 + 0x88643323, // 00C4 GETMBR R25 R25 K35 + 0x88643330, // 00C5 GETMBR R25 R25 K48 + 0x88680732, // 00C6 GETMBR R26 R3 K50 + 0x7C580800, // 00C7 CALL R22 4 + 0x8C582B33, // 00C8 GETMET R22 R21 K51 + 0x7C580200, // 00C9 CALL R22 1 + 0x8C5C0534, // 00CA GETMET R23 R2 K52 + 0x7C5C0200, // 00CB CALL R23 1 + 0x8C5C2F35, // 00CC GETMET R23 R23 K53 + 0x5C642400, // 00CD MOVE R25 R18 + 0x5C682C00, // 00CE MOVE R26 R22 + 0x5C6C2000, // 00CF MOVE R27 R16 + 0x7C5C0800, // 00D0 CALL R23 4 + 0x5C602E00, // 00D1 MOVE R24 R23 + 0x7462000A, // 00D2 JMPT R24 #00DE + 0xB8620A00, // 00D3 GETNGBL R24 K5 + 0x8C603106, // 00D4 GETMET R24 R24 K6 + 0x58680036, // 00D5 LDCONST R26 K54 + 0x586C0008, // 00D6 LDCONST R27 K8 + 0x7C600600, // 00D7 CALL R24 3 + 0xB8620A00, // 00D8 GETNGBL R24 K5 + 0x8C603106, // 00D9 GETMET R24 R24 K6 + 0x58680037, // 00DA LDCONST R26 K55 + 0x586C0008, // 00DB LDCONST R27 K8 + 0x7C600600, // 00DC CALL R24 3 + 0x70020004, // 00DD JMP #00E3 + 0xB8620A00, // 00DE GETNGBL R24 K5 + 0x8C603106, // 00DF GETMET R24 R24 K6 + 0x58680038, // 00E0 LDCONST R26 K56 + 0x586C0025, // 00E1 LDCONST R27 K37 + 0x7C600600, // 00E2 CALL R24 3 + 0x8C600511, // 00E3 GETMET R24 R2 K17 + 0x7C600200, // 00E4 CALL R24 1 + 0x8C603112, // 00E5 GETMET R24 R24 K18 + 0x88680713, // 00E6 GETMBR R26 R3 K19 + 0x7C600400, // 00E7 CALL R24 2 + 0x8C603112, // 00E8 GETMET R24 R24 K18 + 0x88680714, // 00E9 GETMBR R26 R3 K20 + 0x7C600400, // 00EA CALL R24 2 + 0x8C603112, // 00EB GETMET R24 R24 K18 + 0x88680939, // 00EC GETMBR R26 R4 K57 + 0x7C600400, // 00ED CALL R24 2 + 0x8C603115, // 00EE GETMET R24 R24 K21 + 0x7C600200, // 00EF CALL R24 1 + 0x5C143000, // 00F0 MOVE R5 R24 + 0x4C600000, // 00F1 LDNIL R24 + 0x900E2618, // 00F2 SETMBR R3 K19 R24 + 0x4C600000, // 00F3 LDNIL R24 + 0x900E2818, // 00F4 SETMBR R3 K20 R24 + 0x8C600518, // 00F5 GETMET R24 R2 K24 + 0x7C600200, // 00F6 CALL R24 1 + 0x8C603119, // 00F7 GETMET R24 R24 K25 + 0x8868071A, // 00F8 GETMBR R26 R3 K26 + 0x8C6C071B, // 00F9 GETMET R27 R3 K27 + 0x7C6C0200, // 00FA CALL R27 1 + 0x006C3605, // 00FB ADD R27 R27 R5 + 0x60700015, // 00FC GETGBL R28 G21 + 0x7C700000, // 00FD CALL R28 0 + 0x8C703916, // 00FE GETMET R28 R28 K22 + 0x8878013A, // 00FF GETMBR R30 R0 K58 + 0x7C700400, // 0100 CALL R28 2 + 0x5476002F, // 0101 LDINT R29 48 + 0x7C600A00, // 0102 CALL R24 5 + 0x5466000E, // 0103 LDINT R25 15 + 0x40660619, // 0104 CONNECT R25 K3 R25 + 0x94643019, // 0105 GETIDX R25 R24 R25 + 0x546A000F, // 0106 LDINT R26 16 + 0x546E001E, // 0107 LDINT R27 31 + 0x4068341B, // 0108 CONNECT R26 R26 R27 + 0x9468301A, // 0109 GETIDX R26 R24 R26 + 0x546E001F, // 010A LDINT R27 32 + 0x5472002E, // 010B LDINT R28 47 + 0x406C361C, // 010C CONNECT R27 R27 R28 + 0x946C301B, // 010D GETIDX R27 R24 R27 + 0xB8720A00, // 010E GETNGBL R28 K5 + 0x8C70393B, // 010F GETMET R28 R28 K59 + 0x7C700200, // 0110 CALL R28 1 + 0x9470393C, // 0111 GETIDX R28 R28 K60 + 0x8C740109, // 0112 GETMET R29 R0 K9 + 0x5C7C0200, // 0113 MOVE R31 R1 + 0x58800003, // 0114 LDCONST R32 K3 + 0x58840003, // 0115 LDCONST R33 K3 + 0x58880003, // 0116 LDCONST R34 K3 + 0x508C0200, // 0117 LDBOOL R35 1 0 + 0x7C740C00, // 0118 CALL R29 6 + 0x8C74073D, // 0119 GETMET R29 R3 K61 + 0x7C740200, // 011A CALL R29 1 + 0x8C74073E, // 011B GETMET R29 R3 K62 + 0x5C7C3200, // 011C MOVE R31 R25 + 0x5C803400, // 011D MOVE R32 R26 + 0x5C843600, // 011E MOVE R33 R27 + 0x5C883800, // 011F MOVE R34 R28 + 0x7C740A00, // 0120 CALL R29 5 + 0x900E7F03, // 0121 SETMBR R3 K63 K3 + 0x8C740740, // 0122 GETMET R29 R3 K64 + 0x7C740200, // 0123 CALL R29 1 + 0x8C740741, // 0124 GETMET R29 R3 K65 + 0x507C0200, // 0125 LDBOOL R31 1 0 + 0x7C740400, // 0126 CALL R29 2 + 0x8C740742, // 0127 GETMET R29 R3 K66 + 0x7C740200, // 0128 CALL R29 1 + 0x8C740743, // 0129 GETMET R29 R3 K67 + 0x7C740200, // 012A CALL R29 1 + 0x8C740744, // 012B GETMET R29 R3 K68 + 0x7C740200, // 012C CALL R29 1 + 0x50740200, // 012D LDBOOL R29 1 0 + 0x80043A00, // 012E RET 1 R29 }) ) ); @@ -1708,7 +1425,7 @@ be_local_closure(Matter_Commisioning_Context_parse_Sigma1, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[144]) { /* constants */ + ( &(const bvalue[118]) { /* constants */ /* K0 */ be_nested_str_weak(crypto), /* K1 */ be_nested_str_weak(string), /* K2 */ be_nested_str_weak(session), @@ -1751,112 +1468,86 @@ be_local_closure(Matter_Commisioning_Context_parse_Sigma1, /* name */ /* K39 */ be_nested_str_weak(AES_CCM), /* K40 */ be_nested_str_weak(decrypt), /* K41 */ be_nested_str_weak(tag), - /* K42 */ be_nested_str_weak(_X2A_X2A_X2A_X2A_X2A_X2A_X2A_X2A_X2A_X2A_X2A_X2A_X2A_X2A_X2A_X2A_X2A_X2A_X2A_X2A_X2A_X2A_X2A_X2A_X2A_X2A_X2A_X2A_X2A_X2A_X2A_X2A_X2A_X2A_X2A_X2A_X2A_X2A_X2A_X2A), - /* K43 */ be_nested_str_weak(MTR_X3A_X20_X2A_X20s1rk_X20_X20_X20_X20_X20_X20_X20_X20_X20_X20_X20_X20_X20_X20_X3D_X20), - /* K44 */ be_nested_str_weak(tohex), - /* K45 */ be_nested_str_weak(MTR_X3A_X20_X2A_X20tag_X20_X20_X20_X20_X20_X20_X20_X20_X20_X20_X20_X20_X20_X20_X20_X3D_X20), - /* K46 */ be_nested_str_weak(MTR_X3A_X20_X2A_X20Resume1MICPayload_X20_X3D_X20), - /* K47 */ be_nested_str_weak(MTR_X3A_X20_X2A_X20decrypted_tag_X20_X20_X20_X20_X20_X3D_X20), - /* K48 */ be_nested_str_weak(_source_node_id), - /* K49 */ be_nested_str_weak(source_node_id), - /* K50 */ be_nested_str_weak(set_mode_CASE), - /* K51 */ be_nested_str_weak(__future_initiator_session_id), - /* K52 */ be_nested_str_weak(initiator_session_id), - /* K53 */ be_nested_str_weak(__future_local_session_id), - /* K54 */ be_nested_str_weak(gen_local_session_id), - /* K55 */ be_nested_str_weak(MTR_X3A_X20_X2BSession_X20_X20_X20_X28_X256i_X29_X20from_X20_X27_X5B_X25s_X5D_X3A_X25i_X27), - /* K56 */ be_nested_str_weak(remote_ip), - /* K57 */ be_nested_str_weak(remote_port), - /* K58 */ be_nested_str_weak(resumption_id), - /* K59 */ be_nested_str_weak(random), - /* K60 */ be_nested_str_weak(Sigma2_Resume), - /* K61 */ be_nested_str_weak(NCASE_SigmaS2), - /* K62 */ be_nested_str_weak(Sigma2Resume), - /* K63 */ be_nested_str_weak(responderSessionID), - /* K64 */ be_nested_str_weak(sigma2ResumeMIC), - /* K65 */ be_nested_str_weak(MTR_X3A_X20_X2A_X20s2rk_X20_X20_X20_X20_X20_X20_X20_X20_X20_X20_X20_X20_X20_X20_X3D_X20), - /* K66 */ be_nested_str_weak(MTR_X3A_X20_X2A_X20s2rk_salt_X20_X20_X20_X20_X20_X20_X20_X20_X20_X3D_X20), - /* K67 */ be_nested_str_weak(MTR_X3A_X20_X2A_X20new_resumption_id_X20_X3D_X20), - /* K68 */ be_nested_str_weak(MTR_X3A_X20_X2A_X20responderSessionID_X3D_X20), - /* K69 */ be_nested_str_weak(MTR_X3A_X20_X2A_X20sigma2ResumeMIC_X20_X20_X20_X3D_X20), - /* K70 */ be_nested_str_weak(SessionResumptionKeys), - /* K71 */ be_nested_str_weak(rtc), - /* K72 */ be_nested_str_weak(utc), - /* K73 */ be_nested_str_weak(MTR_X3A_X20_X2A_X2A_X2A_X2A_X2A_X2A_X2A_X2A_X2A_X2A_X2A_X2A_X2A_X2A_X2A_X2A_X2A_X2A_X2A_X2A_X2A_X2A_X2A_X2A_X2A_X2A_X2A_X2A_X2A_X2A), - /* K74 */ be_nested_str_weak(MTR_X3A_X20I2RKey_X20_X20_X20_X20_X20_X20_X3D), - /* K75 */ be_nested_str_weak(MTR_X3A_X20R2IKey_X20_X20_X20_X20_X20_X20_X3D), - /* K76 */ be_nested_str_weak(MTR_X3A_X20AC_X20_X20_X20_X20_X20_X20_X20_X20_X20_X20_X3D), - /* K77 */ be_nested_str_weak(tlv2raw), - /* K78 */ be_nested_str_weak(__Msg1), - /* K79 */ be_nested_str_weak(MTR_X3A_X20sigma2resume_X3A_X20), - /* K80 */ be_nested_str_weak(MTR_X3A_X20sigma2resume_raw_X3A_X20), - /* K81 */ be_nested_str_weak(build_response), - /* K82 */ be_nested_str_weak(encode_frame), - /* K83 */ be_nested_str_weak(responder), - /* K84 */ be_nested_str_weak(send_response_frame), - /* K85 */ be_nested_str_weak(close), - /* K86 */ be_nested_str_weak(set_keys), - /* K87 */ be_nested_str_weak(_breadcrumb), - /* K88 */ be_nested_str_weak(counter_snd_next), - /* K89 */ be_nested_str_weak(set_persist), - /* K90 */ be_nested_str_weak(set_no_expiration), - /* K91 */ be_nested_str_weak(persist_to_fabric), - /* K92 */ be_nested_str_weak(save), - /* K93 */ be_nested_str_weak(find_fabric_by_destination_id), - /* K94 */ be_nested_str_weak(destinationId), - /* K95 */ be_nested_str_weak(MTR_X3A_X20StatusReport_X28GeneralCode_X3A_X20FAILURE_X2C_X20ProtocolId_X3A_X20SECURE_CHANNEL_X2C_X20ProtocolCode_X3A_X20NO_SHARED_TRUST_ROOTS_X29), - /* K96 */ be_nested_str_weak(MTR_X3A_X20fabric_X3D), - /* K97 */ be_nested_str_weak(MTR_X3A_X20no_private_key_X3D), - /* K98 */ be_nested_str_weak(no_private_key), - /* K99 */ be_nested_str_weak(MTR_X3A_X20noc_X20_X20_X20_X20_X20_X20_X20_X20_X20_X20_X20_X3D), - /* K100 */ be_nested_str_weak(noc), - /* K101 */ be_nested_str_weak(get_icac), - /* K102 */ be_nested_str_weak(MTR_X3A_X20icac_X20_X20_X20_X20_X20_X20_X20_X20_X20_X20_X3D), - /* K103 */ be_nested_str_weak(MTR_X3A_X20root_ca_cert_X20_X20_X3D), - /* K104 */ be_nested_str_weak(root_ca_certificate), - /* K105 */ be_nested_str_weak(__responder_priv), - /* K106 */ be_nested_str_weak(__responder_pub), - /* K107 */ be_nested_str_weak(EC_P256), - /* K108 */ be_nested_str_weak(public_key), - /* K109 */ be_nested_str_weak(MTR_X3A_X20ResponderEph_priv_X20_X20_X3D), - /* K110 */ be_nested_str_weak(MTR_X3A_X20ResponderEph_pub_X20_X20_X3D), - /* K111 */ be_nested_str_weak(shared_key), - /* K112 */ be_nested_str_weak(TLV), - /* K113 */ be_nested_str_weak(Matter_TLV_struct), - /* K114 */ be_nested_str_weak(add_TLV), - /* K115 */ be_nested_str_weak(B2), - /* K116 */ be_nested_str_weak(get_noc), - /* K117 */ be_const_int(3), - /* K118 */ be_nested_str_weak(ecdsa_sign_sha256), - /* K119 */ be_nested_str_weak(get_pk), - /* K120 */ be_nested_str_weak(Msg1), - /* K121 */ be_nested_str_weak(MTR_X3A_X20_X2A_X20resumptionid_X20_X20_X3D_X20), - /* K122 */ be_nested_str_weak(MTR_X3A_X20_X2A_X20MSG1_X20_X20_X20_X20_X20_X20_X20_X20_X20_X20_X3D_X20), - /* K123 */ be_nested_str_weak(SHA256), - /* K124 */ be_nested_str_weak(update), - /* K125 */ be_nested_str_weak(out), - /* K126 */ be_nested_str_weak(MTR_X3A_X20TranscriptHash_X20_X3D), - /* K127 */ be_nested_str_weak(S2K_Info), - /* K128 */ be_nested_str_weak(get_ipk_group_key), - /* K129 */ be_nested_str_weak(MTR_X3A_X20_X2A_X20SharedSecret_X20_X20_X3D_X20), - /* K130 */ be_nested_str_weak(MTR_X3A_X20_X2A_X20s2k_salt_X20_X20_X20_X20_X20_X20_X3D_X20), - /* K131 */ be_nested_str_weak(MTR_X3A_X20_X2A_X20s2k_X20_X20_X20_X20_X20_X20_X20_X20_X20_X20_X20_X3D_X20), - /* K132 */ be_nested_str_weak(MTR_X3A_X20_X2A_X20TBEData2Raw_X20_X20_X20_X3D_X20), - /* K133 */ be_nested_str_weak(TBEData2_Nonce), - /* K134 */ be_nested_str_weak(encrypt), - /* K135 */ be_nested_str_weak(MTR_X3A_X20_X2A_X20TBEData2Enc_X20_X20_X20_X3D_X20), - /* K136 */ be_nested_str_weak(Sigma2), - /* K137 */ be_nested_str_weak(responderRandom), - /* K138 */ be_nested_str_weak(responderSessionId), - /* K139 */ be_nested_str_weak(responderEphPubKey), - /* K140 */ be_nested_str_weak(encrypted2), - /* K141 */ be_nested_str_weak(MTR_X3A_X20sigma2_X3A_X20), - /* K142 */ be_nested_str_weak(__Msg2), - /* K143 */ be_nested_str_weak(MTR_X3A_X20sigma2_raw_X3A_X20), + /* K42 */ be_nested_str_weak(_source_node_id), + /* K43 */ be_nested_str_weak(source_node_id), + /* K44 */ be_nested_str_weak(set_mode_CASE), + /* K45 */ be_nested_str_weak(__future_initiator_session_id), + /* K46 */ be_nested_str_weak(initiator_session_id), + /* K47 */ be_nested_str_weak(__future_local_session_id), + /* K48 */ be_nested_str_weak(gen_local_session_id), + /* K49 */ be_nested_str_weak(MTR_X3A_X20_X2BSession_X20_X20_X20_X28_X256i_X29_X20from_X20_X27_X5B_X25s_X5D_X3A_X25i_X27), + /* K50 */ be_nested_str_weak(remote_ip), + /* K51 */ be_nested_str_weak(remote_port), + /* K52 */ be_nested_str_weak(resumption_id), + /* K53 */ be_nested_str_weak(random), + /* K54 */ be_nested_str_weak(Sigma2_Resume), + /* K55 */ be_nested_str_weak(NCASE_SigmaS2), + /* K56 */ be_nested_str_weak(Sigma2Resume), + /* K57 */ be_nested_str_weak(responderSessionID), + /* K58 */ be_nested_str_weak(sigma2ResumeMIC), + /* K59 */ be_nested_str_weak(SessionResumptionKeys), + /* K60 */ be_nested_str_weak(rtc), + /* K61 */ be_nested_str_weak(utc), + /* K62 */ be_nested_str_weak(tlv2raw), + /* K63 */ be_nested_str_weak(__Msg1), + /* K64 */ be_nested_str_weak(build_response), + /* K65 */ be_nested_str_weak(encode_frame), + /* K66 */ be_nested_str_weak(responder), + /* K67 */ be_nested_str_weak(send_response_frame), + /* K68 */ be_nested_str_weak(close), + /* K69 */ be_nested_str_weak(set_keys), + /* K70 */ be_nested_str_weak(_breadcrumb), + /* K71 */ be_nested_str_weak(counter_snd_next), + /* K72 */ be_nested_str_weak(set_persist), + /* K73 */ be_nested_str_weak(set_no_expiration), + /* K74 */ be_nested_str_weak(persist_to_fabric), + /* K75 */ be_nested_str_weak(save), + /* K76 */ be_nested_str_weak(find_fabric_by_destination_id), + /* K77 */ be_nested_str_weak(destinationId), + /* K78 */ be_nested_str_weak(MTR_X3A_X20StatusReport_X28GeneralCode_X3A_X20FAILURE_X2C_X20ProtocolId_X3A_X20SECURE_CHANNEL_X2C_X20ProtocolCode_X3A_X20NO_SHARED_TRUST_ROOTS_X29), + /* K79 */ be_nested_str_weak(MTR_X3A_X20fabric_X3D), + /* K80 */ be_nested_str_weak(MTR_X3A_X20no_private_key_X3D), + /* K81 */ be_nested_str_weak(no_private_key), + /* K82 */ be_nested_str_weak(tohex), + /* K83 */ be_nested_str_weak(MTR_X3A_X20noc_X20_X20_X20_X20_X20_X20_X20_X20_X20_X20_X20_X3D), + /* K84 */ be_nested_str_weak(noc), + /* K85 */ be_nested_str_weak(get_icac), + /* K86 */ be_nested_str_weak(MTR_X3A_X20icac_X20_X20_X20_X20_X20_X20_X20_X20_X20_X20_X3D), + /* K87 */ be_nested_str_weak(MTR_X3A_X20root_ca_cert_X20_X20_X3D), + /* K88 */ be_nested_str_weak(root_ca_certificate), + /* K89 */ be_nested_str_weak(__responder_priv), + /* K90 */ be_nested_str_weak(__responder_pub), + /* K91 */ be_nested_str_weak(EC_P256), + /* K92 */ be_nested_str_weak(public_key), + /* K93 */ be_nested_str_weak(MTR_X3A_X20ResponderEph_priv_X20_X20_X3D), + /* K94 */ be_nested_str_weak(MTR_X3A_X20ResponderEph_pub_X20_X20_X3D), + /* K95 */ be_nested_str_weak(shared_key), + /* K96 */ be_nested_str_weak(TLV), + /* K97 */ be_nested_str_weak(Matter_TLV_struct), + /* K98 */ be_nested_str_weak(add_TLV), + /* K99 */ be_nested_str_weak(B2), + /* K100 */ be_nested_str_weak(get_noc), + /* K101 */ be_const_int(3), + /* K102 */ be_nested_str_weak(ecdsa_sign_sha256), + /* K103 */ be_nested_str_weak(get_pk), + /* K104 */ be_nested_str_weak(Msg1), + /* K105 */ be_nested_str_weak(SHA256), + /* K106 */ be_nested_str_weak(update), + /* K107 */ be_nested_str_weak(out), + /* K108 */ be_nested_str_weak(S2K_Info), + /* K109 */ be_nested_str_weak(get_ipk_group_key), + /* K110 */ be_nested_str_weak(TBEData2_Nonce), + /* K111 */ be_nested_str_weak(encrypt), + /* K112 */ be_nested_str_weak(Sigma2), + /* K113 */ be_nested_str_weak(responderRandom), + /* K114 */ be_nested_str_weak(responderSessionId), + /* K115 */ be_nested_str_weak(responderEphPubKey), + /* K116 */ be_nested_str_weak(encrypted2), + /* K117 */ be_nested_str_weak(__Msg2), }), be_str_weak(parse_Sigma1), &be_const_str_solidified, - ( &(const binstruction[793]) { /* code */ + ( &(const binstruction[576]) { /* code */ 0xA40A0000, // 0000 IMPORT R2 K0 0xA40E0200, // 0001 IMPORT R3 K1 0x88100302, // 0002 GETMBR R4 R1 K2 @@ -1957,7 +1648,7 @@ be_local_closure(Matter_Commisioning_Context_parse_Sigma1, /* name */ 0x1C201009, // 0061 EQ R8 R8 R9 0x78220000, // 0062 JMPF R8 #0064 0x50180000, // 0063 LDBOOL R6 0 0 - 0x781A013A, // 0064 JMPF R6 #01A0 + 0x781A00B6, // 0064 JMPF R6 #011C 0x88200B1F, // 0065 GETMBR R8 R5 K31 0x88240B17, // 0066 GETMBR R9 R5 K23 0x00201009, // 0067 ADD R8 R8 R9 @@ -2004,652 +1695,435 @@ be_local_closure(Matter_Commisioning_Context_parse_Sigma1, /* name */ 0x5C3C2000, // 0090 MOVE R15 R16 0x8C401D29, // 0091 GETMET R16 R14 K41 0x7C400200, // 0092 CALL R16 1 - 0xB8460E00, // 0093 GETNGBL R17 K7 - 0x8C442308, // 0094 GETMET R17 R17 K8 - 0x584C002A, // 0095 LDCONST R19 K42 - 0x54520003, // 0096 LDINT R20 4 - 0x7C440600, // 0097 CALL R17 3 - 0xB8460E00, // 0098 GETNGBL R17 K7 - 0x8C442308, // 0099 GETMET R17 R17 K8 - 0x8C4C152C, // 009A GETMET R19 R10 K44 - 0x7C4C0200, // 009B CALL R19 1 - 0x004E5613, // 009C ADD R19 K43 R19 - 0x54520003, // 009D LDINT R20 4 - 0x7C440600, // 009E CALL R17 3 - 0xB8460E00, // 009F GETNGBL R17 K7 - 0x8C442308, // 00A0 GETMET R17 R17 K8 - 0x8C4C1B2C, // 00A1 GETMET R19 R13 K44 - 0x7C4C0200, // 00A2 CALL R19 1 - 0x004E5A13, // 00A3 ADD R19 K45 R19 - 0x54520003, // 00A4 LDINT R20 4 - 0x7C440600, // 00A5 CALL R17 3 - 0xB8460E00, // 00A6 GETNGBL R17 K7 - 0x8C442308, // 00A7 GETMET R17 R17 K8 - 0x8C4C1F2C, // 00A8 GETMET R19 R15 K44 - 0x7C4C0200, // 00A9 CALL R19 1 - 0x004E5C13, // 00AA ADD R19 K46 R19 - 0x54520003, // 00AB LDINT R20 4 - 0x7C440600, // 00AC CALL R17 3 - 0xB8460E00, // 00AD GETNGBL R17 K7 - 0x8C442308, // 00AE GETMET R17 R17 K8 - 0x8C4C212C, // 00AF GETMET R19 R16 K44 - 0x7C4C0200, // 00B0 CALL R19 1 - 0x004E5E13, // 00B1 ADD R19 K47 R19 - 0x54520003, // 00B2 LDINT R20 4 - 0x7C440600, // 00B3 CALL R17 3 - 0xB8460E00, // 00B4 GETNGBL R17 K7 - 0x8C442308, // 00B5 GETMET R17 R17 K8 - 0x584C002A, // 00B6 LDCONST R19 K42 - 0x54520003, // 00B7 LDINT R20 4 - 0x7C440600, // 00B8 CALL R17 3 - 0x1C441A10, // 00B9 EQ R17 R13 R16 - 0x784600E3, // 00BA JMPF R17 #019F - 0x88440F1E, // 00BB GETMBR R17 R7 K30 - 0x90123C11, // 00BC SETMBR R4 K30 R17 - 0x88440331, // 00BD GETMBR R17 R1 K49 - 0x90126011, // 00BE SETMBR R4 K48 R17 - 0x8C440932, // 00BF GETMET R17 R4 K50 - 0x7C440200, // 00C0 CALL R17 1 - 0x88440B34, // 00C1 GETMBR R17 R5 K52 - 0x90126611, // 00C2 SETMBR R4 K51 R17 - 0x8844011A, // 00C3 GETMBR R17 R0 K26 - 0x8844231B, // 00C4 GETMBR R17 R17 K27 - 0x8C442336, // 00C5 GETMET R17 R17 K54 - 0x7C440200, // 00C6 CALL R17 1 - 0x90126A11, // 00C7 SETMBR R4 K53 R17 - 0xB8460E00, // 00C8 GETNGBL R17 K7 - 0x8C442308, // 00C9 GETMET R17 R17 K8 - 0x8C4C0712, // 00CA GETMET R19 R3 K18 - 0x58540037, // 00CB LDCONST R21 K55 - 0x88580935, // 00CC GETMBR R22 R4 K53 - 0x885C0338, // 00CD GETMBR R23 R1 K56 - 0x88600339, // 00CE GETMBR R24 R1 K57 - 0x7C4C0A00, // 00CF CALL R19 5 - 0x5850000A, // 00D0 LDCONST R20 K10 - 0x7C440600, // 00D1 CALL R17 3 - 0x88440F24, // 00D2 GETMBR R17 R7 K36 - 0x90124811, // 00D3 SETMBR R4 K36 R17 - 0x8C44053B, // 00D4 GETMET R17 R2 K59 - 0x544E000F, // 00D5 LDINT R19 16 - 0x7C440400, // 00D6 CALL R17 2 - 0x90127411, // 00D7 SETMBR R4 K58 R17 - 0x60440015, // 00D8 GETGBL R17 G21 - 0x7C440000, // 00D9 CALL R17 0 - 0x8C442320, // 00DA GETMET R17 R17 K32 - 0x584C003C, // 00DB LDCONST R19 K60 - 0x7C440400, // 00DC CALL R17 2 - 0x88480B1F, // 00DD GETMBR R18 R5 K31 - 0x884C093A, // 00DE GETMBR R19 R4 K58 - 0x00482413, // 00DF ADD R18 R18 R19 - 0x8C4C0522, // 00E0 GETMET R19 R2 K34 - 0x7C4C0200, // 00E1 CALL R19 1 - 0x8C4C2723, // 00E2 GETMET R19 R19 K35 - 0x88540924, // 00E3 GETMBR R21 R4 K36 - 0x5C582400, // 00E4 MOVE R22 R18 - 0x5C5C2200, // 00E5 MOVE R23 R17 - 0x5462000F, // 00E6 LDINT R24 16 - 0x7C4C0A00, // 00E7 CALL R19 5 - 0x8C500527, // 00E8 GETMET R20 R2 K39 - 0x5C582600, // 00E9 MOVE R22 R19 - 0x605C0015, // 00EA GETGBL R23 G21 - 0x7C5C0000, // 00EB CALL R23 0 - 0x8C5C2F20, // 00EC GETMET R23 R23 K32 - 0x5864003D, // 00ED LDCONST R25 K61 - 0x7C5C0400, // 00EE CALL R23 2 - 0x60600015, // 00EF GETGBL R24 G21 - 0x7C600000, // 00F0 CALL R24 0 - 0x58640005, // 00F1 LDCONST R25 K5 - 0x546A000F, // 00F2 LDINT R26 16 - 0x7C500C00, // 00F3 CALL R20 6 - 0x8C542929, // 00F4 GETMET R21 R20 K41 - 0x7C540200, // 00F5 CALL R21 1 - 0xB85A1A00, // 00F6 GETNGBL R22 K13 - 0x8C582D3E, // 00F7 GETMET R22 R22 K62 - 0x7C580200, // 00F8 CALL R22 1 - 0x885C093A, // 00F9 GETMBR R23 R4 K58 - 0x905A2E17, // 00FA SETMBR R22 K23 R23 - 0x885C0935, // 00FB GETMBR R23 R4 K53 - 0x905A7E17, // 00FC SETMBR R22 K63 R23 - 0x905A8015, // 00FD SETMBR R22 K64 R21 - 0xB85E0E00, // 00FE GETNGBL R23 K7 - 0x8C5C2F08, // 00FF GETMET R23 R23 K8 - 0x5864002A, // 0100 LDCONST R25 K42 - 0x546A0003, // 0101 LDINT R26 4 - 0x7C5C0600, // 0102 CALL R23 3 - 0xB85E0E00, // 0103 GETNGBL R23 K7 - 0x8C5C2F08, // 0104 GETMET R23 R23 K8 - 0x8C64272C, // 0105 GETMET R25 R19 K44 - 0x7C640200, // 0106 CALL R25 1 - 0x00668219, // 0107 ADD R25 K65 R25 - 0x546A0003, // 0108 LDINT R26 4 - 0x7C5C0600, // 0109 CALL R23 3 - 0xB85E0E00, // 010A GETNGBL R23 K7 - 0x8C5C2F08, // 010B GETMET R23 R23 K8 - 0x8C64252C, // 010C GETMET R25 R18 K44 - 0x7C640200, // 010D CALL R25 1 - 0x00668419, // 010E ADD R25 K66 R25 - 0x546A0003, // 010F LDINT R26 4 - 0x7C5C0600, // 0110 CALL R23 3 - 0xB85E0E00, // 0111 GETNGBL R23 K7 - 0x8C5C2F08, // 0112 GETMET R23 R23 K8 - 0x8864093A, // 0113 GETMBR R25 R4 K58 - 0x8C64332C, // 0114 GETMET R25 R25 K44 - 0x7C640200, // 0115 CALL R25 1 - 0x00668619, // 0116 ADD R25 K67 R25 - 0x546A0003, // 0117 LDINT R26 4 - 0x7C5C0600, // 0118 CALL R23 3 - 0xB85E0E00, // 0119 GETNGBL R23 K7 - 0x8C5C2F08, // 011A GETMET R23 R23 K8 - 0x60640008, // 011B GETGBL R25 G8 - 0x88680935, // 011C GETMBR R26 R4 K53 - 0x7C640200, // 011D CALL R25 1 - 0x00668819, // 011E ADD R25 K68 R25 - 0x546A0003, // 011F LDINT R26 4 - 0x7C5C0600, // 0120 CALL R23 3 - 0xB85E0E00, // 0121 GETNGBL R23 K7 - 0x8C5C2F08, // 0122 GETMET R23 R23 K8 - 0x8C642B2C, // 0123 GETMET R25 R21 K44 - 0x7C640200, // 0124 CALL R25 1 - 0x00668A19, // 0125 ADD R25 K69 R25 - 0x546A0003, // 0126 LDINT R26 4 - 0x7C5C0600, // 0127 CALL R23 3 - 0xB85E0E00, // 0128 GETNGBL R23 K7 - 0x8C5C2F08, // 0129 GETMET R23 R23 K8 - 0x5864002A, // 012A LDCONST R25 K42 - 0x546A0003, // 012B LDINT R26 4 - 0x7C5C0600, // 012C CALL R23 3 - 0x8C5C0522, // 012D GETMET R23 R2 K34 - 0x7C5C0200, // 012E CALL R23 1 - 0x8C5C2F23, // 012F GETMET R23 R23 K35 - 0x88640924, // 0130 GETMBR R25 R4 K36 - 0x88680B1F, // 0131 GETMBR R26 R5 K31 - 0x886C093A, // 0132 GETMBR R27 R4 K58 - 0x0068341B, // 0133 ADD R26 R26 R27 - 0x606C0015, // 0134 GETGBL R27 G21 - 0x7C6C0000, // 0135 CALL R27 0 - 0x8C6C3720, // 0136 GETMET R27 R27 K32 - 0x58740046, // 0137 LDCONST R29 K70 - 0x7C6C0400, // 0138 CALL R27 2 - 0x5472002F, // 0139 LDINT R28 48 - 0x7C5C0A00, // 013A CALL R23 5 - 0x5462000E, // 013B LDINT R24 15 - 0x40620A18, // 013C CONNECT R24 K5 R24 - 0x94602E18, // 013D GETIDX R24 R23 R24 - 0x5466000F, // 013E LDINT R25 16 - 0x546A001E, // 013F LDINT R26 31 - 0x4064321A, // 0140 CONNECT R25 R25 R26 - 0x94642E19, // 0141 GETIDX R25 R23 R25 - 0x546A001F, // 0142 LDINT R26 32 - 0x546E002E, // 0143 LDINT R27 47 - 0x4068341B, // 0144 CONNECT R26 R26 R27 - 0x94682E1A, // 0145 GETIDX R26 R23 R26 - 0xB86E0E00, // 0146 GETNGBL R27 K7 - 0x8C6C3747, // 0147 GETMET R27 R27 K71 - 0x7C6C0200, // 0148 CALL R27 1 - 0x946C3748, // 0149 GETIDX R27 R27 K72 - 0xB8720E00, // 014A GETNGBL R28 K7 - 0x8C703908, // 014B GETMET R28 R28 K8 - 0x58780049, // 014C LDCONST R30 K73 - 0x547E0003, // 014D LDINT R31 4 - 0x7C700600, // 014E CALL R28 3 - 0xB8720E00, // 014F GETNGBL R28 K7 - 0x8C703908, // 0150 GETMET R28 R28 K8 - 0x8C78312C, // 0151 GETMET R30 R24 K44 - 0x7C780200, // 0152 CALL R30 1 - 0x007A941E, // 0153 ADD R30 K74 R30 - 0x547E0003, // 0154 LDINT R31 4 - 0x7C700600, // 0155 CALL R28 3 - 0xB8720E00, // 0156 GETNGBL R28 K7 - 0x8C703908, // 0157 GETMET R28 R28 K8 - 0x8C78332C, // 0158 GETMET R30 R25 K44 - 0x7C780200, // 0159 CALL R30 1 - 0x007A961E, // 015A ADD R30 K75 R30 - 0x547E0003, // 015B LDINT R31 4 - 0x7C700600, // 015C CALL R28 3 - 0xB8720E00, // 015D GETNGBL R28 K7 - 0x8C703908, // 015E GETMET R28 R28 K8 - 0x8C78352C, // 015F GETMET R30 R26 K44 - 0x7C780200, // 0160 CALL R30 1 - 0x007A981E, // 0161 ADD R30 K76 R30 - 0x547E0003, // 0162 LDINT R31 4 - 0x7C700600, // 0163 CALL R28 3 - 0xB8720E00, // 0164 GETNGBL R28 K7 - 0x8C703908, // 0165 GETMET R28 R28 K8 - 0x58780049, // 0166 LDCONST R30 K73 - 0x547E0003, // 0167 LDINT R31 4 - 0x7C700600, // 0168 CALL R28 3 - 0x8C702D4D, // 0169 GETMET R28 R22 K77 - 0x7C700200, // 016A CALL R28 1 - 0x4C740000, // 016B LDNIL R29 - 0x90129C1D, // 016C SETMBR R4 K78 R29 - 0xB8760E00, // 016D GETNGBL R29 K7 - 0x8C743B08, // 016E GETMET R29 R29 K8 - 0xB87E1A00, // 016F GETNGBL R31 K13 - 0x8C7C3F14, // 0170 GETMET R31 R31 K20 - 0x5C842C00, // 0171 MOVE R33 R22 - 0x7C7C0400, // 0172 CALL R31 2 - 0x007E9E1F, // 0173 ADD R31 K79 R31 - 0x54820003, // 0174 LDINT R32 4 - 0x7C740600, // 0175 CALL R29 3 - 0xB8760E00, // 0176 GETNGBL R29 K7 - 0x8C743B08, // 0177 GETMET R29 R29 K8 - 0x8C7C392C, // 0178 GETMET R31 R28 K44 - 0x7C7C0200, // 0179 CALL R31 1 - 0x007EA01F, // 017A ADD R31 K80 R31 - 0x54820003, // 017B LDINT R32 4 - 0x7C740600, // 017C CALL R29 3 - 0x8C740351, // 017D GETMET R29 R1 K81 - 0x547E0032, // 017E LDINT R31 51 - 0x50800200, // 017F LDBOOL R32 1 0 - 0x7C740600, // 0180 CALL R29 3 - 0x8C783B52, // 0181 GETMET R30 R29 K82 - 0x5C803800, // 0182 MOVE R32 R28 - 0x7C780400, // 0183 CALL R30 2 - 0x887C0153, // 0184 GETMBR R31 R0 K83 - 0x8C7C3F54, // 0185 GETMET R31 R31 K84 - 0x5C843A00, // 0186 MOVE R33 R29 - 0x7C7C0400, // 0187 CALL R31 2 - 0x8C7C0955, // 0188 GETMET R31 R4 K85 - 0x7C7C0200, // 0189 CALL R31 1 - 0x8C7C0956, // 018A GETMET R31 R4 K86 - 0x5C843000, // 018B MOVE R33 R24 - 0x5C883200, // 018C MOVE R34 R25 - 0x5C8C3400, // 018D MOVE R35 R26 - 0x5C903600, // 018E MOVE R36 R27 - 0x7C7C0A00, // 018F CALL R31 5 - 0x9012AF05, // 0190 SETMBR R4 K87 K5 - 0x8C7C0958, // 0191 GETMET R31 R4 K88 - 0x7C7C0200, // 0192 CALL R31 1 - 0x8C7C0959, // 0193 GETMET R31 R4 K89 - 0x50840200, // 0194 LDBOOL R33 1 0 - 0x7C7C0400, // 0195 CALL R31 2 - 0x8C7C095A, // 0196 GETMET R31 R4 K90 - 0x7C7C0200, // 0197 CALL R31 1 - 0x8C7C095B, // 0198 GETMET R31 R4 K91 - 0x7C7C0200, // 0199 CALL R31 1 - 0x8C7C095C, // 019A GETMET R31 R4 K92 - 0x7C7C0200, // 019B CALL R31 1 - 0x507C0200, // 019C LDBOOL R31 1 0 - 0x80043E00, // 019D RET 1 R31 - 0x70020000, // 019E JMP #01A0 - 0x50180000, // 019F LDBOOL R6 0 0 - 0x5C200C00, // 01A0 MOVE R8 R6 - 0x74220174, // 01A1 JMPT R8 #0317 - 0x8C20015D, // 01A2 GETMET R8 R0 K93 - 0x88280B5E, // 01A3 GETMBR R10 R5 K94 - 0x882C0B1F, // 01A4 GETMBR R11 R5 K31 - 0x7C200600, // 01A5 CALL R8 3 - 0x90123C08, // 01A6 SETMBR R4 K30 R8 - 0x4C240000, // 01A7 LDNIL R9 - 0x1C240809, // 01A8 EQ R9 R4 R9 - 0x74260003, // 01A9 JMPT R9 #01AE - 0x8824091E, // 01AA GETMBR R9 R4 K30 - 0x4C280000, // 01AB LDNIL R10 - 0x1C24120A, // 01AC EQ R9 R9 R10 - 0x7826000D, // 01AD JMPF R9 #01BC - 0xB8260E00, // 01AE GETNGBL R9 K7 - 0x8C241308, // 01AF GETMET R9 R9 K8 - 0x582C005F, // 01B0 LDCONST R11 K95 - 0x5830000A, // 01B1 LDCONST R12 K10 - 0x7C240600, // 01B2 CALL R9 3 - 0x8C24010B, // 01B3 GETMET R9 R0 K11 - 0x5C2C0200, // 01B4 MOVE R11 R1 - 0x5830000C, // 01B5 LDCONST R12 K12 - 0x58340005, // 01B6 LDCONST R13 K5 - 0x5838000C, // 01B7 LDCONST R14 K12 - 0x503C0000, // 01B8 LDBOOL R15 0 0 - 0x7C240C00, // 01B9 CALL R9 6 - 0x50240000, // 01BA LDBOOL R9 0 0 - 0x80041200, // 01BB RET 1 R9 - 0x88240331, // 01BC GETMBR R9 R1 K49 - 0x90126009, // 01BD SETMBR R4 K48 R9 - 0x8C240932, // 01BE GETMET R9 R4 K50 - 0x7C240200, // 01BF CALL R9 1 - 0x88240B34, // 01C0 GETMBR R9 R5 K52 - 0x90126609, // 01C1 SETMBR R4 K51 R9 - 0x8824011A, // 01C2 GETMBR R9 R0 K26 - 0x8824131B, // 01C3 GETMBR R9 R9 K27 - 0x8C241336, // 01C4 GETMET R9 R9 K54 - 0x7C240200, // 01C5 CALL R9 1 - 0x90126A09, // 01C6 SETMBR R4 K53 R9 - 0xB8260E00, // 01C7 GETNGBL R9 K7 - 0x8C241308, // 01C8 GETMET R9 R9 K8 - 0x8C2C0712, // 01C9 GETMET R11 R3 K18 - 0x58340037, // 01CA LDCONST R13 K55 - 0x88380935, // 01CB GETMBR R14 R4 K53 - 0x883C0338, // 01CC GETMBR R15 R1 K56 - 0x88400339, // 01CD GETMBR R16 R1 K57 - 0x7C2C0A00, // 01CE CALL R11 5 - 0x5830000A, // 01CF LDCONST R12 K10 - 0x7C240600, // 01D0 CALL R9 3 - 0xB8260E00, // 01D1 GETNGBL R9 K7 - 0x8C241308, // 01D2 GETMET R9 R9 K8 - 0xB82E1A00, // 01D3 GETNGBL R11 K13 - 0x8C2C1714, // 01D4 GETMET R11 R11 K20 - 0x8834091E, // 01D5 GETMBR R13 R4 K30 - 0x7C2C0400, // 01D6 CALL R11 2 - 0x002EC00B, // 01D7 ADD R11 K96 R11 - 0x54320003, // 01D8 LDINT R12 4 - 0x7C240600, // 01D9 CALL R9 3 - 0xB8260E00, // 01DA GETNGBL R9 K7 - 0x8C241308, // 01DB GETMET R9 R9 K8 - 0x882C091E, // 01DC GETMBR R11 R4 K30 - 0x882C1762, // 01DD GETMBR R11 R11 K98 - 0x8C2C172C, // 01DE GETMET R11 R11 K44 - 0x7C2C0200, // 01DF CALL R11 1 - 0x002EC20B, // 01E0 ADD R11 K97 R11 - 0x54320003, // 01E1 LDINT R12 4 - 0x7C240600, // 01E2 CALL R9 3 - 0xB8260E00, // 01E3 GETNGBL R9 K7 - 0x8C241308, // 01E4 GETMET R9 R9 K8 - 0x882C091E, // 01E5 GETMBR R11 R4 K30 - 0x882C1764, // 01E6 GETMBR R11 R11 K100 - 0x8C2C172C, // 01E7 GETMET R11 R11 K44 - 0x7C2C0200, // 01E8 CALL R11 1 - 0x002EC60B, // 01E9 ADD R11 K99 R11 - 0x54320003, // 01EA LDINT R12 4 - 0x7C240600, // 01EB CALL R9 3 - 0x8824091E, // 01EC GETMBR R9 R4 K30 - 0x8C241365, // 01ED GETMET R9 R9 K101 - 0x7C240200, // 01EE CALL R9 1 - 0x78260009, // 01EF JMPF R9 #01FA - 0xB8260E00, // 01F0 GETNGBL R9 K7 - 0x8C241308, // 01F1 GETMET R9 R9 K8 - 0x882C091E, // 01F2 GETMBR R11 R4 K30 - 0x8C2C1765, // 01F3 GETMET R11 R11 K101 - 0x7C2C0200, // 01F4 CALL R11 1 - 0x8C2C172C, // 01F5 GETMET R11 R11 K44 - 0x7C2C0200, // 01F6 CALL R11 1 - 0x002ECC0B, // 01F7 ADD R11 K102 R11 - 0x54320003, // 01F8 LDINT R12 4 - 0x7C240600, // 01F9 CALL R9 3 - 0xB8260E00, // 01FA GETNGBL R9 K7 - 0x8C241308, // 01FB GETMET R9 R9 K8 - 0x882C091E, // 01FC GETMBR R11 R4 K30 - 0x882C1768, // 01FD GETMBR R11 R11 K104 - 0x8C2C172C, // 01FE GETMET R11 R11 K44 - 0x7C2C0200, // 01FF CALL R11 1 - 0x002ECE0B, // 0200 ADD R11 K103 R11 - 0x54320003, // 0201 LDINT R12 4 - 0x7C240600, // 0202 CALL R9 3 - 0x8C24053B, // 0203 GETMET R9 R2 K59 - 0x542E000F, // 0204 LDINT R11 16 - 0x7C240400, // 0205 CALL R9 2 - 0x90127409, // 0206 SETMBR R4 K58 R9 - 0x8C24053B, // 0207 GETMET R9 R2 K59 - 0x542E001F, // 0208 LDINT R11 32 - 0x7C240400, // 0209 CALL R9 2 - 0x9012D209, // 020A SETMBR R4 K105 R9 - 0x8C24056B, // 020B GETMET R9 R2 K107 - 0x7C240200, // 020C CALL R9 1 - 0x8C24136C, // 020D GETMET R9 R9 K108 - 0x882C0969, // 020E GETMBR R11 R4 K105 - 0x7C240400, // 020F CALL R9 2 - 0x9012D409, // 0210 SETMBR R4 K106 R9 - 0xB8260E00, // 0211 GETNGBL R9 K7 - 0x8C241308, // 0212 GETMET R9 R9 K8 - 0x882C0969, // 0213 GETMBR R11 R4 K105 - 0x8C2C172C, // 0214 GETMET R11 R11 K44 - 0x7C2C0200, // 0215 CALL R11 1 - 0x002EDA0B, // 0216 ADD R11 K109 R11 - 0x54320003, // 0217 LDINT R12 4 - 0x7C240600, // 0218 CALL R9 3 - 0xB8260E00, // 0219 GETNGBL R9 K7 - 0x8C241308, // 021A GETMET R9 R9 K8 - 0x882C096A, // 021B GETMBR R11 R4 K106 - 0x8C2C172C, // 021C GETMET R11 R11 K44 - 0x7C2C0200, // 021D CALL R11 1 - 0x002EDC0B, // 021E ADD R11 K110 R11 - 0x54320003, // 021F LDINT R12 4 - 0x7C240600, // 0220 CALL R9 3 - 0x8C24053B, // 0221 GETMET R9 R2 K59 - 0x542E001F, // 0222 LDINT R11 32 - 0x7C240400, // 0223 CALL R9 2 - 0x8C28056B, // 0224 GETMET R10 R2 K107 - 0x7C280200, // 0225 CALL R10 1 - 0x8C28156F, // 0226 GETMET R10 R10 K111 - 0x88300969, // 0227 GETMBR R12 R4 K105 - 0x88340B16, // 0228 GETMBR R13 R5 K22 - 0x7C280600, // 0229 CALL R10 3 - 0x9012480A, // 022A SETMBR R4 K36 R10 - 0xB82A1A00, // 022B GETNGBL R10 K13 - 0x88281570, // 022C GETMBR R10 R10 K112 - 0x8C281571, // 022D GETMET R10 R10 K113 - 0x7C280200, // 022E CALL R10 1 - 0x8C2C1572, // 022F GETMET R11 R10 K114 - 0x5834000C, // 0230 LDCONST R13 K12 - 0xB83A1A00, // 0231 GETNGBL R14 K13 - 0x88381D70, // 0232 GETMBR R14 R14 K112 - 0x88381D73, // 0233 GETMBR R14 R14 K115 - 0x8C3C0974, // 0234 GETMET R15 R4 K116 - 0x7C3C0200, // 0235 CALL R15 1 - 0x7C2C0800, // 0236 CALL R11 4 - 0x8C2C1572, // 0237 GETMET R11 R10 K114 - 0x5834000A, // 0238 LDCONST R13 K10 - 0xB83A1A00, // 0239 GETNGBL R14 K13 - 0x88381D70, // 023A GETMBR R14 R14 K112 - 0x88381D73, // 023B GETMBR R14 R14 K115 - 0x8C3C0965, // 023C GETMET R15 R4 K101 - 0x7C3C0200, // 023D CALL R15 1 - 0x7C2C0800, // 023E CALL R11 4 - 0x8C2C1572, // 023F GETMET R11 R10 K114 - 0x58340075, // 0240 LDCONST R13 K117 - 0xB83A1A00, // 0241 GETNGBL R14 K13 - 0x88381D70, // 0242 GETMBR R14 R14 K112 - 0x88381D73, // 0243 GETMBR R14 R14 K115 - 0x883C096A, // 0244 GETMBR R15 R4 K106 - 0x7C2C0800, // 0245 CALL R11 4 - 0x8C2C1572, // 0246 GETMET R11 R10 K114 - 0x54360003, // 0247 LDINT R13 4 - 0xB83A1A00, // 0248 GETNGBL R14 K13 - 0x88381D70, // 0249 GETMBR R14 R14 K112 - 0x88381D73, // 024A GETMBR R14 R14 K115 - 0x883C0B16, // 024B GETMBR R15 R5 K22 - 0x7C2C0800, // 024C CALL R11 4 - 0x8C2C056B, // 024D GETMET R11 R2 K107 - 0x7C2C0200, // 024E CALL R11 1 - 0x8C2C1776, // 024F GETMET R11 R11 K118 - 0x8C340977, // 0250 GETMET R13 R4 K119 - 0x7C340200, // 0251 CALL R13 1 - 0x8C38154D, // 0252 GETMET R14 R10 K77 - 0x7C380200, // 0253 CALL R14 1 - 0x7C2C0600, // 0254 CALL R11 3 - 0xB8321A00, // 0255 GETNGBL R12 K13 - 0x88301970, // 0256 GETMBR R12 R12 K112 - 0x8C301971, // 0257 GETMET R12 R12 K113 - 0x7C300200, // 0258 CALL R12 1 - 0x8C341972, // 0259 GETMET R13 R12 K114 - 0x583C000C, // 025A LDCONST R15 K12 - 0xB8421A00, // 025B GETNGBL R16 K13 - 0x88402170, // 025C GETMBR R16 R16 K112 - 0x88402173, // 025D GETMBR R16 R16 K115 - 0x8C440974, // 025E GETMET R17 R4 K116 - 0x7C440200, // 025F CALL R17 1 - 0x7C340800, // 0260 CALL R13 4 - 0x8C341972, // 0261 GETMET R13 R12 K114 - 0x583C000A, // 0262 LDCONST R15 K10 - 0xB8421A00, // 0263 GETNGBL R16 K13 - 0x88402170, // 0264 GETMBR R16 R16 K112 - 0x88402173, // 0265 GETMBR R16 R16 K115 - 0x8C440965, // 0266 GETMET R17 R4 K101 - 0x7C440200, // 0267 CALL R17 1 - 0x7C340800, // 0268 CALL R13 4 - 0x8C341972, // 0269 GETMET R13 R12 K114 - 0x583C0075, // 026A LDCONST R15 K117 - 0xB8421A00, // 026B GETNGBL R16 K13 - 0x88402170, // 026C GETMBR R16 R16 K112 - 0x88402173, // 026D GETMBR R16 R16 K115 - 0x5C441600, // 026E MOVE R17 R11 - 0x7C340800, // 026F CALL R13 4 - 0x8C341972, // 0270 GETMET R13 R12 K114 - 0x543E0003, // 0271 LDINT R15 4 - 0xB8421A00, // 0272 GETNGBL R16 K13 - 0x88402170, // 0273 GETMBR R16 R16 K112 - 0x88402173, // 0274 GETMBR R16 R16 K115 - 0x8844093A, // 0275 GETMBR R17 R4 K58 - 0x7C340800, // 0276 CALL R13 4 - 0xB8360E00, // 0277 GETNGBL R13 K7 - 0x8C341B08, // 0278 GETMET R13 R13 K8 - 0x583C002A, // 0279 LDCONST R15 K42 - 0x54420003, // 027A LDINT R16 4 - 0x7C340600, // 027B CALL R13 3 - 0x88340B78, // 027C GETMBR R13 R5 K120 - 0x90129C0D, // 027D SETMBR R4 K78 R13 - 0xB8360E00, // 027E GETNGBL R13 K7 - 0x8C341B08, // 027F GETMET R13 R13 K8 - 0x883C093A, // 0280 GETMBR R15 R4 K58 - 0x8C3C1F2C, // 0281 GETMET R15 R15 K44 - 0x7C3C0200, // 0282 CALL R15 1 - 0x003EF20F, // 0283 ADD R15 K121 R15 - 0x54420003, // 0284 LDINT R16 4 - 0x7C340600, // 0285 CALL R13 3 - 0xB8360E00, // 0286 GETNGBL R13 K7 - 0x8C341B08, // 0287 GETMET R13 R13 K8 - 0x883C094E, // 0288 GETMBR R15 R4 K78 - 0x8C3C1F2C, // 0289 GETMET R15 R15 K44 - 0x7C3C0200, // 028A CALL R15 1 - 0x003EF40F, // 028B ADD R15 K122 R15 - 0x54420003, // 028C LDINT R16 4 - 0x7C340600, // 028D CALL R13 3 - 0x8C34057B, // 028E GETMET R13 R2 K123 - 0x7C340200, // 028F CALL R13 1 - 0x8C341B7C, // 0290 GETMET R13 R13 K124 - 0x883C094E, // 0291 GETMBR R15 R4 K78 - 0x7C340400, // 0292 CALL R13 2 - 0x8C341B7D, // 0293 GETMET R13 R13 K125 - 0x7C340200, // 0294 CALL R13 1 - 0xB83A0E00, // 0295 GETNGBL R14 K7 - 0x8C381D08, // 0296 GETMET R14 R14 K8 - 0x8C401B2C, // 0297 GETMET R16 R13 K44 - 0x7C400200, // 0298 CALL R16 1 - 0x0042FC10, // 0299 ADD R16 K126 R16 - 0x54460003, // 029A LDINT R17 4 - 0x7C380600, // 029B CALL R14 3 - 0x60380015, // 029C GETGBL R14 G21 - 0x7C380000, // 029D CALL R14 0 - 0x8C381D20, // 029E GETMET R14 R14 K32 - 0x8840017F, // 029F GETMBR R16 R0 K127 - 0x7C380400, // 02A0 CALL R14 2 - 0x8C3C0980, // 02A1 GETMET R15 R4 K128 - 0x7C3C0200, // 02A2 CALL R15 1 - 0x003C1E09, // 02A3 ADD R15 R15 R9 - 0x8840096A, // 02A4 GETMBR R16 R4 K106 - 0x003C1E10, // 02A5 ADD R15 R15 R16 - 0x003C1E0D, // 02A6 ADD R15 R15 R13 - 0x8C400522, // 02A7 GETMET R16 R2 K34 - 0x7C400200, // 02A8 CALL R16 1 - 0x8C402123, // 02A9 GETMET R16 R16 K35 - 0x88480924, // 02AA GETMBR R18 R4 K36 - 0x5C4C1E00, // 02AB MOVE R19 R15 - 0x5C501C00, // 02AC MOVE R20 R14 - 0x5456000F, // 02AD LDINT R21 16 - 0x7C400A00, // 02AE CALL R16 5 - 0xB8460E00, // 02AF GETNGBL R17 K7 - 0x8C442308, // 02B0 GETMET R17 R17 K8 - 0x884C0924, // 02B1 GETMBR R19 R4 K36 - 0x8C4C272C, // 02B2 GETMET R19 R19 K44 - 0x7C4C0200, // 02B3 CALL R19 1 - 0x004F0213, // 02B4 ADD R19 K129 R19 - 0x54520003, // 02B5 LDINT R20 4 - 0x7C440600, // 02B6 CALL R17 3 - 0xB8460E00, // 02B7 GETNGBL R17 K7 - 0x8C442308, // 02B8 GETMET R17 R17 K8 - 0x8C4C1F2C, // 02B9 GETMET R19 R15 K44 - 0x7C4C0200, // 02BA CALL R19 1 - 0x004F0413, // 02BB ADD R19 K130 R19 - 0x54520003, // 02BC LDINT R20 4 - 0x7C440600, // 02BD CALL R17 3 - 0xB8460E00, // 02BE GETNGBL R17 K7 - 0x8C442308, // 02BF GETMET R17 R17 K8 - 0x8C4C212C, // 02C0 GETMET R19 R16 K44 - 0x7C4C0200, // 02C1 CALL R19 1 - 0x004F0613, // 02C2 ADD R19 K131 R19 - 0x54520003, // 02C3 LDINT R20 4 - 0x7C440600, // 02C4 CALL R17 3 - 0x8C44194D, // 02C5 GETMET R17 R12 K77 - 0x7C440200, // 02C6 CALL R17 1 - 0xB84A0E00, // 02C7 GETNGBL R18 K7 - 0x8C482508, // 02C8 GETMET R18 R18 K8 - 0x8C50232C, // 02C9 GETMET R20 R17 K44 - 0x7C500200, // 02CA CALL R20 1 - 0x00530814, // 02CB ADD R20 K132 R20 - 0x54560003, // 02CC LDINT R21 4 - 0x7C480600, // 02CD CALL R18 3 - 0x8C480527, // 02CE GETMET R18 R2 K39 - 0x5C502000, // 02CF MOVE R20 R16 - 0x60540015, // 02D0 GETGBL R21 G21 - 0x7C540000, // 02D1 CALL R21 0 - 0x8C542B20, // 02D2 GETMET R21 R21 K32 - 0x885C0185, // 02D3 GETMBR R23 R0 K133 - 0x7C540400, // 02D4 CALL R21 2 - 0x60580015, // 02D5 GETGBL R22 G21 - 0x7C580000, // 02D6 CALL R22 0 - 0x605C000C, // 02D7 GETGBL R23 G12 - 0x5C602200, // 02D8 MOVE R24 R17 - 0x7C5C0200, // 02D9 CALL R23 1 - 0x5462000F, // 02DA LDINT R24 16 - 0x7C480C00, // 02DB CALL R18 6 - 0x8C4C2586, // 02DC GETMET R19 R18 K134 - 0x5C542200, // 02DD MOVE R21 R17 - 0x7C4C0400, // 02DE CALL R19 2 - 0x8C502529, // 02DF GETMET R20 R18 K41 - 0x7C500200, // 02E0 CALL R20 1 - 0x004C2614, // 02E1 ADD R19 R19 R20 - 0xB8520E00, // 02E2 GETNGBL R20 K7 - 0x8C502908, // 02E3 GETMET R20 R20 K8 - 0x8C58272C, // 02E4 GETMET R22 R19 K44 - 0x7C580200, // 02E5 CALL R22 1 - 0x005B0E16, // 02E6 ADD R22 K135 R22 - 0x545E0003, // 02E7 LDINT R23 4 - 0x7C500600, // 02E8 CALL R20 3 - 0xB8520E00, // 02E9 GETNGBL R20 K7 - 0x8C502908, // 02EA GETMET R20 R20 K8 - 0x5858002A, // 02EB LDCONST R22 K42 - 0x545E0003, // 02EC LDINT R23 4 - 0x7C500600, // 02ED CALL R20 3 - 0xB8521A00, // 02EE GETNGBL R20 K13 - 0x8C502988, // 02EF GETMET R20 R20 K136 - 0x7C500200, // 02F0 CALL R20 1 - 0x90531209, // 02F1 SETMBR R20 K137 R9 - 0x88540935, // 02F2 GETMBR R21 R4 K53 - 0x90531415, // 02F3 SETMBR R20 K138 R21 - 0x8854096A, // 02F4 GETMBR R21 R4 K106 - 0x90531615, // 02F5 SETMBR R20 K139 R21 - 0x90531813, // 02F6 SETMBR R20 K140 R19 - 0xB8560E00, // 02F7 GETNGBL R21 K7 - 0x8C542B08, // 02F8 GETMET R21 R21 K8 - 0xB85E1A00, // 02F9 GETNGBL R23 K13 - 0x8C5C2F14, // 02FA GETMET R23 R23 K20 - 0x5C642800, // 02FB MOVE R25 R20 - 0x7C5C0400, // 02FC CALL R23 2 - 0x005F1A17, // 02FD ADD R23 K141 R23 - 0x54620003, // 02FE LDINT R24 4 - 0x7C540600, // 02FF CALL R21 3 - 0x8C54294D, // 0300 GETMET R21 R20 K77 - 0x7C540200, // 0301 CALL R21 1 - 0x90131C15, // 0302 SETMBR R4 K142 R21 - 0xB85A0E00, // 0303 GETNGBL R22 K7 - 0x8C582D08, // 0304 GETMET R22 R22 K8 - 0x8C602B2C, // 0305 GETMET R24 R21 K44 - 0x7C600200, // 0306 CALL R24 1 - 0x00631E18, // 0307 ADD R24 K143 R24 - 0x54660003, // 0308 LDINT R25 4 - 0x7C580600, // 0309 CALL R22 3 - 0x8C580351, // 030A GETMET R22 R1 K81 - 0x54620030, // 030B LDINT R24 49 - 0x50640200, // 030C LDBOOL R25 1 0 - 0x7C580600, // 030D CALL R22 3 - 0x8C5C2D52, // 030E GETMET R23 R22 K82 - 0x5C642A00, // 030F MOVE R25 R21 - 0x7C5C0400, // 0310 CALL R23 2 - 0x88600153, // 0311 GETMBR R24 R0 K83 - 0x8C603154, // 0312 GETMET R24 R24 K84 - 0x5C682C00, // 0313 MOVE R26 R22 - 0x7C600400, // 0314 CALL R24 2 - 0x50600200, // 0315 LDBOOL R24 1 0 - 0x80043000, // 0316 RET 1 R24 - 0x50200200, // 0317 LDBOOL R8 1 0 - 0x80041000, // 0318 RET 1 R8 + 0x1C441A10, // 0093 EQ R17 R13 R16 + 0x78460085, // 0094 JMPF R17 #011B + 0x88440F1E, // 0095 GETMBR R17 R7 K30 + 0x90123C11, // 0096 SETMBR R4 K30 R17 + 0x8844032B, // 0097 GETMBR R17 R1 K43 + 0x90125411, // 0098 SETMBR R4 K42 R17 + 0x8C44092C, // 0099 GETMET R17 R4 K44 + 0x7C440200, // 009A CALL R17 1 + 0x88440B2E, // 009B GETMBR R17 R5 K46 + 0x90125A11, // 009C SETMBR R4 K45 R17 + 0x8844011A, // 009D GETMBR R17 R0 K26 + 0x8844231B, // 009E GETMBR R17 R17 K27 + 0x8C442330, // 009F GETMET R17 R17 K48 + 0x7C440200, // 00A0 CALL R17 1 + 0x90125E11, // 00A1 SETMBR R4 K47 R17 + 0xB8460E00, // 00A2 GETNGBL R17 K7 + 0x8C442308, // 00A3 GETMET R17 R17 K8 + 0x8C4C0712, // 00A4 GETMET R19 R3 K18 + 0x58540031, // 00A5 LDCONST R21 K49 + 0x8858092F, // 00A6 GETMBR R22 R4 K47 + 0x885C0332, // 00A7 GETMBR R23 R1 K50 + 0x88600333, // 00A8 GETMBR R24 R1 K51 + 0x7C4C0A00, // 00A9 CALL R19 5 + 0x5850000A, // 00AA LDCONST R20 K10 + 0x7C440600, // 00AB CALL R17 3 + 0x88440F24, // 00AC GETMBR R17 R7 K36 + 0x90124811, // 00AD SETMBR R4 K36 R17 + 0x8C440535, // 00AE GETMET R17 R2 K53 + 0x544E000F, // 00AF LDINT R19 16 + 0x7C440400, // 00B0 CALL R17 2 + 0x90126811, // 00B1 SETMBR R4 K52 R17 + 0x60440015, // 00B2 GETGBL R17 G21 + 0x7C440000, // 00B3 CALL R17 0 + 0x8C442320, // 00B4 GETMET R17 R17 K32 + 0x584C0036, // 00B5 LDCONST R19 K54 + 0x7C440400, // 00B6 CALL R17 2 + 0x88480B1F, // 00B7 GETMBR R18 R5 K31 + 0x884C0934, // 00B8 GETMBR R19 R4 K52 + 0x00482413, // 00B9 ADD R18 R18 R19 + 0x8C4C0522, // 00BA GETMET R19 R2 K34 + 0x7C4C0200, // 00BB CALL R19 1 + 0x8C4C2723, // 00BC GETMET R19 R19 K35 + 0x88540924, // 00BD GETMBR R21 R4 K36 + 0x5C582400, // 00BE MOVE R22 R18 + 0x5C5C2200, // 00BF MOVE R23 R17 + 0x5462000F, // 00C0 LDINT R24 16 + 0x7C4C0A00, // 00C1 CALL R19 5 + 0x8C500527, // 00C2 GETMET R20 R2 K39 + 0x5C582600, // 00C3 MOVE R22 R19 + 0x605C0015, // 00C4 GETGBL R23 G21 + 0x7C5C0000, // 00C5 CALL R23 0 + 0x8C5C2F20, // 00C6 GETMET R23 R23 K32 + 0x58640037, // 00C7 LDCONST R25 K55 + 0x7C5C0400, // 00C8 CALL R23 2 + 0x60600015, // 00C9 GETGBL R24 G21 + 0x7C600000, // 00CA CALL R24 0 + 0x58640005, // 00CB LDCONST R25 K5 + 0x546A000F, // 00CC LDINT R26 16 + 0x7C500C00, // 00CD CALL R20 6 + 0x8C542929, // 00CE GETMET R21 R20 K41 + 0x7C540200, // 00CF CALL R21 1 + 0xB85A1A00, // 00D0 GETNGBL R22 K13 + 0x8C582D38, // 00D1 GETMET R22 R22 K56 + 0x7C580200, // 00D2 CALL R22 1 + 0x885C0934, // 00D3 GETMBR R23 R4 K52 + 0x905A2E17, // 00D4 SETMBR R22 K23 R23 + 0x885C092F, // 00D5 GETMBR R23 R4 K47 + 0x905A7217, // 00D6 SETMBR R22 K57 R23 + 0x905A7415, // 00D7 SETMBR R22 K58 R21 + 0x8C5C0522, // 00D8 GETMET R23 R2 K34 + 0x7C5C0200, // 00D9 CALL R23 1 + 0x8C5C2F23, // 00DA GETMET R23 R23 K35 + 0x88640924, // 00DB GETMBR R25 R4 K36 + 0x88680B1F, // 00DC GETMBR R26 R5 K31 + 0x886C0934, // 00DD GETMBR R27 R4 K52 + 0x0068341B, // 00DE ADD R26 R26 R27 + 0x606C0015, // 00DF GETGBL R27 G21 + 0x7C6C0000, // 00E0 CALL R27 0 + 0x8C6C3720, // 00E1 GETMET R27 R27 K32 + 0x5874003B, // 00E2 LDCONST R29 K59 + 0x7C6C0400, // 00E3 CALL R27 2 + 0x5472002F, // 00E4 LDINT R28 48 + 0x7C5C0A00, // 00E5 CALL R23 5 + 0x5462000E, // 00E6 LDINT R24 15 + 0x40620A18, // 00E7 CONNECT R24 K5 R24 + 0x94602E18, // 00E8 GETIDX R24 R23 R24 + 0x5466000F, // 00E9 LDINT R25 16 + 0x546A001E, // 00EA LDINT R26 31 + 0x4064321A, // 00EB CONNECT R25 R25 R26 + 0x94642E19, // 00EC GETIDX R25 R23 R25 + 0x546A001F, // 00ED LDINT R26 32 + 0x546E002E, // 00EE LDINT R27 47 + 0x4068341B, // 00EF CONNECT R26 R26 R27 + 0x94682E1A, // 00F0 GETIDX R26 R23 R26 + 0xB86E0E00, // 00F1 GETNGBL R27 K7 + 0x8C6C373C, // 00F2 GETMET R27 R27 K60 + 0x7C6C0200, // 00F3 CALL R27 1 + 0x946C373D, // 00F4 GETIDX R27 R27 K61 + 0x8C702D3E, // 00F5 GETMET R28 R22 K62 + 0x7C700200, // 00F6 CALL R28 1 + 0x4C740000, // 00F7 LDNIL R29 + 0x90127E1D, // 00F8 SETMBR R4 K63 R29 + 0x8C740340, // 00F9 GETMET R29 R1 K64 + 0x547E0032, // 00FA LDINT R31 51 + 0x50800200, // 00FB LDBOOL R32 1 0 + 0x7C740600, // 00FC CALL R29 3 + 0x8C783B41, // 00FD GETMET R30 R29 K65 + 0x5C803800, // 00FE MOVE R32 R28 + 0x7C780400, // 00FF CALL R30 2 + 0x887C0142, // 0100 GETMBR R31 R0 K66 + 0x8C7C3F43, // 0101 GETMET R31 R31 K67 + 0x5C843A00, // 0102 MOVE R33 R29 + 0x7C7C0400, // 0103 CALL R31 2 + 0x8C7C0944, // 0104 GETMET R31 R4 K68 + 0x7C7C0200, // 0105 CALL R31 1 + 0x8C7C0945, // 0106 GETMET R31 R4 K69 + 0x5C843000, // 0107 MOVE R33 R24 + 0x5C883200, // 0108 MOVE R34 R25 + 0x5C8C3400, // 0109 MOVE R35 R26 + 0x5C903600, // 010A MOVE R36 R27 + 0x7C7C0A00, // 010B CALL R31 5 + 0x90128D05, // 010C SETMBR R4 K70 K5 + 0x8C7C0947, // 010D GETMET R31 R4 K71 + 0x7C7C0200, // 010E CALL R31 1 + 0x8C7C0948, // 010F GETMET R31 R4 K72 + 0x50840200, // 0110 LDBOOL R33 1 0 + 0x7C7C0400, // 0111 CALL R31 2 + 0x8C7C0949, // 0112 GETMET R31 R4 K73 + 0x7C7C0200, // 0113 CALL R31 1 + 0x8C7C094A, // 0114 GETMET R31 R4 K74 + 0x7C7C0200, // 0115 CALL R31 1 + 0x8C7C094B, // 0116 GETMET R31 R4 K75 + 0x7C7C0200, // 0117 CALL R31 1 + 0x507C0200, // 0118 LDBOOL R31 1 0 + 0x80043E00, // 0119 RET 1 R31 + 0x70020000, // 011A JMP #011C + 0x50180000, // 011B LDBOOL R6 0 0 + 0x5C200C00, // 011C MOVE R8 R6 + 0x7422011F, // 011D JMPT R8 #023E + 0x8C20014C, // 011E GETMET R8 R0 K76 + 0x88280B4D, // 011F GETMBR R10 R5 K77 + 0x882C0B1F, // 0120 GETMBR R11 R5 K31 + 0x7C200600, // 0121 CALL R8 3 + 0x90123C08, // 0122 SETMBR R4 K30 R8 + 0x4C240000, // 0123 LDNIL R9 + 0x1C240809, // 0124 EQ R9 R4 R9 + 0x74260003, // 0125 JMPT R9 #012A + 0x8824091E, // 0126 GETMBR R9 R4 K30 + 0x4C280000, // 0127 LDNIL R10 + 0x1C24120A, // 0128 EQ R9 R9 R10 + 0x7826000D, // 0129 JMPF R9 #0138 + 0xB8260E00, // 012A GETNGBL R9 K7 + 0x8C241308, // 012B GETMET R9 R9 K8 + 0x582C004E, // 012C LDCONST R11 K78 + 0x5830000A, // 012D LDCONST R12 K10 + 0x7C240600, // 012E CALL R9 3 + 0x8C24010B, // 012F GETMET R9 R0 K11 + 0x5C2C0200, // 0130 MOVE R11 R1 + 0x5830000C, // 0131 LDCONST R12 K12 + 0x58340005, // 0132 LDCONST R13 K5 + 0x5838000C, // 0133 LDCONST R14 K12 + 0x503C0000, // 0134 LDBOOL R15 0 0 + 0x7C240C00, // 0135 CALL R9 6 + 0x50240000, // 0136 LDBOOL R9 0 0 + 0x80041200, // 0137 RET 1 R9 + 0x8824032B, // 0138 GETMBR R9 R1 K43 + 0x90125409, // 0139 SETMBR R4 K42 R9 + 0x8C24092C, // 013A GETMET R9 R4 K44 + 0x7C240200, // 013B CALL R9 1 + 0x88240B2E, // 013C GETMBR R9 R5 K46 + 0x90125A09, // 013D SETMBR R4 K45 R9 + 0x8824011A, // 013E GETMBR R9 R0 K26 + 0x8824131B, // 013F GETMBR R9 R9 K27 + 0x8C241330, // 0140 GETMET R9 R9 K48 + 0x7C240200, // 0141 CALL R9 1 + 0x90125E09, // 0142 SETMBR R4 K47 R9 + 0xB8260E00, // 0143 GETNGBL R9 K7 + 0x8C241308, // 0144 GETMET R9 R9 K8 + 0x8C2C0712, // 0145 GETMET R11 R3 K18 + 0x58340031, // 0146 LDCONST R13 K49 + 0x8838092F, // 0147 GETMBR R14 R4 K47 + 0x883C0332, // 0148 GETMBR R15 R1 K50 + 0x88400333, // 0149 GETMBR R16 R1 K51 + 0x7C2C0A00, // 014A CALL R11 5 + 0x5830000A, // 014B LDCONST R12 K10 + 0x7C240600, // 014C CALL R9 3 + 0xB8260E00, // 014D GETNGBL R9 K7 + 0x8C241308, // 014E GETMET R9 R9 K8 + 0xB82E1A00, // 014F GETNGBL R11 K13 + 0x8C2C1714, // 0150 GETMET R11 R11 K20 + 0x8834091E, // 0151 GETMBR R13 R4 K30 + 0x7C2C0400, // 0152 CALL R11 2 + 0x002E9E0B, // 0153 ADD R11 K79 R11 + 0x54320003, // 0154 LDINT R12 4 + 0x7C240600, // 0155 CALL R9 3 + 0xB8260E00, // 0156 GETNGBL R9 K7 + 0x8C241308, // 0157 GETMET R9 R9 K8 + 0x882C091E, // 0158 GETMBR R11 R4 K30 + 0x882C1751, // 0159 GETMBR R11 R11 K81 + 0x8C2C1752, // 015A GETMET R11 R11 K82 + 0x7C2C0200, // 015B CALL R11 1 + 0x002EA00B, // 015C ADD R11 K80 R11 + 0x54320003, // 015D LDINT R12 4 + 0x7C240600, // 015E CALL R9 3 + 0xB8260E00, // 015F GETNGBL R9 K7 + 0x8C241308, // 0160 GETMET R9 R9 K8 + 0x882C091E, // 0161 GETMBR R11 R4 K30 + 0x882C1754, // 0162 GETMBR R11 R11 K84 + 0x8C2C1752, // 0163 GETMET R11 R11 K82 + 0x7C2C0200, // 0164 CALL R11 1 + 0x002EA60B, // 0165 ADD R11 K83 R11 + 0x54320003, // 0166 LDINT R12 4 + 0x7C240600, // 0167 CALL R9 3 + 0x8824091E, // 0168 GETMBR R9 R4 K30 + 0x8C241355, // 0169 GETMET R9 R9 K85 + 0x7C240200, // 016A CALL R9 1 + 0x78260009, // 016B JMPF R9 #0176 + 0xB8260E00, // 016C GETNGBL R9 K7 + 0x8C241308, // 016D GETMET R9 R9 K8 + 0x882C091E, // 016E GETMBR R11 R4 K30 + 0x8C2C1755, // 016F GETMET R11 R11 K85 + 0x7C2C0200, // 0170 CALL R11 1 + 0x8C2C1752, // 0171 GETMET R11 R11 K82 + 0x7C2C0200, // 0172 CALL R11 1 + 0x002EAC0B, // 0173 ADD R11 K86 R11 + 0x54320003, // 0174 LDINT R12 4 + 0x7C240600, // 0175 CALL R9 3 + 0xB8260E00, // 0176 GETNGBL R9 K7 + 0x8C241308, // 0177 GETMET R9 R9 K8 + 0x882C091E, // 0178 GETMBR R11 R4 K30 + 0x882C1758, // 0179 GETMBR R11 R11 K88 + 0x8C2C1752, // 017A GETMET R11 R11 K82 + 0x7C2C0200, // 017B CALL R11 1 + 0x002EAE0B, // 017C ADD R11 K87 R11 + 0x54320003, // 017D LDINT R12 4 + 0x7C240600, // 017E CALL R9 3 + 0x8C240535, // 017F GETMET R9 R2 K53 + 0x542E000F, // 0180 LDINT R11 16 + 0x7C240400, // 0181 CALL R9 2 + 0x90126809, // 0182 SETMBR R4 K52 R9 + 0x8C240535, // 0183 GETMET R9 R2 K53 + 0x542E001F, // 0184 LDINT R11 32 + 0x7C240400, // 0185 CALL R9 2 + 0x9012B209, // 0186 SETMBR R4 K89 R9 + 0x8C24055B, // 0187 GETMET R9 R2 K91 + 0x7C240200, // 0188 CALL R9 1 + 0x8C24135C, // 0189 GETMET R9 R9 K92 + 0x882C0959, // 018A GETMBR R11 R4 K89 + 0x7C240400, // 018B CALL R9 2 + 0x9012B409, // 018C SETMBR R4 K90 R9 + 0xB8260E00, // 018D GETNGBL R9 K7 + 0x8C241308, // 018E GETMET R9 R9 K8 + 0x882C0959, // 018F GETMBR R11 R4 K89 + 0x8C2C1752, // 0190 GETMET R11 R11 K82 + 0x7C2C0200, // 0191 CALL R11 1 + 0x002EBA0B, // 0192 ADD R11 K93 R11 + 0x54320003, // 0193 LDINT R12 4 + 0x7C240600, // 0194 CALL R9 3 + 0xB8260E00, // 0195 GETNGBL R9 K7 + 0x8C241308, // 0196 GETMET R9 R9 K8 + 0x882C095A, // 0197 GETMBR R11 R4 K90 + 0x8C2C1752, // 0198 GETMET R11 R11 K82 + 0x7C2C0200, // 0199 CALL R11 1 + 0x002EBC0B, // 019A ADD R11 K94 R11 + 0x54320003, // 019B LDINT R12 4 + 0x7C240600, // 019C CALL R9 3 + 0x8C240535, // 019D GETMET R9 R2 K53 + 0x542E001F, // 019E LDINT R11 32 + 0x7C240400, // 019F CALL R9 2 + 0x8C28055B, // 01A0 GETMET R10 R2 K91 + 0x7C280200, // 01A1 CALL R10 1 + 0x8C28155F, // 01A2 GETMET R10 R10 K95 + 0x88300959, // 01A3 GETMBR R12 R4 K89 + 0x88340B16, // 01A4 GETMBR R13 R5 K22 + 0x7C280600, // 01A5 CALL R10 3 + 0x9012480A, // 01A6 SETMBR R4 K36 R10 + 0xB82A1A00, // 01A7 GETNGBL R10 K13 + 0x88281560, // 01A8 GETMBR R10 R10 K96 + 0x8C281561, // 01A9 GETMET R10 R10 K97 + 0x7C280200, // 01AA CALL R10 1 + 0x8C2C1562, // 01AB GETMET R11 R10 K98 + 0x5834000C, // 01AC LDCONST R13 K12 + 0xB83A1A00, // 01AD GETNGBL R14 K13 + 0x88381D60, // 01AE GETMBR R14 R14 K96 + 0x88381D63, // 01AF GETMBR R14 R14 K99 + 0x8C3C0964, // 01B0 GETMET R15 R4 K100 + 0x7C3C0200, // 01B1 CALL R15 1 + 0x7C2C0800, // 01B2 CALL R11 4 + 0x8C2C1562, // 01B3 GETMET R11 R10 K98 + 0x5834000A, // 01B4 LDCONST R13 K10 + 0xB83A1A00, // 01B5 GETNGBL R14 K13 + 0x88381D60, // 01B6 GETMBR R14 R14 K96 + 0x88381D63, // 01B7 GETMBR R14 R14 K99 + 0x8C3C0955, // 01B8 GETMET R15 R4 K85 + 0x7C3C0200, // 01B9 CALL R15 1 + 0x7C2C0800, // 01BA CALL R11 4 + 0x8C2C1562, // 01BB GETMET R11 R10 K98 + 0x58340065, // 01BC LDCONST R13 K101 + 0xB83A1A00, // 01BD GETNGBL R14 K13 + 0x88381D60, // 01BE GETMBR R14 R14 K96 + 0x88381D63, // 01BF GETMBR R14 R14 K99 + 0x883C095A, // 01C0 GETMBR R15 R4 K90 + 0x7C2C0800, // 01C1 CALL R11 4 + 0x8C2C1562, // 01C2 GETMET R11 R10 K98 + 0x54360003, // 01C3 LDINT R13 4 + 0xB83A1A00, // 01C4 GETNGBL R14 K13 + 0x88381D60, // 01C5 GETMBR R14 R14 K96 + 0x88381D63, // 01C6 GETMBR R14 R14 K99 + 0x883C0B16, // 01C7 GETMBR R15 R5 K22 + 0x7C2C0800, // 01C8 CALL R11 4 + 0x8C2C055B, // 01C9 GETMET R11 R2 K91 + 0x7C2C0200, // 01CA CALL R11 1 + 0x8C2C1766, // 01CB GETMET R11 R11 K102 + 0x8C340967, // 01CC GETMET R13 R4 K103 + 0x7C340200, // 01CD CALL R13 1 + 0x8C38153E, // 01CE GETMET R14 R10 K62 + 0x7C380200, // 01CF CALL R14 1 + 0x7C2C0600, // 01D0 CALL R11 3 + 0xB8321A00, // 01D1 GETNGBL R12 K13 + 0x88301960, // 01D2 GETMBR R12 R12 K96 + 0x8C301961, // 01D3 GETMET R12 R12 K97 + 0x7C300200, // 01D4 CALL R12 1 + 0x8C341962, // 01D5 GETMET R13 R12 K98 + 0x583C000C, // 01D6 LDCONST R15 K12 + 0xB8421A00, // 01D7 GETNGBL R16 K13 + 0x88402160, // 01D8 GETMBR R16 R16 K96 + 0x88402163, // 01D9 GETMBR R16 R16 K99 + 0x8C440964, // 01DA GETMET R17 R4 K100 + 0x7C440200, // 01DB CALL R17 1 + 0x7C340800, // 01DC CALL R13 4 + 0x8C341962, // 01DD GETMET R13 R12 K98 + 0x583C000A, // 01DE LDCONST R15 K10 + 0xB8421A00, // 01DF GETNGBL R16 K13 + 0x88402160, // 01E0 GETMBR R16 R16 K96 + 0x88402163, // 01E1 GETMBR R16 R16 K99 + 0x8C440955, // 01E2 GETMET R17 R4 K85 + 0x7C440200, // 01E3 CALL R17 1 + 0x7C340800, // 01E4 CALL R13 4 + 0x8C341962, // 01E5 GETMET R13 R12 K98 + 0x583C0065, // 01E6 LDCONST R15 K101 + 0xB8421A00, // 01E7 GETNGBL R16 K13 + 0x88402160, // 01E8 GETMBR R16 R16 K96 + 0x88402163, // 01E9 GETMBR R16 R16 K99 + 0x5C441600, // 01EA MOVE R17 R11 + 0x7C340800, // 01EB CALL R13 4 + 0x8C341962, // 01EC GETMET R13 R12 K98 + 0x543E0003, // 01ED LDINT R15 4 + 0xB8421A00, // 01EE GETNGBL R16 K13 + 0x88402160, // 01EF GETMBR R16 R16 K96 + 0x88402163, // 01F0 GETMBR R16 R16 K99 + 0x88440934, // 01F1 GETMBR R17 R4 K52 + 0x7C340800, // 01F2 CALL R13 4 + 0x88340B68, // 01F3 GETMBR R13 R5 K104 + 0x90127E0D, // 01F4 SETMBR R4 K63 R13 + 0x8C340569, // 01F5 GETMET R13 R2 K105 + 0x7C340200, // 01F6 CALL R13 1 + 0x8C341B6A, // 01F7 GETMET R13 R13 K106 + 0x883C093F, // 01F8 GETMBR R15 R4 K63 + 0x7C340400, // 01F9 CALL R13 2 + 0x8C341B6B, // 01FA GETMET R13 R13 K107 + 0x7C340200, // 01FB CALL R13 1 + 0x60380015, // 01FC GETGBL R14 G21 + 0x7C380000, // 01FD CALL R14 0 + 0x8C381D20, // 01FE GETMET R14 R14 K32 + 0x8840016C, // 01FF GETMBR R16 R0 K108 + 0x7C380400, // 0200 CALL R14 2 + 0x8C3C096D, // 0201 GETMET R15 R4 K109 + 0x7C3C0200, // 0202 CALL R15 1 + 0x003C1E09, // 0203 ADD R15 R15 R9 + 0x8840095A, // 0204 GETMBR R16 R4 K90 + 0x003C1E10, // 0205 ADD R15 R15 R16 + 0x003C1E0D, // 0206 ADD R15 R15 R13 + 0x8C400522, // 0207 GETMET R16 R2 K34 + 0x7C400200, // 0208 CALL R16 1 + 0x8C402123, // 0209 GETMET R16 R16 K35 + 0x88480924, // 020A GETMBR R18 R4 K36 + 0x5C4C1E00, // 020B MOVE R19 R15 + 0x5C501C00, // 020C MOVE R20 R14 + 0x5456000F, // 020D LDINT R21 16 + 0x7C400A00, // 020E CALL R16 5 + 0x8C44193E, // 020F GETMET R17 R12 K62 + 0x7C440200, // 0210 CALL R17 1 + 0x8C480527, // 0211 GETMET R18 R2 K39 + 0x5C502000, // 0212 MOVE R20 R16 + 0x60540015, // 0213 GETGBL R21 G21 + 0x7C540000, // 0214 CALL R21 0 + 0x8C542B20, // 0215 GETMET R21 R21 K32 + 0x885C016E, // 0216 GETMBR R23 R0 K110 + 0x7C540400, // 0217 CALL R21 2 + 0x60580015, // 0218 GETGBL R22 G21 + 0x7C580000, // 0219 CALL R22 0 + 0x605C000C, // 021A GETGBL R23 G12 + 0x5C602200, // 021B MOVE R24 R17 + 0x7C5C0200, // 021C CALL R23 1 + 0x5462000F, // 021D LDINT R24 16 + 0x7C480C00, // 021E CALL R18 6 + 0x8C4C256F, // 021F GETMET R19 R18 K111 + 0x5C542200, // 0220 MOVE R21 R17 + 0x7C4C0400, // 0221 CALL R19 2 + 0x8C502529, // 0222 GETMET R20 R18 K41 + 0x7C500200, // 0223 CALL R20 1 + 0x004C2614, // 0224 ADD R19 R19 R20 + 0xB8521A00, // 0225 GETNGBL R20 K13 + 0x8C502970, // 0226 GETMET R20 R20 K112 + 0x7C500200, // 0227 CALL R20 1 + 0x9052E209, // 0228 SETMBR R20 K113 R9 + 0x8854092F, // 0229 GETMBR R21 R4 K47 + 0x9052E415, // 022A SETMBR R20 K114 R21 + 0x8854095A, // 022B GETMBR R21 R4 K90 + 0x9052E615, // 022C SETMBR R20 K115 R21 + 0x9052E813, // 022D SETMBR R20 K116 R19 + 0x8C54293E, // 022E GETMET R21 R20 K62 + 0x7C540200, // 022F CALL R21 1 + 0x9012EA15, // 0230 SETMBR R4 K117 R21 + 0x8C580340, // 0231 GETMET R22 R1 K64 + 0x54620030, // 0232 LDINT R24 49 + 0x50640200, // 0233 LDBOOL R25 1 0 + 0x7C580600, // 0234 CALL R22 3 + 0x8C5C2D41, // 0235 GETMET R23 R22 K65 + 0x5C642A00, // 0236 MOVE R25 R21 + 0x7C5C0400, // 0237 CALL R23 2 + 0x88600142, // 0238 GETMBR R24 R0 K66 + 0x8C603143, // 0239 GETMET R24 R24 K67 + 0x5C682C00, // 023A MOVE R26 R22 + 0x7C600400, // 023B CALL R24 2 + 0x50600200, // 023C LDBOOL R24 1 0 + 0x80043000, // 023D RET 1 R24 + 0x50200200, // 023E LDBOOL R8 1 0 + 0x80041000, // 023F RET 1 R8 }) ) ); From c33472d9b63f93b0fb425bf6014eefe2a9fd7419 Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Thu, 27 Apr 2023 14:19:27 +0200 Subject: [PATCH 046/289] ArduinoOTA support only ESP8266 (#18528) * ArduinoOTA support only ESP8266 * add comment ArduinoOTA --- tasmota/my_user_config.h | 2 +- tasmota/tasmota_support/support_tasmota.ino | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/tasmota/my_user_config.h b/tasmota/my_user_config.h index a246126ab..83c450db6 100644 --- a/tasmota/my_user_config.h +++ b/tasmota/my_user_config.h @@ -398,7 +398,7 @@ //#define USE_TASMESH // Enable Tasmota Mesh using ESP-NOW (+11k code) // -- OTA ----------------------------------------- -//#define USE_ARDUINO_OTA // Add optional support for Arduino OTA (+13k code) +//#define USE_ARDUINO_OTA // Add optional support for Arduino OTA with ESP8266 (+13k code) // -- Influxdb ------------------------------------ //#define USE_INFLUXDB // Enable influxdb support (+5k code) diff --git a/tasmota/tasmota_support/support_tasmota.ino b/tasmota/tasmota_support/support_tasmota.ino index 09ffc5f73..955f52816 100644 --- a/tasmota/tasmota_support/support_tasmota.ino +++ b/tasmota/tasmota_support/support_tasmota.ino @@ -1638,7 +1638,7 @@ void Every250mSeconds(void) } } -#ifdef USE_ARDUINO_OTA +#if defined(ESP8266) && defined(USE_ARDUINO_OTA) /*********************************************************************************************\ * Allow updating via the Arduino OTA-protocol. * From 53bd49ddcd0164947e7432e3528596f6649df8ef Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Thu, 27 Apr 2023 16:35:47 +0200 Subject: [PATCH 047/289] Remove USE_ARDUINO_OTA from ESP32 --- tasmota/tasmota.ino | 6 ++++++ tasmota/tasmota_support/support_tasmota.ino | 4 +++- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/tasmota/tasmota.ino b/tasmota/tasmota.ino index ec4a65f08..8e98f8002 100644 --- a/tasmota/tasmota.ino +++ b/tasmota/tasmota.ino @@ -53,12 +53,14 @@ #include #include #include +#ifdef ESP8266 #ifdef USE_ARDUINO_OTA #include // Arduino OTA #ifndef USE_DISCOVERY #define USE_DISCOVERY #endif #endif // USE_ARDUINO_OTA +#endif // ESP8266 #ifdef USE_DISCOVERY #include // MQTT, Webserver, Arduino OTA #endif // USE_DISCOVERY @@ -642,9 +644,11 @@ void setup(void) { AddLog(LOG_LEVEL_INFO, PSTR(D_WARNING_MINIMAL_VERSION)); #endif // FIRMWARE_MINIMAL +#ifdef ESP8266 #ifdef USE_ARDUINO_OTA ArduinoOTAInit(); #endif // USE_ARDUINO_OTA +#endif // ESP8266 XdrvXsnsCall(FUNC_INIT); // FUNC_INIT #ifdef USE_SCRIPT @@ -757,9 +761,11 @@ void Scheduler(void) { if (!tasconsole_serial) { TasConsoleInput(); } #endif // ESP32 +#ifdef ESP8266 #ifdef USE_ARDUINO_OTA ArduinoOtaLoop(); #endif // USE_ARDUINO_OTA +#endif // ESP8266 } void loop(void) { diff --git a/tasmota/tasmota_support/support_tasmota.ino b/tasmota/tasmota_support/support_tasmota.ino index 955f52816..c3cec04fd 100644 --- a/tasmota/tasmota_support/support_tasmota.ino +++ b/tasmota/tasmota_support/support_tasmota.ino @@ -1638,7 +1638,8 @@ void Every250mSeconds(void) } } -#if defined(ESP8266) && defined(USE_ARDUINO_OTA) +#ifdef ESP8266 +#ifdef USE_ARDUINO_OTA /*********************************************************************************************\ * Allow updating via the Arduino OTA-protocol. * @@ -1721,6 +1722,7 @@ void ArduinoOtaLoop(void) while (arduino_ota_triggered) { ArduinoOTA.handle(); } } #endif // USE_ARDUINO_OTA +#endif // ESP8266 /********************************************************************************************/ From f86bc7d8ab612588bde1b8976696a0cf9a455b29 Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Thu, 27 Apr 2023 17:44:33 +0200 Subject: [PATCH 048/289] Prep GM861 --- tasmota/include/tasmota_template.h | 6 ++++++ tasmota/language/af_AF.h | 2 ++ tasmota/language/bg_BG.h | 2 ++ tasmota/language/ca_AD.h | 2 ++ tasmota/language/cs_CZ.h | 2 ++ tasmota/language/de_DE.h | 2 ++ tasmota/language/el_GR.h | 2 ++ tasmota/language/en_GB.h | 5 ++++- tasmota/language/es_ES.h | 2 ++ tasmota/language/fr_FR.h | 2 ++ tasmota/language/fy_NL.h | 2 ++ tasmota/language/he_HE.h | 2 ++ tasmota/language/hu_HU.h | 2 ++ tasmota/language/it_IT.h | 2 ++ tasmota/language/ko_KO.h | 2 ++ tasmota/language/nl_NL.h | 2 ++ tasmota/language/pl_PL.h | 2 ++ tasmota/language/pt_BR.h | 2 ++ tasmota/language/pt_PT.h | 2 ++ tasmota/language/ro_RO.h | 2 ++ tasmota/language/ru_RU.h | 2 ++ tasmota/language/sk_SK.h | 2 ++ tasmota/language/sv_SE.h | 2 ++ tasmota/language/tr_TR.h | 2 ++ tasmota/language/uk_UA.h | 2 ++ tasmota/language/vi_VN.h | 2 ++ tasmota/language/zh_CN.h | 2 ++ tasmota/language/zh_TW.h | 2 ++ 28 files changed, 62 insertions(+), 1 deletion(-) diff --git a/tasmota/include/tasmota_template.h b/tasmota/include/tasmota_template.h index 53570e3c9..15ac3d198 100644 --- a/tasmota/include/tasmota_template.h +++ b/tasmota/include/tasmota_template.h @@ -209,6 +209,7 @@ enum UserSelectablePins { GPIO_MCP23XXX_INT, GPIO_MCP23SXX_CS, // MCP23xxx Int and SPI Chip select GPIO_PCF8574_INT, // PCF8574 interrupt GPIO_LOX_O2_RX, // LOX-O2 RX + GPIO_GM861_TX, GPIO_GM861_RX, // GM861 Serial interface GPIO_SENSOR_END }; // Error as warning to rethink GPIO usage with max 2045 @@ -465,6 +466,7 @@ const char kSensorNames[] PROGMEM = D_SENSOR_MCP23XXX_INT "|" D_SENSOR_MCP23SXX_CS "|" D_SENSOR_PCF8574_INT "|" D_SENSOR_LOX_O2_RX "|" + D_SENSOR_GM861_TX "|" D_SENSOR_GM861_RX "|" ; const char kSensorNamesFixed[] PROGMEM = @@ -1016,6 +1018,10 @@ const uint16_t kGpioNiceList[] PROGMEM = { AGPIO(GPIO_AS608_TX), AGPIO(GPIO_AS608_RX), #endif +#ifdef USE_GM861 // xsns_107_gm861.ino + AGPIO(GPIO_GM861_TX), + AGPIO(GPIO_GM861_RX), +#endif #ifdef USE_HRG15 // xsns_90_hrg15.ino AGPIO(GPIO_HRG15_TX), AGPIO(GPIO_HRG15_RX), diff --git a/tasmota/language/af_AF.h b/tasmota/language/af_AF.h index 9e3bd4c85..b4b1cfed8 100644 --- a/tasmota/language/af_AF.h +++ b/tasmota/language/af_AF.h @@ -802,6 +802,8 @@ #define D_SENSOR_OUTPUT_LO "Output Lo" #define D_SENSOR_AS608_TX "AS608 Tx" #define D_SENSOR_AS608_RX "AS608 Rx" +#define D_SENSOR_GM861_TX "GM861 Tx" +#define D_SENSOR_GM861_RX "GM861 Rx" #define D_SENSOR_DDS2382_TX "DDS238-2 Tx" #define D_SENSOR_DDS2382_RX "DDS238-2 Rx" #define D_SENSOR_DDSU666_TX "DDSU666 Tx" diff --git a/tasmota/language/bg_BG.h b/tasmota/language/bg_BG.h index c3cbbc090..7ed573c10 100644 --- a/tasmota/language/bg_BG.h +++ b/tasmota/language/bg_BG.h @@ -802,6 +802,8 @@ #define D_SENSOR_OUTPUT_LO "Output Lo" #define D_SENSOR_AS608_TX "AS608 Tx" #define D_SENSOR_AS608_RX "AS608 Rx" +#define D_SENSOR_GM861_TX "GM861 Tx" +#define D_SENSOR_GM861_RX "GM861 Rx" #define D_SENSOR_DDS2382_TX "DDS238-2 Tx" #define D_SENSOR_DDS2382_RX "DDS238-2 Rx" #define D_SENSOR_DDSU666_TX "DDSU666 Tx" diff --git a/tasmota/language/ca_AD.h b/tasmota/language/ca_AD.h index 9a4b04e36..f82f4d619 100644 --- a/tasmota/language/ca_AD.h +++ b/tasmota/language/ca_AD.h @@ -802,6 +802,8 @@ #define D_SENSOR_OUTPUT_LO "Sortida baixa" #define D_SENSOR_AS608_TX "AS608 Tx" #define D_SENSOR_AS608_RX "AS608 Rx" +#define D_SENSOR_GM861_TX "GM861 Tx" +#define D_SENSOR_GM861_RX "GM861 Rx" #define D_SENSOR_DDS2382_TX "DDS238-2 Tx" #define D_SENSOR_DDS2382_RX "DDS238-2 Rx" #define D_SENSOR_DDSU666_TX "DDSU666 Tx" diff --git a/tasmota/language/cs_CZ.h b/tasmota/language/cs_CZ.h index d0afa8994..261396243 100644 --- a/tasmota/language/cs_CZ.h +++ b/tasmota/language/cs_CZ.h @@ -802,6 +802,8 @@ #define D_SENSOR_OUTPUT_LO "Output Lo" #define D_SENSOR_AS608_TX "AS608 Tx" #define D_SENSOR_AS608_RX "AS608 Rx" +#define D_SENSOR_GM861_TX "GM861 Tx" +#define D_SENSOR_GM861_RX "GM861 Rx" #define D_SENSOR_DDS2382_TX "DDS238-2 Tx" #define D_SENSOR_DDS2382_RX "DDS238-2 Rx" #define D_SENSOR_DDSU666_TX "DDSU666 Tx" diff --git a/tasmota/language/de_DE.h b/tasmota/language/de_DE.h index cee4dcf77..8135fd778 100644 --- a/tasmota/language/de_DE.h +++ b/tasmota/language/de_DE.h @@ -802,6 +802,8 @@ #define D_SENSOR_OUTPUT_LO "Output Lo" #define D_SENSOR_AS608_TX "AS608 Tx" #define D_SENSOR_AS608_RX "AS608 Rx" +#define D_SENSOR_GM861_TX "GM861 Tx" +#define D_SENSOR_GM861_RX "GM861 Rx" #define D_SENSOR_DDS2382_TX "DDS238-2 Tx" #define D_SENSOR_DDS2382_RX "DDS238-2 Rx" #define D_SENSOR_DDSU666_TX "DDSU666 Tx" diff --git a/tasmota/language/el_GR.h b/tasmota/language/el_GR.h index cd4943ae5..86fdbc4e0 100644 --- a/tasmota/language/el_GR.h +++ b/tasmota/language/el_GR.h @@ -802,6 +802,8 @@ #define D_SENSOR_OUTPUT_LO "Output Lo" #define D_SENSOR_AS608_TX "AS608 Tx" #define D_SENSOR_AS608_RX "AS608 Rx" +#define D_SENSOR_GM861_TX "GM861 Tx" +#define D_SENSOR_GM861_RX "GM861 Rx" #define D_SENSOR_DDS2382_TX "DDS238-2 Tx" #define D_SENSOR_DDS2382_RX "DDS238-2 Rx" #define D_SENSOR_DDSU666_TX "DDSU666 Tx" diff --git a/tasmota/language/en_GB.h b/tasmota/language/en_GB.h index b3aafeda2..a322b71c5 100644 --- a/tasmota/language/en_GB.h +++ b/tasmota/language/en_GB.h @@ -802,6 +802,8 @@ #define D_SENSOR_OUTPUT_LO "Output Lo" #define D_SENSOR_AS608_TX "AS608 Tx" #define D_SENSOR_AS608_RX "AS608 Rx" +#define D_SENSOR_GM861_TX "GM861 Tx" +#define D_SENSOR_GM861_RX "GM861 Rx" #define D_SENSOR_DDS2382_TX "DDS238-2 Tx" #define D_SENSOR_DDS2382_RX "DDS238-2 Rx" #define D_SENSOR_DDSU666_TX "DDSU666 Tx" @@ -1190,7 +1192,8 @@ #define D_NEOPOOL_PUMP_TIME_EXCEEDED "pump time exceeded" // xsns_106_gdk101.ino -#define D_AVG_RAD_DOSE "Average Radiation Dose" +//#define D_AVG_RAD_DOSE "Average Radiation Dose" +#define D_AVG_RAD_DOSE "Radiation" #define D_UNIT_US_H "µSv/h" #endif // _LANGUAGE_EN_GB_H_ diff --git a/tasmota/language/es_ES.h b/tasmota/language/es_ES.h index fa98fe4c2..740912dd6 100644 --- a/tasmota/language/es_ES.h +++ b/tasmota/language/es_ES.h @@ -802,6 +802,8 @@ #define D_SENSOR_OUTPUT_LO "Fijo a OFF" #define D_SENSOR_AS608_TX "AS608 Tx" #define D_SENSOR_AS608_RX "AS608 Rx" +#define D_SENSOR_GM861_TX "GM861 Tx" +#define D_SENSOR_GM861_RX "GM861 Rx" #define D_SENSOR_DDS2382_TX "DDS238-2 Tx" #define D_SENSOR_DDS2382_RX "DDS238-2 Rx" #define D_SENSOR_DDSU666_TX "DDSU666 Tx" diff --git a/tasmota/language/fr_FR.h b/tasmota/language/fr_FR.h index 85e128b19..28de55477 100644 --- a/tasmota/language/fr_FR.h +++ b/tasmota/language/fr_FR.h @@ -802,6 +802,8 @@ #define D_SENSOR_OUTPUT_LO "Sortie Lo" #define D_SENSOR_AS608_TX "AS608 Tx" #define D_SENSOR_AS608_RX "AS608 Rx" +#define D_SENSOR_GM861_TX "GM861 Tx" +#define D_SENSOR_GM861_RX "GM861 Rx" #define D_SENSOR_DDS2382_TX "DDS238-2 Tx" #define D_SENSOR_DDS2382_RX "DDS238-2 Rx" #define D_SENSOR_DDSU666_TX "DDSU666 Tx" diff --git a/tasmota/language/fy_NL.h b/tasmota/language/fy_NL.h index b62305b8e..cf98979de 100644 --- a/tasmota/language/fy_NL.h +++ b/tasmota/language/fy_NL.h @@ -802,6 +802,8 @@ #define D_SENSOR_OUTPUT_LO "Output Lo" #define D_SENSOR_AS608_TX "AS608 Tx" #define D_SENSOR_AS608_RX "AS608 Rx" +#define D_SENSOR_GM861_TX "GM861 Tx" +#define D_SENSOR_GM861_RX "GM861 Rx" #define D_SENSOR_DDS2382_TX "DDS238-2 Tx" #define D_SENSOR_DDS2382_RX "DDS238-2 Rx" #define D_SENSOR_DDSU666_TX "DDSU666 Tx" diff --git a/tasmota/language/he_HE.h b/tasmota/language/he_HE.h index ca11fa22b..13e86a53f 100644 --- a/tasmota/language/he_HE.h +++ b/tasmota/language/he_HE.h @@ -802,6 +802,8 @@ #define D_SENSOR_OUTPUT_LO "Output Lo" #define D_SENSOR_AS608_TX "AS608 Tx" #define D_SENSOR_AS608_RX "AS608 Rx" +#define D_SENSOR_GM861_TX "GM861 Tx" +#define D_SENSOR_GM861_RX "GM861 Rx" #define D_SENSOR_DDS2382_TX "DDS238-2 Tx" #define D_SENSOR_DDS2382_RX "DDS238-2 Rx" #define D_SENSOR_DDSU666_TX "DDSU666 Tx" diff --git a/tasmota/language/hu_HU.h b/tasmota/language/hu_HU.h index 8b98a4001..3990ac173 100644 --- a/tasmota/language/hu_HU.h +++ b/tasmota/language/hu_HU.h @@ -802,6 +802,8 @@ #define D_SENSOR_OUTPUT_LO "Output Lo" #define D_SENSOR_AS608_TX "AS608 Tx" #define D_SENSOR_AS608_RX "AS608 Rx" +#define D_SENSOR_GM861_TX "GM861 Tx" +#define D_SENSOR_GM861_RX "GM861 Rx" #define D_SENSOR_DDS2382_TX "DDS238-2 Tx" #define D_SENSOR_DDS2382_RX "DDS238-2 Rx" #define D_SENSOR_DDSU666_TX "DDSU666 Tx" diff --git a/tasmota/language/it_IT.h b/tasmota/language/it_IT.h index 26d70715a..10ad33ea0 100644 --- a/tasmota/language/it_IT.h +++ b/tasmota/language/it_IT.h @@ -800,6 +800,8 @@ #define D_SENSOR_OUTPUT_LO "Uscita - Lo" #define D_SENSOR_AS608_TX "AS608 - TX" #define D_SENSOR_AS608_RX "AS608 - RX" +#define D_SENSOR_GM861_TX "GM861 Tx" +#define D_SENSOR_GM861_RX "GM861 Rx" #define D_SENSOR_DDS2382_TX "DDS238-2 - TX" #define D_SENSOR_DDS2382_RX "DDS238-2 - RX" #define D_SENSOR_DDSU666_TX "DDSU666 - TX" diff --git a/tasmota/language/ko_KO.h b/tasmota/language/ko_KO.h index e7cb05063..7577e1399 100644 --- a/tasmota/language/ko_KO.h +++ b/tasmota/language/ko_KO.h @@ -802,6 +802,8 @@ #define D_SENSOR_OUTPUT_LO "Output Lo" #define D_SENSOR_AS608_TX "AS608 Tx" #define D_SENSOR_AS608_RX "AS608 Rx" +#define D_SENSOR_GM861_TX "GM861 Tx" +#define D_SENSOR_GM861_RX "GM861 Rx" #define D_SENSOR_DDS2382_TX "DDS238-2 Tx" #define D_SENSOR_DDS2382_RX "DDS238-2 Rx" #define D_SENSOR_DDSU666_TX "DDSU666 Tx" diff --git a/tasmota/language/nl_NL.h b/tasmota/language/nl_NL.h index 61f1e73ad..a645fdc71 100644 --- a/tasmota/language/nl_NL.h +++ b/tasmota/language/nl_NL.h @@ -802,6 +802,8 @@ #define D_SENSOR_OUTPUT_LO "Output Lo" #define D_SENSOR_AS608_TX "AS608 Tx" #define D_SENSOR_AS608_RX "AS608 Rx" +#define D_SENSOR_GM861_TX "GM861 Tx" +#define D_SENSOR_GM861_RX "GM861 Rx" #define D_SENSOR_DDS2382_TX "DDS238-2 Tx" #define D_SENSOR_DDS2382_RX "DDS238-2 Rx" #define D_SENSOR_DDSU666_TX "DDSU666 Tx" diff --git a/tasmota/language/pl_PL.h b/tasmota/language/pl_PL.h index fe9696836..e4fa104cb 100644 --- a/tasmota/language/pl_PL.h +++ b/tasmota/language/pl_PL.h @@ -802,6 +802,8 @@ #define D_SENSOR_OUTPUT_LO "Wyjście Lo" #define D_SENSOR_AS608_TX "AS608 Tx" #define D_SENSOR_AS608_RX "AS608 Rx" +#define D_SENSOR_GM861_TX "GM861 Tx" +#define D_SENSOR_GM861_RX "GM861 Rx" #define D_SENSOR_DDS2382_TX "DDS238-2 Tx" #define D_SENSOR_DDS2382_RX "DDS238-2 Rx" #define D_SENSOR_DDSU666_TX "DDSU666 Tx" diff --git a/tasmota/language/pt_BR.h b/tasmota/language/pt_BR.h index 6d761c635..81cb42864 100644 --- a/tasmota/language/pt_BR.h +++ b/tasmota/language/pt_BR.h @@ -802,6 +802,8 @@ #define D_SENSOR_OUTPUT_LO "Output Lo" #define D_SENSOR_AS608_TX "AS608 Tx" #define D_SENSOR_AS608_RX "AS608 Rx" +#define D_SENSOR_GM861_TX "GM861 Tx" +#define D_SENSOR_GM861_RX "GM861 Rx" #define D_SENSOR_DDS2382_TX "DDS238-2 Tx" #define D_SENSOR_DDS2382_RX "DDS238-2 Rx" #define D_SENSOR_DDSU666_TX "DDSU666 Tx" diff --git a/tasmota/language/pt_PT.h b/tasmota/language/pt_PT.h index 04062483d..b8c5f3986 100644 --- a/tasmota/language/pt_PT.h +++ b/tasmota/language/pt_PT.h @@ -802,6 +802,8 @@ #define D_SENSOR_OUTPUT_LO "Output Lo" #define D_SENSOR_AS608_TX "AS608 Tx" #define D_SENSOR_AS608_RX "AS608 Rx" +#define D_SENSOR_GM861_TX "GM861 Tx" +#define D_SENSOR_GM861_RX "GM861 Rx" #define D_SENSOR_DDS2382_TX "DDS238-2 Tx" #define D_SENSOR_DDS2382_RX "DDS238-2 Rx" #define D_SENSOR_DDSU666_TX "DDSU666 Tx" diff --git a/tasmota/language/ro_RO.h b/tasmota/language/ro_RO.h index cc61f7a62..57034470f 100644 --- a/tasmota/language/ro_RO.h +++ b/tasmota/language/ro_RO.h @@ -802,6 +802,8 @@ #define D_SENSOR_OUTPUT_LO "Output Lo" #define D_SENSOR_AS608_TX "AS608 Tx" #define D_SENSOR_AS608_RX "AS608 Rx" +#define D_SENSOR_GM861_TX "GM861 Tx" +#define D_SENSOR_GM861_RX "GM861 Rx" #define D_SENSOR_DDS2382_TX "DDS238-2 Tx" #define D_SENSOR_DDS2382_RX "DDS238-2 Rx" #define D_SENSOR_DDSU666_TX "DDSU666 Tx" diff --git a/tasmota/language/ru_RU.h b/tasmota/language/ru_RU.h index be1bc68bb..3afd6b55f 100644 --- a/tasmota/language/ru_RU.h +++ b/tasmota/language/ru_RU.h @@ -802,6 +802,8 @@ #define D_SENSOR_OUTPUT_LO "Output Lo" #define D_SENSOR_AS608_TX "AS608 Tx" #define D_SENSOR_AS608_RX "AS608 Rx" +#define D_SENSOR_GM861_TX "GM861 Tx" +#define D_SENSOR_GM861_RX "GM861 Rx" #define D_SENSOR_DDS2382_TX "DDS238-2 Tx" #define D_SENSOR_DDS2382_RX "DDS238-2 Rx" #define D_SENSOR_DDSU666_TX "DDSU666 Tx" diff --git a/tasmota/language/sk_SK.h b/tasmota/language/sk_SK.h index e4adf2d20..61b253e19 100644 --- a/tasmota/language/sk_SK.h +++ b/tasmota/language/sk_SK.h @@ -802,6 +802,8 @@ #define D_SENSOR_OUTPUT_LO "Output Lo" #define D_SENSOR_AS608_TX "AS608 Tx" #define D_SENSOR_AS608_RX "AS608 Rx" +#define D_SENSOR_GM861_TX "GM861 Tx" +#define D_SENSOR_GM861_RX "GM861 Rx" #define D_SENSOR_DDS2382_TX "DDS238-2 Tx" #define D_SENSOR_DDS2382_RX "DDS238-2 Rx" #define D_SENSOR_DDSU666_TX "DDSU666 Tx" diff --git a/tasmota/language/sv_SE.h b/tasmota/language/sv_SE.h index 2874e4f7f..b398d0b06 100644 --- a/tasmota/language/sv_SE.h +++ b/tasmota/language/sv_SE.h @@ -802,6 +802,8 @@ #define D_SENSOR_OUTPUT_LO "Output Lo" #define D_SENSOR_AS608_TX "AS608 Tx" #define D_SENSOR_AS608_RX "AS608 Rx" +#define D_SENSOR_GM861_TX "GM861 Tx" +#define D_SENSOR_GM861_RX "GM861 Rx" #define D_SENSOR_DDS2382_TX "DDS238-2 Tx" #define D_SENSOR_DDS2382_RX "DDS238-2 Rx" #define D_SENSOR_DDSU666_TX "DDSU666 Tx" diff --git a/tasmota/language/tr_TR.h b/tasmota/language/tr_TR.h index ed0bfd4f3..c7c14ee28 100644 --- a/tasmota/language/tr_TR.h +++ b/tasmota/language/tr_TR.h @@ -802,6 +802,8 @@ #define D_SENSOR_OUTPUT_LO "Output Lo" #define D_SENSOR_AS608_TX "AS608 Tx" #define D_SENSOR_AS608_RX "AS608 Rx" +#define D_SENSOR_GM861_TX "GM861 Tx" +#define D_SENSOR_GM861_RX "GM861 Rx" #define D_SENSOR_DDS2382_TX "DDS238-2 Tx" #define D_SENSOR_DDS2382_RX "DDS238-2 Rx" #define D_SENSOR_DDSU666_TX "DDSU666 Tx" diff --git a/tasmota/language/uk_UA.h b/tasmota/language/uk_UA.h index 6f77a9267..0063ed1be 100644 --- a/tasmota/language/uk_UA.h +++ b/tasmota/language/uk_UA.h @@ -802,6 +802,8 @@ #define D_SENSOR_OUTPUT_LO "Output Lo" #define D_SENSOR_AS608_TX "AS608 Tx" #define D_SENSOR_AS608_RX "AS608 Rx" +#define D_SENSOR_GM861_TX "GM861 Tx" +#define D_SENSOR_GM861_RX "GM861 Rx" #define D_SENSOR_DDS2382_TX "DDS238-2 Tx" #define D_SENSOR_DDS2382_RX "DDS238-2 Rx" #define D_SENSOR_DDSU666_TX "DDSU666 Tx" diff --git a/tasmota/language/vi_VN.h b/tasmota/language/vi_VN.h index 8dede81a6..08204fff6 100644 --- a/tasmota/language/vi_VN.h +++ b/tasmota/language/vi_VN.h @@ -802,6 +802,8 @@ #define D_SENSOR_OUTPUT_LO "Output Lo" #define D_SENSOR_AS608_TX "AS608 Tx" #define D_SENSOR_AS608_RX "AS608 Rx" +#define D_SENSOR_GM861_TX "GM861 Tx" +#define D_SENSOR_GM861_RX "GM861 Rx" #define D_SENSOR_DDS2382_TX "DDS238-2 Tx" #define D_SENSOR_DDS2382_RX "DDS238-2 Rx" #define D_SENSOR_DDSU666_TX "DDSU666 Tx" diff --git a/tasmota/language/zh_CN.h b/tasmota/language/zh_CN.h index 4dac8796f..cd0880c0c 100644 --- a/tasmota/language/zh_CN.h +++ b/tasmota/language/zh_CN.h @@ -802,6 +802,8 @@ #define D_SENSOR_OUTPUT_LO "Output Lo" #define D_SENSOR_AS608_TX "AS608 Tx" #define D_SENSOR_AS608_RX "AS608 Rx" +#define D_SENSOR_GM861_TX "GM861 Tx" +#define D_SENSOR_GM861_RX "GM861 Rx" #define D_SENSOR_DDS2382_TX "DDS238-2 Tx" #define D_SENSOR_DDS2382_RX "DDS238-2 Rx" #define D_SENSOR_DDSU666_TX "DDSU666 Tx" diff --git a/tasmota/language/zh_TW.h b/tasmota/language/zh_TW.h index 6e3689ab4..6ae065861 100644 --- a/tasmota/language/zh_TW.h +++ b/tasmota/language/zh_TW.h @@ -802,6 +802,8 @@ #define D_SENSOR_OUTPUT_LO "Output Lo" #define D_SENSOR_AS608_TX "AS608 Tx" #define D_SENSOR_AS608_RX "AS608 Rx" +#define D_SENSOR_GM861_TX "GM861 Tx" +#define D_SENSOR_GM861_RX "GM861 Rx" #define D_SENSOR_DDS2382_TX "DDS238-2 Tx" #define D_SENSOR_DDS2382_RX "DDS238-2 Rx" #define D_SENSOR_DDSU666_TX "DDSU666 Tx" From d206de52f11780264cc5401ae5173fbc1ff0955d Mon Sep 17 00:00:00 2001 From: bovirus <1262554+bovirus@users.noreply.github.com> Date: Thu, 27 Apr 2023 23:38:46 -0700 Subject: [PATCH 049/289] Italian language update (#18531) --- tasmota/language/it_IT.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tasmota/language/it_IT.h b/tasmota/language/it_IT.h index 10ad33ea0..247ea5e1f 100644 --- a/tasmota/language/it_IT.h +++ b/tasmota/language/it_IT.h @@ -28,7 +28,7 @@ * Use online command StateText to translate ON, OFF, HOLD and TOGGLE. * Use online command Prefix to translate cmnd, stat and tele. * - * Updated until v9.4.0.1 - Last update 15.04.2023 + * Updated until v9.4.0.1 - Last update 28.04.2023 \*********************************************************************/ #define LANGUAGE_MODULE_NAME // Enable to display "Module Generic" (ie Spanish), Disable to display "Generic Module" (ie English) @@ -800,8 +800,8 @@ #define D_SENSOR_OUTPUT_LO "Uscita - Lo" #define D_SENSOR_AS608_TX "AS608 - TX" #define D_SENSOR_AS608_RX "AS608 - RX" -#define D_SENSOR_GM861_TX "GM861 Tx" -#define D_SENSOR_GM861_RX "GM861 Rx" +#define D_SENSOR_GM861_TX "GM861 - TX" +#define D_SENSOR_GM861_RX "GM861 - RX" #define D_SENSOR_DDS2382_TX "DDS238-2 - TX" #define D_SENSOR_DDS2382_RX "DDS238-2 - RX" #define D_SENSOR_DDSU666_TX "DDSU666 - TX" From 17d1d7f5fae6e079d69cc91d55bd920c5c5e276c Mon Sep 17 00:00:00 2001 From: stefanbode Date: Fri, 28 Apr 2023 17:33:12 +0200 Subject: [PATCH 050/289] Update xdrv_68_zerocrossDimmer.ino (#18532) --- tasmota/tasmota_xdrv_driver/xdrv_68_zerocrossDimmer.ino | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tasmota/tasmota_xdrv_driver/xdrv_68_zerocrossDimmer.ino b/tasmota/tasmota_xdrv_driver/xdrv_68_zerocrossDimmer.ino index 890b3bb3b..060899c49 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_68_zerocrossDimmer.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_68_zerocrossDimmer.ino @@ -83,7 +83,7 @@ void IRAM_ATTR ACDimmerZeroCross(uint32_t time) { uint32_t IRAM_ATTR ACDimmerTimer_intr_ESP8266() { //ACDimmerTimer_intr(); ACDimmerTimer_intr(); - return 4000; + return 6000; } void ACDimmerInterruptDisable(bool disable) From 1d0c19311d9e735355d772f8be7d6b9bc1c484a5 Mon Sep 17 00:00:00 2001 From: Tim L Date: Sat, 29 Apr 2023 22:45:10 +1000 Subject: [PATCH 051/289] Add support for WT32_SC01 Plus display (#18538) --- tasmota/displaydesc/WT32_SC01_Plus.ini | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 tasmota/displaydesc/WT32_SC01_Plus.ini diff --git a/tasmota/displaydesc/WT32_SC01_Plus.ini b/tasmota/displaydesc/WT32_SC01_Plus.ini new file mode 100644 index 000000000..438141c08 --- /dev/null +++ b/tasmota/displaydesc/WT32_SC01_Plus.ini @@ -0,0 +1,20 @@ +:H,ST7796U,480,320,16,PAR,8,4,-1,0,47,-1,45,9,46,3,8,18,17,16,15,20 +:I +01,A0 +11,A0 +3A,81,55 +36,81,00 +21,80 +13,80 +29,A0 +:o,28 +:O,29 +:A,2A,2B,2C +:R,36 +:0,28,00,00,01 +:1,88,00,00,02 +:2,E8,00,00,03 +:3,48,00,00,00 +:i,20,21 +:TI1,38,5,6,7,4 +# From c5612a50fb85bcffe84b2ebcde3caafb334bc4fc Mon Sep 17 00:00:00 2001 From: Jeroen Date: Sat, 29 Apr 2023 14:46:38 +0200 Subject: [PATCH 052/289] Fix for https://github.com/arendst/Tasmota/discussions/15703#discussioncomment-5713294 (#18534) Added and fixed comments Co-authored-by: JeroenSt --- .../TasmotaModbus-3.6.0/src/TasmotaModbus.cpp | 3 +- .../xdrv_63_modbus_bridge.ino | 67 ++++++++++--------- 2 files changed, 36 insertions(+), 34 deletions(-) diff --git a/lib/lib_basic/TasmotaModbus-3.6.0/src/TasmotaModbus.cpp b/lib/lib_basic/TasmotaModbus-3.6.0/src/TasmotaModbus.cpp index e9ab03ffa..2e2fef4f8 100644 --- a/lib/lib_basic/TasmotaModbus-3.6.0/src/TasmotaModbus.cpp +++ b/lib/lib_basic/TasmotaModbus-3.6.0/src/TasmotaModbus.cpp @@ -200,7 +200,8 @@ uint8_t TasmotaModbus::ReceiveBuffer(uint8_t *buffer, uint8_t register_count, ui } else { buffer[mb_len++] = data; if (3 == mb_len) { - if ((buffer[1] == 5) || (buffer[1] == 6) || (buffer[1] == 15) || (buffer[1] == 16)) header_length = 4; // Addr, Func, StartAddr + // If functioncode is 5,6,15 or 16 the header length is 4 instead of 3 + if ((buffer[1] == 5) || (buffer[1] == 6) || (buffer[1] == 15) || (buffer[1] == 16)) header_length = 4; } } diff --git a/tasmota/tasmota_xdrv_driver/xdrv_63_modbus_bridge.ino b/tasmota/tasmota_xdrv_driver/xdrv_63_modbus_bridge.ino index 570cf7049..0bd488981 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_63_modbus_bridge.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_63_modbus_bridge.ino @@ -163,13 +163,13 @@ struct ModbusBridge ModbusBridgeFunctionCode functionCode = ModbusBridgeFunctionCode::mb_undefined; ModbusBridgeType type = ModbusBridgeType::mb_undefined; - uint16_t dataCount = 0; - uint16_t byteCount = 0; - uint16_t startAddress = 0; - uint8_t deviceAddress = 0; - uint8_t count = 0; + uint16_t dataCount = 0; // Number of bits or registers to read/write + uint16_t byteCount = 0; // Number of bytes to read/write + uint16_t startAddress = 0; // First address to read/write + uint8_t deviceAddress = 0; // Modbus address of device to read + uint8_t count = 0; // Number of values to read / write bool raw = false; - uint8_t *buffer = nullptr; + uint8_t *buffer = nullptr; // Buffer for storing read / write data }; ModbusBridge modbusBridge; @@ -240,7 +240,7 @@ void ModbusBridgeSetBaudrate(uint32_t baudrate) /********************************************************************************************/ // -// Handles data received from tasmota modbus wrapper and send this to (TCP or) MQTT client +// Handles data received from tasmota modbus wrapper and send this to (TCP and/or) MQTT client // void ModbusBridgeHandle(void) { @@ -248,7 +248,7 @@ void ModbusBridgeHandle(void) if (data_ready) { if (modbusBridge.byteCount == 0) modbusBridge.byteCount = modbusBridge.dataCount * 2; - if (nullptr == modbusBridge.buffer) + if (nullptr == modbusBridge.buffer) // If buffer is not initialized do not process received data { ModbusBridgeAllocError(PSTR("read")); modbusBridge.dataCount = 0; @@ -256,7 +256,7 @@ void ModbusBridgeHandle(void) return; } memset(modbusBridge.buffer, 0, MBR_RECEIVE_BUFFER_SIZE); - uint32_t error = modbusBridgeModbus->ReceiveBuffer(modbusBridge.buffer, 0, modbusBridge.byteCount); + uint32_t error = modbusBridgeModbus->ReceiveBuffer(modbusBridge.buffer, 0, MBR_RECEIVE_BUFFER_SIZE - 9); #ifdef USE_MODBUS_BRIDGE_TCP for (uint32_t i = 0; i < nitems(modbusBridgeTCP.client_tcp); i++) @@ -281,25 +281,16 @@ void ModbusBridgeHandle(void) nrOfBytes += 1; client.write(header, 9); } - else if (modbusBridge.buffer[1] <= 2) - { - header[4] = modbusBridge.byteCount >> 8; - header[5] = modbusBridge.byteCount + 3; - header[8] = modbusBridge.byteCount; - client.write(header, 9); - nrOfBytes += 1; - client.write(modbusBridge.buffer + 3, modbusBridge.byteCount); // Don't send CRC - nrOfBytes += modbusBridge.byteCount; - } else if (modbusBridge.buffer[1] <= 4) { - header[4] = modbusBridge.byteCount >> 8; - header[5] = modbusBridge.byteCount + 3; - header[8] = modbusBridge.byteCount; + uint8_t received_data_bytes = modbusBridgeModbus->ReceiveCount() - 5; + header[4] = received_data_bytes >> 8; + header[5] = received_data_bytes + 3; + header[8] = received_data_bytes; client.write(header, 9); nrOfBytes += 1; - client.write(modbusBridge.buffer + 3, modbusBridge.byteCount); // Don't send CRC - nrOfBytes += modbusBridge.byteCount; + client.write(modbusBridge.buffer + 3, received_data_bytes); // Don't send CRC + nrOfBytes += received_data_bytes; } else { @@ -343,20 +334,24 @@ void ModbusBridgeHandle(void) errorcode = ModbusBridgeError::wrongfunctioncode; else if ((uint8_t)modbusBridge.functionCode < 5) { + // Do not check buffer[2] but received bytes for correct length but use the nr of received bytes + uint8_t received_data_bytes = modbusBridgeModbus->ReceiveCount() - 5; + if ((uint8_t)modbusBridge.functionCode < 3) { - if ((uint8_t)(((modbusBridge.dataCount - 1) >> 3) + 1) != (uint8_t)modbusBridge.buffer[2]) + // Check if returned number of bits matches the requested number of bits + if ((uint8_t)(((modbusBridge.dataCount - 1) >> 3) + 1) > received_data_bytes) errorcode = ModbusBridgeError::wrongdataCount; } else { - if ((modbusBridge.type == ModbusBridgeType::mb_int8 || modbusBridge.type == ModbusBridgeType::mb_uint8) && ((uint8_t)modbusBridge.dataCount * 2 != (uint8_t)modbusBridge.buffer[2])) + if ((modbusBridge.type == ModbusBridgeType::mb_int8 || modbusBridge.type == ModbusBridgeType::mb_uint8) && ((uint8_t)modbusBridge.dataCount > received_data_bytes)) errorcode = ModbusBridgeError::wrongdataCount; - else if ((modbusBridge.type == ModbusBridgeType::mb_bit) && ((uint8_t)modbusBridge.dataCount * 2 != (uint8_t)modbusBridge.buffer[2])) + else if ((modbusBridge.type == ModbusBridgeType::mb_bit) && ((uint8_t)modbusBridge.dataCount > received_data_bytes)) errorcode = ModbusBridgeError::wrongdataCount; - else if ((modbusBridge.type == ModbusBridgeType::mb_int16 || modbusBridge.type == ModbusBridgeType::mb_uint16) && ((uint8_t)modbusBridge.dataCount * 2 != (uint8_t)modbusBridge.buffer[2])) + else if ((modbusBridge.type == ModbusBridgeType::mb_int16 || modbusBridge.type == ModbusBridgeType::mb_uint16) && ((uint8_t)modbusBridge.dataCount > received_data_bytes)) errorcode = ModbusBridgeError::wrongdataCount; - else if ((modbusBridge.type == ModbusBridgeType::mb_int32 || modbusBridge.type == ModbusBridgeType::mb_uint32 || modbusBridge.type == ModbusBridgeType::mb_float) && ((uint8_t)modbusBridge.dataCount * 2 != (uint8_t)modbusBridge.buffer[2])) + else if ((modbusBridge.type == ModbusBridgeType::mb_int32 || modbusBridge.type == ModbusBridgeType::mb_uint32 || modbusBridge.type == ModbusBridgeType::mb_float) && ((uint8_t)modbusBridge.dataCount > received_data_bytes)) errorcode = ModbusBridgeError::wrongdataCount; } } @@ -364,6 +359,7 @@ void ModbusBridgeHandle(void) { if (modbusBridge.type == ModbusBridgeType::mb_raw) { + // Ouput raw data as decimal bytes Response_P(PSTR("{\"" D_JSON_MODBUS_RECEIVED "\":{\"RAW\":[")); for (uint8_t i = 0; i < modbusBridgeModbus->ReceiveCount(); i++) { @@ -377,6 +373,7 @@ void ModbusBridgeHandle(void) } else if (modbusBridge.type == ModbusBridgeType::mb_hex) { + // Output raw data as hexadecimal bytes Response_P(PSTR("{\"" D_JSON_MODBUS_RECEIVED "\":{\"HEX\":[")); for (uint8_t i = 0; i < modbusBridgeModbus->ReceiveCount(); i++) { @@ -388,8 +385,9 @@ void ModbusBridgeHandle(void) ResponseJsonEnd(); MqttPublishPrefixTopicRulesProcess_P(RESULT_OR_TELE, PSTR(D_JSON_MODBUS_RECEIVED)); } - else if ((modbusBridge.buffer[1] > 0) && (modbusBridge.buffer[1] < 7)) // Read Registers + else if ((modbusBridge.buffer[1] > 0) && (modbusBridge.buffer[1] < 7)) { + // Read and process Registers uint8_t dataOffset = 3; Response_P(PSTR("{\"" D_JSON_MODBUS_RECEIVED "\":{")); ResponseAppend_P(PSTR("\"" D_JSON_MODBUS_DEVICE_ADDRESS "\":%d,"), modbusBridge.buffer[0]); @@ -410,6 +408,7 @@ void ModbusBridgeHandle(void) uint8_t data_count = modbusBridge.count; if ((uint8_t)modbusBridge.functionCode < 3) { + // Calculate number of values to return in bitmode if (modbusBridge.type == ModbusBridgeType::mb_int8 || modbusBridge.type == ModbusBridgeType::mb_uint8) data_count = (uint8_t)(((modbusBridge.count - 1) >> 3) + 1); else if (modbusBridge.type == ModbusBridgeType::mb_int16 || modbusBridge.type == ModbusBridgeType::mb_uint16) @@ -426,7 +425,7 @@ void ModbusBridgeHandle(void) float value = 0; if (modbusBridge.buffer[1] < 3) { - // In bit mode only convert returned bytes + // In bit mode only convert returned bits to values if (modbusBridge.buffer[2] - (count * 4)) ((uint8_t *)&value)[0] = modbusBridge.buffer[dataOffset + (count * 4)]; // Get float values if ((modbusBridge.buffer[2] - (count * 4)) >> 1) @@ -468,6 +467,7 @@ void ModbusBridgeHandle(void) uint32_t value = 0; if (modbusBridge.buffer[1] < 3) { + // In bit mode only convert returned bits to values if (modbusBridge.buffer[2] - (count * 4)) ((uint8_t *)&value)[0] = modbusBridge.buffer[dataOffset + (count * 4)]; // Get uint values if (modbusBridge.buffer[2] - ((count * 4) - 1)) @@ -495,6 +495,7 @@ void ModbusBridgeHandle(void) uint16_t value = 0; if (modbusBridge.buffer[1] < 3) { + // In bit mode only convert returned bits to values if (modbusBridge.buffer[2] - (count * 2)) ((uint8_t *)&value)[0] = modbusBridge.buffer[dataOffset + (count * 2)]; if (modbusBridge.buffer[2] - ((count * 2) - 1)) @@ -747,10 +748,10 @@ void CmndModbusBridgeSend(void) modbusBridge.startAddress = root.getULong(PSTR(D_JSON_MODBUS_START_ADDRESS), 0); const char *stype = root.getStr(PSTR(D_JSON_MODBUS_TYPE), "uint8"); - modbusBridge.count = root.getUInt(PSTR(D_JSON_MODBUS_COUNT), 1); // Number of bits or bytes to read / write + modbusBridge.count = root.getUInt(PSTR(D_JSON_MODBUS_COUNT), 1); // Number of values to read / write // If functioncode is 1, 2 or 15, the count is not the number of registers but the number - // of bit to read or write, so calculate the number data bytes to read/write. + // of bits to read or write, so calculate the number data bytes to read/write. if ((functionCode == 1) || (functionCode == 2) || (functionCode == 15)) bitMode = true; if (modbusBridge.deviceAddress == 0) From 616652ea224cba0c33bfeff0434e9781f377d868 Mon Sep 17 00:00:00 2001 From: Jeroen Date: Mon, 1 May 2023 14:51:02 +0200 Subject: [PATCH 053/289] Added support for Dingtian Relay Board v3.6.10 (#18535) * Added support for Dingtian Relay Board v3.6.10 * Output OE was never initialized * Removed white spaces trying to fix language builds * Fix for https://github.com/arendst/Tasmota/pull/18535#pullrequestreview-1406978097 * Fixed language builds --------- Co-authored-by: JeroenSt --- tasmota/include/tasmota_template.h | 3 ++ tasmota/language/af_AF.h | 1 + tasmota/language/bg_BG.h | 1 + tasmota/language/ca_AD.h | 1 + tasmota/language/cs_CZ.h | 1 + tasmota/language/de_DE.h | 1 + tasmota/language/el_GR.h | 1 + tasmota/language/en_GB.h | 1 + tasmota/language/es_ES.h | 1 + tasmota/language/fr_FR.h | 1 + tasmota/language/fy_NL.h | 1 + tasmota/language/he_HE.h | 1 + tasmota/language/hu_HU.h | 1 + tasmota/language/it_IT.h | 1 + tasmota/language/ko_KO.h | 1 + tasmota/language/nl_NL.h | 1 + tasmota/language/pl_PL.h | 1 + tasmota/language/pt_BR.h | 1 + tasmota/language/pt_PT.h | 1 + tasmota/language/ro_RO.h | 1 + tasmota/language/ru_RU.h | 1 + tasmota/language/sk_SK.h | 1 + tasmota/language/sv_SE.h | 1 + tasmota/language/tr_TR.h | 1 + tasmota/language/uk_UA.h | 1 + tasmota/language/vi_VN.h | 1 + tasmota/language/zh_CN.h | 1 + tasmota/language/zh_TW.h | 1 + .../xdrv_90_esp32_dingtian_relay.ino | 48 +++++++++++-------- 29 files changed, 59 insertions(+), 19 deletions(-) diff --git a/tasmota/include/tasmota_template.h b/tasmota/include/tasmota_template.h index 15ac3d198..009934be7 100644 --- a/tasmota/include/tasmota_template.h +++ b/tasmota/include/tasmota_template.h @@ -210,6 +210,7 @@ enum UserSelectablePins { GPIO_PCF8574_INT, // PCF8574 interrupt GPIO_LOX_O2_RX, // LOX-O2 RX GPIO_GM861_TX, GPIO_GM861_RX, // GM861 Serial interface + GPIO_DINGTIAN_OE, // New version of Dingtian relay board where PL is not shared with OE GPIO_SENSOR_END }; // Error as warning to rethink GPIO usage with max 2045 @@ -467,6 +468,7 @@ const char kSensorNames[] PROGMEM = D_SENSOR_PCF8574_INT "|" D_SENSOR_LOX_O2_RX "|" D_SENSOR_GM861_TX "|" D_SENSOR_GM861_RX "|" + D_GPIO_DINGTIAN_OE "|" ; const char kSensorNamesFixed[] PROGMEM = @@ -1121,6 +1123,7 @@ const uint16_t kGpioNiceList[] PROGMEM = { AGPIO(GPIO_DINGTIAN_SDI), AGPIO(GPIO_DINGTIAN_Q7), AGPIO(GPIO_DINGTIAN_PL), + AGPIO(GPIO_DINGTIAN_OE), AGPIO(GPIO_DINGTIAN_RCK), #endif diff --git a/tasmota/language/af_AF.h b/tasmota/language/af_AF.h index b4b1cfed8..f63671846 100644 --- a/tasmota/language/af_AF.h +++ b/tasmota/language/af_AF.h @@ -919,6 +919,7 @@ #define D_GPIO_DINGTIAN_SDI "Dingtian SDI" #define D_GPIO_DINGTIAN_Q7 "Dingtian Q7" #define D_GPIO_DINGTIAN_PL "Dingtian PL" +#define D_GPIO_DINGTIAN_OE "Dingtian OE" #define D_GPIO_DINGTIAN_RCK "Dingtian RCK" #define D_SENSOR_CM11_TX "CM110x TX" #define D_SENSOR_CM11_RX "CM110x RX" diff --git a/tasmota/language/bg_BG.h b/tasmota/language/bg_BG.h index 7ed573c10..672d88b93 100644 --- a/tasmota/language/bg_BG.h +++ b/tasmota/language/bg_BG.h @@ -919,6 +919,7 @@ #define D_GPIO_DINGTIAN_SDI "Dingtian SDI" #define D_GPIO_DINGTIAN_Q7 "Dingtian Q7" #define D_GPIO_DINGTIAN_PL "Dingtian PL" +#define D_GPIO_DINGTIAN_OE "Dingtian OE" #define D_GPIO_DINGTIAN_RCK "Dingtian RCK" #define D_SENSOR_CM11_TX "CM110x TX" #define D_SENSOR_CM11_RX "CM110x RX" diff --git a/tasmota/language/ca_AD.h b/tasmota/language/ca_AD.h index f82f4d619..277902023 100644 --- a/tasmota/language/ca_AD.h +++ b/tasmota/language/ca_AD.h @@ -919,6 +919,7 @@ #define D_GPIO_DINGTIAN_SDI "Dingtian SDI" #define D_GPIO_DINGTIAN_Q7 "Dingtian Q7" #define D_GPIO_DINGTIAN_PL "Dingtian PL" +#define D_GPIO_DINGTIAN_OE "Dingtian OE" #define D_GPIO_DINGTIAN_RCK "Dingtian RCK" #define D_SENSOR_CM11_TX "CM110x TX" #define D_SENSOR_CM11_RX "CM110x RX" diff --git a/tasmota/language/cs_CZ.h b/tasmota/language/cs_CZ.h index 261396243..e42c875de 100644 --- a/tasmota/language/cs_CZ.h +++ b/tasmota/language/cs_CZ.h @@ -919,6 +919,7 @@ #define D_GPIO_DINGTIAN_SDI "Dingtian SDI" #define D_GPIO_DINGTIAN_Q7 "Dingtian Q7" #define D_GPIO_DINGTIAN_PL "Dingtian PL" +#define D_GPIO_DINGTIAN_OE "Dingtian OE" #define D_GPIO_DINGTIAN_RCK "Dingtian RCK" #define D_SENSOR_CM11_TX "CM110x TX" #define D_SENSOR_CM11_RX "CM110x RX" diff --git a/tasmota/language/de_DE.h b/tasmota/language/de_DE.h index 8135fd778..408408245 100644 --- a/tasmota/language/de_DE.h +++ b/tasmota/language/de_DE.h @@ -919,6 +919,7 @@ #define D_GPIO_DINGTIAN_SDI "Dingtian SDI" #define D_GPIO_DINGTIAN_Q7 "Dingtian Q7" #define D_GPIO_DINGTIAN_PL "Dingtian PL" +#define D_GPIO_DINGTIAN_OE "Dingtian OE" #define D_GPIO_DINGTIAN_RCK "Dingtian RCK" #define D_SENSOR_CM11_TX "CM110x TX" #define D_SENSOR_CM11_RX "CM110x RX" diff --git a/tasmota/language/el_GR.h b/tasmota/language/el_GR.h index 86fdbc4e0..a359d49dd 100644 --- a/tasmota/language/el_GR.h +++ b/tasmota/language/el_GR.h @@ -919,6 +919,7 @@ #define D_GPIO_DINGTIAN_SDI "Dingtian SDI" #define D_GPIO_DINGTIAN_Q7 "Dingtian Q7" #define D_GPIO_DINGTIAN_PL "Dingtian PL" +#define D_GPIO_DINGTIAN_OE "Dingtian OE" #define D_GPIO_DINGTIAN_RCK "Dingtian RCK" #define D_SENSOR_CM11_TX "CM110x TX" #define D_SENSOR_CM11_RX "CM110x RX" diff --git a/tasmota/language/en_GB.h b/tasmota/language/en_GB.h index a322b71c5..b746c0634 100644 --- a/tasmota/language/en_GB.h +++ b/tasmota/language/en_GB.h @@ -919,6 +919,7 @@ #define D_GPIO_DINGTIAN_SDI "Dingtian SDI" #define D_GPIO_DINGTIAN_Q7 "Dingtian Q7" #define D_GPIO_DINGTIAN_PL "Dingtian PL" +#define D_GPIO_DINGTIAN_OE "Dingtian OE" #define D_GPIO_DINGTIAN_RCK "Dingtian RCK" #define D_SENSOR_CM11_TX "CM110x TX" #define D_SENSOR_CM11_RX "CM110x RX" diff --git a/tasmota/language/es_ES.h b/tasmota/language/es_ES.h index 740912dd6..26dd59688 100644 --- a/tasmota/language/es_ES.h +++ b/tasmota/language/es_ES.h @@ -919,6 +919,7 @@ #define D_GPIO_DINGTIAN_SDI "Dingtian SDI" #define D_GPIO_DINGTIAN_Q7 "Dingtian Q7" #define D_GPIO_DINGTIAN_PL "Dingtian PL" +#define D_GPIO_DINGTIAN_OE "Dingtian OE" #define D_GPIO_DINGTIAN_RCK "Dingtian RCK" #define D_SENSOR_CM11_TX "CM110x TX" #define D_SENSOR_CM11_RX "CM110x RX" diff --git a/tasmota/language/fr_FR.h b/tasmota/language/fr_FR.h index 28de55477..ae600b589 100644 --- a/tasmota/language/fr_FR.h +++ b/tasmota/language/fr_FR.h @@ -919,6 +919,7 @@ #define D_GPIO_DINGTIAN_SDI "Dingtian SDI" #define D_GPIO_DINGTIAN_Q7 "Dingtian Q7" #define D_GPIO_DINGTIAN_PL "Dingtian PL" +#define D_GPIO_DINGTIAN_OE "Dingtian OE" #define D_GPIO_DINGTIAN_RCK "Dingtian RCk" #define D_SENSOR_CM11_TX "CM110x Tx" #define D_SENSOR_CM11_RX "CM110x Rx" diff --git a/tasmota/language/fy_NL.h b/tasmota/language/fy_NL.h index cf98979de..0ef74fdb6 100644 --- a/tasmota/language/fy_NL.h +++ b/tasmota/language/fy_NL.h @@ -919,6 +919,7 @@ #define D_GPIO_DINGTIAN_SDI "Dingtian SDI" #define D_GPIO_DINGTIAN_Q7 "Dingtian Q7" #define D_GPIO_DINGTIAN_PL "Dingtian PL" +#define D_GPIO_DINGTIAN_OE "Dingtian OE" #define D_GPIO_DINGTIAN_RCK "Dingtian RCK" #define D_SENSOR_CM11_TX "CM110x TX" #define D_SENSOR_CM11_RX "CM110x RX" diff --git a/tasmota/language/he_HE.h b/tasmota/language/he_HE.h index 13e86a53f..c1d13b7bc 100644 --- a/tasmota/language/he_HE.h +++ b/tasmota/language/he_HE.h @@ -919,6 +919,7 @@ #define D_GPIO_DINGTIAN_SDI "Dingtian SDI" #define D_GPIO_DINGTIAN_Q7 "Dingtian Q7" #define D_GPIO_DINGTIAN_PL "Dingtian PL" +#define D_GPIO_DINGTIAN_OE "Dingtian OE" #define D_GPIO_DINGTIAN_RCK "Dingtian RCK" #define D_SENSOR_CM11_TX "CM110x TX" #define D_SENSOR_CM11_RX "CM110x RX" diff --git a/tasmota/language/hu_HU.h b/tasmota/language/hu_HU.h index 3990ac173..71540307b 100644 --- a/tasmota/language/hu_HU.h +++ b/tasmota/language/hu_HU.h @@ -919,6 +919,7 @@ #define D_GPIO_DINGTIAN_SDI "Dingtian SDI" #define D_GPIO_DINGTIAN_Q7 "Dingtian Q7" #define D_GPIO_DINGTIAN_PL "Dingtian PL" +#define D_GPIO_DINGTIAN_OE "Dingtian OE" #define D_GPIO_DINGTIAN_RCK "Dingtian RCK" #define D_SENSOR_CM11_TX "CM110x TX" #define D_SENSOR_CM11_RX "CM110x RX" diff --git a/tasmota/language/it_IT.h b/tasmota/language/it_IT.h index 247ea5e1f..2690363bb 100644 --- a/tasmota/language/it_IT.h +++ b/tasmota/language/it_IT.h @@ -919,6 +919,7 @@ #define D_GPIO_DINGTIAN_SDI "Dingtian - SDI" #define D_GPIO_DINGTIAN_Q7 "Dingtian - Q7" #define D_GPIO_DINGTIAN_PL "Dingtian - PL" +#define D_GPIO_DINGTIAN_OE "Dingtian - OE" #define D_GPIO_DINGTIAN_RCK "Dingtian - RCK" #define D_SENSOR_CM11_TX "CM110x - TX" #define D_SENSOR_CM11_RX "CM110x - RX" diff --git a/tasmota/language/ko_KO.h b/tasmota/language/ko_KO.h index 7577e1399..4f941a3b8 100644 --- a/tasmota/language/ko_KO.h +++ b/tasmota/language/ko_KO.h @@ -919,6 +919,7 @@ #define D_GPIO_DINGTIAN_SDI "Dingtian SDI" #define D_GPIO_DINGTIAN_Q7 "Dingtian Q7" #define D_GPIO_DINGTIAN_PL "Dingtian PL" +#define D_GPIO_DINGTIAN_OE "Dingtian OE" #define D_GPIO_DINGTIAN_RCK "Dingtian RCK" #define D_SENSOR_CM11_TX "CM110x TX" #define D_SENSOR_CM11_RX "CM110x RX" diff --git a/tasmota/language/nl_NL.h b/tasmota/language/nl_NL.h index a645fdc71..05f85db2b 100644 --- a/tasmota/language/nl_NL.h +++ b/tasmota/language/nl_NL.h @@ -919,6 +919,7 @@ #define D_GPIO_DINGTIAN_SDI "Dingtian SDI" #define D_GPIO_DINGTIAN_Q7 "Dingtian Q7" #define D_GPIO_DINGTIAN_PL "Dingtian PL" +#define D_GPIO_DINGTIAN_OE "Dingtian OE" #define D_GPIO_DINGTIAN_RCK "Dingtian RCK" #define D_SENSOR_CM11_TX "CM110x TX" #define D_SENSOR_CM11_RX "CM110x RX" diff --git a/tasmota/language/pl_PL.h b/tasmota/language/pl_PL.h index e4fa104cb..4444de792 100644 --- a/tasmota/language/pl_PL.h +++ b/tasmota/language/pl_PL.h @@ -919,6 +919,7 @@ #define D_GPIO_DINGTIAN_SDI "Dingtian SDI" #define D_GPIO_DINGTIAN_Q7 "Dingtian Q7" #define D_GPIO_DINGTIAN_PL "Dingtian PL" +#define D_GPIO_DINGTIAN_OE "Dingtian OE" #define D_GPIO_DINGTIAN_RCK "Dingtian RCK" #define D_SENSOR_CM11_TX "CM110x TX" #define D_SENSOR_CM11_RX "CM110x RX" diff --git a/tasmota/language/pt_BR.h b/tasmota/language/pt_BR.h index 81cb42864..ea04901c7 100644 --- a/tasmota/language/pt_BR.h +++ b/tasmota/language/pt_BR.h @@ -919,6 +919,7 @@ #define D_GPIO_DINGTIAN_SDI "Dingtian SDI" #define D_GPIO_DINGTIAN_Q7 "Dingtian Q7" #define D_GPIO_DINGTIAN_PL "Dingtian PL" +#define D_GPIO_DINGTIAN_OE "Dingtian OE" #define D_GPIO_DINGTIAN_RCK "Dingtian RCK" #define D_SENSOR_CM11_TX "CM110x TX" #define D_SENSOR_CM11_RX "CM110x RX" diff --git a/tasmota/language/pt_PT.h b/tasmota/language/pt_PT.h index b8c5f3986..3377d7d72 100644 --- a/tasmota/language/pt_PT.h +++ b/tasmota/language/pt_PT.h @@ -919,6 +919,7 @@ #define D_GPIO_DINGTIAN_SDI "Dingtian SDI" #define D_GPIO_DINGTIAN_Q7 "Dingtian Q7" #define D_GPIO_DINGTIAN_PL "Dingtian PL" +#define D_GPIO_DINGTIAN_OE "Dingtian OE" #define D_GPIO_DINGTIAN_RCK "Dingtian RCK" #define D_SENSOR_CM11_TX "CM110x TX" #define D_SENSOR_CM11_RX "CM110x RX" diff --git a/tasmota/language/ro_RO.h b/tasmota/language/ro_RO.h index 57034470f..c97bc649a 100644 --- a/tasmota/language/ro_RO.h +++ b/tasmota/language/ro_RO.h @@ -919,6 +919,7 @@ #define D_GPIO_DINGTIAN_SDI "Dingtian SDI" #define D_GPIO_DINGTIAN_Q7 "Dingtian Q7" #define D_GPIO_DINGTIAN_PL "Dingtian PL" +#define D_GPIO_DINGTIAN_OE "Dingtian OE" #define D_GPIO_DINGTIAN_RCK "Dingtian RCK" #define D_SENSOR_CM11_TX "CM110x TX" #define D_SENSOR_CM11_RX "CM110x RX" diff --git a/tasmota/language/ru_RU.h b/tasmota/language/ru_RU.h index 3afd6b55f..6e9bbe95d 100644 --- a/tasmota/language/ru_RU.h +++ b/tasmota/language/ru_RU.h @@ -919,6 +919,7 @@ #define D_GPIO_DINGTIAN_SDI "Dingtian SDI" #define D_GPIO_DINGTIAN_Q7 "Dingtian Q7" #define D_GPIO_DINGTIAN_PL "Dingtian PL" +#define D_GPIO_DINGTIAN_OE "Dingtian OE" #define D_GPIO_DINGTIAN_RCK "Dingtian RCK" #define D_SENSOR_CM11_TX "CM110x TX" #define D_SENSOR_CM11_RX "CM110x RX" diff --git a/tasmota/language/sk_SK.h b/tasmota/language/sk_SK.h index 61b253e19..679abff2e 100644 --- a/tasmota/language/sk_SK.h +++ b/tasmota/language/sk_SK.h @@ -919,6 +919,7 @@ #define D_GPIO_DINGTIAN_SDI "Dingtian SDI" #define D_GPIO_DINGTIAN_Q7 "Dingtian Q7" #define D_GPIO_DINGTIAN_PL "Dingtian PL" +#define D_GPIO_DINGTIAN_OE "Dingtian OE" #define D_GPIO_DINGTIAN_RCK "Dingtian RCK" #define D_SENSOR_CM11_TX "CM110x TX" #define D_SENSOR_CM11_RX "CM110x RX" diff --git a/tasmota/language/sv_SE.h b/tasmota/language/sv_SE.h index b398d0b06..0c3c896fe 100644 --- a/tasmota/language/sv_SE.h +++ b/tasmota/language/sv_SE.h @@ -919,6 +919,7 @@ #define D_GPIO_DINGTIAN_SDI "Dingtian SDI" #define D_GPIO_DINGTIAN_Q7 "Dingtian Q7" #define D_GPIO_DINGTIAN_PL "Dingtian PL" +#define D_GPIO_DINGTIAN_OE "Dingtian OE" #define D_GPIO_DINGTIAN_RCK "Dingtian RCK" #define D_SENSOR_CM11_TX "CM110x TX" #define D_SENSOR_CM11_RX "CM110x RX" diff --git a/tasmota/language/tr_TR.h b/tasmota/language/tr_TR.h index c7c14ee28..bc62a9ff5 100644 --- a/tasmota/language/tr_TR.h +++ b/tasmota/language/tr_TR.h @@ -919,6 +919,7 @@ #define D_GPIO_DINGTIAN_SDI "Dingtian SDI" #define D_GPIO_DINGTIAN_Q7 "Dingtian Q7" #define D_GPIO_DINGTIAN_PL "Dingtian PL" +#define D_GPIO_DINGTIAN_OE "Dingtian OE" #define D_GPIO_DINGTIAN_RCK "Dingtian RCK" #define D_SENSOR_CM11_TX "CM110x TX" #define D_SENSOR_CM11_RX "CM110x RX" diff --git a/tasmota/language/uk_UA.h b/tasmota/language/uk_UA.h index 0063ed1be..d0664f542 100644 --- a/tasmota/language/uk_UA.h +++ b/tasmota/language/uk_UA.h @@ -919,6 +919,7 @@ #define D_GPIO_DINGTIAN_SDI "Dingtian SDI" #define D_GPIO_DINGTIAN_Q7 "Dingtian Q7" #define D_GPIO_DINGTIAN_PL "Dingtian PL" +#define D_GPIO_DINGTIAN_OE "Dingtian OE" #define D_GPIO_DINGTIAN_RCK "Dingtian RCK" #define D_SENSOR_CM11_TX "CM110x TX" #define D_SENSOR_CM11_RX "CM110x RX" diff --git a/tasmota/language/vi_VN.h b/tasmota/language/vi_VN.h index 08204fff6..74e8398a2 100644 --- a/tasmota/language/vi_VN.h +++ b/tasmota/language/vi_VN.h @@ -919,6 +919,7 @@ #define D_GPIO_DINGTIAN_SDI "Dingtian SDI" #define D_GPIO_DINGTIAN_Q7 "Dingtian Q7" #define D_GPIO_DINGTIAN_PL "Dingtian PL" +#define D_GPIO_DINGTIAN_OE "Dingtian OE" #define D_GPIO_DINGTIAN_RCK "Dingtian RCK" #define D_SENSOR_CM11_TX "CM110x TX" #define D_SENSOR_CM11_RX "CM110x RX" diff --git a/tasmota/language/zh_CN.h b/tasmota/language/zh_CN.h index cd0880c0c..b4fa7c00e 100644 --- a/tasmota/language/zh_CN.h +++ b/tasmota/language/zh_CN.h @@ -919,6 +919,7 @@ #define D_GPIO_DINGTIAN_SDI "Dingtian SDI" #define D_GPIO_DINGTIAN_Q7 "Dingtian Q7" #define D_GPIO_DINGTIAN_PL "Dingtian PL" +#define D_GPIO_DINGTIAN_OE "Dingtian OE" #define D_GPIO_DINGTIAN_RCK "Dingtian RCK" #define D_SENSOR_CM11_TX "CM110x TX" #define D_SENSOR_CM11_RX "CM110x RX" diff --git a/tasmota/language/zh_TW.h b/tasmota/language/zh_TW.h index 6ae065861..a5611d532 100644 --- a/tasmota/language/zh_TW.h +++ b/tasmota/language/zh_TW.h @@ -919,6 +919,7 @@ #define D_GPIO_DINGTIAN_SDI "Dingtian SDI" #define D_GPIO_DINGTIAN_Q7 "Dingtian Q7" #define D_GPIO_DINGTIAN_PL "Dingtian PL" +#define D_GPIO_DINGTIAN_OE "Dingtian OE" #define D_GPIO_DINGTIAN_RCK "Dingtian RCK" #define D_SENSOR_CM11_TX "CM110x TX" #define D_SENSOR_CM11_RX "CM110x RX" diff --git a/tasmota/tasmota_xdrv_driver/xdrv_90_esp32_dingtian_relay.ino b/tasmota/tasmota_xdrv_driver/xdrv_90_esp32_dingtian_relay.ino index 93bfd2a34..c6dbd9193 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_90_esp32_dingtian_relay.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_90_esp32_dingtian_relay.ino @@ -30,18 +30,22 @@ #error DINGTIAN - Only one of DINGTIAN_USE_AS_BUTTON or DINGTIAN_USE_AS_SWITCH should be defined #endif +#define DINGTIAN_SET_OUTPUT(pin,value) { pinMode((pin), OUTPUT); digitalWrite((pin), (value)); } +#define DINGTIAN_SET_INPUT(pin) { pinMode((pin), INPUT); } + /******************************************************************************************************** * Global private data */ struct DINGTIAN_DATA { - uint32_t outputs; // keep ouputs state - uint32_t last_inputs; // previous inputs state - uint8_t count; // number of relay and input (8 * numver of shift registers) - uint8_t first; // index of 1st Tasmota relay assigned to 1st Dingtian relays - int8_t key_offset; // index of virtual key + uint32_t outputs; // keep ouputs state + uint32_t last_inputs; // previous inputs state + uint8_t count; // number of relay and input (8 * numver of shift registers) + uint8_t first; // index of 1st Tasmota relay assigned to 1st Dingtian relays + int8_t key_offset; // index of virtual key + bool outputs_initialized; // set when the outputs are initialized // pins - uint8_t pin_clk, pin_sdi, pin_q7, pin_pl, pin_rck; + uint8_t pin_clk, pin_sdi, pin_q7, pin_pl, pin_oe, pin_rck; } *Dingtian = nullptr; @@ -56,7 +60,7 @@ uint32_t DingtianReadWrite(uint32_t outputs) // setup digitalWrite(Dingtian->pin_rck, 0); // rclk and clkinh to 0 - digitalWrite(Dingtian->pin_pl, 1); // load inputs in '165, ready for shift-in (side effect '595 in tri-state) + if (PinUsed(GPIO_DINGTIAN_PL)) digitalWrite(Dingtian->pin_pl, 1); // load inputs in '165, ready for shift-in (side effect '595 in tri-state) for ( int i = Dingtian->count ; i > 0 ; i-- ) { // relay out to '595 digitalWrite(Dingtian->pin_sdi, outputs & 1); @@ -70,7 +74,13 @@ uint32_t DingtianReadWrite(uint32_t outputs) } // ending digitalWrite(Dingtian->pin_rck, 1); // rclk pulse to load '595 into output registers - digitalWrite(Dingtian->pin_pl, 0); // re-enable '595 ouputs + if (PinUsed(GPIO_DINGTIAN_PL)) digitalWrite(Dingtian->pin_pl, 0); // re-enable '595 ouputs (old board version) + if (!Dingtian->outputs_initialized && PinUsed(GPIO_DINGTIAN_OE)) + { + digitalWrite(Dingtian->pin_oe, 0); // enable '595 ouputs (new board version) + DINGTIAN_SET_OUTPUT(Dingtian->pin_oe, 0); + Dingtian->outputs_initialized = true; + } #ifdef DINGTIAN_INPUTS_INVERTED return ~inputs; @@ -83,33 +93,33 @@ uint32_t DingtianReadWrite(uint32_t outputs) * Driver initialisation */ -#define DINGTIAN_SET_OUTPUT(pin,value) { pinMode((pin), OUTPUT); digitalWrite((pin), (value)); } -#define DINGTIAN_SET_INPUT(pin) { pinMode((pin), INPUT); } - void DingtianInit(void) { if (PinUsed(GPIO_DINGTIAN_CLK, GPIO_ANY) && PinUsed(GPIO_DINGTIAN_SDI) && PinUsed(GPIO_DINGTIAN_Q7) - && PinUsed(GPIO_DINGTIAN_PL) && PinUsed(GPIO_DINGTIAN_RCK)) { + && (PinUsed(GPIO_DINGTIAN_PL) || PinUsed(GPIO_DINGTIAN_OE)) && PinUsed(GPIO_DINGTIAN_RCK)) { // allocate Dingtian data structure Dingtian = (struct DINGTIAN_DATA*)calloc(1, sizeof(struct DINGTIAN_DATA)); if (Dingtian) { // get pins - Dingtian->pin_clk = Pin(GPIO_DINGTIAN_CLK, GPIO_ANY); // shift clock : 595's SCLK & 165's CLK - Dingtian->pin_sdi = Pin(GPIO_DINGTIAN_SDI); // Serial out : 595's SER - Dingtian->pin_q7 = Pin(GPIO_DINGTIAN_Q7); // Serial in : 165's Q7 - Dingtian->pin_pl = Pin(GPIO_DINGTIAN_PL); // Input load : 595's nOE & 165's PL (or SH/LD on some datasheet) - Dingtian->pin_rck = Pin(GPIO_DINGTIAN_RCK); // Output load : 595's RCLK & 165's CLKINH + Dingtian->pin_clk = Pin(GPIO_DINGTIAN_CLK, GPIO_ANY); // shift clock : 595's SCLK & 165's CLK + Dingtian->pin_sdi = Pin(GPIO_DINGTIAN_SDI); // Serial out : 595's SER + Dingtian->pin_q7 = Pin(GPIO_DINGTIAN_Q7); // Serial in : 165's Q7 + if (PinUsed(GPIO_DINGTIAN_PL)) Dingtian->pin_pl = Pin(GPIO_DINGTIAN_PL); // Input load : 595's nOE & 165's PL (or SH/LD on some datasheet) + if (PinUsed(GPIO_DINGTIAN_OE)) Dingtian->pin_oe = Pin(GPIO_DINGTIAN_OE); // Output enable : 595's nOE (v3.6.10) + Dingtian->pin_rck = Pin(GPIO_DINGTIAN_RCK); // Output load : 595's RCLK & 165's CLKINH // number of shift registers is the CLK index Dingtian->count = ((GetPin(Dingtian->pin_clk) - AGPIO(GPIO_DINGTIAN_CLK)) + 1) * 8; - AddLog(LOG_LEVEL_DEBUG, PSTR("DNGT: clk:%d, sdi:%d, q7:%d, pl:%d, rck:%d, count:%d"), - Dingtian->pin_clk, Dingtian->pin_sdi, Dingtian->pin_q7, Dingtian->pin_pl, Dingtian->pin_rck, Dingtian->count); + AddLog(LOG_LEVEL_DEBUG, PSTR("DNGT: clk:%d, sdi:%d, q7:%d, pl:%d, oe:%d, rck:%d, count:%d"), + Dingtian->pin_clk, Dingtian->pin_sdi, Dingtian->pin_q7, Dingtian->pin_pl, Dingtian->pin_oe, Dingtian->pin_rck, Dingtian->count); DINGTIAN_SET_OUTPUT(Dingtian->pin_clk, 0); DINGTIAN_SET_OUTPUT(Dingtian->pin_sdi, 0); DINGTIAN_SET_INPUT( Dingtian->pin_q7); DINGTIAN_SET_OUTPUT(Dingtian->pin_pl, 0); + //Do not initialize Dingtian->pin_oe so the relays will not toggle while restarting DINGTIAN_SET_OUTPUT(Dingtian->pin_rck, 0); + Dingtian->outputs_initialized = false; Dingtian->first = TasmotaGlobal.devices_present; Dingtian->key_offset = -1; UpdateDevicesPresent(Dingtian->count); From cda2bf157dd5dec61a5621e220321d21d1e3784d Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Mon, 1 May 2023 16:26:07 +0200 Subject: [PATCH 054/289] Add support for TC74 Add support for TC74 temperature sensor by Michael Loftis (#18042) --- BUILDS.md | 2 + CHANGELOG.md | 1 + CODE_OWNERS.md | 2 + I2CDEVICES.md | 3 +- RELEASENOTES.md | 1 + tasmota/my_user_config.h | 5 +- tasmota/tasmota_support/support_features.ino | 9 +- tasmota/tasmota_xsns_sensor/xsns_108_tc74.ino | 287 ++++++++++++++++++ tools/decode-status.py | 2 +- 9 files changed, 306 insertions(+), 6 deletions(-) create mode 100644 tasmota/tasmota_xsns_sensor/xsns_108_tc74.ino diff --git a/BUILDS.md b/BUILDS.md index e760e3cba..cb6e3de96 100644 --- a/BUILDS.md +++ b/BUILDS.md @@ -112,6 +112,7 @@ Note: `minimal` variant is not listed as it shouldn't be used outside of the [up | USE_ADS1115 | - | - / x | - | x | - | - | | USE_INA219 | - | - / x | - | x | - | - | | USE_INA226 | - | - / - | - | - | - | - | +| USE_INA3221 | - | - / - | - | - | - | - | | USE_SHT3X | - | - / x | - | x | - | - | | USE_TSL2561 | - | - / - | - | - | - | - | | USE_TSL2591 | - | - / - | - | - | - | - | @@ -147,6 +148,7 @@ Note: `minimal` variant is not listed as it shouldn't be used outside of the [up | USE_PMSA003I | - | - / - | - | - | - | - | | USE_LOX_O2 | - | - / x | - | x | - | - | | USE_GDK101 | - | - / - | - | - | - | - | +| USE_TC74 | - | - / - | - | - | - | - | | | | | | | | | | Feature or Sensor | l | t | k | s | i | d | Remarks | USE_HIH6 | - | - / x | - | x | - | - | diff --git a/CHANGELOG.md b/CHANGELOG.md index cc77eec5a..67f37e0ee 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,7 @@ All notable changes to this project will be documented in this file. - Matter allow `Matter#Initialized` rule once the device is configured (#18451) - Matter UI to change endpoints configuration (#18498) - Matter support for Shutters (without Tilt) (#18509) +- Support for TC74 temperature sensor by Michael Loftis (#18042) ### Breaking Changed diff --git a/CODE_OWNERS.md b/CODE_OWNERS.md index 2e9bcfc20..49d7f6f53 100644 --- a/CODE_OWNERS.md +++ b/CODE_OWNERS.md @@ -206,6 +206,8 @@ In addition to @arendst the following code is mainly owned by: | xsns_104_pmsa003i | Jean-Pierre Deschamps | xsns_105_lox_o2 | @ACE1046 | xsns_106_gdk101 | @Szewcson +| xsns_107_gm861 | @arendst +| xsns_108_tc74 | Michael Loftis | | | Libraries | | | diff --git a/I2CDEVICES.md b/I2CDEVICES.md index d90ff4e44..9faaea61c 100644 --- a/I2CDEVICES.md +++ b/I2CDEVICES.md @@ -114,4 +114,5 @@ Index | Define | Driver | Device | Address(es) | Description 76 | USE_SEN5X | xsns_103 | SEN5X | 0x69 | Gas (VOC/NOx index) and air quality (PPM <1,<2.5,<4,<10) 77 | USE_MCP23XXX_DRV | xdrv_67 | MCP23x17 | 0x20 - 0x26 | 16-bit I/O expander as virtual button/switch/relay 78 | USE_PMSA003I | xsns_104 | PMSA003I | 0x12 | PM2.5 Air Quality Sensor with I2C Interface - 79 | USE_GDK101 | xsns_106 | GDK101 | 0x18 - 0x1B | Gamma Radiation Sensor \ No newline at end of file + 79 | USE_GDK101 | xsns_106 | GDK101 | 0x18 - 0x1B | Gamma Radiation Sensor + 80 | USE_TC74 | xsns_108 | TC74 | 0x48 - 0x4F | Temperature sensor \ No newline at end of file diff --git a/RELEASENOTES.md b/RELEASENOTES.md index c30e4cfa6..df5c0d388 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -113,6 +113,7 @@ The latter links can be used for OTA upgrades too like ``OtaUrl https://ota.tasm ## Changelog v12.5.0.1 ### Added - Command ``SetOption152 0/1`` to select two (0 = default) pin bistable or one (1) pin latching relay control [#18386](https://github.com/arendst/Tasmota/issues/18386) +- Support for TC74 temperature sensor by Michael Loftis [#18042](https://github.com/arendst/Tasmota/issues/18042) - Matter sensors Humidity, Pressure, Illuminance [#18441](https://github.com/arendst/Tasmota/issues/18441) - Matter allow `Matter#Initialized` rule once the device is configured [#18451](https://github.com/arendst/Tasmota/issues/18451) - Matter UI to change endpoints configuration [#18498](https://github.com/arendst/Tasmota/issues/18498) diff --git a/tasmota/my_user_config.h b/tasmota/my_user_config.h index 83c450db6..0d4b8088a 100644 --- a/tasmota/my_user_config.h +++ b/tasmota/my_user_config.h @@ -706,7 +706,10 @@ // #define GDK101_SHOW_STATUS // #define GDK101_SHOW_VIBRATION_STATUS // #define GDK101_SHOW_MEAS_TIME - +// #define USE_TC74 // [I2cDriver80] Enable TC74 sensor (I2C addresses 0x48 - 0x4F) (+1k code) +// #define TC74_MAX_SENSORS 8 // Support non-default/multiple I2C addresses +// #define TC74_I2C_PROBE_ADDRESSES { 0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F } // Addresses to probe/support +// #define TC74_MAX_FAILCOUNT 8 // Maximum failed polls before it's marked inactive until reprobing later // #define USE_RTC_CHIPS // Enable RTC chip support and NTP server - Select only one // #define USE_DS3231 // [I2cDriver26] Enable DS3231 RTC (I2C address 0x68) (+1k2 code) diff --git a/tasmota/tasmota_support/support_features.ino b/tasmota/tasmota_support/support_features.ino index 7bdb9fb34..e19a74c86 100644 --- a/tasmota/tasmota_support/support_features.ino +++ b/tasmota/tasmota_support/support_features.ino @@ -888,9 +888,12 @@ void ResponseAppendFeatures(void) #if defined(USE_I2C) && defined(USE_GDK101) feature9 |= 0x00100000; // xsns_106_gdk101.ino #endif - -// feature9 |= 0x00200000; -// feature9 |= 0x00400000; +#ifdef USE_GM861 + feature9 |= 0x00200000; // xsns_107_gm861.ino +#endif +#if defined(USE_I2C) && defined(USE_TC74) + feature9 |= 0x00400000; // xsns_108_tc74.ino +#endif // feature9 |= 0x00800000; // feature9 |= 0x01000000; diff --git a/tasmota/tasmota_xsns_sensor/xsns_108_tc74.ino b/tasmota/tasmota_xsns_sensor/xsns_108_tc74.ino new file mode 100644 index 000000000..ccc4a98ad --- /dev/null +++ b/tasmota/tasmota_xsns_sensor/xsns_108_tc74.ino @@ -0,0 +1,287 @@ +/* + xsns_108_tc74.ino - TC74 I2C temperature sensor support for Tasmota + + Copyright (C) 2023 Michael Loftis + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +*/ + +#ifdef USE_I2C +#ifdef USE_TC74 + +/*********************************************************************************************\ + * TC74 - Temperature Sensor + * + * TC74 I2C Address: 0x4D + * Datasheet: https://ww1.microchip.com/downloads/en/DeviceDoc/21462D.pdf + * + * Eight I2C address variant parts are available. The part numbers are TC74An where N is + * one of the eight addresses noted in the (unused) #defines below. Be sure to check your + * part number for the correct address before building your firmware image! Due to the + * limited RAM in ESP8266's the default configuration does not try to work with all eight. + * + * For I2C 0x4D, TC74A5 part, is the standard address, other addresses are available as a + * custom order, eight total addresses. This driver thus supports up to + * eight sensors, sensors beyond/other than the default 0x4D require setting + * of defines, there is also no good way to ID these sensors as there's no MSR + * and nothing unique about their information. + * + * These sensors only have a nominal 1C resolution. The git devices are sold + * calibrated to a specific supply voltage but will work from 2.7V-5.5V, but + * will suffer 1C per Volt deviation from the rating of accuracy loss. They're + * only accurate to about +/-2C to begin with. + \*********************************************************************************************/ + +#define XSNS_108 108 +#define XI2C_80 80 + +//#define TC74_MAX_SENSORS 8 // Support non-default/multiple I2C addresses +//#define TC74_I2C_PROBE_ADDRESSES { 0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F } // Addresses to probe/support +//#define TC74_MAX_FAILCOUNT 8 // maximum failed polls before it's marked inactive until reprobing later +//#define TC74_EXTRA_DEBUG // Compile in some extra debug logging statements around failures and measurements + +#define TC74_ADDR0 0x48 +#define TC74_ADDR1 0x49 +#define TC74_ADDR2 0x4A +#define TC74_ADDR3 0x4B +#define TC74_ADDR4 0x4C +#define TC74_ADDR5 0x4D +#define TC74_ADDR6 0x4E +#define TC74_ADDR7 0x4F +#define TC74_ADDR_BASE TC74_ADDR0 +#define TC74_ADDR_DEFAULT TC74_ADDR5 + +#ifndef TC74_MAX_SENSORS +#define TC74_MAX_SENSORS 1 +uint8_t tc74_probes[TC74_MAX_SENSORS] PROGMEM = { TC74_ADDR_DEFAULT }; +#else +uint8_t tc74_probes[TC74_MAX_SENSORS] PROGMEM = TC74_I2C_PROBE_ADDRESSES; +#endif + +#ifndef TC74_MAX_FAILCOUNT +#define TC74_MAX_FAILCOUNT 8 +#endif + +const uint8_t TC74_CMD_RTR = 0x00; // Read Temperature +const uint8_t TC74_CMD_RWCR = 0x01; // Read/Write CONFIG + +/* CONFIG register + * D7 = STANDBY (R/W) + * D6 = READY (R/O) + * D5-D0 = Reserved - always zero + * POR state is all zeroes. + */ +const uint8_t TC74_CONFIG_DRDY = 0b00000010; + +// only used once... +#define TC74_CONFIG_MASK 0b11111100 + +struct { + uint8_t found_count = 0; + uint8_t tcnt = 0; +} tc74_status; + +struct { + // Last read temperature + float temperature = NAN; + // flag if we could/couldn't read in most recent poll + bool is_active; + // failure count, if this goes above N we set active to false and + // the sensor will be retried later + uint8_t failed_count; + uint8_t address; +} tc74_sensors[TC74_MAX_SENSORS]; + + +void TC74InitState() { +#ifdef TC74_EXTRA_DEBUG + AddLog(LOG_LEVEL_DEBUG, PSTR("TC7: InitState")); +#endif + for (uint32_t i = 0; i < TC74_MAX_SENSORS; i++) { + tc74_sensors[i].is_active = false; + tc74_sensors[i].failed_count = 0; + tc74_sensors[i].address = pgm_read_byte(tc74_probes + i); + } +} + +void TC74Detect(bool forced) { + for (uint32_t i = 0; i < TC74_MAX_SENSORS; i++) { + uint8_t config_reg; + uint8_t addr = tc74_sensors[i].address; +#ifdef TC74_EXTRA_DEBUG + AddLog(LOG_LEVEL_DEBUG, PSTR("TC7: Addr %X probing"), addr); +#endif + + // if we failed more than N times, unless we're being forced to, skip it. + if (!forced && tc74_sensors[i].failed_count >= TC74_MAX_FAILCOUNT ) { + tc74_sensors[i].is_active = false; + continue; + } + + // I2cSetDevice ALWAYs returns false if a device is marked active already... + // So if we have the is_active flag for this device SKIP this check + if (!tc74_sensors[i].is_active && !I2cSetDevice(addr)) { + if (tc74_sensors[i].failed_count < 253) { tc74_sensors[i].failed_count++; } +#ifdef TC74_EXTRA_DEBUG + AddLog(LOG_LEVEL_DEBUG, PSTR("TC7: Addr %X failed I2cSetDevice"), addr); +#endif + continue; + } + + // Pull CONFIG and check it, best we can do to keep away from other I2C devices + if (!I2cValidRead8(&config_reg, addr, TC74_CMD_RWCR)) { + tc74_sensors[i].is_active = false; + tc74_sensors[i].failed_count++; + if(I2cActive(addr)) { I2cResetActive(addr); } +#ifdef TC74_EXTRA_DEBUG + AddLog(LOG_LEVEL_ERROR, PSTR("TC7: Addr %X failed CONFIG read, deactivated"), addr); +#endif + continue; + } + + // if any reserved bits are set, not our device + if (config_reg & TC74_CONFIG_MASK != 0x00 ) { + tc74_sensors[i].is_active = false; + tc74_sensors[i].failed_count++; + if(I2cActive(addr)) { I2cResetActive(addr); } +#ifdef TC74_EXTRA_DEBUG + AddLog(LOG_LEVEL_DEBUG, PSTR("TC7: Addr %X found reserved bits set [%x]"), addr, config_reg); +#endif + + continue; + } + + // Make sure STANDBY is not set, POR should be clear, but, if another I2C driver toggled it.... + I2cWrite8(addr, TC74_CMD_RWCR, 0x0); + + if (!tc74_sensors[i].is_active) { + tc74_sensors[i].is_active = true; +#ifdef TC74_EXTRA_DEBUG + AddLog(LOG_LEVEL_DEBUG, PSTR("TC7: Addr %X set active"), addr); +#endif + I2cSetActiveFound(addr, "TC74"); + } + tc74_sensors[i].failed_count = 0; + } // for sensors... +} + +void TC74PollActive() { + for (uint8_t i = 0; i < TC74_MAX_SENSORS; i++) { + uint8_t addr = tc74_sensors[i].address; + uint8_t config_reg; + int8_t temperature_register; + + if (!tc74_sensors[i].is_active) { continue; } + + // if timing were a problem we could read both bytes from the RTR, then + // do mask/shift to recover the parts we want. + if (!I2cValidRead8(&config_reg, addr, TC74_CMD_RWCR)) { + tc74_sensors[i].failed_count++; + continue; + } + + // check if a measurement is ready + if (config_reg & TC74_CONFIG_DRDY != 0b00000010) { continue; } + + // grab most recent reading + if (!I2cValidRead8((uint8_t*)&temperature_register, addr, TC74_CMD_RTR)) { + tc74_sensors[i].failed_count++; + continue; + } + + tc74_sensors[i].temperature = ConvertTemp(temperature_register); + tc74_sensors[i].failed_count = 0; +#ifdef TC74_EXTRA_DEBUG + AddLog(LOG_LEVEL_DEBUG, PSTR("TC7: Addr %X register temperature was %hhi or [%i]"), addr, temperature_register, temperature_register); + AddLog(LOG_LEVEL_DEBUG, PSTR("TC7: Addr %X stored temperature %*_f"), addr, Settings->flag2.temperature_resolution, &tc74_sensors[i].temperature); +#endif + + } // for sensors... +} + +void TC74Show(bool json) { + bool once = true; + // loop over sensors, only output if active + for (uint8_t i = 0; i < TC74_MAX_SENSORS; i++) { + if (tc74_sensors[i].is_active) { + char sname[10]; + snprintf_P(sname, sizeof(sname), PSTR("TC74%c%02X"), IndexSeparator(), tc74_sensors[i].address); + if (json) { + ResponseAppend_P(JSON_SNS_F_TEMP, sname, Settings->flag2.temperature_resolution, &tc74_sensors[i].temperature); + // also send KNX and Domoticz if enabled...and first sensor reporting + // might beed guarded by some sort of enable (compile time or otherwise) + if ((0 == TasmotaGlobal.tele_period) && once) { +#ifdef USE_DOMOTICZ + DomoticzFloatSensor(DZ_TEMP, tc74_sensors[i].temperature); +#endif // USE_DOMOTICZ +#ifdef USE_KNX + KnxSensor(KNX_TEMPERATURE, tc74_sensors[i].temperature); +#endif // USE_KNX + once = false; + } // tele_period, first reporter +#ifdef USE_WEBSERVER + } else { + WSContentSend_Temp(sname, tc74_sensors[i].temperature); +#endif // USE_WEBSERVER + } // if(json) + } // if(is_active) + } // for sensors... +} + +/*********************************************************************************************\ + * Interface +\*********************************************************************************************/ + +bool Xsns108(uint32_t function) { + if (!I2cEnabled(XI2C_80)) { return false; } + + bool result = false; + + // Unlike some other drivers we DO support sensors disappearing and reappearing later + // or simply not available during initial startup + + switch (function) { + case FUNC_INIT: + TC74InitState(); + TC74Detect(false); + break; + case FUNC_HOTPLUG_SCAN: + TC74Detect(true); + tc74_status.tcnt = 1; + break; + case FUNC_EVERY_SECOND: + /* if(tc74_status.tcnt == 0 || tc74_status.tcnt == 60) { + TC74Detect(true); + } */ + tc74_status.tcnt++; + if(tc74_status.tcnt > 60) { + tc74_status.tcnt = 1; + } + TC74PollActive(); + break; + case FUNC_JSON_APPEND: + TC74Show(true); + break; +#ifdef USE_WEBSERVER + case FUNC_WEB_SENSOR: + TC74Show(false); + break; +#endif + } // switch(function) + return result; +} + +#endif // USE_TC74 +#endif // USE_I2C \ No newline at end of file diff --git a/tools/decode-status.py b/tools/decode-status.py index ebe18e460..8ff87b7bf 100755 --- a/tools/decode-status.py +++ b/tools/decode-status.py @@ -295,7 +295,7 @@ a_features = [[ "USE_DINGTIAN_RELAY","USE_HMC5883L","USE_LD2410","USE_ME007", "USE_DISPLAY_TM1650","USE_PCA9632","USE_TUYAMCUBR","USE_SEN5X", "USE_BIOPDU","USE_MCP23XXX_DRV","USE_PMSA003I","USE_LOX_O2", - "USE_GDK101","","","", + "USE_GDK101","USE_GM861","USE_TC74","", "","","","", "","","","" ]] From c498995f7902a3c2a0f771531869269bccd7326d Mon Sep 17 00:00:00 2001 From: stefanbode Date: Tue, 2 May 2023 15:53:17 +0200 Subject: [PATCH 055/289] Update xdrv_68_zerocrossDimmer.ino (#18556) * Update xdrv_68_zerocrossDimmer.ino * Address IRAM issue report removed some IRAM from ESP8266. Further improvement to ESP32 as soon as measurement is available. --- .../xdrv_68_zerocrossDimmer.ino | 67 +++++++++++++------ 1 file changed, 46 insertions(+), 21 deletions(-) diff --git a/tasmota/tasmota_xdrv_driver/xdrv_68_zerocrossDimmer.ino b/tasmota/tasmota_xdrv_driver/xdrv_68_zerocrossDimmer.ino index 060899c49..9ec32e59e 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_68_zerocrossDimmer.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_68_zerocrossDimmer.ino @@ -29,6 +29,9 @@ static const uint8_t MIN_PERCENT = 5; static const uint8_t MAX_PERCENT = 99; static const uint8_t TRIGGER_PERIOD = 75; +#define ZCDIMMERSET_SHOW 1 +//#define ZC_DEBUG 1 + struct AC_ZERO_CROSS_DIMMER { uint32_t cycle_time_us; // Time (in micros()) of last ZC signal uint32_t crossed_zero_at; // Time (in micros()) of last ZC signal @@ -43,6 +46,7 @@ struct AC_ZERO_CROSS_DIMMER { uint8_t triggertime = GATE_ENABLE_TIME; // copy of the Time for the gate keep open to start TRIAC uint32_t intr_counter = 0; // counter internally on interrerupt calls uint32_t missed_zero_cross; // count up all missed Zero-cross events. + uint8_t actual_tigger_Period = TRIGGER_PERIOD; // copy of tigger period to change during runtime } ac_zero_cross_dimmer; @@ -83,7 +87,7 @@ void IRAM_ATTR ACDimmerZeroCross(uint32_t time) { uint32_t IRAM_ATTR ACDimmerTimer_intr_ESP8266() { //ACDimmerTimer_intr(); ACDimmerTimer_intr(); - return 6000; + return ac_zero_cross_dimmer.actual_tigger_Period * 80; } void ACDimmerInterruptDisable(bool disable) @@ -96,9 +100,6 @@ void ACDimmerInterruptDisable(bool disable) if (dimmer_timer != nullptr) { timerAlarmDisable(dimmer_timer); } -#endif -#ifdef ESP8266 - //setTimer1Callback(NULL); #endif } else { for (uint8_t i = 0 ; i < MAX_PWMS; i++) { @@ -119,32 +120,26 @@ void ACDimmerInterruptDisable(bool disable) } timerAlarmEnable(dimmer_timer); #endif - -#ifdef ESP8266 - // Uses ESP8266 waveform (soft PWM) class - // PWM and AcDimmer can even run at the same time this way - //setTimer1Callback(&ACDimmerTimer_intr_ESP8266); -#endif } } void IRAM_ATTR ACDimmerTimer_intr() { + + uint32_t time_since_zc = micros() - ac_zero_cross_dimmer.crossed_zero_at; // If no ZC signal received yet. - uint32_t now = micros(); + if (ac_zero_cross_dimmer.crossed_zero_at == 0) return; + +#ifdef ZC_DEBUG ac_zero_cross_dimmer.intr_counter++; - if (ac_zero_cross_dimmer.crossed_zero_at == 0) - return; - - uint32_t time_since_zc = now - ac_zero_cross_dimmer.crossed_zero_at; - // Check for missed Zero-Cross event. Single failure will correct if (time_since_zc > 10100) { memset(&ac_zero_cross_dimmer.current_state_in_phase, 0x00, sizeof(ac_zero_cross_dimmer.current_state_in_phase)); ac_zero_cross_dimmer.crossed_zero_at += ac_zero_cross_dimmer.cycle_time_us; ac_zero_cross_dimmer.missed_zero_cross++; - time_since_zc = now - ac_zero_cross_dimmer.crossed_zero_at; + time_since_zc += ac_zero_cross_dimmer.cycle_time_us; } - +#endif + ac_zero_cross_dimmer.actual_tigger_Period = TRIGGER_PERIOD; for (uint8_t i = 0 ; i < MAX_PWMS; i++ ) { if (Pin(GPIO_PWM1, i) == -1) continue; switch (ac_zero_cross_dimmer.current_state_in_phase[i]) { @@ -159,15 +154,22 @@ void IRAM_ATTR ACDimmerTimer_intr() { case 3: if (time_since_zc + TRIGGER_PERIOD >= ac_zero_cross_dimmer.enable_time_us[i]){ // Very close to the fire event. Loop the last µseconds to wait. +#ifdef ESP8266 + // on ESP8266 we can change dynamically the trigger interval + ac_zero_cross_dimmer.actual_tigger_Period = tmin(ac_zero_cross_dimmer.actual_tigger_Period,tmax(5,ac_zero_cross_dimmer.enable_time_us[i] - time_since_zc)); +#endif +#ifdef ESP32 while (time_since_zc < ac_zero_cross_dimmer.enable_time_us[i]) { - now = micros(); - time_since_zc = now - ac_zero_cross_dimmer.crossed_zero_at; + time_since_zc = micros() - ac_zero_cross_dimmer.crossed_zero_at; } +#endif } if (time_since_zc >= ac_zero_cross_dimmer.enable_time_us[i]) { digitalWrite(Pin(GPIO_PWM1, i), HIGH); ac_zero_cross_dimmer.current_state_in_phase[i]++; +#ifdef ZC_DEBUG ac_zero_cross_dimmer.accurracy[i] = time_since_zc-ac_zero_cross_dimmer.enable_time_us[i]; +#endif } break; } @@ -175,11 +177,12 @@ void IRAM_ATTR ACDimmerTimer_intr() { } void ACDimmerControllTrigger(void) { - +#ifdef ESP32 if (ac_zero_cross_dimmer.timer_iterrupt_started != ac_zero_cross_dimmer.dimmer_in_use) { AddLog(LOG_LEVEL_DEBUG_MORE, PSTR("ZCD: ZeroEnable %d --> %d ... change..."),ac_zero_cross_dimmer.timer_iterrupt_started, ac_zero_cross_dimmer.dimmer_in_use); ACDimmerInterruptDisable(!ac_zero_cross_dimmer.dimmer_in_use); } +#endif for (uint8_t i = 0; i < MAX_PWMS; i++){ if (Pin(GPIO_PWM1, i) == -1) continue; @@ -231,6 +234,21 @@ void ACDimmerLogging(void) } } +#ifdef USE_WEBSERVER +#ifdef ZCDIMMERSET_SHOW +void ACDimmerShow(void) +{ + char c_ZCDimmerSetBuffer[8]; + for (uint8_t i = 0; i < MAX_PWMS; i++){ + if (Pin(GPIO_PWM1, i) == -1) continue; + if (ac_zero_cross_dimmer.detailpower[i]){ + dtostrfd(ac_zero_cross_dimmer.detailpower[i]/100.0, 2, c_ZCDimmerSetBuffer); + WSContentSend_PD(PSTR("{s}ZCDimmer%d{m}%s %%{e}"), i+1, c_ZCDimmerSetBuffer); + } + } +} +#endif // ZCDIMMERSET_SHOW +#endif // USE_WEBSERVER /*********************************************************************************************\ * Commands @@ -286,6 +304,13 @@ bool Xdrv68(uint32_t function) case FUNC_COMMAND: result = DecodeCommand(kZCDimmerCommands, ZCDimmerCommand); break; +#ifdef USE_WEBSERVER +#ifdef ZCDIMMERSET_SHOW + case FUNC_WEB_SENSOR: + ACDimmerShow(); + break; +#endif // ZCDIMMERSET_SHOW +#endif // USE_WEBSERVER } } return result; From ec00f0f7e2ead311de113462e20b5995aa491ad3 Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Wed, 3 May 2023 11:04:10 +0200 Subject: [PATCH 056/289] esp8266 iram metrics (#18564) --- pio-tools/metrics-firmware.py | 16 ++++++++++++++++ pio-tools/name-firmware.py | 4 ++++ 2 files changed, 20 insertions(+) diff --git a/pio-tools/metrics-firmware.py b/pio-tools/metrics-firmware.py index d9fb7a9ad..0ecdb3f36 100644 --- a/pio-tools/metrics-firmware.py +++ b/pio-tools/metrics-firmware.py @@ -1,9 +1,25 @@ Import("env") +import os import tasmotapiolib +from os.path import join + def firm_metrics(source, target, env): if env["PIOPLATFORM"] == "espressif32": import tasmota_metrics env.Execute("$PYTHONEXE -m tasmota_metrics " + str(tasmotapiolib.get_source_map_path(env).resolve())) + elif env["PIOPLATFORM"] == "espressif8266": + map_file = join(env.subst("$BUILD_DIR")) + os.sep + "firmware.map" + with open(map_file,'r') as f: + phrase = "_text_end = ABSOLUTE (.)" + for line in f: + if phrase in line: + address = line.strip().split(" ")[0] + if int(address, 16) < 0x40108000: + used_bytes = int(address, 16) - 0x40100000 + remaining_bytes = 0x8000 - used_bytes + percentage = round(used_bytes / 0x8000 * 100,1) + print("Used static IRAM:",used_bytes,"bytes (",remaining_bytes,"remain,",percentage,"% used)") + env.AddPostAction("$BUILD_DIR/${PROGNAME}.bin",firm_metrics) \ No newline at end of file diff --git a/pio-tools/name-firmware.py b/pio-tools/name-firmware.py index 6162500da..0d853d035 100644 --- a/pio-tools/name-firmware.py +++ b/pio-tools/name-firmware.py @@ -1,8 +1,10 @@ Import("env") +import os import shutil import pathlib import tasmotapiolib +from os.path import join def bin_map_copy(source, target, env): @@ -30,5 +32,7 @@ def bin_map_copy(source, target, env): shutil.copy(tasmotapiolib.get_source_map_path(env), map_file) shutil.copy(factory, one_bin_file) else: + map_firm = join(env.subst("$BUILD_DIR")) + os.sep + "firmware.map" + shutil.copy(tasmotapiolib.get_source_map_path(env), map_firm) shutil.move(tasmotapiolib.get_source_map_path(env), map_file) env.AddPostAction("$BUILD_DIR/${PROGNAME}.bin", bin_map_copy) From 3fa42072b11613a2222b52b8bb860d1ae9f0883d Mon Sep 17 00:00:00 2001 From: s-hadinger <49731213+s-hadinger@users.noreply.github.com> Date: Wed, 3 May 2023 17:33:21 +0200 Subject: [PATCH 057/289] Fix HASPmota demo for the new Berry rule engine (#18570) --- tasmota/berry/haspmota_src/haspmota_demo.tapp | Bin 131208 -> 193476 bytes .../haspmota_src/haspmota_demo/autoexec.be | 4 ++-- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/tasmota/berry/haspmota_src/haspmota_demo.tapp b/tasmota/berry/haspmota_src/haspmota_demo.tapp index b25ad84cbc9da4f597cecdae4db745fa1d71772f..26c138e405bb3993e28fd9ad7a2b1871e99fdc8e 100644 GIT binary patch delta 62133 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 Date: Wed, 3 May 2023 18:30:34 +0200 Subject: [PATCH 058/289] Matter support for Shutters with Tilt (#18569) --- CHANGELOG.md | 1 + .../src/embedded/Matter_Plugin_Shutter.be | 12 +- .../src/embedded/Matter_Plugin_ShutterTilt.be | 68 ++- .../solidified_Matter_Plugin_Shutter.h | 38 +- .../solidified_Matter_Plugin_ShutterTilt.h | 404 ++++++++++++++---- 5 files changed, 399 insertions(+), 124 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 67f37e0ee..ee3c3bebb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,7 @@ All notable changes to this project will be documented in this file. - Matter UI to change endpoints configuration (#18498) - Matter support for Shutters (without Tilt) (#18509) - Support for TC74 temperature sensor by Michael Loftis (#18042) +- Matter support for Shutters with Tilt ### Breaking Changed diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Shutter.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Shutter.be index c3e0f38df..7648bf5e5 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Shutter.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Shutter.be @@ -153,8 +153,8 @@ class Matter_Plugin_Shutter : Matter_Plugin_Device ############################################################# # parse sensor # - # The device calls regularly `tasmota.read_sensors()` and converts - # it to json. + # parse the output from `ShutterPosition` + # Ex: `{"Shutter1":{"Position":50,"Direction":0,"Target":50,"Tilt":30}}` def parse_sensors(payload) import string var k = "Shutter" + str(self.tasmota_shutter_index + 1) @@ -169,14 +169,6 @@ class Matter_Plugin_Shutter : Matter_Plugin_Device end self.shadow_shutter_pos = val_pos end - # Tilt - we can keep it here knowing that it won't change if not implemented - var val_tilt = v.find("Tilt") - if val_tilt != nil - if val_tilt != self.shadow_shutter_tilt - self.attribute_updated(0x0102, 0x000F) # CurrentPositionTiltPercent100ths - end - self.shadow_shutter_tilt = val_tilt - end # Direction var val_dir = v.find("Direction") if val_dir != nil diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_ShutterTilt.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_ShutterTilt.be index 7d8adb7b4..c181cff36 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_ShutterTilt.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_ShutterTilt.be @@ -44,6 +44,7 @@ class Matter_Plugin_ShutterTilt : Matter_Plugin_Shutter # var shadow_shutter_target # var shadow_shutter_tilt # var shadow_shutter_direction # 1=opening -1=closing 0=not moving TODO + var tilt_min, tilt_max ############################################################# # Constructor inherited @@ -51,6 +52,46 @@ class Matter_Plugin_ShutterTilt : Matter_Plugin_Shutter ############################################################# # Update shadow inherited + ############################################################# + # parse sensor + # + # parse the output from `ShutterPosition` + # Ex: `{"Shutter1":{"Position":50,"Direction":0,"Target":50,"Tilt":30}}` + def parse_sensors(payload) + import string + var k = "Shutter" + str(self.tasmota_shutter_index + 1) + if payload.contains(k) + var v = payload[k] + # Tilt - we can keep it here knowing that it won't change if not implemented + var val_tilt = v.find("Tilt") + if val_tilt != nil + if val_tilt != self.shadow_shutter_tilt + self.attribute_updated(0x0102, 0x000F) # CurrentPositionTiltPercent100ths + end + self.shadow_shutter_tilt = val_tilt + end + # + end + super(self).parse_sensors(payload) # parse other shutter values + end + + ############################################################# + # Update tilt min/max + # + # Update the min and max tilt values from Status 12 + def update_tilt_min_max() + # get the min/max tilt values + var r_st13 = tasmota.cmd("Status 13", true) # issue `Status 13` + if r_st13.contains('StatusSHT') + r_st13 = r_st13['StatusSHT'] # skip root + var d = r_st13.find("SHT"+str(self.tasmota_shutter_index), {}).find('TiltConfig') + if d != nil + self.tilt_min = int(d[0]) + self.tilt_max = int(d[1]) + end + end + end + ############################################################# # read an attribute # @@ -67,9 +108,20 @@ class Matter_Plugin_ShutterTilt : Matter_Plugin_Shutter return TLV.create_TLV(TLV.U1, 1 + 8 + 16) # Operational + Lift Position Aware + Tilt Position Aware elif attribute == 0x000F # ---------- CurrentPositionTiltPercent100ths / u8 ---------- - return TLV.create_TLV(TLV.U2, (100 - self.shadow_shutter_tilt) * 100) + self.update_tilt_min_max() + if self.tilt_min != nil && self.tilt_max != nil + var tilt_percentage = tasmota.scale_uint(self.shadow_shutter_tilt, self.tilt_min, self.tilt_max, 0, 1000) + return TLV.create_TLV(TLV.U2, tilt_percentage) + else + return TLV.create_TLV(TLV.NULL, nil) # return invalid + end elif attribute == 0x000C # ---------- TargetPositionTiltPercent100ths / u16 ---------- - return TLV.create_TLV(TLV.U1, 0) # TODO + if self.tilt_min != nil && self.tilt_max != nil + var tilt_percentage = tasmota.scale_uint(self.shadow_shutter_tilt, self.tilt_min, self.tilt_max, 0, 1000) + return TLV.create_TLV(TLV.U2, tilt_percentage) + else + return TLV.create_TLV(TLV.NULL, nil) # return invalid + end elif attribute == 0xFFFC # ---------- FeatureMap / map32 ---------- return TLV.create_TLV(TLV.U4, 3 + 4 + 16) # Lift + Tilt + PA_LF + PA_TL @@ -96,8 +148,16 @@ class Matter_Plugin_ShutterTilt : Matter_Plugin_Shutter if command == 0x0008 # ---------- GoToTiltPercentage ---------- var tilt = val.findsubval(0) if tilt != nil - tilt = tilt / 10 - ctx.log = "tilt%:"+str(tilt) + self.update_tilt_min_max() + if self.tilt_min != nil && self.tilt_max != nil + var tilt_val = tasmota.scale_uint(tilt, 0, 1000, self.tilt_min, self.tilt_max) + tasmota.cmd("ShutterTilt"+str(self.tasmota_shutter_index+1) + " " + str(tilt_val), false) # TODO + self.update_shadow() + ctx.log = "tilt%:"+str(tilt) + else + ctx.log = "tilt%(no_tilt_support):"+str(tilt) + end + end return true end diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Shutter.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Shutter.h index 54edf5622..ec02f9890 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Shutter.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Shutter.h @@ -464,7 +464,7 @@ be_local_closure(Matter_Plugin_Shutter_invoke_request, /* name */ ********************************************************************/ be_local_closure(Matter_Plugin_Shutter_parse_sensors, /* name */ be_nested_proto( - 13, /* nstack */ + 12, /* nstack */ 2, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -472,7 +472,7 @@ be_local_closure(Matter_Plugin_Shutter_parse_sensors, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[15]) { /* constants */ + ( &(const bvalue[13]) { /* constants */ /* K0 */ be_nested_str_weak(string), /* K1 */ be_nested_str_weak(Shutter), /* K2 */ be_nested_str_weak(tasmota_shutter_index), @@ -482,16 +482,14 @@ be_local_closure(Matter_Plugin_Shutter_parse_sensors, /* name */ /* K6 */ be_nested_str_weak(Position), /* K7 */ be_nested_str_weak(shadow_shutter_pos), /* K8 */ be_nested_str_weak(attribute_updated), - /* K9 */ be_nested_str_weak(Tilt), - /* K10 */ be_nested_str_weak(shadow_shutter_tilt), - /* K11 */ be_nested_str_weak(Direction), - /* K12 */ be_nested_str_weak(shadow_shutter_direction), - /* K13 */ be_nested_str_weak(Target), - /* K14 */ be_nested_str_weak(shadow_shutter_target), + /* K9 */ be_nested_str_weak(Direction), + /* K10 */ be_nested_str_weak(shadow_shutter_direction), + /* K11 */ be_nested_str_weak(Target), + /* K12 */ be_nested_str_weak(shadow_shutter_target), }), be_str_weak(parse_sensors), &be_const_str_solidified, - ( &(const binstruction[68]) { /* code */ + ( &(const binstruction[54]) { /* code */ 0xA40A0000, // 0000 IMPORT R2 K0 0x600C0008, // 0001 GETGBL R3 G8 0x88100102, // 0002 GETMBR R4 R0 K2 @@ -501,7 +499,7 @@ be_local_closure(Matter_Plugin_Shutter_parse_sensors, /* name */ 0x8C100304, // 0006 GETMET R4 R1 K4 0x5C180600, // 0007 MOVE R6 R3 0x7C100400, // 0008 CALL R4 2 - 0x78120038, // 0009 JMPF R4 #0043 + 0x7812002A, // 0009 JMPF R4 #0035 0x94100203, // 000A GETIDX R4 R1 R3 0x8C140905, // 000B GETMET R5 R4 K5 0x581C0006, // 000C LDCONST R7 K6 @@ -528,7 +526,7 @@ be_local_closure(Matter_Plugin_Shutter_parse_sensors, /* name */ 0x781E0003, // 0021 JMPF R7 #0026 0x8C1C0108, // 0022 GETMET R7 R0 K8 0x54260101, // 0023 LDINT R9 258 - 0x542A000E, // 0024 LDINT R10 15 + 0x542A0009, // 0024 LDINT R10 10 0x7C1C0600, // 0025 CALL R7 3 0x90021406, // 0026 SETMBR R0 K10 R6 0x8C1C0905, // 0027 GETMET R7 R4 K5 @@ -542,24 +540,10 @@ be_local_closure(Matter_Plugin_Shutter_parse_sensors, /* name */ 0x78220003, // 002F JMPF R8 #0034 0x8C200108, // 0030 GETMET R8 R0 K8 0x542A0101, // 0031 LDINT R10 258 - 0x542E0009, // 0032 LDINT R11 10 + 0x542E000A, // 0032 LDINT R11 11 0x7C200600, // 0033 CALL R8 3 0x90021807, // 0034 SETMBR R0 K12 R7 - 0x8C200905, // 0035 GETMET R8 R4 K5 - 0x5828000D, // 0036 LDCONST R10 K13 - 0x7C200400, // 0037 CALL R8 2 - 0x4C240000, // 0038 LDNIL R9 - 0x20241009, // 0039 NE R9 R8 R9 - 0x78260007, // 003A JMPF R9 #0043 - 0x8824010E, // 003B GETMBR R9 R0 K14 - 0x20241009, // 003C NE R9 R8 R9 - 0x78260003, // 003D JMPF R9 #0042 - 0x8C240108, // 003E GETMET R9 R0 K8 - 0x542E0101, // 003F LDINT R11 258 - 0x5432000A, // 0040 LDINT R12 11 - 0x7C240600, // 0041 CALL R9 3 - 0x90021C08, // 0042 SETMBR R0 K14 R8 - 0x80000000, // 0043 RET 0 + 0x80000000, // 0035 RET 0 }) ) ); diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_ShutterTilt.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_ShutterTilt.h index 8126a9e45..9e22968e0 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_ShutterTilt.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_ShutterTilt.h @@ -6,12 +6,82 @@ extern const bclass be_class_Matter_Plugin_ShutterTilt; +/******************************************************************** +** Solidified function: update_tilt_min_max +********************************************************************/ +be_local_closure(Matter_Plugin_ShutterTilt_update_tilt_min_max, /* name */ + be_nested_proto( + 6, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[13]) { /* constants */ + /* K0 */ be_nested_str_weak(tasmota), + /* K1 */ be_nested_str_weak(cmd), + /* K2 */ be_nested_str_weak(Status_X2013), + /* K3 */ be_nested_str_weak(contains), + /* K4 */ be_nested_str_weak(StatusSHT), + /* K5 */ be_nested_str_weak(find), + /* K6 */ be_nested_str_weak(SHT), + /* K7 */ be_nested_str_weak(tasmota_shutter_index), + /* K8 */ be_nested_str_weak(TiltConfig), + /* K9 */ be_nested_str_weak(tilt_min), + /* K10 */ be_const_int(0), + /* K11 */ be_nested_str_weak(tilt_max), + /* K12 */ be_const_int(1), + }), + be_str_weak(update_tilt_min_max), + &be_const_str_solidified, + ( &(const binstruction[33]) { /* code */ + 0xB8060000, // 0000 GETNGBL R1 K0 + 0x8C040301, // 0001 GETMET R1 R1 K1 + 0x580C0002, // 0002 LDCONST R3 K2 + 0x50100200, // 0003 LDBOOL R4 1 0 + 0x7C040600, // 0004 CALL R1 3 + 0x8C080303, // 0005 GETMET R2 R1 K3 + 0x58100004, // 0006 LDCONST R4 K4 + 0x7C080400, // 0007 CALL R2 2 + 0x780A0016, // 0008 JMPF R2 #0020 + 0x94040304, // 0009 GETIDX R1 R1 K4 + 0x8C080305, // 000A GETMET R2 R1 K5 + 0x60100008, // 000B GETGBL R4 G8 + 0x88140107, // 000C GETMBR R5 R0 K7 + 0x7C100200, // 000D CALL R4 1 + 0x00120C04, // 000E ADD R4 K6 R4 + 0x60140013, // 000F GETGBL R5 G19 + 0x7C140000, // 0010 CALL R5 0 + 0x7C080600, // 0011 CALL R2 3 + 0x8C080505, // 0012 GETMET R2 R2 K5 + 0x58100008, // 0013 LDCONST R4 K8 + 0x7C080400, // 0014 CALL R2 2 + 0x4C0C0000, // 0015 LDNIL R3 + 0x200C0403, // 0016 NE R3 R2 R3 + 0x780E0007, // 0017 JMPF R3 #0020 + 0x600C0009, // 0018 GETGBL R3 G9 + 0x9410050A, // 0019 GETIDX R4 R2 K10 + 0x7C0C0200, // 001A CALL R3 1 + 0x90021203, // 001B SETMBR R0 K9 R3 + 0x600C0009, // 001C GETGBL R3 G9 + 0x9410050C, // 001D GETIDX R4 R2 K12 + 0x7C0C0200, // 001E CALL R3 1 + 0x90021603, // 001F SETMBR R0 K11 R3 + 0x80000000, // 0020 RET 0 + }) + ) +); +/*******************************************************************/ + + /******************************************************************** ** Solidified function: invoke_request ********************************************************************/ be_local_closure(Matter_Plugin_ShutterTilt_invoke_request, /* name */ be_nested_proto( - 13, /* nstack */ + 16, /* nstack */ 4, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -19,7 +89,7 @@ be_local_closure(Matter_Plugin_ShutterTilt_invoke_request, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[11]) { /* constants */ + ( &(const bvalue[23]) { /* constants */ /* K0 */ be_nested_str_weak(light), /* K1 */ be_nested_str_weak(matter), /* K2 */ be_nested_str_weak(TLV), @@ -28,13 +98,25 @@ be_local_closure(Matter_Plugin_ShutterTilt_invoke_request, /* name */ /* K5 */ be_nested_str_weak(update_shadow_lazy), /* K6 */ be_nested_str_weak(findsubval), /* K7 */ be_const_int(0), - /* K8 */ be_nested_str_weak(log), - /* K9 */ be_nested_str_weak(tilt_X25_X3A), - /* K10 */ be_nested_str_weak(invoke_request), + /* K8 */ be_nested_str_weak(update_tilt_min_max), + /* K9 */ be_nested_str_weak(tilt_min), + /* K10 */ be_nested_str_weak(tilt_max), + /* K11 */ be_nested_str_weak(tasmota), + /* K12 */ be_nested_str_weak(scale_uint), + /* K13 */ be_nested_str_weak(cmd), + /* K14 */ be_nested_str_weak(ShutterTilt), + /* K15 */ be_nested_str_weak(tasmota_shutter_index), + /* K16 */ be_const_int(1), + /* K17 */ be_nested_str_weak(_X20), + /* K18 */ be_nested_str_weak(update_shadow), + /* K19 */ be_nested_str_weak(log), + /* K20 */ be_nested_str_weak(tilt_X25_X3A), + /* K21 */ be_nested_str_weak(tilt_X25_X28no_tilt_support_X29_X3A), + /* K22 */ be_nested_str_weak(invoke_request), }), be_str_weak(invoke_request), &be_const_str_solidified, - ( &(const binstruction[37]) { /* code */ + ( &(const binstruction[75]) { /* code */ 0xA4120000, // 0000 IMPORT R4 K0 0xB8160200, // 0001 GETNGBL R5 K1 0x88140B02, // 0002 GETMBR R5 R5 K2 @@ -42,36 +124,74 @@ be_local_closure(Matter_Plugin_ShutterTilt_invoke_request, /* name */ 0x881C0704, // 0004 GETMBR R7 R3 K4 0x54220101, // 0005 LDINT R8 258 0x1C200C08, // 0006 EQ R8 R6 R8 - 0x78220013, // 0007 JMPF R8 #001C + 0x78220039, // 0007 JMPF R8 #0042 0x8C200105, // 0008 GETMET R8 R0 K5 0x7C200200, // 0009 CALL R8 1 0x54220007, // 000A LDINT R8 8 0x1C200E08, // 000B EQ R8 R7 R8 - 0x7822000E, // 000C JMPF R8 #001C + 0x78220034, // 000C JMPF R8 #0042 0x8C200506, // 000D GETMET R8 R2 K6 0x58280007, // 000E LDCONST R10 K7 0x7C200400, // 000F CALL R8 2 0x4C240000, // 0010 LDNIL R9 0x20241009, // 0011 NE R9 R8 R9 - 0x78260006, // 0012 JMPF R9 #001A - 0x54260009, // 0013 LDINT R9 10 - 0x0C201009, // 0014 DIV R8 R8 R9 - 0x60240008, // 0015 GETGBL R9 G8 - 0x5C281000, // 0016 MOVE R10 R8 - 0x7C240200, // 0017 CALL R9 1 - 0x00261209, // 0018 ADD R9 K9 R9 - 0x900E1009, // 0019 SETMBR R3 K8 R9 - 0x50240200, // 001A LDBOOL R9 1 0 - 0x80041200, // 001B RET 1 R9 - 0x60200003, // 001C GETGBL R8 G3 - 0x5C240000, // 001D MOVE R9 R0 - 0x7C200200, // 001E CALL R8 1 - 0x8C20110A, // 001F GETMET R8 R8 K10 - 0x5C280200, // 0020 MOVE R10 R1 - 0x5C2C0400, // 0021 MOVE R11 R2 - 0x5C300600, // 0022 MOVE R12 R3 - 0x7C200800, // 0023 CALL R8 4 - 0x80041000, // 0024 RET 1 R8 + 0x7826002C, // 0012 JMPF R9 #0040 + 0x8C240108, // 0013 GETMET R9 R0 K8 + 0x7C240200, // 0014 CALL R9 1 + 0x88240109, // 0015 GETMBR R9 R0 K9 + 0x4C280000, // 0016 LDNIL R10 + 0x2024120A, // 0017 NE R9 R9 R10 + 0x78260021, // 0018 JMPF R9 #003B + 0x8824010A, // 0019 GETMBR R9 R0 K10 + 0x4C280000, // 001A LDNIL R10 + 0x2024120A, // 001B NE R9 R9 R10 + 0x7826001D, // 001C JMPF R9 #003B + 0xB8261600, // 001D GETNGBL R9 K11 + 0x8C24130C, // 001E GETMET R9 R9 K12 + 0x5C2C1000, // 001F MOVE R11 R8 + 0x58300007, // 0020 LDCONST R12 K7 + 0x543603E7, // 0021 LDINT R13 1000 + 0x88380109, // 0022 GETMBR R14 R0 K9 + 0x883C010A, // 0023 GETMBR R15 R0 K10 + 0x7C240C00, // 0024 CALL R9 6 + 0xB82A1600, // 0025 GETNGBL R10 K11 + 0x8C28150D, // 0026 GETMET R10 R10 K13 + 0x60300008, // 0027 GETGBL R12 G8 + 0x8834010F, // 0028 GETMBR R13 R0 K15 + 0x00341B10, // 0029 ADD R13 R13 K16 + 0x7C300200, // 002A CALL R12 1 + 0x00321C0C, // 002B ADD R12 K14 R12 + 0x00301911, // 002C ADD R12 R12 K17 + 0x60340008, // 002D GETGBL R13 G8 + 0x5C381200, // 002E MOVE R14 R9 + 0x7C340200, // 002F CALL R13 1 + 0x0030180D, // 0030 ADD R12 R12 R13 + 0x50340000, // 0031 LDBOOL R13 0 0 + 0x7C280600, // 0032 CALL R10 3 + 0x8C280112, // 0033 GETMET R10 R0 K18 + 0x7C280200, // 0034 CALL R10 1 + 0x60280008, // 0035 GETGBL R10 G8 + 0x5C2C1000, // 0036 MOVE R11 R8 + 0x7C280200, // 0037 CALL R10 1 + 0x002A280A, // 0038 ADD R10 K20 R10 + 0x900E260A, // 0039 SETMBR R3 K19 R10 + 0x70020004, // 003A JMP #0040 + 0x60240008, // 003B GETGBL R9 G8 + 0x5C281000, // 003C MOVE R10 R8 + 0x7C240200, // 003D CALL R9 1 + 0x00262A09, // 003E ADD R9 K21 R9 + 0x900E2609, // 003F SETMBR R3 K19 R9 + 0x50240200, // 0040 LDBOOL R9 1 0 + 0x80041200, // 0041 RET 1 R9 + 0x60200003, // 0042 GETGBL R8 G3 + 0x5C240000, // 0043 MOVE R9 R0 + 0x7C200200, // 0044 CALL R8 1 + 0x8C201116, // 0045 GETMET R8 R8 K22 + 0x5C280200, // 0046 MOVE R10 R1 + 0x5C2C0400, // 0047 MOVE R11 R2 + 0x5C300600, // 0048 MOVE R12 R3 + 0x7C200800, // 0049 CALL R8 4 + 0x80041000, // 004A RET 1 R8 }) ) ); @@ -83,7 +203,7 @@ be_local_closure(Matter_Plugin_ShutterTilt_invoke_request, /* name */ ********************************************************************/ be_local_closure(Matter_Plugin_ShutterTilt_read_attribute, /* name */ be_nested_proto( - 12, /* nstack */ + 14, /* nstack */ 3, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -91,7 +211,7 @@ be_local_closure(Matter_Plugin_ShutterTilt_read_attribute, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[15]) { /* constants */ + ( &(const bvalue[21]) { /* constants */ /* K0 */ be_nested_str_weak(string), /* K1 */ be_nested_str_weak(matter), /* K2 */ be_nested_str_weak(TLV), @@ -101,16 +221,22 @@ be_local_closure(Matter_Plugin_ShutterTilt_read_attribute, /* name */ /* K6 */ be_nested_str_weak(create_TLV), /* K7 */ be_nested_str_weak(U1), /* K8 */ be_const_int(1), - /* K9 */ be_nested_str_weak(U2), - /* K10 */ be_nested_str_weak(shadow_shutter_tilt), - /* K11 */ be_const_int(0), - /* K12 */ be_nested_str_weak(U4), - /* K13 */ be_const_int(3), - /* K14 */ be_nested_str_weak(read_attribute), + /* K9 */ be_nested_str_weak(update_tilt_min_max), + /* K10 */ be_nested_str_weak(tilt_min), + /* K11 */ be_nested_str_weak(tilt_max), + /* K12 */ be_nested_str_weak(tasmota), + /* K13 */ be_nested_str_weak(scale_uint), + /* K14 */ be_nested_str_weak(shadow_shutter_tilt), + /* K15 */ be_const_int(0), + /* K16 */ be_nested_str_weak(U2), + /* K17 */ be_nested_str_weak(NULL), + /* K18 */ be_nested_str_weak(U4), + /* K19 */ be_const_int(3), + /* K20 */ be_nested_str_weak(read_attribute), }), be_str_weak(read_attribute), &be_const_str_solidified, - ( &(const binstruction[63]) { /* code */ + ( &(const binstruction[105]) { /* code */ 0xA40E0000, // 0000 IMPORT R3 K0 0xB8120200, // 0001 GETNGBL R4 K1 0x88100902, // 0002 GETMBR R4 R4 K2 @@ -118,7 +244,7 @@ be_local_closure(Matter_Plugin_ShutterTilt_read_attribute, /* name */ 0x88180504, // 0004 GETMBR R6 R2 K4 0x541E0101, // 0005 LDINT R7 258 0x1C1C0A07, // 0006 EQ R7 R5 R7 - 0x781E002E, // 0007 JMPF R7 #0037 + 0x781E0058, // 0007 JMPF R7 #0061 0x8C1C0105, // 0008 GETMET R7 R0 K5 0x7C1C0200, // 0009 CALL R7 1 0x541E0006, // 000A LDINT R7 7 @@ -132,48 +258,156 @@ be_local_closure(Matter_Plugin_ShutterTilt_read_attribute, /* name */ 0x0028140B, // 0012 ADD R10 R10 R11 0x7C1C0600, // 0013 CALL R7 3 0x80040E00, // 0014 RET 1 R7 - 0x70020020, // 0015 JMP #0037 + 0x7002004A, // 0015 JMP #0061 0x541E000E, // 0016 LDINT R7 15 0x1C1C0C07, // 0017 EQ R7 R6 R7 - 0x781E0009, // 0018 JMPF R7 #0023 - 0x8C1C0906, // 0019 GETMET R7 R4 K6 - 0x88240909, // 001A GETMBR R9 R4 K9 - 0x542A0063, // 001B LDINT R10 100 - 0x882C010A, // 001C GETMBR R11 R0 K10 - 0x0428140B, // 001D SUB R10 R10 R11 - 0x542E0063, // 001E LDINT R11 100 - 0x0828140B, // 001F MUL R10 R10 R11 - 0x7C1C0600, // 0020 CALL R7 3 - 0x80040E00, // 0021 RET 1 R7 - 0x70020013, // 0022 JMP #0037 - 0x541E000B, // 0023 LDINT R7 12 - 0x1C1C0C07, // 0024 EQ R7 R6 R7 - 0x781E0005, // 0025 JMPF R7 #002C - 0x8C1C0906, // 0026 GETMET R7 R4 K6 - 0x88240907, // 0027 GETMBR R9 R4 K7 - 0x5828000B, // 0028 LDCONST R10 K11 - 0x7C1C0600, // 0029 CALL R7 3 - 0x80040E00, // 002A RET 1 R7 - 0x7002000A, // 002B JMP #0037 - 0x541EFFFB, // 002C LDINT R7 65532 - 0x1C1C0C07, // 002D EQ R7 R6 R7 - 0x781E0007, // 002E JMPF R7 #0037 - 0x8C1C0906, // 002F GETMET R7 R4 K6 - 0x8824090C, // 0030 GETMBR R9 R4 K12 - 0x542A0003, // 0031 LDINT R10 4 - 0x002A1A0A, // 0032 ADD R10 K13 R10 - 0x542E000F, // 0033 LDINT R11 16 - 0x0028140B, // 0034 ADD R10 R10 R11 - 0x7C1C0600, // 0035 CALL R7 3 - 0x80040E00, // 0036 RET 1 R7 - 0x601C0003, // 0037 GETGBL R7 G3 - 0x5C200000, // 0038 MOVE R8 R0 - 0x7C1C0200, // 0039 CALL R7 1 - 0x8C1C0F0E, // 003A GETMET R7 R7 K14 - 0x5C240200, // 003B MOVE R9 R1 - 0x5C280400, // 003C MOVE R10 R2 - 0x7C1C0600, // 003D CALL R7 3 - 0x80040E00, // 003E RET 1 R7 + 0x781E001D, // 0018 JMPF R7 #0037 + 0x8C1C0109, // 0019 GETMET R7 R0 K9 + 0x7C1C0200, // 001A CALL R7 1 + 0x881C010A, // 001B GETMBR R7 R0 K10 + 0x4C200000, // 001C LDNIL R8 + 0x201C0E08, // 001D NE R7 R7 R8 + 0x781E0011, // 001E JMPF R7 #0031 + 0x881C010B, // 001F GETMBR R7 R0 K11 + 0x4C200000, // 0020 LDNIL R8 + 0x201C0E08, // 0021 NE R7 R7 R8 + 0x781E000D, // 0022 JMPF R7 #0031 + 0xB81E1800, // 0023 GETNGBL R7 K12 + 0x8C1C0F0D, // 0024 GETMET R7 R7 K13 + 0x8824010E, // 0025 GETMBR R9 R0 K14 + 0x8828010A, // 0026 GETMBR R10 R0 K10 + 0x882C010B, // 0027 GETMBR R11 R0 K11 + 0x5830000F, // 0028 LDCONST R12 K15 + 0x543603E7, // 0029 LDINT R13 1000 + 0x7C1C0C00, // 002A CALL R7 6 + 0x8C200906, // 002B GETMET R8 R4 K6 + 0x88280910, // 002C GETMBR R10 R4 K16 + 0x5C2C0E00, // 002D MOVE R11 R7 + 0x7C200600, // 002E CALL R8 3 + 0x80041000, // 002F RET 1 R8 + 0x70020004, // 0030 JMP #0036 + 0x8C1C0906, // 0031 GETMET R7 R4 K6 + 0x88240911, // 0032 GETMBR R9 R4 K17 + 0x4C280000, // 0033 LDNIL R10 + 0x7C1C0600, // 0034 CALL R7 3 + 0x80040E00, // 0035 RET 1 R7 + 0x70020029, // 0036 JMP #0061 + 0x541E000B, // 0037 LDINT R7 12 + 0x1C1C0C07, // 0038 EQ R7 R6 R7 + 0x781E001B, // 0039 JMPF R7 #0056 + 0x881C010A, // 003A GETMBR R7 R0 K10 + 0x4C200000, // 003B LDNIL R8 + 0x201C0E08, // 003C NE R7 R7 R8 + 0x781E0011, // 003D JMPF R7 #0050 + 0x881C010B, // 003E GETMBR R7 R0 K11 + 0x4C200000, // 003F LDNIL R8 + 0x201C0E08, // 0040 NE R7 R7 R8 + 0x781E000D, // 0041 JMPF R7 #0050 + 0xB81E1800, // 0042 GETNGBL R7 K12 + 0x8C1C0F0D, // 0043 GETMET R7 R7 K13 + 0x8824010E, // 0044 GETMBR R9 R0 K14 + 0x8828010A, // 0045 GETMBR R10 R0 K10 + 0x882C010B, // 0046 GETMBR R11 R0 K11 + 0x5830000F, // 0047 LDCONST R12 K15 + 0x543603E7, // 0048 LDINT R13 1000 + 0x7C1C0C00, // 0049 CALL R7 6 + 0x8C200906, // 004A GETMET R8 R4 K6 + 0x88280910, // 004B GETMBR R10 R4 K16 + 0x5C2C0E00, // 004C MOVE R11 R7 + 0x7C200600, // 004D CALL R8 3 + 0x80041000, // 004E RET 1 R8 + 0x70020004, // 004F JMP #0055 + 0x8C1C0906, // 0050 GETMET R7 R4 K6 + 0x88240911, // 0051 GETMBR R9 R4 K17 + 0x4C280000, // 0052 LDNIL R10 + 0x7C1C0600, // 0053 CALL R7 3 + 0x80040E00, // 0054 RET 1 R7 + 0x7002000A, // 0055 JMP #0061 + 0x541EFFFB, // 0056 LDINT R7 65532 + 0x1C1C0C07, // 0057 EQ R7 R6 R7 + 0x781E0007, // 0058 JMPF R7 #0061 + 0x8C1C0906, // 0059 GETMET R7 R4 K6 + 0x88240912, // 005A GETMBR R9 R4 K18 + 0x542A0003, // 005B LDINT R10 4 + 0x002A260A, // 005C ADD R10 K19 R10 + 0x542E000F, // 005D LDINT R11 16 + 0x0028140B, // 005E ADD R10 R10 R11 + 0x7C1C0600, // 005F CALL R7 3 + 0x80040E00, // 0060 RET 1 R7 + 0x601C0003, // 0061 GETGBL R7 G3 + 0x5C200000, // 0062 MOVE R8 R0 + 0x7C1C0200, // 0063 CALL R7 1 + 0x8C1C0F14, // 0064 GETMET R7 R7 K20 + 0x5C240200, // 0065 MOVE R9 R1 + 0x5C280400, // 0066 MOVE R10 R2 + 0x7C1C0600, // 0067 CALL R7 3 + 0x80040E00, // 0068 RET 1 R7 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: parse_sensors +********************************************************************/ +be_local_closure(Matter_Plugin_ShutterTilt_parse_sensors, /* name */ + be_nested_proto( + 10, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[10]) { /* constants */ + /* K0 */ be_nested_str_weak(string), + /* K1 */ be_nested_str_weak(Shutter), + /* K2 */ be_nested_str_weak(tasmota_shutter_index), + /* K3 */ be_const_int(1), + /* K4 */ be_nested_str_weak(contains), + /* K5 */ be_nested_str_weak(find), + /* K6 */ be_nested_str_weak(Tilt), + /* K7 */ be_nested_str_weak(shadow_shutter_tilt), + /* K8 */ be_nested_str_weak(attribute_updated), + /* K9 */ be_nested_str_weak(parse_sensors), + }), + be_str_weak(parse_sensors), + &be_const_str_solidified, + ( &(const binstruction[32]) { /* code */ + 0xA40A0000, // 0000 IMPORT R2 K0 + 0x600C0008, // 0001 GETGBL R3 G8 + 0x88100102, // 0002 GETMBR R4 R0 K2 + 0x00100903, // 0003 ADD R4 R4 K3 + 0x7C0C0200, // 0004 CALL R3 1 + 0x000E0203, // 0005 ADD R3 K1 R3 + 0x8C100304, // 0006 GETMET R4 R1 K4 + 0x5C180600, // 0007 MOVE R6 R3 + 0x7C100400, // 0008 CALL R4 2 + 0x7812000E, // 0009 JMPF R4 #0019 + 0x94100203, // 000A GETIDX R4 R1 R3 + 0x8C140905, // 000B GETMET R5 R4 K5 + 0x581C0006, // 000C LDCONST R7 K6 + 0x7C140400, // 000D CALL R5 2 + 0x4C180000, // 000E LDNIL R6 + 0x20180A06, // 000F NE R6 R5 R6 + 0x781A0007, // 0010 JMPF R6 #0019 + 0x88180107, // 0011 GETMBR R6 R0 K7 + 0x20180A06, // 0012 NE R6 R5 R6 + 0x781A0003, // 0013 JMPF R6 #0018 + 0x8C180108, // 0014 GETMET R6 R0 K8 + 0x54220101, // 0015 LDINT R8 258 + 0x5426000E, // 0016 LDINT R9 15 + 0x7C180600, // 0017 CALL R6 3 + 0x90020E05, // 0018 SETMBR R0 K7 R5 + 0x60100003, // 0019 GETGBL R4 G3 + 0x5C140000, // 001A MOVE R5 R0 + 0x7C100200, // 001B CALL R4 1 + 0x8C100909, // 001C GETMET R4 R4 K9 + 0x5C180200, // 001D MOVE R6 R1 + 0x7C100400, // 001E CALL R4 2 + 0x80000000, // 001F RET 0 }) ) ); @@ -185,15 +419,15 @@ be_local_closure(Matter_Plugin_ShutterTilt_read_attribute, /* name */ ********************************************************************/ extern const bclass be_class_Matter_Plugin_Shutter; be_local_class(Matter_Plugin_ShutterTilt, - 0, + 2, &be_class_Matter_Plugin_Shutter, - be_nested_map(5, + be_nested_map(9, ( (struct bmapnode*) &(const bmapnode[]) { - { be_const_key_weak(TYPE, 1), be_nested_str_weak(shutter_X2Btilt) }, + { be_const_key_weak(TYPE, -1), be_nested_str_weak(shutter_X2Btilt) }, + { be_const_key_weak(update_tilt_min_max, 0), be_const_closure(Matter_Plugin_ShutterTilt_update_tilt_min_max_closure) }, + { be_const_key_weak(parse_sensors, 7), be_const_closure(Matter_Plugin_ShutterTilt_parse_sensors_closure) }, { be_const_key_weak(NAME, -1), be_nested_str_weak(Shutter_X20_X2B_X20Tilt) }, - { be_const_key_weak(invoke_request, 3), be_const_closure(Matter_Plugin_ShutterTilt_invoke_request_closure) }, - { be_const_key_weak(read_attribute, -1), be_const_closure(Matter_Plugin_ShutterTilt_read_attribute_closure) }, - { be_const_key_weak(CLUSTERS, 0), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { + { be_const_key_weak(CLUSTERS, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { be_const_map( * be_nested_map(1, ( (struct bmapnode*) &(const bmapnode[]) { { be_const_key_int(258, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_list, { @@ -205,6 +439,10 @@ be_local_class(Matter_Plugin_ShutterTilt, be_const_int(65532), })) ) } )) }, })) ) } )) }, + { be_const_key_weak(invoke_request, -1), be_const_closure(Matter_Plugin_ShutterTilt_invoke_request_closure) }, + { be_const_key_weak(tilt_min, 2), be_const_var(0) }, + { be_const_key_weak(read_attribute, -1), be_const_closure(Matter_Plugin_ShutterTilt_read_attribute_closure) }, + { be_const_key_weak(tilt_max, -1), be_const_var(1) }, })), be_str_weak(Matter_Plugin_ShutterTilt) ); From fe1bc615f00d12c6f98dffe77691640586d27324 Mon Sep 17 00:00:00 2001 From: s-hadinger <49731213+s-hadinger@users.noreply.github.com> Date: Wed, 3 May 2023 21:18:26 +0200 Subject: [PATCH 059/289] ESP32 LVGL library from v8.3.6 to v8.3.7 (no functional change) (#18573) * ESP32 LVGL library from v8.3.7 to v8.3.7 (no functional change) * Fix version --- CHANGELOG.md | 1 + lib/libesp32_lvgl/lvgl/library.json | 2 +- lib/libesp32_lvgl/lvgl/library.properties | 2 +- lib/libesp32_lvgl/lvgl/lv_conf_template.h | 2 +- lib/libesp32_lvgl/lvgl/lvgl.h | 2 +- .../lvgl/src/core/lv_indev_scroll.c | 5 ++- .../lvgl/src/core/lv_obj_style.c | 1 + .../lvgl/src/draw/arm2d/lv_gpu_arm2d.c | 45 +++++++++++++++++-- .../lvgl/src/extra/widgets/menu/lv_menu.c | 5 +++ .../src/extra/widgets/spinbox/lv_spinbox.c | 3 -- lib/libesp32_lvgl/lvgl/src/misc/lv_color.h | 9 +++- .../lvgl/src/widgets/lv_btnmatrix.h | 25 ++++++----- 12 files changed, 77 insertions(+), 25 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ee3c3bebb..61d7359d2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -18,6 +18,7 @@ All notable changes to this project will be documented in this file. ### Changed - ESP32 Framework (Core) from v2.0.7 to v2.0.8 - Refactored Zero Cross Dimmer (#18481) +- ESP32 LVGL library from v8.3.6 to v8.3.7 (no functional change) ### Fixed - ESP8266 Energy Export Active no update regression from v12.3.1.3 diff --git a/lib/libesp32_lvgl/lvgl/library.json b/lib/libesp32_lvgl/lvgl/library.json index 928d7beed..2efd28a17 100644 --- a/lib/libesp32_lvgl/lvgl/library.json +++ b/lib/libesp32_lvgl/lvgl/library.json @@ -1,6 +1,6 @@ { "name": "lvgl", - "version": "8.3.6", + "version": "8.3.7", "keywords": "graphics, gui, embedded, tft, lvgl", "description": "Graphics library to create embedded GUI with easy-to-use graphical elements, beautiful visual effects and low memory footprint. It offers anti-aliasing, opacity, and animations using only one frame buffer.", "repository": { diff --git a/lib/libesp32_lvgl/lvgl/library.properties b/lib/libesp32_lvgl/lvgl/library.properties index 19de5008b..c8f7ae9c1 100644 --- a/lib/libesp32_lvgl/lvgl/library.properties +++ b/lib/libesp32_lvgl/lvgl/library.properties @@ -1,5 +1,5 @@ name=lvgl -version=8.3.6 +version=8.3.7 author=kisvegabor maintainer=kisvegabor,embeddedt,pete-pjb sentence=Full-featured Graphics Library for Embedded Systems diff --git a/lib/libesp32_lvgl/lvgl/lv_conf_template.h b/lib/libesp32_lvgl/lvgl/lv_conf_template.h index f36af2a28..86ca20764 100644 --- a/lib/libesp32_lvgl/lvgl/lv_conf_template.h +++ b/lib/libesp32_lvgl/lvgl/lv_conf_template.h @@ -1,6 +1,6 @@ /** * @file lv_conf.h - * Configuration file for v8.3.6 + * Configuration file for v8.3.7 */ /* diff --git a/lib/libesp32_lvgl/lvgl/lvgl.h b/lib/libesp32_lvgl/lvgl/lvgl.h index 6eedc7f23..985c796c9 100644 --- a/lib/libesp32_lvgl/lvgl/lvgl.h +++ b/lib/libesp32_lvgl/lvgl/lvgl.h @@ -15,7 +15,7 @@ extern "C" { ***************************/ #define LVGL_VERSION_MAJOR 8 #define LVGL_VERSION_MINOR 3 -#define LVGL_VERSION_PATCH 6 +#define LVGL_VERSION_PATCH 7 #define LVGL_VERSION_INFO "" /********************* diff --git a/lib/libesp32_lvgl/lvgl/src/core/lv_indev_scroll.c b/lib/libesp32_lvgl/lvgl/src/core/lv_indev_scroll.c index 3a7318316..8a36ab30a 100644 --- a/lib/libesp32_lvgl/lvgl/src/core/lv_indev_scroll.c +++ b/lib/libesp32_lvgl/lvgl/src/core/lv_indev_scroll.c @@ -281,12 +281,13 @@ static lv_obj_t * find_scroll_obj(_lv_indev_proc_t * proc) while(obj_act) { /*Get the transformed scroll_sum with this object*/ int16_t angle = 0; - int16_t zoom = 256; + int32_t zoom = 256; lv_point_t pivot = { 0, 0 }; lv_obj_t * parent = obj_act; while(parent) { angle += lv_obj_get_style_transform_angle(parent, 0); - zoom *= (lv_obj_get_style_transform_zoom(parent, 0) / 256); + int32_t zoom_act = lv_obj_get_style_transform_zoom(parent, 0); + zoom = (zoom * zoom_act) >> 8; parent = lv_obj_get_parent(parent); } diff --git a/lib/libesp32_lvgl/lvgl/src/core/lv_obj_style.c b/lib/libesp32_lvgl/lvgl/src/core/lv_obj_style.c index c6cdf825c..c71c9f951 100644 --- a/lib/libesp32_lvgl/lvgl/src/core/lv_obj_style.c +++ b/lib/libesp32_lvgl/lvgl/src/core/lv_obj_style.c @@ -749,6 +749,7 @@ static void trans_anim_cb(void * _tr, int32_t v) else value_final.ptr = tr->end_value.ptr; break; case LV_STYLE_BG_COLOR: + case LV_STYLE_BG_GRAD_COLOR: case LV_STYLE_BORDER_COLOR: case LV_STYLE_TEXT_COLOR: case LV_STYLE_SHADOW_COLOR: diff --git a/lib/libesp32_lvgl/lvgl/src/draw/arm2d/lv_gpu_arm2d.c b/lib/libesp32_lvgl/lvgl/src/draw/arm2d/lv_gpu_arm2d.c index f294125be..83f3e6605 100644 --- a/lib/libesp32_lvgl/lvgl/src/draw/arm2d/lv_gpu_arm2d.c +++ b/lib/libesp32_lvgl/lvgl/src/draw/arm2d/lv_gpu_arm2d.c @@ -3,6 +3,24 @@ * */ +/* + * Copyright (C) 2010-2023 Arm Limited or its affiliates. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * 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 + * + * 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. + */ + /********************* * INCLUDES *********************/ @@ -94,6 +112,8 @@ arm_2dp_rgb565_tile_transform_with_src_mask_and_opacity_prepare #define arm_2d_tile_transform_with_opacity_prepare \ arm_2dp_rgb565_tile_transform_with_opacity_prepare +#define arm_2d_tile_transform_only_with_opacity_prepare \ + arm_2dp_rgb565_tile_transform_only_with_opacity_prepare #define arm_2d_tile_transform_prepare \ arm_2dp_rgb565_tile_transform_prepare @@ -131,6 +151,8 @@ arm_2dp_cccn888_tile_transform_with_src_mask_and_opacity_prepare #define arm_2d_tile_transform_with_opacity_prepare \ arm_2dp_cccn888_tile_transform_with_opacity_prepare +#define arm_2d_tile_transform_only_with_opacity_prepare \ + arm_2dp_cccn888_tile_transform_only_with_opacity_prepare #define arm_2d_tile_transform_prepare \ arm_2dp_cccn888_tile_transform_prepare @@ -345,7 +367,7 @@ #define __RECOLOUR_END() \ } while(0); \ if (NULL != rgb_tmp_buf) { \ - lv_free(rgb_tmp_buf); \ + lv_mem_buf_release(rgb_tmp_buf); \ } \ } while(0); \ src_buf = src_buf_org; @@ -1270,8 +1292,7 @@ static void lv_draw_arm2d_img_decoded(struct _lv_draw_ctx_t * draw_ctx, source_center.iX = draw_dsc->pivot.x; source_center.iY = draw_dsc->pivot.y; - if((LV_IMG_CF_TRUE_COLOR_CHROMA_KEYED == cf) || - (LV_IMG_CF_TRUE_COLOR == cf)) { + if(LV_IMG_CF_TRUE_COLOR_CHROMA_KEYED == cf) { __ARM_2D_PREPARE_TRANS_AND_TARGET_REGION( arm_2d_tile_transform_with_opacity_prepare, @@ -1289,6 +1310,24 @@ static void lv_draw_arm2d_img_decoded(struct _lv_draw_ctx_t * draw_ctx, ); is_accelerated = true; } + #if ARM_2D_VERISON >= 10103 + else if (LV_IMG_CF_TRUE_COLOR == cf) { + __ARM_2D_PREPARE_TRANS_AND_TARGET_REGION( + arm_2d_tile_transform_only_with_opacity_prepare, + &source_tile, + source_center, + ARM_2D_ANGLE((draw_dsc->angle / 10.0f)), + draw_dsc->zoom / 256.0f, + blend_dsc.opa); + + arm_2d_tile_transform( + &target_tile, + &target_region, + NULL + ); + is_accelerated = true; + } + #endif else if (LV_IMG_CF_RGB565A8 == cf) { static arm_2d_tile_t mask_tile; mask_tile = source_tile; diff --git a/lib/libesp32_lvgl/lvgl/src/extra/widgets/menu/lv_menu.c b/lib/libesp32_lvgl/lvgl/src/extra/widgets/menu/lv_menu.c index 78577e770..f8dfd41cb 100644 --- a/lib/libesp32_lvgl/lvgl/src/extra/widgets/menu/lv_menu.c +++ b/lib/libesp32_lvgl/lvgl/src/extra/widgets/menu/lv_menu.c @@ -195,6 +195,11 @@ void lv_menu_set_page(lv_obj_t * obj, lv_obj_t * page) lv_menu_t * menu = (lv_menu_t *)obj; + /* Guard against setting the same page again */ + if(menu->main_page == page) { + return; + } + /* Hide previous page */ if(menu->main_page != NULL) { lv_obj_set_parent(menu->main_page, menu->storage); diff --git a/lib/libesp32_lvgl/lvgl/src/extra/widgets/spinbox/lv_spinbox.c b/lib/libesp32_lvgl/lvgl/src/extra/widgets/spinbox/lv_spinbox.c index 34691053e..37db45c37 100644 --- a/lib/libesp32_lvgl/lvgl/src/extra/widgets/spinbox/lv_spinbox.c +++ b/lib/libesp32_lvgl/lvgl/src/extra/widgets/spinbox/lv_spinbox.c @@ -434,9 +434,6 @@ static void lv_spinbox_event(const lv_obj_class_t * class_p, lv_event_t * e) else if(c == LV_KEY_DOWN) { lv_spinbox_decrement(obj); } - else { - lv_textarea_add_char(obj, c); - } } } diff --git a/lib/libesp32_lvgl/lvgl/src/misc/lv_color.h b/lib/libesp32_lvgl/lvgl/src/misc/lv_color.h index 2cc92f277..5ff7b1a86 100644 --- a/lib/libesp32_lvgl/lvgl/src/misc/lv_color.h +++ b/lib/libesp32_lvgl/lvgl/src/misc/lv_color.h @@ -440,7 +440,11 @@ LV_ATTRIBUTE_FAST_MEM static inline lv_color_t lv_color_mix(lv_color_t c1, lv_co { lv_color_t ret; -#if LV_COLOR_DEPTH == 16 && LV_COLOR_16_SWAP == 0 && LV_COLOR_MIX_ROUND_OFS == 0 +#if LV_COLOR_DEPTH == 16 && LV_COLOR_MIX_ROUND_OFS == 0 +#if LV_COLOR_16_SWAP == 1 + c1.full = c1.full << 8 | c1.full >> 8; + c2.full = c2.full << 8 | c2.full >> 8; +#endif /*Source: https://stackoverflow.com/a/50012418/1999969*/ mix = (uint32_t)((uint32_t)mix + 4) >> 3; uint32_t bg = (uint32_t)((uint32_t)c2.full | ((uint32_t)c2.full << 16)) & @@ -448,6 +452,9 @@ LV_ATTRIBUTE_FAST_MEM static inline lv_color_t lv_color_mix(lv_color_t c1, lv_co uint32_t fg = (uint32_t)((uint32_t)c1.full | ((uint32_t)c1.full << 16)) & 0x7E0F81F; uint32_t result = ((((fg - bg) * mix) >> 5) + bg) & 0x7E0F81F; ret.full = (uint16_t)((result >> 16) | result); +#if LV_COLOR_16_SWAP == 1 + ret.full = ret.full << 8 | ret.full >> 8; +#endif #elif LV_COLOR_DEPTH != 1 /*LV_COLOR_DEPTH == 8, 16 or 32*/ LV_COLOR_SET_R(ret, LV_UDIV255((uint16_t)LV_COLOR_GET_R(c1) * mix + LV_COLOR_GET_R(c2) * diff --git a/lib/libesp32_lvgl/lvgl/src/widgets/lv_btnmatrix.h b/lib/libesp32_lvgl/lvgl/src/widgets/lv_btnmatrix.h index 780d57b68..2edf202cc 100644 --- a/lib/libesp32_lvgl/lvgl/src/widgets/lv_btnmatrix.h +++ b/lib/libesp32_lvgl/lvgl/src/widgets/lv_btnmatrix.h @@ -32,18 +32,19 @@ LV_EXPORT_CONST_INT(LV_BTNMATRIX_BTN_NONE); /** Type to store button control bits (disabled, hidden etc.) * The first 3 bits are used to store the width*/ enum { - _LV_BTNMATRIX_WIDTH = 0x0007, /**< Reserved to stire the size units*/ - LV_BTNMATRIX_CTRL_HIDDEN = 0x0008, /**< Button hidden*/ - LV_BTNMATRIX_CTRL_NO_REPEAT = 0x0010, /**< Do not repeat press this button.*/ - LV_BTNMATRIX_CTRL_DISABLED = 0x0020, /**< Disable this button.*/ - LV_BTNMATRIX_CTRL_CHECKABLE = 0x0040, /**< The button can be toggled.*/ - LV_BTNMATRIX_CTRL_CHECKED = 0x0080, /**< Button is currently toggled (e.g. checked).*/ - LV_BTNMATRIX_CTRL_CLICK_TRIG = 0x0100, /**< 1: Send LV_EVENT_VALUE_CHANGE on CLICK, 0: Send LV_EVENT_VALUE_CHANGE on PRESS*/ - LV_BTNMATRIX_CTRL_POPOVER = 0x0200, /**< Show a popover when pressing this key*/ - LV_BTNMATRIX_CTRL_RECOLOR = 0x1000, /**< Enable text recoloring with `#color`*/ - _LV_BTNMATRIX_CTRL_RESERVED = 0x2000, /**< Reserved for later use*/ - LV_BTNMATRIX_CTRL_CUSTOM_1 = 0x4000, /**< Custom free to use flag*/ - LV_BTNMATRIX_CTRL_CUSTOM_2 = 0x8000, /**< Custom free to use flag*/ + _LV_BTNMATRIX_WIDTH = 0x000F, /**< Reserved to store the size units*/ + LV_BTNMATRIX_CTRL_HIDDEN = 0x0010, /**< Button hidden*/ + LV_BTNMATRIX_CTRL_NO_REPEAT = 0x0020, /**< Do not repeat press this button.*/ + LV_BTNMATRIX_CTRL_DISABLED = 0x0040, /**< Disable this button.*/ + LV_BTNMATRIX_CTRL_CHECKABLE = 0x0080, /**< The button can be toggled.*/ + LV_BTNMATRIX_CTRL_CHECKED = 0x0100, /**< Button is currently toggled (e.g. checked).*/ + LV_BTNMATRIX_CTRL_CLICK_TRIG = 0x0200, /**< 1: Send LV_EVENT_VALUE_CHANGE on CLICK, 0: Send LV_EVENT_VALUE_CHANGE on PRESS*/ + LV_BTNMATRIX_CTRL_POPOVER = 0x0400, /**< Show a popover when pressing this key*/ + LV_BTNMATRIX_CTRL_RECOLOR = 0x0800, /**< Enable text recoloring with `#color`*/ + _LV_BTNMATRIX_CTRL_RESERVED_1 = 0x1000, /**< Reserved for later use*/ + _LV_BTNMATRIX_CTRL_RESERVED_2 = 0x2000, /**< Reserved for later use*/ + LV_BTNMATRIX_CTRL_CUSTOM_1 = 0x4000, /**< Custom free to use flag*/ + LV_BTNMATRIX_CTRL_CUSTOM_2 = 0x8000, /**< Custom free to use flag*/ }; typedef uint16_t lv_btnmatrix_ctrl_t; From 9097f508fd49bf1404db28999d78c15c4d6b67ac Mon Sep 17 00:00:00 2001 From: stefanbode Date: Wed, 3 May 2023 21:44:09 +0200 Subject: [PATCH 060/289] BugFix Garage + new shutterbuttons options (#18572) * Fix GarageMode movements * BugFix Garage + new shutterbuttons options - Removed logging - shutterbuttons support incremental change - garage mode, fix #18539 and fix #18442 --- .../xdrv_27_esp32_shutter.ino | 208 +++++++++++++----- .../tasmota_xdrv_driver/xdrv_27_shutter.ino | 3 + 2 files changed, 158 insertions(+), 53 deletions(-) diff --git a/tasmota/tasmota_xdrv_driver/xdrv_27_esp32_shutter.ino b/tasmota/tasmota_xdrv_driver/xdrv_27_esp32_shutter.ino index bb7aec959..83b623cf5 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_27_esp32_shutter.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_27_esp32_shutter.ino @@ -51,14 +51,29 @@ #define MAX_SHUTTERS_ESP32 16 // -const uint32_t SHUTTER_VERSION = 0x01010000; // Latest driver version (See settings deltas below) +const uint32_t SHUTTER_VERSION = 0x01010100; // Latest driver version (See settings deltas below) + +typedef struct { // depreciated 2023-04-28 + int8_t pos; + int8_t tilt; + bool mqtt_broadcast; +} tPosition_old; typedef struct { int8_t pos; int8_t tilt; bool mqtt_broadcast; + int8_t pos_incrdecr; + int8_t tilt_incrdecr; } tPosition; +typedef struct { // depreciated 2023-04-28 + bool enabled; + bool mqtt_all; + uint8_t shutter_number; + tPosition_old position[4]; +} tButtonSettings_old; + typedef struct { bool enabled; bool mqtt_all; @@ -85,6 +100,7 @@ struct SHUTTERSETTINGS { uint8_t shutter_startrelay[MAX_SHUTTERS_ESP32]; uint8_t shutter_motordelay[MAX_SHUTTERS_ESP32]; uint16_t shutter_pwmrange[2][MAX_SHUTTERS_ESP32]; + tButtonSettings_old shutter_button_old[MAX_SHUTTERS_ESP32*2]; // depreciated 2023-04-28 tButtonSettings shutter_button[MAX_SHUTTERS_ESP32*2]; } ShutterSettings; @@ -233,11 +249,29 @@ void ShutterSettingsDefault(void) { void ShutterSettingsDelta(void) { // Fix possible setting deltas if (ShutterSettings.version != SHUTTER_VERSION) { // Fix version dependent changes -/* + if (ShutterSettings.version < 0x01010100) { AddLog(LOG_LEVEL_INFO, PSTR("SHT: Update oldest version restore")); + + for (uint8_t i=0; i < MAX_SHUTTERS_ESP32; i++){ + if (ShutterSettings.shutter_startrelay[i] == 0) continue; + AddLog(LOG_LEVEL_INFO, PSTR("SHT: %s SHT%d:%d"),D_CMND_SHUTTER_RELAY,i+1,ShutterSettings.shutter_startrelay[i]); + AddLog(LOG_LEVEL_INFO, PSTR("SHT: %s: %d"),D_CMND_SHUTTER_OPENTIME,ShutterSettings.shutter_opentime[i]); + AddLog(LOG_LEVEL_INFO, PSTR("SHT: %s: %d"),D_CMND_SHUTTER_CLOSETIME,ShutterSettings.shutter_closetime[i]); + } + for (uint8_t i=0; i < MAX_SHUTTERS_ESP32*2; i++){ + ShutterSettings.shutter_button[i].enabled = ShutterSettings.shutter_button_old[i].enabled; + ShutterSettings.shutter_button[i].mqtt_all = ShutterSettings.shutter_button_old[i].mqtt_all; + ShutterSettings.shutter_button[i].shutter_number = ShutterSettings.shutter_button_old[i].shutter_number; + for (uint8_t j = 0; j < 4; j++){ + ShutterSettings.shutter_button[i].position[j].pos = ShutterSettings.shutter_button_old[i].position[j].pos; + ShutterSettings.shutter_button[i].position[j].tilt = ShutterSettings.shutter_button_old[i].position[j].tilt; + ShutterSettings.shutter_button[i].position[j].mqtt_broadcast = ShutterSettings.shutter_button_old[i].position[j].mqtt_broadcast; + } + } } +/* if (ShutterSettings.version < 0x01010101) { AddLog(LOG_LEVEL_INFO, PSTR("SHT: Update old version restore")); @@ -425,6 +459,8 @@ void ShutterRtc50mS(void) int32_t ShutterPercentToRealPosition(int16_t percent, uint32_t index) { + // if inverted recalculate the percentposition + percent = (ShutterSettings.shutter_options[index] & 1) ? 100 - percent : percent; if (ShutterSettings.shutter_set50percent[index] != 50) { return (percent <= 5) ? ShutterSettings.shuttercoeff[2][index] * percent*10 : (ShutterSettings.shuttercoeff[1][index] * percent + (ShutterSettings.shuttercoeff[0][index]*10))*10; } else { @@ -485,7 +521,9 @@ uint8_t ShutterRealToPercentPosition(int32_t realpos, uint32_t index) break; } } - return realpercent < 0 ? 0 : realpercent; + realpercent = realpercent < 0 ? 0 : realpercent; + // if inverted recalculate the percentposition + return (ShutterSettings.shutter_options[index] & 1) ? 100 - realpercent : realpercent; } } @@ -663,9 +701,7 @@ void ShutterReportPosition(bool always, uint32_t index) shutter_running++; } if (i && index == MAX_SHUTTERS_ESP32) { ResponseAppend_P(PSTR(",")); } - uint32_t position = ShutterRealToPercentPosition(Shutter[i].real_position, i); - uint32_t target = ShutterRealToPercentPosition(Shutter[i].target_position, i); - ResponseAppend_P(JSON_SHUTTER_POS, i+1, (ShutterSettings.shutter_options[i] & 1) ? 100-position : position, Shutter[i].direction,(ShutterSettings.shutter_options[i] & 1) ? 100-target : target, Shutter[i].tilt_real_pos ); + ResponseAppend_P(JSON_SHUTTER_POS, i+1, ShutterRealToPercentPosition(Shutter[i].real_position, i), Shutter[i].direction, ShutterRealToPercentPosition(Shutter[i].target_position, i), Shutter[i].tilt_real_pos ); } ResponseJsonEnd(); if (always || shutter_running) { @@ -769,7 +805,7 @@ void ShutterDecellerateForStop(uint8_t i) void ShutterPowerOff(uint8_t i) { - AddLog(LOG_LEVEL_DEBUG, PSTR("SHT: Stop %d Mode %d time %d"), i+1,Shutter[i].switch_mode, Shutter[i].time); // fix log to indicate correct shutter number + AddLog(LOG_LEVEL_DEBUG, PSTR("SHT: Stop %d Mode %d time %d, last source %d"), i+1,Shutter[i].switch_mode, Shutter[i].time, TasmotaGlobal.last_source); // fix log to indicate correct shutter number ShutterDecellerateForStop(i); uint8_t cur_relay = ShutterSettings.shutter_startrelay[i] + (Shutter[i].direction == 1 ? 0 : (uint8_t)(ShutterGlobal.position_mode == SHT_TIME)) ; if (Shutter[i].direction !=0) { @@ -790,14 +826,18 @@ void ShutterPowerOff(uint8_t i) break; case SHT_PULSE: // we have a momentary switch here. Needs additional pulse on same relay after the end - if ((SRC_PULSETIMER == TasmotaGlobal.last_source || SRC_SHUTTER == TasmotaGlobal.last_source || SRC_WEBGUI == TasmotaGlobal.last_source)) { - ExecuteCommandPowerShutter(cur_relay, 1, SRC_SHUTTER); - // switch off direction relay to make it power less - if (((1 << (ShutterSettings.shutter_startrelay[i])) & TasmotaGlobal.power) && ShutterSettings.shutter_startrelay[i]+1 != cur_relay) { - ExecuteCommandPowerShutter(ShutterSettings.shutter_startrelay[i]+1, 0, SRC_SHUTTER); - } - } else { - TasmotaGlobal.last_source = SRC_SHUTTER; + switch (TasmotaGlobal.last_source) { + case SRC_PULSETIMER: + case SRC_SHUTTER: + case SRC_WEBGUI: + ExecuteCommandPowerShutter(cur_relay, 1, SRC_SHUTTER); + // switch off direction relay to make it power less + if (((1 << (ShutterSettings.shutter_startrelay[i])) & TasmotaGlobal.power) && ShutterSettings.shutter_startrelay[i]+1 != cur_relay) { + ExecuteCommandPowerShutter(ShutterSettings.shutter_startrelay[i]+1, 0, SRC_SHUTTER); + } + break; + default: + TasmotaGlobal.last_source = SRC_SHUTTER; } break; } @@ -913,7 +953,7 @@ void ShutterUpdatePosition(void) // sending MQTT result to broker snprintf_P(scommand, sizeof(scommand),PSTR(D_SHUTTER "%d"), i+1); GetTopic_P(stopic, STAT, TasmotaGlobal.mqtt_topic, scommand); - Response_P("%d", (ShutterSettings.shutter_options[i] & 1) ? 100 - ShutterSettings.shutter_position[i]: ShutterSettings.shutter_position[i]); + Response_P("%d", ShutterSettings.shutter_position[i]); MqttPublish(stopic, Settings->flag.mqtt_power_retain); // CMND_POWERRETAIN } @@ -1160,7 +1200,11 @@ bool ShutterButtonHandlerMulti(void) char databuf[1] = ""; XdrvMailbox.data = databuf; XdrvMailbox.command = NULL; - uint8_t position = ShutterSettings.shutter_button[button_index].position[pos_press_index].pos; + int8_t position = ShutterSettings.shutter_button[button_index].position[pos_press_index].pos; + if (position == -1) { + position = tmin(100,tmax(0,ShutterRealToPercentPosition(Shutter[XdrvMailbox.index-1].real_position, XdrvMailbox.index-1) + + ShutterSettings.shutter_button[button_index].position[pos_press_index].pos_incrdecr)); + } XdrvMailbox.payload = position; AddLog(LOG_LEVEL_DEBUG_MORE, PSTR("SHT: Shtr%d -> %d"), shutter_index+1, position); if (102 == position) { @@ -1173,9 +1217,21 @@ bool ShutterButtonHandlerMulti(void) } // set the tilt AddLog(LOG_LEVEL_DEBUG_MORE, PSTR("SHT: Target tilt %d for button %d"), ShutterSettings.shutter_button[button_index].position[pos_press_index].tilt, button_index+1); - if (ShutterSettings.shutter_button[button_index].position[pos_press_index].tilt != -128) { - Shutter[shutter_index].tilt_target_pos_override = ShutterSettings.shutter_button[button_index].position[pos_press_index].tilt; + switch (ShutterSettings.shutter_button[button_index].position[pos_press_index].tilt) { + // No change in tilt defined + case -128: + break; + // tilt change defined on position or (127) incr/decr + case 127: + Shutter[shutter_index].tilt_target_pos_override = Shutter[shutter_index].tilt_real_pos + ShutterSettings.shutter_button[button_index].position[pos_press_index].tilt_incrdecr; + break; + default: + Shutter[shutter_index].tilt_target_pos_override = ShutterSettings.shutter_button[button_index].position[pos_press_index].tilt; } + + // set the tilt + AddLog(LOG_LEVEL_DEBUG_MORE, PSTR("SHT: Target tilt %d for button %d"), Shutter[shutter_index].tilt_target_pos_override, button_index+1); + // reset button to default Button.press_counter[button_index] = 0; @@ -1202,9 +1258,6 @@ bool ShutterButtonHandlerMulti(void) ResponseJsonEnd(); MqttPublishPrefixTopicRulesProcess_P(RESULT_OR_STAT, PSTR(D_PRFX_SHUTTER)); - - - return true; } @@ -1238,7 +1291,6 @@ bool ShutterButtonHandler(void) return true; } - //long press detected. Start moving shutter into direction if (PRESSED == button && Shutter[shutter_index].direction == 0 //shutter in STOP Position @@ -1376,6 +1428,7 @@ void CmndShutterStop(void) AddLog(LOG_LEVEL_DEBUG, PSTR("SHT: Stop %d: dir: %d"), XdrvMailbox.index, Shutter[i].direction); Shutter[i].target_position = Shutter[i].real_position; + TasmotaGlobal.last_source = SRC_SHUTTER; } if (XdrvMailbox.command) ResponseCmndDone(); @@ -1471,9 +1524,8 @@ void CmndShutterPosition(void) int8_t target_pos_percent = (XdrvMailbox.payload < 0) ? (XdrvMailbox.payload == -99 ? ShutterRealToPercentPosition(Shutter[index].real_position, index) : 0) : ((XdrvMailbox.payload > 100) ? 100 : XdrvMailbox.payload); // webgui still send also on inverted shutter the native position. - target_pos_percent = ((ShutterSettings.shutter_options[index] & 1) && (SRC_WEBGUI != TasmotaGlobal.last_source)) ? 100 - target_pos_percent : target_pos_percent; + target_pos_percent = ((ShutterSettings.shutter_options[index] & 1) && (SRC_WEBGUI == TasmotaGlobal.last_source)) ? 100 - target_pos_percent : target_pos_percent; if (XdrvMailbox.payload != -99) { - //target_pos_percent = (ShutterSettings.shutter_options[index] & 1) ? 100 - target_pos_percent : target_pos_percent; Shutter[index].target_position = ShutterPercentToRealPosition(target_pos_percent, index); //Shutter[i].accelerator[index] = ShutterGlobal.open_velocity_max / ((Shutter[i].motordelay[index] > 0) ? Shutter[i].motordelay[index] : 1); //Shutter[i].target_position[index] = XdrvMailbox.payload < 5 ? ShutterSettings.shuttercoeff[2][index] * XdrvMailbox.payload : ShutterSettings.shuttercoeff[1][index] * XdrvMailbox.payload + ShutterSettings.shuttercoeff[0,index]; @@ -1526,6 +1578,7 @@ void CmndShutterPosition(void) } break; case SHT_TIME_GARAGE: + //AddLog(LOG_LEVEL_INFO, PSTR("SHT: Garage Skip Relay: %d"), ShutterGlobal.skip_relay_change); if (!ShutterGlobal.skip_relay_change) { if (new_shutterdirection == Shutter[index].lastdirection) { AddLog(LOG_LEVEL_INFO, PSTR("SHT: Garage not move in this direction: %d"), Shutter[index].switch_mode == SHT_PULSE); @@ -1673,7 +1726,7 @@ void CmndShutterButton(void) // (setting>> 2)&(0x3f) : shutter_position single press 0 disabled, 1..101 == 0..100%, 102 == toggle // (setting>> 0)&(0x03) : shutter_index if (XdrvMailbox.data_len > 0) { - uint32_t i = 0; + uint32_t i = 0; // tokencount on " " uint32_t button_index = 0; bool done = false; bool isShortCommand = false; @@ -1686,44 +1739,62 @@ void CmndShutterButton(void) for (char *str = strtok_r(data_copy, " ", &str_ptr); str && i < (1+4+4+1); str = strtok_r(nullptr, " ", &str_ptr), i++) { int field = -1; int tilt = -128; - int j = 0; + int pos_incrdecr = 0; + int tilt_incrdecr = 0; + int j = 0; // tokencount on "/" char field_copy[strlen(str) +1]; strncpy(field_copy, str, sizeof(field_copy)); // Duplicate data as strtok_r will modify it. - // Loop through the data string, splitting on '/' seperators. + // Loop through the data string, splitting on '/' seperators. Syntax position[0..100]/tilt[-90..90] for (char *str2 = strtok_r(field_copy, "/", &str_ptr2); str2 && j < 2; str2 = strtok_r(nullptr, "/", &str_ptr2), j++) { switch (j) { case 0: switch (str2[0]) { - case '-': - field = -1; - break; - case 't': + case 't': // toggle the tilt. currently not implemented field = 102; break; + case '-': + case '+': + field = -1; + // check for trigger -- or ++ for incremental change + if (str2[1] == '-' || str2[1] == '+') { + str2[0] = ' '; + pos_incrdecr = atoi(str2); + } + break; default: field = atoi(str2); break; } + if (i>0) + AddLog(LOG_LEVEL_DEBUG, PSTR("SHT: FINAL: pos:%d, inc:%d, string:%s"),field,pos_incrdecr,str2); break; case 1: switch (str2[0]) { - case '-': // special handling to seperate a - from a negative number. e.g. -90 - if (strlen(str2)==1) { - tilt = -128; - } else { - tilt = atoi(str2); - } - break; case 't': tilt = 127; break; + case '-': // special handling to seperate a - from a negative number. e.g. -90 + case '+': + if (strlen(str2)==1 && str2[0] == '-') { + tilt = -128; + } else { + if (str2[1] == '-' || str2[1] == '+') { + str2[0] = ' '; + tilt = 127; + tilt_incrdecr = atoi(str2); + } else { + tilt = atoi(str2); + } + } + break; default: tilt = atoi(str2); break; } + AddLog(LOG_LEVEL_DEBUG, PSTR("SHT: FINAL: tilt:%d, inc:%d, string:%s"),tilt,tilt_incrdecr,str2); break; } - } + } // end scanning "++10/-90" tokens switch (i) { case 0: if ((field >= -1) && (field<=MAX_SHUTTERS_ESP32*2)) { @@ -1771,10 +1842,17 @@ void CmndShutterButton(void) */ case 3: case 4: + AddLog(LOG_LEVEL_DEBUG, PSTR("SHT: CASE4: pos:%d, tilt:%d, incpos:%d, inctilt:%d"), + field,tilt,pos_incrdecr,tilt_incrdecr); + if ((field >= -1) && (field<=102)) setting.position[i-1].pos = field; if ((tilt >= -128) && (tilt<=127)) - setting.position[i-1].tilt = tilt; + setting.position[i-1].tilt = tilt; + if ((pos_incrdecr >= -100) && (pos_incrdecr <= 100)) + setting.position[i-1].pos_incrdecr = pos_incrdecr; + if ((tilt_incrdecr >= -90) && (tilt_incrdecr <= 90)) + setting.position[i-1].tilt_incrdecr = tilt_incrdecr; break; case 5: case 6: @@ -1818,18 +1896,44 @@ void CmndShutterButton(void) for (uint32_t j=0 ; j < 4 ; j++) { int8_t pos = setting.position[j].pos; int8_t postilt = setting.position[j].tilt; + int8_t pos_incrdecr = setting.position[j].pos_incrdecr; + int8_t tilt_incrdecr = setting.position[j].tilt_incrdecr; + AddLog(LOG_LEVEL_DEBUG, PSTR("SHT: Merging: pos:%d, tilt:%d, incpos:%d, inctilt:%d"), + pos,postilt,pos_incrdecr,tilt_incrdecr); if (0 <= pos) if (102 == pos) { setting_chr_ptr += sprintf_P(setting_chr_ptr, PSTR(" t")); } else { setting_chr_ptr += snprintf_P(setting_chr_ptr, 5, PSTR(" %d"), pos); } - else - setting_chr_ptr += sprintf_P(setting_chr_ptr, PSTR(" -")); - if (-128 != postilt) { + else { + switch (pos_incrdecr) { + case 0: + setting_chr_ptr += sprintf_P(setting_chr_ptr, PSTR(" -")); + break; + default: + if (pos_incrdecr > 0) + setting_chr_ptr += snprintf_P(setting_chr_ptr, 6, PSTR(" ++%d"), pos_incrdecr); + else + setting_chr_ptr += snprintf_P(setting_chr_ptr, 6, PSTR(" -%d"), pos_incrdecr); + break; + } + } + + if (-128 != postilt || tilt_incrdecr !=0) { setting_chr_ptr += sprintf_P(setting_chr_ptr, PSTR("/")); if (127 == postilt) { - setting_chr_ptr += sprintf_P(setting_chr_ptr, PSTR("t")); + switch (tilt_incrdecr) { + case 0: + setting_chr_ptr += sprintf_P(setting_chr_ptr, PSTR("t")); + break; + default: + if (tilt_incrdecr > 0) + setting_chr_ptr += snprintf_P(setting_chr_ptr, 5, PSTR("++%d"), tilt_incrdecr); + else + setting_chr_ptr += snprintf_P(setting_chr_ptr, 5, PSTR("-%d"), tilt_incrdecr); + break; + } } else { setting_chr_ptr += snprintf_P(setting_chr_ptr, 5, PSTR("%d"), postilt); } @@ -1881,6 +1985,7 @@ void CmndShutterSetClose(void) if ((XdrvMailbox.index > 0) && (XdrvMailbox.index <= TasmotaGlobal.shutters_present)) { Shutter[XdrvMailbox.index -1].real_position = 0; Shutter[XdrvMailbox.index -1].tilt_real_pos = Shutter[XdrvMailbox.index -1].tilt_config[0]; + Shutter[XdrvMailbox.index -1].lastdirection = -1; ShutterStartInit(XdrvMailbox.index -1, 0, 0); ShutterSettings.shutter_position[XdrvMailbox.index -1] = 0; ResponseCmndIdxChar(D_CONFIGURATION_RESET); @@ -1892,6 +1997,7 @@ void CmndShutterSetOpen(void) if ((XdrvMailbox.index > 0) && (XdrvMailbox.index <= TasmotaGlobal.shutters_present)) { Shutter[XdrvMailbox.index -1].real_position = Shutter[XdrvMailbox.index -1].open_max; Shutter[XdrvMailbox.index -1].tilt_real_pos = Shutter[XdrvMailbox.index -1].tilt_config[1]; + Shutter[XdrvMailbox.index -1].lastdirection = 1; ShutterStartInit(XdrvMailbox.index -1, 0, Shutter[XdrvMailbox.index -1].open_max); ShutterSettings.shutter_position[XdrvMailbox.index -1] = 100; ResponseCmndIdxChar(D_CONFIGURATION_RESET); @@ -2185,15 +2291,11 @@ bool Xdrv27(uint32_t function) break; case FUNC_JSON_APPEND: for (uint8_t i = 0; i < TasmotaGlobal.shutters_present; i++) { - uint8_t position = ShutterRealToPercentPosition(Shutter[i].real_position, i); - uint8_t target = ShutterRealToPercentPosition(Shutter[i].target_position, i); - ResponseAppend_P(","); - ResponseAppend_P(JSON_SHUTTER_POS, i+1, ((ShutterSettings.shutter_options[i] & 1) ? 100 - position : position), Shutter[i].direction, - ((ShutterSettings.shutter_options[i] & 1) ? 100 - target : target), Shutter[i].tilt_real_pos); + ResponseAppend_P(JSON_SHUTTER_POS, i+1, ShutterRealToPercentPosition(Shutter[i].real_position, i), Shutter[i].direction, ShutterRealToPercentPosition(Shutter[i].target_position, i), Shutter[i].tilt_real_pos); #ifdef USE_DOMOTICZ if ((0 == TasmotaGlobal.tele_period) && (0 == i)) { - DomoticzSensor(DZ_SHUTTER, position); + DomoticzSensor(DZ_SHUTTER, ShutterRealToPercentPosition(Shutter[i].real_position, i)); } #endif // USE_DOMOTICZ } @@ -2203,7 +2305,7 @@ bool Xdrv27(uint32_t function) // extract the number of the relay that was switched and save for later in Update Position. ShutterGlobal.RelayCurrentMask = XdrvMailbox.index ^ ShutterGlobal.RelayOldMask; ShutterGlobal.LastChangedRelay = ShutterGetRelayNoFromBitfield(XdrvMailbox.index ^ ShutterGlobal.RelayOldMask); - AddLog(LOG_LEVEL_DEBUG_MORE, PSTR("SHT: FUNC_SET_POWER Relaymask %d SwitchedRelay:%d by %s, payload %d, powermask %d"), ShutterGlobal.RelayOldMask, ShutterGlobal.LastChangedRelay,GetTextIndexed(stemp1, sizeof(stemp1), TasmotaGlobal.last_source, kCommandSource),XdrvMailbox.payload, TasmotaGlobal.power); + //AddLog(LOG_LEVEL_DEBUG_MORE, PSTR("SHT: FUNC_SET_POWER Relaymask %d SwitchedRelay:%d by %s, payload %d, powermask %d"), ShutterGlobal.RelayOldMask, ShutterGlobal.LastChangedRelay,GetTextIndexed(stemp1, sizeof(stemp1), TasmotaGlobal.last_source, kCommandSource),XdrvMailbox.payload, TasmotaGlobal.power); save_powermatrix = TasmotaGlobal.power; // can be changed in ShutterRelayChanged if (!ShutterGlobal.LastChangedRelay) { ShutterGlobal.skip_relay_change = 1; @@ -2225,7 +2327,7 @@ bool Xdrv27(uint32_t function) //ExecuteCommandPowerShutter(i+1, 0, SRC_SHUTTER); // should not required anymore. check for bugs if (ShutterGlobal.LastChangedRelay) ShutterGlobal.RelayOldMask = TasmotaGlobal.power ^= 1<<(ShutterGlobal.LastChangedRelay-1); } - AddLog(LOG_LEVEL_DEBUG_MORE, PSTR("SHT: FUNC_SET_DEVICE_POWER end. powermask %ld, current rel: %ld"), TasmotaGlobal.power, ShutterGlobal.RelayOldMask); + //AddLog(LOG_LEVEL_DEBUG_MORE, PSTR("SHT: FUNC_SET_DEVICE_POWER end. powermask %ld, current rel: %ld"), TasmotaGlobal.power, ShutterGlobal.RelayOldMask); break; case FUNC_BUTTON_MULTI_PRESSED: if (XdrvMailbox.index < MAX_SHUTTERS_ESP32*2 && ShutterSettings.shutter_button[XdrvMailbox.index].enabled) { diff --git a/tasmota/tasmota_xdrv_driver/xdrv_27_shutter.ino b/tasmota/tasmota_xdrv_driver/xdrv_27_shutter.ino index 566778289..7229a8942 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_27_shutter.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_27_shutter.ino @@ -1256,6 +1256,7 @@ void CmndShutterStop(void) AddLog(LOG_LEVEL_DEBUG, PSTR("SHT: Stop %d: dir: %d"), XdrvMailbox.index, Shutter[i].direction); Shutter[i].target_position = Shutter[i].real_position; + TasmotaGlobal.last_source = SRC_SHUTTER; } if (XdrvMailbox.command) ResponseCmndDone(); @@ -1710,6 +1711,7 @@ void CmndShutterSetClose(void) if ((XdrvMailbox.index > 0) && (XdrvMailbox.index <= TasmotaGlobal.shutters_present)) { Shutter[XdrvMailbox.index -1].real_position = 0; Shutter[XdrvMailbox.index -1].tilt_real_pos = Shutter[XdrvMailbox.index -1].tilt_config[0]; + Shutter[XdrvMailbox.index -1].lastdirection = -1; ShutterStartInit(XdrvMailbox.index -1, 0, 0); Settings->shutter_position[XdrvMailbox.index -1] = 0; ResponseCmndIdxChar(D_CONFIGURATION_RESET); @@ -1721,6 +1723,7 @@ void CmndShutterSetOpen(void) if ((XdrvMailbox.index > 0) && (XdrvMailbox.index <= TasmotaGlobal.shutters_present)) { Shutter[XdrvMailbox.index -1].real_position = Shutter[XdrvMailbox.index -1].open_max; Shutter[XdrvMailbox.index -1].tilt_real_pos = Shutter[XdrvMailbox.index -1].tilt_config[1]; + Shutter[XdrvMailbox.index -1].lastdirection = 1; ShutterStartInit(XdrvMailbox.index -1, 0, Shutter[XdrvMailbox.index -1].open_max); Settings->shutter_position[XdrvMailbox.index -1] = 100; ResponseCmndIdxChar(D_CONFIGURATION_RESET); From c26ec4440773665cc2575e1af03a40ed3a647b40 Mon Sep 17 00:00:00 2001 From: s-hadinger <49731213+s-hadinger@users.noreply.github.com> Date: Wed, 3 May 2023 23:03:01 +0200 Subject: [PATCH 061/289] Matter POC for remote Relay (#18575) --- CHANGELOG.md | 1 + .../berry_matter/src/be_matter_module.c | 4 + .../src/embedded/Matter_Device.be | 16 +- .../src/embedded/Matter_Plugin.be | 61 +- .../src/embedded/Matter_Plugin_Bridge_HTTP.be | 228 +++++ .../embedded/Matter_Plugin_Bridge_OnOff.be | 135 +++ .../src/embedded/Matter_Plugin_Light0.be | 1 + .../src/embedded/Matter_Plugin_OnOff.be | 1 + .../src/embedded/Matter_Plugin_Sensor.be | 1 + .../embedded/Matter_Plugin_Sensor_Humidity.be | 2 +- .../Matter_Plugin_Sensor_Illuminance.be | 2 +- .../embedded/Matter_Plugin_Sensor_Pressure.be | 2 +- .../src/embedded/Matter_Plugin_Sensor_Temp.be | 2 +- .../berry_matter/src/embedded/Matter_UI.be | 23 +- .../src/solidify/solidified_Matter_Device.h | 44 +- .../src/solidify/solidified_Matter_Plugin.h | 941 ++++++++++-------- .../solidified_Matter_Plugin_Bridge_HTTP.h | 665 +++++++++++++ .../solidified_Matter_Plugin_Bridge_OnOff.h | 400 ++++++++ .../solidified_Matter_Plugin_Light0.h | 357 +++---- .../solidify/solidified_Matter_Plugin_OnOff.h | 321 +++--- .../solidified_Matter_Plugin_Sensor.h | 163 +-- ...solidified_Matter_Plugin_Sensor_Humidity.h | 17 +- ...idified_Matter_Plugin_Sensor_Illuminance.h | 15 +- ...solidified_Matter_Plugin_Sensor_Pressure.h | 15 +- .../solidified_Matter_Plugin_Sensor_Temp.h | 17 +- .../src/solidify/solidified_Matter_UI.h | 564 +++++------ .../xdrv_52_3_berry_tasmota.ino | 2 +- 27 files changed, 2837 insertions(+), 1163 deletions(-) create mode 100644 lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_HTTP.be create mode 100644 lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_OnOff.be create mode 100644 lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_HTTP.h create mode 100644 lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_OnOff.h diff --git a/CHANGELOG.md b/CHANGELOG.md index 61d7359d2..b556e979c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,7 @@ All notable changes to this project will be documented in this file. - Matter support for Shutters (without Tilt) (#18509) - Support for TC74 temperature sensor by Michael Loftis (#18042) - Matter support for Shutters with Tilt +- Matter POC for remote Relay ### Breaking Changed diff --git a/lib/libesp32/berry_matter/src/be_matter_module.c b/lib/libesp32/berry_matter/src/be_matter_module.c index 459518fee..6469098a3 100644 --- a/lib/libesp32/berry_matter/src/be_matter_module.c +++ b/lib/libesp32/berry_matter/src/be_matter_module.c @@ -166,6 +166,8 @@ extern const bclass be_class_Matter_TLV; // need to declare it upfront because #include "solidify/solidified_Matter_Plugin_Sensor_Temp.h" #include "solidify/solidified_Matter_Plugin_Sensor_Illuminance.h" #include "solidify/solidified_Matter_Plugin_Sensor_Humidity.h" +#include "solidify/solidified_Matter_Plugin_Bridge_HTTP.h" +#include "solidify/solidified_Matter_Plugin_Bridge_OnOff.h" /*********************************************************************************************\ * Get a bytes() object of the certificate DAC/PAI_Cert @@ -346,6 +348,8 @@ module matter (scope: global, strings: weak) { Plugin_Sensor_Temp, class(be_class_Matter_Plugin_Sensor_Temp) // Temperature Sensor Plugin_Sensor_Illuminance, class(be_class_Matter_Plugin_Sensor_Illuminance) // Illuminance Sensor Plugin_Sensor_Humidity, class(be_class_Matter_Plugin_Sensor_Humidity) // Humidity Sensor + Plugin_Bridge_HTTP, class(be_class_Matter_Plugin_Bridge_HTTP) // HTTP bridge superclass + Plugin_Bridge_OnOff, class(be_class_Matter_Plugin_Bridge_OnOff) // HTTP Relay/Light behavior (OnOff) } @const_object_info_end */ diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Device.be b/lib/libesp32/berry_matter/src/embedded/Matter_Device.be index e96321fb8..d027e7dfd 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Device.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Device.be @@ -297,10 +297,16 @@ class Matter_Device if self.commissioning_open != nil && tasmota.time_reached(self.commissioning_open) # timeout reached, close provisioning self.commissioning_open = nil end - # call all plugins + end + + ############################################################# + # dispatch every 250ms to all plugins + def every_250ms() + self.message_handler.every_250ms() + # call all plugins, use a manual loop to avoid creating a new object var idx = 0 while idx < size(self.plugins) - self.plugins[idx].every_second() + self.plugins[idx].every_250ms() idx += 1 end end @@ -334,12 +340,6 @@ class Matter_Device self.tick += 1 end - ############################################################# - # dispatch every 250ms click to sub-objects that need it - def every_250ms() - self.message_handler.every_250ms() - end - ############################################################# def stop() tasmota.remove_driver(self) diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin.be index 142987bc3..8f725225d 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin.be @@ -23,10 +23,15 @@ #@ solidify:Matter_Plugin,weak class Matter_Plugin + # Global type system for plugins static var TYPE = "" # name of the plug-in in json static var NAME = "" # display name of the plug-in static var ARG = "" # additional argument name (or empty if none) static var ARG_TYPE = / x -> str(x) # function to convert argument to the right type + # Behavior of the plugin, frequency at which `update_shadow()` is called + static var UPDATE_TIME = 5000 # default is every 5 seconds + var update_next # next timestamp for update + # Configuration of the plugin: clusters and type static var CLUSTERS = { 0x001D: [0,1,2,3,0xFFFC,0xFFFD], # Descriptor Cluster 9.5 p.453 } @@ -53,6 +58,12 @@ class Matter_Plugin self.clusters = self.consolidate_clusters() end + ############################################################# + # return the map of all types + def get_types() + return self.TYPES + end + ############################################################# # Stub for updating shadow values (local copies of what we published to the Matter gateway) def update_shadow() @@ -139,10 +150,11 @@ class Matter_Plugin if attribute == 0x0000 # ---------- DeviceTypeList / list[DeviceTypeStruct] ---------- var dtl = TLV.Matter_TLV_array() - for dt: self.TYPES.keys() + var types = self.get_types() + for dt: types.keys() var d1 = dtl.add_struct() d1.add_TLV(0, TLV.U2, dt) # DeviceType - d1.add_TLV(1, TLV.U2, self.TYPES[dt]) # Revision + d1.add_TLV(1, TLV.U2, types[dt]) # Revision end return dtl elif attribute == 0x0001 # ---------- ServerList / list[cluster-id] ---------- @@ -227,9 +239,48 @@ class Matter_Plugin end ############################################################# - # every_second - def every_second() - self.update_shadow() # force reading value and sending subscriptions + # every_250ms + # + # check if the timer expired and update_shadow() needs to be called + def every_250ms() + if self.update_next == nil + # initialization to a random value within range + import crypto + var rand31 = crypto.random(4).get(0,4) & 0x7FFFFFFF # random int over 31 bits + self.update_next = tasmota.millis(rand31 % self.UPDATE_TIME) + else + if tasmota.time_reached(self.update_next) + self.update_shadow_lazy() # call update_shadow if not already called + self.update_next = tasmota.millis(self.UPDATE_TIME) # rearm timer + end + end + end + + ############################################################# + # UI Methods + ############################################################# + # ui_conf_to_string + # + # Convert the current plugin parameters to a single string + static def ui_conf_to_string(cl, conf) + var arg_name = cl.ARG + var arg = arg_name ? str(conf.find(arg_name, '')) : '' + # print("MTR: ui_conf_to_string", conf, cl, arg_name, arg) + return arg + end + + ############################################################# + # ui_string_to_conf + # + # Convert the string in UI to actual parameters added to the map + static def ui_string_to_conf(cl, conf, arg) + var arg_name = cl.ARG + var arg_type = cl.ARG_TYPE + if arg && arg_name + conf[arg_name] = arg_type(arg) + end + # print("ui_string_to_conf", conf, arg) + return conf end end diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_HTTP.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_HTTP.be new file mode 100644 index 000000000..612fe489d --- /dev/null +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_HTTP.be @@ -0,0 +1,228 @@ +# +# Matter_Plugin_Bridge_HTTP.be - implements base class for a Bridge via HTTP +# +# Copyright (C) 2023 Stephan Hadinger & Theo Arends +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +# + +# Matter plug-in for core behavior + +# dummy declaration for solidification +class Matter_Plugin_Device end + +#@ solidify:Matter_Plugin_Bridge_HTTP,weak + +class Matter_Plugin_Bridge_HTTP : Matter_Plugin_Device + static var TYPE = "" # name of the plug-in in json + static var NAME = "" # display name of the plug-in + static var ARG = "" # additional argument name (or empty if none) + static var ARG_HTTP = "url" # domain name + static var UPDATE_TIME = 3000 # update every 3s + static var HTTP_TIMEOUT = 300 # wait for 300ms max, since we're on LAN + static var CLUSTERS = { + # 0x001D: inherited # Descriptor Cluster 9.5 p.453 + # 0x0003: inherited # Identify 1.2 p.16 + # 0x0004: inherited # Groups 1.3 p.21 + # 0x0005: inherited # Scenes 1.4 p.30 - no writable + # 0x0006: [0,0xFFFC,0xFFFD], # On/Off 1.5 p.48 + + # 0x0028: [0,1,2,3,4,5,6,7,8,9,0x0A,0x0F,0x12,0x13],# Basic Information Cluster cluster 11.1 p.565 + 0x0039: [0x11] # Bridged Device Basic Information 9.13 p.485 + + } + # static var TYPES = { 0x010A: 2 } # On/Off Light + + var tasmota_http # domain name for HTTP, ex: 'http://192.168.1.10/' + var tasmota_status_8 # remote `Status 8` sensor values (last known) + var tasmota_status_11 # remote `Status 11` light values (last known) + # each contain a `_tick` attribute to known when they were last loaded + var reachable # is the device reachable + var reachable_tick # last tick when the reachability was seen (avoids sending superfluous ping commands) + + ############################################################# + # Constructor + def init(device, endpoint, arguments) + import string + super(self).init(device, endpoint, arguments) + + var http = arguments.find(self.ARG_HTTP) + if http + if string.find(http, '://') < 0 + http = "http://" + http + "/" + end + self.tasmota_http = http + else + tasmota.log(string.format("MTR: ERROR: 'url' is not configured for endpoint %i", endpoint), 2) + end + self.tasmota_status_8 = nil + self.tasmota_status_11 = nil + self.reachable = false # force a valid bool value + end + + ############################################################# + # return the map of all types, add the bridged type + def get_types() + var types = {} + for k: self.TYPES.keys() + types[k] = self.TYPES[k] + end + # Add Bridged Node + types[0x0013] = 1 # Bridged Node, v1 + return types + end + + ############################################################# + # call_remote + # + # Call a remote Tasmota device, returns Berry native map or nil + def call_remote(cmd, arg) + if !self.tasmota_http return nil end + import json + import string + if !tasmota.wifi()['up'] && !tasmota.eth()['up'] return nil end # no network + var retry = 2 # try 2 times if first failed + while retry > 0 + var cl = webclient() + cl.set_timeouts(1000, 1000) + cl.set_follow_redirects(false) + var url = string.format("%scm?cmnd=%s%%20%s", self.tasmota_http, cmd, arg ? arg : '') + tasmota.log("MTR: HTTP GET "+url, 3) + cl.begin(url) + var r = cl.GET() + tasmota.log("MTR: HTTP GET code=" + str(r), 3) + if r == 200 + var s = cl.get_string() + cl.close() + tasmota.log("MTR: HTTP GET payload=" + s, 3) + var j = json.load(s) + # device is known to be reachable + self.reachable = true + self.reachable_tick = self.device.tick + return j + end + cl.close() + + retry -= 1 + tasmota.log("MTR: HTTP GET retrying", 3) + end + self.reachable = false + return nil + end + + ############################################################# + # is_reachable() + # + # Pings the device and checks if it's reachable + def is_reachable() + if self.device.tick != self.reachable_tick + var ret = self.call_remote("", "") # empty command works as a ping + self.reachable = (ret != nil) + # self.reachable_tick = cur_tick # done by caller + end + return self.reachable + end + + ############################################################# + # get_status_8() + # + # Get remote `Status 8` values of sensors, and cache for the current tick + def get_status_8() + var cur_tick = self.device.tick + if self.tasmota_status_8 == nil || self.tasmota_status_8.find("_tick") != cur_tick + var ret = self.call_remote("Status", "8") # call `Status 8` + if ret + ret["_tick"] = cur_tick + self.tasmota_status_8 = ret + return ret + else + return nil + end + else + return self.tasmota_status_8 # return cached value + end + end + + ############################################################# + # get_status_11() + # + # Get remote `Status 11` values of sensors, and cache for the current tick + def get_status_11() + var cur_tick = self.device.tick + if self.tasmota_status_11 == nil || self.tasmota_status_11.find("_tick") != cur_tick + var ret = self.call_remote("Status", "11") # call `Status 8` + if ret + ret["_tick"] = cur_tick + self.tasmota_status_11 = ret + return ret + else + return nil + end + else + return self.tasmota_status_11 # return cached value + end + end + + ############################################################# + # read attribute + # + def read_attribute(session, ctx) + var TLV = matter.TLV + var cluster = ctx.cluster + var attribute = ctx.attribute + + # ==================================================================================================== + if cluster == 0x0039 # ========== Bridged Device Basic Information 9.13 p.485 ========== + + if attribute == 0x0000 # ---------- DataModelRevision / CommissioningWindowStatus ---------- + # return TLV.create_TLV(TLV.U2, 1) + elif attribute == 0x0011 # ---------- Reachable / bool ---------- + return TLV.create_TLV(TLV.BOOL, true) # TODO find a way to do a ping + end + + else + return super(self).read_attribute(session, ctx) + end + end + + ############################################################# + # UI Methods + ############################################################# + # ui_conf_to_string + # + # Convert the current plugin parameters to a single string + static def ui_conf_to_string(cl, conf) + var s = super(_class).ui_conf_to_string(cl, conf) + + var url = str(conf.find(_class.ARG_HTTP, '')) + var arg = s + "," + url + print("MTR: ui_conf_to_string", conf, cl, arg) + return arg + end + + ############################################################# + # ui_string_to_conf + # + # Convert the string in UI to actual parameters added to the map + static def ui_string_to_conf(cl, conf, arg) + import string + var elts = string.split(arg + ',', ',', 3) # add ',' at the end to be sure to have at least 2 arguments + conf[_class.ARG_HTTP] = elts[1] + super(_class).ui_string_to_conf(cl, conf, elts[0]) + print("ui_string_to_conf", conf, arg) + return conf + end + +end +matter.Plugin_Bridge_HTTP = Matter_Plugin_Bridge_HTTP diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_OnOff.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_OnOff.be new file mode 100644 index 000000000..49aa7a507 --- /dev/null +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_OnOff.be @@ -0,0 +1,135 @@ +# +# Matter_Plugin_Bridge_OnOff.be - implements the behavior for a Relay via HTTP (OnOff) +# +# Copyright (C) 2023 Stephan Hadinger & Theo Arends +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +# + +# Matter plug-in for core behavior + +# dummy declaration for solidification +class Matter_Plugin_Bridge_HTTP end + +#@ solidify:Matter_Plugin_Bridge_OnOff,weak + +class Matter_Plugin_Bridge_OnOff : Matter_Plugin_Bridge_HTTP + static var TYPE = "http_relay" # name of the plug-in in json + static var NAME = "🔗 Relay" # display name of the plug-in + static var ARG = "relay" # additional argument name (or empty if none) + static var ARG_TYPE = / x -> int(x) # function to convert argument to the right type + static var CLUSTERS = { + # 0x001D: inherited # Descriptor Cluster 9.5 p.453 + # 0x0003: inherited # Identify 1.2 p.16 + # 0x0004: inherited # Groups 1.3 p.21 + # 0x0005: inherited # Scenes 1.4 p.30 - no writable + 0x0006: [0,0xFFFC,0xFFFD], # On/Off 1.5 p.48 + } + static var TYPES = { 0x010A: 2 } # On/Off Light + + var tasmota_http # domain name for HTTP + var tasmota_relay_index # Relay number in Tasmota (zero based) + var shadow_onoff # fake status for now # TODO + + ############################################################# + # Constructor + def init(device, endpoint, arguments) + import string + super(self).init(device, endpoint, arguments) + self.shadow_onoff = false + self.tasmota_relay_index = arguments.find(self.ARG #-'relay'-#) + if self.tasmota_relay_index == nil self.tasmota_relay_index = 0 end + end + + ############################################################# + # Update shadow + # + def update_shadow() + var st11 = self.get_status_11() + if st11 + st11 = st11.find('StatusSTS', {}) # remove first level + var state = (st11.find("POWER") == "ON") + if self.shadow_onoff != nil && self.shadow_onoff != bool(state) + self.attribute_updated(0x0006, 0x0000) + end + self.shadow_onoff = state + end + super(self).update_shadow() + end + + ############################################################# + # Model + # + def set_onoff(v) + self.call_remote("Power", v ? "1" : "0") + self.update_shadow() + end + + ############################################################# + # read an attribute + # + def read_attribute(session, ctx) + import string + var TLV = matter.TLV + var cluster = ctx.cluster + var attribute = ctx.attribute + + # ==================================================================================================== + if cluster == 0x0006 # ========== On/Off 1.5 p.48 ========== + self.update_shadow_lazy() + if attribute == 0x0000 # ---------- OnOff / bool ---------- + return TLV.create_TLV(TLV.BOOL, self.shadow_onoff) + elif attribute == 0xFFFC # ---------- FeatureMap / map32 ---------- + return TLV.create_TLV(TLV.U4, 0) # 0 = no Level Control for Lighting + elif attribute == 0xFFFD # ---------- ClusterRevision / u2 ---------- + return TLV.create_TLV(TLV.U4, 4) # 0 = no Level Control for Lighting + end + + else + return super(self).read_attribute(session, ctx) + end + end + + ############################################################# + # Invoke a command + # + # returns a TLV object if successful, contains the response + # or an `int` to indicate a status + def invoke_request(session, val, ctx) + var TLV = matter.TLV + var cluster = ctx.cluster + var command = ctx.command + + # ==================================================================================================== + if cluster == 0x0006 # ========== On/Off 1.5 p.48 ========== + self.update_shadow_lazy() + if command == 0x0000 # ---------- Off ---------- + self.set_onoff(false) + self.update_shadow() + return true + elif command == 0x0001 # ---------- On ---------- + self.set_onoff(true) + self.update_shadow() + return true + elif command == 0x0002 # ---------- Toggle ---------- + self.set_onoff(!self.shadow_onoff) + self.update_shadow() + return true + end + end + + end + +end +matter.Plugin_Bridge_OnOff = Matter_Plugin_Bridge_OnOff diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Light0.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Light0.be index c4abc2758..9e43a8189 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Light0.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Light0.be @@ -27,6 +27,7 @@ class Matter_Plugin_Device end class Matter_Plugin_Light0 : Matter_Plugin_Device static var TYPE = "light0" # name of the plug-in in json static var NAME = "Light 0 On" # display name of the plug-in + static var UPDATE_TIME = 250 # update every 250ms static var CLUSTERS = { # 0x001D: inherited # Descriptor Cluster 9.5 p.453 # 0x0003: inherited # Identify 1.2 p.16 diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_OnOff.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_OnOff.be index 6d1c9bf90..585a5bce5 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_OnOff.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_OnOff.be @@ -29,6 +29,7 @@ class Matter_Plugin_OnOff : Matter_Plugin_Device static var NAME = "Relay" # display name of the plug-in static var ARG = "relay" # additional argument name (or empty if none) static var ARG_TYPE = / x -> int(x) # function to convert argument to the right type + static var UPDATE_TIME = 250 # update every 250ms static var CLUSTERS = { # 0x001D: inherited # Descriptor Cluster 9.5 p.453 # 0x0003: inherited # Identify 1.2 p.16 diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor.be index 3f0d2dfd7..c3f595045 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor.be @@ -26,6 +26,7 @@ class Matter_Plugin_Device end class Matter_Plugin_Sensor : Matter_Plugin_Device static var ARG = "filter" # additional argument name (or empty if none) + static var UPDATE_TIME = 5000 # update sensor every 5s var tasmota_sensor_filter # Rule-type filter to the value, like "ESP32#Temperature" var tasmota_sensor_matcher # Actual matcher object var shadow_value # Last known value diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor_Humidity.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor_Humidity.be index 55ccdf992..1165b9e65 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor_Humidity.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor_Humidity.be @@ -38,7 +38,7 @@ class Matter_Plugin_Sensor_Humidity : Matter_Plugin_Sensor # This must be overriden. # This allows to convert the raw sensor value to the target one, typically int def pre_value(val) - return int(val * 100) # 1/100th of percentage + return val != nil ? int(val * 100) : nil # 1/100th of percentage end ############################################################# diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor_Illuminance.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor_Illuminance.be index e676aac18..1ba16a5eb 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor_Illuminance.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor_Illuminance.be @@ -38,7 +38,7 @@ class Matter_Plugin_Sensor_Illuminance : Matter_Plugin_Sensor # This must be overriden. # This allows to convert the raw sensor value to the target one, typically int def pre_value(val) - return int(val) # value in lux + return val != nil ? int(val) : nil # value in lux end ############################################################# diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor_Pressure.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor_Pressure.be index 60414b0c9..0d87d296b 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor_Pressure.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor_Pressure.be @@ -38,7 +38,7 @@ class Matter_Plugin_Sensor_Pressure : Matter_Plugin_Sensor # This must be overriden. # This allows to convert the raw sensor value to the target one, typically int def pre_value(val) - return int(val) + return val != nil ? int(val) : nil end ############################################################# diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor_Temp.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor_Temp.be index ec411f537..4d2d9f23b 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor_Temp.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor_Temp.be @@ -38,7 +38,7 @@ class Matter_Plugin_Sensor_Temp : Matter_Plugin_Sensor # This must be overriden. # This allows to convert the raw sensor value to the target one, typically int def pre_value(val) - return int(val * 100) + return val != nil ? int(val * 100) : nil end ############################################################# diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_UI.be b/lib/libesp32/berry_matter/src/embedded/Matter_UI.be index cfc9e4cfc..019af83d9 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_UI.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_UI.be @@ -35,6 +35,7 @@ class Matter_UI static var _ROOT_TYPES = "root" static var _CLASSES_TYPES = "|relay|light0|light1|light2|light3|shutter|shutter+tilt" "|temperature|pressure|illuminance|humidity" + "|-http|http_relay" var device def init(device) @@ -256,8 +257,13 @@ class Matter_UI var typ = conf.find('type') if !typ i += 1 continue end - var arg_name = self.device.get_plugin_class_arg(typ) - var arg = arg_name ? str(conf.find(arg_name, '')) : '' + var cl = self.device.plugins_classes.find(typ) + var arg = "" + if cl != nil + arg = cl.ui_conf_to_string(cl, conf) + end + # var arg_name = self.device.get_plugin_class_arg(typ) + # var arg = arg_name ? str(conf.find(arg_name, '')) : '' webserver.content_send(string.format("", i, ep)) @@ -297,6 +303,8 @@ class Matter_UI var typ = class_types[i] if typ == '' webserver.content_send("") + elif typ == '-http' + webserver.content_send("") else var nam = self.device.get_plugin_class_displayname(typ) webserver.content_send(string.format("", typ, (typ == cur) ? " selected" : "", nam)) @@ -429,11 +437,12 @@ class Matter_UI var typ_class = self.device.plugins_classes.find(typ) if typ_class != nil var elt = {'type':typ} - var arg_name = typ_class.ARG - var arg_type = typ_class.ARG_TYPE - if arg && arg_name - elt[arg_name] = arg_type(arg) - end + typ_class.ui_string_to_conf(typ_class, elt, arg) + # var arg_name = typ_class.ARG + # var arg_type = typ_class.ARG_TYPE + # if arg && arg_name + # elt[arg_name] = arg_type(arg) + # end config[ep] = elt else diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Device.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Device.h index 57409987c..a0d557ce7 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Device.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Device.h @@ -1546,20 +1546,17 @@ be_local_closure(Matter_Device_every_second, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[ 9]) { /* constants */ + ( &(const bvalue[ 6]) { /* constants */ /* K0 */ be_nested_str_weak(sessions), /* K1 */ be_nested_str_weak(every_second), /* K2 */ be_nested_str_weak(message_handler), /* K3 */ be_nested_str_weak(commissioning_open), /* K4 */ be_nested_str_weak(tasmota), /* K5 */ be_nested_str_weak(time_reached), - /* K6 */ be_const_int(0), - /* K7 */ be_nested_str_weak(plugins), - /* K8 */ be_const_int(1), }), be_str_weak(every_second), &be_const_str_solidified, - ( &(const binstruction[30]) { /* code */ + ( &(const binstruction[18]) { /* code */ 0x88040100, // 0000 GETMBR R1 R0 K0 0x8C040301, // 0001 GETMET R1 R1 K1 0x7C040200, // 0002 CALL R1 1 @@ -1577,19 +1574,7 @@ be_local_closure(Matter_Device_every_second, /* name */ 0x78060001, // 000E JMPF R1 #0011 0x4C040000, // 000F LDNIL R1 0x90020601, // 0010 SETMBR R0 K3 R1 - 0x58040006, // 0011 LDCONST R1 K6 - 0x6008000C, // 0012 GETGBL R2 G12 - 0x880C0107, // 0013 GETMBR R3 R0 K7 - 0x7C080200, // 0014 CALL R2 1 - 0x14080202, // 0015 LT R2 R1 R2 - 0x780A0005, // 0016 JMPF R2 #001D - 0x88080107, // 0017 GETMBR R2 R0 K7 - 0x94080401, // 0018 GETIDX R2 R2 R1 - 0x8C080501, // 0019 GETMET R2 R2 K1 - 0x7C080200, // 001A CALL R2 1 - 0x00040308, // 001B ADD R1 R1 K8 - 0x7001FFF4, // 001C JMP #0012 - 0x80000000, // 001D RET 0 + 0x80000000, // 0011 RET 0 }) ) ); @@ -4714,7 +4699,7 @@ be_local_closure(Matter_Device_start_operational_discovery, /* name */ ********************************************************************/ be_local_closure(Matter_Device_every_250ms, /* name */ be_nested_proto( - 3, /* nstack */ + 4, /* nstack */ 1, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -4722,17 +4707,32 @@ be_local_closure(Matter_Device_every_250ms, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[ 2]) { /* constants */ + ( &(const bvalue[ 5]) { /* constants */ /* K0 */ be_nested_str_weak(message_handler), /* K1 */ be_nested_str_weak(every_250ms), + /* K2 */ be_const_int(0), + /* K3 */ be_nested_str_weak(plugins), + /* K4 */ be_const_int(1), }), be_str_weak(every_250ms), &be_const_str_solidified, - ( &(const binstruction[ 4]) { /* code */ + ( &(const binstruction[16]) { /* code */ 0x88040100, // 0000 GETMBR R1 R0 K0 0x8C040301, // 0001 GETMET R1 R1 K1 0x7C040200, // 0002 CALL R1 1 - 0x80000000, // 0003 RET 0 + 0x58040002, // 0003 LDCONST R1 K2 + 0x6008000C, // 0004 GETGBL R2 G12 + 0x880C0103, // 0005 GETMBR R3 R0 K3 + 0x7C080200, // 0006 CALL R2 1 + 0x14080202, // 0007 LT R2 R1 R2 + 0x780A0005, // 0008 JMPF R2 #000F + 0x88080103, // 0009 GETMBR R2 R0 K3 + 0x94080401, // 000A GETIDX R2 R2 R1 + 0x8C080501, // 000B GETMET R2 R2 K1 + 0x7C080200, // 000C CALL R2 1 + 0x00040304, // 000D ADD R1 R1 K4 + 0x7001FFF4, // 000E JMP #0004 + 0x80000000, // 000F RET 0 }) ) ); diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin.h index 1455906aa..147b3a143 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin.h @@ -7,24 +7,26 @@ extern const bclass be_class_Matter_Plugin; /******************************************************************** -** Solidified function: read_event +** Solidified function: ********************************************************************/ -be_local_closure(Matter_Plugin_read_event, /* name */ +be_local_closure(Matter_Plugin__X3Clambda_X3E, /* name */ be_nested_proto( - 6, /* nstack */ - 5, /* argc */ - 2, /* varg */ + 3, /* nstack */ + 1, /* argc */ + 0, /* varg */ 0, /* has upvals */ NULL, /* no upvals */ 0, /* has sup protos */ NULL, /* no sub protos */ 0, /* has constants */ NULL, /* no const */ - be_str_weak(read_event), + be_str_weak(_X3Clambda_X3E), &be_const_str_solidified, - ( &(const binstruction[ 2]) { /* code */ - 0x4C140000, // 0000 LDNIL R5 - 0x80040A00, // 0001 RET 1 R5 + ( &(const binstruction[ 4]) { /* code */ + 0x60040008, // 0000 GETGBL R1 G8 + 0x5C080000, // 0001 MOVE R2 R0 + 0x7C040200, // 0002 CALL R1 1 + 0x80040200, // 0003 RET 1 R1 }) ) ); @@ -32,59 +34,32 @@ be_local_closure(Matter_Plugin_read_event, /* name */ /******************************************************************** -** Solidified function: write_attribute +** Solidified function: get_attribute_list ********************************************************************/ -be_local_closure(Matter_Plugin_write_attribute, /* name */ +be_local_closure(Matter_Plugin_get_attribute_list, /* name */ be_nested_proto( - 5, /* nstack */ - 4, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 0, /* has constants */ - NULL, /* no const */ - be_str_weak(write_attribute), - &be_const_str_solidified, - ( &(const binstruction[ 2]) { /* code */ - 0x4C100000, // 0000 LDNIL R4 - 0x80040800, // 0001 RET 1 R4 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: attribute_updated -********************************************************************/ -be_local_closure(Matter_Plugin_attribute_updated, /* name */ - be_nested_proto( - 10, /* nstack */ - 4, /* argc */ + 7, /* nstack */ + 3, /* argc */ 2, /* varg */ 0, /* has upvals */ NULL, /* no upvals */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[ 3]) { /* constants */ - /* K0 */ be_nested_str_weak(device), - /* K1 */ be_nested_str_weak(attribute_updated), - /* K2 */ be_nested_str_weak(endpoint), + ( &(const bvalue[ 2]) { /* constants */ + /* K0 */ be_nested_str_weak(clusters), + /* K1 */ be_nested_str_weak(find), }), - be_str_weak(attribute_updated), + be_str_weak(get_attribute_list), &be_const_str_solidified, - ( &(const binstruction[ 8]) { /* code */ - 0x88100100, // 0000 GETMBR R4 R0 K0 - 0x8C100901, // 0001 GETMET R4 R4 K1 - 0x88180102, // 0002 GETMBR R6 R0 K2 - 0x5C1C0200, // 0003 MOVE R7 R1 - 0x5C200400, // 0004 MOVE R8 R2 - 0x5C240600, // 0005 MOVE R9 R3 - 0x7C100A00, // 0006 CALL R4 5 - 0x80000000, // 0007 RET 0 + ( &(const binstruction[ 7]) { /* code */ + 0x880C0100, // 0000 GETMBR R3 R0 K0 + 0x8C0C0701, // 0001 GETMET R3 R3 K1 + 0x5C140400, // 0002 MOVE R5 R2 + 0x60180012, // 0003 GETGBL R6 G18 + 0x7C180000, // 0004 CALL R6 0 + 0x7C0C0600, // 0005 CALL R3 3 + 0x80040600, // 0006 RET 1 R3 }) ) ); @@ -92,12 +67,12 @@ be_local_closure(Matter_Plugin_attribute_updated, /* name */ /******************************************************************** -** Solidified function: get_cluster_list +** Solidified function: has ********************************************************************/ -be_local_closure(Matter_Plugin_get_cluster_list, /* name */ +be_local_closure(Matter_Plugin_has, /* name */ be_nested_proto( - 8, /* nstack */ - 2, /* argc */ + 6, /* nstack */ + 3, /* argc */ 2, /* varg */ 0, /* has upvals */ NULL, /* no upvals */ @@ -106,196 +81,28 @@ be_local_closure(Matter_Plugin_get_cluster_list, /* name */ 1, /* has constants */ ( &(const bvalue[ 4]) { /* constants */ /* K0 */ be_nested_str_weak(clusters), - /* K1 */ be_nested_str_weak(keys), - /* K2 */ be_nested_str_weak(push), - /* K3 */ be_nested_str_weak(stop_iteration), + /* K1 */ be_nested_str_weak(contains), + /* K2 */ be_nested_str_weak(endpoints), + /* K3 */ be_nested_str_weak(find), }), - be_str_weak(get_cluster_list), + be_str_weak(has), &be_const_str_solidified, - ( &(const binstruction[18]) { /* code */ - 0x60080012, // 0000 GETGBL R2 G18 - 0x7C080000, // 0001 CALL R2 0 - 0x600C0010, // 0002 GETGBL R3 G16 - 0x88100100, // 0003 GETMBR R4 R0 K0 - 0x8C100901, // 0004 GETMET R4 R4 K1 - 0x7C100200, // 0005 CALL R4 1 - 0x7C0C0200, // 0006 CALL R3 1 - 0xA8020005, // 0007 EXBLK 0 #000E - 0x5C100600, // 0008 MOVE R4 R3 - 0x7C100000, // 0009 CALL R4 0 - 0x8C140502, // 000A GETMET R5 R2 K2 - 0x5C1C0800, // 000B MOVE R7 R4 - 0x7C140400, // 000C CALL R5 2 - 0x7001FFF9, // 000D JMP #0008 - 0x580C0003, // 000E LDCONST R3 K3 - 0xAC0C0200, // 000F CATCH R3 1 0 - 0xB0080000, // 0010 RAISE 2 R0 R0 - 0x80040400, // 0011 RET 1 R2 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: update_shadow -********************************************************************/ -be_local_closure(Matter_Plugin_update_shadow, /* name */ - be_nested_proto( - 2, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 2]) { /* constants */ - /* K0 */ be_nested_str_weak(tick), - /* K1 */ be_nested_str_weak(device), - }), - be_str_weak(update_shadow), - &be_const_str_solidified, - ( &(const binstruction[ 4]) { /* code */ - 0x88040101, // 0000 GETMBR R1 R0 K1 - 0x88040300, // 0001 GETMBR R1 R1 K0 - 0x90020001, // 0002 SETMBR R0 K0 R1 - 0x80000000, // 0003 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: read_attribute -********************************************************************/ -be_local_closure(Matter_Plugin_read_attribute, /* name */ - be_nested_proto( - 15, /* nstack */ - 3, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[18]) { /* constants */ - /* K0 */ be_nested_str_weak(matter), - /* K1 */ be_nested_str_weak(TLV), - /* K2 */ be_nested_str_weak(cluster), - /* K3 */ be_nested_str_weak(attribute), - /* K4 */ be_const_int(0), - /* K5 */ be_nested_str_weak(Matter_TLV_array), - /* K6 */ be_nested_str_weak(TYPES), - /* K7 */ be_nested_str_weak(keys), - /* K8 */ be_nested_str_weak(add_struct), - /* K9 */ be_nested_str_weak(add_TLV), - /* K10 */ be_nested_str_weak(U2), - /* K11 */ be_const_int(1), - /* K12 */ be_nested_str_weak(stop_iteration), - /* K13 */ be_nested_str_weak(get_cluster_list), - /* K14 */ be_nested_str_weak(U4), - /* K15 */ be_const_int(2), - /* K16 */ be_const_int(3), - /* K17 */ be_nested_str_weak(create_TLV), - }), - be_str_weak(read_attribute), - &be_const_str_solidified, - ( &(const binstruction[93]) { /* code */ - 0xB80E0000, // 0000 GETNGBL R3 K0 - 0x880C0701, // 0001 GETMBR R3 R3 K1 - 0x88100502, // 0002 GETMBR R4 R2 K2 - 0x88140503, // 0003 GETMBR R5 R2 K3 - 0x541A001C, // 0004 LDINT R6 29 - 0x1C180806, // 0005 EQ R6 R4 R6 - 0x781A0052, // 0006 JMPF R6 #005A - 0x1C180B04, // 0007 EQ R6 R5 K4 - 0x781A001C, // 0008 JMPF R6 #0026 - 0x8C180705, // 0009 GETMET R6 R3 K5 - 0x7C180200, // 000A CALL R6 1 - 0x601C0010, // 000B GETGBL R7 G16 - 0x88200106, // 000C GETMBR R8 R0 K6 - 0x8C201107, // 000D GETMET R8 R8 K7 - 0x7C200200, // 000E CALL R8 1 - 0x7C1C0200, // 000F CALL R7 1 - 0xA802000F, // 0010 EXBLK 0 #0021 - 0x5C200E00, // 0011 MOVE R8 R7 - 0x7C200000, // 0012 CALL R8 0 - 0x8C240D08, // 0013 GETMET R9 R6 K8 - 0x7C240200, // 0014 CALL R9 1 - 0x8C281309, // 0015 GETMET R10 R9 K9 - 0x58300004, // 0016 LDCONST R12 K4 - 0x8834070A, // 0017 GETMBR R13 R3 K10 - 0x5C381000, // 0018 MOVE R14 R8 - 0x7C280800, // 0019 CALL R10 4 - 0x8C281309, // 001A GETMET R10 R9 K9 - 0x5830000B, // 001B LDCONST R12 K11 - 0x8834070A, // 001C GETMBR R13 R3 K10 - 0x88380106, // 001D GETMBR R14 R0 K6 - 0x94381C08, // 001E GETIDX R14 R14 R8 - 0x7C280800, // 001F CALL R10 4 - 0x7001FFEF, // 0020 JMP #0011 - 0x581C000C, // 0021 LDCONST R7 K12 - 0xAC1C0200, // 0022 CATCH R7 1 0 - 0xB0080000, // 0023 RAISE 2 R0 R0 - 0x80040C00, // 0024 RET 1 R6 - 0x70020032, // 0025 JMP #0059 - 0x1C180B0B, // 0026 EQ R6 R5 K11 - 0x781A0013, // 0027 JMPF R6 #003C - 0x8C180705, // 0028 GETMET R6 R3 K5 - 0x7C180200, // 0029 CALL R6 1 - 0x601C0010, // 002A GETGBL R7 G16 - 0x8C20010D, // 002B GETMET R8 R0 K13 - 0x7C200200, // 002C CALL R8 1 - 0x7C1C0200, // 002D CALL R7 1 - 0xA8020007, // 002E EXBLK 0 #0037 - 0x5C200E00, // 002F MOVE R8 R7 - 0x7C200000, // 0030 CALL R8 0 - 0x8C240D09, // 0031 GETMET R9 R6 K9 - 0x4C2C0000, // 0032 LDNIL R11 - 0x8830070E, // 0033 GETMBR R12 R3 K14 - 0x5C341000, // 0034 MOVE R13 R8 - 0x7C240800, // 0035 CALL R9 4 - 0x7001FFF7, // 0036 JMP #002F - 0x581C000C, // 0037 LDCONST R7 K12 - 0xAC1C0200, // 0038 CATCH R7 1 0 - 0xB0080000, // 0039 RAISE 2 R0 R0 - 0x80040C00, // 003A RET 1 R6 - 0x7002001C, // 003B JMP #0059 - 0x1C180B0F, // 003C EQ R6 R5 K15 - 0x781A0003, // 003D JMPF R6 #0042 - 0x8C180705, // 003E GETMET R6 R3 K5 - 0x7C180200, // 003F CALL R6 1 - 0x80040C00, // 0040 RET 1 R6 - 0x70020016, // 0041 JMP #0059 - 0x1C180B10, // 0042 EQ R6 R5 K16 - 0x781A0003, // 0043 JMPF R6 #0048 - 0x8C180705, // 0044 GETMET R6 R3 K5 - 0x7C180200, // 0045 CALL R6 1 - 0x80040C00, // 0046 RET 1 R6 - 0x70020010, // 0047 JMP #0059 - 0x541AFFFB, // 0048 LDINT R6 65532 - 0x1C180A06, // 0049 EQ R6 R5 R6 - 0x781A0005, // 004A JMPF R6 #0051 - 0x8C180711, // 004B GETMET R6 R3 K17 - 0x8820070E, // 004C GETMBR R8 R3 K14 - 0x58240004, // 004D LDCONST R9 K4 - 0x7C180600, // 004E CALL R6 3 - 0x80040C00, // 004F RET 1 R6 - 0x70020007, // 0050 JMP #0059 - 0x541AFFFC, // 0051 LDINT R6 65533 - 0x1C180A06, // 0052 EQ R6 R5 R6 - 0x781A0004, // 0053 JMPF R6 #0059 - 0x8C180711, // 0054 GETMET R6 R3 K17 - 0x8820070E, // 0055 GETMBR R8 R3 K14 - 0x5824000B, // 0056 LDCONST R9 K11 - 0x7C180600, // 0057 CALL R6 3 - 0x80040C00, // 0058 RET 1 R6 - 0x70020001, // 0059 JMP #005C - 0x4C180000, // 005A LDNIL R6 - 0x80040C00, // 005B RET 1 R6 - 0x80000000, // 005C RET 0 + ( &(const binstruction[15]) { /* code */ + 0x880C0100, // 0000 GETMBR R3 R0 K0 + 0x8C0C0701, // 0001 GETMET R3 R3 K1 + 0x5C140200, // 0002 MOVE R5 R1 + 0x7C0C0400, // 0003 CALL R3 2 + 0x780E0006, // 0004 JMPF R3 #000C + 0x880C0102, // 0005 GETMBR R3 R0 K2 + 0x8C0C0703, // 0006 GETMET R3 R3 K3 + 0x5C140400, // 0007 MOVE R5 R2 + 0x7C0C0400, // 0008 CALL R3 2 + 0x4C100000, // 0009 LDNIL R4 + 0x200C0604, // 000A NE R3 R3 R4 + 0x740E0000, // 000B JMPT R3 #000D + 0x500C0001, // 000C LDBOOL R3 0 1 + 0x500C0200, // 000D LDBOOL R3 1 0 + 0x80040600, // 000E RET 1 R3 }) ) ); @@ -406,32 +213,26 @@ be_local_closure(Matter_Plugin_consolidate_clusters, /* name */ /******************************************************************** -** Solidified function: get_attribute_list +** Solidified function: get_endpoint ********************************************************************/ -be_local_closure(Matter_Plugin_get_attribute_list, /* name */ +be_local_closure(Matter_Plugin_get_endpoint, /* name */ be_nested_proto( - 7, /* nstack */ - 3, /* argc */ + 2, /* nstack */ + 1, /* argc */ 2, /* varg */ 0, /* has upvals */ NULL, /* no upvals */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[ 2]) { /* constants */ - /* K0 */ be_nested_str_weak(clusters), - /* K1 */ be_nested_str_weak(find), + ( &(const bvalue[ 1]) { /* constants */ + /* K0 */ be_nested_str_weak(endpoint), }), - be_str_weak(get_attribute_list), + be_str_weak(get_endpoint), &be_const_str_solidified, - ( &(const binstruction[ 7]) { /* code */ - 0x880C0100, // 0000 GETMBR R3 R0 K0 - 0x8C0C0701, // 0001 GETMET R3 R3 K1 - 0x5C140400, // 0002 MOVE R5 R2 - 0x60180012, // 0003 GETGBL R6 G18 - 0x7C180000, // 0004 CALL R6 0 - 0x7C0C0600, // 0005 CALL R3 3 - 0x80040600, // 0006 RET 1 R3 + ( &(const binstruction[ 2]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x80040200, // 0001 RET 1 R1 }) ) ); @@ -464,12 +265,12 @@ be_local_closure(Matter_Plugin_timed_request, /* name */ /******************************************************************** -** Solidified function: parse_sensors +** Solidified function: subscribe_event ********************************************************************/ -be_local_closure(Matter_Plugin_parse_sensors, /* name */ +be_local_closure(Matter_Plugin_subscribe_event, /* name */ be_nested_proto( - 2, /* nstack */ - 2, /* argc */ + 6, /* nstack */ + 5, /* argc */ 2, /* varg */ 0, /* has upvals */ NULL, /* no upvals */ @@ -477,10 +278,11 @@ be_local_closure(Matter_Plugin_parse_sensors, /* name */ NULL, /* no sub protos */ 0, /* has constants */ NULL, /* no const */ - be_str_weak(parse_sensors), + be_str_weak(subscribe_event), &be_const_str_solidified, - ( &(const binstruction[ 1]) { /* code */ - 0x80000000, // 0000 RET 0 + ( &(const binstruction[ 2]) { /* code */ + 0x4C140000, // 0000 LDNIL R5 + 0x80040A00, // 0001 RET 1 R5 }) ) ); @@ -523,26 +325,34 @@ be_local_closure(Matter_Plugin_update_shadow_lazy, /* name */ /******************************************************************** -** Solidified function: +** Solidified function: attribute_updated ********************************************************************/ -be_local_closure(Matter_Plugin__X3Clambda_X3E, /* name */ +be_local_closure(Matter_Plugin_attribute_updated, /* name */ be_nested_proto( - 3, /* nstack */ - 1, /* argc */ - 0, /* varg */ + 10, /* nstack */ + 4, /* argc */ + 2, /* varg */ 0, /* has upvals */ NULL, /* no upvals */ 0, /* has sup protos */ NULL, /* no sub protos */ - 0, /* has constants */ - NULL, /* no const */ - be_str_weak(_X3Clambda_X3E), + 1, /* has constants */ + ( &(const bvalue[ 3]) { /* constants */ + /* K0 */ be_nested_str_weak(device), + /* K1 */ be_nested_str_weak(attribute_updated), + /* K2 */ be_nested_str_weak(endpoint), + }), + be_str_weak(attribute_updated), &be_const_str_solidified, - ( &(const binstruction[ 4]) { /* code */ - 0x60040008, // 0000 GETGBL R1 G8 - 0x5C080000, // 0001 MOVE R2 R0 - 0x7C040200, // 0002 CALL R1 1 - 0x80040200, // 0003 RET 1 R1 + ( &(const binstruction[ 8]) { /* code */ + 0x88100100, // 0000 GETMBR R4 R0 K0 + 0x8C100901, // 0001 GETMET R4 R4 K1 + 0x88180102, // 0002 GETMBR R6 R0 K2 + 0x5C1C0200, // 0003 MOVE R7 R1 + 0x5C200400, // 0004 MOVE R8 R2 + 0x5C240600, // 0005 MOVE R9 R3 + 0x7C100A00, // 0006 CALL R4 5 + 0x80000000, // 0007 RET 0 }) ) ); @@ -550,26 +360,205 @@ be_local_closure(Matter_Plugin__X3Clambda_X3E, /* name */ /******************************************************************** -** Solidified function: get_endpoint +** Solidified function: get_cluster_list ********************************************************************/ -be_local_closure(Matter_Plugin_get_endpoint, /* name */ +be_local_closure(Matter_Plugin_get_cluster_list, /* name */ be_nested_proto( - 2, /* nstack */ - 1, /* argc */ + 8, /* nstack */ + 2, /* argc */ 2, /* varg */ 0, /* has upvals */ NULL, /* no upvals */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[ 1]) { /* constants */ - /* K0 */ be_nested_str_weak(endpoint), + ( &(const bvalue[ 4]) { /* constants */ + /* K0 */ be_nested_str_weak(clusters), + /* K1 */ be_nested_str_weak(keys), + /* K2 */ be_nested_str_weak(push), + /* K3 */ be_nested_str_weak(stop_iteration), }), - be_str_weak(get_endpoint), + be_str_weak(get_cluster_list), + &be_const_str_solidified, + ( &(const binstruction[18]) { /* code */ + 0x60080012, // 0000 GETGBL R2 G18 + 0x7C080000, // 0001 CALL R2 0 + 0x600C0010, // 0002 GETGBL R3 G16 + 0x88100100, // 0003 GETMBR R4 R0 K0 + 0x8C100901, // 0004 GETMET R4 R4 K1 + 0x7C100200, // 0005 CALL R4 1 + 0x7C0C0200, // 0006 CALL R3 1 + 0xA8020005, // 0007 EXBLK 0 #000E + 0x5C100600, // 0008 MOVE R4 R3 + 0x7C100000, // 0009 CALL R4 0 + 0x8C140502, // 000A GETMET R5 R2 K2 + 0x5C1C0800, // 000B MOVE R7 R4 + 0x7C140400, // 000C CALL R5 2 + 0x7001FFF9, // 000D JMP #0008 + 0x580C0003, // 000E LDCONST R3 K3 + 0xAC0C0200, // 000F CATCH R3 1 0 + 0xB0080000, // 0010 RAISE 2 R0 R0 + 0x80040400, // 0011 RET 1 R2 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: read_attribute +********************************************************************/ +be_local_closure(Matter_Plugin_read_attribute, /* name */ + be_nested_proto( + 16, /* nstack */ + 3, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[18]) { /* constants */ + /* K0 */ be_nested_str_weak(matter), + /* K1 */ be_nested_str_weak(TLV), + /* K2 */ be_nested_str_weak(cluster), + /* K3 */ be_nested_str_weak(attribute), + /* K4 */ be_const_int(0), + /* K5 */ be_nested_str_weak(Matter_TLV_array), + /* K6 */ be_nested_str_weak(get_types), + /* K7 */ be_nested_str_weak(keys), + /* K8 */ be_nested_str_weak(add_struct), + /* K9 */ be_nested_str_weak(add_TLV), + /* K10 */ be_nested_str_weak(U2), + /* K11 */ be_const_int(1), + /* K12 */ be_nested_str_weak(stop_iteration), + /* K13 */ be_nested_str_weak(get_cluster_list), + /* K14 */ be_nested_str_weak(U4), + /* K15 */ be_const_int(2), + /* K16 */ be_const_int(3), + /* K17 */ be_nested_str_weak(create_TLV), + }), + be_str_weak(read_attribute), + &be_const_str_solidified, + ( &(const binstruction[93]) { /* code */ + 0xB80E0000, // 0000 GETNGBL R3 K0 + 0x880C0701, // 0001 GETMBR R3 R3 K1 + 0x88100502, // 0002 GETMBR R4 R2 K2 + 0x88140503, // 0003 GETMBR R5 R2 K3 + 0x541A001C, // 0004 LDINT R6 29 + 0x1C180806, // 0005 EQ R6 R4 R6 + 0x781A0052, // 0006 JMPF R6 #005A + 0x1C180B04, // 0007 EQ R6 R5 K4 + 0x781A001C, // 0008 JMPF R6 #0026 + 0x8C180705, // 0009 GETMET R6 R3 K5 + 0x7C180200, // 000A CALL R6 1 + 0x8C1C0106, // 000B GETMET R7 R0 K6 + 0x7C1C0200, // 000C CALL R7 1 + 0x60200010, // 000D GETGBL R8 G16 + 0x8C240F07, // 000E GETMET R9 R7 K7 + 0x7C240200, // 000F CALL R9 1 + 0x7C200200, // 0010 CALL R8 1 + 0xA802000E, // 0011 EXBLK 0 #0021 + 0x5C241000, // 0012 MOVE R9 R8 + 0x7C240000, // 0013 CALL R9 0 + 0x8C280D08, // 0014 GETMET R10 R6 K8 + 0x7C280200, // 0015 CALL R10 1 + 0x8C2C1509, // 0016 GETMET R11 R10 K9 + 0x58340004, // 0017 LDCONST R13 K4 + 0x8838070A, // 0018 GETMBR R14 R3 K10 + 0x5C3C1200, // 0019 MOVE R15 R9 + 0x7C2C0800, // 001A CALL R11 4 + 0x8C2C1509, // 001B GETMET R11 R10 K9 + 0x5834000B, // 001C LDCONST R13 K11 + 0x8838070A, // 001D GETMBR R14 R3 K10 + 0x943C0E09, // 001E GETIDX R15 R7 R9 + 0x7C2C0800, // 001F CALL R11 4 + 0x7001FFF0, // 0020 JMP #0012 + 0x5820000C, // 0021 LDCONST R8 K12 + 0xAC200200, // 0022 CATCH R8 1 0 + 0xB0080000, // 0023 RAISE 2 R0 R0 + 0x80040C00, // 0024 RET 1 R6 + 0x70020032, // 0025 JMP #0059 + 0x1C180B0B, // 0026 EQ R6 R5 K11 + 0x781A0013, // 0027 JMPF R6 #003C + 0x8C180705, // 0028 GETMET R6 R3 K5 + 0x7C180200, // 0029 CALL R6 1 + 0x601C0010, // 002A GETGBL R7 G16 + 0x8C20010D, // 002B GETMET R8 R0 K13 + 0x7C200200, // 002C CALL R8 1 + 0x7C1C0200, // 002D CALL R7 1 + 0xA8020007, // 002E EXBLK 0 #0037 + 0x5C200E00, // 002F MOVE R8 R7 + 0x7C200000, // 0030 CALL R8 0 + 0x8C240D09, // 0031 GETMET R9 R6 K9 + 0x4C2C0000, // 0032 LDNIL R11 + 0x8830070E, // 0033 GETMBR R12 R3 K14 + 0x5C341000, // 0034 MOVE R13 R8 + 0x7C240800, // 0035 CALL R9 4 + 0x7001FFF7, // 0036 JMP #002F + 0x581C000C, // 0037 LDCONST R7 K12 + 0xAC1C0200, // 0038 CATCH R7 1 0 + 0xB0080000, // 0039 RAISE 2 R0 R0 + 0x80040C00, // 003A RET 1 R6 + 0x7002001C, // 003B JMP #0059 + 0x1C180B0F, // 003C EQ R6 R5 K15 + 0x781A0003, // 003D JMPF R6 #0042 + 0x8C180705, // 003E GETMET R6 R3 K5 + 0x7C180200, // 003F CALL R6 1 + 0x80040C00, // 0040 RET 1 R6 + 0x70020016, // 0041 JMP #0059 + 0x1C180B10, // 0042 EQ R6 R5 K16 + 0x781A0003, // 0043 JMPF R6 #0048 + 0x8C180705, // 0044 GETMET R6 R3 K5 + 0x7C180200, // 0045 CALL R6 1 + 0x80040C00, // 0046 RET 1 R6 + 0x70020010, // 0047 JMP #0059 + 0x541AFFFB, // 0048 LDINT R6 65532 + 0x1C180A06, // 0049 EQ R6 R5 R6 + 0x781A0005, // 004A JMPF R6 #0051 + 0x8C180711, // 004B GETMET R6 R3 K17 + 0x8820070E, // 004C GETMBR R8 R3 K14 + 0x58240004, // 004D LDCONST R9 K4 + 0x7C180600, // 004E CALL R6 3 + 0x80040C00, // 004F RET 1 R6 + 0x70020007, // 0050 JMP #0059 + 0x541AFFFC, // 0051 LDINT R6 65533 + 0x1C180A06, // 0052 EQ R6 R5 R6 + 0x781A0004, // 0053 JMPF R6 #0059 + 0x8C180711, // 0054 GETMET R6 R3 K17 + 0x8820070E, // 0055 GETMBR R8 R3 K14 + 0x5824000B, // 0056 LDCONST R9 K11 + 0x7C180600, // 0057 CALL R6 3 + 0x80040C00, // 0058 RET 1 R6 + 0x70020001, // 0059 JMP #005C + 0x4C180000, // 005A LDNIL R6 + 0x80040C00, // 005B RET 1 R6 + 0x80000000, // 005C RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: write_attribute +********************************************************************/ +be_local_closure(Matter_Plugin_write_attribute, /* name */ + be_nested_proto( + 5, /* nstack */ + 4, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 0, /* has constants */ + NULL, /* no const */ + be_str_weak(write_attribute), &be_const_str_solidified, ( &(const binstruction[ 2]) { /* code */ - 0x88040100, // 0000 GETMBR R1 R0 K0 - 0x80040200, // 0001 RET 1 R1 + 0x4C100000, // 0000 LDNIL R4 + 0x80040800, // 0001 RET 1 R4 }) ) ); @@ -602,11 +591,11 @@ be_local_closure(Matter_Plugin_subscribe_attribute, /* name */ /******************************************************************** -** Solidified function: every_second +** Solidified function: update_shadow ********************************************************************/ -be_local_closure(Matter_Plugin_every_second, /* name */ +be_local_closure(Matter_Plugin_update_shadow, /* name */ be_nested_proto( - 3, /* nstack */ + 2, /* nstack */ 1, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -614,40 +603,17 @@ be_local_closure(Matter_Plugin_every_second, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[ 1]) { /* constants */ - /* K0 */ be_nested_str_weak(update_shadow), + ( &(const bvalue[ 2]) { /* constants */ + /* K0 */ be_nested_str_weak(tick), + /* K1 */ be_nested_str_weak(device), }), - be_str_weak(every_second), + be_str_weak(update_shadow), &be_const_str_solidified, - ( &(const binstruction[ 3]) { /* code */ - 0x8C040100, // 0000 GETMET R1 R0 K0 - 0x7C040200, // 0001 CALL R1 1 - 0x80000000, // 0002 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: invoke_request -********************************************************************/ -be_local_closure(Matter_Plugin_invoke_request, /* name */ - be_nested_proto( - 5, /* nstack */ - 4, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 0, /* has constants */ - NULL, /* no const */ - be_str_weak(invoke_request), - &be_const_str_solidified, - ( &(const binstruction[ 2]) { /* code */ - 0x4C100000, // 0000 LDNIL R4 - 0x80040800, // 0001 RET 1 R4 + ( &(const binstruction[ 4]) { /* code */ + 0x88040101, // 0000 GETMBR R1 R0 K1 + 0x88040300, // 0001 GETMBR R1 R1 K0 + 0x90020001, // 0002 SETMBR R0 K0 R1 + 0x80000000, // 0003 RET 0 }) ) ); @@ -689,52 +655,9 @@ be_local_closure(Matter_Plugin_init, /* name */ /******************************************************************** -** Solidified function: has +** Solidified function: read_event ********************************************************************/ -be_local_closure(Matter_Plugin_has, /* name */ - be_nested_proto( - 6, /* nstack */ - 3, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 4]) { /* constants */ - /* K0 */ be_nested_str_weak(clusters), - /* K1 */ be_nested_str_weak(contains), - /* K2 */ be_nested_str_weak(endpoints), - /* K3 */ be_nested_str_weak(find), - }), - be_str_weak(has), - &be_const_str_solidified, - ( &(const binstruction[15]) { /* code */ - 0x880C0100, // 0000 GETMBR R3 R0 K0 - 0x8C0C0701, // 0001 GETMET R3 R3 K1 - 0x5C140200, // 0002 MOVE R5 R1 - 0x7C0C0400, // 0003 CALL R3 2 - 0x780E0006, // 0004 JMPF R3 #000C - 0x880C0102, // 0005 GETMBR R3 R0 K2 - 0x8C0C0703, // 0006 GETMET R3 R3 K3 - 0x5C140400, // 0007 MOVE R5 R2 - 0x7C0C0400, // 0008 CALL R3 2 - 0x4C100000, // 0009 LDNIL R4 - 0x200C0604, // 000A NE R3 R3 R4 - 0x740E0000, // 000B JMPT R3 #000D - 0x500C0001, // 000C LDBOOL R3 0 1 - 0x500C0200, // 000D LDBOOL R3 1 0 - 0x80040600, // 000E RET 1 R3 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: subscribe_event -********************************************************************/ -be_local_closure(Matter_Plugin_subscribe_event, /* name */ +be_local_closure(Matter_Plugin_read_event, /* name */ be_nested_proto( 6, /* nstack */ 5, /* argc */ @@ -745,7 +668,7 @@ be_local_closure(Matter_Plugin_subscribe_event, /* name */ NULL, /* no sub protos */ 0, /* has constants */ NULL, /* no const */ - be_str_weak(subscribe_event), + be_str_weak(read_event), &be_const_str_solidified, ( &(const binstruction[ 2]) { /* code */ 0x4C140000, // 0000 LDNIL R5 @@ -756,22 +679,259 @@ be_local_closure(Matter_Plugin_subscribe_event, /* name */ /*******************************************************************/ +/******************************************************************** +** Solidified function: get_types +********************************************************************/ +be_local_closure(Matter_Plugin_get_types, /* name */ + be_nested_proto( + 2, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 1]) { /* constants */ + /* K0 */ be_nested_str_weak(TYPES), + }), + be_str_weak(get_types), + &be_const_str_solidified, + ( &(const binstruction[ 2]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x80040200, // 0001 RET 1 R1 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: ui_string_to_conf +********************************************************************/ +be_local_closure(Matter_Plugin_ui_string_to_conf, /* name */ + be_nested_proto( + 8, /* nstack */ + 3, /* argc */ + 4, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 3]) { /* constants */ + /* K0 */ be_const_class(be_class_Matter_Plugin), + /* K1 */ be_nested_str_weak(ARG), + /* K2 */ be_nested_str_weak(ARG_TYPE), + }), + be_str_weak(ui_string_to_conf), + &be_const_str_solidified, + ( &(const binstruction[10]) { /* code */ + 0x580C0000, // 0000 LDCONST R3 K0 + 0x88100101, // 0001 GETMBR R4 R0 K1 + 0x88140102, // 0002 GETMBR R5 R0 K2 + 0x780A0004, // 0003 JMPF R2 #0009 + 0x78120003, // 0004 JMPF R4 #0009 + 0x5C180A00, // 0005 MOVE R6 R5 + 0x5C1C0400, // 0006 MOVE R7 R2 + 0x7C180200, // 0007 CALL R6 1 + 0x98040806, // 0008 SETIDX R1 R4 R6 + 0x80040200, // 0009 RET 1 R1 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: invoke_request +********************************************************************/ +be_local_closure(Matter_Plugin_invoke_request, /* name */ + be_nested_proto( + 5, /* nstack */ + 4, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 0, /* has constants */ + NULL, /* no const */ + be_str_weak(invoke_request), + &be_const_str_solidified, + ( &(const binstruction[ 2]) { /* code */ + 0x4C100000, // 0000 LDNIL R4 + 0x80040800, // 0001 RET 1 R4 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: parse_sensors +********************************************************************/ +be_local_closure(Matter_Plugin_parse_sensors, /* name */ + be_nested_proto( + 2, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 0, /* has constants */ + NULL, /* no const */ + be_str_weak(parse_sensors), + &be_const_str_solidified, + ( &(const binstruction[ 1]) { /* code */ + 0x80000000, // 0000 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: every_250ms +********************************************************************/ +be_local_closure(Matter_Plugin_every_250ms, /* name */ + be_nested_proto( + 6, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[11]) { /* constants */ + /* K0 */ be_nested_str_weak(update_next), + /* K1 */ be_nested_str_weak(crypto), + /* K2 */ be_nested_str_weak(random), + /* K3 */ be_nested_str_weak(get), + /* K4 */ be_const_int(0), + /* K5 */ be_const_int(2147483647), + /* K6 */ be_nested_str_weak(tasmota), + /* K7 */ be_nested_str_weak(millis), + /* K8 */ be_nested_str_weak(UPDATE_TIME), + /* K9 */ be_nested_str_weak(time_reached), + /* K10 */ be_nested_str_weak(update_shadow_lazy), + }), + be_str_weak(every_250ms), + &be_const_str_solidified, + ( &(const binstruction[33]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x4C080000, // 0001 LDNIL R2 + 0x1C040202, // 0002 EQ R1 R1 R2 + 0x7806000F, // 0003 JMPF R1 #0014 + 0xA4060200, // 0004 IMPORT R1 K1 + 0x8C080302, // 0005 GETMET R2 R1 K2 + 0x54120003, // 0006 LDINT R4 4 + 0x7C080400, // 0007 CALL R2 2 + 0x8C080503, // 0008 GETMET R2 R2 K3 + 0x58100004, // 0009 LDCONST R4 K4 + 0x54160003, // 000A LDINT R5 4 + 0x7C080600, // 000B CALL R2 3 + 0x2C080505, // 000C AND R2 R2 K5 + 0xB80E0C00, // 000D GETNGBL R3 K6 + 0x8C0C0707, // 000E GETMET R3 R3 K7 + 0x88140108, // 000F GETMBR R5 R0 K8 + 0x10140405, // 0010 MOD R5 R2 R5 + 0x7C0C0400, // 0011 CALL R3 2 + 0x90020003, // 0012 SETMBR R0 K0 R3 + 0x7002000B, // 0013 JMP #0020 + 0xB8060C00, // 0014 GETNGBL R1 K6 + 0x8C040309, // 0015 GETMET R1 R1 K9 + 0x880C0100, // 0016 GETMBR R3 R0 K0 + 0x7C040400, // 0017 CALL R1 2 + 0x78060006, // 0018 JMPF R1 #0020 + 0x8C04010A, // 0019 GETMET R1 R0 K10 + 0x7C040200, // 001A CALL R1 1 + 0xB8060C00, // 001B GETNGBL R1 K6 + 0x8C040307, // 001C GETMET R1 R1 K7 + 0x880C0108, // 001D GETMBR R3 R0 K8 + 0x7C040400, // 001E CALL R1 2 + 0x90020001, // 001F SETMBR R0 K0 R1 + 0x80000000, // 0020 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: ui_conf_to_string +********************************************************************/ +be_local_closure(Matter_Plugin_ui_conf_to_string, /* name */ + be_nested_proto( + 9, /* nstack */ + 2, /* argc */ + 4, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 4]) { /* constants */ + /* K0 */ be_const_class(be_class_Matter_Plugin), + /* K1 */ be_nested_str_weak(ARG), + /* K2 */ be_nested_str_weak(find), + /* K3 */ be_nested_str_weak(), + }), + be_str_weak(ui_conf_to_string), + &be_const_str_solidified, + ( &(const binstruction[12]) { /* code */ + 0x58080000, // 0000 LDCONST R2 K0 + 0x880C0101, // 0001 GETMBR R3 R0 K1 + 0x780E0006, // 0002 JMPF R3 #000A + 0x60100008, // 0003 GETGBL R4 G8 + 0x8C140302, // 0004 GETMET R5 R1 K2 + 0x5C1C0600, // 0005 MOVE R7 R3 + 0x58200003, // 0006 LDCONST R8 K3 + 0x7C140600, // 0007 CALL R5 3 + 0x7C100200, // 0008 CALL R4 1 + 0x70020000, // 0009 JMP #000B + 0x58100003, // 000A LDCONST R4 K3 + 0x80040800, // 000B RET 1 R4 + }) + ) +); +/*******************************************************************/ + + /******************************************************************** ** Solidified class: Matter_Plugin ********************************************************************/ be_local_class(Matter_Plugin, - 4, + 5, NULL, - be_nested_map(27, + be_nested_map(32, ( (struct bmapnode*) &(const bmapnode[]) { - { be_const_key_weak(read_event, 6), be_const_closure(Matter_Plugin_read_event_closure) }, - { be_const_key_weak(TYPE, 18), be_nested_str_weak() }, - { be_const_key_weak(update_shadow, -1), be_const_closure(Matter_Plugin_update_shadow_closure) }, + { be_const_key_weak(ARG_TYPE, 5), be_const_static_closure(Matter_Plugin__X3Clambda_X3E_closure) }, { be_const_key_weak(get_attribute_list, -1), be_const_closure(Matter_Plugin_get_attribute_list_closure) }, - { be_const_key_weak(init, -1), be_const_closure(Matter_Plugin_init_closure) }, - { be_const_key_weak(tick, -1), be_const_var(3) }, - { be_const_key_weak(ARG, -1), be_nested_str_weak() }, - { be_const_key_weak(get_cluster_list, 2), be_const_closure(Matter_Plugin_get_cluster_list_closure) }, + { be_const_key_weak(ui_conf_to_string, 11), be_const_static_closure(Matter_Plugin_ui_conf_to_string_closure) }, + { be_const_key_weak(has, -1), be_const_closure(Matter_Plugin_has_closure) }, + { be_const_key_weak(tick, -1), be_const_var(4) }, + { be_const_key_weak(every_250ms, -1), be_const_closure(Matter_Plugin_every_250ms_closure) }, + { be_const_key_weak(NAME, -1), be_nested_str_weak() }, + { be_const_key_weak(ARG, 16), be_nested_str_weak() }, + { be_const_key_weak(UPDATE_TIME, -1), be_const_int(5000) }, + { be_const_key_weak(get_endpoint, -1), be_const_closure(Matter_Plugin_get_endpoint_closure) }, + { be_const_key_weak(timed_request, -1), be_const_closure(Matter_Plugin_timed_request_closure) }, + { be_const_key_weak(clusters, 17), be_const_var(3) }, + { be_const_key_weak(subscribe_event, 30), be_const_closure(Matter_Plugin_subscribe_event_closure) }, + { be_const_key_weak(TYPE, -1), be_nested_str_weak() }, + { be_const_key_weak(parse_sensors, 29), be_const_closure(Matter_Plugin_parse_sensors_closure) }, + { be_const_key_weak(attribute_updated, -1), be_const_closure(Matter_Plugin_attribute_updated_closure) }, + { be_const_key_weak(get_cluster_list, -1), be_const_closure(Matter_Plugin_get_cluster_list_closure) }, + { be_const_key_weak(ui_string_to_conf, 22), be_const_static_closure(Matter_Plugin_ui_string_to_conf_closure) }, + { be_const_key_weak(device, -1), be_const_var(1) }, + { be_const_key_weak(write_attribute, 23), be_const_closure(Matter_Plugin_write_attribute_closure) }, + { be_const_key_weak(subscribe_attribute, -1), be_const_closure(Matter_Plugin_subscribe_attribute_closure) }, + { be_const_key_weak(update_shadow, -1), be_const_closure(Matter_Plugin_update_shadow_closure) }, + { be_const_key_weak(read_event, 24), be_const_closure(Matter_Plugin_read_event_closure) }, + { be_const_key_weak(init, 18), be_const_closure(Matter_Plugin_init_closure) }, { be_const_key_weak(CLUSTERS, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { be_const_map( * be_nested_map(1, ( (struct bmapnode*) &(const bmapnode[]) { @@ -786,24 +946,13 @@ be_local_class(Matter_Plugin, be_const_int(65533), })) ) } )) }, })) ) } )) }, - { be_const_key_weak(parse_sensors, -1), be_const_closure(Matter_Plugin_parse_sensors_closure) }, - { be_const_key_weak(clusters, -1), be_const_var(2) }, - { be_const_key_weak(consolidate_clusters, -1), be_const_closure(Matter_Plugin_consolidate_clusters_closure) }, - { be_const_key_weak(NAME, 3), be_nested_str_weak() }, - { be_const_key_weak(subscribe_attribute, 20), be_const_closure(Matter_Plugin_subscribe_attribute_closure) }, - { be_const_key_weak(timed_request, -1), be_const_closure(Matter_Plugin_timed_request_closure) }, - { be_const_key_weak(read_attribute, 9), be_const_closure(Matter_Plugin_read_attribute_closure) }, - { be_const_key_weak(write_attribute, 13), be_const_closure(Matter_Plugin_write_attribute_closure) }, - { be_const_key_weak(update_shadow_lazy, -1), be_const_closure(Matter_Plugin_update_shadow_lazy_closure) }, - { be_const_key_weak(ARG_TYPE, -1), be_const_static_closure(Matter_Plugin__X3Clambda_X3E_closure) }, - { be_const_key_weak(get_endpoint, -1), be_const_closure(Matter_Plugin_get_endpoint_closure) }, - { be_const_key_weak(endpoint, -1), be_const_var(1) }, - { be_const_key_weak(every_second, -1), be_const_closure(Matter_Plugin_every_second_closure) }, - { be_const_key_weak(attribute_updated, 8), be_const_closure(Matter_Plugin_attribute_updated_closure) }, + { be_const_key_weak(get_types, -1), be_const_closure(Matter_Plugin_get_types_closure) }, + { be_const_key_weak(read_attribute, 2), be_const_closure(Matter_Plugin_read_attribute_closure) }, { be_const_key_weak(invoke_request, -1), be_const_closure(Matter_Plugin_invoke_request_closure) }, - { be_const_key_weak(device, 4), be_const_var(0) }, - { be_const_key_weak(has, -1), be_const_closure(Matter_Plugin_has_closure) }, - { be_const_key_weak(subscribe_event, -1), be_const_closure(Matter_Plugin_subscribe_event_closure) }, + { be_const_key_weak(update_next, 14), be_const_var(0) }, + { be_const_key_weak(endpoint, 31), be_const_var(2) }, + { be_const_key_weak(update_shadow_lazy, -1), be_const_closure(Matter_Plugin_update_shadow_lazy_closure) }, + { be_const_key_weak(consolidate_clusters, -1), be_const_closure(Matter_Plugin_consolidate_clusters_closure) }, })), be_str_weak(Matter_Plugin) ); diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_HTTP.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_HTTP.h new file mode 100644 index 000000000..1fd4d331a --- /dev/null +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_HTTP.h @@ -0,0 +1,665 @@ +/* Solidification of Matter_Plugin_Bridge_HTTP.h */ +/********************************************************************\ +* Generated code, don't edit * +\********************************************************************/ +#include "be_constobj.h" + +extern const bclass be_class_Matter_Plugin_Bridge_HTTP; + +/******************************************************************** +** Solidified function: get_types +********************************************************************/ +be_local_closure(Matter_Plugin_Bridge_HTTP_get_types, /* name */ + be_nested_proto( + 5, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 4]) { /* constants */ + /* K0 */ be_nested_str_weak(TYPES), + /* K1 */ be_nested_str_weak(keys), + /* K2 */ be_nested_str_weak(stop_iteration), + /* K3 */ be_const_int(1), + }), + be_str_weak(get_types), + &be_const_str_solidified, + ( &(const binstruction[20]) { /* code */ + 0x60040013, // 0000 GETGBL R1 G19 + 0x7C040000, // 0001 CALL R1 0 + 0x60080010, // 0002 GETGBL R2 G16 + 0x880C0100, // 0003 GETMBR R3 R0 K0 + 0x8C0C0701, // 0004 GETMET R3 R3 K1 + 0x7C0C0200, // 0005 CALL R3 1 + 0x7C080200, // 0006 CALL R2 1 + 0xA8020005, // 0007 EXBLK 0 #000E + 0x5C0C0400, // 0008 MOVE R3 R2 + 0x7C0C0000, // 0009 CALL R3 0 + 0x88100100, // 000A GETMBR R4 R0 K0 + 0x94100803, // 000B GETIDX R4 R4 R3 + 0x98040604, // 000C SETIDX R1 R3 R4 + 0x7001FFF9, // 000D JMP #0008 + 0x58080002, // 000E LDCONST R2 K2 + 0xAC080200, // 000F CATCH R2 1 0 + 0xB0080000, // 0010 RAISE 2 R0 R0 + 0x540A0012, // 0011 LDINT R2 19 + 0x98040503, // 0012 SETIDX R1 R2 K3 + 0x80040200, // 0013 RET 1 R1 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: is_reachable +********************************************************************/ +be_local_closure(Matter_Plugin_Bridge_HTTP_is_reachable, /* name */ + be_nested_proto( + 5, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 6]) { /* constants */ + /* K0 */ be_nested_str_weak(device), + /* K1 */ be_nested_str_weak(tick), + /* K2 */ be_nested_str_weak(reachable_tick), + /* K3 */ be_nested_str_weak(call_remote), + /* K4 */ be_nested_str_weak(), + /* K5 */ be_nested_str_weak(reachable), + }), + be_str_weak(is_reachable), + &be_const_str_solidified, + ( &(const binstruction[14]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x88040301, // 0001 GETMBR R1 R1 K1 + 0x88080102, // 0002 GETMBR R2 R0 K2 + 0x20040202, // 0003 NE R1 R1 R2 + 0x78060006, // 0004 JMPF R1 #000C + 0x8C040103, // 0005 GETMET R1 R0 K3 + 0x580C0004, // 0006 LDCONST R3 K4 + 0x58100004, // 0007 LDCONST R4 K4 + 0x7C040600, // 0008 CALL R1 3 + 0x4C080000, // 0009 LDNIL R2 + 0x20080202, // 000A NE R2 R1 R2 + 0x90020A02, // 000B SETMBR R0 K5 R2 + 0x88040105, // 000C GETMBR R1 R0 K5 + 0x80040200, // 000D RET 1 R1 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: read_attribute +********************************************************************/ +be_local_closure(Matter_Plugin_Bridge_HTTP_read_attribute, /* name */ + be_nested_proto( + 10, /* nstack */ + 3, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 8]) { /* constants */ + /* K0 */ be_nested_str_weak(matter), + /* K1 */ be_nested_str_weak(TLV), + /* K2 */ be_nested_str_weak(cluster), + /* K3 */ be_nested_str_weak(attribute), + /* K4 */ be_const_int(0), + /* K5 */ be_nested_str_weak(create_TLV), + /* K6 */ be_nested_str_weak(BOOL), + /* K7 */ be_nested_str_weak(read_attribute), + }), + be_str_weak(read_attribute), + &be_const_str_solidified, + ( &(const binstruction[28]) { /* code */ + 0xB80E0000, // 0000 GETNGBL R3 K0 + 0x880C0701, // 0001 GETMBR R3 R3 K1 + 0x88100502, // 0002 GETMBR R4 R2 K2 + 0x88140503, // 0003 GETMBR R5 R2 K3 + 0x541A0038, // 0004 LDINT R6 57 + 0x1C180806, // 0005 EQ R6 R4 R6 + 0x781A000B, // 0006 JMPF R6 #0013 + 0x1C180B04, // 0007 EQ R6 R5 K4 + 0x781A0000, // 0008 JMPF R6 #000A + 0x70020007, // 0009 JMP #0012 + 0x541A0010, // 000A LDINT R6 17 + 0x1C180A06, // 000B EQ R6 R5 R6 + 0x781A0004, // 000C JMPF R6 #0012 + 0x8C180705, // 000D GETMET R6 R3 K5 + 0x88200706, // 000E GETMBR R8 R3 K6 + 0x50240200, // 000F LDBOOL R9 1 0 + 0x7C180600, // 0010 CALL R6 3 + 0x80040C00, // 0011 RET 1 R6 + 0x70020007, // 0012 JMP #001B + 0x60180003, // 0013 GETGBL R6 G3 + 0x5C1C0000, // 0014 MOVE R7 R0 + 0x7C180200, // 0015 CALL R6 1 + 0x8C180D07, // 0016 GETMET R6 R6 K7 + 0x5C200200, // 0017 MOVE R8 R1 + 0x5C240400, // 0018 MOVE R9 R2 + 0x7C180600, // 0019 CALL R6 3 + 0x80040C00, // 001A RET 1 R6 + 0x80000000, // 001B RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: get_status_11 +********************************************************************/ +be_local_closure(Matter_Plugin_Bridge_HTTP_get_status_11, /* name */ + be_nested_proto( + 6, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 8]) { /* constants */ + /* K0 */ be_nested_str_weak(device), + /* K1 */ be_nested_str_weak(tick), + /* K2 */ be_nested_str_weak(tasmota_status_11), + /* K3 */ be_nested_str_weak(find), + /* K4 */ be_nested_str_weak(_tick), + /* K5 */ be_nested_str_weak(call_remote), + /* K6 */ be_nested_str_weak(Status), + /* K7 */ be_nested_str_weak(11), + }), + be_str_weak(get_status_11), + &be_const_str_solidified, + ( &(const binstruction[27]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x88040301, // 0001 GETMBR R1 R1 K1 + 0x88080102, // 0002 GETMBR R2 R0 K2 + 0x4C0C0000, // 0003 LDNIL R3 + 0x1C080403, // 0004 EQ R2 R2 R3 + 0x740A0005, // 0005 JMPT R2 #000C + 0x88080102, // 0006 GETMBR R2 R0 K2 + 0x8C080503, // 0007 GETMET R2 R2 K3 + 0x58100004, // 0008 LDCONST R4 K4 + 0x7C080400, // 0009 CALL R2 2 + 0x20080401, // 000A NE R2 R2 R1 + 0x780A000B, // 000B JMPF R2 #0018 + 0x8C080105, // 000C GETMET R2 R0 K5 + 0x58100006, // 000D LDCONST R4 K6 + 0x58140007, // 000E LDCONST R5 K7 + 0x7C080600, // 000F CALL R2 3 + 0x780A0003, // 0010 JMPF R2 #0015 + 0x980A0801, // 0011 SETIDX R2 K4 R1 + 0x90020402, // 0012 SETMBR R0 K2 R2 + 0x80040400, // 0013 RET 1 R2 + 0x70020001, // 0014 JMP #0017 + 0x4C0C0000, // 0015 LDNIL R3 + 0x80040600, // 0016 RET 1 R3 + 0x70020001, // 0017 JMP #001A + 0x88080102, // 0018 GETMBR R2 R0 K2 + 0x80040400, // 0019 RET 1 R2 + 0x80000000, // 001A RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: ui_string_to_conf +********************************************************************/ +be_local_closure(Matter_Plugin_Bridge_HTTP_ui_string_to_conf, /* name */ + be_nested_proto( + 11, /* nstack */ + 3, /* argc */ + 4, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 9]) { /* constants */ + /* K0 */ be_const_class(be_class_Matter_Plugin_Bridge_HTTP), + /* K1 */ be_nested_str_weak(string), + /* K2 */ be_nested_str_weak(split), + /* K3 */ be_nested_str_weak(_X2C), + /* K4 */ be_const_int(3), + /* K5 */ be_nested_str_weak(ARG_HTTP), + /* K6 */ be_const_int(1), + /* K7 */ be_nested_str_weak(ui_string_to_conf), + /* K8 */ be_const_int(0), + }), + be_str_weak(ui_string_to_conf), + &be_const_str_solidified, + ( &(const binstruction[24]) { /* code */ + 0x580C0000, // 0000 LDCONST R3 K0 + 0xA4120200, // 0001 IMPORT R4 K1 + 0x8C140902, // 0002 GETMET R5 R4 K2 + 0x001C0503, // 0003 ADD R7 R2 K3 + 0x58200003, // 0004 LDCONST R8 K3 + 0x58240004, // 0005 LDCONST R9 K4 + 0x7C140800, // 0006 CALL R5 4 + 0x88180705, // 0007 GETMBR R6 R3 K5 + 0x941C0B06, // 0008 GETIDX R7 R5 K6 + 0x98040C07, // 0009 SETIDX R1 R6 R7 + 0x60180003, // 000A GETGBL R6 G3 + 0x5C1C0600, // 000B MOVE R7 R3 + 0x7C180200, // 000C CALL R6 1 + 0x8C180D07, // 000D GETMET R6 R6 K7 + 0x5C200000, // 000E MOVE R8 R0 + 0x5C240200, // 000F MOVE R9 R1 + 0x94280B08, // 0010 GETIDX R10 R5 K8 + 0x7C180800, // 0011 CALL R6 4 + 0x60180001, // 0012 GETGBL R6 G1 + 0x581C0007, // 0013 LDCONST R7 K7 + 0x5C200200, // 0014 MOVE R8 R1 + 0x5C240400, // 0015 MOVE R9 R2 + 0x7C180600, // 0016 CALL R6 3 + 0x80040200, // 0017 RET 1 R1 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: call_remote +********************************************************************/ +be_local_closure(Matter_Plugin_Bridge_HTTP_call_remote, /* name */ + be_nested_proto( + 14, /* nstack */ + 3, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[31]) { /* constants */ + /* K0 */ be_nested_str_weak(tasmota_http), + /* K1 */ be_nested_str_weak(json), + /* K2 */ be_nested_str_weak(string), + /* K3 */ be_nested_str_weak(tasmota), + /* K4 */ be_nested_str_weak(wifi), + /* K5 */ be_nested_str_weak(up), + /* K6 */ be_nested_str_weak(eth), + /* K7 */ be_const_int(2), + /* K8 */ be_const_int(0), + /* K9 */ be_nested_str_weak(webclient), + /* K10 */ be_nested_str_weak(set_timeouts), + /* K11 */ be_nested_str_weak(set_follow_redirects), + /* K12 */ be_nested_str_weak(format), + /* K13 */ be_nested_str_weak(_X25scm_X3Fcmnd_X3D_X25s_X25_X2520_X25s), + /* K14 */ be_nested_str_weak(), + /* K15 */ be_nested_str_weak(log), + /* K16 */ be_nested_str_weak(MTR_X3A_X20HTTP_X20GET_X20), + /* K17 */ be_const_int(3), + /* K18 */ be_nested_str_weak(begin), + /* K19 */ be_nested_str_weak(GET), + /* K20 */ be_nested_str_weak(MTR_X3A_X20HTTP_X20GET_X20code_X3D), + /* K21 */ be_nested_str_weak(get_string), + /* K22 */ be_nested_str_weak(close), + /* K23 */ be_nested_str_weak(MTR_X3A_X20HTTP_X20GET_X20payload_X3D), + /* K24 */ be_nested_str_weak(load), + /* K25 */ be_nested_str_weak(reachable), + /* K26 */ be_nested_str_weak(reachable_tick), + /* K27 */ be_nested_str_weak(device), + /* K28 */ be_nested_str_weak(tick), + /* K29 */ be_const_int(1), + /* K30 */ be_nested_str_weak(MTR_X3A_X20HTTP_X20GET_X20retrying), + }), + be_str_weak(call_remote), + &be_const_str_solidified, + ( &(const binstruction[91]) { /* code */ + 0x880C0100, // 0000 GETMBR R3 R0 K0 + 0x740E0001, // 0001 JMPT R3 #0004 + 0x4C0C0000, // 0002 LDNIL R3 + 0x80040600, // 0003 RET 1 R3 + 0xA40E0200, // 0004 IMPORT R3 K1 + 0xA4120400, // 0005 IMPORT R4 K2 + 0xB8160600, // 0006 GETNGBL R5 K3 + 0x8C140B04, // 0007 GETMET R5 R5 K4 + 0x7C140200, // 0008 CALL R5 1 + 0x94140B05, // 0009 GETIDX R5 R5 K5 + 0x74160006, // 000A JMPT R5 #0012 + 0xB8160600, // 000B GETNGBL R5 K3 + 0x8C140B06, // 000C GETMET R5 R5 K6 + 0x7C140200, // 000D CALL R5 1 + 0x94140B05, // 000E GETIDX R5 R5 K5 + 0x74160001, // 000F JMPT R5 #0012 + 0x4C140000, // 0010 LDNIL R5 + 0x80040A00, // 0011 RET 1 R5 + 0x58140007, // 0012 LDCONST R5 K7 + 0x24180B08, // 0013 GT R6 R5 K8 + 0x781A0041, // 0014 JMPF R6 #0057 + 0xB81A1200, // 0015 GETNGBL R6 K9 + 0x7C180000, // 0016 CALL R6 0 + 0x8C1C0D0A, // 0017 GETMET R7 R6 K10 + 0x542603E7, // 0018 LDINT R9 1000 + 0x542A03E7, // 0019 LDINT R10 1000 + 0x7C1C0600, // 001A CALL R7 3 + 0x8C1C0D0B, // 001B GETMET R7 R6 K11 + 0x50240000, // 001C LDBOOL R9 0 0 + 0x7C1C0400, // 001D CALL R7 2 + 0x8C1C090C, // 001E GETMET R7 R4 K12 + 0x5824000D, // 001F LDCONST R9 K13 + 0x88280100, // 0020 GETMBR R10 R0 K0 + 0x5C2C0200, // 0021 MOVE R11 R1 + 0x780A0001, // 0022 JMPF R2 #0025 + 0x5C300400, // 0023 MOVE R12 R2 + 0x70020000, // 0024 JMP #0026 + 0x5830000E, // 0025 LDCONST R12 K14 + 0x7C1C0A00, // 0026 CALL R7 5 + 0xB8220600, // 0027 GETNGBL R8 K3 + 0x8C20110F, // 0028 GETMET R8 R8 K15 + 0x002A2007, // 0029 ADD R10 K16 R7 + 0x582C0011, // 002A LDCONST R11 K17 + 0x7C200600, // 002B CALL R8 3 + 0x8C200D12, // 002C GETMET R8 R6 K18 + 0x5C280E00, // 002D MOVE R10 R7 + 0x7C200400, // 002E CALL R8 2 + 0x8C200D13, // 002F GETMET R8 R6 K19 + 0x7C200200, // 0030 CALL R8 1 + 0xB8260600, // 0031 GETNGBL R9 K3 + 0x8C24130F, // 0032 GETMET R9 R9 K15 + 0x602C0008, // 0033 GETGBL R11 G8 + 0x5C301000, // 0034 MOVE R12 R8 + 0x7C2C0200, // 0035 CALL R11 1 + 0x002E280B, // 0036 ADD R11 K20 R11 + 0x58300011, // 0037 LDCONST R12 K17 + 0x7C240600, // 0038 CALL R9 3 + 0x542600C7, // 0039 LDINT R9 200 + 0x1C241009, // 003A EQ R9 R8 R9 + 0x78260011, // 003B JMPF R9 #004E + 0x8C240D15, // 003C GETMET R9 R6 K21 + 0x7C240200, // 003D CALL R9 1 + 0x8C280D16, // 003E GETMET R10 R6 K22 + 0x7C280200, // 003F CALL R10 1 + 0xB82A0600, // 0040 GETNGBL R10 K3 + 0x8C28150F, // 0041 GETMET R10 R10 K15 + 0x00322E09, // 0042 ADD R12 K23 R9 + 0x58340011, // 0043 LDCONST R13 K17 + 0x7C280600, // 0044 CALL R10 3 + 0x8C280718, // 0045 GETMET R10 R3 K24 + 0x5C301200, // 0046 MOVE R12 R9 + 0x7C280400, // 0047 CALL R10 2 + 0x502C0200, // 0048 LDBOOL R11 1 0 + 0x9002320B, // 0049 SETMBR R0 K25 R11 + 0x882C011B, // 004A GETMBR R11 R0 K27 + 0x882C171C, // 004B GETMBR R11 R11 K28 + 0x9002340B, // 004C SETMBR R0 K26 R11 + 0x80041400, // 004D RET 1 R10 + 0x8C240D16, // 004E GETMET R9 R6 K22 + 0x7C240200, // 004F CALL R9 1 + 0x04140B1D, // 0050 SUB R5 R5 K29 + 0xB8260600, // 0051 GETNGBL R9 K3 + 0x8C24130F, // 0052 GETMET R9 R9 K15 + 0x582C001E, // 0053 LDCONST R11 K30 + 0x58300011, // 0054 LDCONST R12 K17 + 0x7C240600, // 0055 CALL R9 3 + 0x7001FFBB, // 0056 JMP #0013 + 0x50180000, // 0057 LDBOOL R6 0 0 + 0x90023206, // 0058 SETMBR R0 K25 R6 + 0x4C180000, // 0059 LDNIL R6 + 0x80040C00, // 005A RET 1 R6 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: get_status_8 +********************************************************************/ +be_local_closure(Matter_Plugin_Bridge_HTTP_get_status_8, /* name */ + be_nested_proto( + 6, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 8]) { /* constants */ + /* K0 */ be_nested_str_weak(device), + /* K1 */ be_nested_str_weak(tick), + /* K2 */ be_nested_str_weak(tasmota_status_8), + /* K3 */ be_nested_str_weak(find), + /* K4 */ be_nested_str_weak(_tick), + /* K5 */ be_nested_str_weak(call_remote), + /* K6 */ be_nested_str_weak(Status), + /* K7 */ be_nested_str_weak(8), + }), + be_str_weak(get_status_8), + &be_const_str_solidified, + ( &(const binstruction[27]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x88040301, // 0001 GETMBR R1 R1 K1 + 0x88080102, // 0002 GETMBR R2 R0 K2 + 0x4C0C0000, // 0003 LDNIL R3 + 0x1C080403, // 0004 EQ R2 R2 R3 + 0x740A0005, // 0005 JMPT R2 #000C + 0x88080102, // 0006 GETMBR R2 R0 K2 + 0x8C080503, // 0007 GETMET R2 R2 K3 + 0x58100004, // 0008 LDCONST R4 K4 + 0x7C080400, // 0009 CALL R2 2 + 0x20080401, // 000A NE R2 R2 R1 + 0x780A000B, // 000B JMPF R2 #0018 + 0x8C080105, // 000C GETMET R2 R0 K5 + 0x58100006, // 000D LDCONST R4 K6 + 0x58140007, // 000E LDCONST R5 K7 + 0x7C080600, // 000F CALL R2 3 + 0x780A0003, // 0010 JMPF R2 #0015 + 0x980A0801, // 0011 SETIDX R2 K4 R1 + 0x90020402, // 0012 SETMBR R0 K2 R2 + 0x80040400, // 0013 RET 1 R2 + 0x70020001, // 0014 JMP #0017 + 0x4C0C0000, // 0015 LDNIL R3 + 0x80040600, // 0016 RET 1 R3 + 0x70020001, // 0017 JMP #001A + 0x88080102, // 0018 GETMBR R2 R0 K2 + 0x80040400, // 0019 RET 1 R2 + 0x80000000, // 001A RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: ui_conf_to_string +********************************************************************/ +be_local_closure(Matter_Plugin_Bridge_HTTP_ui_conf_to_string, /* name */ + be_nested_proto( + 11, /* nstack */ + 2, /* argc */ + 4, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 7]) { /* constants */ + /* K0 */ be_const_class(be_class_Matter_Plugin_Bridge_HTTP), + /* K1 */ be_nested_str_weak(ui_conf_to_string), + /* K2 */ be_nested_str_weak(find), + /* K3 */ be_nested_str_weak(ARG_HTTP), + /* K4 */ be_nested_str_weak(), + /* K5 */ be_nested_str_weak(_X2C), + /* K6 */ be_nested_str_weak(MTR_X3A_X20ui_conf_to_string), + }), + be_str_weak(ui_conf_to_string), + &be_const_str_solidified, + ( &(const binstruction[23]) { /* code */ + 0x58080000, // 0000 LDCONST R2 K0 + 0x600C0003, // 0001 GETGBL R3 G3 + 0x5C100400, // 0002 MOVE R4 R2 + 0x7C0C0200, // 0003 CALL R3 1 + 0x8C0C0701, // 0004 GETMET R3 R3 K1 + 0x5C140000, // 0005 MOVE R5 R0 + 0x5C180200, // 0006 MOVE R6 R1 + 0x7C0C0600, // 0007 CALL R3 3 + 0x60100008, // 0008 GETGBL R4 G8 + 0x8C140302, // 0009 GETMET R5 R1 K2 + 0x881C0503, // 000A GETMBR R7 R2 K3 + 0x58200004, // 000B LDCONST R8 K4 + 0x7C140600, // 000C CALL R5 3 + 0x7C100200, // 000D CALL R4 1 + 0x00140705, // 000E ADD R5 R3 K5 + 0x00140A04, // 000F ADD R5 R5 R4 + 0x60180001, // 0010 GETGBL R6 G1 + 0x581C0006, // 0011 LDCONST R7 K6 + 0x5C200200, // 0012 MOVE R8 R1 + 0x5C240000, // 0013 MOVE R9 R0 + 0x5C280A00, // 0014 MOVE R10 R5 + 0x7C180800, // 0015 CALL R6 4 + 0x80040A00, // 0016 RET 1 R5 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: init +********************************************************************/ +be_local_closure(Matter_Plugin_Bridge_HTTP_init, /* name */ + be_nested_proto( + 12, /* nstack */ + 4, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[17]) { /* constants */ + /* K0 */ be_nested_str_weak(string), + /* K1 */ be_nested_str_weak(init), + /* K2 */ be_nested_str_weak(find), + /* K3 */ be_nested_str_weak(ARG_HTTP), + /* K4 */ be_nested_str_weak(_X3A_X2F_X2F), + /* K5 */ be_const_int(0), + /* K6 */ be_nested_str_weak(http_X3A_X2F_X2F), + /* K7 */ be_nested_str_weak(_X2F), + /* K8 */ be_nested_str_weak(tasmota_http), + /* K9 */ be_nested_str_weak(tasmota), + /* K10 */ be_nested_str_weak(log), + /* K11 */ be_nested_str_weak(format), + /* K12 */ be_nested_str_weak(MTR_X3A_X20ERROR_X3A_X20_X27url_X27_X20is_X20not_X20configured_X20for_X20endpoint_X20_X25i), + /* K13 */ be_const_int(2), + /* K14 */ be_nested_str_weak(tasmota_status_8), + /* K15 */ be_nested_str_weak(tasmota_status_11), + /* K16 */ be_nested_str_weak(reachable), + }), + be_str_weak(init), + &be_const_str_solidified, + ( &(const binstruction[39]) { /* code */ + 0xA4120000, // 0000 IMPORT R4 K0 + 0x60140003, // 0001 GETGBL R5 G3 + 0x5C180000, // 0002 MOVE R6 R0 + 0x7C140200, // 0003 CALL R5 1 + 0x8C140B01, // 0004 GETMET R5 R5 K1 + 0x5C1C0200, // 0005 MOVE R7 R1 + 0x5C200400, // 0006 MOVE R8 R2 + 0x5C240600, // 0007 MOVE R9 R3 + 0x7C140800, // 0008 CALL R5 4 + 0x8C140702, // 0009 GETMET R5 R3 K2 + 0x881C0103, // 000A GETMBR R7 R0 K3 + 0x7C140400, // 000B CALL R5 2 + 0x7816000A, // 000C JMPF R5 #0018 + 0x8C180902, // 000D GETMET R6 R4 K2 + 0x5C200A00, // 000E MOVE R8 R5 + 0x58240004, // 000F LDCONST R9 K4 + 0x7C180600, // 0010 CALL R6 3 + 0x14180D05, // 0011 LT R6 R6 K5 + 0x781A0002, // 0012 JMPF R6 #0016 + 0x001A0C05, // 0013 ADD R6 K6 R5 + 0x00180D07, // 0014 ADD R6 R6 K7 + 0x5C140C00, // 0015 MOVE R5 R6 + 0x90021005, // 0016 SETMBR R0 K8 R5 + 0x70020007, // 0017 JMP #0020 + 0xB81A1200, // 0018 GETNGBL R6 K9 + 0x8C180D0A, // 0019 GETMET R6 R6 K10 + 0x8C20090B, // 001A GETMET R8 R4 K11 + 0x5828000C, // 001B LDCONST R10 K12 + 0x5C2C0400, // 001C MOVE R11 R2 + 0x7C200600, // 001D CALL R8 3 + 0x5824000D, // 001E LDCONST R9 K13 + 0x7C180600, // 001F CALL R6 3 + 0x4C180000, // 0020 LDNIL R6 + 0x90021C06, // 0021 SETMBR R0 K14 R6 + 0x4C180000, // 0022 LDNIL R6 + 0x90021E06, // 0023 SETMBR R0 K15 R6 + 0x50180000, // 0024 LDBOOL R6 0 0 + 0x90022006, // 0025 SETMBR R0 K16 R6 + 0x80000000, // 0026 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified class: Matter_Plugin_Bridge_HTTP +********************************************************************/ +extern const bclass be_class_Matter_Plugin_Device; +be_local_class(Matter_Plugin_Bridge_HTTP, + 5, + &be_class_Matter_Plugin_Device, + be_nested_map(21, + ( (struct bmapnode*) &(const bmapnode[]) { + { be_const_key_weak(get_types, 20), be_const_closure(Matter_Plugin_Bridge_HTTP_get_types_closure) }, + { be_const_key_weak(is_reachable, -1), be_const_closure(Matter_Plugin_Bridge_HTTP_is_reachable_closure) }, + { be_const_key_weak(tasmota_http, -1), be_const_var(0) }, + { be_const_key_weak(init, -1), be_const_closure(Matter_Plugin_Bridge_HTTP_init_closure) }, + { be_const_key_weak(reachable_tick, -1), be_const_var(4) }, + { be_const_key_weak(get_status_8, 6), be_const_closure(Matter_Plugin_Bridge_HTTP_get_status_8_closure) }, + { be_const_key_weak(tasmota_status_11, -1), be_const_var(2) }, + { be_const_key_weak(CLUSTERS, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { + be_const_map( * be_nested_map(1, + ( (struct bmapnode*) &(const bmapnode[]) { + { be_const_key_int(57, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_list, { + be_const_list( * be_nested_list(1, + ( (struct bvalue*) &(const bvalue[]) { + be_const_int(17), + })) ) } )) }, + })) ) } )) }, + { be_const_key_weak(NAME, -1), be_nested_str_weak() }, + { be_const_key_weak(UPDATE_TIME, -1), be_const_int(3000) }, + { be_const_key_weak(TYPE, -1), be_nested_str_weak() }, + { be_const_key_weak(reachable, -1), be_const_var(3) }, + { be_const_key_weak(ARG_HTTP, 3), be_nested_str_weak(url) }, + { be_const_key_weak(ui_string_to_conf, -1), be_const_static_closure(Matter_Plugin_Bridge_HTTP_ui_string_to_conf_closure) }, + { be_const_key_weak(tasmota_status_8, 18), be_const_var(1) }, + { be_const_key_weak(ARG, 8), be_nested_str_weak() }, + { be_const_key_weak(call_remote, -1), be_const_closure(Matter_Plugin_Bridge_HTTP_call_remote_closure) }, + { be_const_key_weak(get_status_11, 5), be_const_closure(Matter_Plugin_Bridge_HTTP_get_status_11_closure) }, + { be_const_key_weak(HTTP_TIMEOUT, 4), be_const_int(300) }, + { be_const_key_weak(ui_conf_to_string, -1), be_const_static_closure(Matter_Plugin_Bridge_HTTP_ui_conf_to_string_closure) }, + { be_const_key_weak(read_attribute, -1), be_const_closure(Matter_Plugin_Bridge_HTTP_read_attribute_closure) }, + })), + be_str_weak(Matter_Plugin_Bridge_HTTP) +); +/*******************************************************************/ + +void be_load_Matter_Plugin_Bridge_HTTP_class(bvm *vm) { + be_pushntvclass(vm, &be_class_Matter_Plugin_Bridge_HTTP); + be_setglobal(vm, "Matter_Plugin_Bridge_HTTP"); + be_pop(vm, 1); +} +/********************************************************************/ +/* End of solidification */ diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_OnOff.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_OnOff.h new file mode 100644 index 000000000..937ff508a --- /dev/null +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_OnOff.h @@ -0,0 +1,400 @@ +/* Solidification of Matter_Plugin_Bridge_OnOff.h */ +/********************************************************************\ +* Generated code, don't edit * +\********************************************************************/ +#include "be_constobj.h" + +extern const bclass be_class_Matter_Plugin_Bridge_OnOff; + +/******************************************************************** +** Solidified function: +********************************************************************/ +be_local_closure(Matter_Plugin_Bridge_OnOff__X3Clambda_X3E, /* name */ + be_nested_proto( + 3, /* nstack */ + 1, /* argc */ + 0, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 0, /* has constants */ + NULL, /* no const */ + be_str_weak(_X3Clambda_X3E), + &be_const_str_solidified, + ( &(const binstruction[ 4]) { /* code */ + 0x60040009, // 0000 GETGBL R1 G9 + 0x5C080000, // 0001 MOVE R2 R0 + 0x7C040200, // 0002 CALL R1 1 + 0x80040200, // 0003 RET 1 R1 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: init +********************************************************************/ +be_local_closure(Matter_Plugin_Bridge_OnOff_init, /* name */ + be_nested_proto( + 10, /* nstack */ + 4, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 7]) { /* constants */ + /* K0 */ be_nested_str_weak(string), + /* K1 */ be_nested_str_weak(init), + /* K2 */ be_nested_str_weak(shadow_onoff), + /* K3 */ be_nested_str_weak(tasmota_relay_index), + /* K4 */ be_nested_str_weak(find), + /* K5 */ be_nested_str_weak(ARG), + /* K6 */ be_const_int(0), + }), + be_str_weak(init), + &be_const_str_solidified, + ( &(const binstruction[21]) { /* code */ + 0xA4120000, // 0000 IMPORT R4 K0 + 0x60140003, // 0001 GETGBL R5 G3 + 0x5C180000, // 0002 MOVE R6 R0 + 0x7C140200, // 0003 CALL R5 1 + 0x8C140B01, // 0004 GETMET R5 R5 K1 + 0x5C1C0200, // 0005 MOVE R7 R1 + 0x5C200400, // 0006 MOVE R8 R2 + 0x5C240600, // 0007 MOVE R9 R3 + 0x7C140800, // 0008 CALL R5 4 + 0x50140000, // 0009 LDBOOL R5 0 0 + 0x90020405, // 000A SETMBR R0 K2 R5 + 0x8C140704, // 000B GETMET R5 R3 K4 + 0x881C0105, // 000C GETMBR R7 R0 K5 + 0x7C140400, // 000D CALL R5 2 + 0x90020605, // 000E SETMBR R0 K3 R5 + 0x88140103, // 000F GETMBR R5 R0 K3 + 0x4C180000, // 0010 LDNIL R6 + 0x1C140A06, // 0011 EQ R5 R5 R6 + 0x78160000, // 0012 JMPF R5 #0014 + 0x90020706, // 0013 SETMBR R0 K3 K6 + 0x80000000, // 0014 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: set_onoff +********************************************************************/ +be_local_closure(Matter_Plugin_Bridge_OnOff_set_onoff, /* name */ + be_nested_proto( + 6, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 5]) { /* constants */ + /* K0 */ be_nested_str_weak(call_remote), + /* K1 */ be_nested_str_weak(Power), + /* K2 */ be_nested_str_weak(1), + /* K3 */ be_nested_str_weak(0), + /* K4 */ be_nested_str_weak(update_shadow), + }), + be_str_weak(set_onoff), + &be_const_str_solidified, + ( &(const binstruction[10]) { /* code */ + 0x8C080100, // 0000 GETMET R2 R0 K0 + 0x58100001, // 0001 LDCONST R4 K1 + 0x78060001, // 0002 JMPF R1 #0005 + 0x58140002, // 0003 LDCONST R5 K2 + 0x70020000, // 0004 JMP #0006 + 0x58140003, // 0005 LDCONST R5 K3 + 0x7C080600, // 0006 CALL R2 3 + 0x8C080104, // 0007 GETMET R2 R0 K4 + 0x7C080200, // 0008 CALL R2 1 + 0x80000000, // 0009 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: invoke_request +********************************************************************/ +be_local_closure(Matter_Plugin_Bridge_OnOff_invoke_request, /* name */ + be_nested_proto( + 10, /* nstack */ + 4, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[11]) { /* constants */ + /* K0 */ be_nested_str_weak(matter), + /* K1 */ be_nested_str_weak(TLV), + /* K2 */ be_nested_str_weak(cluster), + /* K3 */ be_nested_str_weak(command), + /* K4 */ be_nested_str_weak(update_shadow_lazy), + /* K5 */ be_const_int(0), + /* K6 */ be_nested_str_weak(set_onoff), + /* K7 */ be_nested_str_weak(update_shadow), + /* K8 */ be_const_int(1), + /* K9 */ be_const_int(2), + /* K10 */ be_nested_str_weak(shadow_onoff), + }), + be_str_weak(invoke_request), + &be_const_str_solidified, + ( &(const binstruction[42]) { /* code */ + 0xB8120000, // 0000 GETNGBL R4 K0 + 0x88100901, // 0001 GETMBR R4 R4 K1 + 0x88140702, // 0002 GETMBR R5 R3 K2 + 0x88180703, // 0003 GETMBR R6 R3 K3 + 0x541E0005, // 0004 LDINT R7 6 + 0x1C1C0A07, // 0005 EQ R7 R5 R7 + 0x781E0021, // 0006 JMPF R7 #0029 + 0x8C1C0104, // 0007 GETMET R7 R0 K4 + 0x7C1C0200, // 0008 CALL R7 1 + 0x1C1C0D05, // 0009 EQ R7 R6 K5 + 0x781E0007, // 000A JMPF R7 #0013 + 0x8C1C0106, // 000B GETMET R7 R0 K6 + 0x50240000, // 000C LDBOOL R9 0 0 + 0x7C1C0400, // 000D CALL R7 2 + 0x8C1C0107, // 000E GETMET R7 R0 K7 + 0x7C1C0200, // 000F CALL R7 1 + 0x501C0200, // 0010 LDBOOL R7 1 0 + 0x80040E00, // 0011 RET 1 R7 + 0x70020015, // 0012 JMP #0029 + 0x1C1C0D08, // 0013 EQ R7 R6 K8 + 0x781E0007, // 0014 JMPF R7 #001D + 0x8C1C0106, // 0015 GETMET R7 R0 K6 + 0x50240200, // 0016 LDBOOL R9 1 0 + 0x7C1C0400, // 0017 CALL R7 2 + 0x8C1C0107, // 0018 GETMET R7 R0 K7 + 0x7C1C0200, // 0019 CALL R7 1 + 0x501C0200, // 001A LDBOOL R7 1 0 + 0x80040E00, // 001B RET 1 R7 + 0x7002000B, // 001C JMP #0029 + 0x1C1C0D09, // 001D EQ R7 R6 K9 + 0x781E0009, // 001E JMPF R7 #0029 + 0x8C1C0106, // 001F GETMET R7 R0 K6 + 0x8824010A, // 0020 GETMBR R9 R0 K10 + 0x78260000, // 0021 JMPF R9 #0023 + 0x50240001, // 0022 LDBOOL R9 0 1 + 0x50240200, // 0023 LDBOOL R9 1 0 + 0x7C1C0400, // 0024 CALL R7 2 + 0x8C1C0107, // 0025 GETMET R7 R0 K7 + 0x7C1C0200, // 0026 CALL R7 1 + 0x501C0200, // 0027 LDBOOL R7 1 0 + 0x80040E00, // 0028 RET 1 R7 + 0x80000000, // 0029 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: read_attribute +********************************************************************/ +be_local_closure(Matter_Plugin_Bridge_OnOff_read_attribute, /* name */ + be_nested_proto( + 11, /* nstack */ + 3, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[12]) { /* constants */ + /* K0 */ be_nested_str_weak(string), + /* K1 */ be_nested_str_weak(matter), + /* K2 */ be_nested_str_weak(TLV), + /* K3 */ be_nested_str_weak(cluster), + /* K4 */ be_nested_str_weak(attribute), + /* K5 */ be_nested_str_weak(update_shadow_lazy), + /* K6 */ be_const_int(0), + /* K7 */ be_nested_str_weak(create_TLV), + /* K8 */ be_nested_str_weak(BOOL), + /* K9 */ be_nested_str_weak(shadow_onoff), + /* K10 */ be_nested_str_weak(U4), + /* K11 */ be_nested_str_weak(read_attribute), + }), + be_str_weak(read_attribute), + &be_const_str_solidified, + ( &(const binstruction[45]) { /* code */ + 0xA40E0000, // 0000 IMPORT R3 K0 + 0xB8120200, // 0001 GETNGBL R4 K1 + 0x88100902, // 0002 GETMBR R4 R4 K2 + 0x88140503, // 0003 GETMBR R5 R2 K3 + 0x88180504, // 0004 GETMBR R6 R2 K4 + 0x541E0005, // 0005 LDINT R7 6 + 0x1C1C0A07, // 0006 EQ R7 R5 R7 + 0x781E001B, // 0007 JMPF R7 #0024 + 0x8C1C0105, // 0008 GETMET R7 R0 K5 + 0x7C1C0200, // 0009 CALL R7 1 + 0x1C1C0D06, // 000A EQ R7 R6 K6 + 0x781E0005, // 000B JMPF R7 #0012 + 0x8C1C0907, // 000C GETMET R7 R4 K7 + 0x88240908, // 000D GETMBR R9 R4 K8 + 0x88280109, // 000E GETMBR R10 R0 K9 + 0x7C1C0600, // 000F CALL R7 3 + 0x80040E00, // 0010 RET 1 R7 + 0x70020010, // 0011 JMP #0023 + 0x541EFFFB, // 0012 LDINT R7 65532 + 0x1C1C0C07, // 0013 EQ R7 R6 R7 + 0x781E0005, // 0014 JMPF R7 #001B + 0x8C1C0907, // 0015 GETMET R7 R4 K7 + 0x8824090A, // 0016 GETMBR R9 R4 K10 + 0x58280006, // 0017 LDCONST R10 K6 + 0x7C1C0600, // 0018 CALL R7 3 + 0x80040E00, // 0019 RET 1 R7 + 0x70020007, // 001A JMP #0023 + 0x541EFFFC, // 001B LDINT R7 65533 + 0x1C1C0C07, // 001C EQ R7 R6 R7 + 0x781E0004, // 001D JMPF R7 #0023 + 0x8C1C0907, // 001E GETMET R7 R4 K7 + 0x8824090A, // 001F GETMBR R9 R4 K10 + 0x542A0003, // 0020 LDINT R10 4 + 0x7C1C0600, // 0021 CALL R7 3 + 0x80040E00, // 0022 RET 1 R7 + 0x70020007, // 0023 JMP #002C + 0x601C0003, // 0024 GETGBL R7 G3 + 0x5C200000, // 0025 MOVE R8 R0 + 0x7C1C0200, // 0026 CALL R7 1 + 0x8C1C0F0B, // 0027 GETMET R7 R7 K11 + 0x5C240200, // 0028 MOVE R9 R1 + 0x5C280400, // 0029 MOVE R10 R2 + 0x7C1C0600, // 002A CALL R7 3 + 0x80040E00, // 002B RET 1 R7 + 0x80000000, // 002C RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: update_shadow +********************************************************************/ +be_local_closure(Matter_Plugin_Bridge_OnOff_update_shadow, /* name */ + be_nested_proto( + 7, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 9]) { /* constants */ + /* K0 */ be_nested_str_weak(get_status_11), + /* K1 */ be_nested_str_weak(find), + /* K2 */ be_nested_str_weak(StatusSTS), + /* K3 */ be_nested_str_weak(POWER), + /* K4 */ be_nested_str_weak(ON), + /* K5 */ be_nested_str_weak(shadow_onoff), + /* K6 */ be_nested_str_weak(attribute_updated), + /* K7 */ be_const_int(0), + /* K8 */ be_nested_str_weak(update_shadow), + }), + be_str_weak(update_shadow), + &be_const_str_solidified, + ( &(const binstruction[34]) { /* code */ + 0x8C040100, // 0000 GETMET R1 R0 K0 + 0x7C040200, // 0001 CALL R1 1 + 0x78060018, // 0002 JMPF R1 #001C + 0x8C080301, // 0003 GETMET R2 R1 K1 + 0x58100002, // 0004 LDCONST R4 K2 + 0x60140013, // 0005 GETGBL R5 G19 + 0x7C140000, // 0006 CALL R5 0 + 0x7C080600, // 0007 CALL R2 3 + 0x5C040400, // 0008 MOVE R1 R2 + 0x8C080301, // 0009 GETMET R2 R1 K1 + 0x58100003, // 000A LDCONST R4 K3 + 0x7C080400, // 000B CALL R2 2 + 0x1C080504, // 000C EQ R2 R2 K4 + 0x880C0105, // 000D GETMBR R3 R0 K5 + 0x4C100000, // 000E LDNIL R4 + 0x200C0604, // 000F NE R3 R3 R4 + 0x780E0009, // 0010 JMPF R3 #001B + 0x880C0105, // 0011 GETMBR R3 R0 K5 + 0x60100017, // 0012 GETGBL R4 G23 + 0x5C140400, // 0013 MOVE R5 R2 + 0x7C100200, // 0014 CALL R4 1 + 0x200C0604, // 0015 NE R3 R3 R4 + 0x780E0003, // 0016 JMPF R3 #001B + 0x8C0C0106, // 0017 GETMET R3 R0 K6 + 0x54160005, // 0018 LDINT R5 6 + 0x58180007, // 0019 LDCONST R6 K7 + 0x7C0C0600, // 001A CALL R3 3 + 0x90020A02, // 001B SETMBR R0 K5 R2 + 0x60080003, // 001C GETGBL R2 G3 + 0x5C0C0000, // 001D MOVE R3 R0 + 0x7C080200, // 001E CALL R2 1 + 0x8C080508, // 001F GETMET R2 R2 K8 + 0x7C080200, // 0020 CALL R2 1 + 0x80000000, // 0021 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified class: Matter_Plugin_Bridge_OnOff +********************************************************************/ +extern const bclass be_class_Matter_Plugin_Bridge_HTTP; +be_local_class(Matter_Plugin_Bridge_OnOff, + 3, + &be_class_Matter_Plugin_Bridge_HTTP, + be_nested_map(14, + ( (struct bmapnode*) &(const bmapnode[]) { + { be_const_key_weak(CLUSTERS, 11), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { + be_const_map( * be_nested_map(1, + ( (struct bmapnode*) &(const bmapnode[]) { + { be_const_key_int(6, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_list, { + be_const_list( * be_nested_list(3, + ( (struct bvalue*) &(const bvalue[]) { + be_const_int(0), + be_const_int(65532), + be_const_int(65533), + })) ) } )) }, + })) ) } )) }, + { be_const_key_weak(ARG, -1), be_nested_str_weak(relay) }, + { be_const_key_weak(ARG_TYPE, -1), be_const_static_closure(Matter_Plugin_Bridge_OnOff__X3Clambda_X3E_closure) }, + { be_const_key_weak(TYPE, -1), be_nested_str_weak(http_relay) }, + { be_const_key_weak(update_shadow, -1), be_const_closure(Matter_Plugin_Bridge_OnOff_update_shadow_closure) }, + { be_const_key_weak(init, -1), be_const_closure(Matter_Plugin_Bridge_OnOff_init_closure) }, + { be_const_key_weak(shadow_onoff, 13), be_const_var(2) }, + { be_const_key_weak(invoke_request, 4), be_const_closure(Matter_Plugin_Bridge_OnOff_invoke_request_closure) }, + { be_const_key_weak(NAME, -1), be_nested_str_weak(_X26_X23x1F517_X3B_X20Relay) }, + { be_const_key_weak(tasmota_http, 12), be_const_var(0) }, + { be_const_key_weak(TYPES, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { + be_const_map( * be_nested_map(1, + ( (struct bmapnode*) &(const bmapnode[]) { + { be_const_key_int(266, -1), be_const_int(2) }, + })) ) } )) }, + { be_const_key_weak(read_attribute, -1), be_const_closure(Matter_Plugin_Bridge_OnOff_read_attribute_closure) }, + { be_const_key_weak(tasmota_relay_index, -1), be_const_var(1) }, + { be_const_key_weak(set_onoff, -1), be_const_closure(Matter_Plugin_Bridge_OnOff_set_onoff_closure) }, + })), + be_str_weak(Matter_Plugin_Bridge_OnOff) +); +/*******************************************************************/ + +void be_load_Matter_Plugin_Bridge_OnOff_class(bvm *vm) { + be_pushntvclass(vm, &be_class_Matter_Plugin_Bridge_OnOff); + be_setglobal(vm, "Matter_Plugin_Bridge_OnOff"); + be_pop(vm, 1); +} +/********************************************************************/ +/* End of solidification */ diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Light0.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Light0.h index 7de68c853..d8782dcac 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Light0.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Light0.h @@ -6,6 +6,177 @@ extern const bclass be_class_Matter_Plugin_Light0; +/******************************************************************** +** Solidified function: update_shadow +********************************************************************/ +be_local_closure(Matter_Plugin_Light0_update_shadow, /* name */ + be_nested_proto( + 8, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 8]) { /* constants */ + /* K0 */ be_nested_str_weak(light), + /* K1 */ be_nested_str_weak(get), + /* K2 */ be_nested_str_weak(find), + /* K3 */ be_nested_str_weak(power), + /* K4 */ be_nested_str_weak(shadow_onoff), + /* K5 */ be_nested_str_weak(attribute_updated), + /* K6 */ be_const_int(0), + /* K7 */ be_nested_str_weak(update_shadow), + }), + be_str_weak(update_shadow), + &be_const_str_solidified, + ( &(const binstruction[21]) { /* code */ + 0xA4060000, // 0000 IMPORT R1 K0 + 0x8C080301, // 0001 GETMET R2 R1 K1 + 0x7C080200, // 0002 CALL R2 1 + 0x8C0C0502, // 0003 GETMET R3 R2 K2 + 0x58140003, // 0004 LDCONST R5 K3 + 0x4C180000, // 0005 LDNIL R6 + 0x7C0C0600, // 0006 CALL R3 3 + 0x88100104, // 0007 GETMBR R4 R0 K4 + 0x20100604, // 0008 NE R4 R3 R4 + 0x78120004, // 0009 JMPF R4 #000F + 0x8C100105, // 000A GETMET R4 R0 K5 + 0x541A0005, // 000B LDINT R6 6 + 0x581C0006, // 000C LDCONST R7 K6 + 0x7C100600, // 000D CALL R4 3 + 0x90020803, // 000E SETMBR R0 K4 R3 + 0x60100003, // 000F GETGBL R4 G3 + 0x5C140000, // 0010 MOVE R5 R0 + 0x7C100200, // 0011 CALL R4 1 + 0x8C100907, // 0012 GETMET R4 R4 K7 + 0x7C100200, // 0013 CALL R4 1 + 0x80000000, // 0014 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: read_attribute +********************************************************************/ +be_local_closure(Matter_Plugin_Light0_read_attribute, /* name */ + be_nested_proto( + 11, /* nstack */ + 3, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[12]) { /* constants */ + /* K0 */ be_nested_str_weak(string), + /* K1 */ be_nested_str_weak(matter), + /* K2 */ be_nested_str_weak(TLV), + /* K3 */ be_nested_str_weak(cluster), + /* K4 */ be_nested_str_weak(attribute), + /* K5 */ be_nested_str_weak(update_shadow_lazy), + /* K6 */ be_const_int(0), + /* K7 */ be_nested_str_weak(create_TLV), + /* K8 */ be_nested_str_weak(BOOL), + /* K9 */ be_nested_str_weak(shadow_onoff), + /* K10 */ be_nested_str_weak(U4), + /* K11 */ be_nested_str_weak(read_attribute), + }), + be_str_weak(read_attribute), + &be_const_str_solidified, + ( &(const binstruction[45]) { /* code */ + 0xA40E0000, // 0000 IMPORT R3 K0 + 0xB8120200, // 0001 GETNGBL R4 K1 + 0x88100902, // 0002 GETMBR R4 R4 K2 + 0x88140503, // 0003 GETMBR R5 R2 K3 + 0x88180504, // 0004 GETMBR R6 R2 K4 + 0x541E0005, // 0005 LDINT R7 6 + 0x1C1C0A07, // 0006 EQ R7 R5 R7 + 0x781E001B, // 0007 JMPF R7 #0024 + 0x8C1C0105, // 0008 GETMET R7 R0 K5 + 0x7C1C0200, // 0009 CALL R7 1 + 0x1C1C0D06, // 000A EQ R7 R6 K6 + 0x781E0005, // 000B JMPF R7 #0012 + 0x8C1C0907, // 000C GETMET R7 R4 K7 + 0x88240908, // 000D GETMBR R9 R4 K8 + 0x88280109, // 000E GETMBR R10 R0 K9 + 0x7C1C0600, // 000F CALL R7 3 + 0x80040E00, // 0010 RET 1 R7 + 0x70020010, // 0011 JMP #0023 + 0x541EFFFB, // 0012 LDINT R7 65532 + 0x1C1C0C07, // 0013 EQ R7 R6 R7 + 0x781E0005, // 0014 JMPF R7 #001B + 0x8C1C0907, // 0015 GETMET R7 R4 K7 + 0x8824090A, // 0016 GETMBR R9 R4 K10 + 0x58280006, // 0017 LDCONST R10 K6 + 0x7C1C0600, // 0018 CALL R7 3 + 0x80040E00, // 0019 RET 1 R7 + 0x70020007, // 001A JMP #0023 + 0x541EFFFC, // 001B LDINT R7 65533 + 0x1C1C0C07, // 001C EQ R7 R6 R7 + 0x781E0004, // 001D JMPF R7 #0023 + 0x8C1C0907, // 001E GETMET R7 R4 K7 + 0x8824090A, // 001F GETMBR R9 R4 K10 + 0x542A0003, // 0020 LDINT R10 4 + 0x7C1C0600, // 0021 CALL R7 3 + 0x80040E00, // 0022 RET 1 R7 + 0x70020007, // 0023 JMP #002C + 0x601C0003, // 0024 GETGBL R7 G3 + 0x5C200000, // 0025 MOVE R8 R0 + 0x7C1C0200, // 0026 CALL R7 1 + 0x8C1C0F0B, // 0027 GETMET R7 R7 K11 + 0x5C240200, // 0028 MOVE R9 R1 + 0x5C280400, // 0029 MOVE R10 R2 + 0x7C1C0600, // 002A CALL R7 3 + 0x80040E00, // 002B RET 1 R7 + 0x80000000, // 002C RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: init +********************************************************************/ +be_local_closure(Matter_Plugin_Light0_init, /* name */ + be_nested_proto( + 9, /* nstack */ + 4, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 2]) { /* constants */ + /* K0 */ be_nested_str_weak(init), + /* K1 */ be_nested_str_weak(shadow_onoff), + }), + be_str_weak(init), + &be_const_str_solidified, + ( &(const binstruction[11]) { /* code */ + 0x60100003, // 0000 GETGBL R4 G3 + 0x5C140000, // 0001 MOVE R5 R0 + 0x7C100200, // 0002 CALL R4 1 + 0x8C100900, // 0003 GETMET R4 R4 K0 + 0x5C180200, // 0004 MOVE R6 R1 + 0x5C1C0400, // 0005 MOVE R7 R2 + 0x5C200600, // 0006 MOVE R8 R3 + 0x7C100800, // 0007 CALL R4 4 + 0x50100000, // 0008 LDBOOL R4 0 0 + 0x90020204, // 0009 SETMBR R0 K1 R4 + 0x80000000, // 000A RET 0 + }) + ) +); +/*******************************************************************/ + + /******************************************************************** ** Solidified function: invoke_request ********************************************************************/ @@ -95,177 +266,6 @@ be_local_closure(Matter_Plugin_Light0_invoke_request, /* name */ /*******************************************************************/ -/******************************************************************** -** Solidified function: read_attribute -********************************************************************/ -be_local_closure(Matter_Plugin_Light0_read_attribute, /* name */ - be_nested_proto( - 11, /* nstack */ - 3, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[12]) { /* constants */ - /* K0 */ be_nested_str_weak(string), - /* K1 */ be_nested_str_weak(matter), - /* K2 */ be_nested_str_weak(TLV), - /* K3 */ be_nested_str_weak(cluster), - /* K4 */ be_nested_str_weak(attribute), - /* K5 */ be_nested_str_weak(update_shadow_lazy), - /* K6 */ be_const_int(0), - /* K7 */ be_nested_str_weak(create_TLV), - /* K8 */ be_nested_str_weak(BOOL), - /* K9 */ be_nested_str_weak(shadow_onoff), - /* K10 */ be_nested_str_weak(U4), - /* K11 */ be_nested_str_weak(read_attribute), - }), - be_str_weak(read_attribute), - &be_const_str_solidified, - ( &(const binstruction[45]) { /* code */ - 0xA40E0000, // 0000 IMPORT R3 K0 - 0xB8120200, // 0001 GETNGBL R4 K1 - 0x88100902, // 0002 GETMBR R4 R4 K2 - 0x88140503, // 0003 GETMBR R5 R2 K3 - 0x88180504, // 0004 GETMBR R6 R2 K4 - 0x541E0005, // 0005 LDINT R7 6 - 0x1C1C0A07, // 0006 EQ R7 R5 R7 - 0x781E001B, // 0007 JMPF R7 #0024 - 0x8C1C0105, // 0008 GETMET R7 R0 K5 - 0x7C1C0200, // 0009 CALL R7 1 - 0x1C1C0D06, // 000A EQ R7 R6 K6 - 0x781E0005, // 000B JMPF R7 #0012 - 0x8C1C0907, // 000C GETMET R7 R4 K7 - 0x88240908, // 000D GETMBR R9 R4 K8 - 0x88280109, // 000E GETMBR R10 R0 K9 - 0x7C1C0600, // 000F CALL R7 3 - 0x80040E00, // 0010 RET 1 R7 - 0x70020010, // 0011 JMP #0023 - 0x541EFFFB, // 0012 LDINT R7 65532 - 0x1C1C0C07, // 0013 EQ R7 R6 R7 - 0x781E0005, // 0014 JMPF R7 #001B - 0x8C1C0907, // 0015 GETMET R7 R4 K7 - 0x8824090A, // 0016 GETMBR R9 R4 K10 - 0x58280006, // 0017 LDCONST R10 K6 - 0x7C1C0600, // 0018 CALL R7 3 - 0x80040E00, // 0019 RET 1 R7 - 0x70020007, // 001A JMP #0023 - 0x541EFFFC, // 001B LDINT R7 65533 - 0x1C1C0C07, // 001C EQ R7 R6 R7 - 0x781E0004, // 001D JMPF R7 #0023 - 0x8C1C0907, // 001E GETMET R7 R4 K7 - 0x8824090A, // 001F GETMBR R9 R4 K10 - 0x542A0003, // 0020 LDINT R10 4 - 0x7C1C0600, // 0021 CALL R7 3 - 0x80040E00, // 0022 RET 1 R7 - 0x70020007, // 0023 JMP #002C - 0x601C0003, // 0024 GETGBL R7 G3 - 0x5C200000, // 0025 MOVE R8 R0 - 0x7C1C0200, // 0026 CALL R7 1 - 0x8C1C0F0B, // 0027 GETMET R7 R7 K11 - 0x5C240200, // 0028 MOVE R9 R1 - 0x5C280400, // 0029 MOVE R10 R2 - 0x7C1C0600, // 002A CALL R7 3 - 0x80040E00, // 002B RET 1 R7 - 0x80000000, // 002C RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: update_shadow -********************************************************************/ -be_local_closure(Matter_Plugin_Light0_update_shadow, /* name */ - be_nested_proto( - 8, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 8]) { /* constants */ - /* K0 */ be_nested_str_weak(light), - /* K1 */ be_nested_str_weak(get), - /* K2 */ be_nested_str_weak(find), - /* K3 */ be_nested_str_weak(power), - /* K4 */ be_nested_str_weak(shadow_onoff), - /* K5 */ be_nested_str_weak(attribute_updated), - /* K6 */ be_const_int(0), - /* K7 */ be_nested_str_weak(update_shadow), - }), - be_str_weak(update_shadow), - &be_const_str_solidified, - ( &(const binstruction[21]) { /* code */ - 0xA4060000, // 0000 IMPORT R1 K0 - 0x8C080301, // 0001 GETMET R2 R1 K1 - 0x7C080200, // 0002 CALL R2 1 - 0x8C0C0502, // 0003 GETMET R3 R2 K2 - 0x58140003, // 0004 LDCONST R5 K3 - 0x4C180000, // 0005 LDNIL R6 - 0x7C0C0600, // 0006 CALL R3 3 - 0x88100104, // 0007 GETMBR R4 R0 K4 - 0x20100604, // 0008 NE R4 R3 R4 - 0x78120004, // 0009 JMPF R4 #000F - 0x8C100105, // 000A GETMET R4 R0 K5 - 0x541A0005, // 000B LDINT R6 6 - 0x581C0006, // 000C LDCONST R7 K6 - 0x7C100600, // 000D CALL R4 3 - 0x90020803, // 000E SETMBR R0 K4 R3 - 0x60100003, // 000F GETGBL R4 G3 - 0x5C140000, // 0010 MOVE R5 R0 - 0x7C100200, // 0011 CALL R4 1 - 0x8C100907, // 0012 GETMET R4 R4 K7 - 0x7C100200, // 0013 CALL R4 1 - 0x80000000, // 0014 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: init -********************************************************************/ -be_local_closure(Matter_Plugin_Light0_init, /* name */ - be_nested_proto( - 9, /* nstack */ - 4, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 2]) { /* constants */ - /* K0 */ be_nested_str_weak(init), - /* K1 */ be_nested_str_weak(shadow_onoff), - }), - be_str_weak(init), - &be_const_str_solidified, - ( &(const binstruction[11]) { /* code */ - 0x60100003, // 0000 GETGBL R4 G3 - 0x5C140000, // 0001 MOVE R5 R0 - 0x7C100200, // 0002 CALL R4 1 - 0x8C100900, // 0003 GETMET R4 R4 K0 - 0x5C180200, // 0004 MOVE R6 R1 - 0x5C1C0400, // 0005 MOVE R7 R2 - 0x5C200600, // 0006 MOVE R8 R3 - 0x7C100800, // 0007 CALL R4 4 - 0x50100000, // 0008 LDBOOL R4 0 0 - 0x90020204, // 0009 SETMBR R0 K1 R4 - 0x80000000, // 000A RET 0 - }) - ) -); -/*******************************************************************/ - - /******************************************************************** ** Solidified class: Matter_Plugin_Light0 ********************************************************************/ @@ -273,17 +273,17 @@ extern const bclass be_class_Matter_Plugin_Device; be_local_class(Matter_Plugin_Light0, 1, &be_class_Matter_Plugin_Device, - be_nested_map(9, + be_nested_map(10, ( (struct bmapnode*) &(const bmapnode[]) { - { be_const_key_weak(init, -1), be_const_closure(Matter_Plugin_Light0_init_closure) }, - { be_const_key_weak(shadow_onoff, 8), be_const_var(0) }, { be_const_key_weak(TYPES, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { be_const_map( * be_nested_map(1, ( (struct bmapnode*) &(const bmapnode[]) { { be_const_key_int(256, -1), be_const_int(2) }, })) ) } )) }, + { be_const_key_weak(TYPE, -1), be_nested_str_weak(light0) }, + { be_const_key_weak(read_attribute, -1), be_const_closure(Matter_Plugin_Light0_read_attribute_closure) }, { be_const_key_weak(NAME, -1), be_nested_str_weak(Light_X200_X20On) }, - { be_const_key_weak(CLUSTERS, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { + { be_const_key_weak(CLUSTERS, 3), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { be_const_map( * be_nested_map(1, ( (struct bmapnode*) &(const bmapnode[]) { { be_const_key_int(6, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_list, { @@ -294,10 +294,11 @@ be_local_class(Matter_Plugin_Light0, be_const_int(65533), })) ) } )) }, })) ) } )) }, + { be_const_key_weak(init, -1), be_const_closure(Matter_Plugin_Light0_init_closure) }, + { be_const_key_weak(UPDATE_TIME, -1), be_const_int(250) }, { be_const_key_weak(invoke_request, -1), be_const_closure(Matter_Plugin_Light0_invoke_request_closure) }, - { be_const_key_weak(read_attribute, 0), be_const_closure(Matter_Plugin_Light0_read_attribute_closure) }, - { be_const_key_weak(update_shadow, -1), be_const_closure(Matter_Plugin_Light0_update_shadow_closure) }, - { be_const_key_weak(TYPE, -1), be_nested_str_weak(light0) }, + { be_const_key_weak(shadow_onoff, -1), be_const_var(0) }, + { be_const_key_weak(update_shadow, 1), be_const_closure(Matter_Plugin_Light0_update_shadow_closure) }, })), be_str_weak(Matter_Plugin_Light0) ); diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_OnOff.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_OnOff.h index 07ce40c5a..4d753eca5 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_OnOff.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_OnOff.h @@ -33,6 +33,94 @@ be_local_closure(Matter_Plugin_OnOff__X3Clambda_X3E, /* name */ /*******************************************************************/ +/******************************************************************** +** Solidified function: init +********************************************************************/ +be_local_closure(Matter_Plugin_OnOff_init, /* name */ + be_nested_proto( + 9, /* nstack */ + 4, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 6]) { /* constants */ + /* K0 */ be_nested_str_weak(init), + /* K1 */ be_nested_str_weak(shadow_onoff), + /* K2 */ be_nested_str_weak(tasmota_relay_index), + /* K3 */ be_nested_str_weak(find), + /* K4 */ be_nested_str_weak(ARG), + /* K5 */ be_const_int(0), + }), + be_str_weak(init), + &be_const_str_solidified, + ( &(const binstruction[20]) { /* code */ + 0x60100003, // 0000 GETGBL R4 G3 + 0x5C140000, // 0001 MOVE R5 R0 + 0x7C100200, // 0002 CALL R4 1 + 0x8C100900, // 0003 GETMET R4 R4 K0 + 0x5C180200, // 0004 MOVE R6 R1 + 0x5C1C0400, // 0005 MOVE R7 R2 + 0x5C200600, // 0006 MOVE R8 R3 + 0x7C100800, // 0007 CALL R4 4 + 0x50100000, // 0008 LDBOOL R4 0 0 + 0x90020204, // 0009 SETMBR R0 K1 R4 + 0x8C100703, // 000A GETMET R4 R3 K3 + 0x88180104, // 000B GETMBR R6 R0 K4 + 0x7C100400, // 000C CALL R4 2 + 0x90020404, // 000D SETMBR R0 K2 R4 + 0x88100102, // 000E GETMBR R4 R0 K2 + 0x4C140000, // 000F LDNIL R5 + 0x1C100805, // 0010 EQ R4 R4 R5 + 0x78120000, // 0011 JMPF R4 #0013 + 0x90020505, // 0012 SETMBR R0 K2 K5 + 0x80000000, // 0013 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: set_onoff +********************************************************************/ +be_local_closure(Matter_Plugin_OnOff_set_onoff, /* name */ + be_nested_proto( + 7, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 4]) { /* constants */ + /* K0 */ be_nested_str_weak(tasmota), + /* K1 */ be_nested_str_weak(set_power), + /* K2 */ be_nested_str_weak(tasmota_relay_index), + /* K3 */ be_nested_str_weak(update_shadow), + }), + be_str_weak(set_onoff), + &be_const_str_solidified, + ( &(const binstruction[10]) { /* code */ + 0xB80A0000, // 0000 GETNGBL R2 K0 + 0x8C080501, // 0001 GETMET R2 R2 K1 + 0x88100102, // 0002 GETMBR R4 R0 K2 + 0x60140017, // 0003 GETGBL R5 G23 + 0x5C180200, // 0004 MOVE R6 R1 + 0x7C140200, // 0005 CALL R5 1 + 0x7C080600, // 0006 CALL R2 3 + 0x8C080103, // 0007 GETMET R2 R0 K3 + 0x7C080200, // 0008 CALL R2 1 + 0x80000000, // 0009 RET 0 + }) + ) +); +/*******************************************************************/ + + /******************************************************************** ** Solidified function: invoke_request ********************************************************************/ @@ -110,153 +198,6 @@ be_local_closure(Matter_Plugin_OnOff_invoke_request, /* name */ /*******************************************************************/ -/******************************************************************** -** Solidified function: init -********************************************************************/ -be_local_closure(Matter_Plugin_OnOff_init, /* name */ - be_nested_proto( - 9, /* nstack */ - 4, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 6]) { /* constants */ - /* K0 */ be_nested_str_weak(init), - /* K1 */ be_nested_str_weak(shadow_onoff), - /* K2 */ be_nested_str_weak(tasmota_relay_index), - /* K3 */ be_nested_str_weak(find), - /* K4 */ be_nested_str_weak(ARG), - /* K5 */ be_const_int(0), - }), - be_str_weak(init), - &be_const_str_solidified, - ( &(const binstruction[20]) { /* code */ - 0x60100003, // 0000 GETGBL R4 G3 - 0x5C140000, // 0001 MOVE R5 R0 - 0x7C100200, // 0002 CALL R4 1 - 0x8C100900, // 0003 GETMET R4 R4 K0 - 0x5C180200, // 0004 MOVE R6 R1 - 0x5C1C0400, // 0005 MOVE R7 R2 - 0x5C200600, // 0006 MOVE R8 R3 - 0x7C100800, // 0007 CALL R4 4 - 0x50100000, // 0008 LDBOOL R4 0 0 - 0x90020204, // 0009 SETMBR R0 K1 R4 - 0x8C100703, // 000A GETMET R4 R3 K3 - 0x88180104, // 000B GETMBR R6 R0 K4 - 0x7C100400, // 000C CALL R4 2 - 0x90020404, // 000D SETMBR R0 K2 R4 - 0x88100102, // 000E GETMBR R4 R0 K2 - 0x4C140000, // 000F LDNIL R5 - 0x1C100805, // 0010 EQ R4 R4 R5 - 0x78120000, // 0011 JMPF R4 #0013 - 0x90020505, // 0012 SETMBR R0 K2 K5 - 0x80000000, // 0013 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: update_shadow -********************************************************************/ -be_local_closure(Matter_Plugin_OnOff_update_shadow, /* name */ - be_nested_proto( - 6, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 7]) { /* constants */ - /* K0 */ be_nested_str_weak(tasmota), - /* K1 */ be_nested_str_weak(get_power), - /* K2 */ be_nested_str_weak(tasmota_relay_index), - /* K3 */ be_nested_str_weak(shadow_onoff), - /* K4 */ be_nested_str_weak(attribute_updated), - /* K5 */ be_const_int(0), - /* K6 */ be_nested_str_weak(update_shadow), - }), - be_str_weak(update_shadow), - &be_const_str_solidified, - ( &(const binstruction[28]) { /* code */ - 0xB8060000, // 0000 GETNGBL R1 K0 - 0x8C040301, // 0001 GETMET R1 R1 K1 - 0x880C0102, // 0002 GETMBR R3 R0 K2 - 0x7C040400, // 0003 CALL R1 2 - 0x4C080000, // 0004 LDNIL R2 - 0x20080202, // 0005 NE R2 R1 R2 - 0x780A000E, // 0006 JMPF R2 #0016 - 0x88080103, // 0007 GETMBR R2 R0 K3 - 0x4C0C0000, // 0008 LDNIL R3 - 0x20080403, // 0009 NE R2 R2 R3 - 0x780A0009, // 000A JMPF R2 #0015 - 0x88080103, // 000B GETMBR R2 R0 K3 - 0x600C0017, // 000C GETGBL R3 G23 - 0x5C100200, // 000D MOVE R4 R1 - 0x7C0C0200, // 000E CALL R3 1 - 0x20080403, // 000F NE R2 R2 R3 - 0x780A0003, // 0010 JMPF R2 #0015 - 0x8C080104, // 0011 GETMET R2 R0 K4 - 0x54120005, // 0012 LDINT R4 6 - 0x58140005, // 0013 LDCONST R5 K5 - 0x7C080600, // 0014 CALL R2 3 - 0x90020601, // 0015 SETMBR R0 K3 R1 - 0x60080003, // 0016 GETGBL R2 G3 - 0x5C0C0000, // 0017 MOVE R3 R0 - 0x7C080200, // 0018 CALL R2 1 - 0x8C080506, // 0019 GETMET R2 R2 K6 - 0x7C080200, // 001A CALL R2 1 - 0x80000000, // 001B RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: set_onoff -********************************************************************/ -be_local_closure(Matter_Plugin_OnOff_set_onoff, /* name */ - be_nested_proto( - 7, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 4]) { /* constants */ - /* K0 */ be_nested_str_weak(tasmota), - /* K1 */ be_nested_str_weak(set_power), - /* K2 */ be_nested_str_weak(tasmota_relay_index), - /* K3 */ be_nested_str_weak(update_shadow), - }), - be_str_weak(set_onoff), - &be_const_str_solidified, - ( &(const binstruction[10]) { /* code */ - 0xB80A0000, // 0000 GETNGBL R2 K0 - 0x8C080501, // 0001 GETMET R2 R2 K1 - 0x88100102, // 0002 GETMBR R4 R0 K2 - 0x60140017, // 0003 GETGBL R5 G23 - 0x5C180200, // 0004 MOVE R6 R1 - 0x7C140200, // 0005 CALL R5 1 - 0x7C080600, // 0006 CALL R2 3 - 0x8C080103, // 0007 GETMET R2 R0 K3 - 0x7C080200, // 0008 CALL R2 1 - 0x80000000, // 0009 RET 0 - }) - ) -); -/*******************************************************************/ - - /******************************************************************** ** Solidified function: read_attribute ********************************************************************/ @@ -338,6 +279,65 @@ be_local_closure(Matter_Plugin_OnOff_read_attribute, /* name */ /*******************************************************************/ +/******************************************************************** +** Solidified function: update_shadow +********************************************************************/ +be_local_closure(Matter_Plugin_OnOff_update_shadow, /* name */ + be_nested_proto( + 6, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 7]) { /* constants */ + /* K0 */ be_nested_str_weak(tasmota), + /* K1 */ be_nested_str_weak(get_power), + /* K2 */ be_nested_str_weak(tasmota_relay_index), + /* K3 */ be_nested_str_weak(shadow_onoff), + /* K4 */ be_nested_str_weak(attribute_updated), + /* K5 */ be_const_int(0), + /* K6 */ be_nested_str_weak(update_shadow), + }), + be_str_weak(update_shadow), + &be_const_str_solidified, + ( &(const binstruction[28]) { /* code */ + 0xB8060000, // 0000 GETNGBL R1 K0 + 0x8C040301, // 0001 GETMET R1 R1 K1 + 0x880C0102, // 0002 GETMBR R3 R0 K2 + 0x7C040400, // 0003 CALL R1 2 + 0x4C080000, // 0004 LDNIL R2 + 0x20080202, // 0005 NE R2 R1 R2 + 0x780A000E, // 0006 JMPF R2 #0016 + 0x88080103, // 0007 GETMBR R2 R0 K3 + 0x4C0C0000, // 0008 LDNIL R3 + 0x20080403, // 0009 NE R2 R2 R3 + 0x780A0009, // 000A JMPF R2 #0015 + 0x88080103, // 000B GETMBR R2 R0 K3 + 0x600C0017, // 000C GETGBL R3 G23 + 0x5C100200, // 000D MOVE R4 R1 + 0x7C0C0200, // 000E CALL R3 1 + 0x20080403, // 000F NE R2 R2 R3 + 0x780A0003, // 0010 JMPF R2 #0015 + 0x8C080104, // 0011 GETMET R2 R0 K4 + 0x54120005, // 0012 LDINT R4 6 + 0x58140005, // 0013 LDCONST R5 K5 + 0x7C080600, // 0014 CALL R2 3 + 0x90020601, // 0015 SETMBR R0 K3 R1 + 0x60080003, // 0016 GETGBL R2 G3 + 0x5C0C0000, // 0017 MOVE R3 R0 + 0x7C080200, // 0018 CALL R2 1 + 0x8C080506, // 0019 GETMET R2 R2 K6 + 0x7C080200, // 001A CALL R2 1 + 0x80000000, // 001B RET 0 + }) + ) +); +/*******************************************************************/ + + /******************************************************************** ** Solidified class: Matter_Plugin_OnOff ********************************************************************/ @@ -345,19 +345,9 @@ extern const bclass be_class_Matter_Plugin_Device; be_local_class(Matter_Plugin_OnOff, 2, &be_class_Matter_Plugin_Device, - be_nested_map(13, + be_nested_map(14, ( (struct bmapnode*) &(const bmapnode[]) { - { be_const_key_weak(ARG, 4), be_nested_str_weak(relay) }, - { be_const_key_weak(tasmota_relay_index, -1), be_const_var(0) }, - { be_const_key_weak(TYPE, -1), be_nested_str_weak(relay) }, - { be_const_key_weak(ARG_TYPE, -1), be_const_static_closure(Matter_Plugin_OnOff__X3Clambda_X3E_closure) }, - { be_const_key_weak(shadow_onoff, -1), be_const_var(1) }, - { be_const_key_weak(invoke_request, -1), be_const_closure(Matter_Plugin_OnOff_invoke_request_closure) }, - { be_const_key_weak(init, -1), be_const_closure(Matter_Plugin_OnOff_init_closure) }, - { be_const_key_weak(update_shadow, -1), be_const_closure(Matter_Plugin_OnOff_update_shadow_closure) }, - { be_const_key_weak(read_attribute, -1), be_const_closure(Matter_Plugin_OnOff_read_attribute_closure) }, - { be_const_key_weak(NAME, -1), be_nested_str_weak(Relay) }, - { be_const_key_weak(CLUSTERS, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { + { be_const_key_weak(CLUSTERS, 11), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { be_const_map( * be_nested_map(1, ( (struct bmapnode*) &(const bmapnode[]) { { be_const_key_int(6, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_list, { @@ -368,12 +358,23 @@ be_local_class(Matter_Plugin_OnOff, be_const_int(65533), })) ) } )) }, })) ) } )) }, - { be_const_key_weak(set_onoff, 8), be_const_closure(Matter_Plugin_OnOff_set_onoff_closure) }, + { be_const_key_weak(ARG, -1), be_nested_str_weak(relay) }, + { be_const_key_weak(UPDATE_TIME, 13), be_const_int(250) }, + { be_const_key_weak(TYPE, -1), be_nested_str_weak(relay) }, + { be_const_key_weak(update_shadow, -1), be_const_closure(Matter_Plugin_OnOff_update_shadow_closure) }, + { be_const_key_weak(init, -1), be_const_closure(Matter_Plugin_OnOff_init_closure) }, + { be_const_key_weak(set_onoff, 12), be_const_closure(Matter_Plugin_OnOff_set_onoff_closure) }, + { be_const_key_weak(invoke_request, 4), be_const_closure(Matter_Plugin_OnOff_invoke_request_closure) }, + { be_const_key_weak(NAME, -1), be_nested_str_weak(Relay) }, + { be_const_key_weak(tasmota_relay_index, -1), be_const_var(0) }, { be_const_key_weak(TYPES, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { be_const_map( * be_nested_map(1, ( (struct bmapnode*) &(const bmapnode[]) { { be_const_key_int(266, -1), be_const_int(2) }, })) ) } )) }, + { be_const_key_weak(read_attribute, -1), be_const_closure(Matter_Plugin_OnOff_read_attribute_closure) }, + { be_const_key_weak(shadow_onoff, -1), be_const_var(1) }, + { be_const_key_weak(ARG_TYPE, -1), be_const_static_closure(Matter_Plugin_OnOff__X3Clambda_X3E_closure) }, })), be_str_weak(Matter_Plugin_OnOff) ); diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor.h index 53e80ddfa..788358b91 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor.h @@ -30,6 +30,80 @@ be_local_closure(Matter_Plugin_Sensor_pre_value, /* name */ /*******************************************************************/ +/******************************************************************** +** Solidified function: value_changed +********************************************************************/ +be_local_closure(Matter_Plugin_Sensor_value_changed, /* name */ + be_nested_proto( + 2, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 0, /* has constants */ + NULL, /* no const */ + be_str_weak(value_changed), + &be_const_str_solidified, + ( &(const binstruction[ 1]) { /* code */ + 0x80000000, // 0000 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: parse_sensors +********************************************************************/ +be_local_closure(Matter_Plugin_Sensor_parse_sensors, /* name */ + be_nested_proto( + 8, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 5]) { /* constants */ + /* K0 */ be_nested_str_weak(tasmota_sensor_matcher), + /* K1 */ be_nested_str_weak(pre_value), + /* K2 */ be_nested_str_weak(match), + /* K3 */ be_nested_str_weak(shadow_value), + /* K4 */ be_nested_str_weak(value_changed), + }), + be_str_weak(parse_sensors), + &be_const_str_solidified, + ( &(const binstruction[21]) { /* code */ + 0x88080100, // 0000 GETMBR R2 R0 K0 + 0x780A0011, // 0001 JMPF R2 #0014 + 0x8C080101, // 0002 GETMET R2 R0 K1 + 0x6010000A, // 0003 GETGBL R4 G10 + 0x88140100, // 0004 GETMBR R5 R0 K0 + 0x8C140B02, // 0005 GETMET R5 R5 K2 + 0x5C1C0200, // 0006 MOVE R7 R1 + 0x7C140400, // 0007 CALL R5 2 + 0x7C100200, // 0008 CALL R4 1 + 0x7C080400, // 0009 CALL R2 2 + 0x4C0C0000, // 000A LDNIL R3 + 0x200C0403, // 000B NE R3 R2 R3 + 0x780E0006, // 000C JMPF R3 #0014 + 0x880C0103, // 000D GETMBR R3 R0 K3 + 0x200C0403, // 000E NE R3 R2 R3 + 0x780E0002, // 000F JMPF R3 #0013 + 0x8C0C0104, // 0010 GETMET R3 R0 K4 + 0x5C140400, // 0011 MOVE R5 R2 + 0x7C0C0400, // 0012 CALL R3 2 + 0x90020602, // 0013 SETMBR R0 K3 R2 + 0x80000000, // 0014 RET 0 + }) + ) +); +/*******************************************************************/ + + /******************************************************************** ** Solidified function: init ********************************************************************/ @@ -83,80 +157,6 @@ be_local_closure(Matter_Plugin_Sensor_init, /* name */ /*******************************************************************/ -/******************************************************************** -** Solidified function: parse_sensors -********************************************************************/ -be_local_closure(Matter_Plugin_Sensor_parse_sensors, /* name */ - be_nested_proto( - 8, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 5]) { /* constants */ - /* K0 */ be_nested_str_weak(tasmota_sensor_matcher), - /* K1 */ be_nested_str_weak(pre_value), - /* K2 */ be_nested_str_weak(match), - /* K3 */ be_nested_str_weak(shadow_value), - /* K4 */ be_nested_str_weak(value_changed), - }), - be_str_weak(parse_sensors), - &be_const_str_solidified, - ( &(const binstruction[21]) { /* code */ - 0x88080100, // 0000 GETMBR R2 R0 K0 - 0x780A0011, // 0001 JMPF R2 #0014 - 0x8C080101, // 0002 GETMET R2 R0 K1 - 0x6010000A, // 0003 GETGBL R4 G10 - 0x88140100, // 0004 GETMBR R5 R0 K0 - 0x8C140B02, // 0005 GETMET R5 R5 K2 - 0x5C1C0200, // 0006 MOVE R7 R1 - 0x7C140400, // 0007 CALL R5 2 - 0x7C100200, // 0008 CALL R4 1 - 0x7C080400, // 0009 CALL R2 2 - 0x4C0C0000, // 000A LDNIL R3 - 0x200C0403, // 000B NE R3 R2 R3 - 0x780E0006, // 000C JMPF R3 #0014 - 0x880C0103, // 000D GETMBR R3 R0 K3 - 0x200C0403, // 000E NE R3 R2 R3 - 0x780E0002, // 000F JMPF R3 #0013 - 0x8C0C0104, // 0010 GETMET R3 R0 K4 - 0x5C140400, // 0011 MOVE R5 R2 - 0x7C0C0400, // 0012 CALL R3 2 - 0x90020602, // 0013 SETMBR R0 K3 R2 - 0x80000000, // 0014 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: value_changed -********************************************************************/ -be_local_closure(Matter_Plugin_Sensor_value_changed, /* name */ - be_nested_proto( - 2, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 0, /* has constants */ - NULL, /* no const */ - be_str_weak(value_changed), - &be_const_str_solidified, - ( &(const binstruction[ 1]) { /* code */ - 0x80000000, // 0000 RET 0 - }) - ) -); -/*******************************************************************/ - - /******************************************************************** ** Solidified class: Matter_Plugin_Sensor ********************************************************************/ @@ -164,16 +164,17 @@ extern const bclass be_class_Matter_Plugin_Device; be_local_class(Matter_Plugin_Sensor, 3, &be_class_Matter_Plugin_Device, - be_nested_map(8, + be_nested_map(9, ( (struct bmapnode*) &(const bmapnode[]) { - { be_const_key_weak(pre_value, -1), be_const_closure(Matter_Plugin_Sensor_pre_value_closure) }, - { be_const_key_weak(shadow_value, -1), be_const_var(2) }, - { be_const_key_weak(tasmota_sensor_matcher, 6), be_const_var(1) }, - { be_const_key_weak(init, 1), be_const_closure(Matter_Plugin_Sensor_init_closure) }, - { be_const_key_weak(parse_sensors, -1), be_const_closure(Matter_Plugin_Sensor_parse_sensors_closure) }, - { be_const_key_weak(value_changed, -1), be_const_closure(Matter_Plugin_Sensor_value_changed_closure) }, + { be_const_key_weak(UPDATE_TIME, 3), be_const_int(5000) }, { be_const_key_weak(tasmota_sensor_filter, -1), be_const_var(0) }, + { be_const_key_weak(pre_value, -1), be_const_closure(Matter_Plugin_Sensor_pre_value_closure) }, { be_const_key_weak(ARG, -1), be_nested_str_weak(filter) }, + { be_const_key_weak(value_changed, -1), be_const_closure(Matter_Plugin_Sensor_value_changed_closure) }, + { be_const_key_weak(init, 7), be_const_closure(Matter_Plugin_Sensor_init_closure) }, + { be_const_key_weak(parse_sensors, 5), be_const_closure(Matter_Plugin_Sensor_parse_sensors_closure) }, + { be_const_key_weak(shadow_value, -1), be_const_var(2) }, + { be_const_key_weak(tasmota_sensor_matcher, -1), be_const_var(1) }, })), be_str_weak(Matter_Plugin_Sensor) ); diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor_Humidity.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor_Humidity.h index 995146e41..179384ac0 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor_Humidity.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor_Humidity.h @@ -132,12 +132,17 @@ be_local_closure(Matter_Plugin_Sensor_Humidity_pre_value, /* name */ NULL, /* no const */ be_str_weak(pre_value), &be_const_str_solidified, - ( &(const binstruction[ 5]) { /* code */ - 0x60080009, // 0000 GETGBL R2 G9 - 0x540E0063, // 0001 LDINT R3 100 - 0x080C0203, // 0002 MUL R3 R1 R3 - 0x7C080200, // 0003 CALL R2 1 - 0x80040400, // 0004 RET 1 R2 + ( &(const binstruction[10]) { /* code */ + 0x4C080000, // 0000 LDNIL R2 + 0x20080202, // 0001 NE R2 R1 R2 + 0x780A0004, // 0002 JMPF R2 #0008 + 0x60080009, // 0003 GETGBL R2 G9 + 0x540E0063, // 0004 LDINT R3 100 + 0x080C0203, // 0005 MUL R3 R1 R3 + 0x7C080200, // 0006 CALL R2 1 + 0x70020000, // 0007 JMP #0009 + 0x4C080000, // 0008 LDNIL R2 + 0x80040400, // 0009 RET 1 R2 }) ) ); diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor_Illuminance.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor_Illuminance.h index 13650c269..99cba6068 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor_Illuminance.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor_Illuminance.h @@ -132,11 +132,16 @@ be_local_closure(Matter_Plugin_Sensor_Illuminance_pre_value, /* name */ NULL, /* no const */ be_str_weak(pre_value), &be_const_str_solidified, - ( &(const binstruction[ 4]) { /* code */ - 0x60080009, // 0000 GETGBL R2 G9 - 0x5C0C0200, // 0001 MOVE R3 R1 - 0x7C080200, // 0002 CALL R2 1 - 0x80040400, // 0003 RET 1 R2 + ( &(const binstruction[ 9]) { /* code */ + 0x4C080000, // 0000 LDNIL R2 + 0x20080202, // 0001 NE R2 R1 R2 + 0x780A0003, // 0002 JMPF R2 #0007 + 0x60080009, // 0003 GETGBL R2 G9 + 0x5C0C0200, // 0004 MOVE R3 R1 + 0x7C080200, // 0005 CALL R2 1 + 0x70020000, // 0006 JMP #0008 + 0x4C080000, // 0007 LDNIL R2 + 0x80040400, // 0008 RET 1 R2 }) ) ); diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor_Pressure.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor_Pressure.h index c36f76084..d3e645510 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor_Pressure.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor_Pressure.h @@ -132,11 +132,16 @@ be_local_closure(Matter_Plugin_Sensor_Pressure_pre_value, /* name */ NULL, /* no const */ be_str_weak(pre_value), &be_const_str_solidified, - ( &(const binstruction[ 4]) { /* code */ - 0x60080009, // 0000 GETGBL R2 G9 - 0x5C0C0200, // 0001 MOVE R3 R1 - 0x7C080200, // 0002 CALL R2 1 - 0x80040400, // 0003 RET 1 R2 + ( &(const binstruction[ 9]) { /* code */ + 0x4C080000, // 0000 LDNIL R2 + 0x20080202, // 0001 NE R2 R1 R2 + 0x780A0003, // 0002 JMPF R2 #0007 + 0x60080009, // 0003 GETGBL R2 G9 + 0x5C0C0200, // 0004 MOVE R3 R1 + 0x7C080200, // 0005 CALL R2 1 + 0x70020000, // 0006 JMP #0008 + 0x4C080000, // 0007 LDNIL R2 + 0x80040400, // 0008 RET 1 R2 }) ) ); diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor_Temp.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor_Temp.h index 4fdf3b743..13569d9e4 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor_Temp.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor_Temp.h @@ -129,12 +129,17 @@ be_local_closure(Matter_Plugin_Sensor_Temp_pre_value, /* name */ NULL, /* no const */ be_str_weak(pre_value), &be_const_str_solidified, - ( &(const binstruction[ 5]) { /* code */ - 0x60080009, // 0000 GETGBL R2 G9 - 0x540E0063, // 0001 LDINT R3 100 - 0x080C0203, // 0002 MUL R3 R1 R3 - 0x7C080200, // 0003 CALL R2 1 - 0x80040400, // 0004 RET 1 R2 + ( &(const binstruction[10]) { /* code */ + 0x4C080000, // 0000 LDNIL R2 + 0x20080202, // 0001 NE R2 R1 R2 + 0x780A0004, // 0002 JMPF R2 #0008 + 0x60080009, // 0003 GETGBL R2 G9 + 0x540E0063, // 0004 LDINT R3 100 + 0x080C0203, // 0005 MUL R3 R1 R3 + 0x7C080200, // 0006 CALL R2 1 + 0x70020000, // 0007 JMP #0009 + 0x4C080000, // 0008 LDNIL R2 + 0x80040400, // 0009 RET 1 R2 }) ) ); diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_UI.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_UI.h index 189b99c1e..76d72c390 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_UI.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_UI.h @@ -19,7 +19,7 @@ be_local_closure(Matter_UI_show_plugins_configuration, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[35]) { /* constants */ + ( &(const bvalue[36]) { /* constants */ /* K0 */ be_nested_str_weak(webserver), /* K1 */ be_nested_str_weak(string), /* K2 */ be_nested_str_weak(content_send), @@ -45,20 +45,21 @@ be_local_closure(Matter_UI_show_plugins_configuration, /* name */ /* K22 */ be_nested_str_weak(_X3C_X2Fselect_X3E_X3C_X2Ftd_X3E), /* K23 */ be_nested_str_weak(_X3Ctd_X3E_X3Cfont_X20size_X3D_X27_X2D1_X27_X3E_X26nbsp_X3B_X3C_X2Ffont_X3E_X3C_X2Ftd_X3E), /* K24 */ be_const_int(1), - /* K25 */ be_nested_str_weak(get_plugin_class_arg), - /* K26 */ be_nested_str_weak(_X3Ctr_X3E_X3Ctd_X3E_X3Cinput_X20type_X3D_X27text_X27_X20name_X3D_X27ep_X2503i_X27_X20maxlength_X3D_X274_X27_X20size_X3D_X273_X27_X20pattern_X3D_X27_X5B0_X2D9_X5D_X7B1_X2C4_X7D_X27_X20value_X3D_X27_X25i_X27_X3E_X3C_X2Ftd_X3E), - /* K27 */ be_nested_str_weak(_CLASSES_TYPES), - /* K28 */ be_nested_str_weak(_X3Ctd_X3E_X3Cfont_X20size_X3D_X27_X2D1_X27_X3E_X3Cinput_X20type_X3D_X27text_X27_X20name_X3D_X27arg_X2503i_X27_X20minlength_X3D_X270_X27_X20size_X3D_X278_X27_X20value_X3D_X27_X25s_X27_X3E_X3C_X2Ffont_X3E_X3C_X2Ftd_X3E), - /* K29 */ be_nested_str_weak(html_escape), - /* K30 */ be_nested_str_weak(_X3Ctr_X3E_X3Ctd_X3E_X3Cinput_X20type_X3D_X27text_X27_X20name_X3D_X27ep_X2503i_X27_X20maxlength_X3D_X274_X27_X20size_X3D_X273_X27_X20pattern_X3D_X27_X5B0_X2D9_X5D_X7B1_X2C4_X7D_X27_X20value_X3D_X27_X27_X3E_X3C_X2Ftd_X3E), - /* K31 */ be_nested_str_weak(_X3Ctd_X3E_X3Cfont_X20size_X3D_X27_X2D1_X27_X3E_X3Cinput_X20type_X3D_X27text_X27_X20name_X3D_X27arg_X2503i_X27_X20minlength_X3D_X270_X27_X20size_X3D_X278_X27_X20value_X3D_X27_X27_X3E_X3C_X2Ffont_X3E_X3C_X2Ftd_X3E), - /* K32 */ be_nested_str_weak(_X3C_X2Ftable_X3E_X3Cp_X3E_X3C_X2Fp_X3E), - /* K33 */ be_nested_str_weak(_X3Cbutton_X20name_X3D_X27config_X27_X20class_X3D_X27button_X20bgrn_X27_X3EChange_X20configuration_X3C_X2Fbutton_X3E_X3C_X2Fform_X3E), - /* K34 */ be_nested_str_weak(_X3Cp_X3E_X3C_X2Fp_X3E_X3C_X2Ffieldset_X3E_X3Cp_X3E_X3C_X2Fp_X3E), + /* K25 */ be_nested_str_weak(plugins_classes), + /* K26 */ be_nested_str_weak(ui_conf_to_string), + /* K27 */ be_nested_str_weak(_X3Ctr_X3E_X3Ctd_X3E_X3Cinput_X20type_X3D_X27text_X27_X20name_X3D_X27ep_X2503i_X27_X20maxlength_X3D_X274_X27_X20size_X3D_X273_X27_X20pattern_X3D_X27_X5B0_X2D9_X5D_X7B1_X2C4_X7D_X27_X20value_X3D_X27_X25i_X27_X3E_X3C_X2Ftd_X3E), + /* K28 */ be_nested_str_weak(_CLASSES_TYPES), + /* K29 */ be_nested_str_weak(_X3Ctd_X3E_X3Cfont_X20size_X3D_X27_X2D1_X27_X3E_X3Cinput_X20type_X3D_X27text_X27_X20name_X3D_X27arg_X2503i_X27_X20minlength_X3D_X270_X27_X20size_X3D_X278_X27_X20value_X3D_X27_X25s_X27_X3E_X3C_X2Ffont_X3E_X3C_X2Ftd_X3E), + /* K30 */ be_nested_str_weak(html_escape), + /* K31 */ be_nested_str_weak(_X3Ctr_X3E_X3Ctd_X3E_X3Cinput_X20type_X3D_X27text_X27_X20name_X3D_X27ep_X2503i_X27_X20maxlength_X3D_X274_X27_X20size_X3D_X273_X27_X20pattern_X3D_X27_X5B0_X2D9_X5D_X7B1_X2C4_X7D_X27_X20value_X3D_X27_X27_X3E_X3C_X2Ftd_X3E), + /* K32 */ be_nested_str_weak(_X3Ctd_X3E_X3Cfont_X20size_X3D_X27_X2D1_X27_X3E_X3Cinput_X20type_X3D_X27text_X27_X20name_X3D_X27arg_X2503i_X27_X20minlength_X3D_X270_X27_X20size_X3D_X278_X27_X20value_X3D_X27_X27_X3E_X3C_X2Ffont_X3E_X3C_X2Ftd_X3E), + /* K33 */ be_nested_str_weak(_X3C_X2Ftable_X3E_X3Cp_X3E_X3C_X2Fp_X3E), + /* K34 */ be_nested_str_weak(_X3Cbutton_X20name_X3D_X27config_X27_X20class_X3D_X27button_X20bgrn_X27_X3EChange_X20configuration_X3C_X2Fbutton_X3E_X3C_X2Fform_X3E), + /* K35 */ be_nested_str_weak(_X3Cp_X3E_X3C_X2Fp_X3E_X3C_X2Ffieldset_X3E_X3Cp_X3E_X3C_X2Fp_X3E), }), be_str_weak(show_plugins_configuration), &be_const_str_solidified, - ( &(const binstruction[180]) { /* code */ + ( &(const binstruction[181]) { /* code */ 0xA4060000, // 0000 IMPORT R1 K0 0xA40A0200, // 0001 IMPORT R2 K1 0x8C0C0302, // 0002 GETMET R3 R1 K2 @@ -137,7 +138,7 @@ be_local_closure(Matter_UI_show_plugins_configuration, /* name */ 0x5C180600, // 004B MOVE R6 R3 0x7C140200, // 004C CALL R5 1 0x14140805, // 004D LT R5 R4 R5 - 0x7816003F, // 004E JMPF R5 #008F + 0x78160040, // 004E JMPF R5 #0090 0x94140604, // 004F GETIDX R5 R3 R4 0x8818010A, // 0050 GETMBR R6 R0 K10 0x601C0008, // 0051 GETGBL R7 G8 @@ -154,91 +155,92 @@ be_local_closure(Matter_UI_show_plugins_configuration, /* name */ 0x00100918, // 005C ADD R4 R4 K24 0x7001FFEB, // 005D JMP #004A 0x8820010A, // 005E GETMBR R8 R0 K10 - 0x8C201119, // 005F GETMET R8 R8 K25 - 0x5C280E00, // 0060 MOVE R10 R7 - 0x7C200400, // 0061 CALL R8 2 - 0x78220006, // 0062 JMPF R8 #006A - 0x60240008, // 0063 GETGBL R9 G8 - 0x8C280D0E, // 0064 GETMET R10 R6 K14 - 0x5C301000, // 0065 MOVE R12 R8 - 0x58340014, // 0066 LDCONST R13 K20 - 0x7C280600, // 0067 CALL R10 3 - 0x7C240200, // 0068 CALL R9 1 - 0x70020000, // 0069 JMP #006B - 0x58240014, // 006A LDCONST R9 K20 - 0x8C280302, // 006B GETMET R10 R1 K2 - 0x8C300510, // 006C GETMET R12 R2 K16 - 0x5838001A, // 006D LDCONST R14 K26 - 0x5C3C0800, // 006E MOVE R15 R4 - 0x5C400A00, // 006F MOVE R16 R5 - 0x7C300800, // 0070 CALL R12 4 - 0x7C280400, // 0071 CALL R10 2 - 0x8C280302, // 0072 GETMET R10 R1 K2 - 0x8C300510, // 0073 GETMET R12 R2 K16 - 0x58380012, // 0074 LDCONST R14 K18 - 0x5C3C0800, // 0075 MOVE R15 R4 - 0x7C300600, // 0076 CALL R12 3 - 0x7C280400, // 0077 CALL R10 2 - 0x8C280113, // 0078 GETMET R10 R0 K19 - 0x8C300D0E, // 0079 GETMET R12 R6 K14 - 0x5838000F, // 007A LDCONST R14 K15 - 0x583C0014, // 007B LDCONST R15 K20 - 0x7C300600, // 007C CALL R12 3 - 0x8834011B, // 007D GETMBR R13 R0 K27 - 0x7C280600, // 007E CALL R10 3 - 0x8C280302, // 007F GETMET R10 R1 K2 - 0x8C300510, // 0080 GETMET R12 R2 K16 - 0x58380016, // 0081 LDCONST R14 K22 - 0x7C300400, // 0082 CALL R12 2 - 0x7C280400, // 0083 CALL R10 2 - 0x8C280302, // 0084 GETMET R10 R1 K2 - 0x8C300510, // 0085 GETMET R12 R2 K16 - 0x5838001C, // 0086 LDCONST R14 K28 - 0x5C3C0800, // 0087 MOVE R15 R4 - 0x8C40031D, // 0088 GETMET R16 R1 K29 - 0x5C481200, // 0089 MOVE R18 R9 - 0x7C400400, // 008A CALL R16 2 - 0x7C300800, // 008B CALL R12 4 - 0x7C280400, // 008C CALL R10 2 - 0x00100918, // 008D ADD R4 R4 K24 - 0x7001FFBA, // 008E JMP #004A - 0x8C140302, // 008F GETMET R5 R1 K2 - 0x8C1C0510, // 0090 GETMET R7 R2 K16 - 0x5824001E, // 0091 LDCONST R9 K30 - 0x5C280800, // 0092 MOVE R10 R4 - 0x7C1C0600, // 0093 CALL R7 3 - 0x7C140400, // 0094 CALL R5 2 - 0x8C140302, // 0095 GETMET R5 R1 K2 - 0x8C1C0510, // 0096 GETMET R7 R2 K16 - 0x58240012, // 0097 LDCONST R9 K18 - 0x5C280800, // 0098 MOVE R10 R4 - 0x7C1C0600, // 0099 CALL R7 3 - 0x7C140400, // 009A CALL R5 2 - 0x8C140113, // 009B GETMET R5 R0 K19 - 0x581C0014, // 009C LDCONST R7 K20 - 0x8820011B, // 009D GETMBR R8 R0 K27 - 0x7C140600, // 009E CALL R5 3 - 0x8C140302, // 009F GETMET R5 R1 K2 - 0x8C1C0510, // 00A0 GETMET R7 R2 K16 - 0x58240016, // 00A1 LDCONST R9 K22 - 0x7C1C0400, // 00A2 CALL R7 2 - 0x7C140400, // 00A3 CALL R5 2 - 0x8C140302, // 00A4 GETMET R5 R1 K2 - 0x8C1C0510, // 00A5 GETMET R7 R2 K16 - 0x5824001F, // 00A6 LDCONST R9 K31 - 0x5C280800, // 00A7 MOVE R10 R4 - 0x7C1C0600, // 00A8 CALL R7 3 - 0x7C140400, // 00A9 CALL R5 2 - 0x8C140302, // 00AA GETMET R5 R1 K2 - 0x581C0020, // 00AB LDCONST R7 K32 - 0x7C140400, // 00AC CALL R5 2 - 0x8C140302, // 00AD GETMET R5 R1 K2 - 0x581C0021, // 00AE LDCONST R7 K33 - 0x7C140400, // 00AF CALL R5 2 - 0x8C140302, // 00B0 GETMET R5 R1 K2 - 0x581C0022, // 00B1 LDCONST R7 K34 - 0x7C140400, // 00B2 CALL R5 2 - 0x80000000, // 00B3 RET 0 + 0x88201119, // 005F GETMBR R8 R8 K25 + 0x8C20110E, // 0060 GETMET R8 R8 K14 + 0x5C280E00, // 0061 MOVE R10 R7 + 0x7C200400, // 0062 CALL R8 2 + 0x58240014, // 0063 LDCONST R9 K20 + 0x4C280000, // 0064 LDNIL R10 + 0x2028100A, // 0065 NE R10 R8 R10 + 0x782A0004, // 0066 JMPF R10 #006C + 0x8C28111A, // 0067 GETMET R10 R8 K26 + 0x5C301000, // 0068 MOVE R12 R8 + 0x5C340C00, // 0069 MOVE R13 R6 + 0x7C280600, // 006A CALL R10 3 + 0x5C241400, // 006B MOVE R9 R10 + 0x8C280302, // 006C GETMET R10 R1 K2 + 0x8C300510, // 006D GETMET R12 R2 K16 + 0x5838001B, // 006E LDCONST R14 K27 + 0x5C3C0800, // 006F MOVE R15 R4 + 0x5C400A00, // 0070 MOVE R16 R5 + 0x7C300800, // 0071 CALL R12 4 + 0x7C280400, // 0072 CALL R10 2 + 0x8C280302, // 0073 GETMET R10 R1 K2 + 0x8C300510, // 0074 GETMET R12 R2 K16 + 0x58380012, // 0075 LDCONST R14 K18 + 0x5C3C0800, // 0076 MOVE R15 R4 + 0x7C300600, // 0077 CALL R12 3 + 0x7C280400, // 0078 CALL R10 2 + 0x8C280113, // 0079 GETMET R10 R0 K19 + 0x8C300D0E, // 007A GETMET R12 R6 K14 + 0x5838000F, // 007B LDCONST R14 K15 + 0x583C0014, // 007C LDCONST R15 K20 + 0x7C300600, // 007D CALL R12 3 + 0x8834011C, // 007E GETMBR R13 R0 K28 + 0x7C280600, // 007F CALL R10 3 + 0x8C280302, // 0080 GETMET R10 R1 K2 + 0x8C300510, // 0081 GETMET R12 R2 K16 + 0x58380016, // 0082 LDCONST R14 K22 + 0x7C300400, // 0083 CALL R12 2 + 0x7C280400, // 0084 CALL R10 2 + 0x8C280302, // 0085 GETMET R10 R1 K2 + 0x8C300510, // 0086 GETMET R12 R2 K16 + 0x5838001D, // 0087 LDCONST R14 K29 + 0x5C3C0800, // 0088 MOVE R15 R4 + 0x8C40031E, // 0089 GETMET R16 R1 K30 + 0x5C481200, // 008A MOVE R18 R9 + 0x7C400400, // 008B CALL R16 2 + 0x7C300800, // 008C CALL R12 4 + 0x7C280400, // 008D CALL R10 2 + 0x00100918, // 008E ADD R4 R4 K24 + 0x7001FFB9, // 008F JMP #004A + 0x8C140302, // 0090 GETMET R5 R1 K2 + 0x8C1C0510, // 0091 GETMET R7 R2 K16 + 0x5824001F, // 0092 LDCONST R9 K31 + 0x5C280800, // 0093 MOVE R10 R4 + 0x7C1C0600, // 0094 CALL R7 3 + 0x7C140400, // 0095 CALL R5 2 + 0x8C140302, // 0096 GETMET R5 R1 K2 + 0x8C1C0510, // 0097 GETMET R7 R2 K16 + 0x58240012, // 0098 LDCONST R9 K18 + 0x5C280800, // 0099 MOVE R10 R4 + 0x7C1C0600, // 009A CALL R7 3 + 0x7C140400, // 009B CALL R5 2 + 0x8C140113, // 009C GETMET R5 R0 K19 + 0x581C0014, // 009D LDCONST R7 K20 + 0x8820011C, // 009E GETMBR R8 R0 K28 + 0x7C140600, // 009F CALL R5 3 + 0x8C140302, // 00A0 GETMET R5 R1 K2 + 0x8C1C0510, // 00A1 GETMET R7 R2 K16 + 0x58240016, // 00A2 LDCONST R9 K22 + 0x7C1C0400, // 00A3 CALL R7 2 + 0x7C140400, // 00A4 CALL R5 2 + 0x8C140302, // 00A5 GETMET R5 R1 K2 + 0x8C1C0510, // 00A6 GETMET R7 R2 K16 + 0x58240020, // 00A7 LDCONST R9 K32 + 0x5C280800, // 00A8 MOVE R10 R4 + 0x7C1C0600, // 00A9 CALL R7 3 + 0x7C140400, // 00AA CALL R5 2 + 0x8C140302, // 00AB GETMET R5 R1 K2 + 0x581C0021, // 00AC LDCONST R7 K33 + 0x7C140400, // 00AD CALL R5 2 + 0x8C140302, // 00AE GETMET R5 R1 K2 + 0x581C0022, // 00AF LDCONST R7 K34 + 0x7C140400, // 00B0 CALL R5 2 + 0x8C140302, // 00B1 GETMET R5 R1 K2 + 0x581C0023, // 00B2 LDCONST R7 K35 + 0x7C140400, // 00B3 CALL R5 2 + 0x80000000, // 00B4 RET 0 }) ) ); @@ -658,7 +660,7 @@ be_local_closure(Matter_UI_page_part_ctl, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[72]) { /* constants */ + ( &(const bvalue[71]) { /* constants */ /* K0 */ be_nested_str_weak(webserver), /* K1 */ be_nested_str_weak(check_privileged_access), /* K2 */ be_nested_str_weak(string), @@ -709,32 +711,31 @@ be_local_closure(Matter_UI_page_part_ctl, /* name */ /* K47 */ be_nested_str_weak(plugins_classes), /* K48 */ be_nested_str_weak(find), /* K49 */ be_nested_str_weak(type), - /* K50 */ be_nested_str_weak(ARG), - /* K51 */ be_nested_str_weak(ARG_TYPE), - /* K52 */ be_nested_str_weak(MTR_X3A_X20unknown_X20type_X20_X3D_X20_X25s), - /* K53 */ be_const_int(2), - /* K54 */ be_nested_str_weak(MTR_X3A_X20skipping_X20parameter), - /* K55 */ be_nested_str_weak(MTR_X3A_X20config_X20_X3D_X20_X25s), - /* K56 */ be_nested_str_weak(contains), - /* K57 */ be_nested_str_weak(0), - /* K58 */ be_nested_str_weak(Missing_X20endpoint_X200), - /* K59 */ be_nested_str_weak(MTR_X3A_X20config_X20error_X20_X3D_X20_X25s), - /* K60 */ be_nested_str_weak(plugins_config), - /* K61 */ be_nested_str_weak(content_start), - /* K62 */ be_nested_str_weak(Parameter_X20error), - /* K63 */ be_nested_str_weak(content_send_style), - /* K64 */ be_nested_str_weak(content_send), - /* K65 */ be_nested_str_weak(_X3Cp_X20style_X3D_X27width_X3A340px_X3B_X27_X3E_X3Cb_X3EError_X3A_X3C_X2Fb_X3E_X25s_X3C_X2Fp_X3E), - /* K66 */ be_nested_str_weak(html_escape), - /* K67 */ be_nested_str_weak(content_button), - /* K68 */ be_nested_str_weak(BUTTON_CONFIGURATION), - /* K69 */ be_nested_str_weak(content_stop), - /* K70 */ be_nested_str_weak(BRY_X3A_X20Exception_X3E_X20_X27_X25s_X27_X20_X2D_X20_X25s), - /* K71 */ be_nested_str_weak(_X3Cp_X20style_X3D_X27width_X3A340px_X3B_X27_X3E_X3Cb_X3EException_X3A_X3C_X2Fb_X3E_X3Cbr_X3E_X27_X25s_X27_X3Cbr_X3E_X25s_X3C_X2Fp_X3E), + /* K50 */ be_nested_str_weak(ui_string_to_conf), + /* K51 */ be_nested_str_weak(MTR_X3A_X20unknown_X20type_X20_X3D_X20_X25s), + /* K52 */ be_const_int(2), + /* K53 */ be_nested_str_weak(MTR_X3A_X20skipping_X20parameter), + /* K54 */ be_nested_str_weak(MTR_X3A_X20config_X20_X3D_X20_X25s), + /* K55 */ be_nested_str_weak(contains), + /* K56 */ be_nested_str_weak(0), + /* K57 */ be_nested_str_weak(Missing_X20endpoint_X200), + /* K58 */ be_nested_str_weak(MTR_X3A_X20config_X20error_X20_X3D_X20_X25s), + /* K59 */ be_nested_str_weak(plugins_config), + /* K60 */ be_nested_str_weak(content_start), + /* K61 */ be_nested_str_weak(Parameter_X20error), + /* K62 */ be_nested_str_weak(content_send_style), + /* K63 */ be_nested_str_weak(content_send), + /* K64 */ be_nested_str_weak(_X3Cp_X20style_X3D_X27width_X3A340px_X3B_X27_X3E_X3Cb_X3EError_X3A_X3C_X2Fb_X3E_X25s_X3C_X2Fp_X3E), + /* K65 */ be_nested_str_weak(html_escape), + /* K66 */ be_nested_str_weak(content_button), + /* K67 */ be_nested_str_weak(BUTTON_CONFIGURATION), + /* K68 */ be_nested_str_weak(content_stop), + /* K69 */ be_nested_str_weak(BRY_X3A_X20Exception_X3E_X20_X27_X25s_X27_X20_X2D_X20_X25s), + /* K70 */ be_nested_str_weak(_X3Cp_X20style_X3D_X27width_X3A340px_X3B_X27_X3E_X3Cb_X3EException_X3A_X3C_X2Fb_X3E_X3Cbr_X3E_X27_X25s_X27_X3Cbr_X3E_X25s_X3C_X2Fp_X3E), }), be_str_weak(page_part_ctl), &be_const_str_solidified, - ( &(const binstruction[356]) { /* code */ + ( &(const binstruction[353]) { /* code */ 0xA4060000, // 0000 IMPORT R1 K0 0x8C080301, // 0001 GETMET R2 R1 K1 0x7C080200, // 0002 CALL R2 1 @@ -745,7 +746,7 @@ be_local_closure(Matter_UI_page_part_ctl, /* name */ 0xA40E0600, // 0007 IMPORT R3 K3 0xA4120800, // 0008 IMPORT R4 K4 0x4C140000, // 0009 LDNIL R5 - 0xA8020139, // 000A EXBLK 0 #0145 + 0xA8020136, // 000A EXBLK 0 #0142 0x8C180305, // 000B GETMET R6 R1 K5 0x58200006, // 000C LDCONST R8 K6 0x7C180400, // 000D CALL R6 2 @@ -796,7 +797,7 @@ be_local_closure(Matter_UI_page_part_ctl, /* name */ 0x8C180315, // 003A GETMET R6 R1 K21 0x58200016, // 003B LDCONST R8 K22 0x7C180400, // 003C CALL R6 2 - 0x700200F1, // 003D JMP #0130 + 0x700200EE, // 003D JMP #012D 0x8C180305, // 003E GETMET R6 R1 K5 0x58200017, // 003F LDCONST R8 K23 0x7C180400, // 0040 CALL R6 2 @@ -821,7 +822,7 @@ be_local_closure(Matter_UI_page_part_ctl, /* name */ 0x8C180315, // 0053 GETMET R6 R1 K21 0x58200016, // 0054 LDCONST R8 K22 0x7C180400, // 0055 CALL R6 2 - 0x700200D8, // 0056 JMP #0130 + 0x700200D5, // 0056 JMP #012D 0x8C180305, // 0057 GETMET R6 R1 K5 0x5820001D, // 0058 LDCONST R8 K29 0x7C180400, // 0059 CALL R6 2 @@ -846,7 +847,7 @@ be_local_closure(Matter_UI_page_part_ctl, /* name */ 0x8C180315, // 006C GETMET R6 R1 K21 0x58200016, // 006D LDCONST R8 K22 0x7C180400, // 006E CALL R6 2 - 0x700200BF, // 006F JMP #0130 + 0x700200BC, // 006F JMP #012D 0x8C180305, // 0070 GETMET R6 R1 K5 0x5820001F, // 0071 LDCONST R8 K31 0x7C180400, // 0072 CALL R6 2 @@ -889,7 +890,7 @@ be_local_closure(Matter_UI_page_part_ctl, /* name */ 0x8C240315, // 0097 GETMET R9 R1 K21 0x582C0026, // 0098 LDCONST R11 K38 0x7C240400, // 0099 CALL R9 2 - 0x70020094, // 009A JMP #0130 + 0x70020091, // 009A JMP #012D 0x8C180305, // 009B GETMET R6 R1 K5 0x58200027, // 009C LDCONST R8 K39 0x7C180400, // 009D CALL R6 2 @@ -911,11 +912,11 @@ be_local_closure(Matter_UI_page_part_ctl, /* name */ 0x8C180315, // 00AD GETMET R6 R1 K21 0x58200016, // 00AE LDCONST R8 K22 0x7C180400, // 00AF CALL R6 2 - 0x7002007E, // 00B0 JMP #0130 + 0x7002007B, // 00B0 JMP #012D 0x8C180305, // 00B1 GETMET R6 R1 K5 0x58200029, // 00B2 LDCONST R8 K41 0x7C180400, // 00B3 CALL R6 2 - 0x781A007A, // 00B4 JMPF R6 #0130 + 0x781A0077, // 00B4 JMPF R6 #012D 0x60180013, // 00B5 GETGBL R6 G19 0x7C180000, // 00B6 CALL R6 0 0xB81E1000, // 00B7 GETNGBL R7 K8 @@ -934,7 +935,7 @@ be_local_closure(Matter_UI_page_part_ctl, /* name */ 0x8C240305, // 00C4 GETMET R9 R1 K5 0x002E5608, // 00C5 ADD R11 K43 R8 0x7C240400, // 00C6 CALL R9 2 - 0x78260043, // 00C7 JMPF R9 #010C + 0x78260040, // 00C7 JMPF R9 #0109 0x8C24030F, // 00C8 GETMET R9 R1 K15 0x002E5608, // 00C9 ADD R11 K43 R8 0x7C240400, // 00CA CALL R9 2 @@ -958,9 +959,9 @@ be_local_closure(Matter_UI_page_part_ctl, /* name */ 0x5840000C, // 00DC LDCONST R16 K12 0x7C340600, // 00DD CALL R13 3 0x2034132E, // 00DE NE R13 R9 K46 - 0x7836001F, // 00DF JMPF R13 #0100 + 0x7836001C, // 00DF JMPF R13 #00FD 0x2034172E, // 00E0 NE R13 R11 K46 - 0x7836001D, // 00E1 JMPF R13 #0100 + 0x7836001A, // 00E1 JMPF R13 #00FD 0x8834010D, // 00E2 GETMBR R13 R0 K13 0x88341B2F, // 00E3 GETMBR R13 R13 K47 0x8C341B30, // 00E4 GETMET R13 R13 K48 @@ -968,129 +969,126 @@ be_local_closure(Matter_UI_page_part_ctl, /* name */ 0x7C340400, // 00E6 CALL R13 2 0x4C380000, // 00E7 LDNIL R14 0x20381A0E, // 00E8 NE R14 R13 R14 - 0x783A000C, // 00E9 JMPF R14 #00F7 + 0x783A0009, // 00E9 JMPF R14 #00F4 0x60380013, // 00EA GETGBL R14 G19 0x7C380000, // 00EB CALL R14 0 0x983A620B, // 00EC SETIDX R14 K49 R11 - 0x883C1B32, // 00ED GETMBR R15 R13 K50 - 0x88401B33, // 00EE GETMBR R16 R13 K51 - 0x78320004, // 00EF JMPF R12 #00F5 - 0x783E0003, // 00F0 JMPF R15 #00F5 - 0x5C442000, // 00F1 MOVE R17 R16 - 0x5C481800, // 00F2 MOVE R18 R12 - 0x7C440200, // 00F3 CALL R17 1 - 0x98381E11, // 00F4 SETIDX R14 R15 R17 - 0x9818120E, // 00F5 SETIDX R6 R9 R14 - 0x70020007, // 00F6 JMP #00FF - 0xB83A1000, // 00F7 GETNGBL R14 K8 - 0x8C381D09, // 00F8 GETMET R14 R14 K9 - 0x8C40050A, // 00F9 GETMET R16 R2 K10 - 0x58480034, // 00FA LDCONST R18 K52 - 0x5C4C1600, // 00FB MOVE R19 R11 - 0x7C400600, // 00FC CALL R16 3 - 0x58440035, // 00FD LDCONST R17 K53 - 0x7C380600, // 00FE CALL R14 3 - 0x70020004, // 00FF JMP #0105 - 0xB8361000, // 0100 GETNGBL R13 K8 - 0x8C341B09, // 0101 GETMET R13 R13 K9 - 0x583C0036, // 0102 LDCONST R15 K54 - 0x58400035, // 0103 LDCONST R16 K53 - 0x7C340600, // 0104 CALL R13 3 - 0x001C0F25, // 0105 ADD R7 R7 K37 - 0x8C34050A, // 0106 GETMET R13 R2 K10 - 0x583C002A, // 0107 LDCONST R15 K42 - 0x5C400E00, // 0108 MOVE R16 R7 - 0x7C340600, // 0109 CALL R13 3 - 0x5C201A00, // 010A MOVE R8 R13 - 0x7001FFB7, // 010B JMP #00C4 - 0xB8261000, // 010C GETNGBL R9 K8 - 0x8C241309, // 010D GETMET R9 R9 K9 - 0x8C2C050A, // 010E GETMET R11 R2 K10 - 0x58340037, // 010F LDCONST R13 K55 - 0x60380008, // 0110 GETGBL R14 G8 - 0x5C3C0C00, // 0111 MOVE R15 R6 - 0x7C380200, // 0112 CALL R14 1 - 0x7C2C0600, // 0113 CALL R11 3 - 0x5830000C, // 0114 LDCONST R12 K12 - 0x7C240600, // 0115 CALL R9 3 - 0x8C240D38, // 0116 GETMET R9 R6 K56 - 0x582C0039, // 0117 LDCONST R11 K57 - 0x7C240400, // 0118 CALL R9 2 - 0x74260000, // 0119 JMPT R9 #011B - 0x5814003A, // 011A LDCONST R5 K58 - 0x78160008, // 011B JMPF R5 #0125 - 0xB8261000, // 011C GETNGBL R9 K8 - 0x8C241309, // 011D GETMET R9 R9 K9 - 0x8C2C050A, // 011E GETMET R11 R2 K10 - 0x5834003B, // 011F LDCONST R13 K59 - 0x5C380A00, // 0120 MOVE R14 R5 - 0x7C2C0600, // 0121 CALL R11 3 - 0x5830000C, // 0122 LDCONST R12 K12 - 0x7C240600, // 0123 CALL R9 3 - 0x7002000A, // 0124 JMP #0130 - 0x8824010D, // 0125 GETMBR R9 R0 K13 - 0x90267806, // 0126 SETMBR R9 K60 R6 + 0x8C3C1B32, // 00ED GETMET R15 R13 K50 + 0x5C441A00, // 00EE MOVE R17 R13 + 0x5C481C00, // 00EF MOVE R18 R14 + 0x5C4C1800, // 00F0 MOVE R19 R12 + 0x7C3C0800, // 00F1 CALL R15 4 + 0x9818120E, // 00F2 SETIDX R6 R9 R14 + 0x70020007, // 00F3 JMP #00FC + 0xB83A1000, // 00F4 GETNGBL R14 K8 + 0x8C381D09, // 00F5 GETMET R14 R14 K9 + 0x8C40050A, // 00F6 GETMET R16 R2 K10 + 0x58480033, // 00F7 LDCONST R18 K51 + 0x5C4C1600, // 00F8 MOVE R19 R11 + 0x7C400600, // 00F9 CALL R16 3 + 0x58440034, // 00FA LDCONST R17 K52 + 0x7C380600, // 00FB CALL R14 3 + 0x70020004, // 00FC JMP #0102 + 0xB8361000, // 00FD GETNGBL R13 K8 + 0x8C341B09, // 00FE GETMET R13 R13 K9 + 0x583C0035, // 00FF LDCONST R15 K53 + 0x58400034, // 0100 LDCONST R16 K52 + 0x7C340600, // 0101 CALL R13 3 + 0x001C0F25, // 0102 ADD R7 R7 K37 + 0x8C34050A, // 0103 GETMET R13 R2 K10 + 0x583C002A, // 0104 LDCONST R15 K42 + 0x5C400E00, // 0105 MOVE R16 R7 + 0x7C340600, // 0106 CALL R13 3 + 0x5C201A00, // 0107 MOVE R8 R13 + 0x7001FFBA, // 0108 JMP #00C4 + 0xB8261000, // 0109 GETNGBL R9 K8 + 0x8C241309, // 010A GETMET R9 R9 K9 + 0x8C2C050A, // 010B GETMET R11 R2 K10 + 0x58340036, // 010C LDCONST R13 K54 + 0x60380008, // 010D GETGBL R14 G8 + 0x5C3C0C00, // 010E MOVE R15 R6 + 0x7C380200, // 010F CALL R14 1 + 0x7C2C0600, // 0110 CALL R11 3 + 0x5830000C, // 0111 LDCONST R12 K12 + 0x7C240600, // 0112 CALL R9 3 + 0x8C240D37, // 0113 GETMET R9 R6 K55 + 0x582C0038, // 0114 LDCONST R11 K56 + 0x7C240400, // 0115 CALL R9 2 + 0x74260000, // 0116 JMPT R9 #0118 + 0x58140039, // 0117 LDCONST R5 K57 + 0x78160008, // 0118 JMPF R5 #0122 + 0xB8261000, // 0119 GETNGBL R9 K8 + 0x8C241309, // 011A GETMET R9 R9 K9 + 0x8C2C050A, // 011B GETMET R11 R2 K10 + 0x5834003A, // 011C LDCONST R13 K58 + 0x5C380A00, // 011D MOVE R14 R5 + 0x7C2C0600, // 011E CALL R11 3 + 0x5830000C, // 011F LDCONST R12 K12 + 0x7C240600, // 0120 CALL R9 3 + 0x7002000A, // 0121 JMP #012D + 0x8824010D, // 0122 GETMBR R9 R0 K13 + 0x90267606, // 0123 SETMBR R9 K59 R6 + 0x8824010D, // 0124 GETMBR R9 R0 K13 + 0x50280200, // 0125 LDBOOL R10 1 0 + 0x9026500A, // 0126 SETMBR R9 K40 R10 0x8824010D, // 0127 GETMBR R9 R0 K13 - 0x50280200, // 0128 LDBOOL R10 1 0 - 0x9026500A, // 0129 SETMBR R9 K40 R10 - 0x8824010D, // 012A GETMBR R9 R0 K13 - 0x8C241314, // 012B GETMET R9 R9 K20 - 0x7C240200, // 012C CALL R9 1 - 0x8C240315, // 012D GETMET R9 R1 K21 - 0x582C0016, // 012E LDCONST R11 K22 - 0x7C240400, // 012F CALL R9 2 - 0x78160011, // 0130 JMPF R5 #0143 - 0x8C18033D, // 0131 GETMET R6 R1 K61 - 0x5820003E, // 0132 LDCONST R8 K62 - 0x7C180400, // 0133 CALL R6 2 - 0x8C18033F, // 0134 GETMET R6 R1 K63 - 0x7C180200, // 0135 CALL R6 1 - 0x8C180340, // 0136 GETMET R6 R1 K64 - 0x8C20050A, // 0137 GETMET R8 R2 K10 - 0x58280041, // 0138 LDCONST R10 K65 - 0x8C2C0342, // 0139 GETMET R11 R1 K66 - 0x5C340A00, // 013A MOVE R13 R5 - 0x7C2C0400, // 013B CALL R11 2 - 0x7C200600, // 013C CALL R8 3 + 0x8C241314, // 0128 GETMET R9 R9 K20 + 0x7C240200, // 0129 CALL R9 1 + 0x8C240315, // 012A GETMET R9 R1 K21 + 0x582C0016, // 012B LDCONST R11 K22 + 0x7C240400, // 012C CALL R9 2 + 0x78160011, // 012D JMPF R5 #0140 + 0x8C18033C, // 012E GETMET R6 R1 K60 + 0x5820003D, // 012F LDCONST R8 K61 + 0x7C180400, // 0130 CALL R6 2 + 0x8C18033E, // 0131 GETMET R6 R1 K62 + 0x7C180200, // 0132 CALL R6 1 + 0x8C18033F, // 0133 GETMET R6 R1 K63 + 0x8C20050A, // 0134 GETMET R8 R2 K10 + 0x58280040, // 0135 LDCONST R10 K64 + 0x8C2C0341, // 0136 GETMET R11 R1 K65 + 0x5C340A00, // 0137 MOVE R13 R5 + 0x7C2C0400, // 0138 CALL R11 2 + 0x7C200600, // 0139 CALL R8 3 + 0x7C180400, // 013A CALL R6 2 + 0x8C180342, // 013B GETMET R6 R1 K66 + 0x88200343, // 013C GETMBR R8 R1 K67 0x7C180400, // 013D CALL R6 2 - 0x8C180343, // 013E GETMET R6 R1 K67 - 0x88200344, // 013F GETMBR R8 R1 K68 - 0x7C180400, // 0140 CALL R6 2 - 0x8C180345, // 0141 GETMET R6 R1 K69 - 0x7C180200, // 0142 CALL R6 1 - 0xA8040001, // 0143 EXBLK 1 1 - 0x7002001D, // 0144 JMP #0163 - 0xAC180002, // 0145 CATCH R6 0 2 - 0x7002001A, // 0146 JMP #0162 - 0xB8221000, // 0147 GETNGBL R8 K8 - 0x8C201109, // 0148 GETMET R8 R8 K9 - 0x8C28050A, // 0149 GETMET R10 R2 K10 - 0x58300046, // 014A LDCONST R12 K70 - 0x5C340C00, // 014B MOVE R13 R6 - 0x5C380E00, // 014C MOVE R14 R7 - 0x7C280800, // 014D CALL R10 4 - 0x582C0035, // 014E LDCONST R11 K53 - 0x7C200600, // 014F CALL R8 3 - 0x8C20033D, // 0150 GETMET R8 R1 K61 - 0x5828003E, // 0151 LDCONST R10 K62 - 0x7C200400, // 0152 CALL R8 2 - 0x8C20033F, // 0153 GETMET R8 R1 K63 - 0x7C200200, // 0154 CALL R8 1 - 0x8C200340, // 0155 GETMET R8 R1 K64 - 0x8C28050A, // 0156 GETMET R10 R2 K10 - 0x58300047, // 0157 LDCONST R12 K71 - 0x5C340C00, // 0158 MOVE R13 R6 - 0x5C380E00, // 0159 MOVE R14 R7 - 0x7C280800, // 015A CALL R10 4 + 0x8C180344, // 013E GETMET R6 R1 K68 + 0x7C180200, // 013F CALL R6 1 + 0xA8040001, // 0140 EXBLK 1 1 + 0x7002001D, // 0141 JMP #0160 + 0xAC180002, // 0142 CATCH R6 0 2 + 0x7002001A, // 0143 JMP #015F + 0xB8221000, // 0144 GETNGBL R8 K8 + 0x8C201109, // 0145 GETMET R8 R8 K9 + 0x8C28050A, // 0146 GETMET R10 R2 K10 + 0x58300045, // 0147 LDCONST R12 K69 + 0x5C340C00, // 0148 MOVE R13 R6 + 0x5C380E00, // 0149 MOVE R14 R7 + 0x7C280800, // 014A CALL R10 4 + 0x582C0034, // 014B LDCONST R11 K52 + 0x7C200600, // 014C CALL R8 3 + 0x8C20033C, // 014D GETMET R8 R1 K60 + 0x5828003D, // 014E LDCONST R10 K61 + 0x7C200400, // 014F CALL R8 2 + 0x8C20033E, // 0150 GETMET R8 R1 K62 + 0x7C200200, // 0151 CALL R8 1 + 0x8C20033F, // 0152 GETMET R8 R1 K63 + 0x8C28050A, // 0153 GETMET R10 R2 K10 + 0x58300046, // 0154 LDCONST R12 K70 + 0x5C340C00, // 0155 MOVE R13 R6 + 0x5C380E00, // 0156 MOVE R14 R7 + 0x7C280800, // 0157 CALL R10 4 + 0x7C200400, // 0158 CALL R8 2 + 0x8C200342, // 0159 GETMET R8 R1 K66 + 0x88280343, // 015A GETMBR R10 R1 K67 0x7C200400, // 015B CALL R8 2 - 0x8C200343, // 015C GETMET R8 R1 K67 - 0x88280344, // 015D GETMBR R10 R1 K68 - 0x7C200400, // 015E CALL R8 2 - 0x8C200345, // 015F GETMET R8 R1 K69 - 0x7C200200, // 0160 CALL R8 1 - 0x70020000, // 0161 JMP #0163 - 0xB0080000, // 0162 RAISE 2 R0 R0 - 0x80000000, // 0163 RET 0 + 0x8C200344, // 015C GETMET R8 R1 K68 + 0x7C200200, // 015D CALL R8 1 + 0x70020000, // 015E JMP #0160 + 0xB0080000, // 015F RAISE 2 R0 R0 + 0x80000000, // 0160 RET 0 }) ) ); @@ -1318,7 +1316,7 @@ be_local_closure(Matter_UI_plugin_option, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[14]) { /* constants */ + ( &(const bvalue[16]) { /* constants */ /* K0 */ be_nested_str_weak(webserver), /* K1 */ be_nested_str_weak(string), /* K2 */ be_nested_str_weak(split), @@ -1327,16 +1325,18 @@ be_local_closure(Matter_UI_plugin_option, /* name */ /* K5 */ be_nested_str_weak(), /* K6 */ be_nested_str_weak(content_send), /* K7 */ be_nested_str_weak(_X3Coption_X20value_X3D_X27_X27_X3E_X3C_X2Foption_X3E), - /* K8 */ be_nested_str_weak(device), - /* K9 */ be_nested_str_weak(get_plugin_class_displayname), - /* K10 */ be_nested_str_weak(format), - /* K11 */ be_nested_str_weak(_X3Coption_X20value_X3D_X27_X25s_X27_X25s_X3E_X25s_X3C_X2Foption_X3E), - /* K12 */ be_nested_str_weak(_X20selected), - /* K13 */ be_const_int(1), + /* K8 */ be_nested_str_weak(_X2Dhttp), + /* K9 */ be_nested_str_weak(_X3Coption_X20value_X3D_X27_X27_X20disabled_X3E_X2D_X2D_X2D_X20Tasmota_X20Remote_X20_X2D_X2D_X2D_X3C_X2Foption_X3E), + /* K10 */ be_nested_str_weak(device), + /* K11 */ be_nested_str_weak(get_plugin_class_displayname), + /* K12 */ be_nested_str_weak(format), + /* K13 */ be_nested_str_weak(_X3Coption_X20value_X3D_X27_X25s_X27_X25s_X3E_X25s_X3C_X2Foption_X3E), + /* K14 */ be_nested_str_weak(_X20selected), + /* K15 */ be_const_int(1), }), be_str_weak(plugin_option), &be_const_str_solidified, - ( &(const binstruction[42]) { /* code */ + ( &(const binstruction[48]) { /* code */ 0xA40E0000, // 0000 IMPORT R3 K0 0xA4120200, // 0001 IMPORT R4 K1 0x780A0004, // 0002 JMPF R2 #0008 @@ -1352,33 +1352,39 @@ be_local_closure(Matter_UI_plugin_option, /* name */ 0x5C200A00, // 000C MOVE R8 R5 0x7C1C0200, // 000D CALL R7 1 0x141C0C07, // 000E LT R7 R6 R7 - 0x781E0018, // 000F JMPF R7 #0029 + 0x781E001E, // 000F JMPF R7 #002F 0x941C0A06, // 0010 GETIDX R7 R5 R6 0x1C200F05, // 0011 EQ R8 R7 K5 0x78220003, // 0012 JMPF R8 #0017 0x8C200706, // 0013 GETMET R8 R3 K6 0x58280007, // 0014 LDCONST R10 K7 0x7C200400, // 0015 CALL R8 2 - 0x7002000F, // 0016 JMP #0027 - 0x88200108, // 0017 GETMBR R8 R0 K8 - 0x8C201109, // 0018 GETMET R8 R8 K9 - 0x5C280E00, // 0019 MOVE R10 R7 - 0x7C200400, // 001A CALL R8 2 - 0x8C240706, // 001B GETMET R9 R3 K6 - 0x8C2C090A, // 001C GETMET R11 R4 K10 - 0x5834000B, // 001D LDCONST R13 K11 - 0x5C380E00, // 001E MOVE R14 R7 - 0x1C3C0E01, // 001F EQ R15 R7 R1 - 0x783E0001, // 0020 JMPF R15 #0023 - 0x583C000C, // 0021 LDCONST R15 K12 - 0x70020000, // 0022 JMP #0024 - 0x583C0005, // 0023 LDCONST R15 K5 - 0x5C401000, // 0024 MOVE R16 R8 - 0x7C2C0A00, // 0025 CALL R11 5 - 0x7C240400, // 0026 CALL R9 2 - 0x00180D0D, // 0027 ADD R6 R6 K13 - 0x7001FFE1, // 0028 JMP #000B - 0x80000000, // 0029 RET 0 + 0x70020015, // 0016 JMP #002D + 0x1C200F08, // 0017 EQ R8 R7 K8 + 0x78220003, // 0018 JMPF R8 #001D + 0x8C200706, // 0019 GETMET R8 R3 K6 + 0x58280009, // 001A LDCONST R10 K9 + 0x7C200400, // 001B CALL R8 2 + 0x7002000F, // 001C JMP #002D + 0x8820010A, // 001D GETMBR R8 R0 K10 + 0x8C20110B, // 001E GETMET R8 R8 K11 + 0x5C280E00, // 001F MOVE R10 R7 + 0x7C200400, // 0020 CALL R8 2 + 0x8C240706, // 0021 GETMET R9 R3 K6 + 0x8C2C090C, // 0022 GETMET R11 R4 K12 + 0x5834000D, // 0023 LDCONST R13 K13 + 0x5C380E00, // 0024 MOVE R14 R7 + 0x1C3C0E01, // 0025 EQ R15 R7 R1 + 0x783E0001, // 0026 JMPF R15 #0029 + 0x583C000E, // 0027 LDCONST R15 K14 + 0x70020000, // 0028 JMP #002A + 0x583C0005, // 0029 LDCONST R15 K5 + 0x5C401000, // 002A MOVE R16 R8 + 0x7C2C0A00, // 002B CALL R11 5 + 0x7C240400, // 002C CALL R9 2 + 0x00180D0F, // 002D ADD R6 R6 K15 + 0x7001FFDB, // 002E JMP #000B + 0x80000000, // 002F RET 0 }) ) ); @@ -1792,7 +1798,7 @@ be_local_class(Matter_UI, be_nested_map(17, ( (struct bmapnode*) &(const bmapnode[]) { { be_const_key_weak(show_plugins_configuration, -1), be_const_closure(Matter_UI_show_plugins_configuration_closure) }, - { be_const_key_weak(_CLASSES_TYPES, 2), be_nested_str_weak(_X7Crelay_X7Clight0_X7Clight1_X7Clight2_X7Clight3_X7Cshutter_X7Cshutter_X2Btilt_X7Ctemperature_X7Cpressure_X7Cilluminance_X7Chumidity) }, + { be_const_key_weak(_CLASSES_TYPES, 2), be_nested_str_weak(_X7Crelay_X7Clight0_X7Clight1_X7Clight2_X7Clight3_X7Cshutter_X7Cshutter_X2Btilt_X7Ctemperature_X7Cpressure_X7Cilluminance_X7Chumidity_X7C_X2Dhttp_X7Chttp_relay) }, { be_const_key_weak(show_fabric_info, 7), be_const_closure(Matter_UI_show_fabric_info_closure) }, { be_const_key_weak(init, -1), be_const_closure(Matter_UI_init_closure) }, { be_const_key_weak(web_add_handler, -1), be_const_closure(Matter_UI_web_add_handler_closure) }, diff --git a/tasmota/tasmota_xdrv_driver/xdrv_52_3_berry_tasmota.ino b/tasmota/tasmota_xdrv_driver/xdrv_52_3_berry_tasmota.ino index 842d8804a..56588d339 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_52_3_berry_tasmota.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_52_3_berry_tasmota.ino @@ -198,7 +198,7 @@ extern "C" { be_map_insert_int(vm, "frag", ESP_getHeapFragmentation()); // give info about stack size be_map_insert_int(vm, "stack_size", SET_ESP32_STACK_SIZE / 1024); - be_map_insert_int(vm, "stack_low", uxTaskGetStackHighWaterMark(nullptr) / 1024); + be_map_insert_real(vm, "stack_low", ((float)uxTaskGetStackHighWaterMark(nullptr)) / 1024); if (UsePSRAM()) { be_map_insert_int(vm, "psram", ESP.getPsramSize() / 1024); be_map_insert_int(vm, "psram_free", ESP.getFreePsram() / 1024); From 13de7a486348e5cabc764b03682fa6f5f4f9bdb5 Mon Sep 17 00:00:00 2001 From: s-hadinger <49731213+s-hadinger@users.noreply.github.com> Date: Thu, 4 May 2023 21:27:55 +0200 Subject: [PATCH 062/289] Berry make add_driver() idempotent (#18580) --- .../src/embedded/tasmota_class.be | 6 ++-- .../src/solidify/solidified_tasmota_class.h | 28 ++++++++++++------- 2 files changed, 22 insertions(+), 12 deletions(-) diff --git a/lib/libesp32/berry_tasmota/src/embedded/tasmota_class.be b/lib/libesp32/berry_tasmota/src/embedded/tasmota_class.be index 1295436bd..02bf7a814 100644 --- a/lib/libesp32/berry_tasmota/src/embedded/tasmota_class.be +++ b/lib/libesp32/berry_tasmota/src/embedded/tasmota_class.be @@ -621,8 +621,10 @@ class Tasmota raise "value_error", "instance required" end if self._drivers - self._drivers.push(d) - else + if self._drivers.find(d) == nil # add only if not already added + self._drivers.push(d) + end + else self._drivers = [d] end end diff --git a/lib/libesp32/berry_tasmota/src/solidify/solidified_tasmota_class.h b/lib/libesp32/berry_tasmota/src/solidify/solidified_tasmota_class.h index 25461a620..8762cef14 100644 --- a/lib/libesp32/berry_tasmota/src/solidify/solidified_tasmota_class.h +++ b/lib/libesp32/berry_tasmota/src/solidify/solidified_tasmota_class.h @@ -1082,16 +1082,17 @@ be_local_closure(Tasmota_add_driver, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[ 5]) { /* constants */ + ( &(const bvalue[ 6]) { /* constants */ /* K0 */ be_nested_str(instance), /* K1 */ be_nested_str(value_error), /* K2 */ be_nested_str(instance_X20required), /* K3 */ be_nested_str(_drivers), - /* K4 */ be_nested_str(push), + /* K4 */ be_nested_str(find), + /* K5 */ be_nested_str(push), }), &be_const_str_add_driver, &be_const_str_solidified, - ( &(const binstruction[18]) { /* code */ + ( &(const binstruction[25]) { /* code */ 0x60080004, // 0000 GETGBL R2 G4 0x5C0C0200, // 0001 MOVE R3 R1 0x7C080200, // 0002 CALL R2 1 @@ -1099,17 +1100,24 @@ be_local_closure(Tasmota_add_driver, /* name */ 0x780A0000, // 0004 JMPF R2 #0006 0xB0060302, // 0005 RAISE 1 K1 K2 0x88080103, // 0006 GETMBR R2 R0 K3 - 0x780A0004, // 0007 JMPF R2 #000D + 0x780A000B, // 0007 JMPF R2 #0014 0x88080103, // 0008 GETMBR R2 R0 K3 0x8C080504, // 0009 GETMET R2 R2 K4 0x5C100200, // 000A MOVE R4 R1 0x7C080400, // 000B CALL R2 2 - 0x70020003, // 000C JMP #0011 - 0x60080012, // 000D GETGBL R2 G18 - 0x7C080000, // 000E CALL R2 0 - 0x400C0401, // 000F CONNECT R3 R2 R1 - 0x90020602, // 0010 SETMBR R0 K3 R2 - 0x80000000, // 0011 RET 0 + 0x4C0C0000, // 000C LDNIL R3 + 0x1C080403, // 000D EQ R2 R2 R3 + 0x780A0003, // 000E JMPF R2 #0013 + 0x88080103, // 000F GETMBR R2 R0 K3 + 0x8C080505, // 0010 GETMET R2 R2 K5 + 0x5C100200, // 0011 MOVE R4 R1 + 0x7C080400, // 0012 CALL R2 2 + 0x70020003, // 0013 JMP #0018 + 0x60080012, // 0014 GETGBL R2 G18 + 0x7C080000, // 0015 CALL R2 0 + 0x400C0401, // 0016 CONNECT R3 R2 R1 + 0x90020602, // 0017 SETMBR R0 K3 R2 + 0x80000000, // 0018 RET 0 }) ) ); From 687b26ad1351cbd10285e783e2addf663194e203 Mon Sep 17 00:00:00 2001 From: gemu Date: Fri, 5 May 2023 09:17:17 +0200 Subject: [PATCH 063/289] Scripter update (#18578) * add ds2480b library * add onewire support * reset on error * call to get esp32 HWS * DS2480 serial invert option --- .../TasmotaSerial-3.6.0/src/TasmotaSerial.h | 1 + lib/lib_div/DS2480B/DS2480B.cpp | 569 ++++++++++++++++++ lib/lib_div/DS2480B/DS2480B.h | 200 ++++++ lib/lib_div/DS2480B/README.md | 6 + .../DS18x20_Temperature.ino | 123 ++++ lib/lib_div/DS2480B/keywords.txt | 64 ++ lib/lib_div/DS2480B/library.properties | 9 + tasmota/include/Powerwall.h | 5 + .../tasmota_xdrv_driver/xdrv_10_scripter.ino | 550 +++++++++++++++-- 9 files changed, 1486 insertions(+), 41 deletions(-) create mode 100644 lib/lib_div/DS2480B/DS2480B.cpp create mode 100644 lib/lib_div/DS2480B/DS2480B.h create mode 100644 lib/lib_div/DS2480B/README.md create mode 100644 lib/lib_div/DS2480B/examples/DS18x20_Temperature/DS18x20_Temperature.ino create mode 100644 lib/lib_div/DS2480B/keywords.txt create mode 100644 lib/lib_div/DS2480B/library.properties diff --git a/lib/default/TasmotaSerial-3.6.0/src/TasmotaSerial.h b/lib/default/TasmotaSerial-3.6.0/src/TasmotaSerial.h index c41282004..2f9be0963 100644 --- a/lib/default/TasmotaSerial-3.6.0/src/TasmotaSerial.h +++ b/lib/default/TasmotaSerial-3.6.0/src/TasmotaSerial.h @@ -64,6 +64,7 @@ class TasmotaSerial : public Stream { uint32_t getLoopReadMetric(void) const { return m_bit_follow_metric; } #ifdef ESP32 uint32_t getUart(void) const { return m_uart; } + HardwareSerial *getesp32hws(void) { return TSerial; } #endif bool isValid(void) { return m_valid; } bool overflow(void); diff --git a/lib/lib_div/DS2480B/DS2480B.cpp b/lib/lib_div/DS2480B/DS2480B.cpp new file mode 100644 index 000000000..ff091ed2c --- /dev/null +++ b/lib/lib_div/DS2480B/DS2480B.cpp @@ -0,0 +1,569 @@ +/* +Copyright (c) 2007, Jim Studt (original old version - many contributors since) + +This library based on OneWire library currently maintained by Paul Stoffregen. However, +it has been modified to use the DS2480B serial to 1-wire chip instead of direct +bitbanging on a digital pin. Also, it is unfortunately hard coded to use the AltSoftSerial library +since this library has no common ancestor with the hardware serial class and there isn't a good way +to allow use of either + +OneWire has been maintained by Paul Stoffregen (paul@pjrc.com) since +January 2010. At the time, it was in need of many bug fixes, but had +been abandoned the original author (Jim Studt). None of the known +contributors were interested in maintaining OneWire. Paul typically +works on OneWire every 6 to 12 months. Patches usually wait that +long. If anyone is interested in more actively maintaining OneWire, +please contact Paul. + +Version 2.2: + Teensy 3.0 compatibility, Paul Stoffregen, paul@pjrc.com + Arduino Due compatibility, http://arduino.cc/forum/index.php?topic=141030 + Fix DS18B20 example negative temperature + Fix DS18B20 example's low res modes, Ken Butcher + Improve reset timing, Mark Tillotson + Add const qualifiers, Bertrik Sikken + Add initial value input to crc16, Bertrik Sikken + Add target_search() function, Scott Roberts + +Version 2.1: + Arduino 1.0 compatibility, Paul Stoffregen + Improve temperature example, Paul Stoffregen + DS250x_PROM example, Guillermo Lovato + PIC32 (chipKit) compatibility, Jason Dangel, dangel.jason AT gmail.com + Improvements from Glenn Trewitt: + - crc16() now works + - check_crc16() does all of calculation/checking work. + - Added read_bytes() and write_bytes(), to reduce tedious loops. + - Added ds2408 example. + Delete very old, out-of-date readme file (info is here) + +Version 2.0: Modifications by Paul Stoffregen, January 2010: +http://www.pjrc.com/teensy/td_libs_OneWire.html + Search fix from Robin James + http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1238032295/27#27 + Use direct optimized I/O in all cases + Disable interrupts during timing critical sections + (this solves many random communication errors) + Disable interrupts during read-modify-write I/O + Reduce RAM consumption by eliminating unnecessary + variables and trimming many to 8 bits + Optimize both crc8 - table version moved to flash + +Modified to work with larger numbers of devices - avoids loop. +Tested in Arduino 11 alpha with 12 sensors. +26 Sept 2008 -- Robin James +http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1238032295/27#27 + +Updated to work with arduino-0008 and to include skip() as of +2007/07/06. --RJL20 + +Modified to calculate the 8-bit CRC directly, avoiding the need for +the 256-byte lookup table to be loaded in RAM. Tested in arduino-0010 +-- Tom Pollard, Jan 23, 2008 + +Jim Studt's original library was modified by Josh Larios. + +Tom Pollard, pollard@alum.mit.edu, contributed around May 20, 2008 + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Much of the code was inspired by Derek Yerger's code, though I don't +think much of that remains. In any event that was.. + (copyleft) 2006 by Derek Yerger - Free to distribute freely. + +The CRC code was excerpted and inspired by the Dallas Semiconductor +sample code bearing this copyright. +//--------------------------------------------------------------------------- +// Copyright (C) 2000 Dallas Semiconductor Corporation, All Rights Reserved. +// +// Permission is hereby granted, free of charge, to any person obtaining a +// copy of this software and associated documentation files (the "Software"), +// to deal in the Software without restriction, including without limitation +// the rights to use, copy, modify, merge, publish, distribute, sublicense, +// and/or sell copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included +// in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +// IN NO EVENT SHALL DALLAS SEMICONDUCTOR BE LIABLE FOR ANY CLAIM, DAMAGES +// OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +// ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +// +// Except as contained in this notice, the name of Dallas Semiconductor +// shall not be used except as stated in the Dallas Semiconductor +// Branding Policy. +//-------------------------------------------------------------------------- +*/ + +#include "DS2480B.h" + + +DS2480B::DS2480B(TasmotaSerial *port) +{ + _port = port; +#if ONEWIRE_SEARCH + reset_search(); +#endif +} + +void DS2480B::begin() +{ + _port->write(0xC1); + if (!waitForReply()) return; + _port->read(); + isCmdMode = true; +} + + +// Perform the onewire reset function. We will wait up to 250uS for +// the bus to come high, if it doesn't then it is broken or shorted +// and we return a 0; +// +// Returns 1 if a device asserted a presence pulse, 0 otherwise. +// +uint8_t DS2480B::reset(void) +{ + uint8_t r; + + commandMode(); + + _port->write(0xC1); + //proper return is 0xCD otherwise something was wrong + //while (!_port->available()); + if (!waitForReply()) return true; + + r = _port->read(); + if (r == 0xCD) return 1; + return 0; +} + +void DS2480B::dataMode() +{ + if (isCmdMode) + { + _port->write(DATA_MODE); + isCmdMode = false; + } +} + +void DS2480B::commandMode() +{ + if (!isCmdMode) + { + _port->write(COMMAND_MODE); + isCmdMode = true; + } +} + + +void DS2480B::beginTransaction() +{ + dataMode(); +} + +void DS2480B::endTransaction() +{ + commandMode(); +} + +#define DS2480_DELAY 50 + +bool DS2480B::waitForReply() { + for (uint16_t i = 0; i < DS2480_DELAY; i++) { + if (_port->available()) return true; + delay(1); + } + return false; +} + + +// +// Write a bit - actually returns the bit read back in case you care. +// +uint8_t DS2480B::write_bit(uint8_t v) +{ + uint8_t val; + commandMode(); + if (v == 1) _port->write(0x91); //write a single "on" bit to onewire + else _port->write(0x81); //write a single "off" bit to onewire + if (!waitForReply()) return 0; + val = _port->read(); + return val & 1; +} + +// +// Read a bit - short hand for writing a 1 and seeing what we get back. +// +uint8_t DS2480B::read_bit(void) +{ + uint8_t r = write_bit(1); + return r; +} + +// +// Write a byte. The writing code uses the active drivers to raise the +// pin high, if you need power after the write (e.g. DS18S20 in +// parasite power mode) then set 'power' to 1, otherwise the pin will +// go tri-state at the end of the write to avoid heating in a short or +// other mishap. - Currently power isn't actually used now. +// +void DS2480B::write(uint8_t v, uint8_t power /* = 0 */) { + uint8_t r; + + dataMode(); + + _port->write(v); + //need to double up transmission if the sent byte was one of the command bytes + if (v == DATA_MODE || v == COMMAND_MODE || v == PULSE_TERM) _port->write(v); + if (!waitForReply()) return; + r = _port->read(); //throw away reply +} + +void DS2480B::writeCmd(uint8_t v, uint8_t power) +{ + uint8_t r; + + commandMode(); + + _port->write(v); + + if (!waitForReply()) return; + r = _port->read(); //throw away reply +} + +void DS2480B::write_bytes(const uint8_t *buf, uint16_t count, bool power /* = 0 */) { + for (uint16_t i = 0 ; i < count ; i++) write(buf[i]); +} + +// +// Read a byte +// +uint8_t DS2480B::read() { + uint8_t r; + + dataMode(); + + _port->write(0xFF); + if (!waitForReply()) return 0; + r = _port->read(); + return r; +} + +void DS2480B::read_bytes(uint8_t *buf, uint16_t count) { + for (uint16_t i = 0 ; i < count ; i++) + buf[i] = read(); +} + +// +// Do a ROM select +// +void DS2480B::select(const uint8_t rom[8]) +{ + uint8_t i; + + dataMode(); + write(0x55); // Choose ROM + + for (i = 0; i < 8; i++) write(rom[i]); +} + +// +// Do a ROM skip +// +void DS2480B::skip() +{ + dataMode(); + write(0xCC); // Skip ROM +} + +void DS2480B::depower() +{ + +} + +#if ONEWIRE_SEARCH + +// +// You need to use this function to start a search again from the beginning. +// You do not need to do it for the first search, though you could. +// +void DS2480B::reset_search() +{ + // reset the search state + LastDiscrepancy = 0; + LastDeviceFlag = FALSE; + LastFamilyDiscrepancy = 0; + for(int i = 7; ; i--) { + ROM_NO[i] = 0; + if ( i == 0) break; + } +} + +// Setup the search to find the device type 'family_code' on the next call +// to search(*newAddr) if it is present. +// +void DS2480B::target_search(uint8_t family_code) +{ + // set the search state to find SearchFamily type devices + ROM_NO[0] = family_code; + for (uint8_t i = 1; i < 8; i++) + ROM_NO[i] = 0; + LastDiscrepancy = 64; + LastFamilyDiscrepancy = 0; + LastDeviceFlag = FALSE; +} + +// +// Perform a search. If this function returns a '1' then it has +// enumerated the next device and you may retrieve the ROM from the +// DS2480B::address variable. If there are no devices, no further +// devices, or something horrible happens in the middle of the +// enumeration then a 0 is returned. If a new device is found then +// its address is copied to newAddr. Use DS2480B::reset_search() to +// start over. +// +// --- Replaced by the one from the Dallas Semiconductor web site --- +//-------------------------------------------------------------------------- +// Perform the 1-Wire Search Algorithm on the 1-Wire bus using the existing +// search state. +// Return TRUE : device found, ROM number in ROM_NO buffer +// FALSE : device not found, end of search +// +uint8_t DS2480B::search(uint8_t *newAddr) +{ + uint8_t id_bit_number; + uint8_t last_zero, rom_byte_number, search_result; + uint8_t id_bit, cmp_id_bit; + + unsigned char rom_byte_mask, search_direction; + + // initialize for search + id_bit_number = 1; + last_zero = 0; + rom_byte_number = 0; + rom_byte_mask = 1; + search_result = 0; + + // if the last call was not the last one + if (!LastDeviceFlag) + { + // 1-Wire reset + if (!reset()) + { + // reset the search + LastDiscrepancy = 0; + LastDeviceFlag = FALSE; + LastFamilyDiscrepancy = 0; + return FALSE; + } + + // issue the search command + write(0xF0); //send search command to DS18B20 units + + // loop to do the search + do + { + // read a bit and its complement + id_bit = read_bit(); + cmp_id_bit = read_bit(); + + // check for no devices on 1-wire + if ((id_bit == 1) && (cmp_id_bit == 1)) + break; + else + { + // all devices coupled have 0 or 1 + if (id_bit != cmp_id_bit) + search_direction = id_bit; // bit write value for search + else + { + // if this discrepancy if before the Last Discrepancy + // on a previous next then pick the same as last time + if (id_bit_number < LastDiscrepancy) + search_direction = ((ROM_NO[rom_byte_number] & rom_byte_mask) > 0); + else + // if equal to last pick 1, if not then pick 0 + search_direction = (id_bit_number == LastDiscrepancy); + + // if 0 was picked then record its position in LastZero + if (search_direction == 0) + { + last_zero = id_bit_number; + + // check for Last discrepancy in family + if (last_zero < 9) + LastFamilyDiscrepancy = last_zero; + } + } + + // set or clear the bit in the ROM byte rom_byte_number + // with mask rom_byte_mask + if (search_direction == 1) + ROM_NO[rom_byte_number] |= rom_byte_mask; + else + ROM_NO[rom_byte_number] &= ~rom_byte_mask; + + // serial number search direction write bit + write_bit(search_direction); + + // increment the byte counter id_bit_number + // and shift the mask rom_byte_mask + id_bit_number++; + rom_byte_mask <<= 1; + + // if the mask is 0 then go to new SerialNum byte rom_byte_number and reset mask + if (rom_byte_mask == 0) + { + rom_byte_number++; + rom_byte_mask = 1; + } + } + } + while(rom_byte_number < 8); // loop until through all ROM bytes 0-7 + + // if the search was successful then + if (!(id_bit_number < 65)) + { + // search successful so set LastDiscrepancy,LastDeviceFlag,search_result + LastDiscrepancy = last_zero; + + // check for last device + if (LastDiscrepancy == 0) + LastDeviceFlag = TRUE; + + search_result = TRUE; + } + } + + // if no device found then reset counters so next 'search' will be like a first + if (!search_result || !ROM_NO[0]) + { + LastDiscrepancy = 0; + LastDeviceFlag = FALSE; + LastFamilyDiscrepancy = 0; + search_result = FALSE; + } + for (int i = 0; i < 8; i++) newAddr[i] = ROM_NO[i]; + return search_result; + } + +#endif + +#if ONEWIRE_CRC +// The 1-Wire CRC scheme is described in Maxim Application Note 27: +// "Understanding and Using Cyclic Redundancy Checks with Maxim iButton Products" +// + +#if ONEWIRE_CRC8_TABLE +// This table comes from Dallas sample code where it is freely reusable, +// though Copyright (C) 2000 Dallas Semiconductor Corporation +static const uint8_t PROGMEM dscrc_table[] = { + 0, 94,188,226, 97, 63,221,131,194,156,126, 32,163,253, 31, 65, + 157,195, 33,127,252,162, 64, 30, 95, 1,227,189, 62, 96,130,220, + 35,125,159,193, 66, 28,254,160,225,191, 93, 3,128,222, 60, 98, + 190,224, 2, 92,223,129, 99, 61,124, 34,192,158, 29, 67,161,255, + 70, 24,250,164, 39,121,155,197,132,218, 56,102,229,187, 89, 7, + 219,133,103, 57,186,228, 6, 88, 25, 71,165,251,120, 38,196,154, + 101, 59,217,135, 4, 90,184,230,167,249, 27, 69,198,152,122, 36, + 248,166, 68, 26,153,199, 37,123, 58,100,134,216, 91, 5,231,185, + 140,210, 48,110,237,179, 81, 15, 78, 16,242,172, 47,113,147,205, + 17, 79,173,243,112, 46,204,146,211,141,111, 49,178,236, 14, 80, + 175,241, 19, 77,206,144,114, 44,109, 51,209,143, 12, 82,176,238, + 50,108,142,208, 83, 13,239,177,240,174, 76, 18,145,207, 45,115, + 202,148,118, 40,171,245, 23, 73, 8, 86,180,234,105, 55,213,139, + 87, 9,235,181, 54,104,138,212,149,203, 41,119,244,170, 72, 22, + 233,183, 85, 11,136,214, 52,106, 43,117,151,201, 74, 20,246,168, + 116, 42,200,150, 21, 75,169,247,182,232, 10, 84,215,137,107, 53}; + +// +// Compute a Dallas Semiconductor 8 bit CRC. These show up in the ROM +// and the registers. (note: this might better be done without to +// table, it would probably be smaller and certainly fast enough +// compared to all those delayMicrosecond() calls. But I got +// confused, so I use this table from the examples.) +// +uint8_t DS2480B::crc8(const uint8_t *addr, uint8_t len) +{ + uint8_t crc = 0; + + while (len--) { + crc = pgm_read_byte(dscrc_table + (crc ^ *addr++)); + } + return crc; +} +#else +// +// Compute a Dallas Semiconductor 8 bit CRC directly. +// this is much slower, but much smaller, than the lookup table. +// +uint8_t DS2480B::crc8(const uint8_t *addr, uint8_t len) +{ + uint8_t crc = 0; + + while (len--) { + uint8_t inbyte = *addr++; + for (uint8_t i = 8; i; i--) { + uint8_t mix = (crc ^ inbyte) & 0x01; + crc >>= 1; + if (mix) crc ^= 0x8C; + inbyte >>= 1; + } + } + return crc; +} +#endif + +#if ONEWIRE_CRC16 +bool DS2480B::check_crc16(const uint8_t* input, uint16_t len, const uint8_t* inverted_crc, uint16_t crc) +{ + crc = ~crc16(input, len, crc); + return (crc & 0xFF) == inverted_crc[0] && (crc >> 8) == inverted_crc[1]; +} + +uint16_t DS2480B::crc16(const uint8_t* input, uint16_t len, uint16_t crc) +{ + static const uint8_t oddparity[16] = + { 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0 }; + + for (uint16_t i = 0 ; i < len ; i++) { + // Even though we're just copying a byte from the input, + // we'll be doing 16-bit computation with it. + uint16_t cdata = input[i]; + cdata = (cdata ^ crc) & 0xff; + crc >>= 8; + + if (oddparity[cdata & 0x0F] ^ oddparity[cdata >> 4]) + crc ^= 0xC001; + + cdata <<= 6; + crc ^= cdata; + cdata <<= 1; + crc ^= cdata; + } + return crc; +} +#endif + +#endif diff --git a/lib/lib_div/DS2480B/DS2480B.h b/lib/lib_div/DS2480B/DS2480B.h new file mode 100644 index 000000000..1f0520607 --- /dev/null +++ b/lib/lib_div/DS2480B/DS2480B.h @@ -0,0 +1,200 @@ +#ifndef DS2480B_h +#define DS2480B_h + +#include + +#if ARDUINO >= 100 +#include "Arduino.h" // for delayMicroseconds, digitalPinToBitMask, etc +#else +#include "WProgram.h" // for delayMicroseconds +#include "pins_arduino.h" // for digitalPinToBitMask, etc +#endif + +#include + +// You can exclude certain features from OneWire. In theory, this +// might save some space. In practice, the compiler automatically +// removes unused code (technically, the linker, using -fdata-sections +// and -ffunction-sections when compiling, and Wl,--gc-sections +// when linking), so most of these will not result in any code size +// reduction. Well, unless you try to use the missing features +// and redesign your program to not need them! ONEWIRE_CRC8_TABLE +// is the exception, because it selects a fast but large algorithm +// or a small but slow algorithm. + +// you can exclude onewire_search by defining that to 0 +#ifndef ONEWIRE_SEARCH +#define ONEWIRE_SEARCH 1 +#endif + +// You can exclude CRC checks altogether by defining this to 0 +#ifndef ONEWIRE_CRC +#define ONEWIRE_CRC 1 +#endif + +// Select the table-lookup method of computing the 8-bit CRC +// by setting this to 1. The lookup table enlarges code size by +// about 250 bytes. It does NOT consume RAM (but did in very +// old versions of OneWire). If you disable this, a slower +// but very compact algorithm is used. +#ifndef ONEWIRE_CRC8_TABLE +#define ONEWIRE_CRC8_TABLE 1 +#endif + +// You can allow 16-bit CRC checks by defining this to 1 +// (Note that ONEWIRE_CRC must also be 1.) +#ifndef ONEWIRE_CRC16 +#define ONEWIRE_CRC16 1 +#endif + +#define FALSE 0 +#define TRUE 1 + +// Platform specific I/O definitions + +#if defined(__AVR__) +#elif defined(__MK20DX128__) +#elif defined(__SAM3X8E__) +#ifndef PROGMEM +#define PROGMEM +#endif +#ifndef pgm_read_byte +#define pgm_read_byte(addr) (*(const uint8_t *)(addr)) +#endif +#elif defined(__PIC32MX__) +#else +#endif + +#define DATA_MODE 0xE1 +#define COMMAND_MODE 0xE3 +#define PULSE_TERM 0xF1 + +class DS2480B +{ + private: + TasmotaSerial *_port; + bool isCmdMode; + +#if ONEWIRE_SEARCH + // global search state + unsigned char ROM_NO[8]; + uint8_t LastDiscrepancy; + uint8_t LastFamilyDiscrepancy; + uint8_t LastDeviceFlag; +#endif + + bool waitForReply(); + + public: + DS2480B(TasmotaSerial *port); + + void begin(); + + // Perform a 1-Wire reset cycle. Returns 1 if a device responds + // with a presence pulse. Returns 0 if there is no device or the + // bus is shorted or otherwise held low for more than 250uS + uint8_t reset(void); + + void beginTransaction(); + void endTransaction(); + + void commandMode(); + void dataMode(); + + // Issue a 1-Wire rom select command, you do the reset first. + void select(const uint8_t rom[8]); + + // Issue a 1-Wire rom skip command, to address all on bus. + void skip(void); + + // Write a byte. If 'power' is one then the wire is held high at + // the end for parasitically powered devices. You are responsible + // for eventually depowering it by calling depower() or doing + // another read or write. + void write(uint8_t v, uint8_t power = 0); + + void writeCmd(uint8_t v, uint8_t power = 0); + + void write_bytes(const uint8_t *buf, uint16_t count, bool power = 0); + + // Read a byte. + uint8_t read(void); + + void read_bytes(uint8_t *buf, uint16_t count); + + // Write a bit. + uint8_t write_bit(uint8_t v); + + // Read a bit. + uint8_t read_bit(void); + + // Stop forcing power onto the bus. You only need to do this if + // you used the 'power' flag to write() or used a write_bit() call + // and aren't about to do another read or write. You would rather + // not leave this powered if you don't have to, just in case + // someone shorts your bus. + void depower(void); + +#if ONEWIRE_SEARCH + // Clear the search state so that if will start from the beginning again. + void reset_search(); + + // Setup the search to find the device type 'family_code' on the next call + // to search(*newAddr) if it is present. + void target_search(uint8_t family_code); + + // Look for the next device. Returns 1 if a new address has been + // returned. A zero might mean that the bus is shorted, there are + // no devices, or you have already retrieved all of them. It + // might be a good idea to check the CRC to make sure you didn't + // get garbage. The order is deterministic. You will always get + // the same devices in the same order. + uint8_t search(uint8_t *newAddr); +#endif + +#if ONEWIRE_CRC + // Compute a Dallas Semiconductor 8 bit CRC, these are used in the + // ROM and scratchpad registers. + static uint8_t crc8(const uint8_t *addr, uint8_t len); + +#if ONEWIRE_CRC16 + // Compute the 1-Wire CRC16 and compare it against the received CRC. + // Example usage (reading a DS2408): + // // Put everything in a buffer so we can compute the CRC easily. + // uint8_t buf[13]; + // buf[0] = 0xF0; // Read PIO Registers + // buf[1] = 0x88; // LSB address + // buf[2] = 0x00; // MSB address + // WriteBytes(net, buf, 3); // Write 3 cmd bytes + // ReadBytes(net, buf+3, 10); // Read 6 data bytes, 2 0xFF, 2 CRC16 + // if (!CheckCRC16(buf, 11, &buf[11])) { + // // Handle error. + // } + // + // @param input - Array of bytes to checksum. + // @param len - How many bytes to use. + // @param inverted_crc - The two CRC16 bytes in the received data. + // This should just point into the received data, + // *not* at a 16-bit integer. + // @param crc - The crc starting value (optional) + // @return True, iff the CRC matches. + static bool check_crc16(const uint8_t* input, uint16_t len, const uint8_t* inverted_crc, uint16_t crc = 0); + + // Compute a Dallas Semiconductor 16 bit CRC. This is required to check + // the integrity of data received from many 1-Wire devices. Note that the + // CRC computed here is *not* what you'll get from the 1-Wire network, + // for two reasons: + // 1) The CRC is transmitted bitwise inverted. + // 2) Depending on the endian-ness of your processor, the binary + // representation of the two-byte return value may have a different + // byte order than the two bytes you get from 1-Wire. + // @param input - Array of bytes to checksum. + // @param len - How many bytes to use. + // @param crc - The crc starting value (optional) + // @return The CRC16, as defined by Dallas Semiconductor. + static uint16_t crc16(const uint8_t* input, uint16_t len, uint16_t crc = 0); +#endif +#endif +}; + +#endif diff --git a/lib/lib_div/DS2480B/README.md b/lib/lib_div/DS2480B/README.md new file mode 100644 index 000000000..0684ab42f --- /dev/null +++ b/lib/lib_div/DS2480B/README.md @@ -0,0 +1,6 @@ +DS2480B Library for Arduino +======================= + +Interfaces with DS2480B chip in order +to acquire access to the 1-wire bus over +serial \ No newline at end of file diff --git a/lib/lib_div/DS2480B/examples/DS18x20_Temperature/DS18x20_Temperature.ino b/lib/lib_div/DS2480B/examples/DS18x20_Temperature/DS18x20_Temperature.ino new file mode 100644 index 000000000..71014ee1e --- /dev/null +++ b/lib/lib_div/DS2480B/examples/DS18x20_Temperature/DS18x20_Temperature.ino @@ -0,0 +1,123 @@ +#include + +// OneWire DS18S20, DS18B20, DS1822 Temperature Example +// +// http://www.pjrc.com/teensy/td_libs_OneWire.html +// +// The DallasTemperature library can do all this work for you! +// http://milesburton.com/Dallas_Temperature_Control_Library + + +#include + +AltSoftSerial altSerial; //RX 8 - TX 9 + +DS2480B ds(altSerial); + +void setup(void) { + Serial.begin(9600); + altSerial.begin(9600); + ds.begin(); +} + +void loop(void) { + byte i; + byte present = 0; + byte type_s; + byte data[12]; + byte addr[8]; + float celsius, fahrenheit; + + if ( !ds.search(addr)) { + Serial.println("No more addresses."); + Serial.println(); + ds.reset_search(); + delay(5000); + return; + } + + Serial.print("ROM ="); + for( i = 0; i < 8; i++) { + Serial.write(' '); + Serial.print(addr[i], HEX); + } + + if (DS2480B::crc8(addr, 7) != addr[7]) { + Serial.println("CRC is not valid!"); + return; + } + Serial.println(); + + // the first ROM byte indicates which chip + switch (addr[0]) { + case 0x10: + Serial.println(" Chip = DS18S20"); // or old DS1820 + type_s = 1; + break; + case 0x28: + Serial.println(" Chip = DS18B20"); + type_s = 0; + break; + case 0x22: + Serial.println(" Chip = DS1822"); + type_s = 0; + break; + default: + Serial.println("Device is not a DS18x20 family device."); + return; + } + + ds.reset(); + + delay(100); + + ds.reset(); + ds.select(addr); + ds.write(0x44); // start conversion + + delay(1000); // maybe 750ms is enough, maybe not + // we might do a ds.depower() here, but the reset will take care of it. + + present = ds.reset(); + ds.select(addr); + ds.write(0xBE); // Read Scratchpad + + Serial.print(" Data = "); + Serial.print(present, HEX); + Serial.print(" "); + for ( i = 0; i < 9; i++) { // we need 9 bytes + data[i] = ds.read(); + Serial.print(data[i], HEX); + Serial.print(" "); + } + Serial.print(" CRC="); + Serial.print(DS2480B::crc8(data, 8), HEX); + Serial.println(); + + // Convert the data to actual temperature + // because the result is a 16 bit signed integer, it should + // be stored to an "int16_t" type, which is always 16 bits + // even when compiled on a 32 bit processor. + int16_t raw = (data[1] << 8) | data[0]; + if (type_s) { + raw = raw << 3; // 9 bit resolution default + if (data[7] == 0x10) { + // "count remain" gives full 12 bit resolution + raw = (raw & 0xFFF0) + 12 - data[6]; + } + } else { + byte cfg = (data[4] & 0x60); + // at lower res, the low bits are undefined, so let's zero them + if (cfg == 0x00) raw = raw & ~7; // 9 bit resolution, 93.75 ms + else if (cfg == 0x20) raw = raw & ~3; // 10 bit res, 187.5 ms + else if (cfg == 0x40) raw = raw & ~1; // 11 bit res, 375 ms + //// default is 12 bit resolution, 750 ms conversion time + } + celsius = (float)raw / 16.0; + fahrenheit = celsius * 1.8 + 32.0; + Serial.print(" Temperature = "); + Serial.print(celsius); + Serial.print(" Celsius, "); + Serial.print(fahrenheit); + Serial.println(" Fahrenheit"); +} diff --git a/lib/lib_div/DS2480B/keywords.txt b/lib/lib_div/DS2480B/keywords.txt new file mode 100644 index 000000000..67c3b7938 --- /dev/null +++ b/lib/lib_div/DS2480B/keywords.txt @@ -0,0 +1,64 @@ +####################################### +# Syntax Coloring Map For DS2480B +####################################### + +####################################### +# Datatypes (KEYWORD1) +####################################### + +RTC_clock KEYWORD1 + +####################################### +# Methods and Functions (KEYWORD2) +####################################### + +init KEYWORD2 +set_time KEYWORD2 +set_date KEYWORD2 +set_seconds KEYWORD2 +set_minutes KEYWORD2 +set_hours KEYWORD2 +set_days KEYWORD2 +set_months KEYWORD2 +set_years KEYWORD2 +set_alarmtime KEYWORD2 +set_alarmdate KEYWORD2 +get_seconds KEYWORD2 +get_minutes KEYWORD2 +get_hours KEYWORD2 +get_days KEYWORD2 +get_day_of_week KEYWORD2 +get_months KEYWORD2 +get_years KEYWORD2 +attachalarm KEYWORD2 +disable_alarm KEYWORD2 +unixtime KEYWORD2 +get_time KEYWORD2 +get_date KEYWORD2 +summertime KEYWORD2 +switch_years KEYWORD2 +timing KEYWORD2 +date_already_set KEYWORD2 + +####################################### +# Instances (KEYWORD2) +####################################### + + +####################################### +# Mean Instances (KEYWORD3) +####################################### + +rtc_clock KEYWORD3 + +####################################### +# Constants (LITERAL1) +####################################### + +RC LITERAL1 +XTAL LITERAL1 + +__TIME__ LITERAL1 +__DATE__ LITERAL1 + +Germany LITERAL1 \ No newline at end of file diff --git a/lib/lib_div/DS2480B/library.properties b/lib/lib_div/DS2480B/library.properties new file mode 100644 index 000000000..8773c7971 --- /dev/null +++ b/lib/lib_div/DS2480B/library.properties @@ -0,0 +1,9 @@ +name=DS2480 Library +version=0.1.0 +author=Jim Studt +maintainer=Jim Studt +sentence=DS2480 +paragraph=DS2480 +category=Communication +architectures=* +includes=DS2408.h diff --git a/tasmota/include/Powerwall.h b/tasmota/include/Powerwall.h index 324bfa262..435ab27cd 100755 --- a/tasmota/include/Powerwall.h +++ b/tasmota/include/Powerwall.h @@ -24,6 +24,7 @@ class Powerwall { String GetRequest(String url, String authCookie); String GetRequest(String url); String AuthCookie(); + void resetAuthCookie(); }; @@ -37,6 +38,9 @@ Powerwall::Powerwall() { String Powerwall::AuthCookie() { return authCookie; } +void Powerwall::resetAuthCookie() { + authCookie = ""; +} /** * This function returns a string with the authToken based on the basic login endpoint of @@ -165,6 +169,7 @@ String Powerwall::GetRequest(String url, String authCookie) { // in case of error 401, get new cookie if (result == 401) { authCookie = ""; + resetAuthCookie(); } } } diff --git a/tasmota/tasmota_xdrv_driver/xdrv_10_scripter.ino b/tasmota/tasmota_xdrv_driver/xdrv_10_scripter.ino index 076989292..4b209123e 100755 --- a/tasmota/tasmota_xdrv_driver/xdrv_10_scripter.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_10_scripter.ino @@ -46,11 +46,10 @@ keywords if then else endif, or, and are better readable for beginners (others m #ifndef TS_FLOAT #define TS_FLOAT float #endif - - // float = 4, double = 8 bytes -const uint8_t SCRIPT_VERS[2] = {5, 1}; + +const uint8_t SCRIPT_VERS[2] = {5, 2}; #define SCRIPT_DEBUG 0 @@ -190,6 +189,8 @@ void Script_ticker4_end(void) { } #endif + + // EEPROM MACROS // i2c eeprom #define EEP_WRITE(A,B,C) eeprom_writeBytes(A, B, (uint8_t*)C); @@ -439,6 +440,22 @@ struct SCRIPT_SPI { #define FLT_MAX 99999999 #endif +#ifdef USE_SCRIPT_ONEWIRE +#include +#include + +#ifndef MAX_DS_SENSORS +#define MAX_DS_SENSORS 20 +#endif + +typedef struct { + OneWire *ds; + DS2480B *dsh; + TasmotaSerial *ts; + uint8_t ds_address[MAX_DS_SENSORS][8]; +} ScriptOneWire; +#endif // USE_SCRIPT_ONEWIRE + #define SFS_MAX 4 // global memory struct SCRIPT_MEM { @@ -499,6 +516,7 @@ struct SCRIPT_MEM { char *web_pages[10]; uint32_t script_lastmillis; bool event_handeled = false; + bool res_ivar = false; #ifdef USE_BUTTON_EVENT int8_t script_button[MAX_KEYS]; #endif //USE_BUTTON_EVENT @@ -523,6 +541,15 @@ struct SCRIPT_MEM { char *hstr; #endif +#ifdef USE_SCRIPT_I2C + uint8_t script_i2c_addr; + TwoWire *script_i2c_wire; +#endif + +#ifdef USE_SCRIPT_ONEWIRE + ScriptOneWire ow; +#endif + } glob_script_mem; @@ -533,10 +560,10 @@ void flt2char(TS_FLOAT num, char *nbuff) { dtostrfd(num, glob_script_mem.script_dprec, nbuff); } -void f2char(TS_FLOAT num, uint32_t dprec, uint32_t lzeros, char *nbuff, char dsep); +void f2char(double num, uint32_t dprec, uint32_t lzeros, char *nbuff, char dsep); // convert float to char with leading zeros -void f2char(TS_FLOAT num, uint32_t dprec, uint32_t lzeros, char *nbuff, char dsep) { +void f2char(double num, uint32_t dprec, uint32_t lzeros, char *nbuff, char dsep) { dtostrfd(num, dprec, nbuff); if (lzeros > 1) { // check leading zeros @@ -583,6 +610,8 @@ int32_t opt_fext(File *fp, char *ts_from, char *ts_to, uint32_t flg); int32_t extract_from_file(File *fp, char *ts_from, char *ts_to, int8_t coffs, TS_FLOAT **a_ptr, uint16_t *a_len, uint8_t numa, int16_t accum); #endif char *eval_sub(char *lp, TS_FLOAT *fvar, char *rstr); +uint32_t script_ow(uint8_t sel, uint32_t val); +int32_t script_logfile_write(char *path, char *payload, uint32_t size); void ScriptEverySecond(void) { @@ -2296,6 +2325,33 @@ uint32_t match_vars(char *dvnam, TS_FLOAT **fp, char **sp, uint32_t *ind) { #define SCRIPT_IS_STRING_MAXSIZE 256 #endif + +void script_sort_string_array(uint8_t num) { + uint16_t sasize = glob_script_mem.si_num[num]; + char *sa = glob_script_mem.last_index_string[num]; + if (!sa) { + return; + } + char temp[SCRIPT_MAXSSIZE]; + bool swapped; + do { + swapped = false; + for (uint16_t i = 0; i < sasize - 1; ++i) { + char *s1 = sa + (i * glob_script_mem.max_ssize); + char *s2 = sa + ((i + 1) * glob_script_mem.max_ssize); + if (strcmp(s1, s2) > 0) { + // swap + strcpy(temp, s1); + strcpy(s1, s2); + strcpy(s2, temp); + swapped = true; + } + } + sasize -= 1; + } while (swapped); +} + + char *isargs(char *lp, uint32_t isind) { TS_FLOAT fvar; lp = GetNumericArgument(lp, OPER_EQU, &fvar, 0); @@ -2331,11 +2387,11 @@ char *isargs(char *lp, uint32_t isind) { glob_script_mem.si_num[isind] = MAX_SARRAY_NUM; } - glob_script_mem.last_index_string[isind] = (char*)calloc(glob_script_mem.max_ssize*glob_script_mem.si_num[isind], 1); - for (uint32_t cnt = 0; cnt glob_script_mem.si_num[isind]) { - index = glob_script_mem.si_num[isind]; + if (index >= glob_script_mem.si_num[isind]) { + index = glob_script_mem.si_num[isind] - 1; } strlcpy(str,glob_script_mem.last_index_string[isind] + (index * glob_script_mem.max_ssize), glob_script_mem.max_ssize); } @@ -2449,6 +2505,7 @@ char *isvar(char *lp, uint8_t *vtype, struct T_INDEX *tind, TS_FLOAT *fp, char * // isnumber if (fp) { if (*lp == '0' && *(lp + 1) == 'x') { + lp += 2; *fp = strtoll(lp, &lp, 16); } else { @@ -2466,6 +2523,8 @@ char *isvar(char *lp, uint8_t *vtype, struct T_INDEX *tind, TS_FLOAT *fp, char * return lp; } + + if (*lp == '"') { lp++; while (*lp != '"') { @@ -2521,6 +2580,7 @@ char *isvar(char *lp, uint8_t *vtype, struct T_INDEX *tind, TS_FLOAT *fp, char * olen = strlen(dvnam); } + glob_script_mem.arres = 0; for (count = 0; count < glob_script_mem.numvars; count++) { char *cp = glob_script_mem.glob_vnp + glob_script_mem.vnp_offset[count]; @@ -2558,6 +2618,7 @@ char *isvar(char *lp, uint8_t *vtype, struct T_INDEX *tind, TS_FLOAT *fp, char * } } + #define USE_SCRIPT_JSON //#define USE_SCRIPT_FULL_JSON_PARSER @@ -2785,6 +2846,19 @@ chknext: goto nfuncexit; } + if (!strncmp_XP(lp, XPSTR("as("), 3)) { + uint16_t alen; + TS_FLOAT *fa; + lp = get_array_by_name(lp + 3, &fa, &alen, 0); + if (!fa) { + fvar = -1; + goto exit; + } + script_sort_array(fa, alen); + fvar = 0; + goto nfuncexit; + } + if (!strncmp_XP(lp, XPSTR("af("), 3)) { // array to float uint16_t alend; @@ -3022,6 +3096,10 @@ extern void W8960_SetGain(uint8_t sel, uint16_t value); goto nfuncexit; } #endif + if (!strncmp_XP(vname, XPSTR("ctper"), 5)) { + fvar = TasmotaGlobal.tele_period; + goto exit; + } break; case 'd': if (!strncmp_XP(vname, XPSTR("day"), 3)) { @@ -3268,6 +3346,13 @@ extern void W8960_SetGain(uint8_t sel, uint16_t value); lp = GetNumericArgument(lp, OPER_EQU, &fvar, gv); uint8_t find = fvar; if (find >= SFS_MAX) find = SFS_MAX - 1; + while (*lp == ' ') lp++; + uint8_t options = 0; + if (*lp != ')') { + // options + lp = GetNumericArgument(lp, OPER_EQU, &fvar, gv); + options = fvar; + } uint8_t index = 0; char str[SCRIPT_MAXSSIZE]; char *cp = str; @@ -3298,9 +3383,12 @@ extern void W8960_SetGain(uint8_t sel, uint16_t value); while (glob_script_mem.files[find].available()) { uint8_t buf[1]; glob_script_mem.files[find].read(buf,1); - if (buf[0] == '\t' || buf[0] == ',' || buf[0] == '\n' || buf[0] == '\r') { + if (!options && (buf[0] == '\t' || buf[0] == ',' || buf[0] == '\n' || buf[0] == '\r')) { break; } else { + if (options && (buf[0] == '\n' || buf[0] == '\r')) { + break; + } *cp++ = buf[0]; index++; if (index >= glob_script_mem.max_ssize - 1) break; @@ -3679,6 +3767,13 @@ extern void W8960_SetGain(uint8_t sel, uint16_t value); goto nfuncexit; } #endif + + if (!strncmp_XP(lp, XPSTR("f("), 2)) { + // convert to float var + lp = GetNumericArgument(lp + 2, OPER_EQU, &fvar, gv); + fvar = *(uint32_t*)&fvar; + goto nfuncexit; + } break; case 'g': @@ -3732,7 +3827,7 @@ extern void W8960_SetGain(uint8_t sel, uint16_t value); } } else { // preserve mqtt_data - char *mqd = (char*)malloc(ResponseSize()+2); + char *mqd = (char*)malloc(ResponseSize() + 2); if (mqd) { strlcpy(mqd, ResponseData(), ResponseSize()); wd = mqd; @@ -4025,7 +4120,11 @@ extern void W8960_SetGain(uint8_t sel, uint16_t value); // arg2 TS_FLOAT fvar2; lp = GetNumericArgument(lp, OPER_EQU, &fvar2, gv); - fvar = script_i2c(9 + bytes, fvar, fvar2); + if (glob_script_mem.res_ivar) { + fvar = script_i2c(9 + bytes, fvar, *(uint32_t*)&fvar2); + } else { + fvar = script_i2c(9 + bytes, fvar, fvar2); + } goto nfuncexit; } if (!strncmp_XP(lp, XPSTR("ir"), 2)) { @@ -4038,7 +4137,12 @@ extern void W8960_SetGain(uint8_t sel, uint16_t value); lp++; } lp = GetNumericArgument(lp + 1, OPER_EQU, &fvar, gv); - fvar = script_i2c(2, fvar, bytes); + if (glob_script_mem.res_ivar) { + uint32_t intres = script_i2c(2, fvar, bytes); + (*(uint32_t*)&fvar) = intres; + } else { + fvar = script_i2c(2, fvar, bytes); + } goto nfuncexit; } #endif // USE_SCRIPT_I2C @@ -4070,6 +4174,12 @@ extern void W8960_SetGain(uint8_t sel, uint16_t value); } #endif // USE_I2S_AUDIO #endif // ESP32 + if (!strncmp_XP(lp, XPSTR("i("), 2)) { + // convert to integer var + lp = GetNumericArgument(lp + 2, OPER_EQU, &fvar, gv); + *(uint32_t*)&fvar = fvar; + goto nfuncexit; + } break; #ifdef ESP32 @@ -4144,6 +4254,21 @@ extern void W8960_SetGain(uint8_t sel, uint16_t value); goto nfuncexit; } #endif // USE_LVGL + +#ifdef USE_UFILESYS +#ifdef USE_SCRIPT_FATFS_EXT + if (!strncmp_XP(lp, XPSTR("lfw("), 4)) { + char path[SCRIPT_MAXSSIZE]; + lp = GetStringArgument(lp + 4, OPER_EQU, path, 0); + char payload[SCRIPT_MAXSSIZE]; + lp = GetStringArgument(lp, OPER_EQU, payload, 0); + lp = GetNumericArgument(lp, OPER_EQU, &fvar, 0); + // write to logfile + fvar = script_logfile_write(path, payload, fvar); + goto nfuncexit; + } +#endif // USE_SCRIPT_FATFS_EXT +#endif break; case 'm': if (!strncmp_XP(lp, XPSTR("med("), 4)) { @@ -4293,6 +4418,21 @@ extern void W8960_SetGain(uint8_t sel, uint16_t value); } break; +#ifdef USE_SCRIPT_ONEWIRE + case 'o': + if (!strncmp_XP(vname, XPSTR("ow("), 3)) { + lp = GetNumericArgument(lp + 3, OPER_EQU, &fvar, 0); + uint8_t sel = fvar; + SCRIPT_SKIP_SPACES + if (*lp != ')') { + lp = GetNumericArgument(lp, OPER_EQU, &fvar, 0); + } + fvar = script_ow(sel, fvar); + goto nfuncexit; + } + break; +#endif // USE_SCRIPT_ONEWIRE + case 'p': if (!strncmp_XP(lp, XPSTR("pin["), 4)) { // raw pin level @@ -4610,9 +4750,15 @@ extern void W8960_SetGain(uint8_t sel, uint16_t value); lp++; } } + bool isint = is_int_var(lp); lp = GetNumericArgument(lp, OPER_EQU, &fvar, gv); char str[SCRIPT_MAXSSIZE]; - f2char(fvar, dprec, lzero, str, dsep); + if (isint) { + double dvar = *(int32_t*)&fvar; + f2char(dvar, dprec, lzero, str, dsep); + } else { + f2char(fvar, dprec, lzero, str, dsep); + } if (sp) strlcpy(sp, str, glob_script_mem.max_ssize); lp++; len = 0; @@ -5174,6 +5320,14 @@ extern char *SML_GetSVal(uint32_t index); #endif //USE_SCRIPT_SERIAL + if (!strncmp_XP(lp, XPSTR("sas("), 4)) { + lp = GetNumericArgument(lp + 4, OPER_EQU, &fvar, 0); + if (fvar < 1 || fvar > 3) { + fvar = 1; + } + script_sort_string_array(fvar - 1); + goto nfuncexit; + } #ifdef USE_SCRIPT_SPI if (!strncmp_XP(lp, XPSTR("spi("), 4)) { @@ -5789,6 +5943,43 @@ char *getop(char *lp, uint8_t *operand) { return lp; } +#ifdef USE_SCRIPT_FATFS_EXT +#ifdef USE_UFILESYS +int32_t script_logfile_write(char *path, char *payload, uint32_t size) { + + File rfd = ufsp->open(path, FS_FILE_APPEND); + if (rfd == 0) { + return -1; + } + + uint32_t fsize = rfd.size(); + // append string + rfd.write((uint8_t*)payload, strlen(payload)); + rfd.write((uint8_t*)"\n", 1); + if (fsize < size) { + rfd.close(); + return fsize; + } + rfd.seek(0, SeekSet); + String line = rfd.readStringUntil('\n'); + File wfd = ufsp->open("/ltmp", FS_FILE_WRITE); + if (!wfd) { + return -2; + } + while (rfd.available()) { + line = rfd.readStringUntil('\n'); + wfd.write((uint8_t*)line.c_str(), line.length()); + wfd.write((uint8_t*)"\n", 1); + } + rfd.close(); + wfd.close(); + ufsp->remove(path); + ufsp->rename("/ltmp", path); + + return fsize; +} +#endif // USE_UFILESYS +#endif // USE_SCRIPT_FATFS_EXT #ifdef ESP8266 extern "C" { @@ -6090,6 +6281,24 @@ extern "C" { #endif // USE_HOMEKIT + +bool is_int_var(char *name) { +uint8_t vtype; +struct T_INDEX ind; + + isvar(name, &vtype, &ind, 0, 0, 0); + + if (vtype != VAR_NV) { + if (vtype == NUM_RES || (vtype & STYPE) == 0) { + // numeric result + if (ind.bits.integer) { + return true; + } + } + } + return false; +} + // replace vars in cmd %var% void Replace_Cmd_Vars(char *srcbuf, uint32_t srcsize, char *dstbuf, uint32_t dstsize) { char *cp; @@ -6148,7 +6357,8 @@ void Replace_Cmd_Vars(char *srcbuf, uint32_t srcsize, char *dstbuf, uint32_t dst if (vtype == NUM_RES || (vtype & STYPE) == 0) { // numeric result if (ind.bits.integer) { - dtostrfd(*(int32_t*)&fvar, 0, string); + double dval = *(int32_t*)&fvar; + f2char(dval, dprec, lzero, string, dsep); } else { f2char(fvar, dprec, lzero, string, dsep); } @@ -7147,6 +7357,7 @@ getnext: } else { dfvar = &glob_script_mem.fvars[index]; sysv_type = 0; + glob_script_mem.res_ivar = ind.bits.integer; } numeric = 1; SCRIPT_SKIP_SPACES @@ -7483,6 +7694,201 @@ getnext: return -1; } +#ifdef USE_SCRIPT_ONEWIRE + +uint32_t script_ow(uint8_t sel, uint32_t val) { +uint32_t res = 0; +uint8_t bits; +bool invert = false; +ScriptOneWire *ow = &glob_script_mem.ow; + + if (sel >= 10 && sel <= 18) { + if (val < 1 || val > MAX_DS_SENSORS) { + val = 1; + } + return ow->ds_address[val - 1][sel - 10]; + } + + if (sel > 0 && (ow->ds == nullptr && ow->dsh == nullptr)) { + return 0xffff; + } + + switch (sel) { + case 0: + if (val & 0x8000) { + if (val & 0x10000) { + // inverted serial + invert = true; + } + val &= 0x7fff; + ow->ts = new TasmotaSerial(val & 0xff, (val >> 8) & 0x7f, 1, 0, 64); + if (ow->ts) { + + ow->ts->begin(9600); + +#ifdef ESP8266 + if (ow->ts->hardwareSerial()) { + ClaimSerial(); +#ifdef ALLOW_OW_INVERT + if (invert == true) { + U0C0 = U0C0 | BIT(UCRXI) | BIT(UCTXI); // Inverse RX, TX + } +#endif + } +#endif // ESP8266 + +#ifdef ESP32 +#ifdef ALLOW_OW_INVERT + if (invert == true) { + HardwareSerial *hws = ow->ts->getesp32hws(); + hws->end(); + hws->begin(9600, SERIAL_8N1, val & 0xff, (val >> 8) & 0x7f, true); + } +#endif +#endif // ESP32 + + ow->dsh = new DS2480B(ow->ts); + ow->dsh->begin(); + } + ow->ds = nullptr; + } else { + ow->ds = new OneWire(val); + ow->dsh = nullptr; + } + break; + case 1: + if (ow->ds) { + ow->ds->reset(); + } else { + ow->dsh->reset(); + } + break; + case 2: + if (ow->ds) { + ow->ds->skip(); + } else { + ow->dsh->skip(); + } + break; + case 3: + if (ow->ds) { + ow->ds->write(val, 1); + } else { + ow->dsh->write(val, 1); + } + break; + case 4: + if (ow->ds) { + return ow->ds->read(); + } else { + return ow->dsh->read(); + } + break; + case 5: + if (ow->ds) { + ow->ds->reset_search(); + } else { + ow->dsh->reset_search(); + } + break; + case 6: + if (val < 1 || val > MAX_DS_SENSORS) { + val = 1; + } + if (ow->ds) { + return ow->ds->search(ow->ds_address[val - 1]); + } else { + return ow->dsh->search(ow->ds_address[val - 1]); + } + break; + case 7: + if (val < 1 || val > MAX_DS_SENSORS) { + val = 1; + } + if (ow->ds) { + ow->ds->select(ow->ds_address[val - 1]); + } else { + ow->dsh->select(ow->ds_address[val - 1]); + } + break; + case 8: + bits = val & 0xc0; + val &= 0x3f; + if (val < 1 || val > MAX_DS_SENSORS) { + val = 1; + } + if (ow->ds) { + ow->ds->reset(); + ow->ds->select(ow->ds_address[val - 1]); + ow->ds->write(0xf5, 1); + ow->ds->write(0x0c, 1); + ow->ds->write(0xff, 1); + res = ow->ds->read(); + ow->ds->write(bits, 1); + } else { + ow->dsh->reset(); + ow->dsh->select(ow->ds_address[val - 1]); + ow->dsh->write(0xf5, 1); + ow->dsh->write(0x0c, 1); + ow->dsh->write(0xff, 1); + res = ow->dsh->read(); + ow->dsh->write(bits, 1); + } + break; + case 9: + bits = val & 0x80; + val &= 0x3f; + if (val < 1 || val > MAX_DS_SENSORS) { + val = 1; + } + + if (ow->ds) { + ow->ds->reset(); + ow->ds->select(ow->ds_address[val - 1]); + if (!bits) { + ow->ds->write(0x44, 1); + } else { + ow->ds->write(0xbe, 1); + delay(10); + res = ow->ds->read(); + res |= ow->ds->read() << 8; + ow->ds->reset(); + } + } else { + ow->dsh->reset(); + ow->dsh->select(ow->ds_address[val - 1]); + if (!bits) { + ow->dsh->write(0x44, 1); + } else { + ow->dsh->write(0xbe, 1); + delay(10); + res = ow->dsh->read(); + res |= ow->dsh->read() << 8; + ow->dsh->reset(); + } + } + break; + case 99: + if (ow->ds) { + ow->ds->reset(); + delete ow->ds; + ow->ds = nullptr; + } else { + ow->dsh->reset(); + delete ow->dsh; + ow->dsh = nullptr; + delete ow->ts; + } + break; + case 98: + ow->ts->write(val); + break; + } + return res; +} +#endif // USE_SCRIPT_ONEWIRE + + #ifdef USE_SCRIPT_SPI // transfer 1-3 bytes @@ -7586,6 +7992,25 @@ bool Script_Close_Serial() { } #endif //USE_SCRIPT_SERIAL + +void script_sort_array(float *array, uint16_t size) { + bool swapped; + do { + swapped = false; + for (uint16_t i = 0; i < size - 1; ++i) { + if (array[i] > array[i + 1]) { + // swap + float tmp = array[i]; + array[i] = array[i + 1]; + array[i + 1] = tmp; + swapped = true; + } + } + size -= 1; + } while (swapped); +} + + bool Is_gpio_used(uint8_t gpiopin) { if (gpiopin >= 0 && (gpiopin < nitems(TasmotaGlobal.gpio_pin)) && (TasmotaGlobal.gpio_pin[gpiopin] > 0)) { return true; @@ -9673,6 +10098,11 @@ void Script_Check_HTML_Setvars(void) { *cp1 = '='; cp1++; + if (is_int_var(vname)) { + memmove(cp1 + 1, cp1, strlen(cp1)); + *cp1++ = '#'; + } + struct T_INDEX ind; uint8_t vtype; isvar(vname, &vtype, &ind, 0, 0, 0); @@ -10143,7 +10573,7 @@ const char *gc_str; lp = GetStringArgument(lp, OPER_EQU, right, 0); SCRIPT_SKIP_SPACES - WSContentSend_P(SCRIPT_MSG_SLIDER, left,mid, right, (uint32_t)min, (uint32_t)max, (uint32_t)val, vname); + WSContentSend_P(SCRIPT_MSG_SLIDER, left, mid, right, (uint32_t)min, (uint32_t)max, (uint32_t)val, vname); lp++; } else if (!strncmp(lin, "ck(", 3)) { @@ -10400,6 +10830,8 @@ const char *gc_str; char vname[16]; ScriptGetVarname(vname, slp, sizeof(vname)); + bool isint = is_int_var(vname); + char label[SCRIPT_MAXSSIZE]; lp = GetStringArgument(lp, OPER_EQU, label, 0); SCRIPT_SKIP_SPACES @@ -10417,10 +10849,17 @@ const char *gc_str; } char vstr[16],minstr[16],maxstr[16],stepstr[16]; - dtostrfd(val, dprec, vstr); - dtostrfd(min, dprec, minstr); - dtostrfd(max, dprec, maxstr); - dtostrfd(step, dprec, stepstr); + if (isint) { + dtostrfd(*(int32_t*)&val, 0, vstr); + dtostrfd(*(int32_t*)&min, dprec, minstr); + dtostrfd(*(int32_t*)&max, dprec, maxstr); + dtostrfd(*(int32_t*)&step, dprec, stepstr); + } else { + dtostrfd(val, dprec, vstr); + dtostrfd(min, dprec, minstr); + dtostrfd(max, dprec, maxstr); + dtostrfd(step, dprec, stepstr); + } WCS_DIV(specopt); WSContentSend_P(SCRIPT_MSG_NUMINP, center, label, minstr, maxstr, stepstr, vstr, tsiz, vname); WCS_DIV(specopt | WSO_STOP_DIV); @@ -10867,8 +11306,11 @@ exgc: WSContentSend_P(PSTR("%s"), lin); } #else - if (!(specopt&WSO_FORCEMAIN)) { - lin++; + + if (mc != 'z') { + if (!(specopt&WSO_FORCEMAIN)) { + lin++; + } } WSContentSend_P(PSTR("%s"), lin); } else { @@ -11305,10 +11747,27 @@ int32_t call2pwl(const char *url) { result.replace("instant", "i"); result.replace("apparent", "a"); result.replace("reactive", "r"); + +// custom replace +#ifdef TESLA_POWERWALL_CTS1 + result.replace(TESLA_POWERWALL_CTS1, "PW_CTS1"); +#endif + +#ifdef TESLA_POWERWALL_CTS2 + result.replace(TESLA_POWERWALL_CTS2, "PW_CTS2"); +#endif + if (result.length()>4095) { AddLog(LOG_LEVEL_INFO, PSTR("PWL: result overflow: %d"), result.length()); } + +#ifdef MQTT_DATA_STRING + TasmotaGlobal.mqtt_data = result; +#else + strncpy(TasmotaGlobal.mqtt_data, result.c_str(), MESSZ); +#endif + // meter aggregates has also too many tokens char *cp = (char*)result.c_str(); if (!strncmp_P(cp, PSTR("{\"site\""), 7)) { @@ -11415,36 +11874,38 @@ void cpy2lf(char *dst, uint32_t dstlen, char *src) { } #ifdef USE_SCRIPT_I2C -uint8_t script_i2c_addr; -TwoWire *script_i2c_wire; uint32_t script_i2c(uint8_t sel, uint16_t val, uint32_t val1) { uint32_t rval = 0; uint8_t bytes = 1; + if (sel > 0) { + if (!glob_script_mem.script_i2c_wire) return 0; + } + switch (sel) { case 0: - script_i2c_addr = val; + glob_script_mem.script_i2c_addr = val; #ifdef ESP32 - if (val1 == 0) script_i2c_wire = &Wire; - else script_i2c_wire = &Wire1; + if (val1 == 0) glob_script_mem.script_i2c_wire = &Wire; + else glob_script_mem.script_i2c_wire = &Wire1; #else - script_i2c_wire = &Wire; + glob_script_mem.script_i2c_wire = &Wire; #endif - script_i2c_wire->beginTransmission(script_i2c_addr); - return (0 == script_i2c_wire->endTransmission()); + glob_script_mem.script_i2c_wire->beginTransmission(glob_script_mem.script_i2c_addr); + return (0 == glob_script_mem.script_i2c_wire->endTransmission()); break; case 2: // read 1..4 bytes if ((val & 0x8000) == 0) { - script_i2c_wire->beginTransmission(script_i2c_addr); - script_i2c_wire->write(val); - script_i2c_wire->endTransmission(); + glob_script_mem.script_i2c_wire->beginTransmission(glob_script_mem.script_i2c_addr); + glob_script_mem.script_i2c_wire->write(val); + glob_script_mem.script_i2c_wire->endTransmission(); } - script_i2c_wire->requestFrom((int)script_i2c_addr, (int)val1); + glob_script_mem.script_i2c_wire->requestFrom((int)glob_script_mem.script_i2c_addr, (int)val1); for (uint8_t cnt = 0; cnt < val1; cnt++) { rval <<= 8; - rval |= (uint8_t)script_i2c_wire->read(); + rval |= (uint8_t)glob_script_mem.script_i2c_wire->read(); } break; @@ -11454,23 +11915,23 @@ uint32_t script_i2c(uint8_t sel, uint16_t val, uint32_t val1) { case 13: // write 1 .. 4 bytes bytes = sel - 9; - script_i2c_wire->beginTransmission(script_i2c_addr); + glob_script_mem.script_i2c_wire->beginTransmission(glob_script_mem.script_i2c_addr); if ((val & 0x8000) == 0) { - script_i2c_wire->write(val); + glob_script_mem.script_i2c_wire->write(val); } if ((val & 0x4000) == 0) { for (uint8_t cnt = 0; cnt < bytes; cnt++) { - script_i2c_wire->write(val1); + glob_script_mem.script_i2c_wire->write(val1); val1 >>= 8; } } else { uint32_t wval = 0; for (uint8_t cnt = 0; cnt < bytes; cnt++) { wval = val1 >> ((bytes - 1 - cnt) * 8); - script_i2c_wire->write(wval); + glob_script_mem.script_i2c_wire->write(wval); } } - script_i2c_wire->endTransmission(); + glob_script_mem.script_i2c_wire->endTransmission(); break; } @@ -11918,6 +12379,9 @@ bool Xdrv10(uint32_t function) case FUNC_INIT: //bitWrite(Settings->rule_enabled, 0, 0); // >>>>>>>>>>> +#ifndef NO_SCRIPT_STOP_ON_ERROR + bitWrite(Settings->rule_stop, 0, 1); +#endif // set defaults to rules memory //bitWrite(Settings->rule_enabled,0,0); @@ -12224,6 +12688,10 @@ bool Xdrv10(uint32_t function) } } break; + case FUNC_BUTTON_MULTI_PRESSED: + if (bitRead(Settings->rule_enabled, 0)) { + Run_Scripter1(">b", 2, 0); + } #endif //USE_BUTTON_EVENT case FUNC_LOOP: From 07a9f33ae7f4800575fd59942b26ea6ccfb200c3 Mon Sep 17 00:00:00 2001 From: stefanbode Date: Fri, 5 May 2023 09:18:23 +0200 Subject: [PATCH 064/289] Update CHANGELOG.md (#18581) Added my latest changes --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index b556e979c..a56ff7584 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,6 +13,9 @@ All notable changes to this project will be documented in this file. - Support for TC74 temperature sensor by Michael Loftis (#18042) - Matter support for Shutters with Tilt - Matter POC for remote Relay +- Added support for Zero-Cross Dimmer on ESP32, changed calculation on EPS8266, high resolution control e.g. Solar: `ZCDimmerSet` +- ESP32: Enhanced Shutterbuttons functionality to control tilt position, additionally incr/decr possible to position and tilt. +- ESP32: `Shuttersetup` for "Shelly 2.5 pro" automatic calibration and setup (experimental) ### Breaking Changed @@ -25,6 +28,7 @@ All notable changes to this project will be documented in this file. - ESP8266 Energy Export Active no update regression from v12.3.1.3 - NovaSDS GUI values (#18444) - Berry fix rules for string comparisons (#18464) +- Shutter: GarageMode does not stop on console commands, `ShutterSetOpen` and `ShutterSetClose` does not reset direction (#18539) ### Removed From 069278f966ad89e30377a25b26938876bc973b9b Mon Sep 17 00:00:00 2001 From: s-hadinger <49731213+s-hadinger@users.noreply.github.com> Date: Fri, 5 May 2023 15:13:22 +0200 Subject: [PATCH 065/289] Berry add `tcpclientasync` class for non-blocking TCP client (#18584) --- CHANGELOG.md | 1 + lib/libesp32/berry/default/be_modtab.c | 2 + lib/libesp32/berry_mapping/src/be_mapping.h | 1 + .../berry_mapping/src/be_mapping_utils.c | 8 + lib/libesp32/berry_matter/solidify_all.be | 2 +- .../berry_tasmota/src/be_tcpclientasyc_lib.c | 46 ++ .../xdrv_52_3_berry_tcpclientasync.ino | 534 ++++++++++++++++++ 7 files changed, 593 insertions(+), 1 deletion(-) create mode 100644 lib/libesp32/berry_tasmota/src/be_tcpclientasyc_lib.c create mode 100644 tasmota/tasmota_xdrv_driver/xdrv_52_3_berry_tcpclientasync.ino diff --git a/CHANGELOG.md b/CHANGELOG.md index a56ff7584..d2c63a54b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -16,6 +16,7 @@ All notable changes to this project will be documented in this file. - Added support for Zero-Cross Dimmer on ESP32, changed calculation on EPS8266, high resolution control e.g. Solar: `ZCDimmerSet` - ESP32: Enhanced Shutterbuttons functionality to control tilt position, additionally incr/decr possible to position and tilt. - ESP32: `Shuttersetup` for "Shelly 2.5 pro" automatic calibration and setup (experimental) +- Berry add `tcpclientasync` class for non-blocking TCP client ### Breaking Changed diff --git a/lib/libesp32/berry/default/be_modtab.c b/lib/libesp32/berry/default/be_modtab.c index 5051dd948..c4f548031 100644 --- a/lib/libesp32/berry/default/be_modtab.c +++ b/lib/libesp32/berry/default/be_modtab.c @@ -220,6 +220,7 @@ be_extern_native_class(md5); be_extern_native_class(udp); be_extern_native_class(webclient); be_extern_native_class(tcpclient); +be_extern_native_class(tcpclientasync); be_extern_native_class(tcpserver); be_extern_native_class(energy_struct); // LVGL core classes @@ -267,6 +268,7 @@ BERRY_LOCAL bclass_array be_class_table = { &be_native_class(udp), &be_native_class(webclient), &be_native_class(tcpclient), + &be_native_class(tcpclientasync), #endif // USE_WEBCLIENT #ifdef USE_BERRY_TCPSERVER &be_native_class(tcpserver), diff --git a/lib/libesp32/berry_mapping/src/be_mapping.h b/lib/libesp32/berry_mapping/src/be_mapping.h index 0b0ef2c1e..9876278f3 100644 --- a/lib/libesp32/berry_mapping/src/be_mapping.h +++ b/lib/libesp32/berry_mapping/src/be_mapping.h @@ -88,6 +88,7 @@ extern "C" { void be_raisef(bvm *vm, const char *except, const char *msg, ...); +extern void be_map_insert_nil(bvm *vm, const char *key); extern void be_map_insert_int(bvm *vm, const char *key, bint value); extern void be_map_insert_bool(bvm *vm, const char *key, bbool value); extern void be_map_insert_real(bvm *vm, const char *key, breal value); diff --git a/lib/libesp32/berry_mapping/src/be_mapping_utils.c b/lib/libesp32/berry_mapping/src/be_mapping_utils.c index e3a2cc6e2..51f7388ba 100644 --- a/lib/libesp32/berry_mapping/src/be_mapping_utils.c +++ b/lib/libesp32/berry_mapping/src/be_mapping_utils.c @@ -5,6 +5,14 @@ /*********************************************************************************************\ * Helper functions to create a map with single line calls \*********************************************************************************************/ +/* Insert an nil to a key */ +void be_map_insert_nil(bvm *vm, const char *key) +{ + be_pushstring(vm, key); + be_pushnil(vm); + be_data_insert(vm, -3); + be_pop(vm, 2); +} /* Insert an int to a key */ void be_map_insert_int(bvm *vm, const char *key, bint value) { diff --git a/lib/libesp32/berry_matter/solidify_all.be b/lib/libesp32/berry_matter/solidify_all.be index 81f392870..2d9bf3f45 100755 --- a/lib/libesp32/berry_matter/solidify_all.be +++ b/lib/libesp32/berry_matter/solidify_all.be @@ -14,7 +14,7 @@ import sys sys.path().push('src/embedded') # allow to import from src/embedded # globals that need to exist to make compilation succeed -var globs = "path,ctypes_bytes_dyn,tasmota,ccronexpr,gpio,light,webclient,load,MD5,lv,light_state,udp," +var globs = "path,ctypes_bytes_dyn,tasmota,ccronexpr,gpio,light,webclient,load,MD5,lv,light_state,udp,tcpclientasync," "lv_clock,lv_clock_icon,lv_signal_arcs,lv_signal_bars,lv_wifi_arcs_icon,lv_wifi_arcs," "lv_wifi_bars_icon,lv_wifi_bars," "_lvgl," diff --git a/lib/libesp32/berry_tasmota/src/be_tcpclientasyc_lib.c b/lib/libesp32/berry_tasmota/src/be_tcpclientasyc_lib.c new file mode 100644 index 000000000..16d5f7240 --- /dev/null +++ b/lib/libesp32/berry_tasmota/src/be_tcpclientasyc_lib.c @@ -0,0 +1,46 @@ +/******************************************************************** + * TCP client non-blocking (async) + * + * + *******************************************************************/ +#include "be_constobj.h" + +#ifdef USE_WEBCLIENT + +extern int wc_tcpasync_init(bvm *vm); +extern int wc_tcpasync_deinit(bvm *vm); + +extern int wc_tcpasync_connect(bvm *vm); +extern int wc_tcpasync_connected(bvm *vm); +extern int wc_tcpasync_listening(bvm *vm); +extern int wc_tcpasync_info(bvm *vm); +extern int wc_tcpasync_close(bvm *vm); +extern int wc_tcpasync_available(bvm *vm); + +extern int wc_tcpasync_write(bvm *vm); +extern int wc_tcpasync_read(bvm *vm); +extern int wc_tcpasync_readbytes(bvm *vm); + +#include "be_fixed_be_class_tcpclientasync.h" + +/* @const_object_info_begin + +class be_class_tcpclientasync (scope: global, name: tcpclientasync) { + .p, var + init, func(wc_tcpasync_init) + deinit, func(wc_tcpasync_deinit) + + connect, func(wc_tcpasync_connect) + connected, func(wc_tcpasync_connected) + listening, func(wc_tcpasync_listening) + info, func(wc_tcpasync_info) + close, func(wc_tcpasync_close) + available, func(wc_tcpasync_available) + + write, func(wc_tcpasync_write) + read, func(wc_tcpasync_read) + readbytes, func(wc_tcpasync_readbytes) +} +@const_object_info_end */ + +#endif // USE_WEBCLIENT diff --git a/tasmota/tasmota_xdrv_driver/xdrv_52_3_berry_tcpclientasync.ino b/tasmota/tasmota_xdrv_driver/xdrv_52_3_berry_tcpclientasync.ino new file mode 100644 index 000000000..8c6fa9841 --- /dev/null +++ b/tasmota/tasmota_xdrv_driver/xdrv_52_3_berry_tcpclientasync.ino @@ -0,0 +1,534 @@ +/* + xdrv_52_3_berry_tcpclientasync.ino - Berry scripting language, TCP client non-blocking + + Copyright (C) 2021 Stephan Hadinger, Berry language by Guan Wenliang https://github.com/Skiars/berry + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +// also includes tcp_client + +#ifdef USE_BERRY + +#ifdef USE_WEBCLIENT + +#include +// #include "be_sys.h" +#include +#include + +#define T_IN6_IS_ADDR_V4MAPPED(a) \ + ((((__const uint32_t *) (a))[0] == 0) \ + && (((__const uint32_t *) (a))[1] == 0) \ + && (((__const uint32_t *) (a))[2] == htonl (0xffff))) + +enum class AsyncTCPState { + INPROGRESS, + CONNECTED, + REFUSED, + CLOSED +}; + +class AsyncTCPClient { +public: + + AsyncTCPClient() : sockfd(-1), state(AsyncTCPState::INPROGRESS), _timeout_ms(1), local_port(-1) { + + } + + ~AsyncTCPClient() { + this->stop(); + } + + void stop() { + if (sockfd > 0) { + close(sockfd); + } + sockfd = -1; + state = AsyncTCPState::CLOSED; + } + + int connect(IPAddress ip, uint16_t port) { + struct sockaddr_storage serveraddr = {}; + sockfd = -1; + + if (state != AsyncTCPState::INPROGRESS) { + stop(); + state = AsyncTCPState::INPROGRESS; // reset state + } + + if (ip.type() == IPv6) { + struct sockaddr_in6 *tmpaddr = (struct sockaddr_in6 *)&serveraddr; + sockfd = socket(AF_INET6, SOCK_STREAM, 0); + tmpaddr->sin6_family = AF_INET6; + memcpy(tmpaddr->sin6_addr.un.u8_addr, &ip[0], 16); + tmpaddr->sin6_port = htons(port); + } else { + struct sockaddr_in *tmpaddr = (struct sockaddr_in *)&serveraddr; + sockfd = socket(AF_INET, SOCK_STREAM, 0); + tmpaddr->sin_family = AF_INET; + tmpaddr->sin_addr.s_addr = ip; + tmpaddr->sin_port = htons(port); + } + if (sockfd < 0) { + AddLog(LOG_LEVEL_DEBUG, "BRY: Error: socket: %d", errno); + return 0; + } + // berry_log_C("sockfd=%i", sockfd); + fcntl(sockfd, F_SETFL, fcntl(sockfd, F_GETFL, 0) | O_NONBLOCK ); // set non-blocking + + fd_set fdset; + FD_ZERO(&fdset); + FD_SET(sockfd, &fdset); + + int res = lwip_connect(sockfd, (struct sockaddr*)&serveraddr, sizeof(serveraddr)); + if (res < 0 && errno != EINPROGRESS) { + AddLog(LOG_LEVEL_INFO, "BRY: Error: connect on fd %d, errno: %d, \"%s\"", sockfd, errno, strerror(errno)); + close(sockfd); + return 0; + } + // berry_log_C("lwip_connect res=%i errno=%i (EINPROGRESS=%i)", res, errno, EINPROGRESS); + return 1; + } + + void _update_connection_state(void) { + if (state != AsyncTCPState::INPROGRESS) { + return; + } + + fd_set fdset; + FD_ZERO(&fdset); + FD_SET(sockfd, &fdset); + + struct timeval tv; + tv.tv_sec = 0; + tv.tv_usec = 0; + + int res = ::select(sockfd + 1, nullptr, &fdset, nullptr, &tv); + if (res < 0) { + AddLog(LOG_LEVEL_DEBUG, "BRY: select on fd %d, errno: %d, \"%s\"", sockfd, errno, strerror(errno)); + stop(); + state = AsyncTCPState::REFUSED; + return; + } else if (res == 0) { + // AddLog(LOG_LEVEL_DEBUG, "BRY: select returned due to timeout %d ms for fd %d", _timeout_ms, sockfd); + // stop(); + // state = AsyncTCPState::TIMEOUT; + return; + } else { + int sockerr; + socklen_t len = (socklen_t)sizeof(int); + res = getsockopt(sockfd, SOL_SOCKET, SO_ERROR, &sockerr, &len); + + if (res < 0) { + AddLog(LOG_LEVEL_DEBUG, "BRY: getsockopt on fd %d, errno: %d, \"%s\"", sockfd, errno, strerror(errno)); + stop(); + state = AsyncTCPState::REFUSED; + return; + } + + if (sockerr != 0) { + AddLog(LOG_LEVEL_DEBUG, "BRY: socket error on fd %d, errno: %d, \"%s\"", sockfd, sockerr, strerror(sockerr)); + stop(); + state = AsyncTCPState::REFUSED; + return; + } + + state = AsyncTCPState::CONNECTED; + return; + } + } + + void _update_connected(void) { + if (state == AsyncTCPState::INPROGRESS) { + this->_update_connection_state(); // force an update + } + if (state == AsyncTCPState::CONNECTED) { + uint8_t dummy; + int res = recv(sockfd, &dummy, 0, MSG_DONTWAIT); + // recv only sets errno if res is <= 0 + if (res <= 0){ + switch (errno) { + case EWOULDBLOCK: + case ENOENT: //caused by vfs + // connected, don't change status + break; + case ENOTCONN: + case EPIPE: + case ECONNRESET: + case ECONNREFUSED: + case ECONNABORTED: + stop(); + break; + default: + // AddLog(LOG_LEVEL_DEBUG, "BRY: tcpclientasync unexpected: RES: %d, ERR: %d", res, errno); + stop(); + break; + } + } else { + // connected do nothing + } + } + } + + // connected() + // returns: + // 0: still in progres, unknown + // 1: connected + // -1: refused + int connected(void) { + _update_connected(); + switch (state) { + case AsyncTCPState::CONNECTED: return 1; break; + case AsyncTCPState::INPROGRESS: return 0; break; + // all other values indicated that the connection is down + case AsyncTCPState::REFUSED: + case AsyncTCPState::CLOSED: + default: + return -1; + break; + } + } + + size_t available(void) { + _update_connected(); + if (state == AsyncTCPState::CONNECTED) { + size_t bytes_available = 0; + int res = ioctl(sockfd, FIONREAD, &bytes_available); + if (res >= 0) { + return bytes_available; + } else { + return 0; + } + } else { + return 0; + } + } + + bool listening(void) { + _update_connected(); + if (state == AsyncTCPState::CONNECTED) { + fd_set fdset; + FD_ZERO(&fdset); + FD_SET(sockfd, &fdset); + + struct timeval tv; + tv.tv_sec = 0; + tv.tv_usec = 0; + + int res = ::select(sockfd + 1, nullptr, &fdset, nullptr, &tv); + if (res < 0) { + stop(); + return false; + } else if (res == 0) { + // connection is up but not ready to send + return false; + } else { + // we assume that since we got select answering it's good + return true; + } + } + return false; + } + + size_t write(const char *buffer, size_t size) { + _update_connected(); + if (state == AsyncTCPState::CONNECTED) { + // is the socket ready for writing + fd_set set; + struct timeval tv; + FD_ZERO(&set); // empties the set + FD_SET(sockfd, &set); // adds FD to the set + tv.tv_sec = 0; + tv.tv_usec = 0; // non-blocking + + if (select(sockfd + 1, NULL, &set, NULL, &tv) < 0) { + return 0; // error TODO close connection? + } + + if (FD_ISSET(sockfd, &set)) { + // ready for writes + int res = send(sockfd, (void*) buffer, size, MSG_DONTWAIT); + if (res >= 0) { + return res; + } else { // res < 0 + if (errno != EAGAIN) { + AddLog(LOG_LEVEL_DEBUG, "BRY: tcpclientasync send fail on fd %d, errno: %d, \"%s\"", sockfd, errno, strerror(errno)); + stop(); + return 0; + } + } + } else { + return 0; // not ready for writes + } + + } else { + return 0; + } + return 0; + } + + size_t read(uint8_t* buf, size_t size) { + _update_connected(); + if (state == AsyncTCPState::CONNECTED) { + if (size > 1436) { size = 1436; } // let's keep it reasonable + + int res = recv(sockfd, buf, size, MSG_DONTWAIT); + if (res < 0) { // check error + if (errno != EWOULDBLOCK) { // something went wrong + stop(); + return 0; + } + } + return res; + } + return 0; + } + + void update_local_addr_port(void) { + local_port = -1; // default to unknwon + if (sockfd > 0) { + struct sockaddr_storage local_address; + socklen_t addr_size = sizeof(local_address); + // getpeername(fd, (struct sockaddr*)&addr, &len); + int res = getsockname(sockfd, (struct sockaddr*)&local_address, &addr_size); + if (res != 0) { return; } + + // IPv4 socket, old way + if (((struct sockaddr*)&local_address)->sa_family == AF_INET) { + struct sockaddr_in *s = (struct sockaddr_in *)&local_address; + local_port = ntohs(s->sin_port); + local_addr = IPAddress((uint32_t)(s->sin_addr.s_addr)); + // return IPAddress((uint32_t)(s->sin_addr.s_addr)); + } + + // IPv6, but it might be IPv4 mapped address + if (((struct sockaddr*)&local_address)->sa_family == AF_INET6) { + struct sockaddr_in6 *saddr6 = (struct sockaddr_in6 *)&local_address; + local_port = ntohs(saddr6->sin6_port); + if (T_IN6_IS_ADDR_V4MAPPED(saddr6->sin6_addr.un.u32_addr)) { + local_addr = IPAddress(IPv4, (uint8_t*)saddr6->sin6_addr.s6_addr+12); + // return IPAddress(IPv4, (uint8_t*)saddr6->sin6_addr.s6_addr+12); + } else { + local_addr = IPAddress(IPv6, (uint8_t*)(saddr6->sin6_addr.s6_addr)); + // return IPAddress(IPv6, (uint8_t*)(saddr6->sin6_addr.s6_addr)); + } + } + } + } + +public: + int sockfd; + AsyncTCPState state; + uint32_t _timeout_ms; + String remota_addr; // address in numerical format (after DNS resolution), either IPv4 or IPv6 + uint16_t remote_port; // remote port number + IPAddress local_addr; + int32_t local_port; // -1 if unknown or invalid +}; + +/*********************************************************************************************\ + * Native functions mapped to Berry functions + * + * +\*********************************************************************************************/ +extern "C" { + // same but using `.p` argument + AsyncTCPClient * wc_gettcpclientasync_p(struct bvm *vm) { + be_getmember(vm, 1, ".p"); + void *p = be_tocomptr(vm, -1); + be_pop(vm, 1); + return (AsyncTCPClient*) p; + } + + int32_t wc_tcpasync_init(struct bvm *vm); + int32_t wc_tcpasync_init(struct bvm *vm) { + int32_t argc = be_top(vm); + AsyncTCPClient * wcl; + if (argc >= 2 && be_iscomptr(vm, 2)) { + wcl = (AsyncTCPClient*) be_tocomptr(vm, 2); + } else { + wcl = new AsyncTCPClient(); + } + be_pushcomptr(vm, (void*) wcl); + be_setmember(vm, 1, ".p"); + be_return_nil(vm); + } + + int32_t wc_tcpasync_deinit(struct bvm *vm); + int32_t wc_tcpasync_deinit(struct bvm *vm) { + AsyncTCPClient * wcl = wc_gettcpclientasync_p(vm); + if (wcl != nullptr) { delete wcl; } + be_setmember(vm, 1, ".p"); + be_return_nil(vm); + } + + // tcp.connect(address:string, port:int) -> bool + int32_t wc_tcpasync_connect(struct bvm *vm); + int32_t wc_tcpasync_connect(struct bvm *vm) { + int32_t argc = be_top(vm); + if (argc >= 3 && be_isstring(vm, 2) && be_isint(vm, 3)) { + AsyncTCPClient * tcp = wc_gettcpclientasync_p(vm); + const char * address = be_tostring(vm, 2); + int32_t port = be_toint(vm, 3); + // open connection + IPAddress ipaddr; + bool success = WifiHostByName(address, ipaddr); + if (success) { + success = tcp->connect(ipaddr, port); + } else { + AddLog(LOG_LEVEL_DEBUG, "BRY: tcpclientasync.connect couldn't resolve '%s'", address); + } + be_pushbool(vm, success); + be_return(vm); /* return self */ + } + be_raise(vm, "attribute_error", NULL); + } + + // tcp.close(void) -> nil + int32_t wc_tcpasync_close(struct bvm *vm); + int32_t wc_tcpasync_close(struct bvm *vm) { + AsyncTCPClient * tcp = wc_gettcpclientasync_p(vm); + tcp->stop(); + be_return_nil(vm); + } + + // tcp.available(void) -> int + int32_t wc_tcpasync_available(struct bvm *vm); + int32_t wc_tcpasync_available(struct bvm *vm) { + AsyncTCPClient * tcp = wc_gettcpclientasync_p(vm); + int32_t available = tcp->available(); + be_pushint(vm, available); + be_return(vm); + } + + // tcp.connected(void) -> bool or nil + // new value: returns `nil` if the status is still unknown + int32_t wc_tcpasync_connected(struct bvm *vm); + int32_t wc_tcpasync_connected(struct bvm *vm) { + AsyncTCPClient * tcp = wc_gettcpclientasync_p(vm); + int res = tcp->connected(); + if (res) { + be_pushbool(vm, res > 0); + } else { + be_pushnil(vm); + } + be_return(vm); /* return code */ + } + + // tcp.listening(void) -> bool + // is the socket ready for sending + int32_t wc_tcpasync_listening(struct bvm *vm); + int32_t wc_tcpasync_listening(struct bvm *vm) { + AsyncTCPClient * tcp = wc_gettcpclientasync_p(vm); + bool res = tcp->listening(); + be_pushbool(vm, res); + be_return(vm); /* return code */ + } + + // tcp.info(void) -> map + // get information about the socket + int32_t wc_tcpasync_info(struct bvm *vm); + int32_t wc_tcpasync_info(struct bvm *vm) { + AsyncTCPClient * tcp = wc_gettcpclientasync_p(vm); + be_newobject(vm, "map"); + int connected = tcp->connected(); + if (connected == 0) { + be_map_insert_nil(vm, "connected"); + } else { + be_map_insert_bool(vm, "connected", connected > 0); + } + if (connected >= 0) { + be_map_insert_bool(vm, "available", tcp->available()); + be_map_insert_bool(vm, "listening", tcp->listening()); + be_map_insert_int(vm, "fd", tcp->sockfd); + tcp->update_local_addr_port(); + if (tcp->local_port > 0) { + be_map_insert_int(vm, "local_port", tcp->local_port); + be_map_insert_str(vm, "local_addr", tcp->local_addr.toString().c_str()); + } + } + be_pop(vm, 1); + be_return(vm); + } + + // tcp.write(bytes | string) -> int + int32_t wc_tcpasync_write(struct bvm *vm); + int32_t wc_tcpasync_write(struct bvm *vm) { + int32_t argc = be_top(vm); + if (argc >= 2 && (be_isstring(vm, 2) || be_isbytes(vm, 2))) { + AsyncTCPClient * tcp = wc_gettcpclientasync_p(vm); + const char * buf = nullptr; + size_t buf_len = 0; + if (be_isstring(vm, 2)) { // string + buf = be_tostring(vm, 2); + buf_len = strlen(buf); + } else { // bytes + buf = (const char*) be_tobytes(vm, 2, &buf_len); + } + size_t bw = tcp->write(buf, buf_len); + be_pushint(vm, bw); + be_return(vm); /* return code */ + } + be_raise(vm, kTypeError, nullptr); + } + + // tcp.read() -> string + int32_t wc_tcpasync_read(struct bvm *vm); + int32_t wc_tcpasync_read(struct bvm *vm) { + AsyncTCPClient * tcp = wc_gettcpclientasync_p(vm); + int32_t max_read = -1; // by default read as much as we can + if (be_top(vm) >= 2 && be_isint(vm, 2)) { + max_read = be_toint(vm, 2); + } + int32_t btr = tcp->available(); + if (btr <= 0) { + be_pushstring(vm, ""); + } else { + if ((max_read >= 0) && (btr > max_read)) { + btr = max_read; + } + char * buf = (char*) be_pushbuffer(vm, btr); + int32_t btr2 = tcp->read((uint8_t*) buf, btr); + be_pushnstring(vm, buf, btr2); + } + be_return(vm); /* return code */ + } + + // tcp.readbytes() -> bytes + int32_t wc_tcpasync_readbytes(struct bvm *vm); + int32_t wc_tcpasync_readbytes(struct bvm *vm) { + AsyncTCPClient * tcp = wc_gettcpclientasync_p(vm); + int32_t max_read = -1; // by default read as much as we can + if (be_top(vm) >= 2 && be_isint(vm, 2)) { + max_read = be_toint(vm, 2); + } + int32_t btr = tcp->available(); + if (btr <= 0) { + be_pushbytes(vm, nullptr, 0); + } else { + if ((max_read >= 0) && (btr > max_read)) { + btr = max_read; + } + uint8_t * buf = (uint8_t*) be_pushbuffer(vm, btr); + int32_t btr2 = tcp->read(buf, btr); + be_pushbytes(vm, buf, btr2); + } + be_return(vm); /* return code */ + } + +} + +#endif // USE_WEBCLIENT +#endif // USE_BERRY From d7b6d72e19c934be7b426ae5b0819e24929f555a Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Fri, 5 May 2023 16:50:19 +0200 Subject: [PATCH 066/289] Add support for GM861 - Add support for GM861 1D and 2D bar code reader (#18399) - Bump version to v12.5.0.2 --- BUILDS.md | 1 + CHANGELOG.md | 30 +- RELEASENOTES.md | 8 +- tasmota/include/tasmota_version.h | 2 +- tasmota/my_user_config.h | 3 +- .../tasmota_xsns_sensor/xsns_107_gm861.ino | 329 ++++++++++++++++++ 6 files changed, 358 insertions(+), 15 deletions(-) create mode 100644 tasmota/tasmota_xsns_sensor/xsns_107_gm861.ino diff --git a/BUILDS.md b/BUILDS.md index cb6e3de96..32aa08d78 100644 --- a/BUILDS.md +++ b/BUILDS.md @@ -215,6 +215,7 @@ Note: `minimal` variant is not listed as it shouldn't be used outside of the [up | USE_PROJECTOR_CTRL | - | - / - | - | - | - | - | | USE_AS608 | - | - / - | - | - | - | - | | USE_LD2410 | - | - / - | - | - | - | - | +| USE_GM861 | - | - / - | - | - | - | - | | USE_TCP_BRIDGE | - | - / - | - | - | - | - | zbbridge / zbbrdgpro | | | | | | | | | USE_NRF24 | - | - / - | - | - | - | - | diff --git a/CHANGELOG.md b/CHANGELOG.md index d2c63a54b..6532b2f1c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,7 +3,25 @@ All notable changes to this project will be documented in this file. ## [Unreleased] - Development -## [12.5.0.1] +## [12.5.0.2] +### Added +- Matter support for Shutters with Tilt +- Matter POC for remote Relay +- Support for Zero-Cross Dimmer on ESP32, changed calculation on EPS8266, high resolution control e.g. Solar: `ZCDimmerSet` +- ESP32 Enhanced Shutterbuttons functionality to control tilt position, additionally incr/decr possible to position and tilt. +- ESP32 `Shuttersetup` for "Shelly 2.5 pro" automatic calibration and setup (experimental) +- Berry `tcpclientasync` class for non-blocking TCP client +- Support for GM861 1D and 2D bar code reader (#18399) + +### Breaking Changed + +### Changed + +### Fixed + +### Removed + +## [12.5.0.1] 20230505 ### Added - Matter sensors Humidity, Pressure, Illuminance; optimize memory (#18441) - Command ``SetOption152 0/1`` to select two (0 = default) pin bistable or one (1) pin latching relay control (#18386) @@ -11,14 +29,6 @@ All notable changes to this project will be documented in this file. - Matter UI to change endpoints configuration (#18498) - Matter support for Shutters (without Tilt) (#18509) - Support for TC74 temperature sensor by Michael Loftis (#18042) -- Matter support for Shutters with Tilt -- Matter POC for remote Relay -- Added support for Zero-Cross Dimmer on ESP32, changed calculation on EPS8266, high resolution control e.g. Solar: `ZCDimmerSet` -- ESP32: Enhanced Shutterbuttons functionality to control tilt position, additionally incr/decr possible to position and tilt. -- ESP32: `Shuttersetup` for "Shelly 2.5 pro" automatic calibration and setup (experimental) -- Berry add `tcpclientasync` class for non-blocking TCP client - -### Breaking Changed ### Changed - ESP32 Framework (Core) from v2.0.7 to v2.0.8 @@ -31,8 +41,6 @@ All notable changes to this project will be documented in this file. - Berry fix rules for string comparisons (#18464) - Shutter: GarageMode does not stop on console commands, `ShutterSetOpen` and `ShutterSetClose` does not reset direction (#18539) -### Removed - ## [Released] ## [12.5.0] 20230417 diff --git a/RELEASENOTES.md b/RELEASENOTES.md index df5c0d388..4d651e25a 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -110,14 +110,18 @@ The latter links can be used for OTA upgrades too like ``OtaUrl https://ota.tasm [Complete list](BUILDS.md) of available feature and sensors. -## Changelog v12.5.0.1 +## Changelog v12.5.0.2 ### Added - Command ``SetOption152 0/1`` to select two (0 = default) pin bistable or one (1) pin latching relay control [#18386](https://github.com/arendst/Tasmota/issues/18386) - Support for TC74 temperature sensor by Michael Loftis [#18042](https://github.com/arendst/Tasmota/issues/18042) +- Support for GM861 1D and 2D bar code reader [#18399](https://github.com/arendst/Tasmota/issues/18399) - Matter sensors Humidity, Pressure, Illuminance [#18441](https://github.com/arendst/Tasmota/issues/18441) - Matter allow `Matter#Initialized` rule once the device is configured [#18451](https://github.com/arendst/Tasmota/issues/18451) - Matter UI to change endpoints configuration [#18498](https://github.com/arendst/Tasmota/issues/18498) -- Matter support for Shutters (without Tilt) [#18509](https://github.com/arendst/Tasmota/issues/18509) +- Matter support for Shutters with Tilt [#18509](https://github.com/arendst/Tasmota/issues/18509) +- ESP32 Enhanced Shutterbuttons functionality to control tilt position, additionally incr/decr possible to position and tilt. +- ESP32 `Shuttersetup` for "Shelly 2.5 pro" automatic calibration and setup (experimental) +- Berry `tcpclientasync` class for non-blocking TCP client ### Breaking Changed diff --git a/tasmota/include/tasmota_version.h b/tasmota/include/tasmota_version.h index 5d31fe5bd..a98d9e299 100644 --- a/tasmota/include/tasmota_version.h +++ b/tasmota/include/tasmota_version.h @@ -20,6 +20,6 @@ #ifndef _TASMOTA_VERSION_H_ #define _TASMOTA_VERSION_H_ -const uint32_t VERSION = 0x0C050001; // 12.5.0.1 +const uint32_t VERSION = 0x0C050002; // 12.5.0.2 #endif // _TASMOTA_VERSION_H_ diff --git a/tasmota/my_user_config.h b/tasmota/my_user_config.h index 0d4b8088a..3559b6303 100644 --- a/tasmota/my_user_config.h +++ b/tasmota/my_user_config.h @@ -831,7 +831,8 @@ // #define VINDRIKTNING_SHOW_PM1 // Display undocumented/supposed PM1.0 values // #define VINDRIKTNING_SHOW_PM10 // Display undocumented/supposed PM10 values //#define USE_LD2410 // Add support for HLK-LD2410 24GHz smart wave motion sensor (+2k8 code) -// #define USE_LOX_O2 // Add support for LuminOx LOX O2 Sensor (+0k8 code) +//#define USE_LOX_O2 // Add support for LuminOx LOX O2 Sensor (+0k8 code) +//#define USE_GM861 // Add support for GM861 1D and 2D Bar Code Reader (+1k3 code) // -- Power monitoring sensors -------------------- #define USE_ENERGY_SENSOR // Add support for Energy Monitors (+14k code) diff --git a/tasmota/tasmota_xsns_sensor/xsns_107_gm861.ino b/tasmota/tasmota_xsns_sensor/xsns_107_gm861.ino new file mode 100644 index 000000000..23c0b37e2 --- /dev/null +++ b/tasmota/tasmota_xsns_sensor/xsns_107_gm861.ino @@ -0,0 +1,329 @@ +/* + xsns_107_gm861.ino - Support for GM861 Bar Code Reader for Tasmota + + Copyright (C) 2023 Theo Arends + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#ifdef USE_GM861 +/*********************************************************************************************\ + * GM861 1D and 2D Bar Code Reader + * + * For background information see https://github.com/arendst/Tasmota/discussions/18399 +\*********************************************************************************************/ + +#define XSNS_107 107 + +/* +#define GPIO_GM861_TX 304 +#define D_SENSOR_GM861_TX "GM861 Tx" +#define GPIO_GM861_RX 305 +#define D_SENSOR_GM861_RX "GM861 Rx" + +Command ===================== Response ============== Description ========================================================= +Headr Ty Ln Addrs Data Check Headr Ty Ln Data Check +----- -- -- ----- ----- ----- ----- -- -- ----- ----- +7E 00 07 01 00 2A 02 D8 0F 02 00 00 02 39 01 C1 4C Get baudrate (9600) +7E 00 08 02 00 2A 39 01 A7 EA 02 00 00 02 39 01 SS SS Set baudrate to 9600 +7E 00 08 01 00 00 D6 AB CD LED on, Mute off, Normal lighting, Normal brightness, Continuous mode +7E 00 08 01 00 02 01 AB CD 02 00 00 01 00 33 31 Command trigger Mode (Set bit0 of zone byte 0x0002) +7E 00 08 01 00 02 01 AB CD Trigger mode +7E 00 08 01 00 2C 02 AB CD Full area, Allow read all bar codes +7E 00 08 01 00 36 01 AB CD Allow read Code39 +7E 00 08 01 00 37 00 AB CD Code39 Min length +7E 00 08 01 00 38 FF AB CD Code39 Max length +7E 00 08 01 00 B0 01 AB CD Cut out data:Output Start part +7E 00 08 01 00 B1 FF AB CD Cut out M bytes from start +7E 00 08 01 00 B0 02 AB CD Output End part +7E 00 08 01 00 B2 FF AB CD Cut out N bytes from end +7E 00 08 01 00 B0 03 AB CD Output center part +7E 00 08 01 00 B1 03 AB CD Cut out N bytes from start (Eg: three characters) +7E 00 08 01 00 B2 02 AB CD Cut out N bytes from end (Eg: two characters) +7E 00 08 01 00 D9 50 81 D3 02 00 00 01 00 33 31 Zone bytes reset to defaults +7E 00 08 01 00 D9 55 D1 76 02 00 00 01 00 33 31 Restore user-defined factory settings +7E 00 08 01 00 D9 56 E1 15 02 00 00 01 00 33 31 Save as user-defined factory settings +7E 00 08 01 00 D9 A5 3E 69 02 00 00 01 00 33 31 Deep sleep, can be awakened by serial port interrupt, this serial port command is invalid +7E 00 08 01 00 D9 00 DB 26 02 00 00 01 00 33 31 Wake up from sleep +7E 00 08 01 00 E7 00 AB CD OUT1 Output low level +7E 00 08 01 00 E7 01 AB CD OUT1 Output high level +7E 00 09 01 00 00 00 DE C8 02 00 00 01 00 33 31 Save settings to flash +7E 00 0A 01 00 00 00 30 1A 03 00 00 01 00 33 31 Send heartbeat every 10 seconds +*/ + +enum Gm861States { + GM861_STATE_DONE, + GM861_STATE_DUMP, + GM861_STATE_SERIAL_OUTPUT, + GM861_STATE_OUTPUT, + GM861_STATE_SETUP_CODE_ON, + GM861_STATE_INIT_OFFSET = 16, // Init after (GM861_STATE_INIT_OFFSET - GM861_STATE_SETUP_CODE_ON) * 0.25 seconds restart + GM861_STATE_RESET +}; + +#include +TasmotaSerial *Gm861Serial = nullptr; + +struct GDK { + char barcode[30]; + uint8_t index; + uint8_t state; + bool heartbeat; + bool read; +} Gm861; + +/*********************************************************************************************/ + +uint32_t Gm861Crc(uint8_t* ptr, uint32_t len) { + // When no need for checking CRC, CRC byte can be filled in 0xAB 0xCD + uint32_t crc = 0; + while (len-- != 0) { + for (uint8_t i = 0x80; i != 0; i /= 2) { + crc *= 2; + if ((crc & 0x10000) !=0) { // After multiplying the last bit of CRC by 2, if the first bit is 1, then divide by 0x11021 + crc ^= 0x11021; + } + if ((*ptr & i) != 0) { // If this bit is 1, then CRC = previous CRC + this bit/CRC_CCITT + crc ^= 0x1021; + } + } + ptr++; + } + return crc; +} + +void Gm861Send(uint32_t type, uint32_t len, uint32_t address, uint32_t data) { + uint8_t buffer[10]; + + buffer[0] = 0x7E; + buffer[1] = 0; + buffer[2] = type; + buffer[3] = len; + buffer[4] = 0; + buffer[5] = address; + buffer[6] = data; + uint8_t index = 7; + if (len > 1) { + buffer[7] = data >> 8; + index++; + } + uint32_t crc = Gm861Crc(buffer+2, len + 4); + buffer[index] = crc >> 8; + index++; + buffer[index] = crc; + index++; + + AddLogBuffer(LOG_LEVEL_DEBUG_MORE, (uint8_t*)buffer, index); + + Gm861Serial->write(buffer, index); +} + +void Gm861SetZone(uint32_t address, uint32_t data) { + Gm861.read = false; + uint32_t len = 1; + if (0x2A == address) { len = 2; } // Baudrate + Gm861Send(8, len, address, data); +} + +void Gm861GetZone(uint32_t address) { + Gm861.read = true; + Gm861.index = address; + uint32_t data = 1; + if (0x2A == address) { data = 2; } // Baudrate + Gm861Send(7, 1, address, data); +} + +void Gm861SerialInput(void) { + if (!Gm861Serial->available()) { return; } + + char buffer[256]; + uint32_t byte_counter = 0; + + // Use timeout to allow large serial reads within a window + uint32_t timeout = millis(); + while (millis() - 10 < timeout) { + if (Gm861Serial->available()) { + timeout = millis(); + buffer[byte_counter++] = Gm861Serial->read(); + if (byte_counter >= sizeof(buffer) -1) { break; } + } + } + buffer[byte_counter] = 0; // Add string terminating zero + + AddLogBuffer(LOG_LEVEL_DEBUG_MORE, (uint8_t*)buffer, byte_counter); + + if (0 == buffer[1]) { // Command result or Heartbeat + if (2 == buffer[0]) { // Command result + // 02 00 00 01 00 33 31 - Command acknowledge + // 02 00 00 01 01 23 10 - Command result (Zonebyte 96 - 0x60) + // 02 00 00 02 39 01 C1 4C - Command result (Zonebytes 42/43 - 0x2A) + if (Gm861.read) { + uint32_t result = buffer[4]; + if (2 == buffer[3]) { // Length + result += (buffer[5] << 8); + } + Gm861.read = false; + Response_P(S_JSON_COMMAND_INDEX_NVALUE, PSTR("GM861Zone"), Gm861.index, result); + MqttPublishPrefixTopicRulesProcess_P(RESULT_OR_STAT, PSTR("GM861Zone")); + } + } + else if (3 == buffer[0]) { // Heartbeat + // 03 00 00 01 00 33 31 - Heartbeat response + // 03 00 0A 30 33 32 31 35 36 33 38 34 30 - Scan response with zone byte 96 = 0x81 + Gm861.heartbeat = true; + } + } else { // Bar code + // 38 37 31 31 32 31 38 39 37 32 38 37 35 0D - Barcode 8711218972875 + RemoveControlCharacter(buffer); // Remove control character (0x00 .. 0x1F and 0x7F) + snprintf_P(Gm861.barcode, sizeof(Gm861.barcode) -3, PSTR("%s"), buffer); + if (strlen(buffer) > sizeof(Gm861.barcode) -3) { + strcat(Gm861.barcode, "..."); + } + ResponseTime_P(PSTR(",\"GM861\":\"%s\"}"), buffer); + MqttPublishTeleSensor(); + } +} + +/********************************************************************************************/ + +void Gm861Init(void) { + if (PinUsed(GPIO_GM861_RX) && PinUsed(GPIO_GM861_TX)) { + Gm861Serial = new TasmotaSerial(Pin(GPIO_GM861_RX), Pin(GPIO_GM861_TX), 1); + if (Gm861Serial->begin(9600)) { + if (Gm861Serial->hardwareSerial()) { + ClaimSerial(); + } + Gm861.barcode[0] = '0'; // No barcode yet + Gm861.state = GM861_STATE_INIT_OFFSET; +// AddLog(LOG_LEVEL_INFO, PSTR("GM8: Connected")); + } + } +} + +void Gm861StateMachine(void) { + /* + Power on + 14:25:04.219-025 DMP: 02 00 00 62 D6 00 20 00 00 0A 32 01 2C 00 87 3C 01 A1 1C 32 03 00 80 00 06 00 00 00 00 00 00 00 00 00 00 00 00 02 80 3C 00 00 00 06 00 00 39 01 05 64 0D 0D 0D 01 0D 01 04 80 09 04 80 05 04 80 01 04 80 01 08 04 80 08 04 80 08 04 80 08 04 80 08 01 80 00 00 00 04 80 01 01 00 00 00 00 04 80 00 00 03 00 01 00 30 FE + Default: setup code on + 12:12:18.672-024 DMP: 02 00 00 61 D6 00 20 00 00 0A 32 01 2C 00 87 3C 01 A1 1C 32 03 00 80 00 06 00 00 00 00 00 00 00 00 00 00 00 00 02 80 3C 00 00 00 06 00 00 39 01 05 64 0D 0D 0D 01 0D 01 04 80 09 04 80 05 04 80 01 04 80 01 08 04 80 08 04 80 08 04 80 08 04 80 08 01 80 00 00 00 04 80 01 01 00 00 00 00 04 80 00 00 03 00 01 00 30 FE + Output: + 14:37:45.129-027 DMP: 02 00 00 62 D6 00 20 01 00 0A 32 01 2C 00 87 3C 01 A1 1C 32 03 00 80 00 06 00 00 00 00 00 00 00 00 00 00 00 00 02 80 3C 00 00 00 06 00 00 39 01 05 64 0D 0D 0D 01 0D 01 04 80 09 04 80 05 04 80 01 04 80 01 08 04 80 08 04 80 08 04 80 08 04 80 08 01 80 00 00 00 04 80 01 01 00 00 00 00 04 80 00 00 03 00 01 00 20 91 + Serial output: + 14:39:04.887-027 DMP: 02 00 00 62 D6 00 20 01 00 0A 32 01 2C 00 87 3C 01 A0 1C 32 03 00 80 00 06 00 00 00 00 00 00 00 00 00 00 00 00 02 80 3C 00 00 00 06 00 00 39 01 05 64 0D 0D 0D 01 0D 01 04 80 09 04 80 05 04 80 01 04 80 01 08 04 80 08 04 80 08 04 80 08 04 80 08 01 80 00 00 00 04 80 01 01 00 00 00 00 04 80 00 00 03 00 01 00 2D 9E + */ + if (!Gm861.state) { return; } + + switch (Gm861.state) { + case GM861_STATE_RESET: + Gm861SetZone(0xD9, 0x50); // Factory reset + Gm861.state = GM861_STATE_SETUP_CODE_ON +7; // Add time for reset to complete + break; + case GM861_STATE_SETUP_CODE_ON: + Gm861SetZone(0x00, 0xD6); // Set LED on, Mute off, Normal lighting, Normal brightness, Continuous mode (Default: setup code on) + break; + case GM861_STATE_OUTPUT: + Gm861SetZone(0x03, 0x01); // Enable output (Output) + break; + case GM861_STATE_SERIAL_OUTPUT: + Gm861SetZone(0x0D, 0xA0); // Enable serial port output (Serial Output) + break; + case GM861_STATE_DUMP: + Gm861Send(7, 1, 0, 0x62); // Dump zone bytes 0 to 97 + AddLog(LOG_LEVEL_INFO, PSTR("GM8: Initialized")); + break; + } + Gm861.state--; +} + +/*********************************************************************************************\ + * Commands +\*********************************************************************************************/ + +const char kGm861Commands[] PROGMEM = "GM861|" // Prefix + "Zone|Reset|Dump"; + +void (* const Gm861Command[])(void) PROGMEM = { + &CmndGm816Zone, &CmndGm816Reset, &CmndGm816Dump }; + +void CmndGm816Zone(void) { + // GM861Zone42 - Read baudrate + // GM861Zone0 0xD6 - Set LED on, Mute off, Normal lighting, Normal brightness, Continuous mode + if ((XdrvMailbox.index >= 0x00) && (XdrvMailbox.index <= 0xD9)) { + if ((XdrvMailbox.payload >= 0x00) && (XdrvMailbox.payload <= 0x09C4)) { + Gm861SetZone(XdrvMailbox.index, XdrvMailbox.payload); + ResponseCmndIdxNumber(XdrvMailbox.payload); + } else { + Gm861GetZone(XdrvMailbox.index); + ResponseClear(); + } + } +} + +void CmndGm816Reset(void) { + // GM861Reset 1 - Do factory reset and inititalize for serial comms + if (1 == XdrvMailbox.payload) { + Gm861.state = GM861_STATE_RESET; + ResponseCmndDone(); + } +} + +void CmndGm816Dump(void) { + // GM861Dump - Dump zone bytes 0 to 97. Needs logging level 4 + Gm861Send(7, 1, 0, 0x62); // Dump zone bytes 0 to 97 + ResponseCmndDone(); +} + +/*********************************************************************************************\ + * Presentation +\*********************************************************************************************/ + +#ifdef USE_WEBSERVER +void Gm861Show(void) { + WSContentSend_PD(PSTR("{s}GM816{m}%s{e}"), Gm861.barcode); +} +#endif // USE_WEBSERVER + +/*********************************************************************************************\ + Interface +\*********************************************************************************************/ + +bool Xsns107(uint32_t function) { + bool result = false; + + if (FUNC_INIT == function) { + Gm861Init(); + } + else if (Gm861Serial) { + switch (function) { + case FUNC_LOOP: + case FUNC_SLEEP_LOOP: + Gm861SerialInput(); + break; + case FUNC_EVERY_250_MSECOND: + Gm861StateMachine(); + break; +#ifdef USE_WEBSERVER + case FUNC_WEB_SENSOR: + Gm861Show(); + break; +#endif // USE_WEBSERVER + case FUNC_COMMAND: + result = DecodeCommand(kGm861Commands, Gm861Command); + break; + } + } + return result; +} + +#endif // USE_GM861 From 08ce63863e6e4a36a4c2e15e791f7765d76d32b4 Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Fri, 5 May 2023 17:09:24 +0200 Subject: [PATCH 067/289] Fix CONFIG_BT_NIMBLE_NVS_PERSIST value unused https://github.com/h2zero/NimBLE-Arduino/pull/520 --- .../src/nimble/esp_port/port/include/esp_nimble_cfg.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/libesp32_div/NimBLE-Arduino/src/nimble/esp_port/port/include/esp_nimble_cfg.h b/lib/libesp32_div/NimBLE-Arduino/src/nimble/esp_port/port/include/esp_nimble_cfg.h index fb00ae115..3b1e4e3ae 100644 --- a/lib/libesp32_div/NimBLE-Arduino/src/nimble/esp_port/port/include/esp_nimble_cfg.h +++ b/lib/libesp32_div/NimBLE-Arduino/src/nimble/esp_port/port/include/esp_nimble_cfg.h @@ -686,7 +686,7 @@ #ifndef MYNEWT_VAL_BLE_STORE_CONFIG_PERSIST #ifdef CONFIG_BT_NIMBLE_NVS_PERSIST -#define MYNEWT_VAL_BLE_STORE_CONFIG_PERSIST (1) +#define MYNEWT_VAL_BLE_STORE_CONFIG_PERSIST (CONFIG_BT_NIMBLE_NVS_PERSIST) #else #define MYNEWT_VAL_BLE_STORE_CONFIG_PERSIST (0) #endif From 7612dfabcfbee69bd056e4312139db057085d6c0 Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Fri, 5 May 2023 17:41:18 +0200 Subject: [PATCH 068/289] Remove coffee --- FIRMWARE.md | 1 - README.md | 2 -- 2 files changed, 3 deletions(-) diff --git a/FIRMWARE.md b/FIRMWARE.md index c1c701be7..e7d042c39 100644 --- a/FIRMWARE.md +++ b/FIRMWARE.md @@ -13,7 +13,6 @@ If you like **Tasmota**, give it a star, or fork it and contribute! [![GitHub stars](https://img.shields.io/github/stars/arendst/Tasmota.svg?style=social&label=Star)](https://github.com/arendst/Tasmota/stargazers) [![GitHub forks](https://img.shields.io/github/forks/arendst/Tasmota.svg?style=social&label=Fork)](https://github.com/arendst/Tasmota/network) [![donate](https://img.shields.io/badge/donate-PayPal-blue.svg)](https://paypal.me/tasmota) -[![donate](https://img.shields.io/badge/donate-buy%20me%20a%20coffee-yellow.svg)](https://www.buymeacoffee.com/tasmota) See [CHANGELOG.md](https://github.com/arendst/Tasmota/blob/development/tasmota/CHANGELOG.md) for changes since last release. diff --git a/README.md b/README.md index efbfc44a9..f3039bda5 100644 --- a/README.md +++ b/README.md @@ -24,7 +24,6 @@ If you like **Tasmota**, give it a star, or fork it and contribute! [![GitHub stars](https://img.shields.io/github/stars/arendst/Tasmota.svg?style=social&label=Star)](https://github.com/arendst/Tasmota/stargazers) [![GitHub forks](https://img.shields.io/github/forks/arendst/Tasmota.svg?style=social&label=Fork)](https://github.com/arendst/Tasmota/network) [![donate](https://img.shields.io/badge/donate-PayPal-blue.svg)](https://paypal.me/tasmota) -[![donate](https://img.shields.io/badge/donate-buy%20me%20a%20coffee-yellow.svg)](https://www.buymeacoffee.com/tasmota) See [RELEASENOTES.md](https://github.com/arendst/Tasmota/blob/master/RELEASENOTES.md) for release information. @@ -126,7 +125,6 @@ You can contribute to Tasmota by - Contributing missing [documentation](https://tasmota.github.io/docs) for features and devices [![donate](https://img.shields.io/badge/donate-PayPal-blue.svg)](https://paypal.me/tasmota) -[![donate](https://img.shields.io/badge/donate-buy%20me%20a%20coffee-yellow.svg)](https://www.buymeacoffee.com/tasmota) ## Credits From 8b2539a35a26af2744a0225ff7ad3fac27d8d0a1 Mon Sep 17 00:00:00 2001 From: s-hadinger <49731213+s-hadinger@users.noreply.github.com> Date: Sat, 6 May 2023 12:18:12 +0200 Subject: [PATCH 069/289] Partition_Manager.tapp fixed (#18588) --- CHANGELOG.md | 1 + tasmota/berry/modules/Partition_Manager.tapp | Bin 17087 -> 17089 bytes .../modules/Partition_Manager/partition.bec | Bin 16636 -> 16638 bytes tasmota/berry/modules/partition.be | 58 +++++++++--------- 4 files changed, 30 insertions(+), 29 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6532b2f1c..0184f9c4e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -18,6 +18,7 @@ All notable changes to this project will be documented in this file. ### Changed ### Fixed +- Partition_Manager.tapp fixed ### Removed diff --git a/tasmota/berry/modules/Partition_Manager.tapp b/tasmota/berry/modules/Partition_Manager.tapp index 282490659078c0c4c69a6d99bed5c0a4ecc6c005..71f0a0e3fbe93f89953faa3acfca4081179cb476 100644 GIT binary patch delta 723 zcmY*XL1+^}6n#58yF0s?jZ2(Lj7zK_wA7?tA|m8agSUFF*=EUvCCuPwLlPA}cQIUl(& z-%T#u(((4N$~nWmhrOybf5YZb8Wp@LAzFZp!9-$M;=F{{Nr!I4Ao_F;Z8|eUbR`11 zr|4dgm~OzqMFOxD9Y2Q#t$c%H@YyOGS)ak7ogVE{all5oKe_A16~Q5?wQdgP?J`Sr z$1?B?xC<0x6XghYkfg&gTB#Awz#sUpt#x`nnLS6d0Nx^)Bp?kb@{!5%Gg`+PupMyH z1ep*_96+^flp>pzsIC&J>t2!S#e}(Gg`?b|wQimWE64{icY_)uUB`0=q|t(EP7%N> zK)kU{)rAOSaFu+^ih}frtOmw69P~b(Y^}Q-;~8DiOou*ErWMsL3R+ zsS#x$NF1DsET-yaPE{aEyD3e@VVdrEU*yA@shRfEUlU&O+OBo;Dbq5F9z zlQr0y&fulGQyBe+(-ZGUZWw&MFqIqST{Ev*Hev)6>Yuyog57Q i*Px+m|IE!AtZa@9`kx(p?ZyPxw(C7>oVA^X9>71XE19nV delta 705 zcmY*X&ubG=5dPlV*|#sr+wx4-5Nc=m*x3|i&bK&XY!)Pyj@?q}L&t)JJA62a1xVzce?A*D%xVm<8CCtGo@rO)a ze?LcxaIbTJEm?3^LKi4;S_5hWI)bDa4xKho-E{1R0yN-vRqKho2vm9q)=@|lX zJmh*NU&ewpZ8@Wl?wt5rWb{L&|L(u^p`6;k6|RaU4=8YTK5U8 znRS`{Ha3}G2kZ}G;Z^E{*)Hp*^ec536FHt~NTznwcE~gd_B#I`p5er=Tw(iAl?Y_x zPZKAxlZKfu>xW9-m)boI%rnGvoC~F-hJ|h)ZKmL6I+$TpI-bc;FZ2$lO diff --git a/tasmota/berry/modules/Partition_Manager/partition.bec b/tasmota/berry/modules/Partition_Manager/partition.bec index 30064881a02ce6af29da439b9829443844b18f01..c7278f0759377ea2a343cc0c379aa2f803e3e600 100644 GIT binary patch delta 574 zcmYjPv1;5v5Pcerq?No@mh(D@i#S}E5RNN_A=rgKAf*BqP@yWM2?WxZuwc7Oah(sh z0aqy!FkIutfqXzJe?n?QY)BV$8LeD+VVT`|yKml`-G8S+cN$zymL@C6c{Js7j z9n19>{yOF(a4R&CPqF%X|5IQubbk5k5u zm#gO8dQ&8FWuV)~?IdX@(@3Ogm-o^{GGJVSr*%a3Al$GssPR=NT}h~yyR%ezSw)-0 z=R_CFII|TpZvKdh7+O?lucEJ)g`_LQy`0s>*1OU04(9pw@EcY))9J>L3-`{WVfAJI L=fhuldwBjIrm|~L delta 576 zcmYjPzfaph7=3sC?tDqE=m<_^1q2H%63S@7P=@>g9X)jL;H6SJwGvB&P69TDY>D^> zx-bAj%EH3Hz|PLdRtX73jL7ciw5~E(-`)4VAMd?$aVp+V#my#Z!r}L$Z5Iu@Aj$&tQfTXoa+M=*lGXGd_DUUd z=MML^ft-VP%)dZ0m1qts4eO8>kgNyBgKXyDa*Zy_?K1AXt#A`D9(fVQeL`=<@j!lv z`>-|(LYqj|w49r>K7#wo{g)qk@Qo5~3>{}6=bslKF-VscRvDou5AFQe09#D4C>yDi zlsK4t*+s!F23TQM#;;VYm@U7D57ACZx&zs8edz9O!Cq(?_XBK9LmMa5iq3R1nkwTG z7|LFmfP!HHWwBN>>i=N&w7c7?^Nqc8RiA%-zOQR0!@>C< D7+rBl diff --git a/tasmota/berry/modules/partition.be b/tasmota/berry/modules/partition.be index e039f3723..8652f238c 100644 --- a/tasmota/berry/modules/partition.be +++ b/tasmota/berry/modules/partition.be @@ -26,7 +26,7 @@ class Partition_info var type var subtype var start - var size + var sz var label var flags @@ -46,7 +46,7 @@ class Partition_info self.type = 0 self.subtype = 0 self.start = 0 - self.size = 0 + self.sz = 0 self.label = '' self.flags = 0 return @@ -59,7 +59,7 @@ class Partition_info self.type = raw.get(2,1) self.subtype = raw.get(3,1) self.start = raw.get(4,4) - self.size = raw.get(8,4) + self.sz = raw.get(8,4) self.label = self.remove_trailing_zeroes(raw[12..27]).asstring() self.flags = raw.get(28,4) @@ -149,7 +149,7 @@ class Partition_info return string.format("", self.type, type_s, self.subtype, subtype_s, - self.start, self.size, + self.start, self.sz, self.label, self.flags) end @@ -160,7 +160,7 @@ class Partition_info b.add(self.type, 1) b.add(self.subtype, 1) b.add(self.start, 4) - b.add(self.size, 4) + b.add(self.sz, 4) var label = bytes().fromstring(self.label) label.resize(16) b = b + label @@ -525,12 +525,12 @@ class Partition_manager_UI webserver.content_send(string.format(" %s%s ", slot.start / 0x1000, slot.label, active ? " (active)" : "")) - webserver.content_send(string.format("

Partition size: %i KB

", slot.size / 1024)) + webserver.content_send(string.format("

Partition size: %i KB

", slot.sz / 1024)) var used = slot.get_image_size() - if used > slot.size slot.used = -1 end # we may have a leftover of a previous firmware but the slot shrank - in this case the slot is inknown + if used > slot.sz slot.used = -1 end # we may have a leftover of a previous firmware but the slot shrank - in this case the slot is inknown if used >= 0 webserver.content_send(string.format("

Used: %i KB

", used / 1024)) - webserver.content_send(string.format("

Free: %i KB

", (slot.size - used) / 1024)) + webserver.content_send(string.format("

Free: %i KB

", (slot.sz - used) / 1024)) else webserver.content_send("

Used: unknown

") webserver.content_send("

Free: unknown

") @@ -567,10 +567,10 @@ class Partition_manager_UI webserver.content_send(string.format("
 filesystem ", slot.start / 0x1000)) - webserver.content_send(string.format("

Partition size: %i KB

", slot.size / 1024)) + webserver.content_send(string.format("

Partition size: %i KB

", slot.sz / 1024)) if free_mem != nil - webserver.content_send(string.format("

Max size: %i KB

", (slot.size + free_mem) / 1024)) + webserver.content_send(string.format("

Max size: %i KB

", (slot.sz + free_mem) / 1024)) webserver.content_send(string.format("

Unallocated: %i KB

", free_mem / 1024)) end @@ -578,7 +578,7 @@ class Partition_manager_UI webserver.content_send("

New size: (multiple of 16 KB)

") webserver.content_send("
") - webserver.content_send(string.format("", (slot.size + free_mem) / 1024, ((slot.size + free_mem) / 1024 / 16)*16)) + webserver.content_send(string.format("", (slot.sz + free_mem) / 1024, ((slot.sz + free_mem) / 1024 / 16)*16)) webserver.content_send("

") webserver.content_send("

") end @@ -598,7 +598,7 @@ class Partition_manager_UI self.page_show_partition(slot, false, nil, nil) elif slot.is_spiffs() var flash_size = tasmota.memory()['flash'] * 1024 - var used_size = (slot.start + slot.size) + var used_size = (slot.start + slot.sz) self.page_show_spiffs(slot, slot == p.slots[-1] ? flash_size - used_size : nil) end end @@ -615,11 +615,11 @@ class Partition_manager_UI else # we can proceed var app0 = p.get_ota_slot(0) - var app0_size_kb = ((app0.size / 1024 + 63) / 64) * 64 # rounded to upper 64kb + var app0_size_kb = ((app0.sz / 1024 + 63) / 64) * 64 # rounded to upper 64kb var app0_used_kb = (((app0.get_image_size()) / 1024 / 64) + 1) * 64 var app1 = p.get_ota_slot(1) - var app1_size_kb = ((app1.size / 1024 + 63) / 64) * 64 # rounded to upper 64kb + var app1_size_kb = ((app1.sz / 1024 + 63) / 64) * 64 # rounded to upper 64kb # var app1_used_kb = (((app1.get_image_size()) / 1024 / 64) + 1) * 64 # we don't actually need it var flash_size_kb = tasmota.memory()['flash'] @@ -723,10 +723,10 @@ class Partition_manager_UI if spiffs_size_kb < 0 || spiffs_size_kb > spiffs_max_size raise "value_error", string.format("Invalid fs_size %i, should be between 0 and %i", spiffs_size_kb, spiffs_max_size) end - if spiffs_size_kb == spiffs_slot.size/1024 raise "value_error", "FS size unchanged, abort" end + if spiffs_size_kb == spiffs_slot.sz/1024 raise "value_error", "FS size unchanged, abort" end #- write the new SPIFFS partition size -# - spiffs_slot.size = spiffs_size_kb * 1024 + spiffs_slot.sz = spiffs_size_kb * 1024 p.save() p.invalidate_spiffs() # erase SPIFFS or data is corrupt @@ -750,7 +750,7 @@ class Partition_manager_UI if p.ota_max() != 1 raise "internal_error", "There are more than 2 OTA partition, abort" end - var app0_size_kb = ((app0.size / 1024 + 63) / 64) * 64 # rounded to upper 64kb + var app0_size_kb = ((app0.sz / 1024 + 63) / 64) * 64 # rounded to upper 64kb var app0_used_kb = (((app0.get_image_size()) / 1024 / 64) + 1) * 64 var flash_size_kb = tasmota.memory()['flash'] @@ -762,13 +762,13 @@ class Partition_manager_UI #- all good, proceed -# # resize app0 - app0.size = part_size_kb * 1024 + app0.sz = part_size_kb * 1024 # change app1 - app1.start = app0.start + app0.size - app1.size = part_size_kb * 1024 + app1.start = app0.start + app0.sz + app1.sz = part_size_kb * 1024 # change spiffs - spiffs.start = app1.start + app1.size - spiffs.size = flash_size_kb * 1024 - spiffs.start + spiffs.start = app1.start + app1.sz + spiffs.sz = flash_size_kb * 1024 - spiffs.start p.save() p.invalidate_spiffs() # erase SPIFFS or data is corrupt @@ -792,9 +792,9 @@ class Partition_manager_UI if p.ota_max() != 1 raise "internal_error", "There are more than 2 OTA partition, abort" end - var app0_size_kb = ((app0.size / 1024 + 63) / 64) * 64 # rounded to upper 64kb + var app0_size_kb = ((app0.sz / 1024 + 63) / 64) * 64 # rounded to upper 64kb var app0_used_kb = (((app0.get_image_size()) / 1024 / 64) + 1) * 64 - var app1_size_kb = ((app1.size / 1024 + 63) / 64) * 64 # rounded to upper 64kb + var app1_size_kb = ((app1.sz / 1024 + 63) / 64) * 64 # rounded to upper 64kb var flash_size_kb = tasmota.memory()['flash'] var part0_size_kb = int(webserver.arg("app0")) @@ -809,13 +809,13 @@ class Partition_manager_UI #- all good, proceed -# # resize app0 - app0.size = part0_size_kb * 1024 + app0.sz = part0_size_kb * 1024 # change app1 - app1.start = app0.start + app0.size - app1.size = part1_size_kb * 1024 + app1.start = app0.start + app0.sz + app1.sz = part1_size_kb * 1024 # change spiffs - spiffs.start = app1.start + app1.size - spiffs.size = flash_size_kb * 1024 - spiffs.start + spiffs.start = app1.start + app1.sz + spiffs.sz = flash_size_kb * 1024 - spiffs.start p.save() p.invalidate_spiffs() # erase SPIFFS or data is corrupt From 25e55ae0732a2271783e1e3e71b057ca8c9f0713 Mon Sep 17 00:00:00 2001 From: stefanbode Date: Sat, 6 May 2023 15:46:29 +0200 Subject: [PATCH 070/289] #18548 fix shuttersetup (#18586) - code optimization - shuttersetup reluctant on relay to energy measure relation --- .../xdrv_27_esp32_shutter.ino | 105 ++++++++---------- 1 file changed, 46 insertions(+), 59 deletions(-) diff --git a/tasmota/tasmota_xdrv_driver/xdrv_27_esp32_shutter.ino b/tasmota/tasmota_xdrv_driver/xdrv_27_esp32_shutter.ino index 83b623cf5..eb5569e4f 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_27_esp32_shutter.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_27_esp32_shutter.ino @@ -50,6 +50,10 @@ #undef MAX_SHUTTERS_ESP32 #define MAX_SHUTTERS_ESP32 16 +// Define Std Text Strings +#define D_ERROR_FILESYSTEM_NOT_READY "SHT: ERROR File system not enabled" +#define D_ERROR_FILE_NOT_FOUND "SHT: ERROR File system not ready or file not found" + // const uint32_t SHUTTER_VERSION = 0x01010100; // Latest driver version (See settings deltas below) @@ -271,12 +275,12 @@ void ShutterSettingsDelta(void) { } } -/* - if (ShutterSettings.version < 0x01010101) { - AddLog(LOG_LEVEL_INFO, PSTR("SHT: Update old version restore")); - } -*/ + // if (ShutterSettings.version < 0x01010101) { + // AddLog(LOG_LEVEL_INFO, PSTR("SHT: Update old version restore")); + + // } + // Set current version and save settings ShutterSettings.version = SHUTTER_VERSION; ShutterSettingsSave(); @@ -291,12 +295,10 @@ void ShutterSettingsLoad(bool erase) { // Try to load file /.drvset027 char filename[20]; - // Use for sensors: -// snprintf_P(filename, sizeof(filename), PSTR(TASM_FILE_SENSOR), XSNS_27); // Use for drivers: snprintf_P(filename, sizeof(filename), PSTR(TASM_FILE_DRIVER), XDRV_27); - AddLog(LOG_LEVEL_INFO, PSTR("SHUTTER: About to load settings from file %s"), filename); + AddLog(LOG_LEVEL_INFO, PSTR("SHT: About to load settings from file %s"), filename); #ifdef USE_UFILESYS if (erase) { @@ -307,11 +309,11 @@ void ShutterSettingsLoad(bool erase) { ShutterSettingsDelta(); } else { // File system not ready: No flash space reserved for file system - AddLog(LOG_LEVEL_INFO, PSTR("DRV: ERROR File system not ready or file not found")); + AddLog(LOG_LEVEL_INFO, PSTR(D_ERROR_FILE_NOT_FOUND)); } #else - AddLog(LOG_LEVEL_INFO, PSTR("DRV: ERROR File system not enabled")); + AddLog(LOG_LEVEL_INFO, D_ERROR_FILESYSTEM_NOT_READY); #endif // USE_UFILESYS } @@ -324,20 +326,18 @@ void ShutterSettingsSave(void) { ShutterSettings.crc32 = crc32; char filename[20]; - // Use for sensors: -// snprintf_P(filename, sizeof(filename), PSTR(TASM_FILE_SENSOR), XSNS_27); // Use for drivers: snprintf_P(filename, sizeof(filename), PSTR(TASM_FILE_DRIVER), XDRV_27); - AddLog(LOG_LEVEL_INFO, PSTR("SHUTTER: About to save settings to file %s"), filename); + AddLog(LOG_LEVEL_INFO, PSTR("SHT: About to save settings to file %s"), filename); #ifdef USE_UFILESYS if (!TfsSaveFile(filename, (const uint8_t*)&ShutterSettings, sizeof(ShutterSettings))) { // File system not ready: No flash space reserved for file system - AddLog(LOG_LEVEL_INFO, PSTR("DRV: ERROR File system not ready or unable to save file")); + AddLog(LOG_LEVEL_INFO, D_ERROR_FILE_NOT_FOUND); } #else - AddLog(LOG_LEVEL_INFO, PSTR("SHUTTER: ERROR File system not enabled")); + AddLog(LOG_LEVEL_INFO, D_ERROR_FILESYSTEM_NOT_READY); #endif // USE_UFILESYS } } @@ -903,7 +903,7 @@ void ShutterUpdatePosition(void) XnrgCall(FUNC_ENERGY_EVERY_SECOND); // fency calculation with direction gives index 0 and 1 of the energy meter // stop if endpoint is reached - if (Energy->active_power[(1 - Shutter[i].direction ) / 2] < 1.0 && Shutter[i].time > 20){ + if (Energy->active_power[0]+Energy->active_power[1] < 1.0 && Shutter[i].time > 20){ ShutterGlobal.stopp_armed++; AddLog(LOG_LEVEL_INFO, PSTR("SHT: stopp_armed:%d"),ShutterGlobal.stopp_armed); if (ShutterGlobal.stopp_armed > 2) { @@ -1058,6 +1058,7 @@ int32_t ShutterCalculatePosition(uint32_t i) case SHT_TIME_UP_DOWN: case SHT_TIME_GARAGE: if (Shutter[i].tilt_config[2] > 0) { + // the tilt time is defined and therefore the tiltposition must be calculated if (Shutter[i].time <= Shutter[i].venetian_delay+Shutter[i].motordelay) { Shutter[i].tilt_real_pos = (Shutter[i].tilt_start_pos + ((Shutter[i].direction * (int16_t)(Shutter[i].time - tmin(Shutter[i].motordelay, Shutter[i].time)) * (Shutter[i].tilt_config[1]-Shutter[i].tilt_config[0])) / Shutter[i].tilt_config[2])); } else { @@ -1114,53 +1115,39 @@ void ShutterRelayChanged(void) if (powerstate_local > 0) { Shutter[i].tiltmoving = 0; } - switch (ShutterGlobal.position_mode) { - // enum Shutterposition_mode {SHT_TIME, SHT_TIME_UP_DOWN, SHT_TIME_GARAGE, SHT_COUNTER, SHT_PWM_VALUE, SHT_PWM_TIME,}; - case SHT_TIME_UP_DOWN: - case SHT_COUNTER: - case SHT_PWM_VALUE: - case SHT_PWM_TIME: - //AddLog(LOG_LEVEL_DEBUG_MORE, PSTR("SHT: power off manual change")); - ShutterPowerOff(i); - switch (powerstate_local) { - case 1: - ShutterStartInit(i, 1, Shutter[i].open_max); - break; - case 3: - ShutterStartInit(i, -1, 0); - break; - default: - //AddLog(LOG_LEVEL_DEBUG_MORE, PSTR("SHT: Shtr%d Switch OFF motor."),i); + switch (ShutterGlobal.position_mode) { + // enum Shutterposition_mode {SHT_TIME, SHT_TIME_UP_DOWN, SHT_TIME_GARAGE, SHT_COUNTER, SHT_PWM_VALUE, SHT_PWM_TIME,}; + case SHT_TIME_UP_DOWN: + case SHT_COUNTER: + case SHT_PWM_VALUE: + case SHT_PWM_TIME: + case SHT_TIME: { + ShutterPowerOff(i); + // powerstate_local == 0 => direction=0, stop + // powerstate_local == 1 => direction=1, target=Shutter[i].open_max + // powerstate_local == 2 => direction=-1, target=0 // only happen on SHT_TIME + // powerstate_local == 3 => direction=-1, target=0 // only happen if NOT SHT_TIME + int direction = (powerstate_local == 0) ? 0 : (powerstate_local == 1) ? 1 : -1; + int target = (powerstate_local == 1) ? Shutter[i].open_max : 0; + + if (direction != 0) { + ShutterStartInit(i, direction, target); + } else { Shutter[i].target_position = Shutter[i].real_position; Shutter[i].last_stop_time = millis(); } - break; - case SHT_TIME: - switch (powerstate_local) { - case 1: - ShutterStartInit(i, 1, Shutter[i].open_max); - break; - case 2: - ShutterStartInit(i, -1, 0); - break; - default: - //AddLog(LOG_LEVEL_DEBUG_MORE, PSTR("SHT: Shtr%d Switch OFF motor."),i+1); - Shutter[i].target_position = Shutter[i].real_position; - Shutter[i].last_stop_time = millis(); + break; } - break; - case SHT_TIME_GARAGE: - switch (powerstate_local) { - case 1: - ShutterStartInit(i, Shutter[i].lastdirection*-1 , Shutter[i].lastdirection == 1 ? 0 : Shutter[i].open_max); - AddLog(LOG_LEVEL_DEBUG_MORE, PSTR("SHT: Shtr%d Garage. NewTarget %d"), i, Shutter[i].target_position); - break; - default: - Shutter[i].target_position = Shutter[i].real_position; - } - - - } // switch (ShutterGlobal.position_mode) + case SHT_TIME_GARAGE: + switch (powerstate_local) { + case 1: + ShutterStartInit(i, Shutter[i].lastdirection * -1, Shutter[i].lastdirection == 1 ? 0 : Shutter[i].open_max); + AddLog(LOG_LEVEL_DEBUG_MORE, PSTR("SHT: Shtr%d Garage. NewTarget %d"), i, Shutter[i].target_position); + break; + default: + Shutter[i].target_position = Shutter[i].real_position; + } + } AddLog(LOG_LEVEL_DEBUG_MORE, PSTR("SHT: Shtr%d, Target %ld, Power: %d, tiltmv: %d"), i+1, Shutter[i].target_position, powerstate_local,Shutter[i].tiltmoving); } // if (manual_relays_changed) } // for (uint32_t i = 0; i < TasmotaGlobal.shutters_present; i++) From b9464a21a8eb064264888fe2c5cd1c689d932115 Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Sat, 6 May 2023 17:18:52 +0200 Subject: [PATCH 071/289] GM861 add support for AIM --- .../tasmota_xsns_sensor/xsns_107_gm861.ino | 49 ++++++++++++++----- 1 file changed, 36 insertions(+), 13 deletions(-) diff --git a/tasmota/tasmota_xsns_sensor/xsns_107_gm861.ino b/tasmota/tasmota_xsns_sensor/xsns_107_gm861.ino index 23c0b37e2..ed8564e6c 100644 --- a/tasmota/tasmota_xsns_sensor/xsns_107_gm861.ino +++ b/tasmota/tasmota_xsns_sensor/xsns_107_gm861.ino @@ -22,6 +22,15 @@ * GM861 1D and 2D Bar Code Reader * * For background information see https://github.com/arendst/Tasmota/discussions/18399 + * + * Commands available: + * GM861Zone - Show zone byte state + * GM861Zone - Set zone byte to value + * GM861Zone5 20 - Set read interval to 2 seconds (default 10 = 0x0A) + * GM861Zone44 0x02 - Enable all barcodes using full area (default 5 = 0x05) + * GM861Save - Save changes in zone bytes to flash + * GM861Reset 1 - Reset to factory settings and re-init the scanner + * GM861Dump - Dump zone bytes 0 to 97 if logging level 4 \*********************************************************************************************/ #define XSNS_107 107 @@ -147,9 +156,8 @@ void Gm861GetZone(uint32_t address) { void Gm861SerialInput(void) { if (!Gm861Serial->available()) { return; } - char buffer[256]; + char buffer[272]; // Max 256 code characters and some control characters uint32_t byte_counter = 0; - // Use timeout to allow large serial reads within a window uint32_t timeout = millis(); while (millis() - 10 < timeout) { @@ -165,9 +173,9 @@ void Gm861SerialInput(void) { if (0 == buffer[1]) { // Command result or Heartbeat if (2 == buffer[0]) { // Command result - // 02 00 00 01 00 33 31 - Command acknowledge - // 02 00 00 01 01 23 10 - Command result (Zonebyte 96 - 0x60) - // 02 00 00 02 39 01 C1 4C - Command result (Zonebytes 42/43 - 0x2A) + // 02 00 00 01 00 33 31 - Command acknowledge + // 02 00 00 01 01 23 10 - Command result (Zonebyte 96 - 0x60) + // 02 00 00 02 39 01 C1 4C - Command result (Zonebytes 42/43 - 0x2A) if (Gm861.read) { uint32_t result = buffer[4]; if (2 == buffer[3]) { // Length @@ -179,18 +187,27 @@ void Gm861SerialInput(void) { } } else if (3 == buffer[0]) { // Heartbeat - // 03 00 00 01 00 33 31 - Heartbeat response - // 03 00 0A 30 33 32 31 35 36 33 38 34 30 - Scan response with zone byte 96 = 0x81 + // 03 00 00 01 00 33 31 - Heartbeat response + // 03 00 0A 30 33 32 31 35 36 33 38 34 30 - Scan response with zone byte 96 = 0x81 Gm861.heartbeat = true; } } else { // Bar code - // 38 37 31 31 32 31 38 39 37 32 38 37 35 0D - Barcode 8711218972875 + // 38 37 31 31 32 31 38 39 37 32 38 37 35 0D - Barcode 8711218972875 + // 5D 45 30 38 37 31 31 32 31 38 39 37 32 38 37 35 0D - AIM ]E0, Barcode 8711218972875 RemoveControlCharacter(buffer); // Remove control character (0x00 .. 0x1F and 0x7F) - snprintf_P(Gm861.barcode, sizeof(Gm861.barcode) -3, PSTR("%s"), buffer); + uint32_t offset = 0; + if (']' == buffer[0]) { // AIM code + offset = 3; + } + snprintf_P(Gm861.barcode, sizeof(Gm861.barcode) -3, PSTR("%s"), buffer + offset); if (strlen(buffer) > sizeof(Gm861.barcode) -3) { strcat(Gm861.barcode, "..."); } - ResponseTime_P(PSTR(",\"GM861\":\"%s\"}"), buffer); + ResponseTime_P(PSTR(",\"GM861\":{")); + if (offset) { + ResponseAppend_P(PSTR("\"AIM\":\"%c%c\","), buffer[1], buffer[2]); + } + ResponseAppend_P(PSTR("\"Code\":\"%s\"}}"), buffer + offset); MqttPublishTeleSensor(); } } @@ -216,7 +233,7 @@ void Gm861StateMachine(void) { Power on 14:25:04.219-025 DMP: 02 00 00 62 D6 00 20 00 00 0A 32 01 2C 00 87 3C 01 A1 1C 32 03 00 80 00 06 00 00 00 00 00 00 00 00 00 00 00 00 02 80 3C 00 00 00 06 00 00 39 01 05 64 0D 0D 0D 01 0D 01 04 80 09 04 80 05 04 80 01 04 80 01 08 04 80 08 04 80 08 04 80 08 04 80 08 01 80 00 00 00 04 80 01 01 00 00 00 00 04 80 00 00 03 00 01 00 30 FE Default: setup code on - 12:12:18.672-024 DMP: 02 00 00 61 D6 00 20 00 00 0A 32 01 2C 00 87 3C 01 A1 1C 32 03 00 80 00 06 00 00 00 00 00 00 00 00 00 00 00 00 02 80 3C 00 00 00 06 00 00 39 01 05 64 0D 0D 0D 01 0D 01 04 80 09 04 80 05 04 80 01 04 80 01 08 04 80 08 04 80 08 04 80 08 04 80 08 01 80 00 00 00 04 80 01 01 00 00 00 00 04 80 00 00 03 00 01 00 30 FE + 12:12:18.672-024 DMP: 02 00 00 62 D6 00 20 00 00 0A 32 01 2C 00 87 3C 01 A1 1C 32 03 00 80 00 06 00 00 00 00 00 00 00 00 00 00 00 00 02 80 3C 00 00 00 06 00 00 39 01 05 64 0D 0D 0D 01 0D 01 04 80 09 04 80 05 04 80 01 04 80 01 08 04 80 08 04 80 08 04 80 08 04 80 08 01 80 00 00 00 04 80 01 01 00 00 00 00 04 80 00 00 03 00 01 00 30 FE Output: 14:37:45.129-027 DMP: 02 00 00 62 D6 00 20 01 00 0A 32 01 2C 00 87 3C 01 A1 1C 32 03 00 80 00 06 00 00 00 00 00 00 00 00 00 00 00 00 02 80 3C 00 00 00 06 00 00 39 01 05 64 0D 0D 0D 01 0D 01 04 80 09 04 80 05 04 80 01 04 80 01 08 04 80 08 04 80 08 04 80 08 04 80 08 01 80 00 00 00 04 80 01 01 00 00 00 00 04 80 00 00 03 00 01 00 20 91 Serial output: @@ -251,10 +268,10 @@ void Gm861StateMachine(void) { \*********************************************************************************************/ const char kGm861Commands[] PROGMEM = "GM861|" // Prefix - "Zone|Reset|Dump"; + "Zone|Save|Reset|Dump"; void (* const Gm861Command[])(void) PROGMEM = { - &CmndGm816Zone, &CmndGm816Reset, &CmndGm816Dump }; + &CmndGm816Zone, &CmndGm816Save, &CmndGm816Reset, &CmndGm816Dump }; void CmndGm816Zone(void) { // GM861Zone42 - Read baudrate @@ -270,6 +287,12 @@ void CmndGm816Zone(void) { } } +void CmndGm816Save(void) { + // GM861Save - Save zone bytes to flash + Gm861Send(9, 1, 0, 0); // Save to flash + ResponseCmndDone(); +} + void CmndGm816Reset(void) { // GM861Reset 1 - Do factory reset and inititalize for serial comms if (1 == XdrvMailbox.payload) { From e9d1e8c7250d89a24ade0c42a64731d6c492bbb2 Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Sat, 6 May 2023 18:09:11 +0200 Subject: [PATCH 072/289] Change command FileUpload binary index --- CHANGELOG.md | 1 + RELEASENOTES.md | 1 + tasmota/tasmota_support/support_command.ino | 2 +- tasmota/tasmota_xdrv_driver/xdrv_02_1_mqtt_file.ino | 2 +- tasmota/tasmota_xsns_sensor/xsns_107_gm861.ino | 1 + tools/mqtt-file/upload-ota.py | 2 +- tools/mqtt-file/upload-settings.py | 2 +- 7 files changed, 7 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0184f9c4e..5f7f4d2f1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,6 +14,7 @@ All notable changes to this project will be documented in this file. - Support for GM861 1D and 2D bar code reader (#18399) ### Breaking Changed +- Change command ``FileUpload`` index binary data detection from >199 to >299 ### Changed diff --git a/RELEASENOTES.md b/RELEASENOTES.md index 4d651e25a..464e0acb6 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -124,6 +124,7 @@ The latter links can be used for OTA upgrades too like ``OtaUrl https://ota.tasm - Berry `tcpclientasync` class for non-blocking TCP client ### Breaking Changed +- Change command ``FileUpload`` index binary data detection from >199 to >299 ### Changed - ESP32 Framework (Core) from v2.0.7 to v2.0.8 diff --git a/tasmota/tasmota_support/support_command.ino b/tasmota/tasmota_support/support_command.ino index a5926b353..c19314725 100644 --- a/tasmota/tasmota_support/support_command.ino +++ b/tasmota/tasmota_support/support_command.ino @@ -408,7 +408,7 @@ void CommandHandler(char* topicBuf, char* dataBuf, uint32_t data_len) { } type[i] = '\0'; - bool binary_data = (index > 199); // Suppose binary data on topic index > 199 + bool binary_data = (index > 299); // Suppose binary data on topic index > 299 if (!binary_data) { bool keep_spaces = ((strstr_P(type, PSTR("SERIALSEND")) != nullptr) && (index > 9)); // Do not skip leading spaces on (s)serialsend10 and up if (!keep_spaces) { diff --git a/tasmota/tasmota_xdrv_driver/xdrv_02_1_mqtt_file.ino b/tasmota/tasmota_xdrv_driver/xdrv_02_1_mqtt_file.ino index 7c6ddc63c..9f025caa0 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_02_1_mqtt_file.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_02_1_mqtt_file.ino @@ -210,7 +210,7 @@ void CmndFileUpload(void) { const char* base64_data = nullptr; uint32_t rcv_id = 0; - bool binary_data = (XdrvMailbox.index > 199); // Check for raw data + bool binary_data = (XdrvMailbox.index > 299); // Check for raw data if (!binary_data) { if (strlen(XdrvMailbox.data) > 8) { // Workaround exception if empty JSON like {} - Needs checks diff --git a/tasmota/tasmota_xsns_sensor/xsns_107_gm861.ino b/tasmota/tasmota_xsns_sensor/xsns_107_gm861.ino index ed8564e6c..fe904430f 100644 --- a/tasmota/tasmota_xsns_sensor/xsns_107_gm861.ino +++ b/tasmota/tasmota_xsns_sensor/xsns_107_gm861.ino @@ -28,6 +28,7 @@ * GM861Zone - Set zone byte to value * GM861Zone5 20 - Set read interval to 2 seconds (default 10 = 0x0A) * GM861Zone44 0x02 - Enable all barcodes using full area (default 5 = 0x05) + * GM861Zone208 0x80 - Enable AIM ID (default 0 = 0x00) * GM861Save - Save changes in zone bytes to flash * GM861Reset 1 - Reset to factory settings and re-init the scanner * GM861Dump - Dump zone bytes 0 to 97 if logging level 4 diff --git a/tools/mqtt-file/upload-ota.py b/tools/mqtt-file/upload-ota.py index e7cd22e77..0c09cf180 100644 --- a/tools/mqtt-file/upload-ota.py +++ b/tools/mqtt-file/upload-ota.py @@ -158,7 +158,7 @@ while Run_flag: # Message length used by Tasmota (FileTransferHeaderSize) client.publish(mypublish, "{\"Id\":"+str("%3d"%file_id)+",\"Data\":\""+base64_data+"\"}") else: - client.publish(mypublish+"201", chunk) + client.publish(mypublish+"301", chunk) file_pos = file_pos + file_chunk_size if file_pos % 102400 < file_chunk_size: progress = round((file_pos / 10240)) * 10 diff --git a/tools/mqtt-file/upload-settings.py b/tools/mqtt-file/upload-settings.py index fd8216d15..50c64d37c 100644 --- a/tools/mqtt-file/upload-settings.py +++ b/tools/mqtt-file/upload-settings.py @@ -156,7 +156,7 @@ while Run_flag: # Message length used by Tasmota (FileTransferHeaderSize) client.publish(mypublish, "{\"Id\":"+str("%3d"%file_id)+",\"Data\":\""+base64_data+"\"}") else: - client.publish(mypublish+"201", chunk) + client.publish(mypublish+"301", chunk) Ack_flag = True else: From 0287291cd9fe2be7938e31339dc46544b6b37747 Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Sun, 7 May 2023 14:11:29 +0200 Subject: [PATCH 073/289] Add GM861 optional AIMId decode --- tasmota/my_user_config.h | 1 + .../tasmota_xsns_sensor/xsns_107_gm861.ino | 33 +++++++++++++++++-- 2 files changed, 32 insertions(+), 2 deletions(-) diff --git a/tasmota/my_user_config.h b/tasmota/my_user_config.h index 3559b6303..24184ee2c 100644 --- a/tasmota/my_user_config.h +++ b/tasmota/my_user_config.h @@ -833,6 +833,7 @@ //#define USE_LD2410 // Add support for HLK-LD2410 24GHz smart wave motion sensor (+2k8 code) //#define USE_LOX_O2 // Add support for LuminOx LOX O2 Sensor (+0k8 code) //#define USE_GM861 // Add support for GM861 1D and 2D Bar Code Reader (+1k3 code) +// #define GM861_DECODE_AIM // Decode AIM-id (+0k3 code) // -- Power monitoring sensors -------------------- #define USE_ENERGY_SENSOR // Add support for Energy Monitors (+14k code) diff --git a/tasmota/tasmota_xsns_sensor/xsns_107_gm861.ino b/tasmota/tasmota_xsns_sensor/xsns_107_gm861.ino index fe904430f..564bdcf83 100644 --- a/tasmota/tasmota_xsns_sensor/xsns_107_gm861.ino +++ b/tasmota/tasmota_xsns_sensor/xsns_107_gm861.ino @@ -36,6 +36,8 @@ #define XSNS_107 107 +//#define GM861_DECODE_AIM // Decode AIM-id (+0k3 code) + /* #define GPIO_GM861_TX 304 #define D_SENSOR_GM861_TX "GM861 Tx" @@ -95,6 +97,23 @@ struct GDK { /*********************************************************************************************/ +#ifdef GM861_DECODE_AIM +const char kGm861AIMID[] PROGMEM = "A1C0E0E4F0G0H1I0I1L0M1Q1R0S0X0X1X4X5d1emzm"; +const char kGm861AIM[] PROGMEM = "Code39|Code128|EAN13|EAN8|Codabar|Code93|Code11|I2of5|ITF|PDF417|MSIPlessey|QRCode|S2of5|D2of5|CnPost|M2of5|ISBN|ISSN|DMCode|GS1|Aztec"; + +String Gm861AIMId2AIM(const char* aim_id) { + char aim_ids[sizeof(kGm861AIMID)]; + strcpy_P(aim_ids, kGm861AIMID); + int index = (strstr(aim_ids, aim_id) -aim_ids) /2; + if (index < 0) { // Unknown + strcpy(aim_ids, aim_id); // Return AIM-id + } else { + GetTextIndexed(aim_ids, sizeof(aim_ids), index, kGm861AIM); + } + return aim_ids; +} +#endif // GM861_DECODE_AIM + uint32_t Gm861Crc(uint8_t* ptr, uint32_t len) { // When no need for checking CRC, CRC byte can be filled in 0xAB 0xCD uint32_t crc = 0; @@ -197,16 +216,26 @@ void Gm861SerialInput(void) { // 5D 45 30 38 37 31 31 32 31 38 39 37 32 38 37 35 0D - AIM ]E0, Barcode 8711218972875 RemoveControlCharacter(buffer); // Remove control character (0x00 .. 0x1F and 0x7F) uint32_t offset = 0; - if (']' == buffer[0]) { // AIM code + char aim_id[3] = { 0 }; + if (']' == buffer[0]) { // AIM code ]xy offset = 3; + aim_id[0] = buffer[1]; + aim_id[1] = buffer[2]; } + + // Prepare GUI result snprintf_P(Gm861.barcode, sizeof(Gm861.barcode) -3, PSTR("%s"), buffer + offset); if (strlen(buffer) > sizeof(Gm861.barcode) -3) { strcat(Gm861.barcode, "..."); } + ResponseTime_P(PSTR(",\"GM861\":{")); if (offset) { - ResponseAppend_P(PSTR("\"AIM\":\"%c%c\","), buffer[1], buffer[2]); +#ifdef GM861_DECODE_AIM + ResponseAppend_P(PSTR("\"AIM\":\"%s\","), Gm861AIMId2AIM(aim_id).c_str()); +#else + ResponseAppend_P(PSTR("\"AIM\":\"%s\","), aim_id); +#endif // GM861_DECODE_AIM } ResponseAppend_P(PSTR("\"Code\":\"%s\"}}"), buffer + offset); MqttPublishTeleSensor(); From a46b926530616dd7f73ada91c50bb1d1f1c6ad4e Mon Sep 17 00:00:00 2001 From: gemu Date: Sun, 7 May 2023 14:48:49 +0200 Subject: [PATCH 074/289] fix i2c touch init (#18594) --- .../tasmota_xdsp_display/xdsp_17_universal.ino | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/tasmota/tasmota_xdsp_display/xdsp_17_universal.ino b/tasmota/tasmota_xdsp_display/xdsp_17_universal.ino index c784ed31c..5482183eb 100644 --- a/tasmota/tasmota_xdsp_display/xdsp_17_universal.ino +++ b/tasmota/tasmota_xdsp_display/xdsp_17_universal.ino @@ -175,11 +175,15 @@ int8_t cs; replacepin(&cp, Pin(GPIO_OLED_RESET)); if (wire_n == 1) { - I2cBegin(sda, scl); + if (!TasmotaGlobal.i2c_enabled) { + I2cBegin(sda, scl); + } } #ifdef ESP32 if (wire_n == 2) { - I2c2Begin(sda, scl); + if (!TasmotaGlobal.i2c_enabled_2) { + I2c2Begin(sda, scl); + } } if (I2cSetDevice(i2caddr, wire_n - 1)) { I2cSetActiveFound(i2caddr, "DSP-I2C", wire_n - 1); @@ -333,11 +337,15 @@ int8_t cs; } if (wire_n == 0) { - I2cBegin(sda, scl); + if (!TasmotaGlobal.i2c_enabled) { + I2cBegin(sda, scl); + } } #ifdef ESP32 if (wire_n == 1) { - I2c2Begin(sda, scl, 400000); + if (!TasmotaGlobal.i2c_enabled_2) { + I2c2Begin(sda, scl, 400000); + } } if (I2cSetDevice(i2caddr, wire_n)) { if (i2caddr == GT911_address) { From eccc1af0a250e2ef9b593d1a9300713a4fd3bf08 Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Sun, 7 May 2023 15:32:15 +0200 Subject: [PATCH 075/289] disable SHT pig on i2c / add missing GT911 defines (#18595) * disable SHT pig on i2c / add missing GT911 * GT911 missing in config --- tasmota/include/tasmota_configurations_ESP32.h | 3 ++- tasmota/tasmota_xdrv_driver/xdrv_52_3_berry_display.ino | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/tasmota/include/tasmota_configurations_ESP32.h b/tasmota/include/tasmota_configurations_ESP32.h index abdd66f7c..74108b8b1 100644 --- a/tasmota/include/tasmota_configurations_ESP32.h +++ b/tasmota/include/tasmota_configurations_ESP32.h @@ -306,6 +306,7 @@ #define SHOW_SPLASH #define USE_XPT2046 #define USE_FT5206 +#define USE_GT911 #define USE_MPU_ACCEL #define USE_RTC_CHIPS // Enable RTC chip support and NTP server - Select only one #define USE_BM8563 @@ -357,7 +358,7 @@ #define USE_I2C // I2C using library wire (+10k code, 0k2 mem, 124 iram) #undef USE_MLX90614 -#define USE_SHT // [I2cDriver8] Enable SHT1X sensor (+1k4 code) +//#define USE_SHT // [I2cDriver8] Enable SHT1X sensor (+1k4 code) #define USE_HTU // [I2cDriver9] Enable HTU21/SI7013/SI7020/SI7021 sensor (I2C address 0x40) (+1k5 code) #define USE_BMP // [I2cDriver10] Enable BMP085/BMP180/BMP280/BME280 sensors (I2C addresses 0x76 and 0x77) (+4k4 code) // #define USE_BME68X // Enable support for BME680/BME688 sensor using Bosch BME68x library (+6k9 code) diff --git a/tasmota/tasmota_xdrv_driver/xdrv_52_3_berry_display.ino b/tasmota/tasmota_xdrv_driver/xdrv_52_3_berry_display.ino index ae8ec888f..a9dc76127 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_52_3_berry_display.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_52_3_berry_display.ino @@ -73,7 +73,7 @@ int be_ntv_display_dimmer(struct bvm *vm) { } void be_ntv_display_touch_update(int32_t touches, int32_t raw_x, int32_t raw_y, int32_t gesture) { -#if defined(USE_LVGL_TOUCHSCREEN) || defined(USE_FT5206) || defined(USE_XPT2046) || defined(USE_LILYGO47) || defined(USE_TOUCH_BUTTONS) +#if defined(USE_LVGL_TOUCHSCREEN) || defined(USE_FT5206) || defined(USE_XPT2046) || defined(USE_GT911) || defined(USE_LILYGO47) || defined(USE_TOUCH_BUTTONS) Touch_SetStatus(touches, raw_x, raw_y, gesture); #endif } From 91523fd90b7b15abc510152f85188080a019aee6 Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Sun, 7 May 2023 16:01:33 +0200 Subject: [PATCH 076/289] Add GM861 optional heartbeat --- tasmota/my_user_config.h | 1 + .../tasmota_xsns_sensor/xsns_107_gm861.ino | 92 ++++++++++++------- 2 files changed, 58 insertions(+), 35 deletions(-) diff --git a/tasmota/my_user_config.h b/tasmota/my_user_config.h index 24184ee2c..df6d82b53 100644 --- a/tasmota/my_user_config.h +++ b/tasmota/my_user_config.h @@ -834,6 +834,7 @@ //#define USE_LOX_O2 // Add support for LuminOx LOX O2 Sensor (+0k8 code) //#define USE_GM861 // Add support for GM861 1D and 2D Bar Code Reader (+1k3 code) // #define GM861_DECODE_AIM // Decode AIM-id (+0k3 code) +// #define GM861_HEARTBEAT // Enable heartbeat (+0k2 code) // -- Power monitoring sensors -------------------- #define USE_ENERGY_SENSOR // Add support for Energy Monitors (+14k code) diff --git a/tasmota/tasmota_xsns_sensor/xsns_107_gm861.ino b/tasmota/tasmota_xsns_sensor/xsns_107_gm861.ino index 564bdcf83..356e7ef39 100644 --- a/tasmota/tasmota_xsns_sensor/xsns_107_gm861.ino +++ b/tasmota/tasmota_xsns_sensor/xsns_107_gm861.ino @@ -34,9 +34,13 @@ * GM861Dump - Dump zone bytes 0 to 97 if logging level 4 \*********************************************************************************************/ -#define XSNS_107 107 +#define XSNS_107 107 //#define GM861_DECODE_AIM // Decode AIM-id (+0k3 code) +//#define GM861_HEARTBEAT // Enable heartbeat + +#define GM861_BAUDRATE 9600 // Serial baudrate +#define GM861_GUI_LENGTH 30 // Max number of code characters in GUI /* #define GPIO_GM861_TX 304 @@ -87,13 +91,14 @@ enum Gm861States { #include TasmotaSerial *Gm861Serial = nullptr; -struct GDK { - char barcode[30]; +typedef struct { + char barcode[GM861_GUI_LENGTH]; uint8_t index; uint8_t state; - bool heartbeat; + uint8_t heartbeat; bool read; -} Gm861; +} tGm861; +tGm861 *Gm861 = nullptr; /*********************************************************************************************/ @@ -159,15 +164,15 @@ void Gm861Send(uint32_t type, uint32_t len, uint32_t address, uint32_t data) { } void Gm861SetZone(uint32_t address, uint32_t data) { - Gm861.read = false; + Gm861->read = false; uint32_t len = 1; if (0x2A == address) { len = 2; } // Baudrate Gm861Send(8, len, address, data); } void Gm861GetZone(uint32_t address) { - Gm861.read = true; - Gm861.index = address; + Gm861->read = true; + Gm861->index = address; uint32_t data = 1; if (0x2A == address) { data = 2; } // Baudrate Gm861Send(7, 1, address, data); @@ -196,20 +201,24 @@ void Gm861SerialInput(void) { // 02 00 00 01 00 33 31 - Command acknowledge // 02 00 00 01 01 23 10 - Command result (Zonebyte 96 - 0x60) // 02 00 00 02 39 01 C1 4C - Command result (Zonebytes 42/43 - 0x2A) - if (Gm861.read) { + if (Gm861->read) { uint32_t result = buffer[4]; if (2 == buffer[3]) { // Length result += (buffer[5] << 8); } - Gm861.read = false; - Response_P(S_JSON_COMMAND_INDEX_NVALUE, PSTR("GM861Zone"), Gm861.index, result); + Gm861->read = false; + Response_P(S_JSON_COMMAND_INDEX_NVALUE, PSTR("GM861Zone"), Gm861->index, result); MqttPublishPrefixTopicRulesProcess_P(RESULT_OR_STAT, PSTR("GM861Zone")); } } else if (3 == buffer[0]) { // Heartbeat // 03 00 00 01 00 33 31 - Heartbeat response // 03 00 0A 30 33 32 31 35 36 33 38 34 30 - Scan response with zone byte 96 = 0x81 - Gm861.heartbeat = true; +#ifdef GM861_HEARTBEAT + if ((0 == buffer[2]) && (1 == buffer[3]) && (0 == buffer[4])) { + Gm861->heartbeat = 0; + } +#endif // GM861_HEARTBEAT } } else { // Bar code // 38 37 31 31 32 31 38 39 37 32 38 37 35 0D - Barcode 8711218972875 @@ -224,9 +233,9 @@ void Gm861SerialInput(void) { } // Prepare GUI result - snprintf_P(Gm861.barcode, sizeof(Gm861.barcode) -3, PSTR("%s"), buffer + offset); - if (strlen(buffer) > sizeof(Gm861.barcode) -3) { - strcat(Gm861.barcode, "..."); + snprintf_P(Gm861->barcode, sizeof(Gm861->barcode) -3, PSTR("%s"), buffer + offset); + if (strlen(buffer) > sizeof(Gm861->barcode) -3) { + strcat(Gm861->barcode, "..."); } ResponseTime_P(PSTR(",\"GM861\":{")); @@ -246,14 +255,16 @@ void Gm861SerialInput(void) { void Gm861Init(void) { if (PinUsed(GPIO_GM861_RX) && PinUsed(GPIO_GM861_TX)) { + Gm861 = (tGm861*)calloc(sizeof(tGm861), 1); + if (!Gm861) { return; } + Gm861Serial = new TasmotaSerial(Pin(GPIO_GM861_RX), Pin(GPIO_GM861_TX), 1); - if (Gm861Serial->begin(9600)) { + if (Gm861Serial->begin(GM861_BAUDRATE)) { if (Gm861Serial->hardwareSerial()) { ClaimSerial(); } - Gm861.barcode[0] = '0'; // No barcode yet - Gm861.state = GM861_STATE_INIT_OFFSET; -// AddLog(LOG_LEVEL_INFO, PSTR("GM8: Connected")); + Gm861->barcode[0] = '0'; // No barcode yet + Gm861->state = GM861_STATE_INIT_OFFSET; } } } @@ -269,12 +280,12 @@ void Gm861StateMachine(void) { Serial output: 14:39:04.887-027 DMP: 02 00 00 62 D6 00 20 01 00 0A 32 01 2C 00 87 3C 01 A0 1C 32 03 00 80 00 06 00 00 00 00 00 00 00 00 00 00 00 00 02 80 3C 00 00 00 06 00 00 39 01 05 64 0D 0D 0D 01 0D 01 04 80 09 04 80 05 04 80 01 04 80 01 08 04 80 08 04 80 08 04 80 08 04 80 08 01 80 00 00 00 04 80 01 01 00 00 00 00 04 80 00 00 03 00 01 00 2D 9E */ - if (!Gm861.state) { return; } + if (!Gm861->state) { return; } - switch (Gm861.state) { + switch (Gm861->state) { case GM861_STATE_RESET: Gm861SetZone(0xD9, 0x50); // Factory reset - Gm861.state = GM861_STATE_SETUP_CODE_ON +7; // Add time for reset to complete + Gm861->state = GM861_STATE_SETUP_CODE_ON +7; // Add time for reset to complete break; case GM861_STATE_SETUP_CODE_ON: Gm861SetZone(0x00, 0xD6); // Set LED on, Mute off, Normal lighting, Normal brightness, Continuous mode (Default: setup code on) @@ -290,9 +301,25 @@ void Gm861StateMachine(void) { AddLog(LOG_LEVEL_INFO, PSTR("GM8: Initialized")); break; } - Gm861.state--; + Gm861->state--; } +#ifdef GM861_HEARTBEAT +void Gm861Heartbeat(void) { + if (!Gm861->state && (!(TasmotaGlobal.uptime % 10))) { + // It is recommended to send a heartbeat packet every 10 seconds + Gm861Send(10, 1, 0, 0); // Send heartbeat + Gm861->heartbeat++; + // If no correct reply is received for three consecutive times, the main control should be handle it accordingly. + if (Gm861->heartbeat > 3) { + AddLog(LOG_LEVEL_DEBUG, PSTR("GM8: Heartbeat lost")); + Gm861->heartbeat = 0; + Gm861->state = GM861_STATE_RESET; + } + } +} +#endif // GM861_HEARTBEAT + /*********************************************************************************************\ * Commands \*********************************************************************************************/ @@ -326,7 +353,7 @@ void CmndGm816Save(void) { void CmndGm816Reset(void) { // GM861Reset 1 - Do factory reset and inititalize for serial comms if (1 == XdrvMailbox.payload) { - Gm861.state = GM861_STATE_RESET; + Gm861->state = GM861_STATE_RESET; ResponseCmndDone(); } } @@ -337,16 +364,6 @@ void CmndGm816Dump(void) { ResponseCmndDone(); } -/*********************************************************************************************\ - * Presentation -\*********************************************************************************************/ - -#ifdef USE_WEBSERVER -void Gm861Show(void) { - WSContentSend_PD(PSTR("{s}GM816{m}%s{e}"), Gm861.barcode); -} -#endif // USE_WEBSERVER - /*********************************************************************************************\ Interface \*********************************************************************************************/ @@ -366,9 +383,14 @@ bool Xsns107(uint32_t function) { case FUNC_EVERY_250_MSECOND: Gm861StateMachine(); break; +#ifdef GM861_HEARTBEAT + case FUNC_EVERY_SECOND: + Gm861Heartbeat(); + break; +#endif // GM861_HEARTBEAT #ifdef USE_WEBSERVER case FUNC_WEB_SENSOR: - Gm861Show(); + WSContentSend_PD(PSTR("{s}GM816{m}%s{e}"), Gm861->barcode); break; #endif // USE_WEBSERVER case FUNC_COMMAND: From 519ea557c7f6a10b274391d828822a5e8b09e3d8 Mon Sep 17 00:00:00 2001 From: s-hadinger <49731213+s-hadinger@users.noreply.github.com> Date: Sun, 7 May 2023 16:18:34 +0200 Subject: [PATCH 077/289] Berry `re` (regex) add `match2` and optional offset (#18596) --- CHANGELOG.md | 1 + lib/libesp32/berry/default/be_re_lib.c | 74 ++++++++++++++++++++------ 2 files changed, 60 insertions(+), 15 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5f7f4d2f1..d08bad6d0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,7 @@ All notable changes to this project will be documented in this file. - ESP32 `Shuttersetup` for "Shelly 2.5 pro" automatic calibration and setup (experimental) - Berry `tcpclientasync` class for non-blocking TCP client - Support for GM861 1D and 2D bar code reader (#18399) +- Berry `re` (regex) add `match2` and optional offset ### Breaking Changed - Change command ``FileUpload`` index binary data detection from >199 to >299 diff --git a/lib/libesp32/berry/default/be_re_lib.c b/lib/libesp32/berry/default/be_re_lib.c index 6bd116591..956757858 100644 --- a/lib/libesp32/berry/default/be_re_lib.c +++ b/lib/libesp32/berry/default/be_re_lib.c @@ -62,7 +62,7 @@ int be_re_compile(bvm *vm) { // pushes either a list if matched, else `nil` // return index of next offset, or -1 if not found -const char *be_re_match_search_run(bvm *vm, ByteProg *code, const char *hay, bbool is_anchored) { +const char *be_re_match_search_run(bvm *vm, ByteProg *code, const char *hay, bbool is_anchored, bbool size_only) { Subject subj = {hay, hay + strlen(hay)}; int sub_els = (code->sub + 1) * 2; @@ -80,7 +80,11 @@ const char *be_re_match_search_run(bvm *vm, ByteProg *code, const char *hay, bbo if (sub[i] == nil || sub[i+1] == nil) { be_pushnil(vm); } else { - be_pushnstring(vm, sub[i], sub[i+1] - sub[i]); + if (size_only && i==0) { + be_pushint(vm, sub[i+1] - sub[i]); + } else { + be_pushnstring(vm, sub[i], sub[i+1] - sub[i]); + } } be_data_push(vm, -2); be_pop(vm, 1); @@ -89,11 +93,20 @@ const char *be_re_match_search_run(bvm *vm, ByteProg *code, const char *hay, bbo return sub[1]; } -int be_re_match_search(bvm *vm, bbool is_anchored) { +int be_re_match_search(bvm *vm, bbool is_anchored, bbool size_only) { int32_t argc = be_top(vm); // Get the number of arguments if (argc >= 2 && be_isstring(vm, 1) && be_isstring(vm, 2)) { const char * regex_str = be_tostring(vm, 1); const char * hay = be_tostring(vm, 2); + int32_t offset = 0; + if (argc >= 3 && be_isint(vm, 3)) { + offset = be_toint(vm, 3); + } + int32_t hay_len = strlen(hay); + if (offset < 0) { offset = 0; } + if (offset >= hay_len) { be_return_nil(vm); } // any match of empty string returns nil, this catches implicitly when hay_len == 0 + hay += offset; // shift to offset + int sz = re1_5_sizecode(regex_str); if (sz < 0) { be_raise(vm, "internal_error", "error in regex"); @@ -104,7 +117,7 @@ int be_re_match_search(bvm *vm, bbool is_anchored) { if (ret != 0) { be_raise(vm, "internal_error", "error in regex"); } - be_re_match_search_run(vm, code, hay, is_anchored); + be_re_match_search_run(vm, code, hay, is_anchored, size_only); be_return(vm); } be_raise(vm, "type_error", NULL); @@ -132,7 +145,7 @@ int be_re_match_search_all(bvm *vm, bbool is_anchored) { be_newobject(vm, "list"); for (int i = limit; i != 0 && hay != NULL; i--) { - hay = be_re_match_search_run(vm, code, hay, is_anchored); + hay = be_re_match_search_run(vm, code, hay, is_anchored, bfalse); if (hay != NULL) { be_data_push(vm, -2); // add sub list to list } @@ -144,13 +157,17 @@ int be_re_match_search_all(bvm *vm, bbool is_anchored) { be_raise(vm, "type_error", NULL); } -// Berry: `re.match(value:int | s:string) -> nil` +// Berry: `re.match(s:string [, offset:int]) -> nil` int be_re_match(bvm *vm) { - return be_re_match_search(vm, btrue); + return be_re_match_search(vm, btrue, bfalse); } -// Berry: `re.search(value:int | s:string) -> nil` +// Berry: `re.match2(s:string [, offset:int]) -> nil` +int be_re_match2(bvm *vm) { + return be_re_match_search(vm, btrue, btrue); +} +// Berry: `re.search(s:string [, offset:int]) -> nil` int be_re_search(bvm *vm) { - return be_re_match_search(vm, bfalse); + return be_re_match_search(vm, bfalse, bfalse); } // Berry: `re.search_all` @@ -162,14 +179,22 @@ int be_re_search_all(bvm *vm) { return be_re_match_search_all(vm, bfalse); } -// Berry: `re_pattern.search(s:string) -> list(string)` +// Berry: `re_pattern.search(s:string [, offset:int]) -> list(string)` int re_pattern_search(bvm *vm) { int32_t argc = be_top(vm); // Get the number of arguments if (argc >= 2 && be_isstring(vm, 2)) { const char * hay = be_tostring(vm, 2); + int32_t offset = 0; + if (argc >= 3 && be_isint(vm, 3)) { + offset = be_toint(vm, 3); + } + int32_t hay_len = strlen(hay); + if (offset < 0) { offset = 0; } + if (offset >= hay_len) { be_return_nil(vm); } // any match of empty string returns nil, this catches implicitly when hay_len == 0 + hay += offset; // shift to offset be_getmember(vm, 1, "_p"); ByteProg * code = (ByteProg*) be_tocomptr(vm, -1); - be_re_match_search_run(vm, code, hay, bfalse); + be_re_match_search_run(vm, code, hay, bfalse, bfalse); be_return(vm); } be_raise(vm, "type_error", NULL); @@ -189,7 +214,7 @@ int re_pattern_match_search_all(bvm *vm, bbool is_anchored) { be_newobject(vm, "list"); for (int i = limit; i != 0 && hay != NULL; i--) { - hay = be_re_match_search_run(vm, code, hay, is_anchored); + hay = be_re_match_search_run(vm, code, hay, is_anchored, bfalse); if (hay != NULL) { be_data_push(vm, -2); // add sub list to list } @@ -211,19 +236,36 @@ int re_pattern_match_all(bvm *vm) { return re_pattern_match_search_all(vm, btrue); } -// Berry: `re_pattern.match(s:string) -> list(string)` -int re_pattern_match(bvm *vm) { +// Berry: `re_pattern.match(s:string [, offset:int]) -> list(string)` +int re_pattern_match_size(bvm *vm, bbool size_only) { int32_t argc = be_top(vm); // Get the number of arguments if (argc >= 2 && be_isstring(vm, 2)) { const char * hay = be_tostring(vm, 2); + int32_t offset = 0; + if (argc >= 3 && be_isint(vm, 3)) { + offset = be_toint(vm, 3); + } + int32_t hay_len = strlen(hay); + if (offset < 0) { offset = 0; } + if (offset >= hay_len) { be_return_nil(vm); } // any match of empty string returns nil, this catches implicitly when hay_len == 0 + hay += offset; // shift to offset be_getmember(vm, 1, "_p"); ByteProg * code = (ByteProg*) be_tocomptr(vm, -1); - be_re_match_search_run(vm, code, hay, btrue); + be_re_match_search_run(vm, code, hay, btrue, size_only); be_return(vm); } be_raise(vm, "type_error", NULL); } +// Berry: `re_pattern.match(s:string [, offset:int]) -> list(string)` +int re_pattern_match(bvm *vm) { + return re_pattern_match_size(vm, bfalse); +} + +// Berry: `re_pattern.match(s:string [, offset:int]) -> list(string)` +int re_pattern_match2(bvm *vm) { + return re_pattern_match_size(vm, btrue); +} int re_pattern_split_run(bvm *vm, ByteProg *code, const char *hay, int split_limit) { Subject subj = {hay, hay + strlen(hay)}; @@ -304,6 +346,7 @@ module re (scope: global) { search, func(be_re_search) searchall, func(be_re_search_all) match, func(be_re_match) + match2, func(be_re_match2) matchall, func(be_re_match_all) split, func(be_re_split) } @@ -315,6 +358,7 @@ class be_class_re_pattern (scope: global, name: re_pattern) { search, func(re_pattern_search) searchall, func(re_pattern_search_all) match, func(re_pattern_match) + match2, func(re_pattern_match2) matchall, func(re_pattern_match_all) split, func(re_pattern_split) } From da5396a080bf46a182704ca5a101addf5d2cfedb Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Sun, 7 May 2023 17:25:18 +0200 Subject: [PATCH 078/289] Add filesystem size to esp8266 GUI --- tasmota/language/af_AF.h | 1 + tasmota/language/bg_BG.h | 1 + tasmota/language/ca_AD.h | 1 + tasmota/language/cs_CZ.h | 1 + tasmota/language/de_DE.h | 1 + tasmota/language/el_GR.h | 1 + tasmota/language/en_GB.h | 1 + tasmota/language/es_ES.h | 1 + tasmota/language/fr_FR.h | 1 + tasmota/language/fy_NL.h | 1 + tasmota/language/he_HE.h | 1 + tasmota/language/hu_HU.h | 1 + tasmota/language/it_IT.h | 1 + tasmota/language/ko_KO.h | 1 + tasmota/language/nl_NL.h | 1 + tasmota/language/pl_PL.h | 1 + tasmota/language/pt_BR.h | 1 + tasmota/language/pt_PT.h | 1 + tasmota/language/ro_RO.h | 1 + tasmota/language/ru_RU.h | 1 + tasmota/language/sk_SK.h | 1 + tasmota/language/sv_SE.h | 1 + tasmota/language/tr_TR.h | 1 + tasmota/language/uk_UA.h | 1 + tasmota/language/vi_VN.h | 1 + tasmota/language/zh_CN.h | 1 + tasmota/language/zh_TW.h | 1 + tasmota/tasmota_xdrv_driver/xdrv_01_9_webserver.ino | 8 ++++++-- tasmota/tasmota_xdrv_driver/xdrv_50_filesystem.ino | 8 ++++++++ 29 files changed, 41 insertions(+), 2 deletions(-) diff --git a/tasmota/language/af_AF.h b/tasmota/language/af_AF.h index f63671846..f3df5343f 100644 --- a/tasmota/language/af_AF.h +++ b/tasmota/language/af_AF.h @@ -104,6 +104,7 @@ #define D_FALLBACK_TOPIC "Terugval onderwerp" #define D_FALSE "Onwaar" #define D_FILE "Lêer" +#define D_FILE_SYSTEM_SIZE "File System Size" #define D_FLOW_RATE "Vloeitempo" #define D_FRAGMENTATION "frag." // Lower case abbreviated version of fragmentation used in "memory fragmentation" #define D_FRAME_RATE "Frame rate" diff --git a/tasmota/language/bg_BG.h b/tasmota/language/bg_BG.h index 672d88b93..880777669 100644 --- a/tasmota/language/bg_BG.h +++ b/tasmota/language/bg_BG.h @@ -104,6 +104,7 @@ #define D_FALLBACK_TOPIC "Резервна тема" #define D_FALSE "Невярно" #define D_FILE "Файл" +#define D_FILE_SYSTEM_SIZE "File System Size" #define D_FLOW_RATE "Дебит" #define D_FRAGMENTATION "фраг." // Lower case abbreviated version of fragmentation used in "memory fragmentation" #define D_FRAME_RATE "Кадъра в секунда" diff --git a/tasmota/language/ca_AD.h b/tasmota/language/ca_AD.h index 277902023..ef786b868 100644 --- a/tasmota/language/ca_AD.h +++ b/tasmota/language/ca_AD.h @@ -104,6 +104,7 @@ #define D_FALLBACK_TOPIC "Tema de recuperació" #define D_FALSE "Fals" #define D_FILE "Arxiu" +#define D_FILE_SYSTEM_SIZE "File System Size" #define D_FLOW_RATE "Cabal" #define D_FRAGMENTATION "frag." // Lower case abbreviated version of fragmentation used in "memory fragmentation" #define D_FRAME_RATE "Frame rate" diff --git a/tasmota/language/cs_CZ.h b/tasmota/language/cs_CZ.h index e42c875de..863ab0786 100644 --- a/tasmota/language/cs_CZ.h +++ b/tasmota/language/cs_CZ.h @@ -104,6 +104,7 @@ #define D_FALLBACK_TOPIC "Záložní topic" #define D_FALSE "Nepravda" #define D_FILE "Soubor" +#define D_FILE_SYSTEM_SIZE "File System Size" #define D_FLOW_RATE "Flow rate" #define D_FRAGMENTATION "frag." // Lower case abbreviated version of fragmentation used in "memory fragmentation" #define D_FRAME_RATE "Frame rate" diff --git a/tasmota/language/de_DE.h b/tasmota/language/de_DE.h index 408408245..a43e36587 100644 --- a/tasmota/language/de_DE.h +++ b/tasmota/language/de_DE.h @@ -104,6 +104,7 @@ #define D_FALLBACK_TOPIC "Fallback-Topic" #define D_FALSE "falsch" #define D_FILE "Datei" +#define D_FILE_SYSTEM_SIZE "File System Size" #define D_FLOW_RATE "Durchflussmenge" #define D_FRAGMENTATION "frag." // Lower case abbreviated version of fragmentation used in "memory fragmentation" #define D_FRAME_RATE "Frame rate" diff --git a/tasmota/language/el_GR.h b/tasmota/language/el_GR.h index a359d49dd..d25e8c307 100644 --- a/tasmota/language/el_GR.h +++ b/tasmota/language/el_GR.h @@ -104,6 +104,7 @@ #define D_FALLBACK_TOPIC "Fallback Topic" #define D_FALSE "Ψευδές" #define D_FILE "Αρχείο" +#define D_FILE_SYSTEM_SIZE "File System Size" #define D_FLOW_RATE "Flow rate" #define D_FRAGMENTATION "frag." // Lower case abbreviated version of fragmentation used in "memory fragmentation" #define D_FRAME_RATE "Frame rate" diff --git a/tasmota/language/en_GB.h b/tasmota/language/en_GB.h index b746c0634..416fc3c03 100644 --- a/tasmota/language/en_GB.h +++ b/tasmota/language/en_GB.h @@ -104,6 +104,7 @@ #define D_FALLBACK_TOPIC "Fallback Topic" #define D_FALSE "False" #define D_FILE "File" +#define D_FILE_SYSTEM_SIZE "File System Size" #define D_FLOW_RATE "Flow rate" #define D_FRAGMENTATION "frag." // Lower case abbreviated version of fragmentation used in "memory fragmentation" #define D_FRAME_RATE "Frame rate" diff --git a/tasmota/language/es_ES.h b/tasmota/language/es_ES.h index 26dd59688..1e8632008 100644 --- a/tasmota/language/es_ES.h +++ b/tasmota/language/es_ES.h @@ -104,6 +104,7 @@ #define D_FALLBACK_TOPIC "FallbackTopic" #define D_FALSE "Falso" #define D_FILE "Archivo" +#define D_FILE_SYSTEM_SIZE "File System Size" #define D_FLOW_RATE "Caudal" #define D_FRAGMENTATION "frag." // Lower case abbreviated version of fragmentation used in "memory fragmentation" #define D_FRAME_RATE "Frame rate" diff --git a/tasmota/language/fr_FR.h b/tasmota/language/fr_FR.h index ae600b589..0f62d1571 100644 --- a/tasmota/language/fr_FR.h +++ b/tasmota/language/fr_FR.h @@ -104,6 +104,7 @@ #define D_FALLBACK_TOPIC "Topic de secours" #define D_FALSE "Faux" #define D_FILE "Fichier" +#define D_FILE_SYSTEM_SIZE "File System Size" #define D_FLOW_RATE "Débit" #define D_FRAGMENTATION "frag." // Lower case abbreviated version of fragmentation used in "memory fragmentation" #define D_FRAME_RATE "Fréq. image" diff --git a/tasmota/language/fy_NL.h b/tasmota/language/fy_NL.h index 0ef74fdb6..7c3955dac 100644 --- a/tasmota/language/fy_NL.h +++ b/tasmota/language/fy_NL.h @@ -104,6 +104,7 @@ #define D_FALLBACK_TOPIC "Fallback Underwerp" #define D_FALSE "Falsk" #define D_FILE "Bestân" +#define D_FILE_SYSTEM_SIZE "File System Size" #define D_FLOW_RATE "Stromingssnelheid" #define D_FRAGMENTATION "frag." // Lower case abbreviated version of fragmentation used in "memory fragmentation" #define D_FRAME_RATE "Frame rate" diff --git a/tasmota/language/he_HE.h b/tasmota/language/he_HE.h index c1d13b7bc..39daf879e 100644 --- a/tasmota/language/he_HE.h +++ b/tasmota/language/he_HE.h @@ -104,6 +104,7 @@ #define D_FALLBACK_TOPIC "נושא לחזרה" #define D_FALSE "שגוי" #define D_FILE "קובץ" +#define D_FILE_SYSTEM_SIZE "File System Size" #define D_FLOW_RATE "Flow rate" #define D_FRAGMENTATION "frag." // Lower case abbreviated version of fragmentation used in "memory fragmentation" #define D_FRAME_RATE "Frame rate" diff --git a/tasmota/language/hu_HU.h b/tasmota/language/hu_HU.h index 71540307b..bb0e6b211 100644 --- a/tasmota/language/hu_HU.h +++ b/tasmota/language/hu_HU.h @@ -104,6 +104,7 @@ #define D_FALLBACK_TOPIC "fallback topik" #define D_FALSE "Hamis" #define D_FILE "Fájl" +#define D_FILE_SYSTEM_SIZE "File System Size" #define D_FLOW_RATE "Átfolyás ráta" #define D_FRAGMENTATION "frag." // Lower case abbreviated version of fragmentation used in "memory fragmentation" #define D_FRAME_RATE "Frame rate" diff --git a/tasmota/language/it_IT.h b/tasmota/language/it_IT.h index 2690363bb..a5378c52a 100644 --- a/tasmota/language/it_IT.h +++ b/tasmota/language/it_IT.h @@ -104,6 +104,7 @@ #define D_FALLBACK_TOPIC "Topic Riserva" #define D_FALSE "Falso" #define D_FILE "File" +#define D_FILE_SYSTEM_SIZE "File System Size" #define D_FLOW_RATE "Flusso dati" #define D_FRAGMENTATION "framm." // Lower case abbreviated version of fragmentation used in "memory fragmentation" #define D_FRAME_RATE "Frequenza fotogrammi" diff --git a/tasmota/language/ko_KO.h b/tasmota/language/ko_KO.h index 4f941a3b8..c5db16e45 100644 --- a/tasmota/language/ko_KO.h +++ b/tasmota/language/ko_KO.h @@ -104,6 +104,7 @@ #define D_FALLBACK_TOPIC "Fallback Topic" #define D_FALSE "거짓" #define D_FILE "파일" +#define D_FILE_SYSTEM_SIZE "File System Size" #define D_FLOW_RATE "Flow rate" #define D_FRAGMENTATION "frag." // Lower case abbreviated version of fragmentation used in "memory fragmentation" #define D_FRAME_RATE "Frame rate" diff --git a/tasmota/language/nl_NL.h b/tasmota/language/nl_NL.h index 05f85db2b..4ab10ce0e 100644 --- a/tasmota/language/nl_NL.h +++ b/tasmota/language/nl_NL.h @@ -104,6 +104,7 @@ #define D_FALLBACK_TOPIC "Fallback Topic" #define D_FALSE "Onwaar" #define D_FILE "Bestand" +#define D_FILE_SYSTEM_SIZE "File System Size" #define D_FLOW_RATE "Debiet" #define D_FRAGMENTATION "frag." // Lower case abbreviated version of fragmentation used in "memory fragmentation" #define D_FRAME_RATE "Frame rate" diff --git a/tasmota/language/pl_PL.h b/tasmota/language/pl_PL.h index 4444de792..db8330800 100644 --- a/tasmota/language/pl_PL.h +++ b/tasmota/language/pl_PL.h @@ -104,6 +104,7 @@ #define D_FALLBACK_TOPIC "Temat zastępczy" #define D_FALSE "Fałsz" #define D_FILE "Plik" +#define D_FILE_SYSTEM_SIZE "File System Size" #define D_FLOW_RATE "Przepływ" #define D_FRAGMENTATION "frag." // Lower case abbreviated version of fragmentation used in "memory fragmentation" #define D_FRAME_RATE "Frame rate" diff --git a/tasmota/language/pt_BR.h b/tasmota/language/pt_BR.h index ea04901c7..b4b32eeb1 100644 --- a/tasmota/language/pt_BR.h +++ b/tasmota/language/pt_BR.h @@ -104,6 +104,7 @@ #define D_FALLBACK_TOPIC "Tópico para retornar" #define D_FALSE "Falso" #define D_FILE "Arquivo" +#define D_FILE_SYSTEM_SIZE "File System Size" #define D_FLOW_RATE "Quociente de vazão" #define D_FRAGMENTATION "frag." // Lower case abbreviated version of fragmentation used in "memory fragmentation" #define D_FRAME_RATE "Frame rate" diff --git a/tasmota/language/pt_PT.h b/tasmota/language/pt_PT.h index 3377d7d72..8d22afd35 100644 --- a/tasmota/language/pt_PT.h +++ b/tasmota/language/pt_PT.h @@ -104,6 +104,7 @@ #define D_FALLBACK_TOPIC "Tópico de contingência" #define D_FALSE "Falso" #define D_FILE "Ficheiro" +#define D_FILE_SYSTEM_SIZE "File System Size" #define D_FLOW_RATE "Taxa de Fluxo" #define D_FRAGMENTATION "frag." // Lower case abbreviated version of fragmentation used in "memory fragmentation" #define D_FRAME_RATE "Frame rate" diff --git a/tasmota/language/ro_RO.h b/tasmota/language/ro_RO.h index c97bc649a..ddb93ccc6 100644 --- a/tasmota/language/ro_RO.h +++ b/tasmota/language/ro_RO.h @@ -104,6 +104,7 @@ #define D_FALLBACK_TOPIC "Listă de rezervă" #define D_FALSE "Fals" #define D_FILE "Fișier" +#define D_FILE_SYSTEM_SIZE "File System Size" #define D_FLOW_RATE "Debit" #define D_FRAGMENTATION "frag." // Lower case abbreviated version of fragmentation used in "memory fragmentation" #define D_FRAME_RATE "Frame rate" diff --git a/tasmota/language/ru_RU.h b/tasmota/language/ru_RU.h index 6e9bbe95d..655778364 100644 --- a/tasmota/language/ru_RU.h +++ b/tasmota/language/ru_RU.h @@ -104,6 +104,7 @@ #define D_FALLBACK_TOPIC "Топик обратной связи" #define D_FALSE "Ложно" #define D_FILE "Файл" +#define D_FILE_SYSTEM_SIZE "File System Size" #define D_FLOW_RATE "Flow rate" #define D_FRAGMENTATION "frag." // Lower case abbreviated version of fragmentation used in "memory fragmentation" #define D_FRAME_RATE "Frame rate" diff --git a/tasmota/language/sk_SK.h b/tasmota/language/sk_SK.h index 679abff2e..bcb03e92d 100644 --- a/tasmota/language/sk_SK.h +++ b/tasmota/language/sk_SK.h @@ -80,6 +80,7 @@ #define D_CURRENT "Prúd" // As in Voltage and Current #define D_CURRENT_NEUTRAL "Current Neutral" #define D_DATA "Dáta" +#define D_FILE_SYSTEM_SIZE "File System Size" #define D_FLOW_RATE "Flow rate" #define D_DARKLIGHT "Tmavý" #define D_DEBUG "Debug" diff --git a/tasmota/language/sv_SE.h b/tasmota/language/sv_SE.h index 0c3c896fe..7555763c0 100644 --- a/tasmota/language/sv_SE.h +++ b/tasmota/language/sv_SE.h @@ -104,6 +104,7 @@ #define D_FALLBACK_TOPIC "Reservämne" #define D_FALSE "Falskt" #define D_FILE "Fil" +#define D_FILE_SYSTEM_SIZE "File System Size" #define D_FLOW_RATE "Flow rate" #define D_FRAGMENTATION "frag." // Lower case abbreviated version of fragmentation used in "memory fragmentation" #define D_FRAME_RATE "Frame rate" diff --git a/tasmota/language/tr_TR.h b/tasmota/language/tr_TR.h index bc62a9ff5..36b763a07 100644 --- a/tasmota/language/tr_TR.h +++ b/tasmota/language/tr_TR.h @@ -104,6 +104,7 @@ #define D_FALLBACK_TOPIC "Geri İletim Topiği" #define D_FALSE "False" #define D_FILE "Dosya" +#define D_FILE_SYSTEM_SIZE "File System Size" #define D_FLOW_RATE "Flow rate" #define D_FRAGMENTATION "frag." // Lower case abbreviated version of fragmentation used in "memory fragmentation" #define D_FRAME_RATE "Frame rate" diff --git a/tasmota/language/uk_UA.h b/tasmota/language/uk_UA.h index d0664f542..0023f5c34 100644 --- a/tasmota/language/uk_UA.h +++ b/tasmota/language/uk_UA.h @@ -104,6 +104,7 @@ #define D_FALLBACK_TOPIC "Запасний топік" #define D_FALSE "Ні" #define D_FILE "Файл" +#define D_FILE_SYSTEM_SIZE "File System Size" #define D_FLOW_RATE "Потік" #define D_FRAGMENTATION "frag." // Lower case abbreviated version of fragmentation used in "memory fragmentation" #define D_FRAME_RATE "Frame rate" diff --git a/tasmota/language/vi_VN.h b/tasmota/language/vi_VN.h index 74e8398a2..11f293b03 100644 --- a/tasmota/language/vi_VN.h +++ b/tasmota/language/vi_VN.h @@ -104,6 +104,7 @@ #define D_FALLBACK_TOPIC "Fallback Topic" #define D_FALSE "Sai" #define D_FILE "Tệp" +#define D_FILE_SYSTEM_SIZE "File System Size" #define D_FLOW_RATE "Tốc độ dòng" #define D_FRAGMENTATION "frag." // Lower case abbreviated version of fragmentation used in "memory fragmentation" #define D_FRAME_RATE "Frame rate" diff --git a/tasmota/language/zh_CN.h b/tasmota/language/zh_CN.h index b4fa7c00e..ea316b48d 100644 --- a/tasmota/language/zh_CN.h +++ b/tasmota/language/zh_CN.h @@ -104,6 +104,7 @@ #define D_FALLBACK_TOPIC "回退主题" #define D_FALSE "False" #define D_FILE "文件:" +#define D_FILE_SYSTEM_SIZE "File System Size" #define D_FLOW_RATE "Flow rate" #define D_FRAGMENTATION "frag." // Lower case abbreviated version of fragmentation used in "memory fragmentation" #define D_FRAME_RATE "Frame rate" diff --git a/tasmota/language/zh_TW.h b/tasmota/language/zh_TW.h index a5611d532..62b656086 100644 --- a/tasmota/language/zh_TW.h +++ b/tasmota/language/zh_TW.h @@ -104,6 +104,7 @@ #define D_FALLBACK_TOPIC "Fallback Topic" #define D_FALSE "假" #define D_FILE "檔案:" +#define D_FILE_SYSTEM_SIZE "File System Size" #define D_FLOW_RATE "流量" #define D_FRAGMENTATION "frag." // Lower case abbreviated version of fragmentation used in "memory fragmentation" #define D_FRAME_RATE "Frame rate" diff --git a/tasmota/tasmota_xdrv_driver/xdrv_01_9_webserver.ino b/tasmota/tasmota_xdrv_driver/xdrv_01_9_webserver.ino index 7c8300cb7..01de3fe42 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_01_9_webserver.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_01_9_webserver.ino @@ -2508,9 +2508,13 @@ void HandleInformation(void) } } esp_partition_iterator_release(it); -#else // ESP32 +#else // not ESP32 WSContentSend_PD(PSTR("}1" D_FREE_MEMORY "}2%1_f KB"), &freemem); -#endif // ESP32 +#ifdef USE_UFILESYS + WSContentSend_P(PSTR("}1}2 ")); // Empty line + WSContentSend_P(PSTR("}1" D_FILE_SYSTEM_SIZE "}2%d KB"), UfsSize()); +#endif // USE_UFILESYS +#endif // ESP32 WSContentSend_P(PSTR("")); WSContentSend_P(HTTP_SCRIPT_INFO_END); diff --git a/tasmota/tasmota_xdrv_driver/xdrv_50_filesystem.ino b/tasmota/tasmota_xdrv_driver/xdrv_50_filesystem.ino index dce7fdee1..e61a22535 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_50_filesystem.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_50_filesystem.ino @@ -267,6 +267,14 @@ uint32_t UfsInfo(uint32_t sel, uint32_t type) { return result / 1024; } +uint32_t UfsSize(void) { + return UfsInfo(0, ufs_dir == 2 ? 1:0); +} + +uint32_t UfsFree(void) { + return UfsInfo(1, ufs_dir == 2 ? 1:0); +} + #if USE_LONG_FILE_NAMES>0 #undef REJCMPL #define REJCMPL 6 From 4a85ac5f1903e617be237f68a4689eef006a6167 Mon Sep 17 00:00:00 2001 From: stefanbode Date: Sun, 7 May 2023 17:53:38 +0200 Subject: [PATCH 079/289] Matter TiltSupport fixes (#18598) * Tilt bugfix - enabled negative tilt values in tilt_min - fix scale to 10.000 * Update solidified_Matter_Plugin_ShutterTilt.h * Update solidified_Matter_TLV.h --- .../src/embedded/Matter_Plugin_ShutterTilt.be | 6 +- .../solidified_Matter_Plugin_ShutterTilt.h | 284 ++++++++++-------- .../src/solidify/solidified_Matter_TLV.h | 22 +- 3 files changed, 167 insertions(+), 145 deletions(-) diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_ShutterTilt.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_ShutterTilt.be index c181cff36..8c99aab51 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_ShutterTilt.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_ShutterTilt.be @@ -110,14 +110,14 @@ class Matter_Plugin_ShutterTilt : Matter_Plugin_Shutter elif attribute == 0x000F # ---------- CurrentPositionTiltPercent100ths / u8 ---------- self.update_tilt_min_max() if self.tilt_min != nil && self.tilt_max != nil - var tilt_percentage = tasmota.scale_uint(self.shadow_shutter_tilt, self.tilt_min, self.tilt_max, 0, 1000) + var tilt_percentage = tasmota.scale_uint(self.shadow_shutter_tilt - self.tilt_min, 0, self.tilt_max - self.tilt_min, 0, 10000) return TLV.create_TLV(TLV.U2, tilt_percentage) else return TLV.create_TLV(TLV.NULL, nil) # return invalid end elif attribute == 0x000C # ---------- TargetPositionTiltPercent100ths / u16 ---------- if self.tilt_min != nil && self.tilt_max != nil - var tilt_percentage = tasmota.scale_uint(self.shadow_shutter_tilt, self.tilt_min, self.tilt_max, 0, 1000) + var tilt_percentage = tasmota.scale_uint(self.shadow_shutter_tilt - self.tilt_min, 0, self.tilt_max - self.tilt_min, 0, 10000) return TLV.create_TLV(TLV.U2, tilt_percentage) else return TLV.create_TLV(TLV.NULL, nil) # return invalid @@ -150,7 +150,7 @@ class Matter_Plugin_ShutterTilt : Matter_Plugin_Shutter if tilt != nil self.update_tilt_min_max() if self.tilt_min != nil && self.tilt_max != nil - var tilt_val = tasmota.scale_uint(tilt, 0, 1000, self.tilt_min, self.tilt_max) + var tilt_val = self.tilt_min + tasmota.scale_uint(tilt, 0, 10000, 0, self.tilt_max - self.tilt_min) tasmota.cmd("ShutterTilt"+str(self.tasmota_shutter_index+1) + " " + str(tilt_val), false) # TODO self.update_shadow() ctx.log = "tilt%:"+str(tilt) diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_ShutterTilt.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_ShutterTilt.h index 9e22968e0..99038f799 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_ShutterTilt.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_ShutterTilt.h @@ -81,7 +81,7 @@ be_local_closure(Matter_Plugin_ShutterTilt_update_tilt_min_max, /* name */ ********************************************************************/ be_local_closure(Matter_Plugin_ShutterTilt_invoke_request, /* name */ be_nested_proto( - 16, /* nstack */ + 18, /* nstack */ 4, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -116,7 +116,7 @@ be_local_closure(Matter_Plugin_ShutterTilt_invoke_request, /* name */ }), be_str_weak(invoke_request), &be_const_str_solidified, - ( &(const binstruction[75]) { /* code */ + ( &(const binstruction[79]) { /* code */ 0xA4120000, // 0000 IMPORT R4 K0 0xB8160200, // 0001 GETNGBL R5 K1 0x88140B02, // 0002 GETMBR R5 R5 K2 @@ -124,74 +124,78 @@ be_local_closure(Matter_Plugin_ShutterTilt_invoke_request, /* name */ 0x881C0704, // 0004 GETMBR R7 R3 K4 0x54220101, // 0005 LDINT R8 258 0x1C200C08, // 0006 EQ R8 R6 R8 - 0x78220039, // 0007 JMPF R8 #0042 + 0x7822003D, // 0007 JMPF R8 #0046 0x8C200105, // 0008 GETMET R8 R0 K5 0x7C200200, // 0009 CALL R8 1 0x54220007, // 000A LDINT R8 8 0x1C200E08, // 000B EQ R8 R7 R8 - 0x78220034, // 000C JMPF R8 #0042 + 0x78220038, // 000C JMPF R8 #0046 0x8C200506, // 000D GETMET R8 R2 K6 0x58280007, // 000E LDCONST R10 K7 0x7C200400, // 000F CALL R8 2 0x4C240000, // 0010 LDNIL R9 0x20241009, // 0011 NE R9 R8 R9 - 0x7826002C, // 0012 JMPF R9 #0040 + 0x78260030, // 0012 JMPF R9 #0044 0x8C240108, // 0013 GETMET R9 R0 K8 0x7C240200, // 0014 CALL R9 1 0x88240109, // 0015 GETMBR R9 R0 K9 0x4C280000, // 0016 LDNIL R10 0x2024120A, // 0017 NE R9 R9 R10 - 0x78260021, // 0018 JMPF R9 #003B + 0x78260025, // 0018 JMPF R9 #003F 0x8824010A, // 0019 GETMBR R9 R0 K10 0x4C280000, // 001A LDNIL R10 0x2024120A, // 001B NE R9 R9 R10 - 0x7826001D, // 001C JMPF R9 #003B - 0xB8261600, // 001D GETNGBL R9 K11 - 0x8C24130C, // 001E GETMET R9 R9 K12 - 0x5C2C1000, // 001F MOVE R11 R8 - 0x58300007, // 0020 LDCONST R12 K7 - 0x543603E7, // 0021 LDINT R13 1000 - 0x88380109, // 0022 GETMBR R14 R0 K9 - 0x883C010A, // 0023 GETMBR R15 R0 K10 - 0x7C240C00, // 0024 CALL R9 6 - 0xB82A1600, // 0025 GETNGBL R10 K11 - 0x8C28150D, // 0026 GETMET R10 R10 K13 - 0x60300008, // 0027 GETGBL R12 G8 - 0x8834010F, // 0028 GETMBR R13 R0 K15 - 0x00341B10, // 0029 ADD R13 R13 K16 - 0x7C300200, // 002A CALL R12 1 - 0x00321C0C, // 002B ADD R12 K14 R12 - 0x00301911, // 002C ADD R12 R12 K17 - 0x60340008, // 002D GETGBL R13 G8 - 0x5C381200, // 002E MOVE R14 R9 - 0x7C340200, // 002F CALL R13 1 - 0x0030180D, // 0030 ADD R12 R12 R13 - 0x50340000, // 0031 LDBOOL R13 0 0 - 0x7C280600, // 0032 CALL R10 3 - 0x8C280112, // 0033 GETMET R10 R0 K18 - 0x7C280200, // 0034 CALL R10 1 - 0x60280008, // 0035 GETGBL R10 G8 - 0x5C2C1000, // 0036 MOVE R11 R8 - 0x7C280200, // 0037 CALL R10 1 - 0x002A280A, // 0038 ADD R10 K20 R10 - 0x900E260A, // 0039 SETMBR R3 K19 R10 - 0x70020004, // 003A JMP #0040 - 0x60240008, // 003B GETGBL R9 G8 - 0x5C281000, // 003C MOVE R10 R8 - 0x7C240200, // 003D CALL R9 1 - 0x00262A09, // 003E ADD R9 K21 R9 - 0x900E2609, // 003F SETMBR R3 K19 R9 - 0x50240200, // 0040 LDBOOL R9 1 0 - 0x80041200, // 0041 RET 1 R9 - 0x60200003, // 0042 GETGBL R8 G3 - 0x5C240000, // 0043 MOVE R9 R0 - 0x7C200200, // 0044 CALL R8 1 - 0x8C201116, // 0045 GETMET R8 R8 K22 - 0x5C280200, // 0046 MOVE R10 R1 - 0x5C2C0400, // 0047 MOVE R11 R2 - 0x5C300600, // 0048 MOVE R12 R3 - 0x7C200800, // 0049 CALL R8 4 - 0x80041000, // 004A RET 1 R8 + 0x78260021, // 001C JMPF R9 #003F + 0x88240109, // 001D GETMBR R9 R0 K9 + 0xB82A1600, // 001E GETNGBL R10 K11 + 0x8C28150C, // 001F GETMET R10 R10 K12 + 0x5C301000, // 0020 MOVE R12 R8 + 0x58340007, // 0021 LDCONST R13 K7 + 0x543A270F, // 0022 LDINT R14 10000 + 0x583C0007, // 0023 LDCONST R15 K7 + 0x8840010A, // 0024 GETMBR R16 R0 K10 + 0x88440109, // 0025 GETMBR R17 R0 K9 + 0x04402011, // 0026 SUB R16 R16 R17 + 0x7C280C00, // 0027 CALL R10 6 + 0x0024120A, // 0028 ADD R9 R9 R10 + 0xB82A1600, // 0029 GETNGBL R10 K11 + 0x8C28150D, // 002A GETMET R10 R10 K13 + 0x60300008, // 002B GETGBL R12 G8 + 0x8834010F, // 002C GETMBR R13 R0 K15 + 0x00341B10, // 002D ADD R13 R13 K16 + 0x7C300200, // 002E CALL R12 1 + 0x00321C0C, // 002F ADD R12 K14 R12 + 0x00301911, // 0030 ADD R12 R12 K17 + 0x60340008, // 0031 GETGBL R13 G8 + 0x5C381200, // 0032 MOVE R14 R9 + 0x7C340200, // 0033 CALL R13 1 + 0x0030180D, // 0034 ADD R12 R12 R13 + 0x50340000, // 0035 LDBOOL R13 0 0 + 0x7C280600, // 0036 CALL R10 3 + 0x8C280112, // 0037 GETMET R10 R0 K18 + 0x7C280200, // 0038 CALL R10 1 + 0x60280008, // 0039 GETGBL R10 G8 + 0x5C2C1000, // 003A MOVE R11 R8 + 0x7C280200, // 003B CALL R10 1 + 0x002A280A, // 003C ADD R10 K20 R10 + 0x900E260A, // 003D SETMBR R3 K19 R10 + 0x70020004, // 003E JMP #0044 + 0x60240008, // 003F GETGBL R9 G8 + 0x5C281000, // 0040 MOVE R10 R8 + 0x7C240200, // 0041 CALL R9 1 + 0x00262A09, // 0042 ADD R9 K21 R9 + 0x900E2609, // 0043 SETMBR R3 K19 R9 + 0x50240200, // 0044 LDBOOL R9 1 0 + 0x80041200, // 0045 RET 1 R9 + 0x60200003, // 0046 GETGBL R8 G3 + 0x5C240000, // 0047 MOVE R9 R0 + 0x7C200200, // 0048 CALL R8 1 + 0x8C201116, // 0049 GETMET R8 R8 K22 + 0x5C280200, // 004A MOVE R10 R1 + 0x5C2C0400, // 004B MOVE R11 R2 + 0x5C300600, // 004C MOVE R12 R3 + 0x7C200800, // 004D CALL R8 4 + 0x80041000, // 004E RET 1 R8 }) ) ); @@ -211,7 +215,7 @@ be_local_closure(Matter_Plugin_ShutterTilt_read_attribute, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[21]) { /* constants */ + ( &(const bvalue[24]) { /* constants */ /* K0 */ be_nested_str_weak(string), /* K1 */ be_nested_str_weak(matter), /* K2 */ be_nested_str_weak(TLV), @@ -228,15 +232,18 @@ be_local_closure(Matter_Plugin_ShutterTilt_read_attribute, /* name */ /* K13 */ be_nested_str_weak(scale_uint), /* K14 */ be_nested_str_weak(shadow_shutter_tilt), /* K15 */ be_const_int(0), - /* K16 */ be_nested_str_weak(U2), - /* K17 */ be_nested_str_weak(NULL), - /* K18 */ be_nested_str_weak(U4), - /* K19 */ be_const_int(3), - /* K20 */ be_nested_str_weak(read_attribute), + /* K16 */ be_nested_str_weak(log), + /* K17 */ be_nested_str_weak(format), + /* K18 */ be_nested_str_weak(MATTER_X3A_X20new_X20percent_X20_X25d), + /* K19 */ be_nested_str_weak(U2), + /* K20 */ be_nested_str_weak(NULL), + /* K21 */ be_nested_str_weak(U4), + /* K22 */ be_const_int(3), + /* K23 */ be_nested_str_weak(read_attribute), }), be_str_weak(read_attribute), &be_const_str_solidified, - ( &(const binstruction[105]) { /* code */ + ( &(const binstruction[120]) { /* code */ 0xA40E0000, // 0000 IMPORT R3 K0 0xB8120200, // 0001 GETNGBL R4 K1 0x88100902, // 0002 GETMBR R4 R4 K2 @@ -244,7 +251,7 @@ be_local_closure(Matter_Plugin_ShutterTilt_read_attribute, /* name */ 0x88180504, // 0004 GETMBR R6 R2 K4 0x541E0101, // 0005 LDINT R7 258 0x1C1C0A07, // 0006 EQ R7 R5 R7 - 0x781E0058, // 0007 JMPF R7 #0061 + 0x781E0067, // 0007 JMPF R7 #0070 0x8C1C0105, // 0008 GETMET R7 R0 K5 0x7C1C0200, // 0009 CALL R7 1 0x541E0006, // 000A LDINT R7 7 @@ -258,90 +265,105 @@ be_local_closure(Matter_Plugin_ShutterTilt_read_attribute, /* name */ 0x0028140B, // 0012 ADD R10 R10 R11 0x7C1C0600, // 0013 CALL R7 3 0x80040E00, // 0014 RET 1 R7 - 0x7002004A, // 0015 JMP #0061 + 0x70020059, // 0015 JMP #0070 0x541E000E, // 0016 LDINT R7 15 0x1C1C0C07, // 0017 EQ R7 R6 R7 - 0x781E001D, // 0018 JMPF R7 #0037 + 0x781E0028, // 0018 JMPF R7 #0042 0x8C1C0109, // 0019 GETMET R7 R0 K9 0x7C1C0200, // 001A CALL R7 1 0x881C010A, // 001B GETMBR R7 R0 K10 0x4C200000, // 001C LDNIL R8 0x201C0E08, // 001D NE R7 R7 R8 - 0x781E0011, // 001E JMPF R7 #0031 + 0x781E001C, // 001E JMPF R7 #003C 0x881C010B, // 001F GETMBR R7 R0 K11 0x4C200000, // 0020 LDNIL R8 0x201C0E08, // 0021 NE R7 R7 R8 - 0x781E000D, // 0022 JMPF R7 #0031 + 0x781E0018, // 0022 JMPF R7 #003C 0xB81E1800, // 0023 GETNGBL R7 K12 0x8C1C0F0D, // 0024 GETMET R7 R7 K13 0x8824010E, // 0025 GETMBR R9 R0 K14 0x8828010A, // 0026 GETMBR R10 R0 K10 - 0x882C010B, // 0027 GETMBR R11 R0 K11 - 0x5830000F, // 0028 LDCONST R12 K15 - 0x543603E7, // 0029 LDINT R13 1000 - 0x7C1C0C00, // 002A CALL R7 6 - 0x8C200906, // 002B GETMET R8 R4 K6 - 0x88280910, // 002C GETMBR R10 R4 K16 - 0x5C2C0E00, // 002D MOVE R11 R7 - 0x7C200600, // 002E CALL R8 3 - 0x80041000, // 002F RET 1 R8 - 0x70020004, // 0030 JMP #0036 - 0x8C1C0906, // 0031 GETMET R7 R4 K6 - 0x88240911, // 0032 GETMBR R9 R4 K17 - 0x4C280000, // 0033 LDNIL R10 - 0x7C1C0600, // 0034 CALL R7 3 - 0x80040E00, // 0035 RET 1 R7 - 0x70020029, // 0036 JMP #0061 - 0x541E000B, // 0037 LDINT R7 12 - 0x1C1C0C07, // 0038 EQ R7 R6 R7 - 0x781E001B, // 0039 JMPF R7 #0056 - 0x881C010A, // 003A GETMBR R7 R0 K10 - 0x4C200000, // 003B LDNIL R8 - 0x201C0E08, // 003C NE R7 R7 R8 - 0x781E0011, // 003D JMPF R7 #0050 - 0x881C010B, // 003E GETMBR R7 R0 K11 - 0x4C200000, // 003F LDNIL R8 - 0x201C0E08, // 0040 NE R7 R7 R8 - 0x781E000D, // 0041 JMPF R7 #0050 - 0xB81E1800, // 0042 GETNGBL R7 K12 - 0x8C1C0F0D, // 0043 GETMET R7 R7 K13 - 0x8824010E, // 0044 GETMBR R9 R0 K14 - 0x8828010A, // 0045 GETMBR R10 R0 K10 - 0x882C010B, // 0046 GETMBR R11 R0 K11 - 0x5830000F, // 0047 LDCONST R12 K15 - 0x543603E7, // 0048 LDINT R13 1000 - 0x7C1C0C00, // 0049 CALL R7 6 - 0x8C200906, // 004A GETMET R8 R4 K6 - 0x88280910, // 004B GETMBR R10 R4 K16 - 0x5C2C0E00, // 004C MOVE R11 R7 - 0x7C200600, // 004D CALL R8 3 - 0x80041000, // 004E RET 1 R8 - 0x70020004, // 004F JMP #0055 - 0x8C1C0906, // 0050 GETMET R7 R4 K6 - 0x88240911, // 0051 GETMBR R9 R4 K17 - 0x4C280000, // 0052 LDNIL R10 - 0x7C1C0600, // 0053 CALL R7 3 - 0x80040E00, // 0054 RET 1 R7 - 0x7002000A, // 0055 JMP #0061 - 0x541EFFFB, // 0056 LDINT R7 65532 - 0x1C1C0C07, // 0057 EQ R7 R6 R7 - 0x781E0007, // 0058 JMPF R7 #0061 - 0x8C1C0906, // 0059 GETMET R7 R4 K6 - 0x88240912, // 005A GETMBR R9 R4 K18 - 0x542A0003, // 005B LDINT R10 4 - 0x002A260A, // 005C ADD R10 K19 R10 - 0x542E000F, // 005D LDINT R11 16 - 0x0028140B, // 005E ADD R10 R10 R11 - 0x7C1C0600, // 005F CALL R7 3 - 0x80040E00, // 0060 RET 1 R7 - 0x601C0003, // 0061 GETGBL R7 G3 - 0x5C200000, // 0062 MOVE R8 R0 - 0x7C1C0200, // 0063 CALL R7 1 - 0x8C1C0F14, // 0064 GETMET R7 R7 K20 - 0x5C240200, // 0065 MOVE R9 R1 - 0x5C280400, // 0066 MOVE R10 R2 - 0x7C1C0600, // 0067 CALL R7 3 - 0x80040E00, // 0068 RET 1 R7 + 0x0424120A, // 0027 SUB R9 R9 R10 + 0x5828000F, // 0028 LDCONST R10 K15 + 0x882C010B, // 0029 GETMBR R11 R0 K11 + 0x8830010A, // 002A GETMBR R12 R0 K10 + 0x042C160C, // 002B SUB R11 R11 R12 + 0x5830000F, // 002C LDCONST R12 K15 + 0x5436270F, // 002D LDINT R13 10000 + 0x7C1C0C00, // 002E CALL R7 6 + 0xB8221800, // 002F GETNGBL R8 K12 + 0x8C201110, // 0030 GETMET R8 R8 K16 + 0x8C280711, // 0031 GETMET R10 R3 K17 + 0x58300012, // 0032 LDCONST R12 K18 + 0x5C340E00, // 0033 MOVE R13 R7 + 0x7C280600, // 0034 CALL R10 3 + 0x7C200400, // 0035 CALL R8 2 + 0x8C200906, // 0036 GETMET R8 R4 K6 + 0x88280913, // 0037 GETMBR R10 R4 K19 + 0x5C2C0E00, // 0038 MOVE R11 R7 + 0x7C200600, // 0039 CALL R8 3 + 0x80041000, // 003A RET 1 R8 + 0x70020004, // 003B JMP #0041 + 0x8C1C0906, // 003C GETMET R7 R4 K6 + 0x88240914, // 003D GETMBR R9 R4 K20 + 0x4C280000, // 003E LDNIL R10 + 0x7C1C0600, // 003F CALL R7 3 + 0x80040E00, // 0040 RET 1 R7 + 0x7002002D, // 0041 JMP #0070 + 0x541E000B, // 0042 LDINT R7 12 + 0x1C1C0C07, // 0043 EQ R7 R6 R7 + 0x781E001F, // 0044 JMPF R7 #0065 + 0x881C010A, // 0045 GETMBR R7 R0 K10 + 0x4C200000, // 0046 LDNIL R8 + 0x201C0E08, // 0047 NE R7 R7 R8 + 0x781E0015, // 0048 JMPF R7 #005F + 0x881C010B, // 0049 GETMBR R7 R0 K11 + 0x4C200000, // 004A LDNIL R8 + 0x201C0E08, // 004B NE R7 R7 R8 + 0x781E0011, // 004C JMPF R7 #005F + 0xB81E1800, // 004D GETNGBL R7 K12 + 0x8C1C0F0D, // 004E GETMET R7 R7 K13 + 0x8824010E, // 004F GETMBR R9 R0 K14 + 0x8828010A, // 0050 GETMBR R10 R0 K10 + 0x0424120A, // 0051 SUB R9 R9 R10 + 0x5828000F, // 0052 LDCONST R10 K15 + 0x882C010B, // 0053 GETMBR R11 R0 K11 + 0x8830010A, // 0054 GETMBR R12 R0 K10 + 0x042C160C, // 0055 SUB R11 R11 R12 + 0x5830000F, // 0056 LDCONST R12 K15 + 0x5436270F, // 0057 LDINT R13 10000 + 0x7C1C0C00, // 0058 CALL R7 6 + 0x8C200906, // 0059 GETMET R8 R4 K6 + 0x88280913, // 005A GETMBR R10 R4 K19 + 0x5C2C0E00, // 005B MOVE R11 R7 + 0x7C200600, // 005C CALL R8 3 + 0x80041000, // 005D RET 1 R8 + 0x70020004, // 005E JMP #0064 + 0x8C1C0906, // 005F GETMET R7 R4 K6 + 0x88240914, // 0060 GETMBR R9 R4 K20 + 0x4C280000, // 0061 LDNIL R10 + 0x7C1C0600, // 0062 CALL R7 3 + 0x80040E00, // 0063 RET 1 R7 + 0x7002000A, // 0064 JMP #0070 + 0x541EFFFB, // 0065 LDINT R7 65532 + 0x1C1C0C07, // 0066 EQ R7 R6 R7 + 0x781E0007, // 0067 JMPF R7 #0070 + 0x8C1C0906, // 0068 GETMET R7 R4 K6 + 0x88240915, // 0069 GETMBR R9 R4 K21 + 0x542A0003, // 006A LDINT R10 4 + 0x002A2C0A, // 006B ADD R10 K22 R10 + 0x542E000F, // 006C LDINT R11 16 + 0x0028140B, // 006D ADD R10 R10 R11 + 0x7C1C0600, // 006E CALL R7 3 + 0x80040E00, // 006F RET 1 R7 + 0x601C0003, // 0070 GETGBL R7 G3 + 0x5C200000, // 0071 MOVE R8 R0 + 0x7C1C0200, // 0072 CALL R7 1 + 0x8C1C0F17, // 0073 GETMET R7 R7 K23 + 0x5C240200, // 0074 MOVE R9 R1 + 0x5C280400, // 0075 MOVE R10 R2 + 0x7C1C0600, // 0076 CALL R7 3 + 0x80040E00, // 0077 RET 1 R7 }) ) ); diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_TLV.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_TLV.h index 6cc6300b0..b1e3292f3 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_TLV.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_TLV.h @@ -3282,18 +3282,18 @@ be_local_class(Matter_TLV, be_const_int(0), be_const_int(4), be_const_int(8), - be_const_int(4294967295), - be_const_int(4294967294), - be_const_int(4294967292), - be_const_int(4294967288), - be_const_int(4294967295), - be_const_int(4294967294), - be_const_int(4294967292), - be_const_int(4294967288), + be_const_int(-1), + be_const_int(-2), + be_const_int(-4), + be_const_int(-8), + be_const_int(-1), + be_const_int(-2), + be_const_int(-4), + be_const_int(-8), be_const_int(0), - be_const_int(4294967197), - be_const_int(4294967197), - be_const_int(4294967197), + be_const_int(-99), + be_const_int(-99), + be_const_int(-99), be_const_int(0), })) ) } )) }, { be_const_key_weak(EOC, -1), be_const_int(24) }, From 97cbfe007f473f0ff0e7b7e5aa605be8ee8b571e Mon Sep 17 00:00:00 2001 From: s-hadinger <49731213+s-hadinger@users.noreply.github.com> Date: Sun, 7 May 2023 18:12:47 +0200 Subject: [PATCH 080/289] Add windows berry binary (#18599) --- lib/libesp32/berry/berry.exe | Bin 0 -> 362434 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 lib/libesp32/berry/berry.exe diff --git a/lib/libesp32/berry/berry.exe b/lib/libesp32/berry/berry.exe new file mode 100644 index 0000000000000000000000000000000000000000..7dfe426b590b8a5793438c367d0e4b03c80cef17 GIT binary patch literal 362434 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
LmeTszPc-uI20px1QsrC@_8@ociFdsYDUm^}- z^QfXM@nbbX8}!j#@FrVacTV;0#{t<9-efU+L?!$%l}B(0Q8jRg)`)(Z2r32%I&yW_ zL3jPGrEnbFHH|2<#=GO3#EK+$1=J2`L1WEArRd-JvcQXbA7c z`7v`9#uw^LFYyHitP_4CVV;TW7ATQcphYh`YCsCVM1PS|gsQi5}O-5v3?`u6#$`Fcn7Q;6DPB z3C~3o=a;eLQp<#g{=K0nP&_+|*zoM+isz5mA`M)DV;o@U78V7Z^T*Y|2o1X1ieuac zWMgx!*CI_F?skHzD?B3x=Hpo4jYGaA=-w@L(LGaMF96vgg$aZ7Lk;NZtra=5_huZ^ z3Z7(j*q;IoWjC$wNn#P@TYlJ3)OaTiyxan-hiPtF$;;82M$fwgOI`3B9p7R^T#n8H zR}O4=#qTUn96sf~>7x&lJ)>_Yc>05!I3`Hp9jHme=ikwo=n}aF78p~!YniGEuLFS< z+nv~V$5yzir@GG5wkZBhcO#)hmMjy0=onj!F5|n4p_la(&vz1!$z)58iYF$yTwjXy zgg0P}2-u(m#lnN+H7R&^+$rhoGGzdFCpL8$RMii*#>ye{N~Mn{Q&B7pX{El7;gx%y zVp!>&V#Q3%s5m!_9#Cy-1OHw@@Mn3GaALa?HM>;)V@xK97(P+cH^i$CrzJ?Rm*Ye#hSuGf|FyMiO ztUcqt#=2CBsrJmaNo-c#o5w^?%cO}$;VVGh{CEf^SZg_GzShmJpJ~e7!wmg6{qP1X?C^-EVHhWGviO;=J1<5f%@Sye z!F+iIh?a@VzlzR|IDrw>!??*se#$axDsNPHQ5)~OC#K1bGp2{_%sjLO$r!q@WFgeU zTSN?+TwORLiGDl;8r|kw1b8KfU!IT~6)KQy`Ams;G#x^Wyw#MvAZf@MyT`Zqu~9Uz z+-P(|ogTT!X508x-iY-ZoI$o0d?>^39JAn=%8!4|Mp4^qMB$+FKU=kar@0ibWU7(U zE25?*+=sxyfGk2&w`%fhJbs|%lhc|J+|-14zv~?LTOmq#^1BWF@k&i@QJ~Nhvzpps z+by?+l$-x3laWl`=&>PEJhzjOn_*k)Qmw7;z{I&UZRdv_$K>|btpL-E4joy%2kk#x z;<`w_ojrY9q&sPrO3#H&^Ac~z;B;`LNlEC&$Bblunud%t-oogchLlZBTp`@Y8)9cb zc8m>=(j}r2qfHajM(ksZ#h8jQ2)Kvm)Mg?eV8F082M=7_E~(J*gFom zz-)(?F>!s5Roe;IM!q9%#!Nq_?Kw_6N|FzS@bd#&OMd3qk#$j98AA?STlq?Bxzw&L zGt3@@;AhQ@4A3UCYxJK?G(^zNR^qt^-zHJ@JR5#c>+tThSBHM= zEzq`xK18a~p=iX@5t9iOE@4JxgD8+nOXlM&lgeEw@a;qo#Kq6ZiUHz>NUR3ro?NSo zV2vdbpFtVuk5!p^@zE96bBLZI7UIX;egD_c=8FMJPi`tOu4yIw$pll0yp!xcbmbyl z-*xy*UgvRrd66i5aJ5>>}K# zjfxR(y(Son;H4(t9O-|4Rm(dbQ=%3;le3+x-yAm$@}D?yQp(SMXj+LqLn#zrzk=0E PZjJhNV!|;?+V}qfBp)Ih literal 0 HcmV?d00001 From c42f9595203d1b3bc7a18217a2751c53015ecff5 Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Sun, 7 May 2023 21:12:33 +0200 Subject: [PATCH 081/289] Framework esp32 2023.05.00 with Tasmota Core 2.0.9 (#18602) * Platform 2023.05.00 with Tasmota Core 2.0.9 --- .github/PULL_REQUEST_TEMPLATE.md | 2 +- CHANGELOG.md | 1 + platformio_tasmota32.ini | 2 +- 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index edb419e1c..9678c65c3 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -7,7 +7,7 @@ - [ ] Only relevant files were touched - [ ] Only one feature/fix was added per PR and the code change compiles without warnings - [ ] The code change is tested and works with Tasmota core ESP8266 V.2.7.4.9 - - [ ] The code change is tested and works with Tasmota core ESP32 V.2.0.8 + - [ ] The code change is tested and works with Tasmota core ESP32 V.2.0.9 - [ ] I accept the [CLA](https://github.com/arendst/Tasmota/blob/development/CONTRIBUTING.md#contributor-license-agreement-cla). _NOTE: The code change must pass CI tests. **Your PR cannot be merged unless tests pass**_ diff --git a/CHANGELOG.md b/CHANGELOG.md index d08bad6d0..7647f1ba8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -18,6 +18,7 @@ All notable changes to this project will be documented in this file. - Change command ``FileUpload`` index binary data detection from >199 to >299 ### Changed +- ESP32 Framework (Core) from v2.0.8 to v2.0.9 ### Fixed - Partition_Manager.tapp fixed diff --git a/platformio_tasmota32.ini b/platformio_tasmota32.ini index 9582375b2..bb7b37244 100644 --- a/platformio_tasmota32.ini +++ b/platformio_tasmota32.ini @@ -42,7 +42,7 @@ extra_scripts = pre:pio-tools/add_c_flags.py ${esp_defaults.extra_scripts} [core32] -platform = https://github.com/tasmota/platform-espressif32/releases/download/2023.04.02/platform-espressif32.zip +platform = https://github.com/tasmota/platform-espressif32/releases/download/2023.05.00/platform-espressif32.zip platform_packages = build_unflags = ${esp32_defaults.build_unflags} build_flags = ${esp32_defaults.build_flags} From ba9c7651a785d393a66b62bd4deeb17e596871d3 Mon Sep 17 00:00:00 2001 From: s-hadinger <49731213+s-hadinger@users.noreply.github.com> Date: Sun, 7 May 2023 22:13:27 +0200 Subject: [PATCH 082/289] Fix solidification (#18603) --- .../solidified_Matter_Plugin_ShutterTilt.h | 166 ++++++++---------- .../src/solidify/solidified_Matter_TLV.h | 22 +-- 2 files changed, 89 insertions(+), 99 deletions(-) diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_ShutterTilt.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_ShutterTilt.h index 99038f799..2d6d0445e 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_ShutterTilt.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_ShutterTilt.h @@ -215,7 +215,7 @@ be_local_closure(Matter_Plugin_ShutterTilt_read_attribute, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[24]) { /* constants */ + ( &(const bvalue[21]) { /* constants */ /* K0 */ be_nested_str_weak(string), /* K1 */ be_nested_str_weak(matter), /* K2 */ be_nested_str_weak(TLV), @@ -232,18 +232,15 @@ be_local_closure(Matter_Plugin_ShutterTilt_read_attribute, /* name */ /* K13 */ be_nested_str_weak(scale_uint), /* K14 */ be_nested_str_weak(shadow_shutter_tilt), /* K15 */ be_const_int(0), - /* K16 */ be_nested_str_weak(log), - /* K17 */ be_nested_str_weak(format), - /* K18 */ be_nested_str_weak(MATTER_X3A_X20new_X20percent_X20_X25d), - /* K19 */ be_nested_str_weak(U2), - /* K20 */ be_nested_str_weak(NULL), - /* K21 */ be_nested_str_weak(U4), - /* K22 */ be_const_int(3), - /* K23 */ be_nested_str_weak(read_attribute), + /* K16 */ be_nested_str_weak(U2), + /* K17 */ be_nested_str_weak(NULL), + /* K18 */ be_nested_str_weak(U4), + /* K19 */ be_const_int(3), + /* K20 */ be_nested_str_weak(read_attribute), }), be_str_weak(read_attribute), &be_const_str_solidified, - ( &(const binstruction[120]) { /* code */ + ( &(const binstruction[113]) { /* code */ 0xA40E0000, // 0000 IMPORT R3 K0 0xB8120200, // 0001 GETNGBL R4 K1 0x88100902, // 0002 GETMBR R4 R4 K2 @@ -251,7 +248,7 @@ be_local_closure(Matter_Plugin_ShutterTilt_read_attribute, /* name */ 0x88180504, // 0004 GETMBR R6 R2 K4 0x541E0101, // 0005 LDINT R7 258 0x1C1C0A07, // 0006 EQ R7 R5 R7 - 0x781E0067, // 0007 JMPF R7 #0070 + 0x781E0060, // 0007 JMPF R7 #0069 0x8C1C0105, // 0008 GETMET R7 R0 K5 0x7C1C0200, // 0009 CALL R7 1 0x541E0006, // 000A LDINT R7 7 @@ -265,20 +262,20 @@ be_local_closure(Matter_Plugin_ShutterTilt_read_attribute, /* name */ 0x0028140B, // 0012 ADD R10 R10 R11 0x7C1C0600, // 0013 CALL R7 3 0x80040E00, // 0014 RET 1 R7 - 0x70020059, // 0015 JMP #0070 + 0x70020052, // 0015 JMP #0069 0x541E000E, // 0016 LDINT R7 15 0x1C1C0C07, // 0017 EQ R7 R6 R7 - 0x781E0028, // 0018 JMPF R7 #0042 + 0x781E0021, // 0018 JMPF R7 #003B 0x8C1C0109, // 0019 GETMET R7 R0 K9 0x7C1C0200, // 001A CALL R7 1 0x881C010A, // 001B GETMBR R7 R0 K10 0x4C200000, // 001C LDNIL R8 0x201C0E08, // 001D NE R7 R7 R8 - 0x781E001C, // 001E JMPF R7 #003C + 0x781E0015, // 001E JMPF R7 #0035 0x881C010B, // 001F GETMBR R7 R0 K11 0x4C200000, // 0020 LDNIL R8 0x201C0E08, // 0021 NE R7 R7 R8 - 0x781E0018, // 0022 JMPF R7 #003C + 0x781E0011, // 0022 JMPF R7 #0035 0xB81E1800, // 0023 GETNGBL R7 K12 0x8C1C0F0D, // 0024 GETMET R7 R7 K13 0x8824010E, // 0025 GETMBR R9 R0 K14 @@ -291,79 +288,72 @@ be_local_closure(Matter_Plugin_ShutterTilt_read_attribute, /* name */ 0x5830000F, // 002C LDCONST R12 K15 0x5436270F, // 002D LDINT R13 10000 0x7C1C0C00, // 002E CALL R7 6 - 0xB8221800, // 002F GETNGBL R8 K12 - 0x8C201110, // 0030 GETMET R8 R8 K16 - 0x8C280711, // 0031 GETMET R10 R3 K17 - 0x58300012, // 0032 LDCONST R12 K18 - 0x5C340E00, // 0033 MOVE R13 R7 - 0x7C280600, // 0034 CALL R10 3 - 0x7C200400, // 0035 CALL R8 2 - 0x8C200906, // 0036 GETMET R8 R4 K6 - 0x88280913, // 0037 GETMBR R10 R4 K19 - 0x5C2C0E00, // 0038 MOVE R11 R7 - 0x7C200600, // 0039 CALL R8 3 - 0x80041000, // 003A RET 1 R8 - 0x70020004, // 003B JMP #0041 - 0x8C1C0906, // 003C GETMET R7 R4 K6 - 0x88240914, // 003D GETMBR R9 R4 K20 - 0x4C280000, // 003E LDNIL R10 - 0x7C1C0600, // 003F CALL R7 3 - 0x80040E00, // 0040 RET 1 R7 - 0x7002002D, // 0041 JMP #0070 - 0x541E000B, // 0042 LDINT R7 12 - 0x1C1C0C07, // 0043 EQ R7 R6 R7 - 0x781E001F, // 0044 JMPF R7 #0065 - 0x881C010A, // 0045 GETMBR R7 R0 K10 - 0x4C200000, // 0046 LDNIL R8 - 0x201C0E08, // 0047 NE R7 R7 R8 - 0x781E0015, // 0048 JMPF R7 #005F - 0x881C010B, // 0049 GETMBR R7 R0 K11 - 0x4C200000, // 004A LDNIL R8 - 0x201C0E08, // 004B NE R7 R7 R8 - 0x781E0011, // 004C JMPF R7 #005F - 0xB81E1800, // 004D GETNGBL R7 K12 - 0x8C1C0F0D, // 004E GETMET R7 R7 K13 - 0x8824010E, // 004F GETMBR R9 R0 K14 - 0x8828010A, // 0050 GETMBR R10 R0 K10 - 0x0424120A, // 0051 SUB R9 R9 R10 - 0x5828000F, // 0052 LDCONST R10 K15 - 0x882C010B, // 0053 GETMBR R11 R0 K11 - 0x8830010A, // 0054 GETMBR R12 R0 K10 - 0x042C160C, // 0055 SUB R11 R11 R12 - 0x5830000F, // 0056 LDCONST R12 K15 - 0x5436270F, // 0057 LDINT R13 10000 - 0x7C1C0C00, // 0058 CALL R7 6 - 0x8C200906, // 0059 GETMET R8 R4 K6 - 0x88280913, // 005A GETMBR R10 R4 K19 - 0x5C2C0E00, // 005B MOVE R11 R7 - 0x7C200600, // 005C CALL R8 3 - 0x80041000, // 005D RET 1 R8 - 0x70020004, // 005E JMP #0064 - 0x8C1C0906, // 005F GETMET R7 R4 K6 - 0x88240914, // 0060 GETMBR R9 R4 K20 - 0x4C280000, // 0061 LDNIL R10 - 0x7C1C0600, // 0062 CALL R7 3 - 0x80040E00, // 0063 RET 1 R7 - 0x7002000A, // 0064 JMP #0070 - 0x541EFFFB, // 0065 LDINT R7 65532 - 0x1C1C0C07, // 0066 EQ R7 R6 R7 - 0x781E0007, // 0067 JMPF R7 #0070 - 0x8C1C0906, // 0068 GETMET R7 R4 K6 - 0x88240915, // 0069 GETMBR R9 R4 K21 - 0x542A0003, // 006A LDINT R10 4 - 0x002A2C0A, // 006B ADD R10 K22 R10 - 0x542E000F, // 006C LDINT R11 16 - 0x0028140B, // 006D ADD R10 R10 R11 - 0x7C1C0600, // 006E CALL R7 3 - 0x80040E00, // 006F RET 1 R7 - 0x601C0003, // 0070 GETGBL R7 G3 - 0x5C200000, // 0071 MOVE R8 R0 - 0x7C1C0200, // 0072 CALL R7 1 - 0x8C1C0F17, // 0073 GETMET R7 R7 K23 - 0x5C240200, // 0074 MOVE R9 R1 - 0x5C280400, // 0075 MOVE R10 R2 - 0x7C1C0600, // 0076 CALL R7 3 - 0x80040E00, // 0077 RET 1 R7 + 0x8C200906, // 002F GETMET R8 R4 K6 + 0x88280910, // 0030 GETMBR R10 R4 K16 + 0x5C2C0E00, // 0031 MOVE R11 R7 + 0x7C200600, // 0032 CALL R8 3 + 0x80041000, // 0033 RET 1 R8 + 0x70020004, // 0034 JMP #003A + 0x8C1C0906, // 0035 GETMET R7 R4 K6 + 0x88240911, // 0036 GETMBR R9 R4 K17 + 0x4C280000, // 0037 LDNIL R10 + 0x7C1C0600, // 0038 CALL R7 3 + 0x80040E00, // 0039 RET 1 R7 + 0x7002002D, // 003A JMP #0069 + 0x541E000B, // 003B LDINT R7 12 + 0x1C1C0C07, // 003C EQ R7 R6 R7 + 0x781E001F, // 003D JMPF R7 #005E + 0x881C010A, // 003E GETMBR R7 R0 K10 + 0x4C200000, // 003F LDNIL R8 + 0x201C0E08, // 0040 NE R7 R7 R8 + 0x781E0015, // 0041 JMPF R7 #0058 + 0x881C010B, // 0042 GETMBR R7 R0 K11 + 0x4C200000, // 0043 LDNIL R8 + 0x201C0E08, // 0044 NE R7 R7 R8 + 0x781E0011, // 0045 JMPF R7 #0058 + 0xB81E1800, // 0046 GETNGBL R7 K12 + 0x8C1C0F0D, // 0047 GETMET R7 R7 K13 + 0x8824010E, // 0048 GETMBR R9 R0 K14 + 0x8828010A, // 0049 GETMBR R10 R0 K10 + 0x0424120A, // 004A SUB R9 R9 R10 + 0x5828000F, // 004B LDCONST R10 K15 + 0x882C010B, // 004C GETMBR R11 R0 K11 + 0x8830010A, // 004D GETMBR R12 R0 K10 + 0x042C160C, // 004E SUB R11 R11 R12 + 0x5830000F, // 004F LDCONST R12 K15 + 0x5436270F, // 0050 LDINT R13 10000 + 0x7C1C0C00, // 0051 CALL R7 6 + 0x8C200906, // 0052 GETMET R8 R4 K6 + 0x88280910, // 0053 GETMBR R10 R4 K16 + 0x5C2C0E00, // 0054 MOVE R11 R7 + 0x7C200600, // 0055 CALL R8 3 + 0x80041000, // 0056 RET 1 R8 + 0x70020004, // 0057 JMP #005D + 0x8C1C0906, // 0058 GETMET R7 R4 K6 + 0x88240911, // 0059 GETMBR R9 R4 K17 + 0x4C280000, // 005A LDNIL R10 + 0x7C1C0600, // 005B CALL R7 3 + 0x80040E00, // 005C RET 1 R7 + 0x7002000A, // 005D JMP #0069 + 0x541EFFFB, // 005E LDINT R7 65532 + 0x1C1C0C07, // 005F EQ R7 R6 R7 + 0x781E0007, // 0060 JMPF R7 #0069 + 0x8C1C0906, // 0061 GETMET R7 R4 K6 + 0x88240912, // 0062 GETMBR R9 R4 K18 + 0x542A0003, // 0063 LDINT R10 4 + 0x002A260A, // 0064 ADD R10 K19 R10 + 0x542E000F, // 0065 LDINT R11 16 + 0x0028140B, // 0066 ADD R10 R10 R11 + 0x7C1C0600, // 0067 CALL R7 3 + 0x80040E00, // 0068 RET 1 R7 + 0x601C0003, // 0069 GETGBL R7 G3 + 0x5C200000, // 006A MOVE R8 R0 + 0x7C1C0200, // 006B CALL R7 1 + 0x8C1C0F14, // 006C GETMET R7 R7 K20 + 0x5C240200, // 006D MOVE R9 R1 + 0x5C280400, // 006E MOVE R10 R2 + 0x7C1C0600, // 006F CALL R7 3 + 0x80040E00, // 0070 RET 1 R7 }) ) ); diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_TLV.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_TLV.h index b1e3292f3..6cc6300b0 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_TLV.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_TLV.h @@ -3282,18 +3282,18 @@ be_local_class(Matter_TLV, be_const_int(0), be_const_int(4), be_const_int(8), - be_const_int(-1), - be_const_int(-2), - be_const_int(-4), - be_const_int(-8), - be_const_int(-1), - be_const_int(-2), - be_const_int(-4), - be_const_int(-8), + be_const_int(4294967295), + be_const_int(4294967294), + be_const_int(4294967292), + be_const_int(4294967288), + be_const_int(4294967295), + be_const_int(4294967294), + be_const_int(4294967292), + be_const_int(4294967288), be_const_int(0), - be_const_int(-99), - be_const_int(-99), - be_const_int(-99), + be_const_int(4294967197), + be_const_int(4294967197), + be_const_int(4294967197), be_const_int(0), })) ) } )) }, { be_const_key_weak(EOC, -1), be_const_int(24) }, From ae6d435aaf94aa2e2f2d6e890ec57e931fd248dc Mon Sep 17 00:00:00 2001 From: s-hadinger <49731213+s-hadinger@users.noreply.github.com> Date: Sun, 7 May 2023 22:58:27 +0200 Subject: [PATCH 083/289] autoconf extract `display.ini` to file system (#18604) --- CHANGELOG.md | 1 + .../src/embedded/autoconf_module.be | 107 +++-- .../src/solidify/solidified_autoconf_module.h | 403 ++++++++++-------- 3 files changed, 290 insertions(+), 221 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7647f1ba8..82af71df8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -19,6 +19,7 @@ All notable changes to this project will be documented in this file. ### Changed - ESP32 Framework (Core) from v2.0.8 to v2.0.9 +- autoconf extract `display.ini` to file system ### Fixed - Partition_Manager.tapp fixed diff --git a/lib/libesp32/berry_tasmota/src/embedded/autoconf_module.be b/lib/libesp32/berry_tasmota/src/embedded/autoconf_module.be index d285ee533..42d573306 100644 --- a/lib/libesp32/berry_tasmota/src/embedded/autoconf_module.be +++ b/lib/libesp32/berry_tasmota/src/embedded/autoconf_module.be @@ -1,22 +1,6 @@ -#- autocong module for Berry -# -#- -# -#- To solidify: -# -#- - # load only persis_module and persist_module.init - import autoconf - solidify.dump(autoconf_module) - # copy and paste into `be_autoconf_lib.c` --# -#- - -# For external compile: - -display = module("display") -self = nil -tasmota = nil -def load() end - --# +# autocong module for Berry +# +# var autoconf_module = module("autoconf") @@ -39,7 +23,7 @@ autoconf_module.init = def (m) if string.find(dir[i], ".autoconf") > 0 # does the file contain '*.autoconf', >0 to skip `.autoconf` if entry != nil # we have multiple configuration files, not allowed - print(string.format("CFG: multiple autoconf files found, aborting ('%s' + '%s')", entry, dir[i])) + tasmota.log(string.format("CFG: multiple autoconf files found, aborting ('%s' + '%s')", entry, dir[i]), 2) self._error = true return nil end @@ -57,9 +41,9 @@ autoconf_module.init = def (m) end - # #################################################################################################### + ##################################################################################################### # Manage first time marker - # #################################################################################################### + ##################################################################################################### def is_first_time() import path return !path.exists("/.autoconf") @@ -73,9 +57,9 @@ autoconf_module.init = def (m) path.remove("/.autoconf") end - # #################################################################################################### + ##################################################################################################### # Delete all autoconfig files present - # #################################################################################################### + ##################################################################################################### def delete_all_configs() import path import string @@ -88,11 +72,11 @@ autoconf_module.init = def (m) end end - # #################################################################################################### + ##################################################################################################### # Get current module # contains the name of the archive without leading `/`, ex: `M5Stack_Fire.autoconf` # or `nil` if none - # #################################################################################################### + ##################################################################################################### def get_current_module_path() return self._archive end @@ -100,9 +84,9 @@ autoconf_module.init = def (m) return self._archive[0..-10] end - # #################################################################################################### + ##################################################################################################### # Load templates from Github - # #################################################################################################### + ##################################################################################################### def load_templates() import string import json @@ -135,9 +119,9 @@ autoconf_module.init = def (m) end end - # #################################################################################################### + ##################################################################################################### # Init web handlers - # #################################################################################################### + ##################################################################################################### # Displays a "Autoconf" button on the configuration page def web_add_config_button() import webserver @@ -197,11 +181,11 @@ autoconf_module.init = def (m) webserver.content_stop() end - # #################################################################################################### + ##################################################################################################### # Web controller # # Applies the changes and restart - # #################################################################################################### + ##################################################################################################### # This HTTP POST manager handles the submitted web form data def page_autoconf_ctl() import webserver @@ -293,7 +277,11 @@ autoconf_module.init = def (m) self._error = nil end + ##################################################################################################### + # preinit # called by the synthetic event `preinit` + # load and run `preinit.be` + ##################################################################################################### def preinit() if self._archive == nil return end # try to launch `preinit.be` @@ -307,6 +295,10 @@ autoconf_module.init = def (m) end end + ##################################################################################################### + # run_bat + # load and run `.bat` file as Tasmota commands + ##################################################################################################### def run_bat(fname) # read a '*.bat' file and run each command import string var f @@ -323,17 +315,26 @@ autoconf_module.init = def (m) end f.close() # close, we don't expect exception with read-only, could be added later though except .. as e, m - print(string.format('CFG: could not run %s (%s - %s)', fname, e, m)) - f.close() + tasmota.log(string.format('CFG: could not run %s (%s - %s)', fname, e, m), 1) + if f != nil f.close() end end end + ##################################################################################################### + # autoexec # called by the synthetic event `autoexec` + # + # Step 1. if first run, only apply `init.bat` + # Step 2. if '#display.ini' is present, and first run or `display.ini` nor present, extract and copy + # Step 3. if 'autoexec.bat' is present, run it + # Step 4. if 'autoexec.be' is present, load it + ##################################################################################################### def autoexec() if self._archive == nil return end # try to launch `preinit.be` import path + var reboot = false # Step 1. if first run, only apply `init.bat` var fname = self._archive + '#init.bat' if self.is_first_time() && path.exists(fname) @@ -343,23 +344,39 @@ autoconf_module.init = def (m) # if path.exists(fname) # we know it exists from initial test self.run_bat(fname) tasmota.log("CFG: 'init.bat' done, restarting", 2) - tasmota.cmd("Restart 1") + reboot = true return # if init was run, force a restart anyways and don't run the remaining code # end end - # Step 2. if 'display.ini' is present, launch Universal Display + # Step 2. if 'display.ini' is present, copy it to file system (first run or if not already in file system) fname = self._archive + '#display.ini' - if gpio.pin_used(gpio.OPTION_A, 2) && path.exists(fname) - if path.exists("display.ini") - tasmota.log("CFG: skipping 'display.ini' because already present in file-system", 2) - else - import display - var f = open(fname,"r") - var desc = f.read() - f.close() - display.start(desc) + if path.exists(fname) && (self.is_first_time() || !path.exists('display.ini')) + # create the '.autoconf' file to avoid running it again, even if it crashed + if (self.is_first_time() && !reboot) # we may have already created it with init.bat + self.set_first_time() end + + var f, f_out + try + f = open(fname, "r") + f_out = open("display.ini", "w") + var content = f.readbytes() + f_out.write(content) + f.close() + f_out.close() + reboot = true + tasmota.log("CFG: 'display.ini' extracted, restarting", 2) + except .. as e, m + print(string.format("CFG: could not copy 'display.ini' (%s - %s)'", e, m)) + if f != nil f.close() end + if f_out != nil f_out.close() end + end + end + + if reboot + tasmota.cmd("Restart 1") + return end # Step 3. if 'autoexec.bat' is present, run it diff --git a/lib/libesp32/berry_tasmota/src/solidify/solidified_autoconf_module.h b/lib/libesp32/berry_tasmota/src/solidify/solidified_autoconf_module.h index 7e11b1145..c427f18dd 100644 --- a/lib/libesp32/berry_tasmota/src/solidify/solidified_autoconf_module.h +++ b/lib/libesp32/berry_tasmota/src/solidify/solidified_autoconf_module.h @@ -193,7 +193,7 @@ be_local_closure(Autoconf_page_autoconf_ctl, /* name */ ********************************************************************/ be_local_closure(Autoconf_autoexec, /* name */ be_nested_proto( - 9, /* nstack */ + 14, /* nstack */ 1, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -213,19 +213,19 @@ be_local_closure(Autoconf_autoexec, /* name */ /* K8 */ be_nested_str(log), /* K9 */ be_nested_str(CFG_X3A_X20_X27init_X2Ebat_X27_X20done_X2C_X20restarting), /* K10 */ be_const_int(2), - /* K11 */ be_nested_str(cmd), - /* K12 */ be_nested_str(Restart_X201), - /* K13 */ be_nested_str(_X23display_X2Eini), - /* K14 */ be_nested_str(gpio), - /* K15 */ be_nested_str(pin_used), - /* K16 */ be_nested_str(OPTION_A), - /* K17 */ be_nested_str(display_X2Eini), - /* K18 */ be_nested_str(CFG_X3A_X20skipping_X20_X27display_X2Eini_X27_X20because_X20already_X20present_X20in_X20file_X2Dsystem), - /* K19 */ be_nested_str(display), - /* K20 */ be_nested_str(r), - /* K21 */ be_nested_str(read), - /* K22 */ be_nested_str(close), - /* K23 */ be_nested_str(start), + /* K11 */ be_nested_str(_X23display_X2Eini), + /* K12 */ be_nested_str(display_X2Eini), + /* K13 */ be_nested_str(r), + /* K14 */ be_nested_str(w), + /* K15 */ be_nested_str(readbytes), + /* K16 */ be_nested_str(write), + /* K17 */ be_nested_str(close), + /* K18 */ be_nested_str(CFG_X3A_X20_X27display_X2Eini_X27_X20extracted_X2C_X20restarting), + /* K19 */ be_nested_str(string), + /* K20 */ be_nested_str(format), + /* K21 */ be_nested_str(CFG_X3A_X20could_X20not_X20copy_X20_X27display_X2Eini_X27_X20_X28_X25s_X20_X2D_X20_X25s_X29_X27), + /* K22 */ be_nested_str(cmd), + /* K23 */ be_nested_str(Restart_X201), /* K24 */ be_nested_str(_X23autoexec_X2Ebat), /* K25 */ be_nested_str(CFG_X3A_X20running_X20), /* K26 */ be_const_int(3), @@ -237,114 +237,155 @@ be_local_closure(Autoconf_autoexec, /* name */ }), &be_const_str_autoexec, &be_const_str_solidified, - ( &(const binstruction[107]) { /* code */ + ( &(const binstruction[148]) { /* code */ 0x88040100, // 0000 GETMBR R1 R0 K0 0x4C080000, // 0001 LDNIL R2 0x1C040202, // 0002 EQ R1 R1 R2 0x78060000, // 0003 JMPF R1 #0005 0x80000200, // 0004 RET 0 0xA4060200, // 0005 IMPORT R1 K1 - 0x88080100, // 0006 GETMBR R2 R0 K0 - 0x00080502, // 0007 ADD R2 R2 K2 - 0x8C0C0103, // 0008 GETMET R3 R0 K3 - 0x7C0C0200, // 0009 CALL R3 1 - 0x780E0012, // 000A JMPF R3 #001E - 0x8C0C0304, // 000B GETMET R3 R1 K4 - 0x5C140400, // 000C MOVE R5 R2 - 0x7C0C0400, // 000D CALL R3 2 - 0x780E000E, // 000E JMPF R3 #001E - 0x8C0C0105, // 000F GETMET R3 R0 K5 - 0x7C0C0200, // 0010 CALL R3 1 - 0x8C0C0106, // 0011 GETMET R3 R0 K6 - 0x5C140400, // 0012 MOVE R5 R2 - 0x7C0C0400, // 0013 CALL R3 2 - 0xB80E0E00, // 0014 GETNGBL R3 K7 - 0x8C0C0708, // 0015 GETMET R3 R3 K8 - 0x58140009, // 0016 LDCONST R5 K9 - 0x5818000A, // 0017 LDCONST R6 K10 - 0x7C0C0600, // 0018 CALL R3 3 - 0xB80E0E00, // 0019 GETNGBL R3 K7 - 0x8C0C070B, // 001A GETMET R3 R3 K11 - 0x5814000C, // 001B LDCONST R5 K12 - 0x7C0C0400, // 001C CALL R3 2 - 0x80000600, // 001D RET 0 - 0x880C0100, // 001E GETMBR R3 R0 K0 - 0x000C070D, // 001F ADD R3 R3 K13 - 0x5C080600, // 0020 MOVE R2 R3 - 0xB80E1C00, // 0021 GETNGBL R3 K14 - 0x8C0C070F, // 0022 GETMET R3 R3 K15 - 0xB8161C00, // 0023 GETNGBL R5 K14 - 0x88140B10, // 0024 GETMBR R5 R5 K16 - 0x5818000A, // 0025 LDCONST R6 K10 - 0x7C0C0600, // 0026 CALL R3 3 - 0x780E0019, // 0027 JMPF R3 #0042 - 0x8C0C0304, // 0028 GETMET R3 R1 K4 - 0x5C140400, // 0029 MOVE R5 R2 - 0x7C0C0400, // 002A CALL R3 2 - 0x780E0015, // 002B JMPF R3 #0042 - 0x8C0C0304, // 002C GETMET R3 R1 K4 - 0x58140011, // 002D LDCONST R5 K17 - 0x7C0C0400, // 002E CALL R3 2 - 0x780E0005, // 002F JMPF R3 #0036 - 0xB80E0E00, // 0030 GETNGBL R3 K7 - 0x8C0C0708, // 0031 GETMET R3 R3 K8 - 0x58140012, // 0032 LDCONST R5 K18 - 0x5818000A, // 0033 LDCONST R6 K10 - 0x7C0C0600, // 0034 CALL R3 3 - 0x7002000B, // 0035 JMP #0042 - 0xA40E2600, // 0036 IMPORT R3 K19 - 0x60100011, // 0037 GETGBL R4 G17 - 0x5C140400, // 0038 MOVE R5 R2 - 0x58180014, // 0039 LDCONST R6 K20 - 0x7C100400, // 003A CALL R4 2 - 0x8C140915, // 003B GETMET R5 R4 K21 - 0x7C140200, // 003C CALL R5 1 - 0x8C180916, // 003D GETMET R6 R4 K22 - 0x7C180200, // 003E CALL R6 1 - 0x8C180717, // 003F GETMET R6 R3 K23 - 0x5C200A00, // 0040 MOVE R8 R5 - 0x7C180400, // 0041 CALL R6 2 - 0x880C0100, // 0042 GETMBR R3 R0 K0 - 0x000C0718, // 0043 ADD R3 R3 K24 - 0x5C080600, // 0044 MOVE R2 R3 - 0x8C0C0304, // 0045 GETMET R3 R1 K4 - 0x5C140400, // 0046 MOVE R5 R2 - 0x7C0C0400, // 0047 CALL R3 2 - 0x780E000C, // 0048 JMPF R3 #0056 - 0xB80E0E00, // 0049 GETNGBL R3 K7 - 0x8C0C0708, // 004A GETMET R3 R3 K8 - 0x00163202, // 004B ADD R5 K25 R2 - 0x5818001A, // 004C LDCONST R6 K26 - 0x7C0C0600, // 004D CALL R3 3 - 0x8C0C0106, // 004E GETMET R3 R0 K6 - 0x5C140400, // 004F MOVE R5 R2 - 0x7C0C0400, // 0050 CALL R3 2 - 0xB80E0E00, // 0051 GETNGBL R3 K7 - 0x8C0C0708, // 0052 GETMET R3 R3 K8 - 0x00163602, // 0053 ADD R5 K27 R2 - 0x5818001A, // 0054 LDCONST R6 K26 - 0x7C0C0600, // 0055 CALL R3 3 - 0x880C0100, // 0056 GETMBR R3 R0 K0 - 0x000C071C, // 0057 ADD R3 R3 K28 - 0x5C080600, // 0058 MOVE R2 R3 - 0x8C0C0304, // 0059 GETMET R3 R1 K4 - 0x5C140400, // 005A MOVE R5 R2 - 0x7C0C0400, // 005B CALL R3 2 - 0x780E000C, // 005C JMPF R3 #006A - 0xB80E0E00, // 005D GETNGBL R3 K7 - 0x8C0C0708, // 005E GETMET R3 R3 K8 - 0x00163A02, // 005F ADD R5 K29 R2 - 0x5818001A, // 0060 LDCONST R6 K26 - 0x7C0C0600, // 0061 CALL R3 3 - 0xB80E3C00, // 0062 GETNGBL R3 K30 - 0x5C100400, // 0063 MOVE R4 R2 - 0x7C0C0200, // 0064 CALL R3 1 - 0xB80E0E00, // 0065 GETNGBL R3 K7 - 0x8C0C0708, // 0066 GETMET R3 R3 K8 - 0x00163E02, // 0067 ADD R5 K31 R2 - 0x5818001A, // 0068 LDCONST R6 K26 - 0x7C0C0600, // 0069 CALL R3 3 - 0x80000000, // 006A RET 0 + 0x50080000, // 0006 LDBOOL R2 0 0 + 0x880C0100, // 0007 GETMBR R3 R0 K0 + 0x000C0702, // 0008 ADD R3 R3 K2 + 0x8C100103, // 0009 GETMET R4 R0 K3 + 0x7C100200, // 000A CALL R4 1 + 0x7812000F, // 000B JMPF R4 #001C + 0x8C100304, // 000C GETMET R4 R1 K4 + 0x5C180600, // 000D MOVE R6 R3 + 0x7C100400, // 000E CALL R4 2 + 0x7812000B, // 000F JMPF R4 #001C + 0x8C100105, // 0010 GETMET R4 R0 K5 + 0x7C100200, // 0011 CALL R4 1 + 0x8C100106, // 0012 GETMET R4 R0 K6 + 0x5C180600, // 0013 MOVE R6 R3 + 0x7C100400, // 0014 CALL R4 2 + 0xB8120E00, // 0015 GETNGBL R4 K7 + 0x8C100908, // 0016 GETMET R4 R4 K8 + 0x58180009, // 0017 LDCONST R6 K9 + 0x581C000A, // 0018 LDCONST R7 K10 + 0x7C100600, // 0019 CALL R4 3 + 0x50080200, // 001A LDBOOL R2 1 0 + 0x80000800, // 001B RET 0 + 0x88100100, // 001C GETMBR R4 R0 K0 + 0x0010090B, // 001D ADD R4 R4 K11 + 0x5C0C0800, // 001E MOVE R3 R4 + 0x8C100304, // 001F GETMET R4 R1 K4 + 0x5C180600, // 0020 MOVE R6 R3 + 0x7C100400, // 0021 CALL R4 2 + 0x78120041, // 0022 JMPF R4 #0065 + 0x8C100103, // 0023 GETMET R4 R0 K3 + 0x7C100200, // 0024 CALL R4 1 + 0x74120003, // 0025 JMPT R4 #002A + 0x8C100304, // 0026 GETMET R4 R1 K4 + 0x5818000C, // 0027 LDCONST R6 K12 + 0x7C100400, // 0028 CALL R4 2 + 0x7412003A, // 0029 JMPT R4 #0065 + 0x8C100103, // 002A GETMET R4 R0 K3 + 0x7C100200, // 002B CALL R4 1 + 0x78120003, // 002C JMPF R4 #0031 + 0x5C100400, // 002D MOVE R4 R2 + 0x74120001, // 002E JMPT R4 #0031 + 0x8C100105, // 002F GETMET R4 R0 K5 + 0x7C100200, // 0030 CALL R4 1 + 0x4C100000, // 0031 LDNIL R4 + 0x4C140000, // 0032 LDNIL R5 + 0xA802001A, // 0033 EXBLK 0 #004F + 0x60180011, // 0034 GETGBL R6 G17 + 0x5C1C0600, // 0035 MOVE R7 R3 + 0x5820000D, // 0036 LDCONST R8 K13 + 0x7C180400, // 0037 CALL R6 2 + 0x5C100C00, // 0038 MOVE R4 R6 + 0x60180011, // 0039 GETGBL R6 G17 + 0x581C000C, // 003A LDCONST R7 K12 + 0x5820000E, // 003B LDCONST R8 K14 + 0x7C180400, // 003C CALL R6 2 + 0x5C140C00, // 003D MOVE R5 R6 + 0x8C18090F, // 003E GETMET R6 R4 K15 + 0x7C180200, // 003F CALL R6 1 + 0x8C1C0B10, // 0040 GETMET R7 R5 K16 + 0x5C240C00, // 0041 MOVE R9 R6 + 0x7C1C0400, // 0042 CALL R7 2 + 0x8C1C0911, // 0043 GETMET R7 R4 K17 + 0x7C1C0200, // 0044 CALL R7 1 + 0x8C1C0B11, // 0045 GETMET R7 R5 K17 + 0x7C1C0200, // 0046 CALL R7 1 + 0x50080200, // 0047 LDBOOL R2 1 0 + 0xB81E0E00, // 0048 GETNGBL R7 K7 + 0x8C1C0F08, // 0049 GETMET R7 R7 K8 + 0x58240012, // 004A LDCONST R9 K18 + 0x5828000A, // 004B LDCONST R10 K10 + 0x7C1C0600, // 004C CALL R7 3 + 0xA8040001, // 004D EXBLK 1 1 + 0x70020015, // 004E JMP #0065 + 0xAC180002, // 004F CATCH R6 0 2 + 0x70020012, // 0050 JMP #0064 + 0x60200001, // 0051 GETGBL R8 G1 + 0xB8262600, // 0052 GETNGBL R9 K19 + 0x8C241314, // 0053 GETMET R9 R9 K20 + 0x582C0015, // 0054 LDCONST R11 K21 + 0x5C300C00, // 0055 MOVE R12 R6 + 0x5C340E00, // 0056 MOVE R13 R7 + 0x7C240800, // 0057 CALL R9 4 + 0x7C200200, // 0058 CALL R8 1 + 0x4C200000, // 0059 LDNIL R8 + 0x20200808, // 005A NE R8 R4 R8 + 0x78220001, // 005B JMPF R8 #005E + 0x8C200911, // 005C GETMET R8 R4 K17 + 0x7C200200, // 005D CALL R8 1 + 0x4C200000, // 005E LDNIL R8 + 0x20200A08, // 005F NE R8 R5 R8 + 0x78220001, // 0060 JMPF R8 #0063 + 0x8C200B11, // 0061 GETMET R8 R5 K17 + 0x7C200200, // 0062 CALL R8 1 + 0x70020000, // 0063 JMP #0065 + 0xB0080000, // 0064 RAISE 2 R0 R0 + 0x780A0004, // 0065 JMPF R2 #006B + 0xB8120E00, // 0066 GETNGBL R4 K7 + 0x8C100916, // 0067 GETMET R4 R4 K22 + 0x58180017, // 0068 LDCONST R6 K23 + 0x7C100400, // 0069 CALL R4 2 + 0x80000800, // 006A RET 0 + 0x88100100, // 006B GETMBR R4 R0 K0 + 0x00100918, // 006C ADD R4 R4 K24 + 0x5C0C0800, // 006D MOVE R3 R4 + 0x8C100304, // 006E GETMET R4 R1 K4 + 0x5C180600, // 006F MOVE R6 R3 + 0x7C100400, // 0070 CALL R4 2 + 0x7812000C, // 0071 JMPF R4 #007F + 0xB8120E00, // 0072 GETNGBL R4 K7 + 0x8C100908, // 0073 GETMET R4 R4 K8 + 0x001A3203, // 0074 ADD R6 K25 R3 + 0x581C001A, // 0075 LDCONST R7 K26 + 0x7C100600, // 0076 CALL R4 3 + 0x8C100106, // 0077 GETMET R4 R0 K6 + 0x5C180600, // 0078 MOVE R6 R3 + 0x7C100400, // 0079 CALL R4 2 + 0xB8120E00, // 007A GETNGBL R4 K7 + 0x8C100908, // 007B GETMET R4 R4 K8 + 0x001A3603, // 007C ADD R6 K27 R3 + 0x581C001A, // 007D LDCONST R7 K26 + 0x7C100600, // 007E CALL R4 3 + 0x88100100, // 007F GETMBR R4 R0 K0 + 0x0010091C, // 0080 ADD R4 R4 K28 + 0x5C0C0800, // 0081 MOVE R3 R4 + 0x8C100304, // 0082 GETMET R4 R1 K4 + 0x5C180600, // 0083 MOVE R6 R3 + 0x7C100400, // 0084 CALL R4 2 + 0x7812000C, // 0085 JMPF R4 #0093 + 0xB8120E00, // 0086 GETNGBL R4 K7 + 0x8C100908, // 0087 GETMET R4 R4 K8 + 0x001A3A03, // 0088 ADD R6 K29 R3 + 0x581C001A, // 0089 LDCONST R7 K26 + 0x7C100600, // 008A CALL R4 3 + 0xB8123C00, // 008B GETNGBL R4 K30 + 0x5C140600, // 008C MOVE R5 R3 + 0x7C100200, // 008D CALL R4 1 + 0xB8120E00, // 008E GETNGBL R4 K7 + 0x8C100908, // 008F GETMET R4 R4 K8 + 0x001A3E03, // 0090 ADD R6 K31 R3 + 0x581C001A, // 0091 LDCONST R7 K26 + 0x7C100600, // 0092 CALL R4 3 + 0x80000000, // 0093 RET 0 }) ) ); @@ -356,7 +397,7 @@ be_local_closure(Autoconf_autoexec, /* name */ ********************************************************************/ be_local_closure(Autoconf_run_bat, /* name */ be_nested_proto( - 13, /* nstack */ + 14, /* nstack */ 2, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -364,7 +405,7 @@ be_local_closure(Autoconf_run_bat, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[11]) { /* constants */ + ( &(const bvalue[13]) { /* constants */ /* K0 */ be_nested_str(string), /* K1 */ be_nested_str(r), /* K2 */ be_nested_str(readline), @@ -374,12 +415,14 @@ be_local_closure(Autoconf_run_bat, /* name */ /* K6 */ be_nested_str(tasmota), /* K7 */ be_nested_str(cmd), /* K8 */ be_nested_str(close), - /* K9 */ be_nested_str(format), - /* K10 */ be_nested_str(CFG_X3A_X20could_X20not_X20run_X20_X25s_X20_X28_X25s_X20_X2D_X20_X25s_X29), + /* K9 */ be_nested_str(log), + /* K10 */ be_nested_str(format), + /* K11 */ be_nested_str(CFG_X3A_X20could_X20not_X20run_X20_X25s_X20_X28_X25s_X20_X2D_X20_X25s_X29), + /* K12 */ be_const_int(1), }), &be_const_str_run_bat, &be_const_str_solidified, - ( &(const binstruction[64]) { /* code */ + ( &(const binstruction[69]) { /* code */ 0xA40A0000, // 0000 IMPORT R2 K0 0x4C0C0000, // 0001 LDNIL R3 0xA802002D, // 0002 EXBLK 0 #0031 @@ -428,22 +471,27 @@ be_local_closure(Autoconf_run_bat, /* name */ 0x8C100708, // 002D GETMET R4 R3 K8 0x7C100200, // 002E CALL R4 1 0xA8040001, // 002F EXBLK 1 1 - 0x7002000D, // 0030 JMP #003F + 0x70020012, // 0030 JMP #0044 0xAC100002, // 0031 CATCH R4 0 2 - 0x7002000A, // 0032 JMP #003E - 0x60180001, // 0033 GETGBL R6 G1 - 0x8C1C0509, // 0034 GETMET R7 R2 K9 - 0x5824000A, // 0035 LDCONST R9 K10 - 0x5C280200, // 0036 MOVE R10 R1 - 0x5C2C0800, // 0037 MOVE R11 R4 - 0x5C300A00, // 0038 MOVE R12 R5 - 0x7C1C0A00, // 0039 CALL R7 5 - 0x7C180200, // 003A CALL R6 1 - 0x8C180708, // 003B GETMET R6 R3 K8 - 0x7C180200, // 003C CALL R6 1 - 0x70020000, // 003D JMP #003F - 0xB0080000, // 003E RAISE 2 R0 R0 - 0x80000000, // 003F RET 0 + 0x7002000F, // 0032 JMP #0043 + 0xB81A0C00, // 0033 GETNGBL R6 K6 + 0x8C180D09, // 0034 GETMET R6 R6 K9 + 0x8C20050A, // 0035 GETMET R8 R2 K10 + 0x5828000B, // 0036 LDCONST R10 K11 + 0x5C2C0200, // 0037 MOVE R11 R1 + 0x5C300800, // 0038 MOVE R12 R4 + 0x5C340A00, // 0039 MOVE R13 R5 + 0x7C200A00, // 003A CALL R8 5 + 0x5824000C, // 003B LDCONST R9 K12 + 0x7C180600, // 003C CALL R6 3 + 0x4C180000, // 003D LDNIL R6 + 0x20180606, // 003E NE R6 R3 R6 + 0x781A0001, // 003F JMPF R6 #0042 + 0x8C180708, // 0040 GETMET R6 R3 K8 + 0x7C180200, // 0041 CALL R6 1 + 0x70020000, // 0042 JMP #0044 + 0xB0080000, // 0043 RAISE 2 R0 R0 + 0x80000000, // 0044 RET 0 }) ) ); @@ -963,7 +1011,7 @@ be_local_closure(Autoconf_is_first_time, /* name */ ********************************************************************/ be_local_closure(Autoconf_init, /* name */ be_nested_proto( - 12, /* nstack */ + 13, /* nstack */ 1, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -971,7 +1019,7 @@ be_local_closure(Autoconf_init, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[17]) { /* constants */ + ( &(const bvalue[18]) { /* constants */ /* K0 */ be_nested_str(path), /* K1 */ be_nested_str(string), /* K2 */ be_nested_str(listdir), @@ -981,18 +1029,19 @@ be_local_closure(Autoconf_init, /* name */ /* K6 */ be_const_int(0), /* K7 */ be_nested_str(find), /* K8 */ be_nested_str(_X2Eautoconf), - /* K9 */ be_nested_str(format), - /* K10 */ be_nested_str(CFG_X3A_X20multiple_X20autoconf_X20files_X20found_X2C_X20aborting_X20_X28_X27_X25s_X27_X20_X2B_X20_X27_X25s_X27_X29), - /* K11 */ be_nested_str(_error), - /* K12 */ be_const_int(1), - /* K13 */ be_nested_str(log), - /* K14 */ be_nested_str(CFG_X3A_X20No_X20_X27_X2A_X2Eautoconf_X27_X20file_X20found), - /* K15 */ be_const_int(3), - /* K16 */ be_nested_str(_archive), + /* K9 */ be_nested_str(log), + /* K10 */ be_nested_str(format), + /* K11 */ be_nested_str(CFG_X3A_X20multiple_X20autoconf_X20files_X20found_X2C_X20aborting_X20_X28_X27_X25s_X27_X20_X2B_X20_X27_X25s_X27_X29), + /* K12 */ be_const_int(2), + /* K13 */ be_nested_str(_error), + /* K14 */ be_const_int(1), + /* K15 */ be_nested_str(CFG_X3A_X20No_X20_X27_X2A_X2Eautoconf_X27_X20file_X20found), + /* K16 */ be_const_int(3), + /* K17 */ be_nested_str(_archive), }), &be_const_str_init, &be_const_str_solidified, - ( &(const binstruction[51]) { /* code */ + ( &(const binstruction[53]) { /* code */ 0xA4060000, // 0000 IMPORT R1 K0 0xA40A0200, // 0001 IMPORT R2 K1 0x8C0C0302, // 0002 GETMET R3 R1 K2 @@ -1008,42 +1057,44 @@ be_local_closure(Autoconf_init, /* name */ 0x5C1C0600, // 000C MOVE R7 R3 0x7C180200, // 000D CALL R6 1 0x14180A06, // 000E LT R6 R5 R6 - 0x781A0016, // 000F JMPF R6 #0027 + 0x781A0018, // 000F JMPF R6 #0029 0x8C180507, // 0010 GETMET R6 R2 K7 0x94200605, // 0011 GETIDX R8 R3 R5 0x58240008, // 0012 LDCONST R9 K8 0x7C180600, // 0013 CALL R6 3 0x24180D06, // 0014 GT R6 R6 K6 - 0x781A000E, // 0015 JMPF R6 #0025 + 0x781A0010, // 0015 JMPF R6 #0027 0x4C180000, // 0016 LDNIL R6 0x20180806, // 0017 NE R6 R4 R6 - 0x781A000A, // 0018 JMPF R6 #0024 - 0x60180001, // 0019 GETGBL R6 G1 - 0x8C1C0509, // 001A GETMET R7 R2 K9 - 0x5824000A, // 001B LDCONST R9 K10 - 0x5C280800, // 001C MOVE R10 R4 - 0x942C0605, // 001D GETIDX R11 R3 R5 - 0x7C1C0800, // 001E CALL R7 4 - 0x7C180200, // 001F CALL R6 1 - 0x50180200, // 0020 LDBOOL R6 1 0 - 0x90021606, // 0021 SETMBR R0 K11 R6 - 0x4C180000, // 0022 LDNIL R6 - 0x80040C00, // 0023 RET 1 R6 - 0x94100605, // 0024 GETIDX R4 R3 R5 - 0x00140B0C, // 0025 ADD R5 R5 K12 - 0x7001FFE3, // 0026 JMP #000B - 0x4C180000, // 0027 LDNIL R6 - 0x1C180806, // 0028 EQ R6 R4 R6 - 0x781A0006, // 0029 JMPF R6 #0031 - 0xB81A0800, // 002A GETNGBL R6 K4 - 0x8C180D0D, // 002B GETMET R6 R6 K13 - 0x5820000E, // 002C LDCONST R8 K14 - 0x5824000F, // 002D LDCONST R9 K15 - 0x7C180600, // 002E CALL R6 3 - 0x4C180000, // 002F LDNIL R6 - 0x80040C00, // 0030 RET 1 R6 - 0x90022004, // 0031 SETMBR R0 K16 R4 - 0x80000000, // 0032 RET 0 + 0x781A000C, // 0018 JMPF R6 #0026 + 0xB81A0800, // 0019 GETNGBL R6 K4 + 0x8C180D09, // 001A GETMET R6 R6 K9 + 0x8C20050A, // 001B GETMET R8 R2 K10 + 0x5828000B, // 001C LDCONST R10 K11 + 0x5C2C0800, // 001D MOVE R11 R4 + 0x94300605, // 001E GETIDX R12 R3 R5 + 0x7C200800, // 001F CALL R8 4 + 0x5824000C, // 0020 LDCONST R9 K12 + 0x7C180600, // 0021 CALL R6 3 + 0x50180200, // 0022 LDBOOL R6 1 0 + 0x90021A06, // 0023 SETMBR R0 K13 R6 + 0x4C180000, // 0024 LDNIL R6 + 0x80040C00, // 0025 RET 1 R6 + 0x94100605, // 0026 GETIDX R4 R3 R5 + 0x00140B0E, // 0027 ADD R5 R5 K14 + 0x7001FFE1, // 0028 JMP #000B + 0x4C180000, // 0029 LDNIL R6 + 0x1C180806, // 002A EQ R6 R4 R6 + 0x781A0006, // 002B JMPF R6 #0033 + 0xB81A0800, // 002C GETNGBL R6 K4 + 0x8C180D09, // 002D GETMET R6 R6 K9 + 0x5820000F, // 002E LDCONST R8 K15 + 0x58240010, // 002F LDCONST R9 K16 + 0x7C180600, // 0030 CALL R6 3 + 0x4C180000, // 0031 LDNIL R6 + 0x80040C00, // 0032 RET 1 R6 + 0x90022204, // 0033 SETMBR R0 K17 R4 + 0x80000000, // 0034 RET 0 }) ) ); From cf60e34578574feb26d9638b79bc1659e92c05b2 Mon Sep 17 00:00:00 2001 From: Christian Baars Date: Mon, 8 May 2023 09:57:00 +0200 Subject: [PATCH 084/289] fix webcam init for some cases (#18606) Co-authored-by: Christian Baars --- tasmota/tasmota_xdrv_driver/xdrv_81_esp32_webcam.ino | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/tasmota/tasmota_xdrv_driver/xdrv_81_esp32_webcam.ino b/tasmota/tasmota_xdrv_driver/xdrv_81_esp32_webcam.ino index 59f4e83e6..a8590a4da 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_81_esp32_webcam.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_81_esp32_webcam.ino @@ -135,7 +135,7 @@ struct PICSTORE { #endif // ENABLE_RTSPSERVER struct { - uint8_t up; + uint8_t up = 0; uint16_t width; uint16_t height; uint8_t stream_active; @@ -1456,6 +1456,9 @@ bool Xdrv81(uint32_t function) { case FUNC_PRE_INIT: WcInit(); break; + case FUNC_INIT: + if(Wc.up == 0) WcSetup(Settings->webcam_config.resolution); + break; } return result; From cdc6ba7c9607a344baa3efe2344c01ff82cb1205 Mon Sep 17 00:00:00 2001 From: bovirus <1262554+bovirus@users.noreply.github.com> Date: Mon, 8 May 2023 00:57:13 -0700 Subject: [PATCH 085/289] Update italian language (#18605) --- tasmota/language/it_IT.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tasmota/language/it_IT.h b/tasmota/language/it_IT.h index a5378c52a..3e8b80e6f 100644 --- a/tasmota/language/it_IT.h +++ b/tasmota/language/it_IT.h @@ -28,7 +28,7 @@ * Use online command StateText to translate ON, OFF, HOLD and TOGGLE. * Use online command Prefix to translate cmnd, stat and tele. * - * Updated until v9.4.0.1 - Last update 28.04.2023 + * Updated until v9.4.0.1 - Last update 08.05.2023 \*********************************************************************/ #define LANGUAGE_MODULE_NAME // Enable to display "Module Generic" (ie Spanish), Disable to display "Generic Module" (ie English) @@ -104,7 +104,7 @@ #define D_FALLBACK_TOPIC "Topic Riserva" #define D_FALSE "Falso" #define D_FILE "File" -#define D_FILE_SYSTEM_SIZE "File System Size" +#define D_FILE_SYSTEM_SIZE "Dimensione file system" #define D_FLOW_RATE "Flusso dati" #define D_FRAGMENTATION "framm." // Lower case abbreviated version of fragmentation used in "memory fragmentation" #define D_FRAME_RATE "Frequenza fotogrammi" From 6cb92ffe4989dada14772a7604ed889a1b9f9512 Mon Sep 17 00:00:00 2001 From: Jeroen Date: Mon, 8 May 2023 09:58:26 +0200 Subject: [PATCH 086/289] Fix for aligment at displayfloat command (#18601) * Fix for wrong aligment at displayfloat command * Added alignment parameter to prevent regression --------- Co-authored-by: JeroenSt --- .../tasmota_xdsp_display/xdsp_15_tm1637.ino | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/tasmota/tasmota_xdsp_display/xdsp_15_tm1637.ino b/tasmota/tasmota_xdsp_display/xdsp_15_tm1637.ino index b2ec1e80a..b4599132c 100644 --- a/tasmota/tasmota_xdsp_display/xdsp_15_tm1637.ino +++ b/tasmota/tasmota_xdsp_display/xdsp_15_tm1637.ino @@ -83,14 +83,14 @@ - DisplayFloat num [,position {0-(Settings->display_width-1)} [,precision {0-Settings->display_width} [,length {1 to Settings->display_width}]]] + DisplayFloat num [,position {0-(Settings->display_width-1)} [,precision {0-Settings->display_width} [,length {1 to Settings->display_width} [,alignment {0=left 1=right}]]]] Clears and then displays float (with decimal point) command e.g., "DisplayFloat 12.34" See function description below for more details. - DisplayFloatNC num [,position {0-(Settings->display_width-1)} [,precision {0-Settings->display_width} [,length {1 to Settings->display_width}]]] + DisplayFloatNC num [,position {0-(Settings->display_width-1)} [,precision {0-Settings->display_width} [,length {1 to Settings->display_width} [,alignment {0=left 1=right}]]]] Displays float (with decimal point) as above, but without clearing first. command e.g., "DisplayFloatNC 12.34" See function description below for more details. @@ -431,14 +431,18 @@ bool CmndTM1637Float(bool clear) char sPrecision[CMD_MAX_LEN]; char sPosition[CMD_MAX_LEN]; char sLength[CMD_MAX_LEN]; + char sAlignment[CMD_MAX_LEN]; uint8_t length = 0; uint8_t precision = Settings->display_width; uint8_t position = 0; - + uint8_t alignment = 0; float fnum = 0.0f; switch (ArgC()) { + case 5: + subStr(sAlignment, XdrvMailbox.data, ",", 5); + alignment = atoi(sAlignment); case 4: subStr(sLength, XdrvMailbox.data, ",", 4); length = atoi(sLength); @@ -469,6 +473,14 @@ bool CmndTM1637Float(bool clear) if ((length <= 0) || (length > Settings->display_width)) length = Settings->display_width; + // Add leading spaces before value if txt is shorter than length + if ((alignment == 1) && (strlen(txt) < length + 1)) + { + char tmptxt[30]; + ext_snprintf_P(tmptxt, sizeof(tmptxt), "%*s%s", strlen(txt)-(length+1), "", txt); + strcpy (txt, tmptxt); + } + AddLog(LOG_LEVEL_DEBUG, PSTR("TM7: num %4_f, prec %d, len %d"), &fnum, precision, length); if (TM1637 == TM1637Data.display_type) From 45eb82bc3fe01d4ab32d1a105f5e20c61c82db3f Mon Sep 17 00:00:00 2001 From: Jeroen Date: Mon, 8 May 2023 09:59:28 +0200 Subject: [PATCH 087/289] Fix for not sending changes to mqtt (#18600) Co-authored-by: JeroenSt --- tasmota/tasmota_xsns_sensor/xsns_34_hx711.ino | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tasmota/tasmota_xsns_sensor/xsns_34_hx711.ino b/tasmota/tasmota_xsns_sensor/xsns_34_hx711.ino index a12cce716..0a833b6fa 100644 --- a/tasmota/tasmota_xsns_sensor/xsns_34_hx711.ino +++ b/tasmota/tasmota_xsns_sensor/xsns_34_hx711.ino @@ -430,7 +430,7 @@ void HxEvery100mSecond(void) { Hx.weight_diff = Hx.weight; Hx.weight_changed = true; } - else if (Hx.weight_changed && (Hx.weight == Hx.weight_diff)) { + else if (Hx.weight_changed && (abs(Hx.weight - Hx.weight_diff) < Hx.weight_delta)) { ResponseClear(); ResponseAppendTime(); HxShow(true); From 6fe1bbd617b226f8cbde07325486904c708e60f1 Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Mon, 8 May 2023 15:10:15 +0200 Subject: [PATCH 088/289] Update changelogs --- RELEASENOTES.md | 8 ++++---- tasmota/tasmota_xsns_sensor/xsns_107_gm861.ino | 2 ++ 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/RELEASENOTES.md b/RELEASENOTES.md index 464e0acb6..2490b7a56 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -36,9 +36,9 @@ While fallback or downgrading is common practice it was never supported due to S This release will be supported from ESP8266/Arduino library Core version **2.7.4.9** due to reported security and stability issues on previous Core version. This will also support gzipped binaries. -This release will be supported from ESP32/Arduino library Core version **2.0.8**. +This release will be supported from ESP32/Arduino library Core version **2.0.9**. -Support of ESP8266 Core versions before 2.7.4.9 and ESP32 Core versions before 2.0.8 have been removed. +Support of ESP8266 Core versions before 2.7.4.9 and ESP32 Core versions before 2.0.9 have been removed. ## Support of TLS @@ -80,7 +80,7 @@ Historical binaries can be downloaded from The latter links can be used for OTA upgrades too like ``OtaUrl http://ota.tasmota.com/tasmota/release/tasmota.bin.gz`` ### ESP32, ESP32-C3, ESP32-S2 and ESP32-S3 based -The following binary downloads have been compiled with ESP32/Arduino library core version **2.0.8**. +The following binary downloads have been compiled with ESP32/Arduino library core version **2.0.9**. - **tasmota32.bin** = The Tasmota version with most drivers including additional sensors and KNX for 4M+ flash. **RECOMMENDED RELEASE BINARY** - **tasmota32xy.bin** = The Tasmota version with most drivers including additional sensors and KNX for ESP32-C3/S2/S3 and 4M+ flash. @@ -127,7 +127,7 @@ The latter links can be used for OTA upgrades too like ``OtaUrl https://ota.tasm - Change command ``FileUpload`` index binary data detection from >199 to >299 ### Changed -- ESP32 Framework (Core) from v2.0.7 to v2.0.8 +- ESP32 Framework (Core) from v2.0.7 to v2.0.9 - Refactored Zero Cross Dimmer [#18481](https://github.com/arendst/Tasmota/issues/18481) ### Fixed diff --git a/tasmota/tasmota_xsns_sensor/xsns_107_gm861.ino b/tasmota/tasmota_xsns_sensor/xsns_107_gm861.ino index 356e7ef39..c54019c09 100644 --- a/tasmota/tasmota_xsns_sensor/xsns_107_gm861.ino +++ b/tasmota/tasmota_xsns_sensor/xsns_107_gm861.ino @@ -67,6 +67,8 @@ Headr Ty Ln Addrs Data Check Headr Ty Ln Data Check 7E 00 08 01 00 B0 03 AB CD Output center part 7E 00 08 01 00 B1 03 AB CD Cut out N bytes from start (Eg: three characters) 7E 00 08 01 00 B2 02 AB CD Cut out N bytes from end (Eg: two characters) +7E 00 08 01 00 D0 80 AB CD Enabling AIM ID +7E 00 08 01 00 D0 00 AB CD Disabling AIM ID 7E 00 08 01 00 D9 50 81 D3 02 00 00 01 00 33 31 Zone bytes reset to defaults 7E 00 08 01 00 D9 55 D1 76 02 00 00 01 00 33 31 Restore user-defined factory settings 7E 00 08 01 00 D9 56 E1 15 02 00 00 01 00 33 31 Save as user-defined factory settings From faff39ca11be659c28db5fe92ffecd9027ae1832 Mon Sep 17 00:00:00 2001 From: Mateusz Bronk Date: Mon, 8 May 2023 19:04:25 +0200 Subject: [PATCH 089/289] IRremoteESP8266 upgraded to v2.8.5 (#18610) * IRremoteESP8266 upgraded to v2.8.5 (from v2.8.4) * Fix ir panasonic esp8266 (#18013) * revert part of #16179 for ESP8266 * Revert "revert part of #16179 for ESP8266" This reverts commit b8e61264074f0dd92e5fca29a991d31c97f8f9ee. * try to revert #16179 for esp8266 * Build: removed redundand USE_IR_REMOTE_FULL flag Tasmota32-ir PIO had both FIRMWARE_IR and USE_IR_REMOTE_FULL defined. The latter is redundand and yielded unnecessary build warns. See: tasmota_configurations.h --------- Co-authored-by: Mateusz Bronk <2566147+mbronk@users.noreply.github.com> Co-authored-by: Barbudor --- .../.github/workflows/Build.yml | 47 +- .../.github/workflows/MetaChecks.yml | 2 +- .../.github/workflows/UnitTests.yml | 29 +- .../.github/workflows/codeql-analysis.yml | 72 + .../IRremoteESP8266/.gitignore | 2 + .../IRremoteESP8266/IRremoteESP8266/README.md | 4 +- .../IRremoteESP8266/README_de.md | 4 +- .../IRremoteESP8266/README_fr.md | 4 +- .../IRremoteESP8266/README_nl.md | 89 + .../IRremoteESP8266/ReleaseNotes.md | 36 + .../IRremoteESP8266/SupportedProtocols.md | 16 +- .../examples/IRMQTTServer/IRMQTTServer.h | 47 +- .../examples/IRMQTTServer/IRMQTTServer.ino | 329 +++- .../examples/IRMQTTServer/platformio.ini | 10 + .../IRremoteESP8266/keywords.txt | 196 +- .../IRremoteESP8266/library.json | 2 +- .../IRremoteESP8266/library.properties | 2 +- .../IRremoteESP8266/src/IRac.cpp | 427 +++- .../IRremoteESP8266/src/IRac.h | 70 +- .../IRremoteESP8266/src/IRmacros.h | 4 +- .../IRremoteESP8266/src/IRrecv.cpp | 41 +- .../IRremoteESP8266/src/IRrecv.h | 26 + .../IRremoteESP8266/src/IRremoteESP8266.h | 53 +- .../IRremoteESP8266/src/IRsend.cpp | 27 + .../IRremoteESP8266/src/IRsend.h | 65 +- .../IRremoteESP8266/src/IRtext.cpp | 22 + .../IRremoteESP8266/src/IRtext.h | 14 + .../IRremoteESP8266/src/IRutils.cpp | 168 +- .../IRremoteESP8266/src/IRutils.h | 22 +- .../IRremoteESP8266/src/ir_Argo.cpp | 1728 +++++++++++++++-- .../IRremoteESP8266/src/ir_Argo.h | 414 +++- .../IRremoteESP8266/src/ir_Carrier.cpp | 100 + .../IRremoteESP8266/src/ir_Carrier.h | 3 + .../IRremoteESP8266/src/ir_Coolix.cpp | 2 + .../IRremoteESP8266/src/ir_Coolix.h | 2 +- .../IRremoteESP8266/src/ir_Ecoclim.cpp | 1 + .../IRremoteESP8266/src/ir_Electra.cpp | 2 + .../IRremoteESP8266/src/ir_Electra.h | 1 + .../IRremoteESP8266/src/ir_Gorenje.cpp | 71 + .../IRremoteESP8266/src/ir_Gree.cpp | 2 + .../IRremoteESP8266/src/ir_Midea.cpp | 1 + .../IRremoteESP8266/src/ir_Mirage.cpp | 8 +- .../IRremoteESP8266/src/ir_Mitsubishi.h | 1 + .../IRremoteESP8266/src/ir_Panasonic.cpp | 17 +- .../IRremoteESP8266/src/ir_Sanyo.cpp | 6 +- .../IRremoteESP8266/src/ir_Wowwee.cpp | 91 + .../IRremoteESP8266/src/ir_Xmp.cpp | 4 +- .../IRremoteESP8266/src/ir_York.cpp | 357 ++++ .../IRremoteESP8266/src/ir_York.h | 137 ++ .../IRremoteESP8266/src/locale/defaults.h | 54 + .../IRremoteESP8266/src/locale/nl-NL.h | 136 ++ .../IRremoteESP8266/test/IRac_test.cpp | 169 +- .../IRremoteESP8266/test/IRrecv_test.h | 11 +- .../IRremoteESP8266/test/Makefile | 73 +- .../IRremoteESP8266/test/ir_Argo_test.cpp | 1520 ++++++++++++++- .../IRremoteESP8266/test/ir_Carrier_test.cpp | 120 ++ .../IRremoteESP8266/test/ir_Gorenje_test.cpp | 203 ++ .../test/ir_Panasonic_test.cpp | 114 +- .../IRremoteESP8266/test/ir_Wowwee_test.cpp | 103 + .../IRremoteESP8266/test/ir_York_test.cpp | 96 + .../IRremoteESP8266/test/ut_utils.h | 35 + lib/lib_basic/IRremoteESP8266/library.json | 2 +- platformio_tasmota_env32.ini | 1 - 63 files changed, 6840 insertions(+), 575 deletions(-) create mode 100644 lib/lib_basic/IRremoteESP8266/IRremoteESP8266/.github/workflows/codeql-analysis.yml create mode 100644 lib/lib_basic/IRremoteESP8266/IRremoteESP8266/README_nl.md create mode 100644 lib/lib_basic/IRremoteESP8266/IRremoteESP8266/src/ir_Gorenje.cpp create mode 100644 lib/lib_basic/IRremoteESP8266/IRremoteESP8266/src/ir_Wowwee.cpp create mode 100644 lib/lib_basic/IRremoteESP8266/IRremoteESP8266/src/ir_York.cpp create mode 100644 lib/lib_basic/IRremoteESP8266/IRremoteESP8266/src/ir_York.h create mode 100644 lib/lib_basic/IRremoteESP8266/IRremoteESP8266/src/locale/nl-NL.h create mode 100644 lib/lib_basic/IRremoteESP8266/IRremoteESP8266/test/ir_Gorenje_test.cpp create mode 100644 lib/lib_basic/IRremoteESP8266/IRremoteESP8266/test/ir_Wowwee_test.cpp create mode 100644 lib/lib_basic/IRremoteESP8266/IRremoteESP8266/test/ir_York_test.cpp create mode 100644 lib/lib_basic/IRremoteESP8266/IRremoteESP8266/test/ut_utils.h diff --git a/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/.github/workflows/Build.yml b/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/.github/workflows/Build.yml index 5c0e5907c..dd4504361 100644 --- a/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/.github/workflows/Build.yml +++ b/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/.github/workflows/Build.yml @@ -7,9 +7,31 @@ on: branches: [ master ] jobs: - Build_Examples: - + Gen_Matrix: + outputs: + matrix: ${{ steps.files.outputs.matrix }} runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - name: Generate Matrix of all examples + id: files + run: | + JSONI=$(find . -name platformio.ini -type f | sed 's,/platformio.ini$,,' | xargs -n 1 -I {} echo -e '"{}",') + + # Remove last "," and add closing brackets + if [[ $JSONI == *, ]]; then + JSONI="${JSONI%?}" + fi + JSONI=${JSONI//$'\n'} + echo $JSONI + # Set output + echo "::set-output name=matrix::[${JSONI}]" + Build_Example: + needs: Gen_Matrix + runs-on: ubuntu-latest + strategy: + matrix: + project: ${{fromJson(needs.Gen_Matrix.outputs.matrix)}} steps: - uses: actions/checkout@v2 @@ -24,14 +46,29 @@ jobs: uses: actions/cache@v2 with: path: ~/.platformio - key: ${{ runner.os }}-${{ hashFiles('**/lockfiles') }} + key: ${{ runner.os }}-${{ hashFiles('**/platformio.ini') }} + - name: Cache PlatformIO build + uses: actions/cache@v2 + with: + path: .pio + key: pio-${{ runner.os }}-${{ matrix.project }} + restore-keys: | + pio-${{ runner.os }}- + pio- - name: Set up Python uses: actions/setup-python@v2 - name: Install PlatformIO run: | python -m pip install --upgrade pip pip install --upgrade platformio - - name: Build all the examples + - name: Build example env: PLATFORMIO_BUILD_CACHE_DIR: "../../.pio/buildcache" - run: find . -name platformio.ini -type f | sed 's,/platformio.ini$,,' | xargs --verbose -n 1 pio run --jobs 2 --project-dir + run: pio run --jobs 2 --project-dir ${{ matrix.project }} + + Build_Examples: + needs: Build_Example + runs-on: ubuntu-latest + steps: + - name: done + run: echo ok diff --git a/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/.github/workflows/MetaChecks.yml b/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/.github/workflows/MetaChecks.yml index 2866ffc37..d8dcd0703 100644 --- a/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/.github/workflows/MetaChecks.yml +++ b/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/.github/workflows/MetaChecks.yml @@ -37,7 +37,7 @@ jobs: - uses: actions/checkout@v2 - name: Check all the version numbers match. run: | - LIB_VERSION=$(egrep "^#define\s+_IRREMOTEESP8266_VERSION_\s+" src/IRremoteESP8266.h | cut -d\" -f2) + LIB_VERSION=$(tools/extract_lib_version.sh) test ${LIB_VERSION} == "$(jq -r .version library.json)" grep -q "^version=${LIB_VERSION}$" library.properties examples-have-platformio_ini: diff --git a/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/.github/workflows/UnitTests.yml b/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/.github/workflows/UnitTests.yml index bbc486b18..a99e18c80 100644 --- a/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/.github/workflows/UnitTests.yml +++ b/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/.github/workflows/UnitTests.yml @@ -3,21 +3,28 @@ name: Tests on: [push, pull_request] jobs: - Unit_Tests: - + Tools_Tests: runs-on: ubuntu-latest + env: + MAKEFLAGS: "-j 2" + steps: + - uses: actions/checkout@v2 + - name: Build tools unit tests + run: (cd tools; make all) + - name: Run tools unit tests + run: (cd tools; make run_tests) + Unit_Tests: + runs-on: ubuntu-latest + env: + MAKEFLAGS: "-j 2" steps: - uses: actions/checkout@v2 - name: Install the Google test suite - env: - MAKEFLAGS: "-j 2" run: (cd test; make install-googletest) - - name: Build and run the library unit tests. - env: - MAKEFLAGS: "-j 2" + - name: Build base unit test + run: (cd test; make IRac_test) + - name: Build library unit tests + run: (cd test; make all) + - name: Run library unit tests run: (cd test; make run) - - name: Build and run the tools unit tests. - env: - MAKEFLAGS: "-j 2" - run: (cd tools; make all; make run_tests) diff --git a/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/.github/workflows/codeql-analysis.yml b/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/.github/workflows/codeql-analysis.yml new file mode 100644 index 000000000..48500339a --- /dev/null +++ b/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/.github/workflows/codeql-analysis.yml @@ -0,0 +1,72 @@ +# For most projects, this workflow file will not need changing; you simply need +# to commit it to your repository. +# +# You may wish to alter this file to override the set of languages analyzed, +# or to provide custom queries or build logic. +# +# ******** NOTE ******** +# We have attempted to detect the languages in your repository. Please check +# the `language` matrix defined below to confirm you have the correct set of +# supported CodeQL languages. +# +name: "CodeQL" + +on: + push: + branches: [ "master" ] + pull_request: + # The branches below must be a subset of the branches above + branches: [ "master" ] + schedule: + - cron: '38 1 * * 3' + +jobs: + analyze: + name: Analyze + runs-on: ubuntu-latest + permissions: + actions: read + contents: read + security-events: write + + strategy: + fail-fast: false + matrix: + language: [ 'python' ] + # CodeQL supports [ 'cpp', 'csharp', 'go', 'java', 'javascript', 'python', 'ruby' ] + # Learn more about CodeQL language support at https://aka.ms/codeql-docs/language-support + + steps: + - name: Checkout repository + uses: actions/checkout@v3 + + # Initializes the CodeQL tools for scanning. + - name: Initialize CodeQL + uses: github/codeql-action/init@v2 + with: + languages: ${{ matrix.language }} + # If you wish to specify custom queries, you can do so here or in a config file. + # By default, queries listed here will override any specified in a config file. + # Prefix the list here with "+" to use these queries and those in the config file. + + # Details on CodeQL's query packs refer to : https://docs.github.com/en/code-security/code-scanning/automatically-scanning-your-code-for-vulnerabilities-and-errors/configuring-code-scanning#using-queries-in-ql-packs + # queries: security-extended,security-and-quality + + + # Autobuild attempts to build any compiled languages (C/C++, C#, or Java). + # If this step fails, then you should remove it and run the build manually (see below) + - name: Autobuild + uses: github/codeql-action/autobuild@v2 + + # ℹ️ Command-line programs to run using the OS shell. + # 📚 See https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstepsrun + + # If the Autobuild fails above, remove it and uncomment the following three lines. + # modify them (or add more) to build your code if your project, please refer to the EXAMPLE below for guidance. + + # - run: | + # echo "Run, Build Application using script" + # ./location_of_script_within_repo/buildscript.sh + + - name: Perform CodeQL Analysis + uses: github/codeql-action/analyze@v2 diff --git a/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/.gitignore b/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/.gitignore index a73bc8b00..b58efd41d 100644 --- a/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/.gitignore +++ b/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/.gitignore @@ -40,6 +40,7 @@ tools/*.o tools/*.a tools/gc_decode tools/mode2_decode +tools/code_to_raw .pioenvs .piolibdeps @@ -51,3 +52,4 @@ tools/mode2_decode # Mac extended attributes .DS_Store +/.vs diff --git a/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/README.md b/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/README.md index b15ef1abe..47178861a 100644 --- a/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/README.md +++ b/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/README.md @@ -10,8 +10,8 @@ This library enables you to **send _and_ receive** infra-red signals on an [ESP8266](https://github.com/esp8266/Arduino) or an [ESP32](https://github.com/espressif/arduino-esp32) using the [Arduino framework](https://www.arduino.cc/) using common 940nm IR LEDs and common IR receiver modules. e.g. TSOP{17,22,24,36,38,44,48}* demodulators etc. -## v2.8.4 Now Available -Version 2.8.4 of the library is now [available](https://github.com/crankyoldgit/IRremoteESP8266/releases/latest). You can view the [Release Notes](ReleaseNotes.md) for all the significant changes. +## v2.8.5 Now Available +Version 2.8.5 of the library is now [available](https://github.com/crankyoldgit/IRremoteESP8266/releases/latest). You can view the [Release Notes](ReleaseNotes.md) for all the significant changes. #### Upgrading from pre-v2.0 Usage of the library has been slightly changed in v2.0. You will need to change your usage to work with v2.0 and beyond. You can read more about the changes required on our [Upgrade to v2.0](https://github.com/crankyoldgit/IRremoteESP8266/wiki/Upgrading-to-v2.0) page. diff --git a/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/README_de.md b/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/README_de.md index 51c18c482..f55860528 100644 --- a/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/README_de.md +++ b/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/README_de.md @@ -11,8 +11,8 @@ Diese Programmbibliothek ermöglicht das **Senden _und_ Empfangen** von Infrarotsignalen mit [ESP8266](https://github.com/esp8266/Arduino)- und [ESP32](https://github.com/espressif/arduino-esp32)-Mikrocontrollern mithilfe des [Arduino-Frameworks](https://www.arduino.cc/) und handelsüblichen 940nm Infrarot-LEDs undIR-Empfängermodulen, wie zum Beispiel TSOP{17,22,24,36,38,44,48}*-Demodulatoren. -## v2.8.4 jetzt verfügbar -Version 2.8.4 der Bibliothek ist nun [verfügbar](https://github.com/crankyoldgit/IRremoteESP8266/releases/latest). Die [Versionshinweise](ReleaseNotes.md) enthalten alle wichtigen Neuerungen. +## v2.8.5 jetzt verfügbar +Version 2.8.5 der Bibliothek ist nun [verfügbar](https://github.com/crankyoldgit/IRremoteESP8266/releases/latest). Die [Versionshinweise](ReleaseNotes.md) enthalten alle wichtigen Neuerungen. #### Hinweis für Nutzer von Versionen vor v2.0 Die Benutzung der Bibliothek hat sich mit Version 2.0 leicht geändert. Einige Anpassungen im aufrufenden Code werden nötig sein, um mit Version ab 2.0 korrekt zu funktionieren. Mehr zu den Anpassungen finden sich auf unserer [Upgrade to v2.0](https://github.com/crankyoldgit/IRremoteESP8266/wiki/Upgrading-to-v2.0)-Seite. diff --git a/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/README_fr.md b/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/README_fr.md index 71e436fc3..430d32de3 100644 --- a/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/README_fr.md +++ b/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/README_fr.md @@ -10,8 +10,8 @@ Cette librairie vous permetra de **recevoir et d'envoyer des signaux** infrarouge sur le protocole [ESP8266](https://github.com/esp8266/Arduino) ou sur le protocole [ESP32](https://github.com/espressif/arduino-esp32) en utilisant le [Arduino framework](https://www.arduino.cc/) qui utilise la norme 940nm IR LEDs et le module basique de reception d'onde IR. Exemple : TSOP{17,22,24,36,38,44,48}* modules etc. -## v2.8.4 disponible -Version 2.8.4 de la libraire est maintenant [disponible](https://github.com/crankyoldgit/IRremoteESP8266/releases/latest). Vous pouvez voir le [Release Notes](ReleaseNotes.md) pour tous les changements importants. +## v2.8.5 disponible +Version 2.8.5 de la libraire est maintenant [disponible](https://github.com/crankyoldgit/IRremoteESP8266/releases/latest). Vous pouvez voir le [Release Notes](ReleaseNotes.md) pour tous les changements importants. #### mise à jour depuis pre-v2.0 L'utilisation de la librairie à un peu changer depuis la version in v2.0. Si vous voulez l'utiliser vous devrez changer votre utilisation aussi. Vous pouvez vous renseigner sur les précondition d'utilisation ici : [Upgrade to v2.0](https://github.com/crankyoldgit/IRremoteESP8266/wiki/Upgrading-to-v2.0) page. diff --git a/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/README_nl.md b/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/README_nl.md new file mode 100644 index 000000000..fdea85cae --- /dev/null +++ b/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/README_nl.md @@ -0,0 +1,89 @@ +![IRremoteESP8266 Library](./assets/images/banner.svg) + +[![Build-Status](https://github.com/crankyoldgit/IRremoteESP8266/actions/workflows/Build.yml/badge.svg)](../../actions/workflows/Build.yml/badge.svg) +[![Code-Lint](https://github.com/crankyoldgit/IRremoteESP8266/actions/workflows/Lint.yml/badge.svg)](../../actions/workflows/Lint.yml) +[![Tests](https://github.com/crankyoldgit/IRremoteESP8266/actions/workflows/UnitTests.yml/badge.svg)](../../ctions/workflows/UnitTests.yml) +[![Dokumentation](https://github.com/crankyoldgit/IRremoteESP8266/actions/workflows/Documentation.yml/badge.svg)](../../actions/workflows/Documentation.yml) +[![arduino-library-badge](https://www.ardu-badge.com/badge/IRremoteESP8266.svg?)](https://www.ardu-badge.com/IRremoteESP8266) +[![Arduino-Bibliothek-Abzeichen](https://www.ardu-badge.com/badge/IRremoteESP8266.svg?)](https://www.ardu-badge.com/IRremoteESP8266) +[![Git-Lizenz](https://gitlicense.com/badge/crankyoldgit/IRremoteESP8266)](https://gitlicense.com/license/crankyoldgit/IRremoteESP8266) + +Deze library maakt het mogelijk om Infraroodsignalen **te versturen en ontvangen** via het [Arduino framework](https://www.arduino.cc/) met veelgebruikte 940nm IR LEDs en IR ontvang modules. b.v. TSOP{17,22,24,36,38,44,48}* demodulatoren enz. + +## v2.8.5 nu beschikbaar +Versie 2.8.5 van de bibliotheek is nu [beschikbaar](https://github.com/crankyoldgit/IRremoteESP8266/releases/latest). Bekijk de [Release Notes](ReleaseNotes.md) voor alle belangrijke veranderingen. + +#### Upgraden vanaf pre-v2.0 +Het gebruik van de bibliotheek is enigszins gewijzigd in v2.0. Je zult het gebruik moeten aanpassen om te kunnen werken met v2.0 en hoger. Je kunt meer lezen over de vereiste aanpassingen op onze [Upgraden naar v2.0](https://github.com/crankyoldgit/IRremoteESP8266/wiki/Upgrading-to-v2.0) pagina. + +#### Upgraden vanaf pre-v2.5 +De bibliotheek defineert constanten nu niet meer als `#define`, maar gebruikt +[const](https://google.github.io/styleguide/cppguide.html#Constant_Names) met +de juiste naamgeving volgens de +[C++ style guide](https://google.github.io/styleguide/cppguide.html). +Dit kan ertoe leiden dat oude programma's niet compileren. +De meest extern gebruikte `#define`s zijn _gealiased_ voor beperkte +compatibiliteit voor projecten die de oude stijl gebruiken. In de toekomst zal alleen de +nieuwe `kConstantName` stijl worden ondersteund voor nieuwe protocoltoevoegingen. + +In het onwaarschijnlijke geval dat het je code breekt, dan heb je misschien verwezen naar +iets wat je waarschijnlijk niet had moeten doen. Gelukkig is het redelijk simpel om de nieuwe naam +te bepalen vanaf de oude, b.v. `CONSTANT_NAME` naar `kConstantName`. +Gebruik gezond verstand of onderzoek de code van de bibliotheek als dit van toepassing is op jouw code. + +## Ondersteunde Protocollen +De details van de ondersteunde protocollen en apparaten staan +[hier](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/SupportedProtocols.md) vermeld. + +## Probleemoplossing +Voordat je een probleem meldt of om hulp vraagt, graag eerst onze [Probleemoplossingsgids](https://github.com/crankyoldgit/IRremoteESP8266/wiki/Troubleshooting-Guide) volgen. + +## Veelgestelde Vragen +Enkele antwoorden op veel veelgestelde vragen en problemen staan op onze [F.A.Q. wiki pagina](https://github.com/crankyoldgit/IRremoteESP8266/wiki/Frequently-Asked-Questions). + +## Bibliotheek API Documentatie +De bibliotheek gebruikt [Doxygen](https://www.doxygen.nl/index.html) om [automatisch documentatie](https://crankyoldgit.github.io/IRremoteESP8266/doxygen/html/) toe te voegen aan de [API](https://en.wikipedia.org/wiki/Application_programming_interface) van de [bibliotheek](https://crankyoldgit.github.io/IRremoteESP8266/doxygen/html/). +Je kunt de documentatie [hier](https://crankyoldgit.github.io/IRremoteESP8266/doxygen/html/) vinden. + +## Installatie +##### Officiële versies via de Arduino IDE v1.8+ (Windows & Linux) +1. Klik op de _"Schets"_ -> _"Bibliotheek gebruiken"_ -> _"Bibliotheken beheren..."_ menuknoppen. +1. Vul `IRremoteESP8266` in bij _"Filter je zoekresultaten..."_ rechtsboven de pop-up. +1. Klik op het IRremoteESP8266 resultaat van de zoekopdracht. +1. Selecteer de versie die je wilt installeren en klik op _"Installeren"_. + +##### Handmatige installatie voor Windows +1. Klik op de _"Clone or Download"_ knop, en kies dan _"[Download ZIP](https://github.com/crankyoldgit/IRremoteESP8266/archive->master.zip)"_. +1. Pak de inhoud van de gedownloade zip uit. +1. Hernoem de uitgepakte map naar _"IRremoteESP8266"_. +1. Verplaats de map naar de bibliotheken map. (voor Windows: `C:\Gebruikers\GEBRUIKERSNAAM\Documenten\Arduino\libraries\`) +1. Herstart de Arduino IDE. +1. Bekijk de voorbeelden. + +##### Git gebruiken om de bibliotheken te installeren ( Linux ) +``` +cd ~/Arduino/libraries +git clone https://github.com/crankyoldgit/IRremoteESP8266.git +``` +###### Om de bibliotheken te updaten naar de laatste versie +``` +cd ~/Arduino/libraries/IRremoteESP8266 && git pull +``` + +## Bijdragen +Als je wilt [bijdragen](.github/CONTRIBUTING.md#how-can-i-contribute) aan dit project, hulp is altijd welkom bij: +- Het [melden](.github/CONTRIBUTING.md#reporting-bugs) van problemen en foutmeldingen +- Ideeën voor verbeteringen +- Verbeteringen van de documentatie +- [Het aanmaken van issues](.github/CONTRIBUTING.md#reporting-bugs) en [pull requests](.github/CONTRIBUTING.md#pull-requests) +- Het delen van deze bibliotheek + +## Bijdragers +Bekijk alle bijdragers [hier](.github/Contributors.md) + +## Bibliotheek Geschiedenis +Deze bibliotheek was oorspronkelijk gebaseerd op het werk van Ken Shirriff (https://github.com/shirriff/Arduino-IRremote/) + +[Mark Szabo](https://github.com/crankyoldgit/IRremoteESP8266) heeft de IRsend class bijgewerkt om te werken op een ESP8266 en [Sebastien Warin](https://github.com/sebastienwarin/IRremoteESP8266) de ontvang & decodeer class (IRrecv). + +Voor v2.0 is de bibliotheek bijna volledig herschreven met de mogelijkheden van de ESP8266 in het achterhoofd. diff --git a/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/ReleaseNotes.md b/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/ReleaseNotes.md index 0370c91a6..d9e86c7e3 100644 --- a/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/ReleaseNotes.md +++ b/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/ReleaseNotes.md @@ -1,5 +1,41 @@ # Release Notes +## _v2.8.5 (20230508)_ + +**[Bug Fixes]** +- Fix a bug where we never detached the timer interrupt on ESP32s. (#1984 #1983) +- Missing argument in use of midea function (#1959 #1958) +- IRMQTTServer: Improve HA MQTT climate handling. (#1911) +- SEND_SANYO_AC88: Fix poor cut-n-paste error (#1905 #1897) + +**[Features]** +- Add support for a 40bit variant of the standard Panasonic protocol (#1977 @1976) +- Initial support for York AC protocol (#1889) +- IRMQTTServer: SHT-3x Temperature Sensor Support (#1951) +- IRMQTTServer: HA multi output discovery (#1947) +- IRMQTTServer: extended with new A/C common fields (#1940) +- IRMQTTServer: Sync the on state to power from mode for HA (#1946) +- Experimental basic support for Carrier 84-bit protocol. (#1945 #1943) +- Add support the WowWee 11-Bit RoboRaptor-X protocol. (#1939 #1938) +- Added 'sensorTemperature' and 'iFeel' to IRac (common) (#1928) +- Added extra 'mid' option for Fan & SwingV to IRac (#1929) +- Added "commandType" to IRAc (#1921) +- Added support for Argo WREM-3 A/C remote protocol [part1] (#1920) +- Added Dutch (nl-NL) translation (#1907) +- ARGO: Improve code & add support for decoding 32bit sensor msgs. (#1906 #1859) +- Added support for Gorenje cooker hood IR protocol (#1888 #1887) + +**[Misc]** +- Add Electrolux YKR-H/531E as a supported device (#1981 #1980) +- Update `XMP` status to Stable (#1944) +- upgrade to a later version of `googletest` (#1936) +- MITSUBISHI128: Added model to supported protocol (#1924) +- Added Dutch (nl-NL) README (#1908) +- Added GMock to UT Makefile (#1902) +- Update HA example config for HA 2022.6+ (#1901 #1900) +- Add a `d1_mini_noMDNS` build option to `IRMQTTServer`. (#1985) + + ## _v2.8.4 (20220918)_ **[Bug Fixes]** diff --git a/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/SupportedProtocols.md b/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/SupportedProtocols.md index 422a5bf2d..46b65ca5e 100644 --- a/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/SupportedProtocols.md +++ b/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/SupportedProtocols.md @@ -1,6 +1,6 @@ + Last generated: Mon 08 May 2023 07:06:16 +0000 ---> # IR Protocols supported by this library | Protocol | Brand | Model | A/C Model | Detailed A/C Support | @@ -9,11 +9,11 @@ | [Airwell](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Airwell.cpp) | **[Airwell](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Airwell.h)** | DLS 21 DCI R410 AW A/C
RC04 remote
RC08W remote | | Yes | | [Aiwa](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Aiwa.cpp) | **Aiwa** | RC-T501 RCU | | - | | [Amcor](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Amcor.cpp) | **[Amcor](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Amcor.h)** | ADR-853H A/C
TAC-444 remote
TAC-495 remote | | Yes | -| [Argo](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Argo.cpp) | **[Argo](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Argo.h)** | Ulisse 13 DCI Mobile Split A/C | | Yes | +| [Argo](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Argo.cpp) | **[Argo](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Argo.h)** | Ulisse 13 DCI Mobile Split A/C [WREM2 remote]
Ulisse Eco Mobile Split A/C (Wifi) [WREM3 remote] | SAC_WREM2
SAC_WREM3 | Yes | | [Arris](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Arris.cpp) | **Arris** | 120A V1.0 A18 remote
VIP1113M Set-top box | | - | | [Bosch](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Bosch.cpp) | **[Bosch](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Bosch.h)** | CL3000i-Set 26 E A/C
RG10A(G2S)BGEF remote | | Yes | | [Bose](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Bose.cpp) | **Bose** | Bose TV Speaker | | - | -| [Carrier](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Carrier.cpp) | **[Carrier](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Carrier.h)** | 40GKX0E2006 remote (CARRIER_AC128) | | Yes | +| [Carrier](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Carrier.cpp) | **[Carrier](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Carrier.h)** | 3021203 RR03-S-Remote (CARRIER_AC84)
342WM100CT A/C (CARRIER_AC84)
40GKX0E2006 remote (CARRIER_AC128) | | Yes | | [Carrier](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Carrier.cpp) | **[Carrier/Surrey](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Carrier.h)** | 42QG5A55970 remote
53NGK009/012 Inverter
619EGX0090E0 A/C
619EGX0120E0 A/C
619EGX0180E0 A/C
619EGX0220E0 A/C | | Yes | | [ClimaButler](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_ClimaButler.cpp) | **Clima-Butler** | AR-715 remote
RCS-SD43UWI A/C | | - | | [Coolix](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Coolix.cpp) | **[Airwell](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Coolix.h)** | RC08B remote | | Yes | @@ -35,6 +35,7 @@ | [Electra](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Electra.cpp) | **[AUX](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Electra.h)** | KFR-35GW/BpNFW=3 A/C
YKR-T/011 remote | | Yes | | [Electra](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Electra.cpp) | **[Centek](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Electra.h)** | SCT-65Q09 A/C
YKR-P/002E remote | | Yes | | [Electra](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Electra.cpp) | **[Electra](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Electra.h)** | Classic INV 17 / AXW12DCS A/C
YKR-M/003E remote | | Yes | +| [Electra](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Electra.cpp) | **[Electrolux](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Electra.h)** | YKR-H/531E A/C | | Yes | | [Electra](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Electra.cpp) | **[Frigidaire](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Electra.h)** | FGPC102AB1 A/C | | Yes | | [Electra](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Electra.cpp) | **[Subtropic](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Electra.h)** | SUB-07HN1_18Y A/C
YKR-H/102E remote | | Yes | | [EliteScreens](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_EliteScreens.cpp) | **Elite Screens** | CineTension2 / CineTension3 series
Home2 / Home3 series
Spectrum series
VMAX Plus4 series
VMAX2 / VMAX2 Plus series
ZSP-IR-B / ZSP-IR-W remote | | - | @@ -46,6 +47,7 @@ | [GICable](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_GICable.cpp) | **G.I. Cable** | XRC-200 remote | | - | | [GlobalCache](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_GlobalCache.cpp) | **Global Cache** | Control Tower IR DB | | - | | [Goodweather](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Goodweather.cpp) | **[Goodweather](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Goodweather.h)** | ZH/JT-03 remote | | Yes | +| [Gorenje](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Gorenje.cpp) | **Gorenje** | DKF 2600 MWT Cooker Hood | | - | | [Gree](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Gree.cpp) | **[Amana](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Gree.h)** | PBC093G00CC A/C
YX1FF remote | YAW1F
YBOFB
YX1FSF | Yes | | [Gree](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Gree.cpp) | **[Cooper & Hunter](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Gree.h)** | CH-S09FTXG A/C
YB1F2 remote | YAW1F
YBOFB
YX1FSF | Yes | | [Gree](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Gree.cpp) | **[EKOKAI](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Gree.h)** | A/C | YAW1F
YBOFB
YX1FSF | Yes | @@ -89,7 +91,7 @@ | [Mirage](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Mirage.cpp) | **[Mirage](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Mirage.h)** | VLU series A/C | KKG29AC1
KKG9AC1 | Yes | | [Mirage](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Mirage.cpp) | **[Tronitechnik](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Mirage.h)** | KKG29A-C1 remote
Reykir 9000 A/C | KKG29AC1
KKG9AC1 | Yes | | [Mitsubishi](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Mitsubishi.cpp) | **[Mitsubishi](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Mitsubishi.h)** | HC3000 Projector (MITSUBISHI2)
KM14A 0179213 remote
MS-GK24VA A/C
TV (MITSUBISHI) | | Yes | -| [Mitsubishi](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Mitsubishi.cpp) | **[Mitsubishi Electric](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Mitsubishi.h)** | 001CP T7WE10714 remote (MITSUBISHI136)
KPOA remote (MITSUBISHI112)
MLZ-RX5017AS A/C (MITSUBISHI_AC)
MSH-A24WV A/C (MITSUBISHI112)
MSZ-FHnnVE A/C (MITSUBISHI_AC)
MSZ-GV2519 A/C (MITSUBISHI_AC)
MSZ-SF25VE3 A/C (MITSUBISHI_AC)
MSZ-ZW4017S A/C (MITSUBISHI_AC)
MUH-A24WV A/C (MITSUBISHI112)
PEAD-RP71JAA Ducted A/C (MITSUBISHI136)
RH151 remote (MITSUBISHI_AC)
RH151/M21ED6426 remote (MITSUBISHI_AC)
SG153/M21EDF426 remote (MITSUBISHI_AC)
SG15D remote (MITSUBISHI_AC) | | Yes | +| [Mitsubishi](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Mitsubishi.cpp) | **[Mitsubishi Electric](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Mitsubishi.h)** | 001CP T7WE10714 remote (MITSUBISHI136)
KPOA remote (MITSUBISHI112)
MLZ-RX5017AS A/C (MITSUBISHI_AC)
MSH-A24WV A/C (MITSUBISHI112)
MSZ-FHnnVE A/C (MITSUBISHI_AC)
MSZ-GV2519 A/C (MITSUBISHI_AC)
MSZ-SF25VE3 A/C (MITSUBISHI_AC)
MSZ-ZW4017S A/C (MITSUBISHI_AC)
MUH-A24WV A/C (MITSUBISHI112)
PAR-FA32MA remote (MITSUBISHI136)
PEAD-RP71JAA Ducted A/C (MITSUBISHI136)
RH151 remote (MITSUBISHI_AC)
RH151/M21ED6426 remote (MITSUBISHI_AC)
SG153/M21EDF426 remote (MITSUBISHI_AC)
SG15D remote (MITSUBISHI_AC) | | Yes | | [MitsubishiHeavy](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_MitsubishiHeavy.cpp) | **[Mitsubishi Heavy Industries](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_MitsubishiHeavy.h)** | RKX502A001C remote (88 bit)
RLA502A700B remote (152 bit)
SRKxxZJ-S A/C (88 bit)
SRKxxZM-S A/C (152 bit)
SRKxxZMXA-S A/C (152 bit) | | Yes | | [Multibrackets](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Multibrackets.cpp) | **Multibrackets** | Motorized Swing mount large - 4500 | | - | | [NEC](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_NEC.cpp) | **[Aloka](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_NEC.h)** | SleepyLights LED Lamp | | - | @@ -137,7 +139,9 @@ | [Voltas](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Voltas.cpp) | **[Voltas](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Voltas.h)** | 122LZF 4011252 Window A/C | 122LZF | Yes | | [Whirlpool](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Whirlpool.cpp) | **[Whirlpool](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Whirlpool.h)** | DG11J1-04 remote
DG11J1-3A remote
DG11J1-91 remote
SPIS409L A/C
SPIS412L A/C
SPIW409L A/C
SPIW412L A/C
SPIW418L A/C | DG11J13A
DG11J191 | Yes | | [Whynter](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Whynter.cpp) | **Whynter** | ARC-110WD A/C | | - | +| [Wowwee](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Wowwee.cpp) | **WowWee** | RoboRapter-X | | - | | [Xmp](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Xmp.cpp) | **Xfinity** | XR11 remote
XR2 remote | | - | +| [York](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_York.cpp) | **[York](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_York.h)** | GRYLH2A remote
MHH07P17 A/C | | Yes | | [Zepeal](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Zepeal.cpp) | **Zepeal** | DRT-A3311(BG) 5 button remote
DRT-A3311(BG) floor fan | | - | @@ -164,6 +168,7 @@ - CARRIER_AC128 - CARRIER_AC40 - CARRIER_AC64 +- CARRIER_AC84 - CLIMABUTLER - COOLIX - COOLIX48 @@ -189,6 +194,7 @@ - FUJITSU_AC - GICABLE - GOODWEATHER +- GORENJE - GREE - HAIER_AC - HAIER_AC160 @@ -267,5 +273,7 @@ - VOLTAS - WHIRLPOOL_AC - WHYNTER +- WOWWEE - XMP +- YORK - ZEPEAL diff --git a/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/examples/IRMQTTServer/IRMQTTServer.h b/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/examples/IRMQTTServer/IRMQTTServer.h index 611c1ff73..d347b69cb 100644 --- a/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/examples/IRMQTTServer/IRMQTTServer.h +++ b/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/examples/IRMQTTServer/IRMQTTServer.h @@ -132,6 +132,8 @@ const uint32_t kMqttReconnectTime = 5000; // Delay(ms) between reconnect tries. #define MQTT_CLIMATE "ac" // Sub-topic for the climate topics. #define MQTT_CLIMATE_CMND "cmnd" // Sub-topic for the climate command topics. #define MQTT_CLIMATE_STAT "stat" // Sub-topic for the climate stat topics. +// Sub-topic for the temperature/humidity sensor stat topics. +#define MQTT_SENSOR_STAT "sensor" // Enable sending/receiving climate via JSON. `true` cost ~5k of program space. #define MQTT_CLIMATE_JSON false @@ -221,6 +223,25 @@ const uint16_t kMinUnknownSize = 2 * 10; // actual a/c unit. #define REPLAY_DECODED_AC_MESSAGE false +// ------------------------ SHT-3x Support ------------------------------------- +// To enable SHT-3x sensor support (such as the Lolin SHT30 Shield), connected +// to GPIOs 4 and 5 (D2 and D1), do the following: +// - uncomment the line in platformio.ini to enable the SHT-3x library +// - uncomment the following #define line +// #define SHT3X_SUPPORT true + +// Default address for SHT-3x sensor. +#define SHT3X_I2C_ADDRESS 0x44 +// Requires MQTT_DISCOVERY_ENABLE to be true as well. +// If set, will send HA MQTT Discovery messages for the SHT-3x sensor. +#define SHT3X_MQTT_DISCOVERY_ENABLE true +// I2C SDA pin for SHT-3x sensor (D2). +#define SHT3X_I2C_SDA 4 +// I2C SCL pin for SHT-3x sensor (D1). +#define SHT3X_I2C_SCL 5 +// Check frequency for SHT-3x sensor (in seconds). +#define SHT3X_CHECK_FREQ 60 + // ------------------------ Advanced Usage Only -------------------------------- // Reports the input voltage to the ESP chip. **NOT** the input voltage @@ -238,6 +259,7 @@ const uint16_t kMinUnknownSize = 2 * 10; #define KEY_POWER "power" #define KEY_MODE "mode" #define KEY_TEMP "temp" +#define KEY_HUMIDITY "humidity" #define KEY_FANSPEED "fanspeed" #define KEY_SWINGV "swingv" #define KEY_SWINGH "swingh" @@ -253,6 +275,9 @@ const uint16_t kMinUnknownSize = 2 * 10; #define KEY_JSON "json" #define KEY_RESEND "resend" #define KEY_VCC "vcc" +#define KEY_COMMAND "command" +#define KEY_SENSORTEMP "sensortemp" +#define KEY_IFEEL "ifeel" // HTML arguments we will parse for IR code information. #define KEY_TYPE "type" // KEY_PROTOCOL is also checked too. @@ -260,11 +285,17 @@ const uint16_t kMinUnknownSize = 2 * 10; #define KEY_BITS "bits" #define KEY_REPEAT "repeats" #define KEY_CHANNEL "channel" // Which IR TX channel to send on. +#define KEY_SENSORTEMP_DISABLED "sensortemp_disabled" // For HTML form only, + // not sent via MQTT + // nor JSON // GPIO html/config keys #define KEY_TX_GPIO "tx" #define KEY_RX_GPIO "rx" +// Miscellaneous constants +#define TOGGLE_JS_FN_NAME "ToggleInputBasedOnCheckbox" + // Text for Last Will & Testament status messages. const char* const kLwtOnline = "Online"; const char* const kLwtOffline = "Offline"; @@ -290,7 +321,7 @@ const uint16_t kJsonAcStateMaxSize = 1024; // Bytes // ----------------- End of User Configuration Section ------------------------- // Constants -#define _MY_VERSION_ "v1.7.0" +#define _MY_VERSION_ "v1.8.2" const uint8_t kRebootTime = 15; // Seconds const uint8_t kQuickDisplayTime = 2; // Seconds @@ -358,7 +389,8 @@ static const char kClimateTopics[] PROGMEM = "(" KEY_PROTOCOL "|" KEY_MODEL "|" KEY_POWER "|" KEY_MODE "|" KEY_TEMP "|" KEY_FANSPEED "|" KEY_SWINGV "|" KEY_SWINGH "|" KEY_QUIET "|" KEY_TURBO "|" KEY_LIGHT "|" KEY_BEEP "|" KEY_ECONO "|" KEY_SLEEP "|" - KEY_FILTER "|" KEY_CLEAN "|" KEY_CELSIUS "|" KEY_RESEND + KEY_FILTER "|" KEY_CLEAN "|" KEY_CELSIUS "|" KEY_RESEND "|" KEY_COMMAND "|" + "|" KEY_SENSORTEMP "|" KEY_IFEEL #if MQTT_CLIMATE_JSON "|" KEY_JSON #endif // MQTT_CLIMATE_JSON @@ -367,6 +399,7 @@ static const char* const kMqttTopics[] = { KEY_PROTOCOL, KEY_MODEL, KEY_POWER, KEY_MODE, KEY_TEMP, KEY_FANSPEED, KEY_SWINGV, KEY_SWINGH, KEY_QUIET, KEY_TURBO, KEY_LIGHT, KEY_BEEP, KEY_ECONO, KEY_SLEEP, KEY_FILTER, KEY_CLEAN, KEY_CELSIUS, KEY_RESEND, + KEY_COMMAND, KEY_SENSORTEMP, KEY_IFEEL KEY_JSON}; // KEY_JSON needs to be the last one. @@ -410,7 +443,8 @@ int8_t getDefaultTxGpio(void); String genStatTopic(const uint16_t channel = 0); String listOfTxGpios(void); bool hasUnsafeHTMLChars(String input); -String htmlHeader(const String title, const String h1_text = ""); +String htmlHeader(const String title, const String h1_text = "", + const String headScriptsJS = ""); String htmlEnd(void); String htmlButton(const String url, const String button, const String text = ""); @@ -418,9 +452,13 @@ String htmlMenu(void); void handleRoot(void); String addJsReloadUrl(const String url, const uint16_t timeout_s, const bool notify); +String getJsToggleCheckbox(const String functionName = TOGGLE_JS_FN_NAME); void handleExamples(void); String htmlOptionItem(const String value, const String text, bool selected); String htmlSelectBool(const String name, const bool def); +String htmlDisableCheckbox(const String name, const String targetControlId, + const bool checked, + const String toggleJsFnName = TOGGLE_JS_FN_NAME); String htmlSelectClimateProtocol(const String name, const decode_type_t def); String htmlSelectAcStateProtocol(const String name, const decode_type_t def, const bool simple); @@ -449,6 +487,9 @@ bool parseStringAndSendPronto(IRsend *irsend, const String str, #if SEND_RAW bool parseStringAndSendRaw(IRsend *irsend, const String str); #endif // SEND_RAW +#if SHT3X_SUPPORT +void sendMQTTDiscoverySensor(const char *topic, String type); +#endif // SH3X_SUPPORT void handleIr(void); void handleNotFound(void); void setup_wifi(void); diff --git a/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/examples/IRMQTTServer/IRMQTTServer.ino b/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/examples/IRMQTTServer/IRMQTTServer.ino index 4f3324fc2..35a528107 100644 --- a/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/examples/IRMQTTServer/IRMQTTServer.ino +++ b/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/examples/IRMQTTServer/IRMQTTServer.ino @@ -231,6 +231,49 @@ * * In HA's configuration.yaml, add: * + * #### New format (Post Home Assistant 2022.6 release) + * + * mqtt: + * climate: + * - name: Living Room Aircon + * modes: + * - "off" + * - "auto" + * - "cool" + * - "heat" + * - "dry" + * - "fan_only" + * fan_modes: + * - "Auto" + * - "Min" + * - "Low" + * - "Medium" + * - "High" + * - "Max" + * swing_modes: + * - "Off" + * - "Auto" + * - "Highest" + * - "High" + * - "Middle" + * - "Low" + * - "Lowest" + * power_command_topic: "ir_server/ac/cmnd/power" + * mode_command_topic: "ir_server/ac/cmnd/mode" + * mode_state_topic: "ir_server/ac/stat/mode" + * temperature_command_topic: "ir_server/ac/cmnd/temp" + * temperature_state_topic: "ir_server/ac/stat/temp" + * fan_mode_command_topic: "ir_server/ac/cmnd/fanspeed" + * fan_mode_state_topic: "ir_server/ac/stat/fanspeed" + * swing_mode_command_topic: "ir_server/ac/cmnd/swingv" + * swing_mode_state_topic: "ir_server/ac/stat/swingv" + * min_temp: 16 + * max_temp: 32 + * temp_step: 1 + * retain: false + * + * #### Old format (Pre Home Assistant 2022.6 release) + * * climate: * - platform: mqtt * name: Living Room Aircon @@ -256,8 +299,7 @@ * - "Middle" * - "Low" * - "Lowest" - * # `power_command_topic` is probably not needed for most HA configurations - * # power_command_topic: "ir_server/ac/cmnd/power" + * power_command_topic: "ir_server/ac/cmnd/power" * mode_command_topic: "ir_server/ac/cmnd/mode" * mode_state_topic: "ir_server/ac/stat/mode" * temperature_command_topic: "ir_server/ac/cmnd/temp" @@ -377,6 +419,10 @@ using irutils::msToString; ADC_MODE(ADC_VCC); #endif // REPORT_VCC +#ifdef SHT3X_SUPPORT +#include +#endif + // Globals uint8_t _sanity = 0; #if defined(ESP8266) @@ -453,9 +499,15 @@ String MqttClimateCmnd; // Sub-topic for the climate command topics. #if MQTT_DISCOVERY_ENABLE String MqttDiscovery; String MqttUniqueId; +#if SHT3X_SUPPORT && SHT3X_MQTT_DISCOVERY_ENABLE +String MqttDiscoverySensor; +#endif // SHT3X_SUPPORT && SHT3X_MQTT_DISCOVERY_ENABLE #endif // MQTT_DISCOVERY_ENABLE String MqttHAName; String MqttClientId; +#if SHT3X_SUPPORT +String MqttSensorStat; +#endif // SHT3X_SUPPORT // Primative lock file for gating MQTT state broadcasts. bool lockMqttBroadcast = true; @@ -495,6 +547,11 @@ bool isSerialGpioUsedByIr(void) { return false; // Not in use as far as we can tell. } +#if SHT3X_SUPPORT +SHT3X TemperatureSensor(SHT3X_I2C_ADDRESS); +TimerMs statSensorReadTime = TimerMs(); +#endif // SHT3X_SUPPORT + // Debug messages get sent to the serial port. #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wunused-parameter" @@ -905,7 +962,7 @@ void handleExamples(void) { #endif // EXAMPLES_ENABLE String htmlSelectBool(const String name, const bool def) { - String html = F(""); for (uint16_t i = 0; i < 2; i++) html += htmlOptionItem(IRac::boolToString(i), IRac::boolToString(i), i == def); @@ -913,8 +970,20 @@ String htmlSelectBool(const String name, const bool def) { return html; } +String htmlDisableCheckbox(const String name, const String targetControlId, + const bool checked, const String toggleJsFnName) { + String html = String(F("Disabled"); + return html; +} + String htmlSelectClimateProtocol(const String name, const decode_type_t def) { - String html = F(""); for (uint8_t i = 1; i <= decode_type_t::kLastDecodeType; i++) { if (IRac::isProtocolSupported((decode_type_t)i)) { html += htmlOptionItem(String(i), typeToString((decode_type_t)i), @@ -926,7 +995,7 @@ String htmlSelectClimateProtocol(const String name, const decode_type_t def) { } String htmlSelectModel(const String name, const int16_t def) { - String html = F(""); for (int16_t i = -1; i <= 6; i++) { String num = String(i); String text; @@ -942,9 +1011,21 @@ String htmlSelectModel(const String name, const int16_t def) { return html; } +String htmlSelectCommandType(const String name, const stdAc::ac_command_t def) { + String html = String(F(""); + return html; +} + String htmlSelectUint(const String name, const uint16_t max, const uint16_t def) { - String html = F(""); for (uint16_t i = 0; i < max; i++) { String num = String(i); html += htmlOptionItem(num, num, i == def); @@ -955,7 +1036,7 @@ String htmlSelectUint(const String name, const uint16_t max, String htmlSelectGpio(const String name, const int16_t def, const int8_t list[], const int16_t length) { - String html = F(": "); for (int16_t i = 0; i < length; i++) { String num = String(list[i]); html += htmlOptionItem(num, list[i] == kGpioUnused ? F("Unused") : num, @@ -967,7 +1048,7 @@ String htmlSelectGpio(const String name, const int16_t def, } String htmlSelectMode(const String name, const stdAc::opmode_t def) { - String html = F(""); for (int8_t i = -1; i <= (int8_t)stdAc::opmode_t::kLastOpmodeEnum; i++) { String mode = IRac::opmodeToString((stdAc::opmode_t)i); html += htmlOptionItem(mode, mode, (stdAc::opmode_t)i == def); @@ -977,7 +1058,7 @@ String htmlSelectMode(const String name, const stdAc::opmode_t def) { } String htmlSelectFanspeed(const String name, const stdAc::fanspeed_t def) { - String html = F(""); for (int8_t i = 0; i <= (int8_t)stdAc::fanspeed_t::kLastFanspeedEnum; i++) { String speed = IRac::fanspeedToString((stdAc::fanspeed_t)i); html += htmlOptionItem(speed, speed, (stdAc::fanspeed_t)i == def); @@ -987,7 +1068,7 @@ String htmlSelectFanspeed(const String name, const stdAc::fanspeed_t def) { } String htmlSelectSwingv(const String name, const stdAc::swingv_t def) { - String html = F(""); for (int8_t i = -1; i <= (int8_t)stdAc::swingv_t::kLastSwingvEnum; i++) { String swing = IRac::swingvToString((stdAc::swingv_t)i); html += htmlOptionItem(swing, swing, (stdAc::swingv_t)i == def); @@ -997,7 +1078,7 @@ String htmlSelectSwingv(const String name, const stdAc::swingv_t def) { } String htmlSelectSwingh(const String name, const stdAc::swingh_t def) { - String html = F(""); for (int8_t i = -1; i <= (int8_t)stdAc::swingh_t::kLastSwinghEnum; i++) { String swing = IRac::swinghToString((stdAc::swingh_t)i); html += htmlOptionItem(swing, swing, (stdAc::swingh_t)i == def); @@ -1006,14 +1087,20 @@ String htmlSelectSwingh(const String name, const stdAc::swingh_t def) { return html; } -String htmlHeader(const String title, const String h1_text) { +String htmlHeader(const String title, const String h1_text, + const String headScriptsJS) { String html = F(""); html += title; html += F("" "" - "

"); + "initial-scale=1.0,minimum-scale=1.0,maximum-scale=5.0\">"); + if (headScriptsJS.length()) { + html += F("\n"); + } + html += F("

"); if (h1_text.length()) html += h1_text; else @@ -1036,15 +1123,26 @@ String htmlButton(const String url, const String button, const String text) { return html; } +String getJsToggleCheckbox(const String functionName) { + const String javascript = + String(F(" function ")) + functionName + F("(checkbox, targetInputId) {\n" + " var targetControl = document.getElementById(targetInputId);\n" + " targetControl.disabled = checkbox.checked;\n" + " if (!targetControl.disabled) { targetControl.focus(); }\n" + " }\n"); + return javascript; +} + // Admin web page void handleAirCon(void) { - String html = htmlHeader(F("Air Conditioner Control")); + String html = htmlHeader(F("Air Conditioner Control"), "", + getJsToggleCheckbox()); html += htmlMenu(); if (kNrOfIrTxGpios > 1) { - html += F("
" "" - "" @@ -1053,11 +1151,12 @@ void handleAirCon(void) { "
"); } if (climate[chan] != NULL) { - html += F("

Current Settings

" + bool noSensorTemp = (climate[chan]->next.sensorTemperature == kNoTempValue); + html += String(F("

Current Settings

" "" - "") + + "") + F("
Climate #") + + "
Climate #")) + htmlSelectUint(KEY_CHANNEL, kNrOfIrTxGpios, chan) + F("" "
" "" + "" "" @@ -1084,6 +1186,16 @@ void handleAirCon(void) { (!climate[chan]->next.celsius ? " selected='selected'" : "") + F(">F" "" + "" "" @@ -1096,6 +1208,9 @@ void handleAirCon(void) { "" + "" "" @@ -1190,7 +1305,13 @@ void handleAdmin(void) { #if MQTT_DISCOVERY_ENABLE html += htmlButton( kUrlSendDiscovery, F("Send MQTT Discovery"), - F("Send a Climate MQTT discovery message to Home Assistant.

")); +#if SHT3X_SUPPORT && SHT3X_MQTT_DISCOVERY_ENABLE + F("Send a Climate and Sensor MQTT" +#else + F("Send a Climate MQTT" +#endif // SHT3X_SUPPORT && SHT3X_MQTT_DISCOVERY_ENABLE + " discovery message to Home Assistant.

")); + #endif // MQTT_DISCOVERY_ENABLE #if MQTT_CLEAR_ENABLE html += htmlButton( @@ -1244,8 +1365,8 @@ void handleInfo(void) { String html = htmlHeader(F("IR MQTT server info")); html += htmlMenu(); html += - F("

General

" - "

Hostname: ") + String(Hostname) + F("
" + String(F("

General

" + "

Hostname: ")) + String(Hostname) + F("
" "IP address: ") + WiFi.localIP().toString() + F("
" "MAC address: ") + WiFi.macAddress() + F("
" "Booted: ") + timeSince(1) + F("
") + @@ -1392,6 +1513,10 @@ bool clearMqttSavedStates(const String topic_base) { #if MQTT_DISCOVERY_ENABLE // Clear the HA climate discovery message. success &= mqtt_client.publish(MqttDiscovery.c_str(), "", true); +#if SHT3X_SUPPORT && MQTT_DISCOVERY_ENABLE + // Clear the HA sensor discovery message. + success &= mqtt_client.publish(MqttDiscoverySensor.c_str(), "", true); +#endif // SHT3X_SUPPORT && MQTT_DISCOVERY_ENABLE #endif // MQTT_DISCOVERY_ENABLE for (size_t channel = 0; channel <= kNrOfIrTxGpios; @@ -2106,13 +2231,20 @@ void init_vars(void) { MqttClimateCmnd = MqttClimate + '/' + MQTT_CLIMATE_CMND + '/'; // Sub-topic for the climate stat topics. #if MQTT_DISCOVERY_ENABLE - MqttDiscovery = "homeassistant/climate/" + String(Hostname) + "/config"; + MqttDiscovery = "homeassistant/climate/" + String(Hostname); +#if SHT3X_SUPPORT && SHT3X_MQTT_DISCOVERY_ENABLE + MqttDiscoverySensor = "homeassistant/sensor/" + String(Hostname); +#endif // SHT3X_SUPPORT && SHT3X_MQTT_DISCOVERY_ENABLE MqttUniqueId = WiFi.macAddress(); MqttUniqueId.replace(":", ""); #endif // MQTT_DISCOVERY_ENABLE MqttHAName = String(Hostname) + "_aircon"; // Create a unique MQTT client id. MqttClientId = String(Hostname) + String(kChipId, HEX); +#if SHT3X_SUPPORT + // Sub-topic for the climate stat topics. + MqttSensorStat = String(MqttPrefix) + '/' + MQTT_SENSOR_STAT + '/'; +#endif // SHT3X_SUPPORT #endif // MQTT_ENABLE } @@ -2418,6 +2550,9 @@ void handleSendMqttDiscovery(void) { htmlMenu() + F("

The Home Assistant MQTT Discovery message is being sent to topic: ") + MqttDiscovery + +#if SHT3X_SUPPORT && SHT3X_MQTT_DISCOVERY_ENABLE + F(" and ") + MqttDiscoverySensor + +#endif // SHT3X_SUPPORT && SHT3X_MQTT_DISCOVERY_ENABLE F(". It will show up in Home Assistant in a few seconds." "

" "

Warning!

" @@ -2425,7 +2560,15 @@ void handleSendMqttDiscovery(void) { " is sent.

") + addJsReloadUrl(kUrlRoot, kRebootTime, true) + htmlEnd()); - sendMQTTDiscovery(MqttDiscovery.c_str()); + for (uint16_t i = 0; i < kNrOfIrTxGpios; i++) { + String channel_id = ""; + if (i > 0) channel_id = "_" + String(i); + sendMQTTDiscovery(MqttDiscovery.c_str(), channel_id); + } +#if SHT3X_SUPPORT && SHT3X_MQTT_DISCOVERY_ENABLE + sendMQTTDiscoverySensor(MqttDiscoverySensor.c_str(), KEY_TEMP); + sendMQTTDiscoverySensor(MqttDiscoverySensor.c_str(), KEY_HUMIDITY); +#endif // SHT3X_SUPPORT && SHT3X_MQTT_DISCOVERY_ENABLE } #endif // MQTT_DISCOVERY_ENABLE @@ -2598,12 +2741,13 @@ void mqttCallback(char* topic, byte* payload, unsigned int length) { } #if MQTT_DISCOVERY_ENABLE -void sendMQTTDiscovery(const char *topic) { +void sendMQTTDiscovery(const char *topic, String channel_id) { + String pub_topic = String(topic) + channel_id + F("/config"); if (mqtt_client.publish( - topic, String( + pub_topic.c_str(), String( F("{" - "\"~\":\"") + MqttClimate + F("\"," - "\"name\":\"") + MqttHAName + F("\"," + "\"~\":\"") + MqttClimate + channel_id + F("\"," + "\"name\":\"") + MqttHAName + channel_id + F("\"," #if (!MQTT_CLIMATE_HA_MODE) // Typically we don't need or use the power command topic if we are using // our Home Assistant Climate compatiblity mode. It causes odd behaviour @@ -2629,9 +2773,12 @@ void sendMQTTDiscovery(const char *topic) { "\"swing_modes\":[\"" D_STR_OFF "\",\"" D_STR_AUTO "\",\"" D_STR_HIGHEST "\",\"" D_STR_HIGH "\",\"" D_STR_MIDDLE "\",\"" D_STR_LOW "\",\"" D_STR_LOWEST "\"]," - "\"uniq_id\":\"") + MqttUniqueId + F("\"," +#if SHT3X_SUPPORT + "\"curr_temp_t\":\"") + MqttSensorStat + F(KEY_TEMP "\"," +#endif // SHT3X_SUPPORT + "\"uniq_id\":\"") + MqttUniqueId + channel_id + F("\"," "\"device\":{" - "\"identifiers\":[\"") + MqttUniqueId + F("\"]," + "\"identifiers\":[\"") + MqttUniqueId + channel_id + F("\"]," "\"connections\":[[\"mac\",\"") + WiFi.macAddress() + F("\"]]," "\"manufacturer\":\"IRremoteESP8266\"," "\"model\":\"IRMQTTServer\"," @@ -2647,6 +2794,47 @@ void sendMQTTDiscovery(const char *topic) { mqttLog(PSTR("MQTT climate discovery FAILED to send.")); } } + +#if SHT3X_SUPPORT && SHT3X_MQTT_DISCOVERY_ENABLE +// Send the MQTT Discovery data for the SHT3X sensor. +// type must be a String of either KEY_TEMP or KEY_HUMIDITY. +void sendMQTTDiscoverySensor(const char *topic, String type) { + String pub_topic = String(topic) + F("_") + type + F("/config"); + String uom = "%"; + String ha_class = type; + // XXX Update units of measure for temperature. + if (type == KEY_TEMP) { + uom = "°C"; + ha_class = "temperature"; + } + if (mqtt_client.publish( + pub_topic.c_str(), String( + F("{" + "\"name\":\"") + MqttHAName + "_" + type + F("\"," + + "\"stat_t\":\"") + MqttSensorStat + type + F("\"," + "\"dev_cla\":\"") + ha_class + F("\"," + "\"unit_of_meas\":\"") + uom + F("\"," + + "\"uniq_id\":\"") + MqttUniqueId + type + F("\"," + "\"device\":{" + "\"identifiers\":[\"") + MqttUniqueId + type + F("\"]," + "\"connections\":[[\"mac\",\"") + WiFi.macAddress() + F("\"]]," + "\"manufacturer\":\"IRremoteESP8266\"," + "\"model\":\"IRMQTTServer\"," + "\"name\":\"") + Hostname + F("\"," + "\"sw_version\":\"" _MY_VERSION_ "\"" + "}" + "}")).c_str(), true)) { + mqttLog(PSTR("MQTT sensor discovery successful sent.")); + hasDiscoveryBeenSent = true; + lastDiscovery.reset(); + mqttSentCounter++; + } else { + mqttLog(PSTR("MQTT sensor discovery FAILED to send.")); + } +} +#endif // SHT3X_SUPPORT && SHT3X_MQTT_DISCOVERY_ENABLE #endif // MQTT_DISCOVERY_ENABLE #endif // MQTT_ENABLE @@ -2678,8 +2866,8 @@ void loop(void) { boot = false; } else { mqttLog(String( - F("IRMQTTServer just (re)connected to MQTT. " - "Lost connection about ") + String(F("IRMQTTServer just (re)connected to MQTT. " + "Lost connection about ")) + timeSince(lastConnectedTime)).c_str()); } lastConnectedTime = now; @@ -2715,6 +2903,29 @@ void loop(void) { } // Periodically send all of the climate state via MQTT. doBroadcast(&lastBroadcast, kBroadcastPeriodMs, climate, false, false); +#if SHT3X_SUPPORT + // Check if it's time to read the SHT3x sensor. + if (statSensorReadTime.elapsed() > SHT3X_CHECK_FREQ * 1000) { + byte result = TemperatureSensor.get(); + if (result == 0) { + // Success + float temp = TemperatureSensor.cTemp; + // XXX Convert units + float humidity = TemperatureSensor.humidity; + // Publish the temp and humidity to MQTT. + String mqttTempTopic = MqttSensorStat + KEY_TEMP; + String mqttHumidityTopic = MqttSensorStat + KEY_HUMIDITY; + mqtt_client.publish(mqttTempTopic.c_str(), String(temp).c_str()); + mqtt_client.publish(mqttHumidityTopic.c_str(), + String(humidity).c_str()); + } else { + // Error + mqttLog((String(F("SHT3x sensor read error: ")) + + String(result)).c_str()); + } + statSensorReadTime.reset(); + } +#endif // SHT3X_SUPPORT } #endif // MQTT_ENABLE #if IR_RX @@ -2934,6 +3145,7 @@ void sendJsonState(const stdAc::state_t state, const String topic, DynamicJsonDocument json(kJsonAcStateMaxSize); json[KEY_PROTOCOL] = typeToString(state.protocol); json[KEY_MODEL] = state.model; + json[KEY_COMMAND] = IRac::commandToString(state.command); json[KEY_POWER] = IRac::boolToString(state.power); json[KEY_MODE] = IRac::opmodeToString(state.mode, ha_mode); // Home Assistant wants mode to be off if power is also off & vice-versa. @@ -2943,10 +3155,12 @@ void sendJsonState(const stdAc::state_t state, const String topic, } json[KEY_CELSIUS] = IRac::boolToString(state.celsius); json[KEY_TEMP] = state.degrees; + json[KEY_SENSORTEMP] = state.sensorTemperature; json[KEY_FANSPEED] = IRac::fanspeedToString(state.fanspeed); json[KEY_SWINGV] = IRac::swingvToString(state.swingv); json[KEY_SWINGH] = IRac::swinghToString(state.swingh); json[KEY_QUIET] = IRac::boolToString(state.quiet); + json[KEY_IFEEL] = IRac::boolToString(state.iFeel); json[KEY_TURBO] = IRac::boolToString(state.turbo); json[KEY_ECONO] = IRac::boolToString(state.econo); json[KEY_LIGHT] = IRac::boolToString(state.light); @@ -2984,6 +3198,10 @@ stdAc::state_t jsonToState(const stdAc::state_t current, const char *str) { result.model = IRac::strToModel(json[KEY_MODEL].as()); else if (validJsonInt(json, KEY_MODEL)) result.model = json[KEY_MODEL]; + if (validJsonStr(json, KEY_COMMAND)) + result.command = IRac::strToCommand(json[KEY_COMMAND].as()); + else if (validJsonInt(json, KEY_COMMAND)) + result.command = json[KEY_COMMAND]; if (validJsonStr(json, KEY_MODE)) result.mode = IRac::strToOpmode(json[KEY_MODE]); if (validJsonStr(json, KEY_FANSPEED)) @@ -2994,10 +3212,14 @@ stdAc::state_t jsonToState(const stdAc::state_t current, const char *str) { result.swingh = IRac::strToSwingH(json[KEY_SWINGH]); if (json.containsKey(KEY_TEMP)) result.degrees = json[KEY_TEMP]; + if (json.containsKey(KEY_SENSORTEMP)) + result.sensorTemperature = json[KEY_SENSORTEMP]; if (validJsonInt(json, KEY_SLEEP)) result.sleep = json[KEY_SLEEP]; if (validJsonStr(json, KEY_POWER)) result.power = IRac::strToBool(json[KEY_POWER]); + if (validJsonStr(json, KEY_IFEEL)) + result.iFeel = IRac::strToBool(json[KEY_IFEEL]); if (validJsonStr(json, KEY_QUIET)) result.quiet = IRac::strToBool(json[KEY_QUIET]); if (validJsonStr(json, KEY_TURBO)) @@ -3029,6 +3251,8 @@ void updateClimate(stdAc::state_t *state, const String str, state->protocol = strToDecodeType(payload.c_str()); } else if (str.equals(prefix + F(KEY_MODEL))) { state->model = IRac::strToModel(payload.c_str()); + } else if (str.equals(prefix + F(KEY_COMMAND))) { + state->command = IRac::strToCommandType(payload.c_str()); } else if (str.equals(prefix + F(KEY_POWER))) { state->power = IRac::strToBool(payload.c_str()); #if MQTT_CLIMATE_HA_MODE @@ -3039,16 +3263,32 @@ void updateClimate(stdAc::state_t *state, const String str, state->mode = IRac::strToOpmode(payload.c_str()); #if MQTT_CLIMATE_HA_MODE // When in Home Assistant mode, a Mode of Off, means turn the Power off too. - if (state->mode == stdAc::opmode_t::kOff) state->power = false; + if (state->mode == stdAc::opmode_t::kOff) { + state->power = false; + } else { + state->power = true; + } #endif // MQTT_CLIMATE_HA_MODE } else if (str.equals(prefix + F(KEY_TEMP))) { state->degrees = payload.toFloat(); + } else if (str.equals(prefix + F(KEY_SENSORTEMP))) { + state->sensorTemperature = payload.toFloat(); + } else if (str.equals(prefix + F(KEY_SENSORTEMP_DISABLED))) { + // The "disabled" html form field appears after the actual sensorTemp field + // and the spec guarantees the form POST field order preserves body order + // => this will always execute after KEY_SENSORTEMP has been parsed already + if (IRac::strToBool(payload.c_str())) { + // UI control was disabled, ignore the value + state->sensorTemperature = kNoTempValue; + } } else if (str.equals(prefix + F(KEY_FANSPEED))) { state->fanspeed = IRac::strToFanspeed(payload.c_str()); } else if (str.equals(prefix + F(KEY_SWINGV))) { state->swingv = IRac::strToSwingV(payload.c_str()); } else if (str.equals(prefix + F(KEY_SWINGH))) { state->swingh = IRac::strToSwingH(payload.c_str()); + } else if (str.equals(prefix + F(KEY_IFEEL))) { + state->iFeel = IRac::strToBool(payload.c_str()); } else if (str.equals(prefix + F(KEY_QUIET))) { state->quiet = IRac::strToBool(payload.c_str()); } else if (str.equals(prefix + F(KEY_TURBO))) { @@ -3086,14 +3326,16 @@ bool sendClimate(const String topic_prefix, const bool retain, diff = true; success &= sendInt(topic_prefix + KEY_MODEL, next.model, retain); } + if (prev.command != next.command || forceMQTT) { + String command_str = IRac::commandTypeToString(next.command); + diff = true; + success &= sendString(topic_prefix + KEY_COMMAND, command_str, retain); + } #ifdef MQTT_CLIMATE_HA_MODE String mode_str = IRac::opmodeToString(next.mode, MQTT_CLIMATE_HA_MODE); #else // MQTT_CLIMATE_HA_MODE String mode_str = IRac::opmodeToString(next.mode); #endif // MQTT_CLIMATE_HA_MODE - // I don't know why, but the modes need to be lower case to work with - // Home Assistant & Google Home. - mode_str.toLowerCase(); #if MQTT_CLIMATE_HA_MODE // Home Assistant want's these two bound together. if (prev.power != next.power || prev.mode != next.mode || forceMQTT) { @@ -3107,6 +3349,10 @@ bool sendClimate(const String topic_prefix, const bool retain, } if (prev.mode != next.mode || forceMQTT) { #endif // MQTT_CLIMATE_HA_MODE + // I don't know why, but the modes need to be lower case to work with + // Home Assistant & Google Home. + mode_str.toLowerCase(); + success &= sendString(topic_prefix + KEY_MODE, mode_str, retain); diff = true; } @@ -3118,6 +3364,11 @@ bool sendClimate(const String topic_prefix, const bool retain, diff = true; success &= sendBool(topic_prefix + KEY_CELSIUS, next.celsius, retain); } + if (prev.sensorTemperature != next.sensorTemperature || forceMQTT) { + diff = true; + success &= sendFloat(topic_prefix + KEY_SENSORTEMP, + next.sensorTemperature, retain); + } if (prev.fanspeed != next.fanspeed || forceMQTT) { diff = true; success &= sendString(topic_prefix + KEY_FANSPEED, @@ -3133,6 +3384,10 @@ bool sendClimate(const String topic_prefix, const bool retain, success &= sendString(topic_prefix + KEY_SWINGH, IRac::swinghToString(next.swingh), retain); } + if (prev.iFeel != next.iFeel || forceMQTT) { + diff = true; + success &= sendBool(topic_prefix + KEY_IFEEL, next.iFeel, retain); + } if (prev.quiet != next.quiet || forceMQTT) { diff = true; success &= sendBool(topic_prefix + KEY_QUIET, next.quiet, retain); diff --git a/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/examples/IRMQTTServer/platformio.ini b/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/examples/IRMQTTServer/platformio.ini index d0ac2b8c8..a20250c67 100644 --- a/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/examples/IRMQTTServer/platformio.ini +++ b/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/examples/IRMQTTServer/platformio.ini @@ -15,6 +15,8 @@ lib_deps_builtin = lib_deps_external = PubSubClient@>=2.8.0 ArduinoJson@>=6.0 +# Uncomment the following to enable SHT-3x support. +# https://github.com/wemos/WEMOS_SHT3x_Arduino_Library.git [common_esp8266] lib_deps_external = @@ -36,6 +38,14 @@ lib_deps = ${common_esp8266.lib_deps_external} board = d1_mini lib_deps = ${common_esp8266.lib_deps_external} +[env:d1_mini_noMDNS] +board = d1_mini +build_flags = + ${env.build_flags} + -DMQTT_SERVER_AUTODETECT_ENABLE=false + -DMDNS_ENABLE=false +lib_deps = ${common_esp8266.lib_deps_external} + [env:d1_mini_no_mqtt] board = d1_mini build_flags = diff --git a/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/keywords.txt b/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/keywords.txt index a562d2451..ef944fdb5 100644 --- a/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/keywords.txt +++ b/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/keywords.txt @@ -20,11 +20,14 @@ # Datatypes & Classes (KEYWORD1) ####################################### +Config KEYWORD1 CoronaSection KEYWORD1 IRAirtonAc KEYWORD1 IRAirwellAc KEYWORD1 IRAmcorAc KEYWORD1 IRArgoAC KEYWORD1 +IRArgoACBase KEYWORD1 +IRArgoAC_WREM3 KEYWORD1 IRBosch144AC KEYWORD1 IRCarrierAc64 KEYWORD1 IRCoolixAC KEYWORD1 @@ -83,11 +86,21 @@ IRTrumaAc KEYWORD1 IRVestelAc KEYWORD1 IRVoltas KEYWORD1 IRWhirlpoolAc KEYWORD1 +IRYorkAc KEYWORD1 IRac KEYWORD1 IRrecv KEYWORD1 IRsend KEYWORD1 IRtimer KEYWORD1 +Timer KEYWORD1 TimerMs KEYWORD1 +ac_command_t KEYWORD1 +argoFan_t KEYWORD1 +argoFlap_t KEYWORD1 +argoIrMessageType_t KEYWORD1 +argoMode_t KEYWORD1 +argoTimerType_t KEYWORD1 +argoWeekday KEYWORD1 +argo_ac_remote_model_t KEYWORD1 decode_results KEYWORD1 decode_type_t KEYWORD1 fanspeed_t KEYWORD1 @@ -116,6 +129,7 @@ whirlpool_ac_remote_model_t KEYWORD1 _backupState KEYWORD2 _cancelOffTimer KEYWORD2 _cancelOnTimer KEYWORD2 +_checksum KEYWORD2 _delayMicroseconds KEYWORD2 _getEconoToggle KEYWORD2 _getOffTimer KEYWORD2 @@ -137,6 +151,7 @@ _setSleepTimer KEYWORD2 _setTemp KEYWORD2 _setTime KEYWORD2 _setTimer KEYWORD2 +_stateReset KEYWORD2 _toString KEYWORD2 _validTolerance KEYWORD2 add KEYWORD2 @@ -152,12 +167,17 @@ addSwingHToString KEYWORD2 addSwingVToString KEYWORD2 addTempFloatToString KEYWORD2 addTempToString KEYWORD2 +addTimerModeToString KEYWORD2 addToggleToString KEYWORD2 adjustRepeat KEYWORD2 airton KEYWORD2 airwell KEYWORD2 amcor KEYWORD2 argo KEYWORD2 +argoWrem3_ACCommand KEYWORD2 +argoWrem3_ConfigSet KEYWORD2 +argoWrem3_SetTimer KEYWORD2 +argoWrem3_iFeelReport KEYWORD2 bcdToUint8 KEYWORD2 begin KEYWORD2 boolToString KEYWORD2 @@ -178,6 +198,7 @@ cancelOnTimer KEYWORD2 cancelTimers KEYWORD2 carrier64 KEYWORD2 celsiusToFahrenheit KEYWORD2 +channelToString KEYWORD2 checkInvertedBytePairs KEYWORD2 checkSum KEYWORD2 checkZjsSig KEYWORD2 @@ -189,6 +210,7 @@ clearPowerSpecial KEYWORD2 clearSensorTemp KEYWORD2 clearSleepTimerFlag KEYWORD2 cmpStates KEYWORD2 +commandTypeToString KEYWORD2 compare KEYWORD2 convertFan KEYWORD2 convertMode KEYWORD2 @@ -209,12 +231,15 @@ daikin176 KEYWORD2 daikin2 KEYWORD2 daikin216 KEYWORD2 daikin64 KEYWORD2 +dayToString KEYWORD2 +daysBitmaskToString KEYWORD2 decode KEYWORD2 decodeAirton KEYWORD2 decodeAirwell KEYWORD2 decodeAiwaRCT501 KEYWORD2 decodeAmcor KEYWORD2 decodeArgo KEYWORD2 +decodeArgoWREM3 KEYWORD2 decodeArris KEYWORD2 decodeBosch144 KEYWORD2 decodeBose KEYWORD2 @@ -223,6 +248,7 @@ decodeCarrierAC KEYWORD2 decodeCarrierAC128 KEYWORD2 decodeCarrierAC40 KEYWORD2 decodeCarrierAC64 KEYWORD2 +decodeCarrierAC84 KEYWORD2 decodeClimaButler KEYWORD2 decodeCoolix48 KEYWORD2 decodeCoronaAc KEYWORD2 @@ -247,6 +273,7 @@ decodeEpson KEYWORD2 decodeFujitsuAC KEYWORD2 decodeGICable KEYWORD2 decodeGoodweather KEYWORD2 +decodeGorenje KEYWORD2 decodeGree KEYWORD2 decodeHaierAC KEYWORD2 decodeHaierAC160 KEYWORD2 @@ -318,7 +345,9 @@ decodeVestelAc KEYWORD2 decodeVoltas KEYWORD2 decodeWhirlpoolAC KEYWORD2 decodeWhynter KEYWORD2 +decodeWowwee KEYWORD2 decodeXmp KEYWORD2 +decodeYork KEYWORD2 decodeZepeal KEYWORD2 defaultBits KEYWORD2 delonghiac KEYWORD2 @@ -371,6 +400,8 @@ getBreeze KEYWORD2 getBufSize KEYWORD2 getButton KEYWORD2 getCelsius KEYWORD2 +getChannel KEYWORD2 +getChecksum KEYWORD2 getClean KEYWORD2 getCleanToggle KEYWORD2 getClock KEYWORD2 @@ -381,10 +412,13 @@ getCorrectedRawLength KEYWORD2 getCurrTime KEYWORD2 getCurrentDay KEYWORD2 getCurrentTime KEYWORD2 +getCurrentTimeMinutes KEYWORD2 +getDelayTimerMinutes KEYWORD2 getDirectIndirect KEYWORD2 getDisplay KEYWORD2 getDisplayTempSource KEYWORD2 getDryGrade KEYWORD2 +getEco KEYWORD2 getEcocool KEYWORD2 getEcono KEYWORD2 getEconoToggle KEYWORD2 @@ -438,8 +472,10 @@ getPurify KEYWORD2 getQuiet KEYWORD2 getRClevel KEYWORD2 getRaw KEYWORD2 -getRoomTemp KEYWORD2 +getRawByteLength KEYWORD2 getSave KEYWORD2 +getScheduleTimerStartMinutes KEYWORD2 +getScheduleTimerStopMinutes KEYWORD2 getSectionByte KEYWORD2 getSectionChecksum KEYWORD2 getSensor KEYWORD2 @@ -455,6 +491,7 @@ getSpeed KEYWORD2 getStartClock KEYWORD2 getState KEYWORD2 getStateLength KEYWORD2 +getStateLengthForIrMsgType KEYWORD2 getStatePrev KEYWORD2 getStopClock KEYWORD2 getSupercool KEYWORD2 @@ -476,6 +513,7 @@ getTempUnit KEYWORD2 getTempUnits KEYWORD2 getTime KEYWORD2 getTimer KEYWORD2 +getTimerActiveDaysBitmap KEYWORD2 getTimerEnabled KEYWORD2 getTimerMode KEYWORD2 getTimerTime KEYWORD2 @@ -511,6 +549,7 @@ handleToggles KEYWORD2 hasACState KEYWORD2 hasInvertedStates KEYWORD2 hasStateChanged KEYWORD2 +hasValidPreamble KEYWORD2 hitachi KEYWORD2 hitachi1 KEYWORD2 hitachi264 KEYWORD2 @@ -521,6 +560,7 @@ htmlEscape KEYWORD2 initState KEYWORD2 int64ToString KEYWORD2 invertBits KEYWORD2 +irCommandTypeToString KEYWORD2 is8CHeatToggle KEYWORD2 isCleanToggle KEYWORD2 isEconoToggle KEYWORD2 @@ -546,6 +586,7 @@ isTimeCommand KEYWORD2 isTimerActive KEYWORD2 isTurboToggle KEYWORD2 isValidLgAc KEYWORD2 +isValidWrem3Message KEYWORD2 isVaneSwingV KEYWORD2 kelon KEYWORD2 kelvinator KEYWORD2 @@ -606,6 +647,7 @@ sendAirwell KEYWORD2 sendAiwaRCT501 KEYWORD2 sendAmcor KEYWORD2 sendArgo KEYWORD2 +sendArgoWREM3 KEYWORD2 sendArris KEYWORD2 sendBosch144 KEYWORD2 sendBose KEYWORD2 @@ -614,6 +656,7 @@ sendCarrierAC KEYWORD2 sendCarrierAC128 KEYWORD2 sendCarrierAC40 KEYWORD2 sendCarrierAC64 KEYWORD2 +sendCarrierAC84 KEYWORD2 sendClimaButler KEYWORD2 sendCoolix48 KEYWORD2 sendCoronaAc KEYWORD2 @@ -642,6 +685,7 @@ sendGC KEYWORD2 sendGICable KEYWORD2 sendGeneric KEYWORD2 sendGoodweather KEYWORD2 +sendGorenje KEYWORD2 sendGree KEYWORD2 sendHaierAC KEYWORD2 sendHaierAC160 KEYWORD2 @@ -728,7 +772,9 @@ sendVestelAc KEYWORD2 sendVoltas KEYWORD2 sendWhirlpoolAC KEYWORD2 sendWhynter KEYWORD2 +sendWowwee KEYWORD2 sendXmp KEYWORD2 +sendYork KEYWORD2 sendZepeal KEYWORD2 serialPrintUint64 KEYWORD2 set10CHeat KEYWORD2 @@ -745,6 +791,7 @@ setBoost KEYWORD2 setBreeze KEYWORD2 setButton KEYWORD2 setCelsius KEYWORD2 +setChannel KEYWORD2 setCheckSumS3 KEYWORD2 setClean KEYWORD2 setCleanToggle KEYWORD2 @@ -752,13 +799,18 @@ setClock KEYWORD2 setCmd KEYWORD2 setComfort KEYWORD2 setCommand KEYWORD2 +setConfigEntry KEYWORD2 setCurrTime KEYWORD2 setCurrentDay KEYWORD2 +setCurrentDayOfWeek KEYWORD2 setCurrentTime KEYWORD2 +setCurrentTimeMinutes KEYWORD2 +setDelayTimerMinutes KEYWORD2 setDirectIndirect KEYWORD2 setDisplay KEYWORD2 setDisplayTempSource KEYWORD2 setDryGrade KEYWORD2 +setEco KEYWORD2 setEcocool KEYWORD2 setEcono KEYWORD2 setEconoToggle KEYWORD2 @@ -790,6 +842,7 @@ setLight KEYWORD2 setLightToggle KEYWORD2 setLock KEYWORD2 setMax KEYWORD2 +setMessageType KEYWORD2 setMode KEYWORD2 setModel KEYWORD2 setMold KEYWORD2 @@ -813,8 +866,10 @@ setPowerful KEYWORD2 setPurify KEYWORD2 setQuiet KEYWORD2 setRaw KEYWORD2 -setRoomTemp KEYWORD2 setSave KEYWORD2 +setScheduleTimerActiveDays KEYWORD2 +setScheduleTimerStartMinutes KEYWORD2 +setScheduleTimerStopMinutes KEYWORD2 setSensor KEYWORD2 setSensorTemp KEYWORD2 setSensorTempRaw KEYWORD2 @@ -917,6 +972,7 @@ xorBytes KEYWORD2 A705 LITERAL1 A903 LITERAL1 A907 LITERAL1 +AC_CONTROL LITERAL1 AIRTON LITERAL1 AIRWELL LITERAL1 AIWA_RC_T501 LITERAL1 @@ -956,14 +1012,18 @@ ARREB1E LITERAL1 ARREW4E LITERAL1 ARRIS LITERAL1 ARRY4 LITERAL1 +AUTO LITERAL1 BOSCH144 LITERAL1 BOSE LITERAL1 CARRIER_AC LITERAL1 CARRIER_AC128 LITERAL1 CARRIER_AC40 LITERAL1 CARRIER_AC64 LITERAL1 +CARRIER_AC84 LITERAL1 CARRIER_AC_BITS LITERAL1 CLIMABUTLER LITERAL1 +CONFIG_PARAM_SET LITERAL1 +COOL LITERAL1 COOLIX LITERAL1 COOLIX48 LITERAL1 COOLIX_BITS LITERAL1 @@ -1003,6 +1063,7 @@ DECODE_CARRIER_AC LITERAL1 DECODE_CARRIER_AC128 LITERAL1 DECODE_CARRIER_AC40 LITERAL1 DECODE_CARRIER_AC64 LITERAL1 +DECODE_CARRIER_AC84 LITERAL1 DECODE_CLIMABUTLER LITERAL1 DECODE_COOLIX LITERAL1 DECODE_COOLIX48 LITERAL1 @@ -1029,6 +1090,7 @@ DECODE_FUJITSU_AC LITERAL1 DECODE_GICABLE LITERAL1 DECODE_GLOBALCACHE LITERAL1 DECODE_GOODWEATHER LITERAL1 +DECODE_GORENJE LITERAL1 DECODE_GREE LITERAL1 DECODE_HAIER_AC LITERAL1 DECODE_HAIER_AC160 LITERAL1 @@ -1105,8 +1167,11 @@ DECODE_VESTEL_AC LITERAL1 DECODE_VOLTAS LITERAL1 DECODE_WHIRLPOOL_AC LITERAL1 DECODE_WHYNTER LITERAL1 +DECODE_WOWWEE LITERAL1 DECODE_XMP LITERAL1 +DECODE_YORK LITERAL1 DECODE_ZEPEAL LITERAL1 +DELAY_TIMER LITERAL1 DELONGHI_AC LITERAL1 DENON LITERAL1 DENON_48_BITS LITERAL1 @@ -1117,11 +1182,29 @@ DG11J191 LITERAL1 DISH LITERAL1 DISH_BITS LITERAL1 DOSHISHA LITERAL1 +DRY LITERAL1 ECOCLIM LITERAL1 ELECTRA_AC LITERAL1 ELITESCREENS LITERAL1 ENABLE_NOISE_FILTER_OPTION LITERAL1 EPSON LITERAL1 +FAN LITERAL1 +FAN_AUTO LITERAL1 +FAN_HIGH LITERAL1 +FAN_HIGHEST LITERAL1 +FAN_LOW LITERAL1 +FAN_LOWER LITERAL1 +FAN_LOWEST LITERAL1 +FAN_MEDIUM LITERAL1 +FLAP_1 LITERAL1 +FLAP_2 LITERAL1 +FLAP_3 LITERAL1 +FLAP_4 LITERAL1 +FLAP_5 LITERAL1 +FLAP_6 LITERAL1 +FLAP_AUTO LITERAL1 +FLAP_FULL LITERAL1 +FRIDAY LITERAL1 FUJITSU_AC LITERAL1 FUJITSU_AC_BITS LITERAL1 FUJITSU_AC_CMD_STAY_ON LITERAL1 @@ -1154,6 +1237,7 @@ GICABLE LITERAL1 GICABLE_BITS LITERAL1 GLOBALCACHE LITERAL1 GOODWEATHER LITERAL1 +GORENJE LITERAL1 GREE LITERAL1 GREE_AUTO LITERAL1 GREE_COOL LITERAL1 @@ -1233,6 +1317,7 @@ HAIER_AC_YRW02_SWING_MIDDLE LITERAL1 HAIER_AC_YRW02_SWING_OFF LITERAL1 HAIER_AC_YRW02_SWING_TOP LITERAL1 HAIER_AC_YRW02_TURBO_OFF LITERAL1 +HEAT LITERAL1 HIGH LITERAL1 HITACHI_AC LITERAL1 HITACHI_AC1 LITERAL1 @@ -1250,7 +1335,7 @@ HITACHI_AC344 LITERAL1 HITACHI_AC424 LITERAL1 HITACHI_AC_BITS LITERAL1 HITACHI_AC_STATE_LENGTH LITERAL1 -ICACHE_RAM_ATTR LITERAL1 +IFEEL_TEMP_REPORT LITERAL1 INAX LITERAL1 JVC LITERAL1 JVC_BITS LITERAL1 @@ -1325,6 +1410,7 @@ MITSUBISHI_AC_VANE_AUTO_MOVE LITERAL1 MITSUBISHI_BITS LITERAL1 MITSUBISHI_HEAVY_152 LITERAL1 MITSUBISHI_HEAVY_88 LITERAL1 +MONDAY LITERAL1 MULTIBRACKETS LITERAL1 MWM LITERAL1 NEC LITERAL1 @@ -1334,6 +1420,7 @@ NEOCLIMA LITERAL1 NIKAI LITERAL1 NIKAI_BITS LITERAL1 NOTHING LITERAL1 +NO_TIMER LITERAL1 ONCE LITERAL1 PANASONIC LITERAL1 PANASONIC_AC LITERAL1 @@ -1356,6 +1443,8 @@ RCMM_BITS LITERAL1 RHOSS LITERAL1 R_LT0541_HTA_A LITERAL1 R_LT0541_HTA_B LITERAL1 +SAC_WREM2 LITERAL1 +SAC_WREM3 LITERAL1 SAMSUNG LITERAL1 SAMSUNG36 LITERAL1 SAMSUNG_AC LITERAL1 @@ -1367,6 +1456,10 @@ SANYO_AC88 LITERAL1 SANYO_LC7461 LITERAL1 SANYO_LC7461_BITS LITERAL1 SANYO_SA8650B_BITS LITERAL1 +SATURDAY LITERAL1 +SCHEDULE_TIMER_1 LITERAL1 +SCHEDULE_TIMER_2 LITERAL1 +SCHEDULE_TIMER_3 LITERAL1 SEND_AIRTON LITERAL1 SEND_AIRWELL LITERAL1 SEND_AIWA_RC_T501 LITERAL1 @@ -1379,6 +1472,7 @@ SEND_CARRIER_AC LITERAL1 SEND_CARRIER_AC128 LITERAL1 SEND_CARRIER_AC40 LITERAL1 SEND_CARRIER_AC64 LITERAL1 +SEND_CARRIER_AC84 LITERAL1 SEND_CLIMABUTLER LITERAL1 SEND_COOLIX LITERAL1 SEND_COOLIX48 LITERAL1 @@ -1405,6 +1499,7 @@ SEND_FUJITSU_AC LITERAL1 SEND_GICABLE LITERAL1 SEND_GLOBALCACHE LITERAL1 SEND_GOODWEATHER LITERAL1 +SEND_GORENJE LITERAL1 SEND_GREE LITERAL1 SEND_HAIER_AC LITERAL1 SEND_HAIER_AC160 LITERAL1 @@ -1481,7 +1576,9 @@ SEND_VESTEL_AC LITERAL1 SEND_VOLTAS LITERAL1 SEND_WHIRLPOOL_AC LITERAL1 SEND_WHYNTER LITERAL1 +SEND_WOWWEE LITERAL1 SEND_XMP LITERAL1 +SEND_YORK LITERAL1 SEND_ZEPEAL LITERAL1 SHARP LITERAL1 SHARP_AC LITERAL1 @@ -1493,6 +1590,7 @@ SONY_12_BITS LITERAL1 SONY_15_BITS LITERAL1 SONY_20_BITS LITERAL1 SONY_38K LITERAL1 +SUNDAY LITERAL1 SYMPHONY LITERAL1 TAC09CHSD LITERAL1 TCL112AC LITERAL1 @@ -1500,7 +1598,9 @@ TCL96AC LITERAL1 TECHNIBEL_AC LITERAL1 TECO LITERAL1 TEKNOPOINT LITERAL1 +THURSDAY LITERAL1 TIMEOUT_MS LITERAL1 +TIMER_COMMAND LITERAL1 TOSHIBA_AC LITERAL1 TOSHIBA_AC_AUTO LITERAL1 TOSHIBA_AC_COOL LITERAL1 @@ -1528,6 +1628,7 @@ TROTEC_MAX_TEMP LITERAL1 TROTEC_MAX_TIMER LITERAL1 TROTEC_MIN_TEMP LITERAL1 TRUMA LITERAL1 +TUESDAY LITERAL1 UNKNOWN LITERAL1 UNUSED LITERAL1 USE_IRAM_ATTR LITERAL1 @@ -1535,12 +1636,15 @@ V9014557_A LITERAL1 V9014557_B LITERAL1 VESTEL_AC LITERAL1 VOLTAS LITERAL1 +WEDNESDAY LITERAL1 WHIRLPOOL_AC LITERAL1 WHYNTER LITERAL1 WHYNTER_BITS LITERAL1 +WOWWEE LITERAL1 XMP LITERAL1 YAW1F LITERAL1 YBOFB LITERAL1 +YORK LITERAL1 YX1FSF LITERAL1 ZEPEAL LITERAL1 k0Str LITERAL1 @@ -1649,6 +1753,10 @@ kAmcorVentOn LITERAL1 kAmcorZeroMark LITERAL1 kAmcorZeroSpace LITERAL1 kArdb1Str LITERAL1 +kArgo3AcControlStateLength LITERAL1 +kArgo3ConfigStateLength LITERAL1 +kArgo3TimerStateLength LITERAL1 +kArgo3iFeelReportStateLength LITERAL1 kArgoAuto LITERAL1 kArgoBitMark LITERAL1 kArgoBits LITERAL1 @@ -1667,6 +1775,7 @@ kArgoFlap5 LITERAL1 kArgoFlap6 LITERAL1 kArgoFlapAuto LITERAL1 kArgoFlapFull LITERAL1 +kArgoFrequency LITERAL1 kArgoGap LITERAL1 kArgoHdrMark LITERAL1 kArgoHdrSpace LITERAL1 @@ -1674,13 +1783,26 @@ kArgoHeat LITERAL1 kArgoHeatAuto LITERAL1 kArgoHeatBit LITERAL1 kArgoHeatBlink LITERAL1 +kArgoMaxChannel LITERAL1 kArgoMaxRoomTemp LITERAL1 kArgoMaxTemp LITERAL1 kArgoMinTemp LITERAL1 kArgoOff LITERAL1 kArgoOneSpace LITERAL1 +kArgoPost LITERAL1 +kArgoPreamble1 LITERAL1 +kArgoPreamble2 LITERAL1 +kArgoSensorCheck LITERAL1 +kArgoSensorFixed LITERAL1 +kArgoShortBits LITERAL1 +kArgoShortStateLength LITERAL1 kArgoStateLength LITERAL1 kArgoTempDelta LITERAL1 +kArgoWrem2Str LITERAL1 +kArgoWrem3Postfix_ACControl LITERAL1 +kArgoWrem3Postfix_Timer LITERAL1 +kArgoWrem3Preamble LITERAL1 +kArgoWrem3Str LITERAL1 kArgoZeroSpace LITERAL1 kArjw2Str LITERAL1 kArrah2eStr LITERAL1 @@ -1785,6 +1907,16 @@ kCarrierAc64OneSpace LITERAL1 kCarrierAc64TimerMax LITERAL1 kCarrierAc64TimerMin LITERAL1 kCarrierAc64ZeroSpace LITERAL1 +kCarrierAc84Bits LITERAL1 +kCarrierAc84ExtraBits LITERAL1 +kCarrierAc84ExtraTolerance LITERAL1 +kCarrierAc84Gap LITERAL1 +kCarrierAc84HdrMark LITERAL1 +kCarrierAc84HdrSpace LITERAL1 +kCarrierAc84MinRepeat LITERAL1 +kCarrierAc84One LITERAL1 +kCarrierAc84StateLength LITERAL1 +kCarrierAc84Zero LITERAL1 kCarrierAcBitMark LITERAL1 kCarrierAcBits LITERAL1 kCarrierAcFreq LITERAL1 @@ -1798,6 +1930,7 @@ kCeilingStr LITERAL1 kCelsiusFahrenheitStr LITERAL1 kCelsiusStr LITERAL1 kCentreStr LITERAL1 +kChStr LITERAL1 kChangeStr LITERAL1 kCirculateStr LITERAL1 kCkpStr LITERAL1 @@ -1816,6 +1949,10 @@ kColonSpaceStr LITERAL1 kComfortStr LITERAL1 kCommaSpaceStr LITERAL1 kCommandStr LITERAL1 +kConfigCommand LITERAL1 +kConfigCommandStr LITERAL1 +kControlCommand LITERAL1 +kControlCommandStr LITERAL1 kCool LITERAL1 kCoolStr LITERAL1 kCoolingStr LITERAL1 @@ -2413,6 +2550,15 @@ kGoodweatherSwingSlow LITERAL1 kGoodweatherTempMax LITERAL1 kGoodweatherTempMin LITERAL1 kGoodweatherZeroSpace LITERAL1 +kGorenjeBitMark LITERAL1 +kGorenjeBits LITERAL1 +kGorenjeFreq LITERAL1 +kGorenjeHdrMark LITERAL1 +kGorenjeHdrSpace LITERAL1 +kGorenjeMinGap LITERAL1 +kGorenjeOneSpace LITERAL1 +kGorenjeTolerance LITERAL1 +kGorenjeZeroSpace LITERAL1 kGpioUnused LITERAL1 kGreeAuto LITERAL1 kGreeBitMark LITERAL1 @@ -2735,6 +2881,7 @@ kHoldStr LITERAL1 kHourStr LITERAL1 kHoursStr LITERAL1 kHumidStr LITERAL1 +kIFeelReportStr LITERAL1 kIFeelStr LITERAL1 kISeeStr LITERAL1 kIdStr LITERAL1 @@ -2836,6 +2983,7 @@ kKelvinatorSwingVUpperMiddle LITERAL1 kKelvinatorTick LITERAL1 kKelvinatorZeroSpace LITERAL1 kKelvinatorZeroSpaceTicks LITERAL1 +kKeyStr LITERAL1 kKkg29ac1Str LITERAL1 kKkg9ac1Str LITERAL1 kLasertagBits LITERAL1 @@ -2846,6 +2994,7 @@ kLasertagMinRepeat LITERAL1 kLasertagMinSamples LITERAL1 kLasertagTick LITERAL1 kLasertagTolerance LITERAL1 +kLastAcCommandEnum LITERAL1 kLastDecodeType LITERAL1 kLastFanspeedEnum LITERAL1 kLastOpmodeEnum LITERAL1 @@ -2983,8 +3132,10 @@ kMaxRightStr LITERAL1 kMaxStr LITERAL1 kMaxTimeoutMs LITERAL1 kMaximumStr LITERAL1 +kMedHighStr LITERAL1 kMedStr LITERAL1 kMedium LITERAL1 +kMediumHigh LITERAL1 kMediumStr LITERAL1 kMetzAddressBits LITERAL1 kMetzBitMark LITERAL1 @@ -3392,6 +3543,7 @@ kNikaiZeroSpaceTicks LITERAL1 kNkeStr LITERAL1 kNoRepeat LITERAL1 kNoStr LITERAL1 +kNoTempValue LITERAL1 kNowStr LITERAL1 kOff LITERAL1 kOffStr LITERAL1 @@ -3400,6 +3552,8 @@ kOnStr LITERAL1 kOnTimerStr LITERAL1 kOutsideQuietStr LITERAL1 kOutsideStr LITERAL1 +kPanasonic40Bits LITERAL1 +kPanasonic40Manufacturer LITERAL1 kPanasonicAc32Auto LITERAL1 kPanasonicAc32BitMark LITERAL1 kPanasonicAc32Bits LITERAL1 @@ -3773,11 +3927,14 @@ kSanyoSa8650bOneMark LITERAL1 kSanyoSa8650bRptLength LITERAL1 kSanyoSa8650bZeroMark LITERAL1 kSaveStr LITERAL1 +kScheduleStr LITERAL1 kSecondStr LITERAL1 kSecondsStr LITERAL1 kSensorStr LITERAL1 +kSensorTempReport LITERAL1 kSensorTempStr LITERAL1 kSetStr LITERAL1 +kSetTimerCommandStr LITERAL1 kSharpAcAuto LITERAL1 kSharpAcBitMark LITERAL1 kSharpAcBits LITERAL1 @@ -4002,6 +4159,8 @@ kTempUpStr LITERAL1 kThreeLetterDayOfWeekStr LITERAL1 kTimeSep LITERAL1 kTimeoutMs LITERAL1 +kTimerActiveDaysStr LITERAL1 +kTimerCommand LITERAL1 kTimerModeStr LITERAL1 kTimerStr LITERAL1 kToggleStr LITERAL1 @@ -4147,10 +4306,13 @@ kTypeStr LITERAL1 kUnknownStr LITERAL1 kUnknownThreshold LITERAL1 kUpStr LITERAL1 +kUpperMiddle LITERAL1 +kUpperMiddleStr LITERAL1 kUpperStr LITERAL1 kUseDefTol LITERAL1 kV9014557AStr LITERAL1 kV9014557BStr LITERAL1 +kValueStr LITERAL1 kVaneStr LITERAL1 kVestelAcAuto LITERAL1 kVestelAcBitMark LITERAL1 @@ -4259,6 +4421,14 @@ kWhynterZeroSpaceTicks LITERAL1 kWide LITERAL1 kWideStr LITERAL1 kWifiStr LITERAL1 +kWowweeBitMark LITERAL1 +kWowweeBits LITERAL1 +kWowweeDefaultRepeat LITERAL1 +kWowweeFreq LITERAL1 +kWowweeHdrMark LITERAL1 +kWowweeHdrSpace LITERAL1 +kWowweeOneSpace LITERAL1 +kWowweeZeroSpace LITERAL1 kXFanStr LITERAL1 kXmpBaseSpace LITERAL1 kXmpBits LITERAL1 @@ -4274,6 +4444,26 @@ kXmpWordSize LITERAL1 kYaw1fStr LITERAL1 kYbofbStr LITERAL1 kYesStr LITERAL1 +kYorkAuto LITERAL1 +kYorkBitMark LITERAL1 +kYorkBits LITERAL1 +kYorkCool LITERAL1 +kYorkDry LITERAL1 +kYorkFan LITERAL1 +kYorkFanAuto LITERAL1 +kYorkFanHigh LITERAL1 +kYorkFanLow LITERAL1 +kYorkFanMedium LITERAL1 +kYorkFreq LITERAL1 +kYorkHdrMark LITERAL1 +kYorkHdrSpace LITERAL1 +kYorkHeat LITERAL1 +kYorkKnownGoodState LITERAL1 +kYorkMaxTemp LITERAL1 +kYorkMinTemp LITERAL1 +kYorkOneSpace LITERAL1 +kYorkStateLength LITERAL1 +kYorkZeroSpace LITERAL1 kYx1fsfStr LITERAL1 kZepealBits LITERAL1 kZepealCommandOffOn LITERAL1 diff --git a/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/library.json b/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/library.json index 10a428ad0..302372566 100644 --- a/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/library.json +++ b/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/library.json @@ -1,6 +1,6 @@ { "name": "IRremoteESP8266", - "version": "2.8.4", + "version": "2.8.5", "keywords": "infrared, ir, remote, esp8266, esp32", "description": "Send and receive infrared signals with multiple protocols (ESP8266/ESP32)", "repository": diff --git a/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/library.properties b/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/library.properties index 801fcab6e..769cbc1fa 100644 --- a/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/library.properties +++ b/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/library.properties @@ -1,5 +1,5 @@ name=IRremoteESP8266 -version=2.8.4 +version=2.8.5 author=David Conran, Sebastien Warin, Mark Szabo, Ken Shirriff maintainer=David Conran, Mark Szabo, Sebastien Warin, Roi Dayan, Massimiliano Pinto, Christian Nilsson sentence=Send and receive infrared signals with multiple protocols (ESP8266/ESP32) diff --git a/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/src/IRac.cpp b/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/src/IRac.cpp index af6beb30b..8826bc1ae 100644 --- a/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/src/IRac.cpp +++ b/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/src/IRac.cpp @@ -12,6 +12,7 @@ #ifndef ARDUINO #include #endif +#include #include "IRsend.h" #include "IRremoteESP8266.h" #include "IRtext.h" @@ -64,6 +65,36 @@ #endif // ESP8266 #endif // STRCASECMP +#ifndef UNIT_TEST +#define OUTPUT_DECODE_RESULTS_FOR_UT(ac) +#else +/* NOTE: THIS IS NOT A DOXYGEN COMMENT (would require ENABLE_PREPROCESSING-YES) +/// If compiling for UT *and* a test receiver @c IRrecv is provided via the +/// @c _utReceived param, this injects an "output" gadget @c _lastDecodeResults +/// into the @c IRAc::sendAc method, so that the UT code may parse the "sent" +/// value and drive further assertions +/// +/// @note The @c decode_results "returned" is a shallow copy (empty rawbuf), +/// mostly b/c the class does not have a custom/deep copy c-tor +/// and defining it would be an overkill for this purpose +/// @note For future maintainers: If @c IRAc class is ever refactored to use +/// polymorphism (static or dynamic)... this macro should be removed +/// and replaced with proper GMock injection. +*/ +#define OUTPUT_DECODE_RESULTS_FOR_UT(ac) \ + { \ + if (_utReceiver) { \ + _lastDecodeResults = nullptr; \ + (ac)._irsend.makeDecodeResult(); \ + if (_utReceiver->decode(&(ac)._irsend.capture)) { \ + _lastDecodeResults = std::unique_ptr( \ + new decode_results((ac)._irsend.capture)); \ + _lastDecodeResults->rawbuf = nullptr; \ + } \ + } \ + } +#endif // UNIT_TEST + /// Class constructor /// @param[in] pin Gpio pin to use when transmitting IR messages. /// @param[in] inverted true, gpio output defaults to high. false, to low. @@ -331,6 +362,9 @@ bool IRac::isProtocolSupported(const decode_type_t protocol) { #endif #if SEND_VOLTAS case decode_type_t::VOLTAS: +#endif +#if SEND_YORK + case decode_type_t::YORK: #endif case decode_type_t::WHIRLPOOL_AC: return true; @@ -439,19 +473,27 @@ void IRac::amcor(IRAmcorAc *ac, /// @param[in] on The power setting. /// @param[in] mode The operation mode setting. /// @param[in] degrees The temperature setting in degrees. +/// @param[in] sensorTemp The room (iFeel) temperature sensor reading in degrees +/// Celsius. /// @param[in] fan The speed setting for the fan. /// @param[in] swingv The vertical swing setting. +/// @param[in] iFeel Whether to enable iFeel (remote temp) mode on the A/C unit. /// @param[in] turbo Run the device in turbo/powerful mode. /// @param[in] sleep Nr. of minutes for sleep mode. /// @note -1 is Off, >= 0 is on. void IRac::argo(IRArgoAC *ac, const bool on, const stdAc::opmode_t mode, const float degrees, - const stdAc::fanspeed_t fan, const stdAc::swingv_t swingv, + const float sensorTemp, const stdAc::fanspeed_t fan, + const stdAc::swingv_t swingv, const bool iFeel, const bool turbo, const int16_t sleep) { ac->begin(); ac->setPower(on); ac->setMode(ac->convertMode(mode)); - ac->setTemp(degrees); + ac->setTemp(static_cast(std::round(degrees))); + if (sensorTemp != kNoTempValue) { + ac->setSensorTemp(static_cast(std::round(sensorTemp))); + } + ac->setiFeel(iFeel); ac->setFan(ac->convertFan(fan)); ac->setFlap(ac->convertSwingV(swingv)); // No Quiet setting available. @@ -464,6 +506,121 @@ void IRac::argo(IRArgoAC *ac, ac->setNight(sleep >= 0); // Convert to a boolean. ac->send(); } + +/// Send an Argo A/C WREM-3 AC **control** message with the supplied settings. +/// @param[in, out] ac A Ptr to an IRArgoAC_WREM3 object to use. +/// @param[in] on The power setting. +/// @param[in] mode The operation mode setting. +/// @param[in] degrees The set temperature setting in degrees Celsius. +/// @param[in] sensorTemp The room (iFeel) temperature sensor reading in degrees +/// Celsius. +/// @warning The @c sensorTemp param is assumed to be in 0..255 range (uint8_t) +/// The overflow is *not* checked, though. +/// @note The value is rounded to nearest integer, rounding halfway cases +/// away from zero. E.g. 1.5 [C] becomes 2 [C]. +/// @param[in] fan The speed setting for the fan. +/// @param[in] swingv The vertical swing setting. +/// @param[in] iFeel Whether to enable iFeel (remote temp) mode on the A/C unit. +/// @param[in] night Enable night mode (raises temp by +1*C after 1h). +/// @param[in] econo Enable eco mode (limits power consumed). +/// @param[in] turbo Run the device in turbo/powerful mode. +/// @param[in] filter Enable filter mode +/// @param[in] light Enable device display/LEDs +void IRac::argoWrem3_ACCommand(IRArgoAC_WREM3 *ac, const bool on, + const stdAc::opmode_t mode, const float degrees, const float sensorTemp, + const stdAc::fanspeed_t fan, const stdAc::swingv_t swingv, const bool iFeel, + const bool night, const bool econo, const bool turbo, const bool filter, + const bool light) { + ac->begin(); + ac->setMessageType(argoIrMessageType_t::AC_CONTROL); + ac->setPower(on); + ac->setMode(ac->convertMode(mode)); + ac->setTemp(degrees); + if (sensorTemp != kNoTempValue) { + ac->setSensorTemp(static_cast(std::round(sensorTemp))); + } + ac->setiFeel(iFeel); + ac->setFan(ac->convertFan(fan)); + ac->setFlap(ac->convertSwingV(swingv)); + ac->setNight(night); + ac->setEco(econo); + ac->setMax(turbo); + ac->setFilter(filter); + ac->setLight(light); + // No Clean setting available. + // No Beep setting available - always beeps in this mode :) + ac->send(); +} + +/// Send an Argo A/C WREM-3 iFeel (room temp) silent (no beep) report. +/// @param[in, out] ac A Ptr to an IRArgoAC_WREM3 object to use. +/// @param[in] sensorTemp The room (iFeel) temperature setting +/// in degrees Celsius. +/// @warning The @c sensorTemp param is assumed to be in 0..255 range (uint8_t) +/// The overflow is *not* checked, though. +/// @note The value is rounded to nearest integer, rounding halfway cases +/// away from zero. E.g. 1.5 [C] becomes 2 [C]. +void IRac::argoWrem3_iFeelReport(IRArgoAC_WREM3 *ac, const float sensorTemp) { + ac->begin(); + ac->setMessageType(argoIrMessageType_t::IFEEL_TEMP_REPORT); + ac->setSensorTemp(static_cast(std::round(sensorTemp))); + ac->send(); +} + +/// Send an Argo A/C WREM-3 Config command. +/// @param[in, out] ac A Ptr to an IRArgoAC_WREM3 object to use. +/// @param[in] param The parameter ID. +/// @param[in] value The parameter value. +/// @param[in] safe If true, will only allow setting the below parameters +/// in order to avoid accidentally setting a restricted +/// vendor-specific param and breaking the A/C device +/// @note Known parameters (P, where xx is the @c param) +/// P05 - Temperature Scale (0-Celsius, 1-Fahrenheit) +/// P06 - Transmission channel (0..3) +/// P12 - ECO mode power input limit (30..99, default: 75) +void IRac::argoWrem3_ConfigSet(IRArgoAC_WREM3 *ac, const uint8_t param, + const uint8_t value, bool safe /*= true*/) { + if (safe) { + switch (param) { + case 5: // temp. scale (note this is likely excess as not transmitted) + if (value > 1) { return; /* invalid */ } + break; + case 6: // channel (note this is likely excess as not transmitted) + if (value > 3) { return; /* invalid */ } + break; + case 12: // eco power limit + if (value < 30 || value > 99) { return; /* invalid */ } + break; + default: + return; /* invalid */ + } + } + ac->begin(); + ac->setMessageType(argoIrMessageType_t::CONFIG_PARAM_SET); + ac->setConfigEntry(param, value); + ac->send(); +} + +/// Send an Argo A/C WREM-3 Delay timer command. +/// @param[in, out] ac A Ptr to an IRArgoAC_WREM3 object to use. +/// @param[in] on Whether the unit is currently on. The timer, upon elapse +/// will toggle this state +/// @param[in] currentTime currentTime in minutes, starting from 00:00 +/// @note For timer mode, this value is not really used much so can be zero. +/// @param[in] delayMinutes Number of minutes after which the @c on state should +/// be toggled +/// @note Schedule timers are not exposed via this interface +void IRac::argoWrem3_SetTimer(IRArgoAC_WREM3 *ac, bool on, + const uint16_t currentTime, const uint16_t delayMinutes) { + ac->begin(); + ac->setMessageType(argoIrMessageType_t::TIMER_COMMAND); + ac->setPower(on); + ac->setTimerType(argoTimerType_t::DELAY_TIMER); + ac->setCurrentTimeMinutes(currentTime); + // Note: Day of week is not set (no need) + ac->setDelayTimerMinutes(delayMinutes); + ac->send(); +} #endif // SEND_ARGO #if SEND_BOSCH144 @@ -546,9 +703,12 @@ void IRac::carrier64(IRCarrierAc64 *ac, /// @param[in] on The power setting. /// @param[in] mode The operation mode setting. /// @param[in] degrees The temperature setting in degrees. +/// @param[in] sensorTemp The room (iFeel) temperature sensor reading in degrees +/// Celsius. /// @param[in] fan The speed setting for the fan. /// @param[in] swingv The vertical swing setting. /// @param[in] swingh The horizontal swing setting. +/// @param[in] iFeel Whether to enable iFeel (remote temp) mode on the A/C unit. /// @param[in] turbo Run the device in turbo/powerful mode. /// @param[in] light Turn on the LED/Display mode. /// @param[in] clean Turn on the self-cleaning mode. e.g. Mould, dry filters etc @@ -556,10 +716,11 @@ void IRac::carrier64(IRCarrierAc64 *ac, /// @note -1 is Off, >= 0 is on. void IRac::coolix(IRCoolixAC *ac, const bool on, const stdAc::opmode_t mode, - const float degrees, const stdAc::fanspeed_t fan, + const float degrees, const float sensorTemp, + const stdAc::fanspeed_t fan, const stdAc::swingv_t swingv, const stdAc::swingh_t swingh, - const bool turbo, const bool light, const bool clean, - const int16_t sleep) { + const bool iFeel, const bool turbo, const bool light, + const bool clean, const int16_t sleep) { ac->begin(); ac->setPower(on); if (!on) { @@ -576,6 +737,12 @@ void IRac::coolix(IRCoolixAC *ac, // No Clock setting available. // No Econo setting available. // No Quiet setting available. + if (sensorTemp != kNoTempValue) { + ac->setSensorTemp(static_cast(std::round(sensorTemp))); + } else { + ac->clearSensorTemp(); + } + ac->setZoneFollow(iFeel); ac->send(); // Send the state, which will also power on the unit. // The following are all options/settings that create their own special // messages. Often they only make sense to be sent after the unit is turned @@ -940,13 +1107,16 @@ void IRac::delonghiac(IRDelonghiAc *ac, /// @param[in] on The power setting. /// @param[in] mode The operation mode setting. /// @param[in] degrees The temperature setting in degrees. +/// @param[in] sensorTemp The room (iFeel) temperature sensor reading in degrees +/// Celsius. /// @param[in] fan The speed setting for the fan. /// @param[in] sleep Nr. of minutes for sleep mode. -1 is Off, >= 0 is on. /// @param[in] clock The time in Nr. of mins since midnight. < 0 is ignore. void IRac::ecoclim(IREcoclimAc *ac, const bool on, const stdAc::opmode_t mode, - const float degrees, const stdAc::fanspeed_t fan, - const int16_t sleep, const int16_t clock) { + const float degrees, const float sensorTemp, + const stdAc::fanspeed_t fan, const int16_t sleep, + const int16_t clock) { ac->begin(); ac->setPower(on); uint8_t new_mode; @@ -956,8 +1126,13 @@ void IRac::ecoclim(IREcoclimAc *ac, new_mode = ac->convertMode(mode); // Not Sleep, so use the supplied mode. ac->setMode(new_mode); ac->setTemp(degrees); - ac->setSensorTemp(degrees); //< Set to the desired temp until we cab disable. ac->setFan(ac->convertFan(fan)); + if (sensorTemp != kNoTempValue) { + ac->setSensorTemp(static_cast(std::round(sensorTemp))); + } else { + ac->setSensorTemp(degrees); //< Set to the desired temp + // until we can disable. + } // No SwingV setting available // No SwingH setting available // No Quiet setting available. @@ -979,22 +1154,28 @@ void IRac::ecoclim(IREcoclimAc *ac, /// @param[in] on The power setting. /// @param[in] mode The operation mode setting. /// @param[in] degrees The temperature setting in degrees. +/// @param[in] sensorTemp The room (iFeel) temperature sensor reading in degrees +/// Celsius. /// @param[in] fan The speed setting for the fan. /// @param[in] swingv The vertical swing setting. /// @param[in] swingh The horizontal swing setting. +/// @param[in] iFeel Whether to enable iFeel (remote temp) mode on the A/C unit. /// @param[in] turbo Run the device in turbo/powerful mode. /// @param[in] lighttoggle Should we toggle the LED/Display? /// @param[in] clean Turn on the self-cleaning mode. e.g. Mould, dry filters etc void IRac::electra(IRElectraAc *ac, const bool on, const stdAc::opmode_t mode, - const float degrees, const stdAc::fanspeed_t fan, - const stdAc::swingv_t swingv, - const stdAc::swingh_t swingh, const bool turbo, - const bool lighttoggle, const bool clean) { + const float degrees, const float sensorTemp, + const stdAc::fanspeed_t fan, const stdAc::swingv_t swingv, + const stdAc::swingh_t swingh, const bool iFeel, + const bool turbo, const bool lighttoggle, const bool clean) { ac->begin(); ac->setPower(on); ac->setMode(ac->convertMode(mode)); ac->setTemp(degrees); + if (sensorTemp != kNoTempValue) { + ac->setSensorTemp(static_cast(std::round(sensorTemp))); + } ac->setFan(ac->convertFan(fan)); ac->setSwingV(swingv != stdAc::swingv_t::kOff); ac->setSwingH(swingh != stdAc::swingh_t::kOff); @@ -1007,6 +1188,7 @@ void IRac::electra(IRElectraAc *ac, // No Beep setting available. // No Sleep setting available. // No Clock setting available. + ac->setIFeel(iFeel); ac->send(); } #endif // SEND_ELECTRA_AC @@ -1132,6 +1314,7 @@ void IRac::goodweather(IRGoodweatherAc *ac, /// @param[in] fan The speed setting for the fan. /// @param[in] swingv The vertical swing setting. /// @param[in] swingh The horizontal swing setting. +/// @param[in] iFeel Whether to enable iFeel (remote temp) mode on the A/C unit. /// @param[in] turbo Run the device in turbo/powerful mode. /// @param[in] econo Toggle the device's economical mode. /// @param[in] light Turn on the LED/Display mode. @@ -1141,8 +1324,8 @@ void IRac::gree(IRGreeAC *ac, const gree_ac_remote_model_t model, const bool on, const stdAc::opmode_t mode, const bool celsius, const float degrees, const stdAc::fanspeed_t fan, const stdAc::swingv_t swingv, const stdAc::swingh_t swingh, - const bool turbo, const bool econo, const bool light, - const bool clean, const int16_t sleep) { + const bool iFeel, const bool turbo, const bool econo, + const bool light, const bool clean, const int16_t sleep) { ac->begin(); ac->setModel(model); ac->setPower(on); @@ -1152,6 +1335,7 @@ void IRac::gree(IRGreeAC *ac, const gree_ac_remote_model_t model, ac->setSwingVertical(swingv == stdAc::swingv_t::kAuto, // Set auto flag. ac->convertSwingV(swingv)); ac->setSwingHorizontal(ac->convertSwingH(swingh)); + ac->setIFeel(iFeel); ac->setLight(light); ac->setTurbo(turbo); ac->setEcono(econo); @@ -1661,8 +1845,11 @@ void IRac::lg(IRLgAc *ac, const lg_ac_remote_model_t model, /// @param[in] mode The operation mode setting. /// @param[in] celsius Temperature units. True is Celsius, False is Fahrenheit. /// @param[in] degrees The temperature setting in degrees. +/// @param[in] sensorTemp The room (iFeel) temperature sensor reading +/// in degrees. /// @param[in] fan The speed setting for the fan. /// @param[in] swingv The vertical swing setting. +/// @param[in] iFeel Whether to enable iFeel (remote temp) mode on the A/C unit. /// @param[in] quiet Run the device in quiet/silent mode. /// @param[in] quiet_prev The device's previous quiet/silent mode. /// @param[in] turbo Toggle the device's turbo/powerful mode. @@ -1673,9 +1860,9 @@ void IRac::lg(IRLgAc *ac, const lg_ac_remote_model_t model, /// @note On Danby A/C units, swingv controls the Ion Filter instead. void IRac::midea(IRMideaAC *ac, const bool on, const stdAc::opmode_t mode, const bool celsius, - const float degrees, const stdAc::fanspeed_t fan, - const stdAc::swingv_t swingv, - const bool quiet, const bool quiet_prev, + const float degrees, const float sensorTemp, + const stdAc::fanspeed_t fan, const stdAc::swingv_t swingv, + const bool iFeel, const bool quiet, const bool quiet_prev, const bool turbo, const bool econo, const bool light, const bool clean, const int16_t sleep) { ac->begin(); @@ -1683,6 +1870,10 @@ void IRac::midea(IRMideaAC *ac, ac->setMode(ac->convertMode(mode)); ac->setUseCelsius(celsius); ac->setTemp(degrees, celsius); + if (sensorTemp != kNoTempValue) { + ac->setSensorTemp(sensorTemp, celsius); + } + ac->setEnableSensorTemp(iFeel); ac->setFan(ac->convertFan(fan)); ac->setSwingVToggle(swingv != stdAc::swingv_t::kOff); // No Horizontal swing setting available. @@ -2080,19 +2271,29 @@ void IRac::samsung(IRSamsungAc *ac, /// @param[in] on The power setting. /// @param[in] mode The operation mode setting. /// @param[in] degrees The temperature setting in degrees. +/// @param[in] sensorTemp The room (iFeel) temperature sensor reading in degrees +/// Celsius. /// @param[in] fan The speed setting for the fan. /// @param[in] swingv The vertical swing setting. +/// @param[in] iFeel Whether to enable iFeel (remote temp) mode on the A/C unit. /// @param[in] beep Enable/Disable beeps when receiving IR messages. /// @param[in] sleep Nr. of minutes for sleep mode. -1 is Off, >= 0 is on. void IRac::sanyo(IRSanyoAc *ac, const bool on, const stdAc::opmode_t mode, - const float degrees, const stdAc::fanspeed_t fan, - const stdAc::swingv_t swingv, const bool beep, - const int16_t sleep) { + const float degrees, const float sensorTemp, + const stdAc::fanspeed_t fan, const stdAc::swingv_t swingv, + const bool iFeel, const bool beep, const int16_t sleep) { ac->begin(); ac->setPower(on); ac->setMode(ac->convertMode(mode)); ac->setTemp(degrees); + if (sensorTemp != kNoTempValue) { + ac->setSensorTemp(static_cast(std::round(sensorTemp))); + } else { + ac->setSensorTemp(degrees); // Set the sensor temp to the desired + // (normal) temp. + } + ac->setSensor(!iFeel); ac->setFan(ac->convertFan(fan)); ac->setSwingV(ac->convertSwingV(swingv)); // No Horizontal swing setting available. @@ -2105,10 +2306,6 @@ void IRac::sanyo(IRSanyoAc *ac, ac->setBeep(beep); ac->setSleep(sleep >= 0); // Sleep is either on/off, so convert to boolean. // No Clock setting available. - - // Extra - ac->setSensor(true); // Set the A/C to use the temp sensor in the Unit/Wall. - ac->setSensorTemp(degrees); // Set the sensor temp to the desired temp. ac->send(); } #endif // SEND_SANYO_AC @@ -2801,6 +2998,11 @@ bool IRac::sendAc(const stdAc::state_t desired, const stdAc::state_t *prev) { // Convert the temp from Fahrenheit to Celsius if we are not in Celsius mode. float degC __attribute__((unused)) = desired.celsius ? desired.degrees : fahrenheitToCelsius(desired.degrees); + // Convert the sensorTemp from Fahrenheit to Celsius if we are not in Celsius + // mode. + float sensorTempC __attribute__((unused)) = + desired.sensorTemperature ? desired.sensorTemperature + : fahrenheitToCelsius(desired.sensorTemperature); // special `state_t` that is required to be sent based on that. stdAc::state_t send = this->handleToggles(this->cleanState(desired), prev); // Some protocols expect a previous state for power. @@ -2850,9 +3052,36 @@ bool IRac::sendAc(const stdAc::state_t desired, const stdAc::state_t *prev) { #if SEND_ARGO case ARGO: { - IRArgoAC ac(_pin, _inverted, _modulation); - argo(&ac, send.power, send.mode, degC, send.fanspeed, send.swingv, - send.turbo, send.sleep); + if (send.model == argo_ac_remote_model_t::SAC_WREM3) { + IRArgoAC_WREM3 ac(_pin, _inverted, _modulation); + switch (send.command) { + case stdAc::ac_command_t::kSensorTempReport: + argoWrem3_iFeelReport(&ac, sensorTempC); + break; + case stdAc::ac_command_t::kConfigCommand: + /// @warning: this is ABUSING current **common** parameters: + /// @c clock and @c sleep as config key and value + /// Hence, value pre-validation is performed (safe-mode) + /// to avoid accidental device misconfiguration + argoWrem3_ConfigSet(&ac, send.clock, send.sleep, true); + break; + case stdAc::ac_command_t::kTimerCommand: + argoWrem3_SetTimer(&ac, send.power, send.clock, send.sleep); + break; + case stdAc::ac_command_t::kControlCommand: + default: + argoWrem3_ACCommand(&ac, send.power, send.mode, degC, sensorTempC, + send.fanspeed, send.swingv, send.iFeel, send.quiet, send.econo, + send.turbo, send.filter, send.light); + break; + } + OUTPUT_DECODE_RESULTS_FOR_UT(ac); + } else { + IRArgoAC ac(_pin, _inverted, _modulation); + argo(&ac, send.power, send.mode, degC, sensorTempC, send.fanspeed, + send.swingv, send.iFeel, send.turbo, send.sleep); + OUTPUT_DECODE_RESULTS_FOR_UT(ac); + } break; } #endif // SEND_ARGO @@ -2877,8 +3106,9 @@ bool IRac::sendAc(const stdAc::state_t desired, const stdAc::state_t *prev) { case COOLIX: { IRCoolixAC ac(_pin, _inverted, _modulation); - coolix(&ac, send.power, send.mode, degC, send.fanspeed, send.swingv, - send.swingh, send.turbo, send.light, send.clean, send.sleep); + coolix(&ac, send.power, send.mode, degC, sensorTempC, send.fanspeed, + send.swingv, send.swingh, send.iFeel, send.turbo, send.light, + send.clean, send.sleep); break; } #endif // SEND_COOLIX @@ -2976,7 +3206,8 @@ bool IRac::sendAc(const stdAc::state_t desired, const stdAc::state_t *prev) { case ECOCLIM: { IREcoclimAc ac(_pin, _inverted, _modulation); - ecoclim(&ac, send.power, send.mode, degC, send.fanspeed, send.clock); + ecoclim(&ac, send.power, send.mode, degC, sensorTempC, send.fanspeed, + send.iFeel, send.clock); break; } #endif // SEND_ECOCLIM @@ -2984,8 +3215,9 @@ bool IRac::sendAc(const stdAc::state_t desired, const stdAc::state_t *prev) { case ELECTRA_AC: { IRElectraAc ac(_pin, _inverted, _modulation); - electra(&ac, send.power, send.mode, degC, send.fanspeed, send.swingv, - send.swingh, send.turbo, send.light, send.clean); + electra(&ac, send.power, send.mode, degC, sensorTempC, send.fanspeed, + send.swingv, send.swingh, send.iFeel, send.turbo, send.light, + send.clean); break; } #endif // SEND_ELECTRA_AC @@ -3153,8 +3385,9 @@ bool IRac::sendAc(const stdAc::state_t desired, const stdAc::state_t *prev) { { IRMideaAC ac(_pin, _inverted, _modulation); midea(&ac, send.power, send.mode, send.celsius, send.degrees, - send.fanspeed, send.swingv, send.quiet, prev_quiet, send.turbo, - send.econo, send.light, send.sleep); + send.sensorTemperature, send.fanspeed, send.swingv, send.iFeel, + send.quiet, prev_quiet, send.turbo, send.econo, send.light, + send.clean, send.sleep); break; } #endif // SEND_MIDEA @@ -3263,8 +3496,8 @@ bool IRac::sendAc(const stdAc::state_t desired, const stdAc::state_t *prev) { case SANYO_AC: { IRSanyoAc ac(_pin, _inverted, _modulation); - sanyo(&ac, send.power, send.mode, degC, send.fanspeed, send.swingv, - send.beep, send.sleep); + sanyo(&ac, send.power, send.mode, degC, sensorTempC, send.fanspeed, + send.swingv, send.iFeel, send.beep, send.sleep); break; } #endif // SEND_SANYO_AC @@ -3421,7 +3654,9 @@ bool IRac::cmpStates(const stdAc::state_t a, const stdAc::state_t b) { a.fanspeed != b.fanspeed || a.swingv != b.swingv || a.swingh != b.swingh || a.quiet != b.quiet || a.turbo != b.turbo || a.econo != b.econo || a.light != b.light || a.filter != b.filter || - a.clean != b.clean || a.beep != b.beep || a.sleep != b.sleep; + a.clean != b.clean || a.beep != b.beep || a.sleep != b.sleep || + a.command != b.command || a.sensorTemperature != b.sensorTemperature || + a.iFeel != b.iFeel; } /// Check if the internal state has changed from what was previously sent. @@ -3429,6 +3664,26 @@ bool IRac::cmpStates(const stdAc::state_t a, const stdAc::state_t b) { /// @return True if it has changed, False if not. bool IRac::hasStateChanged(void) { return cmpStates(next, _prev); } +/// Convert the supplied str into the appropriate enum. +/// @param[in] str A Ptr to a C-style string to be converted. +/// @param[in] def The enum to return if no conversion was possible. +/// @return The equivalent enum. +stdAc::ac_command_t IRac::strToCommandType(const char *str, + const stdAc::ac_command_t def) { + if (!STRCASECMP(str, kControlCommandStr)) + return stdAc::ac_command_t::kControlCommand; + else if (!STRCASECMP(str, kIFeelReportStr) || + !STRCASECMP(str, kIFeelStr)) + return stdAc::ac_command_t::kSensorTempReport; + else if (!STRCASECMP(str, kSetTimerCommandStr) || + !STRCASECMP(str, kTimerStr)) + return stdAc::ac_command_t::kTimerCommand; + else if (!STRCASECMP(str, kConfigCommandStr)) + return stdAc::ac_command_t::kConfigCommand; + else + return def; +} + /// Convert the supplied str into the appropriate enum. /// @param[in] str A Ptr to a C-style string to be converted. /// @param[in] def The enum to return if no conversion was possible. @@ -3492,6 +3747,8 @@ stdAc::fanspeed_t IRac::strToFanspeed(const char *str, !STRCASECMP(str, kMaximumStr) || !STRCASECMP(str, kHighestStr)) return stdAc::fanspeed_t::kMax; + else if (!STRCASECMP(str, kMedHighStr)) + return stdAc::fanspeed_t::kMediumHigh; else return def; } @@ -3524,6 +3781,8 @@ stdAc::swingv_t IRac::strToSwingV(const char *str, !STRCASECMP(str, kMediumStr) || !STRCASECMP(str, kCentreStr)) return stdAc::swingv_t::kMiddle; + else if (!STRCASECMP(str, kUpperMiddleStr)) + return stdAc::swingv_t::kUpperMiddle; else if (!STRCASECMP(str, kHighStr) || !STRCASECMP(str, kHiStr)) return stdAc::swingv_t::kHigh; @@ -3666,6 +3925,11 @@ int16_t IRac::strToModel(const char *str, const int16_t def) { return whirlpool_ac_remote_model_t::DG11J13A; } else if (!STRCASECMP(str, kDg11j191Str)) { return whirlpool_ac_remote_model_t::DG11J191; + // Argo A/C models + } else if (!STRCASECMP(str, kArgoWrem2Str)) { + return argo_ac_remote_model_t::SAC_WREM2; + } else if (!STRCASECMP(str, kArgoWrem3Str)) { + return argo_ac_remote_model_t::SAC_WREM3; } else { int16_t number = atoi(str); if (number > 0) @@ -3701,6 +3965,19 @@ String IRac::boolToString(const bool value) { return value ? kOnStr : kOffStr; } +/// Convert the supplied operation mode into the appropriate String. +/// @param[in] cmdType The enum to be converted. +/// @return The equivalent String for the locale. +String IRac::commandTypeToString(const stdAc::ac_command_t cmdType) { + switch (cmdType) { + case stdAc::ac_command_t::kControlCommand: return kControlCommandStr; + case stdAc::ac_command_t::kSensorTempReport: return kIFeelReportStr; + case stdAc::ac_command_t::kTimerCommand: return kSetTimerCommandStr; + case stdAc::ac_command_t::kConfigCommand: return kConfigCommandStr; + default: return kUnknownStr; + } +} + /// Convert the supplied operation mode into the appropriate String. /// @param[in] mode The enum to be converted. /// @param[in] ha A flag to indicate we want GoogleHome/HomeAssistant output. @@ -3722,13 +3999,14 @@ String IRac::opmodeToString(const stdAc::opmode_t mode, const bool ha) { /// @return The equivalent String for the locale. String IRac::fanspeedToString(const stdAc::fanspeed_t speed) { switch (speed) { - case stdAc::fanspeed_t::kAuto: return kAutoStr; - case stdAc::fanspeed_t::kMax: return kMaxStr; - case stdAc::fanspeed_t::kHigh: return kHighStr; - case stdAc::fanspeed_t::kMedium: return kMediumStr; - case stdAc::fanspeed_t::kLow: return kLowStr; - case stdAc::fanspeed_t::kMin: return kMinStr; - default: return kUnknownStr; + case stdAc::fanspeed_t::kAuto: return kAutoStr; + case stdAc::fanspeed_t::kMax: return kMaxStr; + case stdAc::fanspeed_t::kHigh: return kHighStr; + case stdAc::fanspeed_t::kMedium: return kMediumStr; + case stdAc::fanspeed_t::kMediumHigh: return kMedHighStr; + case stdAc::fanspeed_t::kLow: return kLowStr; + case stdAc::fanspeed_t::kMin: return kMinStr; + default: return kUnknownStr; } } @@ -3737,14 +4015,15 @@ String IRac::fanspeedToString(const stdAc::fanspeed_t speed) { /// @return The equivalent String for the locale. String IRac::swingvToString(const stdAc::swingv_t swingv) { switch (swingv) { - case stdAc::swingv_t::kOff: return kOffStr; - case stdAc::swingv_t::kAuto: return kAutoStr; - case stdAc::swingv_t::kHighest: return kHighestStr; - case stdAc::swingv_t::kHigh: return kHighStr; - case stdAc::swingv_t::kMiddle: return kMiddleStr; - case stdAc::swingv_t::kLow: return kLowStr; - case stdAc::swingv_t::kLowest: return kLowestStr; - default: return kUnknownStr; + case stdAc::swingv_t::kOff: return kOffStr; + case stdAc::swingv_t::kAuto: return kAutoStr; + case stdAc::swingv_t::kHighest: return kHighestStr; + case stdAc::swingv_t::kHigh: return kHighStr; + case stdAc::swingv_t::kMiddle: return kMiddleStr; + case stdAc::swingv_t::kUpperMiddle: return kUpperMiddleStr; + case stdAc::swingv_t::kLow: return kLowStr; + case stdAc::swingv_t::kLowest: return kLowestStr; + default: return kUnknownStr; } } @@ -3796,8 +4075,14 @@ namespace IRAcUtils { #endif // DECODE_AMCOR #if DECODE_ARGO case decode_type_t::ARGO: { + if (IRArgoAC_WREM3::isValidWrem3Message(result->state, result->bits, + true)) { + IRArgoAC_WREM3 ac(kGpioUnused); + ac.setRaw(result->state, result->bits / 8); + return ac.toString(); + } IRArgoAC ac(kGpioUnused); - ac.setRaw(result->state); + ac.setRaw(result->state, result->bits / 8); return ac.toString(); } #endif // DECODE_ARGO @@ -4211,6 +4496,13 @@ namespace IRAcUtils { return ac.toString(); } #endif // DECODE_WHIRLPOOL_AC +#if DECODE_YORK + case decode_type_t::YORK: { + IRYorkAc ac(kGpioUnused); + ac.setRaw(result->state); + return ac.toString(); + } +#endif // DECODE_YORK default: return ""; } @@ -4258,9 +4550,24 @@ namespace IRAcUtils { #endif // DECODE_AMCOR #if DECODE_ARGO case decode_type_t::ARGO: { - IRArgoAC ac(kGpioUnused); - ac.setRaw(decode->state); - *result = ac.toCommon(); + const uint16_t length = decode->bits / 8; + if (IRArgoAC_WREM3::isValidWrem3Message(decode->state, + decode->bits, true)) { + IRArgoAC_WREM3 ac(kGpioUnused); + ac.setRaw(decode->state, length); + *result = ac.toCommon(); + } else { + IRArgoAC ac(kGpioUnused); + switch (length) { + case kArgoStateLength: + case kArgoShortStateLength: + ac.setRaw(decode->state, length); + *result = ac.toCommon(); + break; + default: + return false; + } + } break; } #endif // DECODE_ARGO @@ -4732,6 +5039,14 @@ namespace IRAcUtils { break; } #endif // DECODE_WHIRLPOOL_AC +#if DECODE_YORK + case decode_type_t::YORK: { + IRYorkAc ac(kGpioUnused); + ac.setRaw(decode->state); + *result = ac.toCommon(prev); + break; + } +#endif // DECODE_YORK default: return false; } diff --git a/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/src/IRac.h b/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/src/IRac.h index 9193a531d..7f4a3cf01 100644 --- a/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/src/IRac.h +++ b/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/src/IRac.h @@ -5,6 +5,8 @@ #ifndef UNIT_TEST #include +#else +#include #endif #include "IRremoteESP8266.h" #include "ir_Airton.h" @@ -47,6 +49,7 @@ #include "ir_Vestel.h" #include "ir_Voltas.h" #include "ir_Whirlpool.h" +#include "ir_York.h" // Constants const int8_t kGpioUnused = -1; ///< A placeholder for not using an actual GPIO. @@ -84,6 +87,8 @@ class IRac { static bool cmpStates(const stdAc::state_t a, const stdAc::state_t b); static bool strToBool(const char *str, const bool def = false); static int16_t strToModel(const char *str, const int16_t def = -1); + static stdAc::ac_command_t strToCommandType(const char *str, + const stdAc::ac_command_t def = stdAc::ac_command_t::kControlCommand); static stdAc::opmode_t strToOpmode( const char *str, const stdAc::opmode_t def = stdAc::opmode_t::kAuto); static stdAc::fanspeed_t strToFanspeed( @@ -94,6 +99,7 @@ class IRac { static stdAc::swingh_t strToSwingH( const char *str, const stdAc::swingh_t def = stdAc::swingh_t::kOff); static String boolToString(const bool value); + static String commandTypeToString(const stdAc::ac_command_t cmdType); static String opmodeToString(const stdAc::opmode_t mode, const bool ha = false); static String fanspeedToString(const stdAc::fanspeed_t speed); @@ -103,10 +109,17 @@ class IRac { stdAc::state_t getStatePrev(void); bool hasStateChanged(void); stdAc::state_t next; ///< The state we want the device to be in after we send -#ifndef UNIT_TEST +#ifdef UNIT_TEST + /// @cond IGNORE + /// UT-specific + /// See @c OUTPUT_DECODE_RESULTS_FOR_UT macro description in IRac.cpp + std::shared_ptr _utReceiver = nullptr; + std::unique_ptr _lastDecodeResults = nullptr; + /// @endcond +#else private: -#endif +#endif // UNIT_TEST uint16_t _pin; ///< The GPIO to use to transmit messages from. bool _inverted; ///< IR LED is lit when GPIO is LOW (true) or HIGH (false)? bool _modulation; ///< Is frequency modulation to be used? @@ -132,15 +145,26 @@ class IRac { #if SEND_ARGO void argo(IRArgoAC *ac, const bool on, const stdAc::opmode_t mode, const float degrees, - const stdAc::fanspeed_t fan, const stdAc::swingv_t swingv, - const bool turbo, const int16_t sleep = -1); + const float sensorTemp, const stdAc::fanspeed_t fan, + const stdAc::swingv_t swingv, const bool iFeel, const bool turbo, + const int16_t sleep = -1); + void argoWrem3_ACCommand(IRArgoAC_WREM3 *ac, + const bool on, const stdAc::opmode_t mode, const float degrees, + const float sensorTemp, const stdAc::fanspeed_t fan, + const stdAc::swingv_t swingv, const bool iFeel, const bool night, + const bool econo, const bool turbo, const bool filter, const bool light); + void argoWrem3_iFeelReport(IRArgoAC_WREM3 *ac, const float sensorTemp); + void argoWrem3_ConfigSet(IRArgoAC_WREM3 *ac, const uint8_t param, + const uint8_t value, bool safe = true); + void argoWrem3_SetTimer(IRArgoAC_WREM3 *ac, bool on, + const uint16_t currentTime, const uint16_t delayMinutes); #endif // SEND_ARGO #if SEND_BOSCH144 void bosch144(IRBosch144AC *ac, const bool on, const stdAc::opmode_t mode, const float degrees, const stdAc::fanspeed_t fan, const bool quiet); -#endif // SEND_COOLIX +#endif // SEND_BOSCH144 #if SEND_CARRIER_AC64 void carrier64(IRCarrierAc64 *ac, const bool on, const stdAc::opmode_t mode, @@ -150,10 +174,10 @@ void carrier64(IRCarrierAc64 *ac, #if SEND_COOLIX void coolix(IRCoolixAC *ac, const bool on, const stdAc::opmode_t mode, const float degrees, - const stdAc::fanspeed_t fan, + const float sensorTemp, const stdAc::fanspeed_t fan, const stdAc::swingv_t swingv, const stdAc::swingh_t swingh, - const bool turbo, const bool light, const bool clean, - const int16_t sleep = -1); + const bool iFeel, const bool turbo, const bool light, + const bool clean, const int16_t sleep = -1); #endif // SEND_COOLIX #if SEND_CORONA_AC void corona(IRCoronaAc *ac, @@ -231,15 +255,16 @@ void daikin216(IRDaikin216 *ac, #if SEND_ECOCLIM void ecoclim(IREcoclimAc *ac, const bool on, const stdAc::opmode_t mode, - const float degrees, const stdAc::fanspeed_t fan, - const int16_t sleep = -1, const int16_t clock = -1); + const float degrees, const float sensorTemp, + const stdAc::fanspeed_t fan, const int16_t sleep = -1, + const int16_t clock = -1); #endif // SEND_ECOCLIM #if SEND_ELECTRA_AC void electra(IRElectraAc *ac, const bool on, const stdAc::opmode_t mode, - const float degrees, const stdAc::fanspeed_t fan, - const stdAc::swingv_t swingv, - const stdAc::swingh_t swingh, const bool turbo, + const float degrees, const float sensorTemp, + const stdAc::fanspeed_t fan, const stdAc::swingv_t swingv, + const stdAc::swingh_t swingh, const bool iFeel, const bool turbo, const bool lighttoggle, const bool clean); #endif // SEND_ELECTRA_AC #if SEND_FUJITSU_AC @@ -265,8 +290,8 @@ void electra(IRElectraAc *ac, const bool on, const stdAc::opmode_t mode, const bool celsius, const float degrees, const stdAc::fanspeed_t fan, const stdAc::swingv_t swingv, const stdAc::swingh_t swingh, - const bool turbo, const bool econo, const bool light, - const bool clean, const int16_t sleep = -1); + const bool iFeel, const bool turbo, const bool econo, + const bool light, const bool clean, const int16_t sleep = -1); #endif // SEND_GREE #if SEND_HAIER_AC void haier(IRHaierAC *ac, @@ -363,11 +388,11 @@ void electra(IRElectraAc *ac, #if SEND_MIDEA void midea(IRMideaAC *ac, const bool on, const stdAc::opmode_t mode, const bool celsius, - const float degrees, const stdAc::fanspeed_t fan, - const stdAc::swingv_t swingv, - const bool quiet, const bool quiet_prev, const bool turbo, - const bool econo, const bool light, const bool clean, - const int16_t sleep = -1); + const float degrees, const float sensorTemp, + const stdAc::fanspeed_t fan, const stdAc::swingv_t swingv, + const bool iFeel, const bool quiet, const bool quiet_prev, + const bool turbo, const bool econo, const bool light, + const bool clean, const int16_t sleep = -1); #endif // SEND_MIDEA #if SEND_MIRAGE void mirage(IRMirageAc *ac, const stdAc::state_t state); @@ -451,8 +476,9 @@ void electra(IRElectraAc *ac, #if SEND_SANYO_AC void sanyo(IRSanyoAc *ac, const bool on, const stdAc::opmode_t mode, const float degrees, - const stdAc::fanspeed_t fan, const stdAc::swingv_t swingv, - const bool beep, const int16_t sleep = -1); + const float sensorTemp, const stdAc::fanspeed_t fan, + const stdAc::swingv_t swingv, const bool iFeel, const bool beep, + const int16_t sleep = -1); #endif // SEND_SANYO_AC #if SEND_SANYO_AC88 void sanyo88(IRSanyoAc88 *ac, diff --git a/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/src/IRmacros.h b/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/src/IRmacros.h index 2c2ad7d94..665286298 100644 --- a/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/src/IRmacros.h +++ b/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/src/IRmacros.h @@ -34,7 +34,7 @@ #if !VA_OPT_SUPPORTED // #pragma message("Compiler without __VA_OPT__ support") #define COND(cond, a, b) a -#else +#else // !VA_OPT_SUPPORTED #define NOTHING #define EXPAND(...) __VA_ARGS__ #define STUFF_P(a, ...) __VA_OPT__(a) @@ -44,7 +44,7 @@ #define NEGATE(a) VA_TEST(a, a) #define COND_P(cond, a, b) STUFF(a, cond)STUFF(b, NEGATE(cond)) #define COND(cond, a, b) EXPAND(COND_P(cond, a, b)) -#endif +#endif // !VA_OPT_SUPPORTED /// @endcond /** * end of COND() set of macros diff --git a/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/src/IRrecv.cpp b/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/src/IRrecv.cpp index 00bc1f3ab..ecb8a382b 100644 --- a/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/src/IRrecv.cpp +++ b/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/src/IRrecv.cpp @@ -399,6 +399,7 @@ void IRrecv::disableIRIn(void) { #endif // ESP8266 #if defined(ESP32) timerAlarmDisable(timer); + timerDetachInterrupt(timer); timerEnd(timer); #endif // ESP32 detachInterrupt(params.recvpin); @@ -709,9 +710,12 @@ bool IRrecv::decode(decode_results *results, irparams_t *save, return true; #endif #if DECODE_PANASONIC - DPRINTLN("Attempting Panasonic decode"); + DPRINTLN("Attempting Panasonic (48-bit) decode"); if (decodePanasonic(results, offset)) return true; -#endif + DPRINTLN("Attempting Panasonic (40-bit) decode"); + if (decodePanasonic(results, offset, kPanasonic40Bits, true, + kPanasonic40Manufacturer)) return true; +#endif // DECODE_PANASONIC #if DECODE_LG DPRINTLN("Attempting LG (28-bit) decode"); if (decodeLG(results, offset, kLgBits, true)) return true; @@ -951,8 +955,21 @@ bool IRrecv::decode(decode_results *results, irparams_t *save, return true; #endif #if DECODE_ARGO - DPRINTLN("Attempting Argo decode"); - if (decodeArgo(results, offset)) return true; + DPRINTLN("Attempting Argo WREM3 decode (AC Control)"); + if (decodeArgoWREM3(results, offset, kArgo3AcControlStateLength * 8, true)) + return true; + DPRINTLN("Attempting Argo WREM3 decode (iFeel report)"); + if (decodeArgoWREM3(results, offset, kArgo3iFeelReportStateLength * 8, true)) + return true; + DPRINTLN("Attempting Argo WREM3 decode (Config)"); + if (decodeArgoWREM3(results, offset, kArgo3ConfigStateLength * 8, true)) + return true; + DPRINTLN("Attempting Argo WREM3 decode (Timer)"); + if (decodeArgoWREM3(results, offset, kArgo3TimerStateLength * 8, true)) + return true; + DPRINTLN("Attempting Argo WREM2 decode"); + if (decodeArgo(results, offset, kArgoBits) || + decodeArgo(results, offset, kArgoShortBits, false)) return true; #endif // DECODE_ARGO #if DECODE_SHARP_AC DPRINTLN("Attempting SHARP_AC decode"); @@ -1160,6 +1177,22 @@ bool IRrecv::decode(decode_results *results, irparams_t *save, DPRINTLN("Attempting Daikin 312-bit decode"); if (decodeDaikin312(results, offset)) return true; #endif // DECODE_DAIKIN312 +#if DECODE_GORENJE + DPRINTLN("Attempting GORENJE decode"); + if (decodeGorenje(results, offset)) return true; +#endif // DECODE_GORENJE +#if DECODE_WOWWEE + DPRINTLN("Attempting WOWWEE decode"); + if (decodeWowwee(results, offset)) return true; +#endif // DECODE_WOWWEE +#if DECODE_CARRIER_AC84 + DPRINTLN("Attempting Carrier A/C 84-bit decode"); + if (decodeCarrierAC84(results, offset)) return true; +#endif // DECODE_CARRIER_AC84 +#if DECODE_YORK + DPRINTLN("Attempting York decode"); + if (decodeYork(results, offset, kYorkBits)) return true; +#endif // DECODE_YORK // Typically new protocols are added above this line. } #if DECODE_HASH diff --git a/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/src/IRrecv.h b/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/src/IRrecv.h index ad09f6d35..7adf5eb1b 100644 --- a/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/src/IRrecv.h +++ b/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/src/IRrecv.h @@ -294,6 +294,9 @@ class IRrecv { #if DECODE_ARGO bool decodeArgo(decode_results *results, uint16_t offset = kStartOffset, const uint16_t nbits = kArgoBits, const bool strict = true); + bool decodeArgoWREM3(decode_results *results, uint16_t offset = kStartOffset, + const uint16_t nbits = kArgo3AcControlStateLength * 8, + const bool strict = true); #endif // DECODE_ARGO #if DECODE_ARRIS bool decodeArris(decode_results *results, uint16_t offset = kStartOffset, @@ -580,6 +583,12 @@ class IRrecv { const uint16_t nbits = kCarrierAc40Bits, const bool strict = true); #endif // DECODE_CARRIER_AC40 +#if DECODE_CARRIER_AC84 + bool decodeCarrierAC84(decode_results *results, + uint16_t offset = kStartOffset, + const uint16_t nbits = kCarrierAc84Bits, + const bool strict = true); +#endif // DECODE_CARRIER_AC84 #if DECODE_CARRIER_AC64 bool decodeCarrierAC64(decode_results *results, uint16_t offset = kStartOffset, @@ -598,6 +607,11 @@ class IRrecv { const uint16_t nbits = kGoodweatherBits, const bool strict = true); #endif // DECODE_GOODWEATHER +#if DECODE_GORENJE + bool decodeGorenje(decode_results *results, uint16_t offset = kStartOffset, + const uint16_t nbits = kGorenjeBits, + const bool strict = true); +#endif // DECODE_GORENJE #if DECODE_GREE bool decodeGree(decode_results *results, uint16_t offset = kStartOffset, const uint16_t nbits = kGreeBits, @@ -857,6 +871,18 @@ class IRrecv { const uint16_t nbits = kBosch144Bits, const bool strict = true); #endif // DECODE_BOSCH144 +#if DECODE_WOWWEE + bool decodeWowwee(decode_results *results, + uint16_t offset = kStartOffset, + const uint16_t nbits = kWowweeBits, + const bool strict = true); +#endif // DECODE_WOWWEE +#if DECODE_YORK + bool decodeYork(decode_results *results, + uint16_t kStartOffset, + const uint16_t kYorkBits, + const bool strict = true); +#endif // DECODE_YORK }; #endif // IRRECV_H_ diff --git a/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/src/IRremoteESP8266.h b/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/src/IRremoteESP8266.h index 09e5d045b..133d507b8 100644 --- a/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/src/IRremoteESP8266.h +++ b/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/src/IRremoteESP8266.h @@ -58,7 +58,7 @@ // Minor version number (x.X.x) #define _IRREMOTEESP8266_VERSION_MINOR 8 // Patch version number (x.x.X) -#define _IRREMOTEESP8266_VERSION_PATCH 4 +#define _IRREMOTEESP8266_VERSION_PATCH 5 // Macro to convert version info into an integer #define _IRREMOTEESP8266_VERSION_VAL(major, minor, patch) \ (((major) << 16) | ((minor) << 8) | (patch)) @@ -924,6 +924,34 @@ #define SEND_DAIKIN312 _IR_ENABLE_DEFAULT_ #endif // SEND_DAIKIN312 +#ifndef DECODE_GORENJE +#define DECODE_GORENJE _IR_ENABLE_DEFAULT_ +#endif // DECODE_GORENJE +#ifndef SEND_GORENJE +#define SEND_GORENJE _IR_ENABLE_DEFAULT_ +#endif // SEND_GORENJE + +#ifndef DECODE_WOWWEE +#define DECODE_WOWWEE _IR_ENABLE_DEFAULT_ +#endif // DECODE_WOWWEE +#ifndef SEND_WOWWEE +#define SEND_WOWWEE _IR_ENABLE_DEFAULT_ +#endif // SEND_WOWWEE + +#ifndef DECODE_CARRIER_AC84 +#define DECODE_CARRIER_AC84 _IR_ENABLE_DEFAULT_ +#endif // DECODE_CARRIER_AC84 +#ifndef SEND_CARRIER_AC84 +#define SEND_CARRIER_AC84 _IR_ENABLE_DEFAULT_ +#endif // SEND_CARRIER_AC84 + +#ifndef DECODE_YORK +#define DECODE_YORK _IR_ENABLE_DEFAULT_ +#endif // DECODE_YORK +#ifndef SEND_YORK +#define SEND_YORK _IR_ENABLE_DEFAULT_ +#endif // SEND_YORK + #if (DECODE_ARGO || DECODE_DAIKIN || DECODE_FUJITSU_AC || DECODE_GREE || \ DECODE_KELVINATOR || DECODE_MITSUBISHI_AC || DECODE_TOSHIBA_AC || \ DECODE_TROTEC || DECODE_HAIER_AC || DECODE_HITACHI_AC || \ @@ -942,6 +970,7 @@ DECODE_KELON168 || DECODE_HITACHI_AC296 || DECODE_CARRIER_AC128 || \ DECODE_DAIKIN200 || DECODE_HAIER_AC160 || DECODE_TCL96AC || \ DECODE_BOSCH144 || DECODE_SANYO_AC152 || DECODE_DAIKIN312 || \ + DECODE_CARRIER_AC84 || DECODE_YORK || \ false) // Add any DECODE to the above if it uses result->state (see kStateSizeMax) // you might also want to add the protocol to hasACState function @@ -1104,8 +1133,12 @@ enum decode_type_t { BOSCH144, // 120 SANYO_AC152, DAIKIN312, + GORENJE, + WOWWEE, + CARRIER_AC84, // 125 + YORK, // Add new entries before this one, and update it to point to the last entry. - kLastDecodeType = DAIKIN312, + kLastDecodeType = YORK, }; // Message lengths & required repeat values @@ -1123,7 +1156,13 @@ const uint16_t kAmcorStateLength = 8; const uint16_t kAmcorBits = kAmcorStateLength * 8; const uint16_t kAmcorDefaultRepeat = kSingleRepeat; const uint16_t kArgoStateLength = 12; +const uint16_t kArgoShortStateLength = 4; const uint16_t kArgoBits = kArgoStateLength * 8; +const uint16_t kArgoShortBits = kArgoShortStateLength * 8; +const uint16_t kArgo3AcControlStateLength = 6; // Bytes +const uint16_t kArgo3iFeelReportStateLength = 2; // Bytes +const uint16_t kArgo3TimerStateLength = 9; // Bytes +const uint16_t kArgo3ConfigStateLength = 4; // Bytes const uint16_t kArgoDefaultRepeat = kNoRepeat; const uint16_t kArrisBits = 32; const uint16_t kBosch144StateLength = 18; @@ -1137,6 +1176,9 @@ const uint16_t kCarrierAc40Bits = 40; const uint16_t kCarrierAc40MinRepeat = 2; const uint16_t kCarrierAc64Bits = 64; const uint16_t kCarrierAc64MinRepeat = kNoRepeat; +const uint16_t kCarrierAc84StateLength = 11; +const uint16_t kCarrierAc84Bits = kCarrierAc84StateLength * 8 - 4; +const uint16_t kCarrierAc84MinRepeat = kNoRepeat; const uint16_t kCarrierAc128StateLength = 16; const uint16_t kCarrierAc128Bits = kCarrierAc128StateLength * 8; const uint16_t kCarrierAc128MinRepeat = kNoRepeat; @@ -1203,6 +1245,7 @@ const uint16_t kGicableBits = 16; const uint16_t kGicableMinRepeat = kSingleRepeat; const uint16_t kGoodweatherBits = 48; const uint16_t kGoodweatherMinRepeat = kNoRepeat; +const uint16_t kGorenjeBits = 8; const uint16_t kGreeStateLength = 8; const uint16_t kGreeBits = kGreeStateLength * 8; const uint16_t kGreeDefaultRepeat = kNoRepeat; @@ -1292,6 +1335,8 @@ const uint16_t kNeoclimaBits = kNeoclimaStateLength * 8; const uint16_t kNeoclimaMinRepeat = kNoRepeat; const uint16_t kPanasonicBits = 48; const uint32_t kPanasonicManufacturer = 0x4004; +const uint32_t kPanasonic40Manufacturer = 0x34; +const uint16_t kPanasonic40Bits = 40; const uint16_t kPanasonicAcStateLength = 27; const uint16_t kPanasonicAcStateShortLength = 16; const uint16_t kPanasonicAcBits = kPanasonicAcStateLength * 8; @@ -1372,6 +1417,8 @@ const uint16_t kWhirlpoolAcStateLength = 21; const uint16_t kWhirlpoolAcBits = kWhirlpoolAcStateLength * 8; const uint16_t kWhirlpoolAcDefaultRepeat = kNoRepeat; const uint16_t kWhynterBits = 32; +const uint16_t kWowweeBits = 11; +const uint16_t kWowweeDefaultRepeat = kNoRepeat; const uint8_t kVestelAcBits = 56; const uint16_t kXmpBits = 64; const uint16_t kZepealBits = 16; @@ -1386,6 +1433,8 @@ const uint16_t kRhossStateLength = 12; const uint16_t kRhossBits = kRhossStateLength * 8; const uint16_t kRhossDefaultRepeat = 0; const uint16_t kClimaButlerBits = 52; +const uint16_t kYorkBits = 136; +const uint16_t kYorkStateLength = 17; // Legacy defines. (Deprecated) diff --git a/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/src/IRsend.cpp b/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/src/IRsend.cpp index 1fb1339c5..10e440b32 100644 --- a/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/src/IRsend.cpp +++ b/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/src/IRsend.cpp @@ -603,7 +603,10 @@ uint16_t IRsend::minRepeats(const decode_type_t protocol) { uint16_t IRsend::defaultBits(const decode_type_t protocol) { switch (protocol) { case MULTIBRACKETS: + case GORENJE: return 8; + case WOWWEE: + return 11; case RC5: case SYMPHONY: return 12; @@ -690,6 +693,8 @@ uint16_t IRsend::defaultBits(const decode_type_t protocol) { return kBosch144Bits; case CORONA_AC: return kCoronaAcBits; + case CARRIER_AC84: + return kCarrierAc84Bits; case CARRIER_AC128: return kCarrierAc128Bits; case DAIKIN: @@ -791,6 +796,8 @@ uint16_t IRsend::defaultBits(const decode_type_t protocol) { return kWhirlpoolAcBits; case XMP: return kXmpBits; + case YORK: + return kYorkBits; // No default amount of bits. case FUJITSU_AC: case MWM: @@ -916,6 +923,11 @@ bool IRsend::send(const decode_type_t type, const uint64_t data, sendGoodweather(data, nbits, min_repeat); break; #endif +#if SEND_GORENJE + case GORENJE: + sendGorenje(data, nbits, min_repeat); + break; +#endif #if SEND_GREE case GREE: sendGree(data, nbits, min_repeat); @@ -1114,6 +1126,11 @@ bool IRsend::send(const decode_type_t type, const uint64_t data, sendWhynter(data, nbits, min_repeat); break; #endif +#if SEND_WOWWEE + case WOWWEE: + sendWowwee(data, nbits, min_repeat); + break; +#endif // SEND_WOWWEE #if SEND_XMP case XMP: sendXmp(data, nbits, min_repeat); @@ -1159,6 +1176,11 @@ bool IRsend::send(const decode_type_t type, const uint8_t *state, sendBosch144(state, nbytes); break; #endif // SEND_BOSCH144 +#if SEND_CARRIER_AC84 + case CARRIER_AC84: + sendCarrierAC84(state, nbytes); + break; +#endif // SEND_CARRIER_AC84 #if SEND_CARRIER_AC128 case CARRIER_AC128: sendCarrierAC128(state, nbytes); @@ -1407,6 +1429,11 @@ bool IRsend::send(const decode_type_t type, const uint8_t *state, sendWhirlpoolAC(state, nbytes); break; #endif // SEND_WHIRLPOOL_AC +#if SEND_YORK + case YORK: + sendYork(state, nbytes); + break; +#endif // SEND_YORK default: return false; } diff --git a/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/src/IRsend.h b/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/src/IRsend.h index 02f2c939e..f8a447197 100644 --- a/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/src/IRsend.h +++ b/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/src/IRsend.h @@ -39,6 +39,9 @@ const uint8_t kDutyMax = 100; // Percentage const uint16_t kMaxAccurateUsecDelay = 16383; // Usecs to wait between messages we don't know the proper gap time. const uint32_t kDefaultMessageGap = 100000; +/// Placeholder for missing sensor temp value +/// @note Not using "-1" as it may be a valid external temp +const float kNoTempValue = -100.0; /// Enumerators and Structures for the Common A/C API. namespace stdAc { @@ -56,14 +59,15 @@ enum class opmode_t { /// Common A/C settings for Fan Speeds. enum class fanspeed_t { - kAuto = 0, - kMin = 1, - kLow = 2, - kMedium = 3, - kHigh = 4, - kMax = 5, + kAuto = 0, + kMin = 1, + kLow = 2, + kMedium = 3, + kHigh = 4, + kMax = 5, + kMediumHigh = 6, // Add new entries before this one, and update it to point to the last entry - kLastFanspeedEnum = kMax, + kLastFanspeedEnum = kMediumHigh, }; /// Common A/C settings for Vertical Swing. @@ -75,8 +79,21 @@ enum class swingv_t { kMiddle = 3, kLow = 4, kLowest = 5, + kUpperMiddle = 6, // Add new entries before this one, and update it to point to the last entry - kLastSwingvEnum = kLowest, + kLastSwingvEnum = kUpperMiddle, +}; + +/// @brief Tyoe of A/C command (if the remote uses different codes for each) +/// @note Most remotes support only a single command or aggregate multiple +/// into one (e.g. control+timer). Use @c kControlCommand in such case +enum class ac_command_t { + kControlCommand = 0, + kSensorTempReport = 1, + kTimerCommand = 2, + kConfigCommand = 3, + // Add new entries before this one, and update it to point to the last entry + kLastAcCommandEnum = kConfigCommand, }; /// Common A/C settings for Horizontal Swing. @@ -113,6 +130,9 @@ struct state_t { bool beep = false; int16_t sleep = -1; // `-1` means off. int16_t clock = -1; // `-1` means not set. + stdAc::ac_command_t command = stdAc::ac_command_t::kControlCommand; + bool iFeel = false; + float sensorTemperature = kNoTempValue; // `kNoTempValue` means not set. }; }; // namespace stdAc @@ -202,6 +222,11 @@ enum lg_ac_remote_model_t { LG6711A20083V, // (5) Same as GE6711AR2853M, but only SwingV toggle. }; +/// Argo A/C model numbers +enum argo_ac_remote_model_t { + SAC_WREM2 = 1, // (1) ARGO WREM2 remote (default) + SAC_WREM3 // (2) ARGO WREM3 remote (touch buttons), bit-len vary by cmd +}; // Classes @@ -519,14 +544,22 @@ class IRsend { const uint16_t nbits = kGoodweatherBits, const uint16_t repeat = kGoodweatherMinRepeat); #endif // SEND_GOODWEATHER +#if SEND_GORENJE + void sendGorenje(const uint64_t data, const uint16_t nbits = kGorenjeBits, + const uint16_t repeat = kNoRepeat); +#endif // SEND_GORENJE #if SEND_PRONTO void sendPronto(uint16_t data[], uint16_t len, uint16_t repeat = kNoRepeat); #endif #if SEND_ARGO void sendArgo(const unsigned char data[], + const uint16_t nbytes = kArgoStateLength, + const uint16_t repeat = kArgoDefaultRepeat, + bool sendFooter = false); + void sendArgoWREM3(const unsigned char data[], const uint16_t nbytes = kArgoStateLength, const uint16_t repeat = kArgoDefaultRepeat); -#endif +#endif // SEND_ARGO #if SEND_TROTEC void sendTrotec(const unsigned char data[], const uint16_t nbytes = kTrotecStateLength, @@ -575,6 +608,11 @@ class IRsend { void sendCarrierAC64(uint64_t data, uint16_t nbits = kCarrierAc64Bits, uint16_t repeat = kCarrierAc64MinRepeat); #endif +#if SEND_CARRIER_AC84 + void sendCarrierAC84(const uint8_t data[], + const uint16_t nbytes = kCarrierAc84StateLength, + const uint16_t repeat = kNoRepeat); +#endif // SEND_CARRIER_AC84 #if SEND_CARRIER_AC128 void sendCarrierAC128(const uint8_t data[], uint16_t nbytes = kCarrierAc128StateLength, @@ -837,6 +875,15 @@ class IRsend { const uint16_t nbytes = kBosch144StateLength, const uint16_t repeat = kNoRepeat); #endif // SEND_BOSCH144 +#if SEND_WOWWEE + void sendWowwee(const uint64_t data, const uint16_t nbits = kWowweeBits, + const uint16_t repeat = kWowweeDefaultRepeat); +#endif // SEND_WOWWEE +#if SEND_YORK + void sendYork(const unsigned char data[], + const uint16_t nbytes = kYorkStateLength, + const uint16_t repeat = kNoRepeat); +#endif // SEND_YORK protected: #ifdef UNIT_TEST diff --git a/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/src/IRtext.cpp b/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/src/IRtext.cpp index 5bd25ed95..9cb39b772 100644 --- a/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/src/IRtext.cpp +++ b/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/src/IRtext.cpp @@ -68,10 +68,13 @@ IRTEXT_CONST_STRING(kOffTimerStr, D_STR_OFFTIMER); ///< "Off Timer" IRTEXT_CONST_STRING(kTimerModeStr, D_STR_TIMERMODE); ///< "Timer Mode" IRTEXT_CONST_STRING(kClockStr, D_STR_CLOCK); ///< "Clock" IRTEXT_CONST_STRING(kCommandStr, D_STR_COMMAND); ///< "Command" +IRTEXT_CONST_STRING(kConfigCommandStr, D_STR_CONFIG); ///< "Config" +IRTEXT_CONST_STRING(kControlCommandStr, D_STR_CONTROL); ///< "Control" IRTEXT_CONST_STRING(kXFanStr, D_STR_XFAN); ///< "XFan" IRTEXT_CONST_STRING(kHealthStr, D_STR_HEALTH); ///< "Health" IRTEXT_CONST_STRING(kModelStr, D_STR_MODEL); ///< "Model" IRTEXT_CONST_STRING(kTempStr, D_STR_TEMP); ///< "Temp" +IRTEXT_CONST_STRING(kIFeelReportStr, D_STR_IFEELREPORT); ///< "IFeel Report" IRTEXT_CONST_STRING(kIFeelStr, D_STR_IFEEL); ///< "IFeel" IRTEXT_CONST_STRING(kHumidStr, D_STR_HUMID); ///< "Humid" IRTEXT_CONST_STRING(kSaveStr, D_STR_SAVE); ///< "Save" @@ -123,6 +126,7 @@ IRTEXT_CONST_STRING(kOutsideStr, D_STR_OUTSIDE); ///< "Outside" IRTEXT_CONST_STRING(kLoudStr, D_STR_LOUD); ///< "Loud" IRTEXT_CONST_STRING(kLowerStr, D_STR_LOWER); ///< "Lower" IRTEXT_CONST_STRING(kUpperStr, D_STR_UPPER); ///< "Upper" +IRTEXT_CONST_STRING(kUpperMiddleStr, D_STR_UPPER_MIDDLE); ///< "Upper-Middle" IRTEXT_CONST_STRING(kBreezeStr, D_STR_BREEZE); ///< "Breeze" IRTEXT_CONST_STRING(kCirculateStr, D_STR_CIRCULATE); ///< "Circulate" IRTEXT_CONST_STRING(kCeilingStr, D_STR_CEILING); ///< "Ceiling" @@ -160,6 +164,7 @@ IRTEXT_CONST_STRING(kMaxStr, D_STR_MAX); ///< "Max" IRTEXT_CONST_STRING(kMaximumStr, D_STR_MAXIMUM); ///< "Maximum" IRTEXT_CONST_STRING(kMinStr, D_STR_MIN); ///< "Min" IRTEXT_CONST_STRING(kMinimumStr, D_STR_MINIMUM); ///< "Minimum" +IRTEXT_CONST_STRING(kMedHighStr, D_STR_MED_HIGH); ///< "Med-high" IRTEXT_CONST_STRING(kMedStr, D_STR_MED); ///< "Med" IRTEXT_CONST_STRING(kMediumStr, D_STR_MEDIUM); ///< "Medium" @@ -205,6 +210,13 @@ IRTEXT_CONST_STRING(kSwingVModeStr, D_STR_SWINGVMODE); ///< "Swing(V) Mode" IRTEXT_CONST_STRING(kSwingVToggleStr, D_STR_SWINGVTOGGLE); ///< ///< "Swing(V) Toggle" IRTEXT_CONST_STRING(kTurboToggleStr, D_STR_TURBOTOGGLE); ///< "Turbo Toggle" +IRTEXT_CONST_STRING(kSetTimerCommandStr, D_STR_SET_TIMER); ///< "Set Timer" +IRTEXT_CONST_STRING(kScheduleStr, D_STR_SCHEDULE); ///< "Schedule" +IRTEXT_CONST_STRING(kChStr, D_STR_CH); ///< "CH#" +IRTEXT_CONST_STRING(kTimerActiveDaysStr, D_STR_TIMER_ACTIVE_DAYS); +///< "TimerActiveDays" +IRTEXT_CONST_STRING(kKeyStr, D_STR_KEY); ///< "Key" +IRTEXT_CONST_STRING(kValueStr, D_STR_VALUE); ///< "Value" // Separators & Punctuation const char kTimeSep = D_CHR_TIME_SEP; ///< ':' @@ -281,6 +293,8 @@ IRTEXT_CONST_STRING(k122lzfStr, D_STR_122LZF); ///< "122LZF" IRTEXT_CONST_STRING(kDg11j13aStr, D_STR_DG11J13A); ///< "DG11J13A" IRTEXT_CONST_STRING(kDg11j104Str, D_STR_DG11J104); ///< "DG11J104" IRTEXT_CONST_STRING(kDg11j191Str, D_STR_DG11J191); ///< "DG11J191" +IRTEXT_CONST_STRING(kArgoWrem2Str, D_STR_ARGO_WREM2); ///< "WREM3" +IRTEXT_CONST_STRING(kArgoWrem3Str, D_STR_ARGO_WREM3); ///< "WREM3" #define D_STR_UNSUPPORTED "?" // Unsupported protocols will be showing as // a question mark, check for length > 1 @@ -533,6 +547,14 @@ IRTEXT_CONST_BLOB_DECL(kAllProtocolNamesStr) { D_STR_SANYO_AC152, D_STR_UNSUPPORTED) "\x0" COND(DECODE_DAIKIN312 || SEND_DAIKIN312, D_STR_DAIKIN312, D_STR_UNSUPPORTED) "\x0" + COND(DECODE_GORENJE || SEND_GORENJE, + D_STR_GORENJE, D_STR_UNSUPPORTED) "\x0" + COND(DECODE_WOWWEE || SEND_WOWWEE, + D_STR_WOWWEE, D_STR_UNSUPPORTED) "\x0" + COND(DECODE_CARRIER_AC84 || SEND_CARRIER_AC84, + D_STR_CARRIER_AC84, D_STR_UNSUPPORTED) "\x0" + COND(DECODE_YORK || SEND_YORK, + D_STR_YORK, D_STR_UNSUPPORTED) "\x0" ///< New protocol (macro) strings should be added just above this line. "\x0" ///< This string requires double null termination. }; diff --git a/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/src/IRtext.h b/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/src/IRtext.h index 7bd4fbed3..15d2690b7 100644 --- a/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/src/IRtext.h +++ b/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/src/IRtext.h @@ -39,6 +39,8 @@ extern IRTEXT_CONST_PTR(kAkb73757604Str); extern IRTEXT_CONST_PTR(kAkb74955603Str); extern IRTEXT_CONST_PTR(kAkb75215403Str); extern IRTEXT_CONST_PTR(kArdb1Str); +extern IRTEXT_CONST_PTR(kArgoWrem2Str); +extern IRTEXT_CONST_PTR(kArgoWrem3Str); extern IRTEXT_CONST_PTR(kArjw2Str); extern IRTEXT_CONST_PTR(kArrah2eStr); extern IRTEXT_CONST_PTR(kArreb1eStr); @@ -57,6 +59,7 @@ extern IRTEXT_CONST_PTR(kCelsiusFahrenheitStr); extern IRTEXT_CONST_PTR(kCelsiusStr); extern IRTEXT_CONST_PTR(kCentreStr); extern IRTEXT_CONST_PTR(kChangeStr); +extern IRTEXT_CONST_PTR(kChStr); extern IRTEXT_CONST_PTR(kCirculateStr); extern IRTEXT_CONST_PTR(kCkpStr); extern IRTEXT_CONST_PTR(kCleanStr); @@ -66,6 +69,8 @@ extern IRTEXT_CONST_PTR(kColonSpaceStr); extern IRTEXT_CONST_PTR(kComfortStr); extern IRTEXT_CONST_PTR(kCommaSpaceStr); extern IRTEXT_CONST_PTR(kCommandStr); +extern IRTEXT_CONST_PTR(kConfigCommandStr); +extern IRTEXT_CONST_PTR(kControlCommandStr); extern IRTEXT_CONST_PTR(kCoolStr); extern IRTEXT_CONST_PTR(kCoolingStr); extern IRTEXT_CONST_PTR(kDashStr); @@ -109,6 +114,7 @@ extern IRTEXT_CONST_PTR(kHoldStr); extern IRTEXT_CONST_PTR(kHourStr); extern IRTEXT_CONST_PTR(kHoursStr); extern IRTEXT_CONST_PTR(kHumidStr); +extern IRTEXT_CONST_PTR(kIFeelReportStr); extern IRTEXT_CONST_PTR(kIFeelStr); extern IRTEXT_CONST_PTR(kISeeStr); extern IRTEXT_CONST_PTR(kIdStr); @@ -116,6 +122,7 @@ extern IRTEXT_CONST_PTR(kIndirectStr); extern IRTEXT_CONST_PTR(kInsideStr); extern IRTEXT_CONST_PTR(kIonStr); extern IRTEXT_CONST_PTR(kJkeStr); +extern IRTEXT_CONST_PTR(kKeyStr); extern IRTEXT_CONST_PTR(kKkg29ac1Str); extern IRTEXT_CONST_PTR(kKkg9ac1Str); extern IRTEXT_CONST_PTR(kLastStr); @@ -139,6 +146,7 @@ extern IRTEXT_CONST_PTR(kMaxRightNoSpaceStr); extern IRTEXT_CONST_PTR(kMaxRightStr); extern IRTEXT_CONST_PTR(kMaxStr); extern IRTEXT_CONST_PTR(kMaximumStr); +extern IRTEXT_CONST_PTR(kMedHighStr); extern IRTEXT_CONST_PTR(kMedStr); extern IRTEXT_CONST_PTR(kMediumStr); extern IRTEXT_CONST_PTR(kMidStr); @@ -188,8 +196,10 @@ extern IRTEXT_CONST_PTR(kRlt0541htaaStr); extern IRTEXT_CONST_PTR(kRlt0541htabStr); extern IRTEXT_CONST_PTR(kRoomStr); extern IRTEXT_CONST_PTR(kSaveStr); +extern IRTEXT_CONST_PTR(kScheduleStr); extern IRTEXT_CONST_PTR(kSecondStr); extern IRTEXT_CONST_PTR(kSecondsStr); +extern IRTEXT_CONST_PTR(kSensorReportStr); extern IRTEXT_CONST_PTR(kSensorStr); extern IRTEXT_CONST_PTR(kSensorTempStr); extern IRTEXT_CONST_PTR(kSetStr); @@ -213,7 +223,9 @@ extern IRTEXT_CONST_PTR(kTempDownStr); extern IRTEXT_CONST_PTR(kTempStr); extern IRTEXT_CONST_PTR(kTempUpStr); extern IRTEXT_CONST_PTR(kThreeLetterDayOfWeekStr); +extern IRTEXT_CONST_PTR(kTimerActiveDaysStr); extern IRTEXT_CONST_PTR(kTimerModeStr); +extern IRTEXT_CONST_PTR(kSetTimerCommandStr); extern IRTEXT_CONST_PTR(kTimerStr); extern IRTEXT_CONST_PTR(kToggleStr); extern IRTEXT_CONST_PTR(kTopStr); @@ -224,6 +236,8 @@ extern IRTEXT_CONST_PTR(kTypeStr); extern IRTEXT_CONST_PTR(kUnknownStr); extern IRTEXT_CONST_PTR(kUpStr); extern IRTEXT_CONST_PTR(kUpperStr); +extern IRTEXT_CONST_PTR(kUpperMiddleStr); +extern IRTEXT_CONST_PTR(kValueStr); extern IRTEXT_CONST_PTR(kV9014557AStr); extern IRTEXT_CONST_PTR(kV9014557BStr); extern IRTEXT_CONST_PTR(kVaneStr); diff --git a/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/src/IRutils.cpp b/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/src/IRutils.cpp index 7c59228c0..4c713c87b 100644 --- a/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/src/IRutils.cpp +++ b/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/src/IRutils.cpp @@ -6,6 +6,7 @@ #endif #define __STDC_LIMIT_MACROS +#include #include #include #include @@ -173,6 +174,7 @@ bool hasACState(const decode_type_t protocol) { case AMCOR: case ARGO: case BOSCH144: + case CARRIER_AC84: case CARRIER_AC128: case CORONA_AC: case DAIKIN: @@ -224,6 +226,7 @@ bool hasACState(const decode_type_t protocol) { case TROTEC_3550: case VOLTAS: case WHIRLPOOL_AC: + case YORK: return true; default: return false; @@ -304,7 +307,7 @@ String resultToSourceCode(const decode_results * const results) { if (results->decode_type != UNKNOWN) { if (hasState) { #if DECODE_AC - uint16_t nbytes = results->bits / 8; + uint16_t nbytes = ceil(static_cast(results->bits) / 8.0); output += F("uint8_t state["); output += uint64ToString(nbytes); output += F("] = {"); @@ -695,6 +698,13 @@ namespace irutils { default: return kUnknownStr; } break; + case decode_type_t::ARGO: + switch (model) { + case argo_ac_remote_model_t::SAC_WREM2: return kArgoWrem2Str; + case argo_ac_remote_model_t::SAC_WREM3: return kArgoWrem3Str; + default: return kUnknownStr; + } + break; default: return kUnknownStr; } } @@ -722,10 +732,12 @@ namespace irutils { /// @param[in] celsius Is the temp Celsius or Fahrenheit. /// true is C, false is F /// @param[in] precomma Should the output string start with ", " or not? + /// @param[in] isSensorTemp Is the value a room (ambient) temp. or target? /// @return The resulting String. String addTempToString(const uint16_t degrees, const bool celsius, - const bool precomma) { - String result = addIntToString(degrees, kTempStr, precomma); + const bool precomma, const bool isSensorTemp) { + String result = addIntToString(degrees, (isSensorTemp)? + kSensorTempStr : kTempStr, precomma); result += celsius ? 'C' : 'F'; return result; } @@ -736,12 +748,14 @@ namespace irutils { /// @param[in] celsius Is the temp Celsius or Fahrenheit. /// true is C, false is F /// @param[in] precomma Should the output string start with ", " or not? + /// @param[in] isSensorTemp Is the value a room (ambient) temp. or target? /// @return The resulting String. String addTempFloatToString(const float degrees, const bool celsius, - const bool precomma) { + const bool precomma, const bool isSensorTemp) { String result = ""; - result.reserve(14); // Assuming ", Temp: XXX.5F" is the largest. - result += addIntToString(degrees, kTempStr, precomma); + result.reserve(21); // Assuming ", Sensor Temp: XXX.5F" is the largest. + result += addIntToString(degrees, (isSensorTemp)? + kSensorTempStr : kTempStr, precomma); // Is it a half degree? if (((uint16_t)(2 * degrees)) & 1) result += F(".5"); result += celsius ? 'C' : 'F'; @@ -788,43 +802,57 @@ namespace irutils { result.reserve(19); // ", Day: N (UNKNOWN)" result += addIntToString(day_of_week, kDayStr, precomma); result += kSpaceLBraceStr; + result += dayToString(day_of_week, offset); + return result + ')'; + } + + /// Create a String of the 3-letter day of the week from a numerical day of + /// the week. e.g. "Mon" + /// @param[in] day_of_week A numerical version of the sequential day of the + /// week. e.g. Sunday = 1, Monday = 2, ..., Saturday = 7 + /// @param[in] offset Days to offset by. + /// e.g. For different day starting the week. + /// @return The resulting String. + String dayToString(const uint8_t day_of_week, const int8_t offset) { if ((uint8_t)(day_of_week + offset) < 7) #if UNIT_TEST - result += String(kThreeLetterDayOfWeekStr).substr( - (day_of_week + offset) * 3, 3); + return String(kThreeLetterDayOfWeekStr).substr( + (day_of_week + offset) * 3, 3); #else // UNIT_TEST - result += String(kThreeLetterDayOfWeekStr).substring( - (day_of_week + offset) * 3, (day_of_week + offset) * 3 + 3); + return String(kThreeLetterDayOfWeekStr).substring( + (day_of_week + offset) * 3, (day_of_week + offset) * 3 + 3); #endif // UNIT_TEST else - result += kUnknownStr; - return result + ')'; + return kUnknownStr; } /// Create a String of human output for the given fan speed. /// e.g. "Fan: 0 (Auto)" /// @param[in] speed The numeric speed of the fan to display. - /// @param[in] high The numeric value for High speed. + /// @param[in] high The numeric value for High speed. (second highest) /// @param[in] low The numeric value for Low speed. /// @param[in] automatic The numeric value for Auto speed. /// @param[in] quiet The numeric value for Quiet speed. /// @param[in] medium The numeric value for Medium speed. /// @param[in] maximum The numeric value for Highest speed. (if > high) + /// @param[in] medium_high The numeric value for third-highest speed. + /// (if > medium) /// @return The resulting String. String addFanToString(const uint8_t speed, const uint8_t high, const uint8_t low, const uint8_t automatic, const uint8_t quiet, const uint8_t medium, - const uint8_t maximum) { + const uint8_t maximum, const uint8_t medium_high) { String result = ""; result.reserve(21); // ", Fan: NNN (UNKNOWN)" result += addIntToString(speed, kFanStr); result += kSpaceLBraceStr; - if (speed == high) result += kHighStr; - else if (speed == low) result += kLowStr; - else if (speed == automatic) result += kAutoStr; - else if (speed == quiet) result += kQuietStr; - else if (speed == medium) result += kMediumStr; - else if (speed == maximum) result += kMaximumStr; + if (speed == high) result += kHighStr; + else if (speed == low) result += kLowStr; + else if (speed == automatic) result += kAutoStr; + else if (speed == quiet) result += kQuietStr; + else if (speed == medium) result += kMediumStr; + else if (speed == maximum) result += kMaximumStr; + else if (speed == medium_high) result += kMedHighStr; else result += kUnknownStr; return result + ')'; @@ -950,6 +978,106 @@ namespace irutils { return result + ')'; } + /// @brief Create a String of human output for the given timer setting. + /// e.g. "Timer Mode: 2 (Schedule 1)" + /// @param[in] timerMode The numeric value of the timer mode to display. + /// @param[in] noTimer The numeric value for no timer (off) + /// @param[in] delayTimer The numeric value for delay (sleep) timer + /// @param[in] schedule1 The numeric value for schedule timer #1 + /// @param[in] schedule2 The numeric value for schedule timer #2 + /// @param[in] schedule3 The numeric value for schedule timer #3 + /// @param[in] precomma Should the output string start with ", " or not? + /// @return String representation + String addTimerModeToString(const uint8_t timerMode, const uint8_t noTimer, + const uint8_t delayTimer, const uint8_t schedule1, + const uint8_t schedule2, const uint8_t schedule3, + const bool precomma) { + String result = ""; + result.reserve(28); // ", Timer Mode: 2 (Schedule 1)" + result += addIntToString(timerMode, kTimerModeStr, precomma); + result += kSpaceLBraceStr; + if (timerMode == noTimer) { + result += kOffStr; + } else if (timerMode == delayTimer) { + result += kSleepTimerStr; + } else if (timerMode == schedule1) { + result += kScheduleStr; + result += '1'; + } else if (timerMode == schedule2) { + result += kScheduleStr; + result += '2'; + } else if (timerMode == schedule3) { + result += kScheduleStr; + result += '3'; + } else { + result += kUnknownStr; + } + return result + ')'; + } + + /// @brief Create a String of human output for the given channel + /// e.g. "[CH#0]" + /// @param channel The numeric value of the channel to display. + /// @return String representation + String channelToString(const uint8_t channel) { + String result = ""; + result.reserve(6); // "[CH#4]" + result += "["; + result += kChStr; + result += uint64ToString(channel); + result += "]"; + return result; + } + + /// @brief Create a String of human output for the given command type + /// e.g. "IFeel Report" + /// @param irCommandType The numeric value of the command type to display. + /// @param acControlCmd The numeric value of the "control" (default) command + /// @param iFeelReportCmd The numeric value of the sensor temperature command + /// @param timerCmd The numeric value of the timer config IR command + /// @param configCmd The numeric value of the config param set IR command + /// @return String representation + String irCommandTypeToString(uint8_t irCommandType, uint8_t acControlCmd, + uint8_t iFeelReportCmd, uint8_t timerCmd, + uint8_t configCmd) { + String result = ""; + result.reserve(12); // "IFeel Report" + if (irCommandType == acControlCmd) { + result += kCommandStr; + } else if (irCommandType == iFeelReportCmd) { + result += kIFeelReportStr; + } else if (irCommandType == timerCmd) { + result += kTimerStr; + } else if (irCommandType == configCmd) { + result += kConfigCommandStr; + } else { + result += kUnknownStr; + } + return result; + } + + /// @brief Create a String of the 3-letter day of the week bitmap + // e.g. 0b0000101 is "Sun | Tue" + /// @param[in] daysBitmap The bitmap representing days of week to represent + /// e.g bit[0]=Sunday, bit[1]=Monday, ... + /// @param[in] offset Days to offset by. + /// e.g. For different day starting the week. + /// @return String representation. + String daysBitmaskToString(uint8_t daysBitmap, uint8_t offset) { + String result = ""; + result.reserve(27); // Sun|Mon|Tue|Wed|Thu|Fri|Sat + + for (uint8_t i = 0; i < 7; ++i) { + if (((daysBitmap >> i) & 0b1) == 0b1) { + if (result.length() > 0) { + result += "|"; + } + result += irutils::dayToString(i, offset); + } + } + return result; + } + /// Escape any special HTML (unsafe) characters in a string. e.g. anti-XSS. /// @param[in] unescaped A String containing text to make HTML safe. /// @return A string that is HTML safe. diff --git a/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/src/IRutils.h b/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/src/IRutils.h index a5dcde043..8c94df228 100644 --- a/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/src/IRutils.h +++ b/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/src/IRutils.h @@ -60,16 +60,19 @@ namespace irutils { String addLabeledString(const String value, const String label, const bool precomma = true); String addTempToString(const uint16_t degrees, const bool celsius = true, - const bool precomma = true); + const bool precomma = true, + const bool isSensorTemp = false); String addTempFloatToString(const float degrees, const bool celsius = true, - const bool precomma = true); + const bool precomma = true, + const bool isSensorTemp = false); String addModeToString(const uint8_t mode, const uint8_t automatic, const uint8_t cool, const uint8_t heat, const uint8_t dry, const uint8_t fan); String addFanToString(const uint8_t speed, const uint8_t high, const uint8_t low, const uint8_t automatic, const uint8_t quiet, const uint8_t medium, - const uint8_t maximum = 0xFF); + const uint8_t maximum = 0xFF, + const uint8_t medium_high = 0xFF); String addSwingHToString(const uint8_t position, const uint8_t automatic, const uint8_t maxleft, const uint8_t left, const uint8_t middle, @@ -87,6 +90,19 @@ namespace irutils { const uint8_t breeze, const uint8_t circulate); String addDayToString(const uint8_t day_of_week, const int8_t offset = 0, const bool precomma = true); + String addTimerModeToString(const uint8_t timerType, const uint8_t noTimer, + const uint8_t delayTimer, + const uint8_t schedule1 = 0xFF, + const uint8_t schedule2 = 0xFF, + const uint8_t schedule3 = 0xFF, + const bool precomma = true); + String irCommandTypeToString(uint8_t commandType, uint8_t acControlCmd, + uint8_t iFeelReportCmd = 0xFF, + uint8_t timerCmd = 0xFF, + uint8_t configCmd = 0xFF); + String dayToString(const uint8_t day_of_week, const int8_t offset = 0); + String daysBitmaskToString(uint8_t daysBitmap, uint8_t offset = 0); + String channelToString(const uint8_t channel); String htmlEscape(const String unescaped); String msToString(uint32_t const msecs); String minsToString(const uint16_t mins); diff --git a/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/src/ir_Argo.cpp b/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/src/ir_Argo.cpp index 680178ceb..2f5ce4ea6 100644 --- a/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/src/ir_Argo.cpp +++ b/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/src/ir_Argo.cpp @@ -1,11 +1,16 @@ // Copyright 2017 Schmolders // Copyright 2019 crankyoldgit +// Copyright 2022 Mateusz Bronk (mbronk) /// @file /// @brief Argo A/C protocol. -/// Controls an Argo Ulisse 13 DCI A/C + +/// @see https://github.com/crankyoldgit/IRremoteESP8266/issues/1859 +/// @see https://github.com/crankyoldgit/IRremoteESP8266/issues/1912 + #include "ir_Argo.h" #include +#include #include #ifndef UNIT_TEST #include @@ -22,211 +27,890 @@ const uint16_t kArgoBitMark = 400; const uint16_t kArgoOneSpace = 2200; const uint16_t kArgoZeroSpace = 900; const uint32_t kArgoGap = kDefaultMessageGap; // Made up value. Complete guess. +const uint8_t kArgoSensorCheck = 52; // Part of the sensor message check calc. +const uint8_t kArgoSensorFixed = 0b011; +const uint8_t kArgoWrem3Preamble = 0b1011; +const uint8_t kArgoWrem3Postfix_Timer = 0b1; +const uint8_t kArgoWrem3Postfix_ACControl = 0b110000; using irutils::addBoolToString; using irutils::addIntToString; using irutils::addLabeledString; using irutils::addModeToString; using irutils::addTempToString; +using irutils::addFanToString; +using irutils::addSwingVToString; +using irutils::minsToString; +using irutils::addDayToString; +using irutils::addModelToString; +using irutils::daysBitmaskToString; +using irutils::addTimerModeToString; #if SEND_ARGO /// Send a Argo A/C formatted message. -/// Status: BETA / Probably works. +/// Status: [WREM-2] BETA / Probably works. +/// [WREM-3] Confirmed working w/ Argo 13 ECO (WREM-3) +/// @note The "no footer" part needs re-checking for validity but retained for +/// backwards compatibility. +/// Consider using @c sendFooter=true code for WREM-2 as well /// @param[in] data The message to be sent. /// @param[in] nbytes The number of bytes of message to be sent. /// @param[in] repeat The number of times the command is to be repeated. +/// @param[in] sendFooter Whether to send footer and add a final gap. +/// *REQUIRED* for WREM-3, UNKNOWN for WREM-2 (used to be +/// disabled in previous impl., hence retained) +/// @note Consider removing this param (default to true) if WREM-2 works w/ it void IRsend::sendArgo(const unsigned char data[], const uint16_t nbytes, - const uint16_t repeat) { - // Check if we have enough bytes to send a proper message. - if (nbytes < kArgoStateLength) return; - // TODO(kaschmo): validate + const uint16_t repeat, bool sendFooter /*= false*/) { + if (nbytes < std::min({kArgo3AcControlStateLength, + kArgo3ConfigStateLength, + kArgo3iFeelReportStateLength, + kArgo3TimerStateLength, + kArgoStateLength, + kArgoShortStateLength})) { + return; // Not enough bytes to send a proper message. + } + + const uint16_t _footermark = (sendFooter)? kArgoBitMark : 0; + const uint32_t _gap = (sendFooter)? kArgoGap : 0; + sendGeneric(kArgoHdrMark, kArgoHdrSpace, kArgoBitMark, kArgoOneSpace, - kArgoBitMark, kArgoZeroSpace, 0, 0, // No Footer. - data, nbytes, 38, false, repeat, kDutyDefault); + kArgoBitMark, kArgoZeroSpace, + _footermark, _gap, + data, nbytes, kArgoFrequency, false, repeat, kDutyDefault); +} + + +/// Send a Argo A/C formatted message. +/// Status: Confirmed working w/ Argo 13 ECO (WREM-3) +/// @param[in] data The message to be sent. +/// @param[in] nbytes The number of bytes of message to be sent. +/// @param[in] repeat The number of times the command is to be repeated. +void IRsend::sendArgoWREM3(const unsigned char data[], const uint16_t nbytes, + const uint16_t repeat) { + sendArgo(data, nbytes, repeat, true); } #endif // SEND_ARGO + +/// Class constructor +/// @param[in] pin GPIO to be used when sending. +/// @param[in] inverted Is the output signal to be inverted? +/// @param[in] use_modulation Is frequency modulation to be used? +template +IRArgoACBase::IRArgoACBase(const uint16_t pin, const bool inverted, + const bool use_modulation) + : _irsend(pin, inverted, use_modulation) { stateReset(); } + + /// Class constructor /// @param[in] pin GPIO to be used when sending. /// @param[in] inverted Is the output signal to be inverted? /// @param[in] use_modulation Is frequency modulation to be used? IRArgoAC::IRArgoAC(const uint16_t pin, const bool inverted, const bool use_modulation) - : _irsend(pin, inverted, use_modulation) { stateReset(); } + : IRArgoACBase(pin, inverted, use_modulation) { } + + +/// Class constructor +/// @param[in] pin GPIO to be used when sending. +/// @param[in] inverted Is the output signal to be inverted? +/// @param[in] use_modulation Is frequency modulation to be used? +IRArgoAC_WREM3::IRArgoAC_WREM3(const uint16_t pin, const bool inverted, + const bool use_modulation) + : IRArgoACBase(pin, inverted, use_modulation) {} /// Set up hardware to be able to send a message. -void IRArgoAC::begin(void) { _irsend.begin(); } +template +void IRArgoACBase::begin(void) { _irsend.begin(); } -#if SEND_ARGO -/// Send the current internal state as an IR message. -/// @param[in] repeat Nr. of times the message will be repeated. -void IRArgoAC::send(const uint16_t repeat) { - _irsend.sendArgo(getRaw(), kArgoStateLength, repeat); + +/// @cond +/// @brief Get byte length of raw WREM-2 message based on IR cmd type +/// @note This is a full specialization for @c ArgoProtocol type and while +/// it semantically belongs to @c IrArgoAC class impl., it has *not* +/// been pushed there, to avoid having to use a virtual function +/// @param type The type of IR command +/// @note Not all types are supported. AC_CONTROL and TIMER are the same cmd +/// @return Byte length of state command +/// @relates IRArgoACBase\ +template<> +uint16_t IRArgoACBase::getStateLengthForIrMsgType( + argoIrMessageType_t type) { + switch (type) { + case argoIrMessageType_t::AC_CONTROL: + case argoIrMessageType_t::TIMER_COMMAND: + return kArgoStateLength; + case argoIrMessageType_t::IFEEL_TEMP_REPORT: + return kArgoShortStateLength; + case argoIrMessageType_t::CONFIG_PARAM_SET: + default: + return 0; // Not supported by WREM-2 + } +} +/// @endcond + +/// @brief Get byte length of raw WREM-3 message based on IR cmd type +/// @note This is a full specialization for @c ArgoProtocolWREM3 type and while +/// it semantically belongs to @c IrArgoAC_WREM3 class impl., it has *not* +/// been pushed there, to avoid having to use a virtual function +/// @param type The type of IR command +/// @return Byte length of state command +/// @relates IRArgoACBase\ +template<> +uint16_t IRArgoACBase::getStateLengthForIrMsgType( + argoIrMessageType_t type) { + switch (type) { + case argoIrMessageType_t::AC_CONTROL: + return kArgo3AcControlStateLength; + case argoIrMessageType_t::IFEEL_TEMP_REPORT: + return kArgo3iFeelReportStateLength; + case argoIrMessageType_t::TIMER_COMMAND: + return kArgo3TimerStateLength; + case argoIrMessageType_t::CONFIG_PARAM_SET: + return kArgo3ConfigStateLength; + default: + return 0; + } } -/// Send current room temperature for the iFeel feature as a silent IR -/// message (no acknowledgement from the device). -/// @param[in] temp The temperature in degrees celsius. -/// @param[in] repeat Nr. of times the message will be repeated. -void IRArgoAC::sendSensorTemp(const uint8_t temp, const uint16_t repeat) { - uint8_t tempc = temp - kArgoTempDelta; - uint8_t check = 52 + tempc; - uint8_t end = 0b011; - - ArgoProtocol data; - data.raw[0] = 0b10101100; - data.raw[1] = 0b11110101; - data.raw[2] = (tempc << 3) | (check >> 5); - data.raw[3] = (check << 3) | end; - for (uint8_t i = 4; i < kArgoStateLength; i++) data.raw[i] = 0x0; - uint8_t sum = IRArgoAC::calcChecksum(data.raw, kArgoStateLength); - data.raw[10] = 0b00000010; - data.Sum = sum; - - _irsend.sendArgo(data.raw, kArgoStateLength, repeat); +/// @cond +/// @brief Get message type from raw WREM-2 data +/// 1st param ignored: WREM-2 does not carry type in payload, allegedly +/// @param length Message length: used for *heuristic* detection of message type +/// @return IR message type +/// @note This is a full specialization for @c ArgoProtocol type and while +/// it semantically belongs to @c IrArgoAC class impl., it has *not* +/// been pushed there, to avoid having to use a virtual function +/// @relates IRArgoACBase\ +template<> +argoIrMessageType_t IRArgoACBase::getMessageType( + const uint8_t[], const uint16_t length) { + if (length == kArgoShortStateLength) { + return argoIrMessageType_t::IFEEL_TEMP_REPORT; + } + return argoIrMessageType_t::AC_CONTROL; } -#endif // SEND_ARGO +/// @endcond -/// Verify the checksum is valid for a given state. -/// @param[in] state The array to verify the checksum of. + +/// @brief Get message type from raw WREM-3 data +/// @param state The raw IR data +/// @param length Length of @c state (in byte) +/// @return IR message type +/// @note This is a full specialization for @c ArgoProtocolWREM3 type and while +/// it semantically belongs to @c IrArgoAC_WREM3 class impl., it has *not* +/// been pushed there, to avoid having to use a virtual function +/// @relates IRArgoACBase\ +template<> +argoIrMessageType_t IRArgoACBase::getMessageType( + const uint8_t state[], const uint16_t length) { + if (length < 1) { + return static_cast(-1); + } + return static_cast(state[0] >> 6); +} + +/// @brief Get message type from raw WREM-3 data +/// @param raw Raw data +/// @return IR message type +argoIrMessageType_t IRArgoAC_WREM3::getMessageType( + const ArgoProtocolWREM3& raw) { + return static_cast(raw.IrCommandType); +} + + +/// @brief Get actual raw state byte length for the current state +/// _param 1st param ignored: WREM-2 does not caryy type in payload, allegedly +/// @param messageType Type of message the state is carrying +/// @return Actual length of state (in bytes) +/// @note This is a full specialization for @c ArgoProtocol type and while +/// it semantically belongs to @c IrArgoAC class impl., it has *not* +/// been pushed there, to avoid having to use a virtual function +/// @relates IRArgoACBase\ +template<> +uint16_t IRArgoACBase::getRawByteLength(const ArgoProtocol&, + argoIrMessageType_t messageType) { + if (messageType == argoIrMessageType_t::IFEEL_TEMP_REPORT) { + return kArgoShortStateLength; + } + return kArgoStateLength; +} + + +/// @brief Get actual raw state byte length for the current state +/// @param raw The raw state +/// _param 2nd param ignored (1st byte of @c raw is sufficient to get len) +/// @return Actual length of state (in bytes) +/// @note This is a full specialization for @c ArgoProtocolWREM3 type and while +/// it semantically belongs to @c IrArgoAC_WREM3 class impl., it has *not* +/// been pushed there, to avoid having to use a virtual function +/// @relates IRArgoACBase\ +template<> +uint16_t IRArgoACBase::getRawByteLength( + const ArgoProtocolWREM3& raw, argoIrMessageType_t) { + return IRArgoAC_WREM3::getStateLengthForIrMsgType( + IRArgoAC_WREM3::getMessageType(raw)); +} + + +/// @brief Get actual raw state byte length for the current state +/// @return Actual length of state (in bytes) +template +uint16_t IRArgoACBase::getRawByteLength() const { + return getRawByteLength(_, _messageType); +} + +/// @cond +/// Calculate the checksum for a given state (WREM-2). +/// @note This is a full specialization for @c ArgoProtocol type and while +/// it semantically belongs to @c IrArgoAC class impl., it has *not* +/// been pushed there, to avoid having to use a virtual function +/// @warning This does NOT calculate 'short' (iFeel) message checksums +/// @param[in] state The array to calculate the checksum for. /// @param[in] length The size of the state. -/// @return A boolean indicating if it's checksum is valid. -uint8_t IRArgoAC::calcChecksum(const uint8_t state[], const uint16_t length) { +/// @return The 8-bit calculated result. +/// @relates IRArgoACBase\ +template<> +uint8_t IRArgoACBase::calcChecksum(const uint8_t state[], + const uint16_t length) { // Corresponds to byte 11 being constant 0b01 // Only add up bytes to 9. byte 10 is 0b01 constant anyway. // Assume that argo array is MSB first (left) return sumBytes(state, length - 2, 2); } +/// @endcond + + +/// Calculate the checksum for a given state (WREM-3). +/// @note This is a full specialization for @c ArgoProtocolWREM3 type and while +/// it semantically belongs to @c IrArgoAC_WREM3 class impl., it has *not* +/// been pushed there, to avoid having to use a virtual function +/// @param[in] state The array to calculate the checksum for. +/// @param[in] length The size of the state. +/// @return The 8-bit calculated result. +/// @relates IRArgoACBase\ +template<> +uint8_t IRArgoACBase::calcChecksum(const uint8_t state[], + const uint16_t length) { + if (length < 1) { + return -1; // Nothing to compute on + } + + uint16_t payloadSizeBits = (length - 1) * 8; // Last byte carries checksum + + argoIrMessageType_t msgType = getMessageType(state, length); + if (msgType == argoIrMessageType_t::IFEEL_TEMP_REPORT) { + payloadSizeBits += 5; // For WREM3::iFeel the checksum is 3-bit + } else if (msgType == argoIrMessageType_t::TIMER_COMMAND) { + payloadSizeBits += 3; // For WREM3::Timer the checksum is 5-bit + } // Otherwise: full 8-bit checksum + + uint8_t checksum = sumBytes(state, payloadSizeBits / 8, 0); + + // Add stray bits from last byte to the checksum (if any) + const uint8_t maskPayload = 0xFF >> (8 - (payloadSizeBits % 8)); + checksum += (state[length-1] & maskPayload); + + const uint8_t maskChecksum = 0xFF >> (payloadSizeBits % 8); + return checksum & maskChecksum; +} + + +/// Update the checksum for a given state (WREM2). +/// @note This is a full specialization for @c ArgoProtocol type and while +/// it semantically belongs to @c IrArgoAC class impl., it has *not* +/// been pushed there, to avoid having to use a virtual function +/// @warning This impl does not support short message format (iFeel) +/// @param[in,out] state Pointer to a binary representation of the A/C state. +/// @relates IRArgoACBase\ +template<> +void IRArgoACBase::_checksum(ArgoProtocol *state) { + uint8_t sum = calcChecksum(state->raw, kArgoStateLength); + // Append sum to end of array + // Set const part of checksum bit 10 + state->Post = kArgoPost; + state->Sum = sum; +} + + +/// @brief Update the checksum for a given state (WREM3). +/// @note This is a full specialization for @c ArgoProtocolWREM3 type and while +/// it semantically belongs to @c IrArgoAC_WREM3 class impl., it has *not* +/// been pushed there, to avoid having to use a virtual function +/// @param[in,out] state Pointer to a binary representation of the A/C state. +/// @relates IRArgoACBase\ +template<> +void IRArgoACBase::_checksum(ArgoProtocolWREM3 *state) { + argoIrMessageType_t msgType = IRArgoAC_WREM3::getMessageType(*state); + + uint8_t sum = calcChecksum(state->raw, getRawByteLength(*state)); + switch (msgType) { + case argoIrMessageType_t::IFEEL_TEMP_REPORT: + state->CheckHi = sum; + break; + case argoIrMessageType_t::TIMER_COMMAND: + state->timer.Checksum = sum; + break; + case argoIrMessageType_t::CONFIG_PARAM_SET: + state->config.Checksum = sum; + break; + case argoIrMessageType_t::AC_CONTROL: + default: + state->Sum = sum; + break; + } +} + + +/// Update the checksum for the internal state. +template +void IRArgoACBase::checksum(void) { _checksum(&_); } + + +/// Reset the given state to a known good state. +/// @note This is a full specialization for @c ArgoProtocol type and while +/// it semantically belongs to @c IrArgoAC class impl., it has *not* +/// been pushed there, to avoid having to use a virtual function +/// @param[in,out] state Pointer to a binary representation of the A/C state. +/// _param 2nd param unused (always resets to AC_CONTROL state) +/// @relates IRArgoACBase\ +template<> +void IRArgoACBase::_stateReset(ArgoProtocol *state, + argoIrMessageType_t) { + for (uint8_t i = 2; i < kArgoStateLength; i++) state->raw[i] = 0x0; + state->Pre1 = kArgoPreamble1; // LSB first (as sent) 0b00110101; + state->Pre2 = kArgoPreamble2; // LSB first: 0b10101111; + state->Post = kArgoPost; +} + + +/// Reset the given state to a known good state +/// @note This is a full specialization for @c ArgoProtocolWREM3 type and while +/// it semantically belongs to @c IrArgoAC_WREM3 class impl., it has *not* +/// been pushed there, to avoid having to use a virtual function +/// @param[in,out] state Pointer to a binary representation of the A/C state. +/// @param messageType Type of message to reset the state for +/// @relates IRArgoACBase\ +template<> +void IRArgoACBase::_stateReset(ArgoProtocolWREM3 *state, + argoIrMessageType_t messageType) { + for (uint8_t i = 1; i < sizeof(state->raw) / sizeof(state->raw[0]); i++) { + state->raw[i] = 0x0; + } + state->Pre1 = kArgoWrem3Preamble; // LSB first (as sent) 0b00110101; + state->IrChannel = 0; + state->IrCommandType = static_cast(messageType); + + if (messageType == argoIrMessageType_t::TIMER_COMMAND) { + state->timer.Post1 = kArgoWrem3Postfix_Timer; // 0b1 + } else if (messageType == argoIrMessageType_t::AC_CONTROL) { + state->Post1 = kArgoWrem3Postfix_ACControl; // 0b110000 + } +} + + +/// @brief Reset the internals of the object to a known good state. +/// @param messageType Type of message to reset the state for +template +void IRArgoACBase::stateReset(argoIrMessageType_t messageType) { + _stateReset(&_, messageType); + if (messageType == argoIrMessageType_t::AC_CONTROL) { + off(); + setTemp(20); + setSensorTemp(25); + setMode(argoMode_t::AUTO); + setFan(argoFan_t::FAN_AUTO); + } + _messageType = messageType; + _length = getStateLengthForIrMsgType(_messageType); +} + + +/// @brief Retrieve the checksum value from transmitted state +/// @note This is a full specialization for @c ArgoProtocol type and while +/// it semantically belongs to @c IrArgoAC class impl., it has *not* +/// been pushed there, to avoid having to use a virtual function +/// @param[in] state Raw state +/// @param length Length of @c state in bytes +/// @return Checksum value (8-bit) +/// @relates IRArgoACBase\ +template<> +uint8_t IRArgoACBase::getChecksum(const uint8_t state[], + const uint16_t length) { + if (length < 1) { + return -1; + } + return (state[length - 2] >> 2) + (state[length - 1] << 6); +} + +/// @cond +/// @brief Retrieve the checksum value from transmitted state +/// @note This is a full specialization for @c ArgoProtocolWREM3 type and while +/// it semantically belongs to @c IrArgoAC_WREM3 class impl., it has *not* +/// been pushed there, to avoid having to use a virtual function +/// @param[in] state Raw state +/// @param length Length of @c state in bytes +/// @return Checksum value (up to 8-bit) +template<> +uint8_t IRArgoACBase::getChecksum(const uint8_t state[], + const uint16_t length) { + if (length < 1) { + return -1; + } + argoIrMessageType_t msgType = getMessageType(state, length); + if (msgType == argoIrMessageType_t::IFEEL_TEMP_REPORT) { + return (state[length - 1] & 0b11100000) >> 5; + } + if (msgType == argoIrMessageType_t::TIMER_COMMAND) { + return state[length - 1] >> 3; + } + return (state[length - 1]); +} +/// @endcond + /// Verify the checksum is valid for a given state. /// @param[in] state The array to verify the checksum of. /// @param[in] length The size of the state. /// @return A boolean indicating if it's checksum is valid. -bool IRArgoAC::validChecksum(const uint8_t state[], const uint16_t length) { - return ((state[length - 2] >> 2) + (state[length - 1] << 6)) == - IRArgoAC::calcChecksum(state, length); +template +bool IRArgoACBase::validChecksum(const uint8_t state[], + const uint16_t length) { + return (getChecksum(state, length) == calcChecksum(state, length)); } -/// Update the checksum for the internal state. -void IRArgoAC::checksum(void) { - uint8_t sum = IRArgoAC::calcChecksum(_.raw, kArgoStateLength); - // Append sum to end of array - // Set const part of checksum bit 10 - _.raw[10] = 0b00000010; - _.Sum = sum; + +#if SEND_ARGO +/// Send the current internal state as an IR message. +/// @param[in] repeat Nr. of times the message will be repeated. +template +void IRArgoACBase::send(const uint16_t repeat) { + _irsend.sendArgo(getRaw(), getRawByteLength(), repeat); } -/// Reset the internals of the object to a known good state. -void IRArgoAC::stateReset(void) { - for (uint8_t i = 0; i < kArgoStateLength; i++) _.raw[i] = 0x0; - - // Argo Message. Store MSB left. - // Default message: - _.raw[0] = 0b10101100; // LSB first (as sent) 0b00110101; //const preamble - _.raw[1] = 0b11110101; // LSB first: 0b10101111; //const preamble - // Keep payload 2-9 at zero - _.raw[10] = 0b00000010; // Const 01 - _.Sum = 0; - - off(); - setTemp(20); - setRoomTemp(25); - setMode(kArgoAuto); - setFan(kArgoFanAuto); +/// @cond +/// Send the current internal state as an IR message. +/// @note This is a full specialization for @c ArgoProtocolWREM3 type and while +/// it semantically belongs to @c IrArgoAC_WREM3 class impl., it has *not* +/// been pushed there, to avoid having to use a virtual function +/// @param[in] repeat Nr. of times the message will be repeated. +/// @relates IRArgoACBase\ +template<> +void IRArgoACBase::send(const uint16_t repeat) { + _irsend.sendArgoWREM3(getRaw(), getRawByteLength(), repeat); } +/// @endcond + + +/// Send current room temperature for the iFeel feature as a silent IR +/// message (no acknowledgement from the device) (WREM2) +/// @param[in] degrees The temperature in degrees celsius. +/// @param[in] repeat Nr. of times the message will be repeated. +void IRArgoAC::sendSensorTemp(const uint8_t degrees, const uint16_t repeat) { + const uint8_t temp = std::max(std::min(degrees, kArgoMaxRoomTemp), + kArgoTempDelta) - kArgoTempDelta; + const uint8_t check = kArgoSensorCheck + temp; + + ArgoProtocol data; + _stateReset(&data, argoIrMessageType_t::IFEEL_TEMP_REPORT); + data.SensorT = temp; + data.CheckHi = check >> 5; + data.CheckLo = check; + data.Fixed = kArgoSensorFixed; + _checksum(&data); + uint16_t msgLen = getRawByteLength(data, + argoIrMessageType_t::IFEEL_TEMP_REPORT); + + _irsend.sendArgo(data.raw, msgLen, repeat); +} + +/// Send current room temperature for the iFeel feature as a silent IR +/// message (no acknowledgement from the device) (WREM3) +/// @param[in] degrees The temperature in degrees celsius. +/// @param[in] repeat Nr. of times the message will be repeated. +void IRArgoAC_WREM3::sendSensorTemp(const uint8_t degrees, + const uint16_t repeat) { + const uint8_t temp = std::max(std::min(degrees, kArgoMaxRoomTemp), + kArgoTempDelta) - kArgoTempDelta; + ArgoProtocolWREM3 data = {}; + _stateReset(&data, argoIrMessageType_t::IFEEL_TEMP_REPORT); + data.SensorT = temp; + _checksum(&data); + uint16_t msgLen = getRawByteLength(data, + argoIrMessageType_t::IFEEL_TEMP_REPORT); + _irsend.sendArgoWREM3(data.raw, msgLen, repeat); +} +#endif + /// Get the raw state of the object, suitable to be sent with the appropriate /// IRsend object method. /// @return A PTR to the internal state. -uint8_t* IRArgoAC::getRaw(void) { +template +uint8_t* IRArgoACBase::getRaw(void) { checksum(); // Ensure correct bit array before returning return _.raw; } + /// Set the raw state of the object. /// @param[in] state The raw state from the native IR message. -void IRArgoAC::setRaw(const uint8_t state[]) { - std::memcpy(_.raw, state, kArgoStateLength); +/// @param[in] length The length of raw state in bytes. +template +void IRArgoACBase::setRaw(const uint8_t state[], const uint16_t length) { + std::memcpy(_.raw, state, length); + _messageType = getMessageType(state, length); + _length = length; } /// Set the internal state to have the power on. -void IRArgoAC::on(void) { setPower(true); } +template +void IRArgoACBase::on(void) { setPower(true); } /// Set the internal state to have the power off. -void IRArgoAC::off(void) { setPower(false); } +template +void IRArgoACBase::off(void) { setPower(false); } +/// @cond /// Set the internal state to have the desired power. /// @param[in] on The desired power state. -void IRArgoAC::setPower(const bool on) { +/// @note This is a full specialization for @c ArgoProtocol type and while +/// it semantically belongs to @c IrArgoAC class impl., it has *not* +/// been pushed there, to avoid having to use a virtual function +/// @relates IRArgoACBase\ +template<> +void IRArgoACBase::setPower(const bool on) { _.Power = on; } +/// @endcond + +/// @brief Set the internal state to have the desired power. +/// @note This is a full specialization for @c ArgoProtocolWREM3 type and while +/// it semantically belongs to @c IrArgoAC_WREM3 class impl., it has *not* +/// been pushed there, to avoid having to use a virtual function +/// @param[in] on The desired power state. +/// @relates IRArgoACBase\ +template<> +void IRArgoACBase::setPower(const bool on) { + if (_messageType == argoIrMessageType_t::TIMER_COMMAND) { + _.timer.IsOn = on; + } else { + _.Power = on; + } +} /// Get the power setting from the internal state. +/// @note This is a full specialization for @c ArgoProtocol type and while +/// it semantically belongs to @c IrArgoAC class impl., it has *not* +/// been pushed there, to avoid having to use a virtual function /// @return A boolean indicating the power setting. -bool IRArgoAC::getPower(void) const { return _.Power; } +/// @relates IRArgoACBase\ +template<> +bool IRArgoACBase::getPower(void) const { return _.Power; } + +/// Get the power setting from the internal state. +/// @note This is a full specialization for @c ArgoProtocolWREM3 type and while +/// it semantically belongs to @c IrArgoAC_WREM3 class impl., it has *not* +/// been pushed there, to avoid having to use a virtual function +/// @return A boolean indicating the power setting. +/// @relates IRArgoACBase\ +template<> +bool IRArgoACBase::getPower(void) const { + if (_messageType == argoIrMessageType_t::TIMER_COMMAND) { + return _.timer.IsOn; + } + return _.Power; +} /// Control the current Max setting. (i.e. Turbo) /// @param[in] on The desired setting. -void IRArgoAC::setMax(const bool on) { +template +void IRArgoACBase::setMax(const bool on) { _.Max = on; } /// Is the Max (i.e. Turbo) setting on? /// @return The current value. -bool IRArgoAC::getMax(void) const { return _.Max; } +template +bool IRArgoACBase::getMax(void) const { return _.Max; } /// Set the temperature. /// @param[in] degrees The temperature in degrees celsius. /// @note Sending 0 equals +4 -void IRArgoAC::setTemp(const uint8_t degrees) { +template +void IRArgoACBase::setTemp(const uint8_t degrees) { uint8_t temp = std::max(kArgoMinTemp, degrees); // delta 4 degrees. "If I want 12 degrees, I need to send 8" temp = std::min(kArgoMaxTemp, temp) - kArgoTempDelta; // mask out bits - // argo[13] & 0x00000100; // mask out ON/OFF Bit _.Temp = temp; } /// Get the current temperature setting. /// @return The current setting for temp. in degrees celsius. -uint8_t IRArgoAC::getTemp(void) const { +template +uint8_t IRArgoACBase::getTemp(void) const { return _.Temp + kArgoTempDelta; } + +/// @brief Get the current fan mode setting as a strongly typed value (WREM2). +/// @note This is a full specialization for @c ArgoProtocol type and while +/// it semantically belongs to @c IrArgoAC class impl., it has *not* +/// been pushed there, to avoid having to use a virtual function +/// @return The current fan mode. +/// @relates IRArgoACBase\ +template<> +argoFan_t IRArgoACBase::getFanEx(void) const { + switch (_.Fan) { + case kArgoFan3: + return argoFan_t::FAN_HIGHEST; + case kArgoFan2: + return argoFan_t::FAN_MEDIUM; + case kArgoFan1: + return argoFan_t::FAN_LOWEST; + case kArgoFanAuto: + return argoFan_t::FAN_AUTO; + default: + return static_cast(_.Fan); + } +} + +/// @brief Get the current fan mode setting as a strongly typed value (WREM3). +/// @note This is a full specialization for @c ArgoProtocolWREM3 type and while +/// it semantically belongs to @c IrArgoAC_WREM3 class impl., it has *not* +/// been pushed there, to avoid having to use a virtual function +/// @return The current fan mode. +/// @relates IRArgoACBase\ +template<> +argoFan_t IRArgoACBase::getFanEx(void) const { + return static_cast(_.Fan); +} + +/// @cond +/// Set the desired fan mode (WREM2). +/// @note This is a full specialization for @c ArgoProtocol type and while +/// it semantically belongs to @c IrArgoAC class impl., it has *not* +/// been pushed there, to avoid having to use a virtual function +/// @param[in] fan The desired fan speed. +/// @note Only a subset of fan speeds are supported (1|2|3|Auto) +/// @relates IRArgoACBase\ +template<> +void IRArgoACBase::setFan(argoFan_t fan) { + switch (fan) { + case argoFan_t::FAN_AUTO: + _.Fan = kArgoFanAuto; + break; + case argoFan_t::FAN_HIGHEST: + case argoFan_t::FAN_HIGH: + _.Fan = kArgoFan3; + break; + case argoFan_t::FAN_MEDIUM: + case argoFan_t::FAN_LOW: + _.Fan = kArgoFan2; + break; + case argoFan_t::FAN_LOWER: + case argoFan_t::FAN_LOWEST: + _.Fan = kArgoFan1; + break; + default: + uint8_t raw_value = static_cast(fan); // 2-bit value, per def. + if ((raw_value & 0b11) == raw_value) { + // Outside of known value range, but matches field length + // Let's assume the caller knows what they're doing and pass it through + _.Fan = raw_value; + } else { + _.Fan = kArgoFanAuto; + } + break; + } +} +/// @endcond + +/// Set the desired fan mode (WREM3). +/// @note This is a full specialization for @c ArgoProtocolWREM3 type and while +/// it semantically belongs to @c IrArgoAC_WREM3 class impl., it has *not* +/// been pushed there, to avoid having to use a virtual function +/// @param[in] fan The desired fan speed. +/// @relates IRArgoACBase\ +template<> +void IRArgoACBase::setFan(argoFan_t fan) { + switch (fan) { + case argoFan_t::FAN_AUTO: + case argoFan_t::FAN_HIGHEST: + case argoFan_t::FAN_HIGH: + case argoFan_t::FAN_MEDIUM: + case argoFan_t::FAN_LOW: + case argoFan_t::FAN_LOWER: + case argoFan_t::FAN_LOWEST: + _.Fan = static_cast(fan); + break; + default: + _.Fan = static_cast(argoFan_t::FAN_AUTO); + break; + } +} + /// Set the speed of the fan. +/// @deprecated /// @param[in] fan The desired setting. void IRArgoAC::setFan(const uint8_t fan) { _.Fan = std::min(fan, kArgoFan3); } /// Get the current fan speed setting. +/// @deprecated /// @return The current fan speed. uint8_t IRArgoAC::getFan(void) const { return _.Fan; } -/// Set the flap position. i.e. Swing. +/// @brief Get Flap (VSwing) value as a strongly-typed value +/// @note This @c getFlapEx() method has been introduced to be able to retain +/// old implementation of @c getFlap() for @c IRArgoAc which used uint8_t +/// @return Flap setting +template +argoFlap_t IRArgoACBase::getFlapEx(void) const { + return static_cast(_.Flap); +} + +/// Set the desired flap mode +/// @param[in] flap The desired flap mode. +template +void IRArgoACBase::setFlap(argoFlap_t flap) { + uint8_t raw_value = static_cast(flap); + if ((raw_value & 0b111) == raw_value) { + // Outside of known value range, but matches field length + // Let's assume the caller knows what they're doing and pass it through + _.Flap = raw_value; + } else { + _.Flap = static_cast(argoFlap_t::FLAP_AUTO); + } +} + +/// Set the flap position. i.e. Swing. (WREM2) /// @warning Not yet working! +/// @deprecated /// @param[in] flap The desired setting. void IRArgoAC::setFlap(const uint8_t flap) { - flap_mode = flap; + setFlap(static_cast(flap)); // TODO(kaschmo): set correct bits for flap mode } -/// Get the flap position. i.e. Swing. +/// Get the flap position. i.e. Swing. (WREM2) /// @warning Not yet working! +/// @deprecated /// @return The current flap setting. -uint8_t IRArgoAC::getFlap(void) const { return flap_mode; } - -/// Get the current operation mode setting. -/// @return The current operation mode. -uint8_t IRArgoAC::getMode(void) const { - return _.Mode; +uint8_t IRArgoAC::getFlap(void) const { + return _.Flap; } +/// Get the current operation mode setting. +/// @note This is a full specialization for @c ArgoProtocol type and while +/// it semantically belongs to @c IrArgoAC class impl., it has *not* +/// been pushed there, to avoid having to use a virtual function +/// @return The current operation mode. +/// @note This @c getModeEx() method has been introduced to be able to retain +/// old implementation of @c getMode() for @c IRArgoAc which used uint8_t +/// @relates IRArgoACBase\ +template<> +argoMode_t IRArgoACBase::getModeEx(void) const { + switch (_.Mode) { + case kArgoCool: + return argoMode_t::COOL; + case kArgoDry: + return argoMode_t::DRY; + case kArgoAuto: + return argoMode_t::AUTO; + case kArgoHeat: + return argoMode_t::HEAT; + case kArgoOff: // Modelling "FAN" as "OFF", for the lack of better constant + return argoMode_t::FAN; + case kArgoHeatAuto: + default: + return static_cast(_.Mode); + } +} + +/// Get the current operation mode setting. +/// @note This is a full specialization for @c ArgoProtocolWREM3 type and while +/// it semantically belongs to @c IrArgoAC_WREM3 class impl., it has *not* +/// been pushed there, to avoid having to use a virtual function. +/// @return The current operation mode. +/// @note This @c getModeEx() method has been introduced to be able to retain +/// old implementation of @c getMode() for @c IRArgoAc which used uint8_t +/// @relates IRArgoACBase\ +template<> +argoMode_t IRArgoACBase::getModeEx(void) const { + return static_cast(_.Mode); +} + +/// @cond /// Set the desired operation mode. /// @param[in] mode The desired operation mode. -void IRArgoAC::setMode(const uint8_t mode) { +/// @note This is a full specialization for @c ArgoProtocol type and while +/// it semantically belongs to @c IrArgoAC class impl., it has *not* +/// been pushed there, to avoid having to use a virtual function +/// @relates IRArgoACBase\ +template<> +void IRArgoACBase::setMode(argoMode_t mode) { + switch (mode) { + case argoMode_t::COOL: + _.Mode = static_cast(kArgoCool); + break; + case argoMode_t::DRY: + _.Mode = static_cast(kArgoDry); + break; + case argoMode_t::HEAT: + _.Mode = static_cast(kArgoHeat); + break; + case argoMode_t::FAN: + _.Mode = static_cast(kArgoOff); + break; + case argoMode_t::AUTO: + _.Mode = static_cast(kArgoAuto); + break; + default: + uint8_t raw_value = static_cast(mode); + if ((raw_value & 0b111) == raw_value) { + // Outside of known value range, but matches field length + // Let's assume the caller knows what they're doing and pass it through + _.Mode = raw_value; + } else { + _.Mode = static_cast(kArgoAuto); + } + break; + } +} +/// @endcond + +/// @brief Set the desired operation mode. +/// @note This is a full specialization for @c ArgoProtocolWREM3 type and while +/// it semantically belongs to @c IrArgoAC_WREM3 class impl., it has *not* +/// been pushed there, to avoid having to use a virtual function +/// @param[in] mode The desired operation mode. +/// @relates IRArgoACBase\ +template<> +void IRArgoACBase::setMode(argoMode_t mode) { + switch (mode) { + case argoMode_t::COOL: + case argoMode_t::DRY: + case argoMode_t::HEAT: + case argoMode_t::FAN: + case argoMode_t::AUTO: + _.Mode = static_cast(mode); + break; + default: + _.Mode = static_cast(argoMode_t::AUTO); + break; + } +} + +/// @brief Set the desired operation mode. +/// @deprecated +/// @param mode The desired operation mode. +void IRArgoAC::setMode(uint8_t mode) { switch (mode) { case kArgoCool: case kArgoDry: @@ -235,118 +919,309 @@ void IRArgoAC::setMode(const uint8_t mode) { case kArgoHeat: case kArgoHeatAuto: _.Mode = mode; - return; + break; default: _.Mode = kArgoAuto; + break; } } +/// @brief Get the current operation mode +/// @deprecated +/// @return The current operation mode +uint8_t IRArgoAC::getMode() const { return _.Mode;} + +argoFan_t IRArgoAC_WREM3::getFan(void) const { return getFanEx(); } +argoFlap_t IRArgoAC_WREM3::getFlap(void) const { return getFlapEx(); } +argoMode_t IRArgoAC_WREM3::getMode(void) const { return getModeEx(); } + /// Turn on/off the Night mode. i.e. Sleep. /// @param[in] on The desired setting. -void IRArgoAC::setNight(const bool on) { - _.Night = on; -} +template +void IRArgoACBase::setNight(const bool on) { _.Night = on; } /// Get the status of Night mode. i.e. Sleep. /// @return true if on, false if off. -bool IRArgoAC::getNight(void) const { return _.Night; } +template +bool IRArgoACBase::getNight(void) const { return _.Night; } + +/// @brief Turn on/off the Economy mode (lowered power mode) +/// @param[in] on The desired setting. +void IRArgoAC_WREM3::setEco(const bool on) { _.Eco = on; } + +/// @brief Get the status of Economy function +/// @return true if on, false if off. +bool IRArgoAC_WREM3::getEco(void) const { return _.Eco; } + +/// @brief Turn on/off the Filter mode (not supported by Argo Ulisse) +/// @param[in] on The desired setting. +void IRArgoAC_WREM3::setFilter(const bool on) { _.Filter = on; } + +/// @brief Get status of the filter function +/// @return true if on, false if off. +bool IRArgoAC_WREM3::getFilter(void) const { return _.Filter; } + +/// @brief Turn on/off the device Lights (LED) +/// @param[in] on The desired setting. +void IRArgoAC_WREM3::setLight(const bool on) { _.Light = on; } + +/// @brief Get status of device lights +/// @return true if on, false if off. +bool IRArgoAC_WREM3::getLight(void) const { return _.Light; } + +/// @brief Set the IR channel on which to communicate +/// @param[in] channel The desired IR channel. +void IRArgoAC_WREM3::setChannel(const uint8_t channel) { + _.IrChannel = std::min(channel, kArgoMaxChannel); +} + +/// @brief Get the currently set transmission channel +/// @return Channel number +uint8_t IRArgoAC_WREM3::getChannel(void) const { return _.IrChannel;} + +/// @brief Set the config data to send +/// Valid only for @c argoIrMessageType_t::CONFIG_PARAM_SET message +/// @param paramId The param ID +/// @param value The value of the parameter +void IRArgoAC_WREM3::setConfigEntry(const uint8_t paramId, + const uint8_t value) { + _.config.Key = paramId; + _.config.Value = value; +} + +/// @brief Get the config entry previously set +/// @return Key->value pair (paramID: value) +std::pair IRArgoAC_WREM3::getConfigEntry(void) const { + return std::make_pair(_.config.Key, _.config.Value); +} /// Turn on/off the iFeel mode. /// @param[in] on The desired setting. -void IRArgoAC::setiFeel(const bool on) { - _.iFeel = on; -} +template +void IRArgoACBase::setiFeel(const bool on) { _.iFeel = on; } /// Get the status of iFeel mode. /// @return true if on, false if off. -bool IRArgoAC::getiFeel(void) const { return _.iFeel; } +template +bool IRArgoACBase::getiFeel(void) const { return _.iFeel; } -/// Set the time for the A/C -/// @warning Not yet working! -void IRArgoAC::setTime(void) { - // TODO(kaschmo): use function call from checksum to set time first +/// @brief Set the message type of the next command (setting this resets state) +/// @param msgType The message type to set +template +void IRArgoACBase::setMessageType(const argoIrMessageType_t msgType) { + stateReset(msgType); +} + +/// @brief Get the message type +/// @return Message type currently set +template +argoIrMessageType_t IRArgoACBase::getMessageType(void) const { + return _messageType; } /// Set the value for the current room temperature. +/// @note Depending on message type - this will set `sensor` or `roomTemp` value /// @param[in] degrees The temperature in degrees celsius. -void IRArgoAC::setRoomTemp(const uint8_t degrees) { +template +void IRArgoACBase::setSensorTemp(const uint8_t degrees) { uint8_t temp = std::min(degrees, kArgoMaxRoomTemp); temp = std::max(temp, kArgoTempDelta) - kArgoTempDelta; - _.RoomTemp = temp; + if (getMessageType() == argoIrMessageType_t::IFEEL_TEMP_REPORT) { + _.SensorT = temp; + } else { + _.RoomTemp = temp; + } } /// Get the currently stored value for the room temperature setting. +/// @note Depending on message type - this will get `sensor` or `roomTemp` value /// @return The current setting for the room temp. in degrees celsius. -uint8_t IRArgoAC::getRoomTemp(void) const { +template +uint8_t IRArgoACBase::getSensorTemp(void) const { + if (getMessageType() == argoIrMessageType_t::IFEEL_TEMP_REPORT) { + return _.SensorT + kArgoTempDelta; + } return _.RoomTemp + kArgoTempDelta; } +/// @brief Convert a stdAc::ac_command_t enum into its native message type. +/// @param command The enum to be converted. +/// @return The native equivalent of the enum. +template +argoIrMessageType_t IRArgoACBase::convertCommand( + const stdAc::ac_command_t command) { + switch (command) { + case stdAc::ac_command_t::kSensorTempReport: + return argoIrMessageType_t::IFEEL_TEMP_REPORT; + case stdAc::ac_command_t::kTimerCommand: + return argoIrMessageType_t::TIMER_COMMAND; + case stdAc::ac_command_t::kConfigCommand: + return argoIrMessageType_t::CONFIG_PARAM_SET; + case stdAc::ac_command_t::kControlCommand: + default: + return argoIrMessageType_t::AC_CONTROL; + } +} + /// Convert a stdAc::opmode_t enum into its native mode. /// @param[in] mode The enum to be converted. /// @return The native equivalent of the enum. -uint8_t IRArgoAC::convertMode(const stdAc::opmode_t mode) { +template +argoMode_t IRArgoACBase::convertMode(const stdAc::opmode_t mode) { switch (mode) { case stdAc::opmode_t::kCool: - return kArgoCool; + return argoMode_t::COOL; case stdAc::opmode_t::kHeat: - return kArgoHeat; + return argoMode_t::HEAT; case stdAc::opmode_t::kDry: - return kArgoDry; - case stdAc::opmode_t::kOff: - return kArgoOff; - // No fan mode. - default: - return kArgoAuto; + return argoMode_t::DRY; + case stdAc::opmode_t::kFan: + return argoMode_t::FAN; + case stdAc::opmode_t::kAuto: + default: // No off mode. + return argoMode_t::AUTO; } } /// Convert a stdAc::fanspeed_t enum into it's native speed. /// @param[in] speed The enum to be converted. /// @return The native equivalent of the enum. -uint8_t IRArgoAC::convertFan(const stdAc::fanspeed_t speed) { +template +argoFan_t IRArgoACBase::convertFan(const stdAc::fanspeed_t speed) { switch (speed) { case stdAc::fanspeed_t::kMin: + return argoFan_t::FAN_LOWEST; case stdAc::fanspeed_t::kLow: - return kArgoFan1; + return argoFan_t::FAN_LOWER; case stdAc::fanspeed_t::kMedium: - return kArgoFan2; + return argoFan_t::FAN_LOW; + case stdAc::fanspeed_t::kMediumHigh: + return argoFan_t::FAN_MEDIUM; case stdAc::fanspeed_t::kHigh: + return argoFan_t::FAN_HIGH; case stdAc::fanspeed_t::kMax: - return kArgoFan3; + return argoFan_t::FAN_HIGHEST; default: - return kArgoFanAuto; + return argoFan_t::FAN_AUTO; } } /// Convert a stdAc::swingv_t enum into it's native setting. /// @param[in] position The enum to be converted. /// @return The native equivalent of the enum. -uint8_t IRArgoAC::convertSwingV(const stdAc::swingv_t position) { +template +argoFlap_t IRArgoACBase::convertSwingV(const stdAc::swingv_t position) { switch (position) { case stdAc::swingv_t::kHighest: - return kArgoFlapFull; + return argoFlap_t::FLAP_1; case stdAc::swingv_t::kHigh: - return kArgoFlap5; + return argoFlap_t::FLAP_2; + case stdAc::swingv_t::kUpperMiddle: + return argoFlap_t::FLAP_3; case stdAc::swingv_t::kMiddle: - return kArgoFlap4; + return argoFlap_t::FLAP_4; case stdAc::swingv_t::kLow: - return kArgoFlap3; + return argoFlap_t::FLAP_5; case stdAc::swingv_t::kLowest: - return kArgoFlap1; + return argoFlap_t::FLAP_6; + case stdAc::swingv_t::kOff: // This is abusing the semantics quite a bit + return argoFlap_t::FLAP_FULL; + case stdAc::swingv_t::kAuto: default: - return kArgoFlapAuto; + return argoFlap_t::FLAP_AUTO; + } +} + +/// @cond +/// Convert a native flap mode into its stdAc equivalent (WREM2). +/// @note This is a full specialization for @c ArgoProtocol type and while +/// it semantically belongs to @c IrArgoAC class impl., it has *not* +/// been pushed there, to avoid having to use a virtual function +/// @param[in] position The native setting to be converted. +/// @return The stdAc equivalent of the native setting. +/// @relates IRArgoACBase\ +template<> +stdAc::swingv_t IRArgoACBase::toCommonSwingV( + const uint8_t position) { + switch (position) { + case kArgoFlapFull: + return stdAc::swingv_t::kHighest; + case kArgoFlap5: + return stdAc::swingv_t::kHigh; + case kArgoFlap4: + return stdAc::swingv_t::kMiddle; + case kArgoFlap3: + return stdAc::swingv_t::kLow; + case kArgoFlap1: + return stdAc::swingv_t::kLowest; + default: + return stdAc::swingv_t::kAuto; + } +} +/// @endcond + +/// Convert a native flap mode into its stdAc equivalent (WREM3). +/// @note This is a full specialization for @c ArgoProtocolWREM3 type and while +/// it semantically belongs to @c IrArgoAC_WREM3 class impl., it has *not* +/// been pushed there, to avoid having to use a virtual function +/// @param[in] position The native setting to be converted. +/// @return The stdAc equivalent of the native setting. +/// @relates IRArgoACBase\ +template<> +stdAc::swingv_t IRArgoACBase::toCommonSwingV( + const uint8_t position) { + switch (static_cast(position)) { + case argoFlap_t::FLAP_FULL: + return stdAc::swingv_t::kOff; + case argoFlap_t::FLAP_6: + return stdAc::swingv_t::kHighest; + case argoFlap_t::FLAP_5: + return stdAc::swingv_t::kHigh; + case argoFlap_t::FLAP_4: + return stdAc::swingv_t::kUpperMiddle; + case argoFlap_t::FLAP_3: + return stdAc::swingv_t::kMiddle; + case argoFlap_t::FLAP_2: + return stdAc::swingv_t::kLow; + case argoFlap_t::FLAP_1: + return stdAc::swingv_t::kLowest; + case argoFlap_t::FLAP_AUTO: + default: + return stdAc::swingv_t::kAuto; + } +} + +/// Convert a native message type into its stdAc equivalent. +/// @param[in] command The native setting to be converted. +/// @return The stdAc equivalent of the native setting. +template +stdAc::ac_command_t IRArgoACBase::toCommonCommand( + const argoIrMessageType_t command) { + switch (command) { + case argoIrMessageType_t::AC_CONTROL: + return stdAc::ac_command_t::kControlCommand; + case argoIrMessageType_t::IFEEL_TEMP_REPORT: + return stdAc::ac_command_t::kSensorTempReport; + case argoIrMessageType_t::TIMER_COMMAND: + return stdAc::ac_command_t::kTimerCommand; + case argoIrMessageType_t::CONFIG_PARAM_SET: + return stdAc::ac_command_t::kConfigCommand; + default: + return stdAc::ac_command_t::kControlCommand; } } /// Convert a native mode into its stdAc equivalent. /// @param[in] mode The native setting to be converted. /// @return The stdAc equivalent of the native setting. -stdAc::opmode_t IRArgoAC::toCommonMode(const uint8_t mode) { +template +stdAc::opmode_t IRArgoACBase::toCommonMode(const argoMode_t mode) { switch (mode) { - case kArgoCool: return stdAc::opmode_t::kCool; - case kArgoHeat: return stdAc::opmode_t::kHeat; - case kArgoDry: return stdAc::opmode_t::kDry; - // No fan mode. + case argoMode_t::COOL: return stdAc::opmode_t::kCool; + case argoMode_t::DRY : return stdAc::opmode_t::kDry; + case argoMode_t::FAN : return stdAc::opmode_t::kFan; + case argoMode_t::HEAT : return stdAc::opmode_t::kHeat; + case argoMode_t::AUTO : return stdAc::opmode_t::kAuto; default: return stdAc::opmode_t::kAuto; } } @@ -354,11 +1229,16 @@ stdAc::opmode_t IRArgoAC::toCommonMode(const uint8_t mode) { /// Convert a native fan speed into its stdAc equivalent. /// @param[in] speed The native setting to be converted. /// @return The stdAc equivalent of the native setting. -stdAc::fanspeed_t IRArgoAC::toCommonFanSpeed(const uint8_t speed) { +template +stdAc::fanspeed_t IRArgoACBase::toCommonFanSpeed(const argoFan_t speed) { switch (speed) { - case kArgoFan3: return stdAc::fanspeed_t::kMax; - case kArgoFan2: return stdAc::fanspeed_t::kMedium; - case kArgoFan1: return stdAc::fanspeed_t::kMin; + case argoFan_t::FAN_AUTO: return stdAc::fanspeed_t::kAuto; + case argoFan_t::FAN_HIGHEST: return stdAc::fanspeed_t::kMax; + case argoFan_t::FAN_HIGH: return stdAc::fanspeed_t::kHigh; + case argoFan_t::FAN_MEDIUM: return stdAc::fanspeed_t::kMediumHigh; + case argoFan_t::FAN_LOW: return stdAc::fanspeed_t::kMedium; + case argoFan_t::FAN_LOWER: return stdAc::fanspeed_t::kLow; + case argoFan_t::FAN_LOWEST: return stdAc::fanspeed_t::kMin; default: return stdAc::fanspeed_t::kAuto; } } @@ -368,15 +1248,18 @@ stdAc::fanspeed_t IRArgoAC::toCommonFanSpeed(const uint8_t speed) { stdAc::state_t IRArgoAC::toCommon(void) const { stdAc::state_t result{}; result.protocol = decode_type_t::ARGO; + result.model = argo_ac_remote_model_t::SAC_WREM2; + result.command = toCommonCommand(_messageType); result.power = _.Power; - result.mode = toCommonMode(_.Mode); + result.mode = toCommonMode(getModeEx()); result.celsius = true; result.degrees = getTemp(); - result.fanspeed = toCommonFanSpeed(_.Fan); + result.sensorTemperature = getSensorTemp(); + result.iFeel = getiFeel(); + result.fanspeed = toCommonFanSpeed(getFanEx()); result.turbo = _.Max; result.sleep = _.Night ? 0 : -1; // Not supported. - result.model = -1; // Not supported. result.swingv = stdAc::swingv_t::kOff; result.swingh = stdAc::swingh_t::kOff; result.light = false; @@ -389,71 +1272,413 @@ stdAc::state_t IRArgoAC::toCommon(void) const { return result; } -/// Convert the current internal state into a human readable string. -/// @return A human readable string. -String IRArgoAC::toString(void) const { - String result = ""; - result.reserve(100); // Reserve some heap for the string to reduce fragging. - result += addBoolToString(_.Power, kPowerStr, false); - result += addIntToString(_.Mode, kModeStr); - result += kSpaceLBraceStr; - switch (_.Mode) { - case kArgoAuto: - result += kAutoStr; - break; - case kArgoCool: - result += kCoolStr; - break; - case kArgoHeat: - result += kHeatStr; - break; - case kArgoDry: - result += kDryStr; - break; - case kArgoHeatAuto: - result += kHeatStr; - result += ' '; - result += kAutoStr; - break; - case kArgoOff: - result += kOffStr; - break; - default: - result += kUnknownStr; +/// Convert the current internal state into its stdAc::state_t equivalent. +/// @return The stdAc equivalent of the native settings. +stdAc::state_t IRArgoAC_WREM3::toCommon(void) const { + stdAc::state_t result{}; + result.protocol = decode_type_t::ARGO; + result.model = argo_ac_remote_model_t::SAC_WREM3; + result.command = toCommonCommand(_messageType); + result.power = getPower(); + result.mode = toCommonMode(getModeEx()); + result.celsius = true; + result.degrees = getTemp(); + result.sensorTemperature = getSensorTemp(); + result.iFeel = getiFeel(); + result.fanspeed = toCommonFanSpeed(getFanEx()); + result.turbo = _.Max; + result.swingv = toCommonSwingV(_.Flap); + result.light = getLight(); + result.filter = getFilter(); + result.econo = getEco(); + result.quiet = getNight(); + result.beep = (_messageType != argoIrMessageType_t::IFEEL_TEMP_REPORT); + + result.clock = -1; + result.sleep = _.Night ? 0 : -1; + if (_messageType == argoIrMessageType_t::TIMER_COMMAND) { + result.clock = getCurrentTimeMinutes(); + result.sleep = getDelayTimerMinutes(); } - result += ')'; - result += addIntToString(_.Fan, kFanStr); - result += kSpaceLBraceStr; - switch (_.Fan) { - case kArgoFanAuto: - result += kAutoStr; - break; - case kArgoFan3: - result += kMaxStr; - break; - case kArgoFan1: - result += kMinStr; - break; - case kArgoFan2: - result += kMedStr; - break; - default: - result += kUnknownStr; - } - result += ')'; - result += addTempToString(getTemp()); - result += kCommaSpaceStr; - result += kRoomStr; - result += ' '; - result += addTempToString(getRoomTemp(), true, false); - result += addBoolToString(_.Max, kMaxStr); - result += addBoolToString(_.iFeel, kIFeelStr); - result += addBoolToString(_.Night, kNightStr); + + // Not supported. + result.swingh = stdAc::swingh_t::kOff; + result.clean = false; + + return result; } + +namespace { + /// @brief Short-hand for casting enum to its underlying storage type + /// @tparam E The type of enum + /// @param e Enum value + /// @return Type of underlying value + template + constexpr typename std::underlying_type::type to_underlying(E e) noexcept { + return static_cast::type>(e); + } +} + +/// Convert the current internal state into a human readable string (WREM2). +/// @return A human readable string. +String IRArgoAC::toString(void) const { + String result = ""; + result.reserve(118); // Reserve some heap for the string to reduce fragging. + // E.g.: Model: 1 (WREM2), Power: On, Mode: 0 (Cool), Fan: 0 (Auto), + // Temp: 20C, Room Temp: 21C, Max: On, IFeel: On, Night: On + result += addModelToString(decode_type_t::ARGO, + argo_ac_remote_model_t::SAC_WREM2, false); + if (_messageType == argoIrMessageType_t::IFEEL_TEMP_REPORT) { + result += addIntToString(getSensorTemp(), kSensorTempStr); + result += 'C'; + } else { + result += addBoolToString(_.Power, kPowerStr); + result += addIntToString(_.Mode, kModeStr); + result += kSpaceLBraceStr; + switch (_.Mode) { + case kArgoAuto: + result += kAutoStr; + break; + case kArgoCool: + result += kCoolStr; + break; + case kArgoHeat: + result += kHeatStr; + break; + case kArgoDry: + result += kDryStr; + break; + case kArgoHeatAuto: + result += kHeatStr; + result += ' '; + result += kAutoStr; + break; + case kArgoOff: + result += kOffStr; + break; + default: + result += kUnknownStr; + } + result += ')'; + result += addIntToString(_.Fan, kFanStr); + result += kSpaceLBraceStr; + switch (_.Fan) { + case kArgoFanAuto: + result += kAutoStr; + break; + case kArgoFan3: + result += kMaxStr; + break; + case kArgoFan1: + result += kMinStr; + break; + case kArgoFan2: + result += kMedStr; + break; + default: + result += kUnknownStr; + } + result += ')'; + result += addTempToString(getTemp()); + result += addTempToString(getSensorTemp(), true, true, true); + result += addBoolToString(_.Max, kMaxStr); + result += addBoolToString(_.iFeel, kIFeelStr); + result += addBoolToString(_.Night, kNightStr); + } + return result; +} + +/// @brief Set current clock (as minutes, counted from 0:00) +/// E.g. 13:38 becomes 818 (13*60+38) +/// @param currentTimeMinutes Current time (in minutes) +void IRArgoAC_WREM3::setCurrentTimeMinutes(uint16_t currentTimeMinutes) { + uint16_t time = std::min(currentTimeMinutes, static_cast(23*60+59)); + _.timer.CurrentTimeHi = (time >> 4); + _.timer.CurrentTimeLo = (time & 0b1111); +} + +/// @brief Retrieve current time +/// @return Current time as minutes from 0:00 +uint16_t IRArgoAC_WREM3::getCurrentTimeMinutes(void) const { + return (_.timer.CurrentTimeHi << 4) + _.timer.CurrentTimeLo; +} + +/// @brief Set current day of week +/// @param dayOfWeek Current day of week +void IRArgoAC_WREM3::setCurrentDayOfWeek(argoWeekday dayOfWeek) { + uint8_t day = std::min(to_underlying(dayOfWeek), + to_underlying(argoWeekday::SATURDAY)); + _.timer.CurrentWeekdayHi = (day >> 1); + _.timer.CurrentWeekdayLo = (day & 0b1); +} + +/// @brief Get current day of week +/// @return Current day of week +argoWeekday IRArgoAC_WREM3::getCurrentDayOfWeek(void) const { + return static_cast((_.timer.CurrentWeekdayHi << 1) + + _.timer.CurrentWeekdayLo); +} + +/// @brief Set timer type +/// @param timerType Timer type to use OFF | DELAY | SCHEDULE<1|2|3> +/// @note 2 timer types supported: delay | schedule timer +/// - @c DELAY_TIMER requires setting @c setDelayTimerMinutes +/// and @c setCurrentTimeMinutes and (optionally) @c setCurrentDayOfWeek +/// - @c SCHEDULE_TIMER requires setting: +/// @c setScheduleTimerStartMinutes +/// @c setScheduleTimerStopMinutes +/// @c setScheduleTimerActiveDays +/// as well as current time *and* day +/// @c setCurrentTimeMinutes and @c setCurrentDayOfWeek +void IRArgoAC_WREM3::setTimerType(const argoTimerType_t timerType) { + if (timerType > argoTimerType_t::SCHEDULE_TIMER_3) { + _.timer.TimerType = to_underlying(argoTimerType_t::NO_TIMER); + } else { + _.timer.TimerType = to_underlying(timerType); + } +} + +/// @brief Get currently set timer type +/// @return Timer type +argoTimerType_t IRArgoAC_WREM3::getTimerType(void) const { + return static_cast(_.timer.TimerType); +} + +/// @brief Set delay timer delay in minutes (10-minute increments only) +/// Max is 1190 (19h50m) +/// @note The delay timer also accepts current device state: set by @c setPower +/// @param delayMinutes Delay minutes +void IRArgoAC_WREM3::setDelayTimerMinutes(const uint16_t delayMinutes) { + const uint16_t DELAY_TIMER_MAX = 19*60+50; + uint16_t time = std::min(delayMinutes, DELAY_TIMER_MAX); + + // only full 10 minute increments are allowed + time = static_cast((time / 10.0) + 0.5) * 10; + + _.timer.DelayTimeHi = (time >> 6); + _.timer.DelayTimeLo = (time & 0b111111); +} + +/// @brief Get current delay timer value +/// @return Delay timer value (in minutes) +uint16_t IRArgoAC_WREM3::getDelayTimerMinutes(void) const { + return (_.timer.DelayTimeHi << 6) + _.timer.DelayTimeLo; +} + +/// @brief Set schedule timer on time (time when the device should turn on) +/// (10-minute increments only) +/// @param startTimeMinutes Time when the device should turn itself on +/// expressed as # of minutes counted from 0:00 +/// The value is in 10-minute increments (rounded) +/// E.g. 13:38 becomes 820 (13:40 in minutes) +void IRArgoAC_WREM3::setScheduleTimerStartMinutes( + const uint16_t startTimeMinutes) { + const uint16_t SCHEDULE_TIMER_MAX = 23*60+50; + uint16_t time = std::min(startTimeMinutes, SCHEDULE_TIMER_MAX); + + // only full 10 minute increments are allowed + time = static_cast((time / 10.0) + 0.5) * 10; + + _.timer.TimerStartHi = (time >> 3); + _.timer.TimerStartLo = (time & 0b111); +} + +/// @brief Get schedule timer ON time +/// @return Schedule on time (as # of minutes from 0:00) +uint16_t IRArgoAC_WREM3::getScheduleTimerStartMinutes(void) const { + return (_.timer.TimerStartHi << 3) + _.timer.TimerStartLo; +} + +/// @brief Set schedule timer off time (time when the device should turn off) +/// (10-minute increments only) +/// @param stopTimeMinutes Time when the device should turn itself off +/// expressed as # of minutes counted from 0:00 +/// The value is in 10-minute increments (rounded) +/// E.g. 13:38 becomes 820 (13:40 in minutes) +void IRArgoAC_WREM3::setScheduleTimerStopMinutes( + const uint16_t stopTimeMinutes) { + const uint16_t SCHEDULE_TIMER_MAX = 23*60+50; + uint16_t time = std::min(stopTimeMinutes, SCHEDULE_TIMER_MAX); + + // only full 10 minute increments are allowed + time = static_cast((time / 10.0) + 0.5) * 10; + + _.timer.TimerEndHi = (time >> 8); + _.timer.TimerEndLo = (time & 0b11111111); +} + +/// @brief Get schedule timer OFF time +/// @return Schedule off time (as # of minutes from 0:00) +uint16_t IRArgoAC_WREM3::getScheduleTimerStopMinutes(void) const { + return (_.timer.TimerEndHi << 8) + _.timer.TimerEndLo; +} + +/// @brief Get the days when shedule timer shall be active (as bitmap) +/// @return Days when schedule timer is active, as raw bitmap type +/// where bit[0] is Sunday, bit[1] -> Monday, ... +uint8_t IRArgoAC_WREM3::getTimerActiveDaysBitmap(void) const { + return (_.timer.TimerActiveDaysHi << 5) + _.timer.TimerActiveDaysLo; +} + +/// @brief Set the days when the schedule timer shall be active +/// @param days A set of days when the timer shall run +void IRArgoAC_WREM3::setScheduleTimerActiveDays( + const std::set& days) { + uint8_t daysBitmap = 0; + for (const argoWeekday& day : days) { + daysBitmap |= (0b1 << to_underlying(day)); + } + _.timer.TimerActiveDaysHi = (daysBitmap >> 5); + _.timer.TimerActiveDaysLo = (daysBitmap & 0b11111); +} + +/// @brief Get the days when shedule timer shall be active (as set) +/// @return Days when the schedule timer runs +std::set IRArgoAC_WREM3::getScheduleTimerActiveDays(void) const { + std::set result = {}; + uint8_t daysBitmap = getTimerActiveDaysBitmap(); + for (uint8_t i = to_underlying(argoWeekday::SUNDAY); + i <= to_underlying(argoWeekday::SATURDAY); + ++i) { + if (((daysBitmap >> i) & 0b1) == 0b1) { + result.insert(static_cast(i)); + } + } + return result; +} + +/// @brief Get device model +/// @return Device model +argo_ac_remote_model_t IRArgoAC_WREM3::getModel() const { + return argo_ac_remote_model_t::SAC_WREM3; +} + +namespace { + String commandTypeToString(argoIrMessageType_t type, uint8_t channel) { + String result = irutils::irCommandTypeToString(to_underlying(type), + to_underlying(argoIrMessageType_t::AC_CONTROL), + to_underlying(argoIrMessageType_t::IFEEL_TEMP_REPORT), + to_underlying(argoIrMessageType_t::TIMER_COMMAND), + to_underlying(argoIrMessageType_t::CONFIG_PARAM_SET)); + result += irutils::channelToString(channel); + result += kColonSpaceStr; + return result; + } +} // namespace + +/// Convert the current internal state into a human readable string (WREM3). +/// @return A human readable string. +String IRArgoAC_WREM3::toString(void) const { + String result = ""; + result.reserve(190); // Reserve some heap for the string to reduce fragging. + // E.g.: Command[CH#0]: Model: 2 (WREM3), Power: On, Mode: 1 (Cool), + // Temp: 22C, Room: 26C, Fan: 0 (Auto), Swing(V): 7 (Breeze), + // IFeel: Off, Night: Off, Econo: Off, Max: Off, Filter: Off, Light: On + // Temp: 20C, Room Temp: 21C, Max: On, IFeel: On, Night: On + + argoIrMessageType_t commandType = this->getMessageType(); + argo_ac_remote_model_t model = getModel(); + + result += commandTypeToString(commandType, getChannel()); + result += addModelToString(decode_type_t::ARGO, model, false); + + switch (commandType) { + case argoIrMessageType_t::IFEEL_TEMP_REPORT: + result += addTempToString(getSensorTemp(), true, true, true); + break; + + case argoIrMessageType_t::AC_CONTROL: + result += addBoolToString(getPower(), kPowerStr); + result += addModeToString(to_underlying(getModeEx()), + to_underlying(argoMode_t::AUTO), + to_underlying(argoMode_t::COOL), + to_underlying(argoMode_t::HEAT), + to_underlying(argoMode_t::DRY), + to_underlying(argoMode_t::FAN)); + result += addTempToString(getTemp()); + result += addTempToString(getSensorTemp(), true, true, true); + result += addFanToString(to_underlying(getFanEx()), + to_underlying(argoFan_t::FAN_HIGH), + to_underlying(argoFan_t::FAN_LOWER), + to_underlying(argoFan_t::FAN_AUTO), + to_underlying(argoFan_t::FAN_LOWEST), + to_underlying(argoFan_t::FAN_LOW), + to_underlying(argoFan_t::FAN_HIGHEST), + to_underlying(argoFan_t::FAN_MEDIUM)); + result += addSwingVToString(to_underlying(getFlapEx()), + to_underlying(argoFlap_t::FLAP_AUTO), + to_underlying(argoFlap_t::FLAP_1), + to_underlying(argoFlap_t::FLAP_2), + to_underlying(argoFlap_t::FLAP_3), + to_underlying(argoFlap_t::FLAP_4), -1, + to_underlying(argoFlap_t::FLAP_5), + to_underlying(argoFlap_t::FLAP_6), -1, -1, + to_underlying(argoFlap_t::FLAP_FULL), -1); + result += addBoolToString(getiFeel(), kIFeelStr); + result += addBoolToString(getNight(), kNightStr); + result += addBoolToString(getEco(), kEconoStr); + result += addBoolToString(getMax(), kMaxStr); // Turbo + result += addBoolToString(getFilter(), kFilterStr); + result += addBoolToString(getLight(), kLightStr); + break; + + case argoIrMessageType_t::TIMER_COMMAND: + result += addBoolToString(_.timer.IsOn, kPowerStr); + result += addTimerModeToString(to_underlying(getTimerType()), + to_underlying(argoTimerType_t::NO_TIMER), + to_underlying(argoTimerType_t::DELAY_TIMER), + to_underlying(argoTimerType_t::SCHEDULE_TIMER_1), + to_underlying(argoTimerType_t::SCHEDULE_TIMER_2), + to_underlying(argoTimerType_t::SCHEDULE_TIMER_3)); + result += addLabeledString(minsToString(getCurrentTimeMinutes()), + kClockStr); + result += addDayToString(to_underlying(getCurrentDayOfWeek())); + switch (getTimerType()) { + case argoTimerType_t::NO_TIMER: + result += addLabeledString(kOffStr, kTimerStr); + break; + case argoTimerType_t::DELAY_TIMER: + result += addLabeledString(minsToString(getDelayTimerMinutes()), + kTimerStr); + break; + default: + result += addLabeledString(minsToString(getScheduleTimerStartMinutes()), + kOnTimerStr); + result += addLabeledString(minsToString(getScheduleTimerStopMinutes()), + kOffTimerStr); + + result += addLabeledString(daysBitmaskToString( + getTimerActiveDaysBitmap()), kTimerActiveDaysStr); + break; + } + break; + + case argoIrMessageType_t::CONFIG_PARAM_SET: + result += addIntToString(_.config.Key, kKeyStr); + result += addIntToString(_.config.Value, kValueStr); + break; + } + + return result; +} + +/// @brief Check if raw ARGO state starts with valid WREM3 preamble +/// @param state The state bytes +/// @param length Length of state in bytes +/// @return True if state starts wiht valid WREM3 preamble, False otherwise +bool IRArgoAC_WREM3::hasValidPreamble(const uint8_t state[], + const uint16_t length) { + if (length < 1) { + return false; + } + uint8_t preamble = state[0] & 0x0F; + return preamble == kArgoWrem3Preamble; +} + #if DECODE_ARGO -/// Decode the supplied Argo message. +/// Decode the supplied Argo message (WREM2). /// Status: BETA / Probably works. /// @param[in,out] results Ptr to the data to decode & where to store the decode /// result. @@ -480,7 +1705,9 @@ bool IRrecv::decodeArgo(decode_results *results, uint16_t offset, // Compliance // Verify we got a valid checksum. - if (strict && !IRArgoAC::validChecksum(results->state)) return false; + if (strict && !IRArgoAC::validChecksum(results->state, kArgoStateLength)) { + return false; + } // Success results->decode_type = decode_type_t::ARGO; results->bits = nbits; @@ -489,4 +1716,107 @@ bool IRrecv::decodeArgo(decode_results *results, uint16_t offset, // is a union data type. return true; } + +/// Decode the supplied Argo message (WREM3). +/// Status: Confirmed working w/ Argo 13 ECO (WREM-3) +/// @param[in,out] results Ptr to the data to decode & where to store the decode +/// result. +/// @param[in] offset The starting index to use when attempting to decode the +/// raw data. Typically/Defaults to kStartOffset. +/// @param[in] nbits The number of data bits to expect. +/// @param[in] strict Flag indicating if we should perform strict matching. +/// @return A boolean. True if it can decode it, false if it can't. +/// @note This decoder is separate from @c decodeArgo to maintain backwards +/// compatibility. Contrary to WREM2, this expects a footer and gap! +bool IRrecv::decodeArgoWREM3(decode_results *results, uint16_t offset, + const uint16_t nbits, + const bool strict) { + if (strict + && nbits != kArgo3AcControlStateLength * 8 + && nbits != kArgo3ConfigStateLength * 8 + && nbits != kArgo3iFeelReportStateLength * 8 + && nbits != kArgo3TimerStateLength * 8) { + return false; + } + + uint16_t bytesRead = matchGeneric(results->rawbuf + offset, results->state, + results->rawlen - offset, nbits, + kArgoHdrMark, kArgoHdrSpace, + kArgoBitMark, kArgoOneSpace, + kArgoBitMark, kArgoZeroSpace, + kArgoBitMark, kArgoGap, // difference vs decodeArgo + true, _tolerance, 0, + false); + if (!bytesRead) { + return false; + } + + // If 'strict', assert it is a valid WREM-3 'model' protocolar message + // vs. just 'any ARGO' + if (strict && + !IRArgoAC_WREM3::isValidWrem3Message(results->state, nbits, true)) { + return false; + } + + // Success: Matched ARGO protocol and WREM3-model + // Note that unfortunately decode_type does not allow to persist model... + // so we will be re-detecting it later :) + results->decode_type = decode_type_t::ARGO; + results->bits = nbits; + // No need to record the state as we stored it as we decoded it. + // As we use result->state, we don't record value, address, or command as it + // is a union data type. + return true; +} + +/// @brief Detects if an ARGO protocol message is a WREM-3 sub-type (model) +/// @param state The raw IR decore state +/// @param nbits The length of @c state **IN BITS** +/// @param verifyChecksum Whether to perform checksum verification +/// @return True if the message is a WREM-3 one +bool IRArgoAC_WREM3::isValidWrem3Message(const uint8_t state[], + const uint16_t nbits, + bool verifyChecksum) { + if ((nbits % 8) != 0) { + return false; // WREM-3 protocol always has a full byte length commands + } + uint16_t stateLengthBytes = std::min(static_cast(nbits / 8), + kStateSizeMax); + if (!IRArgoAC_WREM3::hasValidPreamble(state, stateLengthBytes)) { + return false; + } + + argoIrMessageType_t messageType = IRArgoACBase + ::getMessageType(state, stateLengthBytes); + + switch (messageType) { + case argoIrMessageType_t::AC_CONTROL : + if (stateLengthBytes != kArgo3AcControlStateLength) { return false; } + break; + case argoIrMessageType_t::CONFIG_PARAM_SET: + if (stateLengthBytes != kArgo3ConfigStateLength) { return false; } + break; + case argoIrMessageType_t::TIMER_COMMAND: + if (stateLengthBytes != kArgo3TimerStateLength) { return false; } + break; + case argoIrMessageType_t::IFEEL_TEMP_REPORT: + if (stateLengthBytes != kArgo3iFeelReportStateLength) { return false; } + break; + default: + return false; + } + + // Compliance: Verify we got a valid checksum. + if (verifyChecksum && + !IRArgoAC_WREM3::validChecksum(state, stateLengthBytes)) { + return false; + } + return true; +} + #endif // DECODE_ARGO + + +// force template instantiation +template class IRArgoACBase; +template class IRArgoACBase; diff --git a/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/src/ir_Argo.h b/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/src/ir_Argo.h index 8ef7bb386..ba804f93c 100644 --- a/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/src/ir_Argo.h +++ b/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/src/ir_Argo.h @@ -1,13 +1,18 @@ // Copyright 2017 Schmolders +// Copyright 2022 crankyoldgit +// Copyright 2022 Mateusz Bronk (mbronk) /// @file /// @brief Support for Argo Ulisse 13 DCI Mobile Split ACs. // Supports: -// Brand: Argo, Model: Ulisse 13 DCI Mobile Split A/C +// Brand: Argo, Model: Ulisse 13 DCI Mobile Split A/C [WREM2 remote] +// Brand: Argo, Model: Ulisse Eco Mobile Split A/C (Wifi) [WREM3 remote] #ifndef IR_ARGO_H_ #define IR_ARGO_H_ +#include +#include #ifndef UNIT_TEST #include #endif @@ -20,14 +25,14 @@ // ARGO Ulisse DCI -/// Native representation of a Argo A/C message. +/// Native representation of a Argo A/C message for WREM-2 remote. union ArgoProtocol { uint8_t raw[kArgoStateLength]; ///< The state in native IR code form struct { // Byte 0 - uint64_t :8; // Typically 0b00110101 + uint64_t Pre1 :8; // Typically 0b00110101 // Byte 1 - uint64_t :8; // Typically 0b10101111 + uint64_t Pre2 :8; // Typically 0b10101111 // Byte 2~4 uint64_t :3; uint64_t Mode :3; @@ -57,17 +62,143 @@ union ArgoProtocol { uint32_t :1; // const 0 uint32_t iFeel :1; // Byte 10~11 - uint32_t :2; // const 01 + uint32_t Post :2; uint32_t Sum :8; // straddle byte 10 and 11 uint32_t :6; }; + struct { + // Byte 0-1 + uint8_t :8; + uint8_t :8; + // Byte 2-3 + uint8_t CheckHi :3; + uint8_t SensorT :5; + uint8_t Fixed :3; // Typically 0b011 + uint8_t CheckLo :5; + }; }; -// Constants. Store MSB left. +/// Native representation of A/C IR message for WREM-3 remote +/// @note The remote sends 4 different IR command types, varying in length +/// and methods of checksum calculation +/// - [0b00] Regular A/C command (change operation mode) - 6-byte +/// - [0b01] iFeel Temperature report - 2-byte +/// - [0b10] Timer command - 9-byte +/// - [0b11] Config command - 4-byte +/// @note The 1st 2 structures are unnamed for compat. with @c ArgoProtocol +/// 1st byte definition is a header common across all commands though +union ArgoProtocolWREM3 { + uint8_t raw[kArgoStateLength]; ///< The state in native IR code form + struct { + // Byte 0 (same definition across the union) + uint8_t Pre1 :4; /// Preamble: 0b1011 @ref kArgoWrem3Preamble + uint8_t IrChannel :2; /// 0..3 range + uint8_t IrCommandType :2; /// @ref argoIrMessageType_t + // Byte 1 + uint8_t RoomTemp :5; // in Celsius, range: 4..35 (offset by -4[*C]) + uint8_t Mode :3; /// @ref argoMode_t + // Byte 2 + uint8_t Temp :5; // in Celsius, range: 10..32 (offset by -4[*C]) + uint8_t Fan :3; /// @ref argoFan_t + // Byte3 + uint8_t Flap :3; /// SwingV @ref argoFlap_t + uint8_t Power :1; + uint8_t iFeel :1; + uint8_t Night :1; + uint8_t Eco :1; + uint8_t Max :1; ///< a.k.a. Turbo + // Byte4 + uint8_t Filter :1; + uint8_t Light :1; + uint8_t Post1 :6; /// Unknown, always 0b110000 (TempScale?) + // Byte5 + uint8_t Sum :8; /// Checksum + }; + struct { + // Byte 0 (same definition across the union) + uint8_t :8; // {Pre1 | IrChannel | IrCommandType} + // Byte 1 + uint8_t SensorT :5; // in Celsius, range: 4..35 (offset by -4[*C]) + uint8_t CheckHi :3; // Checksum (short) + }; + struct Timer { + // Byte 0 (same definition across the union) + uint8_t : 8; // {Pre1 | IrChannel | IrCommandType} + // Byte 1 + uint8_t IsOn : 1; + uint8_t TimerType : 3; + uint8_t CurrentTimeLo : 4; + // Byte 2 + uint8_t CurrentTimeHi : 7; + uint8_t CurrentWeekdayLo : 1; + // Byte 3 + uint8_t CurrentWeekdayHi : 2; + uint8_t DelayTimeLo : 6; + // Byte 4 + uint8_t DelayTimeHi : 5; + uint8_t TimerStartLo : 3; + // Byte 5 + uint8_t TimerStartHi : 8; + // Byte 6 + uint8_t TimerEndLo : 8; + // Byte 7 + uint8_t TimerEndHi : 3; + uint8_t TimerActiveDaysLo : 5; // Bitmap (LSBit is Sunday) + // Byte 8 + uint8_t TimerActiveDaysHi : 2; // Bitmap (LSBit is Sunday) + uint8_t Post1 : 1; // Unknown, always 1 + uint8_t Checksum : 5; + } timer; + struct Config { + uint8_t :8; // Byte 0 {Pre1 | IrChannel | IrCommandType} + uint8_t Key :8; // Byte 1 + uint8_t Value :8; // Byte 2 + uint8_t Checksum :8; // Byte 3 + } config; +}; -const uint8_t kArgoHeatBit = 0b00100000; +// Constants (WREM-2). Store MSB left. +const uint8_t kArgoHeatBit = 0b00100000; +const uint8_t kArgoPreamble1 = 0b10101100; +const uint8_t kArgoPreamble2 = 0b11110101; +const uint8_t kArgoPost = 0b00000010; -// Mode 0b00111000 +// Constants (generic) +const uint16_t kArgoFrequency = 38000; // Hz +// Temp +const uint8_t kArgoTempDelta = 4; +const uint8_t kArgoMaxRoomTemp = 35; // Celsius +const uint8_t kArgoMinTemp = 10; // Celsius delta +4 +const uint8_t kArgoMaxTemp = 32; // Celsius +const uint8_t kArgoMaxChannel = 3; + + +/// @brief IR message type (determines the payload part of IR command) +/// @note Raw values match WREM-3 protocol, but the enum is used in generic +/// context +/// @note WREM-3 remote supports all commands separately, whereas +/// WREM-2 (allegedly) only has the @c AC_CONTROL and @c IFEEL_TEMP_REPORT +/// (timers are part of @c AC_CONTROL command), and there's no config. +enum class argoIrMessageType_t : uint8_t { + AC_CONTROL = 0b00, + IFEEL_TEMP_REPORT = 0b01, + TIMER_COMMAND = 0b10, // WREM-3 only (WREM-2 has it under AC_CONTROL) + CONFIG_PARAM_SET = 0b11 // WREM-3 only +}; + +/// @brief A/C operation mode +/// @note Raw values match WREM-3 protocol, but the enum is used in generic +/// context +enum class argoMode_t : uint8_t { + COOL = 0b001, + DRY = 0b010, + HEAT = 0b011, + FAN = 0b100, + AUTO = 0b101 +}; + +// Raw mode definitions for WREM-2 remote +// (not wraped into a ns nor enum for backwards-compat.) const uint8_t kArgoCool = 0b000; const uint8_t kArgoDry = 0b001; const uint8_t kArgoAuto = 0b010; @@ -77,19 +208,42 @@ const uint8_t kArgoHeatAuto = 0b101; // ?no idea what mode that is const uint8_t kArgoHeatBlink = 0b110; -// Fan 0b00011000 +/// @brief Fan speed +/// @note Raw values match WREM-3 protocol, but the enum is used in generic +/// context +enum class argoFan_t : uint8_t { + FAN_AUTO = 0b000, + FAN_LOWEST = 0b001, + FAN_LOWER = 0b010, + FAN_LOW = 0b011, + FAN_MEDIUM = 0b100, + FAN_HIGH = 0b101, + FAN_HIGHEST = 0b110 +}; + +// Raw fan speed definitions for WREM-2 remote +// (not wraped into a ns nor enum for backwards-compat.) const uint8_t kArgoFanAuto = 0; // 0b00 const uint8_t kArgoFan1 = 1; // 0b01 const uint8_t kArgoFan2 = 2; // 0b10 const uint8_t kArgoFan3 = 3; // 0b11 -// Temp -const uint8_t kArgoTempDelta = 4; -const uint8_t kArgoMaxRoomTemp = 35; // Celsius -const uint8_t kArgoMinTemp = 10; // Celsius delta +4 -const uint8_t kArgoMaxTemp = 32; // Celsius +/// @brief Flap position (swing-V) +/// @note Raw values match WREM-3 protocol, but the enum is used in generic +/// context +enum class argoFlap_t : uint8_t { + FLAP_AUTO = 0, + FLAP_1 = 1, // Highest + FLAP_2 = 2, + FLAP_3 = 3, + FLAP_4 = 4, + FLAP_5 = 5, + FLAP_6 = 6, // Lowest + FLAP_FULL = 7 +}; -// Flap/SwingV +// Raw Flap/SwingV definitions for WREM-2 remote +// (not wraped into a ns nor enum for backwards-compat.) const uint8_t kArgoFlapAuto = 0; const uint8_t kArgoFlap1 = 1; const uint8_t kArgoFlap2 = 2; @@ -123,22 +277,61 @@ const uint8_t kArgoFlapFull = 7; #define ARGO_FLAP_FULL kArgoFlapFull -/// Class for handling detailed Argo A/C messages. -class IRArgoAC { +/// @brief Timer type to set (for @c argoIrMessageType_t::TIMER_COMMAND) +/// @note Raw values match WREM-3 protocol +enum class argoTimerType_t : uint8_t { + NO_TIMER = 0b000, + DELAY_TIMER = 0b001, + SCHEDULE_TIMER_1 = 0b010, + SCHEDULE_TIMER_2 = 0b011, + SCHEDULE_TIMER_3 = 0b100 +}; + +/// @brief Day type to set (for @c argoIrMessageType_t::TIMER_COMMAND) +/// @note Raw values match WREM-3 protocol +enum class argoWeekday : uint8_t { + SUNDAY = 0b000, + MONDAY = 0b001, + TUESDAY = 0b010, + WEDNESDAY = 0b011, + THURSDAY = 0b100, + FRIDAY = 0b101, + SATURDAY = 0b110 +}; + + + +/// @brief Base class for handling *common* support for Argo remote protocols +/// (functionality is shared across WREM-2 and WREM-3 IR protocols) +/// @note This class uses static polymorphism and full template specializations +/// when required, to avoid a performance penalty of doing v-table lookup. +/// 2 instantiations are forced in impl. file: for @c ArgoProtocol and +/// @c ArgoProtocolWREM3 +/// @note This class is abstract (though does not declare a pure-virtual fn. +/// for abovementioned reasons), and instead declares protected c-tor +/// @tparam ARGO_PROTOCOL_T The Raw device protocol/message used +template +class IRArgoACBase { +#ifndef UNIT_TEST // A less cloggy way of expressing FRIEND_TEST(...) + + protected: +#else + public: - explicit IRArgoAC(const uint16_t pin, const bool inverted = false, +#endif + explicit IRArgoACBase(const uint16_t pin, const bool inverted = false, const bool use_modulation = true); + public: #if SEND_ARGO void send(const uint16_t repeat = kArgoDefaultRepeat); - void sendSensorTemp(const uint8_t temp, - const uint16_t repeat = kArgoDefaultRepeat); /// Run the calibration to calculate uSec timing offsets for this platform. /// @return The uSec timing offset needed per modulation of the IR Led. /// @note This will produce a 65ms IR signal pulse at 38kHz. /// Only ever needs to be run once per object instantiation, if at all. int8_t calibrate(void) { return _irsend.calibrate(); } #endif // SEND_ARGO + void begin(void); void on(void); void off(void); @@ -149,14 +342,20 @@ class IRArgoAC { void setTemp(const uint8_t degrees); uint8_t getTemp(void) const; - void setFan(const uint8_t fan); - uint8_t getFan(void) const; + void setSensorTemp(const uint8_t degrees); + uint8_t getSensorTemp(void) const; - void setFlap(const uint8_t flap); - uint8_t getFlap(void) const; + void setFan(const argoFan_t fan); + void setFanEx(const argoFan_t fan) { setFan(fan); } + argoFan_t getFanEx(void) const; ///< `-Ex` for backw. compat w/ @c IRArgoAC - void setMode(const uint8_t mode); - uint8_t getMode(void) const; + void setFlap(const argoFlap_t flap); + void setFlapEx(const argoFlap_t flap) { setFlap(flap); } + argoFlap_t getFlapEx(void) const; ///< `-Ex` for backw. compat w/ @c IRArgoAC + + void setMode(const argoMode_t mode); + void setModeEx(const argoMode_t mode) { setMode(mode); } + argoMode_t getModeEx(void) const; ///< `-Ex` for backw. compat w/ @c IRArgoAC void setMax(const bool on); bool getMax(void) const; @@ -167,41 +366,156 @@ class IRArgoAC { void setiFeel(const bool on); bool getiFeel(void) const; - void setTime(void); - void setRoomTemp(const uint8_t degrees); - uint8_t getRoomTemp(void) const; + void setMessageType(const argoIrMessageType_t msgType); + argoIrMessageType_t getMessageType(void) const; + static argoIrMessageType_t getMessageType(const uint8_t state[], + const uint16_t length); uint8_t* getRaw(void); - void setRaw(const uint8_t state[]); - static uint8_t calcChecksum(const uint8_t state[], - const uint16_t length = kArgoStateLength); - static bool validChecksum(const uint8_t state[], - const uint16_t length = kArgoStateLength); - static uint8_t convertMode(const stdAc::opmode_t mode); - static uint8_t convertFan(const stdAc::fanspeed_t speed); - static uint8_t convertSwingV(const stdAc::swingv_t position); - static stdAc::opmode_t toCommonMode(const uint8_t mode); - static stdAc::fanspeed_t toCommonFanSpeed(const uint8_t speed); - stdAc::state_t toCommon(void) const; - String toString(void) const; + uint16_t getRawByteLength() const; + static uint16_t getStateLengthForIrMsgType(argoIrMessageType_t type); + void setRaw(const uint8_t state[], const uint16_t length); + + static bool validChecksum(const uint8_t state[], const uint16_t length); + + static argoMode_t convertMode(const stdAc::opmode_t mode); + static argoFan_t convertFan(const stdAc::fanspeed_t speed); + static argoFlap_t convertSwingV(const stdAc::swingv_t position); + static argoIrMessageType_t convertCommand(const stdAc::ac_command_t command); + + protected: + void _stateReset(ARGO_PROTOCOL_T *state, argoIrMessageType_t messageType + = argoIrMessageType_t::AC_CONTROL); + void stateReset(argoIrMessageType_t messageType + = argoIrMessageType_t::AC_CONTROL); + void _checksum(ARGO_PROTOCOL_T *state); + void checksum(void); + static uint16_t getRawByteLength(const ARGO_PROTOCOL_T& raw, + argoIrMessageType_t messageTypeHint = argoIrMessageType_t::AC_CONTROL); + static uint8_t calcChecksum(const uint8_t state[], const uint16_t length); + static uint8_t getChecksum(const uint8_t state[], const uint16_t length); + + static stdAc::opmode_t toCommonMode(const argoMode_t mode); + static stdAc::fanspeed_t toCommonFanSpeed(const argoFan_t speed); + static stdAc::swingv_t toCommonSwingV(const uint8_t position); + static stdAc::ac_command_t toCommonCommand(const argoIrMessageType_t command); + + // Attributes + ARGO_PROTOCOL_T _; ///< The raw protocol data + uint16_t _length = kArgoStateLength; + argoIrMessageType_t _messageType = argoIrMessageType_t::AC_CONTROL; + #ifndef UNIT_TEST - private: + protected: IRsend _irsend; ///< instance of the IR send class #else + + public: /// @cond IGNORE IRsendTest _irsend; ///< instance of the testing IR send class /// @endcond #endif - // # of bytes per command - ArgoProtocol _; - void stateReset(void); - void checksum(void); +}; - // Attributes - uint8_t flap_mode; - uint8_t heat_mode; - uint8_t cool_mode; +/// @brief Supports Argo A/C SAC-WREM2 IR remote protocol +class IRArgoAC : public IRArgoACBase { + public: + explicit IRArgoAC(const uint16_t pin, const bool inverted = false, + const bool use_modulation = true); + + #if SEND_ARGO + void sendSensorTemp(const uint8_t degrees, + const uint16_t repeat = kArgoDefaultRepeat); + #endif // SEND_ARGO + + String toString(void) const; + stdAc::state_t toCommon(void) const; + + using IRArgoACBase::setMode; + void setMode(const uint8_t mode); /// @deprecated, for backwards-compat. + uint8_t getMode(void) const; /// @deprecated, for backwards-compat. + + using IRArgoACBase::setFan; + void setFan(const uint8_t fan); /// @deprecated, for backwards-compat. + uint8_t getFan(void) const; /// @deprecated, for backwards-compat. + + using IRArgoACBase::setFlap; + void setFlap(const uint8_t flap); /// @deprecated, for backwards-compat. + uint8_t getFlap(void) const; /// @deprecated, for backwards-compat. +}; + +/// @brief Supports Argo A/C SAC-WREM3 IR remote protocol +class IRArgoAC_WREM3 : public IRArgoACBase { + public: + explicit IRArgoAC_WREM3(const uint16_t pin, const bool inverted = false, + const bool use_modulation = true); + + #if SEND_ARGO + void sendSensorTemp(const uint8_t degrees, + const uint16_t repeat = kArgoDefaultRepeat); + #endif // SEND_ARGO + + argo_ac_remote_model_t getModel(void) const; + + + argoFan_t getFan(void) const; + argoFlap_t getFlap(void) const; + argoMode_t getMode(void) const; + + void setEco(const bool on); + bool getEco(void) const; + + void setFilter(const bool on); + bool getFilter(void) const; + + void setLight(const bool on); + bool getLight(void) const; + + void setChannel(const uint8_t channel); + uint8_t getChannel(void) const; + + void setConfigEntry(const uint8_t paramId, const uint8_t value); + std::pair getConfigEntry(void) const; + + void setCurrentTimeMinutes(uint16_t currentTimeMinutes); + uint16_t getCurrentTimeMinutes(void) const; + + void setCurrentDayOfWeek(argoWeekday dayOfWeek); + argoWeekday getCurrentDayOfWeek(void) const; + + void setTimerType(const argoTimerType_t timerType); + argoTimerType_t getTimerType(void) const; + + void setDelayTimerMinutes(const uint16_t delayMinutes); + uint16_t getDelayTimerMinutes(void) const; + + void setScheduleTimerStartMinutes(const uint16_t startTimeMinutes); + uint16_t getScheduleTimerStartMinutes(void) const; + // uint16_t getTimerXStartMinutes(void) const + + void setScheduleTimerStopMinutes(const uint16_t stopTimeMinutes); + uint16_t getScheduleTimerStopMinutes(void) const; + // uint16_t getTimerXStopMinutes(void) const; + + + void setScheduleTimerActiveDays(const std::set& days); + std::set getScheduleTimerActiveDays(void) const; + uint8_t getTimerActiveDaysBitmap(void) const; + + using IRArgoACBase::getMessageType; + static argoIrMessageType_t getMessageType(const ArgoProtocolWREM3& raw); + + String toString(void) const; + stdAc::state_t toCommon(void) const; + + static bool hasValidPreamble(const uint8_t state[], const uint16_t length); + + public: +#if DECODE_ARGO + static bool isValidWrem3Message(const uint8_t state[], const uint16_t nbits, + bool verifyChecksum = true); +#endif }; #endif // IR_ARGO_H_ diff --git a/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/src/ir_Carrier.cpp b/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/src/ir_Carrier.cpp index 42b45f9ab..ef51cc439 100644 --- a/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/src/ir_Carrier.cpp +++ b/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/src/ir_Carrier.cpp @@ -46,6 +46,15 @@ const uint16_t kCarrierAc64OneSpace = 1736; const uint16_t kCarrierAc64ZeroSpace = 615; const uint32_t kCarrierAc64Gap = kDefaultMessageGap; // A guess. +//< @see: https://github.com/crankyoldgit/IRremoteESP8266/issues/1943#issue-1519570772 +const uint16_t kCarrierAc84HdrMark = 5850; +const uint16_t kCarrierAc84Zero = 1175; +const uint16_t kCarrierAc84One = 430; +const uint16_t kCarrierAc84HdrSpace = kCarrierAc84Zero; +const uint32_t kCarrierAc84Gap = kDefaultMessageGap; // A guess. +const uint8_t kCarrierAc84ExtraBits = 4; +const uint8_t kCarrierAc84ExtraTolerance = 5; + const uint16_t kCarrierAc128HdrMark = 4600; const uint16_t kCarrierAc128HdrSpace = 2600; const uint16_t kCarrierAc128Hdr2Mark = 9300; @@ -645,3 +654,94 @@ bool IRrecv::decodeCarrierAC128(decode_results *results, uint16_t offset, return true; } #endif // DECODE_CARRIER_AC128 + +#if SEND_CARRIER_AC84 +/// Send a Carroer A/C 84 Bit formatted message. +/// Status: BETA / Untested but probably works. +/// @param[in] data The message to be sent. +/// @param[in] nbytes The byte size of the message being sent. +/// @param[in] repeat The number of times the command is to be repeated. +void IRsend::sendCarrierAC84(const uint8_t data[], const uint16_t nbytes, + const uint16_t repeat) { + // Protocol uses a constant bit time encoding. + for (uint16_t r = 0; r <= repeat; r++) { + if (nbytes) { + // The least significant `kCarrierAc84ExtraBits` bits of the first byte + sendGeneric(kCarrierAc84HdrMark, kCarrierAc84HdrSpace, // Header + kCarrierAc84Zero, kCarrierAc84One, // Data + kCarrierAc84One, kCarrierAc84Zero, + 0, 0, // No footer + GETBITS64(data[0], 0, kCarrierAc84ExtraBits), + kCarrierAc84ExtraBits, + 38000, false, 0, 33); + // The rest of the data. + sendGeneric(0, 0, // No Header + kCarrierAc84Zero, kCarrierAc84One, // Data + kCarrierAc84One, kCarrierAc84Zero, + kCarrierAc84Zero, kDefaultMessageGap, // Footer + data + 1, nbytes - 1, 38000, false, 0, 33); + } + } +} +#endif // SEND_CARRIER_AC84 + +#if DECODE_CARRIER_AC84 +/// Decode the supplied Carroer A/C 84 Bit formatted message. +/// Status: STABLE / Confirmed Working. +/// @param[in,out] results Ptr to the data to decode & where to store the decode +/// result. +/// @param[in] offset The starting index to use when attempting to decode the +/// raw data. Typically/Defaults to kStartOffset. +/// @param[in] nbits The number of data bits to expect. +/// @param[in] strict Flag indicating if we should perform strict matching. +/// @return A boolean. True if it can decode it, false if it can't. +bool IRrecv::decodeCarrierAC84(decode_results *results, uint16_t offset, + const uint16_t nbits, const bool strict) { + // Check if we have enough data to even possibly match. + if (results->rawlen < 2 * nbits + kHeader + kFooter - 1 + offset) + return false; // Can't possibly be a valid Carrier message. + // Compliance check. + if (strict && nbits != kCarrierAc84Bits) return false; + + // This decoder expects to decode an unusual number of bits. Check before we + // start. + if (nbits % 8 != kCarrierAc84ExtraBits) return false; + + uint64_t data = 0; + uint16_t used = 0; + + // Header + Data (kCarrierAc84ExtraBits only) + used = matchGenericConstBitTime(results->rawbuf + offset, &data, + results->rawlen - offset, + kCarrierAc84ExtraBits, + // Header (None) + kCarrierAc84HdrMark, kCarrierAc84HdrSpace, + // Data + kCarrierAc84Zero, kCarrierAc84One, + // No Footer + 0, 0, + false, + _tolerance + kCarrierAc84ExtraTolerance, + kMarkExcess, false); + if (!used) return false; + // Stuff the captured data so far into the first byte of the state. + *results->state = data; + offset += used; + // Capture the rest of the data as normal as we should be on a byte boundary. + // Data + Footer + if (!matchGeneric(results->rawbuf + offset, results->state + 1, + results->rawlen - offset, nbits - kCarrierAc84ExtraBits, + 0, 0, // No Header expected. + kCarrierAc84Zero, kCarrierAc84One, // Data + kCarrierAc84One, kCarrierAc84Zero, + kCarrierAc84Zero, kDefaultMessageGap, true, + _tolerance + kCarrierAc84ExtraTolerance, + kMarkExcess, false)) return false; + + // Success + results->decode_type = decode_type_t::CARRIER_AC84; + results->bits = nbits; + results->repeat = false; + return true; +} +#endif // DECODE_CARRIER_AC84 diff --git a/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/src/ir_Carrier.h b/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/src/ir_Carrier.h index c642c51e5..7554a45ba 100644 --- a/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/src/ir_Carrier.h +++ b/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/src/ir_Carrier.h @@ -4,6 +4,7 @@ /// @see https://github.com/crankyoldgit/IRremoteESP8266/issues/1127 /// @see https://docs.google.com/spreadsheets/d/1EZy78L0cn1KDIX1aKq2biptejFqCjD5HO3tLiRvXf48/edit#gid=0 /// @see https://github.com/crankyoldgit/IRremoteESP8266/issues/1797 +/// @see https://github.com/crankyoldgit/IRremoteESP8266/issues/1943 // Supports: // Brand: Carrier/Surrey, Model: 42QG5A55970 remote @@ -13,6 +14,8 @@ // Brand: Carrier/Surrey, Model: 619EGX0220E0 A/C // Brand: Carrier/Surrey, Model: 53NGK009/012 Inverter // Brand: Carrier, Model: 40GKX0E2006 remote (CARRIER_AC128) +// Brand: Carrier, Model: 3021203 RR03-S-Remote (CARRIER_AC84) +// Brand: Carrier, Model: 342WM100CT A/C (CARRIER_AC84) #ifndef IR_CARRIER_H_ #define IR_CARRIER_H_ diff --git a/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/src/ir_Coolix.cpp b/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/src/ir_Coolix.cpp index 755e89190..3fb4e8d0a 100644 --- a/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/src/ir_Coolix.cpp +++ b/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/src/ir_Coolix.cpp @@ -548,6 +548,8 @@ stdAc::state_t IRCoolixAC::toCommon(const stdAc::state_t *prev) const { // Back to "normal" stateful messages. result.mode = toCommonMode(getMode()); result.degrees = getTemp(); + result.sensorTemperature = getSensorTemp(); + result.iFeel = getZoneFollow(); result.fanspeed = toCommonFanSpeed(getFan()); return result; } diff --git a/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/src/ir_Coolix.h b/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/src/ir_Coolix.h index 2155b54b0..d711367b2 100644 --- a/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/src/ir_Coolix.h +++ b/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/src/ir_Coolix.h @@ -165,6 +165,7 @@ class IRCoolixAC { static stdAc::fanspeed_t toCommonFanSpeed(const uint8_t speed); stdAc::state_t toCommon(const stdAc::state_t *prev = NULL) const; String toString(void) const; + void setZoneFollow(const bool on); #ifndef UNIT_TEST private: @@ -189,7 +190,6 @@ class IRCoolixAC { void setTempRaw(const uint8_t code); uint8_t getTempRaw(void) const; void setSensorTempRaw(const uint8_t code); - void setZoneFollow(const bool on); bool isSpecialState(void) const; bool handleSpecialState(const uint32_t data); void updateAndSaveState(const uint32_t raw_state); diff --git a/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/src/ir_Ecoclim.cpp b/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/src/ir_Ecoclim.cpp index 983913d38..e24559b5f 100644 --- a/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/src/ir_Ecoclim.cpp +++ b/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/src/ir_Ecoclim.cpp @@ -365,6 +365,7 @@ stdAc::state_t IREcoclimAc::toCommon(void) const { result.mode = toCommonMode(getMode()); result.celsius = true; result.degrees = getTemp(); + result.sensorTemperature = getSensorTemp(); result.fanspeed = toCommonFanSpeed(_.Fan); result.sleep = (getMode() == kEcoclimSleep) ? 0 : -1; result.clock = getClock(); diff --git a/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/src/ir_Electra.cpp b/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/src/ir_Electra.cpp index f0882bc6d..f8edf9729 100644 --- a/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/src/ir_Electra.cpp +++ b/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/src/ir_Electra.cpp @@ -365,6 +365,7 @@ stdAc::state_t IRElectraAc::toCommon(void) const { result.mode = toCommonMode(_.Mode); result.celsius = true; result.degrees = getTemp(); + result.sensorTemperature = getSensorTemp(); result.fanspeed = toCommonFanSpeed(_.Fan); result.swingv = getSwingV() ? stdAc::swingv_t::kAuto : stdAc::swingv_t::kOff; @@ -373,6 +374,7 @@ stdAc::state_t IRElectraAc::toCommon(void) const { result.light = getLightToggle(); result.turbo = _.Turbo; result.clean = _.Clean; + result.iFeel = getIFeel(); // Not supported. result.model = -1; // No models used. result.quiet = false; diff --git a/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/src/ir_Electra.h b/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/src/ir_Electra.h index 142b52562..602406d8d 100644 --- a/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/src/ir_Electra.h +++ b/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/src/ir_Electra.h @@ -14,6 +14,7 @@ // Brand: Centek, Model: SCT-65Q09 A/C // Brand: Centek, Model: YKR-P/002E remote // Brand: AEG, Model: Chillflex Pro AXP26U338CW A/C +// Brand: Electrolux, Model: YKR-H/531E A/C #ifndef IR_ELECTRA_H_ #define IR_ELECTRA_H_ diff --git a/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/src/ir_Gorenje.cpp b/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/src/ir_Gorenje.cpp new file mode 100644 index 000000000..f93e4e231 --- /dev/null +++ b/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/src/ir_Gorenje.cpp @@ -0,0 +1,71 @@ +// Copyright 2022 Mateusz Bronk (mbronk) +/// @file +/// @brief Support for the Gorenje cooker hood IR protocols. +/// @see https://techfresh.pl/wp-content/uploads/2017/08/Gorenje-DKF-2600-MWT.pdf +/// @see https://github.com/crankyoldgit/IRremoteESP8266/issues/1887 + +// Supports: +// Brand: Gorenje, Model: DKF 2600 MWT Cooker Hood + +#include "IRrecv.h" +#include "IRsend.h" +#include "IRutils.h" + +const uint32_t kGorenjeMinGap = 100000U; // 0.1s +const uint16_t kGorenjeHdrMark = 0; +const uint32_t kGorenjeHdrSpace = 0; +const uint16_t kGorenjeBitMark = 1300; +const uint32_t kGorenjeOneSpace = 5700; +const uint32_t kGorenjeZeroSpace = 1700; +const uint16_t kGorenjeFreq = 38000; // Hz +const uint16_t kGorenjeTolerance = 7; // % + +#if SEND_GORENJE +/// Send a Gorenje Cooker Hood formatted message. +/// Status: STABLE / Known working. +/// @param[in] data containing the IR command to be sent. +/// @param[in] nbits Nr. of bits of the message to send. usually kGorenjeBits +/// @param[in] repeat Nr. of times the message is to be repeated. +void IRsend::sendGorenje(const uint64_t data, const uint16_t nbits, + const uint16_t repeat) { + sendGeneric(kGorenjeHdrMark, kGorenjeHdrSpace, + kGorenjeBitMark, kGorenjeOneSpace, + kGorenjeBitMark, kGorenjeZeroSpace, + kGorenjeBitMark, kGorenjeMinGap, + data, nbits, kGorenjeFreq, true, repeat, kDutyDefault); +} +#endif // SEND_GORENJE + +#if DECODE_GORENJE +/// Decode the supplied Gorenje Cooker Hood message. +/// Status: STABLE / Known working. +/// @param[in,out] results Ptr to the data to decode & where to store the +/// decoded result +/// @param[in] offset The starting index to use when attempting to decode the +/// raw data. Typically/Defaults to kStartOffset. +/// @param[in] nbits The number of data bits to expect. +/// @param[in] strict Flag indicating if we should perform strict matching. +/// @return A boolean. True if it can decode it, false if it can't. +bool IRrecv::decodeGorenje(decode_results *results, uint16_t offset, + const uint16_t nbits, const bool strict) { + if (strict && nbits != kGorenjeBits) + return false; // We expect Gorenje to be a certain sized message. + + uint64_t data = 0; + if (!matchGeneric(results->rawbuf + offset, &data, + results->rawlen - offset, nbits, + kGorenjeHdrMark, kGorenjeHdrSpace, + kGorenjeBitMark, kGorenjeOneSpace, + kGorenjeBitMark, kGorenjeZeroSpace, + kGorenjeBitMark, kGorenjeMinGap, + true, kGorenjeTolerance)) return false; + + // Matched! + results->bits = nbits; + results->value = data; + results->decode_type = decode_type_t::GORENJE; + results->command = 0; + results->address = 0; + return true; +} +#endif // DECODE_GORENJE diff --git a/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/src/ir_Gree.cpp b/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/src/ir_Gree.cpp index ead7178e3..2c44cfe52 100644 --- a/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/src/ir_Gree.cpp +++ b/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/src/ir_Gree.cpp @@ -591,6 +591,8 @@ stdAc::state_t IRGreeAC::toCommon(void) { result.mode = toCommonMode(_.Mode); result.celsius = !_.UseFahrenheit; result.degrees = getTemp(); + // no support for Sensor temp. + result.iFeel = getIFeel(); result.fanspeed = toCommonFanSpeed(_.Fan); if (_.SwingAuto) result.swingv = stdAc::swingv_t::kAuto; diff --git a/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/src/ir_Midea.cpp b/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/src/ir_Midea.cpp index 4fbc07973..80acfcda3 100644 --- a/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/src/ir_Midea.cpp +++ b/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/src/ir_Midea.cpp @@ -679,6 +679,7 @@ stdAc::state_t IRMideaAC::toCommon(const stdAc::state_t *prev) { result.mode = toCommonMode(_.Mode); result.celsius = !_.useFahrenheit; result.degrees = getTemp(result.celsius); + result.sensorTemperature = getSensorTemp(result.celsius); result.fanspeed = toCommonFanSpeed(_.Fan); result.sleep = _.Sleep ? 0 : -1; result.econo = getEconoToggle(); diff --git a/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/src/ir_Mirage.cpp b/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/src/ir_Mirage.cpp index e3e7c60d3..b7d6ce42d 100644 --- a/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/src/ir_Mirage.cpp +++ b/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/src/ir_Mirage.cpp @@ -740,6 +740,7 @@ stdAc::state_t IRMirageAc::toCommon(void) const { result.mode = toCommonMode(_.Mode); result.celsius = true; result.degrees = getTemp(); + result.sensorTemperature = getSensorTemp(); result.fanspeed = toCommonFanSpeed(getFan(), _model); result.swingv = toCommonSwingV(getSwingV()); result.swingh = getSwingH() ? stdAc::swingh_t::kAuto : stdAc::swingh_t::kOff; @@ -750,6 +751,7 @@ stdAc::state_t IRMirageAc::toCommon(void) const { result.sleep = getSleep() ? 0 : -1; result.quiet = getQuiet(); result.clock = getClock() / 60; + result.iFeel = getIFeel(); // Not supported. result.econo = false; result.beep = false; @@ -775,10 +777,14 @@ void IRMirageAc::fromCommon(const stdAc::state_t state) { setFilter(state.filter); // setClock() expects seconds, not minutes. setClock((state.clock > 0) ? state.clock * 60 : 0); + setIFeel(state.iFeel); + if (state.sensorTemperature != kNoTempValue) { + setSensorTemp(state.celsius ? state.sensorTemperature + : fahrenheitToCelsius(state.sensorTemperature)); + } // Non-common settings. setOnTimer(0); setOffTimer(0); - setIFeel(false); } /// Convert the internal state into a human readable string. diff --git a/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/src/ir_Mitsubishi.h b/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/src/ir_Mitsubishi.h index 85e61eefd..4f9954f8b 100644 --- a/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/src/ir_Mitsubishi.h +++ b/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/src/ir_Mitsubishi.h @@ -36,6 +36,7 @@ // Brand: Mitsubishi Electric, Model: MSZ-ZW4017S A/C (MITSUBISHI_AC) // Brand: Mitsubishi Electric, Model: MSZ-FHnnVE A/C (MITSUBISHI_AC) // Brand: Mitsubishi Electric, Model: RH151 remote (MITSUBISHI_AC) +// Brand: Mitsubishi Electric, Model: PAR-FA32MA remote (MITSUBISHI136) #ifndef IR_MITSUBISHI_H_ #define IR_MITSUBISHI_H_ diff --git a/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/src/ir_Panasonic.cpp b/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/src/ir_Panasonic.cpp index a0a0b6b23..82acaac71 100644 --- a/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/src/ir_Panasonic.cpp +++ b/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/src/ir_Panasonic.cpp @@ -128,8 +128,15 @@ uint64_t IRsend::encodePanasonic(const uint16_t manufacturer, bool IRrecv::decodePanasonic(decode_results *results, uint16_t offset, const uint16_t nbits, const bool strict, const uint32_t manufacturer) { - if (strict && nbits != kPanasonicBits) - return false; // Request is out of spec. + if (strict) { // Compliance checks + switch (nbits) { + case kPanasonic40Bits: + case kPanasonicBits: + break; + default: + return false; // Request is out of spec. + } + } uint64_t data = 0; @@ -147,8 +154,10 @@ bool IRrecv::decodePanasonic(decode_results *results, uint16_t offset, if (address != manufacturer) // Verify the Manufacturer code. return false; // Verify the checksum. - uint8_t checksumOrig = data; - uint8_t checksumCalc = (data >> 24) ^ (data >> 16) ^ (data >> 8); + const uint8_t checksumOrig = data; + uint8_t checksumCalc = (data >> 16) ^ (data >> 8); + if (nbits != kPanasonic40Bits) + checksumCalc ^= (data >> 24); if (checksumOrig != checksumCalc) return false; } diff --git a/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/src/ir_Sanyo.cpp b/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/src/ir_Sanyo.cpp index 4a38e8e09..4b99d0492 100644 --- a/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/src/ir_Sanyo.cpp +++ b/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/src/ir_Sanyo.cpp @@ -622,10 +622,12 @@ stdAc::state_t IRSanyoAc::toCommon(void) const { result.mode = toCommonMode(_.Mode); result.celsius = true; result.degrees = getTemp(); + result.sensorTemperature = getSensorTemp(); result.fanspeed = toCommonFanSpeed(_.Fan); result.sleep = _.Sleep ? 0 : -1; result.swingv = toCommonSwingV(_.SwingV); result.beep = _.Beep; + result.iFeel = !getSensor(); // Not supported. result.swingh = stdAc::swingh_t::kOff; result.turbo = false; @@ -762,13 +764,13 @@ void IRSanyoAc88::stateReset(void) { /// Set up hardware to be able to send a message. void IRSanyoAc88::begin(void) { _irsend.begin(); } -#if SEND_SANYO_AC +#if SEND_SANYO_AC88 /// Send the current internal state as IR messages. /// @param[in] repeat Nr. of times the message will be repeated. void IRSanyoAc88::send(const uint16_t repeat) { _irsend.sendSanyoAc88(getRaw(), kSanyoAc88StateLength, repeat); } -#endif // SEND_SANYO_AC +#endif // SEND_SANYO_AC88 /// Get a PTR to the internal state/code for this protocol with all integrity /// checks passing. diff --git a/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/src/ir_Wowwee.cpp b/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/src/ir_Wowwee.cpp new file mode 100644 index 000000000..d999f0c4b --- /dev/null +++ b/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/src/ir_Wowwee.cpp @@ -0,0 +1,91 @@ +// Copyright 2022 David Conran + +/// @file +/// @brief Support for WowWee RoboRapter protocol +/// @see https://github.com/crankyoldgit/IRremoteESP8266/issues1938 + +// Supports: +// Brand: WowWee, Model: RoboRapter-X + +// WowWee RoboRapter-X messages +// Ref: https://github.com/crankyoldgit/IRremoteESP8266/issues/1938#issuecomment-1367968228 +// +// Button Code +// ====== ===== +// Left 0x180 +// Forward 0x186 +// Backward 0x187 +// Right 0x188 +// Stop 0x18E +// Head Counterclockwise 0x191 +// Tail Left 0x192 +// Tail Right 0x193 +// Head Clockwise 0x194 +// Guard Mode 0x1B0 +// Roam 0x1B1 +// Cautious Mood 0x1B2 +// Playful Mood 0x1B3 +// Hunting Mood 0x1B4 +// Demo 0x1D0 +// Bite 0x1D1 + +#include +#include "IRrecv.h" +#include "IRsend.h" +#include "IRutils.h" + +// Constants +const uint16_t kWowweeHdrMark = 6684; +const uint16_t kWowweeHdrSpace = 723; +const uint16_t kWowweeBitMark = 912; +const uint16_t kWowweeOneSpace = 3259; +const uint16_t kWowweeZeroSpace = kWowweeHdrSpace; +const uint16_t kWowweeFreq = 38000; // Hz. (Just a guess) + + +#if SEND_WOWWEE +/// Send a WowWee formatted message. +/// Status: STABLE / Confirmed working with real device. +/// @param[in] data The message to be sent. +/// @param[in] nbits The number of bits of message to be sent. +/// @param[in] repeat The number of times the command is to be repeated. +void IRsend::sendWowwee(uint64_t data, uint16_t nbits, uint16_t repeat) { + sendGeneric(kWowweeHdrMark, kWowweeHdrSpace, + kWowweeBitMark, kWowweeOneSpace, + kWowweeBitMark, kWowweeZeroSpace, + kWowweeBitMark, kDefaultMessageGap, data, + nbits, kWowweeFreq, true, repeat, 33); +} +#endif // SEND_WOWWEE + +#if DECODE_WOWWEE +/// Decode the supplied WowWee message. +/// Status: STABLE / Confirmed working with real device. +/// @param[in,out] results Ptr to the data to decode & where to store the result +/// @param[in] offset The starting index to use when attempting to decode the +/// raw data. Typically/Defaults to kStartOffset. +/// @param[in] nbits The number of data bits to expect. +/// @param[in] strict Flag indicating if we should perform strict matching. +bool IRrecv::decodeWowwee(decode_results *results, uint16_t offset, + const uint16_t nbits, const bool strict) { + if (strict && nbits != kWowweeBits) + return false; // We expect Wowwee to be a certain sized message. + + uint64_t data = 0; + + // Match Header + Data + Footer + if (!matchGeneric(results->rawbuf + offset, &data, + results->rawlen - offset, nbits, + kWowweeHdrMark, kWowweeHdrSpace, + kWowweeBitMark, kWowweeOneSpace, + kWowweeBitMark, kWowweeZeroSpace, + kWowweeBitMark, kDefaultMessageGap, true)) return false; + // Success + results->bits = nbits; + results->value = data; + results->decode_type = WOWWEE; + results->command = 0; + results->address = 0; + return true; +} +#endif // DECODE_WOWWEE diff --git a/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/src/ir_Xmp.cpp b/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/src/ir_Xmp.cpp index 29d7f6c1b..5d9da4c52 100644 --- a/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/src/ir_Xmp.cpp +++ b/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/src/ir_Xmp.cpp @@ -115,7 +115,7 @@ using IRXmpUtils::adjustRepeat; #if SEND_XMP /// Send a XMP packet. -/// Status: Beta / Untested against a real device. +/// Status: STABLE / Confirmed working against a real device. /// @param[in] data The message to be sent. /// @param[in] nbits The number of bits of message to be sent. /// @param[in] repeat The number of times the command is to be repeated. @@ -150,7 +150,7 @@ void IRsend::sendXmp(const uint64_t data, const uint16_t nbits, #if DECODE_XMP /// Decode the supplied XMP packet/message. -/// Status: BETA / Probably works. +/// Status: STABLE / Confirmed working against a real device. /// @param[in,out] results Ptr to the data to decode & where to store the result /// @param[in] offset The starting index to use when attempting to decode the /// raw data. Typically/Defaults to kStartOffset. diff --git a/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/src/ir_York.cpp b/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/src/ir_York.cpp new file mode 100644 index 000000000..f01729328 --- /dev/null +++ b/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/src/ir_York.cpp @@ -0,0 +1,357 @@ +// Copyright 2022 Daniele Gobbetti + +/// @file +/// @brief Support for the York AC protocol (remote GRYLH2A) + +// Note: Most of the code is autogenerated by the provided tools or assembled +// from other support classes + +#include "ir_York.h" +#include +#include +#ifndef ARDUINO +#include +#endif +#include "IRrecv.h" +#include "IRremoteESP8266.h" +#include "IRsend.h" +#ifdef UNIT_TEST +#include "IRsend_test.h" +#endif +#include "IRtext.h" +#include "IRutils.h" + + +using irutils::addBoolToString; +using irutils::addModeToString; +using irutils::addFanToString; +using irutils::addTempToString; +using irutils::addLabeledString; +using irutils::minsToString; + + +// Constants +const uint16_t kYorkHdrMark = 4887; +const uint16_t kYorkBitMark = 612; +const uint16_t kYorkHdrSpace = 2267; +const uint16_t kYorkOneSpace = 1778; +const uint16_t kYorkZeroSpace = 579; +const uint16_t kYorkFreq = 38000; // Hz. (Guessing the most common frequency.) + +#if SEND_YORK +/// Send a 17 Byte / 136 bit York A/C message. +/// Status: ALPHA / Untested. +/// @param[in] data An array of bytes containing the IR command. +/// @param[in] nbytes Nr. of bytes of data in the array. (>=kStateLength) +/// @param[in] repeat Nr. of times the message is to be repeated. +void IRsend::sendYork(const uint8_t data[], const uint16_t nbytes, + const uint16_t repeat) { + if (nbytes < kYorkStateLength) + return; + sendGeneric(kYorkHdrMark, kYorkHdrSpace, + kYorkBitMark, kYorkOneSpace, + kYorkBitMark, kYorkZeroSpace, + kYorkBitMark, kDefaultMessageGap, + data, nbytes, kYorkFreq, + false, repeat, kDutyDefault); // false == LSB +} +#endif // SEND_YORK + +#if DECODE_YORK +/// Decode the supplied message. +/// Status: ALPHA / Tested, some values still are not mapped to the internal +/// state of AC +/// @param[in,out] results Ptr to the data to decode & where to store the decode +/// @param[in] offset The starting index to use when attempting to decode the +/// raw data. Typically/Defaults to kStartOffset. +/// @param[in] nbits The number of data bits to expect. +/// @param[in] strict Flag indicating if we should perform strict matching. +/// @return A boolean. True if it can decode it, false if it can't. +bool IRrecv::decodeYork(decode_results *results, uint16_t offset, + const uint16_t nbits, const bool strict) { + if (strict && nbits != kYorkBits) + return false; + + uint16_t used = 0; + + used = matchGeneric(results->rawbuf + offset, results->state, + results->rawlen - offset, nbits, + kYorkHdrMark, kYorkHdrSpace, + kYorkBitMark, kYorkOneSpace, + kYorkBitMark, kYorkZeroSpace, + kYorkBitMark, kDefaultMessageGap, + false, _tolerance, kMarkExcess, + false); // LSB + if (used == 0) return false; // We failed to find any data. + + // Succes + results->decode_type = decode_type_t::YORK; + results->bits = nbits; + + return true; +} +#endif // DECODE_YORK + +// +// +/// Class constructor +/// @param[in] pin GPIO to be used when sending. +/// @param[in] inverted Is the output signal to be inverted? +/// @param[in] use_modulation Is frequency modulation to be used? +IRYorkAc::IRYorkAc(const uint16_t pin, const bool inverted, + const bool use_modulation) + : _irsend(pin, inverted, use_modulation) { + stateReset(); + } + +// Reset the internal state to a fixed known good state. +void IRYorkAc::stateReset() { + // This resets to a known-good state. + setRaw(kYorkKnownGoodState); +} + +/// Set up hardware to be able to send a message. +void IRYorkAc::begin(void) { _irsend.begin(); } + +/// Get the raw state of the object, suitable to be sent with the appropriate +/// IRsend object method. +/// @return A copy of the internal state. +uint8_t *IRYorkAc::getRaw(void) { + calcChecksum(); + return _.raw; +} + +/// Set the internal state from a valid code for this protocol. +/// @param[in] new_code A valid code for this protocol. +/// @param[in] length Length of the code in bytes. +void IRYorkAc::setRaw(const uint8_t new_code[], const uint16_t length) { + std::memcpy(_.raw, new_code, length); +} + +#if SEND_YORK +/// Send the current internal state as an IR message. +/// @param[in] repeat Nr. of times the message will be repeated. +void IRYorkAc::send(const uint16_t repeat) { + _irsend.sendYork(getRaw(), kYorkStateLength, repeat); +} +#endif // SEND_YORK + +/// Get the current operation mode setting. +/// @return The current operation mode. +uint8_t IRYorkAc::getMode(void) const { + return _.Mode; +} + +/// Set the desired operation mode. +/// @param[in] mode The desired operation mode. +void IRYorkAc::setMode(const uint8_t mode) { + switch (mode) { + case kYorkFan: + case kYorkCool: + case kYorkHeat: + case kYorkDry: + _.Mode = mode; + break; + default: + _.Mode = kYorkAuto; + } + setFan(getFan()); // Ensure the fan is at the correct speed for the new mode. +} + +/// Convert a stdAc::opmode_t enum into its native mode. +/// @param[in] mode The enum to be converted. +/// @return The native equivalent of the enum. +uint8_t IRYorkAc::convertMode(const stdAc::opmode_t mode) { + switch (mode) { + case stdAc::opmode_t::kCool: return kYorkCool; + case stdAc::opmode_t::kHeat: return kYorkHeat; + case stdAc::opmode_t::kDry: return kYorkDry; + case stdAc::opmode_t::kFan: return kYorkFan; + default: return kYorkAuto; + } +} + +/// Convert a native mode into its stdAc equivalent. +/// @param[in] mode The native setting to be converted. +/// @return The stdAc equivalent of the native setting. +stdAc::opmode_t IRYorkAc::toCommonMode(const uint8_t mode) { + switch (mode) { + case kYorkCool: return stdAc::opmode_t::kCool; + case kYorkHeat: return stdAc::opmode_t::kHeat; + case kYorkDry: return stdAc::opmode_t::kDry; + case kYorkFan: return stdAc::opmode_t::kFan; + default: return stdAc::opmode_t::kAuto; + } +} + +/// Set the speed of the fan. +/// @param[in] speed The desired setting. +/// @note The fan speed is locked to Low when in Dry mode, to auto when in auto +/// mode. "Fan" mode has no support for "auto" speed. +void IRYorkAc::setFan(const uint8_t speed) { + switch (getMode()) { + case kYorkDry: + _.Fan = kYorkFanLow; + break; + case kYorkFan: + _.Fan = std::min(speed, kYorkFanHigh); + break; + case kYorkAuto: + _.Fan = kYorkFanAuto; + break; + default: + _.Fan = std::min(speed, kYorkFanAuto); + } +} + +/// Get the current fan speed setting. +/// @return The current fan speed. +uint8_t IRYorkAc::getFan(void) const { + return _.Fan; +} + +/// Convert a stdAc::fanspeed_t enum into it's native speed. +/// @param[in] speed The enum to be converted. +/// @return The native equivalent of the enum. +uint8_t IRYorkAc::convertFan(const stdAc::fanspeed_t speed) { + switch (speed) { + case stdAc::fanspeed_t::kMin: + case stdAc::fanspeed_t::kLow: + return kYorkFanLow; + case stdAc::fanspeed_t::kMedium: + return kYorkFanMedium; + case stdAc::fanspeed_t::kHigh: + case stdAc::fanspeed_t::kMax: + return kYorkFanHigh; + default: + return kYorkFanAuto; + } +} + +/// Convert a native fan speed into its stdAc equivalent. +/// @param[in] speed The native setting to be converted. +/// @return The stdAc equivalent of the native setting. +stdAc::fanspeed_t IRYorkAc::toCommonFanSpeed(const uint8_t speed) { + switch (speed) { + case kYorkFanHigh: return stdAc::fanspeed_t::kMax; + case kYorkFanMedium: return stdAc::fanspeed_t::kMedium; + case kYorkFanLow: return stdAc::fanspeed_t::kMin; + default: return stdAc::fanspeed_t::kAuto; + } +} + +/// Set the temperature. +/// @param[in] degrees The temperature in degrees celsius. +void IRYorkAc::setTemp(const uint8_t degrees) { + _.Temp = std::min(kYorkMaxTemp, std::max(kYorkMinTemp, degrees)); +} + +/// Get the current temperature setting. +/// @return Get current setting for temp. in degrees celsius. +uint8_t IRYorkAc::getTemp(void) const { + return _.Temp; +} + +/// Set the On Timer value of the A/C. +/// @param[in] nr_of_mins The number of minutes the timer should be. +/// @note The timer time only has a resolution of 10 mins. +/// @note Setting the On Timer active will cancel the Sleep timer/setting. +void IRYorkAc::setOnTimer(const uint16_t nr_of_mins) { + _.OnTimer = nr_of_mins / 10; +} + +/// Set the Off Timer value of the A/C. +/// @param[in] nr_of_mins The number of minutes the timer should be. +/// @note The timer time only has a resolution of 10 mins. +/// @note Setting the Off Timer active will cancel the Sleep timer/setting. +void IRYorkAc::setOffTimer(const uint16_t nr_of_mins) { + _.OffTimer = nr_of_mins / 10; +} + + +/// Get the On Timer setting of the A/C. +/// @return The Nr. of minutes the On Timer is set for. +uint16_t IRYorkAc::getOnTimer(void) const { + return _.OnTimer * 10; +} + +/// Get the Off Timer setting of the A/C. +/// @return The Nr. of minutes the Off Timer is set for. +/// @note Sleep & Off Timer share the same timer. +uint16_t IRYorkAc::getOffTimer(void) const { + return _.OffTimer * 10; +} + +/// CRC16-16 (a.k.a. CRC-16-IBM) +void IRYorkAc::calcChecksum() { + uint8_t length = 14; + uint16_t reg_crc = 0x0000; + uint8_t* data = _.raw; + while (length--) { + reg_crc ^= *data++; + for (uint16_t index = 0; index < 8; index++) { + if (reg_crc & 0x01) { + reg_crc = (reg_crc>>1) ^ 0xA001; + } else { + reg_crc = reg_crc >>1; + } + } + } + _.Chk1 = (reg_crc & 0xff); + _.Chk2 = ((reg_crc >> 8) & 0x00ff); +} + +/// Convert the current internal state into its stdAc::state_t equivalent. +/// @param[in] prev Ptr to the previous state if required. +/// @return The stdAc equivalent of the native settings. +stdAc::state_t IRYorkAc::toCommon(const stdAc::state_t *prev) const { + stdAc::state_t result{}; + // Start with the previous state if given it. + if (prev != NULL) { + result = *prev; + } else { + // Set defaults for non-zero values that are not implicitly set for when + // there is no previous state. + // e.g. Any setting that toggles should probably go here. + result.power = false; + } + result.protocol = decode_type_t::YORK; + result.mode = toCommonMode(_.Mode); + result.celsius = true; + result.degrees = getTemp(); + result.fanspeed = toCommonFanSpeed(_.Fan); + result.swingv = _.SwingV ? stdAc::swingv_t::kAuto : stdAc::swingv_t::kOff; + result.sleep = getOffTimer(); + // Not supported. + result.model = -1; + result.turbo = false; + result.swingh = stdAc::swingh_t::kOff; + result.light = false; + result.filter = false; + result.econo = false; + result.quiet = false; + result.clean = false; + result.beep = false; + result.clock = -1; + return result; +} + +/// Convert the current internal state into a human readable string. +/// @return A human readable string. +String IRYorkAc::toString(void) const { + String result = ""; + result.reserve(70); // Reserve some heap for the string to reduce fragging. + result += addBoolToString(_.Power, kPowerStr, false); + + result += addModeToString(_.Mode, kYorkAuto, kYorkCool, + kYorkHeat, kYorkDry, kYorkFan); + result += addFanToString(_.Fan, kYorkFanHigh, kYorkFanLow, + kYorkFanAuto, kYorkFanAuto, + kYorkFanMedium); + result += addTempToString(getTemp(), true); + result += addBoolToString(_.SwingV, kSwingVStr); + result += addLabeledString(minsToString(getOnTimer()), kOnTimerStr); + result += addLabeledString(minsToString(getOffTimer()), kOffTimerStr); + + return result; +} diff --git a/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/src/ir_York.h b/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/src/ir_York.h new file mode 100644 index 000000000..3de56bb89 --- /dev/null +++ b/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/src/ir_York.h @@ -0,0 +1,137 @@ +// Copyright 2022 Daniele Gobbetti + +/// @file +/// @brief Support for the York AC protocol (remote GRYLH2A) + +// Supports: +// Brand: York, Model: MHH07P17 A/C +// Brand: York, Model: GRYLH2A remote + +#ifndef IR_YORK_H_ +#define IR_YORK_H_ + +#define __STDC_LIMIT_MACROS +#include +#ifndef UNIT_TEST +#include +#endif +#include "IRremoteESP8266.h" +#include "IRsend.h" +#ifdef UNIT_TEST +#include "IRsend_test.h" +#endif + + +/// Native representation of a York A/C message. +union YorkProtocol{ + uint8_t raw[kYorkStateLength]; ///< The state of the IR remote. + struct { + // byte 0-5 + uint8_t preamble[6]; // unknown, fixed 0x08, 0x10, 0x07, 0x02, 0x40, 0x08 + // byte 6 + uint8_t Key1 :4; // key pressed on the remote: 1 power, 2 temp up, 3 + // temp down... + uint8_t Key2 :4; // only set when setting ontime/offtime: + // Key1 value is 0x6 (enter key) and Key2 is 0x3 for + // "start" and 0x2 for "stop" + // byte 7 + uint8_t Fan :4; // Fan speed: 1 low, 2 mid, 3 max, 8 auto + uint8_t Power :1; // main unit power: 1 on, 0 off + uint8_t :3; + // byte 8 + uint8_t Mode :4; // 1 heat, 2 cool, 3 dry, 4 fan, 8 auto + uint8_t :4; + // byte 9 + uint8_t :2; + uint8_t Temp :6; // Degrees Celsius + // byte 10 + uint8_t OffTimer :8; // Power off time: 10s of minutes from now + // byte 11 + uint8_t OnTimer :8; // Power on time: 10s of minutes from now + // byte 12 + uint8_t :8; // unknown, normally 0x00, could be 0x08 when ontime + // set, 0x88 if both on and offtime set, 0x60 if + // sleep mode set + // byte 13 + uint8_t SwingV :1; // 0 off, 1 on + uint8_t :7; + // byte 14 + uint8_t :8; // checksum preamble, fixed 0xEC + // byte 15-16 + uint8_t Chk1 :8; // checksum, algorithm CRC-16/ARC, first byte + uint8_t Chk2 :8; // checksum, algorithm CRC-16/ARC, second byte + }; +}; + +// Constants +const uint8_t kYorkKnownGoodState[kYorkStateLength] = { + 0x08, 0x10, 0x07, 0x02, 0x40, 0x08, + 0x03, 0x18, 0x01, 0x60, 0x00, 0x00, 0x00, 0x00, + 0xEC, + 0xF5, 0xF2}; // Mode "Heat", Fan Speed "auto", Temp: 24, Power: on + +// Temperature +const uint8_t kYorkMinTemp = 18; // Celsius +const uint8_t kYorkMaxTemp = 32; // Celsius +// Fan +const uint8_t kYorkFanLow = 1; +const uint8_t kYorkFanMedium = 2; +const uint8_t kYorkFanHigh = 3; +const uint8_t kYorkFanAuto = 8; +// Modes +const uint8_t kYorkHeat = 1; +const uint8_t kYorkCool = 2; +const uint8_t kYorkDry = 3; +const uint8_t kYorkFan = 4; +const uint8_t kYorkAuto = 8; + +// Classes +/// Class for handling detailed York A/C messages. +class IRYorkAc { + public: + explicit IRYorkAc(const uint16_t pin, const bool inverted = false, + const bool use_modulation = true); + void stateReset(); +#if SEND_YORK + void send(const uint16_t repeat = kNoRepeat); + /// Run the calibration to calculate uSec timing offsets for this platform. + /// @return The uSec timing offset needed per modulation of the IR Led. + /// @note This will produce a 65ms IR signal pulse at 38kHz. + /// Only ever needs to be run once per object instantiation, if at all. + int8_t calibrate(void) { return _irsend.calibrate(); } +#endif // SEND_YORK + void begin(); + void setPowerToggle(const bool on); + bool getPowerToggle() const; + void setTemp(const uint8_t temp); + uint8_t getTemp() const; + void setFan(const uint8_t speed); + uint8_t getFan() const; + void setMode(const uint8_t mode); + uint8_t getMode() const; + uint16_t getOnTimer(void) const; + uint16_t getOffTimer(void) const; + void setOnTimer(const uint16_t mins); + void setOffTimer(const uint16_t mins); + uint8_t* getRaw(); + void setRaw(const uint8_t new_code[], + const uint16_t length = kYorkStateLength); + static uint8_t convertMode(const stdAc::opmode_t mode); + static uint8_t convertFan(const stdAc::fanspeed_t speed); + void calcChecksum(); + static stdAc::opmode_t toCommonMode(const uint8_t mode); + static stdAc::fanspeed_t toCommonFanSpeed(const uint8_t speed); + stdAc::state_t toCommon(const stdAc::state_t *prev = NULL) const; + String toString() const; +#ifndef UNIT_TEST + + private: + IRsend _irsend; ///< Instance of the IR send class +#else + /// @cond IGNORE + IRsendTest _irsend; ///< Instance of the testing IR send class + /// @endcond +#endif + YorkProtocol _; +}; +#endif // IR_YORK_H_ diff --git a/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/src/locale/defaults.h b/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/src/locale/defaults.h index 40b85c27c..438cc5da3 100644 --- a/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/src/locale/defaults.h +++ b/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/src/locale/defaults.h @@ -310,6 +310,9 @@ D_STR_INDIRECT " " D_STR_MODE #ifndef D_STR_LOCK #define D_STR_LOCK "Lock" #endif // D_STR_LOCK +#ifndef D_STR_REPORT +#define D_STR_REPORT "Report" +#endif // D_STR_REPORT #ifndef D_STR_AUTO #define D_STR_AUTO "Auto" @@ -378,6 +381,9 @@ D_STR_INDIRECT " " D_STR_MODE #ifndef D_STR_MEDIUM #define D_STR_MEDIUM "Medium" #endif // D_STR_MEDIUM +#ifndef D_STR_MED_HIGH +#define D_STR_MED_HIGH D_STR_MED "-" D_STR_HIGH +#endif // D_STR_MED_HIGH #ifndef D_STR_HIGHEST #define D_STR_HIGHEST "Highest" @@ -445,6 +451,33 @@ D_STR_INDIRECT " " D_STR_MODE #ifndef D_STR_BOTTOM #define D_STR_BOTTOM "Bottom" #endif // D_STR_BOTTOM +#ifndef D_STR_UPPER_MIDDLE +#define D_STR_UPPER_MIDDLE D_STR_UPPER "-" D_STR_MIDDLE +#endif // D_STR_UPPER_MIDDLE +#ifndef D_STR_CONFIG +#define D_STR_CONFIG "Config" +#endif // D_STR_CONFIG +#ifndef D_STR_CONTROL +#define D_STR_CONTROL "Control" +#endif // D_STR_CONTROL +#ifndef D_STR_SET_TIMER +#define D_STR_SET_TIMER D_STR_SET " " D_STR_TIMER +#endif // D_STR_AC_TIMER +#ifndef D_STR_SCHEDULE +#define D_STR_SCHEDULE "Schedule" +#endif // D_STR_SCHEDULE +#ifndef D_STR_CH +#define D_STR_CH "CH#" +#endif // D_STR_CH +#ifndef D_STR_TIMER_ACTIVE_DAYS +#define D_STR_TIMER_ACTIVE_DAYS "TimerActiveDays" +#endif // D_STR_TIMER_ACTIVE_DAYS +#ifndef D_STR_KEY +#define D_STR_KEY "Key" +#endif // D_STR_KEY +#ifndef D_STR_VALUE +#define D_STR_VALUE "Value" +#endif // D_STR_VALUE // Compound words/phrases/descriptions from pre-defined words. // Note: Obviously these need to be defined *after* their component words. @@ -472,6 +505,9 @@ D_STR_INDIRECT " " D_STR_MODE #ifndef D_STR_DISPLAYTEMP #define D_STR_DISPLAYTEMP D_STR_DISPLAY " " D_STR_TEMP #endif // D_STR_DISPLAYTEMP +#ifndef D_STR_IFEELREPORT +#define D_STR_IFEELREPORT D_STR_IFEEL " " D_STR_REPORT +#endif // D_STR_IFEELREPORT #ifndef D_STR_SENSORTEMP #define D_STR_SENSORTEMP D_STR_SENSOR " " D_STR_TEMP #endif // D_STR_SENSORTEMP @@ -689,6 +725,12 @@ D_STR_INDIRECT " " D_STR_MODE #ifndef D_STR_DG11J191 #define D_STR_DG11J191 "DG11J191" #endif // D_STR_DG11J191 +#ifndef D_STR_ARGO_WREM2 +#define D_STR_ARGO_WREM2 "WREM2" +#endif // D_STR_ARGO_WREM2 +#ifndef D_STR_ARGO_WREM3 +#define D_STR_ARGO_WREM3 "WREM3" +#endif // D_STR_ARGO_WREM3 // Protocols Names #ifndef D_STR_AIRTON @@ -727,6 +769,9 @@ D_STR_INDIRECT " " D_STR_MODE #ifndef D_STR_CARRIER_AC64 #define D_STR_CARRIER_AC64 D_STR_CARRIER_AC "64" #endif // D_STR_CARRIER_AC64 +#ifndef D_STR_CARRIER_AC84 +#define D_STR_CARRIER_AC84 D_STR_CARRIER_AC "84" +#endif // D_STR_CARRIER_AC84 #ifndef D_STR_CARRIER_AC128 #define D_STR_CARRIER_AC128 D_STR_CARRIER_AC "128" #endif // D_STR_CARRIER_AC128 @@ -808,6 +853,9 @@ D_STR_INDIRECT " " D_STR_MODE #ifndef D_STR_GOODWEATHER #define D_STR_GOODWEATHER "GOODWEATHER" #endif // D_STR_GOODWEATHER +#ifndef D_STR_GORENJE +#define D_STR_GORENJE "GORENJE" +#endif // D_STR_GORENJE #ifndef D_STR_GREE #define D_STR_GREE "GREE" #endif // D_STR_GREE @@ -1060,9 +1108,15 @@ D_STR_INDIRECT " " D_STR_MODE #ifndef D_STR_WHYNTER #define D_STR_WHYNTER "WHYNTER" #endif // D_STR_WHYNTER +#ifndef D_STR_WOWWEE +#define D_STR_WOWWEE "WOWWEE" +#endif // D_STR_WOWWEE #ifndef D_STR_XMP #define D_STR_XMP "XMP" #endif // D_STR_XMP +#ifndef D_STR_YORK +#define D_STR_YORK "YORK" +#endif // D_STR_YORK #ifndef D_STR_ZEPEAL #define D_STR_ZEPEAL "ZEPEAL" #endif // D_STR_ZEPEAL diff --git a/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/src/locale/nl-NL.h b/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/src/locale/nl-NL.h new file mode 100644 index 000000000..3cac00b5e --- /dev/null +++ b/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/src/locale/nl-NL.h @@ -0,0 +1,136 @@ +// Copyright 2022 - Stijn (@stijnb1234) +// Locale/language file for Dutch / The Netherlands. +// This file will override the default values located in `defaults.h`. +#ifndef LOCALE_NL_NL_H_ +#define LOCALE_NL_NL_H_ + +#define D_STR_UNKNOWN "ONBEKEND" +#define D_STR_POWER "Stroom" +#define D_STR_PREVIOUS "Vorige" +#define D_STR_ON "Aan" +#define D_STR_OFF "Uit" +#define D_STR_MODE "Modus" +#define D_STR_TOGGLE "Omschakelen" +#define D_STR_SLEEP "Slaap" +#define D_STR_LIGHT "Licht" +#define D_STR_POWERFUL "Sterk" +#define D_STR_QUIET "Rustig" +#define D_STR_ECONO "Eco" +#define D_STR_SWING "Zwaai" +#define D_STR_BEEP "Piep" +#define D_STR_MOULD "Schimmel" +#define D_STR_CLEAN "Reinigen" +#define D_STR_PURIFY "Zuiver" +#define D_STR_TIMER "Timer" +#define D_STR_ONTIMER D_STR_TIMER " " D_STR_ON +#define D_STR_OFFTIMER D_STR_TIMER " " D_STR_OFF +#define D_STR_CLOCK "Klok" +#define D_STR_COMMAND "Commando" +#define D_STR_XFAN "XVentilator" +#define D_STR_HEALTH "Gezondheid" +#define D_STR_IFEEL "IkVoel" +#define D_STR_ISEE "IkZie" +#define D_STR_HUMID "Vochtigheid" +#define D_STR_SAVE "Opslaan" +#define D_STR_EYE "Ogen" +#define D_STR_FOLLOW "Volgen" +#define D_STR_FRESH "Fris" +#define D_STR_HOLD "Houd" +#define D_STR_BUTTON "Knop" +#define D_STR_NIGHT "Nacht" +#define D_STR_SILENT "Stil" +#define D_STR_UP "Omhoog" +#define D_STR_TEMPUP D_STR_TEMP " " D_STR_UP +#define D_STR_DOWN "Omlaag" +#define D_STR_TEMPDOWN D_STR_TEMP " " D_STR_DOWN +#define D_STR_CHANGE "Wisselen" +#define D_STR_MOVE "Verplaatsen" +#define D_STR_SET "Instellen" +#define D_STR_CANCEL "Annuleren" +#define D_STR_COMFORT "Comfortabel" +#define D_STR_WEEKLY "Weekelijks" +#define D_STR_WEEKLYTIMER D_STR_TIMER " " D_STR_WEEKLY +#define D_STR_FAST "Snel" +#define D_STR_SLOW "Langzaam" +#define D_STR_AIRFLOW "Luchtstroom" +#define D_STR_STEP "Stap" +#define D_STR_NA "N/A" +#define D_STR_OUTSIDE "Buiten" +#define D_STR_LOUD "Luid" +#define D_STR_UPPER "Boven" +#define D_STR_LOWER "Beneden" +#define D_STR_BREEZE "Wind" +#define D_STR_CIRCULATE "Circulatie" +#define D_STR_CEILING "Plafond" +#define D_STR_WALL "Muur" +#define D_STR_ROOM "Kamer" +#define D_STR_6THSENSE "6e Zintuig" +#define D_STR_FIXED "Vast" + +#define D_STR_AUTOMATIC "Automatisch" +#define D_STR_MANUAL "Handmatig" +#define D_STR_COOL "Koelen" +#define D_STR_HEAT "Verwarmen" +#define D_STR_FAN "Venilator" +#define D_STR_FANONLY "alleen_fan" +#define D_STR_DRY "Drogen" + +#define D_STR_MED "Mid" +#define D_STR_MEDIUM "Medium" + +#define D_STR_HIGHEST "Hoogste" +#define D_STR_HIGH "Hoog" +#define D_STR_HI "H" +#define D_STR_MID "M" +#define D_STR_MIDDLE "Medium" +#define D_STR_LOW "Laag" +#define D_STR_LO "L" +#define D_STR_LOWEST "Laagste" +#define D_STR_RIGHT "Rechts" +#define D_STR_MAXRIGHT D_STR_MAX " " D_STR_RIGHT +#define D_STR_RIGHTMAX_NOSPACE D_STR_RIGHT D_STR_MAX +#define D_STR_LEFT "Links" +#define D_STR_MAXLEFT D_STR_MAX " " D_STR_LEFT +#define D_STR_LEFTMAX_NOSPACE D_STR_LEFT D_STR_MAX +#define D_STR_WIDE "Breed" +#define D_STR_CENTRE "Midden" +#define D_STR_TOP "Boven" +#define D_STR_BOTTOM "Onder" + +#define D_STR_DAY "Dag" +#define D_STR_DAYS D_STR_DAY "en" +#define D_STR_HOUR "Uur" +#define D_STR_HOURS D_STR_HOUR +#define D_STR_MINUTE "Minuut" +#define D_STR_MINUTES "Minuten" +#define D_STR_SECOND "Seconde" +#define D_STR_SECONDS D_STR_SECOND "n" +#define D_STR_NOW "Nu" +#define D_STR_THREELETTERDAYS "ZonMaaDinWoeDonVriZat" + +#define D_STR_YES "Ja" +#define D_STR_NO "Nee" +#define D_STR_TRUE "Waar" +#define D_STR_FALSE "Niet Waar" + +#define D_STR_REPEAT "Herhalen" +#define D_STR_PREVIOUS "Vorige" +#define D_STR_DISPLAY "Display" +#define D_STR_INSIDE "Binnen" +#define D_STR_POWERBUTTON "Hoofdschakelaar" +#define D_STR_PREVIOUSPOWER "Vorige inschakelstatus" +#define D_STR_DISPLAYTEMP "Temperatuurweergave" + +// IRrecvDumpV2+ +#define D_STR_TIMESTAMP "Tijdsaanduiding" +#define D_STR_LIBRARY "Bibliotheek" +#define D_STR_TOLERANCE "Tolerantie" +#define D_STR_MESGDESC "Beschrijving" +#define D_STR_IRRECVDUMP_STARTUP \ + "IRrecvDump draait en wacht op IR-signaal op pin %d" +#define D_WARN_BUFFERFULL \ + "WAARSCHUWING: IR-code is te groot voor buffer (>= %d). " \ + "Het resultaat kan niet worden vertrouwd totdat het is verholpen. " \ + "Wijzig & vergroot `kCaptureBufferSize`." + +#endif // LOCALE_NL_NL_H_ diff --git a/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/test/IRac_test.cpp b/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/test/IRac_test.cpp index 15351ba61..32a745a31 100644 --- a/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/test/IRac_test.cpp +++ b/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/test/IRac_test.cpp @@ -73,6 +73,7 @@ TEST(TestIRac, Airton) { ASSERT_EQ(expected, IRAcUtils::resultAcToString(&ac._irsend.capture)); stdAc::state_t r, p; ASSERT_TRUE(IRAcUtils::decodeToState(&ac._irsend.capture, &r, &p)); + ASSERT_EQ(stdAc::ac_command_t::kControlCommand, r.command); } TEST(TestIRac, Airwell) { @@ -96,6 +97,7 @@ TEST(TestIRac, Airwell) { ASSERT_EQ(expected, IRAcUtils::resultAcToString(&ac._irsend.capture)); stdAc::state_t r, p; ASSERT_TRUE(IRAcUtils::decodeToState(&ac._irsend.capture, &r, &p)); + ASSERT_EQ(stdAc::ac_command_t::kControlCommand, r.command); } TEST(TestIRac, Amcor) { @@ -119,6 +121,7 @@ TEST(TestIRac, Amcor) { ASSERT_EQ(expected, IRAcUtils::resultAcToString(&ac._irsend.capture)); stdAc::state_t r, p; ASSERT_TRUE(IRAcUtils::decodeToState(&ac._irsend.capture, &r, &p)); + ASSERT_EQ(stdAc::ac_command_t::kControlCommand, r.command); } TEST(TestIRac, Argo) { @@ -130,16 +133,19 @@ TEST(TestIRac, Argo) { true, // Power stdAc::opmode_t::kHeat, // Mode 21, // Celsius + 22, // Sensor Temp. stdAc::fanspeed_t::kHigh, // Fan speed stdAc::swingv_t::kOff, // Vertical swing + false, // iFeel false, // Turbo -1); // Sleep EXPECT_TRUE(ac.getPower()); EXPECT_EQ(kArgoHeat, ac.getMode()); EXPECT_EQ(21, ac.getTemp()); - EXPECT_EQ(kArgoFlapAuto, ac.getFlap()); + EXPECT_EQ(kArgoFlapFull, ac.getFlap()); EXPECT_FALSE(ac.getMax()); // Turbo EXPECT_FALSE(ac.getNight()); // Sleep + EXPECT_EQ(argoIrMessageType_t::AC_CONTROL, ac.getMessageType()); } TEST(TestIRac, Carrier64) { @@ -174,6 +180,7 @@ TEST(TestIRac, Carrier64) { ASSERT_EQ(expected, IRAcUtils::resultAcToString(&ac._irsend.capture)); stdAc::state_t r, p; ASSERT_TRUE(IRAcUtils::decodeToState(&ac._irsend.capture, &r, &p)); + ASSERT_EQ(stdAc::ac_command_t::kControlCommand, r.command); } TEST(TestIRac, Coolix) { @@ -189,9 +196,11 @@ TEST(TestIRac, Coolix) { true, // Power stdAc::opmode_t::kHeat, // Mode 21, // Celsius + kNoTempValue, // Sensor Temp stdAc::fanspeed_t::kHigh, // Fan speed stdAc::swingv_t::kOff, // Vertical swing stdAc::swingh_t::kOff, // Horizontal swing + false, // iFeel false, // Turbo false, // Light false, // Clean @@ -235,6 +244,7 @@ TEST(TestIRac, Coolix) { // End of message #2 (i.e. Repeat '1') // Note: the two messages (#1 & #2) are identical. ac._irsend.outputStr()); + ASSERT_EQ(stdAc::ac_command_t::kControlCommand, r.command); } TEST(TestIRac, Corona) { @@ -277,6 +287,7 @@ TEST(TestIRac, Corona) { ASSERT_EQ(expectedCapture, IRAcUtils::resultAcToString(&ac._irsend.capture)); stdAc::state_t r, p; ASSERT_TRUE(IRAcUtils::decodeToState(&ac._irsend.capture, &r, &p)); + ASSERT_EQ(stdAc::ac_command_t::kControlCommand, r.command); } TEST(TestIRac, Daikin) { @@ -310,6 +321,7 @@ TEST(TestIRac, Daikin) { ASSERT_EQ(expected, IRAcUtils::resultAcToString(&ac._irsend.capture)); stdAc::state_t r, p; ASSERT_TRUE(IRAcUtils::decodeToState(&ac._irsend.capture, &r, &p)); + ASSERT_EQ(stdAc::ac_command_t::kControlCommand, r.command); } TEST(TestIRac, Daikin128) { @@ -343,6 +355,7 @@ TEST(TestIRac, Daikin128) { ASSERT_EQ(expected, IRAcUtils::resultAcToString(&ac._irsend.capture)); stdAc::state_t r, p; ASSERT_TRUE(IRAcUtils::decodeToState(&ac._irsend.capture, &r, &p)); + ASSERT_EQ(stdAc::ac_command_t::kControlCommand, r.command); } TEST(TestIRac, Daikin152) { @@ -371,6 +384,7 @@ TEST(TestIRac, Daikin152) { ASSERT_EQ(expected, IRAcUtils::resultAcToString(&ac._irsend.capture)); stdAc::state_t r, p; ASSERT_TRUE(IRAcUtils::decodeToState(&ac._irsend.capture, &r, &p)); + ASSERT_EQ(stdAc::ac_command_t::kControlCommand, r.command); } TEST(TestIRac, Daikin160) { @@ -396,6 +410,7 @@ TEST(TestIRac, Daikin160) { ASSERT_EQ(expected, IRAcUtils::resultAcToString(&ac._irsend.capture)); stdAc::state_t r, p; ASSERT_TRUE(IRAcUtils::decodeToState(&ac._irsend.capture, &r, &p)); + ASSERT_EQ(stdAc::ac_command_t::kControlCommand, r.command); } TEST(TestIRac, Daikin176) { @@ -421,6 +436,7 @@ TEST(TestIRac, Daikin176) { ASSERT_EQ(expected, IRAcUtils::resultAcToString(&ac._irsend.capture)); stdAc::state_t r, p; ASSERT_TRUE(IRAcUtils::decodeToState(&ac._irsend.capture, &r, &p)); + ASSERT_EQ(stdAc::ac_command_t::kControlCommand, r.command); } TEST(TestIRac, Daikin2) { @@ -460,6 +476,7 @@ TEST(TestIRac, Daikin2) { ASSERT_EQ(expected, IRAcUtils::resultAcToString(&ac._irsend.capture)); stdAc::state_t r, p; ASSERT_TRUE(IRAcUtils::decodeToState(&ac._irsend.capture, &r, &p)); + ASSERT_EQ(stdAc::ac_command_t::kControlCommand, r.command); } TEST(TestIRac, Daikin216) { @@ -488,6 +505,7 @@ TEST(TestIRac, Daikin216) { ASSERT_EQ(expected, IRAcUtils::resultAcToString(&ac._irsend.capture)); stdAc::state_t r, p; ASSERT_TRUE(IRAcUtils::decodeToState(&ac._irsend.capture, &r, &p)); + ASSERT_EQ(stdAc::ac_command_t::kControlCommand, r.command); } TEST(TestIRac, Daikin64) { @@ -548,7 +566,7 @@ TEST(TestIRac, Ecoclim) { IRac irac(kGpioUnused); IRrecv capture(kGpioUnused); char expected[] = - "Power: On, Mode: 1 (Cool), Temp: 26C, SensorTemp: 26C, Fan: 2 (High), " + "Power: On, Mode: 1 (Cool), Temp: 26C, SensorTemp: 27C, Fan: 2 (High), " "Clock: 12:34, On Timer: Off, Off Timer: Off, Type: 0"; ac.begin(); @@ -556,6 +574,7 @@ TEST(TestIRac, Ecoclim) { true, // Power stdAc::opmode_t::kCool, // Mode 26, // Celsius + 27, // Sensor Temp. stdAc::fanspeed_t::kHigh, // Fan speed -1, // Sleep 12 * 60 + 34); // Clock @@ -567,7 +586,7 @@ TEST(TestIRac, Ecoclim) { ASSERT_EQ(expected, IRAcUtils::resultAcToString(&ac._irsend.capture)); char expected_sleep[] = - "Power: On, Mode: 7 (Sleep), Temp: 21C, SensorTemp: 21C, Fan: 0 (Low), " + "Power: On, Mode: 7 (Sleep), Temp: 21C, SensorTemp: 22C, Fan: 0 (Low), " "Clock: 17:17, On Timer: Off, Off Timer: Off, Type: 0"; ac._irsend.reset(); @@ -575,6 +594,7 @@ TEST(TestIRac, Ecoclim) { true, // Power stdAc::opmode_t::kCool, // Mode 21, // Celsius + 22, // Sensor Temp. stdAc::fanspeed_t::kLow, // Fan speed 8 * 60, // Sleep 17 * 60 + 17); // Clock @@ -600,9 +620,11 @@ TEST(TestIRac, Electra) { true, // Power stdAc::opmode_t::kFan, // Mode 26, // Celsius + 27, // Sensor Temp. stdAc::fanspeed_t::kHigh, // Fan speed stdAc::swingv_t::kAuto, // Vertical swing stdAc::swingh_t::kLeft, // Horizontal swing + false, // iFeel true, // Turbo true, // Light (toggle) true); // Clean @@ -656,6 +678,7 @@ TEST(TestIRac, Fujitsu) { ASSERT_EQ(ardb1_expected, IRAcUtils::resultAcToString(&ac._irsend.capture)); stdAc::state_t r, p; ASSERT_TRUE(IRAcUtils::decodeToState(&ac._irsend.capture, &r, &p)); + ASSERT_EQ(stdAc::ac_command_t::kControlCommand, r.command); ac._irsend.reset(); // Try to set the device to 10C Heat mode. @@ -681,6 +704,7 @@ TEST(TestIRac, Fujitsu) { ASSERT_EQ(kFujitsuAcBits, ac._irsend.capture.bits); ASSERT_EQ(arrah2e_expected, IRAcUtils::resultAcToString(&ac._irsend.capture)); ASSERT_TRUE(IRAcUtils::decodeToState(&ac._irsend.capture, &r, &p)); + ASSERT_EQ(stdAc::ac_command_t::kControlCommand, r.command); ac._irsend.reset(); irac.fujitsu(&ac, fujitsu_ac_remote_model_t::ARRY4, // Model @@ -703,6 +727,7 @@ TEST(TestIRac, Fujitsu) { ASSERT_EQ(kFujitsuAcBits, ac._irsend.capture.bits); ASSERT_EQ(arry4_expected, IRAcUtils::resultAcToString(&ac._irsend.capture)); ASSERT_TRUE(IRAcUtils::decodeToState(&ac._irsend.capture, &r, &p)); + ASSERT_EQ(stdAc::ac_command_t::kControlCommand, r.command); ac._irsend.reset(); irac.fujitsu(&ac, @@ -753,6 +778,7 @@ TEST(TestIRac, Goodweather) { ASSERT_EQ(expected, IRAcUtils::resultAcToString(&ac._irsend.capture)); stdAc::state_t r, p; ASSERT_TRUE(IRAcUtils::decodeToState(&ac._irsend.capture, &r, &p)); + ASSERT_EQ(stdAc::ac_command_t::kControlCommand, r.command); } TEST(TestIRac, Gree) { @@ -761,7 +787,7 @@ TEST(TestIRac, Gree) { IRrecv capture(kGpioUnused); char expected[] = "Model: 1 (YAW1F), Power: On, Mode: 1 (Cool), Temp: 71F, " - "Fan: 2 (Medium), Turbo: Off, Econo: Off, IFeel: Off, WiFi: Off, " + "Fan: 2 (Medium), Turbo: Off, Econo: Off, IFeel: On, WiFi: Off, " "XFan: On, Light: On, Sleep: On, Swing(V) Mode: Manual, " "Swing(V): 3 (UNKNOWN), Swing(H): 5 (Right), Timer: Off, " "Display Temp: 0 (Off)"; @@ -776,6 +802,7 @@ TEST(TestIRac, Gree) { stdAc::fanspeed_t::kMedium, // Fan speed stdAc::swingv_t::kHigh, // Vertical swing stdAc::swingh_t::kRight, // Horizontal swing + true, // iFeel false, // Turbo false, // Econo true, // Light @@ -789,6 +816,7 @@ TEST(TestIRac, Gree) { ASSERT_EQ(expected, IRAcUtils::resultAcToString(&ac._irsend.capture)); stdAc::state_t r, p; ASSERT_TRUE(IRAcUtils::decodeToState(&ac._irsend.capture, &r, &p)); + ASSERT_EQ(stdAc::ac_command_t::kControlCommand, r.command); } TEST(TestIRac, Haier) { @@ -818,6 +846,7 @@ TEST(TestIRac, Haier) { ASSERT_EQ(expected, IRAcUtils::resultAcToString(&ac._irsend.capture)); stdAc::state_t r, p; ASSERT_TRUE(IRAcUtils::decodeToState(&ac._irsend.capture, &r, &p)); + ASSERT_EQ(stdAc::ac_command_t::kControlCommand, r.command); } TEST(TestIRac, Haier160) { @@ -853,6 +882,7 @@ TEST(TestIRac, Haier160) { ASSERT_EQ(expected, IRAcUtils::resultAcToString(&ac._irsend.capture)); stdAc::state_t r, p; ASSERT_TRUE(IRAcUtils::decodeToState(&ac._irsend.capture, &r, &p)); + ASSERT_EQ(stdAc::ac_command_t::kControlCommand, r.command); } TEST(TestIRac, Haier176) { @@ -886,6 +916,7 @@ TEST(TestIRac, Haier176) { ASSERT_EQ(expected, IRAcUtils::resultAcToString(&ac._irsend.capture)); stdAc::state_t r, p; ASSERT_TRUE(IRAcUtils::decodeToState(&ac._irsend.capture, &r, &p)); + ASSERT_EQ(stdAc::ac_command_t::kControlCommand, r.command); } TEST(TestIRac, HaierYrwo2) { @@ -919,6 +950,7 @@ TEST(TestIRac, HaierYrwo2) { ASSERT_EQ(expected, IRAcUtils::resultAcToString(&ac._irsend.capture)); stdAc::state_t r, p; ASSERT_TRUE(IRAcUtils::decodeToState(&ac._irsend.capture, &r, &p)); + ASSERT_EQ(stdAc::ac_command_t::kControlCommand, r.command); } TEST(TestIRac, Hitachi) { @@ -946,6 +978,7 @@ TEST(TestIRac, Hitachi) { ASSERT_EQ(expected, IRAcUtils::resultAcToString(&ac._irsend.capture)); stdAc::state_t r, p; ASSERT_TRUE(IRAcUtils::decodeToState(&ac._irsend.capture, &r, &p)); + ASSERT_EQ(stdAc::ac_command_t::kControlCommand, r.command); } TEST(TestIRac, Hitachi1) { @@ -978,6 +1011,7 @@ TEST(TestIRac, Hitachi1) { ASSERT_EQ(expected, IRAcUtils::resultAcToString(&ac._irsend.capture)); stdAc::state_t r, p; ASSERT_TRUE(IRAcUtils::decodeToState(&ac._irsend.capture, &r, &p)); + ASSERT_EQ(stdAc::ac_command_t::kControlCommand, r.command); } TEST(TestIRac, Hitachi264) { @@ -1003,6 +1037,7 @@ TEST(TestIRac, Hitachi264) { ASSERT_EQ(expected_swingon, IRAcUtils::resultAcToString(&ac._irsend.capture)); stdAc::state_t r, p; ASSERT_TRUE(IRAcUtils::decodeToState(&ac._irsend.capture, &r, &p)); + ASSERT_EQ(stdAc::ac_command_t::kControlCommand, r.command); EXPECT_EQ(decode_type_t::HITACHI_AC264, r.protocol); EXPECT_TRUE(r.power); EXPECT_EQ(stdAc::opmode_t::kHeat, r.mode); @@ -1031,6 +1066,7 @@ TEST(TestIRac, Hitachi296) { ASSERT_EQ(expected, IRAcUtils::resultAcToString(&ac._irsend.capture)); stdAc::state_t r, p; ASSERT_TRUE(IRAcUtils::decodeToState(&ac._irsend.capture, &r, &p)); + ASSERT_EQ(stdAc::ac_command_t::kControlCommand, r.command); EXPECT_EQ(decode_type_t::HITACHI_AC296, r.protocol); EXPECT_TRUE(r.power); EXPECT_EQ(stdAc::opmode_t::kHeat, r.mode); @@ -1062,6 +1098,7 @@ TEST(TestIRac, Hitachi344) { ASSERT_EQ(expected_swingon, IRAcUtils::resultAcToString(&ac._irsend.capture)); stdAc::state_t r, p; ASSERT_TRUE(IRAcUtils::decodeToState(&ac._irsend.capture, &r, &p)); + ASSERT_EQ(stdAc::ac_command_t::kControlCommand, r.command); EXPECT_EQ(decode_type_t::HITACHI_AC344, r.protocol); EXPECT_TRUE(r.power); EXPECT_EQ(stdAc::opmode_t::kHeat, r.mode); @@ -1082,6 +1119,7 @@ TEST(TestIRac, Hitachi344) { ASSERT_EQ(expected_swingoff, ac.toString()); ac._irsend.makeDecodeResult(); EXPECT_TRUE(capture.decode(&ac._irsend.capture)); + ASSERT_EQ(stdAc::ac_command_t::kControlCommand, r.command); ASSERT_EQ(HITACHI_AC344, ac._irsend.capture.decode_type); ASSERT_EQ(kHitachiAc344Bits, ac._irsend.capture.bits); ASSERT_EQ(expected_swingoff, @@ -1115,6 +1153,7 @@ TEST(TestIRac, Hitachi424) { ASSERT_EQ(expected, IRAcUtils::resultAcToString(&ac._irsend.capture)); stdAc::state_t r, p; ASSERT_TRUE(IRAcUtils::decodeToState(&ac._irsend.capture, &r, &p)); + ASSERT_EQ(stdAc::ac_command_t::kControlCommand, r.command); ac._irsend.reset(); irac.hitachi424(&ac, @@ -1131,6 +1170,7 @@ TEST(TestIRac, Hitachi424) { ASSERT_EQ(kHitachiAc424Bits, ac._irsend.capture.bits); ASSERT_EQ(expected_swingv, IRAcUtils::resultAcToString(&ac._irsend.capture)); ASSERT_TRUE(IRAcUtils::decodeToState(&ac._irsend.capture, &r, &p)); + ASSERT_EQ(stdAc::ac_command_t::kControlCommand, r.command); } TEST(TestIRac, Kelvinator) { @@ -1164,6 +1204,7 @@ TEST(TestIRac, Kelvinator) { ASSERT_EQ(expected, IRAcUtils::resultAcToString(&ac._irsend.capture)); stdAc::state_t r, p; ASSERT_TRUE(IRAcUtils::decodeToState(&ac._irsend.capture, &r, &p)); + ASSERT_EQ(stdAc::ac_command_t::kControlCommand, r.command); } TEST(TestIRac, LG) { @@ -1196,6 +1237,7 @@ TEST(TestIRac, LG) { ASSERT_EQ(61, ac._irsend.capture.rawlen); stdAc::state_t r, p; ASSERT_TRUE(IRAcUtils::decodeToState(&ac._irsend.capture, &r, &p)); + ASSERT_EQ(stdAc::ac_command_t::kControlCommand, r.command); } TEST(TestIRac, LG2) { @@ -1228,6 +1270,7 @@ TEST(TestIRac, LG2) { ASSERT_EQ(expected, IRAcUtils::resultAcToString(&ac._irsend.capture)); stdAc::state_t r, p; ASSERT_TRUE(IRAcUtils::decodeToState(&ac._irsend.capture, &r, &p)); + ASSERT_EQ(stdAc::ac_command_t::kControlCommand, r.command); // Message #2 - SwingV Low EXPECT_TRUE(capture.decodeLG(&ac._irsend.capture, 61)); ASSERT_EQ(LG2, ac._irsend.capture.decode_type); @@ -1443,6 +1486,7 @@ TEST(TestIRac, LG2_AKB73757604) { ASSERT_EQ(LG2, ac._irsend.capture.decode_type); ASSERT_EQ(kLgBits, ac._irsend.capture.bits); ASSERT_EQ(kLgAcSwingHAuto, ac._irsend.capture.value); + ASSERT_EQ(stdAc::ac_command_t::kControlCommand, r.command); } TEST(TestIRac, Midea) { @@ -1461,8 +1505,10 @@ TEST(TestIRac, Midea) { stdAc::opmode_t::kDry, // Mode true, // Celsius 27, // Degrees + 28, // Sensor Temp. stdAc::fanspeed_t::kMedium, // Fan speed stdAc::swingv_t::kOff, // Swing(V) + false, // iFeel false, // Silent/Quiet false, // Previous Silent/Quiet setting false, // Turbo @@ -1479,6 +1525,7 @@ TEST(TestIRac, Midea) { ASSERT_EQ(expected, IRAcUtils::resultAcToString(&ac._irsend.capture)); stdAc::state_t r, p; ASSERT_TRUE(IRAcUtils::decodeToState(&ac._irsend.capture, &r, &p)); + ASSERT_EQ(stdAc::ac_command_t::kControlCommand, r.command); } TEST(TestIRac, Mirage) { @@ -1518,6 +1565,7 @@ TEST(TestIRac, Mirage) { ASSERT_EQ(kMirageBits, ac._irsend.capture.bits); ASSERT_EQ(expected_KKG9AC1, IRAcUtils::resultAcToString(&ac._irsend.capture)); ASSERT_TRUE(IRAcUtils::decodeToState(&ac._irsend.capture, &r, &p)); + ASSERT_EQ(stdAc::ac_command_t::kControlCommand, r.command); const char expected_KKG29AC1[] = "Model: 2 (KKG29AC1), Power: On, Mode: 3 (Dry), Temp: 27C, " @@ -1535,6 +1583,7 @@ TEST(TestIRac, Mirage) { ASSERT_EQ(expected_KKG29AC1, IRAcUtils::resultAcToString(&ac._irsend.capture)); ASSERT_TRUE(IRAcUtils::decodeToState(&ac._irsend.capture, &r, &p)); + ASSERT_EQ(stdAc::ac_command_t::kControlCommand, r.command); } TEST(TestIRac, Mitsubishi) { @@ -1567,6 +1616,7 @@ TEST(TestIRac, Mitsubishi) { ASSERT_EQ(expected, IRAcUtils::resultAcToString(&ac._irsend.capture)); stdAc::state_t r, p; ASSERT_TRUE(IRAcUtils::decodeToState(&ac._irsend.capture, &r, &p)); + ASSERT_EQ(stdAc::ac_command_t::kControlCommand, r.command); } TEST(TestIRac, Mitsubishi136) { @@ -1593,6 +1643,7 @@ TEST(TestIRac, Mitsubishi136) { ASSERT_EQ(expected, IRAcUtils::resultAcToString(&ac._irsend.capture)); stdAc::state_t r, p; ASSERT_TRUE(IRAcUtils::decodeToState(&ac._irsend.capture, &r, &p)); + ASSERT_EQ(stdAc::ac_command_t::kControlCommand, r.command); } TEST(TestIRac, MitsubishiHeavy88) { @@ -1623,6 +1674,7 @@ TEST(TestIRac, MitsubishiHeavy88) { ASSERT_EQ(expected, IRAcUtils::resultAcToString(&ac._irsend.capture)); stdAc::state_t r, p; ASSERT_TRUE(IRAcUtils::decodeToState(&ac._irsend.capture, &r, &p)); + ASSERT_EQ(stdAc::ac_command_t::kControlCommand, r.command); } TEST(TestIRac, MitsubishiHeavy152) { @@ -1656,6 +1708,7 @@ TEST(TestIRac, MitsubishiHeavy152) { ASSERT_EQ(expected, IRAcUtils::resultAcToString(&ac._irsend.capture)); stdAc::state_t r, p; ASSERT_TRUE(IRAcUtils::decodeToState(&ac._irsend.capture, &r, &p)); + ASSERT_EQ(stdAc::ac_command_t::kControlCommand, r.command); } TEST(TestIRac, Neoclima) { @@ -1690,6 +1743,7 @@ TEST(TestIRac, Neoclima) { ASSERT_EQ(expected, IRAcUtils::resultAcToString(&ac._irsend.capture)); stdAc::state_t r, p; ASSERT_TRUE(IRAcUtils::decodeToState(&ac._irsend.capture, &r, &p)); + ASSERT_EQ(stdAc::ac_command_t::kControlCommand, r.command); } TEST(TestIRac, Panasonic) { @@ -1722,6 +1776,7 @@ TEST(TestIRac, Panasonic) { ASSERT_EQ(expected_nke, IRAcUtils::resultAcToString(&ac._irsend.capture)); stdAc::state_t r, p; ASSERT_TRUE(IRAcUtils::decodeToState(&ac._irsend.capture, &r, &p)); + ASSERT_EQ(stdAc::ac_command_t::kControlCommand, r.command); char expected_dke[] = "Model: 3 (DKE), Power: On, Mode: 3 (Cool), Temp: 18C, Fan: 4 (Maximum), " @@ -1748,6 +1803,7 @@ TEST(TestIRac, Panasonic) { ASSERT_EQ(kPanasonicAcBits, ac._irsend.capture.bits); ASSERT_EQ(expected_dke, IRAcUtils::resultAcToString(&ac._irsend.capture)); ASSERT_TRUE(IRAcUtils::decodeToState(&ac._irsend.capture, &r, &p)); + ASSERT_EQ(stdAc::ac_command_t::kControlCommand, r.command); } TEST(TestIRac, Panasonic32) { @@ -1774,6 +1830,7 @@ TEST(TestIRac, Panasonic32) { ASSERT_EQ(expected, IRAcUtils::resultAcToString(&ac._irsend.capture)); stdAc::state_t r, p; ASSERT_TRUE(IRAcUtils::decodeToState(&ac._irsend.capture, &r, &p)); + ASSERT_EQ(stdAc::ac_command_t::kControlCommand, r.command); } TEST(TestIRac, Samsung) { @@ -1813,6 +1870,7 @@ TEST(TestIRac, Samsung) { ASSERT_EQ(expected, IRAcUtils::resultAcToString(&ac._irsend.capture)); stdAc::state_t r, p; ASSERT_TRUE(IRAcUtils::decodeToState(&ac._irsend.capture, &r, &p)); + ASSERT_EQ(stdAc::ac_command_t::kControlCommand, r.command); ac._irsend.reset(); irac.samsung(&ac, @@ -1841,6 +1899,7 @@ TEST(TestIRac, Samsung) { ASSERT_EQ(kSamsungAcExtendedBits, ac._irsend.capture.bits); ASSERT_EQ(expected, IRAcUtils::resultAcToString(&ac._irsend.capture)); ASSERT_TRUE(IRAcUtils::decodeToState(&ac._irsend.capture, &r, &p)); + ASSERT_EQ(stdAc::ac_command_t::kControlCommand, r.command); ac._irsend.reset(); const char sleep[] = @@ -1874,6 +1933,7 @@ TEST(TestIRac, Samsung) { ASSERT_EQ(kSamsungAcExtendedBits, ac._irsend.capture.bits); ASSERT_EQ(sleep, IRAcUtils::resultAcToString(&ac._irsend.capture)); ASSERT_TRUE(IRAcUtils::decodeToState(&ac._irsend.capture, &r, &p)); + ASSERT_EQ(stdAc::ac_command_t::kControlCommand, r.command); } TEST(TestIRac, Sanyo) { @@ -1890,8 +1950,10 @@ TEST(TestIRac, Sanyo) { true, // Power stdAc::opmode_t::kCool, // Mode 28, // Celsius + kNoTempValue, // SensorTemp stdAc::fanspeed_t::kMedium, // Fan speed stdAc::swingv_t::kHighest, // Vertical Swing + false, // iFeel true, // Beep 17); // Sleep ASSERT_EQ(expected, ac.toString()); @@ -1902,6 +1964,7 @@ TEST(TestIRac, Sanyo) { ASSERT_EQ(expected, IRAcUtils::resultAcToString(&ac._irsend.capture)); stdAc::state_t r, p; ASSERT_TRUE(IRAcUtils::decodeToState(&ac._irsend.capture, &r, &p)); + ASSERT_EQ(stdAc::ac_command_t::kControlCommand, r.command); } TEST(TestIRac, Sanyo88) { @@ -1931,6 +1994,7 @@ TEST(TestIRac, Sanyo88) { ASSERT_EQ(expected, IRAcUtils::resultAcToString(&ac._irsend.capture)); stdAc::state_t r, p; ASSERT_TRUE(IRAcUtils::decodeToState(&ac._irsend.capture, &r, &p)); + ASSERT_EQ(stdAc::ac_command_t::kControlCommand, r.command); } TEST(TestIRac, Sharp) { @@ -1963,6 +2027,7 @@ TEST(TestIRac, Sharp) { ASSERT_EQ(expected, IRAcUtils::resultAcToString(&ac._irsend.capture)); stdAc::state_t r, p; ASSERT_TRUE(IRAcUtils::decodeToState(&ac._irsend.capture, &r, &p)); + ASSERT_EQ(stdAc::ac_command_t::kControlCommand, r.command); } TEST(TestIRac, Tcl112) { @@ -1997,6 +2062,7 @@ TEST(TestIRac, Tcl112) { ASSERT_EQ(expected, IRAcUtils::resultAcToString(&ac._irsend.capture)); stdAc::state_t r, p; ASSERT_TRUE(IRAcUtils::decodeToState(&ac._irsend.capture, &r, &p)); + ASSERT_EQ(stdAc::ac_command_t::kControlCommand, r.command); // Test the quiet mode, which should generate two messages. ac._irsend.reset(); irac.tcl112(&ac, @@ -2052,6 +2118,7 @@ TEST(TestIRac, Technibel) { ASSERT_EQ(expected, IRAcUtils::resultAcToString(&ac._irsend.capture)); stdAc::state_t r, p; ASSERT_TRUE(IRAcUtils::decodeToState(&ac._irsend.capture, &r, &p)); + ASSERT_EQ(stdAc::ac_command_t::kControlCommand, r.command); } TEST(TestIRac, Teco) { @@ -2079,6 +2146,7 @@ TEST(TestIRac, Teco) { ASSERT_EQ(expected, IRAcUtils::resultAcToString(&ac._irsend.capture)); stdAc::state_t r, p; ASSERT_TRUE(IRAcUtils::decodeToState(&ac._irsend.capture, &r, &p)); + ASSERT_EQ(stdAc::ac_command_t::kControlCommand, r.command); } TEST(TestIRac, Toshiba) { @@ -2108,6 +2176,7 @@ TEST(TestIRac, Toshiba) { ASSERT_EQ(expected, IRAcUtils::resultAcToString(&ac._irsend.capture)); stdAc::state_t r, p; ASSERT_TRUE(IRAcUtils::decodeToState(&ac._irsend.capture, &r, &p)); + ASSERT_EQ(stdAc::ac_command_t::kControlCommand, r.command); EXPECT_EQ( "f38000d50" "m4400s4300" @@ -2183,6 +2252,7 @@ TEST(TestIRac, Transcold) { ASSERT_EQ(expected, IRAcUtils::resultAcToString(&ac._irsend.capture)); stdAc::state_t r, p; ASSERT_TRUE(IRAcUtils::decodeToState(&ac._irsend.capture, &r, &p)); + ASSERT_EQ(stdAc::ac_command_t::kControlCommand, r.command); } TEST(TestIRac, Trotec) { @@ -2212,6 +2282,7 @@ TEST(TestIRac, Trotec) { ASSERT_EQ(expected, IRAcUtils::resultAcToString(&ac._irsend.capture)); stdAc::state_t r, p; ASSERT_TRUE(IRAcUtils::decodeToState(&ac._irsend.capture, &r, &p)); + ASSERT_EQ(stdAc::ac_command_t::kControlCommand, r.command); } TEST(TestIRac, Trotec3550) { @@ -2242,6 +2313,7 @@ TEST(TestIRac, Trotec3550) { ASSERT_EQ(expected, IRAcUtils::resultAcToString(&ac._irsend.capture)); stdAc::state_t r, p; ASSERT_TRUE(IRAcUtils::decodeToState(&ac._irsend.capture, &r, &p)); + ASSERT_EQ(stdAc::ac_command_t::kControlCommand, r.command); } TEST(TestIRac, Truma) { @@ -2271,6 +2343,7 @@ TEST(TestIRac, Truma) { ASSERT_EQ(expected, IRAcUtils::resultAcToString(&ac._irsend.capture)); stdAc::state_t r, p; ASSERT_TRUE(IRAcUtils::decodeToState(&ac._irsend.capture, &r, &p)); + ASSERT_EQ(stdAc::ac_command_t::kControlCommand, r.command); } TEST(TestIRac, Vestel) { @@ -2300,6 +2373,7 @@ TEST(TestIRac, Vestel) { ASSERT_EQ(expected, IRAcUtils::resultAcToString(&ac._irsend.capture)); stdAc::state_t r, p; ASSERT_TRUE(IRAcUtils::decodeToState(&ac._irsend.capture, &r, &p)); + ASSERT_EQ(stdAc::ac_command_t::kControlCommand, r.command); ac._irsend.reset(); char expected_clocks[] = @@ -2325,6 +2399,7 @@ TEST(TestIRac, Vestel) { ASSERT_EQ(kVestelAcBits, ac._irsend.capture.bits); ASSERT_EQ(expected_clocks, IRAcUtils::resultAcToString(&ac._irsend.capture)); ASSERT_TRUE(IRAcUtils::decodeToState(&ac._irsend.capture, &r, &p)); + ASSERT_EQ(stdAc::ac_command_t::kControlCommand, r.command); // Now check it sends both messages during normal operation when the // clock is set. @@ -2404,6 +2479,7 @@ TEST(TestIRac, Voltas) { ASSERT_EQ(expected_unknown, IRAcUtils::resultAcToString(&ac._irsend.capture)); stdAc::state_t r, p; ASSERT_TRUE(IRAcUtils::decodeToState(&ac._irsend.capture, &r, &p)); + ASSERT_EQ(stdAc::ac_command_t::kControlCommand, r.command); ac._irsend.reset(); // Test the UNKNOWN model type @@ -2470,6 +2546,7 @@ TEST(TestIRac, Whirlpool) { ASSERT_EQ(expected, IRAcUtils::resultAcToString(&ac._irsend.capture)); stdAc::state_t r, p; ASSERT_TRUE(IRAcUtils::decodeToState(&ac._irsend.capture, &r, &p)); + ASSERT_EQ(stdAc::ac_command_t::kControlCommand, r.command); } TEST(TestIRac, cmpStates) { @@ -2507,6 +2584,21 @@ TEST(TestIRac, cmpStates) { // Now make them different. b.power = false; ASSERT_TRUE(IRac::cmpStates(a, b)); + + b = a; + ASSERT_FALSE(IRac::cmpStates(a, b)); + b.command = stdAc::ac_command_t::kTimerCommand; + ASSERT_TRUE(IRac::cmpStates(a, b)); + + b = a; + ASSERT_FALSE(IRac::cmpStates(a, b)); + b.iFeel = true; + ASSERT_TRUE(IRac::cmpStates(a, b)); + + b = a; + ASSERT_FALSE(IRac::cmpStates(a, b)); + b.sensorTemperature = 12.5; + ASSERT_TRUE(IRac::cmpStates(a, b)); } TEST(TestIRac, handleToggles) { @@ -2610,6 +2702,7 @@ TEST(TestIRac, strToFanspeed) { EXPECT_EQ(stdAc::fanspeed_t::kMin, IRac::strToFanspeed("MIN")); EXPECT_EQ(stdAc::fanspeed_t::kLow, IRac::strToFanspeed("LOW")); EXPECT_EQ(stdAc::fanspeed_t::kMedium, IRac::strToFanspeed("MEDIUM")); + EXPECT_EQ(stdAc::fanspeed_t::kMediumHigh, IRac::strToFanspeed("MED-HIGH")); EXPECT_EQ(stdAc::fanspeed_t::kHigh, IRac::strToFanspeed("HIGH")); EXPECT_EQ(stdAc::fanspeed_t::kMax, IRac::strToFanspeed("MAX")); EXPECT_EQ(stdAc::fanspeed_t::kAuto, IRac::strToFanspeed("FOOBAR")); @@ -2622,6 +2715,7 @@ TEST(TestIRac, strToSwingV) { EXPECT_EQ(stdAc::swingv_t::kLowest, IRac::strToSwingV("LOWEST")); EXPECT_EQ(stdAc::swingv_t::kLow, IRac::strToSwingV("LOW")); EXPECT_EQ(stdAc::swingv_t::kMiddle, IRac::strToSwingV("MIDDLE")); + EXPECT_EQ(stdAc::swingv_t::kUpperMiddle, IRac::strToSwingV("UPPER-MIDDLE")); EXPECT_EQ(stdAc::swingv_t::kHigh, IRac::strToSwingV("HIGH")); EXPECT_EQ(stdAc::swingv_t::kHighest, IRac::strToSwingV("HIGHEST")); EXPECT_EQ(stdAc::swingv_t::kOff, IRac::strToSwingV("OFF")); @@ -2652,6 +2746,10 @@ TEST(TestIRac, strToModel) { IRac::strToModel("ARRAH2E")); EXPECT_EQ(whirlpool_ac_remote_model_t::DG11J13A, IRac::strToModel("DG11J13A")); + EXPECT_EQ(argo_ac_remote_model_t::SAC_WREM2, + IRac::strToModel("WREM2")); + EXPECT_EQ(argo_ac_remote_model_t::SAC_WREM3, + IRac::strToModel("WREM3")); EXPECT_EQ(1, IRac::strToModel("1")); EXPECT_EQ(10, IRac::strToModel("10")); EXPECT_EQ(-1, IRac::strToModel("0")); @@ -2659,6 +2757,26 @@ TEST(TestIRac, strToModel) { EXPECT_EQ(0, IRac::strToModel("FOOBAR", 0)); } +TEST(TestIRac, strToCommandType) { + EXPECT_EQ(stdAc::ac_command_t::kControlCommand, + IRac::strToCommandType("Control")); + EXPECT_EQ(stdAc::ac_command_t::kSensorTempReport, + IRac::strToCommandType("IFeel Report")); + EXPECT_EQ(stdAc::ac_command_t::kSensorTempReport, + IRac::strToCommandType("IFeel")); + EXPECT_EQ(stdAc::ac_command_t::kTimerCommand, + IRac::strToCommandType("Set Timer")); + EXPECT_EQ(stdAc::ac_command_t::kTimerCommand, + IRac::strToCommandType("Timer")); + EXPECT_EQ(stdAc::ac_command_t::kConfigCommand, + IRac::strToCommandType("Config")); + EXPECT_EQ(stdAc::ac_command_t::kControlCommand, + IRac::strToCommandType("FOOBAR")); + EXPECT_EQ(stdAc::ac_command_t::kTimerCommand, + IRac::strToCommandType("FOOBAR", + stdAc::ac_command_t::kTimerCommand)); +} + TEST(TestIRac, boolToString) { EXPECT_EQ("On", IRac::boolToString(true)); EXPECT_EQ("Off", IRac::boolToString(false)); @@ -2678,6 +2796,7 @@ TEST(TestIRac, opmodeToString) { TEST(TestIRac, fanspeedToString) { EXPECT_EQ("Low", IRac::fanspeedToString(stdAc::fanspeed_t::kLow)); EXPECT_EQ("Auto", IRac::fanspeedToString(stdAc::fanspeed_t::kAuto)); + EXPECT_EQ("Med-High", IRac::fanspeedToString(stdAc::fanspeed_t::kMediumHigh)); EXPECT_EQ("UNKNOWN", IRac::fanspeedToString((stdAc::fanspeed_t)500)); } @@ -2685,6 +2804,8 @@ TEST(TestIRac, swingvToString) { EXPECT_EQ("Off", IRac::swingvToString(stdAc::swingv_t::kOff)); EXPECT_EQ("Low", IRac::swingvToString(stdAc::swingv_t::kLow)); EXPECT_EQ("Auto", IRac::swingvToString(stdAc::swingv_t::kAuto)); + EXPECT_EQ("Upper-Middle", IRac::swingvToString( + stdAc::swingv_t::kUpperMiddle)); EXPECT_EQ("UNKNOWN", IRac::swingvToString((stdAc::swingv_t)500)); } @@ -2696,6 +2817,17 @@ TEST(TestIRac, swinghToString) { EXPECT_EQ("UNKNOWN", IRac::swinghToString((stdAc::swingh_t)500)); } +TEST(TestIRac, commandTypeToString) { + EXPECT_EQ("Control", + IRac::commandTypeToString(stdAc::ac_command_t::kControlCommand)); + EXPECT_EQ("IFeel Report", + IRac::commandTypeToString(stdAc::ac_command_t::kSensorTempReport)); + EXPECT_EQ("Set Timer", + IRac::commandTypeToString(stdAc::ac_command_t::kTimerCommand)); + EXPECT_EQ("Config", + IRac::commandTypeToString(stdAc::ac_command_t::kConfigCommand)); +} + // Check that we keep the previous state info if the message is a special // state-less command. TEST(TestIRac, CoolixDecodeToState) { @@ -2714,6 +2846,7 @@ TEST(TestIRac, CoolixDecodeToState) { ASSERT_TRUE(irrecv.decode(&irsend.capture)); stdAc::state_t result; ASSERT_TRUE(IRAcUtils::decodeToState(&irsend.capture, &result, &prev)); + ASSERT_EQ(stdAc::ac_command_t::kControlCommand, result.command); ASSERT_EQ(decode_type_t::COOLIX, result.protocol); ASSERT_FALSE(result.power); ASSERT_EQ(stdAc::opmode_t::kHeat, result.mode); @@ -2762,9 +2895,11 @@ TEST(TestIRac, Issue821) { result.power, // Power result.mode, // Mode result.degrees, // Celsius + kNoTempValue, // Sensor Temp result.fanspeed, // Fan speed result.swingv, // Vertical swing result.swingh, // Horizontal swing + result.iFeel, // iFeel result.turbo, // Turbo result.light, // Light result.clean, // Clean @@ -2877,6 +3012,7 @@ TEST(TestIRac, Issue1001) { IRAcUtils::resultAcToString(&ac._irsend.capture)); stdAc::state_t r, p; ASSERT_TRUE(IRAcUtils::decodeToState(&ac._irsend.capture, &r, &p)); + ASSERT_EQ(stdAc::ac_command_t::kControlCommand, r.command); // Now check if the mode is set to "Off" instead of just change to power off. // i.e. How Home Assistant expects things to work. @@ -2907,6 +3043,7 @@ TEST(TestIRac, Issue1001) { "Command: 1 (Power)", IRAcUtils::resultAcToString(&ac._irsend.capture)); ASSERT_TRUE(IRAcUtils::decodeToState(&ac._irsend.capture, &r, &p)); + ASSERT_EQ(stdAc::ac_command_t::kControlCommand, r.command); } // Check power switching in Daikin2 common a/c handling when from an IR message. @@ -2956,6 +3093,7 @@ TEST(TestIRac, Issue1035) { ASSERT_FALSE(prev.power); ASSERT_TRUE(IRAcUtils::decodeToState(&ac._irsend.capture, &result, &prev)); ASSERT_TRUE(result.power); + ASSERT_EQ(stdAc::ac_command_t::kControlCommand, result.command); prev = result; @@ -2967,6 +3105,7 @@ TEST(TestIRac, Issue1035) { ASSERT_EQ(DAIKIN2, ac._irsend.capture.decode_type); ASSERT_TRUE(prev.power); ASSERT_TRUE(IRAcUtils::decodeToState(&ac._irsend.capture, &result, &prev)); + ASSERT_EQ(stdAc::ac_command_t::kControlCommand, result.command); ASSERT_FALSE(result.power); } @@ -3138,4 +3277,26 @@ TEST(TestIRac, initState) { EXPECT_EQ(-1, builtin_init.model); EXPECT_EQ(stdAc::swingv_t::kOff, builtin_init.swingv); EXPECT_EQ(decode_type_t::UNKNOWN, no_init.protocol); + EXPECT_EQ(stdAc::ac_command_t::kControlCommand, no_init.command); + EXPECT_FALSE(no_init.iFeel); + EXPECT_EQ(kNoTempValue, no_init.sensorTemperature); +} + +TEST(TestIRac, cleanState) { + IRac irac(kGpioUnused); + stdAc::state_t s = {}; + s.mode = stdAc::opmode_t::kFan; + s.power = true; + s.sensorTemperature = 20.5; + s.degrees = 22.3; + + auto clean = irac.cleanState(s); + EXPECT_TRUE(clean.power); + EXPECT_EQ(s.mode, clean.mode); + EXPECT_EQ(s.sensorTemperature, clean.sensorTemperature); + EXPECT_EQ(s.degrees, clean.degrees); + + s.mode = stdAc::opmode_t::kOff; + clean = irac.cleanState(s); + EXPECT_FALSE(clean.power); } diff --git a/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/test/IRrecv_test.h b/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/test/IRrecv_test.h index bb366c1ee..42c3f0a17 100644 --- a/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/test/IRrecv_test.h +++ b/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/test/IRrecv_test.h @@ -3,15 +3,16 @@ #ifndef TEST_IRRECV_TEST_H_ #define TEST_IRRECV_TEST_H_ +#include #include #include #include #include "IRutils.h" -#define EXPECT_STATE_EQ(a, b, c) \ - for (uint8_t i = 0; i < c / 8; ++i) { \ - EXPECT_EQ(a[i], b[i]) << "Expected state " \ - "differs at i = " \ - << uint64ToString(i); \ +#define EXPECT_STATE_EQ(a, b, c) \ + for (uint8_t i = 0; i < ceil((c) / 8.0); ++i) { \ + EXPECT_EQ((a)[i], (b)[i]) << "Expected state " \ + "differs at i = " \ + << uint64ToString(i); \ } #endif // TEST_IRRECV_TEST_H_ diff --git a/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/test/Makefile b/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/test/Makefile index 7a193e813..8c0a33da4 100644 --- a/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/test/Makefile +++ b/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/test/Makefile @@ -16,6 +16,7 @@ # Points to the root of Google Test, relative to where this file is. # Remember to tweak this if you move this file. GTEST_DIR = ../lib/googletest/googletest +GMOCK_DIR = ../lib/googletest/googlemock # Where to find user code. USER_DIR = ../src @@ -24,11 +25,14 @@ INCLUDES = -I$(USER_DIR) -I. # Flags passed to the preprocessor. # Set Google Test's header directory as a system directory, such that # the compiler doesn't generate warnings in Google Test headers. -CPPFLAGS += -isystem $(GTEST_DIR)/include -DUNIT_TEST -D_IR_LOCALE_=en-AU +CPPFLAGS += -isystem $(GTEST_DIR)/include -isystem $(GMOCK_DIR)/include -DUNIT_TEST -D_IR_LOCALE_=en-AU # Flags passed to the C++ compiler. CXXFLAGS += -g -Wall -Wextra -Werror -pthread -std=gnu++11 +# Google Test libraries +GTEST_LIBS = gtest.a gtest_main.a gmock.a gmock_main.a + # All tests produced by this Makefile. generated from all *_test.cpp files TESTS = $(patsubst %.cpp,%,$(wildcard *_test.cpp)) @@ -37,12 +41,19 @@ TESTS = $(patsubst %.cpp,%,$(wildcard *_test.cpp)) GTEST_HEADERS = $(GTEST_DIR)/include/gtest/*.h \ $(GTEST_DIR)/include/gtest/internal/*.h +# All Google Mock headers. Note that all Google Test headers are +# included here too, as they are #included by Google Mock headers. +# Usually you shouldn't change this definition. +GMOCK_HEADERS = $(GMOCK_DIR)/include/gmock/*.h \ + $(GMOCK_DIR)/include/gmock/internal/*.h \ + $(GTEST_HEADERS) + # House-keeping build targets. -all : $(TESTS) +all : $(GTEST_LIBS) $(TESTS) clean : - rm -f $(TESTS) gtest.a gtest_main.a *.o + rm -f $(GTEST_LIBS) $(TESTS) *.o # Build and run all the tests. run : all @@ -65,13 +76,14 @@ run-% : %_test install-googletest : rm -rf ../lib/googletest - git clone -b v1.8.x https://github.com/google/googletest.git ../lib/googletest + git clone -b v1.12.x https://github.com/google/googletest.git ../lib/googletest -# Builds gtest.a and gtest_main.a. +# Builds gtest.a, gtest_main.a, gmock.a, gmock_main.a. # Usually you shouldn't tweak such internal variables, indicated by a # trailing _. GTEST_SRCS_ = $(GTEST_DIR)/src/*.cc $(GTEST_DIR)/src/*.h $(GTEST_HEADERS) +GMOCK_SRCS_ = $(GMOCK_DIR)/src/*.cc $(GMOCK_HEADERS) # All the IR protocol object files. PROTOCOL_OBJS = $(patsubst %.cpp,%.o,$(wildcard $(USER_DIR)/ir_*.cpp)) @@ -82,7 +94,7 @@ PROTOCOLS_H = $(wildcard $(USER_DIR)/ir_*.h) # Common object files COMMON_OBJ = IRutils.o IRtimer.o IRsend.o IRrecv.o IRac.o ir_GlobalCache.o \ - IRtext.o $(PROTOCOLS) gtest_main.a + IRtext.o $(PROTOCOLS) gtest_main.a gmock_main.a # Common dependencies COMMON_DEPS = $(USER_DIR)/IRrecv.h $(USER_DIR)/IRsend.h $(USER_DIR)/IRtimer.h \ $(USER_DIR)/IRutils.h $(USER_DIR)/IRremoteESP8266.h \ @@ -90,26 +102,41 @@ COMMON_DEPS = $(USER_DIR)/IRrecv.h $(USER_DIR)/IRsend.h $(USER_DIR)/IRtimer.h \ $(PROTOCOLS_H) # Common test dependencies -COMMON_TEST_DEPS = $(COMMON_DEPS) IRrecv_test.h IRsend_test.h +COMMON_TEST_DEPS = $(COMMON_DEPS) IRrecv_test.h IRsend_test.h ut_utils.h -# For simplicity and to avoid depending on Google Test's -# implementation details, the dependencies specified below are -# conservative and not optimized. This is fine as Google Test -# compiles fast and for ordinary users its source rarely changes. +# For simplicity and to avoid depending on implementation details of +# Google Mock and Google Test, the dependencies specified below are +# conservative and not optimized. This is fine as Google Mock and +# Google Test compile fast and for ordinary users their source rarely +# changes. gtest-all.o : $(GTEST_SRCS_) - $(CXX) $(CPPFLAGS) -I$(GTEST_DIR) $(CXXFLAGS) -c \ + $(CXX) $(CPPFLAGS) -I$(GTEST_DIR) -I$(GMOCK_DIR) $(CXXFLAGS) -c \ $(GTEST_DIR)/src/gtest-all.cc gtest_main.o : $(GTEST_SRCS_) - $(CXX) $(CPPFLAGS) -I$(GTEST_DIR) $(CXXFLAGS) -c \ + $(CXX) $(CPPFLAGS) -I$(GTEST_DIR) -I$(GMOCK_DIR) $(CXXFLAGS) -c \ $(GTEST_DIR)/src/gtest_main.cc +gmock-all.o : $(GMOCK_SRCS_) + $(CXX) $(CPPFLAGS) -I$(GTEST_DIR) -I$(GMOCK_DIR) $(CXXFLAGS) \ + -c $(GMOCK_DIR)/src/gmock-all.cc + +gmock_main.o : $(GMOCK_SRCS_) + $(CXX) $(CPPFLAGS) -I$(GTEST_DIR) -I$(GMOCK_DIR) $(CXXFLAGS) \ + -c $(GMOCK_DIR)/src/gmock_main.cc + gtest.a : gtest-all.o $(AR) $(ARFLAGS) $@ $^ gtest_main.a : gtest-all.o gtest_main.o $(AR) $(ARFLAGS) $@ $^ +gmock.a : gmock-all.o + $(AR) $(ARFLAGS) $@ $^ + +gmock_main.a : gmock_main.o + $(AR) $(ARFLAGS) $@ $^ + # Keep all intermediate files. .SECONDARY: @@ -123,10 +150,10 @@ IRtext.o : $(USER_DIR)/IRtext.cpp $(USER_DIR)/IRtext.h $(USER_DIR)/IRremoteESP82 IRutils.o : $(USER_DIR)/IRutils.cpp $(USER_DIR)/IRutils.h $(USER_DIR)/IRremoteESP8266.h $(USER_DIR)/i18n.h $(USER_DIR)/IRtext.cpp $(USER_DIR)/IRtext.h $(USER_DIR)/locale/*.h $(CXX) $(CPPFLAGS) $(CXXFLAGS) $(INCLUDES) -c $(USER_DIR)/IRutils.cpp -IRutils_test.o : IRutils_test.cpp $(COMMON_TEST_DEPS) $(GTEST_HEADERS) +IRutils_test.o : IRutils_test.cpp $(COMMON_TEST_DEPS) $(GMOCK_HEADERS) $(CXX) $(CPPFLAGS) $(CXXFLAGS) $(INCLUDES) -c IRutils_test.cpp -IRutils_test : IRutils_test.o ir_NEC.o ir_Nikai.o ir_Toshiba.o IRtext.o $(COMMON_OBJ) gtest_main.a +IRutils_test : IRutils_test.o ir_NEC.o ir_Nikai.o ir_Toshiba.o IRtext.o $(COMMON_OBJ) $(GTEST_LIBS) $(CXX) $(CPPFLAGS) $(CXXFLAGS) -lpthread $^ -o $@ IRtimer.o : $(USER_DIR)/IRtimer.cpp $(USER_DIR)/IRtimer.h @@ -135,19 +162,19 @@ IRtimer.o : $(USER_DIR)/IRtimer.cpp $(USER_DIR)/IRtimer.h IRsend.o : $(USER_DIR)/IRsend.cpp $(USER_DIR)/IRsend.h $(USER_DIR)/IRremoteESP8266.h $(CXX) $(CPPFLAGS) $(CXXFLAGS) -c $(USER_DIR)/IRsend.cpp -IRsend_test.o : IRsend_test.cpp $(USER_DIR)/IRsend.h $(USER_DIR)/IRrecv.h IRsend_test.h $(GTEST_HEADERS) +IRsend_test.o : IRsend_test.cpp $(USER_DIR)/IRsend.h $(USER_DIR)/IRrecv.h IRsend_test.h $(GMOCK_HEADERS) $(CXX) $(CPPFLAGS) $(CXXFLAGS) $(INCLUDES) -c IRsend_test.cpp -IRrecv.o : $(USER_DIR)/IRrecv.cpp $(USER_DIR)/IRrecv.h $(USER_DIR)/IRremoteESP8266.h $(GTEST_HEADERS) +IRrecv.o : $(USER_DIR)/IRrecv.cpp $(USER_DIR)/IRrecv.h $(USER_DIR)/IRremoteESP8266.h $(GMOCK_HEADERS) $(CXX) $(CPPFLAGS) $(CXXFLAGS) -c $(USER_DIR)/IRrecv.cpp -IRrecv_test.o : IRrecv_test.cpp $(USER_DIR)/IRsend.h $(USER_DIR)/IRrecv.h IRsend_test.h $(GTEST_HEADERS) +IRrecv_test.o : IRrecv_test.cpp $(USER_DIR)/IRsend.h $(USER_DIR)/IRrecv.h IRsend_test.h $(GMOCK_HEADERS) $(CXX) $(CPPFLAGS) $(CXXFLAGS) $(INCLUDES) -c IRrecv_test.cpp -IRac.o : $(USER_DIR)/IRac.cpp $(USER_DIR)/IRac.h $(COMMON_DEPS) $(GTEST_HEADERS) +IRac.o : $(USER_DIR)/IRac.cpp $(USER_DIR)/IRac.h $(COMMON_DEPS) $(GMOCK_HEADERS) $(CXX) $(CPPFLAGS) $(CXXFLAGS) $(INCLUDES) -c $(USER_DIR)/IRac.cpp -IRac_test.o : IRac_test.cpp $(USER_DIR)/IRac.h $(COMMON_DEPS) $(GTEST_HEADERS) +IRac_test.o : IRac_test.cpp $(USER_DIR)/IRac.h $(COMMON_DEPS) $(GMOCK_HEADERS) $(CXX) $(CPPFLAGS) $(CXXFLAGS) $(INCLUDES) -c IRac_test.cpp # new specific targets goes above this line @@ -158,11 +185,11 @@ ir_%.o : $(USER_DIR)/ir_%.h $(USER_DIR)/ir_%.cpp $(COMMON_DEPS) ir_%.o : $(USER_DIR)/ir_%.cpp $(COMMON_DEPS) $(CXX) $(CPPFLAGS) $(CXXFLAGS) $(INCLUDES) -c $(USER_DIR)/ir_$*.cpp -ir_%_test.o : ir_%_test.cpp $(USER_DIR)/ir_$%.h $(COMMON_TEST_DEPS) $(GTEST_HEADERS) +ir_%_test.o : ir_%_test.cpp $(USER_DIR)/ir_$%.h $(COMMON_TEST_DEPS) $(GMOCK_HEADERS) $(CXX) $(CPPFLAGS) $(CXXFLAGS) $(INCLUDES) -c ir_$*_test.cpp -ir_%_test.o : ir_%_test.cpp $(COMMON_TEST_DEPS) $(GTEST_HEADERS) +ir_%_test.o : ir_%_test.cpp $(COMMON_TEST_DEPS) $(GMOCK_HEADERS) $(CXX) $(CPPFLAGS) $(CXXFLAGS) $(INCLUDES) -c ir_$*_test.cpp -%_test : $(COMMON_OBJ) %_test.o +%_test : $(COMMON_OBJ) %_test.o $(GTEST_LIBS) $(CXX) $(CPPFLAGS) $(CXXFLAGS) -lpthread $^ -o $@ diff --git a/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/test/ir_Argo_test.cpp b/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/test/ir_Argo_test.cpp index 3ab890adc..817272a17 100644 --- a/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/test/ir_Argo_test.cpp +++ b/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/test/ir_Argo_test.cpp @@ -1,15 +1,22 @@ // Copyright 2019 David Conran +// Copyright 2022 Mateusz Bronk (mbronk) +#include +#include +#include #include "ir_Argo.h" #include "IRac.h" #include "IRrecv.h" #include "IRrecv_test.h" #include "IRsend.h" #include "IRsend_test.h" -#include "gtest/gtest.h" +#include "./ut_utils.h" +/******************************************************************************/ +/* Tests for toCommon() */ +/******************************************************************************/ TEST(TestArgoACClass, toCommon) { - IRArgoAC ac(0); + IRArgoAC ac(kGpioUnused); ac.setPower(true); ac.setMode(kArgoCool); ac.setTemp(20); @@ -18,6 +25,7 @@ TEST(TestArgoACClass, toCommon) { ac.setNight(true); // Now test it. ASSERT_EQ(decode_type_t::ARGO, ac.toCommon().protocol); + ASSERT_EQ(stdAc::ac_command_t::kControlCommand, ac.toCommon().command); ASSERT_TRUE(ac.toCommon().power); ASSERT_TRUE(ac.toCommon().celsius); ASSERT_EQ(20, ac.toCommon().degrees); @@ -25,8 +33,8 @@ TEST(TestArgoACClass, toCommon) { ASSERT_EQ(stdAc::fanspeed_t::kMax, ac.toCommon().fanspeed); ASSERT_EQ(0, ac.toCommon().sleep); ASSERT_TRUE(ac.toCommon().turbo); + ASSERT_EQ(argo_ac_remote_model_t::SAC_WREM2, ac.toCommon().model); // Unsupported. - ASSERT_EQ(-1, ac.toCommon().model); ASSERT_EQ(stdAc::swingv_t::kOff, ac.toCommon().swingv); ASSERT_EQ(stdAc::swingh_t::kOff, ac.toCommon().swingh); ASSERT_FALSE(ac.toCommon().econo); @@ -36,30 +44,229 @@ TEST(TestArgoACClass, toCommon) { ASSERT_FALSE(ac.toCommon().beep); ASSERT_FALSE(ac.toCommon().quiet); ASSERT_EQ(-1, ac.toCommon().clock); + ASSERT_FALSE(ac.toCommon().iFeel); + ASSERT_EQ(25, ac.toCommon().sensorTemperature); } +TEST(TestArgoAC_WREM3Class, toCommon) { + IRArgoAC_WREM3 ac(kGpioUnused); + ac.setPower(true); + ac.setMode(argoMode_t::COOL); + ac.setTemp(21); + ac.setFan(argoFan_t::FAN_HIGHEST); + ac.setMax(true); + ac.setNight(true); + ac.setFlap(argoFlap_t::FLAP_4); + ac.setEco(true); + ac.setFilter(true); + ac.setLight(true); + ac.setiFeel(true); + // Now test it. + ASSERT_EQ(decode_type_t::ARGO, ac.toCommon().protocol); + ASSERT_EQ(argo_ac_remote_model_t::SAC_WREM3, ac.toCommon().model); + ASSERT_EQ(stdAc::ac_command_t::kControlCommand, ac.toCommon().command); + ASSERT_TRUE(ac.toCommon().celsius); + ASSERT_TRUE(ac.toCommon().beep); // Always on (except for iFeel) + ASSERT_FALSE(ac.toCommon().clean); + ASSERT_EQ(-1, ac.toCommon().clock); + ASSERT_EQ(0, ac.toCommon().sleep); + ASSERT_EQ(stdAc::swingh_t::kOff, ac.toCommon().swingh); + ASSERT_TRUE(ac.toCommon().power); + ASSERT_EQ(stdAc::opmode_t::kCool, ac.toCommon().mode); + ASSERT_EQ(21, ac.toCommon().degrees); + ASSERT_EQ(stdAc::fanspeed_t::kMax, ac.toCommon().fanspeed); + ASSERT_TRUE(ac.toCommon().turbo); + ASSERT_TRUE(ac.toCommon().quiet); // Night + ASSERT_EQ(stdAc::swingv_t::kUpperMiddle, ac.toCommon().swingv); + ASSERT_TRUE(ac.toCommon().econo); + ASSERT_TRUE(ac.toCommon().light); + ASSERT_TRUE(ac.toCommon().filter); + ASSERT_TRUE(ac.toCommon().iFeel); + ASSERT_EQ(25, ac.toCommon().sensorTemperature); +} + +/******************************************************************************/ +/* Tests of message construction */ +/******************************************************************************/ + TEST(TestArgoACClass, MessageConstructon) { - IRArgoAC ac(0); + IRArgoAC ac(kGpioUnused); ac.setPower(true); ac.setTemp(20); ac.setMode(kArgoCool); ac.setFan(kArgoFanAuto); - ac.setRoomTemp(21); + ac.setSensorTemp(21); ac.setiFeel(true); ac.setMax(true); ac.setNight(true); // Don't implicitly trust this. It's just a guess. - uint8_t expected[kArgoStateLength] = { - 0xAC, 0xF5, 0x00, 0x24, 0x02, 0x00, 0x00, 0x00, 0x00, 0xAC, 0xD6, 0x01}; - EXPECT_STATE_EQ(expected, ac.getRaw(), kArgoBits); + auto expected = std::vector({ + 0xAC, 0xF5, 0x00, 0x24, 0x02, 0x00, 0x00, 0x00, 0x00, 0xAC, 0xD6, 0x01}); + auto actual = ac.getRaw(); + EXPECT_THAT(std::vector(actual, actual + kArgoBits / 8), + ::testing::ElementsAreArray(expected)); EXPECT_EQ( - "Power: On, Mode: 0 (Cool), Fan: 0 (Auto), Temp: 20C, Room Temp: 21C, " - "Max: On, IFeel: On, Night: On", + "Model: 1 (WREM2), Power: On, Mode: 0 (Cool), Fan: 0 (Auto), Temp: 20C, " + "Sensor Temp: 21C, Max: On, IFeel: On, Night: On", ac.toString()); } -// Tests for sendArgo(). +TEST(TestArgoAC_WREM3Class, MessageConstructon_ACControl) { + IRArgoAC_WREM3 ac(kGpioUnused); + ac.setChannel(0); + ac.setPower(true); + ac.setMode(argoMode_t::COOL); + ac.setTemp(22); + ac.setSensorTemp(26); + ac.setFan(argoFan_t::FAN_AUTO); + ac.setFlap(argoFlap_t::FLAP_FULL); + ac.setiFeel(false); + ac.setNight(false); + ac.setEco(false); + ac.setMax(false); + ac.setFilter(false); + ac.setLight(true); + auto expected = std::vector({ + 0x0B, 0x36, 0x12, 0x0F, 0xC2, 0x24}); + auto actual = ac.getRaw(); + ASSERT_EQ(ac.getRawByteLength(), kArgo3AcControlStateLength); + EXPECT_THAT(std::vector(actual, actual + ac.getRawByteLength()), + ::testing::ElementsAreArray(expected)); + EXPECT_EQ( + "Command[CH#0]: Model: 2 (WREM3), Power: On, Mode: 1 (Cool), Temp: 22C, " + "Sensor Temp: 26C, Fan: 0 (Auto), Swing(V): 7 (Breeze), IFeel: Off, " + "Night: Off, Econo: Off, Max: Off, Filter: Off, Light: On", + ac.toString()); +} + +TEST(TestArgoAC_WREM3Class, MessageConstructon_ACControl_2) { + IRArgoAC_WREM3 ac(kGpioUnused); + ac.setChannel(2); + ac.setPower(true); + ac.setMode(argoMode_t::AUTO); + ac.setTemp(23); + ac.setSensorTemp(28); + ac.setFan(argoFan_t::FAN_MEDIUM); + ac.setMax(true); + ac.setNight(true); + ac.setFlap(argoFlap_t::FLAP_4); + ac.setEco(true); + ac.setFilter(true); + ac.setLight(true); + ac.setiFeel(true); + auto expected = std::vector({ + 0x2B, 0xB8, 0x93, 0xFC, 0xC3, 0x35}); + auto actual = ac.getRaw(); + ASSERT_EQ(ac.getRawByteLength(), kArgo3AcControlStateLength); + EXPECT_THAT(std::vector(actual, actual + ac.getRawByteLength()), + ::testing::ElementsAreArray(expected)); + EXPECT_EQ( + "Command[CH#2]: Model: 2 (WREM3), Power: On, Mode: 5 (Auto), Temp: 23C, " + "Sensor Temp: 28C, Fan: 4 (Med-High), Swing(V): 4 (Middle), IFeel: On, " + "Night: On, Econo: On, Max: On, Filter: On, Light: On", + ac.toString()); +} + +TEST(TestArgoAC_WREM3Class, MessageConstructon_iFeelReport) { + IRArgoAC_WREM3 ac(kGpioUnused); + ac.setMessageType(argoIrMessageType_t::IFEEL_TEMP_REPORT); + ac.setSensorTemp(31); + + auto expected = std::vector({0x4B, 0xDB}); + auto actual = ac.getRaw(); + ASSERT_EQ(ac.getRawByteLength(), kArgo3iFeelReportStateLength); + EXPECT_THAT(std::vector(actual, actual + ac.getRawByteLength()), + ::testing::ElementsAreArray(expected)); + EXPECT_EQ( + "IFeel Report[CH#0]: Model: 2 (WREM3), Sensor Temp: 31C", + ac.toString()); +} + +TEST(TestArgoAC_WREM3Class, MessageConstructon_Config) { + IRArgoAC_WREM3 ac(kGpioUnused); + ac.setMessageType(argoIrMessageType_t::CONFIG_PARAM_SET); + ac.setConfigEntry(6, 30); + + auto expected = std::vector({0xCB, 0x06, 0x1E, 0xEF}); + auto actual = ac.getRaw(); + ASSERT_EQ(ac.getRawByteLength(), kArgo3ConfigStateLength); + EXPECT_THAT(std::vector(actual, actual + ac.getRawByteLength()), + ::testing::ElementsAreArray(expected)); + EXPECT_EQ( + "Config[CH#0]: Model: 2 (WREM3), Key: 6, Value: 30", + ac.toString()); +} + +TEST(TestArgoAC_WREM3Class, MessageConstructon_NoTimer) { + IRArgoAC_WREM3 ac(kGpioUnused); + ac.setMessageType(argoIrMessageType_t::TIMER_COMMAND); + ac.off(); + ac.setCurrentTimeMinutes(1*60+59); + ac.setCurrentDayOfWeek(argoWeekday::MONDAY); + ac.setTimerType(argoTimerType_t::NO_TIMER); + + auto expected = std::vector({0x8B, 0x70, 0x87, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x34}); + auto actual = ac.getRaw(); + ASSERT_EQ(ac.getRawByteLength(), kArgo3TimerStateLength); + EXPECT_THAT(std::vector(actual, actual + ac.getRawByteLength()), + ::testing::ElementsAreArray(expected)); + EXPECT_EQ( + "Timer[CH#0]: Model: 2 (WREM3), Power: Off, Timer Mode: 0 (Off), " + "Clock: 01:59, Day: 1 (Mon), Timer: Off", + ac.toString()); +} + +TEST(TestArgoAC_WREM3Class, MessageConstructon_DelayTimer) { + IRArgoAC_WREM3 ac(kGpioUnused); + ac.setMessageType(argoIrMessageType_t::TIMER_COMMAND); + ac.off(); + ac.setCurrentTimeMinutes(12*60+00); + ac.setCurrentDayOfWeek(argoWeekday::SATURDAY); + ac.setTimerType(argoTimerType_t::DELAY_TIMER); + ac.setDelayTimerMinutes(9*60+40); + + auto expected = std::vector({0x8B, 0x02, 0x2D, 0x13, 0x09, 0x00, + 0x00, 0x00, 0xD4}); + auto actual = ac.getRaw(); + ASSERT_EQ(ac.getRawByteLength(), kArgo3TimerStateLength); + EXPECT_THAT(std::vector(actual, actual + ac.getRawByteLength()), + ::testing::ElementsAreArray(expected)); + EXPECT_EQ( + "Timer[CH#0]: Model: 2 (WREM3), Power: Off, Timer Mode: 1 (Sleep Timer)," + " Clock: 12:00, Day: 6 (Sat), Timer: 09:40", + ac.toString()); +} + +TEST(TestArgoAC_WREM3Class, MessageConstructon_ScheduleTimer) { + IRArgoAC_WREM3 ac(kGpioUnused); + ac.setMessageType(argoIrMessageType_t::TIMER_COMMAND); + ac.on(); + ac.setCurrentTimeMinutes(18*60+16); + ac.setCurrentDayOfWeek(argoWeekday::SATURDAY); + ac.setTimerType(argoTimerType_t::SCHEDULE_TIMER_3); + ac.setScheduleTimerStartMinutes(8*60+40); + ac.setScheduleTimerStopMinutes(19*60+50); + ac.setScheduleTimerActiveDays({argoWeekday::MONDAY, argoWeekday::SATURDAY, + argoWeekday::SUNDAY}); + + auto expected = std::vector({0x8B, 0x89, 0x44, 0x03, 0x00, 0x41, + 0xA6, 0x1C, 0x26}); + auto actual = ac.getRaw(); + ASSERT_EQ(ac.getRawByteLength(), kArgo3TimerStateLength); + EXPECT_THAT(std::vector(actual, actual + ac.getRawByteLength()), + ::testing::ElementsAreArray(expected)); + EXPECT_EQ( + "Timer[CH#0]: Model: 2 (WREM3), Power: On, Timer Mode: 4 (Schedule3)," + " Clock: 18:16, Day: 6 (Sat), On Timer: 08:40, Off Timer: 19:50, " + "TimerActiveDays: Sun|Mon|Sat", + ac.toString()); +} + +/******************************************************************************/ +/* Tests for sendArgo(). */ +/******************************************************************************/ // Test sending typical data only. TEST(TestSendArgo, SendDataOnly) { @@ -88,12 +295,39 @@ TEST(TestSendArgo, SendDataOnly) { irsend.outputStr()); } -// Tests for decodeArgo(). -// Decode normal Argo messages. - -TEST(TestDecodeArgo, SyntheticDecode) { +TEST(TestSendArgoWrem3, SendDataOnly) { IRsendTest irsend(0); - IRrecv irrecv(0); + irsend.begin(); + uint8_t data[kArgoStateLength] = { + 0x0B, 0x31, 0x35, 0xFE, 0xC0, 0x2F}; + + irsend.sendArgoWREM3(data); + EXPECT_EQ( + "f38000d50" + "m6400s3300" + "m400s2200m400s2200m400s900m400s2200m400s900m400s900m400s900m400s900" + "m400s2200m400s900m400s900m400s900m400s2200m400s2200m400s900m400s900" + "m400s2200m400s900m400s2200m400s900m400s2200m400s2200m400s900m400s900" + "m400s900m400s2200m400s2200m400s2200m400s2200m400s2200m400s2200m400s2200" + "m400s900m400s900m400s900m400s900m400s900m400s900m400s2200m400s2200" + "m400s2200m400s2200m400s2200m400s2200m400s900m400s2200m400s900m400s900" + "m400s900m400s900m400s900m400s900m400s900m400s900m400s900m400s900m400s900" + "m400s900m400s900m400s900m400s900m400s900m400s900m400s900m400s900m400s900" + "m400s900m400s900m400s900m400s900m400s900m400s900m400s900m400s900m400s900" + "m400s900m400s900m400s900m400s900m400s900m400s900m400s900m400s900m400s900" + "m400s900m400s900m400s900m400s900m400s900m400s900m400s900m400s900m400s900" + "m400s900m400s900m400s900m400s100000", + irsend.outputStr()); +} + +/******************************************************************************/ +/* Tests for decodeArgo(). */ +/******************************************************************************/ + +// Decode normal Argo messages. +TEST(TestDecodeArgo, SyntheticDecode) { + IRsendTest irsend(kGpioUnused); + IRrecv irrecv(kGpioUnused); irsend.begin(); // Synthesised Normal Argo message. @@ -107,16 +341,235 @@ TEST(TestDecodeArgo, SyntheticDecode) { EXPECT_EQ(kArgoBits, irsend.capture.bits); EXPECT_STATE_EQ(expectedState, irsend.capture.state, irsend.capture.bits); EXPECT_EQ( - "Power: On, Mode: 0 (Cool), Fan: 0 (Auto), Temp: 20C, Room Temp: 21C, " - "Max: On, IFeel: On, Night: On", + "Model: 1 (WREM2), Power: On, Mode: 0 (Cool), Fan: 0 (Auto), Temp: 20C, " + "Sensor Temp: 21C, Max: On, IFeel: On, Night: On", IRAcUtils::resultAcToString(&irsend.capture)); stdAc::state_t r, p; ASSERT_TRUE(IRAcUtils::decodeToState(&irsend.capture, &r, &p)); } +// Synthetic send and decode ***via common*** interface +TEST(TestIrAc, ArgoWrem2_SyntheticSendAndDecode_ACCommand) { + IRac irac(kGpioUnused); + auto capture = std::make_shared(kGpioUnused); + irac._utReceiver = capture; -TEST(TestArgoACClass, SetAndGetTemp) { - IRArgoAC ac(0); + stdAc::state_t state = {}; + state.protocol = ARGO; + state.model = 1; + state.power = true; + state.mode = stdAc::opmode_t::kCool; + + irac.sendAc(state, nullptr); + ASSERT_NE(nullptr, irac._lastDecodeResults); + EXPECT_EQ(ARGO, irac._lastDecodeResults->decode_type); + EXPECT_EQ("Model: 1 (WREM2), Power: On, Mode: 0 (Cool), Fan: 0 (Auto), " + "Temp: 25C, Sensor Temp: 25C, Max: Off, IFeel: Off, Night: Off", + IRAcUtils::resultAcToString(irac._lastDecodeResults.get())); + + stdAc::state_t r = {}; + ASSERT_TRUE(IRAcUtils::decodeToState(irac._lastDecodeResults.get(), &r, + nullptr)); + EXPECT_EQ(ARGO, r.protocol); + EXPECT_EQ(1, r.model); + EXPECT_TRUE(r.power); + EXPECT_EQ(state.mode, r.mode); +} + +TEST(TestIrAc, ArgoWrem3_SyntheticSendAndDecode_ACCommand) { + IRac irac(kGpioUnused); + auto capture = std::make_shared(kGpioUnused); + irac._utReceiver = capture; + + stdAc::state_t state = {}; + state.protocol = ARGO; + state.model = argo_ac_remote_model_t::SAC_WREM3; + state.power = true; + state.mode = stdAc::opmode_t::kCool; + + irac.sendAc(state, nullptr); + ASSERT_NE(nullptr, irac._lastDecodeResults); + EXPECT_EQ(ARGO, irac._lastDecodeResults->decode_type); + EXPECT_EQ("Command[CH#0]: Model: 2 (WREM3), Power: On, Mode: 1 (Cool)," + " Temp: 25C, Sensor Temp: 25C, Fan: 0 (Auto), Swing(V): 7 (Breeze)," + " IFeel: Off, Night: Off, Econo: Off, Max: Off, Filter: Off, " + "Light: Off", + IRAcUtils::resultAcToString(irac._lastDecodeResults.get())); + + stdAc::state_t r = {}; + ASSERT_TRUE(IRAcUtils::decodeToState(irac._lastDecodeResults.get(), &r, + nullptr)); + EXPECT_EQ(ARGO, r.protocol); + EXPECT_EQ(state.model, r.model); + EXPECT_EQ(state.power, r.power); +} + +TEST(TestIrAc, ArgoWrem3_SyntheticSendAndDecode_iFeelReport) { + IRac irac(kGpioUnused); + auto capture = std::make_shared(kGpioUnused); + irac._utReceiver = capture; + + stdAc::state_t state = {}; + state.protocol = ARGO; + state.model = argo_ac_remote_model_t::SAC_WREM3; + state.command = stdAc::ac_command_t::kSensorTempReport; + state.sensorTemperature = 18.9; // expected to be rounded up + + irac.sendAc(state, nullptr); + + ASSERT_NE(nullptr, irac._lastDecodeResults); + EXPECT_EQ(ARGO, irac._lastDecodeResults->decode_type); + EXPECT_EQ("IFeel Report[CH#0]: Model: 2 (WREM3), Sensor Temp: 19C", + IRAcUtils::resultAcToString(irac._lastDecodeResults.get())); + + stdAc::state_t r = {}; + ASSERT_TRUE(IRAcUtils::decodeToState(irac._lastDecodeResults.get(), &r, + nullptr)); + EXPECT_EQ(ARGO, r.protocol); + EXPECT_EQ(state.model, r.model); + EXPECT_EQ(state.command, r.command); + EXPECT_EQ(19, r.sensorTemperature); +} + +TEST(TestIrAc, ArgoWrem3_SyntheticSendAndDecode_Timer) { + IRac irac(kGpioUnused); + auto capture = std::make_shared(kGpioUnused); + irac._utReceiver = capture; + + stdAc::state_t state = {}; + state.protocol = ARGO; + state.model = argo_ac_remote_model_t::SAC_WREM3; + state.command = stdAc::ac_command_t::kTimerCommand; + state.power = true; + state.mode = stdAc::opmode_t::kAuto; // Needs to be set for `state.power` + // not to be ignored! + state.clock = 13*60+21; + state.sleep = 2*60+10; + + irac.sendAc(state, nullptr); + + ASSERT_NE(nullptr, irac._lastDecodeResults); + EXPECT_EQ(ARGO, irac._lastDecodeResults->decode_type); + EXPECT_EQ("Timer[CH#0]: Model: 2 (WREM3), Power: On, Timer Mode: 1 " + "(Sleep Timer), Clock: 13:21, Day: 0 (Sun), Timer: 02:10", + IRAcUtils::resultAcToString(irac._lastDecodeResults.get())); + + stdAc::state_t r = {}; + ASSERT_TRUE(IRAcUtils::decodeToState(irac._lastDecodeResults.get(), &r, + nullptr)); + EXPECT_EQ(ARGO, r.protocol); + EXPECT_EQ(state.model, r.model); + EXPECT_EQ(state.command, r.command); + EXPECT_EQ(state.power, r.power); + EXPECT_EQ(state.clock, r.clock); + EXPECT_EQ(state.sleep, r.sleep); +} + +/// +/// @brief Test fixture for Config messages sent via @c IRAc generic i-face +/// @note The commands are abusing generic intafrace and instead are +/// using: @c clock -> for settingID +/// @c sleep -> for setting Value +/// +class TestArgoConfigViaIRAc : + public ::testing::TestWithParam> { +}; + +class TestArgoConfigViaIRAc_Positive : public TestArgoConfigViaIRAc {}; +TEST_P(TestArgoConfigViaIRAc_Positive, + ArgoWrem3_SyntheticSendAndDecode_Config_Positive) { + int16_t settingId = std::get<0>(GetParam()); + int16_t settingValue = std::get<1>(GetParam()); + IRac irac(kGpioUnused); + auto capture = std::make_shared(kGpioUnused); + irac._utReceiver = capture; + + stdAc::state_t state = {}; + state.protocol = ARGO; + state.model = argo_ac_remote_model_t::SAC_WREM3; + state.command = stdAc::ac_command_t::kConfigCommand; + state.clock = settingId; + state.sleep = settingValue; + + irac.sendAc(state, nullptr); + + ASSERT_NE(nullptr, irac._lastDecodeResults); + EXPECT_EQ(ARGO, irac._lastDecodeResults->decode_type); + std::ostringstream ossExpectedStr; + ossExpectedStr << "Config[CH#0]: Model: 2 (WREM3), Key: " << settingId + << ", Value: " << settingValue; + EXPECT_EQ(ossExpectedStr.str(), + IRAcUtils::resultAcToString(irac._lastDecodeResults.get())); + + stdAc::state_t r = {}; + ASSERT_TRUE(IRAcUtils::decodeToState(irac._lastDecodeResults.get(), &r, + nullptr)); + EXPECT_EQ(ARGO, r.protocol); + EXPECT_EQ(state.model, r.model); + EXPECT_EQ(state.command, r.command); +} + +INSTANTIATE_TEST_CASE_P( + TestIrAc, + TestArgoConfigViaIRAc_Positive, + ::testing::Values( + std::make_tuple(5, 0), + std::make_tuple(5, 1), + std::make_tuple(6, 0), + std::make_tuple(6, 1), + std::make_tuple(6, 2), + std::make_tuple(6, 3), + std::make_tuple(12, 30), + std::make_tuple(12, 75), + std::make_tuple(12, 99) +)); + +class TestArgoConfigViaIRAc_Negative : public TestArgoConfigViaIRAc {}; +TEST_P(TestArgoConfigViaIRAc_Negative, + ArgoWrem3_SyntheticSendAndDecode_Config_Negative) { + int16_t settingId = std::get<0>(GetParam()); + int16_t settingValue = std::get<1>(GetParam()); + IRac irac(kGpioUnused); + auto capture = std::make_shared(kGpioUnused); + irac._utReceiver = capture; + + stdAc::state_t state = {}; + state.protocol = ARGO; + state.model = argo_ac_remote_model_t::SAC_WREM3; + state.command = stdAc::ac_command_t::kConfigCommand; + state.clock = settingId; + state.sleep = settingValue; + + irac.sendAc(state, nullptr); + + // The "safe" mode should have prevented the message from sending out + ASSERT_EQ(nullptr, irac._lastDecodeResults); // nothing got sent +} + +INSTANTIATE_TEST_CASE_P( + TestIrAc, + TestArgoConfigViaIRAc_Negative, + ::testing::Values( + std::make_tuple(5, 2), + std::make_tuple(6, 4), + std::make_tuple(12, 29), + std::make_tuple(12, 100), + std::make_tuple(0, 0), + std::make_tuple(80, 86) +)); + + +/******************************************************************************/ +/* Tests for IRArgoACBase (comon functionality across WREM2 and WREM3) */ +/******************************************************************************/ + +using IRArgoACBase_typelist = ::testing::Types; +template struct TestArgoACBaseClass : public testing::Test {}; +TYPED_TEST_CASE(TestArgoACBaseClass, IRArgoACBase_typelist); + + +TYPED_TEST(TestArgoACBaseClass, SetAndGetTemp) { + IRArgoACBase ac(kGpioUnused); ac.setTemp(25); EXPECT_EQ(25, ac.getTemp()); @@ -130,59 +583,107 @@ TEST(TestArgoACClass, SetAndGetTemp) { EXPECT_EQ(kArgoMaxTemp, ac.getTemp()); } -TEST(TestArgoACClass, SetAndGetRoomTemp) { - IRArgoAC ac(0); +TYPED_TEST(TestArgoACBaseClass, SetAndGetSensorTemp) { + IRArgoACBase ac(kGpioUnused); - ac.setRoomTemp(25); - EXPECT_EQ(25, ac.getRoomTemp()); - ac.setRoomTemp(kArgoTempDelta); - EXPECT_EQ(kArgoTempDelta, ac.getRoomTemp()); - ac.setRoomTemp(kArgoMaxRoomTemp); - EXPECT_EQ(kArgoMaxRoomTemp, ac.getRoomTemp()); - ac.setRoomTemp(kArgoTempDelta - 1); - EXPECT_EQ(kArgoTempDelta, ac.getRoomTemp()); - ac.setRoomTemp(kArgoMaxRoomTemp + 1); - EXPECT_EQ(kArgoMaxRoomTemp, ac.getRoomTemp()); + // Room Temp from AC command + ac.setSensorTemp(25); + EXPECT_EQ(25, ac.getSensorTemp()); + ac.setSensorTemp(kArgoTempDelta); + EXPECT_EQ(kArgoTempDelta, ac.getSensorTemp()); + ac.setSensorTemp(kArgoMaxRoomTemp); + EXPECT_EQ(kArgoMaxRoomTemp, ac.getSensorTemp()); + ac.setSensorTemp(kArgoTempDelta - 1); + EXPECT_EQ(kArgoTempDelta, ac.getSensorTemp()); + ac.setSensorTemp(kArgoMaxRoomTemp + 1); + EXPECT_EQ(kArgoMaxRoomTemp, ac.getSensorTemp()); + + // Room temp from iFeel coommand + ac.setMessageType(argoIrMessageType_t::IFEEL_TEMP_REPORT); // reset + EXPECT_EQ(kArgoTempDelta, ac.getSensorTemp()); + ac.setSensorTemp(19); + EXPECT_EQ(19, ac.getSensorTemp()); + ac.setSensorTemp(kArgoTempDelta); + EXPECT_EQ(kArgoTempDelta, ac.getSensorTemp()); + ac.setSensorTemp(kArgoMaxRoomTemp); + EXPECT_EQ(kArgoMaxRoomTemp, ac.getSensorTemp()); + ac.setSensorTemp(kArgoTempDelta - 1); + EXPECT_EQ(kArgoTempDelta, ac.getSensorTemp()); + ac.setSensorTemp(kArgoMaxRoomTemp + 1); + EXPECT_EQ(kArgoMaxRoomTemp, ac.getSensorTemp()); } -TEST(TestArgoACClass, SetAndGetMode) { - IRArgoAC ac(0); +TYPED_TEST(TestArgoACBaseClass, SetAndGetModeEx) { + IRArgoACBase ac(kGpioUnused); - ac.setMode(kArgoHeat); - EXPECT_EQ(kArgoHeat, ac.getMode()); - ac.setMode(kArgoCool); - EXPECT_EQ(kArgoCool, ac.getMode()); - ac.setMode(kArgoDry); - EXPECT_EQ(kArgoDry, ac.getMode()); - ac.setMode(kArgoAuto); - EXPECT_EQ(kArgoAuto, ac.getMode()); - ac.setMode(kArgoHeatAuto); - EXPECT_EQ(kArgoHeatAuto, ac.getMode()); - ac.setMode(kArgoOff); - EXPECT_EQ(kArgoOff, ac.getMode()); - ac.setMode(255); - EXPECT_EQ(kArgoAuto, ac.getMode()); + ac.setMode(argoMode_t::HEAT); + EXPECT_EQ(argoMode_t::HEAT, ac.getModeEx()); + ac.setMode(argoMode_t::AUTO); + EXPECT_EQ(argoMode_t::AUTO, ac.getModeEx()); + ac.setMode(argoMode_t::COOL); + EXPECT_EQ(argoMode_t::COOL, ac.getModeEx()); + ac.setMode(argoMode_t::DRY); + EXPECT_EQ(argoMode_t::DRY, ac.getModeEx()); + ac.setMode(argoMode_t::FAN); + EXPECT_EQ(argoMode_t::FAN, ac.getModeEx()); + ac.setMode(static_cast(255)); + EXPECT_EQ(argoMode_t::AUTO, ac.getModeEx()); } -TEST(TestArgoACClass, SetAndGetFan) { - IRArgoAC ac(0); +TYPED_TEST(TestArgoACBaseClass, SetAndGetFanEx) { + IRArgoACBase ac(kGpioUnused); - ac.setFan(kArgoFan3); - EXPECT_EQ(kArgoFan3, ac.getFan()); - ac.setFan(kArgoFan1); - EXPECT_EQ(kArgoFan1, ac.getFan()); - ac.setFan(kArgoFanAuto); - EXPECT_EQ(kArgoFanAuto, ac.getFan()); - ac.setFan(kArgoFan3); - EXPECT_EQ(kArgoFan3, ac.getFan()); - ASSERT_NE(7, kArgoFan3); - // Now try some unexpected value. - ac.setFan(7); - EXPECT_EQ(kArgoFan3, ac.getFan()); + ac.setFan(argoFan_t::FAN_AUTO); + EXPECT_EQ(argoFan_t::FAN_AUTO, ac.getFanEx()); + ac.setFan(argoFan_t::FAN_HIGHEST); + EXPECT_EQ(argoFan_t::FAN_HIGHEST, ac.getFanEx()); + if (std::is_same()) { + // Only supported on WREM3 + ac.setFan(argoFan_t::FAN_HIGH); + EXPECT_EQ(argoFan_t::FAN_HIGH, ac.getFanEx()); + } + ac.setFan(argoFan_t::FAN_MEDIUM); + EXPECT_EQ(argoFan_t::FAN_MEDIUM, ac.getFanEx()); + if (std::is_same()) { + // Only supported on WREM3 + ac.setFan(argoFan_t::FAN_LOW); + EXPECT_EQ(argoFan_t::FAN_LOW, ac.getFanEx()); + ac.setFan(argoFan_t::FAN_LOWER); + EXPECT_EQ(argoFan_t::FAN_LOWER, ac.getFanEx()); + } + ac.setFan(argoFan_t::FAN_LOWEST); + EXPECT_EQ(argoFan_t::FAN_LOWEST, ac.getFanEx()); + ac.setFan(static_cast(255)); + EXPECT_EQ(argoFan_t::FAN_AUTO, ac.getFanEx()); } -TEST(TestArgoACClass, Night) { - IRArgoAC ac(0); +TYPED_TEST(TestArgoACBaseClass, SetAndGetFlapEx) { + IRArgoACBase ac(kGpioUnused); + + ac.setFlap(argoFlap_t::FLAP_FULL); + EXPECT_EQ(argoFlap_t::FLAP_FULL, ac.getFlapEx()); + ac.setFlap(argoFlap_t::FLAP_AUTO); + EXPECT_EQ(argoFlap_t::FLAP_AUTO, ac.getFlapEx()); + ac.setFlap(argoFlap_t::FLAP_6); + EXPECT_EQ(argoFlap_t::FLAP_6, ac.getFlapEx()); + ac.setFlap(argoFlap_t::FLAP_5); + EXPECT_EQ(argoFlap_t::FLAP_5, ac.getFlapEx()); + ac.setFlap(argoFlap_t::FLAP_4); + EXPECT_EQ(argoFlap_t::FLAP_4, ac.getFlapEx()); + ac.setFlap(argoFlap_t::FLAP_3); + EXPECT_EQ(argoFlap_t::FLAP_3, ac.getFlapEx()); + ac.setFlap(argoFlap_t::FLAP_2); + EXPECT_EQ(argoFlap_t::FLAP_2, ac.getFlapEx()); + ac.setFlap(argoFlap_t::FLAP_1); + EXPECT_EQ(argoFlap_t::FLAP_1, ac.getFlapEx()); + ac.setFlap(argoFlap_t::FLAP_FULL); + ac.setFlap(static_cast(255)); + EXPECT_EQ(argoFlap_t::FLAP_AUTO, ac.getFlapEx()); +} + +TYPED_TEST(TestArgoACBaseClass, Night) { + IRArgoACBase ac(kGpioUnused); + ac.setNight(false); ASSERT_FALSE(ac.getNight()); ac.setNight(true); @@ -191,8 +692,9 @@ TEST(TestArgoACClass, Night) { ASSERT_FALSE(ac.getNight()); } -TEST(TestArgoACClass, iFeel) { - IRArgoAC ac(0); +TYPED_TEST(TestArgoACBaseClass, iFeel) { + IRArgoACBase ac(kGpioUnused); + ac.setiFeel(false); ASSERT_FALSE(ac.getiFeel()); ac.setiFeel(true); @@ -201,8 +703,9 @@ TEST(TestArgoACClass, iFeel) { ASSERT_FALSE(ac.getiFeel()); } -TEST(TestArgoACClass, Power) { - IRArgoAC ac(0); +TYPED_TEST(TestArgoACBaseClass, Power) { + IRArgoACBase ac(kGpioUnused); + ac.setPower(false); ASSERT_FALSE(ac.getPower()); ac.setPower(true); @@ -211,8 +714,18 @@ TEST(TestArgoACClass, Power) { ASSERT_FALSE(ac.getPower()); } -TEST(TestArgoACClass, Max) { - IRArgoAC ac(0); +TYPED_TEST(TestArgoACBaseClass, OnOff) { + IRArgoACBase ac(kGpioUnused); + + ASSERT_FALSE(ac.getPower()); + ac.on(); + ASSERT_TRUE(ac.getPower()); + ac.off(); + ASSERT_FALSE(ac.getPower()); +} + +TYPED_TEST(TestArgoACBaseClass, Max) { + IRArgoACBase ac(kGpioUnused); ac.setMax(false); ASSERT_FALSE(ac.getMax()); ac.setMax(true); @@ -221,8 +734,875 @@ TEST(TestArgoACClass, Max) { ASSERT_FALSE(ac.getMax()); } +TYPED_TEST(TestArgoACBaseClass, SetAndGetMessageType) { + IRArgoACBase ac(kGpioUnused); + + ac.setMessageType(argoIrMessageType_t::AC_CONTROL); + EXPECT_EQ(argoIrMessageType_t::AC_CONTROL, ac.getMessageType()); + ac.setMessageType(argoIrMessageType_t::CONFIG_PARAM_SET); + EXPECT_EQ(argoIrMessageType_t::CONFIG_PARAM_SET, ac.getMessageType()); + ac.setMessageType(argoIrMessageType_t::IFEEL_TEMP_REPORT); + EXPECT_EQ(argoIrMessageType_t::IFEEL_TEMP_REPORT, ac.getMessageType()); + ac.setMessageType(argoIrMessageType_t::TIMER_COMMAND); + EXPECT_EQ(argoIrMessageType_t::TIMER_COMMAND, ac.getMessageType()); +} + +TYPED_TEST(TestArgoACBaseClass, SetMessageTypeResetsState) { + IRArgoACBase ac(kGpioUnused); + + ac.on(); + ac.setTemp(30); + ac.setSensorTemp(33); + ac.setMode(argoMode_t::COOL); + ac.setFan(argoFan_t::FAN_HIGHEST); + + ac.setMessageType(argoIrMessageType_t::AC_CONTROL); + EXPECT_EQ(argoIrMessageType_t::AC_CONTROL, ac.getMessageType()); + EXPECT_FALSE(ac.getPower()); + EXPECT_EQ(20, ac.getTemp()); + EXPECT_EQ(25, ac.getSensorTemp()); + EXPECT_EQ(argoMode_t::AUTO, ac.getModeEx()); + EXPECT_EQ(argoFan_t::FAN_AUTO, ac.getFanEx()); + + ac.setMessageType(argoIrMessageType_t::IFEEL_TEMP_REPORT); + EXPECT_EQ(argoIrMessageType_t::IFEEL_TEMP_REPORT, ac.getMessageType()); + EXPECT_EQ(kArgoTempDelta, ac.getSensorTemp()); +} + +TYPED_TEST(TestArgoACBaseClass, staticGetMessageType) { + IRArgoACBase ac(kGpioUnused); + + ac.setMessageType(argoIrMessageType_t::AC_CONTROL); + EXPECT_EQ(argoIrMessageType_t::AC_CONTROL, + IRArgoACBase::getMessageType(ac.getRaw(), + ac.getRawByteLength())); + + ac.setMessageType(argoIrMessageType_t::IFEEL_TEMP_REPORT); + EXPECT_EQ(argoIrMessageType_t::IFEEL_TEMP_REPORT, + IRArgoACBase::getMessageType(ac.getRaw(), + ac.getRawByteLength())); + + if (std::is_same()) { + // Only supported for WREM3 + ac.setMessageType(argoIrMessageType_t::CONFIG_PARAM_SET); + EXPECT_EQ(argoIrMessageType_t::CONFIG_PARAM_SET, + IRArgoACBase::getMessageType(ac.getRaw(), + ac.getRawByteLength())); + + ac.setMessageType(argoIrMessageType_t::TIMER_COMMAND); + EXPECT_EQ(argoIrMessageType_t::TIMER_COMMAND, + IRArgoACBase::getMessageType(ac.getRaw(), + ac.getRawByteLength())); + } +} + +TYPED_TEST(TestArgoACBaseClass, staticgetStateLengthForIrMsgType) { + if (std::is_same()) { + EXPECT_EQ(kArgoStateLength, + IRArgoACBase::getStateLengthForIrMsgType( + argoIrMessageType_t::AC_CONTROL)); + EXPECT_EQ(kArgoStateLength, + IRArgoACBase::getStateLengthForIrMsgType( + argoIrMessageType_t::TIMER_COMMAND)); + EXPECT_EQ(0, + IRArgoACBase::getStateLengthForIrMsgType( + argoIrMessageType_t::CONFIG_PARAM_SET)); + EXPECT_EQ(kArgoShortStateLength, + IRArgoACBase::getStateLengthForIrMsgType( + argoIrMessageType_t::IFEEL_TEMP_REPORT)); + } else { + EXPECT_EQ(kArgo3AcControlStateLength, + IRArgoACBase::getStateLengthForIrMsgType( + argoIrMessageType_t::AC_CONTROL)); + EXPECT_EQ(kArgo3TimerStateLength, + IRArgoACBase::getStateLengthForIrMsgType( + argoIrMessageType_t::TIMER_COMMAND)); + EXPECT_EQ(kArgo3ConfigStateLength, + IRArgoACBase::getStateLengthForIrMsgType( + argoIrMessageType_t::CONFIG_PARAM_SET)); + EXPECT_EQ(kArgo3iFeelReportStateLength, + IRArgoACBase::getStateLengthForIrMsgType( + argoIrMessageType_t::IFEEL_TEMP_REPORT)); + } +} + +TYPED_TEST(TestArgoACBaseClass, setRaw) { + TypeParam rawStateAC = {}; + rawStateAC.RoomTemp = 30; + + TypeParam rawStateIFeel = {}; + rawStateIFeel.SensorT = 25; + + IRArgoACBase ac(kGpioUnused); + + if (std::is_same()) { + ac.setRaw(reinterpret_cast(&rawStateAC), std::min( + static_cast(kArgoStateLength), sizeof(TypeParam))); + EXPECT_EQ(30 + kArgoTempDelta, ac.getSensorTemp()); + EXPECT_EQ(argoIrMessageType_t::AC_CONTROL, ac.getMessageType()); + + ac.setRaw(reinterpret_cast(&rawStateIFeel), std::min( + static_cast(kArgoShortStateLength), sizeof(TypeParam))); + EXPECT_EQ(25 + kArgoTempDelta, ac.getSensorTemp()); + EXPECT_EQ(argoIrMessageType_t::IFEEL_TEMP_REPORT, ac.getMessageType()); + } else { + ac.setRaw(reinterpret_cast(&rawStateAC), std::min( + static_cast(kArgo3AcControlStateLength), sizeof(TypeParam))); + EXPECT_EQ(30 + kArgoTempDelta, ac.getSensorTemp()); + EXPECT_EQ(argoIrMessageType_t::AC_CONTROL, ac.getMessageType()); + + auto raw = reinterpret_cast(&rawStateIFeel); + raw[0] = 0x4B; // sets Byte0::IrCommandType to IFeel (0b01) + ac.setRaw(raw, std::min(static_cast(kArgo3iFeelReportStateLength), + sizeof(TypeParam))); + EXPECT_EQ(25 + kArgoTempDelta, ac.getSensorTemp()); + EXPECT_EQ(argoIrMessageType_t::IFEEL_TEMP_REPORT, ac.getMessageType()); + } +} + +/******************************************************************************/ +/* Backward-compatibility tests of legacy IRArgoAc raw methods vs. base class */ +/******************************************************************************/ + +/// @brief Tests interactions of raw setFan() method +/// with a base-class getFanEx() +TEST(TestArgoACClass, SetAndGetFanEx) { + IRArgoAC ac(kGpioUnused); + + ac.setFan(kArgoFan3); + EXPECT_EQ(kArgoFan3, ac.getFan()); + EXPECT_EQ(argoFan_t::FAN_HIGHEST, ac.getFanEx()); + ac.setFan(kArgoFan1); + EXPECT_EQ(kArgoFan1, ac.getFan()); + EXPECT_EQ(argoFan_t::FAN_LOWEST, ac.getFanEx()); + ac.setFan(kArgoFanAuto); + EXPECT_EQ(kArgoFanAuto, ac.getFan()); + EXPECT_EQ(argoFan_t::FAN_AUTO, ac.getFanEx()); + ac.setFan(kArgoFan2); + EXPECT_EQ(kArgoFan2, ac.getFan()); + EXPECT_EQ(argoFan_t::FAN_MEDIUM, ac.getFanEx()); + + ASSERT_NE(7, kArgoFan3); + // Now try some unexpected value. + ac.setFan(7); + EXPECT_EQ(kArgoFan3, ac.getFan()); +} + +/// @brief Tests interactions of base-class setFan() method +/// with a raw getFan() +TEST(TestArgoACClass, SetFanExAndGetFan) { + IRArgoAC ac(kGpioUnused); + + ac.setFan(argoFan_t::FAN_AUTO); + EXPECT_EQ(kArgoFanAuto, ac.getFan()); + + ac.setFan(argoFan_t::FAN_HIGHEST); + EXPECT_EQ(kArgoFan3, ac.getFan()); + ac.setFan(argoFan_t::FAN_HIGH); + EXPECT_EQ(kArgoFan3, ac.getFan()); + + ac.setFan(argoFan_t::FAN_MEDIUM); + EXPECT_EQ(kArgoFan2, ac.getFan()); + ac.setFan(argoFan_t::FAN_LOW); + EXPECT_EQ(kArgoFan2, ac.getFan()); + + ac.setFan(argoFan_t::FAN_LOWER); + EXPECT_EQ(kArgoFan1, ac.getFan()); + ac.setFan(argoFan_t::FAN_LOWEST); + EXPECT_EQ(kArgoFan1, ac.getFan()); + + ac.setFan(static_cast(255)); + EXPECT_EQ(kArgoFanAuto, ac.getFan()); +} + +TEST(TestArgoACClass, SetFlapGetFlap) { + IRArgoAC ac(kGpioUnused); + + ac.setFlap(kArgoFlapFull); + EXPECT_EQ(kArgoFlapFull, ac.getFlap()); + ac.setFlap(kArgoFlapAuto); + EXPECT_EQ(kArgoFlapAuto, ac.getFlap()); + ac.setFlap(kArgoFlap1); + EXPECT_EQ(kArgoFlap1, ac.getFlap()); + ac.setFlap(kArgoFlap2); + EXPECT_EQ(kArgoFlap2, ac.getFlap()); + ac.setFlap(kArgoFlap3); + EXPECT_EQ(kArgoFlap3, ac.getFlap()); + ac.setFlap(kArgoFlap4); + EXPECT_EQ(kArgoFlap4, ac.getFlap()); + ac.setFlap(kArgoFlap5); + EXPECT_EQ(kArgoFlap5, ac.getFlap()); + ac.setFlap(kArgoFlap6); + EXPECT_EQ(kArgoFlap6, ac.getFlap()); +} + +/// @brief Tests interactions of raw setMode() method +/// with a base-class getModeEx() +TEST(TestArgoACClass, SetModeAndGetModeEx) { + IRArgoAC ac(kGpioUnused); + + ac.setMode(kArgoHeat); + EXPECT_EQ(kArgoHeat, ac.getMode()); + EXPECT_EQ(argoMode_t::HEAT, ac.getModeEx()); + ac.setMode(kArgoCool); + EXPECT_EQ(kArgoCool, ac.getMode()); + EXPECT_EQ(argoMode_t::COOL, ac.getModeEx()); + ac.setMode(kArgoDry); + EXPECT_EQ(kArgoDry, ac.getMode()); + EXPECT_EQ(argoMode_t::DRY, ac.getModeEx()); + ac.setMode(kArgoAuto); + EXPECT_EQ(kArgoAuto, ac.getMode()); + EXPECT_EQ(argoMode_t::AUTO, ac.getModeEx()); + ac.setMode(kArgoHeatAuto); + EXPECT_EQ(kArgoHeatAuto, ac.getMode()); + EXPECT_EQ(argoMode_t::AUTO, ac.getModeEx()); + ac.setMode(kArgoOff); + EXPECT_EQ(kArgoOff, ac.getMode()); + EXPECT_EQ(argoMode_t::FAN, ac.getModeEx()); + ac.setMode(255); + EXPECT_EQ(kArgoAuto, ac.getMode()); + EXPECT_EQ(argoMode_t::AUTO, ac.getModeEx()); +} + +/// @brief Tests interactions of base-class setMode() method +/// with a raw getMode() +TEST(TestArgoACClass, SetModeExAndGetMode) { + IRArgoAC ac(kGpioUnused); + + ac.setMode(argoMode_t::HEAT); + EXPECT_EQ(kArgoHeat, ac.getMode()); + EXPECT_EQ(argoMode_t::HEAT, ac.getModeEx()); + ac.setMode(argoMode_t::AUTO); + EXPECT_EQ(kArgoAuto, ac.getMode()); + EXPECT_EQ(argoMode_t::AUTO, ac.getModeEx()); + ac.setMode(argoMode_t::COOL); + EXPECT_EQ(kArgoCool, ac.getMode()); + EXPECT_EQ(argoMode_t::COOL, ac.getModeEx()); + ac.setMode(argoMode_t::DRY); + EXPECT_EQ(kArgoDry, ac.getMode()); + EXPECT_EQ(argoMode_t::DRY, ac.getModeEx()); + ac.setMode(argoMode_t::FAN); + EXPECT_EQ(kArgoOff, ac.getMode()); // Fan is N/A (?) -> defaults to off + EXPECT_EQ(argoMode_t::FAN, ac.getModeEx()); + ac.setMode(static_cast(kArgoHeatBlink)); + EXPECT_EQ(kArgoHeatBlink, ac.getMode()); + EXPECT_EQ(static_cast(kArgoHeatBlink), ac.getModeEx()); + ac.setMode(static_cast(255)); + EXPECT_EQ(kArgoAuto, ac.getMode()); + EXPECT_EQ(argoMode_t::AUTO, ac.getModeEx()); +} + +TEST(TestArgoACClass, SendSensorTemp) { + IRrecv irrecv(kGpioUnused); + + // Method 1 (via sendSensorTemp()) + IRArgoAC ac(kGpioUnused); + ac.sendSensorTemp(10); + ac._irsend.makeDecodeResult(); + EXPECT_TRUE(irrecv.decode(&ac._irsend.capture)); + EXPECT_EQ(decode_type_t::ARGO, ac._irsend.capture.decode_type); + EXPECT_EQ("Model: 1 (WREM2), Sensor Temp: 10C", + IRAcUtils::resultAcToString(&ac._irsend.capture)); + + // Method 2 (via send()) + IRArgoAC ac2(kGpioUnused); + ac2.setMessageType(argoIrMessageType_t::IFEEL_TEMP_REPORT); + ac2.setSensorTemp(19); + ac2.send(); + ac2._irsend.makeDecodeResult(); + EXPECT_TRUE(irrecv.decode(&ac2._irsend.capture)); + EXPECT_EQ(decode_type_t::ARGO, ac2._irsend.capture.decode_type); + EXPECT_EQ("Model: 1 (WREM2), Sensor Temp: 19C", + IRAcUtils::resultAcToString(&ac2._irsend.capture)); +} + +/******************************************************************************/ +/* IRArgoAC_WREM3-specific tests */ +/******************************************************************************/ + +TEST(TestArgoAC_WREM3Class, Eco) { + IRArgoAC_WREM3 ac(kGpioUnused); + + ac.setEco(false); + ASSERT_FALSE(ac.getEco()); + ac.setEco(true); + ASSERT_TRUE(ac.getEco()); + ac.setEco(false); + ASSERT_FALSE(ac.getEco()); +} + +TEST(TestArgoAC_WREM3Class, Filter) { + IRArgoAC_WREM3 ac(kGpioUnused); + + ac.setFilter(false); + ASSERT_FALSE(ac.getFilter()); + ac.setFilter(true); + ASSERT_TRUE(ac.getFilter()); + ac.setFilter(false); + ASSERT_FALSE(ac.getFilter()); +} + +TEST(TestArgoAC_WREM3Class, Light) { + IRArgoAC_WREM3 ac(kGpioUnused); + + ac.setLight(false); + ASSERT_FALSE(ac.getLight()); + ac.setLight(true); + ASSERT_TRUE(ac.getLight()); + ac.setLight(false); + ASSERT_FALSE(ac.getLight()); +} + +TEST(TestArgoAC_WREM3Class, Channel) { + IRArgoAC_WREM3 ac(kGpioUnused); + + ac.setChannel(0); + ASSERT_EQ(0, ac.getChannel()); + ac.setChannel(1); + ASSERT_EQ(1, ac.getChannel()); + ac.setChannel(2); + ASSERT_EQ(2, ac.getChannel()); + ac.setChannel(3); + ASSERT_EQ(3, ac.getChannel()); + ac.setChannel(4); + ASSERT_EQ(3, ac.getChannel()); +} + +TEST(TestArgoAC_WREM3Class, ConfigEntry) { + IRArgoAC_WREM3 ac(kGpioUnused); + + ac.setConfigEntry(0, 0); + ASSERT_EQ(std::make_pair(static_cast(0), static_cast(0)), + ac.getConfigEntry()); + ac.setConfigEntry(80, 86); + ASSERT_EQ(std::make_pair(static_cast(80), static_cast(86)), + ac.getConfigEntry()); + ac.setConfigEntry(255, 255); + ASSERT_EQ(std::make_pair(static_cast(255), + static_cast(255)), + ac.getConfigEntry()); +} + +TEST(TestArgoAC_WREM3Class, CurrentTimeMinutes) { + IRArgoAC_WREM3 ac(kGpioUnused); + + ac.setCurrentTimeMinutes(0); + ASSERT_EQ(0, ac.getCurrentTimeMinutes()); + ac.setCurrentTimeMinutes(16*60+50); + ASSERT_EQ(16*60+50, ac.getCurrentTimeMinutes()); + ac.setCurrentTimeMinutes(23*60+59); + ASSERT_EQ(23*60+59, ac.getCurrentTimeMinutes()); + ac.setCurrentTimeMinutes(23*60+59+1); + ASSERT_EQ(23*60+59, ac.getCurrentTimeMinutes()); +} + +TEST(TestArgoAC_WREM3Class, CurrentDayOfWeek) { + IRArgoAC_WREM3 ac(kGpioUnused); + + ac.setCurrentDayOfWeek(argoWeekday::SUNDAY); + ASSERT_EQ(argoWeekday::SUNDAY, ac.getCurrentDayOfWeek()); + ac.setCurrentDayOfWeek(argoWeekday::MONDAY); + ASSERT_EQ(argoWeekday::MONDAY, ac.getCurrentDayOfWeek()); + ac.setCurrentDayOfWeek(argoWeekday::TUESDAY); + ASSERT_EQ(argoWeekday::TUESDAY, ac.getCurrentDayOfWeek()); + ac.setCurrentDayOfWeek(argoWeekday::WEDNESDAY); + ASSERT_EQ(argoWeekday::WEDNESDAY, ac.getCurrentDayOfWeek()); + ac.setCurrentDayOfWeek(argoWeekday::THURSDAY); + ASSERT_EQ(argoWeekday::THURSDAY, ac.getCurrentDayOfWeek()); + ac.setCurrentDayOfWeek(argoWeekday::FRIDAY); + ASSERT_EQ(argoWeekday::FRIDAY, ac.getCurrentDayOfWeek()); + ac.setCurrentDayOfWeek(argoWeekday::SATURDAY); + ASSERT_EQ(argoWeekday::SATURDAY, ac.getCurrentDayOfWeek()); + ac.setCurrentDayOfWeek(static_cast(200)); + ASSERT_EQ(argoWeekday::SATURDAY, ac.getCurrentDayOfWeek()); +} + +TEST(TestArgoAC_WREM3Class, TimerType) { + IRArgoAC_WREM3 ac(kGpioUnused); + + ac.setTimerType(argoTimerType_t::NO_TIMER); + ASSERT_EQ(argoTimerType_t::NO_TIMER, ac.getTimerType()); + ac.setTimerType(argoTimerType_t::DELAY_TIMER); + ASSERT_EQ(argoTimerType_t::DELAY_TIMER, ac.getTimerType()); + ac.setTimerType(argoTimerType_t::SCHEDULE_TIMER_1); + ASSERT_EQ(argoTimerType_t::SCHEDULE_TIMER_1, ac.getTimerType()); + ac.setTimerType(argoTimerType_t::SCHEDULE_TIMER_2); + ASSERT_EQ(argoTimerType_t::SCHEDULE_TIMER_2, ac.getTimerType()); + ac.setTimerType(argoTimerType_t::SCHEDULE_TIMER_3); + ASSERT_EQ(argoTimerType_t::SCHEDULE_TIMER_3, ac.getTimerType()); + ac.setTimerType(static_cast(201)); + ASSERT_EQ(argoTimerType_t::NO_TIMER, ac.getTimerType()); +} + +TEST(TestArgoAC_WREM3Class, DelayTimerMinutes) { + IRArgoAC_WREM3 ac(kGpioUnused); + + ac.setDelayTimerMinutes(0); + ASSERT_EQ(0, ac.getDelayTimerMinutes()); + ac.setDelayTimerMinutes(16*60+50); + ASSERT_EQ(16*60+50, ac.getDelayTimerMinutes()); + ac.setDelayTimerMinutes(16*60+54); + ASSERT_EQ(16*60+50, ac.getDelayTimerMinutes()); + ac.setDelayTimerMinutes(16*60+55); + ASSERT_EQ(16*60+60, ac.getDelayTimerMinutes()); + ac.setDelayTimerMinutes(19*60+44); + ASSERT_EQ(19*60+40, ac.getDelayTimerMinutes()); + ac.setDelayTimerMinutes(19*60+50); + ASSERT_EQ(19*60+50, ac.getDelayTimerMinutes()); + ac.setDelayTimerMinutes(19*60+60); + ASSERT_EQ(19*60+50, ac.getDelayTimerMinutes()); + ac.setDelayTimerMinutes(23*60+59); // Above max (19h50m) + ASSERT_EQ(19*60+50, ac.getDelayTimerMinutes()); + ac.setDelayTimerMinutes(23*60+59+1); + ASSERT_EQ(19*60+50, ac.getDelayTimerMinutes()); +} + +TEST(TestArgoAC_WREM3Class, ScheduleTimerStartMinutes) { + IRArgoAC_WREM3 ac(kGpioUnused); + + ac.setScheduleTimerStartMinutes(0); + ASSERT_EQ(0, ac.getScheduleTimerStartMinutes()); + ac.setScheduleTimerStartMinutes(16*60+50); + ASSERT_EQ(16*60+50, ac.getScheduleTimerStartMinutes()); + ac.setScheduleTimerStartMinutes(16*60+54); + ASSERT_EQ(16*60+50, ac.getScheduleTimerStartMinutes()); + ac.setScheduleTimerStartMinutes(16*60+55); + ASSERT_EQ(16*60+60, ac.getScheduleTimerStartMinutes()); + ac.setScheduleTimerStartMinutes(23*60+50); + ASSERT_EQ(23*60+50, ac.getScheduleTimerStartMinutes()); + ac.setScheduleTimerStartMinutes(23*60+59); // Above max (23h50m) + ASSERT_EQ(23*60+50, ac.getScheduleTimerStartMinutes()); + ac.setScheduleTimerStartMinutes(23*60+59+1); + ASSERT_EQ(23*60+50, ac.getScheduleTimerStartMinutes()); +} + +TEST(TestArgoAC_WREM3Class, ScheduleTimerStopMinutes) { + IRArgoAC_WREM3 ac(kGpioUnused); + + ac.setScheduleTimerStopMinutes(0); + ASSERT_EQ(0, ac.getScheduleTimerStopMinutes()); + ac.setScheduleTimerStopMinutes(16*60+50); + ASSERT_EQ(16*60+50, ac.getScheduleTimerStopMinutes()); + ac.setScheduleTimerStopMinutes(16*60+54); + ASSERT_EQ(16*60+50, ac.getScheduleTimerStopMinutes()); + ac.setScheduleTimerStopMinutes(16*60+55); + ASSERT_EQ(16*60+60, ac.getScheduleTimerStopMinutes()); + ac.setScheduleTimerStopMinutes(23*60+50); + ASSERT_EQ(23*60+50, ac.getScheduleTimerStopMinutes()); + ac.setScheduleTimerStopMinutes(23*60+59); // Above max (23h50m) + ASSERT_EQ(23*60+50, ac.getScheduleTimerStopMinutes()); + ac.setScheduleTimerStopMinutes(23*60+59+1); + ASSERT_EQ(23*60+50, ac.getScheduleTimerStopMinutes()); +} + +TEST(TestArgoAC_WREM3Class, ScheduleTimerActiveDays) { + IRArgoAC_WREM3 ac(kGpioUnused); + + ac.setScheduleTimerActiveDays(std::set({})); + EXPECT_THAT(ac.getScheduleTimerActiveDays(), + ::testing::IsEmpty()); + EXPECT_EQ(0b0000000, ac.getTimerActiveDaysBitmap()); + + ac.setScheduleTimerActiveDays(std::set({argoWeekday::SUNDAY})); + EXPECT_THAT(ac.getScheduleTimerActiveDays(), + ::testing::ElementsAre(argoWeekday::SUNDAY)); + EXPECT_EQ(0b0000001, ac.getTimerActiveDaysBitmap()); + + ac.setScheduleTimerActiveDays(std::set({argoWeekday::MONDAY})); + EXPECT_THAT(ac.getScheduleTimerActiveDays(), + ::testing::ElementsAre(argoWeekday::MONDAY)); + EXPECT_EQ(0b0000010, ac.getTimerActiveDaysBitmap()); + + ac.setScheduleTimerActiveDays(std::set({argoWeekday::TUESDAY})); + EXPECT_THAT(ac.getScheduleTimerActiveDays(), + ::testing::ElementsAre(argoWeekday::TUESDAY)); + EXPECT_EQ(0b0000100, ac.getTimerActiveDaysBitmap()); + + ac.setScheduleTimerActiveDays(std::set({ + argoWeekday::WEDNESDAY})); + EXPECT_THAT(ac.getScheduleTimerActiveDays(), + ::testing::ElementsAre(argoWeekday::WEDNESDAY)); + EXPECT_EQ(0b0001000, ac.getTimerActiveDaysBitmap()); + + ac.setScheduleTimerActiveDays(std::set({argoWeekday::THURSDAY})); + EXPECT_THAT(ac.getScheduleTimerActiveDays(), + ::testing::ElementsAre(argoWeekday::THURSDAY)); + EXPECT_EQ(0b0010000, ac.getTimerActiveDaysBitmap()); + + ac.setScheduleTimerActiveDays(std::set({argoWeekday::FRIDAY})); + EXPECT_THAT(ac.getScheduleTimerActiveDays(), + ::testing::ElementsAre(argoWeekday::FRIDAY)); + EXPECT_EQ(0b0100000, ac.getTimerActiveDaysBitmap()); + + ac.setScheduleTimerActiveDays(std::set({argoWeekday::SATURDAY})); + EXPECT_THAT(ac.getScheduleTimerActiveDays(), + ::testing::ElementsAre(argoWeekday::SATURDAY)); + EXPECT_EQ(0b1000000, ac.getTimerActiveDaysBitmap()); + + ac.setScheduleTimerActiveDays(std::set({ + argoWeekday::MONDAY, argoWeekday::TUESDAY, argoWeekday::WEDNESDAY, + argoWeekday::THURSDAY, argoWeekday::FRIDAY, argoWeekday::SATURDAY, + argoWeekday::SUNDAY})); + EXPECT_THAT(ac.getScheduleTimerActiveDays(), ::testing::ElementsAre( + argoWeekday::SUNDAY, argoWeekday::MONDAY, argoWeekday::TUESDAY, + argoWeekday::WEDNESDAY, argoWeekday::THURSDAY, argoWeekday::FRIDAY, + argoWeekday::SATURDAY)); + EXPECT_EQ(0b1111111, ac.getTimerActiveDaysBitmap()); + + ac.setScheduleTimerActiveDays(std::set({ + argoWeekday::MONDAY, argoWeekday::TUESDAY, argoWeekday::WEDNESDAY, + argoWeekday::THURSDAY, argoWeekday::FRIDAY})); + EXPECT_THAT(ac.getScheduleTimerActiveDays(), ::testing::ElementsAre( + argoWeekday::MONDAY, argoWeekday::TUESDAY, argoWeekday::WEDNESDAY, + argoWeekday::THURSDAY, argoWeekday::FRIDAY)); + EXPECT_EQ(0b0111110, ac.getTimerActiveDaysBitmap()); + + ac.setScheduleTimerActiveDays(std::set({ argoWeekday::TUESDAY, + argoWeekday::THURSDAY, argoWeekday::SATURDAY, argoWeekday::SUNDAY})); + EXPECT_THAT(ac.getScheduleTimerActiveDays(), ::testing::ElementsAre( + argoWeekday::SUNDAY, argoWeekday::TUESDAY, argoWeekday::THURSDAY, + argoWeekday::SATURDAY)); + EXPECT_EQ(0b1010101, ac.getTimerActiveDaysBitmap()); +} + +TEST(TestArgoAC_WREM3Class, staticGetMessageTypeFromRaw) { + ArgoProtocolWREM3 raw = {}; + + raw.IrCommandType = static_cast( + argoIrMessageType_t::AC_CONTROL); + EXPECT_EQ(argoIrMessageType_t::AC_CONTROL, + IRArgoAC_WREM3::getMessageType(raw)); + + raw.IrCommandType = static_cast( + argoIrMessageType_t::CONFIG_PARAM_SET); + EXPECT_EQ(argoIrMessageType_t::CONFIG_PARAM_SET, + IRArgoAC_WREM3::getMessageType(raw)); + + raw.IrCommandType = static_cast( + argoIrMessageType_t::IFEEL_TEMP_REPORT); + EXPECT_EQ(argoIrMessageType_t::IFEEL_TEMP_REPORT, + IRArgoAC_WREM3::getMessageType(raw)); + + raw.IrCommandType = static_cast( + argoIrMessageType_t::TIMER_COMMAND); + EXPECT_EQ(argoIrMessageType_t::TIMER_COMMAND, + IRArgoAC_WREM3::getMessageType(raw)); +} + +TEST(TestArgoAC_WREM3Class, HasValidPreamble) { + uint8_t preamble[] = { 0x4B, 0x57 }; + ASSERT_TRUE(IRArgoAC_WREM3::hasValidPreamble(preamble, + sizeof(preamble) / sizeof(preamble[0]))); + ASSERT_FALSE(IRArgoAC_WREM3::hasValidPreamble(preamble, 0)); + ASSERT_TRUE(IRArgoAC_WREM3::hasValidPreamble(preamble, 1)); + + preamble[0] = 0b00001011; + ASSERT_TRUE(IRArgoAC_WREM3::hasValidPreamble(preamble, + sizeof(preamble) / sizeof(preamble[0]))); + preamble[0] = 0b11111011; + ASSERT_TRUE(IRArgoAC_WREM3::hasValidPreamble(preamble, + sizeof(preamble) / sizeof(preamble[0]))); + preamble[0] = 0b00001010; + ASSERT_FALSE(IRArgoAC_WREM3::hasValidPreamble(preamble, + sizeof(preamble) / sizeof(preamble[0]))); + preamble[0] = 0b00000011; + ASSERT_FALSE(IRArgoAC_WREM3::hasValidPreamble(preamble, + sizeof(preamble) / sizeof(preamble[0]))); +} + +TEST(TestArgoAC_WREM3Class, IsValidWrem3Message) { + uint8_t wrem3AC[] = { 0x0B, 0x36, 0x12, 0x0F, 0xC2, 0x24 }; + uint8_t wrem3IFeel[] = { 0x4B, 0x78 }; + uint8_t wrem3Config[] = { 0xCB, 0x0C, 0x4A, 0x21 }; + uint8_t wrem3Tmr[] = { 0x8B, 0x05, 0x4D, 0x98, 0xD2, 0x44, 0x2E, 0x34, 0xA7 }; + uint8_t wrem2IFeel[] = { 0xAC, 0xF5, 0xC2, 0x63 }; + + ASSERT_TRUE(IRArgoAC_WREM3::isValidWrem3Message(wrem3AC, + sizeof(wrem3AC) / sizeof(wrem3AC[0]) * 8, true)); + ASSERT_TRUE(IRArgoAC_WREM3::isValidWrem3Message(wrem3IFeel, + sizeof(wrem3IFeel) / sizeof(wrem3IFeel[0]) * 8, true)); + ASSERT_TRUE(IRArgoAC_WREM3::isValidWrem3Message(wrem3Config, + sizeof(wrem3Config) / sizeof(wrem3Config[0]) * 8, true)); + ASSERT_TRUE(IRArgoAC_WREM3::isValidWrem3Message(wrem3Tmr, + sizeof(wrem3Tmr) / sizeof(wrem3Tmr[0]) * 8, true)); + ASSERT_FALSE(IRArgoAC_WREM3::isValidWrem3Message(wrem2IFeel, + sizeof(wrem2IFeel) / sizeof(wrem2IFeel[0]) * 8, true)); + + // 1 bit too short + ASSERT_FALSE(IRArgoAC_WREM3::isValidWrem3Message(wrem3AC, + sizeof(wrem3AC) / sizeof(wrem3AC[0]) * 8 - 1, true)); + + // wrong checksum + wrem3AC[5] ^= wrem3AC[5]; + ASSERT_FALSE(IRArgoAC_WREM3::isValidWrem3Message(wrem3AC, + sizeof(wrem3AC) / sizeof(wrem3AC[0]) * 8, true)); // strict + ASSERT_TRUE(IRArgoAC_WREM3::isValidWrem3Message(wrem3AC, + sizeof(wrem3AC) / sizeof(wrem3AC[0]) * 8, false)); // lax + wrem3AC[5] ^= wrem3AC[5]; // restore + + wrem3IFeel[1] ^= wrem3IFeel[1]; + ASSERT_FALSE(IRArgoAC_WREM3::isValidWrem3Message(wrem3IFeel, + sizeof(wrem3IFeel) / sizeof(wrem3IFeel[0]) * 8, true)); + ASSERT_TRUE(IRArgoAC_WREM3::isValidWrem3Message(wrem3IFeel, + sizeof(wrem3IFeel) / sizeof(wrem3IFeel[0]) * 8, false)); + wrem3IFeel[1] ^= wrem3IFeel[1]; // restore + + wrem3Config[3] ^= wrem3Config[3]; + ASSERT_FALSE(IRArgoAC_WREM3::isValidWrem3Message(wrem3Config, + sizeof(wrem3Config) / sizeof(wrem3Config[0]) * 8, true)); + ASSERT_TRUE(IRArgoAC_WREM3::isValidWrem3Message(wrem3Config, + sizeof(wrem3Config) / sizeof(wrem3Config[0]) * 8, false)); + wrem3Config[3] ^= wrem3Config[3]; // restore + + wrem3Tmr[8] ^= wrem3Tmr[8]; + ASSERT_FALSE(IRArgoAC_WREM3::isValidWrem3Message(wrem3Tmr, + sizeof(wrem3Tmr) / sizeof(wrem3Tmr[0]) * 8, true)); + ASSERT_TRUE(IRArgoAC_WREM3::isValidWrem3Message(wrem3Tmr, + sizeof(wrem3Tmr) / sizeof(wrem3Tmr[0]) * 8, false)); + wrem3Tmr[8] ^= wrem3Tmr[8]; // restore + + // wrong preamble + wrem3IFeel[0] += 1; + ASSERT_FALSE(IRArgoAC_WREM3::isValidWrem3Message(wrem3IFeel, + sizeof(wrem3IFeel) / sizeof(wrem3IFeel[0]) * 8, true)); + ASSERT_FALSE(IRArgoAC_WREM3::isValidWrem3Message(wrem3IFeel, + sizeof(wrem3IFeel) / sizeof(wrem3IFeel[0]) * 8, false)); + wrem3IFeel[0] -= 1; // restore +} + +TEST(TestArgoAC_WREM3Class, SendSensorTemp) { + IRrecv irrecv(kGpioUnused); + + // Method 1 (via sendSensorTemp()) + IRArgoAC_WREM3 ac(kGpioUnused); + ac.sendSensorTemp(10); + ac._irsend.makeDecodeResult(); + EXPECT_TRUE(irrecv.decode(&ac._irsend.capture)); + EXPECT_EQ(decode_type_t::ARGO, ac._irsend.capture.decode_type); + EXPECT_EQ("IFeel Report[CH#0]: Model: 2 (WREM3), Sensor Temp: 10C", + IRAcUtils::resultAcToString(&ac._irsend.capture)); + + // Method 2 (via send()) + IRArgoAC_WREM3 ac2(kGpioUnused); + ac2.setMessageType(argoIrMessageType_t::IFEEL_TEMP_REPORT); + ac2.setSensorTemp(19); + ac2.send(); + ac2._irsend.makeDecodeResult(); + EXPECT_TRUE(irrecv.decode(&ac2._irsend.capture)); + EXPECT_EQ(decode_type_t::ARGO, ac2._irsend.capture.decode_type); + EXPECT_EQ("IFeel Report[CH#0]: Model: 2 (WREM3), Sensor Temp: 19C", + IRAcUtils::resultAcToString(&ac2._irsend.capture)); +} + +TEST(TestArgoAC_WREM3Class, NonExModeFlapFan) { + IRArgoAC_WREM3 ac(kGpioUnused); + + ac.setFan(argoFan_t::FAN_HIGH); + EXPECT_EQ(argoFan_t::FAN_HIGH, ac.getFan()); + EXPECT_EQ(argoFan_t::FAN_HIGH, ac.getFanEx()); + + ac.setMode(argoMode_t::FAN); + EXPECT_EQ(argoMode_t::FAN, ac.getMode()); + EXPECT_EQ(argoMode_t::FAN, ac.getModeEx()); + + ac.setFlap(argoFlap_t::FLAP_4); + EXPECT_EQ(argoFlap_t::FLAP_4, ac.getFlap()); + EXPECT_EQ(argoFlap_t::FLAP_4, ac.getFlapEx()); +} + + +/******************************************************************************/ +/* Housekeeping */ +/******************************************************************************/ + TEST(TestUtils, Housekeeping) { ASSERT_EQ("ARGO", typeToString(decode_type_t::ARGO)); ASSERT_EQ(decode_type_t::ARGO, strToDecodeType("ARGO")); ASSERT_TRUE(hasACState(decode_type_t::ARGO)); + ASSERT_EQ(irutils::modelToStr(decode_type_t::ARGO, + argo_ac_remote_model_t::SAC_WREM2), "WREM2"); + ASSERT_EQ(irutils::modelToStr(decode_type_t::ARGO, + argo_ac_remote_model_t::SAC_WREM3), "WREM3"); } + + +/******************************************************************************/ +/* Decode tests based on real (recorded) IR messages */ +/******************************************************************************/ +TEST(TestDecodeArgo, RealShortDecode) { + IRsendTest irsend(kGpioUnused); + IRrecv irrecv(kGpioUnused); + irsend.begin(); + + // Real short Argo message. (i.e. 32 bits) + const uint16_t sensor_28C[67] = { + 6418, 3168, 444, 834, 444, 834, 442, 2112, 444, 2112, 444, 834, 442, 2114, + 442, 834, 442, 2112, 444, 2112, 444, 832, 442, 2114, 442, 834, 442, 2112, + 442, 2114, 442, 2112, 444, 2112, 442, 834, 442, 2112, 444, 834, 442, 834, + 442, 834, 442, 834, 442, 2114, 442, 2114, 442, 2112, 442, 2112, 442, 834, + 444, 834, 442, 834, 442, 2112, 442, 2112, 442, 836, + 442}; // UNKNOWN 6149090 + irsend.reset(); + uint8_t expectedState[kArgoShortStateLength] = { + 0xAC, 0xF5, 0xC2, 0x63}; + irsend.sendRaw(sensor_28C, 67, 38); + irsend.makeDecodeResult(); + EXPECT_TRUE(irrecv.decode(&irsend.capture)); + EXPECT_EQ(decode_type_t::ARGO, irsend.capture.decode_type); + EXPECT_EQ(kArgoShortBits, irsend.capture.bits); + EXPECT_STATE_EQ(expectedState, irsend.capture.state, irsend.capture.bits); + EXPECT_EQ( + "Model: 1 (WREM2), Sensor Temp: 28C", + IRAcUtils::resultAcToString(&irsend.capture)); + stdAc::state_t r, p; + // These short messages do result in a valid state (w/ room temperature only) + EXPECT_TRUE(IRAcUtils::decodeToState(&irsend.capture, &r, &p)); + EXPECT_EQ(stdAc::ac_command_t::kSensorTempReport, r.command); + EXPECT_EQ(28, r.sensorTemperature); +} + +/// +/// @brief Test Fixture for recorded tests +/// +struct ArgoE2ETestParam { + const std::vector rawDataInput; + const uint8_t expectedEncodedSizeBytes; + const std::vector expectedEncodedValue; + const std::string expectedString; + + ArgoE2ETestParam(std::vector _raw, uint8_t _encSize, + std::vector _encValue, std::string _str) + : rawDataInput(_raw), expectedEncodedSizeBytes(_encSize), + expectedEncodedValue(_encValue), expectedString(_str) {} + + friend std::ostream& operator<<(std::ostream& os, const ArgoE2ETestParam& v) { + return os << "rawDataInput: " << ::testing::PrintToString(v.rawDataInput) + << "\n\texpectedEncodedSize: " + << static_cast(v.expectedEncodedSizeBytes) + << "[B]" << "\n\texpectedEncodedValue: 0x" + << bytesToHexString(v.expectedEncodedValue) << "\n\texpectedString: " + << v.expectedString; + } +}; + +/// +/// @brief Test fixture for real-world recorded messages for WREM3 +/// +class TestArgoE2E : public ::testing::TestWithParam {}; + +// Test code +TEST_P(TestArgoE2E, RealExampleCommands) { + IRsendTest irsend(kGpioUnused); + IRrecv irrecv(kGpioUnused); + irsend.begin(); + + irsend.reset(); + irsend.sendRaw(&GetParam().rawDataInput[0], + GetParam().rawDataInput.size(), kArgoFrequency); + irsend.makeDecodeResult(); + + ASSERT_TRUE(irrecv.decode(&irsend.capture)); + EXPECT_EQ(decode_type_t::ARGO, irsend.capture.decode_type); + ASSERT_TRUE(IRArgoAC_WREM3::isValidWrem3Message(irsend.capture.state, + irsend.capture.bits, true)); + + EXPECT_EQ(GetParam().expectedEncodedSizeBytes * 8, irsend.capture.bits); + + std::vector stateActual(irsend.capture.state, irsend.capture.state + + GetParam().expectedEncodedSizeBytes); + EXPECT_THAT(stateActual, ::testing::ElementsAreArray( + GetParam().expectedEncodedValue)); + + EXPECT_FALSE(irsend.capture.repeat); + + EXPECT_EQ(GetParam().expectedString, + IRAcUtils::resultAcToString(&irsend.capture)); +} + +// Test cases +INSTANTIATE_TEST_CASE_P( + TestDecodeArgo, + TestArgoE2E, + ::testing::Values( + ArgoE2ETestParam( + std::vector { + 6468, 3150, 456, 2154, 428, 2152, 462, 874, 422, 2158, 424, 882, + 424, 880, 428, 876, 430, 874, 454, 850, 424, 2154, 460, 2150, + 430, 874, 422, 2156, 458, 2152, 430, 874, 420, 884, 454, 850, + 424, 2152, 462, 874, 422, 882, 424, 2154, 428, 876, 430, 874, + 476, 828, 478, 2098, 462, 2148, 424, 2156, 458, 2150, 430, 874, + 432, 872, 422, 882, 424, 880, 482, 822, 430, 2148, 454, 852, + 488, 816, 480, 826, 482, 852, 454, 2126, 424, 2154, 458, 876, + 454, 852, 454, 2124, 426, 880, 426, 878, 428, 2150, 486, 848, + 426, 878, 428 + }, + kArgo3AcControlStateLength, + std::vector { 0x0B, 0x36, 0x12, 0x0F, 0xC2, 0x24 }, + "Command[CH#0]: Model: 2 (WREM3), Power: On, Mode: 1 (Cool), Temp: 22C, " + "Sensor Temp: 26C, Fan: 0 (Auto), Swing(V): 7 (Breeze), IFeel: Off, " + "Night: Off, Econo: Off, Max: Off, Filter: Off, Light: On"), + + + ArgoE2ETestParam( + std::vector { + 6460, 3150, 454, 2154, 426, 2152, 462, 842, 452, 2156, 424, 878, + 428, 874, 432, 2144, 456, 878, 428, 2148, 432, 870, 424, 2152, + 460, 842, 452, 2154, 426, 878, 428, 876, 430, 872, 422 + }, + kArgo3iFeelReportStateLength, + std::vector { 0x4B, 0x15 }, + "IFeel Report[CH#0]: Model: 2 (WREM3), Sensor Temp: 25C"), + + + ArgoE2ETestParam( + std::vector { + 6434, 3222, 424, 2186, 424, 2156, 422, 882, 422, 2158, 430, 874, + 430, 876, 430, 2212, 400, 874, 430, 2150, 450, 2160, 428, 2152, + 428, 908, 396, 2184, 426, 878, 426, 2152, 426, 880, 448 + }, + kArgo3iFeelReportStateLength, + std::vector {0x4B, 0x57}, + "IFeel Report[CH#0]: Model: 2 (WREM3), Sensor Temp: 27C"), + + + ArgoE2ETestParam( + std::vector { + 6468, 3154, 482, 2128, 452, 2128, 484, 820, 486, 2124, 456, 848, + 458, 848, 424, 880, 448, 2130, 482, 2126, 452, 852, 422, 2158, + 488, 816, 490, 814, 490, 814, 492, 812, 482, 822, 484, 2124, + 422, 882, 456, 2124, 488, 2122, 456, 848, 458, 846, 460, 2120, + 482, 822, 484, 822, 484, 820, 486, 818, 488, 2122, 458, 2122, + 490, 814, 492, 814, 492, 2118, 450, 854, 452, 2126, 486, 820, + 486, 818, 488, 2122, 458, 846, 458, 2120, 492, 2118, 430, 874, + 430, 876, 454, 2126, 484, 820, 486, 818, 478, 828, 488, 2120, + 426, 878, 460, 844, 430, 2148, 486, 2094, 454, 2154, 480, 826, + 480, 2128, 430, 876, 430, 872, 422, 882, 424, 882, 424, 2156, + 478, 826, 480, 2100, 458, 2152, 482, 822, 484, 822, 452, 2156, + 424, 2156, 478, 2104, 452, 852, 454, 852, 452, 2158, 478, 828, + 478, 2132, 426 + }, + kArgo3TimerStateLength, + std::vector { + 0x8B, 0x05, 0x4D, 0x98, 0xD2, 0x44, 0x2E, 0x34, 0xA7 + }, + "Timer[CH#0]: Model: 2 (WREM3), Power: On, Timer Mode: 2 (Schedule1), " + "Clock: 20:32, Day: 0 (Sun), On Timer: 09:10, Off Timer: 17:50, " + "TimerActiveDays: Mon|Tue|Fri|Sat"), + + + ArgoE2ETestParam( + std::vector { + 6464, 3156, 492, 2118, 472, 2108, 484, 820, 486, 2124, 454, 850, + 456, 848, 426, 2154, 492, 2120, 482, 822, 450, 854, 452, 2128, + 484, 2126, 454, 850, 454, 850, 456, 848, 424, 880, 480, 822, + 428, 2152, 482, 822, 484, 2126, 454, 850, 454, 850, 456, 2122, + 490, 814, 492, 2118, 452, 852, 454, 850, 454, 848, 458, 846, + 460, 2118, 482, 822, 484, 820, 486 + }, + kArgo3ConfigStateLength, + std::vector { 0xCB, 0x0C, 0x4A, 0x21 }, + "Config[CH#0]: Model: 2 (WREM3), Key: 12, Value: 74")), + [](const testing::TestParamInfo& info) { + return bytesToHexString(info.param.expectedEncodedValue); + } +); diff --git a/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/test/ir_Carrier_test.cpp b/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/test/ir_Carrier_test.cpp index fa0f07b0c..7920b83ca 100644 --- a/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/test/ir_Carrier_test.cpp +++ b/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/test/ir_Carrier_test.cpp @@ -264,6 +264,16 @@ TEST(TestUtils, Housekeeping) { ASSERT_EQ(kCarrierAc64MinRepeat, IRsend::minRepeats(decode_type_t::CARRIER_AC64)); + // CARRIER_AC84 + ASSERT_EQ("CARRIER_AC84", typeToString(decode_type_t::CARRIER_AC84)); + ASSERT_EQ(decode_type_t::CARRIER_AC84, strToDecodeType("CARRIER_AC84")); + ASSERT_TRUE(hasACState(decode_type_t::CARRIER_AC84)); + ASSERT_FALSE(IRac::isProtocolSupported(decode_type_t::CARRIER_AC84)); + ASSERT_EQ(kCarrierAc84Bits, + IRsend::defaultBits(decode_type_t::CARRIER_AC84)); + ASSERT_EQ(kNoRepeat, + IRsend::minRepeats(decode_type_t::CARRIER_AC84)); + // CARRIER_AC128 ASSERT_EQ("CARRIER_AC128", typeToString(decode_type_t::CARRIER_AC128)); ASSERT_EQ(decode_type_t::CARRIER_AC128, strToDecodeType("CARRIER_AC128")); @@ -693,3 +703,113 @@ TEST(TestDecodeCarrierAC128, SyntheticExample) { stdAc::state_t r, p; ASSERT_FALSE(IRAcUtils::decodeToState(&irsend.capture, &r, &p)); } + +// Decode a "real" Carrier 84bit example message. +TEST(TestDecodeCarrierAC84, RealExample) { + IRsendTest irsend(kGpioUnused); + IRrecv irrecv(kGpioUnused); + const uint8_t expected_state[kCarrierAc84StateLength] = { + 0x03, 0x00, 0x93, 0x31, 0x00, 0x12, 0x00, 0x12, 0x54, 0x21, 0xE8}; + irsend.begin(); + + irsend.reset(); + // Data from: + // https://github.com/crankyoldgit/IRremoteESP8266/issues/1943#issue-1519570772 + const uint16_t rawData[171] = { + 5844, 1152, + 1154, 462, 1152, 462, 418, 1194, 418, 1194, 420, 1194, 416, 1198, + 418, 1196, 416, 1196, 418, 1194, 420, 1192, 420, 1194, 420, 1194, + 1152, 460, 1152, 460, 420, 1192, 418, 1194, 1154, 458, 418, 1194, + 420, 1192, 1154, 460, 1152, 458, 420, 1194, 418, 1194, 418, 1194, + 1152, 460, 1154, 458, 418, 1196, 416, 1194, 418, 1194, 418, 1196, + 420, 1194, 418, 1192, 420, 1194, 420, 1192, 418, 1196, 416, 1194, + 416, 1196, 1152, 462, 416, 1194, 422, 1192, 1154, 458, 420, 1192, + 418, 1194, 418, 1194, 418, 1196, 420, 1194, 418, 1192, 420, 1194, + 418, 1192, 420, 1194, 418, 1194, 420, 1194, 418, 1194, 1154, 458, + 418, 1194, 418, 1192, 1154, 458, 418, 1196, 416, 1194, 420, 1194, + 416, 1192, 418, 1194, 1152, 462, 416, 1196, 1152, 458, 418, 1196, + 1152, 458, 418, 1194, 1154, 460, 418, 1194, 418, 1196, 418, 1196, + 418, 1194, 1154, 460, 420, 1192, 418, 1194, 420, 1194, 418, 1194, + 418, 1196, 1152, 460, 418, 1194, 1154, 458, 1154, 460, 1152, 458, + 1152}; // UNKNOWN E366A1BC + + + irsend.sendRaw(rawData, 171, 38000); + irsend.makeDecodeResult(); + ASSERT_TRUE(irrecv.decode(&irsend.capture)); + EXPECT_EQ(CARRIER_AC84, irsend.capture.decode_type); + EXPECT_EQ(kCarrierAc84Bits, irsend.capture.bits); + EXPECT_STATE_EQ(expected_state, irsend.capture.state, irsend.capture.bits); + EXPECT_EQ( + "", + IRAcUtils::resultAcToString(&irsend.capture)); + EXPECT_EQ( + "Protocol : CARRIER_AC84\n" + "Code : 0x03009331001200125421E8 (84 Bits)\n", + resultToHumanReadableBasic(&irsend.capture)); +} + +// Decode a synthetic Carrier AC 84-bit message. +TEST(TestDecodeCarrierAC84, SyntheticExample) { + IRsendTest irsend(kGpioUnused); + IRrecv irrecv(kGpioUnused); + irsend.begin(); + + irsend.reset(); + + const uint8_t expected_state[kCarrierAc84StateLength] = { + 0x0C, 0x00, 0xC9, 0x8C, 0x00, 0x48, 0x00, 0x48, 0x2A, 0x84, 0x17}; + irsend.sendCarrierAC84(expected_state); + irsend.makeDecodeResult(); + EXPECT_TRUE(irrecv.decode(&irsend.capture)); + ASSERT_EQ(CARRIER_AC84, irsend.capture.decode_type); + ASSERT_EQ(kCarrierAc84Bits, irsend.capture.bits); + EXPECT_STATE_EQ(expected_state, irsend.capture.state, irsend.capture.bits); + EXPECT_EQ( + "", + IRAcUtils::resultAcToString(&irsend.capture)); + stdAc::state_t r, p; + ASSERT_FALSE(IRAcUtils::decodeToState(&irsend.capture, &r, &p)); +} + +// Decode a "real" troublesome Carrier 84bit example message. +TEST(TestDecodeCarrierAC84, RealExample2) { + IRsendTest irsend(kGpioUnused); + IRrecv irrecv(kGpioUnused); + const uint8_t expected_state[kCarrierAc84StateLength] = { + 0x03, 0x00, 0x03, 0x32, 0x00, 0x12, 0x00, 0x12, 0x33, 0x11, 0xDC}; + irsend.begin(); + + irsend.reset(); + // Data from: + // https://github.com/crankyoldgit/IRremoteESP8266/issues/1943#issuecomment-1374434085 + const uint16_t rawData[171] = { + 5828, 1158, 1148, 464, 1148, 494, 384, 1200, 414, 1202, 412, 1202, 410, + 1204, 408, 1204, 408, 1206, 408, 1228, 386, 1202, 408, 1232, 386, 1202, + 1148, 464, 1146, 468, 412, 1200, 384, 1230, 412, 1200, 412, 1200, 410, + 1204, 412, 1200, 412, 1202, 1146, 468, 410, 1202, 410, 1204, 1146, 466, + 1146, 464, 410, 1230, 386, 1198, 414, 1200, 412, 1202, 410, 1202, 410, + 1200, 410, 1204, 408, 1204, 410, 1202, 412, 1226, 386, 1202, 1144, 468, + 408, 1204, 410, 1200, 1146, 468, 412, 1198, 410, 1206, 408, 1202, 410, + 1228, 384, 1228, 386, 1202, 410, 1202, 412, 1202, 408, 1202, 410, 1202, + 408, 1202, 410, 1204, 1146, 464, 412, 1202, 412, 1200, 1146, 468, 408, + 1202, 412, 1200, 382, 1232, 1146, 488, 1122, 466, 410, 1228, 386, 1200, + 1146, 492, 1118, 466, 412, 1202, 410, 1204, 1146, 464, 414, 1198, 410, + 1204, 410, 1202, 1150, 464, 410, 1202, 412, 1202, 410, 1226, 386, 1200, + 410, 1228, 1148, 440, 1148, 466, 1144, 468, 408, 1202, 1144, 470, 1144, + 492, 1120}; // UNKNOWN 4CC7BE54 + + irsend.sendRaw(rawData, 171, 38000); + irsend.makeDecodeResult(); + ASSERT_TRUE(irrecv.decode(&irsend.capture)); + EXPECT_EQ(CARRIER_AC84, irsend.capture.decode_type); + EXPECT_EQ(kCarrierAc84Bits, irsend.capture.bits); + EXPECT_STATE_EQ(expected_state, irsend.capture.state, irsend.capture.bits); + EXPECT_EQ( + "", + IRAcUtils::resultAcToString(&irsend.capture)); + EXPECT_EQ( + "Protocol : CARRIER_AC84\n" + "Code : 0x03000332001200123311DC (84 Bits)\n", + resultToHumanReadableBasic(&irsend.capture)); +} diff --git a/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/test/ir_Gorenje_test.cpp b/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/test/ir_Gorenje_test.cpp new file mode 100644 index 000000000..245b29b98 --- /dev/null +++ b/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/test/ir_Gorenje_test.cpp @@ -0,0 +1,203 @@ +// Copyright 2022 Mateusz Bronk (mbronk) + +#include "IRac.h" +#include "IRsend.h" +#include "IRsend_test.h" +#include "gtest/gtest.h" + +class TestDecodeGorenjeSyntheticSendTestFixture + : public ::testing::TestWithParam {}; +class TestDecodeGorenjeReceiveTestFixture + : public ::testing::TestWithParam, + uint64_t>> {}; + +TEST(TestGorenje, Settings) { + ASSERT_EQ("GORENJE", typeToString(decode_type_t::GORENJE)); + ASSERT_EQ(decode_type_t::GORENJE, strToDecodeType("GORENJE")); + ASSERT_FALSE(hasACState(decode_type_t::GORENJE)); + ASSERT_FALSE(IRac::isProtocolSupported(decode_type_t::GORENJE)); + ASSERT_EQ(kGorenjeBits, + IRsendTest::defaultBits(decode_type_t::GORENJE)); +} + +// Test sending typical data (cooker hood light toggle) +TEST(TestSendGorenje, SendLightToggle) { + IRsendTest irsend(kGpioUnused); + irsend.begin(); + + irsend.reset(); + irsend.sendGorenje(0x10); // Light toggle + EXPECT_EQ( + "f38000d50" + "m1300s1700m1300s1700m1300s1700m1300s5700m1300s1700m1300s1700m1300s1700" + "m1300s1700" + "m1300s100000", + irsend.outputStr()); +} + +// Test sending with different repeats. +TEST(TestSendGorenje, SendWithRepeats) { + IRsendTest irsend(kGpioUnused); + irsend.begin(); + + irsend.reset(); + irsend.sendGorenje(0x8, kGorenjeBits, 0); // 0 repeats. + EXPECT_EQ( + "f38000d50" + "m1300s1700m1300s1700m1300s1700m1300s1700m1300s5700m1300s1700m1300s1700" + "m1300s1700" + "m1300s100000", + irsend.outputStr()); + irsend.sendGorenje(0x8, kGorenjeBits, 2); // 2 repeats. + EXPECT_EQ( + "f38000d50" + "m1300s1700m1300s1700m1300s1700m1300s1700m1300s5700m1300s1700m1300s1700" + "m1300s1700" + "m1300s100000" + "m1300s1700m1300s1700m1300s1700m1300s1700m1300s5700m1300s1700m1300s1700" + "m1300s1700" + "m1300s100000" + "m1300s1700m1300s1700m1300s1700m1300s1700m1300s5700m1300s1700m1300s1700" + "m1300s1700" + "m1300s100000", + irsend.outputStr()); +} + + +// Decode a Synthetic example +TEST_P(TestDecodeGorenjeSyntheticSendTestFixture, SyntheticExample) { + uint64_t commandToTest = GetParam(); + IRsendTest irsend(kGpioUnused); + IRrecv irrecv(kGpioUnused); + irsend.begin(); + + irsend.reset(); + irsend.sendGorenje(commandToTest); + irsend.makeDecodeResult(); + + ASSERT_TRUE(irrecv.decode(&irsend.capture)); + EXPECT_EQ(GORENJE, irsend.capture.decode_type); + EXPECT_EQ(kGorenjeBits, irsend.capture.bits); + EXPECT_EQ(commandToTest, irsend.capture.value); + EXPECT_EQ(0x0, irsend.capture.address); + EXPECT_EQ(0x0, irsend.capture.command); + EXPECT_FALSE(irsend.capture.repeat); +} + +INSTANTIATE_TEST_CASE_P( + TestDecodeGorenje, + TestDecodeGorenjeSyntheticSendTestFixture, + ::testing::Values(0x2, 0x8, 0x4, 0x10, 0x20, 0x1)); + + +// Decode a real example (codes captured from original remote) +TEST_P(TestDecodeGorenjeReceiveTestFixture, RealExample) { + const std::vector rawDataInput = std::get<0>(GetParam()); + const uint64_t expectedValue = std::get<1>(GetParam()); + + IRsendTest irsend(kGpioUnused); + IRrecv irrecv(kGpioUnused); + irsend.begin(); + + irsend.reset(); + irsend.sendRaw(&rawDataInput[0], rawDataInput.size(), 38000); + irsend.makeDecodeResult(); + + ASSERT_TRUE(irrecv.decode(&irsend.capture)); + EXPECT_EQ(decode_type_t::GORENJE, irsend.capture.decode_type); + EXPECT_EQ(kGorenjeBits, irsend.capture.bits); + EXPECT_EQ(expectedValue, irsend.capture.value); + EXPECT_EQ(0x0, irsend.capture.address); + EXPECT_EQ(0x0, irsend.capture.command); + EXPECT_FALSE(irsend.capture.repeat); +} + +INSTANTIATE_TEST_CASE_P( + TestDecodeGorenje, + TestDecodeGorenjeReceiveTestFixture, + ::testing::Values( + // POWER + std::make_tuple(std::vector { + 1292, 1716, 1300, 1708, 1296, 1712, + 1294, 1714, 1302, 1708, 1298, 1710, + 1294, 5752, 1294, 1714, 1302 + }, + 0x2), + std::make_tuple(std::vector { + 1302, 1706, 1298, 1710, 1294, 1714, + 1292, 1716, 1300, 1708, 1296, 1712, + 1294, 5754, 1292, 1716, 1300 + }, + 0x2), + + // FAN- + std::make_tuple(std::vector { + 1328, 1680, 1324, 1684, 1320, 1688, + 1328, 1680, 1324, 5724, 1322, 1684, + 1330, 1678, 1326, 1682, 1324 + }, + 0x8), + std::make_tuple(std::vector { + 1296, 1712, 1292, 1718, 1298, 1710, + 1294, 1714, 1292, 5756, 1300, 1708, + 1296, 1712, 1294, 1714, 1300 + }, + 0x8), + + // FAN+ + std::make_tuple(std::vector { + 1324, 1684, 1320, 1688, 1328, 1680, + 1324, 1684, 1322, 1688, 1328, 5718, + 1326, 1682, 1322, 1686, 1352 + }, + 0x4), + std::make_tuple(std::vector { + 1296, 1714, 1292, 1716, 1298, 1710, + 1296, 1714, 1292, 1716, 1300, 5748, + 1296, 1712, 1292, 1716, 1300 + }, + 0x4), + + // Light toggle + std::make_tuple(std::vector { + 1326, 1682, 1322, 1686, 1328, 1680, + 1324, 5722, 1322, 1686, 1330, 1680, + 1326, 1682, 1322, 1686, 1328 + }, + 0x10), + std::make_tuple(std::vector { + 1328, 1680, 1324, 1684, 1330, 1678, + 1326, 5722, 1324, 1684, 1330, 1678, + 1326, 1682, 1322, 1686, 1330 + }, + 0x10), + + // Light- + std::make_tuple(std::vector { + 1328, 1680, 1324, 1686, 1330, 5716, + 1328, 1680, 1324, 1684, 1330, 1678, + 1326, 1682, 1354, 1654, 1328 + }, + 0x20), + std::make_tuple(std::vector { + 1322, 1686, 1318, 1690, 1326, 5722, + 1322, 1686, 1330, 1678, 1326, 1682, + 1322, 1686, 1328, 1680, 1324 + }, + 0x20), + + // Light+ + std::make_tuple(std::vector { + 1328, 1680, 1326, 1682, 1322, 1688, + 1328, 1680, 1324, 1686, 1330, 1678, + 1326, 1682, 1322, 5724, 1330 + }, + 0x1), + std::make_tuple(std::vector { + 1298, 1710, 1294, 1714, 1302, 1708, + 1298, 1710, 1294, 1716, 1300, 1708, + 1296, 1712, 1292, 5756, 1300 + }, + 0x1) + ) +); diff --git a/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/test/ir_Panasonic_test.cpp b/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/test/ir_Panasonic_test.cpp index 3e52cef8b..3e3ae4d2b 100644 --- a/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/test/ir_Panasonic_test.cpp +++ b/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/test/ir_Panasonic_test.cpp @@ -13,7 +13,7 @@ // Tests for encodePanasonic(). TEST(TestEncodePanasonic, General) { - IRsendTest irsend(4); + IRsendTest irsend(kGpioUnused); EXPECT_EQ(0x0, irsend.encodePanasonic(0, 0, 0, 0)); EXPECT_EQ(0x101010101, irsend.encodePanasonic(1, 1, 1, 1)); EXPECT_EQ(0xFFFF, irsend.encodePanasonic(0, 0, 0, 0xFF)); @@ -28,7 +28,7 @@ TEST(TestEncodePanasonic, General) { // Test sending typical data only. TEST(TestSendPanasonic64, SendDataOnly) { - IRsendTest irsend(4); + IRsendTest irsend(kGpioUnused); irsend.begin(); irsend.reset(); @@ -76,7 +76,7 @@ TEST(TestSendPanasonic64, SendDataOnly) { // Test sending with different repeats. TEST(TestSendPanasonic64, SendWithRepeats) { - IRsendTest irsend(4); + IRsendTest irsend(kGpioUnused); irsend.begin(); irsend.reset(); @@ -147,7 +147,7 @@ TEST(TestSendPanasonic64, SendWithRepeats) { // Test sending an atypical data size. TEST(TestSendPanasonic64, SendUnusualSize) { - IRsendTest irsend(4); + IRsendTest irsend(kGpioUnused); irsend.begin(); irsend.reset(); @@ -213,8 +213,8 @@ TEST(TestSendPanasonic, CompareToSendPanasonic64) { // Decode normal Panasonic messages. TEST(TestDecodePanasonic, NormalDecodeWithStrict) { - IRsendTest irsend(4); - IRrecv irrecv(4); + IRsendTest irsend(kGpioUnused); + IRrecv irrecv(kGpioUnused); irsend.begin(); // Normal Panasonic 48-bit message. @@ -259,8 +259,8 @@ TEST(TestDecodePanasonic, NormalDecodeWithStrict) { // Decode normal repeated Panasonic messages. TEST(TestDecodePanasonic, NormalDecodeWithRepeatAndStrict) { - IRsendTest irsend(4); - IRrecv irrecv(4); + IRsendTest irsend(kGpioUnused); + IRrecv irrecv(kGpioUnused); irsend.begin(); // Normal Panasonic 48-bit message with 2 repeats. @@ -293,8 +293,8 @@ TEST(TestDecodePanasonic, NormalDecodeWithRepeatAndStrict) { // Decode Panasonic messages with unsupported values. TEST(TestDecodePanasonic, DecodeWithNonStrictValues) { - IRsendTest irsend(4); - IRrecv irrecv(4); + IRsendTest irsend(kGpioUnused); + IRrecv irrecv(kGpioUnused); irsend.begin(); irsend.reset(); @@ -331,8 +331,8 @@ TEST(TestDecodePanasonic, DecodeWithNonStrictValues) { // Decode Panasonic messages with unsupported size/lengths. TEST(TestDecodePanasonic, DecodeWithNonStrictSize) { - IRsendTest irsend(4); - IRrecv irrecv(4); + IRsendTest irsend(kGpioUnused); + IRrecv irrecv(kGpioUnused); irsend.begin(); irsend.reset(); @@ -375,8 +375,8 @@ TEST(TestDecodePanasonic, DecodeWithNonStrictSize) { // Decode (non-standard) 64-bit messages. TEST(TestDecodePanasonic, Decode64BitMessages) { - IRsendTest irsend(4); - IRrecv irrecv(4); + IRsendTest irsend(kGpioUnused); + IRrecv irrecv(kGpioUnused); irsend.begin(); irsend.reset(); @@ -395,8 +395,8 @@ TEST(TestDecodePanasonic, Decode64BitMessages) { // Decode a 'real' example via GlobalCache TEST(TestDecodePanasonic, DecodeGlobalCacheExample) { - IRsendTest irsend(4); - IRrecv irrecv(4); + IRsendTest irsend(kGpioUnused); + IRrecv irrecv(kGpioUnused); irsend.begin(); irsend.reset(); @@ -432,8 +432,8 @@ TEST(TestDecodePanasonic, DecodeGlobalCacheExample) { // Fail to decode a non-Panasonic example via GlobalCache TEST(TestDecodePanasonic, FailToDecodeNonPanasonicExample) { - IRsendTest irsend(4); - IRrecv irrecv(4); + IRsendTest irsend(kGpioUnused); + IRrecv irrecv(kGpioUnused); irsend.begin(); irsend.reset(); @@ -452,8 +452,8 @@ TEST(TestDecodePanasonic, FailToDecodeNonPanasonicExample) { // Failing to decode Panasonic in Issue #245 TEST(TestDecodePanasonic, DecodeIssue245) { - IRsendTest irsend(4); - IRrecv irrecv(4); + IRsendTest irsend(kGpioUnused); + IRrecv irrecv(kGpioUnused); irsend.begin(); irsend.reset(); @@ -813,8 +813,8 @@ TEST(TestIRPanasonicAcClass, HumanReadable) { // Decode normal Panasonic AC messages. TEST(TestDecodePanasonicAC, RealExample) { - IRsendTest irsend(4); - IRrecv irrecv(4); + IRsendTest irsend(kGpioUnused); + IRrecv irrecv(kGpioUnused); irsend.begin(); // Data from Issue #525 @@ -1586,3 +1586,73 @@ TEST(TestIRPanasonicAc32Class, HumanReadable) { "Swing(H): Off, Swing(V): 5 (Lowest)", ac.toString()); } + +// Decode a 'real' example of a captured 40 bit panasonic message +TEST(TestDecodePanasonic, RealPanasonic40BitMesg) { + IRsendTest irsend(kGpioUnused); + IRrecv irrecv(kGpioUnused); + irsend.begin(); + + irsend.reset(); + // Panasonic 40 bit code https://github.com/crankyoldgit/IRremoteESP8266/issues/1976#issue-1660147581 + const uint16_t rawData1[83] = { + 3486, 1742, + 432, 456, 406, 456, 406, 1336, 406, 1312, 430, 456, 406, 1334, 408, 456, + 406, 456, 408, 456, 406, 1334, 408, 456, 408, 454, 408, 1334, 408, 456, + 406, 1336, 406, 456, 408, 1334, 408, 456, 406, 456, 408, 1336, 406, 456, + 408, 454, 406, 456, 406, 454, 408, 1332, 410, 1332, 408, 1334, 408, 1336, + 406, 1334, 410, 1332, 410, 454, 406, 456, 406, 456, 406, 1332, 410, 1334, + 408, 454, 406, 1336, 406, 1336, 406, 454, 410, 454, 408}; // UKN 1D41D404 + + irsend.sendRaw(rawData1, 83, 38); + irsend.makeDecodeResult(); + + ASSERT_TRUE(irrecv.decode(&irsend.capture)); + EXPECT_EQ(PANASONIC, irsend.capture.decode_type); + EXPECT_EQ(kPanasonic40Bits, irsend.capture.bits); + EXPECT_EQ(0x344A90FC6C, irsend.capture.value); + EXPECT_EQ(0x34, irsend.capture.address); + EXPECT_EQ(0x4A90FC6C, irsend.capture.command); + EXPECT_FALSE(irsend.capture.repeat); + + // night ch3 from https://github.com/crankyoldgit/IRremoteESP8266/issues/1976#issuecomment-1501736104 + const uint16_t rawData2[83] = { + 3490, 1734, + 440, 426, 460, 400, 438, 1304, 438, 1302, 440, 426, 436, 1302, 464, 400, + 462, 400, 462, 402, 462, 1278, 438, 426, 438, 426, 460, 1282, 434, 428, + 434, 1308, 460, 402, 460, 1280, 440, 422, 438, 426, 436, 1306, 438, 424, + 462, 402, 436, 426, 462, 400, 438, 426, 436, 1304, 434, 1308, 438, 1304, + 464, 1278, 436, 1306, 466, 398, 464, 398, 466, 1276, 466, 1274, 464, 1280, + 462, 402, 436, 1304, 466, 1276, 440, 422, 440, 424, 460}; // UKN DAE32FFC + irsend.reset(); + + irsend.sendRaw(rawData2, 83, 38); + irsend.makeDecodeResult(); + + ASSERT_TRUE(irrecv.decode(&irsend.capture)); + EXPECT_EQ(PANASONIC, irsend.capture.decode_type); + EXPECT_EQ(kPanasonic40Bits, irsend.capture.bits); + EXPECT_EQ(0x344A907CEC, irsend.capture.value); + EXPECT_EQ(0x34, irsend.capture.address); + EXPECT_EQ(0x4A907CEC, irsend.capture.command); + EXPECT_FALSE(irsend.capture.repeat); +} + +// recreate the above real message, synthetically. +TEST(TestDecodePanasonic, SynthticPanasonic40BitMesg) { + IRsendTest irsend(kGpioUnused); + IRrecv irrecv(kGpioUnused); + irsend.begin(); + irsend.reset(); + + irsend.sendPanasonic64(0x344A90FC6C, kPanasonic40Bits); + irsend.makeDecodeResult(); + + ASSERT_TRUE(irrecv.decode(&irsend.capture)); + EXPECT_EQ(PANASONIC, irsend.capture.decode_type); + EXPECT_EQ(kPanasonic40Bits, irsend.capture.bits); + EXPECT_EQ(0x344A90FC6C, irsend.capture.value); + EXPECT_EQ(0x34, irsend.capture.address); + EXPECT_EQ(0x4A90FC6C, irsend.capture.command); + EXPECT_FALSE(irsend.capture.repeat); +} diff --git a/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/test/ir_Wowwee_test.cpp b/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/test/ir_Wowwee_test.cpp new file mode 100644 index 000000000..e74f61149 --- /dev/null +++ b/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/test/ir_Wowwee_test.cpp @@ -0,0 +1,103 @@ +// Copyright 2022 David Conran + +#include "IRac.h" +#include "IRrecv.h" +#include "IRrecv_test.h" +#include "IRsend.h" +#include "IRsend_test.h" +#include "gtest/gtest.h" + +TEST(TestUtils, Housekeeping) { + ASSERT_EQ("WOWWEE", typeToString(decode_type_t::WOWWEE)); + ASSERT_EQ(decode_type_t::WOWWEE, strToDecodeType("WOWWEE")); + ASSERT_FALSE(hasACState(decode_type_t::WOWWEE)); + ASSERT_FALSE(IRac::isProtocolSupported(decode_type_t::WOWWEE)); + ASSERT_EQ(kWowweeBits, IRsend::defaultBits(decode_type_t::WOWWEE)); + ASSERT_EQ(kWowweeDefaultRepeat, IRsend::minRepeats(decode_type_t::WOWWEE)); +} + +// Tests for sendWowwee(). +// Test sending typical data only. +TEST(TestSendWowwee, SendDataOnly) { + IRsendTest irsend(kGpioUnused); + irsend.begin(); + + irsend.reset(); + irsend.sendWowwee(0x186); // Nikai TV Power Off. + EXPECT_EQ( + "f38000d33" + "m6684s723" + "m912s723m912s723m912s3259m912s3259m912s723m912s723m912s723m912s723" + "m912s3259m912s3259m912s723m912s100000", + irsend.outputStr()); + + irsend.reset(); +} + +// Tests for decodeWowwee(). + +// Decode normal Wowwee messages. +TEST(TestDecodeWowwee, RealDecode) { + IRsendTest irsend(kGpioUnused); + IRrecv irrecv(kGpioUnused); + irsend.begin(); + + // Ref: https://github.com/crankyoldgit/IRremoteESP8266/issues/1938#issue-1513240242 + const uint16_t rawForward[25] = { + 6684, 740, 918, 724, 942, 724, 918, 3250, 870, 3268, 872, 770, 940, 690, + 942, 688, 942, 738, 942, 3250, 868, 3268, 872, 732, 918 + }; // UNKNOWN 7469BF81 + irsend.reset(); + irsend.sendRaw(rawForward, 25, 38); + irsend.makeDecodeResult(); + ASSERT_TRUE(irrecv.decode(&irsend.capture)); + EXPECT_EQ(decode_type_t::WOWWEE, irsend.capture.decode_type); + EXPECT_EQ(kWowweeBits, irsend.capture.bits); + EXPECT_EQ(0x186, irsend.capture.value); + EXPECT_EQ(0x0, irsend.capture.command); + EXPECT_EQ(0x0, irsend.capture.address); + + // Ref: https://github.com/crankyoldgit/IRremoteESP8266/issues/1938#issue-1513240242 + const uint16_t rawLeft[25] = { + 6630, 764, 868, 762, 892, 788, 866, 3324, 792, 3348, 818, 760, 866, 788, + 894, 772, 892, 750, 870, 786, 920, 750, 864, 776, 868 + }; // UNKNOWN 28A1120F + irsend.reset(); + irsend.sendRaw(rawLeft, 25, 38); + irsend.makeDecodeResult(); + ASSERT_TRUE(irrecv.decode(&irsend.capture)); + EXPECT_EQ(decode_type_t::WOWWEE, irsend.capture.decode_type); + EXPECT_EQ(kWowweeBits, irsend.capture.bits); + EXPECT_EQ(0x180, irsend.capture.value); + EXPECT_EQ(0x0, irsend.capture.command); + EXPECT_EQ(0x0, irsend.capture.address); +} + +// Decode normal repeated Wowwee messages. +TEST(TestDecodeWowwee, SyntheticDecode) { + IRsendTest irsend(kGpioUnused); + IRrecv irrecv(kGpioUnused); + irsend.begin(); + + // Normal Wowwee 11-bit message. + irsend.reset(); + irsend.sendWowwee(0x186); + irsend.makeDecodeResult(); + ASSERT_TRUE(irrecv.decode(&irsend.capture)); + EXPECT_EQ(decode_type_t::WOWWEE, irsend.capture.decode_type); + EXPECT_EQ(kWowweeBits, irsend.capture.bits); + EXPECT_EQ(0x186, irsend.capture.value); + EXPECT_EQ(0x0, irsend.capture.command); + EXPECT_EQ(0x0, irsend.capture.address); + + // Normal Wowwee 11-bit message. + irsend.reset(); + irsend.sendWowwee(0x180); + irsend.makeDecodeResult(); + ASSERT_TRUE(irrecv.decode(&irsend.capture)); + EXPECT_EQ(decode_type_t::WOWWEE, irsend.capture.decode_type); + EXPECT_EQ(kWowweeBits, irsend.capture.bits); + EXPECT_EQ(0x180, irsend.capture.value); + EXPECT_EQ(0x0, irsend.capture.command); + EXPECT_EQ(0x0, irsend.capture.address); +} diff --git a/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/test/ir_York_test.cpp b/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/test/ir_York_test.cpp new file mode 100644 index 000000000..d8ec1c9d1 --- /dev/null +++ b/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/test/ir_York_test.cpp @@ -0,0 +1,96 @@ +// Copyright 2023 Daniele Gobbetti + +#include "ir_York.h" +#include "IRac.h" +#include "IRrecv.h" +#include "IRrecv_test.h" +#include "IRsend.h" +#include "IRsend_test.h" +#include "gtest/gtest.h" + + +// General housekeeping +TEST(TestYork, Housekeeping) { + ASSERT_EQ("YORK", typeToString(decode_type_t::YORK)); + ASSERT_EQ(typeToString(decode_type_t::YORK), "YORK"); + ASSERT_TRUE(hasACState(YORK)); + ASSERT_TRUE(IRac::isProtocolSupported(decode_type_t::YORK)); + ASSERT_EQ(kYorkBits, IRsend::defaultBits(decode_type_t::YORK)); +} + +// Tests for sendYork(). +// Test sending typical data only. +TEST(TestSendYork, SendDataOnly) { + IRsendTest irsend(0); + irsend.begin(); + uint8_t data[kYorkStateLength] = { + 0x08, 0x10, 0x07, 0x02, 0x40, 0x08, + 0x03, 0x18, 0x01, 0x60, 0x00, 0x00, 0x00, 0x00, + 0xEC, 0xF5, 0xF2}; + irsend.reset(); + irsend.sendYork(data); + EXPECT_EQ( + "f38000d50" + "m4887s2267m612s579m612s579m612s579m612s1778m612s579m612s579m612s579" + "m612s579m612s579m612s579m612s579m612s579m612s1778m612s579m612s579" + "m612s579m612s1778m612s1778m612s1778m612s579m612s579m612s579m612s579" + "m612s579m612s579m612s1778m612s579m612s579m612s579m612s579m612s579m612s579" + "m612s579m612s579m612s579m612s579m612s579m612s579m612s1778m612s579m612s579" + "m612s579m612s579m612s1778m612s579m612s579m612s579m612s579m612s1778" + "m612s1778m612s579m612s579m612s579m612s579m612s579m612s579m612s579m612s579" + "m612s579m612s1778m612s1778m612s579m612s579m612s579m612s1778m612s579" + "m612s579m612s579m612s579m612s579m612s579m612s579m612s579m612s579m612s579" + "m612s579m612s579m612s1778m612s1778m612s579m612s579m612s579m612s579" + "m612s579m612s579m612s579m612s579m612s579m612s579m612s579m612s579m612s579" + "m612s579m612s579m612s579m612s579m612s579m612s579m612s579m612s579m612s579" + "m612s579m612s579m612s579m612s579m612s579m612s579m612s579m612s579m612s579" + "m612s579m612s579m612s579m612s579m612s1778m612s1778m612s579m612s1778" + "m612s1778m612s1778m612s1778m612s579m612s1778m612s579m612s1778m612s1778" + "m612s1778m612s1778m612s579m612s1778m612s579m612s579m612s1778m612s1778" + "m612s1778m612s1778m612s100000", + irsend.outputStr()); + + irsend.reset(); +} + +// Decode normal York messages. +TEST(TestDecodeYork, SyntheticDecode) { + IRsendTest irsend(0); + IRrecv irrecv(0); + irsend.begin(); + + // Synthesised Normal York message. + irsend.reset(); + uint8_t kYorkKnownGoodState[kYorkStateLength] = { + 0x08, 0x10, 0x07, 0x02, 0x40, 0x08, + 0x03, 0x18, 0x01, 0x60, 0x00, 0x00, 0x00, 0x00, + 0xEC, 0xF5, 0xF2}; + irsend.sendYork(kYorkKnownGoodState); + irsend.makeDecodeResult(); + EXPECT_TRUE(irrecv.decode(&irsend.capture)); + EXPECT_EQ(YORK, irsend.capture.decode_type); + EXPECT_EQ(kYorkBits, irsend.capture.bits); + EXPECT_STATE_EQ(kYorkKnownGoodState, irsend.capture.state, + irsend.capture.bits); + EXPECT_EQ( + "Power: On, Mode: 1 (Heat), Fan: 8 (Auto), Temp: 24C, Swing(V): Off" + ", On Timer: 00:00, Off Timer: 00:00", + IRAcUtils::resultAcToString(&irsend.capture)); + stdAc::state_t r, p; + ASSERT_TRUE(IRAcUtils::decodeToState(&irsend.capture, &r, &p)); +} + +// test checksum calculation +TEST(TestYorkClass, SetAndGetTemp) { + IRYorkAc ac(kGpioUnused); + EXPECT_NE(23, ac.getTemp()); // default state is 24 deegrees Celsius + ac.setTemp(23); + EXPECT_EQ(23, ac.getTemp()); + + uint8_t expectedState[kYorkStateLength] = { + 0x08, 0x10, 0x07, 0x02, 0x40, 0x08, + 0x03, 0x18, 0x01, 0x5C, 0x00, 0x00, 0x00, 0x00, + 0xEC, 0xA5, 0xF7}; + + EXPECT_STATE_EQ(expectedState, ac.getRaw(), kYorkBits); +} diff --git a/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/test/ut_utils.h b/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/test/ut_utils.h new file mode 100644 index 000000000..a8d8c7d54 --- /dev/null +++ b/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/test/ut_utils.h @@ -0,0 +1,35 @@ +// Copyright 2022 Mateusz Bronk + +#ifndef TEST_UT_UTILS_H_ +#define TEST_UT_UTILS_H_ + +#include +#include +#include +#include +#include + + +std::string bytesToHexString(const std::vector& value) { + std::ostringstream oss; + oss << std::hex << std::setfill('0'); + + std::for_each(std::begin(value), std::end(value), [&oss] (uint8_t i) { + oss << std::setw(2) << std::uppercase << static_cast(i); + }); + return oss.str(); +} + +std::vector hexStringToBytes(const std::string& hex) { + std::vector bytes; + bytes.reserve(hex.length() / 2); + + for (size_t i = 0; i < hex.length(); i += 2) { + std::string nextByte = hex.substr(i, 2); + uint8_t byte = static_cast(strtol(nextByte.c_str(), nullptr, 16)); + bytes.emplace_back(byte); + } + return bytes; +} + +#endif // TEST_UT_UTILS_H_ diff --git a/lib/lib_basic/IRremoteESP8266/library.json b/lib/lib_basic/IRremoteESP8266/library.json index e221e7cf1..476000469 100644 --- a/lib/lib_basic/IRremoteESP8266/library.json +++ b/lib/lib_basic/IRremoteESP8266/library.json @@ -1,6 +1,6 @@ { "name": "IRremoteESP8266", - "version": "2.8.4", + "version": "2.8.5", "keywords": "infrared, ir, remote, esp8266, esp32", "description": "Send and receive infrared signals with multiple protocols (ESP8266/ESP32)", "repository": diff --git a/platformio_tasmota_env32.ini b/platformio_tasmota_env32.ini index 75ca2cb78..337255131 100644 --- a/platformio_tasmota_env32.ini +++ b/platformio_tasmota_env32.ini @@ -115,7 +115,6 @@ lib_extra_dirs = lib/libesp32, lib/libesp32_lvgl, lib/lib_basic, lib/li [env:tasmota32-ir] extends = env:tasmota32_base build_flags = ${env:tasmota32_base.build_flags} - -DUSE_IR_REMOTE_FULL -DFIRMWARE_IR -DOTA_URL='"http://ota.tasmota.com/tasmota32/release/tasmota32-ir.bin"' lib_extra_dirs = lib/libesp32, lib/lib_basic, lib/lib_ssl From efc464e998ad2827a8922fcbbb4758b01d89a6f2 Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Mon, 8 May 2023 20:44:31 +0200 Subject: [PATCH 090/289] Berry code solidifying with GH actions (#18611) --- .github/workflows/Tasmota_build_devel.yml | 55 +++++++++++++++++++ .github/workflows/Tasmota_build_master.yml | 55 +++++++++++++++++++ .../src/solidify/solidified_i2c_axp192.h | 2 +- .../src/solidify/solidified_i2c_axp202.h | 2 +- 4 files changed, 112 insertions(+), 2 deletions(-) diff --git a/.github/workflows/Tasmota_build_devel.yml b/.github/workflows/Tasmota_build_devel.yml index e60c45f7b..f6037bad8 100644 --- a/.github/workflows/Tasmota_build_devel.yml +++ b/.github/workflows/Tasmota_build_devel.yml @@ -15,7 +15,62 @@ concurrency: cancel-in-progress: true jobs: + be_solidify: + runs-on: ubuntu-20.04 + if: github.repository == 'arendst/Tasmota' + steps: + - uses: actions/checkout@v3 + - name: Set up Python + uses: actions/setup-python@v4 + with: + python-version: '3.x' + - name: Make Berry and Tasmota Berry code + run: | + cd lib/libesp32/berry + make + cd ../berry_tasmota + ../berry/berry -s -g solidify_all.be + - name: Matter Berry Code + run: | + cd lib/libesp32/berry_matter + ../berry/berry -s -g solidify_all.be + - uses: actions/upload-artifact@v3 + with: + name: berry_matter + path: ./lib/libesp32/berry_matter/src/solidify + - uses: actions/upload-artifact@v3 + with: + name: berry_tasmota + path: ./lib/libesp32/berry_tasmota/src/solidify + + push_solidified: + needs: be_solidify + runs-on: ubuntu-latest + if: github.repository == 'arendst/Tasmota' + steps: + - uses: actions/checkout@v3 + - name: Set up Python + uses: actions/setup-python@v4 + with: + python-version: '3.x' + - name: Remove old solidified code + run: | + rm ./lib/libesp32/berry_matter/src/solidify/* + rm ./lib/libesp32/berry_tasmota/src/solidify/* + - uses: actions/download-artifact@v3 + with: + name: berry_matter + path: ./lib/libesp32/berry_matter/src/solidify + - uses: actions/download-artifact@v3 + with: + name: berry_tasmota + path: ./lib/libesp32/berry_tasmota/src/solidify + - uses: stefanzweifel/git-auto-commit-action@v4 + with: + commit_message: Solidified Code updated + safeboot-images: + needs: push_solidified runs-on: ubuntu-latest if: github.repository == 'arendst/Tasmota' continue-on-error: true diff --git a/.github/workflows/Tasmota_build_master.yml b/.github/workflows/Tasmota_build_master.yml index 2a9955b7d..299774c54 100644 --- a/.github/workflows/Tasmota_build_master.yml +++ b/.github/workflows/Tasmota_build_master.yml @@ -14,7 +14,62 @@ concurrency: cancel-in-progress: true jobs: + be_solidify: + runs-on: ubuntu-20.04 + if: github.repository == 'arendst/Tasmota' + steps: + - uses: actions/checkout@v3 + - name: Set up Python + uses: actions/setup-python@v4 + with: + python-version: '3.x' + - name: Make Berry and Tasmota Berry code + run: | + cd lib/libesp32/berry + make + cd ../berry_tasmota + ../berry/berry -s -g solidify_all.be + - name: Matter Berry Code + run: | + cd lib/libesp32/berry_matter + ../berry/berry -s -g solidify_all.be + - uses: actions/upload-artifact@v3 + with: + name: berry_matter + path: ./lib/libesp32/berry_matter/src/solidify + - uses: actions/upload-artifact@v3 + with: + name: berry_tasmota + path: ./lib/libesp32/berry_tasmota/src/solidify + + push_solidified: + needs: be_solidify + runs-on: ubuntu-latest + if: github.repository == 'arendst/Tasmota' + steps: + - uses: actions/checkout@v3 + - name: Set up Python + uses: actions/setup-python@v4 + with: + python-version: '3.x' + - name: Remove old solidified code + run: | + rm ./lib/libesp32/berry_matter/src/solidify/* + rm ./lib/libesp32/berry_tasmota/src/solidify/* + - uses: actions/download-artifact@v3 + with: + name: berry_matter + path: ./lib/libesp32/berry_matter/src/solidify + - uses: actions/download-artifact@v3 + with: + name: berry_tasmota + path: ./lib/libesp32/berry_tasmota/src/solidify + - uses: stefanzweifel/git-auto-commit-action@v4 + with: + commit_message: Solidified Code updated + safeboot-images: + needs: push_solidified runs-on: ubuntu-latest if: github.repository == 'arendst/Tasmota' continue-on-error: true diff --git a/lib/libesp32/berry_tasmota/src/solidify/solidified_i2c_axp192.h b/lib/libesp32/berry_tasmota/src/solidify/solidified_i2c_axp192.h index 97c7d8cb3..2ef43a553 100644 --- a/lib/libesp32/berry_tasmota/src/solidify/solidified_i2c_axp192.h +++ b/lib/libesp32/berry_tasmota/src/solidify/solidified_i2c_axp192.h @@ -72,7 +72,7 @@ be_local_closure(AXP192_get_bat_power, /* name */ 1, /* has constants */ ( &(const bvalue[ 2]) { /* constants */ /* K0 */ be_nested_str(read24), - /* K1 */ be_const_real_hex(0x3A102DE1), + /* K1 */ be_const_real_hex(0x3A102DE0), }), &be_const_str_get_bat_power, &be_const_str_solidified, diff --git a/lib/libesp32/berry_tasmota/src/solidify/solidified_i2c_axp202.h b/lib/libesp32/berry_tasmota/src/solidify/solidified_i2c_axp202.h index 4d8199e1d..a912b0660 100644 --- a/lib/libesp32/berry_tasmota/src/solidify/solidified_i2c_axp202.h +++ b/lib/libesp32/berry_tasmota/src/solidify/solidified_i2c_axp202.h @@ -172,7 +172,7 @@ be_local_closure(AXP202_get_bat_power, /* name */ 1, /* has constants */ ( &(const bvalue[ 2]) { /* constants */ /* K0 */ be_nested_str(read24), - /* K1 */ be_const_real_hex(0x3A102DE1), + /* K1 */ be_const_real_hex(0x3A102DE0), }), &be_const_str_get_bat_power, &be_const_str_solidified, From 26f7eeba1bd1d0ff6c2dd168de6d971539ac22a4 Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Mon, 8 May 2023 20:48:09 +0200 Subject: [PATCH 091/289] wait for solidify --- .github/workflows/Tasmota_build_devel.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/Tasmota_build_devel.yml b/.github/workflows/Tasmota_build_devel.yml index f6037bad8..b06cbb3c5 100644 --- a/.github/workflows/Tasmota_build_devel.yml +++ b/.github/workflows/Tasmota_build_devel.yml @@ -106,6 +106,7 @@ jobs: path: ./build_output base-images: + needs: push_solidified runs-on: ubuntu-latest if: github.repository == 'arendst/Tasmota' continue-on-error: true From aac1b0807482dfdc89d4cee601e127c74ac75518 Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Mon, 8 May 2023 20:49:21 +0200 Subject: [PATCH 092/289] wait for solidify --- .github/workflows/Tasmota_build_master.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/Tasmota_build_master.yml b/.github/workflows/Tasmota_build_master.yml index 299774c54..84eb59dd1 100644 --- a/.github/workflows/Tasmota_build_master.yml +++ b/.github/workflows/Tasmota_build_master.yml @@ -105,6 +105,7 @@ jobs: path: ./build_output base-images: + needs: push_solidified runs-on: ubuntu-latest if: github.repository == 'arendst/Tasmota' continue-on-error: true From ffedb96702ab65d17746fd9b1ca4de4a890a6ff7 Mon Sep 17 00:00:00 2001 From: stefanbode Date: Mon, 8 May 2023 21:11:19 +0200 Subject: [PATCH 093/289] introduced "inverted" setting (#18607) ensure that matter support still works if the "inverted" flag is set on the shutter side --- .../src/embedded/Matter_Plugin_Shutter.be | 45 +++++++++++++++++-- 1 file changed, 41 insertions(+), 4 deletions(-) diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Shutter.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Shutter.be index 7648bf5e5..c08289cab 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Shutter.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Shutter.be @@ -43,6 +43,7 @@ class Matter_Plugin_Shutter : Matter_Plugin_Device var shadow_shutter_target var shadow_shutter_tilt var shadow_shutter_direction # 1=opening -1=closing 0=not moving TODO + var shadow_shutter_inverted # 1=same as matter 0=matter must invert ############################################################# # Constructor @@ -50,12 +51,34 @@ class Matter_Plugin_Shutter : Matter_Plugin_Device super(self).init(device, endpoint, arguments) self.tasmota_shutter_index = arguments.find(self.ARG #-'relay'-#) if self.tasmota_shutter_index == nil self.tasmota_shutter_index = 0 end + self.shadow_shutter_inverted = -1 + end + + ############################################################# + # Update inverted set + # + # Update "inverted" flag from Status 13 + def update_inverted() + # get the min/max tilt values + if (self.shadow_shutter_inverted == -1) + var r_st13 = tasmota.cmd("Status 13", true) # issue `Status 13` + if r_st13.contains('StatusSHT') + r_st13 = r_st13['StatusSHT'] # skip root + var d = r_st13.find("SHT"+str(self.tasmota_shutter_index), {}).find('Opt') + tasmota.log("MTR: opt: "+str(d)) + if d != nil + self.shadow_shutter_inverted = int(d[size(d)-1]) # inverted is at the most right character + tasmota.log("MTR: Inverted flag: "+str(self.shadow_shutter_inverted)) + end + end + end end ############################################################# # Update shadow # def update_shadow() + self.update_inverted() var sp = tasmota.cmd("ShutterPosition" + str(self.tasmota_shutter_index + 1), true) if sp self.parse_sensors(sp) @@ -71,10 +94,12 @@ class Matter_Plugin_Shutter : Matter_Plugin_Device var TLV = matter.TLV var cluster = ctx.cluster var attribute = ctx.attribute + var matter_position # ==================================================================================================== if cluster == 0x0102 # ========== Window Covering 5.3 p.289 ========== self.update_shadow_lazy() + self.update_inverted() if attribute == 0x0000 # ---------- Type / enum8 ---------- return TLV.create_TLV(TLV.U1, 0xFF) # 0xFF = unknown type of shutter elif attribute == 0x0005 # ---------- NumberOfActuationsLift / u16 ---------- @@ -83,14 +108,23 @@ class Matter_Plugin_Shutter : Matter_Plugin_Device return TLV.create_TLV(TLV.U1, 1 + 8) # Operational + Lift Position Aware elif attribute == 0x000D # ---------- EndProductType / u8 ---------- return TLV.create_TLV(TLV.U1, 0xFF) # 0xFF = unknown type of shutter - elif attribute == 0x000E # ---------- CurrentPositionLiftPercent100ths / u16 ---------- - return TLV.create_TLV(TLV.U2, (100 - self.shadow_shutter_pos) * 100) + if self.shadow_shutter_inverted == 0 + matter_position = (100 - self.shadow_shutter_pos) * 100 + else + matter_position = self.shadow_shutter_pos * 100 + end + return TLV.create_TLV(TLV.U2, matter_position) elif attribute == 0x000A # ---------- OperationalStatus / u8 ---------- var op = self.shadow_shutter_direction == 0 ? 0 : (self.shadow_shutter_direction > 0 ? 1 : 2) return TLV.create_TLV(TLV.U1, op) elif attribute == 0x000B # ---------- TargetPositionLiftPercent100ths / u16 ---------- - return TLV.create_TLV(TLV.U2, (100 - self.shadow_shutter_target) * 100) + if self.shadow_shutter_inverted == 0 + matter_position = (100 - self.shadow_shutter_target) * 100 + else + matter_position = self.shadow_shutter_target * 100 + end + return TLV.create_TLV(TLV.U2, matter_position) elif attribute == 0x0017 # ---------- Mode / u8 ---------- return TLV.create_TLV(TLV.U1, 0) # normal mode @@ -137,7 +171,10 @@ class Matter_Plugin_Shutter : Matter_Plugin_Device var pos_100 = val.findsubval(0) if pos_100 != nil pos_100 = pos_100 / 100 - tasmota.cmd("ShutterStopPosition"+str(self.tasmota_shutter_index+1) + " " + str(100 - pos_100), true) + if self.shadow_shutter_inverted == 0 + pos_100 = 100 - pos_100 + end + tasmota.cmd("ShutterPosition"+str(self.tasmota_shutter_index+1) + " " + str(pos_100), true) ctx.log = "pos%:"+str(pos_100) self.update_shadow() end From c5e6115597dd9482466b9b82ac61e04b37265a4b Mon Sep 17 00:00:00 2001 From: s-hadinger Date: Mon, 8 May 2023 19:12:02 +0000 Subject: [PATCH 094/289] Solidified Code updated --- .../solidified_Matter_Plugin_Shutter.h | 1019 +++++++++-------- 1 file changed, 573 insertions(+), 446 deletions(-) diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Shutter.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Shutter.h index ec02f9890..2fd38c7da 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Shutter.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Shutter.h @@ -6,6 +6,454 @@ extern const bclass be_class_Matter_Plugin_Shutter; +/******************************************************************** +** Solidified function: update_inverted +********************************************************************/ +be_local_closure(Matter_Plugin_Shutter_update_inverted, /* name */ + be_nested_proto( + 7, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[14]) { /* constants */ + /* K0 */ be_nested_str_weak(shadow_shutter_inverted), + /* K1 */ be_nested_str_weak(tasmota), + /* K2 */ be_nested_str_weak(cmd), + /* K3 */ be_nested_str_weak(Status_X2013), + /* K4 */ be_nested_str_weak(contains), + /* K5 */ be_nested_str_weak(StatusSHT), + /* K6 */ be_nested_str_weak(find), + /* K7 */ be_nested_str_weak(SHT), + /* K8 */ be_nested_str_weak(tasmota_shutter_index), + /* K9 */ be_nested_str_weak(Opt), + /* K10 */ be_nested_str_weak(log), + /* K11 */ be_nested_str_weak(MTR_X3A_X20opt_X3A_X20), + /* K12 */ be_const_int(1), + /* K13 */ be_nested_str_weak(MTR_X3A_X20Inverted_X20flag_X3A_X20), + }), + be_str_weak(update_inverted), + &be_const_str_solidified, + ( &(const binstruction[51]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x5409FFFE, // 0001 LDINT R2 -1 + 0x1C040202, // 0002 EQ R1 R1 R2 + 0x7806002D, // 0003 JMPF R1 #0032 + 0xB8060200, // 0004 GETNGBL R1 K1 + 0x8C040302, // 0005 GETMET R1 R1 K2 + 0x580C0003, // 0006 LDCONST R3 K3 + 0x50100200, // 0007 LDBOOL R4 1 0 + 0x7C040600, // 0008 CALL R1 3 + 0x8C080304, // 0009 GETMET R2 R1 K4 + 0x58100005, // 000A LDCONST R4 K5 + 0x7C080400, // 000B CALL R2 2 + 0x780A0024, // 000C JMPF R2 #0032 + 0x94040305, // 000D GETIDX R1 R1 K5 + 0x8C080306, // 000E GETMET R2 R1 K6 + 0x60100008, // 000F GETGBL R4 G8 + 0x88140108, // 0010 GETMBR R5 R0 K8 + 0x7C100200, // 0011 CALL R4 1 + 0x00120E04, // 0012 ADD R4 K7 R4 + 0x60140013, // 0013 GETGBL R5 G19 + 0x7C140000, // 0014 CALL R5 0 + 0x7C080600, // 0015 CALL R2 3 + 0x8C080506, // 0016 GETMET R2 R2 K6 + 0x58100009, // 0017 LDCONST R4 K9 + 0x7C080400, // 0018 CALL R2 2 + 0xB80E0200, // 0019 GETNGBL R3 K1 + 0x8C0C070A, // 001A GETMET R3 R3 K10 + 0x60140008, // 001B GETGBL R5 G8 + 0x5C180400, // 001C MOVE R6 R2 + 0x7C140200, // 001D CALL R5 1 + 0x00161605, // 001E ADD R5 K11 R5 + 0x7C0C0400, // 001F CALL R3 2 + 0x4C0C0000, // 0020 LDNIL R3 + 0x200C0403, // 0021 NE R3 R2 R3 + 0x780E000E, // 0022 JMPF R3 #0032 + 0x600C0009, // 0023 GETGBL R3 G9 + 0x6010000C, // 0024 GETGBL R4 G12 + 0x5C140400, // 0025 MOVE R5 R2 + 0x7C100200, // 0026 CALL R4 1 + 0x0410090C, // 0027 SUB R4 R4 K12 + 0x94100404, // 0028 GETIDX R4 R2 R4 + 0x7C0C0200, // 0029 CALL R3 1 + 0x90020003, // 002A SETMBR R0 K0 R3 + 0xB80E0200, // 002B GETNGBL R3 K1 + 0x8C0C070A, // 002C GETMET R3 R3 K10 + 0x60140008, // 002D GETGBL R5 G8 + 0x88180100, // 002E GETMBR R6 R0 K0 + 0x7C140200, // 002F CALL R5 1 + 0x00161A05, // 0030 ADD R5 K13 R5 + 0x7C0C0400, // 0031 CALL R3 2 + 0x80000000, // 0032 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: invoke_request +********************************************************************/ +be_local_closure(Matter_Plugin_Shutter_invoke_request, /* name */ + be_nested_proto( + 14, /* nstack */ + 4, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[24]) { /* constants */ + /* K0 */ be_nested_str_weak(light), + /* K1 */ be_nested_str_weak(matter), + /* K2 */ be_nested_str_weak(TLV), + /* K3 */ be_nested_str_weak(cluster), + /* K4 */ be_nested_str_weak(command), + /* K5 */ be_nested_str_weak(update_shadow_lazy), + /* K6 */ be_const_int(0), + /* K7 */ be_nested_str_weak(tasmota), + /* K8 */ be_nested_str_weak(cmd), + /* K9 */ be_nested_str_weak(ShutterStopOpen), + /* K10 */ be_nested_str_weak(tasmota_shutter_index), + /* K11 */ be_const_int(1), + /* K12 */ be_nested_str_weak(update_shadow), + /* K13 */ be_nested_str_weak(ShutterStopClose), + /* K14 */ be_const_int(2), + /* K15 */ be_nested_str_weak(ShutterStop), + /* K16 */ be_nested_str_weak(log), + /* K17 */ be_nested_str_weak(MTR_X3A_X20Tilt_X20_X3D_X20), + /* K18 */ be_nested_str_weak(findsubval), + /* K19 */ be_nested_str_weak(shadow_shutter_inverted), + /* K20 */ be_nested_str_weak(ShutterPosition), + /* K21 */ be_nested_str_weak(_X20), + /* K22 */ be_nested_str_weak(pos_X25_X3A), + /* K23 */ be_nested_str_weak(invoke_request), + }), + be_str_weak(invoke_request), + &be_const_str_solidified, + ( &(const binstruction[116]) { /* code */ + 0xA4120000, // 0000 IMPORT R4 K0 + 0xB8160200, // 0001 GETNGBL R5 K1 + 0x88140B02, // 0002 GETMBR R5 R5 K2 + 0x88180703, // 0003 GETMBR R6 R3 K3 + 0x881C0704, // 0004 GETMBR R7 R3 K4 + 0x54220101, // 0005 LDINT R8 258 + 0x1C200C08, // 0006 EQ R8 R6 R8 + 0x78220061, // 0007 JMPF R8 #006A + 0x8C200105, // 0008 GETMET R8 R0 K5 + 0x7C200200, // 0009 CALL R8 1 + 0x1C200F06, // 000A EQ R8 R7 K6 + 0x7822000D, // 000B JMPF R8 #001A + 0xB8220E00, // 000C GETNGBL R8 K7 + 0x8C201108, // 000D GETMET R8 R8 K8 + 0x60280008, // 000E GETGBL R10 G8 + 0x882C010A, // 000F GETMBR R11 R0 K10 + 0x002C170B, // 0010 ADD R11 R11 K11 + 0x7C280200, // 0011 CALL R10 1 + 0x002A120A, // 0012 ADD R10 K9 R10 + 0x502C0200, // 0013 LDBOOL R11 1 0 + 0x7C200600, // 0014 CALL R8 3 + 0x8C20010C, // 0015 GETMET R8 R0 K12 + 0x7C200200, // 0016 CALL R8 1 + 0x50200200, // 0017 LDBOOL R8 1 0 + 0x80041000, // 0018 RET 1 R8 + 0x7002004E, // 0019 JMP #0069 + 0x1C200F0B, // 001A EQ R8 R7 K11 + 0x7822000D, // 001B JMPF R8 #002A + 0xB8220E00, // 001C GETNGBL R8 K7 + 0x8C201108, // 001D GETMET R8 R8 K8 + 0x60280008, // 001E GETGBL R10 G8 + 0x882C010A, // 001F GETMBR R11 R0 K10 + 0x002C170B, // 0020 ADD R11 R11 K11 + 0x7C280200, // 0021 CALL R10 1 + 0x002A1A0A, // 0022 ADD R10 K13 R10 + 0x502C0200, // 0023 LDBOOL R11 1 0 + 0x7C200600, // 0024 CALL R8 3 + 0x8C20010C, // 0025 GETMET R8 R0 K12 + 0x7C200200, // 0026 CALL R8 1 + 0x50200200, // 0027 LDBOOL R8 1 0 + 0x80041000, // 0028 RET 1 R8 + 0x7002003E, // 0029 JMP #0069 + 0x1C200F0E, // 002A EQ R8 R7 K14 + 0x7822000D, // 002B JMPF R8 #003A + 0xB8220E00, // 002C GETNGBL R8 K7 + 0x8C201108, // 002D GETMET R8 R8 K8 + 0x60280008, // 002E GETGBL R10 G8 + 0x882C010A, // 002F GETMBR R11 R0 K10 + 0x002C170B, // 0030 ADD R11 R11 K11 + 0x7C280200, // 0031 CALL R10 1 + 0x002A1E0A, // 0032 ADD R10 K15 R10 + 0x502C0200, // 0033 LDBOOL R11 1 0 + 0x7C200600, // 0034 CALL R8 3 + 0x8C20010C, // 0035 GETMET R8 R0 K12 + 0x7C200200, // 0036 CALL R8 1 + 0x50200200, // 0037 LDBOOL R8 1 0 + 0x80041000, // 0038 RET 1 R8 + 0x7002002E, // 0039 JMP #0069 + 0x54220004, // 003A LDINT R8 5 + 0x1C200E08, // 003B EQ R8 R7 R8 + 0x7822002B, // 003C JMPF R8 #0069 + 0xB8220E00, // 003D GETNGBL R8 K7 + 0x8C201110, // 003E GETMET R8 R8 K16 + 0x60280008, // 003F GETGBL R10 G8 + 0x5C2C0400, // 0040 MOVE R11 R2 + 0x7C280200, // 0041 CALL R10 1 + 0x002A220A, // 0042 ADD R10 K17 R10 + 0x582C000E, // 0043 LDCONST R11 K14 + 0x7C200600, // 0044 CALL R8 3 + 0x8C200512, // 0045 GETMET R8 R2 K18 + 0x58280006, // 0046 LDCONST R10 K6 + 0x7C200400, // 0047 CALL R8 2 + 0x4C240000, // 0048 LDNIL R9 + 0x20241009, // 0049 NE R9 R8 R9 + 0x7826001B, // 004A JMPF R9 #0067 + 0x54260063, // 004B LDINT R9 100 + 0x0C201009, // 004C DIV R8 R8 R9 + 0x88240113, // 004D GETMBR R9 R0 K19 + 0x1C241306, // 004E EQ R9 R9 K6 + 0x78260001, // 004F JMPF R9 #0052 + 0x54260063, // 0050 LDINT R9 100 + 0x04201208, // 0051 SUB R8 R9 R8 + 0xB8260E00, // 0052 GETNGBL R9 K7 + 0x8C241308, // 0053 GETMET R9 R9 K8 + 0x602C0008, // 0054 GETGBL R11 G8 + 0x8830010A, // 0055 GETMBR R12 R0 K10 + 0x0030190B, // 0056 ADD R12 R12 K11 + 0x7C2C0200, // 0057 CALL R11 1 + 0x002E280B, // 0058 ADD R11 K20 R11 + 0x002C1715, // 0059 ADD R11 R11 K21 + 0x60300008, // 005A GETGBL R12 G8 + 0x5C341000, // 005B MOVE R13 R8 + 0x7C300200, // 005C CALL R12 1 + 0x002C160C, // 005D ADD R11 R11 R12 + 0x50300200, // 005E LDBOOL R12 1 0 + 0x7C240600, // 005F CALL R9 3 + 0x60240008, // 0060 GETGBL R9 G8 + 0x5C281000, // 0061 MOVE R10 R8 + 0x7C240200, // 0062 CALL R9 1 + 0x00262C09, // 0063 ADD R9 K22 R9 + 0x900E2009, // 0064 SETMBR R3 K16 R9 + 0x8C24010C, // 0065 GETMET R9 R0 K12 + 0x7C240200, // 0066 CALL R9 1 + 0x50240200, // 0067 LDBOOL R9 1 0 + 0x80041200, // 0068 RET 1 R9 + 0x70020008, // 0069 JMP #0073 + 0x60200003, // 006A GETGBL R8 G3 + 0x5C240000, // 006B MOVE R9 R0 + 0x7C200200, // 006C CALL R8 1 + 0x8C201117, // 006D GETMET R8 R8 K23 + 0x5C280200, // 006E MOVE R10 R1 + 0x5C2C0400, // 006F MOVE R11 R2 + 0x5C300600, // 0070 MOVE R12 R3 + 0x7C200800, // 0071 CALL R8 4 + 0x80041000, // 0072 RET 1 R8 + 0x80000000, // 0073 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: read_attribute +********************************************************************/ +be_local_closure(Matter_Plugin_Shutter_read_attribute, /* name */ + be_nested_proto( + 13, /* nstack */ + 3, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[19]) { /* constants */ + /* K0 */ be_nested_str_weak(string), + /* K1 */ be_nested_str_weak(matter), + /* K2 */ be_nested_str_weak(TLV), + /* K3 */ be_nested_str_weak(cluster), + /* K4 */ be_nested_str_weak(attribute), + /* K5 */ be_nested_str_weak(update_shadow_lazy), + /* K6 */ be_nested_str_weak(update_inverted), + /* K7 */ be_const_int(0), + /* K8 */ be_nested_str_weak(create_TLV), + /* K9 */ be_nested_str_weak(U1), + /* K10 */ be_nested_str_weak(U2), + /* K11 */ be_const_int(1), + /* K12 */ be_nested_str_weak(shadow_shutter_inverted), + /* K13 */ be_nested_str_weak(shadow_shutter_pos), + /* K14 */ be_nested_str_weak(shadow_shutter_direction), + /* K15 */ be_const_int(2), + /* K16 */ be_nested_str_weak(shadow_shutter_target), + /* K17 */ be_nested_str_weak(U4), + /* K18 */ be_nested_str_weak(read_attribute), + }), + be_str_weak(read_attribute), + &be_const_str_solidified, + ( &(const binstruction[152]) { /* code */ + 0xA40E0000, // 0000 IMPORT R3 K0 + 0xB8120200, // 0001 GETNGBL R4 K1 + 0x88100902, // 0002 GETMBR R4 R4 K2 + 0x88140503, // 0003 GETMBR R5 R2 K3 + 0x88180504, // 0004 GETMBR R6 R2 K4 + 0x4C1C0000, // 0005 LDNIL R7 + 0x54220101, // 0006 LDINT R8 258 + 0x1C200A08, // 0007 EQ R8 R5 R8 + 0x78220085, // 0008 JMPF R8 #008F + 0x8C200105, // 0009 GETMET R8 R0 K5 + 0x7C200200, // 000A CALL R8 1 + 0x8C200106, // 000B GETMET R8 R0 K6 + 0x7C200200, // 000C CALL R8 1 + 0x1C200D07, // 000D EQ R8 R6 K7 + 0x78220005, // 000E JMPF R8 #0015 + 0x8C200908, // 000F GETMET R8 R4 K8 + 0x88280909, // 0010 GETMBR R10 R4 K9 + 0x542E00FE, // 0011 LDINT R11 255 + 0x7C200600, // 0012 CALL R8 3 + 0x80041000, // 0013 RET 1 R8 + 0x70020078, // 0014 JMP #008E + 0x54220004, // 0015 LDINT R8 5 + 0x1C200C08, // 0016 EQ R8 R6 R8 + 0x78220005, // 0017 JMPF R8 #001E + 0x8C200908, // 0018 GETMET R8 R4 K8 + 0x8828090A, // 0019 GETMBR R10 R4 K10 + 0x582C0007, // 001A LDCONST R11 K7 + 0x7C200600, // 001B CALL R8 3 + 0x80041000, // 001C RET 1 R8 + 0x7002006F, // 001D JMP #008E + 0x54220006, // 001E LDINT R8 7 + 0x1C200C08, // 001F EQ R8 R6 R8 + 0x78220006, // 0020 JMPF R8 #0028 + 0x8C200908, // 0021 GETMET R8 R4 K8 + 0x88280909, // 0022 GETMBR R10 R4 K9 + 0x542E0007, // 0023 LDINT R11 8 + 0x002E160B, // 0024 ADD R11 K11 R11 + 0x7C200600, // 0025 CALL R8 3 + 0x80041000, // 0026 RET 1 R8 + 0x70020065, // 0027 JMP #008E + 0x5422000C, // 0028 LDINT R8 13 + 0x1C200C08, // 0029 EQ R8 R6 R8 + 0x78220005, // 002A JMPF R8 #0031 + 0x8C200908, // 002B GETMET R8 R4 K8 + 0x88280909, // 002C GETMBR R10 R4 K9 + 0x542E00FE, // 002D LDINT R11 255 + 0x7C200600, // 002E CALL R8 3 + 0x80041000, // 002F RET 1 R8 + 0x7002005C, // 0030 JMP #008E + 0x5422000D, // 0031 LDINT R8 14 + 0x1C200C08, // 0032 EQ R8 R6 R8 + 0x78220013, // 0033 JMPF R8 #0048 + 0x8820010C, // 0034 GETMBR R8 R0 K12 + 0x1C201107, // 0035 EQ R8 R8 K7 + 0x78220006, // 0036 JMPF R8 #003E + 0x54220063, // 0037 LDINT R8 100 + 0x8824010D, // 0038 GETMBR R9 R0 K13 + 0x04201009, // 0039 SUB R8 R8 R9 + 0x54260063, // 003A LDINT R9 100 + 0x08201009, // 003B MUL R8 R8 R9 + 0x5C1C1000, // 003C MOVE R7 R8 + 0x70020003, // 003D JMP #0042 + 0x8820010D, // 003E GETMBR R8 R0 K13 + 0x54260063, // 003F LDINT R9 100 + 0x08201009, // 0040 MUL R8 R8 R9 + 0x5C1C1000, // 0041 MOVE R7 R8 + 0x8C200908, // 0042 GETMET R8 R4 K8 + 0x8828090A, // 0043 GETMBR R10 R4 K10 + 0x5C2C0E00, // 0044 MOVE R11 R7 + 0x7C200600, // 0045 CALL R8 3 + 0x80041000, // 0046 RET 1 R8 + 0x70020045, // 0047 JMP #008E + 0x54220009, // 0048 LDINT R8 10 + 0x1C200C08, // 0049 EQ R8 R6 R8 + 0x78220010, // 004A JMPF R8 #005C + 0x8820010E, // 004B GETMBR R8 R0 K14 + 0x1C201107, // 004C EQ R8 R8 K7 + 0x78220001, // 004D JMPF R8 #0050 + 0x58200007, // 004E LDCONST R8 K7 + 0x70020005, // 004F JMP #0056 + 0x8820010E, // 0050 GETMBR R8 R0 K14 + 0x24201107, // 0051 GT R8 R8 K7 + 0x78220001, // 0052 JMPF R8 #0055 + 0x5820000B, // 0053 LDCONST R8 K11 + 0x70020000, // 0054 JMP #0056 + 0x5820000F, // 0055 LDCONST R8 K15 + 0x8C240908, // 0056 GETMET R9 R4 K8 + 0x882C0909, // 0057 GETMBR R11 R4 K9 + 0x5C301000, // 0058 MOVE R12 R8 + 0x7C240600, // 0059 CALL R9 3 + 0x80041200, // 005A RET 1 R9 + 0x70020031, // 005B JMP #008E + 0x5422000A, // 005C LDINT R8 11 + 0x1C200C08, // 005D EQ R8 R6 R8 + 0x78220013, // 005E JMPF R8 #0073 + 0x8820010C, // 005F GETMBR R8 R0 K12 + 0x1C201107, // 0060 EQ R8 R8 K7 + 0x78220006, // 0061 JMPF R8 #0069 + 0x54220063, // 0062 LDINT R8 100 + 0x88240110, // 0063 GETMBR R9 R0 K16 + 0x04201009, // 0064 SUB R8 R8 R9 + 0x54260063, // 0065 LDINT R9 100 + 0x08201009, // 0066 MUL R8 R8 R9 + 0x5C1C1000, // 0067 MOVE R7 R8 + 0x70020003, // 0068 JMP #006D + 0x88200110, // 0069 GETMBR R8 R0 K16 + 0x54260063, // 006A LDINT R9 100 + 0x08201009, // 006B MUL R8 R8 R9 + 0x5C1C1000, // 006C MOVE R7 R8 + 0x8C200908, // 006D GETMET R8 R4 K8 + 0x8828090A, // 006E GETMBR R10 R4 K10 + 0x5C2C0E00, // 006F MOVE R11 R7 + 0x7C200600, // 0070 CALL R8 3 + 0x80041000, // 0071 RET 1 R8 + 0x7002001A, // 0072 JMP #008E + 0x54220016, // 0073 LDINT R8 23 + 0x1C200C08, // 0074 EQ R8 R6 R8 + 0x78220005, // 0075 JMPF R8 #007C + 0x8C200908, // 0076 GETMET R8 R4 K8 + 0x88280909, // 0077 GETMBR R10 R4 K9 + 0x582C0007, // 0078 LDCONST R11 K7 + 0x7C200600, // 0079 CALL R8 3 + 0x80041000, // 007A RET 1 R8 + 0x70020011, // 007B JMP #008E + 0x5422FFFB, // 007C LDINT R8 65532 + 0x1C200C08, // 007D EQ R8 R6 R8 + 0x78220006, // 007E JMPF R8 #0086 + 0x8C200908, // 007F GETMET R8 R4 K8 + 0x88280911, // 0080 GETMBR R10 R4 K17 + 0x542E0003, // 0081 LDINT R11 4 + 0x002E160B, // 0082 ADD R11 K11 R11 + 0x7C200600, // 0083 CALL R8 3 + 0x80041000, // 0084 RET 1 R8 + 0x70020007, // 0085 JMP #008E + 0x5422FFFC, // 0086 LDINT R8 65533 + 0x1C200C08, // 0087 EQ R8 R6 R8 + 0x78220004, // 0088 JMPF R8 #008E + 0x8C200908, // 0089 GETMET R8 R4 K8 + 0x88280911, // 008A GETMBR R10 R4 K17 + 0x542E0004, // 008B LDINT R11 5 + 0x7C200600, // 008C CALL R8 3 + 0x80041000, // 008D RET 1 R8 + 0x70020007, // 008E JMP #0097 + 0x60200003, // 008F GETGBL R8 G3 + 0x5C240000, // 0090 MOVE R9 R0 + 0x7C200200, // 0091 CALL R8 1 + 0x8C201112, // 0092 GETMET R8 R8 K18 + 0x5C280200, // 0093 MOVE R10 R1 + 0x5C2C0400, // 0094 MOVE R11 R2 + 0x7C200600, // 0095 CALL R8 3 + 0x80041000, // 0096 RET 1 R8 + 0x80000000, // 0097 RET 0 + }) + ) +); +/*******************************************************************/ + + /******************************************************************** ** Solidified function: ********************************************************************/ @@ -33,432 +481,6 @@ be_local_closure(Matter_Plugin_Shutter__X3Clambda_X3E, /* name */ /*******************************************************************/ -/******************************************************************** -** Solidified function: read_attribute -********************************************************************/ -be_local_closure(Matter_Plugin_Shutter_read_attribute, /* name */ - be_nested_proto( - 12, /* nstack */ - 3, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[17]) { /* constants */ - /* K0 */ be_nested_str_weak(string), - /* K1 */ be_nested_str_weak(matter), - /* K2 */ be_nested_str_weak(TLV), - /* K3 */ be_nested_str_weak(cluster), - /* K4 */ be_nested_str_weak(attribute), - /* K5 */ be_nested_str_weak(update_shadow_lazy), - /* K6 */ be_const_int(0), - /* K7 */ be_nested_str_weak(create_TLV), - /* K8 */ be_nested_str_weak(U1), - /* K9 */ be_nested_str_weak(U2), - /* K10 */ be_const_int(1), - /* K11 */ be_nested_str_weak(shadow_shutter_pos), - /* K12 */ be_nested_str_weak(shadow_shutter_direction), - /* K13 */ be_const_int(2), - /* K14 */ be_nested_str_weak(shadow_shutter_target), - /* K15 */ be_nested_str_weak(U4), - /* K16 */ be_nested_str_weak(read_attribute), - }), - be_str_weak(read_attribute), - &be_const_str_solidified, - ( &(const binstruction[129]) { /* code */ - 0xA40E0000, // 0000 IMPORT R3 K0 - 0xB8120200, // 0001 GETNGBL R4 K1 - 0x88100902, // 0002 GETMBR R4 R4 K2 - 0x88140503, // 0003 GETMBR R5 R2 K3 - 0x88180504, // 0004 GETMBR R6 R2 K4 - 0x541E0101, // 0005 LDINT R7 258 - 0x1C1C0A07, // 0006 EQ R7 R5 R7 - 0x781E006F, // 0007 JMPF R7 #0078 - 0x8C1C0105, // 0008 GETMET R7 R0 K5 - 0x7C1C0200, // 0009 CALL R7 1 - 0x1C1C0D06, // 000A EQ R7 R6 K6 - 0x781E0005, // 000B JMPF R7 #0012 - 0x8C1C0907, // 000C GETMET R7 R4 K7 - 0x88240908, // 000D GETMBR R9 R4 K8 - 0x542A00FE, // 000E LDINT R10 255 - 0x7C1C0600, // 000F CALL R7 3 - 0x80040E00, // 0010 RET 1 R7 - 0x70020064, // 0011 JMP #0077 - 0x541E0004, // 0012 LDINT R7 5 - 0x1C1C0C07, // 0013 EQ R7 R6 R7 - 0x781E0005, // 0014 JMPF R7 #001B - 0x8C1C0907, // 0015 GETMET R7 R4 K7 - 0x88240909, // 0016 GETMBR R9 R4 K9 - 0x58280006, // 0017 LDCONST R10 K6 - 0x7C1C0600, // 0018 CALL R7 3 - 0x80040E00, // 0019 RET 1 R7 - 0x7002005B, // 001A JMP #0077 - 0x541E0006, // 001B LDINT R7 7 - 0x1C1C0C07, // 001C EQ R7 R6 R7 - 0x781E0006, // 001D JMPF R7 #0025 - 0x8C1C0907, // 001E GETMET R7 R4 K7 - 0x88240908, // 001F GETMBR R9 R4 K8 - 0x542A0007, // 0020 LDINT R10 8 - 0x002A140A, // 0021 ADD R10 K10 R10 - 0x7C1C0600, // 0022 CALL R7 3 - 0x80040E00, // 0023 RET 1 R7 - 0x70020051, // 0024 JMP #0077 - 0x541E000C, // 0025 LDINT R7 13 - 0x1C1C0C07, // 0026 EQ R7 R6 R7 - 0x781E0005, // 0027 JMPF R7 #002E - 0x8C1C0907, // 0028 GETMET R7 R4 K7 - 0x88240908, // 0029 GETMBR R9 R4 K8 - 0x542A00FE, // 002A LDINT R10 255 - 0x7C1C0600, // 002B CALL R7 3 - 0x80040E00, // 002C RET 1 R7 - 0x70020048, // 002D JMP #0077 - 0x541E000D, // 002E LDINT R7 14 - 0x1C1C0C07, // 002F EQ R7 R6 R7 - 0x781E0009, // 0030 JMPF R7 #003B - 0x8C1C0907, // 0031 GETMET R7 R4 K7 - 0x88240909, // 0032 GETMBR R9 R4 K9 - 0x542A0063, // 0033 LDINT R10 100 - 0x882C010B, // 0034 GETMBR R11 R0 K11 - 0x0428140B, // 0035 SUB R10 R10 R11 - 0x542E0063, // 0036 LDINT R11 100 - 0x0828140B, // 0037 MUL R10 R10 R11 - 0x7C1C0600, // 0038 CALL R7 3 - 0x80040E00, // 0039 RET 1 R7 - 0x7002003B, // 003A JMP #0077 - 0x541E0009, // 003B LDINT R7 10 - 0x1C1C0C07, // 003C EQ R7 R6 R7 - 0x781E0010, // 003D JMPF R7 #004F - 0x881C010C, // 003E GETMBR R7 R0 K12 - 0x1C1C0F06, // 003F EQ R7 R7 K6 - 0x781E0001, // 0040 JMPF R7 #0043 - 0x581C0006, // 0041 LDCONST R7 K6 - 0x70020005, // 0042 JMP #0049 - 0x881C010C, // 0043 GETMBR R7 R0 K12 - 0x241C0F06, // 0044 GT R7 R7 K6 - 0x781E0001, // 0045 JMPF R7 #0048 - 0x581C000A, // 0046 LDCONST R7 K10 - 0x70020000, // 0047 JMP #0049 - 0x581C000D, // 0048 LDCONST R7 K13 - 0x8C200907, // 0049 GETMET R8 R4 K7 - 0x88280908, // 004A GETMBR R10 R4 K8 - 0x5C2C0E00, // 004B MOVE R11 R7 - 0x7C200600, // 004C CALL R8 3 - 0x80041000, // 004D RET 1 R8 - 0x70020027, // 004E JMP #0077 - 0x541E000A, // 004F LDINT R7 11 - 0x1C1C0C07, // 0050 EQ R7 R6 R7 - 0x781E0009, // 0051 JMPF R7 #005C - 0x8C1C0907, // 0052 GETMET R7 R4 K7 - 0x88240909, // 0053 GETMBR R9 R4 K9 - 0x542A0063, // 0054 LDINT R10 100 - 0x882C010E, // 0055 GETMBR R11 R0 K14 - 0x0428140B, // 0056 SUB R10 R10 R11 - 0x542E0063, // 0057 LDINT R11 100 - 0x0828140B, // 0058 MUL R10 R10 R11 - 0x7C1C0600, // 0059 CALL R7 3 - 0x80040E00, // 005A RET 1 R7 - 0x7002001A, // 005B JMP #0077 - 0x541E0016, // 005C LDINT R7 23 - 0x1C1C0C07, // 005D EQ R7 R6 R7 - 0x781E0005, // 005E JMPF R7 #0065 - 0x8C1C0907, // 005F GETMET R7 R4 K7 - 0x88240908, // 0060 GETMBR R9 R4 K8 - 0x58280006, // 0061 LDCONST R10 K6 - 0x7C1C0600, // 0062 CALL R7 3 - 0x80040E00, // 0063 RET 1 R7 - 0x70020011, // 0064 JMP #0077 - 0x541EFFFB, // 0065 LDINT R7 65532 - 0x1C1C0C07, // 0066 EQ R7 R6 R7 - 0x781E0006, // 0067 JMPF R7 #006F - 0x8C1C0907, // 0068 GETMET R7 R4 K7 - 0x8824090F, // 0069 GETMBR R9 R4 K15 - 0x542A0003, // 006A LDINT R10 4 - 0x002A140A, // 006B ADD R10 K10 R10 - 0x7C1C0600, // 006C CALL R7 3 - 0x80040E00, // 006D RET 1 R7 - 0x70020007, // 006E JMP #0077 - 0x541EFFFC, // 006F LDINT R7 65533 - 0x1C1C0C07, // 0070 EQ R7 R6 R7 - 0x781E0004, // 0071 JMPF R7 #0077 - 0x8C1C0907, // 0072 GETMET R7 R4 K7 - 0x8824090F, // 0073 GETMBR R9 R4 K15 - 0x542A0004, // 0074 LDINT R10 5 - 0x7C1C0600, // 0075 CALL R7 3 - 0x80040E00, // 0076 RET 1 R7 - 0x70020007, // 0077 JMP #0080 - 0x601C0003, // 0078 GETGBL R7 G3 - 0x5C200000, // 0079 MOVE R8 R0 - 0x7C1C0200, // 007A CALL R7 1 - 0x8C1C0F10, // 007B GETMET R7 R7 K16 - 0x5C240200, // 007C MOVE R9 R1 - 0x5C280400, // 007D MOVE R10 R2 - 0x7C1C0600, // 007E CALL R7 3 - 0x80040E00, // 007F RET 1 R7 - 0x80000000, // 0080 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: init -********************************************************************/ -be_local_closure(Matter_Plugin_Shutter_init, /* name */ - be_nested_proto( - 9, /* nstack */ - 4, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 5]) { /* constants */ - /* K0 */ be_nested_str_weak(init), - /* K1 */ be_nested_str_weak(tasmota_shutter_index), - /* K2 */ be_nested_str_weak(find), - /* K3 */ be_nested_str_weak(ARG), - /* K4 */ be_const_int(0), - }), - be_str_weak(init), - &be_const_str_solidified, - ( &(const binstruction[18]) { /* code */ - 0x60100003, // 0000 GETGBL R4 G3 - 0x5C140000, // 0001 MOVE R5 R0 - 0x7C100200, // 0002 CALL R4 1 - 0x8C100900, // 0003 GETMET R4 R4 K0 - 0x5C180200, // 0004 MOVE R6 R1 - 0x5C1C0400, // 0005 MOVE R7 R2 - 0x5C200600, // 0006 MOVE R8 R3 - 0x7C100800, // 0007 CALL R4 4 - 0x8C100702, // 0008 GETMET R4 R3 K2 - 0x88180103, // 0009 GETMBR R6 R0 K3 - 0x7C100400, // 000A CALL R4 2 - 0x90020204, // 000B SETMBR R0 K1 R4 - 0x88100101, // 000C GETMBR R4 R0 K1 - 0x4C140000, // 000D LDNIL R5 - 0x1C100805, // 000E EQ R4 R4 R5 - 0x78120000, // 000F JMPF R4 #0011 - 0x90020304, // 0010 SETMBR R0 K1 K4 - 0x80000000, // 0011 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: update_shadow -********************************************************************/ -be_local_closure(Matter_Plugin_Shutter_update_shadow, /* name */ - be_nested_proto( - 5, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 7]) { /* constants */ - /* K0 */ be_nested_str_weak(tasmota), - /* K1 */ be_nested_str_weak(cmd), - /* K2 */ be_nested_str_weak(ShutterPosition), - /* K3 */ be_nested_str_weak(tasmota_shutter_index), - /* K4 */ be_const_int(1), - /* K5 */ be_nested_str_weak(parse_sensors), - /* K6 */ be_nested_str_weak(update_shadow), - }), - be_str_weak(update_shadow), - &be_const_str_solidified, - ( &(const binstruction[19]) { /* code */ - 0xB8060000, // 0000 GETNGBL R1 K0 - 0x8C040301, // 0001 GETMET R1 R1 K1 - 0x600C0008, // 0002 GETGBL R3 G8 - 0x88100103, // 0003 GETMBR R4 R0 K3 - 0x00100904, // 0004 ADD R4 R4 K4 - 0x7C0C0200, // 0005 CALL R3 1 - 0x000E0403, // 0006 ADD R3 K2 R3 - 0x50100200, // 0007 LDBOOL R4 1 0 - 0x7C040600, // 0008 CALL R1 3 - 0x78060002, // 0009 JMPF R1 #000D - 0x8C080105, // 000A GETMET R2 R0 K5 - 0x5C100200, // 000B MOVE R4 R1 - 0x7C080400, // 000C CALL R2 2 - 0x60080003, // 000D GETGBL R2 G3 - 0x5C0C0000, // 000E MOVE R3 R0 - 0x7C080200, // 000F CALL R2 1 - 0x8C080506, // 0010 GETMET R2 R2 K6 - 0x7C080200, // 0011 CALL R2 1 - 0x80000000, // 0012 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: invoke_request -********************************************************************/ -be_local_closure(Matter_Plugin_Shutter_invoke_request, /* name */ - be_nested_proto( - 14, /* nstack */ - 4, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[23]) { /* constants */ - /* K0 */ be_nested_str_weak(light), - /* K1 */ be_nested_str_weak(matter), - /* K2 */ be_nested_str_weak(TLV), - /* K3 */ be_nested_str_weak(cluster), - /* K4 */ be_nested_str_weak(command), - /* K5 */ be_nested_str_weak(update_shadow_lazy), - /* K6 */ be_const_int(0), - /* K7 */ be_nested_str_weak(tasmota), - /* K8 */ be_nested_str_weak(cmd), - /* K9 */ be_nested_str_weak(ShutterStopOpen), - /* K10 */ be_nested_str_weak(tasmota_shutter_index), - /* K11 */ be_const_int(1), - /* K12 */ be_nested_str_weak(update_shadow), - /* K13 */ be_nested_str_weak(ShutterStopClose), - /* K14 */ be_const_int(2), - /* K15 */ be_nested_str_weak(ShutterStop), - /* K16 */ be_nested_str_weak(log), - /* K17 */ be_nested_str_weak(MTR_X3A_X20Tilt_X20_X3D_X20), - /* K18 */ be_nested_str_weak(findsubval), - /* K19 */ be_nested_str_weak(ShutterStopPosition), - /* K20 */ be_nested_str_weak(_X20), - /* K21 */ be_nested_str_weak(pos_X25_X3A), - /* K22 */ be_nested_str_weak(invoke_request), - }), - be_str_weak(invoke_request), - &be_const_str_solidified, - ( &(const binstruction[112]) { /* code */ - 0xA4120000, // 0000 IMPORT R4 K0 - 0xB8160200, // 0001 GETNGBL R5 K1 - 0x88140B02, // 0002 GETMBR R5 R5 K2 - 0x88180703, // 0003 GETMBR R6 R3 K3 - 0x881C0704, // 0004 GETMBR R7 R3 K4 - 0x54220101, // 0005 LDINT R8 258 - 0x1C200C08, // 0006 EQ R8 R6 R8 - 0x7822005D, // 0007 JMPF R8 #0066 - 0x8C200105, // 0008 GETMET R8 R0 K5 - 0x7C200200, // 0009 CALL R8 1 - 0x1C200F06, // 000A EQ R8 R7 K6 - 0x7822000D, // 000B JMPF R8 #001A - 0xB8220E00, // 000C GETNGBL R8 K7 - 0x8C201108, // 000D GETMET R8 R8 K8 - 0x60280008, // 000E GETGBL R10 G8 - 0x882C010A, // 000F GETMBR R11 R0 K10 - 0x002C170B, // 0010 ADD R11 R11 K11 - 0x7C280200, // 0011 CALL R10 1 - 0x002A120A, // 0012 ADD R10 K9 R10 - 0x502C0200, // 0013 LDBOOL R11 1 0 - 0x7C200600, // 0014 CALL R8 3 - 0x8C20010C, // 0015 GETMET R8 R0 K12 - 0x7C200200, // 0016 CALL R8 1 - 0x50200200, // 0017 LDBOOL R8 1 0 - 0x80041000, // 0018 RET 1 R8 - 0x7002004A, // 0019 JMP #0065 - 0x1C200F0B, // 001A EQ R8 R7 K11 - 0x7822000D, // 001B JMPF R8 #002A - 0xB8220E00, // 001C GETNGBL R8 K7 - 0x8C201108, // 001D GETMET R8 R8 K8 - 0x60280008, // 001E GETGBL R10 G8 - 0x882C010A, // 001F GETMBR R11 R0 K10 - 0x002C170B, // 0020 ADD R11 R11 K11 - 0x7C280200, // 0021 CALL R10 1 - 0x002A1A0A, // 0022 ADD R10 K13 R10 - 0x502C0200, // 0023 LDBOOL R11 1 0 - 0x7C200600, // 0024 CALL R8 3 - 0x8C20010C, // 0025 GETMET R8 R0 K12 - 0x7C200200, // 0026 CALL R8 1 - 0x50200200, // 0027 LDBOOL R8 1 0 - 0x80041000, // 0028 RET 1 R8 - 0x7002003A, // 0029 JMP #0065 - 0x1C200F0E, // 002A EQ R8 R7 K14 - 0x7822000D, // 002B JMPF R8 #003A - 0xB8220E00, // 002C GETNGBL R8 K7 - 0x8C201108, // 002D GETMET R8 R8 K8 - 0x60280008, // 002E GETGBL R10 G8 - 0x882C010A, // 002F GETMBR R11 R0 K10 - 0x002C170B, // 0030 ADD R11 R11 K11 - 0x7C280200, // 0031 CALL R10 1 - 0x002A1E0A, // 0032 ADD R10 K15 R10 - 0x502C0200, // 0033 LDBOOL R11 1 0 - 0x7C200600, // 0034 CALL R8 3 - 0x8C20010C, // 0035 GETMET R8 R0 K12 - 0x7C200200, // 0036 CALL R8 1 - 0x50200200, // 0037 LDBOOL R8 1 0 - 0x80041000, // 0038 RET 1 R8 - 0x7002002A, // 0039 JMP #0065 - 0x54220004, // 003A LDINT R8 5 - 0x1C200E08, // 003B EQ R8 R7 R8 - 0x78220027, // 003C JMPF R8 #0065 - 0xB8220E00, // 003D GETNGBL R8 K7 - 0x8C201110, // 003E GETMET R8 R8 K16 - 0x60280008, // 003F GETGBL R10 G8 - 0x5C2C0400, // 0040 MOVE R11 R2 - 0x7C280200, // 0041 CALL R10 1 - 0x002A220A, // 0042 ADD R10 K17 R10 - 0x582C000E, // 0043 LDCONST R11 K14 - 0x7C200600, // 0044 CALL R8 3 - 0x8C200512, // 0045 GETMET R8 R2 K18 - 0x58280006, // 0046 LDCONST R10 K6 - 0x7C200400, // 0047 CALL R8 2 - 0x4C240000, // 0048 LDNIL R9 - 0x20241009, // 0049 NE R9 R8 R9 - 0x78260017, // 004A JMPF R9 #0063 - 0x54260063, // 004B LDINT R9 100 - 0x0C201009, // 004C DIV R8 R8 R9 - 0xB8260E00, // 004D GETNGBL R9 K7 - 0x8C241308, // 004E GETMET R9 R9 K8 - 0x602C0008, // 004F GETGBL R11 G8 - 0x8830010A, // 0050 GETMBR R12 R0 K10 - 0x0030190B, // 0051 ADD R12 R12 K11 - 0x7C2C0200, // 0052 CALL R11 1 - 0x002E260B, // 0053 ADD R11 K19 R11 - 0x002C1714, // 0054 ADD R11 R11 K20 - 0x60300008, // 0055 GETGBL R12 G8 - 0x54360063, // 0056 LDINT R13 100 - 0x04341A08, // 0057 SUB R13 R13 R8 - 0x7C300200, // 0058 CALL R12 1 - 0x002C160C, // 0059 ADD R11 R11 R12 - 0x50300200, // 005A LDBOOL R12 1 0 - 0x7C240600, // 005B CALL R9 3 - 0x60240008, // 005C GETGBL R9 G8 - 0x5C281000, // 005D MOVE R10 R8 - 0x7C240200, // 005E CALL R9 1 - 0x00262A09, // 005F ADD R9 K21 R9 - 0x900E2009, // 0060 SETMBR R3 K16 R9 - 0x8C24010C, // 0061 GETMET R9 R0 K12 - 0x7C240200, // 0062 CALL R9 1 - 0x50240200, // 0063 LDBOOL R9 1 0 - 0x80041200, // 0064 RET 1 R9 - 0x70020008, // 0065 JMP #006F - 0x60200003, // 0066 GETGBL R8 G3 - 0x5C240000, // 0067 MOVE R9 R0 - 0x7C200200, // 0068 CALL R8 1 - 0x8C201116, // 0069 GETMET R8 R8 K22 - 0x5C280200, // 006A MOVE R10 R1 - 0x5C2C0400, // 006B MOVE R11 R2 - 0x5C300600, // 006C MOVE R12 R3 - 0x7C200800, // 006D CALL R8 4 - 0x80041000, // 006E RET 1 R8 - 0x80000000, // 006F RET 0 - }) - ) -); -/*******************************************************************/ - - /******************************************************************** ** Solidified function: parse_sensors ********************************************************************/ @@ -550,18 +572,127 @@ be_local_closure(Matter_Plugin_Shutter_parse_sensors, /* name */ /*******************************************************************/ +/******************************************************************** +** Solidified function: init +********************************************************************/ +be_local_closure(Matter_Plugin_Shutter_init, /* name */ + be_nested_proto( + 9, /* nstack */ + 4, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 6]) { /* constants */ + /* K0 */ be_nested_str_weak(init), + /* K1 */ be_nested_str_weak(tasmota_shutter_index), + /* K2 */ be_nested_str_weak(find), + /* K3 */ be_nested_str_weak(ARG), + /* K4 */ be_const_int(0), + /* K5 */ be_nested_str_weak(shadow_shutter_inverted), + }), + be_str_weak(init), + &be_const_str_solidified, + ( &(const binstruction[20]) { /* code */ + 0x60100003, // 0000 GETGBL R4 G3 + 0x5C140000, // 0001 MOVE R5 R0 + 0x7C100200, // 0002 CALL R4 1 + 0x8C100900, // 0003 GETMET R4 R4 K0 + 0x5C180200, // 0004 MOVE R6 R1 + 0x5C1C0400, // 0005 MOVE R7 R2 + 0x5C200600, // 0006 MOVE R8 R3 + 0x7C100800, // 0007 CALL R4 4 + 0x8C100702, // 0008 GETMET R4 R3 K2 + 0x88180103, // 0009 GETMBR R6 R0 K3 + 0x7C100400, // 000A CALL R4 2 + 0x90020204, // 000B SETMBR R0 K1 R4 + 0x88100101, // 000C GETMBR R4 R0 K1 + 0x4C140000, // 000D LDNIL R5 + 0x1C100805, // 000E EQ R4 R4 R5 + 0x78120000, // 000F JMPF R4 #0011 + 0x90020304, // 0010 SETMBR R0 K1 K4 + 0x5411FFFE, // 0011 LDINT R4 -1 + 0x90020A04, // 0012 SETMBR R0 K5 R4 + 0x80000000, // 0013 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: update_shadow +********************************************************************/ +be_local_closure(Matter_Plugin_Shutter_update_shadow, /* name */ + be_nested_proto( + 5, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 8]) { /* constants */ + /* K0 */ be_nested_str_weak(update_inverted), + /* K1 */ be_nested_str_weak(tasmota), + /* K2 */ be_nested_str_weak(cmd), + /* K3 */ be_nested_str_weak(ShutterPosition), + /* K4 */ be_nested_str_weak(tasmota_shutter_index), + /* K5 */ be_const_int(1), + /* K6 */ be_nested_str_weak(parse_sensors), + /* K7 */ be_nested_str_weak(update_shadow), + }), + be_str_weak(update_shadow), + &be_const_str_solidified, + ( &(const binstruction[21]) { /* code */ + 0x8C040100, // 0000 GETMET R1 R0 K0 + 0x7C040200, // 0001 CALL R1 1 + 0xB8060200, // 0002 GETNGBL R1 K1 + 0x8C040302, // 0003 GETMET R1 R1 K2 + 0x600C0008, // 0004 GETGBL R3 G8 + 0x88100104, // 0005 GETMBR R4 R0 K4 + 0x00100905, // 0006 ADD R4 R4 K5 + 0x7C0C0200, // 0007 CALL R3 1 + 0x000E0603, // 0008 ADD R3 K3 R3 + 0x50100200, // 0009 LDBOOL R4 1 0 + 0x7C040600, // 000A CALL R1 3 + 0x78060002, // 000B JMPF R1 #000F + 0x8C080106, // 000C GETMET R2 R0 K6 + 0x5C100200, // 000D MOVE R4 R1 + 0x7C080400, // 000E CALL R2 2 + 0x60080003, // 000F GETGBL R2 G3 + 0x5C0C0000, // 0010 MOVE R3 R0 + 0x7C080200, // 0011 CALL R2 1 + 0x8C080507, // 0012 GETMET R2 R2 K7 + 0x7C080200, // 0013 CALL R2 1 + 0x80000000, // 0014 RET 0 + }) + ) +); +/*******************************************************************/ + + /******************************************************************** ** Solidified class: Matter_Plugin_Shutter ********************************************************************/ extern const bclass be_class_Matter_Plugin_Device; be_local_class(Matter_Plugin_Shutter, - 5, + 6, &be_class_Matter_Plugin_Device, - be_nested_map(16, + be_nested_map(18, ( (struct bmapnode*) &(const bmapnode[]) { - { be_const_key_weak(ARG_TYPE, -1), be_const_static_closure(Matter_Plugin_Shutter__X3Clambda_X3E_closure) }, - { be_const_key_weak(shadow_shutter_pos, -1), be_const_var(1) }, - { be_const_key_weak(CLUSTERS, 14), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { + { be_const_key_weak(shadow_shutter_direction, -1), be_const_var(4) }, + { be_const_key_weak(TYPE, -1), be_nested_str_weak(shutter) }, + { be_const_key_weak(TYPES, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { + be_const_map( * be_nested_map(1, + ( (struct bmapnode*) &(const bmapnode[]) { + { be_const_key_int(514, -1), be_const_int(2) }, + })) ) } )) }, + { be_const_key_weak(update_shadow, -1), be_const_closure(Matter_Plugin_Shutter_update_shadow_closure) }, + { be_const_key_weak(CLUSTERS, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { be_const_map( * be_nested_map(1, ( (struct bmapnode*) &(const bmapnode[]) { { be_const_key_int(258, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_list, { @@ -579,23 +710,19 @@ be_local_class(Matter_Plugin_Shutter, be_const_int(65533), })) ) } )) }, })) ) } )) }, - { be_const_key_weak(init, -1), be_const_closure(Matter_Plugin_Shutter_init_closure) }, - { be_const_key_weak(shadow_shutter_direction, -1), be_const_var(4) }, - { be_const_key_weak(shadow_shutter_target, 15), be_const_var(2) }, - { be_const_key_weak(NAME, 1), be_nested_str_weak(Shutter) }, + { be_const_key_weak(invoke_request, 14), be_const_closure(Matter_Plugin_Shutter_invoke_request_closure) }, + { be_const_key_weak(read_attribute, 13), be_const_closure(Matter_Plugin_Shutter_read_attribute_closure) }, + { be_const_key_weak(shadow_shutter_inverted, 3), be_const_var(5) }, + { be_const_key_weak(shadow_shutter_pos, -1), be_const_var(1) }, { be_const_key_weak(ARG, -1), be_nested_str_weak(shutter) }, - { be_const_key_weak(invoke_request, -1), be_const_closure(Matter_Plugin_Shutter_invoke_request_closure) }, - { be_const_key_weak(tasmota_shutter_index, -1), be_const_var(0) }, - { be_const_key_weak(read_attribute, 2), be_const_closure(Matter_Plugin_Shutter_read_attribute_closure) }, - { be_const_key_weak(shadow_shutter_tilt, 8), be_const_var(3) }, + { be_const_key_weak(ARG_TYPE, -1), be_const_static_closure(Matter_Plugin_Shutter__X3Clambda_X3E_closure) }, + { be_const_key_weak(init, -1), be_const_closure(Matter_Plugin_Shutter_init_closure) }, + { be_const_key_weak(update_inverted, 16), be_const_closure(Matter_Plugin_Shutter_update_inverted_closure) }, { be_const_key_weak(parse_sensors, -1), be_const_closure(Matter_Plugin_Shutter_parse_sensors_closure) }, - { be_const_key_weak(TYPE, 4), be_nested_str_weak(shutter) }, - { be_const_key_weak(TYPES, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { - be_const_map( * be_nested_map(1, - ( (struct bmapnode*) &(const bmapnode[]) { - { be_const_key_int(514, -1), be_const_int(2) }, - })) ) } )) }, - { be_const_key_weak(update_shadow, -1), be_const_closure(Matter_Plugin_Shutter_update_shadow_closure) }, + { be_const_key_weak(shadow_shutter_target, -1), be_const_var(2) }, + { be_const_key_weak(tasmota_shutter_index, 11), be_const_var(0) }, + { be_const_key_weak(NAME, -1), be_nested_str_weak(Shutter) }, + { be_const_key_weak(shadow_shutter_tilt, 0), be_const_var(3) }, })), be_str_weak(Matter_Plugin_Shutter) ); From 4cd1136f4c3a3a8f04851909edf057ade9f9f789 Mon Sep 17 00:00:00 2001 From: s-hadinger <49731213+s-hadinger@users.noreply.github.com> Date: Mon, 8 May 2023 21:59:32 +0200 Subject: [PATCH 095/289] Berry fixed a rare condition when a GC causes a memory corruption (#18614) --- CHANGELOG.md | 1 + lib/libesp32/berry/src/be_string.c | 3 +++ 2 files changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 82af71df8..510561e5c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -23,6 +23,7 @@ All notable changes to this project will be documented in this file. ### Fixed - Partition_Manager.tapp fixed +- Berry fixed a rare condition when a GC causes a memory corruption ### Removed diff --git a/lib/libesp32/berry/src/be_string.c b/lib/libesp32/berry/src/be_string.c index 07a0fb162..ccc734ae3 100644 --- a/lib/libesp32/berry/src/be_string.c +++ b/lib/libesp32/berry/src/be_string.c @@ -195,6 +195,9 @@ static bstring* newshortstr(bvm *vm, const char *str, size_t len) } s = createstrobj(vm, len, 0); if (s) { + /* recompute size and list that may have changed due to a GC */ + size = vm->strtab.size; + list = vm->strtab.table + (hash & (size - 1)); memcpy(cast(char *, sstr(s)), str, len); s->extra = 0; s->next = cast(void*, *list); From 267fe9d951c11a9799efe21fcbaad3f8d1c8c8b0 Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Mon, 8 May 2023 23:11:34 +0200 Subject: [PATCH 096/289] add LVGL solidify (#18616) --- .github/workflows/Tasmota_build_devel.yml | 13 +++++++++++++ .github/workflows/Tasmota_build_master.yml | 13 +++++++++++++ 2 files changed, 26 insertions(+) diff --git a/.github/workflows/Tasmota_build_devel.yml b/.github/workflows/Tasmota_build_devel.yml index b06cbb3c5..a496e831c 100644 --- a/.github/workflows/Tasmota_build_devel.yml +++ b/.github/workflows/Tasmota_build_devel.yml @@ -34,6 +34,10 @@ jobs: run: | cd lib/libesp32/berry_matter ../berry/berry -s -g solidify_all.be + - name: LVGL Berry Code + run: | + cd lib/libesp32_lvgl/lv_binding_berry + ../../libesp32/berry/berry -s -g solidify_all.be - uses: actions/upload-artifact@v3 with: name: berry_matter @@ -42,6 +46,10 @@ jobs: with: name: berry_tasmota path: ./lib/libesp32/berry_tasmota/src/solidify + - uses: actions/upload-artifact@v3 + with: + name: lvgl_tasmota + path: ./lib/libesp32_lvgl/lv_binding_berry/src/solidify push_solidified: needs: be_solidify @@ -57,6 +65,7 @@ jobs: run: | rm ./lib/libesp32/berry_matter/src/solidify/* rm ./lib/libesp32/berry_tasmota/src/solidify/* + rm ./lib/libesp32_lvgl/lv_binding_berry/src/solidify/* - uses: actions/download-artifact@v3 with: name: berry_matter @@ -65,6 +74,10 @@ jobs: with: name: berry_tasmota path: ./lib/libesp32/berry_tasmota/src/solidify + - uses: actions/download-artifact@v3 + with: + name: lvgl_tasmota + path: ./lib/libesp32_lvgl/lv_binding_berry/src/solidify - uses: stefanzweifel/git-auto-commit-action@v4 with: commit_message: Solidified Code updated diff --git a/.github/workflows/Tasmota_build_master.yml b/.github/workflows/Tasmota_build_master.yml index 84eb59dd1..d4386e54a 100644 --- a/.github/workflows/Tasmota_build_master.yml +++ b/.github/workflows/Tasmota_build_master.yml @@ -33,6 +33,10 @@ jobs: run: | cd lib/libesp32/berry_matter ../berry/berry -s -g solidify_all.be + - name: LVGL Berry Code + run: | + cd lib/libesp32_lvgl/lv_binding_berry + ../../libesp32/berry/berry -s -g solidify_all.be - uses: actions/upload-artifact@v3 with: name: berry_matter @@ -41,6 +45,10 @@ jobs: with: name: berry_tasmota path: ./lib/libesp32/berry_tasmota/src/solidify + - uses: actions/upload-artifact@v3 + with: + name: lvgl_tasmota + path: ./lib/libesp32_lvgl/lv_binding_berry/src/solidify push_solidified: needs: be_solidify @@ -56,6 +64,7 @@ jobs: run: | rm ./lib/libesp32/berry_matter/src/solidify/* rm ./lib/libesp32/berry_tasmota/src/solidify/* + rm ./lib/libesp32_lvgl/lv_binding_berry/src/solidify/* - uses: actions/download-artifact@v3 with: name: berry_matter @@ -64,6 +73,10 @@ jobs: with: name: berry_tasmota path: ./lib/libesp32/berry_tasmota/src/solidify + - uses: actions/download-artifact@v3 + with: + name: lvgl_tasmota + path: ./lib/libesp32_lvgl/lv_binding_berry/src/solidify - uses: stefanzweifel/git-auto-commit-action@v4 with: commit_message: Solidified Code updated From be27b4c4884e2f4a1fea63ba3e22e1d1ad5dbb62 Mon Sep 17 00:00:00 2001 From: SteWers <42718143+SteWers@users.noreply.github.com> Date: Tue, 9 May 2023 20:12:24 +0200 Subject: [PATCH 097/289] Update de_DE.h (#18621) --- tasmota/language/de_DE.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tasmota/language/de_DE.h b/tasmota/language/de_DE.h index a43e36587..fc3c7950a 100644 --- a/tasmota/language/de_DE.h +++ b/tasmota/language/de_DE.h @@ -104,7 +104,7 @@ #define D_FALLBACK_TOPIC "Fallback-Topic" #define D_FALSE "falsch" #define D_FILE "Datei" -#define D_FILE_SYSTEM_SIZE "File System Size" +#define D_FILE_SYSTEM_SIZE "Dateisystemgröße" #define D_FLOW_RATE "Durchflussmenge" #define D_FRAGMENTATION "frag." // Lower case abbreviated version of fragmentation used in "memory fragmentation" #define D_FRAME_RATE "Frame rate" From fec3a21c8a63a9707f32060f89fabe86ef3b18ce Mon Sep 17 00:00:00 2001 From: s-hadinger <49731213+s-hadinger@users.noreply.github.com> Date: Tue, 9 May 2023 21:13:00 +0200 Subject: [PATCH 098/289] Berry strtab test case (#18623) --- lib/libesp32/berry/src/be_string.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/lib/libesp32/berry/src/be_string.c b/lib/libesp32/berry/src/be_string.c index ccc734ae3..9fe32c04a 100644 --- a/lib/libesp32/berry/src/be_string.c +++ b/lib/libesp32/berry/src/be_string.c @@ -268,9 +268,13 @@ void be_gcstrtab(bvm *vm) } } } +#if BE_USE_DEBUG_GC == 0 if (tab->count < size >> 2 && size > 8) { resize(vm, size >> 1); } +#else + resize(vm, tab->count + 4); +#endif } uint32_t be_strhash(const bstring *s) From 6a7b2b0c6e3b6e4b02f0200b34bba42a8c8aa5b6 Mon Sep 17 00:00:00 2001 From: Mateusz Bronk Date: Tue, 9 May 2023 21:35:56 +0200 Subject: [PATCH 099/289] IR: Extended the A/C protocol with Command/iFeel/SensorTemp (#18612) * IR: Added support for new A/C protocol fields New fields introduced in IRremoteESP8266 v2.8.5: 1. Command (one of: [Control | Config | iFeel | Timer], default: Control) - allows to set IR command type (e.g. iFeel for no-beep ambient sensor report) 2. iFeel (boolean, default: false) - configures whether iFeel (ambient sensor temp. is used by the A/C unit) 3. SensorTemp - the ambient sensor temperature reading to send Note: - Fan setting via int is now 6-value (breaking change -> 6 is the new max) * IR A/C: Model now pretty-printed to JSON Model string is the default (falls back to int if n/a) * IR A/C: Added separate JSON resp. per command type * No change for "kControlCommand" (default/legacy). * SensorReport/Timer/Config commands only contain relevant JSON nodes Additionally: Clock has time semantics (input: minutes, output: HH:MM), except for "config" mode, where state.clock is used as ConfigKey and state.sleep is used as ConfigValue. --------- Co-authored-by: Mateusz Bronk <2566147+mbronk@users.noreply.github.com> --- tasmota/include/i18n.h | 6 + .../xdrv_05_irremote_full.ino | 120 +++++++++++++----- 2 files changed, 93 insertions(+), 33 deletions(-) diff --git a/tasmota/include/i18n.h b/tasmota/include/i18n.h index 54e51a04f..85dd46178 100644 --- a/tasmota/include/i18n.h +++ b/tasmota/include/i18n.h @@ -123,6 +123,7 @@ #define D_JSON_MODEL "Model" #define D_JSON_MOISTURE "Moisture" #define D_JSON_MQTT_COUNT "MqttCount" +#define D_JSON_NA "n/a" #define D_JSON_NO "No" #define D_JSON_NOISE "Noise" #define D_JSON_NONE "None" @@ -535,6 +536,7 @@ #define D_JSON_IRHVAC_VENDOR "Vendor" #define D_JSON_IRHVAC_PROTOCOL "Protocol" #define D_JSON_IRHVAC_MODEL "Model" + #define D_JSON_IRHVAC_COMMAND "Command" #define D_JSON_IRHVAC_POWER "Power" #define D_JSON_IRHVAC_MODE "Mode" #define D_JSON_IRHVAC_FANSPEED "FanSpeed" @@ -551,6 +553,10 @@ #define D_JSON_IRHVAC_CLEAN "Clean" #define D_JSON_IRHVAC_SLEEP "Sleep" #define D_JSON_IRHVAC_CLOCK "Clock" + #define D_JSON_IRHVAC_IFEEL "iFeel" + #define D_JSON_IRHVAC_CONFIG_KEY "ConfigKey" + #define D_JSON_IRHVAC_CONFIG_VALUE "ConfigValue" + #define D_JSON_IRHVAC_SENSOR_TEMP "SensorTemp" #define D_JSON_IRHVAC_STATE_MODE "StateMode" #define D_JSON_IRHVAC_STATE_MODE_SEND_ONLY "SendOnly" #define D_JSON_IRHVAC_STATE_MODE_STORE_ONLY "StoreOnly" diff --git a/tasmota/tasmota_xdrv_driver/xdrv_05_irremote_full.ino b/tasmota/tasmota_xdrv_driver/xdrv_05_irremote_full.ino index 4ffb34a2c..025ec480c 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_05_irremote_full.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_05_irremote_full.ino @@ -221,37 +221,77 @@ void IrReceiveInit(void) irrecv->enableIRIn(); // Start the receiver } +namespace { + void addFloatToJson(JsonGeneratorObject& json, const char* key, float value, float noValueConstant = NAN) { + if (!isnan(noValueConstant) && value == noValueConstant) { + //The "no sensor value" may not be straightforward (e.g.-100.0), hence replacing with explicit n/a + json.add(key, PSTR(D_JSON_NA)); + return; + } + char s[6]; // Range: -99.9 <> 999.9 should be fine for any sensible temperature value :) + ext_snprintf_P(s, sizeof(s), PSTR("%-1_f"), &value); + json.addStrRaw(key, s); + } + + void addModelToJson(JsonGeneratorObject& json, const char* key, decode_type_t protocol, const int16_t model) { + String modelStr = irutils::modelToStr(protocol, model); + if (modelStr != kUnknownStr) { + json.add(key, modelStr); + } else { // Fallback to int value + json.add(key, model); + } + } +} // namespace { + String sendACJsonState(const stdAc::state_t &state) { JsonGeneratorObject json; json.add(PSTR(D_JSON_IRHVAC_VENDOR), typeToString(state.protocol)); - json.add(PSTR(D_JSON_IRHVAC_MODEL), state.model); + addModelToJson(json, PSTR(D_JSON_IRHVAC_MODEL), state.protocol, state.model); + json.add(PSTR(D_JSON_IRHVAC_COMMAND), IRac::commandTypeToString(state.command)); - json.add(PSTR(D_JSON_IRHVAC_MODE), IRac::opmodeToString(state.mode)); - // Home Assistant wants power to be off if mode is also off. - if (state.mode == stdAc::opmode_t::kOff) { - json.add(PSTR(D_JSON_IRHVAC_POWER), IRac::boolToString(false)); - } else { - json.add(PSTR(D_JSON_IRHVAC_POWER), IRac::boolToString(state.power)); - } - json.add(PSTR(D_JSON_IRHVAC_CELSIUS), IRac::boolToString(state.celsius)); - if (floorf(state.degrees) == state.degrees) { - json.add(PSTR(D_JSON_IRHVAC_TEMP), (int32_t) floorf(state.degrees)); // integer - } else { - // TODO can do better here - json.addStrRaw(PSTR(D_JSON_IRHVAC_TEMP), String(state.degrees, 1).c_str()); // non-integer, limit to only 1 sub-digit - } + switch (state.command) { + case stdAc::ac_command_t::kSensorTempReport: + addFloatToJson(json, PSTR(D_JSON_IRHVAC_SENSOR_TEMP), state.sensorTemperature, kNoTempValue); + break; + case stdAc::ac_command_t::kConfigCommand: + // Note: for `kConfigCommand` the semantics of clock/sleep is abused IRremoteESP8266 lib-side for key/value pair + // Ref: lib/lib_basic/IRremoteESP8266/IRremoteESP8266/src/IRac.cpp[L3062-3066] + json.add(PSTR(D_JSON_IRHVAC_CONFIG_KEY), state.clock); + json.add(PSTR(D_JSON_IRHVAC_CONFIG_VALUE), state.sleep); + break; + case stdAc::ac_command_t::kTimerCommand: + json.add(PSTR(D_JSON_IRHVAC_POWER), IRac::boolToString(state.power)); + if(state.clock != -1) { json.add(PSTR(D_JSON_IRHVAC_CLOCK), irutils::minsToString(state.clock)); } + json.add(PSTR(D_JSON_IRHVAC_SLEEP), state.sleep); + break; + case stdAc::ac_command_t::kControlCommand: + default: + json.add(PSTR(D_JSON_IRHVAC_MODE), IRac::opmodeToString(state.mode)); + // Home Assistant wants power to be off if mode is also off. + if (state.mode == stdAc::opmode_t::kOff) { + json.add(PSTR(D_JSON_IRHVAC_POWER), IRac::boolToString(false)); + } else { + json.add(PSTR(D_JSON_IRHVAC_POWER), IRac::boolToString(state.power)); + } + json.add(PSTR(D_JSON_IRHVAC_CELSIUS), IRac::boolToString(state.celsius)); + addFloatToJson(json, PSTR(D_JSON_IRHVAC_TEMP), state.degrees); - json.add(PSTR(D_JSON_IRHVAC_FANSPEED), IRac::fanspeedToString(state.fanspeed)); - json.add(PSTR(D_JSON_IRHVAC_SWINGV), IRac::swingvToString(state.swingv)); - json.add(PSTR(D_JSON_IRHVAC_SWINGH), IRac::swinghToString(state.swingh)); - json.add(PSTR(D_JSON_IRHVAC_QUIET), IRac::boolToString(state.quiet)); - json.add(PSTR(D_JSON_IRHVAC_TURBO), IRac::boolToString(state.turbo)); - json.add(PSTR(D_JSON_IRHVAC_ECONO), IRac::boolToString(state.econo)); - json.add(PSTR(D_JSON_IRHVAC_LIGHT), IRac::boolToString(state.light)); - json.add(PSTR(D_JSON_IRHVAC_FILTER), IRac::boolToString(state.filter)); - json.add(PSTR(D_JSON_IRHVAC_CLEAN), IRac::boolToString(state.clean)); - json.add(PSTR(D_JSON_IRHVAC_BEEP), IRac::boolToString(state.beep)); - json.add(PSTR(D_JSON_IRHVAC_SLEEP), state.sleep); + json.add(PSTR(D_JSON_IRHVAC_FANSPEED), IRac::fanspeedToString(state.fanspeed)); + json.add(PSTR(D_JSON_IRHVAC_SWINGV), IRac::swingvToString(state.swingv)); + json.add(PSTR(D_JSON_IRHVAC_SWINGH), IRac::swinghToString(state.swingh)); + json.add(PSTR(D_JSON_IRHVAC_QUIET), IRac::boolToString(state.quiet)); + json.add(PSTR(D_JSON_IRHVAC_TURBO), IRac::boolToString(state.turbo)); + json.add(PSTR(D_JSON_IRHVAC_ECONO), IRac::boolToString(state.econo)); + json.add(PSTR(D_JSON_IRHVAC_LIGHT), IRac::boolToString(state.light)); + json.add(PSTR(D_JSON_IRHVAC_FILTER), IRac::boolToString(state.filter)); + json.add(PSTR(D_JSON_IRHVAC_CLEAN), IRac::boolToString(state.clean)); + json.add(PSTR(D_JSON_IRHVAC_BEEP), IRac::boolToString(state.beep)); + json.add(PSTR(D_JSON_IRHVAC_SLEEP), state.sleep); + if(state.clock != -1) { json.add(PSTR(D_JSON_IRHVAC_CLOCK), state.clock); } + json.add(PSTR(D_JSON_IRHVAC_IFEEL), IRac::boolToString(state.iFeel)); + addFloatToJson(json, PSTR(D_JSON_IRHVAC_SENSOR_TEMP), state.sensorTemperature, kNoTempValue); + break; + } String payload = json.toString(); // copy string before returning, the original is on the stack return payload; @@ -393,7 +433,7 @@ StateModes strToStateMode(class JsonParserToken token, StateModes def) { // used to convert values 0-5 to fanspeed_t const stdAc::fanspeed_t IrHvacFanSpeed[] PROGMEM = { stdAc::fanspeed_t::kAuto, - stdAc::fanspeed_t::kMin, stdAc::fanspeed_t::kLow,stdAc::fanspeed_t::kMedium, + stdAc::fanspeed_t::kMin, stdAc::fanspeed_t::kLow,stdAc::fanspeed_t::kMedium, stdAc::fanspeed_t::kMediumHigh, stdAc::fanspeed_t::kHigh, stdAc::fanspeed_t::kMax }; uint32_t IrRemoteCmndIrHvacJson(void) @@ -408,6 +448,7 @@ uint32_t IrRemoteCmndIrHvacJson(void) // from: https://github.com/crankyoldgit/IRremoteESP8266/blob/master/examples/CommonAcControl/CommonAcControl.ino state.protocol = decode_type_t::UNKNOWN; state.model = 1; // Some A/C's have different models. Let's try using just 1. + state.command = stdAc::ac_command_t::kControlCommand; state.mode = stdAc::opmode_t::kAuto; // Run in cool mode initially. state.power = false; // Initially start with the unit off. state.celsius = true; // Use Celsius for units of temp. False = Fahrenheit @@ -424,6 +465,8 @@ uint32_t IrRemoteCmndIrHvacJson(void) state.sleep = -1; // Don't set any sleep time or modes. state.clean = false; // Turn off any Cleaning options if we can. state.clock = -1; // Don't set any current time if we can avoid it. + state.iFeel = false; + state.sensorTemperature = kNoTempValue; // Don't set any sensor (ambient) temperature if not provided JsonParserToken val; if (val = root[PSTR(D_JSON_IRHVAC_VENDOR)]) { state.protocol = strToDecodeType(val.getStr()); } @@ -431,18 +474,20 @@ uint32_t IrRemoteCmndIrHvacJson(void) if (decode_type_t::UNKNOWN == state.protocol) { return IE_UNSUPPORTED_HVAC; } if (!IRac::isProtocolSupported(state.protocol)) { return IE_UNSUPPORTED_HVAC; } - // for fan speed, we also support 1-5 values + if (val = root[PSTR(D_JSON_IRHVAC_MODEL)]) { state.model = IRac::strToModel(val.getStr()); } + if (val = root[PSTR(D_JSON_IRHVAC_COMMAND)]) { state.command = IRac::strToCommandType(val.getStr()); } + + // for fan speed, we also support 1-6 values JsonParserToken tok_fan_speed = root[PSTR(D_JSON_IRHVAC_FANSPEED)]; if (tok_fan_speed) { uint32_t fan_speed = tok_fan_speed.getUInt(); - if ((fan_speed >= 1) && (fan_speed <= 5)) { + if ((fan_speed >= 1) && (fan_speed <= 6)) { state.fanspeed = (stdAc::fanspeed_t) pgm_read_byte(&IrHvacFanSpeed[fan_speed]); } else { state.fanspeed = IRac::strToFanspeed(tok_fan_speed.getStr()); } } - if (val = root[PSTR(D_JSON_IRHVAC_MODEL)]) { state.model = IRac::strToModel(val.getStr()); } if (val = root[PSTR(D_JSON_IRHVAC_MODE)]) { state.mode = IRac::strToOpmode(val.getStr()); } if (val = root[PSTR(D_JSON_IRHVAC_SWINGV)]) { state.swingv = IRac::strToSwingV(val.getStr()); } if (val = root[PSTR(D_JSON_IRHVAC_SWINGH)]) { state.swingh = IRac::strToSwingH(val.getStr()); } @@ -465,9 +510,18 @@ uint32_t IrRemoteCmndIrHvacJson(void) state.quiet = strToBool(root[PSTR(D_JSON_IRHVAC_QUIET)], state.quiet); state.clean = strToBool(root[PSTR(D_JSON_IRHVAC_CLEAN)], state.clean); - // optional timer and clock - state.sleep = root.getInt(PSTR(D_JSON_IRHVAC_SLEEP), state.sleep); - //if (json[D_JSON_IRHVAC_CLOCK]) { state.clock = json[D_JSON_IRHVAC_CLOCK]; } // not sure it's useful to support 'clock' + if (state.command == stdAc::ac_command_t::kConfigCommand) { + // Note: for `kConfigCommand` the semantics of clock/sleep is abused IRremoteESP8266 lib-side for key/value pair + state.clock = root.getInt(PSTR(D_JSON_IRHVAC_CONFIG_KEY), state.clock); + state.sleep = root.getInt(PSTR(D_JSON_IRHVAC_CONFIG_VALUE), state.sleep); + } else { + // optional timer and clock (Note: different json field names w/ time semantics) + state.clock = root.getInt(PSTR(D_JSON_IRHVAC_CLOCK), state.clock); + state.sleep = root.getInt(PSTR(D_JSON_IRHVAC_SLEEP), state.sleep); + } + + state.iFeel = strToBool(root[PSTR(D_JSON_IRHVAC_IFEEL)], state.iFeel); + state.sensorTemperature = root.getFloat(PSTR(D_JSON_IRHVAC_SENSOR_TEMP), state.sensorTemperature); if (!IR_RCV_WHILE_SENDING && (irrecv != nullptr)) { irrecv->pause(); } if (stateMode == StateModes::SEND_ONLY || stateMode == StateModes::SEND_STORE) { From 88593be79c7ed0ec388989f3578f980e3dc678cb Mon Sep 17 00:00:00 2001 From: s-hadinger <49731213+s-hadinger@users.noreply.github.com> Date: Tue, 9 May 2023 21:41:05 +0200 Subject: [PATCH 100/289] Matter fix autoconf_device_map (#18625) --- lib/libesp32/berry_matter/src/embedded/Matter_Device.be | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Device.be b/lib/libesp32/berry_matter/src/embedded/Matter_Device.be index d027e7dfd..8eff6f140 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Device.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Device.be @@ -1032,7 +1032,7 @@ class Matter_Device var relays_reserved = [] # list of relays that are used for non-relay (shutters) tasmota.log("MTR: Status 13 = "+str(r_st13), 3) - if r_st13.contains('StatusSHT') + if r_st13 != nil && r_st13.contains('StatusSHT') r_st13 = r_st13['StatusSHT'] # skip root # Shutter is enabled, iterate var idx = 0 From 11631cdb192ac5d7e0152b962f222f4e73bdf283 Mon Sep 17 00:00:00 2001 From: s-hadinger Date: Tue, 9 May 2023 19:42:42 +0000 Subject: [PATCH 101/289] Solidified Code updated --- .../src/solidify/solidified_Matter_Device.h | 547 +++++++++--------- 1 file changed, 275 insertions(+), 272 deletions(-) diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Device.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Device.h index a0d557ce7..45b190598 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Device.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Device.h @@ -2060,7 +2060,7 @@ be_local_closure(Matter_Device_autoconf_device_map, /* name */ }), be_str_weak(autoconf_device_map), &be_const_str_solidified, - ( &(const binstruction[339]) { /* code */ + ( &(const binstruction[342]) { /* code */ 0xA4060000, // 0000 IMPORT R1 K0 0xA40A0200, // 0001 IMPORT R2 K1 0x600C0013, // 0002 GETGBL R3 G19 @@ -2129,277 +2129,280 @@ be_local_closure(Matter_Device_autoconf_device_map, /* name */ 0x0032280C, // 0041 ADD R12 K20 R12 0x58340015, // 0042 LDCONST R13 K21 0x7C280600, // 0043 CALL R10 3 - 0x8C281116, // 0044 GETMET R10 R8 K22 - 0x58300017, // 0045 LDCONST R12 K23 - 0x7C280400, // 0046 CALL R10 2 - 0x782A004D, // 0047 JMPF R10 #0096 - 0x94201117, // 0048 GETIDX R8 R8 K23 - 0x5828000B, // 0049 LDCONST R10 K11 - 0x502C0200, // 004A LDBOOL R11 1 0 - 0x782E0049, // 004B JMPF R11 #0096 - 0x602C0008, // 004C GETGBL R11 G8 - 0x5C301400, // 004D MOVE R12 R10 - 0x7C2C0200, // 004E CALL R11 1 - 0x002E300B, // 004F ADD R11 K24 R11 - 0x8C301116, // 0050 GETMET R12 R8 K22 - 0x5C381600, // 0051 MOVE R14 R11 - 0x7C300400, // 0052 CALL R12 2 - 0x74320000, // 0053 JMPT R12 #0055 - 0x70020040, // 0054 JMP #0096 - 0x9430100B, // 0055 GETIDX R12 R8 R11 - 0xB8362000, // 0056 GETNGBL R13 K16 - 0x8C341B13, // 0057 GETMET R13 R13 K19 - 0x8C3C0319, // 0058 GETMET R15 R1 K25 - 0x5844001A, // 0059 LDCONST R17 K26 - 0x5C481600, // 005A MOVE R18 R11 - 0x604C0008, // 005B GETGBL R19 G8 - 0x5C501800, // 005C MOVE R20 R12 - 0x7C4C0200, // 005D CALL R19 1 - 0x7C3C0800, // 005E CALL R15 4 - 0x58400015, // 005F LDCONST R16 K21 - 0x7C340600, // 0060 CALL R13 3 - 0x8C341908, // 0061 GETMET R13 R12 K8 - 0x583C001B, // 0062 LDCONST R15 K27 - 0x5840000B, // 0063 LDCONST R16 K11 - 0x7C340600, // 0064 CALL R13 3 - 0x04341B05, // 0065 SUB R13 R13 K5 - 0x8C381908, // 0066 GETMET R14 R12 K8 - 0x5840001C, // 0067 LDCONST R16 K28 - 0x5844000B, // 0068 LDCONST R17 K11 - 0x7C380600, // 0069 CALL R14 3 - 0x04381D05, // 006A SUB R14 R14 K5 - 0x283C1B0B, // 006B GE R15 R13 K11 - 0x783E0002, // 006C JMPF R15 #0070 - 0x8C3C131D, // 006D GETMET R15 R9 K29 - 0x5C441A00, // 006E MOVE R17 R13 - 0x7C3C0400, // 006F CALL R15 2 - 0x283C1D0B, // 0070 GE R15 R14 K11 - 0x783E0002, // 0071 JMPF R15 #0075 - 0x8C3C131D, // 0072 GETMET R15 R9 K29 - 0x5C441C00, // 0073 MOVE R17 R14 - 0x7C3C0400, // 0074 CALL R15 2 - 0xB83E2000, // 0075 GETNGBL R15 K16 - 0x8C3C1F13, // 0076 GETMET R15 R15 K19 - 0x8C440319, // 0077 GETMET R17 R1 K25 - 0x584C001E, // 0078 LDCONST R19 K30 - 0x5C501A00, // 0079 MOVE R20 R13 - 0x5C541C00, // 007A MOVE R21 R14 - 0x7C440800, // 007B CALL R17 4 - 0x58480015, // 007C LDCONST R18 K21 - 0x7C3C0600, // 007D CALL R15 3 - 0x8C3C1908, // 007E GETMET R15 R12 K8 - 0x5844001F, // 007F LDCONST R17 K31 - 0x7C3C0400, // 0080 CALL R15 2 - 0x783E0002, // 0081 JMPF R15 #0085 - 0x94401F0D, // 0082 GETIDX R16 R15 K13 - 0x2440210B, // 0083 GT R16 R16 K11 - 0x74420000, // 0084 JMPT R16 #0086 - 0x50400001, // 0085 LDBOOL R16 0 1 - 0x50400200, // 0086 LDBOOL R16 1 0 - 0x60440008, // 0087 GETGBL R17 G8 - 0x5C480800, // 0088 MOVE R18 R4 - 0x7C440200, // 0089 CALL R17 1 - 0x60480013, // 008A GETGBL R18 G19 - 0x7C480000, // 008B CALL R18 0 - 0x78420001, // 008C JMPF R16 #008F - 0x584C0020, // 008D LDCONST R19 K32 - 0x70020000, // 008E JMP #0090 - 0x584C0021, // 008F LDCONST R19 K33 - 0x984A0613, // 0090 SETIDX R18 K3 R19 - 0x984A420A, // 0091 SETIDX R18 K33 R10 - 0x980C2212, // 0092 SETIDX R3 R17 R18 - 0x00100905, // 0093 ADD R4 R4 K5 - 0x00281505, // 0094 ADD R10 R10 K5 - 0x7001FFB3, // 0095 JMP #004A - 0x6028000C, // 0096 GETGBL R10 G12 - 0xB82E2000, // 0097 GETNGBL R11 K16 - 0x8C2C1722, // 0098 GETMET R11 R11 K34 - 0x7C2C0200, // 0099 CALL R11 1 - 0x7C280200, // 009A CALL R10 1 - 0x582C000B, // 009B LDCONST R11 K11 - 0x78160000, // 009C JMPF R5 #009E - 0x04281505, // 009D SUB R10 R10 K5 - 0x1430160A, // 009E LT R12 R11 R10 - 0x78320010, // 009F JMPF R12 #00B1 - 0x8C301308, // 00A0 GETMET R12 R9 K8 - 0x5C381600, // 00A1 MOVE R14 R11 - 0x7C300400, // 00A2 CALL R12 2 - 0x4C340000, // 00A3 LDNIL R13 - 0x1C30180D, // 00A4 EQ R12 R12 R13 - 0x78320008, // 00A5 JMPF R12 #00AF - 0x60300008, // 00A6 GETGBL R12 G8 - 0x5C340800, // 00A7 MOVE R13 R4 - 0x7C300200, // 00A8 CALL R12 1 - 0x60340013, // 00A9 GETGBL R13 G19 - 0x7C340000, // 00AA CALL R13 0 - 0x98360723, // 00AB SETIDX R13 K3 K35 - 0x9836460B, // 00AC SETIDX R13 K35 R11 - 0x980C180D, // 00AD SETIDX R3 R12 R13 - 0x00100905, // 00AE ADD R4 R4 K5 - 0x002C1705, // 00AF ADD R11 R11 K5 - 0x7001FFEC, // 00B0 JMP #009E - 0x8C300524, // 00B1 GETMET R12 R2 K36 - 0xB83A2000, // 00B2 GETNGBL R14 K16 - 0x8C381D25, // 00B3 GETMET R14 R14 K37 - 0x7C380200, // 00B4 CALL R14 1 - 0x7C300400, // 00B5 CALL R12 2 - 0x5412001F, // 00B6 LDINT R4 32 - 0x60340010, // 00B7 GETGBL R13 G16 - 0x8C380126, // 00B8 GETMET R14 R0 K38 - 0x5C401800, // 00B9 MOVE R16 R12 - 0x7C380400, // 00BA CALL R14 2 - 0x7C340200, // 00BB CALL R13 1 - 0xA802001C, // 00BC EXBLK 0 #00DA - 0x5C381A00, // 00BD MOVE R14 R13 - 0x7C380000, // 00BE CALL R14 0 - 0x943C180E, // 00BF GETIDX R15 R12 R14 - 0x6040000F, // 00C0 GETGBL R16 G15 - 0x5C441E00, // 00C1 MOVE R17 R15 - 0x60480013, // 00C2 GETGBL R18 G19 - 0x7C400400, // 00C3 CALL R16 2 - 0x7842000D, // 00C4 JMPF R16 #00D3 - 0x8C401F16, // 00C5 GETMET R16 R15 K22 - 0x58480027, // 00C6 LDCONST R18 K39 - 0x7C400400, // 00C7 CALL R16 2 - 0x78420009, // 00C8 JMPF R16 #00D3 - 0x00401D28, // 00C9 ADD R16 R14 K40 - 0x60440008, // 00CA GETGBL R17 G8 - 0x5C480800, // 00CB MOVE R18 R4 - 0x7C440200, // 00CC CALL R17 1 - 0x60480013, // 00CD GETGBL R18 G19 - 0x7C480000, // 00CE CALL R18 0 - 0x984A0729, // 00CF SETIDX R18 K3 K41 - 0x984A5410, // 00D0 SETIDX R18 K42 R16 - 0x980C2212, // 00D1 SETIDX R3 R17 R18 - 0x00100905, // 00D2 ADD R4 R4 K5 - 0x54420027, // 00D3 LDINT R16 40 - 0x24400810, // 00D4 GT R16 R4 R16 - 0x78420000, // 00D5 JMPF R16 #00D7 - 0x70020000, // 00D6 JMP #00D8 - 0x7001FFE4, // 00D7 JMP #00BD - 0xA8040001, // 00D8 EXBLK 1 1 - 0x70020002, // 00D9 JMP #00DD - 0x5834002B, // 00DA LDCONST R13 K43 - 0xAC340200, // 00DB CATCH R13 1 0 - 0xB0080000, // 00DC RAISE 2 R0 R0 - 0x54120027, // 00DD LDINT R4 40 - 0x60340010, // 00DE GETGBL R13 G16 - 0x8C380126, // 00DF GETMET R14 R0 K38 - 0x5C401800, // 00E0 MOVE R16 R12 - 0x7C380400, // 00E1 CALL R14 2 - 0x7C340200, // 00E2 CALL R13 1 - 0xA802001C, // 00E3 EXBLK 0 #0101 - 0x5C381A00, // 00E4 MOVE R14 R13 - 0x7C380000, // 00E5 CALL R14 0 - 0x943C180E, // 00E6 GETIDX R15 R12 R14 - 0x6040000F, // 00E7 GETGBL R16 G15 - 0x5C441E00, // 00E8 MOVE R17 R15 - 0x60480013, // 00E9 GETGBL R18 G19 - 0x7C400400, // 00EA CALL R16 2 - 0x7842000D, // 00EB JMPF R16 #00FA - 0x8C401F16, // 00EC GETMET R16 R15 K22 - 0x5848002C, // 00ED LDCONST R18 K44 - 0x7C400400, // 00EE CALL R16 2 - 0x78420009, // 00EF JMPF R16 #00FA - 0x00401D2D, // 00F0 ADD R16 R14 K45 - 0x60440008, // 00F1 GETGBL R17 G8 - 0x5C480800, // 00F2 MOVE R18 R4 - 0x7C440200, // 00F3 CALL R17 1 - 0x60480013, // 00F4 GETGBL R18 G19 - 0x7C480000, // 00F5 CALL R18 0 - 0x984A072E, // 00F6 SETIDX R18 K3 K46 - 0x984A5410, // 00F7 SETIDX R18 K42 R16 - 0x980C2212, // 00F8 SETIDX R3 R17 R18 - 0x00100905, // 00F9 ADD R4 R4 K5 - 0x5442002E, // 00FA LDINT R16 47 - 0x24400810, // 00FB GT R16 R4 R16 - 0x78420000, // 00FC JMPF R16 #00FE - 0x70020000, // 00FD JMP #00FF - 0x7001FFE4, // 00FE JMP #00E4 - 0xA8040001, // 00FF EXBLK 1 1 - 0x70020002, // 0100 JMP #0104 - 0x5834002B, // 0101 LDCONST R13 K43 - 0xAC340200, // 0102 CATCH R13 1 0 - 0xB0080000, // 0103 RAISE 2 R0 R0 - 0x5412002F, // 0104 LDINT R4 48 - 0x60340010, // 0105 GETGBL R13 G16 - 0x8C380126, // 0106 GETMET R14 R0 K38 - 0x5C401800, // 0107 MOVE R16 R12 - 0x7C380400, // 0108 CALL R14 2 - 0x7C340200, // 0109 CALL R13 1 - 0xA802001C, // 010A EXBLK 0 #0128 - 0x5C381A00, // 010B MOVE R14 R13 - 0x7C380000, // 010C CALL R14 0 - 0x943C180E, // 010D GETIDX R15 R12 R14 - 0x6040000F, // 010E GETGBL R16 G15 - 0x5C441E00, // 010F MOVE R17 R15 - 0x60480013, // 0110 GETGBL R18 G19 - 0x7C400400, // 0111 CALL R16 2 - 0x7842000D, // 0112 JMPF R16 #0121 - 0x8C401F16, // 0113 GETMET R16 R15 K22 - 0x5848002F, // 0114 LDCONST R18 K47 - 0x7C400400, // 0115 CALL R16 2 - 0x78420009, // 0116 JMPF R16 #0121 - 0x00401D30, // 0117 ADD R16 R14 K48 - 0x60440008, // 0118 GETGBL R17 G8 - 0x5C480800, // 0119 MOVE R18 R4 - 0x7C440200, // 011A CALL R17 1 - 0x60480013, // 011B GETGBL R18 G19 - 0x7C480000, // 011C CALL R18 0 - 0x984A0731, // 011D SETIDX R18 K3 K49 - 0x984A5410, // 011E SETIDX R18 K42 R16 - 0x980C2212, // 011F SETIDX R3 R17 R18 - 0x00100905, // 0120 ADD R4 R4 K5 - 0x54420037, // 0121 LDINT R16 56 - 0x24400810, // 0122 GT R16 R4 R16 - 0x78420000, // 0123 JMPF R16 #0125 - 0x70020000, // 0124 JMP #0126 - 0x7001FFE4, // 0125 JMP #010B - 0xA8040001, // 0126 EXBLK 1 1 - 0x70020002, // 0127 JMP #012B - 0x5834002B, // 0128 LDCONST R13 K43 - 0xAC340200, // 0129 CATCH R13 1 0 - 0xB0080000, // 012A RAISE 2 R0 R0 - 0x54120037, // 012B LDINT R4 56 - 0x60340010, // 012C GETGBL R13 G16 - 0x8C380126, // 012D GETMET R14 R0 K38 - 0x5C401800, // 012E MOVE R16 R12 - 0x7C380400, // 012F CALL R14 2 - 0x7C340200, // 0130 CALL R13 1 - 0xA802001C, // 0131 EXBLK 0 #014F - 0x5C381A00, // 0132 MOVE R14 R13 - 0x7C380000, // 0133 CALL R14 0 - 0x943C180E, // 0134 GETIDX R15 R12 R14 - 0x6040000F, // 0135 GETGBL R16 G15 - 0x5C441E00, // 0136 MOVE R17 R15 - 0x60480013, // 0137 GETGBL R18 G19 - 0x7C400400, // 0138 CALL R16 2 - 0x7842000D, // 0139 JMPF R16 #0148 - 0x8C401F16, // 013A GETMET R16 R15 K22 - 0x58480032, // 013B LDCONST R18 K50 - 0x7C400400, // 013C CALL R16 2 - 0x78420009, // 013D JMPF R16 #0148 - 0x00401D33, // 013E ADD R16 R14 K51 - 0x60440008, // 013F GETGBL R17 G8 - 0x5C480800, // 0140 MOVE R18 R4 - 0x7C440200, // 0141 CALL R17 1 - 0x60480013, // 0142 GETGBL R18 G19 - 0x7C480000, // 0143 CALL R18 0 - 0x984A0734, // 0144 SETIDX R18 K3 K52 - 0x984A5410, // 0145 SETIDX R18 K42 R16 - 0x980C2212, // 0146 SETIDX R3 R17 R18 - 0x00100905, // 0147 ADD R4 R4 K5 - 0x5442003F, // 0148 LDINT R16 64 - 0x24400810, // 0149 GT R16 R4 R16 - 0x78420000, // 014A JMPF R16 #014C - 0x70020000, // 014B JMP #014D - 0x7001FFE4, // 014C JMP #0132 - 0xA8040001, // 014D EXBLK 1 1 - 0x70020002, // 014E JMP #0152 - 0x5834002B, // 014F LDCONST R13 K43 - 0xAC340200, // 0150 CATCH R13 1 0 - 0xB0080000, // 0151 RAISE 2 R0 R0 - 0x80040600, // 0152 RET 1 R3 + 0x4C280000, // 0044 LDNIL R10 + 0x2028100A, // 0045 NE R10 R8 R10 + 0x782A0051, // 0046 JMPF R10 #0099 + 0x8C281116, // 0047 GETMET R10 R8 K22 + 0x58300017, // 0048 LDCONST R12 K23 + 0x7C280400, // 0049 CALL R10 2 + 0x782A004D, // 004A JMPF R10 #0099 + 0x94201117, // 004B GETIDX R8 R8 K23 + 0x5828000B, // 004C LDCONST R10 K11 + 0x502C0200, // 004D LDBOOL R11 1 0 + 0x782E0049, // 004E JMPF R11 #0099 + 0x602C0008, // 004F GETGBL R11 G8 + 0x5C301400, // 0050 MOVE R12 R10 + 0x7C2C0200, // 0051 CALL R11 1 + 0x002E300B, // 0052 ADD R11 K24 R11 + 0x8C301116, // 0053 GETMET R12 R8 K22 + 0x5C381600, // 0054 MOVE R14 R11 + 0x7C300400, // 0055 CALL R12 2 + 0x74320000, // 0056 JMPT R12 #0058 + 0x70020040, // 0057 JMP #0099 + 0x9430100B, // 0058 GETIDX R12 R8 R11 + 0xB8362000, // 0059 GETNGBL R13 K16 + 0x8C341B13, // 005A GETMET R13 R13 K19 + 0x8C3C0319, // 005B GETMET R15 R1 K25 + 0x5844001A, // 005C LDCONST R17 K26 + 0x5C481600, // 005D MOVE R18 R11 + 0x604C0008, // 005E GETGBL R19 G8 + 0x5C501800, // 005F MOVE R20 R12 + 0x7C4C0200, // 0060 CALL R19 1 + 0x7C3C0800, // 0061 CALL R15 4 + 0x58400015, // 0062 LDCONST R16 K21 + 0x7C340600, // 0063 CALL R13 3 + 0x8C341908, // 0064 GETMET R13 R12 K8 + 0x583C001B, // 0065 LDCONST R15 K27 + 0x5840000B, // 0066 LDCONST R16 K11 + 0x7C340600, // 0067 CALL R13 3 + 0x04341B05, // 0068 SUB R13 R13 K5 + 0x8C381908, // 0069 GETMET R14 R12 K8 + 0x5840001C, // 006A LDCONST R16 K28 + 0x5844000B, // 006B LDCONST R17 K11 + 0x7C380600, // 006C CALL R14 3 + 0x04381D05, // 006D SUB R14 R14 K5 + 0x283C1B0B, // 006E GE R15 R13 K11 + 0x783E0002, // 006F JMPF R15 #0073 + 0x8C3C131D, // 0070 GETMET R15 R9 K29 + 0x5C441A00, // 0071 MOVE R17 R13 + 0x7C3C0400, // 0072 CALL R15 2 + 0x283C1D0B, // 0073 GE R15 R14 K11 + 0x783E0002, // 0074 JMPF R15 #0078 + 0x8C3C131D, // 0075 GETMET R15 R9 K29 + 0x5C441C00, // 0076 MOVE R17 R14 + 0x7C3C0400, // 0077 CALL R15 2 + 0xB83E2000, // 0078 GETNGBL R15 K16 + 0x8C3C1F13, // 0079 GETMET R15 R15 K19 + 0x8C440319, // 007A GETMET R17 R1 K25 + 0x584C001E, // 007B LDCONST R19 K30 + 0x5C501A00, // 007C MOVE R20 R13 + 0x5C541C00, // 007D MOVE R21 R14 + 0x7C440800, // 007E CALL R17 4 + 0x58480015, // 007F LDCONST R18 K21 + 0x7C3C0600, // 0080 CALL R15 3 + 0x8C3C1908, // 0081 GETMET R15 R12 K8 + 0x5844001F, // 0082 LDCONST R17 K31 + 0x7C3C0400, // 0083 CALL R15 2 + 0x783E0002, // 0084 JMPF R15 #0088 + 0x94401F0D, // 0085 GETIDX R16 R15 K13 + 0x2440210B, // 0086 GT R16 R16 K11 + 0x74420000, // 0087 JMPT R16 #0089 + 0x50400001, // 0088 LDBOOL R16 0 1 + 0x50400200, // 0089 LDBOOL R16 1 0 + 0x60440008, // 008A GETGBL R17 G8 + 0x5C480800, // 008B MOVE R18 R4 + 0x7C440200, // 008C CALL R17 1 + 0x60480013, // 008D GETGBL R18 G19 + 0x7C480000, // 008E CALL R18 0 + 0x78420001, // 008F JMPF R16 #0092 + 0x584C0020, // 0090 LDCONST R19 K32 + 0x70020000, // 0091 JMP #0093 + 0x584C0021, // 0092 LDCONST R19 K33 + 0x984A0613, // 0093 SETIDX R18 K3 R19 + 0x984A420A, // 0094 SETIDX R18 K33 R10 + 0x980C2212, // 0095 SETIDX R3 R17 R18 + 0x00100905, // 0096 ADD R4 R4 K5 + 0x00281505, // 0097 ADD R10 R10 K5 + 0x7001FFB3, // 0098 JMP #004D + 0x6028000C, // 0099 GETGBL R10 G12 + 0xB82E2000, // 009A GETNGBL R11 K16 + 0x8C2C1722, // 009B GETMET R11 R11 K34 + 0x7C2C0200, // 009C CALL R11 1 + 0x7C280200, // 009D CALL R10 1 + 0x582C000B, // 009E LDCONST R11 K11 + 0x78160000, // 009F JMPF R5 #00A1 + 0x04281505, // 00A0 SUB R10 R10 K5 + 0x1430160A, // 00A1 LT R12 R11 R10 + 0x78320010, // 00A2 JMPF R12 #00B4 + 0x8C301308, // 00A3 GETMET R12 R9 K8 + 0x5C381600, // 00A4 MOVE R14 R11 + 0x7C300400, // 00A5 CALL R12 2 + 0x4C340000, // 00A6 LDNIL R13 + 0x1C30180D, // 00A7 EQ R12 R12 R13 + 0x78320008, // 00A8 JMPF R12 #00B2 + 0x60300008, // 00A9 GETGBL R12 G8 + 0x5C340800, // 00AA MOVE R13 R4 + 0x7C300200, // 00AB CALL R12 1 + 0x60340013, // 00AC GETGBL R13 G19 + 0x7C340000, // 00AD CALL R13 0 + 0x98360723, // 00AE SETIDX R13 K3 K35 + 0x9836460B, // 00AF SETIDX R13 K35 R11 + 0x980C180D, // 00B0 SETIDX R3 R12 R13 + 0x00100905, // 00B1 ADD R4 R4 K5 + 0x002C1705, // 00B2 ADD R11 R11 K5 + 0x7001FFEC, // 00B3 JMP #00A1 + 0x8C300524, // 00B4 GETMET R12 R2 K36 + 0xB83A2000, // 00B5 GETNGBL R14 K16 + 0x8C381D25, // 00B6 GETMET R14 R14 K37 + 0x7C380200, // 00B7 CALL R14 1 + 0x7C300400, // 00B8 CALL R12 2 + 0x5412001F, // 00B9 LDINT R4 32 + 0x60340010, // 00BA GETGBL R13 G16 + 0x8C380126, // 00BB GETMET R14 R0 K38 + 0x5C401800, // 00BC MOVE R16 R12 + 0x7C380400, // 00BD CALL R14 2 + 0x7C340200, // 00BE CALL R13 1 + 0xA802001C, // 00BF EXBLK 0 #00DD + 0x5C381A00, // 00C0 MOVE R14 R13 + 0x7C380000, // 00C1 CALL R14 0 + 0x943C180E, // 00C2 GETIDX R15 R12 R14 + 0x6040000F, // 00C3 GETGBL R16 G15 + 0x5C441E00, // 00C4 MOVE R17 R15 + 0x60480013, // 00C5 GETGBL R18 G19 + 0x7C400400, // 00C6 CALL R16 2 + 0x7842000D, // 00C7 JMPF R16 #00D6 + 0x8C401F16, // 00C8 GETMET R16 R15 K22 + 0x58480027, // 00C9 LDCONST R18 K39 + 0x7C400400, // 00CA CALL R16 2 + 0x78420009, // 00CB JMPF R16 #00D6 + 0x00401D28, // 00CC ADD R16 R14 K40 + 0x60440008, // 00CD GETGBL R17 G8 + 0x5C480800, // 00CE MOVE R18 R4 + 0x7C440200, // 00CF CALL R17 1 + 0x60480013, // 00D0 GETGBL R18 G19 + 0x7C480000, // 00D1 CALL R18 0 + 0x984A0729, // 00D2 SETIDX R18 K3 K41 + 0x984A5410, // 00D3 SETIDX R18 K42 R16 + 0x980C2212, // 00D4 SETIDX R3 R17 R18 + 0x00100905, // 00D5 ADD R4 R4 K5 + 0x54420027, // 00D6 LDINT R16 40 + 0x24400810, // 00D7 GT R16 R4 R16 + 0x78420000, // 00D8 JMPF R16 #00DA + 0x70020000, // 00D9 JMP #00DB + 0x7001FFE4, // 00DA JMP #00C0 + 0xA8040001, // 00DB EXBLK 1 1 + 0x70020002, // 00DC JMP #00E0 + 0x5834002B, // 00DD LDCONST R13 K43 + 0xAC340200, // 00DE CATCH R13 1 0 + 0xB0080000, // 00DF RAISE 2 R0 R0 + 0x54120027, // 00E0 LDINT R4 40 + 0x60340010, // 00E1 GETGBL R13 G16 + 0x8C380126, // 00E2 GETMET R14 R0 K38 + 0x5C401800, // 00E3 MOVE R16 R12 + 0x7C380400, // 00E4 CALL R14 2 + 0x7C340200, // 00E5 CALL R13 1 + 0xA802001C, // 00E6 EXBLK 0 #0104 + 0x5C381A00, // 00E7 MOVE R14 R13 + 0x7C380000, // 00E8 CALL R14 0 + 0x943C180E, // 00E9 GETIDX R15 R12 R14 + 0x6040000F, // 00EA GETGBL R16 G15 + 0x5C441E00, // 00EB MOVE R17 R15 + 0x60480013, // 00EC GETGBL R18 G19 + 0x7C400400, // 00ED CALL R16 2 + 0x7842000D, // 00EE JMPF R16 #00FD + 0x8C401F16, // 00EF GETMET R16 R15 K22 + 0x5848002C, // 00F0 LDCONST R18 K44 + 0x7C400400, // 00F1 CALL R16 2 + 0x78420009, // 00F2 JMPF R16 #00FD + 0x00401D2D, // 00F3 ADD R16 R14 K45 + 0x60440008, // 00F4 GETGBL R17 G8 + 0x5C480800, // 00F5 MOVE R18 R4 + 0x7C440200, // 00F6 CALL R17 1 + 0x60480013, // 00F7 GETGBL R18 G19 + 0x7C480000, // 00F8 CALL R18 0 + 0x984A072E, // 00F9 SETIDX R18 K3 K46 + 0x984A5410, // 00FA SETIDX R18 K42 R16 + 0x980C2212, // 00FB SETIDX R3 R17 R18 + 0x00100905, // 00FC ADD R4 R4 K5 + 0x5442002E, // 00FD LDINT R16 47 + 0x24400810, // 00FE GT R16 R4 R16 + 0x78420000, // 00FF JMPF R16 #0101 + 0x70020000, // 0100 JMP #0102 + 0x7001FFE4, // 0101 JMP #00E7 + 0xA8040001, // 0102 EXBLK 1 1 + 0x70020002, // 0103 JMP #0107 + 0x5834002B, // 0104 LDCONST R13 K43 + 0xAC340200, // 0105 CATCH R13 1 0 + 0xB0080000, // 0106 RAISE 2 R0 R0 + 0x5412002F, // 0107 LDINT R4 48 + 0x60340010, // 0108 GETGBL R13 G16 + 0x8C380126, // 0109 GETMET R14 R0 K38 + 0x5C401800, // 010A MOVE R16 R12 + 0x7C380400, // 010B CALL R14 2 + 0x7C340200, // 010C CALL R13 1 + 0xA802001C, // 010D EXBLK 0 #012B + 0x5C381A00, // 010E MOVE R14 R13 + 0x7C380000, // 010F CALL R14 0 + 0x943C180E, // 0110 GETIDX R15 R12 R14 + 0x6040000F, // 0111 GETGBL R16 G15 + 0x5C441E00, // 0112 MOVE R17 R15 + 0x60480013, // 0113 GETGBL R18 G19 + 0x7C400400, // 0114 CALL R16 2 + 0x7842000D, // 0115 JMPF R16 #0124 + 0x8C401F16, // 0116 GETMET R16 R15 K22 + 0x5848002F, // 0117 LDCONST R18 K47 + 0x7C400400, // 0118 CALL R16 2 + 0x78420009, // 0119 JMPF R16 #0124 + 0x00401D30, // 011A ADD R16 R14 K48 + 0x60440008, // 011B GETGBL R17 G8 + 0x5C480800, // 011C MOVE R18 R4 + 0x7C440200, // 011D CALL R17 1 + 0x60480013, // 011E GETGBL R18 G19 + 0x7C480000, // 011F CALL R18 0 + 0x984A0731, // 0120 SETIDX R18 K3 K49 + 0x984A5410, // 0121 SETIDX R18 K42 R16 + 0x980C2212, // 0122 SETIDX R3 R17 R18 + 0x00100905, // 0123 ADD R4 R4 K5 + 0x54420037, // 0124 LDINT R16 56 + 0x24400810, // 0125 GT R16 R4 R16 + 0x78420000, // 0126 JMPF R16 #0128 + 0x70020000, // 0127 JMP #0129 + 0x7001FFE4, // 0128 JMP #010E + 0xA8040001, // 0129 EXBLK 1 1 + 0x70020002, // 012A JMP #012E + 0x5834002B, // 012B LDCONST R13 K43 + 0xAC340200, // 012C CATCH R13 1 0 + 0xB0080000, // 012D RAISE 2 R0 R0 + 0x54120037, // 012E LDINT R4 56 + 0x60340010, // 012F GETGBL R13 G16 + 0x8C380126, // 0130 GETMET R14 R0 K38 + 0x5C401800, // 0131 MOVE R16 R12 + 0x7C380400, // 0132 CALL R14 2 + 0x7C340200, // 0133 CALL R13 1 + 0xA802001C, // 0134 EXBLK 0 #0152 + 0x5C381A00, // 0135 MOVE R14 R13 + 0x7C380000, // 0136 CALL R14 0 + 0x943C180E, // 0137 GETIDX R15 R12 R14 + 0x6040000F, // 0138 GETGBL R16 G15 + 0x5C441E00, // 0139 MOVE R17 R15 + 0x60480013, // 013A GETGBL R18 G19 + 0x7C400400, // 013B CALL R16 2 + 0x7842000D, // 013C JMPF R16 #014B + 0x8C401F16, // 013D GETMET R16 R15 K22 + 0x58480032, // 013E LDCONST R18 K50 + 0x7C400400, // 013F CALL R16 2 + 0x78420009, // 0140 JMPF R16 #014B + 0x00401D33, // 0141 ADD R16 R14 K51 + 0x60440008, // 0142 GETGBL R17 G8 + 0x5C480800, // 0143 MOVE R18 R4 + 0x7C440200, // 0144 CALL R17 1 + 0x60480013, // 0145 GETGBL R18 G19 + 0x7C480000, // 0146 CALL R18 0 + 0x984A0734, // 0147 SETIDX R18 K3 K52 + 0x984A5410, // 0148 SETIDX R18 K42 R16 + 0x980C2212, // 0149 SETIDX R3 R17 R18 + 0x00100905, // 014A ADD R4 R4 K5 + 0x5442003F, // 014B LDINT R16 64 + 0x24400810, // 014C GT R16 R4 R16 + 0x78420000, // 014D JMPF R16 #014F + 0x70020000, // 014E JMP #0150 + 0x7001FFE4, // 014F JMP #0135 + 0xA8040001, // 0150 EXBLK 1 1 + 0x70020002, // 0151 JMP #0155 + 0x5834002B, // 0152 LDCONST R13 K43 + 0xAC340200, // 0153 CATCH R13 1 0 + 0xB0080000, // 0154 RAISE 2 R0 R0 + 0x80040600, // 0155 RET 1 R3 }) ) ); From c4d90d46367f4a537452165d5c3009c79f1af18e Mon Sep 17 00:00:00 2001 From: s-hadinger <49731213+s-hadinger@users.noreply.github.com> Date: Tue, 9 May 2023 22:10:16 +0200 Subject: [PATCH 102/289] Berry suppress warnings (#18626) --- lib/libesp32/berry/default/be_re_lib.c | 24 +++++++++---------- lib/libesp32/berry/src/be_introspectlib.c | 4 ++-- lib/libesp32/berry/src/be_solidifylib.c | 6 ++--- .../src/solidify/solidified_Matter_TLV.h | 22 ++++++++--------- 4 files changed, 28 insertions(+), 28 deletions(-) diff --git a/lib/libesp32/berry/default/be_re_lib.c b/lib/libesp32/berry/default/be_re_lib.c index 956757858..f06a794b8 100644 --- a/lib/libesp32/berry/default/be_re_lib.c +++ b/lib/libesp32/berry/default/be_re_lib.c @@ -40,10 +40,10 @@ int be_re_compile(bvm *vm) { int32_t argc = be_top(vm); // Get the number of arguments if (argc >= 1 && be_isstring(vm, 1)) { const char * regex_str = be_tostring(vm, 1); - int sz = re1_5_sizecode(regex_str); - if (sz < 0) { + int sz = re1_5_sizecode(regex_str); + if (sz < 0) { be_raise(vm, "internal_error", "error in regex"); - } + } ByteProg *code = be_os_malloc(sizeof(ByteProg) + sz); int ret = re1_5_compilecode(code, regex_str); @@ -107,10 +107,10 @@ int be_re_match_search(bvm *vm, bbool is_anchored, bbool size_only) { if (offset >= hay_len) { be_return_nil(vm); } // any match of empty string returns nil, this catches implicitly when hay_len == 0 hay += offset; // shift to offset - int sz = re1_5_sizecode(regex_str); - if (sz < 0) { + int sz = re1_5_sizecode(regex_str); + if (sz < 0) { be_raise(vm, "internal_error", "error in regex"); - } + } ByteProg *code = be_os_malloc(sizeof(ByteProg) + sz); int ret = re1_5_compilecode(code, regex_str); @@ -132,10 +132,10 @@ int be_re_match_search_all(bvm *vm, bbool is_anchored) { if (argc >= 3) { limit = be_toint(vm, 3); } - int sz = re1_5_sizecode(regex_str); - if (sz < 0) { + int sz = re1_5_sizecode(regex_str); + if (sz < 0) { be_raise(vm, "internal_error", "error in regex"); - } + } ByteProg *code = be_os_malloc(sizeof(ByteProg) + sz); int ret = re1_5_compilecode(code, regex_str); @@ -322,10 +322,10 @@ int be_re_split(bvm *vm) { if (argc >= 3) { split_limit = be_toint(vm, 3); } - int sz = re1_5_sizecode(regex_str); - if (sz < 0) { + int sz = re1_5_sizecode(regex_str); + if (sz < 0) { be_raise(vm, "internal_error", "error in regex"); - } + } ByteProg *code = be_os_malloc(sizeof(ByteProg) + sz); int ret = re1_5_compilecode(code, regex_str); diff --git a/lib/libesp32/berry/src/be_introspectlib.c b/lib/libesp32/berry/src/be_introspectlib.c index 047815558..a87ce3932 100644 --- a/lib/libesp32/berry/src/be_introspectlib.c +++ b/lib/libesp32/berry/src/be_introspectlib.c @@ -109,7 +109,7 @@ static int m_toptr(bvm *vm) be_pushcomptr(vm, var_toobj(v)); be_return(vm); } else if (var_type(v) == BE_INT) { - be_pushcomptr(vm, (void*) var_toint(v)); + be_pushcomptr(vm, (void*) (intptr_t) var_toint(v)); be_return(vm); } else { be_raise(vm, "value_error", "unsupported for this type"); @@ -126,7 +126,7 @@ static int m_fromptr(bvm *vm) if (be_iscomptr(vm, 1)) { v = be_tocomptr(vm, 1); } else { - v = (void*) be_toint(vm, 1); + v = (void*) (intptr_t) be_toint(vm, 1); } if (v) { bgcobject *ptr = (bgcobject*)v; diff --git a/lib/libesp32/berry/src/be_solidifylib.c b/lib/libesp32/berry/src/be_solidifylib.c index 43d9107a3..ed3cea948 100644 --- a/lib/libesp32/berry/src/be_solidifylib.c +++ b/lib/libesp32/berry/src/be_solidifylib.c @@ -136,7 +136,7 @@ static void m_solidify_map(bvm *vm, bbool str_literal, bmap * map, const char *c #if BE_INTGER_TYPE == 2 logfmt(" { be_const_key_int(%lli, %i), ", node->key.v.i, key_next); #else - logfmt(" { be_const_key_int(%li, %i), ", node->key.v.i, key_next); + logfmt(" { be_const_key_int(%i, %i), ", node->key.v.i, key_next); #endif m_solidify_bvalue(vm, str_literal, &node->value, class_name, NULL, fout); } else { @@ -179,14 +179,14 @@ static void m_solidify_bvalue(bvm *vm, bbool str_literal, bvalue * value, const #if BE_INTGER_TYPE == 2 logfmt("be_const_int(%lli)", var_toint(value)); #else - logfmt("be_const_int(%li)", var_toint(value)); + logfmt("be_const_int(%i)", var_toint(value)); #endif break; case BE_INDEX: #if BE_INTGER_TYPE == 2 logfmt("be_const_var(%lli)", var_toint(value)); #else - logfmt("be_const_var(%li)", var_toint(value)); + logfmt("be_const_var(%i)", var_toint(value)); #endif break; case BE_REAL: diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_TLV.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_TLV.h index 6cc6300b0..b1e3292f3 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_TLV.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_TLV.h @@ -3282,18 +3282,18 @@ be_local_class(Matter_TLV, be_const_int(0), be_const_int(4), be_const_int(8), - be_const_int(4294967295), - be_const_int(4294967294), - be_const_int(4294967292), - be_const_int(4294967288), - be_const_int(4294967295), - be_const_int(4294967294), - be_const_int(4294967292), - be_const_int(4294967288), + be_const_int(-1), + be_const_int(-2), + be_const_int(-4), + be_const_int(-8), + be_const_int(-1), + be_const_int(-2), + be_const_int(-4), + be_const_int(-8), be_const_int(0), - be_const_int(4294967197), - be_const_int(4294967197), - be_const_int(4294967197), + be_const_int(-99), + be_const_int(-99), + be_const_int(-99), be_const_int(0), })) ) } )) }, { be_const_key_weak(EOC, -1), be_const_int(24) }, From 652a8edefa670223a17278eef1d7725d3cd1fcaa Mon Sep 17 00:00:00 2001 From: s-hadinger <49731213+s-hadinger@users.noreply.github.com> Date: Tue, 9 May 2023 22:21:39 +0200 Subject: [PATCH 103/289] Berry solidify for ubuntu 22.04 (#18627) --- lib/libesp32/berry_matter/solidify_all.be | 4 +--- lib/libesp32/berry_tasmota/solidify_all.be | 4 +--- lib/libesp32_lvgl/lv_binding_berry/solidify_all.be | 4 +--- 3 files changed, 3 insertions(+), 9 deletions(-) diff --git a/lib/libesp32/berry_matter/solidify_all.be b/lib/libesp32/berry_matter/solidify_all.be index 2d9bf3f45..0d69174b9 100755 --- a/lib/libesp32/berry_matter/solidify_all.be +++ b/lib/libesp32/berry_matter/solidify_all.be @@ -1,8 +1,6 @@ -#! ../berry/berry -s -g +#!/usr/bin/env -S ../berry/berry -s -g # # Berry solidify files -# -# `../berry/berry -s -g` import os import global diff --git a/lib/libesp32/berry_tasmota/solidify_all.be b/lib/libesp32/berry_tasmota/solidify_all.be index f24050a65..8f2575595 100755 --- a/lib/libesp32/berry_tasmota/solidify_all.be +++ b/lib/libesp32/berry_tasmota/solidify_all.be @@ -1,8 +1,6 @@ -#! ../berry/berry -s -g +#!/usr/bin/env -S ../berry/berry -s -g # # Berry solidify files -# -# `../berry/berry -s -g` import os import global diff --git a/lib/libesp32_lvgl/lv_binding_berry/solidify_all.be b/lib/libesp32_lvgl/lv_binding_berry/solidify_all.be index f4b397fc7..17332c091 100755 --- a/lib/libesp32_lvgl/lv_binding_berry/solidify_all.be +++ b/lib/libesp32_lvgl/lv_binding_berry/solidify_all.be @@ -1,8 +1,6 @@ -#! ../../libesp32/berry/berry -s -g +#!/usr/bin/env -S ../../libesp32/berry/berry -s -g # # Berry solidify files -# -# `../berry/berry -s -g` import os import global From 2c7369cb2d68cf5e484495958dbd8ada1dbdfa61 Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Tue, 9 May 2023 22:53:02 +0200 Subject: [PATCH 104/289] Use Ubuntu 22.04 for all steps The issue in Berry compile is fixed --- .github/workflows/Tasmota_build_devel.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/Tasmota_build_devel.yml b/.github/workflows/Tasmota_build_devel.yml index a496e831c..a8d382169 100644 --- a/.github/workflows/Tasmota_build_devel.yml +++ b/.github/workflows/Tasmota_build_devel.yml @@ -16,7 +16,7 @@ concurrency: jobs: be_solidify: - runs-on: ubuntu-20.04 + runs-on: ubuntu-latest if: github.repository == 'arendst/Tasmota' steps: - uses: actions/checkout@v3 From 367acfcb74cca7794515e59d24c1239fe795444a Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Tue, 9 May 2023 22:58:39 +0200 Subject: [PATCH 105/289] Use Ubuntu 22.04 for Berry workflow --- .github/workflows/Tasmota_build_master.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/Tasmota_build_master.yml b/.github/workflows/Tasmota_build_master.yml index d4386e54a..44868f8b1 100644 --- a/.github/workflows/Tasmota_build_master.yml +++ b/.github/workflows/Tasmota_build_master.yml @@ -15,7 +15,7 @@ concurrency: jobs: be_solidify: - runs-on: ubuntu-20.04 + runs-on: ubuntu-latest if: github.repository == 'arendst/Tasmota' steps: - uses: actions/checkout@v3 From 884b6713a8d4e0b241d17851945bdd45ec407fa5 Mon Sep 17 00:00:00 2001 From: s-hadinger <49731213+s-hadinger@users.noreply.github.com> Date: Tue, 9 May 2023 23:24:23 +0200 Subject: [PATCH 106/289] Berry fix energy (#18628) --- lib/libesp32/berry_tasmota/src/be_energylib.c | 1 + .../berry_tasmota/src/embedded/energy.be | 30 +++- .../src/solidify/solidified_energy.h | 139 ++++++++++++++---- 3 files changed, 137 insertions(+), 33 deletions(-) diff --git a/lib/libesp32/berry_tasmota/src/be_energylib.c b/lib/libesp32/berry_tasmota/src/be_energylib.c index ea3455a6a..3142872be 100644 --- a/lib/libesp32/berry_tasmota/src/be_energylib.c +++ b/lib/libesp32/berry_tasmota/src/be_energylib.c @@ -19,6 +19,7 @@ extern struct ENERGY Energy; module energy (scope: global) { init, closure(energy_init_closure) _ptr, comptr(&Energy) + _deref, closure(energy__deref_closure) read, closure(energy_read_closure) member, closure(energy_member_closure) diff --git a/lib/libesp32/berry_tasmota/src/embedded/energy.be b/lib/libesp32/berry_tasmota/src/embedded/energy.be index 8f1a93006..2f5bb2e1d 100644 --- a/lib/libesp32/berry_tasmota/src/embedded/energy.be +++ b/lib/libesp32/berry_tasmota/src/embedded/energy.be @@ -6,28 +6,48 @@ energy = module("energy") energy._ptr = nil def init(m) - import global - global._energy = energy_struct(m._ptr) + global._energy = nil return m end energy.init = init +def _deref() # dereference enery pointer + if global._energy == nil + import introspect + var p = bytes(energy._ptr, 4).get(0, 4) # dereference pointer + if p != 0 + global._energy = energy_struct(introspect.toptr(p)) + end + end +end +energy._deref = _deref + def read() - return _energy.tomap() + energy._deref() + if global._energy + return _energy.tomap() + end end energy.read = read def member(k) - return _energy.(k) + energy._deref() + if global._energy + return _energy.(k) + end end energy.member = member def setmember(k, v) - _energy.(k) = v + energy._deref() + if global._energy + _energy.(k) = v + end end energy.setmember = setmember #@ solidify:energy.init +#@ solidify:energy._deref #@ solidify:energy.read #@ solidify:energy.member #@ solidify:energy.setmember diff --git a/lib/libesp32/berry_tasmota/src/solidify/solidified_energy.h b/lib/libesp32/berry_tasmota/src/solidify/solidified_energy.h index 8478bf730..08a6022cd 100644 --- a/lib/libesp32/berry_tasmota/src/solidify/solidified_energy.h +++ b/lib/libesp32/berry_tasmota/src/solidify/solidified_energy.h @@ -9,7 +9,7 @@ ********************************************************************/ be_local_closure(energy_init, /* name */ be_nested_proto( - 4, /* nstack */ + 3, /* nstack */ 1, /* argc */ 0, /* varg */ 0, /* has upvals */ @@ -17,21 +17,75 @@ be_local_closure(energy_init, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[ 4]) { /* constants */ + ( &(const bvalue[ 2]) { /* constants */ /* K0 */ be_nested_str(global), /* K1 */ be_nested_str(_energy), - /* K2 */ be_nested_str(energy_struct), - /* K3 */ be_nested_str(_ptr), }), &be_const_str_init, &be_const_str_solidified, - ( &(const binstruction[ 6]) { /* code */ - 0xA4060000, // 0000 IMPORT R1 K0 - 0xB80A0400, // 0001 GETNGBL R2 K2 - 0x880C0103, // 0002 GETMBR R3 R0 K3 - 0x7C080200, // 0003 CALL R2 1 - 0x90060202, // 0004 SETMBR R1 K1 R2 - 0x80040000, // 0005 RET 1 R0 + ( &(const binstruction[ 4]) { /* code */ + 0xB8060000, // 0000 GETNGBL R1 K0 + 0x4C080000, // 0001 LDNIL R2 + 0x90060202, // 0002 SETMBR R1 K1 R2 + 0x80040000, // 0003 RET 1 R0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: _deref +********************************************************************/ +be_local_closure(energy__deref, /* name */ + be_nested_proto( + 7, /* nstack */ + 0, /* argc */ + 0, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 9]) { /* constants */ + /* K0 */ be_nested_str(global), + /* K1 */ be_nested_str(_energy), + /* K2 */ be_nested_str(introspect), + /* K3 */ be_nested_str(energy), + /* K4 */ be_nested_str(_ptr), + /* K5 */ be_nested_str(get), + /* K6 */ be_const_int(0), + /* K7 */ be_nested_str(energy_struct), + /* K8 */ be_nested_str(toptr), + }), + &be_const_str__deref, + &be_const_str_solidified, + ( &(const binstruction[25]) { /* code */ + 0xB8020000, // 0000 GETNGBL R0 K0 + 0x88000101, // 0001 GETMBR R0 R0 K1 + 0x4C040000, // 0002 LDNIL R1 + 0x1C000001, // 0003 EQ R0 R0 R1 + 0x78020012, // 0004 JMPF R0 #0018 + 0xA4020400, // 0005 IMPORT R0 K2 + 0x60040015, // 0006 GETGBL R1 G21 + 0xB80A0600, // 0007 GETNGBL R2 K3 + 0x88080504, // 0008 GETMBR R2 R2 K4 + 0x540E0003, // 0009 LDINT R3 4 + 0x7C040400, // 000A CALL R1 2 + 0x8C040305, // 000B GETMET R1 R1 K5 + 0x580C0006, // 000C LDCONST R3 K6 + 0x54120003, // 000D LDINT R4 4 + 0x7C040600, // 000E CALL R1 3 + 0x20080306, // 000F NE R2 R1 K6 + 0x780A0006, // 0010 JMPF R2 #0018 + 0xB80A0000, // 0011 GETNGBL R2 K0 + 0xB80E0E00, // 0012 GETNGBL R3 K7 + 0x8C100108, // 0013 GETMET R4 R0 K8 + 0x5C180200, // 0014 MOVE R6 R1 + 0x7C100400, // 0015 CALL R4 2 + 0x7C0C0200, // 0016 CALL R3 1 + 0x900A0203, // 0017 SETMBR R2 K1 R3 + 0x80000000, // 0018 RET 0 }) ) ); @@ -51,17 +105,27 @@ be_local_closure(energy_read, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[ 2]) { /* constants */ - /* K0 */ be_nested_str(_energy), - /* K1 */ be_nested_str(tomap), + ( &(const bvalue[ 5]) { /* constants */ + /* K0 */ be_nested_str(energy), + /* K1 */ be_nested_str(_deref), + /* K2 */ be_nested_str(global), + /* K3 */ be_nested_str(_energy), + /* K4 */ be_nested_str(tomap), }), &be_const_str_read, &be_const_str_solidified, - ( &(const binstruction[ 4]) { /* code */ + ( &(const binstruction[11]) { /* code */ 0xB8020000, // 0000 GETNGBL R0 K0 0x8C000101, // 0001 GETMET R0 R0 K1 0x7C000200, // 0002 CALL R0 1 - 0x80040000, // 0003 RET 1 R0 + 0xB8020400, // 0003 GETNGBL R0 K2 + 0x88000103, // 0004 GETMBR R0 R0 K3 + 0x78020003, // 0005 JMPF R0 #000A + 0xB8020600, // 0006 GETNGBL R0 K3 + 0x8C000104, // 0007 GETMET R0 R0 K4 + 0x7C000200, // 0008 CALL R0 1 + 0x80040000, // 0009 RET 1 R0 + 0x80000000, // 000A RET 0 }) ) ); @@ -73,7 +137,7 @@ be_local_closure(energy_read, /* name */ ********************************************************************/ be_local_closure(energy_member, /* name */ be_nested_proto( - 2, /* nstack */ + 3, /* nstack */ 1, /* argc */ 0, /* varg */ 0, /* has upvals */ @@ -81,15 +145,25 @@ be_local_closure(energy_member, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[ 1]) { /* constants */ - /* K0 */ be_nested_str(_energy), + ( &(const bvalue[ 4]) { /* constants */ + /* K0 */ be_nested_str(energy), + /* K1 */ be_nested_str(_deref), + /* K2 */ be_nested_str(global), + /* K3 */ be_nested_str(_energy), }), &be_const_str_member, &be_const_str_solidified, - ( &(const binstruction[ 3]) { /* code */ + ( &(const binstruction[10]) { /* code */ 0xB8060000, // 0000 GETNGBL R1 K0 - 0x88040200, // 0001 GETMBR R1 R1 R0 - 0x80040200, // 0002 RET 1 R1 + 0x8C040301, // 0001 GETMET R1 R1 K1 + 0x7C040200, // 0002 CALL R1 1 + 0xB8060400, // 0003 GETNGBL R1 K2 + 0x88040303, // 0004 GETMBR R1 R1 K3 + 0x78060002, // 0005 JMPF R1 #0009 + 0xB8060600, // 0006 GETNGBL R1 K3 + 0x88040200, // 0007 GETMBR R1 R1 R0 + 0x80040200, // 0008 RET 1 R1 + 0x80000000, // 0009 RET 0 }) ) ); @@ -101,7 +175,7 @@ be_local_closure(energy_member, /* name */ ********************************************************************/ be_local_closure(energy_setmember, /* name */ be_nested_proto( - 3, /* nstack */ + 4, /* nstack */ 2, /* argc */ 0, /* varg */ 0, /* has upvals */ @@ -109,15 +183,24 @@ be_local_closure(energy_setmember, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[ 1]) { /* constants */ - /* K0 */ be_nested_str(_energy), + ( &(const bvalue[ 4]) { /* constants */ + /* K0 */ be_nested_str(energy), + /* K1 */ be_nested_str(_deref), + /* K2 */ be_nested_str(global), + /* K3 */ be_nested_str(_energy), }), &be_const_str_setmember, &be_const_str_solidified, - ( &(const binstruction[ 3]) { /* code */ + ( &(const binstruction[ 9]) { /* code */ 0xB80A0000, // 0000 GETNGBL R2 K0 - 0x90080001, // 0001 SETMBR R2 R0 R1 - 0x80000000, // 0002 RET 0 + 0x8C080501, // 0001 GETMET R2 R2 K1 + 0x7C080200, // 0002 CALL R2 1 + 0xB80A0400, // 0003 GETNGBL R2 K2 + 0x88080503, // 0004 GETMBR R2 R2 K3 + 0x780A0001, // 0005 JMPF R2 #0008 + 0xB80A0600, // 0006 GETNGBL R2 K3 + 0x90080001, // 0007 SETMBR R2 R0 R1 + 0x80000000, // 0008 RET 0 }) ) ); From e672e2fe9ca1b87e6b0d58a8bc39cd2e6af6135a Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Tue, 9 May 2023 23:41:29 +0200 Subject: [PATCH 107/289] back to Ubuntu 20.04 --- .github/workflows/Tasmota_build_devel.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/Tasmota_build_devel.yml b/.github/workflows/Tasmota_build_devel.yml index a8d382169..a496e831c 100644 --- a/.github/workflows/Tasmota_build_devel.yml +++ b/.github/workflows/Tasmota_build_devel.yml @@ -16,7 +16,7 @@ concurrency: jobs: be_solidify: - runs-on: ubuntu-latest + runs-on: ubuntu-20.04 if: github.repository == 'arendst/Tasmota' steps: - uses: actions/checkout@v3 From bef49b46177d861f81805d6c0839e098f9576e0a Mon Sep 17 00:00:00 2001 From: TID Date: Wed, 10 May 2023 09:36:54 +0200 Subject: [PATCH 108/289] Update polish language (#18615) --- tasmota/language/pl_PL.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tasmota/language/pl_PL.h b/tasmota/language/pl_PL.h index db8330800..840a0a847 100644 --- a/tasmota/language/pl_PL.h +++ b/tasmota/language/pl_PL.h @@ -28,7 +28,7 @@ * Use online command StateText to translate ON, OFF, HOLD and TOGGLE. * Use online command Prefix to translate cmnd, stat and tele. * - * Updated until v12.3.1.4 - Last update 19.01.2023 + * Updated until v12.5.0.2 - Last update 08.05.2023 \*********************************************************************/ //#define LANGUAGE_MODULE_NAME // Enable to display "Module Generic" (ie Spanish), Disable to display "Generic Module" (ie English) @@ -104,7 +104,7 @@ #define D_FALLBACK_TOPIC "Temat zastępczy" #define D_FALSE "Fałsz" #define D_FILE "Plik" -#define D_FILE_SYSTEM_SIZE "File System Size" +#define D_FILE_SYSTEM_SIZE "Rozmiar systemu plików" #define D_FLOW_RATE "Przepływ" #define D_FRAGMENTATION "frag." // Lower case abbreviated version of fragmentation used in "memory fragmentation" #define D_FRAME_RATE "Frame rate" From 632176765d56299e19fb4ff05390f3b35de03215 Mon Sep 17 00:00:00 2001 From: Jeroen Date: Wed, 10 May 2023 09:38:27 +0200 Subject: [PATCH 109/289] Added define to adjust calibration precision. (#18613) Co-authored-by: JeroenSt --- tasmota/my_user_config.h | 1 + tasmota/tasmota_xsns_sensor/xsns_34_hx711.ino | 6 +++++- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/tasmota/my_user_config.h b/tasmota/my_user_config.h index df6d82b53..0f4c01480 100644 --- a/tasmota/my_user_config.h +++ b/tasmota/my_user_config.h @@ -991,6 +991,7 @@ // #define TM1638_MAX_LEDS 8 // Add support for 8 leds //#define USE_HX711 // Add support for HX711 load cell (+1k5 code) // #define USE_HX711_GUI // Add optional web GUI to HX711 as scale (+1k8 code) +// #define HX711_CAL_PRECISION 1 // When HX711 calibration is to course, raise this value //#define USE_DINGTIAN_RELAY // Add support for the Dingian board using 74'595 et 74'165 shift registers // #define DINGTIAN_INPUTS_INVERTED // Invert input states (Hi => OFF, Low => ON) diff --git a/tasmota/tasmota_xsns_sensor/xsns_34_hx711.ino b/tasmota/tasmota_xsns_sensor/xsns_34_hx711.ino index 0a833b6fa..f6c78d83c 100644 --- a/tasmota/tasmota_xsns_sensor/xsns_34_hx711.ino +++ b/tasmota/tasmota_xsns_sensor/xsns_34_hx711.ino @@ -43,6 +43,10 @@ #ifndef HX_SCALE #define HX_SCALE 120 // Default result of measured weight / reference weight when scale is 1 #endif +#ifndef HX711_CAL_PRECISION +#define HX711_CAL_PRECISION 1 // When calibration is to course, raise this value. +#endif + #define HX_TIMEOUT 120 // A reading at default 10Hz (pin RATE to Gnd on HX711) can take up to 100 milliseconds #define HX_SAMPLES 10 // Number of samples for average calculation @@ -340,7 +344,7 @@ void HxEvery100mSecond(void) { for (uint32_t i = 2; i < HX_SAMPLES -2; i++) { sum_raw += Hx.reads[i]; } - Hx.raw_absolute = sum_raw / (HX_SAMPLES -4); // Uncalibrated value + Hx.raw_absolute = (sum_raw / (HX_SAMPLES -4)) * HX711_CAL_PRECISION; // Uncalibrated value Hx.raw = Hx.raw_absolute / Hx.scale; // grams if ((0 == Settings->weight_user_tare) && Hx.tare_flg) { // Reset scale based on current load From 64e844d3874cf1b1fe49c68c1a7097af73f76130 Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Wed, 10 May 2023 11:28:59 +0200 Subject: [PATCH 110/289] Disable crashing GT911 driver (#18631) --- tasmota/include/tasmota_configurations_ESP32.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tasmota/include/tasmota_configurations_ESP32.h b/tasmota/include/tasmota_configurations_ESP32.h index 74108b8b1..2aaff8452 100644 --- a/tasmota/include/tasmota_configurations_ESP32.h +++ b/tasmota/include/tasmota_configurations_ESP32.h @@ -306,7 +306,7 @@ #define SHOW_SPLASH #define USE_XPT2046 #define USE_FT5206 -#define USE_GT911 +//#define USE_GT911 // TODO Fix GT911 Touch driver with LVGL HASPMOTA #define USE_MPU_ACCEL #define USE_RTC_CHIPS // Enable RTC chip support and NTP server - Select only one #define USE_BM8563 From 3c951d7751257f16cca93ded5a5215336067f9b6 Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Wed, 10 May 2023 14:02:51 +0200 Subject: [PATCH 111/289] fix GT911 crash in LVGL firmware (#18633) * fix GT911 crash * remove wrong frag when using GT911 --- tasmota/include/tasmota_configurations_ESP32.h | 2 +- tasmota/tasmota_support/support_esp.ino | 2 +- tasmota/tasmota_xdrv_driver/xdrv_01_9_webserver.ino | 4 ++++ 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/tasmota/include/tasmota_configurations_ESP32.h b/tasmota/include/tasmota_configurations_ESP32.h index 2aaff8452..74108b8b1 100644 --- a/tasmota/include/tasmota_configurations_ESP32.h +++ b/tasmota/include/tasmota_configurations_ESP32.h @@ -306,7 +306,7 @@ #define SHOW_SPLASH #define USE_XPT2046 #define USE_FT5206 -//#define USE_GT911 // TODO Fix GT911 Touch driver with LVGL HASPMOTA +#define USE_GT911 #define USE_MPU_ACCEL #define USE_RTC_CHIPS // Enable RTC chip support and NTP server - Select only one #define USE_BM8563 diff --git a/tasmota/tasmota_support/support_esp.ino b/tasmota/tasmota_support/support_esp.ino index 699b13208..4315ee5d4 100644 --- a/tasmota/tasmota_support/support_esp.ino +++ b/tasmota/tasmota_support/support_esp.ino @@ -673,7 +673,7 @@ uint32_t ESP_getFreeHeap(void) { uint32_t ESP_getMaxAllocHeap(void) { // arduino returns IRAM but we want only DRAM -#ifdef RGB_DISPLAY +#ifdef USE_GT911 // GT911 IRQ crashes with heap_caps_get_largest_free_block return ESP_getFreeHeap(); #endif uint32_t free_block_size = heap_caps_get_largest_free_block(MALLOC_CAP_INTERNAL | MALLOC_CAP_8BIT); diff --git a/tasmota/tasmota_xdrv_driver/xdrv_01_9_webserver.ino b/tasmota/tasmota_xdrv_driver/xdrv_01_9_webserver.ino index 01de3fe42..7b241a9c7 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_01_9_webserver.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_01_9_webserver.ino @@ -2466,7 +2466,11 @@ void HandleInformation(void) WSContentSend_P(PSTR("}1" D_PROGRAM_SIZE "}2%d KB"), ESP_getSketchSize() / 1024); WSContentSend_P(PSTR("}1" D_FREE_PROGRAM_SPACE "}2%d KB"), ESP_getFreeSketchSpace() / 1024); #ifdef ESP32 +#ifdef USE_GT911 + WSContentSend_PD(PSTR("}1" D_FREE_MEMORY "}2%1_f KB"), &freemem); +#else WSContentSend_PD(PSTR("}1" D_FREE_MEMORY "}2%1_f KB (" D_FRAGMENTATION " %d%%)"), &freemem, ESP_getHeapFragmentation()); +#endif // USE_GT911 if (UsePSRAM()) { WSContentSend_P(PSTR("}1" D_PSR_MAX_MEMORY "}2%d KB"), ESP.getPsramSize() / 1024); WSContentSend_P(PSTR("}1" D_PSR_FREE_MEMORY "}2%d KB"), ESP.getFreePsram() / 1024); From 3a6cd9b63c6bc3fc6e69654bec1901af5a9a3fa9 Mon Sep 17 00:00:00 2001 From: f-reiling Date: Wed, 10 May 2023 14:38:52 +0200 Subject: [PATCH 112/289] start modus tcp bridge automatically (#18634) * added default port for modbus tcp bridge to start automatically * updated ifdef style * renamed define for modbus default port --- tasmota/my_user_config.h | 5 +++-- tasmota/tasmota_xdrv_driver/xdrv_63_modbus_bridge.ino | 10 ++++++++++ 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/tasmota/my_user_config.h b/tasmota/my_user_config.h index 0f4c01480..4056ec8e1 100644 --- a/tasmota/my_user_config.h +++ b/tasmota/my_user_config.h @@ -799,8 +799,9 @@ //#define USE_DYP // Add support for DYP ME-007 ultrasonic distance sensor, serial port version (+0k5 code) #define USE_SERIAL_BRIDGE // Add support for software Serial Bridge (+2k code) // #define SERIAL_BRIDGE_BUFFER_SIZE 256 // Serial Bridge receive buffer size (Default ESP8266 = 256, ESP32 = 800) -//#define USE_MODBUS_BRIDGE // Add support for software Modbus Bridge (+4.5k code) -//#define USE_MODBUS_BRIDGE_TCP // Add support for software Modbus TCP Bridge (also enable Modbus TCP Bridge) (+2k code) +// #define USE_MODBUS_BRIDGE // Add support for software Modbus Bridge (+4.5k code) +// #define USE_MODBUS_BRIDGE_TCP // Add support for software Modbus TCP Bridge (also enable Modbus TCP Bridge) (+2k code) +// #define MODBUS_BRIDGE_TCP_DEFAULT_PORT 502 // Add support for software Modbus TCP Bridge (start the TCP bridge automatically at PORT 502) //#define USE_TCP_BRIDGE // Add support for Serial to TCP bridge (+1.3k code) //#define USE_MP3_PLAYER // Use of the DFPlayer Mini MP3 Player RB-DFR-562 commands: play, pause, stop, track, volume and reset #define MP3_VOLUME 30 // Set the startup volume on init, the range can be 0..100(max) diff --git a/tasmota/tasmota_xdrv_driver/xdrv_63_modbus_bridge.ino b/tasmota/tasmota_xdrv_driver/xdrv_63_modbus_bridge.ino index 0bd488981..194f6156b 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_63_modbus_bridge.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_63_modbus_bridge.ino @@ -574,6 +574,16 @@ void ModbusBridgeInit(void) ModbusBridgeAllocError(PSTR("TCP")); return; } +#ifdef MODBUS_BRIDGE_TCP_DEFAULT_PORT + else + { + AddLog(LOG_LEVEL_INFO, PSTR("MBS: MBRTCP Starting server on port %d"), MODBUS_BRIDGE_TCP_DEFAULT_PORT); + + modbusBridgeTCP.server_tcp = new WiFiServer(MODBUS_BRIDGE_TCP_DEFAULT_PORT); + modbusBridgeTCP.server_tcp->begin(); // start TCP server + modbusBridgeTCP.server_tcp->setNoDelay(true); + } +#endif #endif } } From 11bf16d162cf5cbd2def0b010c67dfeb2ed123b9 Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Wed, 10 May 2023 23:57:54 +0200 Subject: [PATCH 113/289] Github Actions refactor artifact Up-/Download (#18640) * multi artifact Up-/Download --- .github/workflows/Tasmota_build_devel.yml | 39 +++++++------------- .github/workflows/Tasmota_build_master.yml | 41 +++++++--------------- 2 files changed, 25 insertions(+), 55 deletions(-) diff --git a/.github/workflows/Tasmota_build_devel.yml b/.github/workflows/Tasmota_build_devel.yml index a496e831c..5b69980e8 100644 --- a/.github/workflows/Tasmota_build_devel.yml +++ b/.github/workflows/Tasmota_build_devel.yml @@ -38,18 +38,10 @@ jobs: run: | cd lib/libesp32_lvgl/lv_binding_berry ../../libesp32/berry/berry -s -g solidify_all.be - - uses: actions/upload-artifact@v3 + - uses: jason2866/upload-artifact@v2.0.2 with: - name: berry_matter - path: ./lib/libesp32/berry_matter/src/solidify - - uses: actions/upload-artifact@v3 - with: - name: berry_tasmota - path: ./lib/libesp32/berry_tasmota/src/solidify - - uses: actions/upload-artifact@v3 - with: - name: lvgl_tasmota - path: ./lib/libesp32_lvgl/lv_binding_berry/src/solidify + name: '["berry_matter", "berry_tasmota", "lvgl_tasmota"]' + path: '["./lib/libesp32/berry_matter/src/solidify", "./lib/libesp32/berry_tasmota/src/solidify", "./lib/libesp32_lvgl/lv_binding_berry/src/solidify"]' push_solidified: needs: be_solidify @@ -61,23 +53,16 @@ jobs: uses: actions/setup-python@v4 with: python-version: '3.x' - - name: Remove old solidified code - run: | - rm ./lib/libesp32/berry_matter/src/solidify/* - rm ./lib/libesp32/berry_tasmota/src/solidify/* - rm ./lib/libesp32_lvgl/lv_binding_berry/src/solidify/* - - uses: actions/download-artifact@v3 + - uses: jason2866/download-artifact@v3 with: - name: berry_matter - path: ./lib/libesp32/berry_matter/src/solidify - - uses: actions/download-artifact@v3 - with: - name: berry_tasmota - path: ./lib/libesp32/berry_tasmota/src/solidify - - uses: actions/download-artifact@v3 - with: - name: lvgl_tasmota - path: ./lib/libesp32_lvgl/lv_binding_berry/src/solidify + name: | + berry_matter + berry_tasmota + lvgl_tasmota + path: | + ./lib/libesp32/berry_matter/src/solidify + ./lib/libesp32/berry_tasmota/src/solidify + ./lib/libesp32_lvgl/lv_binding_berry/src/solidify - uses: stefanzweifel/git-auto-commit-action@v4 with: commit_message: Solidified Code updated diff --git a/.github/workflows/Tasmota_build_master.yml b/.github/workflows/Tasmota_build_master.yml index 44868f8b1..e7c8587aa 100644 --- a/.github/workflows/Tasmota_build_master.yml +++ b/.github/workflows/Tasmota_build_master.yml @@ -15,7 +15,7 @@ concurrency: jobs: be_solidify: - runs-on: ubuntu-latest + runs-on: ubuntu-20.04 if: github.repository == 'arendst/Tasmota' steps: - uses: actions/checkout@v3 @@ -37,18 +37,10 @@ jobs: run: | cd lib/libesp32_lvgl/lv_binding_berry ../../libesp32/berry/berry -s -g solidify_all.be - - uses: actions/upload-artifact@v3 + - uses: jason2866/upload-artifact@v2.0.2 with: - name: berry_matter - path: ./lib/libesp32/berry_matter/src/solidify - - uses: actions/upload-artifact@v3 - with: - name: berry_tasmota - path: ./lib/libesp32/berry_tasmota/src/solidify - - uses: actions/upload-artifact@v3 - with: - name: lvgl_tasmota - path: ./lib/libesp32_lvgl/lv_binding_berry/src/solidify + name: '["berry_matter", "berry_tasmota", "lvgl_tasmota"]' + path: '["./lib/libesp32/berry_matter/src/solidify", "./lib/libesp32/berry_tasmota/src/solidify", "./lib/libesp32_lvgl/lv_binding_berry/src/solidify"]' push_solidified: needs: be_solidify @@ -60,23 +52,16 @@ jobs: uses: actions/setup-python@v4 with: python-version: '3.x' - - name: Remove old solidified code - run: | - rm ./lib/libesp32/berry_matter/src/solidify/* - rm ./lib/libesp32/berry_tasmota/src/solidify/* - rm ./lib/libesp32_lvgl/lv_binding_berry/src/solidify/* - - uses: actions/download-artifact@v3 + - uses: jason2866/download-artifact@v3 with: - name: berry_matter - path: ./lib/libesp32/berry_matter/src/solidify - - uses: actions/download-artifact@v3 - with: - name: berry_tasmota - path: ./lib/libesp32/berry_tasmota/src/solidify - - uses: actions/download-artifact@v3 - with: - name: lvgl_tasmota - path: ./lib/libesp32_lvgl/lv_binding_berry/src/solidify + name: | + berry_matter + berry_tasmota + lvgl_tasmota + path: | + ./lib/libesp32/berry_matter/src/solidify + ./lib/libesp32/berry_tasmota/src/solidify + ./lib/libesp32_lvgl/lv_binding_berry/src/solidify - uses: stefanzweifel/git-auto-commit-action@v4 with: commit_message: Solidified Code updated From 79a826a206b86bf7dcf60a311f606c03a1799ad9 Mon Sep 17 00:00:00 2001 From: Christian Baars Date: Thu, 11 May 2023 09:28:33 +0200 Subject: [PATCH 114/289] Update xdrv_81_esp32_webcam.ino (#18637) --- tasmota/tasmota_xdrv_driver/xdrv_81_esp32_webcam.ino | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/tasmota/tasmota_xdrv_driver/xdrv_81_esp32_webcam.ino b/tasmota/tasmota_xdrv_driver/xdrv_81_esp32_webcam.ino index a8590a4da..465fb0a63 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_81_esp32_webcam.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_81_esp32_webcam.ino @@ -974,14 +974,14 @@ uint32_t WcSetStreamserver(uint32_t flag) { void WcInterruptControl() { WcSetStreamserver(Settings->webcam_config.stream); - WcSetup(Settings->webcam_config.resolution); + if(Wc.up != 0) {WcSetup(Settings->webcam_config.resolution);} } /*********************************************************************************************/ void WcLoop(void) { - if (4 == Wc.stream_active) { return; } + // if (4 == Wc.stream_active) { return; } if (Wc.CamServer) { Wc.CamServer->handleClient(); @@ -1042,11 +1042,10 @@ void WcShowStream(void) { // if (!Wc.CamServer || !Wc.up) { if (!Wc.CamServer) { WcInterruptControl(); - delay(50); // Give the webcam webserver some time to prepare the stream } - if (Wc.CamServer && Wc.up) { - WSContentSend_P(PSTR("

Webcam stream

"), - (uint32_t)WiFi.localIP()); + if (Wc.CamServer && Wc.up!=0) { + // Give the webcam webserver some time to prepare the stream - catch error in JS + WSContentSend_P(PSTR("

Webcam stream

"),(uint32_t)WiFi.localIP()); } } } @@ -1383,6 +1382,7 @@ void CmndWebcamClock(void){ } void CmndWebcamInit(void) { + Wc.up = 0; WcInterruptControl(); ResponseCmndDone(); } From 402306657e161c60c929991d973af5725001482e Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Thu, 11 May 2023 09:32:57 +0200 Subject: [PATCH 115/289] continue if solidify fails --- .github/workflows/Tasmota_build_devel.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/Tasmota_build_devel.yml b/.github/workflows/Tasmota_build_devel.yml index 5b69980e8..023165fda 100644 --- a/.github/workflows/Tasmota_build_devel.yml +++ b/.github/workflows/Tasmota_build_devel.yml @@ -18,6 +18,7 @@ jobs: be_solidify: runs-on: ubuntu-20.04 if: github.repository == 'arendst/Tasmota' + continue-on-error: true steps: - uses: actions/checkout@v3 - name: Set up Python @@ -47,6 +48,7 @@ jobs: needs: be_solidify runs-on: ubuntu-latest if: github.repository == 'arendst/Tasmota' + continue-on-error: true steps: - uses: actions/checkout@v3 - name: Set up Python From 71391d614cee0de51ac79c7f5b67fc1e766d9853 Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Thu, 11 May 2023 15:24:44 +0200 Subject: [PATCH 116/289] Use clang for solidify --- .github/workflows/Tasmota_build_devel.yml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.github/workflows/Tasmota_build_devel.yml b/.github/workflows/Tasmota_build_devel.yml index 023165fda..f633250dd 100644 --- a/.github/workflows/Tasmota_build_devel.yml +++ b/.github/workflows/Tasmota_build_devel.yml @@ -16,7 +16,7 @@ concurrency: jobs: be_solidify: - runs-on: ubuntu-20.04 + runs-on: ubuntu-latest if: github.repository == 'arendst/Tasmota' continue-on-error: true steps: @@ -25,6 +25,9 @@ jobs: uses: actions/setup-python@v4 with: python-version: '3.x' + - name: Install clang compiler + run: | + sudo apt-get install -f clang - name: Make Berry and Tasmota Berry code run: | cd lib/libesp32/berry From c776885691bb418c1325ae02e919556460b7cd4b Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Thu, 11 May 2023 16:21:33 +0200 Subject: [PATCH 117/289] clang for berry binary compile (#18641) --- lib/libesp32/berry/Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/libesp32/berry/Makefile b/lib/libesp32/berry/Makefile index 0847eb4b2..5907e22db 100755 --- a/lib/libesp32/berry/Makefile +++ b/lib/libesp32/berry/Makefile @@ -3,7 +3,7 @@ DEBUG_FLAGS = -O0 -g -DBE_DEBUG TEST_FLAGS = $(DEBUG_FLAGS) --coverage -fno-omit-frame-pointer -fsanitize=address -fsanitize=undefined LIBS = -lm TARGET = berry -CC = gcc +CC = clang # install clang!! gcc seems to produce a defect berry binary MKDIR = mkdir LFLAGS = From 86979646fff377a0acfdd88b1c7e1d202f97a5a6 Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Thu, 11 May 2023 18:10:52 +0200 Subject: [PATCH 118/289] Energy power delta report delayed Energy power delta report delayed by two seconds allowing hardware to stabilize (#17751) --- CHANGELOG.md | 2 ++ RELEASENOTES.md | 6 +++++- tasmota/tasmota_xdrv_driver/xdrv_03_energy.ino | 10 +++++++++- tasmota/tasmota_xdrv_driver/xdrv_03_esp32_energy.ino | 10 +++++++++- 4 files changed, 25 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 510561e5c..a1e19d50e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -20,6 +20,8 @@ All notable changes to this project will be documented in this file. ### Changed - ESP32 Framework (Core) from v2.0.8 to v2.0.9 - autoconf extract `display.ini` to file system +- IRremoteESP8266 library from v2.8.4 to v2.8.5 +- Energy power delta report delayed by two seconds allowing hardware to stabilize (#17751) ### Fixed - Partition_Manager.tapp fixed diff --git a/RELEASENOTES.md b/RELEASENOTES.md index 2490b7a56..9cc1ffd2b 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -127,10 +127,14 @@ The latter links can be used for OTA upgrades too like ``OtaUrl https://ota.tasm - Change command ``FileUpload`` index binary data detection from >199 to >299 ### Changed +- IRremoteESP8266 library from v2.8.4 to v2.8.5 - ESP32 Framework (Core) from v2.0.7 to v2.0.9 - Refactored Zero Cross Dimmer [#18481](https://github.com/arendst/Tasmota/issues/18481) +- Energy power delta report delayed by two seconds allowing hardware to stabilize [#17751](https://github.com/arendst/Tasmota/issues/17751) ### Fixed - ESP8266 Energy Export Active no update regression from v12.3.1.3 - NovaSDS GUI values [#18444](https://github.com/arendst/Tasmota/issues/18444) -- Berry fix rules for string comparisons [#18464](https://github.com/arendst/Tasmota/issues/18464) \ No newline at end of file +- Berry fix rules for string comparisons [#18464](https://github.com/arendst/Tasmota/issues/18464) +- Berry a rare condition when a GC causes a memory corruption +- Partition_Manager.tapp diff --git a/tasmota/tasmota_xdrv_driver/xdrv_03_energy.ino b/tasmota/tasmota_xdrv_driver/xdrv_03_energy.ino index 6fc75ec08..1ef4fbdd4 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_03_energy.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_03_energy.ino @@ -124,6 +124,7 @@ typedef struct { #ifdef USE_ENERGY_MARGIN_DETECTION uint16_t power_history[ENERGY_MAX_PHASES][3]; uint8_t power_steady_counter; // Allow for power on stabilization + uint8_t margin_stable; bool min_power_flag; bool max_power_flag; bool min_voltage_flag; @@ -556,7 +557,8 @@ void EnergyMarginCheck(void) { if (jsonflg) { ResponseJsonEndEnd(); MqttPublishPrefixTopicRulesProcess_P(TELE, PSTR(D_RSLT_MARGINS), MQTT_TELE_RETAIN); - EnergyMqttShow(); +// EnergyMqttShow(); + Energy->margin_stable = 3; // Allow 2 seconds to stabilize before reporting } #ifdef USE_ENERGY_POWER_LIMIT @@ -681,6 +683,12 @@ void EnergyEverySecond(void) { #ifdef USE_ENERGY_MARGIN_DETECTION EnergyMarginCheck(); + if (Energy->margin_stable) { + Energy->margin_stable--; + if (!Energy->margin_stable) { + EnergyMqttShow(); + } + } #endif // USE_ENERGY_MARGIN_DETECTION } diff --git a/tasmota/tasmota_xdrv_driver/xdrv_03_esp32_energy.ino b/tasmota/tasmota_xdrv_driver/xdrv_03_esp32_energy.ino index 2261c53f2..c7d8be494 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_03_esp32_energy.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_03_esp32_energy.ino @@ -176,6 +176,7 @@ typedef struct { uint8_t fifth_second; uint8_t command_code; uint8_t power_steady_counter; // Allow for power on stabilization + uint8_t margin_stable; uint8_t mplr_counter; uint8_t max_energy_state; @@ -772,7 +773,8 @@ void EnergyMarginCheck(void) { if (jsonflg) { ResponseJsonEndEnd(); MqttPublishPrefixTopicRulesProcess_P(TELE, PSTR(D_RSLT_MARGINS), MQTT_TELE_RETAIN); - EnergyMqttShow(); +// EnergyMqttShow(); + Energy->margin_stable = 3; // Allow 2 seconds to stabilize before reporting } // Max Power @@ -893,6 +895,12 @@ void EnergyEverySecond(void) { } EnergyMarginCheck(); + if (Energy->margin_stable) { + Energy->margin_stable--; + if (!Energy->margin_stable) { + EnergyMqttShow(); + } + } } /*********************************************************************************************\ From 979a15cf070b62fdf89684cad9a9336408ac6d99 Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Fri, 12 May 2023 11:06:20 +0200 Subject: [PATCH 119/289] run "coc" before solidify (#18643) * Run "coc" * change artifact order --- .github/workflows/Tasmota_build_devel.yml | 18 ++++++++++------ .github/workflows/Tasmota_build_master.yml | 25 +++++++++++++++------- lib/libesp32/berry/gen.sh | 2 +- 3 files changed, 29 insertions(+), 16 deletions(-) diff --git a/.github/workflows/Tasmota_build_devel.yml b/.github/workflows/Tasmota_build_devel.yml index f633250dd..d4a8c1d93 100644 --- a/.github/workflows/Tasmota_build_devel.yml +++ b/.github/workflows/Tasmota_build_devel.yml @@ -28,6 +28,10 @@ jobs: - name: Install clang compiler run: | sudo apt-get install -f clang + - name: Run coc + run: | + cd lib/libesp32/berry + ./gen.sh - name: Make Berry and Tasmota Berry code run: | cd lib/libesp32/berry @@ -44,8 +48,8 @@ jobs: ../../libesp32/berry/berry -s -g solidify_all.be - uses: jason2866/upload-artifact@v2.0.2 with: - name: '["berry_matter", "berry_tasmota", "lvgl_tasmota"]' - path: '["./lib/libesp32/berry_matter/src/solidify", "./lib/libesp32/berry_tasmota/src/solidify", "./lib/libesp32_lvgl/lv_binding_berry/src/solidify"]' + name: '["berry_tasmota", "berry_matter", "berry_lvgl"]' + path: '["./lib/libesp32/berry_tasmota/src/solidify", "./lib/libesp32/berry_matter/src/solidify", "./lib/libesp32_lvgl/lv_binding_berry/src/solidify"]' push_solidified: needs: be_solidify @@ -61,13 +65,13 @@ jobs: - uses: jason2866/download-artifact@v3 with: name: | - berry_matter berry_tasmota - lvgl_tasmota + berry_matter + berry_lvgl path: | - ./lib/libesp32/berry_matter/src/solidify - ./lib/libesp32/berry_tasmota/src/solidify - ./lib/libesp32_lvgl/lv_binding_berry/src/solidify + ./lib/libesp32/berry_tasmota/src/solidify + ./lib/libesp32/berry_matter/src/solidify + ./lib/libesp32_lvgl/lv_binding_berry/src/solidify - uses: stefanzweifel/git-auto-commit-action@v4 with: commit_message: Solidified Code updated diff --git a/.github/workflows/Tasmota_build_master.yml b/.github/workflows/Tasmota_build_master.yml index e7c8587aa..ee45b03d1 100644 --- a/.github/workflows/Tasmota_build_master.yml +++ b/.github/workflows/Tasmota_build_master.yml @@ -15,14 +15,22 @@ concurrency: jobs: be_solidify: - runs-on: ubuntu-20.04 + runs-on: ubuntu-latest if: github.repository == 'arendst/Tasmota' + continue-on-error: true steps: - uses: actions/checkout@v3 - name: Set up Python uses: actions/setup-python@v4 with: python-version: '3.x' + - name: Install clang compiler + run: | + sudo apt-get install -f clang + - name: Run coc + run: | + cd lib/libesp32/berry + ./gen.sh - name: Make Berry and Tasmota Berry code run: | cd lib/libesp32/berry @@ -39,13 +47,14 @@ jobs: ../../libesp32/berry/berry -s -g solidify_all.be - uses: jason2866/upload-artifact@v2.0.2 with: - name: '["berry_matter", "berry_tasmota", "lvgl_tasmota"]' - path: '["./lib/libesp32/berry_matter/src/solidify", "./lib/libesp32/berry_tasmota/src/solidify", "./lib/libesp32_lvgl/lv_binding_berry/src/solidify"]' + name: '["berry_tasmota", "berry_matter", "berry_lvgl"]' + path: '["./lib/libesp32/berry_tasmota/src/solidify", "./lib/libesp32/berry_matter/src/solidify", "./lib/libesp32_lvgl/lv_binding_berry/src/solidify"]' push_solidified: needs: be_solidify runs-on: ubuntu-latest if: github.repository == 'arendst/Tasmota' + continue-on-error: true steps: - uses: actions/checkout@v3 - name: Set up Python @@ -55,13 +64,13 @@ jobs: - uses: jason2866/download-artifact@v3 with: name: | - berry_matter berry_tasmota - lvgl_tasmota + berry_matter + berry_lvgl path: | - ./lib/libesp32/berry_matter/src/solidify - ./lib/libesp32/berry_tasmota/src/solidify - ./lib/libesp32_lvgl/lv_binding_berry/src/solidify + ./lib/libesp32/berry_tasmota/src/solidify + ./lib/libesp32/berry_matter/src/solidify + ./lib/libesp32_lvgl/lv_binding_berry/src/solidify - uses: stefanzweifel/git-auto-commit-action@v4 with: commit_message: Solidified Code updated diff --git a/lib/libesp32/berry/gen.sh b/lib/libesp32/berry/gen.sh index e67d6a426..ebf4163ef 100755 --- a/lib/libesp32/berry/gen.sh +++ b/lib/libesp32/berry/gen.sh @@ -4,5 +4,5 @@ # # Should be eventually included in the build process # -rm generate/be_*.h +rm -Rf ./generate/be_*.h python3 tools/coc/coc -o generate src default ../berry_tasmota/src ../berry_mapping/src ../berry_int64/src ../../libesp32_lvgl/lv_binding_berry/src ../../libesp32_lvgl/lv_binding_berry/src/solidify ../../libesp32_lvgl/lv_binding_berry/generate -c default/berry_conf.h From 9c819d6afb49321254c68656d24693c7139d6fd5 Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Fri, 12 May 2023 12:18:55 +0200 Subject: [PATCH 120/289] push changed coc generated files back in repo (#18644) --- .github/workflows/Tasmota_build_devel.yml | 6 ++++-- .github/workflows/Tasmota_build_master.yml | 6 ++++-- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/.github/workflows/Tasmota_build_devel.yml b/.github/workflows/Tasmota_build_devel.yml index d4a8c1d93..682f9913b 100644 --- a/.github/workflows/Tasmota_build_devel.yml +++ b/.github/workflows/Tasmota_build_devel.yml @@ -48,8 +48,8 @@ jobs: ../../libesp32/berry/berry -s -g solidify_all.be - uses: jason2866/upload-artifact@v2.0.2 with: - name: '["berry_tasmota", "berry_matter", "berry_lvgl"]' - path: '["./lib/libesp32/berry_tasmota/src/solidify", "./lib/libesp32/berry_matter/src/solidify", "./lib/libesp32_lvgl/lv_binding_berry/src/solidify"]' + name: '["berry_tasmota", "berry_matter", "berry_lvgl", "berry_header"]' + path: '["./lib/libesp32/berry_tasmota/src/solidify", "./lib/libesp32/berry_matter/src/solidify", "./lib/libesp32_lvgl/lv_binding_berry/src/solidify", "./lib/libesp32/berry/generate"]' push_solidified: needs: be_solidify @@ -68,10 +68,12 @@ jobs: berry_tasmota berry_matter berry_lvgl + berry_header path: | ./lib/libesp32/berry_tasmota/src/solidify ./lib/libesp32/berry_matter/src/solidify ./lib/libesp32_lvgl/lv_binding_berry/src/solidify + ./lib/libesp32/berry/generate - uses: stefanzweifel/git-auto-commit-action@v4 with: commit_message: Solidified Code updated diff --git a/.github/workflows/Tasmota_build_master.yml b/.github/workflows/Tasmota_build_master.yml index ee45b03d1..56cc4ff96 100644 --- a/.github/workflows/Tasmota_build_master.yml +++ b/.github/workflows/Tasmota_build_master.yml @@ -47,8 +47,8 @@ jobs: ../../libesp32/berry/berry -s -g solidify_all.be - uses: jason2866/upload-artifact@v2.0.2 with: - name: '["berry_tasmota", "berry_matter", "berry_lvgl"]' - path: '["./lib/libesp32/berry_tasmota/src/solidify", "./lib/libesp32/berry_matter/src/solidify", "./lib/libesp32_lvgl/lv_binding_berry/src/solidify"]' + name: '["berry_tasmota", "berry_matter", "berry_lvgl", "berry_header"]' + path: '["./lib/libesp32/berry_tasmota/src/solidify", "./lib/libesp32/berry_matter/src/solidify", "./lib/libesp32_lvgl/lv_binding_berry/src/solidify", "./lib/libesp32/berry/generate"]' push_solidified: needs: be_solidify @@ -67,10 +67,12 @@ jobs: berry_tasmota berry_matter berry_lvgl + berry_header path: | ./lib/libesp32/berry_tasmota/src/solidify ./lib/libesp32/berry_matter/src/solidify ./lib/libesp32_lvgl/lv_binding_berry/src/solidify + ./lib/libesp32/berry/generate - uses: stefanzweifel/git-auto-commit-action@v4 with: commit_message: Solidified Code updated From db1b9ffe49c3e5eb706a2f97ce66f54b472447e6 Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Fri, 12 May 2023 14:25:56 +0200 Subject: [PATCH 121/289] Update gen.sh --- lib/libesp32/berry/gen.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/libesp32/berry/gen.sh b/lib/libesp32/berry/gen.sh index ebf4163ef..2df6ad838 100755 --- a/lib/libesp32/berry/gen.sh +++ b/lib/libesp32/berry/gen.sh @@ -2,7 +2,7 @@ # # generate all precompiled Berry structures from multiple modules # -# Should be eventually included in the build process +# Included in the Platformio build process with `pio-tools/gen-berry-structures.py # rm -Rf ./generate/be_*.h -python3 tools/coc/coc -o generate src default ../berry_tasmota/src ../berry_mapping/src ../berry_int64/src ../../libesp32_lvgl/lv_binding_berry/src ../../libesp32_lvgl/lv_binding_berry/src/solidify ../../libesp32_lvgl/lv_binding_berry/generate -c default/berry_conf.h +python3 tools/coc/coc -o generate src default ../berry_tasmota/src ../berry_mapping/src ../berry_int64/src ../../libesp32_lvgl/lv_binding_berry/src ../berry_matter/src/solidify ../berry_matter/src ../../libesp32_lvgl/lv_binding_berry/src/solidify ../../libesp32_lvgl/lv_binding_berry/generate -c default/berry_conf.h From 0bf27e70fef10cef25f9d1dbf83208184f8eacd1 Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Sun, 14 May 2023 14:08:53 +0200 Subject: [PATCH 122/289] fix logic when init cam was successful (#18653) --- tasmota/tasmota_xdrv_driver/xdrv_81_esp32_webcam.ino | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tasmota/tasmota_xdrv_driver/xdrv_81_esp32_webcam.ino b/tasmota/tasmota_xdrv_driver/xdrv_81_esp32_webcam.ino index 465fb0a63..4697ab389 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_81_esp32_webcam.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_81_esp32_webcam.ino @@ -974,7 +974,7 @@ uint32_t WcSetStreamserver(uint32_t flag) { void WcInterruptControl() { WcSetStreamserver(Settings->webcam_config.stream); - if(Wc.up != 0) {WcSetup(Settings->webcam_config.resolution);} + if(Wc.up == 0) {WcSetup(Settings->webcam_config.resolution);} } /*********************************************************************************************/ From f860722eba679ff0b570b22ae29533697e5ffdac Mon Sep 17 00:00:00 2001 From: Jeroen Date: Sun, 14 May 2023 14:18:45 +0200 Subject: [PATCH 123/289] Added Endianess Parameter (#18650) https://github.com/arendst/Tasmota/discussions/18244 Co-authored-by: JeroenSt --- .../xdrv_63_modbus_bridge.ino | 45 ++++++++++++------- 1 file changed, 29 insertions(+), 16 deletions(-) diff --git a/tasmota/tasmota_xdrv_driver/xdrv_63_modbus_bridge.ino b/tasmota/tasmota_xdrv_driver/xdrv_63_modbus_bridge.ino index 194f6156b..1a1b60fe0 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_63_modbus_bridge.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_63_modbus_bridge.ino @@ -162,6 +162,7 @@ struct ModbusBridge ModbusBridgeFunctionCode functionCode = ModbusBridgeFunctionCode::mb_undefined; ModbusBridgeType type = ModbusBridgeType::mb_undefined; + ModbusBridgeEndian endian = ModbusBridgeEndian::mb_undefined; uint16_t dataCount = 0; // Number of bits or registers to read/write uint16_t byteCount = 0; // Number of bytes to read/write @@ -416,6 +417,8 @@ void ModbusBridgeHandle(void) else if (modbusBridge.type == ModbusBridgeType::mb_int32 || modbusBridge.type == ModbusBridgeType::mb_uint32 || modbusBridge.type == ModbusBridgeType::mb_float) data_count = (uint8_t)(((modbusBridge.count - 1) >> 5) + 1); } + + // Copy modbus data to requested variables type for (uint8_t count = 0; count < data_count; count++) { char svalue[MBR_MAX_VALUE_LENGTH + 1] = ""; @@ -423,9 +426,9 @@ void ModbusBridgeHandle(void) { // Convert next 4 bytes to float float value = 0; - if (modbusBridge.buffer[1] < 3) + if (modbusBridge.endian == ModbusBridgeEndian::mb_lsb) { - // In bit mode only convert returned bits to values + // In lsb mode swap bytes if (modbusBridge.buffer[2] - (count * 4)) ((uint8_t *)&value)[0] = modbusBridge.buffer[dataOffset + (count * 4)]; // Get float values if ((modbusBridge.buffer[2] - (count * 4)) >> 1) @@ -465,9 +468,9 @@ void ModbusBridgeHandle(void) (modbusBridge.type == ModbusBridgeType::mb_uint32)) { uint32_t value = 0; - if (modbusBridge.buffer[1] < 3) + if (modbusBridge.endian == ModbusBridgeEndian::mb_lsb) { - // In bit mode only convert returned bits to values + // In lsb mode swap bytes if (modbusBridge.buffer[2] - (count * 4)) ((uint8_t *)&value)[0] = modbusBridge.buffer[dataOffset + (count * 4)]; // Get uint values if (modbusBridge.buffer[2] - ((count * 4) - 1)) @@ -493,9 +496,9 @@ void ModbusBridgeHandle(void) (modbusBridge.type == ModbusBridgeType::mb_uint16)) { uint16_t value = 0; - if (modbusBridge.buffer[1] < 3) + if (modbusBridge.endian == ModbusBridgeEndian::mb_lsb) { - // In bit mode only convert returned bits to values + // In lsb mode swap bytes if (modbusBridge.buffer[2] - (count * 2)) ((uint8_t *)&value)[0] = modbusBridge.buffer[dataOffset + (count * 2)]; if (modbusBridge.buffer[2] - ((count * 2) - 1)) @@ -759,10 +762,20 @@ void CmndModbusBridgeSend(void) const char *stype = root.getStr(PSTR(D_JSON_MODBUS_TYPE), "uint8"); modbusBridge.count = root.getUInt(PSTR(D_JSON_MODBUS_COUNT), 1); // Number of values to read / write - + const char *sendian = root.getStr(PSTR(D_JSON_MODBUS_ENDIAN), "undefined"); + modbusBridge.endian = ModbusBridgeEndian::mb_undefined; + // If functioncode is 1, 2 or 15, the count is not the number of registers but the number // of bits to read or write, so calculate the number data bytes to read/write. - if ((functionCode == 1) || (functionCode == 2) || (functionCode == 15)) bitMode = true; + if ((functionCode == 1) || (functionCode == 2) || (functionCode == 15)) + { + bitMode = true; + modbusBridge.endian = ModbusBridgeEndian::mb_lsb; + } + + // Change endianess when specified + if (strcmp (sendian,"msb") == 0) modbusBridge.endian = ModbusBridgeEndian::mb_msb; + if (strcmp (sendian,"lsb") == 0) modbusBridge.endian = ModbusBridgeEndian::mb_lsb; if (modbusBridge.deviceAddress == 0) errorcode = ModbusBridgeError::wrongdeviceaddress; @@ -934,26 +947,26 @@ void CmndModbusBridgeSend(void) break; case ModbusBridgeType::mb_int16: - writeData[jsonDataArrayPointer] = bitMode ? ModbusBridgeSwapEndian16(jsonDataArray[jsonDataArrayPointer].getInt(0)) - : (int16_t)jsonDataArray[jsonDataArrayPointer].getInt(0); + writeData[jsonDataArrayPointer] = modbusBridge.endian != ModbusBridgeEndian::mb_lsb ? jsonDataArray[jsonDataArrayPointer].getInt(0) + : ModbusBridgeSwapEndian16(jsonDataArray[jsonDataArrayPointer].getInt(0)); break; case ModbusBridgeType::mb_uint16: - writeData[jsonDataArrayPointer] = bitMode ? ModbusBridgeSwapEndian16(jsonDataArray[jsonDataArrayPointer].getUInt(0)) - : (int16_t)jsonDataArray[jsonDataArrayPointer].getUInt(0); + writeData[jsonDataArrayPointer] = modbusBridge.endian != ModbusBridgeEndian::mb_lsb ? jsonDataArray[jsonDataArrayPointer].getUInt(0) + : ModbusBridgeSwapEndian16(jsonDataArray[jsonDataArrayPointer].getUInt(0)); break; case ModbusBridgeType::mb_int32: - writeData[(jsonDataArrayPointer * 2)] = bitMode ? ModbusBridgeSwapEndian16(jsonDataArray[jsonDataArrayPointer].getInt(0)) + writeData[(jsonDataArrayPointer * 2)] = modbusBridge.endian != ModbusBridgeEndian::mb_lsb ? ModbusBridgeSwapEndian16(jsonDataArray[jsonDataArrayPointer].getInt(0)) : (int16_t)(jsonDataArray[jsonDataArrayPointer].getInt(0) >> 16); - writeData[(jsonDataArrayPointer * 2) + 1] = bitMode ? ModbusBridgeSwapEndian16(jsonDataArray[jsonDataArrayPointer].getInt(0) >> 16) + writeData[(jsonDataArrayPointer * 2) + 1] = modbusBridge.endian != ModbusBridgeEndian::mb_lsb ? ModbusBridgeSwapEndian16(jsonDataArray[jsonDataArrayPointer].getInt(0) >> 16) : (uint16_t)(jsonDataArray[jsonDataArrayPointer].getInt(0)); break; case ModbusBridgeType::mb_uint32: - writeData[(jsonDataArrayPointer * 2)] = bitMode ? ModbusBridgeSwapEndian16(jsonDataArray[jsonDataArrayPointer].getUInt(0)) + writeData[(jsonDataArrayPointer * 2)] = modbusBridge.endian != ModbusBridgeEndian::mb_lsb ? ModbusBridgeSwapEndian16(jsonDataArray[jsonDataArrayPointer].getUInt(0)) : (uint16_t)(jsonDataArray[jsonDataArrayPointer].getUInt(0) >> 16); - writeData[(jsonDataArrayPointer * 2) + 1] = bitMode ? ModbusBridgeSwapEndian16(jsonDataArray[jsonDataArrayPointer].getUInt(0) >> 16) + writeData[(jsonDataArrayPointer * 2) + 1] = modbusBridge.endian != ModbusBridgeEndian::mb_lsb ? ModbusBridgeSwapEndian16(jsonDataArray[jsonDataArrayPointer].getUInt(0) >> 16) : (uint16_t)(jsonDataArray[jsonDataArrayPointer].getUInt(0)); break; From 885737a1fd024c2443c34bc5c3b04b8139e9d2aa Mon Sep 17 00:00:00 2001 From: CCTweaker <19865794+cctweaker@users.noreply.github.com> Date: Sun, 14 May 2023 15:19:39 +0300 Subject: [PATCH 124/289] Add support for PCA9557 8-bit IO expander (#18632) * add PCA9557 driver * text correction * added switches and buttons * update max devices to 8 * cleanup --- I2CDEVICES.md | 3 +- .../tasmota_xdrv_driver/xdrv_69_pca9557.ino | 536 ++++++++++++++++++ 2 files changed, 538 insertions(+), 1 deletion(-) create mode 100644 tasmota/tasmota_xdrv_driver/xdrv_69_pca9557.ino diff --git a/I2CDEVICES.md b/I2CDEVICES.md index 9faaea61c..88a14049d 100644 --- a/I2CDEVICES.md +++ b/I2CDEVICES.md @@ -115,4 +115,5 @@ Index | Define | Driver | Device | Address(es) | Description 77 | USE_MCP23XXX_DRV | xdrv_67 | MCP23x17 | 0x20 - 0x26 | 16-bit I/O expander as virtual button/switch/relay 78 | USE_PMSA003I | xsns_104 | PMSA003I | 0x12 | PM2.5 Air Quality Sensor with I2C Interface 79 | USE_GDK101 | xsns_106 | GDK101 | 0x18 - 0x1B | Gamma Radiation Sensor - 80 | USE_TC74 | xsns_108 | TC74 | 0x48 - 0x4F | Temperature sensor \ No newline at end of file + 80 | USE_TC74 | xsns_108 | TC74 | 0x48 - 0x4F | Temperature sensor + 81 | USE_PCA95XX_DRV | xdrv_69 | PCA95xx | 0x18 - 0x1F | 8-bit I/O expander as virtual relay \ No newline at end of file diff --git a/tasmota/tasmota_xdrv_driver/xdrv_69_pca9557.ino b/tasmota/tasmota_xdrv_driver/xdrv_69_pca9557.ino new file mode 100644 index 000000000..ca80512bf --- /dev/null +++ b/tasmota/tasmota_xdrv_driver/xdrv_69_pca9557.ino @@ -0,0 +1,536 @@ +/* + xdrv_69_pca95xx.ino - PCA9557 GPIO Expander support for Tasmota + + SPDX-FileCopyrightText: 2023 Theo Arends + + SPDX-License-Identifier: GPL-3.0-only +*/ + +#if defined(USE_I2C) +#ifdef USE_PCA9557_DRV +/*********************************************************************************************\ + * 8-bit PCA9557 I2C GPIO Expander to be used as virtual relay + * + * Docs at https://www.nxp.com/products/interfaces/ic-spi-i3c-interface-devices/general-purpose-i-o-gpio/8-bit-ic-bus-and-smbus-i-o-port-with-reset:PCA9557 + * + * I2C Addresses: 0x18 - 0x1F + * + * The goal of the driver is to provide a sequential list of pins configured as Tasmota template + * and handle any input and output as configured GPIOs. + * + * Restrictions: + * - Uses incremental I2C addresses until template pin count reached + * - Max support for 32 buttons (input) / 28 switches (input) / 32 relays (output) + * + * Supported template fields: + * NAME - Template name + * BASE - Optional. 0 = use relative relays (default), 1 = use absolute relays + * GPIO - Sequential list of pin 1 and up with configured GPIO function + * Function Code Description + * ------------------- -------- ---------------------------------------- + * None 0 Not used + * Button_n1..32 Bn 64..95 Button to Gnd without internal pullup + * Button_in1..32 Bin 128..159 Button inverted to Vcc without internal pullup + * Switch_n1..28 Sn 192..219 Switch to Gnd without internal pullup + * Relay1..32 R 224..255 Relay + * Relay_i1..32 Ri 256..287 Relay inverted + * Output_Hi Oh 3840 Fixed output high + * Output_lo Ol 3872 Fixed output low + * + * Prepare a template to be loaded either by: + * - a rule like: rule3 on file#pca9557.dat do {"NAME":"PCA9557","GPIO":[224,225,226,227,228,229,230,231]} endon + * - a script like: -y{"NAME":"PCA9557","GPIO":[224,225,226,227,228,229,230,231]} + * - file called pca9557.dat with contents: {"NAME":"PCA9557","GPIO":[224,225,226,227,228,229,230,231]} + * + * Inverted relays Ri1 Ri2 Ri3 Ri4 Ri5 Ri6 Ri7 Ri8 + * {"NAME":"PCA9557","GPIO":[256,257,258,259,260,261,262,263]} + * + * Inverted relays and buttons Ri8 Ri7 Ri6 Ri5 Ri4 Ri3 Ri2 Ri1 B1 B2 B3 B4 B5 B6 B7 B8 + * {"NAME":"PCA9557 A=Ri8-1, B=B1-8","GPIO":[263,262,261,260,259,258,257,256,32,33,34,35,36,37,38,39]} + * + * Buttons and relays B1 B2 B3 B4 R1 R2 R3 R4 + * {"NAME":"PCA9557 A=B1-8, B=R1-8","GPIO":[32,33,34,35,224,225,226,227]} + * + * 16 relays R1 R2 R3 R4 R5 R6 R7 R8 R9 R10 R11 R12 R13 R14 R15 R16 + * {"NAME":"PCA9557","GPIO":[224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239]} + * + * +\*********************************************************************************************/ + +#define XDRV_69 69 +#define XI2C_81 81 // See I2CDEVICES.md + +#define PCA9557_ADDR_START 0x18 // 24 +#define PCA9557_ADDR_END 0x20 // 32 (not included) + +#define PCA9557_MAX_DEVICES 8 + + +/*********************************************************************************************\ + * PCA9557 support +\*********************************************************************************************/ + +enum PCA9557Registers { + PCA9557_R0 = 0x00, // (R/ ) Register 0 - Input port register + PCA9557_R1 = 0x01, // (R/W) Register 1 - Output port register + PCA9557_R2 = 0x02, // (R/W) Register 2 - Polarity inversion register + PCA9557_R3 = 0x03, // (R/W) Register 3 - Configuration register +}; + +typedef struct { + uint8_t r1; + uint8_t address; + uint8_t pins; // 8 (PCA9557) +} tPca9557Device; + +struct PCA9557 { + tPca9557Device device[PCA9557_MAX_DEVICES]; + uint32_t relay_inverted; + uint32_t button_inverted; + uint8_t chip; + uint8_t max_devices; + uint8_t max_pins; + uint8_t relay_max; + uint8_t relay_offset; + uint8_t button_max; + uint8_t switch_max; + int8_t button_offset; + int8_t switch_offset; + bool base; +} Pca9557; + +uint16_t *Pca9557_gpio_pin = nullptr; + +/*********************************************************************************************\ + * PCA9557 - I2C +\*********************************************************************************************/ + +void PCA9557DumpRegs(void) { + uint8_t data[4]; + for (Pca9557.chip = 0; Pca9557.chip < Pca9557.max_devices; Pca9557.chip++) { + uint32_t data_size = sizeof(data); + I2cReadBuffer(Pca9557.device[Pca9557.chip].address, 0, data, data_size); + AddLog(LOG_LEVEL_DEBUG, PSTR("PCA: Intf %d, Address %02X, Regs %*_H"), Pca9557.device[Pca9557.chip].address, data_size, data); + } +} + +uint32_t PCA9557Read(uint8_t reg) { + uint32_t value = 0; + value = I2cRead8(Pca9557.device[Pca9557.chip].address, reg); + return value; +} + +bool PCA9557ValidRead(uint8_t reg, uint8_t *data) { + return I2cValidRead8(data, Pca9557.device[Pca9557.chip].address, reg); + return false; +} + +void PCA9557Write(uint8_t reg, uint8_t value) { + I2cWrite8(Pca9557.device[Pca9557.chip].address, reg, value); +} + +/*********************************************************************************************/ + +void PCA9557Update(uint8_t pin, bool pin_value, uint8_t reg_addr) { + // pin = 0 - 7 + uint8_t bit = pin % 8; + uint8_t reg_value = 0; + if (reg_addr == PCA9557_R1) { + reg_value = Pca9557.device[Pca9557.chip].r1; + } else { + reg_value = PCA9557Read(reg_addr); + } + if (pin_value) { + reg_value |= 1 << bit; + } else { + reg_value &= ~(1 << bit); + } + PCA9557Write(reg_addr, reg_value); + if (reg_addr == PCA9557_R1) { + Pca9557.device[Pca9557.chip].r1 = reg_value; + } +} + +/*********************************************************************************************/ + +uint32_t PCA9557SetChip(uint8_t pin) { + // Calculate chip based on number of pins per chip. 8 for PCA9557 + // pin 0 - 63 + for (Pca9557.chip = 0; Pca9557.chip < Pca9557.max_devices; Pca9557.chip++) { + if (Pca9557.device[Pca9557.chip].pins > pin) { break; } + pin -= Pca9557.device[Pca9557.chip].pins; + } + return pin; // relative pin number within chip (0 ... 7) +} + +void PCA9557PinMode(uint8_t pin, uint8_t flags) { + // pin 0 - 63 + pin = PCA9557SetChip(pin); + uint8_t iodir = PCA9557_R3; + switch (flags) { + case INPUT: + PCA9557Update(pin, true, iodir); + break; + case OUTPUT: + PCA9557Update(pin, false, iodir); + break; + } + +// AddLog(LOG_LEVEL_DEBUG, PSTR("DBG: PCA9557PinMode chip %d, pin %d, flags %d, regs %d"), Pca9557.chip, pin, flags, iodir); +} + + +void PCA9557SetPinModes(uint8_t pin, uint8_t flags) { + // pin 0 - 63 + PCA9557PinMode(pin, flags); +} + +bool PCA9557DigitalRead(uint8_t pin) { + // pin 0 - 63 + pin = PCA9557SetChip(pin); + uint8_t bit = pin % 8; + uint8_t reg_addr = PCA9557_R0; + uint8_t value = PCA9557Read(reg_addr); + return value & (1 << bit); +} + +void PCA9557DigitalWrite(uint8_t pin, bool value) { + // pin 0 - 63 + pin = PCA9557SetChip(pin); + uint8_t reg_addr = PCA9557_R1; + +// AddLog(LOG_LEVEL_DEBUG, PSTR("DBG: PCA9557DigitalWrite chip %d, pin %d, state %d, reg %d"), Pca9557.chip, pin, value, reg_addr); + + PCA9557Update(pin, value, reg_addr); +} + +/*********************************************************************************************\ + * Tasmota +\*********************************************************************************************/ + +int PCA9557Pin(uint32_t gpio, uint32_t index = 0); +int PCA9557Pin(uint32_t gpio, uint32_t index) { + uint16_t real_gpio = gpio << 5; + uint16_t mask = 0xFFE0; + if (index < GPIO_ANY) { + real_gpio += index; + mask = 0xFFFF; + } + for (uint32_t i = 0; i < Pca9557.max_pins; i++) { + if ((Pca9557_gpio_pin[i] & mask) == real_gpio) { + return i; // Pin number configured for gpio + } + } + return -1; // No pin used for gpio +} + +bool PCA9557PinUsed(uint32_t gpio, uint32_t index = 0); +bool PCA9557PinUsed(uint32_t gpio, uint32_t index) { + return (PCA9557Pin(gpio, index) >= 0); +} + +uint32_t PCA9557GetPin(uint32_t lpin) { + if (lpin < Pca9557.max_pins) { + return Pca9557_gpio_pin[lpin]; + } else { + return GPIO_NONE; + } +} + +/*********************************************************************************************/ + +String PCA9557TemplateLoadFile(void) { + String pcatmplt = ""; +#ifdef USE_UFILESYS + pcatmplt = TfsLoadString("/pca9557.dat"); +#endif // USE_UFILESYS +#ifdef USE_RULES + if (!pcatmplt.length()) { + pcatmplt = RuleLoadFile("PCA9557.DAT"); + } +#endif // USE_RULES +#ifdef USE_SCRIPT + if (!pcatmplt.length()) { + pcatmplt = ScriptLoadSection(">y"); + } +#endif // USE_SCRIPT + return pcatmplt; +} + +bool PCA9557LoadTemplate(void) { + String pcatmplt = PCA9557TemplateLoadFile(); + uint32_t len = pcatmplt.length() +1; + if (len < 7) { return false; } // No PcaTmplt found + + JsonParser parser((char*)pcatmplt.c_str()); + JsonParserObject root = parser.getRootObject(); + if (!root) { return false; } + + // rule3 on file#pca9557.dat do {"NAME":"PCA9557","GPIO":[32,33,34,35,36,37,38,39,224,225,226,227,228,229,230,231]} endon + // rule3 on file#pca9557.dat do {"NAME":"PCA9557","GPIO":[263,262,261,260,259,258,257,256,32,33,34,35,36,37,38,39]} endon + // rule3 on file#pca9557.dat do {"NAME":"PCA9557 A=Ri8-1, B=B1-8","GPIO":[263,262,261,260,259,258,257,256,32,33,34,35,36,37,38,39]} endon + // rule3 on file#pca9557.dat do {"NAME":"PCA9557 A=Ri8-1, B=B1-8, C=Ri16-9, D=B9-16","GPIO":[263,262,261,260,259,258,257,256,32,33,34,35,36,37,38,39,271,270,269,268,267,266,265,264,40,41,42,43,44,45,46,47]} endon + + // {"NAME":"PCA9557","GPIO":[32,33,34,35,36,37,38,39,224,225,226,227,228,229,230,231]} + // {"NAME":"PCA9557","GPIO":[32,33,34,35,36,37,38,39,224,225,226,227,228,229,230,231,40,41,42,43,44,45,46,47,232,233,234,235,236,237,238,239]} + JsonParserToken val = root[PSTR(D_JSON_BASE)]; + if (val) { + Pca9557.base = (val.getUInt()) ? true : false; + } + val = root[PSTR(D_JSON_NAME)]; + if (val) { + AddLog(LOG_LEVEL_DEBUG, PSTR("PCA: Base %d, Template '%s'"), Pca9557.base, val.getStr()); + } + JsonParserArray arr = root[PSTR(D_JSON_GPIO)]; + if (arr) { + uint32_t pin = 0; + for (pin; pin < Pca9557.max_pins; pin++) { // Max number of detected chip pins + JsonParserToken val = arr[pin]; + if (!val) { break; } + uint16_t mpin = val.getUInt(); + if (mpin) { // Above GPIO_NONE + if ((mpin >= AGPIO(GPIO_SWT1_NP)) && (mpin < (AGPIO(GPIO_SWT1_NP) + MAX_SWITCHES_SET))) { + mpin -= (AGPIO(GPIO_SWT1_NP) - AGPIO(GPIO_SWT1)); + Pca9557.switch_max++; + PCA9557SetPinModes(pin, INPUT); + } + else if ((mpin >= AGPIO(GPIO_KEY1_NP)) && (mpin < (AGPIO(GPIO_KEY1_NP) + MAX_KEYS_SET))) { + mpin -= (AGPIO(GPIO_KEY1_NP) - AGPIO(GPIO_KEY1)); + Pca9557.button_max++; + PCA9557SetPinModes(pin, INPUT); + } + else if ((mpin >= AGPIO(GPIO_KEY1_INV_NP)) && (mpin < (AGPIO(GPIO_KEY1_INV_NP) + MAX_KEYS_SET))) { + bitSet(Pca9557.button_inverted, mpin - AGPIO(GPIO_KEY1_INV_NP)); + mpin -= (AGPIO(GPIO_KEY1_INV_NP) - AGPIO(GPIO_KEY1)); + Pca9557.button_max++; + PCA9557SetPinModes(pin, INPUT); + } + else if ((mpin >= AGPIO(GPIO_REL1)) && (mpin < (AGPIO(GPIO_REL1) + MAX_RELAYS_SET))) { + Pca9557.relay_max++; + PCA9557PinMode(pin, OUTPUT); + } + else if ((mpin >= AGPIO(GPIO_REL1_INV)) && (mpin < (AGPIO(GPIO_REL1_INV) + MAX_RELAYS_SET))) { + bitSet(Pca9557.relay_inverted, mpin - AGPIO(GPIO_REL1_INV)); + mpin -= (AGPIO(GPIO_REL1_INV) - AGPIO(GPIO_REL1)); + Pca9557.relay_max++; + PCA9557PinMode(pin, OUTPUT); + } + else if (mpin == AGPIO(GPIO_OUTPUT_HI)) { + PCA9557PinMode(pin, OUTPUT); + PCA9557DigitalWrite(pin, 1); + } + else if (mpin == AGPIO(GPIO_OUTPUT_LO)) { + PCA9557PinMode(pin, OUTPUT); + PCA9557DigitalWrite(pin, 0); + } + else { mpin = 0; } + Pca9557_gpio_pin[pin] = mpin; + } + if ((Pca9557.switch_max >= MAX_SWITCHES_SET) || + (Pca9557.button_max >= MAX_KEYS_SET) || + (Pca9557.relay_max >= MAX_RELAYS_SET)) { + AddLog(LOG_LEVEL_INFO, PSTR("PCA: Max reached (S%d/B%d/R%d)"), Pca9557.switch_max, Pca9557.button_max, Pca9557.relay_max); + break; + } + } + Pca9557.max_pins = pin; // Max number of configured pins + } + +// AddLog(LOG_LEVEL_DEBUG, PSTR("PCA: Pins %d, Pca9557_gpio_pin %*_V"), Pca9557.max_pins, Pca9557.max_pins, (uint8_t*)Pca9557_gpio_pin); + + return true; +} + +uint32_t PCA9557TemplateGpio(void) { + String pcatmplt = PCA9557TemplateLoadFile(); + uint32_t len = pcatmplt.length() +1; + if (len < 7) { return 0; } // No PcaTmplt found + + JsonParser parser((char*)pcatmplt.c_str()); + JsonParserObject root = parser.getRootObject(); + if (!root) { return 0; } + + JsonParserArray arr = root[PSTR(D_JSON_GPIO)]; + if (arr.isArray()) { + return arr.size(); // Number of requested pins + } + return 0; +} + +void PCA9557ModuleInit(void) { + int32_t pins_needed = PCA9557TemplateGpio(); + if (!pins_needed) { + AddLog(LOG_LEVEL_DEBUG, PSTR("PCA: Invalid template")); + return; + } + + + uint8_t pca9557_address = PCA9557_ADDR_START; + while ((Pca9557.max_devices < PCA9557_MAX_DEVICES) && (pca9557_address < PCA9557_ADDR_END)) { + Pca9557.chip = Pca9557.max_devices; + if (I2cSetDevice(pca9557_address)) { + Pca9557.device[Pca9557.chip].address = pca9557_address; + + uint8_t buffer; + if (PCA9557ValidRead(PCA9557_R2, &buffer)) { + I2cSetActiveFound(pca9557_address, "PCA9557"); + Pca9557.device[Pca9557.chip].pins = 8; + PCA9557Write(PCA9557_R2, 0b00000000); // disable polarity inversion + Pca9557.max_devices++; + + Pca9557.max_pins += Pca9557.device[Pca9557.chip].pins; + pins_needed -= Pca9557.device[Pca9557.chip].pins; + } + } + if (pins_needed) { + pca9557_address++; + } else { + pca9557_address = PCA9557_ADDR_END; + } + } + + + if (!Pca9557.max_devices) { return; } + + Pca9557_gpio_pin = (uint16_t*)calloc(Pca9557.max_pins, 2); + if (!Pca9557_gpio_pin) { return; } + + if (!PCA9557LoadTemplate()) { + AddLog(LOG_LEVEL_INFO, PSTR("PCA: No valid template found")); // Too many GPIO's + Pca9557.max_devices = 0; + return; + } + + Pca9557.relay_offset = TasmotaGlobal.devices_present; + Pca9557.relay_max -= UpdateDevicesPresent(Pca9557.relay_max); + + Pca9557.button_offset = -1; + Pca9557.switch_offset = -1; +} + +void PCA9557ServiceInput(void) { + // I found no reliable way to receive interrupts; noise received at undefined moments - unstable usage + // Pca9557.interrupt = false; + // This works with no interrupt + uint32_t pin_offset = 0; + uint32_t gpio; + for (Pca9557.chip = 0; Pca9557.chip < Pca9557.max_devices; Pca9557.chip++) { + gpio = PCA9557Read(PCA9557_R0); // Read PCA9557 gpio + +// AddLog(LOG_LEVEL_DEBUG_MORE, PSTR("PCA: Chip %d, State %02X"), Pca9557.chip, gpio); + + uint32_t mask = 1; + for (uint32_t pin = 0; pin < Pca9557.device[Pca9557.chip].pins; pin++) { + uint32_t state = ((gpio & mask) != 0); + uint32_t lpin = PCA9557GetPin(pin_offset + pin); // 0 for None, 32 for KEY1, 160 for SWT1, 224 for REL1 + uint32_t index = lpin & 0x001F; // Max 32 buttons or switches + lpin = BGPIO(lpin); // UserSelectablePins number + if (GPIO_KEY1 == lpin) { + ButtonSetVirtualPinState(Pca9557.button_offset + index, (state != bitRead(Pca9557.button_inverted, index))); + } + else if (GPIO_SWT1 == lpin) { + SwitchSetVirtualPinState(Pca9557.switch_offset + index, state); + } + mask <<= 1; + } + pin_offset += Pca9557.device[Pca9557.chip].pins; + } +} + +void PCA9557Init(void) { + PCA9557Write(PCA9557_R2, 0b00000000); // disable polarity inversion +} + +void PCA9557Power(void) { + // XdrvMailbox.index = 32-bit rpower bit mask + // Use absolute relay indexes unique with main template + power_t rpower = XdrvMailbox.index; + uint32_t relay_max = TasmotaGlobal.devices_present; + if (!Pca9557.base) { + // Use relative and sequential relay indexes + rpower >>= Pca9557.relay_offset; + relay_max = Pca9557.relay_max; + } + for (uint32_t index = 0; index < relay_max; index++) { + power_t state = rpower &1; + if (PCA9557PinUsed(GPIO_REL1, index)) { + uint32_t pin = PCA9557Pin(GPIO_REL1, index) & 0x3F; // Fix possible overflow over 63 gpios + PCA9557DigitalWrite(pin, bitRead(Pca9557.relay_inverted, index) ? !state : state); + } + rpower >>= 1; // Select next power + } +} + + +bool PCA9557AddButton(void) { + // XdrvMailbox.index = button/switch index + uint32_t index = XdrvMailbox.index; + if (!Pca9557.base) { + // Use relative and sequential button indexes + if (Pca9557.button_offset < 0) { Pca9557.button_offset = index; } + index -= Pca9557.button_offset; + if (index >= Pca9557.button_max) { return false; } + } else { + // Use absolute button indexes unique with main template + if (!PCA9557PinUsed(GPIO_KEY1, index)) { return false; } + Pca9557.button_offset = 0; + } + XdrvMailbox.index = (PCA9557DigitalRead(PCA9557Pin(GPIO_KEY1, index)) != bitRead(Pca9557.button_inverted, index)); + return true; +} + +bool PCA9557AddSwitch(void) { + // XdrvMailbox.index = button/switch index + uint32_t index = XdrvMailbox.index; + if (!Pca9557.base) { + // Use relative and sequential switch indexes + if (Pca9557.switch_offset < 0) { Pca9557.switch_offset = index; } + index -= Pca9557.switch_offset; + if (index >= Pca9557.switch_max) { return false; } + } else { + // Use absolute switch indexes unique with main template + if (!PCA9557PinUsed(GPIO_SWT1, index)) { return false; } + Pca9557.switch_offset = 0; + } + XdrvMailbox.index = PCA9557DigitalRead(PCA9557Pin(GPIO_SWT1, index)); + return true; +} +/*********************************************************************************************\ + * Interface +\*********************************************************************************************/ + +bool Xdrv69(uint32_t function) { + bool i2c_enabled = false; + i2c_enabled = I2cEnabled(XI2C_81); + if (!i2c_enabled) { return false; } + + bool result = false; + + if (FUNC_SETUP_RING2 == function) { + PCA9557ModuleInit(); + } else if (Pca9557.max_devices) { + switch (function) { + case FUNC_EVERY_100_MSECOND: + if (Pca9557.button_max || Pca9557.switch_max) { + PCA9557ServiceInput(); + } + break; + case FUNC_SET_POWER: + PCA9557Power(); + break; + case FUNC_INIT: + PCA9557Init(); + break; + case FUNC_ADD_BUTTON: + result = PCA9557AddButton(); + break; + case FUNC_ADD_SWITCH: + result = PCA9557AddSwitch(); + break; + } + } + return result; +} + +#endif // USE_PCA9557_DRV +#endif // USE_I2C From 7cad4f95b6339bec9f64977eacdc6b128c030cd1 Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Sun, 14 May 2023 14:42:11 +0200 Subject: [PATCH 125/289] Enable I2c on webcam --- tasmota/include/tasmota_configurations_ESP32.h | 2 +- tasmota/tasmota_support/support_tasmota.ino | 8 ++++++++ tasmota/tasmota_xdrv_driver/xdrv_81_esp32_webcam.ino | 2 +- 3 files changed, 10 insertions(+), 2 deletions(-) diff --git a/tasmota/include/tasmota_configurations_ESP32.h b/tasmota/include/tasmota_configurations_ESP32.h index 74108b8b1..04a563c5c 100644 --- a/tasmota/include/tasmota_configurations_ESP32.h +++ b/tasmota/include/tasmota_configurations_ESP32.h @@ -205,7 +205,7 @@ #define USE_SPI #define USE_SDCARD -#undef USE_I2C +#define USE_I2C #undef USE_HOME_ASSISTANT #define USE_TASMOTA_DISCOVERY // Enable Tasmota Discovery support (+2k code) #undef USE_DOMOTICZ diff --git a/tasmota/tasmota_support/support_tasmota.ino b/tasmota/tasmota_support/support_tasmota.ino index c3cec04fd..2abe41635 100644 --- a/tasmota/tasmota_support/support_tasmota.ino +++ b/tasmota/tasmota_support/support_tasmota.ino @@ -2221,11 +2221,19 @@ void GpioInit(void) TasmotaGlobal.i2c_enabled = (PinUsed(GPIO_I2C_SCL) && PinUsed(GPIO_I2C_SDA)); if (TasmotaGlobal.i2c_enabled) { TasmotaGlobal.i2c_enabled = I2cBegin(Pin(GPIO_I2C_SDA), Pin(GPIO_I2C_SCL)); +#ifdef ESP32 + if (TasmotaGlobal.i2c_enabled) { + AddLog(LOG_LEVEL_DEBUG, PSTR("I2C: Pins bus1 SCL %d, SDA %d"), Pin(GPIO_I2C_SCL), Pin(GPIO_I2C_SDA)); + } +#endif } #ifdef ESP32 TasmotaGlobal.i2c_enabled_2 = (PinUsed(GPIO_I2C_SCL, 1) && PinUsed(GPIO_I2C_SDA, 1)); if (TasmotaGlobal.i2c_enabled_2) { TasmotaGlobal.i2c_enabled_2 = I2c2Begin(Pin(GPIO_I2C_SDA, 1), Pin(GPIO_I2C_SCL, 1)); + if (TasmotaGlobal.i2c_enabled_2) { + AddLog(LOG_LEVEL_DEBUG, PSTR("I2C: Pins bus2 SCL %d, SDA %d"), Pin(GPIO_I2C_SCL, 1), Pin(GPIO_I2C_SDA, 1)); + } } #endif #endif // USE_I2C diff --git a/tasmota/tasmota_xdrv_driver/xdrv_81_esp32_webcam.ino b/tasmota/tasmota_xdrv_driver/xdrv_81_esp32_webcam.ino index 4697ab389..d9708abf0 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_81_esp32_webcam.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_81_esp32_webcam.ino @@ -347,7 +347,7 @@ uint32_t WcSetup(int32_t fsiz) { if(TasmotaGlobal.i2c_enabled_2){ // configure SIOD and SIOC as SDA,2 and SCL,2 config.sccb_i2c_port = 1; // reuse initialized bus 2, can be shared now if(config.pin_sccb_sda < 0){ // GPIO_WEBCAM_SIOD must not be set to really make it happen - AddLog(LOG_LEVEL_INFO, PSTR("CAM: use I2C bus 2")); + AddLog(LOG_LEVEL_INFO, PSTR("CAM: Use I2C bus2")); } } config.pin_pwdn = Pin(GPIO_WEBCAM_PWDN); // PWDN_GPIO_NUM; From f1a9a0b45bf4eae697ad12eb3adf20e852bce9e6 Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Sun, 14 May 2023 15:08:09 +0200 Subject: [PATCH 126/289] Add support for PCA9557 Add support for PCA9557 8-bit I/O expander (#18632) --- BUILDS.md | 1 + CHANGELOG.md | 1 + I2CDEVICES.md | 2 +- RELEASENOTES.md | 1 + tasmota/my_user_config.h | 1 + tasmota/tasmota_support/support_features.ino | 4 +++- tasmota/tasmota_xdrv_driver/xdrv_69_pca9557.ino | 6 +++--- tools/decode-status.py | 4 ++-- 8 files changed, 13 insertions(+), 7 deletions(-) diff --git a/BUILDS.md b/BUILDS.md index 32aa08d78..bb6569951 100644 --- a/BUILDS.md +++ b/BUILDS.md @@ -149,6 +149,7 @@ Note: `minimal` variant is not listed as it shouldn't be used outside of the [up | USE_LOX_O2 | - | - / x | - | x | - | - | | USE_GDK101 | - | - / - | - | - | - | - | | USE_TC74 | - | - / - | - | - | - | - | +| USE_PCA9557 | - | - / - | - | - | - | - | | | | | | | | | | Feature or Sensor | l | t | k | s | i | d | Remarks | USE_HIH6 | - | - / x | - | x | - | - | diff --git a/CHANGELOG.md b/CHANGELOG.md index a1e19d50e..e0bd12892 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,6 +13,7 @@ All notable changes to this project will be documented in this file. - Berry `tcpclientasync` class for non-blocking TCP client - Support for GM861 1D and 2D bar code reader (#18399) - Berry `re` (regex) add `match2` and optional offset +- Support for PCA9557 8-bit I/O expander (#18632) ### Breaking Changed - Change command ``FileUpload`` index binary data detection from >199 to >299 diff --git a/I2CDEVICES.md b/I2CDEVICES.md index 88a14049d..b7e806eea 100644 --- a/I2CDEVICES.md +++ b/I2CDEVICES.md @@ -116,4 +116,4 @@ Index | Define | Driver | Device | Address(es) | Description 78 | USE_PMSA003I | xsns_104 | PMSA003I | 0x12 | PM2.5 Air Quality Sensor with I2C Interface 79 | USE_GDK101 | xsns_106 | GDK101 | 0x18 - 0x1B | Gamma Radiation Sensor 80 | USE_TC74 | xsns_108 | TC74 | 0x48 - 0x4F | Temperature sensor - 81 | USE_PCA95XX_DRV | xdrv_69 | PCA95xx | 0x18 - 0x1F | 8-bit I/O expander as virtual relay \ No newline at end of file + 81 | USE_PCA9557 | xdrv_69 | PCA95xx | 0x18 - 0x1F | 8-bit I/O expander as virtual button/switch/relay \ No newline at end of file diff --git a/RELEASENOTES.md b/RELEASENOTES.md index 9cc1ffd2b..8cbe8a078 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -115,6 +115,7 @@ The latter links can be used for OTA upgrades too like ``OtaUrl https://ota.tasm - Command ``SetOption152 0/1`` to select two (0 = default) pin bistable or one (1) pin latching relay control [#18386](https://github.com/arendst/Tasmota/issues/18386) - Support for TC74 temperature sensor by Michael Loftis [#18042](https://github.com/arendst/Tasmota/issues/18042) - Support for GM861 1D and 2D bar code reader [#18399](https://github.com/arendst/Tasmota/issues/18399) +- Support for PCA9557 8-bit I/O expander [#18632](https://github.com/arendst/Tasmota/issues/18632) - Matter sensors Humidity, Pressure, Illuminance [#18441](https://github.com/arendst/Tasmota/issues/18441) - Matter allow `Matter#Initialized` rule once the device is configured [#18451](https://github.com/arendst/Tasmota/issues/18451) - Matter UI to change endpoints configuration [#18498](https://github.com/arendst/Tasmota/issues/18498) diff --git a/tasmota/my_user_config.h b/tasmota/my_user_config.h index 4056ec8e1..15013780e 100644 --- a/tasmota/my_user_config.h +++ b/tasmota/my_user_config.h @@ -710,6 +710,7 @@ // #define TC74_MAX_SENSORS 8 // Support non-default/multiple I2C addresses // #define TC74_I2C_PROBE_ADDRESSES { 0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F } // Addresses to probe/support // #define TC74_MAX_FAILCOUNT 8 // Maximum failed polls before it's marked inactive until reprobing later +// #define USE_PCA9557 // [I2cDriver81] Enable PCA9557 8-bit I/O Expander (I2C addresses 0x18 - 0x1F) (+2k5 code) // #define USE_RTC_CHIPS // Enable RTC chip support and NTP server - Select only one // #define USE_DS3231 // [I2cDriver26] Enable DS3231 RTC (I2C address 0x68) (+1k2 code) diff --git a/tasmota/tasmota_support/support_features.ino b/tasmota/tasmota_support/support_features.ino index e19a74c86..690bb2d89 100644 --- a/tasmota/tasmota_support/support_features.ino +++ b/tasmota/tasmota_support/support_features.ino @@ -894,7 +894,9 @@ void ResponseAppendFeatures(void) #if defined(USE_I2C) && defined(USE_TC74) feature9 |= 0x00400000; // xsns_108_tc74.ino #endif -// feature9 |= 0x00800000; +#if defined(USE_I2C) && defined(USE_PCA9557) + feature9 |= 0x00800000; // xdrv_69_pca9557.ino +#endif // feature9 |= 0x01000000; // feature9 |= 0x02000000; diff --git a/tasmota/tasmota_xdrv_driver/xdrv_69_pca9557.ino b/tasmota/tasmota_xdrv_driver/xdrv_69_pca9557.ino index ca80512bf..190fb0e34 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_69_pca9557.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_69_pca9557.ino @@ -1,13 +1,13 @@ /* - xdrv_69_pca95xx.ino - PCA9557 GPIO Expander support for Tasmota + xdrv_69_pca9557.ino - PCA9557 GPIO Expander support for Tasmota SPDX-FileCopyrightText: 2023 Theo Arends SPDX-License-Identifier: GPL-3.0-only */ -#if defined(USE_I2C) -#ifdef USE_PCA9557_DRV +#ifdef USE_I2C +#ifdef USE_PCA9557 /*********************************************************************************************\ * 8-bit PCA9557 I2C GPIO Expander to be used as virtual relay * diff --git a/tools/decode-status.py b/tools/decode-status.py index 8ff87b7bf..2b6164fca 100755 --- a/tools/decode-status.py +++ b/tools/decode-status.py @@ -295,7 +295,7 @@ a_features = [[ "USE_DINGTIAN_RELAY","USE_HMC5883L","USE_LD2410","USE_ME007", "USE_DISPLAY_TM1650","USE_PCA9632","USE_TUYAMCUBR","USE_SEN5X", "USE_BIOPDU","USE_MCP23XXX_DRV","USE_PMSA003I","USE_LOX_O2", - "USE_GDK101","USE_GM861","USE_TC74","", + "USE_GDK101","USE_GM861","USE_TC74","USE_PCA9557", "","","","", "","","","" ]] @@ -325,7 +325,7 @@ else: obj = json.load(fp) def StartDecode(): - print ("\n*** decode-status.py v12.5.0.1 by Theo Arends and Jacek Ziolkowski ***") + print ("\n*** decode-status.py v12.5.0.2 by Theo Arends and Jacek Ziolkowski ***") # print("Decoding\n{}".format(obj)) From 9b8f3b6b4c688323a5fa722e5a46a89967d69a65 Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Sun, 14 May 2023 15:21:19 +0200 Subject: [PATCH 127/289] Add command I2CScan0 Add command I2CScan0 to scan both busses if available --- tasmota/tasmota_support/support_command.ino | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/tasmota/tasmota_support/support_command.ino b/tasmota/tasmota_support/support_command.ino index c19314725..3f31dddc8 100644 --- a/tasmota/tasmota_support/support_command.ino +++ b/tasmota/tasmota_support/support_command.ino @@ -2567,14 +2567,20 @@ void CmndDnsTimeout(void) { } #ifdef USE_I2C -void CmndI2cScan(void) -{ - if ((1 == XdrvMailbox.index) && (TasmotaGlobal.i2c_enabled)) { - I2cScan(); +void CmndI2cScan(void) { + // I2CScan0 - Scan bus1 and bus2 + // I2CScan - Scan bus1 + // I2CScan2 - Scan bus2 + if (TasmotaGlobal.i2c_enabled) { + if ((0 == XdrvMailbox.index) || (1 == XdrvMailbox.index)) { + I2cScan(); + } } #ifdef ESP32 - if ((2 == XdrvMailbox.index) && (TasmotaGlobal.i2c_enabled_2)) { - I2cScan(1); + if (TasmotaGlobal.i2c_enabled_2) { + if ((0 == XdrvMailbox.index) || (2 == XdrvMailbox.index)) { + I2cScan(1); + } } #endif } From 951b9b4682c857f2c37a3695e5dc67aa7186f9ae Mon Sep 17 00:00:00 2001 From: s-hadinger <49731213+s-hadinger@users.noreply.github.com> Date: Sun, 14 May 2023 23:02:58 +0200 Subject: [PATCH 128/289] Matter support for async HTTP for bridged devices (#18656) --- .../berry_mapping/src/be_class_wrapper.c | 2 +- .../berry_matter/src/be_matter_module.c | 6 + .../src/embedded/Matter_HTTP_async.be | 406 ++++++ .../src/embedded/Matter_HTTP_remote.be | 87 ++ .../src/embedded/Matter_Plugin.be | 36 +- .../src/embedded/Matter_Plugin_Bridge_HTTP.be | 165 +-- .../embedded/Matter_Plugin_Bridge_OnOff.be | 30 +- .../src/embedded/Matter_TCP_async.be | 236 ++++ .../solidify/solidified_Matter_HTTP_async.h | 1114 ++++++++++++++++ .../solidify/solidified_Matter_HTTP_remote.h | 363 ++++++ .../src/solidify/solidified_Matter_Plugin.h | 1132 +++++++++-------- .../solidified_Matter_Plugin_Bridge_HTTP.h | 993 ++++++++------- .../solidified_Matter_Plugin_Bridge_OnOff.h | 285 +++-- .../solidify/solidified_Matter_TCP_async.h | 872 +++++++++++++ 14 files changed, 4530 insertions(+), 1197 deletions(-) create mode 100644 lib/libesp32/berry_matter/src/embedded/Matter_HTTP_async.be create mode 100644 lib/libesp32/berry_matter/src/embedded/Matter_HTTP_remote.be create mode 100644 lib/libesp32/berry_matter/src/embedded/Matter_TCP_async.be create mode 100644 lib/libesp32/berry_matter/src/solidify/solidified_Matter_HTTP_async.h create mode 100644 lib/libesp32/berry_matter/src/solidify/solidified_Matter_HTTP_remote.h create mode 100644 lib/libesp32/berry_matter/src/solidify/solidified_Matter_TCP_async.h diff --git a/lib/libesp32/berry_mapping/src/be_class_wrapper.c b/lib/libesp32/berry_mapping/src/be_class_wrapper.c index bbde814bb..71c29eff9 100644 --- a/lib/libesp32/berry_mapping/src/be_class_wrapper.c +++ b/lib/libesp32/berry_mapping/src/be_class_wrapper.c @@ -486,7 +486,7 @@ int be_call_c_func(bvm *vm, const void * func, const char * return_type, const c } else { // class name be_find_global_or_module_member(vm, return_type); be_pushcomptr(vm, (void*) ret); // stack = class, ptr - be_call(vm, 1); // instanciate with 2 arguments, stack = instance, ptr, -1 + be_call(vm, 1); // instanciate with 1 argument (ptr) be_pop(vm, 1); // stack = instance be_return(vm); } diff --git a/lib/libesp32/berry_matter/src/be_matter_module.c b/lib/libesp32/berry_matter/src/be_matter_module.c index 6469098a3..bed344cda 100644 --- a/lib/libesp32/berry_matter/src/be_matter_module.c +++ b/lib/libesp32/berry_matter/src/be_matter_module.c @@ -133,6 +133,9 @@ extern const bclass be_class_Matter_TLV; // need to declare it upfront because #include "solidify/solidified_Matter_TLV.h" #include "solidify/solidified_Matter_IM_Data.h" #include "solidify/solidified_Matter_UDPServer.h" +#include "solidify/solidified_Matter_TCP_async.h" +#include "solidify/solidified_Matter_HTTP_async.h" +#include "solidify/solidified_Matter_HTTP_remote.h" #include "solidify/solidified_Matter_Expirable.h" #include "solidify/solidified_Matter_Fabric.h" #include "solidify/solidified_Matter_Session.h" @@ -286,6 +289,9 @@ module matter (scope: global, strings: weak) { // UDP Server UDPPacket_sent, class(be_class_Matter_UDPPacket_sent) UDPServer, class(be_class_Matter_UDPServer) + TCP_async, class(be_class_Matter_TCP_async) + HTTP_async, class(be_class_Matter_HTTP_async) + HTTP_remote, class(be_class_Matter_HTTP_remote) // Expirable Expirable, class(be_class_Matter_Expirable) diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_HTTP_async.be b/lib/libesp32/berry_matter/src/embedded/Matter_HTTP_async.be new file mode 100644 index 000000000..acc87b348 --- /dev/null +++ b/lib/libesp32/berry_matter/src/embedded/Matter_HTTP_async.be @@ -0,0 +1,406 @@ +# +# Matter_HTTP_async.be - implements a generic async non-blocking TCP connection +# +# Copyright (C) 2023 Stephan Hadinger & Theo Arends +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +# + +#@ solidify:Matter_HTTP_async,weak + +# dummy declaration for solidification +class Matter_TCP_async end + +class Matter_HTTP_async : Matter_TCP_async + # var addr # remote address + # var port # remote port + # var timeout # timeout in ms + # var tcp # instance of tcpclientasync + # var time_start # timestamp when starting connection + # var tcp_connected # is tcp connected, true/false/nil (nil is in-progress) + var cmd # GET url command + var response # aggrated response + var response_offset # offset to parse in response + var status_code # status code looking for 200 + var payload # actual payload of the response (string) + # var status # status, see above + var http_status # status: 0/ in progress, 1/ finished ok, -1/ failed, -2/ timeout + # static var TIMEOUT = 1000 # default timeout: 500ms + var phase # parsing phase: 0/ status line, 1/ headers, 2/ payload chunked + var is_chunked # true if the content is chunked + var chunk_size # nil or int, size of the current chunk + static var HTTP_GET = "GET %s HTTP/1.1\r\nHost %s:%s\r\nConnection: close\r\n\r\n" # see https://stackoverflow.com/questions/6686261/what-at-the-bare-minimum-is-required-for-an-http-request + + static var HTTP_STATUS_REGEX = "HTTP/1\\.[1-2] (\\d+) .*?\r\n" # extract stattus code from first line + static var HTTP_HEADER_REGEX = "([A-Za-z0-9-]+): (.*?)\r\n" # extract a header with its 2 parts + static var HTTP_BODY_REGEX = "\r\n" # end of headers + static var HTTP_CHUNK_REGEX = "\r\n([A-Fa-f0-9]+)[ \t]*.*?\r\n" # extract the length of a chunk + static var SPINLOCK = 5 # delay in ms for spinlock + + ############################################################# + # init + def init(addr, port, timeout, fastloop) + super(self).init(addr, port, timeout, fastloop) + self.compile_re() + end + + ############################################################# + # compile once for all the regex + def compile_re() + import re + if !global.contains("_re_http_status") + global._re_http_status = re.compile(self.HTTP_STATUS_REGEX) + global._re_http_header = re.compile(self.HTTP_HEADER_REGEX) + global._re_http_body = re.compile(self.HTTP_BODY_REGEX) + global._re_http_chunk = re.compile(self.HTTP_CHUNK_REGEX) + end + end + + ############################################################# + # begin + # + # returns true if everything is ok, and connection started + # returns false if DNS failed + # returns nil if no network + def begin(cmd) + var ret = super(self).begin() + self.cmd = cmd + return ret + end + + ############################################################# + # begin_sync + # + # Synchronous (blocking version) + # + # returns nil if something went wrong + # returns the payload as string + def begin_sync(cmd, timeout) + var timeout_old = self.timeout + if timeout != nil self.set_timeout(timeout) end + var payload = nil + var spinlock = self.SPINLOCK + + # try + var ret = self.begin(cmd) + if ret # true just means that DNS was ok and that nothing went wrong + while self.http_status == 0 + self.loop() + tasmota.delay(spinlock) + end + end + + self.set_timeout(timeout_old) + return self.http_status > 0 ? self.payload : nil + end + + def reset() + super(self).reset() + # free buffers + self.cmd = nil + self.response = nil + self.response_offset = 0 + self.payload = "" + self.phase = 0 + self.http_status = 0 + self.is_chunked = false + self.chunk_size = nil + end + + ############################################################# + # parse_http_response + # + # Parse incoming HTTP response from self.response + def parse_http_response() + if self.phase == 0 + self.parse_http_status_line() + elif self.phase == 1 + self.parse_http_headers() + elif self.phase == 2 + self.parse_http_payload() + end + # if phase == 3 (payload raw) we don't parse anything and work for tcp connection to be closed + end + + ############################################################# + # parse_http_status_line + # + # Parse incoming HTTP status line + def parse_http_status_line() + var m = global._re_http_status.match2(self.response, self.response_offset) + # Ex: [17, '200'] + if m + self.response_offset = m[0] # move to following bytes + self.status_code = int(m[1]) + self.phase = 1 # proceed to parsing headers + self.parse_http_headers() + elif size(self.response) > 100 # if no match and we still have 100 bytes, then it fails + self.close() + self.status = -4 + end + end + + ############################################################# + # parse_http_status_line + # + # Parse incoming HTTP status line + def parse_http_headers() + while true + # print("parse_http_headers", "self.response_offset=", self.response_offset) + var m = global._re_http_header.match2(self.response, self.response_offset) + # print("m=", m) + # Ex: [32, 'Content-Type', 'application/json'] + if m + self.event_http_header(m[1], m[2]) + self.response_offset += m[0] + else # no more headers + var m2 = global._re_http_body.match2(self.response, self.response_offset) + if m2 + # end of headers + # we keep \r\n which is used by pattern + self.event_http_headers_end() # no more headers + self.phase = 2 + self.parse_http_payload() # continue to parsing payload + end + if size(self.response) > 1024 # we don't accept a single header larger than 1KB + self.close() + self.status = -4 + self.http_status = -1 + self.event_http_failed() + end + return + end + end + end + + ############################################################# + # parse_http_status_line + # + # Parse incoming HTTP status line + def parse_http_payload() + if self.is_chunked + while true + # if no current chunk size + if self.chunk_size == nil + var m = global._re_http_chunk.match2(self.response, self.response_offset) + if m + self.response_offset += m[0] + self.chunk_size = int('0x'+m[1]) + # if chunk size is zero, finished + if self.chunk_size == 0 + self.close() + self.status = 2 # finished + self.response = '' # free space + self.response_offset = 0 + self.http_status = 1 # ok + self.event_http_finished() + return + end + end + end + # do we have a chunk size + if self.chunk_size != nil + # print("chunk_size", self.chunk_size, size(self.response) - self.response_offset) + if self.chunk_size <= size(self.response) - self.response_offset + # we have a complete chunk in the buffer + self.payload += self.response[self.response_offset .. self.response_offset + self.chunk_size - 1] + self.response = self.response[self.response_offset + self.chunk_size .. ] # truncate to save space + self.response_offset = 0 + self.chunk_size = nil + # print(bytes().fromstring(self.response).tohex()) + else + return # return until more data is received + end + else + return + end + end + else + # non-chunked + self.payload += self.response[self.response_offset..] + self.response = "" + self.response_offset = 0 + end + end + + ############################################################# + # send_http + # + # Send http request + def send_http() + import string + # "GET %s HTTP/1.1\r\nHost %s:%s\r\nConnection: close\r\n\r\n" + self.response = "" + + # special formatting for IPv6 + var addr = self.addr + if string.find(addr, ':') >= 0 + addr = "[" + addr + "]" # IPv6 must be enclosed in brakets + end + + var req = string.format(self.HTTP_GET, self.cmd, addr, self.port) + #print("sending ", req) + var ret = self.write(req) + if ret != size(req) + # print("Could not send","size=",size(req),"ret=",ret) + self.close() + self.status = -4 + self.http_status = -1 + self.event_http_failed() + end + end + + + ############################################################# + # Events: method should be overriden + ############################################################# + # From TCP + # event_established: connection was established + # event_dnsfailed: dns resolution failed + # event_refused: connection was refused by peer + # event_timeout: connection timed out + # event_closed: connection was normally closed (after being established) + # event_available: incoming data is ready to be retrieved with `read()` or `readbytes()` + # event_listening: outgoing buffer is empty, ready to send data with `write()` + # From HTTP + # event_http_status_code: received HTTP status code (stored in `status_code`) + # event_http_header: received HTTP header (not stored except `is_chunked`) + # event_http_headers_end: all HTTP headers received + # Always finishes with one of: + # event_http_finished: HTTP finished, result is in `payload` + # event_http_failed: HTTP connection failed (not a timeout) + # event_http_timeout: HTTP timeout + + ############################################################# + # event_established + # + # When connection is established, we send the GET request in + # a single write, and we don't need to send anything more + def event_established() + self.send_http() + end + + ############################################################# + # event_available + # + # Data received + def event_available() + self.receive() + end + + ############################################################# + # event_http_status_code + # + # Received status_code + def event_http_status_code(status_code, status_message) + self.status_code = status_code + end + + ############################################################# + # event_http_header + # + # Received header + def event_http_header(header_key, header_value) + import string + header_key = string.tolower(header_key) + header_value = string.tolower(header_value) + # print("header=", header_key, header_value) + if header_key == 'transfer-encoding' && string.tolower(header_value) == 'chunked' + self.is_chunked = true + end + end + + ############################################################# + # event_http_headers_end + # + # All headers are received + def event_http_headers_end() + # print("event_http_headers_end") + # truncate to save space + if self.response_offset > 0 + self.response = self.response[self.response_offset .. ] + self.response_offset = 0 + end + end + + ############################################################# + # receive + # + # Receive and collate + def receive() + if self.tcp_connected != true return end # not connected + + if (tasmota.millis() - self.time_start) > self.timeout + # connection timeout + # print("Connected timeout in", tasmota.millis() - self.time_start, "ms") + self.status = -3 + self.close() + self.http_status = -2 + self.event_http_timeout() + else + + var avail = self.tcp.available() + var new_data = 0 + while avail > 0 + var s = self.tcp.read() + # print("read size=", size(s), "avail=", avail, "in", tasmota.millis() - self.time_start, "ms") + self.response += s + new_data += size(s) + avail = self.tcp.available() + end + + if new_data > 0 + # print("read size=", new_data, "in", tasmota.millis() - self.time_start, "ms") + self.parse_http_response() # try to parse response + end + + end + end + + ############################################################# + # event_http_finished + # + # Transaction finished sucessfully, result in self.payload + def event_http_finished() end + + ############################################################# + # event_http_failed + # + # Transaction finished sucessfully, result in self.payload + def event_http_failed() end + def event_refused() self.http_status = -1 self.event_http_failed() end + ############################################################# + # event_http_timeout + # + # Transaction finished sucessfully, result in self.payload + def event_http_timeout() end + def event_timeout() self.http_status = -2 self.event_http_timeout() end + +end +matter.HTTP_async = Matter_HTTP_async + +#- + +# Example + +tcp = matter.HTTP_async("192.168.2.200", 80, 1000) +tcp.begin("/cm?cmnd=Status%208") +tcp.begin("/") + +# Synchronous examples +tcp = matter.HTTP_async("192.168.2.200", 80, 1000) +print(tcp.begin_sync("/cm?cmnd=Status%208", 500)) +print(tcp.begin_sync("/", 500)) + +-# diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_HTTP_remote.be b/lib/libesp32/berry_matter/src/embedded/Matter_HTTP_remote.be new file mode 100644 index 000000000..1c3410995 --- /dev/null +++ b/lib/libesp32/berry_matter/src/embedded/Matter_HTTP_remote.be @@ -0,0 +1,87 @@ +# +# Matter_HTTP_remote.be - implements an interface to query remotely Tasmota device via HTTP +# +# Copyright (C) 2023 Stephan Hadinger & Theo Arends +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +# + +#@ solidify:Matter_HTTP_remote,weak + +# dummy declaration for solidification +class Matter_HTTP_async end + +class Matter_HTTP_remote : Matter_HTTP_async + var cb # call cb(http_status, payload) + + ############################################################# + # init + def init(addr, port, timeout, fastloop) + super(self).init(addr, port, timeout, fastloop) + end + + def set_cb(cb) + self.cb = cb + end + + ############################################################# + # begin + # + # returns true if everything is ok, and connection started + # returns false if DNS failed + # returns nil if no network + def begin(cmd) + import string + tasmota.log(string.format("MTR: HTTP async request 'http://%s:%i/%s'", self.addr, self.port, cmd), 3) + return super(self).begin(cmd) + end + + ############################################################# + # begin_sync + # + # Synchronous (blocking version) + # + # returns nil if something went wrong + # returns the payload as string + def begin_sync(cmd, timeout) + import string + tasmota.log(string.format("MTR: HTTP sync request 'http://%s:%i/%s'", self.addr, self.port, cmd), 3) + return super(self).begin_sync(cmd, timeout) + end + + def event_http_finished() + import string + var payload_short = (self.payload != nil) ? self.payload : 'nil' + if size(payload_short) > 30 payload_short = payload_short[0..29] + '...' end + tasmota.log(string.format("MTR: HTTP response in %i ms: '%s'", tasmota.millis() - self.time_start, payload_short), 3) + + if self.cb + self.cb(self.http_status, self.payload) + end + end + def event_http_failed() + tasmota.log("MTR: HTTP failed", 3) + if self.cb + self.cb(self.http_status, nil) + end + end + def event_http_timeout() + tasmota.log("MTR: HTTP timeout", 3) + if self.cb + self.cb(self.http_status, nil) + end + end + +end +matter.HTTP_remote = Matter_HTTP_remote diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin.be index 8f725225d..58fc1397a 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin.be @@ -66,18 +66,46 @@ class Matter_Plugin ############################################################# # Stub for updating shadow values (local copies of what we published to the Matter gateway) - def update_shadow() - self.tick = self.device.tick + # + # TO BE OVERRIDDEN + # This call is synnchronous and blocking. + def parse_update(data) end ############################################################# # Stub for updating shadow values (local copies of what we published to the Matter gateway) + # + # This method should collect the data from the local or remote device + # and call `parse_update()` when data is available. + # + # TO BE OVERRIDDEN + # This call is synnchronous and blocking. + def update_shadow() + self.tick = self.device.tick + self.parse_update(nil) + end + + ############################################################# + # Stub for updating shadow values (local copies of what we published to the Matter gateway) + # + # This call is synnchronous and blocking. def update_shadow_lazy() if self.tick != self.device.tick self.update_shadow() + self.tick = self.device.tick end end + ############################################################# + # probe_shadow_async + # + # TO BE OVERRIDDEN - DON'T CALL SUPER - default is just calling `update_shadow()` + # This is called on a regular basis, depending on the type of plugin. + # Whenever the data is returned, call `parse_update()` to update values + def probe_shadow_async() + self.update_shadow() + end + ############################################################# # signal that an attribute has been changed # @@ -250,7 +278,9 @@ class Matter_Plugin self.update_next = tasmota.millis(rand31 % self.UPDATE_TIME) else if tasmota.time_reached(self.update_next) - self.update_shadow_lazy() # call update_shadow if not already called + if self.tick != self.device.tick + self.probe_shadow_async() # call update_shadow if not already called + end self.update_next = tasmota.millis(self.UPDATE_TIME) # rearm timer end end diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_HTTP.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_HTTP.be index 612fe489d..d03ebe5d5 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_HTTP.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_HTTP.be @@ -30,7 +30,8 @@ class Matter_Plugin_Bridge_HTTP : Matter_Plugin_Device static var ARG = "" # additional argument name (or empty if none) static var ARG_HTTP = "url" # domain name static var UPDATE_TIME = 3000 # update every 3s - static var HTTP_TIMEOUT = 300 # wait for 300ms max, since we're on LAN + static var PROBE_TIMEOUT = 700 # timeout of 700 ms for probing + static var SYNC_TIMEOUT = 500 # timeout of 700 ms for probing static var CLUSTERS = { # 0x001D: inherited # Descriptor Cluster 9.5 p.453 # 0x0003: inherited # Identify 1.2 p.16 @@ -44,31 +45,27 @@ class Matter_Plugin_Bridge_HTTP : Matter_Plugin_Device } # static var TYPES = { 0x010A: 2 } # On/Off Light - var tasmota_http # domain name for HTTP, ex: 'http://192.168.1.10/' - var tasmota_status_8 # remote `Status 8` sensor values (last known) - var tasmota_status_11 # remote `Status 11` light values (last known) - # each contain a `_tick` attribute to known when they were last loaded var reachable # is the device reachable var reachable_tick # last tick when the reachability was seen (avoids sending superfluous ping commands) + var http_shadow_map # map of shadows + # : map from json - memorize the result from `Status `` + # each contain a `_tick` attribute to known when they were last loaded + var http_remote # instance of Matter_HTTP_remote + var next_probe_timestamp # timestamp for next probe (in millis()) + ############################################################# # Constructor def init(device, endpoint, arguments) import string super(self).init(device, endpoint, arguments) - var http = arguments.find(self.ARG_HTTP) - if http - if string.find(http, '://') < 0 - http = "http://" + http + "/" - end - self.tasmota_http = http - else - tasmota.log(string.format("MTR: ERROR: 'url' is not configured for endpoint %i", endpoint), 2) - end - self.tasmota_status_8 = nil - self.tasmota_status_11 = nil + var addr = arguments.find(self.ARG_HTTP) + self.http_shadow_map = {} self.reachable = false # force a valid bool value + self.next_probe_timestamp = nil + self.http_remote = matter.HTTP_remote(addr, 80, self.PROBE_TIMEOUT) + self.http_remote.set_cb(/s,p-> self.parse_http_response(s, p)) end ############################################################# @@ -84,36 +81,36 @@ class Matter_Plugin_Bridge_HTTP : Matter_Plugin_Device end ############################################################# - # call_remote + # call_remote_async # - # Call a remote Tasmota device, returns Berry native map or nil - def call_remote(cmd, arg) - if !self.tasmota_http return nil end - import json + # Call a remote Tasmota device, returns nothing, callback is called when data arrives + def call_remote_async(cmd, arg) import string if !tasmota.wifi()['up'] && !tasmota.eth()['up'] return nil end # no network + + var url = string.format("/cm?cmnd=%s%%20%s", cmd, arg ? arg : '') + var ret = self.http_remote.begin(url, self.PROBE_TIMEOUT) + end + + ############################################################# + # call_remote_sync + # + # Call a remote Tasmota device, returns Berry native map or nil + def call_remote_sync(cmd, arg) + # if !self.http_remote return nil end + import string + if !tasmota.wifi()['up'] && !tasmota.eth()['up'] return nil end # no network + var retry = 2 # try 2 times if first failed + var url = string.format("/cm?cmnd=%s%%20%s", cmd, arg ? arg : '') while retry > 0 - var cl = webclient() - cl.set_timeouts(1000, 1000) - cl.set_follow_redirects(false) - var url = string.format("%scm?cmnd=%s%%20%s", self.tasmota_http, cmd, arg ? arg : '') - tasmota.log("MTR: HTTP GET "+url, 3) - cl.begin(url) - var r = cl.GET() - tasmota.log("MTR: HTTP GET code=" + str(r), 3) - if r == 200 - var s = cl.get_string() - cl.close() - tasmota.log("MTR: HTTP GET payload=" + s, 3) - var j = json.load(s) + var ret = self.http_remote.begin_sync(url, self.SYNC_TIMEOUT) + if ret != nil # device is known to be reachable self.reachable = true self.reachable_tick = self.device.tick - return j + return ret end - cl.close() - retry -= 1 tasmota.log("MTR: HTTP GET retrying", 3) end @@ -121,13 +118,54 @@ class Matter_Plugin_Bridge_HTTP : Matter_Plugin_Device return nil end + ############################################################# + # parse_http_response + # + # Parse response from HTTP API and update shadows + # We support: + # `Status 8`: {"StatusSNS":{ [...] }} + # `Status 11`: {"StatusSTS":{ [...] }} + # `Status 13`: {"StatusSHT":{ [...] }} + def parse_http_response(status, payload) + if status > 0 + # device is known to be reachable + self.reachable = true + var tick = self.device.tick + self.reachable_tick = tick + + import json + var j = json.load(payload) + var code = nil # index of Status + if j + # filter + if j.contains("StatusSNS") # Status 8 + j = j["StatusSNS"] + code = 8 + elif j.contains("StatusSTS") # Status 11 + j = j["StatusSTS"] + code = 11 + elif j.contains("StatusSHT") # Status 13 + j = j["StatusSTS"] + code = 13 + end + + if code != nil + j['_tick'] = tick + self.http_shadow_map[code] = j + end + # convert to shadow values + self.parse_update(j, code) # call parser + end + end + end + ############################################################# # is_reachable() # # Pings the device and checks if it's reachable - def is_reachable() + def is_reachable_sync() if self.device.tick != self.reachable_tick - var ret = self.call_remote("", "") # empty command works as a ping + var ret = self.call_remote_sync("", "") # empty command works as a ping self.reachable = (ret != nil) # self.reachable_tick = cur_tick # done by caller end @@ -135,43 +173,28 @@ class Matter_Plugin_Bridge_HTTP : Matter_Plugin_Device end ############################################################# - # get_status_8() + # get_remote_status_sync() # - # Get remote `Status 8` values of sensors, and cache for the current tick - def get_status_8() + # Get remote `Status ` values of sensors, sync and blocking + def get_remote_status_lazy(x, sync) var cur_tick = self.device.tick - if self.tasmota_status_8 == nil || self.tasmota_status_8.find("_tick") != cur_tick - var ret = self.call_remote("Status", "8") # call `Status 8` - if ret - ret["_tick"] = cur_tick - self.tasmota_status_8 = ret - return ret - else - return nil + var shadow_x = self.http_shadow_map.find(x) + if shadow_x + if shadow_x.find('_tick') == cur_tick + return shadow_x # we have already updated in this tick end - else - return self.tasmota_status_8 # return cached value end + return self.call_remote_sync("Status", str(x)) end ############################################################# - # get_status_11() + # probe_shadow_async # - # Get remote `Status 11` values of sensors, and cache for the current tick - def get_status_11() - var cur_tick = self.device.tick - if self.tasmota_status_11 == nil || self.tasmota_status_11.find("_tick") != cur_tick - var ret = self.call_remote("Status", "11") # call `Status 8` - if ret - ret["_tick"] = cur_tick - self.tasmota_status_11 = ret - return ret - else - return nil - end - else - return self.tasmota_status_11 # return cached value - end + # ### TO BE OVERRIDDEN - DON'T CALL SUPER - default is just calling `update_shadow()` + # This is called on a regular basis, depending on the type of plugin. + # Whenever the data is returned, call `update_shadow()` to update values + def probe_shadow_async() + # self.call_remote_async(, ) end ############################################################# @@ -188,7 +211,7 @@ class Matter_Plugin_Bridge_HTTP : Matter_Plugin_Device if attribute == 0x0000 # ---------- DataModelRevision / CommissioningWindowStatus ---------- # return TLV.create_TLV(TLV.U2, 1) elif attribute == 0x0011 # ---------- Reachable / bool ---------- - return TLV.create_TLV(TLV.BOOL, true) # TODO find a way to do a ping + return TLV.create_TLV(TLV.BOOL, self.reachable) # TODO find a way to do a ping end else @@ -207,7 +230,7 @@ class Matter_Plugin_Bridge_HTTP : Matter_Plugin_Device var url = str(conf.find(_class.ARG_HTTP, '')) var arg = s + "," + url - print("MTR: ui_conf_to_string", conf, cl, arg) + # print("MTR: ui_conf_to_string", conf, cl, arg) return arg end @@ -220,7 +243,7 @@ class Matter_Plugin_Bridge_HTTP : Matter_Plugin_Device var elts = string.split(arg + ',', ',', 3) # add ',' at the end to be sure to have at least 2 arguments conf[_class.ARG_HTTP] = elts[1] super(_class).ui_string_to_conf(cl, conf, elts[0]) - print("ui_string_to_conf", conf, arg) + # print("ui_string_to_conf", conf, arg) return conf end diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_OnOff.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_OnOff.be index 49aa7a507..8a04c9398 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_OnOff.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_OnOff.be @@ -38,7 +38,6 @@ class Matter_Plugin_Bridge_OnOff : Matter_Plugin_Bridge_HTTP } static var TYPES = { 0x010A: 2 } # On/Off Light - var tasmota_http # domain name for HTTP var tasmota_relay_index # Relay number in Tasmota (zero based) var shadow_onoff # fake status for now # TODO @@ -56,23 +55,40 @@ class Matter_Plugin_Bridge_OnOff : Matter_Plugin_Bridge_HTTP # Update shadow # def update_shadow() - var st11 = self.get_status_11() - if st11 - st11 = st11.find('StatusSTS', {}) # remove first level - var state = (st11.find("POWER") == "ON") + var ret = self.call_remote_sync("Status", "11") + super(self).update_shadow() + end + + ############################################################# + # Stub for updating shadow values (local copies of what we published to the Matter gateway) + # + # TO BE OVERRIDDEN + # This call is synnchronous and blocking. + def parse_update(data, index) + if index == 11 # Status 11 + var state = (data.find("POWER") == "ON") if self.shadow_onoff != nil && self.shadow_onoff != bool(state) self.attribute_updated(0x0006, 0x0000) end self.shadow_onoff = state end - super(self).update_shadow() + end + + ############################################################# + # probe_shadow_async + # + # ### TO BE OVERRIDDEN - DON'T CALL SUPER - default is just calling `update_shadow()` + # This is called on a regular basis, depending on the type of plugin. + # Whenever the data is returned, call `update_shadow()` to update values + def probe_shadow_async() + self.call_remote_async("Status", "11") end ############################################################# # Model # def set_onoff(v) - self.call_remote("Power", v ? "1" : "0") + self.call_remote_sync("Power", v ? "1" : "0") self.update_shadow() end diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_TCP_async.be b/lib/libesp32/berry_matter/src/embedded/Matter_TCP_async.be new file mode 100644 index 000000000..949b263a1 --- /dev/null +++ b/lib/libesp32/berry_matter/src/embedded/Matter_TCP_async.be @@ -0,0 +1,236 @@ +# +# Matter_TCP_async.be - implements a generic async non-blocking TCP connection +# +# Copyright (C) 2023 Stephan Hadinger & Theo Arends +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +# + +#@ solidify:Matter_TCP_async,weak + +# Status: +# nil = uninitialized +# 0 = starting (tcp_connected == nil) - still on-going +# 1 = connected (tcp_connected == true) +# 2 = finished (tcp_connected == false and result in response) +# -1 = DNS failed (tcp_connected == false) +# -2 = refused (tcp_connecetd == false) +# -3 = timeout (tcp_connecetd == false) +# -4 = error communication error + +class Matter_TCP_async + var addr # (string) remote address + var port # (int) remote port + var timeout # (int) timeout in ms + var tcp # instance of tcpclientasync + var time_start # (int) timestamp when starting connection + var tcp_connected # (bool or nil) is tcp connected, true/false/nil (nil is in-progress) + var status # (int) status, see above + static var TIMEOUT = 1000 # default timeout: 1000ms + + var fast_loop # (opt) either nil or a closure + + ############################################################# + # constructor + # + # fastloop: (opt) if 'true' uses fastloop instead of every_50ms + def init(addr, port, timeout, fastloop) + if timeout == nil timeout = self.TIMEOUT end + if port == nil port = 80 end + self.addr = str(addr) + self.port = int(port) + self.timeout = timeout + self.tcp = tcpclientasync() + if fastloop + self.fast_loop = / -> self.loop() # create a closure to use with fastloop + end + end + + ############################################################# + # begin + # + # returns true if everything is ok, and connection started + # returns false if DNS failed + # returns nil if no network + def begin() + self.reset() + + if !tasmota.wifi()['up'] && !tasmota.eth()['up'] return nil end # no network + self.time_start = tasmota.millis() + self.status = 0 + + if (self.tcp.connect(self.addr, self.port)) + if self.fast_loop + tasmota.remove_fast_loop(self.fast_loop) + tasmota.add_fast_loop(self.fast_loop) + else + tasmota.add_driver(self) + end + return true + else + import string + tasmota.log(string.format("BRY: failed to resolve [%s]:%i", self.addr, self.port), 3) + self.close() + self.status = -1 + self.tcp_connected = false + self.event_dnsfailed() + return false + end + end + + ############################################################# + # Set a new timeout, or `nil` for default (1s) + def set_timeout(timeout) + if timeout == nil timeout = self.TIMEOUT end + self.timeout = timeout + end + + ############################################################# + # Reset the instance to send a open a new connection + # This allows to reuse the same object. + def reset() + self.tcp.close() + self.tcp_connected = nil + end + + ############################################################# + # send_http + def close() + self.tcp.close() + if self.fast_loop + tasmota.remove_fast_loop(self.fast_loop) + else + tasmota.remove_driver(self) + end + # if it was connected, send event + if self.tcp_connected == true + self.event_closed() + end + self.tcp_connected = false + end + + def every_50ms() + self.loop() + end + + ############################################################# + # Main loop, check evolution and trigger events + ############################################################# + def loop() + var prev_connected = self.tcp_connected + if self.status == nil self.close() return end # safeguard, this is invalid state + + self.tcp_connected = self.tcp.connected() + # if not yet connected, check if we finally got a response + if prev_connected == nil # not yet connected + if self.tcp_connected == true + # we finally got connection + self.status = 1 + self.event_established() + # and continue below + elif self.tcp_connected == false + # connection failed + self.status = -2 + self.event_refused() + self.close() + return + elif (tasmota.millis() - self.time_start) > self.timeout + # connection timeout + self.status = -3 + self.tcp_connected = false # force to false + self.event_timeout() + end + end + + if (tasmota.millis() - self.time_start) > self.timeout + self.close() + self.status = -3 + self.event_timeout() + return + end + + if self.tcp_connected == false + if prev_connected == true + self.event_closed() + end + self.close() # close implicitly removes from loop + return + end + + # reading has priority because we don't want to lose data + if self.tcp.available() + self.event_available() + end + + # can we send data + if self.tcp.listening() + self.event_listening() + end + end + + def write(content) + if self.tcp_connected + return self.tcp.write(content) + end + return 0 + end + + def read() + if self.tcp_connected + return self.tcp.read() + end + return nil + end + + def readbytes() + if self.tcp_connected + return self.tcp.readbytes() + end + return nil + end + + def available() + if self.tcp_connected + return self.tcp.available() + end + return 0 + end + + def listening() + if self.tcp_connected + return self.tcp.listening() + end + return false + end + + ############################################################# + # Events: method should be overriden + ############################################################# + # event_established: connection was established + # event_dnsfailed: dns resolution failed + # event_refused: connection was refused by peer + # event_timeout: connection timed out + # event_closed: connection was normally closed (after being established) + # event_available: incoming data is ready to be retrieved with `read()` or `readbytes()` + # event_listening: outgoing buffer is empty, ready to send data with `write()` + def event_established() end + def event_dnsfailed() end + def event_refused() end + def event_timeout() end + def event_closed() end + def event_available() end + def event_listening() end + +end +matter.TCP_async = Matter_TCP_async diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_HTTP_async.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_HTTP_async.h new file mode 100644 index 000000000..13a3a1112 --- /dev/null +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_HTTP_async.h @@ -0,0 +1,1114 @@ +/* Solidification of Matter_HTTP_async.h */ +/********************************************************************\ +* Generated code, don't edit * +\********************************************************************/ +#include "be_constobj.h" + +extern const bclass be_class_Matter_HTTP_async; + +/******************************************************************** +** Solidified function: event_available +********************************************************************/ +be_local_closure(Matter_HTTP_async_event_available, /* name */ + be_nested_proto( + 3, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 1]) { /* constants */ + /* K0 */ be_nested_str_weak(receive), + }), + be_str_weak(event_available), + &be_const_str_solidified, + ( &(const binstruction[ 3]) { /* code */ + 0x8C040100, // 0000 GETMET R1 R0 K0 + 0x7C040200, // 0001 CALL R1 1 + 0x80000000, // 0002 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: event_established +********************************************************************/ +be_local_closure(Matter_HTTP_async_event_established, /* name */ + be_nested_proto( + 3, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 1]) { /* constants */ + /* K0 */ be_nested_str_weak(send_http), + }), + be_str_weak(event_established), + &be_const_str_solidified, + ( &(const binstruction[ 3]) { /* code */ + 0x8C040100, // 0000 GETMET R1 R0 K0 + 0x7C040200, // 0001 CALL R1 1 + 0x80000000, // 0002 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: parse_http_status_line +********************************************************************/ +be_local_closure(Matter_HTTP_async_parse_http_status_line, /* name */ + be_nested_proto( + 5, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[12]) { /* constants */ + /* K0 */ be_nested_str_weak(global), + /* K1 */ be_nested_str_weak(_re_http_status), + /* K2 */ be_nested_str_weak(match2), + /* K3 */ be_nested_str_weak(response), + /* K4 */ be_nested_str_weak(response_offset), + /* K5 */ be_const_int(0), + /* K6 */ be_nested_str_weak(status_code), + /* K7 */ be_const_int(1), + /* K8 */ be_nested_str_weak(phase), + /* K9 */ be_nested_str_weak(parse_http_headers), + /* K10 */ be_nested_str_weak(close), + /* K11 */ be_nested_str_weak(status), + }), + be_str_weak(parse_http_status_line), + &be_const_str_solidified, + ( &(const binstruction[28]) { /* code */ + 0xB8060000, // 0000 GETNGBL R1 K0 + 0x88040301, // 0001 GETMBR R1 R1 K1 + 0x8C040302, // 0002 GETMET R1 R1 K2 + 0x880C0103, // 0003 GETMBR R3 R0 K3 + 0x88100104, // 0004 GETMBR R4 R0 K4 + 0x7C040600, // 0005 CALL R1 3 + 0x78060009, // 0006 JMPF R1 #0011 + 0x94080305, // 0007 GETIDX R2 R1 K5 + 0x90020802, // 0008 SETMBR R0 K4 R2 + 0x60080009, // 0009 GETGBL R2 G9 + 0x940C0307, // 000A GETIDX R3 R1 K7 + 0x7C080200, // 000B CALL R2 1 + 0x90020C02, // 000C SETMBR R0 K6 R2 + 0x90021107, // 000D SETMBR R0 K8 K7 + 0x8C080109, // 000E GETMET R2 R0 K9 + 0x7C080200, // 000F CALL R2 1 + 0x70020009, // 0010 JMP #001B + 0x6008000C, // 0011 GETGBL R2 G12 + 0x880C0103, // 0012 GETMBR R3 R0 K3 + 0x7C080200, // 0013 CALL R2 1 + 0x540E0063, // 0014 LDINT R3 100 + 0x24080403, // 0015 GT R2 R2 R3 + 0x780A0003, // 0016 JMPF R2 #001B + 0x8C08010A, // 0017 GETMET R2 R0 K10 + 0x7C080200, // 0018 CALL R2 1 + 0x5409FFFB, // 0019 LDINT R2 -4 + 0x90021602, // 001A SETMBR R0 K11 R2 + 0x80000000, // 001B RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: event_http_header +********************************************************************/ +be_local_closure(Matter_HTTP_async_event_http_header, /* name */ + be_nested_proto( + 7, /* nstack */ + 3, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 5]) { /* constants */ + /* K0 */ be_nested_str_weak(string), + /* K1 */ be_nested_str_weak(tolower), + /* K2 */ be_nested_str_weak(transfer_X2Dencoding), + /* K3 */ be_nested_str_weak(chunked), + /* K4 */ be_nested_str_weak(is_chunked), + }), + be_str_weak(event_http_header), + &be_const_str_solidified, + ( &(const binstruction[19]) { /* code */ + 0xA40E0000, // 0000 IMPORT R3 K0 + 0x8C100701, // 0001 GETMET R4 R3 K1 + 0x5C180200, // 0002 MOVE R6 R1 + 0x7C100400, // 0003 CALL R4 2 + 0x5C040800, // 0004 MOVE R1 R4 + 0x8C100701, // 0005 GETMET R4 R3 K1 + 0x5C180400, // 0006 MOVE R6 R2 + 0x7C100400, // 0007 CALL R4 2 + 0x5C080800, // 0008 MOVE R2 R4 + 0x1C100302, // 0009 EQ R4 R1 K2 + 0x78120006, // 000A JMPF R4 #0012 + 0x8C100701, // 000B GETMET R4 R3 K1 + 0x5C180400, // 000C MOVE R6 R2 + 0x7C100400, // 000D CALL R4 2 + 0x1C100903, // 000E EQ R4 R4 K3 + 0x78120001, // 000F JMPF R4 #0012 + 0x50100200, // 0010 LDBOOL R4 1 0 + 0x90020804, // 0011 SETMBR R0 K4 R4 + 0x80000000, // 0012 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: event_http_failed +********************************************************************/ +be_local_closure(Matter_HTTP_async_event_http_failed, /* name */ + be_nested_proto( + 1, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 0, /* has constants */ + NULL, /* no const */ + be_str_weak(event_http_failed), + &be_const_str_solidified, + ( &(const binstruction[ 1]) { /* code */ + 0x80000000, // 0000 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: init +********************************************************************/ +be_local_closure(Matter_HTTP_async_init, /* name */ + be_nested_proto( + 11, /* nstack */ + 5, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 2]) { /* constants */ + /* K0 */ be_nested_str_weak(init), + /* K1 */ be_nested_str_weak(compile_re), + }), + be_str_weak(init), + &be_const_str_solidified, + ( &(const binstruction[12]) { /* code */ + 0x60140003, // 0000 GETGBL R5 G3 + 0x5C180000, // 0001 MOVE R6 R0 + 0x7C140200, // 0002 CALL R5 1 + 0x8C140B00, // 0003 GETMET R5 R5 K0 + 0x5C1C0200, // 0004 MOVE R7 R1 + 0x5C200400, // 0005 MOVE R8 R2 + 0x5C240600, // 0006 MOVE R9 R3 + 0x5C280800, // 0007 MOVE R10 R4 + 0x7C140A00, // 0008 CALL R5 5 + 0x8C140101, // 0009 GETMET R5 R0 K1 + 0x7C140200, // 000A CALL R5 1 + 0x80000000, // 000B RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: begin_sync +********************************************************************/ +be_local_closure(Matter_HTTP_async_begin_sync, /* name */ + be_nested_proto( + 10, /* nstack */ + 3, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[10]) { /* constants */ + /* K0 */ be_nested_str_weak(timeout), + /* K1 */ be_nested_str_weak(set_timeout), + /* K2 */ be_nested_str_weak(SPINLOCK), + /* K3 */ be_nested_str_weak(begin), + /* K4 */ be_nested_str_weak(http_status), + /* K5 */ be_const_int(0), + /* K6 */ be_nested_str_weak(loop), + /* K7 */ be_nested_str_weak(tasmota), + /* K8 */ be_nested_str_weak(delay), + /* K9 */ be_nested_str_weak(payload), + }), + be_str_weak(begin_sync), + &be_const_str_solidified, + ( &(const binstruction[33]) { /* code */ + 0x880C0100, // 0000 GETMBR R3 R0 K0 + 0x4C100000, // 0001 LDNIL R4 + 0x20100404, // 0002 NE R4 R2 R4 + 0x78120002, // 0003 JMPF R4 #0007 + 0x8C100101, // 0004 GETMET R4 R0 K1 + 0x5C180400, // 0005 MOVE R6 R2 + 0x7C100400, // 0006 CALL R4 2 + 0x4C100000, // 0007 LDNIL R4 + 0x88140102, // 0008 GETMBR R5 R0 K2 + 0x8C180103, // 0009 GETMET R6 R0 K3 + 0x5C200200, // 000A MOVE R8 R1 + 0x7C180400, // 000B CALL R6 2 + 0x781A0009, // 000C JMPF R6 #0017 + 0x881C0104, // 000D GETMBR R7 R0 K4 + 0x1C1C0F05, // 000E EQ R7 R7 K5 + 0x781E0006, // 000F JMPF R7 #0017 + 0x8C1C0106, // 0010 GETMET R7 R0 K6 + 0x7C1C0200, // 0011 CALL R7 1 + 0xB81E0E00, // 0012 GETNGBL R7 K7 + 0x8C1C0F08, // 0013 GETMET R7 R7 K8 + 0x5C240A00, // 0014 MOVE R9 R5 + 0x7C1C0400, // 0015 CALL R7 2 + 0x7001FFF5, // 0016 JMP #000D + 0x8C1C0101, // 0017 GETMET R7 R0 K1 + 0x5C240600, // 0018 MOVE R9 R3 + 0x7C1C0400, // 0019 CALL R7 2 + 0x881C0104, // 001A GETMBR R7 R0 K4 + 0x241C0F05, // 001B GT R7 R7 K5 + 0x781E0001, // 001C JMPF R7 #001F + 0x881C0109, // 001D GETMBR R7 R0 K9 + 0x70020000, // 001E JMP #0020 + 0x4C1C0000, // 001F LDNIL R7 + 0x80040E00, // 0020 RET 1 R7 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: reset +********************************************************************/ +be_local_closure(Matter_HTTP_async_reset, /* name */ + be_nested_proto( + 3, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[11]) { /* constants */ + /* K0 */ be_nested_str_weak(reset), + /* K1 */ be_nested_str_weak(cmd), + /* K2 */ be_nested_str_weak(response), + /* K3 */ be_nested_str_weak(response_offset), + /* K4 */ be_const_int(0), + /* K5 */ be_nested_str_weak(payload), + /* K6 */ be_nested_str_weak(), + /* K7 */ be_nested_str_weak(phase), + /* K8 */ be_nested_str_weak(http_status), + /* K9 */ be_nested_str_weak(is_chunked), + /* K10 */ be_nested_str_weak(chunk_size), + }), + be_str_weak(reset), + &be_const_str_solidified, + ( &(const binstruction[18]) { /* code */ + 0x60040003, // 0000 GETGBL R1 G3 + 0x5C080000, // 0001 MOVE R2 R0 + 0x7C040200, // 0002 CALL R1 1 + 0x8C040300, // 0003 GETMET R1 R1 K0 + 0x7C040200, // 0004 CALL R1 1 + 0x4C040000, // 0005 LDNIL R1 + 0x90020201, // 0006 SETMBR R0 K1 R1 + 0x4C040000, // 0007 LDNIL R1 + 0x90020401, // 0008 SETMBR R0 K2 R1 + 0x90020704, // 0009 SETMBR R0 K3 K4 + 0x90020B06, // 000A SETMBR R0 K5 K6 + 0x90020F04, // 000B SETMBR R0 K7 K4 + 0x90021104, // 000C SETMBR R0 K8 K4 + 0x50040000, // 000D LDBOOL R1 0 0 + 0x90021201, // 000E SETMBR R0 K9 R1 + 0x4C040000, // 000F LDNIL R1 + 0x90021401, // 0010 SETMBR R0 K10 R1 + 0x80000000, // 0011 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: event_http_status_code +********************************************************************/ +be_local_closure(Matter_HTTP_async_event_http_status_code, /* name */ + be_nested_proto( + 3, /* nstack */ + 3, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 1]) { /* constants */ + /* K0 */ be_nested_str_weak(status_code), + }), + be_str_weak(event_http_status_code), + &be_const_str_solidified, + ( &(const binstruction[ 2]) { /* code */ + 0x90020001, // 0000 SETMBR R0 K0 R1 + 0x80000000, // 0001 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: event_timeout +********************************************************************/ +be_local_closure(Matter_HTTP_async_event_timeout, /* name */ + be_nested_proto( + 3, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 2]) { /* constants */ + /* K0 */ be_nested_str_weak(http_status), + /* K1 */ be_nested_str_weak(event_http_timeout), + }), + be_str_weak(event_timeout), + &be_const_str_solidified, + ( &(const binstruction[ 5]) { /* code */ + 0x5405FFFD, // 0000 LDINT R1 -2 + 0x90020001, // 0001 SETMBR R0 K0 R1 + 0x8C040101, // 0002 GETMET R1 R0 K1 + 0x7C040200, // 0003 CALL R1 1 + 0x80000000, // 0004 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: compile_re +********************************************************************/ +be_local_closure(Matter_HTTP_async_compile_re, /* name */ + be_nested_proto( + 6, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[12]) { /* constants */ + /* K0 */ be_nested_str_weak(re), + /* K1 */ be_nested_str_weak(global), + /* K2 */ be_nested_str_weak(contains), + /* K3 */ be_nested_str_weak(_re_http_status), + /* K4 */ be_nested_str_weak(compile), + /* K5 */ be_nested_str_weak(HTTP_STATUS_REGEX), + /* K6 */ be_nested_str_weak(_re_http_header), + /* K7 */ be_nested_str_weak(HTTP_HEADER_REGEX), + /* K8 */ be_nested_str_weak(_re_http_body), + /* K9 */ be_nested_str_weak(HTTP_BODY_REGEX), + /* K10 */ be_nested_str_weak(_re_http_chunk), + /* K11 */ be_nested_str_weak(HTTP_CHUNK_REGEX), + }), + be_str_weak(compile_re), + &be_const_str_solidified, + ( &(const binstruction[27]) { /* code */ + 0xA4060000, // 0000 IMPORT R1 K0 + 0xB80A0200, // 0001 GETNGBL R2 K1 + 0x8C080502, // 0002 GETMET R2 R2 K2 + 0x58100003, // 0003 LDCONST R4 K3 + 0x7C080400, // 0004 CALL R2 2 + 0x740A0013, // 0005 JMPT R2 #001A + 0xB80A0200, // 0006 GETNGBL R2 K1 + 0x8C0C0304, // 0007 GETMET R3 R1 K4 + 0x88140105, // 0008 GETMBR R5 R0 K5 + 0x7C0C0400, // 0009 CALL R3 2 + 0x900A0603, // 000A SETMBR R2 K3 R3 + 0xB80A0200, // 000B GETNGBL R2 K1 + 0x8C0C0304, // 000C GETMET R3 R1 K4 + 0x88140107, // 000D GETMBR R5 R0 K7 + 0x7C0C0400, // 000E CALL R3 2 + 0x900A0C03, // 000F SETMBR R2 K6 R3 + 0xB80A0200, // 0010 GETNGBL R2 K1 + 0x8C0C0304, // 0011 GETMET R3 R1 K4 + 0x88140109, // 0012 GETMBR R5 R0 K9 + 0x7C0C0400, // 0013 CALL R3 2 + 0x900A1003, // 0014 SETMBR R2 K8 R3 + 0xB80A0200, // 0015 GETNGBL R2 K1 + 0x8C0C0304, // 0016 GETMET R3 R1 K4 + 0x8814010B, // 0017 GETMBR R5 R0 K11 + 0x7C0C0400, // 0018 CALL R3 2 + 0x900A1403, // 0019 SETMBR R2 K10 R3 + 0x80000000, // 001A RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: parse_http_payload +********************************************************************/ +be_local_closure(Matter_HTTP_async_parse_http_payload, /* name */ + be_nested_proto( + 5, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[18]) { /* constants */ + /* K0 */ be_nested_str_weak(is_chunked), + /* K1 */ be_nested_str_weak(chunk_size), + /* K2 */ be_nested_str_weak(global), + /* K3 */ be_nested_str_weak(_re_http_chunk), + /* K4 */ be_nested_str_weak(match2), + /* K5 */ be_nested_str_weak(response), + /* K6 */ be_nested_str_weak(response_offset), + /* K7 */ be_const_int(0), + /* K8 */ be_nested_str_weak(0x), + /* K9 */ be_const_int(1), + /* K10 */ be_nested_str_weak(close), + /* K11 */ be_nested_str_weak(status), + /* K12 */ be_const_int(2), + /* K13 */ be_nested_str_weak(), + /* K14 */ be_nested_str_weak(http_status), + /* K15 */ be_nested_str_weak(event_http_finished), + /* K16 */ be_nested_str_weak(payload), + /* K17 */ be_const_int(2147483647), + }), + be_str_weak(parse_http_payload), + &be_const_str_solidified, + ( &(const binstruction[85]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x78060048, // 0001 JMPF R1 #004B + 0x50040200, // 0002 LDBOOL R1 1 0 + 0x78060045, // 0003 JMPF R1 #004A + 0x88040101, // 0004 GETMBR R1 R0 K1 + 0x4C080000, // 0005 LDNIL R2 + 0x1C040202, // 0006 EQ R1 R1 R2 + 0x7806001B, // 0007 JMPF R1 #0024 + 0xB8060400, // 0008 GETNGBL R1 K2 + 0x88040303, // 0009 GETMBR R1 R1 K3 + 0x8C040304, // 000A GETMET R1 R1 K4 + 0x880C0105, // 000B GETMBR R3 R0 K5 + 0x88100106, // 000C GETMBR R4 R0 K6 + 0x7C040600, // 000D CALL R1 3 + 0x78060014, // 000E JMPF R1 #0024 + 0x88080106, // 000F GETMBR R2 R0 K6 + 0x940C0307, // 0010 GETIDX R3 R1 K7 + 0x00080403, // 0011 ADD R2 R2 R3 + 0x90020C02, // 0012 SETMBR R0 K6 R2 + 0x60080009, // 0013 GETGBL R2 G9 + 0x940C0309, // 0014 GETIDX R3 R1 K9 + 0x000E1003, // 0015 ADD R3 K8 R3 + 0x7C080200, // 0016 CALL R2 1 + 0x90020202, // 0017 SETMBR R0 K1 R2 + 0x88080101, // 0018 GETMBR R2 R0 K1 + 0x1C080507, // 0019 EQ R2 R2 K7 + 0x780A0008, // 001A JMPF R2 #0024 + 0x8C08010A, // 001B GETMET R2 R0 K10 + 0x7C080200, // 001C CALL R2 1 + 0x9002170C, // 001D SETMBR R0 K11 K12 + 0x90020B0D, // 001E SETMBR R0 K5 K13 + 0x90020D07, // 001F SETMBR R0 K6 K7 + 0x90021D09, // 0020 SETMBR R0 K14 K9 + 0x8C08010F, // 0021 GETMET R2 R0 K15 + 0x7C080200, // 0022 CALL R2 1 + 0x80000400, // 0023 RET 0 + 0x88040101, // 0024 GETMBR R1 R0 K1 + 0x4C080000, // 0025 LDNIL R2 + 0x20040202, // 0026 NE R1 R1 R2 + 0x7806001F, // 0027 JMPF R1 #0048 + 0x88040101, // 0028 GETMBR R1 R0 K1 + 0x6008000C, // 0029 GETGBL R2 G12 + 0x880C0105, // 002A GETMBR R3 R0 K5 + 0x7C080200, // 002B CALL R2 1 + 0x880C0106, // 002C GETMBR R3 R0 K6 + 0x04080403, // 002D SUB R2 R2 R3 + 0x18040202, // 002E LE R1 R1 R2 + 0x78060015, // 002F JMPF R1 #0046 + 0x88080106, // 0030 GETMBR R2 R0 K6 + 0x880C0106, // 0031 GETMBR R3 R0 K6 + 0x88100101, // 0032 GETMBR R4 R0 K1 + 0x000C0604, // 0033 ADD R3 R3 R4 + 0x040C0709, // 0034 SUB R3 R3 K9 + 0x40080403, // 0035 CONNECT R2 R2 R3 + 0x880C0105, // 0036 GETMBR R3 R0 K5 + 0x88040110, // 0037 GETMBR R1 R0 K16 + 0x94080602, // 0038 GETIDX R2 R3 R2 + 0x00040202, // 0039 ADD R1 R1 R2 + 0x90022001, // 003A SETMBR R0 K16 R1 + 0x88040106, // 003B GETMBR R1 R0 K6 + 0x88080101, // 003C GETMBR R2 R0 K1 + 0x00040202, // 003D ADD R1 R1 R2 + 0x40040311, // 003E CONNECT R1 R1 K17 + 0x88080105, // 003F GETMBR R2 R0 K5 + 0x94040401, // 0040 GETIDX R1 R2 R1 + 0x90020A01, // 0041 SETMBR R0 K5 R1 + 0x90020D07, // 0042 SETMBR R0 K6 K7 + 0x4C040000, // 0043 LDNIL R1 + 0x90020201, // 0044 SETMBR R0 K1 R1 + 0x70020000, // 0045 JMP #0047 + 0x80000200, // 0046 RET 0 + 0x70020000, // 0047 JMP #0049 + 0x80000200, // 0048 RET 0 + 0x7001FFB7, // 0049 JMP #0002 + 0x70020008, // 004A JMP #0054 + 0x88080106, // 004B GETMBR R2 R0 K6 + 0x40080511, // 004C CONNECT R2 R2 K17 + 0x880C0105, // 004D GETMBR R3 R0 K5 + 0x88040110, // 004E GETMBR R1 R0 K16 + 0x94080602, // 004F GETIDX R2 R3 R2 + 0x00040202, // 0050 ADD R1 R1 R2 + 0x90022001, // 0051 SETMBR R0 K16 R1 + 0x90020B0D, // 0052 SETMBR R0 K5 K13 + 0x90020D07, // 0053 SETMBR R0 K6 K7 + 0x80000000, // 0054 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: receive +********************************************************************/ +be_local_closure(Matter_HTTP_async_receive, /* name */ + be_nested_proto( + 6, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[15]) { /* constants */ + /* K0 */ be_nested_str_weak(tcp_connected), + /* K1 */ be_nested_str_weak(tasmota), + /* K2 */ be_nested_str_weak(millis), + /* K3 */ be_nested_str_weak(time_start), + /* K4 */ be_nested_str_weak(timeout), + /* K5 */ be_nested_str_weak(status), + /* K6 */ be_nested_str_weak(close), + /* K7 */ be_nested_str_weak(http_status), + /* K8 */ be_nested_str_weak(event_http_timeout), + /* K9 */ be_nested_str_weak(tcp), + /* K10 */ be_nested_str_weak(available), + /* K11 */ be_const_int(0), + /* K12 */ be_nested_str_weak(read), + /* K13 */ be_nested_str_weak(response), + /* K14 */ be_nested_str_weak(parse_http_response), + }), + be_str_weak(receive), + &be_const_str_solidified, + ( &(const binstruction[48]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x50080200, // 0001 LDBOOL R2 1 0 + 0x20040202, // 0002 NE R1 R1 R2 + 0x78060000, // 0003 JMPF R1 #0005 + 0x80000200, // 0004 RET 0 + 0xB8060200, // 0005 GETNGBL R1 K1 + 0x8C040302, // 0006 GETMET R1 R1 K2 + 0x7C040200, // 0007 CALL R1 1 + 0x88080103, // 0008 GETMBR R2 R0 K3 + 0x04040202, // 0009 SUB R1 R1 R2 + 0x88080104, // 000A GETMBR R2 R0 K4 + 0x24040202, // 000B GT R1 R1 R2 + 0x78060008, // 000C JMPF R1 #0016 + 0x5405FFFC, // 000D LDINT R1 -3 + 0x90020A01, // 000E SETMBR R0 K5 R1 + 0x8C040106, // 000F GETMET R1 R0 K6 + 0x7C040200, // 0010 CALL R1 1 + 0x5405FFFD, // 0011 LDINT R1 -2 + 0x90020E01, // 0012 SETMBR R0 K7 R1 + 0x8C040108, // 0013 GETMET R1 R0 K8 + 0x7C040200, // 0014 CALL R1 1 + 0x70020018, // 0015 JMP #002F + 0x88040109, // 0016 GETMBR R1 R0 K9 + 0x8C04030A, // 0017 GETMET R1 R1 K10 + 0x7C040200, // 0018 CALL R1 1 + 0x5808000B, // 0019 LDCONST R2 K11 + 0x240C030B, // 001A GT R3 R1 K11 + 0x780E000E, // 001B JMPF R3 #002B + 0x880C0109, // 001C GETMBR R3 R0 K9 + 0x8C0C070C, // 001D GETMET R3 R3 K12 + 0x7C0C0200, // 001E CALL R3 1 + 0x8810010D, // 001F GETMBR R4 R0 K13 + 0x00100803, // 0020 ADD R4 R4 R3 + 0x90021A04, // 0021 SETMBR R0 K13 R4 + 0x6010000C, // 0022 GETGBL R4 G12 + 0x5C140600, // 0023 MOVE R5 R3 + 0x7C100200, // 0024 CALL R4 1 + 0x00080404, // 0025 ADD R2 R2 R4 + 0x88100109, // 0026 GETMBR R4 R0 K9 + 0x8C10090A, // 0027 GETMET R4 R4 K10 + 0x7C100200, // 0028 CALL R4 1 + 0x5C040800, // 0029 MOVE R1 R4 + 0x7001FFEE, // 002A JMP #001A + 0x240C050B, // 002B GT R3 R2 K11 + 0x780E0001, // 002C JMPF R3 #002F + 0x8C0C010E, // 002D GETMET R3 R0 K14 + 0x7C0C0200, // 002E CALL R3 1 + 0x80000000, // 002F RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: event_http_finished +********************************************************************/ +be_local_closure(Matter_HTTP_async_event_http_finished, /* name */ + be_nested_proto( + 1, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 0, /* has constants */ + NULL, /* no const */ + be_str_weak(event_http_finished), + &be_const_str_solidified, + ( &(const binstruction[ 1]) { /* code */ + 0x80000000, // 0000 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: parse_http_headers +********************************************************************/ +be_local_closure(Matter_HTTP_async_parse_http_headers, /* name */ + be_nested_proto( + 6, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[17]) { /* constants */ + /* K0 */ be_nested_str_weak(global), + /* K1 */ be_nested_str_weak(_re_http_header), + /* K2 */ be_nested_str_weak(match2), + /* K3 */ be_nested_str_weak(response), + /* K4 */ be_nested_str_weak(response_offset), + /* K5 */ be_nested_str_weak(event_http_header), + /* K6 */ be_const_int(1), + /* K7 */ be_const_int(2), + /* K8 */ be_const_int(0), + /* K9 */ be_nested_str_weak(_re_http_body), + /* K10 */ be_nested_str_weak(event_http_headers_end), + /* K11 */ be_nested_str_weak(phase), + /* K12 */ be_nested_str_weak(parse_http_payload), + /* K13 */ be_nested_str_weak(close), + /* K14 */ be_nested_str_weak(status), + /* K15 */ be_nested_str_weak(http_status), + /* K16 */ be_nested_str_weak(event_http_failed), + }), + be_str_weak(parse_http_headers), + &be_const_str_solidified, + ( &(const binstruction[47]) { /* code */ + 0x50040200, // 0000 LDBOOL R1 1 0 + 0x7806002B, // 0001 JMPF R1 #002E + 0xB8060000, // 0002 GETNGBL R1 K0 + 0x88040301, // 0003 GETMBR R1 R1 K1 + 0x8C040302, // 0004 GETMET R1 R1 K2 + 0x880C0103, // 0005 GETMBR R3 R0 K3 + 0x88100104, // 0006 GETMBR R4 R0 K4 + 0x7C040600, // 0007 CALL R1 3 + 0x78060008, // 0008 JMPF R1 #0012 + 0x8C080105, // 0009 GETMET R2 R0 K5 + 0x94100306, // 000A GETIDX R4 R1 K6 + 0x94140307, // 000B GETIDX R5 R1 K7 + 0x7C080600, // 000C CALL R2 3 + 0x88080104, // 000D GETMBR R2 R0 K4 + 0x940C0308, // 000E GETIDX R3 R1 K8 + 0x00080403, // 000F ADD R2 R2 R3 + 0x90020802, // 0010 SETMBR R0 K4 R2 + 0x7002001A, // 0011 JMP #002D + 0xB80A0000, // 0012 GETNGBL R2 K0 + 0x88080509, // 0013 GETMBR R2 R2 K9 + 0x8C080502, // 0014 GETMET R2 R2 K2 + 0x88100103, // 0015 GETMBR R4 R0 K3 + 0x88140104, // 0016 GETMBR R5 R0 K4 + 0x7C080600, // 0017 CALL R2 3 + 0x780A0004, // 0018 JMPF R2 #001E + 0x8C0C010A, // 0019 GETMET R3 R0 K10 + 0x7C0C0200, // 001A CALL R3 1 + 0x90021707, // 001B SETMBR R0 K11 K7 + 0x8C0C010C, // 001C GETMET R3 R0 K12 + 0x7C0C0200, // 001D CALL R3 1 + 0x600C000C, // 001E GETGBL R3 G12 + 0x88100103, // 001F GETMBR R4 R0 K3 + 0x7C0C0200, // 0020 CALL R3 1 + 0x541203FF, // 0021 LDINT R4 1024 + 0x240C0604, // 0022 GT R3 R3 R4 + 0x780E0007, // 0023 JMPF R3 #002C + 0x8C0C010D, // 0024 GETMET R3 R0 K13 + 0x7C0C0200, // 0025 CALL R3 1 + 0x540DFFFB, // 0026 LDINT R3 -4 + 0x90021C03, // 0027 SETMBR R0 K14 R3 + 0x540DFFFE, // 0028 LDINT R3 -1 + 0x90021E03, // 0029 SETMBR R0 K15 R3 + 0x8C0C0110, // 002A GETMET R3 R0 K16 + 0x7C0C0200, // 002B CALL R3 1 + 0x80000600, // 002C RET 0 + 0x7001FFD1, // 002D JMP #0000 + 0x80000000, // 002E RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: parse_http_response +********************************************************************/ +be_local_closure(Matter_HTTP_async_parse_http_response, /* name */ + be_nested_proto( + 3, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 7]) { /* constants */ + /* K0 */ be_nested_str_weak(phase), + /* K1 */ be_const_int(0), + /* K2 */ be_nested_str_weak(parse_http_status_line), + /* K3 */ be_const_int(1), + /* K4 */ be_nested_str_weak(parse_http_headers), + /* K5 */ be_const_int(2), + /* K6 */ be_nested_str_weak(parse_http_payload), + }), + be_str_weak(parse_http_response), + &be_const_str_solidified, + ( &(const binstruction[18]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x1C040301, // 0001 EQ R1 R1 K1 + 0x78060002, // 0002 JMPF R1 #0006 + 0x8C040102, // 0003 GETMET R1 R0 K2 + 0x7C040200, // 0004 CALL R1 1 + 0x7002000A, // 0005 JMP #0011 + 0x88040100, // 0006 GETMBR R1 R0 K0 + 0x1C040303, // 0007 EQ R1 R1 K3 + 0x78060002, // 0008 JMPF R1 #000C + 0x8C040104, // 0009 GETMET R1 R0 K4 + 0x7C040200, // 000A CALL R1 1 + 0x70020004, // 000B JMP #0011 + 0x88040100, // 000C GETMBR R1 R0 K0 + 0x1C040305, // 000D EQ R1 R1 K5 + 0x78060001, // 000E JMPF R1 #0011 + 0x8C040106, // 000F GETMET R1 R0 K6 + 0x7C040200, // 0010 CALL R1 1 + 0x80000000, // 0011 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: begin +********************************************************************/ +be_local_closure(Matter_HTTP_async_begin, /* name */ + be_nested_proto( + 4, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 2]) { /* constants */ + /* K0 */ be_nested_str_weak(begin), + /* K1 */ be_nested_str_weak(cmd), + }), + be_str_weak(begin), + &be_const_str_solidified, + ( &(const binstruction[ 7]) { /* code */ + 0x60080003, // 0000 GETGBL R2 G3 + 0x5C0C0000, // 0001 MOVE R3 R0 + 0x7C080200, // 0002 CALL R2 1 + 0x8C080500, // 0003 GETMET R2 R2 K0 + 0x7C080200, // 0004 CALL R2 1 + 0x90020201, // 0005 SETMBR R0 K1 R1 + 0x80040400, // 0006 RET 1 R2 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: event_http_timeout +********************************************************************/ +be_local_closure(Matter_HTTP_async_event_http_timeout, /* name */ + be_nested_proto( + 1, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 0, /* has constants */ + NULL, /* no const */ + be_str_weak(event_http_timeout), + &be_const_str_solidified, + ( &(const binstruction[ 1]) { /* code */ + 0x80000000, // 0000 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: event_refused +********************************************************************/ +be_local_closure(Matter_HTTP_async_event_refused, /* name */ + be_nested_proto( + 3, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 2]) { /* constants */ + /* K0 */ be_nested_str_weak(http_status), + /* K1 */ be_nested_str_weak(event_http_failed), + }), + be_str_weak(event_refused), + &be_const_str_solidified, + ( &(const binstruction[ 5]) { /* code */ + 0x5405FFFE, // 0000 LDINT R1 -1 + 0x90020001, // 0001 SETMBR R0 K0 R1 + 0x8C040101, // 0002 GETMET R1 R0 K1 + 0x7C040200, // 0003 CALL R1 1 + 0x80000000, // 0004 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: send_http +********************************************************************/ +be_local_closure(Matter_HTTP_async_send_http, /* name */ + be_nested_proto( + 9, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[18]) { /* constants */ + /* K0 */ be_nested_str_weak(string), + /* K1 */ be_nested_str_weak(response), + /* K2 */ be_nested_str_weak(), + /* K3 */ be_nested_str_weak(addr), + /* K4 */ be_nested_str_weak(find), + /* K5 */ be_nested_str_weak(_X3A), + /* K6 */ be_const_int(0), + /* K7 */ be_nested_str_weak(_X5B), + /* K8 */ be_nested_str_weak(_X5D), + /* K9 */ be_nested_str_weak(format), + /* K10 */ be_nested_str_weak(HTTP_GET), + /* K11 */ be_nested_str_weak(cmd), + /* K12 */ be_nested_str_weak(port), + /* K13 */ be_nested_str_weak(write), + /* K14 */ be_nested_str_weak(close), + /* K15 */ be_nested_str_weak(status), + /* K16 */ be_nested_str_weak(http_status), + /* K17 */ be_nested_str_weak(event_http_failed), + }), + be_str_weak(send_http), + &be_const_str_solidified, + ( &(const binstruction[35]) { /* code */ + 0xA4060000, // 0000 IMPORT R1 K0 + 0x90020302, // 0001 SETMBR R0 K1 K2 + 0x88080103, // 0002 GETMBR R2 R0 K3 + 0x8C0C0304, // 0003 GETMET R3 R1 K4 + 0x5C140400, // 0004 MOVE R5 R2 + 0x58180005, // 0005 LDCONST R6 K5 + 0x7C0C0600, // 0006 CALL R3 3 + 0x280C0706, // 0007 GE R3 R3 K6 + 0x780E0002, // 0008 JMPF R3 #000C + 0x000E0E02, // 0009 ADD R3 K7 R2 + 0x000C0708, // 000A ADD R3 R3 K8 + 0x5C080600, // 000B MOVE R2 R3 + 0x8C0C0309, // 000C GETMET R3 R1 K9 + 0x8814010A, // 000D GETMBR R5 R0 K10 + 0x8818010B, // 000E GETMBR R6 R0 K11 + 0x5C1C0400, // 000F MOVE R7 R2 + 0x8820010C, // 0010 GETMBR R8 R0 K12 + 0x7C0C0A00, // 0011 CALL R3 5 + 0x8C10010D, // 0012 GETMET R4 R0 K13 + 0x5C180600, // 0013 MOVE R6 R3 + 0x7C100400, // 0014 CALL R4 2 + 0x6014000C, // 0015 GETGBL R5 G12 + 0x5C180600, // 0016 MOVE R6 R3 + 0x7C140200, // 0017 CALL R5 1 + 0x20140805, // 0018 NE R5 R4 R5 + 0x78160007, // 0019 JMPF R5 #0022 + 0x8C14010E, // 001A GETMET R5 R0 K14 + 0x7C140200, // 001B CALL R5 1 + 0x5415FFFB, // 001C LDINT R5 -4 + 0x90021E05, // 001D SETMBR R0 K15 R5 + 0x5415FFFE, // 001E LDINT R5 -1 + 0x90022005, // 001F SETMBR R0 K16 R5 + 0x8C140111, // 0020 GETMET R5 R0 K17 + 0x7C140200, // 0021 CALL R5 1 + 0x80000000, // 0022 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: event_http_headers_end +********************************************************************/ +be_local_closure(Matter_HTTP_async_event_http_headers_end, /* name */ + be_nested_proto( + 3, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 4]) { /* constants */ + /* K0 */ be_nested_str_weak(response_offset), + /* K1 */ be_const_int(0), + /* K2 */ be_nested_str_weak(response), + /* K3 */ be_const_int(2147483647), + }), + be_str_weak(event_http_headers_end), + &be_const_str_solidified, + ( &(const binstruction[10]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x24040301, // 0001 GT R1 R1 K1 + 0x78060005, // 0002 JMPF R1 #0009 + 0x88040100, // 0003 GETMBR R1 R0 K0 + 0x40040303, // 0004 CONNECT R1 R1 K3 + 0x88080102, // 0005 GETMBR R2 R0 K2 + 0x94040401, // 0006 GETIDX R1 R2 R1 + 0x90020401, // 0007 SETMBR R0 K2 R1 + 0x90020101, // 0008 SETMBR R0 K0 K1 + 0x80000000, // 0009 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified class: Matter_HTTP_async +********************************************************************/ +extern const bclass be_class_Matter_TCP_async; +be_local_class(Matter_HTTP_async, + 9, + &be_class_Matter_TCP_async, + be_nested_map(36, + ( (struct bmapnode*) &(const bmapnode[]) { + { be_const_key_weak(phase, -1), be_const_var(6) }, + { be_const_key_weak(event_http_headers_end, -1), be_const_closure(Matter_HTTP_async_event_http_headers_end_closure) }, + { be_const_key_weak(HTTP_GET, -1), be_nested_str_weak(GET_X20_X25s_X20HTTP_X2F1_X2E1_X0D_X0AHost_X20_X25s_X3A_X25s_X0D_X0AConnection_X3A_X20close_X0D_X0A_X0D_X0A) }, + { be_const_key_weak(send_http, 18), be_const_closure(Matter_HTTP_async_send_http_closure) }, + { be_const_key_weak(event_refused, 17), be_const_closure(Matter_HTTP_async_event_refused_closure) }, + { be_const_key_weak(payload, -1), be_const_var(4) }, + { be_const_key_weak(response, 20), be_const_var(1) }, + { be_const_key_weak(parse_http_status_line, -1), be_const_closure(Matter_HTTP_async_parse_http_status_line_closure) }, + { be_const_key_weak(event_http_header, -1), be_const_closure(Matter_HTTP_async_event_http_header_closure) }, + { be_const_key_weak(status_code, -1), be_const_var(3) }, + { be_const_key_weak(event_http_timeout, -1), be_const_closure(Matter_HTTP_async_event_http_timeout_closure) }, + { be_const_key_weak(cmd, -1), be_const_var(0) }, + { be_const_key_weak(event_http_failed, 4), be_const_closure(Matter_HTTP_async_event_http_failed_closure) }, + { be_const_key_weak(begin, -1), be_const_closure(Matter_HTTP_async_begin_closure) }, + { be_const_key_weak(chunk_size, 24), be_const_var(8) }, + { be_const_key_weak(init, 25), be_const_closure(Matter_HTTP_async_init_closure) }, + { be_const_key_weak(begin_sync, -1), be_const_closure(Matter_HTTP_async_begin_sync_closure) }, + { be_const_key_weak(reset, 33), be_const_closure(Matter_HTTP_async_reset_closure) }, + { be_const_key_weak(parse_http_headers, 22), be_const_closure(Matter_HTTP_async_parse_http_headers_closure) }, + { be_const_key_weak(event_http_finished, 23), be_const_closure(Matter_HTTP_async_event_http_finished_closure) }, + { be_const_key_weak(HTTP_BODY_REGEX, 34), be_nested_str_weak(_X0D_X0A) }, + { be_const_key_weak(event_http_status_code, -1), be_const_closure(Matter_HTTP_async_event_http_status_code_closure) }, + { be_const_key_weak(parse_http_payload, -1), be_const_closure(Matter_HTTP_async_parse_http_payload_closure) }, + { be_const_key_weak(HTTP_CHUNK_REGEX, -1), be_nested_str_weak(_X0D_X0A_X28_X5BA_X2DFa_X2Df0_X2D9_X5D_X2B_X29_X5B_X20_X09_X5D_X2A_X2E_X2A_X3F_X0D_X0A) }, + { be_const_key_weak(compile_re, 31), be_const_closure(Matter_HTTP_async_compile_re_closure) }, + { be_const_key_weak(event_timeout, 11), be_const_closure(Matter_HTTP_async_event_timeout_closure) }, + { be_const_key_weak(receive, -1), be_const_closure(Matter_HTTP_async_receive_closure) }, + { be_const_key_weak(HTTP_HEADER_REGEX, 19), be_nested_str_weak(_X28_X5BA_X2DZa_X2Dz0_X2D9_X2D_X5D_X2B_X29_X3A_X20_X28_X2E_X2A_X3F_X29_X0D_X0A) }, + { be_const_key_weak(http_status, 3), be_const_var(5) }, + { be_const_key_weak(parse_http_response, -1), be_const_closure(Matter_HTTP_async_parse_http_response_closure) }, + { be_const_key_weak(is_chunked, 13), be_const_var(7) }, + { be_const_key_weak(SPINLOCK, -1), be_const_int(5) }, + { be_const_key_weak(response_offset, 10), be_const_var(2) }, + { be_const_key_weak(HTTP_STATUS_REGEX, -1), be_nested_str_weak(HTTP_X2F1_X5C_X2E_X5B1_X2D2_X5D_X20_X28_X5Cd_X2B_X29_X20_X2E_X2A_X3F_X0D_X0A) }, + { be_const_key_weak(event_established, -1), be_const_closure(Matter_HTTP_async_event_established_closure) }, + { be_const_key_weak(event_available, 1), be_const_closure(Matter_HTTP_async_event_available_closure) }, + })), + be_str_weak(Matter_HTTP_async) +); +/*******************************************************************/ + +void be_load_Matter_HTTP_async_class(bvm *vm) { + be_pushntvclass(vm, &be_class_Matter_HTTP_async); + be_setglobal(vm, "Matter_HTTP_async"); + be_pop(vm, 1); +} +/********************************************************************/ +/* End of solidification */ diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_HTTP_remote.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_HTTP_remote.h new file mode 100644 index 000000000..e112e0935 --- /dev/null +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_HTTP_remote.h @@ -0,0 +1,363 @@ +/* Solidification of Matter_HTTP_remote.h */ +/********************************************************************\ +* Generated code, don't edit * +\********************************************************************/ +#include "be_constobj.h" + +extern const bclass be_class_Matter_HTTP_remote; + +/******************************************************************** +** Solidified function: init +********************************************************************/ +be_local_closure(Matter_HTTP_remote_init, /* name */ + be_nested_proto( + 11, /* nstack */ + 5, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 1]) { /* constants */ + /* K0 */ be_nested_str_weak(init), + }), + be_str_weak(init), + &be_const_str_solidified, + ( &(const binstruction[10]) { /* code */ + 0x60140003, // 0000 GETGBL R5 G3 + 0x5C180000, // 0001 MOVE R6 R0 + 0x7C140200, // 0002 CALL R5 1 + 0x8C140B00, // 0003 GETMET R5 R5 K0 + 0x5C1C0200, // 0004 MOVE R7 R1 + 0x5C200400, // 0005 MOVE R8 R2 + 0x5C240600, // 0006 MOVE R9 R3 + 0x5C280800, // 0007 MOVE R10 R4 + 0x7C140A00, // 0008 CALL R5 5 + 0x80000000, // 0009 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: begin_sync +********************************************************************/ +be_local_closure(Matter_HTTP_remote_begin_sync, /* name */ + be_nested_proto( + 12, /* nstack */ + 3, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 9]) { /* constants */ + /* K0 */ be_nested_str_weak(string), + /* K1 */ be_nested_str_weak(tasmota), + /* K2 */ be_nested_str_weak(log), + /* K3 */ be_nested_str_weak(format), + /* K4 */ be_nested_str_weak(MTR_X3A_X20HTTP_X20sync_X20request_X20_X27http_X3A_X2F_X2F_X25s_X3A_X25i_X2F_X25s_X27), + /* K5 */ be_nested_str_weak(addr), + /* K6 */ be_nested_str_weak(port), + /* K7 */ be_const_int(3), + /* K8 */ be_nested_str_weak(begin_sync), + }), + be_str_weak(begin_sync), + &be_const_str_solidified, + ( &(const binstruction[19]) { /* code */ + 0xA40E0000, // 0000 IMPORT R3 K0 + 0xB8120200, // 0001 GETNGBL R4 K1 + 0x8C100902, // 0002 GETMET R4 R4 K2 + 0x8C180703, // 0003 GETMET R6 R3 K3 + 0x58200004, // 0004 LDCONST R8 K4 + 0x88240105, // 0005 GETMBR R9 R0 K5 + 0x88280106, // 0006 GETMBR R10 R0 K6 + 0x5C2C0200, // 0007 MOVE R11 R1 + 0x7C180A00, // 0008 CALL R6 5 + 0x581C0007, // 0009 LDCONST R7 K7 + 0x7C100600, // 000A CALL R4 3 + 0x60100003, // 000B GETGBL R4 G3 + 0x5C140000, // 000C MOVE R5 R0 + 0x7C100200, // 000D CALL R4 1 + 0x8C100908, // 000E GETMET R4 R4 K8 + 0x5C180200, // 000F MOVE R6 R1 + 0x5C1C0400, // 0010 MOVE R7 R2 + 0x7C100600, // 0011 CALL R4 3 + 0x80040800, // 0012 RET 1 R4 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: event_http_finished +********************************************************************/ +be_local_closure(Matter_HTTP_remote_event_http_finished, /* name */ + be_nested_proto( + 10, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[14]) { /* constants */ + /* K0 */ be_nested_str_weak(string), + /* K1 */ be_nested_str_weak(payload), + /* K2 */ be_nested_str_weak(nil), + /* K3 */ be_const_int(0), + /* K4 */ be_nested_str_weak(_X2E_X2E_X2E), + /* K5 */ be_nested_str_weak(tasmota), + /* K6 */ be_nested_str_weak(log), + /* K7 */ be_nested_str_weak(format), + /* K8 */ be_nested_str_weak(MTR_X3A_X20HTTP_X20response_X20in_X20_X25i_X20ms_X3A_X20_X27_X25s_X27), + /* K9 */ be_nested_str_weak(millis), + /* K10 */ be_nested_str_weak(time_start), + /* K11 */ be_const_int(3), + /* K12 */ be_nested_str_weak(cb), + /* K13 */ be_nested_str_weak(http_status), + }), + be_str_weak(event_http_finished), + &be_const_str_solidified, + ( &(const binstruction[39]) { /* code */ + 0xA4060000, // 0000 IMPORT R1 K0 + 0x88080101, // 0001 GETMBR R2 R0 K1 + 0x4C0C0000, // 0002 LDNIL R3 + 0x20080403, // 0003 NE R2 R2 R3 + 0x780A0001, // 0004 JMPF R2 #0007 + 0x88080101, // 0005 GETMBR R2 R0 K1 + 0x70020000, // 0006 JMP #0008 + 0x58080002, // 0007 LDCONST R2 K2 + 0x600C000C, // 0008 GETGBL R3 G12 + 0x5C100400, // 0009 MOVE R4 R2 + 0x7C0C0200, // 000A CALL R3 1 + 0x5412001D, // 000B LDINT R4 30 + 0x240C0604, // 000C GT R3 R3 R4 + 0x780E0004, // 000D JMPF R3 #0013 + 0x540E001C, // 000E LDINT R3 29 + 0x400E0603, // 000F CONNECT R3 K3 R3 + 0x940C0403, // 0010 GETIDX R3 R2 R3 + 0x000C0704, // 0011 ADD R3 R3 K4 + 0x5C080600, // 0012 MOVE R2 R3 + 0xB80E0A00, // 0013 GETNGBL R3 K5 + 0x8C0C0706, // 0014 GETMET R3 R3 K6 + 0x8C140307, // 0015 GETMET R5 R1 K7 + 0x581C0008, // 0016 LDCONST R7 K8 + 0xB8220A00, // 0017 GETNGBL R8 K5 + 0x8C201109, // 0018 GETMET R8 R8 K9 + 0x7C200200, // 0019 CALL R8 1 + 0x8824010A, // 001A GETMBR R9 R0 K10 + 0x04201009, // 001B SUB R8 R8 R9 + 0x5C240400, // 001C MOVE R9 R2 + 0x7C140800, // 001D CALL R5 4 + 0x5818000B, // 001E LDCONST R6 K11 + 0x7C0C0600, // 001F CALL R3 3 + 0x880C010C, // 0020 GETMBR R3 R0 K12 + 0x780E0003, // 0021 JMPF R3 #0026 + 0x8C0C010C, // 0022 GETMET R3 R0 K12 + 0x8814010D, // 0023 GETMBR R5 R0 K13 + 0x88180101, // 0024 GETMBR R6 R0 K1 + 0x7C0C0600, // 0025 CALL R3 3 + 0x80000000, // 0026 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: event_http_failed +********************************************************************/ +be_local_closure(Matter_HTTP_remote_event_http_failed, /* name */ + be_nested_proto( + 5, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 6]) { /* constants */ + /* K0 */ be_nested_str_weak(tasmota), + /* K1 */ be_nested_str_weak(log), + /* K2 */ be_nested_str_weak(MTR_X3A_X20HTTP_X20failed), + /* K3 */ be_const_int(3), + /* K4 */ be_nested_str_weak(cb), + /* K5 */ be_nested_str_weak(http_status), + }), + be_str_weak(event_http_failed), + &be_const_str_solidified, + ( &(const binstruction[12]) { /* code */ + 0xB8060000, // 0000 GETNGBL R1 K0 + 0x8C040301, // 0001 GETMET R1 R1 K1 + 0x580C0002, // 0002 LDCONST R3 K2 + 0x58100003, // 0003 LDCONST R4 K3 + 0x7C040600, // 0004 CALL R1 3 + 0x88040104, // 0005 GETMBR R1 R0 K4 + 0x78060003, // 0006 JMPF R1 #000B + 0x8C040104, // 0007 GETMET R1 R0 K4 + 0x880C0105, // 0008 GETMBR R3 R0 K5 + 0x4C100000, // 0009 LDNIL R4 + 0x7C040600, // 000A CALL R1 3 + 0x80000000, // 000B RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: set_cb +********************************************************************/ +be_local_closure(Matter_HTTP_remote_set_cb, /* name */ + be_nested_proto( + 2, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 1]) { /* constants */ + /* K0 */ be_nested_str_weak(cb), + }), + be_str_weak(set_cb), + &be_const_str_solidified, + ( &(const binstruction[ 2]) { /* code */ + 0x90020001, // 0000 SETMBR R0 K0 R1 + 0x80000000, // 0001 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: begin +********************************************************************/ +be_local_closure(Matter_HTTP_remote_begin, /* name */ + be_nested_proto( + 11, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 9]) { /* constants */ + /* K0 */ be_nested_str_weak(string), + /* K1 */ be_nested_str_weak(tasmota), + /* K2 */ be_nested_str_weak(log), + /* K3 */ be_nested_str_weak(format), + /* K4 */ be_nested_str_weak(MTR_X3A_X20HTTP_X20async_X20request_X20_X27http_X3A_X2F_X2F_X25s_X3A_X25i_X2F_X25s_X27), + /* K5 */ be_nested_str_weak(addr), + /* K6 */ be_nested_str_weak(port), + /* K7 */ be_const_int(3), + /* K8 */ be_nested_str_weak(begin), + }), + be_str_weak(begin), + &be_const_str_solidified, + ( &(const binstruction[18]) { /* code */ + 0xA40A0000, // 0000 IMPORT R2 K0 + 0xB80E0200, // 0001 GETNGBL R3 K1 + 0x8C0C0702, // 0002 GETMET R3 R3 K2 + 0x8C140503, // 0003 GETMET R5 R2 K3 + 0x581C0004, // 0004 LDCONST R7 K4 + 0x88200105, // 0005 GETMBR R8 R0 K5 + 0x88240106, // 0006 GETMBR R9 R0 K6 + 0x5C280200, // 0007 MOVE R10 R1 + 0x7C140A00, // 0008 CALL R5 5 + 0x58180007, // 0009 LDCONST R6 K7 + 0x7C0C0600, // 000A CALL R3 3 + 0x600C0003, // 000B GETGBL R3 G3 + 0x5C100000, // 000C MOVE R4 R0 + 0x7C0C0200, // 000D CALL R3 1 + 0x8C0C0708, // 000E GETMET R3 R3 K8 + 0x5C140200, // 000F MOVE R5 R1 + 0x7C0C0400, // 0010 CALL R3 2 + 0x80040600, // 0011 RET 1 R3 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: event_http_timeout +********************************************************************/ +be_local_closure(Matter_HTTP_remote_event_http_timeout, /* name */ + be_nested_proto( + 5, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 6]) { /* constants */ + /* K0 */ be_nested_str_weak(tasmota), + /* K1 */ be_nested_str_weak(log), + /* K2 */ be_nested_str_weak(MTR_X3A_X20HTTP_X20timeout), + /* K3 */ be_const_int(3), + /* K4 */ be_nested_str_weak(cb), + /* K5 */ be_nested_str_weak(http_status), + }), + be_str_weak(event_http_timeout), + &be_const_str_solidified, + ( &(const binstruction[12]) { /* code */ + 0xB8060000, // 0000 GETNGBL R1 K0 + 0x8C040301, // 0001 GETMET R1 R1 K1 + 0x580C0002, // 0002 LDCONST R3 K2 + 0x58100003, // 0003 LDCONST R4 K3 + 0x7C040600, // 0004 CALL R1 3 + 0x88040104, // 0005 GETMBR R1 R0 K4 + 0x78060003, // 0006 JMPF R1 #000B + 0x8C040104, // 0007 GETMET R1 R0 K4 + 0x880C0105, // 0008 GETMBR R3 R0 K5 + 0x4C100000, // 0009 LDNIL R4 + 0x7C040600, // 000A CALL R1 3 + 0x80000000, // 000B RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified class: Matter_HTTP_remote +********************************************************************/ +extern const bclass be_class_Matter_HTTP_async; +be_local_class(Matter_HTTP_remote, + 1, + &be_class_Matter_HTTP_async, + be_nested_map(8, + ( (struct bmapnode*) &(const bmapnode[]) { + { be_const_key_weak(cb, 1), be_const_var(0) }, + { be_const_key_weak(event_http_timeout, -1), be_const_closure(Matter_HTTP_remote_event_http_timeout_closure) }, + { be_const_key_weak(event_http_failed, -1), be_const_closure(Matter_HTTP_remote_event_http_failed_closure) }, + { be_const_key_weak(init, 7), be_const_closure(Matter_HTTP_remote_init_closure) }, + { be_const_key_weak(begin_sync, 2), be_const_closure(Matter_HTTP_remote_begin_sync_closure) }, + { be_const_key_weak(set_cb, -1), be_const_closure(Matter_HTTP_remote_set_cb_closure) }, + { be_const_key_weak(begin, -1), be_const_closure(Matter_HTTP_remote_begin_closure) }, + { be_const_key_weak(event_http_finished, -1), be_const_closure(Matter_HTTP_remote_event_http_finished_closure) }, + })), + be_str_weak(Matter_HTTP_remote) +); +/*******************************************************************/ + +void be_load_Matter_HTTP_remote_class(bvm *vm) { + be_pushntvclass(vm, &be_class_Matter_HTTP_remote); + be_setglobal(vm, "Matter_HTTP_remote"); + be_pop(vm, 1); +} +/********************************************************************/ +/* End of solidification */ diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin.h index 147b3a143..56a8e65a6 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin.h @@ -6,6 +6,127 @@ extern const bclass be_class_Matter_Plugin; +/******************************************************************** +** Solidified function: every_250ms +********************************************************************/ +be_local_closure(Matter_Plugin_every_250ms, /* name */ + be_nested_proto( + 6, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[13]) { /* constants */ + /* K0 */ be_nested_str_weak(update_next), + /* K1 */ be_nested_str_weak(crypto), + /* K2 */ be_nested_str_weak(random), + /* K3 */ be_nested_str_weak(get), + /* K4 */ be_const_int(0), + /* K5 */ be_const_int(2147483647), + /* K6 */ be_nested_str_weak(tasmota), + /* K7 */ be_nested_str_weak(millis), + /* K8 */ be_nested_str_weak(UPDATE_TIME), + /* K9 */ be_nested_str_weak(time_reached), + /* K10 */ be_nested_str_weak(tick), + /* K11 */ be_nested_str_weak(device), + /* K12 */ be_nested_str_weak(probe_shadow_async), + }), + be_str_weak(every_250ms), + &be_const_str_solidified, + ( &(const binstruction[38]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x4C080000, // 0001 LDNIL R2 + 0x1C040202, // 0002 EQ R1 R1 R2 + 0x7806000F, // 0003 JMPF R1 #0014 + 0xA4060200, // 0004 IMPORT R1 K1 + 0x8C080302, // 0005 GETMET R2 R1 K2 + 0x54120003, // 0006 LDINT R4 4 + 0x7C080400, // 0007 CALL R2 2 + 0x8C080503, // 0008 GETMET R2 R2 K3 + 0x58100004, // 0009 LDCONST R4 K4 + 0x54160003, // 000A LDINT R5 4 + 0x7C080600, // 000B CALL R2 3 + 0x2C080505, // 000C AND R2 R2 K5 + 0xB80E0C00, // 000D GETNGBL R3 K6 + 0x8C0C0707, // 000E GETMET R3 R3 K7 + 0x88140108, // 000F GETMBR R5 R0 K8 + 0x10140405, // 0010 MOD R5 R2 R5 + 0x7C0C0400, // 0011 CALL R3 2 + 0x90020003, // 0012 SETMBR R0 K0 R3 + 0x70020010, // 0013 JMP #0025 + 0xB8060C00, // 0014 GETNGBL R1 K6 + 0x8C040309, // 0015 GETMET R1 R1 K9 + 0x880C0100, // 0016 GETMBR R3 R0 K0 + 0x7C040400, // 0017 CALL R1 2 + 0x7806000B, // 0018 JMPF R1 #0025 + 0x8804010A, // 0019 GETMBR R1 R0 K10 + 0x8808010B, // 001A GETMBR R2 R0 K11 + 0x8808050A, // 001B GETMBR R2 R2 K10 + 0x20040202, // 001C NE R1 R1 R2 + 0x78060001, // 001D JMPF R1 #0020 + 0x8C04010C, // 001E GETMET R1 R0 K12 + 0x7C040200, // 001F CALL R1 1 + 0xB8060C00, // 0020 GETNGBL R1 K6 + 0x8C040307, // 0021 GETMET R1 R1 K7 + 0x880C0108, // 0022 GETMBR R3 R0 K8 + 0x7C040400, // 0023 CALL R1 2 + 0x90020001, // 0024 SETMBR R0 K0 R1 + 0x80000000, // 0025 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: get_cluster_list +********************************************************************/ +be_local_closure(Matter_Plugin_get_cluster_list, /* name */ + be_nested_proto( + 8, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 4]) { /* constants */ + /* K0 */ be_nested_str_weak(clusters), + /* K1 */ be_nested_str_weak(keys), + /* K2 */ be_nested_str_weak(push), + /* K3 */ be_nested_str_weak(stop_iteration), + }), + be_str_weak(get_cluster_list), + &be_const_str_solidified, + ( &(const binstruction[18]) { /* code */ + 0x60080012, // 0000 GETGBL R2 G18 + 0x7C080000, // 0001 CALL R2 0 + 0x600C0010, // 0002 GETGBL R3 G16 + 0x88100100, // 0003 GETMBR R4 R0 K0 + 0x8C100901, // 0004 GETMET R4 R4 K1 + 0x7C100200, // 0005 CALL R4 1 + 0x7C0C0200, // 0006 CALL R3 1 + 0xA8020005, // 0007 EXBLK 0 #000E + 0x5C100600, // 0008 MOVE R4 R3 + 0x7C100000, // 0009 CALL R4 0 + 0x8C140502, // 000A GETMET R5 R2 K2 + 0x5C1C0800, // 000B MOVE R7 R4 + 0x7C140400, // 000C CALL R5 2 + 0x7001FFF9, // 000D JMP #0008 + 0x580C0003, // 000E LDCONST R3 K3 + 0xAC0C0200, // 000F CATCH R3 1 0 + 0xB0080000, // 0010 RAISE 2 R0 R0 + 0x80040400, // 0011 RET 1 R2 + }) + ) +); +/*******************************************************************/ + + /******************************************************************** ** Solidified function: ********************************************************************/ @@ -34,32 +155,24 @@ be_local_closure(Matter_Plugin__X3Clambda_X3E, /* name */ /******************************************************************** -** Solidified function: get_attribute_list +** Solidified function: write_attribute ********************************************************************/ -be_local_closure(Matter_Plugin_get_attribute_list, /* name */ +be_local_closure(Matter_Plugin_write_attribute, /* name */ be_nested_proto( - 7, /* nstack */ - 3, /* argc */ + 5, /* nstack */ + 4, /* argc */ 2, /* varg */ 0, /* has upvals */ NULL, /* no upvals */ 0, /* has sup protos */ NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 2]) { /* constants */ - /* K0 */ be_nested_str_weak(clusters), - /* K1 */ be_nested_str_weak(find), - }), - be_str_weak(get_attribute_list), + 0, /* has constants */ + NULL, /* no const */ + be_str_weak(write_attribute), &be_const_str_solidified, - ( &(const binstruction[ 7]) { /* code */ - 0x880C0100, // 0000 GETMBR R3 R0 K0 - 0x8C0C0701, // 0001 GETMET R3 R3 K1 - 0x5C140400, // 0002 MOVE R5 R2 - 0x60180012, // 0003 GETGBL R6 G18 - 0x7C180000, // 0004 CALL R6 0 - 0x7C0C0600, // 0005 CALL R3 3 - 0x80040600, // 0006 RET 1 R3 + ( &(const binstruction[ 2]) { /* code */ + 0x4C100000, // 0000 LDNIL R4 + 0x80040800, // 0001 RET 1 R4 }) ) ); @@ -67,42 +180,48 @@ be_local_closure(Matter_Plugin_get_attribute_list, /* name */ /******************************************************************** -** Solidified function: has +** Solidified function: parse_sensors ********************************************************************/ -be_local_closure(Matter_Plugin_has, /* name */ +be_local_closure(Matter_Plugin_parse_sensors, /* name */ be_nested_proto( - 6, /* nstack */ - 3, /* argc */ + 2, /* nstack */ + 2, /* argc */ 2, /* varg */ 0, /* has upvals */ NULL, /* no upvals */ 0, /* has sup protos */ NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 4]) { /* constants */ - /* K0 */ be_nested_str_weak(clusters), - /* K1 */ be_nested_str_weak(contains), - /* K2 */ be_nested_str_weak(endpoints), - /* K3 */ be_nested_str_weak(find), - }), - be_str_weak(has), + 0, /* has constants */ + NULL, /* no const */ + be_str_weak(parse_sensors), &be_const_str_solidified, - ( &(const binstruction[15]) { /* code */ - 0x880C0100, // 0000 GETMBR R3 R0 K0 - 0x8C0C0701, // 0001 GETMET R3 R3 K1 - 0x5C140200, // 0002 MOVE R5 R1 - 0x7C0C0400, // 0003 CALL R3 2 - 0x780E0006, // 0004 JMPF R3 #000C - 0x880C0102, // 0005 GETMBR R3 R0 K2 - 0x8C0C0703, // 0006 GETMET R3 R3 K3 - 0x5C140400, // 0007 MOVE R5 R2 - 0x7C0C0400, // 0008 CALL R3 2 - 0x4C100000, // 0009 LDNIL R4 - 0x200C0604, // 000A NE R3 R3 R4 - 0x740E0000, // 000B JMPT R3 #000D - 0x500C0001, // 000C LDBOOL R3 0 1 - 0x500C0200, // 000D LDBOOL R3 1 0 - 0x80040600, // 000E RET 1 R3 + ( &(const binstruction[ 1]) { /* code */ + 0x80000000, // 0000 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: invoke_request +********************************************************************/ +be_local_closure(Matter_Plugin_invoke_request, /* name */ + be_nested_proto( + 5, /* nstack */ + 4, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 0, /* has constants */ + NULL, /* no const */ + be_str_weak(invoke_request), + &be_const_str_solidified, + ( &(const binstruction[ 2]) { /* code */ + 0x4C100000, // 0000 LDNIL R4 + 0x80040800, // 0001 RET 1 R4 }) ) ); @@ -212,118 +331,6 @@ be_local_closure(Matter_Plugin_consolidate_clusters, /* name */ /*******************************************************************/ -/******************************************************************** -** Solidified function: get_endpoint -********************************************************************/ -be_local_closure(Matter_Plugin_get_endpoint, /* name */ - be_nested_proto( - 2, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 1]) { /* constants */ - /* K0 */ be_nested_str_weak(endpoint), - }), - be_str_weak(get_endpoint), - &be_const_str_solidified, - ( &(const binstruction[ 2]) { /* code */ - 0x88040100, // 0000 GETMBR R1 R0 K0 - 0x80040200, // 0001 RET 1 R1 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: timed_request -********************************************************************/ -be_local_closure(Matter_Plugin_timed_request, /* name */ - be_nested_proto( - 5, /* nstack */ - 4, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 0, /* has constants */ - NULL, /* no const */ - be_str_weak(timed_request), - &be_const_str_solidified, - ( &(const binstruction[ 2]) { /* code */ - 0x4C100000, // 0000 LDNIL R4 - 0x80040800, // 0001 RET 1 R4 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: subscribe_event -********************************************************************/ -be_local_closure(Matter_Plugin_subscribe_event, /* name */ - be_nested_proto( - 6, /* nstack */ - 5, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 0, /* has constants */ - NULL, /* no const */ - be_str_weak(subscribe_event), - &be_const_str_solidified, - ( &(const binstruction[ 2]) { /* code */ - 0x4C140000, // 0000 LDNIL R5 - 0x80040A00, // 0001 RET 1 R5 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: update_shadow_lazy -********************************************************************/ -be_local_closure(Matter_Plugin_update_shadow_lazy, /* name */ - be_nested_proto( - 3, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 3]) { /* constants */ - /* K0 */ be_nested_str_weak(tick), - /* K1 */ be_nested_str_weak(device), - /* K2 */ be_nested_str_weak(update_shadow), - }), - be_str_weak(update_shadow_lazy), - &be_const_str_solidified, - ( &(const binstruction[ 8]) { /* code */ - 0x88040100, // 0000 GETMBR R1 R0 K0 - 0x88080101, // 0001 GETMBR R2 R0 K1 - 0x88080500, // 0002 GETMBR R2 R2 K0 - 0x20040202, // 0003 NE R1 R1 R2 - 0x78060001, // 0004 JMPF R1 #0007 - 0x8C040102, // 0005 GETMET R1 R0 K2 - 0x7C040200, // 0006 CALL R1 1 - 0x80000000, // 0007 RET 0 - }) - ) -); -/*******************************************************************/ - - /******************************************************************** ** Solidified function: attribute_updated ********************************************************************/ @@ -360,12 +367,12 @@ be_local_closure(Matter_Plugin_attribute_updated, /* name */ /******************************************************************** -** Solidified function: get_cluster_list +** Solidified function: has ********************************************************************/ -be_local_closure(Matter_Plugin_get_cluster_list, /* name */ +be_local_closure(Matter_Plugin_has, /* name */ be_nested_proto( - 8, /* nstack */ - 2, /* argc */ + 6, /* nstack */ + 3, /* argc */ 2, /* varg */ 0, /* has upvals */ NULL, /* no upvals */ @@ -374,31 +381,383 @@ be_local_closure(Matter_Plugin_get_cluster_list, /* name */ 1, /* has constants */ ( &(const bvalue[ 4]) { /* constants */ /* K0 */ be_nested_str_weak(clusters), - /* K1 */ be_nested_str_weak(keys), - /* K2 */ be_nested_str_weak(push), - /* K3 */ be_nested_str_weak(stop_iteration), + /* K1 */ be_nested_str_weak(contains), + /* K2 */ be_nested_str_weak(endpoints), + /* K3 */ be_nested_str_weak(find), }), - be_str_weak(get_cluster_list), + be_str_weak(has), &be_const_str_solidified, - ( &(const binstruction[18]) { /* code */ - 0x60080012, // 0000 GETGBL R2 G18 - 0x7C080000, // 0001 CALL R2 0 - 0x600C0010, // 0002 GETGBL R3 G16 - 0x88100100, // 0003 GETMBR R4 R0 K0 - 0x8C100901, // 0004 GETMET R4 R4 K1 - 0x7C100200, // 0005 CALL R4 1 - 0x7C0C0200, // 0006 CALL R3 1 - 0xA8020005, // 0007 EXBLK 0 #000E - 0x5C100600, // 0008 MOVE R4 R3 - 0x7C100000, // 0009 CALL R4 0 - 0x8C140502, // 000A GETMET R5 R2 K2 - 0x5C1C0800, // 000B MOVE R7 R4 - 0x7C140400, // 000C CALL R5 2 - 0x7001FFF9, // 000D JMP #0008 - 0x580C0003, // 000E LDCONST R3 K3 - 0xAC0C0200, // 000F CATCH R3 1 0 - 0xB0080000, // 0010 RAISE 2 R0 R0 - 0x80040400, // 0011 RET 1 R2 + ( &(const binstruction[15]) { /* code */ + 0x880C0100, // 0000 GETMBR R3 R0 K0 + 0x8C0C0701, // 0001 GETMET R3 R3 K1 + 0x5C140200, // 0002 MOVE R5 R1 + 0x7C0C0400, // 0003 CALL R3 2 + 0x780E0006, // 0004 JMPF R3 #000C + 0x880C0102, // 0005 GETMBR R3 R0 K2 + 0x8C0C0703, // 0006 GETMET R3 R3 K3 + 0x5C140400, // 0007 MOVE R5 R2 + 0x7C0C0400, // 0008 CALL R3 2 + 0x4C100000, // 0009 LDNIL R4 + 0x200C0604, // 000A NE R3 R3 R4 + 0x740E0000, // 000B JMPT R3 #000D + 0x500C0001, // 000C LDBOOL R3 0 1 + 0x500C0200, // 000D LDBOOL R3 1 0 + 0x80040600, // 000E RET 1 R3 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: update_shadow_lazy +********************************************************************/ +be_local_closure(Matter_Plugin_update_shadow_lazy, /* name */ + be_nested_proto( + 3, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 3]) { /* constants */ + /* K0 */ be_nested_str_weak(tick), + /* K1 */ be_nested_str_weak(device), + /* K2 */ be_nested_str_weak(update_shadow), + }), + be_str_weak(update_shadow_lazy), + &be_const_str_solidified, + ( &(const binstruction[11]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x88080101, // 0001 GETMBR R2 R0 K1 + 0x88080500, // 0002 GETMBR R2 R2 K0 + 0x20040202, // 0003 NE R1 R1 R2 + 0x78060004, // 0004 JMPF R1 #000A + 0x8C040102, // 0005 GETMET R1 R0 K2 + 0x7C040200, // 0006 CALL R1 1 + 0x88040101, // 0007 GETMBR R1 R0 K1 + 0x88040300, // 0008 GETMBR R1 R1 K0 + 0x90020001, // 0009 SETMBR R0 K0 R1 + 0x80000000, // 000A RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: get_endpoint +********************************************************************/ +be_local_closure(Matter_Plugin_get_endpoint, /* name */ + be_nested_proto( + 2, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 1]) { /* constants */ + /* K0 */ be_nested_str_weak(endpoint), + }), + be_str_weak(get_endpoint), + &be_const_str_solidified, + ( &(const binstruction[ 2]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x80040200, // 0001 RET 1 R1 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: parse_update +********************************************************************/ +be_local_closure(Matter_Plugin_parse_update, /* name */ + be_nested_proto( + 2, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 0, /* has constants */ + NULL, /* no const */ + be_str_weak(parse_update), + &be_const_str_solidified, + ( &(const binstruction[ 1]) { /* code */ + 0x80000000, // 0000 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: init +********************************************************************/ +be_local_closure(Matter_Plugin_init, /* name */ + be_nested_proto( + 6, /* nstack */ + 4, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 4]) { /* constants */ + /* K0 */ be_nested_str_weak(device), + /* K1 */ be_nested_str_weak(endpoint), + /* K2 */ be_nested_str_weak(clusters), + /* K3 */ be_nested_str_weak(consolidate_clusters), + }), + be_str_weak(init), + &be_const_str_solidified, + ( &(const binstruction[ 6]) { /* code */ + 0x90020001, // 0000 SETMBR R0 K0 R1 + 0x90020202, // 0001 SETMBR R0 K1 R2 + 0x8C100103, // 0002 GETMET R4 R0 K3 + 0x7C100200, // 0003 CALL R4 1 + 0x90020404, // 0004 SETMBR R0 K2 R4 + 0x80000000, // 0005 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: read_event +********************************************************************/ +be_local_closure(Matter_Plugin_read_event, /* name */ + be_nested_proto( + 6, /* nstack */ + 5, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 0, /* has constants */ + NULL, /* no const */ + be_str_weak(read_event), + &be_const_str_solidified, + ( &(const binstruction[ 2]) { /* code */ + 0x4C140000, // 0000 LDNIL R5 + 0x80040A00, // 0001 RET 1 R5 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: subscribe_attribute +********************************************************************/ +be_local_closure(Matter_Plugin_subscribe_attribute, /* name */ + be_nested_proto( + 6, /* nstack */ + 5, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 0, /* has constants */ + NULL, /* no const */ + be_str_weak(subscribe_attribute), + &be_const_str_solidified, + ( &(const binstruction[ 2]) { /* code */ + 0x4C140000, // 0000 LDNIL R5 + 0x80040A00, // 0001 RET 1 R5 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: ui_string_to_conf +********************************************************************/ +be_local_closure(Matter_Plugin_ui_string_to_conf, /* name */ + be_nested_proto( + 8, /* nstack */ + 3, /* argc */ + 4, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 3]) { /* constants */ + /* K0 */ be_const_class(be_class_Matter_Plugin), + /* K1 */ be_nested_str_weak(ARG), + /* K2 */ be_nested_str_weak(ARG_TYPE), + }), + be_str_weak(ui_string_to_conf), + &be_const_str_solidified, + ( &(const binstruction[10]) { /* code */ + 0x580C0000, // 0000 LDCONST R3 K0 + 0x88100101, // 0001 GETMBR R4 R0 K1 + 0x88140102, // 0002 GETMBR R5 R0 K2 + 0x780A0004, // 0003 JMPF R2 #0009 + 0x78120003, // 0004 JMPF R4 #0009 + 0x5C180A00, // 0005 MOVE R6 R5 + 0x5C1C0400, // 0006 MOVE R7 R2 + 0x7C180200, // 0007 CALL R6 1 + 0x98040806, // 0008 SETIDX R1 R4 R6 + 0x80040200, // 0009 RET 1 R1 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: subscribe_event +********************************************************************/ +be_local_closure(Matter_Plugin_subscribe_event, /* name */ + be_nested_proto( + 6, /* nstack */ + 5, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 0, /* has constants */ + NULL, /* no const */ + be_str_weak(subscribe_event), + &be_const_str_solidified, + ( &(const binstruction[ 2]) { /* code */ + 0x4C140000, // 0000 LDNIL R5 + 0x80040A00, // 0001 RET 1 R5 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: get_attribute_list +********************************************************************/ +be_local_closure(Matter_Plugin_get_attribute_list, /* name */ + be_nested_proto( + 7, /* nstack */ + 3, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 2]) { /* constants */ + /* K0 */ be_nested_str_weak(clusters), + /* K1 */ be_nested_str_weak(find), + }), + be_str_weak(get_attribute_list), + &be_const_str_solidified, + ( &(const binstruction[ 7]) { /* code */ + 0x880C0100, // 0000 GETMBR R3 R0 K0 + 0x8C0C0701, // 0001 GETMET R3 R3 K1 + 0x5C140400, // 0002 MOVE R5 R2 + 0x60180012, // 0003 GETGBL R6 G18 + 0x7C180000, // 0004 CALL R6 0 + 0x7C0C0600, // 0005 CALL R3 3 + 0x80040600, // 0006 RET 1 R3 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: timed_request +********************************************************************/ +be_local_closure(Matter_Plugin_timed_request, /* name */ + be_nested_proto( + 5, /* nstack */ + 4, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 0, /* has constants */ + NULL, /* no const */ + be_str_weak(timed_request), + &be_const_str_solidified, + ( &(const binstruction[ 2]) { /* code */ + 0x4C100000, // 0000 LDNIL R4 + 0x80040800, // 0001 RET 1 R4 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: update_shadow +********************************************************************/ +be_local_closure(Matter_Plugin_update_shadow, /* name */ + be_nested_proto( + 4, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 3]) { /* constants */ + /* K0 */ be_nested_str_weak(tick), + /* K1 */ be_nested_str_weak(device), + /* K2 */ be_nested_str_weak(parse_update), + }), + be_str_weak(update_shadow), + &be_const_str_solidified, + ( &(const binstruction[ 7]) { /* code */ + 0x88040101, // 0000 GETMBR R1 R0 K1 + 0x88040300, // 0001 GETMBR R1 R1 K0 + 0x90020001, // 0002 SETMBR R0 K0 R1 + 0x8C040102, // 0003 GETMET R1 R0 K2 + 0x4C0C0000, // 0004 LDNIL R3 + 0x7C040400, // 0005 CALL R1 2 + 0x80000000, // 0006 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: probe_shadow_async +********************************************************************/ +be_local_closure(Matter_Plugin_probe_shadow_async, /* name */ + be_nested_proto( + 3, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 1]) { /* constants */ + /* K0 */ be_nested_str_weak(update_shadow), + }), + be_str_weak(probe_shadow_async), + &be_const_str_solidified, + ( &(const binstruction[ 3]) { /* code */ + 0x8C040100, // 0000 GETMET R1 R0 K0 + 0x7C040200, // 0001 CALL R1 1 + 0x80000000, // 0002 RET 0 }) ) ); @@ -540,326 +899,6 @@ be_local_closure(Matter_Plugin_read_attribute, /* name */ /*******************************************************************/ -/******************************************************************** -** Solidified function: write_attribute -********************************************************************/ -be_local_closure(Matter_Plugin_write_attribute, /* name */ - be_nested_proto( - 5, /* nstack */ - 4, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 0, /* has constants */ - NULL, /* no const */ - be_str_weak(write_attribute), - &be_const_str_solidified, - ( &(const binstruction[ 2]) { /* code */ - 0x4C100000, // 0000 LDNIL R4 - 0x80040800, // 0001 RET 1 R4 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: subscribe_attribute -********************************************************************/ -be_local_closure(Matter_Plugin_subscribe_attribute, /* name */ - be_nested_proto( - 6, /* nstack */ - 5, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 0, /* has constants */ - NULL, /* no const */ - be_str_weak(subscribe_attribute), - &be_const_str_solidified, - ( &(const binstruction[ 2]) { /* code */ - 0x4C140000, // 0000 LDNIL R5 - 0x80040A00, // 0001 RET 1 R5 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: update_shadow -********************************************************************/ -be_local_closure(Matter_Plugin_update_shadow, /* name */ - be_nested_proto( - 2, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 2]) { /* constants */ - /* K0 */ be_nested_str_weak(tick), - /* K1 */ be_nested_str_weak(device), - }), - be_str_weak(update_shadow), - &be_const_str_solidified, - ( &(const binstruction[ 4]) { /* code */ - 0x88040101, // 0000 GETMBR R1 R0 K1 - 0x88040300, // 0001 GETMBR R1 R1 K0 - 0x90020001, // 0002 SETMBR R0 K0 R1 - 0x80000000, // 0003 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: init -********************************************************************/ -be_local_closure(Matter_Plugin_init, /* name */ - be_nested_proto( - 6, /* nstack */ - 4, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 4]) { /* constants */ - /* K0 */ be_nested_str_weak(device), - /* K1 */ be_nested_str_weak(endpoint), - /* K2 */ be_nested_str_weak(clusters), - /* K3 */ be_nested_str_weak(consolidate_clusters), - }), - be_str_weak(init), - &be_const_str_solidified, - ( &(const binstruction[ 6]) { /* code */ - 0x90020001, // 0000 SETMBR R0 K0 R1 - 0x90020202, // 0001 SETMBR R0 K1 R2 - 0x8C100103, // 0002 GETMET R4 R0 K3 - 0x7C100200, // 0003 CALL R4 1 - 0x90020404, // 0004 SETMBR R0 K2 R4 - 0x80000000, // 0005 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: read_event -********************************************************************/ -be_local_closure(Matter_Plugin_read_event, /* name */ - be_nested_proto( - 6, /* nstack */ - 5, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 0, /* has constants */ - NULL, /* no const */ - be_str_weak(read_event), - &be_const_str_solidified, - ( &(const binstruction[ 2]) { /* code */ - 0x4C140000, // 0000 LDNIL R5 - 0x80040A00, // 0001 RET 1 R5 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: get_types -********************************************************************/ -be_local_closure(Matter_Plugin_get_types, /* name */ - be_nested_proto( - 2, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 1]) { /* constants */ - /* K0 */ be_nested_str_weak(TYPES), - }), - be_str_weak(get_types), - &be_const_str_solidified, - ( &(const binstruction[ 2]) { /* code */ - 0x88040100, // 0000 GETMBR R1 R0 K0 - 0x80040200, // 0001 RET 1 R1 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: ui_string_to_conf -********************************************************************/ -be_local_closure(Matter_Plugin_ui_string_to_conf, /* name */ - be_nested_proto( - 8, /* nstack */ - 3, /* argc */ - 4, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 3]) { /* constants */ - /* K0 */ be_const_class(be_class_Matter_Plugin), - /* K1 */ be_nested_str_weak(ARG), - /* K2 */ be_nested_str_weak(ARG_TYPE), - }), - be_str_weak(ui_string_to_conf), - &be_const_str_solidified, - ( &(const binstruction[10]) { /* code */ - 0x580C0000, // 0000 LDCONST R3 K0 - 0x88100101, // 0001 GETMBR R4 R0 K1 - 0x88140102, // 0002 GETMBR R5 R0 K2 - 0x780A0004, // 0003 JMPF R2 #0009 - 0x78120003, // 0004 JMPF R4 #0009 - 0x5C180A00, // 0005 MOVE R6 R5 - 0x5C1C0400, // 0006 MOVE R7 R2 - 0x7C180200, // 0007 CALL R6 1 - 0x98040806, // 0008 SETIDX R1 R4 R6 - 0x80040200, // 0009 RET 1 R1 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: invoke_request -********************************************************************/ -be_local_closure(Matter_Plugin_invoke_request, /* name */ - be_nested_proto( - 5, /* nstack */ - 4, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 0, /* has constants */ - NULL, /* no const */ - be_str_weak(invoke_request), - &be_const_str_solidified, - ( &(const binstruction[ 2]) { /* code */ - 0x4C100000, // 0000 LDNIL R4 - 0x80040800, // 0001 RET 1 R4 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: parse_sensors -********************************************************************/ -be_local_closure(Matter_Plugin_parse_sensors, /* name */ - be_nested_proto( - 2, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 0, /* has constants */ - NULL, /* no const */ - be_str_weak(parse_sensors), - &be_const_str_solidified, - ( &(const binstruction[ 1]) { /* code */ - 0x80000000, // 0000 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: every_250ms -********************************************************************/ -be_local_closure(Matter_Plugin_every_250ms, /* name */ - be_nested_proto( - 6, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[11]) { /* constants */ - /* K0 */ be_nested_str_weak(update_next), - /* K1 */ be_nested_str_weak(crypto), - /* K2 */ be_nested_str_weak(random), - /* K3 */ be_nested_str_weak(get), - /* K4 */ be_const_int(0), - /* K5 */ be_const_int(2147483647), - /* K6 */ be_nested_str_weak(tasmota), - /* K7 */ be_nested_str_weak(millis), - /* K8 */ be_nested_str_weak(UPDATE_TIME), - /* K9 */ be_nested_str_weak(time_reached), - /* K10 */ be_nested_str_weak(update_shadow_lazy), - }), - be_str_weak(every_250ms), - &be_const_str_solidified, - ( &(const binstruction[33]) { /* code */ - 0x88040100, // 0000 GETMBR R1 R0 K0 - 0x4C080000, // 0001 LDNIL R2 - 0x1C040202, // 0002 EQ R1 R1 R2 - 0x7806000F, // 0003 JMPF R1 #0014 - 0xA4060200, // 0004 IMPORT R1 K1 - 0x8C080302, // 0005 GETMET R2 R1 K2 - 0x54120003, // 0006 LDINT R4 4 - 0x7C080400, // 0007 CALL R2 2 - 0x8C080503, // 0008 GETMET R2 R2 K3 - 0x58100004, // 0009 LDCONST R4 K4 - 0x54160003, // 000A LDINT R5 4 - 0x7C080600, // 000B CALL R2 3 - 0x2C080505, // 000C AND R2 R2 K5 - 0xB80E0C00, // 000D GETNGBL R3 K6 - 0x8C0C0707, // 000E GETMET R3 R3 K7 - 0x88140108, // 000F GETMBR R5 R0 K8 - 0x10140405, // 0010 MOD R5 R2 R5 - 0x7C0C0400, // 0011 CALL R3 2 - 0x90020003, // 0012 SETMBR R0 K0 R3 - 0x7002000B, // 0013 JMP #0020 - 0xB8060C00, // 0014 GETNGBL R1 K6 - 0x8C040309, // 0015 GETMET R1 R1 K9 - 0x880C0100, // 0016 GETMBR R3 R0 K0 - 0x7C040400, // 0017 CALL R1 2 - 0x78060006, // 0018 JMPF R1 #0020 - 0x8C04010A, // 0019 GETMET R1 R0 K10 - 0x7C040200, // 001A CALL R1 1 - 0xB8060C00, // 001B GETNGBL R1 K6 - 0x8C040307, // 001C GETMET R1 R1 K7 - 0x880C0108, // 001D GETMBR R3 R0 K8 - 0x7C040400, // 001E CALL R1 2 - 0x90020001, // 001F SETMBR R0 K0 R1 - 0x80000000, // 0020 RET 0 - }) - ) -); -/*******************************************************************/ - - /******************************************************************** ** Solidified function: ui_conf_to_string ********************************************************************/ @@ -900,38 +939,67 @@ be_local_closure(Matter_Plugin_ui_conf_to_string, /* name */ /*******************************************************************/ +/******************************************************************** +** Solidified function: get_types +********************************************************************/ +be_local_closure(Matter_Plugin_get_types, /* name */ + be_nested_proto( + 2, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 1]) { /* constants */ + /* K0 */ be_nested_str_weak(TYPES), + }), + be_str_weak(get_types), + &be_const_str_solidified, + ( &(const binstruction[ 2]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x80040200, // 0001 RET 1 R1 + }) + ) +); +/*******************************************************************/ + + /******************************************************************** ** Solidified class: Matter_Plugin ********************************************************************/ be_local_class(Matter_Plugin, 5, NULL, - be_nested_map(32, + be_nested_map(34, ( (struct bmapnode*) &(const bmapnode[]) { - { be_const_key_weak(ARG_TYPE, 5), be_const_static_closure(Matter_Plugin__X3Clambda_X3E_closure) }, - { be_const_key_weak(get_attribute_list, -1), be_const_closure(Matter_Plugin_get_attribute_list_closure) }, - { be_const_key_weak(ui_conf_to_string, 11), be_const_static_closure(Matter_Plugin_ui_conf_to_string_closure) }, - { be_const_key_weak(has, -1), be_const_closure(Matter_Plugin_has_closure) }, - { be_const_key_weak(tick, -1), be_const_var(4) }, - { be_const_key_weak(every_250ms, -1), be_const_closure(Matter_Plugin_every_250ms_closure) }, + { be_const_key_weak(every_250ms, 11), be_const_closure(Matter_Plugin_every_250ms_closure) }, + { be_const_key_weak(get_cluster_list, 24), be_const_closure(Matter_Plugin_get_cluster_list_closure) }, { be_const_key_weak(NAME, -1), be_nested_str_weak() }, - { be_const_key_weak(ARG, 16), be_nested_str_weak() }, - { be_const_key_weak(UPDATE_TIME, -1), be_const_int(5000) }, - { be_const_key_weak(get_endpoint, -1), be_const_closure(Matter_Plugin_get_endpoint_closure) }, - { be_const_key_weak(timed_request, -1), be_const_closure(Matter_Plugin_timed_request_closure) }, - { be_const_key_weak(clusters, 17), be_const_var(3) }, - { be_const_key_weak(subscribe_event, 30), be_const_closure(Matter_Plugin_subscribe_event_closure) }, - { be_const_key_weak(TYPE, -1), be_nested_str_weak() }, + { be_const_key_weak(consolidate_clusters, -1), be_const_closure(Matter_Plugin_consolidate_clusters_closure) }, + { be_const_key_weak(tick, -1), be_const_var(4) }, + { be_const_key_weak(write_attribute, -1), be_const_closure(Matter_Plugin_write_attribute_closure) }, + { be_const_key_weak(has, -1), be_const_closure(Matter_Plugin_has_closure) }, + { be_const_key_weak(invoke_request, 6), be_const_closure(Matter_Plugin_invoke_request_closure) }, { be_const_key_weak(parse_sensors, 29), be_const_closure(Matter_Plugin_parse_sensors_closure) }, { be_const_key_weak(attribute_updated, -1), be_const_closure(Matter_Plugin_attribute_updated_closure) }, - { be_const_key_weak(get_cluster_list, -1), be_const_closure(Matter_Plugin_get_cluster_list_closure) }, - { be_const_key_weak(ui_string_to_conf, 22), be_const_static_closure(Matter_Plugin_ui_string_to_conf_closure) }, - { be_const_key_weak(device, -1), be_const_var(1) }, - { be_const_key_weak(write_attribute, 23), be_const_closure(Matter_Plugin_write_attribute_closure) }, - { be_const_key_weak(subscribe_attribute, -1), be_const_closure(Matter_Plugin_subscribe_attribute_closure) }, + { be_const_key_weak(parse_update, -1), be_const_closure(Matter_Plugin_parse_update_closure) }, + { be_const_key_weak(update_next, -1), be_const_var(0) }, + { be_const_key_weak(update_shadow_lazy, -1), be_const_closure(Matter_Plugin_update_shadow_lazy_closure) }, + { be_const_key_weak(get_endpoint, -1), be_const_closure(Matter_Plugin_get_endpoint_closure) }, + { be_const_key_weak(clusters, 10), be_const_var(3) }, + { be_const_key_weak(init, -1), be_const_closure(Matter_Plugin_init_closure) }, + { be_const_key_weak(read_event, 18), be_const_closure(Matter_Plugin_read_event_closure) }, + { be_const_key_weak(read_attribute, 19), be_const_closure(Matter_Plugin_read_attribute_closure) }, + { be_const_key_weak(ui_string_to_conf, -1), be_const_static_closure(Matter_Plugin_ui_string_to_conf_closure) }, + { be_const_key_weak(UPDATE_TIME, -1), be_const_int(5000) }, + { be_const_key_weak(subscribe_event, -1), be_const_closure(Matter_Plugin_subscribe_event_closure) }, + { be_const_key_weak(get_attribute_list, -1), be_const_closure(Matter_Plugin_get_attribute_list_closure) }, + { be_const_key_weak(timed_request, -1), be_const_closure(Matter_Plugin_timed_request_closure) }, { be_const_key_weak(update_shadow, -1), be_const_closure(Matter_Plugin_update_shadow_closure) }, - { be_const_key_weak(read_event, 24), be_const_closure(Matter_Plugin_read_event_closure) }, - { be_const_key_weak(init, 18), be_const_closure(Matter_Plugin_init_closure) }, + { be_const_key_weak(device, -1), be_const_var(1) }, + { be_const_key_weak(ARG, -1), be_nested_str_weak() }, { be_const_key_weak(CLUSTERS, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { be_const_map( * be_nested_map(1, ( (struct bmapnode*) &(const bmapnode[]) { @@ -946,13 +1014,13 @@ be_local_class(Matter_Plugin, be_const_int(65533), })) ) } )) }, })) ) } )) }, + { be_const_key_weak(probe_shadow_async, -1), be_const_closure(Matter_Plugin_probe_shadow_async_closure) }, + { be_const_key_weak(ARG_TYPE, 17), be_const_static_closure(Matter_Plugin__X3Clambda_X3E_closure) }, + { be_const_key_weak(subscribe_attribute, 3), be_const_closure(Matter_Plugin_subscribe_attribute_closure) }, + { be_const_key_weak(ui_conf_to_string, -1), be_const_static_closure(Matter_Plugin_ui_conf_to_string_closure) }, + { be_const_key_weak(TYPE, -1), be_nested_str_weak() }, + { be_const_key_weak(endpoint, 4), be_const_var(2) }, { be_const_key_weak(get_types, -1), be_const_closure(Matter_Plugin_get_types_closure) }, - { be_const_key_weak(read_attribute, 2), be_const_closure(Matter_Plugin_read_attribute_closure) }, - { be_const_key_weak(invoke_request, -1), be_const_closure(Matter_Plugin_invoke_request_closure) }, - { be_const_key_weak(update_next, 14), be_const_var(0) }, - { be_const_key_weak(endpoint, 31), be_const_var(2) }, - { be_const_key_weak(update_shadow_lazy, -1), be_const_closure(Matter_Plugin_update_shadow_lazy_closure) }, - { be_const_key_weak(consolidate_clusters, -1), be_const_closure(Matter_Plugin_consolidate_clusters_closure) }, })), be_str_weak(Matter_Plugin) ); diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_HTTP.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_HTTP.h index 1fd4d331a..df532e975 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_HTTP.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_HTTP.h @@ -6,6 +6,280 @@ extern const bclass be_class_Matter_Plugin_Bridge_HTTP; +/******************************************************************** +** Solidified function: ui_conf_to_string +********************************************************************/ +be_local_closure(Matter_Plugin_Bridge_HTTP_ui_conf_to_string, /* name */ + be_nested_proto( + 9, /* nstack */ + 2, /* argc */ + 4, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 6]) { /* constants */ + /* K0 */ be_const_class(be_class_Matter_Plugin_Bridge_HTTP), + /* K1 */ be_nested_str_weak(ui_conf_to_string), + /* K2 */ be_nested_str_weak(find), + /* K3 */ be_nested_str_weak(ARG_HTTP), + /* K4 */ be_nested_str_weak(), + /* K5 */ be_nested_str_weak(_X2C), + }), + be_str_weak(ui_conf_to_string), + &be_const_str_solidified, + ( &(const binstruction[17]) { /* code */ + 0x58080000, // 0000 LDCONST R2 K0 + 0x600C0003, // 0001 GETGBL R3 G3 + 0x5C100400, // 0002 MOVE R4 R2 + 0x7C0C0200, // 0003 CALL R3 1 + 0x8C0C0701, // 0004 GETMET R3 R3 K1 + 0x5C140000, // 0005 MOVE R5 R0 + 0x5C180200, // 0006 MOVE R6 R1 + 0x7C0C0600, // 0007 CALL R3 3 + 0x60100008, // 0008 GETGBL R4 G8 + 0x8C140302, // 0009 GETMET R5 R1 K2 + 0x881C0503, // 000A GETMBR R7 R2 K3 + 0x58200004, // 000B LDCONST R8 K4 + 0x7C140600, // 000C CALL R5 3 + 0x7C100200, // 000D CALL R4 1 + 0x00140705, // 000E ADD R5 R3 K5 + 0x00140A04, // 000F ADD R5 R5 R4 + 0x80040A00, // 0010 RET 1 R5 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: init +********************************************************************/ +be_local_closure(Matter_Plugin_Bridge_HTTP_init, /* name */ + be_nested_proto( + 11, /* nstack */ + 4, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 1, /* has sup protos */ + ( &(const struct bproto*[ 1]) { + be_nested_proto( + 6, /* nstack */ + 2, /* argc */ + 0, /* varg */ + 1, /* has upvals */ + ( &(const bupvaldesc[ 1]) { /* upvals */ + be_local_const_upval(1, 0), + }), + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 1]) { /* constants */ + /* K0 */ be_nested_str_weak(parse_http_response), + }), + be_str_weak(_X3Clambda_X3E), + &be_const_str_solidified, + ( &(const binstruction[ 6]) { /* code */ + 0x68080000, // 0000 GETUPV R2 U0 + 0x8C080500, // 0001 GETMET R2 R2 K0 + 0x5C100000, // 0002 MOVE R4 R0 + 0x5C140200, // 0003 MOVE R5 R1 + 0x7C080600, // 0004 CALL R2 3 + 0x80040400, // 0005 RET 1 R2 + }) + ), + }), + 1, /* has constants */ + ( &(const bvalue[12]) { /* constants */ + /* K0 */ be_nested_str_weak(string), + /* K1 */ be_nested_str_weak(init), + /* K2 */ be_nested_str_weak(find), + /* K3 */ be_nested_str_weak(ARG_HTTP), + /* K4 */ be_nested_str_weak(http_shadow_map), + /* K5 */ be_nested_str_weak(reachable), + /* K6 */ be_nested_str_weak(next_probe_timestamp), + /* K7 */ be_nested_str_weak(http_remote), + /* K8 */ be_nested_str_weak(matter), + /* K9 */ be_nested_str_weak(HTTP_remote), + /* K10 */ be_nested_str_weak(PROBE_TIMEOUT), + /* K11 */ be_nested_str_weak(set_cb), + }), + be_str_weak(init), + &be_const_str_solidified, + ( &(const binstruction[32]) { /* code */ + 0xA4120000, // 0000 IMPORT R4 K0 + 0x60140003, // 0001 GETGBL R5 G3 + 0x5C180000, // 0002 MOVE R6 R0 + 0x7C140200, // 0003 CALL R5 1 + 0x8C140B01, // 0004 GETMET R5 R5 K1 + 0x5C1C0200, // 0005 MOVE R7 R1 + 0x5C200400, // 0006 MOVE R8 R2 + 0x5C240600, // 0007 MOVE R9 R3 + 0x7C140800, // 0008 CALL R5 4 + 0x8C140702, // 0009 GETMET R5 R3 K2 + 0x881C0103, // 000A GETMBR R7 R0 K3 + 0x7C140400, // 000B CALL R5 2 + 0x60180013, // 000C GETGBL R6 G19 + 0x7C180000, // 000D CALL R6 0 + 0x90020806, // 000E SETMBR R0 K4 R6 + 0x50180000, // 000F LDBOOL R6 0 0 + 0x90020A06, // 0010 SETMBR R0 K5 R6 + 0x4C180000, // 0011 LDNIL R6 + 0x90020C06, // 0012 SETMBR R0 K6 R6 + 0xB81A1000, // 0013 GETNGBL R6 K8 + 0x8C180D09, // 0014 GETMET R6 R6 K9 + 0x5C200A00, // 0015 MOVE R8 R5 + 0x5426004F, // 0016 LDINT R9 80 + 0x8828010A, // 0017 GETMBR R10 R0 K10 + 0x7C180800, // 0018 CALL R6 4 + 0x90020E06, // 0019 SETMBR R0 K7 R6 + 0x88180107, // 001A GETMBR R6 R0 K7 + 0x8C180D0B, // 001B GETMET R6 R6 K11 + 0x84200000, // 001C CLOSURE R8 P0 + 0x7C180400, // 001D CALL R6 2 + 0xA0000000, // 001E CLOSE R0 + 0x80000000, // 001F RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: get_remote_status_lazy +********************************************************************/ +be_local_closure(Matter_Plugin_Bridge_HTTP_get_remote_status_lazy, /* name */ + be_nested_proto( + 10, /* nstack */ + 3, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 7]) { /* constants */ + /* K0 */ be_nested_str_weak(device), + /* K1 */ be_nested_str_weak(tick), + /* K2 */ be_nested_str_weak(http_shadow_map), + /* K3 */ be_nested_str_weak(find), + /* K4 */ be_nested_str_weak(_tick), + /* K5 */ be_nested_str_weak(call_remote_sync), + /* K6 */ be_nested_str_weak(Status), + }), + be_str_weak(get_remote_status_lazy), + &be_const_str_solidified, + ( &(const binstruction[20]) { /* code */ + 0x880C0100, // 0000 GETMBR R3 R0 K0 + 0x880C0701, // 0001 GETMBR R3 R3 K1 + 0x88100102, // 0002 GETMBR R4 R0 K2 + 0x8C100903, // 0003 GETMET R4 R4 K3 + 0x5C180200, // 0004 MOVE R6 R1 + 0x7C100400, // 0005 CALL R4 2 + 0x78120005, // 0006 JMPF R4 #000D + 0x8C140903, // 0007 GETMET R5 R4 K3 + 0x581C0004, // 0008 LDCONST R7 K4 + 0x7C140400, // 0009 CALL R5 2 + 0x1C140A03, // 000A EQ R5 R5 R3 + 0x78160000, // 000B JMPF R5 #000D + 0x80040800, // 000C RET 1 R4 + 0x8C140105, // 000D GETMET R5 R0 K5 + 0x581C0006, // 000E LDCONST R7 K6 + 0x60200008, // 000F GETGBL R8 G8 + 0x5C240200, // 0010 MOVE R9 R1 + 0x7C200200, // 0011 CALL R8 1 + 0x7C140600, // 0012 CALL R5 3 + 0x80040A00, // 0013 RET 1 R5 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: parse_http_response +********************************************************************/ +be_local_closure(Matter_Plugin_Bridge_HTTP_parse_http_response, /* name */ + be_nested_proto( + 11, /* nstack */ + 3, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[14]) { /* constants */ + /* K0 */ be_const_int(0), + /* K1 */ be_nested_str_weak(reachable), + /* K2 */ be_nested_str_weak(device), + /* K3 */ be_nested_str_weak(tick), + /* K4 */ be_nested_str_weak(reachable_tick), + /* K5 */ be_nested_str_weak(json), + /* K6 */ be_nested_str_weak(load), + /* K7 */ be_nested_str_weak(contains), + /* K8 */ be_nested_str_weak(StatusSNS), + /* K9 */ be_nested_str_weak(StatusSTS), + /* K10 */ be_nested_str_weak(StatusSHT), + /* K11 */ be_nested_str_weak(_tick), + /* K12 */ be_nested_str_weak(http_shadow_map), + /* K13 */ be_nested_str_weak(parse_update), + }), + be_str_weak(parse_http_response), + &be_const_str_solidified, + ( &(const binstruction[44]) { /* code */ + 0x240C0300, // 0000 GT R3 R1 K0 + 0x780E0028, // 0001 JMPF R3 #002B + 0x500C0200, // 0002 LDBOOL R3 1 0 + 0x90020203, // 0003 SETMBR R0 K1 R3 + 0x880C0102, // 0004 GETMBR R3 R0 K2 + 0x880C0703, // 0005 GETMBR R3 R3 K3 + 0x90020803, // 0006 SETMBR R0 K4 R3 + 0xA4120A00, // 0007 IMPORT R4 K5 + 0x8C140906, // 0008 GETMET R5 R4 K6 + 0x5C1C0400, // 0009 MOVE R7 R2 + 0x7C140400, // 000A CALL R5 2 + 0x4C180000, // 000B LDNIL R6 + 0x7816001D, // 000C JMPF R5 #002B + 0x8C1C0B07, // 000D GETMET R7 R5 K7 + 0x58240008, // 000E LDCONST R9 K8 + 0x7C1C0400, // 000F CALL R7 2 + 0x781E0002, // 0010 JMPF R7 #0014 + 0x94140B08, // 0011 GETIDX R5 R5 K8 + 0x541A0007, // 0012 LDINT R6 8 + 0x7002000C, // 0013 JMP #0021 + 0x8C1C0B07, // 0014 GETMET R7 R5 K7 + 0x58240009, // 0015 LDCONST R9 K9 + 0x7C1C0400, // 0016 CALL R7 2 + 0x781E0002, // 0017 JMPF R7 #001B + 0x94140B09, // 0018 GETIDX R5 R5 K9 + 0x541A000A, // 0019 LDINT R6 11 + 0x70020005, // 001A JMP #0021 + 0x8C1C0B07, // 001B GETMET R7 R5 K7 + 0x5824000A, // 001C LDCONST R9 K10 + 0x7C1C0400, // 001D CALL R7 2 + 0x781E0001, // 001E JMPF R7 #0021 + 0x94140B09, // 001F GETIDX R5 R5 K9 + 0x541A000C, // 0020 LDINT R6 13 + 0x4C1C0000, // 0021 LDNIL R7 + 0x201C0C07, // 0022 NE R7 R6 R7 + 0x781E0002, // 0023 JMPF R7 #0027 + 0x98161603, // 0024 SETIDX R5 K11 R3 + 0x881C010C, // 0025 GETMBR R7 R0 K12 + 0x981C0C05, // 0026 SETIDX R7 R6 R5 + 0x8C1C010D, // 0027 GETMET R7 R0 K13 + 0x5C240A00, // 0028 MOVE R9 R5 + 0x5C280C00, // 0029 MOVE R10 R6 + 0x7C1C0600, // 002A CALL R7 3 + 0x80000000, // 002B RET 0 + }) + ) +); +/*******************************************************************/ + + /******************************************************************** ** Solidified function: get_types ********************************************************************/ @@ -54,169 +328,6 @@ be_local_closure(Matter_Plugin_Bridge_HTTP_get_types, /* name */ /*******************************************************************/ -/******************************************************************** -** Solidified function: is_reachable -********************************************************************/ -be_local_closure(Matter_Plugin_Bridge_HTTP_is_reachable, /* name */ - be_nested_proto( - 5, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 6]) { /* constants */ - /* K0 */ be_nested_str_weak(device), - /* K1 */ be_nested_str_weak(tick), - /* K2 */ be_nested_str_weak(reachable_tick), - /* K3 */ be_nested_str_weak(call_remote), - /* K4 */ be_nested_str_weak(), - /* K5 */ be_nested_str_weak(reachable), - }), - be_str_weak(is_reachable), - &be_const_str_solidified, - ( &(const binstruction[14]) { /* code */ - 0x88040100, // 0000 GETMBR R1 R0 K0 - 0x88040301, // 0001 GETMBR R1 R1 K1 - 0x88080102, // 0002 GETMBR R2 R0 K2 - 0x20040202, // 0003 NE R1 R1 R2 - 0x78060006, // 0004 JMPF R1 #000C - 0x8C040103, // 0005 GETMET R1 R0 K3 - 0x580C0004, // 0006 LDCONST R3 K4 - 0x58100004, // 0007 LDCONST R4 K4 - 0x7C040600, // 0008 CALL R1 3 - 0x4C080000, // 0009 LDNIL R2 - 0x20080202, // 000A NE R2 R1 R2 - 0x90020A02, // 000B SETMBR R0 K5 R2 - 0x88040105, // 000C GETMBR R1 R0 K5 - 0x80040200, // 000D RET 1 R1 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: read_attribute -********************************************************************/ -be_local_closure(Matter_Plugin_Bridge_HTTP_read_attribute, /* name */ - be_nested_proto( - 10, /* nstack */ - 3, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 8]) { /* constants */ - /* K0 */ be_nested_str_weak(matter), - /* K1 */ be_nested_str_weak(TLV), - /* K2 */ be_nested_str_weak(cluster), - /* K3 */ be_nested_str_weak(attribute), - /* K4 */ be_const_int(0), - /* K5 */ be_nested_str_weak(create_TLV), - /* K6 */ be_nested_str_weak(BOOL), - /* K7 */ be_nested_str_weak(read_attribute), - }), - be_str_weak(read_attribute), - &be_const_str_solidified, - ( &(const binstruction[28]) { /* code */ - 0xB80E0000, // 0000 GETNGBL R3 K0 - 0x880C0701, // 0001 GETMBR R3 R3 K1 - 0x88100502, // 0002 GETMBR R4 R2 K2 - 0x88140503, // 0003 GETMBR R5 R2 K3 - 0x541A0038, // 0004 LDINT R6 57 - 0x1C180806, // 0005 EQ R6 R4 R6 - 0x781A000B, // 0006 JMPF R6 #0013 - 0x1C180B04, // 0007 EQ R6 R5 K4 - 0x781A0000, // 0008 JMPF R6 #000A - 0x70020007, // 0009 JMP #0012 - 0x541A0010, // 000A LDINT R6 17 - 0x1C180A06, // 000B EQ R6 R5 R6 - 0x781A0004, // 000C JMPF R6 #0012 - 0x8C180705, // 000D GETMET R6 R3 K5 - 0x88200706, // 000E GETMBR R8 R3 K6 - 0x50240200, // 000F LDBOOL R9 1 0 - 0x7C180600, // 0010 CALL R6 3 - 0x80040C00, // 0011 RET 1 R6 - 0x70020007, // 0012 JMP #001B - 0x60180003, // 0013 GETGBL R6 G3 - 0x5C1C0000, // 0014 MOVE R7 R0 - 0x7C180200, // 0015 CALL R6 1 - 0x8C180D07, // 0016 GETMET R6 R6 K7 - 0x5C200200, // 0017 MOVE R8 R1 - 0x5C240400, // 0018 MOVE R9 R2 - 0x7C180600, // 0019 CALL R6 3 - 0x80040C00, // 001A RET 1 R6 - 0x80000000, // 001B RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: get_status_11 -********************************************************************/ -be_local_closure(Matter_Plugin_Bridge_HTTP_get_status_11, /* name */ - be_nested_proto( - 6, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 8]) { /* constants */ - /* K0 */ be_nested_str_weak(device), - /* K1 */ be_nested_str_weak(tick), - /* K2 */ be_nested_str_weak(tasmota_status_11), - /* K3 */ be_nested_str_weak(find), - /* K4 */ be_nested_str_weak(_tick), - /* K5 */ be_nested_str_weak(call_remote), - /* K6 */ be_nested_str_weak(Status), - /* K7 */ be_nested_str_weak(11), - }), - be_str_weak(get_status_11), - &be_const_str_solidified, - ( &(const binstruction[27]) { /* code */ - 0x88040100, // 0000 GETMBR R1 R0 K0 - 0x88040301, // 0001 GETMBR R1 R1 K1 - 0x88080102, // 0002 GETMBR R2 R0 K2 - 0x4C0C0000, // 0003 LDNIL R3 - 0x1C080403, // 0004 EQ R2 R2 R3 - 0x740A0005, // 0005 JMPT R2 #000C - 0x88080102, // 0006 GETMBR R2 R0 K2 - 0x8C080503, // 0007 GETMET R2 R2 K3 - 0x58100004, // 0008 LDCONST R4 K4 - 0x7C080400, // 0009 CALL R2 2 - 0x20080401, // 000A NE R2 R2 R1 - 0x780A000B, // 000B JMPF R2 #0018 - 0x8C080105, // 000C GETMET R2 R0 K5 - 0x58100006, // 000D LDCONST R4 K6 - 0x58140007, // 000E LDCONST R5 K7 - 0x7C080600, // 000F CALL R2 3 - 0x780A0003, // 0010 JMPF R2 #0015 - 0x980A0801, // 0011 SETIDX R2 K4 R1 - 0x90020402, // 0012 SETMBR R0 K2 R2 - 0x80040400, // 0013 RET 1 R2 - 0x70020001, // 0014 JMP #0017 - 0x4C0C0000, // 0015 LDNIL R3 - 0x80040600, // 0016 RET 1 R3 - 0x70020001, // 0017 JMP #001A - 0x88080102, // 0018 GETMBR R2 R0 K2 - 0x80040400, // 0019 RET 1 R2 - 0x80000000, // 001A RET 0 - }) - ) -); -/*******************************************************************/ - - /******************************************************************** ** Solidified function: ui_string_to_conf ********************************************************************/ @@ -243,7 +354,7 @@ be_local_closure(Matter_Plugin_Bridge_HTTP_ui_string_to_conf, /* name */ }), be_str_weak(ui_string_to_conf), &be_const_str_solidified, - ( &(const binstruction[24]) { /* code */ + ( &(const binstruction[19]) { /* code */ 0x580C0000, // 0000 LDCONST R3 K0 0xA4120200, // 0001 IMPORT R4 K1 0x8C140902, // 0002 GETMET R5 R4 K2 @@ -262,12 +373,7 @@ be_local_closure(Matter_Plugin_Bridge_HTTP_ui_string_to_conf, /* name */ 0x5C240200, // 000F MOVE R9 R1 0x94280B08, // 0010 GETIDX R10 R5 K8 0x7C180800, // 0011 CALL R6 4 - 0x60180001, // 0012 GETGBL R6 G1 - 0x581C0007, // 0013 LDCONST R7 K7 - 0x5C200200, // 0014 MOVE R8 R1 - 0x5C240400, // 0015 MOVE R9 R2 - 0x7C180600, // 0016 CALL R6 3 - 0x80040200, // 0017 RET 1 R1 + 0x80040200, // 0012 RET 1 R1 }) ) ); @@ -275,11 +381,35 @@ be_local_closure(Matter_Plugin_Bridge_HTTP_ui_string_to_conf, /* name */ /******************************************************************** -** Solidified function: call_remote +** Solidified function: probe_shadow_async ********************************************************************/ -be_local_closure(Matter_Plugin_Bridge_HTTP_call_remote, /* name */ +be_local_closure(Matter_Plugin_Bridge_HTTP_probe_shadow_async, /* name */ be_nested_proto( - 14, /* nstack */ + 1, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 0, /* has constants */ + NULL, /* no const */ + be_str_weak(probe_shadow_async), + &be_const_str_solidified, + ( &(const binstruction[ 1]) { /* code */ + 0x80000000, // 0000 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: read_attribute +********************************************************************/ +be_local_closure(Matter_Plugin_Bridge_HTTP_read_attribute, /* name */ + be_nested_proto( + 10, /* nstack */ 3, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -287,133 +417,48 @@ be_local_closure(Matter_Plugin_Bridge_HTTP_call_remote, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[31]) { /* constants */ - /* K0 */ be_nested_str_weak(tasmota_http), - /* K1 */ be_nested_str_weak(json), - /* K2 */ be_nested_str_weak(string), - /* K3 */ be_nested_str_weak(tasmota), - /* K4 */ be_nested_str_weak(wifi), - /* K5 */ be_nested_str_weak(up), - /* K6 */ be_nested_str_weak(eth), - /* K7 */ be_const_int(2), - /* K8 */ be_const_int(0), - /* K9 */ be_nested_str_weak(webclient), - /* K10 */ be_nested_str_weak(set_timeouts), - /* K11 */ be_nested_str_weak(set_follow_redirects), - /* K12 */ be_nested_str_weak(format), - /* K13 */ be_nested_str_weak(_X25scm_X3Fcmnd_X3D_X25s_X25_X2520_X25s), - /* K14 */ be_nested_str_weak(), - /* K15 */ be_nested_str_weak(log), - /* K16 */ be_nested_str_weak(MTR_X3A_X20HTTP_X20GET_X20), - /* K17 */ be_const_int(3), - /* K18 */ be_nested_str_weak(begin), - /* K19 */ be_nested_str_weak(GET), - /* K20 */ be_nested_str_weak(MTR_X3A_X20HTTP_X20GET_X20code_X3D), - /* K21 */ be_nested_str_weak(get_string), - /* K22 */ be_nested_str_weak(close), - /* K23 */ be_nested_str_weak(MTR_X3A_X20HTTP_X20GET_X20payload_X3D), - /* K24 */ be_nested_str_weak(load), - /* K25 */ be_nested_str_weak(reachable), - /* K26 */ be_nested_str_weak(reachable_tick), - /* K27 */ be_nested_str_weak(device), - /* K28 */ be_nested_str_weak(tick), - /* K29 */ be_const_int(1), - /* K30 */ be_nested_str_weak(MTR_X3A_X20HTTP_X20GET_X20retrying), + ( &(const bvalue[ 9]) { /* constants */ + /* K0 */ be_nested_str_weak(matter), + /* K1 */ be_nested_str_weak(TLV), + /* K2 */ be_nested_str_weak(cluster), + /* K3 */ be_nested_str_weak(attribute), + /* K4 */ be_const_int(0), + /* K5 */ be_nested_str_weak(create_TLV), + /* K6 */ be_nested_str_weak(BOOL), + /* K7 */ be_nested_str_weak(reachable), + /* K8 */ be_nested_str_weak(read_attribute), }), - be_str_weak(call_remote), + be_str_weak(read_attribute), &be_const_str_solidified, - ( &(const binstruction[91]) { /* code */ - 0x880C0100, // 0000 GETMBR R3 R0 K0 - 0x740E0001, // 0001 JMPT R3 #0004 - 0x4C0C0000, // 0002 LDNIL R3 - 0x80040600, // 0003 RET 1 R3 - 0xA40E0200, // 0004 IMPORT R3 K1 - 0xA4120400, // 0005 IMPORT R4 K2 - 0xB8160600, // 0006 GETNGBL R5 K3 - 0x8C140B04, // 0007 GETMET R5 R5 K4 - 0x7C140200, // 0008 CALL R5 1 - 0x94140B05, // 0009 GETIDX R5 R5 K5 - 0x74160006, // 000A JMPT R5 #0012 - 0xB8160600, // 000B GETNGBL R5 K3 - 0x8C140B06, // 000C GETMET R5 R5 K6 - 0x7C140200, // 000D CALL R5 1 - 0x94140B05, // 000E GETIDX R5 R5 K5 - 0x74160001, // 000F JMPT R5 #0012 - 0x4C140000, // 0010 LDNIL R5 - 0x80040A00, // 0011 RET 1 R5 - 0x58140007, // 0012 LDCONST R5 K7 - 0x24180B08, // 0013 GT R6 R5 K8 - 0x781A0041, // 0014 JMPF R6 #0057 - 0xB81A1200, // 0015 GETNGBL R6 K9 - 0x7C180000, // 0016 CALL R6 0 - 0x8C1C0D0A, // 0017 GETMET R7 R6 K10 - 0x542603E7, // 0018 LDINT R9 1000 - 0x542A03E7, // 0019 LDINT R10 1000 - 0x7C1C0600, // 001A CALL R7 3 - 0x8C1C0D0B, // 001B GETMET R7 R6 K11 - 0x50240000, // 001C LDBOOL R9 0 0 - 0x7C1C0400, // 001D CALL R7 2 - 0x8C1C090C, // 001E GETMET R7 R4 K12 - 0x5824000D, // 001F LDCONST R9 K13 - 0x88280100, // 0020 GETMBR R10 R0 K0 - 0x5C2C0200, // 0021 MOVE R11 R1 - 0x780A0001, // 0022 JMPF R2 #0025 - 0x5C300400, // 0023 MOVE R12 R2 - 0x70020000, // 0024 JMP #0026 - 0x5830000E, // 0025 LDCONST R12 K14 - 0x7C1C0A00, // 0026 CALL R7 5 - 0xB8220600, // 0027 GETNGBL R8 K3 - 0x8C20110F, // 0028 GETMET R8 R8 K15 - 0x002A2007, // 0029 ADD R10 K16 R7 - 0x582C0011, // 002A LDCONST R11 K17 - 0x7C200600, // 002B CALL R8 3 - 0x8C200D12, // 002C GETMET R8 R6 K18 - 0x5C280E00, // 002D MOVE R10 R7 - 0x7C200400, // 002E CALL R8 2 - 0x8C200D13, // 002F GETMET R8 R6 K19 - 0x7C200200, // 0030 CALL R8 1 - 0xB8260600, // 0031 GETNGBL R9 K3 - 0x8C24130F, // 0032 GETMET R9 R9 K15 - 0x602C0008, // 0033 GETGBL R11 G8 - 0x5C301000, // 0034 MOVE R12 R8 - 0x7C2C0200, // 0035 CALL R11 1 - 0x002E280B, // 0036 ADD R11 K20 R11 - 0x58300011, // 0037 LDCONST R12 K17 - 0x7C240600, // 0038 CALL R9 3 - 0x542600C7, // 0039 LDINT R9 200 - 0x1C241009, // 003A EQ R9 R8 R9 - 0x78260011, // 003B JMPF R9 #004E - 0x8C240D15, // 003C GETMET R9 R6 K21 - 0x7C240200, // 003D CALL R9 1 - 0x8C280D16, // 003E GETMET R10 R6 K22 - 0x7C280200, // 003F CALL R10 1 - 0xB82A0600, // 0040 GETNGBL R10 K3 - 0x8C28150F, // 0041 GETMET R10 R10 K15 - 0x00322E09, // 0042 ADD R12 K23 R9 - 0x58340011, // 0043 LDCONST R13 K17 - 0x7C280600, // 0044 CALL R10 3 - 0x8C280718, // 0045 GETMET R10 R3 K24 - 0x5C301200, // 0046 MOVE R12 R9 - 0x7C280400, // 0047 CALL R10 2 - 0x502C0200, // 0048 LDBOOL R11 1 0 - 0x9002320B, // 0049 SETMBR R0 K25 R11 - 0x882C011B, // 004A GETMBR R11 R0 K27 - 0x882C171C, // 004B GETMBR R11 R11 K28 - 0x9002340B, // 004C SETMBR R0 K26 R11 - 0x80041400, // 004D RET 1 R10 - 0x8C240D16, // 004E GETMET R9 R6 K22 - 0x7C240200, // 004F CALL R9 1 - 0x04140B1D, // 0050 SUB R5 R5 K29 - 0xB8260600, // 0051 GETNGBL R9 K3 - 0x8C24130F, // 0052 GETMET R9 R9 K15 - 0x582C001E, // 0053 LDCONST R11 K30 - 0x58300011, // 0054 LDCONST R12 K17 - 0x7C240600, // 0055 CALL R9 3 - 0x7001FFBB, // 0056 JMP #0013 - 0x50180000, // 0057 LDBOOL R6 0 0 - 0x90023206, // 0058 SETMBR R0 K25 R6 - 0x4C180000, // 0059 LDNIL R6 - 0x80040C00, // 005A RET 1 R6 + ( &(const binstruction[28]) { /* code */ + 0xB80E0000, // 0000 GETNGBL R3 K0 + 0x880C0701, // 0001 GETMBR R3 R3 K1 + 0x88100502, // 0002 GETMBR R4 R2 K2 + 0x88140503, // 0003 GETMBR R5 R2 K3 + 0x541A0038, // 0004 LDINT R6 57 + 0x1C180806, // 0005 EQ R6 R4 R6 + 0x781A000B, // 0006 JMPF R6 #0013 + 0x1C180B04, // 0007 EQ R6 R5 K4 + 0x781A0000, // 0008 JMPF R6 #000A + 0x70020007, // 0009 JMP #0012 + 0x541A0010, // 000A LDINT R6 17 + 0x1C180A06, // 000B EQ R6 R5 R6 + 0x781A0004, // 000C JMPF R6 #0012 + 0x8C180705, // 000D GETMET R6 R3 K5 + 0x88200706, // 000E GETMBR R8 R3 K6 + 0x88240107, // 000F GETMBR R9 R0 K7 + 0x7C180600, // 0010 CALL R6 3 + 0x80040C00, // 0011 RET 1 R6 + 0x70020007, // 0012 JMP #001B + 0x60180003, // 0013 GETGBL R6 G3 + 0x5C1C0000, // 0014 MOVE R7 R0 + 0x7C180200, // 0015 CALL R6 1 + 0x8C180D08, // 0016 GETMET R6 R6 K8 + 0x5C200200, // 0017 MOVE R8 R1 + 0x5C240400, // 0018 MOVE R9 R2 + 0x7C180600, // 0019 CALL R6 3 + 0x80040C00, // 001A RET 1 R6 + 0x80000000, // 001B RET 0 }) ) ); @@ -421,11 +466,11 @@ be_local_closure(Matter_Plugin_Bridge_HTTP_call_remote, /* name */ /******************************************************************** -** Solidified function: get_status_8 +** Solidified function: is_reachable_sync ********************************************************************/ -be_local_closure(Matter_Plugin_Bridge_HTTP_get_status_8, /* name */ +be_local_closure(Matter_Plugin_Bridge_HTTP_is_reachable_sync, /* name */ be_nested_proto( - 6, /* nstack */ + 5, /* nstack */ 1, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -433,46 +478,31 @@ be_local_closure(Matter_Plugin_Bridge_HTTP_get_status_8, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[ 8]) { /* constants */ + ( &(const bvalue[ 6]) { /* constants */ /* K0 */ be_nested_str_weak(device), /* K1 */ be_nested_str_weak(tick), - /* K2 */ be_nested_str_weak(tasmota_status_8), - /* K3 */ be_nested_str_weak(find), - /* K4 */ be_nested_str_weak(_tick), - /* K5 */ be_nested_str_weak(call_remote), - /* K6 */ be_nested_str_weak(Status), - /* K7 */ be_nested_str_weak(8), + /* K2 */ be_nested_str_weak(reachable_tick), + /* K3 */ be_nested_str_weak(call_remote_sync), + /* K4 */ be_nested_str_weak(), + /* K5 */ be_nested_str_weak(reachable), }), - be_str_weak(get_status_8), + be_str_weak(is_reachable_sync), &be_const_str_solidified, - ( &(const binstruction[27]) { /* code */ + ( &(const binstruction[14]) { /* code */ 0x88040100, // 0000 GETMBR R1 R0 K0 0x88040301, // 0001 GETMBR R1 R1 K1 0x88080102, // 0002 GETMBR R2 R0 K2 - 0x4C0C0000, // 0003 LDNIL R3 - 0x1C080403, // 0004 EQ R2 R2 R3 - 0x740A0005, // 0005 JMPT R2 #000C - 0x88080102, // 0006 GETMBR R2 R0 K2 - 0x8C080503, // 0007 GETMET R2 R2 K3 - 0x58100004, // 0008 LDCONST R4 K4 - 0x7C080400, // 0009 CALL R2 2 - 0x20080401, // 000A NE R2 R2 R1 - 0x780A000B, // 000B JMPF R2 #0018 - 0x8C080105, // 000C GETMET R2 R0 K5 - 0x58100006, // 000D LDCONST R4 K6 - 0x58140007, // 000E LDCONST R5 K7 - 0x7C080600, // 000F CALL R2 3 - 0x780A0003, // 0010 JMPF R2 #0015 - 0x980A0801, // 0011 SETIDX R2 K4 R1 - 0x90020402, // 0012 SETMBR R0 K2 R2 - 0x80040400, // 0013 RET 1 R2 - 0x70020001, // 0014 JMP #0017 - 0x4C0C0000, // 0015 LDNIL R3 - 0x80040600, // 0016 RET 1 R3 - 0x70020001, // 0017 JMP #001A - 0x88080102, // 0018 GETMBR R2 R0 K2 - 0x80040400, // 0019 RET 1 R2 - 0x80000000, // 001A RET 0 + 0x20040202, // 0003 NE R1 R1 R2 + 0x78060006, // 0004 JMPF R1 #000C + 0x8C040103, // 0005 GETMET R1 R0 K3 + 0x580C0004, // 0006 LDCONST R3 K4 + 0x58100004, // 0007 LDCONST R4 K4 + 0x7C040600, // 0008 CALL R1 3 + 0x4C080000, // 0009 LDNIL R2 + 0x20080202, // 000A NE R2 R1 R2 + 0x90020A02, // 000B SETMBR R0 K5 R2 + 0x88040105, // 000C GETMBR R1 R0 K5 + 0x80040200, // 000D RET 1 R1 }) ) ); @@ -480,133 +510,155 @@ be_local_closure(Matter_Plugin_Bridge_HTTP_get_status_8, /* name */ /******************************************************************** -** Solidified function: ui_conf_to_string +** Solidified function: call_remote_sync ********************************************************************/ -be_local_closure(Matter_Plugin_Bridge_HTTP_ui_conf_to_string, /* name */ +be_local_closure(Matter_Plugin_Bridge_HTTP_call_remote_sync, /* name */ be_nested_proto( 11, /* nstack */ - 2, /* argc */ - 4, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 7]) { /* constants */ - /* K0 */ be_const_class(be_class_Matter_Plugin_Bridge_HTTP), - /* K1 */ be_nested_str_weak(ui_conf_to_string), - /* K2 */ be_nested_str_weak(find), - /* K3 */ be_nested_str_weak(ARG_HTTP), - /* K4 */ be_nested_str_weak(), - /* K5 */ be_nested_str_weak(_X2C), - /* K6 */ be_nested_str_weak(MTR_X3A_X20ui_conf_to_string), - }), - be_str_weak(ui_conf_to_string), - &be_const_str_solidified, - ( &(const binstruction[23]) { /* code */ - 0x58080000, // 0000 LDCONST R2 K0 - 0x600C0003, // 0001 GETGBL R3 G3 - 0x5C100400, // 0002 MOVE R4 R2 - 0x7C0C0200, // 0003 CALL R3 1 - 0x8C0C0701, // 0004 GETMET R3 R3 K1 - 0x5C140000, // 0005 MOVE R5 R0 - 0x5C180200, // 0006 MOVE R6 R1 - 0x7C0C0600, // 0007 CALL R3 3 - 0x60100008, // 0008 GETGBL R4 G8 - 0x8C140302, // 0009 GETMET R5 R1 K2 - 0x881C0503, // 000A GETMBR R7 R2 K3 - 0x58200004, // 000B LDCONST R8 K4 - 0x7C140600, // 000C CALL R5 3 - 0x7C100200, // 000D CALL R4 1 - 0x00140705, // 000E ADD R5 R3 K5 - 0x00140A04, // 000F ADD R5 R5 R4 - 0x60180001, // 0010 GETGBL R6 G1 - 0x581C0006, // 0011 LDCONST R7 K6 - 0x5C200200, // 0012 MOVE R8 R1 - 0x5C240000, // 0013 MOVE R9 R0 - 0x5C280A00, // 0014 MOVE R10 R5 - 0x7C180800, // 0015 CALL R6 4 - 0x80040A00, // 0016 RET 1 R5 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: init -********************************************************************/ -be_local_closure(Matter_Plugin_Bridge_HTTP_init, /* name */ - be_nested_proto( - 12, /* nstack */ - 4, /* argc */ + 3, /* argc */ 2, /* varg */ 0, /* has upvals */ NULL, /* no upvals */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[17]) { /* constants */ + ( &(const bvalue[21]) { /* constants */ /* K0 */ be_nested_str_weak(string), - /* K1 */ be_nested_str_weak(init), - /* K2 */ be_nested_str_weak(find), - /* K3 */ be_nested_str_weak(ARG_HTTP), - /* K4 */ be_nested_str_weak(_X3A_X2F_X2F), - /* K5 */ be_const_int(0), - /* K6 */ be_nested_str_weak(http_X3A_X2F_X2F), - /* K7 */ be_nested_str_weak(_X2F), - /* K8 */ be_nested_str_weak(tasmota_http), - /* K9 */ be_nested_str_weak(tasmota), - /* K10 */ be_nested_str_weak(log), - /* K11 */ be_nested_str_weak(format), - /* K12 */ be_nested_str_weak(MTR_X3A_X20ERROR_X3A_X20_X27url_X27_X20is_X20not_X20configured_X20for_X20endpoint_X20_X25i), - /* K13 */ be_const_int(2), - /* K14 */ be_nested_str_weak(tasmota_status_8), - /* K15 */ be_nested_str_weak(tasmota_status_11), - /* K16 */ be_nested_str_weak(reachable), + /* K1 */ be_nested_str_weak(tasmota), + /* K2 */ be_nested_str_weak(wifi), + /* K3 */ be_nested_str_weak(up), + /* K4 */ be_nested_str_weak(eth), + /* K5 */ be_const_int(2), + /* K6 */ be_nested_str_weak(format), + /* K7 */ be_nested_str_weak(_X2Fcm_X3Fcmnd_X3D_X25s_X25_X2520_X25s), + /* K8 */ be_nested_str_weak(), + /* K9 */ be_const_int(0), + /* K10 */ be_nested_str_weak(http_remote), + /* K11 */ be_nested_str_weak(begin_sync), + /* K12 */ be_nested_str_weak(SYNC_TIMEOUT), + /* K13 */ be_nested_str_weak(reachable), + /* K14 */ be_nested_str_weak(reachable_tick), + /* K15 */ be_nested_str_weak(device), + /* K16 */ be_nested_str_weak(tick), + /* K17 */ be_const_int(1), + /* K18 */ be_nested_str_weak(log), + /* K19 */ be_nested_str_weak(MTR_X3A_X20HTTP_X20GET_X20retrying), + /* K20 */ be_const_int(3), }), - be_str_weak(init), + be_str_weak(call_remote_sync), &be_const_str_solidified, - ( &(const binstruction[39]) { /* code */ - 0xA4120000, // 0000 IMPORT R4 K0 - 0x60140003, // 0001 GETGBL R5 G3 - 0x5C180000, // 0002 MOVE R6 R0 - 0x7C140200, // 0003 CALL R5 1 - 0x8C140B01, // 0004 GETMET R5 R5 K1 - 0x5C1C0200, // 0005 MOVE R7 R1 - 0x5C200400, // 0006 MOVE R8 R2 - 0x5C240600, // 0007 MOVE R9 R3 - 0x7C140800, // 0008 CALL R5 4 - 0x8C140702, // 0009 GETMET R5 R3 K2 - 0x881C0103, // 000A GETMBR R7 R0 K3 - 0x7C140400, // 000B CALL R5 2 - 0x7816000A, // 000C JMPF R5 #0018 - 0x8C180902, // 000D GETMET R6 R4 K2 - 0x5C200A00, // 000E MOVE R8 R5 - 0x58240004, // 000F LDCONST R9 K4 - 0x7C180600, // 0010 CALL R6 3 - 0x14180D05, // 0011 LT R6 R6 K5 - 0x781A0002, // 0012 JMPF R6 #0016 - 0x001A0C05, // 0013 ADD R6 K6 R5 - 0x00180D07, // 0014 ADD R6 R6 K7 - 0x5C140C00, // 0015 MOVE R5 R6 - 0x90021005, // 0016 SETMBR R0 K8 R5 - 0x70020007, // 0017 JMP #0020 - 0xB81A1200, // 0018 GETNGBL R6 K9 - 0x8C180D0A, // 0019 GETMET R6 R6 K10 - 0x8C20090B, // 001A GETMET R8 R4 K11 - 0x5828000C, // 001B LDCONST R10 K12 - 0x5C2C0400, // 001C MOVE R11 R2 - 0x7C200600, // 001D CALL R8 3 - 0x5824000D, // 001E LDCONST R9 K13 - 0x7C180600, // 001F CALL R6 3 - 0x4C180000, // 0020 LDNIL R6 - 0x90021C06, // 0021 SETMBR R0 K14 R6 - 0x4C180000, // 0022 LDNIL R6 - 0x90021E06, // 0023 SETMBR R0 K15 R6 - 0x50180000, // 0024 LDBOOL R6 0 0 - 0x90022006, // 0025 SETMBR R0 K16 R6 - 0x80000000, // 0026 RET 0 + ( &(const binstruction[49]) { /* code */ + 0xA40E0000, // 0000 IMPORT R3 K0 + 0xB8120200, // 0001 GETNGBL R4 K1 + 0x8C100902, // 0002 GETMET R4 R4 K2 + 0x7C100200, // 0003 CALL R4 1 + 0x94100903, // 0004 GETIDX R4 R4 K3 + 0x74120006, // 0005 JMPT R4 #000D + 0xB8120200, // 0006 GETNGBL R4 K1 + 0x8C100904, // 0007 GETMET R4 R4 K4 + 0x7C100200, // 0008 CALL R4 1 + 0x94100903, // 0009 GETIDX R4 R4 K3 + 0x74120001, // 000A JMPT R4 #000D + 0x4C100000, // 000B LDNIL R4 + 0x80040800, // 000C RET 1 R4 + 0x58100005, // 000D LDCONST R4 K5 + 0x8C140706, // 000E GETMET R5 R3 K6 + 0x581C0007, // 000F LDCONST R7 K7 + 0x5C200200, // 0010 MOVE R8 R1 + 0x780A0001, // 0011 JMPF R2 #0014 + 0x5C240400, // 0012 MOVE R9 R2 + 0x70020000, // 0013 JMP #0015 + 0x58240008, // 0014 LDCONST R9 K8 + 0x7C140800, // 0015 CALL R5 4 + 0x24180909, // 0016 GT R6 R4 K9 + 0x781A0014, // 0017 JMPF R6 #002D + 0x8818010A, // 0018 GETMBR R6 R0 K10 + 0x8C180D0B, // 0019 GETMET R6 R6 K11 + 0x5C200A00, // 001A MOVE R8 R5 + 0x8824010C, // 001B GETMBR R9 R0 K12 + 0x7C180600, // 001C CALL R6 3 + 0x4C1C0000, // 001D LDNIL R7 + 0x201C0C07, // 001E NE R7 R6 R7 + 0x781E0005, // 001F JMPF R7 #0026 + 0x501C0200, // 0020 LDBOOL R7 1 0 + 0x90021A07, // 0021 SETMBR R0 K13 R7 + 0x881C010F, // 0022 GETMBR R7 R0 K15 + 0x881C0F10, // 0023 GETMBR R7 R7 K16 + 0x90021C07, // 0024 SETMBR R0 K14 R7 + 0x80040C00, // 0025 RET 1 R6 + 0x04100911, // 0026 SUB R4 R4 K17 + 0xB81E0200, // 0027 GETNGBL R7 K1 + 0x8C1C0F12, // 0028 GETMET R7 R7 K18 + 0x58240013, // 0029 LDCONST R9 K19 + 0x58280014, // 002A LDCONST R10 K20 + 0x7C1C0600, // 002B CALL R7 3 + 0x7001FFE8, // 002C JMP #0016 + 0x50180000, // 002D LDBOOL R6 0 0 + 0x90021A06, // 002E SETMBR R0 K13 R6 + 0x4C180000, // 002F LDNIL R6 + 0x80040C00, // 0030 RET 1 R6 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: call_remote_async +********************************************************************/ +be_local_closure(Matter_Plugin_Bridge_HTTP_call_remote_async, /* name */ + be_nested_proto( + 9, /* nstack */ + 3, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[11]) { /* constants */ + /* K0 */ be_nested_str_weak(string), + /* K1 */ be_nested_str_weak(tasmota), + /* K2 */ be_nested_str_weak(wifi), + /* K3 */ be_nested_str_weak(up), + /* K4 */ be_nested_str_weak(eth), + /* K5 */ be_nested_str_weak(format), + /* K6 */ be_nested_str_weak(_X2Fcm_X3Fcmnd_X3D_X25s_X25_X2520_X25s), + /* K7 */ be_nested_str_weak(), + /* K8 */ be_nested_str_weak(http_remote), + /* K9 */ be_nested_str_weak(begin), + /* K10 */ be_nested_str_weak(PROBE_TIMEOUT), + }), + be_str_weak(call_remote_async), + &be_const_str_solidified, + ( &(const binstruction[27]) { /* code */ + 0xA40E0000, // 0000 IMPORT R3 K0 + 0xB8120200, // 0001 GETNGBL R4 K1 + 0x8C100902, // 0002 GETMET R4 R4 K2 + 0x7C100200, // 0003 CALL R4 1 + 0x94100903, // 0004 GETIDX R4 R4 K3 + 0x74120006, // 0005 JMPT R4 #000D + 0xB8120200, // 0006 GETNGBL R4 K1 + 0x8C100904, // 0007 GETMET R4 R4 K4 + 0x7C100200, // 0008 CALL R4 1 + 0x94100903, // 0009 GETIDX R4 R4 K3 + 0x74120001, // 000A JMPT R4 #000D + 0x4C100000, // 000B LDNIL R4 + 0x80040800, // 000C RET 1 R4 + 0x8C100705, // 000D GETMET R4 R3 K5 + 0x58180006, // 000E LDCONST R6 K6 + 0x5C1C0200, // 000F MOVE R7 R1 + 0x780A0001, // 0010 JMPF R2 #0013 + 0x5C200400, // 0011 MOVE R8 R2 + 0x70020000, // 0012 JMP #0014 + 0x58200007, // 0013 LDCONST R8 K7 + 0x7C100800, // 0014 CALL R4 4 + 0x88140108, // 0015 GETMBR R5 R0 K8 + 0x8C140B09, // 0016 GETMET R5 R5 K9 + 0x5C1C0800, // 0017 MOVE R7 R4 + 0x8820010A, // 0018 GETMBR R8 R0 K10 + 0x7C140600, // 0019 CALL R5 3 + 0x80000000, // 001A RET 0 }) ) ); @@ -620,16 +672,25 @@ extern const bclass be_class_Matter_Plugin_Device; be_local_class(Matter_Plugin_Bridge_HTTP, 5, &be_class_Matter_Plugin_Device, - be_nested_map(21, + be_nested_map(24, ( (struct bmapnode*) &(const bmapnode[]) { - { be_const_key_weak(get_types, 20), be_const_closure(Matter_Plugin_Bridge_HTTP_get_types_closure) }, - { be_const_key_weak(is_reachable, -1), be_const_closure(Matter_Plugin_Bridge_HTTP_is_reachable_closure) }, - { be_const_key_weak(tasmota_http, -1), be_const_var(0) }, + { be_const_key_weak(ARG_HTTP, 1), be_nested_str_weak(url) }, + { be_const_key_weak(UPDATE_TIME, -1), be_const_int(3000) }, + { be_const_key_weak(SYNC_TIMEOUT, -1), be_const_int(500) }, { be_const_key_weak(init, -1), be_const_closure(Matter_Plugin_Bridge_HTTP_init_closure) }, - { be_const_key_weak(reachable_tick, -1), be_const_var(4) }, - { be_const_key_weak(get_status_8, 6), be_const_closure(Matter_Plugin_Bridge_HTTP_get_status_8_closure) }, - { be_const_key_weak(tasmota_status_11, -1), be_const_var(2) }, - { be_const_key_weak(CLUSTERS, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { + { be_const_key_weak(get_remote_status_lazy, 19), be_const_closure(Matter_Plugin_Bridge_HTTP_get_remote_status_lazy_closure) }, + { be_const_key_weak(parse_http_response, -1), be_const_closure(Matter_Plugin_Bridge_HTTP_parse_http_response_closure) }, + { be_const_key_weak(NAME, -1), be_nested_str_weak() }, + { be_const_key_weak(call_remote_sync, 16), be_const_closure(Matter_Plugin_Bridge_HTTP_call_remote_sync_closure) }, + { be_const_key_weak(reachable, -1), be_const_var(0) }, + { be_const_key_weak(get_types, 12), be_const_closure(Matter_Plugin_Bridge_HTTP_get_types_closure) }, + { be_const_key_weak(ui_conf_to_string, 7), be_const_static_closure(Matter_Plugin_Bridge_HTTP_ui_conf_to_string_closure) }, + { be_const_key_weak(http_shadow_map, -1), be_const_var(2) }, + { be_const_key_weak(probe_shadow_async, -1), be_const_closure(Matter_Plugin_Bridge_HTTP_probe_shadow_async_closure) }, + { be_const_key_weak(TYPE, 14), be_nested_str_weak() }, + { be_const_key_weak(PROBE_TIMEOUT, -1), be_const_int(700) }, + { be_const_key_weak(ARG, -1), be_nested_str_weak() }, + { be_const_key_weak(CLUSTERS, 22), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { be_const_map( * be_nested_map(1, ( (struct bmapnode*) &(const bmapnode[]) { { be_const_key_int(57, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_list, { @@ -638,19 +699,13 @@ be_local_class(Matter_Plugin_Bridge_HTTP, be_const_int(17), })) ) } )) }, })) ) } )) }, - { be_const_key_weak(NAME, -1), be_nested_str_weak() }, - { be_const_key_weak(UPDATE_TIME, -1), be_const_int(3000) }, - { be_const_key_weak(TYPE, -1), be_nested_str_weak() }, - { be_const_key_weak(reachable, -1), be_const_var(3) }, - { be_const_key_weak(ARG_HTTP, 3), be_nested_str_weak(url) }, - { be_const_key_weak(ui_string_to_conf, -1), be_const_static_closure(Matter_Plugin_Bridge_HTTP_ui_string_to_conf_closure) }, - { be_const_key_weak(tasmota_status_8, 18), be_const_var(1) }, - { be_const_key_weak(ARG, 8), be_nested_str_weak() }, - { be_const_key_weak(call_remote, -1), be_const_closure(Matter_Plugin_Bridge_HTTP_call_remote_closure) }, - { be_const_key_weak(get_status_11, 5), be_const_closure(Matter_Plugin_Bridge_HTTP_get_status_11_closure) }, - { be_const_key_weak(HTTP_TIMEOUT, 4), be_const_int(300) }, - { be_const_key_weak(ui_conf_to_string, -1), be_const_static_closure(Matter_Plugin_Bridge_HTTP_ui_conf_to_string_closure) }, { be_const_key_weak(read_attribute, -1), be_const_closure(Matter_Plugin_Bridge_HTTP_read_attribute_closure) }, + { be_const_key_weak(next_probe_timestamp, 17), be_const_var(4) }, + { be_const_key_weak(http_remote, -1), be_const_var(3) }, + { be_const_key_weak(reachable_tick, -1), be_const_var(1) }, + { be_const_key_weak(is_reachable_sync, -1), be_const_closure(Matter_Plugin_Bridge_HTTP_is_reachable_sync_closure) }, + { be_const_key_weak(ui_string_to_conf, -1), be_const_static_closure(Matter_Plugin_Bridge_HTTP_ui_string_to_conf_closure) }, + { be_const_key_weak(call_remote_async, -1), be_const_closure(Matter_Plugin_Bridge_HTTP_call_remote_async_closure) }, })), be_str_weak(Matter_Plugin_Bridge_HTTP) ); diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_OnOff.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_OnOff.h index 937ff508a..6a210e0ee 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_OnOff.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_OnOff.h @@ -6,33 +6,6 @@ extern const bclass be_class_Matter_Plugin_Bridge_OnOff; -/******************************************************************** -** Solidified function: -********************************************************************/ -be_local_closure(Matter_Plugin_Bridge_OnOff__X3Clambda_X3E, /* name */ - be_nested_proto( - 3, /* nstack */ - 1, /* argc */ - 0, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 0, /* has constants */ - NULL, /* no const */ - be_str_weak(_X3Clambda_X3E), - &be_const_str_solidified, - ( &(const binstruction[ 4]) { /* code */ - 0x60040009, // 0000 GETGBL R1 G9 - 0x5C080000, // 0001 MOVE R2 R0 - 0x7C040200, // 0002 CALL R1 1 - 0x80040200, // 0003 RET 1 R1 - }) - ) -); -/*******************************************************************/ - - /******************************************************************** ** Solidified function: init ********************************************************************/ @@ -86,38 +59,52 @@ be_local_closure(Matter_Plugin_Bridge_OnOff_init, /* name */ /******************************************************************** -** Solidified function: set_onoff +** Solidified function: parse_update ********************************************************************/ -be_local_closure(Matter_Plugin_Bridge_OnOff_set_onoff, /* name */ +be_local_closure(Matter_Plugin_Bridge_OnOff_parse_update, /* name */ be_nested_proto( - 6, /* nstack */ - 2, /* argc */ + 8, /* nstack */ + 3, /* argc */ 2, /* varg */ 0, /* has upvals */ NULL, /* no upvals */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[ 5]) { /* constants */ - /* K0 */ be_nested_str_weak(call_remote), - /* K1 */ be_nested_str_weak(Power), - /* K2 */ be_nested_str_weak(1), - /* K3 */ be_nested_str_weak(0), - /* K4 */ be_nested_str_weak(update_shadow), + ( &(const bvalue[ 6]) { /* constants */ + /* K0 */ be_nested_str_weak(find), + /* K1 */ be_nested_str_weak(POWER), + /* K2 */ be_nested_str_weak(ON), + /* K3 */ be_nested_str_weak(shadow_onoff), + /* K4 */ be_nested_str_weak(attribute_updated), + /* K5 */ be_const_int(0), }), - be_str_weak(set_onoff), + be_str_weak(parse_update), &be_const_str_solidified, - ( &(const binstruction[10]) { /* code */ - 0x8C080100, // 0000 GETMET R2 R0 K0 - 0x58100001, // 0001 LDCONST R4 K1 - 0x78060001, // 0002 JMPF R1 #0005 - 0x58140002, // 0003 LDCONST R5 K2 - 0x70020000, // 0004 JMP #0006 - 0x58140003, // 0005 LDCONST R5 K3 - 0x7C080600, // 0006 CALL R2 3 - 0x8C080104, // 0007 GETMET R2 R0 K4 - 0x7C080200, // 0008 CALL R2 1 - 0x80000000, // 0009 RET 0 + ( &(const binstruction[23]) { /* code */ + 0x540E000A, // 0000 LDINT R3 11 + 0x1C0C0403, // 0001 EQ R3 R2 R3 + 0x780E0012, // 0002 JMPF R3 #0016 + 0x8C0C0300, // 0003 GETMET R3 R1 K0 + 0x58140001, // 0004 LDCONST R5 K1 + 0x7C0C0400, // 0005 CALL R3 2 + 0x1C0C0702, // 0006 EQ R3 R3 K2 + 0x88100103, // 0007 GETMBR R4 R0 K3 + 0x4C140000, // 0008 LDNIL R5 + 0x20100805, // 0009 NE R4 R4 R5 + 0x78120009, // 000A JMPF R4 #0015 + 0x88100103, // 000B GETMBR R4 R0 K3 + 0x60140017, // 000C GETGBL R5 G23 + 0x5C180600, // 000D MOVE R6 R3 + 0x7C140200, // 000E CALL R5 1 + 0x20100805, // 000F NE R4 R4 R5 + 0x78120003, // 0010 JMPF R4 #0015 + 0x8C100104, // 0011 GETMET R4 R0 K4 + 0x541A0005, // 0012 LDINT R6 6 + 0x581C0005, // 0013 LDCONST R7 K5 + 0x7C100600, // 0014 CALL R4 3 + 0x90020603, // 0015 SETMBR R0 K3 R3 + 0x80000000, // 0016 RET 0 }) ) ); @@ -201,6 +188,104 @@ be_local_closure(Matter_Plugin_Bridge_OnOff_invoke_request, /* name */ /*******************************************************************/ +/******************************************************************** +** Solidified function: set_onoff +********************************************************************/ +be_local_closure(Matter_Plugin_Bridge_OnOff_set_onoff, /* name */ + be_nested_proto( + 6, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 5]) { /* constants */ + /* K0 */ be_nested_str_weak(call_remote_sync), + /* K1 */ be_nested_str_weak(Power), + /* K2 */ be_nested_str_weak(1), + /* K3 */ be_nested_str_weak(0), + /* K4 */ be_nested_str_weak(update_shadow), + }), + be_str_weak(set_onoff), + &be_const_str_solidified, + ( &(const binstruction[10]) { /* code */ + 0x8C080100, // 0000 GETMET R2 R0 K0 + 0x58100001, // 0001 LDCONST R4 K1 + 0x78060001, // 0002 JMPF R1 #0005 + 0x58140002, // 0003 LDCONST R5 K2 + 0x70020000, // 0004 JMP #0006 + 0x58140003, // 0005 LDCONST R5 K3 + 0x7C080600, // 0006 CALL R2 3 + 0x8C080104, // 0007 GETMET R2 R0 K4 + 0x7C080200, // 0008 CALL R2 1 + 0x80000000, // 0009 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: +********************************************************************/ +be_local_closure(Matter_Plugin_Bridge_OnOff__X3Clambda_X3E, /* name */ + be_nested_proto( + 3, /* nstack */ + 1, /* argc */ + 0, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 0, /* has constants */ + NULL, /* no const */ + be_str_weak(_X3Clambda_X3E), + &be_const_str_solidified, + ( &(const binstruction[ 4]) { /* code */ + 0x60040009, // 0000 GETGBL R1 G9 + 0x5C080000, // 0001 MOVE R2 R0 + 0x7C040200, // 0002 CALL R1 1 + 0x80040200, // 0003 RET 1 R1 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: probe_shadow_async +********************************************************************/ +be_local_closure(Matter_Plugin_Bridge_OnOff_probe_shadow_async, /* name */ + be_nested_proto( + 5, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 3]) { /* constants */ + /* K0 */ be_nested_str_weak(call_remote_async), + /* K1 */ be_nested_str_weak(Status), + /* K2 */ be_nested_str_weak(11), + }), + be_str_weak(probe_shadow_async), + &be_const_str_solidified, + ( &(const binstruction[ 5]) { /* code */ + 0x8C040100, // 0000 GETMET R1 R0 K0 + 0x580C0001, // 0001 LDCONST R3 K1 + 0x58100002, // 0002 LDCONST R4 K2 + 0x7C040600, // 0003 CALL R1 3 + 0x80000000, // 0004 RET 0 + }) + ) +); +/*******************************************************************/ + + /******************************************************************** ** Solidified function: read_attribute ********************************************************************/ @@ -287,7 +372,7 @@ be_local_closure(Matter_Plugin_Bridge_OnOff_read_attribute, /* name */ ********************************************************************/ be_local_closure(Matter_Plugin_Bridge_OnOff_update_shadow, /* name */ be_nested_proto( - 7, /* nstack */ + 5, /* nstack */ 1, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -295,54 +380,25 @@ be_local_closure(Matter_Plugin_Bridge_OnOff_update_shadow, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[ 9]) { /* constants */ - /* K0 */ be_nested_str_weak(get_status_11), - /* K1 */ be_nested_str_weak(find), - /* K2 */ be_nested_str_weak(StatusSTS), - /* K3 */ be_nested_str_weak(POWER), - /* K4 */ be_nested_str_weak(ON), - /* K5 */ be_nested_str_weak(shadow_onoff), - /* K6 */ be_nested_str_weak(attribute_updated), - /* K7 */ be_const_int(0), - /* K8 */ be_nested_str_weak(update_shadow), + ( &(const bvalue[ 4]) { /* constants */ + /* K0 */ be_nested_str_weak(call_remote_sync), + /* K1 */ be_nested_str_weak(Status), + /* K2 */ be_nested_str_weak(11), + /* K3 */ be_nested_str_weak(update_shadow), }), be_str_weak(update_shadow), &be_const_str_solidified, - ( &(const binstruction[34]) { /* code */ + ( &(const binstruction[10]) { /* code */ 0x8C040100, // 0000 GETMET R1 R0 K0 - 0x7C040200, // 0001 CALL R1 1 - 0x78060018, // 0002 JMPF R1 #001C - 0x8C080301, // 0003 GETMET R2 R1 K1 - 0x58100002, // 0004 LDCONST R4 K2 - 0x60140013, // 0005 GETGBL R5 G19 - 0x7C140000, // 0006 CALL R5 0 - 0x7C080600, // 0007 CALL R2 3 - 0x5C040400, // 0008 MOVE R1 R2 - 0x8C080301, // 0009 GETMET R2 R1 K1 - 0x58100003, // 000A LDCONST R4 K3 - 0x7C080400, // 000B CALL R2 2 - 0x1C080504, // 000C EQ R2 R2 K4 - 0x880C0105, // 000D GETMBR R3 R0 K5 - 0x4C100000, // 000E LDNIL R4 - 0x200C0604, // 000F NE R3 R3 R4 - 0x780E0009, // 0010 JMPF R3 #001B - 0x880C0105, // 0011 GETMBR R3 R0 K5 - 0x60100017, // 0012 GETGBL R4 G23 - 0x5C140400, // 0013 MOVE R5 R2 - 0x7C100200, // 0014 CALL R4 1 - 0x200C0604, // 0015 NE R3 R3 R4 - 0x780E0003, // 0016 JMPF R3 #001B - 0x8C0C0106, // 0017 GETMET R3 R0 K6 - 0x54160005, // 0018 LDINT R5 6 - 0x58180007, // 0019 LDCONST R6 K7 - 0x7C0C0600, // 001A CALL R3 3 - 0x90020A02, // 001B SETMBR R0 K5 R2 - 0x60080003, // 001C GETGBL R2 G3 - 0x5C0C0000, // 001D MOVE R3 R0 - 0x7C080200, // 001E CALL R2 1 - 0x8C080508, // 001F GETMET R2 R2 K8 - 0x7C080200, // 0020 CALL R2 1 - 0x80000000, // 0021 RET 0 + 0x580C0001, // 0001 LDCONST R3 K1 + 0x58100002, // 0002 LDCONST R4 K2 + 0x7C040600, // 0003 CALL R1 3 + 0x60080003, // 0004 GETGBL R2 G3 + 0x5C0C0000, // 0005 MOVE R3 R0 + 0x7C080200, // 0006 CALL R2 1 + 0x8C080503, // 0007 GETMET R2 R2 K3 + 0x7C080200, // 0008 CALL R2 1 + 0x80000000, // 0009 RET 0 }) ) ); @@ -354,11 +410,29 @@ be_local_closure(Matter_Plugin_Bridge_OnOff_update_shadow, /* name */ ********************************************************************/ extern const bclass be_class_Matter_Plugin_Bridge_HTTP; be_local_class(Matter_Plugin_Bridge_OnOff, - 3, + 2, &be_class_Matter_Plugin_Bridge_HTTP, - be_nested_map(14, + be_nested_map(15, ( (struct bmapnode*) &(const bmapnode[]) { - { be_const_key_weak(CLUSTERS, 11), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { + { be_const_key_weak(init, -1), be_const_closure(Matter_Plugin_Bridge_OnOff_init_closure) }, + { be_const_key_weak(parse_update, -1), be_const_closure(Matter_Plugin_Bridge_OnOff_parse_update_closure) }, + { be_const_key_weak(invoke_request, -1), be_const_closure(Matter_Plugin_Bridge_OnOff_invoke_request_closure) }, + { be_const_key_weak(set_onoff, -1), be_const_closure(Matter_Plugin_Bridge_OnOff_set_onoff_closure) }, + { be_const_key_weak(ARG_TYPE, 7), be_const_static_closure(Matter_Plugin_Bridge_OnOff__X3Clambda_X3E_closure) }, + { be_const_key_weak(tasmota_relay_index, 11), be_const_var(0) }, + { be_const_key_weak(probe_shadow_async, -1), be_const_closure(Matter_Plugin_Bridge_OnOff_probe_shadow_async_closure) }, + { be_const_key_weak(update_shadow, 10), be_const_closure(Matter_Plugin_Bridge_OnOff_update_shadow_closure) }, + { be_const_key_weak(NAME, -1), be_nested_str_weak(_X26_X23x1F517_X3B_X20Relay) }, + { be_const_key_weak(ARG, 8), be_nested_str_weak(relay) }, + { be_const_key_weak(TYPE, 14), be_nested_str_weak(http_relay) }, + { be_const_key_weak(TYPES, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { + be_const_map( * be_nested_map(1, + ( (struct bmapnode*) &(const bmapnode[]) { + { be_const_key_int(266, -1), be_const_int(2) }, + })) ) } )) }, + { be_const_key_weak(read_attribute, -1), be_const_closure(Matter_Plugin_Bridge_OnOff_read_attribute_closure) }, + { be_const_key_weak(shadow_onoff, -1), be_const_var(1) }, + { be_const_key_weak(CLUSTERS, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { be_const_map( * be_nested_map(1, ( (struct bmapnode*) &(const bmapnode[]) { { be_const_key_int(6, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_list, { @@ -369,23 +443,6 @@ be_local_class(Matter_Plugin_Bridge_OnOff, be_const_int(65533), })) ) } )) }, })) ) } )) }, - { be_const_key_weak(ARG, -1), be_nested_str_weak(relay) }, - { be_const_key_weak(ARG_TYPE, -1), be_const_static_closure(Matter_Plugin_Bridge_OnOff__X3Clambda_X3E_closure) }, - { be_const_key_weak(TYPE, -1), be_nested_str_weak(http_relay) }, - { be_const_key_weak(update_shadow, -1), be_const_closure(Matter_Plugin_Bridge_OnOff_update_shadow_closure) }, - { be_const_key_weak(init, -1), be_const_closure(Matter_Plugin_Bridge_OnOff_init_closure) }, - { be_const_key_weak(shadow_onoff, 13), be_const_var(2) }, - { be_const_key_weak(invoke_request, 4), be_const_closure(Matter_Plugin_Bridge_OnOff_invoke_request_closure) }, - { be_const_key_weak(NAME, -1), be_nested_str_weak(_X26_X23x1F517_X3B_X20Relay) }, - { be_const_key_weak(tasmota_http, 12), be_const_var(0) }, - { be_const_key_weak(TYPES, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { - be_const_map( * be_nested_map(1, - ( (struct bmapnode*) &(const bmapnode[]) { - { be_const_key_int(266, -1), be_const_int(2) }, - })) ) } )) }, - { be_const_key_weak(read_attribute, -1), be_const_closure(Matter_Plugin_Bridge_OnOff_read_attribute_closure) }, - { be_const_key_weak(tasmota_relay_index, -1), be_const_var(1) }, - { be_const_key_weak(set_onoff, -1), be_const_closure(Matter_Plugin_Bridge_OnOff_set_onoff_closure) }, })), be_str_weak(Matter_Plugin_Bridge_OnOff) ); diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_TCP_async.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_TCP_async.h new file mode 100644 index 000000000..62c3ff37e --- /dev/null +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_TCP_async.h @@ -0,0 +1,872 @@ +/* Solidification of Matter_TCP_async.h */ +/********************************************************************\ +* Generated code, don't edit * +\********************************************************************/ +#include "be_constobj.h" + +extern const bclass be_class_Matter_TCP_async; + +/******************************************************************** +** Solidified function: write +********************************************************************/ +be_local_closure(Matter_TCP_async_write, /* name */ + be_nested_proto( + 5, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 4]) { /* constants */ + /* K0 */ be_nested_str_weak(tcp_connected), + /* K1 */ be_nested_str_weak(tcp), + /* K2 */ be_nested_str_weak(write), + /* K3 */ be_const_int(0), + }), + be_str_weak(write), + &be_const_str_solidified, + ( &(const binstruction[ 8]) { /* code */ + 0x88080100, // 0000 GETMBR R2 R0 K0 + 0x780A0004, // 0001 JMPF R2 #0007 + 0x88080101, // 0002 GETMBR R2 R0 K1 + 0x8C080502, // 0003 GETMET R2 R2 K2 + 0x5C100200, // 0004 MOVE R4 R1 + 0x7C080400, // 0005 CALL R2 2 + 0x80040400, // 0006 RET 1 R2 + 0x80060600, // 0007 RET 1 K3 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: readbytes +********************************************************************/ +be_local_closure(Matter_TCP_async_readbytes, /* name */ + be_nested_proto( + 3, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 3]) { /* constants */ + /* K0 */ be_nested_str_weak(tcp_connected), + /* K1 */ be_nested_str_weak(tcp), + /* K2 */ be_nested_str_weak(readbytes), + }), + be_str_weak(readbytes), + &be_const_str_solidified, + ( &(const binstruction[ 8]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x78060003, // 0001 JMPF R1 #0006 + 0x88040101, // 0002 GETMBR R1 R0 K1 + 0x8C040302, // 0003 GETMET R1 R1 K2 + 0x7C040200, // 0004 CALL R1 1 + 0x80040200, // 0005 RET 1 R1 + 0x4C040000, // 0006 LDNIL R1 + 0x80040200, // 0007 RET 1 R1 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: every_50ms +********************************************************************/ +be_local_closure(Matter_TCP_async_every_50ms, /* name */ + be_nested_proto( + 3, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 1]) { /* constants */ + /* K0 */ be_nested_str_weak(loop), + }), + be_str_weak(every_50ms), + &be_const_str_solidified, + ( &(const binstruction[ 3]) { /* code */ + 0x8C040100, // 0000 GETMET R1 R0 K0 + 0x7C040200, // 0001 CALL R1 1 + 0x80000000, // 0002 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: listening +********************************************************************/ +be_local_closure(Matter_TCP_async_listening, /* name */ + be_nested_proto( + 3, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 3]) { /* constants */ + /* K0 */ be_nested_str_weak(tcp_connected), + /* K1 */ be_nested_str_weak(tcp), + /* K2 */ be_nested_str_weak(listening), + }), + be_str_weak(listening), + &be_const_str_solidified, + ( &(const binstruction[ 8]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x78060003, // 0001 JMPF R1 #0006 + 0x88040101, // 0002 GETMBR R1 R0 K1 + 0x8C040302, // 0003 GETMET R1 R1 K2 + 0x7C040200, // 0004 CALL R1 1 + 0x80040200, // 0005 RET 1 R1 + 0x50040000, // 0006 LDBOOL R1 0 0 + 0x80040200, // 0007 RET 1 R1 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: loop +********************************************************************/ +be_local_closure(Matter_TCP_async_loop, /* name */ + be_nested_proto( + 4, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[18]) { /* constants */ + /* K0 */ be_nested_str_weak(tcp_connected), + /* K1 */ be_nested_str_weak(status), + /* K2 */ be_nested_str_weak(close), + /* K3 */ be_nested_str_weak(tcp), + /* K4 */ be_nested_str_weak(connected), + /* K5 */ be_const_int(1), + /* K6 */ be_nested_str_weak(event_established), + /* K7 */ be_nested_str_weak(event_refused), + /* K8 */ be_nested_str_weak(tasmota), + /* K9 */ be_nested_str_weak(millis), + /* K10 */ be_nested_str_weak(time_start), + /* K11 */ be_nested_str_weak(timeout), + /* K12 */ be_nested_str_weak(event_timeout), + /* K13 */ be_nested_str_weak(event_closed), + /* K14 */ be_nested_str_weak(available), + /* K15 */ be_nested_str_weak(event_available), + /* K16 */ be_nested_str_weak(listening), + /* K17 */ be_nested_str_weak(event_listening), + }), + be_str_weak(loop), + &be_const_str_solidified, + ( &(const binstruction[89]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x88080101, // 0001 GETMBR R2 R0 K1 + 0x4C0C0000, // 0002 LDNIL R3 + 0x1C080403, // 0003 EQ R2 R2 R3 + 0x780A0002, // 0004 JMPF R2 #0008 + 0x8C080102, // 0005 GETMET R2 R0 K2 + 0x7C080200, // 0006 CALL R2 1 + 0x80000400, // 0007 RET 0 + 0x88080103, // 0008 GETMBR R2 R0 K3 + 0x8C080504, // 0009 GETMET R2 R2 K4 + 0x7C080200, // 000A CALL R2 1 + 0x90020002, // 000B SETMBR R0 K0 R2 + 0x4C080000, // 000C LDNIL R2 + 0x1C080202, // 000D EQ R2 R1 R2 + 0x780A0021, // 000E JMPF R2 #0031 + 0x88080100, // 000F GETMBR R2 R0 K0 + 0x500C0200, // 0010 LDBOOL R3 1 0 + 0x1C080403, // 0011 EQ R2 R2 R3 + 0x780A0003, // 0012 JMPF R2 #0017 + 0x90020305, // 0013 SETMBR R0 K1 K5 + 0x8C080106, // 0014 GETMET R2 R0 K6 + 0x7C080200, // 0015 CALL R2 1 + 0x70020019, // 0016 JMP #0031 + 0x88080100, // 0017 GETMBR R2 R0 K0 + 0x500C0000, // 0018 LDBOOL R3 0 0 + 0x1C080403, // 0019 EQ R2 R2 R3 + 0x780A0007, // 001A JMPF R2 #0023 + 0x5409FFFD, // 001B LDINT R2 -2 + 0x90020202, // 001C SETMBR R0 K1 R2 + 0x8C080107, // 001D GETMET R2 R0 K7 + 0x7C080200, // 001E CALL R2 1 + 0x8C080102, // 001F GETMET R2 R0 K2 + 0x7C080200, // 0020 CALL R2 1 + 0x80000400, // 0021 RET 0 + 0x7002000D, // 0022 JMP #0031 + 0xB80A1000, // 0023 GETNGBL R2 K8 + 0x8C080509, // 0024 GETMET R2 R2 K9 + 0x7C080200, // 0025 CALL R2 1 + 0x880C010A, // 0026 GETMBR R3 R0 K10 + 0x04080403, // 0027 SUB R2 R2 R3 + 0x880C010B, // 0028 GETMBR R3 R0 K11 + 0x24080403, // 0029 GT R2 R2 R3 + 0x780A0005, // 002A JMPF R2 #0031 + 0x5409FFFC, // 002B LDINT R2 -3 + 0x90020202, // 002C SETMBR R0 K1 R2 + 0x50080000, // 002D LDBOOL R2 0 0 + 0x90020002, // 002E SETMBR R0 K0 R2 + 0x8C08010C, // 002F GETMET R2 R0 K12 + 0x7C080200, // 0030 CALL R2 1 + 0xB80A1000, // 0031 GETNGBL R2 K8 + 0x8C080509, // 0032 GETMET R2 R2 K9 + 0x7C080200, // 0033 CALL R2 1 + 0x880C010A, // 0034 GETMBR R3 R0 K10 + 0x04080403, // 0035 SUB R2 R2 R3 + 0x880C010B, // 0036 GETMBR R3 R0 K11 + 0x24080403, // 0037 GT R2 R2 R3 + 0x780A0006, // 0038 JMPF R2 #0040 + 0x8C080102, // 0039 GETMET R2 R0 K2 + 0x7C080200, // 003A CALL R2 1 + 0x5409FFFC, // 003B LDINT R2 -3 + 0x90020202, // 003C SETMBR R0 K1 R2 + 0x8C08010C, // 003D GETMET R2 R0 K12 + 0x7C080200, // 003E CALL R2 1 + 0x80000400, // 003F RET 0 + 0x88080100, // 0040 GETMBR R2 R0 K0 + 0x500C0000, // 0041 LDBOOL R3 0 0 + 0x1C080403, // 0042 EQ R2 R2 R3 + 0x780A0007, // 0043 JMPF R2 #004C + 0x50080200, // 0044 LDBOOL R2 1 0 + 0x1C080202, // 0045 EQ R2 R1 R2 + 0x780A0001, // 0046 JMPF R2 #0049 + 0x8C08010D, // 0047 GETMET R2 R0 K13 + 0x7C080200, // 0048 CALL R2 1 + 0x8C080102, // 0049 GETMET R2 R0 K2 + 0x7C080200, // 004A CALL R2 1 + 0x80000400, // 004B RET 0 + 0x88080103, // 004C GETMBR R2 R0 K3 + 0x8C08050E, // 004D GETMET R2 R2 K14 + 0x7C080200, // 004E CALL R2 1 + 0x780A0001, // 004F JMPF R2 #0052 + 0x8C08010F, // 0050 GETMET R2 R0 K15 + 0x7C080200, // 0051 CALL R2 1 + 0x88080103, // 0052 GETMBR R2 R0 K3 + 0x8C080510, // 0053 GETMET R2 R2 K16 + 0x7C080200, // 0054 CALL R2 1 + 0x780A0001, // 0055 JMPF R2 #0058 + 0x8C080111, // 0056 GETMET R2 R0 K17 + 0x7C080200, // 0057 CALL R2 1 + 0x80000000, // 0058 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: event_established +********************************************************************/ +be_local_closure(Matter_TCP_async_event_established, /* name */ + be_nested_proto( + 1, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 0, /* has constants */ + NULL, /* no const */ + be_str_weak(event_established), + &be_const_str_solidified, + ( &(const binstruction[ 1]) { /* code */ + 0x80000000, // 0000 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: reset +********************************************************************/ +be_local_closure(Matter_TCP_async_reset, /* name */ + be_nested_proto( + 3, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 3]) { /* constants */ + /* K0 */ be_nested_str_weak(tcp), + /* K1 */ be_nested_str_weak(close), + /* K2 */ be_nested_str_weak(tcp_connected), + }), + be_str_weak(reset), + &be_const_str_solidified, + ( &(const binstruction[ 6]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x8C040301, // 0001 GETMET R1 R1 K1 + 0x7C040200, // 0002 CALL R1 1 + 0x4C040000, // 0003 LDNIL R1 + 0x90020401, // 0004 SETMBR R0 K2 R1 + 0x80000000, // 0005 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: event_listening +********************************************************************/ +be_local_closure(Matter_TCP_async_event_listening, /* name */ + be_nested_proto( + 1, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 0, /* has constants */ + NULL, /* no const */ + be_str_weak(event_listening), + &be_const_str_solidified, + ( &(const binstruction[ 1]) { /* code */ + 0x80000000, // 0000 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: init +********************************************************************/ +be_local_closure(Matter_TCP_async_init, /* name */ + be_nested_proto( + 7, /* nstack */ + 5, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 1, /* has sup protos */ + ( &(const struct bproto*[ 1]) { + be_nested_proto( + 2, /* nstack */ + 0, /* argc */ + 0, /* varg */ + 1, /* has upvals */ + ( &(const bupvaldesc[ 1]) { /* upvals */ + be_local_const_upval(1, 0), + }), + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 1]) { /* constants */ + /* K0 */ be_nested_str_weak(loop), + }), + be_str_weak(_X3Clambda_X3E), + &be_const_str_solidified, + ( &(const binstruction[ 4]) { /* code */ + 0x68000000, // 0000 GETUPV R0 U0 + 0x8C000100, // 0001 GETMET R0 R0 K0 + 0x7C000200, // 0002 CALL R0 1 + 0x80040000, // 0003 RET 1 R0 + }) + ), + }), + 1, /* has constants */ + ( &(const bvalue[ 7]) { /* constants */ + /* K0 */ be_nested_str_weak(TIMEOUT), + /* K1 */ be_nested_str_weak(addr), + /* K2 */ be_nested_str_weak(port), + /* K3 */ be_nested_str_weak(timeout), + /* K4 */ be_nested_str_weak(tcp), + /* K5 */ be_nested_str_weak(tcpclientasync), + /* K6 */ be_nested_str_weak(fast_loop), + }), + be_str_weak(init), + &be_const_str_solidified, + ( &(const binstruction[25]) { /* code */ + 0x4C140000, // 0000 LDNIL R5 + 0x1C140605, // 0001 EQ R5 R3 R5 + 0x78160000, // 0002 JMPF R5 #0004 + 0x880C0100, // 0003 GETMBR R3 R0 K0 + 0x4C140000, // 0004 LDNIL R5 + 0x1C140405, // 0005 EQ R5 R2 R5 + 0x78160000, // 0006 JMPF R5 #0008 + 0x540A004F, // 0007 LDINT R2 80 + 0x60140008, // 0008 GETGBL R5 G8 + 0x5C180200, // 0009 MOVE R6 R1 + 0x7C140200, // 000A CALL R5 1 + 0x90020205, // 000B SETMBR R0 K1 R5 + 0x60140009, // 000C GETGBL R5 G9 + 0x5C180400, // 000D MOVE R6 R2 + 0x7C140200, // 000E CALL R5 1 + 0x90020405, // 000F SETMBR R0 K2 R5 + 0x90020603, // 0010 SETMBR R0 K3 R3 + 0xB8160A00, // 0011 GETNGBL R5 K5 + 0x7C140000, // 0012 CALL R5 0 + 0x90020805, // 0013 SETMBR R0 K4 R5 + 0x78120001, // 0014 JMPF R4 #0017 + 0x84140000, // 0015 CLOSURE R5 P0 + 0x90020C05, // 0016 SETMBR R0 K6 R5 + 0xA0000000, // 0017 CLOSE R0 + 0x80000000, // 0018 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: event_closed +********************************************************************/ +be_local_closure(Matter_TCP_async_event_closed, /* name */ + be_nested_proto( + 1, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 0, /* has constants */ + NULL, /* no const */ + be_str_weak(event_closed), + &be_const_str_solidified, + ( &(const binstruction[ 1]) { /* code */ + 0x80000000, // 0000 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: read +********************************************************************/ +be_local_closure(Matter_TCP_async_read, /* name */ + be_nested_proto( + 3, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 3]) { /* constants */ + /* K0 */ be_nested_str_weak(tcp_connected), + /* K1 */ be_nested_str_weak(tcp), + /* K2 */ be_nested_str_weak(read), + }), + be_str_weak(read), + &be_const_str_solidified, + ( &(const binstruction[ 8]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x78060003, // 0001 JMPF R1 #0006 + 0x88040101, // 0002 GETMBR R1 R0 K1 + 0x8C040302, // 0003 GETMET R1 R1 K2 + 0x7C040200, // 0004 CALL R1 1 + 0x80040200, // 0005 RET 1 R1 + 0x4C040000, // 0006 LDNIL R1 + 0x80040200, // 0007 RET 1 R1 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: begin +********************************************************************/ +be_local_closure(Matter_TCP_async_begin, /* name */ + be_nested_proto( + 9, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[25]) { /* constants */ + /* K0 */ be_nested_str_weak(reset), + /* K1 */ be_nested_str_weak(tasmota), + /* K2 */ be_nested_str_weak(wifi), + /* K3 */ be_nested_str_weak(up), + /* K4 */ be_nested_str_weak(eth), + /* K5 */ be_nested_str_weak(time_start), + /* K6 */ be_nested_str_weak(millis), + /* K7 */ be_nested_str_weak(status), + /* K8 */ be_const_int(0), + /* K9 */ be_nested_str_weak(tcp), + /* K10 */ be_nested_str_weak(connect), + /* K11 */ be_nested_str_weak(addr), + /* K12 */ be_nested_str_weak(port), + /* K13 */ be_nested_str_weak(fast_loop), + /* K14 */ be_nested_str_weak(remove_fast_loop), + /* K15 */ be_nested_str_weak(add_fast_loop), + /* K16 */ be_nested_str_weak(add_driver), + /* K17 */ be_nested_str_weak(string), + /* K18 */ be_nested_str_weak(log), + /* K19 */ be_nested_str_weak(format), + /* K20 */ be_nested_str_weak(BRY_X3A_X20failed_X20to_X20resolve_X20_X5B_X25s_X5D_X3A_X25i), + /* K21 */ be_const_int(3), + /* K22 */ be_nested_str_weak(close), + /* K23 */ be_nested_str_weak(tcp_connected), + /* K24 */ be_nested_str_weak(event_dnsfailed), + }), + be_str_weak(begin), + &be_const_str_solidified, + ( &(const binstruction[64]) { /* code */ + 0x8C040100, // 0000 GETMET R1 R0 K0 + 0x7C040200, // 0001 CALL R1 1 + 0xB8060200, // 0002 GETNGBL R1 K1 + 0x8C040302, // 0003 GETMET R1 R1 K2 + 0x7C040200, // 0004 CALL R1 1 + 0x94040303, // 0005 GETIDX R1 R1 K3 + 0x74060006, // 0006 JMPT R1 #000E + 0xB8060200, // 0007 GETNGBL R1 K1 + 0x8C040304, // 0008 GETMET R1 R1 K4 + 0x7C040200, // 0009 CALL R1 1 + 0x94040303, // 000A GETIDX R1 R1 K3 + 0x74060001, // 000B JMPT R1 #000E + 0x4C040000, // 000C LDNIL R1 + 0x80040200, // 000D RET 1 R1 + 0xB8060200, // 000E GETNGBL R1 K1 + 0x8C040306, // 000F GETMET R1 R1 K6 + 0x7C040200, // 0010 CALL R1 1 + 0x90020A01, // 0011 SETMBR R0 K5 R1 + 0x90020F08, // 0012 SETMBR R0 K7 K8 + 0x88040109, // 0013 GETMBR R1 R0 K9 + 0x8C04030A, // 0014 GETMET R1 R1 K10 + 0x880C010B, // 0015 GETMBR R3 R0 K11 + 0x8810010C, // 0016 GETMBR R4 R0 K12 + 0x7C040600, // 0017 CALL R1 3 + 0x78060011, // 0018 JMPF R1 #002B + 0x8804010D, // 0019 GETMBR R1 R0 K13 + 0x78060008, // 001A JMPF R1 #0024 + 0xB8060200, // 001B GETNGBL R1 K1 + 0x8C04030E, // 001C GETMET R1 R1 K14 + 0x880C010D, // 001D GETMBR R3 R0 K13 + 0x7C040400, // 001E CALL R1 2 + 0xB8060200, // 001F GETNGBL R1 K1 + 0x8C04030F, // 0020 GETMET R1 R1 K15 + 0x880C010D, // 0021 GETMBR R3 R0 K13 + 0x7C040400, // 0022 CALL R1 2 + 0x70020003, // 0023 JMP #0028 + 0xB8060200, // 0024 GETNGBL R1 K1 + 0x8C040310, // 0025 GETMET R1 R1 K16 + 0x5C0C0000, // 0026 MOVE R3 R0 + 0x7C040400, // 0027 CALL R1 2 + 0x50040200, // 0028 LDBOOL R1 1 0 + 0x80040200, // 0029 RET 1 R1 + 0x70020013, // 002A JMP #003F + 0xA4062200, // 002B IMPORT R1 K17 + 0xB80A0200, // 002C GETNGBL R2 K1 + 0x8C080512, // 002D GETMET R2 R2 K18 + 0x8C100313, // 002E GETMET R4 R1 K19 + 0x58180014, // 002F LDCONST R6 K20 + 0x881C010B, // 0030 GETMBR R7 R0 K11 + 0x8820010C, // 0031 GETMBR R8 R0 K12 + 0x7C100800, // 0032 CALL R4 4 + 0x58140015, // 0033 LDCONST R5 K21 + 0x7C080600, // 0034 CALL R2 3 + 0x8C080116, // 0035 GETMET R2 R0 K22 + 0x7C080200, // 0036 CALL R2 1 + 0x5409FFFE, // 0037 LDINT R2 -1 + 0x90020E02, // 0038 SETMBR R0 K7 R2 + 0x50080000, // 0039 LDBOOL R2 0 0 + 0x90022E02, // 003A SETMBR R0 K23 R2 + 0x8C080118, // 003B GETMET R2 R0 K24 + 0x7C080200, // 003C CALL R2 1 + 0x50080000, // 003D LDBOOL R2 0 0 + 0x80040400, // 003E RET 1 R2 + 0x80000000, // 003F RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: event_timeout +********************************************************************/ +be_local_closure(Matter_TCP_async_event_timeout, /* name */ + be_nested_proto( + 1, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 0, /* has constants */ + NULL, /* no const */ + be_str_weak(event_timeout), + &be_const_str_solidified, + ( &(const binstruction[ 1]) { /* code */ + 0x80000000, // 0000 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: available +********************************************************************/ +be_local_closure(Matter_TCP_async_available, /* name */ + be_nested_proto( + 3, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 4]) { /* constants */ + /* K0 */ be_nested_str_weak(tcp_connected), + /* K1 */ be_nested_str_weak(tcp), + /* K2 */ be_nested_str_weak(available), + /* K3 */ be_const_int(0), + }), + be_str_weak(available), + &be_const_str_solidified, + ( &(const binstruction[ 7]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x78060003, // 0001 JMPF R1 #0006 + 0x88040101, // 0002 GETMBR R1 R0 K1 + 0x8C040302, // 0003 GETMET R1 R1 K2 + 0x7C040200, // 0004 CALL R1 1 + 0x80040200, // 0005 RET 1 R1 + 0x80060600, // 0006 RET 1 K3 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: event_refused +********************************************************************/ +be_local_closure(Matter_TCP_async_event_refused, /* name */ + be_nested_proto( + 1, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 0, /* has constants */ + NULL, /* no const */ + be_str_weak(event_refused), + &be_const_str_solidified, + ( &(const binstruction[ 1]) { /* code */ + 0x80000000, // 0000 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: event_dnsfailed +********************************************************************/ +be_local_closure(Matter_TCP_async_event_dnsfailed, /* name */ + be_nested_proto( + 1, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 0, /* has constants */ + NULL, /* no const */ + be_str_weak(event_dnsfailed), + &be_const_str_solidified, + ( &(const binstruction[ 1]) { /* code */ + 0x80000000, // 0000 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: event_available +********************************************************************/ +be_local_closure(Matter_TCP_async_event_available, /* name */ + be_nested_proto( + 1, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 0, /* has constants */ + NULL, /* no const */ + be_str_weak(event_available), + &be_const_str_solidified, + ( &(const binstruction[ 1]) { /* code */ + 0x80000000, // 0000 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: close +********************************************************************/ +be_local_closure(Matter_TCP_async_close, /* name */ + be_nested_proto( + 4, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 8]) { /* constants */ + /* K0 */ be_nested_str_weak(tcp), + /* K1 */ be_nested_str_weak(close), + /* K2 */ be_nested_str_weak(fast_loop), + /* K3 */ be_nested_str_weak(tasmota), + /* K4 */ be_nested_str_weak(remove_fast_loop), + /* K5 */ be_nested_str_weak(remove_driver), + /* K6 */ be_nested_str_weak(tcp_connected), + /* K7 */ be_nested_str_weak(event_closed), + }), + be_str_weak(close), + &be_const_str_solidified, + ( &(const binstruction[23]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x8C040301, // 0001 GETMET R1 R1 K1 + 0x7C040200, // 0002 CALL R1 1 + 0x88040102, // 0003 GETMBR R1 R0 K2 + 0x78060004, // 0004 JMPF R1 #000A + 0xB8060600, // 0005 GETNGBL R1 K3 + 0x8C040304, // 0006 GETMET R1 R1 K4 + 0x880C0102, // 0007 GETMBR R3 R0 K2 + 0x7C040400, // 0008 CALL R1 2 + 0x70020003, // 0009 JMP #000E + 0xB8060600, // 000A GETNGBL R1 K3 + 0x8C040305, // 000B GETMET R1 R1 K5 + 0x5C0C0000, // 000C MOVE R3 R0 + 0x7C040400, // 000D CALL R1 2 + 0x88040106, // 000E GETMBR R1 R0 K6 + 0x50080200, // 000F LDBOOL R2 1 0 + 0x1C040202, // 0010 EQ R1 R1 R2 + 0x78060001, // 0011 JMPF R1 #0014 + 0x8C040107, // 0012 GETMET R1 R0 K7 + 0x7C040200, // 0013 CALL R1 1 + 0x50040000, // 0014 LDBOOL R1 0 0 + 0x90020C01, // 0015 SETMBR R0 K6 R1 + 0x80000000, // 0016 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: set_timeout +********************************************************************/ +be_local_closure(Matter_TCP_async_set_timeout, /* name */ + be_nested_proto( + 3, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 2]) { /* constants */ + /* K0 */ be_nested_str_weak(TIMEOUT), + /* K1 */ be_nested_str_weak(timeout), + }), + be_str_weak(set_timeout), + &be_const_str_solidified, + ( &(const binstruction[ 6]) { /* code */ + 0x4C080000, // 0000 LDNIL R2 + 0x1C080202, // 0001 EQ R2 R1 R2 + 0x780A0000, // 0002 JMPF R2 #0004 + 0x88040100, // 0003 GETMBR R1 R0 K0 + 0x90020201, // 0004 SETMBR R0 K1 R1 + 0x80000000, // 0005 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified class: Matter_TCP_async +********************************************************************/ +be_local_class(Matter_TCP_async, + 8, + NULL, + be_nested_map(28, + ( (struct bmapnode*) &(const bmapnode[]) { + { be_const_key_weak(write, -1), be_const_closure(Matter_TCP_async_write_closure) }, + { be_const_key_weak(timeout, -1), be_const_var(2) }, + { be_const_key_weak(port, -1), be_const_var(1) }, + { be_const_key_weak(close, 7), be_const_closure(Matter_TCP_async_close_closure) }, + { be_const_key_weak(tcp, -1), be_const_var(3) }, + { be_const_key_weak(tcp_connected, -1), be_const_var(5) }, + { be_const_key_weak(listening, -1), be_const_closure(Matter_TCP_async_listening_closure) }, + { be_const_key_weak(event_available, -1), be_const_closure(Matter_TCP_async_event_available_closure) }, + { be_const_key_weak(readbytes, 1), be_const_closure(Matter_TCP_async_readbytes_closure) }, + { be_const_key_weak(event_dnsfailed, -1), be_const_closure(Matter_TCP_async_event_dnsfailed_closure) }, + { be_const_key_weak(event_established, -1), be_const_closure(Matter_TCP_async_event_established_closure) }, + { be_const_key_weak(event_refused, 21), be_const_closure(Matter_TCP_async_event_refused_closure) }, + { be_const_key_weak(reset, -1), be_const_closure(Matter_TCP_async_reset_closure) }, + { be_const_key_weak(event_listening, -1), be_const_closure(Matter_TCP_async_event_listening_closure) }, + { be_const_key_weak(event_timeout, -1), be_const_closure(Matter_TCP_async_event_timeout_closure) }, + { be_const_key_weak(status, 25), be_const_var(6) }, + { be_const_key_weak(every_50ms, 11), be_const_closure(Matter_TCP_async_every_50ms_closure) }, + { be_const_key_weak(read, -1), be_const_closure(Matter_TCP_async_read_closure) }, + { be_const_key_weak(begin, -1), be_const_closure(Matter_TCP_async_begin_closure) }, + { be_const_key_weak(init, 14), be_const_closure(Matter_TCP_async_init_closure) }, + { be_const_key_weak(available, -1), be_const_closure(Matter_TCP_async_available_closure) }, + { be_const_key_weak(event_closed, -1), be_const_closure(Matter_TCP_async_event_closed_closure) }, + { be_const_key_weak(addr, 9), be_const_var(0) }, + { be_const_key_weak(loop, 3), be_const_closure(Matter_TCP_async_loop_closure) }, + { be_const_key_weak(TIMEOUT, 5), be_const_int(1000) }, + { be_const_key_weak(time_start, -1), be_const_var(4) }, + { be_const_key_weak(fast_loop, 2), be_const_var(7) }, + { be_const_key_weak(set_timeout, -1), be_const_closure(Matter_TCP_async_set_timeout_closure) }, + })), + be_str_weak(Matter_TCP_async) +); +/*******************************************************************/ + +void be_load_Matter_TCP_async_class(bvm *vm) { + be_pushntvclass(vm, &be_class_Matter_TCP_async); + be_setglobal(vm, "Matter_TCP_async"); + be_pop(vm, 1); +} +/********************************************************************/ +/* End of solidification */ From 98bfc172c156164d9952efe866de73027e8ef470 Mon Sep 17 00:00:00 2001 From: s-hadinger <49731213+s-hadinger@users.noreply.github.com> Date: Mon, 15 May 2023 22:04:13 +0200 Subject: [PATCH 129/289] Zigbee support for air sensors (#18665) * Zigbee support for air sensors * ppm --- CHANGELOG.md | 1 + .../xdrv_23_zigbee_1z_libs.ino | 6 +++--- .../xdrv_23_zigbee_5_1_attributes.ino | 20 +++++++++---------- .../xdrv_23_zigbee_5_2_converters.ino | 6 +++--- .../xdrv_23_zigbee_7_7_plugin.ino | 14 ++++++------- .../xdrv_23_zigbee_A_impl.ino | 2 +- tasmota/zigbee/air_quality.zb | 7 +++++++ 7 files changed, 32 insertions(+), 24 deletions(-) create mode 100644 tasmota/zigbee/air_quality.zb diff --git a/CHANGELOG.md b/CHANGELOG.md index e0bd12892..96c7273c2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,6 +14,7 @@ All notable changes to this project will be documented in this file. - Support for GM861 1D and 2D bar code reader (#18399) - Berry `re` (regex) add `match2` and optional offset - Support for PCA9557 8-bit I/O expander (#18632) +- Zigbee support for air sensors ### Breaking Changed - Change command ``FileUpload`` index binary data detection from >199 to >299 diff --git a/tasmota/tasmota_xdrv_driver/xdrv_23_zigbee_1z_libs.ino b/tasmota/tasmota_xdrv_driver/xdrv_23_zigbee_1z_libs.ino index f93d375a8..342c5d91c 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_23_zigbee_1z_libs.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_23_zigbee_1z_libs.ino @@ -111,10 +111,10 @@ public: // Bit #9 is `0` command is cluster specific, or `1` general_command uint8_t key_suffix; // append a suffix to key (default is 1, explicitly output if >1) uint8_t attr_type; // [opt] type of the attribute, default to Zunk (0xFF) - uint16_t attr_multiplier; // [opt] multiplier for attribute, defaults to 0x01 (no change) - uint16_t attr_divider; // [opt] divider - int16_t attr_base; // [opt] base for conversion uint16_t manuf; // manufacturer id (0 if none) + uint32_t attr_multiplier; // [opt] multiplier for attribute, defaults to 0x01 (no change) + uint32_t attr_divider; // [opt] divider + int32_t attr_base; // [opt] base for conversion // Constructor with all defaults Z_attribute(): diff --git a/tasmota/tasmota_xdrv_driver/xdrv_23_zigbee_5_1_attributes.ino b/tasmota/tasmota_xdrv_driver/xdrv_23_zigbee_5_1_attributes.ino index 8e3fe493d..be274ab40 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_23_zigbee_5_1_attributes.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_23_zigbee_5_1_attributes.ino @@ -318,9 +318,9 @@ public: } uint8_t type; // zigbee type, Zunk by default - uint16_t multiplier; // multiply by x (ignore if 0 or 1) - uint16_t divider; // divide by x (ignore if 0 or 1) - int16_t base; // add x (ignore if 0) + uint32_t multiplier; // multiply by x (ignore if 0 or 1) + uint32_t divider; // divide by x (ignore if 0 or 1) + int32_t base; // add x (ignore if 0) uint16_t cluster; // cluster number uint16_t attribute; // attribute number uint16_t manuf; // manufacturer code, 0 if none @@ -338,7 +338,7 @@ public: {}; void set(uint16_t cluster, uint16_t attribute, uint16_t new_cluster, uint16_t new_attribute, - int8_t multiplier = 1, int8_t divider = 1, int16_t base = 0) { + uint32_t multiplier = 1, uint32_t divider = 1, int32_t base = 0) { this->cluster = cluster; this->attribute = attribute; this->new_cluster = new_cluster; @@ -354,9 +354,9 @@ public: uint16_t attribute; // attribute to match uint16_t new_cluster; // replace with this cluster uint16_t new_attribute; // replace with this attribute - uint16_t multiplier; // multiply by x (ignore if 0 or 1) - uint16_t divider; // divide by x (ignore if 0 or 1) - int16_t base; // add x (ignore if 0) + uint32_t multiplier; // multiply by x (ignore if 0 or 1) + uint32_t divider; // divide by x (ignore if 0 or 1) + int32_t base; // add x (ignore if 0) }; // @@ -530,9 +530,9 @@ public: uint16_t cluster = 0xFFFF; uint16_t attribute = 0xFFFF; const char * name = nullptr; - uint16_t multiplier = 1; - uint16_t divider = 1; - int16_t base = 0; + uint32_t multiplier = 1; + uint32_t divider = 1; + int32_t base = 0; uint8_t zigbee_type = Znodata; uint8_t map_offset = 0; Z_Data_Type map_type = Z_Data_Type::Z_Unknown; diff --git a/tasmota/tasmota_xdrv_driver/xdrv_23_zigbee_5_2_converters.ino b/tasmota/tasmota_xdrv_driver/xdrv_23_zigbee_5_2_converters.ino index 9d3cd4b71..6c682450c 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_23_zigbee_5_2_converters.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_23_zigbee_5_2_converters.ino @@ -1000,9 +1000,9 @@ void ZCLFrame::parseReadConfigAttributes(uint16_t shortaddr, Z_attribute_list& a } // find the multiplier - uint16_t multiplier = 1; - uint16_t divider = 1; - int16_t base = 0; + uint32_t multiplier = 1; + uint32_t divider = 1; + int32_t base = 0; Z_attribute_match matched_attr = Z_findAttributeMatcherById(shortaddr, cluster, attrid, false); if (matched_attr.found()) { attr_2.addAttribute(matched_attr.name, true).setBool(true); diff --git a/tasmota/tasmota_xdrv_driver/xdrv_23_zigbee_7_7_plugin.ino b/tasmota/tasmota_xdrv_driver/xdrv_23_zigbee_7_7_plugin.ino index 445d6106d..484e9875f 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_23_zigbee_7_7_plugin.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_23_zigbee_7_7_plugin.ino @@ -214,9 +214,9 @@ bool ZbLoad_inner(const char *filename, File &fp) { uint16_t attr_id = 0xFFFF; uint16_t cluster_id = 0xFFFF; uint8_t type_id = Zunk; - uint16_t multiplier = 1; - uint16_t divider = 1; - int16_t base = 0; + uint32_t multiplier = 1; + uint32_t divider = 1; + int32_t base = 0; char * name = nullptr; uint16_t manuf = 0; @@ -281,9 +281,9 @@ bool ZbLoad_inner(const char *filename, File &fp) { char * delimiter_slash2 = strchr(tok2, '/'); uint16_t new_cluster_id = strtoul(tok2, &delimiter_slash2, 16); uint16_t new_attr_id = strtoul(delimiter_slash2+1, nullptr, 16); - uint16_t multiplier = 1; - uint16_t divider = 1; - int16_t base = 0; + uint32_t multiplier = 1; + uint32_t divider = 1; + int32_t base = 0; // ADDITIONAL ELEMENTS? while (token = strtok_r(rest, ",", &rest)) { @@ -386,7 +386,7 @@ bool ZbUnload(const char *filename_raw) { } // append modifiers like mul/div/manuf -void Z_AppendModifiers(char * buf, size_t buf_len, uint16_t multiplier, uint16_t divider, int16_t base, uint16_t manuf) { +void Z_AppendModifiers(char * buf, size_t buf_len, uint32_t multiplier, uint32_t divider, int32_t base, uint16_t manuf) { if (multiplier != 0 && multiplier != 1) { ext_snprintf_P(buf, buf_len, "%s,%s%i", buf, Z_MUL, multiplier); } diff --git a/tasmota/tasmota_xdrv_driver/xdrv_23_zigbee_A_impl.ino b/tasmota/tasmota_xdrv_driver/xdrv_23_zigbee_A_impl.ino index 17b954b47..175f7bd6b 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_23_zigbee_A_impl.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_23_zigbee_A_impl.ino @@ -232,7 +232,7 @@ void zigbeeZCLSendCmd(class ZCLFrame &zcl) { // I.e. multipliers and dividers are inversed // multiplier == 0: ignore // multiplier == 1: ignore -void ZbApplyMultiplierForWrites(double &val_d, uint16_t multiplier, uint16_t divider, int16_t base) { +void ZbApplyMultiplierForWrites(double &val_d, uint32_t multiplier, uint32_t divider, int32_t base) { if (0 != base) { val_d = val_d - base; } diff --git a/tasmota/zigbee/air_quality.zb b/tasmota/zigbee/air_quality.zb new file mode 100644 index 000000000..1b31b6db3 --- /dev/null +++ b/tasmota/zigbee/air_quality.zb @@ -0,0 +1,7 @@ +#Z2Tv1 +# Extension for Air Quality - clusters from Concentration Measurement +: # apply to all devices +040D/0000,CO2,mul:1000000 # concentration in ppm +040D/0001,CO2Min,mul:1000000 +040D/0002,CO2Max,mul:1000000 +040D/0003,CO2Tolerance,mul:1000000 From 81d7785f66de9c0540f96c3ae2fbcbd8825db9cf Mon Sep 17 00:00:00 2001 From: s-hadinger <49731213+s-hadinger@users.noreply.github.com> Date: Mon, 15 May 2023 22:51:14 +0200 Subject: [PATCH 130/289] LED PWM ac_dimmer curve was wrongly applied instead of Gamma (#18666) --- CHANGELOG.md | 1 + tasmota/tasmota_xdrv_driver/xdrv_04_light.ino | 14 +++++++++++++- 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 96c7273c2..b68476ff9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -28,6 +28,7 @@ All notable changes to this project will be documented in this file. ### Fixed - Partition_Manager.tapp fixed - Berry fixed a rare condition when a GC causes a memory corruption +- LED PWM ac_dimmer curve was wrongly applied instead of Gamma ### Removed diff --git a/tasmota/tasmota_xdrv_driver/xdrv_04_light.ino b/tasmota/tasmota_xdrv_driver/xdrv_04_light.ino index c8d728b7d..b575e572f 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_04_light.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_04_light.ino @@ -2187,12 +2187,24 @@ void LightSetOutputs(const uint16_t *cur_col_10) { if (i != channel_ct) { // if CT don't use pwm_min and pwm_max cur_col = cur_col > 0 ? changeUIntScale(cur_col, 0, Settings->pwm_range, Light.pwm_min, Light.pwm_max) : 0; // shrink to the range of pwm_min..pwm_max } - if (!Settings->flag4.zerocross_dimmer) { + +#ifdef USE_AC_ZERO_CROSS_DIMMER + if (Settings->flag4.zerocross_dimmer) { #ifdef ESP32 TasmotaGlobal.pwm_value[i] = ac_zero_cross_power(cur_col); // mark the new expected value // AddLog(LOG_LEVEL_DEBUG_MORE, "analogWrite-%i 0x%03X", i, cur_col); #else // ESP32 analogWrite(Pin(GPIO_PWM1, i), bitRead(TasmotaGlobal.pwm_inverted, i) ? Settings->pwm_range - ac_zero_cross_power(cur_col) : ac_zero_cross_power(cur_col)); + // AddLog(LOG_LEVEL_DEBUG_MORE, "analogWrite-%i 0x%03X", bitRead(TasmotaGlobal.pwm_inverted, i) ? Settings->pwm_range - ac_zero_cross_power(cur_col) : ac_zero_cross_power(cur_col)); +#endif // ESP32 + } else +#endif // USE_AC_ZERO_CROSS_DIMMER + if (1) { // if true used to balance the optional if (Settings->flag4.zerocross_dimmer) +#ifdef ESP32 + TasmotaGlobal.pwm_value[i] = cur_col; // mark the new expected value + // AddLog(LOG_LEVEL_DEBUG_MORE, "analogWrite-%i 0x%03X", i, cur_col); +#else // ESP32 + analogWrite(Pin(GPIO_PWM1, i), bitRead(TasmotaGlobal.pwm_inverted, i) ? Settings->pwm_range - cur_col : cur_col); // AddLog(LOG_LEVEL_DEBUG_MORE, "analogWrite-%i 0x%03X", bitRead(TasmotaGlobal.pwm_inverted, i) ? Settings->pwm_range - cur_col : cur_col); #endif // ESP32 } From f8b26a90f6c09c2575e7311b9552c8821478e540 Mon Sep 17 00:00:00 2001 From: btsimonh Date: Tue, 16 May 2023 11:21:25 +0100 Subject: [PATCH 131/289] Add mutex to many camera functions. (#18655) * Add mutex to many camera functions. * Allow stream to continue after wcinit command (and other commands which reconfigure). * Adust retries on camera init, specifically log success if it retried. Shorten messages to save rom. I have seen fail of 0x103 and 0x20002 succeed on second try. --- .../xdrv_81_esp32_webcam.ino | 85 +++++++++++++++++-- 1 file changed, 76 insertions(+), 9 deletions(-) diff --git a/tasmota/tasmota_xdrv_driver/xdrv_81_esp32_webcam.ino b/tasmota/tasmota_xdrv_driver/xdrv_81_esp32_webcam.ino index d9708abf0..ede2ecdbf 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_81_esp32_webcam.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_81_esp32_webcam.ino @@ -96,9 +96,17 @@ * remarks for AI-THINKER * GPIO0 zero must be disconnected from any wire after programming because this pin drives the cam clock and does * not tolerate any capictive load + * the AITHINKER module does not have CAM_RESET - so if you get the camera into a bad state, power off restart is the only way out. * flash led = gpio 4 * red led = gpio 33 * optional rtsp url: rtsp://xxx.xxx.xxx.xxx:8554/mjpeg/1 + * + * SH 2023-05-14 - added mutex for many webcam functions - this is to prevent multi-threaded access to the camera functions, which + * can case error 0x105 upon re-init. + * Errors 0x103 and 0xffffffff could indicate CAM_PWDN incorrect. + * + * I2C use: if USE_I2C is enabled, you can set GPIO26 to I2c_SDA/2 and GPIO27 to I2C_SCL/2, and then use the shared I2C bus 2. + * Then you can use cmd i2cscan2 to check for camera presence. */ /*********************************************************************************************/ @@ -114,6 +122,12 @@ bool HttpCheckPriviledgedAccess(bool); extern ESP8266WebServer *Webserver; +SemaphoreHandle_t WebcamMutex = nullptr;; + +// use mutex like: +// TasAutoMutex localmutex(&WebcamMutex, "somename"); +// in any function. Will wait for mutex to be clear, and auto-release when the function exits. + #define BOUNDARY "e8b8c539-047d-4777-a985-fbba6edff11e" #ifndef MAX_PICSTORE @@ -165,6 +179,7 @@ struct { /*********************************************************************************************/ void WcInterrupt(uint32_t state) { + TasAutoMutex localmutex(&WebcamMutex, "WcInterrupt"); // Stop camera ISR if active to fix TG1WDT_SYS_RESET if (!Wc.up) { return; } @@ -189,6 +204,9 @@ bool WcPinUsed(void) { // } // } } + + AddLog(LOG_LEVEL_DEBUG, PSTR("CAM: i2c_enabled_2: %d"), TasmotaGlobal.i2c_enabled_2); + if (!PinUsed(GPIO_WEBCAM_XCLK) || !PinUsed(GPIO_WEBCAM_PCLK) || !PinUsed(GPIO_WEBCAM_VSYNC) || !PinUsed(GPIO_WEBCAM_HREF) || ((!PinUsed(GPIO_WEBCAM_SIOD) || !PinUsed(GPIO_WEBCAM_SIOC)) && !TasmotaGlobal.i2c_enabled_2) // preferred option is to reuse and share I2Cbus 2 @@ -199,6 +217,7 @@ bool WcPinUsed(void) { } void WcFeature(int32_t value) { + TasAutoMutex localmutex(&WebcamMutex, "WcFeature"); sensor_t * wc_s = esp_camera_sensor_get(); if (!wc_s) { return; } @@ -232,6 +251,7 @@ void WcFeature(int32_t value) { } void WcApplySettings() { + TasAutoMutex localmutex(&WebcamMutex, "WcApplySettings"); sensor_t * wc_s = esp_camera_sensor_get(); if (!wc_s) { return; } @@ -308,13 +328,20 @@ void WcSetDefaults(uint32_t upgrade) { } uint32_t WcSetup(int32_t fsiz) { + TasAutoMutex localmutex(&WebcamMutex, "WcSetup"); + + AddLog(LOG_LEVEL_DEBUG, PSTR("CAM: WcSetup")); if (fsiz >= FRAMESIZE_FHD) { fsiz = FRAMESIZE_FHD - 1; } + int stream_active = Wc.stream_active; Wc.stream_active = 0; if (fsiz < 0) { - esp_camera_deinit(); - Wc.up = 0; + if (Wc.up){ + esp_camera_deinit(); + AddLog(LOG_LEVEL_DEBUG, PSTR("CAM: Deinit fsiz %d"), fsiz); + Wc.up = 0; + } return 0; } @@ -329,6 +356,8 @@ uint32_t WcSetup(int32_t fsiz) { camera_config_t config; + memset(&config, 0, sizeof(config)); + if (WcPinUsed()) { config.pin_d0 = Pin(GPIO_WEBCAM_DATA); // Y2_GPIO_NUM; config.pin_d1 = Pin(GPIO_WEBCAM_DATA, 1); // Y3_GPIO_NUM; @@ -408,10 +437,24 @@ uint32_t WcSetup(int32_t fsiz) { AddLog(LOG_LEVEL_DEBUG, PSTR("CAM: PSRAM not found")); } - esp_err_t err = esp_camera_init(&config); + esp_err_t err; + // cannot hurt to retry... + for (int i = 0; i < 3; i++){ + err = esp_camera_init(&config); + + if (err != ESP_OK) { + AddLog(LOG_LEVEL_INFO, PSTR("CAM: InitErr 0x%x try %d"), err, (i+1)); + esp_camera_deinit(); + } else { + if (i){ + AddLog(LOG_LEVEL_INFO, PSTR("CAM: InitOK try %d"), (i+1)); + } + break; + } + } if (err != ESP_OK) { - AddLog(LOG_LEVEL_INFO, PSTR("CAM: Init failed with error 0x%x"), err); + AddLog(LOG_LEVEL_INFO, PSTR("CAM: InitErr 0x%x"), err); return 0; } @@ -440,6 +483,9 @@ uint32_t WcSetup(int32_t fsiz) { Wc.up = 1; if (psram) { Wc.up = 2; } + // restore stream_active if we setup ok. + Wc.stream_active = stream_active; + return Wc.up; } @@ -447,6 +493,8 @@ uint32_t WcSetup(int32_t fsiz) { int32_t WcSetOptions(uint32_t sel, int32_t value) { int32_t res = 0; + TasAutoMutex localmutex(&WebcamMutex, "WcSetOptions"); + sensor_t *s = esp_camera_sensor_get(); if (!s) { return -99; } @@ -556,6 +604,8 @@ int32_t WcSetOptions(uint32_t sel, int32_t value) { } uint32_t WcGetWidth(void) { + TasAutoMutex localmutex(&WebcamMutex, "WcGetWidth"); + camera_fb_t *wc_fb = esp_camera_fb_get(); if (!wc_fb) { return 0; } Wc.width = wc_fb->width; @@ -564,6 +614,7 @@ uint32_t WcGetWidth(void) { } uint32_t WcGetHeight(void) { + TasAutoMutex localmutex(&WebcamMutex, "WcGetWidth"); camera_fb_t *wc_fb = esp_camera_fb_get(); if (!wc_fb) { return 0; } Wc.height = wc_fb->height; @@ -595,6 +646,7 @@ uint32_t WcSetMotionDetect(int32_t value) { void WcDetectMotion(void) { camera_fb_t *wc_fb; uint8_t *out_buf = 0; + TasAutoMutex localmutex(&WebcamMutex, "WcDetectMotion"); if ((millis()-wc_motion.motion_ltime) > wc_motion.motion_detect) { wc_motion.motion_ltime = millis(); @@ -651,6 +703,7 @@ uint32_t WcGetFrame(int32_t bnum) { uint8_t * _jpg_buf = NULL; camera_fb_t *wc_fb = 0; bool jpeg_converted = false; + TasAutoMutex localmutex(&WebcamMutex, "WcGetFrame"); if (bnum < 0) { if (bnum < -MAX_PICSTORE) { bnum=-1; } @@ -753,6 +806,8 @@ void HandleImage(void) { response += "Content-type: image/jpeg\r\n\r\n"; Webserver->sendContent(response); + TasAutoMutex localmutex(&WebcamMutex, "HandleImage"); + if (!bnum) { size_t _jpg_buf_len = 0; uint8_t * _jpg_buf = NULL; @@ -804,6 +859,7 @@ void HandleImageBasic(void) { } } + TasAutoMutex localmutex(&WebcamMutex, "HandleImage"); camera_fb_t *wc_fb; wc_fb = esp_camera_fb_get(); // Acquire frame if (!wc_fb) { @@ -874,6 +930,9 @@ void HandleWebcamMjpegTask(void) { "\r\n"); Wc.stream_active = 2; } + + TasAutoMutex localmutex(&WebcamMutex, "HandleWebcamMjpegTask"); + if (2 == Wc.stream_active) { wc_fb = esp_camera_fb_get(); if (!wc_fb) { @@ -947,12 +1006,14 @@ void HandleWebcamRoot(void) { /*********************************************************************************************/ uint32_t WcSetStreamserver(uint32_t flag) { - if (TasmotaGlobal.global_state.network_down) { return 0; } - - Wc.stream_active = 0; + if (TasmotaGlobal.global_state.network_down) { + Wc.stream_active = 0; + return 0; + } if (flag) { if (!Wc.CamServer) { + Wc.stream_active = 0; Wc.CamServer = new ESP8266WebServer(81); Wc.CamServer->on("/", HandleWebcamRoot); Wc.CamServer->on("/cam.mjpeg", HandleWebcamMjpeg); @@ -963,6 +1024,7 @@ uint32_t WcSetStreamserver(uint32_t flag) { } } else { if (Wc.CamServer) { + Wc.stream_active = 0; Wc.CamServer->stop(); delete Wc.CamServer; Wc.CamServer = NULL; @@ -973,8 +1035,13 @@ uint32_t WcSetStreamserver(uint32_t flag) { } void WcInterruptControl() { + TasAutoMutex localmutex(&WebcamMutex, "WcInterruptControl"); + WcSetStreamserver(Settings->webcam_config.stream); - if(Wc.up == 0) {WcSetup(Settings->webcam_config.resolution);} + if(Wc.up == 0) { + WcSetup(Settings->webcam_config.resolution); + } + } /*********************************************************************************************/ @@ -1382,7 +1449,7 @@ void CmndWebcamClock(void){ } void CmndWebcamInit(void) { - Wc.up = 0; + WcSetup(Settings->webcam_config.resolution); WcInterruptControl(); ResponseCmndDone(); } From f40a63b5bec79eac64a628294375b272fed3df5b Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Tue, 16 May 2023 14:05:16 +0200 Subject: [PATCH 132/289] Update changelogs --- CHANGELOG.md | 7 ++++--- RELEASENOTES.md | 12 ++++++++---- 2 files changed, 12 insertions(+), 7 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b68476ff9..90c64bf08 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,12 +9,13 @@ All notable changes to this project will be documented in this file. - Matter POC for remote Relay - Support for Zero-Cross Dimmer on ESP32, changed calculation on EPS8266, high resolution control e.g. Solar: `ZCDimmerSet` - ESP32 Enhanced Shutterbuttons functionality to control tilt position, additionally incr/decr possible to position and tilt. -- ESP32 `Shuttersetup` for "Shelly 2.5 pro" automatic calibration and setup (experimental) +- ESP32 command ``Shuttersetup`` for "Shelly 2.5 pro" automatic calibration and setup (experimental) - Berry `tcpclientasync` class for non-blocking TCP client - Support for GM861 1D and 2D bar code reader (#18399) - Berry `re` (regex) add `match2` and optional offset - Support for PCA9557 8-bit I/O expander (#18632) -- Zigbee support for air sensors +- Zigbee support for air sensors (#18665) +- Command ``I2cScan0`` to scan both busses on ESP32 with one command ### Breaking Changed - Change command ``FileUpload`` index binary data detection from >199 to >299 @@ -28,7 +29,7 @@ All notable changes to this project will be documented in this file. ### Fixed - Partition_Manager.tapp fixed - Berry fixed a rare condition when a GC causes a memory corruption -- LED PWM ac_dimmer curve was wrongly applied instead of Gamma +- LED PWM ac_dimmer curve was wrongly applied instead of Gamma regression from v12.2.0.5 (#18666) ### Removed diff --git a/RELEASENOTES.md b/RELEASENOTES.md index 8cbe8a078..c40f34581 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -112,16 +112,19 @@ The latter links can be used for OTA upgrades too like ``OtaUrl https://ota.tasm ## Changelog v12.5.0.2 ### Added -- Command ``SetOption152 0/1`` to select two (0 = default) pin bistable or one (1) pin latching relay control [#18386](https://github.com/arendst/Tasmota/issues/18386) +- Command ``SetOption152 0/1`` to select two (0 = default) pin bistable or one (1) pin +latching relay control [#18386](https://github.com/arendst/Tasmota/issues/18386) +- Command ``I2cScan0`` to scan both busses on ESP32 with one command - Support for TC74 temperature sensor by Michael Loftis [#18042](https://github.com/arendst/Tasmota/issues/18042) - Support for GM861 1D and 2D bar code reader [#18399](https://github.com/arendst/Tasmota/issues/18399) - Support for PCA9557 8-bit I/O expander [#18632](https://github.com/arendst/Tasmota/issues/18632) +- Zigbee support for air sensors [#18665](https://github.com/arendst/Tasmota/issues/18665) +- ESP32 command ``Shuttersetup`` for "Shelly 2.5 pro" automatic calibration and setup (experimental) +- ESP32 Enhanced Shutterbuttons functionality to control tilt position, additionally incr/decr possible to position and tilt. - Matter sensors Humidity, Pressure, Illuminance [#18441](https://github.com/arendst/Tasmota/issues/18441) - Matter allow `Matter#Initialized` rule once the device is configured [#18451](https://github.com/arendst/Tasmota/issues/18451) - Matter UI to change endpoints configuration [#18498](https://github.com/arendst/Tasmota/issues/18498) - Matter support for Shutters with Tilt [#18509](https://github.com/arendst/Tasmota/issues/18509) -- ESP32 Enhanced Shutterbuttons functionality to control tilt position, additionally incr/decr possible to position and tilt. -- ESP32 `Shuttersetup` for "Shelly 2.5 pro" automatic calibration and setup (experimental) - Berry `tcpclientasync` class for non-blocking TCP client ### Breaking Changed @@ -136,6 +139,7 @@ The latter links can be used for OTA upgrades too like ``OtaUrl https://ota.tasm ### Fixed - ESP8266 Energy Export Active no update regression from v12.3.1.3 - NovaSDS GUI values [#18444](https://github.com/arendst/Tasmota/issues/18444) -- Berry fix rules for string comparisons [#18464](https://github.com/arendst/Tasmota/issues/18464) +- LED PWM ac_dimmer curve was wrongly applied instead of Gamma regression from v12.2.0.5 [#18666](https://github.com/arendst/Tasmota/issues/18666) +- Berry rules for string comparisons [#18464](https://github.com/arendst/Tasmota/issues/18464) - Berry a rare condition when a GC causes a memory corruption - Partition_Manager.tapp From 0385204ca781e0d041a0c2f6aa96012c2cad101b Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Tue, 16 May 2023 18:55:55 +0200 Subject: [PATCH 133/289] Add command ``WifiPower 0`` Add command ``WifiPower 0`` to enable dynamic wifi power based on RSSI by @TD-er (#15443) --- CHANGELOG.md | 16 ++- RELEASENOTES.md | 6 +- tasmota/include/tasmota_version.h | 2 +- tasmota/tasmota.ino | 1 + tasmota/tasmota_support/support_command.ino | 9 +- tasmota/tasmota_support/support_tasmota.ino | 4 + tasmota/tasmota_support/support_wifi.ino | 111 +++++++++++++++++++- 7 files changed, 136 insertions(+), 13 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 90c64bf08..389d150b4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,7 +3,19 @@ All notable changes to this project will be documented in this file. ## [Unreleased] - Development -## [12.5.0.2] +## [12.5.0.3] +### Added +- Command ``WifiPower 0`` to enable dynamic wifi power based on RSSI by @TD-er (#15443) + +### Breaking Changed + +### Changed + +### Fixed + +### Removed + +## [12.5.0.2] 20230516 ### Added - Matter support for Shutters with Tilt - Matter POC for remote Relay @@ -31,8 +43,6 @@ All notable changes to this project will be documented in this file. - Berry fixed a rare condition when a GC causes a memory corruption - LED PWM ac_dimmer curve was wrongly applied instead of Gamma regression from v12.2.0.5 (#18666) -### Removed - ## [12.5.0.1] 20230505 ### Added - Matter sensors Humidity, Pressure, Illuminance; optimize memory (#18441) diff --git a/RELEASENOTES.md b/RELEASENOTES.md index c40f34581..38bcae2e0 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -110,11 +110,11 @@ The latter links can be used for OTA upgrades too like ``OtaUrl https://ota.tasm [Complete list](BUILDS.md) of available feature and sensors. -## Changelog v12.5.0.2 +## Changelog v12.5.0.3 ### Added -- Command ``SetOption152 0/1`` to select two (0 = default) pin bistable or one (1) pin -latching relay control [#18386](https://github.com/arendst/Tasmota/issues/18386) +- Command ``SetOption152 0/1`` to select two (0 = default) pin bistable or one (1) pin latching relay control [#18386](https://github.com/arendst/Tasmota/issues/18386) - Command ``I2cScan0`` to scan both busses on ESP32 with one command +- Command ``WifiPower 0`` to enable dynamic wifi power based on RSSI by @TD-er [#15443](https://github.com/arendst/Tasmota/issues/15443) - Support for TC74 temperature sensor by Michael Loftis [#18042](https://github.com/arendst/Tasmota/issues/18042) - Support for GM861 1D and 2D bar code reader [#18399](https://github.com/arendst/Tasmota/issues/18399) - Support for PCA9557 8-bit I/O expander [#18632](https://github.com/arendst/Tasmota/issues/18632) diff --git a/tasmota/include/tasmota_version.h b/tasmota/include/tasmota_version.h index a98d9e299..fc65acab4 100644 --- a/tasmota/include/tasmota_version.h +++ b/tasmota/include/tasmota_version.h @@ -20,6 +20,6 @@ #ifndef _TASMOTA_VERSION_H_ #define _TASMOTA_VERSION_H_ -const uint32_t VERSION = 0x0C050002; // 12.5.0.2 +const uint32_t VERSION = 0x0C050003; // 12.5.0.3 #endif // _TASMOTA_VERSION_H_ diff --git a/tasmota/tasmota.ino b/tasmota/tasmota.ino index 8e98f8002..96ead1bdb 100644 --- a/tasmota/tasmota.ino +++ b/tasmota/tasmota.ino @@ -105,6 +105,7 @@ const uint32_t VERSION_MARKER[] PROGMEM = { 0x5AA55AA5, 0xFFFFFFFF, 0xA55AA55A }; struct WIFI { + int last_tx_pwr; uint32_t last_event = 0; // Last wifi connection event uint32_t downtime = 0; // Wifi down duration uint16_t link_count = 0; // Number of wifi re-connect diff --git a/tasmota/tasmota_support/support_command.ino b/tasmota/tasmota_support/support_command.ino index 3f31dddc8..13269587f 100644 --- a/tasmota/tasmota_support/support_command.ino +++ b/tasmota/tasmota_support/support_command.ino @@ -2523,8 +2523,7 @@ void CmndLedPwmMode(void) { } } -void CmndWifiPower(void) -{ +void CmndWifiPower(void) { if (XdrvMailbox.data_len > 0) { Settings->wifi_output_power = (uint8_t)(CharToFloat(XdrvMailbox.data) * 10); if (Settings->wifi_output_power > 205) { @@ -2532,7 +2531,11 @@ void CmndWifiPower(void) } WifiSetOutputPower(); } - ResponseCmndChar(WifiGetOutputPower().c_str()); + if (Settings->wifi_output_power) { + ResponseCmndChar(WifiGetOutputPower().c_str()); + } else { + ResponseCmndNumber(Wifi.last_tx_pwr / 10); + } } void CmndWifi(void) diff --git a/tasmota/tasmota_support/support_tasmota.ino b/tasmota/tasmota_support/support_tasmota.ino index 2abe41635..8fe5eb3b0 100644 --- a/tasmota/tasmota_support/support_tasmota.ino +++ b/tasmota/tasmota_support/support_tasmota.ino @@ -1241,6 +1241,10 @@ void Every100mSeconds(void) } } } + + if (0 == Settings->wifi_output_power) { + WiFiSetTXpowerBasedOnRssi(); + } } /*-------------------------------------------------------------------------------------------*\ diff --git a/tasmota/tasmota_support/support_wifi.ino b/tasmota/tasmota_support/support_wifi.ino index 084d55bb5..72cd5fbc5 100644 --- a/tasmota/tasmota_support/support_wifi.ino +++ b/tasmota/tasmota_support/support_wifi.ino @@ -966,9 +966,114 @@ String WifiGetOutputPower(void) return String(stemp1); } -void WifiSetOutputPower(void) -{ - WiFi.setOutputPower((float)(Settings->wifi_output_power) / 10); +void WifiSetOutputPower(void) { + if (Settings->wifi_output_power) { + WiFi.setOutputPower((float)(Settings->wifi_output_power) / 10); + } +} + +/* + Dynamic WiFi transmit power based on RSSI lowering overall DC power usage + + Original idea by ESPEasy (@TD-er) +*/ +#ifdef ESP32 + #if defined(CONFIG_IDF_TARGET_ESP32S2) + #define MAX_TX_PWR_DBM_11b 195 + #define MAX_TX_PWR_DBM_54g 150 + #define MAX_TX_PWR_DBM_n 130 + #define WIFI_SENSITIVITY_11b -880 + #define WIFI_SENSITIVITY_54g -750 + #define WIFI_SENSITIVITY_n -720 + #elif defined(CONFIG_IDF_TARGET_ESP32S3) + #define MAX_TX_PWR_DBM_11b 210 + #define MAX_TX_PWR_DBM_54g 190 + #define MAX_TX_PWR_DBM_n 185 + #define WIFI_SENSITIVITY_11b -880 + #define WIFI_SENSITIVITY_54g -760 + #define WIFI_SENSITIVITY_n -720 + #elif defined(CONFIG_IDF_TARGET_ESP32C3) + #define MAX_TX_PWR_DBM_11b 210 + #define MAX_TX_PWR_DBM_54g 190 + #define MAX_TX_PWR_DBM_n 185 + #define WIFI_SENSITIVITY_11b -880 + #define WIFI_SENSITIVITY_54g -760 + #define WIFI_SENSITIVITY_n -730 + #else + #define MAX_TX_PWR_DBM_11b 195 + #define MAX_TX_PWR_DBM_54g 160 + #define MAX_TX_PWR_DBM_n 140 + #define WIFI_SENSITIVITY_11b -880 + #define WIFI_SENSITIVITY_54g -750 + #define WIFI_SENSITIVITY_n -700 + #endif +#endif +#ifdef ESP8266 + #define MAX_TX_PWR_DBM_11b 200 + #define MAX_TX_PWR_DBM_54g 170 + #define MAX_TX_PWR_DBM_n 140 + #define WIFI_SENSITIVITY_11b -910 + #define WIFI_SENSITIVITY_54g -750 + #define WIFI_SENSITIVITY_n -720 +#endif + +void WiFiSetTXpowerBasedOnRssi(void) { + const WiFiMode_t cur_mode = WiFi.getMode(); + if (cur_mode == WIFI_OFF) { return; } + + // Range ESP32 : 2dBm - 20dBm + // Range ESP8266: 0dBm - 20.5dBm +// int maxTXpwr = Settings->wifi_output_power; + int maxTXpwr = 210; + int threshold = WIFI_SENSITIVITY_n; + int phy_mode = WiFi.getPhyMode(); + switch (phy_mode) { + case 1: // 11b (WIFI_PHY_MODE_11B) + threshold = WIFI_SENSITIVITY_11b; + if (maxTXpwr > MAX_TX_PWR_DBM_11b) maxTXpwr = MAX_TX_PWR_DBM_11b; + break; + case 2: // 11bg (WIFI_PHY_MODE_11G) + threshold = WIFI_SENSITIVITY_54g; + if (maxTXpwr > MAX_TX_PWR_DBM_54g) maxTXpwr = MAX_TX_PWR_DBM_54g; + break; + case 3: // 11bgn (WIFI_PHY_MODE_11N) + threshold = WIFI_SENSITIVITY_n; + if (maxTXpwr > MAX_TX_PWR_DBM_n) maxTXpwr = MAX_TX_PWR_DBM_n; + break; + } + threshold += 30; // Margin in dBm * 10 on top of threshold + int minTXpwr = 0; + + // Assume AP sends with max set by ETSI standard. + // 2.4 GHz: 100 mWatt (20 dBm) + // US and some other countries allow 1000 mW (30 dBm) + int rssi = WiFi.RSSI() * 10; + int newrssi = rssi - 200; // We cannot send with over 20 dBm, thus it makes no sense to force higher TX power all the time. + + if (newrssi < threshold) { + minTXpwr = threshold - newrssi; + } + if (minTXpwr > maxTXpwr) { + minTXpwr = maxTXpwr; + } + int dBm = 0; + if (dBm > maxTXpwr) { + dBm = maxTXpwr; + } else if (dBm < minTXpwr) { + dBm = minTXpwr; + } + WiFi.setOutputPower((float)dBm / 10); + + delay(Wifi.last_tx_pwr < dBm); // If increase the TX power, give power supply of the unit some rest + Wifi.last_tx_pwr = dBm; + +/* + int TX_pwr_int = Wifi.last_tx_pwr * 4; + int maxTXpwr_int = maxTXpwr * 4; + if (TX_pwr_int != maxTXpwr_int) { + AddLog(LOG_LEVEL_DEBUG, PSTR("WIF: TX power %d, Sensitivity %d, RSSI %d"), dBm / 10, threshold/ 10, rssi / 10); + } +*/ } /* From adff41f962f7157fe0678f1a5ab9683d0e7535aa Mon Sep 17 00:00:00 2001 From: stefanbode Date: Tue, 16 May 2023 22:34:07 +0200 Subject: [PATCH 134/289] bugfix (#18673) --- tasmota/tasmota_xdrv_driver/xdrv_12_discovery.ino | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tasmota/tasmota_xdrv_driver/xdrv_12_discovery.ino b/tasmota/tasmota_xdrv_driver/xdrv_12_discovery.ino index 3df0f4ff3..91f0bfe9d 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_12_discovery.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_12_discovery.ino @@ -199,7 +199,7 @@ void TasDiscoverMessage(void) { light_controller_isCTRGBLinked, light_subtype); - for (uint32_t i = 0; i < tmax(TasmotaGlobal.shutters_present, MAX_SHUTTERS); i++) { + for (uint32_t i = 0; i < tmin(TasmotaGlobal.shutters_present, MAX_SHUTTERS); i++) { #ifdef USE_SHUTTER ResponseAppend_P(PSTR("%s%d"), (i > 0 ? "," : ""), Settings->shutter_options[i]); #else From 4d131fd543f29f9a8c4f260ac54199a6e38bb896 Mon Sep 17 00:00:00 2001 From: stefanbode Date: Wed, 17 May 2023 08:54:22 +0200 Subject: [PATCH 135/289] zero-cross dimmer cleanup (#18674) removed zero cross dimmer initialize --- tasmota/tasmota_xdrv_driver/xdrv_04_light.ino | 22 ++++--------------- 1 file changed, 4 insertions(+), 18 deletions(-) diff --git a/tasmota/tasmota_xdrv_driver/xdrv_04_light.ino b/tasmota/tasmota_xdrv_driver/xdrv_04_light.ino index b575e572f..21717af62 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_04_light.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_04_light.ino @@ -2187,27 +2187,13 @@ void LightSetOutputs(const uint16_t *cur_col_10) { if (i != channel_ct) { // if CT don't use pwm_min and pwm_max cur_col = cur_col > 0 ? changeUIntScale(cur_col, 0, Settings->pwm_range, Light.pwm_min, Light.pwm_max) : 0; // shrink to the range of pwm_min..pwm_max } - -#ifdef USE_AC_ZERO_CROSS_DIMMER - if (Settings->flag4.zerocross_dimmer) { #ifdef ESP32 - TasmotaGlobal.pwm_value[i] = ac_zero_cross_power(cur_col); // mark the new expected value - // AddLog(LOG_LEVEL_DEBUG_MORE, "analogWrite-%i 0x%03X", i, cur_col); + TasmotaGlobal.pwm_value[i] = cur_col; // mark the new expected value + // AddLog(LOG_LEVEL_DEBUG_MORE, "analogWrite-%i 0x%03X", i, cur_col); #else // ESP32 - analogWrite(Pin(GPIO_PWM1, i), bitRead(TasmotaGlobal.pwm_inverted, i) ? Settings->pwm_range - ac_zero_cross_power(cur_col) : ac_zero_cross_power(cur_col)); - // AddLog(LOG_LEVEL_DEBUG_MORE, "analogWrite-%i 0x%03X", bitRead(TasmotaGlobal.pwm_inverted, i) ? Settings->pwm_range - ac_zero_cross_power(cur_col) : ac_zero_cross_power(cur_col)); + analogWrite(Pin(GPIO_PWM1, i), bitRead(TasmotaGlobal.pwm_inverted, i) ? Settings->pwm_range - cur_col : cur_col); + // AddLog(LOG_LEVEL_DEBUG_MORE, "analogWrite-%i 0x%03X", bitRead(TasmotaGlobal.pwm_inverted, i) ? Settings->pwm_range - cur_col : cur_col); #endif // ESP32 - } else -#endif // USE_AC_ZERO_CROSS_DIMMER - if (1) { // if true used to balance the optional if (Settings->flag4.zerocross_dimmer) -#ifdef ESP32 - TasmotaGlobal.pwm_value[i] = cur_col; // mark the new expected value - // AddLog(LOG_LEVEL_DEBUG_MORE, "analogWrite-%i 0x%03X", i, cur_col); -#else // ESP32 - analogWrite(Pin(GPIO_PWM1, i), bitRead(TasmotaGlobal.pwm_inverted, i) ? Settings->pwm_range - cur_col : cur_col); - // AddLog(LOG_LEVEL_DEBUG_MORE, "analogWrite-%i 0x%03X", bitRead(TasmotaGlobal.pwm_inverted, i) ? Settings->pwm_range - cur_col : cur_col); -#endif // ESP32 - } } } #ifdef ESP32 From 4e5c62ce339ec249d7829a97025a3abe8174d957 Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Wed, 17 May 2023 09:53:42 +0200 Subject: [PATCH 136/289] Update changelogs --- CHANGELOG.md | 3 +++ RELEASENOTES.md | 3 +++ 2 files changed, 6 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 389d150b4..2f1c2a616 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,8 @@ All notable changes to this project will be documented in this file. ### Changed ### Fixed +- Shutter bootloop using more than 4 shutters (#18673) +- AIThinker webcam issues (#18652) ### Removed @@ -26,6 +28,7 @@ All notable changes to this project will be documented in this file. - Support for GM861 1D and 2D bar code reader (#18399) - Berry `re` (regex) add `match2` and optional offset - Support for PCA9557 8-bit I/O expander (#18632) +- Matter support for async HTTP for bridged devices (#18656) - Zigbee support for air sensors (#18665) - Command ``I2cScan0`` to scan both busses on ESP32 with one command diff --git a/RELEASENOTES.md b/RELEASENOTES.md index 38bcae2e0..f8ff40185 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -125,6 +125,7 @@ The latter links can be used for OTA upgrades too like ``OtaUrl https://ota.tasm - Matter allow `Matter#Initialized` rule once the device is configured [#18451](https://github.com/arendst/Tasmota/issues/18451) - Matter UI to change endpoints configuration [#18498](https://github.com/arendst/Tasmota/issues/18498) - Matter support for Shutters with Tilt [#18509](https://github.com/arendst/Tasmota/issues/18509) +- Matter support for remote relays [#18656](https://github.com/arendst/Tasmota/issues/18656) - Berry `tcpclientasync` class for non-blocking TCP client ### Breaking Changed @@ -142,4 +143,6 @@ The latter links can be used for OTA upgrades too like ``OtaUrl https://ota.tasm - LED PWM ac_dimmer curve was wrongly applied instead of Gamma regression from v12.2.0.5 [#18666](https://github.com/arendst/Tasmota/issues/18666) - Berry rules for string comparisons [#18464](https://github.com/arendst/Tasmota/issues/18464) - Berry a rare condition when a GC causes a memory corruption +- AIThinker webcam issues [#18652](https://github.com/arendst/Tasmota/issues/18652) +- Shutter bootloop using more than 4 shutters [#18673](https://github.com/arendst/Tasmota/issues/18673) - Partition_Manager.tapp From 57f85ae4783c0ba64d8833e86650a908b4badda9 Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Wed, 17 May 2023 10:45:00 +0200 Subject: [PATCH 137/289] Optimize dynamic WiFi power --- CHANGELOG.md | 1 + RELEASENOTES.md | 1 + tasmota/include/tasmota.h | 40 +++++++++ tasmota/tasmota_support/settings.ino | 2 +- tasmota/tasmota_support/support_command.ino | 14 ++-- tasmota/tasmota_support/support_wifi.ino | 89 +++++---------------- 6 files changed, 70 insertions(+), 77 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2f1c2a616..99847f538 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,7 @@ All notable changes to this project will be documented in this file. ## [12.5.0.3] ### Added - Command ``WifiPower 0`` to enable dynamic wifi power based on RSSI by @TD-er (#15443) +- Command ``WifiPower 1`` to restore default wifi power ### Breaking Changed diff --git a/RELEASENOTES.md b/RELEASENOTES.md index f8ff40185..aacd1980e 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -115,6 +115,7 @@ The latter links can be used for OTA upgrades too like ``OtaUrl https://ota.tasm - Command ``SetOption152 0/1`` to select two (0 = default) pin bistable or one (1) pin latching relay control [#18386](https://github.com/arendst/Tasmota/issues/18386) - Command ``I2cScan0`` to scan both busses on ESP32 with one command - Command ``WifiPower 0`` to enable dynamic wifi power based on RSSI by @TD-er [#15443](https://github.com/arendst/Tasmota/issues/15443) +- Command ``WifiPower 1`` to restore default wifi power - Support for TC74 temperature sensor by Michael Loftis [#18042](https://github.com/arendst/Tasmota/issues/18042) - Support for GM861 1D and 2D bar code reader [#18399](https://github.com/arendst/Tasmota/issues/18399) - Support for PCA9557 8-bit I/O expander [#18632](https://github.com/arendst/Tasmota/issues/18632) diff --git a/tasmota/include/tasmota.h b/tasmota/include/tasmota.h index 615a5bd7d..e49193ec4 100644 --- a/tasmota/include/tasmota.h +++ b/tasmota/include/tasmota.h @@ -300,6 +300,46 @@ const uint32_t LOOP_SLEEP_DELAY = 50; // Lowest number of milliseconds to #define XPT2046_MINY 346 #define XPT2046_MAXY 3870 +#ifdef ESP32 + #if defined(CONFIG_IDF_TARGET_ESP32S2) + #define MAX_TX_PWR_DBM_11b 195 + #define MAX_TX_PWR_DBM_54g 150 + #define MAX_TX_PWR_DBM_n 130 + #define WIFI_SENSITIVITY_11b -880 + #define WIFI_SENSITIVITY_54g -750 + #define WIFI_SENSITIVITY_n -720 + #elif defined(CONFIG_IDF_TARGET_ESP32S3) + #define MAX_TX_PWR_DBM_11b 210 + #define MAX_TX_PWR_DBM_54g 190 + #define MAX_TX_PWR_DBM_n 185 + #define WIFI_SENSITIVITY_11b -880 + #define WIFI_SENSITIVITY_54g -760 + #define WIFI_SENSITIVITY_n -720 + #elif defined(CONFIG_IDF_TARGET_ESP32C3) + #define MAX_TX_PWR_DBM_11b 210 + #define MAX_TX_PWR_DBM_54g 190 + #define MAX_TX_PWR_DBM_n 185 + #define WIFI_SENSITIVITY_11b -880 + #define WIFI_SENSITIVITY_54g -760 + #define WIFI_SENSITIVITY_n -730 + #else + #define MAX_TX_PWR_DBM_11b 195 + #define MAX_TX_PWR_DBM_54g 160 + #define MAX_TX_PWR_DBM_n 140 + #define WIFI_SENSITIVITY_11b -880 + #define WIFI_SENSITIVITY_54g -750 + #define WIFI_SENSITIVITY_n -700 + #endif +#endif +#ifdef ESP8266 + #define MAX_TX_PWR_DBM_11b 200 + #define MAX_TX_PWR_DBM_54g 170 + #define MAX_TX_PWR_DBM_n 140 + #define WIFI_SENSITIVITY_11b -910 + #define WIFI_SENSITIVITY_54g -750 + #define WIFI_SENSITIVITY_n -720 +#endif + /*********************************************************************************************\ * Enumeration \*********************************************************************************************/ diff --git a/tasmota/tasmota_support/settings.ino b/tasmota/tasmota_support/settings.ino index f53abb684..7962813d5 100644 --- a/tasmota/tasmota_support/settings.ino +++ b/tasmota/tasmota_support/settings.ino @@ -929,7 +929,7 @@ void SettingsDefaultSet2(void) { flag4.network_wifi |= 1; flag3.use_wifi_scan |= WIFI_SCAN_AT_RESTART; flag3.use_wifi_rescan |= WIFI_SCAN_REGULARLY; - Settings->wifi_output_power = 170; + Settings->wifi_output_power = MAX_TX_PWR_DBM_54g; Settings->dns_timeout = DNS_TIMEOUT; Settings->param[P_ARP_GRATUITOUS] = WIFI_ARP_INTERVAL; ParseIPv4(&Settings->ipv4_address[0], PSTR(WIFI_IP_ADDRESS)); diff --git a/tasmota/tasmota_support/support_command.ino b/tasmota/tasmota_support/support_command.ino index 13269587f..14ce3d846 100644 --- a/tasmota/tasmota_support/support_command.ino +++ b/tasmota/tasmota_support/support_command.ino @@ -2526,16 +2526,16 @@ void CmndLedPwmMode(void) { void CmndWifiPower(void) { if (XdrvMailbox.data_len > 0) { Settings->wifi_output_power = (uint8_t)(CharToFloat(XdrvMailbox.data) * 10); - if (Settings->wifi_output_power > 205) { - Settings->wifi_output_power = 205; + if (10 == Settings->wifi_output_power) { + // WifiPower 1 + Settings->wifi_output_power = MAX_TX_PWR_DBM_54g; + } + else if (Settings->wifi_output_power > MAX_TX_PWR_DBM_11b) { + Settings->wifi_output_power = MAX_TX_PWR_DBM_11b; } WifiSetOutputPower(); } - if (Settings->wifi_output_power) { - ResponseCmndChar(WifiGetOutputPower().c_str()); - } else { - ResponseCmndNumber(Wifi.last_tx_pwr / 10); - } + ResponseCmndChar(WifiGetOutputPower().c_str()); } void CmndWifi(void) diff --git a/tasmota/tasmota_support/support_wifi.ino b/tasmota/tasmota_support/support_wifi.ino index 72cd5fbc5..a28a3d0e7 100644 --- a/tasmota/tasmota_support/support_wifi.ino +++ b/tasmota/tasmota_support/support_wifi.ino @@ -959,10 +959,13 @@ int WifiState(void) return state; } -String WifiGetOutputPower(void) -{ +String WifiGetOutputPower(void) { char stemp1[TOPSZ]; - dtostrfd((float)(Settings->wifi_output_power) / 10, 1, stemp1); + if (Settings->wifi_output_power) { + dtostrfd((float)(Settings->wifi_output_power) / 10, 1, stemp1); + } else { + dtostrfd((float)(Wifi.last_tx_pwr) / 10, 0, stemp1); // No decimal to indicate dynamic tx power + } return String(stemp1); } @@ -973,76 +976,33 @@ void WifiSetOutputPower(void) { } /* - Dynamic WiFi transmit power based on RSSI lowering overall DC power usage - + Dynamic WiFi transmit power based on RSSI lowering overall DC power usage. Original idea by ESPEasy (@TD-er) */ -#ifdef ESP32 - #if defined(CONFIG_IDF_TARGET_ESP32S2) - #define MAX_TX_PWR_DBM_11b 195 - #define MAX_TX_PWR_DBM_54g 150 - #define MAX_TX_PWR_DBM_n 130 - #define WIFI_SENSITIVITY_11b -880 - #define WIFI_SENSITIVITY_54g -750 - #define WIFI_SENSITIVITY_n -720 - #elif defined(CONFIG_IDF_TARGET_ESP32S3) - #define MAX_TX_PWR_DBM_11b 210 - #define MAX_TX_PWR_DBM_54g 190 - #define MAX_TX_PWR_DBM_n 185 - #define WIFI_SENSITIVITY_11b -880 - #define WIFI_SENSITIVITY_54g -760 - #define WIFI_SENSITIVITY_n -720 - #elif defined(CONFIG_IDF_TARGET_ESP32C3) - #define MAX_TX_PWR_DBM_11b 210 - #define MAX_TX_PWR_DBM_54g 190 - #define MAX_TX_PWR_DBM_n 185 - #define WIFI_SENSITIVITY_11b -880 - #define WIFI_SENSITIVITY_54g -760 - #define WIFI_SENSITIVITY_n -730 - #else - #define MAX_TX_PWR_DBM_11b 195 - #define MAX_TX_PWR_DBM_54g 160 - #define MAX_TX_PWR_DBM_n 140 - #define WIFI_SENSITIVITY_11b -880 - #define WIFI_SENSITIVITY_54g -750 - #define WIFI_SENSITIVITY_n -700 - #endif -#endif -#ifdef ESP8266 - #define MAX_TX_PWR_DBM_11b 200 - #define MAX_TX_PWR_DBM_54g 170 - #define MAX_TX_PWR_DBM_n 140 - #define WIFI_SENSITIVITY_11b -910 - #define WIFI_SENSITIVITY_54g -750 - #define WIFI_SENSITIVITY_n -720 -#endif - void WiFiSetTXpowerBasedOnRssi(void) { const WiFiMode_t cur_mode = WiFi.getMode(); if (cur_mode == WIFI_OFF) { return; } // Range ESP32 : 2dBm - 20dBm // Range ESP8266: 0dBm - 20.5dBm -// int maxTXpwr = Settings->wifi_output_power; - int maxTXpwr = 210; + int max_tx_pwr = MAX_TX_PWR_DBM_11b; int threshold = WIFI_SENSITIVITY_n; int phy_mode = WiFi.getPhyMode(); switch (phy_mode) { case 1: // 11b (WIFI_PHY_MODE_11B) threshold = WIFI_SENSITIVITY_11b; - if (maxTXpwr > MAX_TX_PWR_DBM_11b) maxTXpwr = MAX_TX_PWR_DBM_11b; + if (max_tx_pwr > MAX_TX_PWR_DBM_11b) max_tx_pwr = MAX_TX_PWR_DBM_11b; break; case 2: // 11bg (WIFI_PHY_MODE_11G) threshold = WIFI_SENSITIVITY_54g; - if (maxTXpwr > MAX_TX_PWR_DBM_54g) maxTXpwr = MAX_TX_PWR_DBM_54g; + if (max_tx_pwr > MAX_TX_PWR_DBM_54g) max_tx_pwr = MAX_TX_PWR_DBM_54g; break; case 3: // 11bgn (WIFI_PHY_MODE_11N) threshold = WIFI_SENSITIVITY_n; - if (maxTXpwr > MAX_TX_PWR_DBM_n) maxTXpwr = MAX_TX_PWR_DBM_n; + if (max_tx_pwr > MAX_TX_PWR_DBM_n) max_tx_pwr = MAX_TX_PWR_DBM_n; break; } threshold += 30; // Margin in dBm * 10 on top of threshold - int minTXpwr = 0; // Assume AP sends with max set by ETSI standard. // 2.4 GHz: 100 mWatt (20 dBm) @@ -1050,30 +1010,21 @@ void WiFiSetTXpowerBasedOnRssi(void) { int rssi = WiFi.RSSI() * 10; int newrssi = rssi - 200; // We cannot send with over 20 dBm, thus it makes no sense to force higher TX power all the time. + int min_tx_pwr = 0; if (newrssi < threshold) { - minTXpwr = threshold - newrssi; + min_tx_pwr = threshold - newrssi; } - if (minTXpwr > maxTXpwr) { - minTXpwr = maxTXpwr; + if (min_tx_pwr > max_tx_pwr) { + min_tx_pwr = max_tx_pwr; } - int dBm = 0; - if (dBm > maxTXpwr) { - dBm = maxTXpwr; - } else if (dBm < minTXpwr) { - dBm = minTXpwr; - } - WiFi.setOutputPower((float)dBm / 10); - - delay(Wifi.last_tx_pwr < dBm); // If increase the TX power, give power supply of the unit some rest - Wifi.last_tx_pwr = dBm; - + WiFi.setOutputPower((float)min_tx_pwr / 10); + delay(Wifi.last_tx_pwr < min_tx_pwr); // If increase the TX power, give power supply of the unit some rest /* - int TX_pwr_int = Wifi.last_tx_pwr * 4; - int maxTXpwr_int = maxTXpwr * 4; - if (TX_pwr_int != maxTXpwr_int) { - AddLog(LOG_LEVEL_DEBUG, PSTR("WIF: TX power %d, Sensitivity %d, RSSI %d"), dBm / 10, threshold/ 10, rssi / 10); + if (Wifi.last_tx_pwr != min_tx_pwr) { + AddLog(LOG_LEVEL_DEBUG, PSTR("WIF: TX power %d, Sensitivity %d, RSSI %d"), min_tx_pwr / 10, threshold/ 10, rssi / 10); } */ + Wifi.last_tx_pwr = min_tx_pwr; } /* From 4a7e4f9a175479ab8bd86a4a45e5cf1f850b29c4 Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Wed, 17 May 2023 11:44:14 +0200 Subject: [PATCH 138/289] Refactor dynamic wifi tx power --- tasmota/tasmota_support/support_tasmota.ino | 8 +++----- tasmota/tasmota_support/support_wifi.ino | 15 ++++++++------- 2 files changed, 11 insertions(+), 12 deletions(-) diff --git a/tasmota/tasmota_support/support_tasmota.ino b/tasmota/tasmota_support/support_tasmota.ino index 8fe5eb3b0..0c37a5eb0 100644 --- a/tasmota/tasmota_support/support_tasmota.ino +++ b/tasmota/tasmota_support/support_tasmota.ino @@ -1242,9 +1242,7 @@ void Every100mSeconds(void) } } - if (0 == Settings->wifi_output_power) { - WiFiSetTXpowerBasedOnRssi(); - } + WiFiSetTXpowerBasedOnRssi(); } /*-------------------------------------------------------------------------------------------*\ @@ -2227,7 +2225,7 @@ void GpioInit(void) TasmotaGlobal.i2c_enabled = I2cBegin(Pin(GPIO_I2C_SDA), Pin(GPIO_I2C_SCL)); #ifdef ESP32 if (TasmotaGlobal.i2c_enabled) { - AddLog(LOG_LEVEL_DEBUG, PSTR("I2C: Pins bus1 SCL %d, SDA %d"), Pin(GPIO_I2C_SCL), Pin(GPIO_I2C_SDA)); + AddLog(LOG_LEVEL_INFO, PSTR("I2C: Bus1 using GPIO%02d(SCL) and GPIO%02d(SDA)"), Pin(GPIO_I2C_SCL), Pin(GPIO_I2C_SDA)); } #endif } @@ -2236,7 +2234,7 @@ void GpioInit(void) if (TasmotaGlobal.i2c_enabled_2) { TasmotaGlobal.i2c_enabled_2 = I2c2Begin(Pin(GPIO_I2C_SDA, 1), Pin(GPIO_I2C_SCL, 1)); if (TasmotaGlobal.i2c_enabled_2) { - AddLog(LOG_LEVEL_DEBUG, PSTR("I2C: Pins bus2 SCL %d, SDA %d"), Pin(GPIO_I2C_SCL, 1), Pin(GPIO_I2C_SDA, 1)); + AddLog(LOG_LEVEL_INFO, PSTR("I2C: Bus2 using GPIO%02d(SCL) and GPIO%02d(SDA)"), Pin(GPIO_I2C_SCL, 1), Pin(GPIO_I2C_SDA, 1)); } } #endif diff --git a/tasmota/tasmota_support/support_wifi.ino b/tasmota/tasmota_support/support_wifi.ino index a28a3d0e7..0901ceed1 100644 --- a/tasmota/tasmota_support/support_wifi.ino +++ b/tasmota/tasmota_support/support_wifi.ino @@ -198,7 +198,6 @@ void WiFiSetSleepMode(void) WiFi.setSleepMode(WIFI_MODEM_SLEEP); // Sleep (Esp8288/Arduino core and sdk default) } } - WifiSetOutputPower(); } void WifiBegin(uint8_t flag, uint8_t channel) { @@ -224,6 +223,7 @@ void WifiBegin(uint8_t flag, uint8_t channel) { #endif WiFiSetSleepMode(); + WifiSetOutputPower(); // if (WiFi.getPhyMode() != WIFI_PHY_MODE_11N) { WiFi.setPhyMode(WIFI_PHY_MODE_11N); } // B/G/N // if (WiFi.getPhyMode() != WIFI_PHY_MODE_11G) { WiFi.setPhyMode(WIFI_PHY_MODE_11G); } // B/G #ifdef ESP32 @@ -972,14 +972,15 @@ String WifiGetOutputPower(void) { void WifiSetOutputPower(void) { if (Settings->wifi_output_power) { WiFi.setOutputPower((float)(Settings->wifi_output_power) / 10); + } else { + AddLog(LOG_LEVEL_DEBUG, PSTR("WIF: Dynamic Tx power enabled")); // WifiPower 0 } } -/* - Dynamic WiFi transmit power based on RSSI lowering overall DC power usage. - Original idea by ESPEasy (@TD-er) -*/ void WiFiSetTXpowerBasedOnRssi(void) { + // Dynamic WiFi transmit power based on RSSI lowering overall DC power usage. + // Original idea by ESPEasy (@TD-er) + if (!Settings->flag4.network_wifi || Settings->wifi_output_power) { return; } const WiFiMode_t cur_mode = WiFi.getMode(); if (cur_mode == WIFI_OFF) { return; } @@ -1021,7 +1022,7 @@ void WiFiSetTXpowerBasedOnRssi(void) { delay(Wifi.last_tx_pwr < min_tx_pwr); // If increase the TX power, give power supply of the unit some rest /* if (Wifi.last_tx_pwr != min_tx_pwr) { - AddLog(LOG_LEVEL_DEBUG, PSTR("WIF: TX power %d, Sensitivity %d, RSSI %d"), min_tx_pwr / 10, threshold/ 10, rssi / 10); + AddLog(LOG_LEVEL_DEBUG, PSTR("WIF: TX power %d, Sensitivity %d, RSSI %d"), min_tx_pwr / 10, threshold / 10, rssi / 10); } */ Wifi.last_tx_pwr = min_tx_pwr; @@ -1077,7 +1078,7 @@ void WifiConnect(void) } #endif // ESP32 WifiSetState(0); - WifiSetOutputPower(); +// WifiSetOutputPower(); //#ifdef ESP8266 // https://github.com/arendst/Tasmota/issues/16061#issuecomment-1216970170 From d48c826d420b7e63aed38fb4459f7d45d560cd56 Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Wed, 17 May 2023 13:24:58 +0200 Subject: [PATCH 139/289] Core 2.0.9 from 2023.05.17 (#18680) Updated IDF components: LittleFS v1.5.4 CAM v2.0.4 DSP latest commit --- platformio_tasmota32.ini | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platformio_tasmota32.ini b/platformio_tasmota32.ini index bb7b37244..db80956c6 100644 --- a/platformio_tasmota32.ini +++ b/platformio_tasmota32.ini @@ -42,7 +42,7 @@ extra_scripts = pre:pio-tools/add_c_flags.py ${esp_defaults.extra_scripts} [core32] -platform = https://github.com/tasmota/platform-espressif32/releases/download/2023.05.00/platform-espressif32.zip +platform = https://github.com/tasmota/platform-espressif32/releases/download/2023.05.01/platform-espressif32.zip platform_packages = build_unflags = ${esp32_defaults.build_unflags} build_flags = ${esp32_defaults.build_flags} From 2b76e8e668981f3f35b8df8daefc6d33a1773adb Mon Sep 17 00:00:00 2001 From: s-hadinger <49731213+s-hadinger@users.noreply.github.com> Date: Wed, 17 May 2023 21:40:05 +0200 Subject: [PATCH 140/289] HASPmota `meta` attribute and improved `berry_run` (#18685) --- CHANGELOG.md | 1 + .../berry_tasmota/src/be_lv_haspmota.c | 5679 +++++++++-------- .../haspmota_src/haspmota_core/haspmota.be | 33 +- 3 files changed, 2913 insertions(+), 2800 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 99847f538..d16d119e4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,7 @@ All notable changes to this project will be documented in this file. ### Added - Command ``WifiPower 0`` to enable dynamic wifi power based on RSSI by @TD-er (#15443) - Command ``WifiPower 1`` to restore default wifi power +- HASPmota `meta` attribute and improved `berry_run` ### Breaking Changed diff --git a/lib/libesp32/berry_tasmota/src/be_lv_haspmota.c b/lib/libesp32/berry_tasmota/src/be_lv_haspmota.c index e2063c5d0..a95232310 100644 --- a/lib/libesp32/berry_tasmota/src/be_lv_haspmota.c +++ b/lib/libesp32/berry_tasmota/src/be_lv_haspmota.c @@ -467,312 +467,6 @@ void be_load_lvh_page_class(bvm *vm) { extern const bclass be_class_lvh_obj; -/******************************************************************** -** Solidified function: set_radius2 -********************************************************************/ -be_local_closure(lvh_obj_set_radius2, /* name */ - be_nested_proto( - 7, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 5]) { /* constants */ - /* K0 */ be_nested_str_weak(_lv_part2_selector), - /* K1 */ be_nested_str_weak(_lv_obj), - /* K2 */ be_nested_str_weak(set_style_radius), - /* K3 */ be_nested_str_weak(lv), - /* K4 */ be_nested_str_weak(STATE_DEFAULT), - }), - be_str_weak(set_radius2), - &be_const_str_solidified, - ( &(const binstruction[15]) { /* code */ - 0x88080100, // 0000 GETMBR R2 R0 K0 - 0x4C0C0000, // 0001 LDNIL R3 - 0x20080403, // 0002 NE R2 R2 R3 - 0x780A0009, // 0003 JMPF R2 #000E - 0x88080101, // 0004 GETMBR R2 R0 K1 - 0x8C080502, // 0005 GETMET R2 R2 K2 - 0x60100009, // 0006 GETGBL R4 G9 - 0x5C140200, // 0007 MOVE R5 R1 - 0x7C100200, // 0008 CALL R4 1 - 0x88140100, // 0009 GETMBR R5 R0 K0 - 0xB81A0600, // 000A GETNGBL R6 K3 - 0x88180D04, // 000B GETMBR R6 R6 K4 - 0x30140A06, // 000C OR R5 R5 R6 - 0x7C080600, // 000D CALL R2 3 - 0x80000000, // 000E RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: register_event_cb -********************************************************************/ -be_local_closure(lvh_obj_register_event_cb, /* name */ - be_nested_proto( - 8, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 6]) { /* constants */ - /* K0 */ be_nested_str_weak(_page), - /* K1 */ be_nested_str_weak(_oh), - /* K2 */ be_nested_str_weak(_event_map), - /* K3 */ be_nested_str_weak(keys), - /* K4 */ be_nested_str_weak(register_event), - /* K5 */ be_nested_str_weak(stop_iteration), - }), - be_str_weak(register_event_cb), - &be_const_str_solidified, - ( &(const binstruction[19]) { /* code */ - 0x88040100, // 0000 GETMBR R1 R0 K0 - 0x88040301, // 0001 GETMBR R1 R1 K1 - 0x60080010, // 0002 GETGBL R2 G16 - 0x880C0102, // 0003 GETMBR R3 R0 K2 - 0x8C0C0703, // 0004 GETMET R3 R3 K3 - 0x7C0C0200, // 0005 CALL R3 1 - 0x7C080200, // 0006 CALL R2 1 - 0xA8020006, // 0007 EXBLK 0 #000F - 0x5C0C0400, // 0008 MOVE R3 R2 - 0x7C0C0000, // 0009 CALL R3 0 - 0x8C100304, // 000A GETMET R4 R1 K4 - 0x5C180000, // 000B MOVE R6 R0 - 0x5C1C0600, // 000C MOVE R7 R3 - 0x7C100600, // 000D CALL R4 3 - 0x7001FFF8, // 000E JMP #0008 - 0x58080005, // 000F LDCONST R2 K5 - 0xAC080200, // 0010 CATCH R2 1 0 - 0xB0080000, // 0011 RAISE 2 R0 R0 - 0x80000000, // 0012 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: get_value_ofs_x -********************************************************************/ -be_local_closure(lvh_obj_get_value_ofs_x, /* name */ - be_nested_proto( - 3, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 2]) { /* constants */ - /* K0 */ be_nested_str_weak(_lv_label), - /* K1 */ be_nested_str_weak(get_x), - }), - be_str_weak(get_value_ofs_x), - &be_const_str_solidified, - ( &(const binstruction[ 4]) { /* code */ - 0x88040100, // 0000 GETMBR R1 R0 K0 - 0x8C040301, // 0001 GETMET R1 R1 K1 - 0x7C040200, // 0002 CALL R1 1 - 0x80040200, // 0003 RET 1 R1 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: set_value_ofs_x -********************************************************************/ -be_local_closure(lvh_obj_set_value_ofs_x, /* name */ - be_nested_proto( - 6, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 3]) { /* constants */ - /* K0 */ be_nested_str_weak(check_label), - /* K1 */ be_nested_str_weak(_lv_label), - /* K2 */ be_nested_str_weak(set_x), - }), - be_str_weak(set_value_ofs_x), - &be_const_str_solidified, - ( &(const binstruction[ 9]) { /* code */ - 0x8C080100, // 0000 GETMET R2 R0 K0 - 0x7C080200, // 0001 CALL R2 1 - 0x88080101, // 0002 GETMBR R2 R0 K1 - 0x8C080502, // 0003 GETMET R2 R2 K2 - 0x60100009, // 0004 GETGBL R4 G9 - 0x5C140200, // 0005 MOVE R5 R1 - 0x7C100200, // 0006 CALL R4 1 - 0x7C080400, // 0007 CALL R2 2 - 0x80000000, // 0008 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: get_radius2 -********************************************************************/ -be_local_closure(lvh_obj_get_radius2, /* name */ - be_nested_proto( - 5, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 5]) { /* constants */ - /* K0 */ be_nested_str_weak(_lv_part2_selector), - /* K1 */ be_nested_str_weak(_lv_obj), - /* K2 */ be_nested_str_weak(get_style_radius), - /* K3 */ be_nested_str_weak(lv), - /* K4 */ be_nested_str_weak(STATE_DEFAULT), - }), - be_str_weak(get_radius2), - &be_const_str_solidified, - ( &(const binstruction[13]) { /* code */ - 0x88040100, // 0000 GETMBR R1 R0 K0 - 0x4C080000, // 0001 LDNIL R2 - 0x20040202, // 0002 NE R1 R1 R2 - 0x78060007, // 0003 JMPF R1 #000C - 0x88040101, // 0004 GETMBR R1 R0 K1 - 0x8C040302, // 0005 GETMET R1 R1 K2 - 0x880C0100, // 0006 GETMBR R3 R0 K0 - 0xB8120600, // 0007 GETNGBL R4 K3 - 0x88100904, // 0008 GETMBR R4 R4 K4 - 0x300C0604, // 0009 OR R3 R3 R4 - 0x7C040400, // 000A CALL R1 2 - 0x80040200, // 000B RET 1 R1 - 0x80000000, // 000C RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: get_text_rule -********************************************************************/ -be_local_closure(lvh_obj_get_text_rule, /* name */ - be_nested_proto( - 2, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 1]) { /* constants */ - /* K0 */ be_nested_str_weak(_text_rule), - }), - be_str_weak(get_text_rule), - &be_const_str_solidified, - ( &(const binstruction[ 2]) { /* code */ - 0x88040100, // 0000 GETMBR R1 R0 K0 - 0x80040200, // 0001 RET 1 R1 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: get_pad_right -********************************************************************/ -be_local_closure(lvh_obj_get_pad_right, /* name */ - be_nested_proto( - 5, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 5]) { /* constants */ - /* K0 */ be_nested_str_weak(_lv_part2_selector), - /* K1 */ be_nested_str_weak(_lv_obj), - /* K2 */ be_nested_str_weak(get_style_pad_right), - /* K3 */ be_nested_str_weak(lv), - /* K4 */ be_nested_str_weak(STATE_DEFAULT), - }), - be_str_weak(get_pad_right), - &be_const_str_solidified, - ( &(const binstruction[13]) { /* code */ - 0x88040100, // 0000 GETMBR R1 R0 K0 - 0x4C080000, // 0001 LDNIL R2 - 0x20040202, // 0002 NE R1 R1 R2 - 0x78060007, // 0003 JMPF R1 #000C - 0x88040101, // 0004 GETMBR R1 R0 K1 - 0x8C040302, // 0005 GETMET R1 R1 K2 - 0x880C0100, // 0006 GETMBR R3 R0 K0 - 0xB8120600, // 0007 GETNGBL R4 K3 - 0x88100904, // 0008 GETMBR R4 R4 K4 - 0x300C0604, // 0009 OR R3 R3 R4 - 0x7C040400, // 000A CALL R1 2 - 0x80040200, // 000B RET 1 R1 - 0x80000000, // 000C RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: set_value_ofs_y -********************************************************************/ -be_local_closure(lvh_obj_set_value_ofs_y, /* name */ - be_nested_proto( - 6, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 3]) { /* constants */ - /* K0 */ be_nested_str_weak(check_label), - /* K1 */ be_nested_str_weak(_lv_label), - /* K2 */ be_nested_str_weak(set_y), - }), - be_str_weak(set_value_ofs_y), - &be_const_str_solidified, - ( &(const binstruction[ 9]) { /* code */ - 0x8C080100, // 0000 GETMET R2 R0 K0 - 0x7C080200, // 0001 CALL R2 1 - 0x88080101, // 0002 GETMBR R2 R0 K1 - 0x8C080502, // 0003 GETMET R2 R2 K2 - 0x60100009, // 0004 GETGBL R4 G9 - 0x5C140200, // 0005 MOVE R5 R1 - 0x7C100200, // 0006 CALL R4 1 - 0x7C080400, // 0007 CALL R2 2 - 0x80000000, // 0008 RET 0 - }) - ) -); -/*******************************************************************/ - - /******************************************************************** ** Solidified function: parse_color ********************************************************************/ @@ -934,570 +628,6 @@ be_local_closure(lvh_obj_parse_color, /* name */ /*******************************************************************/ -/******************************************************************** -** Solidified function: get_text_font -********************************************************************/ -be_local_closure(lvh_obj_get_text_font, /* name */ - be_nested_proto( - 1, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 0, /* has constants */ - NULL, /* no const */ - be_str_weak(get_text_font), - &be_const_str_solidified, - ( &(const binstruction[ 1]) { /* code */ - 0x80000000, // 0000 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: text_rule_matched -********************************************************************/ -be_local_closure(lvh_obj_text_rule_matched, /* name */ - be_nested_proto( - 12, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 8]) { /* constants */ - /* K0 */ be_nested_str_weak(int), - /* K1 */ be_nested_str_weak(_text_rule_function), - /* K2 */ be_nested_str_weak(string), - /* K3 */ be_nested_str_weak(format), - /* K4 */ be_nested_str_weak(HSP_X3A_X20failed_X20to_X20run_X20self_X2E_text_rule_function_X20_X2D_X20_X25s_X20_X28_X25s_X29), - /* K5 */ be_nested_str_weak(_text_rule_format), - /* K6 */ be_nested_str_weak(), - /* K7 */ be_nested_str_weak(text), - }), - be_str_weak(text_rule_matched), - &be_const_str_solidified, - ( &(const binstruction[49]) { /* code */ - 0x60080004, // 0000 GETGBL R2 G4 - 0x5C0C0200, // 0001 MOVE R3 R1 - 0x7C080200, // 0002 CALL R2 1 - 0x1C080500, // 0003 EQ R2 R2 K0 - 0x780A0003, // 0004 JMPF R2 #0009 - 0x6008000A, // 0005 GETGBL R2 G10 - 0x5C0C0200, // 0006 MOVE R3 R1 - 0x7C080200, // 0007 CALL R2 1 - 0x5C040400, // 0008 MOVE R1 R2 - 0x88080101, // 0009 GETMBR R2 R0 K1 - 0x4C0C0000, // 000A LDNIL R3 - 0x200C0403, // 000B NE R3 R2 R3 - 0x780E0012, // 000C JMPF R3 #0020 - 0xA8020005, // 000D EXBLK 0 #0014 - 0x5C0C0400, // 000E MOVE R3 R2 - 0x5C100200, // 000F MOVE R4 R1 - 0x7C0C0200, // 0010 CALL R3 1 - 0x5C040600, // 0011 MOVE R1 R3 - 0xA8040001, // 0012 EXBLK 1 1 - 0x7002000B, // 0013 JMP #0020 - 0xAC0C0002, // 0014 CATCH R3 0 2 - 0x70020008, // 0015 JMP #001F - 0xA4160400, // 0016 IMPORT R5 K2 - 0x60180001, // 0017 GETGBL R6 G1 - 0x8C1C0B03, // 0018 GETMET R7 R5 K3 - 0x58240004, // 0019 LDCONST R9 K4 - 0x5C280600, // 001A MOVE R10 R3 - 0x5C2C0800, // 001B MOVE R11 R4 - 0x7C1C0800, // 001C CALL R7 4 - 0x7C180200, // 001D CALL R6 1 - 0x70020000, // 001E JMP #0020 - 0xB0080000, // 001F RAISE 2 R0 R0 - 0x880C0105, // 0020 GETMBR R3 R0 K5 - 0x60100004, // 0021 GETGBL R4 G4 - 0x5C140600, // 0022 MOVE R5 R3 - 0x7C100200, // 0023 CALL R4 1 - 0x1C100902, // 0024 EQ R4 R4 K2 - 0x78120006, // 0025 JMPF R4 #002D - 0xA4120400, // 0026 IMPORT R4 K2 - 0x8C140903, // 0027 GETMET R5 R4 K3 - 0x5C1C0600, // 0028 MOVE R7 R3 - 0x5C200200, // 0029 MOVE R8 R1 - 0x7C140600, // 002A CALL R5 3 - 0x5C0C0A00, // 002B MOVE R3 R5 - 0x70020000, // 002C JMP #002E - 0x580C0006, // 002D LDCONST R3 K6 - 0x90020E03, // 002E SETMBR R0 K7 R3 - 0x50100000, // 002F LDBOOL R4 0 0 - 0x80040800, // 0030 RET 1 R4 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: set_pad_bottom2 -********************************************************************/ -be_local_closure(lvh_obj_set_pad_bottom2, /* name */ - be_nested_proto( - 7, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 5]) { /* constants */ - /* K0 */ be_nested_str_weak(_lv_part2_selector), - /* K1 */ be_nested_str_weak(_lv_obj), - /* K2 */ be_nested_str_weak(set_style_pad_bottom), - /* K3 */ be_nested_str_weak(lv), - /* K4 */ be_nested_str_weak(STATE_DEFAULT), - }), - be_str_weak(set_pad_bottom2), - &be_const_str_solidified, - ( &(const binstruction[15]) { /* code */ - 0x88080100, // 0000 GETMBR R2 R0 K0 - 0x4C0C0000, // 0001 LDNIL R3 - 0x20080403, // 0002 NE R2 R2 R3 - 0x780A0009, // 0003 JMPF R2 #000E - 0x88080101, // 0004 GETMBR R2 R0 K1 - 0x8C080502, // 0005 GETMET R2 R2 K2 - 0x60100009, // 0006 GETGBL R4 G9 - 0x5C140200, // 0007 MOVE R5 R1 - 0x7C100200, // 0008 CALL R4 1 - 0x88140100, // 0009 GETMBR R5 R0 K0 - 0xB81A0600, // 000A GETNGBL R6 K3 - 0x88180D04, // 000B GETMBR R6 R6 K4 - 0x30140A06, // 000C OR R5 R5 R6 - 0x7C080600, // 000D CALL R2 3 - 0x80000000, // 000E RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: set_align -********************************************************************/ -be_local_closure(lvh_obj_set_align, /* name */ - be_nested_proto( - 7, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[13]) { /* constants */ - /* K0 */ be_nested_str_weak(check_label), - /* K1 */ be_const_int(0), - /* K2 */ be_nested_str_weak(left), - /* K3 */ be_nested_str_weak(lv), - /* K4 */ be_nested_str_weak(TEXT_ALIGN_LEFT), - /* K5 */ be_const_int(1), - /* K6 */ be_nested_str_weak(center), - /* K7 */ be_nested_str_weak(TEXT_ALIGN_CENTER), - /* K8 */ be_const_int(2), - /* K9 */ be_nested_str_weak(right), - /* K10 */ be_nested_str_weak(TEXT_ALIGN_RIGHT), - /* K11 */ be_nested_str_weak(_lv_label), - /* K12 */ be_nested_str_weak(set_style_text_align), - }), - be_str_weak(set_align), - &be_const_str_solidified, - ( &(const binstruction[29]) { /* code */ - 0x4C080000, // 0000 LDNIL R2 - 0x8C0C0100, // 0001 GETMET R3 R0 K0 - 0x7C0C0200, // 0002 CALL R3 1 - 0x1C0C0301, // 0003 EQ R3 R1 K1 - 0x740E0001, // 0004 JMPT R3 #0007 - 0x1C0C0302, // 0005 EQ R3 R1 K2 - 0x780E0002, // 0006 JMPF R3 #000A - 0xB80E0600, // 0007 GETNGBL R3 K3 - 0x88080704, // 0008 GETMBR R2 R3 K4 - 0x7002000C, // 0009 JMP #0017 - 0x1C0C0305, // 000A EQ R3 R1 K5 - 0x740E0001, // 000B JMPT R3 #000E - 0x1C0C0306, // 000C EQ R3 R1 K6 - 0x780E0002, // 000D JMPF R3 #0011 - 0xB80E0600, // 000E GETNGBL R3 K3 - 0x88080707, // 000F GETMBR R2 R3 K7 - 0x70020005, // 0010 JMP #0017 - 0x1C0C0308, // 0011 EQ R3 R1 K8 - 0x740E0001, // 0012 JMPT R3 #0015 - 0x1C0C0309, // 0013 EQ R3 R1 K9 - 0x780E0001, // 0014 JMPF R3 #0017 - 0xB80E0600, // 0015 GETNGBL R3 K3 - 0x8808070A, // 0016 GETMBR R2 R3 K10 - 0x880C010B, // 0017 GETMBR R3 R0 K11 - 0x8C0C070C, // 0018 GETMET R3 R3 K12 - 0x5C140400, // 0019 MOVE R5 R2 - 0x58180001, // 001A LDCONST R6 K1 - 0x7C0C0600, // 001B CALL R3 3 - 0x80000000, // 001C RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: set_text_rule_format -********************************************************************/ -be_local_closure(lvh_obj_set_text_rule_format, /* name */ - be_nested_proto( - 4, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 1]) { /* constants */ - /* K0 */ be_nested_str_weak(_text_rule_format), - }), - be_str_weak(set_text_rule_format), - &be_const_str_solidified, - ( &(const binstruction[ 5]) { /* code */ - 0x60080008, // 0000 GETGBL R2 G8 - 0x5C0C0200, // 0001 MOVE R3 R1 - 0x7C080200, // 0002 CALL R2 1 - 0x90020002, // 0003 SETMBR R0 K0 R2 - 0x80000000, // 0004 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: set_val -********************************************************************/ -be_local_closure(lvh_obj_set_val, /* name */ - be_nested_proto( - 5, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 2]) { /* constants */ - /* K0 */ be_nested_str_weak(_lv_obj), - /* K1 */ be_nested_str_weak(set_value), - }), - be_str_weak(set_val), - &be_const_str_solidified, - ( &(const binstruction[ 5]) { /* code */ - 0x88080100, // 0000 GETMBR R2 R0 K0 - 0x8C080501, // 0001 GETMET R2 R2 K1 - 0x5C100200, // 0002 MOVE R4 R1 - 0x7C080400, // 0003 CALL R2 2 - 0x80000000, // 0004 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: get_text_rule_format -********************************************************************/ -be_local_closure(lvh_obj_get_text_rule_format, /* name */ - be_nested_proto( - 2, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 1]) { /* constants */ - /* K0 */ be_nested_str_weak(_text_rule_format), - }), - be_str_weak(get_text_rule_format), - &be_const_str_solidified, - ( &(const binstruction[ 2]) { /* code */ - 0x88040100, // 0000 GETMBR R1 R0 K0 - 0x80040200, // 0001 RET 1 R1 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: set_action -********************************************************************/ -be_local_closure(lvh_obj_set_action, /* name */ - be_nested_proto( - 4, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 1]) { /* constants */ - /* K0 */ be_nested_str_weak(_action), - }), - be_str_weak(set_action), - &be_const_str_solidified, - ( &(const binstruction[ 5]) { /* code */ - 0x60080008, // 0000 GETGBL R2 G8 - 0x5C0C0200, // 0001 MOVE R3 R1 - 0x7C080200, // 0002 CALL R2 1 - 0x90020002, // 0003 SETMBR R0 K0 R2 - 0x80000000, // 0004 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: set_text_rule_formula -********************************************************************/ -be_local_closure(lvh_obj_set_text_rule_formula, /* name */ - be_nested_proto( - 13, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 7]) { /* constants */ - /* K0 */ be_nested_str_weak(_text_rule_formula), - /* K1 */ be_nested_str_weak(return_X20_X2F_X20val_X20_X2D_X3E_X20_X28), - /* K2 */ be_nested_str_weak(_X29), - /* K3 */ be_nested_str_weak(_text_rule_function), - /* K4 */ be_nested_str_weak(string), - /* K5 */ be_nested_str_weak(format), - /* K6 */ be_nested_str_weak(HSP_X3A_X20failed_X20to_X20compile_X20_X27_X25s_X27_X20_X2D_X20_X25s_X20_X28_X25s_X29), - }), - be_str_weak(set_text_rule_formula), - &be_const_str_solidified, - ( &(const binstruction[30]) { /* code */ - 0x60080008, // 0000 GETGBL R2 G8 - 0x5C0C0200, // 0001 MOVE R3 R1 - 0x7C080200, // 0002 CALL R2 1 - 0x90020002, // 0003 SETMBR R0 K0 R2 - 0x88080100, // 0004 GETMBR R2 R0 K0 - 0x000A0202, // 0005 ADD R2 K1 R2 - 0x00080502, // 0006 ADD R2 R2 K2 - 0xA8020007, // 0007 EXBLK 0 #0010 - 0x600C000D, // 0008 GETGBL R3 G13 - 0x5C100400, // 0009 MOVE R4 R2 - 0x7C0C0200, // 000A CALL R3 1 - 0x5C100600, // 000B MOVE R4 R3 - 0x7C100000, // 000C CALL R4 0 - 0x90020604, // 000D SETMBR R0 K3 R4 - 0xA8040001, // 000E EXBLK 1 1 - 0x7002000C, // 000F JMP #001D - 0xAC0C0002, // 0010 CATCH R3 0 2 - 0x70020009, // 0011 JMP #001C - 0xA4160800, // 0012 IMPORT R5 K4 - 0x60180001, // 0013 GETGBL R6 G1 - 0x8C1C0B05, // 0014 GETMET R7 R5 K5 - 0x58240006, // 0015 LDCONST R9 K6 - 0x5C280400, // 0016 MOVE R10 R2 - 0x5C2C0600, // 0017 MOVE R11 R3 - 0x5C300800, // 0018 MOVE R12 R4 - 0x7C1C0A00, // 0019 CALL R7 5 - 0x7C180200, // 001A CALL R6 1 - 0x70020000, // 001B JMP #001D - 0xB0080000, // 001C RAISE 2 R0 R0 - 0x80000000, // 001D RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: val_rule_matched -********************************************************************/ -be_local_closure(lvh_obj_val_rule_matched, /* name */ - be_nested_proto( - 13, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 5]) { /* constants */ - /* K0 */ be_nested_str_weak(_val_rule_function), - /* K1 */ be_nested_str_weak(string), - /* K2 */ be_nested_str_weak(format), - /* K3 */ be_nested_str_weak(HSP_X3A_X20failed_X20to_X20run_X20self_X2E_val_rule_function_X20_X2D_X20_X25s_X20_X28_X25s_X29), - /* K4 */ be_nested_str_weak(val), - }), - be_str_weak(val_rule_matched), - &be_const_str_solidified, - ( &(const binstruction[37]) { /* code */ - 0x6008000A, // 0000 GETGBL R2 G10 - 0x5C0C0200, // 0001 MOVE R3 R1 - 0x7C080200, // 0002 CALL R2 1 - 0x4C0C0000, // 0003 LDNIL R3 - 0x1C0C0403, // 0004 EQ R3 R2 R3 - 0x780E0001, // 0005 JMPF R3 #0008 - 0x500C0000, // 0006 LDBOOL R3 0 0 - 0x80040600, // 0007 RET 1 R3 - 0x880C0100, // 0008 GETMBR R3 R0 K0 - 0x4C100000, // 0009 LDNIL R4 - 0x20100604, // 000A NE R4 R3 R4 - 0x78120012, // 000B JMPF R4 #001F - 0xA8020005, // 000C EXBLK 0 #0013 - 0x5C100600, // 000D MOVE R4 R3 - 0x5C140400, // 000E MOVE R5 R2 - 0x7C100200, // 000F CALL R4 1 - 0x5C080800, // 0010 MOVE R2 R4 - 0xA8040001, // 0011 EXBLK 1 1 - 0x7002000B, // 0012 JMP #001F - 0xAC100002, // 0013 CATCH R4 0 2 - 0x70020008, // 0014 JMP #001E - 0xA41A0200, // 0015 IMPORT R6 K1 - 0x601C0001, // 0016 GETGBL R7 G1 - 0x8C200D02, // 0017 GETMET R8 R6 K2 - 0x58280003, // 0018 LDCONST R10 K3 - 0x5C2C0800, // 0019 MOVE R11 R4 - 0x5C300A00, // 001A MOVE R12 R5 - 0x7C200800, // 001B CALL R8 4 - 0x7C1C0200, // 001C CALL R7 1 - 0x70020000, // 001D JMP #001F - 0xB0080000, // 001E RAISE 2 R0 R0 - 0x60100009, // 001F GETGBL R4 G9 - 0x5C140400, // 0020 MOVE R5 R2 - 0x7C100200, // 0021 CALL R4 1 - 0x90020804, // 0022 SETMBR R0 K4 R4 - 0x50100000, // 0023 LDBOOL R4 0 0 - 0x80040800, // 0024 RET 1 R4 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: remove_trailing_zeroes -********************************************************************/ -be_local_closure(lvh_obj_remove_trailing_zeroes, /* name */ - be_nested_proto( - 8, /* nstack */ - 1, /* argc */ - 4, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 4]) { /* constants */ - /* K0 */ be_const_class(be_class_lvh_obj), - /* K1 */ be_const_int(0), - /* K2 */ be_const_int(1), - /* K3 */ be_nested_str_weak(resize), - }), - be_str_weak(remove_trailing_zeroes), - &be_const_str_solidified, - ( &(const binstruction[24]) { /* code */ - 0x58040000, // 0000 LDCONST R1 K0 - 0x6008000C, // 0001 GETGBL R2 G12 - 0x5C0C0000, // 0002 MOVE R3 R0 - 0x7C080200, // 0003 CALL R2 1 - 0x580C0001, // 0004 LDCONST R3 K1 - 0x14100602, // 0005 LT R4 R3 R2 - 0x78120007, // 0006 JMPF R4 #000F - 0x5411FFFE, // 0007 LDINT R4 -1 - 0x04100803, // 0008 SUB R4 R4 R3 - 0x94100004, // 0009 GETIDX R4 R0 R4 - 0x20100901, // 000A NE R4 R4 K1 - 0x78120000, // 000B JMPF R4 #000D - 0x70020001, // 000C JMP #000F - 0x000C0702, // 000D ADD R3 R3 K2 - 0x7001FFF5, // 000E JMP #0005 - 0x24100701, // 000F GT R4 R3 K1 - 0x78120005, // 0010 JMPF R4 #0017 - 0x8C100103, // 0011 GETMET R4 R0 K3 - 0x6018000C, // 0012 GETGBL R6 G12 - 0x5C1C0000, // 0013 MOVE R7 R0 - 0x7C180200, // 0014 CALL R6 1 - 0x04180C03, // 0015 SUB R6 R6 R3 - 0x7C100400, // 0016 CALL R4 2 - 0x80040000, // 0017 RET 1 R0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: post_init -********************************************************************/ -be_local_closure(lvh_obj_post_init, /* name */ - be_nested_proto( - 3, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 1]) { /* constants */ - /* K0 */ be_nested_str_weak(register_event_cb), - }), - be_str_weak(post_init), - &be_const_str_solidified, - ( &(const binstruction[ 3]) { /* code */ - 0x8C040100, // 0000 GETMET R1 R0 K0 - 0x7C040200, // 0001 CALL R1 1 - 0x80000000, // 0002 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: get_mode -********************************************************************/ -be_local_closure(lvh_obj_get_mode, /* name */ - be_nested_proto( - 1, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 0, /* has constants */ - NULL, /* no const */ - be_str_weak(get_mode), - &be_const_str_solidified, - ( &(const binstruction[ 1]) { /* code */ - 0x80000000, // 0000 RET 0 - }) - ) -); -/*******************************************************************/ - - /******************************************************************** ** Solidified function: set_pad_top2 ********************************************************************/ @@ -1543,12 +673,12 @@ be_local_closure(lvh_obj_set_pad_top2, /* name */ /******************************************************************** -** Solidified function: set_value_font +** Solidified function: get_text_rule ********************************************************************/ -be_local_closure(lvh_obj_set_value_font, /* name */ +be_local_closure(lvh_obj_get_text_rule, /* name */ be_nested_proto( - 5, /* nstack */ - 2, /* argc */ + 2, /* nstack */ + 1, /* argc */ 2, /* varg */ 0, /* has upvals */ NULL, /* no upvals */ @@ -1556,15 +686,13 @@ be_local_closure(lvh_obj_set_value_font, /* name */ NULL, /* no sub protos */ 1, /* has constants */ ( &(const bvalue[ 1]) { /* constants */ - /* K0 */ be_nested_str_weak(set_text_font), + /* K0 */ be_nested_str_weak(_text_rule), }), - be_str_weak(set_value_font), + be_str_weak(get_text_rule), &be_const_str_solidified, - ( &(const binstruction[ 4]) { /* code */ - 0x8C080100, // 0000 GETMET R2 R0 K0 - 0x5C100200, // 0001 MOVE R4 R1 - 0x7C080400, // 0002 CALL R2 2 - 0x80000000, // 0003 RET 0 + ( &(const binstruction[ 2]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x80040200, // 0001 RET 1 R1 }) ) ); @@ -1572,11 +700,38 @@ be_local_closure(lvh_obj_set_value_font, /* name */ /******************************************************************** -** Solidified function: set_enabled +** Solidified function: get_obj ********************************************************************/ -be_local_closure(lvh_obj_set_enabled, /* name */ +be_local_closure(lvh_obj_get_obj, /* name */ be_nested_proto( - 5, /* nstack */ + 2, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 1]) { /* constants */ + /* K0 */ be_nested_str_weak(_lv_obj), + }), + be_str_weak(get_obj), + &be_const_str_solidified, + ( &(const binstruction[ 2]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x80040200, // 0001 RET 1 R1 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: set_pad_left2 +********************************************************************/ +be_local_closure(lvh_obj_set_pad_left2, /* name */ + be_nested_proto( + 7, /* nstack */ 2, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -1585,28 +740,30 @@ be_local_closure(lvh_obj_set_enabled, /* name */ NULL, /* no sub protos */ 1, /* has constants */ ( &(const bvalue[ 5]) { /* constants */ - /* K0 */ be_nested_str_weak(_lv_obj), - /* K1 */ be_nested_str_weak(add_flag), - /* K2 */ be_nested_str_weak(lv), - /* K3 */ be_nested_str_weak(OBJ_FLAG_CLICKABLE), - /* K4 */ be_nested_str_weak(clear_flag), + /* K0 */ be_nested_str_weak(_lv_part2_selector), + /* K1 */ be_nested_str_weak(_lv_obj), + /* K2 */ be_nested_str_weak(set_style_pad_left), + /* K3 */ be_nested_str_weak(lv), + /* K4 */ be_nested_str_weak(STATE_DEFAULT), }), - be_str_weak(set_enabled), + be_str_weak(set_pad_left2), &be_const_str_solidified, - ( &(const binstruction[13]) { /* code */ - 0x78060005, // 0000 JMPF R1 #0007 - 0x88080100, // 0001 GETMBR R2 R0 K0 - 0x8C080501, // 0002 GETMET R2 R2 K1 - 0xB8120400, // 0003 GETNGBL R4 K2 - 0x88100903, // 0004 GETMBR R4 R4 K3 - 0x7C080400, // 0005 CALL R2 2 - 0x70020004, // 0006 JMP #000C - 0x88080100, // 0007 GETMBR R2 R0 K0 - 0x8C080504, // 0008 GETMET R2 R2 K4 - 0xB8120400, // 0009 GETNGBL R4 K2 - 0x88100903, // 000A GETMBR R4 R4 K3 - 0x7C080400, // 000B CALL R2 2 - 0x80000000, // 000C RET 0 + ( &(const binstruction[15]) { /* code */ + 0x88080100, // 0000 GETMBR R2 R0 K0 + 0x4C0C0000, // 0001 LDNIL R3 + 0x20080403, // 0002 NE R2 R2 R3 + 0x780A0009, // 0003 JMPF R2 #000E + 0x88080101, // 0004 GETMBR R2 R0 K1 + 0x8C080502, // 0005 GETMET R2 R2 K2 + 0x60100009, // 0006 GETGBL R4 G9 + 0x5C140200, // 0007 MOVE R5 R1 + 0x7C100200, // 0008 CALL R4 1 + 0x88140100, // 0009 GETMBR R5 R0 K0 + 0xB81A0600, // 000A GETNGBL R6 K3 + 0x88180D04, // 000B GETMBR R6 R6 K4 + 0x30140A06, // 000C OR R5 R5 R6 + 0x7C080600, // 000D CALL R2 3 + 0x80000000, // 000E RET 0 }) ) ); @@ -1680,9 +837,115 @@ be_local_closure(lvh_obj_get_align, /* name */ /******************************************************************** -** Solidified function: get_pad_left +** Solidified function: set_hidden ********************************************************************/ -be_local_closure(lvh_obj_get_pad_left, /* name */ +be_local_closure(lvh_obj_set_hidden, /* name */ + be_nested_proto( + 5, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 5]) { /* constants */ + /* K0 */ be_nested_str_weak(_lv_obj), + /* K1 */ be_nested_str_weak(add_flag), + /* K2 */ be_nested_str_weak(lv), + /* K3 */ be_nested_str_weak(OBJ_FLAG_HIDDEN), + /* K4 */ be_nested_str_weak(clear_flag), + }), + be_str_weak(set_hidden), + &be_const_str_solidified, + ( &(const binstruction[13]) { /* code */ + 0x78060005, // 0000 JMPF R1 #0007 + 0x88080100, // 0001 GETMBR R2 R0 K0 + 0x8C080501, // 0002 GETMET R2 R2 K1 + 0xB8120400, // 0003 GETNGBL R4 K2 + 0x88100903, // 0004 GETMBR R4 R4 K3 + 0x7C080400, // 0005 CALL R2 2 + 0x70020004, // 0006 JMP #000C + 0x88080100, // 0007 GETMBR R2 R0 K0 + 0x8C080504, // 0008 GETMET R2 R2 K4 + 0xB8120400, // 0009 GETNGBL R4 K2 + 0x88100903, // 000A GETMBR R4 R4 K3 + 0x7C080400, // 000B CALL R2 2 + 0x80000000, // 000C RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: set_text_color +********************************************************************/ +be_local_closure(lvh_obj_set_text_color, /* name */ + be_nested_proto( + 7, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 4]) { /* constants */ + /* K0 */ be_nested_str_weak(_lv_obj), + /* K1 */ be_nested_str_weak(set_style_text_color), + /* K2 */ be_nested_str_weak(parse_color), + /* K3 */ be_const_int(0), + }), + be_str_weak(set_text_color), + &be_const_str_solidified, + ( &(const binstruction[ 8]) { /* code */ + 0x88080100, // 0000 GETMBR R2 R0 K0 + 0x8C080501, // 0001 GETMET R2 R2 K1 + 0x8C100102, // 0002 GETMET R4 R0 K2 + 0x5C180200, // 0003 MOVE R6 R1 + 0x7C100400, // 0004 CALL R4 2 + 0x58140003, // 0005 LDCONST R5 K3 + 0x7C080600, // 0006 CALL R2 3 + 0x80000000, // 0007 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: get_value_font +********************************************************************/ +be_local_closure(lvh_obj_get_value_font, /* name */ + be_nested_proto( + 3, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 1]) { /* constants */ + /* K0 */ be_nested_str_weak(get_text_font), + }), + be_str_weak(get_value_font), + &be_const_str_solidified, + ( &(const binstruction[ 3]) { /* code */ + 0x8C040100, // 0000 GETMET R1 R0 K0 + 0x7C040200, // 0001 CALL R1 1 + 0x80040200, // 0002 RET 1 R1 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: get_pad_bottom +********************************************************************/ +be_local_closure(lvh_obj_get_pad_bottom, /* name */ be_nested_proto( 5, /* nstack */ 1, /* argc */ @@ -1695,11 +958,11 @@ be_local_closure(lvh_obj_get_pad_left, /* name */ ( &(const bvalue[ 5]) { /* constants */ /* K0 */ be_nested_str_weak(_lv_part2_selector), /* K1 */ be_nested_str_weak(_lv_obj), - /* K2 */ be_nested_str_weak(get_style_pad_left), + /* K2 */ be_nested_str_weak(get_style_pad_bottom), /* K3 */ be_nested_str_weak(lv), /* K4 */ be_nested_str_weak(STATE_DEFAULT), }), - be_str_weak(get_pad_left), + be_str_weak(get_pad_bottom), &be_const_str_solidified, ( &(const binstruction[13]) { /* code */ 0x88040100, // 0000 GETMBR R1 R0 K0 @@ -1721,6 +984,1842 @@ be_local_closure(lvh_obj_get_pad_left, /* name */ /*******************************************************************/ +/******************************************************************** +** Solidified function: val_rule_matched +********************************************************************/ +be_local_closure(lvh_obj_val_rule_matched, /* name */ + be_nested_proto( + 13, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 5]) { /* constants */ + /* K0 */ be_nested_str_weak(_val_rule_function), + /* K1 */ be_nested_str_weak(string), + /* K2 */ be_nested_str_weak(format), + /* K3 */ be_nested_str_weak(HSP_X3A_X20failed_X20to_X20run_X20self_X2E_val_rule_function_X20_X2D_X20_X25s_X20_X28_X25s_X29), + /* K4 */ be_nested_str_weak(val), + }), + be_str_weak(val_rule_matched), + &be_const_str_solidified, + ( &(const binstruction[37]) { /* code */ + 0x6008000A, // 0000 GETGBL R2 G10 + 0x5C0C0200, // 0001 MOVE R3 R1 + 0x7C080200, // 0002 CALL R2 1 + 0x4C0C0000, // 0003 LDNIL R3 + 0x1C0C0403, // 0004 EQ R3 R2 R3 + 0x780E0001, // 0005 JMPF R3 #0008 + 0x500C0000, // 0006 LDBOOL R3 0 0 + 0x80040600, // 0007 RET 1 R3 + 0x880C0100, // 0008 GETMBR R3 R0 K0 + 0x4C100000, // 0009 LDNIL R4 + 0x20100604, // 000A NE R4 R3 R4 + 0x78120012, // 000B JMPF R4 #001F + 0xA8020005, // 000C EXBLK 0 #0013 + 0x5C100600, // 000D MOVE R4 R3 + 0x5C140400, // 000E MOVE R5 R2 + 0x7C100200, // 000F CALL R4 1 + 0x5C080800, // 0010 MOVE R2 R4 + 0xA8040001, // 0011 EXBLK 1 1 + 0x7002000B, // 0012 JMP #001F + 0xAC100002, // 0013 CATCH R4 0 2 + 0x70020008, // 0014 JMP #001E + 0xA41A0200, // 0015 IMPORT R6 K1 + 0x601C0001, // 0016 GETGBL R7 G1 + 0x8C200D02, // 0017 GETMET R8 R6 K2 + 0x58280003, // 0018 LDCONST R10 K3 + 0x5C2C0800, // 0019 MOVE R11 R4 + 0x5C300A00, // 001A MOVE R12 R5 + 0x7C200800, // 001B CALL R8 4 + 0x7C1C0200, // 001C CALL R7 1 + 0x70020000, // 001D JMP #001F + 0xB0080000, // 001E RAISE 2 R0 R0 + 0x60100009, // 001F GETGBL R4 G9 + 0x5C140400, // 0020 MOVE R5 R2 + 0x7C100200, // 0021 CALL R4 1 + 0x90020804, // 0022 SETMBR R0 K4 R4 + 0x50100000, // 0023 LDBOOL R4 0 0 + 0x80040800, // 0024 RET 1 R4 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: get_enabled +********************************************************************/ +be_local_closure(lvh_obj_get_enabled, /* name */ + be_nested_proto( + 4, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 4]) { /* constants */ + /* K0 */ be_nested_str_weak(_lv_obj), + /* K1 */ be_nested_str_weak(has_flag), + /* K2 */ be_nested_str_weak(lv), + /* K3 */ be_nested_str_weak(OBJ_FLAG_CLICKABLE), + }), + be_str_weak(get_enabled), + &be_const_str_solidified, + ( &(const binstruction[ 6]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x8C040301, // 0001 GETMET R1 R1 K1 + 0xB80E0400, // 0002 GETNGBL R3 K2 + 0x880C0703, // 0003 GETMBR R3 R3 K3 + 0x7C040400, // 0004 CALL R1 2 + 0x80040200, // 0005 RET 1 R1 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: set_meta +********************************************************************/ +be_local_closure(lvh_obj_set_meta, /* name */ + be_nested_proto( + 2, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 1]) { /* constants */ + /* K0 */ be_nested_str_weak(_meta), + }), + be_str_weak(set_meta), + &be_const_str_solidified, + ( &(const binstruction[ 2]) { /* code */ + 0x90020001, // 0000 SETMBR R0 K0 R1 + 0x80000000, // 0001 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: get_val_rule +********************************************************************/ +be_local_closure(lvh_obj_get_val_rule, /* name */ + be_nested_proto( + 2, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 1]) { /* constants */ + /* K0 */ be_nested_str_weak(_val_rule), + }), + be_str_weak(get_val_rule), + &be_const_str_solidified, + ( &(const binstruction[ 2]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x80040200, // 0001 RET 1 R1 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: set_text_rule_format +********************************************************************/ +be_local_closure(lvh_obj_set_text_rule_format, /* name */ + be_nested_proto( + 4, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 1]) { /* constants */ + /* K0 */ be_nested_str_weak(_text_rule_format), + }), + be_str_weak(set_text_rule_format), + &be_const_str_solidified, + ( &(const binstruction[ 5]) { /* code */ + 0x60080008, // 0000 GETGBL R2 G8 + 0x5C0C0200, // 0001 MOVE R3 R1 + 0x7C080200, // 0002 CALL R2 1 + 0x90020002, // 0003 SETMBR R0 K0 R2 + 0x80000000, // 0004 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: init +********************************************************************/ +be_local_closure(lvh_obj_init, /* name */ + be_nested_proto( + 8, /* nstack */ + 5, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 4]) { /* constants */ + /* K0 */ be_nested_str_weak(_page), + /* K1 */ be_nested_str_weak(_lv_class), + /* K2 */ be_nested_str_weak(_lv_obj), + /* K3 */ be_nested_str_weak(post_init), + }), + be_str_weak(init), + &be_const_str_solidified, + ( &(const binstruction[16]) { /* code */ + 0x90020002, // 0000 SETMBR R0 K0 R2 + 0x4C140000, // 0001 LDNIL R5 + 0x1C140805, // 0002 EQ R5 R4 R5 + 0x78160007, // 0003 JMPF R5 #000C + 0x88140101, // 0004 GETMBR R5 R0 K1 + 0x78160005, // 0005 JMPF R5 #000C + 0x88140101, // 0006 GETMBR R5 R0 K1 + 0x5C180A00, // 0007 MOVE R6 R5 + 0x5C1C0200, // 0008 MOVE R7 R1 + 0x7C180200, // 0009 CALL R6 1 + 0x90020406, // 000A SETMBR R0 K2 R6 + 0x70020000, // 000B JMP #000D + 0x90020404, // 000C SETMBR R0 K2 R4 + 0x8C140103, // 000D GETMET R5 R0 K3 + 0x7C140200, // 000E CALL R5 1 + 0x80000000, // 000F RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: set_value_font +********************************************************************/ +be_local_closure(lvh_obj_set_value_font, /* name */ + be_nested_proto( + 5, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 1]) { /* constants */ + /* K0 */ be_nested_str_weak(set_text_font), + }), + be_str_weak(set_value_font), + &be_const_str_solidified, + ( &(const binstruction[ 4]) { /* code */ + 0x8C080100, // 0000 GETMET R2 R0 K0 + 0x5C100200, // 0001 MOVE R4 R1 + 0x7C080400, // 0002 CALL R2 2 + 0x80000000, // 0003 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: check_label +********************************************************************/ +be_local_closure(lvh_obj_check_label, /* name */ + be_nested_proto( + 5, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 6]) { /* constants */ + /* K0 */ be_nested_str_weak(_lv_label), + /* K1 */ be_nested_str_weak(lv), + /* K2 */ be_nested_str_weak(label), + /* K3 */ be_nested_str_weak(get_obj), + /* K4 */ be_nested_str_weak(set_align), + /* K5 */ be_nested_str_weak(ALIGN_CENTER), + }), + be_str_weak(check_label), + &be_const_str_solidified, + ( &(const binstruction[16]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x4C080000, // 0001 LDNIL R2 + 0x1C040202, // 0002 EQ R1 R1 R2 + 0x7806000A, // 0003 JMPF R1 #000F + 0xB8060200, // 0004 GETNGBL R1 K1 + 0x8C040302, // 0005 GETMET R1 R1 K2 + 0x8C0C0103, // 0006 GETMET R3 R0 K3 + 0x7C0C0200, // 0007 CALL R3 1 + 0x7C040400, // 0008 CALL R1 2 + 0x90020001, // 0009 SETMBR R0 K0 R1 + 0x88040100, // 000A GETMBR R1 R0 K0 + 0x8C040304, // 000B GETMET R1 R1 K4 + 0xB80E0200, // 000C GETNGBL R3 K1 + 0x880C0705, // 000D GETMBR R3 R3 K5 + 0x7C040400, // 000E CALL R1 2 + 0x80000000, // 000F RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: get_meta +********************************************************************/ +be_local_closure(lvh_obj_get_meta, /* name */ + be_nested_proto( + 2, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 1]) { /* constants */ + /* K0 */ be_nested_str_weak(_meta), + }), + be_str_weak(get_meta), + &be_const_str_solidified, + ( &(const binstruction[ 2]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x80040200, // 0001 RET 1 R1 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: set_val_rule +********************************************************************/ +be_local_closure(lvh_obj_set_val_rule, /* name */ + be_nested_proto( + 7, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 1, /* has sup protos */ + ( &(const struct bproto*[ 1]) { + be_nested_proto( + 4, /* nstack */ + 1, /* argc */ + 0, /* varg */ + 1, /* has upvals */ + ( &(const bupvaldesc[ 1]) { /* upvals */ + be_local_const_upval(1, 0), + }), + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 1]) { /* constants */ + /* K0 */ be_nested_str_weak(val_rule_matched), + }), + be_str_weak(_X3Clambda_X3E), + &be_const_str_solidified, + ( &(const binstruction[ 5]) { /* code */ + 0x68040000, // 0000 GETUPV R1 U0 + 0x8C040300, // 0001 GETMET R1 R1 K0 + 0x5C0C0000, // 0002 MOVE R3 R0 + 0x7C040400, // 0003 CALL R1 2 + 0x80040200, // 0004 RET 1 R1 + }) + ), + }), + 1, /* has constants */ + ( &(const bvalue[ 4]) { /* constants */ + /* K0 */ be_nested_str_weak(_val_rule), + /* K1 */ be_nested_str_weak(tasmota), + /* K2 */ be_nested_str_weak(remove_rule), + /* K3 */ be_nested_str_weak(add_rule), + }), + be_str_weak(set_val_rule), + &be_const_str_solidified, + ( &(const binstruction[21]) { /* code */ + 0x88080100, // 0000 GETMBR R2 R0 K0 + 0x4C0C0000, // 0001 LDNIL R3 + 0x20080403, // 0002 NE R2 R2 R3 + 0x780A0004, // 0003 JMPF R2 #0009 + 0xB80A0200, // 0004 GETNGBL R2 K1 + 0x8C080502, // 0005 GETMET R2 R2 K2 + 0x88100100, // 0006 GETMBR R4 R0 K0 + 0x5C140000, // 0007 MOVE R5 R0 + 0x7C080600, // 0008 CALL R2 3 + 0x60080008, // 0009 GETGBL R2 G8 + 0x5C0C0200, // 000A MOVE R3 R1 + 0x7C080200, // 000B CALL R2 1 + 0x90020002, // 000C SETMBR R0 K0 R2 + 0xB80A0200, // 000D GETNGBL R2 K1 + 0x8C080503, // 000E GETMET R2 R2 K3 + 0x88100100, // 000F GETMBR R4 R0 K0 + 0x84140000, // 0010 CLOSURE R5 P0 + 0x5C180000, // 0011 MOVE R6 R0 + 0x7C080800, // 0012 CALL R2 4 + 0xA0000000, // 0013 CLOSE R0 + 0x80000000, // 0014 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: set_enabled +********************************************************************/ +be_local_closure(lvh_obj_set_enabled, /* name */ + be_nested_proto( + 5, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 5]) { /* constants */ + /* K0 */ be_nested_str_weak(_lv_obj), + /* K1 */ be_nested_str_weak(add_flag), + /* K2 */ be_nested_str_weak(lv), + /* K3 */ be_nested_str_weak(OBJ_FLAG_CLICKABLE), + /* K4 */ be_nested_str_weak(clear_flag), + }), + be_str_weak(set_enabled), + &be_const_str_solidified, + ( &(const binstruction[13]) { /* code */ + 0x78060005, // 0000 JMPF R1 #0007 + 0x88080100, // 0001 GETMBR R2 R0 K0 + 0x8C080501, // 0002 GETMET R2 R2 K1 + 0xB8120400, // 0003 GETNGBL R4 K2 + 0x88100903, // 0004 GETMBR R4 R4 K3 + 0x7C080400, // 0005 CALL R2 2 + 0x70020004, // 0006 JMP #000C + 0x88080100, // 0007 GETMBR R2 R0 K0 + 0x8C080504, // 0008 GETMET R2 R2 K4 + 0xB8120400, // 0009 GETNGBL R4 K2 + 0x88100903, // 000A GETMBR R4 R4 K3 + 0x7C080400, // 000B CALL R2 2 + 0x80000000, // 000C RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: get_action +********************************************************************/ +be_local_closure(lvh_obj_get_action, /* name */ + be_nested_proto( + 3, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 2]) { /* constants */ + /* K0 */ be_nested_str_weak(_action), + /* K1 */ be_nested_str_weak(), + }), + be_str_weak(get_action), + &be_const_str_solidified, + ( &(const binstruction[ 6]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x78060001, // 0001 JMPF R1 #0004 + 0x5C080200, // 0002 MOVE R2 R1 + 0x70020000, // 0003 JMP #0005 + 0x58080001, // 0004 LDCONST R2 K1 + 0x80040400, // 0005 RET 1 R2 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: get_radius2 +********************************************************************/ +be_local_closure(lvh_obj_get_radius2, /* name */ + be_nested_proto( + 5, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 5]) { /* constants */ + /* K0 */ be_nested_str_weak(_lv_part2_selector), + /* K1 */ be_nested_str_weak(_lv_obj), + /* K2 */ be_nested_str_weak(get_style_radius), + /* K3 */ be_nested_str_weak(lv), + /* K4 */ be_nested_str_weak(STATE_DEFAULT), + }), + be_str_weak(get_radius2), + &be_const_str_solidified, + ( &(const binstruction[13]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x4C080000, // 0001 LDNIL R2 + 0x20040202, // 0002 NE R1 R1 R2 + 0x78060007, // 0003 JMPF R1 #000C + 0x88040101, // 0004 GETMBR R1 R0 K1 + 0x8C040302, // 0005 GETMET R1 R1 K2 + 0x880C0100, // 0006 GETMBR R3 R0 K0 + 0xB8120600, // 0007 GETNGBL R4 K3 + 0x88100904, // 0008 GETMBR R4 R4 K4 + 0x300C0604, // 0009 OR R3 R3 R4 + 0x7C040400, // 000A CALL R1 2 + 0x80040200, // 000B RET 1 R1 + 0x80000000, // 000C RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: set_pad_right2 +********************************************************************/ +be_local_closure(lvh_obj_set_pad_right2, /* name */ + be_nested_proto( + 7, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 5]) { /* constants */ + /* K0 */ be_nested_str_weak(_lv_part2_selector), + /* K1 */ be_nested_str_weak(_lv_obj), + /* K2 */ be_nested_str_weak(set_style_pad_right), + /* K3 */ be_nested_str_weak(lv), + /* K4 */ be_nested_str_weak(STATE_DEFAULT), + }), + be_str_weak(set_pad_right2), + &be_const_str_solidified, + ( &(const binstruction[15]) { /* code */ + 0x88080100, // 0000 GETMBR R2 R0 K0 + 0x4C0C0000, // 0001 LDNIL R3 + 0x20080403, // 0002 NE R2 R2 R3 + 0x780A0009, // 0003 JMPF R2 #000E + 0x88080101, // 0004 GETMBR R2 R0 K1 + 0x8C080502, // 0005 GETMET R2 R2 K2 + 0x60100009, // 0006 GETGBL R4 G9 + 0x5C140200, // 0007 MOVE R5 R1 + 0x7C100200, // 0008 CALL R4 1 + 0x88140100, // 0009 GETMBR R5 R0 K0 + 0xB81A0600, // 000A GETNGBL R6 K3 + 0x88180D04, // 000B GETMBR R6 R6 K4 + 0x30140A06, // 000C OR R5 R5 R6 + 0x7C080600, // 000D CALL R2 3 + 0x80000000, // 000E RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: get_value_ofs_x +********************************************************************/ +be_local_closure(lvh_obj_get_value_ofs_x, /* name */ + be_nested_proto( + 3, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 2]) { /* constants */ + /* K0 */ be_nested_str_weak(_lv_label), + /* K1 */ be_nested_str_weak(get_x), + }), + be_str_weak(get_value_ofs_x), + &be_const_str_solidified, + ( &(const binstruction[ 4]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x8C040301, // 0001 GETMET R1 R1 K1 + 0x7C040200, // 0002 CALL R1 1 + 0x80040200, // 0003 RET 1 R1 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: get_value_color +********************************************************************/ +be_local_closure(lvh_obj_get_value_color, /* name */ + be_nested_proto( + 3, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 1]) { /* constants */ + /* K0 */ be_nested_str_weak(get_value_color), + }), + be_str_weak(get_value_color), + &be_const_str_solidified, + ( &(const binstruction[ 3]) { /* code */ + 0x8C040100, // 0000 GETMET R1 R0 K0 + 0x7C040200, // 0001 CALL R1 1 + 0x80040200, // 0002 RET 1 R1 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: set_pad_bottom2 +********************************************************************/ +be_local_closure(lvh_obj_set_pad_bottom2, /* name */ + be_nested_proto( + 7, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 5]) { /* constants */ + /* K0 */ be_nested_str_weak(_lv_part2_selector), + /* K1 */ be_nested_str_weak(_lv_obj), + /* K2 */ be_nested_str_weak(set_style_pad_bottom), + /* K3 */ be_nested_str_weak(lv), + /* K4 */ be_nested_str_weak(STATE_DEFAULT), + }), + be_str_weak(set_pad_bottom2), + &be_const_str_solidified, + ( &(const binstruction[15]) { /* code */ + 0x88080100, // 0000 GETMBR R2 R0 K0 + 0x4C0C0000, // 0001 LDNIL R3 + 0x20080403, // 0002 NE R2 R2 R3 + 0x780A0009, // 0003 JMPF R2 #000E + 0x88080101, // 0004 GETMBR R2 R0 K1 + 0x8C080502, // 0005 GETMET R2 R2 K2 + 0x60100009, // 0006 GETGBL R4 G9 + 0x5C140200, // 0007 MOVE R5 R1 + 0x7C100200, // 0008 CALL R4 1 + 0x88140100, // 0009 GETMBR R5 R0 K0 + 0xB81A0600, // 000A GETNGBL R6 K3 + 0x88180D04, // 000B GETMBR R6 R6 K4 + 0x30140A06, // 000C OR R5 R5 R6 + 0x7C080600, // 000D CALL R2 3 + 0x80000000, // 000E RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: get_text_color +********************************************************************/ +be_local_closure(lvh_obj_get_text_color, /* name */ + be_nested_proto( + 4, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 3]) { /* constants */ + /* K0 */ be_nested_str_weak(_lv_obj), + /* K1 */ be_nested_str_weak(get_style_text_color), + /* K2 */ be_const_int(0), + }), + be_str_weak(get_text_color), + &be_const_str_solidified, + ( &(const binstruction[ 5]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x8C040301, // 0001 GETMET R1 R1 K1 + 0x580C0002, // 0002 LDCONST R3 K2 + 0x7C040400, // 0003 CALL R1 2 + 0x80040200, // 0004 RET 1 R1 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: get_click +********************************************************************/ +be_local_closure(lvh_obj_get_click, /* name */ + be_nested_proto( + 3, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 1]) { /* constants */ + /* K0 */ be_nested_str_weak(get_enabled), + }), + be_str_weak(get_click), + &be_const_str_solidified, + ( &(const binstruction[ 3]) { /* code */ + 0x8C040100, // 0000 GETMET R1 R0 K0 + 0x7C040200, // 0001 CALL R1 1 + 0x80040200, // 0002 RET 1 R1 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: event_cb +********************************************************************/ +be_local_closure(lvh_obj_event_cb, /* name */ + be_nested_proto( + 14, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 1, /* has sup protos */ + ( &(const struct bproto*[ 2]) { + be_nested_proto( + 4, /* nstack */ + 0, /* argc */ + 0, /* varg */ + 1, /* has upvals */ + ( &(const bupvaldesc[ 3]) { /* upvals */ + be_local_const_upval(1, 2), + be_local_const_upval(1, 0), + be_local_const_upval(1, 3), + }), + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 1]) { /* constants */ + /* K0 */ be_nested_str_weak(do_action), + }), + be_str_weak(_X3Clambda_X3E), + &be_const_str_solidified, + ( &(const binstruction[ 6]) { /* code */ + 0x68000000, // 0000 GETUPV R0 U0 + 0x8C000100, // 0001 GETMET R0 R0 K0 + 0x68080001, // 0002 GETUPV R2 U1 + 0x680C0002, // 0003 GETUPV R3 U2 + 0x7C000600, // 0004 CALL R0 3 + 0x80040000, // 0005 RET 1 R0 + }) + ), + be_nested_proto( + 3, /* nstack */ + 0, /* argc */ + 0, /* varg */ + 1, /* has upvals */ + ( &(const bupvaldesc[ 1]) { /* upvals */ + be_local_const_upval(1, 7), + }), + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 2]) { /* constants */ + /* K0 */ be_nested_str_weak(tasmota), + /* K1 */ be_nested_str_weak(publish_rule), + }), + be_str_weak(_X3Clambda_X3E), + &be_const_str_solidified, + ( &(const binstruction[ 5]) { /* code */ + 0xB8020000, // 0000 GETNGBL R0 K0 + 0x8C000101, // 0001 GETMET R0 R0 K1 + 0x68080000, // 0002 GETUPV R2 U0 + 0x7C000400, // 0003 CALL R0 2 + 0x80040000, // 0004 RET 1 R0 + }) + ), + }), + 1, /* has constants */ + ( &(const bvalue[24]) { /* constants */ + /* K0 */ be_nested_str_weak(_page), + /* K1 */ be_nested_str_weak(_oh), + /* K2 */ be_nested_str_weak(code), + /* K3 */ be_nested_str_weak(action), + /* K4 */ be_nested_str_weak(), + /* K5 */ be_nested_str_weak(lv), + /* K6 */ be_nested_str_weak(EVENT_CLICKED), + /* K7 */ be_nested_str_weak(tasmota), + /* K8 */ be_nested_str_weak(set_timer), + /* K9 */ be_const_int(0), + /* K10 */ be_nested_str_weak(_event_map), + /* K11 */ be_nested_str_weak(find), + /* K12 */ be_nested_str_weak(string), + /* K13 */ be_nested_str_weak(EVENT_VALUE_CHANGED), + /* K14 */ be_nested_str_weak(val), + /* K15 */ be_nested_str_weak(format), + /* K16 */ be_nested_str_weak(_X2C_X22val_X22_X3A_X25i), + /* K17 */ be_nested_str_weak(text), + /* K18 */ be_nested_str_weak(json), + /* K19 */ be_nested_str_weak(_X2C_X22text_X22_X3A), + /* K20 */ be_nested_str_weak(dump), + /* K21 */ be_nested_str_weak(_X7B_X22hasp_X22_X3A_X7B_X22p_X25ib_X25i_X22_X3A_X7B_X22event_X22_X3A_X22_X25s_X22_X25s_X7D_X7D_X7D), + /* K22 */ be_nested_str_weak(_page_id), + /* K23 */ be_nested_str_weak(id), + }), + be_str_weak(event_cb), + &be_const_str_solidified, + ( &(const binstruction[71]) { /* code */ + 0x88080100, // 0000 GETMBR R2 R0 K0 + 0x88080501, // 0001 GETMBR R2 R2 K1 + 0x880C0302, // 0002 GETMBR R3 R1 K2 + 0x88100103, // 0003 GETMBR R4 R0 K3 + 0x20100904, // 0004 NE R4 R4 K4 + 0x78120008, // 0005 JMPF R4 #000F + 0xB8120A00, // 0006 GETNGBL R4 K5 + 0x88100906, // 0007 GETMBR R4 R4 K6 + 0x1C100604, // 0008 EQ R4 R3 R4 + 0x78120004, // 0009 JMPF R4 #000F + 0xB8120E00, // 000A GETNGBL R4 K7 + 0x8C100908, // 000B GETMET R4 R4 K8 + 0x58180009, // 000C LDCONST R6 K9 + 0x841C0000, // 000D CLOSURE R7 P0 + 0x7C100600, // 000E CALL R4 3 + 0x8810010A, // 000F GETMBR R4 R0 K10 + 0x8C10090B, // 0010 GETMET R4 R4 K11 + 0x5C180600, // 0011 MOVE R6 R3 + 0x7C100400, // 0012 CALL R4 2 + 0x4C140000, // 0013 LDNIL R5 + 0x20140805, // 0014 NE R5 R4 R5 + 0x7816002E, // 0015 JMPF R5 #0045 + 0xA4161800, // 0016 IMPORT R5 K12 + 0x58180004, // 0017 LDCONST R6 K4 + 0x881C0302, // 0018 GETMBR R7 R1 K2 + 0xB8220A00, // 0019 GETNGBL R8 K5 + 0x8820110D, // 001A GETMBR R8 R8 K13 + 0x1C1C0E08, // 001B EQ R7 R7 R8 + 0x781E0019, // 001C JMPF R7 #0037 + 0xA8020014, // 001D EXBLK 0 #0033 + 0x881C010E, // 001E GETMBR R7 R0 K14 + 0x4C200000, // 001F LDNIL R8 + 0x20200E08, // 0020 NE R8 R7 R8 + 0x78220004, // 0021 JMPF R8 #0027 + 0x8C200B0F, // 0022 GETMET R8 R5 K15 + 0x58280010, // 0023 LDCONST R10 K16 + 0x5C2C0E00, // 0024 MOVE R11 R7 + 0x7C200600, // 0025 CALL R8 3 + 0x5C181000, // 0026 MOVE R6 R8 + 0x88200111, // 0027 GETMBR R8 R0 K17 + 0x4C240000, // 0028 LDNIL R9 + 0x20241009, // 0029 NE R9 R8 R9 + 0x78260005, // 002A JMPF R9 #0031 + 0xA4262400, // 002B IMPORT R9 K18 + 0x00180D13, // 002C ADD R6 R6 K19 + 0x8C281314, // 002D GETMET R10 R9 K20 + 0x5C301000, // 002E MOVE R12 R8 + 0x7C280400, // 002F CALL R10 2 + 0x00180C0A, // 0030 ADD R6 R6 R10 + 0xA8040001, // 0031 EXBLK 1 1 + 0x70020003, // 0032 JMP #0037 + 0xAC1C0000, // 0033 CATCH R7 0 0 + 0x70020000, // 0034 JMP #0036 + 0x70020000, // 0035 JMP #0037 + 0xB0080000, // 0036 RAISE 2 R0 R0 + 0x8C1C0B0F, // 0037 GETMET R7 R5 K15 + 0x58240015, // 0038 LDCONST R9 K21 + 0x88280100, // 0039 GETMBR R10 R0 K0 + 0x88281516, // 003A GETMBR R10 R10 K22 + 0x882C0117, // 003B GETMBR R11 R0 K23 + 0x5C300800, // 003C MOVE R12 R4 + 0x5C340C00, // 003D MOVE R13 R6 + 0x7C1C0C00, // 003E CALL R7 6 + 0xB8220E00, // 003F GETNGBL R8 K7 + 0x8C201108, // 0040 GETMET R8 R8 K8 + 0x58280009, // 0041 LDCONST R10 K9 + 0x842C0001, // 0042 CLOSURE R11 P1 + 0x7C200600, // 0043 CALL R8 3 + 0xA0140000, // 0044 CLOSE R5 + 0xA0000000, // 0045 CLOSE R0 + 0x80000000, // 0046 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: get_toggle +********************************************************************/ +be_local_closure(lvh_obj_get_toggle, /* name */ + be_nested_proto( + 4, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 4]) { /* constants */ + /* K0 */ be_nested_str_weak(_lv_obj), + /* K1 */ be_nested_str_weak(has_state), + /* K2 */ be_nested_str_weak(lv), + /* K3 */ be_nested_str_weak(STATE_CHECKED), + }), + be_str_weak(get_toggle), + &be_const_str_solidified, + ( &(const binstruction[ 6]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x8C040301, // 0001 GETMET R1 R1 K1 + 0xB80E0400, // 0002 GETNGBL R3 K2 + 0x880C0703, // 0003 GETMBR R3 R3 K3 + 0x7C040400, // 0004 CALL R1 2 + 0x80040200, // 0005 RET 1 R1 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: set_text_rule_formula +********************************************************************/ +be_local_closure(lvh_obj_set_text_rule_formula, /* name */ + be_nested_proto( + 13, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 7]) { /* constants */ + /* K0 */ be_nested_str_weak(_text_rule_formula), + /* K1 */ be_nested_str_weak(return_X20_X2F_X20val_X20_X2D_X3E_X20_X28), + /* K2 */ be_nested_str_weak(_X29), + /* K3 */ be_nested_str_weak(_text_rule_function), + /* K4 */ be_nested_str_weak(string), + /* K5 */ be_nested_str_weak(format), + /* K6 */ be_nested_str_weak(HSP_X3A_X20failed_X20to_X20compile_X20_X27_X25s_X27_X20_X2D_X20_X25s_X20_X28_X25s_X29), + }), + be_str_weak(set_text_rule_formula), + &be_const_str_solidified, + ( &(const binstruction[30]) { /* code */ + 0x60080008, // 0000 GETGBL R2 G8 + 0x5C0C0200, // 0001 MOVE R3 R1 + 0x7C080200, // 0002 CALL R2 1 + 0x90020002, // 0003 SETMBR R0 K0 R2 + 0x88080100, // 0004 GETMBR R2 R0 K0 + 0x000A0202, // 0005 ADD R2 K1 R2 + 0x00080502, // 0006 ADD R2 R2 K2 + 0xA8020007, // 0007 EXBLK 0 #0010 + 0x600C000D, // 0008 GETGBL R3 G13 + 0x5C100400, // 0009 MOVE R4 R2 + 0x7C0C0200, // 000A CALL R3 1 + 0x5C100600, // 000B MOVE R4 R3 + 0x7C100000, // 000C CALL R4 0 + 0x90020604, // 000D SETMBR R0 K3 R4 + 0xA8040001, // 000E EXBLK 1 1 + 0x7002000C, // 000F JMP #001D + 0xAC0C0002, // 0010 CATCH R3 0 2 + 0x70020009, // 0011 JMP #001C + 0xA4160800, // 0012 IMPORT R5 K4 + 0x60180001, // 0013 GETGBL R6 G1 + 0x8C1C0B05, // 0014 GETMET R7 R5 K5 + 0x58240006, // 0015 LDCONST R9 K6 + 0x5C280400, // 0016 MOVE R10 R2 + 0x5C2C0600, // 0017 MOVE R11 R3 + 0x5C300800, // 0018 MOVE R12 R4 + 0x7C1C0A00, // 0019 CALL R7 5 + 0x7C180200, // 001A CALL R6 1 + 0x70020000, // 001B JMP #001D + 0xB0080000, // 001C RAISE 2 R0 R0 + 0x80000000, // 001D RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: get_pad_top +********************************************************************/ +be_local_closure(lvh_obj_get_pad_top, /* name */ + be_nested_proto( + 5, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 5]) { /* constants */ + /* K0 */ be_nested_str_weak(_lv_part2_selector), + /* K1 */ be_nested_str_weak(_lv_obj), + /* K2 */ be_nested_str_weak(get_style_pad_top), + /* K3 */ be_nested_str_weak(lv), + /* K4 */ be_nested_str_weak(STATE_DEFAULT), + }), + be_str_weak(get_pad_top), + &be_const_str_solidified, + ( &(const binstruction[13]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x4C080000, // 0001 LDNIL R2 + 0x20040202, // 0002 NE R1 R1 R2 + 0x78060007, // 0003 JMPF R1 #000C + 0x88040101, // 0004 GETMBR R1 R0 K1 + 0x8C040302, // 0005 GETMET R1 R1 K2 + 0x880C0100, // 0006 GETMBR R3 R0 K0 + 0xB8120600, // 0007 GETNGBL R4 K3 + 0x88100904, // 0008 GETMBR R4 R4 K4 + 0x300C0604, // 0009 OR R3 R3 R4 + 0x7C040400, // 000A CALL R1 2 + 0x80040200, // 000B RET 1 R1 + 0x80000000, // 000C RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: set_adjustable +********************************************************************/ +be_local_closure(lvh_obj_set_adjustable, /* name */ + be_nested_proto( + 5, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 5]) { /* constants */ + /* K0 */ be_nested_str_weak(_lv_obj), + /* K1 */ be_nested_str_weak(add_flag), + /* K2 */ be_nested_str_weak(lv), + /* K3 */ be_nested_str_weak(OBJ_FLAG_CLICKABLE), + /* K4 */ be_nested_str_weak(clear_flag), + }), + be_str_weak(set_adjustable), + &be_const_str_solidified, + ( &(const binstruction[13]) { /* code */ + 0x78060005, // 0000 JMPF R1 #0007 + 0x88080100, // 0001 GETMBR R2 R0 K0 + 0x8C080501, // 0002 GETMET R2 R2 K1 + 0xB8120400, // 0003 GETNGBL R4 K2 + 0x88100903, // 0004 GETMBR R4 R4 K3 + 0x7C080400, // 0005 CALL R2 2 + 0x70020004, // 0006 JMP #000C + 0x88080100, // 0007 GETMBR R2 R0 K0 + 0x8C080504, // 0008 GETMET R2 R2 K4 + 0xB8120400, // 0009 GETNGBL R4 K2 + 0x88100903, // 000A GETMBR R4 R4 K3 + 0x7C080400, // 000B CALL R2 2 + 0x80000000, // 000C RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: set_value_color +********************************************************************/ +be_local_closure(lvh_obj_set_value_color, /* name */ + be_nested_proto( + 5, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 1]) { /* constants */ + /* K0 */ be_nested_str_weak(set_text_color), + }), + be_str_weak(set_value_color), + &be_const_str_solidified, + ( &(const binstruction[ 4]) { /* code */ + 0x8C080100, // 0000 GETMET R2 R0 K0 + 0x5C100200, // 0001 MOVE R4 R1 + 0x7C080400, // 0002 CALL R2 2 + 0x80000000, // 0003 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: register_event_cb +********************************************************************/ +be_local_closure(lvh_obj_register_event_cb, /* name */ + be_nested_proto( + 8, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 6]) { /* constants */ + /* K0 */ be_nested_str_weak(_page), + /* K1 */ be_nested_str_weak(_oh), + /* K2 */ be_nested_str_weak(_event_map), + /* K3 */ be_nested_str_weak(keys), + /* K4 */ be_nested_str_weak(register_event), + /* K5 */ be_nested_str_weak(stop_iteration), + }), + be_str_weak(register_event_cb), + &be_const_str_solidified, + ( &(const binstruction[19]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x88040301, // 0001 GETMBR R1 R1 K1 + 0x60080010, // 0002 GETGBL R2 G16 + 0x880C0102, // 0003 GETMBR R3 R0 K2 + 0x8C0C0703, // 0004 GETMET R3 R3 K3 + 0x7C0C0200, // 0005 CALL R3 1 + 0x7C080200, // 0006 CALL R2 1 + 0xA8020006, // 0007 EXBLK 0 #000F + 0x5C0C0400, // 0008 MOVE R3 R2 + 0x7C0C0000, // 0009 CALL R3 0 + 0x8C100304, // 000A GETMET R4 R1 K4 + 0x5C180000, // 000B MOVE R6 R0 + 0x5C1C0600, // 000C MOVE R7 R3 + 0x7C100600, // 000D CALL R4 3 + 0x7001FFF8, // 000E JMP #0008 + 0x58080005, // 000F LDCONST R2 K5 + 0xAC080200, // 0010 CATCH R2 1 0 + 0xB0080000, // 0011 RAISE 2 R0 R0 + 0x80000000, // 0012 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: set_pad_all2 +********************************************************************/ +be_local_closure(lvh_obj_set_pad_all2, /* name */ + be_nested_proto( + 7, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 5]) { /* constants */ + /* K0 */ be_nested_str_weak(_lv_part2_selector), + /* K1 */ be_nested_str_weak(_lv_obj), + /* K2 */ be_nested_str_weak(set_style_pad_all), + /* K3 */ be_nested_str_weak(lv), + /* K4 */ be_nested_str_weak(STATE_DEFAULT), + }), + be_str_weak(set_pad_all2), + &be_const_str_solidified, + ( &(const binstruction[15]) { /* code */ + 0x88080100, // 0000 GETMBR R2 R0 K0 + 0x4C0C0000, // 0001 LDNIL R3 + 0x20080403, // 0002 NE R2 R2 R3 + 0x780A0009, // 0003 JMPF R2 #000E + 0x88080101, // 0004 GETMBR R2 R0 K1 + 0x8C080502, // 0005 GETMET R2 R2 K2 + 0x60100009, // 0006 GETGBL R4 G9 + 0x5C140200, // 0007 MOVE R5 R1 + 0x7C100200, // 0008 CALL R4 1 + 0x88140100, // 0009 GETMBR R5 R0 K0 + 0xB81A0600, // 000A GETNGBL R6 K3 + 0x88180D04, // 000B GETMBR R6 R6 K4 + 0x30140A06, // 000C OR R5 R5 R6 + 0x7C080600, // 000D CALL R2 3 + 0x80000000, // 000E RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: get_text_rule_formula +********************************************************************/ +be_local_closure(lvh_obj_get_text_rule_formula, /* name */ + be_nested_proto( + 2, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 1]) { /* constants */ + /* K0 */ be_nested_str_weak(_text_rule_formula), + }), + be_str_weak(get_text_rule_formula), + &be_const_str_solidified, + ( &(const binstruction[ 2]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x80040200, // 0001 RET 1 R1 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: get_text_font +********************************************************************/ +be_local_closure(lvh_obj_get_text_font, /* name */ + be_nested_proto( + 1, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 0, /* has constants */ + NULL, /* no const */ + be_str_weak(get_text_font), + &be_const_str_solidified, + ( &(const binstruction[ 1]) { /* code */ + 0x80000000, // 0000 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: get_hidden +********************************************************************/ +be_local_closure(lvh_obj_get_hidden, /* name */ + be_nested_proto( + 4, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 4]) { /* constants */ + /* K0 */ be_nested_str_weak(_lv_obj), + /* K1 */ be_nested_str_weak(has_flag), + /* K2 */ be_nested_str_weak(lv), + /* K3 */ be_nested_str_weak(OBJ_FLAG_HIDDEN), + }), + be_str_weak(get_hidden), + &be_const_str_solidified, + ( &(const binstruction[ 6]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x8C040301, // 0001 GETMET R1 R1 K1 + 0xB80E0400, // 0002 GETNGBL R3 K2 + 0x880C0703, // 0003 GETMBR R3 R3 K3 + 0x7C040400, // 0004 CALL R1 2 + 0x80040200, // 0005 RET 1 R1 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: get_value_str +********************************************************************/ +be_local_closure(lvh_obj_get_value_str, /* name */ + be_nested_proto( + 3, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 1]) { /* constants */ + /* K0 */ be_nested_str_weak(get_text), + }), + be_str_weak(get_value_str), + &be_const_str_solidified, + ( &(const binstruction[ 3]) { /* code */ + 0x8C040100, // 0000 GETMET R1 R0 K0 + 0x7C040200, // 0001 CALL R1 1 + 0x80040200, // 0002 RET 1 R1 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: remove_trailing_zeroes +********************************************************************/ +be_local_closure(lvh_obj_remove_trailing_zeroes, /* name */ + be_nested_proto( + 8, /* nstack */ + 1, /* argc */ + 4, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 4]) { /* constants */ + /* K0 */ be_const_class(be_class_lvh_obj), + /* K1 */ be_const_int(0), + /* K2 */ be_const_int(1), + /* K3 */ be_nested_str_weak(resize), + }), + be_str_weak(remove_trailing_zeroes), + &be_const_str_solidified, + ( &(const binstruction[24]) { /* code */ + 0x58040000, // 0000 LDCONST R1 K0 + 0x6008000C, // 0001 GETGBL R2 G12 + 0x5C0C0000, // 0002 MOVE R3 R0 + 0x7C080200, // 0003 CALL R2 1 + 0x580C0001, // 0004 LDCONST R3 K1 + 0x14100602, // 0005 LT R4 R3 R2 + 0x78120007, // 0006 JMPF R4 #000F + 0x5411FFFE, // 0007 LDINT R4 -1 + 0x04100803, // 0008 SUB R4 R4 R3 + 0x94100004, // 0009 GETIDX R4 R0 R4 + 0x20100901, // 000A NE R4 R4 K1 + 0x78120000, // 000B JMPF R4 #000D + 0x70020001, // 000C JMP #000F + 0x000C0702, // 000D ADD R3 R3 K2 + 0x7001FFF5, // 000E JMP #0005 + 0x24100701, // 000F GT R4 R3 K1 + 0x78120005, // 0010 JMPF R4 #0017 + 0x8C100103, // 0011 GETMET R4 R0 K3 + 0x6018000C, // 0012 GETGBL R6 G12 + 0x5C1C0000, // 0013 MOVE R7 R0 + 0x7C180200, // 0014 CALL R6 1 + 0x04180C03, // 0015 SUB R6 R6 R3 + 0x7C100400, // 0016 CALL R4 2 + 0x80040000, // 0017 RET 1 R0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: set_click +********************************************************************/ +be_local_closure(lvh_obj_set_click, /* name */ + be_nested_proto( + 5, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 1]) { /* constants */ + /* K0 */ be_nested_str_weak(set_enabled), + }), + be_str_weak(set_click), + &be_const_str_solidified, + ( &(const binstruction[ 4]) { /* code */ + 0x8C080100, // 0000 GETMET R2 R0 K0 + 0x5C100200, // 0001 MOVE R4 R1 + 0x7C080400, // 0002 CALL R2 2 + 0x80000000, // 0003 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: get_text +********************************************************************/ +be_local_closure(lvh_obj_get_text, /* name */ + be_nested_proto( + 3, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 2]) { /* constants */ + /* K0 */ be_nested_str_weak(_lv_label), + /* K1 */ be_nested_str_weak(get_text), + }), + be_str_weak(get_text), + &be_const_str_solidified, + ( &(const binstruction[10]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x4C080000, // 0001 LDNIL R2 + 0x1C040202, // 0002 EQ R1 R1 R2 + 0x78060001, // 0003 JMPF R1 #0006 + 0x4C040000, // 0004 LDNIL R1 + 0x80040200, // 0005 RET 1 R1 + 0x88040100, // 0006 GETMBR R1 R0 K0 + 0x8C040301, // 0007 GETMET R1 R1 K1 + 0x7C040200, // 0008 CALL R1 1 + 0x80040200, // 0009 RET 1 R1 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: set_action +********************************************************************/ +be_local_closure(lvh_obj_set_action, /* name */ + be_nested_proto( + 4, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 1]) { /* constants */ + /* K0 */ be_nested_str_weak(_action), + }), + be_str_weak(set_action), + &be_const_str_solidified, + ( &(const binstruction[ 5]) { /* code */ + 0x60080008, // 0000 GETGBL R2 G8 + 0x5C0C0200, // 0001 MOVE R3 R1 + 0x7C080200, // 0002 CALL R2 1 + 0x90020002, // 0003 SETMBR R0 K0 R2 + 0x80000000, // 0004 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: setmember +********************************************************************/ +be_local_closure(lvh_obj_setmember, /* name */ + be_nested_proto( + 12, /* nstack */ + 3, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[19]) { /* constants */ + /* K0 */ be_nested_str_weak(string), + /* K1 */ be_nested_str_weak(introspect), + /* K2 */ be_const_int(0), + /* K3 */ be_const_int(3), + /* K4 */ be_nested_str_weak(set_), + /* K5 */ be_nested_str_weak(get_), + /* K6 */ be_nested_str_weak(_attr_ignore), + /* K7 */ be_nested_str_weak(find), + /* K8 */ be_nested_str_weak(get), + /* K9 */ be_nested_str_weak(function), + /* K10 */ be_nested_str_weak(_attr_map), + /* K11 */ be_nested_str_weak(contains), + /* K12 */ be_nested_str_weak(_lv_obj), + /* K13 */ be_nested_str_weak(is_color_attribute), + /* K14 */ be_nested_str_weak(parse_color), + /* K15 */ be_nested_str_weak(style_), + /* K16 */ be_nested_str_weak(_X20for_X20), + /* K17 */ be_nested_str_weak(HSP_X3A_X20Could_X20not_X20find_X20function_X20set_), + /* K18 */ be_nested_str_weak(HSP_X3A_X20unknown_X20attribute_X3A), + }), + be_str_weak(setmember), + &be_const_str_solidified, + ( &(const binstruction[93]) { /* code */ + 0xA40E0000, // 0000 IMPORT R3 K0 + 0xA4120200, // 0001 IMPORT R4 K1 + 0x40160503, // 0002 CONNECT R5 K2 K3 + 0x94140205, // 0003 GETIDX R5 R1 R5 + 0x1C180B04, // 0004 EQ R6 R5 K4 + 0x741A0001, // 0005 JMPT R6 #0008 + 0x1C180B05, // 0006 EQ R6 R5 K5 + 0x781A0000, // 0007 JMPF R6 #0009 + 0x80000C00, // 0008 RET 0 + 0x88180106, // 0009 GETMBR R6 R0 K6 + 0x8C180D07, // 000A GETMET R6 R6 K7 + 0x5C200200, // 000B MOVE R8 R1 + 0x7C180400, // 000C CALL R6 2 + 0x4C1C0000, // 000D LDNIL R7 + 0x20180C07, // 000E NE R6 R6 R7 + 0x781A0000, // 000F JMPF R6 #0011 + 0x80000C00, // 0010 RET 0 + 0x8C180908, // 0011 GETMET R6 R4 K8 + 0x5C200000, // 0012 MOVE R8 R0 + 0x00260801, // 0013 ADD R9 K4 R1 + 0x7C180600, // 0014 CALL R6 3 + 0x601C0004, // 0015 GETGBL R7 G4 + 0x5C200C00, // 0016 MOVE R8 R6 + 0x7C1C0200, // 0017 CALL R7 1 + 0x1C1C0F09, // 0018 EQ R7 R7 K9 + 0x781E0004, // 0019 JMPF R7 #001F + 0x5C1C0C00, // 001A MOVE R7 R6 + 0x5C200000, // 001B MOVE R8 R0 + 0x5C240400, // 001C MOVE R9 R2 + 0x7C1C0400, // 001D CALL R7 2 + 0x80000E00, // 001E RET 0 + 0x881C010A, // 001F GETMBR R7 R0 K10 + 0x8C1C0F0B, // 0020 GETMET R7 R7 K11 + 0x5C240200, // 0021 MOVE R9 R1 + 0x7C1C0400, // 0022 CALL R7 2 + 0x781E0033, // 0023 JMPF R7 #0058 + 0x881C010A, // 0024 GETMBR R7 R0 K10 + 0x941C0E01, // 0025 GETIDX R7 R7 R1 + 0x8C200908, // 0026 GETMET R8 R4 K8 + 0x8828010C, // 0027 GETMBR R10 R0 K12 + 0x002E0807, // 0028 ADD R11 K4 R7 + 0x7C200600, // 0029 CALL R8 3 + 0x5C181000, // 002A MOVE R6 R8 + 0x8C20010D, // 002B GETMET R8 R0 K13 + 0x5C280E00, // 002C MOVE R10 R7 + 0x7C200400, // 002D CALL R8 2 + 0x78220003, // 002E JMPF R8 #0033 + 0x8C20010E, // 002F GETMET R8 R0 K14 + 0x5C280400, // 0030 MOVE R10 R2 + 0x7C200400, // 0031 CALL R8 2 + 0x5C081000, // 0032 MOVE R2 R8 + 0x60200004, // 0033 GETGBL R8 G4 + 0x5C240C00, // 0034 MOVE R9 R6 + 0x7C200200, // 0035 CALL R8 1 + 0x1C201109, // 0036 EQ R8 R8 K9 + 0x7822001B, // 0037 JMPF R8 #0054 + 0xA8020011, // 0038 EXBLK 0 #004B + 0x8C200707, // 0039 GETMET R8 R3 K7 + 0x5C280E00, // 003A MOVE R10 R7 + 0x582C000F, // 003B LDCONST R11 K15 + 0x7C200600, // 003C CALL R8 3 + 0x1C201102, // 003D EQ R8 R8 K2 + 0x78220005, // 003E JMPF R8 #0045 + 0x5C200C00, // 003F MOVE R8 R6 + 0x8824010C, // 0040 GETMBR R9 R0 K12 + 0x5C280400, // 0041 MOVE R10 R2 + 0x582C0002, // 0042 LDCONST R11 K2 + 0x7C200600, // 0043 CALL R8 3 + 0x70020003, // 0044 JMP #0049 + 0x5C200C00, // 0045 MOVE R8 R6 + 0x8824010C, // 0046 GETMBR R9 R0 K12 + 0x5C280400, // 0047 MOVE R10 R2 + 0x7C200400, // 0048 CALL R8 2 + 0xA8040001, // 0049 EXBLK 1 1 + 0x70020006, // 004A JMP #0052 + 0xAC200002, // 004B CATCH R8 0 2 + 0x70020003, // 004C JMP #0051 + 0x00281310, // 004D ADD R10 R9 K16 + 0x00281401, // 004E ADD R10 R10 R1 + 0xB004100A, // 004F RAISE 1 R8 R10 + 0x70020000, // 0050 JMP #0052 + 0xB0080000, // 0051 RAISE 2 R0 R0 + 0x80001000, // 0052 RET 0 + 0x70020002, // 0053 JMP #0057 + 0x60200001, // 0054 GETGBL R8 G1 + 0x00262207, // 0055 ADD R9 K17 R7 + 0x7C200200, // 0056 CALL R8 1 + 0x70020003, // 0057 JMP #005C + 0x601C0001, // 0058 GETGBL R7 G1 + 0x58200012, // 0059 LDCONST R8 K18 + 0x5C240200, // 005A MOVE R9 R1 + 0x7C1C0400, // 005B CALL R7 2 + 0x80000000, // 005C RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: set_text_rule +********************************************************************/ +be_local_closure(lvh_obj_set_text_rule, /* name */ + be_nested_proto( + 7, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 1, /* has sup protos */ + ( &(const struct bproto*[ 1]) { + be_nested_proto( + 4, /* nstack */ + 1, /* argc */ + 0, /* varg */ + 1, /* has upvals */ + ( &(const bupvaldesc[ 1]) { /* upvals */ + be_local_const_upval(1, 0), + }), + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 1]) { /* constants */ + /* K0 */ be_nested_str_weak(text_rule_matched), + }), + be_str_weak(_X3Clambda_X3E), + &be_const_str_solidified, + ( &(const binstruction[ 5]) { /* code */ + 0x68040000, // 0000 GETUPV R1 U0 + 0x8C040300, // 0001 GETMET R1 R1 K0 + 0x5C0C0000, // 0002 MOVE R3 R0 + 0x7C040400, // 0003 CALL R1 2 + 0x80040200, // 0004 RET 1 R1 + }) + ), + }), + 1, /* has constants */ + ( &(const bvalue[ 4]) { /* constants */ + /* K0 */ be_nested_str_weak(_text_rule), + /* K1 */ be_nested_str_weak(tasmota), + /* K2 */ be_nested_str_weak(remove_rule), + /* K3 */ be_nested_str_weak(add_rule), + }), + be_str_weak(set_text_rule), + &be_const_str_solidified, + ( &(const binstruction[21]) { /* code */ + 0x88080100, // 0000 GETMBR R2 R0 K0 + 0x4C0C0000, // 0001 LDNIL R3 + 0x20080403, // 0002 NE R2 R2 R3 + 0x780A0004, // 0003 JMPF R2 #0009 + 0xB80A0200, // 0004 GETNGBL R2 K1 + 0x8C080502, // 0005 GETMET R2 R2 K2 + 0x88100100, // 0006 GETMBR R4 R0 K0 + 0x5C140000, // 0007 MOVE R5 R0 + 0x7C080600, // 0008 CALL R2 3 + 0x60080008, // 0009 GETGBL R2 G8 + 0x5C0C0200, // 000A MOVE R3 R1 + 0x7C080200, // 000B CALL R2 1 + 0x90020002, // 000C SETMBR R0 K0 R2 + 0xB80A0200, // 000D GETNGBL R2 K1 + 0x8C080503, // 000E GETMET R2 R2 K3 + 0x88100100, // 000F GETMBR R4 R0 K0 + 0x84140000, // 0010 CLOSURE R5 P0 + 0x5C180000, // 0011 MOVE R6 R0 + 0x7C080800, // 0012 CALL R2 4 + 0xA0000000, // 0013 CLOSE R0 + 0x80000000, // 0014 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: get_adjustable +********************************************************************/ +be_local_closure(lvh_obj_get_adjustable, /* name */ + be_nested_proto( + 4, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 4]) { /* constants */ + /* K0 */ be_nested_str_weak(_lv_obj), + /* K1 */ be_nested_str_weak(has_flag), + /* K2 */ be_nested_str_weak(lv), + /* K3 */ be_nested_str_weak(OBJ_FLAG_CLICKABLE), + }), + be_str_weak(get_adjustable), + &be_const_str_solidified, + ( &(const binstruction[ 6]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x8C040301, // 0001 GETMET R1 R1 K1 + 0xB80E0400, // 0002 GETNGBL R3 K2 + 0x880C0703, // 0003 GETMBR R3 R3 K3 + 0x7C040400, // 0004 CALL R1 2 + 0x80040200, // 0005 RET 1 R1 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: get_pad_all +********************************************************************/ +be_local_closure(lvh_obj_get_pad_all, /* name */ + be_nested_proto( + 1, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 0, /* has constants */ + NULL, /* no const */ + be_str_weak(get_pad_all), + &be_const_str_solidified, + ( &(const binstruction[ 1]) { /* code */ + 0x80000000, // 0000 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: set_radius2 +********************************************************************/ +be_local_closure(lvh_obj_set_radius2, /* name */ + be_nested_proto( + 7, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 5]) { /* constants */ + /* K0 */ be_nested_str_weak(_lv_part2_selector), + /* K1 */ be_nested_str_weak(_lv_obj), + /* K2 */ be_nested_str_weak(set_style_radius), + /* K3 */ be_nested_str_weak(lv), + /* K4 */ be_nested_str_weak(STATE_DEFAULT), + }), + be_str_weak(set_radius2), + &be_const_str_solidified, + ( &(const binstruction[15]) { /* code */ + 0x88080100, // 0000 GETMBR R2 R0 K0 + 0x4C0C0000, // 0001 LDNIL R3 + 0x20080403, // 0002 NE R2 R2 R3 + 0x780A0009, // 0003 JMPF R2 #000E + 0x88080101, // 0004 GETMBR R2 R0 K1 + 0x8C080502, // 0005 GETMET R2 R2 K2 + 0x60100009, // 0006 GETGBL R4 G9 + 0x5C140200, // 0007 MOVE R5 R1 + 0x7C100200, // 0008 CALL R4 1 + 0x88140100, // 0009 GETMBR R5 R0 K0 + 0xB81A0600, // 000A GETNGBL R6 K3 + 0x88180D04, // 000B GETMBR R6 R6 K4 + 0x30140A06, // 000C OR R5 R5 R6 + 0x7C080600, // 000D CALL R2 3 + 0x80000000, // 000E RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: set_value_ofs_y +********************************************************************/ +be_local_closure(lvh_obj_set_value_ofs_y, /* name */ + be_nested_proto( + 6, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 3]) { /* constants */ + /* K0 */ be_nested_str_weak(check_label), + /* K1 */ be_nested_str_weak(_lv_label), + /* K2 */ be_nested_str_weak(set_y), + }), + be_str_weak(set_value_ofs_y), + &be_const_str_solidified, + ( &(const binstruction[ 9]) { /* code */ + 0x8C080100, // 0000 GETMET R2 R0 K0 + 0x7C080200, // 0001 CALL R2 1 + 0x88080101, // 0002 GETMBR R2 R0 K1 + 0x8C080502, // 0003 GETMET R2 R2 K2 + 0x60100009, // 0004 GETGBL R4 G9 + 0x5C140200, // 0005 MOVE R5 R1 + 0x7C100200, // 0006 CALL R4 1 + 0x7C080400, // 0007 CALL R2 2 + 0x80000000, // 0008 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: set_value_str +********************************************************************/ +be_local_closure(lvh_obj_set_value_str, /* name */ + be_nested_proto( + 5, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 1]) { /* constants */ + /* K0 */ be_nested_str_weak(set_text), + }), + be_str_weak(set_value_str), + &be_const_str_solidified, + ( &(const binstruction[ 4]) { /* code */ + 0x8C080100, // 0000 GETMET R2 R0 K0 + 0x5C100200, // 0001 MOVE R4 R1 + 0x7C080400, // 0002 CALL R2 2 + 0x80000000, // 0003 RET 0 + }) + ) +); +/*******************************************************************/ + + /******************************************************************** ** Solidified function: set_text_font ********************************************************************/ @@ -1910,199 +3009,65 @@ be_local_closure(lvh_obj_set_text_font, /* name */ /******************************************************************** -** Solidified function: event_cb +** Solidified function: set_align ********************************************************************/ -be_local_closure(lvh_obj_event_cb, /* name */ +be_local_closure(lvh_obj_set_align, /* name */ be_nested_proto( - 14, /* nstack */ + 7, /* nstack */ 2, /* argc */ 2, /* varg */ 0, /* has upvals */ NULL, /* no upvals */ - 1, /* has sup protos */ - ( &(const struct bproto*[ 2]) { - be_nested_proto( - 4, /* nstack */ - 0, /* argc */ - 0, /* varg */ - 1, /* has upvals */ - ( &(const bupvaldesc[ 3]) { /* upvals */ - be_local_const_upval(1, 2), - be_local_const_upval(1, 0), - be_local_const_upval(1, 3), - }), - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 1]) { /* constants */ - /* K0 */ be_nested_str_weak(do_action), - }), - be_str_weak(_X3Clambda_X3E), - &be_const_str_solidified, - ( &(const binstruction[ 6]) { /* code */ - 0x68000000, // 0000 GETUPV R0 U0 - 0x8C000100, // 0001 GETMET R0 R0 K0 - 0x68080001, // 0002 GETUPV R2 U1 - 0x680C0002, // 0003 GETUPV R3 U2 - 0x7C000600, // 0004 CALL R0 3 - 0x80040000, // 0005 RET 1 R0 - }) - ), - be_nested_proto( - 3, /* nstack */ - 0, /* argc */ - 0, /* varg */ - 1, /* has upvals */ - ( &(const bupvaldesc[ 1]) { /* upvals */ - be_local_const_upval(1, 7), - }), - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 2]) { /* constants */ - /* K0 */ be_nested_str_weak(tasmota), - /* K1 */ be_nested_str_weak(publish_rule), - }), - be_str_weak(_X3Clambda_X3E), - &be_const_str_solidified, - ( &(const binstruction[ 5]) { /* code */ - 0xB8020000, // 0000 GETNGBL R0 K0 - 0x8C000101, // 0001 GETMET R0 R0 K1 - 0x68080000, // 0002 GETUPV R2 U0 - 0x7C000400, // 0003 CALL R0 2 - 0x80040000, // 0004 RET 1 R0 - }) - ), - }), - 1, /* has constants */ - ( &(const bvalue[24]) { /* constants */ - /* K0 */ be_nested_str_weak(_page), - /* K1 */ be_nested_str_weak(_oh), - /* K2 */ be_nested_str_weak(code), - /* K3 */ be_nested_str_weak(action), - /* K4 */ be_nested_str_weak(), - /* K5 */ be_nested_str_weak(lv), - /* K6 */ be_nested_str_weak(EVENT_CLICKED), - /* K7 */ be_nested_str_weak(tasmota), - /* K8 */ be_nested_str_weak(set_timer), - /* K9 */ be_const_int(0), - /* K10 */ be_nested_str_weak(_event_map), - /* K11 */ be_nested_str_weak(find), - /* K12 */ be_nested_str_weak(string), - /* K13 */ be_nested_str_weak(EVENT_VALUE_CHANGED), - /* K14 */ be_nested_str_weak(val), - /* K15 */ be_nested_str_weak(format), - /* K16 */ be_nested_str_weak(_X2C_X22val_X22_X3A_X25i), - /* K17 */ be_nested_str_weak(text), - /* K18 */ be_nested_str_weak(json), - /* K19 */ be_nested_str_weak(_X2C_X22text_X22_X3A), - /* K20 */ be_nested_str_weak(dump), - /* K21 */ be_nested_str_weak(_X7B_X22hasp_X22_X3A_X7B_X22p_X25ib_X25i_X22_X3A_X7B_X22event_X22_X3A_X22_X25s_X22_X25s_X7D_X7D_X7D), - /* K22 */ be_nested_str_weak(_page_id), - /* K23 */ be_nested_str_weak(id), - }), - be_str_weak(event_cb), - &be_const_str_solidified, - ( &(const binstruction[71]) { /* code */ - 0x88080100, // 0000 GETMBR R2 R0 K0 - 0x88080501, // 0001 GETMBR R2 R2 K1 - 0x880C0302, // 0002 GETMBR R3 R1 K2 - 0x88100103, // 0003 GETMBR R4 R0 K3 - 0x20100904, // 0004 NE R4 R4 K4 - 0x78120008, // 0005 JMPF R4 #000F - 0xB8120A00, // 0006 GETNGBL R4 K5 - 0x88100906, // 0007 GETMBR R4 R4 K6 - 0x1C100604, // 0008 EQ R4 R3 R4 - 0x78120004, // 0009 JMPF R4 #000F - 0xB8120E00, // 000A GETNGBL R4 K7 - 0x8C100908, // 000B GETMET R4 R4 K8 - 0x58180009, // 000C LDCONST R6 K9 - 0x841C0000, // 000D CLOSURE R7 P0 - 0x7C100600, // 000E CALL R4 3 - 0x8810010A, // 000F GETMBR R4 R0 K10 - 0x8C10090B, // 0010 GETMET R4 R4 K11 - 0x5C180600, // 0011 MOVE R6 R3 - 0x7C100400, // 0012 CALL R4 2 - 0x4C140000, // 0013 LDNIL R5 - 0x20140805, // 0014 NE R5 R4 R5 - 0x7816002E, // 0015 JMPF R5 #0045 - 0xA4161800, // 0016 IMPORT R5 K12 - 0x58180004, // 0017 LDCONST R6 K4 - 0x881C0302, // 0018 GETMBR R7 R1 K2 - 0xB8220A00, // 0019 GETNGBL R8 K5 - 0x8820110D, // 001A GETMBR R8 R8 K13 - 0x1C1C0E08, // 001B EQ R7 R7 R8 - 0x781E0019, // 001C JMPF R7 #0037 - 0xA8020014, // 001D EXBLK 0 #0033 - 0x881C010E, // 001E GETMBR R7 R0 K14 - 0x4C200000, // 001F LDNIL R8 - 0x20200E08, // 0020 NE R8 R7 R8 - 0x78220004, // 0021 JMPF R8 #0027 - 0x8C200B0F, // 0022 GETMET R8 R5 K15 - 0x58280010, // 0023 LDCONST R10 K16 - 0x5C2C0E00, // 0024 MOVE R11 R7 - 0x7C200600, // 0025 CALL R8 3 - 0x5C181000, // 0026 MOVE R6 R8 - 0x88200111, // 0027 GETMBR R8 R0 K17 - 0x4C240000, // 0028 LDNIL R9 - 0x20241009, // 0029 NE R9 R8 R9 - 0x78260005, // 002A JMPF R9 #0031 - 0xA4262400, // 002B IMPORT R9 K18 - 0x00180D13, // 002C ADD R6 R6 K19 - 0x8C281314, // 002D GETMET R10 R9 K20 - 0x5C301000, // 002E MOVE R12 R8 - 0x7C280400, // 002F CALL R10 2 - 0x00180C0A, // 0030 ADD R6 R6 R10 - 0xA8040001, // 0031 EXBLK 1 1 - 0x70020003, // 0032 JMP #0037 - 0xAC1C0000, // 0033 CATCH R7 0 0 - 0x70020000, // 0034 JMP #0036 - 0x70020000, // 0035 JMP #0037 - 0xB0080000, // 0036 RAISE 2 R0 R0 - 0x8C1C0B0F, // 0037 GETMET R7 R5 K15 - 0x58240015, // 0038 LDCONST R9 K21 - 0x88280100, // 0039 GETMBR R10 R0 K0 - 0x88281516, // 003A GETMBR R10 R10 K22 - 0x882C0117, // 003B GETMBR R11 R0 K23 - 0x5C300800, // 003C MOVE R12 R4 - 0x5C340C00, // 003D MOVE R13 R6 - 0x7C1C0C00, // 003E CALL R7 6 - 0xB8220E00, // 003F GETNGBL R8 K7 - 0x8C201108, // 0040 GETMET R8 R8 K8 - 0x58280009, // 0041 LDCONST R10 K9 - 0x842C0001, // 0042 CLOSURE R11 P1 - 0x7C200600, // 0043 CALL R8 3 - 0xA0140000, // 0044 CLOSE R5 - 0xA0000000, // 0045 CLOSE R0 - 0x80000000, // 0046 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: get_value_color -********************************************************************/ -be_local_closure(lvh_obj_get_value_color, /* name */ - be_nested_proto( - 3, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[ 1]) { /* constants */ - /* K0 */ be_nested_str_weak(get_value_color), + ( &(const bvalue[13]) { /* constants */ + /* K0 */ be_nested_str_weak(check_label), + /* K1 */ be_const_int(0), + /* K2 */ be_nested_str_weak(left), + /* K3 */ be_nested_str_weak(lv), + /* K4 */ be_nested_str_weak(TEXT_ALIGN_LEFT), + /* K5 */ be_const_int(1), + /* K6 */ be_nested_str_weak(center), + /* K7 */ be_nested_str_weak(TEXT_ALIGN_CENTER), + /* K8 */ be_const_int(2), + /* K9 */ be_nested_str_weak(right), + /* K10 */ be_nested_str_weak(TEXT_ALIGN_RIGHT), + /* K11 */ be_nested_str_weak(_lv_label), + /* K12 */ be_nested_str_weak(set_style_text_align), }), - be_str_weak(get_value_color), + be_str_weak(set_align), &be_const_str_solidified, - ( &(const binstruction[ 3]) { /* code */ - 0x8C040100, // 0000 GETMET R1 R0 K0 - 0x7C040200, // 0001 CALL R1 1 - 0x80040200, // 0002 RET 1 R1 + ( &(const binstruction[29]) { /* code */ + 0x4C080000, // 0000 LDNIL R2 + 0x8C0C0100, // 0001 GETMET R3 R0 K0 + 0x7C0C0200, // 0002 CALL R3 1 + 0x1C0C0301, // 0003 EQ R3 R1 K1 + 0x740E0001, // 0004 JMPT R3 #0007 + 0x1C0C0302, // 0005 EQ R3 R1 K2 + 0x780E0002, // 0006 JMPF R3 #000A + 0xB80E0600, // 0007 GETNGBL R3 K3 + 0x88080704, // 0008 GETMBR R2 R3 K4 + 0x7002000C, // 0009 JMP #0017 + 0x1C0C0305, // 000A EQ R3 R1 K5 + 0x740E0001, // 000B JMPT R3 #000E + 0x1C0C0306, // 000C EQ R3 R1 K6 + 0x780E0002, // 000D JMPF R3 #0011 + 0xB80E0600, // 000E GETNGBL R3 K3 + 0x88080707, // 000F GETMBR R2 R3 K7 + 0x70020005, // 0010 JMP #0017 + 0x1C0C0308, // 0011 EQ R3 R1 K8 + 0x740E0001, // 0012 JMPT R3 #0015 + 0x1C0C0309, // 0013 EQ R3 R1 K9 + 0x780E0001, // 0014 JMPF R3 #0017 + 0xB80E0600, // 0015 GETNGBL R3 K3 + 0x8808070A, // 0016 GETMBR R2 R3 K10 + 0x880C010B, // 0017 GETMBR R3 R0 K11 + 0x8C0C070C, // 0018 GETMET R3 R3 K12 + 0x5C140400, // 0019 MOVE R5 R2 + 0x58180001, // 001A LDCONST R6 K1 + 0x7C0C0600, // 001B CALL R3 3 + 0x80000000, // 001C RET 0 }) ) ); @@ -2110,9 +3075,125 @@ be_local_closure(lvh_obj_get_value_color, /* name */ /******************************************************************** -** Solidified function: get_val_rule +** Solidified function: text_rule_matched ********************************************************************/ -be_local_closure(lvh_obj_get_val_rule, /* name */ +be_local_closure(lvh_obj_text_rule_matched, /* name */ + be_nested_proto( + 12, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 8]) { /* constants */ + /* K0 */ be_nested_str_weak(int), + /* K1 */ be_nested_str_weak(_text_rule_function), + /* K2 */ be_nested_str_weak(string), + /* K3 */ be_nested_str_weak(format), + /* K4 */ be_nested_str_weak(HSP_X3A_X20failed_X20to_X20run_X20self_X2E_text_rule_function_X20_X2D_X20_X25s_X20_X28_X25s_X29), + /* K5 */ be_nested_str_weak(_text_rule_format), + /* K6 */ be_nested_str_weak(), + /* K7 */ be_nested_str_weak(text), + }), + be_str_weak(text_rule_matched), + &be_const_str_solidified, + ( &(const binstruction[49]) { /* code */ + 0x60080004, // 0000 GETGBL R2 G4 + 0x5C0C0200, // 0001 MOVE R3 R1 + 0x7C080200, // 0002 CALL R2 1 + 0x1C080500, // 0003 EQ R2 R2 K0 + 0x780A0003, // 0004 JMPF R2 #0009 + 0x6008000A, // 0005 GETGBL R2 G10 + 0x5C0C0200, // 0006 MOVE R3 R1 + 0x7C080200, // 0007 CALL R2 1 + 0x5C040400, // 0008 MOVE R1 R2 + 0x88080101, // 0009 GETMBR R2 R0 K1 + 0x4C0C0000, // 000A LDNIL R3 + 0x200C0403, // 000B NE R3 R2 R3 + 0x780E0012, // 000C JMPF R3 #0020 + 0xA8020005, // 000D EXBLK 0 #0014 + 0x5C0C0400, // 000E MOVE R3 R2 + 0x5C100200, // 000F MOVE R4 R1 + 0x7C0C0200, // 0010 CALL R3 1 + 0x5C040600, // 0011 MOVE R1 R3 + 0xA8040001, // 0012 EXBLK 1 1 + 0x7002000B, // 0013 JMP #0020 + 0xAC0C0002, // 0014 CATCH R3 0 2 + 0x70020008, // 0015 JMP #001F + 0xA4160400, // 0016 IMPORT R5 K2 + 0x60180001, // 0017 GETGBL R6 G1 + 0x8C1C0B03, // 0018 GETMET R7 R5 K3 + 0x58240004, // 0019 LDCONST R9 K4 + 0x5C280600, // 001A MOVE R10 R3 + 0x5C2C0800, // 001B MOVE R11 R4 + 0x7C1C0800, // 001C CALL R7 4 + 0x7C180200, // 001D CALL R6 1 + 0x70020000, // 001E JMP #0020 + 0xB0080000, // 001F RAISE 2 R0 R0 + 0x880C0105, // 0020 GETMBR R3 R0 K5 + 0x60100004, // 0021 GETGBL R4 G4 + 0x5C140600, // 0022 MOVE R5 R3 + 0x7C100200, // 0023 CALL R4 1 + 0x1C100902, // 0024 EQ R4 R4 K2 + 0x78120006, // 0025 JMPF R4 #002D + 0xA4120400, // 0026 IMPORT R4 K2 + 0x8C140903, // 0027 GETMET R5 R4 K3 + 0x5C1C0600, // 0028 MOVE R7 R3 + 0x5C200200, // 0029 MOVE R8 R1 + 0x7C140600, // 002A CALL R5 3 + 0x5C0C0A00, // 002B MOVE R3 R5 + 0x70020000, // 002C JMP #002E + 0x580C0006, // 002D LDCONST R3 K6 + 0x90020E03, // 002E SETMBR R0 K7 R3 + 0x50100000, // 002F LDBOOL R4 0 0 + 0x80040800, // 0030 RET 1 R4 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: set_line_width +********************************************************************/ +be_local_closure(lvh_obj_set_line_width, /* name */ + be_nested_proto( + 6, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 3]) { /* constants */ + /* K0 */ be_nested_str_weak(_lv_obj), + /* K1 */ be_nested_str_weak(set_style_line_width), + /* K2 */ be_const_int(0), + }), + be_str_weak(set_line_width), + &be_const_str_solidified, + ( &(const binstruction[ 8]) { /* code */ + 0x88080100, // 0000 GETMBR R2 R0 K0 + 0x8C080501, // 0001 GETMET R2 R2 K1 + 0x60100009, // 0002 GETGBL R4 G9 + 0x5C140200, // 0003 MOVE R5 R1 + 0x7C100200, // 0004 CALL R4 1 + 0x58140002, // 0005 LDCONST R5 K2 + 0x7C080600, // 0006 CALL R2 3 + 0x80000000, // 0007 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: get_val_rule_formula +********************************************************************/ +be_local_closure(lvh_obj_get_val_rule_formula, /* name */ be_nested_proto( 2, /* nstack */ 1, /* argc */ @@ -2123,9 +3204,9 @@ be_local_closure(lvh_obj_get_val_rule, /* name */ NULL, /* no sub protos */ 1, /* has constants */ ( &(const bvalue[ 1]) { /* constants */ - /* K0 */ be_nested_str_weak(_val_rule), + /* K0 */ be_nested_str_weak(_val_rule_formula), }), - be_str_weak(get_val_rule), + be_str_weak(get_val_rule_formula), &be_const_str_solidified, ( &(const binstruction[ 2]) { /* code */ 0x88040100, // 0000 GETMBR R1 R0 K0 @@ -2137,69 +3218,11 @@ be_local_closure(lvh_obj_get_val_rule, /* name */ /******************************************************************** -** Solidified function: get_val +** Solidified function: set_val_rule_formula ********************************************************************/ -be_local_closure(lvh_obj_get_val, /* name */ +be_local_closure(lvh_obj_set_val_rule_formula, /* name */ be_nested_proto( - 3, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 2]) { /* constants */ - /* K0 */ be_nested_str_weak(_lv_obj), - /* K1 */ be_nested_str_weak(get_value), - }), - be_str_weak(get_val), - &be_const_str_solidified, - ( &(const binstruction[ 4]) { /* code */ - 0x88040100, // 0000 GETMBR R1 R0 K0 - 0x8C040301, // 0001 GETMET R1 R1 K1 - 0x7C040200, // 0002 CALL R1 1 - 0x80040200, // 0003 RET 1 R1 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: get_click -********************************************************************/ -be_local_closure(lvh_obj_get_click, /* name */ - be_nested_proto( - 3, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 1]) { /* constants */ - /* K0 */ be_nested_str_weak(get_enabled), - }), - be_str_weak(get_click), - &be_const_str_solidified, - ( &(const binstruction[ 3]) { /* code */ - 0x8C040100, // 0000 GETMET R1 R0 K0 - 0x7C040200, // 0001 CALL R1 1 - 0x80040200, // 0002 RET 1 R1 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: set_click -********************************************************************/ -be_local_closure(lvh_obj_set_click, /* name */ - be_nested_proto( - 5, /* nstack */ + 13, /* nstack */ 2, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -2207,16 +3230,181 @@ be_local_closure(lvh_obj_set_click, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[ 1]) { /* constants */ - /* K0 */ be_nested_str_weak(set_enabled), + ( &(const bvalue[ 7]) { /* constants */ + /* K0 */ be_nested_str_weak(_val_rule_formula), + /* K1 */ be_nested_str_weak(return_X20_X2F_X20val_X20_X2D_X3E_X20_X28), + /* K2 */ be_nested_str_weak(_X29), + /* K3 */ be_nested_str_weak(_val_rule_function), + /* K4 */ be_nested_str_weak(string), + /* K5 */ be_nested_str_weak(format), + /* K6 */ be_nested_str_weak(HSP_X3A_X20failed_X20to_X20compile_X20_X27_X25s_X27_X20_X2D_X20_X25s_X20_X28_X25s_X29), }), - be_str_weak(set_click), + be_str_weak(set_val_rule_formula), &be_const_str_solidified, - ( &(const binstruction[ 4]) { /* code */ + ( &(const binstruction[30]) { /* code */ + 0x60080008, // 0000 GETGBL R2 G8 + 0x5C0C0200, // 0001 MOVE R3 R1 + 0x7C080200, // 0002 CALL R2 1 + 0x90020002, // 0003 SETMBR R0 K0 R2 + 0x88080100, // 0004 GETMBR R2 R0 K0 + 0x000A0202, // 0005 ADD R2 K1 R2 + 0x00080502, // 0006 ADD R2 R2 K2 + 0xA8020007, // 0007 EXBLK 0 #0010 + 0x600C000D, // 0008 GETGBL R3 G13 + 0x5C100400, // 0009 MOVE R4 R2 + 0x7C0C0200, // 000A CALL R3 1 + 0x5C100600, // 000B MOVE R4 R3 + 0x7C100000, // 000C CALL R4 0 + 0x90020604, // 000D SETMBR R0 K3 R4 + 0xA8040001, // 000E EXBLK 1 1 + 0x7002000C, // 000F JMP #001D + 0xAC0C0002, // 0010 CATCH R3 0 2 + 0x70020009, // 0011 JMP #001C + 0xA4160800, // 0012 IMPORT R5 K4 + 0x60180001, // 0013 GETGBL R6 G1 + 0x8C1C0B05, // 0014 GETMET R7 R5 K5 + 0x58240006, // 0015 LDCONST R9 K6 + 0x5C280400, // 0016 MOVE R10 R2 + 0x5C2C0600, // 0017 MOVE R11 R3 + 0x5C300800, // 0018 MOVE R12 R4 + 0x7C1C0A00, // 0019 CALL R7 5 + 0x7C180200, // 001A CALL R6 1 + 0x70020000, // 001B JMP #001D + 0xB0080000, // 001C RAISE 2 R0 R0 + 0x80000000, // 001D RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: set_value_ofs_x +********************************************************************/ +be_local_closure(lvh_obj_set_value_ofs_x, /* name */ + be_nested_proto( + 6, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 3]) { /* constants */ + /* K0 */ be_nested_str_weak(check_label), + /* K1 */ be_nested_str_weak(_lv_label), + /* K2 */ be_nested_str_weak(set_x), + }), + be_str_weak(set_value_ofs_x), + &be_const_str_solidified, + ( &(const binstruction[ 9]) { /* code */ 0x8C080100, // 0000 GETMET R2 R0 K0 - 0x5C100200, // 0001 MOVE R4 R1 - 0x7C080400, // 0002 CALL R2 2 - 0x80000000, // 0003 RET 0 + 0x7C080200, // 0001 CALL R2 1 + 0x88080101, // 0002 GETMBR R2 R0 K1 + 0x8C080502, // 0003 GETMET R2 R2 K2 + 0x60100009, // 0004 GETGBL R4 G9 + 0x5C140200, // 0005 MOVE R5 R1 + 0x7C100200, // 0006 CALL R4 1 + 0x7C080400, // 0007 CALL R2 2 + 0x80000000, // 0008 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: get_pad_left +********************************************************************/ +be_local_closure(lvh_obj_get_pad_left, /* name */ + be_nested_proto( + 5, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 5]) { /* constants */ + /* K0 */ be_nested_str_weak(_lv_part2_selector), + /* K1 */ be_nested_str_weak(_lv_obj), + /* K2 */ be_nested_str_weak(get_style_pad_left), + /* K3 */ be_nested_str_weak(lv), + /* K4 */ be_nested_str_weak(STATE_DEFAULT), + }), + be_str_weak(get_pad_left), + &be_const_str_solidified, + ( &(const binstruction[13]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x4C080000, // 0001 LDNIL R2 + 0x20040202, // 0002 NE R1 R1 R2 + 0x78060007, // 0003 JMPF R1 #000C + 0x88040101, // 0004 GETMBR R1 R0 K1 + 0x8C040302, // 0005 GETMET R1 R1 K2 + 0x880C0100, // 0006 GETMBR R3 R0 K0 + 0xB8120600, // 0007 GETNGBL R4 K3 + 0x88100904, // 0008 GETMBR R4 R4 K4 + 0x300C0604, // 0009 OR R3 R3 R4 + 0x7C040400, // 000A CALL R1 2 + 0x80040200, // 000B RET 1 R1 + 0x80000000, // 000C RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: post_init +********************************************************************/ +be_local_closure(lvh_obj_post_init, /* name */ + be_nested_proto( + 3, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 1]) { /* constants */ + /* K0 */ be_nested_str_weak(register_event_cb), + }), + be_str_weak(post_init), + &be_const_str_solidified, + ( &(const binstruction[ 3]) { /* code */ + 0x8C040100, // 0000 GETMET R1 R0 K0 + 0x7C040200, // 0001 CALL R1 1 + 0x80000000, // 0002 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: get_text_rule_format +********************************************************************/ +be_local_closure(lvh_obj_get_text_rule_format, /* name */ + be_nested_proto( + 2, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 1]) { /* constants */ + /* K0 */ be_nested_str_weak(_text_rule_format), + }), + be_str_weak(get_text_rule_format), + &be_const_str_solidified, + ( &(const binstruction[ 2]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x80040200, // 0001 RET 1 R1 }) ) ); @@ -2333,11 +3521,50 @@ be_local_closure(lvh_obj_member, /* name */ /******************************************************************** -** Solidified function: get_text_rule_formula +** Solidified function: is_color_attribute ********************************************************************/ -be_local_closure(lvh_obj_get_text_rule_formula, /* name */ +be_local_closure(lvh_obj_is_color_attribute, /* name */ be_nested_proto( - 2, /* nstack */ + 9, /* nstack */ + 1, /* argc */ + 4, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 4]) { /* constants */ + /* K0 */ be_const_class(be_class_lvh_obj), + /* K1 */ be_nested_str_weak(re), + /* K2 */ be_nested_str_weak(search), + /* K3 */ be_nested_str_weak(color_X24), + }), + be_str_weak(is_color_attribute), + &be_const_str_solidified, + ( &(const binstruction[11]) { /* code */ + 0x58040000, // 0000 LDCONST R1 K0 + 0xA40A0200, // 0001 IMPORT R2 K1 + 0x600C0017, // 0002 GETGBL R3 G23 + 0x8C100502, // 0003 GETMET R4 R2 K2 + 0x58180003, // 0004 LDCONST R6 K3 + 0x601C0008, // 0005 GETGBL R7 G8 + 0x5C200000, // 0006 MOVE R8 R0 + 0x7C1C0200, // 0007 CALL R7 1 + 0x7C100600, // 0008 CALL R4 3 + 0x7C0C0200, // 0009 CALL R3 1 + 0x80040600, // 000A RET 1 R3 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: get_val +********************************************************************/ +be_local_closure(lvh_obj_get_val, /* name */ + be_nested_proto( + 3, /* nstack */ 1, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -2345,14 +3572,83 @@ be_local_closure(lvh_obj_get_text_rule_formula, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[ 1]) { /* constants */ - /* K0 */ be_nested_str_weak(_text_rule_formula), + ( &(const bvalue[ 2]) { /* constants */ + /* K0 */ be_nested_str_weak(_lv_obj), + /* K1 */ be_nested_str_weak(get_value), }), - be_str_weak(get_text_rule_formula), + be_str_weak(get_val), &be_const_str_solidified, - ( &(const binstruction[ 2]) { /* code */ + ( &(const binstruction[ 4]) { /* code */ 0x88040100, // 0000 GETMBR R1 R0 K0 - 0x80040200, // 0001 RET 1 R1 + 0x8C040301, // 0001 GETMET R1 R1 K1 + 0x7C040200, // 0002 CALL R1 1 + 0x80040200, // 0003 RET 1 R1 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: get_mode +********************************************************************/ +be_local_closure(lvh_obj_get_mode, /* name */ + be_nested_proto( + 1, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 0, /* has constants */ + NULL, /* no const */ + be_str_weak(get_mode), + &be_const_str_solidified, + ( &(const binstruction[ 1]) { /* code */ + 0x80000000, // 0000 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: get_pad_right +********************************************************************/ +be_local_closure(lvh_obj_get_pad_right, /* name */ + be_nested_proto( + 5, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 5]) { /* constants */ + /* K0 */ be_nested_str_weak(_lv_part2_selector), + /* K1 */ be_nested_str_weak(_lv_obj), + /* K2 */ be_nested_str_weak(get_style_pad_right), + /* K3 */ be_nested_str_weak(lv), + /* K4 */ be_nested_str_weak(STATE_DEFAULT), + }), + be_str_weak(get_pad_right), + &be_const_str_solidified, + ( &(const binstruction[13]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x4C080000, // 0001 LDNIL R2 + 0x20040202, // 0002 NE R1 R1 R2 + 0x78060007, // 0003 JMPF R1 #000C + 0x88040101, // 0004 GETMBR R1 R0 K1 + 0x8C040302, // 0005 GETMET R1 R1 K2 + 0x880C0100, // 0006 GETMBR R3 R0 K0 + 0xB8120600, // 0007 GETNGBL R4 K3 + 0x88100904, // 0008 GETMBR R4 R4 K4 + 0x300C0604, // 0009 OR R3 R3 R4 + 0x7C040400, // 000A CALL R1 2 + 0x80040200, // 000B RET 1 R1 + 0x80000000, // 000C RET 0 }) ) ); @@ -2390,26 +3686,30 @@ be_local_closure(lvh_obj_get_value_ofs_y, /* name */ /******************************************************************** -** Solidified function: get_obj +** Solidified function: set_val ********************************************************************/ -be_local_closure(lvh_obj_get_obj, /* name */ +be_local_closure(lvh_obj_set_val, /* name */ be_nested_proto( - 2, /* nstack */ - 1, /* argc */ + 5, /* nstack */ + 2, /* argc */ 2, /* varg */ 0, /* has upvals */ NULL, /* no upvals */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[ 1]) { /* constants */ + ( &(const bvalue[ 2]) { /* constants */ /* K0 */ be_nested_str_weak(_lv_obj), + /* K1 */ be_nested_str_weak(set_value), }), - be_str_weak(get_obj), + be_str_weak(set_val), &be_const_str_solidified, - ( &(const binstruction[ 2]) { /* code */ - 0x88040100, // 0000 GETMBR R1 R0 K0 - 0x80040200, // 0001 RET 1 R1 + ( &(const binstruction[ 5]) { /* code */ + 0x88080100, // 0000 GETMBR R2 R0 K0 + 0x8C080501, // 0001 GETMET R2 R2 K1 + 0x5C100200, // 0002 MOVE R4 R1 + 0x7C080400, // 0003 CALL R2 2 + 0x80000000, // 0004 RET 0 }) ) ); @@ -2417,38 +3717,132 @@ be_local_closure(lvh_obj_get_obj, /* name */ /******************************************************************** -** Solidified function: is_color_attribute +** Solidified function: set_toggle ********************************************************************/ -be_local_closure(lvh_obj_is_color_attribute, /* name */ +be_local_closure(lvh_obj_set_toggle, /* name */ be_nested_proto( - 9, /* nstack */ - 1, /* argc */ - 4, /* varg */ + 7, /* nstack */ + 2, /* argc */ + 2, /* varg */ 0, /* has upvals */ NULL, /* no upvals */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[ 4]) { /* constants */ - /* K0 */ be_const_class(be_class_lvh_obj), - /* K1 */ be_nested_str_weak(re), - /* K2 */ be_nested_str_weak(search), - /* K3 */ be_nested_str_weak(color_X24), + ( &(const bvalue[ 9]) { /* constants */ + /* K0 */ be_nested_str_weak(string), + /* K1 */ be_nested_str_weak(toupper), + /* K2 */ be_nested_str_weak(TRUE), + /* K3 */ be_nested_str_weak(FALSE), + /* K4 */ be_nested_str_weak(_lv_obj), + /* K5 */ be_nested_str_weak(add_state), + /* K6 */ be_nested_str_weak(lv), + /* K7 */ be_nested_str_weak(STATE_CHECKED), + /* K8 */ be_nested_str_weak(clear_state), }), - be_str_weak(is_color_attribute), + be_str_weak(set_toggle), &be_const_str_solidified, - ( &(const binstruction[11]) { /* code */ - 0x58040000, // 0000 LDCONST R1 K0 - 0xA40A0200, // 0001 IMPORT R2 K1 - 0x600C0017, // 0002 GETGBL R3 G23 - 0x8C100502, // 0003 GETMET R4 R2 K2 - 0x58180003, // 0004 LDCONST R6 K3 - 0x601C0008, // 0005 GETGBL R7 G8 - 0x5C200000, // 0006 MOVE R8 R0 - 0x7C1C0200, // 0007 CALL R7 1 - 0x7C100600, // 0008 CALL R4 3 - 0x7C0C0200, // 0009 CALL R3 1 - 0x80040600, // 000A RET 1 R3 + ( &(const binstruction[32]) { /* code */ + 0x60080004, // 0000 GETGBL R2 G4 + 0x5C0C0200, // 0001 MOVE R3 R1 + 0x7C080200, // 0002 CALL R2 1 + 0x1C080500, // 0003 EQ R2 R2 K0 + 0x780A000D, // 0004 JMPF R2 #0013 + 0xA40A0000, // 0005 IMPORT R2 K0 + 0x8C0C0501, // 0006 GETMET R3 R2 K1 + 0x60140008, // 0007 GETGBL R5 G8 + 0x5C180200, // 0008 MOVE R6 R1 + 0x7C140200, // 0009 CALL R5 1 + 0x7C0C0400, // 000A CALL R3 2 + 0x5C040600, // 000B MOVE R1 R3 + 0x1C0C0302, // 000C EQ R3 R1 K2 + 0x780E0001, // 000D JMPF R3 #0010 + 0x50040200, // 000E LDBOOL R1 1 0 + 0x70020002, // 000F JMP #0013 + 0x1C0C0303, // 0010 EQ R3 R1 K3 + 0x780E0000, // 0011 JMPF R3 #0013 + 0x50040000, // 0012 LDBOOL R1 0 0 + 0x78060005, // 0013 JMPF R1 #001A + 0x88080104, // 0014 GETMBR R2 R0 K4 + 0x8C080505, // 0015 GETMET R2 R2 K5 + 0xB8120C00, // 0016 GETNGBL R4 K6 + 0x88100907, // 0017 GETMBR R4 R4 K7 + 0x7C080400, // 0018 CALL R2 2 + 0x70020004, // 0019 JMP #001F + 0x88080104, // 001A GETMBR R2 R0 K4 + 0x8C080508, // 001B GETMET R2 R2 K8 + 0xB8120C00, // 001C GETNGBL R4 K6 + 0x88100907, // 001D GETMBR R4 R4 K7 + 0x7C080400, // 001E CALL R2 2 + 0x80000000, // 001F RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: get_line_width +********************************************************************/ +be_local_closure(lvh_obj_get_line_width, /* name */ + be_nested_proto( + 4, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 3]) { /* constants */ + /* K0 */ be_nested_str_weak(_lv_obj), + /* K1 */ be_nested_str_weak(get_style_line_width), + /* K2 */ be_const_int(0), + }), + be_str_weak(get_line_width), + &be_const_str_solidified, + ( &(const binstruction[ 5]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x8C040301, // 0001 GETMET R1 R1 K1 + 0x580C0002, // 0002 LDCONST R3 K2 + 0x7C040400, // 0003 CALL R1 2 + 0x80040200, // 0004 RET 1 R1 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: set_text +********************************************************************/ +be_local_closure(lvh_obj_set_text, /* name */ + be_nested_proto( + 6, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 3]) { /* constants */ + /* K0 */ be_nested_str_weak(check_label), + /* K1 */ be_nested_str_weak(_lv_label), + /* K2 */ be_nested_str_weak(set_text), + }), + be_str_weak(set_text), + &be_const_str_solidified, + ( &(const binstruction[ 9]) { /* code */ + 0x8C080100, // 0000 GETMET R2 R0 K0 + 0x7C080200, // 0001 CALL R2 1 + 0x88080101, // 0002 GETMBR R2 R0 K1 + 0x8C080502, // 0003 GETMET R2 R2 K2 + 0x60100008, // 0004 GETGBL R4 G8 + 0x5C140200, // 0005 MOVE R5 R1 + 0x7C100200, // 0006 CALL R4 1 + 0x7C080400, // 0007 CALL R2 2 + 0x80000000, // 0008 RET 0 }) ) ); @@ -2540,1360 +3934,23 @@ be_local_closure(lvh_obj_set_mode, /* name */ /*******************************************************************/ -/******************************************************************** -** Solidified function: set_value_color -********************************************************************/ -be_local_closure(lvh_obj_set_value_color, /* name */ - be_nested_proto( - 5, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 1]) { /* constants */ - /* K0 */ be_nested_str_weak(set_text_color), - }), - be_str_weak(set_value_color), - &be_const_str_solidified, - ( &(const binstruction[ 4]) { /* code */ - 0x8C080100, // 0000 GETMET R2 R0 K0 - 0x5C100200, // 0001 MOVE R4 R1 - 0x7C080400, // 0002 CALL R2 2 - 0x80000000, // 0003 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: set_text_rule -********************************************************************/ -be_local_closure(lvh_obj_set_text_rule, /* name */ - be_nested_proto( - 7, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 1, /* has sup protos */ - ( &(const struct bproto*[ 1]) { - be_nested_proto( - 4, /* nstack */ - 1, /* argc */ - 0, /* varg */ - 1, /* has upvals */ - ( &(const bupvaldesc[ 1]) { /* upvals */ - be_local_const_upval(1, 0), - }), - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 1]) { /* constants */ - /* K0 */ be_nested_str_weak(text_rule_matched), - }), - be_str_weak(_X3Clambda_X3E), - &be_const_str_solidified, - ( &(const binstruction[ 5]) { /* code */ - 0x68040000, // 0000 GETUPV R1 U0 - 0x8C040300, // 0001 GETMET R1 R1 K0 - 0x5C0C0000, // 0002 MOVE R3 R0 - 0x7C040400, // 0003 CALL R1 2 - 0x80040200, // 0004 RET 1 R1 - }) - ), - }), - 1, /* has constants */ - ( &(const bvalue[ 4]) { /* constants */ - /* K0 */ be_nested_str_weak(_text_rule), - /* K1 */ be_nested_str_weak(tasmota), - /* K2 */ be_nested_str_weak(remove_rule), - /* K3 */ be_nested_str_weak(add_rule), - }), - be_str_weak(set_text_rule), - &be_const_str_solidified, - ( &(const binstruction[21]) { /* code */ - 0x88080100, // 0000 GETMBR R2 R0 K0 - 0x4C0C0000, // 0001 LDNIL R3 - 0x20080403, // 0002 NE R2 R2 R3 - 0x780A0004, // 0003 JMPF R2 #0009 - 0xB80A0200, // 0004 GETNGBL R2 K1 - 0x8C080502, // 0005 GETMET R2 R2 K2 - 0x88100100, // 0006 GETMBR R4 R0 K0 - 0x5C140000, // 0007 MOVE R5 R0 - 0x7C080600, // 0008 CALL R2 3 - 0x60080008, // 0009 GETGBL R2 G8 - 0x5C0C0200, // 000A MOVE R3 R1 - 0x7C080200, // 000B CALL R2 1 - 0x90020002, // 000C SETMBR R0 K0 R2 - 0xB80A0200, // 000D GETNGBL R2 K1 - 0x8C080503, // 000E GETMET R2 R2 K3 - 0x88100100, // 000F GETMBR R4 R0 K0 - 0x84140000, // 0010 CLOSURE R5 P0 - 0x5C180000, // 0011 MOVE R6 R0 - 0x7C080800, // 0012 CALL R2 4 - 0xA0000000, // 0013 CLOSE R0 - 0x80000000, // 0014 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: get_adjustable -********************************************************************/ -be_local_closure(lvh_obj_get_adjustable, /* name */ - be_nested_proto( - 4, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 4]) { /* constants */ - /* K0 */ be_nested_str_weak(_lv_obj), - /* K1 */ be_nested_str_weak(has_flag), - /* K2 */ be_nested_str_weak(lv), - /* K3 */ be_nested_str_weak(OBJ_FLAG_CLICKABLE), - }), - be_str_weak(get_adjustable), - &be_const_str_solidified, - ( &(const binstruction[ 6]) { /* code */ - 0x88040100, // 0000 GETMBR R1 R0 K0 - 0x8C040301, // 0001 GETMET R1 R1 K1 - 0xB80E0400, // 0002 GETNGBL R3 K2 - 0x880C0703, // 0003 GETMBR R3 R3 K3 - 0x7C040400, // 0004 CALL R1 2 - 0x80040200, // 0005 RET 1 R1 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: get_toggle -********************************************************************/ -be_local_closure(lvh_obj_get_toggle, /* name */ - be_nested_proto( - 4, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 4]) { /* constants */ - /* K0 */ be_nested_str_weak(_lv_obj), - /* K1 */ be_nested_str_weak(has_state), - /* K2 */ be_nested_str_weak(lv), - /* K3 */ be_nested_str_weak(STATE_CHECKED), - }), - be_str_weak(get_toggle), - &be_const_str_solidified, - ( &(const binstruction[ 6]) { /* code */ - 0x88040100, // 0000 GETMBR R1 R0 K0 - 0x8C040301, // 0001 GETMET R1 R1 K1 - 0xB80E0400, // 0002 GETNGBL R3 K2 - 0x880C0703, // 0003 GETMBR R3 R3 K3 - 0x7C040400, // 0004 CALL R1 2 - 0x80040200, // 0005 RET 1 R1 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: get_value_str -********************************************************************/ -be_local_closure(lvh_obj_get_value_str, /* name */ - be_nested_proto( - 3, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 1]) { /* constants */ - /* K0 */ be_nested_str_weak(get_text), - }), - be_str_weak(get_value_str), - &be_const_str_solidified, - ( &(const binstruction[ 3]) { /* code */ - 0x8C040100, // 0000 GETMET R1 R0 K0 - 0x7C040200, // 0001 CALL R1 1 - 0x80040200, // 0002 RET 1 R1 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: set_pad_right2 -********************************************************************/ -be_local_closure(lvh_obj_set_pad_right2, /* name */ - be_nested_proto( - 7, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 5]) { /* constants */ - /* K0 */ be_nested_str_weak(_lv_part2_selector), - /* K1 */ be_nested_str_weak(_lv_obj), - /* K2 */ be_nested_str_weak(set_style_pad_right), - /* K3 */ be_nested_str_weak(lv), - /* K4 */ be_nested_str_weak(STATE_DEFAULT), - }), - be_str_weak(set_pad_right2), - &be_const_str_solidified, - ( &(const binstruction[15]) { /* code */ - 0x88080100, // 0000 GETMBR R2 R0 K0 - 0x4C0C0000, // 0001 LDNIL R3 - 0x20080403, // 0002 NE R2 R2 R3 - 0x780A0009, // 0003 JMPF R2 #000E - 0x88080101, // 0004 GETMBR R2 R0 K1 - 0x8C080502, // 0005 GETMET R2 R2 K2 - 0x60100009, // 0006 GETGBL R4 G9 - 0x5C140200, // 0007 MOVE R5 R1 - 0x7C100200, // 0008 CALL R4 1 - 0x88140100, // 0009 GETMBR R5 R0 K0 - 0xB81A0600, // 000A GETNGBL R6 K3 - 0x88180D04, // 000B GETMBR R6 R6 K4 - 0x30140A06, // 000C OR R5 R5 R6 - 0x7C080600, // 000D CALL R2 3 - 0x80000000, // 000E RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: set_val_rule_formula -********************************************************************/ -be_local_closure(lvh_obj_set_val_rule_formula, /* name */ - be_nested_proto( - 13, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 7]) { /* constants */ - /* K0 */ be_nested_str_weak(_val_rule_formula), - /* K1 */ be_nested_str_weak(return_X20_X2F_X20val_X20_X2D_X3E_X20_X28), - /* K2 */ be_nested_str_weak(_X29), - /* K3 */ be_nested_str_weak(_val_rule_function), - /* K4 */ be_nested_str_weak(string), - /* K5 */ be_nested_str_weak(format), - /* K6 */ be_nested_str_weak(HSP_X3A_X20failed_X20to_X20compile_X20_X27_X25s_X27_X20_X2D_X20_X25s_X20_X28_X25s_X29), - }), - be_str_weak(set_val_rule_formula), - &be_const_str_solidified, - ( &(const binstruction[30]) { /* code */ - 0x60080008, // 0000 GETGBL R2 G8 - 0x5C0C0200, // 0001 MOVE R3 R1 - 0x7C080200, // 0002 CALL R2 1 - 0x90020002, // 0003 SETMBR R0 K0 R2 - 0x88080100, // 0004 GETMBR R2 R0 K0 - 0x000A0202, // 0005 ADD R2 K1 R2 - 0x00080502, // 0006 ADD R2 R2 K2 - 0xA8020007, // 0007 EXBLK 0 #0010 - 0x600C000D, // 0008 GETGBL R3 G13 - 0x5C100400, // 0009 MOVE R4 R2 - 0x7C0C0200, // 000A CALL R3 1 - 0x5C100600, // 000B MOVE R4 R3 - 0x7C100000, // 000C CALL R4 0 - 0x90020604, // 000D SETMBR R0 K3 R4 - 0xA8040001, // 000E EXBLK 1 1 - 0x7002000C, // 000F JMP #001D - 0xAC0C0002, // 0010 CATCH R3 0 2 - 0x70020009, // 0011 JMP #001C - 0xA4160800, // 0012 IMPORT R5 K4 - 0x60180001, // 0013 GETGBL R6 G1 - 0x8C1C0B05, // 0014 GETMET R7 R5 K5 - 0x58240006, // 0015 LDCONST R9 K6 - 0x5C280400, // 0016 MOVE R10 R2 - 0x5C2C0600, // 0017 MOVE R11 R3 - 0x5C300800, // 0018 MOVE R12 R4 - 0x7C1C0A00, // 0019 CALL R7 5 - 0x7C180200, // 001A CALL R6 1 - 0x70020000, // 001B JMP #001D - 0xB0080000, // 001C RAISE 2 R0 R0 - 0x80000000, // 001D RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: get_line_width -********************************************************************/ -be_local_closure(lvh_obj_get_line_width, /* name */ - be_nested_proto( - 4, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 3]) { /* constants */ - /* K0 */ be_nested_str_weak(_lv_obj), - /* K1 */ be_nested_str_weak(get_style_line_width), - /* K2 */ be_const_int(0), - }), - be_str_weak(get_line_width), - &be_const_str_solidified, - ( &(const binstruction[ 5]) { /* code */ - 0x88040100, // 0000 GETMBR R1 R0 K0 - 0x8C040301, // 0001 GETMET R1 R1 K1 - 0x580C0002, // 0002 LDCONST R3 K2 - 0x7C040400, // 0003 CALL R1 2 - 0x80040200, // 0004 RET 1 R1 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: set_pad_left2 -********************************************************************/ -be_local_closure(lvh_obj_set_pad_left2, /* name */ - be_nested_proto( - 7, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 5]) { /* constants */ - /* K0 */ be_nested_str_weak(_lv_part2_selector), - /* K1 */ be_nested_str_weak(_lv_obj), - /* K2 */ be_nested_str_weak(set_style_pad_left), - /* K3 */ be_nested_str_weak(lv), - /* K4 */ be_nested_str_weak(STATE_DEFAULT), - }), - be_str_weak(set_pad_left2), - &be_const_str_solidified, - ( &(const binstruction[15]) { /* code */ - 0x88080100, // 0000 GETMBR R2 R0 K0 - 0x4C0C0000, // 0001 LDNIL R3 - 0x20080403, // 0002 NE R2 R2 R3 - 0x780A0009, // 0003 JMPF R2 #000E - 0x88080101, // 0004 GETMBR R2 R0 K1 - 0x8C080502, // 0005 GETMET R2 R2 K2 - 0x60100009, // 0006 GETGBL R4 G9 - 0x5C140200, // 0007 MOVE R5 R1 - 0x7C100200, // 0008 CALL R4 1 - 0x88140100, // 0009 GETMBR R5 R0 K0 - 0xB81A0600, // 000A GETNGBL R6 K3 - 0x88180D04, // 000B GETMBR R6 R6 K4 - 0x30140A06, // 000C OR R5 R5 R6 - 0x7C080600, // 000D CALL R2 3 - 0x80000000, // 000E RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: get_val_rule_formula -********************************************************************/ -be_local_closure(lvh_obj_get_val_rule_formula, /* name */ - be_nested_proto( - 2, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 1]) { /* constants */ - /* K0 */ be_nested_str_weak(_val_rule_formula), - }), - be_str_weak(get_val_rule_formula), - &be_const_str_solidified, - ( &(const binstruction[ 2]) { /* code */ - 0x88040100, // 0000 GETMBR R1 R0 K0 - 0x80040200, // 0001 RET 1 R1 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: check_label -********************************************************************/ -be_local_closure(lvh_obj_check_label, /* name */ - be_nested_proto( - 5, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 6]) { /* constants */ - /* K0 */ be_nested_str_weak(_lv_label), - /* K1 */ be_nested_str_weak(lv), - /* K2 */ be_nested_str_weak(label), - /* K3 */ be_nested_str_weak(get_obj), - /* K4 */ be_nested_str_weak(set_align), - /* K5 */ be_nested_str_weak(ALIGN_CENTER), - }), - be_str_weak(check_label), - &be_const_str_solidified, - ( &(const binstruction[16]) { /* code */ - 0x88040100, // 0000 GETMBR R1 R0 K0 - 0x4C080000, // 0001 LDNIL R2 - 0x1C040202, // 0002 EQ R1 R1 R2 - 0x7806000A, // 0003 JMPF R1 #000F - 0xB8060200, // 0004 GETNGBL R1 K1 - 0x8C040302, // 0005 GETMET R1 R1 K2 - 0x8C0C0103, // 0006 GETMET R3 R0 K3 - 0x7C0C0200, // 0007 CALL R3 1 - 0x7C040400, // 0008 CALL R1 2 - 0x90020001, // 0009 SETMBR R0 K0 R1 - 0x88040100, // 000A GETMBR R1 R0 K0 - 0x8C040304, // 000B GETMET R1 R1 K4 - 0xB80E0200, // 000C GETNGBL R3 K1 - 0x880C0705, // 000D GETMBR R3 R3 K5 - 0x7C040400, // 000E CALL R1 2 - 0x80000000, // 000F RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: get_text -********************************************************************/ -be_local_closure(lvh_obj_get_text, /* name */ - be_nested_proto( - 3, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 2]) { /* constants */ - /* K0 */ be_nested_str_weak(_lv_label), - /* K1 */ be_nested_str_weak(get_text), - }), - be_str_weak(get_text), - &be_const_str_solidified, - ( &(const binstruction[10]) { /* code */ - 0x88040100, // 0000 GETMBR R1 R0 K0 - 0x4C080000, // 0001 LDNIL R2 - 0x1C040202, // 0002 EQ R1 R1 R2 - 0x78060001, // 0003 JMPF R1 #0006 - 0x4C040000, // 0004 LDNIL R1 - 0x80040200, // 0005 RET 1 R1 - 0x88040100, // 0006 GETMBR R1 R0 K0 - 0x8C040301, // 0007 GETMET R1 R1 K1 - 0x7C040200, // 0008 CALL R1 1 - 0x80040200, // 0009 RET 1 R1 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: set_hidden -********************************************************************/ -be_local_closure(lvh_obj_set_hidden, /* name */ - be_nested_proto( - 5, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 5]) { /* constants */ - /* K0 */ be_nested_str_weak(_lv_obj), - /* K1 */ be_nested_str_weak(add_flag), - /* K2 */ be_nested_str_weak(lv), - /* K3 */ be_nested_str_weak(OBJ_FLAG_HIDDEN), - /* K4 */ be_nested_str_weak(clear_flag), - }), - be_str_weak(set_hidden), - &be_const_str_solidified, - ( &(const binstruction[13]) { /* code */ - 0x78060005, // 0000 JMPF R1 #0007 - 0x88080100, // 0001 GETMBR R2 R0 K0 - 0x8C080501, // 0002 GETMET R2 R2 K1 - 0xB8120400, // 0003 GETNGBL R4 K2 - 0x88100903, // 0004 GETMBR R4 R4 K3 - 0x7C080400, // 0005 CALL R2 2 - 0x70020004, // 0006 JMP #000C - 0x88080100, // 0007 GETMBR R2 R0 K0 - 0x8C080504, // 0008 GETMET R2 R2 K4 - 0xB8120400, // 0009 GETNGBL R4 K2 - 0x88100903, // 000A GETMBR R4 R4 K3 - 0x7C080400, // 000B CALL R2 2 - 0x80000000, // 000C RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: set_pad_all2 -********************************************************************/ -be_local_closure(lvh_obj_set_pad_all2, /* name */ - be_nested_proto( - 7, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 5]) { /* constants */ - /* K0 */ be_nested_str_weak(_lv_part2_selector), - /* K1 */ be_nested_str_weak(_lv_obj), - /* K2 */ be_nested_str_weak(set_style_pad_all), - /* K3 */ be_nested_str_weak(lv), - /* K4 */ be_nested_str_weak(STATE_DEFAULT), - }), - be_str_weak(set_pad_all2), - &be_const_str_solidified, - ( &(const binstruction[15]) { /* code */ - 0x88080100, // 0000 GETMBR R2 R0 K0 - 0x4C0C0000, // 0001 LDNIL R3 - 0x20080403, // 0002 NE R2 R2 R3 - 0x780A0009, // 0003 JMPF R2 #000E - 0x88080101, // 0004 GETMBR R2 R0 K1 - 0x8C080502, // 0005 GETMET R2 R2 K2 - 0x60100009, // 0006 GETGBL R4 G9 - 0x5C140200, // 0007 MOVE R5 R1 - 0x7C100200, // 0008 CALL R4 1 - 0x88140100, // 0009 GETMBR R5 R0 K0 - 0xB81A0600, // 000A GETNGBL R6 K3 - 0x88180D04, // 000B GETMBR R6 R6 K4 - 0x30140A06, // 000C OR R5 R5 R6 - 0x7C080600, // 000D CALL R2 3 - 0x80000000, // 000E RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: set_text_color -********************************************************************/ -be_local_closure(lvh_obj_set_text_color, /* name */ - be_nested_proto( - 7, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 4]) { /* constants */ - /* K0 */ be_nested_str_weak(_lv_obj), - /* K1 */ be_nested_str_weak(set_style_text_color), - /* K2 */ be_nested_str_weak(parse_color), - /* K3 */ be_const_int(0), - }), - be_str_weak(set_text_color), - &be_const_str_solidified, - ( &(const binstruction[ 8]) { /* code */ - 0x88080100, // 0000 GETMBR R2 R0 K0 - 0x8C080501, // 0001 GETMET R2 R2 K1 - 0x8C100102, // 0002 GETMET R4 R0 K2 - 0x5C180200, // 0003 MOVE R6 R1 - 0x7C100400, // 0004 CALL R4 2 - 0x58140003, // 0005 LDCONST R5 K3 - 0x7C080600, // 0006 CALL R2 3 - 0x80000000, // 0007 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: get_pad_bottom -********************************************************************/ -be_local_closure(lvh_obj_get_pad_bottom, /* name */ - be_nested_proto( - 5, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 5]) { /* constants */ - /* K0 */ be_nested_str_weak(_lv_part2_selector), - /* K1 */ be_nested_str_weak(_lv_obj), - /* K2 */ be_nested_str_weak(get_style_pad_bottom), - /* K3 */ be_nested_str_weak(lv), - /* K4 */ be_nested_str_weak(STATE_DEFAULT), - }), - be_str_weak(get_pad_bottom), - &be_const_str_solidified, - ( &(const binstruction[13]) { /* code */ - 0x88040100, // 0000 GETMBR R1 R0 K0 - 0x4C080000, // 0001 LDNIL R2 - 0x20040202, // 0002 NE R1 R1 R2 - 0x78060007, // 0003 JMPF R1 #000C - 0x88040101, // 0004 GETMBR R1 R0 K1 - 0x8C040302, // 0005 GETMET R1 R1 K2 - 0x880C0100, // 0006 GETMBR R3 R0 K0 - 0xB8120600, // 0007 GETNGBL R4 K3 - 0x88100904, // 0008 GETMBR R4 R4 K4 - 0x300C0604, // 0009 OR R3 R3 R4 - 0x7C040400, // 000A CALL R1 2 - 0x80040200, // 000B RET 1 R1 - 0x80000000, // 000C RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: get_pad_top -********************************************************************/ -be_local_closure(lvh_obj_get_pad_top, /* name */ - be_nested_proto( - 5, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 5]) { /* constants */ - /* K0 */ be_nested_str_weak(_lv_part2_selector), - /* K1 */ be_nested_str_weak(_lv_obj), - /* K2 */ be_nested_str_weak(get_style_pad_top), - /* K3 */ be_nested_str_weak(lv), - /* K4 */ be_nested_str_weak(STATE_DEFAULT), - }), - be_str_weak(get_pad_top), - &be_const_str_solidified, - ( &(const binstruction[13]) { /* code */ - 0x88040100, // 0000 GETMBR R1 R0 K0 - 0x4C080000, // 0001 LDNIL R2 - 0x20040202, // 0002 NE R1 R1 R2 - 0x78060007, // 0003 JMPF R1 #000C - 0x88040101, // 0004 GETMBR R1 R0 K1 - 0x8C040302, // 0005 GETMET R1 R1 K2 - 0x880C0100, // 0006 GETMBR R3 R0 K0 - 0xB8120600, // 0007 GETNGBL R4 K3 - 0x88100904, // 0008 GETMBR R4 R4 K4 - 0x300C0604, // 0009 OR R3 R3 R4 - 0x7C040400, // 000A CALL R1 2 - 0x80040200, // 000B RET 1 R1 - 0x80000000, // 000C RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: set_adjustable -********************************************************************/ -be_local_closure(lvh_obj_set_adjustable, /* name */ - be_nested_proto( - 5, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 5]) { /* constants */ - /* K0 */ be_nested_str_weak(_lv_obj), - /* K1 */ be_nested_str_weak(add_flag), - /* K2 */ be_nested_str_weak(lv), - /* K3 */ be_nested_str_weak(OBJ_FLAG_CLICKABLE), - /* K4 */ be_nested_str_weak(clear_flag), - }), - be_str_weak(set_adjustable), - &be_const_str_solidified, - ( &(const binstruction[13]) { /* code */ - 0x78060005, // 0000 JMPF R1 #0007 - 0x88080100, // 0001 GETMBR R2 R0 K0 - 0x8C080501, // 0002 GETMET R2 R2 K1 - 0xB8120400, // 0003 GETNGBL R4 K2 - 0x88100903, // 0004 GETMBR R4 R4 K3 - 0x7C080400, // 0005 CALL R2 2 - 0x70020004, // 0006 JMP #000C - 0x88080100, // 0007 GETMBR R2 R0 K0 - 0x8C080504, // 0008 GETMET R2 R2 K4 - 0xB8120400, // 0009 GETNGBL R4 K2 - 0x88100903, // 000A GETMBR R4 R4 K3 - 0x7C080400, // 000B CALL R2 2 - 0x80000000, // 000C RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: get_enabled -********************************************************************/ -be_local_closure(lvh_obj_get_enabled, /* name */ - be_nested_proto( - 4, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 4]) { /* constants */ - /* K0 */ be_nested_str_weak(_lv_obj), - /* K1 */ be_nested_str_weak(has_flag), - /* K2 */ be_nested_str_weak(lv), - /* K3 */ be_nested_str_weak(OBJ_FLAG_CLICKABLE), - }), - be_str_weak(get_enabled), - &be_const_str_solidified, - ( &(const binstruction[ 6]) { /* code */ - 0x88040100, // 0000 GETMBR R1 R0 K0 - 0x8C040301, // 0001 GETMET R1 R1 K1 - 0xB80E0400, // 0002 GETNGBL R3 K2 - 0x880C0703, // 0003 GETMBR R3 R3 K3 - 0x7C040400, // 0004 CALL R1 2 - 0x80040200, // 0005 RET 1 R1 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: setmember -********************************************************************/ -be_local_closure(lvh_obj_setmember, /* name */ - be_nested_proto( - 12, /* nstack */ - 3, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[19]) { /* constants */ - /* K0 */ be_nested_str_weak(string), - /* K1 */ be_nested_str_weak(introspect), - /* K2 */ be_const_int(0), - /* K3 */ be_const_int(3), - /* K4 */ be_nested_str_weak(set_), - /* K5 */ be_nested_str_weak(get_), - /* K6 */ be_nested_str_weak(_attr_ignore), - /* K7 */ be_nested_str_weak(find), - /* K8 */ be_nested_str_weak(get), - /* K9 */ be_nested_str_weak(function), - /* K10 */ be_nested_str_weak(_attr_map), - /* K11 */ be_nested_str_weak(contains), - /* K12 */ be_nested_str_weak(_lv_obj), - /* K13 */ be_nested_str_weak(is_color_attribute), - /* K14 */ be_nested_str_weak(parse_color), - /* K15 */ be_nested_str_weak(style_), - /* K16 */ be_nested_str_weak(_X20for_X20), - /* K17 */ be_nested_str_weak(HSP_X3A_X20Could_X20not_X20find_X20function_X20set_), - /* K18 */ be_nested_str_weak(HSP_X3A_X20unknown_X20attribute_X3A), - }), - be_str_weak(setmember), - &be_const_str_solidified, - ( &(const binstruction[93]) { /* code */ - 0xA40E0000, // 0000 IMPORT R3 K0 - 0xA4120200, // 0001 IMPORT R4 K1 - 0x40160503, // 0002 CONNECT R5 K2 K3 - 0x94140205, // 0003 GETIDX R5 R1 R5 - 0x1C180B04, // 0004 EQ R6 R5 K4 - 0x741A0001, // 0005 JMPT R6 #0008 - 0x1C180B05, // 0006 EQ R6 R5 K5 - 0x781A0000, // 0007 JMPF R6 #0009 - 0x80000C00, // 0008 RET 0 - 0x88180106, // 0009 GETMBR R6 R0 K6 - 0x8C180D07, // 000A GETMET R6 R6 K7 - 0x5C200200, // 000B MOVE R8 R1 - 0x7C180400, // 000C CALL R6 2 - 0x4C1C0000, // 000D LDNIL R7 - 0x20180C07, // 000E NE R6 R6 R7 - 0x781A0000, // 000F JMPF R6 #0011 - 0x80000C00, // 0010 RET 0 - 0x8C180908, // 0011 GETMET R6 R4 K8 - 0x5C200000, // 0012 MOVE R8 R0 - 0x00260801, // 0013 ADD R9 K4 R1 - 0x7C180600, // 0014 CALL R6 3 - 0x601C0004, // 0015 GETGBL R7 G4 - 0x5C200C00, // 0016 MOVE R8 R6 - 0x7C1C0200, // 0017 CALL R7 1 - 0x1C1C0F09, // 0018 EQ R7 R7 K9 - 0x781E0004, // 0019 JMPF R7 #001F - 0x5C1C0C00, // 001A MOVE R7 R6 - 0x5C200000, // 001B MOVE R8 R0 - 0x5C240400, // 001C MOVE R9 R2 - 0x7C1C0400, // 001D CALL R7 2 - 0x80000E00, // 001E RET 0 - 0x881C010A, // 001F GETMBR R7 R0 K10 - 0x8C1C0F0B, // 0020 GETMET R7 R7 K11 - 0x5C240200, // 0021 MOVE R9 R1 - 0x7C1C0400, // 0022 CALL R7 2 - 0x781E0033, // 0023 JMPF R7 #0058 - 0x881C010A, // 0024 GETMBR R7 R0 K10 - 0x941C0E01, // 0025 GETIDX R7 R7 R1 - 0x8C200908, // 0026 GETMET R8 R4 K8 - 0x8828010C, // 0027 GETMBR R10 R0 K12 - 0x002E0807, // 0028 ADD R11 K4 R7 - 0x7C200600, // 0029 CALL R8 3 - 0x5C181000, // 002A MOVE R6 R8 - 0x8C20010D, // 002B GETMET R8 R0 K13 - 0x5C280E00, // 002C MOVE R10 R7 - 0x7C200400, // 002D CALL R8 2 - 0x78220003, // 002E JMPF R8 #0033 - 0x8C20010E, // 002F GETMET R8 R0 K14 - 0x5C280400, // 0030 MOVE R10 R2 - 0x7C200400, // 0031 CALL R8 2 - 0x5C081000, // 0032 MOVE R2 R8 - 0x60200004, // 0033 GETGBL R8 G4 - 0x5C240C00, // 0034 MOVE R9 R6 - 0x7C200200, // 0035 CALL R8 1 - 0x1C201109, // 0036 EQ R8 R8 K9 - 0x7822001B, // 0037 JMPF R8 #0054 - 0xA8020011, // 0038 EXBLK 0 #004B - 0x8C200707, // 0039 GETMET R8 R3 K7 - 0x5C280E00, // 003A MOVE R10 R7 - 0x582C000F, // 003B LDCONST R11 K15 - 0x7C200600, // 003C CALL R8 3 - 0x1C201102, // 003D EQ R8 R8 K2 - 0x78220005, // 003E JMPF R8 #0045 - 0x5C200C00, // 003F MOVE R8 R6 - 0x8824010C, // 0040 GETMBR R9 R0 K12 - 0x5C280400, // 0041 MOVE R10 R2 - 0x582C0002, // 0042 LDCONST R11 K2 - 0x7C200600, // 0043 CALL R8 3 - 0x70020003, // 0044 JMP #0049 - 0x5C200C00, // 0045 MOVE R8 R6 - 0x8824010C, // 0046 GETMBR R9 R0 K12 - 0x5C280400, // 0047 MOVE R10 R2 - 0x7C200400, // 0048 CALL R8 2 - 0xA8040001, // 0049 EXBLK 1 1 - 0x70020006, // 004A JMP #0052 - 0xAC200002, // 004B CATCH R8 0 2 - 0x70020003, // 004C JMP #0051 - 0x00281310, // 004D ADD R10 R9 K16 - 0x00281401, // 004E ADD R10 R10 R1 - 0xB004100A, // 004F RAISE 1 R8 R10 - 0x70020000, // 0050 JMP #0052 - 0xB0080000, // 0051 RAISE 2 R0 R0 - 0x80001000, // 0052 RET 0 - 0x70020002, // 0053 JMP #0057 - 0x60200001, // 0054 GETGBL R8 G1 - 0x00262207, // 0055 ADD R9 K17 R7 - 0x7C200200, // 0056 CALL R8 1 - 0x70020003, // 0057 JMP #005C - 0x601C0001, // 0058 GETGBL R7 G1 - 0x58200012, // 0059 LDCONST R8 K18 - 0x5C240200, // 005A MOVE R9 R1 - 0x7C1C0400, // 005B CALL R7 2 - 0x80000000, // 005C RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: init -********************************************************************/ -be_local_closure(lvh_obj_init, /* name */ - be_nested_proto( - 8, /* nstack */ - 5, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 4]) { /* constants */ - /* K0 */ be_nested_str_weak(_page), - /* K1 */ be_nested_str_weak(_lv_class), - /* K2 */ be_nested_str_weak(_lv_obj), - /* K3 */ be_nested_str_weak(post_init), - }), - be_str_weak(init), - &be_const_str_solidified, - ( &(const binstruction[16]) { /* code */ - 0x90020002, // 0000 SETMBR R0 K0 R2 - 0x4C140000, // 0001 LDNIL R5 - 0x1C140805, // 0002 EQ R5 R4 R5 - 0x78160007, // 0003 JMPF R5 #000C - 0x88140101, // 0004 GETMBR R5 R0 K1 - 0x78160005, // 0005 JMPF R5 #000C - 0x88140101, // 0006 GETMBR R5 R0 K1 - 0x5C180A00, // 0007 MOVE R6 R5 - 0x5C1C0200, // 0008 MOVE R7 R1 - 0x7C180200, // 0009 CALL R6 1 - 0x90020406, // 000A SETMBR R0 K2 R6 - 0x70020000, // 000B JMP #000D - 0x90020404, // 000C SETMBR R0 K2 R4 - 0x8C140103, // 000D GETMET R5 R0 K3 - 0x7C140200, // 000E CALL R5 1 - 0x80000000, // 000F RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: set_value_str -********************************************************************/ -be_local_closure(lvh_obj_set_value_str, /* name */ - be_nested_proto( - 5, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 1]) { /* constants */ - /* K0 */ be_nested_str_weak(set_text), - }), - be_str_weak(set_value_str), - &be_const_str_solidified, - ( &(const binstruction[ 4]) { /* code */ - 0x8C080100, // 0000 GETMET R2 R0 K0 - 0x5C100200, // 0001 MOVE R4 R1 - 0x7C080400, // 0002 CALL R2 2 - 0x80000000, // 0003 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: set_line_width -********************************************************************/ -be_local_closure(lvh_obj_set_line_width, /* name */ - be_nested_proto( - 6, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 3]) { /* constants */ - /* K0 */ be_nested_str_weak(_lv_obj), - /* K1 */ be_nested_str_weak(set_style_line_width), - /* K2 */ be_const_int(0), - }), - be_str_weak(set_line_width), - &be_const_str_solidified, - ( &(const binstruction[ 8]) { /* code */ - 0x88080100, // 0000 GETMBR R2 R0 K0 - 0x8C080501, // 0001 GETMET R2 R2 K1 - 0x60100009, // 0002 GETGBL R4 G9 - 0x5C140200, // 0003 MOVE R5 R1 - 0x7C100200, // 0004 CALL R4 1 - 0x58140002, // 0005 LDCONST R5 K2 - 0x7C080600, // 0006 CALL R2 3 - 0x80000000, // 0007 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: set_toggle -********************************************************************/ -be_local_closure(lvh_obj_set_toggle, /* name */ - be_nested_proto( - 7, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 9]) { /* constants */ - /* K0 */ be_nested_str_weak(string), - /* K1 */ be_nested_str_weak(toupper), - /* K2 */ be_nested_str_weak(TRUE), - /* K3 */ be_nested_str_weak(FALSE), - /* K4 */ be_nested_str_weak(_lv_obj), - /* K5 */ be_nested_str_weak(add_state), - /* K6 */ be_nested_str_weak(lv), - /* K7 */ be_nested_str_weak(STATE_CHECKED), - /* K8 */ be_nested_str_weak(clear_state), - }), - be_str_weak(set_toggle), - &be_const_str_solidified, - ( &(const binstruction[32]) { /* code */ - 0x60080004, // 0000 GETGBL R2 G4 - 0x5C0C0200, // 0001 MOVE R3 R1 - 0x7C080200, // 0002 CALL R2 1 - 0x1C080500, // 0003 EQ R2 R2 K0 - 0x780A000D, // 0004 JMPF R2 #0013 - 0xA40A0000, // 0005 IMPORT R2 K0 - 0x8C0C0501, // 0006 GETMET R3 R2 K1 - 0x60140008, // 0007 GETGBL R5 G8 - 0x5C180200, // 0008 MOVE R6 R1 - 0x7C140200, // 0009 CALL R5 1 - 0x7C0C0400, // 000A CALL R3 2 - 0x5C040600, // 000B MOVE R1 R3 - 0x1C0C0302, // 000C EQ R3 R1 K2 - 0x780E0001, // 000D JMPF R3 #0010 - 0x50040200, // 000E LDBOOL R1 1 0 - 0x70020002, // 000F JMP #0013 - 0x1C0C0303, // 0010 EQ R3 R1 K3 - 0x780E0000, // 0011 JMPF R3 #0013 - 0x50040000, // 0012 LDBOOL R1 0 0 - 0x78060005, // 0013 JMPF R1 #001A - 0x88080104, // 0014 GETMBR R2 R0 K4 - 0x8C080505, // 0015 GETMET R2 R2 K5 - 0xB8120C00, // 0016 GETNGBL R4 K6 - 0x88100907, // 0017 GETMBR R4 R4 K7 - 0x7C080400, // 0018 CALL R2 2 - 0x70020004, // 0019 JMP #001F - 0x88080104, // 001A GETMBR R2 R0 K4 - 0x8C080508, // 001B GETMET R2 R2 K8 - 0xB8120C00, // 001C GETNGBL R4 K6 - 0x88100907, // 001D GETMBR R4 R4 K7 - 0x7C080400, // 001E CALL R2 2 - 0x80000000, // 001F RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: set_val_rule -********************************************************************/ -be_local_closure(lvh_obj_set_val_rule, /* name */ - be_nested_proto( - 7, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 1, /* has sup protos */ - ( &(const struct bproto*[ 1]) { - be_nested_proto( - 4, /* nstack */ - 1, /* argc */ - 0, /* varg */ - 1, /* has upvals */ - ( &(const bupvaldesc[ 1]) { /* upvals */ - be_local_const_upval(1, 0), - }), - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 1]) { /* constants */ - /* K0 */ be_nested_str_weak(val_rule_matched), - }), - be_str_weak(_X3Clambda_X3E), - &be_const_str_solidified, - ( &(const binstruction[ 5]) { /* code */ - 0x68040000, // 0000 GETUPV R1 U0 - 0x8C040300, // 0001 GETMET R1 R1 K0 - 0x5C0C0000, // 0002 MOVE R3 R0 - 0x7C040400, // 0003 CALL R1 2 - 0x80040200, // 0004 RET 1 R1 - }) - ), - }), - 1, /* has constants */ - ( &(const bvalue[ 4]) { /* constants */ - /* K0 */ be_nested_str_weak(_val_rule), - /* K1 */ be_nested_str_weak(tasmota), - /* K2 */ be_nested_str_weak(remove_rule), - /* K3 */ be_nested_str_weak(add_rule), - }), - be_str_weak(set_val_rule), - &be_const_str_solidified, - ( &(const binstruction[21]) { /* code */ - 0x88080100, // 0000 GETMBR R2 R0 K0 - 0x4C0C0000, // 0001 LDNIL R3 - 0x20080403, // 0002 NE R2 R2 R3 - 0x780A0004, // 0003 JMPF R2 #0009 - 0xB80A0200, // 0004 GETNGBL R2 K1 - 0x8C080502, // 0005 GETMET R2 R2 K2 - 0x88100100, // 0006 GETMBR R4 R0 K0 - 0x5C140000, // 0007 MOVE R5 R0 - 0x7C080600, // 0008 CALL R2 3 - 0x60080008, // 0009 GETGBL R2 G8 - 0x5C0C0200, // 000A MOVE R3 R1 - 0x7C080200, // 000B CALL R2 1 - 0x90020002, // 000C SETMBR R0 K0 R2 - 0xB80A0200, // 000D GETNGBL R2 K1 - 0x8C080503, // 000E GETMET R2 R2 K3 - 0x88100100, // 000F GETMBR R4 R0 K0 - 0x84140000, // 0010 CLOSURE R5 P0 - 0x5C180000, // 0011 MOVE R6 R0 - 0x7C080800, // 0012 CALL R2 4 - 0xA0000000, // 0013 CLOSE R0 - 0x80000000, // 0014 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: set_text -********************************************************************/ -be_local_closure(lvh_obj_set_text, /* name */ - be_nested_proto( - 6, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 3]) { /* constants */ - /* K0 */ be_nested_str_weak(check_label), - /* K1 */ be_nested_str_weak(_lv_label), - /* K2 */ be_nested_str_weak(set_text), - }), - be_str_weak(set_text), - &be_const_str_solidified, - ( &(const binstruction[ 9]) { /* code */ - 0x8C080100, // 0000 GETMET R2 R0 K0 - 0x7C080200, // 0001 CALL R2 1 - 0x88080101, // 0002 GETMBR R2 R0 K1 - 0x8C080502, // 0003 GETMET R2 R2 K2 - 0x60100008, // 0004 GETGBL R4 G8 - 0x5C140200, // 0005 MOVE R5 R1 - 0x7C100200, // 0006 CALL R4 1 - 0x7C080400, // 0007 CALL R2 2 - 0x80000000, // 0008 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: get_action -********************************************************************/ -be_local_closure(lvh_obj_get_action, /* name */ - be_nested_proto( - 3, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 2]) { /* constants */ - /* K0 */ be_nested_str_weak(_action), - /* K1 */ be_nested_str_weak(), - }), - be_str_weak(get_action), - &be_const_str_solidified, - ( &(const binstruction[ 6]) { /* code */ - 0x88040100, // 0000 GETMBR R1 R0 K0 - 0x78060001, // 0001 JMPF R1 #0004 - 0x5C080200, // 0002 MOVE R2 R1 - 0x70020000, // 0003 JMP #0005 - 0x58080001, // 0004 LDCONST R2 K1 - 0x80040400, // 0005 RET 1 R2 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: get_value_font -********************************************************************/ -be_local_closure(lvh_obj_get_value_font, /* name */ - be_nested_proto( - 3, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 1]) { /* constants */ - /* K0 */ be_nested_str_weak(get_text_font), - }), - be_str_weak(get_value_font), - &be_const_str_solidified, - ( &(const binstruction[ 3]) { /* code */ - 0x8C040100, // 0000 GETMET R1 R0 K0 - 0x7C040200, // 0001 CALL R1 1 - 0x80040200, // 0002 RET 1 R1 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: get_hidden -********************************************************************/ -be_local_closure(lvh_obj_get_hidden, /* name */ - be_nested_proto( - 4, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 4]) { /* constants */ - /* K0 */ be_nested_str_weak(_lv_obj), - /* K1 */ be_nested_str_weak(has_flag), - /* K2 */ be_nested_str_weak(lv), - /* K3 */ be_nested_str_weak(OBJ_FLAG_HIDDEN), - }), - be_str_weak(get_hidden), - &be_const_str_solidified, - ( &(const binstruction[ 6]) { /* code */ - 0x88040100, // 0000 GETMBR R1 R0 K0 - 0x8C040301, // 0001 GETMET R1 R1 K1 - 0xB80E0400, // 0002 GETNGBL R3 K2 - 0x880C0703, // 0003 GETMBR R3 R3 K3 - 0x7C040400, // 0004 CALL R1 2 - 0x80040200, // 0005 RET 1 R1 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: get_pad_all -********************************************************************/ -be_local_closure(lvh_obj_get_pad_all, /* name */ - be_nested_proto( - 1, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 0, /* has constants */ - NULL, /* no const */ - be_str_weak(get_pad_all), - &be_const_str_solidified, - ( &(const binstruction[ 1]) { /* code */ - 0x80000000, // 0000 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: get_text_color -********************************************************************/ -be_local_closure(lvh_obj_get_text_color, /* name */ - be_nested_proto( - 4, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 3]) { /* constants */ - /* K0 */ be_nested_str_weak(_lv_obj), - /* K1 */ be_nested_str_weak(get_style_text_color), - /* K2 */ be_const_int(0), - }), - be_str_weak(get_text_color), - &be_const_str_solidified, - ( &(const binstruction[ 5]) { /* code */ - 0x88040100, // 0000 GETMBR R1 R0 K0 - 0x8C040301, // 0001 GETMET R1 R1 K1 - 0x580C0002, // 0002 LDCONST R3 K2 - 0x7C040400, // 0003 CALL R1 2 - 0x80040200, // 0004 RET 1 R1 - }) - ) -); -/*******************************************************************/ - - /******************************************************************** ** Solidified class: lvh_obj ********************************************************************/ be_local_class(lvh_obj, - 12, + 13, NULL, - be_nested_map(88, + be_nested_map(91, ( (struct bmapnode*) &(const bmapnode[]) { - { be_const_key_weak(set_radius2, 68), be_const_closure(lvh_obj_set_radius2_closure) }, - { be_const_key_weak(register_event_cb, -1), be_const_closure(lvh_obj_register_event_cb_closure) }, - { be_const_key_weak(get_text_rule_format, -1), be_const_closure(lvh_obj_get_text_rule_format_closure) }, - { be_const_key_weak(set_value_ofs_x, -1), be_const_closure(lvh_obj_set_value_ofs_x_closure) }, - { be_const_key_weak(get_radius2, -1), be_const_closure(lvh_obj_get_radius2_closure) }, - { be_const_key_weak(_attr_ignore, 30), be_const_simple_instance(be_nested_simple_instance(&be_class_list, { + { be_const_key_weak(parse_color, 3), be_const_static_closure(lvh_obj_parse_color_closure) }, + { be_const_key_weak(set_mode, 8), be_const_closure(lvh_obj_set_mode_closure) }, + { be_const_key_weak(set_pad_top2, -1), be_const_closure(lvh_obj_set_pad_top2_closure) }, + { be_const_key_weak(set_pad_left2, -1), be_const_closure(lvh_obj_set_pad_left2_closure) }, + { be_const_key_weak(get_obj, -1), be_const_closure(lvh_obj_get_obj_closure) }, + { be_const_key_weak(get_line_width, 84), be_const_closure(lvh_obj_get_line_width_closure) }, + { be_const_key_weak(get_align, -1), be_const_closure(lvh_obj_get_align_closure) }, + { be_const_key_weak(_text_rule, -1), be_const_var(9) }, + { be_const_key_weak(_attr_ignore, 42), be_const_simple_instance(be_nested_simple_instance(&be_class_list, { be_const_list( * be_nested_list(10, ( (struct bvalue*) &(const bvalue[]) { be_nested_str_weak(tostring), @@ -3907,31 +3964,44 @@ be_local_class(lvh_obj, be_nested_str_weak(back), be_nested_str_weak(berry_run), })) ) } )) }, - { be_const_key_weak(val_rule_matched, -1), be_const_closure(lvh_obj_val_rule_matched_closure) }, - { be_const_key_weak(set_pad_top2, -1), be_const_closure(lvh_obj_set_pad_top2_closure) }, { be_const_key_weak(get_value_font, -1), be_const_closure(lvh_obj_get_value_font_closure) }, - { be_const_key_weak(_text_rule_function, -1), be_const_var(10) }, - { be_const_key_weak(_text_rule_format, -1), be_const_var(11) }, - { be_const_key_weak(set_text_font, -1), be_const_closure(lvh_obj_set_text_font_closure) }, - { be_const_key_weak(parse_color, -1), be_const_static_closure(lvh_obj_parse_color_closure) }, + { be_const_key_weak(id, 64), be_const_var(0) }, + { be_const_key_weak(_val_rule, 65), be_const_var(6) }, + { be_const_key_weak(_val_rule_function, -1), be_const_var(8) }, + { be_const_key_weak(get_pad_bottom, -1), be_const_closure(lvh_obj_get_pad_bottom_closure) }, + { be_const_key_weak(val_rule_matched, -1), be_const_closure(lvh_obj_val_rule_matched_closure) }, + { be_const_key_weak(get_enabled, 86), be_const_closure(lvh_obj_get_enabled_closure) }, + { be_const_key_weak(set_meta, 35), be_const_closure(lvh_obj_set_meta_closure) }, + { be_const_key_weak(get_val_rule, 52), be_const_closure(lvh_obj_get_val_rule_closure) }, + { be_const_key_weak(_page, 47), be_const_var(3) }, + { be_const_key_weak(init, -1), be_const_closure(lvh_obj_init_closure) }, + { be_const_key_weak(set_toggle, 36), be_const_closure(lvh_obj_set_toggle_closure) }, + { be_const_key_weak(_text_rule_function, -1), be_const_var(11) }, + { be_const_key_weak(check_label, 49), be_const_closure(lvh_obj_check_label_closure) }, + { be_const_key_weak(get_meta, -1), be_const_closure(lvh_obj_get_meta_closure) }, + { be_const_key_weak(set_val_rule, 59), be_const_closure(lvh_obj_set_val_rule_closure) }, + { be_const_key_weak(set_enabled, -1), be_const_closure(lvh_obj_set_enabled_closure) }, + { be_const_key_weak(get_action, -1), be_const_closure(lvh_obj_get_action_closure) }, + { be_const_key_weak(get_radius2, 18), be_const_closure(lvh_obj_get_radius2_closure) }, + { be_const_key_weak(_lv_obj, -1), be_const_var(1) }, + { be_const_key_weak(get_text_rule_formula, -1), be_const_closure(lvh_obj_get_text_rule_formula_closure) }, + { be_const_key_weak(get_value_ofs_x, -1), be_const_closure(lvh_obj_get_value_ofs_x_closure) }, + { be_const_key_weak(get_value_color, -1), be_const_closure(lvh_obj_get_value_color_closure) }, + { be_const_key_weak(set_pad_bottom2, -1), be_const_closure(lvh_obj_set_pad_bottom2_closure) }, + { be_const_key_weak(get_text_color, -1), be_const_closure(lvh_obj_get_text_color_closure) }, + { be_const_key_weak(get_value_ofs_y, 71), be_const_closure(lvh_obj_get_value_ofs_y_closure) }, { be_const_key_weak(get_text_font, -1), be_const_closure(lvh_obj_get_text_font_closure) }, - { be_const_key_weak(text_rule_matched, 70), be_const_closure(lvh_obj_text_rule_matched_closure) }, - { be_const_key_weak(_lv_class, -1), be_const_class(be_class_lv_obj) }, - { be_const_key_weak(set_text, 78), be_const_closure(lvh_obj_set_text_closure) }, - { be_const_key_weak(set_align, -1), be_const_closure(lvh_obj_set_align_closure) }, - { be_const_key_weak(set_val_rule, 35), be_const_closure(lvh_obj_set_val_rule_closure) }, - { be_const_key_weak(set_val, -1), be_const_closure(lvh_obj_set_val_closure) }, - { be_const_key_weak(get_pad_right, 80), be_const_closure(lvh_obj_get_pad_right_closure) }, - { be_const_key_weak(_text_rule_formula, 79), be_const_var(9) }, - { be_const_key_weak(set_action, -1), be_const_closure(lvh_obj_set_action_closure) }, - { be_const_key_weak(get_value_ofs_x, 86), be_const_closure(lvh_obj_get_value_ofs_x_closure) }, - { be_const_key_weak(set_value_ofs_y, 6), be_const_closure(lvh_obj_set_value_ofs_y_closure) }, - { be_const_key_weak(remove_trailing_zeroes, 41), be_const_static_closure(lvh_obj_remove_trailing_zeroes_closure) }, - { be_const_key_weak(post_init, 18), be_const_closure(lvh_obj_post_init_closure) }, { be_const_key_weak(get_mode, -1), be_const_closure(lvh_obj_get_mode_closure) }, - { be_const_key_weak(_action, -1), be_const_var(4) }, - { be_const_key_weak(_lv_label, 7), be_const_var(2) }, - { be_const_key_weak(set_toggle, 31), be_const_closure(lvh_obj_set_toggle_closure) }, + { be_const_key_weak(_text_rule_formula, 5), be_const_var(10) }, + { be_const_key_weak(set_text_rule_formula, -1), be_const_closure(lvh_obj_set_text_rule_formula_closure) }, + { be_const_key_weak(get_pad_top, -1), be_const_closure(lvh_obj_get_pad_top_closure) }, + { be_const_key_weak(set_adjustable, -1), be_const_closure(lvh_obj_set_adjustable_closure) }, + { be_const_key_weak(set_value_color, -1), be_const_closure(lvh_obj_set_value_color_closure) }, + { be_const_key_weak(get_val, 67), be_const_closure(lvh_obj_get_val_closure) }, + { be_const_key_weak(set_pad_all2, -1), be_const_closure(lvh_obj_set_pad_all2_closure) }, + { be_const_key_weak(_lv_label, 29), be_const_var(2) }, + { be_const_key_weak(_lv_class, -1), be_const_class(be_class_lv_obj) }, + { be_const_key_weak(setmember, 88), be_const_closure(lvh_obj_setmember_closure) }, { be_const_key_weak(_attr_map, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { be_const_map( * be_nested_map(26, ( (struct bmapnode*) &(const bmapnode[]) { @@ -3962,40 +4032,15 @@ be_local_class(lvh_obj, { be_const_key_weak(pad_top, 16), be_nested_str_weak(style_pad_top) }, { be_const_key_weak(bg_grad_dir, 14), be_nested_str_weak(style_bg_grad_dir) }, })) ) } )) }, - { be_const_key_weak(set_line_width, -1), be_const_closure(lvh_obj_set_line_width_closure) }, - { be_const_key_weak(set_value_str, 72), be_const_closure(lvh_obj_set_value_str_closure) }, - { be_const_key_weak(is_color_attribute, -1), be_const_static_closure(lvh_obj_is_color_attribute_closure) }, - { be_const_key_weak(_lv_obj, -1), be_const_var(1) }, - { be_const_key_weak(set_value_color, -1), be_const_closure(lvh_obj_set_value_color_closure) }, - { be_const_key_weak(get_value_color, -1), be_const_closure(lvh_obj_get_value_color_closure) }, - { be_const_key_weak(get_val_rule, -1), be_const_closure(lvh_obj_get_val_rule_closure) }, - { be_const_key_weak(get_val, -1), be_const_closure(lvh_obj_get_val_closure) }, - { be_const_key_weak(get_click, -1), be_const_closure(lvh_obj_get_click_closure) }, - { be_const_key_weak(get_enabled, 81), be_const_closure(lvh_obj_get_enabled_closure) }, - { be_const_key_weak(set_adjustable, -1), be_const_closure(lvh_obj_set_adjustable_closure) }, - { be_const_key_weak(get_pad_left, 16), be_const_closure(lvh_obj_get_pad_left_closure) }, - { be_const_key_weak(get_value_ofs_y, -1), be_const_closure(lvh_obj_get_value_ofs_y_closure) }, - { be_const_key_weak(_val_rule_formula, 76), be_const_var(6) }, - { be_const_key_weak(get_text_rule, 34), be_const_closure(lvh_obj_get_text_rule_closure) }, - { be_const_key_weak(set_value_font, 74), be_const_closure(lvh_obj_set_value_font_closure) }, - { be_const_key_weak(_val_rule, -1), be_const_var(5) }, - { be_const_key_weak(event_cb, 58), be_const_closure(lvh_obj_event_cb_closure) }, - { be_const_key_weak(set_text_rule, -1), be_const_closure(lvh_obj_set_text_rule_closure) }, - { be_const_key_weak(get_adjustable, -1), be_const_closure(lvh_obj_get_adjustable_closure) }, - { be_const_key_weak(get_toggle, -1), be_const_closure(lvh_obj_get_toggle_closure) }, - { be_const_key_weak(get_value_str, -1), be_const_closure(lvh_obj_get_value_str_closure) }, - { be_const_key_weak(set_pad_right2, -1), be_const_closure(lvh_obj_set_pad_right2_closure) }, - { be_const_key_weak(set_val_rule_formula, 66), be_const_closure(lvh_obj_set_val_rule_formula_closure) }, - { be_const_key_weak(id, 5), be_const_var(0) }, - { be_const_key_weak(set_pad_bottom2, 33), be_const_closure(lvh_obj_set_pad_bottom2_closure) }, - { be_const_key_weak(get_pad_top, 36), be_const_closure(lvh_obj_get_pad_top_closure) }, - { be_const_key_weak(get_val_rule_formula, -1), be_const_closure(lvh_obj_get_val_rule_formula_closure) }, - { be_const_key_weak(set_hidden, -1), be_const_closure(lvh_obj_set_hidden_closure) }, - { be_const_key_weak(_page, -1), be_const_var(3) }, - { be_const_key_weak(check_label, -1), be_const_closure(lvh_obj_check_label_closure) }, + { be_const_key_weak(remove_trailing_zeroes, -1), be_const_static_closure(lvh_obj_remove_trailing_zeroes_closure) }, + { be_const_key_weak(_action, -1), be_const_var(4) }, { be_const_key_weak(get_text, -1), be_const_closure(lvh_obj_get_text_closure) }, - { be_const_key_weak(set_text_rule_format, 60), be_const_closure(lvh_obj_set_text_rule_format_closure) }, - { be_const_key_weak(set_pad_all2, -1), be_const_closure(lvh_obj_set_pad_all2_closure) }, + { be_const_key_weak(_val_rule_formula, -1), be_const_var(7) }, + { be_const_key_weak(get_pad_all, -1), be_const_closure(lvh_obj_get_pad_all_closure) }, + { be_const_key_weak(set_action, -1), be_const_closure(lvh_obj_set_action_closure) }, + { be_const_key_weak(set_hidden, 46), be_const_closure(lvh_obj_set_hidden_closure) }, + { be_const_key_weak(get_text_rule, 75), be_const_closure(lvh_obj_get_text_rule_closure) }, + { be_const_key_weak(get_adjustable, -1), be_const_closure(lvh_obj_get_adjustable_closure) }, { be_const_key_weak(_event_map, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { be_const_map( * be_nested_map(7, ( (struct bmapnode*) &(const bmapnode[]) { @@ -4007,27 +4052,39 @@ be_local_class(lvh_obj, { be_const_key_int(5, -1), be_nested_str_weak(long) }, { be_const_key_int(6, -1), be_nested_str_weak(hold) }, })) ) } )) }, - { be_const_key_weak(set_text_color, -1), be_const_closure(lvh_obj_set_text_color_closure) }, - { be_const_key_weak(_text_rule, -1), be_const_var(8) }, - { be_const_key_weak(get_pad_bottom, -1), be_const_closure(lvh_obj_get_pad_bottom_closure) }, + { be_const_key_weak(set_radius2, 78), be_const_closure(lvh_obj_set_radius2_closure) }, + { be_const_key_weak(get_pad_left, -1), be_const_closure(lvh_obj_get_pad_left_closure) }, + { be_const_key_weak(get_value_str, 58), be_const_closure(lvh_obj_get_value_str_closure) }, + { be_const_key_weak(set_value_ofs_y, -1), be_const_closure(lvh_obj_set_value_ofs_y_closure) }, { be_const_key_weak(_lv_part2_selector, -1), be_const_nil() }, - { be_const_key_weak(set_pad_left2, 42), be_const_closure(lvh_obj_set_pad_left2_closure) }, - { be_const_key_weak(get_line_width, 11), be_const_closure(lvh_obj_get_line_width_closure) }, - { be_const_key_weak(setmember, -1), be_const_closure(lvh_obj_setmember_closure) }, - { be_const_key_weak(set_mode, -1), be_const_closure(lvh_obj_set_mode_closure) }, - { be_const_key_weak(init, -1), be_const_closure(lvh_obj_init_closure) }, - { be_const_key_weak(get_obj, -1), be_const_closure(lvh_obj_get_obj_closure) }, - { be_const_key_weak(set_enabled, 32), be_const_closure(lvh_obj_set_enabled_closure) }, - { be_const_key_weak(get_text_rule_formula, -1), be_const_closure(lvh_obj_get_text_rule_formula_closure) }, - { be_const_key_weak(get_align, -1), be_const_closure(lvh_obj_get_align_closure) }, - { be_const_key_weak(set_click, 2), be_const_closure(lvh_obj_set_click_closure) }, - { be_const_key_weak(_val_rule_function, -1), be_const_var(7) }, - { be_const_key_weak(get_action, -1), be_const_closure(lvh_obj_get_action_closure) }, - { be_const_key_weak(member, 8), be_const_closure(lvh_obj_member_closure) }, + { be_const_key_weak(set_text_font, -1), be_const_closure(lvh_obj_set_text_font_closure) }, + { be_const_key_weak(set_value_ofs_x, 45), be_const_closure(lvh_obj_set_value_ofs_x_closure) }, + { be_const_key_weak(text_rule_matched, 79), be_const_closure(lvh_obj_text_rule_matched_closure) }, + { be_const_key_weak(set_line_width, -1), be_const_closure(lvh_obj_set_line_width_closure) }, + { be_const_key_weak(get_val_rule_formula, 69), be_const_closure(lvh_obj_get_val_rule_formula_closure) }, + { be_const_key_weak(set_val_rule_formula, -1), be_const_closure(lvh_obj_set_val_rule_formula_closure) }, + { be_const_key_weak(set_align, -1), be_const_closure(lvh_obj_set_align_closure) }, + { be_const_key_weak(set_text_rule_format, 62), be_const_closure(lvh_obj_set_text_rule_format_closure) }, + { be_const_key_weak(set_value_str, -1), be_const_closure(lvh_obj_set_value_str_closure) }, + { be_const_key_weak(_text_rule_format, -1), be_const_var(12) }, + { be_const_key_weak(post_init, -1), be_const_closure(lvh_obj_post_init_closure) }, + { be_const_key_weak(get_text_rule_format, -1), be_const_closure(lvh_obj_get_text_rule_format_closure) }, + { be_const_key_weak(set_text_rule, -1), be_const_closure(lvh_obj_set_text_rule_closure) }, + { be_const_key_weak(member, -1), be_const_closure(lvh_obj_member_closure) }, + { be_const_key_weak(is_color_attribute, -1), be_const_static_closure(lvh_obj_is_color_attribute_closure) }, + { be_const_key_weak(set_click, -1), be_const_closure(lvh_obj_set_click_closure) }, { be_const_key_weak(get_hidden, -1), be_const_closure(lvh_obj_get_hidden_closure) }, - { be_const_key_weak(get_pad_all, -1), be_const_closure(lvh_obj_get_pad_all_closure) }, - { be_const_key_weak(set_text_rule_formula, -1), be_const_closure(lvh_obj_set_text_rule_formula_closure) }, - { be_const_key_weak(get_text_color, -1), be_const_closure(lvh_obj_get_text_color_closure) }, + { be_const_key_weak(get_pad_right, -1), be_const_closure(lvh_obj_get_pad_right_closure) }, + { be_const_key_weak(event_cb, 34), be_const_closure(lvh_obj_event_cb_closure) }, + { be_const_key_weak(set_val, -1), be_const_closure(lvh_obj_set_val_closure) }, + { be_const_key_weak(set_text_color, 20), be_const_closure(lvh_obj_set_text_color_closure) }, + { be_const_key_weak(get_toggle, -1), be_const_closure(lvh_obj_get_toggle_closure) }, + { be_const_key_weak(register_event_cb, 11), be_const_closure(lvh_obj_register_event_cb_closure) }, + { be_const_key_weak(get_click, -1), be_const_closure(lvh_obj_get_click_closure) }, + { be_const_key_weak(set_value_font, 7), be_const_closure(lvh_obj_set_value_font_closure) }, + { be_const_key_weak(set_pad_right2, -1), be_const_closure(lvh_obj_set_pad_right2_closure) }, + { be_const_key_weak(set_text, -1), be_const_closure(lvh_obj_set_text_closure) }, + { be_const_key_weak(_meta, 1), be_const_var(5) }, })), be_str_weak(lvh_obj) ); @@ -7214,7 +7271,7 @@ be_local_closure(HASPmota_sort, /* name */ ********************************************************************/ be_local_closure(HASPmota_parse_obj, /* name */ be_nested_proto( - 20, /* nstack */ + 21, /* nstack */ 3, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -7222,7 +7279,7 @@ be_local_closure(HASPmota_parse_obj, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[30]) { /* constants */ + ( &(const bvalue[32]) { /* constants */ /* K0 */ be_nested_str_weak(global), /* K1 */ be_nested_str_weak(string), /* K2 */ be_nested_str_weak(introspect), @@ -7233,7 +7290,7 @@ be_local_closure(HASPmota_parse_obj, /* name */ /* K7 */ be_nested_str_weak(berry_run), /* K8 */ be_nested_str_weak(nil), /* K9 */ be_nested_str_weak(format), - /* K10 */ be_nested_str_weak(HSP_X3A_X20unable_X20to_X20run_X20berry_X20code_X20_X22_X25s_X22_X20_X2D_X20_X27_X25s_X27_X20_X2D_X20_X25s), + /* K10 */ be_nested_str_weak(HSP_X3A_X20unable_X20to_X20compile_X20berry_X20code_X20_X22_X25s_X22_X20_X2D_X20_X27_X25s_X27_X20_X2D_X20_X25s), /* K11 */ be_const_int(1), /* K12 */ be_nested_str_weak(HSP_X3A_X20invalid_X20_X27id_X27_X3A_X20), /* K13 */ be_nested_str_weak(_X20for_X20_X27obj_X27_X3A), @@ -7249,14 +7306,16 @@ be_local_closure(HASPmota_parse_obj, /* name */ /* K23 */ be_nested_str_weak(HSP_X3A_X20cannot_X20find_X20object_X20of_X20type_X20), /* K24 */ be_nested_str_weak(set_obj), /* K25 */ be_nested_str_weak(p_X25ib_X25i), - /* K26 */ be_const_int(0), - /* K27 */ be_nested_str_weak(HSP_X3A_X20cannot_X20specify_X20_X27obj_X27_X20for_X20_X27id_X27_X3A0), - /* K28 */ be_nested_str_weak(keys), - /* K29 */ be_nested_str_weak(stop_iteration), + /* K26 */ be_nested_str_weak(function), + /* K27 */ be_nested_str_weak(HSP_X3A_X20unable_X20to_X20run_X20berry_X20code_X20_X22_X25s_X22_X20_X2D_X20_X27_X25s_X27_X20_X2D_X20_X25s), + /* K28 */ be_const_int(0), + /* K29 */ be_nested_str_weak(HSP_X3A_X20cannot_X20specify_X20_X27obj_X27_X20for_X20_X27id_X27_X3A0), + /* K30 */ be_nested_str_weak(keys), + /* K31 */ be_nested_str_weak(stop_iteration), }), be_str_weak(parse_obj), &be_const_str_solidified, - ( &(const binstruction[190]) { /* code */ + ( &(const binstruction[218]) { /* code */ 0xA40E0000, // 0000 IMPORT R3 K0 0xA4120200, // 0001 IMPORT R4 K1 0xA4160400, // 0002 IMPORT R5 K2 @@ -7278,175 +7337,203 @@ be_local_closure(HASPmota_parse_obj, /* name */ 0x58340007, // 0012 LDCONST R13 K7 0x7C2C0400, // 0013 CALL R11 2 0x7C280200, // 0014 CALL R10 1 - 0x202C1508, // 0015 NE R11 R10 K8 - 0x782E0013, // 0016 JMPF R11 #002B - 0xA8020006, // 0017 EXBLK 0 #001F - 0x602C000D, // 0018 GETGBL R11 G13 - 0x5C301400, // 0019 MOVE R12 R10 - 0x7C2C0200, // 001A CALL R11 1 - 0x5C301600, // 001B MOVE R12 R11 - 0x7C300000, // 001C CALL R12 0 + 0x4C2C0000, // 0015 LDNIL R11 + 0x20301508, // 0016 NE R12 R10 K8 + 0x78320012, // 0017 JMPF R12 #002B + 0xA8020005, // 0018 EXBLK 0 #001F + 0x6030000D, // 0019 GETGBL R12 G13 + 0x5C341400, // 001A MOVE R13 R10 + 0x7C300200, // 001B CALL R12 1 + 0x5C2C1800, // 001C MOVE R11 R12 0xA8040001, // 001D EXBLK 1 1 0x7002000B, // 001E JMP #002B - 0xAC2C0002, // 001F CATCH R11 0 2 + 0xAC300002, // 001F CATCH R12 0 2 0x70020008, // 0020 JMP #002A - 0x60340001, // 0021 GETGBL R13 G1 - 0x8C380909, // 0022 GETMET R14 R4 K9 - 0x5840000A, // 0023 LDCONST R16 K10 - 0x5C441400, // 0024 MOVE R17 R10 - 0x5C481600, // 0025 MOVE R18 R11 - 0x5C4C1800, // 0026 MOVE R19 R12 - 0x7C380A00, // 0027 CALL R14 5 - 0x7C340200, // 0028 CALL R13 1 + 0x60380001, // 0021 GETGBL R14 G1 + 0x8C3C0909, // 0022 GETMET R15 R4 K9 + 0x5844000A, // 0023 LDCONST R17 K10 + 0x5C481400, // 0024 MOVE R18 R10 + 0x5C4C1800, // 0025 MOVE R19 R12 + 0x5C501A00, // 0026 MOVE R20 R13 + 0x7C3C0A00, // 0027 CALL R15 5 + 0x7C380200, // 0028 CALL R14 1 0x70020000, // 0029 JMP #002B 0xB0080000, // 002A RAISE 2 R0 R0 - 0x4C2C0000, // 002B LDNIL R11 - 0x1C2C0C0B, // 002C EQ R11 R6 R11 - 0x782E0000, // 002D JMPF R11 #002F - 0x80001600, // 002E RET 0 - 0x202C0F08, // 002F NE R11 R7 K8 - 0x782E006E, // 0030 JMPF R11 #00A0 - 0x4C2C0000, // 0031 LDNIL R11 - 0x202C0C0B, // 0032 NE R11 R6 R11 - 0x782E006B, // 0033 JMPF R11 #00A0 - 0x142C0D0B, // 0034 LT R11 R6 K11 - 0x742E0002, // 0035 JMPT R11 #0039 - 0x542E00FD, // 0036 LDINT R11 254 - 0x242C0C0B, // 0037 GT R11 R6 R11 - 0x782E0008, // 0038 JMPF R11 #0042 - 0x602C0001, // 0039 GETGBL R11 G1 - 0x60300008, // 003A GETGBL R12 G8 - 0x5C340C00, // 003B MOVE R13 R6 - 0x7C300200, // 003C CALL R12 1 - 0x0032180C, // 003D ADD R12 K12 R12 - 0x0030190D, // 003E ADD R12 R12 K13 - 0x00301807, // 003F ADD R12 R12 R7 - 0x7C2C0200, // 0040 CALL R11 1 - 0x80001600, // 0041 RET 0 - 0x4C2C0000, // 0042 LDNIL R11 - 0x60300009, // 0043 GETGBL R12 G9 - 0x8C340303, // 0044 GETMET R13 R1 K3 - 0x583C000E, // 0045 LDCONST R15 K14 - 0x7C340400, // 0046 CALL R13 2 - 0x7C300200, // 0047 CALL R12 1 - 0x4C340000, // 0048 LDNIL R13 - 0x2034180D, // 0049 NE R13 R12 R13 - 0x78360006, // 004A JMPF R13 #0052 - 0x8C34130F, // 004B GETMET R13 R9 K15 - 0x5C3C1800, // 004C MOVE R15 R12 - 0x7C340400, // 004D CALL R13 2 - 0x4C380000, // 004E LDNIL R14 - 0x20381A0E, // 004F NE R14 R13 R14 - 0x783A0000, // 0050 JMPF R14 #0052 - 0x882C1B10, // 0051 GETMBR R11 R13 K16 - 0x4C340000, // 0052 LDNIL R13 - 0x1C34160D, // 0053 EQ R13 R11 R13 - 0x78360002, // 0054 JMPF R13 #0058 - 0x8C341311, // 0055 GETMET R13 R9 K17 - 0x7C340200, // 0056 CALL R13 1 - 0x5C2C1A00, // 0057 MOVE R11 R13 - 0x8C340B12, // 0058 GETMET R13 R5 K18 - 0x5C3C0000, // 0059 MOVE R15 R0 - 0x00422607, // 005A ADD R16 K19 R7 - 0x7C340600, // 005B CALL R13 3 - 0x4C380000, // 005C LDNIL R14 - 0x4C3C0000, // 005D LDNIL R15 - 0x1C3C1A0F, // 005E EQ R15 R13 R15 - 0x783E0010, // 005F JMPF R15 #0071 - 0x8C3C0B12, // 0060 GETMET R15 R5 K18 - 0x5C440600, // 0061 MOVE R17 R3 - 0x5C480E00, // 0062 MOVE R18 R7 - 0x7C3C0600, // 0063 CALL R15 3 - 0x4C400000, // 0064 LDNIL R16 - 0x20401E10, // 0065 NE R16 R15 R16 - 0x78420009, // 0066 JMPF R16 #0071 - 0x60400004, // 0067 GETGBL R16 G4 - 0x5C441E00, // 0068 MOVE R17 R15 - 0x7C400200, // 0069 CALL R16 1 - 0x1C402114, // 006A EQ R16 R16 K20 - 0x78420004, // 006B JMPF R16 #0071 - 0x5C401E00, // 006C MOVE R16 R15 - 0x5C441600, // 006D MOVE R17 R11 - 0x7C400200, // 006E CALL R16 1 - 0x5C382000, // 006F MOVE R14 R16 - 0x88340115, // 0070 GETMBR R13 R0 K21 - 0x4C3C0000, // 0071 LDNIL R15 - 0x1C3C1A0F, // 0072 EQ R15 R13 R15 - 0x783E000F, // 0073 JMPF R15 #0084 - 0x8C3C0B16, // 0074 GETMET R15 R5 K22 - 0x5C440E00, // 0075 MOVE R17 R7 - 0x7C3C0400, // 0076 CALL R15 2 - 0x4C400000, // 0077 LDNIL R16 - 0x20401E10, // 0078 NE R16 R15 R16 - 0x78420009, // 0079 JMPF R16 #0084 - 0x60400004, // 007A GETGBL R16 G4 - 0x5C441E00, // 007B MOVE R17 R15 - 0x7C400200, // 007C CALL R16 1 - 0x1C402114, // 007D EQ R16 R16 K20 - 0x78420004, // 007E JMPF R16 #0084 - 0x5C401E00, // 007F MOVE R16 R15 - 0x5C441600, // 0080 MOVE R17 R11 - 0x7C400200, // 0081 CALL R16 1 - 0x5C382000, // 0082 MOVE R14 R16 - 0x88340115, // 0083 GETMBR R13 R0 K21 - 0x4C3C0000, // 0084 LDNIL R15 - 0x1C3C1A0F, // 0085 EQ R15 R13 R15 - 0x783E0006, // 0086 JMPF R15 #008E - 0x603C0001, // 0087 GETGBL R15 G1 - 0x60400008, // 0088 GETGBL R16 G8 - 0x5C440E00, // 0089 MOVE R17 R7 - 0x7C400200, // 008A CALL R16 1 - 0x00422E10, // 008B ADD R16 K23 R16 - 0x7C3C0200, // 008C CALL R15 1 - 0x80001E00, // 008D RET 0 - 0x5C3C1A00, // 008E MOVE R15 R13 - 0x5C401600, // 008F MOVE R16 R11 - 0x5C440400, // 0090 MOVE R17 R2 - 0x5C480200, // 0091 MOVE R18 R1 - 0x5C4C1C00, // 0092 MOVE R19 R14 - 0x7C3C0800, // 0093 CALL R15 4 - 0x5C201E00, // 0094 MOVE R8 R15 - 0x8C3C1318, // 0095 GETMET R15 R9 K24 - 0x5C440C00, // 0096 MOVE R17 R6 - 0x5C481000, // 0097 MOVE R18 R8 - 0x7C3C0600, // 0098 CALL R15 3 - 0x8C3C0909, // 0099 GETMET R15 R4 K9 - 0x58440019, // 009A LDCONST R17 K25 - 0x8C481304, // 009B GETMET R18 R9 K4 - 0x7C480200, // 009C CALL R18 1 - 0x5C4C0C00, // 009D MOVE R19 R6 - 0x7C3C0800, // 009E CALL R15 4 - 0x900C1E08, // 009F SETMBR R3 R15 R8 - 0x1C2C0D1A, // 00A0 EQ R11 R6 K26 - 0x782E0005, // 00A1 JMPF R11 #00A8 - 0x202C0F08, // 00A2 NE R11 R7 K8 - 0x782E0003, // 00A3 JMPF R11 #00A8 - 0x602C0001, // 00A4 GETGBL R11 G1 - 0x5830001B, // 00A5 LDCONST R12 K27 - 0x7C2C0200, // 00A6 CALL R11 1 - 0x80001600, // 00A7 RET 0 - 0x1C2C0D1A, // 00A8 EQ R11 R6 K26 - 0x782E0005, // 00A9 JMPF R11 #00B0 - 0x8C2C0106, // 00AA GETMET R11 R0 K6 - 0x7C2C0200, // 00AB CALL R11 1 - 0x8C2C170F, // 00AC GETMET R11 R11 K15 - 0x5834001A, // 00AD LDCONST R13 K26 - 0x7C2C0400, // 00AE CALL R11 2 - 0x5C201600, // 00AF MOVE R8 R11 - 0x602C0010, // 00B0 GETGBL R11 G16 - 0x8C30031C, // 00B1 GETMET R12 R1 K28 - 0x7C300200, // 00B2 CALL R12 1 - 0x7C2C0200, // 00B3 CALL R11 1 - 0xA8020004, // 00B4 EXBLK 0 #00BA - 0x5C301600, // 00B5 MOVE R12 R11 - 0x7C300000, // 00B6 CALL R12 0 - 0x9434020C, // 00B7 GETIDX R13 R1 R12 - 0x9020180D, // 00B8 SETMBR R8 R12 R13 - 0x7001FFFA, // 00B9 JMP #00B5 - 0x582C001D, // 00BA LDCONST R11 K29 - 0xAC2C0200, // 00BB CATCH R11 1 0 - 0xB0080000, // 00BC RAISE 2 R0 R0 - 0x80000000, // 00BD RET 0 + 0x4C300000, // 002B LDNIL R12 + 0x1C300C0C, // 002C EQ R12 R6 R12 + 0x78320000, // 002D JMPF R12 #002F + 0x80001800, // 002E RET 0 + 0x20300F08, // 002F NE R12 R7 K8 + 0x7832006E, // 0030 JMPF R12 #00A0 + 0x4C300000, // 0031 LDNIL R12 + 0x20300C0C, // 0032 NE R12 R6 R12 + 0x7832006B, // 0033 JMPF R12 #00A0 + 0x14300D0B, // 0034 LT R12 R6 K11 + 0x74320002, // 0035 JMPT R12 #0039 + 0x543200FD, // 0036 LDINT R12 254 + 0x24300C0C, // 0037 GT R12 R6 R12 + 0x78320008, // 0038 JMPF R12 #0042 + 0x60300001, // 0039 GETGBL R12 G1 + 0x60340008, // 003A GETGBL R13 G8 + 0x5C380C00, // 003B MOVE R14 R6 + 0x7C340200, // 003C CALL R13 1 + 0x0036180D, // 003D ADD R13 K12 R13 + 0x00341B0D, // 003E ADD R13 R13 K13 + 0x00341A07, // 003F ADD R13 R13 R7 + 0x7C300200, // 0040 CALL R12 1 + 0x80001800, // 0041 RET 0 + 0x4C300000, // 0042 LDNIL R12 + 0x60340009, // 0043 GETGBL R13 G9 + 0x8C380303, // 0044 GETMET R14 R1 K3 + 0x5840000E, // 0045 LDCONST R16 K14 + 0x7C380400, // 0046 CALL R14 2 + 0x7C340200, // 0047 CALL R13 1 + 0x4C380000, // 0048 LDNIL R14 + 0x20381A0E, // 0049 NE R14 R13 R14 + 0x783A0006, // 004A JMPF R14 #0052 + 0x8C38130F, // 004B GETMET R14 R9 K15 + 0x5C401A00, // 004C MOVE R16 R13 + 0x7C380400, // 004D CALL R14 2 + 0x4C3C0000, // 004E LDNIL R15 + 0x203C1C0F, // 004F NE R15 R14 R15 + 0x783E0000, // 0050 JMPF R15 #0052 + 0x88301D10, // 0051 GETMBR R12 R14 K16 + 0x4C380000, // 0052 LDNIL R14 + 0x1C38180E, // 0053 EQ R14 R12 R14 + 0x783A0002, // 0054 JMPF R14 #0058 + 0x8C381311, // 0055 GETMET R14 R9 K17 + 0x7C380200, // 0056 CALL R14 1 + 0x5C301C00, // 0057 MOVE R12 R14 + 0x8C380B12, // 0058 GETMET R14 R5 K18 + 0x5C400000, // 0059 MOVE R16 R0 + 0x00462607, // 005A ADD R17 K19 R7 + 0x7C380600, // 005B CALL R14 3 + 0x4C3C0000, // 005C LDNIL R15 + 0x4C400000, // 005D LDNIL R16 + 0x1C401C10, // 005E EQ R16 R14 R16 + 0x78420010, // 005F JMPF R16 #0071 + 0x8C400B12, // 0060 GETMET R16 R5 K18 + 0x5C480600, // 0061 MOVE R18 R3 + 0x5C4C0E00, // 0062 MOVE R19 R7 + 0x7C400600, // 0063 CALL R16 3 + 0x4C440000, // 0064 LDNIL R17 + 0x20442011, // 0065 NE R17 R16 R17 + 0x78460009, // 0066 JMPF R17 #0071 + 0x60440004, // 0067 GETGBL R17 G4 + 0x5C482000, // 0068 MOVE R18 R16 + 0x7C440200, // 0069 CALL R17 1 + 0x1C442314, // 006A EQ R17 R17 K20 + 0x78460004, // 006B JMPF R17 #0071 + 0x5C442000, // 006C MOVE R17 R16 + 0x5C481800, // 006D MOVE R18 R12 + 0x7C440200, // 006E CALL R17 1 + 0x5C3C2200, // 006F MOVE R15 R17 + 0x88380115, // 0070 GETMBR R14 R0 K21 + 0x4C400000, // 0071 LDNIL R16 + 0x1C401C10, // 0072 EQ R16 R14 R16 + 0x7842000F, // 0073 JMPF R16 #0084 + 0x8C400B16, // 0074 GETMET R16 R5 K22 + 0x5C480E00, // 0075 MOVE R18 R7 + 0x7C400400, // 0076 CALL R16 2 + 0x4C440000, // 0077 LDNIL R17 + 0x20442011, // 0078 NE R17 R16 R17 + 0x78460009, // 0079 JMPF R17 #0084 + 0x60440004, // 007A GETGBL R17 G4 + 0x5C482000, // 007B MOVE R18 R16 + 0x7C440200, // 007C CALL R17 1 + 0x1C442314, // 007D EQ R17 R17 K20 + 0x78460004, // 007E JMPF R17 #0084 + 0x5C442000, // 007F MOVE R17 R16 + 0x5C481800, // 0080 MOVE R18 R12 + 0x7C440200, // 0081 CALL R17 1 + 0x5C3C2200, // 0082 MOVE R15 R17 + 0x88380115, // 0083 GETMBR R14 R0 K21 + 0x4C400000, // 0084 LDNIL R16 + 0x1C401C10, // 0085 EQ R16 R14 R16 + 0x78420006, // 0086 JMPF R16 #008E + 0x60400001, // 0087 GETGBL R16 G1 + 0x60440008, // 0088 GETGBL R17 G8 + 0x5C480E00, // 0089 MOVE R18 R7 + 0x7C440200, // 008A CALL R17 1 + 0x00462E11, // 008B ADD R17 K23 R17 + 0x7C400200, // 008C CALL R16 1 + 0x80002000, // 008D RET 0 + 0x5C401C00, // 008E MOVE R16 R14 + 0x5C441800, // 008F MOVE R17 R12 + 0x5C480400, // 0090 MOVE R18 R2 + 0x5C4C0200, // 0091 MOVE R19 R1 + 0x5C501E00, // 0092 MOVE R20 R15 + 0x7C400800, // 0093 CALL R16 4 + 0x5C202000, // 0094 MOVE R8 R16 + 0x8C401318, // 0095 GETMET R16 R9 K24 + 0x5C480C00, // 0096 MOVE R18 R6 + 0x5C4C1000, // 0097 MOVE R19 R8 + 0x7C400600, // 0098 CALL R16 3 + 0x8C400909, // 0099 GETMET R16 R4 K9 + 0x58480019, // 009A LDCONST R18 K25 + 0x8C4C1304, // 009B GETMET R19 R9 K4 + 0x7C4C0200, // 009C CALL R19 1 + 0x5C500C00, // 009D MOVE R20 R6 + 0x7C400800, // 009E CALL R16 4 + 0x900C2008, // 009F SETMBR R3 R16 R8 + 0x4C300000, // 00A0 LDNIL R12 + 0x2030160C, // 00A1 NE R12 R11 R12 + 0x78320018, // 00A2 JMPF R12 #00BC + 0xA802000B, // 00A3 EXBLK 0 #00B0 + 0x5C301600, // 00A4 MOVE R12 R11 + 0x7C300000, // 00A5 CALL R12 0 + 0x60340004, // 00A6 GETGBL R13 G4 + 0x5C381800, // 00A7 MOVE R14 R12 + 0x7C340200, // 00A8 CALL R13 1 + 0x1C341B1A, // 00A9 EQ R13 R13 K26 + 0x78360002, // 00AA JMPF R13 #00AE + 0x5C341800, // 00AB MOVE R13 R12 + 0x5C381000, // 00AC MOVE R14 R8 + 0x7C340200, // 00AD CALL R13 1 + 0xA8040001, // 00AE EXBLK 1 1 + 0x7002000B, // 00AF JMP #00BC + 0xAC300002, // 00B0 CATCH R12 0 2 + 0x70020008, // 00B1 JMP #00BB + 0x60380001, // 00B2 GETGBL R14 G1 + 0x8C3C0909, // 00B3 GETMET R15 R4 K9 + 0x5844001B, // 00B4 LDCONST R17 K27 + 0x5C481400, // 00B5 MOVE R18 R10 + 0x5C4C1800, // 00B6 MOVE R19 R12 + 0x5C501A00, // 00B7 MOVE R20 R13 + 0x7C3C0A00, // 00B8 CALL R15 5 + 0x7C380200, // 00B9 CALL R14 1 + 0x70020000, // 00BA JMP #00BC + 0xB0080000, // 00BB RAISE 2 R0 R0 + 0x1C300D1C, // 00BC EQ R12 R6 K28 + 0x78320005, // 00BD JMPF R12 #00C4 + 0x20300F08, // 00BE NE R12 R7 K8 + 0x78320003, // 00BF JMPF R12 #00C4 + 0x60300001, // 00C0 GETGBL R12 G1 + 0x5834001D, // 00C1 LDCONST R13 K29 + 0x7C300200, // 00C2 CALL R12 1 + 0x80001800, // 00C3 RET 0 + 0x1C300D1C, // 00C4 EQ R12 R6 K28 + 0x78320005, // 00C5 JMPF R12 #00CC + 0x8C300106, // 00C6 GETMET R12 R0 K6 + 0x7C300200, // 00C7 CALL R12 1 + 0x8C30190F, // 00C8 GETMET R12 R12 K15 + 0x5838001C, // 00C9 LDCONST R14 K28 + 0x7C300400, // 00CA CALL R12 2 + 0x5C201800, // 00CB MOVE R8 R12 + 0x60300010, // 00CC GETGBL R12 G16 + 0x8C34031E, // 00CD GETMET R13 R1 K30 + 0x7C340200, // 00CE CALL R13 1 + 0x7C300200, // 00CF CALL R12 1 + 0xA8020004, // 00D0 EXBLK 0 #00D6 + 0x5C341800, // 00D1 MOVE R13 R12 + 0x7C340000, // 00D2 CALL R13 0 + 0x9438020D, // 00D3 GETIDX R14 R1 R13 + 0x90201A0E, // 00D4 SETMBR R8 R13 R14 + 0x7001FFFA, // 00D5 JMP #00D1 + 0x5830001F, // 00D6 LDCONST R12 K31 + 0xAC300200, // 00D7 CATCH R12 1 0 + 0xB0080000, // 00D8 RAISE 2 R0 R0 + 0x80000000, // 00D9 RET 0 }) ) ); diff --git a/tasmota/berry/haspmota_src/haspmota_core/haspmota.be b/tasmota/berry/haspmota_src/haspmota_core/haspmota.be index ec43e6131..76e66f29e 100644 --- a/tasmota/berry/haspmota_src/haspmota_core/haspmota.be +++ b/tasmota/berry/haspmota_src/haspmota_core/haspmota.be @@ -138,6 +138,7 @@ class lvh_obj # "text_rule": nil, # "text_rule_formula": nil, # "text_rule_format": nil, + # "meta": nil, # roller # "options": nil, # qrcode @@ -154,6 +155,7 @@ class lvh_obj var _lv_label # sub-label if exists var _page # parent page object var _action # value of the HASPmota `action` attribute, shouldn't be called `self.action` since we want to trigger the set/member functions + var _meta # free form metadata #==================================================================== # Rule engine to map value and text to rules @@ -778,6 +780,17 @@ class lvh_obj end end + #==================================================================== + # Metadata + # + #==================================================================== + def set_meta(t) + self._meta = t + end + def get_meta() + return self._meta + end + #==================================================================== # Rule based updates of `val` and `text` # @@ -1725,13 +1738,12 @@ class HASPmota # first run any Berry code embedded var berry_run = str(jline.find("berry_run")) + var func_compiled if berry_run != "nil" try - var func_compiled = compile(berry_run) - # run the compiled code once - func_compiled() + func_compiled = compile(berry_run) except .. as e,m - print(string.format("HSP: unable to run berry code \"%s\" - '%s' - %s", berry_run, e, m)) + print(string.format("HSP: unable to compile berry code \"%s\" - '%s' - %s", berry_run, e, m)) end end @@ -1795,6 +1807,19 @@ class HASPmota # create a global variable for this object of form pb, ex p1b2 var glob_name = string.format("p%ib%i", lvh_page_cur.id(), obj_id) global.(glob_name) = obj_lvh + + end + + if func_compiled != nil + try + # run the compiled code once + var f_ret = func_compiled() + if type(f_ret) == 'function' + f_ret(obj_lvh) + end + except .. as e,m + print(string.format("HSP: unable to run berry code \"%s\" - '%s' - %s", berry_run, e, m)) + end end if obj_id == 0 && obj_type != "nil" From 2d8ea8f51cf4d5fd168b43139caf7979da44cdad Mon Sep 17 00:00:00 2001 From: s-hadinger <49731213+s-hadinger@users.noreply.github.com> Date: Wed, 17 May 2023 22:43:13 +0200 Subject: [PATCH 141/289] Berry persist hide errors when saving (#18686) --- .../berry_tasmota/src/embedded/persist.be | 250 +++++++++--------- .../src/solidify/solidified_persist.h | 174 ++++++------ 2 files changed, 217 insertions(+), 207 deletions(-) diff --git a/lib/libesp32/berry_tasmota/src/embedded/persist.be b/lib/libesp32/berry_tasmota/src/embedded/persist.be index 8fc32a8e6..35436c3e3 100644 --- a/lib/libesp32/berry_tasmota/src/embedded/persist.be +++ b/lib/libesp32/berry_tasmota/src/embedded/persist.be @@ -10,153 +10,155 @@ #@ solidify:persist_module var persist_module = module("persist") -persist_module.init = def (m) +class Persist + static var _filename = '_persist.json' + var _p + var _dirty - class Persist - var _filename - var _p - var _dirty - - #- persist can be initialized with pre-existing values. The map is not copied so any change will be reflected -# - def init(m) - # print("Persist init") - self._filename = '_persist.json' - if isinstance(m,map) - self._p = m.copy() # need to copy instead? - else - self._p = {} - end - self.load(self._p, self._filename) - self._dirty = false - # print("Persist init") - end - - #- virtual member getter, if a key does not exists return `nil` instead of exception -# - def member(key) - return self._p.find(key) - end - - #- virtual member setter -# - def setmember(key, value) - self._p[key] = value - self._dirty = true - end - - #- clear all entries -# - def zero() + #- persist can be initialized with pre-existing values. The map is not copied so any change will be reflected -# + def init(m) + # print("Persist init") + if isinstance(m,map) + self._p = m.copy() # need to copy instead? + else self._p = {} + end + self.load(self._p, self._filename) + self._dirty = false + # print("Persist init") + end + + #- virtual member getter, if a key does not exists return `nil` instead of exception -# + def member(key) + return self._p.find(key) + end + + #- virtual member setter -# + def setmember(key, value) + self._p[key] = value + self._dirty = true + end + + #- clear all entries -# + def zero() + self._p = {} + self._dirty = true + end + + def remove(k) + self._p.remove(k) self._dirty = true - end - - def remove(k) - self._p.remove(k) - self._dirty = true - end + end - def has(k) - return self._p.has(k) - end + def has(k) + return self._p.has(k) + end - def find(k, d) - return self._p.find(k, d) - end + def find(k, d) + return self._p.find(k, d) + end - def load() - import json - import path - var f # file object - var val # values loaded from json + def load() + import json + import path + var f # file object + var val # values loaded from json - if path.exists(self._filename) - try - f = open(self._filename, "r") - val = json.load(f.read()) - f.close() - except .. as e, m - if f != nil f.close() end - raise e, m - end - if isinstance(val, map) - self._p = val # sucess - else - print("BRY: failed to load _persist.json") - end - self._dirty = false - else - self.save() - end - - # print("Loading") - end - - def save() - var f # file object + if path.exists(self._filename) try - f = open(self._filename, "w") - self.json_fdump(f) + f = open(self._filename, "r") + val = json.load(f.read()) f.close() except .. as e, m if f != nil f.close() end - f = open(self._filename, "w") - f.write('{}') # fallback write empty map - f.close() raise e, m end + if isinstance(val, map) + self._p = val # sucess + else + print("BRY: failed to load _persist.json") + end self._dirty = false - # print("Saving") + else + self.save() end - def json_fdump_any(f, v) - import json - if isinstance(v, map) - self.json_fdump_map(f, v) - elif isinstance(v, list)v - self.json_fdump_list(f, v) - else - f.write(json.dump(v)) + # print("Loading") + end + + def save() + var f # file object + try + f = open(self._filename, "w") + self.json_fdump(f) + f.close() + except .. as e, m + if f != nil f.close() end + f = nil + try + f = open(self._filename, "w") + f.write('{}') # fallback write empty map + except .. end + if f != nil f.close() end + raise e, m end + self._dirty = false + # print("Saving") + end - def json_fdump_map(f, v) - import json - f.write('{') - var sep = nil - for k:v.keys() - if sep != nil f.write(sep) end - - f.write(json.dump(str(k))) - f.write(':') - self.json_fdump_any(f, v[k]) - - sep = "," - end - f.write('}') - end - - def json_fdump_list(f, v) - import json - f.write('[') - var i = 0 - while i < size(v) - if i > 0 f.write(',') end - self.json_fdump_any(f, v[i]) - i += 1 - end - f.write(']') - end - - def json_fdump(f) - import json - if isinstance(self._p, map) - self.json_fdump_map(f, self._p) - else - raise "internal_error", "persist._p is not a map" - end + def json_fdump_any(f, v) + import json + if isinstance(v, map) + self.json_fdump_map(f, v) + elif isinstance(v, list)v + self.json_fdump_list(f, v) + else + f.write(json.dump(v)) end end + def json_fdump_map(f, v) + import json + f.write('{') + var sep = nil + for k:v.keys() + if sep != nil f.write(sep) end + + f.write(json.dump(str(k))) + f.write(':') + self.json_fdump_any(f, v[k]) - return Persist() # return an instance of this class + sep = "," + end + f.write('}') + end + + def json_fdump_list(f, v) + import json + f.write('[') + var i = 0 + while i < size(v) + if i > 0 f.write(',') end + self.json_fdump_any(f, v[i]) + i += 1 + end + f.write(']') + end + + def json_fdump(f) + import json + if isinstance(self._p, map) + self.json_fdump_map(f, self._p) + else + raise "internal_error", "persist._p is not a map" + end + end +end +persist_module.Persist = Persist + +persist_module.init = def (m) + return m.Persist() # return an instance of this class end return persist_module diff --git a/lib/libesp32/berry_tasmota/src/solidify/solidified_persist.h b/lib/libesp32/berry_tasmota/src/solidify/solidified_persist.h index aed177dfa..935b07d65 100644 --- a/lib/libesp32/berry_tasmota/src/solidify/solidified_persist.h +++ b/lib/libesp32/berry_tasmota/src/solidify/solidified_persist.h @@ -4,6 +4,34 @@ \********************************************************************/ #include "be_constobj.h" +/******************************************************************** +** Solidified function: _anonymous_ +********************************************************************/ +be_local_closure(persist__anonymous_, /* name */ + be_nested_proto( + 3, /* nstack */ + 1, /* argc */ + 0, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 1]) { /* constants */ + /* K0 */ be_nested_str(Persist), + }), + &be_const_str__anonymous_, + &be_const_str_solidified, + ( &(const binstruction[ 3]) { /* code */ + 0x8C040100, // 0000 GETMET R1 R0 K0 + 0x7C040200, // 0001 CALL R1 1 + 0x80040200, // 0002 RET 1 R1 + }) + ) +); +/*******************************************************************/ + + extern const bclass be_class_Persist; /******************************************************************** @@ -331,7 +359,7 @@ be_local_closure(Persist_save, /* name */ }), &be_const_str_save, &be_const_str_solidified, - ( &(const binstruction[37]) { /* code */ + ( &(const binstruction[48]) { /* code */ 0x4C040000, // 0000 LDNIL R1 0xA802000B, // 0001 EXBLK 0 #000E 0x60080011, // 0002 GETGBL R2 G17 @@ -345,30 +373,41 @@ be_local_closure(Persist_save, /* name */ 0x8C080303, // 000A GETMET R2 R1 K3 0x7C080200, // 000B CALL R2 1 0xA8040001, // 000C EXBLK 1 1 - 0x70020013, // 000D JMP #0022 + 0x7002001E, // 000D JMP #002D 0xAC080002, // 000E CATCH R2 0 2 - 0x70020010, // 000F JMP #0021 + 0x7002001B, // 000F JMP #002C 0x4C100000, // 0010 LDNIL R4 0x20100204, // 0011 NE R4 R1 R4 0x78120001, // 0012 JMPF R4 #0015 0x8C100303, // 0013 GETMET R4 R1 K3 0x7C100200, // 0014 CALL R4 1 - 0x60100011, // 0015 GETGBL R4 G17 - 0x88140100, // 0016 GETMBR R5 R0 K0 - 0x58180001, // 0017 LDCONST R6 K1 - 0x7C100400, // 0018 CALL R4 2 - 0x5C040800, // 0019 MOVE R1 R4 - 0x8C100304, // 001A GETMET R4 R1 K4 - 0x58180005, // 001B LDCONST R6 K5 - 0x7C100400, // 001C CALL R4 2 - 0x8C100303, // 001D GETMET R4 R1 K3 - 0x7C100200, // 001E CALL R4 1 - 0xB0040403, // 001F RAISE 1 R2 R3 - 0x70020000, // 0020 JMP #0022 - 0xB0080000, // 0021 RAISE 2 R0 R0 - 0x50080000, // 0022 LDBOOL R2 0 0 - 0x90020C02, // 0023 SETMBR R0 K6 R2 - 0x80000000, // 0024 RET 0 + 0x4C040000, // 0015 LDNIL R1 + 0xA8020009, // 0016 EXBLK 0 #0021 + 0x60100011, // 0017 GETGBL R4 G17 + 0x88140100, // 0018 GETMBR R5 R0 K0 + 0x58180001, // 0019 LDCONST R6 K1 + 0x7C100400, // 001A CALL R4 2 + 0x5C040800, // 001B MOVE R1 R4 + 0x8C100304, // 001C GETMET R4 R1 K4 + 0x58180005, // 001D LDCONST R6 K5 + 0x7C100400, // 001E CALL R4 2 + 0xA8040001, // 001F EXBLK 1 1 + 0x70020003, // 0020 JMP #0025 + 0xAC100000, // 0021 CATCH R4 0 0 + 0x70020000, // 0022 JMP #0024 + 0x70020000, // 0023 JMP #0025 + 0xB0080000, // 0024 RAISE 2 R0 R0 + 0x4C100000, // 0025 LDNIL R4 + 0x20100204, // 0026 NE R4 R1 R4 + 0x78120001, // 0027 JMPF R4 #002A + 0x8C100303, // 0028 GETMET R4 R1 K3 + 0x7C100200, // 0029 CALL R4 1 + 0xB0040403, // 002A RAISE 1 R2 R3 + 0x70020000, // 002B JMP #002D + 0xB0080000, // 002C RAISE 2 R0 R0 + 0x50080000, // 002D LDBOOL R2 0 0 + 0x90020C02, // 002E SETMBR R0 K6 R2 + 0x80000000, // 002F RET 0 }) ) ); @@ -505,37 +544,35 @@ be_local_closure(Persist_init, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[ 6]) { /* constants */ - /* K0 */ be_nested_str(_filename), - /* K1 */ be_nested_str(_persist_X2Ejson), - /* K2 */ be_nested_str(_p), - /* K3 */ be_nested_str(copy), - /* K4 */ be_nested_str(load), - /* K5 */ be_nested_str(_dirty), + ( &(const bvalue[ 5]) { /* constants */ + /* K0 */ be_nested_str(_p), + /* K1 */ be_nested_str(copy), + /* K2 */ be_nested_str(load), + /* K3 */ be_nested_str(_filename), + /* K4 */ be_nested_str(_dirty), }), &be_const_str_init, &be_const_str_solidified, - ( &(const binstruction[20]) { /* code */ - 0x90020101, // 0000 SETMBR R0 K0 K1 - 0x6008000F, // 0001 GETGBL R2 G15 - 0x5C0C0200, // 0002 MOVE R3 R1 - 0x60100013, // 0003 GETGBL R4 G19 - 0x7C080400, // 0004 CALL R2 2 - 0x780A0003, // 0005 JMPF R2 #000A - 0x8C080303, // 0006 GETMET R2 R1 K3 - 0x7C080200, // 0007 CALL R2 1 - 0x90020402, // 0008 SETMBR R0 K2 R2 - 0x70020002, // 0009 JMP #000D - 0x60080013, // 000A GETGBL R2 G19 - 0x7C080000, // 000B CALL R2 0 - 0x90020402, // 000C SETMBR R0 K2 R2 - 0x8C080104, // 000D GETMET R2 R0 K4 - 0x88100102, // 000E GETMBR R4 R0 K2 - 0x88140100, // 000F GETMBR R5 R0 K0 - 0x7C080600, // 0010 CALL R2 3 - 0x50080000, // 0011 LDBOOL R2 0 0 - 0x90020A02, // 0012 SETMBR R0 K5 R2 - 0x80000000, // 0013 RET 0 + ( &(const binstruction[19]) { /* code */ + 0x6008000F, // 0000 GETGBL R2 G15 + 0x5C0C0200, // 0001 MOVE R3 R1 + 0x60100013, // 0002 GETGBL R4 G19 + 0x7C080400, // 0003 CALL R2 2 + 0x780A0003, // 0004 JMPF R2 #0009 + 0x8C080301, // 0005 GETMET R2 R1 K1 + 0x7C080200, // 0006 CALL R2 1 + 0x90020002, // 0007 SETMBR R0 K0 R2 + 0x70020002, // 0008 JMP #000C + 0x60080013, // 0009 GETGBL R2 G19 + 0x7C080000, // 000A CALL R2 0 + 0x90020002, // 000B SETMBR R0 K0 R2 + 0x8C080102, // 000C GETMET R2 R0 K2 + 0x88100100, // 000D GETMBR R4 R0 K0 + 0x88140103, // 000E GETMBR R5 R0 K3 + 0x7C080600, // 000F CALL R2 3 + 0x50080000, // 0010 LDBOOL R2 0 0 + 0x90020802, // 0011 SETMBR R0 K4 R2 + 0x80000000, // 0012 RET 0 }) ) ); @@ -634,7 +671,7 @@ be_local_closure(Persist_has, /* name */ ** Solidified class: Persist ********************************************************************/ be_local_class(Persist, - 3, + 2, NULL, be_nested_map(16, ( (struct bmapnode*) &(const bmapnode[]) { @@ -648,54 +685,25 @@ be_local_class(Persist, { be_const_key(find, -1), be_const_closure(Persist_find_closure) }, { be_const_key(save, -1), be_const_closure(Persist_save_closure) }, { be_const_key(json_fdump_any, 12), be_const_closure(Persist_json_fdump_any_closure) }, - { be_const_key(_p, 7), be_const_var(1) }, - { be_const_key(_filename, -1), be_const_var(0) }, + { be_const_key(_p, 7), be_const_var(0) }, + { be_const_key(_filename, -1), be_nested_str(_persist_X2Ejson) }, { be_const_key(load, -1), be_const_closure(Persist_load_closure) }, { be_const_key(json_fdump_map, 5), be_const_closure(Persist_json_fdump_map_closure) }, - { be_const_key(_dirty, -1), be_const_var(2) }, + { be_const_key(_dirty, -1), be_const_var(1) }, { be_const_key(member, -1), be_const_closure(Persist_member_closure) }, })), (bstring*) &be_const_str_Persist ); -/******************************************************************** -** Solidified function: _anonymous_ -********************************************************************/ -be_local_closure(persist__anonymous_, /* name */ - be_nested_proto( - 3, /* nstack */ - 1, /* argc */ - 0, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 1]) { /* constants */ - /* K0 */ be_const_class(be_class_Persist), - }), - &be_const_str__anonymous_, - &be_const_str_solidified, - ( &(const binstruction[ 5]) { /* code */ - 0x58040000, // 0000 LDCONST R1 K0 - 0xB4000000, // 0001 CLASS K0 - 0x5C080200, // 0002 MOVE R2 R1 - 0x7C080000, // 0003 CALL R2 0 - 0x80040400, // 0004 RET 1 R2 - }) - ) -); -/*******************************************************************/ - - /******************************************************************** ** Solidified module: persist ********************************************************************/ be_local_module(persist, "persist", - be_nested_map(1, + be_nested_map(2, ( (struct bmapnode*) &(const bmapnode[]) { - { be_const_key(init, -1), be_const_closure(persist__anonymous__closure) }, + { be_const_key(Persist, -1), be_const_class(be_class_Persist) }, + { be_const_key(init, 0), be_const_closure(persist__anonymous__closure) }, })) ); BE_EXPORT_VARIABLE be_define_const_native_module(persist); From 043ea2986b073f26ec44b4cbe5b2cf7957aec54f Mon Sep 17 00:00:00 2001 From: s-hadinger <49731213+s-hadinger@users.noreply.github.com> Date: Thu, 18 May 2023 11:23:09 +0200 Subject: [PATCH 142/289] Berry `tasmota.wifi()` would wrongly report wifi as up (#18687) * Berry `tasmota.wifi()` would wrongly report wifi as up * Fix ESP8266 compile * Fix display of IP in wifiman * Improve wifiman IP handling for IPv6 --- CHANGELOG.md | 1 + tasmota/tasmota_support/support_wifi.ino | 21 ++++++++++++++++--- .../xdrv_01_9_webserver.ino | 5 +++-- 3 files changed, 22 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d16d119e4..769ffa136 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -16,6 +16,7 @@ All notable changes to this project will be documented in this file. ### Fixed - Shutter bootloop using more than 4 shutters (#18673) - AIThinker webcam issues (#18652) +- Berry `tasmota.wifi()` would wrongly report wifi as up ### Removed diff --git a/tasmota/tasmota_support/support_wifi.ino b/tasmota/tasmota_support/support_wifi.ino index 0901ceed1..c518af1d2 100644 --- a/tasmota/tasmota_support/support_wifi.ino +++ b/tasmota/tasmota_support/support_wifi.ino @@ -503,6 +503,7 @@ void WifiSetState(uint8_t state) * - DNS reporting actual values used (not the Settings): * `DNSGetIP(n)`, `DNSGetIPStr(n)` with n=`0`/`1` (same dns for Wifi and Eth) \*****************************************************************************************************/ +bool WifiGetIP(IPAddress *ip, bool exclude_ap = false); // IPv4 for Wifi // Returns only IPv6 global address (no loopback and no link-local) bool WifiGetIPv4(IPAddress *ip) @@ -755,15 +756,29 @@ String IPForUrl(const IPAddress & ip) // Check to see if we have any routable IP address // IPv4 has always priority // Copy the value of the IP if pointer provided (optional) -bool WifiGetIP(IPAddress *ip) { - if ((uint32_t)WiFi.localIP() != 0) { +// `exclude_ap` allows to exlude AP IP address and focus only on local STA +bool WifiGetIP(IPAddress *ip, bool exclude_ap) { +#ifdef ESP32 + wifi_mode_t mode = WiFi.getMode(); + if ((mode == WIFI_MODE_STA || mode == WIFI_MODE_APSTA) && (uint32_t)WiFi.localIP() != 0) { if (ip != nullptr) { *ip = WiFi.localIP(); } return true; } - if ((uint32_t)WiFi.softAPIP() != 0) { + if (!exclude_ap && (mode == WIFI_MODE_AP || mode == WIFI_MODE_APSTA) && (uint32_t)WiFi.softAPIP() != 0) { if (ip != nullptr) { *ip = WiFi.softAPIP(); } return true; } +#else + WiFiMode_t mode = WiFi.getMode(); + if ((mode == WIFI_STA || mode == WIFI_AP_STA) && (uint32_t)WiFi.localIP() != 0) { + if (ip != nullptr) { *ip = WiFi.localIP(); } + return true; + } + if (!exclude_ap && (mode == WIFI_AP || mode == WIFI_AP_STA) && (uint32_t)WiFi.softAPIP() != 0) { + if (ip != nullptr) { *ip = WiFi.softAPIP(); } + return true; + } +#endif #ifdef USE_IPV6 IPAddress lip; if (WifiGetIPv6(&lip)) { diff --git a/tasmota/tasmota_xdrv_driver/xdrv_01_9_webserver.ino b/tasmota/tasmota_xdrv_driver/xdrv_01_9_webserver.ino index 7b241a9c7..84f5368fb 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_01_9_webserver.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_01_9_webserver.ino @@ -3701,11 +3701,12 @@ bool Xdrv01(uint32_t function) if (Wifi.wifi_test_counter) { Wifi.wifi_test_counter--; AddLog(LOG_LEVEL_DEBUG, PSTR(D_LOG_WIFI D_TRYING_TO_CONNECT " %s"), SettingsText(SET_STASSID1)); - if (WifiHasIP()) { // Got IP - Connection Established + IPAddress local_ip; + if (WifiGetIP(&local_ip, true)) { // Got IP - Connection Established (exclude AP address) Wifi.wifi_test_AP_TIMEOUT = false; Wifi.wifi_test_counter = 0; Wifi.wifiTest = WIFI_TEST_FINISHED; - AddLog(LOG_LEVEL_INFO, PSTR(D_LOG_WIFI D_CMND_SSID " %s: " D_CONNECTED " - " D_IP_ADDRESS " %s"), SettingsText(Wifi.wifi_Test_Save_SSID2 ? SET_STASSID2 : SET_STASSID1), WiFi.localIP().toString().c_str()); + AddLog(LOG_LEVEL_INFO, PSTR(D_LOG_WIFI D_CMND_SSID " %s: " D_CONNECTED " - " D_IP_ADDRESS " %s"), SettingsText(Wifi.wifi_Test_Save_SSID2 ? SET_STASSID2 : SET_STASSID1), local_ip.toString().c_str()); // TasmotaGlobal.blinks = 255; // Signal wifi connection with blinks if (MAX_WIFI_OPTION != Wifi.old_wificonfig) { TasmotaGlobal.wifi_state_flag = Settings->sta_config = Wifi.old_wificonfig; From b0058fd0a296fd39d1018e9f5ba266d8fde493d2 Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Thu, 18 May 2023 14:43:07 +0200 Subject: [PATCH 143/289] Try to fix copy firmware to other repo --- .github/workflows/Tasmota_build_devel.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/Tasmota_build_devel.yml b/.github/workflows/Tasmota_build_devel.yml index 682f9913b..bc3073d8f 100644 --- a/.github/workflows/Tasmota_build_devel.yml +++ b/.github/workflows/Tasmota_build_devel.yml @@ -296,7 +296,7 @@ jobs: - name: Display files to transfer run: ls -R ./* - name: Push Firmware files to tmp_copy repo - uses: Jason2866/copy_file_to_another_repo_action@main + uses: Jason2866/copy_file_to_another_repo_action@development env: API_TOKEN_GITHUB: ${{ secrets.API_TOKEN_GITHUB }} with: @@ -315,7 +315,7 @@ jobs: echo ${GITHUB_SHA} &> trigger.txt echo "$( Date: Thu, 18 May 2023 15:06:51 +0200 Subject: [PATCH 144/289] create branch when not exists --- .github/workflows/Tasmota_build_devel.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/Tasmota_build_devel.yml b/.github/workflows/Tasmota_build_devel.yml index bc3073d8f..7e9da25ae 100644 --- a/.github/workflows/Tasmota_build_devel.yml +++ b/.github/workflows/Tasmota_build_devel.yml @@ -302,6 +302,7 @@ jobs: with: source_file: 'firmware' destination_repo: 'arendst/tmp_copy' + destination_branch_create: 'firmware' destination_branch: 'firmware' user_email: 'github-actions@github.com' user_name: 'github-actions' From 521709dd9a95e8e29a658afe001127e2d41d4172 Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Thu, 18 May 2023 15:45:57 +0200 Subject: [PATCH 145/289] Update Tasmota_build_devel.yml --- .github/workflows/Tasmota_build_devel.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/Tasmota_build_devel.yml b/.github/workflows/Tasmota_build_devel.yml index 7e9da25ae..bc3073d8f 100644 --- a/.github/workflows/Tasmota_build_devel.yml +++ b/.github/workflows/Tasmota_build_devel.yml @@ -302,7 +302,6 @@ jobs: with: source_file: 'firmware' destination_repo: 'arendst/tmp_copy' - destination_branch_create: 'firmware' destination_branch: 'firmware' user_email: 'github-actions@github.com' user_name: 'github-actions' From 05bb8214c830a0c8b37b38ec2245a2e4b614948b Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Thu, 18 May 2023 17:37:40 +0200 Subject: [PATCH 146/289] destination_branch_create: 'firmware' --- .github/workflows/Tasmota_build_devel.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/Tasmota_build_devel.yml b/.github/workflows/Tasmota_build_devel.yml index bc3073d8f..0c8efe572 100644 --- a/.github/workflows/Tasmota_build_devel.yml +++ b/.github/workflows/Tasmota_build_devel.yml @@ -302,7 +302,7 @@ jobs: with: source_file: 'firmware' destination_repo: 'arendst/tmp_copy' - destination_branch: 'firmware' + destination_branch_create: 'firmware' user_email: 'github-actions@github.com' user_name: 'github-actions' Start_final_copy: From 936267d42c911ee8d878f6717db758e6a8e3a744 Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Thu, 18 May 2023 18:27:37 +0200 Subject: [PATCH 147/289] split upload of files --- .github/workflows/Tasmota_build_devel.yml | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/.github/workflows/Tasmota_build_devel.yml b/.github/workflows/Tasmota_build_devel.yml index 0c8efe572..6670753e8 100644 --- a/.github/workflows/Tasmota_build_devel.yml +++ b/.github/workflows/Tasmota_build_devel.yml @@ -300,11 +300,21 @@ jobs: env: API_TOKEN_GITHUB: ${{ secrets.API_TOKEN_GITHUB }} with: - source_file: 'firmware' + source_file: 'firmware/tasmota*' destination_repo: 'arendst/tmp_copy' destination_branch_create: 'firmware' user_email: 'github-actions@github.com' user_name: 'github-actions' + - name: Push MAP files to tmp_copy repo + uses: Jason2866/copy_file_to_another_repo_action@development + env: + API_TOKEN_GITHUB: ${{ secrets.API_TOKEN_GITHUB }} + with: + source_file: 'firmware/map*' + destination_repo: 'arendst/tmp_copy' + destination_branch:: 'firmware' + user_email: 'github-actions@github.com' + user_name: 'github-actions' Start_final_copy: needs: Upload runs-on: ubuntu-latest From ab0b2e26fc6b242d6a20b1a7dc81906ab75ff1aa Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Thu, 18 May 2023 18:55:22 +0200 Subject: [PATCH 148/289] Fix path --- .github/workflows/Tasmota_build_devel.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/Tasmota_build_devel.yml b/.github/workflows/Tasmota_build_devel.yml index 6670753e8..c24ec568e 100644 --- a/.github/workflows/Tasmota_build_devel.yml +++ b/.github/workflows/Tasmota_build_devel.yml @@ -295,22 +295,22 @@ jobs: [ ! -f ./mv_firmware/firmware/* ] || mv ./mv_firmware/firmware/* ./firmware/tasmota/languages/ - name: Display files to transfer run: ls -R ./* - - name: Push Firmware files to tmp_copy repo + - name: Push tasmota32 files to tmp_copy repo uses: Jason2866/copy_file_to_another_repo_action@development env: API_TOKEN_GITHUB: ${{ secrets.API_TOKEN_GITHUB }} with: - source_file: 'firmware/tasmota*' + source_file: 'firmware/tasmota32' destination_repo: 'arendst/tmp_copy' destination_branch_create: 'firmware' user_email: 'github-actions@github.com' user_name: 'github-actions' - - name: Push MAP files to tmp_copy repo + - name: Push tasmota files to tmp_copy repo uses: Jason2866/copy_file_to_another_repo_action@development env: API_TOKEN_GITHUB: ${{ secrets.API_TOKEN_GITHUB }} with: - source_file: 'firmware/map*' + source_file: 'firmware/tasmota' destination_repo: 'arendst/tmp_copy' destination_branch:: 'firmware' user_email: 'github-actions@github.com' From 4bc324f5dc9a655084c537fbc732547dd195cebc Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Fri, 19 May 2023 12:45:45 +0200 Subject: [PATCH 149/289] Update Tasmota_build_devel.yml --- .github/workflows/Tasmota_build_devel.yml | 14 ++------------ 1 file changed, 2 insertions(+), 12 deletions(-) diff --git a/.github/workflows/Tasmota_build_devel.yml b/.github/workflows/Tasmota_build_devel.yml index c24ec568e..a961f7163 100644 --- a/.github/workflows/Tasmota_build_devel.yml +++ b/.github/workflows/Tasmota_build_devel.yml @@ -295,24 +295,14 @@ jobs: [ ! -f ./mv_firmware/firmware/* ] || mv ./mv_firmware/firmware/* ./firmware/tasmota/languages/ - name: Display files to transfer run: ls -R ./* - - name: Push tasmota32 files to tmp_copy repo - uses: Jason2866/copy_file_to_another_repo_action@development - env: - API_TOKEN_GITHUB: ${{ secrets.API_TOKEN_GITHUB }} - with: - source_file: 'firmware/tasmota32' - destination_repo: 'arendst/tmp_copy' - destination_branch_create: 'firmware' - user_email: 'github-actions@github.com' - user_name: 'github-actions' - name: Push tasmota files to tmp_copy repo uses: Jason2866/copy_file_to_another_repo_action@development env: API_TOKEN_GITHUB: ${{ secrets.API_TOKEN_GITHUB }} with: - source_file: 'firmware/tasmota' + source_file: 'firmware' destination_repo: 'arendst/tmp_copy' - destination_branch:: 'firmware' + destination_branch_create: 'firmware' user_email: 'github-actions@github.com' user_name: 'github-actions' Start_final_copy: From 2baba2b9c221f8e4e180f5bb4593bbda58daa7a9 Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Fri, 19 May 2023 12:48:19 +0200 Subject: [PATCH 150/289] Fix berry mute option (#18684) --- .../src/embedded/tasmota_class.be | 21 ++-- .../src/solidify/solidified_tasmota_class.h | 110 ++++++++++-------- 2 files changed, 73 insertions(+), 58 deletions(-) diff --git a/lib/libesp32/berry_tasmota/src/embedded/tasmota_class.be b/lib/libesp32/berry_tasmota/src/embedded/tasmota_class.be index 02bf7a814..5efe35e1b 100644 --- a/lib/libesp32/berry_tasmota/src/embedded/tasmota_class.be +++ b/lib/libesp32/berry_tasmota/src/embedded/tasmota_class.be @@ -34,7 +34,7 @@ class Tasmota try import debug self._debug_present = true - except .. + except .. end # declare `UrlFetch` command self.add_cmd('UrlFetch', def (cmd, idx, payload, payload_json) self.urlfetch_cmd(cmd, idx, payload, payload_json) end) @@ -131,7 +131,7 @@ class Tasmota var save_cmd_res = self.cmd_res # save initial state (for reentrance) if self._rules || save_cmd_res != nil # if there is a rule handler, or we record rule results import json - + self.cmd_res = nil # disable sunsequent recording of results var ret = false @@ -241,7 +241,7 @@ class Tasmota end end end - + # crontab style recurring events def add_cron(pattern,f,id) self.check_not_method(f) @@ -470,7 +470,7 @@ class Tasmota end # print("f_time",f_time,"f_time_bec",f_time_bec,"suffix_bec",suffix_bec) end - + # recall the working directory if f_archive self.wd = f_prefix + "#" @@ -645,26 +645,29 @@ class Tasmota self.cmd_res = true # signal buffer capture var seriallog_level = tasmota.global.seriallog_level + var syslog_level = tasmota.global.syslog_level var mqttlog_level = tasmota.settings.mqttlog_level var weblog_level = tasmota.settings.weblog_level if mute # mute logging if seriallog_level >= 2 tasmota.global.seriallog_level = 1 end + if syslog_level >= 2 tasmota.global.syslog_level = 1 end if mqttlog_level >= 2 tasmota.settings.mqttlog_level = 1 end if weblog_level >= 2 tasmota.settings.weblog_level = 1 end end self._cmd(command) - + var ret = nil if self.cmd_res != true # unchanged ret = self.cmd_res end self.cmd_res = save_cmd_res # restore previous state - + # restore log_level if mute tasmota.global.seriallog_level = seriallog_level + tasmota.global.syslog_level = syslog_level tasmota.settings.mqttlog_level = mqttlog_level tasmota.settings.weblog_level = weblog_level end @@ -709,14 +712,14 @@ class Tasmota var g = 255 # we take brightness at 100%, brightness should be set separately hue = hue % 360 # normalize to 0..359 - + if sat > 0 var i = hue / 60 # quadrant 0..5 var f = hue % 60 # 0..59 var p = 255 - sat var q = tasmota.scale_uint(f, 0, 60, 255, p) # 0..59 var t = tasmota.scale_uint(f, 0, 60, p, 255) - + if i == 0 # r = 255 g = t @@ -743,7 +746,7 @@ class Tasmota b = q end end - + return (r << 16) | (g << 8) | b end diff --git a/lib/libesp32/berry_tasmota/src/solidify/solidified_tasmota_class.h b/lib/libesp32/berry_tasmota/src/solidify/solidified_tasmota_class.h index 8762cef14..9c2963249 100644 --- a/lib/libesp32/berry_tasmota/src/solidify/solidified_tasmota_class.h +++ b/lib/libesp32/berry_tasmota/src/solidify/solidified_tasmota_class.h @@ -97,7 +97,7 @@ be_local_closure(Tasmota_exec_rules, /* name */ ********************************************************************/ be_local_closure(Tasmota_cmd, /* name */ be_nested_proto( - 10, /* nstack */ + 11, /* nstack */ 3, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -105,21 +105,22 @@ be_local_closure(Tasmota_cmd, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[10]) { /* constants */ + ( &(const bvalue[11]) { /* constants */ /* K0 */ be_nested_str(cmd_res), /* K1 */ be_nested_str(tasmota), /* K2 */ be_nested_str(global), /* K3 */ be_nested_str(seriallog_level), - /* K4 */ be_nested_str(settings), - /* K5 */ be_nested_str(mqttlog_level), - /* K6 */ be_nested_str(weblog_level), - /* K7 */ be_const_int(2), - /* K8 */ be_const_int(1), - /* K9 */ be_nested_str(_cmd), + /* K4 */ be_nested_str(syslog_level), + /* K5 */ be_nested_str(settings), + /* K6 */ be_nested_str(mqttlog_level), + /* K7 */ be_nested_str(weblog_level), + /* K8 */ be_const_int(2), + /* K9 */ be_const_int(1), + /* K10 */ be_nested_str(_cmd), }), &be_const_str_cmd, &be_const_str_solidified, - ( &(const binstruction[49]) { /* code */ + ( &(const binstruction[60]) { /* code */ 0x880C0100, // 0000 GETMBR R3 R0 K0 0x50100200, // 0001 LDBOOL R4 1 0 0x90020004, // 0002 SETMBR R0 K0 R4 @@ -127,48 +128,59 @@ be_local_closure(Tasmota_cmd, /* name */ 0x88100902, // 0004 GETMBR R4 R4 K2 0x88100903, // 0005 GETMBR R4 R4 K3 0xB8160200, // 0006 GETNGBL R5 K1 - 0x88140B04, // 0007 GETMBR R5 R5 K4 - 0x88140B05, // 0008 GETMBR R5 R5 K5 + 0x88140B02, // 0007 GETMBR R5 R5 K2 + 0x88140B04, // 0008 GETMBR R5 R5 K4 0xB81A0200, // 0009 GETNGBL R6 K1 - 0x88180D04, // 000A GETMBR R6 R6 K4 + 0x88180D05, // 000A GETMBR R6 R6 K5 0x88180D06, // 000B GETMBR R6 R6 K6 - 0x780A000E, // 000C JMPF R2 #001C - 0x281C0907, // 000D GE R7 R4 K7 - 0x781E0002, // 000E JMPF R7 #0012 - 0xB81E0200, // 000F GETNGBL R7 K1 - 0x881C0F02, // 0010 GETMBR R7 R7 K2 - 0x901E0708, // 0011 SETMBR R7 K3 K8 - 0x281C0B07, // 0012 GE R7 R5 K7 - 0x781E0002, // 0013 JMPF R7 #0017 - 0xB81E0200, // 0014 GETNGBL R7 K1 - 0x881C0F04, // 0015 GETMBR R7 R7 K4 - 0x901E0B08, // 0016 SETMBR R7 K5 K8 - 0x281C0D07, // 0017 GE R7 R6 K7 - 0x781E0002, // 0018 JMPF R7 #001C - 0xB81E0200, // 0019 GETNGBL R7 K1 - 0x881C0F04, // 001A GETMBR R7 R7 K4 - 0x901E0D08, // 001B SETMBR R7 K6 K8 - 0x8C1C0109, // 001C GETMET R7 R0 K9 - 0x5C240200, // 001D MOVE R9 R1 - 0x7C1C0400, // 001E CALL R7 2 - 0x4C1C0000, // 001F LDNIL R7 - 0x88200100, // 0020 GETMBR R8 R0 K0 - 0x50240200, // 0021 LDBOOL R9 1 0 - 0x20201009, // 0022 NE R8 R8 R9 - 0x78220000, // 0023 JMPF R8 #0025 - 0x881C0100, // 0024 GETMBR R7 R0 K0 - 0x90020003, // 0025 SETMBR R0 K0 R3 - 0x780A0008, // 0026 JMPF R2 #0030 - 0xB8220200, // 0027 GETNGBL R8 K1 - 0x88201102, // 0028 GETMBR R8 R8 K2 - 0x90220604, // 0029 SETMBR R8 K3 R4 - 0xB8220200, // 002A GETNGBL R8 K1 - 0x88201104, // 002B GETMBR R8 R8 K4 - 0x90220A05, // 002C SETMBR R8 K5 R5 - 0xB8220200, // 002D GETNGBL R8 K1 - 0x88201104, // 002E GETMBR R8 R8 K4 - 0x90220C06, // 002F SETMBR R8 K6 R6 - 0x80040E00, // 0030 RET 1 R7 + 0xB81E0200, // 000C GETNGBL R7 K1 + 0x881C0F05, // 000D GETMBR R7 R7 K5 + 0x881C0F07, // 000E GETMBR R7 R7 K7 + 0x780A0013, // 000F JMPF R2 #0024 + 0x28200908, // 0010 GE R8 R4 K8 + 0x78220002, // 0011 JMPF R8 #0015 + 0xB8220200, // 0012 GETNGBL R8 K1 + 0x88201102, // 0013 GETMBR R8 R8 K2 + 0x90220709, // 0014 SETMBR R8 K3 K9 + 0x28200B08, // 0015 GE R8 R5 K8 + 0x78220002, // 0016 JMPF R8 #001A + 0xB8220200, // 0017 GETNGBL R8 K1 + 0x88201102, // 0018 GETMBR R8 R8 K2 + 0x90220909, // 0019 SETMBR R8 K4 K9 + 0x28200D08, // 001A GE R8 R6 K8 + 0x78220002, // 001B JMPF R8 #001F + 0xB8220200, // 001C GETNGBL R8 K1 + 0x88201105, // 001D GETMBR R8 R8 K5 + 0x90220D09, // 001E SETMBR R8 K6 K9 + 0x28200F08, // 001F GE R8 R7 K8 + 0x78220002, // 0020 JMPF R8 #0024 + 0xB8220200, // 0021 GETNGBL R8 K1 + 0x88201105, // 0022 GETMBR R8 R8 K5 + 0x90220F09, // 0023 SETMBR R8 K7 K9 + 0x8C20010A, // 0024 GETMET R8 R0 K10 + 0x5C280200, // 0025 MOVE R10 R1 + 0x7C200400, // 0026 CALL R8 2 + 0x4C200000, // 0027 LDNIL R8 + 0x88240100, // 0028 GETMBR R9 R0 K0 + 0x50280200, // 0029 LDBOOL R10 1 0 + 0x2024120A, // 002A NE R9 R9 R10 + 0x78260000, // 002B JMPF R9 #002D + 0x88200100, // 002C GETMBR R8 R0 K0 + 0x90020003, // 002D SETMBR R0 K0 R3 + 0x780A000B, // 002E JMPF R2 #003B + 0xB8260200, // 002F GETNGBL R9 K1 + 0x88241302, // 0030 GETMBR R9 R9 K2 + 0x90260604, // 0031 SETMBR R9 K3 R4 + 0xB8260200, // 0032 GETNGBL R9 K1 + 0x88241302, // 0033 GETMBR R9 R9 K2 + 0x90260805, // 0034 SETMBR R9 K4 R5 + 0xB8260200, // 0035 GETNGBL R9 K1 + 0x88241305, // 0036 GETMBR R9 R9 K5 + 0x90260C06, // 0037 SETMBR R9 K6 R6 + 0xB8260200, // 0038 GETNGBL R9 K1 + 0x88241305, // 0039 GETMBR R9 R9 K5 + 0x90260E07, // 003A SETMBR R9 K7 R7 + 0x80041000, // 003B RET 1 R8 }) ) ); From a07e17eff6ce6ad41cf98256e8f2e607c55ce45b Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Fri, 19 May 2023 13:27:31 +0200 Subject: [PATCH 151/289] try to fix `RPC failed` in action --- .github/workflows/Tasmota_build_devel.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/Tasmota_build_devel.yml b/.github/workflows/Tasmota_build_devel.yml index a961f7163..baea23718 100644 --- a/.github/workflows/Tasmota_build_devel.yml +++ b/.github/workflows/Tasmota_build_devel.yml @@ -296,7 +296,7 @@ jobs: - name: Display files to transfer run: ls -R ./* - name: Push tasmota files to tmp_copy repo - uses: Jason2866/copy_file_to_another_repo_action@development + uses: Jason2866/copy_file_to_another_repo_action@http408_fix env: API_TOKEN_GITHUB: ${{ secrets.API_TOKEN_GITHUB }} with: @@ -315,7 +315,7 @@ jobs: echo ${GITHUB_SHA} &> trigger.txt echo "$( Date: Fri, 19 May 2023 15:20:21 +0200 Subject: [PATCH 152/289] Add internal support for max log level --- tasmota/tasmota.ino | 4 ++-- tasmota/tasmota_support/settings.ino | 10 +++++----- tasmota/tasmota_support/support.ino | 2 +- tasmota/tasmota_xsns_sensor/xsns_92_scd40.ino | 2 +- 4 files changed, 9 insertions(+), 9 deletions(-) diff --git a/tasmota/tasmota.ino b/tasmota/tasmota.ino index 96ead1bdb..d23eafc96 100644 --- a/tasmota/tasmota.ino +++ b/tasmota/tasmota.ino @@ -308,7 +308,6 @@ struct TasmotaGlobal_t { bool module_changed; // Indicate module changed since last restart bool wifi_stay_asleep; // Allow sleep only incase of ESP32 BLE bool no_autoexec; // Disable autoexec - bool enable_logging; // Enable logging uint8_t user_globals[3]; // User set global temp/hum/press uint8_t init_state; // Tasmota init state @@ -336,6 +335,7 @@ struct TasmotaGlobal_t { uint8_t serial_in_byte; // Received byte uint8_t serial_skip; // Skip number of received messages uint8_t devices_present; // Max number of devices supported + uint8_t maxlog_level; // Max allowed log level uint8_t masterlog_level; // Master log level used to override set log level uint8_t seriallog_level; // Current copy of Settings->seriallog_level uint8_t syslog_level; // Current copy of Settings->syslog_level @@ -432,7 +432,7 @@ void setup(void) { TasmotaGlobal.tele_period = 9999; TasmotaGlobal.active_device = 1; TasmotaGlobal.global_state.data = 0xF; // Init global state (wifi_down, mqtt_down) to solve possible network issues - TasmotaGlobal.enable_logging = 1; + TasmotaGlobal.maxlog_level = LOG_LEVEL_DEBUG_MORE; TasmotaGlobal.seriallog_level = LOG_LEVEL_INFO; // Allow specific serial messages until config loaded TasmotaGlobal.power_latching = 0x80000000; diff --git a/tasmota/tasmota_support/settings.ino b/tasmota/tasmota_support/settings.ino index 7962813d5..aba5b5cc6 100644 --- a/tasmota/tasmota_support/settings.ino +++ b/tasmota/tasmota_support/settings.ino @@ -699,12 +699,12 @@ void SettingsLoad(void) { #ifdef USE_UFILESYS if (1 == settings_location) { TfsLoadFile(TASM_FILE_SETTINGS, (uint8_t*)Settings, sizeof(TSettings)); - AddLog(LOG_LEVEL_NONE, PSTR(D_LOG_CONFIG "Loaded from File, " D_COUNT " %lu"), Settings->save_flag); + AddLog(LOG_LEVEL_INFO, PSTR(D_LOG_CONFIG "Loaded from File, " D_COUNT " %lu"), Settings->save_flag); } else #endif // USE_UFILESYS { ESP.flashRead(settings_location * SPI_FLASH_SEC_SIZE, (uint32*)Settings, sizeof(TSettings)); - AddLog(LOG_LEVEL_NONE, PSTR(D_LOG_CONFIG D_LOADED_FROM_FLASH_AT " %X, " D_COUNT " %lu"), settings_location, Settings->save_flag); + AddLog(LOG_LEVEL_INFO, PSTR(D_LOG_CONFIG D_LOADED_FROM_FLASH_AT " %X, " D_COUNT " %lu"), settings_location, Settings->save_flag); } } #endif // ESP8266 @@ -714,7 +714,7 @@ void SettingsLoad(void) { if (source) { settings_location = 1; if (Settings->cfg_holder == (uint16_t)CFG_HOLDER) { - AddLog(LOG_LEVEL_NONE, PSTR(D_LOG_CONFIG "Loaded from %s, " D_COUNT " %lu"), (2 == source)?"File":"NVS", Settings->save_flag); + AddLog(LOG_LEVEL_INFO, PSTR(D_LOG_CONFIG "Loaded from %s, " D_COUNT " %lu"), (2 == source)?"File":"NVS", Settings->save_flag); } } #endif // ESP32 @@ -725,7 +725,7 @@ void SettingsLoad(void) { #ifdef USE_UFILESYS if (TfsLoadFile(TASM_FILE_SETTINGS_LKG, (uint8_t*)Settings, sizeof(TSettings)) && (Settings->cfg_crc32 == GetSettingsCrc32())) { settings_location = 1; - AddLog(LOG_LEVEL_NONE, PSTR(D_LOG_CONFIG "Loaded from LKG File, " D_COUNT " %lu"), Settings->save_flag); + AddLog(LOG_LEVEL_INFO, PSTR(D_LOG_CONFIG "Loaded from LKG File, " D_COUNT " %lu"), Settings->save_flag); } else #endif // USE_UFILESYS { @@ -806,7 +806,7 @@ void SettingsSdkErase(void) { /********************************************************************************************/ void SettingsDefault(void) { - AddLog(LOG_LEVEL_NONE, PSTR(D_LOG_CONFIG D_USE_DEFAULTS)); + AddLog(LOG_LEVEL_INFO, PSTR(D_LOG_CONFIG D_USE_DEFAULTS)); SettingsDefaultSet1(); SettingsDefaultSet2(); SettingsDefaultSet3(); diff --git a/tasmota/tasmota_support/support.ino b/tasmota/tasmota_support/support.ino index 00ed4c2e0..62d5c13d1 100755 --- a/tasmota/tasmota_support/support.ino +++ b/tasmota/tasmota_support/support.ino @@ -2371,7 +2371,7 @@ bool GetLog(uint32_t req_loglevel, uint32_t* index_p, char** entry_pp, size_t* l } void AddLogData(uint32_t loglevel, const char* log_data, const char* log_data_payload = nullptr, const char* log_data_retained = nullptr) { - if (!TasmotaGlobal.enable_logging) { return; } + if (loglevel > TasmotaGlobal.maxlog_level) { return; } // Store log_data in buffer // To lower heap usage log_data_payload may contain the payload data from MqttPublishPayload() // and log_data_retained may contain optional retained message from MqttPublishPayload() diff --git a/tasmota/tasmota_xsns_sensor/xsns_92_scd40.ino b/tasmota/tasmota_xsns_sensor/xsns_92_scd40.ino index 9689585d3..5092ac69f 100644 --- a/tasmota/tasmota_xsns_sensor/xsns_92_scd40.ino +++ b/tasmota/tasmota_xsns_sensor/xsns_92_scd40.ino @@ -135,7 +135,7 @@ void Scd40Detect(void) uint16_t sn[3]; error = scd40.getSerialNumber(sn); - AddLog(LOG_LEVEL_NONE, PSTR("SCD40 serial nr 0x%X 0x%X 0x%X") ,sn[0], sn[1], sn[2]); + AddLog(LOG_LEVEL_INFO, PSTR("SCD40 serial nr 0x%X 0x%X 0x%X") ,sn[0], sn[1], sn[2]); // by default, start measurements, only register device if this succeeds #ifdef USE_SCD40_LOWPOWER From 4afcdc11d628f060ca2a7421a02c3f87905ec9b3 Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Fri, 19 May 2023 16:30:48 +0200 Subject: [PATCH 153/289] Simplify Berry Mute option --- .../src/embedded/tasmota_class.be | 16 +--- .../src/solidify/solidified_tasmota_class.h | 93 ++++++------------- .../xdrv_52_3_berry_tasmota_global.ino | 5 +- 3 files changed, 34 insertions(+), 80 deletions(-) diff --git a/lib/libesp32/berry_tasmota/src/embedded/tasmota_class.be b/lib/libesp32/berry_tasmota/src/embedded/tasmota_class.be index 5efe35e1b..a119f9973 100644 --- a/lib/libesp32/berry_tasmota/src/embedded/tasmota_class.be +++ b/lib/libesp32/berry_tasmota/src/embedded/tasmota_class.be @@ -644,16 +644,9 @@ class Tasmota var save_cmd_res = self.cmd_res # restore value on exit (for reentrant) self.cmd_res = true # signal buffer capture - var seriallog_level = tasmota.global.seriallog_level - var syslog_level = tasmota.global.syslog_level - var mqttlog_level = tasmota.settings.mqttlog_level - var weblog_level = tasmota.settings.weblog_level - + var maxlog_level = tasmota.global.maxlog_level if mute # mute logging - if seriallog_level >= 2 tasmota.global.seriallog_level = 1 end - if syslog_level >= 2 tasmota.global.syslog_level = 1 end - if mqttlog_level >= 2 tasmota.settings.mqttlog_level = 1 end - if weblog_level >= 2 tasmota.settings.weblog_level = 1 end + if maxlog_level >= 2 tasmota.global.maxlog_level = 1 end end self._cmd(command) @@ -666,10 +659,7 @@ class Tasmota # restore log_level if mute - tasmota.global.seriallog_level = seriallog_level - tasmota.global.syslog_level = syslog_level - tasmota.settings.mqttlog_level = mqttlog_level - tasmota.settings.weblog_level = weblog_level + tasmota.global.maxlog_level = maxlog_level end return ret end diff --git a/lib/libesp32/berry_tasmota/src/solidify/solidified_tasmota_class.h b/lib/libesp32/berry_tasmota/src/solidify/solidified_tasmota_class.h index 9c2963249..96045d1eb 100644 --- a/lib/libesp32/berry_tasmota/src/solidify/solidified_tasmota_class.h +++ b/lib/libesp32/berry_tasmota/src/solidify/solidified_tasmota_class.h @@ -97,7 +97,7 @@ be_local_closure(Tasmota_exec_rules, /* name */ ********************************************************************/ be_local_closure(Tasmota_cmd, /* name */ be_nested_proto( - 11, /* nstack */ + 8, /* nstack */ 3, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -105,82 +105,45 @@ be_local_closure(Tasmota_cmd, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[11]) { /* constants */ + ( &(const bvalue[ 7]) { /* constants */ /* K0 */ be_nested_str(cmd_res), /* K1 */ be_nested_str(tasmota), /* K2 */ be_nested_str(global), - /* K3 */ be_nested_str(seriallog_level), - /* K4 */ be_nested_str(syslog_level), - /* K5 */ be_nested_str(settings), - /* K6 */ be_nested_str(mqttlog_level), - /* K7 */ be_nested_str(weblog_level), - /* K8 */ be_const_int(2), - /* K9 */ be_const_int(1), - /* K10 */ be_nested_str(_cmd), + /* K3 */ be_nested_str(maxlog_level), + /* K4 */ be_const_int(2), + /* K5 */ be_const_int(1), + /* K6 */ be_nested_str(_cmd), }), &be_const_str_cmd, &be_const_str_solidified, - ( &(const binstruction[60]) { /* code */ + ( &(const binstruction[27]) { /* code */ 0x880C0100, // 0000 GETMBR R3 R0 K0 0x50100200, // 0001 LDBOOL R4 1 0 0x90020004, // 0002 SETMBR R0 K0 R4 0xB8120200, // 0003 GETNGBL R4 K1 0x88100902, // 0004 GETMBR R4 R4 K2 0x88100903, // 0005 GETMBR R4 R4 K3 - 0xB8160200, // 0006 GETNGBL R5 K1 - 0x88140B02, // 0007 GETMBR R5 R5 K2 - 0x88140B04, // 0008 GETMBR R5 R5 K4 - 0xB81A0200, // 0009 GETNGBL R6 K1 - 0x88180D05, // 000A GETMBR R6 R6 K5 - 0x88180D06, // 000B GETMBR R6 R6 K6 - 0xB81E0200, // 000C GETNGBL R7 K1 - 0x881C0F05, // 000D GETMBR R7 R7 K5 - 0x881C0F07, // 000E GETMBR R7 R7 K7 - 0x780A0013, // 000F JMPF R2 #0024 - 0x28200908, // 0010 GE R8 R4 K8 - 0x78220002, // 0011 JMPF R8 #0015 - 0xB8220200, // 0012 GETNGBL R8 K1 - 0x88201102, // 0013 GETMBR R8 R8 K2 - 0x90220709, // 0014 SETMBR R8 K3 K9 - 0x28200B08, // 0015 GE R8 R5 K8 - 0x78220002, // 0016 JMPF R8 #001A - 0xB8220200, // 0017 GETNGBL R8 K1 - 0x88201102, // 0018 GETMBR R8 R8 K2 - 0x90220909, // 0019 SETMBR R8 K4 K9 - 0x28200D08, // 001A GE R8 R6 K8 - 0x78220002, // 001B JMPF R8 #001F - 0xB8220200, // 001C GETNGBL R8 K1 - 0x88201105, // 001D GETMBR R8 R8 K5 - 0x90220D09, // 001E SETMBR R8 K6 K9 - 0x28200F08, // 001F GE R8 R7 K8 - 0x78220002, // 0020 JMPF R8 #0024 - 0xB8220200, // 0021 GETNGBL R8 K1 - 0x88201105, // 0022 GETMBR R8 R8 K5 - 0x90220F09, // 0023 SETMBR R8 K7 K9 - 0x8C20010A, // 0024 GETMET R8 R0 K10 - 0x5C280200, // 0025 MOVE R10 R1 - 0x7C200400, // 0026 CALL R8 2 - 0x4C200000, // 0027 LDNIL R8 - 0x88240100, // 0028 GETMBR R9 R0 K0 - 0x50280200, // 0029 LDBOOL R10 1 0 - 0x2024120A, // 002A NE R9 R9 R10 - 0x78260000, // 002B JMPF R9 #002D - 0x88200100, // 002C GETMBR R8 R0 K0 - 0x90020003, // 002D SETMBR R0 K0 R3 - 0x780A000B, // 002E JMPF R2 #003B - 0xB8260200, // 002F GETNGBL R9 K1 - 0x88241302, // 0030 GETMBR R9 R9 K2 - 0x90260604, // 0031 SETMBR R9 K3 R4 - 0xB8260200, // 0032 GETNGBL R9 K1 - 0x88241302, // 0033 GETMBR R9 R9 K2 - 0x90260805, // 0034 SETMBR R9 K4 R5 - 0xB8260200, // 0035 GETNGBL R9 K1 - 0x88241305, // 0036 GETMBR R9 R9 K5 - 0x90260C06, // 0037 SETMBR R9 K6 R6 - 0xB8260200, // 0038 GETNGBL R9 K1 - 0x88241305, // 0039 GETMBR R9 R9 K5 - 0x90260E07, // 003A SETMBR R9 K7 R7 - 0x80041000, // 003B RET 1 R8 + 0x780A0004, // 0006 JMPF R2 #000C + 0x28140904, // 0007 GE R5 R4 K4 + 0x78160002, // 0008 JMPF R5 #000C + 0xB8160200, // 0009 GETNGBL R5 K1 + 0x88140B02, // 000A GETMBR R5 R5 K2 + 0x90160705, // 000B SETMBR R5 K3 K5 + 0x8C140106, // 000C GETMET R5 R0 K6 + 0x5C1C0200, // 000D MOVE R7 R1 + 0x7C140400, // 000E CALL R5 2 + 0x4C140000, // 000F LDNIL R5 + 0x88180100, // 0010 GETMBR R6 R0 K0 + 0x501C0200, // 0011 LDBOOL R7 1 0 + 0x20180C07, // 0012 NE R6 R6 R7 + 0x781A0000, // 0013 JMPF R6 #0015 + 0x88140100, // 0014 GETMBR R5 R0 K0 + 0x90020003, // 0015 SETMBR R0 K0 R3 + 0x780A0002, // 0016 JMPF R2 #001A + 0xB81A0200, // 0017 GETNGBL R6 K1 + 0x88180D02, // 0018 GETMBR R6 R6 K2 + 0x901A0604, // 0019 SETMBR R6 K3 R4 + 0x80040A00, // 001A RET 1 R5 }) ) ); diff --git a/tasmota/tasmota_xdrv_driver/xdrv_52_3_berry_tasmota_global.ino b/tasmota/tasmota_xdrv_driver/xdrv_52_3_berry_tasmota_global.ino index 905bc50d5..9a6410ea7 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_52_3_berry_tasmota_global.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_52_3_berry_tasmota_global.ino @@ -33,13 +33,14 @@ extern "C" { extern const be_ctypes_structure_t be_tasmota_global_struct = { sizeof(TasmotaGlobal), /* size in bytes */ - 8, /* number of elements */ + 9, /* number of elements */ nullptr, - (const be_ctypes_structure_item_t[8]) { + (const be_ctypes_structure_item_t[9]) { // Warning: fields below need to be in alphabetical order { "devices_present", offsetof(TasmotaGlobal_t, devices_present), 0, 0, ctypes_u8, 0 }, { "fast_loop_enabled", offsetof(TasmotaGlobal_t, berry_fast_loop_enabled), 0, 0, ctypes_u8, 0 }, { "masterlog_level", offsetof(TasmotaGlobal_t, masterlog_level), 0, 0, ctypes_u8, 0 }, + { "maxlog_level", offsetof(TasmotaGlobal_t, maxlog_level), 0, 0, ctypes_u8, 0 }, { "restart_flag", offsetof(TasmotaGlobal_t, restart_flag), 0, 0, ctypes_u8, 0 }, { "seriallog_level", offsetof(TasmotaGlobal_t, seriallog_level), 0, 0, ctypes_u8, 0 }, { "sleep", offsetof(TasmotaGlobal_t, sleep), 0, 0, ctypes_u8, 0 }, From f3cc8997b0f4dacbfba511c04aeb3da995be7274 Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Fri, 19 May 2023 17:14:29 +0200 Subject: [PATCH 154/289] Fix Berry solidify of berry_tasmota on Windows --- lib/libesp32/berry_tasmota/src/embedded/i2c_axp192.be | 7 ++++--- lib/libesp32/berry_tasmota/src/embedded/i2c_axp202.be | 6 ++++-- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/lib/libesp32/berry_tasmota/src/embedded/i2c_axp192.be b/lib/libesp32/berry_tasmota/src/embedded/i2c_axp192.be index ccf0ea770..82550b46d 100644 --- a/lib/libesp32/berry_tasmota/src/embedded/i2c_axp192.be +++ b/lib/libesp32/berry_tasmota/src/embedded/i2c_axp192.be @@ -1,8 +1,9 @@ #------------------------------------------------------------- - Generic driver for AXP192 - solidified -------------------------------------------------------------# - - #@ solidify:AXP192 +class I2C_Driver end # for solidification + +#@ solidify:AXP192 class AXP192 : I2C_Driver def init() super(self, I2C_Driver).init("AXP192", 0x34) @@ -103,7 +104,7 @@ class AXP192 : I2C_Driver # Set voltage on DC-DC1/2/3 # dcdc: 1/2/3 (warning some C libs start at 0) - # voltage: + # voltage: def set_dc_voltage(dcdc, voltage) if dcdc < 1 || dcdc > 3 return end var v diff --git a/lib/libesp32/berry_tasmota/src/embedded/i2c_axp202.be b/lib/libesp32/berry_tasmota/src/embedded/i2c_axp202.be index f2176dfd3..eee7f2bac 100644 --- a/lib/libesp32/berry_tasmota/src/embedded/i2c_axp202.be +++ b/lib/libesp32/berry_tasmota/src/embedded/i2c_axp202.be @@ -1,8 +1,10 @@ #------------------------------------------------------------- - Generic driver for AXP202 - solidified -------------------------------------------------------------# +class I2C_Driver end # for solidification + #@ solidify:AXP202 - class AXP202 : I2C_Driver +class AXP202 : I2C_Driver def init() super(self, I2C_Driver).init("AXP202", 0x35) end @@ -107,7 +109,7 @@ # Set voltage on DC-DC 2/3 # dcdc: 2/3 (warning some C libs start at 0) - # voltage: + # voltage: def set_dc_voltage(dcdc, voltage) if dcdc < 2 || dcdc > 3 return end var v From f5d6578fb5efe2123aa78fcbc9140401c0a069ba Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Fri, 19 May 2023 17:41:18 +0200 Subject: [PATCH 155/289] Fix correct JSON display of WifiPower float --- tasmota/tasmota_support/support_command.ino | 7 ++++--- tasmota/tasmota_support/support_wifi.ino | 9 +++------ 2 files changed, 7 insertions(+), 9 deletions(-) diff --git a/tasmota/tasmota_support/support_command.ino b/tasmota/tasmota_support/support_command.ino index 14ce3d846..b4661c896 100644 --- a/tasmota/tasmota_support/support_command.ino +++ b/tasmota/tasmota_support/support_command.ino @@ -883,8 +883,9 @@ void CmndStatus(void) #endif // USE_IPV6 #endif // USE_ETHERNET - ResponseAppend_P(PSTR(",\"" D_CMND_WEBSERVER "\":%d,\"HTTP_API\":%d,\"" D_CMND_WIFICONFIG "\":%d,\"" D_CMND_WIFIPOWER "\":%s}}"), - Settings->webserver, Settings->flag5.disable_referer_chk, Settings->sta_config, WifiGetOutputPower().c_str()); + float wifi_tx_power = WifiGetOutputPower(); + ResponseAppend_P(PSTR(",\"" D_CMND_WEBSERVER "\":%d,\"HTTP_API\":%d,\"" D_CMND_WIFICONFIG "\":%d,\"" D_CMND_WIFIPOWER "\":%1_f}}"), + Settings->webserver, Settings->flag5.disable_referer_chk, Settings->sta_config, &wifi_tx_power); CmndStatusResponse(5); } @@ -2535,7 +2536,7 @@ void CmndWifiPower(void) { } WifiSetOutputPower(); } - ResponseCmndChar(WifiGetOutputPower().c_str()); + ResponseCmndFloat(WifiGetOutputPower(), 1); } void CmndWifi(void) diff --git a/tasmota/tasmota_support/support_wifi.ino b/tasmota/tasmota_support/support_wifi.ino index c518af1d2..cb701a304 100644 --- a/tasmota/tasmota_support/support_wifi.ino +++ b/tasmota/tasmota_support/support_wifi.ino @@ -974,14 +974,11 @@ int WifiState(void) return state; } -String WifiGetOutputPower(void) { - char stemp1[TOPSZ]; +float WifiGetOutputPower(void) { if (Settings->wifi_output_power) { - dtostrfd((float)(Settings->wifi_output_power) / 10, 1, stemp1); - } else { - dtostrfd((float)(Wifi.last_tx_pwr) / 10, 0, stemp1); // No decimal to indicate dynamic tx power + Wifi.last_tx_pwr = Settings->wifi_output_power; } - return String(stemp1); + return (float)(Wifi.last_tx_pwr) / 10; } void WifiSetOutputPower(void) { From 63a83c72897b69708d52782e8ce5d6fcffdc50ec Mon Sep 17 00:00:00 2001 From: Ian Anderson Date: Sat, 20 May 2023 01:51:46 -0400 Subject: [PATCH 156/289] Added quirks file for Tuya_ZG-204ZL (#18693) --- tasmota/zigbee/Tuya_ZG-204ZL.zb | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 tasmota/zigbee/Tuya_ZG-204ZL.zb diff --git a/tasmota/zigbee/Tuya_ZG-204ZL.zb b/tasmota/zigbee/Tuya_ZG-204ZL.zb new file mode 100644 index 000000000..46eb68cbf --- /dev/null +++ b/tasmota/zigbee/Tuya_ZG-204ZL.zb @@ -0,0 +1,8 @@ +#Z2Tv1 +# Human presence sensor Zigbee +# https://zigbee.blakadder.com/Tuya_ZG-204ZL.html +:TS0601,_TZE200_3towulqd +:TS0601,_TZE200_1ibpyhdc +:TS0601,_TZE200_bh3n6gk8 +EF00/0401=0406/0000 # map to Occupancy +EF00/020C=0400/0000 # map to illuminance MeasuredValue From d5ad79985bce8d32c86a8f8f189417d31de4da5f Mon Sep 17 00:00:00 2001 From: Bernhard Urban-Forster Date: Sat, 20 May 2023 09:06:56 +0200 Subject: [PATCH 157/289] haas: sync shutter discovery and fix for more than 4 shutter (#18694) * discovery: hoist shutter computation out of loop * haas: sync shutter discovery and fix for more than 4 shutter --- .../tasmota_xdrv_driver/xdrv_12_discovery.ino | 23 ++++++++++--------- .../xdrv_12_home_assistant.ino | 19 +++++++-------- 2 files changed, 22 insertions(+), 20 deletions(-) diff --git a/tasmota/tasmota_xdrv_driver/xdrv_12_discovery.ino b/tasmota/tasmota_xdrv_driver/xdrv_12_discovery.ino index 91f0bfe9d..ae31ab6cb 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_12_discovery.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_12_discovery.ino @@ -109,22 +109,23 @@ void TasDiscoverMessage(void) { uint16_t Relay[MAX_RELAYS_SET] = { 0 }; // Base array to store the relay type uint16_t Shutter[MAX_RELAYS_SET] = { 0 }; // Array to store a temp list for shutters - for (uint32_t i = 0; i < MAX_RELAYS_SET; i++) { - if (i < TasmotaGlobal.devices_present) { #ifdef USE_SHUTTER - if (Settings->flag3.shutter_mode) { - for (uint32_t k = 0; k < TasmotaGlobal.shutters_present; k++) { - if (ShutterGetStartRelay(k) > 0) { - Shutter[ShutterGetStartRelay(k)-1] = Shutter[ShutterGetStartRelay(k)] = 1; - } else { - // terminate loop at first INVALID ShutterGetStartRelay(k). - break; - } - } + if (Settings->flag3.shutter_mode) { + for (uint32_t k = 0; k < TasmotaGlobal.shutters_present; k++) { + uint8_t sr = ShutterGetStartRelay(k); + if (sr > 0) { + Shutter[sr-1] = Shutter[sr] = 1; + } else { + // terminate loop at first INVALID ShutterGetStartRelay(k). + break; } + } + } #endif // USE_SHUTTER + for (uint32_t i = 0; i < MAX_RELAYS_SET; i++) { + if (i < TasmotaGlobal.devices_present) { if (Shutter[i] != 0) { // Check if there are shutters present Relay[i] = 3; // Relay is a shutter } else { diff --git a/tasmota/tasmota_xdrv_driver/xdrv_12_home_assistant.ino b/tasmota/tasmota_xdrv_driver/xdrv_12_home_assistant.ino index 71a729c41..3b6378694 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_12_home_assistant.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_12_home_assistant.ino @@ -393,7 +393,7 @@ void HassDiscoverMessage(void) { light_controller_isCTRGBLinked, light_subtype); - for (uint32_t i = 0; i < tmax(TasmotaGlobal.shutters_present, MAX_SHUTTERS); i++) { + for (uint32_t i = 0; i < tmin(TasmotaGlobal.shutters_present, MAX_SHUTTERS); i++) { #ifdef USE_SHUTTER ResponseAppend_P(PSTR("%s%d"), (i > 0 ? "," : ""), Settings->shutter_options[i]); #else @@ -528,10 +528,11 @@ void HAssAnnounceRelayLight(void) #ifdef USE_SHUTTER if (Settings->flag3.shutter_mode) { - for (uint32_t i = 0; i < MAX_SHUTTERS; i++) { - if (Settings->shutter_startrelay[i] > 0 ) { - bitSet(shutter_mask, Settings->shutter_startrelay[i] -1); - bitSet(shutter_mask, Settings->shutter_startrelay[i]); + for (uint32_t i = 0; i < TasmotaGlobal.shutters_present; i++) { + uint8_t sr = ShutterGetStartRelay(i); + if (sr > 0) { + bitSet(shutter_mask, sr-1); + bitSet(shutter_mask, sr); } else { // terminate loop at first INVALID Settings->shutter_startrelay[i]. break; @@ -1064,7 +1065,7 @@ void HAssAnnounceShutters(void) char unique_id[30]; uint8_t ShowTopic; // Used to hide/unhide a topic during Discovery to spare some cpu load - for (uint32_t i = 0; i < MAX_SHUTTERS; i++) { + for (uint32_t i = 0; i < TasmotaGlobal.shutters_present; i++) { ResponseClear(); // Clear retained message TasmotaGlobal.masterlog_level = ShowTopic = 4; // Hide topic on clean and remove use weblog 4 to see it @@ -1072,7 +1073,7 @@ void HAssAnnounceShutters(void) snprintf_P(unique_id, sizeof(unique_id), PSTR("%06X_SHT_%d"), ESP_getChipId(), i + 1); snprintf_P(stopic, sizeof(stopic), PSTR(HOME_ASSISTANT_DISCOVERY_PREFIX "/cover/%s/config"), unique_id); - if (Settings->flag.hass_discovery && Settings->flag3.shutter_mode && Settings->shutter_startrelay[i] > 0) { + if (Settings->flag.hass_discovery && Settings->flag3.shutter_mode && ShutterGetStartRelay(i) > 0) { ShowTopic = 0; // Show the new generated topic if (i > MAX_FRIENDLYNAMES) { snprintf_P(stemp1, sizeof(stemp1), PSTR("%s Shutter %d"), SettingsText(SET_DEVICENAME), i + 1); @@ -1091,9 +1092,9 @@ void HAssAnnounceShutters(void) GetTopic_P(stemp2, CMND, TasmotaGlobal.mqtt_topic, PSTR("ShutterPosition")); TryResponseAppend_P(HASS_DISCOVER_SHUTTER_POS, stemp1, i + 1, stemp2, i + 1); - if (Settings->shutter_tilt_config[3][i] != Settings->shutter_tilt_config[4][i]) { + if (ShutterGetTiltConfig(3,i) != ShutterGetTiltConfig(4,i)) { GetTopic_P(stemp1, CMND, TasmotaGlobal.mqtt_topic, PSTR("ShutterTilt")); - TryResponseAppend_P(HASS_DISCOVER_SHUTTER_TILT, stemp1, i + 1, Settings->shutter_tilt_config[3][i], Settings->shutter_tilt_config[4][i]); + TryResponseAppend_P(HASS_DISCOVER_SHUTTER_TILT, stemp1, i + 1, ShutterGetTiltConfig(3,i), ShutterGetTiltConfig(4,i)); } TryResponseAppend_P(HASS_DISCOVER_DEVICE_INFO_SHORT, unique_id, ESP_getChipId()); From a76ebaae48bc7ec573fa277c1c9bed6e810b2607 Mon Sep 17 00:00:00 2001 From: stefanbode Date: Sun, 21 May 2023 12:25:11 +0200 Subject: [PATCH 158/289] Shutter continuous improvement (#18701) * Update xdrv_27_esp32_shutter.ino * Update xdrv_27_shutter.ino * Update xdrv_01_9_webserver.ino * Update xdrv_12_discovery.ino * shutterinvert removed slider display to driver fix wrong invert display * codereduction+refactor slider removed webui slider into driver optimized code * update slide, fix invert shutters - refactor sliders into driver - fix percent calculation on iverted shutters * fix on realpercent if inverted shutter * fix ShutterPercentToRealPosition fix on inverted shutter * added shutter to bootloop reset * bugfix integration * bugfix --- tasmota/tasmota.ino | 1 + .../xdrv_01_9_webserver.ino | 16 +-- .../tasmota_xdrv_driver/xdrv_12_discovery.ino | 6 +- .../xdrv_27_esp32_shutter.ino | 35 ++++-- .../tasmota_xdrv_driver/xdrv_27_shutter.ino | 111 ++++++++++-------- 5 files changed, 94 insertions(+), 75 deletions(-) diff --git a/tasmota/tasmota.ino b/tasmota/tasmota.ino index d23eafc96..8958e121c 100644 --- a/tasmota/tasmota.ino +++ b/tasmota/tasmota.ino @@ -578,6 +578,7 @@ void setup(void) { } if (RtcReboot.fast_reboot_count > Settings->param[P_BOOT_LOOP_OFFSET] +2) { // Restarted 4 times Settings->rule_enabled = 0; // Disable all rules + Settings->flag3.shutter_mode = 0; // disable shutter support TasmotaGlobal.no_autoexec = true; } if (RtcReboot.fast_reboot_count > Settings->param[P_BOOT_LOOP_OFFSET] +3) { // Restarted 5 times diff --git a/tasmota/tasmota_xdrv_driver/xdrv_01_9_webserver.ino b/tasmota/tasmota_xdrv_driver/xdrv_01_9_webserver.ino index 84f5368fb..2ab1afa99 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_01_9_webserver.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_01_9_webserver.ino @@ -264,9 +264,6 @@ const char HTTP_MSG_SLIDER_GRADIENT[] PROGMEM = "
" "" "
"; -const char HTTP_MSG_SLIDER_SHUTTER[] PROGMEM = - "
" D_CLOSE "" D_OPEN "
" - "
"; const char HTTP_MSG_RSTRT[] PROGMEM = "
" D_DEVICE_WILL_RESTART "

"; @@ -1229,13 +1226,6 @@ void HandleRoot(void) } // Settings->flag3.pwm_multi_channels } #endif // USE_LIGHT -#ifdef USE_SHUTTER - if (Settings->flag3.shutter_mode) { // SetOption80 - Enable shutter support - for (uint32_t i = 0; i < TasmotaGlobal.shutters_present; i++) { - WSContentSend_P(HTTP_MSG_SLIDER_SHUTTER, ShutterRealToPercentPosition(-9999, i), i+1); - } - } -#endif // USE_SHUTTER WSContentSend_P(HTTP_TABLE100); WSContentSend_P(PSTR("
")); #ifdef USE_SONOFF_IFAN @@ -1258,7 +1248,7 @@ void HandleRoot(void) int32_t ShutterWebButton; if (ShutterWebButton = IsShutterWebButton(idx)) { WSContentSend_P(HTTP_DEVICE_CONTROL, 100 / cols, idx, - (set_button) ? SettingsText(SET_BUTTON1 + idx -1) : ((Settings->shutter_options[abs(ShutterWebButton)-1] & 2) /* is locked */ ? "-" : ((Settings->shutter_options[abs(ShutterWebButton)-1] & 8) /* invert web buttons */ ? ((ShutterWebButton>0) ? "▼" : "▲") : ((ShutterWebButton>0) ? "▲" : "▼"))), + (set_button) ? SettingsText(SET_BUTTON1 + idx -1) : ((ShutterGetOptions(abs(ShutterWebButton)-1) & 2) /* is locked */ ? "-" : ((Settings->shutter_options[abs(ShutterWebButton)-1] & 8) /* invert web buttons */ ? ((ShutterWebButton>0) ? "▼" : "▲") : ((ShutterWebButton>0) ? "▲" : "▼"))), ""); } else { #endif // USE_SHUTTER @@ -1410,10 +1400,12 @@ bool HandleRootStatusRefresh(void) #endif // USE_LIGHT #ifdef USE_SHUTTER for (uint32_t j = 1; j <= TasmotaGlobal.shutters_present; j++) { + uint8_t percent; snprintf_P(webindex, sizeof(webindex), PSTR("u%d"), j); WebGetArg(webindex, tmp, sizeof(tmp)); // 0 - 100 percent + percent = atoi(tmp); if (strlen(tmp)) { - snprintf_P(svalue, sizeof(svalue), PSTR("ShutterPosition%d %s"), j, tmp); + snprintf_P(svalue, sizeof(svalue), PSTR("ShutterPosition%d %d"), j, (ShutterGetOptions(j-1) & 1) ? 100 - percent : percent); ExecuteWebCommand(svalue); } } diff --git a/tasmota/tasmota_xdrv_driver/xdrv_12_discovery.ino b/tasmota/tasmota_xdrv_driver/xdrv_12_discovery.ino index ae31ab6cb..6fb523dc0 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_12_discovery.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_12_discovery.ino @@ -200,9 +200,9 @@ void TasDiscoverMessage(void) { light_controller_isCTRGBLinked, light_subtype); - for (uint32_t i = 0; i < tmin(TasmotaGlobal.shutters_present, MAX_SHUTTERS); i++) { + for (uint32_t i = 0; i < TasmotaGlobal.shutters_present; i++) { #ifdef USE_SHUTTER - ResponseAppend_P(PSTR("%s%d"), (i > 0 ? "," : ""), Settings->shutter_options[i]); + ResponseAppend_P(PSTR("%s%d"), (i > 0 ? "," : ""), ShutterGetOptions(i)); #else ResponseAppend_P(PSTR("%s0"), (i > 0 ? "," : "")); #endif // USE_SHUTTER @@ -210,7 +210,7 @@ void TasDiscoverMessage(void) { ResponseAppend_P(PSTR("]," // Shutter Options (end) "\"sht\":[")); // Shutter Tilt (start) - for (uint32_t i = 0; i < tmax(TasmotaGlobal.shutters_present, MAX_SHUTTERS); i++) { + for (uint32_t i = 0; i < TasmotaGlobal.shutters_present; i++) { #ifdef USE_SHUTTER ResponseAppend_P(PSTR("%s[%d,%d,%d]"), (i > 0 ? "," : ""), ShutterGetTiltConfig(0,i), diff --git a/tasmota/tasmota_xdrv_driver/xdrv_27_esp32_shutter.ino b/tasmota/tasmota_xdrv_driver/xdrv_27_esp32_shutter.ino index eb5569e4f..a4739135e 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_27_esp32_shutter.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_27_esp32_shutter.ino @@ -54,7 +54,10 @@ #define D_ERROR_FILESYSTEM_NOT_READY "SHT: ERROR File system not enabled" #define D_ERROR_FILE_NOT_FOUND "SHT: ERROR File system not ready or file not found" -// +const char HTTP_MSG_SLIDER_SHUTTER[] PROGMEM = + "
%s%s
" + "
"; + const uint32_t SHUTTER_VERSION = 0x01010100; // Latest driver version (See settings deltas below) typedef struct { // depreciated 2023-04-28 @@ -364,7 +367,7 @@ bool ShutterStatus(void) { "\"Mode\":\"%d\"," "\"TiltConfig\":[%d,%d,%d,%d,%d]}"), i, ShutterSettings.shutter_startrelay[i], ShutterSettings.shutter_startrelay[i] +1, ShutterSettings.shutter_opentime[i], ShutterSettings.shutter_closetime[i], - ShutterSettings.shutter_set50percent[i], ShutterSettings.shutter_motordelay[i], GetBinary8(Settings->shutter_options[i], 4).c_str(), + ShutterSettings.shutter_set50percent[i], ShutterSettings.shutter_motordelay[i], GetBinary8(ShutterSettings.shutter_options[i], 4).c_str(), ShutterSettings.shuttercoeff[0][i], ShutterSettings.shuttercoeff[1][i], ShutterSettings.shuttercoeff[2][i], ShutterSettings.shuttercoeff[3][i], ShutterSettings.shuttercoeff[4][i], ShutterSettings.shutter_mode, ShutterSettings.shutter_tilt_config[0][i], ShutterSettings.shutter_tilt_config[1][i], ShutterSettings.shutter_tilt_config[2][i], ShutterSettings.shutter_tilt_config[3][i], ShutterSettings.shutter_tilt_config[4][i] @@ -389,6 +392,10 @@ uint8_t ShutterGetStartRelay(uint8_t index) { return ShutterSettings.shutter_startrelay[index]; } +uint8_t ShutterGetOptions(uint8_t index) { + return ShutterSettings.shutter_options[index]; +} + int8_t ShutterGetTiltConfig(uint8_t config_idx,uint8_t index) { return Shutter[index].tilt_config[config_idx]; } @@ -497,13 +504,13 @@ int32_t ShutterPercentToRealPosition(int16_t percent, uint32_t index) uint8_t ShutterRealToPercentPosition(int32_t realpos, uint32_t index) { + int64_t realpercent; if (realpos == -9999) { realpos = Shutter[index].real_position; } if (ShutterSettings.shutter_set50percent[index] != 50) { - return (ShutterSettings.shuttercoeff[2][index] * 5 > realpos/10) ? SHT_DIV_ROUND(realpos/10, ShutterSettings.shuttercoeff[2][index]) : SHT_DIV_ROUND(realpos/10-ShutterSettings.shuttercoeff[0][index]*10, ShutterSettings.shuttercoeff[1][index]); + realpercent = (ShutterSettings.shuttercoeff[2][index] * 5 > realpos/10) ? SHT_DIV_ROUND(realpos/10, ShutterSettings.shuttercoeff[2][index]) : SHT_DIV_ROUND(realpos/10-ShutterSettings.shuttercoeff[0][index]*10, ShutterSettings.shuttercoeff[1][index]); } else { - int64_t realpercent; for (uint32_t j = 0; j < 5; j++) { if (realpos >= Shutter[index].open_max * calibrate_pos[j+1] / 100) { realpercent = SHT_DIV_ROUND(ShutterSettings.shuttercoeff[j][index], 10); @@ -521,10 +528,10 @@ uint8_t ShutterRealToPercentPosition(int32_t realpos, uint32_t index) break; } } - realpercent = realpercent < 0 ? 0 : realpercent; - // if inverted recalculate the percentposition - return (ShutterSettings.shutter_options[index] & 1) ? 100 - realpercent : realpercent; } + realpercent = realpercent < 0 ? 0 : realpercent; + // if inverted recalculate the percentposition + return (ShutterSettings.shutter_options[index] & 1) ? 100 - realpercent : realpercent; } void ShutterInit(void) @@ -1127,8 +1134,8 @@ void ShutterRelayChanged(void) // powerstate_local == 1 => direction=1, target=Shutter[i].open_max // powerstate_local == 2 => direction=-1, target=0 // only happen on SHT_TIME // powerstate_local == 3 => direction=-1, target=0 // only happen if NOT SHT_TIME - int direction = (powerstate_local == 0) ? 0 : (powerstate_local == 1) ? 1 : -1; - int target = (powerstate_local == 1) ? Shutter[i].open_max : 0; + int8_t direction = (powerstate_local == 0) ? 0 : (powerstate_local == 1) ? 1 : -1; + int8_t target = (powerstate_local == 1) ? Shutter[i].open_max : 0; if (direction != 0) { ShutterStartInit(i, direction, target); @@ -1318,6 +1325,11 @@ void ShutterToggle(bool dir) } } +void ShutterShow(){ + for (uint32_t i = 0; i < TasmotaGlobal.shutters_present; i++) { + WSContentSend_P(HTTP_MSG_SLIDER_SHUTTER, (ShutterSettings.shutter_options[i] & 1) ? D_OPEN : D_CLOSE,(ShutterSettings.shutter_options[i] & 1) ? D_CLOSE : D_OPEN, ShutterRealToPercentPosition(-9999, i), i+1); + } +} /*********************************************************************************************\ * Commands \*********************************************************************************************/ @@ -2328,6 +2340,11 @@ bool Xdrv27(uint32_t function) result = false; } break; +#ifdef USE_WEBSERVER + case FUNC_WEB_SENSOR: + ShutterShow(); + break; +#endif // USE_WEBSERVER } } return result; diff --git a/tasmota/tasmota_xdrv_driver/xdrv_27_shutter.ino b/tasmota/tasmota_xdrv_driver/xdrv_27_shutter.ino index 7229a8942..c9dbb9545 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_27_shutter.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_27_shutter.ino @@ -72,6 +72,10 @@ int32_t next_possible_stop_position = 0; int32_t current_real_position = 0; int32_t current_pwm_velocity = 0; +const char HTTP_MSG_SLIDER_SHUTTER[] PROGMEM = + "
%s%s
" + "
"; + const uint8_t MAX_MODES = 8; enum Shutterposition_mode {SHT_UNDEF, SHT_TIME, SHT_TIME_UP_DOWN, SHT_TIME_GARAGE, SHT_COUNTER, SHT_PWM_VALUE, SHT_PWM_TIME,SHT_AUTOCONFIG}; enum Shutterswitch_mode {SHT_SWITCH, SHT_PULSE,}; @@ -189,6 +193,10 @@ uint8_t ShutterGetStartRelay(uint8_t index) { return Settings->shutter_startrelay[index]; } +uint8_t ShutterGetOptions(uint8_t index) { + return Settings->shutter_options[index]; +} + int8_t ShutterGetTiltConfig(uint8_t config_idx,uint8_t index) { return Shutter[index].tilt_config[config_idx]; } @@ -259,6 +267,8 @@ void ShutterRtc50mS(void) int32_t ShutterPercentToRealPosition(int16_t percent, uint32_t index) { + // if inverted recalculate the percentposition + percent = (Settings->shutter_options[index] & 1) ? 100 - percent : percent; if (Settings->shutter_set50percent[index] != 50) { return (percent <= 5) ? Settings->shuttercoeff[2][index] * percent*10 : (Settings->shuttercoeff[1][index] * percent + (Settings->shuttercoeff[0][index]*10))*10; } else { @@ -295,13 +305,13 @@ int32_t ShutterPercentToRealPosition(int16_t percent, uint32_t index) uint8_t ShutterRealToPercentPosition(int32_t realpos, uint32_t index) { + int64_t realpercent; if (realpos == -9999) { realpos = Shutter[index].real_position; } if (Settings->shutter_set50percent[index] != 50) { - return (Settings->shuttercoeff[2][index] * 5 > realpos/10) ? SHT_DIV_ROUND(realpos/10, Settings->shuttercoeff[2][index]) : SHT_DIV_ROUND(realpos/10-Settings->shuttercoeff[0][index]*10, Settings->shuttercoeff[1][index]); + realpercent = (Settings->shuttercoeff[2][index] * 5 > realpos/10) ? SHT_DIV_ROUND(realpos/10, Settings->shuttercoeff[2][index]) : SHT_DIV_ROUND(realpos/10-Settings->shuttercoeff[0][index]*10, Settings->shuttercoeff[1][index]); } else { - int64_t realpercent; for (uint32_t j = 0; j < 5; j++) { if (realpos >= Shutter[index].open_max * calibrate_pos[j+1] / 100) { realpercent = SHT_DIV_ROUND(Settings->shuttercoeff[j][index], 10); @@ -319,8 +329,10 @@ uint8_t ShutterRealToPercentPosition(int32_t realpos, uint32_t index) break; } } - return realpercent < 0 ? 0 : realpercent; } + realpercent = realpercent < 0 ? 0 : realpercent; + // if inverted recalculate the percentposition + return (Settings->shutter_options[index] & 1) ? 100 - realpercent : realpercent; } void ShutterInit(void) @@ -876,52 +888,38 @@ void ShutterRelayChanged(void) Shutter[i].tiltmoving = 0; } switch (ShutterGlobal.position_mode) { - // enum Shutterposition_mode {SHT_TIME, SHT_TIME_UP_DOWN, SHT_TIME_GARAGE, SHT_COUNTER, SHT_PWM_VALUE, SHT_PWM_TIME,}; - case SHT_TIME_UP_DOWN: - case SHT_COUNTER: - case SHT_PWM_VALUE: - case SHT_PWM_TIME: - //AddLog(LOG_LEVEL_DEBUG_MORE, PSTR("SHT: power off manual change")); - ShutterPowerOff(i); - switch (powerstate_local) { - case 1: - ShutterStartInit(i, 1, Shutter[i].open_max); - break; - case 3: - ShutterStartInit(i, -1, 0); - break; - default: - //AddLog(LOG_LEVEL_DEBUG_MORE, PSTR("SHT: Shtr%d Switch OFF motor."),i); + // enum Shutterposition_mode {SHT_TIME, SHT_TIME_UP_DOWN, SHT_TIME_GARAGE, SHT_COUNTER, SHT_PWM_VALUE, SHT_PWM_TIME,}; + case SHT_TIME_UP_DOWN: + case SHT_COUNTER: + case SHT_PWM_VALUE: + case SHT_PWM_TIME: + case SHT_TIME: { + ShutterPowerOff(i); + // powerstate_local == 0 => direction=0, stop + // powerstate_local == 1 => direction=1, target=Shutter[i].open_max + // powerstate_local == 2 => direction=-1, target=0 // only happen on SHT_TIME + // powerstate_local == 3 => direction=-1, target=0 // only happen if NOT SHT_TIME + int8_t direction = (powerstate_local == 0) ? 0 : (powerstate_local == 1) ? 1 : -1; + int8_t target = (powerstate_local == 1) ? Shutter[i].open_max : 0; + + if (direction != 0) { + ShutterStartInit(i, direction, target); + } else { Shutter[i].target_position = Shutter[i].real_position; Shutter[i].last_stop_time = millis(); } - break; - case SHT_TIME: - switch (powerstate_local) { - case 1: - ShutterStartInit(i, 1, Shutter[i].open_max); - break; - case 2: - ShutterStartInit(i, -1, 0); - break; - default: - //AddLog(LOG_LEVEL_DEBUG_MORE, PSTR("SHT: Shtr%d Switch OFF motor."),i+1); - Shutter[i].target_position = Shutter[i].real_position; - Shutter[i].last_stop_time = millis(); + break; } - break; - case SHT_TIME_GARAGE: - switch (powerstate_local) { - case 1: - ShutterStartInit(i, Shutter[i].lastdirection*-1 , Shutter[i].lastdirection == 1 ? 0 : Shutter[i].open_max); - AddLog(LOG_LEVEL_DEBUG_MORE, PSTR("SHT: Shtr%d Garage. NewTarget %d"), i, Shutter[i].target_position); - break; - default: - Shutter[i].target_position = Shutter[i].real_position; - } - - - } // switch (ShutterGlobal.position_mode) + case SHT_TIME_GARAGE: + switch (powerstate_local) { + case 1: + ShutterStartInit(i, Shutter[i].lastdirection * -1, Shutter[i].lastdirection == 1 ? 0 : Shutter[i].open_max); + AddLog(LOG_LEVEL_DEBUG_MORE, PSTR("SHT: Shtr%d Garage. NewTarget %d"), i, Shutter[i].target_position); + break; + default: + Shutter[i].target_position = Shutter[i].real_position; + } + } AddLog(LOG_LEVEL_DEBUG_MORE, PSTR("SHT: Shtr%d, Target %ld, Power: %d, tiltmv: %d"), i+1, Shutter[i].target_position, powerstate_local,Shutter[i].tiltmoving); } // if (manual_relays_changed) } // for (uint32_t i = 0; i < TasmotaGlobal.shutters_present; i++) @@ -940,11 +938,11 @@ bool ShutterButtonIsSimultaneousHold(uint32_t button_index, uint32_t shutter_ind bool ShutterButtonHandler(void) { - uint8_t buttonState = SHT_NOT_PRESSED; - uint8_t button = XdrvMailbox.payload; - uint8_t press_index; + uint8_t buttonState = SHT_NOT_PRESSED; + uint8_t button = XdrvMailbox.payload; + uint8_t press_index; uint32_t button_index = XdrvMailbox.index; - uint8_t shutter_index = Settings->shutter_button[button_index] & 0x03; + uint8_t shutter_index = Settings->shutter_button[button_index] & 0x03; uint16_t loops_per_second = 1000 / Settings->button_debounce; // ButtonDebounce (50) if ((PRESSED == button) && (NOT_PRESSED == Button.last_state[button_index])) { @@ -976,8 +974,8 @@ bool ShutterButtonHandler(void) Button.hold_timer[button_index] = 0; } else { Button.hold_timer[button_index]++; - if (!Settings->flag.button_single) { // SetOption13 (0) - Allow only single button press for immediate action - if (Settings->param[P_HOLD_IGNORE] > 0) { // SetOption40 (0) - Do not ignore button hold + if (!Settings->flag.button_single) { // SetOption13 (0) - Allow only single button press for immediate action + if (Settings->param[P_HOLD_IGNORE] > 0) { // SetOption40 (0) - Do not ignore button hold if (Button.hold_timer[button_index] > loops_per_second * Settings->param[P_HOLD_IGNORE] / 10) { Button.hold_timer[button_index] = 0; // Reset button hold counter to stay below hold trigger Button.press_counter[button_index] = 0; // Discard button press to disable functionality @@ -1159,6 +1157,12 @@ void ShutterToggle(bool dir) } } +void ShutterShow(){ + for (uint32_t i = 0; i < TasmotaGlobal.shutters_present; i++) { + WSContentSend_P(HTTP_MSG_SLIDER_SHUTTER, (Settings->shutter_options[i] & 1) ? D_OPEN : D_CLOSE,(Settings->shutter_options[i] & 1) ? D_CLOSE : D_OPEN, ShutterRealToPercentPosition(-9999, i), i+1); + } +} + /*********************************************************************************************\ * Commands \*********************************************************************************************/ @@ -1980,6 +1984,11 @@ bool Xdrv27(uint32_t function) result = true; } break; +#ifdef USE_WEBSERVER + case FUNC_WEB_SENSOR: + ShutterShow(); + break; +#endif // USE_WEBSERVER } } return result; From ae518424bc122c2800ff21e1849d387eeabeea40 Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Sun, 21 May 2023 15:34:36 +0200 Subject: [PATCH 159/289] Add IPv4 DNS lookup to influxdb - Add IPv4 DNS lookup to influxdb (#18015) - Add response to influxdb send --- CHANGELOG.md | 1 + RELEASENOTES.md | 1 + tasmota/tasmota_support/support.ino | 3 +- .../tasmota_xdrv_driver/xdrv_59_influxdb.ino | 33 +++++++++++++++---- 4 files changed, 31 insertions(+), 7 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 769ffa136..5da7cffdb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,7 @@ All notable changes to this project will be documented in this file. ### Breaking Changed ### Changed +- InfluxDb resolves DNS name before request (#18015) ### Fixed - Shutter bootloop using more than 4 shutters (#18673) diff --git a/RELEASENOTES.md b/RELEASENOTES.md index aacd1980e..df671c5df 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -135,6 +135,7 @@ The latter links can be used for OTA upgrades too like ``OtaUrl https://ota.tasm ### Changed - IRremoteESP8266 library from v2.8.4 to v2.8.5 - ESP32 Framework (Core) from v2.0.7 to v2.0.9 +- InfluxDb resolves DNS name before request [#18015](https://github.com/arendst/Tasmota/issues/18015) - Refactored Zero Cross Dimmer [#18481](https://github.com/arendst/Tasmota/issues/18481) - Energy power delta report delayed by two seconds allowing hardware to stabilize [#17751](https://github.com/arendst/Tasmota/issues/17751) diff --git a/tasmota/tasmota_support/support.ino b/tasmota/tasmota_support/support.ino index 62d5c13d1..fbeae1688 100755 --- a/tasmota/tasmota_support/support.ino +++ b/tasmota/tasmota_support/support.ino @@ -2371,7 +2371,8 @@ bool GetLog(uint32_t req_loglevel, uint32_t* index_p, char** entry_pp, size_t* l } void AddLogData(uint32_t loglevel, const char* log_data, const char* log_data_payload = nullptr, const char* log_data_retained = nullptr) { - if (loglevel > TasmotaGlobal.maxlog_level) { return; } + // Ignore any logging when maxlog_level = 0 OR logging for levels equal or lower than maxlog_level + if (!TasmotaGlobal.maxlog_level || (loglevel > TasmotaGlobal.maxlog_level)) { return; } // Store log_data in buffer // To lower heap usage log_data_payload may contain the payload data from MqttPublishPayload() // and log_data_retained may contain optional retained message from MqttPublishPayload() diff --git a/tasmota/tasmota_xdrv_driver/xdrv_59_influxdb.ino b/tasmota/tasmota_xdrv_driver/xdrv_59_influxdb.ino index ea95998ea..2f97aa3db 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_59_influxdb.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_59_influxdb.ino @@ -40,6 +40,7 @@ * IfxPeriod - Set Influxdb period. If not set (or 0), use Teleperiod * IfxSensor - Set Influxdb sensor logging off (0) or on (1) * IfxRP - Set Influxdb retention policy + * IfxLog - Set Influxdb logging level (4 = default) * * The following triggers result in automatic influxdb numeric feeds without appended time: * - this driver initiated state message @@ -73,7 +74,10 @@ #define INFLUXDB_BUCKET "db" // [IfxDatabase, IfxBucket] Influxdb v1 database or v2 bucket #endif #ifndef INFLUXDB_RP -#define INFLUXDB_RP "" // [IfxRP] Influxdb v1 retention policy (blank is default, usually autogen infinite) +#define INFLUXDB_RP "" // [IfxRP] Influxdb v1 retention policy (blank is default, usually autogen infinite) +#endif +#ifndef INFLUXDB_CONNECT_TIMEOUT +#define INFLUXDB_CONNECT_TIMEOUT 2000 // Default timeout in milliseconds #endif static const char UninitializedMessage[] PROGMEM = "Unconfigured instance"; @@ -112,6 +116,19 @@ String InfluxDbAuth(void) { return auth; } +bool InfluxDbHostByName(void) { + IPAddress ifdb_ip; + if (!WifiHostByName(SettingsText(SET_INFLUXDB_HOST), ifdb_ip)) { + AddLog(LOG_LEVEL_DEBUG, PSTR("IFX: Invalid ifxhost")); + return false; + } + IFDB._serverUrl = "http://"; + IFDB._serverUrl += ifdb_ip.toString(); + IFDB._serverUrl += ":"; + IFDB._serverUrl += Settings->influxdb_port; + return true; +} + bool InfluxDbParameterInit(void) { if (strlen(SettingsText(SET_INFLUXDB_BUCKET)) == 0 || (2 == Settings->influxdb_version && (strlen(SettingsText(SET_INFLUXDB_ORG)) == 0 || @@ -119,10 +136,7 @@ bool InfluxDbParameterInit(void) { AddLog(LOG_LEVEL_DEBUG, PSTR("IFX: Invalid parameters")); return false; } - IFDB._serverUrl = "http://"; - IFDB._serverUrl += SettingsText(SET_INFLUXDB_HOST); - IFDB._serverUrl += ":"; - IFDB._serverUrl += Settings->influxdb_port; + if (!InfluxDbHostByName()) { return false; } IFDB._writeUrl = IFDB._serverUrl; if (2 == Settings->influxdb_version) { @@ -150,6 +164,9 @@ bool InfluxDbInit(void) { IFDBhttpClient = new HTTPClient; } IFDBhttpClient->setReuse(IFDB._connectionReuse); +#ifdef ESP32 + IFDBhttpClient->setConnectTimeout(INFLUXDB_CONNECT_TIMEOUT); +#endif // ESP32 char server[32]; snprintf_P(server, sizeof(server), PSTR("Tasmota/%s (%s)"), TasmotaGlobal.version, GetDeviceHardware().c_str()); IFDBhttpClient->setUserAgent(server); @@ -186,6 +203,8 @@ void InfluxDbAfterRequest(int expectedStatusCode, bool modifyLastConnStatus) { } IFDB._lastErrorResponse.trim(); // Remove trailing \n AddLog(LOG_LEVEL_INFO, PSTR("IFX: Error %s"), IFDB._lastErrorResponse.c_str()); + } else { + AddLog(IFDB.log_level, PSTR("IFX: Done")); } } @@ -196,6 +215,8 @@ bool InfluxDbValidateConnection(void) { return false; } // on version 1.x /ping will by default return status code 204, without verbose + if (!InfluxDbHostByName()) { return false; } + String url = IFDB._serverUrl + (2 == Settings->influxdb_version ? "/health" : "/ping?verbose=true"); if (1 == Settings->influxdb_version) { url += InfluxDbAuth(); @@ -433,7 +454,7 @@ void InfluxDbLoop(void) { #define D_CMND_INFLUXDBBUCKET "Bucket" #define D_CMND_INFLUXDBPERIOD "Period" #define D_CMND_INFLUXDBSENSOR "Sensor" -#define D_CMND_INFLUXDBRP "RP" +#define D_CMND_INFLUXDBRP "RP" const char kInfluxDbCommands[] PROGMEM = D_PRFX_INFLUXDB "|" // Prefix "|" D_CMND_INFLUXDBLOG "|" From 22abc8ad995e5c229b40c5ddf85d4db50038180b Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Sun, 21 May 2023 16:21:43 +0200 Subject: [PATCH 160/289] Fix ESP32 InfluxDb initial connection delays Fix ESP32 InfluxDb initial connection delays using HTTPClient (#18015) --- CHANGELOG.md | 4 +++ RELEASENOTES.md | 9 +++-- .../tasmota_xdrv_driver/xdrv_59_influxdb.ino | 36 ++++++++++++++----- 3 files changed, 38 insertions(+), 11 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5da7cffdb..a1d58851e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,15 +9,19 @@ All notable changes to this project will be documented in this file. - Command ``WifiPower 1`` to restore default wifi power - HASPmota `meta` attribute and improved `berry_run` + ### Breaking Changed ### Changed - InfluxDb resolves DNS name before request (#18015) +- Shutter sliders in WEBGUI automatically appear and disappear during configuration and update during movement (#18701) ### Fixed +- ESP32 InfluxDb initial connection delays using HTTPClient (#18015) - Shutter bootloop using more than 4 shutters (#18673) - AIThinker webcam issues (#18652) - Berry `tasmota.wifi()` would wrongly report wifi as up +- Inverted shutter now reflect status also in WEBGUI and several minor fixes to make "inverted" consistant (#18701) ### Removed diff --git a/RELEASENOTES.md b/RELEASENOTES.md index df671c5df..1cd4db65f 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -138,13 +138,16 @@ The latter links can be used for OTA upgrades too like ``OtaUrl https://ota.tasm - InfluxDb resolves DNS name before request [#18015](https://github.com/arendst/Tasmota/issues/18015) - Refactored Zero Cross Dimmer [#18481](https://github.com/arendst/Tasmota/issues/18481) - Energy power delta report delayed by two seconds allowing hardware to stabilize [#17751](https://github.com/arendst/Tasmota/issues/17751) +- Shutter sliders in WEBGUI automatically appear and disappear during configuration and update during movement [#18701](https://github.com/arendst/Tasmota/issues/18701) ### Fixed - ESP8266 Energy Export Active no update regression from v12.3.1.3 +- ESP32 InfluxDb initial connection delays using HTTPClient [#18015](https://github.com/arendst/Tasmota/issues/18015) - NovaSDS GUI values [#18444](https://github.com/arendst/Tasmota/issues/18444) - LED PWM ac_dimmer curve was wrongly applied instead of Gamma regression from v12.2.0.5 [#18666](https://github.com/arendst/Tasmota/issues/18666) -- Berry rules for string comparisons [#18464](https://github.com/arendst/Tasmota/issues/18464) -- Berry a rare condition when a GC causes a memory corruption - AIThinker webcam issues [#18652](https://github.com/arendst/Tasmota/issues/18652) - Shutter bootloop using more than 4 shutters [#18673](https://github.com/arendst/Tasmota/issues/18673) -- Partition_Manager.tapp +- Inverted shutter now reflect status also in WEBGUI and several minor fixes to make "inverted" consistant [#18701](https://github.com/arendst/Tasmota/issues/18701) +- Berry rules for string comparisons [#18464](https://github.com/arendst/Tasmota/issues/18464) +- Berry a rare condition when a GC causes a memory corruption +- ESP32 Partition_Manager.tapp diff --git a/tasmota/tasmota_xdrv_driver/xdrv_59_influxdb.ino b/tasmota/tasmota_xdrv_driver/xdrv_59_influxdb.ino index 2f97aa3db..7c1f45ed5 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_59_influxdb.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_59_influxdb.ino @@ -76,17 +76,18 @@ #ifndef INFLUXDB_RP #define INFLUXDB_RP "" // [IfxRP] Influxdb v1 retention policy (blank is default, usually autogen infinite) #endif -#ifndef INFLUXDB_CONNECT_TIMEOUT -#define INFLUXDB_CONNECT_TIMEOUT 2000 // Default timeout in milliseconds -#endif static const char UninitializedMessage[] PROGMEM = "Unconfigured instance"; // This cannot be put to PROGMEM due to the way how it is used static const char RetryAfter[] = "Retry-After"; static const char TransferEncoding[] = "Transfer-Encoding"; -WiFiClient *IFDBwifiClient = nullptr; -HTTPClient *IFDBhttpClient = nullptr; +#if defined(ESP32) && defined(USE_WEBCLIENT_HTTPS) + HTTPClientLight *IFDBhttpClient = nullptr; +#else + WiFiClient *IFDBwifiClient = nullptr; + HTTPClient *IFDBhttpClient = nullptr; +#endif struct { String _serverUrl; // Connection info @@ -159,14 +160,17 @@ bool InfluxDbParameterInit(void) { } bool InfluxDbInit(void) { +#if defined(ESP32) && defined(USE_WEBCLIENT_HTTPS) + if (!IFDBhttpClient) { + IFDBhttpClient = new HTTPClientLight; + } +#else IFDBwifiClient = new WiFiClient; if (!IFDBhttpClient) { IFDBhttpClient = new HTTPClient; } +#endif IFDBhttpClient->setReuse(IFDB._connectionReuse); -#ifdef ESP32 - IFDBhttpClient->setConnectTimeout(INFLUXDB_CONNECT_TIMEOUT); -#endif // ESP32 char server[32]; snprintf_P(server, sizeof(server), PSTR("Tasmota/%s (%s)"), TasmotaGlobal.version, GetDeviceHardware().c_str()); IFDBhttpClient->setUserAgent(server); @@ -209,7 +213,11 @@ void InfluxDbAfterRequest(int expectedStatusCode, bool modifyLastConnStatus) { } bool InfluxDbValidateConnection(void) { +#if defined(ESP32) && defined(USE_WEBCLIENT_HTTPS) + if (!InfluxDbInit()) { +#else if (!IFDBwifiClient && !InfluxDbInit()) { +#endif IFDB._lastStatusCode = 0; IFDB._lastErrorResponse = FPSTR(UninitializedMessage); return false; @@ -223,7 +231,11 @@ bool InfluxDbValidateConnection(void) { } AddLog(LOG_LEVEL_INFO, PSTR("IFX: Validating connection to %s"), url.c_str()); +#if defined(ESP32) && defined(USE_WEBCLIENT_HTTPS) + if (!IFDBhttpClient->begin(url)) { +#else // HTTP only if (!IFDBhttpClient->begin(*IFDBwifiClient, url)) { +#endif AddLog(LOG_LEVEL_DEBUG, PSTR("IFX: Begin failed")); return false; } @@ -238,13 +250,21 @@ bool InfluxDbValidateConnection(void) { } int InfluxDbPostData(const char *data) { +#if defined(ESP32) && defined(USE_WEBCLIENT_HTTPS) + if (!InfluxDbInit()) { +#else if (!IFDBwifiClient && !InfluxDbInit()) { +#endif IFDB._lastStatusCode = 0; IFDB._lastErrorResponse = FPSTR(UninitializedMessage); return 0; } if (data) { +#if defined(ESP32) && defined(USE_WEBCLIENT_HTTPS) + if (!IFDBhttpClient->begin(IFDB._writeUrl)) { +#else if (!IFDBhttpClient->begin(*IFDBwifiClient, IFDB._writeUrl)) { +#endif AddLog(LOG_LEVEL_DEBUG, PSTR("IFX: Begin failed")); return false; } From a39d1eee0e412d981da71854dcefda89c78b4b7e Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Sun, 21 May 2023 16:51:16 +0200 Subject: [PATCH 161/289] Rename HttpClientLight --- .../{Berry-HttpClientLight => HttpClientLight}/library.json | 2 +- .../src/HTTPUpdateLight.cpp | 0 .../src/HTTPUpdateLight.h | 0 .../src/HttpClientLight.cpp | 0 .../src/HttpClientLight.h | 0 .../{Berry-HttpClientLight => HttpClientLight}/src/TasUpdate.h | 0 .../src/TasUpdater.cpp | 0 7 files changed, 1 insertion(+), 1 deletion(-) rename lib/libesp32/{Berry-HttpClientLight => HttpClientLight}/library.json (90%) rename lib/libesp32/{Berry-HttpClientLight => HttpClientLight}/src/HTTPUpdateLight.cpp (100%) rename lib/libesp32/{Berry-HttpClientLight => HttpClientLight}/src/HTTPUpdateLight.h (100%) rename lib/libesp32/{Berry-HttpClientLight => HttpClientLight}/src/HttpClientLight.cpp (100%) rename lib/libesp32/{Berry-HttpClientLight => HttpClientLight}/src/HttpClientLight.h (100%) rename lib/libesp32/{Berry-HttpClientLight => HttpClientLight}/src/TasUpdate.h (100%) rename lib/libesp32/{Berry-HttpClientLight => HttpClientLight}/src/TasUpdater.cpp (100%) diff --git a/lib/libesp32/Berry-HttpClientLight/library.json b/lib/libesp32/HttpClientLight/library.json similarity index 90% rename from lib/libesp32/Berry-HttpClientLight/library.json rename to lib/libesp32/HttpClientLight/library.json index c9e5208f9..46522f90a 100644 --- a/lib/libesp32/Berry-HttpClientLight/library.json +++ b/lib/libesp32/HttpClientLight/library.json @@ -1,5 +1,5 @@ { - "name": "HttpClient light for Berry", + "name": "HttpClient light", "version": "1.0", "description": "Forked version of Arduino HttpClient to support BearSSL instead of mbedTLS", "license": "MIT", diff --git a/lib/libesp32/Berry-HttpClientLight/src/HTTPUpdateLight.cpp b/lib/libesp32/HttpClientLight/src/HTTPUpdateLight.cpp similarity index 100% rename from lib/libesp32/Berry-HttpClientLight/src/HTTPUpdateLight.cpp rename to lib/libesp32/HttpClientLight/src/HTTPUpdateLight.cpp diff --git a/lib/libesp32/Berry-HttpClientLight/src/HTTPUpdateLight.h b/lib/libesp32/HttpClientLight/src/HTTPUpdateLight.h similarity index 100% rename from lib/libesp32/Berry-HttpClientLight/src/HTTPUpdateLight.h rename to lib/libesp32/HttpClientLight/src/HTTPUpdateLight.h diff --git a/lib/libesp32/Berry-HttpClientLight/src/HttpClientLight.cpp b/lib/libesp32/HttpClientLight/src/HttpClientLight.cpp similarity index 100% rename from lib/libesp32/Berry-HttpClientLight/src/HttpClientLight.cpp rename to lib/libesp32/HttpClientLight/src/HttpClientLight.cpp diff --git a/lib/libesp32/Berry-HttpClientLight/src/HttpClientLight.h b/lib/libesp32/HttpClientLight/src/HttpClientLight.h similarity index 100% rename from lib/libesp32/Berry-HttpClientLight/src/HttpClientLight.h rename to lib/libesp32/HttpClientLight/src/HttpClientLight.h diff --git a/lib/libesp32/Berry-HttpClientLight/src/TasUpdate.h b/lib/libesp32/HttpClientLight/src/TasUpdate.h similarity index 100% rename from lib/libesp32/Berry-HttpClientLight/src/TasUpdate.h rename to lib/libesp32/HttpClientLight/src/TasUpdate.h diff --git a/lib/libesp32/Berry-HttpClientLight/src/TasUpdater.cpp b/lib/libesp32/HttpClientLight/src/TasUpdater.cpp similarity index 100% rename from lib/libesp32/Berry-HttpClientLight/src/TasUpdater.cpp rename to lib/libesp32/HttpClientLight/src/TasUpdater.cpp From 749f55283b388a4092cee7d24e42100e93400edb Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Mon, 22 May 2023 11:04:03 +0200 Subject: [PATCH 162/289] Try to dispatch workflow run in other repo --- .github/workflows/Tasmota_build_devel.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/.github/workflows/Tasmota_build_devel.yml b/.github/workflows/Tasmota_build_devel.yml index baea23718..12f5eb08e 100644 --- a/.github/workflows/Tasmota_build_devel.yml +++ b/.github/workflows/Tasmota_build_devel.yml @@ -324,3 +324,9 @@ jobs: destination_branch: 'action-development' user_email: 'github-actions@github.com' user_name: 'github-actions' + - name: Dispatch worflow in Jason2866/Tasmota-firmware + run: | + curl -X POST https://api.github.com/repos/Jason2866/Tasmota-firmware/dispatches \ + -H 'Accept: application/vnd.github.everest-preview+json' \ + -u ${{ secrets.API_TOKEN_GITHUB }} \ + --data '{"event_type": "Trigger Workflow", "client_payload": { "repository": "'"$GITHUB_REPOSITORY"'" }}' From 7c92a2186b1361b05dc232410e6e205dab1d4d78 Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Mon, 22 May 2023 11:25:11 +0200 Subject: [PATCH 163/289] set env for remote dispatch --- .github/workflows/Tasmota_build_devel.yml | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/.github/workflows/Tasmota_build_devel.yml b/.github/workflows/Tasmota_build_devel.yml index 12f5eb08e..a762fc5b7 100644 --- a/.github/workflows/Tasmota_build_devel.yml +++ b/.github/workflows/Tasmota_build_devel.yml @@ -2,7 +2,11 @@ name: Build_development on: - workflow_dispatch: # Manually start a workflow + workflow_dispatch: # Start a workflow + inputs: + Store_Tasmota_firmwares: # workflow name of the remote gh workflow + description: "Workflow Store_Tasmota_firmwares which will be triggered" + default: "Store_Tasmota_firmwares" push: branches: development paths-ignore: From 80afc8793f63cb4aa2e6e78727e1839c674d3c2b Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Mon, 22 May 2023 11:48:03 +0200 Subject: [PATCH 164/289] AdafruitFingerprint library from v2.0.4 to v2.1.0 AdafruitFingerprint library from v2.0.4 to v2.1.0 (#18163) --- CHANGELOG.md | 1 + RELEASENOTES.md | 1 + .../ZFM-20_Fingerprint_Module.pdf | Bin 2526320 -> 0 bytes .../.github/ISSUE_TEMPLATE.md | 0 .../.github/PULL_REQUEST_TEMPLATE.md | 0 .../.github/workflows/githubci.yml | 8 +- .../.gitignore | 0 .../Adafruit_Fingerprint.cpp | 62 +- .../Adafruit_Fingerprint.h | 40 +- .../README.md | 0 .../ZFM-20_Fingerprint_Module.pdf | 111072 +++++++++++++++ .../documentation/fingerprint_en.pdf | Bin .../documentation/readme.txt | 0 .../examples/Leo_passthru/.uno.test.skip | 0 .../examples/Leo_passthru/Leo_passthru.ino | 0 .../examples/blank/blank.ino | 0 .../changepassword/changepassword.ino | 0 .../examples/delete/delete.ino | 6 +- .../examples/emptyDatabase/emptyDatabase.ino | 0 .../examples/enroll/enroll.ino | 0 .../examples/fingerprint/fingerprint.ino | 0 .../examples/ledcontrol/ledcontrol.ino | 0 .../show_fingerprint_templates.ino | 70 +- .../library.properties | 2 +- .../license.txt | 0 tasmota/tasmota_xsns_sensor/xsns_79_as608.ino | 29 +- 26 files changed, 111244 insertions(+), 47 deletions(-) delete mode 100644 lib/lib_div/Adafruit-Fingerprint-Sensor-Library-2.0.4-Tasmota/documentation/ZFM-20_Fingerprint_Module.pdf rename lib/lib_div/{Adafruit-Fingerprint-Sensor-Library-2.0.4-Tasmota => Adafruit-Fingerprint-Sensor-Library-2.1.0-Tasmota}/.github/ISSUE_TEMPLATE.md (100%) rename lib/lib_div/{Adafruit-Fingerprint-Sensor-Library-2.0.4-Tasmota => Adafruit-Fingerprint-Sensor-Library-2.1.0-Tasmota}/.github/PULL_REQUEST_TEMPLATE.md (100%) rename lib/lib_div/{Adafruit-Fingerprint-Sensor-Library-2.0.4-Tasmota => Adafruit-Fingerprint-Sensor-Library-2.1.0-Tasmota}/.github/workflows/githubci.yml (75%) rename lib/lib_div/{Adafruit-Fingerprint-Sensor-Library-2.0.4-Tasmota => Adafruit-Fingerprint-Sensor-Library-2.1.0-Tasmota}/.gitignore (100%) rename lib/lib_div/{Adafruit-Fingerprint-Sensor-Library-2.0.4-Tasmota => Adafruit-Fingerprint-Sensor-Library-2.1.0-Tasmota}/Adafruit_Fingerprint.cpp (89%) rename lib/lib_div/{Adafruit-Fingerprint-Sensor-Library-2.0.4-Tasmota => Adafruit-Fingerprint-Sensor-Library-2.1.0-Tasmota}/Adafruit_Fingerprint.h (80%) rename lib/lib_div/{Adafruit-Fingerprint-Sensor-Library-2.0.4-Tasmota => Adafruit-Fingerprint-Sensor-Library-2.1.0-Tasmota}/README.md (100%) create mode 100644 lib/lib_div/Adafruit-Fingerprint-Sensor-Library-2.1.0-Tasmota/documentation/ZFM-20_Fingerprint_Module.pdf rename lib/lib_div/{Adafruit-Fingerprint-Sensor-Library-2.0.4-Tasmota => Adafruit-Fingerprint-Sensor-Library-2.1.0-Tasmota}/documentation/fingerprint_en.pdf (100%) rename lib/lib_div/{Adafruit-Fingerprint-Sensor-Library-2.0.4-Tasmota => Adafruit-Fingerprint-Sensor-Library-2.1.0-Tasmota}/documentation/readme.txt (100%) rename lib/lib_div/{Adafruit-Fingerprint-Sensor-Library-2.0.4-Tasmota => Adafruit-Fingerprint-Sensor-Library-2.1.0-Tasmota}/examples/Leo_passthru/.uno.test.skip (100%) rename lib/lib_div/{Adafruit-Fingerprint-Sensor-Library-2.0.4-Tasmota => Adafruit-Fingerprint-Sensor-Library-2.1.0-Tasmota}/examples/Leo_passthru/Leo_passthru.ino (100%) rename lib/lib_div/{Adafruit-Fingerprint-Sensor-Library-2.0.4-Tasmota => Adafruit-Fingerprint-Sensor-Library-2.1.0-Tasmota}/examples/blank/blank.ino (100%) rename lib/lib_div/{Adafruit-Fingerprint-Sensor-Library-2.0.4-Tasmota => Adafruit-Fingerprint-Sensor-Library-2.1.0-Tasmota}/examples/changepassword/changepassword.ino (100%) rename lib/lib_div/{Adafruit-Fingerprint-Sensor-Library-2.0.4-Tasmota => Adafruit-Fingerprint-Sensor-Library-2.1.0-Tasmota}/examples/delete/delete.ino (97%) rename lib/lib_div/{Adafruit-Fingerprint-Sensor-Library-2.0.4-Tasmota => Adafruit-Fingerprint-Sensor-Library-2.1.0-Tasmota}/examples/emptyDatabase/emptyDatabase.ino (100%) rename lib/lib_div/{Adafruit-Fingerprint-Sensor-Library-2.0.4-Tasmota => Adafruit-Fingerprint-Sensor-Library-2.1.0-Tasmota}/examples/enroll/enroll.ino (100%) rename lib/lib_div/{Adafruit-Fingerprint-Sensor-Library-2.0.4-Tasmota => Adafruit-Fingerprint-Sensor-Library-2.1.0-Tasmota}/examples/fingerprint/fingerprint.ino (100%) rename lib/lib_div/{Adafruit-Fingerprint-Sensor-Library-2.0.4-Tasmota => Adafruit-Fingerprint-Sensor-Library-2.1.0-Tasmota}/examples/ledcontrol/ledcontrol.ino (100%) rename lib/lib_div/{Adafruit-Fingerprint-Sensor-Library-2.0.4-Tasmota => Adafruit-Fingerprint-Sensor-Library-2.1.0-Tasmota}/examples/show_fingerprint_templates/show_fingerprint_templates.ino (75%) rename lib/lib_div/{Adafruit-Fingerprint-Sensor-Library-2.0.4-Tasmota => Adafruit-Fingerprint-Sensor-Library-2.1.0-Tasmota}/library.properties (96%) rename lib/lib_div/{Adafruit-Fingerprint-Sensor-Library-2.0.4-Tasmota => Adafruit-Fingerprint-Sensor-Library-2.1.0-Tasmota}/license.txt (100%) diff --git a/CHANGELOG.md b/CHANGELOG.md index a1d58851e..b861d94d1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,6 +15,7 @@ All notable changes to this project will be documented in this file. ### Changed - InfluxDb resolves DNS name before request (#18015) - Shutter sliders in WEBGUI automatically appear and disappear during configuration and update during movement (#18701) +- AdafruitFingerprint library from v2.0.4 to v2.1.0 ### Fixed - ESP32 InfluxDb initial connection delays using HTTPClient (#18015) diff --git a/RELEASENOTES.md b/RELEASENOTES.md index 1cd4db65f..d0378915d 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -133,6 +133,7 @@ The latter links can be used for OTA upgrades too like ``OtaUrl https://ota.tasm - Change command ``FileUpload`` index binary data detection from >199 to >299 ### Changed +- AdafruitFingerprint library from v2.0.4 to v2.1.0 - IRremoteESP8266 library from v2.8.4 to v2.8.5 - ESP32 Framework (Core) from v2.0.7 to v2.0.9 - InfluxDb resolves DNS name before request [#18015](https://github.com/arendst/Tasmota/issues/18015) diff --git a/lib/lib_div/Adafruit-Fingerprint-Sensor-Library-2.0.4-Tasmota/documentation/ZFM-20_Fingerprint_Module.pdf b/lib/lib_div/Adafruit-Fingerprint-Sensor-Library-2.0.4-Tasmota/documentation/ZFM-20_Fingerprint_Module.pdf deleted file mode 100644 index d732b828057679f0441c86a14c25b6b3464a6325..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2526320 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

VKXO<< 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

(-J>91>C= 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 z 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≪5v;J* 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

"; + static char res[64]; // static to allow returning to Berry + char unit; + uint32_t color; // color of text + + if (seconds < 0) { return empty_resp; } // no value + + uint32_t val = matter_convert_seconds_to_dhm(seconds, &unit, &color, bfalse); + if (val < 100) { + snprintf(res, sizeof(res), "", + (color & 0xFF0000) >> 16, (color & 0x00FF00) >> 8, (color & 0x0000FF), + val, unit); + } else { + return empty_resp; + } + return res; +} +BE_FUNC_CTYPE_DECLARE(matter_seconds_to_dhm, "s", "i") + extern const bclass be_class_Matter_Counter; extern const bclass be_class_Matter_Verhoeff; extern const bclass be_class_Matter_QRCode; @@ -171,6 +204,15 @@ extern const bclass be_class_Matter_TLV; // need to declare it upfront because #include "solidify/solidified_Matter_Plugin_Sensor_Humidity.h" #include "solidify/solidified_Matter_Plugin_Bridge_HTTP.h" #include "solidify/solidified_Matter_Plugin_Bridge_OnOff.h" +#include "solidify/solidified_Matter_Plugin_Bridge_Light0.h" +#include "solidify/solidified_Matter_Plugin_Bridge_Light1.h" +#include "solidify/solidified_Matter_Plugin_Bridge_Light2.h" +#include "solidify/solidified_Matter_Plugin_Bridge_Light3.h" +#include "solidify/solidified_Matter_Plugin_Bridge_Sensor.h" +#include "solidify/solidified_Matter_Plugin_Bridge_Sensor_Pressure.h" +#include "solidify/solidified_Matter_Plugin_Bridge_Sensor_Temp.h" +#include "solidify/solidified_Matter_Plugin_Bridge_Sensor_Illuminance.h" +#include "solidify/solidified_Matter_Plugin_Bridge_Sensor_Humidity.h" /*********************************************************************************************\ * Get a bytes() object of the certificate DAC/PAI_Cert @@ -198,7 +240,9 @@ static int matter_CD_FFF1_8000(bvm *vm) { return matter_return_static_bytes(vm, module matter (scope: global, strings: weak) { _LOGO, comptr(MATTER_LOGO) + _STYLESHEET, comptr(MATTER_STYLESHEET) MATTER_OPTION, int(151) // SetOption151 enables Matter + seconds_to_dhm, ctype_func(matter_seconds_to_dhm) Verhoeff, class(be_class_Matter_Verhoeff) Counter, class(be_class_Matter_Counter) @@ -214,6 +258,7 @@ module matter (scope: global, strings: weak) { get_opcode_name, ctype_func(matter_get_opcode_name) TLV, class(be_class_Matter_TLV) sort, closure(matter_sort_closure) + jitter, closure(matter_jitter_closure) inspect, closure(matter_inspect_closure) // Status codes @@ -356,6 +401,15 @@ module matter (scope: global, strings: weak) { Plugin_Sensor_Humidity, class(be_class_Matter_Plugin_Sensor_Humidity) // Humidity Sensor Plugin_Bridge_HTTP, class(be_class_Matter_Plugin_Bridge_HTTP) // HTTP bridge superclass Plugin_Bridge_OnOff, class(be_class_Matter_Plugin_Bridge_OnOff) // HTTP Relay/Light behavior (OnOff) + Plugin_Bridge_Light0, class(be_class_Matter_Plugin_Bridge_Light0) // HTTP OnOff Light + Plugin_Bridge_Light1, class(be_class_Matter_Plugin_Bridge_Light1) // HTTP Dimmer Light + Plugin_Bridge_Light2, class(be_class_Matter_Plugin_Bridge_Light2) // HTTP CT Light + Plugin_Bridge_Light3, class(be_class_Matter_Plugin_Bridge_Light3) // HTTP RGB Light + Plugin_Bridge_Sensor, class(be_class_Matter_Plugin_Bridge_Sensor) // HTTP generic sensor + Plugin_Bridge_Sensor_Pressure, class(be_class_Matter_Plugin_Bridge_Sensor_Pressure) // HTTP Pressure sensor + Plugin_Bridge_Sensor_Temp, class(be_class_Matter_Plugin_Bridge_Sensor_Temp) // HTTP Temperature sensor + Plugin_Bridge_Sensor_Illuminance, class(be_class_Matter_Plugin_Bridge_Sensor_Illuminance) // HTTP Illuminance sensor + Plugin_Bridge_Sensor_Humidity, class(be_class_Matter_Plugin_Bridge_Sensor_Humidity) // HTTP Humidity sensor } @const_object_info_end */ diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Commissioning.be b/lib/libesp32/berry_matter/src/embedded/Matter_Commissioning.be index 82dbfbc06..2231d7960 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Commissioning.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Commissioning.be @@ -59,7 +59,7 @@ class Matter_Commisioning_Context return false end - tasmota.log("MTR: received message " + matter.inspect(msg), 3) + tasmota.log("MTR: received message " + matter.inspect(msg), 4) if msg.opcode == 0x10 # don't need to do anything, the message is acked already before this call elif msg.opcode == 0x20 diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Device.be b/lib/libesp32/berry_matter/src/embedded/Matter_Device.be index a9b9aaf12..489dd33b2 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Device.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Device.be @@ -54,6 +54,8 @@ class Matter_Device # mDNS active announces var mdns_pase_eth # do we have an active PASE mDNS announce for eth var mdns_pase_wifi # do we have an active PASE mDNS announce for wifi + # for brige mode, list of HTTP_remote objects (only one instance per remote object) + var http_remotes # map of 'domain:port' or `nil` if no bridge # saved in parameters var root_discriminator # as `int` var root_passcode # as `int` @@ -1212,6 +1214,28 @@ class Matter_Device end end + ##################################################################### + # Manager HTTP remotes + ##################################################################### + # register new http remote + # + # If already registered, return current instance and check timeout + def register_http_remote(addr, timeout) + if self.http_remotes == nil self.http_remotes = {} end # lazy initialization + var http_remote + + if self.http_remotes.contains(addr) + http_remote = self.http_remotes[addr] + if timeout < http_remote.get_timeout() + http_remote.set_timeout(timeout) # reduce timeout if new value is shorter + end + else + http_remote = matter.HTTP_remote(addr, timeout) + self.http_remotes[addr] = http_remote + end + return http_remote + end + ##################################################################### # Commands `Mtr___` ##################################################################### diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_HTTP_async.be b/lib/libesp32/berry_matter/src/embedded/Matter_HTTP_async.be index acc87b348..df3989169 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_HTTP_async.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_HTTP_async.be @@ -42,7 +42,7 @@ class Matter_HTTP_async : Matter_TCP_async var chunk_size # nil or int, size of the current chunk static var HTTP_GET = "GET %s HTTP/1.1\r\nHost %s:%s\r\nConnection: close\r\n\r\n" # see https://stackoverflow.com/questions/6686261/what-at-the-bare-minimum-is-required-for-an-http-request - static var HTTP_STATUS_REGEX = "HTTP/1\\.[1-2] (\\d+) .*?\r\n" # extract stattus code from first line + static var HTTP_STATUS_REGEX = "HTTP/1\\.[0-1] (\\d+) .*?\r\n" # extract stattus code from first line static var HTTP_HEADER_REGEX = "([A-Za-z0-9-]+): (.*?)\r\n" # extract a header with its 2 parts static var HTTP_BODY_REGEX = "\r\n" # end of headers static var HTTP_CHUNK_REGEX = "\r\n([A-Fa-f0-9]+)[ \t]*.*?\r\n" # extract the length of a chunk @@ -250,7 +250,6 @@ class Matter_HTTP_async : Matter_TCP_async end var req = string.format(self.HTTP_GET, self.cmd, addr, self.port) - #print("sending ", req) var ret = self.write(req) if ret != size(req) # print("Could not send","size=",size(req),"ret=",ret) diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_HTTP_remote.be b/lib/libesp32/berry_matter/src/embedded/Matter_HTTP_remote.be index 0106ead33..a0a86367f 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_HTTP_remote.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_HTTP_remote.be @@ -22,29 +22,107 @@ # dummy declaration for solidification class Matter_HTTP_async end -class Matter_HTTP_remote : Matter_HTTP_async - var cb # call cb(http_status, payload) +############################################################# +# This class has the following purposes: +# +# 1. Have multiple classes registered for async requests +# and dispatch to all instances results calling `cb(status, payload, index)` +# Async requests are currently only `Status ` requests +# and are dispatched with the `` index +# +# 2. Implement rate limiting when sending async `Status ` +# requests to align with the lowest cycle time. +# I.e. if plugin sends every 2 seconds and another every 3 seconds +# we only send every 2 seconds and dispatch results to all plugins. +class Matter_HTTP_remote : Matter_HTTP_async + var probe_update_time_map # number of milliseconds to wait for each async command (map) + var probe_next_timestamp_map # timestamp for last probe (in millis()) for each `Status ` + # if timestamp is `0`, this should be scheduled in priority + var async_cb_map # list of callbacks to call with `cb(http_status, payload)` + + # information about current async command in-flight + var current_cmd # current async command + # `nil` if current request is synchronous + var reachable # is the device reachable + var reachable_utc # last tick when the reachability was seen (avoids sending superfluous ping commands) + + ############################################################# # init - def init(addr, port, timeout, fastloop) - super(self).init(addr, port, timeout, fastloop) - end - - def set_cb(cb) - self.cb = cb + def init(addr, timeout, fastloop) + self.probe_update_time_map = {} + self.probe_next_timestamp_map = {} + self.async_cb_map = {} + self.current_cmd = nil + self.reachable = false # force a valid bool value + super(self).init(addr, 80, timeout, fastloop) end ############################################################# - # begin + # device is alive, update reachable_utc + def device_is_alive(alive) + if alive + # device is known to be reachable + self.reachable = true + self.reachable_utc = tasmota.rtc()['utc'] + else + self.reachable = false + end + end + + ############################################################# + # Add an async command to scheduler # - # returns true if everything is ok, and connection started - # returns false if DNS failed - # returns nil if no network - def begin(cmd) + # cmd: the Tasmota command as string + # update_time: recurrence in ms (min time of all updates) + # cb: callback to this command (optional) + def add_schedule(cmd, update_time, cb) + if !self.probe_update_time_map.contains(cmd) || update_time < self.probe_update_time_map[cmd] + # if cmd is not already registered, or if the update_time needs to be reduced + self.probe_update_time_map[cmd] = update_time + self.probe_next_timestamp_map[cmd] = matter.jitter(update_time) + end + + # do we add a cb? + if cb != nil + self.add_async_cb(cb, cmd) + end + end + + ############################################################# + # Add a callback to be called for a specific `cmd` or `nil` for all commands + def add_async_cb(cb, cmd) + self.async_cb_map[cb] = cmd + end + + ############################################################# + # Send event to all registered cb + # + def dispatch_cb(status, payload) + var idx = 0 + for cb: self.async_cb_map.keys() + var cmd_filter = self.async_cb_map[cb] + if cmd_filter == self.current_cmd || cmd_filter == nil # match command or match any + cb(status, payload, self.current_cmd) # call cb + end + end + end + + ############################################################# + # probe_async + # + # Sends a command like `Status ` asynchronously to get device status. + # Implement rate limiting for devices with multiple sub-devices + def probe_async(cmd) import string - tasmota.log(string.format("MTR: HTTP async request 'http://%s:%i%s'", self.addr, self.port, cmd), 3) - return super(self).begin(cmd) + import webserver + if !tasmota.wifi()['up'] && !tasmota.eth()['up'] return nil end # no network + + self.current_cmd = cmd + var cmd_url = "/cm?cmnd=" + string.tr(cmd, ' ', '+') + tasmota.log(string.format("MTR: HTTP async request 'http://%s:%i%s'", self.addr, self.port, cmd_url), 3) + var ret = self.begin(cmd_url) end ############################################################# @@ -54,34 +132,91 @@ class Matter_HTTP_remote : Matter_HTTP_async # # returns nil if something went wrong # returns the payload as string - def begin_sync(cmd, timeout) + # Note: sync request aborts any ongoing async request + def call_sync(cmd, timeout) import string - tasmota.log(string.format("MTR: HTTP sync request 'http://%s:%i%s'", self.addr, self.port, cmd), 3) - return super(self).begin_sync(cmd, timeout) + import webserver + if !tasmota.wifi()['up'] && !tasmota.eth()['up'] return nil end # no network + + self.current_cmd = nil + var cmd_url = "/cm?cmnd=" + string.tr(cmd, ' ', '+') + tasmota.log(string.format("MTR: HTTP sync request 'http://%s:%i%s'", self.addr, self.port, cmd_url), 2) + var ret = super(self).begin_sync(cmd_url, timeout) + var payload_short = (ret) ? ret : 'nil' + if size(payload_short) > 30 payload_short = payload_short[0..29] + '...' end + tasmota.log(string.format("MTR: HTTP sync-resp in %i ms from %s: [%i] '%s'", tasmota.millis() - self.time_start, self.addr, size(self.payload), payload_short), 2) + return ret end def event_http_finished() + if self.current_cmd == nil return end # do nothing if sync request import string var payload_short = (self.payload != nil) ? self.payload : 'nil' if size(payload_short) > 30 payload_short = payload_short[0..29] + '...' end - tasmota.log(string.format("MTR: HTTP response in %i ms: '%s'", tasmota.millis() - self.time_start, payload_short), 3) - - if self.cb - self.cb(self.http_status, self.payload) - end + tasmota.log(string.format("MTR: HTTP async-resp in %i ms from %s: [%i] '%s'", tasmota.millis() - self.time_start, self.addr, size(self.payload), payload_short), 2) + self.dispatch_cb(self.http_status, self.payload) end def event_http_failed() + if self.current_cmd == nil return end # do nothing if sync request tasmota.log("MTR: HTTP failed", 3) - if self.cb - self.cb(self.http_status, nil) - end + self.dispatch_cb(self.http_status, nil) end def event_http_timeout() - tasmota.log("MTR: HTTP timeout", 3) - if self.cb - self.cb(self.http_status, nil) - end + import string + if self.current_cmd == nil return end # do nothing if sync request + tasmota.log(string.format("MTR: HTTP timeout http_status=%i phase=%i tcp_status=%i size_payload=%i", self.http_status, self.phase, self.status, size(self.payload)), 2) + self.dispatch_cb(self.http_status, nil) end + ############################################################# + # scheduler + # + # check if the timer expired and update_shadow() needs to be called + def scheduler() + var cmd = nil # keep trakck of command + for k: self.probe_next_timestamp_map.keys() + if self.probe_next_timestamp_map[k] == 0 + cmd = k # schedule in priority + break + end + end + + if cmd == nil # if no priotity, find first eligible + for k: self.probe_next_timestamp_map.keys() + if tasmota.time_reached(self.probe_next_timestamp_map[k]) + cmd = k + break + end + end + end + + if cmd == nil return end # nothing to do + + if self.tcp_connected # we have already an async request in-flight + self.probe_next_timestamp_map[cmd] = 0 # mark as priority scheduling for near future + return + end + + # set new next timestamp + self.probe_next_timestamp_map[cmd] = tasmota.millis(self.probe_update_time_map[cmd]) # add update_time for command + + # trigger the command + self.probe_async(cmd) + end + + ############################################################# + # web_last_seen + # + # Show when the device was last seen + def web_last_seen() + import webserver + import string + + var seconds = -1 # default if no known value + if self.reachable_utc != nil + seconds = tasmota.rtc()['utc'] - self.reachable_utc + end + return matter.seconds_to_dhm(seconds) + end end matter.HTTP_remote = Matter_HTTP_remote diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin.be index 58fc1397a..6d4cd1041 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin.be @@ -58,20 +58,6 @@ class Matter_Plugin self.clusters = self.consolidate_clusters() end - ############################################################# - # return the map of all types - def get_types() - return self.TYPES - end - - ############################################################# - # Stub for updating shadow values (local copies of what we published to the Matter gateway) - # - # TO BE OVERRIDDEN - # This call is synnchronous and blocking. - def parse_update(data) - end - ############################################################# # Stub for updating shadow values (local copies of what we published to the Matter gateway) # @@ -82,7 +68,6 @@ class Matter_Plugin # This call is synnchronous and blocking. def update_shadow() self.tick = self.device.tick - self.parse_update(nil) end ############################################################# @@ -96,16 +81,6 @@ class Matter_Plugin end end - ############################################################# - # probe_shadow_async - # - # TO BE OVERRIDDEN - DON'T CALL SUPER - default is just calling `update_shadow()` - # This is called on a regular basis, depending on the type of plugin. - # Whenever the data is returned, call `parse_update()` to update values - def probe_shadow_async() - self.update_shadow() - end - ############################################################# # signal that an attribute has been changed # @@ -178,7 +153,7 @@ class Matter_Plugin if attribute == 0x0000 # ---------- DeviceTypeList / list[DeviceTypeStruct] ---------- var dtl = TLV.Matter_TLV_array() - var types = self.get_types() + var types = self.TYPES for dt: types.keys() var d1 = dtl.add_struct() d1.add_TLV(0, TLV.U2, dt) # DeviceType @@ -272,14 +247,11 @@ class Matter_Plugin # check if the timer expired and update_shadow() needs to be called def every_250ms() if self.update_next == nil - # initialization to a random value within range - import crypto - var rand31 = crypto.random(4).get(0,4) & 0x7FFFFFFF # random int over 31 bits - self.update_next = tasmota.millis(rand31 % self.UPDATE_TIME) + self.update_next = matter.jitter(self.UPDATE_TIME) else if tasmota.time_reached(self.update_next) if self.tick != self.device.tick - self.probe_shadow_async() # call update_shadow if not already called + self.update_shadow() # call update_shadow if not already called end self.update_next = tasmota.millis(self.UPDATE_TIME) # rearm timer end diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_HTTP.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_HTTP.be index d03ebe5d5..ca96619f5 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_HTTP.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_HTTP.be @@ -30,7 +30,8 @@ class Matter_Plugin_Bridge_HTTP : Matter_Plugin_Device static var ARG = "" # additional argument name (or empty if none) static var ARG_HTTP = "url" # domain name static var UPDATE_TIME = 3000 # update every 3s - static var PROBE_TIMEOUT = 700 # timeout of 700 ms for probing + static var UPDATE_CMD = "Status 11" # command to send for updates + static var PROBE_TIMEOUT = 1700 # timeout of 1800 ms for probing, which gives at least 1s for TCP recovery static var SYNC_TIMEOUT = 500 # timeout of 700 ms for probing static var CLUSTERS = { # 0x001D: inherited # Descriptor Cluster 9.5 p.453 @@ -45,14 +46,7 @@ class Matter_Plugin_Bridge_HTTP : Matter_Plugin_Device } # static var TYPES = { 0x010A: 2 } # On/Off Light - var reachable # is the device reachable - var reachable_tick # last tick when the reachability was seen (avoids sending superfluous ping commands) - - var http_shadow_map # map of shadows - # : map from json - memorize the result from `Status `` - # each contain a `_tick` attribute to known when they were last loaded var http_remote # instance of Matter_HTTP_remote - var next_probe_timestamp # timestamp for next probe (in millis()) ############################################################# # Constructor @@ -61,60 +55,63 @@ class Matter_Plugin_Bridge_HTTP : Matter_Plugin_Device super(self).init(device, endpoint, arguments) var addr = arguments.find(self.ARG_HTTP) - self.http_shadow_map = {} - self.reachable = false # force a valid bool value - self.next_probe_timestamp = nil - self.http_remote = matter.HTTP_remote(addr, 80, self.PROBE_TIMEOUT) - self.http_remote.set_cb(/s,p-> self.parse_http_response(s, p)) + self.http_remote = self.device.register_http_remote(addr, self.PROBE_TIMEOUT) + self.register_cmd_cb() end ############################################################# - # return the map of all types, add the bridged type - def get_types() - var types = {} - for k: self.TYPES.keys() - types[k] = self.TYPES[k] - end - # Add Bridged Node - types[0x0013] = 1 # Bridged Node, v1 - return types - end - - ############################################################# - # call_remote_async + # register_cmd_cb # - # Call a remote Tasmota device, returns nothing, callback is called when data arrives - def call_remote_async(cmd, arg) - import string - if !tasmota.wifi()['up'] && !tasmota.eth()['up'] return nil end # no network + # Register recurrent command and callback + # Defined as a separate method to allow override + def register_cmd_cb() + self.http_remote.add_schedule(self.UPDATE_CMD, self.UPDATE_TIME, + / status,payload,cmd -> self.parse_http_response(status,payload,cmd)) + end - var url = string.format("/cm?cmnd=%s%%20%s", cmd, arg ? arg : '') - var ret = self.http_remote.begin(url, self.PROBE_TIMEOUT) + ############################################################# + # Stub for updating shadow values (local copies of what we published to the Matter gateway) + # + # This method should collect the data from the local or remote device + # and call `parse_update()` when data is available. + def update_shadow() + self.tick = self.device.tick + var ret = self.call_remote_sync(self.UPDATE_CMD) + if ret + self.parse_http_response(1, ret, self.UPDATE_CMD) end + end + + ############################################################# + # Stub for updating shadow values (local copies of what we published to the Matter gateway) + # + # TO BE OVERRIDDEN + def parse_update(data, index) + end ############################################################# # call_remote_sync # # Call a remote Tasmota device, returns Berry native map or nil + # arg can be nil, in this case `cmd` has it all def call_remote_sync(cmd, arg) # if !self.http_remote return nil end import string - if !tasmota.wifi()['up'] && !tasmota.eth()['up'] return nil end # no network + import json var retry = 2 # try 2 times if first failed - var url = string.format("/cm?cmnd=%s%%20%s", cmd, arg ? arg : '') + if arg != nil cmd = cmd + ' ' + str(arg) end while retry > 0 - var ret = self.http_remote.begin_sync(url, self.SYNC_TIMEOUT) + var ret = self.http_remote.call_sync(cmd, self.SYNC_TIMEOUT) if ret != nil - # device is known to be reachable - self.reachable = true - self.reachable_tick = self.device.tick - return ret + self.http_remote.device_is_alive(true) + var j = json.load(ret) + return j end retry -= 1 tasmota.log("MTR: HTTP GET retrying", 3) end - self.reachable = false + self.http_remote.device_is_alive(false) return nil end @@ -126,12 +123,11 @@ class Matter_Plugin_Bridge_HTTP : Matter_Plugin_Device # `Status 8`: {"StatusSNS":{ [...] }} # `Status 11`: {"StatusSTS":{ [...] }} # `Status 13`: {"StatusSHT":{ [...] }} - def parse_http_response(status, payload) + def parse_http_response(status, payload, cmd) if status > 0 # device is known to be reachable - self.reachable = true + self.http_remote.device_is_alive(true) var tick = self.device.tick - self.reachable_tick = tick import json var j = json.load(payload) @@ -148,54 +144,24 @@ class Matter_Plugin_Bridge_HTTP : Matter_Plugin_Device j = j["StatusSTS"] code = 13 end - - if code != nil - j['_tick'] = tick - self.http_shadow_map[code] = j - end # convert to shadow values self.parse_update(j, code) # call parser end end end - ############################################################# - # is_reachable() - # - # Pings the device and checks if it's reachable - def is_reachable_sync() - if self.device.tick != self.reachable_tick - var ret = self.call_remote_sync("", "") # empty command works as a ping - self.reachable = (ret != nil) - # self.reachable_tick = cur_tick # done by caller - end - return self.reachable - end - - ############################################################# - # get_remote_status_sync() - # - # Get remote `Status ` values of sensors, sync and blocking - def get_remote_status_lazy(x, sync) - var cur_tick = self.device.tick - var shadow_x = self.http_shadow_map.find(x) - if shadow_x - if shadow_x.find('_tick') == cur_tick - return shadow_x # we have already updated in this tick - end - end - return self.call_remote_sync("Status", str(x)) - end - - ############################################################# - # probe_shadow_async - # - # ### TO BE OVERRIDDEN - DON'T CALL SUPER - default is just calling `update_shadow()` - # This is called on a regular basis, depending on the type of plugin. - # Whenever the data is returned, call `update_shadow()` to update values - def probe_shadow_async() - # self.call_remote_async(, ) - end + # ############################################################# + # # is_reachable() + # # + # # Pings the device and checks if it's reachable + # def is_reachable_lazy_sync() + # var cur_tick = self.device.tick + # if cur_tick != self.tick + # var ret = self.call_remote_sync("", "") # empty command works as a ping + # self.http_remote.device_is_alive(ret != nil) + # end + # return self.http_remote.reachable + # end ############################################################# # read attribute @@ -211,7 +177,8 @@ class Matter_Plugin_Bridge_HTTP : Matter_Plugin_Device if attribute == 0x0000 # ---------- DataModelRevision / CommissioningWindowStatus ---------- # return TLV.create_TLV(TLV.U2, 1) elif attribute == 0x0011 # ---------- Reachable / bool ---------- - return TLV.create_TLV(TLV.BOOL, self.reachable) # TODO find a way to do a ping + # self.is_reachable_lazy_sync() # Not needed anymore + return TLV.create_TLV(TLV.BOOL, self.http_remote.reachable) # TODO find a way to do a ping end else @@ -219,6 +186,15 @@ class Matter_Plugin_Bridge_HTTP : Matter_Plugin_Device end end + ############################################################# + # every_250ms + # + # check if the timer expired and update_shadow() needs to be called + def every_250ms() + self.http_remote.scheduler() # defer to HTTP scheduler + # avoid calling update_shadow() since it's not applicable for HTTP remote + end + ############################################################# # UI Methods ############################################################# @@ -247,5 +223,14 @@ class Matter_Plugin_Bridge_HTTP : Matter_Plugin_Device return conf end + ############################################################# + # web_values + # + # Show values of the remote device as HTML + def web_values() + import webserver + webserver.content_send("| <-- (" + self.NAME + ") -->") + end + end matter.Plugin_Bridge_HTTP = Matter_Plugin_Bridge_HTTP diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Light0.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Light0.be new file mode 100644 index 000000000..c601a17df --- /dev/null +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Light0.be @@ -0,0 +1,155 @@ +# +# Matter_Plugin_Bridge_Light0.be - implements the behavior for a remote generic Lighting (OnOff only) via HTTP +# +# Copyright (C) 2023 Stephan Hadinger & Theo Arends +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +# + +# Matter plug-in for core behavior + +# dummy declaration for solidification +class Matter_Plugin_Bridge_HTTP end + +#@ solidify:Matter_Plugin_Bridge_Light0,weak + +class Matter_Plugin_Bridge_Light0 : Matter_Plugin_Bridge_HTTP + static var TYPE = "http_light0" # name of the plug-in in json + static var NAME = "🔗 Light 0 On" # display name of the plug-in + static var ARG = "relay" # additional argument name (or empty if none) + static var ARG_TYPE = / x -> int(x) # function to convert argument to the right type + # static var UPDATE_TIME = 3000 # update every 3s + # static var UPDATE_CMD = "Status 11" # command to send for updates + static var CLUSTERS = { + # 0x001D: inherited # Descriptor Cluster 9.5 p.453 + # 0x0003: inherited # Identify 1.2 p.16 + # 0x0004: inherited # Groups 1.3 p.21 + # 0x0005: inherited # Scenes 1.4 p.30 - no writable + 0x0006: [0,0xFFFC,0xFFFD], # On/Off 1.5 p.48 + } + static var TYPES = { 0x0100: 2, 0x0013: 1 } # OnOff Light, but not actually used because Relay is managed by OnOff + + var tasmota_relay_index # Relay number in Tasmota (one based) + var shadow_onoff # fake status for now # TODO + + ############################################################# + # Constructor + def init(device, endpoint, arguments) + super(self).init(device, endpoint, arguments) + self.shadow_onoff = false + self.tasmota_relay_index = int(arguments.find(self.ARG #-'relay'-#, 1)) + if self.tasmota_relay_index <= 0 self.tasmota_relay_index = 1 end + end + + ############################################################# + # Stub for updating shadow values (local copies of what we published to the Matter gateway) + # + # This call is synnchronous and blocking. + def parse_update(data, index) + if index == 11 # Status 11 + var state = false + + if self.tasmota_relay_index == 1 && data.contains("POWER") # special case, can be `POWER` or `POWER1` + state = (data.find("POWER") == "ON") + else + state = (data.find("POWER" + str(self.tasmota_relay_index)) == "ON") + end + + if self.shadow_onoff != nil && self.shadow_onoff != bool(state) + self.attribute_updated(0x0006, 0x0000) + end + self.shadow_onoff = state + end + end + + ############################################################# + # Model + # + def set_onoff(v) + var ret = self.call_remote_sync("Power" + str(self.tasmota_relay_index), v ? "1" : "0") + if ret != nil + self.parse_update(ret, 11) # update shadow from return value + end + end + + ############################################################# + # read an attribute + # + def read_attribute(session, ctx) + import string + var TLV = matter.TLV + var cluster = ctx.cluster + var attribute = ctx.attribute + + # ==================================================================================================== + if cluster == 0x0006 # ========== On/Off 1.5 p.48 ========== + self.update_shadow_lazy() + if attribute == 0x0000 # ---------- OnOff / bool ---------- + return TLV.create_TLV(TLV.BOOL, self.shadow_onoff) + elif attribute == 0xFFFC # ---------- FeatureMap / map32 ---------- + return TLV.create_TLV(TLV.U4, 0) # 0 = no Level Control for Lighting + elif attribute == 0xFFFD # ---------- ClusterRevision / u2 ---------- + return TLV.create_TLV(TLV.U4, 4) # 0 = no Level Control for Lighting + end + + else + return super(self).read_attribute(session, ctx) + end + end + + ############################################################# + # Invoke a command + # + # returns a TLV object if successful, contains the response + # or an `int` to indicate a status + def invoke_request(session, val, ctx) + var TLV = matter.TLV + var cluster = ctx.cluster + var command = ctx.command + + # ==================================================================================================== + if cluster == 0x0006 # ========== On/Off 1.5 p.48 ========== + self.update_shadow_lazy() + if command == 0x0000 # ---------- Off ---------- + self.set_onoff(false) + return true + elif command == 0x0001 # ---------- On ---------- + self.set_onoff(true) + return true + elif command == 0x0002 # ---------- Toggle ---------- + self.set_onoff(!self.shadow_onoff) + return true + end + end + + end + + ############################################################# + # web_values + # + # Show values of the remote device as HTML + def web_values() + import webserver + import string + webserver.content_send(string.format("| Light %s", self.web_value_onoff())) + end + + # Show on/off value as html + def web_value_onoff() + var onoff_html = (self.shadow_onoff != nil ? (self.shadow_onoff ? "On" : "Off") : "") + return onoff_html + end + +end +matter.Plugin_Bridge_Light0 = Matter_Plugin_Bridge_Light0 diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Light1.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Light1.be new file mode 100644 index 000000000..d6b4ef551 --- /dev/null +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Light1.be @@ -0,0 +1,188 @@ +# +# Matter_Plugin_Bridge_Light1.be - implements the behavior for a remote generic Lighting (Dimmer) via HTTP +# +# Copyright (C) 2023 Stephan Hadinger & Theo Arends +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +# + +# Matter plug-in for core behavior + +# dummy declaration for solidification +class Matter_Plugin_Bridge_Light0 end + +#@ solidify:Matter_Plugin_Bridge_Light1,weak + +class Matter_Plugin_Bridge_Light1 : Matter_Plugin_Bridge_Light0 + static var TYPE = "http_light1" # name of the plug-in in json + static var NAME = "🔗 Light 1 Dimmer" # display name of the plug-in + # static var ARG = "relay" # additional argument name (or empty if none) + # static var ARG_TYPE = / x -> int(x) # function to convert argument to the right type + static var CLUSTERS = { + # 0x001D: inherited # Descriptor Cluster 9.5 p.453 + # 0x0003: inherited # Identify 1.2 p.16 + # 0x0004: inherited # Groups 1.3 p.21 + # 0x0005: inherited # Scenes 1.4 p.30 - no writable + # 0x0006: inherited # On/Off 1.5 p.48 + 0x0008: [0,2,3,0x0F,0x11,0xFFFC,0xFFFD], # Level Control 1.6 p.57 + } + static var TYPES = { 0x0101: 2, 0x0013: 1 } # Dimmable Light + + var shadow_bri + # var tasmota_relay_index # ingerited + # var shadow_onoff # inherited + + ############################################################# + # Stub for updating shadow values (local copies of what we published to the Matter gateway) + # + # This call is synnchronous and blocking. + def parse_update(data, index) + super(self).parse_update(data, index) + + if index == 11 # Status 11 + var dimmer = int(data.find("Dimmer")) # 0..100 + if dimmer != nil + var bri = tasmota.scale_uint(dimmer, 0, 100, 0, 254) + if bri != self.shadow_bri + self.attribute_updated(0x0008, 0x0000) + self.shadow_bri = bri + end + end + end + end + + ############################################################# + # Model + # + def set_bri(v) + var dimmer = tasmota.scale_uint(v, 0, 254, 0, 100) + var ret = self.call_remote_sync("Dimmer", str(dimmer)) + if ret != nil + self.parse_update(ret, 11) # update shadow from return value + end + end + + ############################################################# + # read an attribute + # + def read_attribute(session, ctx) + import string + var TLV = matter.TLV + var cluster = ctx.cluster + var attribute = ctx.attribute + + # ==================================================================================================== + if cluster == 0x0008 # ========== Level Control 1.6 p.57 ========== + self.update_shadow_lazy() + if attribute == 0x0000 # ---------- CurrentLevel / u1 ---------- + if self.shadow_bri != nil + return TLV.create_TLV(TLV.U1, self.shadow_bri) + else + return TLV.create_TLV(TLV.NULL, nil) + end + elif attribute == 0x0002 # ---------- MinLevel / u1 ---------- + return TLV.create_TLV(TLV.U1, 0) + elif attribute == 0x0003 # ---------- MaxLevel / u1 ---------- + return TLV.create_TLV(TLV.U1, 254) + elif attribute == 0x000F # ---------- Options / map8 ---------- + return TLV.create_TLV(TLV.U1, 0) # + elif attribute == 0x0011 # ---------- OnLevel / u1 ---------- + if self.shadow_bri != nil + return TLV.create_TLV(TLV.U1, self.shadow_bri) + else + return TLV.create_TLV(TLV.NULL, nil) + end + elif attribute == 0xFFFC # ---------- FeatureMap / map32 ---------- + return TLV.create_TLV(TLV.U4, 0X01) # OnOff + elif attribute == 0xFFFD # ---------- ClusterRevision / u2 ---------- + return TLV.create_TLV(TLV.U4, 5) # "new data model format and notation" + end + + else + return super(self).read_attribute(session, ctx) + end + end + + ############################################################# + # Invoke a command + # + # returns a TLV object if successful, contains the response + # or an `int` to indicate a status + def invoke_request(session, val, ctx) + var TLV = matter.TLV + var cluster = ctx.cluster + var command = ctx.command + + # ==================================================================================================== + if cluster == 0x0008 # ========== Level Control 1.6 p.57 ========== + self.update_shadow_lazy() + if command == 0x0000 # ---------- MoveToLevel ---------- + var bri_in = val.findsubval(0) # Hue 0..254 + self.set_bri(bri_in) + ctx.log = "bri:"+str(bri_in) + return true + elif command == 0x0001 # ---------- Move ---------- + # TODO, we don't really support it + return true + elif command == 0x0002 # ---------- Step ---------- + # TODO, we don't really support it + return true + elif command == 0x0003 # ---------- Stop ---------- + # TODO, we don't really support it + return true + elif command == 0x0004 # ---------- MoveToLevelWithOnOff ---------- + var bri_in = val.findsubval(0) # Hue 0..254 + self.set_bri(bri_in) + var onoff = bri_in > 0 + self.set_onoff(onoff) + ctx.log = "bri:"+str(bri_in) + return true + elif command == 0x0005 # ---------- MoveWithOnOff ---------- + # TODO, we don't really support it + return true + elif command == 0x0006 # ---------- StepWithOnOff ---------- + # TODO, we don't really support it + return true + elif command == 0x0007 # ---------- StopWithOnOff ---------- + # TODO, we don't really support it + return true + end + + else + return super(self).invoke_request(session, val, ctx) + end + end + + ############################################################# + # web_values + # + # Show values of the remote device as HTML + def web_values() + import webserver + import string + webserver.content_send(string.format("| Light %s %s", self.web_value_onoff(), self.web_value_dimmer())) + end + + # Show on/off value as html + def web_value_dimmer() + import string + var bri_html = "" + if self.shadow_bri != nil + var bri = tasmota.scale_uint(self.shadow_bri, 0, 254, 0, 100) + bri_html = string.format("%i%%", bri) + end + return "🔅 " + bri_html; + end +end +matter.Plugin_Bridge_Light1 = Matter_Plugin_Bridge_Light1 diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Light2.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Light2.be new file mode 100644 index 000000000..4d7940bbc --- /dev/null +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Light2.be @@ -0,0 +1,190 @@ +# +# Matter_Plugin_Bridge_Light2.be - implements the behavior for a remote generic Lighting (CT) via HTTP +# +# Copyright (C) 2023 Stephan Hadinger & Theo Arends +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +# + +# Matter plug-in for core behavior + +# dummy declaration for solidification +class Matter_Plugin_Bridge_Light1 end + +#@ solidify:Matter_Plugin_Bridge_Light2,weak + +class Matter_Plugin_Bridge_Light2 : Matter_Plugin_Bridge_Light1 + static var TYPE = "http_light2" # name of the plug-in in json + static var NAME = "🔗 Light 2 CT" # display name of the plug-in + # static var ARG = "relay" # additional argument name (or empty if none) + # static var ARG_TYPE = / x -> int(x) # function to convert argument to the right type + static var CLUSTERS = { + # 0x001D: inherited # Descriptor Cluster 9.5 p.453 + # 0x0003: inherited # Identify 1.2 p.16 + # 0x0004: inherited # Groups 1.3 p.21 + # 0x0005: inherited # Scenes 1.4 p.30 - no writable + # 0x0006: inherited # On/Off 1.5 p.48 + # 0x0008: inherited # Level Control 1.6 p.57 + 0x0300: [7,8,0xF,0x400B,0x400C,0xFFFC,0xFFFD], # Color Control 3.2 p.111 + } + static var TYPES = { 0x010C: 2, 0x0013: 1 } # Dimmable Light + + var shadow_ct + var ct_min, ct_max + + ############################################################# + # Constructor + def init(device, endpoint, arguments) + super(self).init(device, endpoint, arguments) + self.update_ct_minmax() + end + + ############################################################# + # Stub for updating shadow values (local copies of what we published to the Matter gateway) + # + # TO BE OVERRIDDEN + # This call is synnchronous and blocking. + def parse_update(data, index) + super(self).parse_update(data, index) + + if index == 11 # Status 11 + var ct = int(data.find("CT")) # 153..500 + if ct != nil + if ct != self.shadow_ct + if ct < self.ct_min ct = self.ct_min end + if ct > self.ct_max ct = self.ct_max end + self.attribute_updated(0x0300, 0x0007) + self.shadow_ct = ct + end + end + end + end + + ############################################################# + # Update ct_min/max + # + def update_ct_minmax() + var ct_alexa_mode = tasmota.get_option(82) # if set, range is 200..380 instead of 153...500 + self.ct_min = ct_alexa_mode ? 200 : 153 + self.ct_max = ct_alexa_mode ? 380 : 500 + end + + ############################################################# + # Model + # + def set_ct(v) + var ret = self.call_remote_sync("CT", str(v)) + if ret != nil + self.parse_update(ret, 11) # update shadow from return value + end + end + + ############################################################# + # read an attribute + # + def read_attribute(session, ctx) + import string + var TLV = matter.TLV + var cluster = ctx.cluster + var attribute = ctx.attribute + + # ==================================================================================================== + if cluster == 0x0300 # ========== Color Control 3.2 p.111 ========== + self.update_shadow_lazy() + if attribute == 0x0007 # ---------- ColorTemperatureMireds / u2 ---------- + if self.shadow_ct != nil + return TLV.create_TLV(TLV.U1, self.shadow_ct) + else + return TLV.create_TLV(TLV.NULL, nil) + end + elif attribute == 0x0008 # ---------- ColorMode / u1 ---------- + return TLV.create_TLV(TLV.U1, 2)# 2 = ColorTemperatureMireds + elif attribute == 0x000F # ---------- Options / u1 ---------- + return TLV.create_TLV(TLV.U1, 0) + elif attribute == 0x400B # ---------- ColorTempPhysicalMinMireds / u2 ---------- + return TLV.create_TLV(TLV.U1, self.ct_min) + elif attribute == 0x400C # ---------- ColorTempPhysicalMaxMireds / u2 ---------- + return TLV.create_TLV(TLV.U1, self.ct_max) + + elif attribute == 0xFFFC # ---------- FeatureMap / map32 ---------- + return TLV.create_TLV(TLV.U4, 0x10) # CT + elif attribute == 0xFFFD # ---------- ClusterRevision / u2 ---------- + return TLV.create_TLV(TLV.U4, 5) # "new data model format and notation, FeatureMap support" + end + + else + return super(self).read_attribute(session, ctx) + end + end + + ############################################################# + # Invoke a command + # + # returns a TLV object if successful, contains the response + # or an `int` to indicate a status + def invoke_request(session, val, ctx) + var TLV = matter.TLV + var cluster = ctx.cluster + var command = ctx.command + + # ==================================================================================================== + if cluster == 0x0300 # ========== Color Control 3.2 p.111 ========== + self.update_shadow_lazy() + if command == 0x000A # ---------- MoveToColorTemperature ---------- + var ct_in = val.findsubval(0) # CT + if ct_in < self.ct_min ct_in = self.ct_min end + if ct_in > self.ct_max ct_in = self.ct_max end + self.set_ct(ct_in) + ctx.log = "ct:"+str(ct_in) + return true + elif command == 0x0047 # ---------- StopMoveStep ---------- + # TODO, we don't really support it + return true + elif command == 0x004B # ---------- MoveColorTemperature ---------- + # TODO, we don't really support it + return true + elif command == 0x004C # ---------- StepColorTemperature ---------- + # TODO, we don't really support it + return true + end + + else + return super(self).invoke_request(session, val, ctx) + end + end + + ############################################################# + # web_values + # + # Show values of the remote device as HTML + def web_values() + import webserver + import string + webserver.content_send(string.format("| Light %s %s %s", + self.web_value_onoff(), self.web_value_dimmer(), + self.web_value_ct())) + end + + # Show on/off value as html + def web_value_ct() + import string + var ct_html = "" + if self.shadow_ct != nil + var ct_k = (((1000000 / self.shadow_ct) + 25) / 50) * 50 # convert in Kelvin + ct_html = string.format("%iK", ct_k) + end + return "⚪ " + ct_html; + end +end +matter.Plugin_Bridge_Light2 = Matter_Plugin_Bridge_Light2 diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Light3.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Light3.be new file mode 100644 index 000000000..6561ac795 --- /dev/null +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Light3.be @@ -0,0 +1,221 @@ +# +# Matter_Plugin_Bridge_Light3.be - implements the behavior for a remote generic Lighting (RGB) via HTTP +# +# Copyright (C) 2023 Stephan Hadinger & Theo Arends +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +# + +# Matter plug-in for core behavior + +# dummy declaration for solidification +class Matter_Plugin_Bridge_Light1 end + +#@ solidify:Matter_Plugin_Bridge_Light3,weak + +class Matter_Plugin_Bridge_Light3 : Matter_Plugin_Bridge_Light1 + static var TYPE = "http_light3" # name of the plug-in in json + static var NAME = "🔗 Light 3 RGB" # display name of the plug-in + # static var ARG = "relay" # additional argument name (or empty if none) + # static var ARG_TYPE = / x -> int(x) # function to convert argument to the right type + static var CLUSTERS = { + # 0x001D: inherited # Descriptor Cluster 9.5 p.453 + # 0x0003: inherited # Identify 1.2 p.16 + # 0x0004: inherited # Groups 1.3 p.21 + # 0x0005: inherited # Scenes 1.4 p.30 - no writable + # 0x0006: inherited # On/Off 1.5 p.48 + # 0x0008: inherited # Level Control 1.6 p.57 + 0x0300: [0,1,7,8,0xF,0x4001,0x400A,0xFFFC,0xFFFD],# Color Control 3.2 p.111 + } + static var TYPES = { 0x010D: 2, 0x0013: 1 } # Extended Color Light + + var shadow_hue, shadow_sat # 0..254 + + ############################################################# + # Constructor + def init(device, endpoint, arguments) + super(self).init(device, endpoint, arguments) + end + + ############################################################# + # Stub for updating shadow values (local copies of what we published to the Matter gateway) + # + # This call is synnchronous and blocking. + def parse_update(data, index) + super(self).parse_update(data, index) + + if index == 11 # Status 11 + var hsb = data.find("HSBColor") + if hsb + import string + var hsb_list = string.split(hsb, ",") + var hue = int(hsb_list[0]) + var sat = int(hsb_list[1]) + # dimmer is already available + + if hue != nil hue = tasmota.scale_uint(hue, 0, 360, 0, 254) else hue = self.shadow_hue end + if sat != nil sat = tasmota.scale_uint(sat, 0, 100, 0, 254) else sat = self.shadow_sat end + if hue != self.shadow_hue self.attribute_updated(0x0300, 0x0000) self.shadow_hue = hue end + if sat != self.shadow_sat self.attribute_updated(0x0300, 0x0001) self.shadow_sat = sat end + end + end + end + + ############################################################# + # Model + # + def set_hue(v) + var hue_360 = tasmota.scale_uint(v, 0, 254, 0, 360) + var ret = self.call_remote_sync("HSBColor1", hue_360) + if ret != nil + self.parse_update(ret, 11) # update shadow from return value + end + end + def set_sat(v) + var sat_100 = tasmota.scale_uint(v, 0, 254, 0, 100) + var ret = self.call_remote_sync("HSBColor2", sat_100) + if ret != nil + self.parse_update(ret, 11) # update shadow from return value + end + end + + ############################################################# + # read an attribute + # + def read_attribute(session, ctx) + import string + var TLV = matter.TLV + var cluster = ctx.cluster + var attribute = ctx.attribute + + # ==================================================================================================== + if cluster == 0x0300 # ========== Color Control 3.2 p.111 ========== + self.update_shadow_lazy() + if attribute == 0x0000 # ---------- CurrentHue / u1 ---------- + if self.shadow_hue != nil + return TLV.create_TLV(TLV.U1, self.shadow_hue) + else + return TLV.create_TLV(TLV.NULL, nil) + end + elif attribute == 0x0001 # ---------- CurrentSaturation / u2 ---------- + if self.shadow_sat != nil + return TLV.create_TLV(TLV.U1, self.shadow_sat) + else + return TLV.create_TLV(TLV.NULL, nil) + end + elif attribute == 0x0007 # ---------- ColorTemperatureMireds / u2 ---------- + return TLV.create_TLV(TLV.U1, 0) + elif attribute == 0x0008 # ---------- ColorMode / u1 ---------- + return TLV.create_TLV(TLV.U1, 0)# 0 = CurrentHue and CurrentSaturation + elif attribute == 0x000F # ---------- Options / u1 ---------- + return TLV.create_TLV(TLV.U1, 0) + elif attribute == 0x4001 # ---------- EnhancedColorMode / u1 ---------- + return TLV.create_TLV(TLV.U1, 0) + elif attribute == 0x400A # ---------- ColorCapabilities / map2 ---------- + return TLV.create_TLV(TLV.U1, 0) + + # Defined Primaries Information Attribute Set + elif attribute == 0x0010 # ---------- NumberOfPrimaries / u1 ---------- + return TLV.create_TLV(TLV.U1, 0) + + elif attribute == 0xFFFC # ---------- FeatureMap / map32 ---------- + return TLV.create_TLV(TLV.U4, 0x01) # HS + elif attribute == 0xFFFD # ---------- ClusterRevision / u2 ---------- + return TLV.create_TLV(TLV.U4, 5) # "new data model format and notation, FeatureMap support" + end + + else + return super(self).read_attribute(session, ctx) + end + end + + ############################################################# + # Invoke a command + # + # returns a TLV object if successful, contains the response + # or an `int` to indicate a status + def invoke_request(session, val, ctx) + var TLV = matter.TLV + var cluster = ctx.cluster + var command = ctx.command + + # ==================================================================================================== + if cluster == 0x0300 # ========== Color Control 3.2 p.111 ========== + self.update_shadow_lazy() + if command == 0x0000 # ---------- MoveToHue ---------- + var hue_in = val.findsubval(0) # Hue 0..254 + self.set_hue(hue_in) + ctx.log = "hue:"+str(hue_in) + return true + elif command == 0x0001 # ---------- MoveHue ---------- + # TODO, we don't really support it + return true + elif command == 0x0002 # ---------- StepHue ---------- + # TODO, we don't really support it + return true + elif command == 0x0003 # ---------- MoveToSaturation ---------- + var sat_in = val.findsubval(0) # Sat 0..254 + self.set_sat(sat_in) + ctx.log = "sat:"+str(sat_in) + return true + elif command == 0x0004 # ---------- MoveSaturation ---------- + # TODO, we don't really support it + return true + elif command == 0x0005 # ---------- StepSaturation ---------- + # TODO, we don't really support it + return true + elif command == 0x0006 # ---------- MoveToHueAndSaturation ---------- + var hue_in = val.findsubval(0) # Hue 0..254 + var sat_in = val.findsubval(1) # Sat 0..254 + self.set_hue(hue_in) + self.set_sat(sat_in) + ctx.log = "hue:"+str(hue_in)+" sat:"+str(sat_in) + return true + elif command == 0x0047 # ---------- StopMoveStep ---------- + # TODO, we don't really support it + return true + end + + else + return super(self).invoke_request(session, val, ctx) + end + end + + ############################################################# + # web_values + # + # Show values of the remote device as HTML + def web_values() + import webserver + import string + webserver.content_send(string.format("| Light %s %s %s", + self.web_value_onoff(), self.web_value_dimmer(), + self.web_value_RGB())) + end + + # Show on/off value as html + def web_value_RGB() + import string + if self.shadow_hue != nil && self.shadow_sat != nil + var l = light_state(3) # RGB virtual light state object + l.set_bri(255) # set full brightness to get full range RGB + l.set_huesat(tasmota.scale_uint(self.shadow_hue, 0, 254, 0, 360), tasmota.scale_uint(self.shadow_sat, 0, 254, 0, 255)) + var rgb_hex = string.format("#%02X%02X%02X", l.r, l.g, l.b) + var rgb_html = string.format('%s', rgb_hex, rgb_hex) + return rgb_html + end + return "" + end +end +matter.Plugin_Bridge_Light3 = Matter_Plugin_Bridge_Light3 diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_OnOff.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_OnOff.be index 8a04c9398..e26763aa0 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_OnOff.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_OnOff.be @@ -20,131 +20,23 @@ # Matter plug-in for core behavior # dummy declaration for solidification -class Matter_Plugin_Bridge_HTTP end +class Matter_Plugin_Bridge_Light0 end #@ solidify:Matter_Plugin_Bridge_OnOff,weak -class Matter_Plugin_Bridge_OnOff : Matter_Plugin_Bridge_HTTP +class Matter_Plugin_Bridge_OnOff : Matter_Plugin_Bridge_Light0 static var TYPE = "http_relay" # name of the plug-in in json - static var NAME = "🔗 Relay" # display name of the plug-in - static var ARG = "relay" # additional argument name (or empty if none) - static var ARG_TYPE = / x -> int(x) # function to convert argument to the right type - static var CLUSTERS = { - # 0x001D: inherited # Descriptor Cluster 9.5 p.453 - # 0x0003: inherited # Identify 1.2 p.16 - # 0x0004: inherited # Groups 1.3 p.21 - # 0x0005: inherited # Scenes 1.4 p.30 - no writable - 0x0006: [0,0xFFFC,0xFFFD], # On/Off 1.5 p.48 - } - static var TYPES = { 0x010A: 2 } # On/Off Light - - var tasmota_relay_index # Relay number in Tasmota (zero based) - var shadow_onoff # fake status for now # TODO + static var NAME = "🔗 Relay" # display name of the plug-in + static var TYPES = { 0x010A: 2, 0x0013: 1 } # On/Off Plug-in Unit ############################################################# - # Constructor - def init(device, endpoint, arguments) + # web_values + # + # Show values of the remote device as HTML + def web_values() + import webserver import string - super(self).init(device, endpoint, arguments) - self.shadow_onoff = false - self.tasmota_relay_index = arguments.find(self.ARG #-'relay'-#) - if self.tasmota_relay_index == nil self.tasmota_relay_index = 0 end - end - - ############################################################# - # Update shadow - # - def update_shadow() - var ret = self.call_remote_sync("Status", "11") - super(self).update_shadow() - end - - ############################################################# - # Stub for updating shadow values (local copies of what we published to the Matter gateway) - # - # TO BE OVERRIDDEN - # This call is synnchronous and blocking. - def parse_update(data, index) - if index == 11 # Status 11 - var state = (data.find("POWER") == "ON") - if self.shadow_onoff != nil && self.shadow_onoff != bool(state) - self.attribute_updated(0x0006, 0x0000) - end - self.shadow_onoff = state - end - end - - ############################################################# - # probe_shadow_async - # - # ### TO BE OVERRIDDEN - DON'T CALL SUPER - default is just calling `update_shadow()` - # This is called on a regular basis, depending on the type of plugin. - # Whenever the data is returned, call `update_shadow()` to update values - def probe_shadow_async() - self.call_remote_async("Status", "11") - end - - ############################################################# - # Model - # - def set_onoff(v) - self.call_remote_sync("Power", v ? "1" : "0") - self.update_shadow() - end - - ############################################################# - # read an attribute - # - def read_attribute(session, ctx) - import string - var TLV = matter.TLV - var cluster = ctx.cluster - var attribute = ctx.attribute - - # ==================================================================================================== - if cluster == 0x0006 # ========== On/Off 1.5 p.48 ========== - self.update_shadow_lazy() - if attribute == 0x0000 # ---------- OnOff / bool ---------- - return TLV.create_TLV(TLV.BOOL, self.shadow_onoff) - elif attribute == 0xFFFC # ---------- FeatureMap / map32 ---------- - return TLV.create_TLV(TLV.U4, 0) # 0 = no Level Control for Lighting - elif attribute == 0xFFFD # ---------- ClusterRevision / u2 ---------- - return TLV.create_TLV(TLV.U4, 4) # 0 = no Level Control for Lighting - end - - else - return super(self).read_attribute(session, ctx) - end - end - - ############################################################# - # Invoke a command - # - # returns a TLV object if successful, contains the response - # or an `int` to indicate a status - def invoke_request(session, val, ctx) - var TLV = matter.TLV - var cluster = ctx.cluster - var command = ctx.command - - # ==================================================================================================== - if cluster == 0x0006 # ========== On/Off 1.5 p.48 ========== - self.update_shadow_lazy() - if command == 0x0000 # ---------- Off ---------- - self.set_onoff(false) - self.update_shadow() - return true - elif command == 0x0001 # ---------- On ---------- - self.set_onoff(true) - self.update_shadow() - return true - elif command == 0x0002 # ---------- Toggle ---------- - self.set_onoff(!self.shadow_onoff) - self.update_shadow() - return true - end - end - + webserver.content_send(string.format("| Relay %i %s", self.tasmota_relay_index, self.web_value_onoff())) end end diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Sensor.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Sensor.be new file mode 100644 index 000000000..677f54a5a --- /dev/null +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Sensor.be @@ -0,0 +1,98 @@ +# +# Matter_Plugin_Bridge_Sensor.be - implements base class for a Sensor via HTTP to Tasmota +# +# Copyright (C) 2023 Stephan Hadinger & Theo Arends +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +# + +# Matter plug-in for core behavior + +# dummy declaration for solidification +class Matter_Plugin_Bridge_HTTP end + +#@ solidify:Matter_Plugin_Bridge_Sensor,weak + +class Matter_Plugin_Bridge_Sensor : Matter_Plugin_Bridge_HTTP + # static var TYPE = "" # name of the plug-in in json + # static var NAME = "" # display name of the plug-in + static var ARG = "filter" # additional argument name (or empty if none) + static var ARG_HTTP = "url" # domain name + static var UPDATE_TIME = 5000 # update every 5s + static var UPDATE_CMD = "Status 8" # command to send for updates + static var PROBE_TIMEOUT = 1700 # timeout of 1700 ms for probing, which gives at least 1s for TCP recovery + # static var SYNC_TIMEOUT = 500 # timeout of 700 ms for probing + var tasmota_sensor_filter # Rule-type filter to the value, like "ESP32#Temperature" + var tasmota_sensor_matcher # Actual matcher object + var shadow_value # Last known value + + ############################################################# + # Constructor + def init(device, endpoint, arguments) + super(self).init(device, endpoint, arguments) + self.tasmota_sensor_filter = arguments.find(self.ARG#-'filter'-#) + if self.tasmota_sensor_filter + self.tasmota_sensor_matcher = tasmota.Rule_Matcher.parse(self.tasmota_sensor_filter) + end + end + + ############################################################# + # Stub for updating shadow values (local copies of what we published to the Matter gateway) + # + # TO BE OVERRIDDEN + def parse_update(data, index) + if index == 8 # Status 8 + if self.tasmota_sensor_matcher + var val = self.pre_value(real(self.tasmota_sensor_matcher.match(data))) + if val != nil + if val != self.shadow_value + self.value_changed(val) + end + self.shadow_value = val + end + end + end + end + + ############################################################# + # Called when the value changed compared to shadow value + # + # This must be overriden. + # This is where you call `self.attribute_updated(, )` + def value_changed(val) + # self.attribute_updated(0x0402, 0x0000) + end + + ############################################################# + # Pre-process value + # + # This must be overriden. + # This allows to convert the raw sensor value to the target one, typically int + def pre_value(val) + return val + end + + ############################################################# + # Return the first item in the filter + def filter_name_html() + if self.tasmota_sensor_filter + import string + import webserver + return webserver.html_escape(string.split(self.tasmota_sensor_filter, '#')[0]) + end + return "" + end + +end +matter.Plugin_Bridge_Sensor = Matter_Plugin_Bridge_Sensor diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Sensor_Humidity.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Sensor_Humidity.be new file mode 100644 index 000000000..cabcec6ac --- /dev/null +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Sensor_Humidity.be @@ -0,0 +1,99 @@ +# +# Matter_Plugin_Bridge_Sensor_Humidity.be - implements base class for a Humidity Sensor via HTTP to Tasmota +# +# Copyright (C) 2023 Stephan Hadinger & Theo Arends +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +# + +# Matter plug-in for core behavior + +# dummy declaration for solidification +class Matter_Plugin_Bridge_Sensor end + +#@ solidify:Matter_Plugin_Bridge_Sensor_Humidity,weak + +class Matter_Plugin_Bridge_Sensor_Humidity : Matter_Plugin_Bridge_Sensor + static var TYPE = "http_humidity" # name of the plug-in in json + static var NAME = "🔗 Humidity" # display name of the plug-in + + static var CLUSTERS = { + 0x0405: [0,1,2,0xFFFC,0xFFFD], # Humidity Measurement p.102 - no writable + } + static var TYPES = { 0x0307: 2, 0x0013: 1 } # Humidity Sensor, rev 2 + + ############################################################# + # Called when the value changed compared to shadow value + # + # This must be overriden. + # This is where you call `self.attribute_updated(, )` + def value_changed(val) + self.attribute_updated(0x0405, 0x0000) + end + + ############################################################# + # Pre-process value + # + # This must be overriden. + # This allows to convert the raw sensor value to the target one, typically int + def pre_value(val) + return val != nil ? int(val * 100) : nil # 1/100th of percentage + end + + ############################################################# + # read an attribute + # + def read_attribute(session, ctx) + import string + var TLV = matter.TLV + var cluster = ctx.cluster + var attribute = ctx.attribute + + # ==================================================================================================== + if cluster == 0x0405 # ========== Humidity Measurement 2.4 p.98 ========== + if attribute == 0x0000 # ---------- Humidity / u16 ---------- + if self.shadow_value != nil + return TLV.create_TLV(TLV.U2, int(self.shadow_value)) + else + return TLV.create_TLV(TLV.NULL, nil) + end + elif attribute == 0x0001 # ---------- MinMeasuredValue / u16 ---------- + return TLV.create_TLV(TLV.U2, 500) # 0% + elif attribute == 0x0002 # ---------- MaxMeasuredValue / u16 ---------- + return TLV.create_TLV(TLV.U2, 10000) # 100% + elif attribute == 0xFFFC # ---------- FeatureMap / map32 ---------- + return TLV.create_TLV(TLV.U4, 0) # 0 = no Extended Range + elif attribute == 0xFFFD # ---------- ClusterRevision / u2 ---------- + return TLV.create_TLV(TLV.U4, 3) # 3 = New data model format and notation + end + + else + return super(self).read_attribute(session, ctx) + end + end + + ############################################################# + # web_values + # + # Show values of the remote device as HTML + def web_values() + import webserver + import string + webserver.content_send(string.format("| %s 💧 %2.0f%%", + self.filter_name_html(), + self.shadow_value != nil ? real(self.shadow_value) / 100 : nil)) + end + +end +matter.Plugin_Bridge_Sensor_Humidity = Matter_Plugin_Bridge_Sensor_Humidity diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Sensor_Illuminance.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Sensor_Illuminance.be new file mode 100644 index 000000000..7d3851d41 --- /dev/null +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Sensor_Illuminance.be @@ -0,0 +1,99 @@ +# +# Matter_Plugin_Bridge_Sensor_Illuminance.be - implements base class for a Light/Illuminance Sensor via HTTP to Tasmota +# +# Copyright (C) 2023 Stephan Hadinger & Theo Arends +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +# + +# Matter plug-in for core behavior + +# dummy declaration for solidification +class Matter_Plugin_Bridge_Sensor end + +#@ solidify:Matter_Plugin_Bridge_Sensor_Illuminance,weak + +class Matter_Plugin_Bridge_Sensor_Illuminance : Matter_Plugin_Bridge_Sensor + static var TYPE = "http_illuminance" # name of the plug-in in json + static var NAME = "🔗 Illuminance" # display name of the plug-in + + static var CLUSTERS = { + 0x0400: [0,1,2,0xFFFC,0xFFFD], # Illuminance Measurement p.95 - no writable + } + static var TYPES = { 0x0106: 2, 0x0013: 1 } # Illuminance Sensor, rev 2 + + ############################################################# + # Called when the value changed compared to shadow value + # + # This must be overriden. + # This is where you call `self.attribute_updated(, )` + def value_changed(val) + self.attribute_updated(0x0400, 0x0000) + end + + ############################################################# + # Pre-process value + # + # This must be overriden. + # This allows to convert the raw sensor value to the target one, typically int + def pre_value(val) + return val != nil ? int(val) : nil # value in lux + end + + ############################################################# + # read an attribute + # + def read_attribute(session, ctx) + import string + var TLV = matter.TLV + var cluster = ctx.cluster + var attribute = ctx.attribute + + # ==================================================================================================== + if cluster == 0x0400 # ========== Illuminance Measurement 2.2 p.95 ========== + if attribute == 0x0000 # ---------- MeasuredValue / i16 ---------- + if self.shadow_value != nil + return TLV.create_TLV(TLV.I2, int(self.shadow_value)) + else + return TLV.create_TLV(TLV.NULL, nil) + end + elif attribute == 0x0001 # ---------- MinMeasuredValue / i16 ---------- + return TLV.create_TLV(TLV.I2, 0) # 0 lux + elif attribute == 0x0002 # ---------- MaxMeasuredValue / i16 ---------- + return TLV.create_TLV(TLV.I2, 10000) # 10000 lux + elif attribute == 0xFFFC # ---------- FeatureMap / map32 ---------- + return TLV.create_TLV(TLV.U4, 0) + elif attribute == 0xFFFD # ---------- ClusterRevision / u2 ---------- + return TLV.create_TLV(TLV.U4, 3) # 3 = New data model format and notation + end + + else + return super(self).read_attribute(session, ctx) + end + end + + ############################################################# + # web_values + # + # Show values of the remote device as HTML + def web_values() + import webserver + import string + webserver.content_send(string.format("| %s 🔅 %ilux", + self.filter_name_html(), + int(self.shadow_value))) + end + +end +matter.Plugin_Bridge_Sensor_Illuminance = Matter_Plugin_Bridge_Sensor_Illuminance diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Sensor_Pressure.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Sensor_Pressure.be new file mode 100644 index 000000000..795a08bcb --- /dev/null +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Sensor_Pressure.be @@ -0,0 +1,99 @@ +# +# Matter_Plugin_Bridge_Sensor_Temp.be - implements base class for a Pressure Sensor via HTTP to Tasmota +# +# Copyright (C) 2023 Stephan Hadinger & Theo Arends +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +# + +# Matter plug-in for core behavior + +# dummy declaration for solidification +class Matter_Plugin_Bridge_Sensor end + +#@ solidify:Matter_Plugin_Bridge_Sensor_Pressure,weak + +class Matter_Plugin_Bridge_Sensor_Pressure : Matter_Plugin_Bridge_Sensor + static var TYPE = "http_pressure" # name of the plug-in in json + static var NAME = "🔗 Pressure" # display name of the plug-in + + static var CLUSTERS = { + 0x0403: [0,1,2,0xFFFC,0xFFFD], # Pressure Measurement + } + static var TYPES = { 0x0305: 2, 0x0013: 1 } # Temperature Sensor, rev 2 + + ############################################################# + # Called when the value changed compared to shadow value + # + # This must be overriden. + # This is where you call `self.attribute_updated(, )` + def value_changed(val) + self.attribute_updated(0x0403, 0x0000) + end + + ############################################################# + # Pre-process value + # + # This must be overriden. + # This allows to convert the raw sensor value to the target one, typically int + def pre_value(val) + return val != nil ? int(val) : nil + end + + ############################################################# + # read an attribute + # + def read_attribute(session, ctx) + import string + var TLV = matter.TLV + var cluster = ctx.cluster + var attribute = ctx.attribute + + # ==================================================================================================== + if cluster == 0x0403 # ========== Pressure Measurement 2.4 p.98 ========== + if attribute == 0x0000 # ---------- MeasuredValue / i16 ---------- + if self.shadow_value != nil + return TLV.create_TLV(TLV.I2, int(self.shadow_value)) + else + return TLV.create_TLV(TLV.NULL, nil) + end + elif attribute == 0x0001 # ---------- MinMeasuredValue / i16 ---------- + return TLV.create_TLV(TLV.I2, 500) # 500 hPA + elif attribute == 0x0002 # ---------- MaxMeasuredValue / i16 ---------- + return TLV.create_TLV(TLV.I2, 1500) # 1500 hPA + elif attribute == 0xFFFC # ---------- FeatureMap / map32 ---------- + return TLV.create_TLV(TLV.U4, 0) # 0 = no Extended Range + elif attribute == 0xFFFD # ---------- ClusterRevision / u2 ---------- + return TLV.create_TLV(TLV.U4, 3) # 3 = New data model format and notation + end + + else + return super(self).read_attribute(session, ctx) + end + end + + ############################################################# + # web_values + # + # Show values of the remote device as HTML + def web_values() + import webserver + import string + webserver.content_send(string.format("| %s ⛅ %i hPa", + self.filter_name_html(), + int(self.shadow_value))) + end + +end +matter.Plugin_Bridge_Sensor_Pressure = Matter_Plugin_Bridge_Sensor_Pressure diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Sensor_Temp.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Sensor_Temp.be new file mode 100644 index 000000000..bd1bd5e03 --- /dev/null +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Sensor_Temp.be @@ -0,0 +1,99 @@ +# +# Matter_Plugin_Bridge_Sensor_Temp.be - implements base class for a Temperature Sensor via HTTP to Tasmota +# +# Copyright (C) 2023 Stephan Hadinger & Theo Arends +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +# + +# Matter plug-in for core behavior + +# dummy declaration for solidification +class Matter_Plugin_Bridge_Sensor end + +#@ solidify:Matter_Plugin_Bridge_Sensor_Temp,weak + +class Matter_Plugin_Bridge_Sensor_Temp : Matter_Plugin_Bridge_Sensor + static var TYPE = "http_temperature" # name of the plug-in in json + static var NAME = "🔗 Temperature" # display name of the plug-in + + static var CLUSTERS = { + 0x0402: [0,1,2,0xFFFC,0xFFFD], # Temperature Measurement p.97 - no writable + } + static var TYPES = { 0x0302: 2, 0x0013: 1 } # Temperature Sensor, rev 2 + + ############################################################# + # Called when the value changed compared to shadow value + # + # This must be overriden. + # This is where you call `self.attribute_updated(, )` + def value_changed(val) + self.attribute_updated(0x0402, 0x0000) + end + + ############################################################# + # Pre-process value + # + # This must be overriden. + # This allows to convert the raw sensor value to the target one, typically int + def pre_value(val) + return val != nil ? int(val * 100) : nil + end + + ############################################################# + # read an attribute + # + def read_attribute(session, ctx) + import string + var TLV = matter.TLV + var cluster = ctx.cluster + var attribute = ctx.attribute + + # ==================================================================================================== + if cluster == 0x0402 # ========== Temperature Measurement 2.3 p.97 ========== + if attribute == 0x0000 # ---------- MeasuredValue / i16 (*100) ---------- + if self.shadow_value != nil + return TLV.create_TLV(TLV.I2, self.shadow_value) + else + return TLV.create_TLV(TLV.NULL, nil) + end + elif attribute == 0x0001 # ---------- MinMeasuredValue / i16 (*100) ---------- + return TLV.create_TLV(TLV.I2, -5000) # -50 °C + elif attribute == 0x0002 # ---------- MaxMeasuredValue / i16 (*100) ---------- + return TLV.create_TLV(TLV.I2, 15000) # 150 °C + elif attribute == 0xFFFC # ---------- FeatureMap / map32 ---------- + return TLV.create_TLV(TLV.U4, 0) + elif attribute == 0xFFFD # ---------- ClusterRevision / u2 ---------- + return TLV.create_TLV(TLV.U4, 4) # 4 = New data model format and notation + end + + else + return super(self).read_attribute(session, ctx) + end + end + + ############################################################# + # web_values + # + # Show values of the remote device as HTML + def web_values() + import webserver + import string + webserver.content_send(string.format("| %s ☀️ %.1f °C", + self.filter_name_html(), + self.shadow_value != nil ? real(self.shadow_value) / 100 : nil)) + end + +end +matter.Plugin_Bridge_Sensor_Temp = Matter_Plugin_Bridge_Sensor_Temp diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Light0.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Light0.be index 9e43a8189..b8b16bc36 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Light0.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Light0.be @@ -52,8 +52,10 @@ class Matter_Plugin_Light0 : Matter_Plugin_Device def update_shadow() import light var light_status = light.get() - var pow = light_status.find('power', nil) - if pow != self.shadow_onoff self.attribute_updated(0x0006, 0x0000) self.shadow_onoff = pow end + if light_status != nil + var pow = light_status.find('power', nil) + if pow != self.shadow_onoff self.attribute_updated(0x0006, 0x0000) self.shadow_onoff = pow end + end super(self).update_shadow() end diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Light1.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Light1.be index 531f3fd61..f5d965fba 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Light1.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Light1.be @@ -53,12 +53,14 @@ class Matter_Plugin_Light1 : Matter_Plugin_Light0 def update_shadow() import light var light_status = light.get() - var bri = light_status.find('bri', nil) - if bri != nil - bri = tasmota.scale_uint(bri, 0, 255, 0, 254) - if bri != self.shadow_bri - self.attribute_updated(0x0008, 0x0000) - self.shadow_bri = bri + if light_status != nil + var bri = light_status.find('bri', nil) + if bri != nil + bri = tasmota.scale_uint(bri, 0, 255, 0, 254) + if bri != self.shadow_bri + self.attribute_updated(0x0008, 0x0000) + self.shadow_bri = bri + end end end super(self).update_shadow() # superclass manages 'power' diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Light2.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Light2.be index 9eee3be00..ad321cc5d 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Light2.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Light2.be @@ -57,9 +57,11 @@ class Matter_Plugin_Light2 : Matter_Plugin_Light1 self.update_ct_minmax() super(self).update_shadow() var light_status = light.get() - var ct = light_status.find('ct', nil) - if ct == nil ct = self.shadow_ct end - if ct != self.shadow_ct self.attribute_updated(0x0300, 0x0007) self.shadow_ct = ct end + if light_status != nil + var ct = light_status.find('ct', nil) + if ct == nil ct = self.shadow_ct end + if ct != self.shadow_ct self.attribute_updated(0x0300, 0x0007) self.shadow_ct = ct end + end end ############################################################# @@ -79,7 +81,7 @@ class Matter_Plugin_Light2 : Matter_Plugin_Light1 var TLV = matter.TLV var cluster = ctx.cluster var attribute = ctx.attribute - + # ==================================================================================================== if cluster == 0x0300 # ========== Color Control 3.2 p.111 ========== self.update_shadow_lazy() diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Light3.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Light3.be index acdce0837..da5f107da 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Light3.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Light3.be @@ -55,12 +55,14 @@ class Matter_Plugin_Light3 : Matter_Plugin_Light1 import light super(self).update_shadow() var light_status = light.get() - var hue = light_status.find('hue', nil) - var sat = light_status.find('sat', nil) - if hue != nil hue = tasmota.scale_uint(hue, 0, 360, 0, 254) else hue = self.shadow_hue end - if sat != nil sat = tasmota.scale_uint(sat, 0, 255, 0, 254) else sat = self.shadow_sat end - if hue != self.shadow_hue self.attribute_updated(0x0300, 0x0000) self.shadow_hue = hue end - if sat != self.shadow_sat self.attribute_updated(0x0300, 0x0001) self.shadow_sat = sat end + if light_status != nil + var hue = light_status.find('hue', nil) + var sat = light_status.find('sat', nil) + if hue != nil hue = tasmota.scale_uint(hue, 0, 360, 0, 254) else hue = self.shadow_hue end + if sat != nil sat = tasmota.scale_uint(sat, 0, 255, 0, 254) else sat = self.shadow_sat end + if hue != self.shadow_hue self.attribute_updated(0x0300, 0x0000) self.shadow_hue = hue end + if sat != self.shadow_sat self.attribute_updated(0x0300, 0x0001) self.shadow_sat = sat end + end end ############################################################# diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_OnOff.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_OnOff.be index 585a5bce5..fb0b0f928 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_OnOff.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_OnOff.be @@ -37,7 +37,7 @@ class Matter_Plugin_OnOff : Matter_Plugin_Device # 0x0005: inherited # Scenes 1.4 p.30 - no writable 0x0006: [0,0xFFFC,0xFFFD], # On/Off 1.5 p.48 } - static var TYPES = { 0x010A: 2 } # On/Off Light + static var TYPES = { 0x010A: 2 } # On/Off Plug-in Unit var tasmota_relay_index # Relay number in Tasmota (zero based) var shadow_onoff # fake status for now # TODO @@ -47,15 +47,15 @@ class Matter_Plugin_OnOff : Matter_Plugin_Device def init(device, endpoint, arguments) super(self).init(device, endpoint, arguments) self.shadow_onoff = false - self.tasmota_relay_index = arguments.find(self.ARG #-'relay'-#) - if self.tasmota_relay_index == nil self.tasmota_relay_index = 0 end + self.tasmota_relay_index = int(arguments.find(self.ARG #-'relay'-#, 1)) + if self.tasmota_relay_index <= 0 self.tasmota_relay_index = 1 end end ############################################################# # Update shadow # def update_shadow() - var state = tasmota.get_power(self.tasmota_relay_index) + var state = tasmota.get_power(self.tasmota_relay_index - 1) if state != nil if self.shadow_onoff != nil && self.shadow_onoff != bool(state) self.attribute_updated(0x0006, 0x0000) @@ -69,7 +69,7 @@ class Matter_Plugin_OnOff : Matter_Plugin_Device # Model # def set_onoff(v) - tasmota.set_power(self.tasmota_relay_index, bool(v)) + tasmota.set_power(self.tasmota_relay_index - 1, bool(v)) self.update_shadow() end diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor_Illuminance.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor_Illuminance.be index 1ba16a5eb..e75ee9b1a 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor_Illuminance.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor_Illuminance.be @@ -30,7 +30,7 @@ class Matter_Plugin_Sensor_Illuminance : Matter_Plugin_Sensor static var CLUSTERS = { 0x0400: [0,1,2,0xFFFC,0xFFFD], # Illuminance Measurement p.95 - no writable } - static var TYPES = { 0x0106: 2 } # Temperature Sensor, rev 2 + static var TYPES = { 0x0106: 2 } # Illuminance Sensor, rev 2 ############################################################# # Pre-process value diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor_Pressure.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor_Pressure.be index 0d87d296b..cf539219e 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor_Pressure.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor_Pressure.be @@ -28,9 +28,9 @@ class Matter_Plugin_Sensor_Pressure : Matter_Plugin_Sensor static var TYPE = "pressure" # name of the plug-in in json static var NAME = "Pressure" # display name of the plug-in static var CLUSTERS = { - 0x0403: [0,1,2,0xFFFC,0xFFFD], # Temperature Measurement p.97 - no writable + 0x0403: [0,1,2,0xFFFC,0xFFFD], # Pressure Measurement } - static var TYPES = { 0x0305: 2 } # Temperature Sensor, rev 2 + static var TYPES = { 0x0305: 2 } # Pressure Sensor, rev 2 ############################################################# # Pre-process value diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_TCP_async.be b/lib/libesp32/berry_matter/src/embedded/Matter_TCP_async.be index 949b263a1..72cd81ceb 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_TCP_async.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_TCP_async.be @@ -95,6 +95,7 @@ class Matter_TCP_async if timeout == nil timeout = self.TIMEOUT end self.timeout = timeout end + def get_timeout() return self.timeout end ############################################################# # Reset the instance to send a open a new connection diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_UI.be b/lib/libesp32/berry_matter/src/embedded/Matter_UI.be index 019af83d9..5e7429aeb 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_UI.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_UI.be @@ -35,7 +35,8 @@ class Matter_UI static var _ROOT_TYPES = "root" static var _CLASSES_TYPES = "|relay|light0|light1|light2|light3|shutter|shutter+tilt" "|temperature|pressure|illuminance|humidity" - "|-http|http_relay" + static var _CLASSES_TYPES2= "-http|http_relay|http_light0|http_light1|http_light2|http_light3" + "|http_temperature|http_pressure|http_illuminance|http_humidity" var device def init(device) @@ -268,7 +269,7 @@ class Matter_UI webserver.content_send(string.format("", i, ep)) webserver.content_send(string.format("")) webserver.content_send(string.format("", i, webserver.html_escape(arg))) @@ -279,7 +280,7 @@ class Matter_UI # add an empty line for adding a configuration webserver.content_send(string.format("", i)) webserver.content_send(string.format("")) webserver.content_send(string.format("", i)) @@ -293,10 +294,13 @@ class Matter_UI #- ---------------------------------------------------------------------- -# #- Show all possible classes for plugin #- ---------------------------------------------------------------------- -# - def plugin_option(cur, class_list) + def plugin_option(cur, *class_list) import webserver import string - var class_types = class_list ? string.split(class_list, '|') : [] + var class_types = [] + for cl: class_list + class_types += string.split(cl, '|') + end var i = 0 while i < size(class_types) @@ -495,6 +499,53 @@ class Matter_UI end end + ####################################################################### + # Show bridge status + ####################################################################### + def show_bridge_status() + import webserver + import string + var bridge_plugin_by_host + + var idx = 0 + while idx < size(self.device.plugins) + var plg = self.device.plugins[idx] + + if isinstance(plg, matter.Plugin_Bridge_HTTP) + if bridge_plugin_by_host == nil bridge_plugin_by_host = {} end + var host = plg.http_remote.addr + + if !bridge_plugin_by_host.contains(host) bridge_plugin_by_host[host] = [] end + bridge_plugin_by_host[host].push(plg) + + end + idx += 1 + end + + if bridge_plugin_by_host == nil return end # no remote device, abort + + # set specific styles + webserver.content_send("
") + webserver.content_send("
" D_STR_PROTOCOL "") + htmlSelectClimateProtocol(KEY_PROTOCOL, @@ -1066,6 +1165,9 @@ void handleAirCon(void) { "
" D_STR_MODEL "") + htmlSelectModel(KEY_MODEL, climate[chan]->next.model) + F("
" D_STR_COMMAND "") + + htmlSelectCommandType(KEY_COMMAND, climate[chan]->next.command) + + F("
" D_STR_POWER "") + htmlSelectBool(KEY_POWER, climate[chan]->next.power) + F("
" D_STR_SENSORTEMP "" + "") + + htmlDisableCheckbox(KEY_SENSORTEMP_DISABLED, KEY_SENSORTEMP, + noSensorTemp) + + F("
" D_STR_FAN "") + htmlSelectFanspeed(KEY_FANSPEED, climate[chan]->next.fanspeed) + F("
" D_STR_QUIET "") + htmlSelectBool(KEY_QUIET, climate[chan]->next.quiet) + F("
" D_STR_IFEEL "") + + htmlSelectBool(KEY_IFEEL, climate[chan]->next.iFeel) + + F("
" D_STR_TURBO "") + htmlSelectBool(KEY_TURBO, climate[chan]->next.turbo) + F("
s{o$r{kh-Ohqme-vO^iVRapHJ#~Waz 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

&lM=+%bvr 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

bhG;=;?fy4BdB@qZ)!#oH6tf$Qk}b+R2SsC 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%0D))|?~k1VWFo^Nh}66NKH{DJrwp{Ok&_s<%22tm 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 z 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�}olo3X`_sseQUXptJvHP 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 z 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

AU1co;7^Lyj$c&8>9RIUUI$0?o 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%0D-g&QKx3Xe<(U{obev^ZvOz^ZFNT-ddu8 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

  • 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ξ5zqza`2U7N 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

    WJ?93M~_gIu40Dg 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%0Ag!a%I#WZw62EM<41uPPN;fmT|Zx9PHGrvt~1D zk%xV>srz7a1?@;}8F`)#LRp1YiexPrn=G(f|7l`o6IOO2*H(7&B5ohY!^E?RYT*|} zcj}%?bjY2ta4fTNZWc2ixSu^gy2!MK)rM9{H`hDqnZL}uozKJ>xVtVB@DPSP!NEke z4o>S_W_a}@Xw!A!*LUep7SPWNdqY|>iO`uZXm_a2LP6*9p?W#3&Q|gUZSTK3YOWe~ z^jJB`{*LDEzeXaprf67lpK*7{+B-si=Xo8HQj||JkroiF=Y8o9-^CYU8=PmQf1;oC zpowPi41C#YwrqBxT~R&{5V%DDS#i2r+EIjaR3R}ng<|j(hA~hz4h0Ft7MhLAFpbp3 z$;$lnS&g(wfvP!VY0vG1F04pu=E+py+b{nZ&inD;P58(Y8T`OAXw##unO@7@<{)a0 zZycr}yj1I0oyZ4w2GbL8p_Wl$FZRc?9p7Co@$95m{pMRz>y=7=$N3InACAL}4*M5P zPpw!{$wUF%rsLxi;(Lh-o}HTR&j2%;n(gYvzXwX$d@^$KZuj=*ys&?PpW(SHR7*Rl zu2@y$VJdJNx z1}ott-XM2J1}yHm4ID4G^E>8w=MhV+Yy0HytPma3ychSu!7D-3sPcML_Vt^kDfxlq zNm`m(^m@`mSj0{`E7umLwjhjEQ`q?q=ibxdg+jS*cj-H>2~IDDQ7l$2)mHK4UZ?tE z*sP7_QJI9CZxPL|-bMn~--xY|j|Nv|QL{386wcha}xrCC!7d18%@UUfK0 zIHnPyvP7I2W0b9HC>cwsmN27iuIHxp14}^q{&hMs3esYc#>Hr9Unz$bvOsrs6ou`* z8cu^|{k~|H{XkYKGSJH$-Uv!;a<0N6|N^n%swK z@F6MY%;?gqDWoo&`6n|>-81wjGq8<_s}KCpe6F#>m=`nN>745+@YlM*qoQ9J0lFyA zJ_DEKdG&l6zduyyp3KsO)MImN8RQ8f9;U#L{T;nKXi~^xqwWEjn2q*Jr}y?k*;7}( zWj|e9K0>p1&mExqsu(tT{`=ZoXC7_n&vvxVXbpHrWagzYV!ZJWzA#LX@5V%HK-Mo( z)L_;k9^^-?f)Jr~7ck3TxYW3yTT}Dxeil`Ksf4IZ(EzgsvQB&_Jp>ZeMQ}nmq)J*p@0mY>_DGY`S#wF4vJ6W3>u!sF+P32PA zVVPn#(UJofhvM;o-*9+rcvxa|xb|y0yKQtYQ%jS{`fm^MtRgcTcY2tKvmA3wb>8MC zpJAR5<4O6rJ{Tj7fty78Mn|-H)rE0wyIMc`<`I2NMegSH`0koxgq9LFb}C?pLWWd{zWP6A_+gIa?i zqlI-`gR9uMb9*Y$t);o=C9DG5U@-DhmCfm_W@+qNIx5;HN*z@dUGs_xZ!`H3IM&vh zIHlc4WZTJQjvU8SG%Ci9)Hsf4vmAOAqQ+WlOz;>I8n>tPsn>{%t`3_bQwC<(FxeYD<}-%x@;CO4=$-rB+96A$)xk(6}5f{TFvF*Y;mb;IhSMgalP~ zeqx1Cjxc~FZ$X4Qx9sre-fe+(DK=u}n7pQ5#YDbUzqahmxVmhXgm$pmW)%pi{^-V{ zY?Mr##)ohOryx$mv3;L*UWn@WXa58rYeWAFAo`n>n55|6V0T4ZYkiyljCTLT+y7^@`@bUa|2N|H6RofK ze}~v=$FErgGW>;h*Rr8UTX?Le4V7;~={SUM^ahd{AeA=^JrAHad~P~7MI~kkc)QuS9onDjGus}bUCpMF$HH#u&zw9mLf=2A0iS_`ujaGa8NVcjfCnO> zDN8nit5KD8m_}?91&jcH9~$IhS+HWU746sVk=leA7)8{c6w0HX$WJmX z2df41g7X@F#G#pwR~Pl40M#{y4EEAX(o^YpL8?$3{2ixG>=UGdZ=dfgjttix z;^o=@qF?+EczO2!Mz{Ful+U~Q54=18`A)#X0Dz-20ubp0%*@OLj4TA21groA{3nS1 zv*0fR=>L)@U;?!L+_VXp0X;JP)fY26pwmy_`sc>Z#002hVf;*= zxO*06Kqa6M`txdl3ii*$28f7-^B)y|o$(h!pMdqV?Pn*S+0QoG1gxB&>9bQd4nXB6 zrXLUz^gs81ok@F)JG`tve> zH~qYVHUSe0pcBCMIb{FAAoy$W|NFxE_Y8u6w^sf=g#du+r)2@~2pHJ`VKOqYGyQ+0 z5U{iT8wvpnfR6Jo6asbtec~^ggP6G$fC|C_;7k0MAGE(p{=Uh-f6&aE&Lcq+) z#0j_>pc5x!2f*G+-^p0S7(g*H{$v9Ele6LmeA)@&rQH9_&*M10w9ekXw66I~wuAx# zwZ!6)f=1w!NJJD$K_yxZNknyDrH3vL0s>A=6%LkUiH@p(u;=4Za(uJSEW4b>!mUcbHESJGa9*88QY{a?s?Wh&TB=hC0T#BEd(2Im{8hs*- z$#r04w3ygur!o*y_fM9?R%?2-aSoDDrQ3+-eTTWyVIQfW(6I+Xe7np3Y7n}P>T@I5 z)2Yv&u{7pl45T(yg?mVX(3K;6FYl+AP=44_u9MS#Q!d?oTf*H)RmiXl?wi&6{q@#M z3ra#!PpG(x^d_^shiLUX*1*|Z-e0`d=ZTIbb7S592%|PaV~W3@qw)J6*!lUssd^@2 z?QXw$JMZ*gCRxHOlab?h3p%#fg`x^S-6FS0ena|}o)Vvskign(YKes3E9!tR^~;$L zdOebyGk?&QUdTxIn=T1RUOaE#proVvq5!HFv%5wQuU@7Ts5((4A@QM?16s4c^cQ79 z@1jd|#Sl}zo;QZT96MGKfi^@tNO=e|Ff|}pKR!R69xVaf5k8>Bp5r0ExbF0dL>Us? z!x&Ab^e;e+^Xyv)#~d+g2=s;zW)p+$p_o?)qY15jJjuEt4t!|a>i1(5yWI8@J>>1_ z6bN+(;c-=>yelo~vvh%fUT+E!--uR&XZ3Fl3AUL66#|VRZ{&mTvZ7W(eGax-=R#pZ zL;SGux4%*WK?`7xP)`n~4K;6NZ;=GLz#xDF$$^N1?~8Rff>NUCf@3I(#kG@+f8?e zw~h8QjD;!ITi}?nYt+BoMxTok{2f#0gk)vt>#8_&&p;XKxwOnqOsx4(y@ajU+RQLe zRb)%6q`?*)8J~G5Pxuv_*b;PP9>N_T>2&Yy?1F?+o>%rH7#E>I_kg|%j)4=^cGwp5 zS^gUyWI0&;GwKt6ZnlMh?(7}OCg(i@l#_`$7Ks z(kbRW&+&Af3zH*ZFio_VSb&FLNWVHhhJ<*mdYW7Ee&)88RS%DqL?@h{KFEX zeUn@yV~nbi#rlfsv^G;FEa9~&t5C0|rd0{-N4YKA5uy!pFF!7Sn8b+}SN*29jo=D7 z1MS>jPN^R7-n#_Q7e&e<0aa~vsggo>$O>y+s{#KA!vKzhxRh$F9 zi#S}FL!5^6;Ed#}V}0aqNID+h^>2!m8**%csPrGln2?80WQcSIP+s|Vt$e_n+>>IP29=#u|VHlCq*3*p|UM}1nv(M-> z4-NcX7Jc&F<`cs15Frzqq1KP4Yed;EGEt(LMYS(WJy%G9(mu+>9qD&a@?nn%J!*+L znNU%X#Ac=-*Eh`GxDi)XBDmP{bR%XVHwo>)%tuj$UyN6KWDt7nz6@LMX;O^!j0fRck2R|VXKfbcB@7RQJx~kW)fHA}XH~vEO z*=S=W^<}7xkF$;>;k-VMqg7EnPhTEmqQCYq?zUyo)8DJtsUvq zc}%r*ziY;K#%+X^$MP1wv{jT*slC2FAa5nf{rspw37|b}g>I;ht}pUmeKwMlxo0Pg z;8l||$9AI`cvYYtv5c>Q-Sb~738-sHWMATRzYPrGkr*;`AzbbxL%A(%g$=2+JIypKy7MIM**RQ(D^Zt=n4ppL>XijfyJT;XaMaA zW5kqt5=0GSq3(k?1W+X=^_A#(x27iw@~IoiUb4;-Uyz`=OpFvv5aACxdhj&kKd8Uo z<6jk=-Ym%{Uc^qdpg)2ArpXzarw*>Ly?#4fu~JB8aF5?>HSm@FN&bSPIT$Gy{`A!r zgMH_2>6IT^lrOAKdLRdb-frAXR#Dsb@!OGg}t*S-LRO}wNLNXq0e=09|e~&msG`u+O_Z0b%dAh z={V9G!sB5_KV9XckEoeH2#maVvT~AiOM=uQw!M!nZ(sO}qI*PO{x%rS8+K-!ZXG;`e z)b*L1qHrieAebdC0flbps7DzWQ4EylaPg)OqP}8BLK?Q4g=7{Oa>VDZ|9h;9R^~$xW=%qFvl|)$bgUE8!KyD zHYyF!hiA$s!vB-uWth`};3-UJ{S^x;c<`*qECGFI>IG>rkQ`5zGcK-g?;hW&EfGj^@ zYo5WWa|1kPasR|=_=8RkBTNb40VC6%Y}F;{Q0>fwd()xj{&c8am=5*9On4ljj1WU7 zLKjrH<3v#9!L$1^`~Y(DGHO^l67P~xsTjW9v}~rhseX^5wd}7B%8>ioG@OPAhZb+g-OC%;X2_4;TGXG;SS+0;XYxrutj)WctY4IJSFTBUJyPI zJ`z3_J`?^&_?z&Ja8&r&eVh9Z_j>nz?uXouxVN|;ckgsR<$m7%qI-|~Rree2x7_cz z-*bQDKIHCl|KL9A{)hW#kJ;n$w0H)4#&}vi<2`MjC7x}br#;Vjp7lKM+3nfudCT*T z=VQ-jp2MDQ&$piMJV!joJqb_JtMQt=Hm}|5^18iVug~lEhP|cUp5A8fecp}UO+MbI z@a6jazOb*rSLj>j=loK?&TsG={dT|GU+C}WpX{FzdhMswuUskxDrVH2rem*2$M^nA zI^Ozk>3H{V==hBc9lvu59q<2_bo{kQ$KU<|9sio4V?w1=PSsQ^(y@`csh9d`kQUJr zk&er073jEz_M&yPfi{VB+*hRIL39KiNk`MMbRwNhr-F_b(j@P;Gb>HuP*uBBM)xFLAr2A?23+~v+@jPm(vmusTAw;X>PZ8% z@w2!YslTTtroJapJarf9JDh4luV-^ZPW_E7qn%enr*Tl{TyGD23-!-iB-mU?i>$>`M-rd#Md1qJe&fB|scCPK}(Rq1S zMdxK*eY;w^nz|ag>brV()pgZ&_3ElYp7#sV>FJ7fm3QWLMZ1bS6kdBq+3e32 zf9^VX%dF{W;*X~XuYWn-OI&NUT`O-HK#RYrYEOMy^K;T7SJv2d&|NS2BKc$c9l7HAs@=2zjzod?m zXCY7isHb22hkZr&fWr@Q(xzPOukp10-UCekQJ+5*t%Q@c(#R$z85q%A;Z`K9f>tgV-| z@tAFQnl+cfdzOM-z~yq$`eZF_{wH0X*_)a5l(99Ljma#_{U@x-tToB3NM<)?^zGB| z2Q3R)R4+yq(3-wT9YIW7jiiXJN0N_waZQqH+%dQdrG80m#dT}y_0-!)v1Y)4w0l$g zaD5%&e}i|R`oH>N>&o;0%XRe?^x7(MUF8BZC#fUN;TUC{>*ZA$~N>f#u zqS{a4%xUjMmY%>l{+UKVAEU|6EOm&q(U)w*JCpX!Fux3|ARfFTh=7Bsi zfOqFWYMMzdu@Eb<5j$}ZC$Q(ns`BD2sGkI&1%yD05%9x&Qa}nx5h=!;MZxvUu<~N0 zf>eT1VSB*>>xt8(wWN;phLsa14Vc*`(o9-NAJUifBmKz$GLQ@+gUJvwlnf)o$p~@= zynCZSVPnWx(n`jW@niyNBNNFaGMP-lNTyPb@?-{;lC!{y-ur9tCR}4Oezt0j*_C5K%dFp z_VDC(Aspz}ubABjrXXR;DG8I?y-4bFdYN`Fdu|G{PAeHl$uoabGM+9OKT(qEy|tva zxX9ZQ@V39v9PoC~al^+Vesy!8)!W`J#s`b>wPIX@xX*_Nye-z5&E9r8+1t|IXVJ{n zEt8vzi|EccCS6%v1Q#nPNX05{Crwk9%(Nn4C0g3;f##NWTL5w7@u8L})7ys)AKTLG z@cCMci`r?^w7}GM5@>AK6=oi1&v{XF#8|XlTr{g4{U=wcrw68A)e$FCC$rd;31i#& zDXs0?WY&hEu-y`9Zns?2Wj%SDjkT;fC9|Ci^_enbb)WY57wxnz?d1bfb{01jH?Xjm&$=`n{?A|1>2L31p>^r*g9rzXIDr?+S_H`~3_ z#6|+>YY%pr(Sxj>)&uCnPb1_#C)_%Li&Jr^-+R}3UnVnJ!MKJMH%@@icDo zi;z&@L#&|4+Xubw!{*Jq+Pk{{^wr)z-kF$iAtZ*#n6bJwis76wb{4K9$NJjit&S7X z8Lh27QBNVO2allm>Q>Y+J5vKfF)5lrp`xOJKv8(u*x_T_mp41wFq9Ke@H>vjbr(1`#iB})cEq0J1t{CR2%rmTkRa zsOMSwAhZGv{Dka!SzPPY9Pn!Pdo|a3HOsu3XX#ZC>Kb~sc%^aeFwKXA2;P`p2^d67Z9`9a)6nFIz`$^fZ|1r8rVSF{0%p9|-W!OGvXAE~ceocp)tn^Do#M&BtTs zZS8$Gg85r}cLE)AaHf9);ug=x(TSdqdJpjIMh!2H?DRYrJ=^nSk@&zP%}=vd$ivu6xjnA( zJP^IXbAR+o&%M3H>~%4*zMDsi!AN^ht48KgKl;E>A<$<*DoahNo9EMzYmY!ye!2 zsYo|oULp>!toI;KA%-XH@Dz+J^Z3yujTd`Hoh6$j8zrljRmw_bVOdD#mbqjmxlyi{ zYvpRWQZAQE<$@e^D>rqd4#o?anrxE70YQlr?kY+IF|NnzpjbofN;oR#Kw3=pw9~6| z7u8$qjlB&ueVTvgGFeQV++6s3Kd$zh!FSs?xLVuGStR9Z9oSyU1pQ9>KeVf*c_+4< z5VYdnNB^f~gqZGYZf&&=Y#%giYzO_aWmX3=W=(02v&=7%0DS=k2DXnD>mm6_YTijk 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

    W-Q;aa(FIDG#6L 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 z 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

    gNnyX6-@6TtOn7? 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%0Dt=PX^CnR#`9&YEfrwS)8(a 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

    mJYxR4A0-N_fi_aT}4bz8NHT)mv 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

    -C!@eesTEs?OJAU1>?=i9i* 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

    }K)*=4 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%0D<}=Q8BcyY3S^)4pyRrR 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%0A>JU&e znxNvEnwSNXKhkq?37)BN0{=H6>SON40|BlaD|zVotzb()!LI*i>g+g=9jt2 zFEM?bA{7FY$`8v=Hv+lwG$^?DZsNqV+h)jE*hvawX$M@83{xMFnL*PeV8?wgfM5ig zh!r~Gom_>B45=zhtmeIe$#t4GL7Fz1I#f&Le&kC32A`Lk|J=9bJ*N8W(xcnNR>RK; z<-QHmD1%h=q@S!_jWRG@1HTawI*g)^f-4aim^+m>gQ-H}Rg zB=H2}lRp*BK?U{kLz>ts!Inws82BPyCJwPFz4*nLP@B()VdYnA&Y!gT>mQBEQ4Z?7 zV{+O!^BwTVL2}nLJJEy{KU%JEilhbEiFUW~C#rI1id z>WF*}HZck+0XjvsDsLtoO&6R+Q|i_!aYC3tQXID9=@7$f0| zHUZQeIOAYpI|Mhw3FTn%R-aE#59d3CfhHWU5@c=_gC9QNmAbo26g-1fyRwbKL0~l~ zAJ23Su9#uZ7c(rCw%Zle;2Tp9$)ImEygDDWX4!MnHRTnFVIbuxgDdhe(jCe>mFtc9 z*Ve?48ZR_&da+GH5!YnQS1^a=s0I(lM8<=9#&?41XtmTeBqoVFA76l9GLHmPJonXx z>ih!u22L0w-JYUvlHWaHej&jYaW-1E#TI^ZBi5RmuX?vSKLN;&YteHK8@^q5fZ`#F z{WE0qZckkpi2GGgGK2HTr5=JH^#{5whHrA*cZr%TuOL=@KiZ^TP(OgI4^dx&v|;*| z#EgwS)HnS2?QAI=D_T5J&8t>Lk=9VQ;cHT9Zy4)go2y8`yLZmf&1 zvyyuS{}*lN_}od;HQ?B`ZQHi9u{PK^+1R#i+u7K*ZQJ%Q)|31FAKni$Q#I99=X6h1 zSNGKE>q3j0!^-`aAY89Ttl}d<*sC9jNcVw;xnF24!x;6aQ3cm1ug9FQw?8F8)0wxf z{DxS8B|P~6i4xiY(t7dqfo2^$FCGQP1K!UyMtfA%kVNV=X1_sd=6E1Vg&*004d*=H7-!@`8(ud@)g_G?~) z6eu_qteqlIE~p+D7sTz$CzOxesXHSuL!hjqA9Ah%pSc@`#`sAlY1Dgcjnlc@)4Fbb-_iN+uuJC$=!p*iBqH7G`wO*5Htb@N;h~INpIHvp`8; z%?K)VTz{lDDVX{Wad|I#dozyh2{fHh3{Wh%(0Rxm=HHKu}_$mh+v+ceq{SE;V@VG>rabgc^_ggJ-k3p>l)@@Luxb(UQNlywx^ z0G`ATJW1F!8otpPbEj}lu+2xO+9t3p7idd;5%Cd3a3tc5D((jjHyi$~Yy&cm4dm

    ldQfMa<^;SaANLJkBm^`MtF@wrBMdQqLM%#| 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

      ;IP_=@ZR3 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

      7?g~PAYia3k$Pm*AT~z!) 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

      =L3l$@vU1N|B`ND5OUmSgQ)BNv*Vo+09I@8 zrtmw!I+tImF86MTLsHn2bvdrhCu@ZGF(uR!Tx>;Oi@}`iTDVXhl92eggU%fN@cR+U zu3>mjVR8pX9Z{VgH>EkadHyY<5H!qlU2cHj;80EORf^IO^&mVqf>WRsrc=|<1>GUc zlt;6|RGdEpmQ!MG2n;urQ>bTJ?v4=js5)Fr>tETx~@jFjN-inHKrpf{XwJ72*nY4Ag4-*x`_PZEb&&CJF zW~L95W5WX4r*s&&X=ax5QH3SdEdz@BYn-z)U)yWz`fE+?nea_n z)h0{IGfZ($i*5WlZ`?X^h!i<`Gs1o@aEysL>o3#w#||93>y0o~4m0~S^!j`6Pq=FQ zP@AwwZA4p~ZWd=e`7W-Ukm4VRCB9~b#6p1L7;MyFl)V>zEH-#*N$5QLgRpj5aEDRb zx9?{EXA+bxOX(ELg`1YOZh-A()SN70a(autn(pS|;mWq)3rj9(MTuBQe)WKoHec%i zlcioe_=uLmc*qJ;__i%(5HBcv$Lbw{#P&a+s_*qz8R+c>WY$OZNlD6 zfmSV;vmClHrMt?*Q8P4!pnT<&-08yncg%GY<+ZY9>#3C|4F2L4)PS;zs}f7|yE4ex zw;!ph>e}tO&(F|A&maOu&YS4~ANDO}e>(NrSR&CINYxM(LWT>KUP!ea=*lR!ZDgXC zOJ4o*;M0I5vzm{z_LDu94CM2r$efPr`8Mll2tM#v=OGIP!^HO{7ZWt&q|EJ{p{~nIu`X>*( zF5JImr`M8^*Z3y%-*AMIt+j#8|3XJ_{cnlS|7rP`Q~!@f`@a*Pe=573OdLMN*;WQl zCL$(Aw#FvJpZab`CkGP)YdAMh-T3hzfnPC#9{5F*&kXJI6wL$!nF}}b1peHE8afaL z;t4xpb$BHt93il7`gt}VkndCS)lZh=swaClX*$={7_cr+GwWxP&d<8D!cL}sa+6tp zC6deJcl$QlYUx@mV`UZS12girnre;JAyj-1w>XQfv%6xBrpOybNCmALFT&_)NoNVa z4AP+h542|)nW2SM=UQhAgU&1N3+>yMwSBK)Z2^O1C7QE_g``yDY4IKx;>w+m)8xjt zohEvs>H@2yHKRMmRGFx^GOiHoVp zj{S1CQBakbiEkq4H4>@U8+%JgY)f0+wbmcPcq z%uLM6_SaZAxrkXgJ}<}4#6-;bS80_XTzTof7$XcIkhP@PDR6{?nlTXH4Xi+@NRuWJQ=bKJUrI%)$JBhl#MTF#QKi zgqel?-!T!6&q4ZMFp>Wvul^kq`4>gR%S+7o->)F9PsjcNwEl&Ou&^+HW&QtviM0R4 zMD7K&oG;G!){f4dW-OoY~ z8qX1b2BIKpO1ml5xmhf1SL$is5Rp*qz{YjfRXGYRJeQi1cs_Z53!KDu(yP&U3EC$6 zRt#CFbAvs8N)AZkmy?jCAi>2yV9@X$9v9V5jhi^PP337UokfxKLUfM-t+C@dX=ki> z$J#mo*>l{lOmDv}_<>5Yqenq5p4#p<;oq9FK}|&tI2*3WYIbNosW@+;{q}n*do!~+ z*YRrXH$@|g;kvX$OJ-Haj`-cUHBV8Y8lVWO(CI^P90Rt~W462I@K(9e{6giR)@lgA z=vSI4f?DXs#m&d93pA^tEWu%@f!08%kdD1#PuvY9>I{HY^knb}g9#kDN97nDr!at5 zy^`JK0)6luzNR;>ZwrqslpZ3mflq^@7Jv2F!Y+U^S?_(r*#y_YL`AWMAb|P{w&%=Urlx> zPS*psNo>bt2jZ@=vD6fG=nAsOPW*-V6x@0hhJ_lk7^Huw@*CiQbS)exh7MRBhr9

      ;%k+{9Ud3Hmw!#JaO8F+T3 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 E0pLuWaR2}S diff --git a/lib/lib_div/Adafruit-Fingerprint-Sensor-Library-2.0.4-Tasmota/.github/ISSUE_TEMPLATE.md b/lib/lib_div/Adafruit-Fingerprint-Sensor-Library-2.1.0-Tasmota/.github/ISSUE_TEMPLATE.md similarity index 100% rename from lib/lib_div/Adafruit-Fingerprint-Sensor-Library-2.0.4-Tasmota/.github/ISSUE_TEMPLATE.md rename to lib/lib_div/Adafruit-Fingerprint-Sensor-Library-2.1.0-Tasmota/.github/ISSUE_TEMPLATE.md diff --git a/lib/lib_div/Adafruit-Fingerprint-Sensor-Library-2.0.4-Tasmota/.github/PULL_REQUEST_TEMPLATE.md b/lib/lib_div/Adafruit-Fingerprint-Sensor-Library-2.1.0-Tasmota/.github/PULL_REQUEST_TEMPLATE.md similarity index 100% rename from lib/lib_div/Adafruit-Fingerprint-Sensor-Library-2.0.4-Tasmota/.github/PULL_REQUEST_TEMPLATE.md rename to lib/lib_div/Adafruit-Fingerprint-Sensor-Library-2.1.0-Tasmota/.github/PULL_REQUEST_TEMPLATE.md diff --git a/lib/lib_div/Adafruit-Fingerprint-Sensor-Library-2.0.4-Tasmota/.github/workflows/githubci.yml b/lib/lib_div/Adafruit-Fingerprint-Sensor-Library-2.1.0-Tasmota/.github/workflows/githubci.yml similarity index 75% rename from lib/lib_div/Adafruit-Fingerprint-Sensor-Library-2.0.4-Tasmota/.github/workflows/githubci.yml rename to lib/lib_div/Adafruit-Fingerprint-Sensor-Library-2.1.0-Tasmota/.github/workflows/githubci.yml index e4395824e..04285ca58 100644 --- a/lib/lib_div/Adafruit-Fingerprint-Sensor-Library-2.0.4-Tasmota/.github/workflows/githubci.yml +++ b/lib/lib_div/Adafruit-Fingerprint-Sensor-Library-2.1.0-Tasmota/.github/workflows/githubci.yml @@ -5,7 +5,11 @@ on: [pull_request, push, repository_dispatch] jobs: build: runs-on: ubuntu-latest - + strategy: + fail-fast: false + matrix: + arduino-platform: ["uno", "leonardo", "mega2560", "zero", "esp8266", "esp32", "metro_m4", "trinket_m0"] + steps: - uses: actions/setup-python@v1 with: @@ -20,7 +24,7 @@ jobs: run: bash ci/actions_install.sh - name: test platforms - run: python3 ci/build_platform.py main_platforms + run: python3 ci/build_platform.py ${{ matrix.arduino-platform }} - name: clang run: python3 ci/run-clang-format.py -e "ci/*" -e "bin/*" -r . diff --git a/lib/lib_div/Adafruit-Fingerprint-Sensor-Library-2.0.4-Tasmota/.gitignore b/lib/lib_div/Adafruit-Fingerprint-Sensor-Library-2.1.0-Tasmota/.gitignore similarity index 100% rename from lib/lib_div/Adafruit-Fingerprint-Sensor-Library-2.0.4-Tasmota/.gitignore rename to lib/lib_div/Adafruit-Fingerprint-Sensor-Library-2.1.0-Tasmota/.gitignore diff --git a/lib/lib_div/Adafruit-Fingerprint-Sensor-Library-2.0.4-Tasmota/Adafruit_Fingerprint.cpp b/lib/lib_div/Adafruit-Fingerprint-Sensor-Library-2.1.0-Tasmota/Adafruit_Fingerprint.cpp similarity index 89% rename from lib/lib_div/Adafruit-Fingerprint-Sensor-Library-2.0.4-Tasmota/Adafruit_Fingerprint.cpp rename to lib/lib_div/Adafruit-Fingerprint-Sensor-Library-2.1.0-Tasmota/Adafruit_Fingerprint.cpp index fadc5a164..d48545df5 100644 --- a/lib/lib_div/Adafruit-Fingerprint-Sensor-Library-2.0.4-Tasmota/Adafruit_Fingerprint.cpp +++ b/lib/lib_div/Adafruit-Fingerprint-Sensor-Library-2.1.0-Tasmota/Adafruit_Fingerprint.cpp @@ -64,6 +64,7 @@ /**************************************************************************/ //Adafruit_Fingerprint::Adafruit_Fingerprint(SoftwareSerial *ss, Adafruit_Fingerprint::Adafruit_Fingerprint(TasmotaSerial *ss, + uint32_t password) { thePassword = password; theAddress = 0xFFFFFFFF; @@ -413,10 +414,64 @@ uint8_t Adafruit_Fingerprint::getTemplateCount(void) { */ /**************************************************************************/ uint8_t Adafruit_Fingerprint::setPassword(uint32_t password) { - SEND_CMD_PACKET(FINGERPRINT_SETPASSWORD, (uint8_t)(password >> 24), (uint8_t)(password >> 16), - (uint8_t)(password >> 8), (uint8_t)password); + SEND_CMD_PACKET(FINGERPRINT_SETPASSWORD, (uint8_t)(password >> 24), + (uint8_t)(password >> 16), (uint8_t)(password >> 8), + (uint8_t)(password & 0xFF)); } +/**************************************************************************/ +/*! + @brief Writing module registers + @param regAdd 8-bit address of register + @param value 8-bit value will write to register + @returns FINGERPRINT_OK on success + @returns FINGERPRINT_PACKETRECIEVEERR on communication error + @returns FINGERPRINT_ADDRESS_ERROR on register address error +*/ +/**************************************************************************/ +uint8_t Adafruit_Fingerprint::writeRegister(uint8_t regAdd, uint8_t value) { + + SEND_CMD_PACKET(FINGERPRINT_WRITE_REG, regAdd, value); +} + +/**************************************************************************/ +/*! + @brief Change UART baudrate + @param baudrate 8-bit Uart baudrate + @returns FINGERPRINT_OK on success + @returns FINGERPRINT_PACKETRECIEVEERR on communication error +*/ +/**************************************************************************/ +uint8_t Adafruit_Fingerprint::setBaudRate(uint8_t baudrate) { + + return (writeRegister(FINGERPRINT_BAUD_REG_ADDR, baud_rate)); +} + +/**************************************************************************/ +/*! + @brief Change security level + @param level 8-bit security level + @returns FINGERPRINT_OK on success + @returns FINGERPRINT_PACKETRECIEVEERR on communication error +*/ +/**************************************************************************/ +uint8_t Adafruit_Fingerprint::setSecurityLevel(uint8_t level) { + + return (writeRegister(FINGERPRINT_SECURITY_REG_ADDR, level)); +} + +/**************************************************************************/ +/*! + @brief Change packet size + @param size 8-bit packet size + @returns FINGERPRINT_OK on success + @returns FINGERPRINT_PACKETRECIEVEERR on communication error +*/ +/**************************************************************************/ +uint8_t Adafruit_Fingerprint::setPacketSize(uint8_t size) { + + return (writeRegister(FINGERPRINT_PACKET_REG_ADDR, size)); +} /**************************************************************************/ /*! @brief Helper function to process a packet and send it over UART to the @@ -559,6 +614,9 @@ Adafruit_Fingerprint::getStructuredPacket(Adafruit_Fingerprint_Packet *packet, break; } idx++; + if ((idx + 9) >= sizeof(packet->data)) { + return FINGERPRINT_BADPACKET; + } } // Shouldn't get here so... return FINGERPRINT_BADPACKET; diff --git a/lib/lib_div/Adafruit-Fingerprint-Sensor-Library-2.0.4-Tasmota/Adafruit_Fingerprint.h b/lib/lib_div/Adafruit-Fingerprint-Sensor-Library-2.1.0-Tasmota/Adafruit_Fingerprint.h similarity index 80% rename from lib/lib_div/Adafruit-Fingerprint-Sensor-Library-2.0.4-Tasmota/Adafruit_Fingerprint.h rename to lib/lib_div/Adafruit-Fingerprint-Sensor-Library-2.1.0-Tasmota/Adafruit_Fingerprint.h index 604386f63..b64c3207c 100644 --- a/lib/lib_div/Adafruit-Fingerprint-Sensor-Library-2.0.4-Tasmota/Adafruit_Fingerprint.h +++ b/lib/lib_div/Adafruit-Fingerprint-Sensor-Library-2.1.0-Tasmota/Adafruit_Fingerprint.h @@ -87,7 +87,40 @@ #define FINGERPRINT_LED_GRADUAL_OFF 0x06 //!< Gradually off #define FINGERPRINT_LED_RED 0x01 //!< Red LED #define FINGERPRINT_LED_BLUE 0x02 //!< Blue LED -#define FINGERPRINT_LED_PURPLE 0x03 //!< Purple LED +#define FINGERPRINT_LED_PURPLE 0x03 //!< Purple LEDpassword + +#define FINGERPRINT_REG_ADDR_ERROR 0x1A //!< shows register address error +#define FINGERPRINT_WRITE_REG 0x0E //!< Write system register instruction + +#define FINGERPRINT_BAUD_REG_ADDR 0x4 //!< BAUDRATE register address +#define FINGERPRINT_BAUDRATE_9600 0x1 //!< UART baud 9600 +#define FINGERPRINT_BAUDRATE_19200 0x2 //!< UART baud 19200 +#define FINGERPRINT_BAUDRATE_28800 0x3 //!< UART baud 28800 +#define FINGERPRINT_BAUDRATE_38400 0x4 //!< UART baud 38400 +#define FINGERPRINT_BAUDRATE_48000 0x5 //!< UART baud 48000 +#define FINGERPRINT_BAUDRATE_57600 0x6 //!< UART baud 57600 +#define FINGERPRINT_BAUDRATE_67200 0x7 //!< UART baud 67200 +#define FINGERPRINT_BAUDRATE_76800 0x8 //!< UART baud 76800 +#define FINGERPRINT_BAUDRATE_86400 0x9 //!< UART baud 86400 +#define FINGERPRINT_BAUDRATE_96000 0xA //!< UART baud 96000 +#define FINGERPRINT_BAUDRATE_105600 0xB //!< UART baud 105600 +#define FINGERPRINT_BAUDRATE_115200 0xC //!< UART baud 115200 + +#define FINGERPRINT_SECURITY_REG_ADDR 0x5 //!< Security level register address +// The safety level is 1 The highest rate of false recognition , The rejection +// rate is the lowest . The safety level is 5 The lowest tate of false +// recognition, The rejection rate is the highest . +#define FINGERPRINT_SECURITY_LEVEL_1 0X1 //!< Security level 1 +#define FINGERPRINT_SECURITY_LEVEL_2 0X2 //!< Security level 2 +#define FINGERPRINT_SECURITY_LEVEL_3 0X3 //!< Security level 3 +#define FINGERPRINT_SECURITY_LEVEL_4 0X4 //!< Security level 4 +#define FINGERPRINT_SECURITY_LEVEL_5 0X5 //!< Security level 5 + +#define FINGERPRINT_PACKET_REG_ADDR 0x6 //!< Packet size register address +#define FINGERPRINT_PACKET_SIZE_32 0X0 //!< Packet size is 32 Byte +#define FINGERPRINT_PACKET_SIZE_64 0X1 //!< Packet size is 64 Byte +#define FINGERPRINT_PACKET_SIZE_128 0X2 //!< Packet size is 128 Byte +#define FINGERPRINT_PACKET_SIZE_256 0X3 //!< Packet size is 256 Byte //#define FINGERPRINT_DEBUG @@ -158,6 +191,10 @@ public: uint8_t LEDcontrol(uint8_t control, uint8_t speed, uint8_t coloridx, uint8_t count = 0); + uint8_t setBaudRate(uint8_t baudrate); + uint8_t setSecurityLevel(uint8_t level); + uint8_t setPacketSize(uint8_t size); + void writeStructuredPacket(const Adafruit_Fingerprint_Packet &p); uint8_t getStructuredPacket(Adafruit_Fingerprint_Packet *p, uint16_t timeout = DEFAULTTIMEOUT); @@ -181,6 +218,7 @@ public: private: uint8_t checkPassword(void); + uint8_t writeRegister(uint8_t regAdd, uint8_t value); uint32_t thePassword; uint32_t theAddress; uint8_t recvPacket[20]; diff --git a/lib/lib_div/Adafruit-Fingerprint-Sensor-Library-2.0.4-Tasmota/README.md b/lib/lib_div/Adafruit-Fingerprint-Sensor-Library-2.1.0-Tasmota/README.md similarity index 100% rename from lib/lib_div/Adafruit-Fingerprint-Sensor-Library-2.0.4-Tasmota/README.md rename to lib/lib_div/Adafruit-Fingerprint-Sensor-Library-2.1.0-Tasmota/README.md diff --git a/lib/lib_div/Adafruit-Fingerprint-Sensor-Library-2.1.0-Tasmota/documentation/ZFM-20_Fingerprint_Module.pdf b/lib/lib_div/Adafruit-Fingerprint-Sensor-Library-2.1.0-Tasmota/documentation/ZFM-20_Fingerprint_Module.pdf new file mode 100644 index 000000000..0fa776828 --- /dev/null +++ b/lib/lib_div/Adafruit-Fingerprint-Sensor-Library-2.1.0-Tasmota/documentation/ZFM-20_Fingerprint_Module.pdf @@ -0,0 +1,111072 @@ +%PDF-1.4 +% +1 0 obj +<< +/MarkInfo << +/LetterspaceFlags 0 +/Marked true +>> +/Outlines 2 0 R +/Metadata 3 0 R +/PieceInfo << +/MarkedPDF << +/LastModified (D:20100630165949) +>> +>> +/Pages 4 0 R +/PageLayout /OneColumn +/OCProperties << +/OCGs [5 0 R] +>> +/StructTreeRoot 6 0 R +/Type /Catalog +/LastModified (D:20100630165949) +/PageLabels 7 0 R +>> +endobj +8 0 obj +<< +/CreationDate (D:20100630165916+08'00') +/Author (dick) +/Creator (Acrobat PDFMaker 7.0 for Word) +/KSOProductBuildVer (2052-6.4.0.1931) +/Producer (Acrobat Distiller 7.0 \(Windows\)) +/ModDate (D:20100630165949+08'00') +/Company (Miaxis) +/SourceModified (D:20100630085848) +/Title +>> +endobj +2 0 obj +<< +/First 9 0 R +/Count 65 +/Last 9 0 R +/Type /Outlines +>> +endobj +3 0 obj +<< +/Length 4404 +/Subtype /XML +/Type /Metadata +>> +stream + + + + + Acrobat Distiller 7.0 (Windows) + + + 2052-6.4.0.1931 + Miaxis + D:20100630085848 + + + 2010-06-30T16:59:16+08:00 + Acrobat PDFMaker 7.0 for Word + 2010-06-30T16:59:49+08:00 + 2010-06-30T16:59:49+08:00 + + + uuid:663add39-bc2e-424e-9c95-c99314b7868b + uuid:c02e75c2-7f8b-4da5-9d43-f991617c46a7 + + + 11 + + + + + application/pdf + + + 封面 + + + + + dick + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +endstream +endobj +4 0 obj +<< +/Count 32 +/Type /Pages +/Kids [10 0 R 11 0 R 12 0 R 13 0 R] +>> +endobj +5 0 obj +<< +/Usage << +/CreatorInfo << +/Subtype /Artwork +/Creator (Acrobat PDFMaker 7.0 for Word) +>> +/PageElement << +/Subtype /HF +>> +>> +/Name (HeaderFooter) +/Type /OCG +>> +endobj +6 0 obj +<< +/K 14 0 R +/ParentTree 15 0 R +/ParentTreeNextKey 67 +/RoleMap 16 0 R +/Type /StructTreeRoot +>> +endobj +7 0 obj +<< +/Nums [0 17 0 R] +>> +endobj +9 0 obj +<< +/First 18 0 R +/Parent 2 0 R +/A 19 0 R +/Count 64 +/Last 20 0 R +/Title +>> +endobj +10 0 obj +<< +/Parent 4 0 R +/Count 10 +/Type /Pages +/Kids [21 0 R 22 0 R 23 0 R 24 0 R 25 0 R 26 0 R 27 0 R 28 0 R 29 0 R 30 0 R] +>> +endobj +11 0 obj +<< +/Parent 4 0 R +/Count 10 +/Type /Pages +/Kids [31 0 R 32 0 R 33 0 R 34 0 R 35 0 R 36 0 R 37 0 R 38 0 R 39 0 R 40 0 R] +>> +endobj +12 0 obj +<< +/Parent 4 0 R +/Count 10 +/Type /Pages +/Kids [41 0 R 42 0 R 43 0 R 44 0 R 45 0 R 46 0 R 47 0 R 48 0 R 49 0 R 50 0 R] +>> +endobj +13 0 obj +<< +/Parent 4 0 R +/Count 2 +/Type /Pages +/Kids [51 0 R 52 0 R] +>> +endobj +14 0 obj +<< +/K [53 0 R 54 0 R 55 0 R 56 0 R 57 0 R 58 0 R 59 0 R 60 0 R 61 0 R 62 0 R +63 0 R 64 0 R 65 0 R 66 0 R 67 0 R 68 0 R 69 0 R 70 0 R 71 0 R 72 0 R +73 0 R 74 0 R 75 0 R 76 0 R 77 0 R 78 0 R 79 0 R 80 0 R 81 0 R 82 0 R +83 0 R 84 0 R 85 0 R 86 0 R 87 0 R 88 0 R 89 0 R 90 0 R 91 0 R 92 0 R +93 0 R 94 0 R 95 0 R 96 0 R 97 0 R 98 0 R 99 0 R 100 0 R 101 0 R 102 0 R +103 0 R 104 0 R 105 0 R 106 0 R 107 0 R 108 0 R 109 0 R 110 0 R 111 0 R 112 0 R +113 0 R 114 0 R 115 0 R 116 0 R 117 0 R 118 0 R 119 0 R 120 0 R 121 0 R 122 0 R +123 0 R 124 0 R 125 0 R 126 0 R 127 0 R 128 0 R 129 0 R 130 0 R 131 0 R 132 0 R +133 0 R 134 0 R 135 0 R 136 0 R 137 0 R 138 0 R 139 0 R 140 0 R 141 0 R 142 0 R +143 0 R 144 0 R 145 0 R 146 0 R 147 0 R 148 0 R 149 0 R 150 0 R 151 0 R 152 0 R +153 0 R 154 0 R 155 0 R 156 0 R 157 0 R 158 0 R 159 0 R 160 0 R 161 0 R 162 0 R +163 0 R 164 0 R 165 0 R 166 0 R 167 0 R 168 0 R 169 0 R 170 0 R 171 0 R 172 0 R +173 0 R 174 0 R 175 0 R 176 0 R 177 0 R 178 0 R 179 0 R 180 0 R 181 0 R 182 0 R +183 0 R 184 0 R 185 0 R 186 0 R 187 0 R 188 0 R 189 0 R 190 0 R 191 0 R 192 0 R +193 0 R 194 0 R 195 0 R 196 0 R 197 0 R 198 0 R 199 0 R 200 0 R 201 0 R 202 0 R +203 0 R 204 0 R 205 0 R 206 0 R 207 0 R 208 0 R 209 0 R 210 0 R 211 0 R 212 0 R +213 0 R 214 0 R 215 0 R 216 0 R 217 0 R 218 0 R 219 0 R 220 0 R 221 0 R 222 0 R +223 0 R 224 0 R 225 0 R 226 0 R 227 0 R 228 0 R 229 0 R 230 0 R 231 0 R 232 0 R +233 0 R 234 0 R 235 0 R 236 0 R 237 0 R 238 0 R 239 0 R 240 0 R 241 0 R 242 0 R +243 0 R 244 0 R 245 0 R 246 0 R 247 0 R 248 0 R 249 0 R 250 0 R 251 0 R 252 0 R +253 0 R 254 0 R 255 0 R 256 0 R 257 0 R 258 0 R 259 0 R 260 0 R 261 0 R 262 0 R +263 0 R 264 0 R 265 0 R 266 0 R 267 0 R 268 0 R 269 0 R 270 0 R 271 0 R 272 0 R +273 0 R 274 0 R 275 0 R 276 0 R 277 0 R 278 0 R 279 0 R 280 0 R 281 0 R 282 0 R +283 0 R 284 0 R 285 0 R 286 0 R 287 0 R 288 0 R 289 0 R 290 0 R 291 0 R 292 0 R +293 0 R 294 0 R 295 0 R 296 0 R 297 0 R 298 0 R 299 0 R 300 0 R 301 0 R 302 0 R +303 0 R 304 0 R 305 0 R 306 0 R 307 0 R 308 0 R 309 0 R 310 0 R 311 0 R 312 0 R +313 0 R 314 0 R 315 0 R 316 0 R 317 0 R 318 0 R 319 0 R 320 0 R 321 0 R 322 0 R +323 0 R 324 0 R 325 0 R 326 0 R 327 0 R 328 0 R 329 0 R 330 0 R 331 0 R 332 0 R +333 0 R 334 0 R 335 0 R 336 0 R 337 0 R 338 0 R 339 0 R 340 0 R 341 0 R 342 0 R +343 0 R 344 0 R 345 0 R 346 0 R 347 0 R 348 0 R 349 0 R 350 0 R 351 0 R 352 0 R +353 0 R 354 0 R 355 0 R 356 0 R 357 0 R 358 0 R 359 0 R 360 0 R 361 0 R 362 0 R +363 0 R 364 0 R 365 0 R 366 0 R 367 0 R 368 0 R 369 0 R 370 0 R 371 0 R 372 0 R +373 0 R 374 0 R 375 0 R 376 0 R 377 0 R 378 0 R 379 0 R 380 0 R 381 0 R 382 0 R +383 0 R 384 0 R 385 0 R 386 0 R 387 0 R 388 0 R 389 0 R 390 0 R 391 0 R 392 0 R +393 0 R 394 0 R 395 0 R 396 0 R 397 0 R 398 0 R 399 0 R 400 0 R 401 0 R 402 0 R +403 0 R 404 0 R 405 0 R 406 0 R 407 0 R 408 0 R 409 0 R 410 0 R 411 0 R 412 0 R +413 0 R 414 0 R 415 0 R 416 0 R 417 0 R 418 0 R 419 0 R 420 0 R 421 0 R 422 0 R +423 0 R 424 0 R 425 0 R 426 0 R 427 0 R 428 0 R 429 0 R 430 0 R 431 0 R 432 0 R +433 0 R 434 0 R 435 0 R 436 0 R 437 0 R 438 0 R 439 0 R 440 0 R 441 0 R 442 0 R +443 0 R 444 0 R 445 0 R 446 0 R 447 0 R 448 0 R 449 0 R 450 0 R 451 0 R 452 0 R +453 0 R 454 0 R 455 0 R 456 0 R 457 0 R 458 0 R 459 0 R 460 0 R 461 0 R 462 0 R +463 0 R 464 0 R 465 0 R 466 0 R 467 0 R 468 0 R 469 0 R 470 0 R 471 0 R 472 0 R +473 0 R 474 0 R 475 0 R 476 0 R 477 0 R 478 0 R 479 0 R 480 0 R 481 0 R 482 0 R +483 0 R 484 0 R 485 0 R 486 0 R 487 0 R 488 0 R 489 0 R 490 0 R 491 0 R 492 0 R +493 0 R 494 0 R 495 0 R 496 0 R 497 0 R 498 0 R 499 0 R 500 0 R 501 0 R 502 0 R +503 0 R 504 0 R 505 0 R 506 0 R 507 0 R 508 0 R 509 0 R 510 0 R 511 0 R 512 0 R +513 0 R 514 0 R 515 0 R 516 0 R 517 0 R 518 0 R 519 0 R 520 0 R 521 0 R 522 0 R +523 0 R 524 0 R 525 0 R 526 0 R 527 0 R 528 0 R 529 0 R 530 0 R 531 0 R 532 0 R +533 0 R 534 0 R 535 0 R 536 0 R 537 0 R 538 0 R 539 0 R 540 0 R 541 0 R 542 0 R +543 0 R 544 0 R 545 0 R 546 0 R 547 0 R 548 0 R 549 0 R 550 0 R 551 0 R 552 0 R +553 0 R 554 0 R 555 0 R 556 0 R 557 0 R 558 0 R 559 0 R 560 0 R 561 0 R 562 0 R +563 0 R 564 0 R 565 0 R 566 0 R 567 0 R 568 0 R 569 0 R 570 0 R 571 0 R 572 0 R +573 0 R 574 0 R 575 0 R 576 0 R 577 0 R 578 0 R 579 0 R 580 0 R 581 0 R 582 0 R +583 0 R 584 0 R 585 0 R 586 0 R 587 0 R 588 0 R 589 0 R 590 0 R 591 0 R 592 0 R +593 0 R 594 0 R 595 0 R 596 0 R 597 0 R 598 0 R 599 0 R 600 0 R 601 0 R 602 0 R +603 0 R 604 0 R 605 0 R 606 0 R 607 0 R 608 0 R 609 0 R 610 0 R 611 0 R 612 0 R +613 0 R 614 0 R 615 0 R 616 0 R 617 0 R 618 0 R 619 0 R 620 0 R 621 0 R 622 0 R +623 0 R 624 0 R 625 0 R 626 0 R 627 0 R 628 0 R 629 0 R 630 0 R 631 0 R 632 0 R +633 0 R 634 0 R 635 0 R 636 0 R 637 0 R 638 0 R 639 0 R 640 0 R 641 0 R 642 0 R +643 0 R 644 0 R 645 0 R 646 0 R 647 0 R 648 0 R 649 0 R 650 0 R 651 0 R 652 0 R +653 0 R 654 0 R 655 0 R 656 0 R 657 0 R 658 0 R 659 0 R 660 0 R 661 0 R 662 0 R +663 0 R 664 0 R 665 0 R 666 0 R 667 0 R 668 0 R 669 0 R 670 0 R 671 0 R 672 0 R +673 0 R 674 0 R 675 0 R 676 0 R 677 0 R 678 0 R 679 0 R 680 0 R 681 0 R 682 0 R +683 0 R 684 0 R 685 0 R 686 0 R 687 0 R 688 0 R 689 0 R 690 0 R 691 0 R 692 0 R +693 0 R 694 0 R 695 0 R 696 0 R 697 0 R 698 0 R 699 0 R 700 0 R 701 0 R 702 0 R +703 0 R 704 0 R 705 0 R 706 0 R 707 0 R 708 0 R 709 0 R 710 0 R 711 0 R 712 0 R +713 0 R 714 0 R 715 0 R 716 0 R 717 0 R 718 0 R 719 0 R 720 0 R 721 0 R 722 0 R +723 0 R 724 0 R 725 0 R 726 0 R 727 0 R 728 0 R 729 0 R 730 0 R 731 0 R 732 0 R +733 0 R 734 0 R 735 0 R 736 0 R 737 0 R 738 0 R 739 0 R 740 0 R 741 0 R 742 0 R +743 0 R 744 0 R 745 0 R 746 0 R 747 0 R 748 0 R 749 0 R 750 0 R 751 0 R 752 0 R +753 0 R 754 0 R 755 0 R 756 0 R 757 0 R 758 0 R 759 0 R 760 0 R 761 0 R 762 0 R +763 0 R 764 0 R 765 0 R 766 0 R 767 0 R 768 0 R 769 0 R 770 0 R 771 0 R 772 0 R +773 0 R 774 0 R 775 0 R 776 0 R 777 0 R 778 0 R 779 0 R 780 0 R 781 0 R 782 0 R +783 0 R 784 0 R 785 0 R 786 0 R 787 0 R 788 0 R 789 0 R 790 0 R 791 0 R 792 0 R] +/P 6 0 R +/S /Sect +>> +endobj +15 0 obj +<< +/Kids [793 0 R 794 0 R] +>> +endobj +16 0 obj +<< +/header /P +/InlineShape /Figure +/#E6#A2#93#E6#9E#99#202#20Char /Span +/DropCap /Figure +/Outline /Span +/Subscript /Span +/Superscript /Span +/#E7#8F#9C#E9#8E#A2 /Span +/TOA /TOC +/#E6#A2#93#E6#9E#99#20Char /Span +/TOF /TOC +/Strikeout /Span +/#E9#96#89#E8#9F#88#E8#AB#89 /Span +/#E8#A0#B6#E8#9B#81#E7#AB#98#E8#9A#9A /Span +/#E8#A4#90#E8#9B#81#E7#AB#98#E8#9A#9A /Span +/TextBox /Div +/Body#20Text#20Indent#203 /P +/Salutation /P +/heading#201 /P +/heading#202 /P +/heading#203 /P +/Normal /P +/heading#204 /P +/Endnote /Note +/Footnote /Note +/blue1 /Span +/Body#20Text#20Indent /P +/Body#20Text /P +/toc#201 /P +/Underline /Span +/toc#202 /P +/toc#203 /P +/TOFI /TOCI +/Frame /Div +/Note#20Heading /P +/index#20heading /P +/#E6#A2#93#E6#9E#99#201#20Char /Span +/Title /P +/Shape /Figure +/TOAI /TOCI +>> +endobj +17 0 obj +<< +/S /D +>> +endobj +18 0 obj +<< +/Parent 9 0 R +/A 795 0 R +/Next 796 0 R +/Title +>> +endobj +19 0 obj +<< +/D [24 0 R /XYZ 0 763 null] +/S /GoTo +>> +endobj +20 0 obj +<< +/First 797 0 R +/Parent 9 0 R +/A 798 0 R +/Count 2 +/Last 799 0 R +/Prev 800 0 R +/Title +>> +endobj +21 0 obj +<< +/CropBox [0 0 595.22 842] +/Parent 10 0 R +/StructParents 0 +/Contents [801 0 R 802 0 R 803 0 R 804 0 R 805 0 R] +/Rotate 0 +/MediaBox [0 0 595.22 842] +/Resources << +/XObject << +/Im0 806 0 R +/Im2 807 0 R +>> +/ColorSpace << +/CS0 [/ICCBased 808 0 R] +>> +/Font << +/TT0 809 0 R +/TT1 810 0 R +/C2_0 811 0 R +/C2_1 812 0 R +/C2_2 813 0 R +/F6 814 0 R +/F7 815 0 R +>> +/ProcSet [/PDF /Text /ImageC] +/Properties << +/MC0 816 0 R +>> +/ExtGState << +/GS0 817 0 R +/gs2 818 0 R +/gs3 819 0 R +/gs4 820 0 R +/gs5 821 0 R +/gs6 822 0 R +/gs7 823 0 R +/gs8 824 0 R +/gs9 825 0 R +>> +>> +/Type /Page +/Annots [826 0 R] +>> +endobj +22 0 obj +<< +/CropBox [0 0 595.22 842] +/Parent 10 0 R +/StructParents 1 +/Contents [827 0 R 828 0 R 829 0 R] +/Rotate 0 +/MediaBox [0 0 595.22 842] +/Resources << +/XObject << +/Im0 830 0 R +/Im1 831 0 R +>> +/ColorSpace << +/CS0 [/ICCBased 808 0 R] +/CS1 [/Indexed [/ICCBased 808 0 R] + 15 832 0 R] +>> +/Font << +/TT0 809 0 R +/C2_0 833 0 R +/C2_1 811 0 R +/C2_2 812 0 R +/C2_3 834 0 R +/F6 814 0 R +>> +/ProcSet [/PDF /Text /ImageC /ImageI] +/Properties << +/MC0 816 0 R +>> +/ExtGState << +/GS0 817 0 R +>> +>> +/Type /Page +/Annots [] +>> +endobj +23 0 obj +<< +/CropBox [0 0 595.22 842] +/Annots [835 0 R 836 0 R 837 0 R 838 0 R 839 0 R 840 0 R 841 0 R 842 0 R 843 0 R 844 0 R +845 0 R 846 0 R 847 0 R 848 0 R 849 0 R 850 0 R 851 0 R 852 0 R 853 0 R 854 0 R +855 0 R 856 0 R 857 0 R 858 0 R 859 0 R 860 0 R 861 0 R 862 0 R 863 0 R 864 0 R +865 0 R 866 0 R 867 0 R 868 0 R 869 0 R] +/Parent 10 0 R +/StructParents 2 +/Contents [870 0 R 871 0 R 872 0 R] +/Rotate 0 +/MediaBox [0 0 595.22 842] +/Resources << +/XObject << +/Im0 830 0 R +>> +/ColorSpace << +/CS0 [/ICCBased 808 0 R] +>> +/Font << +/TT0 809 0 R +/C2_0 833 0 R +/C2_1 811 0 R +/C2_2 812 0 R +/F5 814 0 R +/F6 815 0 R +>> +/ProcSet [/PDF /Text /ImageC] +/Properties << +/MC0 816 0 R +>> +/ExtGState << +/GS0 817 0 R +>> +>> +/Type /Page +>> +endobj +24 0 obj +<< +/CropBox [0 0 595.22 842] +/Parent 10 0 R +/StructParents 38 +/Contents [873 0 R 874 0 R 875 0 R] +/Rotate 0 +/MediaBox [0 0 595.22 842] +/Resources << +/XObject << +/Im0 830 0 R +>> +/ColorSpace << +/CS0 [/ICCBased 808 0 R] +>> +/Font << +/TT0 809 0 R +/TT1 810 0 R +/TT2 876 0 R +/C2_0 833 0 R +/C2_1 811 0 R +/C2_2 812 0 R +/F7 814 0 R +/F8 815 0 R +>> +/ProcSet [/PDF /Text /ImageC] +/Properties << +/MC0 816 0 R +>> +/ExtGState << +/GS0 817 0 R +>> +>> +/Type /Page +/Annots [] +>> +endobj +25 0 obj +<< +/CropBox [0 0 595.22 842] +/Parent 10 0 R +/StructParents 39 +/Contents [877 0 R 878 0 R 879 0 R] +/Rotate 0 +/MediaBox [0 0 595.22 842] +/Resources << +/XObject << +/Im0 830 0 R +>> +/ColorSpace << +/CS0 [/ICCBased 808 0 R] +>> +/Font << +/TT0 809 0 R +/TT1 810 0 R +/C2_0 833 0 R +/C2_1 811 0 R +/C2_2 812 0 R +/F6 814 0 R +/F7 815 0 R +/F8 880 0 R +>> +/ProcSet [/PDF /Text /ImageC] +/Properties << +/MC0 816 0 R +>> +/ExtGState << +/GS0 817 0 R +>> +>> +/Type /Page +/Annots [] +>> +endobj +26 0 obj +<< +/CropBox [0 0 595.22 842] +/Parent 10 0 R +/StructParents 40 +/Contents [881 0 R 882 0 R 883 0 R] +/Rotate 0 +/MediaBox [0 0 595.22 842] +/Resources << +/XObject << +/Im0 830 0 R +>> +/ColorSpace << +/CS0 [/ICCBased 808 0 R] +>> +/Font << +/TT0 809 0 R +/TT1 810 0 R +/TT2 876 0 R +/C2_0 833 0 R +/C2_1 811 0 R +/C2_2 812 0 R +/C2_3 813 0 R +/F8 814 0 R +/F9 815 0 R +>> +/ProcSet [/PDF /Text /ImageC] +/Properties << +/MC0 816 0 R +>> +/ExtGState << +/GS0 817 0 R +>> +>> +/Type /Page +/Annots [] +>> +endobj +27 0 obj +<< +/CropBox [0 0 595.22 842] +/Parent 10 0 R +/StructParents 41 +/Contents [884 0 R 885 0 R 886 0 R] +/Rotate 0 +/MediaBox [0 0 595.22 842] +/Resources << +/XObject << +/Im0 830 0 R +>> +/ColorSpace << +/CS0 [/ICCBased 808 0 R] +>> +/Font << +/TT0 809 0 R +/TT1 810 0 R +/TT2 876 0 R +/C2_0 833 0 R +/C2_1 811 0 R +/C2_2 813 0 R +/F7 814 0 R +/F8 815 0 R +>> +/ProcSet [/PDF /Text /ImageC] +/Properties << +/MC0 816 0 R +>> +/ExtGState << +/GS0 817 0 R +>> +>> +/Type /Page +/Annots [] +>> +endobj +28 0 obj +<< +/CropBox [0 0 595.22 842] +/Parent 10 0 R +/StructParents 42 +/Contents [887 0 R 888 0 R 889 0 R] +/Rotate 0 +/MediaBox [0 0 595.22 842] +/Resources << +/XObject << +/Im0 830 0 R +>> +/ColorSpace << +/CS0 [/ICCBased 808 0 R] +>> +/Font << +/TT0 809 0 R +/TT1 876 0 R +/C2_0 833 0 R +/C2_1 811 0 R +/F5 814 0 R +/F6 815 0 R +>> +/ProcSet [/PDF /Text /ImageC] +/Properties << +/MC0 816 0 R +>> +/ExtGState << +/GS0 817 0 R +>> +>> +/Type /Page +/Annots [] +>> +endobj +29 0 obj +<< +/CropBox [0 0 595.22 842] +/Parent 10 0 R +/StructParents 43 +/Contents [890 0 R 891 0 R 892 0 R] +/Rotate 0 +/MediaBox [0 0 595.22 842] +/Resources << +/XObject << +/Im0 830 0 R +>> +/ColorSpace << +/CS0 [/ICCBased 808 0 R] +>> +/Font << +/TT0 809 0 R +/TT1 810 0 R +/TT2 876 0 R +/C2_0 833 0 R +/C2_1 811 0 R +/C2_2 812 0 R +/F7 814 0 R +/F8 815 0 R +/F9 880 0 R +>> +/ProcSet [/PDF /Text /ImageC] +/Properties << +/MC0 816 0 R +>> +/ExtGState << +/GS0 817 0 R +>> +>> +/Type /Page +/Annots [] +>> +endobj +30 0 obj +<< +/CropBox [0 0 595.22 842] +/Parent 10 0 R +/StructParents 44 +/Contents [893 0 R 894 0 R 895 0 R] +/Rotate 0 +/MediaBox [0 0 595.22 842] +/Resources << +/XObject << +/Im0 830 0 R +>> +/ColorSpace << +/CS0 [/ICCBased 808 0 R] +>> +/Font << +/TT0 809 0 R +/TT1 810 0 R +/TT2 876 0 R +/TT3 896 0 R +/C2_0 833 0 R +/C2_1 811 0 R +/C2_2 897 0 R +/F8 814 0 R +/F9 815 0 R +/F10 880 0 R +>> +/ProcSet [/PDF /Text /ImageC] +/Properties << +/MC0 816 0 R +>> +/ExtGState << +/GS0 817 0 R +>> +>> +/Type /Page +/Annots [] +>> +endobj +31 0 obj +<< +/CropBox [0 0 595.22 842] +/Parent 11 0 R +/StructParents 45 +/Contents [898 0 R 899 0 R 900 0 R] +/Rotate 0 +/MediaBox [0 0 595.22 842] +/Resources << +/XObject << +/Im0 830 0 R +>> +/ColorSpace << +/CS0 [/ICCBased 808 0 R] +>> +/Font << +/TT0 809 0 R +/TT1 876 0 R +/C2_0 833 0 R +/C2_1 811 0 R +/F5 814 0 R +/F6 815 0 R +>> +/ProcSet [/PDF /Text /ImageC] +/Properties << +/MC0 816 0 R +>> +/ExtGState << +/GS0 817 0 R +>> +>> +/Type /Page +/Annots [] +>> +endobj +32 0 obj +<< +/CropBox [0 0 595.22 842] +/Parent 11 0 R +/StructParents 46 +/Contents [901 0 R 902 0 R 903 0 R] +/Rotate 0 +/MediaBox [0 0 595.22 842] +/Resources << +/XObject << +/Im0 830 0 R +>> +/ColorSpace << +/CS0 [/ICCBased 808 0 R] +>> +/Font << +/TT0 809 0 R +/TT1 810 0 R +/TT2 876 0 R +/C2_0 833 0 R +/C2_1 811 0 R +/C2_2 812 0 R +/C2_3 904 0 R +/F8 814 0 R +/F9 815 0 R +>> +/ProcSet [/PDF /Text /ImageC] +/Properties << +/MC0 816 0 R +>> +/ExtGState << +/GS0 817 0 R +>> +>> +/Type /Page +/Annots [] +>> +endobj +33 0 obj +<< +/CropBox [0 0 595.22 842] +/Parent 11 0 R +/StructParents 47 +/Contents [905 0 R 906 0 R 907 0 R] +/Rotate 0 +/MediaBox [0 0 595.22 842] +/Resources << +/XObject << +/Im0 830 0 R +>> +/ColorSpace << +/CS0 [/ICCBased 808 0 R] +>> +/Font << +/TT0 809 0 R +/TT1 876 0 R +/TT2 896 0 R +/C2_0 833 0 R +/C2_1 811 0 R +/F6 814 0 R +/F7 815 0 R +>> +/ProcSet [/PDF /Text /ImageC] +/Properties << +/MC0 816 0 R +>> +/ExtGState << +/GS0 817 0 R +>> +>> +/Type /Page +/Annots [] +>> +endobj +34 0 obj +<< +/CropBox [0 0 595.22 842] +/Parent 11 0 R +/StructParents 48 +/Contents [908 0 R 909 0 R 910 0 R] +/Rotate 0 +/MediaBox [0 0 595.22 842] +/Resources << +/XObject << +/Im0 830 0 R +>> +/ColorSpace << +/CS0 [/ICCBased 808 0 R] +>> +/Font << +/TT0 809 0 R +/TT1 810 0 R +/TT2 876 0 R +/C2_0 833 0 R +/C2_1 811 0 R +/C2_2 812 0 R +/C2_3 813 0 R +/F8 814 0 R +/F9 815 0 R +/F10 880 0 R +>> +/ProcSet [/PDF /Text /ImageC] +/Properties << +/MC0 816 0 R +>> +/ExtGState << +/GS0 817 0 R +>> +>> +/Type /Page +/Annots [] +>> +endobj +35 0 obj +<< +/CropBox [0 0 595.22 842] +/Parent 11 0 R +/StructParents 49 +/Contents [911 0 R 912 0 R 913 0 R] +/Rotate 0 +/MediaBox [0 0 595.22 842] +/Resources << +/XObject << +/Im0 830 0 R +>> +/ColorSpace << +/CS0 [/ICCBased 808 0 R] +>> +/Font << +/TT0 809 0 R +/C2_0 833 0 R +/C2_1 811 0 R +/C2_2 813 0 R +/F5 814 0 R +/F6 880 0 R +/F7 815 0 R +>> +/ProcSet [/PDF /Text /ImageC] +/Properties << +/MC0 816 0 R +>> +/ExtGState << +/GS0 817 0 R +>> +>> +/Type /Page +/Annots [] +>> +endobj +36 0 obj +<< +/CropBox [0 0 595.22 842] +/Parent 11 0 R +/StructParents 50 +/Contents [914 0 R 915 0 R 916 0 R] +/Rotate 0 +/MediaBox [0 0 595.22 842] +/Resources << +/XObject << +/Im0 830 0 R +>> +/ColorSpace << +/CS0 [/ICCBased 808 0 R] +>> +/Font << +/TT0 809 0 R +/C2_0 833 0 R +/C2_1 811 0 R +/C2_2 813 0 R +/F5 814 0 R +/F6 880 0 R +/F7 815 0 R +>> +/ProcSet [/PDF /Text /ImageC] +/Properties << +/MC0 816 0 R +>> +/ExtGState << +/GS0 817 0 R +>> +>> +/Type /Page +/Annots [] +>> +endobj +37 0 obj +<< +/CropBox [0 0 595.22 842] +/Parent 11 0 R +/StructParents 51 +/Contents [917 0 R 918 0 R 919 0 R] +/Rotate 0 +/MediaBox [0 0 595.22 842] +/Resources << +/XObject << +/Im0 830 0 R +>> +/ColorSpace << +/CS0 [/ICCBased 808 0 R] +>> +/Font << +/TT0 809 0 R +/C2_0 833 0 R +/C2_1 811 0 R +/C2_2 813 0 R +/F5 814 0 R +/F6 815 0 R +/F7 880 0 R +>> +/ProcSet [/PDF /Text /ImageC] +/Properties << +/MC0 816 0 R +>> +/ExtGState << +/GS0 817 0 R +>> +>> +/Type /Page +/Annots [] +>> +endobj +38 0 obj +<< +/CropBox [0 0 595.22 842] +/Parent 11 0 R +/StructParents 52 +/Contents [920 0 R 921 0 R 922 0 R] +/Rotate 0 +/MediaBox [0 0 595.22 842] +/Resources << +/XObject << +/Im0 830 0 R +>> +/ColorSpace << +/CS0 [/ICCBased 808 0 R] +>> +/Font << +/TT0 809 0 R +/TT1 876 0 R +/C2_0 833 0 R +/C2_1 811 0 R +/C2_2 813 0 R +/F6 814 0 R +/F7 880 0 R +/F8 815 0 R +>> +/ProcSet [/PDF /Text /ImageC] +/Properties << +/MC0 816 0 R +>> +/ExtGState << +/GS0 817 0 R +>> +>> +/Type /Page +/Annots [] +>> +endobj +39 0 obj +<< +/CropBox [0 0 595.22 842] +/Parent 11 0 R +/StructParents 53 +/Contents [923 0 R 924 0 R 925 0 R] +/Rotate 0 +/MediaBox [0 0 595.22 842] +/Resources << +/XObject << +/Im0 830 0 R +>> +/ColorSpace << +/CS0 [/ICCBased 808 0 R] +>> +/Font << +/TT0 809 0 R +/C2_0 833 0 R +/C2_1 811 0 R +/C2_2 813 0 R +/F5 814 0 R +/F6 880 0 R +/F7 815 0 R +>> +/ProcSet [/PDF /Text /ImageC] +/Properties << +/MC0 816 0 R +>> +/ExtGState << +/GS0 817 0 R +>> +>> +/Type /Page +/Annots [] +>> +endobj +40 0 obj +<< +/CropBox [0 0 595.22 842] +/Parent 11 0 R +/StructParents 54 +/Contents [926 0 R 927 0 R 928 0 R] +/Rotate 0 +/MediaBox [0 0 595.22 842] +/Resources << +/XObject << +/Im0 830 0 R +>> +/ColorSpace << +/CS0 [/ICCBased 808 0 R] +>> +/Font << +/TT0 809 0 R +/C2_0 833 0 R +/C2_1 811 0 R +/C2_2 813 0 R +/F5 814 0 R +/F6 815 0 R +/F7 880 0 R +>> +/ProcSet [/PDF /Text /ImageC] +/Properties << +/MC0 816 0 R +>> +/ExtGState << +/GS0 817 0 R +>> +>> +/Type /Page +/Annots [] +>> +endobj +41 0 obj +<< +/CropBox [0 0 595.22 842] +/Parent 12 0 R +/StructParents 55 +/Contents [929 0 R 930 0 R 931 0 R] +/Rotate 0 +/MediaBox [0 0 595.22 842] +/Resources << +/XObject << +/Im0 830 0 R +>> +/ColorSpace << +/CS0 [/ICCBased 808 0 R] +>> +/Font << +/TT0 809 0 R +/C2_0 833 0 R +/C2_1 811 0 R +/C2_2 813 0 R +/F5 814 0 R +/F6 880 0 R +/F7 815 0 R +>> +/ProcSet [/PDF /Text /ImageC] +/Properties << +/MC0 816 0 R +>> +/ExtGState << +/GS0 817 0 R +>> +>> +/Type /Page +/Annots [] +>> +endobj +42 0 obj +<< +/CropBox [0 0 595.22 842] +/Parent 12 0 R +/StructParents 56 +/Contents [932 0 R 933 0 R 934 0 R] +/Rotate 0 +/MediaBox [0 0 595.22 842] +/Resources << +/XObject << +/Im0 830 0 R +>> +/ColorSpace << +/CS0 [/ICCBased 808 0 R] +>> +/Font << +/TT0 809 0 R +/C2_0 833 0 R +/C2_1 811 0 R +/C2_2 813 0 R +/F5 814 0 R +/F6 815 0 R +/F7 880 0 R +>> +/ProcSet [/PDF /Text /ImageC] +/Properties << +/MC0 816 0 R +>> +/ExtGState << +/GS0 817 0 R +>> +>> +/Type /Page +/Annots [] +>> +endobj +43 0 obj +<< +/CropBox [0 0 595.22 842] +/Parent 12 0 R +/StructParents 57 +/Contents [935 0 R 936 0 R 937 0 R] +/Rotate 0 +/MediaBox [0 0 595.22 842] +/Resources << +/XObject << +/Im0 830 0 R +>> +/ColorSpace << +/CS0 [/ICCBased 808 0 R] +>> +/Font << +/TT0 809 0 R +/C2_0 833 0 R +/C2_1 811 0 R +/C2_2 813 0 R +/F5 814 0 R +/F6 880 0 R +/F7 815 0 R +>> +/ProcSet [/PDF /Text /ImageC] +/Properties << +/MC0 816 0 R +>> +/ExtGState << +/GS0 817 0 R +>> +>> +/Type /Page +/Annots [] +>> +endobj +44 0 obj +<< +/CropBox [0 0 595.22 842] +/Parent 12 0 R +/StructParents 58 +/Contents [938 0 R 939 0 R 940 0 R] +/Rotate 0 +/MediaBox [0 0 595.22 842] +/Resources << +/XObject << +/Im0 830 0 R +>> +/ColorSpace << +/CS0 [/ICCBased 808 0 R] +>> +/Font << +/TT0 809 0 R +/C2_0 833 0 R +/C2_1 811 0 R +/C2_2 813 0 R +/F5 814 0 R +/F6 880 0 R +/F7 815 0 R +>> +/ProcSet [/PDF /Text /ImageC] +/Properties << +/MC0 816 0 R +>> +/ExtGState << +/GS0 817 0 R +>> +>> +/Type /Page +/Annots [] +>> +endobj +45 0 obj +<< +/CropBox [0 0 595.22 842] +/Parent 12 0 R +/StructParents 59 +/Contents [941 0 R 942 0 R 943 0 R] +/Rotate 0 +/MediaBox [0 0 595.22 842] +/Resources << +/XObject << +/Im0 830 0 R +>> +/ColorSpace << +/CS0 [/ICCBased 808 0 R] +>> +/Font << +/TT0 809 0 R +/C2_0 833 0 R +/C2_1 811 0 R +/C2_2 813 0 R +/F5 814 0 R +/F6 880 0 R +/F7 815 0 R +>> +/ProcSet [/PDF /Text /ImageC] +/Properties << +/MC0 816 0 R +>> +/ExtGState << +/GS0 817 0 R +>> +>> +/Type /Page +/Annots [] +>> +endobj +46 0 obj +<< +/CropBox [0 0 595.22 842] +/Parent 12 0 R +/StructParents 60 +/Contents [944 0 R 945 0 R 946 0 R] +/Rotate 0 +/MediaBox [0 0 595.22 842] +/Resources << +/XObject << +/Im0 830 0 R +>> +/ColorSpace << +/CS0 [/ICCBased 808 0 R] +>> +/Font << +/TT0 809 0 R +/TT1 810 0 R +/C2_0 833 0 R +/C2_1 811 0 R +/C2_2 813 0 R +/F6 814 0 R +/F7 880 0 R +/F8 815 0 R +>> +/ProcSet [/PDF /Text /ImageC] +/Properties << +/MC0 816 0 R +>> +/ExtGState << +/GS0 817 0 R +>> +>> +/Type /Page +/Annots [] +>> +endobj +47 0 obj +<< +/CropBox [0 0 595.22 842] +/Parent 12 0 R +/StructParents 61 +/Contents [947 0 R 948 0 R 949 0 R] +/Rotate 0 +/MediaBox [0 0 595.22 842] +/Resources << +/XObject << +/Im0 830 0 R +>> +/ColorSpace << +/CS0 [/ICCBased 808 0 R] +>> +/Font << +/TT0 809 0 R +/TT1 876 0 R +/C2_0 833 0 R +/C2_1 811 0 R +/C2_2 813 0 R +/F6 814 0 R +/F7 815 0 R +/F8 880 0 R +>> +/ProcSet [/PDF /Text /ImageC] +/Properties << +/MC0 816 0 R +>> +/ExtGState << +/GS0 817 0 R +>> +>> +/Type /Page +/Annots [] +>> +endobj +48 0 obj +<< +/CropBox [0 0 595.22 842] +/Parent 12 0 R +/StructParents 62 +/Contents [950 0 R 951 0 R 952 0 R] +/Rotate 0 +/MediaBox [0 0 595.22 842] +/Resources << +/XObject << +/Im0 830 0 R +>> +/ColorSpace << +/CS0 [/ICCBased 808 0 R] +>> +/Font << +/TT0 809 0 R +/TT1 810 0 R +/TT2 876 0 R +/C2_0 833 0 R +/C2_1 811 0 R +/C2_2 812 0 R +/F7 814 0 R +/F8 815 0 R +>> +/ProcSet [/PDF /Text /ImageC] +/Properties << +/MC0 816 0 R +>> +/ExtGState << +/GS0 817 0 R +>> +>> +/Type /Page +/Annots [] +>> +endobj +49 0 obj +<< +/CropBox [0 0 595.22 842] +/Parent 12 0 R +/StructParents 63 +/Contents [953 0 R 954 0 R 955 0 R] +/Rotate 0 +/MediaBox [0 0 595.22 842] +/Resources << +/XObject << +/Im0 830 0 R +/Im1 956 0 R +>> +/ColorSpace << +/CS0 [/ICCBased 808 0 R] +>> +/Font << +/TT0 809 0 R +/TT1 810 0 R +/C2_0 833 0 R +/C2_1 811 0 R +/F5 814 0 R +/F6 815 0 R +>> +/ProcSet [/PDF /Text /ImageB /ImageC] +/Properties << +/MC0 816 0 R +>> +/ExtGState << +/GS0 817 0 R +>> +>> +/Type /Page +/Annots [] +>> +endobj +50 0 obj +<< +/CropBox [0 0 595.22 842] +/Parent 12 0 R +/StructParents 64 +/Contents [957 0 R 958 0 R 959 0 R] +/Rotate 0 +/MediaBox [0 0 595.22 842] +/Resources << +/XObject << +/Im0 830 0 R +/Im1 960 0 R +>> +/ColorSpace << +/CS0 [/ICCBased 808 0 R] +>> +/Font << +/TT0 809 0 R +/TT1 810 0 R +/C2_0 833 0 R +/C2_1 811 0 R +/F5 814 0 R +/F6 815 0 R +>> +/ProcSet [/PDF /Text /ImageB /ImageC] +/Properties << +/MC0 816 0 R +>> +/ExtGState << +/GS0 817 0 R +>> +>> +/Type /Page +/Annots [] +>> +endobj +51 0 obj +<< +/CropBox [0 0 595.22 842] +/Parent 13 0 R +/StructParents 65 +/Contents [961 0 R 962 0 R 963 0 R] +/Rotate 0 +/MediaBox [0 0 595.22 842] +/Resources << +/XObject << +/Im0 830 0 R +>> +/ColorSpace << +/CS0 [/ICCBased 808 0 R] +>> +/Font << +/TT0 809 0 R +/TT1 876 0 R +/TT2 810 0 R +/C2_0 833 0 R +/C2_1 811 0 R +/C2_2 812 0 R +/F7 814 0 R +/F8 815 0 R +>> +/ProcSet [/PDF /Text /ImageC] +/Properties << +/MC0 816 0 R +>> +/ExtGState << +/GS0 817 0 R +>> +>> +/Type /Page +/Annots [] +>> +endobj +52 0 obj +<< +/CropBox [0 0 595.22 842] +/Parent 13 0 R +/StructParents 66 +/Contents [964 0 R 965 0 R 966 0 R] +/Rotate 0 +/MediaBox [0 0 595.22 842] +/Resources << +/XObject << +/Im0 830 0 R +/Im1 967 0 R +/Im2 968 0 R +/Im3 969 0 R +>> +/ColorSpace << +/CS0 [/ICCBased 808 0 R] +/CS1 [/Indexed [/ICCBased 808 0 R] + 15 970 0 R] +/CS2 [/Indexed [/ICCBased 808 0 R] + 15 832 0 R] +/CS3 [/Indexed [/ICCBased 808 0 R] + 65 971 0 R] +>> +/Font << +/TT0 809 0 R +/TT1 810 0 R +/TT2 876 0 R +/C2_0 833 0 R +/C2_1 811 0 R +/C2_2 812 0 R +/F7 814 0 R +/F8 815 0 R +>> +/ProcSet [/PDF /Text /ImageC /ImageI] +/Properties << +/MC0 816 0 R +>> +/ExtGState << +/GS0 817 0 R +>> +>> +/Type /Page +/Annots [] +>> +endobj +53 0 obj +<< +/A 972 0 R +/K 0 +/P 14 0 R +/S /Title +/Pg 21 0 R +>> +endobj +54 0 obj +<< +/A 972 0 R +/K 1 +/P 14 0 R +/S /Title +/Pg 21 0 R +>> +endobj +55 0 obj +<< +/A 972 0 R +/K 2 +/P 14 0 R +/S /Normal +/Pg 21 0 R +>> +endobj +56 0 obj +<< +/A 972 0 R +/K 3 +/P 14 0 R +/S /Normal +/Pg 21 0 R +>> +endobj +57 0 obj +<< +/A 972 0 R +/K 4 +/P 14 0 R +/S /Normal +/Pg 21 0 R +>> +endobj +58 0 obj +<< +/A 973 0 R +/K 5 +/P 14 0 R +/S /Normal +/Pg 21 0 R +>> +endobj +59 0 obj +<< +/A 973 0 R +/K [974 0 R 7] +/P 14 0 R +/S /Normal +/Pg 21 0 R +>> +endobj +60 0 obj +<< +/A 973 0 R +/K 8 +/P 14 0 R +/S /Normal +/Pg 21 0 R +>> +endobj +61 0 obj +<< +/A 972 0 R +/K 9 +/P 14 0 R +/S /Normal +/Pg 21 0 R +>> +endobj +62 0 obj +<< +/A 972 0 R +/K [10 975 0 R] +/P 14 0 R +/S /Normal +/Pg 21 0 R +>> +endobj +63 0 obj +<< +/A 976 0 R +/K 1 +/P 14 0 R +/S /Normal +/Pg 22 0 R +>> +endobj +64 0 obj +<< +/A 977 0 R +/K 2 +/P 14 0 R +/S /Normal +/Pg 22 0 R +>> +endobj +65 0 obj +<< +/A 977 0 R +/K 3 +/P 14 0 R +/S /Normal +/Pg 22 0 R +>> +endobj +66 0 obj +<< +/A 977 0 R +/K 4 +/P 14 0 R +/S /Normal +/Pg 22 0 R +>> +endobj +67 0 obj +<< +/A 978 0 R +/K 5 +/P 14 0 R +/S /Normal +/Pg 22 0 R +>> +endobj +68 0 obj +<< +/A 978 0 R +/K 6 +/P 14 0 R +/S /Normal +/Pg 22 0 R +>> +endobj +69 0 obj +<< +/A 976 0 R +/K [7 979 0 R] +/P 14 0 R +/S /Normal +/Pg 22 0 R +>> +endobj +70 0 obj +<< +/A 980 0 R +/K 9 +/P 14 0 R +/S /Normal +/Pg 22 0 R +>> +endobj +71 0 obj +<< +/A 980 0 R +/K 10 +/P 14 0 R +/S /Normal +/Pg 22 0 R +>> +endobj +72 0 obj +<< +/A 981 0 R +/K [11 982 0 R 13] +/P 14 0 R +/S /Normal +/Pg 22 0 R +>> +endobj +73 0 obj +<< +/A 983 0 R +/K 14 +/P 14 0 R +/S /Normal +/Pg 22 0 R +>> +endobj +74 0 obj +<< +/A 977 0 R +/K 15 +/P 14 0 R +/S /Normal +/Pg 22 0 R +>> +endobj +75 0 obj +<< +/A 977 0 R +/K 16 +/P 14 0 R +/S /Normal +/Pg 22 0 R +>> +endobj +76 0 obj +<< +/A 977 0 R +/K 17 +/P 14 0 R +/S /Normal +/Pg 22 0 R +>> +endobj +77 0 obj +<< +/A 977 0 R +/K 18 +/P 14 0 R +/S /Normal +/Pg 22 0 R +>> +endobj +78 0 obj +<< +/A 977 0 R +/K 19 +/P 14 0 R +/S /Normal +/Pg 22 0 R +>> +endobj +79 0 obj +<< +/A 973 0 R +/K 20 +/P 14 0 R +/S /Normal +/Pg 22 0 R +>> +endobj +80 0 obj +<< +/A 972 0 R +/K 0 +/P 14 0 R +/S /Normal +/Pg 23 0 R +>> +endobj +81 0 obj +<< +/K [984 0 R 985 0 R 986 0 R 987 0 R 988 0 R 989 0 R 990 0 R 991 0 R 992 0 R 993 0 R +994 0 R 995 0 R 996 0 R 997 0 R 998 0 R 999 0 R 1000 0 R 1001 0 R 1002 0 R 1003 0 R +1004 0 R 1005 0 R 1006 0 R 1007 0 R 1008 0 R 1009 0 R 1010 0 R 1011 0 R 1012 0 R 1013 0 R +1014 0 R 1015 0 R 1016 0 R 1017 0 R 1018 0 R] +/P 14 0 R +/S /TOC +>> +endobj +82 0 obj +<< +/A 1019 0 R +/K 36 +/P 14 0 R +/S /Normal +/Pg 23 0 R +>> +endobj +83 0 obj +<< +/A 1020 0 R +/K 0 +/P 14 0 R +/S /heading#201 +/Pg 24 0 R +>> +endobj +84 0 obj +<< +/A 1021 0 R +/K 1 +/P 14 0 R +/S /Normal +/Pg 24 0 R +>> +endobj +85 0 obj +<< +/A 1022 0 R +/K 2 +/P 14 0 R +/S /heading#202 +/Pg 24 0 R +>> +endobj +86 0 obj +<< +/A 1021 0 R +/K 3 +/P 14 0 R +/S /Normal +/Pg 24 0 R +>> +endobj +87 0 obj +<< +/A 1021 0 R +/K 4 +/P 14 0 R +/S /Normal +/Pg 24 0 R +>> +endobj +88 0 obj +<< +/A 1022 0 R +/K 5 +/P 14 0 R +/S /heading#202 +/Pg 24 0 R +>> +endobj +89 0 obj +<< +/A 1021 0 R +/K 6 +/P 14 0 R +/S /Normal +/Pg 24 0 R +>> +endobj +90 0 obj +<< +/A 1023 0 R +/K 7 +/P 14 0 R +/S /Normal +/Pg 24 0 R +>> +endobj +91 0 obj +<< +/A 1024 0 R +/K 8 +/P 14 0 R +/S /Normal +/Pg 24 0 R +>> +endobj +92 0 obj +<< +/A 1025 0 R +/K 9 +/P 14 0 R +/S /Normal +/Pg 24 0 R +>> +endobj +93 0 obj +<< +/A 1026 0 R +/K 10 +/P 14 0 R +/S /Normal +/Pg 24 0 R +>> +endobj +94 0 obj +<< +/A 1027 0 R +/K 11 +/P 14 0 R +/S /Normal +/Pg 24 0 R +>> +endobj +95 0 obj +<< +/A 1028 0 R +/K 12 +/P 14 0 R +/S /Normal +/Pg 24 0 R +>> +endobj +96 0 obj +<< +/A 1025 0 R +/K 13 +/P 14 0 R +/S /Normal +/Pg 24 0 R +>> +endobj +97 0 obj +<< +/A 1029 0 R +/K 14 +/P 14 0 R +/S /Normal +/Pg 24 0 R +>> +endobj +98 0 obj +<< +/A 1025 0 R +/K 15 +/P 14 0 R +/S /Normal +/Pg 24 0 R +>> +endobj +99 0 obj +<< +/A 1025 0 R +/K 16 +/P 14 0 R +/S /Normal +/Pg 24 0 R +>> +endobj +100 0 obj +<< +/A 1030 0 R +/K 17 +/P 14 0 R +/S /Normal +/Pg 24 0 R +>> +endobj +101 0 obj +<< +/A 1031 0 R +/K 18 +/P 14 0 R +/S /Normal +/Pg 24 0 R +>> +endobj +102 0 obj +<< +/A 1032 0 R +/K 19 +/P 14 0 R +/S /Normal +/Pg 24 0 R +>> +endobj +103 0 obj +<< +/A 973 0 R +/K 20 +/P 14 0 R +/S /Normal +/Pg 24 0 R +>> +endobj +104 0 obj +<< +/A 1033 0 R +/K 21 +/P 14 0 R +/S /Shape +/Pg 24 0 R +>> +endobj +105 0 obj +<< +/A 1020 0 R +/K 0 +/P 14 0 R +/S /heading#201 +/Pg 25 0 R +>> +endobj +106 0 obj +<< +/A 973 0 R +/K 1 +/P 14 0 R +/S /Normal +/Pg 25 0 R +>> +endobj +107 0 obj +<< +/A 973 0 R +/K 2 +/P 14 0 R +/S /Normal +/Pg 25 0 R +>> +endobj +108 0 obj +<< +/A 1034 0 R +/K 3 +/P 14 0 R +/S /Normal +/Pg 25 0 R +>> +endobj +109 0 obj +<< +/A 1034 0 R +/K 4 +/P 14 0 R +/S /Normal +/Pg 25 0 R +>> +endobj +110 0 obj +<< +/A 1035 0 R +/K 5 +/P 14 0 R +/S /Normal +/Pg 25 0 R +>> +endobj +111 0 obj +<< +/A 1035 0 R +/K 6 +/P 14 0 R +/S /index#20heading +/Pg 25 0 R +>> +endobj +112 0 obj +<< +/A 973 0 R +/K 7 +/P 14 0 R +/S /Normal +/Pg 25 0 R +>> +endobj +113 0 obj +<< +/A 1034 0 R +/K 8 +/P 14 0 R +/S /Normal +/Pg 25 0 R +>> +endobj +114 0 obj +<< +/A 1034 0 R +/K 9 +/P 14 0 R +/S /Normal +/Pg 25 0 R +>> +endobj +115 0 obj +<< +/A 973 0 R +/K 10 +/P 14 0 R +/S /Normal +/Pg 25 0 R +>> +endobj +116 0 obj +<< +/A 973 0 R +/K 11 +/P 14 0 R +/S /Normal +/Pg 25 0 R +>> +endobj +117 0 obj +<< +/A 1036 0 R +/K 12 +/P 14 0 R +/S /Normal +/Pg 25 0 R +>> +endobj +118 0 obj +<< +/A 1035 0 R +/K 13 +/P 14 0 R +/S /Normal +/Pg 25 0 R +>> +endobj +119 0 obj +<< +/A 1036 0 R +/K 14 +/P 14 0 R +/S /Normal +/Pg 25 0 R +>> +endobj +120 0 obj +<< +/A 1036 0 R +/K 15 +/P 14 0 R +/S /Normal +/Pg 25 0 R +>> +endobj +121 0 obj +<< +/A 1036 0 R +/K 16 +/P 14 0 R +/S /Normal +/Pg 25 0 R +>> +endobj +122 0 obj +<< +/A 1035 0 R +/K 17 +/P 14 0 R +/S /Normal +/Pg 25 0 R +>> +endobj +123 0 obj +<< +/A 1035 0 R +/K 18 +/P 14 0 R +/S /Normal +/Pg 25 0 R +>> +endobj +124 0 obj +<< +/A 973 0 R +/K 19 +/P 14 0 R +/S /Normal +/Pg 25 0 R +>> +endobj +125 0 obj +<< +/A 1034 0 R +/K 20 +/P 14 0 R +/S /Normal +/Pg 25 0 R +>> +endobj +126 0 obj +<< +/A 1034 0 R +/K 21 +/P 14 0 R +/S /Normal +/Pg 25 0 R +>> +endobj +127 0 obj +<< +/A 1036 0 R +/K 22 +/P 14 0 R +/S /Normal +/Pg 25 0 R +>> +endobj +128 0 obj +<< +/A 1034 0 R +/K 23 +/P 14 0 R +/S /Normal +/Pg 25 0 R +>> +endobj +129 0 obj +<< +/A 1034 0 R +/K 24 +/P 14 0 R +/S /Normal +/Pg 25 0 R +>> +endobj +130 0 obj +<< +/A 1036 0 R +/K 25 +/P 14 0 R +/S /Normal +/Pg 25 0 R +>> +endobj +131 0 obj +<< +/A 1036 0 R +/K 26 +/P 14 0 R +/S /Normal +/Pg 25 0 R +>> +endobj +132 0 obj +<< +/A 1034 0 R +/K 27 +/P 14 0 R +/S /Normal +/Pg 25 0 R +>> +endobj +133 0 obj +<< +/A 1034 0 R +/K 28 +/P 14 0 R +/S /Normal +/Pg 25 0 R +>> +endobj +134 0 obj +<< +/A 1035 0 R +/K 29 +/P 14 0 R +/S /Normal +/Pg 25 0 R +>> +endobj +135 0 obj +<< +/A 1020 0 R +/K 0 +/P 14 0 R +/S /heading#201 +/Pg 26 0 R +>> +endobj +136 0 obj +<< +/A 1022 0 R +/K 1 +/P 14 0 R +/S /heading#202 +/Pg 26 0 R +>> +endobj +137 0 obj +<< +/A 973 0 R +/K 2 +/P 14 0 R +/S /Normal +/Pg 26 0 R +>> +endobj +138 0 obj +<< +/A 973 0 R +/K 3 +/P 14 0 R +/S /Salutation +/Pg 26 0 R +>> +endobj +139 0 obj +<< +/A 1022 0 R +/K 4 +/P 14 0 R +/S /heading#203 +/Pg 26 0 R +>> +endobj +140 0 obj +<< +/A 1037 0 R +/K 5 +/P 14 0 R +/S /Normal +/Pg 26 0 R +>> +endobj +141 0 obj +<< +/A [1038 0 R] +/K 1039 0 R +/P 14 0 R +/S /Table +>> +endobj +142 0 obj +<< +/A 1040 0 R +/K 30 +/P 14 0 R +/S /Normal +/Pg 26 0 R +>> +endobj +143 0 obj +<< +/A 1041 0 R +/K 31 +/P 14 0 R +/S /heading#204 +/Pg 26 0 R +>> +endobj +144 0 obj +<< +/A 1021 0 R +/K 32 +/P 14 0 R +/S /Normal +/Pg 26 0 R +>> +endobj +145 0 obj +<< +/A 1021 0 R +/K 33 +/P 14 0 R +/S /Normal +/Pg 26 0 R +>> +endobj +146 0 obj +<< +/A 1041 0 R +/K 34 +/P 14 0 R +/S /heading#204 +/Pg 26 0 R +>> +endobj +147 0 obj +<< +/A 1021 0 R +/K 35 +/P 14 0 R +/S /Normal +/Pg 26 0 R +>> +endobj +148 0 obj +<< +/A 1021 0 R +/K 36 +/P 14 0 R +/S /Normal +/Pg 26 0 R +>> +endobj +149 0 obj +<< +/A 1042 0 R +/K [37 38 39 40 41] +/P 14 0 R +/S /Shape +/Pg 26 0 R +>> +endobj +150 0 obj +<< +/A 1041 0 R +/K 0 +/P 14 0 R +/S /heading#204 +/Pg 27 0 R +>> +endobj +151 0 obj +<< +/A 1021 0 R +/K 1 +/P 14 0 R +/S /Normal +/Pg 27 0 R +>> +endobj +152 0 obj +<< +/A 1041 0 R +/K 2 +/P 14 0 R +/S /heading#204 +/Pg 27 0 R +>> +endobj +153 0 obj +<< +/K 1043 0 R +/P 14 0 R +/S /L +>> +endobj +154 0 obj +<< +/A [1044 0 R] +/K 1045 0 R +/P 14 0 R +/S /Table +>> +endobj +155 0 obj +<< +/K 1046 0 R +/P 14 0 R +/S /L +>> +endobj +156 0 obj +<< +/A [1047 0 R] +/K 1048 0 R +/P 14 0 R +/S /Table +>> +endobj +157 0 obj +<< +/K 1049 0 R +/P 14 0 R +/S /L +>> +endobj +158 0 obj +<< +/A [1050 0 R] +/K 1051 0 R +/P 14 0 R +/S /Table +>> +endobj +159 0 obj +<< +/A 1022 0 R +/K 115 +/P 14 0 R +/S /heading#203 +/Pg 27 0 R +>> +endobj +160 0 obj +<< +/A 1037 0 R +/K 116 +/P 14 0 R +/S /Normal +/Pg 27 0 R +>> +endobj +161 0 obj +<< +/A [1052 0 R] +/K 1053 0 R +/P 14 0 R +/S /Table +>> +endobj +162 0 obj +<< +/A 1040 0 R +/K 141 +/P 14 0 R +/S /Normal +/Pg 27 0 R +>> +endobj +163 0 obj +<< +/A 1022 0 R +/K 0 +/P 14 0 R +/S /heading#202 +/Pg 28 0 R +>> +endobj +164 0 obj +<< +/A 1021 0 R +/K 1 +/P 14 0 R +/S /Body#20Text +/Pg 28 0 R +>> +endobj +165 0 obj +<< +/A 1021 0 R +/K 2 +/P 14 0 R +/S /Normal +/Pg 28 0 R +>> +endobj +166 0 obj +<< +/A 1021 0 R +/K 3 +/P 14 0 R +/S /Normal +/Pg 28 0 R +>> +endobj +167 0 obj +<< +/A 1021 0 R +/K 4 +/P 14 0 R +/S /Normal +/Pg 28 0 R +>> +endobj +168 0 obj +<< +/A 1021 0 R +/K 5 +/P 14 0 R +/S /Normal +/Pg 28 0 R +>> +endobj +169 0 obj +<< +/A 1021 0 R +/K 6 +/P 14 0 R +/S /Normal +/Pg 28 0 R +>> +endobj +170 0 obj +<< +/A 1021 0 R +/K 7 +/P 14 0 R +/S /Normal +/Pg 28 0 R +>> +endobj +171 0 obj +<< +/A 1021 0 R +/K 8 +/P 14 0 R +/S /Normal +/Pg 28 0 R +>> +endobj +172 0 obj +<< +/A 1021 0 R +/K 9 +/P 14 0 R +/S /Normal +/Pg 28 0 R +>> +endobj +173 0 obj +<< +/A 1021 0 R +/K 10 +/P 14 0 R +/S /Normal +/Pg 28 0 R +>> +endobj +174 0 obj +<< +/A 1021 0 R +/K 11 +/P 14 0 R +/S /Normal +/Pg 28 0 R +>> +endobj +175 0 obj +<< +/A 1021 0 R +/K 12 +/P 14 0 R +/S /Normal +/Pg 28 0 R +>> +endobj +176 0 obj +<< +/A 1021 0 R +/K 13 +/P 14 0 R +/S /Normal +/Pg 28 0 R +>> +endobj +177 0 obj +<< +/A 1021 0 R +/K 14 +/P 14 0 R +/S /Normal +/Pg 28 0 R +>> +endobj +178 0 obj +<< +/A 1021 0 R +/K 15 +/P 14 0 R +/S /Normal +/Pg 28 0 R +>> +endobj +179 0 obj +<< +/A 1021 0 R +/K 16 +/P 14 0 R +/S /Normal +/Pg 28 0 R +>> +endobj +180 0 obj +<< +/A 1021 0 R +/K 17 +/P 14 0 R +/S /Normal +/Pg 28 0 R +>> +endobj +181 0 obj +<< +/A 1021 0 R +/K 18 +/P 14 0 R +/S /Normal +/Pg 28 0 R +>> +endobj +182 0 obj +<< +/A 1021 0 R +/K 19 +/P 14 0 R +/S /Normal +/Pg 28 0 R +>> +endobj +183 0 obj +<< +/A 1021 0 R +/K 20 +/P 14 0 R +/S /Normal +/Pg 28 0 R +>> +endobj +184 0 obj +<< +/A 1021 0 R +/K 21 +/P 14 0 R +/S /Normal +/Pg 28 0 R +>> +endobj +185 0 obj +<< +/A 1021 0 R +/K 22 +/P 14 0 R +/S /Normal +/Pg 28 0 R +>> +endobj +186 0 obj +<< +/A 1021 0 R +/K 23 +/P 14 0 R +/S /Normal +/Pg 28 0 R +>> +endobj +187 0 obj +<< +/A 1021 0 R +/K 24 +/P 14 0 R +/S /Normal +/Pg 28 0 R +>> +endobj +188 0 obj +<< +/A 1021 0 R +/K 25 +/P 14 0 R +/S /Normal +/Pg 28 0 R +>> +endobj +189 0 obj +<< +/A 1021 0 R +/K 26 +/P 14 0 R +/S /Normal +/Pg 28 0 R +>> +endobj +190 0 obj +<< +/A 1021 0 R +/K 27 +/P 14 0 R +/S /Normal +/Pg 28 0 R +>> +endobj +191 0 obj +<< +/A 1021 0 R +/K 28 +/P 14 0 R +/S /Normal +/Pg 28 0 R +>> +endobj +192 0 obj +<< +/A 1021 0 R +/K 29 +/P 14 0 R +/S /Normal +/Pg 28 0 R +>> +endobj +193 0 obj +<< +/A 1021 0 R +/K 30 +/P 14 0 R +/S /Normal +/Pg 28 0 R +>> +endobj +194 0 obj +<< +/A 1021 0 R +/K 31 +/P 14 0 R +/S /Normal +/Pg 28 0 R +>> +endobj +195 0 obj +<< +/A 1021 0 R +/K 32 +/P 14 0 R +/S /Normal +/Pg 28 0 R +>> +endobj +196 0 obj +<< +/A 1021 0 R +/K 33 +/P 14 0 R +/S /Normal +/Pg 28 0 R +>> +endobj +197 0 obj +<< +/A 1021 0 R +/K 34 +/P 14 0 R +/S /Normal +/Pg 28 0 R +>> +endobj +198 0 obj +<< +/A 1021 0 R +/K 35 +/P 14 0 R +/S /Normal +/Pg 28 0 R +>> +endobj +199 0 obj +<< +/A 1021 0 R +/K 36 +/P 14 0 R +/S /Normal +/Pg 28 0 R +>> +endobj +200 0 obj +<< +/A 1021 0 R +/K 37 +/P 14 0 R +/S /Normal +/Pg 28 0 R +>> +endobj +201 0 obj +<< +/A 1021 0 R +/K 38 +/P 14 0 R +/S /Normal +/Pg 28 0 R +>> +endobj +202 0 obj +<< +/A 1021 0 R +/K 39 +/P 14 0 R +/S /Normal +/Pg 28 0 R +>> +endobj +203 0 obj +<< +/A 1021 0 R +/K 40 +/P 14 0 R +/S /Normal +/Pg 28 0 R +>> +endobj +204 0 obj +<< +/A 973 0 R +/K 0 +/P 14 0 R +/S /Normal +/Pg 29 0 R +>> +endobj +205 0 obj +<< +/A 1020 0 R +/K 1 +/P 14 0 R +/S /heading#201 +/Pg 29 0 R +>> +endobj +206 0 obj +<< +/A 1021 0 R +/K 2 +/P 14 0 R +/S /Normal +/Pg 29 0 R +>> +endobj +207 0 obj +<< +/A 1022 0 R +/K 3 +/P 14 0 R +/S /heading#202 +/Pg 29 0 R +>> +endobj +208 0 obj +<< +/A 1021 0 R +/K 4 +/P 14 0 R +/S /Normal +/Pg 29 0 R +>> +endobj +209 0 obj +<< +/A 1022 0 R +/K 5 +/P 14 0 R +/S /heading#203 +/Pg 29 0 R +>> +endobj +210 0 obj +<< +/A 1021 0 R +/K 6 +/P 14 0 R +/S /Normal +/Pg 29 0 R +>> +endobj +211 0 obj +<< +/A 1021 0 R +/K 7 +/P 14 0 R +/S /Normal +/Pg 29 0 R +>> +endobj +212 0 obj +<< +/A 1021 0 R +/K 8 +/P 14 0 R +/S /Normal +/Pg 29 0 R +>> +endobj +213 0 obj +<< +/A 1022 0 R +/K 9 +/P 14 0 R +/S /heading#203 +/Pg 29 0 R +>> +endobj +214 0 obj +<< +/A 1021 0 R +/K 10 +/P 14 0 R +/S /Normal +/Pg 29 0 R +>> +endobj +215 0 obj +<< +/A 1022 0 R +/K 11 +/P 14 0 R +/S /heading#202 +/Pg 29 0 R +>> +endobj +216 0 obj +<< +/A 1021 0 R +/K 12 +/P 14 0 R +/S /Normal +/Pg 29 0 R +>> +endobj +217 0 obj +<< +/A 1021 0 R +/K 13 +/P 14 0 R +/S /Normal +/Pg 29 0 R +>> +endobj +218 0 obj +<< +/A 1022 0 R +/K 14 +/P 14 0 R +/S /heading#202 +/Pg 29 0 R +>> +endobj +219 0 obj +<< +/A 1021 0 R +/K 15 +/P 14 0 R +/S /Normal +/Pg 29 0 R +>> +endobj +220 0 obj +<< +/A 1021 0 R +/K 0 +/P 14 0 R +/S /Normal +/Pg 30 0 R +>> +endobj +221 0 obj +<< +/A 1022 0 R +/K 1 +/P 14 0 R +/S /heading#203 +/Pg 30 0 R +>> +endobj +222 0 obj +<< +/A 1021 0 R +/K 2 +/P 14 0 R +/S /Normal +/Pg 30 0 R +>> +endobj +223 0 obj +<< +/A 1022 0 R +/K 3 +/P 14 0 R +/S /heading#203 +/Pg 30 0 R +>> +endobj +224 0 obj +<< +/A 1025 0 R +/K 4 +/P 14 0 R +/S /Normal +/Pg 30 0 R +>> +endobj +225 0 obj +<< +/A 1025 0 R +/K 5 +/P 14 0 R +/S /Normal +/Pg 30 0 R +>> +endobj +226 0 obj +<< +/A 1022 0 R +/K 6 +/P 14 0 R +/S /heading#203 +/Pg 30 0 R +>> +endobj +227 0 obj +<< +/A 1025 0 R +/K 7 +/P 14 0 R +/S /Normal +/Pg 30 0 R +>> +endobj +228 0 obj +<< +/A 1022 0 R +/K 8 +/P 14 0 R +/S /heading#202 +/Pg 30 0 R +>> +endobj +229 0 obj +<< +/A 973 0 R +/K 9 +/P 14 0 R +/S /Normal +/Pg 30 0 R +>> +endobj +230 0 obj +<< +/A 1021 0 R +/K 10 +/P 14 0 R +/S /Normal +/Pg 30 0 R +>> +endobj +231 0 obj +<< +/A [1054 0 R] +/K 1055 0 R +/P 14 0 R +/S /Table +>> +endobj +232 0 obj +<< +/A 1056 0 R +/K 23 +/P 14 0 R +/S /Normal +/Pg 30 0 R +>> +endobj +233 0 obj +<< +/K [1057 0 R 1058 0 R 1059 0 R 1060 0 R] +/P 14 0 R +/S /L +>> +endobj +234 0 obj +<< +/A 1022 0 R +/K 28 +/P 14 0 R +/S /heading#202 +/Pg 30 0 R +>> +endobj +235 0 obj +<< +/A 973 0 R +/K 29 +/P 14 0 R +/S /Normal +/Pg 30 0 R +>> +endobj +236 0 obj +<< +/A 1021 0 R +/K 30 +/P 14 0 R +/S /Normal +/Pg 30 0 R +>> +endobj +237 0 obj +<< +/A 973 0 R +/K 31 +/P 14 0 R +/S /Normal +/Pg 30 0 R +>> +endobj +238 0 obj +<< +/A 1021 0 R +/K 32 +/P 14 0 R +/S /Normal +/Pg 30 0 R +>> +endobj +239 0 obj +<< +/A 1022 0 R +/K 0 +/P 14 0 R +/S /heading#202 +/Pg 31 0 R +>> +endobj +240 0 obj +<< +/A 1021 0 R +/K 1 +/P 14 0 R +/S /Normal +/Pg 31 0 R +>> +endobj +241 0 obj +<< +/A 1021 0 R +/K 2 +/P 14 0 R +/S /Normal +/Pg 31 0 R +>> +endobj +242 0 obj +<< +/A 1022 0 R +/K 3 +/P 14 0 R +/S /heading#202 +/Pg 31 0 R +>> +endobj +243 0 obj +<< +/A 1021 0 R +/K 4 +/P 14 0 R +/S /Normal +/Pg 31 0 R +>> +endobj +244 0 obj +<< +/A 973 0 R +/K 5 +/P 14 0 R +/S /Normal +/Pg 31 0 R +>> +endobj +245 0 obj +<< +/A 973 0 R +/K 6 +/P 14 0 R +/S /Normal +/Pg 31 0 R +>> +endobj +246 0 obj +<< +/A 973 0 R +/K 7 +/P 14 0 R +/S /Normal +/Pg 31 0 R +>> +endobj +247 0 obj +<< +/A 973 0 R +/K 8 +/P 14 0 R +/S /Normal +/Pg 31 0 R +>> +endobj +248 0 obj +<< +/A 973 0 R +/K 9 +/P 14 0 R +/S /Normal +/Pg 31 0 R +>> +endobj +249 0 obj +<< +/A 973 0 R +/K 10 +/P 14 0 R +/S /Normal +/Pg 31 0 R +>> +endobj +250 0 obj +<< +/A 973 0 R +/K 11 +/P 14 0 R +/S /Normal +/Pg 31 0 R +>> +endobj +251 0 obj +<< +/A 973 0 R +/K 12 +/P 14 0 R +/S /Normal +/Pg 31 0 R +>> +endobj +252 0 obj +<< +/A 973 0 R +/K 13 +/P 14 0 R +/S /Normal +/Pg 31 0 R +>> +endobj +253 0 obj +<< +/A 973 0 R +/K 14 +/P 14 0 R +/S /Normal +/Pg 31 0 R +>> +endobj +254 0 obj +<< +/A 973 0 R +/K 15 +/P 14 0 R +/S /Normal +/Pg 31 0 R +>> +endobj +255 0 obj +<< +/A 973 0 R +/K 16 +/P 14 0 R +/S /Normal +/Pg 31 0 R +>> +endobj +256 0 obj +<< +/A 973 0 R +/K 17 +/P 14 0 R +/S /Normal +/Pg 31 0 R +>> +endobj +257 0 obj +<< +/A 973 0 R +/K 18 +/P 14 0 R +/S /Normal +/Pg 31 0 R +>> +endobj +258 0 obj +<< +/A 973 0 R +/K 19 +/P 14 0 R +/S /Normal +/Pg 31 0 R +>> +endobj +259 0 obj +<< +/A 973 0 R +/K 20 +/P 14 0 R +/S /Normal +/Pg 31 0 R +>> +endobj +260 0 obj +<< +/A 973 0 R +/K 21 +/P 14 0 R +/S /Normal +/Pg 31 0 R +>> +endobj +261 0 obj +<< +/A 973 0 R +/K 22 +/P 14 0 R +/S /Normal +/Pg 31 0 R +>> +endobj +262 0 obj +<< +/A 973 0 R +/K 23 +/P 14 0 R +/S /Normal +/Pg 31 0 R +>> +endobj +263 0 obj +<< +/A 973 0 R +/K 24 +/P 14 0 R +/S /Normal +/Pg 31 0 R +>> +endobj +264 0 obj +<< +/A 973 0 R +/K 25 +/P 14 0 R +/S /Normal +/Pg 31 0 R +>> +endobj +265 0 obj +<< +/A 973 0 R +/K 26 +/P 14 0 R +/S /Normal +/Pg 31 0 R +>> +endobj +266 0 obj +<< +/A 973 0 R +/K 27 +/P 14 0 R +/S /Normal +/Pg 31 0 R +>> +endobj +267 0 obj +<< +/A 973 0 R +/K 28 +/P 14 0 R +/S /Normal +/Pg 31 0 R +>> +endobj +268 0 obj +<< +/A 973 0 R +/K 29 +/P 14 0 R +/S /Normal +/Pg 31 0 R +>> +endobj +269 0 obj +<< +/A 973 0 R +/K 30 +/P 14 0 R +/S /Normal +/Pg 31 0 R +>> +endobj +270 0 obj +<< +/A 973 0 R +/K 31 +/P 14 0 R +/S /Normal +/Pg 31 0 R +>> +endobj +271 0 obj +<< +/A 973 0 R +/K 32 +/P 14 0 R +/S /Normal +/Pg 31 0 R +>> +endobj +272 0 obj +<< +/A 973 0 R +/K 33 +/P 14 0 R +/S /Normal +/Pg 31 0 R +>> +endobj +273 0 obj +<< +/A 973 0 R +/K 34 +/P 14 0 R +/S /Normal +/Pg 31 0 R +>> +endobj +274 0 obj +<< +/A 1020 0 R +/K 0 +/P 14 0 R +/S /heading#201 +/Pg 32 0 R +>> +endobj +275 0 obj +<< +/A 1040 0 R +/K 1 +/P 14 0 R +/S /Normal +/Pg 32 0 R +>> +endobj +276 0 obj +<< +/A 1022 0 R +/K 2 +/P 14 0 R +/S /heading#202 +/Pg 32 0 R +>> +endobj +277 0 obj +<< +/A 1040 0 R +/K 3 +/P 14 0 R +/S /Normal +/Pg 32 0 R +>> +endobj +278 0 obj +<< +/A 1061 0 R +/K 4 +/P 14 0 R +/S /Body#20Text#20Indent#203 +/Pg 32 0 R +>> +endobj +279 0 obj +<< +/A [1062 0 R] +/K 1063 0 R +/P 14 0 R +/S /Table +>> +endobj +280 0 obj +<< +/A 1064 0 R +/K 11 +/P 14 0 R +/S /Normal +/Pg 32 0 R +>> +endobj +281 0 obj +<< +/A [1065 0 R] +/K 1066 0 R +/P 14 0 R +/S /Table +>> +endobj +282 0 obj +<< +/A 972 0 R +/K 50 +/P 14 0 R +/S /Normal +/Pg 32 0 R +>> +endobj +283 0 obj +<< +/A 1022 0 R +/K 0 +/P 14 0 R +/S /heading#202 +/Pg 33 0 R +>> +endobj +284 0 obj +<< +/A 1021 0 R +/K 1 +/P 14 0 R +/S /Normal +/Pg 33 0 R +>> +endobj +285 0 obj +<< +/A 1021 0 R +/K 2 +/P 14 0 R +/S /Body#20Text#20Indent +/Pg 33 0 R +>> +endobj +286 0 obj +<< +/A 973 0 R +/K 3 +/P 14 0 R +/S /Normal +/Pg 33 0 R +>> +endobj +287 0 obj +<< +/A 973 0 R +/K 4 +/P 14 0 R +/S /Normal +/Pg 33 0 R +>> +endobj +288 0 obj +<< +/A 973 0 R +/K 5 +/P 14 0 R +/S /Normal +/Pg 33 0 R +>> +endobj +289 0 obj +<< +/A 1025 0 R +/K 6 +/P 14 0 R +/S /Normal +/Pg 33 0 R +>> +endobj +290 0 obj +<< +/K [1067 0 R 1068 0 R 1069 0 R 1070 0 R 1071 0 R 1072 0 R 1073 0 R 1074 0 R 1075 0 R 1076 0 R +1077 0 R 1078 0 R 1079 0 R 1080 0 R 1081 0 R 1082 0 R 1083 0 R 1084 0 R 1085 0 R 1086 0 R +1087 0 R 1088 0 R 1089 0 R] +/P 14 0 R +/S /L +>> +endobj +291 0 obj +<< +/A 1090 0 R +/K 30 +/P 14 0 R +/S /Normal +/Pg 33 0 R +>> +endobj +292 0 obj +<< +/A 1090 0 R +/K 31 +/P 14 0 R +/S /Normal +/Pg 33 0 R +>> +endobj +293 0 obj +<< +/A 1090 0 R +/K 32 +/P 14 0 R +/S /Normal +/Pg 33 0 R +>> +endobj +294 0 obj +<< +/A 1090 0 R +/K 33 +/P 14 0 R +/S /Normal +/Pg 33 0 R +>> +endobj +295 0 obj +<< +/A 1090 0 R +/K 34 +/P 14 0 R +/S /Normal +/Pg 33 0 R +>> +endobj +296 0 obj +<< +/A 1090 0 R +/K 35 +/P 14 0 R +/S /Normal +/Pg 33 0 R +>> +endobj +297 0 obj +<< +/A 1090 0 R +/K 36 +/P 14 0 R +/S /Normal +/Pg 33 0 R +>> +endobj +298 0 obj +<< +/A 1090 0 R +/K 37 +/P 14 0 R +/S /Normal +/Pg 33 0 R +>> +endobj +299 0 obj +<< +/A 1090 0 R +/K 38 +/P 14 0 R +/S /Normal +/Pg 33 0 R +>> +endobj +300 0 obj +<< +/A 1020 0 R +/K 0 +/P 14 0 R +/S /heading#201 +/Pg 34 0 R +>> +endobj +301 0 obj +<< +/A 1091 0 R +/K 1 +/P 14 0 R +/S /Normal +/Pg 34 0 R +>> +endobj +302 0 obj +<< +/A 1021 0 R +/K 2 +/P 14 0 R +/S /Normal +/Pg 34 0 R +>> +endobj +303 0 obj +<< +/A 1022 0 R +/K 3 +/P 14 0 R +/S /heading#202 +/Pg 34 0 R +>> +endobj +304 0 obj +<< +/A 1041 0 R +/K 4 +/P 14 0 R +/S /heading#204 +/Pg 34 0 R +>> +endobj +305 0 obj +<< +/A 973 0 R +/K 5 +/P 14 0 R +/S /Normal +/Pg 34 0 R +>> +endobj +306 0 obj +<< +/A 1092 0 R +/K 6 +/P 14 0 R +/S /Normal +/Pg 34 0 R +>> +endobj +307 0 obj +<< +/A 1092 0 R +/K 7 +/P 14 0 R +/S /Normal +/Pg 34 0 R +>> +endobj +308 0 obj +<< +/A 1092 0 R +/K 8 +/P 14 0 R +/S /Normal +/Pg 34 0 R +>> +endobj +309 0 obj +<< +/A 973 0 R +/K 9 +/P 14 0 R +/S /Normal +/Pg 34 0 R +>> +endobj +310 0 obj +<< +/A [1093 0 R] +/K 1094 0 R +/P 14 0 R +/S /Table +>> +endobj +311 0 obj +<< +/A 973 0 R +/K 31 +/P 14 0 R +/S /Normal +/Pg 34 0 R +>> +endobj +312 0 obj +<< +/A [1095 0 R] +/K 1096 0 R +/P 14 0 R +/S /Table +>> +endobj +313 0 obj +<< +/A 1097 0 R +/K 50 +/P 14 0 R +/S /Normal +/Pg 34 0 R +>> +endobj +314 0 obj +<< +/A 1098 0 R +/K 51 +/P 14 0 R +/S /Normal +/Pg 34 0 R +>> +endobj +315 0 obj +<< +/A 1098 0 R +/K 52 +/P 14 0 R +/S /Normal +/Pg 34 0 R +>> +endobj +316 0 obj +<< +/A 973 0 R +/K 53 +/P 14 0 R +/S /Normal +/Pg 34 0 R +>> +endobj +317 0 obj +<< +/A 973 0 R +/K 54 +/P 14 0 R +/S /Normal +/Pg 34 0 R +>> +endobj +318 0 obj +<< +/A 973 0 R +/K 55 +/P 14 0 R +/S /Normal +/Pg 34 0 R +>> +endobj +319 0 obj +<< +/A 973 0 R +/K 56 +/P 14 0 R +/S /Normal +/Pg 34 0 R +>> +endobj +320 0 obj +<< +/A 1041 0 R +/K 57 +/P 14 0 R +/S /heading#204 +/Pg 34 0 R +>> +endobj +321 0 obj +<< +/A 1099 0 R +/K 58 +/P 14 0 R +/S /Normal +/Pg 34 0 R +>> +endobj +322 0 obj +<< +/A 1100 0 R +/K 59 +/P 14 0 R +/S /Normal +/Pg 34 0 R +>> +endobj +323 0 obj +<< +/A 1100 0 R +/K 60 +/P 14 0 R +/S /Normal +/Pg 34 0 R +>> +endobj +324 0 obj +<< +/A 1100 0 R +/K 61 +/P 14 0 R +/S /Normal +/Pg 34 0 R +>> +endobj +325 0 obj +<< +/A 973 0 R +/K 62 +/P 14 0 R +/S /Normal +/Pg 34 0 R +>> +endobj +326 0 obj +<< +/A [1101 0 R] +/K 1102 0 R +/P 14 0 R +/S /Table +>> +endobj +327 0 obj +<< +/A 972 0 R +/K 84 +/P 14 0 R +/S /Normal +/Pg 34 0 R +>> +endobj +328 0 obj +<< +/A 973 0 R +/K 0 +/P 14 0 R +/S /Normal +/Pg 35 0 R +>> +endobj +329 0 obj +<< +/A [1103 0 R] +/K 1104 0 R +/P 14 0 R +/S /Table +>> +endobj +330 0 obj +<< +/A 1097 0 R +/K 19 +/P 14 0 R +/S /Normal +/Pg 35 0 R +>> +endobj +331 0 obj +<< +/A 1098 0 R +/K 20 +/P 14 0 R +/S /Normal +/Pg 35 0 R +>> +endobj +332 0 obj +<< +/A 973 0 R +/K 21 +/P 14 0 R +/S /Normal +/Pg 35 0 R +>> +endobj +333 0 obj +<< +/A 973 0 R +/K 22 +/P 14 0 R +/S /Normal +/Pg 35 0 R +>> +endobj +334 0 obj +<< +/A 973 0 R +/K 23 +/P 14 0 R +/S /Normal +/Pg 35 0 R +>> +endobj +335 0 obj +<< +/A 973 0 R +/K 24 +/P 14 0 R +/S /Normal +/Pg 35 0 R +>> +endobj +336 0 obj +<< +/A 1041 0 R +/K 25 +/P 14 0 R +/S /heading#204 +/Pg 35 0 R +>> +endobj +337 0 obj +<< +/A 1105 0 R +/K 26 +/P 14 0 R +/S /Normal +/Pg 35 0 R +>> +endobj +338 0 obj +<< +/A 1105 0 R +/K 27 +/P 14 0 R +/S /Normal +/Pg 35 0 R +>> +endobj +339 0 obj +<< +/A 1105 0 R +/K 28 +/P 14 0 R +/S /Normal +/Pg 35 0 R +>> +endobj +340 0 obj +<< +/A 1105 0 R +/K 29 +/P 14 0 R +/S /Normal +/Pg 35 0 R +>> +endobj +341 0 obj +<< +/A 973 0 R +/K 30 +/P 14 0 R +/S /Normal +/Pg 35 0 R +>> +endobj +342 0 obj +<< +/A [1106 0 R] +/K 1107 0 R +/P 14 0 R +/S /Table +>> +endobj +343 0 obj +<< +/A 973 0 R +/K 52 +/P 14 0 R +/S /Normal +/Pg 35 0 R +>> +endobj +344 0 obj +<< +/A [1108 0 R] +/K 1109 0 R +/P 14 0 R +/S /Table +>> +endobj +345 0 obj +<< +/A 1097 0 R +/K 71 +/P 14 0 R +/S /Normal +/Pg 35 0 R +>> +endobj +346 0 obj +<< +/A 1110 0 R +/K 72 +/P 14 0 R +/S /Normal +/Pg 35 0 R +>> +endobj +347 0 obj +<< +/A 973 0 R +/K 73 +/P 14 0 R +/S /Normal +/Pg 35 0 R +>> +endobj +348 0 obj +<< +/A 973 0 R +/K 74 +/P 14 0 R +/S /Normal +/Pg 35 0 R +>> +endobj +349 0 obj +<< +/A 973 0 R +/K 75 +/P 14 0 R +/S /Normal +/Pg 35 0 R +>> +endobj +350 0 obj +<< +/A 973 0 R +/K 76 +/P 14 0 R +/S /Normal +/Pg 35 0 R +>> +endobj +351 0 obj +<< +/A 973 0 R +/K 77 +/P 14 0 R +/S /Normal +/Pg 35 0 R +>> +endobj +352 0 obj +<< +/A 1041 0 R +/K 78 +/P 14 0 R +/S /heading#204 +/Pg 35 0 R +>> +endobj +353 0 obj +<< +/A 1111 0 R +/K 79 +/P 14 0 R +/S /Normal +/Pg 35 0 R +>> +endobj +354 0 obj +<< +/A 1111 0 R +/K 80 +/P 14 0 R +/S /Normal +/Pg 35 0 R +>> +endobj +355 0 obj +<< +/A 1111 0 R +/K 81 +/P 14 0 R +/S /Normal +/Pg 35 0 R +>> +endobj +356 0 obj +<< +/A 1111 0 R +/K 82 +/P 14 0 R +/S /Normal +/Pg 35 0 R +>> +endobj +357 0 obj +<< +/A 973 0 R +/K 83 +/P 14 0 R +/S /Normal +/Pg 35 0 R +>> +endobj +358 0 obj +<< +/A [1112 0 R] +/K 1113 0 R +/P 14 0 R +/S /Table +>> +endobj +359 0 obj +<< +/A 972 0 R +/K 108 +/P 14 0 R +/S /Normal +/Pg 35 0 R +>> +endobj +360 0 obj +<< +/A 973 0 R +/K 0 +/P 14 0 R +/S /Normal +/Pg 36 0 R +>> +endobj +361 0 obj +<< +/A [1114 0 R] +/K 1115 0 R +/P 14 0 R +/S /Table +>> +endobj +362 0 obj +<< +/A 1097 0 R +/K 19 +/P 14 0 R +/S /Normal +/Pg 36 0 R +>> +endobj +363 0 obj +<< +/A 1098 0 R +/K 20 +/P 14 0 R +/S /Normal +/Pg 36 0 R +>> +endobj +364 0 obj +<< +/A 1098 0 R +/K 21 +/P 14 0 R +/S /Normal +/Pg 36 0 R +>> +endobj +365 0 obj +<< +/A 973 0 R +/K 22 +/P 14 0 R +/S /Normal +/Pg 36 0 R +>> +endobj +366 0 obj +<< +/A 1116 0 R +/K 23 +/P 14 0 R +/S /Normal +/Pg 36 0 R +>> +endobj +367 0 obj +<< +/A 973 0 R +/K 24 +/P 14 0 R +/S /Normal +/Pg 36 0 R +>> +endobj +368 0 obj +<< +/A 973 0 R +/K 25 +/P 14 0 R +/S /Normal +/Pg 36 0 R +>> +endobj +369 0 obj +<< +/A 973 0 R +/K 26 +/P 14 0 R +/S /Normal +/Pg 36 0 R +>> +endobj +370 0 obj +<< +/A 973 0 R +/K 27 +/P 14 0 R +/S /Normal +/Pg 36 0 R +>> +endobj +371 0 obj +<< +/A [1117 0 R] +/K 1118 0 R +/P 14 0 R +/S /Table +>> +endobj +372 0 obj +<< +/A 1041 0 R +/K 40 +/P 14 0 R +/S /heading#204 +/Pg 36 0 R +>> +endobj +373 0 obj +<< +/A 1041 0 R +/K 41 +/P 14 0 R +/S /heading#204 +/Pg 36 0 R +>> +endobj +374 0 obj +<< +/A 1119 0 R +/K 42 +/P 14 0 R +/S /Normal +/Pg 36 0 R +>> +endobj +375 0 obj +<< +/A 1100 0 R +/K 43 +/P 14 0 R +/S /Normal +/Pg 36 0 R +>> +endobj +376 0 obj +<< +/A 1100 0 R +/K 44 +/P 14 0 R +/S /Normal +/Pg 36 0 R +>> +endobj +377 0 obj +<< +/A 1100 0 R +/K 45 +/P 14 0 R +/S /Normal +/Pg 36 0 R +>> +endobj +378 0 obj +<< +/A 973 0 R +/K 46 +/P 14 0 R +/S /Normal +/Pg 36 0 R +>> +endobj +379 0 obj +<< +/A [1120 0 R] +/K 1121 0 R +/P 14 0 R +/S /Table +>> +endobj +380 0 obj +<< +/A 973 0 R +/K 65 +/P 14 0 R +/S /Normal +/Pg 36 0 R +>> +endobj +381 0 obj +<< +/A [1122 0 R] +/K 1123 0 R +/P 14 0 R +/S /Table +>> +endobj +382 0 obj +<< +/A 1124 0 R +/K 87 +/P 14 0 R +/S /Normal +/Pg 36 0 R +>> +endobj +383 0 obj +<< +/A 1125 0 R +/K 88 +/P 14 0 R +/S /Normal +/Pg 36 0 R +>> +endobj +384 0 obj +<< +/A 973 0 R +/K 89 +/P 14 0 R +/S /Normal +/Pg 36 0 R +>> +endobj +385 0 obj +<< +/A 973 0 R +/K 90 +/P 14 0 R +/S /Normal +/Pg 36 0 R +>> +endobj +386 0 obj +<< +/A 973 0 R +/K 91 +/P 14 0 R +/S /Normal +/Pg 36 0 R +>> +endobj +387 0 obj +<< +/A 973 0 R +/K 92 +/P 14 0 R +/S /Normal +/Pg 36 0 R +>> +endobj +388 0 obj +<< +/A 973 0 R +/K 93 +/P 14 0 R +/S /Normal +/Pg 36 0 R +>> +endobj +389 0 obj +<< +/A 973 0 R +/K 94 +/P 14 0 R +/S /Normal +/Pg 36 0 R +>> +endobj +390 0 obj +<< +/A 972 0 R +/K 0 +/P 14 0 R +/S /Normal +/Pg 37 0 R +>> +endobj +391 0 obj +<< +/A [1126 0 R] +/K 1127 0 R +/P 14 0 R +/S /Table +>> +endobj +392 0 obj +<< +/A 973 0 R +/K 34 +/P 14 0 R +/S /Normal +/Pg 37 0 R +>> +endobj +393 0 obj +<< +/A 1041 0 R +/K 35 +/P 14 0 R +/S /heading#204 +/Pg 37 0 R +>> +endobj +394 0 obj +<< +/A 1128 0 R +/K 36 +/P 14 0 R +/S /Normal +/Pg 37 0 R +>> +endobj +395 0 obj +<< +/A 1128 0 R +/K 37 +/P 14 0 R +/S /Normal +/Pg 37 0 R +>> +endobj +396 0 obj +<< +/A 1129 0 R +/K 38 +/P 14 0 R +/S /Normal +/Pg 37 0 R +>> +endobj +397 0 obj +<< +/A 1130 0 R +/K 39 +/P 14 0 R +/S /Normal +/Pg 37 0 R +>> +endobj +398 0 obj +<< +/A 1131 0 R +/K 40 +/P 14 0 R +/S /Normal +/Pg 37 0 R +>> +endobj +399 0 obj +<< +/A 1131 0 R +/K 41 +/P 14 0 R +/S /Normal +/Pg 37 0 R +>> +endobj +400 0 obj +<< +/A 1128 0 R +/K 42 +/P 14 0 R +/S /Normal +/Pg 37 0 R +>> +endobj +401 0 obj +<< +/A 1128 0 R +/K 43 +/P 14 0 R +/S /Normal +/Pg 37 0 R +>> +endobj +402 0 obj +<< +/A 973 0 R +/K 44 +/P 14 0 R +/S /Normal +/Pg 37 0 R +>> +endobj +403 0 obj +<< +/A [1132 0 R] +/K 1133 0 R +/P 14 0 R +/S /Table +>> +endobj +404 0 obj +<< +/A 973 0 R +/K 66 +/P 14 0 R +/S /Normal +/Pg 37 0 R +>> +endobj +405 0 obj +<< +/A [1134 0 R] +/K 1135 0 R +/P 14 0 R +/S /Table +>> +endobj +406 0 obj +<< +/A 1097 0 R +/K 88 +/P 14 0 R +/S /Normal +/Pg 37 0 R +>> +endobj +407 0 obj +<< +/A 1023 0 R +/K 89 +/P 14 0 R +/S /Normal +/Pg 37 0 R +>> +endobj +408 0 obj +<< +/A 1110 0 R +/K 90 +/P 14 0 R +/S /Normal +/Pg 37 0 R +>> +endobj +409 0 obj +<< +/A 1097 0 R +/K 91 +/P 14 0 R +/S /Normal +/Pg 37 0 R +>> +endobj +410 0 obj +<< +/A [1136 0 R] +/K 1137 0 R +/P 14 0 R +/S /Table +>> +endobj +411 0 obj +<< +/A 972 0 R +/K 0 +/P 14 0 R +/S /Normal +/Pg 38 0 R +>> +endobj +412 0 obj +<< +/A 973 0 R +/K 1 +/P 14 0 R +/S /Normal +/Pg 38 0 R +>> +endobj +413 0 obj +<< +/A 973 0 R +/K 2 +/P 14 0 R +/S /Normal +/Pg 38 0 R +>> +endobj +414 0 obj +<< +/A 973 0 R +/K 3 +/P 14 0 R +/S /Normal +/Pg 38 0 R +>> +endobj +415 0 obj +<< +/A 973 0 R +/K 4 +/P 14 0 R +/S /Normal +/Pg 38 0 R +>> +endobj +416 0 obj +<< +/A 1041 0 R +/K 5 +/P 14 0 R +/S /heading#204 +/Pg 38 0 R +>> +endobj +417 0 obj +<< +/A 1138 0 R +/K 6 +/P 14 0 R +/S /Normal +/Pg 38 0 R +>> +endobj +418 0 obj +<< +/A 1138 0 R +/K 7 +/P 14 0 R +/S /Normal +/Pg 38 0 R +>> +endobj +419 0 obj +<< +/A 1138 0 R +/K 8 +/P 14 0 R +/S /Normal +/Pg 38 0 R +>> +endobj +420 0 obj +<< +/A 1138 0 R +/K 9 +/P 14 0 R +/S /Normal +/Pg 38 0 R +>> +endobj +421 0 obj +<< +/A 973 0 R +/K 10 +/P 14 0 R +/S /Normal +/Pg 38 0 R +>> +endobj +422 0 obj +<< +/A [1139 0 R] +/K 1140 0 R +/P 14 0 R +/S /Table +>> +endobj +423 0 obj +<< +/A 973 0 R +/K 29 +/P 14 0 R +/S /Normal +/Pg 38 0 R +>> +endobj +424 0 obj +<< +/A [1141 0 R] +/K 1142 0 R +/P 14 0 R +/S /Table +>> +endobj +425 0 obj +<< +/A 1097 0 R +/K 51 +/P 14 0 R +/S /Normal +/Pg 38 0 R +>> +endobj +426 0 obj +<< +/A 1110 0 R +/K 52 +/P 14 0 R +/S /Normal +/Pg 38 0 R +>> +endobj +427 0 obj +<< +/A 973 0 R +/K 53 +/P 14 0 R +/S /Normal +/Pg 38 0 R +>> +endobj +428 0 obj +<< +/A 973 0 R +/K 54 +/P 14 0 R +/S /Normal +/Pg 38 0 R +>> +endobj +429 0 obj +<< +/A 973 0 R +/K 55 +/P 14 0 R +/S /Normal +/Pg 38 0 R +>> +endobj +430 0 obj +<< +/A 973 0 R +/K 56 +/P 14 0 R +/S /Normal +/Pg 38 0 R +>> +endobj +431 0 obj +<< +/A 1022 0 R +/K 57 +/P 14 0 R +/S /heading#202 +/Pg 38 0 R +>> +endobj +432 0 obj +<< +/A 1041 0 R +/K 58 +/P 14 0 R +/S /heading#204 +/Pg 38 0 R +>> +endobj +433 0 obj +<< +/A 1143 0 R +/K 59 +/P 14 0 R +/S /Normal +/Pg 38 0 R +>> +endobj +434 0 obj +<< +/A 1092 0 R +/K 60 +/P 14 0 R +/S /Normal +/Pg 38 0 R +>> +endobj +435 0 obj +<< +/A 1092 0 R +/K 61 +/P 14 0 R +/S /Normal +/Pg 38 0 R +>> +endobj +436 0 obj +<< +/A 1092 0 R +/K 62 +/P 14 0 R +/S /Normal +/Pg 38 0 R +>> +endobj +437 0 obj +<< +/A 973 0 R +/K 63 +/P 14 0 R +/S /Normal +/Pg 38 0 R +>> +endobj +438 0 obj +<< +/A [1144 0 R] +/K 1145 0 R +/P 14 0 R +/S /Table +>> +endobj +439 0 obj +<< +/A 973 0 R +/K 82 +/P 14 0 R +/S /Normal +/Pg 38 0 R +>> +endobj +440 0 obj +<< +/A [1146 0 R] +/K 1147 0 R +/P 14 0 R +/S /Table +>> +endobj +441 0 obj +<< +/A 1097 0 R +/K 6 +/P 14 0 R +/S /Normal +/Pg 39 0 R +>> +endobj +442 0 obj +<< +/A 1097 0 R +/K 7 +/P 14 0 R +/S /Normal +/Pg 39 0 R +>> +endobj +443 0 obj +<< +/A 1110 0 R +/K 8 +/P 14 0 R +/S /Normal +/Pg 39 0 R +>> +endobj +444 0 obj +<< +/A 1110 0 R +/K 9 +/P 14 0 R +/S /Normal +/Pg 39 0 R +>> +endobj +445 0 obj +<< +/A 1110 0 R +/K 10 +/P 14 0 R +/S /Normal +/Pg 39 0 R +>> +endobj +446 0 obj +<< +/A 973 0 R +/K 11 +/P 14 0 R +/S /Normal +/Pg 39 0 R +>> +endobj +447 0 obj +<< +/A 973 0 R +/K 12 +/P 14 0 R +/S /Normal +/Pg 39 0 R +>> +endobj +448 0 obj +<< +/A 973 0 R +/K 13 +/P 14 0 R +/S /Normal +/Pg 39 0 R +>> +endobj +449 0 obj +<< +/A 973 0 R +/K 14 +/P 14 0 R +/S /Normal +/Pg 39 0 R +>> +endobj +450 0 obj +<< +/A 973 0 R +/K 15 +/P 14 0 R +/S /Normal +/Pg 39 0 R +>> +endobj +451 0 obj +<< +/A 1041 0 R +/K 16 +/P 14 0 R +/S /heading#204 +/Pg 39 0 R +>> +endobj +452 0 obj +<< +/A 1119 0 R +/K 17 +/P 14 0 R +/S /Normal +/Pg 39 0 R +>> +endobj +453 0 obj +<< +/A 1100 0 R +/K 18 +/P 14 0 R +/S /Normal +/Pg 39 0 R +>> +endobj +454 0 obj +<< +/A 973 0 R +/K 19 +/P 14 0 R +/S /Normal +/Pg 39 0 R +>> +endobj +455 0 obj +<< +/A 1100 0 R +/K 20 +/P 14 0 R +/S /Normal +/Pg 39 0 R +>> +endobj +456 0 obj +<< +/A 973 0 R +/K 21 +/P 14 0 R +/S /Normal +/Pg 39 0 R +>> +endobj +457 0 obj +<< +/A [1148 0 R] +/K 1149 0 R +/P 14 0 R +/S /Table +>> +endobj +458 0 obj +<< +/A 973 0 R +/K 40 +/P 14 0 R +/S /Normal +/Pg 39 0 R +>> +endobj +459 0 obj +<< +/A [1150 0 R] +/K 1151 0 R +/P 14 0 R +/S /Table +>> +endobj +460 0 obj +<< +/A 973 0 R +/K 59 +/P 14 0 R +/S /Normal +/Pg 39 0 R +>> +endobj +461 0 obj +<< +/A [1152 0 R] +/K 1153 0 R +/P 14 0 R +/S /Table +>> +endobj +462 0 obj +<< +/A 973 0 R +/K 78 +/P 14 0 R +/S /Normal +/Pg 39 0 R +>> +endobj +463 0 obj +<< +/A [1154 0 R] +/K 1155 0 R +/P 14 0 R +/S /Table +>> +endobj +464 0 obj +<< +/A 1097 0 R +/K 97 +/P 14 0 R +/S /Normal +/Pg 39 0 R +>> +endobj +465 0 obj +<< +/A 1023 0 R +/K 98 +/P 14 0 R +/S /Normal +/Pg 39 0 R +>> +endobj +466 0 obj +<< +/A 1023 0 R +/K 99 +/P 14 0 R +/S /Normal +/Pg 39 0 R +>> +endobj +467 0 obj +<< +/A 1110 0 R +/K 100 +/P 14 0 R +/S /Normal +/Pg 39 0 R +>> +endobj +468 0 obj +<< +/A 1110 0 R +/K 101 +/P 14 0 R +/S /Normal +/Pg 39 0 R +>> +endobj +469 0 obj +<< +/A 973 0 R +/K 102 +/P 14 0 R +/S /Normal +/Pg 39 0 R +>> +endobj +470 0 obj +<< +/A 973 0 R +/K 103 +/P 14 0 R +/S /Normal +/Pg 39 0 R +>> +endobj +471 0 obj +<< +/A 973 0 R +/K 104 +/P 14 0 R +/S /Normal +/Pg 39 0 R +>> +endobj +472 0 obj +<< +/A 973 0 R +/K 105 +/P 14 0 R +/S /Normal +/Pg 39 0 R +>> +endobj +473 0 obj +<< +/A 972 0 R +/K 0 +/P 14 0 R +/S /Normal +/Pg 40 0 R +>> +endobj +474 0 obj +<< +/A 1041 0 R +/K 1 +/P 14 0 R +/S /heading#204 +/Pg 40 0 R +>> +endobj +475 0 obj +<< +/A 1156 0 R +/K 2 +/P 14 0 R +/S /Normal +/Pg 40 0 R +>> +endobj +476 0 obj +<< +/A 1092 0 R +/K 3 +/P 14 0 R +/S /Normal +/Pg 40 0 R +>> +endobj +477 0 obj +<< +/A 1092 0 R +/K 4 +/P 14 0 R +/S /Normal +/Pg 40 0 R +>> +endobj +478 0 obj +<< +/A 1092 0 R +/K 5 +/P 14 0 R +/S /Normal +/Pg 40 0 R +>> +endobj +479 0 obj +<< +/A 973 0 R +/K 6 +/P 14 0 R +/S /Normal +/Pg 40 0 R +>> +endobj +480 0 obj +<< +/A [1157 0 R] +/K 1158 0 R +/P 14 0 R +/S /Table +>> +endobj +481 0 obj +<< +/A 973 0 R +/K 25 +/P 14 0 R +/S /Normal +/Pg 40 0 R +>> +endobj +482 0 obj +<< +/A [1159 0 R] +/K 1160 0 R +/P 14 0 R +/S /Table +>> +endobj +483 0 obj +<< +/A 973 0 R +/K 44 +/P 14 0 R +/S /Normal +/Pg 40 0 R +>> +endobj +484 0 obj +<< +/A [1161 0 R] +/K 1162 0 R +/P 14 0 R +/S /Table +>> +endobj +485 0 obj +<< +/A 973 0 R +/K 63 +/P 14 0 R +/S /Normal +/Pg 40 0 R +>> +endobj +486 0 obj +<< +/A [1163 0 R] +/K 1164 0 R +/P 14 0 R +/S /Table +>> +endobj +487 0 obj +<< +/A 1097 0 R +/K 82 +/P 14 0 R +/S /Normal +/Pg 40 0 R +>> +endobj +488 0 obj +<< +/A 1097 0 R +/K 83 +/P 14 0 R +/S /Normal +/Pg 40 0 R +>> +endobj +489 0 obj +<< +/A 1097 0 R +/K 84 +/P 14 0 R +/S /Normal +/Pg 40 0 R +>> +endobj +490 0 obj +<< +/A 1110 0 R +/K 85 +/P 14 0 R +/S /Normal +/Pg 40 0 R +>> +endobj +491 0 obj +<< +/A 1165 0 R +/K 86 +/P 14 0 R +/S /Normal +/Pg 40 0 R +>> +endobj +492 0 obj +<< +/A 973 0 R +/K 87 +/P 14 0 R +/S /Normal +/Pg 40 0 R +>> +endobj +493 0 obj +<< +/A 973 0 R +/K 88 +/P 14 0 R +/S /Normal +/Pg 40 0 R +>> +endobj +494 0 obj +<< +/A 973 0 R +/K 89 +/P 14 0 R +/S /Normal +/Pg 40 0 R +>> +endobj +495 0 obj +<< +/A 973 0 R +/K 90 +/P 14 0 R +/S /Normal +/Pg 40 0 R +>> +endobj +496 0 obj +<< +/A 1041 0 R +/K 91 +/P 14 0 R +/S /heading#204 +/Pg 40 0 R +>> +endobj +497 0 obj +<< +/A 1166 0 R +/K 92 +/P 14 0 R +/S /Normal +/Pg 40 0 R +>> +endobj +498 0 obj +<< +/A 1092 0 R +/K 93 +/P 14 0 R +/S /Normal +/Pg 40 0 R +>> +endobj +499 0 obj +<< +/A 1092 0 R +/K 94 +/P 14 0 R +/S /Normal +/Pg 40 0 R +>> +endobj +500 0 obj +<< +/A 1092 0 R +/K 95 +/P 14 0 R +/S /Normal +/Pg 40 0 R +>> +endobj +501 0 obj +<< +/A 973 0 R +/K 96 +/P 14 0 R +/S /Normal +/Pg 40 0 R +>> +endobj +502 0 obj +<< +/A [1167 0 R] +/K 1168 0 R +/P 14 0 R +/S /Table +>> +endobj +503 0 obj +<< +/A 1169 0 R +/K 21 +/P 14 0 R +/S /Normal +/Pg 41 0 R +>> +endobj +504 0 obj +<< +/A 973 0 R +/K 22 +/P 14 0 R +/S /Normal +/Pg 41 0 R +>> +endobj +505 0 obj +<< +/A [1170 0 R] +/K 1171 0 R +/P 14 0 R +/S /Table +>> +endobj +506 0 obj +<< +/A 1097 0 R +/K 41 +/P 14 0 R +/S /Normal +/Pg 41 0 R +>> +endobj +507 0 obj +<< +/A 1110 0 R +/K 42 +/P 14 0 R +/S /Normal +/Pg 41 0 R +>> +endobj +508 0 obj +<< +/A 1110 0 R +/K 43 +/P 14 0 R +/S /Normal +/Pg 41 0 R +>> +endobj +509 0 obj +<< +/A 1110 0 R +/K 44 +/P 14 0 R +/S /Normal +/Pg 41 0 R +>> +endobj +510 0 obj +<< +/A 1110 0 R +/K 45 +/P 14 0 R +/S /Normal +/Pg 41 0 R +>> +endobj +511 0 obj +<< +/A 973 0 R +/K 46 +/P 14 0 R +/S /Normal +/Pg 41 0 R +>> +endobj +512 0 obj +<< +/A 973 0 R +/K 47 +/P 14 0 R +/S /Normal +/Pg 41 0 R +>> +endobj +513 0 obj +<< +/A 973 0 R +/K 48 +/P 14 0 R +/S /Normal +/Pg 41 0 R +>> +endobj +514 0 obj +<< +/A 973 0 R +/K 49 +/P 14 0 R +/S /Normal +/Pg 41 0 R +>> +endobj +515 0 obj +<< +/A 1041 0 R +/K 50 +/P 14 0 R +/S /heading#204 +/Pg 41 0 R +>> +endobj +516 0 obj +<< +/A 1172 0 R +/K 51 +/P 14 0 R +/S /Normal +/Pg 41 0 R +>> +endobj +517 0 obj +<< +/A 1173 0 R +/K 52 +/P 14 0 R +/S /Normal +/Pg 41 0 R +>> +endobj +518 0 obj +<< +/A 1173 0 R +/K 53 +/P 14 0 R +/S /Normal +/Pg 41 0 R +>> +endobj +519 0 obj +<< +/A 1173 0 R +/K 54 +/P 14 0 R +/S /Normal +/Pg 41 0 R +>> +endobj +520 0 obj +<< +/A 973 0 R +/K 55 +/P 14 0 R +/S /Normal +/Pg 41 0 R +>> +endobj +521 0 obj +<< +/A [1174 0 R] +/K 1175 0 R +/P 14 0 R +/S /Table +>> +endobj +522 0 obj +<< +/A 973 0 R +/K 74 +/P 14 0 R +/S /Normal +/Pg 41 0 R +>> +endobj +523 0 obj +<< +/A [1176 0 R] +/K 1177 0 R +/P 14 0 R +/S /Table +>> +endobj +524 0 obj +<< +/A 1097 0 R +/K 93 +/P 14 0 R +/S /Normal +/Pg 41 0 R +>> +endobj +525 0 obj +<< +/A 1110 0 R +/K 94 +/P 14 0 R +/S /Normal +/Pg 41 0 R +>> +endobj +526 0 obj +<< +/A 1110 0 R +/K 95 +/P 14 0 R +/S /Normal +/Pg 41 0 R +>> +endobj +527 0 obj +<< +/A 973 0 R +/K 96 +/P 14 0 R +/S /Normal +/Pg 41 0 R +>> +endobj +528 0 obj +<< +/A 973 0 R +/K 97 +/P 14 0 R +/S /Normal +/Pg 41 0 R +>> +endobj +529 0 obj +<< +/A 973 0 R +/K 98 +/P 14 0 R +/S /Normal +/Pg 41 0 R +>> +endobj +530 0 obj +<< +/A 973 0 R +/K 99 +/P 14 0 R +/S /Normal +/Pg 41 0 R +>> +endobj +531 0 obj +<< +/A 1041 0 R +/K 0 +/P 14 0 R +/S /heading#204 +/Pg 42 0 R +>> +endobj +532 0 obj +<< +/A 1173 0 R +/K 1 +/P 14 0 R +/S /Normal +/Pg 42 0 R +>> +endobj +533 0 obj +<< +/A 1173 0 R +/K 2 +/P 14 0 R +/S /Normal +/Pg 42 0 R +>> +endobj +534 0 obj +<< +/A 1173 0 R +/K 3 +/P 14 0 R +/S /Normal +/Pg 42 0 R +>> +endobj +535 0 obj +<< +/A 1173 0 R +/K 4 +/P 14 0 R +/S /Normal +/Pg 42 0 R +>> +endobj +536 0 obj +<< +/A 973 0 R +/K 5 +/P 14 0 R +/S /Normal +/Pg 42 0 R +>> +endobj +537 0 obj +<< +/A [1178 0 R] +/K 1179 0 R +/P 14 0 R +/S /Table +>> +endobj +538 0 obj +<< +/A 1097 0 R +/K 27 +/P 14 0 R +/S /Normal +/Pg 42 0 R +>> +endobj +539 0 obj +<< +/A 973 0 R +/K 28 +/P 14 0 R +/S /Normal +/Pg 42 0 R +>> +endobj +540 0 obj +<< +/A [1180 0 R] +/K 1181 0 R +/P 14 0 R +/S /Table +>> +endobj +541 0 obj +<< +/A 973 0 R +/K 47 +/P 14 0 R +/S /Normal +/Pg 42 0 R +>> +endobj +542 0 obj +<< +/A [1182 0 R] +/K 1183 0 R +/P 14 0 R +/S /Table +>> +endobj +543 0 obj +<< +/A 973 0 R +/K 66 +/P 14 0 R +/S /Normal +/Pg 42 0 R +>> +endobj +544 0 obj +<< +/A [1184 0 R] +/K 1185 0 R +/P 14 0 R +/S /Table +>> +endobj +545 0 obj +<< +/A 1097 0 R +/K 85 +/P 14 0 R +/S /Normal +/Pg 42 0 R +>> +endobj +546 0 obj +<< +/A 1023 0 R +/K 86 +/P 14 0 R +/S /Normal +/Pg 42 0 R +>> +endobj +547 0 obj +<< +/A 1023 0 R +/K 87 +/P 14 0 R +/S /Normal +/Pg 42 0 R +>> +endobj +548 0 obj +<< +/A 1186 0 R +/K 88 +/P 14 0 R +/S /Normal +/Pg 42 0 R +>> +endobj +549 0 obj +<< +/A 1186 0 R +/K 89 +/P 14 0 R +/S /Normal +/Pg 42 0 R +>> +endobj +550 0 obj +<< +/A 1186 0 R +/K 90 +/P 14 0 R +/S /Normal +/Pg 42 0 R +>> +endobj +551 0 obj +<< +/A 973 0 R +/K 91 +/P 14 0 R +/S /Normal +/Pg 42 0 R +>> +endobj +552 0 obj +<< +/A 973 0 R +/K 92 +/P 14 0 R +/S /Normal +/Pg 42 0 R +>> +endobj +553 0 obj +<< +/A 973 0 R +/K 93 +/P 14 0 R +/S /Normal +/Pg 42 0 R +>> +endobj +554 0 obj +<< +/A 973 0 R +/K 94 +/P 14 0 R +/S /Normal +/Pg 42 0 R +>> +endobj +555 0 obj +<< +/A 1041 0 R +/K 95 +/P 14 0 R +/S /heading#204 +/Pg 42 0 R +>> +endobj +556 0 obj +<< +/A 1092 0 R +/K 96 +/P 14 0 R +/S /Normal +/Pg 42 0 R +>> +endobj +557 0 obj +<< +/A 1092 0 R +/K 97 +/P 14 0 R +/S /Normal +/Pg 42 0 R +>> +endobj +558 0 obj +<< +/A 1092 0 R +/K 98 +/P 14 0 R +/S /Normal +/Pg 42 0 R +>> +endobj +559 0 obj +<< +/A 1092 0 R +/K 99 +/P 14 0 R +/S /Normal +/Pg 42 0 R +>> +endobj +560 0 obj +<< +/A 973 0 R +/K 100 +/P 14 0 R +/S /Normal +/Pg 42 0 R +>> +endobj +561 0 obj +<< +/A [1187 0 R] +/K 1188 0 R +/P 14 0 R +/S /Table +>> +endobj +562 0 obj +<< +/A 1097 0 R +/K 0 +/P 14 0 R +/S /Normal +/Pg 43 0 R +>> +endobj +563 0 obj +<< +/A 973 0 R +/K 1 +/P 14 0 R +/S /Normal +/Pg 43 0 R +>> +endobj +564 0 obj +<< +/A [1189 0 R] +/K 1190 0 R +/P 14 0 R +/S /Table +>> +endobj +565 0 obj +<< +/A 973 0 R +/K 20 +/P 14 0 R +/S /Normal +/Pg 43 0 R +>> +endobj +566 0 obj +<< +/A [1191 0 R] +/K 1192 0 R +/P 14 0 R +/S /Table +>> +endobj +567 0 obj +<< +/A 973 0 R +/K 39 +/P 14 0 R +/S /Normal +/Pg 43 0 R +>> +endobj +568 0 obj +<< +/A [1193 0 R] +/K 1194 0 R +/P 14 0 R +/S /Table +>> +endobj +569 0 obj +<< +/A 1097 0 R +/K 58 +/P 14 0 R +/S /Normal +/Pg 43 0 R +>> +endobj +570 0 obj +<< +/A 1023 0 R +/K 59 +/P 14 0 R +/S /Normal +/Pg 43 0 R +>> +endobj +571 0 obj +<< +/A 1023 0 R +/K 60 +/P 14 0 R +/S /Normal +/Pg 43 0 R +>> +endobj +572 0 obj +<< +/A 1097 0 R +/K 61 +/P 14 0 R +/S /Normal +/Pg 43 0 R +>> +endobj +573 0 obj +<< +/A 1195 0 R +/K 62 +/P 14 0 R +/S /Normal +/Pg 43 0 R +>> +endobj +574 0 obj +<< +/A 973 0 R +/K 63 +/P 14 0 R +/S /Normal +/Pg 43 0 R +>> +endobj +575 0 obj +<< +/A 973 0 R +/K 64 +/P 14 0 R +/S /Normal +/Pg 43 0 R +>> +endobj +576 0 obj +<< +/A 973 0 R +/K 65 +/P 14 0 R +/S /Normal +/Pg 43 0 R +>> +endobj +577 0 obj +<< +/A 973 0 R +/K 66 +/P 14 0 R +/S /Normal +/Pg 43 0 R +>> +endobj +578 0 obj +<< +/A 1041 0 R +/K 67 +/P 14 0 R +/S /heading#204 +/Pg 43 0 R +>> +endobj +579 0 obj +<< +/A 1156 0 R +/K 68 +/P 14 0 R +/S /Normal +/Pg 43 0 R +>> +endobj +580 0 obj +<< +/A 1092 0 R +/K 69 +/P 14 0 R +/S /Normal +/Pg 43 0 R +>> +endobj +581 0 obj +<< +/A 1092 0 R +/K 70 +/P 14 0 R +/S /Normal +/Pg 43 0 R +>> +endobj +582 0 obj +<< +/A 1092 0 R +/K 71 +/P 14 0 R +/S /Normal +/Pg 43 0 R +>> +endobj +583 0 obj +<< +/A 973 0 R +/K 72 +/P 14 0 R +/S /Normal +/Pg 43 0 R +>> +endobj +584 0 obj +<< +/A [1196 0 R] +/K 1197 0 R +/P 14 0 R +/S /Table +>> +endobj +585 0 obj +<< +/A 1097 0 R +/K 97 +/P 14 0 R +/S /Normal +/Pg 43 0 R +>> +endobj +586 0 obj +<< +/A 973 0 R +/K 98 +/P 14 0 R +/S /Normal +/Pg 43 0 R +>> +endobj +587 0 obj +<< +/A [1198 0 R] +/K 1199 0 R +/P 14 0 R +/S /Table +>> +endobj +588 0 obj +<< +/A 1097 0 R +/K 117 +/P 14 0 R +/S /Normal +/Pg 43 0 R +>> +endobj +589 0 obj +<< +/A 1110 0 R +/K 118 +/P 14 0 R +/S /Normal +/Pg 43 0 R +>> +endobj +590 0 obj +<< +/A 1110 0 R +/K 119 +/P 14 0 R +/S /Normal +/Pg 43 0 R +>> +endobj +591 0 obj +<< +/A 1110 0 R +/K 120 +/P 14 0 R +/S /Normal +/Pg 43 0 R +>> +endobj +592 0 obj +<< +/A 973 0 R +/K 121 +/P 14 0 R +/S /Normal +/Pg 43 0 R +>> +endobj +593 0 obj +<< +/A 1116 0 R +/K 0 +/P 14 0 R +/S /Normal +/Pg 44 0 R +>> +endobj +594 0 obj +<< +/A 973 0 R +/K 1 +/P 14 0 R +/S /Normal +/Pg 44 0 R +>> +endobj +595 0 obj +<< +/A 973 0 R +/K 2 +/P 14 0 R +/S /Normal +/Pg 44 0 R +>> +endobj +596 0 obj +<< +/A 973 0 R +/K 3 +/P 14 0 R +/S /Normal +/Pg 44 0 R +>> +endobj +597 0 obj +<< +/A 973 0 R +/K 4 +/P 14 0 R +/S /Normal +/Pg 44 0 R +>> +endobj +598 0 obj +<< +/A 1041 0 R +/K 5 +/P 14 0 R +/S /heading#204 +/Pg 44 0 R +>> +endobj +599 0 obj +<< +/A 1156 0 R +/K 6 +/P 14 0 R +/S /Normal +/Pg 44 0 R +>> +endobj +600 0 obj +<< +/A 1092 0 R +/K 7 +/P 14 0 R +/S /Normal +/Pg 44 0 R +>> +endobj +601 0 obj +<< +/A 1092 0 R +/K 8 +/P 14 0 R +/S /Normal +/Pg 44 0 R +>> +endobj +602 0 obj +<< +/A 1092 0 R +/K 9 +/P 14 0 R +/S /Normal +/Pg 44 0 R +>> +endobj +603 0 obj +<< +/A 973 0 R +/K 10 +/P 14 0 R +/S /Normal +/Pg 44 0 R +>> +endobj +604 0 obj +<< +/A [1200 0 R] +/K 1201 0 R +/P 14 0 R +/S /Table +>> +endobj +605 0 obj +<< +/A 1097 0 R +/K 35 +/P 14 0 R +/S /Normal +/Pg 44 0 R +>> +endobj +606 0 obj +<< +/A 973 0 R +/K 36 +/P 14 0 R +/S /Normal +/Pg 44 0 R +>> +endobj +607 0 obj +<< +/A [1202 0 R] +/K 1203 0 R +/P 14 0 R +/S /Table +>> +endobj +608 0 obj +<< +/A 1097 0 R +/K 55 +/P 14 0 R +/S /Normal +/Pg 44 0 R +>> +endobj +609 0 obj +<< +/A 1110 0 R +/K 56 +/P 14 0 R +/S /Normal +/Pg 44 0 R +>> +endobj +610 0 obj +<< +/A 1110 0 R +/K 57 +/P 14 0 R +/S /Normal +/Pg 44 0 R +>> +endobj +611 0 obj +<< +/A 1110 0 R +/K 58 +/P 14 0 R +/S /Normal +/Pg 44 0 R +>> +endobj +612 0 obj +<< +/A 973 0 R +/K 59 +/P 14 0 R +/S /Normal +/Pg 44 0 R +>> +endobj +613 0 obj +<< +/A 1116 0 R +/K 60 +/P 14 0 R +/S /Normal +/Pg 44 0 R +>> +endobj +614 0 obj +<< +/A 973 0 R +/K 61 +/P 14 0 R +/S /Normal +/Pg 44 0 R +>> +endobj +615 0 obj +<< +/A 973 0 R +/K 62 +/P 14 0 R +/S /Normal +/Pg 44 0 R +>> +endobj +616 0 obj +<< +/A 973 0 R +/K 63 +/P 14 0 R +/S /Normal +/Pg 44 0 R +>> +endobj +617 0 obj +<< +/A 973 0 R +/K 64 +/P 14 0 R +/S /Normal +/Pg 44 0 R +>> +endobj +618 0 obj +<< +/A 1041 0 R +/K 65 +/P 14 0 R +/S /heading#204 +/Pg 44 0 R +>> +endobj +619 0 obj +<< +/A 1092 0 R +/K 66 +/P 14 0 R +/S /Normal +/Pg 44 0 R +>> +endobj +620 0 obj +<< +/A 1092 0 R +/K 67 +/P 14 0 R +/S /Normal +/Pg 44 0 R +>> +endobj +621 0 obj +<< +/A 1092 0 R +/K 68 +/P 14 0 R +/S /Normal +/Pg 44 0 R +>> +endobj +622 0 obj +<< +/A 1092 0 R +/K 69 +/P 14 0 R +/S /Normal +/Pg 44 0 R +>> +endobj +623 0 obj +<< +/A 973 0 R +/K 70 +/P 14 0 R +/S /Normal +/Pg 44 0 R +>> +endobj +624 0 obj +<< +/A [1204 0 R] +/K 1205 0 R +/P 14 0 R +/S /Table +>> +endobj +625 0 obj +<< +/A 973 0 R +/K 95 +/P 14 0 R +/S /Normal +/Pg 44 0 R +>> +endobj +626 0 obj +<< +/A [1206 0 R] +/K 1207 0 R +/P 14 0 R +/S /Table +>> +endobj +627 0 obj +<< +/A 1097 0 R +/K 18 +/P 14 0 R +/S /Normal +/Pg 45 0 R +>> +endobj +628 0 obj +<< +/A 1110 0 R +/K 19 +/P 14 0 R +/S /Normal +/Pg 45 0 R +>> +endobj +629 0 obj +<< +/A 1110 0 R +/K 20 +/P 14 0 R +/S /Normal +/Pg 45 0 R +>> +endobj +630 0 obj +<< +/A 973 0 R +/K 21 +/P 14 0 R +/S /Normal +/Pg 45 0 R +>> +endobj +631 0 obj +<< +/A 1116 0 R +/K 22 +/P 14 0 R +/S /Normal +/Pg 45 0 R +>> +endobj +632 0 obj +<< +/A 973 0 R +/K 23 +/P 14 0 R +/S /Normal +/Pg 45 0 R +>> +endobj +633 0 obj +<< +/A 973 0 R +/K 24 +/P 14 0 R +/S /Normal +/Pg 45 0 R +>> +endobj +634 0 obj +<< +/A 973 0 R +/K 25 +/P 14 0 R +/S /Normal +/Pg 45 0 R +>> +endobj +635 0 obj +<< +/A 1041 0 R +/K 26 +/P 14 0 R +/S /heading#204 +/Pg 45 0 R +>> +endobj +636 0 obj +<< +/A 1092 0 R +/K 27 +/P 14 0 R +/S /Normal +/Pg 45 0 R +>> +endobj +637 0 obj +<< +/A 1092 0 R +/K 28 +/P 14 0 R +/S /Normal +/Pg 45 0 R +>> +endobj +638 0 obj +<< +/A 1092 0 R +/K 29 +/P 14 0 R +/S /Normal +/Pg 45 0 R +>> +endobj +639 0 obj +<< +/A 1092 0 R +/K 30 +/P 14 0 R +/S /Normal +/Pg 45 0 R +>> +endobj +640 0 obj +<< +/A 973 0 R +/K 31 +/P 14 0 R +/S /Normal +/Pg 45 0 R +>> +endobj +641 0 obj +<< +/A [1208 0 R] +/K 1209 0 R +/P 14 0 R +/S /Table +>> +endobj +642 0 obj +<< +/A 973 0 R +/K 50 +/P 14 0 R +/S /Normal +/Pg 45 0 R +>> +endobj +643 0 obj +<< +/A [1210 0 R] +/K 1211 0 R +/P 14 0 R +/S /Table +>> +endobj +644 0 obj +<< +/A 1097 0 R +/K 69 +/P 14 0 R +/S /Normal +/Pg 45 0 R +>> +endobj +645 0 obj +<< +/A 1110 0 R +/K 70 +/P 14 0 R +/S /Normal +/Pg 45 0 R +>> +endobj +646 0 obj +<< +/A 1110 0 R +/K 71 +/P 14 0 R +/S /Normal +/Pg 45 0 R +>> +endobj +647 0 obj +<< +/A 973 0 R +/K 72 +/P 14 0 R +/S /Normal +/Pg 45 0 R +>> +endobj +648 0 obj +<< +/A 973 0 R +/K 73 +/P 14 0 R +/S /Normal +/Pg 45 0 R +>> +endobj +649 0 obj +<< +/A 973 0 R +/K 74 +/P 14 0 R +/S /Normal +/Pg 45 0 R +>> +endobj +650 0 obj +<< +/A 973 0 R +/K 75 +/P 14 0 R +/S /Normal +/Pg 45 0 R +>> +endobj +651 0 obj +<< +/A 973 0 R +/K 76 +/P 14 0 R +/S /Normal +/Pg 45 0 R +>> +endobj +652 0 obj +<< +/A 1041 0 R +/K 77 +/P 14 0 R +/S /heading#204 +/Pg 45 0 R +>> +endobj +653 0 obj +<< +/A 1156 0 R +/K 78 +/P 14 0 R +/S /Normal +/Pg 45 0 R +>> +endobj +654 0 obj +<< +/A 1092 0 R +/K 79 +/P 14 0 R +/S /Normal +/Pg 45 0 R +>> +endobj +655 0 obj +<< +/A 1092 0 R +/K 80 +/P 14 0 R +/S /Normal +/Pg 45 0 R +>> +endobj +656 0 obj +<< +/A 1092 0 R +/K 81 +/P 14 0 R +/S /Normal +/Pg 45 0 R +>> +endobj +657 0 obj +<< +/A 973 0 R +/K 82 +/P 14 0 R +/S /Normal +/Pg 45 0 R +>> +endobj +658 0 obj +<< +/A [1212 0 R] +/K 1213 0 R +/P 14 0 R +/S /Table +>> +endobj +659 0 obj +<< +/A 973 0 R +/K 12 +/P 14 0 R +/S /Normal +/Pg 46 0 R +>> +endobj +660 0 obj +<< +/A [1214 0 R] +/K 1215 0 R +/P 14 0 R +/S /Table +>> +endobj +661 0 obj +<< +/A 1097 0 R +/K 34 +/P 14 0 R +/S /Normal +/Pg 46 0 R +>> +endobj +662 0 obj +<< +/A 1023 0 R +/K 35 +/P 14 0 R +/S /Normal +/Pg 46 0 R +>> +endobj +663 0 obj +<< +/A 1023 0 R +/K 36 +/P 14 0 R +/S /Normal +/Pg 46 0 R +>> +endobj +664 0 obj +<< +/A 1110 0 R +/K 37 +/P 14 0 R +/S /Normal +/Pg 46 0 R +>> +endobj +665 0 obj +<< +/A 973 0 R +/K 38 +/P 14 0 R +/S /Normal +/Pg 46 0 R +>> +endobj +666 0 obj +<< +/A 973 0 R +/K 39 +/P 14 0 R +/S /Normal +/Pg 46 0 R +>> +endobj +667 0 obj +<< +/A 973 0 R +/K 40 +/P 14 0 R +/S /Normal +/Pg 46 0 R +>> +endobj +668 0 obj +<< +/A 973 0 R +/K 41 +/P 14 0 R +/S /Normal +/Pg 46 0 R +>> +endobj +669 0 obj +<< +/A 1041 0 R +/K 42 +/P 14 0 R +/S /heading#204 +/Pg 46 0 R +>> +endobj +670 0 obj +<< +/A 1156 0 R +/K 43 +/P 14 0 R +/S /Normal +/Pg 46 0 R +>> +endobj +671 0 obj +<< +/A 1105 0 R +/K 44 +/P 14 0 R +/S /Normal +/Pg 46 0 R +>> +endobj +672 0 obj +<< +/A 1105 0 R +/K 45 +/P 14 0 R +/S /Normal +/Pg 46 0 R +>> +endobj +673 0 obj +<< +/A 1105 0 R +/K 46 +/P 14 0 R +/S /Normal +/Pg 46 0 R +>> +endobj +674 0 obj +<< +/A 973 0 R +/K 47 +/P 14 0 R +/S /Normal +/Pg 46 0 R +>> +endobj +675 0 obj +<< +/A [1216 0 R] +/K 1217 0 R +/P 14 0 R +/S /Table +>> +endobj +676 0 obj +<< +/A 1097 0 R +/K 75 +/P 14 0 R +/S /Normal +/Pg 46 0 R +>> +endobj +677 0 obj +<< +/A 973 0 R +/K 76 +/P 14 0 R +/S /Normal +/Pg 46 0 R +>> +endobj +678 0 obj +<< +/A [1218 0 R] +/K 1219 0 R +/P 14 0 R +/S /Table +>> +endobj +679 0 obj +<< +/A 1097 0 R +/K 101 +/P 14 0 R +/S /Normal +/Pg 46 0 R +>> +endobj +680 0 obj +<< +/A 1023 0 R +/K 102 +/P 14 0 R +/S /Normal +/Pg 46 0 R +>> +endobj +681 0 obj +<< +/A 1023 0 R +/K 103 +/P 14 0 R +/S /Normal +/Pg 46 0 R +>> +endobj +682 0 obj +<< +/A 1110 0 R +/K 104 +/P 14 0 R +/S /Normal +/Pg 46 0 R +>> +endobj +683 0 obj +<< +/A 1220 0 R +/K 105 +/P 14 0 R +/S /Normal +/Pg 46 0 R +>> +endobj +684 0 obj +<< +/A 1116 0 R +/K 106 +/P 14 0 R +/S /Normal +/Pg 46 0 R +>> +endobj +685 0 obj +<< +/A 973 0 R +/K 107 +/P 14 0 R +/S /Normal +/Pg 46 0 R +>> +endobj +686 0 obj +<< +/A 1116 0 R +/K 108 +/P 14 0 R +/S /Normal +/Pg 46 0 R +>> +endobj +687 0 obj +<< +/A 973 0 R +/K 109 +/P 14 0 R +/S /Normal +/Pg 46 0 R +>> +endobj +688 0 obj +<< +/A 973 0 R +/K 110 +/P 14 0 R +/S /Normal +/Pg 46 0 R +>> +endobj +689 0 obj +<< +/A 1022 0 R +/K 0 +/P 14 0 R +/S /heading#202 +/Pg 47 0 R +>> +endobj +690 0 obj +<< +/A 1041 0 R +/K 1 +/P 14 0 R +/S /heading#204 +/Pg 47 0 R +>> +endobj +691 0 obj +<< +/A 1221 0 R +/K 2 +/P 14 0 R +/S /Normal +/Pg 47 0 R +>> +endobj +692 0 obj +<< +/A 1221 0 R +/K 3 +/P 14 0 R +/S /Normal +/Pg 47 0 R +>> +endobj +693 0 obj +<< +/A 1221 0 R +/K 4 +/P 14 0 R +/S /Normal +/Pg 47 0 R +>> +endobj +694 0 obj +<< +/A 1221 0 R +/K 5 +/P 14 0 R +/S /Normal +/Pg 47 0 R +>> +endobj +695 0 obj +<< +/A 973 0 R +/K 6 +/P 14 0 R +/S /Normal +/Pg 47 0 R +>> +endobj +696 0 obj +<< +/A [1222 0 R] +/K 1223 0 R +/P 14 0 R +/S /Table +>> +endobj +697 0 obj +<< +/A 973 0 R +/K 25 +/P 14 0 R +/S /Normal +/Pg 47 0 R +>> +endobj +698 0 obj +<< +/A [1224 0 R] +/K 1225 0 R +/P 14 0 R +/S /Table +>> +endobj +699 0 obj +<< +/A 1097 0 R +/K 47 +/P 14 0 R +/S /Normal +/Pg 47 0 R +>> +endobj +700 0 obj +<< +/A 1110 0 R +/K 48 +/P 14 0 R +/S /Normal +/Pg 47 0 R +>> +endobj +701 0 obj +<< +/A 973 0 R +/K 49 +/P 14 0 R +/S /Normal +/Pg 47 0 R +>> +endobj +702 0 obj +<< +/A 973 0 R +/K 50 +/P 14 0 R +/S /Normal +/Pg 47 0 R +>> +endobj +703 0 obj +<< +/A 973 0 R +/K 51 +/P 14 0 R +/S /Normal +/Pg 47 0 R +>> +endobj +704 0 obj +<< +/A 973 0 R +/K 52 +/P 14 0 R +/S /Normal +/Pg 47 0 R +>> +endobj +705 0 obj +<< +/A 1226 0 R +/K 53 +/P 14 0 R +/S /Normal +/Pg 47 0 R +>> +endobj +706 0 obj +<< +/A 1226 0 R +/K 54 +/P 14 0 R +/S /Normal +/Pg 47 0 R +>> +endobj +707 0 obj +<< +/A 1226 0 R +/K 55 +/P 14 0 R +/S /Normal +/Pg 47 0 R +>> +endobj +708 0 obj +<< +/A 1226 0 R +/K 56 +/P 14 0 R +/S /Normal +/Pg 47 0 R +>> +endobj +709 0 obj +<< +/A 1226 0 R +/K 57 +/P 14 0 R +/S /Normal +/Pg 47 0 R +>> +endobj +710 0 obj +<< +/A 1226 0 R +/K 58 +/P 14 0 R +/S /Normal +/Pg 47 0 R +>> +endobj +711 0 obj +<< +/A 1226 0 R +/K 59 +/P 14 0 R +/S /Normal +/Pg 47 0 R +>> +endobj +712 0 obj +<< +/A 1226 0 R +/K 60 +/P 14 0 R +/S /Normal +/Pg 47 0 R +>> +endobj +713 0 obj +<< +/A 1226 0 R +/K 61 +/P 14 0 R +/S /Normal +/Pg 47 0 R +>> +endobj +714 0 obj +<< +/A 1226 0 R +/K 62 +/P 14 0 R +/S /Normal +/Pg 47 0 R +>> +endobj +715 0 obj +<< +/A 1226 0 R +/K 63 +/P 14 0 R +/S /Normal +/Pg 47 0 R +>> +endobj +716 0 obj +<< +/A 1226 0 R +/K 64 +/P 14 0 R +/S /Normal +/Pg 47 0 R +>> +endobj +717 0 obj +<< +/A 1226 0 R +/K 65 +/P 14 0 R +/S /Normal +/Pg 47 0 R +>> +endobj +718 0 obj +<< +/A 1226 0 R +/K 66 +/P 14 0 R +/S /Normal +/Pg 47 0 R +>> +endobj +719 0 obj +<< +/A 1226 0 R +/K 67 +/P 14 0 R +/S /Normal +/Pg 47 0 R +>> +endobj +720 0 obj +<< +/A 1226 0 R +/K 68 +/P 14 0 R +/S /Normal +/Pg 47 0 R +>> +endobj +721 0 obj +<< +/A 1226 0 R +/K 69 +/P 14 0 R +/S /Normal +/Pg 47 0 R +>> +endobj +722 0 obj +<< +/A 1226 0 R +/K 70 +/P 14 0 R +/S /Normal +/Pg 47 0 R +>> +endobj +723 0 obj +<< +/A 1226 0 R +/K 71 +/P 14 0 R +/S /Normal +/Pg 47 0 R +>> +endobj +724 0 obj +<< +/A 1226 0 R +/K 72 +/P 14 0 R +/S /Normal +/Pg 47 0 R +>> +endobj +725 0 obj +<< +/A 973 0 R +/K 73 +/P 14 0 R +/S /Normal +/Pg 47 0 R +>> +endobj +726 0 obj +<< +/A 1020 0 R +/K 0 +/P 14 0 R +/S /heading#201 +/Pg 48 0 R +>> +endobj +727 0 obj +<< +/A 973 0 R +/K 1 +/P 14 0 R +/S /Normal +/Pg 48 0 R +>> +endobj +728 0 obj +<< +/A 1022 0 R +/K 2 +/P 14 0 R +/S /heading#202 +/Pg 48 0 R +>> +endobj +729 0 obj +<< +/A 973 0 R +/K 3 +/P 14 0 R +/S /Normal +/Pg 48 0 R +>> +endobj +730 0 obj +<< +/A 973 0 R +/K 4 +/P 14 0 R +/S /Normal +/Pg 48 0 R +>> +endobj +731 0 obj +<< +/A 973 0 R +/K 5 +/P 14 0 R +/S /Normal +/Pg 48 0 R +>> +endobj +732 0 obj +<< +/A 973 0 R +/K 6 +/P 14 0 R +/S /Normal +/Pg 48 0 R +>> +endobj +733 0 obj +<< +/A 973 0 R +/K 7 +/P 14 0 R +/S /Normal +/Pg 48 0 R +>> +endobj +734 0 obj +<< +/A 973 0 R +/K 8 +/P 14 0 R +/S /Normal +/Pg 48 0 R +>> +endobj +735 0 obj +<< +/A 973 0 R +/K 9 +/P 14 0 R +/S /Normal +/Pg 48 0 R +>> +endobj +736 0 obj +<< +/A 973 0 R +/K 10 +/P 14 0 R +/S /Normal +/Pg 48 0 R +>> +endobj +737 0 obj +<< +/A 973 0 R +/K 11 +/P 14 0 R +/S /Normal +/Pg 48 0 R +>> +endobj +738 0 obj +<< +/A 973 0 R +/K 12 +/P 14 0 R +/S /Normal +/Pg 48 0 R +>> +endobj +739 0 obj +<< +/A 973 0 R +/K 13 +/P 14 0 R +/S /Normal +/Pg 48 0 R +>> +endobj +740 0 obj +<< +/A 973 0 R +/K 14 +/P 14 0 R +/S /Normal +/Pg 48 0 R +>> +endobj +741 0 obj +<< +/A 973 0 R +/K 15 +/P 14 0 R +/S /Normal +/Pg 48 0 R +>> +endobj +742 0 obj +<< +/A 973 0 R +/K 16 +/P 14 0 R +/S /Normal +/Pg 48 0 R +>> +endobj +743 0 obj +<< +/A 973 0 R +/K 17 +/P 14 0 R +/S /Normal +/Pg 48 0 R +>> +endobj +744 0 obj +<< +/A 973 0 R +/K 18 +/P 14 0 R +/S /Normal +/Pg 48 0 R +>> +endobj +745 0 obj +<< +/A 973 0 R +/K 19 +/P 14 0 R +/S /Normal +/Pg 48 0 R +>> +endobj +746 0 obj +<< +/A 973 0 R +/K 20 +/P 14 0 R +/S /Normal +/Pg 48 0 R +>> +endobj +747 0 obj +<< +/A 973 0 R +/K 21 +/P 14 0 R +/S /Normal +/Pg 48 0 R +>> +endobj +748 0 obj +<< +/A 973 0 R +/K 22 +/P 14 0 R +/S /Normal +/Pg 48 0 R +>> +endobj +749 0 obj +<< +/A 973 0 R +/K 23 +/P 14 0 R +/S /Normal +/Pg 48 0 R +>> +endobj +750 0 obj +<< +/A 973 0 R +/K 24 +/P 14 0 R +/S /Normal +/Pg 48 0 R +>> +endobj +751 0 obj +<< +/A 973 0 R +/K 25 +/P 14 0 R +/S /Normal +/Pg 48 0 R +>> +endobj +752 0 obj +<< +/A 973 0 R +/K 26 +/P 14 0 R +/S /Normal +/Pg 48 0 R +>> +endobj +753 0 obj +<< +/A 973 0 R +/K 27 +/P 14 0 R +/S /Normal +/Pg 48 0 R +>> +endobj +754 0 obj +<< +/A 973 0 R +/K 28 +/P 14 0 R +/S /Normal +/Pg 48 0 R +>> +endobj +755 0 obj +<< +/A 973 0 R +/K 29 +/P 14 0 R +/S /Normal +/Pg 48 0 R +>> +endobj +756 0 obj +<< +/A 973 0 R +/K 30 +/P 14 0 R +/S /Normal +/Pg 48 0 R +>> +endobj +757 0 obj +<< +/A 973 0 R +/K 31 +/P 14 0 R +/S /Normal +/Pg 48 0 R +>> +endobj +758 0 obj +<< +/A 973 0 R +/K 32 +/P 14 0 R +/S /Normal +/Pg 48 0 R +>> +endobj +759 0 obj +<< +/A 973 0 R +/K 33 +/P 14 0 R +/S /Normal +/Pg 48 0 R +>> +endobj +760 0 obj +<< +/A 973 0 R +/K 34 +/P 14 0 R +/S /Normal +/Pg 48 0 R +>> +endobj +761 0 obj +<< +/A 1022 0 R +/K [0 1227 0 R 2] +/P 14 0 R +/S /heading#203 +/Pg 49 0 R +>> +endobj +762 0 obj +<< +/A 1022 0 R +/K 0 +/P 14 0 R +/S /heading#203 +/Pg 50 0 R +>> +endobj +763 0 obj +<< +/A 973 0 R +/K [1228 0 R 2] +/P 14 0 R +/S /Normal +/Pg 50 0 R +>> +endobj +764 0 obj +<< +/A 973 0 R +/K 3 +/P 14 0 R +/S /Normal +/Pg 50 0 R +>> +endobj +765 0 obj +<< +/A 1022 0 R +/K 0 +/P 14 0 R +/S /heading#202 +/Pg 51 0 R +>> +endobj +766 0 obj +<< +/A 1022 0 R +/K 1 +/P 14 0 R +/S /heading#203 +/Pg 51 0 R +>> +endobj +767 0 obj +<< +/A [1229 0 R] +/K 1230 0 R +/P 14 0 R +/S /Table +>> +endobj +768 0 obj +<< +/A 1022 0 R +/K 2 +/P 14 0 R +/S /heading#203 +/Pg 51 0 R +>> +endobj +769 0 obj +<< +/A [1231 0 R] +/K 1232 0 R +/P 14 0 R +/S /Table +>> +endobj +770 0 obj +<< +/A 973 0 R +/K 81 +/P 14 0 R +/S /Normal +/Pg 51 0 R +>> +endobj +771 0 obj +<< +/A 973 0 R +/K 82 +/P 14 0 R +/S /Normal +/Pg 51 0 R +>> +endobj +772 0 obj +<< +/A 973 0 R +/K 83 +/P 14 0 R +/S /Normal +/Pg 51 0 R +>> +endobj +773 0 obj +<< +/A 973 0 R +/K 84 +/P 14 0 R +/S /Normal +/Pg 51 0 R +>> +endobj +774 0 obj +<< +/A 973 0 R +/K 85 +/P 14 0 R +/S /Normal +/Pg 51 0 R +>> +endobj +775 0 obj +<< +/A 1233 0 R +/K 1 +/P 14 0 R +/S /heading#201 +/Pg 52 0 R +>> +endobj +776 0 obj +<< +/A 1234 0 R +/K 2 +/P 14 0 R +/S /heading#202 +/Pg 52 0 R +>> +endobj +777 0 obj +<< +/A 1235 0 R +/K [1236 0 R 4] +/P 14 0 R +/S /Normal +/Pg 52 0 R +>> +endobj +778 0 obj +<< +/A 1234 0 R +/K 5 +/P 14 0 R +/S /heading#202 +/Pg 52 0 R +>> +endobj +779 0 obj +<< +/A 973 0 R +/K 6 +/P 14 0 R +/S /Normal +/Pg 52 0 R +>> +endobj +780 0 obj +<< +/A 973 0 R +/K 7 +/P 14 0 R +/S /Normal +/Pg 52 0 R +>> +endobj +781 0 obj +<< +/A 973 0 R +/K 8 +/P 14 0 R +/S /Normal +/Pg 52 0 R +>> +endobj +782 0 obj +<< +/A 973 0 R +/K 9 +/P 14 0 R +/S /Normal +/Pg 52 0 R +>> +endobj +783 0 obj +<< +/A 973 0 R +/K 10 +/P 14 0 R +/S /Normal +/Pg 52 0 R +>> +endobj +784 0 obj +<< +/A 973 0 R +/K 11 +/P 14 0 R +/S /Normal +/Pg 52 0 R +>> +endobj +785 0 obj +<< +/A 973 0 R +/K 12 +/P 14 0 R +/S /Normal +/Pg 52 0 R +>> +endobj +786 0 obj +<< +/A 973 0 R +/K 13 +/P 14 0 R +/S /Normal +/Pg 52 0 R +>> +endobj +787 0 obj +<< +/A 973 0 R +/K 14 +/P 14 0 R +/S /Normal +/Pg 52 0 R +>> +endobj +788 0 obj +<< +/A 973 0 R +/K 15 +/P 14 0 R +/S /Normal +/Pg 52 0 R +>> +endobj +789 0 obj +<< +/A 973 0 R +/K 16 +/P 14 0 R +/S /Normal +/Pg 52 0 R +>> +endobj +790 0 obj +<< +/A 972 0 R +/K 17 +/P 14 0 R +/S /Normal +/Pg 52 0 R +>> +endobj +791 0 obj +<< +/A 1237 0 R +/K 0 +/P 14 0 R +/S /Shape +/Pg 52 0 R +>> +endobj +792 0 obj +<< +/A 1238 0 R +/K 18 +/P 14 0 R +/S /Shape +/Pg 52 0 R +>> +endobj +793 0 obj +<< +/Limits [0 31] +/Nums [0 [53 0 R 54 0 R 55 0 R 56 0 R 57 0 R 58 0 R 974 0 R 59 0 R 60 0 R 61 0 R +62 0 R] + 1 [62 0 R 63 0 R 64 0 R 65 0 R 66 0 R 67 0 R 68 0 R 69 0 R 979 0 R 70 0 R +71 0 R 72 0 R 982 0 R 72 0 R 73 0 R 74 0 R 75 0 R 76 0 R 77 0 R 78 0 R +79 0 R] + 2 [80 0 R 1239 0 R 1240 0 R 1241 0 R 1242 0 R 1243 0 R 1244 0 R 1245 0 R 1246 0 R 1247 0 R +1248 0 R 1249 0 R 1250 0 R 1251 0 R 1252 0 R 1253 0 R 1254 0 R 1255 0 R 1256 0 R 1257 0 R +1258 0 R 1259 0 R 1260 0 R 1261 0 R 1262 0 R 1263 0 R 1264 0 R 1265 0 R 1266 0 R 1267 0 R +1268 0 R 1269 0 R 1270 0 R 1271 0 R 1272 0 R 1273 0 R 82 0 R] + 3 1239 0 R 4 1240 0 R +5 1241 0 R 6 1242 0 R 7 1243 0 R 8 1244 0 R 9 1245 0 R +10 1246 0 R 11 1247 0 R 12 1248 0 R 13 1249 0 R 14 1250 0 R +15 1251 0 R 16 1252 0 R 17 1253 0 R 18 1254 0 R 19 1255 0 R +20 1256 0 R 21 1257 0 R 22 1258 0 R 23 1259 0 R 24 1260 0 R +25 1261 0 R 26 1262 0 R 27 1263 0 R 28 1264 0 R 29 1265 0 R +30 1266 0 R 31 1267 0 R] +>> +endobj +794 0 obj +<< +/Limits [32 66] +/Nums [32 1268 0 R 33 1269 0 R 34 1270 0 R 35 1271 0 R 36 1272 0 R +37 1273 0 R 38 [83 0 R 84 0 R 85 0 R 86 0 R 87 0 R 88 0 R 89 0 R 90 0 R 91 0 R 92 0 R +93 0 R 94 0 R 95 0 R 96 0 R 97 0 R 98 0 R 99 0 R 100 0 R 101 0 R 102 0 R +103 0 R 104 0 R] + 39 [105 0 R 106 0 R 107 0 R 108 0 R 109 0 R 110 0 R 111 0 R 112 0 R 113 0 R 114 0 R +115 0 R 116 0 R 117 0 R 118 0 R 119 0 R 120 0 R 121 0 R 122 0 R 123 0 R 124 0 R +125 0 R 126 0 R 127 0 R 128 0 R 129 0 R 130 0 R 131 0 R 132 0 R 133 0 R 134 0 R] + 40 [135 0 R 136 0 R 137 0 R 138 0 R 139 0 R 140 0 R 1274 0 R 1275 0 R 1276 0 R 1277 0 R +1278 0 R 1279 0 R 1280 0 R 1281 0 R 1282 0 R 1283 0 R 1284 0 R 1285 0 R 1286 0 R 1287 0 R +1288 0 R 1289 0 R 1290 0 R 1291 0 R 1292 0 R 1293 0 R 1294 0 R 1295 0 R 1296 0 R 1297 0 R +142 0 R 143 0 R 144 0 R 145 0 R 146 0 R 147 0 R 148 0 R 149 0 R 149 0 R 149 0 R +149 0 R 149 0 R] + 41 [150 0 R 151 0 R 152 0 R 1298 0 R 1299 0 R 1300 0 R 1301 0 R 1302 0 R 1303 0 R 1304 0 R +1305 0 R 1306 0 R 1307 0 R 1308 0 R 1309 0 R 1310 0 R 1311 0 R 1312 0 R 1313 0 R 1314 0 R +1315 0 R 1316 0 R 1317 0 R 1318 0 R 1319 0 R 1320 0 R 1321 0 R 1322 0 R 1323 0 R 1324 0 R +1325 0 R 1326 0 R 1327 0 R 1328 0 R 1329 0 R 1330 0 R 1331 0 R 1332 0 R 1333 0 R 1334 0 R +1335 0 R 1336 0 R 1337 0 R 1338 0 R 1339 0 R 1340 0 R 1341 0 R 1342 0 R 1343 0 R 1342 0 R +1344 0 R 1345 0 R 1346 0 R 1347 0 R 1348 0 R 1349 0 R 1350 0 R 1351 0 R 1352 0 R 1351 0 R +1353 0 R 1354 0 R 1355 0 R 1356 0 R 1357 0 R 1358 0 R 1359 0 R 1360 0 R 1361 0 R 1362 0 R +1363 0 R 1364 0 R 1365 0 R 1366 0 R 1367 0 R 1368 0 R 1369 0 R 1370 0 R 1371 0 R 1372 0 R +1373 0 R 1374 0 R 1375 0 R 1376 0 R 1377 0 R 1378 0 R 1379 0 R 1380 0 R 1381 0 R 1382 0 R +1383 0 R 1384 0 R 1383 0 R 1385 0 R 1386 0 R 1387 0 R 1388 0 R 1389 0 R 1390 0 R 1391 0 R +1392 0 R 1391 0 R 1393 0 R 1394 0 R 1395 0 R 1396 0 R 1397 0 R 1398 0 R 1399 0 R 1400 0 R +1401 0 R 1402 0 R 1403 0 R 1404 0 R 1405 0 R 159 0 R 160 0 R 1406 0 R 1407 0 R 1408 0 R +1409 0 R 1410 0 R 1411 0 R 1412 0 R 1413 0 R 1414 0 R 1415 0 R 1416 0 R 1417 0 R 1418 0 R +1419 0 R 1420 0 R 1421 0 R 1422 0 R 1423 0 R 1424 0 R 1425 0 R 1426 0 R 1427 0 R 1428 0 R +1429 0 R 162 0 R] +42 [163 0 R 164 0 R 165 0 R 166 0 R 167 0 R 168 0 R 169 0 R 170 0 R 171 0 R 172 0 R +173 0 R 174 0 R 175 0 R 176 0 R 177 0 R 178 0 R 179 0 R 180 0 R 181 0 R 182 0 R +183 0 R 184 0 R 185 0 R 186 0 R 187 0 R 188 0 R 189 0 R 190 0 R 191 0 R 192 0 R +193 0 R 194 0 R 195 0 R 196 0 R 197 0 R 198 0 R 199 0 R 200 0 R 201 0 R 202 0 R +203 0 R] + 43 [204 0 R 205 0 R 206 0 R 207 0 R 208 0 R 209 0 R 210 0 R 211 0 R 212 0 R 213 0 R +214 0 R 215 0 R 216 0 R 217 0 R 218 0 R 219 0 R] + 44 [220 0 R 221 0 R 222 0 R 223 0 R 224 0 R 225 0 R 226 0 R 227 0 R 228 0 R 229 0 R +230 0 R 1430 0 R 1431 0 R 1432 0 R 1433 0 R 1434 0 R 1435 0 R 1436 0 R 1437 0 R 1438 0 R +1439 0 R 1440 0 R 1441 0 R 232 0 R 1442 0 R 1443 0 R 1444 0 R 1445 0 R 234 0 R 235 0 R +236 0 R 237 0 R 238 0 R] + 45 [239 0 R 240 0 R 241 0 R 242 0 R 243 0 R 244 0 R 245 0 R 246 0 R 247 0 R 248 0 R +249 0 R 250 0 R 251 0 R 252 0 R 253 0 R 254 0 R 255 0 R 256 0 R 257 0 R 258 0 R +259 0 R 260 0 R 261 0 R 262 0 R 263 0 R 264 0 R 265 0 R 266 0 R 267 0 R 268 0 R +269 0 R 270 0 R 271 0 R 272 0 R 273 0 R] + 46 [274 0 R 275 0 R 276 0 R 277 0 R 278 0 R 1446 0 R 1447 0 R 1448 0 R 1449 0 R 1450 0 R +1451 0 R 280 0 R 1452 0 R 1453 0 R 1454 0 R 1455 0 R 1456 0 R 1457 0 R 1458 0 R 1459 0 R +1460 0 R 1461 0 R 1462 0 R 1463 0 R 1464 0 R 1465 0 R 1466 0 R 1467 0 R 1468 0 R 1469 0 R +1470 0 R 1471 0 R 1472 0 R 1473 0 R 1474 0 R 1475 0 R 1476 0 R 1477 0 R 1478 0 R 1479 0 R +1479 0 R 1479 0 R 1480 0 R 1481 0 R 1482 0 R 1483 0 R 1484 0 R 1485 0 R 1486 0 R 1487 0 R +282 0 R] +47 [283 0 R 284 0 R 285 0 R 286 0 R 287 0 R 288 0 R 289 0 R 1488 0 R 1489 0 R 1490 0 R +1491 0 R 1492 0 R 1493 0 R 1494 0 R 1495 0 R 1496 0 R 1497 0 R 1498 0 R 1499 0 R 1500 0 R +1501 0 R 1502 0 R 1503 0 R 1504 0 R 1505 0 R 1506 0 R 1507 0 R 1508 0 R 1509 0 R 1510 0 R +291 0 R 292 0 R 293 0 R 294 0 R 295 0 R 296 0 R 297 0 R 298 0 R 299 0 R] + 48 [300 0 R 301 0 R 302 0 R 303 0 R 304 0 R 305 0 R 306 0 R 307 0 R 308 0 R 309 0 R +1511 0 R 1512 0 R 1513 0 R 1514 0 R 1515 0 R 1516 0 R 1517 0 R 1518 0 R 1519 0 R 1520 0 R +1521 0 R 1522 0 R 1523 0 R 1524 0 R 1525 0 R 1526 0 R 1527 0 R 1528 0 R 1529 0 R 1530 0 R +1531 0 R 311 0 R 1532 0 R 1533 0 R 1534 0 R 1535 0 R 1536 0 R 1537 0 R 1538 0 R 1539 0 R +1540 0 R 1541 0 R 1542 0 R 1543 0 R 1544 0 R 1545 0 R 1546 0 R 1547 0 R 1548 0 R 1549 0 R +313 0 R 314 0 R 315 0 R 316 0 R 317 0 R 318 0 R 319 0 R 320 0 R 321 0 R 322 0 R +323 0 R 324 0 R 325 0 R 1550 0 R 1551 0 R 1552 0 R 1553 0 R 1554 0 R 1555 0 R 1556 0 R +1557 0 R 1558 0 R 1559 0 R 1560 0 R 1561 0 R 1562 0 R 1563 0 R 1564 0 R 1565 0 R 1566 0 R +1567 0 R 1568 0 R 1569 0 R 1570 0 R 327 0 R] + 49 [328 0 R 1571 0 R 1572 0 R 1573 0 R 1574 0 R 1575 0 R 1576 0 R 1577 0 R 1578 0 R 1579 0 R +1580 0 R 1581 0 R 1582 0 R 1583 0 R 1584 0 R 1585 0 R 1586 0 R 1587 0 R 1588 0 R 330 0 R +331 0 R 332 0 R 333 0 R 334 0 R 335 0 R 336 0 R 337 0 R 338 0 R 339 0 R 340 0 R +341 0 R 1589 0 R 1590 0 R 1591 0 R 1592 0 R 1593 0 R 1594 0 R 1595 0 R 1596 0 R 1597 0 R +1598 0 R 1599 0 R 1600 0 R 1601 0 R 1602 0 R 1603 0 R 1604 0 R 1605 0 R 1606 0 R 1607 0 R +1608 0 R 1609 0 R 343 0 R 1610 0 R 1611 0 R 1612 0 R 1613 0 R 1614 0 R 1615 0 R 1616 0 R +1617 0 R 1618 0 R 1619 0 R 1620 0 R 1621 0 R 1622 0 R 1623 0 R 1624 0 R 1625 0 R 1626 0 R +1627 0 R 345 0 R 346 0 R 347 0 R 348 0 R 349 0 R 350 0 R 351 0 R 352 0 R 353 0 R +354 0 R 355 0 R 356 0 R 357 0 R 1628 0 R 1629 0 R 1630 0 R 1631 0 R 1632 0 R 1633 0 R +1634 0 R 1635 0 R 1636 0 R 1637 0 R 1638 0 R 1639 0 R 1640 0 R 1641 0 R 1642 0 R 1643 0 R +1644 0 R 1645 0 R 1646 0 R 1647 0 R 1648 0 R 1649 0 R 1650 0 R 1651 0 R 359 0 R] + 50 [360 0 R 1652 0 R 1653 0 R 1654 0 R 1655 0 R 1656 0 R 1657 0 R 1658 0 R 1659 0 R 1660 0 R +1661 0 R 1662 0 R 1663 0 R 1664 0 R 1665 0 R 1666 0 R 1667 0 R 1668 0 R 1669 0 R 362 0 R +363 0 R 364 0 R 365 0 R 366 0 R 367 0 R 368 0 R 369 0 R 370 0 R 1670 0 R 1671 0 R +1672 0 R 1673 0 R 1674 0 R 1675 0 R 1676 0 R 1677 0 R 1678 0 R 1679 0 R 1680 0 R 1681 0 R +372 0 R 373 0 R 374 0 R 375 0 R 376 0 R 377 0 R 378 0 R 1682 0 R 1683 0 R 1684 0 R +1685 0 R 1686 0 R 1687 0 R 1688 0 R 1689 0 R 1690 0 R 1691 0 R 1692 0 R 1693 0 R 1694 0 R +1695 0 R 1696 0 R 1697 0 R 1698 0 R 1699 0 R 380 0 R 1700 0 R 1701 0 R 1702 0 R 1703 0 R +1704 0 R 1705 0 R 1706 0 R 1707 0 R 1708 0 R 1709 0 R 1710 0 R 1711 0 R 1712 0 R 1713 0 R +1714 0 R 1715 0 R 1716 0 R 1717 0 R 1718 0 R 1719 0 R 1720 0 R 382 0 R 383 0 R 384 0 R +385 0 R 386 0 R 387 0 R 388 0 R 389 0 R] + 51 [390 0 R 1721 0 R 1722 0 R 1723 0 R 1723 0 R 1724 0 R 1725 0 R 1726 0 R 1727 0 R 1728 0 R +1729 0 R 1730 0 R 1731 0 R 1732 0 R 1733 0 R 1734 0 R 1735 0 R 1736 0 R 1737 0 R 1738 0 R +1739 0 R 1740 0 R 1741 0 R 1742 0 R 1743 0 R 1744 0 R 1745 0 R 1746 0 R 1747 0 R 1748 0 R +1749 0 R 1750 0 R 1751 0 R 1752 0 R 392 0 R 393 0 R 394 0 R 395 0 R 396 0 R 397 0 R +398 0 R 399 0 R 400 0 R 401 0 R 402 0 R 1753 0 R 1754 0 R 1755 0 R 1756 0 R 1757 0 R +1758 0 R 1759 0 R 1760 0 R 1761 0 R 1762 0 R 1763 0 R 1764 0 R 1765 0 R 1766 0 R 1767 0 R +1768 0 R 1769 0 R 1770 0 R 1771 0 R 1772 0 R 1773 0 R 404 0 R 1774 0 R 1775 0 R 1776 0 R +1777 0 R 1778 0 R 1779 0 R 1780 0 R 1781 0 R 1782 0 R 1783 0 R 1784 0 R 1785 0 R 1786 0 R +1787 0 R 1788 0 R 1789 0 R 1790 0 R 1791 0 R 1792 0 R 1793 0 R 1794 0 R 406 0 R 407 0 R +408 0 R 409 0 R 1795 0 R 1796 0 R 1797 0 R 1798 0 R 1799 0 R 1800 0 R 1801 0 R 1802 0 R +1803 0 R 1804 0 R 1805 0 R 1806 0 R 1807 0 R 1808 0 R 1809 0 R 1810 0 R 1811 0 R 1812 0 R +1813 0 R 1814 0 R 1815 0 R 1816 0 R 1817 0 R 1818 0 R 1819 0 R 1820 0 R 1821 0 R 1822 0 R +1823 0 R 1824 0 R 1825 0 R 1826 0 R 1827 0 R 1828 0 R 1829 0 R 1830 0 R 1831 0 R 1832 0 R +1833 0 R 1834 0 R 1835 0 R 1836 0 R 1837 0 R 1838 0 R 1839 0 R 1840 0 R 1841 0 R 1842 0 R +1843 0 R 1844 0 R 1845 0 R 1846 0 R 1847 0 R 1848 0 R 1849 0 R 1850 0 R 1851 0 R 1852 0 R +1853 0 R 1854 0 R 1855 0 R 1856 0 R 1857 0 R 1858 0 R 1859 0 R 1860 0 R] +52 [411 0 R 412 0 R 413 0 R 414 0 R 415 0 R 416 0 R 417 0 R 418 0 R 419 0 R 420 0 R +421 0 R 1861 0 R 1862 0 R 1863 0 R 1864 0 R 1865 0 R 1866 0 R 1867 0 R 1868 0 R 1869 0 R +1870 0 R 1871 0 R 1872 0 R 1873 0 R 1874 0 R 1875 0 R 1876 0 R 1877 0 R 1878 0 R 423 0 R +1879 0 R 1880 0 R 1881 0 R 1882 0 R 1883 0 R 1884 0 R 1885 0 R 1886 0 R 1887 0 R 1888 0 R +1889 0 R 1890 0 R 1891 0 R 1892 0 R 1893 0 R 1894 0 R 1895 0 R 1896 0 R 1897 0 R 1898 0 R +1899 0 R 425 0 R 426 0 R 427 0 R 428 0 R 429 0 R 430 0 R 431 0 R 432 0 R 433 0 R +434 0 R 435 0 R 436 0 R 437 0 R 1900 0 R 1901 0 R 1902 0 R 1903 0 R 1904 0 R 1905 0 R +1906 0 R 1907 0 R 1908 0 R 1909 0 R 1910 0 R 1911 0 R 1912 0 R 1913 0 R 1914 0 R 1915 0 R +1916 0 R 1917 0 R 439 0 R 1918 0 R 1919 0 R 1920 0 R 1921 0 R 1922 0 R 1923 0 R 1924 0 R +1925 0 R 1926 0 R 1927 0 R 1928 0 R 1929 0 R] + 53 [1930 0 R 1931 0 R 1932 0 R 1933 0 R 1934 0 R 1935 0 R 441 0 R 442 0 R 443 0 R 444 0 R +445 0 R 446 0 R 447 0 R 448 0 R 449 0 R 450 0 R 451 0 R 452 0 R 453 0 R 454 0 R +455 0 R 456 0 R 1936 0 R 1937 0 R 1938 0 R 1939 0 R 1940 0 R 1941 0 R 1942 0 R 1943 0 R +1944 0 R 1945 0 R 1946 0 R 1947 0 R 1948 0 R 1949 0 R 1950 0 R 1951 0 R 1952 0 R 1953 0 R +458 0 R 1954 0 R 1955 0 R 1956 0 R 1957 0 R 1958 0 R 1959 0 R 1960 0 R 1961 0 R 1962 0 R +1963 0 R 1964 0 R 1965 0 R 1966 0 R 1967 0 R 1968 0 R 1969 0 R 1970 0 R 1971 0 R 460 0 R +1972 0 R 1973 0 R 1974 0 R 1975 0 R 1976 0 R 1977 0 R 1978 0 R 1979 0 R 1980 0 R 1981 0 R +1982 0 R 1983 0 R 1984 0 R 1985 0 R 1986 0 R 1987 0 R 1988 0 R 1989 0 R 462 0 R 1990 0 R +1991 0 R 1992 0 R 1993 0 R 1994 0 R 1995 0 R 1996 0 R 1997 0 R 1998 0 R 1999 0 R 2000 0 R +2001 0 R 2002 0 R 2003 0 R 2004 0 R 2005 0 R 2006 0 R 2007 0 R 464 0 R 465 0 R 466 0 R +467 0 R 468 0 R 469 0 R 470 0 R 471 0 R 472 0 R] + 54 [473 0 R 474 0 R 475 0 R 476 0 R 477 0 R 478 0 R 479 0 R 2008 0 R 2009 0 R 2010 0 R +2011 0 R 2012 0 R 2013 0 R 2014 0 R 2015 0 R 2016 0 R 2017 0 R 2018 0 R 2019 0 R 2020 0 R +2021 0 R 2022 0 R 2023 0 R 2024 0 R 2025 0 R 481 0 R 2026 0 R 2027 0 R 2028 0 R 2029 0 R +2030 0 R 2031 0 R 2032 0 R 2033 0 R 2034 0 R 2035 0 R 2036 0 R 2037 0 R 2038 0 R 2039 0 R +2040 0 R 2041 0 R 2042 0 R 2043 0 R 483 0 R 2044 0 R 2045 0 R 2046 0 R 2047 0 R 2048 0 R +2049 0 R 2050 0 R 2051 0 R 2052 0 R 2053 0 R 2054 0 R 2055 0 R 2056 0 R 2057 0 R 2058 0 R +2059 0 R 2060 0 R 2061 0 R 485 0 R 2062 0 R 2063 0 R 2064 0 R 2065 0 R 2066 0 R 2067 0 R +2068 0 R 2069 0 R 2070 0 R 2071 0 R 2072 0 R 2073 0 R 2074 0 R 2075 0 R 2076 0 R 2077 0 R +2078 0 R 2079 0 R 487 0 R 488 0 R 489 0 R 490 0 R 491 0 R 492 0 R 493 0 R 494 0 R +495 0 R 496 0 R 497 0 R 498 0 R 499 0 R 500 0 R 501 0 R] + 55 [2080 0 R 2081 0 R 2082 0 R 2083 0 R 2084 0 R 2085 0 R 2086 0 R 2087 0 R 2088 0 R 2089 0 R +2090 0 R 2091 0 R 2092 0 R 2093 0 R 2094 0 R 2095 0 R 2096 0 R 2097 0 R 2098 0 R 2099 0 R +2100 0 R 503 0 R 504 0 R 2101 0 R 2102 0 R 2103 0 R 2104 0 R 2105 0 R 2106 0 R 2107 0 R +2108 0 R 2109 0 R 2110 0 R 2111 0 R 2112 0 R 2113 0 R 2114 0 R 2115 0 R 2116 0 R 2117 0 R +2118 0 R 506 0 R 507 0 R 508 0 R 509 0 R 510 0 R 511 0 R 512 0 R 513 0 R 514 0 R +515 0 R 516 0 R 517 0 R 518 0 R 519 0 R 520 0 R 2119 0 R 2120 0 R 2121 0 R 2122 0 R +2123 0 R 2124 0 R 2125 0 R 2126 0 R 2127 0 R 2128 0 R 2129 0 R 2130 0 R 2131 0 R 2132 0 R +2133 0 R 2134 0 R 2135 0 R 2136 0 R 522 0 R 2137 0 R 2138 0 R 2139 0 R 2140 0 R 2141 0 R +2142 0 R 2143 0 R 2144 0 R 2145 0 R 2146 0 R 2147 0 R 2148 0 R 2149 0 R 2150 0 R 2151 0 R +2152 0 R 2153 0 R 2154 0 R 524 0 R 525 0 R 526 0 R 527 0 R 528 0 R 529 0 R 530 0 R] + 56 [531 0 R 532 0 R 533 0 R 534 0 R 535 0 R 536 0 R 2155 0 R 2156 0 R 2157 0 R 2158 0 R +2159 0 R 2160 0 R 2161 0 R 2162 0 R 2163 0 R 2164 0 R 2165 0 R 2166 0 R 2167 0 R 2168 0 R +2169 0 R 2170 0 R 2171 0 R 2172 0 R 2173 0 R 2174 0 R 2175 0 R 538 0 R 539 0 R 2176 0 R +2177 0 R 2178 0 R 2179 0 R 2180 0 R 2181 0 R 2182 0 R 2183 0 R 2184 0 R 2185 0 R 2186 0 R +2187 0 R 2188 0 R 2189 0 R 2190 0 R 2191 0 R 2192 0 R 2193 0 R 541 0 R 2194 0 R 2195 0 R +2196 0 R 2197 0 R 2198 0 R 2199 0 R 2200 0 R 2201 0 R 2202 0 R 2203 0 R 2204 0 R 2205 0 R +2206 0 R 2207 0 R 2208 0 R 2209 0 R 2210 0 R 2211 0 R 543 0 R 2212 0 R 2213 0 R 2214 0 R +2215 0 R 2216 0 R 2217 0 R 2218 0 R 2219 0 R 2220 0 R 2221 0 R 2222 0 R 2223 0 R 2224 0 R +2225 0 R 2226 0 R 2227 0 R 2228 0 R 2229 0 R 545 0 R 546 0 R 547 0 R 548 0 R 549 0 R +550 0 R 551 0 R 552 0 R 553 0 R 554 0 R 555 0 R 556 0 R 557 0 R 558 0 R 559 0 R +560 0 R 2230 0 R 2231 0 R 2232 0 R 2233 0 R 2234 0 R 2235 0 R 2236 0 R 2237 0 R 2238 0 R +2239 0 R 2240 0 R 2241 0 R 2242 0 R 2243 0 R 2244 0 R 2245 0 R 2246 0 R 2247 0 R 2248 0 R +2249 0 R 2250 0 R] +57 [562 0 R 563 0 R 2251 0 R 2252 0 R 2253 0 R 2254 0 R 2255 0 R 2256 0 R 2257 0 R 2258 0 R +2259 0 R 2260 0 R 2261 0 R 2262 0 R 2263 0 R 2264 0 R 2265 0 R 2266 0 R 2267 0 R 2268 0 R +565 0 R 2269 0 R 2270 0 R 2271 0 R 2272 0 R 2273 0 R 2274 0 R 2275 0 R 2276 0 R 2277 0 R +2278 0 R 2279 0 R 2280 0 R 2281 0 R 2282 0 R 2283 0 R 2284 0 R 2285 0 R 2286 0 R 567 0 R +2287 0 R 2288 0 R 2289 0 R 2290 0 R 2291 0 R 2292 0 R 2293 0 R 2294 0 R 2295 0 R 2296 0 R +2297 0 R 2298 0 R 2299 0 R 2300 0 R 2301 0 R 2302 0 R 2303 0 R 2304 0 R 569 0 R 570 0 R +571 0 R 572 0 R 573 0 R 574 0 R 575 0 R 576 0 R 577 0 R 578 0 R 579 0 R 580 0 R +581 0 R 582 0 R 583 0 R 2305 0 R 2306 0 R 2307 0 R 2308 0 R 2309 0 R 2310 0 R 2311 0 R +2312 0 R 2313 0 R 2314 0 R 2315 0 R 2316 0 R 2317 0 R 2318 0 R 2319 0 R 2320 0 R 2321 0 R +2322 0 R 2323 0 R 2324 0 R 2325 0 R 2326 0 R 2327 0 R 2328 0 R 585 0 R 586 0 R 2329 0 R +2330 0 R 2331 0 R 2332 0 R 2333 0 R 2334 0 R 2335 0 R 2336 0 R 2337 0 R 2338 0 R 2339 0 R +2340 0 R 2341 0 R 2342 0 R 2343 0 R 2344 0 R 2345 0 R 2346 0 R 588 0 R 589 0 R 590 0 R +591 0 R 592 0 R] + 58 [593 0 R 594 0 R 595 0 R 596 0 R 597 0 R 598 0 R 599 0 R 600 0 R 601 0 R 602 0 R +603 0 R 2347 0 R 2348 0 R 2349 0 R 2350 0 R 2351 0 R 2352 0 R 2353 0 R 2354 0 R 2355 0 R +2356 0 R 2357 0 R 2358 0 R 2359 0 R 2360 0 R 2361 0 R 2362 0 R 2363 0 R 2364 0 R 2365 0 R +2366 0 R 2367 0 R 2368 0 R 2369 0 R 2370 0 R 605 0 R 606 0 R 2371 0 R 2372 0 R 2373 0 R +2374 0 R 2375 0 R 2376 0 R 2377 0 R 2378 0 R 2379 0 R 2380 0 R 2381 0 R 2382 0 R 2383 0 R +2384 0 R 2385 0 R 2386 0 R 2387 0 R 2388 0 R 608 0 R 609 0 R 610 0 R 611 0 R 612 0 R +613 0 R 614 0 R 615 0 R 616 0 R 617 0 R 618 0 R 619 0 R 620 0 R 621 0 R 622 0 R +623 0 R 2389 0 R 2390 0 R 2391 0 R 2392 0 R 2393 0 R 2394 0 R 2395 0 R 2396 0 R 2397 0 R +2398 0 R 2399 0 R 2400 0 R 2401 0 R 2402 0 R 2403 0 R 2404 0 R 2405 0 R 2406 0 R 2407 0 R +2408 0 R 2409 0 R 2410 0 R 2411 0 R 2412 0 R 625 0 R] + 59 [2413 0 R 2414 0 R 2415 0 R 2416 0 R 2417 0 R 2418 0 R 2419 0 R 2420 0 R 2421 0 R 2422 0 R +2423 0 R 2424 0 R 2425 0 R 2426 0 R 2427 0 R 2428 0 R 2429 0 R 2430 0 R 627 0 R 628 0 R +629 0 R 630 0 R 631 0 R 632 0 R 633 0 R 634 0 R 635 0 R 636 0 R 637 0 R 638 0 R +639 0 R 640 0 R 2431 0 R 2432 0 R 2433 0 R 2434 0 R 2435 0 R 2436 0 R 2437 0 R 2438 0 R +2439 0 R 2440 0 R 2441 0 R 2442 0 R 2443 0 R 2444 0 R 2445 0 R 2446 0 R 2447 0 R 2448 0 R +642 0 R 2449 0 R 2450 0 R 2451 0 R 2452 0 R 2453 0 R 2454 0 R 2455 0 R 2456 0 R 2457 0 R +2458 0 R 2459 0 R 2460 0 R 2461 0 R 2462 0 R 2463 0 R 2464 0 R 2465 0 R 2466 0 R 644 0 R +645 0 R 646 0 R 647 0 R 648 0 R 649 0 R 650 0 R 651 0 R 652 0 R 653 0 R 654 0 R +655 0 R 656 0 R 657 0 R 2467 0 R 2468 0 R 2469 0 R 2470 0 R 2471 0 R 2472 0 R] + 60 [2473 0 R 2474 0 R 2475 0 R 2476 0 R 2477 0 R 2478 0 R 2479 0 R 2480 0 R 2481 0 R 2482 0 R +2483 0 R 2484 0 R 659 0 R 2485 0 R 2486 0 R 2487 0 R 2488 0 R 2489 0 R 2490 0 R 2491 0 R +2492 0 R 2493 0 R 2494 0 R 2495 0 R 2496 0 R 2497 0 R 2498 0 R 2499 0 R 2500 0 R 2501 0 R +2502 0 R 2503 0 R 2504 0 R 2505 0 R 661 0 R 662 0 R 663 0 R 664 0 R 665 0 R 666 0 R +667 0 R 668 0 R 669 0 R 670 0 R 671 0 R 672 0 R 673 0 R 674 0 R 2506 0 R 2507 0 R +2508 0 R 2509 0 R 2510 0 R 2511 0 R 2512 0 R 2513 0 R 2514 0 R 2515 0 R 2516 0 R 2517 0 R +2518 0 R 2519 0 R 2520 0 R 2521 0 R 2522 0 R 2523 0 R 2524 0 R 2525 0 R 2526 0 R 2527 0 R +2528 0 R 2529 0 R 2530 0 R 2531 0 R 2532 0 R 676 0 R 677 0 R 2533 0 R 2534 0 R 2535 0 R +2536 0 R 2537 0 R 2538 0 R 2539 0 R 2540 0 R 2541 0 R 2542 0 R 2543 0 R 2544 0 R 2545 0 R +2546 0 R 2547 0 R 2548 0 R 2549 0 R 2550 0 R 2551 0 R 2552 0 R 2553 0 R 2554 0 R 2555 0 R +2556 0 R 679 0 R 680 0 R 681 0 R 682 0 R 683 0 R 684 0 R 685 0 R 686 0 R 687 0 R +688 0 R] + 61 [689 0 R 690 0 R 691 0 R 692 0 R 693 0 R 694 0 R 695 0 R 2557 0 R 2558 0 R 2559 0 R +2560 0 R 2561 0 R 2562 0 R 2563 0 R 2564 0 R 2565 0 R 2566 0 R 2567 0 R 2568 0 R 2569 0 R +2570 0 R 2571 0 R 2572 0 R 2573 0 R 2574 0 R 697 0 R 2575 0 R 2576 0 R 2577 0 R 2578 0 R +2579 0 R 2580 0 R 2581 0 R 2582 0 R 2583 0 R 2584 0 R 2585 0 R 2586 0 R 2587 0 R 2588 0 R +2589 0 R 2590 0 R 2591 0 R 2592 0 R 2593 0 R 2594 0 R 2595 0 R 699 0 R 700 0 R 701 0 R +702 0 R 703 0 R 704 0 R 705 0 R 706 0 R 707 0 R 708 0 R 709 0 R 710 0 R 711 0 R +712 0 R 713 0 R 714 0 R 715 0 R 716 0 R 717 0 R 718 0 R 719 0 R 720 0 R 721 0 R +722 0 R 723 0 R 724 0 R 725 0 R] +62 [726 0 R 727 0 R 728 0 R 729 0 R 730 0 R 731 0 R 732 0 R 733 0 R 734 0 R 735 0 R +736 0 R 737 0 R 738 0 R 739 0 R 740 0 R 741 0 R 742 0 R 743 0 R 744 0 R 745 0 R +746 0 R 747 0 R 748 0 R 749 0 R 750 0 R 751 0 R 752 0 R 753 0 R 754 0 R 755 0 R +756 0 R 757 0 R 758 0 R 759 0 R 760 0 R] + 63 [761 0 R 1227 0 R 761 0 R] + 64 [762 0 R 1228 0 R 763 0 R 764 0 R] + 65 [765 0 R 766 0 R 768 0 R 2596 0 R 2597 0 R 2598 0 R 2599 0 R 2600 0 R 2601 0 R 2602 0 R +2603 0 R 2604 0 R 2605 0 R 2606 0 R 2607 0 R 2608 0 R 2609 0 R 2610 0 R 2611 0 R 2612 0 R +2613 0 R 2614 0 R 2615 0 R 2616 0 R 2617 0 R 2618 0 R 2619 0 R 2620 0 R 2621 0 R 2622 0 R +2623 0 R 2624 0 R 2625 0 R 2626 0 R 2627 0 R 2628 0 R 2629 0 R 2630 0 R 2631 0 R 2632 0 R +2633 0 R 2634 0 R 2635 0 R 2636 0 R 2637 0 R 2638 0 R 2639 0 R 2640 0 R 2641 0 R 2642 0 R +2643 0 R 2644 0 R 2645 0 R 2646 0 R 2647 0 R 2648 0 R 2649 0 R 2650 0 R 2651 0 R 2652 0 R +2653 0 R 2654 0 R 2655 0 R 2656 0 R 2657 0 R 2658 0 R 2659 0 R 2660 0 R 2661 0 R 2662 0 R +2663 0 R 2664 0 R 2665 0 R 2666 0 R 2667 0 R 2668 0 R 2669 0 R 2670 0 R 2671 0 R 2672 0 R +2673 0 R 770 0 R 771 0 R 772 0 R 773 0 R 774 0 R 2674 0 R 2675 0 R 2676 0 R 2677 0 R +2678 0 R 2679 0 R 2680 0 R 2681 0 R 2682 0 R 2683 0 R 2684 0 R 2685 0 R 2686 0 R 2687 0 R +2688 0 R 2689 0 R 2690 0 R 2691 0 R 2692 0 R 2693 0 R 2694 0 R 2695 0 R 2696 0 R 2697 0 R +2698 0 R 2699 0 R 2700 0 R 2701 0 R 2702 0 R 2703 0 R 2704 0 R 2705 0 R 2706 0 R 2707 0 R +2708 0 R 2709 0 R 2710 0 R 2711 0 R 2712 0 R 2713 0 R 2714 0 R 2715 0 R 2716 0 R 2717 0 R +2718 0 R 2719 0 R 2720 0 R 2721 0 R 2722 0 R 2723 0 R 2724 0 R 2725 0 R 2726 0 R 2727 0 R +2728 0 R 2729 0 R 2730 0 R 2731 0 R 2732 0 R 2733 0 R 2734 0 R 2735 0 R 2736 0 R 2737 0 R +2738 0 R 2739 0 R 2740 0 R 2741 0 R 2742 0 R 2743 0 R 2744 0 R 2745 0 R 2746 0 R 2747 0 R +2748 0 R 2749 0 R 2750 0 R 2751 0 R 2752 0 R 2753 0 R 2754 0 R 2755 0 R 2756 0 R 2757 0 R +2758 0 R 2759 0 R 2760 0 R 2761 0 R 2762 0 R 2763 0 R 2764 0 R 2765 0 R 2766 0 R 2767 0 R +2768 0 R 2769 0 R 2770 0 R 2771 0 R 2772 0 R 2773 0 R 2774 0 R 2775 0 R 2776 0 R] + 66 [791 0 R 775 0 R 776 0 R 1236 0 R 777 0 R 778 0 R 779 0 R 780 0 R 781 0 R 782 0 R +783 0 R 784 0 R 785 0 R 786 0 R 787 0 R 788 0 R 789 0 R 790 0 R 792 0 R] +] +>> +endobj +795 0 obj +<< +/D [24 0 R /XYZ 0 623 null] +/S /GoTo +>> +endobj +796 0 obj +<< +/Parent 9 0 R +/A 2777 0 R +/Next 2778 0 R +/Prev 18 0 R +/Title +>> +endobj +797 0 obj +<< +/Parent 20 0 R +/A 2779 0 R +/Next 799 0 R +/Title +>> +endobj +798 0 obj +<< +/D [52 0 R /XYZ 0 769 null] +/S /GoTo +>> +endobj +799 0 obj +<< +/Parent 20 0 R +/A 2780 0 R +/Prev 797 0 R +/Title +>> +endobj +800 0 obj +<< +/First 2781 0 R +/Parent 9 0 R +/A 2782 0 R +/Next 20 0 R +/Count 6 +/Last 2783 0 R +/Prev 2784 0 R +/Title +>> +endobj +801 0 obj +<< +/Length 2 +>> +stream +q + +endstream +endobj +802 0 obj +<< +/Length 2 +>> +stream +q + +endstream +endobj +803 0 obj +<< +/Length 533 +/Filter /FlateDecode +>> +stream +xj1Ҍ΂!`3!I\j;u;Z뒋bv%YogͶZ>Og\]^sro PӗzZ-7kPL zIB Q`0J $5^_`X5.^ Pw<}RD (yG~ BV$@%h&:r%nKq;.Gh7O,h[sxhAx +:P/%"R&Jk!B?fϟFפ>6y _[R̎@޵.p5yJ/9E!S\2t::ASvp 볼Vl=x\/^,[Oa-bmA oyYu8p#>|۔R pAar(ɤOJ- ᎕;?_yVPP[\LVtZ(6S_@S̵Ec=k`SUտ.H Lvox׶=џ6 +endstream +endobj +804 0 obj +<< +/Length 1198 +>> +stream +Q +1 0 0 1 0 0 cm +BT +/F6 20 Tf +0 0 0 rg +1 0 0 1 238.44 714.6803 Tm +(=\)0) Tj +ET +BT +/F6 20 Tf +0 0 0 rg +1 0 0 1 312.91998 714.6803 Tm +(VHULHV) Tj +ET +BT +/F6 14 Tf +0 0 0 rg +1 0 0 1 198.12 671.36029 Tm +(\)LQJHUSULQW) Tj +ET +BT +/F6 14 Tf +0 0 0 rg +1 0 0 1 275.28799 671.36029 Tm +(UHFRJQLWLRQ) Tj +ET +BT +/F6 14 Tf +0 0 0 rg +1 0 0 1 354.45801 671.36029 Tm +(PRGXOH) Tj +ET +BT +/F6 32 Tf +0 0 0 rg +1 0 0 1 207.12 577.76031 Tm +(8VHU) Tj +ET +BT +/F6 32 Tf +0 0 0 rg +1 0 0 1 285.42401 577.76031 Tm +(0DQXDO) Tj +ET +BT +/F7 6 Tf +0 0 0 rg +1 0 0 1 245.88 134.00031 Tm +(+DQJ]KRX) Tj +ET +BT +/F7 6 Tf +0 0 0 rg +1 0 0 1 277.92001 134.00031 Tm +(=KLDQ) Tj +ET +BT +/F7 6 Tf +0 0 0 rg +1 0 0 1 296.29202 134.00031 Tm +(7HFKQRORJ\\) Tj +ET +BT +/F7 6 Tf +0 0 0 rg +1 0 0 1 332.31003 134.00031 Tm +(&R) Tj +ET +BT +/F7 6 Tf +0 0 0 rg +1 0 0 1 344.82602 134.00031 Tm +(/WG) Tj +ET +BT +/F6 14 Tf +0 0 0 rg +1 0 0 1 218.64 109.46033 Tm +(-XQH) Tj +ET +BT +/F6 14 Tf +0 0 0 rg +1 0 0 1 251.302 109.46033 Tm +() Tj +ET +BT +/F6 13 Tf +0 0 0 rg +1 0 0 1 346.14001 109.46033 Tm +(9HU) Tj +ET +BT +/F6 13 Tf +0 0 0 rg +1 0 0 1 373.505 109.46033 Tm +() Tj +ET + +endstream +endobj +805 0 obj +<< +/Length 1146 +>> +stream +Q +% +-3 833 241.73001 12 re +/DeviceRGB cs +0.94902 0.94902 0.94902 sc +f +q +10 0 0 10 2.5 832 cm +/Im2 Do +Q +/F6 6 Tf +/gs2 gs +0.05882 0.16863 0.27451 sc +/DeviceRGB CS +0.05882 0.16863 0.27451 SC +BT +1 0 0 1 14.06 836 Tm +(7UDQVODWHG) Tj +ET +/F6 6 Tf +/gs3 gs +0.05882 0.16863 0.27451 sc +0.05882 0.16863 0.27451 SC +BT +1 0 0 1 45.536 836 Tm +(IURP) Tj +ET +/F6 6 Tf +/gs4 gs +0.05882 0.16863 0.27451 sc +0.05882 0.16863 0.27451 SC +BT +1 0 0 1 60.878 836 Tm +(&KLQHVH) Tj +ET +/F6 6 Tf +/gs5 gs +0.05882 0.16863 0.27451 sc +0.05882 0.16863 0.27451 SC +BT +1 0 0 1 84.836 836 Tm +( 6LPSOLILHG ) Tj +ET +/F6 6 Tf +/gs6 gs +0.05882 0.16863 0.27451 sc +0.05882 0.16863 0.27451 SC +BT +1 0 0 1 117.92 836 Tm +(WR) Tj +ET +/F6 6 Tf +/gs7 gs +0.05882 0.16863 0.27451 sc +0.05882 0.16863 0.27451 SC +BT +1 0 0 1 125.276 836 Tm +(\(QJOLVK) Tj +ET +/F6 6 Tf +/gs8 gs +0.05882 0.16863 0.27451 sc +0.05882 0.16863 0.27451 SC +BT +1 0 0 1 147.248 836 Tm +() Tj +ET +/F6 6 Tf +/gs9 gs +0.05882 0.16863 0.27451 sc +0.05882 0.16863 0.27451 SC +BT +1 0 0 1 150.74001 836 Tm +(ZZZRQOLQHGRFWUDQVODWRUFRP) Tj +ET + +endstream +endobj +806 0 obj +<< +/Length 109649 +/Subtype /Image +/Filter /DCTDecode +/BitsPerComponent 8 +/ColorSpace [/ICCBased 808 0 R] +/Width 1101 +/Height 960 +/Type /XObject +>> +stream +Adobed    +  $$''$$53335;;;;;;;;;;  %% ## ((%%((22022;;;;;;;;;;M"? +  +  3!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw5!1AQaq"2B#R3$brCScs4%&5DTdEU6teuFVfv'7GWgw ?<~RL|TtR"()I+")ǒS)đI OjHO$GQ?4퓪PӒ#L$OQJu (S?* +\x u%!Ǐ*\ ԙJ= "CR –*HiH{Nb#J@RpDJ)D$Tu8pHQ%(@qt R t蒭D)$α?:J e DwJ4ǒHd6ALR@EKAJw {oh))q 4$rj +e<ڏ;)m-IKk}I)Rr*S{ N s IJGA_ANAJtm KlAR; qEJn▣^S|ҝ B +TwN86})%]R +SRǔ)ƟJP?zs 2)$A$Hi!RAܙO8H5" j~5BcS"K @V9 BNRHGDO@>%+)ޑ |J +TH<芔4H@MէD %(xShd +iNA^ BB S'#9NJ +ec3Ĥ5NR)a)IM>\~B\~BeV $!)Gܔ tIK_ܘDp)hHI*J(%jVko^$kDIv%IJ#.xJy|kJ[Y-Rw$g%*|:k |RR(Dp\ +Z-8A&2(u:KC&nSLpʗL*@p %B$Tk6I'D Ɵ0~'jBh$i 184I NIJJG]dxGDT{Q pHd"`plς@4RO%({(R!+O!4`q& )gNJX %u0 tOi}U qH≴㦩 R#98:<Ӂ +\8<ӁDh'T%0A}9J\x8:0;I$変O&!>'2S;{is+=ǒl!kDͲmN-}gSut@/ƟzGYfpmvĈ;y! j?8Q |IG(WMHRx'ڤIIJ:ƉtKTR.ɣHȑ |C p82+MgRh=D% ǺHT:|uNr%2R$ bI 8!)>*RH'TT&q:H8vAK*C^0mT> )A[O:r"4(I +Hi08 $~TR($< òv.x*}59nM?sz?`IL5X$VR6~VHm:eLALpD!)!6ܫ5 :#qEYt5X +qqkVYqQZ4bcprN72A*{+t?iT+[nUDȃuW 'OȈ8y2cHNX +x%86ʧQgUvk"8dU/vO3^ iH vB2 RԧZTA $|OIL<@ Aܤ$B:̓&'X8{I\OtwaB{:jV> G?z`L'ÿcHHju?4@I\64"5'&e iC8 &D GQ +@3$ˇiHӯZb]S!1yL$̝STBu(.(ω4cz 7G7'sKuAKi8iIEKSuה ⒖Gu!P5JG #Y0RRJR{t!%/'DKs|?n_ )a$HJ))ՄV#YJ|vY%@JK+Ta-5d$.HHRHxIJ"%( $G)%oW)/N!oZ8IKRqJR@2) )]NN䑈LHԤQ5hiU]i;u N4S4X-hX;mÏp¨[a$ +NJW`IDŽCN0Lƾ)K5 J*f,{up|' +Cq@k5XIU;Y50Ƶ #od$74l6o#F CRJ>IkDimd{&%%+Hr0I+=3%*t Bi2ܒh8QtRHLdVׁHە!%%(Ă)RtIJ@CDN#%(j5~ <O))@*@:F +d\ DT4R3Qᢖ'R q'p#$Y 4Hy p#sHu#Ht +Ot6u: eALlqu+^pm Jmc_ྱzE|\x  04z 7VXN%*U.5U@k3Ϩd{-?3NUmIBϳ^&DL18qo8Ff}0T۲k:_Rxz4GiE߃hCN3gRa?[lN*  +'Z=xp쎪Ųp +;*.:k`8| B*![q-}BHqpM_P_(PU}fcc_5;!çp`WR{:'\2*CN\R}cǵ )\%f?zkHt))3 +ƣ%n8JWVx)(;q|;!Wu/i#Z F+T^mwt$#mީs)<#x؎. sl]Hݧg8>䧪Z~v,cak, I)!}Ф4 Z D@ƉH0A%. $NRRM~JCˀOI &5HtHHM%8$8 JcRAIJ d@!:H)2 .0ɨG6I,|eTɽA^|AS,T/l! Tbb]tD**7Jv-:U4f]՘ _Tx\~DfP9{B#ad'oh OaՏG^Ktn^ +o 2Ǹy(GτM1&&kydq[ZwW`0a_S '3DF,=עd}'>CDβv#̷!)7* 2 SLd0p67ݱOV_mdI[ +c@J(4~*]wy\!mӐSaxE+-ppC|󪺅՝ {^x(Zb;\xK53?yZw221.';kHs^Gה vE- '!8)'ndJJd'IϗtI%*xMߘ> IK Lw =a(&t)jZqyN?rEB}EKΧ'8HIIJ-)`@HL̥IK<tw->)(>@w<?3tv NRR<()Ĕav~+u:O$|Rt<'D>RI*'SG)N)yJ|JRRRR9"9IKj)ƾ)OpRיI +ES7X։2UCs93u/Y-'l΃SՍY\4sx.W''3=MTX?UI/ڹѸWOs_7CSt}WSb i0_5UL,cҥSU Mr-y<7x(55Vm5#N |AGESYT+r^󵺓U/q#=Lڟ-/H5;<|e 2I)JZmh!'5YւxLʎ:j)7 cM6'[#1y~ 4|Q0p/cӕ@nk4mν0-VFtp]~>~14DAmHJGq^IJQS)[g"Ls%+w%'MR{xCx";c"B}$:*@DH4NOqײ}~}J)I&O)1''A +y ? 쒔Ry$ %P{HGʌ)4䒔'5Mkpu%(ȤPc8IKR G 4 T78IN\Psah:l /h ̠kD*y.Ɓ.9V`J vkt8^:uփk-"vU+\a$P+{aǓʫ[ȑZX&{$unv7s-k-wfC .&|NNUP\@fNEn>(7ϒ(|  *PQ`}VTƟx`4J8K,Iږe@hLYҳ-7Py"܊Z'Ta5&iʨfu<`΢"Bcc_PjUu>Lgc"zSnŶ'MTN/h{A'S+%cr+p4Q*ѣ|tVu {j,ܷA,8{%!mMrw;SօZ/8R8;輷N@T .d'Op"` <ʏE!gPkƓ#o|R yMLШ.}'L黄ư`444ZI:Gp"mV%MXYA8!`3"@HVoQԭdIZX5|@'T.>i +\m옸> DTIJRyH> P F%*S$>h`v)H8JXJx ) ) bcV7EdM:ZR$%+D]IJBi%RR'FҔ$Nהݏ#Jg$RK!$*u3▉v: %S)2 is4O #aXѿHt2ihuXѣ J9Ysj%?IǓ4b7<k)*k3Ih'cX{ϴRD:-O'=kI;@%Wq8lhQɲ9$?U&I ,$@8I'$Jxm p`.q ߐA s=ԅo4#p5)d;){^=Ճ'ZG^㯴ruU_K=w|I2]oQ[ut;݉hxAG\Oud0IZ5`YUbwFoL'TF[^eԨW&I^oc,es_Y5b}bƶ[kqwB"KHvRAОJ@/ (xA'M)y#Gc hϚJ\O~LpyNG%)Nqi#)m褥q81䔡'IHGA>]!)RB$ITt]Όp Ǔk(Rּ4cyCcHƠ3Y_)NG.0KG1fMgP`QYlituKKI {]:p_QqЁT}NL)`>%VT<} G$Dy]&5CP8epPb#)7.ƙ3(uVk FMxy72D/"K|SzLC]3$mLQ|{&ZgE]͍4 KN}IGqsj {*^O愼<kL3?HƅD薙\ Oސ?$Y(+VMp[" ;p  Mt!SiUsO %:&cvLpIR`l-\!:HGJ_HDJRRD)4Ap~e+R%KtQ3H4+TIH'D LNJrun&p;R?"Z*BF/%2)e()DaG^)'M>*<' x&DocJ^%co[Q-i\vT Y'9??Zl;t腂[v]I2{|s{ rXƖ֝LO>*{B췺I2IYę'fDk#iA3'TA$SI$v )`'IJaY<MTlc1m-l~R>h`Tkܒ\#mhƖ-}.yG-F}]̿[qu-x>/%3"z4Ҵp+d9+UcKZ#{{멠I'$^kEdoC64KnFY,憸O[,(F$$ )8BAKiLG +@tT< +V9$ "> a#*R Iq#@ p6 W*3ή'd$q0>M2IUL\;DyDYd<+u+Iak?]$?8\\>k]-g?Mq$4 q[f x ર D i$BBga@puȬÚRfM$Gn{.ô询6gZs!;;rq lOOAheZ2V-V:hPH<P=9 -n,Wt;'B ~S-xNM_HNsHDx3d6G!3zp-*~VBUثNfu]\2nNC E* Mʼhw|]ùaC= ;y-#A?4#[aR>BGiIS uaӺar.g 뮼B\$B9 Bv9Vn|%ty ʰs j?CsbR5cݬG( WGQk`⏘P,;pQ-{{`Ld?'Uޤ,im3-QQrm[dw@DZ^;]t~fǸ8G~]29'P <I.Yo "'Ǻkkoaʶ1Ehs^6,kAy5)'e6?*PA'搂 +D.|@H$H$ )`|x D}0u#N)S&AnM- N4%(I&KSDL7@RRJPG}|R %&D"PR"~Zx|3@'ovӔDt"@7H(O'1>zR0QSGE+GAՎI_$MH^|R7t;B^$k$`d)Xc*%'1Ƭ6ͯ:1FWMHx>2eV>Iz]CլZ6=^ޛIaZVYC]W6`aܥHku\V4rVkDS#D^ nxr`4൱O? ` hh>-R{*48pu*ZI$β烡B{ ~I*qp 5&$QvB N"c_( DhB86@TT f5O[ 5GWֻ,SHGV s h8>jAvl<|2NCMeŴsjkDUTǏ&.F_L94 S%WEg@$ #S\2:v&UUzmaݯne߼E:3fUmeյӶZ5mq0ѨG̨=@di(g򤥛3Nb#>Hqɾh#SLLnk)Zqpy Ra"@RRG@&qy-R(*?Y@ӈSZq"~5EVkOB^< +'k$ﱾ@.a>xoX8pGI ; 9`Ϲn7c ᤰVf:~jdnEcagwYOa7]lpWLLJZ҅%mhX`4ZwPn53r} BCTN@\p8)7*-4X5Upw32!ď"7 #@2qsGуzƏd+Z48SǚXZDf²6E4`tQpp(_pY\NM&$:uX6$a▝ӧPƾ`!_:'D; +Ϥ;1 +4I +nBcK! >]FUP!ЗH)F\G!t=asj΢muZ`lRne/=*Qd{BKǽlУ:xg`-;@P8`ʎ̊D$2-aD!uVY: +C"u&]HdP.ny%Kx4f+#IH⃫\8< ĤI?rMuO>MJd$MƀǒntRxMs)iHy$!j=r$G RR#旸hGܔ)>:$_ʐGHRSGqV?ccG*HJ#O,\ H?3ZA g@ڈ4:Owl{iNFv!HVD 'CH 1w(^` ?$v:@?gzNm0l;WmTմn<F(AsYX=K&& y.|JusAۨ_ʌ짲EdѻH`Uk,{.{|HALLpt'U&\$1۱ =ԶE/7np Zʺ dF,r KT$y0pxL'8Ӟl=:hG*ZRJRJHa%+ ;s%,yJDNR cT탨6 i%. {'qJdt]24'.'OvqԨRkDjL;]!SaO⫗MS o n={I%jb44 + ^>e=.w :2:AA,/$V|(NW0 :~Q*ƏoK,Hhc,*lUf4PyÜxF- @BJ+l{=B.ӽdpH#MQ`A$A\ƐOt>ZME`0;R /?ZVli<~rGNY3Ā ik<WP;BaZ8L sOnU0LkB;Us{otG:9i+5 } 䖹̒{ bYs`wPwN7<݉Ϣ'd6;Ȯd:ɌDX\̀b'D܊ΡCN:fiʨh$'d5>)۟`uE"Q('bk21y%\#ijcIQ-N( 8G*jA1K":kpYs DncՋmsD/C)~ +QJ"há)m`VLM8bA >i)}4rJHl'䐙2tĒO*\U q@G%/ K_PR&čT$ >J@4]cB}G;J|vY%(M)J+W!)JP9NSFO%(-Wudېm^+&x o$U h{K9%c{K]IՀ kܧh.$Ʌ-fLC09#FE%$4 z-Y%^5>) +g]P {A甜5 gP|It*Mvw!HU0@Ɖ)gTG*iv]>w +qZޕҀ%!eU rNs +Q )my~^K?#".qs:d7D%#ruC.oO Uzq_2+Ϻ?t +mSG[#CH'YdmxwQuM3 &ɐ#s,FµCXt:5z?Slx'7 KOTik.t5gB}ITp#iGT2==Nߑ=vuT y5q ˱3=Хj9A{\Rfu ?(.SF3}b djZu GP.hkpOa%BcZ`h8~U96/d_e|m~oQ]#`!TXiGuk!ʮKApQ2+$TqAL_=GȪ#4h*^;.lJc^+|6%-Tю6;Úd; v0BD ՙx]`|MbGu!z-NƭlǴw}JQ8E=$HQ0H JRJ|J;JJc鳹;C6e9!0&~䔏!u8 G 55le,"IJnu'@[[): t: kL&6uEU`H4ɚ'PS;]Iuh`9(Gۦ dN}W6Terʽ۞eM2}ƍxOĪI(XZ%nQN6,oEL% Xģm4\{Ny#qI8QO.89 w^Hs:.R9 pw}fos-/{^j m-Тa\HãXk9/`ZO *\(iX-tIOY" Oٽ*h:t.h7Q=18)I6uٲ} + {5i7mw U0&{|E@"{OUs22l6\yNCsp Dph  w@SH:A +-XMo8ic0Gc+ ԰<{gUdYaTcOR.w$䆫cAv;/qA`rEx>:KjUb8Q@j5\>g]Xu@;WIr:I A$๊|le>M|*]+[ir" 7NGV_꺠vh|Qq H79y~A Og}OmKT %@BP5I-I hykIyIK!H DDT>:x)| &N;fGf%ǚlJN02@[N*;<ЬtA?zPKJ$U{Dq#;4 +* /2=*5q."ixopAJ1FK|g9-;\VkdM;:mlr=&L 47T~Kk\c Joq8þ)X.:;;+wlvZe3]<~2?#s̐{Ƹ ݸ!0D9u={ɄS|3oǵ1¡j (V5༒kR;};DA7pr`0ā!= 7ad7;naծ{ ID$FgPxԐDҼ3*w/.)U//OF{V׎60'` KgT?V폏etdµRYӶ}z]QwAD*f !p88v#u@ Jd>(kgEA^GiD.ipV-?3*71j5C#%Aij1#M->JXx6ݶ}VUA.=IN.sNZUnõj6g]Vr PBDUf!)>ƎHH)`08tzx|1|GJ[Be1:>gJu r4$GDd\撖:sq< )Mp<2:(NϜ'JPtN|e"rHM }!> )q=qNJiHHrI$Q+B'#J;,ꐗ->i|(QT{&BGJPC*o M4S<:Ccq<\w!e9:kO'HI `u 1ʙ5Q$RЕ1Ί5@'IIAX ԡuQ&։C)ec$ =4$k~?Qq1$t#M~J$ć<{4'Y`H:4wS*-i<Ԛ `^ƴ@ m/,pjCgSUs^ǐ&{cYyF> +7O}O!^ hh*-N )>EhlַΛT 4PkcZ AH㽿m&1z>D(Jep2; +vGpiIRP[YcOhRq`䤉l \ !YV=1%JOhH-Kz7O~dvs@AZ<{Vq^ @%\E=7U;@xoB7eS7zOpgieO:2q=@? o-(ŷmL'Ok:. {WrN j.S5 RV}|-(n{'<[}m>69=&ZGb +^IJz,3FnvO o{S} Enaj{!W8XZOQ=>\T]\ApD]s juN4VI,$ Yt7=Onc`v,u +6 2 +s~cIK  Z +ZS2pmD+cTӞd`v f3nХwO7c\?è$y(g!M7MOKEj9I֎M5DF~Z|e#|(>!MϘ֙E!v+u{OC}Y'Ȣ-weIQwFE8=gS74D'G"{8y> +=HI +D-׀ClRCtya+B%`q+KC:("ĞDOxM[6B +MFA:D"9RR5!>>))NTGxNA&3LH4<)):|4?*}M|RRdBmGyLw?"Jd` xK>`oot AⱁdۧޱO%RN!1TxH '%(i}vݓN0r󞽗kLyc?jJsɝ0uMp))Cm.&q #Dn`qF"GIGDQ`ɩ<eI;*E#q33r )2Li%@K J% $ \Zg:>JF4IHlq5W10}pBxeDNpB?;H6ٹcw啕m'msQ[K]p&M!c7pK}=4|Gf6% }<~i݇ (D[N!xq d }:ȨO%K6li)k\bs$-~ +q$u06h#Q%lgRurq[mkƷӞNh}N]N,w%Rmn?K%T~i);HkZ&*fùB unUS: +n[[4;Z\@'_K ѨohyVN[ GeSI4FECciq$2&kNTvubZ&e4ڹѧە`!$8S"uTt`<fRO%#Y^:Sl( p;LWQaXc "m%$6Plw6ԩFM"RSN·iO@돒x-ZxȓI||LBlgz{CC~^M&/͂u .<58e4'щa+nB9)>4t``]>;EVYWCM!8;dϢ<$Ք;o}fEb?ws8P.y9uIs:)6s>`GvF}dSc@'0!?_4ӨYFtt2R'vo<V,7 &tQv'mxQ=6Äk*'1`Z,Op;(2Ywl6w)h6"ItƊc6 1*majlx ,R(ӳ;:/|i'S胴0uk#djhz{v`G,sc'i{Kzk ~c%l&Ae3>̔[`rNGFt0;s( I $=*?<"~E%ZJLK +'_KymMlkOsNrHUB]kH4\l:/-s,AZmZeEiҟP#B!i R.`H1$D$9)ypR4JR%/A L'Ў#%4:' wfx[=` dz+tRGe_$IAK*|$'C bߐyegoߗw&J>e +kis0nW +I.H2|E+|R$xTDOADJ| $$ 9|,bv\48iJj!7jR1VjgqIܬP;:n\װj +hFHQև6HwN\O~ A,KCv;0.kIۨ"Yi:|OJm@>5ǀو:C +/->(Ry9N=UY{?vF8J5xډ5j.5rx=tC@Xi(k +tV_lƇQZ&Cq  JMHXBh>#Ry*) ";[J0~Tl3DLDO>aGdNDJ$F.1=&\O24.n&~qП2I<`vŎ%J3'ĄIHQ$K8CPOl3%0{g䌂;jMDWVW uR<)k\;jwTMh ;DW-)?@$Z@b %# w#D ?H6~$R9#TR; >%" b֞4ыA#M>)) Gd"iQbӧ )i F&, vQ#~Zbx'p~PC'HuGR#I NA<8%S1{`m>;+Ĵ~Hn%.'twHVV>NUw使hr$L44q% x'i:C-P :K'sKjsOJC7ߤƟxX@i4o-ŭ854pr p$p:5rA-Hб*`5H')E<VSDuYUkOܢ2r}WmAISVXkzuNop$E!&-` +k QZ[J] E7<K+Hp6Ϛl +Ï$cј)?34F%*|䐒Ϥ B= U{Lhy#<A߂]N՗S +-h<WGemq?L+lë'Ц2{3TdSl:r<N[dG$@%1 y@KNߏ) %%*]LD^SJJZN"<-tJJQp5HJa0 +w+cA緷Yĩ#nqIJ(VA2OKNa䒞'WO& w?͸*V9y_㢢IrJe>#PdJ\(8.$"FD̩4@'%%u/?=ѣ!; 9>}rp]x#s04Q2<'$~)tAKq:r9iALL@7>GS:}[{GnI)/ L-h" ,ʰ[_v(6p> I:JVd5қAq x(?Rl̠sZ?EZkִLn-C.-E.\N2I' > !&D f{#2]DƜ+UQH,kӰV 2]cF8B3) jTji (`缢"$V@؈IL +#[ )RS;"5xJ4))@!΁3G)5$PcG_$ H]X$LdP% ~ G%Ji u7txh{+䓠:%ȈINc[ ?1n*'Hg+Vi8dk(W`MSd Aod=Ȗi! z>E >`%M>C暓gʕZR2PO@ RU8lrD}2ВXnܤ}a)42[)%gh^)j#J6;HyU?C(ͬHFlYXFcA ~)2 5D.DJ+Y0tfVŭ'E IX"{(hZx +MDpJ +))Ji=RRp<<  )%䑟@ HO&.T4 ׎)C9ND#`8N "*2VnhP=R!V:^}3?RIr cAG: ~ic)Q#0w_Ct[ vRDwL uiwO@>b@aI{seEZvj%n|҂d@w,x$ɭ'p IL#`*n\i0C!lA9% !r ҅qcGpvGi5+>q3`C'!8!*`3_拙)U"piMkE %6iIY%C 6CI=Pln"0NL|бݺ?裀;r,PyN6>=O?JV&%Ki8)$0cn3! j:q"|-"# ̧P@ $'#D )O)<)HIL`5!J#I,@AaЧЄ)!h%SNI+@ AR > >Im:DKR5Q긓'@F=g|Jw ig}|2?Gpi )qkJc) X;AIT>6>H6P>I!|~T Z;uQ&_NS]T'#!UkL y )ms_AZZP#ⰚՏ]4J[Av ('QW5Dκ)$-5Hht),\DH|T)AxIJi"Mvi%*2vRU2sIH(I||SBvdZ8j$Hϒ]065H@ I? Ο5;H1C! $Zws4N +T')iJT0L&aEwAIK :;A#Bb4)q֞%@ ։:""XyGkHjW:t$'R-Mrփτ1EH=ZS"AFruD  I xSNJAHR IE@!iJ@ t<@K]k%8הRH ?(ShIofI 'J}~(':yjdPԧF LSD?445!0{Z#쨹Ѽz=0I!PN6H^č8LTmp.cC",h|U ?*TDx oZk⣏N&{(kHcO`Qԟ1q(ɭIK;ǂy $"BTϩ -dPfF 8=;qdOyN[I#ҐcgT\ܰk÷`X.{O/h?` !),i G@yIK@RB DTA( GrVTh%Hq !` Rk?ܒ'xk-I4=.4N@<8IKGt4pRR tO )&u4 B*bDTB$IR'QѦK*#ȡ$={"_;Js~<(#U>!5NDұQw+pck~(7NE2Z RĴ2?d,VIHlop܈BKi)WȎm2َUX12BDcQǀ064Gr +K#",a![AI`"M4|wKtZ =ü TcZ}՘vZG.=ycZMēSu +x>)T̓\pAG$i&'HR-~:& |4I HJft㲎=>I)p}wH`"?A0}`F!c^c0F)dRpH49_'!x>.^csq.Wq+f5"lwpjN #q 2;(u'NHN Q&NBN"x%JIXj%M #˅mֶǀEkXd9:=D(RSLwLf=IJ$O*$C$NEHd0!DI:Sc +I_7m8MF)y쉏K|4c`=4o0y+M55Tb2 VHxTK4i3 `FecpRD֑DkI +cA0wNAF"JJ]Sh>)t%,#G2 +ԔQx)P%x 'wN%%jZBP!I G +P6<$[<Np1ʔ)BQ撙;הG4FCM{N&׹O5*IήvM*aH:*6m:̭ `Y1c]:RQBLSЈOAA zA\F^;:?.aI!v2->rRa"<g)[GbdNIc%,)"&< JP?u)R<#RJ Sȑ:N d|BCnnR! 3!8A$('C䚈I6'>L!]ɏ]}1> -eϏ&k'D~),g0RWOT#& mSոRJU.+)YQ}c+A|JOhOQ +/>>iVGuIL>:Z> +QSE>0Sjyb^|`>e-{? ܒl!TDViYY?Z8SPXm2I1]T)ztIH#䖾Q▊^2@ ˀop$ptW#}Lܭ#GFB$%|R"4 +(xRx*<;6ğ}j²kZKw\͌ +i\*3)bN߲h8P_ETX^K[Ä9xD@< 4`.Qe%,NԤHq&%$|'QRRbgLN12~I)yS@KR@=\vIMZq`&ZX5w} +u5 kC@"QC?z i:f4iL wSmeZ; e'&HBHSZNO$V<yvEkyI`)'DTt$[i$Lh 4IJ 'J\qRט#τFȾ|>N  Fԁ'HJMJ@pi 0Z&V9Y 2G +9$!2cNNaG~#Кa!NHcLaw#HC$!,%>g!Sh|{D8B h>I[)~Z&CJ ,) 5{4p!۾) 2*qK$kkJe=Ԑ{Lz +#uD!IFi)4\Fp!)n <`"T/׏"Lw +cPT JǸO4DMnZS~&zlc F.c +tTG]i r$G=8!HZtTwJ| {O =pOaD'$q?Cr@8B[AO)h$x0hOO->4kB9ֱCQH@88yv*EDփq(&Hj4;qj :5䤛S'y !@9b{ ͓Ʃ))ScY)jcLT)/l{KY'y >X@ +4n JluEt@E94 -Vs\"A\y$:@c6c^0?u:(qXieF&8@=N|!)ړ?@;J:<8X^!k4l5S9$蒚]` +VXIc!X~%IKu-REo\-?HHc +ܚUk4#ͼRsH\G[ Y`4h7 Sƀ5ch^k-tTq+}`Ͷ0h$^D D'tRH*e9'D&JqL({i朐dr\bAs)bBIT*$@:K )RJw/N$A?em h7JK[ +~Ƒ3"L) + *رƍ!IQ R[5FYĢ;"صC|6cLWӺl8hQ@yN{ğJ+“FG HH )@i“uHJ )PdIK`JMxq0`hȨ"uHL!aHhRvԃR$JP.uUC2LY^$ssCLCDǩK1jGг#4A`Jx?)V F[RZ9VW()PF:nLhI))xA`AL$ +JVBxQ0K pAq($Hx$ FɎ5H`)s 'J ?dDvNO"TA%.<>IY ߱\`JlA:E+alǶ + ۆ:^#]>~tҲT0< /T71Wمv(hq:P-8h/:v4|wbN@}#3JoLA丩 +Ez5 q%8DQ8t- +D$8 ?]W |Z%eITمK&S[ձZ6M^ dĴ^OԔDrrLt#DB\CS@O>t0z$~{~z<|vY-RM<K' K/2D׸r tE6H"CVvKo/8gZֈmgܱMdGSH^ &um{s-&!&59IH)bD$ a' +P)X(8Nt@J\c12a hԕ5>cJjc{G6tKK(c" +XxA(Pȝ{&4#P瀜r`8Dms"3N|"M4Sk44IHX h`2y h$H!8L2H4)<J@( )@$ )@J@Gi +mh%$D0$)GHJ@H%( <4x'LD)$xLOM. `~,OX"D[vÇr +L8BvM`v.',$ JѧIcX5B A&?IKYkT)3CDBL~Be%R͑`RRA&0 XZNRR'cpGL{桵5j8"<ńy"N O<($2Ic9FEJq-= Z|D>I DD*{{N> :=F'--ґRf$Y#s{5QZ~#tKlvF;-vЩ'E~U0;T\i) qq8򂖁H%8i#S}>I'IJh]!"[)τHOOp%1 H׶@'0oBJQLJtDD{$x&ɘВTD0}Ƣd;<?4s#'5l{`'I%.w +FHRRIK40<$ ;'2@ׄБOI$<'29द$~I s)X|L׿ +qeF=*5q!q;&#4Xv}yɛA`!5߻RWp&Uvo#8d ִLa죑lK""wApk*F7w\8=4#OD" GV .-U@^zK1DkO͑"*_8Ӿbf< Z_oTETQ;)sj:8HT:94]XIoVCM;t;I@ۃcFv7#i:x"Ac+c9,n~H[ QBYӀ9iJyHO}S}o/fPrXq#ulF_Eԟuey5=x0;\ Bj-<8+'AI>x䁪vIL)[r!'!#U-JJ[hJIJG!NIJFڒ1 |@H-@uLdWrxHGJs +RS)CfR D4*Q:H>9V\5eGn~*Z<;)t6NII魧_Xa}IudO$.pzVw-x)c<1#P/` #3T8$q>!HZ{A> `%Ԕt=%+tq:bTq@xc_w-s6ʱ(\0eN ylt"7U;MD#Pqi2;{jX3i)D8&< 삔cV‰l<$& qJVS$ iKQ㮩)F53c$jDy$BJZ]& OKB|Ou( ωL54IKFXN wN 4btH:d;xSĎ  Dy-:')8L:$>"<<& vRHPL'Z{vROA~I4 gR>}{RS(ha5%(=p)CςJB e:Op - UZI`bVN.+-k%Qit!+k#4$674w\%ĺøI+WԯN/fuPaYk?=w}O ^56Suڶ9QHə*tI0h N^ɂo">Ηqƒ-ŞGk"~há$ O`kDh%ܓmq~2VUvt܇ٷ?A{c ^Y*$%V oԏ'Sh#~i7䗬Gp$Nϔ7sqsJC^}mwƤxM#WΥ8J.Y׎Ʒ*f;A8 ӈD]'TA->@owEH`AW琕_`Vǃ_wU7u/ʀtc ΄BDGJʸ""NMnڎGϾ0\{^0wIvka8×1܂}a7A`p?I} Xrplja_lZL%J.Ԋg<'Zٰd0LIY=i}cS]3ܵ`թqⱼVVHV4J;,XH<(Ϛ(RD)suIH^ݭ@KWfzѼ7{J7~Es\:yd7>9;P+y |Glm; =3+!ڵh\n]M |Pu-ćX&?5jU%^p4h"- * + ȩ +E QVT^Ԕ `kT!0G8g⒑>$ +f{SDk@<(mnPdS N Y:$ + ᢐk:'%,Nf 8>IA&eIR@ +@%pKV]TOdIJS2A )ax$)DRRBIh4OJ_NT09r4Ld] |SNL"JP`wI-4HR1$i 0F?aw~t"Ag7ܬfs| ?nC- +ikc v ʍnڄ-Tk?Z\x!*e`I9ԩT8|&it9'Y-k,tZF-"uGż[a#A5klE?Il(d +Mw''ұv-[aoljW1? zv7R +BJm8mUkⷆ55= `{JVʹzcƫ9׆X C +"0ͪE[^%D=Eok^(DT:]*a?WԱ6΅'Ä>~*%4% 3.Oh'wc!xϚot?" B[D{i%+u{|cXN4 vHof^ctaZ:y#$`%E ? :"6nh'uMMWh䃩>ZVWth>Xy_ul=~^fծg_$@sʉ&HO +DAKG$`8Zvt&T 9HS"Dk +M:S7%JZ9IAKT2~e-A%8?z +X5LfbIK4sI +\JJ. +Ž4U,#/ Փl0;Q#Ef>| To4|VPܸ?A!bgGS̯MW[IjT}W\@&VA'n'✑1>|R mvqOwWJl#iìu8^b<;)t %j pĮ!? TK^|h ǻa.$w`d1Yn wWZ{Ks(q*6v-?)-︯J.yHqRU>d1JMDzL?zm_4,O?Oѻҽ(9Gs.%ph(Oq%zQݤpK\/ +?E%/IJI"XG.q(q*7߯7GJT|;&O~)q+]!&D1DgwU+;Dʂ̤?F2xh)#%9?>fO|jZ$4yx;]QKߚӼxR5N+1QKߚӼxa 47?⭷}u:I{WsV> $&2Z$8I$?Ps_?ryHGsdA~?x"yL_xU(9"yO h_xU(9s|*ijI}Ws=n?A$~.G)D[up' %L?Pd0?ڒJsr &%0urt*Fx.W+ XFl ;-$Ǻ8 S֢'Q~1>{BO(ٞk.J;^2ӧRi:lU*9Ů3u^׎v*6[q\vvkJVPC[?TwG>}#f&Xv#ħ̆X#@7/9Ƒ [͸hꉏ껺%<4Hlc-}e2߇b6X紝0$㚜b?ԫҋm7#MslȷjF_}wñU89ҫmCS˨@>7OTtop$!#eJX|W#8R7pRmu=$BtOxmma#a1 ' ƮծܒɍFX G/t><+@Ժ6Z!9O + ɪ]$4}%V6& i!tmK]3eNB =4NfeH~T>]Lk+Up;^sF WStYs(J.kA64T0Iw1D4J wLH8<R|1 ˹tɇ$$N:h$RIKߞED% +R& +FNIx)Mۄ)kJip-9їk{sDx]3q xnI#g1A{HQ6b<gq(9. Խ-x[$jÃ: .s8@|VuqSdh;@)kBR`BJe T'&.#Ps%*`Nd$9 F|58$tSO2GJ\?9 IBmQ S(2?";`p RIJ$D퟊ii%1uNtTL|q߄pN1. xRӧ}4Lky`(:@#Bmw4.=rk^ Hh6c4IkoZhKGn&GsIk؏U*]QSx.kEWeX|JB5ƅZ1L:DTdkY2ԛMnw0?QO{u h1ϑH1hhiseT0A8K&kTq$;ՕW +Ds\k$jx2=~:=?{C \TRG䴹~G!5Vnͻ^&],EK7qvJeդB3newa֫GN+cpXmX=6Wu J\*ŭsKIGTvuШSn@ù ? WfW8-w4h<կ]6e:5IKtGگGgRBʃc%jdqr 3AX'&i\./M5dukYm6ϲ C]. oqۿ0c1)6۬uVU7[77gv1e˩ XcXX7h;BhΏBz}Y/ȭ6m#xٳƫ:q D88 +K&BB|ǷX>μIN# xA+ǎBy DO% `=%+q2y;XI&NkH&?*J\N ' P>Jd$ < HTB;4 gA:AAA +|; )$?% fa8WotGYT[vJR! +ZA$`tPi`S_vw+~ #)5LHLL>in:% w-N(/+ݟY3k 5_i,{R~Ph ;Omh_I:qop[8m[]xȦ؆\ᬃob['&|G @)N Jcի:D+%ED۷b}ǑIw, p0?rs4Qwj*c3{O~g^|ު7'gW xsq=䨫=WCn9\O,|]`8pe5?]SŦ;}/o qkiv0w6?Pcsi>H<%XXpƂRGG)@IIJb HRJܥS!ΉKxH5B4$IJx;C8O椥] +qȁOg%">hLgTvEqrV#V/\õr!]Y;߻M(ZAa)|#;pqwR >~; Met)4 gGѠZj?}G&~0Wqæ:lkrGܵ:{LwLMmY?V]詿윆'ĎOE<Cԟ.S{"@|R D[GwIK9"H Œ=(ȒI<$`>js}>TJ{n1)v9 xǚA<&|)Hx~Jid @T,r|iهg'eRS*.:@SpyQtHIL @ yM#Q"~AׅqY|]S{}r@4;l$ŋ7v:!;Bs;|GtTε]u2c=yD.c)ƺ=iyIH*o-S*$SخՊks[}.?}'|+&.ce_ֹ{ ps~72zWe>渒CXH#G p TUt9;@:w5S:sv緩zr;p2rgӿ.~Uvxn;6 Zcʃ2YhiЍ4 ӓ:2{7qI pQ*n=ŒwL]i`He@"4AP.ӸQl?*F\ q "h$;#7! {"."H[k'H]m::oRpku8zY`i|WAN\y9`Sˢ2HsMAwoFTXϵp w+}A0,Uh; p!9#2-ubKGvEi懎tDL,p#S5Oƚ|JPTlL9NHIJ)LF`&' q@{}%. <#RS dw(:Jyp_OM$C?> Q v1vOkX*[.HwX\p{pJ[)&eB~%M5Aih1/}d uf5?dkqYQ9]]^?"tR#VgM:L ):N#SU<4D4#S%"P<=y) {Fhruƒ=s)慩gGu`  gTL + +S|%$AtNc*^{ϙ!D$&J +\F4\N5[K-{Vivȋ,l5ǰ R#x)Gm>uqs^ /`Ӈ yWl wWcK}"q+ycR0r1#$EI$RI$I$$I)8)qIuRrBJa%< )GSI~T R`mP3ˇ%1&xA;"DC$$nr\~n-w1u.'Ȯo@̈́J;:%Voa=e\ kiĞKt_2z-kau֮k^{.s|c2^E:AON˭lkg>^nUk{n@ 'I[ w4 7#:"˃#ׯm|V+]XpfWNk$lsGh\MwQGz(ɦ`%Lxhk>>H$]W;*#W[[[:~v$">Y&?I <6$+WpnK]SdoqFv*Fz2=kGed \NjZ洒K@5 Og^ޡ/۫-x!lIɳ=U/ 8084:<;-D~=:juhw%cnT)6cmEK\HL2AYƧܼ6ޛ7iۋM4vEL/dF } ̬[sJe>=c[H_5t+q/n6V=wG.v>gQa 0Pt3$`O$sU7:hX4WkXmucL #D.GK[$Dwmv:f  +$@\hh1 %]\  !ŤtZC@{Br]y L;~Z]-їCxhA5a[4oܚ NEz'`َUj hӉV|G?~MTCHuwW$TARu85%(Fb> 3ߐ@0x EJ"5IK=h ӰKTcR߽%(@%Nt<)xv= S=R{Tc~)~))}re#D{JD8%*% M'1x%!p0A:"KB04Pz46|P:8!;6KZZԘWc/=^!Ԫ$t()R|Ri2Td|C2L: R|RR~IANR#D#SJILHP)I#N!1)):*}^L˪gu.W |h}/og4i%u}^&dǦWf;YӞtҫJ,Ge42"|ʩ\Ra17~W.aQqgZ 萊  rOaE$>ם}r w qR$$Lp#RF܂1.$ k▇T<1ߔLA/wrJQ!Imtk!@OL|RRo'<NHM (Rph|eH8:آ4Ʃt 3Dԟ%/'I>)tOPu%0@<>I{{ )@}ӯ A> AoJ\ƀ*[~| $<9?/I%QnTI$$I)I$JRI$1<?][D%cYW][]ol@hkmůp0AGuf:=)QfIat3}omXi`IUH4^3s!}^wukI&XO٫O(`۩uߗpkT50v1`Ou}k[պXmUHkGOxu&(ghR a'>F0x;)dcXxh콍R+I$/2I%)$IJI$Rpcd& BNSL $DJw5F>%FIJ.ԈA:jTNELOLB'@B +DGuov1=\L蹟-H| fCQn}|xM:u9ܚ7ǩ[i]/U*G8Xv<~]ʫ6̂-h!$+3:5Qqf<ʣC\{v$鿨t0Cu>{e OT5vdy l&;:7>mp^Ήw6Tk}<o}:dxY{f@npm%4JT[)6>-c k,+;X >w }^]:̜C6sH.G.ݦvאxBp4U)nY: ~Hx-qm6ͥ$x_/S_1Ht }+=&\I@J>;N=s-hqӸq>}I@XE^];UXX6O*ؖњMg +n59uXэEʽ]%SHs3a +"!hM=R"* ;;O#S^3~/?*Md+hen>ӍHui?2 `h*)yZhbO43N3ZcQy%`H戮c3 A<4tr:x)$R=9i:'RRA>ФH% Awܤ0@:;`'{AHN O@72>R{8B@Jrc$#*0H:9%(& ݼmׄx574(9IFZD4Ӻ?bVõ O] !-3L@5ugR#S wbIM.c@ѷp\0FChtgO;w)vL%(ꣴO*@'H1 B!M 3*2eHВ8%(NI D'#JZ5DHJ@DJ"CtILSIDQ7p ~X`UzN1,ikm;:s&=Az{ V4:;@'g5ƾrҷYĬ[`e8D⧺=ICik13 j8ALF dri '.|"!-vJd@cNAi]9QqjsO OyILL#~*0H!ZLq vILIw9thy愈b Kv%(Nܐ `IIK9SCI 4 h{|RR?1tO04~p-D|wv#k%*GN` j`X~MDIK3LK|F3uȄa~O6I*KrI$)$IJI$RI$:)56}^3aI]5꽛'_FCX6?A^oս0'Ѳ5>5Qzςs!Z?)i O +D ⒑Q0D;ʃ? +` 澹(3g @tb"7 y>Wq->=hn`3M +:H| +2n2@v\0y}k7>EQTƃ~\ LIH`Mi <@N@m8. ;n~I_o(.'@V~sn;k9 n}Kju}c_c`XfDkx4ϞdٺֆW&~Jk{@o=r'оΣ U>džvAP]̺'f^sHvߵ? ka:ƈy %--Ƶ㴗1޷*fhk+ıqg͐8Gۛe›:CMnc\p٨w#tJʩQYܦvVưaw#ɾ>B w6準`7+Ux[/$c`],eXߥ6oLJѫ*܆.tEmyv掠^a )ك湵V׹H耋:+[.-v#oʪ0v0c#}ڽCn<vn"\I_D Mdo.ktx?2Ӻƞ-l|TlyhU-)szTNQu f0m,{`-zTZc\kw06Snc +u#q9~DN,N;O_uOfPzvoRnN׍>߂gE4_)/k]<߀DUFS9Ǭ澰U['iq~ /ې:$N%ҏ:ֵ +㳯o$;uY]D[8m?ְ{w4r RC*ay8[ 3 ; #AqH<&RaOt)`]Hit DQR.rMq)\{%.,Fԥ$~y >)H쒕=)Hl ys@>4N$ L j +^]x$1QPHc(G#_h0?*bLϚaHD|2R|@IKny0 )K$$b ÂJ\9 fĻ Pry!-yrv_$Jܩ$I +I$RI$I%)Em5ֹ^$y;RUsq0(9vqIn<BfB88Q"WmۛXqO|Y3,&6#l s+ @h1? AƄt ԥK/0]n&6aGϩ?tx]? G +IԸK'IKdc<cQXoVTK hqFbNa2;r Y!^}I&9*I$RI$I%)$IM| &OM u[HuHi?:RR>IA 95?4u +&|T:+CP"gTx@I, LW;n ]ϰ׀_FKA[.fAqxp3.sXCI 4꡻=5ⷍtF{riIz8A->/Lm R׍Fs܁@*txIݥ;C'B6HlG[1iŬ8tkg#;܉PYgt{uB&Tӱ5GN}&INx}^ָ7=mnmc=X6~7SΝsn50;y8hd"Bsƫ*V@ی͵?E=9z=8YŒG0o-k{^Q~cΥ "7=Yi:e8`[( áKuѫy~VuSV]νݻoo#  +_>YCXw5WCHJ\:K}&evvFVα{X6e SAVۨ>\+ʸ ɧvUtP<NwR9 4'f& wwIK `!ƀ0$rS %8B;)߲ +P tQlw$}ڟJ\Oa8 h?|AZBJ)A)Joc]k$%JI((NJ4hrk h[0R ʯwʮ>(h-Ҙ4ʤ~t`W)G ;tJw~9i(Ξ?iB¨)~tnP?[8R.☴vYy!wH9phAApmXcYǥvVWPϑ׳z p3$^An-e#+N^,>tYk-;`;#uLm`CX!$" +qicYDnU +X9iNotn Z$VoG|6Z sG2(d9>8cA$I(bxe>& 'q=$4b# ~ +B8#IK=@ %?s3L D{%v0{%#{I:94ɎBJPӁrcA|$[RG +JXjxJAckш)m$Ox )Z!D)i&]RRΣ-$xR*$Lk0HHh3q$U>I$HRI$I$$I)f^A"$'O^rݓ{kF 4L,{k`AG{|W!6?;~FU>Mo.;xBpR:6}Z_vCAopMZp0AGu׿P L:i5yS1ܯCNhQ}C^[yḩK4.nlt1y똥 +\ـE|@$zHԴq~5G.#)$LqԒI$$I)I$Jlοw Lg~IJ$<'U *DhI4*`@~n"r$Ұ:uچP&..et7WX2[*{cz&1K36Pkq quԵxϊ~ ++nnx.5M ~4:k1,!a:+Ahp~<ֽ2[cƬփ7Cn} ^gkKj;lIoqeE/Y"lȥ9ͺmo:yد3,m2~=`N͝YY-7uN[z~[Co[moS2転zn.C}&MawσU-OڻPOioGCN'^R-0i2R }wjuQX @%K=tC[)!ZZ;H$h;4[0I(1q @Qcdzxڏ=AO>\f79w?4ۼݿm^ }grnEt » XOݮu_~cW*-CHP5QWb>1-52p>hXخ?{.sv/ 5db=wk%7k\אYqN,m="})ժӈ cIx"~g4gb/Kk1}%\e5k:^?dȮ@kXZt#,GOnuR^:rEs- A"?V?r׮ƞ'S[rhpWO3wzN?Z_S{RsH ͏$q0J q|Tattl{PIH[O/Lng 74i^ZF*U?}jbc5T}Nɤ*U- iSG'mLfkDx2:|tju.5T`*щ~6Q"tU{tRb\~KX: XVD~"ӲAY<xtqABw y2?T[<_9/%2p1.8=6ӡxhoo?$~ )DNZa.FO1%/{mI;Bh'0d>nCb4'?H4N j5mLL"Z<?D))~u^Ah)CcbK>'p)˻#˅4H8gtELrDڥ{*$q +%}|B[0?'I$GϥRI$I$$I)I$J|YK+mcMZ{cac?/.f絍'\vW(O=gtbul,= p&<՘=+c55>вX Hs>k׺gG{cX ^B>yش~ 9CΏ49ƨ9H#`C?Z:H}ZX"?KGۗi$z~gי֜+EKx$SqZQs0ܸ,{U}n-{\ \w^̼V^ԎnӀ{)$PʒI$I%)$IM -"H$ +O; 4&OoPyI+ZDyIJ2ӄO)O Ą:ߌ@>ixILN'Ĭ&ze'5GJ IfOŎ~U 8r7'{z[[i$v+'wTlK^ +3lR25_HkcQJCEɧvQ48A6资KIWzLyקc7!·4 =&q:WLnm/p rjCO΁G_\vSs;w  >@a\n4\CKۻo;tskGV;?Θ;}m8~2:;8<~\$d$ 8FRy4vhSd\qB ]0SjKIO TS h$@0SO%(OdۍkɦQu.e ^GO C\Z~M*ws^nc'dPS7~So}eH (ManXYa[^DvFVY[ +`n\ NV'ى,Tؖ7q?cCZjup${mOW{u>Ks ;GT:zDhK_'fX sHp>,}&\sv6c܉eTX4;@NsZ+ǩmiݠ]aO 먒?woh8H~°`"If9?ՄaLjGg4]|UOErI#N>iBaq'$ 4NdJ]11Tv  8 +mJHxjJt\  N w%3h&@0I%89:QS(Rw +:$)4p%jg3?'KQ$RNJD6}{ @EKt:}Hq$ )9U./#W܀~pgϢGvSӾޝo=ł t+i&^{u3,2')Cn?W@_aDPu; ]aS`iRgԝ2z0!{P2hl62/q۔ۉ.qϤ3ahaGWt)=J8g3q!Fa hɂ +g$hn6I?a<^w&&'3#L&Zn`l{o+&>ФM4;xG۟A1_TOv10\L\OnT'wHS?Yt??A*W }7}$o`.ZO0d+!I#h(tG.tLBAğ@#91jﮟX '$thXx$FS`ܤ~q^qij O('oE$I]KHbf{/}?#B23\4Sk-_%-MJ6t?RBx8n4)OxB}$"JQ׉0ݻc$$@2H +@A @n JX"OIJ4f5JJP$%E"ΡĞӹ 9=RRI$HRI$I$$I)&;V.O,}f'PX>^WWUa٣IX 'N5 ˳1/ȳxY Rs!)$&Z6׻ݹghfFe-5u7osM!w f !VO u/QҨ]X;;m,mҼnsk(ZF'R-.e \O*XF,칞~n~d?uu1 <-5;qdc$p!;>@L:rQB}HƀŠH}S#HG<%'NS + +W'P ׺R'Աܝikc&}I._5kIZ;9]:2oe=&ڍUlrGƧshth">ŭ۴Sfs܂Gk,nCe6^| +}G};:}-}ٲǗo H$:8FpM{ ";-7ԨAoRM!˷_cwz}m]gMN.mLDzlU9-oc"j*Lz={ (mƸm0(f M"Os# +] Y0?Sp6I2XT }u[@ӱClcHGd=."<#dݐ x lQXhÒf{c c=!:¸4*6ϊ-~h:(8#p(%p@N`k )R _S:cٓdVi 0$~9所~RI$$IJI$RI$I%6Di uu :Iܜ$<옎O>R";"b||׺J[Dd9 .B,/ .u} lTCiگwZ]L{CcxnZ}oc[sh5Z:lF9PoǻX@v7m^nwk~=ֵ[CmYe`x: Xnm?,[ *uZcw 5Ff=D[N^N{^77edmn|`۳ղNLݷYelϵVS@5('g$ i*DDς:#㼐f% L[$j;Ԏ$4$iALʙhxJLuHEL]'Q0G-{$@Jpsܤ PKsIiitA.>Zn c/dYcRĚZN⃙v#㜱vC{Ϣګu MRk_Cras ޙV~Es{ijx`odd[룩4cߴ=f]>n{rq}[L~>-K%pP{- XImo -Q"SfMU06KIkxa>;OzRK@'GyWAN!0Lw\`APA?*B`2]ؘ>?AL}ݥHˆ'fLJf8)4x;„HDGQRv5‹d&JHNPS x!)gY)ԉ D?"*WӱS# )i'K_"u?_"Zqd<*d|#E>_ֱW\8@-7}yʑgfu(L,knUnu +쮢D}RoFDq=N.cEgR:01ivT@ :gB6HL =Z#T$Ey4ԤѦT?V> \kӶ.=?Wr>=kH'oE'Gd9%~`:;Hw)jYwJA2G6[S7'64,)+Tt K?ޛۙaw$TN+Pt&sa%.ӵeVЭ|;+ ,!_-tf9N:~zM֓P6e5vGk>಺hdiet|\N:DHII #h:|TwNa6)@:"D)@#I>2ALZJ J4'!,A$x~IG;]$OAJ$O'?$LDJϒ*Q>|Iy):搞J +T_}NCIჍJJ\Ni'WDEMTrGQkϱ|{C6QwMva~N +I$}-ʒI$I%)TNojWs(?}#NϦ߈L~) +GI%QRI$$I)I$JRI$I$$I)I$Jm?(& k NvcTO)|N ~ %DM^ BJcr6~q{r㸓X1[c >T55Ųd❺A}odwӐ[, z 6N-p.uo\:j9)#_4ϯ(5,`;㷘NrHak9VL)ʲ^jmu9ެ^{yL); ktZ\yJL4u(6;X<嶑axjd +  <g65 gcU찗iCu^b:885ǧv%+eed2km,-n+gj^Ip[smlsCCrc!잏gORz6wVOũcZ[8pp# bzk]Uc =]GYum㜇5TCm M!k.sI"~~D(Ae3Z77+ٷ ՍT5pmc?{re'V;6A?o_'"VڱƇ\SA6LjU؝6? 1sZuu'U "ti)5#)) HOomTZd?>꒙{F ڏ< +⒕α䥩?r| ?T!-N$ : %%+BL]'Jb :H0#M T=2uw@u /.4[\??Y0CxoZ_ugCSIW-HN~~~A׈Pw_'PrF.$ 䑩Ekx[MSG,N*)L([h<8<#BTOPpr\Uh~);*MX;IC$ɔ6ַ{ޣ)0QS-]J` b?K8xt9%/ 5ѵoY"5 >#8ClH L7i;KCτIR{nEK?`ADhgDŭb#J^BhQ d9@ M‰&u1 Jg$&Ao8tAIL"=tԁlj)I<I2<1sqq$IDH䢥 ?FI3##D۠6 AQ$N@>%.Ed>L}nr4yE>HKfgݗ$Jܩ$I +I$RN${ +u'7 PRSчw?a2_W{QEۿp&{Q矃^_Wp^{+ _?KKڏe?}| #_׿՘&65u~xՅJ,p9`aOTI(5$I)I$JRI$ByhuJG@º:RYROH:%tKX2uHRJ }RΉ6$ (*ԃB-Mķn5v+ɧ.G0[}9mmc"fqsdw\Iu'ײZp$ &`W԰ډy%=8qIٱćڑ{ qOپqt~~IpXLfUcC8 o3OKkߌTrk,灳FeanDCGt~ni7s}7 ϻ" +l6q2ms̺j*!\(:ANC%O\QqiirV+00ōx-[r\%VTmluˮg3)q:8"2S]C~E\co( +c`iZ6 LkweKk gN;Gh)15Xṱ k3&o[[ nn[ט#Y#2ro5]F'ԲcN%Ï5<<;rhΰhM%x 6tu3!*5_v Gr;:>d:ǹ}#C(5iApy$1 KѱoF|e+-Yb4'YO#E:\l@A5g$'8#U'WDx< AQ)NwRkn1SX%2xJH4QЀ$Jf >) T1Ei8qJfәLO0~E G?B*d$ğH'C +PIḱ nLZD4'JfcRyOL)+>250 հ&glwUqwxf6upL> + 51xH@ܚG?S#菼jw] +!;ja;$Dii~3SkLwH24 n<Μ [:R.:ljFH̤[1抔؝ +c H o1O$Q-! <% IJ"ZdQ@ #O(`gT2F5ѫ Ȓ vW۶;Oiهg'e8i$*I$BI$S9^_Icta7ǝ2w}#I\W;4wտ?Ϸ&b\9?ėoM/oɥE_ܟbKwտ?Ϸ&pEOG|_X^qeb[S-2 8rTy$$tq/ \qGI1RI$I$$I)wHm|A@OĩI[ݡ5e[vnH.unBlڬc27i OIWN=t*n^5uG4bRtf= w՜Ɠ7&Pq??PO`ho0yO*x`e\ nm{t/ Ӝ2p`?F!_otQ- K+tVލ\Q<wƽ҇Hh6h G:vNl^O}y}#C(?UnS[U?u57ۋ4kIBvj1D- 2 Z v۠>JI1<q]qw`h!D8))~w -xt̕w$;rA b3i$BInqH ,C"&dH' Q?SH>i6t4R铦EJ$I*I$R$R=RI$I%60@9 U ӀyaJ'-IR<\$N%ǰH +TI w#Adq䒙k:&-=1sIJJ_^Hmg_ԥ >6eRS!I $5S"I㷚E ĝ))}ğJ0Io蘴}"\JgƿrCh {_?r =(-3)l3DIT|[$I!I$JR/oAVN${ +Qݱ0~?G❟Mt<ӸV=ԒI*旚I$)$IJI$RI$I%)$IJI$Sp% ??%uuϐM!8Z/$(iO$i┏-g䒖J<-a$ T:IwƪWhwJ#~$̟)|򞡕ӲF#\6Jþed>u^`6Ɵ5x; +`q|ThH_T2]l.e᠖46@p]R}6];kac luN"Ǘ609Sكssܶ}Ju> }a\ENs͂ W+? +Cꋨ {.'e=u[]xItwb@պdAhI0d OO'1e{+ۏXi.okhF:^2+˫/{qUM?I) S,GWazUmom{3?T鸯WwSKk78`sۓf]C#Ңs1:UٺZ'4h/]c^ֿGh)$5^s:,oB˜ϲmgg!^` L$Or$/ESof?OoQ.ie;nWSU:}ؔ՗KɳmVv7}T:ExϿ8ͱZ+udVa]|}WtOW2ݲ%eĻ'k/yyݽۜ[^%_ΘOM 9ůsEX9Wc)ZL=eUYCr`9lrzmuLFFMl1 NoZlu{_SX浮Rmw[)iip[H~||.d oQV}`== @W42ﱛd=<>@0opטW.X~;`CYwwnDB]S:\v㺹k-ϯ/k>p598}'6D91>ߏVnaĝck)ê147=#cuo\ #%i= m+_e>|57sNroM3)[P7='oia +cR_׺8cT]tu LFSZe= +nճ2*,j45WxN=TtUf^a{ՙƼ8ybfaUU/meེ}n `Z:@EF 7kh#Xh5I@`ӺC0;qN"5 +@H!%. F ̷"ϒpFkI\ AGS@2>I@ԓ%/Rk]DkuDa%2h R'LNli$q̧#२IEKmF'40gD3J^&x&S{y? @'tGuG)`HSH"iRH({j5#Jo˄^\;[ETOaW#` tm]v$r{`M`B$:$;E<)}S옂9)$I*O$ )rЍRLxI:))DjGI$I$$\$$RRI$43'Q3䌖/1 oytDSɑ"nq:;'|+?5 L$tD<QaJ\ƿGS{ ǎR(}HiOwbG1u]R4H'I􆩈op4%AԀA:4A&I y A|HH$gCI%.@F{%Ή="A>$vIJ$DΝtCGI$S-<{D|L  @ b,=uA|$L}>䥳3OqI%QnTI$$I)J.c^Ǵ9 ة$H5?cm3?VK}=?Uv3[8Ofw'I+^SxXG>yt`N͞K|7rI/#o_n?o_n?s=R'R@JIP7Ih;%B@7/`I )r8~Ò`пU8Y+DRW1&^XLYnַ{CX85ǰYk^Nr>jEǹ>q11uU]hk ,|˼aYظaiƦkapxȺY;:[3ױtbSy +Vd?sݼDޯ '2,2ZN~AuF}2(ɰ>]Zr>O3$a?,cNw0ŐK2:~OkuqcA/g^#k\/8bfznV)w]1b5%_[#쐊JoN;x›/kM@yvmcf^fSqݒ(4sa.j-B扄gkᳩ?JFX=_6]'ޭRI`4ܰ?;6bF ]:΄Jo/@lcefCw7VMi}C'6WX̙&4Eèn0@uQA1Y~~ ]UY5^1C;Q+:c,éP cW^K#MO..di +.@@3"Kt=6֋@$Dp|VgOMh#ZM@0Gd SyTZD)= +P旘?KMS gNK 1<%: {|1nMyd뢛\;$JIjt*@ j!>% }<n(ڙg̟QGRqIJq@@@z*\ю{BAגM|R-'@>%%.Ԩ{(S?X:|Ь4uADs(++$1Hz&˝v$@Gf9 +r[[IR2|Ri"c蝿9ȩ^$Q ( EA2t#"FF)[h\ @" G-Rҟpxꔂ5$))["\HLvđ!6IJ$$\{LCNNhhJ_p<>1}LiryITlGtG  + HHFyE}@3dIU|[$I!I$JRI$I$ԍUt:Y4H#ױG []tɕ=a%Zv8Ô#X/񅕧^S+W}^]X&5ָO`jv|Z]Q?Ig+)p,c/y$܊?Kr(}wcIrW=s>Ș=C\ nQe Nǹ9rpRI$pTI$$I)I$Jnk<'$%W_GTa.5o!KG %ZKNKZ$ nCݴ"*RtkBu>P*ņ%8-iV~EueIm +O#,ޘ1FC_4r + ]K9y}G{!u10ݎK٩m56b?NK:}v+~CMSUc-mL襍D! uRz GrS&f!3$v2D)vj;iS}zTJ2lWq>2|0HOMh\\:J%9 rt)u@k DŽ"RC&ĒTI$$I)II)I$JRI$I$$I)I$Jl`IfWVz<KdJ߫:R:; P]4=(HBc@#QX:$ݿI" II[4 +@΀!ݔhEL̂$D-5>x ;hh'k$2 xiƽgp%. tCkI{t5}=xN1MZ'%(s[];R.b!-? DǘJI<Ri?p@JZG$iw*9wlP,ZgYiهg'e8$*I$BI$I%)$IO!u˽!;$A$/T_XgKbgV=Z{KI,yUwLvk?+XO-9bu61E> 1 ]%~?wӍ۟ݼ9Kqy_G:Gԓ.XLD+}h~s c}HȐC&!G$a{TM^F95yܻ4|K_nm8 m{Y X(W{䤒II$I%)$IMIju' HHe]}Q$۔"g䔎I*A.RT@IK y'H#)<3))쒖">jtp> `pi]7dct*iîˍ9ٸZ|#p,:[0[Ѷ3Akf& ϻrk?sd5yV]zQȧ̧vMf1pqbt , mtW1DzHaUCOd+9xGݏf]o}F8}E]C%XnՕmi/^}{裐 %/@g>'HuV;=:GT]_BZO wgư蓸?c?Oe7a\3ʮu^M]Z"z,pﭮ0u\Gu.q/s*}}0LO}bgqkKM˼lk}g2]S%_O.KȹVeV.ݯrV^]U;oo*?)1,v)k\}V= XCDV_鵄uoxhtZExki֏g|g5mq oʟQ_= +YdY9r#d^D/m fIx;r:oNn_M4Zk/|]}bMB=Up;O2`98(Pm[h `{5CA׺LA\kd=ȩY ZX]n!'|@})!29hxߞ抲sj P.jSs62Ӑ\]Vpb~+[f>>;W͓C_O=W]gZj>몝Jtkc~Y2e5+#wowtfSD 꽕YKr{\?!W vmP,vʣsN֗ V{ |"@7V6Wq>V-HUmuVv畋m6I?Y(Ct8I`Z=d5N}6f$@jE;$e8GiH<ނ3_$5I*$} | R*;I44RÓCk$0<))(A$(;BBJd$N@F 4JLC(җǍ %1` +I@"2F>c=%9tOLj\0H>iutp40Omv;IK-%j}^?az_H_6'χJI$o:I%)$IJI$StH O0~Wiuw<Ɯ8 %R|R:!;A#CDNk>5T~ HZ p(&dZ&5";vh",3[W:{rsGٮ܌oCf9k}(}Sޞ2_MVTW546d.&IeTw4GZ4}d7]I5k?)@<@||Z@8<rqmKqCV/P]SRiknM ]G,ۧ .جڋ=n[}H[]M%<@=/Gkp+n9;vJz5z,kt㻓Y# +!]z,xk_̴mk2_S -^_qW[=T>pS.v&M:h8XÛpN=X>Hl}TOv]/]c{@ٽ -KWU]ah;8mE?ZXoU KL^(n )>zYeya+>{;Em>2xA#Qpy?itgt>K65dB^7~ )[HQDmkK$I"JRI$I$Lqc Nqs.2JRI=IJI$RI$I%7zWzgղ1h>k_<@^x; ܈ZueHf.3@IСiAXp q6쒙re'nz{|S##Sǒ}džPRÃb:'>2 )m…ikL@ +e$Ѵ><9?/I$WϥRI$I$$I)I$JRI,p0弃$AD gÈJGKcP}<9C\mGb@c?ȯ+ӽnD^%_?K^+/?$oWF=ױIvڡ(_r1<_I5I%)$IJI$Suk4).Oe/BGt"G09I*{ޞ'Qe$,IShjJ8FNLhRolaZhYcCuG~leɱR  +qGu} 90<*g[3&-{٘Cu'e[qkX 550u1W[eݿGͪ3]٭^m pt~w]Q8dtٲ>ۃgsz]xۭ ˈj;6-}{ꤍŌKݖ/Nީn}؝/2!ۊ6;n67^]XZt-IU:YvMV2=8˝$[KHl~it kzG7c 7}c~3^n e͘U,VYY.=5dhEi!kH=X\f^rg}WsNVm'1E“EV{w]J\W\qEoR_ ]SgCi 쮿XA4! t/J>f;Cn }P#n9#칿,}:R +!GsA«KI'wwuxt?-I?Wv=%]X"oA?v9S :aWlb:_pubh>xl6OL} ^j{Oc^ɓ0Я:VM_U:FIpv kzis.1"?WtE1U=I߲r[:W&v}ut߯_ևb͆Ts1z$?>-usgNޝDZDPʙc,7nǷ_?%ka#H TK+1?tOޝ +E蠜JH26[5\F$Y0LG8$H0i=> ƐIOuA|%Ν&$wӺ@%2hfdL8A$Qn;6a# )i:6Eܜ:fA?$IѦ#T1ڨ'䊕֞JoiTT I=h45&8("A%1 ̨HS;ƒIO?٥+^hxHzQ2A׶; 0c1$vH-i Ja&tSi#y$&@M:򒒵g5FY>%%3nL'(' II:#@xdd())Rq)F_>T[A&gIKGHx'ө~g]Rn^H:Z&tgY⒕LJD!tJO;bcLA"O~ )q&I2yM)I$HRI$I$$I)OKi{KjpІcpt^dI<}~e^w:F9Ϗ?gj/q^8H=Y=r'-#R +dAI'?rd\ ֗}Z-u~5OeKw4"N^ O1rByq&2ጸEI$甒I$$I)I$Jn<xu '%N$RRS|IJ#NkβDB2$$ @Iׅ:4h HG:->N*D8u.bo媩 + q#c.NׇQh"4'AGL0HVltNỏ\΢#(Y,,unZL6u#2Xx;4xne;+fӮOujÜw_ڄMJu]&;کjzͭSpqr콹d;Jw*QW/W-Ͳ=㴰`Zqma/p..tR$eZC64vK:j#Ezi7.]VX%GzL-%>S]7Ŗm'm}=:CN|! gcV@o7c,v^̼PE95Y|'uT}XnmvCxы[k{WV]Ѻ;23܌PG6&4|sX6.x6Tk}u<=<_Usi kIkK{IV*1 +a.(yYo\Θo֕OP\e޵ć]=?Uf%f5l?޹ɩtFmHd b7EF 4MnN4Cx.u= ?cU"L>~J;Lw,v9ªs,!x~ۓ6cT .mn k@:tG"1tnhv>f<)8!DØ;NMX4O8ѷp>4uhI$|VI!&H웎AG)΁6$Ο83ԟ4̤{蒙F"4% p4Di D蒙 j5S|xP {骐#]q( I +IL"t(QϒhNPd%,5e 4}<@)ILҔԦu? GǼc)=S%D_NIQvINֱ=%ڀBW2&&|^OKyW$I>|&.Q!Ξma´Xd%O.=O:"I$I%)$IJI$RI$q~ ݮ#%,I$$I)I$JotP4^|^g΁4(\G}u65vBF$JIL5=L I@k$wSihIIZH>@p5! e9bR@dB@Pl"xN`$Gh κLK&3IIJ/~HWoX:m l &هg'e9$*I$BI$I%)$IOu&O¿՝ұq$2kckG(O'&l+0@0Zd:rGʂy,f_y>~v>n>K`e8${ʸWW3'pq ߽/F0@Y: 8&;Ą?ޕE.v]cH&xн66'M.H%,nRzIZ{`/œ\%`Ӈ yWnN[ѱ10A^QRbG:W-Zdqd@!Af/O¼9 ngw yn}"{zknkZT7[\.eenM}/| wU>HzQtnyhoq7&Krh.l|-)bƊ-1ݻݦ@hJD4S !|,8iGv6+sPƸm$¦%ND0O- +`%]eZoζqqz@ =gC3K+r5:Є0Vchfm4L&yQr|52dD@Ѕ& HIK3Dc-O"Jd"PbH꒙ܤKc*;x$hH^{JdMR$#tpJV)9Jl׺*_;pH|OH D">IwJH<% R%2 qIJ'XC" j&x(D~)o$jI$v~GG;l&^ꢟp9+4 VO#֎EqJ@iǔJI$I%)$IJI$RI$18LJRJma!HoIJI$R $S#?%}^iGzgB'u& k5ǃ2R6T=RRF5P`=œL=S8`F@5#G_4"^#o4ȔxBJbKd!$JpDnv b$H4` }<$>iBa%*O  ObѤ4(}В#@ |LpJ?5JtJ^dbH4 `Є ϒO:Nƀ]8kfgݗ$Jܩ$I +I$RI$I%18ex\|{:;la-p Y9r,utK Iv $r|Ue\̅K̾t۳6V+m Auq Pg2ece)_I$TI$$I)I$Jn5)?$v$!)AdwIJ i1 D;FԟF$@b8 'o.9 RRB (}]fnamKZU͸Ax +{!rz1ѺA+G9UkOX[M.g] )JJ- ;ϹY@@ +p  <A*&@iO))3%,@>i=ƞ A  $ (fĈT'Snu"D |d|S cE%1 >~P)pF_姿L$3#M ?pRW\5k>kh8GgR(O3 Li{G05YyqKPCb::J<E+$I)I$JRI$I$$I)I$J\` n"cE6 $ )8ɓԨ$I)ϟzWDby$kۣ 0{Et;iCy"QR4ੴ[$(ND )L|(po*`5 xJH 8u< %/8'I vT=R&N8>D|RĈϚm8n2tq1$I$N; {ܟqJT7H$gOu|R4G `>](p?JIۘܒHQ!Ǵ'2`r=,~L8|Tߜl.4v vb~NrI${-ʒI$I%)$\pkZ%Ęw$$NJ펓sqz%9Y.,ȪIkאxkTYfQ)l*simGvc+qUN0Cl{XH=DŽ?'۬@;LXɀF)MiGൟS1$etBkLl֐Lftk5B"zcN* ri`=T=a#|LA0}ns}<>jmp6-zlwY@A>=@X\'e<;] +ѤHt7+kFA HGdc%$ay#NpH=TmLșEBAqħhbgPf.8 E#!(BQis))Z}(܄'S`JP ka8tGJ\IMl$xJJfaH83[> +aJ A> )j?KJ}<};QR y/p8)p%RRD$AJfKG-O&QRȃ] G}RĂN ;(LIN[qwMH |u87+rc'Yt vaFӻX 7HqZxp;sU>LQJ$JRI$I$$I)I$JRI$I$$I)I$JtDI!zgG3Ǚ z+fA] D~ n4$yDh@a 䁥󏞈hD{J#AhT uSivCi@D8"9L8?"240!<`هg'e9$*I$BI$S9^_Icta7ˌJ'dkֹ3]g2?]jBq!?1?\WY1?LWb|;LJ)I)On/'ĥ$K?5?+ ג}^?azگp?%$J7RI$I$$I)$vNOmѧQBR{ '%$(\4 OS@R8Jү8' sʌe<))Gv}=ҒDR$[3IN`&RB7~riFoD` &4HGIMyIk.k4I;\NEhUT=P NM`&d` +eCtPm AӪN;O:AsViKGpVjc?9ZӮ0㲸 {"<4$wQtVW^Y*[ǥ R6s7)dЪtUø<'s HP][vIGEhSv6H.*XdO)!}9OJ sH4IK<.Jn H Id< &T I SL$p=!D{))v'~0N@(G:: 4M]>iOaJ\2N;"L |RR1ˣ-HמkT%4'$u)ZG7/-x&~:/Q&pJ (!0*YR\C J\Z)uCǺ}BĨhI"IRI$I$$I)I$JRI$VC\DxDsauE^H)$$I)I$Juz ( H Lv^gHzwKd +q@#GTZB "RK&5<Ĩ4L%2 J`8vLRi$Rt*@恩KtS O"f +2IԁI Z3䒙`|tM&cS'ςJe3ο4$sJ1̟&{$FM G\ hMw쒖 :-y1PsuiasHA7]HHKo'0C(VW:009@$cg~L"R!$#ICg]2IqO?Kyo{?_?߿5$) O}#"q}/k,2&I$ 'v3A)HI RI$I$$I)yP&Pd򮾎rQ<~EH0c@SCDH !yL 蘂{'#D$ NK)R=`G)H> txILOi +&QL{Xx&RYDe1tTQ#C1{E""ѲuV%\)Uؖ{dVڷm nHnK̎\<}.F\%,c+C]s7GfD9ѫ4r$S ÅKumlorM RҫSDzϠNgHΜ kk'P =5Ėtv[Cpi$ݔ qV'֎`.&-tWQeoicڮ,VV7uec6("%0zN-'!qah% p!Ĉ$qyFf]x̵̦Xmk;i5vѡ$J@9k Kl bôRfFE usIV@cI-wGSyCƒDy[A4RK/LxwG ~P䊚)zq@h 蒬k!z%myMMIIq@Oμj91)! 1='tph #M9N 5IKD'Hpێ)B'COyL\#T 13Gq>HAK!8<n ˷yiE 'R5 @<IK`Ȕ"` D I$I04qH@#K$<:%)m 4@"A $ +T?Z;pkA%z?W҂cai>|9sMZLPt*os\xjcGz9nI*=2OQ2I$I%)$IJI$RI$I%)$IJI$RI$tIrH ^ 5^[l Ob}^]tP!GG q y xY4Ӳ+Cb||P"L#gMe%2 &FD> +@ 蒙0d@$I: |$|R-$6XIJ#mq Q,pIJНA*6@x9^g.OW^j+Գޗ?zJJuhve?ޗ?zIRvtF" ֗}^?azگp_%$J7RI$I$$I)#/I #X]}}RyO&9I*"GD@#&|RC J@鵉:$%.'ǺN')" +JP# E&$蒙ᢉ'GB;I*R;TVŅHըoX 4]V]`0~ 脳c "?+[2{}<ͰGKu?,kfz>T|-bt?c8WÝQ:d?Vق-r|<|TеI +$ ~H.`$GYgBk}+5 74F! 6#iR(=DkOnR:ĤLDV4P|BuIIAHA@y )P|8Rk%DyH )@T'gE #YIK"N&7D"\Dʐ"N )qr=LGr ?%."aKLsmB~T▲ӐJ^1RRy'DB @ΞIˀyEJOS'pLq4 Z} t^{B}y6ö8j!5\B? ul47We4aDe +e7M{klc D7ZyJWX[ ޳V?aVQ"ojk{!/zԾy$f{֑D*2RxhwA.ʬx.S?em'_+-ntL{MGf6{xR]%!h%x4|ߨ/Br>\HI $^ xWx qq:A IQkKghʍȷJ%Xa%tOmnE̙iy :1IpIVZ=4P}Ki$.s[_\A}{󙅛KM.C@FTR8$hξaN5ID|8N4=G-%3w/0x DŽĐHIJ#<&䒓)1'2&R?< +Tw&La"D'q:䒔d 0v&69= (=kA3Oj$Jܩ$I +I$RI$I%>kֻ!,ena""AΐEv^3: .304Vq{f^Sa/tw\Ye8xa{t'c[|ymmE.Ωe]^_qEIO|_13~]GWڿ?Kj_v!KO9?c 6z6͞NDw+I$Hڼ;#ޗD%$H5TI$$I)I$Jn IҐgEuFD($xjЎ<]R8$J D{' G4$ KB@!1䗷MxI+juDQ1))B{:|#p4|SPD>  +iRؕ}gi6!WlPw>G`XE$m.׈hТ}t9.,dZo;e<|]>ZˢzY r]T9Vi=['&9YU$V[3(no+cĔ$U6y{̨qp;IJOdRIeE$%k}Wqkd-o2:1X@2ATAM&NΊ@w)! =!$RS1$A4N)h$s$NKtt4RH$$f$LB# 5'*8 Ih`=R#tALL|gx>)|;ΰ )yƓHԨ"dq))}'\T[)H?b5HjR ƾ)t3):)BJTkƪyE0c([\Dv@3$*I$BI$ 띍~C/K\'oduS^ݟlq;JQ,N ^_?=J.L#IYѼ}X?'U#_;ܜ2aݲC?JyqEZ|'>[|__t 5Oo-:i<-VkC_U-^Zq>'\F;e9|cpuOG҉?=J.M$=vbF#=L:>+衭V־@s1v~:qXE8a!%|I$n +I$I%)$IMٍ^_!!#!]}~ڙM:R#T{Ja=O#GO )%qȁ F t쒗k'8$$:dOm`薺 )D%#DJJY0BFD|#bfx䔱 +x!L(5q'qpmĉY}p` E_L˳ge ytL{]/_~-r~ߗ9yUp07bq_h2\;}wi%w ;qW!jH]3KH>Z7\FZ_9A鸲~dWbMLO/o%[K.fqwcU!y@09^+:~EѬ +B*1~(I(35,ZO52|v`Jg)R 9IL ih2HH))%();iIL@N*-i: +M%(4IiIOX$+IT 3LD@&'S̤NIX1MYkOfSk|ϚJPӷ%"Qp0BHC)%1Fu?J)T~@@"{'@9AKJbG~ t<@b-AEAqIM\Mn>s/{ݯmMwa͟Ev;\H{Jvy9&ς韉n">C)?q j0SWF|fI!eD BA.%Yqt6y-ccfѸu&N@丕[a3hE?%nV}Lmey.%Yqhбrqy~\7wCZ_e}L{[[`lKbS$k@Β,-jp#12 #id'wyUEd;h$&avG -d'E6C@xG%DLh`GɆξ\'yE? E1n4d:uWi5: `ؗ N0u@Sޱ)6"Fwp㲒m6{ P(S= )[ juQ'%.)HDt<ӃJ^ ):8)h1y$fc +Kx'TIR]&< AKEvu#?)Ps| +fgݗI$WϥRI$I$*N[r`%QcZ$Z`;i23.''ro?zJ_twOg[o[o%2?|ouKou^^I?#g?[/ zI{GcvREZm1:[pLv^tK?>nP2 VI$\$I)I$JRI$ftB#@8Bqթ-LdN䔑·%*~itR:rO %@yMo RxIK +S=a-> !x)LH SmcJҹ INgA.Z֋97 ІŅPg=s7]շr9I^"LJe5{~zkL ÄǷa֓i8=<9٘RRxR`x;|y )oqh  yD)SS"#\|;B +V0"btIǹ@O%+P jDgU))BـDr6Zcmd8<8ABx:MAV*~^fAav?lwoK$ dS}.a$!ڠ>0ȗw!4)-<T՗O`}W7:'XntJ Ba4N>bIqIׄAV;8K]"\tl='V1M{rs0ک~ÑuЕxIO%@u +iQ 1@.ଖ'jB!H[5h]`pXAIkV*G  +3H?cI<@A2JXik=%._S$'3▧RRS JEe9#MSSH' H"Oc)@·wH 憎|@3$Jܩ$I +I$R^ra-{(p;H;LGuiTNo7lr^oqzqމWNH#G?Yǝjot=^=܌wf # Ҿ`4hC2&oO0Zg 8La)n?wtIF\IW3g|jQ߃?W)|]G9/yx HW1_X^p>))$QI$I%)$IMIN<װ/_G_T"5#2 .54:%R'OtMJmRJ;'䠁$ƑRHR >*Px(IJ"LFUO!%.`;NI2|wQ"9׺ +`w^+ǘ?vAi^Us?? 8Ę^-΄cӵ~V w?RA&jbeOH: |@OARIH#D04J_D|$tyH I$))x}?[gR$`IN&GdH4Jd;AL6 hֈ$ CbuND ~Rx){ ZGtڞ& + +SA?4h|Ȁ\O* pOM:>  S#TZ"JOd:HHyoH4$S!%RŠĨ{p2IƧ[@3N=w쒚6t!`:9!!DvHhJJX=6إ0a"A)i<᧷K@|AJ $N꜈ݢctJX̨ø|T|4NyRRx*$P-T!k%D"8*;b4I,`hIrh:f"8MAĤ' G+ <IIm4 MQ@6D!A?04 )SHD'PS FLDdRp"IMIJ\8IKs`"B} RR2S|dr))Qư\LJs&1IKDmԎRH0RRK|qD"~ht TI㺔qLG`u쒘΁R{xIKA{`:BpINRهg'e5I%QnTI$$I)JWs[U:)Gv)o;dG@W@_*fF y̵GBв6Q}oM{^?o0A92Hc(H} Wcyљlqf'C؝eyy89 yi_y^?YBjoO0dZ_ 8LaXcyƯ,+o7?$Ko WV$-ۆdII$TI$$I)I$Jn&<'IN$:Sx&: p"~i)-&YH )`y-}yjITDN-RRʔ);RR"y)7JAӂ: R_PN"IJD! iঐ:Yf{hf}T xm?Cϭ`\gBW1?*u +>Yzp +}͝Z4.iFY1)A6=X4YHpsZKL$` GZ_CN]z(EӹW}"vpMkqsƃOv̭PkxԵmc>^ʹ7IPOn% k )L ,IĤGwF :$$j{v3b>d N 8R d 4"&Tø䒕H9奠 rwDi@᨝B#w O)``sg$Jepc~ 8-RR8 OsDۄ1))0dr +DI'G~SZ +` Q4St  J|< RtƼ$H?$pPSI?rJTI"f{x(DKRt )ف +=*Z OԴ}.Q P EKimvN$<9I*<"G IO!*@L`̂`p 5E +$-5ӹQ Gi)Oo6djc)L4F/#hPpDAIHLG!i?&撑 A$@\"$Glr )Mh"#V ӄfTMwFRRF#E r$C&B#i&(m=Ԛ<D@H!(~q<28IJxK^e!K%+OJuJɟJT) +[1$w))PT${{})Zƀ%3h> C|%(HyH0gN)x2I)s |S @e|AR9Ш"هg'e I$WϥRI$I$*_ImTNo<~) =7/uqaG B.в6QѾ˩;b e[?-wg#A!W>#Oa?VTw>;Z̿dc ßyVC^.k#'+˺!c(f P~=ZN̼42lm\&vMbW˭c\Cm^Љ$B#T#+×#Rt~o WV$-mÃ>|>RRI$y$I)I$JRI$e{Z'I!1$h+?M )x ΁0"9!I_S>C? !N(9)DjyI+y$ ]$J)S4qSR2Jf!(2|I= %RL"=jPRIPyӉS2$JJyՍ<ͧ$wWRİ~m)]_֚抝3s\]-!AYGTkeCA<]WfzeZ]:\#Q<YXм=2g,OQUΉSjsa=ư9ź|>d}v7V̗5rH_?O屄VK/W܄mbP_cQ%9j3A3*n# A,uq&1=*D`t1JTƪ$C-dHtIJ4O ju.JLx$ S&D9ʛIԔɠDxyD5(p"{L̑ʞsIJi|ڝdy : T4 N8RFm`xRRGRI%,L0`ZJQ$;Iꊖ3)Π[(R`h &$v9IL\$~*Dqw$< )y 3JJjX';} s@A!%# wOxKh!$[.$QdGܑ{D iQ 8@RBp9HN\=Jǂb& i6xNx1%(4"Irc v)/6UL00^%?qF%yTy=+-عMV\Á?`^uN>@M7c#uO//k&4|%:VOJv6S!VKOqYJ6e(!'G+ ג}^?azڇ6'χJI$O:I%)$IJI$SnDiLcH*% L'CI\gNMRR))N`a0d@kI:uOMJJI\0DH%%-Dj"} y)[Iװ⑎m!-8>)|'L=9)*O?kezYfn.CtHnU&ojKVkW#wu Ώ\%ά0嫔UR87VbhS:zN~,>.Dm kÂ}X]KfgqOR_Vd7W4ZQ?McpT:-|QňFr"d@Q[XQإ(bdH3 +n@& +j ;Τ)#D#J_OxR!JJWtiXHR;xR㴨R;%.RHj$J\vA8Q$J&u R$C$&)))D@Luħ33% $O(XH电&R$SF@'RB"iI 'NݒK!1ƓʐN +`@65 9OJf$6$sA|q2?"Jf֏p +RC-Ĉװ0ryp2D)p'fuJ}ÂR&TDĤg7x'*>)Q昏)IJ&*2JLH`$(:™$:bKHIJxBiYHI)&cCJP> ' 4RΑ ~!#qէ^3O@I*KrI$)$IJI$RI$qKI$$IM.p?olC=c{?N/Xc$p1>pr?U잋Hn=XfWXh?JUHWPf}>dd7#9WXŝXG[l&9Z&iɪ=7oe>u\<*?KX+X0Zֱ+C#;YS״!MH<#P#̨H6$TE`g%ELCv~h1#RcL!'%GRPRRNLFv )@OBe)4Hi))QHPbOe6Q) FO2iO&柈# :> %D&uO 8%3#A?8@gFH05$@{ y +JT RׄƩwIK4@O"D"\4L$*^A\:Bb3⒙@Oh'撔 )x8Q&y$u5QsӲu>NqQbDyS 6jyײ#ub@p:<4MR HT`GIX~ ĝ$L(to̓J@?zicRk txԟςb`s=PBrvAA'po ;p'%)ǘLd"쓈%. S4T$`SPTx%3~*Z Qϔ6K$)>JB4 &Gp5Sl=Iq$Bt!-H ']wϜ$F~T>|Bp4>iRS:S$'uIJh4ɄBs_> +stream +xWM\E~fIĘQD=x$'<zpEW'11 J⊠BNzsI <%ΛUV{o~v&ы)4S]]uUu F4"#9%`cņ@<;`b:%c%\>jc賣ݓdoتJ$"[KRle8UN3?Ƿ(Ur%,J@UO;Gd `3sc׳AJ R U7IMCÐp%6Ma^\ڲ g v |ʧNsSWkh?p{/"8ՀWm ~`wτ%)l㧞g4cN6@wݛ +S{%Tgx<M 꿡<gN"IESFiqYE*=^+-m x i= j֨6kKɌҶD@M\n`58wW,Adq;f \@iǍ*En8ڷsCh,(z !꼣̹2 $x8bxՍWM|]~XsC_z0ĂBP +Ob3] i'y"''6ZG[ +RX?/r,#':Bap`ÇC~-/[ӭdz.L>?z3e34RdAWl;3'rl{u!2"a :ep++O>0JtAE]J\TB dem (M։զP[E_j5gs揚t)t{KKe҃ii@S¶;ar'Twܡ&6ȡ]K*pn6a3lي[vnN@=yC(0=ĉ^hLu| +O>l 髝$&G +{߆Jנ NN_U,ú*. lzFKj˒5T;=]Sxe4ܲjyy@I溶OͱD!߂!]ի㓰tQywٗHsIrj)qJK־n# /~oËlC$6s K B+룸{ J3B  %i6 &i?:}(߸zz5шF4B$ +endstream +endobj +808 0 obj +<< +/Length 2575 +/Filter /FlateDecode +/N 3 +/Alternate /DeviceRGB +>> +stream +HyTSwoɞc [5laQIBHADED2mtFOE.c}08׎8GNg9w߽'0 ֠Jb  + 2y.-;!KZ ^i"L0- @8(r;q7Ly&Qq4j|9 +V)gB0iW8#8wթ8_٥ʨQQj@&A)/g>'Kt;\ ӥ$պFZUn(4T%)뫔0C&Zi8bxEB;Pӓ̹A om?W= +x-[0}y)7ta>jT7@tܛ`q2ʀ&6ZLĄ?_yxg)˔zçLU*uSkSeO4?׸c. R ߁-25 S>ӣVd`rn~Y&+`;A4 A9=-tl`;~p Gp| [`L`< "A YA+Cb(R,*T2B- +ꇆnQt}MA0alSx k&^>0|>_',G!"F$H:R!zFQd?r 9\A&G rQ hE]a4zBgE#H *B=0HIpp0MxJ$D1D, VĭKĻYdE"EI2EBGt4MzNr!YK ?%_&#(0J:EAiQ(()ӔWT6U@P+!~mD eԴ!hӦh/']B/ҏӿ?a0nhF!X8܌kc&5S6lIa2cKMA!E#ƒdV(kel }}Cq9 +N')].uJr + wG xR^[oƜchg`>b$*~ :Eb~,m,-ݖ,Y¬*6X[ݱF=3뭷Y~dó ti zf6~`{v.Ng#{}}jc1X6fm;'_9 r:8q:˜O:ϸ8uJqnv=MmR 4 +n3ܣkGݯz=[==<=GTB(/S,]6*-W:#7*e^YDY}UjAyT`#D="b{ų+ʯ:!kJ4Gmt}uC%K7YVfFY .=b?SƕƩȺy چ k5%4m7lqlioZlG+Zz͹mzy]?uuw|"űNwW&e֥ﺱ*|j5kyݭǯg^ykEklD_p߶7Dmo꿻1ml{Mś nLl<9O[$h՛BdҞ@iءG&vVǥ8nRĩ7u\ЭD-u`ֲK³8%yhYѹJº;.! +zpg_XQKFAǿ=ȼ:ɹ8ʷ6˶5̵5͵6ζ7ϸ9к<Ѿ?DINU\dlvۀ܊ݖޢ)߯6DScs 2F[p(@Xr4Pm8Ww)Km + +endstream +endobj +809 0 obj +<< +/Subtype /TrueType +/FontDescriptor 2787 0 R +/LastChar 126 +/Widths [250 0 0 0 0 0 0 0 333 333 +0 564 250 333 250 278 500 500 500 500 +500 500 500 500 500 500 278 0 564 564 +0 0 0 722 667 667 722 0 556 0 +722 333 389 0 611 889 722 722 556 0 +667 556 611 722 722 0 722 0 611 0 +0 0 0 0 0 444 500 444 500 444 +333 500 500 278 0 500 278 778 500 500 +500 0 333 389 278 500 0 722 500 500 +0 0 0 0 541] +/BaseFont /TimesNewRomanPSMT +/FirstChar 32 +/Encoding /WinAnsiEncoding +/Type /Font +>> +endobj +810 0 obj +<< +/Subtype /TrueType +/FontDescriptor 2788 0 R +/LastChar 109 +/Widths [250 0 0 0 0 0 0 0 0 0 +0 0 0 0 250 0 500 500 500 500 +500 500 500 0 0 0 0 0 0 0 +0 0 0 0 667 0 722 0 0 0 +0 0 0 0 667 0 0 0 0 0 +722 556 667 722 0 0 722 0 0 0 +0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 833] +/BaseFont /TimesNewRomanPS-BoldMT +/FirstChar 32 +/Encoding /WinAnsiEncoding +/Type /Font +>> +endobj +811 0 obj +<< +/Subtype /Type0 +/DescendantFonts [2789 0 R] +/BaseFont /PKKFJM+SimSun +/ToUnicode 2790 0 R +/Encoding /Identity-H +/Type /Font +>> +endobj +812 0 obj +<< +/Subtype /Type0 +/DescendantFonts [2791 0 R] +/BaseFont /PKKFMO+LiSu +/ToUnicode 2792 0 R +/Encoding /Identity-H +/Type /Font +>> +endobj +813 0 obj +<< +/Subtype /Type0 +/DescendantFonts [2793 0 R] +/BaseFont /PKKHBH+SimHei +/ToUnicode 2794 0 R +/Encoding /Identity-H +/Type /Font +>> +endobj +814 0 obj +<< +/Type /Font +/BaseFont /AAAGGN+NotoSans-Regular +/Subtype /Type0 +/Encoding /Identity-H +/DescendantFonts [2795 0 R] +/ToUnicode 2796 0 R +>> +endobj +815 0 obj +<< +/Type /Font +/BaseFont /AAAZZG+NotoSans-Bold +/Subtype /Type0 +/Encoding /Identity-H +/DescendantFonts [2797 0 R] +/ToUnicode 2798 0 R +>> +endobj +816 0 obj +<< +/OCGs 5 0 R +/Type /OCMD +>> +endobj +817 0 obj +<< +/OPM 1 +/OP false +/op false +/Type /ExtGState +/SA false +/SM 0.02 +>> +endobj +818 0 obj +<< +/Type /ExtGState +/ca 0.8 +/CA 0.8 +/BM /Multiply +/LW 3.0 +>> +endobj +819 0 obj +<< +/Type /ExtGState +/ca 0.8 +/CA 0.8 +/BM /Multiply +/LW 3.0 +>> +endobj +820 0 obj +<< +/Type /ExtGState +/ca 0.8 +/CA 0.8 +/BM /Multiply +/LW 3.0 +>> +endobj +821 0 obj +<< +/Type /ExtGState +/ca 0.8 +/CA 0.8 +/BM /Multiply +/LW 3.0 +>> +endobj +822 0 obj +<< +/Type /ExtGState +/ca 0.8 +/CA 0.8 +/BM /Multiply +/LW 3.0 +>> +endobj +823 0 obj +<< +/Type /ExtGState +/ca 0.8 +/CA 0.8 +/BM /Multiply +/LW 3.0 +>> +endobj +824 0 obj +<< +/Type /ExtGState +/ca 0.8 +/CA 0.8 +/BM /Multiply +/LW 3.0 +>> +endobj +825 0 obj +<< +/Type /ExtGState +/ca 0.8 +/CA 0.8 +/BM /Multiply +/LW 3.0 +>> +endobj +826 0 obj +<< +/Type /Annot +/Subtype /Link +/BS 2799 0 R +/A 2800 0 R +/Rect [0.0 836.0 235.73001 842.0] +>> +endobj +827 0 obj +<< +/Length 2 +>> +stream +q + +endstream +endobj +828 0 obj +<< +/Length 827 +/Filter /FlateDecode +>> +stream +xV[k0~ׯ8σG7KRhR:ۨJ!Mی5%m~Gb;խ$i-YwsnIq/W[.@Q~ZCuy.t NU +Ly)ךfn+̠X̰< +ɕDD#GGC @+}ң#+.;iЦ+ +A@uǐKՊUo+Hk{KNp\Xo dPܻzO|FqMV}a9eL~o`&#Dk-'‹Za,h/<㹲AY$q4x^Ŭ9с-=7h2b%+.fsK ZIMJ- Ǵ] `A̮ohGtS%H29P*Q=B%#%`FHIL&8ĕ\BZi\ZM(9 [+0))n2Fz:jΐ-bםݎKry=4?1U/ЀЪo )YɝvBNmbI|MQ6Zٌq ׍rYPc@F#DБķ +íGM +endstream +endobj +829 0 obj +<< +/Length 25294 +>> +stream +Q +1 0 0 1 0 0 cm +BT +/F6 7.5 Tf +0 0 0 rg +1 0 0 1 377.35162 781.10431 Tm +(+DQJ]KRX) Tj +ET +BT +/F6 7.5 Tf +0 0 0 rg +1 0 0 1 415.64661 781.10431 Tm +(=KLDQ) Tj +ET +BT +/F6 7.5 Tf +0 0 0 rg +1 0 0 1 437.2991 781.10431 Tm +(7HFKQRORJ\\) Tj +ET +BT +/F6 7.5 Tf +0 0 0 rg +1 0 0 1 479.96661 781.10431 Tm +(&R) Tj +ET +BT +/F6 7.5 Tf +0 0 0 rg +1 0 0 1 495.21411 781.10431 Tm +(/WG) Tj +ET +BT +/F6 9.5 Tf +0 0 0 rg +1 0 0 1 246.12 745.40033 Tm +(\)RUHZRUG) Tj +ET +BT +/F6 9.5 Tf +0 0 0 rg +1 0 0 1 291.53 745.40033 Tm +(DQG) Tj +ET +BT +/F6 9.5 Tf +0 0 0 rg +1 0 0 1 311.043 745.40033 Tm +(6WDWHPHQW) Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 116.7 722.36029 Tm +(7KDQN) Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 135.582 722.36029 Tm +(\\RX) Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 147.54001 722.36029 Tm +(IRU) Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 157.272 722.36029 Tm +(SXUFKDVLQJ) Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 190.48199 722.36029 Tm +(WKH) Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 201.29999 722.36029 Tm +(=\)0) Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 223.64398 722.36029 Tm +(VHULHV) Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 241.74599 722.36029 Tm +(ILQJHUSULQWV) Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 276.642 722.36029 Tm +(RI) Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 283.896 722.36029 Tm +(+DQJ]KRX) Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 314.53198 722.36029 Tm +(=KLDQ) Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 331.85397 722.36029 Tm +(7HFKQRORJ\\) Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 365.98798 722.36029 Tm +(&R) Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 378.18597 722.36029 Tm +(/WG) Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 390.35397 722.36029 Tm +( KHUHLQDIWHU) Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 425.38196 722.36029 Tm +(UHIHUUHG) Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 450.28195 722.36029 Tm +(WR) Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 457.63794 722.36029 Tm +(DV) Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 467.04593 722.36029 Tm +(=KLDQ) Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 484.36792 722.36029 Tm +(&RPSDQ\\ ) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 86.7 698.96027 Tm +(,GHQWLI\\) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 107.97949 698.96027 Tm +(D) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 112.495 698.96027 Tm +(PRGXOH) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 133.69749 698.96027 Tm +( KHUHLQDIWHU) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 165.80649 698.96027 Tm +(UHIHUUHG) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 188.63148 698.96027 Tm +(WR) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 195.37448 698.96027 Tm +(DV) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 202.52448 698.96027 Tm +(D) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 207.03998 698.96027 Tm +(PRGXOH ) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 111.84 675.5603 Tm +(7KLV) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 123.78049 675.5603 Tm +(XVHU) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 136.61749 675.5603 Tm +(PDQXDO) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 157.57799 675.5603 Tm +(LV) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 163.06149 675.5603 Tm +(ZULWWHQ) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 182.97699 675.5603 Tm +(IRU) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 191.89799 675.5603 Tm +(VRIWZDUH) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 215.94949 675.5603 Tm +(DQG) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 227.24649 675.5603 Tm +(KDUGZDUH) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 253.59698 675.5603 Tm +(DSSOLFDWLRQ) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 283.57199 675.5603 Tm +(GHYHORSPHQW) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 319.1405 675.5603 Tm +(HQJLQHHUV) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 347.85602 675.5603 Tm +(LQFOXGLQJ) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 373.14502 675.5603 Tm +(KDUGZDUH) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 399.49551 675.5603 Tm +(LQWHUIDFHV) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 427.93051 675.5603 Tm +(V\\VWHP) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 447.66452 675.5603 Tm +(UHVRXUFHV) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 475.95102 675.5603 Tm +(LQVWUXFWLRQV) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 87.84 652.16028 Tm +(&RPPDQG) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 116.22549 652.16028 Tm +(V\\VWHP) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 137.4335 652.16028 Tm +(LQVWDOODWLRQ) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 167.4415 652.16028 Tm +(LQIRUPDWLRQ) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 201.01349 652.16028 Tm +(HWF) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 211.64499 652.16028 Tm +(7R) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 219.46049 652.16028 Tm +(HQVXUH) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 238.79849 652.16028 Tm +(VPRRWK) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 260.04498 652.16028 Tm +(DSSOLFDWLRQ) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 290.01999 652.16028 Tm +(GHYHORSPHQW) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 327.0625 652.16028 Tm +(SOHDVH) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 345.21799 652.16028 Tm +(FDUHIXOO\\) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 368.681 652.16028 Tm +(FKHFN) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 384.82901 652.16028 Tm +(EHIRUH) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 403.33652 652.16028 Tm +(SURFHHGLQJ) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 434.17502 652.16028 Tm +(ZLWK) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 446.73151 652.16028 Tm +(PRGXOH) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 467.93402 652.16028 Tm +(GHYHORSPHQW) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 87.84 628.76025 Tm +(5HDG) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 102.26099 628.76025 Tm +(WKH) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 112.17749 628.76025 Tm +(PDQXDO) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 133.13799 628.76025 Tm +(FDUHIXOO\\) Tj +ET +BT +/F6 7 Tf +0 0 0 rg +1 0 0 1 111.84 605.36029 Tm +(\(YHU\\) Tj +ET +BT +/F6 7 Tf +0 0 0 rg +1 0 0 1 131.517 605.36029 Tm +(HIIRUW) Tj +ET +BT +/F6 7 Tf +0 0 0 rg +1 0 0 1 151.754 605.36029 Tm +(KDV) Tj +ET +BT +/F6 7 Tf +0 0 0 rg +1 0 0 1 165.17999 605.36029 Tm +(EHHQ) Tj +ET +BT +/F6 7 Tf +0 0 0 rg +1 0 0 1 183.52699 605.36029 Tm +(PDGH) Tj +ET +BT +/F6 7 Tf +0 0 0 rg +1 0 0 1 204.07199 605.36029 Tm +(WR) Tj +ET +BT +/F6 7 Tf +0 0 0 rg +1 0 0 1 212.65399 605.36029 Tm +(HQVXUH) Tj +ET +BT +/F6 7 Tf +0 0 0 rg +1 0 0 1 237.26599 605.36029 Tm +(WKH) Tj +ET +BT +/F6 7 Tf +0 0 0 rg +1 0 0 1 249.88699 605.36029 Tm +(DFFXUDF\\) Tj +ET +BT +/F6 7 Tf +0 0 0 rg +1 0 0 1 280.42798 605.36029 Tm +(RI) Tj +ET +BT +/F6 7 Tf +0 0 0 rg +1 0 0 1 288.89099 605.36029 Tm +(WKLV) Tj +ET +BT +/F6 7 Tf +0 0 0 rg +1 0 0 1 302.72299 605.36029 Tm +(PDQXDO) Tj +ET +BT +/F6 7 Tf +0 0 0 rg +1 0 0 1 331.276 605.36029 Tm +(+RZHYHU) Tj +ET +BT +/F6 7 Tf +0 0 0 rg +1 0 0 1 364.23901 605.36029 Tm +(LI) Tj +ET +BT +/F6 7 Tf +0 0 0 rg +1 0 0 1 370.27301 605.36029 Tm +(\\RX) Tj +ET +BT +/F6 7 Tf +0 0 0 rg +1 0 0 1 384.224 605.36029 Tm +(KDYH) Tj +ET +BT +/F6 7 Tf +0 0 0 rg +1 0 0 1 401.80099 605.36029 Tm +(DQ\\) Tj +ET +BT +/F6 7 Tf +0 0 0 rg +1 0 0 1 415.444 605.36029 Tm +(TXHVWLRQV) Tj +ET +BT +/F6 7 Tf +0 0 0 rg +1 0 0 1 449.44299 605.36029 Tm +(RU) Tj +ET +BT +/F6 7 Tf +0 0 0 rg +1 0 0 1 458.38901 605.36029 Tm +(ILQG) Tj +ET +BT +/F6 7 Tf +0 0 0 rg +1 0 0 1 473.05402 605.36029 Tm +(DQ) Tj +ET +BT +/F6 7 Tf +0 0 0 rg +1 0 0 1 483.12701 605.36029 Tm +(HUURU) Tj +ET +BT +/F6 9.5 Tf +0 0 0 rg +1 0 0 1 87.84 581.96027 Tm +(&RQWDFW) Tj +ET +BT +/F6 9.5 Tf +0 0 0 rg +1 0 0 1 124.681 581.96027 Tm +(XV) Tj +ET +BT +/F6 9.5 Tf +0 0 0 rg +1 0 0 1 137.57249 581.96027 Tm +(DQG) Tj +ET +BT +/F6 9.5 Tf +0 0 0 rg +1 0 0 1 158.14949 581.96027 Tm +(RU) Tj +ET +BT +/F6 9.5 Tf +0 0 0 rg +1 0 0 1 170.2905 581.96027 Tm +(RXU) Tj +ET +BT +/F6 9.5 Tf +0 0 0 rg +1 0 0 1 188.30249 581.96027 Tm +(DXWKRUL]HG) Tj +ET +BT +/F6 9.5 Tf +0 0 0 rg +1 0 0 1 239.06099 581.96027 Tm +(DJHQWV) Tj +ET +BT +/F6 9.5 Tf +0 0 0 rg +1 0 0 1 271.91199 581.96027 Tm +(GLUHFWO\\) Tj +ET +BT +/F6 9.5 Tf +0 0 0 rg +1 0 0 1 309.78848 581.96027 Tm +(ZH) Tj +ET +BT +/F6 9.5 Tf +0 0 0 rg +1 0 0 1 325.0835 581.96027 Tm +(ZRXOG) Tj +ET +BT +/F6 9.5 Tf +0 0 0 rg +1 0 0 1 354.9325 581.96027 Tm +(DSSUHFLDWH) Tj +ET +BT +/F6 9.5 Tf +0 0 0 rg +1 0 0 1 404.82648 581.96027 Tm +(LW) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 111.84 558.5603 Tm +(%HFDXVH) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 134.808 558.5603 Tm +(RXU) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 145.23599 558.5603 Tm +(FRPSDQ\\) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 170.448 558.5603 Tm +(SXUVXHV) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 192.701 558.5603 Tm +(WKH) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 202.61751 558.5603 Tm +(SXUSRVH) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 225.54701 558.5603 Tm +(RI) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 232.19652 558.5603 Tm +(FRQWLQXRXVO\\) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 266.78052 558.5603 Tm +(LPSURYLQJ) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 294.74802 558.5603 Tm +(DQG) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 306.04501 558.5603 Tm +(LPSURYLQJ) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 334.01251 558.5603 Tm +(SURGXFWV) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 359.93951 558.5603 Tm +(WKH) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 369.85602 558.5603 Tm +(FRQWHQWV) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 393.75903 558.5603 Tm +(RI) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 400.40854 558.5603 Tm +(PRGXOHV) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 424.24554 558.5603 Tm +(DQG) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 435.54254 558.5603 Tm +(PDQXDOV) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 459.13754 558.5603 Tm +(PD\\) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 471.60056 558.5603 Tm +(EH) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 479.51505 558.5603 Tm +(FKDQJHG) Tj +ET +BT +/F6 7 Tf +0 0 0 rg +1 0 0 1 87.84 535.16028 Tm +(\)XUWKHU) Tj +ET +BT +/F6 7 Tf +0 0 0 rg +1 0 0 1 114.202 535.16028 Tm +(QRWLFH) Tj +ET +BT +/F6 7 Tf +0 0 0 rg +1 0 0 1 138.09999 535.16028 Tm +(3OHDVH) Tj +ET +BT +/F6 7 Tf +0 0 0 rg +1 0 0 1 161.13699 535.16028 Tm +(YLVLW) Tj +ET +BT +/F6 7 Tf +0 0 0 rg +1 0 0 1 176.00499 535.16028 Tm +(RXU) Tj +ET +BT +/F6 7 Tf +0 0 0 rg +1 0 0 1 189.27699 535.16028 Tm +<004600520050005300440051005C000A00560003> Tj +ET +BT +/F6 7 Tf +0 0 0 rg +1 0 0 1 226.293 535.16028 Tm +(ZHEVLWH) Tj +ET +BT +/F6 7 Tf +0 0 0 rg +1 0 0 1 253.502 535.16028 Tm +(RU) Tj +ET +BT +/F6 7 Tf +0 0 0 rg +1 0 0 1 262.448 535.16028 Tm +(FRQWDFW) Tj +ET +BT +/F6 7 Tf +0 0 0 rg +1 0 0 1 288.53 535.16028 Tm +(XV) Tj +ET +BT +/F6 7 Tf +0 0 0 rg +1 0 0 1 298.02899 535.16028 Tm +(E\\) Tj +ET +BT +/F6 7 Tf +0 0 0 rg +1 0 0 1 307.724 535.16028 Tm +(SKRQH) Tj +ET +BT +/F6 7 Tf +0 0 0 rg +1 0 0 1 330.68399 535.16028 Tm +(IRU) Tj +ET +BT +/F6 7 Tf +0 0 0 rg +1 0 0 1 342.03799 535.16028 Tm +(WKH) Tj +ET +BT +/F6 7 Tf +0 0 0 rg +1 0 0 1 354.659 535.16028 Tm +(ODWHVW) Tj +ET +BT +/F6 7 Tf +0 0 0 rg +1 0 0 1 374.56699 535.16028 Tm +(LQIRUPDWLRQ) Tj +ET +BT +/F6 6.5 Tf +0 0 0 rg +1 0 0 1 110.7 511.76031 Tm +(7KLV) Tj +ET +BT +/F6 6.5 Tf +0 0 0 rg +1 0 0 1 124.81149 511.76031 Tm +(GRFXPHQW) Tj +ET +BT +/F6 6.5 Tf +0 0 0 rg +1 0 0 1 157.67549 511.76031 Tm +(FRQWDLQV) Tj +ET +BT +/F6 6.5 Tf +0 0 0 rg +1 0 0 1 185.23549 511.76031 Tm +(WKH) Tj +ET +BT +/F6 6.5 Tf +0 0 0 rg +1 0 0 1 196.95499 511.76031 Tm +(SULYDWH) Tj +ET +BT +/F6 6.5 Tf +0 0 0 rg +1 0 0 1 219.96498 511.76031 Tm +(LQIRUPDWLRQ) Tj +ET +BT +/F6 6.5 Tf +0 0 0 rg +1 0 0 1 257.89899 511.76031 Tm +(RI) Tj +ET +BT +/F6 6.5 Tf +0 0 0 rg +1 0 0 1 265.75748 511.76031 Tm +(WKH) Tj +ET +BT +/F6 6.5 Tf +0 0 0 rg +1 0 0 1 277.47699 511.76031 Tm +(FRPSDQ\\) Tj +ET +BT +/F6 6.5 Tf +0 0 0 rg +1 0 0 1 309.01498 511.76031 Tm +(ZLWKRXW) Tj +ET +BT +/F6 6.5 Tf +0 0 0 rg +1 0 0 1 334.15048 511.76031 Tm +(WKH) Tj +ET +BT +/F6 6.5 Tf +0 0 0 rg +1 0 0 1 345.87 511.76031 Tm +(ZULWWHQ) Tj +ET +BT +/F6 6.5 Tf +0 0 0 rg +1 0 0 1 369.40649 511.76031 Tm +(SHUPLVVLRQ) Tj +ET +BT +/F6 6.5 Tf +0 0 0 rg +1 0 0 1 405.05249 511.76031 Tm +(RI) Tj +ET +BT +/F6 6.5 Tf +0 0 0 rg +1 0 0 1 412.91098 511.76031 Tm +(WKH) Tj +ET +BT +/F6 6.5 Tf +0 0 0 rg +1 0 0 1 424.63049 511.76031 Tm +(FRPSDQ\\) Tj +ET +BT +/F6 6.5 Tf +0 0 0 rg +1 0 0 1 456.16849 511.76031 Tm +(WKLUG) Tj +ET +BT +/F6 6.5 Tf +0 0 0 rg +1 0 0 1 472.58099 511.76031 Tm +(SDUWLHV) Tj +ET +BT +/F6 6.5 Tf +0 0 0 rg +1 0 0 1 495.4025 511.76031 Tm +(GR) Tj +ET +BT +/F6 6.5 Tf +0 0 0 rg +1 0 0 1 505.02249 511.76031 Tm +(QRW) Tj +ET +BT +/F6 11.5 Tf +0 0 0 rg +1 0 0 1 86.69998 488.36032 Tm +(PD\\) Tj +ET +BT +/F6 11.5 Tf +0 0 0 rg +1 0 0 1 112.75898 488.36032 Tm +(EH) Tj +ET +BT +/F6 11.5 Tf +0 0 0 rg +1 0 0 1 129.30748 488.36032 Tm +(XVHG) Tj +ET +BT +/F6 11.5 Tf +0 0 0 rg +1 0 0 1 158.47148 488.36032 Tm +(RU) Tj +ET +BT +/F6 11.5 Tf +0 0 0 rg +1 0 0 1 173.16849 488.36032 Tm +(GLVFORVHG) Tj +ET +BT +/F6 11.5 Tf +0 0 0 rg +1 0 0 1 226.21799 488.36032 Tm +(DW) Tj +ET +BT +/F6 11.5 Tf +0 0 0 rg +1 0 0 1 239.81099 488.36032 Tm +(ZLOO) Tj +ET +BT +/F6 11.5 Tf +0 0 0 rg +1 0 0 1 263.823 488.36032 Tm +(RI) Tj +ET +BT +/F6 11.5 Tf +0 0 0 rg +1 0 0 1 277.7265 488.36032 Tm +(FRXUVH) Tj +ET +BT +/F6 11.5 Tf +0 0 0 rg +1 0 0 1 320.12701 488.36032 Tm +(DQ\\) Tj +ET +BT +/F6 5 Tf +0 0 0 rg +1 0 0 1 86.69998 464.96033 Tm +(&RS\\LQJ) Tj +ET +BT +/F6 5 Tf +0 0 0 rg +1 0 0 1 107.26498 464.96033 Tm +(DQG) Tj +ET +BT +/F6 5 Tf +0 0 0 rg +1 0 0 1 117.53498 464.96033 Tm +(XQDXWKRUL]HG) Tj +ET +BT +/F6 5 Tf +0 0 0 rg +1 0 0 1 150.42998 464.96033 Tm +(PRGLILFDWLRQ) Tj +ET +BT +/F6 5 Tf +0 0 0 rg +1 0 0 1 181.21997 464.96033 Tm +(RI) Tj +ET +BT +/F6 5 Tf +0 0 0 rg +1 0 0 1 187.26497 464.96033 Tm +(LQIRUPDWLRQ) Tj +ET +BT +/F6 5 Tf +0 0 0 rg +1 0 0 1 216.44498 464.96033 Tm +(DUH) Tj +ET +BT +/F6 5 Tf +0 0 0 rg +1 0 0 1 225.43498 464.96033 Tm +(ERWK) Tj +ET +BT +/F6 5 Tf +0 0 0 rg +1 0 0 1 237.72998 464.96033 Tm +(LQIULQJHPHQWV) Tj +ET +BT +/F6 7 Tf +0 0 0 rg +1 0 0 1 110.7 441.5603 Tm +(,Q) Tj +ET +BT +/F6 7 Tf +0 0 0 rg +1 0 0 1 119.21899 441.5603 Tm +(WKH) Tj +ET +BT +/F6 7 Tf +0 0 0 rg +1 0 0 1 131.84 441.5603 Tm +(XVH) Tj +ET +BT +/F6 7 Tf +0 0 0 rg +1 0 0 1 145.287 441.5603 Tm +(RI) Tj +ET +BT +/F6 7 Tf +0 0 0 rg +1 0 0 1 153.75 441.5603 Tm +(WKH) Tj +ET +BT +/F6 7 Tf +0 0 0 rg +1 0 0 1 166.371 441.5603 Tm +<004600520050005300440051005C000A00560003> Tj +ET +BT +/F6 7 Tf +0 0 0 rg +1 0 0 1 203.38699 441.5603 Tm +(SURGXFWV) Tj +ET +BT +/F6 7 Tf +0 0 0 rg +1 0 0 1 236.38499 441.5603 Tm +(6KLDQ) Tj +ET +BT +/F6 7 Tf +0 0 0 rg +1 0 0 1 256.43298 441.5603 Tm +(GRHV) Tj +ET +BT +/F6 7 Tf +0 0 0 rg +1 0 0 1 274.09399 441.5603 Tm +(QRW) Tj +ET +BT +/F6 7 Tf +0 0 0 rg +1 0 0 1 287.00198 441.5603 Tm +(EHDU) Tj +ET +BT +/F6 7 Tf +0 0 0 rg +1 0 0 1 303.89297 441.5603 Tm +(DQ\\) Tj +ET +BT +/F6 7 Tf +0 0 0 rg +1 0 0 1 317.53598 441.5603 Tm +(UHVSRQVLELOLW\\) Tj +ET +BT +/F6 7 Tf +0 0 0 rg +1 0 0 1 363.39297 441.5603 Tm +(RU) Tj +ET +BT +/F6 7 Tf +0 0 0 rg +1 0 0 1 372.33899 441.5603 Tm +(REOLJDWLRQ) Tj +ET +BT +/F6 7 Tf +0 0 0 rg +1 0 0 1 409.31299 441.5603 Tm +(DQG) Tj +ET +BT +/F6 7 Tf +0 0 0 rg +1 0 0 1 423.69098 441.5603 Tm +(WKLUG) Tj +ET +BT +/F6 7 Tf +0 0 0 rg +1 0 0 1 441.36597 441.5603 Tm +(SDUWLHV) Tj +ET +BT +/F6 7 Tf +0 0 0 rg +1 0 0 1 465.94296 441.5603 Tm +(LQ) Tj +ET +BT +/F6 7 Tf +0 0 0 rg +1 0 0 1 473.89496 441.5603 Tm +(WKH) Tj +ET +BT +/F6 7 Tf +0 0 0 rg +1 0 0 1 486.51596 441.5603 Tm +(XVH) Tj +ET +BT +/F6 7 Tf +0 0 0 rg +1 0 0 1 499.96295 441.5603 Tm +(RI) Tj +ET +BT +/F6 6.5 Tf +0 0 0 rg +1 0 0 1 86.69998 418.16031 Tm +(1R) Tj +ET +BT +/F6 6.5 Tf +0 0 0 rg +1 0 0 1 97.26248 418.16031 Tm +(SDWHQW) Tj +ET +BT +/F6 6.5 Tf +0 0 0 rg +1 0 0 1 118.97248 418.16031 Tm +(RU) Tj +ET +BT +/F6 6.5 Tf +0 0 0 rg +1 0 0 1 127.27948 418.16031 Tm +(RWKHU) Tj +ET +BT +/F6 6.5 Tf +0 0 0 rg +1 0 0 1 145.61598 418.16031 Tm +(LQWHOOHFWXDO) Tj +ET +BT +/F6 6.5 Tf +0 0 0 rg +1 0 0 1 180.83948 418.16031 Tm +(SURSHUW\\) Tj +ET +BT +/F6 6.5 Tf +0 0 0 rg +1 0 0 1 209.15347 418.16031 Tm +(ULJKWV) Tj +ET +BT +/F6 6.5 Tf +0 0 0 rg +1 0 0 1 228.67947 418.16031 Tm +(DUH) Tj +ET +BT +/F6 6.5 Tf +0 0 0 rg +1 0 0 1 240.36647 418.16031 Tm +(LQIULQJHG) Tj +ET +BT +/F6 6.5 Tf +0 0 0 rg +1 0 0 1 116.28 394.76031 Tm +($OO) Tj +ET +BT +/F6 6.5 Tf +0 0 0 rg +1 0 0 1 125.4775 394.76031 Tm +(SURGXFWV) Tj +ET +BT +/F6 6.5 Tf +0 0 0 rg +1 0 0 1 154.3765 394.76031 Tm +(DUH) Tj +ET +BT +/F6 6.5 Tf +0 0 0 rg +1 0 0 1 166.06349 394.76031 Tm +(VROG) Tj +ET +BT +/F6 6.5 Tf +0 0 0 rg +1 0 0 1 180.474 394.76031 Tm +(VXEMHFW) Tj +ET +BT +/F6 6.5 Tf +0 0 0 rg +1 0 0 1 204.1015 394.76031 Tm +(WR) Tj +ET +BT +/F6 6.5 Tf +0 0 0 rg +1 0 0 1 212.0705 394.76031 Tm +(WKH) Tj +ET +BT +/F6 6.5 Tf +0 0 0 rg +1 0 0 1 223.78999 394.76031 Tm +<004600520050005300440051005C000A00560003> Tj +ET +BT +/F6 6.5 Tf +0 0 0 rg +1 0 0 1 258.16199 394.76031 Tm +(WHUPV) Tj +ET +BT +/F6 6.5 Tf +0 0 0 rg +1 0 0 1 277.73999 394.76031 Tm +(DQG) Tj +ET +BT +/F6 6.5 Tf +0 0 0 rg +1 0 0 1 291.091 394.76031 Tm +(FRQGLWLRQV) Tj +ET +BT +/F6 6.5 Tf +0 0 0 rg +1 0 0 1 324.61151 394.76031 Tm +(RI) Tj +ET +BT +/F6 6.5 Tf +0 0 0 rg +1 0 0 1 332.47 394.76031 Tm +(VDOH) Tj +ET +BT +/F6 6.5 Tf +0 0 0 rg +1 0 0 1 346.263 394.76031 Tm +(LQ) Tj +ET +BT +/F6 6.5 Tf +0 0 0 rg +1 0 0 1 353.647 394.76031 Tm +(WKH) Tj +ET +BT +/F6 6.5 Tf +0 0 0 rg +1 0 0 1 365.36652 394.76031 Tm +(RUGHU) Tj +ET +BT +/F6 6.5 Tf +0 0 0 rg +1 0 0 1 384.02151 394.76031 Tm +(DFNQRZOHGJPHQW) Tj +ET +BT +/F6 6.5 Tf +0 0 0 rg +1 0 0 1 440.19452 394.76031 Tm +(7KH) Tj +ET +BT +/F6 6.5 Tf +0 0 0 rg +1 0 0 1 453.18152 394.76031 Tm +<004600520050005300440051005C000A00560003> Tj +ET +BT +/F6 6.5 Tf +0 0 0 rg +1 0 0 1 487.55353 394.76031 Tm +(SURILW) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 86.28 371.36032 Tm +(8VH) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 97.467 371.36032 Tm +(WHVWLQJ) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 118.27899 371.36032 Tm +(WRROLQJ) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 139.44299 371.36032 Tm +(TXDOLW\\) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 158.3685 371.36032 Tm +(FRQWURO) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 178.1685 371.36032 Tm +(DQG) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 189.4655 371.36032 Tm +(RWKHU) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 204.981 371.36032 Tm +(WHFKQLFDO) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 229.5 371.36032 Tm +(PHDQV) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 248.2935 371.36032 Tm +(WR) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 255.0365 371.36032 Tm +(VXSSRUW) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 276.84949 371.36032 Tm +(WKH) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 286.76599 371.36032 Tm +(UHOHYDQW) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 309.35449 371.36032 Tm +(SHUIRUPDQFH) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 344.40048 371.36032 Tm +(RI) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 351.04999 371.36032 Tm +(WKH) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 360.96649 371.36032 Tm +(SURGXFW) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 382.785 371.36032 Tm +(WR) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 389.52802 371.36032 Tm +(D) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 394.04352 371.36032 Tm +(FHUWDLQ) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 413.37601 371.36032 Tm +(H[WHQW) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 431.28952 371.36032 Tm +(WR) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 438.03253 371.36032 Tm +(WKH) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 447.94904 371.36032 Tm +(UHTXLUHG) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 471.70905 371.36032 Tm +(VSHFLILFDWLRQ) Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 86.28 347.96033 Tm +(JXDUDQWHH) Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 118.698 347.96033 Tm +(,W) Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 124.458 347.96033 Tm +(LV) Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 130.44 347.96033 Tm +(QRW) Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 141.504 347.96033 Tm +(QHFHVVDU\\) Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 171.07199 347.96033 Tm +(WR) Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 178.42799 347.96033 Tm +(SHUIRUP) Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 203.32199 347.96033 Tm +(DOO) Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 211.34399 347.96033 Tm +(SDUDPHWULF) Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 243.87 347.96033 Tm +(WHVWV) Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 258.89398 347.96033 Tm +(IRU) Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 268.62598 347.96033 Tm +(HDFK) Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 283.52399 347.96033 Tm +(SURGXFW) Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 308.93399 347.96033 Tm +(H[FHSW) Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 329.172 347.96033 Tm +(DV) Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 336.97198 347.96033 Tm +(H[SUHVVO\\) Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 364.99799 347.96033 Tm +(UHTXLUHG) Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 390.918 347.96033 Tm +(LQ) Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 397.73401 347.96033 Tm +(ZULWLQJ) Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 419.14801 347.96033 Tm +(E\\) Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 427.45801 347.96033 Tm +(WKH) Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 438.276 347.96033 Tm +(JRYHUQPHQW) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 160.1398 278.35974 Tm +(+DQJ]KRX) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 188.22281 278.35974 Tm +(=KLDQ) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 204.1013 278.35974 Tm +(7HFKQRORJ\\) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 235.39081 278.35974 Tm +(&R) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 246.57231 278.35974 Tm +(/WG) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 257.72632 278.35974 Tm +() Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 286.09531 278.35974 Tm +(&RS\\ULJKW) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 314.44781 278.35974 Tm +($OO) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 322.23032 278.35974 Tm +(ULJKWV) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 338.75232 278.35974 Tm +(UHVHUYHG) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 364.31631 278.35974 Tm +(,QIULQJHPHQW) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 400.1048 278.35974 Tm +(PXVW) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 414.69629 278.35974 Tm +(EH) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 422.61078 278.35974 Tm +(LQYHVWLJDWHG) Tj +ET +BT +/F6 11 Tf +0 0 0 rg +1 0 0 1 111.84 230.96039 Tm +(&RQWDFW) Tj +ET +BT +/F6 11 Tf +0 0 0 rg +1 0 0 1 154.498 230.96039 Tm +(XV) Tj +ET +BT +/F6 11 Tf +0 0 0 rg +1 0 0 1 172.373 230.96039 Tm +(KWWS) Tj +ET +BT +/F6 11 Tf +0 0 0 rg +1 0 0 1 205.01001 230.96039 Tm +(ZZZ]KLDQWHFFRP) Tj +ET +BT +/F6 12 Tf +0 0 0 rg +1 0 0 1 111.84 207.56042 Tm +(ODQG) Tj +ET +BT +/F6 5 Tf +0 0 0 rg +1 0 0 1 111.84 184.1604 Tm +(\(OHFWULFLW\\) Tj +ET +BT +/F6 8.5 Tf +0 0 0 rg +1 0 0 1 111.84 160.76038 Tm +(7HFKQLFDO) Tj +ET +BT +/F6 8.5 Tf +0 0 0 rg +1 0 0 1 151.3905 160.76038 Tm +(VXSSRUW) Tj +ET +BT +/F6 8.5 Tf +0 0 0 rg +1 0 0 1 187.3795 160.76038 Tm +() Tj +ET +BT +/F6 11.5 Tf +0 0 0 rg +1 0 0 1 111.84 137.36041 Tm +(\)D[) Tj +ET +BT +/F6 11.5 Tf +0 0 0 rg +1 0 0 1 136.4155 137.36041 Tm +() Tj +ET +BT +/F6 5 Tf +0 0 0 rg +1 0 0 1 147.84 207.56042 Tm +($GGUHVV) Tj +ET +BT +/F6 5 Tf +0 0 0 rg +1 0 0 1 169.5 207.56042 Tm +(%ORFN) Tj +ET +BT +/F6 5 Tf +0 0 0 rg +1 0 0 1 183.435 207.56042 Tm +(&) Tj +ET +BT +/F6 5 Tf +0 0 0 rg +1 0 0 1 188.455 207.56042 Tm +(') Tj +ET +BT +/F6 5 Tf +0 0 0 rg +1 0 0 1 194.745 207.56042 Tm +(WK) Tj +ET +BT +/F6 5 Tf +0 0 0 rg +1 0 0 1 203.79999 207.56042 Tm +(\)ORRU) Tj +ET +BT +/F6 5 Tf +0 0 0 rg +1 0 0 1 218.43999 207.56042 Tm +(:HVW) Tj +ET +BT +/F6 5 Tf +0 0 0 rg +1 0 0 1 231.40999 207.56042 Tm +(%XLOGLQJ) Tj +ET +BT +/F6 5 Tf +0 0 0 rg +1 0 0 1 253.49998 207.56042 Tm +(,QWHUQDWLRQDO) Tj +ET +BT +/F6 5 Tf +0 0 0 rg +1 0 0 1 285.47498 207.56042 Tm +(*DUGHQ) Tj +ET +BT +/F6 5 Tf +0 0 0 rg +1 0 0 1 305.60999 207.56042 Tm +(1R) Tj +ET +BT +/F6 5 Tf +0 0 0 rg +1 0 0 1 315.07498 207.56042 Tm +() Tj +ET +BT +/F6 5 Tf +0 0 0 rg +1 0 0 1 324.95499 207.56042 Tm +(7LDQPXVKDQ) Tj +ET +BT +/F6 5 Tf +0 0 0 rg +1 0 0 1 355.36499 207.56042 Tm +(5RDG) Tj +ET +BT +/F6 5 Tf +0 0 0 rg +1 0 0 1 370.01999 207.56042 Tm +(+DQJ]KRX) Tj +ET +BT +/F6 5 Tf +0 0 0 rg +1 0 0 1 396.88998 207.56042 Tm +(=KHMLDQJ) Tj +ET +BT +/F6 9.5 Tf +0 0 0 rg +1 0 0 1 147.84 184.1604 Tm +(3KRQH) Tj +ET +BT +/F6 9.5 Tf +0 0 0 rg +1 0 0 1 181.45099 184.1604 Tm +() Tj +ET +BT +/F6 10 Tf +0 0 0 rg +1 0 0 1 459.84 207.56042 Tm +() Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 270.17999 45.86041 Tm +(WKH) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 280.0965 45.86041 Tm +(ILUVW) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 291.729 45.86041 Tm +() Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 296.30499 45.86041 Tm +(SDJHV) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 313.32199 45.86041 Tm +(RI) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 319.9715 45.86041 Tm +() Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 327.69348 45.86041 Tm +(3DJH) Tj +ET + +endstream +endobj +830 0 obj +<< +/Length 2533 +/Subtype /Image +/Filter /DCTDecode +/BitsPerComponent 8 +/ColorSpace [/ICCBased 808 0 R] +/Width 109 +/Height 59 +/Type /XObject +>> +stream +Adobed    +  $$''$$53335;;;;;;;;;;  %% ## ((%%((22022;;;;;;;;;;;m"? +  +  3!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw5!1AQaq"2B#R3$brCScs4%&5DTdEU6teuFVfv'7GWgw ?D<1i~FCUV%q!ԓ ϽC&WZNtk0~h?T$g*|2lg?C*˫ڇ~g[+g^+oQy̩ +.KDu#qзyl1?7D)$R3$IJI$RI$̀AݣR~IT0qiۥwfc`汁EmnSmAWU,eٰ` `eӅhu2~; i:xo&!?]u[k!h V3YE=bWNV\-U.վt~8/{ZL*=7R_;+/fh;%b9 TRI$9 quj6dbdb<*:ƻq_oU=!.ٛf&`y\3k]byUif_ScvuB}uhh&ͷ԰}:cS} ^No]8O1^aӍ +\*5e^'vg㏯?W.k#`-\}kvp)7Ckٔ_zպf7[y#:}oypo:K] ZYkhtD8?Ks33ƧB~bY0kVOW(/_ acdޡo|_atl :{jc{Z瑸bJ5YyC#cO]18o? /Wu7Pˮ8|`fwKU  w;/7]#`N+eU8AW7'[ӑn?C|_.IOIO՟} ۋN'WU@@qVL8LU{ksc-ǵDy`'UJL,o+ۑӺmnsG- d\7<ʅaՃ1r'}fgAަcmX?WgQy2dd\ '?5$?Az9=ޟQַN ~^-=s˦]F/A;FX^}{zgSߤyd d}U HG$|Z[PL[\k{-fieD}bKkpz?cm9?~]s>K~͟D3V#n?uR{-|׷.oGL}XVE6qc{5ĭ^o}w;?C䳳>[N{mkck?ll^vwܾ]u`~D;.u}CY?zF}8a4T;zM~G\6'h}b;Տj?iS'znD;#Z[JZ<4Ms]-#J1ǩ/G}&k6g}шg_km𒚿⳨tzEw=kH]wWϦ6}_x=6xn쭏ٿ`?z?m?[]BK + +endstream +endobj +831 0 obj +<< +/Length 82 +/Subtype /Image +/Filter /FlateDecode +/BitsPerComponent 4 +/ColorSpace [/Indexed [/ICCBased 808 0 R] + 15 832 0 R] +/Width 28 +/Height 25 +/Type /XObject +>> +stream +HPA bGfZ]͊f9Q)mR[*&(Z🅊Uq`:L%RiOa0z{(a + +endstream +endobj +832 0 obj +<< +/Length 49 +>> +stream + + +endstream +endobj +833 0 obj +<< +/Subtype /Type0 +/DescendantFonts [2801 0 R] +/BaseFont /PKKHDH+STXingkai +/ToUnicode 2802 0 R +/Encoding /Identity-H +/Type /Font +>> +endobj +834 0 obj +<< +/Subtype /Type0 +/DescendantFonts [2803 0 R] +/BaseFont /PKKHEI+STLiti +/ToUnicode 2804 0 R +/Encoding /Identity-H +/Type /Font +>> +endobj +835 0 obj +<< +/Rect [87.84 703.3 529.789 713.758] +/Subtype /Link +/BS << +/S /S +/W 0 +/Type /Border +>> +/A 2805 0 R +/H /I +/StructParent 3 +/Border [0 0 0] +/Type /Annot +>> +endobj +836 0 obj +<< +/Rect [98.34 682.3 529.746 692.758] +/Subtype /Link +/BS << +/S /S +/W 0 +/Type /Border +>> +/A 2806 0 R +/H /I +/StructParent 4 +/Border [0 0 0] +/Type /Annot +>> +endobj +837 0 obj +<< +/Rect [98.34 667.299 529.746 677.757] +/Subtype /Link +/BS << +/S /S +/W 0 +/Type /Border +>> +/A 2807 0 R +/H /I +/StructParent 5 +/Border [0 0 0] +/Type /Annot +>> +endobj +838 0 obj +<< +/Rect [87.84 646.299 529.802 656.757] +/Subtype /Link +/BS << +/S /S +/W 0 +/Type /Border +>> +/A 2808 0 R +/H /I +/StructParent 6 +/Border [0 0 0] +/Type /Annot +>> +endobj +839 0 obj +<< +/Rect [87.84 625.299 529.804 635.757] +/Subtype /Link +/BS << +/S /S +/W 0 +/Type /Border +>> +/A 2809 0 R +/H /I +/StructParent 7 +/Border [0 0 0] +/Type /Annot +>> +endobj +840 0 obj +<< +/Rect [98.34 604.299 529.743 614.757] +/Subtype /Link +/BS << +/S /S +/W 0 +/Type /Border +>> +/A 2810 0 R +/H /I +/StructParent 8 +/Border [0 0 0] +/Type /Annot +>> +endobj +841 0 obj +<< +/Rect [108.84 589.299 529.745 599.757] +/Subtype /Link +/BS << +/S /S +/W 0 +/Type /Border +>> +/A 2811 0 R +/H /I +/StructParent 9 +/Border [0 0 0] +/Type /Annot +>> +endobj +842 0 obj +<< +/Rect [108.84 574.299 529.746 584.757] +/Subtype /Link +/BS << +/S /S +/W 0 +/Type /Border +>> +/A 2812 0 R +/H /I +/StructParent 10 +/Border [0 0 0] +/Type /Annot +>> +endobj +843 0 obj +<< +/Rect [98.34 559.299 529.743 569.757] +/Subtype /Link +/BS << +/S /S +/W 0 +/Type /Border +>> +/A 2813 0 R +/H /I +/StructParent 11 +/Border [0 0 0] +/Type /Annot +>> +endobj +844 0 obj +<< +/Rect [87.84 538.299 529.79 548.757] +/Subtype /Link +/BS << +/S /S +/W 0 +/Type /Border +>> +/A 2814 0 R +/H /I +/StructParent 12 +/Border [0 0 0] +/Type /Annot +>> +endobj +845 0 obj +<< +/Rect [98.34 517.299 529.746 527.757] +/Subtype /Link +/BS << +/S /S +/W 0 +/Type /Border +>> +/A 2815 0 R +/H /I +/StructParent 13 +/Border [0 0 0] +/Type /Annot +>> +endobj +846 0 obj +<< +/Rect [108.84 502.298 529.744 512.756] +/Subtype /Link +/BS << +/S /S +/W 0 +/Type /Border +>> +/A 2816 0 R +/H /I +/StructParent 14 +/Border [0 0 0] +/Type /Annot +>> +endobj +847 0 obj +<< +/Rect [108.84 487.298 529.744 497.756] +/Subtype /Link +/BS << +/S /S +/W 0 +/Type /Border +>> +/A 2817 0 R +/H /I +/StructParent 15 +/Border [0 0 0] +/Type /Annot +>> +endobj +848 0 obj +<< +/Rect [98.34 472.298 529.746 482.756] +/Subtype /Link +/BS << +/S /S +/W 0 +/Type /Border +>> +/A 2818 0 R +/H /I +/StructParent 16 +/Border [0 0 0] +/Type /Annot +>> +endobj +849 0 obj +<< +/Rect [98.34 457.297 529.745 467.755] +/Subtype /Link +/BS << +/S /S +/W 0 +/Type /Border +>> +/A 2819 0 R +/H /I +/StructParent 17 +/Border [0 0 0] +/Type /Annot +>> +endobj +850 0 obj +<< +/Rect [108.84 442.297 529.742 452.755] +/Subtype /Link +/BS << +/S /S +/W 0 +/Type /Border +>> +/A 2820 0 R +/H /I +/StructParent 18 +/Border [0 0 0] +/Type /Annot +>> +endobj +851 0 obj +<< +/Rect [108.84 427.297 529.742 437.755] +/Subtype /Link +/BS << +/S /S +/W 0 +/Type /Border +>> +/A 2821 0 R +/H /I +/StructParent 19 +/Border [0 0 0] +/Type /Annot +>> +endobj +852 0 obj +<< +/Rect [108.84 412.296 531.482 422.754] +/Subtype /Link +/BS << +/S /S +/W 0 +/Type /Border +>> +/A 2822 0 R +/H /I +/StructParent 20 +/Border [0 0 0] +/Type /Annot +>> +endobj +853 0 obj +<< +/Rect [98.341 397.296 529.746 407.754] +/Subtype /Link +/BS << +/S /S +/W 0 +/Type /Border +>> +/A 2823 0 R +/H /I +/StructParent 21 +/Border [0 0 0] +/Type /Annot +>> +endobj +854 0 obj +<< +/Rect [98.3421 382.296 529.745 392.758] +/Subtype /Link +/BS << +/S /S +/W 0 +/Type /Border +>> +/A 2824 0 R +/H /I +/StructParent 22 +/Border [0 0 0] +/Type /Annot +>> +endobj +855 0 obj +<< +/Rect [98.3407 367.299 529.745 377.758] +/Subtype /Link +/BS << +/S /S +/W 0 +/Type /Border +>> +/A 2825 0 R +/H /I +/StructParent 23 +/Border [0 0 0] +/Type /Annot +>> +endobj +856 0 obj +<< +/Rect [98.3407 352.299 529.746 362.757] +/Subtype /Link +/BS << +/S /S +/W 0 +/Type /Border +>> +/A 2826 0 R +/H /I +/StructParent 24 +/Border [0 0 0] +/Type /Annot +>> +endobj +857 0 obj +<< +/Rect [87.8407 331.299 529.792 341.757] +/Subtype /Link +/BS << +/S /S +/W 0 +/Type /Border +>> +/A 2827 0 R +/H /I +/StructParent 25 +/Border [0 0 0] +/Type /Annot +>> +endobj +858 0 obj +<< +/Rect [98.3407 310.299 529.746 320.757] +/Subtype /Link +/BS << +/S /S +/W 0 +/Type /Border +>> +/A 2828 0 R +/H /I +/StructParent 26 +/Border [0 0 0] +/Type /Annot +>> +endobj +859 0 obj +<< +/Rect [98.3407 295.299 529.745 305.757] +/Subtype /Link +/BS << +/S /S +/W 0 +/Type /Border +>> +/A 2829 0 R +/H /I +/StructParent 27 +/Border [0 0 0] +/Type /Annot +>> +endobj +860 0 obj +<< +/Rect [87.8407 274.299 529.804 284.757] +/Subtype /Link +/BS << +/S /S +/W 0 +/Type /Border +>> +/A 2830 0 R +/H /I +/StructParent 28 +/Border [0 0 0] +/Type /Annot +>> +endobj +861 0 obj +<< +/Rect [98.3407 253.299 529.746 263.757] +/Subtype /Link +/BS << +/S /S +/W 0 +/Type /Border +>> +/A 2831 0 R +/H /I +/StructParent 29 +/Border [0 0 0] +/Type /Annot +>> +endobj +862 0 obj +<< +/Rect [98.3407 238.299 529.746 248.757] +/Subtype /Link +/BS << +/S /S +/W 0 +/Type /Border +>> +/A 2832 0 R +/H /I +/StructParent 30 +/Border [0 0 0] +/Type /Annot +>> +endobj +863 0 obj +<< +/Rect [98.3418 223.299 529.748 233.757] +/Subtype /Link +/BS << +/S /S +/W 0 +/Type /Border +>> +/A 2833 0 R +/H /I +/StructParent 31 +/Border [0 0 0] +/Type /Annot +>> +endobj +864 0 obj +<< +/Rect [98.3418 208.298 529.747 218.756] +/Subtype /Link +/BS << +/S /S +/W 0 +/Type /Border +>> +/A 2834 0 R +/H /I +/StructParent 32 +/Border [0 0 0] +/Type /Annot +>> +endobj +865 0 obj +<< +/Rect [108.842 193.298 529.746 203.756] +/Subtype /Link +/BS << +/S /S +/W 0 +/Type /Border +>> +/A 2835 0 R +/H /I +/StructParent 33 +/Border [0 0 0] +/Type /Annot +>> +endobj +866 0 obj +<< +/Rect [108.842 178.298 529.746 188.756] +/Subtype /Link +/BS << +/S /S +/W 0 +/Type /Border +>> +/A 2836 0 R +/H /I +/StructParent 34 +/Border [0 0 0] +/Type /Annot +>> +endobj +867 0 obj +<< +/Rect [87.8418 157.298 529.789 167.756] +/Subtype /Link +/BS << +/S /S +/W 0 +/Type /Border +>> +/A 2837 0 R +/H /I +/StructParent 35 +/Border [0 0 0] +/Type /Annot +>> +endobj +868 0 obj +<< +/Rect [98.3418 136.298 529.743 146.758] +/Subtype /Link +/BS << +/S /S +/W 0 +/Type /Border +>> +/A 2838 0 R +/H /I +/StructParent 36 +/Border [0 0 0] +/Type /Annot +>> +endobj +869 0 obj +<< +/Rect [98.3397 121.299 529.753 131.758] +/Subtype /Link +/BS << +/S /S +/W 0 +/Type /Border +>> +/A 2839 0 R +/H /I +/StructParent 37 +/Border [0 0 0] +/Type /Annot +>> +endobj +870 0 obj +<< +/Length 2 +>> +stream +q + +endstream +endobj +871 0 obj +<< +/Length 1086 +/Filter /FlateDecode +>> +stream +xXmk#7BZiFp\Bo!'wFk6+ﮥyfy4vy[_ćn}퍸l'q%[~[oq+ڳǿe2ὒ +t1HcɕQh/V*ٴ_+q R?RAi1:CTV\?4%_2h[;뚶Тk+kZԽV_?71E1- =*mIIv h1=( Qz: +@iWŏTa^|=_X%zf6(5/V a|5$C>2r,TNj +2L|y eX2iьYH/Vz, ZbO<=p` ;fbJ'dCyiG/|qAnF/Jr>&QF%.YB6C#\T0JZͼ8y +-6Gwz?lLiNu/{Nn`:!ֺO+0 +㚣4nntMFK_,P0ҿ,^ +endstream +endobj +872 0 obj +<< +/Length 19446 +>> +stream +Q +1 0 0 1 0 0 cm +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 377.35162 781.10431 Tm +(+DQJ]KRX) Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 415.64661 781.10431 Tm +(=KLDQ) Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 437.2991 781.10431 Tm +(7HFKQRORJ\\) Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 479.96661 781.10431 Tm +(&R) Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 495.21411 781.10431 Tm +(/WG) Tj +ET +BT +/F5 13.5 Tf +0 0 0 rg +1 0 0 1 280.07999 736.88031 Tm +(FRQWHQW) Tj +ET +BT +/F6 10 Tf +0 0 0 rg +1 0 0 1 87.84 704.78027 Tm +(&KDSWHU) Tj +ET +BT +/F6 10 Tf +0 0 0 rg +1 0 0 1 130.53999 704.78027 Tm +() Tj +ET +BT +/F6 10 Tf +0 0 0 rg +1 0 0 1 138.85999 704.78027 Tm +(2YHUYLHZ) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 98.34 683.78027 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 115.06 683.78027 Tm +(+RZ) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 138.98 683.78027 Tm +(LW) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 147.76999 683.78027 Tm +(ZRUNV) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 371.41998 683.78027 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 98.34 668.78003 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 115.06 668.78003 Tm +(2UGHULQJ) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 160.42999 668.78003 Tm +(,QIRUPDWLRQ) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 415.07999 668.78003 Tm +() Tj +ET +BT +/F6 10 Tf +0 0 0 rg +1 0 0 1 87.84 647.78003 Tm +(&KDSWHU) Tj +ET +BT +/F6 10 Tf +0 0 0 rg +1 0 0 1 130.53999 647.78003 Tm +() Tj +ET +BT +/F6 10 Tf +0 0 0 rg +1 0 0 1 138.85999 647.78003 Tm +(0DLQ) Tj +ET +BT +/F6 10 Tf +0 0 0 rg +1 0 0 1 166.54999 647.78003 Tm +(WHFKQLFDO) Tj +ET +BT +/F6 10 Tf +0 0 0 rg +1 0 0 1 214.95999 647.78003 Tm +(LQGLFDWRUV) Tj +ET +BT +/F6 10 Tf +0 0 0 rg +1 0 0 1 87.84 626.78003 Tm +(&KDSWHU) Tj +ET +BT +/F6 10 Tf +0 0 0 rg +1 0 0 1 130.53999 626.78003 Tm +() Tj +ET +BT +/F6 10 Tf +0 0 0 rg +1 0 0 1 138.85999 626.78003 Tm +(+DUGZDUH) Tj +ET +BT +/F6 10 Tf +0 0 0 rg +1 0 0 1 191.06999 626.78003 Tm +(,QWHUIDFH) Tj +ET +BT +/F5 9.5 Tf +0 0 0 rg +1 0 0 1 98.34 605.78003 Tm +() Tj +ET +BT +/F5 9.5 Tf +0 0 0 rg +1 0 0 1 114.224 605.78003 Tm +(+RVW) Tj +ET +BT +/F5 9.5 Tf +0 0 0 rg +1 0 0 1 137.461 605.78003 Tm +(FRPSXWHU) Tj +ET +BT +/F5 9.5 Tf +0 0 0 rg +1 0 0 1 183.5455 605.78003 Tm +(LQWHUIDFH) Tj +ET +BT +/F5 9.5 Tf +0 0 0 rg +1 0 0 1 225.564 605.78003 Tm +( PDUNHG) Tj +ET +BT +/F5 9.5 Tf +0 0 0 rg +1 0 0 1 265.293 605.78003 Tm +(RQ) Tj +ET +BT +/F5 9.5 Tf +0 0 0 rg +1 0 0 1 279.3815 605.78003 Tm +(WKH) Tj +ET +BT +/F5 9.5 Tf +0 0 0 rg +1 0 0 1 296.51001 605.78003 Tm +(ERDUG) Tj +ET +BT +/F5 9.5 Tf +0 0 0 rg +1 0 0 1 328.21152 605.78003 Tm +(- ) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 108.84 590.77972 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 133.95999 590.77972 Tm +(6HULDO) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 162.59 590.77972 Tm +(FRPPXQLFDWLRQ) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 108.84 575.77942 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 133.95999 575.77942 Tm +(86%) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 155.85999 575.77942 Tm +(FRPPXQLFDWLRQ) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 98.34 560.77911 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 115.06 560.77911 Tm +(6HQVRU) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 149.94 560.77911 Tm +(LQWHUIDFH) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 194.17 560.77911 Tm +( PDUNHG) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 235.98999 560.77911 Tm +(RQ) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 250.81999 560.77911 Tm +(WKH) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 268.84998 560.77911 Tm +(ERDUG) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 302.21997 560.77911 Tm +(- ) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 474.30997 560.77911 Tm +() Tj +ET +BT +/F6 10 Tf +0 0 0 rg +1 0 0 1 87.84 539.77911 Tm +(&KDSWHU) Tj +ET +BT +/F6 10 Tf +0 0 0 rg +1 0 0 1 130.53999 539.77911 Tm +() Tj +ET +BT +/F6 10 Tf +0 0 0 rg +1 0 0 1 138.85999 539.77911 Tm +(6\\VWHP) Tj +ET +BT +/F6 10 Tf +0 0 0 rg +1 0 0 1 177.69998 539.77911 Tm +(5HVRXUFHV) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 98.34 518.77911 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 115.06 518.77911 Tm +(%XIIHU) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 396.07001 518.77911 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 108.84 503.77881 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 133.95999 503.77881 Tm +(,PDJH) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 166.69998 503.77881 Tm +(EXIIHU) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 391.15997 503.77881 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 108.84 488.7785 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 133.95999 488.7785 Tm +(\)HDWXUH) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 172.56 488.7785 Tm +(ILOH) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 189.39999 488.7785 Tm +(EXIIHU) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 451.38 488.7785 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 98.34 473.7782 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 115.06 473.7782 Tm +(\)LQJHUSULQW) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 170.17999 473.7782 Tm +(OLEUDU\\) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 452.22 473.7782 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 98.34 458.77789 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 115.06 458.77789 Tm +(6\\VWHP) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 151.64 458.77789 Tm +(FRQILJXUDWLRQ) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 217.78 458.77789 Tm +(SDUDPHWHUV) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 467.91998 458.77789 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 108.84 443.77759 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 133.95999 443.77759 Tm +(%DXG) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 161 443.77759 Tm +(UDWH) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 182.59 443.77759 Tm +(FRQWURO) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 218.59 443.77759 Tm +( SDUDPHWHU) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 274.06 443.77759 Tm +(QXPEHU) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 316.97 443.77759 Tm +( ) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 446.13 443.77759 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 108.84 428.77731 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 133.95999 428.77731 Tm +(6HFXULW\\) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 174.09 428.77731 Tm +(OHYHO) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 198.20999 428.77731 Tm +( SDUDPHWHU) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 253.67999 428.77731 Tm +(QXPEHU) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 296.59 428.77731 Tm +( ) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 465.87 428.77731 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 108.84 413.77701 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 133.95999 413.77701 Tm +(3DFNHW) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 167.60999 413.77701 Tm +(FRQWHQW) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 206.27998 413.77701 Tm +(OHQJWK) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 239.21999 413.77701 Tm +( SDUDPHWHU) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 294.69 413.77701 Tm +(QXPEHU) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 337.60001 413.77701 Tm +( ) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 461.40002 413.77701 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 98.341 398.7767 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 115.061 398.7767 Tm +(6\\VWHP) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 151.64101 398.7767 Tm +(6WDWXV) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 183.53101 398.7767 Tm +(5HJLVWHU) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 415.01102 398.7767 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 98.3421 383.7764 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 115.0621 383.7764 Tm +(0RGXOH) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 153.33211 383.7764 Tm +(SDVVZRUG) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 402.38211 383.7764 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 98.3407 368.78 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 115.0607 368.78 Tm +(0RGXOH) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 153.3307 368.78 Tm +($GGUHVV) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 386.85071 368.78 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 98.3407 353.78 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 115.0607 353.78 Tm +(5DQGRP) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 157.2207 353.78 Tm +(QXPEHU) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 197.4507 353.78 Tm +(JHQHUDWRU) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 482.95068 353.78 Tm +() Tj +ET +BT +/F6 10 Tf +0 0 0 rg +1 0 0 1 87.8407 332.78 Tm +(&KDSWHU) Tj +ET +BT +/F6 10 Tf +0 0 0 rg +1 0 0 1 130.5407 332.78 Tm +() Tj +ET +BT +/F6 10 Tf +0 0 0 rg +1 0 0 1 138.86069 332.78 Tm +(&RPPXQLFDWLRQ) Tj +ET +BT +/F6 10 Tf +0 0 0 rg +1 0 0 1 221.18069 332.78 Tm +(3URWRFRO) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 98.3407 311.78003 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 115.0607 311.78003 Tm +(3DFNHW) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 148.71069 311.78003 Tm +(IRUPDW) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 376.38068 311.78003 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 98.3407 296.77966 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 115.0607 296.77966 Tm +(&KHFN) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 145.9407 296.77966 Tm +(DQG) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 166.4807 296.77966 Tm +(5HVSRQVH) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 214.5407 296.77966 Tm +(RI) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 226.63069 296.77966 Tm +('DWD) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 251.36069 296.77966 Tm +(3DFNHWV) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 480.00067 296.77966 Tm +() Tj +ET +BT +/F6 10 Tf +0 0 0 rg +1 0 0 1 87.8407 275.77966 Tm +(&KDSWHU) Tj +ET +BT +/F6 10 Tf +0 0 0 rg +1 0 0 1 130.5407 275.77966 Tm +() Tj +ET +BT +/F6 10 Tf +0 0 0 rg +1 0 0 1 138.86069 275.77966 Tm +(0RGXOH) Tj +ET +BT +/F6 10 Tf +0 0 0 rg +1 0 0 1 178.94069 275.77966 Tm +(&RPPDQG) Tj +ET +BT +/F6 10 Tf +0 0 0 rg +1 0 0 1 232.68069 275.77966 Tm +(6\\VWHP) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 98.3407 254.77966 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 115.0607 254.77966 Tm +(6\\VWHP) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 151.6407 254.77966 Tm +(FODVV) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 176.8107 254.77966 Tm +(LQVWUXFWLRQV) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 470.6507 254.77966 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 98.3407 239.77942 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 115.0607 239.77942 Tm +(\)LQJHUSULQW) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 170.18069 239.77942 Tm +(3URFHVVLQJ) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 223.94069 239.77942 Tm +(,QVWUXFWLRQV) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 456.95068 239.77942 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 98.3418 224.77911 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 115.0618 224.77911 Tm +(2WKHU) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 145.0318 224.77911 Tm +(&RPPDQGV) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 351.35181 224.77911 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 98.3418 209.77881 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 115.0618 209.77881 Tm +(,QVWUXFWLRQ) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 169.1618 209.77881 Tm +(6HW) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 186.5018 209.77881 Tm +(6XPPDU\\) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 234.3118 209.77881 Tm +(7DEOH) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 441.85181 209.77881 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 108.8418 194.7785 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 133.96179 194.7785 Tm +(&ODVVLILFDWLRQ) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 198.08179 194.7785 Tm +(E\\) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 211.93179 194.7785 Tm +(IXQFWLRQ) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 443.75177 194.7785 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 108.8418 179.7782 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 133.96179 179.7782 Tm +(,Q) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 146.13179 179.7782 Tm +(RUGHU) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 174.83179 179.7782 Tm +(RI) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 186.92178 179.7782 Tm +(LQVWUXFWLRQ) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 240.21179 179.7782 Tm +(FRGH) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 444.93179 179.7782 Tm +() Tj +ET +BT +/F6 10 Tf +0 0 0 rg +1 0 0 1 87.8418 158.7782 Tm +($SSHQGL[) Tj +ET +BT +/F5 9 Tf +0 0 0 rg +1 0 0 1 98.3418 137.78027 Tm +() Tj +ET +BT +/F5 9 Tf +0 0 0 rg +1 0 0 1 105.8298 137.78027 Tm +('LPHQVLRQV) Tj +ET +BT +/F5 9 Tf +0 0 0 rg +1 0 0 1 158.0658 137.78027 Tm +(RI) Tj +ET +BT +/F5 9 Tf +0 0 0 rg +1 0 0 1 168.94679 137.78027 Tm +(WKH) Tj +ET +BT +/F5 9 Tf +0 0 0 rg +1 0 0 1 185.1738 137.78027 Tm +(VSOLW) Tj +ET +BT +/F5 9 Tf +0 0 0 rg +1 0 0 1 205.25279 137.78027 Tm +(PRWKHUERDUG) Tj +ET +BT +/F5 9 Tf +0 0 0 rg +1 0 0 1 503.05377 137.78027 Tm +() Tj +ET +BT +/F5 9 Tf +0 0 0 rg +1 0 0 1 98.3397 122.78027 Tm +() Tj +ET +BT +/F5 9 Tf +0 0 0 rg +1 0 0 1 105.8277 122.78027 Tm +(2SWLFDO) Tj +ET +BT +/F5 9 Tf +0 0 0 rg +1 0 0 1 137.9937 122.78027 Tm +(ILQJHUSULQW) Tj +ET +BT +/F5 9 Tf +0 0 0 rg +1 0 0 1 186.0267 122.78027 Tm +(VHQVRU) Tj +ET +BT +/F5 9 Tf +0 0 0 rg +1 0 0 1 216.7887 122.78027 Tm +( RU) Tj +ET +BT +/F5 9 Tf +0 0 0 rg +1 0 0 1 230.99069 122.78027 Tm +(DOO) Tj +ET +BT +/F5 9 Tf +0 0 0 rg +1 0 0 1 243.5817 122.78027 Tm +(LQ) Tj +ET +BT +/F5 9 Tf +0 0 0 rg +1 0 0 1 254.36369 122.78027 Tm +(RQH) Tj +ET +BT +/F5 9 Tf +0 0 0 rg +1 0 0 1 272.78668 122.78027 Tm +(PRGXOH ) Tj +ET +BT +/F5 9 Tf +0 0 0 rg +1 0 0 1 310.18167 122.78027 Tm +(GLPHQVLRQV) Tj +ET +BT +/F5 9 Tf +0 0 0 rg +1 0 0 1 361.38266 122.78027 Tm +( XQLW) Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 383.18967 122.78027 Tm +(00) Tj +ET +BT +/F5 9 Tf +0 0 0 rg +1 0 0 1 396.79468 122.78027 Tm +( ) Tj +ET +BT +/F5 9 Tf +0 0 0 rg +1 0 0 1 483.77069 122.78027 Tm +() Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 270.17999 45.86041 Tm +(WKH) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 280.0965 45.86041 Tm +(ILUVW) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 291.729 45.86041 Tm +() Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 296.30499 45.86041 Tm +(SDJHV) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 313.32199 45.86041 Tm +(RI) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 319.9715 45.86041 Tm +() Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 327.69348 45.86041 Tm +(3DJH) Tj +ET + +endstream +endobj +873 0 obj +<< +/Length 2 +>> +stream +q + +endstream +endobj +874 0 obj +<< +/Length 1464 +/Filter /FlateDecode +>> +stream +xXn7 }X#Ax)6 +vu&KRsӎ޸Exh):zxuF]^_nUǻϪ?=}K]S19v^|Nv]N;#Ÿ]¨:QIDM]c9uڑΪ`UÇhj߷?Ŭ3vp/FLO`؁Eؔ'Q;YG=Jw?Q DZɲ߶,[}Y## A\|=twǤb'\"C׿㲞ޞ F=(M;]WnI +]਀?aQGE :a@~!joZpsMj̬I:i, hc_l:a0iHXrm-Oegcu +u㌂iP!RY%VѶ0ѕhNm U{9ȺcH'z&4xK:\v݌on?yF PR^ekeO#vnFq&cq9*Kv9> ^ ;ohn8QY cOHK‰] | +G=h-Ea'V".[LR nkhN[t[P灡!,pci:zfw х.˚c*H(|(xrh~Zl6ZHElD:6> F@Ca9m On\hfԡ;ZP~CK!l񙘮B#BCe]*Phk_`yB {?izƍD];P4:2C$)Vj!VfJrD?6=5 :t-VLT6<##$[l'_ǐ+xNi!Xъ.963آZ6|#tTpD(Q!=^||iѭuwxYPYYa2 _;G(S$g9ԉusm1}$g9#E^Iɲ|d= d>>Gy6g9ItڢVG4Ut@C,L.؏Qe٬]j=Y`?Ji%&K /zTB,I]Ŝg6_WwXS'9OH u}hk=r0xXԣ|?EòϷm,D գ<,0yHh9@ +:\;[Xl'04ZX54[¯.LI[C έr=Mtlsoccoͷ*3^Y +endstream +endobj +875 0 obj +<< +/Length 28561 +>> +stream +Q +1 0 0 1 0 0 cm +BT +/F7 7.5 Tf +0 0 0 rg +1 0 0 1 377.35162 781.10431 Tm +(+DQJ]KRX) Tj +ET +BT +/F7 7.5 Tf +0 0 0 rg +1 0 0 1 415.64661 781.10431 Tm +(=KLDQ) Tj +ET +BT +/F7 7.5 Tf +0 0 0 rg +1 0 0 1 437.2991 781.10431 Tm +(7HFKQRORJ\\) Tj +ET +BT +/F7 7.5 Tf +0 0 0 rg +1 0 0 1 479.96661 781.10431 Tm +(&R) Tj +ET +BT +/F7 7.5 Tf +0 0 0 rg +1 0 0 1 495.21411 781.10431 Tm +(/WG) Tj +ET +BT +/F8 14 Tf +0 0 0 rg +1 0 0 1 234.36 736.88031 Tm +(&KDSWHU) Tj +ET +BT +/F8 14 Tf +0 0 0 rg +1 0 0 1 294.14001 736.88031 Tm +() Tj +ET +BT +/F8 14 Tf +0 0 0 rg +1 0 0 1 305.78802 736.88031 Tm +(2YHUYLHZ) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 108.96 690.86029 Tm +(=\)0) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 127.58 690.86029 Tm +(VHULHV) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 142.66501 690.86029 Tm +(VWDQG) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 157.44501 690.86029 Tm +(DORQH) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 171.77501 690.86029 Tm +(ILQJHUSULQW) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 198.46001 690.86029 Tm +(UHFRJQLWLRQ) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 226.73502 690.86029 Tm +(PRGXOH) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 246.01001 690.86029 Tm +(LV) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 250.99501 690.86029 Tm +(ODXQFKHG) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 273.95502 690.86029 Tm +(E\\) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 280.88 690.86029 Tm +(+DQJ]KRX) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 306.41 690.86029 Tm +(=KLDQ) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 320.845 690.86029 Tm +(7HFKQRORJ\\) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 349.29001 690.86029 Tm +(&R) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 359.45502 690.86029 Tm +(/WG) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 369.59503 690.86029 Tm +(,W) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 374.39502 690.86029 Tm +(LV) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 379.38 690.86029 Tm +(EDVHG) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 394.85001 690.86029 Tm +(RQ) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 402.26501 690.86029 Tm +(6\\QR&KLS) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 425.59003 690.86029 Tm +(KLJK) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 437.74503 690.86029 Tm +(VSHHG) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 453.23001 690.86029 Tm +('63) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 463.95001 690.86029 Tm +(SURFHVVRU) Tj +ET +BT +/F7 4.5 Tf +0 0 0 rg +1 0 0 1 87.8445 667.45581 Tm +($V) Tj +ET +BT +/F7 4.5 Tf +0 0 0 rg +1 0 0 1 94.0455 667.45581 Tm +(WKH) Tj +ET +BT +/F7 4.5 Tf +0 0 0 rg +1 0 0 1 102.159 667.45581 Tm +(FRUH) Tj +ET +BT +/F7 4.5 Tf +0 0 0 rg +1 0 0 1 113.814 667.45581 Tm +(FRPELQHG) Tj +ET +BT +/F7 4.5 Tf +0 0 0 rg +1 0 0 1 136.089 667.45581 Tm +(ZLWK) Tj +ET +BT +/F7 4.5 Tf +0 0 0 rg +1 0 0 1 146.3625 667.45581 Tm +(WKH) Tj +ET +BT +/F7 4.5 Tf +0 0 0 rg +1 0 0 1 154.476 667.45581 Tm +(RSWLFDO) Tj +ET +BT +/F7 4.5 Tf +0 0 0 rg +1 0 0 1 169.767 667.45581 Tm +(ILQJHUSULQW) Tj +ET +BT +/F7 4.5 Tf +0 0 0 rg +1 0 0 1 193.78349 667.45581 Tm +(VHQVRU) Tj +ET +BT +/F7 4.5 Tf +0 0 0 rg +1 0 0 1 209.16449 667.45581 Tm +(ZLWK) Tj +ET +BT +/F7 4.5 Tf +0 0 0 rg +1 0 0 1 219.43799 667.45581 Tm +(WKH) Tj +ET +BT +/F7 4.5 Tf +0 0 0 rg +1 0 0 1 227.55148 667.45581 Tm +<004600520050005300440051005C000A00560003> Tj +ET +BT +/F7 4.5 Tf +0 0 0 rg +1 0 0 1 251.34749 667.45581 Tm +(LQGHSHQGHQW) Tj +ET +BT +/F7 4.5 Tf +0 0 0 rg +1 0 0 1 279.5625 667.45581 Tm +(LQWHOOHFWXDO) Tj +ET +BT +/F7 4.5 Tf +0 0 0 rg +1 0 0 1 303.948 667.45581 Tm +(SURSHUW\\) Tj +ET +BT +/F7 4.5 Tf +0 0 0 rg +1 0 0 1 323.54999 667.45581 Tm +(ULJKWV) Tj +ET +BT +/F7 4.5 Tf +0 0 0 rg +1 0 0 1 338.27399 667.45581 Tm +(ZLWKRXW) Tj +ET +BT +/F7 4.5 Tf +0 0 0 rg +1 0 0 1 355.67548 667.45581 Tm +(WKH) Tj +ET +BT +/F7 4.5 Tf +0 0 0 rg +1 0 0 1 363.78897 667.45581 Tm +(QHHG) Tj +ET +BT +/F7 4.5 Tf +0 0 0 rg +1 0 0 1 375.58347 667.45581 Tm +(IRU) Tj +ET +BT +/F7 4.5 Tf +0 0 0 rg +1 0 0 1 382.88248 667.45581 Tm +(WKH) Tj +ET +BT +/F7 4.5 Tf +0 0 0 rg +1 0 0 1 390.99597 667.45581 Tm +(KRVW) Tj +ET +BT +/F7 4.5 Tf +0 0 0 rg +1 0 0 1 401.44946 667.45581 Tm +(FRPSXWHU) Tj +ET +BT +/F7 4.5 Tf +0 0 0 rg +1 0 0 1 423.27896 667.45581 Tm +(WR) Tj +ET +BT +/F7 4.5 Tf +0 0 0 rg +1 0 0 1 428.79596 667.45581 Tm +(SDUWLFLSDWH) Tj +ET +BT +/F7 4.5 Tf +0 0 0 rg +1 0 0 1 452.67746 667.45581 Tm +(LQ) Tj +ET +BT +/F7 4.5 Tf +0 0 0 rg +1 0 0 1 457.78946 667.45581 Tm +(PDQDJHPHQW) Tj +ET +BT +/F7 4.5 Tf +0 0 0 rg +1 0 0 1 488.65945 667.45581 Tm +(LW) Tj +ET +BT +/F7 4.5 Tf +0 0 0 rg +1 0 0 1 492.61496 667.45581 Tm +(KDV) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 87.8445 644.05133 Tm +($Q) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 95.4295 644.05133 Tm +(LQWHOOLJHQW) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 120.3945 644.05133 Tm +(PRGXOH) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 139.66949 644.05133 Tm +(ZLWK) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 151.08449 644.05133 Tm +(IXQFWLRQV) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 174.28949 644.05133 Tm +(VXFK) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 186.56448 644.05133 Tm +(DV) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 193.06448 644.05133 Tm +(ILQJHUSULQW) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 219.74948 644.05133 Tm +(HQWU\\) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 234.71948 644.05133 Tm +(LPDJH) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 250.68448 644.05133 Tm +(SURFHVVLQJ) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 278.95447 644.05133 Tm +(ILQJHUSULQW) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 305.63947 644.05133 Tm +(FRPSDULVRQ) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 336.12445 644.05133 Tm +(VHDUFK) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 352.99945 644.05133 Tm +(DQG) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 363.26944 644.05133 Tm +(WHPSODWH) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 385.66443 644.05133 Tm +(VWRUDJH) Tj +ET +BT +/F8 8 Tf +0 0 0 rg +1 0 0 1 87.84 601.76031 Tm +() Tj +ET +BT +/F8 8 Tf +0 0 0 rg +1 0 0 1 101.352 601.76031 Tm +(ZRUNLQJ) Tj +ET +BT +/F8 8 Tf +0 0 0 rg +1 0 0 1 136.584 601.76031 Tm +(SULQFLSOH) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 108.96 567.38031 Tm +(\)LQJHUSULQW) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 136.52 567.38031 Tm +(SURFHVVLQJ) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 163.45001 567.38031 Tm +(LQFOXGHV) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 184.20001 567.38031 Tm +(WZR) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 194.26001 567.38031 Tm +(SURFHVVHV) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 220.29001 567.38031 Tm +(ILQJHUSULQW) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 246.97501 567.38031 Tm +(ORJLQ) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 260.04501 567.38031 Tm +(SURFHVV) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 279.52002 567.38031 Tm +(DQG) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 289.79001 567.38031 Tm +(ILQJHUSULQW) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 316.47501 567.38031 Tm +(PDWFKLQJ) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 340.005 567.38031 Tm +(SURFHVV) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 359.48001 567.38031 Tm +(>ZKHUH) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 377.15002 567.38031 Tm +(ILQJHUSULQW) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 403.83502 567.38031 Tm +(PDWFKLQJ) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 427.36502 567.38031 Tm +(LV) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 432.35001 567.38031 Tm +(GLYLGHG) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 450.815 567.38031 Tm +(LQWR) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 461.32501 567.38031 Tm +(ILQJHUSULQW) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 488.01001 567.38031 Tm +(FRPSDULVRQ) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 517.15503 567.38031 Tm +( ) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 518.65503 567.38031 Tm +() Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 525.71503 567.38031 Tm +( ) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 87.83401 551.77728 Tm +(DQG) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 98.10401 551.77728 Tm +(ILQJHUSULQW) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 124.78901 551.77728 Tm +(VHDUFK) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 141.664 551.77728 Tm +( ) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 143.164 551.77728 Tm +(1) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 151.164 551.77728 Tm +( ) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 153.964 551.77728 Tm +(LQ) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 159.64401 551.77728 Tm +(WZR) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 169.70401 551.77728 Tm +(ZD\\V@) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 108.8403 536.1806 Tm +(:KHQ) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 125.2853 536.1806 Tm +(ILQJHUSULQW) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 154.63879 536.1806 Tm +(ORJLQ) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 170.48979 536.1806 Tm +(HQWHU) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 185.77979 536.1806 Tm +(HDFK) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 199.43628 536.1806 Tm +(ILQJHUSULQW) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 228.78978 536.1806 Tm +() Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 233.36578 536.1806 Tm +(WLPHV) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 250.55328 536.1806 Tm +(ZLOO) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 260.56329 536.1806 Tm +() Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 265.13928 536.1806 Tm +(7KH) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 276.1283 536.1806 Tm +(VHFRQG) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 296.3848 536.1806 Tm +(HQWU\\) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 311.37781 536.1806 Tm +(LPDJH) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 328.9393 536.1806 Tm +(LV) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 334.42279 536.1806 Tm +(SURFHVVHG) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 363.8038 536.1806 Tm +(DQG) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 375.1008 536.1806 Tm +(WKH) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 385.0173 536.1806 Tm +(FRPSRVLWH) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 413.40829 536.1806 Tm +(WHPSODWH) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 438.04279 536.1806 Tm +(LV) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 443.52628 536.1806 Tm +(VWRUHG) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 461.65979 536.1806 Tm +(LQ) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 467.90778 536.1806 Tm +(WKH) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 477.82428 536.1806 Tm +(PRGXOH) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 500.50079 536.1806 Tm +(:KHQ) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 516.9458 536.1806 Tm +(WKH) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 87.8298 520.57764 Tm +(ILQJHUSULQW) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 117.1833 520.57764 Tm +(LV) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 122.6668 520.57764 Tm +(PDWFKHG) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 148.3078 520.57764 Tm +(WKURXJK) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 170.90179 520.57764 Tm +(WKH) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 180.8183 520.57764 Tm +(ILQJHUSULQW) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 210.1718 520.57764 Tm +(KHDG) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 224.5708 520.57764 Tm +(VHQVRU) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 244.8438 520.57764 Tm +(WKH) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 254.7603 520.57764 Tm +(ILQJHUSULQW) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 284.1138 520.57764 Tm +(LPDJH) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 301.67529 520.57764 Tm +(WR) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 308.4183 520.57764 Tm +(EH) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 316.33279 520.57764 Tm +(YHULILHG) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 337.14481 520.57764 Tm +(LV) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 342.6283 520.57764 Tm +(HQWHUHG) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 364.4028 520.57764 Tm +(DQG) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 375.6998 520.57764 Tm +(SURFHVVHG) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 405.08081 520.57764 Tm +(DQG) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 416.37781 520.57764 Tm +(WKHQ) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 429.6933 520.57764 Tm +(PDWFKHG) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 453.86029 520.57764 Tm +(DQG) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 465.15729 520.57764 Tm +(FRPSDUHG) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 492.9213 520.57764 Tm +(ZLWK) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 505.47778 520.57764 Tm +(WKH) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 87.8298 504.97458 Tm +(ILQJHUSULQW) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 117.1833 504.97458 Tm +(WHPSODWH) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 141.81781 504.97458 Tm +(LQ) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 148.06581 504.97458 Tm +(WKH) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 157.98232 504.97458 Tm +(PRGXOH) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 179.18481 504.97458 Tm +( LI) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 185.57582 504.97458 Tm +(LW) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 190.41032 504.97458 Tm +(PDWFKHV) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 213.82932 504.97458 Tm +(ZLWK) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 226.38582 504.97458 Tm +(D) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 230.90132 504.97458 Tm +(WHPSODWH) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 255.53583 504.97458 Tm +(VSHFLILHG) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 279.93933 504.97458 Tm +(LQ) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 286.18732 504.97458 Tm +(WKH) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 296.10382 504.97458 Tm +(PRGXOH) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 318.78033 504.97458 Tm +(LW) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 323.61484 504.97458 Tm +(LV) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 329.09833 504.97458 Tm +(FDOOHG) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 345.57632 504.97458 Tm +(WKH) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 355.49283 504.97458 Tm +(ILQJHUSULQW) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 384.84631 504.97458 Tm +(FRPSDULVRQ) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 416.90582 504.97458 Tm +(PHWKRG) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 440.14883 504.97458 Tm +(WKDW) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 452.03433 504.97458 Tm +(LV) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 456.08783 504.97458 Tm +() Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 465.28384 504.97458 Tm +(PHWKRG) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 488.52686 504.97458 Tm +(LI) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 493.26785 504.97458 Tm +(LW) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 498.10236 504.97458 Tm +(PDWFKHV) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 87.81927 489.37158 Tm +(ZLWK) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 100.37578 489.37158 Tm +(PXOWLSOH) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 123.07428 489.37158 Tm +(WHPSODWHV) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 151.81728 489.37158 Tm +(LW) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 156.65178 489.37158 Tm +(LV) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 162.13528 489.37158 Tm +(FDOOHG) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 178.61328 489.37158 Tm +(ILQJHUSULQW) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 207.96678 489.37158 Tm +(VHDUFK) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 226.52928 489.37158 Tm +(PHWKRG) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 249.77228 489.37158 Tm +(WKDW) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 261.65778 489.37158 Tm +(LV) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 268.61526 489.37158 Tm +(1) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 278.84528 489.37158 Tm +(PRGH ) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 298.35376 489.37158 Tm +(WKH) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 308.27026 489.37158 Tm +(PRGXOH) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 329.47278 489.37158 Tm +(JLYHV) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 344.23477 489.37158 Tm +(D) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 348.75027 489.37158 Tm +(PDWFKLQJ) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 374.63327 489.37158 Tm +(UHVXOW) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 390.87476 489.37158 Tm +( SDVV) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 405.69174 489.37158 Tm +(RU) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 412.72073 489.37158 Tm +(IDLO ) Tj +ET +BT +/F8 7 Tf +0 0 0 rg +1 0 0 1 87.84 450.98029 Tm +() Tj +ET +BT +/F8 7 Tf +0 0 0 rg +1 0 0 1 99.66299 450.98029 Tm +(2UGHULQJ) Tj +ET +BT +/F8 7 Tf +0 0 0 rg +1 0 0 1 133.144 450.98029 Tm +(,QIRUPDWLRQ) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 108.84 416.60031 Tm +(7KH) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 118.82999 416.60031 Tm +(FRPSOHWH) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 142.03999 416.60031 Tm +(PRGHO) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 158.22499 416.60031 Tm +(RI) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 164.26999 416.60031 Tm +(WKH) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 173.28499 416.60031 Tm +(ILQJHUSULQW) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 199.96999 416.60031 Tm +(PRGXOH) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 219.24498 416.60031 Tm +(RI) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 225.28998 416.60031 Tm +(RXU) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 234.76997 416.60031 Tm +(FRPSDQ\\) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 257.68997 416.60031 Tm +(DGRSWV) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 275.16998 416.60031 Tm +(WKH) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 284.185 416.60031 Tm +(IROORZLQJ) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 307.22 416.60031 Tm +(UXOHV) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 321.51999 416.60031 Tm +(:KHQ) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 336.47 416.60031 Tm +(RUGHULQJ) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 358.27499 416.60031 Tm +(SURGXFWV) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 380.505 416.60031 Tm +(IURP) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 393.29001 416.60031 Tm +(RXU) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 402.77002 416.60031 Tm +(FRPSDQ\\) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 427.03003 416.60031 Tm +(SOHDVH) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 443.53503 416.60031 Tm +(ILOO) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 450.42505 416.60031 Tm +(LQ) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 456.10504 416.60031 Tm +(WKH) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 465.12006 416.60031 Tm +(FRPSOHWH) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 488.33005 416.60031 Tm +(PRGHO) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 504.51505 416.60031 Tm +(QXPEHU) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 524.63007 416.60031 Tm +(DV) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 87.84 400.99731 Tm +(UHTXLUHG) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 110.78 400.99731 Tm +(VR) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 117.5 400.99731 Tm +(WKDW) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 128.30499 400.99731 Tm +(ZH) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 136.355 400.99731 Tm +(FDQ) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 145.95 400.99731 Tm +(SURYLGH) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 165.14 400.99731 Tm +(\\RX) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 175.105 400.99731 Tm +(ZLWK) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 186.51999 400.99731 Tm +(EHWWHU) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 202.20999 400.99731 Tm +(VHUYLFH) Tj +ET +BT +/F7 13.5 Tf +0 0 0 rg +1 0 0 1 168.84 376.3403 Tm +(=\)0) Tj +ET +BT +/F7 13.5 Tf +0 0 0 rg +1 0 0 1 199.323 376.3403 Tm +() Tj +ET +BT +/F7 13.5 Tf +0 0 0 rg +1 0 0 1 207.17999 376.3403 Tm +([) Tj +ET +BT +/F7 14 Tf +0 0 0 rg +1 0 0 1 281.55377 376.3403 Tm +([) Tj +ET +BT +/F7 13.5 Tf +0 0 0 rg +1 0 0 1 309.53055 376.3403 Tm +([) Tj +ET +BT +/F7 13.5 Tf +0 0 0 rg +1 0 0 1 320.18204 376.3403 Tm +() Tj +ET +BT +/F7 13.5 Tf +0 0 0 rg +1 0 0 1 328.03903 376.3403 Tm +([[[) Tj +ET +BT +/F7 13.5 Tf +0 0 0 rg +1 0 0 1 352.97354 376.3403 Tm +() Tj +ET +BT +/F7 13.5 Tf +0 0 0 rg +1 0 0 1 357.32056 376.3403 Tm +(9[[) Tj +ET +BT +/F7 6.5 Tf +0 0 0 rg +1 0 0 1 415.8645 350.30042 Tm +(6RIWZDUH) Tj +ET +BT +/F7 6.5 Tf +0 0 0 rg +1 0 0 1 444.74399 350.30042 Tm +(YHUVLRQ) Tj +ET +BT +/F7 6.5 Tf +0 0 0 rg +1 0 0 1 468.82648 350.30042 Tm +( FDQ) Tj +ET +BT +/F7 6.5 Tf +0 0 0 rg +1 0 0 1 483.24997 350.30042 Tm +(EH) Tj +ET +BT +/F7 6.5 Tf +0 0 0 rg +1 0 0 1 492.60345 350.30042 Tm +(RPLWWHG ) Tj +ET +BT +/F7 8 Tf +0 0 0 rg +1 0 0 1 380.75778 326.90009 Tm +(/HDG) Tj +ET +BT +/F7 8 Tf +0 0 0 rg +1 0 0 1 400.94977 326.90009 Tm +(OHQJWK) Tj +ET +BT +/F7 8 Tf +0 0 0 rg +1 0 0 1 427.30176 326.90009 Tm +( XQLW) Tj +ET +BT +/F7 8 Tf +0 0 0 rg +1 0 0 1 446.62177 326.90009 Tm +(PP) Tj +ET +BT +/F7 8 Tf +0 0 0 rg +1 0 0 1 461.58176 326.90009 Tm +() Tj +ET +BT +/F7 8 Tf +0 0 0 rg +1 0 0 1 465.80576 326.90009 Tm +(FDQ) Tj +ET +BT +/F7 8 Tf +0 0 0 rg +1 0 0 1 481.15775 326.90009 Tm +(EH) Tj +ET +BT +/F7 8 Tf +0 0 0 rg +1 0 0 1 492.66974 326.90009 Tm +(RPLWWHG ) Tj +ET +BT +/F7 4 Tf +0 0 0 rg +1 0 0 1 339.8403 303.49976 Tm +(\)LQJHUSULQW) Tj +ET +BT +/F7 4 Tf +0 0 0 rg +1 0 0 1 361.88831 303.49976 Tm +(OLEUDU\\) Tj +ET +BT +/F7 4 Tf +0 0 0 rg +1 0 0 1 375.04031 303.49976 Tm +(FDSDFLW\\) Tj +ET +BT +/F7 7.5 Tf +0 0 0 rg +1 0 0 1 434.332 303.49976 Tm +($) Tj +ET +BT +/F7 7.5 Tf +0 0 0 rg +1 0 0 1 439.12451 303.49976 Tm +() Tj +ET +BT +/F7 7.5 Tf +0 0 0 rg +1 0 0 1 441.13452 303.49976 Tm +() Tj +ET +BT +/F7 7.5 Tf +0 0 0 rg +1 0 0 1 455.95453 303.49976 Tm +(SLHFHV) Tj +ET +BT +/F7 7.5 Tf +0 0 0 rg +1 0 0 1 433.86041 280.09949 Tm +(%) Tj +ET +BT +/F7 7.5 Tf +0 0 0 rg +1 0 0 1 438.73541 280.09949 Tm +() Tj +ET +BT +/F7 7.5 Tf +0 0 0 rg +1 0 0 1 440.74542 280.09949 Tm +() Tj +ET +BT +/F7 7.5 Tf +0 0 0 rg +1 0 0 1 455.56543 280.09949 Tm +(SLHFHV) Tj +ET +BT +/F7 6 Tf +0 0 0 rg +1 0 0 1 312.54028 233.29889 Tm +(,QWHUIDFH) Tj +ET +BT +/F7 6 Tf +0 0 0 rg +1 0 0 1 339.56427 233.29889 Tm +(W\\SH) Tj +ET +BT +/F7 10 Tf +0 0 0 rg +1 0 0 1 391.20306 233.29889 Tm +(8) Tj +ET +BT +/F7 10 Tf +0 0 0 rg +1 0 0 1 398.51306 233.29889 Tm +() Tj +ET +BT +/F7 10 Tf +0 0 0 rg +1 0 0 1 403.79306 233.29889 Tm +(86%) Tj +ET +BT +/F7 10 Tf +0 0 0 rg +1 0 0 1 392.3414 209.89862 Tm +(6) Tj +ET +BT +/F7 10 Tf +0 0 0 rg +1 0 0 1 397.83139 209.89862 Tm +() Tj +ET +BT +/F7 10 Tf +0 0 0 rg +1 0 0 1 403.11139 209.89862 Tm +(VHULDO) Tj +ET +BT +/F7 10 Tf +0 0 0 rg +1 0 0 1 431.04138 209.89862 Tm +( ) Tj +ET +BT +/F7 10 Tf +0 0 0 rg +1 0 0 1 434.04138 209.89862 Tm +(6HULHV) Tj +ET +BT +/F7 10 Tf +0 0 0 rg +1 0 0 1 462.31137 209.89862 Tm +() Tj +ET +BT +/F7 10 Tf +0 0 0 rg +1 0 0 1 464.99136 209.89862 Tm +(8$57 ) Tj +ET +BT +/F7 10 Tf +0 0 0 rg +1 0 0 1 354.48248 186.49829 Tm +() Tj +ET +BT +/F7 10 Tf +0 0 0 rg +1 0 0 1 360.20248 186.49829 Tm +() Tj +ET +BT +/F7 10 Tf +0 0 0 rg +1 0 0 1 365.48248 186.49829 Tm +(6SOLW) Tj +ET +BT +/F7 9 Tf +0 0 0 rg +1 0 0 1 354.52731 163.09802 Tm +() Tj +ET +BT +/F7 9 Tf +0 0 0 rg +1 0 0 1 359.67532 163.09802 Tm +() Tj +ET +BT +/F7 9 Tf +0 0 0 rg +1 0 0 1 364.42734 163.09802 Tm +($OO) Tj +ET +BT +/F7 9 Tf +0 0 0 rg +1 0 0 1 377.72034 163.09802 Tm +(LQ) Tj +ET +BT +/F7 9 Tf +0 0 0 rg +1 0 0 1 388.50235 163.09802 Tm +(RQH) Tj +ET +BT +/F7 6 Tf +0 0 0 rg +1 0 0 1 286.25879 186.49829 Tm +(6WUXFWXUH) Tj +ET +BT +/F7 6 Tf +0 0 0 rg +1 0 0 1 314.08078 186.49829 Tm +(W\\SH) Tj +ET +BT +/F7 7.5 Tf +0 0 0 rg +1 0 0 1 255.8434 139.69769 Tm +(RSWLFV) Tj +ET +BT +/F7 7.5 Tf +0 0 0 rg +1 0 0 1 278.77841 139.69769 Tm +() Tj +ET +BT +/F7 7.5 Tf +0 0 0 rg +1 0 0 1 289.30841 139.69769 Tm +(VHULHV) Tj +ET +BT +/F7 4 Tf +0 0 0 rg +1 0 0 1 203.3434 116.29742 Tm +(\)LQJHUSULQW) Tj +ET +BT +/F7 4 Tf +0 0 0 rg +1 0 0 1 225.3914 116.29742 Tm +(UHFRJQLWLRQ) Tj +ET +BT +/F7 4 Tf +0 0 0 rg +1 0 0 1 248.0114 116.29742 Tm +(PRGXOH) Tj +ET +BT +/F7 4 Tf +0 0 0 rg +1 0 0 1 263.4314 116.29742 Tm +(RI) Tj +ET +BT +/F7 4 Tf +0 0 0 rg +1 0 0 1 268.2674 116.29742 Tm +(+DQJ]KRX) Tj +ET +BT +/F7 4 Tf +0 0 0 rg +1 0 0 1 288.69141 116.29742 Tm +(=KLDQ) Tj +ET +BT +/F7 4 Tf +0 0 0 rg +1 0 0 1 300.23941 116.29742 Tm +(7HFKQRORJ\\) Tj +ET +BT +/F7 4 Tf +0 0 0 rg +1 0 0 1 322.99542 116.29742 Tm +(&RPSDQ\\) Tj +ET +BT +/F8 4 Tf +0 0 0 rg +1 0 0 1 154.2 97.28027 Tm +(1RWH) Tj +ET +BT +/F8 4 Tf +0 0 0 rg +1 0 0 1 166.20799 97.28027 Tm +() Tj +ET +BT +/F8 4 Tf +0 0 0 rg +1 0 0 1 168.49599 97.28027 Tm +( ) Tj +ET +BT +/F8 4 Tf +0 0 0 rg +1 0 0 1 170.89198 97.28027 Tm +(7KH) Tj +ET +BT +/F8 4 Tf +0 0 0 rg +1 0 0 1 179.23999 97.28027 Tm +(OHDG) Tj +ET +BT +/F8 4 Tf +0 0 0 rg +1 0 0 1 188.812 97.28027 Tm +(OHQJWK) Tj +ET +BT +/F8 4 Tf +0 0 0 rg +1 0 0 1 202.95999 97.28027 Tm +(UHIHUV) Tj +ET +BT +/F8 4 Tf +0 0 0 rg +1 0 0 1 215.896 97.28027 Tm +(WR) Tj +ET +BT +/F8 4 Tf +0 0 0 rg +1 0 0 1 221.14799 97.28027 Tm +(WKH) Tj +ET +BT +/F8 4 Tf +0 0 0 rg +1 0 0 1 228.916 97.28027 Tm +(OHQJWK) Tj +ET +BT +/F8 4 Tf +0 0 0 rg +1 0 0 1 243.064 97.28027 Tm +(RI) Tj +ET +BT +/F8 4 Tf +0 0 0 rg +1 0 0 1 248.12799 97.28027 Tm +(WKH) Tj +ET +BT +/F8 4 Tf +0 0 0 rg +1 0 0 1 255.896 97.28027 Tm +(FDEOH) Tj +ET +BT +/F8 4 Tf +0 0 0 rg +1 0 0 1 267.52399 97.28027 Tm +(FRQQHFWHG) Tj +ET +BT +/F8 4 Tf +0 0 0 rg +1 0 0 1 289.40399 97.28027 Tm +(EHWZHHQ) Tj +ET +BT +/F8 4 Tf +0 0 0 rg +1 0 0 1 307.85599 97.28027 Tm +(WKH) Tj +ET +BT +/F8 4 Tf +0 0 0 rg +1 0 0 1 315.62399 97.28027 Tm +(PRGXOH) Tj +ET +BT +/F8 4 Tf +0 0 0 rg +1 0 0 1 331.81198 97.28027 Tm +(PDLQ) Tj +ET +BT +/F8 4 Tf +0 0 0 rg +1 0 0 1 343.04398 97.28027 Tm +(ERDUG) Tj +ET +BT +/F8 4 Tf +0 0 0 rg +1 0 0 1 355.85599 97.28027 Tm +(DQG) Tj +ET +BT +/F8 4 Tf +0 0 0 rg +1 0 0 1 364.47198 97.28027 Tm +(WKH) Tj +ET +BT +/F8 4 Tf +0 0 0 rg +1 0 0 1 372.23999 97.28027 Tm +(RSWLFDO) Tj +ET +BT +/F8 4 Tf +0 0 0 rg +1 0 0 1 386.936 97.28027 Tm +(ILQJHUSULQW) Tj +ET +BT +/F8 4 Tf +0 0 0 rg +1 0 0 1 410.01599 97.28027 Tm +(VHQVRU) Tj +ET +BT +/F8 4 Tf +0 0 0 rg +1 0 0 1 425.45599 97.28027 Tm +(,QWHJUDO) Tj +ET +BT +/F8 4 Tf +0 0 0 rg +1 0 0 1 442.76401 97.28027 Tm +(PRGXOHV) Tj +ET +BT +/F8 4 Tf +0 0 0 rg +1 0 0 1 460.94 97.28027 Tm +(GR) Tj +ET +BT +/F8 4 Tf +0 0 0 rg +1 0 0 1 466.98801 97.28027 Tm +(QRW) Tj +ET +BT +/F8 4 Tf +0 0 0 rg +1 0 0 1 474.86801 97.28027 Tm +(KDYH) Tj +ET +BT +/F8 4 Tf +0 0 0 rg +1 0 0 1 485.59201 97.28027 Tm +(WKLV) Tj +ET +BT +/F8 4 Tf +0 0 0 rg +1 0 0 1 494.20401 97.28027 Tm +(OHDG) Tj +ET +BT +/F8 4 Tf +0 0 0 rg +1 0 0 1 182.34 81.6803 Tm +() Tj +ET +BT +/F8 4 Tf +0 0 0 rg +1 0 0 1 184.62799 81.6803 Tm +( ) Tj +ET +BT +/F8 4 Tf +0 0 0 rg +1 0 0 1 187.02399 81.6803 Tm +(VRIWZDUH) Tj +ET +BT +/F8 4 Tf +0 0 0 rg +1 0 0 1 205.83199 81.6803 Tm +(YHUVLRQ) Tj +ET +BT +/F8 4 Tf +0 0 0 rg +1 0 0 1 221.63998 81.6803 Tm +(FDQ) Tj +ET +BT +/F8 4 Tf +0 0 0 rg +1 0 0 1 229.77998 81.6803 Tm +(EH) Tj +ET +BT +/F8 4 Tf +0 0 0 rg +1 0 0 1 235.71599 81.6803 Tm +(RPLWWHG) Tj +ET +BT +/F8 4 Tf +0 0 0 rg +1 0 0 1 252.74799 81.6803 Tm +(ZKHQ) Tj +ET +BT +/F8 4 Tf +0 0 0 rg +1 0 0 1 264.83197 81.6803 Tm +(RUGHULQJ) Tj +ET +BT +/F8 4 Tf +0 0 0 rg +1 0 0 1 283.25598 81.6803 Tm +(IRU) Tj +ET +BT +/F8 4 Tf +0 0 0 rg +1 0 0 1 290.13599 81.6803 Tm +(WKH) Tj +ET +BT +/F8 4 Tf +0 0 0 rg +1 0 0 1 297.90399 81.6803 Tm +(ILUVW) Tj +ET +BT +/F8 4 Tf +0 0 0 rg +1 0 0 1 307.25198 81.6803 Tm +(WLPH) Tj +ET +BT +/F8 4 Tf +0 0 0 rg +1 0 0 1 317.53998 81.6803 Tm +(RU) Tj +ET +BT +/F8 4 Tf +0 0 0 rg +1 0 0 1 322.87198 81.6803 Tm +(QRQ) Tj +ET +BT +/F8 4 Tf +0 0 0 rg +1 0 0 1 331.89197 81.6803 Tm +(VSHFLILHG) Tj +ET +BT +/F8 4 Tf +0 0 0 rg +1 0 0 1 350.75598 81.6803 Tm +(YHUVLRQ) Tj +ET +BT +/F8 4 Tf +0 0 0 rg +1 0 0 1 367.70398 81.6803 Tm +(WKDW) Tj +ET +BT +/F8 4 Tf +0 0 0 rg +1 0 0 1 377.25998 81.6803 Tm +(LV) Tj +ET +BT +/F8 4 Tf +0 0 0 rg +1 0 0 1 382.64798 81.6803 Tm +(WKH) Tj +ET +BT +/F8 4 Tf +0 0 0 rg +1 0 0 1 390.41599 81.6803 Tm +(ODWHVW) Tj +ET +BT +/F8 4 Tf +0 0 0 rg +1 0 0 1 402.91599 81.6803 Tm +(YHUVLRQ) Tj +ET +BT +/F8 4 Tf +0 0 0 rg +1 0 0 1 418.724 81.6803 Tm +(RI) Tj +ET +BT +/F8 4 Tf +0 0 0 rg +1 0 0 1 423.78799 81.6803 Tm +(RXU) Tj +ET +BT +/F8 4 Tf +0 0 0 rg +1 0 0 1 431.74799 81.6803 Tm +(FRPSDQ\\) Tj +ET +BT +/F8 4 Tf +0 0 0 rg +1 0 0 1 451.09998 81.6803 Tm +(LV) Tj +ET +BT +/F8 4 Tf +0 0 0 rg +1 0 0 1 455.34796 81.6803 Tm +(DGRSWHG) Tj +ET +BT +/F8 4 Tf +0 0 0 rg +1 0 0 1 472.97595 81.6803 Tm +(E\\) Tj +ET +BT +/F8 4 Tf +0 0 0 rg +1 0 0 1 478.82394 81.6803 Tm +(GHIDXOW) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 270.17999 45.86041 Tm +(WKH) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 280.0965 45.86041 Tm +(ILUVW) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 291.729 45.86041 Tm +() Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 296.30499 45.86041 Tm +(SDJHV) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 313.32199 45.86041 Tm +(RI) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 319.9715 45.86041 Tm +() Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 327.69348 45.86041 Tm +(3DJH) Tj +ET + +endstream +endobj +876 0 obj +<< +/Subtype /TrueType +/FontDescriptor 2840 0 R +/LastChar 109 +/Widths [278 0 0 0 0 0 0 0 0 0 +0 0 0 0 278 0 0 556 556 556 +556 556 556 556 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 +0 0 556 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 889] +/BaseFont /Arial-BoldMT +/FirstChar 32 +/Encoding /WinAnsiEncoding +/Type /Font +>> +endobj +877 0 obj +<< +/Length 2 +>> +stream +q + +endstream +endobj +878 0 obj +<< +/Length 1135 +/Filter /FlateDecode +>> +stream +xWj#9}D]U00qaβě$3![R_ݖڎYNU*Iz+>|?m7nU<עny'o7ϟWIs %R/'Gq~W\AU_y IE*`UOX?VGCT(󦪛IF4k6jk*$A +2p)4i g c0 >i(y Q7.q۪^!{/Ybc|Ҵ1A*?7Uz g4^hđxzTݮX(2tby# WI-d4cmHݎ%Oo/W_/q9/࢈Kߪk6My1"x6Id"WȴNY}jӌz >,pBr]C7n@k6h먿-k{>Q |Z]r6XD=큁]Yׂ:Ҵ2lhB( ACU(tdĀRZh8{Xhj%ϱ1OgnRQ~j9cf;9xOR{rp4ky3>!SڞnL +Jnr(0tuڀ: jf:%|߇M("5`)k0VmD6zYguls]bns%RO4ɽ֧IgЌFi'Hw ӻrJjCZN ?)dh-` +endstream +endobj +879 0 obj +<< +/Length 13529 +>> +stream +Q +1 0 0 1 0 0 cm +BT +/F6 7.5 Tf +0 0 0 rg +1 0 0 1 377.35162 781.10431 Tm +(+DQJ]KRX) Tj +ET +BT +/F6 7.5 Tf +0 0 0 rg +1 0 0 1 415.64661 781.10431 Tm +(=KLDQ) Tj +ET +BT +/F6 7.5 Tf +0 0 0 rg +1 0 0 1 437.2991 781.10431 Tm +(7HFKQRORJ\\) Tj +ET +BT +/F6 7.5 Tf +0 0 0 rg +1 0 0 1 479.96661 781.10431 Tm +(&R) Tj +ET +BT +/F6 7.5 Tf +0 0 0 rg +1 0 0 1 495.21411 781.10431 Tm +(/WG) Tj +ET +BT +/F7 13.5 Tf +0 0 0 rg +1 0 0 1 182.16 736.88031 Tm +(&KDSWHU) Tj +ET +BT +/F7 13.5 Tf +0 0 0 rg +1 0 0 1 239.80501 736.88031 Tm +() Tj +ET +BT +/F7 13.5 Tf +0 0 0 rg +1 0 0 1 251.037 736.88031 Tm +(0DLQ) Tj +ET +BT +/F7 13.5 Tf +0 0 0 rg +1 0 0 1 288.41852 736.88031 Tm +(WHFKQLFDO) Tj +ET +BT +/F7 13.5 Tf +0 0 0 rg +1 0 0 1 353.77203 736.88031 Tm +(LQGLFDWRUV) Tj +ET +BT +/F7 8 Tf +0 0 0 rg +1 0 0 1 87.84 694.76031 Tm +(6XSSO\\) Tj +ET +BT +/F7 8 Tf +0 0 0 rg +1 0 0 1 116.70399 694.76031 Tm +(YROWDJH) Tj +ET +BT +/F6 8 Tf +0 0 0 rg +1 0 0 1 149.02399 694.76031 Tm +('&) Tj +ET +BT +/F6 8 Tf +0 0 0 rg +1 0 0 1 161.99998 694.76031 Tm +(a9) Tj +ET +BT +/F7 6.5 Tf +0 0 0 rg +1 0 0 1 87.84 679.1604 Tm +(6XSSO\\) Tj +ET +BT +/F7 6.5 Tf +0 0 0 rg +1 0 0 1 111.29199 679.1604 Tm +(FXUUHQW) Tj +ET +BT +/F6 6.5 Tf +0 0 0 rg +1 0 0 1 105.7194 663.56061 Tm +(:RUNLQJ) Tj +ET +BT +/F6 6.5 Tf +0 0 0 rg +1 0 0 1 133.2339 663.56061 Tm +(FXUUHQW) Tj +ET +BT +/F6 6.5 Tf +0 0 0 rg +1 0 0 1 159.2014 663.56061 Tm +(P$) Tj +ET +BT +/F6 8 Tf +0 0 0 rg +1 0 0 1 105.7194 647.96082 Tm +(3HDN) Tj +ET +BT +/F6 8 Tf +0 0 0 rg +1 0 0 1 125.9114 647.96082 Tm +(FXUUHQW) Tj +ET +BT +/F6 8 Tf +0 0 0 rg +1 0 0 1 157.8714 647.96082 Tm +(P$) Tj +ET +BT +/F7 6 Tf +0 0 0 rg +1 0 0 1 87.84 624.56049 Tm +(\)LQJHUSULQW) Tj +ET +BT +/F7 6 Tf +0 0 0 rg +1 0 0 1 123.432 624.56049 Tm +(LPDJH) Tj +ET +BT +/F7 6 Tf +0 0 0 rg +1 0 0 1 143.68201 624.56049 Tm +(HQWU\\) Tj +ET +BT +/F7 6 Tf +0 0 0 rg +1 0 0 1 161.472 624.56049 Tm +(WLPH) Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 177.054 624.56049 Tm +() Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 190.51801 624.56049 Tm +(VHFRQGV) Tj +ET +BT +/F7 8.5 Tf +0 0 0 rg +1 0 0 1 87.84 601.16022 Tm +(:LQGRZ) Tj +ET +BT +/F7 8.5 Tf +0 0 0 rg +1 0 0 1 124.36449 601.16022 Tm +(DUHD) Tj +ET +BT +/F6 8.5 Tf +0 0 0 rg +1 0 0 1 148.14749 601.16022 Tm +() Tj +ET +BT +/F8 8.5 Tf +0 0 0 rg +1 0 0 1 160.0815 601.16022 Tm +<04A90001> Tj +ET +BT +/F6 8.5 Tf +0 0 0 rg +1 0 0 1 170.4855 601.16022 Tm +() Tj +ET +BT +/F6 8.5 Tf +0 0 0 rg +1 0 0 1 182.41951 601.16022 Tm +(PP) Tj +ET +BT +/F7 6.5 Tf +0 0 0 rg +1 0 0 1 87.84 577.76001 Tm +(0DWFK) Tj +ET +BT +/F7 6.5 Tf +0 0 0 rg +1 0 0 1 110.018 577.76001 Tm +(PHWKRG) Tj +ET +BT +/F6 6.5 Tf +0 0 0 rg +1 0 0 1 105.7204 562.16022 Tm +(&RPSDULVRQ) Tj +ET +BT +/F6 6.5 Tf +0 0 0 rg +1 0 0 1 144.59689 562.16022 Tm +(PHWKRG) Tj +ET +BT +/F6 6.5 Tf +0 0 0 rg +1 0 0 1 170.3239 562.16022 Tm +(  ) Tj +ET +BT +/F6 8 Tf +0 0 0 rg +1 0 0 1 105.7204 546.5603 Tm +(6HDUFK) Tj +ET +BT +/F6 8 Tf +0 0 0 rg +1 0 0 1 133.2804 546.5603 Tm +(PHWKRG) Tj +ET +BT +/F6 8 Tf +0 0 0 rg +1 0 0 1 164.9444 546.5603 Tm +( 1 ) Tj +ET +BT +/F7 8.5 Tf +0 0 0 rg +1 0 0 1 87.84 530.96039 Tm +(\)HDWXUH) Tj +ET +BT +/F7 8.5 Tf +0 0 0 rg +1 0 0 1 123.03 530.96039 Tm +(ILOH) Tj +ET +BT +/F6 8.5 Tf +0 0 0 rg +1 0 0 1 138.9505 530.96039 Tm +() Tj +ET +BT +/F6 8.5 Tf +0 0 0 rg +1 0 0 1 155.74651 530.96039 Tm +(E\\WHV) Tj +ET +BT +/F7 7.5 Tf +0 0 0 rg +1 0 0 1 87.84 515.3606 Tm +(7HPSODWH) Tj +ET +BT +/F7 7.5 Tf +0 0 0 rg +1 0 0 1 125.1825 515.3606 Tm +(ILOH) Tj +ET +BT +/F6 7.5 Tf +0 0 0 rg +1 0 0 1 139.23 515.3606 Tm +() Tj +ET +BT +/F6 7.5 Tf +0 0 0 rg +1 0 0 1 154.04999 515.3606 Tm +(E\\WHV) Tj +ET +BT +/F7 8.5 Tf +0 0 0 rg +1 0 0 1 87.84 491.9603 Tm +(VWRUDJH) Tj +ET +BT +/F6 8.5 Tf +0 0 0 rg +1 0 0 1 122.8345 491.9603 Tm +() Tj +ET +BT +/F6 8.5 Tf +0 0 0 rg +1 0 0 1 157.37849 491.9603 Tm +(SLHFHV) Tj +ET +BT +/F7 8.5 Tf +0 0 0 rg +1 0 0 1 87.841 468.56 Tm +(6HFXULW\\) Tj +ET +BT +/F7 8.5 Tf +0 0 0 rg +1 0 0 1 124.68851 468.56 Tm +(/HYHO) Tj +ET +BT +/F6 8.5 Tf +0 0 0 rg +1 0 0 1 149.38951 468.56 Tm +(/HYHO) Tj +ET +BT +/F6 8.5 Tf +0 0 0 rg +1 0 0 1 172.15251 468.56 Tm +() Tj +ET +BT +/F6 8.5 Tf +0 0 0 rg +1 0 0 1 179.22452 468.56 Tm +( IURP) Tj +ET +BT +/F6 8.5 Tf +0 0 0 rg +1 0 0 1 203.50902 468.56 Tm +(ORZ) Tj +ET +BT +/F6 8.5 Tf +0 0 0 rg +1 0 0 1 219.73552 468.56 Tm +(WR) Tj +ET +BT +/F6 8.5 Tf +0 0 0 rg +1 0 0 1 230.15652 468.56 Tm +(KLJK) Tj +ET +BT +/F6 8.5 Tf +0 0 0 rg +1 0 0 1 252.57103 468.56 Tm +() Tj +ET +BT +/F6 8.5 Tf +0 0 0 rg +1 0 0 1 261.92102 468.56 Tm +() Tj +ET +BT +/F6 8.5 Tf +0 0 0 rg +1 0 0 1 271.27103 468.56 Tm +() Tj +ET +BT +/F6 8.5 Tf +0 0 0 rg +1 0 0 1 280.62103 468.56 Tm +() Tj +ET +BT +/F6 8.5 Tf +0 0 0 rg +1 0 0 1 289.97104 468.56 Tm +( ) Tj +ET +BT +/F7 6.5 Tf +0 0 0 rg +1 0 0 1 87.841 445.1597 Tm +(\)DOVH) Tj +ET +BT +/F7 6.5 Tf +0 0 0 rg +1 0 0 1 106.08 445.1597 Tm +(5HFRJQLWLRQ) Tj +ET +BT +/F7 6.5 Tf +0 0 0 rg +1 0 0 1 146.731 445.1597 Tm +(5DWH) Tj +ET +BT +/F7 6.5 Tf +0 0 0 rg +1 0 0 1 163.2995 445.1597 Tm +( \)$5 ) Tj +ET +BT +/F6 6.5 Tf +0 0 0 rg +1 0 0 1 181.9025 445.1597 Tm +() Tj +ET +BT +/F6 6.5 Tf +0 0 0 rg +1 0 0 1 209.32599 445.1597 Tm +( ZKHQ) Tj +ET +BT +/F6 6.5 Tf +0 0 0 rg +1 0 0 1 229.77499 445.1597 Tm +(WKH) Tj +ET +BT +/F6 6.5 Tf +0 0 0 rg +1 0 0 1 241.49449 445.1597 Tm +(VDIHW\\) Tj +ET +BT +/F6 6.5 Tf +0 0 0 rg +1 0 0 1 261.508 445.1597 Tm +(OHYHO) Tj +ET +BT +/F6 6.5 Tf +0 0 0 rg +1 0 0 1 277.186 445.1597 Tm +(LV) Tj +ET +BT +/F6 6.5 Tf +0 0 0 rg +1 0 0 1 283.6665 445.1597 Tm +( ) Tj +ET +BT +/F7 6 Tf +0 0 0 rg +1 0 0 1 87.841 421.7594 Tm +($XWKHQWLFLW\\) Tj +ET +BT +/F7 6 Tf +0 0 0 rg +1 0 0 1 126.883 421.7594 Tm +(5HMHFWLRQ) Tj +ET +BT +/F7 6 Tf +0 0 0 rg +1 0 0 1 156.49901 421.7594 Tm +(5DWH) Tj +ET +BT +/F7 6 Tf +0 0 0 rg +1 0 0 1 171.79301 421.7594 Tm +( \)55 ) Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 188.78502 421.7594 Tm +() Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 207.23502 421.7594 Tm +( ZKHQ) Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 226.11102 421.7594 Tm +(WKH) Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 236.92902 421.7594 Tm +(VDIHW\\) Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 255.40302 421.7594 Tm +(OHYHO) Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 269.875 421.7594 Tm +(LV) Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 275.85699 421.7594 Tm +( ) Tj +ET +BT +/F7 9.5 Tf +0 0 0 rg +1 0 0 1 87.841 398.3591 Tm +(6HDUFK) Tj +ET +BT +/F7 9.5 Tf +0 0 0 rg +1 0 0 1 122.3355 398.3591 Tm +(WLPH) Tj +ET +BT +/F6 9.5 Tf +0 0 0 rg +1 0 0 1 147.007 398.3591 Tm +() Tj +ET +BT +/F6 9.5 Tf +0 0 0 rg +1 0 0 1 154.91101 398.3591 Tm +() Tj +ET +BT +/F6 9.5 Tf +0 0 0 rg +1 0 0 1 170.79501 398.3591 Tm +(VHF) Tj +ET +BT +/F6 9.5 Tf +0 0 0 rg +1 0 0 1 187.73352 398.3591 Tm +( DYHUDJH) Tj +ET +BT +/F6 9.5 Tf +0 0 0 rg +1 0 0 1 229.02052 398.3591 Tm +(DW) Tj +ET +BT +/F6 9.5 Tf +0 0 0 rg +1 0 0 1 240.24953 398.3591 Tm +( ) Tj +ET +BT +/F7 7.5 Tf +0 0 0 rg +1 0 0 1 87.841 374.9588 Tm +(+RVW) Tj +ET +BT +/F7 7.5 Tf +0 0 0 rg +1 0 0 1 107.1535 374.9588 Tm +(FRPSXWHU) Tj +ET +BT +/F7 7.5 Tf +0 0 0 rg +1 0 0 1 145.73351 374.9588 Tm +(LQWHUIDFH) Tj +ET +BT +/F6 7.5 Tf +0 0 0 rg +1 0 0 1 183.84851 374.9588 Tm +(8$57) Tj +ET +BT +/F6 7.5 Tf +0 0 0 rg +1 0 0 1 204.90851 374.9588 Tm +( 77/) Tj +ET +BT +/F6 7.5 Tf +0 0 0 rg +1 0 0 1 221.37851 374.9588 Tm +(ORJLF) Tj +ET +BT +/F6 7.5 Tf +0 0 0 rg +1 0 0 1 239.94852 374.9588 Tm +(OHYHO ) Tj +ET +BT +/F6 7.5 Tf +0 0 0 rg +1 0 0 1 260.28851 374.9588 Tm +(RU) Tj +ET +BT +/F6 7.5 Tf +0 0 0 rg +1 0 0 1 269.8735 374.9588 Tm +(86%) Tj +ET +BT +/F7 7.5 Tf +0 0 0 rg +1 0 0 1 87.841 351.5603 Tm +(&RPPXQLFDWLRQ) Tj +ET +BT +/F7 7.5 Tf +0 0 0 rg +1 0 0 1 149.58101 351.5603 Tm +(EDXG) Tj +ET +BT +/F7 7.5 Tf +0 0 0 rg +1 0 0 1 170.48351 351.5603 Tm +(UDWH) Tj +ET +BT +/F7 7.5 Tf +0 0 0 rg +1 0 0 1 188.056 351.5603 Tm +( 8$57 ) Tj +ET +BT +/F6 7.5 Tf +0 0 0 rg +1 0 0 1 215.416 351.5603 Tm +( ) Tj +ET +BT +/F8 7.5 Tf +0 0 0 rg +1 0 0 1 234.826 351.5603 Tm +<04A9002F000A0043005100540001> Tj +ET +BT +/F6 7.5 Tf +0 0 0 rg +1 0 0 1 264.75101 351.5603 Tm +(ZKHUH) Tj +ET +BT +/F6 7.5 Tf +0 0 0 rg +1 0 0 1 288.78851 351.5603 Tm +(1 ) Tj +ET +BT +/F8 7.5 Tf +0 0 0 rg +1 0 0 1 303.06851 351.5603 Tm +<0590> Tj +ET +BT +/F6 7.5 Tf +0 0 0 rg +1 0 0 1 310.56851 351.5603 Tm +() Tj +ET +BT +/F6 7.5 Tf +0 0 0 rg +1 0 0 1 321.09851 351.5603 Tm +( GHIDXOW) Tj +ET +BT +/F6 7.5 Tf +0 0 0 rg +1 0 0 1 350.20602 351.5603 Tm +(YDOXH) Tj +ET +BT +/F6 7.5 Tf +0 0 0 rg +1 0 0 1 370.97351 351.5603 Tm +(1 ) Tj +ET +BT +/F6 7.5 Tf +0 0 0 rg +1 0 0 1 389.2135 351.5603 Tm +(LH) Tj +ET +BT +/F6 7.5 Tf +0 0 0 rg +1 0 0 1 397.32849 351.5603 Tm +(ESV ) Tj +ET +BT +/F7 4.5 Tf +0 0 0 rg +1 0 0 1 87.8403 328.16003 Tm +(ZRUNLQJ) Tj +ET +BT +/F7 4.5 Tf +0 0 0 rg +1 0 0 1 107.6583 328.16003 Tm +(HQYLURQPHQW) Tj +ET +BT +/F6 8.5 Tf +0 0 0 rg +1 0 0 1 105.7207 312.56018 Tm +(7HPSHUDWXUH) Tj +ET +BT +/F6 8.5 Tf +0 0 0 rg +1 0 0 1 162.60271 312.56018 Tm +<0010001500130AF8> Tj +ET +BT +/F8 8.5 Tf +0 0 0 rg +1 0 0 1 183.52121 312.56018 Tm + Tj +ET +BT +/F6 8.5 Tf +0 0 0 rg +1 0 0 1 192.02121 312.56018 Tm +<000E001800130AF8> Tj +ET +BT +/F6 7 Tf +0 0 0 rg +1 0 0 1 105.7207 296.96033 Tm +(5HODWLYH) Tj +ET +BT +/F6 7 Tf +0 0 0 rg +1 0 0 1 133.4127 296.96033 Tm +(KXPLGLW\\) Tj +ET +BT +/F6 7 Tf +0 0 0 rg +1 0 0 1 166.3197 296.96033 Tm +(5+5+) Tj +ET +BT +/F6 7 Tf +0 0 0 rg +1 0 0 1 217.1257 296.96033 Tm +( QRQ) Tj +ET +BT +/F6 7 Tf +0 0 0 rg +1 0 0 1 234.3667 296.96033 Tm +(FRQGHQVLQJ ) Tj +ET +BT +/F7 4.5 Tf +0 0 0 rg +1 0 0 1 87.8403 273.56 Tm +(6WRUDJH) Tj +ET +BT +/F7 4.5 Tf +0 0 0 rg +1 0 0 1 106.4973 273.56 Tm +(HQYLURQPHQW) Tj +ET +BT +/F6 8.5 Tf +0 0 0 rg +1 0 0 1 105.7207 257.96008 Tm +(7HPSHUDWXUH) Tj +ET +BT +/F6 8.5 Tf +0 0 0 rg +1 0 0 1 162.60271 257.96008 Tm +<0010001700130AF8> Tj +ET +BT +/F8 8.5 Tf +0 0 0 rg +1 0 0 1 183.52121 257.96008 Tm + Tj +ET +BT +/F6 8.5 Tf +0 0 0 rg +1 0 0 1 192.02121 257.96008 Tm +<000E001B00180AF8> Tj +ET +BT +/F6 6.5 Tf +0 0 0 rg +1 0 0 1 105.7207 242.36029 Tm +(5HODWLYH) Tj +ET +BT +/F6 6.5 Tf +0 0 0 rg +1 0 0 1 131.43471 242.36029 Tm +(KXPLGLW\\) Tj +ET +BT +/F6 6.5 Tf +0 0 0 rg +1 0 0 1 161.99121 242.36029 Tm +(+) Tj +ET +BT +/F6 6.5 Tf +0 0 0 rg +1 0 0 1 185.05321 242.36029 Tm +( QR) Tj +ET +BT +/F6 6.5 Tf +0 0 0 rg +1 0 0 1 196.6427 242.36029 Tm +(FRQGHQVDWLRQ ) Tj +ET +BT +/F7 8.5 Tf +0 0 0 rg +1 0 0 1 87.8403 218.96002 Tm +('LPHQVLRQV) Tj +ET +BT +/F7 8.5 Tf +0 0 0 rg +1 0 0 1 139.7753 218.96002 Tm +( /) Tj +ET +BT +/F8 6 Tf +0 0 0 rg +1 0 0 1 147.4593 218.96002 Tm +<04A9> Tj +ET +BT +/F7 8.5 Tf +0 0 0 rg +1 0 0 1 153.4593 218.96002 Tm +(:) Tj +ET +BT +/F8 6 Tf +0 0 0 rg +1 0 0 1 161.6788 218.96002 Tm +<04A9> Tj +ET +BT +/F7 8.5 Tf +0 0 0 rg +1 0 0 1 167.6788 218.96002 Tm +(+ ) Tj +ET +BT +/F7 8 Tf +0 0 0 rg +1 0 0 1 98.36501 195.56 Tm +(6SOLW) Tj +ET +BT +/F7 8 Tf +0 0 0 rg +1 0 0 1 118.269 195.56 Tm +(W\\SH) Tj +ET +BT +/F6 10.5 Tf +0 0 0 rg +1 0 0 1 105.7203 179.96008 Tm +(PROG) Tj +ET +BT +/F6 8 Tf +0 0 0 rg +1 0 0 1 105.7202 164.36041 Tm +(\)LQJHUSULQW) Tj +ET +BT +/F6 8 Tf +0 0 0 rg +1 0 0 1 149.81619 164.36041 Tm +(VHQVRU) Tj +ET +BT +/F6 8 Tf +0 0 0 rg +1 0 0 1 179.3042 164.36041 Tm +() Tj +ET +BT +/F8 8 Tf +0 0 0 rg +1 0 0 1 190.53619 164.36041 Tm +<04A90001> Tj +ET +BT +/F6 8 Tf +0 0 0 rg +1 0 0 1 200.32819 164.36041 Tm +() Tj +ET +BT +/F8 8 Tf +0 0 0 rg +1 0 0 1 211.56018 164.36041 Tm +<04A90001> Tj +ET +BT +/F6 8 Tf +0 0 0 rg +1 0 0 1 221.35217 164.36041 Tm +(PP) Tj +ET +BT +/F6 9 Tf +0 0 0 rg +1 0 0 1 147.77072 179.96033 Tm +(%ORFN) Tj +ET +BT +/F6 9 Tf +0 0 0 rg +1 0 0 1 175.26572 179.96033 Tm +() Tj +ET +BT +/F8 9 Tf +0 0 0 rg +1 0 0 1 187.90172 179.96033 Tm +<04A90001> Tj +ET +BT +/F6 9 Tf +0 0 0 rg +1 0 0 1 198.91772 179.96033 Tm +() Tj +ET +BT +/F8 9 Tf +0 0 0 rg +1 0 0 1 211.55373 179.96033 Tm +<04A90001> Tj +ET +BT +/F6 9 Tf +0 0 0 rg +1 0 0 1 222.56973 179.96033 Tm +(PP) Tj +ET +BT +/F6 8.5 Tf +0 0 0 rg +1 0 0 1 281.1785 179.96033 Tm +( ,QVWDOODWLRQ) Tj +ET +BT +/F6 8.5 Tf +0 0 0 rg +1 0 0 1 330.793 179.96033 Tm +(VL]H) Tj +ET +BT +/F6 8.5 Tf +0 0 0 rg +1 0 0 1 350.3345 179.96033 Tm +() Tj +ET +BT +/F8 8.5 Tf +0 0 0 rg +1 0 0 1 369.40851 179.96033 Tm +<04A90001> Tj +ET +BT +/F6 8.5 Tf +0 0 0 rg +1 0 0 1 379.8125 179.96033 Tm +() Tj +ET +BT +/F6 8.5 Tf +0 0 0 rg +1 0 0 1 391.74649 179.96033 Tm +(PP ) Tj +ET +BT +/F7 9 Tf +0 0 0 rg +1 0 0 1 98.40279 140.96033 Tm +($OO) Tj +ET +BT +/F7 9 Tf +0 0 0 rg +1 0 0 1 113.00079 140.96033 Tm +(LQ) Tj +ET +BT +/F7 9 Tf +0 0 0 rg +1 0 0 1 124.55679 140.96033 Tm +(RQH) Tj +ET +BT +/F6 9 Tf +0 0 0 rg +1 0 0 1 143.92479 140.96033 Tm +() Tj +ET +BT +/F8 9 Tf +0 0 0 rg +1 0 0 1 156.56079 140.96033 Tm +<04A90001> Tj +ET +BT +/F6 9 Tf +0 0 0 rg +1 0 0 1 167.5768 140.96033 Tm +() Tj +ET +BT +/F8 9 Tf +0 0 0 rg +1 0 0 1 180.2128 140.96033 Tm +<04A90001> Tj +ET +BT +/F6 9 Tf +0 0 0 rg +1 0 0 1 191.22881 140.96033 Tm +(PP) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 270.17999 45.86041 Tm +(WKH) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 280.0965 45.86041 Tm +(ILUVW) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 291.729 45.86041 Tm +() Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 296.30499 45.86041 Tm +(SDJHV) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 313.32199 45.86041 Tm +(RI) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 319.9715 45.86041 Tm +() Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 327.69348 45.86041 Tm +(3DJH) Tj +ET + +endstream +endobj +880 0 obj +<< +/Type /Font +/BaseFont /AABHCF+NotoSansCJKsc-Regular +/Subtype /Type0 +/Encoding /Identity-H +/DescendantFonts [2841 0 R] +/ToUnicode 2842 0 R +>> +endobj +881 0 obj +<< +/Length 2 +>> +stream +q + +endstream +endobj +882 0 obj +<< +/Length 2539 +/Filter /FlateDecode +>> +stream +xZ[7 ~_1υJٔҖCeIInMW{ICڲd,o^}j}~<}X>^޼y݇ɓϭ!VP"4Ғhj%RBϋ'O/Wr](NR-̮(Z8Hj}yo X.K{rZ]z](j=A_ _|neWc3Rz zSH3p(@QrPN(cp.ːYmF +J9" "k)@&p},hWQv%aO+ꧧ /?슯z ? # eR8bU"ũ%\FhbmXVC>(b&6`zVZExńGO|JXo@k؁[51EYS=ye*d1w(QK Al~QD)ft`{m)4[w<-Wl'qLfV;EVdp&0"j%RYmz= 9jLmODB! m+1S )q7gYl1j +BS똙)prĸ1OXsQ67cfywJ`!@ EwZjTBBOwTo$P[ڊujgϨϪ>6.PQNw:G:lh; [形mxѝ' + 3U *\6Ǿ‘1j4qVOU;.=P7["F@ ;?%1M I![ƨD;Nd6z2/˽"0}Y +oeUNz DOrfU͎G= EP.G@y1Ǯ09_t!-zÐ}nk,׻FCSB6 2.g3U| +Bw$W xw%#`qE*3211RY  ׹k]):iL +r,䶝I oj>yZ䛲gt +>Ti7vB*ஙW`䶝 ok FNgmޙ` ڰ R:9vBt;+\=F0Z16I"g9_tEpT[pyve #L%,*hM&9vHrSh){DzȳI>P}`oʩ.&fP)x1{` ^$%,R< p%D 7@iSXÿhykY͗濑E!T +)E}?c:)YPx'F\[|uuEP)?%}?S6*FT|']\$.\nrF, %,z@f c–Abu{3&Q5z5SQ+ XRn9GW\7C&JW2ԦkPQ/#Tlwe}rӏ6XDu=.mpNJ_dEbVu PP-ɺdq.6>MMѷo5&{go5=ЄB3\Yf$l _Gphi K ^޴f8ehq=`Cސ7 +D5{mdk0S4I ,s4 +peۘkNWnI9=\[6yLĺw +wꙀ87y2g"7Wk4@hrgd. "$/XK㳷7_lzKg^U8)~ZWt^' W8ptG爦X1 *S J:˜Ih />hR7]X(0*t#CU}V4IS3 +jveω ]Dh!væXݨٝ t%%\ӥ@|9b[{+H Z҂VdH _tu_\(r+\2ʅ1\2rJ(ܷ߆_9K#D;2|"ΉyT(/oo^x/z]-꼅 \ax&HҕG1!*#[u<vXVޗǏ2=\uo`Pq̤$YD'v1vV[E?^~4y WccRAMr> +stream +Q +1 0 0 1 0 0 cm +BT +/F8 7.5 Tf +0 0 0 rg +1 0 0 1 377.35162 781.10431 Tm +(+DQJ]KRX) Tj +ET +BT +/F8 7.5 Tf +0 0 0 rg +1 0 0 1 415.64661 781.10431 Tm +(=KLDQ) Tj +ET +BT +/F8 7.5 Tf +0 0 0 rg +1 0 0 1 437.2991 781.10431 Tm +(7HFKQRORJ\\) Tj +ET +BT +/F8 7.5 Tf +0 0 0 rg +1 0 0 1 479.96661 781.10431 Tm +(&R) Tj +ET +BT +/F8 7.5 Tf +0 0 0 rg +1 0 0 1 495.21411 781.10431 Tm +(/WG) Tj +ET +BT +/F9 12.5 Tf +0 0 0 rg +1 0 0 1 208.25999 736.88031 Tm +(&KDSWHU) Tj +ET +BT +/F9 12.5 Tf +0 0 0 rg +1 0 0 1 261.63501 736.88031 Tm +() Tj +ET +BT +/F9 12.5 Tf +0 0 0 rg +1 0 0 1 272.035 736.88031 Tm +(+DUGZDUH) Tj +ET +BT +/F9 12.5 Tf +0 0 0 rg +1 0 0 1 337.29752 736.88031 Tm +(,QWHUIDFH) Tj +ET +BT +/F9 8.5 Tf +0 0 0 rg +1 0 0 1 87.84 684.98029 Tm +() Tj +ET +BT +/F9 8.5 Tf +0 0 0 rg +1 0 0 1 102.1965 684.98029 Tm +(+RVW) Tj +ET +BT +/F9 8.5 Tf +0 0 0 rg +1 0 0 1 124.084 684.98029 Tm +(FRPSXWHU) Tj +ET +BT +/F9 8.5 Tf +0 0 0 rg +1 0 0 1 167.808 684.98029 Tm +(LQWHUIDFH) Tj +ET +BT +/F9 8.5 Tf +0 0 0 rg +1 0 0 1 208.58249 684.98029 Tm +( PDUNHG) Tj +ET +BT +/F9 8.5 Tf +0 0 0 rg +1 0 0 1 246.68799 684.98029 Tm +(RQ) Tj +ET +BT +/F9 8.5 Tf +0 0 0 rg +1 0 0 1 259.74399 684.98029 Tm +(WKH) Tj +ET +BT +/F9 8.5 Tf +0 0 0 rg +1 0 0 1 276.25098 684.98029 Tm +(ERDUG) Tj +ET +BT +/F9 8.5 Tf +0 0 0 rg +1 0 0 1 303.68896 684.98029 Tm +(-) Tj +ET +BT +/F9 8.5 Tf +0 0 0 rg +1 0 0 1 311.36447 684.98029 Tm +( ) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 106.4409 650.60028 Tm +(QR) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 114.5974 650.60028 Tm +(PDWWHU) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 133.5999 650.60028 Tm +(ZKDW) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 147.82291 650.60028 Tm +(\\RX) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 158.78441 650.60028 Tm +(RUGHU) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 174.56941 650.60028 Tm +(8$57) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 190.01341 650.60028 Tm +(VWLOO) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 200.32042 650.60028 Tm +(LV) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 205.80392 650.60028 Tm +(86%) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 217.84892 650.60028 Tm +(,QWHUIDFH) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 242.62093 650.60028 Tm +(W\\SH) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 255.32593 650.60028 Tm +( EXW) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 267.17291 650.60028 Tm +(WKH) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 277.08942 650.60028 Tm +(IDFWRU\\) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 296.52643 650.60028 Tm +(VHWWLQJV) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 318.49893 650.60028 Tm +(RI) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 325.14844 650.60028 Tm +(WKH) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 335.06494 650.60028 Tm +(KDUGZDUH) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 361.41544 650.60028 Tm +(FLUFXLWV) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 381.25394 650.60028 Tm +(RQ) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 389.41043 650.60028 Tm +(WKH) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 399.32693 650.60028 Tm +(ERDUG) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 416.20642 650.60028 Tm +(DUH) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 426.09543 650.60028 Tm +(GLIIHUHQW) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 451.44492 650.60028 Tm +(SOHDVH) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 469.6004 650.60028 Tm +(GR) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 477.74042 650.60028 Tm +(QRW) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 487.88242 650.60028 Tm +(PL[) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 498.78342 650.60028 Tm +(WKHP ) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 516.96643 650.60028 Tm +(LQ) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 521.78442 650.60028 Tm +() Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 87.82651 634.99725 Tm +(3&%) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 99.63501 634.99725 Tm +(2Q) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 108.75951 634.99725 Tm +(WKH) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 118.67601 634.99725 Tm +(ERDUG) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 137.02951 634.99725 Tm +(WKH) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 146.94601 634.99725 Tm +(LQWHUIDFH) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 171.27252 634.99725 Tm +(EHWZHHQ) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 195.09853 634.99725 Tm +(WKH) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 205.01503 634.99725 Tm +(PRGXOH) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 226.21753 634.99725 Tm +(DQG) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 237.51453 634.99725 Tm +(WKH) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 247.43103 634.99725 Tm +(XVHU) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 260.26804 634.99725 Tm +(HTXLSPHQW) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 290.01202 634.99725 Tm +(DGRSWV) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 309.24002 634.99725 Tm +(WKH) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 319.15652 634.99725 Tm +(VDPH) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 334.55103 634.99725 Tm +(VLQJOH) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 351.67804 634.99725 Tm +(URZ) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 363.03003 634.99725 Tm +(VRFNHW) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 381.70251 634.99725 Tm +(SLQ) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 391.33301 634.99725 Tm +( VSOLW) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 405.25351 634.99725 Tm +(W\\SH) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 417.9585 634.99725 Tm +(LV) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 423.44199 634.99725 Tm +() Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 428.01797 634.99725 Tm +(FRUH) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 440.78897 634.99725 Tm +() Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 449.98499 634.99725 Tm +(6SDFLQJ) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 473.21698 634.99725 Tm +(RQH) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 484.81647 634.99725 Tm +(SLHFH) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 499.89197 634.99725 Tm +(LV) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 505.37546 634.99725 Tm +() Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 509.95145 634.99725 Tm +(FRUH) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 87.81598 619.39423 Tm +() Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 100.15798 619.39423 Tm +(VSDFLQJ ) Tj +ET +BT +/F8 6 Tf +0 0 0 rg +1 0 0 1 108.8401 603.80078 Tm +(:KHQ) Tj +ET +BT +/F8 6 Tf +0 0 0 rg +1 0 0 1 126.78011 603.80078 Tm +(WKH) Tj +ET +BT +/F8 6 Tf +0 0 0 rg +1 0 0 1 137.5981 603.80078 Tm +(XVHU) Tj +ET +BT +/F8 6 Tf +0 0 0 rg +1 0 0 1 151.6021 603.80078 Tm +(KDV) Tj +ET +BT +/F8 6 Tf +0 0 0 rg +1 0 0 1 163.11009 603.80078 Tm +(QR) Tj +ET +BT +/F8 6 Tf +0 0 0 rg +1 0 0 1 172.00809 603.80078 Tm +(VSHFLDO) Tj +ET +BT +/F8 6 Tf +0 0 0 rg +1 0 0 1 192.85809 603.80078 Tm +(UHTXLUHPHQWV) Tj +ET +BT +/F8 6 Tf +0 0 0 rg +1 0 0 1 234.4381 603.80078 Tm +(WKH) Tj +ET +BT +/F8 6 Tf +0 0 0 rg +1 0 0 1 245.25609 603.80078 Tm +(SURYLGHG) Tj +ET +BT +/F8 6 Tf +0 0 0 rg +1 0 0 1 271.97409 603.80078 Tm +(XVHU) Tj +ET +BT +/F8 6 Tf +0 0 0 rg +1 0 0 1 285.97809 603.80078 Tm +(LQWHUIDFH) Tj +ET +BT +/F8 6 Tf +0 0 0 rg +1 0 0 1 312.51608 603.80078 Tm +(OHDG) Tj +ET +BT +/F8 6 Tf +0 0 0 rg +1 0 0 1 326.06409 603.80078 Tm +(OHQJWK) Tj +ET +BT +/F8 6 Tf +0 0 0 rg +1 0 0 1 345.82809 603.80078 Tm +(LV) Tj +ET +BT +/F8 6 Tf +0 0 0 rg +1 0 0 1 351.81009 603.80078 Tm +(PP) Tj +ET +BT +/F8 6 Tf +0 0 0 rg +1 0 0 1 373.32608 603.80078 Tm +() Tj +ET +BT +/F9 6.5 Tf +0 0 0 rg +1 0 0 1 87.84 566.12042 Tm +() Tj +ET +BT +/F9 6.5 Tf +0 0 0 rg +1 0 0 1 104.38899 566.12042 Tm +(VHULDO) Tj +ET +BT +/F9 6.5 Tf +0 0 0 rg +1 0 0 1 123.993 566.12042 Tm +(FRPPXQLFDWLRQ) Tj +ET +BT +/F8 4.5 Tf +0 0 0 rg +1 0 0 1 108.84 530.96033 Tm +(:KHQ) Tj +ET +BT +/F8 4.5 Tf +0 0 0 rg +1 0 0 1 122.295 530.96033 Tm +(WKH) Tj +ET +BT +/F8 4.5 Tf +0 0 0 rg +1 0 0 1 130.40849 530.96033 Tm +(PRGXOH) Tj +ET +BT +/F8 4.5 Tf +0 0 0 rg +1 0 0 1 147.756 530.96033 Tm +(FRPPXQLFDWHV) Tj +ET +BT +/F8 4.5 Tf +0 0 0 rg +1 0 0 1 179.94901 530.96033 Tm +(ZLWK) Tj +ET +BT +/F8 4.5 Tf +0 0 0 rg +1 0 0 1 190.2225 530.96033 Tm +(WKH) Tj +ET +BT +/F8 4.5 Tf +0 0 0 rg +1 0 0 1 198.336 530.96033 Tm +(XVHU) Tj +ET +BT +/F8 4.5 Tf +0 0 0 rg +1 0 0 1 208.839 530.96033 Tm +(HTXLSPHQW) Tj +ET +BT +/F8 4.5 Tf +0 0 0 rg +1 0 0 1 233.175 530.96033 Tm +(VHULDOO\\) Tj +ET +BT +/F8 4.5 Tf +0 0 0 rg +1 0 0 1 250.4055 530.96033 Tm +(WKH) Tj +ET +BT +/F8 4.5 Tf +0 0 0 rg +1 0 0 1 258.51901 530.96033 Tm +(LQWHUIDFH) Tj +ET +BT +/F8 4.5 Tf +0 0 0 rg +1 0 0 1 278.42252 530.96033 Tm +(-) Tj +ET +BT +/F8 4.5 Tf +0 0 0 rg +1 0 0 1 283.39502 530.96033 Tm +(7KH) Tj +ET +BT +/F8 4.5 Tf +0 0 0 rg +1 0 0 1 292.38602 530.96033 Tm +(SLQV) Tj +ET +BT +/F8 4.5 Tf +0 0 0 rg +1 0 0 1 302.42102 530.96033 Tm +(DUH) Tj +ET +BT +/F8 4.5 Tf +0 0 0 rg +1 0 0 1 310.51202 530.96033 Tm +(GHILQHG) Tj +ET +BT +/F8 4.5 Tf +0 0 0 rg +1 0 0 1 327.78302 530.96033 Tm +(DV) Tj +ET +BT +/F8 4.5 Tf +0 0 0 rg +1 0 0 1 333.63303 530.96033 Tm +(IROORZV) Tj +ET +BT +/F9 5 Tf +0 0 0 rg +1 0 0 1 112.5003 513.85999 Tm +(SLQ) Tj +ET +BT +/F9 5 Tf +0 0 0 rg +1 0 0 1 121.7753 513.85999 Tm +(QXPEHU) Tj +ET +BT +/F9 10.5 Tf +0 0 0 rg +1 0 0 1 160.1398 514.39972 Tm +(QDPH) Tj +ET +BT +/F9 10.5 Tf +0 0 0 rg +1 0 0 1 203.24969 514.39972 Tm +(W\\SH) Tj +ET +BT +/F9 4 Tf +0 0 0 rg +1 0 0 1 338.0896 514.39972 Tm +(DFKLHYHPHQW) Tj +ET +BT +/F9 6.5 Tf +0 0 0 rg +1 0 0 1 364.49915 514.39972 Tm +(&DQ) Tj +ET +BT +/F9 6.5 Tf +0 0 0 rg +1 0 0 1 378.52615 514.39972 Tm +(GUDZ) Tj +ET +BT +/F9 4 Tf +0 0 0 rg +1 0 0 1 412.02835 514.39972 Tm +(VWDWHG) Tj +ET +BT +/F8 10.5 Tf +0 0 0 rg +1 0 0 1 125.7 497.7803 Tm +() Tj +ET +BT +/F8 10.5 Tf +0 0 0 rg +1 0 0 1 165.42 497.7803 Tm +(9LQ) Tj +ET +BT +/F8 10.5 Tf +0 0 0 rg +1 0 0 1 209.7 497.7803 Tm +(LQ) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 237.24001 497.7803 Tm +(3RVLWLYH) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 256.73001 497.7803 Tm +(LQSXW) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 270.38 497.7803 Tm +(WHUPLQDO) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 291.52002 497.7803 Tm +(RI) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 297.56503 497.7803 Tm +(SRZHU) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 313.78003 497.7803 Tm +(VXSSO\\) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 331.89502 497.7803 Tm +( /LQH) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 344.51501 497.7803 Tm +(FRORU) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 358.96002 497.7803 Tm +(UHG ) Tj +ET +BT +/F8 10.5 Tf +0 0 0 rg +1 0 0 1 125.7 481.70029 Tm +() Tj +ET +BT +/F8 10.5 Tf +0 0 0 rg +1 0 0 1 168.0601 481.70029 Tm +(7') Tj +ET +BT +/F8 10.5 Tf +0 0 0 rg +1 0 0 1 205.92101 481.70029 Tm +(RXW) Tj +ET +BT +/F8 8 Tf +0 0 0 rg +1 0 0 1 237.2404 481.70029 Tm +(6HULDO) Tj +ET +BT +/F8 8 Tf +0 0 0 rg +1 0 0 1 260.14441 481.70029 Tm +(GDWD) Tj +ET +BT +/F8 8 Tf +0 0 0 rg +1 0 0 1 279.00842 481.70029 Tm +(RXWSXW) Tj +ET +BT +/F8 8 Tf +0 0 0 rg +1 0 0 1 308.65643 481.70029 Tm +(77/) Tj +ET +BT +/F8 8 Tf +0 0 0 rg +1 0 0 1 323.82443 481.70029 Tm +(ORJLF) Tj +ET +BT +/F8 8 Tf +0 0 0 rg +1 0 0 1 343.63245 481.70029 Tm +(OHYHO) Tj +ET +BT +/F8 8 Tf +0 0 0 rg +1 0 0 1 365.07245 481.70029 Tm +( /LQH) Tj +ET +BT +/F8 8 Tf +0 0 0 rg +1 0 0 1 385.26443 481.70029 Tm +(FRORU) Tj +ET +BT +/F8 8 Tf +0 0 0 rg +1 0 0 1 408.37643 481.70029 Tm +(JUHHQ ) Tj +ET +BT +/F8 10.5 Tf +0 0 0 rg +1 0 0 1 125.7 465.6203 Tm +() Tj +ET +BT +/F8 10.5 Tf +0 0 0 rg +1 0 0 1 168.06 465.6203 Tm +(5') Tj +ET +BT +/F8 10.5 Tf +0 0 0 rg +1 0 0 1 209.7 465.6203 Tm +(LQ) Tj +ET +BT +/F8 8 Tf +0 0 0 rg +1 0 0 1 237.24001 465.6203 Tm +(6HULDO) Tj +ET +BT +/F8 8 Tf +0 0 0 rg +1 0 0 1 260.14401 465.6203 Tm +(GDWD) Tj +ET +BT +/F8 8 Tf +0 0 0 rg +1 0 0 1 279.00803 465.6203 Tm +(LQSXW) Tj +ET +BT +/F8 8 Tf +0 0 0 rg +1 0 0 1 302.99203 465.6203 Tm +(77/) Tj +ET +BT +/F8 8 Tf +0 0 0 rg +1 0 0 1 318.16003 465.6203 Tm +(ORJLF) Tj +ET +BT +/F8 8 Tf +0 0 0 rg +1 0 0 1 337.96805 465.6203 Tm +(OHYHO) Tj +ET +BT +/F8 8 Tf +0 0 0 rg +1 0 0 1 359.40805 465.6203 Tm +( /LQH) Tj +ET +BT +/F8 8 Tf +0 0 0 rg +1 0 0 1 379.60004 465.6203 Tm +(FRORU) Tj +ET +BT +/F8 8 Tf +0 0 0 rg +1 0 0 1 402.71204 465.6203 Tm +(ZKLWH ) Tj +ET +BT +/F8 10.5 Tf +0 0 0 rg +1 0 0 1 125.7 449.48029 Tm +() Tj +ET +BT +/F8 10.5 Tf +0 0 0 rg +1 0 0 1 165.39619 449.48029 Tm +(*1') Tj +ET +BT +/F8 10.5 Tf +0 0 0 rg +1 0 0 1 208.5247 449.48029 Tm +() Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 237.2106 449.48029 Tm +(VLJQDO) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 252.4556 449.48029 Tm +(JURXQG) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 272.51559 449.48029 Tm +(,QWHUQDOO\\) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 296.31558 449.48029 Tm +(FRQQHFWHG) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 322.14059 449.48029 Tm +(WR) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 328.2706 449.48029 Tm +(SRZHU) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 344.4856 449.48029 Tm +(JURXQG) Tj +ET +BT +/F8 7.5 Tf +0 0 0 rg +1 0 0 1 368.52359 449.48029 Tm +( /LQH) Tj +ET +BT +/F8 7.5 Tf +0 0 0 rg +1 0 0 1 387.45358 449.48029 Tm +(FRORU) Tj +ET +BT +/F8 7.5 Tf +0 0 0 rg +1 0 0 1 409.12109 449.48029 Tm +(EODFN ) Tj +ET +BT +/F8 10.5 Tf +0 0 0 rg +1 0 0 1 125.7 432.26031 Tm +() Tj +ET +BT +/F8 10.5 Tf +0 0 0 rg +1 0 0 1 168.06 432.26031 Tm +(1&) Tj +ET +BT +/F8 10.5 Tf +0 0 0 rg +1 0 0 1 208.56 432.26031 Tm +() Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 237.24001 432.26031 Tm +(8QGHILQHG) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 267.24249 432.26031 Tm +(IORDWLQJ) Tj +ET +BT +/F9 5.5 Tf +0 0 0 rg +1 0 0 1 288.6265 432.26031 Tm +( $OO) Tj +ET +BT +/F9 5.5 Tf +0 0 0 rg +1 0 0 1 299.41199 432.26031 Tm +(LQ) Tj +ET +BT +/F9 5.5 Tf +0 0 0 rg +1 0 0 1 306.474 432.26031 Tm +(RQH) Tj +ET +BT +/F9 5.5 Tf +0 0 0 rg +1 0 0 1 318.17249 432.26031 Tm +(PRGXOH) Tj +ET +BT +/F9 5.5 Tf +0 0 0 rg +1 0 0 1 340.43097 432.26031 Tm +(GRHV) Tj +ET +BT +/F9 5.5 Tf +0 0 0 rg +1 0 0 1 354.73096 432.26031 Tm +(QRW) Tj +ET +BT +/F9 5.5 Tf +0 0 0 rg +1 0 0 1 365.56595 432.26031 Tm +(KDYH) Tj +ET +BT +/F9 5.5 Tf +0 0 0 rg +1 0 0 1 380.31146 432.26031 Tm +(WKLV) Tj +ET +BT +/F9 5.5 Tf +0 0 0 rg +1 0 0 1 392.15295 432.26031 Tm +(SLQ ) Tj +ET +BT +/F9 5 Tf +0 0 0 rg +1 0 0 1 114.84 415.52029 Tm +(1RWH) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 129.84999 415.52029 Tm +(7\\SH) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 142.37498 415.52029 Tm +(FROXPQ) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 162.58499 415.52029 Tm +(LQ) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 168.26498 415.52029 Tm +(UHSUHVHQWV) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 194.91498 415.52029 Tm +(WKH) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 203.92998 415.52029 Tm +(LQSXW) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 217.57997 415.52029 Tm +(WR) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 223.70998 415.52029 Tm +(WKH) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 232.72498 415.52029 Tm +(PRGXOH) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 253.33998 415.52029 Tm +(RXW) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 262.55997 415.52029 Tm +(RXWSXW) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 279.74997 415.52029 Tm +(IURP) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 292.53497 415.52029 Tm +(WKH) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 301.54999 415.52029 Tm +(PRGXOH) Tj +ET +BT +/F9 6.5 Tf +0 0 0 rg +1 0 0 1 87.84 384.92029 Tm +() Tj +ET +BT +/F9 6.5 Tf +0 0 0 rg +1 0 0 1 109.9595 384.92029 Tm +(KDUGZDUH) Tj +ET +BT +/F9 6.5 Tf +0 0 0 rg +1 0 0 1 143.194 384.92029 Tm +(FRQQHFWLRQ) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 108.84 355.3403 Tm +(7KURXJK) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 130.355 355.3403 Tm +(WKH) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 139.37 355.3403 Tm +(VHULDO) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 153.33499 355.3403 Tm +(FRPPXQLFDWLRQ) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 191.29498 355.3403 Tm +(LQWHUIDFH) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 214.74998 355.3403 Tm +(WKH) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 223.76498 355.3403 Tm +(PRGXOH) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 243.03998 355.3403 Tm +(FDQ) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 252.63498 355.3403 Tm +(EH) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 259.82999 355.3403 Tm +(GLUHFWO\\) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 278.42499 355.3403 Tm +(FRQQHFWHG) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 304.25 355.3403 Tm +(ZLWK) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 315.66501 355.3403 Tm +(WKH) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 324.67999 355.3403 Tm +(9) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 336.03998 355.3403 Tm +(RU) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 342.42999 355.3403 Tm +(9) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 349.59 355.3403 Tm +(&RPPXQLFDWLRQ) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 388.31 355.3403 Tm +(ZLWK) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 399.72501 355.3403 Tm +(WKH) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 408.73999 355.3403 Tm +(VLQJOH) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 424.31 355.3403 Tm +(FKLS) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 435.465 355.3403 Tm +(PLFURFRPSXWHU) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 473.17499 355.3403 Tm +(RI) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 479.22 355.3403 Tm +(WKH) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 488.23499 355.3403 Tm +(SRZHU) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 504.44998 355.3403 Tm +(VXSSO\\) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 87.84003 339.7373 Tm +(WKH) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 96.85503 339.7373 Tm +(PRGXOH) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 116.13003 339.7373 Tm +(GDWD) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 127.92003 339.7373 Tm +(VHQGLQJ) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 148.05502 339.7373 Tm +(SLQ) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 156.81003 339.7373 Tm +( ) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 158.31003 339.7373 Tm +() Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 162.47003 339.7373 Tm +(IRRW) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 173.34503 339.7373 Tm +(7') Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 179.77502 339.7373 Tm +( ) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 182.57503 339.7373 Tm +(FRQQHFWHG) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 208.40002 339.7373 Tm +(WR) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 214.53003 339.7373 Tm +(WKH) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 223.54503 339.7373 Tm +(GDWD) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 235.33502 339.7373 Tm +(UHFHLYLQJ) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 258.02502 339.7373 Tm +(HQG) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 268.31003 339.7373 Tm +(RI) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 274.35504 339.7373 Tm +(WKH) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 283.37006 339.7373 Tm +(KRVW) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 294.98505 339.7373 Tm +(FRPSXWHU) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 319.24005 339.7373 Tm +( ) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 320.74005 339.7373 Tm +(5;') Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 330.43005 339.7373 Tm +( ) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 334.57007 339.7373 Tm +(PRGXOH) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 353.84506 339.7373 Tm +(GDWD) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 365.63507 339.7373 Tm +(UHFHLYLQJ) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 388.32507 339.7373 Tm +(SLQ) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 397.08008 339.7373 Tm +( ) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 398.58008 339.7373 Tm +() Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 402.74008 339.7373 Tm +(IRRW) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 413.61508 339.7373 Tm +(5') Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 420.37509 339.7373 Tm +( ) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 423.17508 339.7373 Tm +(FRQQHFWHG) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 449.00009 339.7373 Tm +(WR) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 455.1301 339.7373 Tm +(WKH) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 464.14508 339.7373 Tm +(GDWD) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 475.93509 339.7373 Tm +(VHQGLQJ) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 496.0701 339.7373 Tm +(HQG) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 506.3551 339.7373 Tm +(RI) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 512.40009 339.7373 Tm +(WKH) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 87.84003 324.13428 Tm +(KRVW) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 99.45502 324.13428 Tm +(FRPSXWHU) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 123.71002 324.13428 Tm +( ) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 125.21002 324.13428 Tm +(7;') Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 134.57002 324.13428 Tm +( ) Tj +ET +BT +/F8 6 Tf +0 0 0 rg +1 0 0 1 108.841 308.54077 Tm +(,I) Tj +ET +BT +/F8 6 Tf +0 0 0 rg +1 0 0 1 114.499 308.54077 Tm +(UHTXLUHG) Tj +ET +BT +/F8 6 Tf +0 0 0 rg +1 0 0 1 140.41901 308.54077 Tm +(ZLWK) Tj +ET +BT +/F8 6 Tf +0 0 0 rg +1 0 0 1 154.117 308.54077 Tm +(56) Tj +ET +BT +/F8 6 Tf +0 0 0 rg +1 0 0 1 174.931 308.54077 Tm +(OHYHO) Tj +ET +BT +/F8 6 Tf +0 0 0 rg +1 0 0 1 189.403 308.54077 Tm +( IRU) Tj +ET +BT +/F8 6 Tf +0 0 0 rg +1 0 0 1 200.935 308.54077 Tm +(H[DPSOH) Tj +ET +BT +/F8 6 Tf +0 0 0 rg +1 0 0 1 226.69901 308.54077 Tm +(3&) Tj +ET +BT +/F8 6 Tf +0 0 0 rg +1 0 0 1 235.681 308.54077 Tm +(WR) Tj +ET +BT +/F8 6 Tf +0 0 0 rg +1 0 0 1 243.037 308.54077 Tm +(FRPPXQLFDWH) Tj +ET +BT +/F8 6 Tf +0 0 0 rg +1 0 0 1 283.08701 308.54077 Tm +(ZLWK) Tj +ET +BT +/F8 6 Tf +0 0 0 rg +1 0 0 1 296.785 308.54077 Tm +(WKH) Tj +ET +BT +/F8 6 Tf +0 0 0 rg +1 0 0 1 307.603 308.54077 Tm +(KRVW) Tj +ET +BT +/F8 6 Tf +0 0 0 rg +1 0 0 1 321.54099 308.54077 Tm +(FRPSXWHU ) Tj +ET +BT +/F8 6 Tf +0 0 0 rg +1 0 0 1 354.05499 308.54077 Tm +(SOHDVH) Tj +ET +BT +/F8 6 Tf +0 0 0 rg +1 0 0 1 373.86099 308.54077 Tm +(DGG) Tj +ET +BT +/F8 6 Tf +0 0 0 rg +1 0 0 1 386.16699 308.54077 Tm +(D) Tj +ET +BT +/F8 6 Tf +0 0 0 rg +1 0 0 1 391.09299 308.54077 Tm +(OHYHO) Tj +ET +BT +/F8 6 Tf +0 0 0 rg +1 0 0 1 405.565 308.54077 Tm +(FRQYHUVLRQ) Tj +ET +BT +/F8 6 Tf +0 0 0 rg +1 0 0 1 438.013 308.54077 Tm +(FLUFXLW) Tj +ET +BT +/F8 6 Tf +0 0 0 rg +1 0 0 1 456.78101 308.54077 Tm +(EHWZHHQ) Tj +ET +BT +/F8 6 Tf +0 0 0 rg +1 0 0 1 482.77301 308.54077 Tm +(WKH) Tj +ET +BT +/F8 6 Tf +0 0 0 rg +1 0 0 1 493.591 308.54077 Tm +(PRGXOH) Tj +ET +BT +/F8 6 Tf +0 0 0 rg +1 0 0 1 87.83051 292.93781 Tm +(DQG) Tj +ET +BT +/F8 6 Tf +0 0 0 rg +1 0 0 1 100.1545 292.93781 Tm +(WKH) Tj +ET +BT +/F8 6 Tf +0 0 0 rg +1 0 0 1 110.9725 292.93781 Tm +(KRVW) Tj +ET +BT +/F8 6 Tf +0 0 0 rg +1 0 0 1 124.91051 292.93781 Tm +(FRPSXWHU) Tj +ET +BT +/F8 6 Tf +0 0 0 rg +1 0 0 1 154.01651 292.93781 Tm +( IRU) Tj +ET +BT +/F8 6 Tf +0 0 0 rg +1 0 0 1 165.54851 292.93781 Tm +(H[DPSOH) Tj +ET +BT +/F8 6 Tf +0 0 0 rg +1 0 0 1 191.3125 292.93781 Tm +(0$;) Tj +ET +BT +/F8 6 Tf +0 0 0 rg +1 0 0 1 215.96049 292.93781 Tm +(FLUFXLW ) Tj +ET +BT +/F9 8.5 Tf +0 0 0 rg +1 0 0 1 87.84 262.82031 Tm +() Tj +ET +BT +/F9 8.5 Tf +0 0 0 rg +1 0 0 1 116.7655 262.82031 Tm +(VHULDO) Tj +ET +BT +/F9 8.5 Tf +0 0 0 rg +1 0 0 1 142.40149 262.82031 Tm +(SURWRFRO) Tj +ET +BT +/F8 6 Tf +0 0 0 rg +1 0 0 1 108.84 233.2403 Tm +(8VLQJ) Tj +ET +BT +/F8 6 Tf +0 0 0 rg +1 0 0 1 126.606 233.2403 Tm +(KDOI) Tj +ET +BT +/F8 6 Tf +0 0 0 rg +1 0 0 1 139.224 233.2403 Tm +(GXSOH[) Tj +ET +BT +/F8 6 Tf +0 0 0 rg +1 0 0 1 159.978 233.2403 Tm +(DV\\QFKURQRXV) Tj +ET +BT +/F8 6 Tf +0 0 0 rg +1 0 0 1 201.16199 233.2403 Tm +(VHULDO) Tj +ET +BT +/F8 6 Tf +0 0 0 rg +1 0 0 1 217.91998 233.2403 Tm +(FRPPXQLFDWLRQ) Tj +ET +BT +/F8 6 Tf +0 0 0 rg +1 0 0 1 265.07999 233.2403 Tm +('HIDXOW) Tj +ET +BT +/F8 6 Tf +0 0 0 rg +1 0 0 1 287.25598 233.2403 Tm +(EDXG) Tj +ET +BT +/F8 6 Tf +0 0 0 rg +1 0 0 1 303.26999 233.2403 Tm +(UDWH) Tj +ET +BT +/F8 6 Tf +0 0 0 rg +1 0 0 1 314.664 233.2403 Tm +(ESV) Tj +ET +BT +/F8 6 Tf +0 0 0 rg +1 0 0 1 342.078 233.2403 Tm +() Tj +ET +BT +/F8 6 Tf +0 0 0 rg +1 0 0 1 345.246 233.2403 Tm +(ZKLFK) Tj +ET +BT +/F8 6 Tf +0 0 0 rg +1 0 0 1 363.366 233.2403 Tm +(FDQ) Tj +ET +BT +/F8 6 Tf +0 0 0 rg +1 0 0 1 374.88 233.2403 Tm +(EH) Tj +ET +BT +/F8 6 Tf +0 0 0 rg +1 0 0 1 383.51401 233.2403 Tm +(VHW) Tj +ET +BT +/F8 6 Tf +0 0 0 rg +1 0 0 1 393.49802 233.2403 Tm +(E\\) Tj +ET +BT +/F8 6 Tf +0 0 0 rg +1 0 0 1 401.80801 233.2403 Tm +(WKH) Tj +ET +BT +/F8 6 Tf +0 0 0 rg +1 0 0 1 412.62601 233.2403 Tm +(FRPPDQG) Tj +ET +BT +/F8 6 Tf +0 0 0 rg +1 0 0 1 442.67999 233.2403 Tm +(WR) Tj +ET +BT +/F8 6 Tf +0 0 0 rg +1 0 0 1 450.03598 233.2403 Tm +() Tj +ET +BT +/F8 6 Tf +0 0 0 rg +1 0 0 1 463.76398 233.2403 Tm +(a) Tj +ET +BT +/F8 6 Tf +0 0 0 rg +1 0 0 1 467.19598 233.2403 Tm +(ESV) Tj +ET +BT +/F8 6 Tf +0 0 0 rg +1 0 0 1 498.04199 233.2403 Tm +() Tj +ET +BT +/F8 6.5 Tf +0 0 0 rg +1 0 0 1 162.90254 214.03741 Tm +(VWDUW) Tj +ET +BT +/F8 6.5 Tf +0 0 0 rg +1 0 0 1 178.73004 214.03741 Tm +(ELW) Tj +ET +BT +/F8 9.5 Tf +0 0 0 rg +1 0 0 1 173.52 201.92029 Tm +() Tj +ET +BT +/F8 7 Tf +0 0 0 rg +1 0 0 1 437.39972 214.03741 Tm +(VWRS) Tj +ET +BT +/F8 7 Tf +0 0 0 rg +1 0 0 1 453.63971 214.03741 Tm +(ELW) Tj +ET +BT +/F8 9.5 Tf +0 0 0 rg +1 0 0 1 441.95905 201.92029 Tm +() Tj +ET +BT +/F8 9.5 Tf +0 0 0 rg +1 0 0 1 143.51993 201.92029 Tm +() Tj +ET +BT +/F8 9.5 Tf +0 0 0 rg +1 0 0 1 201.12 201.92029 Tm +(') Tj +ET +BT +/F8 9.5 Tf +0 0 0 rg +1 0 0 1 230.92703 201.92029 Tm +(') Tj +ET +0 0 0 RG +230.92703 200.02029 m +243.29604 200.02029 l +S +BT +/F8 9.5 Tf +0 0 0 rg +1 0 0 1 260.92712 201.92029 Tm +(') Tj +ET +0 0 0 RG +260.92712 200.02029 m +273.29611 200.02029 l +S +BT +/F8 9.5 Tf +0 0 0 rg +1 0 0 1 290.69144 201.92029 Tm +(') Tj +ET +0 0 0 RG +290.69144 200.02029 m +303.06042 200.02029 l +S +BT +/F8 9.5 Tf +0 0 0 rg +1 0 0 1 320.51471 201.92029 Tm +(') Tj +ET +0 0 0 RG +320.51471 200.02029 m +332.8837 200.02029 l +S +BT +/F8 9.5 Tf +0 0 0 rg +1 0 0 1 352.37558 201.92029 Tm +(') Tj +ET +0 0 0 RG +352.37558 200.02029 m +364.74457 200.02029 l +S +BT +/F8 9.5 Tf +0 0 0 rg +1 0 0 1 380.1528 201.92029 Tm +(') Tj +ET +0 0 0 RG +380.1528 200.02029 m +392.52179 200.02029 l +S +BT +/F8 9.5 Tf +0 0 0 rg +1 0 0 1 409.97607 201.92029 Tm +(') Tj +ET +0 0 0 RG +409.97607 200.02029 m +422.34506 200.02029 l +S +BT +/F8 4.5 Tf +0 0 0 rg +1 0 0 1 268.85999 174.26031 Tm +() Tj +ET +BT +/F8 4.5 Tf +0 0 0 rg +1 0 0 1 275.45697 174.26031 Tm +(ELW) Tj +ET +BT +/F8 4.5 Tf +0 0 0 rg +1 0 0 1 282.17996 174.26031 Tm +(IUDPH) Tj +ET +BT +/F8 4.5 Tf +0 0 0 rg +1 0 0 1 296.02646 174.26031 Tm +(IRUPDW) Tj +ET +BT +/F8 7.5 Tf +0 0 0 rg +1 0 0 1 108.84 144.6203 Tm +(7KH) Tj +ET +BT +/F8 7.5 Tf +0 0 0 rg +1 0 0 1 123.825 144.6203 Tm +(WUDQVPLWWHG) Tj +ET +BT +/F8 7.5 Tf +0 0 0 rg +1 0 0 1 167.22 144.6203 Tm +(IUDPH) Tj +ET +BT +/F8 7.5 Tf +0 0 0 rg +1 0 0 1 190.2975 144.6203 Tm +(IRUPDW) Tj +ET +BT +/F8 7.5 Tf +0 0 0 rg +1 0 0 1 216.39 144.6203 Tm +(LV) Tj +ET +BT +/F8 7.5 Tf +0 0 0 rg +1 0 0 1 223.86749 144.6203 Tm +() Tj +ET +BT +/F8 7.5 Tf +0 0 0 rg +1 0 0 1 234.39749 144.6203 Tm +(ELW) Tj +ET +BT +/F8 7.5 Tf +0 0 0 rg +1 0 0 1 247.61249 144.6203 Tm +(ELW) Tj +ET +BT +/F8 7.5 Tf +0 0 0 rg +1 0 0 1 258.81747 144.6203 Tm +() Tj +ET +BT +/F8 7.5 Tf +0 0 0 rg +1 0 0 1 265.05746 144.6203 Tm +(OHYHO) Tj +ET +BT +/F8 7.5 Tf +0 0 0 rg +1 0 0 1 283.14746 144.6203 Tm +(VWDUW) Tj +ET +BT +/F8 7.5 Tf +0 0 0 rg +1 0 0 1 301.40997 144.6203 Tm +(ELW) Tj +ET +BT +/F8 7.5 Tf +0 0 0 rg +1 0 0 1 312.67499 144.6203 Tm +() Tj +ET +BT +/F8 7.5 Tf +0 0 0 rg +1 0 0 1 318.91498 144.6203 Tm +(%LW) Tj +ET +BT +/F8 7.5 Tf +0 0 0 rg +1 0 0 1 330.38248 144.6203 Tm +(GDWD) Tj +ET +BT +/F8 7.5 Tf +0 0 0 rg +1 0 0 1 348.06747 144.6203 Tm +( ORZ) Tj +ET +BT +/F8 7.5 Tf +0 0 0 rg +1 0 0 1 364.63498 144.6203 Tm +(RUGHU) Tj +ET +BT +/F8 7.5 Tf +0 0 0 rg +1 0 0 1 386.15997 144.6203 Tm +(ILUVW ) Tj +ET +BT +/F8 7.5 Tf +0 0 0 rg +1 0 0 1 404.27246 144.6203 Tm +(DQG) Tj +ET +BT +/F8 7.5 Tf +0 0 0 rg +1 0 0 1 419.67746 144.6203 Tm +(RQH) Tj +ET +BT +/F8 7.5 Tf +0 0 0 rg +1 0 0 1 435.02997 144.6203 Tm +(VWRS) Tj +ET +BT +/F8 7.5 Tf +0 0 0 rg +1 0 0 1 452.42996 144.6203 Tm +(ELW) Tj +ET +BT +/F8 7.5 Tf +0 0 0 rg +1 0 0 1 465.64496 144.6203 Tm +(QR) Tj +ET +BT +/F8 7.5 Tf +0 0 0 rg +1 0 0 1 476.76746 144.6203 Tm +(SDULW\\) Tj +ET +BT +/F8 10.5 Tf +0 0 0 rg +1 0 0 1 87.82948 129.01733 Tm +(ELW) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 270.17999 45.86041 Tm +(WKH) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 280.0965 45.86041 Tm +(ILUVW) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 291.729 45.86041 Tm +() Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 296.30499 45.86041 Tm +(SDJHV) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 313.32199 45.86041 Tm +(RI) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 319.9715 45.86041 Tm +() Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 327.69348 45.86041 Tm +(3DJH) Tj +ET + +endstream +endobj +884 0 obj +<< +/Length 2 +>> +stream +q + +endstream +endobj +885 0 obj +<< +/Length 5171 +/Filter /FlateDecode +>> +stream +x=[&߯ѽ[8,Mȁ<%c{&>%ԺUI}%xrtJURꦒZ?Ûo?l?|x?n_oo~7~/~OصzNy܍|w_~<"6=WUVBCo]ДHkәn߾}<ؾxϏgؕݞN?zH~j;Nۈ("+R8'in/D5~ $  c2BoC[ݦ]AW'w{n50ȡ?~xۣ,߮/SƿglhUD60(.8 lּdXZq#fvjR6R s282s7k` tZ] @?j'@!,CBj9=]jzm:BS7!ǧ ˠhI4a-R1fш!gFpqv_ 4AV=e]6\gpNq(Ғ94q +S@22:Wvn{;HHęoXz7a!ET90eHT5_J??V,ԏSfJlT#.&$)/J̄{aE\ ЖF?SQRh{JtJa[< +B@6*팺d_y '8ݚcD]r/96/_`C ېflkFd;/ٶ,qoȷ z =o#:\󍨉 {Kqvtn.0N񋄡aA04%ᚐZ~L6n_@y2"r_\F87tEڏ$60%QLF&-2qV @|퐈M yR5G,P5΂%>iJ5-uVrFhU>D jbdHǠØ=M[8 FKc8`5^9=~0)cK%"\狩.!pvFE5O)SWW|+>|g}fHNM+63Y|+5 4d}y^l0LLx\C-PAk>9-L:H9^k1]=ŠeRI01b2\ KaZ*fyX䏆%hػ\-1JnsgkЄ>៹2spc<\jy _]-ad2jΦdk_M-Qn(l,iTjۗkmZ!Eb%ߐ Ɖ/%͋J9)n'RI4MPMqֹ+__ +A)>Jy8X·CO,[/Yv䲿{K-ܾbȎ3KŶY*6)v艔Z) WlF%k^Vk(iٛjR4hʈVrM]3jnDY4FۤڡK)sUK/fZ*{m`g!#+7vf]3jE%PEiY5CUCIVVNLlMlu! wuE1&d @;l>c:^e<3I,~B`ˉ=MLVde>M&Y hR*}1 w9IWw\.hҿQnE.g2BqnVu-ڠ;H,=s1ZB)x۹'['hG26 w%iqrY4jθT;5"4*;5 T U BU_a`PG Yv^ZF_V=~Wݶgn;mT<n`G<-ŕkHh $ DgIi Ε֫).`HU$SW+wn]ȻW%1G>^/X~hR]J/WJ}slG#EiX6cJ4ffr4!÷tɛlH{fym,&CWA~: /lq>ixUvbXdXc%ÄJL%:w+y*I +KS(|49-<_Kzs_Z&9Wڛ Kfq5e>J3&+wV{+㯙\EIsd$*/`Q3;}M5Γ?UXiG[w&+*S +Ls"_Y]RH15( аiX xXTM¦LR@%§UnO4 rFme1~j/m0s߹R-HKlGhUYyٷVh ٻ=P)PDi (LR̔+ pu%{a'v3NC|Og +7 tR~qy'#hfzƴs[Vbu2j:7N /&6g9K%ɩnŶuvo-#p&suq +/|F0|3UV_~nqFENrgʞ첟6EOu .ḏ =iJtnH30 4xb4,- ØCj?V*m zs: sC _dØcOAx>VV b5[>E|5+b~JiZ4NRU WRi*|tVʫeS۫oouuzvNxLn(S,KGsLݫN_Ny{H04xiX$ #a]媸V2E7cfx߄ζ ؙaַM>In4S' מ )nWNt[ȱe5Qlx'ofc 蚤țQoOD'[$)^9r^Sg f ZPD.tD=Eפ$ԎHTJ9!'h}eQϸg߹΢KvQda7Qvy5)Qo[E߶vϠjyc[UC5@|jQ隤|MUkhɗI!- +)7/5QZ7Q*y5)!Y'w&/- H) I[֗X0wM4a]3SIJu}:ќdi+sxs•ٗ]#@p/i7&\ +Cq4rP3)qUH܈r,PF${E4&y#A"j'^DND(Bj֭oD2#)%}%5,z>ΐ%m'Wulfˉ]Izb+']LWX2Ldfڥ/OԨ¥#vF/%Nu +OMX2c5>_|?ax5{-aWԭc~O)j;)spwC6U <W9jS &N^JE{ ׎RIYuCmYm!FIm(q嵭@qMٙ%6O}%O׼E+&lj6h15NT(4$s!ЂVP7ff/]-܎-O*3L8e@PxPng}vfxxPn'JsrP;h ++}wQ-!Ogu8q{E`>n~p.^T̟PN@UD%'H!YQcRy݅?@"6v?C20eaiiu95w +3ݛT~*b;|wR#1wP5ߗW|#oɷF!a\iŮy5[9m7l!w9Dyu4IXA1YjњtX5&Vm> +stream +Q +1 0 0 1 0 0 cm +BT +/F7 7.5 Tf +0 0 0 rg +1 0 0 1 377.35162 781.10431 Tm +(+DQJ]KRX) Tj +ET +BT +/F7 7.5 Tf +0 0 0 rg +1 0 0 1 415.64661 781.10431 Tm +(=KLDQ) Tj +ET +BT +/F7 7.5 Tf +0 0 0 rg +1 0 0 1 437.2991 781.10431 Tm +(7HFKQRORJ\\) Tj +ET +BT +/F7 7.5 Tf +0 0 0 rg +1 0 0 1 479.96661 781.10431 Tm +(&R) Tj +ET +BT +/F7 7.5 Tf +0 0 0 rg +1 0 0 1 495.21411 781.10431 Tm +(/WG) Tj +ET +BT +/F8 8.5 Tf +0 0 0 rg +1 0 0 1 87.84 757.58032 Tm +() Tj +ET +BT +/F8 8.5 Tf +0 0 0 rg +1 0 0 1 116.7655 757.58032 Tm +(3RZHU) Tj +ET +BT +/F8 8.5 Tf +0 0 0 rg +1 0 0 1 146.2605 757.58032 Tm +(RQ) Tj +ET +BT +/F8 8.5 Tf +0 0 0 rg +1 0 0 1 159.3165 757.58032 Tm +(GHOD\\) Tj +ET +BT +/F8 8.5 Tf +0 0 0 rg +1 0 0 1 184.4935 757.58032 Tm +(WLPH) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 108.84 728.00031 Tm +($IWHU) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 121.745 728.00031 Tm +(WKH) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 130.75999 728.00031 Tm +(PRGXOH) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 150.03499 728.00031 Tm +(LV) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 155.01999 728.00031 Tm +(SRZHUHG) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 177.12999 728.00031 Tm +(RQ) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 185.88499 728.00031 Tm +(LW) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 190.28 728.00031 Tm +(WDNHV) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 204.075 728.00031 Tm +(DERXW) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 219.175 728.00031 Tm +(P6) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 236.72 728.00031 Tm +(7LPH) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 249.58501 728.00031 Tm +(IRU) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 257.69501 728.00031 Tm +(LQLWLDOL]DWLRQ) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 287.51001 728.00031 Tm +(ZRUN) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 301.84 728.00031 Tm +('XULQJ) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 319.39999 728.00031 Tm +(WKLV) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 329.28 728.00031 Tm +(SHULRG) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 347.26999 728.00031 Tm +(WKH) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 356.28497 728.00031 Tm +(PRGXOH) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 375.55997 728.00031 Tm +(FDQQRW) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 393.07495 728.00031 Tm +(UHVSRQG) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 413.91995 728.00031 Tm +(WR) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 420.04996 728.00031 Tm +(WKH) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 429.06494 728.00031 Tm +(FRPPDQG) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 454.10992 728.00031 Tm +(RI) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 460.15494 728.00031 Tm +(WKH) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 469.16992 728.00031 Tm +(XSSHU) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 484.59491 728.00031 Tm +(FRPSXWHU) Tj +ET +BT +/F8 7 Tf +0 0 0 rg +1 0 0 1 87.84 689.36029 Tm +() Tj +ET +BT +/F8 7 Tf +0 0 0 rg +1 0 0 1 111.661 689.36029 Tm +(\(OHFWULFDO) Tj +ET +BT +/F8 7 Tf +0 0 0 rg +1 0 0 1 145.58299 689.36029 Tm +(SDUDPHWHUV) Tj +ET +BT +/F8 7 Tf +0 0 0 rg +1 0 0 1 188.31099 689.36029 Tm +( ) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 190.68399 689.36029 Tm +($OO) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 199.26399 689.36029 Tm +(OHYHOV) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 216.41299 689.36029 Tm +(WR) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 223.63449 689.36029 Tm +(SRZHU) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 243.2475 689.36029 Tm +(VLJQDO) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 261.18298 689.36029 Tm +(JURXQG) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 282.70447 689.36029 Tm +(*1') Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 296.65796 689.36029 Tm +(LV) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 302.49896 689.36029 Tm +(WKH) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 313.17996 689.36029 Tm +(UHIHUHQFH) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 341.17496 689.36029 Tm +(OHYHO) Tj +ET +BT +/F8 8.5 Tf +0 0 0 rg +1 0 0 1 354.16046 689.36029 Tm +( ) Tj +ET +BT +/F8 10.5 Tf +0 0 0 rg +1 0 0 1 116.46 652.70032 Tm +() Tj +ET +BT +/F8 6.5 Tf +0 0 0 rg +1 0 0 1 138.069 652.70032 Tm +(SRZHU) Tj +ET +BT +/F8 6.5 Tf +0 0 0 rg +1 0 0 1 160.25351 652.70032 Tm +(LQSXW) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 234.00121 636.62061 Tm +(SDUDPHWHU) Tj +ET +BT +/F8 8.5 Tf +0 0 0 rg +1 0 0 1 135 628.82031 Tm +(SURMHFW) Tj +ET +BT +/F8 10.5 Tf +0 0 0 rg +1 0 0 1 311.2793 628.82031 Tm +(XQLW) Tj +ET +BT +/F8 4 Tf +0 0 0 rg +1 0 0 1 404.2189 628.82031 Tm +(SUHSDUH) Tj +ET +BT +/F8 10.5 Tf +0 0 0 rg +1 0 0 1 435.90372 628.82031 Tm +(1RWH) Tj +ET +BT +/F8 4 Tf +0 0 0 rg +1 0 0 1 203.2794 620.4801 Tm +(PLQLPXP) Tj +ET +BT +/F8 6 Tf +0 0 0 rg +1 0 0 1 239.2787 620.4801 Tm +(W\\SLFDO) Tj +ET +BT +/F8 4 Tf +0 0 0 rg +1 0 0 1 275.2789 620.4801 Tm +(PD[LPXP) Tj +ET +BT +/F7 10 Tf +0 0 0 rg +1 0 0 1 120.96 604.40033 Tm +(YROWDJH) Tj +ET +BT +/F7 10 Tf +0 0 0 rg +1 0 0 1 158.28 604.40033 Tm +(9LQ) Tj +ET +BT +/F7 10.5 Tf +0 0 0 rg +1 0 0 1 207.24001 604.40033 Tm +() Tj +ET +BT +/F7 10.5 Tf +0 0 0 rg +1 0 0 1 279.23999 604.40033 Tm +() Tj +ET +BT +/F7 10.5 Tf +0 0 0 rg +1 0 0 1 318.06 604.40033 Tm +(9) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 345.23999 604.40033 Tm +(QRUPDO) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 363.48999 604.40033 Tm +(ZRUNLQJ) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 383.935 604.40033 Tm +(YDOXH) Tj +ET +BT +/F7 7.5 Tf +0 0 0 rg +1 0 0 1 116.22 588.32031 Tm +(OLPLW) Tj +ET +BT +/F7 7.5 Tf +0 0 0 rg +1 0 0 1 133.69501 588.32031 Tm +(YROWDJH) Tj +ET +BT +/F7 7.5 Tf +0 0 0 rg +1 0 0 1 159.735 588.32031 Tm +(9LQ) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 170.80499 588.32031 Tm +(PD[) Tj +ET +BT +/F7 9 Tf +0 0 0 rg +1 0 0 1 202.74001 588.50043 Tm +() Tj +ET +BT +/F7 10.5 Tf +0 0 0 rg +1 0 0 1 211.74001 588.50043 Tm +() Tj +ET +BT +/F7 10.5 Tf +0 0 0 rg +1 0 0 1 279.2403 588.31982 Tm +() Tj +ET +BT +/F7 10.5 Tf +0 0 0 rg +1 0 0 1 318.06421 588.31982 Tm +(9) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 345.24011 588.31982 Tm +(\([FHHGLQJ) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 374.51111 588.31982 Tm +(WKLV) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 386.3526 588.31982 Tm +(UDQJH) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 403.94711 588.31982 Tm +(PD\\) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 417.22961 588.31982 Tm +(FDXVH) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 434.40613 588.31982 Tm +(SHUPDQHQW) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 466.65262 588.31982 Tm +(GDPDJH) Tj +ET +BT +/F7 6 Tf +0 0 0 rg +1 0 0 1 122.1 572.1803 Tm +(:RUNLQJ) Tj +ET +BT +/F7 6 Tf +0 0 0 rg +1 0 0 1 147.498 572.1803 Tm +(FXUUHQW) Tj +ET +BT +/F7 6 Tf +0 0 0 rg +1 0 0 1 169.86 572.1803 Tm +(,FF) Tj +ET +BT +/F7 10.5 Tf +0 0 0 rg +1 0 0 1 208.56 572.1803 Tm +() Tj +ET +BT +/F7 10.5 Tf +0 0 0 rg +1 0 0 1 241.92 572.1803 Tm +() Tj +ET +BT +/F7 10.5 Tf +0 0 0 rg +1 0 0 1 278.10001 572.1803 Tm +() Tj +ET +BT +/F7 10.5 Tf +0 0 0 rg +1 0 0 1 313.98001 572.1803 Tm +(P$) Tj +ET +BT +/F7 7.5 Tf +0 0 0 rg +1 0 0 1 116.82 553.88031 Tm +(SHDN) Tj +ET +BT +/F7 7.5 Tf +0 0 0 rg +1 0 0 1 135.825 553.88031 Tm +(FXUUHQW) Tj +ET +BT +/F7 7.5 Tf +0 0 0 rg +1 0 0 1 163.7775 553.88031 Tm +(LSHDN) Tj +ET +BT +/F7 10.5 Tf +0 0 0 rg +1 0 0 1 277.95331 553.88031 Tm +() Tj +ET +BT +/F7 10.5 Tf +0 0 0 rg +1 0 0 1 314.00089 553.88031 Tm +(P$) Tj +ET +BT +/F8 10 Tf +0 0 0 rg +1 0 0 1 116.46 527.66028 Tm +() Tj +ET +BT +/F8 10 Tf +0 0 0 rg +1 0 0 1 127.63 527.66028 Tm +(7;') Tj +ET +BT +/F8 10 Tf +0 0 0 rg +1 0 0 1 147.48999 527.66028 Tm +( RXWSXW) Tj +ET +BT +/F8 10 Tf +0 0 0 rg +1 0 0 1 188.06999 527.66028 Tm +(77/) Tj +ET +BT +/F8 10 Tf +0 0 0 rg +1 0 0 1 207.89999 527.66028 Tm +(ORJLF) Tj +ET +BT +/F8 10 Tf +0 0 0 rg +1 0 0 1 234.25999 527.66028 Tm +(OHYHO ) Tj +ET +BT +/F8 4 Tf +0 0 0 rg +1 0 0 1 316.8609 511.5806 Tm +(JLQVHQJ) Tj +ET +BT +/F8 4 Tf +0 0 0 rg +1 0 0 1 343.26526 511.5806 Tm +(QXPEHU) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 117.78 503.7803 Tm +(SURMHFW) Tj +ET +BT +/F8 4.5 Tf +0 0 0 rg +1 0 0 1 190.86 503.7803 Tm +(VWULS) Tj +ET +BT +/F8 4 Tf +0 0 0 rg +1 0 0 1 217.26437 503.7803 Tm +(SLHFH) Tj +ET +BT +/F8 10.5 Tf +0 0 0 rg +1 0 0 1 410.2796 503.7803 Tm +(XQLW) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 464.2789 503.7803 Tm +(5HPDUN) Tj +ET +BT +/F8 4 Tf +0 0 0 rg +1 0 0 1 279.7803 495.5 Tm +(PLQLPXP) Tj +ET +BT +/F8 6 Tf +0 0 0 rg +1 0 0 1 324.78021 495.5 Tm +(W\\SLFDO) Tj +ET +BT +/F8 4 Tf +0 0 0 rg +1 0 0 1 369.78 495.5 Tm +(PD[LPXP) Tj +ET +BT +/F7 10.5 Tf +0 0 0 rg +1 0 0 1 119.88 477.92029 Tm +(9) Tj +ET +BT +/F7 7 Tf +0 0 0 rg +1 0 0 1 126.18 477.92029 Tm +(2/) Tj +ET +BT +/F7 10 Tf +0 0 0 rg +1 0 0 1 156.24001 479.42029 Tm +(,) Tj +ET +BT +/F7 6.5 Tf +0 0 0 rg +1 0 0 1 159.63 479.42029 Tm +(2/) Tj +ET +BT +/F7 10 Tf +0 0 0 rg +1 0 0 1 168.1125 479.42029 Tm +( ) Tj +ET +BT +/F7 10 Tf +0 0 0 rg +1 0 0 1 177.05251 479.42029 Tm +(P$) Tj +ET +BT +/F7 10.5 Tf +0 0 0 rg +1 0 0 1 373.73999 479.42029 Tm +() Tj +ET +BT +/F7 10.5 Tf +0 0 0 rg +1 0 0 1 417.06 479.42029 Tm +(9) Tj +ET +BT +/F7 10 Tf +0 0 0 rg +1 0 0 1 444.23999 479.42029 Tm +(ORJLF) Tj +ET +BT +/F7 10 Tf +0 0 0 rg +1 0 0 1 469 479.42029 Tm +() Tj +ET +BT +/F7 10.5 Tf +0 0 0 rg +1 0 0 1 119.52 461.7803 Tm +(9) Tj +ET +BT +/F7 7 Tf +0 0 0 rg +1 0 0 1 125.82 461.7803 Tm +(2+) Tj +ET +BT +/F7 10 Tf +0 0 0 rg +1 0 0 1 156.24001 463.2803 Tm +(,) Tj +ET +BT +/F7 6.5 Tf +0 0 0 rg +1 0 0 1 159.63 463.2803 Tm +(2+) Tj +ET +BT +/F7 10 Tf +0 0 0 rg +1 0 0 1 169.52301 463.2803 Tm +( ) Tj +ET +BT +/F7 10 Tf +0 0 0 rg +1 0 0 1 177.84302 463.2803 Tm +(P$) Tj +ET +BT +/F7 10.5 Tf +0 0 0 rg +1 0 0 1 283.74261 463.2803 Tm +() Tj +ET +BT +/F8 9 Tf +0 0 0 rg +1 0 0 1 374.69971 463.70029 Tm +() Tj +ET +BT +/F7 10.5 Tf +0 0 0 rg +1 0 0 1 417.06 463.2803 Tm +(9) Tj +ET +BT +/F7 10 Tf +0 0 0 rg +1 0 0 1 444.2403 463.2803 Tm +(ORJLF) Tj +ET +BT +/F7 10 Tf +0 0 0 rg +1 0 0 1 469.00031 463.2803 Tm +() Tj +ET +BT +/F8 10 Tf +0 0 0 rg +1 0 0 1 116.46 438.26031 Tm +() Tj +ET +BT +/F8 10 Tf +0 0 0 rg +1 0 0 1 127.63 438.26031 Tm +(5;') Tj +ET +BT +/F8 10 Tf +0 0 0 rg +1 0 0 1 150.89999 438.26031 Tm +(SLQ) Tj +ET +BT +/F8 10 Tf +0 0 0 rg +1 0 0 1 169.45 438.26031 Tm +( LQSXW) Tj +ET +BT +/F8 10 Tf +0 0 0 rg +1 0 0 1 202.54999 438.26031 Tm +(77/) Tj +ET +BT +/F8 10 Tf +0 0 0 rg +1 0 0 1 222.37999 438.26031 Tm +(ORJLF) Tj +ET +BT +/F8 10 Tf +0 0 0 rg +1 0 0 1 248.73999 438.26031 Tm +(OHYHO ) Tj +ET +BT +/F8 4 Tf +0 0 0 rg +1 0 0 1 316.8609 422.1806 Tm +(JLQVHQJ) Tj +ET +BT +/F8 4 Tf +0 0 0 rg +1 0 0 1 343.26526 422.1806 Tm +(QXPEHU) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 117.78 414.38031 Tm +(SURMHFW) Tj +ET +BT +/F8 4.5 Tf +0 0 0 rg +1 0 0 1 190.86 414.38031 Tm +(VWULS) Tj +ET +BT +/F8 4 Tf +0 0 0 rg +1 0 0 1 217.26437 414.38031 Tm +(SLHFH) Tj +ET +BT +/F8 10.5 Tf +0 0 0 rg +1 0 0 1 410.2796 414.38031 Tm +(XQLW) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 464.2789 414.38031 Tm +(5HPDUN) Tj +ET +BT +/F8 4 Tf +0 0 0 rg +1 0 0 1 279.7803 406.0401 Tm +(PLQLPXP) Tj +ET +BT +/F8 6 Tf +0 0 0 rg +1 0 0 1 324.78021 406.0401 Tm +(W\\SLFDO) Tj +ET +BT +/F8 4 Tf +0 0 0 rg +1 0 0 1 369.78 406.0401 Tm +(PD[LPXP) Tj +ET +BT +/F7 10.5 Tf +0 0 0 rg +1 0 0 1 121.26 389.9603 Tm +(9) Tj +ET +BT +/F7 7 Tf +0 0 0 rg +1 0 0 1 127.56001 389.9603 Tm +(,/) Tj +ET +BT +/F7 10.5 Tf +0 0 0 rg +1 0 0 1 373.73999 389.9603 Tm +() Tj +ET +BT +/F7 10.5 Tf +0 0 0 rg +1 0 0 1 417.06 389.9603 Tm +(9) Tj +ET +BT +/F7 10 Tf +0 0 0 rg +1 0 0 1 444.23999 389.9603 Tm +(ORJLF) Tj +ET +BT +/F7 10 Tf +0 0 0 rg +1 0 0 1 469 389.9603 Tm +() Tj +ET +BT +/F7 10.5 Tf +0 0 0 rg +1 0 0 1 120.84 373.88031 Tm +(9) Tj +ET +BT +/F7 7 Tf +0 0 0 rg +1 0 0 1 127.14 373.88031 Tm +(,+) Tj +ET +BT +/F7 10.5 Tf +0 0 0 rg +1 0 0 1 283.7399 373.88031 Tm +() Tj +ET +BT +/F7 10.5 Tf +0 0 0 rg +1 0 0 1 417.06299 373.88031 Tm +(9) Tj +ET +BT +/F7 10 Tf +0 0 0 rg +1 0 0 1 444.23969 373.88031 Tm +(ORJLF) Tj +ET +BT +/F7 10 Tf +0 0 0 rg +1 0 0 1 468.99969 373.88031 Tm +() Tj +ET +BT +/F7 10 Tf +0 0 0 rg +1 0 0 1 156.24001 357.7403 Tm +(9) Tj +ET +BT +/F7 6.5 Tf +0 0 0 rg +1 0 0 1 162.24001 357.7403 Tm +(,+) Tj +ET +BT +/F7 10 Tf +0 0 0 rg +1 0 0 1 170.95001 357.7403 Tm +( 9) Tj +ET +BT +/F7 10.5 Tf +0 0 0 rg +1 0 0 1 332.70001 357.7403 Tm +() Tj +ET +BT +/F7 10.5 Tf +0 0 0 rg +1 0 0 1 412.98001 357.7403 Tm +(P$) Tj +ET +BT +/F7 10.5 Tf +0 0 0 rg +1 0 0 1 122.88 348.44031 Tm +(,) Tj +ET +BT +/F7 7 Tf +0 0 0 rg +1 0 0 1 126.4395 348.44031 Tm +(,+) Tj +ET +BT +/F7 10 Tf +0 0 0 rg +1 0 0 1 156.24001 341.66031 Tm +(9) Tj +ET +BT +/F7 6.5 Tf +0 0 0 rg +1 0 0 1 162.24001 341.66031 Tm +(,+) Tj +ET +BT +/F7 10 Tf +0 0 0 rg +1 0 0 1 170.95001 341.66031 Tm +( 9) Tj +ET +BT +/F7 10.5 Tf +0 0 0 rg +1 0 0 1 330.07031 341.66031 Tm +() Tj +ET +BT +/F7 10.5 Tf +0 0 0 rg +1 0 0 1 414.4231 341.66031 Tm +(X$) Tj +ET +BT +/F7 9.5 Tf +0 0 0 rg +1 0 0 1 117.36 324.08044 Tm +(9) Tj +ET +BT +/F7 6.5 Tf +0 0 0 rg +1 0 0 1 123.06 324.08044 Tm +(,PD[) Tj +ET +BT +/F7 9 Tf +0 0 0 rg +1 0 0 1 279.23999 325.76031 Tm +() Tj +ET +BT +/F7 10.5 Tf +0 0 0 rg +1 0 0 1 288.23999 325.76031 Tm +() Tj +ET +BT +/F7 10.5 Tf +0 0 0 rg +1 0 0 1 373.73999 325.58044 Tm +() Tj +ET +BT +/F7 10.5 Tf +0 0 0 rg +1 0 0 1 417.06 325.58044 Tm +(9) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 444.23999 326.06042 Tm +(/LPLW) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 459.9205 326.06042 Tm +(LQSXW) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 476.1235 326.06042 Tm +(YROWDJH) Tj +ET +BT +/F8 7 Tf +0 0 0 rg +1 0 0 1 87.84 287.36041 Tm +() Tj +ET +BT +/F8 7 Tf +0 0 0 rg +1 0 0 1 105.66199 287.36041 Tm +(86%) Tj +ET +BT +/F8 7 Tf +0 0 0 rg +1 0 0 1 121.33499 287.36041 Tm +(FRPPXQLFDWLRQ) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 108.84 252.26031 Tm +(PRGXOH) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 128.11499 252.26031 Tm +(DQG) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 138.38499 252.26031 Tm +(XVHU) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 150.05499 252.26031 Tm +(HTXLSPHQW) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 177.095 252.26031 Tm +(86%) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 188.045 252.26031 Tm +(:KHQ) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 202.995 252.26031 Tm +(FRPPXQLFDWLQJ) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 242.345 252.26031 Tm +(WKH) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 251.36 252.26031 Tm +(LQWHUIDFH) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 273.47501 252.26031 Tm +(-) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 279 252.26031 Tm +(7KH) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 288.98999 252.26031 Tm +(SLQV) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 300.13998 252.26031 Tm +(DUH) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 309.12997 252.26031 Tm +(GHILQHG) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 328.31998 252.26031 Tm +(DV) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 334.81998 252.26031 Tm +(IROORZV) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 112.5003 235.16003 Tm +(SLQ) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 121.7753 235.16003 Tm +(QXPEHU) Tj +ET +BT +/F8 10.5 Tf +0 0 0 rg +1 0 0 1 160.1398 235.69971 Tm +(QDPH) Tj +ET +BT +/F8 10.5 Tf +0 0 0 rg +1 0 0 1 207.75 235.69971 Tm +(W\\SH) Tj +ET +BT +/F8 4 Tf +0 0 0 rg +1 0 0 1 342.5899 235.69971 Tm +(DFKLHYHPHQW) Tj +ET +BT +/F8 6.5 Tf +0 0 0 rg +1 0 0 1 368.99945 235.69971 Tm +(&DQ) Tj +ET +BT +/F8 6.5 Tf +0 0 0 rg +1 0 0 1 383.02646 235.69971 Tm +(GUDZ) Tj +ET +BT +/F8 4 Tf +0 0 0 rg +1 0 0 1 416.52866 235.69971 Tm +(VWDWHG) Tj +ET +BT +/F7 10.5 Tf +0 0 0 rg +1 0 0 1 125.7 219.08032 Tm +() Tj +ET +BT +/F7 10.5 Tf +0 0 0 rg +1 0 0 1 165.42 219.08032 Tm +(9LQ) Tj +ET +BT +/F7 10.5 Tf +0 0 0 rg +1 0 0 1 214.2 219.08032 Tm +(LQ) Tj +ET +BT +/F7 4.5 Tf +0 0 0 rg +1 0 0 1 246.24001 219.08032 Tm +(3RVLWLYH) Tj +ET +BT +/F7 4.5 Tf +0 0 0 rg +1 0 0 1 263.78101 219.08032 Tm +(LQSXW) Tj +ET +BT +/F7 4.5 Tf +0 0 0 rg +1 0 0 1 276.06601 219.08032 Tm +(WHUPLQDO) Tj +ET +BT +/F7 4.5 Tf +0 0 0 rg +1 0 0 1 295.09201 219.08032 Tm +(RI) Tj +ET +BT +/F7 4.5 Tf +0 0 0 rg +1 0 0 1 300.5325 219.08032 Tm +(SRZHU) Tj +ET +BT +/F7 4.5 Tf +0 0 0 rg +1 0 0 1 315.12601 219.08032 Tm +(VXSSO\\) Tj +ET +BT +/F7 4.5 Tf +0 0 0 rg +1 0 0 1 331.4295 219.08032 Tm +( 5HIHU) Tj +ET +BT +/F7 4.5 Tf +0 0 0 rg +1 0 0 1 345.23102 219.08032 Tm +(WR) Tj +ET +BT +/F7 4.5 Tf +0 0 0 rg +1 0 0 1 350.74802 219.08032 Tm +() Tj +ET +BT +/F7 4.5 Tf +0 0 0 rg +1 0 0 1 365.83203 219.08032 Tm +(IRU) Tj +ET +BT +/F7 4.5 Tf +0 0 0 rg +1 0 0 1 373.13104 219.08032 Tm +(HOHFWULFDO) Tj +ET +BT +/F7 4.5 Tf +0 0 0 rg +1 0 0 1 393.18753 219.08032 Tm +(SDUDPHWHUV ) Tj +ET +BT +/F7 10.5 Tf +0 0 0 rg +1 0 0 1 125.7 202.94031 Tm +() Tj +ET +BT +/F7 10.5 Tf +0 0 0 rg +1 0 0 1 165.42039 202.94031 Tm +('3) Tj +ET +BT +/F7 8.5 Tf +0 0 0 rg +1 0 0 1 204.6001 202.94031 Tm +(,Q) Tj +ET +BT +/F7 8.5 Tf +0 0 0 rg +1 0 0 1 215.89659 202.94031 Tm +(2XW) Tj +ET +BT +/F7 8 Tf +0 0 0 rg +1 0 0 1 246.24001 202.94031 Tm +(86%) Tj +ET +BT +/F7 8 Tf +0 0 0 rg +1 0 0 1 263.76001 202.94031 Tm +(GDWD) Tj +ET +BT +/F7 8 Tf +0 0 0 rg +1 0 0 1 282.62402 202.94031 Tm +(FDEOH) Tj +ET +BT +/F7 10.5 Tf +0 0 0 rg +1 0 0 1 125.7 186.86029 Tm +() Tj +ET +BT +/F7 10.5 Tf +0 0 0 rg +1 0 0 1 165.42 186.86029 Tm +('3) Tj +ET +BT +/F7 8.5 Tf +0 0 0 rg +1 0 0 1 204.60001 186.86029 Tm +(,Q) Tj +ET +BT +/F7 8.5 Tf +0 0 0 rg +1 0 0 1 215.8965 186.86029 Tm +(2XW) Tj +ET +BT +/F7 8 Tf +0 0 0 rg +1 0 0 1 246.24001 186.86029 Tm +(86%) Tj +ET +BT +/F7 8 Tf +0 0 0 rg +1 0 0 1 263.76001 186.86029 Tm +(GDWD) Tj +ET +BT +/F7 8 Tf +0 0 0 rg +1 0 0 1 282.62402 186.86029 Tm +(FDEOH) Tj +ET +BT +/F7 10.5 Tf +0 0 0 rg +1 0 0 1 125.7 170.78027 Tm +() Tj +ET +BT +/F7 10.5 Tf +0 0 0 rg +1 0 0 1 165.39529 170.78027 Tm +(*1') Tj +ET +BT +/F7 10.5 Tf +0 0 0 rg +1 0 0 1 213.02139 170.78027 Tm +() Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 246.2067 170.78027 Tm +(VLJQDO) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 261.45169 170.78027 Tm +(JURXQG) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 281.51169 170.78027 Tm +(,QWHUQDOO\\) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 305.31168 170.78027 Tm +(FRQQHFWHG) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 331.13669 170.78027 Tm +(WR) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 337.26669 170.78027 Tm +(SRZHU) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 353.48169 170.78027 Tm +(JURXQG) Tj +ET +BT +/F7 10.5 Tf +0 0 0 rg +1 0 0 1 125.7 153.50031 Tm +() Tj +ET +BT +/F7 10.5 Tf +0 0 0 rg +1 0 0 1 165.42 153.50031 Tm +(\(1') Tj +ET +BT +/F7 10.5 Tf +0 0 0 rg +1 0 0 1 213.06 153.50031 Tm +() Tj +ET +BT +/F7 4 Tf +0 0 0 rg +1 0 0 1 246.24001 153.50031 Tm +(SURWHFWHG) Tj +ET +BT +/F7 4 Tf +0 0 0 rg +1 0 0 1 265.59201 153.50031 Tm +(DUHD) Tj +ET +BT +/F7 4 Tf +0 0 0 rg +1 0 0 1 276.10001 153.50031 Tm +(,W) Tj +ET +BT +/F7 4 Tf +0 0 0 rg +1 0 0 1 279.94 153.50031 Tm +(FDQ) Tj +ET +BT +/F7 4 Tf +0 0 0 rg +1 0 0 1 287.616 153.50031 Tm +(EH) Tj +ET +BT +/F7 4 Tf +0 0 0 rg +1 0 0 1 293.37201 153.50031 Tm +(VXVSHQGHG) Tj +ET +BT +/F7 4 Tf +0 0 0 rg +1 0 0 1 315.08002 153.50031 Tm +(RU) Tj +ET +BT +/F7 4 Tf +0 0 0 rg +1 0 0 1 320.19202 153.50031 Tm +(FDQ) Tj +ET +BT +/F7 4 Tf +0 0 0 rg +1 0 0 1 327.86801 153.50031 Tm +(EH) Tj +ET +BT +/F7 4 Tf +0 0 0 rg +1 0 0 1 333.62402 153.50031 Tm +(FRQQHFWHG) Tj +ET +BT +/F7 4 Tf +0 0 0 rg +1 0 0 1 354.28403 153.50031 Tm +(WR) Tj +ET +BT +/F7 4 Tf +0 0 0 rg +1 0 0 1 359.18802 153.50031 Tm +(WKH) Tj +ET +BT +/F7 4 Tf +0 0 0 rg +1 0 0 1 366.40002 153.50031 Tm +(VKLHOGLQJ) Tj +ET +BT +/F7 4 Tf +0 0 0 rg +1 0 0 1 384.57202 153.50031 Tm +(OD\\HU) Tj +ET +BT +/F7 4 Tf +0 0 0 rg +1 0 0 1 394.83603 153.50031 Tm +(RI) Tj +ET +BT +/F7 4 Tf +0 0 0 rg +1 0 0 1 399.67203 153.50031 Tm +(WKH) Tj +ET +BT +/F7 4 Tf +0 0 0 rg +1 0 0 1 406.88403 153.50031 Tm +(FRPPXQLFDWLRQ) Tj +ET +BT +/F7 4 Tf +0 0 0 rg +1 0 0 1 437.25204 153.50031 Tm +(OHDG) Tj +ET +BT +/F8 4 Tf +0 0 0 rg +1 0 0 1 446.31604 153.50031 Tm +( $OO) Tj +ET +BT +/F8 4 Tf +0 0 0 rg +1 0 0 1 454.16003 153.50031 Tm +(LQ) Tj +ET +BT +/F8 4 Tf +0 0 0 rg +1 0 0 1 459.29602 153.50031 Tm +(RQH) Tj +ET +BT +/F8 4 Tf +0 0 0 rg +1 0 0 1 467.80402 153.50031 Tm +(PRGXOH) Tj +ET +BT +/F8 4 Tf +0 0 0 rg +1 0 0 1 483.992 153.50031 Tm +(GRHV) Tj +ET +BT +/F8 4 Tf +0 0 0 rg +1 0 0 1 494.392 153.50031 Tm +(QRW) Tj +ET +BT +/F8 4 Tf +0 0 0 rg +1 0 0 1 502.272 153.50031 Tm +(KDYH) Tj +ET +BT +/F8 4 Tf +0 0 0 rg +1 0 0 1 512.99603 153.50031 Tm +(WKLV) Tj +ET +BT +/F8 4 Tf +0 0 0 rg +1 0 0 1 521.60803 153.50031 Tm +(SLQ ) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 114.84 136.76031 Tm +(1RWH) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 129.84999 136.76031 Tm +(7\\SH) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 142.37498 136.76031 Tm +(FROXPQ) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 161.28499 136.76031 Tm +(LQ) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 166.965 136.76031 Tm +(UHSUHVHQWV) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 193.61499 136.76031 Tm +(WKH) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 202.62999 136.76031 Tm +(LQSXW) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 216.27998 136.76031 Tm +(WR) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 222.40999 136.76031 Tm +(WKH) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 231.42499 136.76031 Tm +(PRGXOH) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 250.73999 136.76031 Tm +(RXW) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 259.95999 136.76031 Tm +(RXWSXW) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 277.14999 136.76031 Tm +(IURP) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 289.935 136.76031 Tm +(WKH) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 298.95001 136.76031 Tm +(PRGXOH) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 270.17999 45.86041 Tm +(WKH) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 280.0965 45.86041 Tm +(ILUVW) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 291.729 45.86041 Tm +() Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 296.30499 45.86041 Tm +(SDJHV) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 313.32199 45.86041 Tm +(RI) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 319.9715 45.86041 Tm +() Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 327.69348 45.86041 Tm +(3DJH) Tj +ET + +endstream +endobj +887 0 obj +<< +/Length 2 +>> +stream +q + +endstream +endobj +888 0 obj +<< +/Length 898 +/Filter /FlateDecode +>> +stream +xjI)S>ArY0eΘ`;xw~F#[,<3믯j oތ6__8aqOW_o_mnᅦpQKJ8,1SkEex6UW0BkHp}QPk0ineSwǠ'i fH)Lk ׀뇡bP*Fy CO bL9:^a(:XhgqeWi-`Ur>16WE¢q{EJ-r1g+ Oc %j)1NR(<\7øWݥVŐ#Ķ8o5*I5A/|^DEʳKKF=]R?竏g`ːBȳa9m6F}е1-g8om1 1Y w=80 ,R=Re;T6}B'u ',+poN'Xn`m,2ˁpd\[rȇLV(?y@6{RJӼI%'-W.%RAwQQQKUTM]t\ +똏K!R1;0 DO^䒢StSt//P.Em^MM.Y玔zA=;HzT빳.rQ5žD A.9%gk$ȅ=cх=t6fVzLb-VzLl=V:ud$dsڳ{bka]ZM&=6kSGvq:mua]ܣDŽ{dkWGHj;h>xG +endstream +endobj +889 0 obj +<< +/Length 6162 +>> +stream +Q +1 0 0 1 0 0 cm +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 377.35162 781.10431 Tm +(+DQJ]KRX) Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 415.64661 781.10431 Tm +(=KLDQ) Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 437.2991 781.10431 Tm +(7HFKQRORJ\\) Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 479.96661 781.10431 Tm +(&R) Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 495.21411 781.10431 Tm +(/WG) Tj +ET +BT +/F6 10 Tf +0 0 0 rg +1 0 0 1 87.84 748.28027 Tm +() Tj +ET +BT +/F6 10 Tf +0 0 0 rg +1 0 0 1 104.73 748.28027 Tm +(6HQVRU) Tj +ET +BT +/F6 10 Tf +0 0 0 rg +1 0 0 1 141.01999 748.28027 Tm +(LQWHUIDFH) Tj +ET +BT +/F6 10 Tf +0 0 0 rg +1 0 0 1 188.98999 748.28027 Tm +( PDUNHG) Tj +ET +BT +/F6 10 Tf +0 0 0 rg +1 0 0 1 233.81999 748.28027 Tm +(RQ) Tj +ET +BT +/F6 10 Tf +0 0 0 rg +1 0 0 1 249.17999 748.28027 Tm +(WKH) Tj +ET +BT +/F6 10 Tf +0 0 0 rg +1 0 0 1 268.60001 748.28027 Tm +(ERDUG) Tj +ET +BT +/F6 10 Tf +0 0 0 rg +1 0 0 1 300.88 748.28027 Tm +(-) Tj +ET +BT +/F6 10 Tf +0 0 0 rg +1 0 0 1 309.91 748.28027 Tm +( ) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 108.84 713.90033 Tm +(7KH) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 120.828 713.90033 Tm +(VSOLW) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 134.21399 713.90033 Tm +(PRGXOH) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 157.34399 713.90033 Tm +(SURYLGHV) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 183.246 713.90033 Tm +(D) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 188.172 713.90033 Tm +(GHGLFDWHG) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 217.53 713.90033 Tm +(LQWHUIDFH) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 244.06799 713.90033 Tm +(WR) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 251.424 713.90033 Tm +(WKH) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 262.242 713.90033 Tm +(RSWLFDO) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 282.63 713.90033 Tm +(ILQJHUSULQW) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 314.65201 713.90033 Tm +(VHQVRU) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 335.16 713.90033 Tm +(ERDUG) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 353.57401 713.90033 Tm +( ) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 364.17001 713.90033 Tm +(SLQ) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 374.67603 713.90033 Tm +(VLQJOH) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 393.36002 713.90033 Tm +(URZ) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 405.74402 713.90033 Tm +(VRFNHW) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 426.11401 713.90033 Tm +(SLQ) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 438.22803 713.90033 Tm +(PP) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 462.91202 713.90033 Tm +(SLWFK ) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 481.87201 713.90033 Tm +(8VH) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 494.07602 713.90033 Tm +(WKLV) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 505.93201 713.90033 Tm +(LQWHUIDFH) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 87.84 698.2973 Tm +(WR) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 95.196 698.2973 Tm +(FRQQHFW) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 119.112 698.2973 Tm +(WR) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 126.468 698.2973 Tm +(WKH) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 137.286 698.2973 Tm +(VHQVRU) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 157.79399 698.2973 Tm +(ERDUG) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 176.20799 698.2973 Tm +(WKURXJK) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 200.85599 698.2973 Tm +(D) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 205.78198 698.2973 Tm +() Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 214.57799 698.2973 Tm +(SLQ) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 225.08398 698.2973 Tm +(FDEOH) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 243.11998 698.2973 Tm +(:KHQ) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 261.05997 698.2973 Tm +(WKH) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 271.87796 698.2973 Tm +(XVHU) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 285.88196 698.2973 Tm +(KDV) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 297.38995 698.2973 Tm +(QR) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 306.28796 698.2973 Tm +(VSHFLDO) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 327.13797 698.2973 Tm +(UHTXLUHPHQWV) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 368.71796 698.2973 Tm +(WKH) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 379.53595 698.2973 Tm +(SURYLGHG) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 406.25394 698.2973 Tm +(OHDG) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 419.80194 698.2973 Tm +(OHQJWK) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 439.56595 698.2973 Tm +(LV) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 445.54794 698.2973 Tm +(PP) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 108.8389 682.70062 Tm +($OO) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 115.4854 682.70062 Tm +(LQ) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 120.8764 682.70062 Tm +(RQH) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 130.08789 682.70062 Tm +(PRGXOH) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 147.43539 682.70062 Tm +(7KH) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 156.42639 682.70062 Tm +(LQWHUIDFH) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 176.3299 682.70062 Tm +(LV) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 180.81639 682.70062 Tm +(DQ) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 187.29189 682.70062 Tm +(LQWHUQDO) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 204.89139 682.70062 Tm +(FRQQHFWLRQ) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 229.49289 682.70062 Tm +(DQG) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 238.73589 682.70062 Tm +(GRHV) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 250.08939 682.70062 Tm +(QRW) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 258.38739 682.70062 Tm +(UHTXLUH) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 275.05988 682.70062 Tm +(XVHU) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 285.56287 682.70062 Tm +(FRQVLGHUDWLRQ) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 270.17999 45.86041 Tm +(WKH) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 280.0965 45.86041 Tm +(ILUVW) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 291.729 45.86041 Tm +() Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 296.30499 45.86041 Tm +(SDJHV) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 313.32199 45.86041 Tm +(RI) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 319.9715 45.86041 Tm +() Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 327.69348 45.86041 Tm +(3DJH) Tj +ET + +endstream +endobj +890 0 obj +<< +/Length 2 +>> +stream +q + +endstream +endobj +891 0 obj +<< +/Length 909 +/Filter /FlateDecode +>> +stream +xUjH}WL!MH$͘`|zvpv>խ֨%K4u=ut~w}uvw_pvw?~=~}{ +S38F11޿m~B{U៦?˨Y)5(*#Hu!>Gei?(8kh$DCpv5m) l;!ِ9_#&dG]7 +S1)i!'_T]4햿kQ鵄,& +~HT3)}t6 ٠>Qo'hI/[1jK+cAme&2%c18e YKEoR1"mixt( +nQ8 +>JA |>7'"gxqi,v CbxeY̜[Ҁǂ.FBpIY<8ᡧ2Ig":TͧdGaatBxko=~=~Q:UBza#\*!וٔ7^3BeGi<^I^ +6/$-{Tyi!c}adt@r5;8 + hTJ0HG?$tˣOHHaK).c&5 +v#\j>\.Qԗo[䱊W5g/!RzQ7^dC\}UY}5+1n35e: hYZ Sm-}>{Tzä}F pB.]l53cğiA?/K1_4o[LK06oØjsp_1 +E9ܓ0rm.fI6#a]D:te~{ +endstream +endobj +892 0 obj +<< +/Length 30537 +>> +stream +Q +1 0 0 1 0 0 cm +BT +/F7 7.5 Tf +0 0 0 rg +1 0 0 1 377.35162 781.10431 Tm +(+DQJ]KRX) Tj +ET +BT +/F7 7.5 Tf +0 0 0 rg +1 0 0 1 415.64661 781.10431 Tm +(=KLDQ) Tj +ET +BT +/F7 7.5 Tf +0 0 0 rg +1 0 0 1 437.2991 781.10431 Tm +(7HFKQRORJ\\) Tj +ET +BT +/F7 7.5 Tf +0 0 0 rg +1 0 0 1 479.96661 781.10431 Tm +(&R) Tj +ET +BT +/F7 7.5 Tf +0 0 0 rg +1 0 0 1 495.21411 781.10431 Tm +(/WG) Tj +ET +BT +/F8 13 Tf +0 0 0 rg +1 0 0 1 208.25999 704.2403 Tm +(&KDSWHU) Tj +ET +BT +/F8 13 Tf +0 0 0 rg +1 0 0 1 263.76999 704.2403 Tm +() Tj +ET +BT +/F8 13 Tf +0 0 0 rg +1 0 0 1 274.586 704.2403 Tm +(6\\VWHP) Tj +ET +BT +/F8 13 Tf +0 0 0 rg +1 0 0 1 325.078 704.2403 Tm +(5HVRXUFHV) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 108.84 658.28027 Tm +(,Q) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 115.53349 658.28027 Tm +(RUGHU) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 131.3185 658.28027 Tm +(WR) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 138.06149 658.28027 Tm +(PHHW) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 152.82349 658.28027 Tm +(WKH) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 162.73999 658.28027 Tm +(QHHGV) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 179.78999 658.28027 Tm +(RI) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 186.4395 658.28027 Tm +(GLIIHUHQW) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 210.315 658.28027 Tm +(FXVWRPHUV) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 240.356 658.28027 Tm +(WKH) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 250.27251 658.28027 Tm +(PRGXOH) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 271.47501 658.28027 Tm +(V\\VWHP) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 291.20901 658.28027 Tm +(SURYLGHV) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 314.95251 658.28027 Tm +(D) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 319.46802 658.28027 Tm +(ORW) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 327.63 658.28027 Tm +(RI) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 334.27951 658.28027 Tm +(UHVRXUFHV) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 361.09201 658.28027 Tm +(IRU) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 370.013 658.28027 Tm +(WKH) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 379.9295 658.28027 Tm +(XVHU) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 392.76651 658.28027 Tm +(V\\VWHP) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 412.50052 658.28027 Tm +(WR) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 419.24353 658.28027 Tm +(XVH) Tj +ET +BT +/F8 15 Tf +0 0 0 rg +1 0 0 1 87.84 615.98029 Tm +() Tj +ET +BT +/F8 15 Tf +0 0 0 rg +1 0 0 1 113.175 615.98029 Tm +(EXIIHU) Tj +ET +BT +/F7 6.5 Tf +0 0 0 rg +1 0 0 1 108.84 581.60028 Tm +(7KHUH) Tj +ET +BT +/F7 6.5 Tf +0 0 0 rg +1 0 0 1 128.17749 581.60028 Tm +(LV) Tj +ET +BT +/F7 6.5 Tf +0 0 0 rg +1 0 0 1 134.65799 581.60028 Tm +(DQ) Tj +ET +BT +/F7 6.5 Tf +0 0 0 rg +1 0 0 1 144.01149 581.60028 Tm +(LPDJH) Tj +ET +BT +/F7 6.5 Tf +0 0 0 rg +1 0 0 1 164.76599 581.60028 Tm +(EXIIHU) Tj +ET +BT +/F7 6.5 Tf +0 0 0 rg +1 0 0 1 185.293 581.60028 Tm +(,PDJH%XIIHU) Tj +ET +BT +/F7 6.5 Tf +0 0 0 rg +1 0 0 1 225.63849 581.60028 Tm +(ZLWK) Tj +ET +BT +/F7 6.5 Tf +0 0 0 rg +1 0 0 1 240.478 581.60028 Tm +(D) Tj +ET +BT +/F7 6.5 Tf +0 0 0 rg +1 0 0 1 245.8145 581.60028 Tm +(VL]H) Tj +ET +BT +/F7 6.5 Tf +0 0 0 rg +1 0 0 1 259.01599 581.60028 Tm +(RI) Tj +ET +BT +/F7 6.5 Tf +0 0 0 rg +1 0 0 1 266.87448 581.60028 Tm +(.) Tj +ET +BT +/F7 6.5 Tf +0 0 0 rg +1 0 0 1 280.02399 581.60028 Tm +(E\\WHV) Tj +ET +BT +/F7 6.5 Tf +0 0 0 rg +1 0 0 1 298.1525 581.60028 Tm +(DQG) Tj +ET +BT +/F7 6.5 Tf +0 0 0 rg +1 0 0 1 311.50351 581.60028 Tm +(WZR) Tj +ET +BT +/F7 6.5 Tf +0 0 0 rg +1 0 0 1 324.58151 581.60028 Tm +(FKDUDFWHULVWLF) Tj +ET +BT +/F7 6.5 Tf +0 0 0 rg +1 0 0 1 367.13702 581.60028 Tm +(ILOH) Tj +ET +BT +/F7 6.5 Tf +0 0 0 rg +1 0 0 1 378.08304 581.60028 Tm +(EXIIHUV) Tj +ET +BT +/F7 6.5 Tf +0 0 0 rg +1 0 0 1 401.72354 581.60028 Tm +(&KDU%XIIHU) Tj +ET +BT +/F7 6.5 Tf +0 0 0 rg +1 0 0 1 440.65204 581.60028 Tm +(DQG) Tj +ET +BT +/F7 6.5 Tf +0 0 0 rg +1 0 0 1 454.00305 581.60028 Tm +(&KDU%XIIHU) Tj +ET +BT +/F7 6.5 Tf +0 0 0 rg +1 0 0 1 492.93155 581.60028 Tm +(ZLWK) Tj +ET +BT +/F7 6.5 Tf +0 0 0 rg +1 0 0 1 507.77106 581.60028 Tm +(D) Tj +ET +BT +/F7 6.5 Tf +0 0 0 rg +1 0 0 1 513.10754 581.60028 Tm +(VL]H) Tj +ET +BT +/F7 6.5 Tf +0 0 0 rg +1 0 0 1 87.84 565.99725 Tm +(RI) Tj +ET +BT +/F7 6.5 Tf +0 0 0 rg +1 0 0 1 95.69849 565.99725 Tm +() Tj +ET +BT +/F7 6.5 Tf +0 0 0 rg +1 0 0 1 108.5425 565.99725 Tm +(E\\WHV) Tj +ET +BT +/F7 6.5 Tf +0 0 0 rg +1 0 0 1 126.671 565.99725 Tm +(LQ) Tj +ET +BT +/F7 6.5 Tf +0 0 0 rg +1 0 0 1 134.05499 565.99725 Tm +(WKH) Tj +ET +BT +/F7 6.5 Tf +0 0 0 rg +1 0 0 1 145.77449 565.99725 Tm +(PRGXOH) Tj +ET +BT +/F7 6.5 Tf +0 0 0 rg +1 0 0 1 170.83199 565.99725 Tm +(5$0) Tj +ET +BT +/F7 6.5 Tf +0 0 0 rg +1 0 0 1 188.35599 565.99725 Tm +(7KH) Tj +ET +BT +/F7 6.5 Tf +0 0 0 rg +1 0 0 1 201.34299 565.99725 Tm +(XVHU) Tj +ET +BT +/F7 6.5 Tf +0 0 0 rg +1 0 0 1 216.51399 565.99725 Tm +(FDQ) Tj +ET +BT +/F7 6.5 Tf +0 0 0 rg +1 0 0 1 228.98749 565.99725 Tm +(UHDG) Tj +ET +BT +/F7 6.5 Tf +0 0 0 rg +1 0 0 1 244.67198 565.99725 Tm +(DQG) Tj +ET +BT +/F7 6.5 Tf +0 0 0 rg +1 0 0 1 258.02298 565.99725 Tm +(ZULWH) Tj +ET +BT +/F7 6.5 Tf +0 0 0 rg +1 0 0 1 275.19598 565.99725 Tm +(DQ\\) Tj +ET +BT +/F7 6.5 Tf +0 0 0 rg +1 0 0 1 287.86447 565.99725 Tm +(EXIIHU) Tj +ET +BT +/F7 6.5 Tf +0 0 0 rg +1 0 0 1 308.39148 565.99725 Tm +(WKURXJK) Tj +ET +BT +/F7 6.5 Tf +0 0 0 rg +1 0 0 1 335.09348 565.99725 Tm +(LQVWUXFWLRQV) Tj +ET +BT +/F7 6.5 Tf +0 0 0 rg +1 0 0 1 374.58746 565.99725 Tm +(7KH) Tj +ET +BT +/F7 6.5 Tf +0 0 0 rg +1 0 0 1 387.57446 565.99725 Tm +(FRQWHQWV) Tj +ET +BT +/F7 6.5 Tf +0 0 0 rg +1 0 0 1 415.82346 565.99725 Tm +(RI) Tj +ET +BT +/F7 6.5 Tf +0 0 0 rg +1 0 0 1 423.68195 565.99725 Tm +(WKH) Tj +ET +BT +/F7 6.5 Tf +0 0 0 rg +1 0 0 1 435.40146 565.99725 Tm +(LPDJH) Tj +ET +BT +/F7 6.5 Tf +0 0 0 rg +1 0 0 1 456.15594 565.99725 Tm +(EXIIHU) Tj +ET +BT +/F7 6.5 Tf +0 0 0 rg +1 0 0 1 476.68295 565.99725 Tm +(DQG) Tj +ET +BT +/F7 6.5 Tf +0 0 0 rg +1 0 0 1 490.03397 565.99725 Tm +(WKH) Tj +ET +BT +/F7 6.5 Tf +0 0 0 rg +1 0 0 1 501.75348 565.99725 Tm +(WZR) Tj +ET +BT +/F7 6.5 Tf +0 0 0 rg +1 0 0 1 87.84 550.39423 Tm +(SURILOH) Tj +ET +BT +/F7 6.5 Tf +0 0 0 rg +1 0 0 1 109.4005 550.39423 Tm +(EXIIHUV) Tj +ET +BT +/F7 6.5 Tf +0 0 0 rg +1 0 0 1 133.041 550.39423 Tm +(DUH) Tj +ET +BT +/F7 6.5 Tf +0 0 0 rg +1 0 0 1 144.728 550.39423 Tm +(QRW) Tj +ET +BT +/F7 6.5 Tf +0 0 0 rg +1 0 0 1 156.71399 550.39423 Tm +(VDYHG) Tj +ET +BT +/F7 6.5 Tf +0 0 0 rg +1 0 0 1 176.12949 550.39423 Tm +(ZKHQ) Tj +ET +BT +/F7 6.5 Tf +0 0 0 rg +1 0 0 1 194.62848 550.39423 Tm +(WKH) Tj +ET +BT +/F7 6.5 Tf +0 0 0 rg +1 0 0 1 206.34798 550.39423 Tm +(PRGXOH) Tj +ET +BT +/F7 6.5 Tf +0 0 0 rg +1 0 0 1 231.40547 550.39423 Tm +(LV) Tj +ET +BT +/F7 6.5 Tf +0 0 0 rg +1 0 0 1 237.88597 550.39423 Tm +(SRZHUHG) Tj +ET +BT +/F7 6.5 Tf +0 0 0 rg +1 0 0 1 266.62897 550.39423 Tm +(RII) Tj +ET +BT +/F8 10.5 Tf +0 0 0 rg +1 0 0 1 87.84 512.72028 Tm +() Tj +ET +BT +/F8 10.5 Tf +0 0 0 rg +1 0 0 1 114.573 512.72028 Tm +(LPDJH) Tj +ET +BT +/F8 10.5 Tf +0 0 0 rg +1 0 0 1 150.0105 512.72028 Tm +(EXIIHU) Tj +ET +BT +/F7 6 Tf +0 0 0 rg +1 0 0 1 108.84 477.5603 Tm +(,PDJH) Tj +ET +BT +/F7 6 Tf +0 0 0 rg +1 0 0 1 128.48399 477.5603 Tm +(EXIIHU) Tj +ET +BT +/F7 6 Tf +0 0 0 rg +1 0 0 1 147.43199 477.5603 Tm +(,PDJH%XIIHU) Tj +ET +BT +/F7 6 Tf +0 0 0 rg +1 0 0 1 184.67398 477.5603 Tm +(LV) Tj +ET +BT +/F7 6 Tf +0 0 0 rg +1 0 0 1 190.65598 477.5603 Tm +(XVHG) Tj +ET +BT +/F7 6 Tf +0 0 0 rg +1 0 0 1 205.87198 477.5603 Tm +(WR) Tj +ET +BT +/F7 6 Tf +0 0 0 rg +1 0 0 1 213.22798 477.5603 Tm +(VWRUH) Tj +ET +BT +/F7 6 Tf +0 0 0 rg +1 0 0 1 229.31998 477.5603 Tm +(LPDJH) Tj +ET +BT +/F7 6 Tf +0 0 0 rg +1 0 0 1 248.47798 477.5603 Tm +(GDWD) Tj +ET +BT +/F7 6 Tf +0 0 0 rg +1 0 0 1 262.62598 477.5603 Tm +(DQG) Tj +ET +BT +/F7 6 Tf +0 0 0 rg +1 0 0 1 274.94998 477.5603 Tm +(XVH) Tj +ET +BT +/F7 6 Tf +0 0 0 rg +1 0 0 1 286.47598 477.5603 Tm +(LQ) Tj +ET +BT +/F7 6 Tf +0 0 0 rg +1 0 0 1 293.29199 477.5603 Tm +(LPDJH) Tj +ET +BT +/F7 6 Tf +0 0 0 rg +1 0 0 1 312.44998 477.5603 Tm +(SURFHVVLQJ) Tj +ET +BT +/F7 6 Tf +0 0 0 rg +1 0 0 1 344.76599 477.5603 Tm +(LQVLGH) Tj +ET +BT +/F7 6 Tf +0 0 0 rg +1 0 0 1 363.078 477.5603 Tm +(WKH) Tj +ET +BT +/F7 6 Tf +0 0 0 rg +1 0 0 1 373.896 477.5603 Tm +(PRGXOH) Tj +ET +BT +/F7 6 Tf +0 0 0 rg +1 0 0 1 398.634 477.5603 Tm +(:KHQ) Tj +ET +BT +/F7 6 Tf +0 0 0 rg +1 0 0 1 416.57401 477.5603 Tm +(XSORDGLQJ) Tj +ET +BT +/F7 6 Tf +0 0 0 rg +1 0 0 1 447.384 477.5603 Tm +(GRZQORDGLQJ) Tj +ET +BT +/F7 6 Tf +0 0 0 rg +1 0 0 1 485.86801 477.5603 Tm +(LPDJHV) Tj +ET +BT +/F7 6 Tf +0 0 0 rg +1 0 0 1 509.508 477.5603 Tm +(WKH) Tj +ET +BT +/F7 6 Tf +0 0 0 rg +1 0 0 1 87.84 461.95731 Tm +(LPDJH) Tj +ET +BT +/F7 6 Tf +0 0 0 rg +1 0 0 1 106.998 461.95731 Tm +(IRUPDW) Tj +ET +BT +/F7 6 Tf +0 0 0 rg +1 0 0 1 127.872 461.95731 Tm +(LV) Tj +ET +BT +/F7 6 Tf +0 0 0 rg +1 0 0 1 132.29401 461.95731 Tm +() Tj +ET +BT +/F9 5.5 Tf +0 0 0 rg +1 0 0 1 142.59001 461.95731 Tm +<04A9> Tj +ET +BT +/F7 6 Tf +0 0 0 rg +1 0 0 1 148.09001 461.95731 Tm +() Tj +ET +BT +/F7 6 Tf +0 0 0 rg +1 0 0 1 159.94601 461.95731 Tm +(SL[HO) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 108.8401 446.36041 Tm +(:KHQ) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 125.2851 446.36041 Tm +(XSORDGLQJ) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 152.91161 446.36041 Tm +(RU) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 159.94061 446.36041 Tm +(GRZQORDGLQJ) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 195.21762 446.36041 Tm +(LPDJHV) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 215.41362 446.36041 Tm +(WKURXJK) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 238.00761 446.36041 Tm +(WKH) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 247.92412 446.36041 Tm +(8$57) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 263.3681 446.36041 Tm +(SRUW) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 277.23911 446.36041 Tm +(LQ) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 283.48709 446.36041 Tm +(RUGHU) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 299.27209 446.36041 Tm +(WR) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 306.01511 446.36041 Tm +(VSHHG) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 323.04861 446.36041 Tm +(XS) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 331.2601 446.36041 Tm +(WKH) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 341.17661 446.36041 Tm +(VSHHG) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 359.68411 446.36041 Tm +(RQO\\) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 372.06461 446.36041 Tm +(WKH) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 381.98111 446.36041 Tm +(XSSHU) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 398.94861 446.36041 Tm +(IRXU) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 411.26862 446.36041 Tm +(ELWV) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 422.12012 446.36041 Tm +(RI) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 428.76962 446.36041 Tm +(WKH) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 438.68613 446.36041 Tm +(SL[HO) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 452.34811 446.36041 Tm +(E\\WH) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 465.0531 446.36041 Tm +(DUH) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 474.94211 446.36041 Tm +(XVHG) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 490.36411 446.36041 Tm +(WKDW) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 502.2496 446.36041 Tm +(LV) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 509.20709 446.36041 Tm +() Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 517.27008 446.36041 Tm +(OHYHO) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 87.84015 430.75742 Tm +(JUD\\VFDOH) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 113.69565 430.75742 Tm +(LV) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 119.17915 430.75742 Tm +(XVHG) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 134.60115 430.75742 Tm +(DQG) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 145.89815 430.75742 Tm +(HDFK) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 159.55464 430.75742 Tm +(E\\WH) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 172.25964 430.75742 Tm +(UHSUHVHQWV) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 201.57465 430.75742 Tm +(WZR) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 212.64064 430.75742 Tm +(SL[HOV) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 228.93713 430.75742 Tm +( WKH) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 240.50363 430.75742 Tm +(KLJK) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 253.53313 430.75742 Tm +(IRXU) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 265.85312 430.75742 Tm +(ELWV) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 276.70462 430.75742 Tm +(DUH) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 286.59363 430.75742 Tm +(RQH) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 297.85211 430.75742 Tm +(SL[HO) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 312.9881 430.75742 Tm +(DQG) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 324.2851 430.75742 Tm +(WKH) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 334.2016 430.75742 Tm +(ORZ) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 344.70111 430.75742 Tm +(IRXU) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 357.02112 430.75742 Tm +(ELWV) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 367.87262 430.75742 Tm +(DUH) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 377.76163 430.75742 Tm +(WKH) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 387.67813 430.75742 Tm +(VDPH) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 404.54663 430.75742 Tm +($) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 409.49112 430.75742 Tm +(SL[HO) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 423.15311 430.75742 Tm +(LQ) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 429.40109 430.75742 Tm +(WKH) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 439.3176 430.75742 Tm +(QH[W) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 452.14359 430.75742 Tm +(DGMDFHQW) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 475.67258 430.75742 Tm +(FROXPQ) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 496.42957 430.75742 Tm +(RI) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 503.07907 430.75742 Tm +(WKH) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 512.99554 430.75742 Tm +(URZ) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 87.84015 415.15442 Tm +(WKDW) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 99.72565 415.15442 Tm +(LV) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 106.68314 415.15442 Tm +(WZR) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 117.74915 415.15442 Tm +(SL[HOV) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 134.04565 415.15442 Tm +(DUH) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 143.93466 415.15442 Tm +(FRPELQHG) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 171.15967 415.15442 Tm +(LQWR) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 182.72067 415.15442 Tm +(RQH) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 193.97917 415.15442 Tm +(E\\WH) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 206.68417 415.15442 Tm +(DQG) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 217.98117 415.15442 Tm +(WUDQVPLWWHG ) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 252.92816 415.15442 Tm +(6LQFH) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 267.93765 415.15442 Tm +(WKH) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 277.85416 415.15442 Tm +(LPDJH) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 295.41565 415.15442 Tm +(LV) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 299.46915 415.15442 Tm +() Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 307.19116 415.15442 Tm +(JUD\\VFDOH) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 333.04666 415.15442 Tm +(OHYHOV) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 350.42117 415.15442 Tm +(XSORDGHG) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 376.33167 415.15442 Tm +(WR) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 383.07468 415.15442 Tm +(3&) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 391.30817 415.15442 Tm +(:KHQ) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 407.75317 415.15442 Tm +(GLVSOD\\LQJ) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 435.51166 415.15442 Tm +( FRUUHVSRQGLQJ) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 476.53067 415.15442 Tm +(WR) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 483.27368 415.15442 Tm +(%03) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 496.59467 415.15442 Tm +(IRUPDW ) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 518.85315 415.15442 Tm +(WKH) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 87.84015 399.55142 Tm +(JUD\\VFDOH) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 113.69565 399.55142 Tm +(VKRXOG) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 132.68715 399.55142 Tm +(EH) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 140.60165 399.55142 Tm +(H[SDQGHG) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 167.77716 399.55142 Tm +( H[SDQGHG) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 196.60266 399.55142 Tm +(WR) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 203.34566 399.55142 Tm +() Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 214.21365 399.55142 Tm +(JUD\\VFDOH) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 241.54315 399.55142 Tm +(LH) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 250.44215 399.55142 Tm +(ELW) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 261.80515 399.55142 Tm +(ELWPDS) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 281.63263 399.55142 Tm +(IRUPDW ) Tj +ET +BT +/F7 6.5 Tf +0 0 0 rg +1 0 0 1 108.8391 383.961 Tm +(7UDQVPLVVLRQ) Tj +ET +BT +/F7 6.5 Tf +0 0 0 rg +1 0 0 1 151.2126 383.961 Tm +(WKURXJK) Tj +ET +BT +/F7 6.5 Tf +0 0 0 rg +1 0 0 1 177.9146 383.961 Tm +(WKH) Tj +ET +BT +/F7 6.5 Tf +0 0 0 rg +1 0 0 1 189.63409 383.961 Tm +(86%) Tj +ET +BT +/F7 6.5 Tf +0 0 0 rg +1 0 0 1 203.86909 383.961 Tm +(SRUW) Tj +ET +BT +/F7 6.5 Tf +0 0 0 rg +1 0 0 1 218.5201 383.961 Tm +(LV) Tj +ET +BT +/F7 6.5 Tf +0 0 0 rg +1 0 0 1 225.0006 383.961 Tm +(D) Tj +ET +BT +/F7 6.5 Tf +0 0 0 rg +1 0 0 1 230.3371 383.961 Tm +(IXOO) Tj +ET +BT +/F7 6.5 Tf +0 0 0 rg +1 0 0 1 241.63409 383.961 Tm +() Tj +ET +BT +/F7 6.5 Tf +0 0 0 rg +1 0 0 1 247.4451 383.961 Tm +(ELW) Tj +ET +BT +/F7 6.5 Tf +0 0 0 rg +1 0 0 1 257.1561 383.961 Tm +(SL[HO) Tj +ET +BT +/F7 6.5 Tf +0 0 0 rg +1 0 0 1 275.0441 383.961 Tm +(WKDW) Tj +ET +BT +/F7 6.5 Tf +0 0 0 rg +1 0 0 1 289.09061 383.961 Tm +(LV) Tj +ET +BT +/F7 6.5 Tf +0 0 0 rg +1 0 0 1 297.31311 383.961 Tm +() Tj +ET +BT +/F7 6.5 Tf +0 0 0 rg +1 0 0 1 310.1571 383.961 Tm +(JUD\\) Tj +ET +BT +/F7 6.5 Tf +0 0 0 rg +1 0 0 1 325.4906 383.961 Tm +(OHYHOV) Tj +ET +BT +/F8 10 Tf +0 0 0 rg +1 0 0 1 87.84 346.2803 Tm +() Tj +ET +BT +/F8 10 Tf +0 0 0 rg +1 0 0 1 113.3 346.2803 Tm +(VLJQDWXUH) Tj +ET +BT +/F8 10 Tf +0 0 0 rg +1 0 0 1 164.22 346.2803 Tm +(ILOH) Tj +ET +BT +/F8 10 Tf +0 0 0 rg +1 0 0 1 182.7 346.2803 Tm +(EXIIHU) Tj +ET +BT +/F7 8 Tf +0 0 0 rg +1 0 0 1 108.84 311.18042 Tm +(7KH) Tj +ET +BT +/F7 8 Tf +0 0 0 rg +1 0 0 1 124.824 311.18042 Tm +(IHDWXUH) Tj +ET +BT +/F7 8 Tf +0 0 0 rg +1 0 0 1 154.304 311.18042 Tm +(ILOH) Tj +ET +BT +/F7 8 Tf +0 0 0 rg +1 0 0 1 167.776 311.18042 Tm +(EXIIHU) Tj +ET +BT +/F7 8 Tf +0 0 0 rg +1 0 0 1 193.04001 311.18042 Tm +(&KDU%XIIHU) Tj +ET +BT +/F7 8 Tf +0 0 0 rg +1 0 0 1 240.95201 311.18042 Tm +(RU) Tj +ET +BT +/F7 8 Tf +0 0 0 rg +1 0 0 1 251.17601 311.18042 Tm +(&KDU%XIIHU) Tj +ET +BT +/F7 8 Tf +0 0 0 rg +1 0 0 1 299.08801 311.18042 Tm +(FDQ) Tj +ET +BT +/F7 8 Tf +0 0 0 rg +1 0 0 1 314.44 311.18042 Tm +(EH) Tj +ET +BT +/F7 8 Tf +0 0 0 rg +1 0 0 1 325.952 311.18042 Tm +(XVHG) Tj +ET +BT +/F7 8 Tf +0 0 0 rg +1 0 0 1 346.23999 311.18042 Tm +(WR) Tj +ET +BT +/F7 8 Tf +0 0 0 rg +1 0 0 1 356.048 311.18042 Tm +(VWRUH) Tj +ET +BT +/F7 8 Tf +0 0 0 rg +1 0 0 1 377.504 311.18042 Tm +(ERWK) Tj +ET +BT +/F7 8 Tf +0 0 0 rg +1 0 0 1 397.17599 311.18042 Tm +(FRPPRQ) Tj +ET +BT +/F7 8 Tf +0 0 0 rg +1 0 0 1 432.67999 311.18042 Tm +(IHDWXUH) Tj +ET +BT +/F7 8 Tf +0 0 0 rg +1 0 0 1 462.16 311.18042 Tm +(ILOHV) Tj +ET +BT +/F7 8 Tf +0 0 0 rg +1 0 0 1 479.46399 311.18042 Tm +(DQG) Tj +ET +BT +/F7 8 Tf +0 0 0 rg +1 0 0 1 87.84 295.57739 Tm +(WHPSODWH) Tj +ET +BT +/F7 8 Tf +0 0 0 rg +1 0 0 1 123.672 295.57739 Tm +(IHDWXUH) Tj +ET +BT +/F7 8 Tf +0 0 0 rg +1 0 0 1 153.15199 295.57739 Tm +(ILOHV) Tj +ET +BT +/F8 6.5 Tf +0 0 0 rg +1 0 0 1 87.84 257.18042 Tm +() Tj +ET +BT +/F8 6.5 Tf +0 0 0 rg +1 0 0 1 98.8185 257.18042 Tm +(\)LQJHUSULQW) Tj +ET +BT +/F8 6.5 Tf +0 0 0 rg +1 0 0 1 137.3765 257.18042 Tm +(OLEUDU\\) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 108.84 222.80029 Tm +(7KH) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 118.82999 222.80029 Tm +(PRGXOH) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 138.105 222.80029 Tm +(KDV) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 147.69499 222.80029 Tm +(RSHQHG) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 166.89999 222.80029 Tm +(XS) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 174.36499 222.80029 Tm +(D) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 178.46999 222.80029 Tm +(VWRUDJH) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 197.75998 222.80029 Tm +(DUHD) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 209.55498 222.80029 Tm +(LQ) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 215.23499 222.80029 Tm +(\)/$6+) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 231.39499 222.80029 Tm +(DV) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 237.89499 222.80029 Tm +(WKH) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 246.90999 222.80029 Tm +(ILQJHUSULQW) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 273.595 222.80029 Tm +(WHPSODWH) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 295.98999 222.80029 Tm +(VWRUDJH) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 315.28 222.80029 Tm +(DUHD) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 328.41501 222.80029 Tm +(ZKLFK) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 343.51501 222.80029 Tm +(LV) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 348.5 222.80029 Tm +(FRPPRQO\\) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 374.53 222.80029 Tm +(NQRZQ) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 391.63501 222.80029 Tm +(DV) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 398.13501 222.80029 Tm +(WKH) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 407.15002 222.80029 Tm +(ILQJHUSULQW) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 433.83502 222.80029 Tm +(OLEUDU\\) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 451.61502 222.80029 Tm +(7KH) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 461.60501 222.80029 Tm +(GDWD) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 473.39502 222.80029 Tm +(LQ) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 479.07501 222.80029 Tm +(WKH) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 488.09003 222.80029 Tm +(ILQJHUSULQW) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 87.84 207.19727 Tm +(OLEUDU\\) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 104.28 207.19727 Tm +(LV) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 109.265 207.19727 Tm +(SRZHU) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 125.79 207.19727 Tm +(RII) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 133.55501 207.19727 Tm +(SURWHFWLRQ) Tj +ET +BT +/F7 4 Tf +0 0 0 rg +1 0 0 1 108.84 191.60059 Tm +(7KH) Tj +ET +BT +/F7 4 Tf +0 0 0 rg +1 0 0 1 116.83199 191.60059 Tm +(ILQJHUSULQW) Tj +ET +BT +/F7 4 Tf +0 0 0 rg +1 0 0 1 138.17999 191.60059 Tm +(WHPSODWHV) Tj +ET +BT +/F7 4 Tf +0 0 0 rg +1 0 0 1 158.01199 191.60059 Tm +(DUH) Tj +ET +BT +/F7 4 Tf +0 0 0 rg +1 0 0 1 165.20399 191.60059 Tm +(VWRUHG) Tj +ET +BT +/F7 4 Tf +0 0 0 rg +1 0 0 1 178.392 191.60059 Tm +(DFFRUGLQJ) Tj +ET +BT +/F7 4 Tf +0 0 0 rg +1 0 0 1 198.01199 191.60059 Tm +(WR) Tj +ET +BT +/F7 4 Tf +0 0 0 rg +1 0 0 1 202.916 191.60059 Tm +(WKH) Tj +ET +BT +/F7 4 Tf +0 0 0 rg +1 0 0 1 210.12801 191.60059 Tm +(VHULDO) Tj +ET +BT +/F7 4 Tf +0 0 0 rg +1 0 0 1 221.3 191.60059 Tm +(QXPEHUV) Tj +ET +BT +/F7 4 Tf +0 0 0 rg +1 0 0 1 240.38 191.60059 Tm +(,I) Tj +ET +BT +/F7 4 Tf +0 0 0 rg +1 0 0 1 244.15201 191.60059 Tm +(WKH) Tj +ET +BT +/F7 4 Tf +0 0 0 rg +1 0 0 1 251.36401 191.60059 Tm +(FDSDFLW\\) Tj +ET +BT +/F7 4 Tf +0 0 0 rg +1 0 0 1 267.70801 191.60059 Tm +(RI) Tj +ET +BT +/F7 4 Tf +0 0 0 rg +1 0 0 1 272.54401 191.60059 Tm +(WKH) Tj +ET +BT +/F7 4 Tf +0 0 0 rg +1 0 0 1 279.75601 191.60059 Tm +(ILQJHUSULQW) Tj +ET +BT +/F7 4 Tf +0 0 0 rg +1 0 0 1 301.104 191.60059 Tm +(GDWDEDVH) Tj +ET +BT +/F7 4 Tf +0 0 0 rg +1 0 0 1 319.41202 191.60059 Tm +(LV) Tj +ET +BT +/F7 4 Tf +0 0 0 rg +1 0 0 1 323.40002 191.60059 Tm +(1) Tj +ET +BT +/F7 4 Tf +0 0 0 rg +1 0 0 1 328.55203 191.60059 Tm +(WKH) Tj +ET +BT +/F7 4 Tf +0 0 0 rg +1 0 0 1 335.76404 191.60059 Tm +(VHULDO) Tj +ET +BT +/F7 4 Tf +0 0 0 rg +1 0 0 1 346.93604 191.60059 Tm +(QXPEHUV) Tj +ET +BT +/F7 4 Tf +0 0 0 rg +1 0 0 1 364.94403 191.60059 Tm +(RI) Tj +ET +BT +/F7 4 Tf +0 0 0 rg +1 0 0 1 369.78003 191.60059 Tm +(WKH) Tj +ET +BT +/F7 4 Tf +0 0 0 rg +1 0 0 1 376.99203 191.60059 Tm +(ILQJHUSULQW) Tj +ET +BT +/F7 4 Tf +0 0 0 rg +1 0 0 1 398.34003 191.60059 Tm +(WHPSODWHV) Tj +ET +BT +/F7 4 Tf +0 0 0 rg +1 0 0 1 418.17203 191.60059 Tm +(LQ) Tj +ET +BT +/F7 4 Tf +0 0 0 rg +1 0 0 1 422.71603 191.60059 Tm +(WKH) Tj +ET +BT +/F7 4 Tf +0 0 0 rg +1 0 0 1 429.92804 191.60059 Tm +(ILQJHUSULQW) Tj +ET +BT +/F7 4 Tf +0 0 0 rg +1 0 0 1 451.27603 191.60059 Tm +(GDWDEDVH) Tj +ET +BT +/F7 4 Tf +0 0 0 rg +1 0 0 1 469.58405 191.60059 Tm +(DUH) Tj +ET +BT +/F7 4 Tf +0 0 0 rg +1 0 0 1 476.77603 191.60059 Tm +(GHILQHG) Tj +ET +BT +/F7 4 Tf +0 0 0 rg +1 0 0 1 492.12802 191.60059 Tm +(DV) Tj +ET +BT +/F7 4 Tf +0 0 0 rg +1 0 0 1 498.40002 191.60059 Tm +() Tj +ET +BT +/F7 4 Tf +0 0 0 rg +1 0 0 1 502.80002 191.60059 Tm +() Tj +ET +BT +/F7 4 Tf +0 0 0 rg +1 0 0 1 507.20001 191.60059 Tm +(1) Tj +ET +BT +/F7 4 Tf +0 0 0 rg +1 0 0 1 87.84 175.99762 Tm +(1) Tj +ET +BT +/F7 4 Tf +0 0 0 rg +1 0 0 1 96.56799 175.99762 Tm +(8VHUV) Tj +ET +BT +/F7 4 Tf +0 0 0 rg +1 0 0 1 108.272 175.99762 Tm +(FDQ) Tj +ET +BT +/F7 4 Tf +0 0 0 rg +1 0 0 1 115.948 175.99762 Tm +(RQO\\) Tj +ET +BT +/F7 4 Tf +0 0 0 rg +1 0 0 1 124.952 175.99762 Tm +(DFFHVV) Tj +ET +BT +/F7 4 Tf +0 0 0 rg +1 0 0 1 138.164 175.99762 Tm +(WKH) Tj +ET +BT +/F7 4 Tf +0 0 0 rg +1 0 0 1 145.37601 175.99762 Tm +(FRQWHQWV) Tj +ET +BT +/F7 4 Tf +0 0 0 rg +1 0 0 1 162.76001 175.99762 Tm +(RI) Tj +ET +BT +/F7 4 Tf +0 0 0 rg +1 0 0 1 167.59601 175.99762 Tm +(WKH) Tj +ET +BT +/F7 4 Tf +0 0 0 rg +1 0 0 1 174.80801 175.99762 Tm +(ILQJHUSULQW) Tj +ET +BT +/F7 4 Tf +0 0 0 rg +1 0 0 1 196.15601 175.99762 Tm +(GDWDEDVH) Tj +ET +BT +/F7 4 Tf +0 0 0 rg +1 0 0 1 214.464 175.99762 Tm +(DFFRUGLQJ) Tj +ET +BT +/F7 4 Tf +0 0 0 rg +1 0 0 1 234.084 175.99762 Tm +(WR) Tj +ET +BT +/F7 4 Tf +0 0 0 rg +1 0 0 1 238.98801 175.99762 Tm +(WKH) Tj +ET +BT +/F7 4 Tf +0 0 0 rg +1 0 0 1 246.20001 175.99762 Tm +(VHULDO) Tj +ET +BT +/F7 4 Tf +0 0 0 rg +1 0 0 1 257.37201 175.99762 Tm +(QXPEHU) Tj +ET +BT +/F8 6.5 Tf +0 0 0 rg +1 0 0 1 87.84 137.60028 Tm +() Tj +ET +BT +/F8 6.5 Tf +0 0 0 rg +1 0 0 1 98.8185 137.60028 Tm +(6\\VWHP) Tj +ET +BT +/F8 6.5 Tf +0 0 0 rg +1 0 0 1 124.0645 137.60028 Tm +(FRQILJXUDWLRQ) Tj +ET +BT +/F8 6.5 Tf +0 0 0 rg +1 0 0 1 170.24699 137.60028 Tm +(SDUDPHWHUV) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 108.84 103.16028 Tm +(\)RU) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 117.825 103.16028 Tm +(WKH) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 126.84 103.16028 Tm +(FRQYHQLHQFH) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 157.52499 103.16028 Tm +(RI) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 163.56999 103.16028 Tm +(XVHUV) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 178.97499 103.16028 Tm +(WKH) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 187.98999 103.16028 Tm +(PRGXOH) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 207.26498 103.16028 Tm +(RSHQV) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 222.96999 103.16028 Tm +(VRPH) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 237.18498 103.16028 Tm +(V\\VWHP) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 255.12498 103.16028 Tm +(SDUDPHWHUV) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 285.09497 103.16028 Tm +(DOORZLQJ) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 306.18997 103.16028 Tm +(XVHUV) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 320.25497 103.16028 Tm +(WR) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 326.38498 103.16028 Tm +(LQGLYLGXDOO\\) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 354.35999 103.16028 Tm +(PRGLI\\) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 371.995 103.16028 Tm +(WKH) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 381.01001 103.16028 Tm +(VSHFLILHG) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 403.19501 103.16028 Tm +( E\\) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 411.62 103.16028 Tm +(SDUDPHWHU) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 437.85498 103.16028 Tm +(VHULDO) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 451.81998 103.16028 Tm +(QXPEHU ) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 473.43497 103.16028 Tm +(SDUDPHWHU) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 499.66998 103.16028 Tm +(YDOXHV) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 87.84 87.55731 Tm +(WKURXJK) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 108.38 87.55731 Tm +(FRPPDQGV) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 137.16 87.55731 Tm +(6HH) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 146.845 87.55731 Tm +(WKH) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 155.86 87.55731 Tm +(FRPPDQG) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 180.905 87.55731 Tm +(WR) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 187.035 87.55731 Tm +(VHW) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 195.35501 87.55731 Tm +(WKH) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 204.37001 87.55731 Tm +(EDVLF) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 217.63501 87.55731 Tm +(SDUDPHWHUV) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 246.26501 87.55731 Tm +(RI) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 252.31001 87.55731 Tm +(WKH) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 261.32501 87.55731 Tm +(PRGXOH) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 280.60001 87.55731 Tm +(V\\VWHP) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 297.23999 87.55731 Tm +(6HW6\\V3DUD) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 324.29999 87.55731 Tm +(DQG) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 334.56998 87.55731 Tm +(UHDG) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 346.63498 87.55731 Tm +(V\\VWHP) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 364.57498 87.55731 Tm +(SDUDPHWHU) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 390.81 87.55731 Tm +(FRPPDQG) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 415.85498 87.55731 Tm +(5HDG6\\V3DUD) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 446.05499 87.55731 Tm +() Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 270.17999 45.86041 Tm +(WKH) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 280.0965 45.86041 Tm +(ILUVW) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 291.729 45.86041 Tm +() Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 296.30499 45.86041 Tm +(SDJHV) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 313.32199 45.86041 Tm +(RI) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 319.9715 45.86041 Tm +() Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 327.69348 45.86041 Tm +(3DJH) Tj +ET + +endstream +endobj +893 0 obj +<< +/Length 2 +>> +stream +q + +endstream +endobj +894 0 obj +<< +/Length 1373 +/Filter /FlateDecode +>> +stream +xXmO8_?33~Je7*J%Hݯ:I{'d3yy-݋x}rvU\Rۿ\hOOIs %R/o.۷lӴoD{ϦscH*y ?Q +!XO7{g hPNM݂@i@m_ U(u4a{!Dd{Bf>_vC_z] ~"Ļ<ƃH:~F/>rѳ݅MG/ xF%usӴEts<ޥJ$"CHo1(i#FZP;x)ٴS]h^ TG G !G G("r cd샖 v/.?~ߚKB)b"7g>5x+@V;3ؚ[-=#T5:rS4&~).0oZOukAȵ++bn$Fd✫ipGq܀s!芪IN3C8 K +'Ic-L-S/!fG ,z@'e8EfW!C'*M5#T#nhT9R*4;BN#AG+P%cLeZ>{4LX?<{̟Y;{:#gU~,Aۯ0UD ÒJg|DQaD(420- [U4WV,y{ )l%g:cNcFzx9sT2#.G32j^NzFC.[:^@]?.r&rE~rVȫpF<,$ Je%}cQ q)e%%uY %w;: igHLgHW̐3$"pq;zLF`'$~Yߴ/-TlH?r b`2yptT}?5^vƢGvVqi O(v\U]*ro`,xL.c64|&g$> +stream +Q +1 0 0 1 0 0 cm +BT +/F8 7.5 Tf +0 0 0 rg +1 0 0 1 377.35162 781.10431 Tm +(+DQJ]KRX) Tj +ET +BT +/F8 7.5 Tf +0 0 0 rg +1 0 0 1 415.64661 781.10431 Tm +(=KLDQ) Tj +ET +BT +/F8 7.5 Tf +0 0 0 rg +1 0 0 1 437.2991 781.10431 Tm +(7HFKQRORJ\\) Tj +ET +BT +/F8 7.5 Tf +0 0 0 rg +1 0 0 1 479.96661 781.10431 Tm +(&R) Tj +ET +BT +/F8 7.5 Tf +0 0 0 rg +1 0 0 1 495.21411 781.10431 Tm +(/WG) Tj +ET +BT +/F8 4.5 Tf +0 0 0 rg +1 0 0 1 108.84 758.0603 Tm +(:KHQ) Tj +ET +BT +/F8 4.5 Tf +0 0 0 rg +1 0 0 1 122.295 758.0603 Tm +(WKH) Tj +ET +BT +/F8 4.5 Tf +0 0 0 rg +1 0 0 1 130.40849 758.0603 Tm +(KRVW) Tj +ET +BT +/F8 4.5 Tf +0 0 0 rg +1 0 0 1 140.862 758.0603 Tm +(FRPSXWHU) Tj +ET +BT +/F8 4.5 Tf +0 0 0 rg +1 0 0 1 162.6915 758.0603 Tm +(VHQGV) Tj +ET +BT +/F8 4.5 Tf +0 0 0 rg +1 0 0 1 176.259 758.0603 Tm +(DQ) Tj +ET +BT +/F8 4.5 Tf +0 0 0 rg +1 0 0 1 182.7345 758.0603 Tm +(LQVWUXFWLRQ) Tj +ET +BT +/F8 4.5 Tf +0 0 0 rg +1 0 0 1 206.715 758.0603 Tm +(WR) Tj +ET +BT +/F8 4.5 Tf +0 0 0 rg +1 0 0 1 212.23199 758.0603 Tm +(PRGLI\\) Tj +ET +BT +/F8 4.5 Tf +0 0 0 rg +1 0 0 1 228.1035 758.0603 Tm +(V\\VWHP) Tj +ET +BT +/F8 4.5 Tf +0 0 0 rg +1 0 0 1 244.2495 758.0603 Tm +(SDUDPHWHUV) Tj +ET +BT +/F8 4.5 Tf +0 0 0 rg +1 0 0 1 271.2225 758.0603 Tm +(WKH) Tj +ET +BT +/F8 4.5 Tf +0 0 0 rg +1 0 0 1 279.336 758.0603 Tm +(PRGXOH) Tj +ET +BT +/F8 4.5 Tf +0 0 0 rg +1 0 0 1 296.6835 758.0603 Tm +(ILUVW) Tj +ET +BT +/F8 4.5 Tf +0 0 0 rg +1 0 0 1 306.20099 758.0603 Tm +(UHVSRQGV) Tj +ET +BT +/F8 4.5 Tf +0 0 0 rg +1 0 0 1 327.11697 758.0603 Tm +(DFFRUGLQJ) Tj +ET +BT +/F8 4.5 Tf +0 0 0 rg +1 0 0 1 349.18948 758.0603 Tm +(WR) Tj +ET +BT +/F8 4.5 Tf +0 0 0 rg +1 0 0 1 354.70648 758.0603 Tm +(WKH) Tj +ET +BT +/F8 4.5 Tf +0 0 0 rg +1 0 0 1 362.81998 758.0603 Tm +(RULJLQDO) Tj +ET +BT +/F8 4.5 Tf +0 0 0 rg +1 0 0 1 380.12698 758.0603 Tm +(FRQILJXUDWLRQ) Tj +ET +BT +/F8 4.5 Tf +0 0 0 rg +1 0 0 1 411.09598 758.0603 Tm +(DQG) Tj +ET +BT +/F8 4.5 Tf +0 0 0 rg +1 0 0 1 420.33899 758.0603 Tm +(WKHQ) Tj +ET +BT +/F8 4.5 Tf +0 0 0 rg +1 0 0 1 431.23349 758.0603 Tm +(PRGLILHV) Tj +ET +BT +/F8 4.5 Tf +0 0 0 rg +1 0 0 1 450.66449 758.0603 Tm +(WKH) Tj +ET +BT +/F8 4.5 Tf +0 0 0 rg +1 0 0 1 458.77798 758.0603 Tm +(V\\VWHP) Tj +ET +BT +/F8 4.5 Tf +0 0 0 rg +1 0 0 1 474.92398 758.0603 Tm +(VHWWLQJV) Tj +ET +BT +/F8 4.5 Tf +0 0 0 rg +1 0 0 1 492.90149 758.0603 Tm +(DIWHU) Tj +ET +BT +/F8 4.5 Tf +0 0 0 rg +1 0 0 1 504.16498 758.0603 Tm +(WKH) Tj +ET +BT +/F8 4.5 Tf +0 0 0 rg +1 0 0 1 87.84 742.45728 Tm +(UHVSRQVH) Tj +ET +BT +/F8 4.5 Tf +0 0 0 rg +1 0 0 1 109.7325 742.45728 Tm +(DQG) Tj +ET +BT +/F8 4.5 Tf +0 0 0 rg +1 0 0 1 118.97549 742.45728 Tm +(UHFRUGV) Tj +ET +BT +/F8 4.5 Tf +0 0 0 rg +1 0 0 1 136.20599 742.45728 Tm +(WKH) Tj +ET +BT +/F8 4.5 Tf +0 0 0 rg +1 0 0 1 144.31949 742.45728 Tm +(FRQILJXUDWLRQ) Tj +ET +BT +/F8 4.5 Tf +0 0 0 rg +1 0 0 1 174.08249 742.45728 Tm +(LQ) Tj +ET +BT +/F8 4.5 Tf +0 0 0 rg +1 0 0 1 179.19449 742.45728 Tm +(\)/$6+) Tj +ET +BT +/F8 4.5 Tf +0 0 0 rg +1 0 0 1 194.94449 742.45728 Tm +($IWHU) Tj +ET +BT +/F8 4.5 Tf +0 0 0 rg +1 0 0 1 206.55899 742.45728 Tm +(WKH) Tj +ET +BT +/F8 4.5 Tf +0 0 0 rg +1 0 0 1 214.67249 742.45728 Tm +(V\\VWHP) Tj +ET +BT +/F8 4.5 Tf +0 0 0 rg +1 0 0 1 230.81848 742.45728 Tm +(LV) Tj +ET +BT +/F8 4.5 Tf +0 0 0 rg +1 0 0 1 235.30498 742.45728 Tm +(SRZHUHG) Tj +ET +BT +/F8 4.5 Tf +0 0 0 rg +1 0 0 1 255.20398 742.45728 Tm +(RQ) Tj +ET +BT +/F8 4.5 Tf +0 0 0 rg +1 0 0 1 261.87747 742.45728 Tm +(QH[W) Tj +ET +BT +/F8 4.5 Tf +0 0 0 rg +1 0 0 1 272.37146 742.45728 Tm +(WLPH) Tj +ET +BT +/F8 4.5 Tf +0 0 0 rg +1 0 0 1 284.27847 742.45728 Tm +(LW) Tj +ET +BT +/F8 4.5 Tf +0 0 0 rg +1 0 0 1 288.23398 742.45728 Tm +(ZLOO) Tj +ET +BT +/F8 4.5 Tf +0 0 0 rg +1 0 0 1 296.42398 742.45728 Tm +(ZRUN) Tj +ET +BT +/F8 4.5 Tf +0 0 0 rg +1 0 0 1 308.11499 742.45728 Tm +(DFFRUGLQJ) Tj +ET +BT +/F8 4.5 Tf +0 0 0 rg +1 0 0 1 330.1875 742.45728 Tm +(WR) Tj +ET +BT +/F8 4.5 Tf +0 0 0 rg +1 0 0 1 335.7045 742.45728 Tm +(WKH) Tj +ET +BT +/F8 4.5 Tf +0 0 0 rg +1 0 0 1 343.81799 742.45728 Tm +(QHZ) Tj +ET +BT +/F8 4.5 Tf +0 0 0 rg +1 0 0 1 353.84399 742.45728 Tm +(FRQILJXUDWLRQ) Tj +ET +BT +/F9 8.5 Tf +0 0 0 rg +1 0 0 1 87.84 704.78027 Tm +() Tj +ET +BT +/F9 8.5 Tf +0 0 0 rg +1 0 0 1 109.481 704.78027 Tm +(%DXG) Tj +ET +BT +/F9 8.5 Tf +0 0 0 rg +1 0 0 1 133.502 704.78027 Tm +(UDWH) Tj +ET +BT +/F9 8.5 Tf +0 0 0 rg +1 0 0 1 153.4175 704.78027 Tm +(FRQWURO) Tj +ET +BT +/F9 8.5 Tf +0 0 0 rg +1 0 0 1 186.24449 704.78027 Tm +( SDUDPHWHU) Tj +ET +BT +/F9 8.5 Tf +0 0 0 rg +1 0 0 1 236.78549 704.78027 Tm +(QXPEHU) Tj +ET +BT +/F9 8.5 Tf +0 0 0 rg +1 0 0 1 272.987 704.78027 Tm +() Tj +ET +BT +/F9 8.5 Tf +0 0 0 rg +1 0 0 1 277.849 704.78027 Tm +( ) Tj +ET +BT +/F8 4.5 Tf +0 0 0 rg +1 0 0 1 108.84 669.6803 Tm +(7KLV) Tj +ET +BT +/F8 4.5 Tf +0 0 0 rg +1 0 0 1 118.6095 669.6803 Tm +(SDUDPHWHU) Tj +ET +BT +/F8 4.5 Tf +0 0 0 rg +1 0 0 1 142.22099 669.6803 Tm +(FRQWUROV) Tj +ET +BT +/F8 4.5 Tf +0 0 0 rg +1 0 0 1 160.57649 669.6803 Tm +(WKH) Tj +ET +BT +/F8 4.5 Tf +0 0 0 rg +1 0 0 1 168.68999 669.6803 Tm +(FRPPXQLFDWLRQ) Tj +ET +BT +/F8 4.5 Tf +0 0 0 rg +1 0 0 1 202.85399 669.6803 Tm +(EDXG) Tj +ET +BT +/F8 4.5 Tf +0 0 0 rg +1 0 0 1 214.86449 669.6803 Tm +(UDWH) Tj +ET +BT +/F8 4.5 Tf +0 0 0 rg +1 0 0 1 224.57999 669.6803 Tm +(ZKHQ) Tj +ET +BT +/F8 4.5 Tf +0 0 0 rg +1 0 0 1 237.38699 669.6803 Tm +(WKH) Tj +ET +BT +/F8 4.5 Tf +0 0 0 rg +1 0 0 1 245.50049 669.6803 Tm +(PRGXOH) Tj +ET +BT +/F8 4.5 Tf +0 0 0 rg +1 0 0 1 262.84799 669.6803 Tm +(FRPPXQLFDWHV) Tj +ET +BT +/F8 4.5 Tf +0 0 0 rg +1 0 0 1 295.04099 669.6803 Tm +(ZLWK) Tj +ET +BT +/F8 4.5 Tf +0 0 0 rg +1 0 0 1 305.31448 669.6803 Tm +(WKH) Tj +ET +BT +/F8 4.5 Tf +0 0 0 rg +1 0 0 1 313.42798 669.6803 Tm +(KRVW) Tj +ET +BT +/F8 4.5 Tf +0 0 0 rg +1 0 0 1 323.88147 669.6803 Tm +(FRPSXWHU) Tj +ET +BT +/F8 4.5 Tf +0 0 0 rg +1 0 0 1 345.71097 669.6803 Tm +(WKURXJK) Tj +ET +BT +/F8 4.5 Tf +0 0 0 rg +1 0 0 1 364.19696 669.6803 Tm +(8$57) Tj +ET +BT +/F8 4.5 Tf +0 0 0 rg +1 0 0 1 378.03897 669.6803 Tm +(,I) Tj +ET +BT +/F8 4.5 Tf +0 0 0 rg +1 0 0 1 382.28247 669.6803 Tm +(WKH) Tj +ET +BT +/F8 4.5 Tf +0 0 0 rg +1 0 0 1 390.39597 669.6803 Tm +(SDUDPHWHU) Tj +ET +BT +/F8 4.5 Tf +0 0 0 rg +1 0 0 1 414.00748 669.6803 Tm +(YDOXH) Tj +ET +BT +/F8 4.5 Tf +0 0 0 rg +1 0 0 1 426.46799 669.6803 Tm +(LV) Tj +ET +BT +/F8 4.5 Tf +0 0 0 rg +1 0 0 1 430.9545 669.6803 Tm +(1) Tj +ET +BT +/F8 4.5 Tf +0 0 0 rg +1 0 0 1 435.54449 669.6803 Tm +( WKH) Tj +ET +BT +/F8 4.5 Tf +0 0 0 rg +1 0 0 1 445.008 669.6803 Tm +(YDOXH) Tj +ET +BT +/F8 4.5 Tf +0 0 0 rg +1 0 0 1 457.46851 669.6803 Tm +(RI) Tj +ET +BT +/F8 4.5 Tf +0 0 0 rg +1 0 0 1 462.909 669.6803 Tm +(1) Tj +ET +BT +/F8 4.5 Tf +0 0 0 rg +1 0 0 1 467.49899 669.6803 Tm +(UDQJHV) Tj +ET +BT +/F8 4.5 Tf +0 0 0 rg +1 0 0 1 483.29401 669.6803 Tm +(IURP) Tj +ET +BT +/F8 4.5 Tf +0 0 0 rg +1 0 0 1 494.80051 669.6803 Tm +() Tj +ET +BT +/F8 4.5 Tf +0 0 0 rg +1 0 0 1 498.54449 669.6803 Tm +(WR) Tj +ET +BT +/F8 6.5 Tf +0 0 0 rg +1 0 0 1 87.84 654.07727 Tm +( ) Tj +ET +BT +/F8 6.5 Tf +0 0 0 rg +1 0 0 1 100.658 654.07727 Tm +(WKH) Tj +ET +BT +/F8 6.5 Tf +0 0 0 rg +1 0 0 1 112.37749 654.07727 Tm +(FRUUHVSRQGLQJ) Tj +ET +BT +/F8 6.5 Tf +0 0 0 rg +1 0 0 1 158.9045 654.07727 Tm +(EDXG) Tj +ET +BT +/F8 6.5 Tf +0 0 0 rg +1 0 0 1 176.25299 654.07727 Tm +(UDWH) Tj +ET +BT +/F8 6.5 Tf +0 0 0 rg +1 0 0 1 190.28648 654.07727 Tm +(LV) Tj +ET +BT +/F8 6.5 Tf +0 0 0 rg +1 0 0 1 196.76698 654.07727 Tm +( ) Tj +ET +BT +/F10 6.5 Tf +0 0 0 rg +1 0 0 1 213.58899 654.07727 Tm +<04A9002F000A0001> Tj +ET +BT +/F8 6.5 Tf +0 0 0 rg +1 0 0 1 228.43498 654.07727 Tm +(ESV) Tj +ET +BT +/F9 9 Tf +0 0 0 rg +1 0 0 1 87.84 616.40033 Tm +() Tj +ET +BT +/F9 9 Tf +0 0 0 rg +1 0 0 1 110.754 616.40033 Tm +(6HFXULW\\) Tj +ET +BT +/F9 9 Tf +0 0 0 rg +1 0 0 1 149.769 616.40033 Tm +(OHYHO) Tj +ET +BT +/F9 9 Tf +0 0 0 rg +1 0 0 1 173.358 616.40033 Tm +( SDUDPHWHU) Tj +ET +BT +/F9 9 Tf +0 0 0 rg +1 0 0 1 226.87201 616.40033 Tm +(QXPEHU) Tj +ET +BT +/F9 9 Tf +0 0 0 rg +1 0 0 1 267.543 616.40033 Tm +( ) Tj +ET +BT +/F8 4.5 Tf +0 0 0 rg +1 0 0 1 108.3 581.30029 Tm +(7KLV) Tj +ET +BT +/F8 4.5 Tf +0 0 0 rg +1 0 0 1 118.0695 581.30029 Tm +(SDUDPHWHU) Tj +ET +BT +/F8 4.5 Tf +0 0 0 rg +1 0 0 1 141.681 581.30029 Tm +(FRQWUROV) Tj +ET +BT +/F8 4.5 Tf +0 0 0 rg +1 0 0 1 160.0365 581.30029 Tm +(WKH) Tj +ET +BT +/F8 4.5 Tf +0 0 0 rg +1 0 0 1 168.14999 581.30029 Tm +(ILQJHUSULQW) Tj +ET +BT +/F8 4.5 Tf +0 0 0 rg +1 0 0 1 192.16649 581.30029 Tm +(FRPSDULVRQ) Tj +ET +BT +/F8 4.5 Tf +0 0 0 rg +1 0 0 1 218.39699 581.30029 Tm +(DQG) Tj +ET +BT +/F8 4.5 Tf +0 0 0 rg +1 0 0 1 227.63998 581.30029 Tm +(WKH) Tj +ET +BT +/F8 4.5 Tf +0 0 0 rg +1 0 0 1 235.75348 581.30029 Tm +(FRPSDULVRQ) Tj +ET +BT +/F8 4.5 Tf +0 0 0 rg +1 0 0 1 261.98398 581.30029 Tm +(WKUHVKROG) Tj +ET +BT +/F8 4.5 Tf +0 0 0 rg +1 0 0 1 283.54349 581.30029 Tm +(GXULQJ) Tj +ET +BT +/F8 4.5 Tf +0 0 0 rg +1 0 0 1 298.82999 581.30029 Tm +(VHDUFK) Tj +ET +BT +/F8 4.5 Tf +0 0 0 rg +1 0 0 1 315.22348 581.30029 Tm +(,W) Tj +ET +BT +/F8 4.5 Tf +0 0 0 rg +1 0 0 1 319.54349 581.30029 Tm +(LV) Tj +ET +BT +/F8 4.5 Tf +0 0 0 rg +1 0 0 1 324.03 581.30029 Tm +(GLYLGHG) Tj +ET +BT +/F8 4.5 Tf +0 0 0 rg +1 0 0 1 340.6485 581.30029 Tm +(LQWR) Tj +ET +BT +/F8 4.5 Tf +0 0 0 rg +1 0 0 1 350.10748 581.30029 Tm +() Tj +ET +BT +/F8 4.5 Tf +0 0 0 rg +1 0 0 1 353.85147 581.30029 Tm +(OHYHO) Tj +ET +BT +/F8 4.5 Tf +0 0 0 rg +1 0 0 1 365.91147 581.30029 Tm +(WKH) Tj +ET +BT +/F8 4.5 Tf +0 0 0 rg +1 0 0 1 374.02496 581.30029 Tm +(YDOXH) Tj +ET +BT +/F8 4.5 Tf +0 0 0 rg +1 0 0 1 386.48547 581.30029 Tm +(UDQJH) Tj +ET +BT +/F8 4.5 Tf +0 0 0 rg +1 0 0 1 400.12497 581.30029 Tm +(LV) Tj +ET +BT +/F8 4.5 Tf +0 0 0 rg +1 0 0 1 404.64746 581.30029 Tm +() Tj +ET +BT +/F8 4.5 Tf +0 0 0 rg +1 0 0 1 407.22147 581.30029 Tm +() Tj +ET +BT +/F8 4.5 Tf +0 0 0 rg +1 0 0 1 408.42746 581.30029 Tm +() Tj +ET +BT +/F8 4.5 Tf +0 0 0 rg +1 0 0 1 411.00146 581.30029 Tm +() Tj +ET +BT +/F8 4.5 Tf +0 0 0 rg +1 0 0 1 412.20746 581.30029 Tm +() Tj +ET +BT +/F8 4.5 Tf +0 0 0 rg +1 0 0 1 414.78146 581.30029 Tm +() Tj +ET +BT +/F8 4.5 Tf +0 0 0 rg +1 0 0 1 415.98746 581.30029 Tm +() Tj +ET +BT +/F8 4.5 Tf +0 0 0 rg +1 0 0 1 418.56146 581.30029 Tm +() Tj +ET +BT +/F8 4.5 Tf +0 0 0 rg +1 0 0 1 419.76746 581.30029 Tm +() Tj +ET +BT +/F8 4.5 Tf +0 0 0 rg +1 0 0 1 422.34146 581.30029 Tm +() Tj +ET +BT +/F8 4.5 Tf +0 0 0 rg +1 0 0 1 424.71747 581.30029 Tm +(:KHQ) Tj +ET +BT +/F8 4.5 Tf +0 0 0 rg +1 0 0 1 438.17245 581.30029 Tm +(WKH) Tj +ET +BT +/F8 4.5 Tf +0 0 0 rg +1 0 0 1 446.28595 581.30029 Tm +(VHFXULW\\) Tj +ET +BT +/F8 4.5 Tf +0 0 0 rg +1 0 0 1 464.02945 581.30029 Tm +(OHYHO) Tj +ET +BT +/F8 4.5 Tf +0 0 0 rg +1 0 0 1 474.88345 581.30029 Tm +(LV) Tj +ET +BT +/F8 4.5 Tf +0 0 0 rg +1 0 0 1 479.36996 581.30029 Tm +() Tj +ET +BT +/F8 4.5 Tf +0 0 0 rg +1 0 0 1 484.31998 581.30029 Tm +(WKH) Tj +ET +BT +/F8 4.5 Tf +0 0 0 rg +1 0 0 1 492.43347 581.30029 Tm +(IDOVH) Tj +ET +BT +/F8 4.5 Tf +0 0 0 rg +1 0 0 1 108.3021 565.7005 Tm +(DFFHSWDQFH) Tj +ET +BT +/F8 4.5 Tf +0 0 0 rg +1 0 0 1 133.25011 565.7005 Tm +(UDWH) Tj +ET +BT +/F8 4.5 Tf +0 0 0 rg +1 0 0 1 142.96561 565.7005 Tm +(LV) Tj +ET +BT +/F8 4.5 Tf +0 0 0 rg +1 0 0 1 147.4521 565.7005 Tm +(WKH) Tj +ET +BT +/F8 4.5 Tf +0 0 0 rg +1 0 0 1 155.5656 565.7005 Tm +(KLJKHVW) Tj +ET +BT +/F8 4.5 Tf +0 0 0 rg +1 0 0 1 173.75009 565.7005 Tm +(DQG) Tj +ET +BT +/F8 4.5 Tf +0 0 0 rg +1 0 0 1 182.99309 565.7005 Tm +(WKH) Tj +ET +BT +/F8 4.5 Tf +0 0 0 rg +1 0 0 1 191.10658 565.7005 Tm +(UHMHFWLRQ) Tj +ET +BT +/F8 4.5 Tf +0 0 0 rg +1 0 0 1 210.82108 565.7005 Tm +(UDWH) Tj +ET +BT +/F8 4.5 Tf +0 0 0 rg +1 0 0 1 220.53658 565.7005 Tm +(LV) Tj +ET +BT +/F8 4.5 Tf +0 0 0 rg +1 0 0 1 225.02307 565.7005 Tm +(WKH) Tj +ET +BT +/F8 4.5 Tf +0 0 0 rg +1 0 0 1 233.13657 565.7005 Tm +(ORZHVW) Tj +ET +BT +/F8 4.5 Tf +0 0 0 rg +1 0 0 1 249.25107 565.7005 Tm +(7KH) Tj +ET +BT +/F8 4.5 Tf +0 0 0 rg +1 0 0 1 258.24207 565.7005 Tm +(VHFXULW\\) Tj +ET +BT +/F8 4.5 Tf +0 0 0 rg +1 0 0 1 275.98557 565.7005 Tm +(OHYHO) Tj +ET +BT +/F8 4.5 Tf +0 0 0 rg +1 0 0 1 286.83957 565.7005 Tm +(LV) Tj +ET +BT +/F8 4.5 Tf +0 0 0 rg +1 0 0 1 290.15607 565.7005 Tm +() Tj +ET +BT +/F8 4.5 Tf +0 0 0 rg +1 0 0 1 293.90005 565.7005 Tm +(:KHQ) Tj +ET +BT +/F8 4.5 Tf +0 0 0 rg +1 0 0 1 307.35504 565.7005 Tm +(WKH) Tj +ET +BT +/F8 4.5 Tf +0 0 0 rg +1 0 0 1 315.46854 565.7005 Tm +(IDOVH) Tj +ET +BT +/F8 4.5 Tf +0 0 0 rg +1 0 0 1 326.56555 565.7005 Tm +(UDWH) Tj +ET +BT +/F8 4.5 Tf +0 0 0 rg +1 0 0 1 336.28107 565.7005 Tm +(LV) Tj +ET +BT +/F8 4.5 Tf +0 0 0 rg +1 0 0 1 340.76758 565.7005 Tm +(WKH) Tj +ET +BT +/F8 4.5 Tf +0 0 0 rg +1 0 0 1 348.88107 565.7005 Tm +(ORZHVW) Tj +ET +BT +/F8 4.5 Tf +0 0 0 rg +1 0 0 1 364.99557 565.7005 Tm +(WKH) Tj +ET +BT +/F8 4.5 Tf +0 0 0 rg +1 0 0 1 373.10907 565.7005 Tm +(UHMHFWLRQ) Tj +ET +BT +/F8 4.5 Tf +0 0 0 rg +1 0 0 1 392.82358 565.7005 Tm +(UDWH) Tj +ET +BT +/F8 4.5 Tf +0 0 0 rg +1 0 0 1 402.53906 565.7005 Tm +(LV) Tj +ET +BT +/F8 4.5 Tf +0 0 0 rg +1 0 0 1 407.02557 565.7005 Tm +(WKH) Tj +ET +BT +/F8 4.5 Tf +0 0 0 rg +1 0 0 1 415.13907 565.7005 Tm +(KLJKHVW) Tj +ET +BT +/F9 8 Tf +0 0 0 rg +1 0 0 1 87.84 528.02032 Tm +() Tj +ET +BT +/F9 8 Tf +0 0 0 rg +1 0 0 1 108.20799 528.02032 Tm +(3DFNHW) Tj +ET +BT +/F9 8 Tf +0 0 0 rg +1 0 0 1 137.41599 528.02032 Tm +(FRQWHQW) Tj +ET +BT +/F9 8 Tf +0 0 0 rg +1 0 0 1 170.74399 528.02032 Tm +(OHQJWK) Tj +ET +BT +/F9 8 Tf +0 0 0 rg +1 0 0 1 199.03999 528.02032 Tm +( SDUDPHWHU) Tj +ET +BT +/F9 8 Tf +0 0 0 rg +1 0 0 1 246.608 528.02032 Tm +(QXPEHU) Tj +ET +BT +/F9 8 Tf +0 0 0 rg +1 0 0 1 282.76001 528.02032 Tm +( ) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 108.3 492.86029 Tm +(:KHQ) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 124.745 492.86029 Tm +(WKLV) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 135.61301 492.86029 Tm +(SDUDPHWHU) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 164.47151 492.86029 Tm +(FRQWUROV) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 186.90601 492.86029 Tm +(WKH) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 196.82251 492.86029 Tm +(FRPPXQLFDWLRQ) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 238.57851 492.86029 Tm +(EHWZHHQ) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 262.40451 492.86029 Tm +(WKH) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 272.32101 492.86029 Tm +(PRGXOH) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 293.5235 492.86029 Tm +(DQG) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 304.8205 492.86029 Tm +(WKH) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 314.737 492.86029 Tm +(KRVW) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 327.51349 492.86029 Tm +(FRPSXWHU) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 355.668 492.86029 Tm +(WKH) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 365.5845 492.86029 Tm +(PD[LPXP) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 393.255 492.86029 Tm +(OHQJWK) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 411.37201 492.86029 Tm +(RI) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 418.02151 492.86029 Tm +(WKH) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 427.93802 492.86029 Tm +(SDFNHW) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 446.50052 492.86029 Tm +(FRQWHQW) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 467.76901 492.86029 Tm +(LQ) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 474.017 492.86029 Tm +(WKH) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 483.9335 492.86029 Tm +(GDWD) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 496.9025 492.86029 Tm +(LV) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 502.38599 492.86029 Tm +(DOORZHG) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 87.8355 477.25729 Tm +(IRU) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 96.7565 477.25729 Tm +(HDFK) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 110.413 477.25729 Tm +(WUDQVPLVVLRQ) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 146.66901 477.25729 Tm +(7KH) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 157.658 477.25729 Tm +(YDOXH) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 172.88751 477.25729 Tm +(UDQJH) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 189.55801 477.25729 Tm +(LV) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 196.51552 477.25729 Tm +() Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 201.13551 477.25729 Tm +() Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 204.28151 477.25729 Tm +() Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 205.75551 477.25729 Tm +() Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 208.9015 477.25729 Tm +() Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 210.3755 477.25729 Tm +() Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 213.5215 477.25729 Tm +() Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 216.42551 477.25729 Tm +(WKH) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 226.34201 477.25729 Tm +(FRUUHVSRQGLQJ) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 265.711 477.25729 Tm +(OHQJWKV) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 286.46249 477.25729 Tm +( QXPEHU) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 310.23898 477.25729 Tm +(RI) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 316.88849 477.25729 Tm +(E\\WHV ) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 333.87799 477.25729 Tm +(DUH) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 343.811 477.25729 Tm +() Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 350.103 477.25729 Tm +() Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 351.577 477.25729 Tm +() Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 357.86899 477.25729 Tm +() Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 359.34299 477.25729 Tm +() Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 368.78098 477.25729 Tm +() Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 370.25497 477.25729 Tm +() Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 379.69296 477.25729 Tm +() Tj +ET +BT +/F9 10 Tf +0 0 0 rg +1 0 0 1 87.84 438.86029 Tm +() Tj +ET +BT +/F9 10 Tf +0 0 0 rg +1 0 0 1 104.73 438.86029 Tm +(6\\VWHP) Tj +ET +BT +/F9 10 Tf +0 0 0 rg +1 0 0 1 143.56999 438.86029 Tm +(6WDWXV) Tj +ET +BT +/F9 10 Tf +0 0 0 rg +1 0 0 1 177.93999 438.86029 Tm +(5HJLVWHU) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 108.84 404.48029 Tm +(7KH) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 119.82899 404.48029 Tm +(V\\VWHP) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 139.56299 404.48029 Tm +(VWDWXV) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 156.71748 404.48029 Tm +(UHJLVWHU) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 178.31598 404.48029 Tm +(LQGLFDWHV) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 202.81297 404.48029 Tm +(WKH) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 212.72948 404.48029 Tm +(FXUUHQW) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 233.22798 404.48029 Tm +(ZRUNLQJ) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 255.71748 404.48029 Tm +(VWDWXV) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 272.87198 404.48029 Tm +(RI) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 279.52148 404.48029 Tm +(WKH) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 289.43799 404.48029 Tm +(PRGXOH) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 312.1145 404.48029 Tm +(,W) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 317.3945 404.48029 Tm +(FDQ) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 327.94901 404.48029 Tm +(EH) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 335.86349 404.48029 Tm +(UHDG) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 349.13501 404.48029 Tm +(WKURXJK) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 371.729 404.48029 Tm +(WKH) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 381.64551 404.48029 Tm +(FRPPDQG) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 409.19501 404.48029 Tm +(5HDG6\\V3DUD) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 445.319 404.48029 Tm +(WKH) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 455.2355 404.48029 Tm +(OHQJWK) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 473.35251 404.48029 Tm +(LV) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 478.836 404.48029 Tm +(:RUG) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 498.98248 404.48029 Tm +(,WV) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 506.89697 404.48029 Tm +(ELWV) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 517.74847 404.48029 Tm +(DUH) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 108.84 388.8804 Tm +(GHILQHG) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 129.94901 388.8804 Tm +(DV) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 137.099 388.8804 Tm +(IROORZV) Tj +ET +BT +/F8 4 Tf +0 0 0 rg +1 0 0 1 163.97971 372.80081 Tm +(7DJ) Tj +ET +BT +/F8 4 Tf +0 0 0 rg +1 0 0 1 171.94771 372.80081 Tm +(QXPEHU) Tj +ET +BT +/F8 10.5 Tf +0 0 0 rg +1 0 0 1 211.5498 372.80081 Tm +() Tj +ET +BT +/F8 10.5 Tf +0 0 0 rg +1 0 0 1 243.0435 372.80081 Tm +() Tj +ET +BT +/F8 10.5 Tf +0 0 0 rg +1 0 0 1 292.22931 372.80081 Tm +() Tj +ET +BT +/F8 10.5 Tf +0 0 0 rg +1 0 0 1 344.724 372.80081 Tm +() Tj +ET +BT +/F8 10.5 Tf +0 0 0 rg +1 0 0 1 380.71899 372.80081 Tm +() Tj +ET +BT +/F8 10.5 Tf +0 0 0 rg +1 0 0 1 421.2142 372.80081 Tm +() Tj +ET +BT +/F8 4 Tf +0 0 0 rg +1 0 0 1 165.48 356.72031 Tm +(VLJQLILFDQFH) Tj +ET +BT +/F8 9 Tf +0 0 0 rg +1 0 0 1 208.90891 356.72031 Tm +(5HVHUYHG) Tj +ET +BT +/F8 9.5 Tf +0 0 0 rg +1 0 0 1 268.5842 356.72031 Tm +(,PJ%XI6WDW) Tj +ET +BT +/F8 10.5 Tf +0 0 0 rg +1 0 0 1 339.4115 356.72031 Tm +(3:') Tj +ET +BT +/F8 10.5 Tf +0 0 0 rg +1 0 0 1 372.7677 356.72031 Tm +(3DVV) Tj +ET +BT +/F8 10.5 Tf +0 0 0 rg +1 0 0 1 413.26389 356.72031 Tm +(%XV\\) Tj +ET +BT +/F8 8 Tf +0 0 0 rg +1 0 0 1 150.84 340.58041 Tm +(1RWH) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 171.84 324.98047 Tm +(%XV\\) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 185.765 324.98047 Tm +(RFFXS\\) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 203.605 324.98047 Tm +() Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 207.765 324.98047 Tm +(ELW) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 216.575 324.98047 Tm +(VHW) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 224.89499 324.98047 Tm +(WR) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 231.02499 324.98047 Tm +() Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 235.185 324.98047 Tm +(WR) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 241.315 324.98047 Tm +(LQGLFDWH) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 261.19 324.98047 Tm +(WKDW) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 271.995 324.98047 Tm +(WKH) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 281.01001 324.98047 Tm +(V\\VWHP) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 298.95001 324.98047 Tm +(LV) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 303.935 324.98047 Tm +(H[HFXWLQJ) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 328.26999 324.98047 Tm +(FRPPDQGV) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 357.04999 324.98047 Tm +() Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 361.20999 324.98047 Tm +(WR) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 367.34 324.98047 Tm +(LQGLFDWH) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 387.215 324.98047 Tm +(WKDW) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 398.01999 324.98047 Tm +(WKH) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 407.03497 324.98047 Tm +(V\\VWHP) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 424.97498 324.98047 Tm +(LV) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 429.95996 324.98047 Tm +(LGOH) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 441.07495 324.98047 Tm +(3DVV) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 171.84 309.38074 Tm +(RFFXS\\) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 189.67999 309.38074 Tm +() Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 193.84 309.38074 Tm +(ELW) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 202.64999 309.38074 Tm +(VHW) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 210.97 309.38074 Tm +(WR) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 217.10001 309.38074 Tm +() Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 221.26001 309.38074 Tm +(WR) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 227.39001 309.38074 Tm +(LQGLFDWH) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 247.26501 309.38074 Tm +(WKDW) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 258.07001 309.38074 Tm +(WKH) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 267.08502 309.38074 Tm +(ILQJHUSULQW) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 293.77002 309.38074 Tm +(YHULILFDWLRQ) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 321.21002 309.38074 Tm +(LV) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 326.19501 309.38074 Tm +(SDVVHG) Tj +ET +BT +/F8 6.5 Tf +0 0 0 rg +1 0 0 1 171.84 293.78088 Tm +(3:') Tj +ET +BT +/F8 6.5 Tf +0 0 0 rg +1 0 0 1 189.99449 293.78088 Tm +(2QH) Tj +ET +BT +/F8 6.5 Tf +0 0 0 rg +1 0 0 1 204.44398 293.78088 Tm +(ELW) Tj +ET +BT +/F8 6.5 Tf +0 0 0 rg +1 0 0 1 215.89699 293.78088 Tm +(VHW) Tj +ET +BT +/F8 6.5 Tf +0 0 0 rg +1 0 0 1 226.71298 293.78088 Tm +(WR) Tj +ET +BT +/F8 6.5 Tf +0 0 0 rg +1 0 0 1 234.68198 293.78088 Tm +() Tj +ET +BT +/F8 6.5 Tf +0 0 0 rg +1 0 0 1 240.08998 293.78088 Tm +(PHDQV) Tj +ET +BT +/F8 6.5 Tf +0 0 0 rg +1 0 0 1 262.30048 293.78088 Tm +(WKH) Tj +ET +BT +/F8 6.5 Tf +0 0 0 rg +1 0 0 1 274.01999 293.78088 Tm +(GHYLFH) Tj +ET +BT +/F8 6.5 Tf +0 0 0 rg +1 0 0 1 295.13849 293.78088 Tm +(KDQGVKDNH) Tj +ET +BT +/F8 6.5 Tf +0 0 0 rg +1 0 0 1 330.4205 293.78088 Tm +(SDVVZRUG) Tj +ET +BT +/F8 6.5 Tf +0 0 0 rg +1 0 0 1 361.70502 293.78088 Tm +(LV) Tj +ET +BT +/F8 6.5 Tf +0 0 0 rg +1 0 0 1 368.18552 293.78088 Tm +(YHULILHG) Tj +ET +BT +/F8 6.5 Tf +0 0 0 rg +1 0 0 1 394.52353 293.78088 Tm +(,PJ%XI6WDW) Tj +ET +BT +/F8 6.5 Tf +0 0 0 rg +1 0 0 1 432.62003 293.78088 Tm +(2QH) Tj +ET +BT +/F8 6.5 Tf +0 0 0 rg +1 0 0 1 447.06952 293.78088 Tm +(ELW) Tj +ET +BT +/F8 6.5 Tf +0 0 0 rg +1 0 0 1 458.52252 293.78088 Tm +(VHW) Tj +ET +BT +/F8 6.5 Tf +0 0 0 rg +1 0 0 1 469.33853 293.78088 Tm +(WR) Tj +ET +BT +/F8 6.5 Tf +0 0 0 rg +1 0 0 1 477.30753 293.78088 Tm +() Tj +ET +BT +/F8 6.5 Tf +0 0 0 rg +1 0 0 1 171.84 278.18103 Tm +(PHDQV) Tj +ET +BT +/F8 6.5 Tf +0 0 0 rg +1 0 0 1 194.05049 278.18103 Tm +(WKHUH) Tj +ET +BT +/F8 6.5 Tf +0 0 0 rg +1 0 0 1 212.12048 278.18103 Tm +(LV) Tj +ET +BT +/F8 6.5 Tf +0 0 0 rg +1 0 0 1 218.60098 278.18103 Tm +(D) Tj +ET +BT +/F8 6.5 Tf +0 0 0 rg +1 0 0 1 223.93748 278.18103 Tm +(YDOLG) Tj +ET +BT +/F8 6.5 Tf +0 0 0 rg +1 0 0 1 239.92749 278.18103 Tm +(ILQJHUSULQW) Tj +ET +BT +/F8 6.5 Tf +0 0 0 rg +1 0 0 1 274.61798 278.18103 Tm +(LPDJH) Tj +ET +BT +/F8 6.5 Tf +0 0 0 rg +1 0 0 1 295.3725 278.18103 Tm +(LQ) Tj +ET +BT +/F8 6.5 Tf +0 0 0 rg +1 0 0 1 302.7565 278.18103 Tm +(WKH) Tj +ET +BT +/F8 6.5 Tf +0 0 0 rg +1 0 0 1 314.47601 278.18103 Tm +(ILQJHUSULQW) Tj +ET +BT +/F8 6.5 Tf +0 0 0 rg +1 0 0 1 349.1665 278.18103 Tm +(LPDJH) Tj +ET +BT +/F8 6.5 Tf +0 0 0 rg +1 0 0 1 369.92102 278.18103 Tm +(EXIIHU) Tj +ET +BT +/F9 8.5 Tf +0 0 0 rg +1 0 0 1 87.84 239.78027 Tm +() Tj +ET +BT +/F9 8.5 Tf +0 0 0 rg +1 0 0 1 102.1965 239.78027 Tm +(PRGXOH) Tj +ET +BT +/F9 8.5 Tf +0 0 0 rg +1 0 0 1 136.59599 239.78027 Tm +(SDVVZRUG) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 108.96 205.40027 Tm +($IWHU) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 121.865 205.40027 Tm +(WKH) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 130.88 205.40027 Tm +(PRGXOH) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 150.155 205.40027 Tm +(LV) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 155.14 205.40027 Tm +(SRZHUHG) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 177.25 205.40027 Tm +(RQ) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 184.66499 205.40027 Tm +(DQG) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 194.935 205.40027 Tm +(UHVHW) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 209.48 205.40027 Tm +(LW) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 213.875 205.40027 Tm +(ZLOO) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 222.97501 205.40027 Tm +(ILUVWO\\) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 237.39 205.40027 Tm +(FKHFN) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 252.07001 205.40027 Tm +(ZKHWKHU) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 272.99002 205.40027 Tm +(WKH) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 282.005 205.40027 Tm +(GHYLFH) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 298.25 205.40027 Tm +(KDQGVKDNH) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 325.39001 205.40027 Tm +(SDVVZRUG) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 349.45502 205.40027 Tm +(KDV) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 359.04501 205.40027 Tm +(EHHQ) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 372.15002 205.40027 Tm +(PRGLILHG) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 395.76001 205.40027 Tm +(,I) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 400.47501 205.40027 Tm +(LW) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 404.87 205.40027 Tm +(LV) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 409.85498 205.40027 Tm +(QRW) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 419.07498 205.40027 Tm +(PRGLILHG) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 442.685 205.40027 Tm +(WKH) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 451.70001 205.40027 Tm +(PRGXOH) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 470.97501 205.40027 Tm +(FRQVLGHUV) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 494.83002 205.40027 Tm +(WKDW) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 505.63501 205.40027 Tm +(WKH) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 514.65002 205.40027 Tm +(KRVW) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 87.8445 189.7973 Tm +(FRPSXWHU) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 112.09949 189.7973 Tm +(GRHV) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 124.71449 189.7973 Tm +(QRW) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 133.93449 189.7973 Tm +(QHHG) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 147.03949 189.7973 Tm +(WR) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 153.16949 189.7973 Tm +(YHULI\\) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 167.4545 189.7973 Tm +(WKH) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 176.4695 189.7973 Tm +(SDVVZRUG) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 201.8745 189.7973 Tm +(DQG) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 212.1445 189.7973 Tm +(GLUHFWO\\) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 230.7395 189.7973 Tm +(HQWHUV) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 247.0345 189.7973 Tm +(WKH) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 256.0495 189.7973 Tm +(QRUPDO) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 274.2995 189.7973 Tm +(ZRUNLQJ) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 294.74451 189.7973 Tm +(VWDWH) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 309.0145 189.7973 Tm +(WKDW) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 319.81949 189.7973 Tm +(LV) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 326.1445 189.7973 Tm +(ZKHQ) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 340.37451 189.7973 Tm +(WKH) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 349.38953 189.7973 Tm +(PRGXOH) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 368.66452 189.7973 Tm +(SDVVZRUG) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 392.72952 189.7973 Tm +(LV) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 397.71451 189.7973 Tm +(WKH) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 406.72949 189.7973 Tm +(GHIDXOW) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 424.63449 189.7973 Tm +(SDVVZRUG) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 450.03949 189.7973 Tm +(LW) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 454.43448 189.7973 Tm +(GRHV) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 467.04947 189.7973 Tm +(QRW) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 476.26947 189.7973 Tm +(QHHG) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 489.37448 189.7973 Tm +(WR) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 495.50449 189.7973 Tm +(YHULI\\) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 509.78949 189.7973 Tm +(WKH) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 87.8445 174.19434 Tm +(SDVVZRUG) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 113.2495 174.19434 Tm +(SDVVZRUG) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 137.3145 174.19434 Tm +(LV) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 140.9995 174.19434 Tm +() Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 145.1595 174.19434 Tm +(E\\WHV) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 160.4445 174.19434 Tm +(WKH) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 169.4595 174.19434 Tm +(IDFWRU\\) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 187.1295 174.19434 Tm +(GHIDXOW) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 205.0345 174.19434 Tm +(SDVVZRUG) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 229.0995 174.19434 Tm +(LV) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 234.1245 174.19434 Tm +([) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 262.50949 174.19434 Tm +() Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 108.8403 158.60083 Tm +(,I) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 114.0268 158.60083 Tm +(WKH) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 123.9433 158.60083 Tm +(PRGXOH) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 145.1458 158.60083 Tm +(LQWHUQDO) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 166.6563 158.60083 Tm +(SDVVZRUG) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 193.12779 158.60083 Tm +(KDV) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 203.67679 158.60083 Tm +(EHHQ) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 218.09229 158.60083 Tm +(PRGLILHG) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 242.58928 158.60083 Tm +( VHH) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 254.50778 158.60083 Tm +(WKH) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 264.42429 158.60083 Tm +(VHW) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 273.57629 158.60083 Tm +(SDVVZRUG) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 300.04779 158.60083 Tm +(FRPPDQG) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 327.59729 158.60083 Tm +(6HW3ZG) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 346.7373 158.60083 Tm +( ) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 351.29129 158.60083 Tm +(WKH) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 361.20779 158.60083 Tm +(GHYLFH) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 379.0773 158.60083 Tm +(KDQGVKDNH) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 408.9313 158.60083 Tm +(SDVVZRUG) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 435.4028 158.60083 Tm +(PXVW) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 449.99429 158.60083 Tm +(EH) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 457.90878 158.60083 Tm +(YHULILHG) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 478.72079 158.60083 Tm +(ILUVW) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 491.8273 158.60083 Tm +(DQG) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 503.1243 158.60083 Tm +(WKH) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 87.8403 142.9978 Tm +(PRGXOH) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 109.0428 142.9978 Tm +(ZLOO) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 119.0528 142.9978 Tm +(HQWHU) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 134.3428 142.9978 Tm +(WKH) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 144.25931 142.9978 Tm +(QRUPDO) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 164.3343 142.9978 Tm +(ZRUNLQJ) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 186.82381 142.9978 Tm +(VWDWH) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 201.04681 142.9978 Tm +(DIWHU) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 214.81331 142.9978 Tm +(WKH) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 224.72981 142.9978 Tm +(SDVVZRUG) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 251.20131 142.9978 Tm +(LV) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 256.68481 142.9978 Tm +(SDVVHG) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 277.8103 142.9978 Tm +(2WKHUZLVH) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 305.77231 142.9978 Tm +(WKH) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 315.68881 142.9978 Tm +(PRGXOH) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 336.8913 142.9978 Tm +(UHIXVHV) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 357.35681 142.9978 Tm +(WR) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 364.09982 142.9978 Tm +(H[HFXWH) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 385.76984 142.9978 Tm +(DQ\\) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 396.48935 142.9978 Tm +(LQVWUXFWLRQ) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 108.8392 127.401 Tm +($IWHU) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 121.7442 127.401 Tm +(WKH) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 130.7592 127.401 Tm +(SDVVZRUG) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 154.8242 127.401 Tm +(LV) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 159.8092 127.401 Tm +(PRGLILHG) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 183.4192 127.401 Tm +(WKH) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 192.4342 127.401 Tm +(QHZ) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 203.5742 127.401 Tm +(SDVVZRUG) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 227.63921 127.401 Tm +(ZLOO) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 236.73921 127.401 Tm +(EH) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 243.93422 127.401 Tm +(VDYHG) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 258.86923 127.401 Tm +(LQ) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 264.54922 127.401 Tm +(\)ODVK) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 279.36423 127.401 Tm +(DQG) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 289.63422 127.401 Tm +(LW) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 294.02921 127.401 Tm +(ZLOO) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 303.12921 127.401 Tm +(VWLOO) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 312.49921 127.401 Tm +(EH) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 319.69421 127.401 Tm +(VDYHG) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 334.62921 127.401 Tm +(ZKHQ) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 348.85922 127.401 Tm +(WKH) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 108.8392 111.80121 Tm +(SRZHU) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 125.0542 111.80121 Tm +(LV) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 130.0392 111.80121 Tm +(WXUQHG) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 147.28419 111.80121 Tm +(RII) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 156.38919 111.80121 Tm +(6HH) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 166.07419 111.80121 Tm +($XWKHQWLFDWLRQ) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 201.97418 111.80121 Tm +(3DVVZRUG) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 224.68918 111.80121 Tm +(9I\\3ZG) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 243.28918 111.80121 Tm +(&RPPDQG) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 269.09418 111.80121 Tm +(DQG) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 279.36417 111.80121 Tm +(VHW) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 287.68417 111.80121 Tm +(SDVVZRUG) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 311.74918 111.80121 Tm +(6HW3ZG) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 330.44919 111.80121 Tm +(LQVWUXFWLRQ) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 270.17999 45.86041 Tm +(WKH) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 280.0965 45.86041 Tm +(ILUVW) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 291.729 45.86041 Tm +() Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 296.30499 45.86041 Tm +(SDJHV) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 313.32199 45.86041 Tm +(RI) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 319.9715 45.86041 Tm +() Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 327.69348 45.86041 Tm +(3DJH) Tj +ET + +endstream +endobj +896 0 obj +<< +/Subtype /TrueType +/FontDescriptor 2843 0 R +/LastChar 32 +/Widths [278] +/BaseFont /ArialMT +/FirstChar 32 +/Encoding /WinAnsiEncoding +/Type /Font +>> +endobj +897 0 obj +<< +/Subtype /Type0 +/DescendantFonts [2844 0 R] +/BaseFont /PKKMKM+Wingdings-Regular +/Encoding /Identity-H +/Type /Font +>> +endobj +898 0 obj +<< +/Length 2 +>> +stream +q + +endstream +endobj +899 0 obj +<< +/Length 828 +/Filter /FlateDecode +>> +stream +xVj1}߯D;]!b;B[o!\B1wfqdՊbJgF͸=^W9ef~ߴg`fs# m5mׁA6`ɛn.gyj[ǫ&A6 -tBdԯٌгu.fiXduN69 ,P_lf=x:>[lxkNΧ7 ĐOƹh ꦹmu=ڏ,<0 o60fK;3%_Y&ak'l&2 +a/ E?钥"ЩdDNs.5{((G% +ڔҐ62 Z䊻!`%e +SHD8'tr B:Iwia5p,*pKfpEɆs7cGfnI% ;t,0ъ8Gg '8q\ԗQz )v. HJy +ZDF,H\D\(dwgmT]Q2}BhfuRY]PMY.p@$.(pA45 \s)z_G Sp؄Y.Vold5vEµ+F2z_ +덍zc#jstY'Д +endstream +endobj +900 0 obj +<< +/Length 11878 +>> +stream +Q +1 0 0 1 0 0 cm +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 377.35162 781.10431 Tm +(+DQJ]KRX) Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 415.64661 781.10431 Tm +(=KLDQ) Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 437.2991 781.10431 Tm +(7HFKQRORJ\\) Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 479.96661 781.10431 Tm +(&R) Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 495.21411 781.10431 Tm +(/WG) Tj +ET +BT +/F6 9.5 Tf +0 0 0 rg +1 0 0 1 87.84 748.28027 Tm +() Tj +ET +BT +/F6 9.5 Tf +0 0 0 rg +1 0 0 1 103.8855 748.28027 Tm +(0RGXOH) Tj +ET +BT +/F6 9.5 Tf +0 0 0 rg +1 0 0 1 141.9615 748.28027 Tm +(DGGUHVV) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 108.84 713.90033 Tm +(\(DFK) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 122.4525 713.90033 Tm +(PRGXOH) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 143.655 713.90033 Tm +(KDV) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 154.20399 713.90033 Tm +(DQ) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 162.1185 713.90033 Tm +(LGHQWLILFDWLRQ) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 197.423 713.90033 Tm +(DGGUHVV) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 220.82001 713.90033 Tm +(:KHQ) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 237.26501 713.90033 Tm +(WKH) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 247.18152 713.90033 Tm +(PRGXOH) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 268.38403 713.90033 Tm +(FRPPXQLFDWHV) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 307.73102 713.90033 Tm +(ZLWK) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 320.28751 713.90033 Tm +(WKH) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 330.20401 713.90033 Tm +(KRVW) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 342.9805 713.90033 Tm +(FRPSXWHU) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 371.13501 713.90033 Tm +(HDFK) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 384.7915 713.90033 Tm +(LQVWUXFWLRQ) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 414.71701 713.90033 Tm +(GDWD) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 427.686 713.90033 Tm +(LV) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 433.16949 713.90033 Tm +(WUDQVPLWWHG) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 464.99249 713.90033 Tm +(LQ) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 471.24048 713.90033 Tm +(WKH) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 481.15698 713.90033 Tm +(IRUP) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 495.22049 713.90033 Tm +(RI) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 501.87 713.90033 Tm +(D) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 506.3855 713.90033 Tm +(GDWD) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 87.84 698.2973 Tm +(SDFNHW) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 107.8765 698.2973 Tm +(DQG) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 119.17349 698.2973 Tm +(HDFK) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 132.82999 698.2973 Tm +(GDWD) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 145.79898 698.2973 Tm +(SDFNHW) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 164.36148 698.2973 Tm +(FRQWDLQV) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 187.68149 698.2973 Tm +(DQ) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 195.59599 698.2973 Tm +(DGGUHVV) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 217.519 698.2973 Tm +(DQG) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 228.81599 698.2973 Tm +(DQ) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 236.7305 698.2973 Tm +(DGGUHVV) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 258.6535 698.2973 Tm +(LWHP) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 273.20651 698.2973 Tm +(7KH) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 284.19553 698.2973 Tm +(PRGXOH) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 305.39801 698.2973 Tm +(RQO\\) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 317.7785 698.2973 Tm +(UHDFWV) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 334.92749 698.2973 Tm +(WR) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 341.6705 698.2973 Tm +(FRPPDQGV) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 371.85449 698.2973 Tm +(DQG) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 383.15149 698.2973 Tm +(GDWD) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 396.12048 698.2973 Tm +(SDFNHWV) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 417.31747 698.2973 Tm +(WKDW) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 429.20297 698.2973 Tm +(FRQWDLQ) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 449.88846 698.2973 Tm +(WKH) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 459.80496 698.2973 Tm +(VDPH) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 475.19946 698.2973 Tm +(DGGUHVV) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 497.12247 698.2973 Tm +(DV) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 504.27246 698.2973 Tm +(LWV) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 511.74146 698.2973 Tm +(RZQ) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 108.84 667.10083 Tm +(7KH) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 119.82899 667.10083 Tm +(PRGXOH) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 141.03149 667.10083 Tm +(DGGUHVV) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 162.9545 667.10083 Tm +(LV) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 168.438 667.10083 Tm +() Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 173.01401 667.10083 Tm +(E\\WHV) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 189.82751 667.10083 Tm +(DQG) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 201.12451 667.10083 Tm +(WKH) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 211.04102 667.10083 Tm +(GHIDXOW) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 230.73651 667.10083 Tm +(YDOXH) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 245.966 667.10083 Tm +(LV) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 252.92351 667.10083 Tm +([\)\)\)\)\)\)\)\)) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 284.71899 667.10083 Tm +(7KH) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 295.70801 667.10083 Tm +(XVHU) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 308.54501 667.10083 Tm +(FDQ) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 319.09952 667.10083 Tm +(PRGLI\\) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 338.49802 667.10083 Tm +(WKH) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 348.41452 667.10083 Tm +(PRGXOH) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 369.617 667.10083 Tm +(DGGUHVV) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 391.54001 667.10083 Tm +(WKURXJK) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 414.134 667.10083 Tm +(WKH) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 424.05051 667.10083 Tm +(FRPPDQG) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 451.60001 667.10083 Tm +( VHH) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 463.51849 667.10083 Tm +(WKH) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 473.435 667.10083 Tm +(6HW$GGHU) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 498.625 667.10083 Tm +(FRPPDQG) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 87.84 651.4978 Tm +(IRU) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 96.76099 651.4978 Tm +(VHWWLQJ) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 116.09899 651.4978 Tm +(WKH) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 126.01549 651.4978 Tm +(PRGXOH) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 147.21799 651.4978 Tm +(DGGUHVV ) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 172.26498 651.4978 Tm +($IWHU) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 186.46048 651.4978 Tm +(WKH) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 196.37698 651.4978 Tm +(PRGXOH) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 217.57948 651.4978 Tm +(DGGUHVV) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 239.50249 651.4978 Tm +(LV) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 244.98599 651.4978 Tm +(PRGLILHG) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 270.957 651.4978 Tm +(WKH) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 280.8735 651.4978 Tm +(QHZ) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 293.1275 651.4978 Tm +(DGGUHVV) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 315.05051 651.4978 Tm +(LV) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 320.534 651.4978 Tm +(VWLOO) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 330.841 651.4978 Tm +(VDYHG) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 347.2695 651.4978 Tm +(DIWHU) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 361.03601 651.4978 Tm +(WKH) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 370.95251 651.4978 Tm +(PRGXOH) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 392.15503 651.4978 Tm +(LV) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 397.63852 651.4978 Tm +(SRZHUHG) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 421.95953 651.4978 Tm +(RII) Tj +ET +BT +/F6 7.5 Tf +0 0 0 rg +1 0 0 1 87.84 613.10028 Tm +() Tj +ET +BT +/F6 7.5 Tf +0 0 0 rg +1 0 0 1 100.5075 613.10028 Tm +(UDQGRP) Tj +ET +BT +/F6 7.5 Tf +0 0 0 rg +1 0 0 1 132.075 613.10028 Tm +(QXPEHU) Tj +ET +BT +/F6 7.5 Tf +0 0 0 rg +1 0 0 1 163.83 613.10028 Tm +(JHQHUDWRU) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 108.84 578.66028 Tm +(7KH) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 119.82899 578.66028 Tm +(PRGXOH) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 141.03149 578.66028 Tm +(LQWHJUDWHV) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 168.82849 578.66028 Tm +(D) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 173.34399 578.66028 Tm +(KDUGZDUH) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 199.69449 578.66028 Tm +() Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 207.75749 578.66028 Tm +(ELW) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 215.97449 578.66028 Tm +(UDQGRP) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 238.01299 578.66028 Tm +(QXPEHU) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 260.1395 578.66028 Tm +(JHQHUDWRU) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 287.49649 578.66028 Tm +( QR) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 297.30298 578.66028 Tm +(UDQGRP) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 319.34149 578.66028 Tm +(QXPEHU) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 341.46799 578.66028 Tm +(VHHG) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 355.11899 578.66028 Tm +(LV) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 360.60248 578.66028 Tm +(UHTXLUHG ) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 387.48648 578.66028 Tm +(7KH) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 398.47549 578.66028 Tm +(XVHU) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 411.3125 578.66028 Tm +(FDQ) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 421.867 578.66028 Tm +(OHW) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 429.8035 578.66028 Tm +(WKH) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 439.72 578.66028 Tm +(PRGXOH) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 460.92249 578.66028 Tm +(JHQHUDWH) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 485.78247 578.66028 Tm +(D) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 490.29797 578.66028 Tm +(UDQGRP) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 87.84 563.05725 Tm +(QXPEHU) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 109.96649 563.05725 Tm +(DQG) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 121.26349 563.05725 Tm +(XSORDG) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 140.68948 563.05725 Tm +(LW) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 145.52399 563.05725 Tm +(WKURXJK) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 168.11798 563.05725 Tm +(LQVWUXFWLRQV) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 201.53598 563.05725 Tm +(6HH) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 212.18948 563.05725 Tm +(WKH) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 222.10599 563.05725 Tm +(VDPSOLQJ) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 247.40048 563.05725 Tm +(UDQGRP) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 269.439 563.05725 Tm +(QXPEHU) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 291.56549 563.05725 Tm +(LQVWUXFWLRQ) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 320.875 563.05725 Tm +(*HW5DQGRP&RGH) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 267.95999 45.86041 Tm +(WKH) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 277.8765 45.86041 Tm +(ILUVW) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 289.509 45.86041 Tm +() Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 297.23102 45.86041 Tm +(SDJHV) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 314.24802 45.86041 Tm +(RI) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 320.89752 45.86041 Tm +() Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 328.61951 45.86041 Tm +(3DJH) Tj +ET + +endstream +endobj +901 0 obj +<< +/Length 2 +>> +stream +q + +endstream +endobj +902 0 obj +<< +/Length 1895 +/Filter /FlateDecode +>> +stream +xYY7~_jJ! `|Łcg!ǯOV>ա>=ݫ׏OO_tzN|N?z>ӧQ/Rɫv89yF=}v?~Wy:}QcLt?H$&.܅Aa:}`ԳOQLV}==O(&5=tk~ǟLuYgP1YYC4Eh Xs*2E=Ŭ#49~0}~3^ M ׆DZ2O4mƺ@El2d'!kL"ԗӻycaZmXtnvvS0 k= .=ZC4F@g@-f6PP> 1 uͿRū]n ō2z>1khF:yMOڡɬ+++qUvi58R !p#\`-%mtD .g P$kpL:'35ڧ_I C t薜ϑH&sVP2r)zɼ^d$(Q,ukR"%,H:JZ*\wנ,ARY},9g>f֩~!3.9tA#c@>$r)MCGdtc quR8"k!ՌQ<%$8c! P֖Aܐl̈́_ Hń]Ԓ7UK(ٱ}C5hpyDv(5Xh( [J%gl@ܐl}%Ԩ0J =uQL7 W۔ఫif#`)SRh\KإV])tT}/CHY_[$": ,|,.DdZEcu$Y35B> +stream +Q +1 0 0 1 0 0 cm +BT +/F8 7.5 Tf +0 0 0 rg +1 0 0 1 377.35162 781.10431 Tm +(+DQJ]KRX) Tj +ET +BT +/F8 7.5 Tf +0 0 0 rg +1 0 0 1 415.64661 781.10431 Tm +(=KLDQ) Tj +ET +BT +/F8 7.5 Tf +0 0 0 rg +1 0 0 1 437.2991 781.10431 Tm +(7HFKQRORJ\\) Tj +ET +BT +/F8 7.5 Tf +0 0 0 rg +1 0 0 1 479.96661 781.10431 Tm +(&R) Tj +ET +BT +/F8 7.5 Tf +0 0 0 rg +1 0 0 1 495.21411 781.10431 Tm +(/WG) Tj +ET +BT +/F9 10.5 Tf +0 0 0 rg +1 0 0 1 208.25999 736.88031 Tm +(&KDSWHU) Tj +ET +BT +/F9 10.5 Tf +0 0 0 rg +1 0 0 1 253.095 736.88031 Tm +() Tj +ET +BT +/F9 10.5 Tf +0 0 0 rg +1 0 0 1 261.83099 736.88031 Tm +(&RPPXQLFDWLRQ) Tj +ET +BT +/F9 10.5 Tf +0 0 0 rg +1 0 0 1 348.267 736.88031 Tm +(3URWRFRO) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 114.84 690.86029 Tm +(7KH) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 124.82999 690.86029 Tm +(FRPPXQLFDWLRQ) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 162.78999 690.86029 Tm +(SURWRFRO) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 183.79999 690.86029 Tm +(GHILQHV) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 202.30998 690.86029 Tm +(WKH) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 211.32498 690.86029 Tm +(UXOHV) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 224.28499 690.86029 Tm +(RI) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 230.32999 690.86029 Tm +(LQIRUPDWLRQ) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 259.50998 690.86029 Tm +(H[FKDQJH) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 283.55499 690.86029 Tm +(EHWZHHQ) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 305.215 690.86029 Tm +(=\)0) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 323.83499 690.86029 Tm +(VHULHV) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 338.91998 690.86029 Tm +(PRGXOHV) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 360.59 690.86029 Tm +(DQG) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 370.85999 690.86029 Tm +(WKH) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 379.875 690.86029 Tm +(KRVW) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 391.48999 690.86029 Tm +(FRPSXWHU) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 417.08499 690.86029 Tm +(:KHWKHU) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 438.72498 690.86029 Tm +(WKH) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 447.73999 690.86029 Tm +(KDUGZDUH) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 471.69498 690.86029 Tm +(XVHV) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 483.69498 690.86029 Tm +(8$57) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 497.73499 690.86029 Tm +(RU) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 87.8445 667.45581 Tm +(,W) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 92.6445 667.45581 Tm +(LV) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 97.6295 667.45581 Tm +(D) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 101.7345 667.45581 Tm +(86%) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 112.68451 667.45581 Tm +(LQWHUIDFH) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 134.79951 667.45581 Tm +(W\\SH) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 147.68951 667.45581 Tm +(DQG) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 157.95952 667.45581 Tm +(ERWK) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 170.25452 667.45581 Tm +(XVH) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 179.85951 667.45581 Tm +(WKH) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 188.87451 667.45581 Tm +(VDPH) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 202.86951 667.45581 Tm +(FRPPXQLFDWLRQ) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 240.8295 667.45581 Tm +(SURWRFRO) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 261.83951 667.45581 Tm +(DQG) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 272.1095 667.45581 Tm +(LQVWUXFWLRQ) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 298.75449 667.45581 Tm +(VHW) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 308.41449 667.45581 Tm +(,I) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 313.12949 667.45581 Tm +(WKH) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 322.14447 667.45581 Tm +(KRVW) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 333.75946 667.45581 Tm +(FRPSXWHU) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 358.01447 667.45581 Tm +(XVHV) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 370.01447 667.45581 Tm +(D) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 374.11948 667.45581 Tm +(3&) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 382.94449 667.45581 Tm +(LW) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 387.33948 667.45581 Tm +(LV) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 392.32446 667.45581 Tm +(UHFRPPHQGHG) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 428.16446 667.45581 Tm +(WR) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 434.29446 667.45581 Tm +(RUGHU) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 448.64447 667.45581 Tm +(D) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 452.74948 667.45581 Tm +(86%) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 463.69949 667.45581 Tm +(LQWHUIDFH) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 87.8445 644.05133 Tm +(W\\SH) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 99.3945 644.05133 Tm +(RI) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 105.4395 644.05133 Tm +(PRGXOH) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 124.7145 644.05133 Tm +(WR) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 130.8445 644.05133 Tm +(LPSURYH) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 151.63449 644.05133 Tm +(WKH) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 160.64949 644.05133 Tm +(V\\VWHP) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 178.58949 644.05133 Tm +(VSHHG) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 194.07449 644.05133 Tm +( EHFDXVH) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 216.2795 644.05133 Tm +(WKH) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 225.29449 644.05133 Tm +(XSORDGLQJ) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 250.40948 644.05133 Tm +(LPDJH) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 266.37448 644.05133 Tm +(KDV) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 275.96448 644.05133 Tm +(PDQ\\) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 290.38449 644.05133 Tm +(JUD\\) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 302.1795 644.05133 Tm +(OHYHOV) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 316.63449 644.05133 Tm +(DQG) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 326.90448 644.05133 Tm +(IDVW) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 336.92947 644.05133 Tm +(VSHHG) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 352.41446 644.05133 Tm +(ZKHQ) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 366.64447 644.05133 Tm +(XVLQJ) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 380.88446 644.05133 Tm +(86%) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 393.17447 644.05133 Tm +(DW) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 399.08447 644.05133 Tm +(WKLV) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 408.96448 644.05133 Tm +(WLPH) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 420.85449 644.05133 Tm +(WKH) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 429.86951 644.05133 Tm +(PRGXOH) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 449.1445 644.05133 Tm +(FDQ) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 458.7395 644.05133 Tm +(EH) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 465.93451 644.05133 Tm +(XVHG) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 478.6145 644.05133 Tm +(IRU) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 486.72449 644.05133 Tm +(ILQJHUSULQWLQJ) Tj +ET +BT +/F8 10 Tf +0 0 0 rg +1 0 0 1 87.8445 620.64685 Tm +(FROOHFWRU ) Tj +ET +BT +/F8 10.5 Tf +0 0 0 rg +1 0 0 1 145.563 620.64685 Tm +() Tj +ET +BT +/F9 11.5 Tf +0 0 0 rg +1 0 0 1 87.84 578.36041 Tm +() Tj +ET +BT +/F9 11.5 Tf +0 0 0 rg +1 0 0 1 107.2635 578.36041 Tm +(SDFNHW) Tj +ET +BT +/F9 11.5 Tf +0 0 0 rg +1 0 0 1 149.3075 578.36041 Tm +(IRUPDW) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 114.84 543.98029 Tm +(7KH) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 124.82999 543.98029 Tm +(PRGXOH) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 144.105 543.98029 Tm +(FRPPXQLFDWHV) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 179.875 543.98029 Tm +(ZLWK) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 191.28999 543.98029 Tm +(WKH) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 200.30499 543.98029 Tm +(KRVW) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 211.92 543.98029 Tm +(FRPSXWHU) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 237.515 543.98029 Tm +(DQG) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 247.785 543.98029 Tm +(WKH) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 256.79999 543.98029 Tm +(UHFHLYLQJ) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 279.48999 543.98029 Tm +(DQG) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 289.75998 543.98029 Tm +(VHQGLQJ) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 309.89499 543.98029 Tm +(RI) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 315.94 543.98029 Tm +(FRPPDQGV) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 344.72 543.98029 Tm +(GDWD) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 356.51001 543.98029 Tm +(DQG) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 366.78 543.98029 Tm +(UHVXOWV) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 383.94 543.98029 Tm +(DUH) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 392.92999 543.98029 Tm +(FDUULHG) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 410.75 543.98029 Tm +(RXW) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 419.97 543.98029 Tm +(LQ) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 425.64999 543.98029 Tm +(WKH) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 434.66498 543.98029 Tm +(IRUP) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 447.44998 543.98029 Tm +(RI) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 453.495 543.98029 Tm +(GDWD) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 465.285 543.98029 Tm +(SDFNHWV) Tj +ET +BT +/F9 9.5 Tf +0 0 0 rg +1 0 0 1 109.02 527.84027 Tm +(3DFNHW) Tj +ET +BT +/F9 9.5 Tf +0 0 0 rg +1 0 0 1 143.7045 527.84027 Tm +(IRUPDW) Tj +ET +BT +/F8 6 Tf +0 0 0 rg +1 0 0 1 113.34 504.50031 Tm +(%DRWRX) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 153.06689 504.50031 Tm +(DGGUHVV) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 172.99689 504.50031 Tm +(FRGH) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 211.57629 504.50031 Tm +(3DFNDJH) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 234.5663 504.50031 Tm +(,') Tj +ET +BT +/F8 4 Tf +0 0 0 rg +1 0 0 1 268.76581 504.50031 Tm +(SDFNDJH) Tj +ET +BT +/F8 4 Tf +0 0 0 rg +1 0 0 1 285.52582 504.50031 Tm +(OHQJWK) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 315.57501 504.50031 Tm +(3DFNDJH) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 336.47501 504.50031 Tm +(FRQWHQW) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 355.81 504.50031 Tm +( FRPPDQG) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 382.91501 504.50031 Tm +(GDWD) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 395.26501 504.50031 Tm +(SDUDPHWHU) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 422.06003 504.50031 Tm +(FRQILUPDWLRQ) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 453.64001 504.50031 Tm +(FRGH ) Tj +ET +BT +/F8 6.5 Tf +0 0 0 rg +1 0 0 1 491.58041 504.50031 Tm +(FKHFNVXP) Tj +ET +BT +/F9 5.5 Tf +0 0 0 rg +1 0 0 1 108.42 485.36029 Tm +(3DFNHW) Tj +ET +BT +/F9 5.5 Tf +0 0 0 rg +1 0 0 1 128.5005 485.36029 Tm +('HWDLOHG) Tj +ET +BT +/F9 5.5 Tf +0 0 0 rg +1 0 0 1 153.047 485.36029 Tm +('HILQLWLRQ) Tj +ET +BT +/F9 5.5 Tf +0 0 0 rg +1 0 0 1 181.97699 485.36029 Tm +(7DEOH) Tj +ET +BT +/F9 10.5 Tf +0 0 0 rg +1 0 0 1 126.78 462.02029 Tm +(QDPH) Tj +ET +BT +/F9 5.5 Tf +0 0 0 rg +1 0 0 1 180.75841 462.02029 Tm +(V\\PERO) Tj +ET +BT +/F9 6 Tf +0 0 0 rg +1 0 0 1 225.7372 462.02029 Tm +(OHQJWK) Tj +ET +BT +/F9 10.5 Tf +0 0 0 rg +1 0 0 1 362.1564 462.02029 Tm +(6D\\) Tj +ET +BT +/F9 4 Tf +0 0 0 rg +1 0 0 1 414.9325 462.02029 Tm +(EULJKW) Tj +ET +BT +/F8 6 Tf +0 0 0 rg +1 0 0 1 126.84 438.32031 Tm +(%DRWRX) Tj +ET +BT +/F8 8.5 Tf +0 0 0 rg +1 0 0 1 178.2038 438.32031 Tm +(67$57) Tj +ET +BT +/F8 8 Tf +0 0 0 rg +1 0 0 1 221.8638 438.32031 Tm +() Tj +ET +BT +/F8 8 Tf +0 0 0 rg +1 0 0 1 228.51981 438.32031 Tm +(E\\WHV) Tj +ET +BT +/F8 6 Tf +0 0 0 rg +1 0 0 1 264.22391 438.32031 Tm +(\)L[HG) Tj +ET +BT +/F8 6 Tf +0 0 0 rg +1 0 0 1 280.69391 438.32031 Tm +(WR) Tj +ET +BT +/F8 6 Tf +0 0 0 rg +1 0 0 1 288.0499 438.32031 Tm +([HI) Tj +ET +BT +/F8 6 Tf +0 0 0 rg +1 0 0 1 310.13589 438.32031 Tm +(WKH) Tj +ET +BT +/F8 6 Tf +0 0 0 rg +1 0 0 1 320.95389 438.32031 Tm +(KLJK) Tj +ET +BT +/F8 6 Tf +0 0 0 rg +1 0 0 1 335.16788 438.32031 Tm +(E\\WH) Tj +ET +BT +/F8 6 Tf +0 0 0 rg +1 0 0 1 349.02786 438.32031 Tm +(LV) Tj +ET +BT +/F8 6 Tf +0 0 0 rg +1 0 0 1 355.00986 438.32031 Tm +(ILUVW) Tj +ET +BT +/F8 6 Tf +0 0 0 rg +1 0 0 1 367.69986 438.32031 Tm +(ZKHQ) Tj +ET +BT +/F8 6 Tf +0 0 0 rg +1 0 0 1 384.77585 438.32031 Tm +(WUDQVPLWWHG) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 264.2403 414.5607 Tm +(7KH) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 275.22931 414.5607 Tm +(GHIDXOW) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 294.9248 414.5607 Tm +(YDOXH) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 310.1543 414.5607 Tm +(LV) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 315.63779 414.5607 Tm +([IIIIIIII) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 339.73328 414.5607 Tm +(DQG) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 351.03027 414.5607 Tm +(WKH) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 360.94678 414.5607 Tm +(XVHU) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 373.78378 414.5607 Tm +(FDQ) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 384.33829 414.5607 Tm +(JHQHUDWH) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 409.1983 414.5607 Tm +(D) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 413.71381 414.5607 Tm +(QHZ) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 425.9678 414.5607 Tm +(DGGUHVV) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 447.89081 414.5607 Tm +(WKURXJK) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 470.4848 414.5607 Tm +(LQVWUXFWLRQV) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 503.9028 414.5607 Tm +(7KH) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 264.2403 398.9577 Tm +(PRGXOH) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 285.44281 398.9577 Tm +(ZLOO) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 295.45282 398.9577 Tm +(UHMHFW) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 311.40283 398.9577 Tm +(SDFNHWV) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 332.59982 398.9577 Tm +(ZLWK) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 345.15631 398.9577 Tm +(LQFRUUHFW) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 369.6423 398.9577 Tm +(DGGUHVVHV) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 398.77582 398.9577 Tm +(+LJK) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 412.48181 398.9577 Tm +(E\\WH) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 425.1868 398.9577 Tm +(ILUVW) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 436.81931 398.9577 Tm +(ZKHQ) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 452.47229 398.9577 Tm +(WUDQVPLWWLQJ) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 121.56 406.76031 Tm +(DGGUHVV) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 141.48999 406.76031 Tm +(FRGH) Tj +ET +BT +/F8 7.5 Tf +0 0 0 rg +1 0 0 1 178.2188 406.76031 Tm +($''\(5) Tj +ET +BT +/F8 8 Tf +0 0 0 rg +1 0 0 1 221.8996 406.76031 Tm +() Tj +ET +BT +/F8 8 Tf +0 0 0 rg +1 0 0 1 228.5556 406.76031 Tm +(E\\WHV) Tj +ET +BT +/F8 10.5 Tf +0 0 0 rg +1 0 0 1 266.28 377.9603 Tm +([) Tj +ET +BT +/F8 8.5 Tf +0 0 0 rg +1 0 0 1 300.21591 377.9603 Tm +(,QGLFDWHV) Tj +ET +BT +/F8 8.5 Tf +0 0 0 rg +1 0 0 1 338.76343 377.9603 Tm +(WKDW) Tj +ET +BT +/F8 8.5 Tf +0 0 0 rg +1 0 0 1 357.13193 377.9603 Tm +(LW) Tj +ET +BT +/F8 8.5 Tf +0 0 0 rg +1 0 0 1 364.60342 377.9603 Tm +(LV) Tj +ET +BT +/F8 8.5 Tf +0 0 0 rg +1 0 0 1 373.07791 377.9603 Tm +(D) Tj +ET +BT +/F8 8.5 Tf +0 0 0 rg +1 0 0 1 380.0564 377.9603 Tm +(&RPPDQG) Tj +ET +BT +/F8 8.5 Tf +0 0 0 rg +1 0 0 1 423.9249 377.9603 Tm +(SDFNHW) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 300.24011 356.90009 Tm +(,QGLFDWHV) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 322.9151 356.90009 Tm +(WKDW) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 333.72009 356.90009 Tm +(LW) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 338.11508 356.90009 Tm +(LV) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 343.10007 356.90009 Tm +(D) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 347.20508 356.90009 Tm +(GDWD) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 358.99509 356.90009 Tm +(SDFNHW) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 375.87009 356.90009 Tm +( 'DWD) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 389.73508 356.90009 Tm +(SDFNHW ) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 409.45007 356.90009 Tm +(DQG) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 419.72006 356.90009 Tm +(WKHUH) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 433.62006 356.90009 Tm +(DUH) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 442.61005 356.90009 Tm +(VXEVHTXHQW) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 471.56503 356.90009 Tm +(SDFNHWV) Tj +ET +BT +/F8 10.5 Tf +0 0 0 rg +1 0 0 1 266.28 340.04031 Tm +([) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 300.24011 338.7803 Tm +(7KH) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 310.2301 338.7803 Tm +(GDWD) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 322.02011 338.7803 Tm +(SDFNHW) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 338.89511 338.7803 Tm +(FDQQRW) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 356.4101 338.7803 Tm +(HQWHU) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 370.31009 338.7803 Tm +(WKH) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 379.32507 338.7803 Tm +(H[HFXWLRQ) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 403.61008 338.7803 Tm +(IORZ) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 414.87509 338.7803 Tm +(DORQH) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 430.5451 338.7803 Tm +(DQG) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 440.81509 338.7803 Tm +(PXVW) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 454.08011 338.7803 Tm +(IROORZ) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 469.6601 338.7803 Tm +(WKH) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 478.67511 338.7803 Tm +(LQVWUXFWLRQ) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 505.3201 338.7803 Tm +(SDFNHW) Tj +ET +BT +/F8 6 Tf +0 0 0 rg +1 0 0 1 300.24011 323.17731 Tm +(RU) Tj +ET +BT +/F8 6 Tf +0 0 0 rg +1 0 0 1 307.90811 323.17731 Tm +(DIWHU) Tj +ET +BT +/F8 6 Tf +0 0 0 rg +1 0 0 1 322.92612 323.17731 Tm +(WKH) Tj +ET +BT +/F8 6 Tf +0 0 0 rg +1 0 0 1 333.74411 323.17731 Tm +(UHSO\\) Tj +ET +BT +/F8 6 Tf +0 0 0 rg +1 0 0 1 349.46411 323.17731 Tm +(SDFNHW) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 121.56 323.36041 Tm +(3DFNDJH) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 144.55 323.36041 Tm +(,') Tj +ET +BT +/F8 10.5 Tf +0 0 0 rg +1 0 0 1 183.4418 323.36041 Tm +(3,') Tj +ET +BT +/F8 9.5 Tf +0 0 0 rg +1 0 0 1 221.894 323.36041 Tm +() Tj +ET +BT +/F8 9.5 Tf +0 0 0 rg +1 0 0 1 229.798 323.36041 Tm +(E\\WH) Tj +ET +BT +/F8 10.5 Tf +0 0 0 rg +1 0 0 1 266.28 304.58044 Tm +([) Tj +ET +BT +/F8 8.5 Tf +0 0 0 rg +1 0 0 1 300.21939 304.58044 Tm +(,QGLFDWHV) Tj +ET +BT +/F8 8.5 Tf +0 0 0 rg +1 0 0 1 338.76691 304.58044 Tm +(WKDW) Tj +ET +BT +/F8 8.5 Tf +0 0 0 rg +1 0 0 1 357.13541 304.58044 Tm +(LW) Tj +ET +BT +/F8 8.5 Tf +0 0 0 rg +1 0 0 1 364.6069 304.58044 Tm +(LV) Tj +ET +BT +/F8 8.5 Tf +0 0 0 rg +1 0 0 1 373.08139 304.58044 Tm +(DQ) Tj +ET +BT +/F8 8.5 Tf +0 0 0 rg +1 0 0 1 385.3129 304.58044 Tm +($&.) Tj +ET +BT +/F8 8.5 Tf +0 0 0 rg +1 0 0 1 403.58789 304.58044 Tm +(SDFNHW) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 431.52191 304.58044 Tm +() Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 434.16193 304.58044 Tm +(WKHUH) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 448.06192 304.58044 Tm +(FDQ) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 457.65692 304.58044 Tm +(EH) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 464.85193 304.58044 Tm +(IROORZ) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 480.74194 304.58044 Tm +(XS) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 488.20694 304.58044 Tm +(SDFNDJHV) Tj +ET +BT +/F8 7 Tf +0 0 0 rg +1 0 0 1 300.2406 283.70093 Tm +(,QGLFDWHV) Tj +ET +BT +/F8 7 Tf +0 0 0 rg +1 0 0 1 331.9856 283.70093 Tm +(WKDW) Tj +ET +BT +/F8 7 Tf +0 0 0 rg +1 0 0 1 347.11261 283.70093 Tm +(LW) Tj +ET +BT +/F8 7 Tf +0 0 0 rg +1 0 0 1 353.26563 283.70093 Tm +(LV) Tj +ET +BT +/F8 7 Tf +0 0 0 rg +1 0 0 1 360.24463 283.70093 Tm +(WKH) Tj +ET +BT +/F8 7 Tf +0 0 0 rg +1 0 0 1 372.86563 283.70093 Tm +(ODVW) Tj +ET +BT +/F8 7 Tf +0 0 0 rg +1 0 0 1 386.29865 283.70093 Tm +(GDWD) Tj +ET +BT +/F8 7 Tf +0 0 0 rg +1 0 0 1 402.80466 283.70093 Tm +(SDFNHW) Tj +ET +BT +/F8 7 Tf +0 0 0 rg +1 0 0 1 428.30566 283.70093 Tm +(WKDW) Tj +ET +BT +/F8 7 Tf +0 0 0 rg +1 0 0 1 443.43268 283.70093 Tm +(LV) Tj +ET +BT +/F8 7 Tf +0 0 0 rg +1 0 0 1 452.28769 283.70093 Tm +(WKH) Tj +ET +BT +/F8 7 Tf +0 0 0 rg +1 0 0 1 464.90869 283.70093 Tm +(HQG) Tj +ET +BT +/F8 7 Tf +0 0 0 rg +1 0 0 1 479.30768 283.70093 Tm +(SDFNHW) Tj +ET +BT +/F8 7 Tf +0 0 0 rg +1 0 0 1 300.2406 268.0979 Tm +( \(QG'DWD) Tj +ET +BT +/F8 7 Tf +0 0 0 rg +1 0 0 1 332.17459 268.0979 Tm +(SDFNHW ) Tj +ET +BT +/F8 10.5 Tf +0 0 0 rg +1 0 0 1 266.28049 275.90039 Tm +([) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 264.23999 245.36041 Tm +(7KH) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 275.229 245.36041 Tm +(PD[LPXP) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 302.89951 245.36041 Tm +(YDOXH) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 318.129 245.36041 Tm +(LV) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 323.61249 245.36041 Tm +() Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 334.4805 245.36041 Tm +(E\\WHV) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 351.29401 245.36041 Tm +(WKH) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 361.21051 245.36041 Tm +(SDFNHW) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 379.77301 245.36041 Tm +(OHQJWK) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 397.89001 245.36041 Tm +(UHIHUV) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 414.59351 245.36041 Tm +(WR) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 421.33652 245.36041 Tm +(WKH) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 431.25302 245.36041 Tm +(OHQJWK) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 449.37003 245.36041 Tm +(RI) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 456.01953 245.36041 Tm +(WKH) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 465.93604 245.36041 Tm +(SDFNHW) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 484.49854 245.36041 Tm +(FRQWHQW) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 264.23999 229.76038 Tm +( FRPPDQG) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 294.05548 229.76038 Tm +(GDWD ) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 308.67447 229.76038 Tm +(SOXV) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 320.93948 229.76038 Tm +(WKH) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 330.85599 229.76038 Tm +(OHQJWK) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 348.97299 229.76038 Tm +(RI) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 355.6225 229.76038 Tm +(WKH) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 365.539 229.76038 Tm +(FKHFNVXP) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 392.86301 229.76038 Tm +( LH) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 401.93802 229.76038 Tm +(WKH) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 411.85452 229.76038 Tm +(OHQJWK) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 429.97153 229.76038 Tm +(RI) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 436.62103 229.76038 Tm +(WKH) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 446.53754 229.76038 Tm +(SDFNHW) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 465.10004 229.76038 Tm +(FRQWHQW) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 486.36853 229.76038 Tm +() Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 490.94452 229.76038 Tm +( ) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 498.64453 229.76038 Tm +(7KH) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 264.23999 214.16028 Tm +(OHQJWK) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 282.35699 214.16028 Tm +(LV) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 287.84048 214.16028 Tm +(LQ) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 294.08847 214.16028 Tm +(E\\WHV) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 310.90198 214.16028 Tm +(ZLWK) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 323.45847 214.16028 Tm +(WKH) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 333.37497 214.16028 Tm +(KLJK) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 346.40448 214.16028 Tm +(E\\WH) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 359.10947 214.16028 Tm +(ILUVW) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 370.74197 214.16028 Tm +(ZKHQ) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 386.39496 214.16028 Tm +(WUDQVPLWWLQJ) Tj +ET +BT +/F8 4 Tf +0 0 0 rg +1 0 0 1 121.56 229.76031 Tm +(SDFNDJH) Tj +ET +BT +/F8 4 Tf +0 0 0 rg +1 0 0 1 138.31999 229.76031 Tm +(OHQJWK) Tj +ET +BT +/F8 7.5 Tf +0 0 0 rg +1 0 0 1 175.56 229.76031 Tm +(/\(1*7+) Tj +ET +BT +/F8 8 Tf +0 0 0 rg +1 0 0 1 221.88 229.76031 Tm +() Tj +ET +BT +/F8 8 Tf +0 0 0 rg +1 0 0 1 228.53601 229.76031 Tm +(E\\WHV) Tj +ET +BT +/F8 6 Tf +0 0 0 rg +1 0 0 1 264.2403 193.58069 Tm +(,W) Tj +ET +BT +/F8 6 Tf +0 0 0 rg +1 0 0 1 270.00031 193.58069 Tm +(FDQ) Tj +ET +BT +/F8 6 Tf +0 0 0 rg +1 0 0 1 281.51431 193.58069 Tm +(EH) Tj +ET +BT +/F8 6 Tf +0 0 0 rg +1 0 0 1 290.14832 193.58069 Tm +(FRPPDQG) Tj +ET +BT +/F8 6 Tf +0 0 0 rg +1 0 0 1 321.8103 193.58069 Tm +(GDWD) Tj +ET +BT +/F8 6 Tf +0 0 0 rg +1 0 0 1 337.56631 193.58069 Tm +(FRPPDQG) Tj +ET +BT +/F8 6 Tf +0 0 0 rg +1 0 0 1 367.6203 193.58069 Tm +(SDUDPHWHU) Tj +ET +BT +/F8 6 Tf +0 0 0 rg +1 0 0 1 400.7103 193.58069 Tm +(UHVSRQVH) Tj +ET +BT +/F8 6 Tf +0 0 0 rg +1 0 0 1 428.2923 193.58069 Tm +(UHVXOW) Tj +ET +BT +/F8 6 Tf +0 0 0 rg +1 0 0 1 447.61829 193.58069 Tm +(HWF) Tj +ET +BT +/F8 6 Tf +0 0 0 rg +1 0 0 1 459.21628 193.58069 Tm +( \)LQJHUSULQW) Tj +ET +BT +/F8 6 Tf +0 0 0 rg +1 0 0 1 494.08829 193.58069 Tm +(IHDWXUH) Tj +ET +BT +/F8 6 Tf +0 0 0 rg +1 0 0 1 264.2403 177.97772 Tm +(YDOXH) Tj +ET +BT +/F8 6 Tf +0 0 0 rg +1 0 0 1 280.85431 177.97772 Tm +(DQG) Tj +ET +BT +/F8 6 Tf +0 0 0 rg +1 0 0 1 293.17831 177.97772 Tm +(ILQJHUSULQW) Tj +ET +BT +/F8 6 Tf +0 0 0 rg +1 0 0 1 325.20032 177.97772 Tm +(WHPSODWH) Tj +ET +BT +/F8 6 Tf +0 0 0 rg +1 0 0 1 352.07431 177.97772 Tm +(DUH) Tj +ET +BT +/F8 6 Tf +0 0 0 rg +1 0 0 1 362.8623 177.97772 Tm +(DOO) Tj +ET +BT +/F8 6 Tf +0 0 0 rg +1 0 0 1 370.88431 177.97772 Tm +(GDWD ) Tj +ET +BT +/F8 4 Tf +0 0 0 rg +1 0 0 1 121.56 185.78027 Tm +(3DFNDJH) Tj +ET +BT +/F8 4 Tf +0 0 0 rg +1 0 0 1 138.28 185.78027 Tm +(&RQWHQWV) Tj +ET +BT +/F8 10.5 Tf +0 0 0 rg +1 0 0 1 180.8049 185.78027 Tm +('$7$) Tj +ET +BT +/F8 10.5 Tf +0 0 0 rg +1 0 0 1 231.05859 185.78027 Tm +() Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 264.2403 159.3808 Tm +($ULWKPHWLF) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 292.5488 159.3808 Tm +(FXPXODWLYH) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 322.36429 159.3808 Tm +(VXP) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 334.97028 159.3808 Tm +(RI) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 341.61978 159.3808 Tm +(DOO) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 348.97327 159.3808 Tm +(E\\WHV) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 364.31277 159.3808 Tm +(RI) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 370.96228 159.3808 Tm +(SDFNHW) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 389.52478 159.3808 Tm +(LGHQWLILFDWLRQ) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 426.30328 159.3808 Tm +(SDFNHW) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 444.86578 159.3808 Tm +(OHQJWK) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 462.98279 159.3808 Tm +(DQG) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 474.27979 159.3808 Tm +(SDFNHW) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 492.84229 159.3808 Tm +(FRQWHQW) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 264.2403 143.77783 Tm +(DQG) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 275.53729 143.77783 Tm +(WKH) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 285.4538 143.77783 Tm +(FDUU\\) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 299.95731 143.77783 Tm +(RYHU) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 312.88229 143.77783 Tm +() Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 317.45828 143.77783 Tm +(E\\WHV) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 332.79779 143.77783 Tm +(LV) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 338.28128 143.77783 Tm +(LJQRUHG) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 361.46927 143.77783 Tm +(+LJK) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 375.17526 143.77783 Tm +(E\\WH) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 387.88025 143.77783 Tm +(ILUVW) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 399.51276 143.77783 Tm +(ZKHQ) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 415.16577 143.77783 Tm +(WUDQVPLWWLQJ) Tj +ET +BT +/F8 6.5 Tf +0 0 0 rg +1 0 0 1 121.56 151.58038 Tm +(FKHFNVXP) Tj +ET +BT +/F8 10.5 Tf +0 0 0 rg +1 0 0 1 183.4418 151.58038 Tm +(680) Tj +ET +BT +/F8 8 Tf +0 0 0 rg +1 0 0 1 221.894 151.58038 Tm +() Tj +ET +BT +/F8 8 Tf +0 0 0 rg +1 0 0 1 228.55 151.58038 Tm +(E\\WHV) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 268.07999 45.86041 Tm +(WKH) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 277.99649 45.86041 Tm +(ILUVW) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 289.629 45.86041 Tm +() Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 297.35101 45.86041 Tm +(SDJHV) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 314.36801 45.86041 Tm +(RI) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 321.01752 45.86041 Tm +() Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 328.7395 45.86041 Tm +(3DJH) Tj +ET + +endstream +endobj +904 0 obj +<< +/Subtype /Type0 +/DescendantFonts [2845 0 R] +/BaseFont /PKKNCM+KaiTi_GB2312 +/ToUnicode 2846 0 R +/Encoding /Identity-H +/Type /Font +>> +endobj +905 0 obj +<< +/Length 2 +>> +stream +q + +endstream +endobj +906 0 obj +<< +/Length 983 +/Filter /FlateDecode +>> +stream +xXkOJ_<)UJVBU +BK%HwqF(3gOv(ܛᗹH&gblM:'O.lQ<_@}(}d d!-&Мs ,B +4[Ӫ( + KTKT=믧A"A6 %TwDU2 +ls笯гu2/fd՗\п[.yoA$c4VB}֯r&$ĐOƹh uqS6In,`&#-nQ8oSW+-5"Xr%K |y,z<_?;̛)u ^E}h%KiSwH9͹~χRQPJ +J7lіnZvb/ i-~fb>$dG2+uBDBYGbZ]\ hpH RN(bOR(F@!vSŕ_Գ MY-f_QMm.nJ"Tx <*4d0:bAAGx4=2DQIAi ܱ=.5DCh{LnDh4<{4:EA ;>hG癦C9|wǟgP4'9Q!w}uM[?sHf!wmƉY#{څDF7f ğgLzducx<dЃjyGDn<En? +#u[ Qyz3S-+Qs r w$tAL0k/{zH HI={$Rݪu" HGkW8tz mh?P +endstream +endobj +907 0 obj +<< +/Length 26469 +>> +stream +Q +1 0 0 1 0 0 cm +BT +/F6 7.5 Tf +0 0 0 rg +1 0 0 1 377.35162 781.10431 Tm +(+DQJ]KRX) Tj +ET +BT +/F6 7.5 Tf +0 0 0 rg +1 0 0 1 415.64661 781.10431 Tm +(=KLDQ) Tj +ET +BT +/F6 7.5 Tf +0 0 0 rg +1 0 0 1 437.2991 781.10431 Tm +(7HFKQRORJ\\) Tj +ET +BT +/F6 7.5 Tf +0 0 0 rg +1 0 0 1 479.96661 781.10431 Tm +(&R) Tj +ET +BT +/F6 7.5 Tf +0 0 0 rg +1 0 0 1 495.21411 781.10431 Tm +(/WG) Tj +ET +BT +/F7 10.5 Tf +0 0 0 rg +1 0 0 1 87.84 748.28027 Tm +() Tj +ET +BT +/F7 10.5 Tf +0 0 0 rg +1 0 0 1 105.57449 748.28027 Tm +(3DFNHW) Tj +ET +BT +/F7 10.5 Tf +0 0 0 rg +1 0 0 1 143.90999 748.28027 Tm +(FKHFN) Tj +ET +BT +/F7 10.5 Tf +0 0 0 rg +1 0 0 1 177.04799 748.28027 Tm +(DQG) Tj +ET +BT +/F7 10.5 Tf +0 0 0 rg +1 0 0 1 199.66499 748.28027 Tm +(UHVSRQVH) Tj +ET +BT +/F6 4 Tf +0 0 0 rg +1 0 0 1 108.84 713.90033 Tm +(,QVWUXFWLRQV) Tj +ET +BT +/F6 4 Tf +0 0 0 rg +1 0 0 1 132.396 713.90033 Tm +(FDQ) Tj +ET +BT +/F6 4 Tf +0 0 0 rg +1 0 0 1 140.07199 713.90033 Tm +(RQO\\) Tj +ET +BT +/F6 4 Tf +0 0 0 rg +1 0 0 1 149.07599 713.90033 Tm +(EH) Tj +ET +BT +/F6 4 Tf +0 0 0 rg +1 0 0 1 154.83199 713.90033 Tm +(JLYHQ) Tj +ET +BT +/F6 4 Tf +0 0 0 rg +1 0 0 1 166.12399 713.90033 Tm +(WR) Tj +ET +BT +/F6 4 Tf +0 0 0 rg +1 0 0 1 171.028 713.90033 Tm +(WKH) Tj +ET +BT +/F6 4 Tf +0 0 0 rg +1 0 0 1 178.24001 713.90033 Tm +(PRGXOH) Tj +ET +BT +/F6 4 Tf +0 0 0 rg +1 0 0 1 193.66 713.90033 Tm +(E\\) Tj +ET +BT +/F6 4 Tf +0 0 0 rg +1 0 0 1 199.2 713.90033 Tm +(WKH) Tj +ET +BT +/F6 4 Tf +0 0 0 rg +1 0 0 1 206.412 713.90033 Tm +(KRVW) Tj +ET +BT +/F6 4 Tf +0 0 0 rg +1 0 0 1 215.70401 713.90033 Tm +(FRPSXWHU) Tj +ET +BT +/F6 4 Tf +0 0 0 rg +1 0 0 1 236.18001 713.90033 Tm +(DQG) Tj +ET +BT +/F6 4 Tf +0 0 0 rg +1 0 0 1 244.39601 713.90033 Tm +(WKH) Tj +ET +BT +/F6 4 Tf +0 0 0 rg +1 0 0 1 251.60802 713.90033 Tm +(PRGXOH) Tj +ET +BT +/F6 4 Tf +0 0 0 rg +1 0 0 1 267.02802 713.90033 Tm +(ZLOO) Tj +ET +BT +/F6 4 Tf +0 0 0 rg +1 0 0 1 274.30801 713.90033 Tm +(UHVSRQG) Tj +ET +BT +/F6 4 Tf +0 0 0 rg +1 0 0 1 290.98401 713.90033 Tm +(WR) Tj +ET +BT +/F6 4 Tf +0 0 0 rg +1 0 0 1 295.888 713.90033 Tm +(WKH) Tj +ET +BT +/F6 4 Tf +0 0 0 rg +1 0 0 1 303.10001 713.90033 Tm +(KRVW) Tj +ET +BT +/F6 4 Tf +0 0 0 rg +1 0 0 1 312.392 713.90033 Tm +(FRPSXWHU) Tj +ET +BT +/F6 4.5 Tf +0 0 0 rg +1 0 0 1 108.84 698.30042 Tm +($IWHU) Tj +ET +BT +/F6 4.5 Tf +0 0 0 rg +1 0 0 1 120.4545 698.30042 Tm +(WKH) Tj +ET +BT +/F6 4.5 Tf +0 0 0 rg +1 0 0 1 128.56799 698.30042 Tm +(PRGXOH) Tj +ET +BT +/F6 4.5 Tf +0 0 0 rg +1 0 0 1 145.9155 698.30042 Tm +(UHFHLYHV) Tj +ET +BT +/F6 4.5 Tf +0 0 0 rg +1 0 0 1 164.3205 698.30042 Tm +(WKH) Tj +ET +BT +/F6 4.5 Tf +0 0 0 rg +1 0 0 1 172.43399 698.30042 Tm +(FRPPDQG) Tj +ET +BT +/F6 4.5 Tf +0 0 0 rg +1 0 0 1 196.1805 698.30042 Tm +(LW) Tj +ET +BT +/F6 4.5 Tf +0 0 0 rg +1 0 0 1 200.136 698.30042 Tm +(ZLOO) Tj +ET +BT +/F6 4.5 Tf +0 0 0 rg +1 0 0 1 208.326 698.30042 Tm +(UHSRUW) Tj +ET +BT +/F6 4.5 Tf +0 0 0 rg +1 0 0 1 222.86551 698.30042 Tm +(WKH) Tj +ET +BT +/F6 4.5 Tf +0 0 0 rg +1 0 0 1 230.979 698.30042 Tm +(H[HFXWLRQ) Tj +ET +BT +/F6 4.5 Tf +0 0 0 rg +1 0 0 1 252.83551 698.30042 Tm +(VWDWXV) Tj +ET +BT +/F6 4.5 Tf +0 0 0 rg +1 0 0 1 266.871 698.30042 Tm +(DQG) Tj +ET +BT +/F6 4.5 Tf +0 0 0 rg +1 0 0 1 276.11401 698.30042 Tm +(UHVXOW) Tj +ET +BT +/F6 4.5 Tf +0 0 0 rg +1 0 0 1 289.40253 698.30042 Tm +(RI) Tj +ET +BT +/F6 4.5 Tf +0 0 0 rg +1 0 0 1 294.84302 698.30042 Tm +(WKH) Tj +ET +BT +/F6 4.5 Tf +0 0 0 rg +1 0 0 1 302.95651 698.30042 Tm +(FRPPDQG) Tj +ET +BT +/F6 4.5 Tf +0 0 0 rg +1 0 0 1 325.49701 698.30042 Tm +(WR) Tj +ET +BT +/F6 4.5 Tf +0 0 0 rg +1 0 0 1 331.01401 698.30042 Tm +(WKH) Tj +ET +BT +/F6 4.5 Tf +0 0 0 rg +1 0 0 1 339.1275 698.30042 Tm +(KRVW) Tj +ET +BT +/F6 4.5 Tf +0 0 0 rg +1 0 0 1 349.58099 698.30042 Tm +(FRPSXWHU) Tj +ET +BT +/F6 4.5 Tf +0 0 0 rg +1 0 0 1 371.41049 698.30042 Tm +(WKURXJK) Tj +ET +BT +/F6 4.5 Tf +0 0 0 rg +1 0 0 1 389.89648 698.30042 Tm +(WKH) Tj +ET +BT +/F6 4.5 Tf +0 0 0 rg +1 0 0 1 398.00998 698.30042 Tm +(UHVSRQVH) Tj +ET +BT +/F6 4.5 Tf +0 0 0 rg +1 0 0 1 418.69647 698.30042 Tm +(SDFNHW) Tj +ET +BT +/F6 4.5 Tf +0 0 0 rg +1 0 0 1 435.08997 698.30042 Tm +(7KH) Tj +ET +BT +/F6 4.5 Tf +0 0 0 rg +1 0 0 1 444.08096 698.30042 Tm +(UHSO\\) Tj +ET +BT +/F6 4.5 Tf +0 0 0 rg +1 0 0 1 455.87097 698.30042 Tm +(FRQWDLQV) Tj +ET +BT +/F6 4.5 Tf +0 0 0 rg +1 0 0 1 474.95096 698.30042 Tm +(SDUDPHWHUV) Tj +ET +BT +/F6 4.5 Tf +0 0 0 rg +1 0 0 1 500.71796 698.30042 Tm +(DQG) Tj +ET +BT +/F6 4.5 Tf +0 0 0 rg +1 0 0 1 509.96097 698.30042 Tm +(FDQ) Tj +ET +BT +/F6 4.5 Tf +0 0 0 rg +1 0 0 1 518.5965 698.30042 Tm +(EH) Tj +ET +BT +/F6 4.5 Tf +0 0 0 rg +1 0 0 1 87.84 682.69739 Tm +(IROORZHG) Tj +ET +BT +/F6 4.5 Tf +0 0 0 rg +1 0 0 1 107.1675 682.69739 Tm +(E\\) Tj +ET +BT +/F6 4.5 Tf +0 0 0 rg +1 0 0 1 113.39999 682.69739 Tm +(VXEVHTXHQW) Tj +ET +BT +/F6 4.5 Tf +0 0 0 rg +1 0 0 1 139.45949 682.69739 Tm +(SDFNHWV) Tj +ET +BT +/F6 4.5 Tf +0 0 0 rg +1 0 0 1 158.00848 682.69739 Tm +(7KH) Tj +ET +BT +/F6 4.5 Tf +0 0 0 rg +1 0 0 1 166.99948 682.69739 Tm +(KRVW) Tj +ET +BT +/F6 4.5 Tf +0 0 0 rg +1 0 0 1 177.45299 682.69739 Tm +(FRPSXWHU) Tj +ET +BT +/F6 4.5 Tf +0 0 0 rg +1 0 0 1 199.28249 682.69739 Tm +(FDQ) Tj +ET +BT +/F6 4.5 Tf +0 0 0 rg +1 0 0 1 207.91798 682.69739 Tm +(RQO\\) Tj +ET +BT +/F6 4.5 Tf +0 0 0 rg +1 0 0 1 218.04749 682.69739 Tm +(FRQILUP) Tj +ET +BT +/F6 4.5 Tf +0 0 0 rg +1 0 0 1 235.65599 682.69739 Tm +(WKH) Tj +ET +BT +/F6 4.5 Tf +0 0 0 rg +1 0 0 1 243.76949 682.69739 Tm +(UHFHLYLQJ) Tj +ET +BT +/F6 4.5 Tf +0 0 0 rg +1 0 0 1 264.19049 682.69739 Tm +(VWDWXV) Tj +ET +BT +/F6 4.5 Tf +0 0 0 rg +1 0 0 1 278.22598 682.69739 Tm +(RI) Tj +ET +BT +/F6 4.5 Tf +0 0 0 rg +1 0 0 1 283.66647 682.69739 Tm +(WKH) Tj +ET +BT +/F6 4.5 Tf +0 0 0 rg +1 0 0 1 291.77997 682.69739 Tm +(PRGXOH) Tj +ET +BT +/F6 4.5 Tf +0 0 0 rg +1 0 0 1 309.12747 682.69739 Tm +(DQG) Tj +ET +BT +/F6 4.5 Tf +0 0 0 rg +1 0 0 1 318.37048 682.69739 Tm +(WKH) Tj +ET +BT +/F6 4.5 Tf +0 0 0 rg +1 0 0 1 326.48398 682.69739 Tm +(FRPPDQG) Tj +ET +BT +/F6 4.5 Tf +0 0 0 rg +1 0 0 1 349.02448 682.69739 Tm +(H[HFXWLRQ) Tj +ET +BT +/F6 4.5 Tf +0 0 0 rg +1 0 0 1 370.88098 682.69739 Tm +(VWDWXV) Tj +ET +BT +/F6 4.5 Tf +0 0 0 rg +1 0 0 1 384.91647 682.69739 Tm +(DIWHU) Tj +ET +BT +/F6 4.5 Tf +0 0 0 rg +1 0 0 1 396.17996 682.69739 Tm +(UHFHLYLQJ) Tj +ET +BT +/F6 4.5 Tf +0 0 0 rg +1 0 0 1 416.60095 682.69739 Tm +(WKH) Tj +ET +BT +/F6 4.5 Tf +0 0 0 rg +1 0 0 1 424.71445 682.69739 Tm +<0050005200470058004F0048000A00560003> Tj +ET +BT +/F6 4.5 Tf +0 0 0 rg +1 0 0 1 445.22995 682.69739 Tm +(UHVSRQVH) Tj +ET +BT +/F6 4.5 Tf +0 0 0 rg +1 0 0 1 465.91644 682.69739 Tm +(SDFNHW) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 108.84 651.50092 Tm +(7KH) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 119.82899 651.50092 Tm +(FRQWHQW) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 141.0975 651.50092 Tm +(RI) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 147.74701 651.50092 Tm +(WKH) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 157.66351 651.50092 Tm +(UHVSRQVH) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 182.94702 651.50092 Tm +(SDFNHW) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 201.50952 651.50092 Tm +(LQFOXGHV) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 224.33452 651.50092 Tm +(D) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 228.85002 651.50092 Tm +(RQH) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 240.44952 651.50092 Tm +(E\\WH) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 253.15453 651.50092 Tm +(FRQILUPDWLRQ) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 287.89252 651.50092 Tm +(FRGH) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 301.77451 651.50092 Tm +( PXVW) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 318.01599 651.50092 Tm +(KDYH ) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 333.4765 651.50092 Tm +(DQG) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 344.7735 651.50092 Tm +(SRVVLEOH) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 367.505 651.50092 Tm +(UHWXUQ) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 385.36349 651.50092 Tm +(SDUDPHWHUV) Tj +ET +BT +/F7 4 Tf +0 0 0 rg +1 0 0 1 108.4798 604.70142 Tm +(&RQILUPDWLRQ) Tj +ET +BT +/F7 4 Tf +0 0 0 rg +1 0 0 1 136.15979 604.70142 Tm +(FRGH) Tj +ET +BT +/F7 4 Tf +0 0 0 rg +1 0 0 1 146.62779 604.70142 Tm +(GHILQLWLRQ) Tj +ET +BT +/F7 4 Tf +0 0 0 rg +1 0 0 1 167.23979 604.70142 Tm +(WDEOH) Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 129.84 589.1015 Tm +() Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 136.44 589.1015 Tm +([) Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 153.078 589.1015 Tm +(,QGLFDWHV) Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 180.28799 589.1015 Tm +(WKDW) Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 193.254 589.1015 Tm +(WKH) Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 204.07199 589.1015 Tm +(LQVWUXFWLRQ) Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 236.04599 589.1015 Tm +(LV) Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 242.02798 589.1015 Tm +(H[HFXWHG) Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 269.35797 589.1015 Tm +(RU) Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 277.02597 589.1015 Tm +(2.) Tj +ET +BT +/F6 7 Tf +0 0 0 rg +1 0 0 1 129.84 573.50159 Tm +() Tj +ET +BT +/F6 7 Tf +0 0 0 rg +1 0 0 1 137.53999 573.50159 Tm +([) Tj +ET +BT +/F6 7 Tf +0 0 0 rg +1 0 0 1 156.95099 573.50159 Tm +(,QGLFDWHV) Tj +ET +BT +/F6 7 Tf +0 0 0 rg +1 0 0 1 188.69598 573.50159 Tm +(GDWD) Tj +ET +BT +/F6 7 Tf +0 0 0 rg +1 0 0 1 205.20198 573.50159 Tm +(SDFNHW) Tj +ET +BT +/F6 7 Tf +0 0 0 rg +1 0 0 1 228.82698 573.50159 Tm +(UHFHLYLQJ) Tj +ET +BT +/F6 7 Tf +0 0 0 rg +1 0 0 1 260.59299 573.50159 Tm +(HUURU) Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 129.84 557.90179 Tm +() Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 136.44 557.90179 Tm +([) Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 153.078 557.90179 Tm +(,QGLFDWHV) Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 180.28799 557.90179 Tm +(WKDW) Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 193.254 557.90179 Tm +(WKHUH) Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 209.93399 557.90179 Tm +(LV) Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 215.91599 557.90179 Tm +(QR) Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 224.81398 557.90179 Tm +(ILQJHU) Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 243.24597 557.90179 Tm +(RQ) Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 252.14397 557.90179 Tm +(WKH) Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 262.96198 557.90179 Tm +(VHQVRU) Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 129.84 542.302 Tm +() Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 136.44 542.302 Tm +([) Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 153.078 542.302 Tm +(,QGLFDWHV) Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 180.28799 542.302 Tm +(WKDW) Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 193.254 542.302 Tm +(WKH) Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 204.07199 542.302 Tm +(ILQJHUSULQW) Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 236.09399 542.302 Tm +(LPDJH) Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 255.252 542.302 Tm +(HQWU\\) Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 271.608 542.302 Tm +(IDLOHG) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 129.84 526.70209 Tm +() Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 135.89 526.70209 Tm +([) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 151.14149 526.70209 Tm +(,QGLFDWHV) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 176.084 526.70209 Tm +(WKDW) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 187.9695 526.70209 Tm +(WKH) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 197.886 526.70209 Tm +(ILQJHUSULQW) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 227.2395 526.70209 Tm +(LPDJH) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 244.80099 526.70209 Tm +(LV) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 250.2845 526.70209 Tm +(WRR) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 260.35501 526.70209 Tm +(PHVV\\) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 278.10352 526.70209 Tm +(WR) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 284.84653 526.70209 Tm +(JHQHUDWH) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 309.70654 526.70209 Tm +(IHDWXUHV) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 129.84 511.1022 Tm +() Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 135.89 511.1022 Tm +([) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 151.14149 511.1022 Tm +(,QGLFDWHV) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 176.084 511.1022 Tm +(WKDW) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 187.9695 511.1022 Tm +(WKH) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 197.886 511.1022 Tm +(ILQJHUSULQW) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 227.2395 511.1022 Tm +(LPDJH) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 244.80099 511.1022 Tm +(LV) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 250.2845 511.1022 Tm +(QRUPDO) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 271.8335 511.1022 Tm +(EXW) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 282.03049 511.1022 Tm +(WKH) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 291.94699 511.1022 Tm +(IHDWXUH) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 312.21448 511.1022 Tm +(SRLQWV) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 329.79248 511.1022 Tm +(DUH) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 339.68149 511.1022 Tm +(WRR) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 349.75198 511.1022 Tm +(IHZ) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 360.49899 511.1022 Tm +( RU) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 369.17798 511.1022 Tm +(WKH) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 379.09448 511.1022 Tm +(DUHD) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 392.06897 511.1022 Tm +(LV) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 397.55246 511.1022 Tm +(WRR) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 407.62296 511.1022 Tm +(VPDOO ) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 424.40344 511.1022 Tm +(WR) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 431.14645 511.1022 Tm +(JHQHUDWH) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 456.00647 511.1022 Tm +(IHDWXUHV) Tj +ET +BT +/F6 5 Tf +0 0 0 rg +1 0 0 1 129.84 495.50241 Tm +() Tj +ET +BT +/F6 5 Tf +0 0 0 rg +1 0 0 1 135.34 495.50241 Tm +([) Tj +ET +BT +/F6 5 Tf +0 0 0 rg +1 0 0 1 149.205 495.50241 Tm +(,QGLFDWHV) Tj +ET +BT +/F6 5 Tf +0 0 0 rg +1 0 0 1 171.88 495.50241 Tm +(WKDW) Tj +ET +BT +/F6 5 Tf +0 0 0 rg +1 0 0 1 182.685 495.50241 Tm +(WKH) Tj +ET +BT +/F6 5 Tf +0 0 0 rg +1 0 0 1 191.7 495.50241 Tm +(ILQJHUSULQWV) Tj +ET +BT +/F6 5 Tf +0 0 0 rg +1 0 0 1 220.78 495.50241 Tm +(GR) Tj +ET +BT +/F6 5 Tf +0 0 0 rg +1 0 0 1 228.17999 495.50241 Tm +(QRW) Tj +ET +BT +/F6 5 Tf +0 0 0 rg +1 0 0 1 237.39999 495.50241 Tm +(PDWFK) Tj +ET +BT +/F6 6.5 Tf +0 0 0 rg +1 0 0 1 129.84 479.90259 Tm +() Tj +ET +BT +/F6 6.5 Tf +0 0 0 rg +1 0 0 1 136.98999 479.90259 Tm +([) Tj +ET +BT +/F6 6.5 Tf +0 0 0 rg +1 0 0 1 155.0145 479.90259 Tm +(,QGLFDWHV) Tj +ET +BT +/F6 6.5 Tf +0 0 0 rg +1 0 0 1 184.49199 479.90259 Tm +(WKDW) Tj +ET +BT +/F6 6.5 Tf +0 0 0 rg +1 0 0 1 198.53848 479.90259 Tm +(QR) Tj +ET +BT +/F6 6.5 Tf +0 0 0 rg +1 0 0 1 208.17798 479.90259 Tm +(ILQJHUSULQW) Tj +ET +BT +/F6 6.5 Tf +0 0 0 rg +1 0 0 1 242.86847 479.90259 Tm +(LV) Tj +ET +BT +/F6 6.5 Tf +0 0 0 rg +1 0 0 1 249.34897 479.90259 Tm +(IRXQG) Tj +ET +BT +/F6 6.5 Tf +0 0 0 rg +1 0 0 1 129.84 464.3027 Tm +() Tj +ET +BT +/F6 6.5 Tf +0 0 0 rg +1 0 0 1 136.98999 464.3027 Tm +([D) Tj +ET +BT +/F6 6.5 Tf +0 0 0 rg +1 0 0 1 154.94299 464.3027 Tm +(,QGLFDWHV) Tj +ET +BT +/F6 6.5 Tf +0 0 0 rg +1 0 0 1 184.42049 464.3027 Tm +(WKDW) Tj +ET +BT +/F6 6.5 Tf +0 0 0 rg +1 0 0 1 198.46698 464.3027 Tm +(IHDWXUH) Tj +ET +BT +/F6 6.5 Tf +0 0 0 rg +1 0 0 1 222.41948 464.3027 Tm +(PHUJLQJ) Tj +ET +BT +/F6 6.5 Tf +0 0 0 rg +1 0 0 1 250.22647 464.3027 Tm +(IDLOHG) Tj +ET +BT +/F6 4 Tf +0 0 0 rg +1 0 0 1 129.84 448.70291 Tm +() Tj +ET +BT +/F6 4 Tf +0 0 0 rg +1 0 0 1 136.528 448.70291 Tm +([E) Tj +ET +BT +/F6 4 Tf +0 0 0 rg +1 0 0 1 147.79199 448.70291 Tm +(,QGLFDWHV) Tj +ET +BT +/F6 4 Tf +0 0 0 rg +1 0 0 1 165.93199 448.70291 Tm +(WKDW) Tj +ET +BT +/F6 4 Tf +0 0 0 rg +1 0 0 1 174.57599 448.70291 Tm +(WKH) Tj +ET +BT +/F6 4 Tf +0 0 0 rg +1 0 0 1 181.78799 448.70291 Tm +(DGGUHVV) Tj +ET +BT +/F6 4 Tf +0 0 0 rg +1 0 0 1 197.73199 448.70291 Tm +(VHULDO) Tj +ET +BT +/F6 4 Tf +0 0 0 rg +1 0 0 1 208.90399 448.70291 Tm +(QXPEHU) Tj +ET +BT +/F6 4 Tf +0 0 0 rg +1 0 0 1 224.99599 448.70291 Tm +(H[FHHGV) Tj +ET +BT +/F6 4 Tf +0 0 0 rg +1 0 0 1 241.21599 448.70291 Tm +(WKH) Tj +ET +BT +/F6 4 Tf +0 0 0 rg +1 0 0 1 248.42799 448.70291 Tm +(UDQJH) Tj +ET +BT +/F6 4 Tf +0 0 0 rg +1 0 0 1 260.552 448.70291 Tm +(RI) Tj +ET +BT +/F6 4 Tf +0 0 0 rg +1 0 0 1 265.388 448.70291 Tm +(WKH) Tj +ET +BT +/F6 4 Tf +0 0 0 rg +1 0 0 1 272.60001 448.70291 Tm +(ILQJHUSULQW) Tj +ET +BT +/F6 4 Tf +0 0 0 rg +1 0 0 1 293.948 448.70291 Tm +(GDWDEDVH) Tj +ET +BT +/F6 4 Tf +0 0 0 rg +1 0 0 1 312.25601 448.70291 Tm +(ZKHQ) Tj +ET +BT +/F6 4 Tf +0 0 0 rg +1 0 0 1 323.64001 448.70291 Tm +(DFFHVVLQJ) Tj +ET +BT +/F6 4 Tf +0 0 0 rg +1 0 0 1 342.81601 448.70291 Tm +(WKH) Tj +ET +BT +/F6 4 Tf +0 0 0 rg +1 0 0 1 350.02802 448.70291 Tm +(ILQJHUSULQW) Tj +ET +BT +/F6 4 Tf +0 0 0 rg +1 0 0 1 371.37601 448.70291 Tm +(GDWDEDVH) Tj +ET +BT +/F6 4 Tf +0 0 0 rg +1 0 0 1 129.84 433.103 Tm +() Tj +ET +BT +/F6 4 Tf +0 0 0 rg +1 0 0 1 136.528 433.103 Tm +([F) Tj +ET +BT +/F6 4 Tf +0 0 0 rg +1 0 0 1 147.252 433.103 Tm +(,QGLFDWHV) Tj +ET +BT +/F6 4 Tf +0 0 0 rg +1 0 0 1 165.392 433.103 Tm +(WKDW) Tj +ET +BT +/F6 4 Tf +0 0 0 rg +1 0 0 1 174.036 433.103 Tm +(WKHUH) Tj +ET +BT +/F6 4 Tf +0 0 0 rg +1 0 0 1 185.15599 433.103 Tm +(LV) Tj +ET +BT +/F6 4 Tf +0 0 0 rg +1 0 0 1 189.144 433.103 Tm +(DQ) Tj +ET +BT +/F6 4 Tf +0 0 0 rg +1 0 0 1 194.89999 433.103 Tm +(HUURU) Tj +ET +BT +/F6 4 Tf +0 0 0 rg +1 0 0 1 205.57199 433.103 Tm +(RU) Tj +ET +BT +/F6 4 Tf +0 0 0 rg +1 0 0 1 210.68399 433.103 Tm +(LQYDOLGLW\\) Tj +ET +BT +/F6 4 Tf +0 0 0 rg +1 0 0 1 228.54399 433.103 Tm +(LQ) Tj +ET +BT +/F6 4 Tf +0 0 0 rg +1 0 0 1 233.088 433.103 Tm +(UHDGLQJ) Tj +ET +BT +/F6 4 Tf +0 0 0 rg +1 0 0 1 248.70399 433.103 Tm +(WKH) Tj +ET +BT +/F6 4 Tf +0 0 0 rg +1 0 0 1 255.916 433.103 Tm +(WHPSODWH) Tj +ET +BT +/F6 4 Tf +0 0 0 rg +1 0 0 1 273.832 433.103 Tm +(IURP) Tj +ET +BT +/F6 4 Tf +0 0 0 rg +1 0 0 1 284.06 433.103 Tm +(WKH) Tj +ET +BT +/F6 4 Tf +0 0 0 rg +1 0 0 1 291.272 433.103 Tm +(ILQJHUSULQW) Tj +ET +BT +/F6 4 Tf +0 0 0 rg +1 0 0 1 312.62 433.103 Tm +(OLEUDU\\) Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 129.84 417.50311 Tm +() Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 139.87199 417.50311 Tm +([G) Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 156.76799 417.50311 Tm +(,QGLFDWHV) Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 183.978 417.50311 Tm +(WKDW) Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 196.944 417.50311 Tm +(XSORDGLQJ) Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 227.082 417.50311 Tm +(IHDWXUHV) Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 252.06601 417.50311 Tm +(IDLOHG) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 129.84 401.90329 Tm +() Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 139.036 401.90329 Tm +([H) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 154.2435 401.90329 Tm +(,QGLFDWHV) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 179.186 401.90329 Tm +(WKDW) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 191.0715 401.90329 Tm +(WKH) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 200.98801 401.90329 Tm +(PRGXOH) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 222.19051 401.90329 Tm +(FDQQRW) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 241.457 401.90329 Tm +(DFFHSW) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 259.7225 401.90329 Tm +(VXEVHTXHQW) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 291.573 401.90329 Tm +(GDWD) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 304.54199 401.90329 Tm +(SDFNHWV) Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 129.84 386.3035 Tm +() Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 139.87199 386.3035 Tm +([I) Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 155.142 386.3035 Tm +(,QGLFDWHV) Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 182.35199 386.3035 Tm +(WKDW) Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 195.31799 386.3035 Tm +(XSORDGLQJ) Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 225.45599 386.3035 Tm +(WKH) Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 236.27399 386.3035 Tm +(LPDJH) Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 255.43199 386.3035 Tm +(IDLOHG) Tj +ET +BT +/F6 5 Tf +0 0 0 rg +1 0 0 1 129.84 370.70361 Tm +() Tj +ET +BT +/F6 5 Tf +0 0 0 rg +1 0 0 1 138.2 370.70361 Tm +([) Tj +ET +BT +/F6 5 Tf +0 0 0 rg +1 0 0 1 152.065 370.70361 Tm +(,QGLFDWHV) Tj +ET +BT +/F6 5 Tf +0 0 0 rg +1 0 0 1 174.74001 370.70361 Tm +(WKDW) Tj +ET +BT +/F6 5 Tf +0 0 0 rg +1 0 0 1 185.54501 370.70361 Tm +(WKH) Tj +ET +BT +/F6 5 Tf +0 0 0 rg +1 0 0 1 194.56001 370.70361 Tm +(GHOHWLRQ) Tj +ET +BT +/F6 5 Tf +0 0 0 rg +1 0 0 1 215.07501 370.70361 Tm +(RI) Tj +ET +BT +/F6 5 Tf +0 0 0 rg +1 0 0 1 221.12001 370.70361 Tm +(WKH) Tj +ET +BT +/F6 5 Tf +0 0 0 rg +1 0 0 1 230.13501 370.70361 Tm +(WHPSODWH) Tj +ET +BT +/F6 5 Tf +0 0 0 rg +1 0 0 1 252.53001 370.70361 Tm +(IDLOHG) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 129.84 355.1037 Tm +() Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 139.036 355.1037 Tm +([) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 154.28749 355.1037 Tm +(,QGLFDWHV) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 179.23 355.1037 Tm +(IDLOXUH) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 197.248 355.1037 Tm +(WR) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 203.991 355.1037 Tm +(FOHDU) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 217.939 355.1037 Tm +(WKH) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 227.8555 355.1037 Tm +(ILQJHUSULQW) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 257.20898 355.1037 Tm +(GDWDEDVH) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 129.84 339.50391 Tm +() Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 139.036 339.50391 Tm +([) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 154.28749 339.50391 Tm +(,QGLFDWHV) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 179.23 339.50391 Tm +(WKDW) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 191.11549 339.50391 Tm +(WKH) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 201.032 339.50391 Tm +(SDVVZRUG) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 227.50349 339.50391 Tm +(LV) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 232.987 339.50391 Tm +(LQFRUUHFW) Tj +ET +BT +/F6 5 Tf +0 0 0 rg +1 0 0 1 129.84 323.90411 Tm +() Tj +ET +BT +/F6 5 Tf +0 0 0 rg +1 0 0 1 138.2 323.90411 Tm +([) Tj +ET +BT +/F6 5 Tf +0 0 0 rg +1 0 0 1 152.065 323.90411 Tm +(,QGLFDWHV) Tj +ET +BT +/F6 5 Tf +0 0 0 rg +1 0 0 1 174.74001 323.90411 Tm +(WKDW) Tj +ET +BT +/F6 5 Tf +0 0 0 rg +1 0 0 1 185.54501 323.90411 Tm +(WKHUH) Tj +ET +BT +/F6 5 Tf +0 0 0 rg +1 0 0 1 199.44501 323.90411 Tm +(LV) Tj +ET +BT +/F6 5 Tf +0 0 0 rg +1 0 0 1 204.43001 323.90411 Tm +(QR) Tj +ET +BT +/F6 5 Tf +0 0 0 rg +1 0 0 1 211.845 323.90411 Tm +(YDOLG) Tj +ET +BT +/F6 5 Tf +0 0 0 rg +1 0 0 1 224.145 323.90411 Tm +(RULJLQDO) Tj +ET +BT +/F6 5 Tf +0 0 0 rg +1 0 0 1 243.375 323.90411 Tm +(LPDJH) Tj +ET +BT +/F6 5 Tf +0 0 0 rg +1 0 0 1 259.34 323.90411 Tm +(LQ) Tj +ET +BT +/F6 5 Tf +0 0 0 rg +1 0 0 1 265.01999 323.90411 Tm +(WKH) Tj +ET +BT +/F6 5 Tf +0 0 0 rg +1 0 0 1 274.03497 323.90411 Tm +(EXIIHU) Tj +ET +BT +/F6 5 Tf +0 0 0 rg +1 0 0 1 289.82498 323.90411 Tm +(DQG) Tj +ET +BT +/F6 5 Tf +0 0 0 rg +1 0 0 1 300.09497 323.90411 Tm +(WKH) Tj +ET +BT +/F6 5 Tf +0 0 0 rg +1 0 0 1 309.10999 323.90411 Tm +(LPDJH) Tj +ET +BT +/F6 5 Tf +0 0 0 rg +1 0 0 1 325.07498 323.90411 Tm +(FDQQRW) Tj +ET +BT +/F6 5 Tf +0 0 0 rg +1 0 0 1 342.58997 323.90411 Tm +(EH) Tj +ET +BT +/F6 5 Tf +0 0 0 rg +1 0 0 1 349.78497 323.90411 Tm +(JHQHUDWHG) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 129.84 308.3042 Tm +() Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 139.036 308.3042 Tm +([) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 154.28749 308.3042 Tm +(,QGLFDWHV) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 179.23 308.3042 Tm +(DQ) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 187.1445 308.3042 Tm +(HUURU) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 201.8185 308.3042 Tm +(LQ) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 208.0665 308.3042 Tm +(UHDGLQJ) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 229.5385 308.3042 Tm +(DQG) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 240.83549 308.3042 Tm +(ZULWLQJ) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 260.465 308.3042 Tm +(\)/$6+) Tj +ET +BT +/F6 7.5 Tf +0 0 0 rg +1 0 0 1 129.84 292.70435 Tm +() Tj +ET +BT +/F6 7.5 Tf +0 0 0 rg +1 0 0 1 142.37999 292.70435 Tm +([D) Tj +ET +BT +/F6 7.5 Tf +0 0 0 rg +1 0 0 1 163.09499 292.70435 Tm +(LQYDOLG) Tj +ET +BT +/F6 7.5 Tf +0 0 0 rg +1 0 0 1 188.11499 292.70435 Tm +(UHJLVWHU) Tj +ET +BT +/F6 7.5 Tf +0 0 0 rg +1 0 0 1 217.56749 292.70435 Tm +(QXPEHU) Tj +ET +BT +/F6 8 Tf +0 0 0 rg +1 0 0 1 129.84 277.10449 Tm +() Tj +ET +BT +/F6 8 Tf +0 0 0 rg +1 0 0 1 143.216 277.10449 Tm +([) Tj +ET +BT +/F6 8 Tf +0 0 0 rg +1 0 0 1 165.40001 277.10449 Tm +(DGGUHVV) Tj +ET +BT +/F6 8 Tf +0 0 0 rg +1 0 0 1 197.28801 277.10449 Tm +(FRGH) Tj +ET +BT +/F6 8 Tf +0 0 0 rg +1 0 0 1 217.48001 277.10449 Tm +(HUURU) Tj +ET +BT +/F6 6.5 Tf +0 0 0 rg +1 0 0 1 129.84 261.5047 Tm +() Tj +ET +BT +/F6 6.5 Tf +0 0 0 rg +1 0 0 1 140.70799 261.5047 Tm +([) Tj +ET +BT +/F6 6.5 Tf +0 0 0 rg +1 0 0 1 158.7325 261.5047 Tm +(7KH) Tj +ET +BT +/F6 6.5 Tf +0 0 0 rg +1 0 0 1 171.7195 261.5047 Tm +(SDVVZRUG) Tj +ET +BT +/F6 6.5 Tf +0 0 0 rg +1 0 0 1 203.004 261.5047 Tm +(PXVW) Tj +ET +BT +/F6 6.5 Tf +0 0 0 rg +1 0 0 1 220.2485 261.5047 Tm +(EH) Tj +ET +BT +/F6 6.5 Tf +0 0 0 rg +1 0 0 1 229.60201 261.5047 Tm +(YHULILHG) Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 129.84 245.90479 Tm +() Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 139.87199 245.90479 Tm +(2WKHUV) Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 162.336 245.90479 Tm +(UHVHUYHG) Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 188.616 245.90479 Tm +(E\\) Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 196.92599 245.90479 Tm +(WKH) Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 207.74399 245.90479 Tm +(V\\VWHP) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 267.95999 45.86041 Tm +(WKH) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 277.8765 45.86041 Tm +(ILUVW) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 289.509 45.86041 Tm +() Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 297.23102 45.86041 Tm +(SDJHV) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 314.24802 45.86041 Tm +(RI) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 320.89752 45.86041 Tm +() Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 328.61951 45.86041 Tm +(3DJH) Tj +ET + +endstream +endobj +908 0 obj +<< +/Length 2 +>> +stream +q + +endstream +endobj +909 0 obj +<< +/Length 2141 +/Filter /FlateDecode +>> +stream +xZYD~?)B"@1oQA@R_OUg\e#v3r}}_WO޼~xxyWwBZ~|݇>~'O>)(1*i'YĜs+tNݩ۟xyFZV(gT I 9MV^ܿN߽W &-hO|VBII^:_'࿿)6lDLZ:\}QTE8VTt't{W2Eclr`+iۺk%}?xI9O<+? 1I8w0H4tZYb.Dz*HmE#}3!X8/SPt_eFeKzyږvwOq0x?O_+ʺ,nAߍX?i6DAԖz>P|Bq +-VZJV!;ÅWH!.qҤy+5c :^njŅ׵,ѥm R:`삐 ) v1l.Sbe6$SH|PWC[-9Er[÷a!)NeB̼v%/!ilV{ +mZ^wh1{Trb1_-/l6kf^#AT[8Yh3EcH%SyxKgX2CNRs45X + +Ӻ>Ape#'07f}cxfL]9 O}0&2ˀzTS~-rHJC+hO!TvN!NjInj::ñRd:qCRXh43U d+(0&Pѥfflr K6DZ|#$L@*҈K?$P bPũ.!e-@(YJփРD=0(z=LVeҨu* Qc->036gC 2;取i2;VAS`7ӱOu,D,q +9q+]>zdѺ(Mj i)Y<%MzJ^ɓL΅Щ]07 g6 6 6 !irG.l< +xpJ +汤,)>K Ӓ+hΰVn`c0*iᖍQ@6u.|󐎋OVE ge5)FkV(``+][4 Fk6FˆlT,1(^Hw{4֠e-aoǞϏ¬ϘD.qY?֋.FK gia#⌰iZI +-!'omqK4`7tDsvK={l^!B~9mbL.g=@iZCa5HhaZU][;ikX˼ׄ -ss442}y F/.A`hٶ  tuEȘ*L.UbbtkSmǨ*J(31Čcm&NF6Z(KHJU +|оX c/ +endstream +endobj +910 0 obj +<< +/Length 24128 +>> +stream +Q +1 0 0 1 0 0 cm +BT +/F8 7.5 Tf +0 0 0 rg +1 0 0 1 377.35162 781.10431 Tm +(+DQJ]KRX) Tj +ET +BT +/F8 7.5 Tf +0 0 0 rg +1 0 0 1 415.64661 781.10431 Tm +(=KLDQ) Tj +ET +BT +/F8 7.5 Tf +0 0 0 rg +1 0 0 1 437.2991 781.10431 Tm +(7HFKQRORJ\\) Tj +ET +BT +/F8 7.5 Tf +0 0 0 rg +1 0 0 1 479.96661 781.10431 Tm +(&R) Tj +ET +BT +/F8 7.5 Tf +0 0 0 rg +1 0 0 1 495.21411 781.10431 Tm +(/WG) Tj +ET +BT +/F9 13 Tf +0 0 0 rg +1 0 0 1 182.16 736.88031 Tm +(&KDSWHU) Tj +ET +BT +/F9 13 Tf +0 0 0 rg +1 0 0 1 237.67 736.88031 Tm +() Tj +ET +BT +/F9 13 Tf +0 0 0 rg +1 0 0 1 248.48599 736.88031 Tm +(0RGXOH) Tj +ET +BT +/F9 13 Tf +0 0 0 rg +1 0 0 1 300.59 736.88031 Tm +(&RPPDQG) Tj +ET +BT +/F9 13 Tf +0 0 0 rg +1 0 0 1 370.452 736.88031 Tm +(6\\VWHP) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 108.84 694.76031 Tm +(=\)0) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 127.45999 694.76031 Tm +(VHULHV) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 142.545 694.76031 Tm +(PRGXOHV) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 164.215 694.76031 Tm +(KDYH) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 176.76999 694.76031 Tm +(D) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 180.87498 694.76031 Tm +(WRWDO) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 192.90498 694.76031 Tm +(RI) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 198.94998 694.76031 Tm +() Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 205.96999 694.76031 Tm +(LQVWUXFWLRQV) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 236.34999 694.76031 Tm +(7KH) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 246.34 694.76031 Tm +(DSSOLFDWLRQ) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 273.59 694.76031 Tm +(SURJUDP) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 295.67499 694.76031 Tm +(UHDOL]HV) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 314.81 694.76031 Tm +(YDULRXV) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 333.32001 694.76031 Tm +(ILQJHUSULQW) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 360.005 694.76031 Tm +(UHFRJQLWLRQ) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 388.28 694.76031 Tm +(IXQFWLRQV) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 411.48499 694.76031 Tm +(WKURXJK) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 432.02499 694.76031 Tm +(GLIIHUHQW) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 453.72998 694.76031 Tm +(FRPELQDWLRQV) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 486.995 694.76031 Tm +(RI) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 493.04001 694.76031 Tm +(LQVWUXFWLRQV) Tj +ET +BT +/F8 7 Tf +0 0 0 rg +1 0 0 1 108.84 671.35999 Tm +($OO) Tj +ET +BT +/F8 7 Tf +0 0 0 rg +1 0 0 1 118.745 671.35999 Tm +(FRPPDQG) Tj +ET +BT +/F8 7 Tf +0 0 0 rg +1 0 0 1 154.592 671.35999 Tm +(GDWD) Tj +ET +BT +/F8 7 Tf +0 0 0 rg +1 0 0 1 171.09799 671.35999 Tm +(WUDQVIHUV) Tj +ET +BT +/F8 7 Tf +0 0 0 rg +1 0 0 1 202.54199 671.35999 Tm +(DUH) Tj +ET +BT +/F8 7 Tf +0 0 0 rg +1 0 0 1 215.12799 671.35999 Tm +(GHOLYHUHG) Tj +ET +BT +/F8 7 Tf +0 0 0 rg +1 0 0 1 247.461 671.35999 Tm +(LQ) Tj +ET +BT +/F8 7 Tf +0 0 0 rg +1 0 0 1 255.41299 671.35999 Tm +(SDFNHWV) Tj +ET +BT +/F8 7 Tf +0 0 0 rg +1 0 0 1 284.267 671.35999 Tm +(\)RU) Tj +ET +BT +/F8 7 Tf +0 0 0 rg +1 0 0 1 296.84601 671.35999 Tm +(SDFNDJH) Tj +ET +BT +/F8 7 Tf +0 0 0 rg +1 0 0 1 326.17599 671.35999 Tm +(IRUPDWV) Tj +ET +BT +/F8 7 Tf +0 0 0 rg +1 0 0 1 353.88199 671.35999 Tm +(DQG) Tj +ET +BT +/F8 7 Tf +0 0 0 rg +1 0 0 1 368.25998 671.35999 Tm +(GHILQLWLRQV) Tj +ET +BT +/F8 7 Tf +0 0 0 rg +1 0 0 1 404.92596 671.35999 Tm +(VHH) Tj +ET +BT +/F8 7 Tf +0 0 0 rg +1 0 0 1 416.17496 671.35999 Tm +() Tj +ET +BT +/F8 7 Tf +0 0 0 rg +1 0 0 1 427.87897 671.35999 Tm +(SDFNHW) Tj +ET +BT +/F8 7 Tf +0 0 0 rg +1 0 0 1 451.50397 671.35999 Tm +(IRUPDW) Tj +ET +BT +/F9 9.5 Tf +0 0 0 rg +1 0 0 1 87.84 632.96033 Tm +() Tj +ET +BT +/F9 9.5 Tf +0 0 0 rg +1 0 0 1 103.8855 632.96033 Tm +(V\\VWHP) Tj +ET +BT +/F9 9.5 Tf +0 0 0 rg +1 0 0 1 140.27049 632.96033 Tm +(FRPPDQG) Tj +ET +BT +/F9 6.5 Tf +0 0 0 rg +1 0 0 1 87.84 597.02032 Tm +() Tj +ET +BT +/F9 6.5 Tf +0 0 0 rg +1 0 0 1 91.558 597.02032 Tm +( ) Tj +ET +BT +/F9 6.5 Tf +0 0 0 rg +1 0 0 1 95.4515 597.02032 Tm +(WR) Tj +ET +BT +/F9 6.5 Tf +0 0 0 rg +1 0 0 1 103.986 597.02032 Tm +(YHULI\\) Tj +ET +BT +/F9 6.5 Tf +0 0 0 rg +1 0 0 1 124.3635 597.02032 Tm +(WKH) Tj +ET +BT +/F9 6.5 Tf +0 0 0 rg +1 0 0 1 136.9865 597.02032 Tm +(SDVVZRUG) Tj +ET +BT +/F9 6.5 Tf +0 0 0 rg +1 0 0 1 169.83099 597.02032 Tm +(9I\\3ZG) Tj +ET +BT +/F8 6 Tf +0 0 0 rg +1 0 0 1 129.87675 567.50043 Tm +(\)XQFWLRQ) Tj +ET +BT +/F8 6 Tf +0 0 0 rg +1 0 0 1 155.89876 567.50043 Tm +(GHVFULSWLRQ) Tj +ET +BT +/F8 6 Tf +0 0 0 rg +1 0 0 1 190.66275 567.50043 Tm +(9HULI\\) Tj +ET +BT +/F8 6 Tf +0 0 0 rg +1 0 0 1 208.35675 567.50043 Tm +(WKH) Tj +ET +BT +/F8 6 Tf +0 0 0 rg +1 0 0 1 219.17474 567.50043 Tm +(PRGXOH) Tj +ET +BT +/F8 6 Tf +0 0 0 rg +1 0 0 1 242.30475 567.50043 Tm +(KDQGVKDNH) Tj +ET +BT +/F8 6 Tf +0 0 0 rg +1 0 0 1 274.87274 567.50043 Tm +(SDVVZRUG) Tj +ET +BT +/F8 6 Tf +0 0 0 rg +1 0 0 1 303.75073 567.50043 Tm +( VHH) Tj +ET +BT +/F8 6 Tf +0 0 0 rg +1 0 0 1 316.75275 567.50043 Tm +() Tj +ET +BT +/F8 6 Tf +0 0 0 rg +1 0 0 1 326.78476 567.50043 Tm +(0RGXOH) Tj +ET +BT +/F8 6 Tf +0 0 0 rg +1 0 0 1 349.74677 567.50043 Tm +(3DVVZRUG ) Tj +ET +BT +/F8 6 Tf +0 0 0 rg +1 0 0 1 129.84 551.90051 Tm +(,QSXW) Tj +ET +BT +/F8 6 Tf +0 0 0 rg +1 0 0 1 146.70599 551.90051 Tm +(SDUDPHWHU) Tj +ET +BT +/F8 6 Tf +0 0 0 rg +1 0 0 1 179.79599 551.90051 Tm +(3DVV:RUG) Tj +ET +BT +/F8 4.5 Tf +0 0 0 rg +1 0 0 1 129.84 536.30072 Tm +(5HWXUQ) Tj +ET +BT +/F8 4.5 Tf +0 0 0 rg +1 0 0 1 145.392 536.30072 Tm +(SDUDPHWHU) Tj +ET +BT +/F8 4.5 Tf +0 0 0 rg +1 0 0 1 170.2095 536.30072 Tm +(FRQILUPDWLRQ) Tj +ET +BT +/F8 4.5 Tf +0 0 0 rg +1 0 0 1 198.6315 536.30072 Tm +(FRGH) Tj +ET +BT +/F8 7 Tf +0 0 0 rg +1 0 0 1 129.84 520.70093 Tm +(&RPPDQG) Tj +ET +BT +/F8 7 Tf +0 0 0 rg +1 0 0 1 165.967 520.70093 Tm +(FRGH) Tj +ET +BT +/F8 7 Tf +0 0 0 rg +1 0 0 1 185.511 520.70093 Tm +([) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 87.84 505.10101 Tm +(,QVWUXFWLRQ) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 114.89 505.10101 Tm +(SDFNHW) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 131.765 505.10101 Tm +(IRUPDW) Tj +ET +BT +/F8 10 Tf +0 0 0 rg +1 0 0 1 96.2999 489.0213 Tm +() Tj +ET +BT +/F8 10 Tf +0 0 0 rg +1 0 0 1 104.6199 489.0213 Tm +(E\\WHV) Tj +ET +BT +/F8 10 Tf +0 0 0 rg +1 0 0 1 160.86011 489.0213 Tm +() Tj +ET +BT +/F8 10 Tf +0 0 0 rg +1 0 0 1 169.18011 489.0213 Tm +(E\\WHV) Tj +ET +BT +/F8 10 Tf +0 0 0 rg +1 0 0 1 228.06 489.0213 Tm +() Tj +ET +BT +/F8 10 Tf +0 0 0 rg +1 0 0 1 236.38 489.0213 Tm +(E\\WH) Tj +ET +BT +/F8 10 Tf +0 0 0 rg +1 0 0 1 289.9805 489.0213 Tm +() Tj +ET +BT +/F8 10 Tf +0 0 0 rg +1 0 0 1 298.30051 489.0213 Tm +(E\\WHV) Tj +ET +BT +/F8 10 Tf +0 0 0 rg +1 0 0 1 357.12061 489.0213 Tm +() Tj +ET +BT +/F8 10 Tf +0 0 0 rg +1 0 0 1 365.44061 489.0213 Tm +(E\\WH) Tj +ET +BT +/F8 10 Tf +0 0 0 rg +1 0 0 1 419.0412 489.0213 Tm +() Tj +ET +BT +/F8 10 Tf +0 0 0 rg +1 0 0 1 427.36121 489.0213 Tm +(E\\WHV) Tj +ET +BT +/F8 10 Tf +0 0 0 rg +1 0 0 1 483.60141 489.0213 Tm +() Tj +ET +BT +/F8 10 Tf +0 0 0 rg +1 0 0 1 491.92142 489.0213 Tm +(E\\WHV) Tj +ET +BT +/F8 6 Tf +0 0 0 rg +1 0 0 1 104.22 472.88031 Tm +(%DRWRX) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 158.2803 472.88031 Tm +(0RGXOH) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 179.3288 472.88031 Tm +(DGGUHVV) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 228.0602 472.88031 Tm +(3DFNDJH) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 251.0502 472.88031 Tm +(,') Tj +ET +BT +/F8 4 Tf +0 0 0 rg +1 0 0 1 292.62051 472.88031 Tm +(SDFNDJH) Tj +ET +BT +/F8 4 Tf +0 0 0 rg +1 0 0 1 309.38052 472.88031 Tm +(OHQJWK) Tj +ET +BT +/F8 10 Tf +0 0 0 rg +1 0 0 1 357.12091 472.88031 Tm +(VFULSW) Tj +ET +BT +/F8 4.5 Tf +0 0 0 rg +1 0 0 1 426.9606 472.88031 Tm +(SDVVZRUG) Tj +ET +BT +/F8 6.5 Tf +0 0 0 rg +1 0 0 1 486.24039 472.88031 Tm +(FKHFNVXP) Tj +ET +BT +/F8 9.5 Tf +0 0 0 rg +1 0 0 1 98.94 456.80029 Tm +([HI) Tj +ET +BT +/F8 10.5 Tf +0 0 0 rg +1 0 0 1 168.72079 456.80029 Tm +(;;;;) Tj +ET +BT +/F8 10.5 Tf +0 0 0 rg +1 0 0 1 233.2822 456.80029 Tm +([) Tj +ET +BT +/F8 9 Tf +0 0 0 rg +1 0 0 1 292.6228 456.80029 Tm +([) Tj +ET +BT +/F8 10.5 Tf +0 0 0 rg +1 0 0 1 362.34381 456.80029 Tm +([) Tj +ET +BT +/F8 8.5 Tf +0 0 0 rg +1 0 0 1 416.40521 456.80029 Tm +(3DVV:RUG) Tj +ET +BT +/F8 10.5 Tf +0 0 0 rg +1 0 0 1 494.10611 456.80029 Tm +(6XP) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 87.84 440.66031 Tm +(5HVSRQVH) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 111.87 440.66031 Tm +(SDFNHW) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 128.745 440.66031 Tm +(IRUPDW) Tj +ET +BT +/F8 10 Tf +0 0 0 rg +1 0 0 1 96.2999 424.5806 Tm +() Tj +ET +BT +/F8 10 Tf +0 0 0 rg +1 0 0 1 104.6199 424.5806 Tm +(E\\WHV) Tj +ET +BT +/F8 10 Tf +0 0 0 rg +1 0 0 1 160.86011 424.5806 Tm +() Tj +ET +BT +/F8 10 Tf +0 0 0 rg +1 0 0 1 169.18011 424.5806 Tm +(E\\WHV) Tj +ET +BT +/F8 10 Tf +0 0 0 rg +1 0 0 1 228.06 424.5806 Tm +() Tj +ET +BT +/F8 10 Tf +0 0 0 rg +1 0 0 1 236.38 424.5806 Tm +(E\\WH) Tj +ET +BT +/F8 10 Tf +0 0 0 rg +1 0 0 1 289.9805 424.5806 Tm +() Tj +ET +BT +/F8 10 Tf +0 0 0 rg +1 0 0 1 298.30051 424.5806 Tm +(E\\WHV) Tj +ET +BT +/F8 10 Tf +0 0 0 rg +1 0 0 1 357.12061 424.5806 Tm +() Tj +ET +BT +/F8 10 Tf +0 0 0 rg +1 0 0 1 365.44061 424.5806 Tm +(E\\WH) Tj +ET +BT +/F8 10 Tf +0 0 0 rg +1 0 0 1 419.0412 424.5806 Tm +() Tj +ET +BT +/F8 10 Tf +0 0 0 rg +1 0 0 1 427.36121 424.5806 Tm +(E\\WHV) Tj +ET +BT +/F8 6 Tf +0 0 0 rg +1 0 0 1 104.22 408.50031 Tm +(%DRWRX) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 158.2803 408.50031 Tm +(0RGXOH) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 179.3288 408.50031 Tm +(DGGUHVV) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 228.0602 408.50031 Tm +(3DFNDJH) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 251.0502 408.50031 Tm +(,') Tj +ET +BT +/F8 4 Tf +0 0 0 rg +1 0 0 1 292.62051 408.50031 Tm +(SDFNDJH) Tj +ET +BT +/F8 4 Tf +0 0 0 rg +1 0 0 1 309.38052 408.50031 Tm +(OHQJWK) Tj +ET +BT +/F8 4 Tf +0 0 0 rg +1 0 0 1 357.12091 408.50031 Tm +(FRQILUPDWLRQ) Tj +ET +BT +/F8 4 Tf +0 0 0 rg +1 0 0 1 382.38492 408.50031 Tm +(FRGH) Tj +ET +BT +/F8 6.5 Tf +0 0 0 rg +1 0 0 1 421.68121 408.50031 Tm +(FKHFNVXP) Tj +ET +BT +/F8 9.5 Tf +0 0 0 rg +1 0 0 1 98.94 392.42029 Tm +([HI) Tj +ET +BT +/F8 10.5 Tf +0 0 0 rg +1 0 0 1 168.72079 392.42029 Tm +(;;;;) Tj +ET +BT +/F8 10.5 Tf +0 0 0 rg +1 0 0 1 233.2822 392.42029 Tm +([) Tj +ET +BT +/F8 9 Tf +0 0 0 rg +1 0 0 1 292.6228 392.42029 Tm +([) Tj +ET +BT +/F8 10.5 Tf +0 0 0 rg +1 0 0 1 370.26401 392.42029 Tm +(;) Tj +ET +BT +/F8 10.5 Tf +0 0 0 rg +1 0 0 1 429.54489 392.42029 Tm +(6XP) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 132.78 376.2803 Tm +(1RWH) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 146.87 376.2803 Tm +(&RQILUPDWLRQ) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 179.20999 376.2803 Tm +(FRGH [) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 205.91499 376.2803 Tm +(PHDQV) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 223 376.2803 Tm +(WKH) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 232.015 376.2803 Tm +(SDVVZRUG) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 256.07999 376.2803 Tm +(YHULILFDWLRQ) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 283.51999 376.2803 Tm +(LV) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 288.50497 376.2803 Tm +(FRUUHFW) Tj +ET +BT +/F8 4 Tf +0 0 0 rg +1 0 0 1 159.0605 360.68051 Tm +(&RQILUPDWLRQ) Tj +ET +BT +/F8 4 Tf +0 0 0 rg +1 0 0 1 184.9325 360.68051 Tm +(FRGH [) Tj +ET +BT +/F8 4 Tf +0 0 0 rg +1 0 0 1 206.29649 360.68051 Tm +(PHDQV) Tj +ET +BT +/F8 4 Tf +0 0 0 rg +1 0 0 1 219.96449 360.68051 Tm +(WKHUH) Tj +ET +BT +/F8 4 Tf +0 0 0 rg +1 0 0 1 231.08449 360.68051 Tm +(LV) Tj +ET +BT +/F8 4 Tf +0 0 0 rg +1 0 0 1 235.07249 360.68051 Tm +(DQ) Tj +ET +BT +/F8 4 Tf +0 0 0 rg +1 0 0 1 240.82849 360.68051 Tm +(HUURU) Tj +ET +BT +/F8 4 Tf +0 0 0 rg +1 0 0 1 251.50049 360.68051 Tm +(LQ) Tj +ET +BT +/F8 4 Tf +0 0 0 rg +1 0 0 1 256.04449 360.68051 Tm +(UHFHLYLQJ) Tj +ET +BT +/F8 4 Tf +0 0 0 rg +1 0 0 1 274.1965 360.68051 Tm +(WKH) Tj +ET +BT +/F8 4 Tf +0 0 0 rg +1 0 0 1 281.40851 360.68051 Tm +(SDFNDJH) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 159.0605 345.0806 Tm +(&RQILUPDWLRQ) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 191.4005 345.0806 Tm +(FRGH [) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 218.1055 345.0806 Tm +(PHDQV) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 235.19051 345.0806 Tm +(WKH) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 244.20551 345.0806 Tm +(SDVVZRUG) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 268.27051 345.0806 Tm +(LV) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 273.25549 345.0806 Tm +(LQFRUUHFW) Tj +ET +BT +/F10 7 Tf +0 0 0 rg +1 0 0 1 87.84 329.48071 Tm +() Tj +ET +BT +/F8 7 Tf +0 0 0 rg +1 0 0 1 96.408 329.48071 Tm +(,QVWUXFWLRQ) Tj +ET +BT +/F8 7 Tf +0 0 0 rg +1 0 0 1 134.278 329.48071 Tm +(SDFNHW) Tj +ET +BT +/F8 7 Tf +0 0 0 rg +1 0 0 1 157.903 329.48071 Tm +(FKHFNVXP) Tj +ET +BT +/F8 7 Tf +0 0 0 rg +1 0 0 1 192.679 329.48071 Tm +( ) Tj +ET +BT +/F8 7 Tf +0 0 0 rg +1 0 0 1 194.77901 329.48071 Tm +() Tj +ET +BT +/F8 7 Tf +0 0 0 rg +1 0 0 1 200.60301 329.48071 Tm +(E\\WHV ) Tj +ET +BT +/F8 7 Tf +0 0 0 rg +1 0 0 1 224.41 329.48071 Tm +(3DFNDJH) Tj +ET +BT +/F8 7 Tf +0 0 0 rg +1 0 0 1 253.67 329.48071 Tm +(,') Tj +ET +BT +/F8 7 Tf +0 0 0 rg +1 0 0 1 262.97299 329.48071 Tm +( ) Tj +ET +BT +/F8 7 Tf +0 0 0 rg +1 0 0 1 265.073 329.48071 Tm +() Tj +ET +BT +/F8 7 Tf +0 0 0 rg +1 0 0 1 270.897 329.48071 Tm +(E\\WH ) Tj +ET +BT +/F8 7 Tf +0 0 0 rg +1 0 0 1 287.34702 329.48071 Tm +() Tj +ET +BT +/F8 7 Tf +0 0 0 rg +1 0 0 1 291.35101 329.48071 Tm +(3DFNHW) Tj +ET +BT +/F8 7 Tf +0 0 0 rg +1 0 0 1 314.90601 329.48071 Tm +(OHQJWK) Tj +ET +BT +/F8 7 Tf +0 0 0 rg +1 0 0 1 337.96399 329.48071 Tm +( ) Tj +ET +BT +/F8 7 Tf +0 0 0 rg +1 0 0 1 340.064 329.48071 Tm +() Tj +ET +BT +/F8 7 Tf +0 0 0 rg +1 0 0 1 345.888 329.48071 Tm +(E\\WHV ) Tj +ET +BT +/F8 7 Tf +0 0 0 rg +1 0 0 1 365.69101 329.48071 Tm +() Tj +ET +BT +/F8 7 Tf +0 0 0 rg +1 0 0 1 369.69501 329.48071 Tm +(VFULSW) Tj +ET +BT +/F8 7 Tf +0 0 0 rg +1 0 0 1 389.75702 329.48071 Tm +( ) Tj +ET +BT +/F8 7 Tf +0 0 0 rg +1 0 0 1 391.85703 329.48071 Tm +() Tj +ET +BT +/F8 7 Tf +0 0 0 rg +1 0 0 1 397.68103 329.48071 Tm +(E\\WH ) Tj +ET +BT +/F8 7 Tf +0 0 0 rg +1 0 0 1 414.13104 329.48071 Tm +() Tj +ET +BT +/F8 7 Tf +0 0 0 rg +1 0 0 1 418.13504 329.48071 Tm +(SDVVZRUG) Tj +ET +BT +/F8 7 Tf +0 0 0 rg +1 0 0 1 451.82605 329.48071 Tm +( ) Tj +ET +BT +/F8 7 Tf +0 0 0 rg +1 0 0 1 453.92606 329.48071 Tm +() Tj +ET +BT +/F8 7 Tf +0 0 0 rg +1 0 0 1 459.75006 329.48071 Tm +(E\\WHV ) Tj +ET +BT +/F8 7 Tf +0 0 0 rg +1 0 0 1 479.55307 329.48071 Tm +() Tj +ET +BT +/F10 6.5 Tf +0 0 0 rg +1 0 0 1 87.841 313.88086 Tm +() Tj +ET +BT +/F8 6.5 Tf +0 0 0 rg +1 0 0 1 95.797 313.88086 Tm +($QVZHU) Tj +ET +BT +/F8 6.5 Tf +0 0 0 rg +1 0 0 1 120.23051 313.88086 Tm +(SDFNHW) Tj +ET +BT +/F8 6.5 Tf +0 0 0 rg +1 0 0 1 142.168 313.88086 Tm +(FKHFNVXP) Tj +ET +BT +/F8 6.5 Tf +0 0 0 rg +1 0 0 1 174.45999 313.88086 Tm +( ) Tj +ET +BT +/F8 6.5 Tf +0 0 0 rg +1 0 0 1 176.40999 313.88086 Tm +() Tj +ET +BT +/F8 6.5 Tf +0 0 0 rg +1 0 0 1 181.81799 313.88086 Tm +(E\\WHV ) Tj +ET +BT +/F8 6.5 Tf +0 0 0 rg +1 0 0 1 203.9245 313.88086 Tm +(3DFNDJH) Tj +ET +BT +/F8 6.5 Tf +0 0 0 rg +1 0 0 1 231.0945 313.88086 Tm +(,') Tj +ET +BT +/F8 6.5 Tf +0 0 0 rg +1 0 0 1 239.733 313.88086 Tm +( ) Tj +ET +BT +/F8 6.5 Tf +0 0 0 rg +1 0 0 1 241.683 313.88086 Tm +() Tj +ET +BT +/F8 6.5 Tf +0 0 0 rg +1 0 0 1 247.091 313.88086 Tm +(E\\WH ) Tj +ET +BT +/F8 6.5 Tf +0 0 0 rg +1 0 0 1 262.366 313.88086 Tm +() Tj +ET +BT +/F8 6.5 Tf +0 0 0 rg +1 0 0 1 266.08398 313.88086 Tm +(3DFNHW) Tj +ET +BT +/F8 6.5 Tf +0 0 0 rg +1 0 0 1 287.95648 313.88086 Tm +(OHQJWK) Tj +ET +BT +/F8 6.5 Tf +0 0 0 rg +1 0 0 1 309.36749 313.88086 Tm +( ) Tj +ET +BT +/F8 6.5 Tf +0 0 0 rg +1 0 0 1 311.3175 313.88086 Tm +() Tj +ET +BT +/F8 6.5 Tf +0 0 0 rg +1 0 0 1 316.72549 313.88086 Tm +(E\\WHV ) Tj +ET +BT +/F8 6.5 Tf +0 0 0 rg +1 0 0 1 335.11398 313.88086 Tm +() Tj +ET +BT +/F8 6.5 Tf +0 0 0 rg +1 0 0 1 338.83197 313.88086 Tm +(FRQILUPDWLRQ) Tj +ET +BT +/F8 6.5 Tf +0 0 0 rg +1 0 0 1 379.88599 313.88086 Tm +(FRGH) Tj +ET +BT +/F8 6.5 Tf +0 0 0 rg +1 0 0 1 396.29199 313.88086 Tm +( ) Tj +ET +BT +/F8 6.5 Tf +0 0 0 rg +1 0 0 1 398.242 313.88086 Tm +() Tj +ET +BT +/F8 6.5 Tf +0 0 0 rg +1 0 0 1 403.64999 313.88086 Tm +(E\\WH ) Tj +ET +BT +/F8 6.5 Tf +0 0 0 rg +1 0 0 1 418.92499 313.88086 Tm +() Tj +ET +BT +/F10 5.5 Tf +0 0 0 rg +1 0 0 1 87.8421 298.28113 Tm +() Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 94.5741 298.28113 Tm +(7KH) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 105.5631 298.28113 Tm +(FKHFNVXP) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 132.8871 298.28113 Tm +(LV) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 138.37061 298.28113 Tm +(DGGHG) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 156.1356 298.28113 Tm +(LQ) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 162.38361 298.28113 Tm +(E\\WHV) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 179.19711 298.28113 Tm +(WKH) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 189.11362 298.28113 Tm +(FDUU\\) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 203.61711 298.28113 Tm +(RYHU) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 216.54211 298.28113 Tm +() Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 221.11812 298.28113 Tm +(E\\WHV) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 236.45761 298.28113 Tm +(LV) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 241.94112 298.28113 Tm +(LJQRUHG) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 265.12912 298.28113 Tm +(DQG) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 276.42612 298.28113 Tm +(WKH) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 286.34262 298.28113 Tm +(KLJK) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 299.37213 298.28113 Tm +(E\\WH) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 312.07712 298.28113 Tm +(FRPHV) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 330.35361 298.28113 Tm +(ILUVW) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 341.98611 298.28113 Tm +(ZKHQ) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 357.6391 298.28113 Tm +(WUDQVPLWWLQJ) Tj +ET +BT +/F10 7.5 Tf +0 0 0 rg +1 0 0 1 87.8421 282.68121 Tm +() Tj +ET +BT +/F8 7.5 Tf +0 0 0 rg +1 0 0 1 97.0221 282.68121 Tm +(7KH) Tj +ET +BT +/F8 7.5 Tf +0 0 0 rg +1 0 0 1 112.0071 282.68121 Tm +(GHIDXOW) Tj +ET +BT +/F8 7.5 Tf +0 0 0 rg +1 0 0 1 138.86461 282.68121 Tm +(PRGXOH) Tj +ET +BT +/F8 7.5 Tf +0 0 0 rg +1 0 0 1 167.77711 282.68121 Tm +(DGGUHVV) Tj +ET +BT +/F8 7.5 Tf +0 0 0 rg +1 0 0 1 197.67212 282.68121 Tm +(LV) Tj +ET +BT +/F8 7.5 Tf +0 0 0 rg +1 0 0 1 205.14961 282.68121 Tm +() Tj +ET +BT +/F8 7.5 Tf +0 0 0 rg +1 0 0 1 208.20961 282.68121 Tm +([IIIIIIII) Tj +ET +BT +/F8 7.5 Tf +0 0 0 rg +1 0 0 1 240.16711 282.68121 Tm +() Tj +ET +BT +/F8 7.5 Tf +0 0 0 rg +1 0 0 1 244.12712 282.68121 Tm +(GHIDXOW) Tj +ET +BT +/F8 7.5 Tf +0 0 0 rg +1 0 0 1 270.98462 282.68121 Tm +(SDVVZRUG) Tj +ET +BT +/F8 7.5 Tf +0 0 0 rg +1 0 0 1 307.08212 282.68121 Tm +(LV) Tj +ET +BT +/F8 7.5 Tf +0 0 0 rg +1 0 0 1 314.55963 282.68121 Tm +() Tj +ET +BT +/F8 7.5 Tf +0 0 0 rg +1 0 0 1 317.61963 282.68121 Tm +<0013005B00130013001300130013001300130013020A> Tj +ET +BT +/F8 7.5 Tf +0 0 0 rg +1 0 0 1 362.88962 282.68121 Tm +() Tj +ET +BT +/F9 7 Tf +0 0 0 rg +1 0 0 1 87.84 252.5603 Tm +() Tj +ET +BT +/F9 7 Tf +0 0 0 rg +1 0 0 1 91.84399 252.5603 Tm +( ) Tj +ET +BT +/F9 7 Tf +0 0 0 rg +1 0 0 1 96.03699 252.5603 Tm +(WR) Tj +ET +BT +/F9 7 Tf +0 0 0 rg +1 0 0 1 105.228 252.5603 Tm +(VHW) Tj +ET +BT +/F9 7 Tf +0 0 0 rg +1 0 0 1 117.702 252.5603 Tm +(WKH) Tj +ET +BT +/F9 7 Tf +0 0 0 rg +1 0 0 1 131.29599 252.5603 Tm +(SDVVZRUG) Tj +ET +BT +/F9 7 Tf +0 0 0 rg +1 0 0 1 166.66699 252.5603 Tm +(6HW3ZG) Tj +ET +BT +/F8 6 Tf +0 0 0 rg +1 0 0 1 124.68 222.98029 Tm +(\)XQFWLRQ) Tj +ET +BT +/F8 6 Tf +0 0 0 rg +1 0 0 1 150.702 222.98029 Tm +(GHVFULSWLRQ) Tj +ET +BT +/F8 6 Tf +0 0 0 rg +1 0 0 1 185.466 222.98029 Tm +(6HW) Tj +ET +BT +/F8 6 Tf +0 0 0 rg +1 0 0 1 195.87 222.98029 Tm +(WKH) Tj +ET +BT +/F8 6 Tf +0 0 0 rg +1 0 0 1 206.68799 222.98029 Tm +(PRGXOH) Tj +ET +BT +/F8 6 Tf +0 0 0 rg +1 0 0 1 229.81799 222.98029 Tm +(KDQGVKDNH) Tj +ET +BT +/F8 6 Tf +0 0 0 rg +1 0 0 1 262.38599 222.98029 Tm +(SDVVZRUG) Tj +ET +BT +/F8 6 Tf +0 0 0 rg +1 0 0 1 291.26398 222.98029 Tm +( VHH) Tj +ET +BT +/F8 6 Tf +0 0 0 rg +1 0 0 1 304.26599 222.98029 Tm +() Tj +ET +BT +/F8 6 Tf +0 0 0 rg +1 0 0 1 314.298 222.98029 Tm +(PRGXOH) Tj +ET +BT +/F8 6 Tf +0 0 0 rg +1 0 0 1 337.42801 222.98029 Tm +(SDVVZRUG ) Tj +ET +BT +/F8 6 Tf +0 0 0 rg +1 0 0 1 124.6201 207.38037 Tm +(,QSXW) Tj +ET +BT +/F8 6 Tf +0 0 0 rg +1 0 0 1 141.4861 207.38037 Tm +(SDUDPHWHU) Tj +ET +BT +/F8 6 Tf +0 0 0 rg +1 0 0 1 174.5761 207.38037 Tm +(3DVV:RUG) Tj +ET +BT +/F8 4.5 Tf +0 0 0 rg +1 0 0 1 124.6201 191.78058 Tm +(5HWXUQ) Tj +ET +BT +/F8 4.5 Tf +0 0 0 rg +1 0 0 1 140.1721 191.78058 Tm +(SDUDPHWHU) Tj +ET +BT +/F8 4.5 Tf +0 0 0 rg +1 0 0 1 164.98961 191.78058 Tm +(FRQILUPDWLRQ) Tj +ET +BT +/F8 4.5 Tf +0 0 0 rg +1 0 0 1 193.41161 191.78058 Tm +(ZRUG) Tj +ET +BT +/F8 7 Tf +0 0 0 rg +1 0 0 1 124.6201 176.18079 Tm +(&RPPDQG) Tj +ET +BT +/F8 7 Tf +0 0 0 rg +1 0 0 1 160.7471 176.18079 Tm +(FRGH) Tj +ET +BT +/F8 7 Tf +0 0 0 rg +1 0 0 1 180.29111 176.18079 Tm +([) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 87.8397 160.58093 Tm +(,QVWUXFWLRQ) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 114.88969 160.58093 Tm +(SDFNHW) Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 131.76469 160.58093 Tm +(IRUPDW) Tj +ET +BT +/F8 10 Tf +0 0 0 rg +1 0 0 1 96.2995 144.50122 Tm +() Tj +ET +BT +/F8 10 Tf +0 0 0 rg +1 0 0 1 104.6195 144.50122 Tm +(E\\WHV) Tj +ET +BT +/F8 10 Tf +0 0 0 rg +1 0 0 1 160.8598 144.50122 Tm +() Tj +ET +BT +/F8 10 Tf +0 0 0 rg +1 0 0 1 169.17981 144.50122 Tm +(E\\WHV) Tj +ET +BT +/F8 10 Tf +0 0 0 rg +1 0 0 1 228.05969 144.50122 Tm +() Tj +ET +BT +/F8 10 Tf +0 0 0 rg +1 0 0 1 236.3797 144.50122 Tm +(E\\WH) Tj +ET +BT +/F8 10 Tf +0 0 0 rg +1 0 0 1 289.98029 144.50122 Tm +() Tj +ET +BT +/F8 10 Tf +0 0 0 rg +1 0 0 1 298.30029 144.50122 Tm +(E\\WHV) Tj +ET +BT +/F8 10 Tf +0 0 0 rg +1 0 0 1 357.1203 144.50122 Tm +() Tj +ET +BT +/F8 10 Tf +0 0 0 rg +1 0 0 1 365.44031 144.50122 Tm +(E\\WH) Tj +ET +BT +/F8 9 Tf +0 0 0 rg +1 0 0 1 421.68161 144.50122 Tm +() Tj +ET +BT +/F8 9 Tf +0 0 0 rg +1 0 0 1 429.16962 144.50122 Tm +(E\\WHV) Tj +ET +BT +/F8 10 Tf +0 0 0 rg +1 0 0 1 483.66199 144.50122 Tm +() Tj +ET +BT +/F8 10 Tf +0 0 0 rg +1 0 0 1 491.98199 144.50122 Tm +(E\\WHV) Tj +ET +BT +/F8 6 Tf +0 0 0 rg +1 0 0 1 104.22 128.42029 Tm +(%DRWRX) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 158.2803 128.42029 Tm +(0RGXOH) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 179.3288 128.42029 Tm +(DGGUHVV) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 228.0602 128.42029 Tm +(3DFNDJH) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 251.0502 128.42029 Tm +(,') Tj +ET +BT +/F8 4 Tf +0 0 0 rg +1 0 0 1 292.62051 128.42029 Tm +(SDFNDJH) Tj +ET +BT +/F8 4 Tf +0 0 0 rg +1 0 0 1 309.38052 128.42029 Tm +(OHQJWK) Tj +ET +BT +/F8 10 Tf +0 0 0 rg +1 0 0 1 357.12091 128.42029 Tm +(VFULSW) Tj +ET +BT +/F8 4.5 Tf +0 0 0 rg +1 0 0 1 426.9606 128.42029 Tm +(SDVVZRUG) Tj +ET +BT +/F8 6.5 Tf +0 0 0 rg +1 0 0 1 486.30029 128.42029 Tm +(FKHFNVXP) Tj +ET +BT +/F8 9.5 Tf +0 0 0 rg +1 0 0 1 98.94 112.28027 Tm +([HI) Tj +ET +BT +/F8 10.5 Tf +0 0 0 rg +1 0 0 1 168.72079 112.28027 Tm +(;;;;) Tj +ET +BT +/F8 10.5 Tf +0 0 0 rg +1 0 0 1 233.2822 112.28027 Tm +([) Tj +ET +BT +/F8 9 Tf +0 0 0 rg +1 0 0 1 292.6228 112.28027 Tm +([) Tj +ET +BT +/F8 10.5 Tf +0 0 0 rg +1 0 0 1 362.34381 112.28027 Tm +([) Tj +ET +BT +/F8 8.5 Tf +0 0 0 rg +1 0 0 1 416.40521 112.28027 Tm +(3DVV:RUG) Tj +ET +BT +/F8 10.5 Tf +0 0 0 rg +1 0 0 1 494.16599 112.28027 Tm +(6XP) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 267.95999 45.86041 Tm +(WKH) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 277.8765 45.86041 Tm +(ILUVW) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 289.509 45.86041 Tm +() Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 297.23102 45.86041 Tm +(SDJHV) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 314.24802 45.86041 Tm +(RI) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 320.89752 45.86041 Tm +() Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 328.61951 45.86041 Tm +(3DJH) Tj +ET + +endstream +endobj +911 0 obj +<< +/Length 2 +>> +stream +q + +endstream +endobj +912 0 obj +<< +/Length 2444 +/Filter /FlateDecode +>> +stream +x[ۮ[7}W uIQt- tR M ~}MnѝyL\ҖHj_~||Ϗ_>>|7Ӈ_/ow/|w~^O|smrq3ed|OVW^xee%n~u:|$\ǴĐO @TphooX˱XDQfncl(^4]GDPyh=>{)Fb=rX |ƒ}ׁٙj `*a" `y Mg: 4D G+HW5ġ5ĭ {9*4be _,k$Z@WwdDՍڶ,z5/Idr6!>Vˈ"ͶK?ciy&` +ɐ#17f܄,gpX+-J +aY,)ۮؠ:#, gB*xŸux>(5˵ә1~eHl.d +lMj) πrH6ZæI=TYSoOja3Њ1 hڍRS`nDj l>F+^j}gr87-;es#Ֆ@Eq/!4\"6:ŇnLA/x׮ Y@WGҸYF۾{;z +[G$ 9w+ +GzsA^刹J^Nʺ>W?lp} /J2£g +o\Ĩ̹̑n!߳eMdZ +f?;K`d6U+Y%ky?8<"iKY`]cOOÛ,WH'1)}w75+a`p

      O4Y|j5z/t4M[AeڼhYt@<}X>⠘zSBydOpvQX0gbFs] Dhw mgġxbʚR)PV+?ƚo3uw&y7:VJ@̝ |wJ/.p* 6iqvs8_!Ν̜-_OaX!?|NBU/;:E#ĮR,Al\4<6n{Gy>cl1njC3L/1B^[)h.#>X~jyvh7Mf!c?5^mg߱w!q>B@K@[0ޓb5荹~@;}b*3VqhuOvK~|j}0Q.{b`c{BW7huGY|}~8*a]\M7 Z3ujs7! 4NT>㺫_+`ŨؓY.|]l+ڡ>ctT/~IkbAm7ƧmspR!>L .1qm9NݟY~|1!k&Ŕw oLi?q y٦ΌpK||>q<=X]bփZW3}~GIlݔW>1%7pHD<Ĺ[Ώ2%G>C< ,}rUrı"$Fiqi҇V};ZGAoܪˆ>~|'ǟ'g..qTLAHf0&#޶9L'eT7\tgo.j?3q7!|Y5V/>Pcɫ +q*^C<*$}}jh؃75zR$kЎ>fkiѧmbSb;r5~Z*OվSF#}:])k.s^>6=G.Q=H`xu_=K|PNs+3{|YY.PN= 7=>>(N9G}sQeI.b/f9+Rq/}ZmyWDͤ:Mc$r}Cۛ]to@։'u|i")eR6xWCǶ/η?}m)Жyb_}Am|qnծ^)+Zw<(V9(g_V:4Tz\9}O-Ru ߆$h&fM~Hk?q[yb8}>=\SCYr-}bPEzXrNlxn)yC]|`YQ~M_vx>/!G)z;^yc3o.9yUe'`4~8{>˚wQ'v]'Ď|D;*lw3vPg'#f +i^`35zû|A#Oω1<,~'\l90~G}KIH&ڊ&}<٭?ܬ&nӶ8{Wxq_V=μ=GnSfd}oP~OFX7:/!s+6W/ԨX' +}^wtȑr_m>M-䊞~"/+d~$~ʧnf<^6m'&#c[ܰߘ]1/C_{am;"^=E; ?\|Pȳ!~p5hSSbvQ=ۭ)X=wuJY#>5?[l==rҤHoD.ףc-'S%= ʈo!3+)v!Q9'z1Pkyz(1N\/WߕzbBkt0'1jj]e!x{/= yfPM*} t}mJpX9W2 +}p1~w6=>ŽڻE=U!F1 i2C̯b:ԙ}G SӋ;.F4>pZ߈9o7 2fWܩ?ag!iYN 7+~3[ǝb)qn:m>ȳI<W~~\|nI}Ff/`/+3rl$ϻwH f0jCL̐5^2}3Ҡv1C>oʔ_yGm=Y~R}_ծm)NgJyzw<Mr N|qp~&g>k$ߞȡtLE?Oրobx3]bk96jߵ'?Α+[ob8g#w$W#+Ŝ9K< _[Ɬj,V~g/WbbHb>ir;=<-';_>Ϸ{w~9ӵ}Fx&i̎s|^ _*_˴y6O+nX5YߦzWUw<^6I H$d# k[X KEDKؖjQ錶bADKmtTkkkmm;G,oo?+9Me5w\9yk{WJ Mz㾼g+*YI7.kEwR/d10wo +'u9Mw>avFj}v8rv&7MQIOCy,Le*+}SX6 u_oPO_1Oj1j5*S+h0M2~Uye183|;B3e7Җ +|r/ea'ES8@ ⿖Q8uqAbZo'ocQXMgKZh3bwJ cTK;aC+c0z7tZM_"c`%s>'i7~_[)`lj /K٪L[`JϨmtʵRG+D81ld,P T7^AOg; +rzvmǗTh.#0So m|9bmkFg 9'*/a:LyiQ ۞f<31%G ˸pBfG`Ex& %sbxo-#,q GxcwFv0YU;hԩ\"GqޏyWf$o 7E +,B58P~m cE6t1[vpzQLcFN0GIC˺ZekGɿnMVm-|Ǒmu*Y-B[*2-B[,b_(x dk|q&̚-JdM4aΐ E^OZuONOD'<^%zf'VdW#* +\%p+/⸆!xba XG +\(H8_ 'F˾Q }:L +#x9=|PȀ +k('4a +3MS+J"x$4WhB%xo{ .:ˊZ/Xc/:'hE +-"HˈG-B")ꊾl\֧--T7hXd~A}?4S?rk`~>_{W{y׹8{Ѽ\o[ zCj^SWOJ;%~޼s}s(;g5:g:OSi}ҜR'}>fc s9߳k?nWU}}=dVCA}|Kߴavqn0>sO5_s^g*"۽iT;s[6Uo1;[fssڬww-j`;e9]^ %ݕnjT^n/5R]z,qZb{ivz]`w<{.673iTޞbt# ud{=ֺXT +]fU.5cR]b׸Uhs3ZMS#f3\!PMփ,3H ttT:*]7:ͤ:iIq>v&ۉ&INez^:$xkT&hi"H8^S9mvm߽{|]Q˺QuϬl3F? %>s=Ng7s'^G,3sck~X~_22OtO՝1ɳ}b'}]Tgyì1V^^ f`nVBz``@/, +33U,4^CnA~f~^*t ƛYR=PDGto 3 x퓩ehoٲ){b[H]|YE&0 &"_?9W?I)0$Wf]7Go7JbkT~9 %`ꞕ~KGЙR9*"ҎH/k|kc'VN}zߛ3#+/.>=.79:*O|\X7:>=g쵽~Mɦi4$BKHԒMQQj*RU UBBJ ^ʁH q.ͬѼ7iN{/oF'kᕲ #}FO&K(Cko??aG3DbЛ34lC@Xh^3+ ~Wu<_ʆlm55'6o؅`l \+VkžZ>B¾xdaL,uoyͨpٽ@s_1z6UW}Dxxh*?,K[??ɨd1  1eX}B&& ,XViF11\äBNvm)EG&:tlt=:J{@ܕNXe.02K4`iV +dZ4$Nlճ,ՑHи_ݬ{g% 7bUL$vƷh0ƛ'Vy'-sJhxbo{w)Wr݃{-v,m˴u[ޤ[H۶1 +K&5_6~$j1Z HCB(Þwɇ3;;ĻCzvkM{Xcg{AtY ~j2 :=`:5&X%I%ڄAJJbX,颋8e__~?M@uIOrTb( +/-:+<Z]V*oBJmlQaE-q)Z}"%m_S~{չy5]ߺXܦK .4KpPL~oLCScF A]ۂw6jeȴC$Ԛ)!tC^I80-an?^EΎ6#bJl"g#ư'#eU# C0yB&Sxr0*ʍl@h]'pY$8+X'C Bb% )ض0e2@I3rQ?Cȿ@6^Obgb/ +r_R N B=6w~.ҷTx U8HUtZEbˈQQ!;o&[+['Oӱ)"+@@FUÏ7LU6R$xI@1bY{磎ve/}2MyU$dfJVX6T]ZslSg:AKuY.^ZA5 +[|fȉr #C|6"#0uz'<\ )AD(BG!-zC̨2ˊB X!CѾVd".AZ CYV0<;kѩXQl?cWU 椳ʭAq%M.9Tψ$| 9';@;Dh7HUsh&{ivn3.tXӊLV|H.M<!<W>xg/RBBn8B3E^̚<;6<\)\V>uԦeT%~>_$qQ&*\X-`|l \VX8rH$ITo%YEMLQ"7Z$LM5\CvԁkoVBuW=N_BV^V uNj7"ӻDK~853i}lMdXWuQLˎ8FS{}8E :閭zqMǕԛj7޾Ro0 +T$Ycuӌ3t7{* `1kDx.G!5"U +f;Z5DwcC̈S3=术*E=|_V_yP5M\[00Ijp}.{nPD@.kbO;UԳO(6ٯ߶0'vb'c;4m7iӤ4MӴ-ֵR`iڵk넶[i7 tY6+j;zsӲ&yc ]LgweOgǪWM{29c,{Z86<~fx><~8)Xhޚ)1w wvf>i:3j~$2 +Mȋ11 xzK|*~ׂuJm?էk4㉋,WЬ2ӘBzWȸY}wi鳍ڥ֛=P6gmzsm# 8nC7%IMu,muv,LmaΈ {ɡ.4=fnnl@Xۙ 2Ц`664.KD^;;l³};bZ% +d̲~ktrnoT*xr.#I[HcE!B!B!dB!BzWeBB!B!MnBdB3~!?/!B!B!B!B!B!B7"O4>GA#GJ3f >׌Y2Jv&1ZD!4c +rn4֌D1x1qbĄ\7m,BQZl6BMj$Oƪ[;])CCI &fjR\۬lfuZQƪ2R EpFϔk˩¡CSSfe(v\>UQ+>HqR$dMR!)C|lQ1R%[dedY,{|{I ADUSj9}dKp^+8WKYJ+pg2˰?[Rk) U>UZPV:ΫfuLvv֌|*uu-B4I~7qr (ɪaJ/P]G ¸*@I;+ ԣk|VqZqknى˕S;iRW,M7;J_g9td*Ҥ[3'vGZ1>\'󚫾oϋÿ~k[Pmty-0'e + +endstream +endobj +4723 0 obj +<< +/Length 17355 +/Filter /FlateDecode +/Length1 76916 +>> +stream +HVy\SW/ a]> ( + HHQd,.YRQ@  + 2Vڂ2E; +􅥭LL[ιw=@$"pY:NtK󷠆`вuAmte긜a$ŞjK@' bITH0sUh&}KWF:U4 ^@eh`Ǹ +I Np̦oK)=Gg3}Ȳ<&FGU ' g6Lf0VGEik#b! ʑf{eL YR􅦿PJt)a@L o'q 8k(^"6 (]ch&gjĉpDZPL $ɨ, bX84>LASjbYg3ƳK~dP&oD8RgM|hJWO/π J77wU!PG]ZbT8s営 ~ +뾗 ;Xtr|\|}{ˍNH5%-wVםC{kJ7xE~[M0*dsi,B)DHy])Vs>{eנ]GcӚ֮Ώ+AN' q8lVޥ[b6j@v]<6vzC-}B4a[)qKo~&pߏ/*{6uT쪭1kapr뚲,ŁFOuMTvO*1PD"@qk1R썜C͓n߫j1Y*c[d%ǙCYj棜H4D4Z ,,̷|ٜa[tqÖA3QEgEާ8! +D/ΕZ&Gմg9/NQ}eM\SJlXz;v=Pra61ae^˃a7luTVhhwj̾J^;~huW [C"j⟜:\C;RZWT8ܪyPn~f,oF:V7"U +g=HY' ~s;sy:LL)^Ѕ,3$O0I' ~Ƃ/ PO +^$G(γlx$; d! Uģ̼ Q +ʊ +$@n7,`6NcjQ_VE함K^fzMӻa<)TԂCv:ȠT7;EES ʧ-18~X-S/T7J8L|3|_qZZ+ebpPwβ;8Qv`'Rqx\sLRf>'Ӆg C~1+Kcnk0窚 +1rlNDGEZIz;hG˰(fgrN^:V:%/9RNeǫm߼8F,JmٚO=hYXඝi+ +(<%b#$a!'+掲xǗߥz;c ??8Qa٦//!7Sr8'nPX!ū"F?>*5vnz$vHS?L`5}֯ҞG쬩Zfbm`<@qm'>q87HӨXW_^jPLzv]m©Oua8][+g_:tVߘTK-_Y$T$o+cX{R2F+@;-tM7E>Lɗw8{tR˸Ў Ν bd hMQR=Š?-@pZ-1 ?ΊPXh( @!KB!UTi8Q_~CE (| C֊B!T^P@K1 G06k8.&;Qlض{L=g4T0_4lr$`@ȎMG"o?xx#h2zOS5cҢnXT;|$b+[y}8r?xT; ss-6F -l'B!.4\:H~+9ּkWpԲ`!=0 O|T$vH_~3PX]~6M H.cl a3`"` XZ~J#}g) GD3"Ro| FxSl܇Ҫ k#/9ey/$u AV2`DN+#*¥iҢOgL>5;:ªϥ%݀Uk2%ڈv"eZ o}-ָNOQzw_j0Yհ|B- ZӲw^-ZUE)i[*dSj[_Dy~MMӍsҋ g>Zk3_T!ZЅt:AWo Pbyl}*Xc9&s([-L~P0j~Up +) W$VA~FHUWFIabOpe95`(#`_IZ :j*BdB@0 0IjHoCB +nNֳK:zd&i$.T|1{BYHG(?&xM 1SLbdnKe'k+RV6n̈́( &z u=j'&bX|7l܈}xMšW:2=Qql1F{xo<|If:ԘzT|ɫiGjTb+Ih]y t;[dN>ўW).7_)9uL#}$ 3T\B @Pr[#CP#G10@F =2@/KRs] 9_ h/7`  =02:?p ]8<`[q$[ېTO5hBݬ+9ʿ~&%Eߕ|eLV7WUKA +jKNRq!3ۿ۹'x",W$VEĴ-r:`T~ˉͭ/lʒJHƃVK (}UY|X&icWv!!+PX%/|,_Cftho9.(bSzP؍ԆړC:< iZFQ:Z|GF ՖMk(ۈ"Oz?ek]mu־^%<OrxD)95F n2iȖ9wWZnm4Q:  |a">">Sc{W}lҽTL%(?*h>⹜u;JAie|]%~ꭽ)>-o$,$8 *=tj⚬Ƈc[_bžyzǢnleb=Ijqq<<=ء}bmhݪe͚6IhܨaqgnjT3_mbRQbRRR޸>W(o~ ) —XLE 9]8eVAp|!'ĉ#Q24ʼnV9q}|q`O4(~D&GdJP 8 =NO_7Y7coz`*]ཋva"&2*+VgV/[^?L}H'vsuE] +_E?o +UHh яl>|Q/΄>IU +8u()hJ; Lǻ(;$9瞨;ފWB__v>|vQVZhݚ۹ߥa{^D\=w>[=5̵kFp3 ?`x=)lr&AZa#(`!& +[*?!= :t Foߐ5; T0TLE~`x,6%+̇Rw6X) T`9Xf`F0-t0<),6y jX7vPޒ~޵ ,>;bw+8΂n6X Hv'X.)3 ϼKM^'!K 潅5M+Qox.3ϖ2 랺B7OcׅA16&'<P_O(fsU! %J.zFb yN)_/D~q"89tؚ-XkúA*:舜%}}9wnGMd +xDrARW^a}m346!̏¨vxk {<|zKk&X Zz_-RKyUg=S 2.9[qHʨzߘj$gz`G`G +y˸/>~Otx|"cZ"riEQpOf~-?i(rm85gRς$Fc}ޛ`\Msygkv5׌9m{S$4|^#xl{ů9f=*7֤+:Xn9su>7|cqĜ{CwD7|?|oȷ:)2G߹>>7o򯞃5w3[k}8j}ZûE2J_1y[b3ӷM9@c{MX̺ 'ދQ;{f}6:,{W+i3u9s*~76 g]V-i^t}]l۾P+n_>rGunbӞh_wzM ameu[ۧk|XmodW`RR_jk}ŰS%kvСʦw#,:6UПg9/nyl:E]S7vXbM{ k-}Cg}V!UlF{X컇3lW-6s &UcY&S 4v _=wh>ZpTv;:k+_' d5TT_dw;L"/ᬊ2k?a,%J؆7?@޵Uֹ6_<< +.x=veOJ^cJw"Λ`Rʯg ؗŖ.UL.!S > vz#d$O[d|L˳7¢x!Y^ؔaM +E4ضz?oW:/R~YdNA sb!Úk<Ϝ2Z;Hq3>xԻo 5nBNrpj].ZɂEڥhZsu1m]"X>W]5~ilx4:Mڰg<-|~-j~ʆ xk($!6q;uX=ezo.?;yvѵcLkv"xͷ`[~g>K{U`0ׇgvVw}x{zElZ w78[-?F)`o|qf'YVE/c:X-1kZ+yqn{4OOU!X.,d]웷ϟ=廈^]b,=3Ʋn۞˾,W +:& Yul3){*-ǹ_(kE!q Ź}H\V[QA}匸3,KO)L\wU!;8 /xM!2X*[zqI%E>`){AXoU0zfŷce}ANLW%r+r` +r"EoQC=(yA zXGg [78<=lU޳™- 8M7ʱzS]VrcʞŽqdz~17Y?ac@sCe~>69%^iigL=3vy _^bk|{˅Nvņ/P{S:V^1W`u9vξ^/k7_Wrh滾<#nQ?^`LG! +-0+j_ʙc%p/h/pm+cr>]G>7%mt7{}QgEG[Aq=Æ>>֐Gw}A},:g9G6>®gϕ\9oUQB|9ͼrN5(9(~l+{M5g5l? &ťiav#xe+r_i\6,س} eh"#ާEX®u+f>2} 1psq>Q]}Aaau9~_])wǺIpo ]Wr8o]֑\\k[-pn ǟc9ǔslVXmb_o`P]R9u Οc{U_q?cd+g\㩱߯'`exL%6 7&طYC8>Y :m958Xqן+uM%k&1qoP pYBrOq8SֻeeyX_lOxnBGbUA)s.?)⁲vO#%!^w]5V| +5>8sE1s vz&u,}v959جs <%d-;.gJY7C1+{eϫ2oe5F滮]eN?WkJm{Ӱ}3s1Xɻ'3~'KY)Ww6~_)g{;O +xYu(+O"way9dְ^ *Wy9oșW:b,|$e޻cݩ%#Ґ#Clj q CFsstK/~C[F{y)z*4X*k!k?};*>Q9FS%g<߸c[:p?Y{s2?]paoܣs R:'c:~)yK]9{)gyuUܴ'~*~WUrH~6kWʹㅆ93VQ.c_q9tӯsf[Y;uƹ|8G{swTNtwZc⾎Ġojx?!rw,~:vqe6|rm%P68F9;*9gikƻ'o=AGx\PUa.W|Àmس~=Bg4yb򣆼8;zmxO9ŷJU#~?./s<=(sf5d_sذK|Ş>q Dy=cx쯱gU9| +f{mo_}|q:n:LS`3Dw5 @s2ѳ;#]nZs8:D5j&fϱݲ3;L91M-oTc'[U-K:sh.(%v-i*wݶ] ~wם{z{؝ssd݉!ν X/YR}8WБ Ucj[Guyug] ;_qNg)afOGL,=f9<͊]pGUc115r{s R} 9 #~fiw=k\'-ţģ?5hYAͷcl͞ct~f/,ޓ!.:%#n:%:MuDg^azEm,zԢ>V)zșFpkZEu v,8_kcc߮V{!odOsfջ# m1-G$k|z3V=RoXK;Ͽd)gcf-yQr@쎱K`hC[~[{~ VX̟Ҭ bx-t(FGPށݵEֹoߐ3̱Ɲ;co}k]/mQ'F-8{yNqm1WV,ދx8z9`' "4*)vjP -`KŖ ;T#ZU &=n{]̀聟a9g4G6ћrE _gUS8#;|X~lQ/ QǥDgCj[61 +i'){#~f|Ӭ4 =|b-oy;WR2@ǽĎ +w>-ebޒEjڄѧ~nYӜVF,v gF܏ko/# Q~^I|W^WǯaqU-$gut.Y5_t{u]Eg#e˂'S-ꋟ߰&Mg1glZJ daoH/,f*~p<>aC.oUͱo[seFo96- O9b/Ev<{Uzo"TKUCs !-c|Zlׂ;]{&6ϣ% YLܶ 5t-j@U[ujM\z/ٛ {z{ECzu,jlsy[͊Em\;]\~ k/κ? t1cn8j7seяޥE]}`GF>|F}+5C }&OY%?ڰMcG\6+j|V_۴K͚kା%n?~}/r&kQ- S N>]cxssP7Aw/^*gWѼo1:>XwwYǥ_%d*mz5||}NygIԀ3 YbZsiO`s¢#y2nw_{c15e`r]vٛpVujW}rW%_軚C: +')f]-rou=CO+[[UB|1z>'K5S䱭'GpžgN-Ŝ^̂/X]blaK3^fCŽG`q,Ђg5 -CU} ~4:~j>i4_9q:vJ+v[{sb[mۇ=G1Ⱦ\?U.STg^ MĢFy<=n-x@8_FAqob2{m>db8&3T||нggć-uCYғ,DF*=sD[b}8b1k]{|$~-ЮE35?,jK;6[c<7q?[ '1tYEse1׌%@cӛL_XpC쓌:>}ts9!{=E>{g|F36f'c}T'4=DoUv'pjNj1{WqzxUY[p 4*oO-a8M.>'=5E}|SM|ű!X{==|ܴ~EpGuR3Ă[pRW?g5:6"ޖO{>k%v-" b>C[p{|wIL{8ݟ= ^:Uc]~nZ"'N#`oҷl߷/ob{=\_\̖NGUUasI$/nB{GH Ж&&N3GZif&i&NB%/ "*> h+ZEA?<(\;ZMhX.=~~ܛKn ݇(<-X64" .7ބz ›mC z;ֿ Az&V4[@lBs-tFkQAρ^QB9 1 ]/GW ^eUЕW> uۨucة`X\ԧas or 藡7Y]'!=Gg +hNBp2Ef "P\10k-}B4oM_̟Qzd_Wzl^Ez/?kϸsاIy_'q}_530T?#!~dl7o] W_O߱5зao.:ȇA:j5+mEs}^ʟ3-{ }{3L7MF7uI{]OkC}A2J}?`o/Gt1_b.xB;L q9ciN2 ԫ{8e:;줸~,v&QVwKSokwp4Z!dZ涺Asl[Oqgu麆kM UqJ^f*l%iRbs]D y]Hٳi.3عt>]l;ǔ˳K3$3 3;43.5%4'b3Q- +2^r\xWEps(gWb⏚8s֞cqᱣǞHMw 츓LgΉfsc >AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL]9j jJPj ݝ =\u )S#y1ټ6UeNq^3bhZ; y]nr^t?uj0Pf`8ۗv{+W.eEf.}@ҋ%{3Lj e*D5^n M&{H[["k{b6gP6Hgw z{QmUjU*b]!Щ*.PiWNHe> SK-ǽVķV-˫nGz/T0Ns1- 'k7)tnU))ۈDcgUIܓ5n/wĸ{sk= 9oWnnF_#~-~؏~/,ٰw jF˱3"~: 9]p}J1;KGc;GsU&\s+{:ڑ*:yVΝSEG6רl8ِ*{HfTͽ5FZ{ƹ_M"hN›R|?`R2>XGGWo4XKt + +endstream +endobj +4724 0 obj +<< +/Length 909 +/Filter /FlateDecode +/Length1 1140 +>> +stream +xUT]L[e~kiMax,ms +u¶PfdlMd53*$ixϝ1 c"1&N eq1$/rSK|ϛ};GA^w 8Q=XJ(OQYI>ԕk>!M<6379̧0+2hl(XT[ 4fhA1(4eY ԗؼj|}Q}=Fq'2Vee`')d%vښ&{޺>ܢe +*zTYUQ)U(#o EcCVNvȸA jY{ ֐6QP]6]W&%Yw$lۍC҈h^R!~|V7J\<ѣkA뎏fg1o& p2Qh{I+u8əDt3?HڃVT,kx/t_XE QSU`D׼F*{לBu7|kNdUtNjqxa2떻x] 2^`8'b.ۦ46ܘ<\ 3;9ZsH7ɻp\2Kgu>6.i^&[Pŝ.6Og~3^l= 7wo|_>l6eD9ͭgyEwJս󋣼T4G ~ cl>*EX)}> +stream +x!o}7 @ ,+ +endstream +endobj +4726 0 obj +<< +/Length 6528 +/Filter /FlateDecode +/Length1 11292 +>> +stream +HW TSWYD6h( YH0 Z&A{A-JEmU\R\g#JVN.wйFA[gΙsfΜyw_0S'tFxy(T#WHPˈzr͇v0{z(gԃkjCj>0G @$b?z-'-Dr +U30m, 7Fxhњn ~NM#0h'}_W=u?Lcˏ+v6. 17˃9<#YCfMa<|dE9Yuo'l׬T81ŭg]O5ĭfPR,+s'>)>Sߵӽ,1/>,p!)t͞JwBrNvd1% pv9gOwt))/fysڋlۚйڥVmn%%.\Pq[N>FۂF,|㹪CzIJւ攊^3xx$xSkwoQ|~>ߜ'NO8 q E-&(,SzV%UU<JtU\qK볊SOsn_?{Gzb?߂>vkŻ֑[]'(JZՊ}¤v~ےӞ-mi( f0| WLN؜އ% +#kh^hjcdӆkT^7#[5goܕ \vvub])[}89LA[¥qsVnM9;F(chLOoxҾIfpC!֮Oﰆ%c>ǬXP1\y;C7Z>k:{:{~ *Lzc.HDY]ٗM;9gG* s7:o +L `|՝f19uXY-1eؼR+'=>nIX/l@_?̈́``$$)QOxdn& eB@Cxᗮ VO &0 +#&!K$ R#hWĮXR_~Z+Tz]yHۻw̙39gZ1AQ_Iu|phDH+UqQ* + R%w** VGa@hc@LVyaђD' ajUd (S‚ӯl8X+C2^RI;BTW<φ-ӥŴ8Rl]V)jS"BfhW@IRV|1V9ٺ\^'`(Y'&%Л20U_*$tDALt,]N*/:$$<] 7 \T9Κ0pڏ}|p\;I vC9+qN?qBٌxL22>+rn m&gᴃﰺGԶʏ~kAV `GݪlMʹO#g[~팕W6|fa1!藭hDO_ K<ޠm _*u:\}iяNe;T0ur֎˟bE1=`G0]pbPʚB5GxɜR Xh1{a׎|DZaC[L/v񒰍*pL2]*Q6k2P6JCɦN7;B +Gtie# 77d#yQP;^載Ӳm<24LZSڳiنTWnsN-5{6L4טw2Sۙv?4Xuʡ}N$Ϫg},zqq%Mݍpozqoq{>mT3G/SЅOo>37;ɷ\+n>c]kϏg,:h_)/o{aDY5sfJgoڳ2緯m̚OfG=Wk{un7-dz`Rz_StF807oDФAd"W-F# +@#Ed!~[ O2

      G!Ov +rW!SV G\y1 +qj;uR= RP,Ex?\>Ainj72R|NMQtN +@BFq$zŰr.:T1;-!Zx\~CS*OôS"od9C3V8p|fxMOyzL4};.Nqo8aHVoYJ-$fP"Kot4n.AAB%CFH48Sq885?U.|J /v%oۡbv;qr!]7b j y絍0$(h1?Җee#Vm-"کbd鼕mIզMx=C֙Sl)uR.?U}{ +,KWiٟ><;yfL D:^W r"ENu2:[aX:s`Tz{>Z@{kt揩:zH!эnэӡy%W-4xxHFüRޥv]Oެ˃!Пg4Zލ\\GG:m߅jʤ‹vZ m9Fޚ`ȍQO?d: 4ńj{")zڮiEY4gKz}+So@C[إwH])=;#ޚTtnoin$bes \jGѕTROfbHfX$/9(rF[DMʹF%{qKhO^b~Imb):Ba8}a={wѼԮwn >)nnaN3vvm6`û|u< m;Oscw-l?Yl?ɖktذ۠۰K1k9.sW*Kݍg aP%!"E!/9'GH.!B|BZ<(E]MU}{.x ~ ^Yp\sy10dh:+U!/ %! &!!B$!B,B\WO ~΃Yn,+,+?g3)yNʜ2))3.eFLB2J IR}S+YMȸF֠%8΂jÊ5G v RpRo3ƛGm{tcκL GRoMOM=?wތpoV>j F#4ݑHr2Dž.[OW8'[=|E*³/s{yۼm<'yfܮ7E3䄻KxY[o$U_tnlTa]a$[E Rwi=gYh +yv?KX%> +stream +H]oWǟ~ffggvwfvzv۵ޝk&qBHRRD&MIC#JJ"q!qE%rHHHH ̬~.8?sΜs<8 /^Y]].H}tG`ko|9؟޹꟮q gwpw߿s; ȯ7onǧ k~~J8{>ߎ|`oߺ*~׃; y};P(#9'u9s`O<>Ր`.T!؅]4}wsnhxKWgO;Kn! =}0θF;A15/.xq^2,MV}Ю %BZ-4F-Tn &\raL +AN"$Om Q,gLtAp#\7ӻ<|wRqQYE=5[}7 +YeT(=0*DUI8Yo%q_hҘl|*9ish"'4 jY ]tiwu$&#G0^Ps,F!\TNSMiLX} j +˃똽D9~iO`t 6"&:u\"4Gr_:aY*oF}AR\ oS,FA%飳]m)^.fچɐT{WMQ~SMqxd)V#zK6}YrRE>*xѮ2r)t$4p1,Ssp 76(23ܴ,łTԜ,I7܃^}{+^O"4qt#ºx-*!8ǗX;xW~b7>QINZ+K~zJpot-dk7K]֍]i;9RhU_m ]D0ЪOK<ħ&;ArEo),0uCCVk*2## EWxco=go7èt?T3Q}.<,ثE0bTNnEB{d A'%Ʋpu>+}M9Ab~Աqu }yTf5,bC;jCH6k,Ս9?MoEgwgg_M։7I2 q:ue7-X +PŢ0)!rUۺ[,GjAp;7H|\UQEQyL^*8Ӫ \5ЇƄ<\ޚ M\캚59oX&d[[9hSRKVdՈ:Y9B. DYB2=6:-1)y|#ixrEmt; kެ8l|ry/?|2ظVdۓiU>=vӚ0{/VѶ +1kE+1oY9Ly NhGf7 +^ML'=|5^\<}EB`!GI`a?΅`ʙxE^km934m1Lm:Wgѝ> +endobj +4729 0 obj +<< +/A 972 0 R +/P 4623 0 R +/S /Normal +>> +endobj +4730 0 obj +<< +/A 972 0 R +/P 4624 0 R +/S /Normal +>> +endobj +4731 0 obj +<< +/A 4788 0 R +/P 4625 0 R +/S /Normal +>> +endobj +4732 0 obj +<< +/A 973 0 R +/P 4626 0 R +/S /Normal +>> +endobj +4733 0 obj +<< +/A 973 0 R +/P 4627 0 R +/S /Normal +>> +endobj +4734 0 obj +<< +/A 973 0 R +/P 4628 0 R +/S /Normal +>> +endobj +4735 0 obj +<< +/A 4788 0 R +/P 4629 0 R +/S /Normal +>> +endobj +4736 0 obj +<< +/A 973 0 R +/P 4630 0 R +/S /Normal +>> +endobj +4737 0 obj +<< +/A 973 0 R +/P 4631 0 R +/S /Normal +>> +endobj +4738 0 obj +<< +/A 973 0 R +/P 4632 0 R +/S /Normal +>> +endobj +4739 0 obj +<< +/A 972 0 R +/P 4633 0 R +/S /Normal +>> +endobj +4740 0 obj +<< +/A 973 0 R +/P 4634 0 R +/S /Normal +>> +endobj +4741 0 obj +<< +/A 3299 0 R +/P 4635 0 R +/S /Normal +>> +endobj +4742 0 obj +<< +/A 3299 0 R +/P 4636 0 R +/S /Normal +>> +endobj +4743 0 obj +<< +/A 3299 0 R +/P 4637 0 R +/S /Normal +>> +endobj +4744 0 obj +<< +/A 3299 0 R +/P 4638 0 R +/S /Normal +>> +endobj +4745 0 obj +<< +/A 3299 0 R +/P 4639 0 R +/S /Normal +>> +endobj +4746 0 obj +<< +/A 3299 0 R +/P 4640 0 R +/S /Normal +>> +endobj +4747 0 obj +<< +/A 3299 0 R +/P 4641 0 R +/S /Normal +>> +endobj +4748 0 obj +<< +/A 3299 0 R +/P 4642 0 R +/S /Normal +>> +endobj +4749 0 obj +<< +/A 3299 0 R +/P 4643 0 R +/S /Normal +>> +endobj +4750 0 obj +<< +/A 973 0 R +/P 4644 0 R +/S /Normal +>> +endobj +4751 0 obj +<< +/A 973 0 R +/P 4645 0 R +/S /Normal +>> +endobj +4752 0 obj +<< +/A 973 0 R +/P 4646 0 R +/S /Normal +>> +endobj +4753 0 obj +<< +/P 4647 0 R +/S /header +>> +endobj +4754 0 obj +<< +/P 4648 0 R +/S /header +>> +endobj +4755 0 obj +<< +/P 4649 0 R +/S /header +>> +endobj +4756 0 obj +<< +/P 4650 0 R +/S /header +>> +endobj +4757 0 obj +<< +/P 4651 0 R +/S /header +>> +endobj +4758 0 obj +<< +/P 4652 0 R +/S /header +>> +endobj +4759 0 obj +<< +/P 4653 0 R +/S /header +>> +endobj +4760 0 obj +<< +/P 4654 0 R +/S /header +>> +endobj +4761 0 obj +<< +/P 4655 0 R +/S /header +>> +endobj +4762 0 obj +<< +/P 4656 0 R +/S /header +>> +endobj +4763 0 obj +<< +/P 4657 0 R +/S /header +>> +endobj +4764 0 obj +<< +/P 4658 0 R +/S /header +>> +endobj +4765 0 obj +<< +/P 4659 0 R +/S /header +>> +endobj +4766 0 obj +<< +/P 4660 0 R +/S /header +>> +endobj +4767 0 obj +<< +/P 4661 0 R +/S /header +>> +endobj +4768 0 obj +<< +/A 972 0 R +/P 4662 0 R +/S /header +>> +endobj +4769 0 obj +<< +/P 4663 0 R +/S /header +>> +endobj +4770 0 obj +<< +/P 4664 0 R +/S /header +>> +endobj +4771 0 obj +<< +/A 972 0 R +/P 4665 0 R +/S /header +>> +endobj +4772 0 obj +<< +/P 4666 0 R +/S /header +>> +endobj +4773 0 obj +<< +/First 4789 0 R +/Parent 4699 0 R +/A 4790 0 R +/Next 4775 0 R +/Count 4 +/Last 4791 0 R +/Title +>> +endobj +4774 0 obj +<< +/D [26 0 R /XYZ 0 692 null] +/S /GoTo +>> +endobj +4775 0 obj +<< +/Parent 4699 0 R +/A 4792 0 R +/Prev 4773 0 R +/Title +>> +endobj +4776 0 obj +<< +/First 4793 0 R +/Parent 4701 0 R +/A 4794 0 R +/Next 4795 0 R +/Count 2 +/Last 4796 0 R +/Title +>> +endobj +4777 0 obj +<< +/D [29 0 R /XYZ 0 736 null] +/S /GoTo +>> +endobj +4778 0 obj +<< +/Parent 4701 0 R +/A 4797 0 R +/Prev 4798 0 R +/Title +>> +endobj +4779 0 obj +<< +/D [28 0 R /XYZ 0 768 null] +/S /GoTo +>> +endobj +4780 0 obj +<< +/Parent 4707 0 R +/A 4799 0 R +/Next 4800 0 R +/Title +>> +endobj +4781 0 obj +<< +/D [34 0 R /XYZ 0 595 null] +/S /GoTo +>> +endobj +4782 0 obj +<< +/Parent 4707 0 R +/A 4801 0 R +/Prev 4802 0 R +/Title +>> +endobj +4783 0 obj +<< +/First 4803 0 R +/Parent 4709 0 R +/A 4804 0 R +/Count 12 +/Last 4805 0 R +/Title +>> +endobj +4784 0 obj +<< +/D [38 0 R /XYZ 0 341 null] +/S /GoTo +>> +endobj +4785 0 obj +<< +/D [47 0 R /XYZ 0 710 null] +/S /GoTo +>> +endobj +4786 0 obj +<< +/D [32 0 R /XYZ 0 599 null] +/S /GoTo +>> +endobj +4787 0 obj +<< +/D [33 0 R /XYZ 0 768 null] +/S /GoTo +>> +endobj +4788 0 obj +<< +/SpaceAfter 0.0 +/TextAlign /Justify +/O /Layout +/WritingMode /LrTb +/SpaceBefore 0.0 +/TextIndent 10.0 +/EndIndent 0.0 +/StartIndent 0.0 +>> +endobj +4789 0 obj +<< +/Parent 4773 0 R +/A 4806 0 R +/Next 4807 0 R +/Title +>> +endobj +4790 0 obj +<< +/D [26 0 R /XYZ 0 586 null] +/S /GoTo +>> +endobj +4791 0 obj +<< +/Parent 4773 0 R +/A 4808 0 R +/Prev 4809 0 R +/Title +>> +endobj +4792 0 obj +<< +/D [27 0 R /XYZ 0 307 null] +/S /GoTo +>> +endobj +4793 0 obj +<< +/Parent 4776 0 R +/A 4810 0 R +/Next 4796 0 R +/Title +>> +endobj +4794 0 obj +<< +/D [29 0 R /XYZ 0 636 null] +/S /GoTo +>> +endobj +4795 0 obj +<< +/Parent 4701 0 R +/A 4811 0 R +/Next 4812 0 R +/Prev 4776 0 R +/Title +>> +endobj +4796 0 obj +<< +/Parent 4776 0 R +/A 4813 0 R +/Prev 4793 0 R +/Title +>> +endobj +4797 0 obj +<< +/D [31 0 R /XYZ 0 633 null] +/S /GoTo +>> +endobj +4798 0 obj +<< +/Parent 4701 0 R +/A 4814 0 R +/Next 4778 0 R +/Prev 4815 0 R +/Title +>> +endobj +4799 0 obj +<< +/D [34 0 R /XYZ 0 264 null] +/S /GoTo +>> +endobj +4800 0 obj +<< +/Parent 4707 0 R +/A 4816 0 R +/Next 4817 0 R +/Prev 4780 0 R +/Title +>> +endobj +4801 0 obj +<< +/D [38 0 R /XYZ 0 669 null] +/S /GoTo +>> +endobj +4802 0 obj +<< +/Parent 4707 0 R +/A 4818 0 R +/Next 4782 0 R +/Prev 4819 0 R +/Title +>> +endobj +4803 0 obj +<< +/Parent 4783 0 R +/A 4820 0 R +/Next 4821 0 R +/Title +>> +endobj +4804 0 obj +<< +/D [38 0 R /XYZ 0 283 null] +/S /GoTo +>> +endobj +4805 0 obj +<< +/Parent 4783 0 R +/A 4822 0 R +/Prev 4823 0 R +/Title +>> +endobj +4806 0 obj +<< +/D [26 0 R /XYZ 0 396 null] +/S /GoTo +>> +endobj +4807 0 obj +<< +/Parent 4773 0 R +/A 4824 0 R +/Next 4809 0 R +/Prev 4789 0 R +/Title +>> +endobj +4808 0 obj +<< +/D [27 0 R /XYZ 0 709 null] +/S /GoTo +>> +endobj +4809 0 obj +<< +/Parent 4773 0 R +/A 4825 0 R +/Next 4791 0 R +/Prev 4807 0 R +/Title +>> +endobj +4810 0 obj +<< +/D [29 0 R /XYZ 0 533 null] +/S /GoTo +>> +endobj +4811 0 obj +<< +/D [29 0 R /XYZ 0 277 null] +/S /GoTo +>> +endobj +4812 0 obj +<< +/First 4826 0 R +/Parent 4701 0 R +/A 4827 0 R +/Next 4828 0 R +/Count 3 +/Last 4829 0 R +/Prev 4795 0 R +/Title +>> +endobj +4813 0 obj +<< +/D [29 0 R /XYZ 0 366 null] +/S /GoTo +>> +endobj +4814 0 obj +<< +/D [31 0 R /XYZ 0 768 null] +/S /GoTo +>> +endobj +4815 0 obj +<< +/Parent 4701 0 R +/A 4830 0 R +/Next 4798 0 R +/Prev 4828 0 R +/Title +>> +endobj +4816 0 obj +<< +/D [35 0 R /XYZ 0 597 null] +/S /GoTo +>> +endobj +4817 0 obj +<< +/Parent 4707 0 R +/A 4831 0 R +/Next 4832 0 R +/Prev 4800 0 R +/Title +>> +endobj +4818 0 obj +<< +/D [37 0 R /XYZ 0 570 null] +/S /GoTo +>> +endobj +4819 0 obj +<< +/Parent 4707 0 R +/A 4833 0 R +/Next 4802 0 R +/Prev 4832 0 R +/Title +>> +endobj +4820 0 obj +<< +/D [39 0 R /XYZ 0 582 null] +/S /GoTo +>> +endobj +4821 0 obj +<< +/Parent 4783 0 R +/A 4834 0 R +/Next 4835 0 R +/Prev 4803 0 R +/Title +>> +endobj +4822 0 obj +<< +/D [46 0 R /XYZ 0 533 null] +/S /GoTo +>> +endobj +4823 0 obj +<< +/Parent 4783 0 R +/A 4836 0 R +/Next 4805 0 R +/Prev 4837 0 R +/Title +>> +endobj +4824 0 obj +<< +/D [26 0 R /XYZ 0 273 null] +/S /GoTo +>> +endobj +4825 0 obj +<< +/D [27 0 R /XYZ 0 769 null] +/S /GoTo +>> +endobj +4826 0 obj +<< +/Parent 4812 0 R +/A 4838 0 R +/Next 4839 0 R +/Title +>> +endobj +4827 0 obj +<< +/D [29 0 R /XYZ 0 158 null] +/S /GoTo +>> +endobj +4828 0 obj +<< +/Parent 4701 0 R +/A 4840 0 R +/Next 4815 0 R +/Prev 4812 0 R +/Title +>> +endobj +4829 0 obj +<< +/Parent 4812 0 R +/A 4841 0 R +/Prev 4839 0 R +/Title +>> +endobj +4830 0 obj +<< +/D [30 0 R /XYZ 0 260 null] +/S /GoTo +>> +endobj +4831 0 obj +<< +/D [35 0 R /XYZ 0 252 null] +/S /GoTo +>> +endobj +4832 0 obj +<< +/Parent 4707 0 R +/A 4842 0 R +/Next 4819 0 R +/Prev 4817 0 R +/Title +>> +endobj +4833 0 obj +<< +/D [36 0 R /XYZ 0 434 null] +/S /GoTo +>> +endobj +4834 0 obj +<< +/D [40 0 R /XYZ 0 731 null] +/S /GoTo +>> +endobj +4835 0 obj +<< +/Parent 4783 0 R +/A 4843 0 R +/Next 4844 0 R +/Prev 4821 0 R +/Title +>> +endobj +4836 0 obj +<< +/D [45 0 R /XYZ 0 221 null] +/S /GoTo +>> +endobj +4837 0 obj +<< +/Parent 4783 0 R +/A 4845 0 R +/Next 4823 0 R +/Prev 4846 0 R +/Title +>> +endobj +4838 0 obj +<< +/D [30 0 R /XYZ 0 725 null] +/S /GoTo +>> +endobj +4839 0 obj +<< +/Parent 4812 0 R +/A 4847 0 R +/Next 4829 0 R +/Prev 4826 0 R +/Title +>> +endobj +4840 0 obj +<< +/D [30 0 R /XYZ 0 459 null] +/S /GoTo +>> +endobj +4841 0 obj +<< +/D [30 0 R /XYZ 0 547 null] +/S /GoTo +>> +endobj +4842 0 obj +<< +/D [36 0 R /XYZ 0 477 null] +/S /GoTo +>> +endobj +4843 0 obj +<< +/D [40 0 R /XYZ 0 211 null] +/S /GoTo +>> +endobj +4844 0 obj +<< +/Parent 4783 0 R +/A 4848 0 R +/Next 4849 0 R +/Prev 4835 0 R +/Title +>> +endobj +4845 0 obj +<< +/D [45 0 R /XYZ 0 581 null] +/S /GoTo +>> +endobj +4846 0 obj +<< +/Parent 4783 0 R +/A 4850 0 R +/Next 4837 0 R +/Prev 4851 0 R +/Title +>> +endobj +4847 0 obj +<< +/D [30 0 R /XYZ 0 636 null] +/S /GoTo +>> +endobj +4848 0 obj +<< +/D [41 0 R /XYZ 0 470 null] +/S /GoTo +>> +endobj +4849 0 obj +<< +/Parent 4783 0 R +/A 4852 0 R +/Next 4853 0 R +/Prev 4844 0 R +/Title +>> +endobj +4850 0 obj +<< +/D [44 0 R /XYZ 0 254 null] +/S /GoTo +>> +endobj +4851 0 obj +<< +/Parent 4783 0 R +/A 4854 0 R +/Next 4846 0 R +/Prev 4855 0 R +/Title +>> +endobj +4852 0 obj +<< +/D [42 0 R /XYZ 0 769 null] +/S /GoTo +>> +endobj +4853 0 obj +<< +/Parent 4783 0 R +/A 4856 0 R +/Next 4855 0 R +/Prev 4849 0 R +/Title +>> +endobj +4854 0 obj +<< +/D [44 0 R /XYZ 0 676 null] +/S /GoTo +>> +endobj +4855 0 obj +<< +/Parent 4783 0 R +/A 4857 0 R +/Next 4851 0 R +/Prev 4853 0 R +/Title +>> +endobj +4856 0 obj +<< +/D [42 0 R /XYZ 0 233 null] +/S /GoTo +>> +endobj +4857 0 obj +<< +/D [43 0 R /XYZ 0 405 null] +/S /GoTo +>> +endobj +xref +0 4858 +0000000000 65535 f +0000000015 00000 n +0000000653 00000 n +0000000725 00000 n +0000005213 00000 n +0000005293 00000 n +0000005469 00000 n +0000005579 00000 n +0000000342 00000 n +0000005617 00000 n +0000005741 00000 n +0000005878 00000 n +0000006015 00000 n +0000006152 00000 n +0000006232 00000 n +0000012150 00000 n +0000012196 00000 n +0000012982 00000 n +0000013010 00000 n +0000013117 00000 n +0000013176 00000 n +0000013301 00000 n +0000013900 00000 n +0000014417 00000 n +0000015142 00000 n +0000015615 00000 n +0000016087 00000 n +0000016574 00000 n +0000017047 00000 n +0000017493 00000 n +0000017978 00000 n +0000018477 00000 n +0000018923 00000 n +0000019410 00000 n +0000019869 00000 n +0000020369 00000 n +0000020828 00000 n +0000021287 00000 n +0000021746 00000 n +0000022218 00000 n +0000022677 00000 n +0000023136 00000 n +0000023595 00000 n +0000024054 00000 n +0000024513 00000 n +0000024972 00000 n +0000025431 00000 n +0000025903 00000 n +0000026375 00000 n +0000026848 00000 n +0000027315 00000 n +0000027782 00000 n +0000028255 00000 n +0000028919 00000 n +0000028988 00000 n +0000029057 00000 n +0000029127 00000 n +0000029197 00000 n +0000029267 00000 n +0000029337 00000 n +0000029417 00000 n +0000029487 00000 n +0000029557 00000 n +0000029638 00000 n +0000029708 00000 n +0000029778 00000 n +0000029848 00000 n +0000029918 00000 n +0000029988 00000 n +0000030058 00000 n +0000030138 00000 n +0000030208 00000 n +0000030279 00000 n +0000030363 00000 n +0000030434 00000 n +0000030505 00000 n +0000030576 00000 n +0000030647 00000 n +0000030718 00000 n +0000030789 00000 n +0000030860 00000 n +0000030930 00000 n +0000031274 00000 n +0000031346 00000 n +0000031422 00000 n +0000031493 00000 n +0000031569 00000 n +0000031640 00000 n +0000031711 00000 n +0000031787 00000 n +0000031858 00000 n +0000031929 00000 n +0000032000 00000 n +0000032071 00000 n +0000032143 00000 n +0000032215 00000 n +0000032287 00000 n +0000032359 00000 n +0000032431 00000 n +0000032503 00000 n +0000032575 00000 n +0000032648 00000 n +0000032721 00000 n +0000032794 00000 n +0000032866 00000 n +0000032938 00000 n +0000033015 00000 n +0000033086 00000 n +0000033157 00000 n +0000033229 00000 n +0000033301 00000 n +0000033373 00000 n +0000033454 00000 n +0000033525 00000 n +0000033597 00000 n +0000033669 00000 n +0000033741 00000 n +0000033813 00000 n +0000033886 00000 n +0000033959 00000 n +0000034032 00000 n +0000034105 00000 n +0000034178 00000 n +0000034251 00000 n +0000034324 00000 n +0000034396 00000 n +0000034469 00000 n +0000034542 00000 n +0000034615 00000 n +0000034688 00000 n +0000034761 00000 n +0000034834 00000 n +0000034907 00000 n +0000034980 00000 n +0000035053 00000 n +0000035126 00000 n +0000035203 00000 n +0000035280 00000 n +0000035351 00000 n +0000035426 00000 n +0000035503 00000 n +0000035575 00000 n +0000035644 00000 n +0000035717 00000 n +0000035795 00000 n +0000035868 00000 n +0000035941 00000 n +0000036019 00000 n +0000036092 00000 n +0000036165 00000 n +0000036251 00000 n +0000036328 00000 n +0000036400 00000 n +0000036477 00000 n +0000036528 00000 n +0000036597 00000 n +0000036648 00000 n +0000036717 00000 n +0000036768 00000 n +0000036837 00000 n +0000036916 00000 n +0000036990 00000 n +0000037059 00000 n +0000037133 00000 n +0000037210 00000 n +0000037287 00000 n +0000037359 00000 n +0000037431 00000 n +0000037503 00000 n +0000037575 00000 n +0000037647 00000 n +0000037719 00000 n +0000037791 00000 n +0000037863 00000 n +0000037936 00000 n +0000038009 00000 n +0000038082 00000 n +0000038155 00000 n +0000038228 00000 n +0000038301 00000 n +0000038374 00000 n +0000038447 00000 n +0000038520 00000 n +0000038593 00000 n +0000038666 00000 n +0000038739 00000 n +0000038812 00000 n +0000038885 00000 n +0000038958 00000 n +0000039031 00000 n +0000039104 00000 n +0000039177 00000 n +0000039250 00000 n +0000039323 00000 n +0000039396 00000 n +0000039469 00000 n +0000039542 00000 n +0000039615 00000 n +0000039688 00000 n +0000039761 00000 n +0000039834 00000 n +0000039907 00000 n +0000039980 00000 n +0000040053 00000 n +0000040126 00000 n +0000040197 00000 n +0000040274 00000 n +0000040346 00000 n +0000040423 00000 n +0000040495 00000 n +0000040572 00000 n +0000040644 00000 n +0000040716 00000 n +0000040788 00000 n +0000040865 00000 n +0000040938 00000 n +0000041016 00000 n +0000041089 00000 n +0000041162 00000 n +0000041240 00000 n +0000041313 00000 n +0000041385 00000 n +0000041462 00000 n +0000041534 00000 n +0000041611 00000 n +0000041683 00000 n +0000041755 00000 n +0000041832 00000 n +0000041904 00000 n +0000041981 00000 n +0000042052 00000 n +0000042125 00000 n +0000042194 00000 n +0000042267 00000 n +0000042347 00000 n +0000042425 00000 n +0000042497 00000 n +0000042570 00000 n +0000042642 00000 n +0000042715 00000 n +0000042792 00000 n +0000042864 00000 n +0000042936 00000 n +0000043013 00000 n +0000043085 00000 n +0000043156 00000 n +0000043227 00000 n +0000043298 00000 n +0000043369 00000 n +0000043440 00000 n +0000043512 00000 n +0000043584 00000 n +0000043656 00000 n +0000043728 00000 n +0000043800 00000 n +0000043872 00000 n +0000043944 00000 n +0000044016 00000 n +0000044088 00000 n +0000044160 00000 n +0000044232 00000 n +0000044304 00000 n +0000044376 00000 n +0000044448 00000 n +0000044520 00000 n +0000044592 00000 n +0000044664 00000 n +0000044736 00000 n +0000044808 00000 n +0000044880 00000 n +0000044952 00000 n +0000045024 00000 n +0000045096 00000 n +0000045168 00000 n +0000045240 00000 n +0000045317 00000 n +0000045389 00000 n +0000045466 00000 n +0000045538 00000 n +0000045628 00000 n +0000045697 00000 n +0000045770 00000 n +0000045839 00000 n +0000045911 00000 n +0000045988 00000 n +0000046060 00000 n +0000046146 00000 n +0000046217 00000 n +0000046288 00000 n +0000046359 00000 n +0000046431 00000 n +0000046682 00000 n +0000046755 00000 n +0000046828 00000 n +0000046901 00000 n +0000046974 00000 n +0000047047 00000 n +0000047120 00000 n +0000047193 00000 n +0000047266 00000 n +0000047339 00000 n +0000047416 00000 n +0000047488 00000 n +0000047560 00000 n +0000047637 00000 n +0000047714 00000 n +0000047785 00000 n +0000047857 00000 n +0000047929 00000 n +0000048001 00000 n +0000048072 00000 n +0000048141 00000 n +0000048213 00000 n +0000048282 00000 n +0000048355 00000 n +0000048428 00000 n +0000048501 00000 n +0000048573 00000 n +0000048645 00000 n +0000048717 00000 n +0000048789 00000 n +0000048867 00000 n +0000048940 00000 n +0000049013 00000 n +0000049086 00000 n +0000049159 00000 n +0000049231 00000 n +0000049300 00000 n +0000049372 00000 n +0000049443 00000 n +0000049512 00000 n +0000049585 00000 n +0000049658 00000 n +0000049730 00000 n +0000049802 00000 n +0000049874 00000 n +0000049946 00000 n +0000050024 00000 n +0000050097 00000 n +0000050170 00000 n +0000050243 00000 n +0000050316 00000 n +0000050388 00000 n +0000050457 00000 n +0000050529 00000 n +0000050598 00000 n +0000050671 00000 n +0000050744 00000 n +0000050816 00000 n +0000050888 00000 n +0000050960 00000 n +0000051032 00000 n +0000051104 00000 n +0000051182 00000 n +0000051255 00000 n +0000051328 00000 n +0000051401 00000 n +0000051474 00000 n +0000051546 00000 n +0000051615 00000 n +0000051688 00000 n +0000051759 00000 n +0000051828 00000 n +0000051901 00000 n +0000051974 00000 n +0000052047 00000 n +0000052119 00000 n +0000052192 00000 n +0000052264 00000 n +0000052336 00000 n +0000052408 00000 n +0000052480 00000 n +0000052549 00000 n +0000052627 00000 n +0000052705 00000 n +0000052778 00000 n +0000052851 00000 n +0000052924 00000 n +0000052997 00000 n +0000053069 00000 n +0000053138 00000 n +0000053210 00000 n +0000053279 00000 n +0000053352 00000 n +0000053425 00000 n +0000053497 00000 n +0000053569 00000 n +0000053641 00000 n +0000053713 00000 n +0000053785 00000 n +0000053857 00000 n +0000053928 00000 n +0000053997 00000 n +0000054069 00000 n +0000054147 00000 n +0000054220 00000 n +0000054293 00000 n +0000054366 00000 n +0000054439 00000 n +0000054512 00000 n +0000054585 00000 n +0000054658 00000 n +0000054731 00000 n +0000054803 00000 n +0000054872 00000 n +0000054944 00000 n +0000055013 00000 n +0000055086 00000 n +0000055159 00000 n +0000055232 00000 n +0000055305 00000 n +0000055374 00000 n +0000055445 00000 n +0000055516 00000 n +0000055587 00000 n +0000055658 00000 n +0000055729 00000 n +0000055806 00000 n +0000055878 00000 n +0000055950 00000 n +0000056022 00000 n +0000056094 00000 n +0000056166 00000 n +0000056235 00000 n +0000056307 00000 n +0000056376 00000 n +0000056449 00000 n +0000056522 00000 n +0000056594 00000 n +0000056666 00000 n +0000056738 00000 n +0000056810 00000 n +0000056888 00000 n +0000056966 00000 n +0000057039 00000 n +0000057112 00000 n +0000057185 00000 n +0000057258 00000 n +0000057330 00000 n +0000057399 00000 n +0000057471 00000 n +0000057540 00000 n +0000057612 00000 n +0000057684 00000 n +0000057756 00000 n +0000057828 00000 n +0000057901 00000 n +0000057973 00000 n +0000058045 00000 n +0000058117 00000 n +0000058189 00000 n +0000058261 00000 n +0000058339 00000 n +0000058412 00000 n +0000058485 00000 n +0000058557 00000 n +0000058630 00000 n +0000058702 00000 n +0000058771 00000 n +0000058843 00000 n +0000058912 00000 n +0000058984 00000 n +0000059053 00000 n +0000059125 00000 n +0000059194 00000 n +0000059267 00000 n +0000059340 00000 n +0000059413 00000 n +0000059487 00000 n +0000059561 00000 n +0000059634 00000 n +0000059707 00000 n +0000059780 00000 n +0000059853 00000 n +0000059924 00000 n +0000060001 00000 n +0000060073 00000 n +0000060145 00000 n +0000060217 00000 n +0000060289 00000 n +0000060360 00000 n +0000060429 00000 n +0000060501 00000 n +0000060570 00000 n +0000060642 00000 n +0000060711 00000 n +0000060783 00000 n +0000060852 00000 n +0000060925 00000 n +0000060998 00000 n +0000061071 00000 n +0000061144 00000 n +0000061217 00000 n +0000061289 00000 n +0000061361 00000 n +0000061433 00000 n +0000061505 00000 n +0000061583 00000 n +0000061656 00000 n +0000061729 00000 n +0000061802 00000 n +0000061875 00000 n +0000061947 00000 n +0000062016 00000 n +0000062089 00000 n +0000062161 00000 n +0000062230 00000 n +0000062303 00000 n +0000062376 00000 n +0000062449 00000 n +0000062522 00000 n +0000062595 00000 n +0000062667 00000 n +0000062739 00000 n +0000062811 00000 n +0000062883 00000 n +0000062961 00000 n +0000063034 00000 n +0000063107 00000 n +0000063180 00000 n +0000063253 00000 n +0000063325 00000 n +0000063394 00000 n +0000063466 00000 n +0000063535 00000 n +0000063608 00000 n +0000063681 00000 n +0000063754 00000 n +0000063826 00000 n +0000063898 00000 n +0000063970 00000 n +0000064042 00000 n +0000064119 00000 n +0000064191 00000 n +0000064263 00000 n +0000064335 00000 n +0000064407 00000 n +0000064478 00000 n +0000064547 00000 n +0000064620 00000 n +0000064692 00000 n +0000064761 00000 n +0000064833 00000 n +0000064902 00000 n +0000064974 00000 n +0000065043 00000 n +0000065116 00000 n +0000065189 00000 n +0000065262 00000 n +0000065335 00000 n +0000065408 00000 n +0000065481 00000 n +0000065553 00000 n +0000065625 00000 n +0000065697 00000 n +0000065769 00000 n +0000065847 00000 n +0000065920 00000 n +0000065993 00000 n +0000066066 00000 n +0000066139 00000 n +0000066212 00000 n +0000066281 00000 n +0000066353 00000 n +0000066424 00000 n +0000066493 00000 n +0000066565 00000 n +0000066634 00000 n +0000066706 00000 n +0000066775 00000 n +0000066848 00000 n +0000066921 00000 n +0000066994 00000 n +0000067067 00000 n +0000067140 00000 n +0000067212 00000 n +0000067284 00000 n +0000067356 00000 n +0000067428 00000 n +0000067506 00000 n +0000067579 00000 n +0000067652 00000 n +0000067725 00000 n +0000067798 00000 n +0000067870 00000 n +0000067939 00000 n +0000068012 00000 n +0000068084 00000 n +0000068153 00000 n +0000068227 00000 n +0000068301 00000 n +0000068375 00000 n +0000068449 00000 n +0000068522 00000 n +0000068594 00000 n +0000068665 00000 n +0000068736 00000 n +0000068807 00000 n +0000068878 00000 n +0000068955 00000 n +0000069027 00000 n +0000069099 00000 n +0000069171 00000 n +0000069243 00000 n +0000069315 00000 n +0000069384 00000 n +0000069457 00000 n +0000069529 00000 n +0000069598 00000 n +0000069671 00000 n +0000069744 00000 n +0000069817 00000 n +0000069890 00000 n +0000069962 00000 n +0000070035 00000 n +0000070107 00000 n +0000070179 00000 n +0000070251 00000 n +0000070323 00000 n +0000070401 00000 n +0000070474 00000 n +0000070547 00000 n +0000070620 00000 n +0000070693 00000 n +0000070765 00000 n +0000070834 00000 n +0000070906 00000 n +0000070975 00000 n +0000071048 00000 n +0000071121 00000 n +0000071194 00000 n +0000071266 00000 n +0000071339 00000 n +0000071411 00000 n +0000071483 00000 n +0000071555 00000 n +0000071633 00000 n +0000071706 00000 n +0000071779 00000 n +0000071852 00000 n +0000071925 00000 n +0000071997 00000 n +0000072066 00000 n +0000072138 00000 n +0000072207 00000 n +0000072280 00000 n +0000072353 00000 n +0000072426 00000 n +0000072498 00000 n +0000072570 00000 n +0000072642 00000 n +0000072714 00000 n +0000072786 00000 n +0000072864 00000 n +0000072937 00000 n +0000073010 00000 n +0000073083 00000 n +0000073156 00000 n +0000073228 00000 n +0000073297 00000 n +0000073369 00000 n +0000073438 00000 n +0000073511 00000 n +0000073584 00000 n +0000073657 00000 n +0000073730 00000 n +0000073802 00000 n +0000073874 00000 n +0000073946 00000 n +0000074018 00000 n +0000074096 00000 n +0000074169 00000 n +0000074242 00000 n +0000074315 00000 n +0000074388 00000 n +0000074460 00000 n +0000074529 00000 n +0000074602 00000 n +0000074674 00000 n +0000074743 00000 n +0000074817 00000 n +0000074891 00000 n +0000074965 00000 n +0000075039 00000 n +0000075113 00000 n +0000075187 00000 n +0000075260 00000 n +0000075334 00000 n +0000075407 00000 n +0000075480 00000 n +0000075557 00000 n +0000075634 00000 n +0000075706 00000 n +0000075778 00000 n +0000075850 00000 n +0000075922 00000 n +0000075993 00000 n +0000076062 00000 n +0000076134 00000 n +0000076203 00000 n +0000076276 00000 n +0000076349 00000 n +0000076421 00000 n +0000076493 00000 n +0000076565 00000 n +0000076637 00000 n +0000076710 00000 n +0000076783 00000 n +0000076856 00000 n +0000076929 00000 n +0000077002 00000 n +0000077075 00000 n +0000077148 00000 n +0000077221 00000 n +0000077294 00000 n +0000077367 00000 n +0000077440 00000 n +0000077513 00000 n +0000077586 00000 n +0000077659 00000 n +0000077732 00000 n +0000077805 00000 n +0000077878 00000 n +0000077951 00000 n +0000078024 00000 n +0000078097 00000 n +0000078169 00000 n +0000078246 00000 n +0000078317 00000 n +0000078394 00000 n +0000078465 00000 n +0000078536 00000 n +0000078607 00000 n +0000078678 00000 n +0000078749 00000 n +0000078820 00000 n +0000078891 00000 n +0000078963 00000 n +0000079035 00000 n +0000079107 00000 n +0000079179 00000 n +0000079251 00000 n +0000079323 00000 n +0000079395 00000 n +0000079467 00000 n +0000079539 00000 n +0000079611 00000 n +0000079683 00000 n +0000079755 00000 n +0000079827 00000 n +0000079899 00000 n +0000079971 00000 n +0000080043 00000 n +0000080115 00000 n +0000080187 00000 n +0000080259 00000 n +0000080331 00000 n +0000080403 00000 n +0000080475 00000 n +0000080547 00000 n +0000080619 00000 n +0000080691 00000 n +0000080781 00000 n +0000080858 00000 n +0000080940 00000 n +0000081011 00000 n +0000081088 00000 n +0000081165 00000 n +0000081234 00000 n +0000081311 00000 n +0000081380 00000 n +0000081452 00000 n +0000081524 00000 n +0000081596 00000 n +0000081668 00000 n +0000081740 00000 n +0000081817 00000 n +0000081894 00000 n +0000081977 00000 n +0000082054 00000 n +0000082125 00000 n +0000082196 00000 n +0000082267 00000 n +0000082338 00000 n +0000082410 00000 n +0000082482 00000 n +0000082554 00000 n +0000082626 00000 n +0000082698 00000 n +0000082770 00000 n +0000082842 00000 n +0000082914 00000 n +0000082985 00000 n +0000083057 00000 n +0000084015 00000 n +0000103079 00000 n +0000103139 00000 n +0000103262 00000 n +0000103388 00000 n +0000103448 00000 n +0000103642 00000 n +0000103817 00000 n +0000103872 00000 n +0000103927 00000 n +0000104536 00000 n +0000105790 00000 n +0000106992 00000 n +0000216825 00000 n +0000218390 00000 n +0000221069 00000 n +0000221560 00000 n +0000221930 00000 n +0000222076 00000 n +0000222220 00000 n +0000222366 00000 n +0000222522 00000 n +0000222675 00000 n +0000222722 00000 n +0000222808 00000 n +0000222886 00000 n +0000222964 00000 n +0000223042 00000 n +0000223120 00000 n +0000223198 00000 n +0000223276 00000 n +0000223354 00000 n +0000223432 00000 n +0000223542 00000 n +0000223597 00000 n +0000224500 00000 n +0000249851 00000 n +0000252564 00000 n +0000252848 00000 n +0000252951 00000 n +0000253100 00000 n +0000253246 00000 n +0000253418 00000 n +0000253590 00000 n +0000253764 00000 n +0000253938 00000 n +0000254112 00000 n +0000254286 00000 n +0000254461 00000 n +0000254637 00000 n +0000254812 00000 n +0000254986 00000 n +0000255161 00000 n +0000255337 00000 n +0000255513 00000 n +0000255688 00000 n +0000255863 00000 n +0000256039 00000 n +0000256215 00000 n +0000256391 00000 n +0000256567 00000 n +0000256744 00000 n +0000256921 00000 n +0000257098 00000 n +0000257275 00000 n +0000257452 00000 n +0000257629 00000 n +0000257806 00000 n +0000257983 00000 n +0000258160 00000 n +0000258337 00000 n +0000258514 00000 n +0000258691 00000 n +0000258868 00000 n +0000259045 00000 n +0000259222 00000 n +0000259399 00000 n +0000259454 00000 n +0000260617 00000 n +0000280120 00000 n +0000280175 00000 n +0000281716 00000 n +0000310334 00000 n +0000310680 00000 n +0000310735 00000 n +0000311947 00000 n +0000325533 00000 n +0000325694 00000 n +0000325749 00000 n +0000328365 00000 n +0000356807 00000 n +0000356862 00000 n +0000362110 00000 n +0000383778 00000 n +0000383833 00000 n +0000384807 00000 n +0000391025 00000 n +0000391080 00000 n +0000392065 00000 n +0000422659 00000 n +0000422714 00000 n +0000424164 00000 n +0000462387 00000 n +0000462553 00000 n +0000462690 00000 n +0000462745 00000 n +0000463649 00000 n +0000475584 00000 n +0000475639 00000 n +0000477611 00000 n +0000506144 00000 n +0000506296 00000 n +0000506351 00000 n +0000507410 00000 n +0000533936 00000 n +0000533991 00000 n +0000536209 00000 n +0000560394 00000 n +0000560449 00000 n +0000562970 00000 n +0000594385 00000 n +0000594440 00000 n +0000597313 00000 n +0000629101 00000 n +0000629156 00000 n +0000634516 00000 n +0000667925 00000 n +0000667980 00000 n +0000670286 00000 n +0000701829 00000 n +0000701884 00000 n +0000704356 00000 n +0000740144 00000 n +0000740199 00000 n +0000742505 00000 n +0000771346 00000 n +0000771401 00000 n +0000773740 00000 n +0000808890 00000 n +0000808945 00000 n +0000811625 00000 n +0000845836 00000 n +0000845891 00000 n +0000848699 00000 n +0000885897 00000 n +0000885952 00000 n +0000888281 00000 n +0000921518 00000 n +0000921573 00000 n +0000923767 00000 n +0000955031 00000 n +0000955086 00000 n +0000957880 00000 n +0000994198 00000 n +0000994253 00000 n +0000996076 00000 n +0001012771 00000 n +0001012826 00000 n +0001013713 00000 n +0001015323 00000 n +0001015378 00000 n +0001015944 00000 n +0001017185 00000 n +0001109151 00000 n +0001109206 00000 n +0001109787 00000 n +0001111036 00000 n +0001177130 00000 n +0001177185 00000 n +0001181161 00000 n +0001200267 00000 n +0001200322 00000 n +0001201237 00000 n +0001204318 00000 n +0001205564 00000 n +0001212913 00000 n +0001218267 00000 n +0001218370 00000 n +0001218586 00000 n +0001218739 00000 n +0001218893 00000 n +0001218972 00000 n +0001219025 00000 n +0001219186 00000 n +0001219341 00000 n +0001219502 00000 n +0001219561 00000 n +0001219718 00000 n +0001219874 00000 n +0001219954 00000 n +0001220111 00000 n +0001220177 00000 n +0001220243 00000 n +0001220309 00000 n +0001220375 00000 n +0001220441 00000 n +0001220507 00000 n +0001220573 00000 n +0001220639 00000 n +0001220705 00000 n +0001220771 00000 n +0001220837 00000 n +0001220903 00000 n +0001220969 00000 n +0001221035 00000 n +0001221101 00000 n +0001221167 00000 n +0001221234 00000 n +0001221301 00000 n +0001221368 00000 n +0001221435 00000 n +0001221502 00000 n +0001221569 00000 n +0001221636 00000 n +0001221703 00000 n +0001221770 00000 n +0001221837 00000 n +0001221904 00000 n +0001221971 00000 n +0001222038 00000 n +0001222105 00000 n +0001222172 00000 n +0001222239 00000 n +0001222306 00000 n +0001222373 00000 n +0001222440 00000 n +0001222595 00000 n +0001222751 00000 n +0001222907 00000 n +0001223062 00000 n +0001223218 00000 n +0001223373 00000 n +0001223529 00000 n +0001223686 00000 n +0001223844 00000 n +0001224001 00000 n +0001224158 00000 n +0001224315 00000 n +0001224472 00000 n +0001224623 00000 n +0001224744 00000 n +0001224900 00000 n +0001225055 00000 n +0001225210 00000 n +0001225366 00000 n +0001225499 00000 n +0001225603 00000 n +0001225759 00000 n +0001225914 00000 n +0001226037 00000 n +0001226091 00000 n +0001226221 00000 n +0001226325 00000 n +0001226379 00000 n +0001226512 00000 n +0001226598 00000 n +0001226652 00000 n +0001226780 00000 n +0001226893 00000 n +0001227026 00000 n +0001227130 00000 n +0001227260 00000 n +0001227328 00000 n +0001227485 00000 n +0001227539 00000 n +0001227593 00000 n +0001227647 00000 n +0001227701 00000 n +0001227857 00000 n +0001227986 00000 n +0001228043 00000 n +0001228199 00000 n +0001228330 00000 n +0001228470 00000 n +0001228524 00000 n +0001228578 00000 n +0001228632 00000 n +0001228686 00000 n +0001228740 00000 n +0001228794 00000 n +0001228848 00000 n +0001228902 00000 n +0001228956 00000 n +0001229010 00000 n +0001229064 00000 n +0001229118 00000 n +0001229172 00000 n +0001229226 00000 n +0001229280 00000 n +0001229334 00000 n +0001229388 00000 n +0001229442 00000 n +0001229496 00000 n +0001229550 00000 n +0001229604 00000 n +0001229658 00000 n +0001229712 00000 n +0001229868 00000 n +0001230024 00000 n +0001230180 00000 n +0001230311 00000 n +0001230388 00000 n +0001230520 00000 n +0001230597 00000 n +0001230753 00000 n +0001230909 00000 n +0001231067 00000 n +0001231223 00000 n +0001231354 00000 n +0001231431 00000 n +0001231563 00000 n +0001231640 00000 n +0001231797 00000 n +0001231928 00000 n +0001232005 00000 n +0001232137 00000 n +0001232214 00000 n +0001232370 00000 n +0001232526 00000 n +0001232659 00000 n +0001232736 00000 n +0001232868 00000 n +0001232945 00000 n +0001233102 00000 n +0001233228 00000 n +0001233314 00000 n +0001233472 00000 n +0001233604 00000 n +0001233681 00000 n +0001233812 00000 n +0001233889 00000 n +0001234046 00000 n +0001234202 00000 n +0001234332 00000 n +0001234454 00000 n +0001234610 00000 n +0001234766 00000 n +0001234923 00000 n +0001235080 00000 n +0001235212 00000 n +0001235289 00000 n +0001235420 00000 n +0001235497 00000 n +0001235626 00000 n +0001235757 00000 n +0001235914 00000 n +0001236046 00000 n +0001236123 00000 n +0001236254 00000 n +0001236331 00000 n +0001236489 00000 n +0001236620 00000 n +0001236697 00000 n +0001236790 00000 n +0001236867 00000 n +0001236999 00000 n +0001237076 00000 n +0001237208 00000 n +0001237285 00000 n +0001237416 00000 n +0001237493 00000 n +0001237625 00000 n +0001237702 00000 n +0001237860 00000 n +0001237992 00000 n +0001238069 00000 n +0001238200 00000 n +0001238277 00000 n +0001238409 00000 n +0001238486 00000 n +0001238618 00000 n +0001238695 00000 n +0001238853 00000 n +0001239011 00000 n +0001239137 00000 n +0001239214 00000 n +0001239372 00000 n +0001239503 00000 n +0001239580 00000 n +0001239738 00000 n +0001239894 00000 n +0001240026 00000 n +0001240103 00000 n +0001240235 00000 n +0001240312 00000 n +0001240444 00000 n +0001240521 00000 n +0001240653 00000 n +0001240730 00000 n +0001240861 00000 n +0001240938 00000 n +0001241070 00000 n +0001241147 00000 n +0001241303 00000 n +0001241436 00000 n +0001241513 00000 n +0001241645 00000 n +0001241722 00000 n +0001241853 00000 n +0001241930 00000 n +0001242062 00000 n +0001242139 00000 n +0001242300 00000 n +0001242432 00000 n +0001242509 00000 n +0001242640 00000 n +0001242717 00000 n +0001242849 00000 n +0001242926 00000 n +0001243057 00000 n +0001243134 00000 n +0001243266 00000 n +0001243343 00000 n +0001243469 00000 n +0001243546 00000 n +0001243677 00000 n +0001243754 00000 n +0001243886 00000 n +0001243963 00000 n +0001244056 00000 n +0001244133 00000 n +0001244265 00000 n +0001244342 00000 n +0001244473 00000 n +0001244550 00000 n +0001244681 00000 n +0001244758 00000 n +0001244918 00000 n +0001245074 00000 n +0001245206 00000 n +0001245283 00000 n +0001245414 00000 n +0001245491 00000 n +0001245647 00000 n +0001245728 00000 n +0001245809 00000 n +0001245940 00000 n +0001246107 00000 n +0001246240 00000 n +0001246407 00000 n +0001246562 00000 n +0001246718 00000 n +0001246875 00000 n +0001246956 00000 n +0001247081 00000 n +0001247203 00000 n +0001247274 00000 n +0001247345 00000 n +0001247416 00000 n +0001247487 00000 n +0001247558 00000 n +0001247629 00000 n +0001247700 00000 n +0001247771 00000 n +0001247842 00000 n +0001247914 00000 n +0001247986 00000 n +0001248058 00000 n +0001248130 00000 n +0001248202 00000 n +0001248274 00000 n +0001248346 00000 n +0001248419 00000 n +0001248492 00000 n +0001248565 00000 n +0001248638 00000 n +0001248711 00000 n +0001248784 00000 n +0001248857 00000 n +0001248930 00000 n +0001249003 00000 n +0001249076 00000 n +0001249149 00000 n +0001249222 00000 n +0001249295 00000 n +0001249368 00000 n +0001249441 00000 n +0001249514 00000 n +0001249587 00000 n +0001249660 00000 n +0001249733 00000 n +0001249807 00000 n +0001249886 00000 n +0001249960 00000 n +0001250042 00000 n +0001250117 00000 n +0001250197 00000 n +0001250280 00000 n +0001250355 00000 n +0001250430 00000 n +0001250510 00000 n +0001250585 00000 n +0001250660 00000 n +0001250735 00000 n +0001250810 00000 n +0001250885 00000 n +0001250960 00000 n +0001251035 00000 n +0001251110 00000 n +0001251185 00000 n +0001251260 00000 n +0001251335 00000 n +0001251410 00000 n +0001251485 00000 n +0001251560 00000 n +0001251634 00000 n +0001251708 00000 n +0001251782 00000 n +0001251856 00000 n +0001251930 00000 n +0001252004 00000 n +0001252078 00000 n +0001252153 00000 n +0001252228 00000 n +0001252303 00000 n +0001252378 00000 n +0001252453 00000 n +0001252528 00000 n +0001252603 00000 n +0001252689 00000 n +0001252768 00000 n +0001252843 00000 n +0001252918 00000 n +0001252993 00000 n +0001253068 00000 n +0001253143 00000 n +0001253218 00000 n +0001253293 00000 n +0001253368 00000 n +0001253443 00000 n +0001253518 00000 n +0001253601 00000 n +0001253676 00000 n +0001253751 00000 n +0001253834 00000 n +0001253909 00000 n +0001253984 00000 n +0001254059 00000 n +0001254134 00000 n +0001254209 00000 n +0001254284 00000 n +0001254359 00000 n +0001254434 00000 n +0001254509 00000 n +0001254584 00000 n +0001254659 00000 n +0001254734 00000 n +0001254820 00000 n +0001254899 00000 n +0001254988 00000 n +0001255067 00000 n +0001255150 00000 n +0001255225 00000 n +0001255300 00000 n +0001255383 00000 n +0001255458 00000 n +0001255544 00000 n +0001255623 00000 n +0001255712 00000 n +0001255791 00000 n +0001255866 00000 n +0001255941 00000 n +0001256016 00000 n +0001256091 00000 n +0001256166 00000 n +0001256241 00000 n +0001256316 00000 n +0001256391 00000 n +0001256466 00000 n +0001256541 00000 n +0001256616 00000 n +0001256691 00000 n +0001256766 00000 n +0001256841 00000 n +0001256927 00000 n +0001257006 00000 n +0001257089 00000 n +0001257172 00000 n +0001257247 00000 n +0001257330 00000 n +0001257413 00000 n +0001257488 00000 n +0001257574 00000 n +0001257653 00000 n +0001257728 00000 n +0001257811 00000 n +0001257894 00000 n +0001257977 00000 n +0001258052 00000 n +0001258127 00000 n +0001258216 00000 n +0001258295 00000 n +0001258370 00000 n +0001258453 00000 n +0001258528 00000 n +0001258611 00000 n +0001258697 00000 n +0001258776 00000 n +0001258866 00000 n +0001258946 00000 n +0001259022 00000 n +0001259106 00000 n +0001259182 00000 n +0001259266 00000 n +0001259350 00000 n +0001259437 00000 n +0001259517 00000 n +0001259601 00000 n +0001259677 00000 n +0001259753 00000 n +0001259837 00000 n +0001259921 00000 n +0001259997 00000 n +0001260073 00000 n +0001260154 00000 n +0001260230 00000 n +0001260314 00000 n +0001260390 00000 n +0001260471 00000 n +0001260555 00000 n +0001260631 00000 n +0001260707 00000 n +0001260788 00000 n +0001260864 00000 n +0001260940 00000 n +0001261016 00000 n +0001261092 00000 n +0001261168 00000 n +0001261244 00000 n +0001261320 00000 n +0001261396 00000 n +0001261472 00000 n +0001261548 00000 n +0001261624 00000 n +0001261700 00000 n +0001261776 00000 n +0001261852 00000 n +0001261928 00000 n +0001262004 00000 n +0001262087 00000 n +0001262163 00000 n +0001262239 00000 n +0001262315 00000 n +0001262390 00000 n +0001262466 00000 n +0001262541 00000 n +0001262617 00000 n +0001262693 00000 n +0001262769 00000 n +0001262844 00000 n +0001262919 00000 n +0001262994 00000 n +0001263069 00000 n +0001263144 00000 n +0001263219 00000 n +0001263294 00000 n +0001263369 00000 n +0001263444 00000 n +0001263520 00000 n +0001263596 00000 n +0001263672 00000 n +0001263748 00000 n +0001263824 00000 n +0001263908 00000 n +0001263992 00000 n +0001264068 00000 n +0001264144 00000 n +0001264228 00000 n +0001264312 00000 n +0001264388 00000 n +0001264464 00000 n +0001264540 00000 n +0001264616 00000 n +0001264692 00000 n +0001264768 00000 n +0001264848 00000 n +0001264924 00000 n +0001265000 00000 n +0001265084 00000 n +0001265168 00000 n +0001265244 00000 n +0001265320 00000 n +0001265396 00000 n +0001265472 00000 n +0001265548 00000 n +0001265624 00000 n +0001265708 00000 n +0001265784 00000 n +0001265860 00000 n +0001265936 00000 n +0001266012 00000 n +0001266088 00000 n +0001266164 00000 n +0001266240 00000 n +0001266316 00000 n +0001266390 00000 n +0001266464 00000 n +0001266538 00000 n +0001266613 00000 n +0001266688 00000 n +0001266763 00000 n +0001266838 00000 n +0001266913 00000 n +0001266988 00000 n +0001267063 00000 n +0001267138 00000 n +0001267213 00000 n +0001267288 00000 n +0001267363 00000 n +0001267438 00000 n +0001267513 00000 n +0001267588 00000 n +0001267663 00000 n +0001267738 00000 n +0001267813 00000 n +0001267888 00000 n +0001267963 00000 n +0001268038 00000 n +0001268113 00000 n +0001268188 00000 n +0001268263 00000 n +0001268338 00000 n +0001268413 00000 n +0001268488 00000 n +0001268563 00000 n +0001268638 00000 n +0001268713 00000 n +0001268788 00000 n +0001268863 00000 n +0001268938 00000 n +0001269013 00000 n +0001269088 00000 n +0001269163 00000 n +0001269238 00000 n +0001269313 00000 n +0001269388 00000 n +0001269463 00000 n +0001269538 00000 n +0001269613 00000 n +0001269688 00000 n +0001269763 00000 n +0001269838 00000 n +0001269913 00000 n +0001269988 00000 n +0001270063 00000 n +0001270138 00000 n +0001270213 00000 n +0001270288 00000 n +0001270363 00000 n +0001270438 00000 n +0001270513 00000 n +0001270588 00000 n +0001270663 00000 n +0001270738 00000 n +0001270813 00000 n +0001270888 00000 n +0001270963 00000 n +0001271038 00000 n +0001271113 00000 n +0001271188 00000 n +0001271263 00000 n +0001271338 00000 n +0001271413 00000 n +0001271488 00000 n +0001271563 00000 n +0001271638 00000 n +0001271713 00000 n +0001271788 00000 n +0001271863 00000 n +0001271938 00000 n +0001272013 00000 n +0001272088 00000 n +0001272163 00000 n +0001272238 00000 n +0001272313 00000 n +0001272388 00000 n +0001272463 00000 n +0001272538 00000 n +0001272612 00000 n +0001272686 00000 n +0001272760 00000 n +0001272834 00000 n +0001272908 00000 n +0001272982 00000 n +0001273056 00000 n +0001273130 00000 n +0001273204 00000 n +0001273279 00000 n +0001273354 00000 n +0001273429 00000 n +0001273504 00000 n +0001273579 00000 n +0001273654 00000 n +0001273729 00000 n +0001273804 00000 n +0001273879 00000 n +0001273954 00000 n +0001274029 00000 n +0001274104 00000 n +0001274179 00000 n +0001274254 00000 n +0001274329 00000 n +0001274404 00000 n +0001274479 00000 n +0001274554 00000 n +0001274629 00000 n +0001274704 00000 n +0001274779 00000 n +0001274854 00000 n +0001274929 00000 n +0001275004 00000 n +0001275079 00000 n +0001275154 00000 n +0001275229 00000 n +0001275304 00000 n +0001275379 00000 n +0001275454 00000 n +0001275529 00000 n +0001275604 00000 n +0001275679 00000 n +0001275754 00000 n +0001275829 00000 n +0001275904 00000 n +0001275979 00000 n +0001276054 00000 n +0001276129 00000 n +0001276204 00000 n +0001276279 00000 n +0001276354 00000 n +0001276429 00000 n +0001276504 00000 n +0001276579 00000 n +0001276654 00000 n +0001276729 00000 n +0001276804 00000 n +0001276879 00000 n +0001276954 00000 n +0001277029 00000 n +0001277104 00000 n +0001277179 00000 n +0001277254 00000 n +0001277329 00000 n +0001277404 00000 n +0001277479 00000 n +0001277554 00000 n +0001277629 00000 n +0001277704 00000 n +0001277779 00000 n +0001277854 00000 n +0001277929 00000 n +0001278004 00000 n +0001278080 00000 n +0001278156 00000 n +0001278232 00000 n +0001278308 00000 n +0001278384 00000 n +0001278460 00000 n +0001278536 00000 n +0001278612 00000 n +0001278686 00000 n +0001278760 00000 n +0001278834 00000 n +0001278908 00000 n +0001278982 00000 n +0001279056 00000 n +0001279130 00000 n +0001279204 00000 n +0001279278 00000 n +0001279353 00000 n +0001279428 00000 n +0001279503 00000 n +0001279578 00000 n +0001279653 00000 n +0001279728 00000 n +0001279803 00000 n +0001279878 00000 n +0001279953 00000 n +0001280028 00000 n +0001280103 00000 n +0001280178 00000 n +0001280253 00000 n +0001280328 00000 n +0001280403 00000 n +0001280478 00000 n +0001280553 00000 n +0001280628 00000 n +0001280703 00000 n +0001280778 00000 n +0001280853 00000 n +0001280928 00000 n +0001281003 00000 n +0001281078 00000 n +0001281153 00000 n +0001281228 00000 n +0001281303 00000 n +0001281378 00000 n +0001281453 00000 n +0001281528 00000 n +0001281603 00000 n +0001281678 00000 n +0001281753 00000 n +0001281828 00000 n +0001281903 00000 n +0001281978 00000 n +0001282053 00000 n +0001282128 00000 n +0001282203 00000 n +0001282278 00000 n +0001282353 00000 n +0001282428 00000 n +0001282503 00000 n +0001282578 00000 n +0001282653 00000 n +0001282728 00000 n +0001282803 00000 n +0001282878 00000 n +0001282953 00000 n +0001283028 00000 n +0001283103 00000 n +0001283178 00000 n +0001283253 00000 n +0001283328 00000 n +0001283403 00000 n +0001283478 00000 n +0001283553 00000 n +0001283628 00000 n +0001283703 00000 n +0001283778 00000 n +0001283853 00000 n +0001283927 00000 n +0001284005 00000 n +0001284079 00000 n +0001284153 00000 n +0001284227 00000 n +0001284301 00000 n +0001284375 00000 n +0001284450 00000 n +0001284525 00000 n +0001284600 00000 n +0001284675 00000 n +0001284750 00000 n +0001284825 00000 n +0001284900 00000 n +0001284975 00000 n +0001285050 00000 n +0001285125 00000 n +0001285200 00000 n +0001285275 00000 n +0001285350 00000 n +0001285425 00000 n +0001285500 00000 n +0001285575 00000 n +0001285650 00000 n +0001285725 00000 n +0001285800 00000 n +0001285875 00000 n +0001285950 00000 n +0001286025 00000 n +0001286100 00000 n +0001286175 00000 n +0001286250 00000 n +0001286325 00000 n +0001286400 00000 n +0001286475 00000 n +0001286550 00000 n +0001286625 00000 n +0001286700 00000 n +0001286775 00000 n +0001286850 00000 n +0001286925 00000 n +0001287000 00000 n +0001287075 00000 n +0001287150 00000 n +0001287225 00000 n +0001287300 00000 n +0001287375 00000 n +0001287450 00000 n +0001287525 00000 n +0001287600 00000 n +0001287675 00000 n +0001287750 00000 n +0001287825 00000 n +0001287900 00000 n +0001287975 00000 n +0001288050 00000 n +0001288125 00000 n +0001288200 00000 n +0001288275 00000 n +0001288350 00000 n +0001288425 00000 n +0001288500 00000 n +0001288575 00000 n +0001288650 00000 n +0001288725 00000 n +0001288800 00000 n +0001288875 00000 n +0001288950 00000 n +0001289025 00000 n +0001289100 00000 n +0001289175 00000 n +0001289250 00000 n +0001289325 00000 n +0001289400 00000 n +0001289475 00000 n +0001289550 00000 n +0001289625 00000 n +0001289700 00000 n +0001289775 00000 n +0001289850 00000 n +0001289925 00000 n +0001290001 00000 n +0001290077 00000 n +0001290153 00000 n +0001290229 00000 n +0001290305 00000 n +0001290381 00000 n +0001290457 00000 n +0001290533 00000 n +0001290609 00000 n +0001290685 00000 n +0001290761 00000 n +0001290837 00000 n +0001290913 00000 n +0001290989 00000 n +0001291065 00000 n +0001291141 00000 n +0001291217 00000 n +0001291293 00000 n +0001291369 00000 n +0001291445 00000 n +0001291521 00000 n +0001291597 00000 n +0001291673 00000 n +0001291749 00000 n +0001291825 00000 n +0001291901 00000 n +0001291977 00000 n +0001292053 00000 n +0001292129 00000 n +0001292205 00000 n +0001292281 00000 n +0001292357 00000 n +0001292433 00000 n +0001292509 00000 n +0001292585 00000 n +0001292661 00000 n +0001292737 00000 n +0001292813 00000 n +0001292889 00000 n +0001292965 00000 n +0001293041 00000 n +0001293117 00000 n +0001293193 00000 n +0001293269 00000 n +0001293345 00000 n +0001293421 00000 n +0001293497 00000 n +0001293573 00000 n +0001293649 00000 n +0001293725 00000 n +0001293801 00000 n +0001293877 00000 n +0001293953 00000 n +0001294029 00000 n +0001294105 00000 n +0001294181 00000 n +0001294257 00000 n +0001294333 00000 n +0001294416 00000 n +0001294491 00000 n +0001294566 00000 n +0001294649 00000 n +0001294724 00000 n +0001294799 00000 n +0001294874 00000 n +0001294949 00000 n +0001295024 00000 n +0001295099 00000 n +0001295174 00000 n +0001295249 00000 n +0001295324 00000 n +0001295399 00000 n +0001295474 00000 n +0001295549 00000 n +0001295624 00000 n +0001295699 00000 n +0001295774 00000 n +0001295849 00000 n +0001295924 00000 n +0001295999 00000 n +0001296074 00000 n +0001296149 00000 n +0001296224 00000 n +0001296299 00000 n +0001296374 00000 n +0001296449 00000 n +0001296524 00000 n +0001296599 00000 n +0001296674 00000 n +0001296749 00000 n +0001296824 00000 n +0001296899 00000 n +0001296974 00000 n +0001297049 00000 n +0001297124 00000 n +0001297199 00000 n +0001297274 00000 n +0001297349 00000 n +0001297424 00000 n +0001297499 00000 n +0001297574 00000 n +0001297649 00000 n +0001297724 00000 n +0001297799 00000 n +0001297874 00000 n +0001297949 00000 n +0001298024 00000 n +0001298099 00000 n +0001298174 00000 n +0001298249 00000 n +0001298324 00000 n +0001298399 00000 n +0001298474 00000 n +0001298549 00000 n +0001298624 00000 n +0001298699 00000 n +0001298774 00000 n +0001298849 00000 n +0001298924 00000 n +0001298999 00000 n +0001299074 00000 n +0001299149 00000 n +0001299224 00000 n +0001299299 00000 n +0001299374 00000 n +0001299449 00000 n +0001299524 00000 n +0001299598 00000 n +0001299672 00000 n +0001299746 00000 n +0001299820 00000 n +0001299894 00000 n +0001299968 00000 n +0001300043 00000 n +0001300118 00000 n +0001300193 00000 n +0001300268 00000 n +0001300343 00000 n +0001300418 00000 n +0001300493 00000 n +0001300568 00000 n +0001300643 00000 n +0001300718 00000 n +0001300793 00000 n +0001300868 00000 n +0001300943 00000 n +0001301018 00000 n +0001301093 00000 n +0001301168 00000 n +0001301243 00000 n +0001301318 00000 n +0001301393 00000 n +0001301468 00000 n +0001301543 00000 n +0001301618 00000 n +0001301693 00000 n +0001301768 00000 n +0001301843 00000 n +0001301918 00000 n +0001301993 00000 n +0001302068 00000 n +0001302143 00000 n +0001302218 00000 n +0001302293 00000 n +0001302368 00000 n +0001302443 00000 n +0001302518 00000 n +0001302593 00000 n +0001302668 00000 n +0001302743 00000 n +0001302818 00000 n +0001302893 00000 n +0001302968 00000 n +0001303043 00000 n +0001303118 00000 n +0001303193 00000 n +0001303268 00000 n +0001303343 00000 n +0001303418 00000 n +0001303493 00000 n +0001303568 00000 n +0001303643 00000 n +0001303718 00000 n +0001303793 00000 n +0001303868 00000 n +0001303943 00000 n +0001304018 00000 n +0001304093 00000 n +0001304168 00000 n +0001304243 00000 n +0001304318 00000 n +0001304393 00000 n +0001304468 00000 n +0001304543 00000 n +0001304618 00000 n +0001304693 00000 n +0001304768 00000 n +0001304843 00000 n +0001304918 00000 n +0001304993 00000 n +0001305068 00000 n +0001305143 00000 n +0001305218 00000 n +0001305293 00000 n +0001305368 00000 n +0001305442 00000 n +0001305516 00000 n +0001305590 00000 n +0001305665 00000 n +0001305740 00000 n +0001305815 00000 n +0001305890 00000 n +0001305965 00000 n +0001306040 00000 n +0001306115 00000 n +0001306190 00000 n +0001306265 00000 n +0001306340 00000 n +0001306415 00000 n +0001306490 00000 n +0001306565 00000 n +0001306640 00000 n +0001306715 00000 n +0001306790 00000 n +0001306865 00000 n +0001306940 00000 n +0001307015 00000 n +0001307090 00000 n +0001307165 00000 n +0001307240 00000 n +0001307315 00000 n +0001307390 00000 n +0001307465 00000 n +0001307540 00000 n +0001307615 00000 n +0001307690 00000 n +0001307765 00000 n +0001307840 00000 n +0001307915 00000 n +0001307990 00000 n +0001308065 00000 n +0001308140 00000 n +0001308215 00000 n +0001308290 00000 n +0001308365 00000 n +0001308440 00000 n +0001308515 00000 n +0001308590 00000 n +0001308665 00000 n +0001308740 00000 n +0001308815 00000 n +0001308890 00000 n +0001308965 00000 n +0001309040 00000 n +0001309115 00000 n +0001309190 00000 n +0001309265 00000 n +0001309340 00000 n +0001309415 00000 n +0001309490 00000 n +0001309565 00000 n +0001309640 00000 n +0001309715 00000 n +0001309790 00000 n +0001309865 00000 n +0001309940 00000 n +0001310015 00000 n +0001310090 00000 n +0001310165 00000 n +0001310240 00000 n +0001310315 00000 n +0001310390 00000 n +0001310465 00000 n +0001310540 00000 n +0001310615 00000 n +0001310690 00000 n +0001310765 00000 n +0001310839 00000 n +0001310913 00000 n +0001310987 00000 n +0001311061 00000 n +0001311135 00000 n +0001311209 00000 n +0001311283 00000 n +0001311357 00000 n +0001311431 00000 n +0001311505 00000 n +0001311580 00000 n +0001311655 00000 n +0001311730 00000 n +0001311805 00000 n +0001311880 00000 n +0001311955 00000 n +0001312030 00000 n +0001312105 00000 n +0001312180 00000 n +0001312255 00000 n +0001312330 00000 n +0001312405 00000 n +0001312480 00000 n +0001312555 00000 n +0001312630 00000 n +0001312705 00000 n +0001312780 00000 n +0001312855 00000 n +0001312930 00000 n +0001313005 00000 n +0001313080 00000 n +0001313155 00000 n +0001313230 00000 n +0001313305 00000 n +0001313380 00000 n +0001313455 00000 n +0001313530 00000 n +0001313605 00000 n +0001313680 00000 n +0001313755 00000 n +0001313830 00000 n +0001313905 00000 n +0001313980 00000 n +0001314055 00000 n +0001314130 00000 n +0001314205 00000 n +0001314280 00000 n +0001314355 00000 n +0001314430 00000 n +0001314505 00000 n +0001314580 00000 n +0001314655 00000 n +0001314730 00000 n +0001314805 00000 n +0001314880 00000 n +0001314955 00000 n +0001315030 00000 n +0001315105 00000 n +0001315180 00000 n +0001315255 00000 n +0001315330 00000 n +0001315405 00000 n +0001315480 00000 n +0001315555 00000 n +0001315630 00000 n +0001315705 00000 n +0001315780 00000 n +0001315855 00000 n +0001315930 00000 n +0001316005 00000 n +0001316080 00000 n +0001316155 00000 n +0001316230 00000 n +0001316305 00000 n +0001316380 00000 n +0001316454 00000 n +0001316528 00000 n +0001316602 00000 n +0001316676 00000 n +0001316751 00000 n +0001316826 00000 n +0001316901 00000 n +0001316976 00000 n +0001317051 00000 n +0001317126 00000 n +0001317201 00000 n +0001317276 00000 n +0001317351 00000 n +0001317426 00000 n +0001317501 00000 n +0001317576 00000 n +0001317651 00000 n +0001317726 00000 n +0001317801 00000 n +0001317876 00000 n +0001317951 00000 n +0001318026 00000 n +0001318101 00000 n +0001318176 00000 n +0001318251 00000 n +0001318326 00000 n +0001318401 00000 n +0001318476 00000 n +0001318551 00000 n +0001318626 00000 n +0001318701 00000 n +0001318776 00000 n +0001318851 00000 n +0001318926 00000 n +0001319001 00000 n +0001319076 00000 n +0001319151 00000 n +0001319226 00000 n +0001319301 00000 n +0001319376 00000 n +0001319451 00000 n +0001319526 00000 n +0001319601 00000 n +0001319676 00000 n +0001319751 00000 n +0001319826 00000 n +0001319901 00000 n +0001319976 00000 n +0001320051 00000 n +0001320126 00000 n +0001320201 00000 n +0001320276 00000 n +0001320351 00000 n +0001320426 00000 n +0001320501 00000 n +0001320576 00000 n +0001320651 00000 n +0001320726 00000 n +0001320801 00000 n +0001320876 00000 n +0001320951 00000 n +0001321026 00000 n +0001321101 00000 n +0001321176 00000 n +0001321251 00000 n +0001321326 00000 n +0001321401 00000 n +0001321476 00000 n +0001321551 00000 n +0001321626 00000 n +0001321701 00000 n +0001321776 00000 n +0001321851 00000 n +0001321926 00000 n +0001322001 00000 n +0001322077 00000 n +0001322153 00000 n +0001322229 00000 n +0001322305 00000 n +0001322381 00000 n +0001322457 00000 n +0001322533 00000 n +0001322609 00000 n +0001322685 00000 n +0001322761 00000 n +0001322837 00000 n +0001322913 00000 n +0001322989 00000 n +0001323065 00000 n +0001323141 00000 n +0001323217 00000 n +0001323293 00000 n +0001323369 00000 n +0001323445 00000 n +0001323521 00000 n +0001323597 00000 n +0001323671 00000 n +0001323745 00000 n +0001323819 00000 n +0001323893 00000 n +0001323967 00000 n +0001324041 00000 n +0001324115 00000 n +0001324189 00000 n +0001324264 00000 n +0001324339 00000 n +0001324414 00000 n +0001324489 00000 n +0001324564 00000 n +0001324639 00000 n +0001324714 00000 n +0001324789 00000 n +0001324864 00000 n +0001324939 00000 n +0001325014 00000 n +0001325089 00000 n +0001325164 00000 n +0001325239 00000 n +0001325314 00000 n +0001325389 00000 n +0001325464 00000 n +0001325539 00000 n +0001325614 00000 n +0001325689 00000 n +0001325764 00000 n +0001325839 00000 n +0001325914 00000 n +0001325989 00000 n +0001326064 00000 n +0001326139 00000 n +0001326214 00000 n +0001326289 00000 n +0001326364 00000 n +0001326439 00000 n +0001326514 00000 n +0001326589 00000 n +0001326664 00000 n +0001326739 00000 n +0001326814 00000 n +0001326889 00000 n +0001326964 00000 n +0001327039 00000 n +0001327114 00000 n +0001327189 00000 n +0001327264 00000 n +0001327339 00000 n +0001327414 00000 n +0001327489 00000 n +0001327564 00000 n +0001327639 00000 n +0001327714 00000 n +0001327789 00000 n +0001327864 00000 n +0001327939 00000 n +0001328014 00000 n +0001328089 00000 n +0001328164 00000 n +0001328239 00000 n +0001328314 00000 n +0001328389 00000 n +0001328464 00000 n +0001328539 00000 n +0001328614 00000 n +0001328689 00000 n +0001328764 00000 n +0001328839 00000 n +0001328914 00000 n +0001328989 00000 n +0001329064 00000 n +0001329139 00000 n +0001329214 00000 n +0001329289 00000 n +0001329364 00000 n +0001329439 00000 n +0001329514 00000 n +0001329590 00000 n +0001329666 00000 n +0001329742 00000 n +0001329818 00000 n +0001329894 00000 n +0001329970 00000 n +0001330046 00000 n +0001330122 00000 n +0001330198 00000 n +0001330274 00000 n +0001330350 00000 n +0001330426 00000 n +0001330502 00000 n +0001330578 00000 n +0001330654 00000 n +0001330730 00000 n +0001330806 00000 n +0001330881 00000 n +0001330956 00000 n +0001331031 00000 n +0001331106 00000 n +0001331181 00000 n +0001331256 00000 n +0001331331 00000 n +0001331406 00000 n +0001331481 00000 n +0001331556 00000 n +0001331631 00000 n +0001331706 00000 n +0001331781 00000 n +0001331856 00000 n +0001331931 00000 n +0001332006 00000 n +0001332081 00000 n +0001332156 00000 n +0001332231 00000 n +0001332306 00000 n +0001332381 00000 n +0001332456 00000 n +0001332531 00000 n +0001332606 00000 n +0001332681 00000 n +0001332756 00000 n +0001332831 00000 n +0001332906 00000 n +0001332981 00000 n +0001333056 00000 n +0001333131 00000 n +0001333206 00000 n +0001333281 00000 n +0001333356 00000 n +0001333431 00000 n +0001333506 00000 n +0001333581 00000 n +0001333656 00000 n +0001333731 00000 n +0001333806 00000 n +0001333881 00000 n +0001333956 00000 n +0001334031 00000 n +0001334106 00000 n +0001334181 00000 n +0001334256 00000 n +0001334331 00000 n +0001334406 00000 n +0001334481 00000 n +0001334556 00000 n +0001334631 00000 n +0001334706 00000 n +0001334781 00000 n +0001334856 00000 n +0001334931 00000 n +0001335006 00000 n +0001335081 00000 n +0001335156 00000 n +0001335231 00000 n +0001335306 00000 n +0001335381 00000 n +0001335456 00000 n +0001335531 00000 n +0001335606 00000 n +0001335681 00000 n +0001335756 00000 n +0001335830 00000 n +0001335904 00000 n +0001335978 00000 n +0001336052 00000 n +0001336126 00000 n +0001336200 00000 n +0001336274 00000 n +0001336348 00000 n +0001336422 00000 n +0001336496 00000 n +0001336571 00000 n +0001336646 00000 n +0001336721 00000 n +0001336796 00000 n +0001336871 00000 n +0001336946 00000 n +0001337021 00000 n +0001337096 00000 n +0001337171 00000 n +0001337246 00000 n +0001337321 00000 n +0001337396 00000 n +0001337471 00000 n +0001337546 00000 n +0001337621 00000 n +0001337696 00000 n +0001337771 00000 n +0001337846 00000 n +0001337921 00000 n +0001337996 00000 n +0001338071 00000 n +0001338146 00000 n +0001338221 00000 n +0001338296 00000 n +0001338371 00000 n +0001338446 00000 n +0001338521 00000 n +0001338596 00000 n +0001338671 00000 n +0001338746 00000 n +0001338821 00000 n +0001338896 00000 n +0001338971 00000 n +0001339046 00000 n +0001339121 00000 n +0001339196 00000 n +0001339271 00000 n +0001339346 00000 n +0001339421 00000 n +0001339496 00000 n +0001339571 00000 n +0001339646 00000 n +0001339721 00000 n +0001339796 00000 n +0001339871 00000 n +0001339946 00000 n +0001340021 00000 n +0001340096 00000 n +0001340171 00000 n +0001340246 00000 n +0001340320 00000 n +0001340394 00000 n +0001340468 00000 n +0001340542 00000 n +0001340616 00000 n +0001340690 00000 n +0001340764 00000 n +0001340838 00000 n +0001340912 00000 n +0001340986 00000 n +0001341061 00000 n +0001341136 00000 n +0001341211 00000 n +0001341286 00000 n +0001341361 00000 n +0001341436 00000 n +0001341511 00000 n +0001341586 00000 n +0001341661 00000 n +0001341736 00000 n +0001341811 00000 n +0001341886 00000 n +0001341961 00000 n +0001342036 00000 n +0001342111 00000 n +0001342186 00000 n +0001342261 00000 n +0001342336 00000 n +0001342411 00000 n +0001342486 00000 n +0001342561 00000 n +0001342636 00000 n +0001342711 00000 n +0001342786 00000 n +0001342861 00000 n +0001342936 00000 n +0001343011 00000 n +0001343086 00000 n +0001343161 00000 n +0001343236 00000 n +0001343311 00000 n +0001343386 00000 n +0001343461 00000 n +0001343536 00000 n +0001343611 00000 n +0001343686 00000 n +0001343761 00000 n +0001343836 00000 n +0001343911 00000 n +0001343986 00000 n +0001344061 00000 n +0001344136 00000 n +0001344211 00000 n +0001344286 00000 n +0001344361 00000 n +0001344436 00000 n +0001344511 00000 n +0001344586 00000 n +0001344661 00000 n +0001344736 00000 n +0001344811 00000 n +0001344886 00000 n +0001344961 00000 n +0001345036 00000 n +0001345111 00000 n +0001345186 00000 n +0001345261 00000 n +0001345336 00000 n +0001345411 00000 n +0001345486 00000 n +0001345561 00000 n +0001345644 00000 n +0001345719 00000 n +0001345794 00000 n +0001345869 00000 n +0001345944 00000 n +0001346019 00000 n +0001346094 00000 n +0001346169 00000 n +0001346244 00000 n +0001346319 00000 n +0001346394 00000 n +0001346469 00000 n +0001346545 00000 n +0001346619 00000 n +0001346693 00000 n +0001346767 00000 n +0001346842 00000 n +0001346917 00000 n +0001346992 00000 n +0001347067 00000 n +0001347142 00000 n +0001347217 00000 n +0001347292 00000 n +0001347367 00000 n +0001347442 00000 n +0001347517 00000 n +0001347592 00000 n +0001347667 00000 n +0001347742 00000 n +0001347817 00000 n +0001347892 00000 n +0001347967 00000 n +0001348042 00000 n +0001348117 00000 n +0001348192 00000 n +0001348267 00000 n +0001348342 00000 n +0001348417 00000 n +0001348492 00000 n +0001348567 00000 n +0001348642 00000 n +0001348717 00000 n +0001348792 00000 n +0001348867 00000 n +0001348942 00000 n +0001349017 00000 n +0001349092 00000 n +0001349167 00000 n +0001349242 00000 n +0001349317 00000 n +0001349392 00000 n +0001349467 00000 n +0001349541 00000 n +0001349615 00000 n +0001349689 00000 n +0001349763 00000 n +0001349837 00000 n +0001349911 00000 n +0001349985 00000 n +0001350060 00000 n +0001350135 00000 n +0001350210 00000 n +0001350285 00000 n +0001350360 00000 n +0001350435 00000 n +0001350510 00000 n +0001350585 00000 n +0001350660 00000 n +0001350735 00000 n +0001350810 00000 n +0001350885 00000 n +0001350960 00000 n +0001351035 00000 n +0001351110 00000 n +0001351185 00000 n +0001351260 00000 n +0001351335 00000 n +0001351410 00000 n +0001351485 00000 n +0001351560 00000 n +0001351635 00000 n +0001351710 00000 n +0001351785 00000 n +0001351860 00000 n +0001351935 00000 n +0001352010 00000 n +0001352085 00000 n +0001352160 00000 n +0001352235 00000 n +0001352310 00000 n +0001352385 00000 n +0001352460 00000 n +0001352535 00000 n +0001352610 00000 n +0001352685 00000 n +0001352760 00000 n +0001352835 00000 n +0001352910 00000 n +0001352985 00000 n +0001353060 00000 n +0001353135 00000 n +0001353210 00000 n +0001353285 00000 n +0001353360 00000 n +0001353435 00000 n +0001353510 00000 n +0001353585 00000 n +0001353660 00000 n +0001353735 00000 n +0001353810 00000 n +0001353885 00000 n +0001353960 00000 n +0001354035 00000 n +0001354110 00000 n +0001354185 00000 n +0001354260 00000 n +0001354335 00000 n +0001354410 00000 n +0001354485 00000 n +0001354560 00000 n +0001354635 00000 n +0001354710 00000 n +0001354785 00000 n +0001354860 00000 n +0001354935 00000 n +0001355010 00000 n +0001355085 00000 n +0001355160 00000 n +0001355235 00000 n +0001355310 00000 n +0001355385 00000 n +0001355460 00000 n +0001355535 00000 n +0001355610 00000 n +0001355685 00000 n +0001355760 00000 n +0001355835 00000 n +0001355910 00000 n +0001355985 00000 n +0001356060 00000 n +0001356135 00000 n +0001356210 00000 n +0001356285 00000 n +0001356360 00000 n +0001356436 00000 n +0001356512 00000 n +0001356588 00000 n +0001356664 00000 n +0001356740 00000 n +0001356816 00000 n +0001356892 00000 n +0001356968 00000 n +0001357044 00000 n +0001357120 00000 n +0001357196 00000 n +0001357272 00000 n +0001357348 00000 n +0001357424 00000 n +0001357500 00000 n +0001357576 00000 n +0001357652 00000 n +0001357728 00000 n +0001357804 00000 n +0001357880 00000 n +0001357956 00000 n +0001358032 00000 n +0001358108 00000 n +0001358184 00000 n +0001358260 00000 n +0001358336 00000 n +0001358413 00000 n +0001358489 00000 n +0001358565 00000 n +0001358641 00000 n +0001358717 00000 n +0001358793 00000 n +0001358869 00000 n +0001358945 00000 n +0001359021 00000 n +0001359097 00000 n +0001359173 00000 n +0001359249 00000 n +0001359325 00000 n +0001359401 00000 n +0001359477 00000 n +0001359553 00000 n +0001359629 00000 n +0001359705 00000 n +0001359781 00000 n +0001359857 00000 n +0001359933 00000 n +0001360009 00000 n +0001360085 00000 n +0001360161 00000 n +0001360237 00000 n +0001360313 00000 n +0001360389 00000 n +0001360465 00000 n +0001360541 00000 n +0001360617 00000 n +0001360693 00000 n +0001360769 00000 n +0001360845 00000 n +0001360921 00000 n +0001360997 00000 n +0001361073 00000 n +0001361149 00000 n +0001361225 00000 n +0001361301 00000 n +0001361377 00000 n +0001361453 00000 n +0001361529 00000 n +0001361605 00000 n +0001361681 00000 n +0001361757 00000 n +0001361833 00000 n +0001361909 00000 n +0001361985 00000 n +0001362061 00000 n +0001362137 00000 n +0001362213 00000 n +0001362289 00000 n +0001362365 00000 n +0001362441 00000 n +0001362517 00000 n +0001362593 00000 n +0001362669 00000 n +0001362745 00000 n +0001362821 00000 n +0001362897 00000 n +0001362973 00000 n +0001363049 00000 n +0001363125 00000 n +0001363186 00000 n +0001363323 00000 n +0001363384 00000 n +0001363445 00000 n +0001363598 00000 n +0001363659 00000 n +0001363820 00000 n +0001363998 00000 n +0001364078 00000 n +0001364664 00000 n +0001364928 00000 n +0001365198 00000 n +0001365502 00000 n +0001368794 00000 n +0001368984 00000 n +0001369648 00000 n +0001370004 00000 n +0001370484 00000 n +0001371095 00000 n +0001371517 00000 n +0001372009 00000 n +0001372373 00000 n +0001372408 00000 n +0001372572 00000 n +0001372781 00000 n +0001373159 00000 n +0001373365 00000 n +0001373658 00000 n +0001373719 00000 n +0001373780 00000 n +0001373841 00000 n +0001373902 00000 n +0001373963 00000 n +0001374024 00000 n +0001374085 00000 n +0001374146 00000 n +0001374207 00000 n +0001374268 00000 n +0001374329 00000 n +0001374390 00000 n +0001374451 00000 n +0001374512 00000 n +0001374573 00000 n +0001374634 00000 n +0001374695 00000 n +0001374756 00000 n +0001374817 00000 n +0001374878 00000 n +0001374939 00000 n +0001375000 00000 n +0001375061 00000 n +0001375122 00000 n +0001375183 00000 n +0001375244 00000 n +0001375305 00000 n +0001375366 00000 n +0001375427 00000 n +0001375488 00000 n +0001375549 00000 n +0001375610 00000 n +0001375671 00000 n +0001375732 00000 n +0001375793 00000 n +0001376042 00000 n +0001376275 00000 n +0001376655 00000 n +0001376898 00000 n +0001377117 00000 n +0001377329 00000 n +0001377713 00000 n +0001377798 00000 n +0001377884 00000 n +0001378037 00000 n +0001378191 00000 n +0001378345 00000 n +0001378429 00000 n +0001378513 00000 n +0001378597 00000 n +0001378681 00000 n +0001378765 00000 n +0001378849 00000 n +0001378933 00000 n +0001379035 00000 n +0001379137 00000 n +0001379239 00000 n +0001379341 00000 n +0001379443 00000 n +0001379536 00000 n +0001379647 00000 n +0001379758 00000 n +0001379869 00000 n +0001379962 00000 n +0001380073 00000 n +0001380184 00000 n +0001380295 00000 n +0001380406 00000 n +0001380517 00000 n +0001380628 00000 n +0001380712 00000 n +0001380796 00000 n +0001380880 00000 n +0001380964 00000 n +0001381048 00000 n +0001381132 00000 n +0001381234 00000 n +0001381336 00000 n +0001381438 00000 n +0001381522 00000 n +0001381606 00000 n +0001381690 00000 n +0001381783 00000 n +0001381876 00000 n +0001381969 00000 n +0001382062 00000 n +0001382146 00000 n +0001382230 00000 n +0001382314 00000 n +0001382425 00000 n +0001382536 00000 n +0001382647 00000 n +0001382749 00000 n +0001382851 00000 n +0001382953 00000 n +0001383064 00000 n +0001383175 00000 n +0001383286 00000 n +0001383388 00000 n +0001383490 00000 n +0001383592 00000 n +0001383703 00000 n +0001383814 00000 n +0001383925 00000 n +0001384027 00000 n +0001384129 00000 n +0001384231 00000 n +0001384351 00000 n +0001384471 00000 n +0001384591 00000 n +0001384693 00000 n +0001384795 00000 n +0001384897 00000 n +0001384972 00000 n +0001385047 00000 n +0001385122 00000 n +0001385197 00000 n +0001385299 00000 n +0001385401 00000 n +0001385503 00000 n +0001385614 00000 n +0001385725 00000 n +0001385836 00000 n +0001385920 00000 n +0001386004 00000 n +0001386088 00000 n +0001386172 00000 n +0001386256 00000 n +0001386340 00000 n +0001386424 00000 n +0001386508 00000 n +0001386619 00000 n +0001386730 00000 n +0001386841 00000 n +0001386952 00000 n +0001387063 00000 n +0001387174 00000 n +0001387240 00000 n +0001387378 00000 n +0001387516 00000 n +0001387654 00000 n +0001387792 00000 n +0001387867 00000 n +0001388005 00000 n +0001388143 00000 n +0001388198 00000 n +0001388300 00000 n +0001388402 00000 n +0001388504 00000 n +0001388615 00000 n +0001388726 00000 n +0001388837 00000 n +0001388939 00000 n +0001389041 00000 n +0001389143 00000 n +0001389245 00000 n +0001389347 00000 n +0001389449 00000 n +0001389551 00000 n +0001389653 00000 n +0001389755 00000 n +0001389857 00000 n +0001389959 00000 n +0001390061 00000 n +0001390163 00000 n +0001390265 00000 n +0001390367 00000 n +0001390469 00000 n +0001390571 00000 n +0001390673 00000 n +0001390775 00000 n +0001390877 00000 n +0001390979 00000 n +0001391081 00000 n +0001391183 00000 n +0001391285 00000 n +0001391387 00000 n +0001391489 00000 n +0001391591 00000 n +0001391693 00000 n +0001391795 00000 n +0001391897 00000 n +0001392008 00000 n +0001392119 00000 n +0001392230 00000 n +0001392332 00000 n +0001392434 00000 n +0001392536 00000 n +0001392638 00000 n +0001392740 00000 n +0001392842 00000 n +0001392944 00000 n +0001393046 00000 n +0001393148 00000 n +0001393259 00000 n +0001393370 00000 n +0001393481 00000 n +0001393583 00000 n +0001393685 00000 n +0001393787 00000 n +0001393889 00000 n +0001393991 00000 n +0001394093 00000 n +0001394195 00000 n +0001394297 00000 n +0001394399 00000 n +0001394510 00000 n +0001394621 00000 n +0001394732 00000 n +0001394834 00000 n +0001394936 00000 n +0001395038 00000 n +0001395140 00000 n +0001395242 00000 n +0001395344 00000 n +0001395446 00000 n +0001395548 00000 n +0001395650 00000 n +0001395770 00000 n +0001395890 00000 n +0001396010 00000 n +0001396112 00000 n +0001396214 00000 n +0001396316 00000 n +0001396436 00000 n +0001396556 00000 n +0001396676 00000 n +0001396778 00000 n +0001396880 00000 n +0001396982 00000 n +0001397102 00000 n +0001397222 00000 n +0001397342 00000 n +0001397444 00000 n +0001397546 00000 n +0001397648 00000 n +0001397750 00000 n +0001397852 00000 n +0001397954 00000 n +0001398056 00000 n +0001398158 00000 n +0001398260 00000 n +0001398362 00000 n +0001398464 00000 n +0001398566 00000 n +0001398677 00000 n +0001398788 00000 n +0001398899 00000 n +0001399028 00000 n +0001399157 00000 n +0001399286 00000 n +0001399406 00000 n +0001399526 00000 n +0001399646 00000 n +0001399748 00000 n +0001399850 00000 n +0001399952 00000 n +0001400063 00000 n +0001400174 00000 n +0001400285 00000 n +0001400370 00000 n +0001400455 00000 n +0001400575 00000 n +0001400695 00000 n +0001400815 00000 n +0001400935 00000 n +0001401055 00000 n +0001401175 00000 n +0001401295 00000 n +0001401415 00000 n +0001401535 00000 n +0001401655 00000 n +0001401775 00000 n +0001401895 00000 n +0001402015 00000 n +0001402117 00000 n +0001402219 00000 n +0001402321 00000 n +0001402423 00000 n +0001402525 00000 n +0001402627 00000 n +0001402729 00000 n +0001402831 00000 n +0001402933 00000 n +0001403035 00000 n +0001403137 00000 n +0001403239 00000 n +0001403341 00000 n +0001403427 00000 n +0001403476 00000 n +0001403525 00000 n +0001403574 00000 n +0001403623 00000 n +0001403672 00000 n +0001403721 00000 n +0001403770 00000 n +0001403819 00000 n +0001403868 00000 n +0001403917 00000 n +0001403966 00000 n +0001404015 00000 n +0001404064 00000 n +0001404113 00000 n +0001404162 00000 n +0001404211 00000 n +0001404260 00000 n +0001404309 00000 n +0001404358 00000 n +0001404407 00000 n +0001404456 00000 n +0001404505 00000 n +0001404554 00000 n +0001404603 00000 n +0001404652 00000 n +0001404701 00000 n +0001404750 00000 n +0001404799 00000 n +0001404848 00000 n +0001404897 00000 n +0001404946 00000 n +0001404995 00000 n +0001405044 00000 n +0001405093 00000 n +0001405142 00000 n +0001405209 00000 n +0001405276 00000 n +0001405343 00000 n +0001405410 00000 n +0001405477 00000 n +0001405544 00000 n +0001405611 00000 n +0001405678 00000 n +0001405745 00000 n +0001405812 00000 n +0001405879 00000 n +0001405946 00000 n +0001406013 00000 n +0001406080 00000 n +0001406147 00000 n +0001406214 00000 n +0001406281 00000 n +0001406348 00000 n +0001406415 00000 n +0001406482 00000 n +0001406549 00000 n +0001406616 00000 n +0001406683 00000 n +0001406750 00000 n +0001406908 00000 n +0001406986 00000 n +0001407064 00000 n +0001407131 00000 n +0001407198 00000 n +0001407265 00000 n +0001407332 00000 n +0001407399 00000 n +0001407466 00000 n +0001407533 00000 n +0001407600 00000 n +0001407667 00000 n +0001407734 00000 n +0001407801 00000 n +0001407868 00000 n +0001407921 00000 n +0001407988 00000 n +0001408055 00000 n +0001408122 00000 n +0001408189 00000 n +0001408256 00000 n +0001408323 00000 n +0001408390 00000 n +0001408457 00000 n +0001408524 00000 n +0001408591 00000 n +0001408658 00000 n +0001408725 00000 n +0001408792 00000 n +0001408859 00000 n +0001408926 00000 n +0001408993 00000 n +0001409060 00000 n +0001409218 00000 n +0001409296 00000 n +0001409374 00000 n +0001409452 00000 n +0001409519 00000 n +0001409586 00000 n +0001409653 00000 n +0001409720 00000 n +0001409787 00000 n +0001409854 00000 n +0001409907 00000 n +0001409974 00000 n +0001410027 00000 n +0001410094 00000 n +0001410161 00000 n +0001410228 00000 n +0001410295 00000 n +0001410362 00000 n +0001410429 00000 n +0001410482 00000 n +0001410549 00000 n +0001410602 00000 n +0001410669 00000 n +0001410736 00000 n +0001410803 00000 n +0001410870 00000 n +0001410937 00000 n +0001411015 00000 n +0001411093 00000 n +0001411171 00000 n +0001411238 00000 n +0001411305 00000 n +0001411372 00000 n +0001411439 00000 n +0001411506 00000 n +0001411573 00000 n +0001411626 00000 n +0001411693 00000 n +0001411760 00000 n +0001411827 00000 n +0001411894 00000 n +0001411961 00000 n +0001412028 00000 n +0001412095 00000 n +0001412148 00000 n +0001412215 00000 n +0001412282 00000 n +0001412349 00000 n +0001412416 00000 n +0001412483 00000 n +0001412550 00000 n +0001412617 00000 n +0001412670 00000 n +0001412737 00000 n +0001412804 00000 n +0001412871 00000 n +0001412938 00000 n +0001413016 00000 n +0001413069 00000 n +0001413136 00000 n +0001413189 00000 n +0001413256 00000 n +0001413323 00000 n +0001413390 00000 n +0001413457 00000 n +0001413535 00000 n +0001413602 00000 n +0001413655 00000 n +0001413722 00000 n +0001413789 00000 n +0001413856 00000 n +0001413923 00000 n +0001413990 00000 n +0001414057 00000 n +0001414124 00000 n +0001414191 00000 n +0001414258 00000 n +0001414325 00000 n +0001414392 00000 n +0001414459 00000 n +0001414526 00000 n +0001414593 00000 n +0001414660 00000 n +0001414727 00000 n +0001414794 00000 n +0001414861 00000 n +0001414928 00000 n +0001414995 00000 n +0001415062 00000 n +0001415129 00000 n +0001415196 00000 n +0001415263 00000 n +0001415330 00000 n +0001415397 00000 n +0001415464 00000 n +0001415531 00000 n +0001415598 00000 n +0001415665 00000 n +0001415824 00000 n +0001415891 00000 n +0001416045 00000 n +0001416112 00000 n +0001416179 00000 n +0001416246 00000 n +0001416313 00000 n +0001416380 00000 n +0001416447 00000 n +0001416514 00000 n +0001416581 00000 n +0001416648 00000 n +0001416715 00000 n +0001416782 00000 n +0001416940 00000 n +0001417094 00000 n +0001417161 00000 n +0001417228 00000 n +0001417295 00000 n +0001417362 00000 n +0001417429 00000 n +0001417496 00000 n +0001417563 00000 n +0001417630 00000 n +0001417697 00000 n +0001417775 00000 n +0001417842 00000 n +0001417909 00000 n +0001417976 00000 n +0001418131 00000 n +0001418209 00000 n +0001418276 00000 n +0001418343 00000 n +0001418410 00000 n +0001418488 00000 n +0001418555 00000 n +0001418622 00000 n +0001418689 00000 n +0001418767 00000 n +0001418834 00000 n +0001418901 00000 n +0001418979 00000 n +0001419057 00000 n +0001419135 00000 n +0001419202 00000 n +0001419269 00000 n +0001419336 00000 n +0001419403 00000 n +0001419470 00000 n +0001419548 00000 n +0001419615 00000 n +0001419682 00000 n +0001419749 00000 n +0001419827 00000 n +0001419894 00000 n +0001419961 00000 n +0001420028 00000 n +0001420106 00000 n +0001420264 00000 n +0001420331 00000 n +0001420398 00000 n +0001420465 00000 n +0001420532 00000 n +0001420599 00000 n +0001420666 00000 n +0001420733 00000 n +0001420800 00000 n +0001420867 00000 n +0001420934 00000 n +0001421001 00000 n +0001421068 00000 n +0001421135 00000 n +0001421202 00000 n +0001421269 00000 n +0001421336 00000 n +0001421403 00000 n +0001421470 00000 n +0001421537 00000 n +0001421604 00000 n +0001421671 00000 n +0001421738 00000 n +0001421805 00000 n +0001421872 00000 n +0001421939 00000 n +0001422006 00000 n +0001422073 00000 n +0001422140 00000 n +0001422207 00000 n +0001422274 00000 n +0001422341 00000 n +0001422408 00000 n +0001422475 00000 n +0001422542 00000 n +0001422609 00000 n +0001422676 00000 n +0001422743 00000 n +0001422810 00000 n +0001422877 00000 n +0001422944 00000 n +0001423011 00000 n +0001423078 00000 n +0001423145 00000 n +0001423212 00000 n +0001423279 00000 n +0001423346 00000 n +0001423413 00000 n +0001423480 00000 n +0001423547 00000 n +0001423614 00000 n +0001423681 00000 n +0001423748 00000 n +0001423815 00000 n +0001423882 00000 n +0001423949 00000 n +0001424016 00000 n +0001424083 00000 n +0001424150 00000 n +0001424217 00000 n +0001424284 00000 n +0001424351 00000 n +0001424418 00000 n +0001424485 00000 n +0001424552 00000 n +0001424619 00000 n +0001424686 00000 n +0001424753 00000 n +0001424820 00000 n +0001424887 00000 n +0001424954 00000 n +0001425021 00000 n +0001425088 00000 n +0001425155 00000 n +0001425222 00000 n +0001425289 00000 n +0001425356 00000 n +0001425423 00000 n +0001425490 00000 n +0001425557 00000 n +0001425624 00000 n +0001425691 00000 n +0001425758 00000 n +0001425825 00000 n +0001425892 00000 n +0001425959 00000 n +0001426026 00000 n +0001426093 00000 n +0001426160 00000 n +0001426227 00000 n +0001426294 00000 n +0001426361 00000 n +0001426428 00000 n +0001426495 00000 n +0001426562 00000 n +0001426629 00000 n +0001426696 00000 n +0001426763 00000 n +0001426830 00000 n +0001426897 00000 n +0001426964 00000 n +0001427031 00000 n +0001427098 00000 n +0001427165 00000 n +0001427232 00000 n +0001427299 00000 n +0001427366 00000 n +0001427433 00000 n +0001427500 00000 n +0001427567 00000 n +0001427634 00000 n +0001427701 00000 n +0001427768 00000 n +0001427835 00000 n +0001427902 00000 n +0001427969 00000 n +0001428036 00000 n +0001428103 00000 n +0001428170 00000 n +0001428237 00000 n +0001428304 00000 n +0001428371 00000 n +0001428438 00000 n +0001428505 00000 n +0001428572 00000 n +0001428639 00000 n +0001428706 00000 n +0001428773 00000 n +0001428840 00000 n +0001428907 00000 n +0001428974 00000 n +0001429041 00000 n +0001429108 00000 n +0001429175 00000 n +0001429242 00000 n +0001429309 00000 n +0001429376 00000 n +0001429443 00000 n +0001429510 00000 n +0001429577 00000 n +0001429644 00000 n +0001429711 00000 n +0001429778 00000 n +0001429845 00000 n +0001429912 00000 n +0001429979 00000 n +0001430046 00000 n +0001430113 00000 n +0001430180 00000 n +0001430247 00000 n +0001430314 00000 n +0001430381 00000 n +0001430448 00000 n +0001430515 00000 n +0001430582 00000 n +0001430649 00000 n +0001430716 00000 n +0001430783 00000 n +0001430850 00000 n +0001430917 00000 n +0001430984 00000 n +0001431051 00000 n +0001431118 00000 n +0001431185 00000 n +0001431252 00000 n +0001431319 00000 n +0001431386 00000 n +0001431453 00000 n +0001431520 00000 n +0001431587 00000 n +0001431654 00000 n +0001431721 00000 n +0001431788 00000 n +0001431855 00000 n +0001431922 00000 n +0001431989 00000 n +0001432056 00000 n +0001432123 00000 n +0001432190 00000 n +0001432257 00000 n +0001432324 00000 n +0001432391 00000 n +0001432458 00000 n +0001432525 00000 n +0001432592 00000 n +0001432659 00000 n +0001432726 00000 n +0001432793 00000 n +0001432860 00000 n +0001432927 00000 n +0001432994 00000 n +0001433061 00000 n +0001433128 00000 n +0001433195 00000 n +0001433262 00000 n +0001433329 00000 n +0001433396 00000 n +0001433463 00000 n +0001433530 00000 n +0001433597 00000 n +0001433664 00000 n +0001433731 00000 n +0001433798 00000 n +0001433865 00000 n +0001433932 00000 n +0001433999 00000 n +0001434066 00000 n +0001434133 00000 n +0001434200 00000 n +0001434267 00000 n +0001434334 00000 n +0001434491 00000 n +0001434558 00000 n +0001434625 00000 n +0001434692 00000 n +0001434759 00000 n +0001434826 00000 n +0001434893 00000 n +0001434960 00000 n +0001435027 00000 n +0001435094 00000 n +0001435161 00000 n +0001435228 00000 n +0001435295 00000 n +0001435362 00000 n +0001435429 00000 n +0001435496 00000 n +0001435563 00000 n +0001435630 00000 n +0001435697 00000 n +0001435764 00000 n +0001435831 00000 n +0001435898 00000 n +0001435965 00000 n +0001436032 00000 n +0001436099 00000 n +0001436166 00000 n +0001436233 00000 n +0001436300 00000 n +0001436367 00000 n +0001436434 00000 n +0001436501 00000 n +0001436568 00000 n +0001436635 00000 n +0001436702 00000 n +0001436769 00000 n +0001436836 00000 n +0001436903 00000 n +0001436970 00000 n +0001437037 00000 n +0001437104 00000 n +0001437171 00000 n +0001437238 00000 n +0001437305 00000 n +0001437372 00000 n +0001437439 00000 n +0001437506 00000 n +0001437573 00000 n +0001437640 00000 n +0001437707 00000 n +0001437774 00000 n +0001437841 00000 n +0001437908 00000 n +0001437975 00000 n +0001438042 00000 n +0001438109 00000 n +0001438176 00000 n +0001438243 00000 n +0001438310 00000 n +0001438377 00000 n +0001438444 00000 n +0001438511 00000 n +0001438578 00000 n +0001438645 00000 n +0001438712 00000 n +0001438779 00000 n +0001438846 00000 n +0001438913 00000 n +0001438980 00000 n +0001439047 00000 n +0001439114 00000 n +0001439181 00000 n +0001439248 00000 n +0001439315 00000 n +0001439382 00000 n +0001439449 00000 n +0001439516 00000 n +0001439594 00000 n +0001439661 00000 n +0001439728 00000 n +0001439795 00000 n +0001439862 00000 n +0001439929 00000 n +0001439996 00000 n +0001440063 00000 n +0001440130 00000 n +0001440197 00000 n +0001440286 00000 n +0001440353 00000 n +0001440420 00000 n +0001440487 00000 n +0001440554 00000 n +0001440621 00000 n +0001440688 00000 n +0001440755 00000 n +0001440822 00000 n +0001440889 00000 n +0001440956 00000 n +0001441023 00000 n +0001441090 00000 n +0001441157 00000 n +0001441224 00000 n +0001441291 00000 n +0001441358 00000 n +0001441425 00000 n +0001441492 00000 n +0001441581 00000 n +0001441648 00000 n +0001441715 00000 n +0001441782 00000 n +0001441849 00000 n +0001441916 00000 n +0001441983 00000 n +0001442050 00000 n +0001442117 00000 n +0001442184 00000 n +0001442251 00000 n +0001442318 00000 n +0001442396 00000 n +0001442463 00000 n +0001442530 00000 n +0001442597 00000 n +0001442664 00000 n +0001442731 00000 n +0001442798 00000 n +0001442865 00000 n +0001442932 00000 n +0001442999 00000 n +0001443088 00000 n +0001443155 00000 n +0001443222 00000 n +0001443289 00000 n +0001443356 00000 n +0001443423 00000 n +0001443490 00000 n +0001443557 00000 n +0001443624 00000 n +0001443691 00000 n +0001443769 00000 n +0001443836 00000 n +0001443903 00000 n +0001443970 00000 n +0001444037 00000 n +0001444104 00000 n +0001444171 00000 n +0001444238 00000 n +0001444305 00000 n +0001444372 00000 n +0001444439 00000 n +0001444506 00000 n +0001444573 00000 n +0001444640 00000 n +0001444707 00000 n +0001444774 00000 n +0001444841 00000 n +0001444908 00000 n +0001444975 00000 n +0001445042 00000 n +0001445109 00000 n +0001445176 00000 n +0001445243 00000 n +0001445310 00000 n +0001445377 00000 n +0001445444 00000 n +0001445511 00000 n +0001445578 00000 n +0001445645 00000 n +0001445712 00000 n +0001445779 00000 n +0001445846 00000 n +0001445913 00000 n +0001445980 00000 n +0001446047 00000 n +0001446114 00000 n +0001446181 00000 n +0001446248 00000 n +0001446315 00000 n +0001446382 00000 n +0001446449 00000 n +0001446516 00000 n +0001446583 00000 n +0001446650 00000 n +0001446717 00000 n +0001446784 00000 n +0001446851 00000 n +0001446918 00000 n +0001446985 00000 n +0001447052 00000 n +0001447119 00000 n +0001447186 00000 n +0001447253 00000 n +0001447320 00000 n +0001447387 00000 n +0001447454 00000 n +0001447521 00000 n +0001447588 00000 n +0001447655 00000 n +0001447722 00000 n +0001447789 00000 n +0001447856 00000 n +0001447923 00000 n +0001447990 00000 n +0001448057 00000 n +0001448124 00000 n +0001448191 00000 n +0001448258 00000 n +0001448325 00000 n +0001448392 00000 n +0001448459 00000 n +0001448526 00000 n +0001448593 00000 n +0001448660 00000 n +0001448727 00000 n +0001448794 00000 n +0001448861 00000 n +0001448928 00000 n +0001448995 00000 n +0001449062 00000 n +0001449129 00000 n +0001449196 00000 n +0001449263 00000 n +0001449330 00000 n +0001449397 00000 n +0001449464 00000 n +0001449531 00000 n +0001449598 00000 n +0001449665 00000 n +0001449732 00000 n +0001449799 00000 n +0001449866 00000 n +0001449933 00000 n +0001450000 00000 n +0001450067 00000 n +0001450134 00000 n +0001450201 00000 n +0001450268 00000 n +0001450335 00000 n +0001450402 00000 n +0001450469 00000 n +0001450536 00000 n +0001450603 00000 n +0001450670 00000 n +0001450737 00000 n +0001450804 00000 n +0001450871 00000 n +0001450938 00000 n +0001451005 00000 n +0001451072 00000 n +0001451139 00000 n +0001451206 00000 n +0001451273 00000 n +0001451340 00000 n +0001451407 00000 n +0001451474 00000 n +0001451541 00000 n +0001451608 00000 n +0001451675 00000 n +0001451742 00000 n +0001451809 00000 n +0001451876 00000 n +0001451943 00000 n +0001452010 00000 n +0001452077 00000 n +0001452144 00000 n +0001452211 00000 n +0001452278 00000 n +0001452345 00000 n +0001452412 00000 n +0001452479 00000 n +0001452546 00000 n +0001452613 00000 n +0001452680 00000 n +0001452747 00000 n +0001452814 00000 n +0001452881 00000 n +0001452948 00000 n +0001453015 00000 n +0001453082 00000 n +0001453149 00000 n +0001453216 00000 n +0001453283 00000 n +0001453350 00000 n +0001453417 00000 n +0001453484 00000 n +0001453551 00000 n +0001453618 00000 n +0001453685 00000 n +0001453752 00000 n +0001453819 00000 n +0001453886 00000 n +0001453953 00000 n +0001454020 00000 n +0001454087 00000 n +0001454154 00000 n +0001454221 00000 n +0001454288 00000 n +0001454355 00000 n +0001454422 00000 n +0001454489 00000 n +0001454556 00000 n +0001454623 00000 n +0001454690 00000 n +0001454757 00000 n +0001454824 00000 n +0001454891 00000 n +0001454958 00000 n +0001455025 00000 n +0001455092 00000 n +0001455159 00000 n +0001455226 00000 n +0001455293 00000 n +0001455360 00000 n +0001455427 00000 n +0001455494 00000 n +0001455561 00000 n +0001455628 00000 n +0001455695 00000 n +0001455762 00000 n +0001455829 00000 n +0001455896 00000 n +0001455963 00000 n +0001456030 00000 n +0001456097 00000 n +0001456164 00000 n +0001456231 00000 n +0001456298 00000 n +0001456365 00000 n +0001456432 00000 n +0001456499 00000 n +0001456566 00000 n +0001456633 00000 n +0001456700 00000 n +0001456767 00000 n +0001456834 00000 n +0001456901 00000 n +0001456968 00000 n +0001457035 00000 n +0001457102 00000 n +0001457169 00000 n +0001457236 00000 n +0001457303 00000 n +0001457370 00000 n +0001457437 00000 n +0001457504 00000 n +0001457571 00000 n +0001457638 00000 n +0001457705 00000 n +0001457772 00000 n +0001457839 00000 n +0001457906 00000 n +0001457973 00000 n +0001458040 00000 n +0001458107 00000 n +0001458174 00000 n +0001458241 00000 n +0001458308 00000 n +0001458375 00000 n +0001458442 00000 n +0001458509 00000 n +0001458576 00000 n +0001458643 00000 n +0001458710 00000 n +0001458777 00000 n +0001458844 00000 n +0001458911 00000 n +0001458978 00000 n +0001459045 00000 n +0001459112 00000 n +0001459179 00000 n +0001459246 00000 n +0001459313 00000 n +0001459380 00000 n +0001459447 00000 n +0001459514 00000 n +0001459581 00000 n +0001459648 00000 n +0001459715 00000 n +0001459782 00000 n +0001459849 00000 n +0001459916 00000 n +0001459983 00000 n +0001460050 00000 n +0001460117 00000 n +0001460184 00000 n +0001460251 00000 n +0001460318 00000 n +0001460385 00000 n +0001460452 00000 n +0001460519 00000 n +0001460586 00000 n +0001460653 00000 n +0001460720 00000 n +0001460787 00000 n +0001460854 00000 n +0001460921 00000 n +0001460988 00000 n +0001461055 00000 n +0001461122 00000 n +0001461189 00000 n +0001461256 00000 n +0001461323 00000 n +0001461390 00000 n +0001461457 00000 n +0001461524 00000 n +0001461591 00000 n +0001461658 00000 n +0001461725 00000 n +0001461792 00000 n +0001461859 00000 n +0001461926 00000 n +0001461993 00000 n +0001462060 00000 n +0001462127 00000 n +0001462194 00000 n +0001462261 00000 n +0001462328 00000 n +0001462395 00000 n +0001462462 00000 n +0001462529 00000 n +0001462596 00000 n +0001462663 00000 n +0001462730 00000 n +0001462797 00000 n +0001462864 00000 n +0001462931 00000 n +0001462998 00000 n +0001463065 00000 n +0001463132 00000 n +0001463199 00000 n +0001463266 00000 n +0001463333 00000 n +0001463400 00000 n +0001463467 00000 n +0001463534 00000 n +0001463601 00000 n +0001463668 00000 n +0001463735 00000 n +0001463802 00000 n +0001463869 00000 n +0001463936 00000 n +0001464003 00000 n +0001464070 00000 n +0001464137 00000 n +0001464204 00000 n +0001464271 00000 n +0001464338 00000 n +0001464405 00000 n +0001464472 00000 n +0001464539 00000 n +0001464606 00000 n +0001464673 00000 n +0001464740 00000 n +0001464807 00000 n +0001464874 00000 n +0001464941 00000 n +0001465008 00000 n +0001465075 00000 n +0001465142 00000 n +0001465209 00000 n +0001465276 00000 n +0001465343 00000 n +0001465410 00000 n +0001465477 00000 n +0001465544 00000 n +0001465611 00000 n +0001465678 00000 n +0001465745 00000 n +0001465812 00000 n +0001465879 00000 n +0001465946 00000 n +0001466013 00000 n +0001466080 00000 n +0001466147 00000 n +0001466214 00000 n +0001466281 00000 n +0001466348 00000 n +0001466415 00000 n +0001466482 00000 n +0001466549 00000 n +0001466616 00000 n +0001466683 00000 n +0001466750 00000 n +0001466817 00000 n +0001466884 00000 n +0001466951 00000 n +0001467018 00000 n +0001467085 00000 n +0001467152 00000 n +0001467219 00000 n +0001467286 00000 n +0001467353 00000 n +0001467420 00000 n +0001467487 00000 n +0001467554 00000 n +0001467621 00000 n +0001467688 00000 n +0001467755 00000 n +0001467822 00000 n +0001467889 00000 n +0001467956 00000 n +0001468023 00000 n +0001468090 00000 n +0001468157 00000 n +0001468224 00000 n +0001468291 00000 n +0001468358 00000 n +0001468425 00000 n +0001468492 00000 n +0001468559 00000 n +0001468626 00000 n +0001468693 00000 n +0001468760 00000 n +0001468827 00000 n +0001468894 00000 n +0001468961 00000 n +0001469028 00000 n +0001469095 00000 n +0001469162 00000 n +0001469229 00000 n +0001469296 00000 n +0001469363 00000 n +0001469430 00000 n +0001469497 00000 n +0001469564 00000 n +0001469631 00000 n +0001469698 00000 n +0001469765 00000 n +0001469832 00000 n +0001469899 00000 n +0001469966 00000 n +0001470033 00000 n +0001470100 00000 n +0001470167 00000 n +0001470234 00000 n +0001470301 00000 n +0001470368 00000 n +0001470435 00000 n +0001470502 00000 n +0001470569 00000 n +0001470636 00000 n +0001470703 00000 n +0001470770 00000 n +0001470837 00000 n +0001470904 00000 n +0001470971 00000 n +0001471038 00000 n +0001471105 00000 n +0001471172 00000 n +0001471239 00000 n +0001471306 00000 n +0001471373 00000 n +0001471440 00000 n +0001471507 00000 n +0001471574 00000 n +0001471641 00000 n +0001471708 00000 n +0001471775 00000 n +0001471842 00000 n +0001471909 00000 n +0001471976 00000 n +0001472043 00000 n +0001472110 00000 n +0001472177 00000 n +0001472244 00000 n +0001472311 00000 n +0001472378 00000 n +0001472445 00000 n +0001472512 00000 n +0001472579 00000 n +0001472646 00000 n +0001472713 00000 n +0001472780 00000 n +0001472847 00000 n +0001472914 00000 n +0001472981 00000 n +0001473048 00000 n +0001473115 00000 n +0001473182 00000 n +0001473249 00000 n +0001473316 00000 n +0001473383 00000 n +0001473450 00000 n +0001473517 00000 n +0001473584 00000 n +0001473651 00000 n +0001473718 00000 n +0001473785 00000 n +0001473852 00000 n +0001473919 00000 n +0001473986 00000 n +0001474053 00000 n +0001474120 00000 n +0001474187 00000 n +0001474254 00000 n +0001474321 00000 n +0001474388 00000 n +0001474455 00000 n +0001474522 00000 n +0001474589 00000 n +0001474656 00000 n +0001474723 00000 n +0001474790 00000 n +0001474857 00000 n +0001474924 00000 n +0001474991 00000 n +0001475058 00000 n +0001475125 00000 n +0001475192 00000 n +0001475259 00000 n +0001475326 00000 n +0001475393 00000 n +0001475460 00000 n +0001475527 00000 n +0001475594 00000 n +0001475661 00000 n +0001475728 00000 n +0001475795 00000 n +0001475862 00000 n +0001475929 00000 n +0001475996 00000 n +0001476063 00000 n +0001476130 00000 n +0001476197 00000 n +0001476264 00000 n +0001476331 00000 n +0001476398 00000 n +0001476465 00000 n +0001476532 00000 n +0001476599 00000 n +0001476666 00000 n +0001476733 00000 n +0001476800 00000 n +0001476867 00000 n +0001476934 00000 n +0001477001 00000 n +0001477068 00000 n +0001477135 00000 n +0001477202 00000 n +0001477269 00000 n +0001477336 00000 n +0001477403 00000 n +0001477470 00000 n +0001477537 00000 n +0001477604 00000 n +0001477671 00000 n +0001477738 00000 n +0001477805 00000 n +0001477872 00000 n +0001477939 00000 n +0001478006 00000 n +0001478073 00000 n +0001478140 00000 n +0001478207 00000 n +0001478274 00000 n +0001478341 00000 n +0001478408 00000 n +0001478475 00000 n +0001478542 00000 n +0001478609 00000 n +0001478676 00000 n +0001478743 00000 n +0001478810 00000 n +0001478877 00000 n +0001478944 00000 n +0001479011 00000 n +0001479078 00000 n +0001479145 00000 n +0001479212 00000 n +0001479279 00000 n +0001479346 00000 n +0001479413 00000 n +0001479480 00000 n +0001479547 00000 n +0001479614 00000 n +0001479681 00000 n +0001479748 00000 n +0001479815 00000 n +0001479882 00000 n +0001479949 00000 n +0001480016 00000 n +0001480083 00000 n +0001480150 00000 n +0001480217 00000 n +0001480284 00000 n +0001480351 00000 n +0001480418 00000 n +0001480485 00000 n +0001480552 00000 n +0001480619 00000 n +0001480686 00000 n +0001480753 00000 n +0001480820 00000 n +0001480887 00000 n +0001480954 00000 n +0001481021 00000 n +0001481088 00000 n +0001481155 00000 n +0001481222 00000 n +0001481289 00000 n +0001481356 00000 n +0001481423 00000 n +0001481490 00000 n +0001481557 00000 n +0001481624 00000 n +0001481691 00000 n +0001481758 00000 n +0001481825 00000 n +0001481892 00000 n +0001481959 00000 n +0001482026 00000 n +0001482093 00000 n +0001482160 00000 n +0001482227 00000 n +0001482294 00000 n +0001482361 00000 n +0001482428 00000 n +0001482495 00000 n +0001482562 00000 n +0001482629 00000 n +0001482696 00000 n +0001482763 00000 n +0001482830 00000 n +0001482897 00000 n +0001482964 00000 n +0001483031 00000 n +0001483098 00000 n +0001483165 00000 n +0001483232 00000 n +0001483299 00000 n +0001483366 00000 n +0001483433 00000 n +0001483500 00000 n +0001483567 00000 n +0001483634 00000 n +0001483701 00000 n +0001483768 00000 n +0001483835 00000 n +0001483902 00000 n +0001483969 00000 n +0001484036 00000 n +0001484103 00000 n +0001484170 00000 n +0001484237 00000 n +0001484304 00000 n +0001484371 00000 n +0001484438 00000 n +0001484505 00000 n +0001484572 00000 n +0001484639 00000 n +0001484706 00000 n +0001484773 00000 n +0001484840 00000 n +0001484907 00000 n +0001484974 00000 n +0001485041 00000 n +0001485108 00000 n +0001485175 00000 n +0001485242 00000 n +0001485309 00000 n +0001485376 00000 n +0001485443 00000 n +0001485510 00000 n +0001485577 00000 n +0001485644 00000 n +0001485711 00000 n +0001485778 00000 n +0001485845 00000 n +0001485912 00000 n +0001485979 00000 n +0001486046 00000 n +0001486113 00000 n +0001486180 00000 n +0001486247 00000 n +0001486314 00000 n +0001486381 00000 n +0001486448 00000 n +0001486515 00000 n +0001486582 00000 n +0001486649 00000 n +0001486716 00000 n +0001486783 00000 n +0001486850 00000 n +0001486917 00000 n +0001486984 00000 n +0001487051 00000 n +0001487118 00000 n +0001487185 00000 n +0001487252 00000 n +0001487319 00000 n +0001487386 00000 n +0001487453 00000 n +0001487520 00000 n +0001487587 00000 n +0001487654 00000 n +0001487721 00000 n +0001487788 00000 n +0001487855 00000 n +0001487922 00000 n +0001487989 00000 n +0001488056 00000 n +0001488123 00000 n +0001488190 00000 n +0001488257 00000 n +0001488324 00000 n +0001488391 00000 n +0001488458 00000 n +0001488525 00000 n +0001488592 00000 n +0001488659 00000 n +0001488726 00000 n +0001488793 00000 n +0001488860 00000 n +0001488927 00000 n +0001488994 00000 n +0001489061 00000 n +0001489128 00000 n +0001489195 00000 n +0001489262 00000 n +0001489329 00000 n +0001489396 00000 n +0001489463 00000 n +0001489530 00000 n +0001489597 00000 n +0001489664 00000 n +0001489731 00000 n +0001489798 00000 n +0001489865 00000 n +0001489932 00000 n +0001489999 00000 n +0001490066 00000 n +0001490133 00000 n +0001490200 00000 n +0001490267 00000 n +0001490334 00000 n +0001490401 00000 n +0001490468 00000 n +0001490535 00000 n +0001490602 00000 n +0001490669 00000 n +0001490736 00000 n +0001490803 00000 n +0001490870 00000 n +0001490937 00000 n +0001491004 00000 n +0001491071 00000 n +0001491138 00000 n +0001491205 00000 n +0001491272 00000 n +0001491339 00000 n +0001491406 00000 n +0001491473 00000 n +0001491540 00000 n +0001491607 00000 n +0001491674 00000 n +0001491741 00000 n +0001491808 00000 n +0001491875 00000 n +0001491942 00000 n +0001492009 00000 n +0001492076 00000 n +0001492143 00000 n +0001492210 00000 n +0001492277 00000 n +0001492344 00000 n +0001492411 00000 n +0001492478 00000 n +0001492545 00000 n +0001492612 00000 n +0001492679 00000 n +0001492746 00000 n +0001492813 00000 n +0001492880 00000 n +0001492947 00000 n +0001493014 00000 n +0001493081 00000 n +0001493148 00000 n +0001493215 00000 n +0001493282 00000 n +0001493349 00000 n +0001493416 00000 n +0001493483 00000 n +0001493550 00000 n +0001493617 00000 n +0001493684 00000 n +0001493751 00000 n +0001493818 00000 n +0001493885 00000 n +0001493952 00000 n +0001494019 00000 n +0001494086 00000 n +0001494153 00000 n +0001494220 00000 n +0001494287 00000 n +0001494354 00000 n +0001494421 00000 n +0001494488 00000 n +0001494555 00000 n +0001494622 00000 n +0001494689 00000 n +0001494756 00000 n +0001494823 00000 n +0001494890 00000 n +0001494957 00000 n +0001495024 00000 n +0001495091 00000 n +0001495158 00000 n +0001495225 00000 n +0001495292 00000 n +0001495359 00000 n +0001495426 00000 n +0001495493 00000 n +0001495560 00000 n +0001495627 00000 n +0001495694 00000 n +0001495761 00000 n +0001495828 00000 n +0001495895 00000 n +0001495962 00000 n +0001496029 00000 n +0001496096 00000 n +0001496163 00000 n +0001496230 00000 n +0001496297 00000 n +0001496364 00000 n +0001496431 00000 n +0001496498 00000 n +0001496565 00000 n +0001496632 00000 n +0001496699 00000 n +0001496766 00000 n +0001496833 00000 n +0001496900 00000 n +0001496967 00000 n +0001497034 00000 n +0001497101 00000 n +0001497168 00000 n +0001497235 00000 n +0001497302 00000 n +0001497369 00000 n +0001497436 00000 n +0001497503 00000 n +0001497570 00000 n +0001497637 00000 n +0001497704 00000 n +0001497771 00000 n +0001497838 00000 n +0001497905 00000 n +0001497972 00000 n +0001498039 00000 n +0001498106 00000 n +0001498173 00000 n +0001498240 00000 n +0001498307 00000 n +0001498374 00000 n +0001498441 00000 n +0001498508 00000 n +0001498575 00000 n +0001498642 00000 n +0001498709 00000 n +0001498776 00000 n +0001498843 00000 n +0001498910 00000 n +0001498977 00000 n +0001499044 00000 n +0001499111 00000 n +0001499178 00000 n +0001499245 00000 n +0001499312 00000 n +0001499379 00000 n +0001499446 00000 n +0001499513 00000 n +0001499580 00000 n +0001499647 00000 n +0001499714 00000 n +0001499781 00000 n +0001499848 00000 n +0001499915 00000 n +0001499982 00000 n +0001500049 00000 n +0001500116 00000 n +0001500183 00000 n +0001500250 00000 n +0001500317 00000 n +0001500384 00000 n +0001500451 00000 n +0001500518 00000 n +0001500585 00000 n +0001500652 00000 n +0001500719 00000 n +0001500786 00000 n +0001500853 00000 n +0001500920 00000 n +0001501081 00000 n +0001501148 00000 n +0001501215 00000 n +0001501282 00000 n +0001501349 00000 n +0001501407 00000 n +0001501494 00000 n +0001501592 00000 n +0001501659 00000 n +0001501726 00000 n +0001501793 00000 n +0001501860 00000 n +0001501927 00000 n +0001501994 00000 n +0001502061 00000 n +0001502128 00000 n +0001502195 00000 n +0001502262 00000 n +0001502329 00000 n +0001502396 00000 n +0001502463 00000 n +0001502530 00000 n +0001502597 00000 n +0001502720 00000 n +0001502809 00000 n +0001502876 00000 n +0001502943 00000 n +0001503010 00000 n +0001503077 00000 n +0001503144 00000 n +0001503211 00000 n +0001503278 00000 n +0001503345 00000 n +0001503412 00000 n +0001503479 00000 n +0001503546 00000 n +0001503613 00000 n +0001503680 00000 n +0001503747 00000 n +0001503814 00000 n +0001503901 00000 n +0001503990 00000 n +0001504057 00000 n +0001504124 00000 n +0001504191 00000 n +0001504260 00000 n +0001504349 00000 n +0001504416 00000 n +0001504483 00000 n +0001504550 00000 n +0001504611 00000 n +0001504781 00000 n +0001504899 00000 n +0001504960 00000 n +0001505074 00000 n +0001505196 00000 n +0001505257 00000 n +0001505387 00000 n +0001505553 00000 n +0001505614 00000 n +0001505768 00000 n +0001505938 00000 n +0001506199 00000 n +0001506458 00000 n +0001506719 00000 n +0001506796 00000 n +0001507078 00000 n +0001507336 00000 n +0001507413 00000 n +0001507692 00000 n +0001507886 00000 n +0001508157 00000 n +0001508422 00000 n +0001508499 00000 n +0001508784 00000 n +0001509040 00000 n +0001509303 00000 n +0001509576 00000 n +0001509643 00000 n +0001509710 00000 n +0001509777 00000 n +0001509844 00000 n +0001509911 00000 n +0001509978 00000 n +0001510045 00000 n +0001510112 00000 n +0001510179 00000 n +0001510246 00000 n +0001510313 00000 n +0001510380 00000 n +0001510447 00000 n +0001510514 00000 n +0001510581 00000 n +0001510648 00000 n +0001510715 00000 n +0001510782 00000 n +0001510849 00000 n +0001510916 00000 n +0001510983 00000 n +0001511050 00000 n +0001511117 00000 n +0001511184 00000 n +0001511251 00000 n +0001511318 00000 n +0001511385 00000 n +0001511452 00000 n +0001511519 00000 n +0001511586 00000 n +0001511653 00000 n +0001511720 00000 n +0001511787 00000 n +0001511854 00000 n +0001511921 00000 n +0001511988 00000 n +0001512055 00000 n +0001512122 00000 n +0001512189 00000 n +0001512256 00000 n +0001512323 00000 n +0001512390 00000 n +0001512457 00000 n +0001512524 00000 n +0001512591 00000 n +0001512695 00000 n +0001512845 00000 n +0001512901 00000 n +0001512957 00000 n +0001513013 00000 n +0001513069 00000 n +0001513125 00000 n +0001513181 00000 n +0001513237 00000 n +0001513293 00000 n +0001513349 00000 n +0001513405 00000 n +0001513461 00000 n +0001513517 00000 n +0001513573 00000 n +0001513629 00000 n +0001513685 00000 n +0001513741 00000 n +0001513797 00000 n +0001513853 00000 n +0001513909 00000 n +0001514059 00000 n +0001514115 00000 n +0001514171 00000 n +0001514227 00000 n +0001514283 00000 n +0001514339 00000 n +0001514396 00000 n +0001514452 00000 n +0001514508 00000 n +0001514564 00000 n +0001514620 00000 n +0001514814 00000 n +0001514875 00000 n +0001515046 00000 n +0001515200 00000 n +0001515261 00000 n +0001515322 00000 n +0001515383 00000 n +0001515444 00000 n +0001515611 00000 n +0001515672 00000 n +0001515854 00000 n +0001516017 00000 n +0001516078 00000 n +0001516196 00000 n +0001516257 00000 n +0001516391 00000 n +0001622595 00000 n +0001651931 00000 n +0001675558 00000 n +0001685226 00000 n +0001685317 00000 n +0001693762 00000 n +0001693851 00000 n +0001716379 00000 n +0001733828 00000 n +0001734828 00000 n +0001734936 00000 n +0001741557 00000 n +0001744551 00000 n +0001744609 00000 n +0001744667 00000 n +0001744725 00000 n +0001744784 00000 n +0001744842 00000 n +0001744900 00000 n +0001744958 00000 n +0001745017 00000 n +0001745075 00000 n +0001745133 00000 n +0001745191 00000 n +0001745249 00000 n +0001745307 00000 n +0001745366 00000 n +0001745425 00000 n +0001745484 00000 n +0001745543 00000 n +0001745602 00000 n +0001745661 00000 n +0001745720 00000 n +0001745779 00000 n +0001745838 00000 n +0001745896 00000 n +0001745954 00000 n +0001746012 00000 n +0001746059 00000 n +0001746106 00000 n +0001746153 00000 n +0001746200 00000 n +0001746247 00000 n +0001746294 00000 n +0001746341 00000 n +0001746388 00000 n +0001746435 00000 n +0001746482 00000 n +0001746529 00000 n +0001746576 00000 n +0001746623 00000 n +0001746670 00000 n +0001746717 00000 n +0001746775 00000 n +0001746822 00000 n +0001746869 00000 n +0001746927 00000 n +0001746974 00000 n +0001747140 00000 n +0001747201 00000 n +0001747331 00000 n +0001747481 00000 n +0001747542 00000 n +0001747664 00000 n +0001747725 00000 n +0001747863 00000 n +0001747924 00000 n +0001748094 00000 n +0001748262 00000 n +0001748323 00000 n +0001748384 00000 n +0001748445 00000 n +0001748506 00000 n +0001748662 00000 n +0001748796 00000 n +0001748857 00000 n +0001749071 00000 n +0001749132 00000 n +0001749258 00000 n +0001749319 00000 n +0001749444 00000 n +0001749578 00000 n +0001749639 00000 n +0001749772 00000 n +0001749833 00000 n +0001750006 00000 n +0001750067 00000 n +0001750264 00000 n +0001750406 00000 n +0001750467 00000 n +0001750609 00000 n +0001750670 00000 n +0001750819 00000 n +0001750880 00000 n +0001751037 00000 n +0001751098 00000 n +0001751159 00000 n +0001751336 00000 n +0001751397 00000 n +0001751458 00000 n +0001751591 00000 n +0001751652 00000 n +0001751845 00000 n +0001751906 00000 n +0001752083 00000 n +0001752144 00000 n +0001752309 00000 n +0001752370 00000 n +0001752547 00000 n +0001752608 00000 n +0001752669 00000 n +0001752827 00000 n +0001752888 00000 n +0001753029 00000 n +0001753187 00000 n +0001753248 00000 n +0001753309 00000 n +0001753410 00000 n +0001753471 00000 n +0001753532 00000 n +0001753697 00000 n +0001753758 00000 n +0001753915 00000 n +0001753976 00000 n +0001754145 00000 n +0001754206 00000 n +0001754267 00000 n +0001754328 00000 n +0001754389 00000 n +0001754558 00000 n +0001754619 00000 n +0001754788 00000 n +0001754849 00000 n +0001754910 00000 n +0001755079 00000 n +0001755140 00000 n +0001755305 00000 n +0001755366 00000 n +0001755543 00000 n +0001755604 00000 n +0001755757 00000 n +0001755818 00000 n +trailer +<< +/Size 4858 +/Root 1 0 R +/Info 8 0 R +/ID [<61B376799E51412C679B7B383D6A4367> <1D8918DDC609B34E9D25A9CA5FEC2B54>] +>> +startxref +1755879 +%%EOF diff --git a/lib/lib_div/Adafruit-Fingerprint-Sensor-Library-2.0.4-Tasmota/documentation/fingerprint_en.pdf b/lib/lib_div/Adafruit-Fingerprint-Sensor-Library-2.1.0-Tasmota/documentation/fingerprint_en.pdf similarity index 100% rename from lib/lib_div/Adafruit-Fingerprint-Sensor-Library-2.0.4-Tasmota/documentation/fingerprint_en.pdf rename to lib/lib_div/Adafruit-Fingerprint-Sensor-Library-2.1.0-Tasmota/documentation/fingerprint_en.pdf diff --git a/lib/lib_div/Adafruit-Fingerprint-Sensor-Library-2.0.4-Tasmota/documentation/readme.txt b/lib/lib_div/Adafruit-Fingerprint-Sensor-Library-2.1.0-Tasmota/documentation/readme.txt similarity index 100% rename from lib/lib_div/Adafruit-Fingerprint-Sensor-Library-2.0.4-Tasmota/documentation/readme.txt rename to lib/lib_div/Adafruit-Fingerprint-Sensor-Library-2.1.0-Tasmota/documentation/readme.txt diff --git a/lib/lib_div/Adafruit-Fingerprint-Sensor-Library-2.0.4-Tasmota/examples/Leo_passthru/.uno.test.skip b/lib/lib_div/Adafruit-Fingerprint-Sensor-Library-2.1.0-Tasmota/examples/Leo_passthru/.uno.test.skip similarity index 100% rename from lib/lib_div/Adafruit-Fingerprint-Sensor-Library-2.0.4-Tasmota/examples/Leo_passthru/.uno.test.skip rename to lib/lib_div/Adafruit-Fingerprint-Sensor-Library-2.1.0-Tasmota/examples/Leo_passthru/.uno.test.skip diff --git a/lib/lib_div/Adafruit-Fingerprint-Sensor-Library-2.0.4-Tasmota/examples/Leo_passthru/Leo_passthru.ino b/lib/lib_div/Adafruit-Fingerprint-Sensor-Library-2.1.0-Tasmota/examples/Leo_passthru/Leo_passthru.ino similarity index 100% rename from lib/lib_div/Adafruit-Fingerprint-Sensor-Library-2.0.4-Tasmota/examples/Leo_passthru/Leo_passthru.ino rename to lib/lib_div/Adafruit-Fingerprint-Sensor-Library-2.1.0-Tasmota/examples/Leo_passthru/Leo_passthru.ino diff --git a/lib/lib_div/Adafruit-Fingerprint-Sensor-Library-2.0.4-Tasmota/examples/blank/blank.ino b/lib/lib_div/Adafruit-Fingerprint-Sensor-Library-2.1.0-Tasmota/examples/blank/blank.ino similarity index 100% rename from lib/lib_div/Adafruit-Fingerprint-Sensor-Library-2.0.4-Tasmota/examples/blank/blank.ino rename to lib/lib_div/Adafruit-Fingerprint-Sensor-Library-2.1.0-Tasmota/examples/blank/blank.ino diff --git a/lib/lib_div/Adafruit-Fingerprint-Sensor-Library-2.0.4-Tasmota/examples/changepassword/changepassword.ino b/lib/lib_div/Adafruit-Fingerprint-Sensor-Library-2.1.0-Tasmota/examples/changepassword/changepassword.ino similarity index 100% rename from lib/lib_div/Adafruit-Fingerprint-Sensor-Library-2.0.4-Tasmota/examples/changepassword/changepassword.ino rename to lib/lib_div/Adafruit-Fingerprint-Sensor-Library-2.1.0-Tasmota/examples/changepassword/changepassword.ino diff --git a/lib/lib_div/Adafruit-Fingerprint-Sensor-Library-2.0.4-Tasmota/examples/delete/delete.ino b/lib/lib_div/Adafruit-Fingerprint-Sensor-Library-2.1.0-Tasmota/examples/delete/delete.ino similarity index 97% rename from lib/lib_div/Adafruit-Fingerprint-Sensor-Library-2.0.4-Tasmota/examples/delete/delete.ino rename to lib/lib_div/Adafruit-Fingerprint-Sensor-Library-2.1.0-Tasmota/examples/delete/delete.ino index 563b4b719..107906d4e 100644 --- a/lib/lib_div/Adafruit-Fingerprint-Sensor-Library-2.0.4-Tasmota/examples/delete/delete.ino +++ b/lib/lib_div/Adafruit-Fingerprint-Sensor-Library-2.1.0-Tasmota/examples/delete/delete.ino @@ -86,15 +86,13 @@ uint8_t deleteFingerprint(uint8_t id) { Serial.println("Deleted!"); } else if (p == FINGERPRINT_PACKETRECIEVEERR) { Serial.println("Communication error"); - return p; } else if (p == FINGERPRINT_BADLOCATION) { Serial.println("Could not delete in that location"); - return p; } else if (p == FINGERPRINT_FLASHERR) { Serial.println("Error writing to flash"); - return p; } else { Serial.print("Unknown error: 0x"); Serial.println(p, HEX); - return p; } + + return p; } diff --git a/lib/lib_div/Adafruit-Fingerprint-Sensor-Library-2.0.4-Tasmota/examples/emptyDatabase/emptyDatabase.ino b/lib/lib_div/Adafruit-Fingerprint-Sensor-Library-2.1.0-Tasmota/examples/emptyDatabase/emptyDatabase.ino similarity index 100% rename from lib/lib_div/Adafruit-Fingerprint-Sensor-Library-2.0.4-Tasmota/examples/emptyDatabase/emptyDatabase.ino rename to lib/lib_div/Adafruit-Fingerprint-Sensor-Library-2.1.0-Tasmota/examples/emptyDatabase/emptyDatabase.ino diff --git a/lib/lib_div/Adafruit-Fingerprint-Sensor-Library-2.0.4-Tasmota/examples/enroll/enroll.ino b/lib/lib_div/Adafruit-Fingerprint-Sensor-Library-2.1.0-Tasmota/examples/enroll/enroll.ino similarity index 100% rename from lib/lib_div/Adafruit-Fingerprint-Sensor-Library-2.0.4-Tasmota/examples/enroll/enroll.ino rename to lib/lib_div/Adafruit-Fingerprint-Sensor-Library-2.1.0-Tasmota/examples/enroll/enroll.ino diff --git a/lib/lib_div/Adafruit-Fingerprint-Sensor-Library-2.0.4-Tasmota/examples/fingerprint/fingerprint.ino b/lib/lib_div/Adafruit-Fingerprint-Sensor-Library-2.1.0-Tasmota/examples/fingerprint/fingerprint.ino similarity index 100% rename from lib/lib_div/Adafruit-Fingerprint-Sensor-Library-2.0.4-Tasmota/examples/fingerprint/fingerprint.ino rename to lib/lib_div/Adafruit-Fingerprint-Sensor-Library-2.1.0-Tasmota/examples/fingerprint/fingerprint.ino diff --git a/lib/lib_div/Adafruit-Fingerprint-Sensor-Library-2.0.4-Tasmota/examples/ledcontrol/ledcontrol.ino b/lib/lib_div/Adafruit-Fingerprint-Sensor-Library-2.1.0-Tasmota/examples/ledcontrol/ledcontrol.ino similarity index 100% rename from lib/lib_div/Adafruit-Fingerprint-Sensor-Library-2.0.4-Tasmota/examples/ledcontrol/ledcontrol.ino rename to lib/lib_div/Adafruit-Fingerprint-Sensor-Library-2.1.0-Tasmota/examples/ledcontrol/ledcontrol.ino diff --git a/lib/lib_div/Adafruit-Fingerprint-Sensor-Library-2.0.4-Tasmota/examples/show_fingerprint_templates/show_fingerprint_templates.ino b/lib/lib_div/Adafruit-Fingerprint-Sensor-Library-2.1.0-Tasmota/examples/show_fingerprint_templates/show_fingerprint_templates.ino similarity index 75% rename from lib/lib_div/Adafruit-Fingerprint-Sensor-Library-2.0.4-Tasmota/examples/show_fingerprint_templates/show_fingerprint_templates.ino rename to lib/lib_div/Adafruit-Fingerprint-Sensor-Library-2.1.0-Tasmota/examples/show_fingerprint_templates/show_fingerprint_templates.ino index f18022023..d4f2a2d61 100644 --- a/lib/lib_div/Adafruit-Fingerprint-Sensor-Library-2.0.4-Tasmota/examples/show_fingerprint_templates/show_fingerprint_templates.ino +++ b/lib/lib_div/Adafruit-Fingerprint-Sensor-Library-2.1.0-Tasmota/examples/show_fingerprint_templates/show_fingerprint_templates.ino @@ -33,7 +33,7 @@ int getFingerprintIDez(); void setup() { - while(!Serial); + while (!Serial); Serial.begin(9600); Serial.println("Fingerprint template extractor"); @@ -78,7 +78,7 @@ uint8_t downloadFingerprintTemplate(uint16_t id) case FINGERPRINT_OK: Serial.print("Template "); Serial.print(id); Serial.println(" transferring:"); break; - default: + default: Serial.print("Unknown error "); Serial.println(p); return p; } @@ -90,9 +90,9 @@ uint8_t downloadFingerprintTemplate(uint16_t id) uint32_t starttime = millis(); int i = 0; while (i < 534 && (millis() - starttime) < 20000) { - if (mySerial.available()) { - bytesReceived[i++] = mySerial.read(); - } + if (mySerial.available()) { + bytesReceived[i++] = mySerial.read(); + } } Serial.print(i); Serial.println(" bytes read."); Serial.println("Decoding packet..."); @@ -102,42 +102,41 @@ uint8_t downloadFingerprintTemplate(uint16_t id) // filtering only the data packets int uindx = 9, index = 0; - while (index < 534) { - while (index < uindx) ++index; - uindx += 256; - while (index < uindx) { - fingerTemplate[index++] = bytesReceived[index]; - } - uindx += 2; - while (index < uindx) ++index; - uindx = index + 9; - } + memcpy(fingerTemplate + index, bytesReceived + uindx, 256); // first 256 bytes + uindx += 256; // skip data + uindx += 2; // skip checksum + uindx += 9; // skip next header + index += 256; // advance pointer + memcpy(fingerTemplate + index, bytesReceived + uindx, 256); // second 256 bytes + for (int i = 0; i < 512; ++i) { - //Serial.print("0x"); - printHex(fingerTemplate[i], 2); - //Serial.print(", "); + //Serial.print("0x"); + printHex(fingerTemplate[i], 2); + //Serial.print(", "); } Serial.println("\ndone."); + return p; + /* - uint8_t templateBuffer[256]; - memset(templateBuffer, 0xff, 256); //zero out template buffer - int index=0; - uint32_t starttime = millis(); - while ((index < 256) && ((millis() - starttime) < 1000)) - { + uint8_t templateBuffer[256]; + memset(templateBuffer, 0xff, 256); //zero out template buffer + int index=0; + uint32_t starttime = millis(); + while ((index < 256) && ((millis() - starttime) < 1000)) + { if (mySerial.available()) { templateBuffer[index] = mySerial.read(); index++; } - } + } - Serial.print(index); Serial.println(" bytes read"); + Serial.print(index); Serial.println(" bytes read"); - //dump entire templateBuffer. This prints out 16 lines of 16 bytes - for (int count= 0; count < 16; count++) - { + //dump entire templateBuffer. This prints out 16 lines of 16 bytes + for (int count= 0; count < 16; count++) + { for (int i = 0; i < 16; i++) { Serial.print("0x"); @@ -145,22 +144,21 @@ uint8_t downloadFingerprintTemplate(uint16_t id) Serial.print(", "); } Serial.println(); - }*/ + }*/ } void printHex(int num, int precision) { - char tmp[16]; - char format[128]; + char tmp[16]; + char format[128]; - sprintf(format, "%%.%dX", precision); + sprintf(format, "%%.%dX", precision); - sprintf(tmp, format, num); - Serial.print(tmp); + sprintf(tmp, format, num); + Serial.print(tmp); } void loop() {} - diff --git a/lib/lib_div/Adafruit-Fingerprint-Sensor-Library-2.0.4-Tasmota/library.properties b/lib/lib_div/Adafruit-Fingerprint-Sensor-Library-2.1.0-Tasmota/library.properties similarity index 96% rename from lib/lib_div/Adafruit-Fingerprint-Sensor-Library-2.0.4-Tasmota/library.properties rename to lib/lib_div/Adafruit-Fingerprint-Sensor-Library-2.1.0-Tasmota/library.properties index d5c86812e..b435fecb9 100644 --- a/lib/lib_div/Adafruit-Fingerprint-Sensor-Library-2.0.4-Tasmota/library.properties +++ b/lib/lib_div/Adafruit-Fingerprint-Sensor-Library-2.1.0-Tasmota/library.properties @@ -1,5 +1,5 @@ name=Adafruit Fingerprint Sensor Library -version=2.0.4 +version=2.1.0 author=Adafruit maintainer=Adafruit sentence=Arduino library for interfacing to the fingerprint sensor in the Adafruit shop diff --git a/lib/lib_div/Adafruit-Fingerprint-Sensor-Library-2.0.4-Tasmota/license.txt b/lib/lib_div/Adafruit-Fingerprint-Sensor-Library-2.1.0-Tasmota/license.txt similarity index 100% rename from lib/lib_div/Adafruit-Fingerprint-Sensor-Library-2.0.4-Tasmota/license.txt rename to lib/lib_div/Adafruit-Fingerprint-Sensor-Library-2.1.0-Tasmota/license.txt diff --git a/tasmota/tasmota_xsns_sensor/xsns_79_as608.ino b/tasmota/tasmota_xsns_sensor/xsns_79_as608.ino index 4b8115d1d..cd64a62f0 100644 --- a/tasmota/tasmota_xsns_sensor/xsns_79_as608.ino +++ b/tasmota/tasmota_xsns_sensor/xsns_79_as608.ino @@ -32,6 +32,10 @@ //#define USE_AS608_MESSAGES +#ifndef AS608_DUPLICATE +#define AS608_DUPLICATE 4 // Number of 0.25Sec to disable detection +#endif + #define D_JSON_FPRINT "FPrint" #define D_PRFX_FP "Fp" @@ -62,9 +66,12 @@ Adafruit_Fingerprint *As608Finger; TasmotaSerial *As608Serial; struct AS608 { + uint16_t finger_id; + uint16_t confidence; bool selected = false; uint8_t enroll_step = 0; uint8_t model_number = 0; + uint8_t duplicate; } As608; char* As608Message(char* response, uint32_t index) { @@ -131,6 +138,13 @@ void As608Loop(void) { uint32_t p = 0; if (!As608.enroll_step) { + if (As608.duplicate) { + As608.duplicate--; + } + if (!As608.duplicate) { + As608Finger->LEDcontrol(FINGERPRINT_LED_OFF, 0, FINGERPRINT_LED_PURPLE); + } + // Search for Finger // As608Finger->LEDcontrol(FINGERPRINT_LED_OFF, 0, FINGERPRINT_LED_RED); @@ -152,7 +166,15 @@ void As608Loop(void) { } // Found a match - Response_P(PSTR("{\"" D_JSON_FPRINT "\":{\"" D_JSON_ID "\":%d,\"" D_JSON_CONFIDENCE "\":%d}}"), As608Finger->fingerID, As608Finger->confidence); + if (As608.duplicate && (As608.finger_id == As608Finger->fingerID)) { + return; // Skip duplicate during AS608_DUPLICATE * 0.25 second + } + As608.duplicate = AS608_DUPLICATE; // AS608_DUPLICATE * 250mS + As608Finger->LEDcontrol(FINGERPRINT_LED_ON, 0, FINGERPRINT_LED_PURPLE); + + As608.finger_id = As608Finger->fingerID; + As608.confidence = As608Finger->confidence; + Response_P(PSTR("{\"" D_JSON_FPRINT "\":{\"" D_JSON_ID "\":%d,\"" D_JSON_CONFIDENCE "\":%d}}"), As608.finger_id, As608.confidence); MqttPublishPrefixTopicRulesProcess_P(RESULT_OR_STAT, PSTR(D_JSON_FPRINT)); return; } else { @@ -305,6 +327,11 @@ bool Xsns79(uint32_t function) { case FUNC_EVERY_250_MSECOND: As608Loop(); break; +#ifdef USE_WEBSERVER + case FUNC_WEB_SENSOR: + WSContentSend_PD(PSTR("{s}AS608{m}%d-%d{e}"), As608.finger_id, As608.confidence); + break; +#endif // USE_WEBSERVER case FUNC_COMMAND: result = DecodeCommand(kAs608Commands, As608Commands); break; From 9a88677122da9dd7c3dfa7c2d0e1547e08fb68aa Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Mon, 22 May 2023 12:42:24 +0200 Subject: [PATCH 165/289] More AS608 bling bling More AS608 bling bling (#18163) --- tasmota/tasmota_xsns_sensor/xsns_79_as608.ino | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/tasmota/tasmota_xsns_sensor/xsns_79_as608.ino b/tasmota/tasmota_xsns_sensor/xsns_79_as608.ino index cd64a62f0..cf41931c3 100644 --- a/tasmota/tasmota_xsns_sensor/xsns_79_as608.ino +++ b/tasmota/tasmota_xsns_sensor/xsns_79_as608.ino @@ -33,7 +33,10 @@ //#define USE_AS608_MESSAGES #ifndef AS608_DUPLICATE -#define AS608_DUPLICATE 4 // Number of 0.25Sec to disable detection +#define AS608_DUPLICATE 4 // Number of 0.25 Sec to disable detection +#endif +#ifndef AS608_COLOR_SCAN +#define AS608_COLOR_SCAN 3 // Red = 1, Blue = 2, Purple = 3 #endif #define D_JSON_FPRINT "FPrint" @@ -142,7 +145,7 @@ void As608Loop(void) { As608.duplicate--; } if (!As608.duplicate) { - As608Finger->LEDcontrol(FINGERPRINT_LED_OFF, 0, FINGERPRINT_LED_PURPLE); + As608Finger->LEDcontrol(FINGERPRINT_LED_OFF, 0, AS608_COLOR_SCAN); } // Search for Finger @@ -155,9 +158,13 @@ void As608Loop(void) { p = As608Finger->getImage(); // Take image if (p != FINGERPRINT_OK) { return; } + As608Finger->LEDcontrol(FINGERPRINT_LED_GRADUAL_ON, 150, AS608_COLOR_SCAN); + p = As608Finger->image2Tz(); // Convert image if (p != FINGERPRINT_OK) { return; } +// As608Finger->LEDcontrol(FINGERPRINT_LED_ON, 0, FINGERPRINT_LED_BLUE); + // p = As608Finger->fingerFastSearch(); // Match found - fails on R503 p = As608Finger->fingerSearch(); // Match found if (p != FINGERPRINT_OK) { @@ -170,7 +177,7 @@ void As608Loop(void) { return; // Skip duplicate during AS608_DUPLICATE * 0.25 second } As608.duplicate = AS608_DUPLICATE; // AS608_DUPLICATE * 250mS - As608Finger->LEDcontrol(FINGERPRINT_LED_ON, 0, FINGERPRINT_LED_PURPLE); + As608Finger->LEDcontrol(FINGERPRINT_LED_ON, 0, AS608_COLOR_SCAN); As608.finger_id = As608Finger->fingerID; As608.confidence = As608Finger->confidence; From 277261ff8f396b17a47cc1a0ff8d46b944ee10e6 Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Mon, 22 May 2023 12:52:20 +0200 Subject: [PATCH 166/289] try different curl API --- .github/workflows/Tasmota_build_devel.yml | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/.github/workflows/Tasmota_build_devel.yml b/.github/workflows/Tasmota_build_devel.yml index a762fc5b7..244e994b8 100644 --- a/.github/workflows/Tasmota_build_devel.yml +++ b/.github/workflows/Tasmota_build_devel.yml @@ -3,10 +3,6 @@ name: Build_development on: workflow_dispatch: # Start a workflow - inputs: - Store_Tasmota_firmwares: # workflow name of the remote gh workflow - description: "Workflow Store_Tasmota_firmwares which will be triggered" - default: "Store_Tasmota_firmwares" push: branches: development paths-ignore: @@ -330,7 +326,7 @@ jobs: user_name: 'github-actions' - name: Dispatch worflow in Jason2866/Tasmota-firmware run: | - curl -X POST https://api.github.com/repos/Jason2866/Tasmota-firmware/dispatches \ + curl -X POST https://api.github.com/repos/Jason2866/Tasmota-firmware/actions/workflows/fetch_deploy.yml/dispatches \ -H 'Accept: application/vnd.github.everest-preview+json' \ -u ${{ secrets.API_TOKEN_GITHUB }} \ - --data '{"event_type": "Trigger Workflow", "client_payload": { "repository": "'"$GITHUB_REPOSITORY"'" }}' + --data '{"ref": "development"}' From fd7b18a11ff7f39812d26285afc0b036b25e0e7f Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Mon, 22 May 2023 13:22:15 +0200 Subject: [PATCH 167/289] start remote workflow with branch main --- .github/workflows/Tasmota_build_devel.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/Tasmota_build_devel.yml b/.github/workflows/Tasmota_build_devel.yml index 244e994b8..e70ea9e2b 100644 --- a/.github/workflows/Tasmota_build_devel.yml +++ b/.github/workflows/Tasmota_build_devel.yml @@ -329,4 +329,4 @@ jobs: curl -X POST https://api.github.com/repos/Jason2866/Tasmota-firmware/actions/workflows/fetch_deploy.yml/dispatches \ -H 'Accept: application/vnd.github.everest-preview+json' \ -u ${{ secrets.API_TOKEN_GITHUB }} \ - --data '{"ref": "development"}' + --data '{"ref": "main"}' From 1e374a43bfeea2ab3cb8ee6bc6434259b3fbec2b Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Mon, 22 May 2023 14:43:37 +0200 Subject: [PATCH 168/289] Rename Tasmota_build_devel.yml to Tasmota_build_devel.yml.old --- .../{Tasmota_build_devel.yml => Tasmota_build_devel.yml.old} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename .github/workflows/{Tasmota_build_devel.yml => Tasmota_build_devel.yml.old} (100%) diff --git a/.github/workflows/Tasmota_build_devel.yml b/.github/workflows/Tasmota_build_devel.yml.old similarity index 100% rename from .github/workflows/Tasmota_build_devel.yml rename to .github/workflows/Tasmota_build_devel.yml.old From 71f7960663a5cbd57d729f660bc5729fbc04b3b3 Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Mon, 22 May 2023 14:50:20 +0200 Subject: [PATCH 169/289] New workflow -> firmware pull --- .github/workflows/Tasmota_build_devel.yml | 249 ++++++++++++++++++++++ 1 file changed, 249 insertions(+) create mode 100644 .github/workflows/Tasmota_build_devel.yml diff --git a/.github/workflows/Tasmota_build_devel.yml b/.github/workflows/Tasmota_build_devel.yml new file mode 100644 index 000000000..18ffa8f5c --- /dev/null +++ b/.github/workflows/Tasmota_build_devel.yml @@ -0,0 +1,249 @@ + +name: Build_development + +on: + workflow_dispatch: # Start a workflow + push: + branches: development + paths-ignore: + - '.github/**' # Ignore changes towards the .github directory + - '**.md' # Do no build if *.md files changes + +# Ensures that only one deploy task per branch/environment will run at a time. +concurrency: + group: environment-${{ github.ref }} + cancel-in-progress: true + +jobs: + be_solidify: + runs-on: ubuntu-latest + if: github.repository == 'arendst/Tasmota' + continue-on-error: true + steps: + - uses: actions/checkout@v3 + - name: Set up Python + uses: actions/setup-python@v4 + with: + python-version: '3.x' + - name: Install clang compiler + run: | + sudo apt-get install -f clang + - name: Make Berry and Tasmota Berry code + run: | + cd lib/libesp32/berry + make + cd ../berry_tasmota + ../berry/berry -s -g solidify_all.be + - name: Matter Berry Code + run: | + cd lib/libesp32/berry_matter + ../berry/berry -s -g solidify_all.be + - name: LVGL Berry Code + run: | + cd lib/libesp32_lvgl/lv_binding_berry + ../../libesp32/berry/berry -s -g solidify_all.be + - uses: jason2866/upload-artifact@v2.0.2 + with: + name: '["berry_tasmota", "berry_matter", "berry_lvgl", "berry_header"]' + path: '["./lib/libesp32/berry_tasmota/src/solidify", "./lib/libesp32/berry_matter/src/solidify", "./lib/libesp32_lvgl/lv_binding_berry/src/solidify", "./lib/libesp32/berry/generate"]' + + push_solidified: + needs: be_solidify + runs-on: ubuntu-latest + if: github.repository == 'arendst/Tasmota' + continue-on-error: true + steps: + - uses: actions/checkout@v3 + - name: Set up Python + uses: actions/setup-python@v4 + with: + python-version: '3.x' + - uses: jason2866/download-artifact@v3 + with: + name: | + berry_tasmota + berry_matter + berry_lvgl + berry_header + path: | + ./lib/libesp32/berry_tasmota/src/solidify + ./lib/libesp32/berry_matter/src/solidify + ./lib/libesp32_lvgl/lv_binding_berry/src/solidify + ./lib/libesp32/berry/generate + - uses: stefanzweifel/git-auto-commit-action@v4 + with: + commit_message: Solidified Code updated + + safeboot-images: + needs: push_solidified + runs-on: ubuntu-latest + if: github.repository == 'arendst/Tasmota' + continue-on-error: true + strategy: + matrix: + variant: + - tasmota32solo1-safeboot + - tasmota32-safeboot + - tasmota32c3-safeboot + - tasmota32c3cdc-safeboot + - tasmota32s2-safeboot + - tasmota32s2cdc-safeboot + - tasmota32s3-safeboot + - tasmota32s3cdc-safeboot + steps: + - uses: actions/checkout@v3 + with: + ref: development + - name: Set up Python + uses: actions/setup-python@v4 + with: + python-version: '3.x' + - name: Install dependencies + run: | + pip install wheel + pip install -U platformio + - name: Run PlatformIO + run: platformio run -e ${{ matrix.variant }} + - name: Upload safeboot firmware artifacts + uses: actions/upload-artifact@v3 + with: + name: firmware_safeboot + path: ./build_output + + base-images: + needs: push_solidified + runs-on: ubuntu-latest + if: github.repository == 'arendst/Tasmota' + continue-on-error: true + strategy: + matrix: + variant: + - tasmota + - tasmota-4M + - tasmota-minimal + - tasmota-display + - tasmota-ir + - tasmota-knx + - tasmota-lite + - tasmota-sensors + - tasmota-zbbridge + - tasmota-zigbee + steps: + - uses: actions/checkout@v3 + with: + ref: development + - name: Set up Python + uses: actions/setup-python@v4 + with: + python-version: '3.x' + - name: Install dependencies + run: | + pip install wheel + pip install -U platformio + - name: Run PlatformIO + run: platformio run -e ${{ matrix.variant }} + - name: Upload firmware artifacts + uses: actions/upload-artifact@v3 + with: + name: firmware + path: ./build_output + + base32-images: + needs: safeboot-images + runs-on: ubuntu-latest + if: github.repository == 'arendst/Tasmota' + continue-on-error: true + strategy: + matrix: + variant: + - tasmota32 + - tasmota32-zbbrdgpro + - tasmota32-webcam + - tasmota32-bluetooth + - tasmota32-nspanel + - tasmota32-display + - tasmota32-ir + - tasmota32-lvgl + - tasmota32c3 + - tasmota32c3cdc + - tasmota32s2 + - tasmota32s2cdc + - tasmota32s3 + - tasmota32s3cdc + - tasmota32solo1 + steps: + - uses: actions/checkout@v3 + with: + ref: development + - name: Set up Python + uses: actions/setup-python@v4 + with: + python-version: '3.x' + - name: Install dependencies + run: | + pip install wheel + pip install -U platformio + - name: Download safeboot firmwares + uses: actions/download-artifact@v3 + with: + name: firmware_safeboot + path: ./firmware + - name: Display downloaded files + run: | + ls -R ./firmware/ + - name: Run PlatformIO + run: platformio run -e ${{ matrix.variant }} + - name: Upload firmware artifacts + uses: actions/upload-artifact@v3 + with: + name: firmware + path: ./build_output + + language-images: + needs: safeboot-images + runs-on: ubuntu-latest + if: github.repository == 'arendst/Tasmota' + continue-on-error: true + strategy: + matrix: + variant: [ tasmota, tasmota32 ] + language: [ AD, AF, BG, BR, CN, CZ, DE, ES, FR, FY, GR, HE, HU, IT, KO, NL, PL, PT, RO, RU, SE, SK, TR, TW, UK, VN ] + steps: + - uses: actions/checkout@v3 + with: + ref: development + - name: Set up Python + uses: actions/setup-python@v4 + with: + python-version: '3.x' + - name: Install dependencies + run: | + pip install wheel + pip install -U platformio + - name: Download safeboot firmwares + uses: actions/download-artifact@v3 + with: + name: firmware_safeboot + path: ./firmware + - name: Display downloaded files + run: | + ls -R ./firmware/ + - name: Run PlatformIO + run: platformio run -e ${{ matrix.variant }}-${{ matrix.language }} + - name: Upload language firmware artifacts + uses: actions/upload-artifact@v3 + with: + name: firmware + path: ./build_output + + Start_final_copy: + needs: [base-images, base32-images, language-images] + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - name: Dispatch workflow in arendst/Tasmota-firmware + run: | + curl -X POST https://api.github.com/repos/arendst/Tasmota-firmware/actions/workflows/fetch_deploy.yml/dispatches \ + -H 'Accept: application/vnd.github.everest-preview+json' \ + -u ${{ secrets.API_TOKEN_GITHUB }} \ + --data '{"ref": "main"}' From f0b583940826e247ae4e91838c1be01f1bb91853 Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Mon, 22 May 2023 15:28:21 +0200 Subject: [PATCH 170/289] Start needed not refactored GH workflows --- .github/workflows/Tasmota_build_devel.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/.github/workflows/Tasmota_build_devel.yml b/.github/workflows/Tasmota_build_devel.yml index 18ffa8f5c..2a63f2829 100644 --- a/.github/workflows/Tasmota_build_devel.yml +++ b/.github/workflows/Tasmota_build_devel.yml @@ -247,3 +247,9 @@ jobs: -H 'Accept: application/vnd.github.everest-preview+json' \ -u ${{ secrets.API_TOKEN_GITHUB }} \ --data '{"ref": "main"}' + - name: Dispatch workflow in arendst/Tasmota-firmware Part2 # Needed until complete refactoring is done + run: | + curl -X POST https://api.github.com/repos/arendst/Tasmota-firmware/actions/workflows/copy_development_firmware.yml/dispatches \ + -H 'Accept: application/vnd.github.everest-preview+json' \ + -u ${{ secrets.API_TOKEN_GITHUB }} \ + --data '{"ref": "action-development"}' From 385cd45f6011004d4c9f63143a557aa92106cf62 Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Mon, 22 May 2023 15:54:39 +0200 Subject: [PATCH 171/289] Delete Tasmota_build_devel.yml.old --- .github/workflows/Tasmota_build_devel.yml.old | 332 ------------------ 1 file changed, 332 deletions(-) delete mode 100644 .github/workflows/Tasmota_build_devel.yml.old diff --git a/.github/workflows/Tasmota_build_devel.yml.old b/.github/workflows/Tasmota_build_devel.yml.old deleted file mode 100644 index e70ea9e2b..000000000 --- a/.github/workflows/Tasmota_build_devel.yml.old +++ /dev/null @@ -1,332 +0,0 @@ - -name: Build_development - -on: - workflow_dispatch: # Start a workflow - push: - branches: development - paths-ignore: - - '.github/**' # Ignore changes towards the .github directory - - '**.md' # Do no build if *.md files changes - -# Ensures that only one deploy task per branch/environment will run at a time. -concurrency: - group: environment-${{ github.ref }} - cancel-in-progress: true - -jobs: - be_solidify: - runs-on: ubuntu-latest - if: github.repository == 'arendst/Tasmota' - continue-on-error: true - steps: - - uses: actions/checkout@v3 - - name: Set up Python - uses: actions/setup-python@v4 - with: - python-version: '3.x' - - name: Install clang compiler - run: | - sudo apt-get install -f clang - - name: Run coc - run: | - cd lib/libesp32/berry - ./gen.sh - - name: Make Berry and Tasmota Berry code - run: | - cd lib/libesp32/berry - make - cd ../berry_tasmota - ../berry/berry -s -g solidify_all.be - - name: Matter Berry Code - run: | - cd lib/libesp32/berry_matter - ../berry/berry -s -g solidify_all.be - - name: LVGL Berry Code - run: | - cd lib/libesp32_lvgl/lv_binding_berry - ../../libesp32/berry/berry -s -g solidify_all.be - - uses: jason2866/upload-artifact@v2.0.2 - with: - name: '["berry_tasmota", "berry_matter", "berry_lvgl", "berry_header"]' - path: '["./lib/libesp32/berry_tasmota/src/solidify", "./lib/libesp32/berry_matter/src/solidify", "./lib/libesp32_lvgl/lv_binding_berry/src/solidify", "./lib/libesp32/berry/generate"]' - - push_solidified: - needs: be_solidify - runs-on: ubuntu-latest - if: github.repository == 'arendst/Tasmota' - continue-on-error: true - steps: - - uses: actions/checkout@v3 - - name: Set up Python - uses: actions/setup-python@v4 - with: - python-version: '3.x' - - uses: jason2866/download-artifact@v3 - with: - name: | - berry_tasmota - berry_matter - berry_lvgl - berry_header - path: | - ./lib/libesp32/berry_tasmota/src/solidify - ./lib/libesp32/berry_matter/src/solidify - ./lib/libesp32_lvgl/lv_binding_berry/src/solidify - ./lib/libesp32/berry/generate - - uses: stefanzweifel/git-auto-commit-action@v4 - with: - commit_message: Solidified Code updated - - safeboot-images: - needs: push_solidified - runs-on: ubuntu-latest - if: github.repository == 'arendst/Tasmota' - continue-on-error: true - strategy: - matrix: - variant: - - tasmota32solo1-safeboot - - tasmota32-safeboot - - tasmota32c3-safeboot - - tasmota32c3cdc-safeboot - - tasmota32s2-safeboot - - tasmota32s2cdc-safeboot - - tasmota32s3-safeboot - - tasmota32s3cdc-safeboot - steps: - - uses: actions/checkout@v3 - with: - ref: development - - name: Set up Python - uses: actions/setup-python@v4 - with: - python-version: '3.x' - - name: Install dependencies - run: | - pip install wheel - pip install -U platformio - - name: Run PlatformIO - run: platformio run -e ${{ matrix.variant }} - - name: Upload safeboot firmware artifacts - uses: actions/upload-artifact@v3 - with: - name: firmware_safeboot - path: ./build_output - - base-images: - needs: push_solidified - runs-on: ubuntu-latest - if: github.repository == 'arendst/Tasmota' - continue-on-error: true - strategy: - matrix: - variant: - - tasmota - - tasmota-4M - - tasmota-minimal - - tasmota-display - - tasmota-ir - - tasmota-knx - - tasmota-lite - - tasmota-sensors - - tasmota-zbbridge - - tasmota-zigbee - steps: - - uses: actions/checkout@v3 - with: - ref: development - - name: Set up Python - uses: actions/setup-python@v4 - with: - python-version: '3.x' - - name: Install dependencies - run: | - pip install wheel - pip install -U platformio - - name: Run PlatformIO - run: platformio run -e ${{ matrix.variant }} - - name: Upload firmware artifacts - uses: actions/upload-artifact@v3 - with: - name: firmware - path: ./build_output - - base32-images: - needs: safeboot-images - runs-on: ubuntu-latest - if: github.repository == 'arendst/Tasmota' - continue-on-error: true - strategy: - matrix: - variant: - - tasmota32 - - tasmota32-zbbrdgpro - - tasmota32-webcam - - tasmota32-bluetooth - - tasmota32-nspanel - - tasmota32-display - - tasmota32-ir - - tasmota32-lvgl - - tasmota32c3 - - tasmota32c3cdc - - tasmota32s2 - - tasmota32s2cdc - - tasmota32s3 - - tasmota32s3cdc - - tasmota32solo1 - steps: - - uses: actions/checkout@v3 - with: - ref: development - - name: Set up Python - uses: actions/setup-python@v4 - with: - python-version: '3.x' - - name: Install dependencies - run: | - pip install wheel - pip install -U platformio - - name: Download safeboot firmwares - uses: actions/download-artifact@v3 - with: - name: firmware_safeboot - path: ./firmware - - name: Display downloaded files - run: | - ls -R ./firmware/ - - name: Run PlatformIO - run: platformio run -e ${{ matrix.variant }} - - name: Upload firmware artifacts - uses: actions/upload-artifact@v3 - with: - name: firmware - path: ./build_output - - language-images: - needs: safeboot-images - runs-on: ubuntu-latest - if: github.repository == 'arendst/Tasmota' - continue-on-error: true - strategy: - matrix: - variant: [ tasmota, tasmota32 ] - language: [ AD, AF, BG, BR, CN, CZ, DE, ES, FR, FY, GR, HE, HU, IT, KO, NL, PL, PT, RO, RU, SE, SK, TR, TW, UK, VN ] - steps: - - uses: actions/checkout@v3 - with: - ref: development - - name: Set up Python - uses: actions/setup-python@v4 - with: - python-version: '3.x' - - name: Install dependencies - run: | - pip install wheel - pip install -U platformio - - name: Download safeboot firmwares - uses: actions/download-artifact@v3 - with: - name: firmware_safeboot - path: ./firmware - - name: Display downloaded files - run: | - ls -R ./firmware/ - - name: Run PlatformIO - run: platformio run -e ${{ matrix.variant }}-${{ matrix.language }} - - name: Upload language firmware artifacts - uses: actions/upload-artifact@v3 - with: - name: firmware - path: ./build_output - - Upload: - needs: [base-images, base32-images, language-images] - runs-on: ubuntu-latest - continue-on-error: true - steps: - - name: Download firmware - uses: actions/download-artifact@v3 - with: - name: firmware - path: ./mv_firmware - - name: Downlaod safeboot firmware - uses: actions/download-artifact@v3 - with: - name: firmware_safeboot - path: ./mv_firmware - - name: Display structure of downloaded files - run: ls -R - working-directory: ./mv_firmware - - name: Move firmware files in sub-folders - run: | - mkdir -p ./firmware/tasmota/languages - mkdir -p ./firmware/tasmota32/languages - mkdir -p ./firmware/map - [ ! -f ./mv_firmware/map/* ] || mv ./mv_firmware/map/* ./firmware/map/ - [ ! -f ./mv_firmware/firmware/tasmota.* ] || mv ./mv_firmware/firmware/tasmota.* ./firmware/tasmota/ - [ ! -f ./mv_firmware/firmware/tasmota-4M.* ] || mv ./mv_firmware/firmware/tasmota-4M.* ./firmware/tasmota/ - [ ! -f ./mv_firmware/firmware/tasmota-sensors.* ] || mv ./mv_firmware/firmware/tasmota-sensors.* ./firmware/tasmota/ - [ ! -f ./mv_firmware/firmware/tasmota-minimal.bin.gz ] || mv ./mv_firmware/firmware/tasmota-minimal.bin.gz ./firmware/tasmota/ - [ ! -f ./mv_firmware/firmware/tasmota-lite.* ] || mv ./mv_firmware/firmware/tasmota-lite.* ./firmware/tasmota/ - [ ! -f ./mv_firmware/firmware/tasmota-ir*.* ] || mv ./mv_firmware/firmware/tasmota-ir*.* ./firmware/tasmota/ - [ ! -f ./mv_firmware/firmware/tasmota-display.* ] || mv ./mv_firmware/firmware/tasmota-display.* ./firmware/tasmota/ - [ ! -f ./mv_firmware/firmware/tasmota-knx.* ] || mv ./mv_firmware/firmware/tasmota-knx.* ./firmware/tasmota/ - [ ! -f ./mv_firmware/firmware/tasmota-zbbridge.* ] || mv ./mv_firmware/firmware/tasmota-zbbridge.* ./firmware/tasmota/ - [ ! -f ./mv_firmware/firmware/tasmota-zigbee.* ] || mv ./mv_firmware/firmware/tasmota-zigbee.* ./firmware/tasmota/ - [ ! -f ./mv_firmware/firmware/tasmota32.* ] || mv ./mv_firmware/firmware/tasmota32.* ./firmware/tasmota32/ - [ ! -f ./mv_firmware/firmware/tasmota32solo1*.* ] || mv ./mv_firmware/firmware/tasmota32solo1*.* ./firmware/tasmota32/ - [ ! -f ./mv_firmware/firmware/tasmota32-ir*.* ] || mv ./mv_firmware/firmware/tasmota32-ir*.* ./firmware/tasmota32/ - [ ! -f ./mv_firmware/firmware/tasmota32-display.* ] || mv ./mv_firmware/firmware/tasmota32-display.* ./firmware/tasmota32/ - [ ! -f ./mv_firmware/firmware/tasmota32-lvgl.* ] || mv ./mv_firmware/firmware/tasmota32-lvgl.* ./firmware/tasmota32/ - [ ! -f ./mv_firmware/firmware/tasmota32-web*.* ] || mv ./mv_firmware/firmware/tasmota32-web*.* ./firmware/tasmota32/ - [ ! -f ./mv_firmware/firmware/tasmota32-odroidgo.* ] || mv ./mv_firmware/firmware/tasmota32-odroidgo.* ./firmware/tasmota32/ - [ ! -f ./mv_firmware/firmware/tasmota32-zbbrdgpro.* ] || mv ./mv_firmware/firmware/tasmota32-zbbrdgpro.* ./firmware/tasmota32/ - [ ! -f ./mv_firmware/firmware/tasmota32-nspanel.* ] || mv ./mv_firmware/firmware/tasmota32-nspanel.* ./firmware/tasmota32/ - [ ! -f ./mv_firmware/firmware/tasmota32-core2.* ] || mv ./mv_firmware/firmware/tasmota32-core2.* ./firmware/tasmota32/ - [ ! -f ./mv_firmware/firmware/tasmota32-bluetooth.* ] || mv ./mv_firmware/firmware/tasmota32-bluetooth.* ./firmware/tasmota32/ - [ ! -f ./mv_firmware/firmware/tasmota32c3*.* ] || mv ./mv_firmware/firmware/tasmota32c3*.* ./firmware/tasmota32/ - [ ! -f ./mv_firmware/firmware/tasmota32s2*.* ] || mv ./mv_firmware/firmware/tasmota32s2*.* ./firmware/tasmota32/ - [ ! -f ./mv_firmware/firmware/tasmota32s3*.* ] || mv ./mv_firmware/firmware/tasmota32s3*.* ./firmware/tasmota32/ - [ ! -f ./mv_firmware/firmware/tasmota32-safeboot* ] || mv ./mv_firmware/firmware/tasmota32-safeboot* ./firmware/tasmota32/ - [ ! -f ./mv_firmware/firmware/tasmota32-* ] || mv ./mv_firmware/firmware/tasmota32-* ./firmware/tasmota32/languages/ - [ ! -f ./mv_firmware/firmware/tasmota32* ] || mv ./mv_firmware/firmware/tasmota32* ./firmware/tasmota32/ - [ ! -f ./mv_firmware/firmware/tasmota-minimal.bin ] || rm -rf ./mv_firmware/firmware/tasmota-minimal.bin - [ ! -f ./mv_firmware/firmware/* ] || mv ./mv_firmware/firmware/* ./firmware/tasmota/languages/ - - name: Display files to transfer - run: ls -R ./* - - name: Push tasmota files to tmp_copy repo - uses: Jason2866/copy_file_to_another_repo_action@http408_fix - env: - API_TOKEN_GITHUB: ${{ secrets.API_TOKEN_GITHUB }} - with: - source_file: 'firmware' - destination_repo: 'arendst/tmp_copy' - destination_branch_create: 'firmware' - user_email: 'github-actions@github.com' - user_name: 'github-actions' - Start_final_copy: - needs: Upload - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v3 - - name: Creat trigger.txt - run: | - echo ${GITHUB_SHA} &> trigger.txt - echo "$( Date: Mon, 22 May 2023 16:21:50 +0200 Subject: [PATCH 172/289] Even more bling bling --- tasmota/tasmota_xsns_sensor/xsns_79_as608.ino | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/tasmota/tasmota_xsns_sensor/xsns_79_as608.ino b/tasmota/tasmota_xsns_sensor/xsns_79_as608.ino index cf41931c3..a69f62b08 100644 --- a/tasmota/tasmota_xsns_sensor/xsns_79_as608.ino +++ b/tasmota/tasmota_xsns_sensor/xsns_79_as608.ino @@ -20,6 +20,9 @@ #ifdef USE_AS608 /*********************************************************************************************\ * AS608 optical and R503 capacitive Fingerprint sensor + * - AS608 supports no color leds + * - R503 v1.1 supports 3 color ring (Red, Blue, Purple) + * - R503 v1.2 supports 7 color ring (Red, Blue, Purple, Green, Yellow, Cyan, White) * * Uses Adafruit-Fingerprint-sensor-library with TasmotaSerial * @@ -35,8 +38,11 @@ #ifndef AS608_DUPLICATE #define AS608_DUPLICATE 4 // Number of 0.25 Sec to disable detection #endif +#ifndef AS608_COLOR_INIT +#define AS608_COLOR_INIT 1 // Red = 1, Blue = 2, Purple = 3, Green = 4, Yellow = 5, Cyan = 6, White = 7 +#endif #ifndef AS608_COLOR_SCAN -#define AS608_COLOR_SCAN 3 // Red = 1, Blue = 2, Purple = 3 +#define AS608_COLOR_SCAN 3 // Red = 1, Blue = 2, Purple = 3, Green = 4, Yellow = 5, Cyan = 6, White = 7 #endif #define D_JSON_FPRINT "FPrint" @@ -115,6 +121,8 @@ void As608Init(void) { As608Finger->getTemplateCount(); AddLog(LOG_LEVEL_INFO, PSTR("AS6: Detected with %d fingerprint(s) stored"), As608Finger->templateCount); As608.selected = true; + + As608Finger->LEDcontrol(FINGERPRINT_LED_BREATHING, 100, AS608_COLOR_INIT, 3); } } } @@ -138,6 +146,7 @@ int As608ConvertFingerImage(uint8_t slot) { } void As608Loop(void) { + if (TasmotaGlobal.uptime < 6) { return; } // Alow time for initial led breathing uint32_t p = 0; if (!As608.enroll_step) { @@ -149,12 +158,6 @@ void As608Loop(void) { } // Search for Finger - -// As608Finger->LEDcontrol(FINGERPRINT_LED_OFF, 0, FINGERPRINT_LED_RED); -// As608Finger->LEDcontrol(FINGERPRINT_LED_OFF, 0, FINGERPRINT_LED_BLUE); -// As608Finger->LEDcontrol(FINGERPRINT_LED_OFF, 0, FINGERPRINT_LED_PURPLE); -// As608Finger->LEDcontrol(0); - p = As608Finger->getImage(); // Take image if (p != FINGERPRINT_OK) { return; } From 2c8f9f86312a8324d75538433d2e018afe2f63be Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Mon, 22 May 2023 17:00:20 +0200 Subject: [PATCH 173/289] action moved --- .github/workflows/Tasmota_build_devel.yml | 6 ------ 1 file changed, 6 deletions(-) diff --git a/.github/workflows/Tasmota_build_devel.yml b/.github/workflows/Tasmota_build_devel.yml index 2a63f2829..18ffa8f5c 100644 --- a/.github/workflows/Tasmota_build_devel.yml +++ b/.github/workflows/Tasmota_build_devel.yml @@ -247,9 +247,3 @@ jobs: -H 'Accept: application/vnd.github.everest-preview+json' \ -u ${{ secrets.API_TOKEN_GITHUB }} \ --data '{"ref": "main"}' - - name: Dispatch workflow in arendst/Tasmota-firmware Part2 # Needed until complete refactoring is done - run: | - curl -X POST https://api.github.com/repos/arendst/Tasmota-firmware/actions/workflows/copy_development_firmware.yml/dispatches \ - -H 'Accept: application/vnd.github.everest-preview+json' \ - -u ${{ secrets.API_TOKEN_GITHUB }} \ - --data '{"ref": "action-development"}' From c1ec35a086e1346d69785f1360a3758e0c309279 Mon Sep 17 00:00:00 2001 From: s-hadinger <49731213+s-hadinger@users.noreply.github.com> Date: Mon, 22 May 2023 20:46:20 +0200 Subject: [PATCH 174/289] Matter fix fabric provisioning from CASE session for iOS 16.5 (#18709) --- CHANGELOG.md | 1 + .../src/embedded/Matter_Commissioning.be | 51 +- .../src/embedded/Matter_Device.be | 11 +- .../src/embedded/Matter_Fabric.be | 57 + .../berry_matter/src/embedded/Matter_IM.be | 3 +- .../src/embedded/Matter_Plugin_Root.be | 92 +- .../src/embedded/Matter_Session.be | 108 +- .../solidified_Matter_Commissioning.h | 615 ++-- .../src/solidify/solidified_Matter_Device.h | 20 +- .../src/solidify/solidified_Matter_Fabric.h | 2087 ++++++++------ .../src/solidify/solidified_Matter_IM.h | 459 +-- .../solidify/solidified_Matter_Plugin_Root.h | 1527 +++++----- .../src/solidify/solidified_Matter_Session.h | 2519 ++++++++--------- 13 files changed, 3925 insertions(+), 3625 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b861d94d1..83c31ccfc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -23,6 +23,7 @@ All notable changes to this project will be documented in this file. - AIThinker webcam issues (#18652) - Berry `tasmota.wifi()` would wrongly report wifi as up - Inverted shutter now reflect status also in WEBGUI and several minor fixes to make "inverted" consistant (#18701) +- Matter fix fabric provisioning from CASE session for iOS 16.5 ### Removed diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Commissioning.be b/lib/libesp32/berry_matter/src/embedded/Matter_Commissioning.be index a77ea792d..82dbfbc06 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Commissioning.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Commissioning.be @@ -461,15 +461,15 @@ class Matter_Commisioning_Context tasmota.log(string.format("MTR: +Session (%6i) from '[%s]:%i'", session.__future_local_session_id, msg.remote_ip, msg.remote_port), 2) tasmota.log("MTR: fabric="+matter.inspect(session._fabric), 4) - tasmota.log("MTR: no_private_key="+session._fabric.no_private_key.tohex(), 4) - tasmota.log("MTR: noc ="+session._fabric.noc.tohex(), 4) - if session._fabric.get_icac() - tasmota.log("MTR: icac ="+session._fabric.get_icac().tohex(), 4) + tasmota.log("MTR: no_private_key="+session.get_pk().tohex(), 4) + tasmota.log("MTR: noc ="+session.get_noc().tohex(), 4) + if fabric.get_icac() + tasmota.log("MTR: icac ="+fabric.get_icac().tohex(), 4) end - tasmota.log("MTR: root_ca_cert ="+session._fabric.root_ca_certificate.tohex(), 4) + tasmota.log("MTR: root_ca_cert ="+fabric.get_ca().tohex(), 4) # Compute Sigma2, p.162 - session.resumption_id = crypto.random(16) + session.resumption_id = crypto.random(16) # generate a new resumption id session.__responder_priv = crypto.random(32) session.__responder_pub = crypto.EC_P256().public_key(session.__responder_priv) tasmota.log("MTR: ResponderEph_priv ="+session.__responder_priv.tohex(), 4) @@ -477,53 +477,58 @@ class Matter_Commisioning_Context var responderRandom = crypto.random(32) session.shared_secret = crypto.EC_P256().shared_key(session.__responder_priv, sigma1.initiatorEphPubKey) + tasmota.log("MTR: * shared_secret = " + session.shared_secret.tohex(), 4) var sigma2_tbsdata = matter.TLV.Matter_TLV_struct() - sigma2_tbsdata.add_TLV(1, matter.TLV.B2, session.get_noc()) - sigma2_tbsdata.add_TLV(2, matter.TLV.B2, session.get_icac()) + sigma2_tbsdata.add_TLV(1, matter.TLV.B2, fabric.get_noc()) + sigma2_tbsdata.add_TLV(2, matter.TLV.B2, fabric.get_icac()) sigma2_tbsdata.add_TLV(3, matter.TLV.B2, session.__responder_pub) sigma2_tbsdata.add_TLV(4, matter.TLV.B2, sigma1.initiatorEphPubKey) - var TBSData2Signature = crypto.EC_P256().ecdsa_sign_sha256(session.get_pk(), sigma2_tbsdata.tlv2raw()) + var TBSData2Signature = crypto.EC_P256().ecdsa_sign_sha256(fabric.get_pk(), sigma2_tbsdata.tlv2raw()) + tasmota.log("****************************************", 4) + tasmota.log("MTR: * fabric.get_pk = " + str(fabric.get_pk()), 4) + tasmota.log("MTR: * sigma2_tbsdata = " + str(sigma2_tbsdata), 4) + tasmota.log("MTR: * TBSData2Signature = " + TBSData2Signature.tohex(), 4) var sigma2_tbedata = matter.TLV.Matter_TLV_struct() - sigma2_tbedata.add_TLV(1, matter.TLV.B2, session.get_noc()) - sigma2_tbedata.add_TLV(2, matter.TLV.B2, session.get_icac()) + sigma2_tbedata.add_TLV(1, matter.TLV.B2, fabric.get_noc()) + sigma2_tbedata.add_TLV(2, matter.TLV.B2, fabric.get_icac()) sigma2_tbedata.add_TLV(3, matter.TLV.B2, TBSData2Signature) sigma2_tbedata.add_TLV(4, matter.TLV.B2, session.resumption_id) # compute TranscriptHash = Crypto_Hash(message = Msg1) - # tasmota.log("****************************************", 4) + tasmota.log("****************************************", 4) session.__Msg1 = sigma1.Msg1 - # tasmota.log("MTR: * resumptionid = " + session.resumption_id.tohex(), 4) - # tasmota.log("MTR: * MSG1 = " + session.__Msg1.tohex(), 4) + tasmota.log("MTR: * resumptionid = " + session.resumption_id.tohex(), 4) + tasmota.log("MTR: * MSG1 = " + session.__Msg1.tohex(), 4) var TranscriptHash = crypto.SHA256().update(session.__Msg1).out() - # tasmota.log("MTR: TranscriptHash =" + TranscriptHash.tohex(), 4) + tasmota.log("MTR: TranscriptHash =" + TranscriptHash.tohex(), 4) # Compute S2K, p.175 var s2k_info = bytes().fromstring(self.S2K_Info) - var s2k_salt = session.get_ipk_group_key() + responderRandom + session.__responder_pub + TranscriptHash + var s2k_salt = fabric.get_ipk_group_key() + responderRandom + session.__responder_pub + TranscriptHash var s2k = crypto.HKDF_SHA256().derive(session.shared_secret, s2k_salt, s2k_info, 16) - # tasmota.log("MTR: * SharedSecret = " + session.shared_secret.tohex(), 4) - # tasmota.log("MTR: * s2k_salt = " + s2k_salt.tohex(), 4) - # tasmota.log("MTR: * s2k = " + s2k.tohex(), 4) + tasmota.log("MTR: * SharedSecret = " + session.shared_secret.tohex(), 4) + tasmota.log("MTR: * s2k_salt = " + s2k_salt.tohex(), 4) + tasmota.log("MTR: * s2k = " + s2k.tohex(), 4) var sigma2_tbedata_raw = sigma2_tbedata.tlv2raw() - # tasmota.log("MTR: * TBEData2Raw = " + sigma2_tbedata_raw.tohex(), 4) + tasmota.log("MTR: * TBEData2Raw = " + sigma2_tbedata_raw.tohex(), 4) # // `AES_CCM.init(secret_key:bytes(16 or 32), iv:bytes(7..13), aad:bytes(), data_len:int, tag_len:int) -> instance` var aes = crypto.AES_CCM(s2k, bytes().fromstring(self.TBEData2_Nonce), bytes(), size(sigma2_tbedata_raw), 16) var TBEData2Encrypted = aes.encrypt(sigma2_tbedata_raw) + aes.tag() - # tasmota.log("MTR: * TBEData2Enc = " + TBEData2Encrypted.tohex(), 4) - # tasmota.log("****************************************", 4) + tasmota.log("MTR: * TBEData2Enc = " + TBEData2Encrypted.tohex(), 4) + tasmota.log("****************************************", 4) var sigma2 = matter.Sigma2() sigma2.responderRandom = responderRandom sigma2.responderSessionId = session.__future_local_session_id sigma2.responderEphPubKey = session.__responder_pub sigma2.encrypted2 = TBEData2Encrypted - # tasmota.log("MTR: sigma2: " + matter.inspect(sigma2), 4) + tasmota.log("MTR: sigma2: " + matter.inspect(sigma2), 4) var sigma2_raw = sigma2.tlv2raw() session.__Msg2 = sigma2_raw # tasmota.log("MTR: sigma2_raw: " + sigma2_raw.tohex(), 4) diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Device.be b/lib/libesp32/berry_matter/src/embedded/Matter_Device.be index 8eff6f140..a9b9aaf12 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Device.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Device.be @@ -381,9 +381,9 @@ class Matter_Device # Start Operational Discovery for this session # # Deferred until next tick. - def start_operational_discovery_deferred(session) + def start_operational_discovery_deferred(fabric) # defer to next click - tasmota.set_timer(0, /-> self.start_operational_discovery(session)) + tasmota.set_timer(0, /-> self.start_operational_discovery(fabric)) end ############################################################# @@ -400,7 +400,7 @@ class Matter_Device # # Stop Basic Commissioning and clean PASE specific values (to save memory). # Announce fabric entry in mDNS. - def start_operational_discovery(session) + def start_operational_discovery(fabric) import crypto import mdns import string @@ -411,10 +411,7 @@ class Matter_Device # self.root_w1 = nil self.root_L = nil - # we keep the PASE session for 1 minute - session.set_expire_in_seconds(60) - - self.mdns_announce_op_discovery(session.get_fabric()) + self.mdns_announce_op_discovery(fabric) end ############################################################# diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Fabric.be b/lib/libesp32/berry_matter/src/embedded/Matter_Fabric.be index aee02ef36..0b990ccf5 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Fabric.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Fabric.be @@ -96,6 +96,54 @@ class Matter_Fabric : Matter_Expirable def get_fabric_index() return self.fabric_index end def set_fabric_index(v) self.fabric_index = v end + def set_ca(ca) + self.root_ca_certificate = ca + end + def set_noc_icac(noc, icac) + self.noc = noc + self.icac = icac + end + def set_ipk_epoch_key(ipk_epoch_key) + self.ipk_epoch_key = ipk_epoch_key + end + def set_admin_subject_vendor(admin_subject, admin_vendor) + self.admin_subject = admin_subject + self.admin_vendor = admin_vendor + end + + def set_fabric_device(fabric_id, device_id, fc, fabric_parent) + self.fabric_id = fabric_id + self.device_id = device_id + self.fabric_compressed = fc + self.fabric_parent = (fabric_parent != nil) ? fabric_parent.get_fabric_index() : nil + end + + ############################################################# + # Generate a private key (or retrieve it) + # + # PK is generated by a commissioning session + def get_pk() + return self.no_private_key + end + def set_pk(pk) + self.no_private_key = pk + end + + ############################################################# + # Register the frabric as complete (end of commissioning) + def fabric_candidate() + self.set_expire_in_seconds(120) # expire in 2 minutes + self.assign_fabric_index() + self._store.add_fabric(self) + end + + ############################################################# + # Assign a new fabric index + def assign_fabric_index() + if (self.get_fabric_index() == nil) + self.set_fabric_index(self._store.next_fabric_idx()) + end + end ############################################################# # When hydrating from persistance, update counters @@ -109,6 +157,15 @@ class Matter_Fabric : Matter_Expirable self.counter_group_ctrl_snd = self._counter_group_ctrl_snd_impl.val() end + ############################################################# + # Register the fabric as complete (end of commissioning) + def fabric_completed() + self.set_no_expiration() + self.set_persist(true) + self.assign_fabric_index() + self._store.add_fabric(self) + end + ############################################################# # Management of security counters ############################################################# diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_IM.be b/lib/libesp32/berry_matter/src/embedded/Matter_IM.be index 50c17bd82..b10be36bd 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_IM.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_IM.be @@ -402,9 +402,10 @@ class Matter_IM ctx.status = matter.UNSUPPORTED_COMMAND #default error if returned `nil` var cmd_name = matter.get_command_name(ctx.cluster, ctx.command) + var ctx_str = str(ctx) # keep string before invoking, it is modified by response var res = self.device.invoke_request(msg.session, q.command_fields, ctx) var params_log = (ctx.log != nil) ? "(" + str(ctx.log) + ") " : "" - tasmota.log(string.format("MTR: >Command (%6i) %s %s %s", msg.session.local_session_id, str(ctx), cmd_name ? cmd_name : "", params_log), 2) + tasmota.log(string.format("MTR: >Command (%6i) %s %s %s", msg.session.local_session_id, ctx_str, cmd_name ? cmd_name : "", params_log), 2) ctx.log = nil var a1 = matter.InvokeResponseIB() if res == true || ctx.status == matter.SUCCESS # special case, just respond ok diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Root.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Root.be index 76f2440ff..9977d6b62 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Root.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Root.be @@ -362,22 +362,26 @@ class Matter_Plugin_Root : Matter_Plugin elif command == 0x0004 # ---------- CommissioningComplete p.636 ---------- # no data - session._breadcrumb = 0 # clear breadcrumb - session.fabric_completed() # fabric information is complete, persist - session.set_no_expiration() - session.save() + if session._fabric + session._breadcrumb = 0 # clear breadcrumb + session._fabric.fabric_completed() # fabric information is complete, persist + session.set_no_expiration() + session.save() - # create CommissioningCompleteResponse - # ID=1 - # 0=ErrorCode (OK=0) - # 1=DebugText - var ccr = TLV.Matter_TLV_struct() - ccr.add_TLV(0, TLV.U1, 0) # ErrorCode = OK - ccr.add_TLV(1, TLV.UTF1, "") # DebugText = "" - ctx.command = 0x05 # CommissioningCompleteResponse + # create CommissioningCompleteResponse + # ID=1 + # 0=ErrorCode (OK=0) + # 1=DebugText + var ccr = TLV.Matter_TLV_struct() + ccr.add_TLV(0, TLV.U1, 0) # ErrorCode = OK + ccr.add_TLV(1, TLV.UTF1, "") # DebugText = "" + ctx.command = 0x05 # CommissioningCompleteResponse - self.device.start_commissioning_complete_deferred(session) - return ccr + self.device.start_commissioning_complete_deferred(session) + return ccr + else + raise "context_error", "CommissioningComplete: no fabric attached" + end end elif cluster == 0x003E # ========== Node Operational Credentials Cluster 11.17 p.704 ========== @@ -427,6 +431,7 @@ class Matter_Plugin_Root : Matter_Plugin var CSRNonce = val.findsubval(0) # octstr 32 if size(CSRNonce) != 32 return nil end # check size on nonce var IsForUpdateNOC = val.findsubval(1, false) # bool + tasmota.log(string.format("MTR: CSRRequest CSRNonce=%s IsForUpdateNOC=%s", str(CSRNonce), str(IsForUpdateNOC)), 3) var csr = session.gen_CSR() @@ -450,12 +455,14 @@ class Matter_Plugin_Root : Matter_Plugin elif command == 0x000B # ---------- AddTrustedRootCertificate ---------- var RootCACertificate = val.findsubval(0) # octstr 400 max - session.set_ca(RootCACertificate) + # TODO - additional tests are expected according to 11.17.7.13. AddTrustedRootCertificate Command + session.set_temp_ca(RootCACertificate) tasmota.log("MTR: received ca_root="+RootCACertificate.tohex(), 3) ctx.status = matter.SUCCESS # OK return nil # trigger a standalone ack elif command == 0x0006 # ---------- AddNOC ---------- + tasmota.log("MTR: AddNoc Args=" + str(val), 3) var NOCValue = val.findsubval(0) # octstr max 400 var ICACValue = val.findsubval(1) # octstr max 400 # Apple sends an empty ICAC instead of a missing attribute, fix this @@ -463,21 +470,32 @@ class Matter_Plugin_Root : Matter_Plugin var IpkValue = val.findsubval(2) # octstr max 16 var CaseAdminSubject = val.findsubval(3) var AdminVendorId = val.findsubval(4) + # tasmota.log("MTR: AddNoc NOCValue=" + (NOCValue ? NOCValue.tohex() : ""), 3) + # tasmota.log("MTR: AddNoc ICACValue=" + (ICACValue ? ICACValue.tohex() : ""), 3) + # tasmota.log("MTR: AddNoc IpkValue=" + str(IpkValue), 3) + # tasmota.log("MTR: AddNoc CaseAdminSubject=" + str(CaseAdminSubject), 3) + # tasmota.log("MTR: AddNoc AdminVendorId=" + str(AdminVendorId), 3) - if session.get_ca() == nil + if session.get_temp_ca() == nil tasmota.log("MTR: Error: AdNOC without CA", 2) return nil end - session.set_noc(NOCValue, ICACValue) - session.set_ipk_epoch_key(IpkValue) - session.set_admin_subject_vendor(CaseAdminSubject, AdminVendorId) + var new_fabric = self.device.sessions.create_fabric() + new_fabric.set_ca(session.get_temp_ca()) # copy temporary CA to fabric + new_fabric.set_noc_icac(NOCValue, ICACValue) + new_fabric.set_ipk_epoch_key(IpkValue) + new_fabric.set_admin_subject_vendor(CaseAdminSubject, AdminVendorId) + new_fabric.set_pk(session.get_pk()) # copy the temporary commissioning PK to the fabric # extract important information from NOC var noc_cert = matter.TLV.parse(NOCValue) var dnlist = noc_cert.findsub(6) var fabric_id = dnlist.findsubval(21) var deviceid = dnlist.findsubval(17) + # tasmota.log("MTR: AddNoc noc_cert=" + str(noc_cert), 3) + # tasmota.log("MTR: AddNoc dnlist=" + str(dnlist), 3) + if !fabric_id || !deviceid tasmota.log("MTR: Error: no fabricid nor deviceid in NOC certificate", 2) return false @@ -486,25 +504,37 @@ class Matter_Plugin_Root : Matter_Plugin if type(fabric_id) == 'int' fabric_id = int64.fromu32(fabric_id).tobytes() else fabric_id = fabric_id.tobytes() end if type(deviceid) == 'int' deviceid = int64.fromu32(deviceid).tobytes() else deviceid = deviceid.tobytes() end - var root_ca = matter.TLV.parse(session.get_ca()).findsubval(9) # extract public key from ca - root_ca = root_ca[1..] # remove first byte as per Matter specification + # tasmota.log("MTR: AddNoc fabric_id=" + str(fabric_id), 3) + # tasmota.log("MTR: AddNoc deviceid=" + str(deviceid), 3) + + var root_ca_pub = session.get_temp_ca_pub() + # tasmota.log("MTR: AddNoc root_ca_pub=" + str(root_ca_pub), 3) + # tasmota.log("MTR: AddNoc root_ca_pub=" + root_ca_pub.tohex(), 3) + root_ca_pub = root_ca_pub[1..] # remove first byte as per Matter specification var info = bytes().fromstring("CompressedFabric") # as per spec, 4.3.2.2 p.99 var hk = crypto.HKDF_SHA256() var fabric_rev = fabric_id.copy().reverse() - var k_fabric = hk.derive(root_ca, fabric_rev, info, 8) - session.set_fabric_device(fabric_id, deviceid, k_fabric, self.device.commissioning_admin_fabric) + var k_fabric = hk.derive(root_ca_pub, fabric_rev, info, 8) + var parent_fabric = session._fabric ? session._fabric : self.device.commissioning_admin_fabric # get parent fabric whether CASE or PASE + new_fabric.set_fabric_device(fabric_id, deviceid, k_fabric, parent_fabric) + # tasmota.log("MTR: AddNoc k_fabric=" + str(k_fabric), 3) # We have a candidate fabric, add it as expirable for 2 minutes - session.persist_to_fabric() # fabric object is completed, persist it - session.fabric_candidate() + new_fabric.fabric_candidate() # move to next step - self.device.start_operational_discovery_deferred(session) - # session.fabric_completed() - tasmota.log("MTR: ------------------------------------------", 3) - tasmota.log("MTR: fabric=" + matter.inspect(session._fabric), 3) - tasmota.log("MTR: ------------------------------------------", 3) - session._fabric.log_new_fabric() # log that we registered a new fabric + self.device.start_operational_discovery_deferred(new_fabric) + + # we keep the PASE session for 1 minute + if session.is_PASE() + session.set_expire_in_seconds(60) + end + + # tasmota.log("MTR: ------------------------------------------", 3) + # tasmota.log("MTR: session=" + matter.inspect(session), 3) + # tasmota.log("MTR: fabric=" + matter.inspect(session._fabric), 3) + # tasmota.log("MTR: ------------------------------------------", 3) + new_fabric.log_new_fabric() # log that we registered a new fabric # create NOCResponse # 0=StatusCode # 1=FabricIndex (1-254) (opt) diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Session.be b/lib/libesp32/berry_matter/src/embedded/Matter_Session.be index b0fe0185c..5066c3199 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Session.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Session.be @@ -48,6 +48,9 @@ class Matter_Session : Matter_Expirable var created # timestamp (UTC) when the session was created var last_used # timestamp (UTC) when the session was last used var _source_node_id # source node if bytes(8) (opt, used only when session is not established) + # temporary data for ArmFailSafe provisioning - before it is stored in a fabric + var _temp_root_ca_certificate # temporary root_ca_certificate added by `AddTrustedRootCertificate` before `AddNoc` + var _temp_pk # session_ids when the session will be active var __future_initiator_session_id var __future_local_session_id @@ -108,7 +111,7 @@ class Matter_Session : Matter_Expirable self._breadcrumb = 0 self._exchange_id = crypto.random(2).get(0,2) # generate a random 16 bits number, then increment with rollover - self._fabric = fabric ? fabric : self._store.create_fabric() + self._fabric = fabric self.update() end @@ -172,31 +175,6 @@ class Matter_Session : Matter_Expirable def set_mode_CASE() self.set_mode(self._CASE) end def is_PASE() return self.mode == self._PASE end def is_CASE() return self.mode == self._CASE end - - ############################################################# - # Assign a new fabric index - def assign_fabric_index() - if (self._fabric.get_fabric_index() == nil) - self._fabric.set_fabric_index(self._store.next_fabric_idx()) - end - end - - ############################################################# - # Register the fabric as complete (end of commissioning) - def fabric_completed() - self._fabric.set_no_expiration() - self._fabric.set_persist(true) - self.assign_fabric_index() - self._store.add_fabric(self._fabric) - end - - ############################################################# - # Register the frabric as complete (end of commissioning) - def fabric_candidate() - self._fabric.set_expire_in_seconds(120) # expire in 2 minutes - self.assign_fabric_index() - self._store.add_fabric(self._fabric) - end ############################################################# # Persist to fabric @@ -241,26 +219,16 @@ class Matter_Session : Matter_Expirable self.attestation_challenge = ac self.created = st end - def set_ca(ca) - self._fabric.root_ca_certificate = ca + def set_temp_ca(ca) + self._temp_root_ca_certificate = ca end - def set_noc(noc, icac) - self._fabric.noc = noc - self._fabric.icac = icac - end - def set_ipk_epoch_key(ipk_epoch_key) - self._fabric.ipk_epoch_key = ipk_epoch_key - end - def set_admin_subject_vendor(admin_subject, admin_vendor) - self._fabric.admin_subject = admin_subject - self._fabric.admin_vendor = admin_vendor - end - - def set_fabric_device(fabric_id, device_id, fc, fabric_parent) - self._fabric.fabric_id = fabric_id - self._fabric.device_id = device_id - self._fabric.fabric_compressed = fc - self._fabric.fabric_parent = (fabric_parent != nil) ? fabric_parent.get_fabric_index() : nil + def get_temp_ca() return self._temp_root_ca_certificate end + def get_temp_ca_pub() + var ca = self._temp_root_ca_certificate + if ca + var m = matter.TLV.parse(ca) + return m.findsubval(9) + end end def set_fabric_label(s) if type(s) == 'string' @@ -269,12 +237,8 @@ class Matter_Session : Matter_Expirable end ############################################################# - def get_mode() - return self.mode - end - def get_i2r() - return self.i2rkey - end + def get_mode() return self.mode end + def get_i2r() return self.i2rkey end def get_i2r_privacy() # get and cache privacy key if self._i2r_privacy == nil import crypto @@ -283,18 +247,11 @@ class Matter_Session : Matter_Expirable end return self._i2r_privacy end - def get_r2i() - return self.r2ikey - end - def get_ac() - return self.attestation_challenge - end - def get_ca() - return self._fabric.root_ca_certificate - end - def get_ca_pub() - return self._fabric.get_ca_pub() - end + def get_r2i() return self.r2ikey end + def get_ac() return self.attestation_challenge end + + def get_ca() return self._fabric.root_ca_certificate end + def get_ca_pub() return self._fabric.get_ca_pub() end def get_fabric() return self._fabric end def get_noc() return self._fabric.noc end def get_icac() return self._fabric.icac end @@ -307,24 +264,27 @@ class Matter_Session : Matter_Expirable def get_admin_vendor() return self._fabric.admin_vendor end ############################################################# - # Generate a private key (or retrieve it) + # Get operational key pair (private key) + # + # If there is a fabric, retrieve the PK from the fabric + # If there is no fabric, create a temporary PK in `_temp_pk` + # to be stored later in the fabric def get_pk() - if !self._fabric.no_private_key - import crypto - self._fabric.no_private_key = crypto.random(32) + if self._fabric + return self._fabric.get_pk() + else + if !self._temp_pk + import crypto + self._temp_pk = crypto.random(32) + end + return self._temp_pk end - return self._fabric.no_private_key end ############################################################# # Operational Group Key Derivation, 4.15.2, p.182 def get_ipk_group_key() - if self.get_ipk_epoch_key() == nil || self.get_fabric_compressed() == nil return nil end - import crypto - var hk = crypto.HKDF_SHA256() - var info = bytes().fromstring(self._GROUP_KEY) - var hash = hk.derive(self.get_ipk_epoch_key(), self.get_fabric_compressed(), info, 16) - return hash + return self._fabric.get_ipk_group_key() end ############################################################# diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Commissioning.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Commissioning.h index f37665721..dfc95aae1 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Commissioning.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Commissioning.h @@ -1425,7 +1425,7 @@ be_local_closure(Matter_Commisioning_Context_parse_Sigma1, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[118]) { /* constants */ + ( &(const bvalue[130]) { /* constants */ /* K0 */ be_nested_str_weak(crypto), /* K1 */ be_nested_str_weak(string), /* K2 */ be_nested_str_weak(session), @@ -1507,14 +1507,14 @@ be_local_closure(Matter_Commisioning_Context_parse_Sigma1, /* name */ /* K78 */ be_nested_str_weak(MTR_X3A_X20StatusReport_X28GeneralCode_X3A_X20FAILURE_X2C_X20ProtocolId_X3A_X20SECURE_CHANNEL_X2C_X20ProtocolCode_X3A_X20NO_SHARED_TRUST_ROOTS_X29), /* K79 */ be_nested_str_weak(MTR_X3A_X20fabric_X3D), /* K80 */ be_nested_str_weak(MTR_X3A_X20no_private_key_X3D), - /* K81 */ be_nested_str_weak(no_private_key), + /* K81 */ be_nested_str_weak(get_pk), /* K82 */ be_nested_str_weak(tohex), /* K83 */ be_nested_str_weak(MTR_X3A_X20noc_X20_X20_X20_X20_X20_X20_X20_X20_X20_X20_X20_X3D), - /* K84 */ be_nested_str_weak(noc), + /* K84 */ be_nested_str_weak(get_noc), /* K85 */ be_nested_str_weak(get_icac), /* K86 */ be_nested_str_weak(MTR_X3A_X20icac_X20_X20_X20_X20_X20_X20_X20_X20_X20_X20_X3D), /* K87 */ be_nested_str_weak(MTR_X3A_X20root_ca_cert_X20_X20_X3D), - /* K88 */ be_nested_str_weak(root_ca_certificate), + /* K88 */ be_nested_str_weak(get_ca), /* K89 */ be_nested_str_weak(__responder_priv), /* K90 */ be_nested_str_weak(__responder_pub), /* K91 */ be_nested_str_weak(EC_P256), @@ -1522,32 +1522,44 @@ be_local_closure(Matter_Commisioning_Context_parse_Sigma1, /* name */ /* K93 */ be_nested_str_weak(MTR_X3A_X20ResponderEph_priv_X20_X20_X3D), /* K94 */ be_nested_str_weak(MTR_X3A_X20ResponderEph_pub_X20_X20_X3D), /* K95 */ be_nested_str_weak(shared_key), - /* K96 */ be_nested_str_weak(TLV), - /* K97 */ be_nested_str_weak(Matter_TLV_struct), - /* K98 */ be_nested_str_weak(add_TLV), - /* K99 */ be_nested_str_weak(B2), - /* K100 */ be_nested_str_weak(get_noc), + /* K96 */ be_nested_str_weak(MTR_X3A_X20_X2A_X20shared_secret_X20_X20_X3D_X20), + /* K97 */ be_nested_str_weak(TLV), + /* K98 */ be_nested_str_weak(Matter_TLV_struct), + /* K99 */ be_nested_str_weak(add_TLV), + /* K100 */ be_nested_str_weak(B2), /* K101 */ be_const_int(3), /* K102 */ be_nested_str_weak(ecdsa_sign_sha256), - /* K103 */ be_nested_str_weak(get_pk), - /* K104 */ be_nested_str_weak(Msg1), - /* K105 */ be_nested_str_weak(SHA256), - /* K106 */ be_nested_str_weak(update), - /* K107 */ be_nested_str_weak(out), - /* K108 */ be_nested_str_weak(S2K_Info), - /* K109 */ be_nested_str_weak(get_ipk_group_key), - /* K110 */ be_nested_str_weak(TBEData2_Nonce), - /* K111 */ be_nested_str_weak(encrypt), - /* K112 */ be_nested_str_weak(Sigma2), - /* K113 */ be_nested_str_weak(responderRandom), - /* K114 */ be_nested_str_weak(responderSessionId), - /* K115 */ be_nested_str_weak(responderEphPubKey), - /* K116 */ be_nested_str_weak(encrypted2), - /* K117 */ be_nested_str_weak(__Msg2), + /* K103 */ be_nested_str_weak(_X2A_X2A_X2A_X2A_X2A_X2A_X2A_X2A_X2A_X2A_X2A_X2A_X2A_X2A_X2A_X2A_X2A_X2A_X2A_X2A_X2A_X2A_X2A_X2A_X2A_X2A_X2A_X2A_X2A_X2A_X2A_X2A_X2A_X2A_X2A_X2A_X2A_X2A_X2A_X2A), + /* K104 */ be_nested_str_weak(MTR_X3A_X20_X2A_X20fabric_X2Eget_pk_X20_X20_X3D_X20), + /* K105 */ be_nested_str_weak(MTR_X3A_X20_X2A_X20sigma2_tbsdata_X20_X20_X3D_X20), + /* K106 */ be_nested_str_weak(MTR_X3A_X20_X2A_X20TBSData2Signature_X20_X20_X3D_X20), + /* K107 */ be_nested_str_weak(Msg1), + /* K108 */ be_nested_str_weak(MTR_X3A_X20_X2A_X20resumptionid_X20_X20_X3D_X20), + /* K109 */ be_nested_str_weak(MTR_X3A_X20_X2A_X20MSG1_X20_X20_X20_X20_X20_X20_X20_X20_X20_X20_X3D_X20), + /* K110 */ be_nested_str_weak(SHA256), + /* K111 */ be_nested_str_weak(update), + /* K112 */ be_nested_str_weak(out), + /* K113 */ be_nested_str_weak(MTR_X3A_X20TranscriptHash_X20_X3D), + /* K114 */ be_nested_str_weak(S2K_Info), + /* K115 */ be_nested_str_weak(get_ipk_group_key), + /* K116 */ be_nested_str_weak(MTR_X3A_X20_X2A_X20SharedSecret_X20_X20_X3D_X20), + /* K117 */ be_nested_str_weak(MTR_X3A_X20_X2A_X20s2k_salt_X20_X20_X20_X20_X20_X20_X3D_X20), + /* K118 */ be_nested_str_weak(MTR_X3A_X20_X2A_X20s2k_X20_X20_X20_X20_X20_X20_X20_X20_X20_X20_X20_X3D_X20), + /* K119 */ be_nested_str_weak(MTR_X3A_X20_X2A_X20TBEData2Raw_X20_X20_X20_X3D_X20), + /* K120 */ be_nested_str_weak(TBEData2_Nonce), + /* K121 */ be_nested_str_weak(encrypt), + /* K122 */ be_nested_str_weak(MTR_X3A_X20_X2A_X20TBEData2Enc_X20_X20_X20_X3D_X20), + /* K123 */ be_nested_str_weak(Sigma2), + /* K124 */ be_nested_str_weak(responderRandom), + /* K125 */ be_nested_str_weak(responderSessionId), + /* K126 */ be_nested_str_weak(responderEphPubKey), + /* K127 */ be_nested_str_weak(encrypted2), + /* K128 */ be_nested_str_weak(MTR_X3A_X20sigma2_X3A_X20), + /* K129 */ be_nested_str_weak(__Msg2), }), be_str_weak(parse_Sigma1), &be_const_str_solidified, - ( &(const binstruction[576]) { /* code */ + ( &(const binstruction[689]) { /* code */ 0xA40A0000, // 0000 IMPORT R2 K0 0xA40E0200, // 0001 IMPORT R3 K1 0x88100302, // 0002 GETMBR R4 R1 K2 @@ -1833,7 +1845,7 @@ be_local_closure(Matter_Commisioning_Context_parse_Sigma1, /* name */ 0x70020000, // 011A JMP #011C 0x50180000, // 011B LDBOOL R6 0 0 0x5C200C00, // 011C MOVE R8 R6 - 0x7422011F, // 011D JMPT R8 #023E + 0x74220190, // 011D JMPT R8 #02AF 0x8C20014C, // 011E GETMET R8 R0 K76 0x88280B4D, // 011F GETMBR R10 R5 K77 0x882C0B1F, // 0120 GETMBR R11 R5 K31 @@ -1892,8 +1904,8 @@ be_local_closure(Matter_Commisioning_Context_parse_Sigma1, /* name */ 0x7C240600, // 0155 CALL R9 3 0xB8260E00, // 0156 GETNGBL R9 K7 0x8C241308, // 0157 GETMET R9 R9 K8 - 0x882C091E, // 0158 GETMBR R11 R4 K30 - 0x882C1751, // 0159 GETMBR R11 R11 K81 + 0x8C2C0951, // 0158 GETMET R11 R4 K81 + 0x7C2C0200, // 0159 CALL R11 1 0x8C2C1752, // 015A GETMET R11 R11 K82 0x7C2C0200, // 015B CALL R11 1 0x002EA00B, // 015C ADD R11 K80 R11 @@ -1901,229 +1913,342 @@ be_local_closure(Matter_Commisioning_Context_parse_Sigma1, /* name */ 0x7C240600, // 015E CALL R9 3 0xB8260E00, // 015F GETNGBL R9 K7 0x8C241308, // 0160 GETMET R9 R9 K8 - 0x882C091E, // 0161 GETMBR R11 R4 K30 - 0x882C1754, // 0162 GETMBR R11 R11 K84 + 0x8C2C0954, // 0161 GETMET R11 R4 K84 + 0x7C2C0200, // 0162 CALL R11 1 0x8C2C1752, // 0163 GETMET R11 R11 K82 0x7C2C0200, // 0164 CALL R11 1 0x002EA60B, // 0165 ADD R11 K83 R11 0x54320003, // 0166 LDINT R12 4 0x7C240600, // 0167 CALL R9 3 - 0x8824091E, // 0168 GETMBR R9 R4 K30 - 0x8C241355, // 0169 GETMET R9 R9 K85 - 0x7C240200, // 016A CALL R9 1 - 0x78260009, // 016B JMPF R9 #0176 - 0xB8260E00, // 016C GETNGBL R9 K7 - 0x8C241308, // 016D GETMET R9 R9 K8 - 0x882C091E, // 016E GETMBR R11 R4 K30 - 0x8C2C1755, // 016F GETMET R11 R11 K85 + 0x8C241155, // 0168 GETMET R9 R8 K85 + 0x7C240200, // 0169 CALL R9 1 + 0x78260008, // 016A JMPF R9 #0174 + 0xB8260E00, // 016B GETNGBL R9 K7 + 0x8C241308, // 016C GETMET R9 R9 K8 + 0x8C2C1155, // 016D GETMET R11 R8 K85 + 0x7C2C0200, // 016E CALL R11 1 + 0x8C2C1752, // 016F GETMET R11 R11 K82 0x7C2C0200, // 0170 CALL R11 1 - 0x8C2C1752, // 0171 GETMET R11 R11 K82 - 0x7C2C0200, // 0172 CALL R11 1 - 0x002EAC0B, // 0173 ADD R11 K86 R11 - 0x54320003, // 0174 LDINT R12 4 - 0x7C240600, // 0175 CALL R9 3 - 0xB8260E00, // 0176 GETNGBL R9 K7 - 0x8C241308, // 0177 GETMET R9 R9 K8 - 0x882C091E, // 0178 GETMBR R11 R4 K30 - 0x882C1758, // 0179 GETMBR R11 R11 K88 - 0x8C2C1752, // 017A GETMET R11 R11 K82 - 0x7C2C0200, // 017B CALL R11 1 - 0x002EAE0B, // 017C ADD R11 K87 R11 - 0x54320003, // 017D LDINT R12 4 - 0x7C240600, // 017E CALL R9 3 - 0x8C240535, // 017F GETMET R9 R2 K53 - 0x542E000F, // 0180 LDINT R11 16 - 0x7C240400, // 0181 CALL R9 2 - 0x90126809, // 0182 SETMBR R4 K52 R9 - 0x8C240535, // 0183 GETMET R9 R2 K53 - 0x542E001F, // 0184 LDINT R11 32 - 0x7C240400, // 0185 CALL R9 2 - 0x9012B209, // 0186 SETMBR R4 K89 R9 - 0x8C24055B, // 0187 GETMET R9 R2 K91 - 0x7C240200, // 0188 CALL R9 1 - 0x8C24135C, // 0189 GETMET R9 R9 K92 - 0x882C0959, // 018A GETMBR R11 R4 K89 - 0x7C240400, // 018B CALL R9 2 - 0x9012B409, // 018C SETMBR R4 K90 R9 - 0xB8260E00, // 018D GETNGBL R9 K7 - 0x8C241308, // 018E GETMET R9 R9 K8 - 0x882C0959, // 018F GETMBR R11 R4 K89 - 0x8C2C1752, // 0190 GETMET R11 R11 K82 - 0x7C2C0200, // 0191 CALL R11 1 - 0x002EBA0B, // 0192 ADD R11 K93 R11 - 0x54320003, // 0193 LDINT R12 4 - 0x7C240600, // 0194 CALL R9 3 - 0xB8260E00, // 0195 GETNGBL R9 K7 - 0x8C241308, // 0196 GETMET R9 R9 K8 - 0x882C095A, // 0197 GETMBR R11 R4 K90 - 0x8C2C1752, // 0198 GETMET R11 R11 K82 - 0x7C2C0200, // 0199 CALL R11 1 - 0x002EBC0B, // 019A ADD R11 K94 R11 - 0x54320003, // 019B LDINT R12 4 - 0x7C240600, // 019C CALL R9 3 - 0x8C240535, // 019D GETMET R9 R2 K53 - 0x542E001F, // 019E LDINT R11 32 - 0x7C240400, // 019F CALL R9 2 - 0x8C28055B, // 01A0 GETMET R10 R2 K91 - 0x7C280200, // 01A1 CALL R10 1 - 0x8C28155F, // 01A2 GETMET R10 R10 K95 - 0x88300959, // 01A3 GETMBR R12 R4 K89 - 0x88340B16, // 01A4 GETMBR R13 R5 K22 - 0x7C280600, // 01A5 CALL R10 3 - 0x9012480A, // 01A6 SETMBR R4 K36 R10 - 0xB82A1A00, // 01A7 GETNGBL R10 K13 - 0x88281560, // 01A8 GETMBR R10 R10 K96 - 0x8C281561, // 01A9 GETMET R10 R10 K97 - 0x7C280200, // 01AA CALL R10 1 - 0x8C2C1562, // 01AB GETMET R11 R10 K98 - 0x5834000C, // 01AC LDCONST R13 K12 - 0xB83A1A00, // 01AD GETNGBL R14 K13 - 0x88381D60, // 01AE GETMBR R14 R14 K96 - 0x88381D63, // 01AF GETMBR R14 R14 K99 - 0x8C3C0964, // 01B0 GETMET R15 R4 K100 - 0x7C3C0200, // 01B1 CALL R15 1 - 0x7C2C0800, // 01B2 CALL R11 4 - 0x8C2C1562, // 01B3 GETMET R11 R10 K98 - 0x5834000A, // 01B4 LDCONST R13 K10 - 0xB83A1A00, // 01B5 GETNGBL R14 K13 - 0x88381D60, // 01B6 GETMBR R14 R14 K96 - 0x88381D63, // 01B7 GETMBR R14 R14 K99 - 0x8C3C0955, // 01B8 GETMET R15 R4 K85 - 0x7C3C0200, // 01B9 CALL R15 1 - 0x7C2C0800, // 01BA CALL R11 4 - 0x8C2C1562, // 01BB GETMET R11 R10 K98 - 0x58340065, // 01BC LDCONST R13 K101 - 0xB83A1A00, // 01BD GETNGBL R14 K13 - 0x88381D60, // 01BE GETMBR R14 R14 K96 - 0x88381D63, // 01BF GETMBR R14 R14 K99 - 0x883C095A, // 01C0 GETMBR R15 R4 K90 - 0x7C2C0800, // 01C1 CALL R11 4 - 0x8C2C1562, // 01C2 GETMET R11 R10 K98 - 0x54360003, // 01C3 LDINT R13 4 - 0xB83A1A00, // 01C4 GETNGBL R14 K13 - 0x88381D60, // 01C5 GETMBR R14 R14 K96 - 0x88381D63, // 01C6 GETMBR R14 R14 K99 - 0x883C0B16, // 01C7 GETMBR R15 R5 K22 - 0x7C2C0800, // 01C8 CALL R11 4 - 0x8C2C055B, // 01C9 GETMET R11 R2 K91 - 0x7C2C0200, // 01CA CALL R11 1 - 0x8C2C1766, // 01CB GETMET R11 R11 K102 - 0x8C340967, // 01CC GETMET R13 R4 K103 - 0x7C340200, // 01CD CALL R13 1 - 0x8C38153E, // 01CE GETMET R14 R10 K62 - 0x7C380200, // 01CF CALL R14 1 - 0x7C2C0600, // 01D0 CALL R11 3 - 0xB8321A00, // 01D1 GETNGBL R12 K13 - 0x88301960, // 01D2 GETMBR R12 R12 K96 - 0x8C301961, // 01D3 GETMET R12 R12 K97 - 0x7C300200, // 01D4 CALL R12 1 - 0x8C341962, // 01D5 GETMET R13 R12 K98 - 0x583C000C, // 01D6 LDCONST R15 K12 - 0xB8421A00, // 01D7 GETNGBL R16 K13 - 0x88402160, // 01D8 GETMBR R16 R16 K96 - 0x88402163, // 01D9 GETMBR R16 R16 K99 - 0x8C440964, // 01DA GETMET R17 R4 K100 - 0x7C440200, // 01DB CALL R17 1 - 0x7C340800, // 01DC CALL R13 4 - 0x8C341962, // 01DD GETMET R13 R12 K98 - 0x583C000A, // 01DE LDCONST R15 K10 - 0xB8421A00, // 01DF GETNGBL R16 K13 - 0x88402160, // 01E0 GETMBR R16 R16 K96 - 0x88402163, // 01E1 GETMBR R16 R16 K99 - 0x8C440955, // 01E2 GETMET R17 R4 K85 - 0x7C440200, // 01E3 CALL R17 1 - 0x7C340800, // 01E4 CALL R13 4 - 0x8C341962, // 01E5 GETMET R13 R12 K98 - 0x583C0065, // 01E6 LDCONST R15 K101 - 0xB8421A00, // 01E7 GETNGBL R16 K13 - 0x88402160, // 01E8 GETMBR R16 R16 K96 - 0x88402163, // 01E9 GETMBR R16 R16 K99 - 0x5C441600, // 01EA MOVE R17 R11 - 0x7C340800, // 01EB CALL R13 4 - 0x8C341962, // 01EC GETMET R13 R12 K98 - 0x543E0003, // 01ED LDINT R15 4 - 0xB8421A00, // 01EE GETNGBL R16 K13 - 0x88402160, // 01EF GETMBR R16 R16 K96 - 0x88402163, // 01F0 GETMBR R16 R16 K99 - 0x88440934, // 01F1 GETMBR R17 R4 K52 - 0x7C340800, // 01F2 CALL R13 4 - 0x88340B68, // 01F3 GETMBR R13 R5 K104 - 0x90127E0D, // 01F4 SETMBR R4 K63 R13 - 0x8C340569, // 01F5 GETMET R13 R2 K105 - 0x7C340200, // 01F6 CALL R13 1 - 0x8C341B6A, // 01F7 GETMET R13 R13 K106 - 0x883C093F, // 01F8 GETMBR R15 R4 K63 - 0x7C340400, // 01F9 CALL R13 2 - 0x8C341B6B, // 01FA GETMET R13 R13 K107 - 0x7C340200, // 01FB CALL R13 1 - 0x60380015, // 01FC GETGBL R14 G21 - 0x7C380000, // 01FD CALL R14 0 - 0x8C381D20, // 01FE GETMET R14 R14 K32 - 0x8840016C, // 01FF GETMBR R16 R0 K108 - 0x7C380400, // 0200 CALL R14 2 - 0x8C3C096D, // 0201 GETMET R15 R4 K109 - 0x7C3C0200, // 0202 CALL R15 1 - 0x003C1E09, // 0203 ADD R15 R15 R9 - 0x8840095A, // 0204 GETMBR R16 R4 K90 - 0x003C1E10, // 0205 ADD R15 R15 R16 - 0x003C1E0D, // 0206 ADD R15 R15 R13 - 0x8C400522, // 0207 GETMET R16 R2 K34 - 0x7C400200, // 0208 CALL R16 1 - 0x8C402123, // 0209 GETMET R16 R16 K35 - 0x88480924, // 020A GETMBR R18 R4 K36 - 0x5C4C1E00, // 020B MOVE R19 R15 - 0x5C501C00, // 020C MOVE R20 R14 - 0x5456000F, // 020D LDINT R21 16 - 0x7C400A00, // 020E CALL R16 5 - 0x8C44193E, // 020F GETMET R17 R12 K62 - 0x7C440200, // 0210 CALL R17 1 - 0x8C480527, // 0211 GETMET R18 R2 K39 - 0x5C502000, // 0212 MOVE R20 R16 - 0x60540015, // 0213 GETGBL R21 G21 - 0x7C540000, // 0214 CALL R21 0 - 0x8C542B20, // 0215 GETMET R21 R21 K32 - 0x885C016E, // 0216 GETMBR R23 R0 K110 - 0x7C540400, // 0217 CALL R21 2 - 0x60580015, // 0218 GETGBL R22 G21 - 0x7C580000, // 0219 CALL R22 0 - 0x605C000C, // 021A GETGBL R23 G12 - 0x5C602200, // 021B MOVE R24 R17 - 0x7C5C0200, // 021C CALL R23 1 - 0x5462000F, // 021D LDINT R24 16 - 0x7C480C00, // 021E CALL R18 6 - 0x8C4C256F, // 021F GETMET R19 R18 K111 - 0x5C542200, // 0220 MOVE R21 R17 - 0x7C4C0400, // 0221 CALL R19 2 - 0x8C502529, // 0222 GETMET R20 R18 K41 - 0x7C500200, // 0223 CALL R20 1 - 0x004C2614, // 0224 ADD R19 R19 R20 - 0xB8521A00, // 0225 GETNGBL R20 K13 - 0x8C502970, // 0226 GETMET R20 R20 K112 - 0x7C500200, // 0227 CALL R20 1 - 0x9052E209, // 0228 SETMBR R20 K113 R9 - 0x8854092F, // 0229 GETMBR R21 R4 K47 - 0x9052E415, // 022A SETMBR R20 K114 R21 - 0x8854095A, // 022B GETMBR R21 R4 K90 - 0x9052E615, // 022C SETMBR R20 K115 R21 - 0x9052E813, // 022D SETMBR R20 K116 R19 - 0x8C54293E, // 022E GETMET R21 R20 K62 - 0x7C540200, // 022F CALL R21 1 - 0x9012EA15, // 0230 SETMBR R4 K117 R21 - 0x8C580340, // 0231 GETMET R22 R1 K64 - 0x54620030, // 0232 LDINT R24 49 - 0x50640200, // 0233 LDBOOL R25 1 0 - 0x7C580600, // 0234 CALL R22 3 - 0x8C5C2D41, // 0235 GETMET R23 R22 K65 - 0x5C642A00, // 0236 MOVE R25 R21 - 0x7C5C0400, // 0237 CALL R23 2 - 0x88600142, // 0238 GETMBR R24 R0 K66 - 0x8C603143, // 0239 GETMET R24 R24 K67 - 0x5C682C00, // 023A MOVE R26 R22 - 0x7C600400, // 023B CALL R24 2 - 0x50600200, // 023C LDBOOL R24 1 0 - 0x80043000, // 023D RET 1 R24 - 0x50200200, // 023E LDBOOL R8 1 0 - 0x80041000, // 023F RET 1 R8 + 0x002EAC0B, // 0171 ADD R11 K86 R11 + 0x54320003, // 0172 LDINT R12 4 + 0x7C240600, // 0173 CALL R9 3 + 0xB8260E00, // 0174 GETNGBL R9 K7 + 0x8C241308, // 0175 GETMET R9 R9 K8 + 0x8C2C1158, // 0176 GETMET R11 R8 K88 + 0x7C2C0200, // 0177 CALL R11 1 + 0x8C2C1752, // 0178 GETMET R11 R11 K82 + 0x7C2C0200, // 0179 CALL R11 1 + 0x002EAE0B, // 017A ADD R11 K87 R11 + 0x54320003, // 017B LDINT R12 4 + 0x7C240600, // 017C CALL R9 3 + 0x8C240535, // 017D GETMET R9 R2 K53 + 0x542E000F, // 017E LDINT R11 16 + 0x7C240400, // 017F CALL R9 2 + 0x90126809, // 0180 SETMBR R4 K52 R9 + 0x8C240535, // 0181 GETMET R9 R2 K53 + 0x542E001F, // 0182 LDINT R11 32 + 0x7C240400, // 0183 CALL R9 2 + 0x9012B209, // 0184 SETMBR R4 K89 R9 + 0x8C24055B, // 0185 GETMET R9 R2 K91 + 0x7C240200, // 0186 CALL R9 1 + 0x8C24135C, // 0187 GETMET R9 R9 K92 + 0x882C0959, // 0188 GETMBR R11 R4 K89 + 0x7C240400, // 0189 CALL R9 2 + 0x9012B409, // 018A SETMBR R4 K90 R9 + 0xB8260E00, // 018B GETNGBL R9 K7 + 0x8C241308, // 018C GETMET R9 R9 K8 + 0x882C0959, // 018D GETMBR R11 R4 K89 + 0x8C2C1752, // 018E GETMET R11 R11 K82 + 0x7C2C0200, // 018F CALL R11 1 + 0x002EBA0B, // 0190 ADD R11 K93 R11 + 0x54320003, // 0191 LDINT R12 4 + 0x7C240600, // 0192 CALL R9 3 + 0xB8260E00, // 0193 GETNGBL R9 K7 + 0x8C241308, // 0194 GETMET R9 R9 K8 + 0x882C095A, // 0195 GETMBR R11 R4 K90 + 0x8C2C1752, // 0196 GETMET R11 R11 K82 + 0x7C2C0200, // 0197 CALL R11 1 + 0x002EBC0B, // 0198 ADD R11 K94 R11 + 0x54320003, // 0199 LDINT R12 4 + 0x7C240600, // 019A CALL R9 3 + 0x8C240535, // 019B GETMET R9 R2 K53 + 0x542E001F, // 019C LDINT R11 32 + 0x7C240400, // 019D CALL R9 2 + 0x8C28055B, // 019E GETMET R10 R2 K91 + 0x7C280200, // 019F CALL R10 1 + 0x8C28155F, // 01A0 GETMET R10 R10 K95 + 0x88300959, // 01A1 GETMBR R12 R4 K89 + 0x88340B16, // 01A2 GETMBR R13 R5 K22 + 0x7C280600, // 01A3 CALL R10 3 + 0x9012480A, // 01A4 SETMBR R4 K36 R10 + 0xB82A0E00, // 01A5 GETNGBL R10 K7 + 0x8C281508, // 01A6 GETMET R10 R10 K8 + 0x88300924, // 01A7 GETMBR R12 R4 K36 + 0x8C301952, // 01A8 GETMET R12 R12 K82 + 0x7C300200, // 01A9 CALL R12 1 + 0x0032C00C, // 01AA ADD R12 K96 R12 + 0x54360003, // 01AB LDINT R13 4 + 0x7C280600, // 01AC CALL R10 3 + 0xB82A1A00, // 01AD GETNGBL R10 K13 + 0x88281561, // 01AE GETMBR R10 R10 K97 + 0x8C281562, // 01AF GETMET R10 R10 K98 + 0x7C280200, // 01B0 CALL R10 1 + 0x8C2C1563, // 01B1 GETMET R11 R10 K99 + 0x5834000C, // 01B2 LDCONST R13 K12 + 0xB83A1A00, // 01B3 GETNGBL R14 K13 + 0x88381D61, // 01B4 GETMBR R14 R14 K97 + 0x88381D64, // 01B5 GETMBR R14 R14 K100 + 0x8C3C1154, // 01B6 GETMET R15 R8 K84 + 0x7C3C0200, // 01B7 CALL R15 1 + 0x7C2C0800, // 01B8 CALL R11 4 + 0x8C2C1563, // 01B9 GETMET R11 R10 K99 + 0x5834000A, // 01BA LDCONST R13 K10 + 0xB83A1A00, // 01BB GETNGBL R14 K13 + 0x88381D61, // 01BC GETMBR R14 R14 K97 + 0x88381D64, // 01BD GETMBR R14 R14 K100 + 0x8C3C1155, // 01BE GETMET R15 R8 K85 + 0x7C3C0200, // 01BF CALL R15 1 + 0x7C2C0800, // 01C0 CALL R11 4 + 0x8C2C1563, // 01C1 GETMET R11 R10 K99 + 0x58340065, // 01C2 LDCONST R13 K101 + 0xB83A1A00, // 01C3 GETNGBL R14 K13 + 0x88381D61, // 01C4 GETMBR R14 R14 K97 + 0x88381D64, // 01C5 GETMBR R14 R14 K100 + 0x883C095A, // 01C6 GETMBR R15 R4 K90 + 0x7C2C0800, // 01C7 CALL R11 4 + 0x8C2C1563, // 01C8 GETMET R11 R10 K99 + 0x54360003, // 01C9 LDINT R13 4 + 0xB83A1A00, // 01CA GETNGBL R14 K13 + 0x88381D61, // 01CB GETMBR R14 R14 K97 + 0x88381D64, // 01CC GETMBR R14 R14 K100 + 0x883C0B16, // 01CD GETMBR R15 R5 K22 + 0x7C2C0800, // 01CE CALL R11 4 + 0x8C2C055B, // 01CF GETMET R11 R2 K91 + 0x7C2C0200, // 01D0 CALL R11 1 + 0x8C2C1766, // 01D1 GETMET R11 R11 K102 + 0x8C341151, // 01D2 GETMET R13 R8 K81 + 0x7C340200, // 01D3 CALL R13 1 + 0x8C38153E, // 01D4 GETMET R14 R10 K62 + 0x7C380200, // 01D5 CALL R14 1 + 0x7C2C0600, // 01D6 CALL R11 3 + 0xB8320E00, // 01D7 GETNGBL R12 K7 + 0x8C301908, // 01D8 GETMET R12 R12 K8 + 0x58380067, // 01D9 LDCONST R14 K103 + 0x543E0003, // 01DA LDINT R15 4 + 0x7C300600, // 01DB CALL R12 3 + 0xB8320E00, // 01DC GETNGBL R12 K7 + 0x8C301908, // 01DD GETMET R12 R12 K8 + 0x60380008, // 01DE GETGBL R14 G8 + 0x8C3C1151, // 01DF GETMET R15 R8 K81 + 0x7C3C0200, // 01E0 CALL R15 1 + 0x7C380200, // 01E1 CALL R14 1 + 0x003AD00E, // 01E2 ADD R14 K104 R14 + 0x543E0003, // 01E3 LDINT R15 4 + 0x7C300600, // 01E4 CALL R12 3 + 0xB8320E00, // 01E5 GETNGBL R12 K7 + 0x8C301908, // 01E6 GETMET R12 R12 K8 + 0x60380008, // 01E7 GETGBL R14 G8 + 0x5C3C1400, // 01E8 MOVE R15 R10 + 0x7C380200, // 01E9 CALL R14 1 + 0x003AD20E, // 01EA ADD R14 K105 R14 + 0x543E0003, // 01EB LDINT R15 4 + 0x7C300600, // 01EC CALL R12 3 + 0xB8320E00, // 01ED GETNGBL R12 K7 + 0x8C301908, // 01EE GETMET R12 R12 K8 + 0x8C381752, // 01EF GETMET R14 R11 K82 + 0x7C380200, // 01F0 CALL R14 1 + 0x003AD40E, // 01F1 ADD R14 K106 R14 + 0x543E0003, // 01F2 LDINT R15 4 + 0x7C300600, // 01F3 CALL R12 3 + 0xB8321A00, // 01F4 GETNGBL R12 K13 + 0x88301961, // 01F5 GETMBR R12 R12 K97 + 0x8C301962, // 01F6 GETMET R12 R12 K98 + 0x7C300200, // 01F7 CALL R12 1 + 0x8C341963, // 01F8 GETMET R13 R12 K99 + 0x583C000C, // 01F9 LDCONST R15 K12 + 0xB8421A00, // 01FA GETNGBL R16 K13 + 0x88402161, // 01FB GETMBR R16 R16 K97 + 0x88402164, // 01FC GETMBR R16 R16 K100 + 0x8C441154, // 01FD GETMET R17 R8 K84 + 0x7C440200, // 01FE CALL R17 1 + 0x7C340800, // 01FF CALL R13 4 + 0x8C341963, // 0200 GETMET R13 R12 K99 + 0x583C000A, // 0201 LDCONST R15 K10 + 0xB8421A00, // 0202 GETNGBL R16 K13 + 0x88402161, // 0203 GETMBR R16 R16 K97 + 0x88402164, // 0204 GETMBR R16 R16 K100 + 0x8C441155, // 0205 GETMET R17 R8 K85 + 0x7C440200, // 0206 CALL R17 1 + 0x7C340800, // 0207 CALL R13 4 + 0x8C341963, // 0208 GETMET R13 R12 K99 + 0x583C0065, // 0209 LDCONST R15 K101 + 0xB8421A00, // 020A GETNGBL R16 K13 + 0x88402161, // 020B GETMBR R16 R16 K97 + 0x88402164, // 020C GETMBR R16 R16 K100 + 0x5C441600, // 020D MOVE R17 R11 + 0x7C340800, // 020E CALL R13 4 + 0x8C341963, // 020F GETMET R13 R12 K99 + 0x543E0003, // 0210 LDINT R15 4 + 0xB8421A00, // 0211 GETNGBL R16 K13 + 0x88402161, // 0212 GETMBR R16 R16 K97 + 0x88402164, // 0213 GETMBR R16 R16 K100 + 0x88440934, // 0214 GETMBR R17 R4 K52 + 0x7C340800, // 0215 CALL R13 4 + 0xB8360E00, // 0216 GETNGBL R13 K7 + 0x8C341B08, // 0217 GETMET R13 R13 K8 + 0x583C0067, // 0218 LDCONST R15 K103 + 0x54420003, // 0219 LDINT R16 4 + 0x7C340600, // 021A CALL R13 3 + 0x88340B6B, // 021B GETMBR R13 R5 K107 + 0x90127E0D, // 021C SETMBR R4 K63 R13 + 0xB8360E00, // 021D GETNGBL R13 K7 + 0x8C341B08, // 021E GETMET R13 R13 K8 + 0x883C0934, // 021F GETMBR R15 R4 K52 + 0x8C3C1F52, // 0220 GETMET R15 R15 K82 + 0x7C3C0200, // 0221 CALL R15 1 + 0x003ED80F, // 0222 ADD R15 K108 R15 + 0x54420003, // 0223 LDINT R16 4 + 0x7C340600, // 0224 CALL R13 3 + 0xB8360E00, // 0225 GETNGBL R13 K7 + 0x8C341B08, // 0226 GETMET R13 R13 K8 + 0x883C093F, // 0227 GETMBR R15 R4 K63 + 0x8C3C1F52, // 0228 GETMET R15 R15 K82 + 0x7C3C0200, // 0229 CALL R15 1 + 0x003EDA0F, // 022A ADD R15 K109 R15 + 0x54420003, // 022B LDINT R16 4 + 0x7C340600, // 022C CALL R13 3 + 0x8C34056E, // 022D GETMET R13 R2 K110 + 0x7C340200, // 022E CALL R13 1 + 0x8C341B6F, // 022F GETMET R13 R13 K111 + 0x883C093F, // 0230 GETMBR R15 R4 K63 + 0x7C340400, // 0231 CALL R13 2 + 0x8C341B70, // 0232 GETMET R13 R13 K112 + 0x7C340200, // 0233 CALL R13 1 + 0xB83A0E00, // 0234 GETNGBL R14 K7 + 0x8C381D08, // 0235 GETMET R14 R14 K8 + 0x8C401B52, // 0236 GETMET R16 R13 K82 + 0x7C400200, // 0237 CALL R16 1 + 0x0042E210, // 0238 ADD R16 K113 R16 + 0x54460003, // 0239 LDINT R17 4 + 0x7C380600, // 023A CALL R14 3 + 0x60380015, // 023B GETGBL R14 G21 + 0x7C380000, // 023C CALL R14 0 + 0x8C381D20, // 023D GETMET R14 R14 K32 + 0x88400172, // 023E GETMBR R16 R0 K114 + 0x7C380400, // 023F CALL R14 2 + 0x8C3C1173, // 0240 GETMET R15 R8 K115 + 0x7C3C0200, // 0241 CALL R15 1 + 0x003C1E09, // 0242 ADD R15 R15 R9 + 0x8840095A, // 0243 GETMBR R16 R4 K90 + 0x003C1E10, // 0244 ADD R15 R15 R16 + 0x003C1E0D, // 0245 ADD R15 R15 R13 + 0x8C400522, // 0246 GETMET R16 R2 K34 + 0x7C400200, // 0247 CALL R16 1 + 0x8C402123, // 0248 GETMET R16 R16 K35 + 0x88480924, // 0249 GETMBR R18 R4 K36 + 0x5C4C1E00, // 024A MOVE R19 R15 + 0x5C501C00, // 024B MOVE R20 R14 + 0x5456000F, // 024C LDINT R21 16 + 0x7C400A00, // 024D CALL R16 5 + 0xB8460E00, // 024E GETNGBL R17 K7 + 0x8C442308, // 024F GETMET R17 R17 K8 + 0x884C0924, // 0250 GETMBR R19 R4 K36 + 0x8C4C2752, // 0251 GETMET R19 R19 K82 + 0x7C4C0200, // 0252 CALL R19 1 + 0x004EE813, // 0253 ADD R19 K116 R19 + 0x54520003, // 0254 LDINT R20 4 + 0x7C440600, // 0255 CALL R17 3 + 0xB8460E00, // 0256 GETNGBL R17 K7 + 0x8C442308, // 0257 GETMET R17 R17 K8 + 0x8C4C1F52, // 0258 GETMET R19 R15 K82 + 0x7C4C0200, // 0259 CALL R19 1 + 0x004EEA13, // 025A ADD R19 K117 R19 + 0x54520003, // 025B LDINT R20 4 + 0x7C440600, // 025C CALL R17 3 + 0xB8460E00, // 025D GETNGBL R17 K7 + 0x8C442308, // 025E GETMET R17 R17 K8 + 0x8C4C2152, // 025F GETMET R19 R16 K82 + 0x7C4C0200, // 0260 CALL R19 1 + 0x004EEC13, // 0261 ADD R19 K118 R19 + 0x54520003, // 0262 LDINT R20 4 + 0x7C440600, // 0263 CALL R17 3 + 0x8C44193E, // 0264 GETMET R17 R12 K62 + 0x7C440200, // 0265 CALL R17 1 + 0xB84A0E00, // 0266 GETNGBL R18 K7 + 0x8C482508, // 0267 GETMET R18 R18 K8 + 0x8C502352, // 0268 GETMET R20 R17 K82 + 0x7C500200, // 0269 CALL R20 1 + 0x0052EE14, // 026A ADD R20 K119 R20 + 0x54560003, // 026B LDINT R21 4 + 0x7C480600, // 026C CALL R18 3 + 0x8C480527, // 026D GETMET R18 R2 K39 + 0x5C502000, // 026E MOVE R20 R16 + 0x60540015, // 026F GETGBL R21 G21 + 0x7C540000, // 0270 CALL R21 0 + 0x8C542B20, // 0271 GETMET R21 R21 K32 + 0x885C0178, // 0272 GETMBR R23 R0 K120 + 0x7C540400, // 0273 CALL R21 2 + 0x60580015, // 0274 GETGBL R22 G21 + 0x7C580000, // 0275 CALL R22 0 + 0x605C000C, // 0276 GETGBL R23 G12 + 0x5C602200, // 0277 MOVE R24 R17 + 0x7C5C0200, // 0278 CALL R23 1 + 0x5462000F, // 0279 LDINT R24 16 + 0x7C480C00, // 027A CALL R18 6 + 0x8C4C2579, // 027B GETMET R19 R18 K121 + 0x5C542200, // 027C MOVE R21 R17 + 0x7C4C0400, // 027D CALL R19 2 + 0x8C502529, // 027E GETMET R20 R18 K41 + 0x7C500200, // 027F CALL R20 1 + 0x004C2614, // 0280 ADD R19 R19 R20 + 0xB8520E00, // 0281 GETNGBL R20 K7 + 0x8C502908, // 0282 GETMET R20 R20 K8 + 0x8C582752, // 0283 GETMET R22 R19 K82 + 0x7C580200, // 0284 CALL R22 1 + 0x005AF416, // 0285 ADD R22 K122 R22 + 0x545E0003, // 0286 LDINT R23 4 + 0x7C500600, // 0287 CALL R20 3 + 0xB8520E00, // 0288 GETNGBL R20 K7 + 0x8C502908, // 0289 GETMET R20 R20 K8 + 0x58580067, // 028A LDCONST R22 K103 + 0x545E0003, // 028B LDINT R23 4 + 0x7C500600, // 028C CALL R20 3 + 0xB8521A00, // 028D GETNGBL R20 K13 + 0x8C50297B, // 028E GETMET R20 R20 K123 + 0x7C500200, // 028F CALL R20 1 + 0x9052F809, // 0290 SETMBR R20 K124 R9 + 0x8854092F, // 0291 GETMBR R21 R4 K47 + 0x9052FA15, // 0292 SETMBR R20 K125 R21 + 0x8854095A, // 0293 GETMBR R21 R4 K90 + 0x9052FC15, // 0294 SETMBR R20 K126 R21 + 0x9052FE13, // 0295 SETMBR R20 K127 R19 + 0xB8560E00, // 0296 GETNGBL R21 K7 + 0x8C542B08, // 0297 GETMET R21 R21 K8 + 0xB85E1A00, // 0298 GETNGBL R23 K13 + 0x8C5C2F14, // 0299 GETMET R23 R23 K20 + 0x5C642800, // 029A MOVE R25 R20 + 0x7C5C0400, // 029B CALL R23 2 + 0x005F0017, // 029C ADD R23 K128 R23 + 0x54620003, // 029D LDINT R24 4 + 0x7C540600, // 029E CALL R21 3 + 0x8C54293E, // 029F GETMET R21 R20 K62 + 0x7C540200, // 02A0 CALL R21 1 + 0x90130215, // 02A1 SETMBR R4 K129 R21 + 0x8C580340, // 02A2 GETMET R22 R1 K64 + 0x54620030, // 02A3 LDINT R24 49 + 0x50640200, // 02A4 LDBOOL R25 1 0 + 0x7C580600, // 02A5 CALL R22 3 + 0x8C5C2D41, // 02A6 GETMET R23 R22 K65 + 0x5C642A00, // 02A7 MOVE R25 R21 + 0x7C5C0400, // 02A8 CALL R23 2 + 0x88600142, // 02A9 GETMBR R24 R0 K66 + 0x8C603143, // 02AA GETMET R24 R24 K67 + 0x5C682C00, // 02AB MOVE R26 R22 + 0x7C600400, // 02AC CALL R24 2 + 0x50600200, // 02AD LDBOOL R24 1 0 + 0x80043000, // 02AE RET 1 R24 + 0x50200200, // 02AF LDBOOL R8 1 0 + 0x80041000, // 02B0 RET 1 R8 }) ) ); diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Device.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Device.h index 45b190598..42d886046 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Device.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Device.h @@ -4652,7 +4652,7 @@ be_local_closure(Matter_Device_msg_received, /* name */ ********************************************************************/ be_local_closure(Matter_Device_start_operational_discovery, /* name */ be_nested_proto( - 9, /* nstack */ + 8, /* nstack */ 2, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -4660,20 +4660,18 @@ be_local_closure(Matter_Device_start_operational_discovery, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[ 9]) { /* constants */ + ( &(const bvalue[ 7]) { /* constants */ /* K0 */ be_nested_str_weak(crypto), /* K1 */ be_nested_str_weak(mdns), /* K2 */ be_nested_str_weak(string), /* K3 */ be_nested_str_weak(stop_basic_commissioning), /* K4 */ be_nested_str_weak(root_w0), /* K5 */ be_nested_str_weak(root_L), - /* K6 */ be_nested_str_weak(set_expire_in_seconds), - /* K7 */ be_nested_str_weak(mdns_announce_op_discovery), - /* K8 */ be_nested_str_weak(get_fabric), + /* K6 */ be_nested_str_weak(mdns_announce_op_discovery), }), be_str_weak(start_operational_discovery), &be_const_str_solidified, - ( &(const binstruction[17]) { /* code */ + ( &(const binstruction[13]) { /* code */ 0xA40A0000, // 0000 IMPORT R2 K0 0xA40E0200, // 0001 IMPORT R3 K1 0xA4120400, // 0002 IMPORT R4 K2 @@ -4683,14 +4681,10 @@ be_local_closure(Matter_Device_start_operational_discovery, /* name */ 0x90020805, // 0006 SETMBR R0 K4 R5 0x4C140000, // 0007 LDNIL R5 0x90020A05, // 0008 SETMBR R0 K5 R5 - 0x8C140306, // 0009 GETMET R5 R1 K6 - 0x541E003B, // 000A LDINT R7 60 + 0x8C140106, // 0009 GETMET R5 R0 K6 + 0x5C1C0200, // 000A MOVE R7 R1 0x7C140400, // 000B CALL R5 2 - 0x8C140107, // 000C GETMET R5 R0 K7 - 0x8C1C0308, // 000D GETMET R7 R1 K8 - 0x7C1C0200, // 000E CALL R7 1 - 0x7C140400, // 000F CALL R5 2 - 0x80000000, // 0010 RET 0 + 0x80000000, // 000C RET 0 }) ) ); diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Fabric.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Fabric.h index 94d1f1d16..c9485e9b6 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Fabric.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Fabric.h @@ -6,6 +6,804 @@ extern const bclass be_class_Matter_Fabric; +/******************************************************************** +** Solidified function: get_device_id +********************************************************************/ +be_local_closure(Matter_Fabric_get_device_id, /* name */ + be_nested_proto( + 2, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 1]) { /* constants */ + /* K0 */ be_nested_str_weak(device_id), + }), + be_str_weak(get_device_id), + &be_const_str_solidified, + ( &(const binstruction[ 2]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x80040200, // 0001 RET 1 R1 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: hydrate_post +********************************************************************/ +be_local_closure(Matter_Fabric_hydrate_post, /* name */ + be_nested_proto( + 4, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 6]) { /* constants */ + /* K0 */ be_nested_str_weak(_counter_group_data_snd_impl), + /* K1 */ be_nested_str_weak(reset), + /* K2 */ be_nested_str_weak(counter_group_data_snd), + /* K3 */ be_nested_str_weak(_counter_group_ctrl_snd_impl), + /* K4 */ be_nested_str_weak(counter_group_ctrl_snd), + /* K5 */ be_nested_str_weak(val), + }), + be_str_weak(hydrate_post), + &be_const_str_solidified, + ( &(const binstruction[17]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x8C040301, // 0001 GETMET R1 R1 K1 + 0x880C0102, // 0002 GETMBR R3 R0 K2 + 0x7C040400, // 0003 CALL R1 2 + 0x88040103, // 0004 GETMBR R1 R0 K3 + 0x8C040301, // 0005 GETMET R1 R1 K1 + 0x880C0104, // 0006 GETMBR R3 R0 K4 + 0x7C040400, // 0007 CALL R1 2 + 0x88040100, // 0008 GETMBR R1 R0 K0 + 0x8C040305, // 0009 GETMET R1 R1 K5 + 0x7C040200, // 000A CALL R1 1 + 0x90020401, // 000B SETMBR R0 K2 R1 + 0x88040103, // 000C GETMBR R1 R0 K3 + 0x8C040305, // 000D GETMET R1 R1 K5 + 0x7C040200, // 000E CALL R1 1 + 0x90020801, // 000F SETMBR R0 K4 R1 + 0x80000000, // 0010 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: set_ca +********************************************************************/ +be_local_closure(Matter_Fabric_set_ca, /* name */ + be_nested_proto( + 2, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 1]) { /* constants */ + /* K0 */ be_nested_str_weak(root_ca_certificate), + }), + be_str_weak(set_ca), + &be_const_str_solidified, + ( &(const binstruction[ 2]) { /* code */ + 0x90020001, // 0000 SETMBR R0 K0 R1 + 0x80000000, // 0001 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: fabric_completed +********************************************************************/ +be_local_closure(Matter_Fabric_fabric_completed, /* name */ + be_nested_proto( + 4, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 5]) { /* constants */ + /* K0 */ be_nested_str_weak(set_no_expiration), + /* K1 */ be_nested_str_weak(set_persist), + /* K2 */ be_nested_str_weak(assign_fabric_index), + /* K3 */ be_nested_str_weak(_store), + /* K4 */ be_nested_str_weak(add_fabric), + }), + be_str_weak(fabric_completed), + &be_const_str_solidified, + ( &(const binstruction[12]) { /* code */ + 0x8C040100, // 0000 GETMET R1 R0 K0 + 0x7C040200, // 0001 CALL R1 1 + 0x8C040101, // 0002 GETMET R1 R0 K1 + 0x500C0200, // 0003 LDBOOL R3 1 0 + 0x7C040400, // 0004 CALL R1 2 + 0x8C040102, // 0005 GETMET R1 R0 K2 + 0x7C040200, // 0006 CALL R1 1 + 0x88040103, // 0007 GETMBR R1 R0 K3 + 0x8C040304, // 0008 GETMET R1 R1 K4 + 0x5C0C0000, // 0009 MOVE R3 R0 + 0x7C040400, // 000A CALL R1 2 + 0x80000000, // 000B RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: get_fabric_compressed +********************************************************************/ +be_local_closure(Matter_Fabric_get_fabric_compressed, /* name */ + be_nested_proto( + 2, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 1]) { /* constants */ + /* K0 */ be_nested_str_weak(fabric_compressed), + }), + be_str_weak(get_fabric_compressed), + &be_const_str_solidified, + ( &(const binstruction[ 2]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x80040200, // 0001 RET 1 R1 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: get_ca_pub +********************************************************************/ +be_local_closure(Matter_Fabric_get_ca_pub, /* name */ + be_nested_proto( + 6, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 5]) { /* constants */ + /* K0 */ be_nested_str_weak(root_ca_certificate), + /* K1 */ be_nested_str_weak(matter), + /* K2 */ be_nested_str_weak(TLV), + /* K3 */ be_nested_str_weak(parse), + /* K4 */ be_nested_str_weak(findsubval), + }), + be_str_weak(get_ca_pub), + &be_const_str_solidified, + ( &(const binstruction[12]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x78060008, // 0001 JMPF R1 #000B + 0xB80A0200, // 0002 GETNGBL R2 K1 + 0x88080502, // 0003 GETMBR R2 R2 K2 + 0x8C080503, // 0004 GETMET R2 R2 K3 + 0x5C100200, // 0005 MOVE R4 R1 + 0x7C080400, // 0006 CALL R2 2 + 0x8C0C0504, // 0007 GETMET R3 R2 K4 + 0x54160008, // 0008 LDINT R5 9 + 0x7C0C0400, // 0009 CALL R3 2 + 0x80040600, // 000A RET 1 R3 + 0x80000000, // 000B RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: before_remove +********************************************************************/ +be_local_closure(Matter_Fabric_before_remove, /* name */ + be_nested_proto( + 9, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[10]) { /* constants */ + /* K0 */ be_nested_str_weak(string), + /* K1 */ be_nested_str_weak(tasmota), + /* K2 */ be_nested_str_weak(log), + /* K3 */ be_nested_str_weak(format), + /* K4 */ be_nested_str_weak(MTR_X3A_X20_X2DFabric_X20_X20_X20_X20fab_X3D_X27_X25s_X27_X20_X28removed_X29), + /* K5 */ be_nested_str_weak(get_fabric_id), + /* K6 */ be_nested_str_weak(copy), + /* K7 */ be_nested_str_weak(reverse), + /* K8 */ be_nested_str_weak(tohex), + /* K9 */ be_const_int(2), + }), + be_str_weak(before_remove), + &be_const_str_solidified, + ( &(const binstruction[17]) { /* code */ + 0xA4060000, // 0000 IMPORT R1 K0 + 0xB80A0200, // 0001 GETNGBL R2 K1 + 0x8C080502, // 0002 GETMET R2 R2 K2 + 0x8C100303, // 0003 GETMET R4 R1 K3 + 0x58180004, // 0004 LDCONST R6 K4 + 0x8C1C0105, // 0005 GETMET R7 R0 K5 + 0x7C1C0200, // 0006 CALL R7 1 + 0x8C1C0F06, // 0007 GETMET R7 R7 K6 + 0x7C1C0200, // 0008 CALL R7 1 + 0x8C1C0F07, // 0009 GETMET R7 R7 K7 + 0x7C1C0200, // 000A CALL R7 1 + 0x8C1C0F08, // 000B GETMET R7 R7 K8 + 0x7C1C0200, // 000C CALL R7 1 + 0x7C100600, // 000D CALL R4 3 + 0x58140009, // 000E LDCONST R5 K9 + 0x7C080600, // 000F CALL R2 3 + 0x80000000, // 0010 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: get_ca +********************************************************************/ +be_local_closure(Matter_Fabric_get_ca, /* name */ + be_nested_proto( + 2, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 1]) { /* constants */ + /* K0 */ be_nested_str_weak(root_ca_certificate), + }), + be_str_weak(get_ca), + &be_const_str_solidified, + ( &(const binstruction[ 2]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x80040200, // 0001 RET 1 R1 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: log_new_fabric +********************************************************************/ +be_local_closure(Matter_Fabric_log_new_fabric, /* name */ + be_nested_proto( + 9, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[10]) { /* constants */ + /* K0 */ be_nested_str_weak(string), + /* K1 */ be_nested_str_weak(tasmota), + /* K2 */ be_nested_str_weak(log), + /* K3 */ be_nested_str_weak(format), + /* K4 */ be_nested_str_weak(MTR_X3A_X20_X2BFabric_X20_X20_X20_X20fab_X3D_X27_X25s_X27), + /* K5 */ be_nested_str_weak(get_fabric_id), + /* K6 */ be_nested_str_weak(copy), + /* K7 */ be_nested_str_weak(reverse), + /* K8 */ be_nested_str_weak(tohex), + /* K9 */ be_const_int(2), + }), + be_str_weak(log_new_fabric), + &be_const_str_solidified, + ( &(const binstruction[17]) { /* code */ + 0xA4060000, // 0000 IMPORT R1 K0 + 0xB80A0200, // 0001 GETNGBL R2 K1 + 0x8C080502, // 0002 GETMET R2 R2 K2 + 0x8C100303, // 0003 GETMET R4 R1 K3 + 0x58180004, // 0004 LDCONST R6 K4 + 0x8C1C0105, // 0005 GETMET R7 R0 K5 + 0x7C1C0200, // 0006 CALL R7 1 + 0x8C1C0F06, // 0007 GETMET R7 R7 K6 + 0x7C1C0200, // 0008 CALL R7 1 + 0x8C1C0F07, // 0009 GETMET R7 R7 K7 + 0x7C1C0200, // 000A CALL R7 1 + 0x8C1C0F08, // 000B GETMET R7 R7 K8 + 0x7C1C0200, // 000C CALL R7 1 + 0x7C100600, // 000D CALL R4 3 + 0x58140009, // 000E LDCONST R5 K9 + 0x7C080600, // 000F CALL R2 3 + 0x80000000, // 0010 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: set_fabric_index +********************************************************************/ +be_local_closure(Matter_Fabric_set_fabric_index, /* name */ + be_nested_proto( + 2, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 1]) { /* constants */ + /* K0 */ be_nested_str_weak(fabric_index), + }), + be_str_weak(set_fabric_index), + &be_const_str_solidified, + ( &(const binstruction[ 2]) { /* code */ + 0x90020001, // 0000 SETMBR R0 K0 R1 + 0x80000000, // 0001 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: assign_fabric_index +********************************************************************/ +be_local_closure(Matter_Fabric_assign_fabric_index, /* name */ + be_nested_proto( + 5, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 4]) { /* constants */ + /* K0 */ be_nested_str_weak(get_fabric_index), + /* K1 */ be_nested_str_weak(set_fabric_index), + /* K2 */ be_nested_str_weak(_store), + /* K3 */ be_nested_str_weak(next_fabric_idx), + }), + be_str_weak(assign_fabric_index), + &be_const_str_solidified, + ( &(const binstruction[11]) { /* code */ + 0x8C040100, // 0000 GETMET R1 R0 K0 + 0x7C040200, // 0001 CALL R1 1 + 0x4C080000, // 0002 LDNIL R2 + 0x1C040202, // 0003 EQ R1 R1 R2 + 0x78060004, // 0004 JMPF R1 #000A + 0x8C040101, // 0005 GETMET R1 R0 K1 + 0x880C0102, // 0006 GETMBR R3 R0 K2 + 0x8C0C0703, // 0007 GETMET R3 R3 K3 + 0x7C0C0200, // 0008 CALL R3 1 + 0x7C040400, // 0009 CALL R1 2 + 0x80000000, // 000A RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: get_ipk_epoch_key +********************************************************************/ +be_local_closure(Matter_Fabric_get_ipk_epoch_key, /* name */ + be_nested_proto( + 2, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 1]) { /* constants */ + /* K0 */ be_nested_str_weak(ipk_epoch_key), + }), + be_str_weak(get_ipk_epoch_key), + &be_const_str_solidified, + ( &(const binstruction[ 2]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x80040200, // 0001 RET 1 R1 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: set_pk +********************************************************************/ +be_local_closure(Matter_Fabric_set_pk, /* name */ + be_nested_proto( + 2, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 1]) { /* constants */ + /* K0 */ be_nested_str_weak(no_private_key), + }), + be_str_weak(set_pk), + &be_const_str_solidified, + ( &(const binstruction[ 2]) { /* code */ + 0x90020001, // 0000 SETMBR R0 K0 R1 + 0x80000000, // 0001 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: set_ipk_epoch_key +********************************************************************/ +be_local_closure(Matter_Fabric_set_ipk_epoch_key, /* name */ + be_nested_proto( + 2, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 1]) { /* constants */ + /* K0 */ be_nested_str_weak(ipk_epoch_key), + }), + be_str_weak(set_ipk_epoch_key), + &be_const_str_solidified, + ( &(const binstruction[ 2]) { /* code */ + 0x90020001, // 0000 SETMBR R0 K0 R1 + 0x80000000, // 0001 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: get_old_recent_session +********************************************************************/ +be_local_closure(Matter_Fabric_get_old_recent_session, /* name */ + be_nested_proto( + 7, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 4]) { /* constants */ + /* K0 */ be_nested_str_weak(_sessions), + /* K1 */ be_const_int(0), + /* K2 */ be_nested_str_weak(last_used), + /* K3 */ be_const_int(1), + }), + be_str_weak(get_old_recent_session), + &be_const_str_solidified, + ( &(const binstruction[30]) { /* code */ + 0x6008000C, // 0000 GETGBL R2 G12 + 0x880C0100, // 0001 GETMBR R3 R0 K0 + 0x7C080200, // 0002 CALL R2 1 + 0x1C080501, // 0003 EQ R2 R2 K1 + 0x780A0001, // 0004 JMPF R2 #0007 + 0x4C080000, // 0005 LDNIL R2 + 0x80040400, // 0006 RET 1 R2 + 0x88080100, // 0007 GETMBR R2 R0 K0 + 0x94080501, // 0008 GETIDX R2 R2 K1 + 0x880C0502, // 0009 GETMBR R3 R2 K2 + 0x58100003, // 000A LDCONST R4 K3 + 0x6014000C, // 000B GETGBL R5 G12 + 0x88180100, // 000C GETMBR R6 R0 K0 + 0x7C140200, // 000D CALL R5 1 + 0x14140805, // 000E LT R5 R4 R5 + 0x7816000C, // 000F JMPF R5 #001D + 0x88140100, // 0010 GETMBR R5 R0 K0 + 0x94140A04, // 0011 GETIDX R5 R5 R4 + 0x88140B02, // 0012 GETMBR R5 R5 K2 + 0x78060001, // 0013 JMPF R1 #0016 + 0x14180A03, // 0014 LT R6 R5 R3 + 0x70020000, // 0015 JMP #0017 + 0x24180A03, // 0016 GT R6 R5 R3 + 0x781A0002, // 0017 JMPF R6 #001B + 0x88180100, // 0018 GETMBR R6 R0 K0 + 0x94080C04, // 0019 GETIDX R2 R6 R4 + 0x5C0C0A00, // 001A MOVE R3 R5 + 0x00100903, // 001B ADD R4 R4 K3 + 0x7001FFED, // 001C JMP #000B + 0x80040400, // 001D RET 1 R2 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: counter_group_ctrl_snd_next +********************************************************************/ +be_local_closure(Matter_Fabric_counter_group_ctrl_snd_next, /* name */ + be_nested_proto( + 9, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[15]) { /* constants */ + /* K0 */ be_nested_str_weak(string), + /* K1 */ be_nested_str_weak(_counter_group_ctrl_snd_impl), + /* K2 */ be_nested_str_weak(next), + /* K3 */ be_nested_str_weak(tasmota), + /* K4 */ be_nested_str_weak(log), + /* K5 */ be_nested_str_weak(format), + /* K6 */ be_nested_str_weak(MTR_X3A_X20_X2E_X20_X20_X20_X20_X20_X20_X20_X20_X20_X20Counter_group_ctrl_snd_X3D_X25i), + /* K7 */ be_const_int(3), + /* K8 */ be_nested_str_weak(matter), + /* K9 */ be_nested_str_weak(Counter), + /* K10 */ be_nested_str_weak(is_greater), + /* K11 */ be_nested_str_weak(counter_group_ctrl_snd), + /* K12 */ be_nested_str_weak(_GROUP_SND_INCR), + /* K13 */ be_nested_str_weak(does_persist), + /* K14 */ be_nested_str_weak(save), + }), + be_str_weak(counter_group_ctrl_snd_next), + &be_const_str_solidified, + ( &(const binstruction[28]) { /* code */ + 0xA4060000, // 0000 IMPORT R1 K0 + 0x88080101, // 0001 GETMBR R2 R0 K1 + 0x8C080502, // 0002 GETMET R2 R2 K2 + 0x7C080200, // 0003 CALL R2 1 + 0xB80E0600, // 0004 GETNGBL R3 K3 + 0x8C0C0704, // 0005 GETMET R3 R3 K4 + 0x8C140305, // 0006 GETMET R5 R1 K5 + 0x581C0006, // 0007 LDCONST R7 K6 + 0x5C200400, // 0008 MOVE R8 R2 + 0x7C140600, // 0009 CALL R5 3 + 0x58180007, // 000A LDCONST R6 K7 + 0x7C0C0600, // 000B CALL R3 3 + 0xB80E1000, // 000C GETNGBL R3 K8 + 0x880C0709, // 000D GETMBR R3 R3 K9 + 0x8C0C070A, // 000E GETMET R3 R3 K10 + 0x5C140400, // 000F MOVE R5 R2 + 0x8818010B, // 0010 GETMBR R6 R0 K11 + 0x7C0C0600, // 0011 CALL R3 3 + 0x780E0007, // 0012 JMPF R3 #001B + 0x880C010C, // 0013 GETMBR R3 R0 K12 + 0x000C0403, // 0014 ADD R3 R2 R3 + 0x90021603, // 0015 SETMBR R0 K11 R3 + 0x8C0C010D, // 0016 GETMET R3 R0 K13 + 0x7C0C0200, // 0017 CALL R3 1 + 0x780E0001, // 0018 JMPF R3 #001B + 0x8C0C010E, // 0019 GETMET R3 R0 K14 + 0x7C0C0200, // 001A CALL R3 1 + 0x80040400, // 001B RET 1 R2 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: get_admin_vendor +********************************************************************/ +be_local_closure(Matter_Fabric_get_admin_vendor, /* name */ + be_nested_proto( + 2, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 1]) { /* constants */ + /* K0 */ be_nested_str_weak(admin_vendor), + }), + be_str_weak(get_admin_vendor), + &be_const_str_solidified, + ( &(const binstruction[ 2]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x80040200, // 0001 RET 1 R1 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: init +********************************************************************/ +be_local_closure(Matter_Fabric_init, /* name */ + be_nested_proto( + 5, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[18]) { /* constants */ + /* K0 */ be_nested_str_weak(crypto), + /* K1 */ be_nested_str_weak(_store), + /* K2 */ be_nested_str_weak(_sessions), + /* K3 */ be_nested_str_weak(matter), + /* K4 */ be_nested_str_weak(Expirable_list), + /* K5 */ be_nested_str_weak(fabric_label), + /* K6 */ be_nested_str_weak(), + /* K7 */ be_nested_str_weak(created), + /* K8 */ be_nested_str_weak(tasmota), + /* K9 */ be_nested_str_weak(rtc), + /* K10 */ be_nested_str_weak(utc), + /* K11 */ be_nested_str_weak(_counter_group_data_snd_impl), + /* K12 */ be_nested_str_weak(Counter), + /* K13 */ be_nested_str_weak(_counter_group_ctrl_snd_impl), + /* K14 */ be_nested_str_weak(counter_group_data_snd), + /* K15 */ be_nested_str_weak(next), + /* K16 */ be_nested_str_weak(_GROUP_SND_INCR), + /* K17 */ be_nested_str_weak(counter_group_ctrl_snd), + }), + be_str_weak(init), + &be_const_str_solidified, + ( &(const binstruction[33]) { /* code */ + 0xA40A0000, // 0000 IMPORT R2 K0 + 0x90020201, // 0001 SETMBR R0 K1 R1 + 0xB80E0600, // 0002 GETNGBL R3 K3 + 0x8C0C0704, // 0003 GETMET R3 R3 K4 + 0x7C0C0200, // 0004 CALL R3 1 + 0x90020403, // 0005 SETMBR R0 K2 R3 + 0x90020B06, // 0006 SETMBR R0 K5 K6 + 0xB80E1000, // 0007 GETNGBL R3 K8 + 0x8C0C0709, // 0008 GETMET R3 R3 K9 + 0x7C0C0200, // 0009 CALL R3 1 + 0x940C070A, // 000A GETIDX R3 R3 K10 + 0x90020E03, // 000B SETMBR R0 K7 R3 + 0xB80E0600, // 000C GETNGBL R3 K3 + 0x8C0C070C, // 000D GETMET R3 R3 K12 + 0x7C0C0200, // 000E CALL R3 1 + 0x90021603, // 000F SETMBR R0 K11 R3 + 0xB80E0600, // 0010 GETNGBL R3 K3 + 0x8C0C070C, // 0011 GETMET R3 R3 K12 + 0x7C0C0200, // 0012 CALL R3 1 + 0x90021A03, // 0013 SETMBR R0 K13 R3 + 0x880C010B, // 0014 GETMBR R3 R0 K11 + 0x8C0C070F, // 0015 GETMET R3 R3 K15 + 0x7C0C0200, // 0016 CALL R3 1 + 0x88100110, // 0017 GETMBR R4 R0 K16 + 0x000C0604, // 0018 ADD R3 R3 R4 + 0x90021C03, // 0019 SETMBR R0 K14 R3 + 0x880C010B, // 001A GETMBR R3 R0 K11 + 0x8C0C070F, // 001B GETMET R3 R3 K15 + 0x7C0C0200, // 001C CALL R3 1 + 0x88100110, // 001D GETMBR R4 R0 K16 + 0x000C0604, // 001E ADD R3 R3 R4 + 0x90022203, // 001F SETMBR R0 K17 R3 + 0x80000000, // 0020 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: get_oldest_session +********************************************************************/ +be_local_closure(Matter_Fabric_get_oldest_session, /* name */ + be_nested_proto( + 4, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 1]) { /* constants */ + /* K0 */ be_nested_str_weak(get_old_recent_session), + }), + be_str_weak(get_oldest_session), + &be_const_str_solidified, + ( &(const binstruction[ 4]) { /* code */ + 0x8C040100, // 0000 GETMET R1 R0 K0 + 0x500C0200, // 0001 LDBOOL R3 1 0 + 0x7C040400, // 0002 CALL R1 2 + 0x80040200, // 0003 RET 1 R1 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: set_admin_subject_vendor +********************************************************************/ +be_local_closure(Matter_Fabric_set_admin_subject_vendor, /* name */ + be_nested_proto( + 3, /* nstack */ + 3, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 2]) { /* constants */ + /* K0 */ be_nested_str_weak(admin_subject), + /* K1 */ be_nested_str_weak(admin_vendor), + }), + be_str_weak(set_admin_subject_vendor), + &be_const_str_solidified, + ( &(const binstruction[ 3]) { /* code */ + 0x90020001, // 0000 SETMBR R0 K0 R1 + 0x90020202, // 0001 SETMBR R0 K1 R2 + 0x80000000, // 0002 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: get_fabric_label +********************************************************************/ +be_local_closure(Matter_Fabric_get_fabric_label, /* name */ + be_nested_proto( + 2, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 1]) { /* constants */ + /* K0 */ be_nested_str_weak(fabric_label), + }), + be_str_weak(get_fabric_label), + &be_const_str_solidified, + ( &(const binstruction[ 2]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x80040200, // 0001 RET 1 R1 + }) + ) +); +/*******************************************************************/ + + /******************************************************************** ** Solidified function: tojson ********************************************************************/ @@ -179,33 +977,6 @@ be_local_closure(Matter_Fabric_tojson, /* name */ /*******************************************************************/ -/******************************************************************** -** Solidified function: get_fabric_index -********************************************************************/ -be_local_closure(Matter_Fabric_get_fabric_index, /* name */ - be_nested_proto( - 2, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 1]) { /* constants */ - /* K0 */ be_nested_str_weak(fabric_index), - }), - be_str_weak(get_fabric_index), - &be_const_str_solidified, - ( &(const binstruction[ 2]) { /* code */ - 0x88040100, // 0000 GETMBR R1 R0 K0 - 0x80040200, // 0001 RET 1 R1 - }) - ) -); -/*******************************************************************/ - - /******************************************************************** ** Solidified function: get_admin_subject ********************************************************************/ @@ -233,212 +1004,6 @@ be_local_closure(Matter_Fabric_get_admin_subject, /* name */ /*******************************************************************/ -/******************************************************************** -** Solidified function: get_old_recent_session -********************************************************************/ -be_local_closure(Matter_Fabric_get_old_recent_session, /* name */ - be_nested_proto( - 7, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 4]) { /* constants */ - /* K0 */ be_nested_str_weak(_sessions), - /* K1 */ be_const_int(0), - /* K2 */ be_nested_str_weak(last_used), - /* K3 */ be_const_int(1), - }), - be_str_weak(get_old_recent_session), - &be_const_str_solidified, - ( &(const binstruction[30]) { /* code */ - 0x6008000C, // 0000 GETGBL R2 G12 - 0x880C0100, // 0001 GETMBR R3 R0 K0 - 0x7C080200, // 0002 CALL R2 1 - 0x1C080501, // 0003 EQ R2 R2 K1 - 0x780A0001, // 0004 JMPF R2 #0007 - 0x4C080000, // 0005 LDNIL R2 - 0x80040400, // 0006 RET 1 R2 - 0x88080100, // 0007 GETMBR R2 R0 K0 - 0x94080501, // 0008 GETIDX R2 R2 K1 - 0x880C0502, // 0009 GETMBR R3 R2 K2 - 0x58100003, // 000A LDCONST R4 K3 - 0x6014000C, // 000B GETGBL R5 G12 - 0x88180100, // 000C GETMBR R6 R0 K0 - 0x7C140200, // 000D CALL R5 1 - 0x14140805, // 000E LT R5 R4 R5 - 0x7816000C, // 000F JMPF R5 #001D - 0x88140100, // 0010 GETMBR R5 R0 K0 - 0x94140A04, // 0011 GETIDX R5 R5 R4 - 0x88140B02, // 0012 GETMBR R5 R5 K2 - 0x78060001, // 0013 JMPF R1 #0016 - 0x14180A03, // 0014 LT R6 R5 R3 - 0x70020000, // 0015 JMP #0017 - 0x24180A03, // 0016 GT R6 R5 R3 - 0x781A0002, // 0017 JMPF R6 #001B - 0x88180100, // 0018 GETMBR R6 R0 K0 - 0x94080C04, // 0019 GETIDX R2 R6 R4 - 0x5C0C0A00, // 001A MOVE R3 R5 - 0x00100903, // 001B ADD R4 R4 K3 - 0x7001FFED, // 001C JMP #000B - 0x80040400, // 001D RET 1 R2 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: get_device_id -********************************************************************/ -be_local_closure(Matter_Fabric_get_device_id, /* name */ - be_nested_proto( - 2, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 1]) { /* constants */ - /* K0 */ be_nested_str_weak(device_id), - }), - be_str_weak(get_device_id), - &be_const_str_solidified, - ( &(const binstruction[ 2]) { /* code */ - 0x88040100, // 0000 GETMBR R1 R0 K0 - 0x80040200, // 0001 RET 1 R1 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: counter_group_ctrl_snd_next -********************************************************************/ -be_local_closure(Matter_Fabric_counter_group_ctrl_snd_next, /* name */ - be_nested_proto( - 9, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[15]) { /* constants */ - /* K0 */ be_nested_str_weak(string), - /* K1 */ be_nested_str_weak(_counter_group_ctrl_snd_impl), - /* K2 */ be_nested_str_weak(next), - /* K3 */ be_nested_str_weak(tasmota), - /* K4 */ be_nested_str_weak(log), - /* K5 */ be_nested_str_weak(format), - /* K6 */ be_nested_str_weak(MTR_X3A_X20_X2E_X20_X20_X20_X20_X20_X20_X20_X20_X20_X20Counter_group_ctrl_snd_X3D_X25i), - /* K7 */ be_const_int(3), - /* K8 */ be_nested_str_weak(matter), - /* K9 */ be_nested_str_weak(Counter), - /* K10 */ be_nested_str_weak(is_greater), - /* K11 */ be_nested_str_weak(counter_group_ctrl_snd), - /* K12 */ be_nested_str_weak(_GROUP_SND_INCR), - /* K13 */ be_nested_str_weak(does_persist), - /* K14 */ be_nested_str_weak(save), - }), - be_str_weak(counter_group_ctrl_snd_next), - &be_const_str_solidified, - ( &(const binstruction[28]) { /* code */ - 0xA4060000, // 0000 IMPORT R1 K0 - 0x88080101, // 0001 GETMBR R2 R0 K1 - 0x8C080502, // 0002 GETMET R2 R2 K2 - 0x7C080200, // 0003 CALL R2 1 - 0xB80E0600, // 0004 GETNGBL R3 K3 - 0x8C0C0704, // 0005 GETMET R3 R3 K4 - 0x8C140305, // 0006 GETMET R5 R1 K5 - 0x581C0006, // 0007 LDCONST R7 K6 - 0x5C200400, // 0008 MOVE R8 R2 - 0x7C140600, // 0009 CALL R5 3 - 0x58180007, // 000A LDCONST R6 K7 - 0x7C0C0600, // 000B CALL R3 3 - 0xB80E1000, // 000C GETNGBL R3 K8 - 0x880C0709, // 000D GETMBR R3 R3 K9 - 0x8C0C070A, // 000E GETMET R3 R3 K10 - 0x5C140400, // 000F MOVE R5 R2 - 0x8818010B, // 0010 GETMBR R6 R0 K11 - 0x7C0C0600, // 0011 CALL R3 3 - 0x780E0007, // 0012 JMPF R3 #001B - 0x880C010C, // 0013 GETMBR R3 R0 K12 - 0x000C0403, // 0014 ADD R3 R2 R3 - 0x90021603, // 0015 SETMBR R0 K11 R3 - 0x8C0C010D, // 0016 GETMET R3 R0 K13 - 0x7C0C0200, // 0017 CALL R3 1 - 0x780E0001, // 0018 JMPF R3 #001B - 0x8C0C010E, // 0019 GETMET R3 R0 K14 - 0x7C0C0200, // 001A CALL R3 1 - 0x80040400, // 001B RET 1 R2 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: set_fabric_index -********************************************************************/ -be_local_closure(Matter_Fabric_set_fabric_index, /* name */ - be_nested_proto( - 2, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 1]) { /* constants */ - /* K0 */ be_nested_str_weak(fabric_index), - }), - be_str_weak(set_fabric_index), - &be_const_str_solidified, - ( &(const binstruction[ 2]) { /* code */ - 0x90020001, // 0000 SETMBR R0 K0 R1 - 0x80000000, // 0001 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: get_fabric_compressed -********************************************************************/ -be_local_closure(Matter_Fabric_get_fabric_compressed, /* name */ - be_nested_proto( - 2, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 1]) { /* constants */ - /* K0 */ be_nested_str_weak(fabric_compressed), - }), - be_str_weak(get_fabric_compressed), - &be_const_str_solidified, - ( &(const binstruction[ 2]) { /* code */ - 0x88040100, // 0000 GETMBR R1 R0 K0 - 0x80040200, // 0001 RET 1 R1 - }) - ) -); -/*******************************************************************/ - - /******************************************************************** ** Solidified function: add_session ********************************************************************/ @@ -497,50 +1062,28 @@ be_local_closure(Matter_Fabric_add_session, /* name */ /******************************************************************** -** Solidified function: log_new_fabric +** Solidified function: set_noc_icac ********************************************************************/ -be_local_closure(Matter_Fabric_log_new_fabric, /* name */ +be_local_closure(Matter_Fabric_set_noc_icac, /* name */ be_nested_proto( - 9, /* nstack */ - 1, /* argc */ + 3, /* nstack */ + 3, /* argc */ 2, /* varg */ 0, /* has upvals */ NULL, /* no upvals */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[10]) { /* constants */ - /* K0 */ be_nested_str_weak(string), - /* K1 */ be_nested_str_weak(tasmota), - /* K2 */ be_nested_str_weak(log), - /* K3 */ be_nested_str_weak(format), - /* K4 */ be_nested_str_weak(MTR_X3A_X20_X2BFabric_X20_X20_X20_X20fab_X3D_X27_X25s_X27), - /* K5 */ be_nested_str_weak(get_fabric_id), - /* K6 */ be_nested_str_weak(copy), - /* K7 */ be_nested_str_weak(reverse), - /* K8 */ be_nested_str_weak(tohex), - /* K9 */ be_const_int(2), + ( &(const bvalue[ 2]) { /* constants */ + /* K0 */ be_nested_str_weak(noc), + /* K1 */ be_nested_str_weak(icac), }), - be_str_weak(log_new_fabric), + be_str_weak(set_noc_icac), &be_const_str_solidified, - ( &(const binstruction[17]) { /* code */ - 0xA4060000, // 0000 IMPORT R1 K0 - 0xB80A0200, // 0001 GETNGBL R2 K1 - 0x8C080502, // 0002 GETMET R2 R2 K2 - 0x8C100303, // 0003 GETMET R4 R1 K3 - 0x58180004, // 0004 LDCONST R6 K4 - 0x8C1C0105, // 0005 GETMET R7 R0 K5 - 0x7C1C0200, // 0006 CALL R7 1 - 0x8C1C0F06, // 0007 GETMET R7 R7 K6 - 0x7C1C0200, // 0008 CALL R7 1 - 0x8C1C0F07, // 0009 GETMET R7 R7 K7 - 0x7C1C0200, // 000A CALL R7 1 - 0x8C1C0F08, // 000B GETMET R7 R7 K8 - 0x7C1C0200, // 000C CALL R7 1 - 0x7C100600, // 000D CALL R4 3 - 0x58140009, // 000E LDCONST R5 K9 - 0x7C080600, // 000F CALL R2 3 - 0x80000000, // 0010 RET 0 + ( &(const binstruction[ 3]) { /* code */ + 0x90020001, // 0000 SETMBR R0 K0 R1 + 0x90020202, // 0001 SETMBR R0 K1 R2 + 0x80000000, // 0002 RET 0 }) ) ); @@ -548,9 +1091,200 @@ be_local_closure(Matter_Fabric_log_new_fabric, /* name */ /******************************************************************** -** Solidified function: before_remove +** Solidified function: get_newest_session ********************************************************************/ -be_local_closure(Matter_Fabric_before_remove, /* name */ +be_local_closure(Matter_Fabric_get_newest_session, /* name */ + be_nested_proto( + 4, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 1]) { /* constants */ + /* K0 */ be_nested_str_weak(get_old_recent_session), + }), + be_str_weak(get_newest_session), + &be_const_str_solidified, + ( &(const binstruction[ 4]) { /* code */ + 0x8C040100, // 0000 GETMET R1 R0 K0 + 0x500C0000, // 0001 LDBOOL R3 0 0 + 0x7C040400, // 0002 CALL R1 2 + 0x80040200, // 0003 RET 1 R1 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: get_fabric_index +********************************************************************/ +be_local_closure(Matter_Fabric_get_fabric_index, /* name */ + be_nested_proto( + 2, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 1]) { /* constants */ + /* K0 */ be_nested_str_weak(fabric_index), + }), + be_str_weak(get_fabric_index), + &be_const_str_solidified, + ( &(const binstruction[ 2]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x80040200, // 0001 RET 1 R1 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: set_fabric_device +********************************************************************/ +be_local_closure(Matter_Fabric_set_fabric_device, /* name */ + be_nested_proto( + 7, /* nstack */ + 5, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 5]) { /* constants */ + /* K0 */ be_nested_str_weak(fabric_id), + /* K1 */ be_nested_str_weak(device_id), + /* K2 */ be_nested_str_weak(fabric_compressed), + /* K3 */ be_nested_str_weak(fabric_parent), + /* K4 */ be_nested_str_weak(get_fabric_index), + }), + be_str_weak(set_fabric_device), + &be_const_str_solidified, + ( &(const binstruction[12]) { /* code */ + 0x90020001, // 0000 SETMBR R0 K0 R1 + 0x90020202, // 0001 SETMBR R0 K1 R2 + 0x90020403, // 0002 SETMBR R0 K2 R3 + 0x4C140000, // 0003 LDNIL R5 + 0x20140805, // 0004 NE R5 R4 R5 + 0x78160002, // 0005 JMPF R5 #0009 + 0x8C140904, // 0006 GETMET R5 R4 K4 + 0x7C140200, // 0007 CALL R5 1 + 0x70020000, // 0008 JMP #000A + 0x4C140000, // 0009 LDNIL R5 + 0x90020605, // 000A SETMBR R0 K3 R5 + 0x80000000, // 000B RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: get_ipk_group_key +********************************************************************/ +be_local_closure(Matter_Fabric_get_ipk_group_key, /* name */ + be_nested_proto( + 10, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 7]) { /* constants */ + /* K0 */ be_nested_str_weak(ipk_epoch_key), + /* K1 */ be_nested_str_weak(fabric_compressed), + /* K2 */ be_nested_str_weak(crypto), + /* K3 */ be_nested_str_weak(HKDF_SHA256), + /* K4 */ be_nested_str_weak(fromstring), + /* K5 */ be_nested_str_weak(_GROUP_KEY), + /* K6 */ be_nested_str_weak(derive), + }), + be_str_weak(get_ipk_group_key), + &be_const_str_solidified, + ( &(const binstruction[25]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x4C080000, // 0001 LDNIL R2 + 0x1C040202, // 0002 EQ R1 R1 R2 + 0x74060003, // 0003 JMPT R1 #0008 + 0x88040101, // 0004 GETMBR R1 R0 K1 + 0x4C080000, // 0005 LDNIL R2 + 0x1C040202, // 0006 EQ R1 R1 R2 + 0x78060001, // 0007 JMPF R1 #000A + 0x4C040000, // 0008 LDNIL R1 + 0x80040200, // 0009 RET 1 R1 + 0xA4060400, // 000A IMPORT R1 K2 + 0x8C080303, // 000B GETMET R2 R1 K3 + 0x7C080200, // 000C CALL R2 1 + 0x600C0015, // 000D GETGBL R3 G21 + 0x7C0C0000, // 000E CALL R3 0 + 0x8C0C0704, // 000F GETMET R3 R3 K4 + 0x88140105, // 0010 GETMBR R5 R0 K5 + 0x7C0C0400, // 0011 CALL R3 2 + 0x8C100506, // 0012 GETMET R4 R2 K6 + 0x88180100, // 0013 GETMBR R6 R0 K0 + 0x881C0101, // 0014 GETMBR R7 R0 K1 + 0x5C200600, // 0015 MOVE R8 R3 + 0x5426000F, // 0016 LDINT R9 16 + 0x7C100A00, // 0017 CALL R4 5 + 0x80040800, // 0018 RET 1 R4 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: fabric_candidate +********************************************************************/ +be_local_closure(Matter_Fabric_fabric_candidate, /* name */ + be_nested_proto( + 4, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 4]) { /* constants */ + /* K0 */ be_nested_str_weak(set_expire_in_seconds), + /* K1 */ be_nested_str_weak(assign_fabric_index), + /* K2 */ be_nested_str_weak(_store), + /* K3 */ be_nested_str_weak(add_fabric), + }), + be_str_weak(fabric_candidate), + &be_const_str_solidified, + ( &(const binstruction[10]) { /* code */ + 0x8C040100, // 0000 GETMET R1 R0 K0 + 0x540E0077, // 0001 LDINT R3 120 + 0x7C040400, // 0002 CALL R1 2 + 0x8C040101, // 0003 GETMET R1 R0 K1 + 0x7C040200, // 0004 CALL R1 1 + 0x88040102, // 0005 GETMBR R1 R0 K2 + 0x8C040303, // 0006 GETMET R1 R1 K3 + 0x5C0C0000, // 0007 MOVE R3 R0 + 0x7C040400, // 0008 CALL R1 2 + 0x80000000, // 0009 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: counter_group_data_snd_next +********************************************************************/ +be_local_closure(Matter_Fabric_counter_group_data_snd_next, /* name */ be_nested_proto( 9, /* nstack */ 1, /* argc */ @@ -560,38 +1294,162 @@ be_local_closure(Matter_Fabric_before_remove, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[10]) { /* constants */ + ( &(const bvalue[15]) { /* constants */ /* K0 */ be_nested_str_weak(string), - /* K1 */ be_nested_str_weak(tasmota), - /* K2 */ be_nested_str_weak(log), - /* K3 */ be_nested_str_weak(format), - /* K4 */ be_nested_str_weak(MTR_X3A_X20_X2DFabric_X20_X20_X20_X20fab_X3D_X27_X25s_X27_X20_X28removed_X29), - /* K5 */ be_nested_str_weak(get_fabric_id), - /* K6 */ be_nested_str_weak(copy), - /* K7 */ be_nested_str_weak(reverse), - /* K8 */ be_nested_str_weak(tohex), - /* K9 */ be_const_int(2), + /* K1 */ be_nested_str_weak(_counter_group_data_snd_impl), + /* K2 */ be_nested_str_weak(next), + /* K3 */ be_nested_str_weak(tasmota), + /* K4 */ be_nested_str_weak(log), + /* K5 */ be_nested_str_weak(format), + /* K6 */ be_nested_str_weak(MTR_X3A_X20_X2E_X20_X20_X20_X20_X20_X20_X20_X20_X20_X20Counter_group_data_snd_X3D_X25i), + /* K7 */ be_const_int(3), + /* K8 */ be_nested_str_weak(matter), + /* K9 */ be_nested_str_weak(Counter), + /* K10 */ be_nested_str_weak(is_greater), + /* K11 */ be_nested_str_weak(counter_group_data_snd), + /* K12 */ be_nested_str_weak(_GROUP_SND_INCR), + /* K13 */ be_nested_str_weak(does_persist), + /* K14 */ be_nested_str_weak(save), }), - be_str_weak(before_remove), + be_str_weak(counter_group_data_snd_next), &be_const_str_solidified, - ( &(const binstruction[17]) { /* code */ + ( &(const binstruction[28]) { /* code */ 0xA4060000, // 0000 IMPORT R1 K0 - 0xB80A0200, // 0001 GETNGBL R2 K1 + 0x88080101, // 0001 GETMBR R2 R0 K1 0x8C080502, // 0002 GETMET R2 R2 K2 - 0x8C100303, // 0003 GETMET R4 R1 K3 - 0x58180004, // 0004 LDCONST R6 K4 - 0x8C1C0105, // 0005 GETMET R7 R0 K5 - 0x7C1C0200, // 0006 CALL R7 1 - 0x8C1C0F06, // 0007 GETMET R7 R7 K6 - 0x7C1C0200, // 0008 CALL R7 1 - 0x8C1C0F07, // 0009 GETMET R7 R7 K7 - 0x7C1C0200, // 000A CALL R7 1 - 0x8C1C0F08, // 000B GETMET R7 R7 K8 - 0x7C1C0200, // 000C CALL R7 1 - 0x7C100600, // 000D CALL R4 3 - 0x58140009, // 000E LDCONST R5 K9 - 0x7C080600, // 000F CALL R2 3 - 0x80000000, // 0010 RET 0 + 0x7C080200, // 0003 CALL R2 1 + 0xB80E0600, // 0004 GETNGBL R3 K3 + 0x8C0C0704, // 0005 GETMET R3 R3 K4 + 0x8C140305, // 0006 GETMET R5 R1 K5 + 0x581C0006, // 0007 LDCONST R7 K6 + 0x5C200400, // 0008 MOVE R8 R2 + 0x7C140600, // 0009 CALL R5 3 + 0x58180007, // 000A LDCONST R6 K7 + 0x7C0C0600, // 000B CALL R3 3 + 0xB80E1000, // 000C GETNGBL R3 K8 + 0x880C0709, // 000D GETMBR R3 R3 K9 + 0x8C0C070A, // 000E GETMET R3 R3 K10 + 0x5C140400, // 000F MOVE R5 R2 + 0x8818010B, // 0010 GETMBR R6 R0 K11 + 0x7C0C0600, // 0011 CALL R3 3 + 0x780E0007, // 0012 JMPF R3 #001B + 0x880C010C, // 0013 GETMBR R3 R0 K12 + 0x000C0403, // 0014 ADD R3 R2 R3 + 0x90021603, // 0015 SETMBR R0 K11 R3 + 0x8C0C010D, // 0016 GETMET R3 R0 K13 + 0x7C0C0200, // 0017 CALL R3 1 + 0x780E0001, // 0018 JMPF R3 #001B + 0x8C0C010E, // 0019 GETMET R3 R0 K14 + 0x7C0C0200, // 001A CALL R3 1 + 0x80040400, // 001B RET 1 R2 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: get_noc +********************************************************************/ +be_local_closure(Matter_Fabric_get_noc, /* name */ + be_nested_proto( + 2, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 1]) { /* constants */ + /* K0 */ be_nested_str_weak(noc), + }), + be_str_weak(get_noc), + &be_const_str_solidified, + ( &(const binstruction[ 2]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x80040200, // 0001 RET 1 R1 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: get_pk +********************************************************************/ +be_local_closure(Matter_Fabric_get_pk, /* name */ + be_nested_proto( + 2, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 1]) { /* constants */ + /* K0 */ be_nested_str_weak(no_private_key), + }), + be_str_weak(get_pk), + &be_const_str_solidified, + ( &(const binstruction[ 2]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x80040200, // 0001 RET 1 R1 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: get_fabric_id +********************************************************************/ +be_local_closure(Matter_Fabric_get_fabric_id, /* name */ + be_nested_proto( + 2, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 1]) { /* constants */ + /* K0 */ be_nested_str_weak(fabric_id), + }), + be_str_weak(get_fabric_id), + &be_const_str_solidified, + ( &(const binstruction[ 2]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x80040200, // 0001 RET 1 R1 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: get_icac +********************************************************************/ +be_local_closure(Matter_Fabric_get_icac, /* name */ + be_nested_proto( + 2, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 1]) { /* constants */ + /* K0 */ be_nested_str_weak(icac), + }), + be_str_weak(get_icac), + &be_const_str_solidified, + ( &(const binstruction[ 2]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x80040200, // 0001 RET 1 R1 }) ) ); @@ -716,539 +1574,6 @@ be_local_closure(Matter_Fabric_fromjson, /* name */ /*******************************************************************/ -/******************************************************************** -** Solidified function: init -********************************************************************/ -be_local_closure(Matter_Fabric_init, /* name */ - be_nested_proto( - 5, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[18]) { /* constants */ - /* K0 */ be_nested_str_weak(crypto), - /* K1 */ be_nested_str_weak(_store), - /* K2 */ be_nested_str_weak(_sessions), - /* K3 */ be_nested_str_weak(matter), - /* K4 */ be_nested_str_weak(Expirable_list), - /* K5 */ be_nested_str_weak(fabric_label), - /* K6 */ be_nested_str_weak(), - /* K7 */ be_nested_str_weak(created), - /* K8 */ be_nested_str_weak(tasmota), - /* K9 */ be_nested_str_weak(rtc), - /* K10 */ be_nested_str_weak(utc), - /* K11 */ be_nested_str_weak(_counter_group_data_snd_impl), - /* K12 */ be_nested_str_weak(Counter), - /* K13 */ be_nested_str_weak(_counter_group_ctrl_snd_impl), - /* K14 */ be_nested_str_weak(counter_group_data_snd), - /* K15 */ be_nested_str_weak(next), - /* K16 */ be_nested_str_weak(_GROUP_SND_INCR), - /* K17 */ be_nested_str_weak(counter_group_ctrl_snd), - }), - be_str_weak(init), - &be_const_str_solidified, - ( &(const binstruction[33]) { /* code */ - 0xA40A0000, // 0000 IMPORT R2 K0 - 0x90020201, // 0001 SETMBR R0 K1 R1 - 0xB80E0600, // 0002 GETNGBL R3 K3 - 0x8C0C0704, // 0003 GETMET R3 R3 K4 - 0x7C0C0200, // 0004 CALL R3 1 - 0x90020403, // 0005 SETMBR R0 K2 R3 - 0x90020B06, // 0006 SETMBR R0 K5 K6 - 0xB80E1000, // 0007 GETNGBL R3 K8 - 0x8C0C0709, // 0008 GETMET R3 R3 K9 - 0x7C0C0200, // 0009 CALL R3 1 - 0x940C070A, // 000A GETIDX R3 R3 K10 - 0x90020E03, // 000B SETMBR R0 K7 R3 - 0xB80E0600, // 000C GETNGBL R3 K3 - 0x8C0C070C, // 000D GETMET R3 R3 K12 - 0x7C0C0200, // 000E CALL R3 1 - 0x90021603, // 000F SETMBR R0 K11 R3 - 0xB80E0600, // 0010 GETNGBL R3 K3 - 0x8C0C070C, // 0011 GETMET R3 R3 K12 - 0x7C0C0200, // 0012 CALL R3 1 - 0x90021A03, // 0013 SETMBR R0 K13 R3 - 0x880C010B, // 0014 GETMBR R3 R0 K11 - 0x8C0C070F, // 0015 GETMET R3 R3 K15 - 0x7C0C0200, // 0016 CALL R3 1 - 0x88100110, // 0017 GETMBR R4 R0 K16 - 0x000C0604, // 0018 ADD R3 R3 R4 - 0x90021C03, // 0019 SETMBR R0 K14 R3 - 0x880C010B, // 001A GETMBR R3 R0 K11 - 0x8C0C070F, // 001B GETMET R3 R3 K15 - 0x7C0C0200, // 001C CALL R3 1 - 0x88100110, // 001D GETMBR R4 R0 K16 - 0x000C0604, // 001E ADD R3 R3 R4 - 0x90022203, // 001F SETMBR R0 K17 R3 - 0x80000000, // 0020 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: get_ipk_group_key -********************************************************************/ -be_local_closure(Matter_Fabric_get_ipk_group_key, /* name */ - be_nested_proto( - 10, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 7]) { /* constants */ - /* K0 */ be_nested_str_weak(ipk_epoch_key), - /* K1 */ be_nested_str_weak(fabric_compressed), - /* K2 */ be_nested_str_weak(crypto), - /* K3 */ be_nested_str_weak(HKDF_SHA256), - /* K4 */ be_nested_str_weak(fromstring), - /* K5 */ be_nested_str_weak(_GROUP_KEY), - /* K6 */ be_nested_str_weak(derive), - }), - be_str_weak(get_ipk_group_key), - &be_const_str_solidified, - ( &(const binstruction[25]) { /* code */ - 0x88040100, // 0000 GETMBR R1 R0 K0 - 0x4C080000, // 0001 LDNIL R2 - 0x1C040202, // 0002 EQ R1 R1 R2 - 0x74060003, // 0003 JMPT R1 #0008 - 0x88040101, // 0004 GETMBR R1 R0 K1 - 0x4C080000, // 0005 LDNIL R2 - 0x1C040202, // 0006 EQ R1 R1 R2 - 0x78060001, // 0007 JMPF R1 #000A - 0x4C040000, // 0008 LDNIL R1 - 0x80040200, // 0009 RET 1 R1 - 0xA4060400, // 000A IMPORT R1 K2 - 0x8C080303, // 000B GETMET R2 R1 K3 - 0x7C080200, // 000C CALL R2 1 - 0x600C0015, // 000D GETGBL R3 G21 - 0x7C0C0000, // 000E CALL R3 0 - 0x8C0C0704, // 000F GETMET R3 R3 K4 - 0x88140105, // 0010 GETMBR R5 R0 K5 - 0x7C0C0400, // 0011 CALL R3 2 - 0x8C100506, // 0012 GETMET R4 R2 K6 - 0x88180100, // 0013 GETMBR R6 R0 K0 - 0x881C0101, // 0014 GETMBR R7 R0 K1 - 0x5C200600, // 0015 MOVE R8 R3 - 0x5426000F, // 0016 LDINT R9 16 - 0x7C100A00, // 0017 CALL R4 5 - 0x80040800, // 0018 RET 1 R4 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: get_ipk_epoch_key -********************************************************************/ -be_local_closure(Matter_Fabric_get_ipk_epoch_key, /* name */ - be_nested_proto( - 2, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 1]) { /* constants */ - /* K0 */ be_nested_str_weak(ipk_epoch_key), - }), - be_str_weak(get_ipk_epoch_key), - &be_const_str_solidified, - ( &(const binstruction[ 2]) { /* code */ - 0x88040100, // 0000 GETMBR R1 R0 K0 - 0x80040200, // 0001 RET 1 R1 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: get_oldest_session -********************************************************************/ -be_local_closure(Matter_Fabric_get_oldest_session, /* name */ - be_nested_proto( - 4, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 1]) { /* constants */ - /* K0 */ be_nested_str_weak(get_old_recent_session), - }), - be_str_weak(get_oldest_session), - &be_const_str_solidified, - ( &(const binstruction[ 4]) { /* code */ - 0x8C040100, // 0000 GETMET R1 R0 K0 - 0x500C0200, // 0001 LDBOOL R3 1 0 - 0x7C040400, // 0002 CALL R1 2 - 0x80040200, // 0003 RET 1 R1 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: get_fabric_label -********************************************************************/ -be_local_closure(Matter_Fabric_get_fabric_label, /* name */ - be_nested_proto( - 2, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 1]) { /* constants */ - /* K0 */ be_nested_str_weak(fabric_label), - }), - be_str_weak(get_fabric_label), - &be_const_str_solidified, - ( &(const binstruction[ 2]) { /* code */ - 0x88040100, // 0000 GETMBR R1 R0 K0 - 0x80040200, // 0001 RET 1 R1 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: get_newest_session -********************************************************************/ -be_local_closure(Matter_Fabric_get_newest_session, /* name */ - be_nested_proto( - 4, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 1]) { /* constants */ - /* K0 */ be_nested_str_weak(get_old_recent_session), - }), - be_str_weak(get_newest_session), - &be_const_str_solidified, - ( &(const binstruction[ 4]) { /* code */ - 0x8C040100, // 0000 GETMET R1 R0 K0 - 0x500C0000, // 0001 LDBOOL R3 0 0 - 0x7C040400, // 0002 CALL R1 2 - 0x80040200, // 0003 RET 1 R1 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: get_ca -********************************************************************/ -be_local_closure(Matter_Fabric_get_ca, /* name */ - be_nested_proto( - 2, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 1]) { /* constants */ - /* K0 */ be_nested_str_weak(root_ca_certificate), - }), - be_str_weak(get_ca), - &be_const_str_solidified, - ( &(const binstruction[ 2]) { /* code */ - 0x88040100, // 0000 GETMBR R1 R0 K0 - 0x80040200, // 0001 RET 1 R1 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: get_icac -********************************************************************/ -be_local_closure(Matter_Fabric_get_icac, /* name */ - be_nested_proto( - 2, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 1]) { /* constants */ - /* K0 */ be_nested_str_weak(icac), - }), - be_str_weak(get_icac), - &be_const_str_solidified, - ( &(const binstruction[ 2]) { /* code */ - 0x88040100, // 0000 GETMBR R1 R0 K0 - 0x80040200, // 0001 RET 1 R1 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: get_noc -********************************************************************/ -be_local_closure(Matter_Fabric_get_noc, /* name */ - be_nested_proto( - 2, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 1]) { /* constants */ - /* K0 */ be_nested_str_weak(noc), - }), - be_str_weak(get_noc), - &be_const_str_solidified, - ( &(const binstruction[ 2]) { /* code */ - 0x88040100, // 0000 GETMBR R1 R0 K0 - 0x80040200, // 0001 RET 1 R1 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: get_fabric_id -********************************************************************/ -be_local_closure(Matter_Fabric_get_fabric_id, /* name */ - be_nested_proto( - 2, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 1]) { /* constants */ - /* K0 */ be_nested_str_weak(fabric_id), - }), - be_str_weak(get_fabric_id), - &be_const_str_solidified, - ( &(const binstruction[ 2]) { /* code */ - 0x88040100, // 0000 GETMBR R1 R0 K0 - 0x80040200, // 0001 RET 1 R1 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: get_admin_vendor -********************************************************************/ -be_local_closure(Matter_Fabric_get_admin_vendor, /* name */ - be_nested_proto( - 2, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 1]) { /* constants */ - /* K0 */ be_nested_str_weak(admin_vendor), - }), - be_str_weak(get_admin_vendor), - &be_const_str_solidified, - ( &(const binstruction[ 2]) { /* code */ - 0x88040100, // 0000 GETMBR R1 R0 K0 - 0x80040200, // 0001 RET 1 R1 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: hydrate_post -********************************************************************/ -be_local_closure(Matter_Fabric_hydrate_post, /* name */ - be_nested_proto( - 4, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 6]) { /* constants */ - /* K0 */ be_nested_str_weak(_counter_group_data_snd_impl), - /* K1 */ be_nested_str_weak(reset), - /* K2 */ be_nested_str_weak(counter_group_data_snd), - /* K3 */ be_nested_str_weak(_counter_group_ctrl_snd_impl), - /* K4 */ be_nested_str_weak(counter_group_ctrl_snd), - /* K5 */ be_nested_str_weak(val), - }), - be_str_weak(hydrate_post), - &be_const_str_solidified, - ( &(const binstruction[17]) { /* code */ - 0x88040100, // 0000 GETMBR R1 R0 K0 - 0x8C040301, // 0001 GETMET R1 R1 K1 - 0x880C0102, // 0002 GETMBR R3 R0 K2 - 0x7C040400, // 0003 CALL R1 2 - 0x88040103, // 0004 GETMBR R1 R0 K3 - 0x8C040301, // 0005 GETMET R1 R1 K1 - 0x880C0104, // 0006 GETMBR R3 R0 K4 - 0x7C040400, // 0007 CALL R1 2 - 0x88040100, // 0008 GETMBR R1 R0 K0 - 0x8C040305, // 0009 GETMET R1 R1 K5 - 0x7C040200, // 000A CALL R1 1 - 0x90020401, // 000B SETMBR R0 K2 R1 - 0x88040103, // 000C GETMBR R1 R0 K3 - 0x8C040305, // 000D GETMET R1 R1 K5 - 0x7C040200, // 000E CALL R1 1 - 0x90020801, // 000F SETMBR R0 K4 R1 - 0x80000000, // 0010 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: counter_group_data_snd_next -********************************************************************/ -be_local_closure(Matter_Fabric_counter_group_data_snd_next, /* name */ - be_nested_proto( - 9, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[15]) { /* constants */ - /* K0 */ be_nested_str_weak(string), - /* K1 */ be_nested_str_weak(_counter_group_data_snd_impl), - /* K2 */ be_nested_str_weak(next), - /* K3 */ be_nested_str_weak(tasmota), - /* K4 */ be_nested_str_weak(log), - /* K5 */ be_nested_str_weak(format), - /* K6 */ be_nested_str_weak(MTR_X3A_X20_X2E_X20_X20_X20_X20_X20_X20_X20_X20_X20_X20Counter_group_data_snd_X3D_X25i), - /* K7 */ be_const_int(3), - /* K8 */ be_nested_str_weak(matter), - /* K9 */ be_nested_str_weak(Counter), - /* K10 */ be_nested_str_weak(is_greater), - /* K11 */ be_nested_str_weak(counter_group_data_snd), - /* K12 */ be_nested_str_weak(_GROUP_SND_INCR), - /* K13 */ be_nested_str_weak(does_persist), - /* K14 */ be_nested_str_weak(save), - }), - be_str_weak(counter_group_data_snd_next), - &be_const_str_solidified, - ( &(const binstruction[28]) { /* code */ - 0xA4060000, // 0000 IMPORT R1 K0 - 0x88080101, // 0001 GETMBR R2 R0 K1 - 0x8C080502, // 0002 GETMET R2 R2 K2 - 0x7C080200, // 0003 CALL R2 1 - 0xB80E0600, // 0004 GETNGBL R3 K3 - 0x8C0C0704, // 0005 GETMET R3 R3 K4 - 0x8C140305, // 0006 GETMET R5 R1 K5 - 0x581C0006, // 0007 LDCONST R7 K6 - 0x5C200400, // 0008 MOVE R8 R2 - 0x7C140600, // 0009 CALL R5 3 - 0x58180007, // 000A LDCONST R6 K7 - 0x7C0C0600, // 000B CALL R3 3 - 0xB80E1000, // 000C GETNGBL R3 K8 - 0x880C0709, // 000D GETMBR R3 R3 K9 - 0x8C0C070A, // 000E GETMET R3 R3 K10 - 0x5C140400, // 000F MOVE R5 R2 - 0x8818010B, // 0010 GETMBR R6 R0 K11 - 0x7C0C0600, // 0011 CALL R3 3 - 0x780E0007, // 0012 JMPF R3 #001B - 0x880C010C, // 0013 GETMBR R3 R0 K12 - 0x000C0403, // 0014 ADD R3 R2 R3 - 0x90021603, // 0015 SETMBR R0 K11 R3 - 0x8C0C010D, // 0016 GETMET R3 R0 K13 - 0x7C0C0200, // 0017 CALL R3 1 - 0x780E0001, // 0018 JMPF R3 #001B - 0x8C0C010E, // 0019 GETMET R3 R0 K14 - 0x7C0C0200, // 001A CALL R3 1 - 0x80040400, // 001B RET 1 R2 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: get_ca_pub -********************************************************************/ -be_local_closure(Matter_Fabric_get_ca_pub, /* name */ - be_nested_proto( - 6, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 5]) { /* constants */ - /* K0 */ be_nested_str_weak(root_ca_certificate), - /* K1 */ be_nested_str_weak(matter), - /* K2 */ be_nested_str_weak(TLV), - /* K3 */ be_nested_str_weak(parse), - /* K4 */ be_nested_str_weak(findsubval), - }), - be_str_weak(get_ca_pub), - &be_const_str_solidified, - ( &(const binstruction[12]) { /* code */ - 0x88040100, // 0000 GETMBR R1 R0 K0 - 0x78060008, // 0001 JMPF R1 #000B - 0xB80A0200, // 0002 GETNGBL R2 K1 - 0x88080502, // 0003 GETMBR R2 R2 K2 - 0x8C080503, // 0004 GETMET R2 R2 K3 - 0x5C100200, // 0005 MOVE R4 R1 - 0x7C080400, // 0006 CALL R2 2 - 0x8C0C0504, // 0007 GETMET R3 R2 K4 - 0x54160008, // 0008 LDINT R5 9 - 0x7C0C0400, // 0009 CALL R3 2 - 0x80040600, // 000A RET 1 R3 - 0x80000000, // 000B RET 0 - }) - ) -); -/*******************************************************************/ - - /******************************************************************** ** Solidified class: Matter_Fabric ********************************************************************/ @@ -1256,57 +1581,67 @@ extern const bclass be_class_Matter_Expirable; be_local_class(Matter_Fabric, 20, &be_class_Matter_Expirable, - be_nested_map(49, + be_nested_map(59, ( (struct bmapnode*) &(const bmapnode[]) { - { be_const_key_weak(no_private_key, -1), be_const_var(5) }, - { be_const_key_weak(tojson, 8), be_const_closure(Matter_Fabric_tojson_closure) }, - { be_const_key_weak(counter_group_data_snd, -1), be_const_var(14) }, - { be_const_key_weak(fabric_label, -1), be_const_var(13) }, - { be_const_key_weak(_sessions, 34), be_const_var(4) }, - { be_const_key_weak(created, -1), be_const_var(1) }, - { be_const_key_weak(_GROUP_SND_INCR, -1), be_const_int(32) }, - { be_const_key_weak(get_admin_subject, -1), be_const_closure(Matter_Fabric_get_admin_subject_closure) }, - { be_const_key_weak(add_session, -1), be_const_closure(Matter_Fabric_add_session_closure) }, - { be_const_key_weak(get_old_recent_session, -1), be_const_closure(Matter_Fabric_get_old_recent_session_closure) }, - { be_const_key_weak(counter_group_data_snd_next, -1), be_const_closure(Matter_Fabric_counter_group_data_snd_next_closure) }, - { be_const_key_weak(ipk_epoch_key, -1), be_const_var(9) }, - { be_const_key_weak(get_device_id, -1), be_const_closure(Matter_Fabric_get_device_id_closure) }, - { be_const_key_weak(counter_group_ctrl_snd_next, -1), be_const_closure(Matter_Fabric_counter_group_ctrl_snd_next_closure) }, - { be_const_key_weak(_counter_group_ctrl_snd_impl, -1), be_const_var(17) }, - { be_const_key_weak(admin_subject, 3), be_const_var(18) }, - { be_const_key_weak(set_fabric_index, -1), be_const_closure(Matter_Fabric_set_fabric_index_closure) }, - { be_const_key_weak(get_fabric_compressed, 32), be_const_closure(Matter_Fabric_get_fabric_compressed_closure) }, - { be_const_key_weak(fabric_index, -1), be_const_var(2) }, - { be_const_key_weak(counter_group_ctrl_snd, 21), be_const_var(15) }, - { be_const_key_weak(log_new_fabric, -1), be_const_closure(Matter_Fabric_log_new_fabric_closure) }, - { be_const_key_weak(init, -1), be_const_closure(Matter_Fabric_init_closure) }, - { be_const_key_weak(get_fabric_id, -1), be_const_closure(Matter_Fabric_get_fabric_id_closure) }, - { be_const_key_weak(_store, 15), be_const_var(0) }, - { be_const_key_weak(admin_vendor, 20), be_const_var(19) }, - { be_const_key_weak(device_id, 40), be_const_var(12) }, - { be_const_key_weak(before_remove, 28), be_const_closure(Matter_Fabric_before_remove_closure) }, - { be_const_key_weak(fromjson, -1), be_const_static_closure(Matter_Fabric_fromjson_closure) }, - { be_const_key_weak(get_noc, 39), be_const_closure(Matter_Fabric_get_noc_closure) }, - { be_const_key_weak(get_fabric_index, 38), be_const_closure(Matter_Fabric_get_fabric_index_closure) }, - { be_const_key_weak(_MAX_CASE, -1), be_const_int(5) }, - { be_const_key_weak(get_ipk_epoch_key, -1), be_const_closure(Matter_Fabric_get_ipk_epoch_key_closure) }, - { be_const_key_weak(_GROUP_KEY, -1), be_nested_str_weak(GroupKey_X20v1_X2E0) }, - { be_const_key_weak(_counter_group_data_snd_impl, -1), be_const_var(16) }, - { be_const_key_weak(fabric_parent, -1), be_const_var(3) }, - { be_const_key_weak(fabric_id, -1), be_const_var(10) }, - { be_const_key_weak(icac, 35), be_const_var(8) }, - { be_const_key_weak(get_ca, -1), be_const_closure(Matter_Fabric_get_ca_closure) }, - { be_const_key_weak(get_ipk_group_key, 6), be_const_closure(Matter_Fabric_get_ipk_group_key_closure) }, - { be_const_key_weak(get_fabric_label, -1), be_const_closure(Matter_Fabric_get_fabric_label_closure) }, - { be_const_key_weak(get_oldest_session, -1), be_const_closure(Matter_Fabric_get_oldest_session_closure) }, - { be_const_key_weak(get_newest_session, 22), be_const_closure(Matter_Fabric_get_newest_session_closure) }, - { be_const_key_weak(get_admin_vendor, -1), be_const_closure(Matter_Fabric_get_admin_vendor_closure) }, - { be_const_key_weak(noc, -1), be_const_var(7) }, + { be_const_key_weak(icac, -1), be_const_var(8) }, { be_const_key_weak(hydrate_post, -1), be_const_closure(Matter_Fabric_hydrate_post_closure) }, - { be_const_key_weak(get_icac, 10), be_const_closure(Matter_Fabric_get_icac_closure) }, - { be_const_key_weak(fabric_compressed, -1), be_const_var(11) }, + { be_const_key_weak(set_ca, 32), be_const_closure(Matter_Fabric_set_ca_closure) }, + { be_const_key_weak(fabric_completed, 4), be_const_closure(Matter_Fabric_fabric_completed_closure) }, + { be_const_key_weak(_counter_group_data_snd_impl, 26), be_const_var(16) }, + { be_const_key_weak(get_oldest_session, -1), be_const_closure(Matter_Fabric_get_oldest_session_closure) }, { be_const_key_weak(get_ca_pub, -1), be_const_closure(Matter_Fabric_get_ca_pub_closure) }, + { be_const_key_weak(before_remove, -1), be_const_closure(Matter_Fabric_before_remove_closure) }, + { be_const_key_weak(get_ca, -1), be_const_closure(Matter_Fabric_get_ca_closure) }, + { be_const_key_weak(fabric_index, -1), be_const_var(2) }, + { be_const_key_weak(fabric_compressed, -1), be_const_var(11) }, + { be_const_key_weak(log_new_fabric, -1), be_const_closure(Matter_Fabric_log_new_fabric_closure) }, + { be_const_key_weak(noc, -1), be_const_var(7) }, + { be_const_key_weak(set_fabric_index, -1), be_const_closure(Matter_Fabric_set_fabric_index_closure) }, + { be_const_key_weak(_MAX_CASE, -1), be_const_int(5) }, + { be_const_key_weak(_store, -1), be_const_var(0) }, + { be_const_key_weak(get_ipk_epoch_key, -1), be_const_closure(Matter_Fabric_get_ipk_epoch_key_closure) }, { be_const_key_weak(root_ca_certificate, -1), be_const_var(6) }, + { be_const_key_weak(set_pk, -1), be_const_closure(Matter_Fabric_set_pk_closure) }, + { be_const_key_weak(tojson, -1), be_const_closure(Matter_Fabric_tojson_closure) }, + { be_const_key_weak(assign_fabric_index, 57), be_const_closure(Matter_Fabric_assign_fabric_index_closure) }, + { be_const_key_weak(set_noc_icac, -1), be_const_closure(Matter_Fabric_set_noc_icac_closure) }, + { be_const_key_weak(get_icac, -1), be_const_closure(Matter_Fabric_get_icac_closure) }, + { be_const_key_weak(counter_group_ctrl_snd_next, 22), be_const_closure(Matter_Fabric_counter_group_ctrl_snd_next_closure) }, + { be_const_key_weak(get_admin_vendor, -1), be_const_closure(Matter_Fabric_get_admin_vendor_closure) }, + { be_const_key_weak(counter_group_data_snd, -1), be_const_var(14) }, + { be_const_key_weak(get_newest_session, 0), be_const_closure(Matter_Fabric_get_newest_session_closure) }, + { be_const_key_weak(set_admin_subject_vendor, -1), be_const_closure(Matter_Fabric_set_admin_subject_vendor_closure) }, + { be_const_key_weak(device_id, -1), be_const_var(12) }, + { be_const_key_weak(get_fabric_compressed, 19), be_const_closure(Matter_Fabric_get_fabric_compressed_closure) }, + { be_const_key_weak(get_pk, 17), be_const_closure(Matter_Fabric_get_pk_closure) }, + { be_const_key_weak(init, 30), be_const_closure(Matter_Fabric_init_closure) }, + { be_const_key_weak(get_noc, -1), be_const_closure(Matter_Fabric_get_noc_closure) }, + { be_const_key_weak(set_ipk_epoch_key, 21), be_const_closure(Matter_Fabric_set_ipk_epoch_key_closure) }, + { be_const_key_weak(get_old_recent_session, 47), be_const_closure(Matter_Fabric_get_old_recent_session_closure) }, + { be_const_key_weak(fabric_parent, -1), be_const_var(3) }, + { be_const_key_weak(admin_vendor, -1), be_const_var(19) }, + { be_const_key_weak(counter_group_data_snd_next, 42), be_const_closure(Matter_Fabric_counter_group_data_snd_next_closure) }, + { be_const_key_weak(get_fabric_index, -1), be_const_closure(Matter_Fabric_get_fabric_index_closure) }, + { be_const_key_weak(set_fabric_device, -1), be_const_closure(Matter_Fabric_set_fabric_device_closure) }, + { be_const_key_weak(get_fabric_label, 46), be_const_closure(Matter_Fabric_get_fabric_label_closure) }, + { be_const_key_weak(get_device_id, 36), be_const_closure(Matter_Fabric_get_device_id_closure) }, + { be_const_key_weak(_sessions, -1), be_const_var(4) }, + { be_const_key_weak(fabric_candidate, -1), be_const_closure(Matter_Fabric_fabric_candidate_closure) }, + { be_const_key_weak(_GROUP_SND_INCR, 37), be_const_int(32) }, + { be_const_key_weak(_GROUP_KEY, -1), be_nested_str_weak(GroupKey_X20v1_X2E0) }, + { be_const_key_weak(get_ipk_group_key, -1), be_const_closure(Matter_Fabric_get_ipk_group_key_closure) }, + { be_const_key_weak(ipk_epoch_key, 51), be_const_var(9) }, + { be_const_key_weak(get_admin_subject, 28), be_const_closure(Matter_Fabric_get_admin_subject_closure) }, + { be_const_key_weak(get_fabric_id, -1), be_const_closure(Matter_Fabric_get_fabric_id_closure) }, + { be_const_key_weak(no_private_key, 25), be_const_var(5) }, + { be_const_key_weak(counter_group_ctrl_snd, 5), be_const_var(15) }, + { be_const_key_weak(fabric_id, -1), be_const_var(10) }, + { be_const_key_weak(_counter_group_ctrl_snd_impl, -1), be_const_var(17) }, + { be_const_key_weak(fromjson, -1), be_const_static_closure(Matter_Fabric_fromjson_closure) }, + { be_const_key_weak(add_session, 14), be_const_closure(Matter_Fabric_add_session_closure) }, + { be_const_key_weak(fabric_label, -1), be_const_var(13) }, + { be_const_key_weak(created, -1), be_const_var(1) }, + { be_const_key_weak(admin_subject, -1), be_const_var(18) }, })), be_str_weak(Matter_Fabric) ); diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_IM.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_IM.h index df537be23..86017e501 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_IM.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_IM.h @@ -67,7 +67,7 @@ be_local_closure(Matter_IM_expire_sendqueue, /* name */ ********************************************************************/ be_local_closure(Matter_IM_process_invoke_request, /* name */ be_nested_proto( - 21, /* nstack */ + 22, /* nstack */ 3, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -123,7 +123,7 @@ be_local_closure(Matter_IM_process_invoke_request, /* name */ }), be_str_weak(process_invoke_request), &be_const_str_solidified, - ( &(const binstruction[270]) { /* code */ + ( &(const binstruction[271]) { /* code */ 0xA40E0000, // 0000 IMPORT R3 K0 0xB8120200, // 0001 GETNGBL R4 K1 0x8C100902, // 0002 GETMET R4 R4 K2 @@ -137,7 +137,7 @@ be_local_closure(Matter_IM_process_invoke_request, /* name */ 0x88180B05, // 000A GETMBR R6 R5 K5 0x4C1C0000, // 000B LDNIL R7 0x20180C07, // 000C NE R6 R6 R7 - 0x781A00FE, // 000D JMPF R6 #010D + 0x781A00FF, // 000D JMPF R6 #010E 0xB81A0200, // 000E GETNGBL R6 K1 0x8C180D06, // 000F GETMET R6 R6 K6 0x7C180200, // 0010 CALL R6 1 @@ -149,7 +149,7 @@ be_local_closure(Matter_IM_process_invoke_request, /* name */ 0x601C0010, // 0016 GETGBL R7 G16 0x88200B05, // 0017 GETMBR R8 R5 K5 0x7C1C0200, // 0018 CALL R7 1 - 0xA80200E1, // 0019 EXBLK 0 #00FC + 0xA80200E2, // 0019 EXBLK 0 #00FD 0x5C200E00, // 001A MOVE R8 R7 0x7C200000, // 001B CALL R8 0 0x8824110A, // 001C GETMBR R9 R8 K10 @@ -169,231 +169,232 @@ be_local_closure(Matter_IM_process_invoke_request, /* name */ 0x882C090B, // 002A GETMBR R11 R4 K11 0x8830090C, // 002B GETMBR R12 R4 K12 0x7C240600, // 002C CALL R9 3 - 0x88280110, // 002D GETMBR R10 R0 K16 - 0x8C281511, // 002E GETMET R10 R10 K17 - 0x88300312, // 002F GETMBR R12 R1 K18 - 0x88341113, // 0030 GETMBR R13 R8 K19 - 0x5C380800, // 0031 MOVE R14 R4 - 0x7C280800, // 0032 CALL R10 4 - 0x882C0914, // 0033 GETMBR R11 R4 K20 - 0x4C300000, // 0034 LDNIL R12 - 0x202C160C, // 0035 NE R11 R11 R12 - 0x782E0005, // 0036 JMPF R11 #003D - 0x602C0008, // 0037 GETGBL R11 G8 - 0x88300914, // 0038 GETMBR R12 R4 K20 - 0x7C2C0200, // 0039 CALL R11 1 - 0x002E2A0B, // 003A ADD R11 K21 R11 - 0x002C1716, // 003B ADD R11 R11 K22 - 0x70020000, // 003C JMP #003E - 0x582C0017, // 003D LDCONST R11 K23 - 0xB8323000, // 003E GETNGBL R12 K24 - 0x8C301914, // 003F GETMET R12 R12 K20 - 0x8C380719, // 0040 GETMET R14 R3 K25 - 0x5840001A, // 0041 LDCONST R16 K26 - 0x88440312, // 0042 GETMBR R17 R1 K18 - 0x8844231B, // 0043 GETMBR R17 R17 K27 - 0x60480008, // 0044 GETGBL R18 G8 - 0x5C4C0800, // 0045 MOVE R19 R4 - 0x7C480200, // 0046 CALL R18 1 - 0x78260001, // 0047 JMPF R9 #004A - 0x5C4C1200, // 0048 MOVE R19 R9 - 0x70020000, // 0049 JMP #004B - 0x584C0017, // 004A LDCONST R19 K23 - 0x5C501600, // 004B MOVE R20 R11 - 0x7C380C00, // 004C CALL R14 6 - 0x583C001C, // 004D LDCONST R15 K28 - 0x7C300600, // 004E CALL R12 3 - 0x4C300000, // 004F LDNIL R12 - 0x9012280C, // 0050 SETMBR R4 K20 R12 - 0xB8320200, // 0051 GETNGBL R12 K1 - 0x8C30191D, // 0052 GETMET R12 R12 K29 - 0x7C300200, // 0053 CALL R12 1 - 0x50340200, // 0054 LDBOOL R13 1 0 - 0x1C34140D, // 0055 EQ R13 R10 R13 - 0x74360004, // 0056 JMPT R13 #005C - 0x8834090D, // 0057 GETMBR R13 R4 K13 - 0xB83A0200, // 0058 GETNGBL R14 K1 - 0x88381D1E, // 0059 GETMBR R14 R14 K30 - 0x1C341A0E, // 005A EQ R13 R13 R14 - 0x7836002D, // 005B JMPF R13 #008A - 0xB8360200, // 005C GETNGBL R13 K1 - 0x8C341B1F, // 005D GETMET R13 R13 K31 - 0x7C340200, // 005E CALL R13 1 - 0x90321A0D, // 005F SETMBR R12 K13 R13 - 0x8834190D, // 0060 GETMBR R13 R12 K13 - 0xB83A0200, // 0061 GETNGBL R14 K1 - 0x8C381D20, // 0062 GETMET R14 R14 K32 - 0x7C380200, // 0063 CALL R14 1 - 0x9036140E, // 0064 SETMBR R13 K10 R14 - 0x8834190D, // 0065 GETMBR R13 R12 K13 - 0x88341B0A, // 0066 GETMBR R13 R13 K10 - 0x88380909, // 0067 GETMBR R14 R4 K9 - 0x9036120E, // 0068 SETMBR R13 K9 R14 - 0x8834190D, // 0069 GETMBR R13 R12 K13 - 0x88341B0A, // 006A GETMBR R13 R13 K10 - 0x8838090B, // 006B GETMBR R14 R4 K11 - 0x9036160E, // 006C SETMBR R13 K11 R14 - 0x8834190D, // 006D GETMBR R13 R12 K13 - 0x88341B0A, // 006E GETMBR R13 R13 K10 - 0x8838090C, // 006F GETMBR R14 R4 K12 - 0x9036180E, // 0070 SETMBR R13 K12 R14 - 0x8834190D, // 0071 GETMBR R13 R12 K13 - 0xB83A0200, // 0072 GETNGBL R14 K1 - 0x8C381D21, // 0073 GETMET R14 R14 K33 - 0x7C380200, // 0074 CALL R14 1 - 0x90361A0E, // 0075 SETMBR R13 K13 R14 - 0x8834190D, // 0076 GETMBR R13 R12 K13 - 0x88341B0D, // 0077 GETMBR R13 R13 K13 - 0xB83A0200, // 0078 GETNGBL R14 K1 - 0x88381D1E, // 0079 GETMBR R14 R14 K30 - 0x90361A0E, // 007A SETMBR R13 K13 R14 - 0x88340D08, // 007B GETMBR R13 R6 K8 - 0x8C341B22, // 007C GETMET R13 R13 K34 - 0x5C3C1800, // 007D MOVE R15 R12 - 0x7C340400, // 007E CALL R13 2 - 0xB8363000, // 007F GETNGBL R13 K24 - 0x8C341B14, // 0080 GETMET R13 R13 K20 - 0x8C3C0719, // 0081 GETMET R15 R3 K25 - 0x58440023, // 0082 LDCONST R17 K35 - 0x88480312, // 0083 GETMBR R18 R1 K18 - 0x8848251B, // 0084 GETMBR R18 R18 K27 - 0x884C0324, // 0085 GETMBR R19 R1 K36 - 0x7C3C0800, // 0086 CALL R15 4 - 0x5840001C, // 0087 LDCONST R16 K28 - 0x7C340600, // 0088 CALL R13 3 - 0x70020070, // 0089 JMP #00FB - 0x4C340000, // 008A LDNIL R13 - 0x2034140D, // 008B NE R13 R10 R13 - 0x78360031, // 008C JMPF R13 #00BF - 0xB8360200, // 008D GETNGBL R13 K1 - 0x8C341B25, // 008E GETMET R13 R13 K37 - 0x7C340200, // 008F CALL R13 1 - 0x9032180D, // 0090 SETMBR R12 K12 R13 - 0x8834190C, // 0091 GETMBR R13 R12 K12 - 0xB83A0200, // 0092 GETNGBL R14 K1 - 0x8C381D20, // 0093 GETMET R14 R14 K32 - 0x7C380200, // 0094 CALL R14 1 - 0x9036140E, // 0095 SETMBR R13 K10 R14 - 0x8834190C, // 0096 GETMBR R13 R12 K12 - 0x88341B0A, // 0097 GETMBR R13 R13 K10 - 0x88380909, // 0098 GETMBR R14 R4 K9 - 0x9036120E, // 0099 SETMBR R13 K9 R14 - 0x8834190C, // 009A GETMBR R13 R12 K12 - 0x88341B0A, // 009B GETMBR R13 R13 K10 - 0x8838090B, // 009C GETMBR R14 R4 K11 - 0x9036160E, // 009D SETMBR R13 K11 R14 - 0x8834190C, // 009E GETMBR R13 R12 K12 - 0x88341B0A, // 009F GETMBR R13 R13 K10 - 0x8838090C, // 00A0 GETMBR R14 R4 K12 - 0x9036180E, // 00A1 SETMBR R13 K12 R14 - 0x8834190C, // 00A2 GETMBR R13 R12 K12 - 0x9036260A, // 00A3 SETMBR R13 K19 R10 - 0x88340D08, // 00A4 GETMBR R13 R6 K8 - 0x8C341B22, // 00A5 GETMET R13 R13 K34 - 0x5C3C1800, // 00A6 MOVE R15 R12 - 0x7C340400, // 00A7 CALL R13 2 - 0xB8360200, // 00A8 GETNGBL R13 K1 - 0x8C341B0F, // 00A9 GETMET R13 R13 K15 - 0x883C090B, // 00AA GETMBR R15 R4 K11 - 0x8840090C, // 00AB GETMBR R16 R4 K12 - 0x7C340600, // 00AC CALL R13 3 - 0x5C241A00, // 00AD MOVE R9 R13 - 0xB8363000, // 00AE GETNGBL R13 K24 - 0x8C341B14, // 00AF GETMET R13 R13 K20 - 0x8C3C0719, // 00B0 GETMET R15 R3 K25 - 0x58440026, // 00B1 LDCONST R17 K38 - 0x88480312, // 00B2 GETMBR R18 R1 K18 - 0x8848251B, // 00B3 GETMBR R18 R18 K27 - 0x604C0008, // 00B4 GETGBL R19 G8 - 0x5C500800, // 00B5 MOVE R20 R4 - 0x7C4C0200, // 00B6 CALL R19 1 - 0x78260001, // 00B7 JMPF R9 #00BA - 0x5C501200, // 00B8 MOVE R20 R9 - 0x70020000, // 00B9 JMP #00BB - 0x58500017, // 00BA LDCONST R20 K23 - 0x7C3C0A00, // 00BB CALL R15 5 - 0x5840001C, // 00BC LDCONST R16 K28 - 0x7C340600, // 00BD CALL R13 3 - 0x7002003B, // 00BE JMP #00FB - 0x8834090D, // 00BF GETMBR R13 R4 K13 - 0x4C380000, // 00C0 LDNIL R14 - 0x20341A0E, // 00C1 NE R13 R13 R14 - 0x7836002D, // 00C2 JMPF R13 #00F1 - 0xB8360200, // 00C3 GETNGBL R13 K1 - 0x8C341B1F, // 00C4 GETMET R13 R13 K31 - 0x7C340200, // 00C5 CALL R13 1 - 0x90321A0D, // 00C6 SETMBR R12 K13 R13 - 0x8834190D, // 00C7 GETMBR R13 R12 K13 - 0xB83A0200, // 00C8 GETNGBL R14 K1 - 0x8C381D20, // 00C9 GETMET R14 R14 K32 - 0x7C380200, // 00CA CALL R14 1 - 0x9036140E, // 00CB SETMBR R13 K10 R14 - 0x8834190D, // 00CC GETMBR R13 R12 K13 - 0x88341B0A, // 00CD GETMBR R13 R13 K10 - 0x88380909, // 00CE GETMBR R14 R4 K9 - 0x9036120E, // 00CF SETMBR R13 K9 R14 - 0x8834190D, // 00D0 GETMBR R13 R12 K13 - 0x88341B0A, // 00D1 GETMBR R13 R13 K10 - 0x8838090B, // 00D2 GETMBR R14 R4 K11 - 0x9036160E, // 00D3 SETMBR R13 K11 R14 - 0x8834190D, // 00D4 GETMBR R13 R12 K13 - 0x88341B0A, // 00D5 GETMBR R13 R13 K10 - 0x8838090C, // 00D6 GETMBR R14 R4 K12 - 0x9036180E, // 00D7 SETMBR R13 K12 R14 - 0x8834190D, // 00D8 GETMBR R13 R12 K13 - 0xB83A0200, // 00D9 GETNGBL R14 K1 - 0x8C381D21, // 00DA GETMET R14 R14 K33 - 0x7C380200, // 00DB CALL R14 1 - 0x90361A0E, // 00DC SETMBR R13 K13 R14 - 0x8834190D, // 00DD GETMBR R13 R12 K13 - 0x88341B0D, // 00DE GETMBR R13 R13 K13 - 0x8838090D, // 00DF GETMBR R14 R4 K13 - 0x90361A0E, // 00E0 SETMBR R13 K13 R14 - 0x88340D08, // 00E1 GETMBR R13 R6 K8 - 0x8C341B22, // 00E2 GETMET R13 R13 K34 - 0x5C3C1800, // 00E3 MOVE R15 R12 - 0x7C340400, // 00E4 CALL R13 2 - 0xB8363000, // 00E5 GETNGBL R13 K24 - 0x8C341B14, // 00E6 GETMET R13 R13 K20 - 0x8C3C0719, // 00E7 GETMET R15 R3 K25 - 0x58440027, // 00E8 LDCONST R17 K39 - 0x88480312, // 00E9 GETMBR R18 R1 K18 - 0x8848251B, // 00EA GETMBR R18 R18 K27 - 0x884C090D, // 00EB GETMBR R19 R4 K13 - 0x88500324, // 00EC GETMBR R20 R1 K36 - 0x7C3C0A00, // 00ED CALL R15 5 - 0x5840001C, // 00EE LDCONST R16 K28 - 0x7C340600, // 00EF CALL R13 3 - 0x70020009, // 00F0 JMP #00FB - 0xB8363000, // 00F1 GETNGBL R13 K24 - 0x8C341B14, // 00F2 GETMET R13 R13 K20 - 0x8C3C0719, // 00F3 GETMET R15 R3 K25 - 0x58440028, // 00F4 LDCONST R17 K40 - 0x88480312, // 00F5 GETMBR R18 R1 K18 - 0x8848251B, // 00F6 GETMBR R18 R18 K27 - 0x884C0324, // 00F7 GETMBR R19 R1 K36 - 0x7C3C0800, // 00F8 CALL R15 4 - 0x5840001C, // 00F9 LDCONST R16 K28 - 0x7C340600, // 00FA CALL R13 3 - 0x7001FF1D, // 00FB JMP #001A - 0x581C0029, // 00FC LDCONST R7 K41 - 0xAC1C0200, // 00FD CATCH R7 1 0 - 0xB0080000, // 00FE RAISE 2 R0 R0 - 0x601C000C, // 00FF GETGBL R7 G12 - 0x88200D08, // 0100 GETMBR R8 R6 K8 - 0x7C1C0200, // 0101 CALL R7 1 - 0x241C0F2A, // 0102 GT R7 R7 K42 - 0x781E0004, // 0103 JMPF R7 #0109 - 0x8C1C012B, // 0104 GETMET R7 R0 K43 - 0x5C240200, // 0105 MOVE R9 R1 - 0x5C280C00, // 0106 MOVE R10 R6 - 0x7C1C0600, // 0107 CALL R7 3 - 0x70020001, // 0108 JMP #010B - 0x501C0000, // 0109 LDBOOL R7 0 0 - 0x80040E00, // 010A RET 1 R7 - 0x501C0200, // 010B LDBOOL R7 1 0 - 0x80040E00, // 010C RET 1 R7 - 0x80000000, // 010D RET 0 + 0x60280008, // 002D GETGBL R10 G8 + 0x5C2C0800, // 002E MOVE R11 R4 + 0x7C280200, // 002F CALL R10 1 + 0x882C0110, // 0030 GETMBR R11 R0 K16 + 0x8C2C1711, // 0031 GETMET R11 R11 K17 + 0x88340312, // 0032 GETMBR R13 R1 K18 + 0x88381113, // 0033 GETMBR R14 R8 K19 + 0x5C3C0800, // 0034 MOVE R15 R4 + 0x7C2C0800, // 0035 CALL R11 4 + 0x88300914, // 0036 GETMBR R12 R4 K20 + 0x4C340000, // 0037 LDNIL R13 + 0x2030180D, // 0038 NE R12 R12 R13 + 0x78320005, // 0039 JMPF R12 #0040 + 0x60300008, // 003A GETGBL R12 G8 + 0x88340914, // 003B GETMBR R13 R4 K20 + 0x7C300200, // 003C CALL R12 1 + 0x00322A0C, // 003D ADD R12 K21 R12 + 0x00301916, // 003E ADD R12 R12 K22 + 0x70020000, // 003F JMP #0041 + 0x58300017, // 0040 LDCONST R12 K23 + 0xB8363000, // 0041 GETNGBL R13 K24 + 0x8C341B14, // 0042 GETMET R13 R13 K20 + 0x8C3C0719, // 0043 GETMET R15 R3 K25 + 0x5844001A, // 0044 LDCONST R17 K26 + 0x88480312, // 0045 GETMBR R18 R1 K18 + 0x8848251B, // 0046 GETMBR R18 R18 K27 + 0x5C4C1400, // 0047 MOVE R19 R10 + 0x78260001, // 0048 JMPF R9 #004B + 0x5C501200, // 0049 MOVE R20 R9 + 0x70020000, // 004A JMP #004C + 0x58500017, // 004B LDCONST R20 K23 + 0x5C541800, // 004C MOVE R21 R12 + 0x7C3C0C00, // 004D CALL R15 6 + 0x5840001C, // 004E LDCONST R16 K28 + 0x7C340600, // 004F CALL R13 3 + 0x4C340000, // 0050 LDNIL R13 + 0x9012280D, // 0051 SETMBR R4 K20 R13 + 0xB8360200, // 0052 GETNGBL R13 K1 + 0x8C341B1D, // 0053 GETMET R13 R13 K29 + 0x7C340200, // 0054 CALL R13 1 + 0x50380200, // 0055 LDBOOL R14 1 0 + 0x1C38160E, // 0056 EQ R14 R11 R14 + 0x743A0004, // 0057 JMPT R14 #005D + 0x8838090D, // 0058 GETMBR R14 R4 K13 + 0xB83E0200, // 0059 GETNGBL R15 K1 + 0x883C1F1E, // 005A GETMBR R15 R15 K30 + 0x1C381C0F, // 005B EQ R14 R14 R15 + 0x783A002D, // 005C JMPF R14 #008B + 0xB83A0200, // 005D GETNGBL R14 K1 + 0x8C381D1F, // 005E GETMET R14 R14 K31 + 0x7C380200, // 005F CALL R14 1 + 0x90361A0E, // 0060 SETMBR R13 K13 R14 + 0x88381B0D, // 0061 GETMBR R14 R13 K13 + 0xB83E0200, // 0062 GETNGBL R15 K1 + 0x8C3C1F20, // 0063 GETMET R15 R15 K32 + 0x7C3C0200, // 0064 CALL R15 1 + 0x903A140F, // 0065 SETMBR R14 K10 R15 + 0x88381B0D, // 0066 GETMBR R14 R13 K13 + 0x88381D0A, // 0067 GETMBR R14 R14 K10 + 0x883C0909, // 0068 GETMBR R15 R4 K9 + 0x903A120F, // 0069 SETMBR R14 K9 R15 + 0x88381B0D, // 006A GETMBR R14 R13 K13 + 0x88381D0A, // 006B GETMBR R14 R14 K10 + 0x883C090B, // 006C GETMBR R15 R4 K11 + 0x903A160F, // 006D SETMBR R14 K11 R15 + 0x88381B0D, // 006E GETMBR R14 R13 K13 + 0x88381D0A, // 006F GETMBR R14 R14 K10 + 0x883C090C, // 0070 GETMBR R15 R4 K12 + 0x903A180F, // 0071 SETMBR R14 K12 R15 + 0x88381B0D, // 0072 GETMBR R14 R13 K13 + 0xB83E0200, // 0073 GETNGBL R15 K1 + 0x8C3C1F21, // 0074 GETMET R15 R15 K33 + 0x7C3C0200, // 0075 CALL R15 1 + 0x903A1A0F, // 0076 SETMBR R14 K13 R15 + 0x88381B0D, // 0077 GETMBR R14 R13 K13 + 0x88381D0D, // 0078 GETMBR R14 R14 K13 + 0xB83E0200, // 0079 GETNGBL R15 K1 + 0x883C1F1E, // 007A GETMBR R15 R15 K30 + 0x903A1A0F, // 007B SETMBR R14 K13 R15 + 0x88380D08, // 007C GETMBR R14 R6 K8 + 0x8C381D22, // 007D GETMET R14 R14 K34 + 0x5C401A00, // 007E MOVE R16 R13 + 0x7C380400, // 007F CALL R14 2 + 0xB83A3000, // 0080 GETNGBL R14 K24 + 0x8C381D14, // 0081 GETMET R14 R14 K20 + 0x8C400719, // 0082 GETMET R16 R3 K25 + 0x58480023, // 0083 LDCONST R18 K35 + 0x884C0312, // 0084 GETMBR R19 R1 K18 + 0x884C271B, // 0085 GETMBR R19 R19 K27 + 0x88500324, // 0086 GETMBR R20 R1 K36 + 0x7C400800, // 0087 CALL R16 4 + 0x5844001C, // 0088 LDCONST R17 K28 + 0x7C380600, // 0089 CALL R14 3 + 0x70020070, // 008A JMP #00FC + 0x4C380000, // 008B LDNIL R14 + 0x2038160E, // 008C NE R14 R11 R14 + 0x783A0031, // 008D JMPF R14 #00C0 + 0xB83A0200, // 008E GETNGBL R14 K1 + 0x8C381D25, // 008F GETMET R14 R14 K37 + 0x7C380200, // 0090 CALL R14 1 + 0x9036180E, // 0091 SETMBR R13 K12 R14 + 0x88381B0C, // 0092 GETMBR R14 R13 K12 + 0xB83E0200, // 0093 GETNGBL R15 K1 + 0x8C3C1F20, // 0094 GETMET R15 R15 K32 + 0x7C3C0200, // 0095 CALL R15 1 + 0x903A140F, // 0096 SETMBR R14 K10 R15 + 0x88381B0C, // 0097 GETMBR R14 R13 K12 + 0x88381D0A, // 0098 GETMBR R14 R14 K10 + 0x883C0909, // 0099 GETMBR R15 R4 K9 + 0x903A120F, // 009A SETMBR R14 K9 R15 + 0x88381B0C, // 009B GETMBR R14 R13 K12 + 0x88381D0A, // 009C GETMBR R14 R14 K10 + 0x883C090B, // 009D GETMBR R15 R4 K11 + 0x903A160F, // 009E SETMBR R14 K11 R15 + 0x88381B0C, // 009F GETMBR R14 R13 K12 + 0x88381D0A, // 00A0 GETMBR R14 R14 K10 + 0x883C090C, // 00A1 GETMBR R15 R4 K12 + 0x903A180F, // 00A2 SETMBR R14 K12 R15 + 0x88381B0C, // 00A3 GETMBR R14 R13 K12 + 0x903A260B, // 00A4 SETMBR R14 K19 R11 + 0x88380D08, // 00A5 GETMBR R14 R6 K8 + 0x8C381D22, // 00A6 GETMET R14 R14 K34 + 0x5C401A00, // 00A7 MOVE R16 R13 + 0x7C380400, // 00A8 CALL R14 2 + 0xB83A0200, // 00A9 GETNGBL R14 K1 + 0x8C381D0F, // 00AA GETMET R14 R14 K15 + 0x8840090B, // 00AB GETMBR R16 R4 K11 + 0x8844090C, // 00AC GETMBR R17 R4 K12 + 0x7C380600, // 00AD CALL R14 3 + 0x5C241C00, // 00AE MOVE R9 R14 + 0xB83A3000, // 00AF GETNGBL R14 K24 + 0x8C381D14, // 00B0 GETMET R14 R14 K20 + 0x8C400719, // 00B1 GETMET R16 R3 K25 + 0x58480026, // 00B2 LDCONST R18 K38 + 0x884C0312, // 00B3 GETMBR R19 R1 K18 + 0x884C271B, // 00B4 GETMBR R19 R19 K27 + 0x60500008, // 00B5 GETGBL R20 G8 + 0x5C540800, // 00B6 MOVE R21 R4 + 0x7C500200, // 00B7 CALL R20 1 + 0x78260001, // 00B8 JMPF R9 #00BB + 0x5C541200, // 00B9 MOVE R21 R9 + 0x70020000, // 00BA JMP #00BC + 0x58540017, // 00BB LDCONST R21 K23 + 0x7C400A00, // 00BC CALL R16 5 + 0x5844001C, // 00BD LDCONST R17 K28 + 0x7C380600, // 00BE CALL R14 3 + 0x7002003B, // 00BF JMP #00FC + 0x8838090D, // 00C0 GETMBR R14 R4 K13 + 0x4C3C0000, // 00C1 LDNIL R15 + 0x20381C0F, // 00C2 NE R14 R14 R15 + 0x783A002D, // 00C3 JMPF R14 #00F2 + 0xB83A0200, // 00C4 GETNGBL R14 K1 + 0x8C381D1F, // 00C5 GETMET R14 R14 K31 + 0x7C380200, // 00C6 CALL R14 1 + 0x90361A0E, // 00C7 SETMBR R13 K13 R14 + 0x88381B0D, // 00C8 GETMBR R14 R13 K13 + 0xB83E0200, // 00C9 GETNGBL R15 K1 + 0x8C3C1F20, // 00CA GETMET R15 R15 K32 + 0x7C3C0200, // 00CB CALL R15 1 + 0x903A140F, // 00CC SETMBR R14 K10 R15 + 0x88381B0D, // 00CD GETMBR R14 R13 K13 + 0x88381D0A, // 00CE GETMBR R14 R14 K10 + 0x883C0909, // 00CF GETMBR R15 R4 K9 + 0x903A120F, // 00D0 SETMBR R14 K9 R15 + 0x88381B0D, // 00D1 GETMBR R14 R13 K13 + 0x88381D0A, // 00D2 GETMBR R14 R14 K10 + 0x883C090B, // 00D3 GETMBR R15 R4 K11 + 0x903A160F, // 00D4 SETMBR R14 K11 R15 + 0x88381B0D, // 00D5 GETMBR R14 R13 K13 + 0x88381D0A, // 00D6 GETMBR R14 R14 K10 + 0x883C090C, // 00D7 GETMBR R15 R4 K12 + 0x903A180F, // 00D8 SETMBR R14 K12 R15 + 0x88381B0D, // 00D9 GETMBR R14 R13 K13 + 0xB83E0200, // 00DA GETNGBL R15 K1 + 0x8C3C1F21, // 00DB GETMET R15 R15 K33 + 0x7C3C0200, // 00DC CALL R15 1 + 0x903A1A0F, // 00DD SETMBR R14 K13 R15 + 0x88381B0D, // 00DE GETMBR R14 R13 K13 + 0x88381D0D, // 00DF GETMBR R14 R14 K13 + 0x883C090D, // 00E0 GETMBR R15 R4 K13 + 0x903A1A0F, // 00E1 SETMBR R14 K13 R15 + 0x88380D08, // 00E2 GETMBR R14 R6 K8 + 0x8C381D22, // 00E3 GETMET R14 R14 K34 + 0x5C401A00, // 00E4 MOVE R16 R13 + 0x7C380400, // 00E5 CALL R14 2 + 0xB83A3000, // 00E6 GETNGBL R14 K24 + 0x8C381D14, // 00E7 GETMET R14 R14 K20 + 0x8C400719, // 00E8 GETMET R16 R3 K25 + 0x58480027, // 00E9 LDCONST R18 K39 + 0x884C0312, // 00EA GETMBR R19 R1 K18 + 0x884C271B, // 00EB GETMBR R19 R19 K27 + 0x8850090D, // 00EC GETMBR R20 R4 K13 + 0x88540324, // 00ED GETMBR R21 R1 K36 + 0x7C400A00, // 00EE CALL R16 5 + 0x5844001C, // 00EF LDCONST R17 K28 + 0x7C380600, // 00F0 CALL R14 3 + 0x70020009, // 00F1 JMP #00FC + 0xB83A3000, // 00F2 GETNGBL R14 K24 + 0x8C381D14, // 00F3 GETMET R14 R14 K20 + 0x8C400719, // 00F4 GETMET R16 R3 K25 + 0x58480028, // 00F5 LDCONST R18 K40 + 0x884C0312, // 00F6 GETMBR R19 R1 K18 + 0x884C271B, // 00F7 GETMBR R19 R19 K27 + 0x88500324, // 00F8 GETMBR R20 R1 K36 + 0x7C400800, // 00F9 CALL R16 4 + 0x5844001C, // 00FA LDCONST R17 K28 + 0x7C380600, // 00FB CALL R14 3 + 0x7001FF1C, // 00FC JMP #001A + 0x581C0029, // 00FD LDCONST R7 K41 + 0xAC1C0200, // 00FE CATCH R7 1 0 + 0xB0080000, // 00FF RAISE 2 R0 R0 + 0x601C000C, // 0100 GETGBL R7 G12 + 0x88200D08, // 0101 GETMBR R8 R6 K8 + 0x7C1C0200, // 0102 CALL R7 1 + 0x241C0F2A, // 0103 GT R7 R7 K42 + 0x781E0004, // 0104 JMPF R7 #010A + 0x8C1C012B, // 0105 GETMET R7 R0 K43 + 0x5C240200, // 0106 MOVE R9 R1 + 0x5C280C00, // 0107 MOVE R10 R6 + 0x7C1C0600, // 0108 CALL R7 3 + 0x70020001, // 0109 JMP #010C + 0x501C0000, // 010A LDBOOL R7 0 0 + 0x80040E00, // 010B RET 1 R7 + 0x501C0200, // 010C LDBOOL R7 1 0 + 0x80040E00, // 010D RET 1 R7 + 0x80000000, // 010E RET 0 }) ) ); diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Root.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Root.h index 2e52225b9..54565ec7f 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Root.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Root.h @@ -1183,7 +1183,7 @@ be_local_closure(Matter_Plugin_Root_read_attribute, /* name */ ********************************************************************/ be_local_closure(Matter_Plugin_Root_invoke_request, /* name */ be_nested_proto( - 29, /* nstack */ + 31, /* nstack */ 4, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -1219,7 +1219,7 @@ be_local_closure(Matter_Plugin_Root_invoke_request, /* name */ ), }), 1, /* has constants */ - ( &(const bvalue[100]) { /* constants */ + ( &(const bvalue[107]) { /* constants */ /* K0 */ be_nested_str_weak(crypto), /* K1 */ be_nested_str_weak(string), /* K2 */ be_nested_str_weak(matter), @@ -1238,92 +1238,99 @@ be_local_closure(Matter_Plugin_Root_invoke_request, /* name */ /* K15 */ be_const_int(2), /* K16 */ be_nested_str_weak(XX), /* K17 */ be_const_int(3), - /* K18 */ be_nested_str_weak(fabric_completed), - /* K19 */ be_nested_str_weak(set_no_expiration), - /* K20 */ be_nested_str_weak(save), - /* K21 */ be_nested_str_weak(device), - /* K22 */ be_nested_str_weak(start_commissioning_complete_deferred), - /* K23 */ be_nested_str_weak(status), - /* K24 */ be_nested_str_weak(UNSUPPORTED_COMMAND), - /* K25 */ be_nested_str_weak(B2), - /* K26 */ be_nested_str_weak(DAC_Cert_FFF1_8000), - /* K27 */ be_nested_str_weak(PAI_Cert_FFF1), - /* K28 */ be_nested_str_weak(CD_FFF1_8000), - /* K29 */ be_nested_str_weak(B1), - /* K30 */ be_nested_str_weak(U4), - /* K31 */ be_nested_str_weak(tasmota), - /* K32 */ be_nested_str_weak(rtc), - /* K33 */ be_nested_str_weak(utc), - /* K34 */ be_nested_str_weak(tlv2raw), - /* K35 */ be_nested_str_weak(get_ac), - /* K36 */ be_nested_str_weak(log), - /* K37 */ be_nested_str_weak(MTR_X3A_X20attestation_tbs_X3D), - /* K38 */ be_nested_str_weak(tohex), - /* K39 */ be_nested_str_weak(EC_P256), - /* K40 */ be_nested_str_weak(ecdsa_sign_sha256), - /* K41 */ be_nested_str_weak(DAC_Priv_FFF1_8000), - /* K42 */ be_nested_str_weak(gen_CSR), - /* K43 */ be_nested_str_weak(MTR_X3A_X20nocsr_tbs_X3D), - /* K44 */ be_nested_str_weak(set_ca), - /* K45 */ be_nested_str_weak(MTR_X3A_X20received_X20ca_root_X3D), - /* K46 */ be_nested_str_weak(SUCCESS), - /* K47 */ be_nested_str_weak(get_ca), - /* K48 */ be_nested_str_weak(MTR_X3A_X20Error_X3A_X20AdNOC_X20without_X20CA), - /* K49 */ be_nested_str_weak(set_noc), - /* K50 */ be_nested_str_weak(set_ipk_epoch_key), - /* K51 */ be_nested_str_weak(set_admin_subject_vendor), - /* K52 */ be_nested_str_weak(parse), - /* K53 */ be_nested_str_weak(findsub), - /* K54 */ be_nested_str_weak(MTR_X3A_X20Error_X3A_X20no_X20fabricid_X20nor_X20deviceid_X20in_X20NOC_X20certificate), - /* K55 */ be_nested_str_weak(int), - /* K56 */ be_nested_str_weak(int64), - /* K57 */ be_nested_str_weak(fromu32), - /* K58 */ be_nested_str_weak(tobytes), - /* K59 */ be_const_int(2147483647), - /* K60 */ be_nested_str_weak(fromstring), - /* K61 */ be_nested_str_weak(CompressedFabric), - /* K62 */ be_nested_str_weak(HKDF_SHA256), - /* K63 */ be_nested_str_weak(copy), - /* K64 */ be_nested_str_weak(reverse), - /* K65 */ be_nested_str_weak(derive), - /* K66 */ be_nested_str_weak(set_fabric_device), - /* K67 */ be_nested_str_weak(commissioning_admin_fabric), - /* K68 */ be_nested_str_weak(persist_to_fabric), - /* K69 */ be_nested_str_weak(fabric_candidate), - /* K70 */ be_nested_str_weak(start_operational_discovery_deferred), - /* K71 */ be_nested_str_weak(MTR_X3A_X20_X2D_X2D_X2D_X2D_X2D_X2D_X2D_X2D_X2D_X2D_X2D_X2D_X2D_X2D_X2D_X2D_X2D_X2D_X2D_X2D_X2D_X2D_X2D_X2D_X2D_X2D_X2D_X2D_X2D_X2D_X2D_X2D_X2D_X2D_X2D_X2D_X2D_X2D_X2D_X2D_X2D_X2D), - /* K72 */ be_nested_str_weak(MTR_X3A_X20fabric_X3D), - /* K73 */ be_nested_str_weak(inspect), - /* K74 */ be_nested_str_weak(_fabric), - /* K75 */ be_nested_str_weak(log_new_fabric), - /* K76 */ be_nested_str_weak(set_fabric_label), - /* K77 */ be_nested_str_weak(format), - /* K78 */ be_nested_str_weak(MTR_X3A_X20_X2E_X20_X20_X20_X20_X20_X20_X20_X20_X20_X20Update_X20fabric_X20_X27_X25s_X27_X20label_X3D_X27_X25s_X27), - /* K79 */ be_nested_str_weak(get_fabric_id), - /* K80 */ be_nested_str_weak(fabric_index_X3A), - /* K81 */ be_nested_str_weak(sessions), - /* K82 */ be_nested_str_weak(active_fabrics), - /* K83 */ be_nested_str_weak(get_fabric_index), - /* K84 */ be_nested_str_weak(MTR_X3A_X20removing_X20fabric_X20), - /* K85 */ be_nested_str_weak(set_timer), - /* K86 */ be_nested_str_weak(stop_iteration), - /* K87 */ be_nested_str_weak(MTR_X3A_X20RemoveFabric_X20fabric_X28), - /* K88 */ be_nested_str_weak(_X29_X20not_X20found), - /* K89 */ be_nested_str_weak(INVALID_ACTION), - /* K90 */ be_nested_str_weak(MTR_X3A_X20OpenCommissioningWindow_X28timeout_X3D_X25i_X2C_X20passcode_X3D_X25s_X2C_X20discriminator_X3D_X25i_X2C_X20iterations_X3D_X25i_X2C_X20salt_X3D_X25s_X29), - /* K91 */ be_nested_str_weak(INVALID_DATA_TYPE), - /* K92 */ be_nested_str_weak(MTR_X3A_X20wrong_X20size_X20for_X20PAKE_X20parameters), - /* K93 */ be_nested_str_weak(CONSTRAINT_ERROR), - /* K94 */ be_nested_str_weak(start_basic_commissioning), - /* K95 */ be_nested_str_weak(get_fabric), - /* K96 */ be_nested_str_weak(MTR_X3A_X20OpenBasicCommissioningWindow_X20commissioning_timeout_X3D), - /* K97 */ be_nested_str_weak(start_root_basic_commissioning), - /* K98 */ be_nested_str_weak(stop_basic_commissioning), - /* K99 */ be_nested_str_weak(invoke_request), + /* K18 */ be_nested_str_weak(_fabric), + /* K19 */ be_nested_str_weak(fabric_completed), + /* K20 */ be_nested_str_weak(set_no_expiration), + /* K21 */ be_nested_str_weak(save), + /* K22 */ be_nested_str_weak(device), + /* K23 */ be_nested_str_weak(start_commissioning_complete_deferred), + /* K24 */ be_nested_str_weak(context_error), + /* K25 */ be_nested_str_weak(CommissioningComplete_X3A_X20no_X20fabric_X20attached), + /* K26 */ be_nested_str_weak(status), + /* K27 */ be_nested_str_weak(UNSUPPORTED_COMMAND), + /* K28 */ be_nested_str_weak(B2), + /* K29 */ be_nested_str_weak(DAC_Cert_FFF1_8000), + /* K30 */ be_nested_str_weak(PAI_Cert_FFF1), + /* K31 */ be_nested_str_weak(CD_FFF1_8000), + /* K32 */ be_nested_str_weak(B1), + /* K33 */ be_nested_str_weak(U4), + /* K34 */ be_nested_str_weak(tasmota), + /* K35 */ be_nested_str_weak(rtc), + /* K36 */ be_nested_str_weak(utc), + /* K37 */ be_nested_str_weak(tlv2raw), + /* K38 */ be_nested_str_weak(get_ac), + /* K39 */ be_nested_str_weak(log), + /* K40 */ be_nested_str_weak(MTR_X3A_X20attestation_tbs_X3D), + /* K41 */ be_nested_str_weak(tohex), + /* K42 */ be_nested_str_weak(EC_P256), + /* K43 */ be_nested_str_weak(ecdsa_sign_sha256), + /* K44 */ be_nested_str_weak(DAC_Priv_FFF1_8000), + /* K45 */ be_nested_str_weak(format), + /* K46 */ be_nested_str_weak(MTR_X3A_X20CSRRequest_X20CSRNonce_X3D_X25s_X20IsForUpdateNOC_X3D_X25s), + /* K47 */ be_nested_str_weak(gen_CSR), + /* K48 */ be_nested_str_weak(MTR_X3A_X20nocsr_tbs_X3D), + /* K49 */ be_nested_str_weak(set_temp_ca), + /* K50 */ be_nested_str_weak(MTR_X3A_X20received_X20ca_root_X3D), + /* K51 */ be_nested_str_weak(SUCCESS), + /* K52 */ be_nested_str_weak(MTR_X3A_X20AddNoc_X20Args_X3D), + /* K53 */ be_nested_str_weak(get_temp_ca), + /* K54 */ be_nested_str_weak(MTR_X3A_X20Error_X3A_X20AdNOC_X20without_X20CA), + /* K55 */ be_nested_str_weak(sessions), + /* K56 */ be_nested_str_weak(create_fabric), + /* K57 */ be_nested_str_weak(set_ca), + /* K58 */ be_nested_str_weak(set_noc_icac), + /* K59 */ be_nested_str_weak(set_ipk_epoch_key), + /* K60 */ be_nested_str_weak(set_admin_subject_vendor), + /* K61 */ be_nested_str_weak(set_pk), + /* K62 */ be_nested_str_weak(get_pk), + /* K63 */ be_nested_str_weak(parse), + /* K64 */ be_nested_str_weak(findsub), + /* K65 */ be_nested_str_weak(MTR_X3A_X20Error_X3A_X20no_X20fabricid_X20nor_X20deviceid_X20in_X20NOC_X20certificate), + /* K66 */ be_nested_str_weak(int), + /* K67 */ be_nested_str_weak(int64), + /* K68 */ be_nested_str_weak(fromu32), + /* K69 */ be_nested_str_weak(tobytes), + /* K70 */ be_nested_str_weak(get_temp_ca_pub), + /* K71 */ be_const_int(2147483647), + /* K72 */ be_nested_str_weak(fromstring), + /* K73 */ be_nested_str_weak(CompressedFabric), + /* K74 */ be_nested_str_weak(HKDF_SHA256), + /* K75 */ be_nested_str_weak(copy), + /* K76 */ be_nested_str_weak(reverse), + /* K77 */ be_nested_str_weak(derive), + /* K78 */ be_nested_str_weak(commissioning_admin_fabric), + /* K79 */ be_nested_str_weak(set_fabric_device), + /* K80 */ be_nested_str_weak(fabric_candidate), + /* K81 */ be_nested_str_weak(start_operational_discovery_deferred), + /* K82 */ be_nested_str_weak(is_PASE), + /* K83 */ be_nested_str_weak(set_expire_in_seconds), + /* K84 */ be_nested_str_weak(log_new_fabric), + /* K85 */ be_nested_str_weak(set_fabric_label), + /* K86 */ be_nested_str_weak(MTR_X3A_X20_X2E_X20_X20_X20_X20_X20_X20_X20_X20_X20_X20Update_X20fabric_X20_X27_X25s_X27_X20label_X3D_X27_X25s_X27), + /* K87 */ be_nested_str_weak(get_fabric_id), + /* K88 */ be_nested_str_weak(fabric_index_X3A), + /* K89 */ be_nested_str_weak(active_fabrics), + /* K90 */ be_nested_str_weak(get_fabric_index), + /* K91 */ be_nested_str_weak(MTR_X3A_X20removing_X20fabric_X20), + /* K92 */ be_nested_str_weak(set_timer), + /* K93 */ be_nested_str_weak(stop_iteration), + /* K94 */ be_nested_str_weak(MTR_X3A_X20RemoveFabric_X20fabric_X28), + /* K95 */ be_nested_str_weak(_X29_X20not_X20found), + /* K96 */ be_nested_str_weak(INVALID_ACTION), + /* K97 */ be_nested_str_weak(MTR_X3A_X20OpenCommissioningWindow_X28timeout_X3D_X25i_X2C_X20passcode_X3D_X25s_X2C_X20discriminator_X3D_X25i_X2C_X20iterations_X3D_X25i_X2C_X20salt_X3D_X25s_X29), + /* K98 */ be_nested_str_weak(INVALID_DATA_TYPE), + /* K99 */ be_nested_str_weak(MTR_X3A_X20wrong_X20size_X20for_X20PAKE_X20parameters), + /* K100 */ be_nested_str_weak(CONSTRAINT_ERROR), + /* K101 */ be_nested_str_weak(start_basic_commissioning), + /* K102 */ be_nested_str_weak(get_fabric), + /* K103 */ be_nested_str_weak(MTR_X3A_X20OpenBasicCommissioningWindow_X20commissioning_timeout_X3D), + /* K104 */ be_nested_str_weak(start_root_basic_commissioning), + /* K105 */ be_nested_str_weak(stop_basic_commissioning), + /* K106 */ be_nested_str_weak(invoke_request), }), be_str_weak(invoke_request), &be_const_str_solidified, - ( &(const binstruction[735]) { /* code */ + ( &(const binstruction[755]) { /* code */ 0xA4120000, // 0000 IMPORT R4 K0 0xA4160200, // 0001 IMPORT R5 K1 0xB81A0400, // 0002 GETNGBL R6 K2 @@ -1332,7 +1339,7 @@ be_local_closure(Matter_Plugin_Root_invoke_request, /* name */ 0x88200705, // 0005 GETMBR R8 R3 K5 0x5426002F, // 0006 LDINT R9 48 0x1C240E09, // 0007 EQ R9 R7 R9 - 0x78260054, // 0008 JMPF R9 #005E + 0x78260059, // 0008 JMPF R9 #0063 0x1C241106, // 0009 EQ R9 R8 K6 0x78260017, // 000A JMPF R9 #0023 0x8C240507, // 000B GETMET R9 R2 K7 @@ -1358,7 +1365,7 @@ be_local_closure(Matter_Plugin_Root_invoke_request, /* name */ 0x7C300800, // 001F CALL R12 4 0x900E0B08, // 0020 SETMBR R3 K5 K8 0x80041600, // 0021 RET 1 R11 - 0x70020039, // 0022 JMP #005D + 0x7002003E, // 0022 JMP #0062 0x1C24110F, // 0023 EQ R9 R8 K15 0x7826001A, // 0024 JMPF R9 #0040 0x8C240507, // 0025 GETMET R9 R2 K7 @@ -1387,678 +1394,698 @@ be_local_closure(Matter_Plugin_Root_invoke_request, /* name */ 0x7C340800, // 003C CALL R13 4 0x900E0B11, // 003D SETMBR R3 K5 K17 0x80041800, // 003E RET 1 R12 - 0x7002001C, // 003F JMP #005D + 0x70020021, // 003F JMP #0062 0x54260003, // 0040 LDINT R9 4 0x1C241009, // 0041 EQ R9 R8 R9 - 0x78260019, // 0042 JMPF R9 #005D - 0x90061306, // 0043 SETMBR R1 K9 K6 - 0x8C240312, // 0044 GETMET R9 R1 K18 - 0x7C240200, // 0045 CALL R9 1 - 0x8C240313, // 0046 GETMET R9 R1 K19 - 0x7C240200, // 0047 CALL R9 1 - 0x8C240314, // 0048 GETMET R9 R1 K20 - 0x7C240200, // 0049 CALL R9 1 - 0x8C240D0A, // 004A GETMET R9 R6 K10 - 0x7C240200, // 004B CALL R9 1 - 0x8C28130B, // 004C GETMET R10 R9 K11 - 0x58300006, // 004D LDCONST R12 K6 - 0x88340D0C, // 004E GETMBR R13 R6 K12 - 0x58380006, // 004F LDCONST R14 K6 - 0x7C280800, // 0050 CALL R10 4 - 0x8C28130B, // 0051 GETMET R10 R9 K11 - 0x58300008, // 0052 LDCONST R12 K8 - 0x88340D0D, // 0053 GETMBR R13 R6 K13 - 0x5838000E, // 0054 LDCONST R14 K14 - 0x7C280800, // 0055 CALL R10 4 - 0x542A0004, // 0056 LDINT R10 5 - 0x900E0A0A, // 0057 SETMBR R3 K5 R10 - 0x88280115, // 0058 GETMBR R10 R0 K21 - 0x8C281516, // 0059 GETMET R10 R10 K22 - 0x5C300200, // 005A MOVE R12 R1 - 0x7C280400, // 005B CALL R10 2 - 0x80041200, // 005C RET 1 R9 - 0x7002027E, // 005D JMP #02DD - 0x5426003D, // 005E LDINT R9 62 - 0x1C240E09, // 005F EQ R9 R7 R9 - 0x782601E0, // 0060 JMPF R9 #0242 - 0x1C24110F, // 0061 EQ R9 R8 K15 - 0x7826001D, // 0062 JMPF R9 #0081 - 0x8C240507, // 0063 GETMET R9 R2 K7 - 0x582C0006, // 0064 LDCONST R11 K6 - 0x7C240400, // 0065 CALL R9 2 - 0x20281308, // 0066 NE R10 R9 K8 - 0x782A0006, // 0067 JMPF R10 #006F - 0x2028130F, // 0068 NE R10 R9 K15 - 0x782A0004, // 0069 JMPF R10 #006F - 0xB82A0400, // 006A GETNGBL R10 K2 - 0x88281518, // 006B GETMBR R10 R10 K24 - 0x900E2E0A, // 006C SETMBR R3 K23 R10 - 0x4C280000, // 006D LDNIL R10 - 0x80041400, // 006E RET 1 R10 - 0x8C280D0A, // 006F GETMET R10 R6 K10 - 0x7C280200, // 0070 CALL R10 1 - 0x8C2C150B, // 0071 GETMET R11 R10 K11 - 0x58340006, // 0072 LDCONST R13 K6 - 0x88380D19, // 0073 GETMBR R14 R6 K25 - 0x1C3C1308, // 0074 EQ R15 R9 K8 - 0x783E0003, // 0075 JMPF R15 #007A - 0xB83E0400, // 0076 GETNGBL R15 K2 - 0x8C3C1F1A, // 0077 GETMET R15 R15 K26 - 0x7C3C0200, // 0078 CALL R15 1 - 0x70020002, // 0079 JMP #007D - 0xB83E0400, // 007A GETNGBL R15 K2 - 0x8C3C1F1B, // 007B GETMET R15 R15 K27 - 0x7C3C0200, // 007C CALL R15 1 - 0x7C2C0800, // 007D CALL R11 4 - 0x900E0B11, // 007E SETMBR R3 K5 K17 - 0x80041400, // 007F RET 1 R10 - 0x700201BF, // 0080 JMP #0241 - 0x1C241106, // 0081 EQ R9 R8 K6 - 0x78260044, // 0082 JMPF R9 #00C8 - 0x8C240507, // 0083 GETMET R9 R2 K7 - 0x582C0006, // 0084 LDCONST R11 K6 - 0x7C240400, // 0085 CALL R9 2 - 0x6028000C, // 0086 GETGBL R10 G12 - 0x5C2C1200, // 0087 MOVE R11 R9 - 0x7C280200, // 0088 CALL R10 1 - 0x542E001F, // 0089 LDINT R11 32 - 0x2028140B, // 008A NE R10 R10 R11 - 0x782A0001, // 008B JMPF R10 #008E - 0x4C280000, // 008C LDNIL R10 - 0x80041400, // 008D RET 1 R10 - 0x900E0B08, // 008E SETMBR R3 K5 K8 - 0x8C280D0A, // 008F GETMET R10 R6 K10 - 0x7C280200, // 0090 CALL R10 1 - 0x8C2C150B, // 0091 GETMET R11 R10 K11 - 0x58340008, // 0092 LDCONST R13 K8 - 0x88380D19, // 0093 GETMBR R14 R6 K25 - 0xB83E0400, // 0094 GETNGBL R15 K2 - 0x8C3C1F1C, // 0095 GETMET R15 R15 K28 - 0x7C3C0200, // 0096 CALL R15 1 - 0x7C2C0800, // 0097 CALL R11 4 - 0x8C2C150B, // 0098 GETMET R11 R10 K11 - 0x5834000F, // 0099 LDCONST R13 K15 - 0x88380D1D, // 009A GETMBR R14 R6 K29 - 0x5C3C1200, // 009B MOVE R15 R9 + 0x7826001E, // 0042 JMPF R9 #0062 + 0x88240312, // 0043 GETMBR R9 R1 K18 + 0x7826001B, // 0044 JMPF R9 #0061 + 0x90061306, // 0045 SETMBR R1 K9 K6 + 0x88240312, // 0046 GETMBR R9 R1 K18 + 0x8C241313, // 0047 GETMET R9 R9 K19 + 0x7C240200, // 0048 CALL R9 1 + 0x8C240314, // 0049 GETMET R9 R1 K20 + 0x7C240200, // 004A CALL R9 1 + 0x8C240315, // 004B GETMET R9 R1 K21 + 0x7C240200, // 004C CALL R9 1 + 0x8C240D0A, // 004D GETMET R9 R6 K10 + 0x7C240200, // 004E CALL R9 1 + 0x8C28130B, // 004F GETMET R10 R9 K11 + 0x58300006, // 0050 LDCONST R12 K6 + 0x88340D0C, // 0051 GETMBR R13 R6 K12 + 0x58380006, // 0052 LDCONST R14 K6 + 0x7C280800, // 0053 CALL R10 4 + 0x8C28130B, // 0054 GETMET R10 R9 K11 + 0x58300008, // 0055 LDCONST R12 K8 + 0x88340D0D, // 0056 GETMBR R13 R6 K13 + 0x5838000E, // 0057 LDCONST R14 K14 + 0x7C280800, // 0058 CALL R10 4 + 0x542A0004, // 0059 LDINT R10 5 + 0x900E0A0A, // 005A SETMBR R3 K5 R10 + 0x88280116, // 005B GETMBR R10 R0 K22 + 0x8C281517, // 005C GETMET R10 R10 K23 + 0x5C300200, // 005D MOVE R12 R1 + 0x7C280400, // 005E CALL R10 2 + 0x80041200, // 005F RET 1 R9 + 0x70020000, // 0060 JMP #0062 + 0xB0063119, // 0061 RAISE 1 K24 K25 + 0x7002028D, // 0062 JMP #02F1 + 0x5426003D, // 0063 LDINT R9 62 + 0x1C240E09, // 0064 EQ R9 R7 R9 + 0x782601EF, // 0065 JMPF R9 #0256 + 0x1C24110F, // 0066 EQ R9 R8 K15 + 0x7826001D, // 0067 JMPF R9 #0086 + 0x8C240507, // 0068 GETMET R9 R2 K7 + 0x582C0006, // 0069 LDCONST R11 K6 + 0x7C240400, // 006A CALL R9 2 + 0x20281308, // 006B NE R10 R9 K8 + 0x782A0006, // 006C JMPF R10 #0074 + 0x2028130F, // 006D NE R10 R9 K15 + 0x782A0004, // 006E JMPF R10 #0074 + 0xB82A0400, // 006F GETNGBL R10 K2 + 0x8828151B, // 0070 GETMBR R10 R10 K27 + 0x900E340A, // 0071 SETMBR R3 K26 R10 + 0x4C280000, // 0072 LDNIL R10 + 0x80041400, // 0073 RET 1 R10 + 0x8C280D0A, // 0074 GETMET R10 R6 K10 + 0x7C280200, // 0075 CALL R10 1 + 0x8C2C150B, // 0076 GETMET R11 R10 K11 + 0x58340006, // 0077 LDCONST R13 K6 + 0x88380D1C, // 0078 GETMBR R14 R6 K28 + 0x1C3C1308, // 0079 EQ R15 R9 K8 + 0x783E0003, // 007A JMPF R15 #007F + 0xB83E0400, // 007B GETNGBL R15 K2 + 0x8C3C1F1D, // 007C GETMET R15 R15 K29 + 0x7C3C0200, // 007D CALL R15 1 + 0x70020002, // 007E JMP #0082 + 0xB83E0400, // 007F GETNGBL R15 K2 + 0x8C3C1F1E, // 0080 GETMET R15 R15 K30 + 0x7C3C0200, // 0081 CALL R15 1 + 0x7C2C0800, // 0082 CALL R11 4 + 0x900E0B11, // 0083 SETMBR R3 K5 K17 + 0x80041400, // 0084 RET 1 R10 + 0x700201CE, // 0085 JMP #0255 + 0x1C241106, // 0086 EQ R9 R8 K6 + 0x78260044, // 0087 JMPF R9 #00CD + 0x8C240507, // 0088 GETMET R9 R2 K7 + 0x582C0006, // 0089 LDCONST R11 K6 + 0x7C240400, // 008A CALL R9 2 + 0x6028000C, // 008B GETGBL R10 G12 + 0x5C2C1200, // 008C MOVE R11 R9 + 0x7C280200, // 008D CALL R10 1 + 0x542E001F, // 008E LDINT R11 32 + 0x2028140B, // 008F NE R10 R10 R11 + 0x782A0001, // 0090 JMPF R10 #0093 + 0x4C280000, // 0091 LDNIL R10 + 0x80041400, // 0092 RET 1 R10 + 0x900E0B08, // 0093 SETMBR R3 K5 K8 + 0x8C280D0A, // 0094 GETMET R10 R6 K10 + 0x7C280200, // 0095 CALL R10 1 + 0x8C2C150B, // 0096 GETMET R11 R10 K11 + 0x58340008, // 0097 LDCONST R13 K8 + 0x88380D1C, // 0098 GETMBR R14 R6 K28 + 0xB83E0400, // 0099 GETNGBL R15 K2 + 0x8C3C1F1F, // 009A GETMET R15 R15 K31 + 0x7C3C0200, // 009B CALL R15 1 0x7C2C0800, // 009C CALL R11 4 0x8C2C150B, // 009D GETMET R11 R10 K11 - 0x58340011, // 009E LDCONST R13 K17 - 0x88380D1E, // 009F GETMBR R14 R6 K30 - 0xB83E3E00, // 00A0 GETNGBL R15 K31 - 0x8C3C1F20, // 00A1 GETMET R15 R15 K32 - 0x7C3C0200, // 00A2 CALL R15 1 - 0x943C1F21, // 00A3 GETIDX R15 R15 K33 - 0x7C2C0800, // 00A4 CALL R11 4 - 0x8C2C1522, // 00A5 GETMET R11 R10 K34 - 0x7C2C0200, // 00A6 CALL R11 1 - 0x8C300323, // 00A7 GETMET R12 R1 K35 - 0x7C300200, // 00A8 CALL R12 1 - 0x0034160C, // 00A9 ADD R13 R11 R12 - 0xB83A3E00, // 00AA GETNGBL R14 K31 - 0x8C381D24, // 00AB GETMET R14 R14 K36 - 0x8C401B26, // 00AC GETMET R16 R13 K38 - 0x7C400200, // 00AD CALL R16 1 - 0x00424A10, // 00AE ADD R16 K37 R16 - 0x58440011, // 00AF LDCONST R17 K17 - 0x7C380600, // 00B0 CALL R14 3 - 0x8C380927, // 00B1 GETMET R14 R4 K39 - 0x7C380200, // 00B2 CALL R14 1 - 0x8C381D28, // 00B3 GETMET R14 R14 K40 - 0xB8420400, // 00B4 GETNGBL R16 K2 - 0x8C402129, // 00B5 GETMET R16 R16 K41 - 0x7C400200, // 00B6 CALL R16 1 - 0x5C441A00, // 00B7 MOVE R17 R13 - 0x7C380600, // 00B8 CALL R14 3 - 0x8C3C0D0A, // 00B9 GETMET R15 R6 K10 - 0x7C3C0200, // 00BA CALL R15 1 - 0x8C401F0B, // 00BB GETMET R16 R15 K11 - 0x58480006, // 00BC LDCONST R18 K6 - 0x884C0D19, // 00BD GETMBR R19 R6 K25 - 0x5C501600, // 00BE MOVE R20 R11 - 0x7C400800, // 00BF CALL R16 4 + 0x5834000F, // 009E LDCONST R13 K15 + 0x88380D20, // 009F GETMBR R14 R6 K32 + 0x5C3C1200, // 00A0 MOVE R15 R9 + 0x7C2C0800, // 00A1 CALL R11 4 + 0x8C2C150B, // 00A2 GETMET R11 R10 K11 + 0x58340011, // 00A3 LDCONST R13 K17 + 0x88380D21, // 00A4 GETMBR R14 R6 K33 + 0xB83E4400, // 00A5 GETNGBL R15 K34 + 0x8C3C1F23, // 00A6 GETMET R15 R15 K35 + 0x7C3C0200, // 00A7 CALL R15 1 + 0x943C1F24, // 00A8 GETIDX R15 R15 K36 + 0x7C2C0800, // 00A9 CALL R11 4 + 0x8C2C1525, // 00AA GETMET R11 R10 K37 + 0x7C2C0200, // 00AB CALL R11 1 + 0x8C300326, // 00AC GETMET R12 R1 K38 + 0x7C300200, // 00AD CALL R12 1 + 0x0034160C, // 00AE ADD R13 R11 R12 + 0xB83A4400, // 00AF GETNGBL R14 K34 + 0x8C381D27, // 00B0 GETMET R14 R14 K39 + 0x8C401B29, // 00B1 GETMET R16 R13 K41 + 0x7C400200, // 00B2 CALL R16 1 + 0x00425010, // 00B3 ADD R16 K40 R16 + 0x58440011, // 00B4 LDCONST R17 K17 + 0x7C380600, // 00B5 CALL R14 3 + 0x8C38092A, // 00B6 GETMET R14 R4 K42 + 0x7C380200, // 00B7 CALL R14 1 + 0x8C381D2B, // 00B8 GETMET R14 R14 K43 + 0xB8420400, // 00B9 GETNGBL R16 K2 + 0x8C40212C, // 00BA GETMET R16 R16 K44 + 0x7C400200, // 00BB CALL R16 1 + 0x5C441A00, // 00BC MOVE R17 R13 + 0x7C380600, // 00BD CALL R14 3 + 0x8C3C0D0A, // 00BE GETMET R15 R6 K10 + 0x7C3C0200, // 00BF CALL R15 1 0x8C401F0B, // 00C0 GETMET R16 R15 K11 - 0x58480008, // 00C1 LDCONST R18 K8 - 0x884C0D1D, // 00C2 GETMBR R19 R6 K29 - 0x5C501C00, // 00C3 MOVE R20 R14 + 0x58480006, // 00C1 LDCONST R18 K6 + 0x884C0D1C, // 00C2 GETMBR R19 R6 K28 + 0x5C501600, // 00C3 MOVE R20 R11 0x7C400800, // 00C4 CALL R16 4 - 0x900E0B08, // 00C5 SETMBR R3 K5 K8 - 0x80041E00, // 00C6 RET 1 R15 - 0x70020178, // 00C7 JMP #0241 - 0x54260003, // 00C8 LDINT R9 4 - 0x1C241009, // 00C9 EQ R9 R8 R9 - 0x78260040, // 00CA JMPF R9 #010C - 0x8C240507, // 00CB GETMET R9 R2 K7 - 0x582C0006, // 00CC LDCONST R11 K6 - 0x7C240400, // 00CD CALL R9 2 - 0x6028000C, // 00CE GETGBL R10 G12 - 0x5C2C1200, // 00CF MOVE R11 R9 - 0x7C280200, // 00D0 CALL R10 1 - 0x542E001F, // 00D1 LDINT R11 32 - 0x2028140B, // 00D2 NE R10 R10 R11 - 0x782A0001, // 00D3 JMPF R10 #00D6 - 0x4C280000, // 00D4 LDNIL R10 - 0x80041400, // 00D5 RET 1 R10 - 0x8C280507, // 00D6 GETMET R10 R2 K7 - 0x58300008, // 00D7 LDCONST R12 K8 - 0x50340000, // 00D8 LDBOOL R13 0 0 - 0x7C280600, // 00D9 CALL R10 3 - 0x8C2C032A, // 00DA GETMET R11 R1 K42 - 0x7C2C0200, // 00DB CALL R11 1 - 0x8C300D0A, // 00DC GETMET R12 R6 K10 - 0x7C300200, // 00DD CALL R12 1 - 0x8C34190B, // 00DE GETMET R13 R12 K11 - 0x583C0008, // 00DF LDCONST R15 K8 - 0x88400D19, // 00E0 GETMBR R16 R6 K25 - 0x5C441600, // 00E1 MOVE R17 R11 - 0x7C340800, // 00E2 CALL R13 4 - 0x8C34190B, // 00E3 GETMET R13 R12 K11 - 0x583C000F, // 00E4 LDCONST R15 K15 - 0x88400D1D, // 00E5 GETMBR R16 R6 K29 - 0x5C441200, // 00E6 MOVE R17 R9 - 0x7C340800, // 00E7 CALL R13 4 - 0x8C341922, // 00E8 GETMET R13 R12 K34 - 0x7C340200, // 00E9 CALL R13 1 - 0x8C380323, // 00EA GETMET R14 R1 K35 - 0x7C380200, // 00EB CALL R14 1 - 0x00381A0E, // 00EC ADD R14 R13 R14 - 0xB83E3E00, // 00ED GETNGBL R15 K31 - 0x8C3C1F24, // 00EE GETMET R15 R15 K36 - 0x8C441D26, // 00EF GETMET R17 R14 K38 - 0x7C440200, // 00F0 CALL R17 1 - 0x00465611, // 00F1 ADD R17 K43 R17 - 0x58480011, // 00F2 LDCONST R18 K17 - 0x7C3C0600, // 00F3 CALL R15 3 - 0x8C3C0927, // 00F4 GETMET R15 R4 K39 - 0x7C3C0200, // 00F5 CALL R15 1 - 0x8C3C1F28, // 00F6 GETMET R15 R15 K40 - 0xB8460400, // 00F7 GETNGBL R17 K2 - 0x8C442329, // 00F8 GETMET R17 R17 K41 - 0x7C440200, // 00F9 CALL R17 1 - 0x5C481C00, // 00FA MOVE R18 R14 - 0x7C3C0600, // 00FB CALL R15 3 - 0x8C400D0A, // 00FC GETMET R16 R6 K10 - 0x7C400200, // 00FD CALL R16 1 - 0x8C44210B, // 00FE GETMET R17 R16 K11 - 0x584C0006, // 00FF LDCONST R19 K6 - 0x88500D19, // 0100 GETMBR R20 R6 K25 - 0x5C541A00, // 0101 MOVE R21 R13 - 0x7C440800, // 0102 CALL R17 4 - 0x8C44210B, // 0103 GETMET R17 R16 K11 - 0x584C0008, // 0104 LDCONST R19 K8 - 0x88500D1D, // 0105 GETMBR R20 R6 K29 - 0x5C541E00, // 0106 MOVE R21 R15 - 0x7C440800, // 0107 CALL R17 4 - 0x54460004, // 0108 LDINT R17 5 - 0x900E0A11, // 0109 SETMBR R3 K5 R17 - 0x80042000, // 010A RET 1 R16 - 0x70020134, // 010B JMP #0241 - 0x5426000A, // 010C LDINT R9 11 - 0x1C241009, // 010D EQ R9 R8 R9 - 0x78260012, // 010E JMPF R9 #0122 - 0x8C240507, // 010F GETMET R9 R2 K7 - 0x582C0006, // 0110 LDCONST R11 K6 - 0x7C240400, // 0111 CALL R9 2 - 0x8C28032C, // 0112 GETMET R10 R1 K44 - 0x5C301200, // 0113 MOVE R12 R9 - 0x7C280400, // 0114 CALL R10 2 - 0xB82A3E00, // 0115 GETNGBL R10 K31 - 0x8C281524, // 0116 GETMET R10 R10 K36 - 0x8C301326, // 0117 GETMET R12 R9 K38 - 0x7C300200, // 0118 CALL R12 1 - 0x00325A0C, // 0119 ADD R12 K45 R12 - 0x58340011, // 011A LDCONST R13 K17 - 0x7C280600, // 011B CALL R10 3 - 0xB82A0400, // 011C GETNGBL R10 K2 - 0x8828152E, // 011D GETMBR R10 R10 K46 - 0x900E2E0A, // 011E SETMBR R3 K23 R10 - 0x4C280000, // 011F LDNIL R10 - 0x80041400, // 0120 RET 1 R10 - 0x7002011E, // 0121 JMP #0241 - 0x54260005, // 0122 LDINT R9 6 - 0x1C241009, // 0123 EQ R9 R8 R9 - 0x782600B7, // 0124 JMPF R9 #01DD - 0x8C240507, // 0125 GETMET R9 R2 K7 - 0x582C0006, // 0126 LDCONST R11 K6 - 0x7C240400, // 0127 CALL R9 2 - 0x8C280507, // 0128 GETMET R10 R2 K7 - 0x58300008, // 0129 LDCONST R12 K8 - 0x7C280400, // 012A CALL R10 2 - 0x602C000C, // 012B GETGBL R11 G12 - 0x5C301400, // 012C MOVE R12 R10 - 0x7C2C0200, // 012D CALL R11 1 - 0x1C2C1706, // 012E EQ R11 R11 K6 - 0x782E0000, // 012F JMPF R11 #0131 - 0x4C280000, // 0130 LDNIL R10 - 0x8C2C0507, // 0131 GETMET R11 R2 K7 - 0x5834000F, // 0132 LDCONST R13 K15 - 0x7C2C0400, // 0133 CALL R11 2 - 0x8C300507, // 0134 GETMET R12 R2 K7 - 0x58380011, // 0135 LDCONST R14 K17 - 0x7C300400, // 0136 CALL R12 2 - 0x8C340507, // 0137 GETMET R13 R2 K7 - 0x543E0003, // 0138 LDINT R15 4 - 0x7C340400, // 0139 CALL R13 2 - 0x8C38032F, // 013A GETMET R14 R1 K47 - 0x7C380200, // 013B CALL R14 1 - 0x4C3C0000, // 013C LDNIL R15 - 0x1C381C0F, // 013D EQ R14 R14 R15 - 0x783A0006, // 013E JMPF R14 #0146 - 0xB83A3E00, // 013F GETNGBL R14 K31 - 0x8C381D24, // 0140 GETMET R14 R14 K36 - 0x58400030, // 0141 LDCONST R16 K48 - 0x5844000F, // 0142 LDCONST R17 K15 - 0x7C380600, // 0143 CALL R14 3 - 0x4C380000, // 0144 LDNIL R14 - 0x80041C00, // 0145 RET 1 R14 - 0x8C380331, // 0146 GETMET R14 R1 K49 - 0x5C401200, // 0147 MOVE R16 R9 - 0x5C441400, // 0148 MOVE R17 R10 - 0x7C380600, // 0149 CALL R14 3 - 0x8C380332, // 014A GETMET R14 R1 K50 - 0x5C401600, // 014B MOVE R16 R11 - 0x7C380400, // 014C CALL R14 2 - 0x8C380333, // 014D GETMET R14 R1 K51 - 0x5C401800, // 014E MOVE R16 R12 - 0x5C441A00, // 014F MOVE R17 R13 - 0x7C380600, // 0150 CALL R14 3 - 0xB83A0400, // 0151 GETNGBL R14 K2 - 0x88381D03, // 0152 GETMBR R14 R14 K3 - 0x8C381D34, // 0153 GETMET R14 R14 K52 - 0x5C401200, // 0154 MOVE R16 R9 - 0x7C380400, // 0155 CALL R14 2 - 0x8C3C1D35, // 0156 GETMET R15 R14 K53 - 0x54460005, // 0157 LDINT R17 6 - 0x7C3C0400, // 0158 CALL R15 2 - 0x8C401F07, // 0159 GETMET R16 R15 K7 - 0x544A0014, // 015A LDINT R18 21 - 0x7C400400, // 015B CALL R16 2 - 0x8C441F07, // 015C GETMET R17 R15 K7 - 0x544E0010, // 015D LDINT R19 17 - 0x7C440400, // 015E CALL R17 2 - 0x5C482000, // 015F MOVE R18 R16 - 0x784A0001, // 0160 JMPF R18 #0163 - 0x5C482200, // 0161 MOVE R18 R17 - 0x744A0006, // 0162 JMPT R18 #016A - 0xB84A3E00, // 0163 GETNGBL R18 K31 - 0x8C482524, // 0164 GETMET R18 R18 K36 - 0x58500036, // 0165 LDCONST R20 K54 - 0x5854000F, // 0166 LDCONST R21 K15 - 0x7C480600, // 0167 CALL R18 3 - 0x50480000, // 0168 LDBOOL R18 0 0 - 0x80042400, // 0169 RET 1 R18 - 0x60480004, // 016A GETGBL R18 G4 - 0x5C4C2000, // 016B MOVE R19 R16 - 0x7C480200, // 016C CALL R18 1 - 0x1C482537, // 016D EQ R18 R18 K55 - 0x784A0007, // 016E JMPF R18 #0177 - 0xB84A7000, // 016F GETNGBL R18 K56 - 0x8C482539, // 0170 GETMET R18 R18 K57 - 0x5C502000, // 0171 MOVE R20 R16 - 0x7C480400, // 0172 CALL R18 2 - 0x8C48253A, // 0173 GETMET R18 R18 K58 - 0x7C480200, // 0174 CALL R18 1 - 0x5C402400, // 0175 MOVE R16 R18 - 0x70020002, // 0176 JMP #017A - 0x8C48213A, // 0177 GETMET R18 R16 K58 - 0x7C480200, // 0178 CALL R18 1 - 0x5C402400, // 0179 MOVE R16 R18 - 0x60480004, // 017A GETGBL R18 G4 - 0x5C4C2200, // 017B MOVE R19 R17 - 0x7C480200, // 017C CALL R18 1 - 0x1C482537, // 017D EQ R18 R18 K55 - 0x784A0007, // 017E JMPF R18 #0187 - 0xB84A7000, // 017F GETNGBL R18 K56 - 0x8C482539, // 0180 GETMET R18 R18 K57 - 0x5C502200, // 0181 MOVE R20 R17 - 0x7C480400, // 0182 CALL R18 2 - 0x8C48253A, // 0183 GETMET R18 R18 K58 - 0x7C480200, // 0184 CALL R18 1 - 0x5C442400, // 0185 MOVE R17 R18 - 0x70020002, // 0186 JMP #018A - 0x8C48233A, // 0187 GETMET R18 R17 K58 - 0x7C480200, // 0188 CALL R18 1 - 0x5C442400, // 0189 MOVE R17 R18 - 0xB84A0400, // 018A GETNGBL R18 K2 - 0x88482503, // 018B GETMBR R18 R18 K3 - 0x8C482534, // 018C GETMET R18 R18 K52 - 0x8C50032F, // 018D GETMET R20 R1 K47 - 0x7C500200, // 018E CALL R20 1 - 0x7C480400, // 018F CALL R18 2 - 0x8C482507, // 0190 GETMET R18 R18 K7 - 0x54520008, // 0191 LDINT R20 9 - 0x7C480400, // 0192 CALL R18 2 - 0x404E113B, // 0193 CONNECT R19 K8 K59 - 0x94482413, // 0194 GETIDX R18 R18 R19 - 0x60500015, // 0195 GETGBL R20 G21 - 0x7C500000, // 0196 CALL R20 0 - 0x8C50293C, // 0197 GETMET R20 R20 K60 - 0x5858003D, // 0198 LDCONST R22 K61 - 0x7C500400, // 0199 CALL R20 2 - 0x5C4C2800, // 019A MOVE R19 R20 - 0x8C50093E, // 019B GETMET R20 R4 K62 - 0x7C500200, // 019C CALL R20 1 - 0x8C54213F, // 019D GETMET R21 R16 K63 - 0x7C540200, // 019E CALL R21 1 - 0x8C542B40, // 019F GETMET R21 R21 K64 - 0x7C540200, // 01A0 CALL R21 1 - 0x8C582941, // 01A1 GETMET R22 R20 K65 - 0x5C602400, // 01A2 MOVE R24 R18 - 0x5C642A00, // 01A3 MOVE R25 R21 - 0x5C682600, // 01A4 MOVE R26 R19 - 0x546E0007, // 01A5 LDINT R27 8 - 0x7C580A00, // 01A6 CALL R22 5 - 0x8C5C0342, // 01A7 GETMET R23 R1 K66 - 0x5C642000, // 01A8 MOVE R25 R16 - 0x5C682200, // 01A9 MOVE R26 R17 - 0x5C6C2C00, // 01AA MOVE R27 R22 - 0x88700115, // 01AB GETMBR R28 R0 K21 - 0x88703943, // 01AC GETMBR R28 R28 K67 - 0x7C5C0A00, // 01AD CALL R23 5 - 0x8C5C0344, // 01AE GETMET R23 R1 K68 - 0x7C5C0200, // 01AF CALL R23 1 - 0x8C5C0345, // 01B0 GETMET R23 R1 K69 - 0x7C5C0200, // 01B1 CALL R23 1 - 0x885C0115, // 01B2 GETMBR R23 R0 K21 - 0x8C5C2F46, // 01B3 GETMET R23 R23 K70 - 0x5C640200, // 01B4 MOVE R25 R1 - 0x7C5C0400, // 01B5 CALL R23 2 - 0xB85E3E00, // 01B6 GETNGBL R23 K31 - 0x8C5C2F24, // 01B7 GETMET R23 R23 K36 - 0x58640047, // 01B8 LDCONST R25 K71 - 0x58680011, // 01B9 LDCONST R26 K17 - 0x7C5C0600, // 01BA CALL R23 3 - 0xB85E3E00, // 01BB GETNGBL R23 K31 - 0x8C5C2F24, // 01BC GETMET R23 R23 K36 - 0xB8660400, // 01BD GETNGBL R25 K2 - 0x8C643349, // 01BE GETMET R25 R25 K73 - 0x886C034A, // 01BF GETMBR R27 R1 K74 - 0x7C640400, // 01C0 CALL R25 2 - 0x00669019, // 01C1 ADD R25 K72 R25 - 0x58680011, // 01C2 LDCONST R26 K17 - 0x7C5C0600, // 01C3 CALL R23 3 - 0xB85E3E00, // 01C4 GETNGBL R23 K31 - 0x8C5C2F24, // 01C5 GETMET R23 R23 K36 - 0x58640047, // 01C6 LDCONST R25 K71 - 0x58680011, // 01C7 LDCONST R26 K17 - 0x7C5C0600, // 01C8 CALL R23 3 - 0x885C034A, // 01C9 GETMBR R23 R1 K74 - 0x8C5C2F4B, // 01CA GETMET R23 R23 K75 - 0x7C5C0200, // 01CB CALL R23 1 - 0x8C5C0D0A, // 01CC GETMET R23 R6 K10 - 0x7C5C0200, // 01CD CALL R23 1 - 0x8C602F0B, // 01CE GETMET R24 R23 K11 - 0x58680006, // 01CF LDCONST R26 K6 - 0x886C0D0C, // 01D0 GETMBR R27 R6 K12 - 0xB8720400, // 01D1 GETNGBL R28 K2 - 0x8870392E, // 01D2 GETMBR R28 R28 K46 - 0x7C600800, // 01D3 CALL R24 4 - 0x8C602F0B, // 01D4 GETMET R24 R23 K11 - 0x58680008, // 01D5 LDCONST R26 K8 - 0x886C0D0C, // 01D6 GETMBR R27 R6 K12 - 0x58700008, // 01D7 LDCONST R28 K8 - 0x7C600800, // 01D8 CALL R24 4 - 0x54620007, // 01D9 LDINT R24 8 - 0x900E0A18, // 01DA SETMBR R3 K5 R24 - 0x80042E00, // 01DB RET 1 R23 - 0x70020063, // 01DC JMP #0241 - 0x54260008, // 01DD LDINT R9 9 - 0x1C241009, // 01DE EQ R9 R8 R9 - 0x7826001E, // 01DF JMPF R9 #01FF - 0x8C240507, // 01E0 GETMET R9 R2 K7 - 0x582C0006, // 01E1 LDCONST R11 K6 - 0x7C240400, // 01E2 CALL R9 2 - 0x8C28034C, // 01E3 GETMET R10 R1 K76 - 0x5C301200, // 01E4 MOVE R12 R9 - 0x7C280400, // 01E5 CALL R10 2 - 0xB82A3E00, // 01E6 GETNGBL R10 K31 - 0x8C281524, // 01E7 GETMET R10 R10 K36 - 0x8C300B4D, // 01E8 GETMET R12 R5 K77 - 0x5838004E, // 01E9 LDCONST R14 K78 - 0x883C034A, // 01EA GETMBR R15 R1 K74 - 0x8C3C1F4F, // 01EB GETMET R15 R15 K79 - 0x7C3C0200, // 01EC CALL R15 1 - 0x8C3C1F3F, // 01ED GETMET R15 R15 K63 - 0x7C3C0200, // 01EE CALL R15 1 - 0x8C3C1F40, // 01EF GETMET R15 R15 K64 - 0x7C3C0200, // 01F0 CALL R15 1 - 0x8C3C1F26, // 01F1 GETMET R15 R15 K38 - 0x7C3C0200, // 01F2 CALL R15 1 - 0x60400008, // 01F3 GETGBL R16 G8 - 0x5C441200, // 01F4 MOVE R17 R9 - 0x7C400200, // 01F5 CALL R16 1 - 0x7C300800, // 01F6 CALL R12 4 - 0x5834000F, // 01F7 LDCONST R13 K15 - 0x7C280600, // 01F8 CALL R10 3 - 0xB82A0400, // 01F9 GETNGBL R10 K2 - 0x8828152E, // 01FA GETMBR R10 R10 K46 - 0x900E2E0A, // 01FB SETMBR R3 K23 R10 - 0x4C280000, // 01FC LDNIL R10 - 0x80041400, // 01FD RET 1 R10 - 0x70020041, // 01FE JMP #0241 - 0x54260009, // 01FF LDINT R9 10 - 0x1C241009, // 0200 EQ R9 R8 R9 - 0x7826003E, // 0201 JMPF R9 #0241 - 0x8C240507, // 0202 GETMET R9 R2 K7 - 0x582C0006, // 0203 LDCONST R11 K6 - 0x7C240400, // 0204 CALL R9 2 - 0x60280008, // 0205 GETGBL R10 G8 - 0x5C2C1200, // 0206 MOVE R11 R9 - 0x7C280200, // 0207 CALL R10 1 - 0x002AA00A, // 0208 ADD R10 K80 R10 - 0x900E480A, // 0209 SETMBR R3 K36 R10 - 0x60280010, // 020A GETGBL R10 G16 - 0x882C0115, // 020B GETMBR R11 R0 K21 - 0x882C1751, // 020C GETMBR R11 R11 K81 - 0x8C2C1752, // 020D GETMET R11 R11 K82 - 0x7C2C0200, // 020E CALL R11 1 - 0x7C280200, // 020F CALL R10 1 - 0xA802001D, // 0210 EXBLK 0 #022F - 0x5C2C1400, // 0211 MOVE R11 R10 - 0x7C2C0000, // 0212 CALL R11 0 - 0x8C301753, // 0213 GETMET R12 R11 K83 - 0x7C300200, // 0214 CALL R12 1 - 0x1C301809, // 0215 EQ R12 R12 R9 - 0x78320015, // 0216 JMPF R12 #022D - 0xB8323E00, // 0217 GETNGBL R12 K31 - 0x8C301924, // 0218 GETMET R12 R12 K36 - 0x8C38174F, // 0219 GETMET R14 R11 K79 - 0x7C380200, // 021A CALL R14 1 - 0x8C381D3F, // 021B GETMET R14 R14 K63 - 0x7C380200, // 021C CALL R14 1 - 0x8C381D40, // 021D GETMET R14 R14 K64 - 0x7C380200, // 021E CALL R14 1 - 0x8C381D26, // 021F GETMET R14 R14 K38 - 0x7C380200, // 0220 CALL R14 1 - 0x003AA80E, // 0221 ADD R14 K84 R14 - 0x583C000F, // 0222 LDCONST R15 K15 - 0x7C300600, // 0223 CALL R12 3 - 0xB8323E00, // 0224 GETNGBL R12 K31 - 0x8C301955, // 0225 GETMET R12 R12 K85 - 0x543A07CF, // 0226 LDINT R14 2000 - 0x843C0000, // 0227 CLOSURE R15 P0 - 0x7C300600, // 0228 CALL R12 3 - 0x50300200, // 0229 LDBOOL R12 1 0 - 0xA0000000, // 022A CLOSE R0 - 0xA8040001, // 022B EXBLK 1 1 - 0x80041800, // 022C RET 1 R12 - 0xA0280000, // 022D CLOSE R10 - 0x7001FFE1, // 022E JMP #0211 - 0x58280056, // 022F LDCONST R10 K86 - 0xAC280200, // 0230 CATCH R10 1 0 - 0xB0080000, // 0231 RAISE 2 R0 R0 - 0xB82A3E00, // 0232 GETNGBL R10 K31 - 0x8C281524, // 0233 GETMET R10 R10 K36 - 0x60300008, // 0234 GETGBL R12 G8 - 0x5C341200, // 0235 MOVE R13 R9 - 0x7C300200, // 0236 CALL R12 1 - 0x0032AE0C, // 0237 ADD R12 K87 R12 - 0x00301958, // 0238 ADD R12 R12 K88 - 0x5834000F, // 0239 LDCONST R13 K15 - 0x7C280600, // 023A CALL R10 3 - 0xB82A0400, // 023B GETNGBL R10 K2 - 0x88281559, // 023C GETMBR R10 R10 K89 - 0x900E2E0A, // 023D SETMBR R3 K23 R10 - 0x4C280000, // 023E LDNIL R10 - 0xA0000000, // 023F CLOSE R0 - 0x80041400, // 0240 RET 1 R10 - 0x7002009A, // 0241 JMP #02DD - 0x5426003B, // 0242 LDINT R9 60 - 0x1C240E09, // 0243 EQ R9 R7 R9 - 0x78260084, // 0244 JMPF R9 #02CA - 0x1C241106, // 0245 EQ R9 R8 K6 - 0x78260064, // 0246 JMPF R9 #02AC - 0x8C240507, // 0247 GETMET R9 R2 K7 - 0x582C0006, // 0248 LDCONST R11 K6 - 0x7C240400, // 0249 CALL R9 2 - 0x8C280507, // 024A GETMET R10 R2 K7 - 0x58300008, // 024B LDCONST R12 K8 - 0x7C280400, // 024C CALL R10 2 - 0x8C2C0507, // 024D GETMET R11 R2 K7 - 0x5834000F, // 024E LDCONST R13 K15 - 0x7C2C0400, // 024F CALL R11 2 - 0x8C300507, // 0250 GETMET R12 R2 K7 - 0x58380011, // 0251 LDCONST R14 K17 - 0x7C300400, // 0252 CALL R12 2 - 0x8C340507, // 0253 GETMET R13 R2 K7 - 0x543E0003, // 0254 LDINT R15 4 - 0x7C340400, // 0255 CALL R13 2 - 0xB83A3E00, // 0256 GETNGBL R14 K31 - 0x8C381D24, // 0257 GETMET R14 R14 K36 - 0x8C400B4D, // 0258 GETMET R16 R5 K77 - 0x5848005A, // 0259 LDCONST R18 K90 - 0x5C4C1200, // 025A MOVE R19 R9 - 0x8C501526, // 025B GETMET R20 R10 K38 - 0x7C500200, // 025C CALL R20 1 - 0x5C541600, // 025D MOVE R21 R11 - 0x5C581800, // 025E MOVE R22 R12 - 0x8C5C1B26, // 025F GETMET R23 R13 K38 - 0x7C5C0200, // 0260 CALL R23 1 - 0x7C400E00, // 0261 CALL R16 7 - 0x5844000F, // 0262 LDCONST R17 K15 - 0x7C380600, // 0263 CALL R14 3 - 0x4C380000, // 0264 LDNIL R14 - 0x1C38120E, // 0265 EQ R14 R9 R14 - 0x743A000B, // 0266 JMPT R14 #0273 - 0x4C380000, // 0267 LDNIL R14 - 0x1C38140E, // 0268 EQ R14 R10 R14 - 0x743A0008, // 0269 JMPT R14 #0273 - 0x4C380000, // 026A LDNIL R14 - 0x1C38160E, // 026B EQ R14 R11 R14 - 0x743A0005, // 026C JMPT R14 #0273 - 0x4C380000, // 026D LDNIL R14 - 0x1C38180E, // 026E EQ R14 R12 R14 - 0x743A0002, // 026F JMPT R14 #0273 - 0x4C380000, // 0270 LDNIL R14 - 0x1C381A0E, // 0271 EQ R14 R13 R14 - 0x783A0005, // 0272 JMPF R14 #0279 - 0xB83A0400, // 0273 GETNGBL R14 K2 - 0x88381D5B, // 0274 GETMBR R14 R14 K91 - 0x900E2E0E, // 0275 SETMBR R3 K23 R14 - 0x4C380000, // 0276 LDNIL R14 - 0xA0000000, // 0277 CLOSE R0 - 0x80041C00, // 0278 RET 1 R14 - 0x6038000C, // 0279 GETGBL R14 G12 - 0x5C3C1400, // 027A MOVE R15 R10 - 0x7C380200, // 027B CALL R14 1 - 0x543E001F, // 027C LDINT R15 32 - 0x54420040, // 027D LDINT R16 65 - 0x003C1E10, // 027E ADD R15 R15 R16 - 0x20381C0F, // 027F NE R14 R14 R15 - 0x743A000B, // 0280 JMPT R14 #028D - 0x6038000C, // 0281 GETGBL R14 G12 - 0x5C3C1A00, // 0282 MOVE R15 R13 - 0x7C380200, // 0283 CALL R14 1 - 0x543E000F, // 0284 LDINT R15 16 - 0x14381C0F, // 0285 LT R14 R14 R15 - 0x743A0005, // 0286 JMPT R14 #028D - 0x6038000C, // 0287 GETGBL R14 G12 - 0x5C3C1A00, // 0288 MOVE R15 R13 - 0x7C380200, // 0289 CALL R14 1 - 0x543E001F, // 028A LDINT R15 32 - 0x24381C0F, // 028B GT R14 R14 R15 - 0x783A0009, // 028C JMPF R14 #0297 - 0xB83A3E00, // 028D GETNGBL R14 K31 - 0x8C381D24, // 028E GETMET R14 R14 K36 - 0x5840005C, // 028F LDCONST R16 K92 - 0x7C380400, // 0290 CALL R14 2 - 0xB83A0400, // 0291 GETNGBL R14 K2 - 0x88381D5D, // 0292 GETMBR R14 R14 K93 - 0x900E2E0E, // 0293 SETMBR R3 K23 R14 - 0x4C380000, // 0294 LDNIL R14 - 0xA0000000, // 0295 CLOSE R0 - 0x80041C00, // 0296 RET 1 R14 - 0x543A001E, // 0297 LDINT R14 31 - 0x403A0C0E, // 0298 CONNECT R14 K6 R14 - 0x9438140E, // 0299 GETIDX R14 R10 R14 - 0x543E001F, // 029A LDINT R15 32 - 0x403C1F3B, // 029B CONNECT R15 R15 K59 - 0x943C140F, // 029C GETIDX R15 R10 R15 - 0x88400115, // 029D GETMBR R16 R0 K21 - 0x8C40215E, // 029E GETMET R16 R16 K94 - 0x5C481200, // 029F MOVE R18 R9 - 0x5C4C1800, // 02A0 MOVE R19 R12 - 0x5C501600, // 02A1 MOVE R20 R11 - 0x5C541A00, // 02A2 MOVE R21 R13 - 0x5C581C00, // 02A3 MOVE R22 R14 - 0x5C5C1E00, // 02A4 MOVE R23 R15 - 0x8C60035F, // 02A5 GETMET R24 R1 K95 - 0x7C600200, // 02A6 CALL R24 1 - 0x7C401000, // 02A7 CALL R16 8 - 0x50400200, // 02A8 LDBOOL R16 1 0 + 0x8C401F0B, // 00C5 GETMET R16 R15 K11 + 0x58480008, // 00C6 LDCONST R18 K8 + 0x884C0D20, // 00C7 GETMBR R19 R6 K32 + 0x5C501C00, // 00C8 MOVE R20 R14 + 0x7C400800, // 00C9 CALL R16 4 + 0x900E0B08, // 00CA SETMBR R3 K5 K8 + 0x80041E00, // 00CB RET 1 R15 + 0x70020187, // 00CC JMP #0255 + 0x54260003, // 00CD LDINT R9 4 + 0x1C241009, // 00CE EQ R9 R8 R9 + 0x7826004D, // 00CF JMPF R9 #011E + 0x8C240507, // 00D0 GETMET R9 R2 K7 + 0x582C0006, // 00D1 LDCONST R11 K6 + 0x7C240400, // 00D2 CALL R9 2 + 0x6028000C, // 00D3 GETGBL R10 G12 + 0x5C2C1200, // 00D4 MOVE R11 R9 + 0x7C280200, // 00D5 CALL R10 1 + 0x542E001F, // 00D6 LDINT R11 32 + 0x2028140B, // 00D7 NE R10 R10 R11 + 0x782A0001, // 00D8 JMPF R10 #00DB + 0x4C280000, // 00D9 LDNIL R10 + 0x80041400, // 00DA RET 1 R10 + 0x8C280507, // 00DB GETMET R10 R2 K7 + 0x58300008, // 00DC LDCONST R12 K8 + 0x50340000, // 00DD LDBOOL R13 0 0 + 0x7C280600, // 00DE CALL R10 3 + 0xB82E4400, // 00DF GETNGBL R11 K34 + 0x8C2C1727, // 00E0 GETMET R11 R11 K39 + 0x8C340B2D, // 00E1 GETMET R13 R5 K45 + 0x583C002E, // 00E2 LDCONST R15 K46 + 0x60400008, // 00E3 GETGBL R16 G8 + 0x5C441200, // 00E4 MOVE R17 R9 + 0x7C400200, // 00E5 CALL R16 1 + 0x60440008, // 00E6 GETGBL R17 G8 + 0x5C481400, // 00E7 MOVE R18 R10 + 0x7C440200, // 00E8 CALL R17 1 + 0x7C340800, // 00E9 CALL R13 4 + 0x58380011, // 00EA LDCONST R14 K17 + 0x7C2C0600, // 00EB CALL R11 3 + 0x8C2C032F, // 00EC GETMET R11 R1 K47 + 0x7C2C0200, // 00ED CALL R11 1 + 0x8C300D0A, // 00EE GETMET R12 R6 K10 + 0x7C300200, // 00EF CALL R12 1 + 0x8C34190B, // 00F0 GETMET R13 R12 K11 + 0x583C0008, // 00F1 LDCONST R15 K8 + 0x88400D1C, // 00F2 GETMBR R16 R6 K28 + 0x5C441600, // 00F3 MOVE R17 R11 + 0x7C340800, // 00F4 CALL R13 4 + 0x8C34190B, // 00F5 GETMET R13 R12 K11 + 0x583C000F, // 00F6 LDCONST R15 K15 + 0x88400D20, // 00F7 GETMBR R16 R6 K32 + 0x5C441200, // 00F8 MOVE R17 R9 + 0x7C340800, // 00F9 CALL R13 4 + 0x8C341925, // 00FA GETMET R13 R12 K37 + 0x7C340200, // 00FB CALL R13 1 + 0x8C380326, // 00FC GETMET R14 R1 K38 + 0x7C380200, // 00FD CALL R14 1 + 0x00381A0E, // 00FE ADD R14 R13 R14 + 0xB83E4400, // 00FF GETNGBL R15 K34 + 0x8C3C1F27, // 0100 GETMET R15 R15 K39 + 0x8C441D29, // 0101 GETMET R17 R14 K41 + 0x7C440200, // 0102 CALL R17 1 + 0x00466011, // 0103 ADD R17 K48 R17 + 0x58480011, // 0104 LDCONST R18 K17 + 0x7C3C0600, // 0105 CALL R15 3 + 0x8C3C092A, // 0106 GETMET R15 R4 K42 + 0x7C3C0200, // 0107 CALL R15 1 + 0x8C3C1F2B, // 0108 GETMET R15 R15 K43 + 0xB8460400, // 0109 GETNGBL R17 K2 + 0x8C44232C, // 010A GETMET R17 R17 K44 + 0x7C440200, // 010B CALL R17 1 + 0x5C481C00, // 010C MOVE R18 R14 + 0x7C3C0600, // 010D CALL R15 3 + 0x8C400D0A, // 010E GETMET R16 R6 K10 + 0x7C400200, // 010F CALL R16 1 + 0x8C44210B, // 0110 GETMET R17 R16 K11 + 0x584C0006, // 0111 LDCONST R19 K6 + 0x88500D1C, // 0112 GETMBR R20 R6 K28 + 0x5C541A00, // 0113 MOVE R21 R13 + 0x7C440800, // 0114 CALL R17 4 + 0x8C44210B, // 0115 GETMET R17 R16 K11 + 0x584C0008, // 0116 LDCONST R19 K8 + 0x88500D20, // 0117 GETMBR R20 R6 K32 + 0x5C541E00, // 0118 MOVE R21 R15 + 0x7C440800, // 0119 CALL R17 4 + 0x54460004, // 011A LDINT R17 5 + 0x900E0A11, // 011B SETMBR R3 K5 R17 + 0x80042000, // 011C RET 1 R16 + 0x70020136, // 011D JMP #0255 + 0x5426000A, // 011E LDINT R9 11 + 0x1C241009, // 011F EQ R9 R8 R9 + 0x78260012, // 0120 JMPF R9 #0134 + 0x8C240507, // 0121 GETMET R9 R2 K7 + 0x582C0006, // 0122 LDCONST R11 K6 + 0x7C240400, // 0123 CALL R9 2 + 0x8C280331, // 0124 GETMET R10 R1 K49 + 0x5C301200, // 0125 MOVE R12 R9 + 0x7C280400, // 0126 CALL R10 2 + 0xB82A4400, // 0127 GETNGBL R10 K34 + 0x8C281527, // 0128 GETMET R10 R10 K39 + 0x8C301329, // 0129 GETMET R12 R9 K41 + 0x7C300200, // 012A CALL R12 1 + 0x0032640C, // 012B ADD R12 K50 R12 + 0x58340011, // 012C LDCONST R13 K17 + 0x7C280600, // 012D CALL R10 3 + 0xB82A0400, // 012E GETNGBL R10 K2 + 0x88281533, // 012F GETMBR R10 R10 K51 + 0x900E340A, // 0130 SETMBR R3 K26 R10 + 0x4C280000, // 0131 LDNIL R10 + 0x80041400, // 0132 RET 1 R10 + 0x70020120, // 0133 JMP #0255 + 0x54260005, // 0134 LDINT R9 6 + 0x1C241009, // 0135 EQ R9 R8 R9 + 0x782600B9, // 0136 JMPF R9 #01F1 + 0xB8264400, // 0137 GETNGBL R9 K34 + 0x8C241327, // 0138 GETMET R9 R9 K39 + 0x602C0008, // 0139 GETGBL R11 G8 + 0x5C300400, // 013A MOVE R12 R2 + 0x7C2C0200, // 013B CALL R11 1 + 0x002E680B, // 013C ADD R11 K52 R11 + 0x58300011, // 013D LDCONST R12 K17 + 0x7C240600, // 013E CALL R9 3 + 0x8C240507, // 013F GETMET R9 R2 K7 + 0x582C0006, // 0140 LDCONST R11 K6 + 0x7C240400, // 0141 CALL R9 2 + 0x8C280507, // 0142 GETMET R10 R2 K7 + 0x58300008, // 0143 LDCONST R12 K8 + 0x7C280400, // 0144 CALL R10 2 + 0x602C000C, // 0145 GETGBL R11 G12 + 0x5C301400, // 0146 MOVE R12 R10 + 0x7C2C0200, // 0147 CALL R11 1 + 0x1C2C1706, // 0148 EQ R11 R11 K6 + 0x782E0000, // 0149 JMPF R11 #014B + 0x4C280000, // 014A LDNIL R10 + 0x8C2C0507, // 014B GETMET R11 R2 K7 + 0x5834000F, // 014C LDCONST R13 K15 + 0x7C2C0400, // 014D CALL R11 2 + 0x8C300507, // 014E GETMET R12 R2 K7 + 0x58380011, // 014F LDCONST R14 K17 + 0x7C300400, // 0150 CALL R12 2 + 0x8C340507, // 0151 GETMET R13 R2 K7 + 0x543E0003, // 0152 LDINT R15 4 + 0x7C340400, // 0153 CALL R13 2 + 0x8C380335, // 0154 GETMET R14 R1 K53 + 0x7C380200, // 0155 CALL R14 1 + 0x4C3C0000, // 0156 LDNIL R15 + 0x1C381C0F, // 0157 EQ R14 R14 R15 + 0x783A0006, // 0158 JMPF R14 #0160 + 0xB83A4400, // 0159 GETNGBL R14 K34 + 0x8C381D27, // 015A GETMET R14 R14 K39 + 0x58400036, // 015B LDCONST R16 K54 + 0x5844000F, // 015C LDCONST R17 K15 + 0x7C380600, // 015D CALL R14 3 + 0x4C380000, // 015E LDNIL R14 + 0x80041C00, // 015F RET 1 R14 + 0x88380116, // 0160 GETMBR R14 R0 K22 + 0x88381D37, // 0161 GETMBR R14 R14 K55 + 0x8C381D38, // 0162 GETMET R14 R14 K56 + 0x7C380200, // 0163 CALL R14 1 + 0x8C3C1D39, // 0164 GETMET R15 R14 K57 + 0x8C440335, // 0165 GETMET R17 R1 K53 + 0x7C440200, // 0166 CALL R17 1 + 0x7C3C0400, // 0167 CALL R15 2 + 0x8C3C1D3A, // 0168 GETMET R15 R14 K58 + 0x5C441200, // 0169 MOVE R17 R9 + 0x5C481400, // 016A MOVE R18 R10 + 0x7C3C0600, // 016B CALL R15 3 + 0x8C3C1D3B, // 016C GETMET R15 R14 K59 + 0x5C441600, // 016D MOVE R17 R11 + 0x7C3C0400, // 016E CALL R15 2 + 0x8C3C1D3C, // 016F GETMET R15 R14 K60 + 0x5C441800, // 0170 MOVE R17 R12 + 0x5C481A00, // 0171 MOVE R18 R13 + 0x7C3C0600, // 0172 CALL R15 3 + 0x8C3C1D3D, // 0173 GETMET R15 R14 K61 + 0x8C44033E, // 0174 GETMET R17 R1 K62 + 0x7C440200, // 0175 CALL R17 1 + 0x7C3C0400, // 0176 CALL R15 2 + 0xB83E0400, // 0177 GETNGBL R15 K2 + 0x883C1F03, // 0178 GETMBR R15 R15 K3 + 0x8C3C1F3F, // 0179 GETMET R15 R15 K63 + 0x5C441200, // 017A MOVE R17 R9 + 0x7C3C0400, // 017B CALL R15 2 + 0x8C401F40, // 017C GETMET R16 R15 K64 + 0x544A0005, // 017D LDINT R18 6 + 0x7C400400, // 017E CALL R16 2 + 0x8C442107, // 017F GETMET R17 R16 K7 + 0x544E0014, // 0180 LDINT R19 21 + 0x7C440400, // 0181 CALL R17 2 + 0x8C482107, // 0182 GETMET R18 R16 K7 + 0x54520010, // 0183 LDINT R20 17 + 0x7C480400, // 0184 CALL R18 2 + 0x5C4C2200, // 0185 MOVE R19 R17 + 0x784E0001, // 0186 JMPF R19 #0189 + 0x5C4C2400, // 0187 MOVE R19 R18 + 0x744E0006, // 0188 JMPT R19 #0190 + 0xB84E4400, // 0189 GETNGBL R19 K34 + 0x8C4C2727, // 018A GETMET R19 R19 K39 + 0x58540041, // 018B LDCONST R21 K65 + 0x5858000F, // 018C LDCONST R22 K15 + 0x7C4C0600, // 018D CALL R19 3 + 0x504C0000, // 018E LDBOOL R19 0 0 + 0x80042600, // 018F RET 1 R19 + 0x604C0004, // 0190 GETGBL R19 G4 + 0x5C502200, // 0191 MOVE R20 R17 + 0x7C4C0200, // 0192 CALL R19 1 + 0x1C4C2742, // 0193 EQ R19 R19 K66 + 0x784E0007, // 0194 JMPF R19 #019D + 0xB84E8600, // 0195 GETNGBL R19 K67 + 0x8C4C2744, // 0196 GETMET R19 R19 K68 + 0x5C542200, // 0197 MOVE R21 R17 + 0x7C4C0400, // 0198 CALL R19 2 + 0x8C4C2745, // 0199 GETMET R19 R19 K69 + 0x7C4C0200, // 019A CALL R19 1 + 0x5C442600, // 019B MOVE R17 R19 + 0x70020002, // 019C JMP #01A0 + 0x8C4C2345, // 019D GETMET R19 R17 K69 + 0x7C4C0200, // 019E CALL R19 1 + 0x5C442600, // 019F MOVE R17 R19 + 0x604C0004, // 01A0 GETGBL R19 G4 + 0x5C502400, // 01A1 MOVE R20 R18 + 0x7C4C0200, // 01A2 CALL R19 1 + 0x1C4C2742, // 01A3 EQ R19 R19 K66 + 0x784E0007, // 01A4 JMPF R19 #01AD + 0xB84E8600, // 01A5 GETNGBL R19 K67 + 0x8C4C2744, // 01A6 GETMET R19 R19 K68 + 0x5C542400, // 01A7 MOVE R21 R18 + 0x7C4C0400, // 01A8 CALL R19 2 + 0x8C4C2745, // 01A9 GETMET R19 R19 K69 + 0x7C4C0200, // 01AA CALL R19 1 + 0x5C482600, // 01AB MOVE R18 R19 + 0x70020002, // 01AC JMP #01B0 + 0x8C4C2545, // 01AD GETMET R19 R18 K69 + 0x7C4C0200, // 01AE CALL R19 1 + 0x5C482600, // 01AF MOVE R18 R19 + 0x8C4C0346, // 01B0 GETMET R19 R1 K70 + 0x7C4C0200, // 01B1 CALL R19 1 + 0x40521147, // 01B2 CONNECT R20 K8 K71 + 0x944C2614, // 01B3 GETIDX R19 R19 R20 + 0x60540015, // 01B4 GETGBL R21 G21 + 0x7C540000, // 01B5 CALL R21 0 + 0x8C542B48, // 01B6 GETMET R21 R21 K72 + 0x585C0049, // 01B7 LDCONST R23 K73 + 0x7C540400, // 01B8 CALL R21 2 + 0x5C502A00, // 01B9 MOVE R20 R21 + 0x8C54094A, // 01BA GETMET R21 R4 K74 + 0x7C540200, // 01BB CALL R21 1 + 0x8C58234B, // 01BC GETMET R22 R17 K75 + 0x7C580200, // 01BD CALL R22 1 + 0x8C582D4C, // 01BE GETMET R22 R22 K76 + 0x7C580200, // 01BF CALL R22 1 + 0x8C5C2B4D, // 01C0 GETMET R23 R21 K77 + 0x5C642600, // 01C1 MOVE R25 R19 + 0x5C682C00, // 01C2 MOVE R26 R22 + 0x5C6C2800, // 01C3 MOVE R27 R20 + 0x54720007, // 01C4 LDINT R28 8 + 0x7C5C0A00, // 01C5 CALL R23 5 + 0x88600312, // 01C6 GETMBR R24 R1 K18 + 0x78620001, // 01C7 JMPF R24 #01CA + 0x88600312, // 01C8 GETMBR R24 R1 K18 + 0x70020001, // 01C9 JMP #01CC + 0x88600116, // 01CA GETMBR R24 R0 K22 + 0x8860314E, // 01CB GETMBR R24 R24 K78 + 0x8C641D4F, // 01CC GETMET R25 R14 K79 + 0x5C6C2200, // 01CD MOVE R27 R17 + 0x5C702400, // 01CE MOVE R28 R18 + 0x5C742E00, // 01CF MOVE R29 R23 + 0x5C783000, // 01D0 MOVE R30 R24 + 0x7C640A00, // 01D1 CALL R25 5 + 0x8C641D50, // 01D2 GETMET R25 R14 K80 + 0x7C640200, // 01D3 CALL R25 1 + 0x88640116, // 01D4 GETMBR R25 R0 K22 + 0x8C643351, // 01D5 GETMET R25 R25 K81 + 0x5C6C1C00, // 01D6 MOVE R27 R14 + 0x7C640400, // 01D7 CALL R25 2 + 0x8C640352, // 01D8 GETMET R25 R1 K82 + 0x7C640200, // 01D9 CALL R25 1 + 0x78660002, // 01DA JMPF R25 #01DE + 0x8C640353, // 01DB GETMET R25 R1 K83 + 0x546E003B, // 01DC LDINT R27 60 + 0x7C640400, // 01DD CALL R25 2 + 0x8C641D54, // 01DE GETMET R25 R14 K84 + 0x7C640200, // 01DF CALL R25 1 + 0x8C640D0A, // 01E0 GETMET R25 R6 K10 + 0x7C640200, // 01E1 CALL R25 1 + 0x8C68330B, // 01E2 GETMET R26 R25 K11 + 0x58700006, // 01E3 LDCONST R28 K6 + 0x88740D0C, // 01E4 GETMBR R29 R6 K12 + 0xB87A0400, // 01E5 GETNGBL R30 K2 + 0x88783D33, // 01E6 GETMBR R30 R30 K51 + 0x7C680800, // 01E7 CALL R26 4 + 0x8C68330B, // 01E8 GETMET R26 R25 K11 + 0x58700008, // 01E9 LDCONST R28 K8 + 0x88740D0C, // 01EA GETMBR R29 R6 K12 + 0x58780008, // 01EB LDCONST R30 K8 + 0x7C680800, // 01EC CALL R26 4 + 0x546A0007, // 01ED LDINT R26 8 + 0x900E0A1A, // 01EE SETMBR R3 K5 R26 + 0x80043200, // 01EF RET 1 R25 + 0x70020063, // 01F0 JMP #0255 + 0x54260008, // 01F1 LDINT R9 9 + 0x1C241009, // 01F2 EQ R9 R8 R9 + 0x7826001E, // 01F3 JMPF R9 #0213 + 0x8C240507, // 01F4 GETMET R9 R2 K7 + 0x582C0006, // 01F5 LDCONST R11 K6 + 0x7C240400, // 01F6 CALL R9 2 + 0x8C280355, // 01F7 GETMET R10 R1 K85 + 0x5C301200, // 01F8 MOVE R12 R9 + 0x7C280400, // 01F9 CALL R10 2 + 0xB82A4400, // 01FA GETNGBL R10 K34 + 0x8C281527, // 01FB GETMET R10 R10 K39 + 0x8C300B2D, // 01FC GETMET R12 R5 K45 + 0x58380056, // 01FD LDCONST R14 K86 + 0x883C0312, // 01FE GETMBR R15 R1 K18 + 0x8C3C1F57, // 01FF GETMET R15 R15 K87 + 0x7C3C0200, // 0200 CALL R15 1 + 0x8C3C1F4B, // 0201 GETMET R15 R15 K75 + 0x7C3C0200, // 0202 CALL R15 1 + 0x8C3C1F4C, // 0203 GETMET R15 R15 K76 + 0x7C3C0200, // 0204 CALL R15 1 + 0x8C3C1F29, // 0205 GETMET R15 R15 K41 + 0x7C3C0200, // 0206 CALL R15 1 + 0x60400008, // 0207 GETGBL R16 G8 + 0x5C441200, // 0208 MOVE R17 R9 + 0x7C400200, // 0209 CALL R16 1 + 0x7C300800, // 020A CALL R12 4 + 0x5834000F, // 020B LDCONST R13 K15 + 0x7C280600, // 020C CALL R10 3 + 0xB82A0400, // 020D GETNGBL R10 K2 + 0x88281533, // 020E GETMBR R10 R10 K51 + 0x900E340A, // 020F SETMBR R3 K26 R10 + 0x4C280000, // 0210 LDNIL R10 + 0x80041400, // 0211 RET 1 R10 + 0x70020041, // 0212 JMP #0255 + 0x54260009, // 0213 LDINT R9 10 + 0x1C241009, // 0214 EQ R9 R8 R9 + 0x7826003E, // 0215 JMPF R9 #0255 + 0x8C240507, // 0216 GETMET R9 R2 K7 + 0x582C0006, // 0217 LDCONST R11 K6 + 0x7C240400, // 0218 CALL R9 2 + 0x60280008, // 0219 GETGBL R10 G8 + 0x5C2C1200, // 021A MOVE R11 R9 + 0x7C280200, // 021B CALL R10 1 + 0x002AB00A, // 021C ADD R10 K88 R10 + 0x900E4E0A, // 021D SETMBR R3 K39 R10 + 0x60280010, // 021E GETGBL R10 G16 + 0x882C0116, // 021F GETMBR R11 R0 K22 + 0x882C1737, // 0220 GETMBR R11 R11 K55 + 0x8C2C1759, // 0221 GETMET R11 R11 K89 + 0x7C2C0200, // 0222 CALL R11 1 + 0x7C280200, // 0223 CALL R10 1 + 0xA802001D, // 0224 EXBLK 0 #0243 + 0x5C2C1400, // 0225 MOVE R11 R10 + 0x7C2C0000, // 0226 CALL R11 0 + 0x8C30175A, // 0227 GETMET R12 R11 K90 + 0x7C300200, // 0228 CALL R12 1 + 0x1C301809, // 0229 EQ R12 R12 R9 + 0x78320015, // 022A JMPF R12 #0241 + 0xB8324400, // 022B GETNGBL R12 K34 + 0x8C301927, // 022C GETMET R12 R12 K39 + 0x8C381757, // 022D GETMET R14 R11 K87 + 0x7C380200, // 022E CALL R14 1 + 0x8C381D4B, // 022F GETMET R14 R14 K75 + 0x7C380200, // 0230 CALL R14 1 + 0x8C381D4C, // 0231 GETMET R14 R14 K76 + 0x7C380200, // 0232 CALL R14 1 + 0x8C381D29, // 0233 GETMET R14 R14 K41 + 0x7C380200, // 0234 CALL R14 1 + 0x003AB60E, // 0235 ADD R14 K91 R14 + 0x583C000F, // 0236 LDCONST R15 K15 + 0x7C300600, // 0237 CALL R12 3 + 0xB8324400, // 0238 GETNGBL R12 K34 + 0x8C30195C, // 0239 GETMET R12 R12 K92 + 0x543A07CF, // 023A LDINT R14 2000 + 0x843C0000, // 023B CLOSURE R15 P0 + 0x7C300600, // 023C CALL R12 3 + 0x50300200, // 023D LDBOOL R12 1 0 + 0xA0000000, // 023E CLOSE R0 + 0xA8040001, // 023F EXBLK 1 1 + 0x80041800, // 0240 RET 1 R12 + 0xA0280000, // 0241 CLOSE R10 + 0x7001FFE1, // 0242 JMP #0225 + 0x5828005D, // 0243 LDCONST R10 K93 + 0xAC280200, // 0244 CATCH R10 1 0 + 0xB0080000, // 0245 RAISE 2 R0 R0 + 0xB82A4400, // 0246 GETNGBL R10 K34 + 0x8C281527, // 0247 GETMET R10 R10 K39 + 0x60300008, // 0248 GETGBL R12 G8 + 0x5C341200, // 0249 MOVE R13 R9 + 0x7C300200, // 024A CALL R12 1 + 0x0032BC0C, // 024B ADD R12 K94 R12 + 0x0030195F, // 024C ADD R12 R12 K95 + 0x5834000F, // 024D LDCONST R13 K15 + 0x7C280600, // 024E CALL R10 3 + 0xB82A0400, // 024F GETNGBL R10 K2 + 0x88281560, // 0250 GETMBR R10 R10 K96 + 0x900E340A, // 0251 SETMBR R3 K26 R10 + 0x4C280000, // 0252 LDNIL R10 + 0xA0000000, // 0253 CLOSE R0 + 0x80041400, // 0254 RET 1 R10 + 0x7002009A, // 0255 JMP #02F1 + 0x5426003B, // 0256 LDINT R9 60 + 0x1C240E09, // 0257 EQ R9 R7 R9 + 0x78260084, // 0258 JMPF R9 #02DE + 0x1C241106, // 0259 EQ R9 R8 K6 + 0x78260064, // 025A JMPF R9 #02C0 + 0x8C240507, // 025B GETMET R9 R2 K7 + 0x582C0006, // 025C LDCONST R11 K6 + 0x7C240400, // 025D CALL R9 2 + 0x8C280507, // 025E GETMET R10 R2 K7 + 0x58300008, // 025F LDCONST R12 K8 + 0x7C280400, // 0260 CALL R10 2 + 0x8C2C0507, // 0261 GETMET R11 R2 K7 + 0x5834000F, // 0262 LDCONST R13 K15 + 0x7C2C0400, // 0263 CALL R11 2 + 0x8C300507, // 0264 GETMET R12 R2 K7 + 0x58380011, // 0265 LDCONST R14 K17 + 0x7C300400, // 0266 CALL R12 2 + 0x8C340507, // 0267 GETMET R13 R2 K7 + 0x543E0003, // 0268 LDINT R15 4 + 0x7C340400, // 0269 CALL R13 2 + 0xB83A4400, // 026A GETNGBL R14 K34 + 0x8C381D27, // 026B GETMET R14 R14 K39 + 0x8C400B2D, // 026C GETMET R16 R5 K45 + 0x58480061, // 026D LDCONST R18 K97 + 0x5C4C1200, // 026E MOVE R19 R9 + 0x8C501529, // 026F GETMET R20 R10 K41 + 0x7C500200, // 0270 CALL R20 1 + 0x5C541600, // 0271 MOVE R21 R11 + 0x5C581800, // 0272 MOVE R22 R12 + 0x8C5C1B29, // 0273 GETMET R23 R13 K41 + 0x7C5C0200, // 0274 CALL R23 1 + 0x7C400E00, // 0275 CALL R16 7 + 0x5844000F, // 0276 LDCONST R17 K15 + 0x7C380600, // 0277 CALL R14 3 + 0x4C380000, // 0278 LDNIL R14 + 0x1C38120E, // 0279 EQ R14 R9 R14 + 0x743A000B, // 027A JMPT R14 #0287 + 0x4C380000, // 027B LDNIL R14 + 0x1C38140E, // 027C EQ R14 R10 R14 + 0x743A0008, // 027D JMPT R14 #0287 + 0x4C380000, // 027E LDNIL R14 + 0x1C38160E, // 027F EQ R14 R11 R14 + 0x743A0005, // 0280 JMPT R14 #0287 + 0x4C380000, // 0281 LDNIL R14 + 0x1C38180E, // 0282 EQ R14 R12 R14 + 0x743A0002, // 0283 JMPT R14 #0287 + 0x4C380000, // 0284 LDNIL R14 + 0x1C381A0E, // 0285 EQ R14 R13 R14 + 0x783A0005, // 0286 JMPF R14 #028D + 0xB83A0400, // 0287 GETNGBL R14 K2 + 0x88381D62, // 0288 GETMBR R14 R14 K98 + 0x900E340E, // 0289 SETMBR R3 K26 R14 + 0x4C380000, // 028A LDNIL R14 + 0xA0000000, // 028B CLOSE R0 + 0x80041C00, // 028C RET 1 R14 + 0x6038000C, // 028D GETGBL R14 G12 + 0x5C3C1400, // 028E MOVE R15 R10 + 0x7C380200, // 028F CALL R14 1 + 0x543E001F, // 0290 LDINT R15 32 + 0x54420040, // 0291 LDINT R16 65 + 0x003C1E10, // 0292 ADD R15 R15 R16 + 0x20381C0F, // 0293 NE R14 R14 R15 + 0x743A000B, // 0294 JMPT R14 #02A1 + 0x6038000C, // 0295 GETGBL R14 G12 + 0x5C3C1A00, // 0296 MOVE R15 R13 + 0x7C380200, // 0297 CALL R14 1 + 0x543E000F, // 0298 LDINT R15 16 + 0x14381C0F, // 0299 LT R14 R14 R15 + 0x743A0005, // 029A JMPT R14 #02A1 + 0x6038000C, // 029B GETGBL R14 G12 + 0x5C3C1A00, // 029C MOVE R15 R13 + 0x7C380200, // 029D CALL R14 1 + 0x543E001F, // 029E LDINT R15 32 + 0x24381C0F, // 029F GT R14 R14 R15 + 0x783A0009, // 02A0 JMPF R14 #02AB + 0xB83A4400, // 02A1 GETNGBL R14 K34 + 0x8C381D27, // 02A2 GETMET R14 R14 K39 + 0x58400063, // 02A3 LDCONST R16 K99 + 0x7C380400, // 02A4 CALL R14 2 + 0xB83A0400, // 02A5 GETNGBL R14 K2 + 0x88381D64, // 02A6 GETMBR R14 R14 K100 + 0x900E340E, // 02A7 SETMBR R3 K26 R14 + 0x4C380000, // 02A8 LDNIL R14 0xA0000000, // 02A9 CLOSE R0 - 0x80042000, // 02AA RET 1 R16 - 0x7002001C, // 02AB JMP #02C9 - 0x1C241108, // 02AC EQ R9 R8 K8 - 0x78260012, // 02AD JMPF R9 #02C1 - 0x8C240507, // 02AE GETMET R9 R2 K7 - 0x582C0006, // 02AF LDCONST R11 K6 - 0x7C240400, // 02B0 CALL R9 2 - 0xB82A3E00, // 02B1 GETNGBL R10 K31 - 0x8C281524, // 02B2 GETMET R10 R10 K36 - 0x60300008, // 02B3 GETGBL R12 G8 - 0x5C341200, // 02B4 MOVE R13 R9 - 0x7C300200, // 02B5 CALL R12 1 - 0x0032C00C, // 02B6 ADD R12 K96 R12 - 0x5834000F, // 02B7 LDCONST R13 K15 - 0x7C280600, // 02B8 CALL R10 3 - 0x88280115, // 02B9 GETMBR R10 R0 K21 - 0x8C281561, // 02BA GETMET R10 R10 K97 - 0x5C301200, // 02BB MOVE R12 R9 - 0x7C280400, // 02BC CALL R10 2 - 0x50280200, // 02BD LDBOOL R10 1 0 - 0xA0000000, // 02BE CLOSE R0 - 0x80041400, // 02BF RET 1 R10 - 0x70020007, // 02C0 JMP #02C9 - 0x1C24110F, // 02C1 EQ R9 R8 K15 - 0x78260005, // 02C2 JMPF R9 #02C9 - 0x88240115, // 02C3 GETMBR R9 R0 K21 - 0x8C241362, // 02C4 GETMET R9 R9 K98 - 0x7C240200, // 02C5 CALL R9 1 - 0x50240200, // 02C6 LDBOOL R9 1 0 - 0xA0000000, // 02C7 CLOSE R0 - 0x80041200, // 02C8 RET 1 R9 - 0x70020012, // 02C9 JMP #02DD - 0x54260029, // 02CA LDINT R9 42 - 0x1C240E09, // 02CB EQ R9 R7 R9 - 0x78260005, // 02CC JMPF R9 #02D3 - 0x1C241106, // 02CD EQ R9 R8 K6 - 0x78260002, // 02CE JMPF R9 #02D2 - 0x50240200, // 02CF LDBOOL R9 1 0 - 0xA0000000, // 02D0 CLOSE R0 - 0x80041200, // 02D1 RET 1 R9 - 0x70020009, // 02D2 JMP #02DD - 0x60240003, // 02D3 GETGBL R9 G3 - 0x5C280000, // 02D4 MOVE R10 R0 - 0x7C240200, // 02D5 CALL R9 1 - 0x8C241363, // 02D6 GETMET R9 R9 K99 - 0x5C2C0200, // 02D7 MOVE R11 R1 - 0x5C300400, // 02D8 MOVE R12 R2 - 0x5C340600, // 02D9 MOVE R13 R3 - 0x7C240800, // 02DA CALL R9 4 + 0x80041C00, // 02AA RET 1 R14 + 0x543A001E, // 02AB LDINT R14 31 + 0x403A0C0E, // 02AC CONNECT R14 K6 R14 + 0x9438140E, // 02AD GETIDX R14 R10 R14 + 0x543E001F, // 02AE LDINT R15 32 + 0x403C1F47, // 02AF CONNECT R15 R15 K71 + 0x943C140F, // 02B0 GETIDX R15 R10 R15 + 0x88400116, // 02B1 GETMBR R16 R0 K22 + 0x8C402165, // 02B2 GETMET R16 R16 K101 + 0x5C481200, // 02B3 MOVE R18 R9 + 0x5C4C1800, // 02B4 MOVE R19 R12 + 0x5C501600, // 02B5 MOVE R20 R11 + 0x5C541A00, // 02B6 MOVE R21 R13 + 0x5C581C00, // 02B7 MOVE R22 R14 + 0x5C5C1E00, // 02B8 MOVE R23 R15 + 0x8C600366, // 02B9 GETMET R24 R1 K102 + 0x7C600200, // 02BA CALL R24 1 + 0x7C401000, // 02BB CALL R16 8 + 0x50400200, // 02BC LDBOOL R16 1 0 + 0xA0000000, // 02BD CLOSE R0 + 0x80042000, // 02BE RET 1 R16 + 0x7002001C, // 02BF JMP #02DD + 0x1C241108, // 02C0 EQ R9 R8 K8 + 0x78260012, // 02C1 JMPF R9 #02D5 + 0x8C240507, // 02C2 GETMET R9 R2 K7 + 0x582C0006, // 02C3 LDCONST R11 K6 + 0x7C240400, // 02C4 CALL R9 2 + 0xB82A4400, // 02C5 GETNGBL R10 K34 + 0x8C281527, // 02C6 GETMET R10 R10 K39 + 0x60300008, // 02C7 GETGBL R12 G8 + 0x5C341200, // 02C8 MOVE R13 R9 + 0x7C300200, // 02C9 CALL R12 1 + 0x0032CE0C, // 02CA ADD R12 K103 R12 + 0x5834000F, // 02CB LDCONST R13 K15 + 0x7C280600, // 02CC CALL R10 3 + 0x88280116, // 02CD GETMBR R10 R0 K22 + 0x8C281568, // 02CE GETMET R10 R10 K104 + 0x5C301200, // 02CF MOVE R12 R9 + 0x7C280400, // 02D0 CALL R10 2 + 0x50280200, // 02D1 LDBOOL R10 1 0 + 0xA0000000, // 02D2 CLOSE R0 + 0x80041400, // 02D3 RET 1 R10 + 0x70020007, // 02D4 JMP #02DD + 0x1C24110F, // 02D5 EQ R9 R8 K15 + 0x78260005, // 02D6 JMPF R9 #02DD + 0x88240116, // 02D7 GETMBR R9 R0 K22 + 0x8C241369, // 02D8 GETMET R9 R9 K105 + 0x7C240200, // 02D9 CALL R9 1 + 0x50240200, // 02DA LDBOOL R9 1 0 0xA0000000, // 02DB CLOSE R0 0x80041200, // 02DC RET 1 R9 - 0xA0000000, // 02DD CLOSE R0 - 0x80000000, // 02DE RET 0 + 0x70020012, // 02DD JMP #02F1 + 0x54260029, // 02DE LDINT R9 42 + 0x1C240E09, // 02DF EQ R9 R7 R9 + 0x78260005, // 02E0 JMPF R9 #02E7 + 0x1C241106, // 02E1 EQ R9 R8 K6 + 0x78260002, // 02E2 JMPF R9 #02E6 + 0x50240200, // 02E3 LDBOOL R9 1 0 + 0xA0000000, // 02E4 CLOSE R0 + 0x80041200, // 02E5 RET 1 R9 + 0x70020009, // 02E6 JMP #02F1 + 0x60240003, // 02E7 GETGBL R9 G3 + 0x5C280000, // 02E8 MOVE R10 R0 + 0x7C240200, // 02E9 CALL R9 1 + 0x8C24136A, // 02EA GETMET R9 R9 K106 + 0x5C2C0200, // 02EB MOVE R11 R1 + 0x5C300400, // 02EC MOVE R12 R2 + 0x5C340600, // 02ED MOVE R13 R3 + 0x7C240800, // 02EE CALL R9 4 + 0xA0000000, // 02EF CLOSE R0 + 0x80041200, // 02F0 RET 1 R9 + 0xA0000000, // 02F1 CLOSE R0 + 0x80000000, // 02F2 RET 0 }) ) ); diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Session.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Session.h index d35617f1e..91b961a2c 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Session.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Session.h @@ -7,9 +7,350 @@ extern const bclass be_class_Matter_Session; /******************************************************************** -** Solidified function: get_i2r +** Solidified function: before_remove ********************************************************************/ -be_local_closure(Matter_Session_get_i2r, /* name */ +be_local_closure(Matter_Session_before_remove, /* name */ + be_nested_proto( + 8, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 7]) { /* constants */ + /* K0 */ be_nested_str_weak(string), + /* K1 */ be_nested_str_weak(tasmota), + /* K2 */ be_nested_str_weak(log), + /* K3 */ be_nested_str_weak(format), + /* K4 */ be_nested_str_weak(MTR_X3A_X20_X2DSession_X20_X20_X20_X28_X256i_X29_X20_X28removed_X29), + /* K5 */ be_nested_str_weak(local_session_id), + /* K6 */ be_const_int(3), + }), + be_str_weak(before_remove), + &be_const_str_solidified, + ( &(const binstruction[10]) { /* code */ + 0xA4060000, // 0000 IMPORT R1 K0 + 0xB80A0200, // 0001 GETNGBL R2 K1 + 0x8C080502, // 0002 GETMET R2 R2 K2 + 0x8C100303, // 0003 GETMET R4 R1 K3 + 0x58180004, // 0004 LDCONST R6 K4 + 0x881C0105, // 0005 GETMBR R7 R0 K5 + 0x7C100600, // 0006 CALL R4 3 + 0x58140006, // 0007 LDCONST R5 K6 + 0x7C080600, // 0008 CALL R2 3 + 0x80000000, // 0009 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: get_pk +********************************************************************/ +be_local_closure(Matter_Session_get_pk, /* name */ + be_nested_proto( + 5, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 5]) { /* constants */ + /* K0 */ be_nested_str_weak(_fabric), + /* K1 */ be_nested_str_weak(get_pk), + /* K2 */ be_nested_str_weak(_temp_pk), + /* K3 */ be_nested_str_weak(crypto), + /* K4 */ be_nested_str_weak(random), + }), + be_str_weak(get_pk), + &be_const_str_solidified, + ( &(const binstruction[17]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x78060004, // 0001 JMPF R1 #0007 + 0x88040100, // 0002 GETMBR R1 R0 K0 + 0x8C040301, // 0003 GETMET R1 R1 K1 + 0x7C040200, // 0004 CALL R1 1 + 0x80040200, // 0005 RET 1 R1 + 0x70020008, // 0006 JMP #0010 + 0x88040102, // 0007 GETMBR R1 R0 K2 + 0x74060004, // 0008 JMPT R1 #000E + 0xA4060600, // 0009 IMPORT R1 K3 + 0x8C080304, // 000A GETMET R2 R1 K4 + 0x5412001F, // 000B LDINT R4 32 + 0x7C080400, // 000C CALL R2 2 + 0x90020402, // 000D SETMBR R0 K2 R2 + 0x88040102, // 000E GETMBR R1 R0 K2 + 0x80040200, // 000F RET 1 R1 + 0x80000000, // 0010 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: set_mode_CASE +********************************************************************/ +be_local_closure(Matter_Session_set_mode_CASE, /* name */ + be_nested_proto( + 4, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 2]) { /* constants */ + /* K0 */ be_nested_str_weak(set_mode), + /* K1 */ be_nested_str_weak(_CASE), + }), + be_str_weak(set_mode_CASE), + &be_const_str_solidified, + ( &(const binstruction[ 4]) { /* code */ + 0x8C040100, // 0000 GETMET R1 R0 K0 + 0x880C0101, // 0001 GETMBR R3 R0 K1 + 0x7C040400, // 0002 CALL R1 2 + 0x80000000, // 0003 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: get_noc +********************************************************************/ +be_local_closure(Matter_Session_get_noc, /* name */ + be_nested_proto( + 2, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 2]) { /* constants */ + /* K0 */ be_nested_str_weak(_fabric), + /* K1 */ be_nested_str_weak(noc), + }), + be_str_weak(get_noc), + &be_const_str_solidified, + ( &(const binstruction[ 3]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x88040301, // 0001 GETMBR R1 R1 K1 + 0x80040200, // 0002 RET 1 R1 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: get_temp_ca_pub +********************************************************************/ +be_local_closure(Matter_Session_get_temp_ca_pub, /* name */ + be_nested_proto( + 6, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 5]) { /* constants */ + /* K0 */ be_nested_str_weak(_temp_root_ca_certificate), + /* K1 */ be_nested_str_weak(matter), + /* K2 */ be_nested_str_weak(TLV), + /* K3 */ be_nested_str_weak(parse), + /* K4 */ be_nested_str_weak(findsubval), + }), + be_str_weak(get_temp_ca_pub), + &be_const_str_solidified, + ( &(const binstruction[12]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x78060008, // 0001 JMPF R1 #000B + 0xB80A0200, // 0002 GETNGBL R2 K1 + 0x88080502, // 0003 GETMBR R2 R2 K2 + 0x8C080503, // 0004 GETMET R2 R2 K3 + 0x5C100200, // 0005 MOVE R4 R1 + 0x7C080400, // 0006 CALL R2 2 + 0x8C0C0504, // 0007 GETMET R3 R2 K4 + 0x54160008, // 0008 LDINT R5 9 + 0x7C0C0400, // 0009 CALL R3 2 + 0x80040600, // 000A RET 1 R3 + 0x80000000, // 000B RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: get_fabric_compressed +********************************************************************/ +be_local_closure(Matter_Session_get_fabric_compressed, /* name */ + be_nested_proto( + 2, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 2]) { /* constants */ + /* K0 */ be_nested_str_weak(_fabric), + /* K1 */ be_nested_str_weak(fabric_compressed), + }), + be_str_weak(get_fabric_compressed), + &be_const_str_solidified, + ( &(const binstruction[ 3]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x88040301, // 0001 GETMBR R1 R1 K1 + 0x80040200, // 0002 RET 1 R1 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: get_fabric_label +********************************************************************/ +be_local_closure(Matter_Session_get_fabric_label, /* name */ + be_nested_proto( + 2, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 2]) { /* constants */ + /* K0 */ be_nested_str_weak(_fabric), + /* K1 */ be_nested_str_weak(fabric_label), + }), + be_str_weak(get_fabric_label), + &be_const_str_solidified, + ( &(const binstruction[ 3]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x88040301, // 0001 GETMBR R1 R1 K1 + 0x80040200, // 0002 RET 1 R1 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: set_keys +********************************************************************/ +be_local_closure(Matter_Session_set_keys, /* name */ + be_nested_proto( + 6, /* nstack */ + 5, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 5]) { /* constants */ + /* K0 */ be_nested_str_weak(i2rkey), + /* K1 */ be_nested_str_weak(_i2r_privacy), + /* K2 */ be_nested_str_weak(r2ikey), + /* K3 */ be_nested_str_weak(attestation_challenge), + /* K4 */ be_nested_str_weak(created), + }), + be_str_weak(set_keys), + &be_const_str_solidified, + ( &(const binstruction[ 7]) { /* code */ + 0x90020001, // 0000 SETMBR R0 K0 R1 + 0x4C140000, // 0001 LDNIL R5 + 0x90020205, // 0002 SETMBR R0 K1 R5 + 0x90020402, // 0003 SETMBR R0 K2 R2 + 0x90020603, // 0004 SETMBR R0 K3 R3 + 0x90020804, // 0005 SETMBR R0 K4 R4 + 0x80000000, // 0006 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: set_mode_PASE +********************************************************************/ +be_local_closure(Matter_Session_set_mode_PASE, /* name */ + be_nested_proto( + 4, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 2]) { /* constants */ + /* K0 */ be_nested_str_weak(set_mode), + /* K1 */ be_nested_str_weak(_PASE), + }), + be_str_weak(set_mode_PASE), + &be_const_str_solidified, + ( &(const binstruction[ 4]) { /* code */ + 0x8C040100, // 0000 GETMET R1 R0 K0 + 0x880C0101, // 0001 GETMBR R3 R0 K1 + 0x7C040400, // 0002 CALL R1 2 + 0x80000000, // 0003 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: is_CASE +********************************************************************/ +be_local_closure(Matter_Session_is_CASE, /* name */ + be_nested_proto( + 3, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 2]) { /* constants */ + /* K0 */ be_nested_str_weak(mode), + /* K1 */ be_nested_str_weak(_CASE), + }), + be_str_weak(is_CASE), + &be_const_str_solidified, + ( &(const binstruction[ 4]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x88080101, // 0001 GETMBR R2 R0 K1 + 0x1C040202, // 0002 EQ R1 R1 R2 + 0x80040200, // 0003 RET 1 R1 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: get_mode +********************************************************************/ +be_local_closure(Matter_Session_get_mode, /* name */ be_nested_proto( 2, /* nstack */ 1, /* argc */ @@ -20,9 +361,36 @@ be_local_closure(Matter_Session_get_i2r, /* name */ NULL, /* no sub protos */ 1, /* has constants */ ( &(const bvalue[ 1]) { /* constants */ - /* K0 */ be_nested_str_weak(i2rkey), + /* K0 */ be_nested_str_weak(mode), }), - be_str_weak(get_i2r), + be_str_weak(get_mode), + &be_const_str_solidified, + ( &(const binstruction[ 2]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x80040200, // 0001 RET 1 R1 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: get_r2i +********************************************************************/ +be_local_closure(Matter_Session_get_r2i, /* name */ + be_nested_proto( + 2, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 1]) { /* constants */ + /* K0 */ be_nested_str_weak(r2ikey), + }), + be_str_weak(get_r2i), &be_const_str_solidified, ( &(const binstruction[ 2]) { /* code */ 0x88040100, // 0000 GETMBR R1 R0 K0 @@ -178,170 +546,9 @@ be_local_closure(Matter_Session_tojson, /* name */ /******************************************************************** -** Solidified function: assign_fabric_index +** Solidified function: get_i2r ********************************************************************/ -be_local_closure(Matter_Session_assign_fabric_index, /* name */ - be_nested_proto( - 5, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 5]) { /* constants */ - /* K0 */ be_nested_str_weak(_fabric), - /* K1 */ be_nested_str_weak(get_fabric_index), - /* K2 */ be_nested_str_weak(set_fabric_index), - /* K3 */ be_nested_str_weak(_store), - /* K4 */ be_nested_str_weak(next_fabric_idx), - }), - be_str_weak(assign_fabric_index), - &be_const_str_solidified, - ( &(const binstruction[13]) { /* code */ - 0x88040100, // 0000 GETMBR R1 R0 K0 - 0x8C040301, // 0001 GETMET R1 R1 K1 - 0x7C040200, // 0002 CALL R1 1 - 0x4C080000, // 0003 LDNIL R2 - 0x1C040202, // 0004 EQ R1 R1 R2 - 0x78060005, // 0005 JMPF R1 #000C - 0x88040100, // 0006 GETMBR R1 R0 K0 - 0x8C040302, // 0007 GETMET R1 R1 K2 - 0x880C0103, // 0008 GETMBR R3 R0 K3 - 0x8C0C0704, // 0009 GETMET R3 R3 K4 - 0x7C0C0200, // 000A CALL R3 1 - 0x7C040400, // 000B CALL R1 2 - 0x80000000, // 000C RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: persist_to_fabric -********************************************************************/ -be_local_closure(Matter_Session_persist_to_fabric, /* name */ - be_nested_proto( - 4, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 2]) { /* constants */ - /* K0 */ be_nested_str_weak(_fabric), - /* K1 */ be_nested_str_weak(add_session), - }), - be_str_weak(persist_to_fabric), - &be_const_str_solidified, - ( &(const binstruction[ 5]) { /* code */ - 0x88040100, // 0000 GETMBR R1 R0 K0 - 0x8C040301, // 0001 GETMET R1 R1 K1 - 0x5C0C0000, // 0002 MOVE R3 R0 - 0x7C040400, // 0003 CALL R1 2 - 0x80000000, // 0004 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: set_mode_PASE -********************************************************************/ -be_local_closure(Matter_Session_set_mode_PASE, /* name */ - be_nested_proto( - 4, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 2]) { /* constants */ - /* K0 */ be_nested_str_weak(set_mode), - /* K1 */ be_nested_str_weak(_PASE), - }), - be_str_weak(set_mode_PASE), - &be_const_str_solidified, - ( &(const binstruction[ 4]) { /* code */ - 0x8C040100, // 0000 GETMET R1 R0 K0 - 0x880C0101, // 0001 GETMBR R3 R0 K1 - 0x7C040400, // 0002 CALL R1 2 - 0x80000000, // 0003 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: get_fabric_label -********************************************************************/ -be_local_closure(Matter_Session_get_fabric_label, /* name */ - be_nested_proto( - 2, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 2]) { /* constants */ - /* K0 */ be_nested_str_weak(_fabric), - /* K1 */ be_nested_str_weak(fabric_label), - }), - be_str_weak(get_fabric_label), - &be_const_str_solidified, - ( &(const binstruction[ 3]) { /* code */ - 0x88040100, // 0000 GETMBR R1 R0 K0 - 0x88040301, // 0001 GETMBR R1 R1 K1 - 0x80040200, // 0002 RET 1 R1 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: get_device_id -********************************************************************/ -be_local_closure(Matter_Session_get_device_id, /* name */ - be_nested_proto( - 2, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 2]) { /* constants */ - /* K0 */ be_nested_str_weak(_fabric), - /* K1 */ be_nested_str_weak(device_id), - }), - be_str_weak(get_device_id), - &be_const_str_solidified, - ( &(const binstruction[ 3]) { /* code */ - 0x88040100, // 0000 GETMBR R1 R0 K0 - 0x88040301, // 0001 GETMBR R1 R1 K1 - 0x80040200, // 0002 RET 1 R1 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: get_r2i -********************************************************************/ -be_local_closure(Matter_Session_get_r2i, /* name */ +be_local_closure(Matter_Session_get_i2r, /* name */ be_nested_proto( 2, /* nstack */ 1, /* argc */ @@ -352,9 +559,9 @@ be_local_closure(Matter_Session_get_r2i, /* name */ NULL, /* no sub protos */ 1, /* has constants */ ( &(const bvalue[ 1]) { /* constants */ - /* K0 */ be_nested_str_weak(r2ikey), + /* K0 */ be_nested_str_weak(i2rkey), }), - be_str_weak(get_r2i), + be_str_weak(get_i2r), &be_const_str_solidified, ( &(const binstruction[ 2]) { /* code */ 0x88040100, // 0000 GETMBR R1 R0 K0 @@ -365,6 +572,427 @@ be_local_closure(Matter_Session_get_r2i, /* name */ /*******************************************************************/ +/******************************************************************** +** Solidified function: is_PASE +********************************************************************/ +be_local_closure(Matter_Session_is_PASE, /* name */ + be_nested_proto( + 3, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 2]) { /* constants */ + /* K0 */ be_nested_str_weak(mode), + /* K1 */ be_nested_str_weak(_PASE), + }), + be_str_weak(is_PASE), + &be_const_str_solidified, + ( &(const binstruction[ 4]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x88080101, // 0001 GETMBR R2 R0 K1 + 0x1C040202, // 0002 EQ R1 R1 R2 + 0x80040200, // 0003 RET 1 R1 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: gen_CSR +********************************************************************/ +be_local_closure(Matter_Session_gen_CSR, /* name */ + be_nested_proto( + 15, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[12]) { /* constants */ + /* K0 */ be_nested_str_weak(get_pk), + /* K1 */ be_nested_str_weak(crypto), + /* K2 */ be_nested_str_weak(EC_P256), + /* K3 */ be_nested_str_weak(public_key), + /* K4 */ be_nested_str_weak(3070020100300E310C300A060355040A0C034353523059301306072A8648CE3D020106082A8648CE3D030107034200), + /* K5 */ be_nested_str_weak(A000), + /* K6 */ be_nested_str_weak(300C06082A8648CE3D0403020500), + /* K7 */ be_nested_str_weak(ecdsa_sign_sha256_asn1), + /* K8 */ be_nested_str_weak(add), + /* K9 */ be_const_int(3), + /* K10 */ be_const_int(1), + /* K11 */ be_const_int(0), + }), + be_str_weak(gen_CSR), + &be_const_str_solidified, + ( &(const binstruction[73]) { /* code */ + 0x8C040100, // 0000 GETMET R1 R0 K0 + 0x7C040200, // 0001 CALL R1 1 + 0xA40A0200, // 0002 IMPORT R2 K1 + 0x8C0C0502, // 0003 GETMET R3 R2 K2 + 0x7C0C0200, // 0004 CALL R3 1 + 0x8C100703, // 0005 GETMET R4 R3 K3 + 0x5C180200, // 0006 MOVE R6 R1 + 0x7C100400, // 0007 CALL R4 2 + 0x60140015, // 0008 GETGBL R5 G21 + 0x58180004, // 0009 LDCONST R6 K4 + 0x7C140200, // 000A CALL R5 1 + 0x40180A04, // 000B CONNECT R6 R5 R4 + 0x60180015, // 000C GETGBL R6 G21 + 0x581C0005, // 000D LDCONST R7 K5 + 0x7C180200, // 000E CALL R6 1 + 0x40180A06, // 000F CONNECT R6 R5 R6 + 0x60180015, // 0010 GETGBL R6 G21 + 0x581C0006, // 0011 LDCONST R7 K6 + 0x7C180200, // 0012 CALL R6 1 + 0x8C1C0707, // 0013 GETMET R7 R3 K7 + 0x5C240200, // 0014 MOVE R9 R1 + 0x5C280A00, // 0015 MOVE R10 R5 + 0x7C1C0600, // 0016 CALL R7 3 + 0x60200015, // 0017 GETGBL R8 G21 + 0x5426007F, // 0018 LDINT R9 128 + 0x7C200200, // 0019 CALL R8 1 + 0x8C241108, // 001A GETMET R9 R8 K8 + 0x582C0009, // 001B LDCONST R11 K9 + 0x5830000A, // 001C LDCONST R12 K10 + 0x7C240600, // 001D CALL R9 3 + 0x8C241108, // 001E GETMET R9 R8 K8 + 0x602C000C, // 001F GETGBL R11 G12 + 0x5C300E00, // 0020 MOVE R12 R7 + 0x7C2C0200, // 0021 CALL R11 1 + 0x002C170A, // 0022 ADD R11 R11 K10 + 0x5830000A, // 0023 LDCONST R12 K10 + 0x7C240600, // 0024 CALL R9 3 + 0x8C241108, // 0025 GETMET R9 R8 K8 + 0x582C000B, // 0026 LDCONST R11 K11 + 0x5830000A, // 0027 LDCONST R12 K10 + 0x7C240600, // 0028 CALL R9 3 + 0x40241007, // 0029 CONNECT R9 R8 R7 + 0x6024000C, // 002A GETGBL R9 G12 + 0x5C280A00, // 002B MOVE R10 R5 + 0x7C240200, // 002C CALL R9 1 + 0x6028000C, // 002D GETGBL R10 G12 + 0x5C2C0C00, // 002E MOVE R11 R6 + 0x7C280200, // 002F CALL R10 1 + 0x0024120A, // 0030 ADD R9 R9 R10 + 0x6028000C, // 0031 GETGBL R10 G12 + 0x5C2C1000, // 0032 MOVE R11 R8 + 0x7C280200, // 0033 CALL R10 1 + 0x0024120A, // 0034 ADD R9 R9 R10 + 0x60280015, // 0035 GETGBL R10 G21 + 0x542E00CF, // 0036 LDINT R11 208 + 0x7C280200, // 0037 CALL R10 1 + 0x8C2C1508, // 0038 GETMET R11 R10 K8 + 0x5436002F, // 0039 LDINT R13 48 + 0x5838000A, // 003A LDCONST R14 K10 + 0x7C2C0600, // 003B CALL R11 3 + 0x8C2C1508, // 003C GETMET R11 R10 K8 + 0x54360080, // 003D LDINT R13 129 + 0x5838000A, // 003E LDCONST R14 K10 + 0x7C2C0600, // 003F CALL R11 3 + 0x8C2C1508, // 0040 GETMET R11 R10 K8 + 0x543600FE, // 0041 LDINT R13 255 + 0x2C34120D, // 0042 AND R13 R9 R13 + 0x5838000A, // 0043 LDCONST R14 K10 + 0x7C2C0600, // 0044 CALL R11 3 + 0x402C1405, // 0045 CONNECT R11 R10 R5 + 0x402C1406, // 0046 CONNECT R11 R10 R6 + 0x402C1408, // 0047 CONNECT R11 R10 R8 + 0x80041400, // 0048 RET 1 R10 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: get_temp_ca +********************************************************************/ +be_local_closure(Matter_Session_get_temp_ca, /* name */ + be_nested_proto( + 2, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 1]) { /* constants */ + /* K0 */ be_nested_str_weak(_temp_root_ca_certificate), + }), + be_str_weak(get_temp_ca), + &be_const_str_solidified, + ( &(const binstruction[ 2]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x80040200, // 0001 RET 1 R1 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: close +********************************************************************/ +be_local_closure(Matter_Session_close, /* name */ + be_nested_proto( + 8, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[23]) { /* constants */ + /* K0 */ be_nested_str_weak(local_session_id), + /* K1 */ be_nested_str_weak(__future_local_session_id), + /* K2 */ be_nested_str_weak(initiator_session_id), + /* K3 */ be_nested_str_weak(__future_initiator_session_id), + /* K4 */ be_nested_str_weak(_counter_rcv_impl), + /* K5 */ be_nested_str_weak(reset), + /* K6 */ be_nested_str_weak(_counter_snd_impl), + /* K7 */ be_nested_str_weak(counter_rcv), + /* K8 */ be_const_int(0), + /* K9 */ be_nested_str_weak(counter_snd), + /* K10 */ be_nested_str_weak(next), + /* K11 */ be_nested_str_weak(i2rkey), + /* K12 */ be_nested_str_weak(_i2r_privacy), + /* K13 */ be_nested_str_weak(r2ikey), + /* K14 */ be_nested_str_weak(attestation_challenge), + /* K15 */ be_nested_str_weak(introspect), + /* K16 */ be_nested_str_weak(members), + /* K17 */ be_nested_str_weak(get), + /* K18 */ be_nested_str_weak(function), + /* K19 */ be_nested_str_weak(instance), + /* K20 */ be_nested_str_weak(_), + /* K21 */ be_const_int(1), + /* K22 */ be_nested_str_weak(stop_iteration), + }), + be_str_weak(close), + &be_const_str_solidified, + ( &(const binstruction[59]) { /* code */ + 0x88040101, // 0000 GETMBR R1 R0 K1 + 0x90020001, // 0001 SETMBR R0 K0 R1 + 0x88040103, // 0002 GETMBR R1 R0 K3 + 0x90020401, // 0003 SETMBR R0 K2 R1 + 0x88040104, // 0004 GETMBR R1 R0 K4 + 0x8C040305, // 0005 GETMET R1 R1 K5 + 0x7C040200, // 0006 CALL R1 1 + 0x88040106, // 0007 GETMBR R1 R0 K6 + 0x8C040305, // 0008 GETMET R1 R1 K5 + 0x7C040200, // 0009 CALL R1 1 + 0x90020F08, // 000A SETMBR R0 K7 K8 + 0x88040106, // 000B GETMBR R1 R0 K6 + 0x8C04030A, // 000C GETMET R1 R1 K10 + 0x7C040200, // 000D CALL R1 1 + 0x90021201, // 000E SETMBR R0 K9 R1 + 0x4C040000, // 000F LDNIL R1 + 0x90021601, // 0010 SETMBR R0 K11 R1 + 0x4C040000, // 0011 LDNIL R1 + 0x90021801, // 0012 SETMBR R0 K12 R1 + 0x4C040000, // 0013 LDNIL R1 + 0x90021A01, // 0014 SETMBR R0 K13 R1 + 0x4C040000, // 0015 LDNIL R1 + 0x90021C01, // 0016 SETMBR R0 K14 R1 + 0xA4061E00, // 0017 IMPORT R1 K15 + 0x60080010, // 0018 GETGBL R2 G16 + 0x8C0C0310, // 0019 GETMET R3 R1 K16 + 0x5C140000, // 001A MOVE R5 R0 + 0x7C0C0400, // 001B CALL R3 2 + 0x7C080200, // 001C CALL R2 1 + 0xA8020018, // 001D EXBLK 0 #0037 + 0x5C0C0400, // 001E MOVE R3 R2 + 0x7C0C0000, // 001F CALL R3 0 + 0x8C100311, // 0020 GETMET R4 R1 K17 + 0x5C180000, // 0021 MOVE R6 R0 + 0x5C1C0600, // 0022 MOVE R7 R3 + 0x7C100600, // 0023 CALL R4 3 + 0x60140004, // 0024 GETGBL R5 G4 + 0x5C180800, // 0025 MOVE R6 R4 + 0x7C140200, // 0026 CALL R5 1 + 0x20140B12, // 0027 NE R5 R5 K18 + 0x7816000C, // 0028 JMPF R5 #0036 + 0x60140004, // 0029 GETGBL R5 G4 + 0x5C180800, // 002A MOVE R6 R4 + 0x7C140200, // 002B CALL R5 1 + 0x20140B13, // 002C NE R5 R5 K19 + 0x78160007, // 002D JMPF R5 #0036 + 0x94140708, // 002E GETIDX R5 R3 K8 + 0x1C140B14, // 002F EQ R5 R5 K20 + 0x78160004, // 0030 JMPF R5 #0036 + 0x94140715, // 0031 GETIDX R5 R3 K21 + 0x1C140B14, // 0032 EQ R5 R5 K20 + 0x78160001, // 0033 JMPF R5 #0036 + 0x4C140000, // 0034 LDNIL R5 + 0x90000605, // 0035 SETMBR R0 R3 R5 + 0x7001FFE6, // 0036 JMP #001E + 0x58080016, // 0037 LDCONST R2 K22 + 0xAC080200, // 0038 CATCH R2 1 0 + 0xB0080000, // 0039 RAISE 2 R0 R0 + 0x80000000, // 003A RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: update +********************************************************************/ +be_local_closure(Matter_Session_update, /* name */ + be_nested_proto( + 3, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 4]) { /* constants */ + /* K0 */ be_nested_str_weak(last_used), + /* K1 */ be_nested_str_weak(tasmota), + /* K2 */ be_nested_str_weak(rtc), + /* K3 */ be_nested_str_weak(utc), + }), + be_str_weak(update), + &be_const_str_solidified, + ( &(const binstruction[ 6]) { /* code */ + 0xB8060200, // 0000 GETNGBL R1 K1 + 0x8C040302, // 0001 GETMET R1 R1 K2 + 0x7C040200, // 0002 CALL R1 1 + 0x94040303, // 0003 GETIDX R1 R1 K3 + 0x90020001, // 0004 SETMBR R0 K0 R1 + 0x80000000, // 0005 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: get_admin_vendor +********************************************************************/ +be_local_closure(Matter_Session_get_admin_vendor, /* name */ + be_nested_proto( + 2, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 2]) { /* constants */ + /* K0 */ be_nested_str_weak(_fabric), + /* K1 */ be_nested_str_weak(admin_vendor), + }), + be_str_weak(get_admin_vendor), + &be_const_str_solidified, + ( &(const binstruction[ 3]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x88040301, // 0001 GETMBR R1 R1 K1 + 0x80040200, // 0002 RET 1 R1 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: get_fabric +********************************************************************/ +be_local_closure(Matter_Session_get_fabric, /* name */ + be_nested_proto( + 2, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 1]) { /* constants */ + /* K0 */ be_nested_str_weak(_fabric), + }), + be_str_weak(get_fabric), + &be_const_str_solidified, + ( &(const binstruction[ 2]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x80040200, // 0001 RET 1 R1 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: get_admin_subject +********************************************************************/ +be_local_closure(Matter_Session_get_admin_subject, /* name */ + be_nested_proto( + 2, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 2]) { /* constants */ + /* K0 */ be_nested_str_weak(_fabric), + /* K1 */ be_nested_str_weak(admin_subject), + }), + be_str_weak(get_admin_subject), + &be_const_str_solidified, + ( &(const binstruction[ 3]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x88040301, // 0001 GETMBR R1 R1 K1 + 0x80040200, // 0002 RET 1 R1 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: get_ipk_group_key +********************************************************************/ +be_local_closure(Matter_Session_get_ipk_group_key, /* name */ + be_nested_proto( + 3, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 2]) { /* constants */ + /* K0 */ be_nested_str_weak(_fabric), + /* K1 */ be_nested_str_weak(get_ipk_group_key), + }), + be_str_weak(get_ipk_group_key), + &be_const_str_solidified, + ( &(const binstruction[ 4]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x8C040301, // 0001 GETMET R1 R1 K1 + 0x7C040200, // 0002 CALL R1 1 + 0x80040200, // 0003 RET 1 R1 + }) + ) +); +/*******************************************************************/ + + /******************************************************************** ** Solidified function: init ********************************************************************/ @@ -378,7 +1006,7 @@ be_local_closure(Matter_Session_init, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[24]) { /* constants */ + ( &(const bvalue[23]) { /* constants */ /* K0 */ be_nested_str_weak(crypto), /* K1 */ be_nested_str_weak(_store), /* K2 */ be_nested_str_weak(mode), @@ -401,12 +1029,11 @@ be_local_closure(Matter_Session_init, /* name */ /* K19 */ be_const_int(2), /* K20 */ be_nested_str_weak(get), /* K21 */ be_nested_str_weak(_fabric), - /* K22 */ be_nested_str_weak(create_fabric), - /* K23 */ be_nested_str_weak(update), + /* K22 */ be_nested_str_weak(update), }), be_str_weak(init), &be_const_str_solidified, - ( &(const binstruction[47]) { /* code */ + ( &(const binstruction[41]) { /* code */ 0xA4160000, // 0000 IMPORT R5 K0 0x90020201, // 0001 SETMBR R0 K1 R1 0x90020503, // 0002 SETMBR R0 K2 K3 @@ -444,16 +1071,10 @@ be_local_closure(Matter_Session_init, /* name */ 0x58240013, // 0022 LDCONST R9 K19 0x7C180600, // 0023 CALL R6 3 0x90022206, // 0024 SETMBR R0 K17 R6 - 0x78120001, // 0025 JMPF R4 #0028 - 0x5C180800, // 0026 MOVE R6 R4 - 0x70020002, // 0027 JMP #002B - 0x88180101, // 0028 GETMBR R6 R0 K1 - 0x8C180D16, // 0029 GETMET R6 R6 K22 - 0x7C180200, // 002A CALL R6 1 - 0x90022A06, // 002B SETMBR R0 K21 R6 - 0x8C180117, // 002C GETMET R6 R0 K23 - 0x7C180200, // 002D CALL R6 1 - 0x80000000, // 002E RET 0 + 0x90022A04, // 0025 SETMBR R0 K21 R4 + 0x8C180116, // 0026 GETMET R6 R0 K22 + 0x7C180200, // 0027 CALL R6 1 + 0x80000000, // 0028 RET 0 }) ) ); @@ -461,9 +1082,9 @@ be_local_closure(Matter_Session_init, /* name */ /******************************************************************** -** Solidified function: get_mode +** Solidified function: get_device_id ********************************************************************/ -be_local_closure(Matter_Session_get_mode, /* name */ +be_local_closure(Matter_Session_get_device_id, /* name */ be_nested_proto( 2, /* nstack */ 1, /* argc */ @@ -473,14 +1094,98 @@ be_local_closure(Matter_Session_get_mode, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[ 1]) { /* constants */ - /* K0 */ be_nested_str_weak(mode), + ( &(const bvalue[ 2]) { /* constants */ + /* K0 */ be_nested_str_weak(_fabric), + /* K1 */ be_nested_str_weak(device_id), }), - be_str_weak(get_mode), + be_str_weak(get_device_id), &be_const_str_solidified, - ( &(const binstruction[ 2]) { /* code */ + ( &(const binstruction[ 3]) { /* code */ 0x88040100, // 0000 GETMBR R1 R0 K0 - 0x80040200, // 0001 RET 1 R1 + 0x88040301, // 0001 GETMBR R1 R1 K1 + 0x80040200, // 0002 RET 1 R1 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: set_fabric_label +********************************************************************/ +be_local_closure(Matter_Session_set_fabric_label, /* name */ + be_nested_proto( + 4, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 3]) { /* constants */ + /* K0 */ be_nested_str_weak(string), + /* K1 */ be_nested_str_weak(_fabric), + /* K2 */ be_nested_str_weak(fabric_label), + }), + be_str_weak(set_fabric_label), + &be_const_str_solidified, + ( &(const binstruction[ 8]) { /* code */ + 0x60080004, // 0000 GETGBL R2 G4 + 0x5C0C0200, // 0001 MOVE R3 R1 + 0x7C080200, // 0002 CALL R2 1 + 0x1C080500, // 0003 EQ R2 R2 K0 + 0x780A0001, // 0004 JMPF R2 #0007 + 0x88080101, // 0005 GETMBR R2 R0 K1 + 0x900A0401, // 0006 SETMBR R2 K2 R1 + 0x80000000, // 0007 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: hydrate_post +********************************************************************/ +be_local_closure(Matter_Session_hydrate_post, /* name */ + be_nested_proto( + 4, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 6]) { /* constants */ + /* K0 */ be_nested_str_weak(_counter_snd_impl), + /* K1 */ be_nested_str_weak(reset), + /* K2 */ be_nested_str_weak(counter_snd), + /* K3 */ be_nested_str_weak(_counter_rcv_impl), + /* K4 */ be_nested_str_weak(counter_rcv), + /* K5 */ be_nested_str_weak(val), + }), + be_str_weak(hydrate_post), + &be_const_str_solidified, + ( &(const binstruction[17]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x8C040301, // 0001 GETMET R1 R1 K1 + 0x880C0102, // 0002 GETMBR R3 R0 K2 + 0x7C040400, // 0003 CALL R1 2 + 0x88040103, // 0004 GETMBR R1 R0 K3 + 0x8C040301, // 0005 GETMET R1 R1 K1 + 0x880C0104, // 0006 GETMBR R3 R0 K4 + 0x7C040400, // 0007 CALL R1 2 + 0x88040100, // 0008 GETMBR R1 R0 K0 + 0x8C040305, // 0009 GETMET R1 R1 K5 + 0x7C040200, // 000A CALL R1 1 + 0x90020401, // 000B SETMBR R0 K2 R1 + 0x88040103, // 000C GETMBR R1 R0 K3 + 0x8C040305, // 000D GETMET R1 R1 K5 + 0x7C040200, // 000E CALL R1 1 + 0x90020801, // 000F SETMBR R0 K4 R1 + 0x80000000, // 0010 RET 0 }) ) ); @@ -603,65 +1308,6 @@ be_local_closure(Matter_Session_fromjson, /* name */ /*******************************************************************/ -/******************************************************************** -** Solidified function: is_PASE -********************************************************************/ -be_local_closure(Matter_Session_is_PASE, /* name */ - be_nested_proto( - 3, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 2]) { /* constants */ - /* K0 */ be_nested_str_weak(mode), - /* K1 */ be_nested_str_weak(_PASE), - }), - be_str_weak(is_PASE), - &be_const_str_solidified, - ( &(const binstruction[ 4]) { /* code */ - 0x88040100, // 0000 GETMBR R1 R0 K0 - 0x88080101, // 0001 GETMBR R2 R0 K1 - 0x1C040202, // 0002 EQ R1 R1 R2 - 0x80040200, // 0003 RET 1 R1 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: get_admin_subject -********************************************************************/ -be_local_closure(Matter_Session_get_admin_subject, /* name */ - be_nested_proto( - 2, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 2]) { /* constants */ - /* K0 */ be_nested_str_weak(_fabric), - /* K1 */ be_nested_str_weak(admin_subject), - }), - be_str_weak(get_admin_subject), - &be_const_str_solidified, - ( &(const binstruction[ 3]) { /* code */ - 0x88040100, // 0000 GETMBR R1 R0 K0 - 0x88040301, // 0001 GETMBR R1 R1 K1 - 0x80040200, // 0002 RET 1 R1 - }) - ) -); -/*******************************************************************/ - - /******************************************************************** ** Solidified function: save ********************************************************************/ @@ -693,9 +1339,9 @@ be_local_closure(Matter_Session_save, /* name */ /******************************************************************** -** Solidified function: get_ipk_epoch_key +** Solidified function: get_fabric_id ********************************************************************/ -be_local_closure(Matter_Session_get_ipk_epoch_key, /* name */ +be_local_closure(Matter_Session_get_fabric_id, /* name */ be_nested_proto( 2, /* nstack */ 1, /* argc */ @@ -707,9 +1353,9 @@ be_local_closure(Matter_Session_get_ipk_epoch_key, /* name */ 1, /* has constants */ ( &(const bvalue[ 2]) { /* constants */ /* K0 */ be_nested_str_weak(_fabric), - /* K1 */ be_nested_str_weak(ipk_epoch_key), + /* K1 */ be_nested_str_weak(fabric_id), }), - be_str_weak(get_ipk_epoch_key), + be_str_weak(get_fabric_id), &be_const_str_solidified, ( &(const binstruction[ 3]) { /* code */ 0x88040100, // 0000 GETMBR R1 R0 K0 @@ -722,29 +1368,26 @@ be_local_closure(Matter_Session_get_ipk_epoch_key, /* name */ /******************************************************************** -** Solidified function: is_CASE +** Solidified function: set_mode ********************************************************************/ -be_local_closure(Matter_Session_is_CASE, /* name */ +be_local_closure(Matter_Session_set_mode, /* name */ be_nested_proto( - 3, /* nstack */ - 1, /* argc */ + 2, /* nstack */ + 2, /* argc */ 2, /* varg */ 0, /* has upvals */ NULL, /* no upvals */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[ 2]) { /* constants */ + ( &(const bvalue[ 1]) { /* constants */ /* K0 */ be_nested_str_weak(mode), - /* K1 */ be_nested_str_weak(_CASE), }), - be_str_weak(is_CASE), + be_str_weak(set_mode), &be_const_str_solidified, - ( &(const binstruction[ 4]) { /* code */ - 0x88040100, // 0000 GETMBR R1 R0 K0 - 0x88080101, // 0001 GETMBR R2 R0 K1 - 0x1C040202, // 0002 EQ R1 R1 R2 - 0x80040200, // 0003 RET 1 R1 + ( &(const binstruction[ 2]) { /* code */ + 0x90020001, // 0000 SETMBR R0 K0 R1 + 0x80000000, // 0001 RET 0 }) ) ); @@ -752,39 +1395,26 @@ be_local_closure(Matter_Session_is_CASE, /* name */ /******************************************************************** -** Solidified function: fabric_candidate +** Solidified function: set_temp_ca ********************************************************************/ -be_local_closure(Matter_Session_fabric_candidate, /* name */ +be_local_closure(Matter_Session_set_temp_ca, /* name */ be_nested_proto( - 4, /* nstack */ - 1, /* argc */ + 2, /* nstack */ + 2, /* argc */ 2, /* varg */ 0, /* has upvals */ NULL, /* no upvals */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[ 5]) { /* constants */ - /* K0 */ be_nested_str_weak(_fabric), - /* K1 */ be_nested_str_weak(set_expire_in_seconds), - /* K2 */ be_nested_str_weak(assign_fabric_index), - /* K3 */ be_nested_str_weak(_store), - /* K4 */ be_nested_str_weak(add_fabric), + ( &(const bvalue[ 1]) { /* constants */ + /* K0 */ be_nested_str_weak(_temp_root_ca_certificate), }), - be_str_weak(fabric_candidate), + be_str_weak(set_temp_ca), &be_const_str_solidified, - ( &(const binstruction[11]) { /* code */ - 0x88040100, // 0000 GETMBR R1 R0 K0 - 0x8C040301, // 0001 GETMET R1 R1 K1 - 0x540E0077, // 0002 LDINT R3 120 - 0x7C040400, // 0003 CALL R1 2 - 0x8C040102, // 0004 GETMET R1 R0 K2 - 0x7C040200, // 0005 CALL R1 1 - 0x88040103, // 0006 GETMBR R1 R0 K3 - 0x8C040304, // 0007 GETMET R1 R1 K4 - 0x880C0100, // 0008 GETMBR R3 R0 K0 - 0x7C040400, // 0009 CALL R1 2 - 0x80000000, // 000A RET 0 + ( &(const binstruction[ 2]) { /* code */ + 0x90020001, // 0000 SETMBR R0 K0 R1 + 0x80000000, // 0001 RET 0 }) ) ); @@ -792,11 +1422,11 @@ be_local_closure(Matter_Session_fabric_candidate, /* name */ /******************************************************************** -** Solidified function: get_ipk_group_key +** Solidified function: get_i2r_privacy ********************************************************************/ -be_local_closure(Matter_Session_get_ipk_group_key, /* name */ +be_local_closure(Matter_Session_get_i2r_privacy, /* name */ be_nested_proto( - 10, /* nstack */ + 9, /* nstack */ 1, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -805,46 +1435,39 @@ be_local_closure(Matter_Session_get_ipk_group_key, /* name */ NULL, /* no sub protos */ 1, /* has constants */ ( &(const bvalue[ 7]) { /* constants */ - /* K0 */ be_nested_str_weak(get_ipk_epoch_key), - /* K1 */ be_nested_str_weak(get_fabric_compressed), - /* K2 */ be_nested_str_weak(crypto), - /* K3 */ be_nested_str_weak(HKDF_SHA256), - /* K4 */ be_nested_str_weak(fromstring), - /* K5 */ be_nested_str_weak(_GROUP_KEY), - /* K6 */ be_nested_str_weak(derive), + /* K0 */ be_nested_str_weak(_i2r_privacy), + /* K1 */ be_nested_str_weak(crypto), + /* K2 */ be_nested_str_weak(HKDF_SHA256), + /* K3 */ be_nested_str_weak(derive), + /* K4 */ be_nested_str_weak(get_i2r), + /* K5 */ be_nested_str_weak(fromstring), + /* K6 */ be_nested_str_weak(PrivacyKey), }), - be_str_weak(get_ipk_group_key), + be_str_weak(get_i2r_privacy), &be_const_str_solidified, - ( &(const binstruction[29]) { /* code */ - 0x8C040100, // 0000 GETMET R1 R0 K0 - 0x7C040200, // 0001 CALL R1 1 - 0x4C080000, // 0002 LDNIL R2 - 0x1C040202, // 0003 EQ R1 R1 R2 - 0x74060004, // 0004 JMPT R1 #000A - 0x8C040101, // 0005 GETMET R1 R0 K1 - 0x7C040200, // 0006 CALL R1 1 - 0x4C080000, // 0007 LDNIL R2 - 0x1C040202, // 0008 EQ R1 R1 R2 - 0x78060001, // 0009 JMPF R1 #000C - 0x4C040000, // 000A LDNIL R1 - 0x80040200, // 000B RET 1 R1 - 0xA4060400, // 000C IMPORT R1 K2 - 0x8C080303, // 000D GETMET R2 R1 K3 - 0x7C080200, // 000E CALL R2 1 - 0x600C0015, // 000F GETGBL R3 G21 - 0x7C0C0000, // 0010 CALL R3 0 - 0x8C0C0704, // 0011 GETMET R3 R3 K4 - 0x88140105, // 0012 GETMBR R5 R0 K5 - 0x7C0C0400, // 0013 CALL R3 2 - 0x8C100506, // 0014 GETMET R4 R2 K6 - 0x8C180100, // 0015 GETMET R6 R0 K0 - 0x7C180200, // 0016 CALL R6 1 - 0x8C1C0101, // 0017 GETMET R7 R0 K1 - 0x7C1C0200, // 0018 CALL R7 1 - 0x5C200600, // 0019 MOVE R8 R3 - 0x5426000F, // 001A LDINT R9 16 - 0x7C100A00, // 001B CALL R4 5 - 0x80040800, // 001C RET 1 R4 + ( &(const binstruction[22]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x4C080000, // 0001 LDNIL R2 + 0x1C040202, // 0002 EQ R1 R1 R2 + 0x7806000F, // 0003 JMPF R1 #0014 + 0xA4060200, // 0004 IMPORT R1 K1 + 0x8C080302, // 0005 GETMET R2 R1 K2 + 0x7C080200, // 0006 CALL R2 1 + 0x8C080503, // 0007 GETMET R2 R2 K3 + 0x8C100104, // 0008 GETMET R4 R0 K4 + 0x7C100200, // 0009 CALL R4 1 + 0x60140015, // 000A GETGBL R5 G21 + 0x7C140000, // 000B CALL R5 0 + 0x60180015, // 000C GETGBL R6 G21 + 0x7C180000, // 000D CALL R6 0 + 0x8C180D05, // 000E GETMET R6 R6 K5 + 0x58200006, // 000F LDCONST R8 K6 + 0x7C180400, // 0010 CALL R6 2 + 0x541E000F, // 0011 LDINT R7 16 + 0x7C080A00, // 0012 CALL R2 5 + 0x90020002, // 0013 SETMBR R0 K0 R2 + 0x88040100, // 0014 GETMBR R1 R0 K0 + 0x80040200, // 0015 RET 1 R1 }) ) ); @@ -852,9 +1475,9 @@ be_local_closure(Matter_Session_get_ipk_group_key, /* name */ /******************************************************************** -** Solidified function: get_noc +** Solidified function: get_ca ********************************************************************/ -be_local_closure(Matter_Session_get_noc, /* name */ +be_local_closure(Matter_Session_get_ca, /* name */ be_nested_proto( 2, /* nstack */ 1, /* argc */ @@ -866,9 +1489,9 @@ be_local_closure(Matter_Session_get_noc, /* name */ 1, /* has constants */ ( &(const bvalue[ 2]) { /* constants */ /* K0 */ be_nested_str_weak(_fabric), - /* K1 */ be_nested_str_weak(noc), + /* K1 */ be_nested_str_weak(root_ca_certificate), }), - be_str_weak(get_noc), + be_str_weak(get_ca), &be_const_str_solidified, ( &(const binstruction[ 3]) { /* code */ 0x88040100, // 0000 GETMBR R1 R0 K0 @@ -881,11 +1504,11 @@ be_local_closure(Matter_Session_get_noc, /* name */ /******************************************************************** -** Solidified function: fabric_completed +** Solidified function: get_ac ********************************************************************/ -be_local_closure(Matter_Session_fabric_completed, /* name */ +be_local_closure(Matter_Session_get_ac, /* name */ be_nested_proto( - 4, /* nstack */ + 2, /* nstack */ 1, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -893,67 +1516,14 @@ be_local_closure(Matter_Session_fabric_completed, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[ 6]) { /* constants */ - /* K0 */ be_nested_str_weak(_fabric), - /* K1 */ be_nested_str_weak(set_no_expiration), - /* K2 */ be_nested_str_weak(set_persist), - /* K3 */ be_nested_str_weak(assign_fabric_index), - /* K4 */ be_nested_str_weak(_store), - /* K5 */ be_nested_str_weak(add_fabric), + ( &(const bvalue[ 1]) { /* constants */ + /* K0 */ be_nested_str_weak(attestation_challenge), }), - be_str_weak(fabric_completed), + be_str_weak(get_ac), &be_const_str_solidified, - ( &(const binstruction[14]) { /* code */ + ( &(const binstruction[ 2]) { /* code */ 0x88040100, // 0000 GETMBR R1 R0 K0 - 0x8C040301, // 0001 GETMET R1 R1 K1 - 0x7C040200, // 0002 CALL R1 1 - 0x88040100, // 0003 GETMBR R1 R0 K0 - 0x8C040302, // 0004 GETMET R1 R1 K2 - 0x500C0200, // 0005 LDBOOL R3 1 0 - 0x7C040400, // 0006 CALL R1 2 - 0x8C040103, // 0007 GETMET R1 R0 K3 - 0x7C040200, // 0008 CALL R1 1 - 0x88040104, // 0009 GETMBR R1 R0 K4 - 0x8C040305, // 000A GETMET R1 R1 K5 - 0x880C0100, // 000B GETMBR R3 R0 K0 - 0x7C040400, // 000C CALL R1 2 - 0x80000000, // 000D RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: set_keys -********************************************************************/ -be_local_closure(Matter_Session_set_keys, /* name */ - be_nested_proto( - 6, /* nstack */ - 5, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 5]) { /* constants */ - /* K0 */ be_nested_str_weak(i2rkey), - /* K1 */ be_nested_str_weak(_i2r_privacy), - /* K2 */ be_nested_str_weak(r2ikey), - /* K3 */ be_nested_str_weak(attestation_challenge), - /* K4 */ be_nested_str_weak(created), - }), - be_str_weak(set_keys), - &be_const_str_solidified, - ( &(const binstruction[ 7]) { /* code */ - 0x90020001, // 0000 SETMBR R0 K0 R1 - 0x4C140000, // 0001 LDNIL R5 - 0x90020205, // 0002 SETMBR R0 K1 R5 - 0x90020402, // 0003 SETMBR R0 K2 R2 - 0x90020603, // 0004 SETMBR R0 K3 R3 - 0x90020804, // 0005 SETMBR R0 K4 R4 - 0x80000000, // 0006 RET 0 + 0x80040200, // 0001 RET 1 R1 }) ) ); @@ -1027,893 +1597,6 @@ be_local_closure(Matter_Session_counter_snd_next, /* name */ /*******************************************************************/ -/******************************************************************** -** Solidified function: get_fabric_id -********************************************************************/ -be_local_closure(Matter_Session_get_fabric_id, /* name */ - be_nested_proto( - 2, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 2]) { /* constants */ - /* K0 */ be_nested_str_weak(_fabric), - /* K1 */ be_nested_str_weak(fabric_id), - }), - be_str_weak(get_fabric_id), - &be_const_str_solidified, - ( &(const binstruction[ 3]) { /* code */ - 0x88040100, // 0000 GETMBR R1 R0 K0 - 0x88040301, // 0001 GETMBR R1 R1 K1 - 0x80040200, // 0002 RET 1 R1 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: set_ca -********************************************************************/ -be_local_closure(Matter_Session_set_ca, /* name */ - be_nested_proto( - 3, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 2]) { /* constants */ - /* K0 */ be_nested_str_weak(_fabric), - /* K1 */ be_nested_str_weak(root_ca_certificate), - }), - be_str_weak(set_ca), - &be_const_str_solidified, - ( &(const binstruction[ 3]) { /* code */ - 0x88080100, // 0000 GETMBR R2 R0 K0 - 0x900A0201, // 0001 SETMBR R2 K1 R1 - 0x80000000, // 0002 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: set_fabric_label -********************************************************************/ -be_local_closure(Matter_Session_set_fabric_label, /* name */ - be_nested_proto( - 4, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 3]) { /* constants */ - /* K0 */ be_nested_str_weak(string), - /* K1 */ be_nested_str_weak(_fabric), - /* K2 */ be_nested_str_weak(fabric_label), - }), - be_str_weak(set_fabric_label), - &be_const_str_solidified, - ( &(const binstruction[ 8]) { /* code */ - 0x60080004, // 0000 GETGBL R2 G4 - 0x5C0C0200, // 0001 MOVE R3 R1 - 0x7C080200, // 0002 CALL R2 1 - 0x1C080500, // 0003 EQ R2 R2 K0 - 0x780A0001, // 0004 JMPF R2 #0007 - 0x88080101, // 0005 GETMBR R2 R0 K1 - 0x900A0401, // 0006 SETMBR R2 K2 R1 - 0x80000000, // 0007 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: get_ca -********************************************************************/ -be_local_closure(Matter_Session_get_ca, /* name */ - be_nested_proto( - 2, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 2]) { /* constants */ - /* K0 */ be_nested_str_weak(_fabric), - /* K1 */ be_nested_str_weak(root_ca_certificate), - }), - be_str_weak(get_ca), - &be_const_str_solidified, - ( &(const binstruction[ 3]) { /* code */ - 0x88040100, // 0000 GETMBR R1 R0 K0 - 0x88040301, // 0001 GETMBR R1 R1 K1 - 0x80040200, // 0002 RET 1 R1 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: set_mode -********************************************************************/ -be_local_closure(Matter_Session_set_mode, /* name */ - be_nested_proto( - 2, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 1]) { /* constants */ - /* K0 */ be_nested_str_weak(mode), - }), - be_str_weak(set_mode), - &be_const_str_solidified, - ( &(const binstruction[ 2]) { /* code */ - 0x90020001, // 0000 SETMBR R0 K0 R1 - 0x80000000, // 0001 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: get_ac -********************************************************************/ -be_local_closure(Matter_Session_get_ac, /* name */ - be_nested_proto( - 2, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 1]) { /* constants */ - /* K0 */ be_nested_str_weak(attestation_challenge), - }), - be_str_weak(get_ac), - &be_const_str_solidified, - ( &(const binstruction[ 2]) { /* code */ - 0x88040100, // 0000 GETMBR R1 R0 K0 - 0x80040200, // 0001 RET 1 R1 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: hydrate_post -********************************************************************/ -be_local_closure(Matter_Session_hydrate_post, /* name */ - be_nested_proto( - 4, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 6]) { /* constants */ - /* K0 */ be_nested_str_weak(_counter_snd_impl), - /* K1 */ be_nested_str_weak(reset), - /* K2 */ be_nested_str_weak(counter_snd), - /* K3 */ be_nested_str_weak(_counter_rcv_impl), - /* K4 */ be_nested_str_weak(counter_rcv), - /* K5 */ be_nested_str_weak(val), - }), - be_str_weak(hydrate_post), - &be_const_str_solidified, - ( &(const binstruction[17]) { /* code */ - 0x88040100, // 0000 GETMBR R1 R0 K0 - 0x8C040301, // 0001 GETMET R1 R1 K1 - 0x880C0102, // 0002 GETMBR R3 R0 K2 - 0x7C040400, // 0003 CALL R1 2 - 0x88040103, // 0004 GETMBR R1 R0 K3 - 0x8C040301, // 0005 GETMET R1 R1 K1 - 0x880C0104, // 0006 GETMBR R3 R0 K4 - 0x7C040400, // 0007 CALL R1 2 - 0x88040100, // 0008 GETMBR R1 R0 K0 - 0x8C040305, // 0009 GETMET R1 R1 K5 - 0x7C040200, // 000A CALL R1 1 - 0x90020401, // 000B SETMBR R0 K2 R1 - 0x88040103, // 000C GETMBR R1 R0 K3 - 0x8C040305, // 000D GETMET R1 R1 K5 - 0x7C040200, // 000E CALL R1 1 - 0x90020801, // 000F SETMBR R0 K4 R1 - 0x80000000, // 0010 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: get_icac -********************************************************************/ -be_local_closure(Matter_Session_get_icac, /* name */ - be_nested_proto( - 2, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 2]) { /* constants */ - /* K0 */ be_nested_str_weak(_fabric), - /* K1 */ be_nested_str_weak(icac), - }), - be_str_weak(get_icac), - &be_const_str_solidified, - ( &(const binstruction[ 3]) { /* code */ - 0x88040100, // 0000 GETMBR R1 R0 K0 - 0x88040301, // 0001 GETMBR R1 R1 K1 - 0x80040200, // 0002 RET 1 R1 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: set_admin_subject_vendor -********************************************************************/ -be_local_closure(Matter_Session_set_admin_subject_vendor, /* name */ - be_nested_proto( - 4, /* nstack */ - 3, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 3]) { /* constants */ - /* K0 */ be_nested_str_weak(_fabric), - /* K1 */ be_nested_str_weak(admin_subject), - /* K2 */ be_nested_str_weak(admin_vendor), - }), - be_str_weak(set_admin_subject_vendor), - &be_const_str_solidified, - ( &(const binstruction[ 5]) { /* code */ - 0x880C0100, // 0000 GETMBR R3 R0 K0 - 0x900E0201, // 0001 SETMBR R3 K1 R1 - 0x880C0100, // 0002 GETMBR R3 R0 K0 - 0x900E0402, // 0003 SETMBR R3 K2 R2 - 0x80000000, // 0004 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: set_ipk_epoch_key -********************************************************************/ -be_local_closure(Matter_Session_set_ipk_epoch_key, /* name */ - be_nested_proto( - 3, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 2]) { /* constants */ - /* K0 */ be_nested_str_weak(_fabric), - /* K1 */ be_nested_str_weak(ipk_epoch_key), - }), - be_str_weak(set_ipk_epoch_key), - &be_const_str_solidified, - ( &(const binstruction[ 3]) { /* code */ - 0x88080100, // 0000 GETMBR R2 R0 K0 - 0x900A0201, // 0001 SETMBR R2 K1 R1 - 0x80000000, // 0002 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: before_remove -********************************************************************/ -be_local_closure(Matter_Session_before_remove, /* name */ - be_nested_proto( - 8, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 7]) { /* constants */ - /* K0 */ be_nested_str_weak(string), - /* K1 */ be_nested_str_weak(tasmota), - /* K2 */ be_nested_str_weak(log), - /* K3 */ be_nested_str_weak(format), - /* K4 */ be_nested_str_weak(MTR_X3A_X20_X2DSession_X20_X20_X20_X28_X256i_X29_X20_X28removed_X29), - /* K5 */ be_nested_str_weak(local_session_id), - /* K6 */ be_const_int(3), - }), - be_str_weak(before_remove), - &be_const_str_solidified, - ( &(const binstruction[10]) { /* code */ - 0xA4060000, // 0000 IMPORT R1 K0 - 0xB80A0200, // 0001 GETNGBL R2 K1 - 0x8C080502, // 0002 GETMET R2 R2 K2 - 0x8C100303, // 0003 GETMET R4 R1 K3 - 0x58180004, // 0004 LDCONST R6 K4 - 0x881C0105, // 0005 GETMBR R7 R0 K5 - 0x7C100600, // 0006 CALL R4 3 - 0x58140006, // 0007 LDCONST R5 K6 - 0x7C080600, // 0008 CALL R2 3 - 0x80000000, // 0009 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: update -********************************************************************/ -be_local_closure(Matter_Session_update, /* name */ - be_nested_proto( - 3, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 4]) { /* constants */ - /* K0 */ be_nested_str_weak(last_used), - /* K1 */ be_nested_str_weak(tasmota), - /* K2 */ be_nested_str_weak(rtc), - /* K3 */ be_nested_str_weak(utc), - }), - be_str_weak(update), - &be_const_str_solidified, - ( &(const binstruction[ 6]) { /* code */ - 0xB8060200, // 0000 GETNGBL R1 K1 - 0x8C040302, // 0001 GETMET R1 R1 K2 - 0x7C040200, // 0002 CALL R1 1 - 0x94040303, // 0003 GETIDX R1 R1 K3 - 0x90020001, // 0004 SETMBR R0 K0 R1 - 0x80000000, // 0005 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: set_mode_CASE -********************************************************************/ -be_local_closure(Matter_Session_set_mode_CASE, /* name */ - be_nested_proto( - 4, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 2]) { /* constants */ - /* K0 */ be_nested_str_weak(set_mode), - /* K1 */ be_nested_str_weak(_CASE), - }), - be_str_weak(set_mode_CASE), - &be_const_str_solidified, - ( &(const binstruction[ 4]) { /* code */ - 0x8C040100, // 0000 GETMET R1 R0 K0 - 0x880C0101, // 0001 GETMBR R3 R0 K1 - 0x7C040400, // 0002 CALL R1 2 - 0x80000000, // 0003 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: get_i2r_privacy -********************************************************************/ -be_local_closure(Matter_Session_get_i2r_privacy, /* name */ - be_nested_proto( - 9, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 7]) { /* constants */ - /* K0 */ be_nested_str_weak(_i2r_privacy), - /* K1 */ be_nested_str_weak(crypto), - /* K2 */ be_nested_str_weak(HKDF_SHA256), - /* K3 */ be_nested_str_weak(derive), - /* K4 */ be_nested_str_weak(get_i2r), - /* K5 */ be_nested_str_weak(fromstring), - /* K6 */ be_nested_str_weak(PrivacyKey), - }), - be_str_weak(get_i2r_privacy), - &be_const_str_solidified, - ( &(const binstruction[22]) { /* code */ - 0x88040100, // 0000 GETMBR R1 R0 K0 - 0x4C080000, // 0001 LDNIL R2 - 0x1C040202, // 0002 EQ R1 R1 R2 - 0x7806000F, // 0003 JMPF R1 #0014 - 0xA4060200, // 0004 IMPORT R1 K1 - 0x8C080302, // 0005 GETMET R2 R1 K2 - 0x7C080200, // 0006 CALL R2 1 - 0x8C080503, // 0007 GETMET R2 R2 K3 - 0x8C100104, // 0008 GETMET R4 R0 K4 - 0x7C100200, // 0009 CALL R4 1 - 0x60140015, // 000A GETGBL R5 G21 - 0x7C140000, // 000B CALL R5 0 - 0x60180015, // 000C GETGBL R6 G21 - 0x7C180000, // 000D CALL R6 0 - 0x8C180D05, // 000E GETMET R6 R6 K5 - 0x58200006, // 000F LDCONST R8 K6 - 0x7C180400, // 0010 CALL R6 2 - 0x541E000F, // 0011 LDINT R7 16 - 0x7C080A00, // 0012 CALL R2 5 - 0x90020002, // 0013 SETMBR R0 K0 R2 - 0x88040100, // 0014 GETMBR R1 R0 K0 - 0x80040200, // 0015 RET 1 R1 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: get_ca_pub -********************************************************************/ -be_local_closure(Matter_Session_get_ca_pub, /* name */ - be_nested_proto( - 3, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 2]) { /* constants */ - /* K0 */ be_nested_str_weak(_fabric), - /* K1 */ be_nested_str_weak(get_ca_pub), - }), - be_str_weak(get_ca_pub), - &be_const_str_solidified, - ( &(const binstruction[ 4]) { /* code */ - 0x88040100, // 0000 GETMBR R1 R0 K0 - 0x8C040301, // 0001 GETMET R1 R1 K1 - 0x7C040200, // 0002 CALL R1 1 - 0x80040200, // 0003 RET 1 R1 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: close -********************************************************************/ -be_local_closure(Matter_Session_close, /* name */ - be_nested_proto( - 8, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[23]) { /* constants */ - /* K0 */ be_nested_str_weak(local_session_id), - /* K1 */ be_nested_str_weak(__future_local_session_id), - /* K2 */ be_nested_str_weak(initiator_session_id), - /* K3 */ be_nested_str_weak(__future_initiator_session_id), - /* K4 */ be_nested_str_weak(_counter_rcv_impl), - /* K5 */ be_nested_str_weak(reset), - /* K6 */ be_nested_str_weak(_counter_snd_impl), - /* K7 */ be_nested_str_weak(counter_rcv), - /* K8 */ be_const_int(0), - /* K9 */ be_nested_str_weak(counter_snd), - /* K10 */ be_nested_str_weak(next), - /* K11 */ be_nested_str_weak(i2rkey), - /* K12 */ be_nested_str_weak(_i2r_privacy), - /* K13 */ be_nested_str_weak(r2ikey), - /* K14 */ be_nested_str_weak(attestation_challenge), - /* K15 */ be_nested_str_weak(introspect), - /* K16 */ be_nested_str_weak(members), - /* K17 */ be_nested_str_weak(get), - /* K18 */ be_nested_str_weak(function), - /* K19 */ be_nested_str_weak(instance), - /* K20 */ be_nested_str_weak(_), - /* K21 */ be_const_int(1), - /* K22 */ be_nested_str_weak(stop_iteration), - }), - be_str_weak(close), - &be_const_str_solidified, - ( &(const binstruction[59]) { /* code */ - 0x88040101, // 0000 GETMBR R1 R0 K1 - 0x90020001, // 0001 SETMBR R0 K0 R1 - 0x88040103, // 0002 GETMBR R1 R0 K3 - 0x90020401, // 0003 SETMBR R0 K2 R1 - 0x88040104, // 0004 GETMBR R1 R0 K4 - 0x8C040305, // 0005 GETMET R1 R1 K5 - 0x7C040200, // 0006 CALL R1 1 - 0x88040106, // 0007 GETMBR R1 R0 K6 - 0x8C040305, // 0008 GETMET R1 R1 K5 - 0x7C040200, // 0009 CALL R1 1 - 0x90020F08, // 000A SETMBR R0 K7 K8 - 0x88040106, // 000B GETMBR R1 R0 K6 - 0x8C04030A, // 000C GETMET R1 R1 K10 - 0x7C040200, // 000D CALL R1 1 - 0x90021201, // 000E SETMBR R0 K9 R1 - 0x4C040000, // 000F LDNIL R1 - 0x90021601, // 0010 SETMBR R0 K11 R1 - 0x4C040000, // 0011 LDNIL R1 - 0x90021801, // 0012 SETMBR R0 K12 R1 - 0x4C040000, // 0013 LDNIL R1 - 0x90021A01, // 0014 SETMBR R0 K13 R1 - 0x4C040000, // 0015 LDNIL R1 - 0x90021C01, // 0016 SETMBR R0 K14 R1 - 0xA4061E00, // 0017 IMPORT R1 K15 - 0x60080010, // 0018 GETGBL R2 G16 - 0x8C0C0310, // 0019 GETMET R3 R1 K16 - 0x5C140000, // 001A MOVE R5 R0 - 0x7C0C0400, // 001B CALL R3 2 - 0x7C080200, // 001C CALL R2 1 - 0xA8020018, // 001D EXBLK 0 #0037 - 0x5C0C0400, // 001E MOVE R3 R2 - 0x7C0C0000, // 001F CALL R3 0 - 0x8C100311, // 0020 GETMET R4 R1 K17 - 0x5C180000, // 0021 MOVE R6 R0 - 0x5C1C0600, // 0022 MOVE R7 R3 - 0x7C100600, // 0023 CALL R4 3 - 0x60140004, // 0024 GETGBL R5 G4 - 0x5C180800, // 0025 MOVE R6 R4 - 0x7C140200, // 0026 CALL R5 1 - 0x20140B12, // 0027 NE R5 R5 K18 - 0x7816000C, // 0028 JMPF R5 #0036 - 0x60140004, // 0029 GETGBL R5 G4 - 0x5C180800, // 002A MOVE R6 R4 - 0x7C140200, // 002B CALL R5 1 - 0x20140B13, // 002C NE R5 R5 K19 - 0x78160007, // 002D JMPF R5 #0036 - 0x94140708, // 002E GETIDX R5 R3 K8 - 0x1C140B14, // 002F EQ R5 R5 K20 - 0x78160004, // 0030 JMPF R5 #0036 - 0x94140715, // 0031 GETIDX R5 R3 K21 - 0x1C140B14, // 0032 EQ R5 R5 K20 - 0x78160001, // 0033 JMPF R5 #0036 - 0x4C140000, // 0034 LDNIL R5 - 0x90000605, // 0035 SETMBR R0 R3 R5 - 0x7001FFE6, // 0036 JMP #001E - 0x58080016, // 0037 LDCONST R2 K22 - 0xAC080200, // 0038 CATCH R2 1 0 - 0xB0080000, // 0039 RAISE 2 R0 R0 - 0x80000000, // 003A RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: get_fabric_compressed -********************************************************************/ -be_local_closure(Matter_Session_get_fabric_compressed, /* name */ - be_nested_proto( - 2, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 2]) { /* constants */ - /* K0 */ be_nested_str_weak(_fabric), - /* K1 */ be_nested_str_weak(fabric_compressed), - }), - be_str_weak(get_fabric_compressed), - &be_const_str_solidified, - ( &(const binstruction[ 3]) { /* code */ - 0x88040100, // 0000 GETMBR R1 R0 K0 - 0x88040301, // 0001 GETMBR R1 R1 K1 - 0x80040200, // 0002 RET 1 R1 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: get_admin_vendor -********************************************************************/ -be_local_closure(Matter_Session_get_admin_vendor, /* name */ - be_nested_proto( - 2, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 2]) { /* constants */ - /* K0 */ be_nested_str_weak(_fabric), - /* K1 */ be_nested_str_weak(admin_vendor), - }), - be_str_weak(get_admin_vendor), - &be_const_str_solidified, - ( &(const binstruction[ 3]) { /* code */ - 0x88040100, // 0000 GETMBR R1 R0 K0 - 0x88040301, // 0001 GETMBR R1 R1 K1 - 0x80040200, // 0002 RET 1 R1 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: get_pk -********************************************************************/ -be_local_closure(Matter_Session_get_pk, /* name */ - be_nested_proto( - 6, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 4]) { /* constants */ - /* K0 */ be_nested_str_weak(_fabric), - /* K1 */ be_nested_str_weak(no_private_key), - /* K2 */ be_nested_str_weak(crypto), - /* K3 */ be_nested_str_weak(random), - }), - be_str_weak(get_pk), - &be_const_str_solidified, - ( &(const binstruction[12]) { /* code */ - 0x88040100, // 0000 GETMBR R1 R0 K0 - 0x88040301, // 0001 GETMBR R1 R1 K1 - 0x74060005, // 0002 JMPT R1 #0009 - 0xA4060400, // 0003 IMPORT R1 K2 - 0x88080100, // 0004 GETMBR R2 R0 K0 - 0x8C0C0303, // 0005 GETMET R3 R1 K3 - 0x5416001F, // 0006 LDINT R5 32 - 0x7C0C0400, // 0007 CALL R3 2 - 0x900A0203, // 0008 SETMBR R2 K1 R3 - 0x88040100, // 0009 GETMBR R1 R0 K0 - 0x88040301, // 000A GETMBR R1 R1 K1 - 0x80040200, // 000B RET 1 R1 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: set_fabric_device -********************************************************************/ -be_local_closure(Matter_Session_set_fabric_device, /* name */ - be_nested_proto( - 8, /* nstack */ - 5, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 6]) { /* constants */ - /* K0 */ be_nested_str_weak(_fabric), - /* K1 */ be_nested_str_weak(fabric_id), - /* K2 */ be_nested_str_weak(device_id), - /* K3 */ be_nested_str_weak(fabric_compressed), - /* K4 */ be_nested_str_weak(fabric_parent), - /* K5 */ be_nested_str_weak(get_fabric_index), - }), - be_str_weak(set_fabric_device), - &be_const_str_solidified, - ( &(const binstruction[16]) { /* code */ - 0x88140100, // 0000 GETMBR R5 R0 K0 - 0x90160201, // 0001 SETMBR R5 K1 R1 - 0x88140100, // 0002 GETMBR R5 R0 K0 - 0x90160402, // 0003 SETMBR R5 K2 R2 - 0x88140100, // 0004 GETMBR R5 R0 K0 - 0x90160603, // 0005 SETMBR R5 K3 R3 - 0x88140100, // 0006 GETMBR R5 R0 K0 - 0x4C180000, // 0007 LDNIL R6 - 0x20180806, // 0008 NE R6 R4 R6 - 0x781A0002, // 0009 JMPF R6 #000D - 0x8C180905, // 000A GETMET R6 R4 K5 - 0x7C180200, // 000B CALL R6 1 - 0x70020000, // 000C JMP #000E - 0x4C180000, // 000D LDNIL R6 - 0x90160806, // 000E SETMBR R5 K4 R6 - 0x80000000, // 000F RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: gen_CSR -********************************************************************/ -be_local_closure(Matter_Session_gen_CSR, /* name */ - be_nested_proto( - 15, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[12]) { /* constants */ - /* K0 */ be_nested_str_weak(get_pk), - /* K1 */ be_nested_str_weak(crypto), - /* K2 */ be_nested_str_weak(EC_P256), - /* K3 */ be_nested_str_weak(public_key), - /* K4 */ be_nested_str_weak(3070020100300E310C300A060355040A0C034353523059301306072A8648CE3D020106082A8648CE3D030107034200), - /* K5 */ be_nested_str_weak(A000), - /* K6 */ be_nested_str_weak(300C06082A8648CE3D0403020500), - /* K7 */ be_nested_str_weak(ecdsa_sign_sha256_asn1), - /* K8 */ be_nested_str_weak(add), - /* K9 */ be_const_int(3), - /* K10 */ be_const_int(1), - /* K11 */ be_const_int(0), - }), - be_str_weak(gen_CSR), - &be_const_str_solidified, - ( &(const binstruction[73]) { /* code */ - 0x8C040100, // 0000 GETMET R1 R0 K0 - 0x7C040200, // 0001 CALL R1 1 - 0xA40A0200, // 0002 IMPORT R2 K1 - 0x8C0C0502, // 0003 GETMET R3 R2 K2 - 0x7C0C0200, // 0004 CALL R3 1 - 0x8C100703, // 0005 GETMET R4 R3 K3 - 0x5C180200, // 0006 MOVE R6 R1 - 0x7C100400, // 0007 CALL R4 2 - 0x60140015, // 0008 GETGBL R5 G21 - 0x58180004, // 0009 LDCONST R6 K4 - 0x7C140200, // 000A CALL R5 1 - 0x40180A04, // 000B CONNECT R6 R5 R4 - 0x60180015, // 000C GETGBL R6 G21 - 0x581C0005, // 000D LDCONST R7 K5 - 0x7C180200, // 000E CALL R6 1 - 0x40180A06, // 000F CONNECT R6 R5 R6 - 0x60180015, // 0010 GETGBL R6 G21 - 0x581C0006, // 0011 LDCONST R7 K6 - 0x7C180200, // 0012 CALL R6 1 - 0x8C1C0707, // 0013 GETMET R7 R3 K7 - 0x5C240200, // 0014 MOVE R9 R1 - 0x5C280A00, // 0015 MOVE R10 R5 - 0x7C1C0600, // 0016 CALL R7 3 - 0x60200015, // 0017 GETGBL R8 G21 - 0x5426007F, // 0018 LDINT R9 128 - 0x7C200200, // 0019 CALL R8 1 - 0x8C241108, // 001A GETMET R9 R8 K8 - 0x582C0009, // 001B LDCONST R11 K9 - 0x5830000A, // 001C LDCONST R12 K10 - 0x7C240600, // 001D CALL R9 3 - 0x8C241108, // 001E GETMET R9 R8 K8 - 0x602C000C, // 001F GETGBL R11 G12 - 0x5C300E00, // 0020 MOVE R12 R7 - 0x7C2C0200, // 0021 CALL R11 1 - 0x002C170A, // 0022 ADD R11 R11 K10 - 0x5830000A, // 0023 LDCONST R12 K10 - 0x7C240600, // 0024 CALL R9 3 - 0x8C241108, // 0025 GETMET R9 R8 K8 - 0x582C000B, // 0026 LDCONST R11 K11 - 0x5830000A, // 0027 LDCONST R12 K10 - 0x7C240600, // 0028 CALL R9 3 - 0x40241007, // 0029 CONNECT R9 R8 R7 - 0x6024000C, // 002A GETGBL R9 G12 - 0x5C280A00, // 002B MOVE R10 R5 - 0x7C240200, // 002C CALL R9 1 - 0x6028000C, // 002D GETGBL R10 G12 - 0x5C2C0C00, // 002E MOVE R11 R6 - 0x7C280200, // 002F CALL R10 1 - 0x0024120A, // 0030 ADD R9 R9 R10 - 0x6028000C, // 0031 GETGBL R10 G12 - 0x5C2C1000, // 0032 MOVE R11 R8 - 0x7C280200, // 0033 CALL R10 1 - 0x0024120A, // 0034 ADD R9 R9 R10 - 0x60280015, // 0035 GETGBL R10 G21 - 0x542E00CF, // 0036 LDINT R11 208 - 0x7C280200, // 0037 CALL R10 1 - 0x8C2C1508, // 0038 GETMET R11 R10 K8 - 0x5436002F, // 0039 LDINT R13 48 - 0x5838000A, // 003A LDCONST R14 K10 - 0x7C2C0600, // 003B CALL R11 3 - 0x8C2C1508, // 003C GETMET R11 R10 K8 - 0x54360080, // 003D LDINT R13 129 - 0x5838000A, // 003E LDCONST R14 K10 - 0x7C2C0600, // 003F CALL R11 3 - 0x8C2C1508, // 0040 GETMET R11 R10 K8 - 0x543600FE, // 0041 LDINT R13 255 - 0x2C34120D, // 0042 AND R13 R9 R13 - 0x5838000A, // 0043 LDCONST R14 K10 - 0x7C2C0600, // 0044 CALL R11 3 - 0x402C1405, // 0045 CONNECT R11 R10 R5 - 0x402C1406, // 0046 CONNECT R11 R10 R6 - 0x402C1408, // 0047 CONNECT R11 R10 R8 - 0x80041400, // 0048 RET 1 R10 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: get_fabric -********************************************************************/ -be_local_closure(Matter_Session_get_fabric, /* name */ - be_nested_proto( - 2, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 1]) { /* constants */ - /* K0 */ be_nested_str_weak(_fabric), - }), - be_str_weak(get_fabric), - &be_const_str_solidified, - ( &(const binstruction[ 2]) { /* code */ - 0x88040100, // 0000 GETMBR R1 R0 K0 - 0x80040200, // 0001 RET 1 R1 - }) - ) -); -/*******************************************************************/ - - /******************************************************************** ** Solidified function: counter_rcv_validate ********************************************************************/ @@ -1954,30 +1637,117 @@ be_local_closure(Matter_Session_counter_rcv_validate, /* name */ /******************************************************************** -** Solidified function: set_noc +** Solidified function: get_icac ********************************************************************/ -be_local_closure(Matter_Session_set_noc, /* name */ +be_local_closure(Matter_Session_get_icac, /* name */ be_nested_proto( - 4, /* nstack */ - 3, /* argc */ + 2, /* nstack */ + 1, /* argc */ 2, /* varg */ 0, /* has upvals */ NULL, /* no upvals */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[ 3]) { /* constants */ + ( &(const bvalue[ 2]) { /* constants */ /* K0 */ be_nested_str_weak(_fabric), - /* K1 */ be_nested_str_weak(noc), - /* K2 */ be_nested_str_weak(icac), + /* K1 */ be_nested_str_weak(icac), }), - be_str_weak(set_noc), + be_str_weak(get_icac), + &be_const_str_solidified, + ( &(const binstruction[ 3]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x88040301, // 0001 GETMBR R1 R1 K1 + 0x80040200, // 0002 RET 1 R1 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: get_ca_pub +********************************************************************/ +be_local_closure(Matter_Session_get_ca_pub, /* name */ + be_nested_proto( + 3, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 2]) { /* constants */ + /* K0 */ be_nested_str_weak(_fabric), + /* K1 */ be_nested_str_weak(get_ca_pub), + }), + be_str_weak(get_ca_pub), + &be_const_str_solidified, + ( &(const binstruction[ 4]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x8C040301, // 0001 GETMET R1 R1 K1 + 0x7C040200, // 0002 CALL R1 1 + 0x80040200, // 0003 RET 1 R1 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: get_ipk_epoch_key +********************************************************************/ +be_local_closure(Matter_Session_get_ipk_epoch_key, /* name */ + be_nested_proto( + 2, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 2]) { /* constants */ + /* K0 */ be_nested_str_weak(_fabric), + /* K1 */ be_nested_str_weak(ipk_epoch_key), + }), + be_str_weak(get_ipk_epoch_key), + &be_const_str_solidified, + ( &(const binstruction[ 3]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x88040301, // 0001 GETMBR R1 R1 K1 + 0x80040200, // 0002 RET 1 R1 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: persist_to_fabric +********************************************************************/ +be_local_closure(Matter_Session_persist_to_fabric, /* name */ + be_nested_proto( + 4, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 2]) { /* constants */ + /* K0 */ be_nested_str_weak(_fabric), + /* K1 */ be_nested_str_weak(add_session), + }), + be_str_weak(persist_to_fabric), &be_const_str_solidified, ( &(const binstruction[ 5]) { /* code */ - 0x880C0100, // 0000 GETMBR R3 R0 K0 - 0x900E0201, // 0001 SETMBR R3 K1 R1 - 0x880C0100, // 0002 GETMBR R3 R0 K0 - 0x900E0402, // 0003 SETMBR R3 K2 R2 + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x8C040301, // 0001 GETMET R1 R1 K1 + 0x5C0C0000, // 0002 MOVE R3 R0 + 0x7C040400, // 0003 CALL R1 2 0x80000000, // 0004 RET 0 }) ) @@ -1990,96 +1760,93 @@ be_local_closure(Matter_Session_set_noc, /* name */ ********************************************************************/ extern const bclass be_class_Matter_Expirable; be_local_class(Matter_Session, - 36, + 38, &be_class_Matter_Expirable, - be_nested_map(86, + be_nested_map(83, ( (struct bmapnode*) &(const bmapnode[]) { - { be_const_key_weak(__Msg2, -1), be_const_var(34) }, - { be_const_key_weak(_GROUP_KEY, -1), be_nested_str_weak(GroupKey_X20v1_X2E0) }, - { be_const_key_weak(set_noc, 50), be_const_closure(Matter_Session_set_noc_closure) }, - { be_const_key_weak(get_i2r, 79), be_const_closure(Matter_Session_get_i2r_closure) }, - { be_const_key_weak(tojson, -1), be_const_closure(Matter_Session_tojson_closure) }, - { be_const_key_weak(assign_fabric_index, 30), be_const_closure(Matter_Session_assign_fabric_index_closure) }, - { be_const_key_weak(get_r2i, -1), be_const_closure(Matter_Session_get_r2i_closure) }, - { be_const_key_weak(_breadcrumb, -1), be_const_var(25) }, - { be_const_key_weak(_counter_snd_impl, -1), be_const_var(13) }, - { be_const_key_weak(gen_CSR, -1), be_const_closure(Matter_Session_gen_CSR_closure) }, - { be_const_key_weak(__future_local_session_id, -1), be_const_var(9) }, - { be_const_key_weak(set_mode_PASE, -1), be_const_closure(Matter_Session_set_mode_PASE_closure) }, - { be_const_key_weak(get_fabric_label, -1), be_const_closure(Matter_Session_get_fabric_label_closure) }, - { be_const_key_weak(__spake_Ke, -1), be_const_var(32) }, - { be_const_key_weak(get_device_id, 85), be_const_closure(Matter_Session_get_device_id_closure) }, - { be_const_key_weak(persist_to_fabric, 6), be_const_closure(Matter_Session_persist_to_fabric_closure) }, - { be_const_key_weak(_COUNTER_SND_INCR, -1), be_const_int(1024) }, - { be_const_key_weak(local_session_id, 18), be_const_var(3) }, - { be_const_key_weak(shared_secret, 42), be_const_var(27) }, - { be_const_key_weak(get_mode, 74), be_const_closure(Matter_Session_get_mode_closure) }, - { be_const_key_weak(peer_node_id, -1), be_const_var(24) }, - { be_const_key_weak(i2rkey, -1), be_const_var(20) }, + { be_const_key_weak(resumption_id, -1), be_const_var(28) }, + { be_const_key_weak(mode, 4), be_const_var(1) }, { be_const_key_weak(get_pk, -1), be_const_closure(Matter_Session_get_pk_closure) }, - { be_const_key_weak(is_PASE, -1), be_const_closure(Matter_Session_is_PASE_closure) }, - { be_const_key_weak(get_admin_subject, -1), be_const_closure(Matter_Session_get_admin_subject_closure) }, - { be_const_key_weak(get_admin_vendor, -1), be_const_closure(Matter_Session_get_admin_vendor_closure) }, - { be_const_key_weak(get_ipk_epoch_key, 2), be_const_closure(Matter_Session_get_ipk_epoch_key_closure) }, - { be_const_key_weak(_counter_insecure_snd, -1), be_const_var(19) }, - { be_const_key_weak(_i2r_privacy, 78), be_const_var(22) }, - { be_const_key_weak(get_fabric_compressed, -1), be_const_closure(Matter_Session_get_fabric_compressed_closure) }, - { be_const_key_weak(get_fabric_id, -1), be_const_closure(Matter_Session_get_fabric_id_closure) }, - { be_const_key_weak(_exchange_id, 29), be_const_var(14) }, - { be_const_key_weak(fabric_candidate, -1), be_const_closure(Matter_Session_fabric_candidate_closure) }, - { be_const_key_weak(__responder_pub, -1), be_const_var(29) }, - { be_const_key_weak(get_ipk_group_key, -1), be_const_closure(Matter_Session_get_ipk_group_key_closure) }, - { be_const_key_weak(__Msg1, -1), be_const_var(33) }, - { be_const_key_weak(get_noc, -1), be_const_closure(Matter_Session_get_noc_closure) }, - { be_const_key_weak(_port, 48), be_const_var(16) }, - { be_const_key_weak(fabric_completed, -1), be_const_closure(Matter_Session_fabric_completed_closure) }, - { be_const_key_weak(__future_initiator_session_id, -1), be_const_var(8) }, - { be_const_key_weak(__spake_cA, 54), be_const_var(31) }, - { be_const_key_weak(_message_handler, -1), be_const_var(17) }, - { be_const_key_weak(attestation_challenge, 8), be_const_var(23) }, - { be_const_key_weak(get_i2r_privacy, -1), be_const_closure(Matter_Session_get_i2r_privacy_closure) }, - { be_const_key_weak(set_keys, -1), be_const_closure(Matter_Session_set_keys_closure) }, - { be_const_key_weak(counter_snd_next, -1), be_const_closure(Matter_Session_counter_snd_next_closure) }, - { be_const_key_weak(_CASE, -1), be_const_int(2) }, + { be_const_key_weak(set_mode_CASE, 65), be_const_closure(Matter_Session_set_mode_CASE_closure) }, + { be_const_key_weak(__spake_cA, 22), be_const_var(33) }, + { be_const_key_weak(__initiator_pub, -1), be_const_var(32) }, + { be_const_key_weak(get_temp_ca_pub, 55), be_const_closure(Matter_Session_get_temp_ca_pub_closure) }, + { be_const_key_weak(get_i2r, -1), be_const_closure(Matter_Session_get_i2r_closure) }, + { be_const_key_weak(_ip, 82), be_const_var(17) }, + { be_const_key_weak(__Msg2, -1), be_const_var(36) }, + { be_const_key_weak(get_fabric_label, 59), be_const_closure(Matter_Session_get_fabric_label_closure) }, + { be_const_key_weak(__future_initiator_session_id, -1), be_const_var(10) }, + { be_const_key_weak(set_keys, 0), be_const_closure(Matter_Session_set_keys_closure) }, + { be_const_key_weak(set_mode_PASE, -1), be_const_closure(Matter_Session_set_mode_PASE_closure) }, + { be_const_key_weak(_fabric, 7), be_const_var(2) }, + { be_const_key_weak(get_temp_ca, -1), be_const_closure(Matter_Session_get_temp_ca_closure) }, + { be_const_key_weak(attestation_challenge, -1), be_const_var(25) }, + { be_const_key_weak(_temp_pk, -1), be_const_var(9) }, { be_const_key_weak(last_used, -1), be_const_var(6) }, - { be_const_key_weak(_ip, -1), be_const_var(15) }, - { be_const_key_weak(set_mode_CASE, 28), be_const_closure(Matter_Session_set_mode_CASE_closure) }, - { be_const_key_weak(set_fabric_label, 13), be_const_closure(Matter_Session_set_fabric_label_closure) }, - { be_const_key_weak(hydrate_post, -1), be_const_closure(Matter_Session_hydrate_post_closure) }, - { be_const_key_weak(get_ca, -1), be_const_closure(Matter_Session_get_ca_closure) }, - { be_const_key_weak(init, 69), be_const_closure(Matter_Session_init_closure) }, - { be_const_key_weak(get_icac, 41), be_const_closure(Matter_Session_get_icac_closure) }, - { be_const_key_weak(_store, 51), be_const_var(0) }, - { be_const_key_weak(__chunked_attr_reports, -1), be_const_var(35) }, - { be_const_key_weak(counter_rcv, -1), be_const_var(10) }, - { be_const_key_weak(_source_node_id, -1), be_const_var(7) }, - { be_const_key_weak(set_admin_subject_vendor, 63), be_const_closure(Matter_Session_set_admin_subject_vendor_closure) }, - { be_const_key_weak(set_ipk_epoch_key, -1), be_const_closure(Matter_Session_set_ipk_epoch_key_closure) }, - { be_const_key_weak(_counter_insecure_rcv, 62), be_const_var(18) }, - { be_const_key_weak(before_remove, 64), be_const_closure(Matter_Session_before_remove_closure) }, - { be_const_key_weak(__responder_priv, -1), be_const_var(28) }, - { be_const_key_weak(initiator_session_id, -1), be_const_var(4) }, - { be_const_key_weak(r2ikey, 16), be_const_var(21) }, - { be_const_key_weak(__initiator_pub, -1), be_const_var(30) }, - { be_const_key_weak(resumption_id, -1), be_const_var(26) }, - { be_const_key_weak(save, 49), be_const_closure(Matter_Session_save_closure) }, - { be_const_key_weak(set_mode, 56), be_const_closure(Matter_Session_set_mode_closure) }, - { be_const_key_weak(get_ac, 43), be_const_closure(Matter_Session_get_ac_closure) }, - { be_const_key_weak(_PASE, -1), be_const_int(1) }, - { be_const_key_weak(get_ca_pub, -1), be_const_closure(Matter_Session_get_ca_pub_closure) }, - { be_const_key_weak(close, -1), be_const_closure(Matter_Session_close_closure) }, - { be_const_key_weak(_counter_rcv_impl, -1), be_const_var(12) }, - { be_const_key_weak(_fabric, -1), be_const_var(2) }, - { be_const_key_weak(update, 25), be_const_closure(Matter_Session_update_closure) }, - { be_const_key_weak(fromjson, 22), be_const_static_closure(Matter_Session_fromjson_closure) }, + { be_const_key_weak(peer_node_id, -1), be_const_var(26) }, { be_const_key_weak(is_CASE, -1), be_const_closure(Matter_Session_is_CASE_closure) }, - { be_const_key_weak(counter_snd, -1), be_const_var(11) }, - { be_const_key_weak(set_fabric_device, -1), be_const_closure(Matter_Session_set_fabric_device_closure) }, - { be_const_key_weak(created, 10), be_const_var(5) }, - { be_const_key_weak(set_ca, 9), be_const_closure(Matter_Session_set_ca_closure) }, + { be_const_key_weak(get_ipk_epoch_key, 80), be_const_closure(Matter_Session_get_ipk_epoch_key_closure) }, + { be_const_key_weak(_exchange_id, -1), be_const_var(16) }, + { be_const_key_weak(__chunked_attr_reports, -1), be_const_var(37) }, + { be_const_key_weak(counter_snd, -1), be_const_var(13) }, + { be_const_key_weak(_i2r_privacy, -1), be_const_var(24) }, + { be_const_key_weak(_PASE, -1), be_const_int(1) }, + { be_const_key_weak(get_mode, 1), be_const_closure(Matter_Session_get_mode_closure) }, + { be_const_key_weak(get_icac, 53), be_const_closure(Matter_Session_get_icac_closure) }, + { be_const_key_weak(is_PASE, -1), be_const_closure(Matter_Session_is_PASE_closure) }, + { be_const_key_weak(gen_CSR, -1), be_const_closure(Matter_Session_gen_CSR_closure) }, + { be_const_key_weak(_message_handler, 51), be_const_var(19) }, + { be_const_key_weak(__spake_Ke, -1), be_const_var(34) }, + { be_const_key_weak(get_admin_subject, -1), be_const_closure(Matter_Session_get_admin_subject_closure) }, + { be_const_key_weak(before_remove, 73), be_const_closure(Matter_Session_before_remove_closure) }, + { be_const_key_weak(__responder_pub, -1), be_const_var(31) }, + { be_const_key_weak(i2rkey, -1), be_const_var(22) }, + { be_const_key_weak(created, -1), be_const_var(5) }, + { be_const_key_weak(_CASE, -1), be_const_int(2) }, + { be_const_key_weak(_port, -1), be_const_var(18) }, + { be_const_key_weak(_store, -1), be_const_var(0) }, + { be_const_key_weak(get_device_id, -1), be_const_closure(Matter_Session_get_device_id_closure) }, + { be_const_key_weak(get_admin_vendor, -1), be_const_closure(Matter_Session_get_admin_vendor_closure) }, { be_const_key_weak(get_fabric, -1), be_const_closure(Matter_Session_get_fabric_closure) }, + { be_const_key_weak(_counter_insecure_rcv, 28), be_const_var(20) }, + { be_const_key_weak(get_ipk_group_key, -1), be_const_closure(Matter_Session_get_ipk_group_key_closure) }, + { be_const_key_weak(__responder_priv, -1), be_const_var(30) }, + { be_const_key_weak(_GROUP_KEY, 56), be_nested_str_weak(GroupKey_X20v1_X2E0) }, + { be_const_key_weak(_temp_root_ca_certificate, -1), be_const_var(8) }, + { be_const_key_weak(init, -1), be_const_closure(Matter_Session_init_closure) }, + { be_const_key_weak(get_noc, 41), be_const_closure(Matter_Session_get_noc_closure) }, + { be_const_key_weak(set_fabric_label, 15), be_const_closure(Matter_Session_set_fabric_label_closure) }, + { be_const_key_weak(shared_secret, -1), be_const_var(29) }, + { be_const_key_weak(hydrate_post, 33), be_const_closure(Matter_Session_hydrate_post_closure) }, + { be_const_key_weak(fromjson, -1), be_const_static_closure(Matter_Session_fromjson_closure) }, + { be_const_key_weak(save, -1), be_const_closure(Matter_Session_save_closure) }, + { be_const_key_weak(_source_node_id, -1), be_const_var(7) }, + { be_const_key_weak(set_mode, 25), be_const_closure(Matter_Session_set_mode_closure) }, + { be_const_key_weak(_counter_snd_impl, -1), be_const_var(15) }, + { be_const_key_weak(__Msg1, 81), be_const_var(35) }, + { be_const_key_weak(set_temp_ca, -1), be_const_closure(Matter_Session_set_temp_ca_closure) }, + { be_const_key_weak(get_i2r_privacy, -1), be_const_closure(Matter_Session_get_i2r_privacy_closure) }, + { be_const_key_weak(initiator_session_id, -1), be_const_var(4) }, + { be_const_key_weak(__future_local_session_id, -1), be_const_var(11) }, + { be_const_key_weak(r2ikey, -1), be_const_var(23) }, + { be_const_key_weak(get_fabric_id, 72), be_const_closure(Matter_Session_get_fabric_id_closure) }, + { be_const_key_weak(get_ac, -1), be_const_closure(Matter_Session_get_ac_closure) }, + { be_const_key_weak(local_session_id, -1), be_const_var(3) }, + { be_const_key_weak(counter_snd_next, -1), be_const_closure(Matter_Session_counter_snd_next_closure) }, { be_const_key_weak(counter_rcv_validate, -1), be_const_closure(Matter_Session_counter_rcv_validate_closure) }, - { be_const_key_weak(mode, -1), be_const_var(1) }, + { be_const_key_weak(get_ca, 35), be_const_closure(Matter_Session_get_ca_closure) }, + { be_const_key_weak(_counter_rcv_impl, -1), be_const_var(14) }, + { be_const_key_weak(update, -1), be_const_closure(Matter_Session_update_closure) }, + { be_const_key_weak(close, 23), be_const_closure(Matter_Session_close_closure) }, + { be_const_key_weak(get_ca_pub, -1), be_const_closure(Matter_Session_get_ca_pub_closure) }, + { be_const_key_weak(_breadcrumb, -1), be_const_var(27) }, + { be_const_key_weak(_COUNTER_SND_INCR, 21), be_const_int(1024) }, + { be_const_key_weak(_counter_insecure_snd, -1), be_const_var(21) }, + { be_const_key_weak(persist_to_fabric, -1), be_const_closure(Matter_Session_persist_to_fabric_closure) }, + { be_const_key_weak(counter_rcv, 5), be_const_var(12) }, + { be_const_key_weak(tojson, -1), be_const_closure(Matter_Session_tojson_closure) }, + { be_const_key_weak(get_r2i, -1), be_const_closure(Matter_Session_get_r2i_closure) }, + { be_const_key_weak(get_fabric_compressed, -1), be_const_closure(Matter_Session_get_fabric_compressed_closure) }, })), be_str_weak(Matter_Session) ); From e969bf0e0ebcb2dcbe7b64d823c4c06ec090a11b Mon Sep 17 00:00:00 2001 From: gemu Date: Tue, 23 May 2023 08:46:00 +0200 Subject: [PATCH 175/289] optional prefix size and serial invert (#18717) --- tasmota/tasmota_xsns_sensor/xsns_53_sml.ino | 70 +++++++++++++-------- 1 file changed, 43 insertions(+), 27 deletions(-) diff --git a/tasmota/tasmota_xsns_sensor/xsns_53_sml.ino b/tasmota/tasmota_xsns_sensor/xsns_53_sml.ino index 0fe912e89..cec25169f 100755 --- a/tasmota/tasmota_xsns_sensor/xsns_53_sml.ino +++ b/tasmota/tasmota_xsns_sensor/xsns_53_sml.ino @@ -166,7 +166,7 @@ class SML_ESP32_SERIAL : public Stream { public: SML_ESP32_SERIAL(uint32_t uart_index); virtual ~SML_ESP32_SERIAL(); - bool begin(uint32_t speed, uint32_t smode, int32_t recpin, int32_t trxpin); + bool begin(uint32_t speed, uint32_t smode, int32_t recpin, int32_t trxpin, int32_t invert); int32_t peek(void); int read(void) override; size_t write(uint8_t byte) override; @@ -226,7 +226,7 @@ void SML_ESP32_SERIAL::end(void) { } } -bool SML_ESP32_SERIAL::begin(uint32_t speed, uint32_t smode, int32_t recpin, int32_t trxpin) { +bool SML_ESP32_SERIAL::begin(uint32_t speed, uint32_t smode, int32_t recpin, int32_t trxpin, int invert) { if (!m_valid) { return false; } m_buffer = 0; @@ -246,7 +246,7 @@ bool SML_ESP32_SERIAL::begin(uint32_t speed, uint32_t smode, int32_t recpin, int m_tx_pin = trxpin; hws = new HardwareSerial(uart_index); if (hws) { - hws->begin(speed, cfgmode, m_rx_pin, m_tx_pin); + hws->begin(speed, cfgmode, m_rx_pin, m_tx_pin, invert); } } return true; @@ -383,6 +383,15 @@ typedef union { }; } TRX_EN_TYPE; +typedef union { + uint8_t data; + struct { + uint8_t SO_DWS74_BUG : 1; + uint8_t SO_OBIS_LINE : 1; + uint8_t SO_TRX_INVERT : 1; + }; +} SO_FLAGS; + #ifndef TMSBSIZ #define TMSBSIZ 256 #endif @@ -391,19 +400,20 @@ typedef union { #define SML_STIMEOUT 1000 #endif -#define SO_DWS74_BUG 1 -#define SO_OBIS_LINE 2 - #define METER_ID_SIZE 24 #define SML_CRYPT_SIZE 16 +#ifndef SML_PREFIX_SIZE +#define SML_PREFIX_SIZE 8 +#endif + struct METER_DESC { int8_t srcpin; uint8_t type; uint16_t flag; int32_t params; - char prefix[8]; + char prefix[SML_PREFIX_SIZE]; int8_t trxpin; uint8_t tsecs; char *txmem; @@ -419,7 +429,7 @@ struct METER_DESC { uint16_t sibsiz; uint32_t lastms; uint16_t tout_ms; - uint8_t so_flags; + SO_FLAGS so_flags; char meter_id[METER_ID_SIZE]; #ifdef USE_SML_SPECOPT uint32_t so_obis1; @@ -1018,7 +1028,7 @@ double dval; break; case 2: // signed 16 bit - if (meter_desc[index].so_flags & SO_DWS74_BUG) { + if (meter_desc[index].so_flags.SO_DWS74_BUG) { if (scaler == -2) { value = (uint32_t)uvalue; } else { @@ -1294,7 +1304,7 @@ void sml_shift_in(uint32_t meters, uint32_t shard) { switch (mp->type) { case 'o': // asci obis - if (!(mp->so_flags & SO_OBIS_LINE)) { + if (!(mp->so_flags.SO_OBIS_LINE)) { mp->sbuff[mp->sbsiz - 1] = iob & 0x7f; } else { iob &= 0x7f; @@ -2619,7 +2629,7 @@ struct METER_DESC *mp = &meter_desc[mnum]; break; case '2': cp += 2; - mp->so_flags = strtol(cp, &cp, 16); + mp->so_flags.data = strtol(cp, &cp, 16); break; case '3': cp += 2; @@ -2720,14 +2730,14 @@ void reset_sml_vars(uint16_t maxmeters) { mp->so_obis1 = 0; mp->so_obis2 = 0; #endif - mp->so_flags = 0; + mp->so_flags.data = 0; // addresses a bug in meter DWS74 #ifdef DWS74_BUG - mp->so_flags |= SO_DWS74_BUG; + mp->so_flags.SO_DWS74_BUG = 1; #endif #ifdef SML_OBIS_LINE - mp->so_flags |= SO_OBIS_LINE; + mp->so_flags.SO_OBIS_LINE = 1; #endif if (mp->txmem) { free(mp->txmem); @@ -2931,8 +2941,8 @@ dddef_exit: mmp->params = strtol(lp, &lp, 10); if (*lp != ',') goto next_line; lp++; - mmp->prefix[7] = 0; - for (uint32_t cnt = 0; cnt < 8; cnt++) { + mmp->prefix[SML_PREFIX_SIZE - 1] = 0; + for (uint32_t cnt = 0; cnt < SML_PREFIX_SIZE; cnt++) { if (*lp == SCRIPT_EOL || *lp == ',') { mmp->prefix[cnt] = 0; break; @@ -3208,12 +3218,14 @@ next_line: if (mp->meter_ss->hardwareSerial()) { Serial.begin(mp->params, (SerialConfig)smode); ClaimSerial(); - //Serial.setRxBufferSize(512); + if (mp->so_flags.SO_TRX_INVERT) { + U0C0 = U0C0 | BIT(UCRXI) | BIT(UCTXI); // Inverse RX, TX + } } #endif // ESP8266 #ifdef ESP32 - mp->meter_ss->begin(mp->params, smode, mp->srcpin, mp->trxpin); + mp->meter_ss->begin(mp->params, smode, mp->srcpin, mp->trxpin, mp->so_flags.SO_TRX_INVERT); #ifdef USE_ESP32_SW_SERIAL mp->meter_ss->setRxBufferSize(mp->sibsiz); #endif @@ -3244,7 +3256,7 @@ next_line: struct METER_DESC *mp = &meter_desc[meters]; char type = mp->type; - if (!(mp->so_flags & SO_OBIS_LINE)) { + if (!(mp->so_flags.SO_OBIS_LINE)) { mp->shift_mode = (type != 'e' && type != 'k' && type != 'm' && type != 'M' && type != 'p' && type != 'R' && type != 'v'); } else { mp->shift_mode = (type != 'o' && type != 'e' && type != 'k' && type != 'm' && type != 'M' && type != 'p' && type != 'R' && type != 'v'); @@ -3337,7 +3349,7 @@ uint32_t SML_Write(int32_t meter, char *hstr) { #ifdef ESP8266 Serial.begin(baud, (SerialConfig)smode); #else - meter_desc[meter].meter_ss->begin(baud, smode, sml_globs.mp[meter].srcpin, sml_globs.mp[meter].trxpin); + meter_desc[meter].meter_ss->begin(baud, smode, sml_globs.mp[meter].srcpin, sml_globs.mp[meter].trxpin, sml_globs.mp[meter].so_flags.SO_TRX_INVERT); #endif } return 1; @@ -3616,7 +3628,9 @@ uint16_t sml_swap(uint16_t in) { void sml_tcp_send(uint32_t meter, uint8_t *sbuff, uint16_t slen) { MODBUS_TCP_HEADER tcph; - tcph.T_ID = sml_swap(0x1234); + //tcph.T_ID = sml_swap(0x1234); + tcph.T_ID = random(0xffff); + tcph.P_ID = 0; tcph.SIZE = sml_swap(6); tcph.U_ID = *sbuff; @@ -3990,12 +4004,14 @@ bool Xsns53(uint32_t function) { SML_Init(); break; case FUNC_LOOP: - if (sml_globs.ready) { - SML_Counter_Poll(); - if (sml_globs.dump2log) { - dump2log(); - } else { - SML_Poll(); + if (bitRead(Settings->rule_enabled, 0)) { + if (sml_globs.ready) { + SML_Counter_Poll(); + if (sml_globs.dump2log) { + dump2log(); + } else { + SML_Poll(); + } } } break; From 242eb3074a281e691289fe5237e16b6e4d22817c Mon Sep 17 00:00:00 2001 From: gemu Date: Tue, 23 May 2023 11:30:59 +0200 Subject: [PATCH 176/289] fixes and enhancements (#18718) * onewire fixes, webui radiobuttons * fix regression --- .../tasmota_xdrv_driver/xdrv_10_scripter.ino | 148 ++++++++++++++++-- 1 file changed, 133 insertions(+), 15 deletions(-) diff --git a/tasmota/tasmota_xdrv_driver/xdrv_10_scripter.ino b/tasmota/tasmota_xdrv_driver/xdrv_10_scripter.ino index 4b209123e..743fc1f62 100755 --- a/tasmota/tasmota_xdrv_driver/xdrv_10_scripter.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_10_scripter.ino @@ -4750,7 +4750,10 @@ extern void W8960_SetGain(uint8_t sel, uint16_t value); lp++; } } - bool isint = is_int_var(lp); + bool isint = false; + if (*lp != '(') { + isint = is_int_var(lp); + } lp = GetNumericArgument(lp, OPER_EQU, &fvar, gv); char str[SCRIPT_MAXSSIZE]; if (isint) { @@ -7696,6 +7699,24 @@ getnext: #ifdef USE_SCRIPT_ONEWIRE +bool script_OneWireCrc8(uint8_t *addr) { + uint8_t crc = 0; + uint8_t len = 8; + + while (len--) { + uint8_t inbyte = *addr++; // from 0 to 7 + for (uint32_t i = 8; i; i--) { + uint8_t mix = (crc ^ inbyte) & 0x01; + crc >>= 1; + if (mix) { + crc ^= 0x8C; + } + inbyte >>= 1; + } + } + return (crc == *addr); // addr 8 +} + uint32_t script_ow(uint8_t sel, uint32_t val) { uint32_t res = 0; uint8_t bits; @@ -7843,27 +7864,41 @@ ScriptOneWire *ow = &glob_script_mem.ow; } if (ow->ds) { + uint8_t data[9]; ow->ds->reset(); ow->ds->select(ow->ds_address[val - 1]); if (!bits) { ow->ds->write(0x44, 1); } else { ow->ds->write(0xbe, 1); - delay(10); - res = ow->ds->read(); - res |= ow->ds->read() << 8; + for (uint32_t cnt = 0; cnt < 9; cnt++) { + data[cnt] = ow->ds->read(); + } + if (script_OneWireCrc8(data)) { + res = data[0]; + res |= data[1] << 8; + } else { + res = 0; + } ow->ds->reset(); } } else { + uint8_t data[9]; ow->dsh->reset(); ow->dsh->select(ow->ds_address[val - 1]); if (!bits) { ow->dsh->write(0x44, 1); } else { ow->dsh->write(0xbe, 1); - delay(10); - res = ow->dsh->read(); - res |= ow->dsh->read() << 8; + for (uint32_t cnt = 0; cnt < 9; cnt++) { + data[cnt] = ow->dsh->read(); + } + if (script_OneWireCrc8(data)) { + res = data[0]; + res |= data[1] << 8; + } else { + res = 0; + } ow->dsh->reset(); } } @@ -8894,7 +8929,7 @@ void Script_Check_Hue(String *response) { } #ifdef SCRIPT_HUE_DEBUG if (response) { - AddLog(LOG_LEVEL_DEBUG, PSTR("Hue: %d"), hue_devs); + AddLog(LOG_LEVEL_INFO, PSTR("Hue: %d"), hue_devs); toLog(">>>>"); toLog(response->c_str()); toLog(response->c_str()+700); // Was MAX_LOGSZ @@ -8926,20 +8961,33 @@ void Script_Handle_Hue(String path) { uint8_t device = DecodeLightId(atoi(path.c_str())); uint8_t index = device - TasmotaGlobal.devices_present - 1; + uint16_t args = Webserver->args(); + +#ifdef ESP82666 + char *json = (char*)Webserver->arg(args - 1).c_str(); +#else + String request_arg = Webserver->arg(args - 1); + char *json = (char*)request_arg.c_str(); +#endif + +#ifdef SCRIPT_HUE_DEBUG + AddLog(LOG_LEVEL_INFO, PSTR("Hue 0: %s - %d "),path.c_str(), device); + AddLog(LOG_LEVEL_INFO, PSTR("Hue 1: %d, %s"), args, json); +#endif if (Webserver->args()) { response = "["; - JsonParser parser((char*) Webserver->arg((Webserver->args())-1).c_str()); + JsonParser parser(json); JsonParserObject root = parser.getRootObject(); JsonParserToken hue_on = root[PSTR("on")]; - if (hue_on) { + if (hue_on) { response += FPSTR(sHUE_LIGHT_RESPONSE_JSON); response.replace("{id", String(EncodeLightId(device))); response.replace("{cm", "on"); bool on = hue_on.getBool(); - if (on==false) { + if (on == false) { glob_script_mem.fvars[hue_script[index].index[0] - 1] = 0; response.replace("{re", "false"); } else { @@ -10158,6 +10206,16 @@ const char SCRIPT_MSG_PULLDOWNb[] PROGMEM = const char SCRIPT_MSG_PULLDOWNc[] PROGMEM = ""; +const char SCRIPT_MSG_RADIOa[] PROGMEM = + "%s

      %s"; +const char SCRIPT_MSG_RADIOa0[] PROGMEM = + "%s
      %s"; +const char SCRIPT_MSG_RADIOb[] PROGMEM = + "
      " + "
      "; +const char SCRIPT_MSG_RADIOc[] PROGMEM = + "
      "; + const char SCRIPT_MSG_TEXTINP[] PROGMEM = "%s"; @@ -10348,6 +10406,7 @@ uint32_t cnt; #define WSO_NODIV 2 #define WSO_FORCEPLAIN 4 #define WSO_FORCEMAIN 8 +#define WSO_FORCEGUI 16 #define WSO_STOP_DIV 0x80 void WCS_DIV(uint8_t flag) { @@ -10529,7 +10588,10 @@ const char *gc_str; strcpy_P(center, PSTR("
      ")); } - if ( ((!mc && (*lin != '$')) || (mc == 'w' && (*lin != '$'))) && (!(specopt & WSO_FORCEMAIN)) ) { + bool dogui = ((!mc && (*lin != '$')) || (mc == 'w' && (*lin != '$'))) && (!(specopt & WSO_FORCEMAIN)); + + if ((dogui && !(specopt & WSO_FORCEGUI)) || (!dogui && (specopt & WSO_FORCEGUI))) { + //if ( ((!mc && (*lin != '$')) || (mc == 'w' && (*lin != '$'))) && (!(specopt & WSO_FORCEMAIN)) || (specopt & WSO_FORCEGUI)) { // normal web section //AddLog(LOG_LEVEL_INFO, PSTR("normal %s"), lin); if (*lin == '@') { @@ -10673,6 +10735,62 @@ const char *gc_str; } WSContentSend_P(SCRIPT_MSG_PULLDOWNc); WCS_DIV(specopt | WSO_STOP_DIV); + } else if (!strncmp(lin, "rb(", 3)) { + // radio buttons + char *lp = lin + 3; + char *slp = lp; + TS_FLOAT val; + lp = GetNumericArgument(lp, OPER_EQU, &val, 0); + SCRIPT_SKIP_SPACES + + char vname[16]; + ScriptGetVarname(vname, slp, sizeof(vname)); + + SCRIPT_SKIP_SPACES + char pulabel[SCRIPT_MAXSSIZE]; + lp = GetStringArgument(lp, OPER_EQU, pulabel, 0); + SCRIPT_SKIP_SPACES + + glob_script_mem.glob_error = 0; + int16_t tsiz = -1; + TS_FLOAT fvar; + char *slp1 = lp; + lp = GetNumericArgument(lp, OPER_EQU, &fvar, 0); + if (!glob_script_mem.glob_error) { + tsiz = fvar; + } else { + lp = slp1; + } + + WCS_DIV(specopt); + if (tsiz < 0) { + WSContentSend_P(SCRIPT_MSG_RADIOa0, center, pulabel); + } else { + WSContentSend_P(SCRIPT_MSG_RADIOa, center, tsiz, pulabel); + } + + // get pu labels + uint8_t index = 1; + while (*lp) { + SCRIPT_SKIP_SPACES + lp = GetStringArgument(lp, OPER_EQU, pulabel, 0); + char *cp; + if (val == index) { + cp = (char*)"checked"; + } else { + cp = (char*)""; + } + WSContentSend_P(SCRIPT_MSG_RADIOb, vname, index, vname, cp, pulabel); + SCRIPT_SKIP_SPACES + if (*lp == ')') { + lp++; + break; + } + index++; + } + WSContentSend_P(SCRIPT_MSG_RADIOc); + WCS_DIV(specopt | WSO_STOP_DIV); + WSContentFlush(); } else if (!strncmp(lin, "bu(", 3)) { char *lp = lin + 3; uint8_t bcnt = 0; @@ -10880,11 +10998,11 @@ const char *gc_str; } else { // main section interface //AddLog(LOG_LEVEL_INFO, PSTR("main %s"), lin); - if ( (*lin == mc) || (mc == 'z') || (specopt&WSO_FORCEMAIN)) { + if ( (*lin == mc) || (mc == 'z') || (specopt & WSO_FORCEMAIN)) { #ifdef USE_GOOGLE_CHARTS if (mc != 'z') { - if (!(specopt&WSO_FORCEMAIN)) { + if (!(specopt & WSO_FORCEMAIN)) { lin++; } } @@ -11308,7 +11426,7 @@ exgc: #else if (mc != 'z') { - if (!(specopt&WSO_FORCEMAIN)) { + if (!(specopt & WSO_FORCEMAIN)) { lin++; } } From 10f9c20078b27cf6ef625acc8b21dade698b4baf Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Tue, 23 May 2023 14:34:47 +0200 Subject: [PATCH 177/289] Fix ESP32 SPI initialization for MFRC522 Fix ESP32 SPI initialization for MFRC522 (#18711) --- CHANGELOG.md | 4 ++-- RELEASENOTES.md | 12 +++++++----- tasmota/tasmota_xsns_sensor/xsns_80_mfrc522.ino | 7 ++++++- 3 files changed, 15 insertions(+), 8 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 83c31ccfc..7b6890e91 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,7 +9,6 @@ All notable changes to this project will be documented in this file. - Command ``WifiPower 1`` to restore default wifi power - HASPmota `meta` attribute and improved `berry_run` - ### Breaking Changed ### Changed @@ -23,7 +22,8 @@ All notable changes to this project will be documented in this file. - AIThinker webcam issues (#18652) - Berry `tasmota.wifi()` would wrongly report wifi as up - Inverted shutter now reflect status also in WEBGUI and several minor fixes to make "inverted" consistant (#18701) -- Matter fix fabric provisioning from CASE session for iOS 16.5 +- Matter fix fabric provisioning from CASE session for iOS 16.5 (#18709) +- ESP32 SPI initialization for MFRC522 (#18711) ### Removed diff --git a/RELEASENOTES.md b/RELEASENOTES.md index d0378915d..12a7eb682 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -142,13 +142,15 @@ The latter links can be used for OTA upgrades too like ``OtaUrl https://ota.tasm - Shutter sliders in WEBGUI automatically appear and disappear during configuration and update during movement [#18701](https://github.com/arendst/Tasmota/issues/18701) ### Fixed -- ESP8266 Energy Export Active no update regression from v12.3.1.3 -- ESP32 InfluxDb initial connection delays using HTTPClient [#18015](https://github.com/arendst/Tasmota/issues/18015) +- ESP8266 no update on Energy Export Active regression from v12.3.1.3 - NovaSDS GUI values [#18444](https://github.com/arendst/Tasmota/issues/18444) - LED PWM ac_dimmer curve was wrongly applied instead of Gamma regression from v12.2.0.5 [#18666](https://github.com/arendst/Tasmota/issues/18666) -- AIThinker webcam issues [#18652](https://github.com/arendst/Tasmota/issues/18652) - Shutter bootloop using more than 4 shutters [#18673](https://github.com/arendst/Tasmota/issues/18673) - Inverted shutter now reflect status also in WEBGUI and several minor fixes to make "inverted" consistant [#18701](https://github.com/arendst/Tasmota/issues/18701) -- Berry rules for string comparisons [#18464](https://github.com/arendst/Tasmota/issues/18464) -- Berry a rare condition when a GC causes a memory corruption - ESP32 Partition_Manager.tapp +- ESP32 InfluxDb initial connection delays using HTTPClient [#18015](https://github.com/arendst/Tasmota/issues/18015) +- ESP32 AIThinker webcam issues [#18652](https://github.com/arendst/Tasmota/issues/18652) +- ESP32 SPI initialization for MFRC522 [#18711](https://github.com/arendst/Tasmota/issues/18711) +- Berry a rare condition when a GC causes a memory corruption +- Berry rules for string comparisons [#18464](https://github.com/arendst/Tasmota/issues/18464) +- Matter fix fabric provisioning from CASE session for iOS 16.5 [#18709](https://github.com/arendst/Tasmota/issues/18709) diff --git a/tasmota/tasmota_xsns_sensor/xsns_80_mfrc522.ino b/tasmota/tasmota_xsns_sensor/xsns_80_mfrc522.ino index dcd9f5d3a..037ded6da 100644 --- a/tasmota/tasmota_xsns_sensor/xsns_80_mfrc522.ino +++ b/tasmota/tasmota_xsns_sensor/xsns_80_mfrc522.ino @@ -98,9 +98,14 @@ void RC522ScanForTag(void) { } void RC522Init(void) { - if (PinUsed(GPIO_RC522_CS) && PinUsed(GPIO_RC522_RST) && TasmotaGlobal.spi_enabled) { + if (PinUsed(GPIO_RC522_CS) && PinUsed(GPIO_RC522_RST) && (SPI_MOSI_MISO == TasmotaGlobal.spi_enabled)) { Mfrc522 = new MFRC522(Pin(GPIO_RC522_CS), Pin(GPIO_RC522_RST)); +#ifdef EPS8266 SPI.begin(); +#endif // EPS8266 +#ifdef ESP32 + SPI.begin(Pin(GPIO_SPI_CLK), Pin(GPIO_SPI_MISO), Pin(GPIO_SPI_MOSI), -1); +#endif // ESP32 Mfrc522->PCD_Init(); // if (Mfrc522->PCD_PerformSelfTest()) { // Saves 0k5 code uint8_t v = Mfrc522->PCD_ReadRegister(Mfrc522->VersionReg); From 4f05acd052c550e99f7ad3fed106904d2b9c8cc4 Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Tue, 23 May 2023 16:55:19 +0200 Subject: [PATCH 178/289] refactored GH action workflow --- .github/workflows/Tasmota_build_master.yml | 76 +++------------------- 1 file changed, 8 insertions(+), 68 deletions(-) diff --git a/.github/workflows/Tasmota_build_master.yml b/.github/workflows/Tasmota_build_master.yml index 56cc4ff96..fed63a00b 100644 --- a/.github/workflows/Tasmota_build_master.yml +++ b/.github/workflows/Tasmota_build_master.yml @@ -1,7 +1,7 @@ name: Build_firmware_master on: - workflow_dispatch: # Manually start a workflow + workflow_dispatch: # Start a workflow push: branches: master paths-ignore: @@ -27,10 +27,6 @@ jobs: - name: Install clang compiler run: | sudo apt-get install -f clang - - name: Run coc - run: | - cd lib/libesp32/berry - ./gen.sh - name: Make Berry and Tasmota Berry code run: | cd lib/libesp32/berry @@ -239,7 +235,7 @@ jobs: name: firmware path: ./build_output - Upload: + Release: needs: [base-images, base32-images, language-images] runs-on: ubuntu-latest continue-on-error: true @@ -266,70 +262,14 @@ jobs: env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - - name: Move firmware files in sub-folders - run: | - mkdir -p ./release-firmware/tasmota/languages - mkdir -p ./release-firmware/tasmota32/languages - mkdir -p ./release-firmware/map - [ ! -f ./mv_firmware/map/* ] || mv ./mv_firmware/map/* ./release-firmware/map/ - [ ! -f ./mv_firmware/firmware/tasmota.* ] || mv ./mv_firmware/firmware/tasmota.* ./release-firmware/tasmota/ - [ ! -f ./mv_firmware/firmware/tasmota-4M.* ] || mv ./mv_firmware/firmware/tasmota-4M.* ./release-firmware/tasmota/ - [ ! -f ./mv_firmware/firmware/tasmota-sensors.* ] || mv ./mv_firmware/firmware/tasmota-sensors.* ./release-firmware/tasmota/ - [ ! -f ./mv_firmware/firmware/tasmota-minimal.bin.gz ] || mv ./mv_firmware/firmware/tasmota-minimal.bin.gz ./release-firmware/tasmota/ - [ ! -f ./mv_firmware/firmware/tasmota-lite.* ] || mv ./mv_firmware/firmware/tasmota-lite.* ./release-firmware/tasmota/ - [ ! -f ./mv_firmware/firmware/tasmota-ir*.* ] || mv ./mv_firmware/firmware/tasmota-ir*.* ./release-firmware/tasmota/ - [ ! -f ./mv_firmware/firmware/tasmota-display.* ] || mv ./mv_firmware/firmware/tasmota-display.* ./release-firmware/tasmota/ - [ ! -f ./mv_firmware/firmware/tasmota-knx.* ] || mv ./mv_firmware/firmware/tasmota-knx.* ./release-firmware/tasmota/ - [ ! -f ./mv_firmware/firmware/tasmota-zbbridge.* ] || mv ./mv_firmware/firmware/tasmota-zbbridge.* ./release-firmware/tasmota/ - [ ! -f ./mv_firmware/firmware/tasmota-zigbee.* ] || mv ./mv_firmware/firmware/tasmota-zigbee.* ./release-firmware/tasmota/ - [ ! -f ./mv_firmware/firmware/tasmota32.* ] || mv ./mv_firmware/firmware/tasmota32.* ./release-firmware/tasmota32/ - [ ! -f ./mv_firmware/firmware/tasmota32solo1*.* ] || mv ./mv_firmware/firmware/tasmota32solo1*.* ./release-firmware/tasmota32/ - [ ! -f ./mv_firmware/firmware/tasmota32-ir*.* ] || mv ./mv_firmware/firmware/tasmota32-ir*.* ./release-firmware/tasmota32/ - [ ! -f ./mv_firmware/firmware/tasmota32-display.* ] || mv ./mv_firmware/firmware/tasmota32-display.* ./release-firmware/tasmota32/ - [ ! -f ./mv_firmware/firmware/tasmota32-lvgl.* ] || mv ./mv_firmware/firmware/tasmota32-lvgl.* ./release-firmware/tasmota32/ - [ ! -f ./mv_firmware/firmware/tasmota32-web*.* ] || mv ./mv_firmware/firmware/tasmota32-web*.* ./release-firmware/tasmota32/ - [ ! -f ./mv_firmware/firmware/tasmota32-zbbrdgpro.* ] || mv ./mv_firmware/firmware/tasmota32-zbbrdgpro.* ./release-firmware/tasmota32/ - [ ! -f ./mv_firmware/firmware/tasmota32-nspanel.* ] || mv ./mv_firmware/firmware/tasmota32-nspanel.* ./release-firmware/tasmota32/ - [ ! -f ./mv_firmware/firmware/tasmota32-odroidgo.* ] || mv ./mv_firmware/firmware/tasmota32-odroidgo.* ./release-firmware/tasmota32/ - [ ! -f ./mv_firmware/firmware/tasmota32-core2.* ] || mv ./mv_firmware/firmware/tasmota32-core2.* ./release-firmware/tasmota32/ - [ ! -f ./mv_firmware/firmware/tasmota32-bluetooth.* ] || mv ./mv_firmware/firmware/tasmota32-bluetooth.* ./release-firmware/tasmota32/ - [ ! -f ./mv_firmware/firmware/tasmota32c3*.* ] || mv ./mv_firmware/firmware/tasmota32c3*.* ./release-firmware/tasmota32/ - [ ! -f ./mv_firmware/firmware/tasmota32s2*.* ] || mv ./mv_firmware/firmware/tasmota32s2*.* ./release-firmware/tasmota32/ - [ ! -f ./mv_firmware/firmware/tasmota32s3*.* ] || mv ./mv_firmware/firmware/tasmota32s3*.* ./release-firmware/tasmota32/ - [ ! -f ./mv_firmware/firmware/tasmota32-safeboot* ] || mv ./mv_firmware/firmware/tasmota32-safeboot* ./release-firmware/tasmota32/ - [ ! -f ./mv_firmware/firmware/tasmota32-* ] || mv ./mv_firmware/firmware/tasmota32-* ./release-firmware/tasmota32/languages/ - [ ! -f ./mv_firmware/firmware/tasmota32* ] || mv ./mv_firmware/firmware/tasmota32* ./release-firmware/tasmota32/languages/ - [ ! -f ./mv_firmware/firmware/tasmota-minimal.bin ] || rm -rf ./mv_firmware/firmware/tasmota-minimal.bin - [ ! -f ./mv_firmware/firmware/* ] || mv ./mv_firmware/firmware/* ./release-firmware/tasmota/languages/ - - name: Display files to transfer - run: ls -R ./* - - name: Push Firmware files to tmp_copy repo - uses: Jason2866/copy_file_to_another_repo_action@main - env: - API_TOKEN_GITHUB: ${{ secrets.API_TOKEN_GITHUB }} - with: - source_file: 'release-firmware' - destination_repo: 'arendst/tmp_copy' - destination_branch: 'firmware' - user_email: 'github-actions@github.com' - user_name: 'github-actions' - Start_final_copy: - needs: Upload + needs: [base-images, base32-images, language-images] runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - - name: Creat trigger.txt + - name: Dispatch workflow in arendst/Tasmota-firmware run: | - echo ${GITHUB_SHA} &> trigger.txt - echo "$( Date: Tue, 23 May 2023 17:08:21 +0200 Subject: [PATCH 179/289] Workflow needs the release binaries --- .github/workflows/Tasmota_build_master.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/Tasmota_build_master.yml b/.github/workflows/Tasmota_build_master.yml index fed63a00b..a4749a6ac 100644 --- a/.github/workflows/Tasmota_build_master.yml +++ b/.github/workflows/Tasmota_build_master.yml @@ -263,7 +263,7 @@ jobs: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} Start_final_copy: - needs: [base-images, base32-images, language-images] + needs: Release runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 From f2edb2fb3c81256e0c29ac21dd61c7acc550f099 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ludovic=20BOU=C3=89?= Date: Tue, 23 May 2023 19:26:30 +0200 Subject: [PATCH 180/289] Update Matter_HTTP_remote.be (#18719) Fix log message for MTR HTTP sync/async request --- lib/libesp32/berry_matter/src/embedded/Matter_HTTP_remote.be | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_HTTP_remote.be b/lib/libesp32/berry_matter/src/embedded/Matter_HTTP_remote.be index 1c3410995..0106ead33 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_HTTP_remote.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_HTTP_remote.be @@ -43,7 +43,7 @@ class Matter_HTTP_remote : Matter_HTTP_async # returns nil if no network def begin(cmd) import string - tasmota.log(string.format("MTR: HTTP async request 'http://%s:%i/%s'", self.addr, self.port, cmd), 3) + tasmota.log(string.format("MTR: HTTP async request 'http://%s:%i%s'", self.addr, self.port, cmd), 3) return super(self).begin(cmd) end @@ -56,7 +56,7 @@ class Matter_HTTP_remote : Matter_HTTP_async # returns the payload as string def begin_sync(cmd, timeout) import string - tasmota.log(string.format("MTR: HTTP sync request 'http://%s:%i/%s'", self.addr, self.port, cmd), 3) + tasmota.log(string.format("MTR: HTTP sync request 'http://%s:%i%s'", self.addr, self.port, cmd), 3) return super(self).begin_sync(cmd, timeout) end From b715f03db651ca4ef22f03d791d8e241769602d5 Mon Sep 17 00:00:00 2001 From: s-hadinger Date: Tue, 23 May 2023 17:27:46 +0000 Subject: [PATCH 181/289] Solidified Code updated --- .../berry_matter/src/solidify/solidified_Matter_HTTP_remote.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_HTTP_remote.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_HTTP_remote.h index e112e0935..ec18ad0ee 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_HTTP_remote.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_HTTP_remote.h @@ -59,7 +59,7 @@ be_local_closure(Matter_HTTP_remote_begin_sync, /* name */ /* K1 */ be_nested_str_weak(tasmota), /* K2 */ be_nested_str_weak(log), /* K3 */ be_nested_str_weak(format), - /* K4 */ be_nested_str_weak(MTR_X3A_X20HTTP_X20sync_X20request_X20_X27http_X3A_X2F_X2F_X25s_X3A_X25i_X2F_X25s_X27), + /* K4 */ be_nested_str_weak(MTR_X3A_X20HTTP_X20sync_X20request_X20_X27http_X3A_X2F_X2F_X25s_X3A_X25i_X25s_X27), /* K5 */ be_nested_str_weak(addr), /* K6 */ be_nested_str_weak(port), /* K7 */ be_const_int(3), @@ -257,7 +257,7 @@ be_local_closure(Matter_HTTP_remote_begin, /* name */ /* K1 */ be_nested_str_weak(tasmota), /* K2 */ be_nested_str_weak(log), /* K3 */ be_nested_str_weak(format), - /* K4 */ be_nested_str_weak(MTR_X3A_X20HTTP_X20async_X20request_X20_X27http_X3A_X2F_X2F_X25s_X3A_X25i_X2F_X25s_X27), + /* K4 */ be_nested_str_weak(MTR_X3A_X20HTTP_X20async_X20request_X20_X27http_X3A_X2F_X2F_X25s_X3A_X25i_X25s_X27), /* K5 */ be_nested_str_weak(addr), /* K6 */ be_nested_str_weak(port), /* K7 */ be_const_int(3), From 4be618fe7b6d3d4eb22870b89ea494f0884883a0 Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Wed, 24 May 2023 15:09:26 +0200 Subject: [PATCH 182/289] Fix WS2812 string distortions during analogRead() Fix WS2812 string distortions during analogRead() --- tasmota/tasmota_xsns_sensor/xsns_02_analog.ino | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/tasmota/tasmota_xsns_sensor/xsns_02_analog.ino b/tasmota/tasmota_xsns_sensor/xsns_02_analog.ino index 094cbb798..12292d0b0 100644 --- a/tasmota/tasmota_xsns_sensor/xsns_02_analog.ino +++ b/tasmota/tasmota_xsns_sensor/xsns_02_analog.ino @@ -317,6 +317,11 @@ uint16_t AdcRead(uint32_t pin, uint32_t factor) { // factor 3 = 8 samples // factor 4 = 16 samples // factor 5 = 32 samples +#ifdef USE_LIGHT + if ((XLGT_01 == TasmotaGlobal.light_driver) && LightPower()) { + delay(5); // analogRead() interferes with DMA/RMT so wait for a decent amount of time + } +#endif // USE_LIGHT uint32_t samples = 1 << factor; uint32_t analog = 0; for (uint32_t i = 0; i < samples; i++) { From fc67cca8b42265c909b2d84ec6e906d511e6f7b1 Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Wed, 24 May 2023 16:21:59 +0200 Subject: [PATCH 183/289] Add generic SystemWaitIfBusy() to fix WS2812 led flicker Add generic SystemWaitIfBusy() to fix WS2812 led flicker --- tasmota/tasmota.ino | 1 + tasmota/tasmota_support/support.ino | 25 +++++++++++++++++++ .../xdrv_52_3_berry_leds.ino | 17 +++++++------ tasmota/tasmota_xlgt_light/xlgt_01_ws2812.ino | 17 ++++++++----- .../tasmota_xsns_sensor/xsns_02_analog.ino | 7 ++---- 5 files changed, 48 insertions(+), 19 deletions(-) diff --git a/tasmota/tasmota.ino b/tasmota/tasmota.ino index 8958e121c..56434faea 100644 --- a/tasmota/tasmota.ino +++ b/tasmota/tasmota.ino @@ -310,6 +310,7 @@ struct TasmotaGlobal_t { bool no_autoexec; // Disable autoexec uint8_t user_globals[3]; // User set global temp/hum/press + uint8_t busy_time; // Time in ms to allow executing of time critical functions uint8_t init_state; // Tasmota init state uint8_t heartbeat_inverted; // Heartbeat pulse inverted flag uint8_t spi_enabled; // SPI configured diff --git a/tasmota/tasmota_support/support.ino b/tasmota/tasmota_support/support.ino index fbeae1688..e7bad295e 100755 --- a/tasmota/tasmota_support/support.ino +++ b/tasmota/tasmota_support/support.ino @@ -2210,6 +2210,31 @@ bool TimeReachedUsec(uint32_t timer) return (passed >= 0); } +void SystemSetBusy(uint32_t busy) { +/* + TasmotaGlobal.busy_time = millis(); + SetNextTimeInterval(TasmotaGlobal.busy_time, busy +1); + if (!TasmotaGlobal.busy_time) { + TasmotaGlobal.busy_time++; + } +*/ + TasmotaGlobal.busy_time = busy; +} + +void SystemWaitIfBusy(void) { + if (TasmotaGlobal.busy_time) { +/* + // Calls to millis() interrupt RMT and defeats our goal + if (!TimeReached(TasmotaGlobal.busy_time)) { + delay(1); + } +*/ + delay(TasmotaGlobal.busy_time); + + TasmotaGlobal.busy_time = 0; + } +} + /*********************************************************************************************\ * Syslog * diff --git a/tasmota/tasmota_xdrv_driver/xdrv_52_3_berry_leds.ino b/tasmota/tasmota_xdrv_driver/xdrv_52_3_berry_leds.ino index 3d6b8f86b..f8327c68b 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_52_3_berry_leds.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_52_3_berry_leds.ino @@ -39,15 +39,15 @@ typedef NeoPixelBus neopixel_sk6812_gr /*********************************************************************************************\ * Native functions mapped to Berry functions - * + * * import unishox - * - * + * + * \*********************************************************************************************/ extern "C" { // # Native commands - // # 00 : ctor + // # 00 : ctor // # 01 : begin void -> void // # 02 : show void -> void // # 03 : CanShow void -> bool @@ -88,7 +88,7 @@ extern "C" { int32_t argc = be_top(vm); // Get the number of arguments if (argc >= 2 && be_isint(vm, 2)) { int32_t cmd = be_toint(vm, 2); - + if (0 == cmd) { // 00 : ctor (leds:int, gpio:int) -> void if (!(argc >= 6 && be_isint(vm, 3) && be_isint(vm, 4) && be_isint(vm, 5) && be_isint(vm, 6))) { be_raise(vm, "value_error", "bad arguments for neopixelbus:ctor"); @@ -136,6 +136,7 @@ extern "C" { case 2: // # 02 : show void -> void if (s_ws2812_grb) s_ws2812_grb->Show(); if (s_sk6812_grbw) s_sk6812_grbw->Show(); + SystemSetBusy(4); break; case 3: // # 03 : CanShow void -> bool if (s_ws2812_grb) be_pushbool(vm, s_ws2812_grb->CanShow()); @@ -154,7 +155,7 @@ extern "C" { uint8_t * pixels; if (s_ws2812_grb) pixels = s_ws2812_grb->Pixels(); if (s_sk6812_grbw) pixels = s_sk6812_grbw->Pixels(); - + be_pushcomptr(vm, pixels); } break; @@ -196,11 +197,11 @@ extern "C" { if (s_ws2812_grb) { RgbColor rgb = s_ws2812_grb->GetPixelColor(idx); - be_pushint(vm, (rgb.R << 16) | (rgb.G << 8) | rgb.B); + be_pushint(vm, (rgb.R << 16) | (rgb.G << 8) | rgb.B); } if (s_sk6812_grbw) { RgbwColor rgbw = s_sk6812_grbw->GetPixelColor(idx); - be_pushint(vm, (rgbw.W << 24) | (rgb.R << 16) | (rgb.G << 8) | rgb.B); + be_pushint(vm, (rgbw.W << 24) | (rgb.R << 16) | (rgb.G << 8) | rgb.B); } } break; diff --git a/tasmota/tasmota_xlgt_light/xlgt_01_ws2812.ino b/tasmota/tasmota_xlgt_light/xlgt_01_ws2812.ino index c0f7ff7e5..8dd87f738 100644 --- a/tasmota/tasmota_xlgt_light/xlgt_01_ws2812.ino +++ b/tasmota/tasmota_xlgt_light/xlgt_01_ws2812.ino @@ -212,6 +212,11 @@ long wsmap(long x, long in_min, long in_max, long out_min, long out_max) { return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min; } +void Ws2812LibStripShow(void) { + strip->Show(); + SystemSetBusy(Settings->light_pixels >> 2); // 256 / 64 = 4 +} + void Ws2812StripShow(void) { #if (USE_WS2812_CTYPE > NEO_3LED) @@ -232,7 +237,7 @@ void Ws2812StripShow(void) strip->SetPixelColor(i, c); } } - strip->Show(); + Ws2812LibStripShow(); } int mod(int a, int b) @@ -549,7 +554,7 @@ void Ws2812DDP(void) void Ws2812Clear(void) { strip->ClearTo(0); - strip->Show(); + Ws2812LibStripShow(); Ws2812.show_next = 1; } @@ -575,7 +580,7 @@ void Ws2812SetColor(uint32_t led, uint8_t red, uint8_t green, uint8_t blue, uint } if (!Ws2812.suspend_update) { - strip->Show(); + Ws2812LibStripShow(); Ws2812.show_next = 1; } } @@ -616,7 +621,7 @@ void Ws2812ForceSuspend (void) void Ws2812ForceUpdate (void) { Ws2812.suspend_update = false; - strip->Show(); + Ws2812LibStripShow(); Ws2812.show_next = 1; } @@ -634,7 +639,7 @@ bool Ws2812SetChannels(void) void Ws2812ShowScheme(void) { uint32_t scheme = Settings->light_scheme - Ws2812.scheme_offset; - + #ifdef USE_NETWORK_LIGHT_SCHEMES if ((scheme != 9) && (ddp_udp_up)) { ddp_udp.stop(); @@ -797,7 +802,7 @@ size_t Ws2812StripGetPixelSize(void) { // return true if strip was dirty and an actual refresh was triggered bool Ws2812StripRefresh(void) { if (strip->IsDirty()) { - strip->Show(); + Ws2812LibStripShow(); return true; } else { return false; diff --git a/tasmota/tasmota_xsns_sensor/xsns_02_analog.ino b/tasmota/tasmota_xsns_sensor/xsns_02_analog.ino index 12292d0b0..4351b12aa 100644 --- a/tasmota/tasmota_xsns_sensor/xsns_02_analog.ino +++ b/tasmota/tasmota_xsns_sensor/xsns_02_analog.ino @@ -317,11 +317,8 @@ uint16_t AdcRead(uint32_t pin, uint32_t factor) { // factor 3 = 8 samples // factor 4 = 16 samples // factor 5 = 32 samples -#ifdef USE_LIGHT - if ((XLGT_01 == TasmotaGlobal.light_driver) && LightPower()) { - delay(5); // analogRead() interferes with DMA/RMT so wait for a decent amount of time - } -#endif // USE_LIGHT + SystemWaitIfBusy(); + uint32_t samples = 1 << factor; uint32_t analog = 0; for (uint32_t i = 0; i < samples; i++) { From d0e88c9dae9e6382d15714a5e7c93d5a44a7f62f Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Wed, 24 May 2023 17:24:48 +0200 Subject: [PATCH 184/289] Fix BusyDelay WS2812 --- tasmota/tasmota_support/support.ino | 5 ++--- tasmota/tasmota_xdrv_driver/xdrv_52_3_berry_leds.ino | 4 +++- tasmota/tasmota_xlgt_light/xlgt_01_ws2812.ino | 7 ++++++- tasmota/tasmota_xsns_sensor/xsns_02_analog.ino | 2 +- 4 files changed, 12 insertions(+), 6 deletions(-) diff --git a/tasmota/tasmota_support/support.ino b/tasmota/tasmota_support/support.ino index e7bad295e..a6f426be8 100755 --- a/tasmota/tasmota_support/support.ino +++ b/tasmota/tasmota_support/support.ino @@ -2210,7 +2210,7 @@ bool TimeReachedUsec(uint32_t timer) return (passed >= 0); } -void SystemSetBusy(uint32_t busy) { +void SystemBusyDelay(uint32_t busy) { /* TasmotaGlobal.busy_time = millis(); SetNextTimeInterval(TasmotaGlobal.busy_time, busy +1); @@ -2221,7 +2221,7 @@ void SystemSetBusy(uint32_t busy) { TasmotaGlobal.busy_time = busy; } -void SystemWaitIfBusy(void) { +void SystemBusyDelayExecute(void) { if (TasmotaGlobal.busy_time) { /* // Calls to millis() interrupt RMT and defeats our goal @@ -2230,7 +2230,6 @@ void SystemWaitIfBusy(void) { } */ delay(TasmotaGlobal.busy_time); - TasmotaGlobal.busy_time = 0; } } diff --git a/tasmota/tasmota_xdrv_driver/xdrv_52_3_berry_leds.ino b/tasmota/tasmota_xdrv_driver/xdrv_52_3_berry_leds.ino index f8327c68b..c3af02426 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_52_3_berry_leds.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_52_3_berry_leds.ino @@ -136,7 +136,9 @@ extern "C" { case 2: // # 02 : show void -> void if (s_ws2812_grb) s_ws2812_grb->Show(); if (s_sk6812_grbw) s_sk6812_grbw->Show(); - SystemSetBusy(4); + // Wait for RMT/I2S to complete fixes distortion due to analogRead +// delay(5); + SystemBusyDelay(5); // Max 256 leds break; case 3: // # 03 : CanShow void -> bool if (s_ws2812_grb) be_pushbool(vm, s_ws2812_grb->CanShow()); diff --git a/tasmota/tasmota_xlgt_light/xlgt_01_ws2812.ino b/tasmota/tasmota_xlgt_light/xlgt_01_ws2812.ino index 8dd87f738..13032fdf8 100644 --- a/tasmota/tasmota_xlgt_light/xlgt_01_ws2812.ino +++ b/tasmota/tasmota_xlgt_light/xlgt_01_ws2812.ino @@ -214,7 +214,12 @@ long wsmap(long x, long in_min, long in_max, long out_min, long out_max) { void Ws2812LibStripShow(void) { strip->Show(); - SystemSetBusy(Settings->light_pixels >> 2); // 256 / 64 = 4 + +#if defined(USE_WS2812_DMA) || defined(USE_WS2812_RMT) || defined(USE_WS2812_I2S) + // Wait for DMA/RMT/I2S to complete fixes distortion due to analogRead +// delay((Settings->light_pixels >> 6) +1); // 256 / 64 = 4 +1 = 5 + SystemBusyDelay((Settings->light_pixels >> 6) +1); // 256 / 64 = 4 +1 = 5 +#endif } void Ws2812StripShow(void) diff --git a/tasmota/tasmota_xsns_sensor/xsns_02_analog.ino b/tasmota/tasmota_xsns_sensor/xsns_02_analog.ino index 4351b12aa..59c469d12 100644 --- a/tasmota/tasmota_xsns_sensor/xsns_02_analog.ino +++ b/tasmota/tasmota_xsns_sensor/xsns_02_analog.ino @@ -317,7 +317,7 @@ uint16_t AdcRead(uint32_t pin, uint32_t factor) { // factor 3 = 8 samples // factor 4 = 16 samples // factor 5 = 32 samples - SystemWaitIfBusy(); + SystemBusyDelayExecute(); uint32_t samples = 1 << factor; uint32_t analog = 0; From ce136309eb278fa7993ae926bcf81a3e40d3f393 Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Wed, 24 May 2023 19:43:01 +0200 Subject: [PATCH 185/289] Trigger workflow is now "gh_actions" --- .github/workflows/Tasmota_build_devel.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/Tasmota_build_devel.yml b/.github/workflows/Tasmota_build_devel.yml index 18ffa8f5c..c4bc8fb61 100644 --- a/.github/workflows/Tasmota_build_devel.yml +++ b/.github/workflows/Tasmota_build_devel.yml @@ -246,4 +246,4 @@ jobs: curl -X POST https://api.github.com/repos/arendst/Tasmota-firmware/actions/workflows/fetch_deploy.yml/dispatches \ -H 'Accept: application/vnd.github.everest-preview+json' \ -u ${{ secrets.API_TOKEN_GITHUB }} \ - --data '{"ref": "main"}' + --data '{"ref": "gh_actions"}' From 478b378d7d64bfb187211ecb9bb9eaaa39b24507 Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Wed, 24 May 2023 19:43:53 +0200 Subject: [PATCH 186/289] Trigger workflow is now "gh_actions" --- .github/workflows/Tasmota_build_master.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/Tasmota_build_master.yml b/.github/workflows/Tasmota_build_master.yml index a4749a6ac..545d32028 100644 --- a/.github/workflows/Tasmota_build_master.yml +++ b/.github/workflows/Tasmota_build_master.yml @@ -272,4 +272,4 @@ jobs: curl -X POST https://api.github.com/repos/arendst/Tasmota-firmware/actions/workflows/fetch_deploy.yml/dispatches \ -H 'Accept: application/vnd.github.everest-preview+json' \ -u ${{ secrets.API_TOKEN_GITHUB }} \ - --data '{"ref": "main"}' + --data '{"ref": "gh_actions"}' From 75f634dc71e2ca9fceb6ed6b2ef5979fa5843a06 Mon Sep 17 00:00:00 2001 From: Barbudor Date: Thu, 25 May 2023 12:20:30 +0200 Subject: [PATCH 187/289] freeze readings before deepsleep (#18720) --- tasmota/tasmota_xsns_sensor/xsns_09_bmp.ino | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/tasmota/tasmota_xsns_sensor/xsns_09_bmp.ino b/tasmota/tasmota_xsns_sensor/xsns_09_bmp.ino index f394e8dd2..b9ed27082 100644 --- a/tasmota/tasmota_xsns_sensor/xsns_09_bmp.ino +++ b/tasmota/tasmota_xsns_sensor/xsns_09_bmp.ino @@ -73,7 +73,9 @@ typedef struct { uint8_t bmp_addresses[] = { BMP_ADDR1, BMP_ADDR2 }; uint8_t bmp_count = 0; -uint8_t bmp_once = 1; +#ifdef USE_DEEPSLEEP +uint8_t bmp_deepsleep = 0; // Prevent updating measurments once BMP has been put to sleep (just before ESP enters deepsleep) +#endif bmp_sensors_t *bmp_sensors = nullptr; @@ -478,12 +480,10 @@ void Bme680Read(uint8_t bmp_idx) { /********************************************************************************************/ void BmpDetect(void) { - int bmp_sensor_size = BMP_MAX_SENSORS * sizeof(bmp_sensors_t); if (!bmp_sensors) { - bmp_sensors = (bmp_sensors_t*)malloc(bmp_sensor_size); + bmp_sensors = (bmp_sensors_t*)calloc(BMP_MAX_SENSORS, sizeof(bmp_sensors_t)); } if (!bmp_sensors) { return; } - memset(bmp_sensors, 0, bmp_sensor_size); // Init defaults to 0 for (uint32_t i = 0; i < BMP_MAX_SENSORS; i++) { uint8_t bus = i >>1; @@ -523,6 +523,10 @@ void BmpDetect(void) { } void BmpRead(void) { +#ifdef USE_DEEPSLEEP + // Prevent updating measurments once BMP has been put to sleep (just before ESP enters deepsleep) + if (bmp_deepsleep) return; +#endif for (uint32_t bmp_idx = 0; bmp_idx < bmp_count; bmp_idx++) { switch (bmp_sensors[bmp_idx].bmp_type) { case BMP180_CHIPID: @@ -692,6 +696,7 @@ bool Xsns09(uint32_t function) { #ifdef USE_DEEPSLEEP case FUNC_SAVE_BEFORE_RESTART: BMP_EnterSleep(); + bmp_deepsleep = 1; break; #endif // USE_DEEPSLEEP } From e932902351edb148f767dc6f47c527850215a4f8 Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Thu, 25 May 2023 16:05:53 +0200 Subject: [PATCH 188/289] add all map files to release in a single zip file so it does not liter the release section with many files --- .github/workflows/Tasmota_build_master.yml | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/.github/workflows/Tasmota_build_master.yml b/.github/workflows/Tasmota_build_master.yml index 545d32028..267fd6acc 100644 --- a/.github/workflows/Tasmota_build_master.yml +++ b/.github/workflows/Tasmota_build_master.yml @@ -253,12 +253,16 @@ jobs: path: ./mv_firmware - name: Display structure of downloaded files run: ls -R ./mv_firmware/ + - name: Zip all map.gz files in one file -> map_all.zip + run: 7z a -mx=9 -tzip -xr'!.*' map_all.zip mv_firmware/map - name: Release uses: jason2866/action-gh-release@v1.2 #if: startsWith(github.ref, 'refs/tags/') with: tag_name: ${{ github.run_number }} - files: ./mv_firmware/firmware/* + files: | + ./mv_firmware/firmware/* + map_all.zip env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} From e05d75248e0444b0966a0b4d1803c4512e787a44 Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Thu, 25 May 2023 17:13:31 +0200 Subject: [PATCH 189/289] Add undocumented feature --- tasmota/include/tasmota_types.h | 2 +- tasmota/tasmota_support/support_command.ino | 1 + tasmota/tasmota_xdrv_driver/xdrv_52_9_berry.ino | 6 ++++++ tools/decode-status.py | 4 ++-- 4 files changed, 10 insertions(+), 3 deletions(-) diff --git a/tasmota/include/tasmota_types.h b/tasmota/include/tasmota_types.h index 004b6602b..9f0005da7 100644 --- a/tasmota/include/tasmota_types.h +++ b/tasmota/include/tasmota_types.h @@ -186,7 +186,7 @@ typedef union { // Restricted by MISRA-C Rule 18.4 bu uint32_t no_voltage_common : 1; // bit 4 (v12.3.1.5) - SetOption150 - (Energy) Force no voltage/frequency common uint32_t matter_enabled : 1; // bit 5 (v12.3.1.5) - SetOption151 - (Matter) Enable Matter protocol over Wifi uint32_t bistable_single_pin : 1; // bit 6 (v12.5.0.1) - SetOption152 - (Power) Switch between two (0) or one (1) pin bistable relay control - uint32_t spare07 : 1; // bit 7 + uint32_t berry_autoexec : 1; // bit 7 (v12.5.0.3) - SetOption153 - (Berry) Disable autoexec.be on restart (1) uint32_t spare08 : 1; // bit 8 uint32_t spare09 : 1; // bit 9 uint32_t spare10 : 1; // bit 10 diff --git a/tasmota/tasmota_support/support_command.ino b/tasmota/tasmota_support/support_command.ino index b4661c896..ca205150d 100644 --- a/tasmota/tasmota_support/support_command.ino +++ b/tasmota/tasmota_support/support_command.ino @@ -1474,6 +1474,7 @@ void CmndSetoptionBase(bool indexed) { switch (pindex) { case 5: // SetOption151 - Matter enabled case 6: // SetOption152 - (Power) Use single pin bistable + case 7: // SetOption153 - (Berry) Disable autoexec.be on restart (1) TasmotaGlobal.restart_flag = 2; break; } diff --git a/tasmota/tasmota_xdrv_driver/xdrv_52_9_berry.ino b/tasmota/tasmota_xdrv_driver/xdrv_52_9_berry.ino index 6ee7437b1..917f656b0 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_52_9_berry.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_52_9_berry.ino @@ -378,6 +378,12 @@ void BerryInit(void) { void BrLoad(const char * script_name) { if (berry.vm == nullptr || TasmotaGlobal.no_autoexec) { return; } // abort is berry is not running, or bootloop prevention kicked in + if (!strcmp_P(script_name, "autoexec.be")) { + if (Settings->flag6.berry_autoexec) { // SetOption153 - (Berry) Disable autoexec.be on restart (1) + return; + } + } + be_getglobal(berry.vm, PSTR("load")); if (!be_isnil(berry.vm, -1)) { be_pushstring(berry.vm, script_name); diff --git a/tools/decode-status.py b/tools/decode-status.py index 2b6164fca..abd99ecfe 100755 --- a/tools/decode-status.py +++ b/tools/decode-status.py @@ -208,7 +208,7 @@ a_setoption = [[ "(Energy) Force no voltage/frequency common", "(Matter) Enable Matter protocol over Wifi", "(Power) Switch between two (0) or one (1) pin bistable relay control", - "", + "(Berry) Disable autoexec.be on restart (1)", "","","","", "","","","", "","","","", @@ -325,7 +325,7 @@ else: obj = json.load(fp) def StartDecode(): - print ("\n*** decode-status.py v12.5.0.2 by Theo Arends and Jacek Ziolkowski ***") + print ("\n*** decode-status.py v12.5.0.3 by Theo Arends and Jacek Ziolkowski ***") # print("Decoding\n{}".format(obj)) From 6fa22aae6b1b2a84fef6d592b1aebb0caa661091 Mon Sep 17 00:00:00 2001 From: s-hadinger <49731213+s-hadinger@users.noreply.github.com> Date: Thu, 25 May 2023 19:21:18 +0200 Subject: [PATCH 190/289] adjust neopixel busy time (#18723) * adjust neopixel busy time * Adjust time for Berry --- tasmota/tasmota_xdrv_driver/xdrv_52_3_berry_leds.ino | 12 ++++++++---- tasmota/tasmota_xlgt_light/xlgt_01_ws2812.ino | 2 +- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/tasmota/tasmota_xdrv_driver/xdrv_52_3_berry_leds.ino b/tasmota/tasmota_xdrv_driver/xdrv_52_3_berry_leds.ino index c3af02426..4b5b542da 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_52_3_berry_leds.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_52_3_berry_leds.ino @@ -134,11 +134,15 @@ extern "C" { if (s_sk6812_grbw) s_sk6812_grbw->Begin(); break; case 2: // # 02 : show void -> void - if (s_ws2812_grb) s_ws2812_grb->Show(); - if (s_sk6812_grbw) s_sk6812_grbw->Show(); + { + uint32_t pixels_size; // number of bytes to push + if (s_ws2812_grb) { s_ws2812_grb->Show(); pixels_size = s_ws2812_grb->PixelsSize(); } + if (s_sk6812_grbw) { s_sk6812_grbw->Show(); pixels_size = s_ws2812_grb->PixelsSize(); } + // Wait for RMT/I2S to complete fixes distortion due to analogRead -// delay(5); - SystemBusyDelay(5); // Max 256 leds + // 1ms is needed for 96 bytes + SystemBusyDelay((pixels_size + 95) / 96); + } break; case 3: // # 03 : CanShow void -> bool if (s_ws2812_grb) be_pushbool(vm, s_ws2812_grb->CanShow()); diff --git a/tasmota/tasmota_xlgt_light/xlgt_01_ws2812.ino b/tasmota/tasmota_xlgt_light/xlgt_01_ws2812.ino index 13032fdf8..3312a8322 100644 --- a/tasmota/tasmota_xlgt_light/xlgt_01_ws2812.ino +++ b/tasmota/tasmota_xlgt_light/xlgt_01_ws2812.ino @@ -218,7 +218,7 @@ void Ws2812LibStripShow(void) { #if defined(USE_WS2812_DMA) || defined(USE_WS2812_RMT) || defined(USE_WS2812_I2S) // Wait for DMA/RMT/I2S to complete fixes distortion due to analogRead // delay((Settings->light_pixels >> 6) +1); // 256 / 64 = 4 +1 = 5 - SystemBusyDelay((Settings->light_pixels >> 6) +1); // 256 / 64 = 4 +1 = 5 + SystemBusyDelay( (Settings->light_pixels + 31) >> 5); // (256 + 32) / 32 = 8 #endif } From ea08f2cbaec9b6b00d029151ce2bfb37ce6ede78 Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Thu, 25 May 2023 23:06:45 +0200 Subject: [PATCH 191/289] solidify only in branch development --- .github/workflows/Tasmota_build_master.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/Tasmota_build_master.yml b/.github/workflows/Tasmota_build_master.yml index 267fd6acc..0de6f8890 100644 --- a/.github/workflows/Tasmota_build_master.yml +++ b/.github/workflows/Tasmota_build_master.yml @@ -16,7 +16,7 @@ concurrency: jobs: be_solidify: runs-on: ubuntu-latest - if: github.repository == 'arendst/Tasmota' + if: github.repository == 'arendst/Tasmota' && github.ref_name == 'development' continue-on-error: true steps: - uses: actions/checkout@v3 @@ -49,7 +49,7 @@ jobs: push_solidified: needs: be_solidify runs-on: ubuntu-latest - if: github.repository == 'arendst/Tasmota' + if: github.repository == 'arendst/Tasmota' && github.ref_name == 'development' continue-on-error: true steps: - uses: actions/checkout@v3 From 053f2b3b0bf0be0028d046b4fc1c9e27a30cc2cc Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Thu, 25 May 2023 23:09:10 +0200 Subject: [PATCH 192/289] Solidify only in branch development --- .github/workflows/Tasmota_build_devel.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/Tasmota_build_devel.yml b/.github/workflows/Tasmota_build_devel.yml index c4bc8fb61..071c7e031 100644 --- a/.github/workflows/Tasmota_build_devel.yml +++ b/.github/workflows/Tasmota_build_devel.yml @@ -50,7 +50,7 @@ jobs: push_solidified: needs: be_solidify runs-on: ubuntu-latest - if: github.repository == 'arendst/Tasmota' + if: github.repository == 'arendst/Tasmota' && github.ref_name == 'development' continue-on-error: true steps: - uses: actions/checkout@v3 @@ -77,7 +77,7 @@ jobs: safeboot-images: needs: push_solidified runs-on: ubuntu-latest - if: github.repository == 'arendst/Tasmota' + if: github.repository == 'arendst/Tasmota' && github.ref_name == 'development' continue-on-error: true strategy: matrix: From 7f312ba589d764bc5d840100ff8d8553daebd774 Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Thu, 25 May 2023 23:11:03 +0200 Subject: [PATCH 193/289] Fix wrong if placing --- .github/workflows/Tasmota_build_devel.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/Tasmota_build_devel.yml b/.github/workflows/Tasmota_build_devel.yml index 071c7e031..24b4815b6 100644 --- a/.github/workflows/Tasmota_build_devel.yml +++ b/.github/workflows/Tasmota_build_devel.yml @@ -17,7 +17,7 @@ concurrency: jobs: be_solidify: runs-on: ubuntu-latest - if: github.repository == 'arendst/Tasmota' + if: github.repository == 'arendst/Tasmota' && github.ref_name == 'development' continue-on-error: true steps: - uses: actions/checkout@v3 @@ -77,7 +77,7 @@ jobs: safeboot-images: needs: push_solidified runs-on: ubuntu-latest - if: github.repository == 'arendst/Tasmota' && github.ref_name == 'development' + if: github.repository == 'arendst/Tasmota' continue-on-error: true strategy: matrix: From fcf34771654d48102af65661e733c21b3e9f9ff9 Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Fri, 26 May 2023 17:47:57 +0200 Subject: [PATCH 194/289] Initial support for WS2812 scheme 14 --- tasmota/include/tasmota_types.h | 4 +-- tasmota/tasmota_xdrv_driver/xdrv_04_light.ino | 7 ++-- .../xdrv_52_3_berry_leds.ino | 18 +++++++++- .../tasmota_xdrv_driver/xdrv_52_9_berry.ino | 2 +- tasmota/tasmota_xlgt_light/xlgt_01_ws2812.ino | 34 ++++++++++++------- 5 files changed, 45 insertions(+), 20 deletions(-) diff --git a/tasmota/include/tasmota_types.h b/tasmota/include/tasmota_types.h index 9f0005da7..758da9625 100644 --- a/tasmota/include/tasmota_types.h +++ b/tasmota/include/tasmota_types.h @@ -186,8 +186,8 @@ typedef union { // Restricted by MISRA-C Rule 18.4 bu uint32_t no_voltage_common : 1; // bit 4 (v12.3.1.5) - SetOption150 - (Energy) Force no voltage/frequency common uint32_t matter_enabled : 1; // bit 5 (v12.3.1.5) - SetOption151 - (Matter) Enable Matter protocol over Wifi uint32_t bistable_single_pin : 1; // bit 6 (v12.5.0.1) - SetOption152 - (Power) Switch between two (0) or one (1) pin bistable relay control - uint32_t berry_autoexec : 1; // bit 7 (v12.5.0.3) - SetOption153 - (Berry) Disable autoexec.be on restart (1) - uint32_t spare08 : 1; // bit 8 + uint32_t berry_no_autoexec : 1; // bit 7 (v12.5.0.3) - SetOption153 - (Berry) Disable autoexec.be on restart (1) + uint32_t berry_light_scheme : 1; // bit 8 (v12.5.0.3) - SetOption154 - (Berry) Handle berry led using RMT0 as additional WS2812 scheme uint32_t spare09 : 1; // bit 9 uint32_t spare10 : 1; // bit 10 uint32_t spare11 : 1; // bit 11 diff --git a/tasmota/tasmota_xdrv_driver/xdrv_04_light.ino b/tasmota/tasmota_xdrv_driver/xdrv_04_light.ino index 21717af62..7323d4f26 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_04_light.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_04_light.ino @@ -50,7 +50,8 @@ * 10 yes no no Kwanzaa * 11 yes no no Rainbow * 12 yes no no Fire - * + * 13 yes no no Stairs + * 14 yes no no Clear (= Berry) \*********************************************************************************************/ /*********************************************************************************************\ @@ -1866,7 +1867,7 @@ void LightAnimate(void) break; #endif default: - XlgtCall(FUNC_SET_SCHEME); + XlgtCall(FUNC_SET_SCHEME); } #ifdef USE_DEVICE_GROUPS @@ -2858,7 +2859,7 @@ void CmndHsbColor(void) void CmndScheme(void) { - // Scheme 0..12 - Select one of schemes 0 to 12 + // Scheme 0..14 - Select one of schemes 0 to 14 // Scheme 2 - Select scheme 2 // Scheme 2,0 - Select scheme 2 with color wheel set to 0 (HSB Red) // Scheme + - Select next scheme diff --git a/tasmota/tasmota_xdrv_driver/xdrv_52_3_berry_leds.ino b/tasmota/tasmota_xdrv_driver/xdrv_52_3_berry_leds.ino index 4b5b542da..2be1436cc 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_52_3_berry_leds.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_52_3_berry_leds.ino @@ -135,7 +135,23 @@ extern "C" { break; case 2: // # 02 : show void -> void { - uint32_t pixels_size; // number of bytes to push + if (Settings->flag6.berry_light_scheme && + (1 == TasmotaGlobal.light_driver)) { // XLGT_01 +#ifdef USE_NETWORK_LIGHT_SCHEMES + bool scheme_berry = ((Light.max_scheme -1) == Settings->light_scheme); +#else + bool scheme_berry = (Light.max_scheme == Settings->light_scheme); +#endif + if (scheme_berry) { + if (!Light.power) { + break; + } + } else { + // Skip berry Show() but use WS2812 driver Show() instead + break; + } + } + uint32_t pixels_size; // number of bytes to push if (s_ws2812_grb) { s_ws2812_grb->Show(); pixels_size = s_ws2812_grb->PixelsSize(); } if (s_sk6812_grbw) { s_sk6812_grbw->Show(); pixels_size = s_ws2812_grb->PixelsSize(); } diff --git a/tasmota/tasmota_xdrv_driver/xdrv_52_9_berry.ino b/tasmota/tasmota_xdrv_driver/xdrv_52_9_berry.ino index 917f656b0..c46606e47 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_52_9_berry.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_52_9_berry.ino @@ -379,7 +379,7 @@ void BrLoad(const char * script_name) { if (berry.vm == nullptr || TasmotaGlobal.no_autoexec) { return; } // abort is berry is not running, or bootloop prevention kicked in if (!strcmp_P(script_name, "autoexec.be")) { - if (Settings->flag6.berry_autoexec) { // SetOption153 - (Berry) Disable autoexec.be on restart (1) + if (Settings->flag6.berry_no_autoexec) { // SetOption153 - (Berry) Disable autoexec.be on restart (1) return; } } diff --git a/tasmota/tasmota_xlgt_light/xlgt_01_ws2812.ino b/tasmota/tasmota_xlgt_light/xlgt_01_ws2812.ino index 3312a8322..d30a4fba5 100644 --- a/tasmota/tasmota_xlgt_light/xlgt_01_ws2812.ino +++ b/tasmota/tasmota_xlgt_light/xlgt_01_ws2812.ino @@ -33,15 +33,13 @@ * 6 (11) yes no no Rainbow * 7 (12) yes no no Fire * 8 (13) yes no no Stairs + * 9 (14) yes no no Clear (= Berry) + * 10 (15) yes no no Optional DDP \*********************************************************************************************/ #define XLGT_01 1 -#ifdef USE_NETWORK_LIGHT_SCHEMES const uint8_t WS2812_SCHEMES = 10; // Number of WS2812 schemes -#else -const uint8_t WS2812_SCHEMES = 9; // Number of WS2812 schemes -#endif const char kWs2812Commands[] PROGMEM = "|" // No prefix D_CMND_LED "|" D_CMND_PIXELS "|" D_CMND_ROTATION "|" D_CMND_WIDTH "|" D_CMND_STEPPIXELS ; @@ -172,11 +170,7 @@ WsColor kRainbow[7] = { 255,0,0, 255,128,0, 255,255,0, 0,255,0, 0,0,255, 128,0,2 WsColor kFire[3] = { 255,0,0, 255,102,0, 255,192,0 }; WsColor kStairs[2] = { 0,0,0, 255,255,255 }; -#ifdef USE_NETWORK_LIGHT_SCHEMES -ColorScheme kSchemes[WS2812_SCHEMES -2] = { // Skip clock scheme and DDP scheme -#else -ColorScheme kSchemes[WS2812_SCHEMES -1] = { // Skip clock scheme -#endif +ColorScheme kSchemes[WS2812_SCHEMES -2] = { // Skip clock and clear scheme kIncandescent, 2, kRgb, 3, kChristmas, 2, @@ -203,6 +197,7 @@ struct WS2812 { uint8_t show_next = 1; uint8_t scheme_offset = 0; bool suspend_update = false; + bool scheme9; } Ws2812; /********************************************************************************************/ @@ -554,7 +549,7 @@ void Ws2812DDP(void) Ws2812StripShow(); } } -#endif +#endif // USE_NETWORK_LIGHT_SCHEMES void Ws2812Clear(void) { @@ -645,8 +640,11 @@ void Ws2812ShowScheme(void) { uint32_t scheme = Settings->light_scheme - Ws2812.scheme_offset; + if (scheme != 9) { + Ws2812.scheme9 = 0; + } #ifdef USE_NETWORK_LIGHT_SCHEMES - if ((scheme != 9) && (ddp_udp_up)) { + if ((scheme != 10) && (ddp_udp_up)) { ddp_udp.stop(); ddp_udp_up = 0; AddLog(LOG_LEVEL_DEBUG_MORE, "DDP: UDP Stopped: WS2812 Scheme not DDP"); @@ -659,11 +657,17 @@ void Ws2812ShowScheme(void) Ws2812.show_next = 0; } break; + case 9: // Clear + if (!Ws2812.scheme9) { + Ws2812Clear(); + Ws2812.scheme9 = 1; + } + break; #ifdef USE_NETWORK_LIGHT_SCHEMES - case 9: + case 10: Ws2812DDP(); break; -#endif +#endif // USE_NETWORK_LIGHT_SCHEMES default: if(Settings->light_step_pixels > 0){ Ws2812Steps(scheme -1); @@ -713,6 +717,10 @@ void Ws2812ModuleSelected(void) Ws2812.scheme_offset = Light.max_scheme +1; Light.max_scheme += WS2812_SCHEMES; +#ifdef USE_NETWORK_LIGHT_SCHEMES + Light.max_scheme++; +#endif + #if (USE_WS2812_CTYPE > NEO_3LED) TasmotaGlobal.light_type = LT_RGBW; #else From e87714dbcdb5e03a70384a329ed3ea8095bcfb89 Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Fri, 26 May 2023 17:51:20 +0200 Subject: [PATCH 195/289] Add TODO --- tasmota/tasmota_xdrv_driver/xdrv_52_3_berry_leds.ino | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tasmota/tasmota_xdrv_driver/xdrv_52_3_berry_leds.ino b/tasmota/tasmota_xdrv_driver/xdrv_52_3_berry_leds.ino index 2be1436cc..2c6fec252 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_52_3_berry_leds.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_52_3_berry_leds.ino @@ -137,6 +137,7 @@ extern "C" { { if (Settings->flag6.berry_light_scheme && (1 == TasmotaGlobal.light_driver)) { // XLGT_01 + // TODO: Need to add test for RMT0 #ifdef USE_NETWORK_LIGHT_SCHEMES bool scheme_berry = ((Light.max_scheme -1) == Settings->light_scheme); #else @@ -144,6 +145,7 @@ extern "C" { #endif if (scheme_berry) { if (!Light.power) { + // Skip berry Show() as WS2812 driver Show() has powered off leds break; } } else { From 175bde932fa2cfeb01699c1edd84f566a450dfc0 Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Fri, 26 May 2023 21:09:35 +0200 Subject: [PATCH 196/289] checkout not needed for trigger --- .github/workflows/Tasmota_build_master.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/Tasmota_build_master.yml b/.github/workflows/Tasmota_build_master.yml index 0de6f8890..7f46ee44b 100644 --- a/.github/workflows/Tasmota_build_master.yml +++ b/.github/workflows/Tasmota_build_master.yml @@ -270,7 +270,6 @@ jobs: needs: Release runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 - name: Dispatch workflow in arendst/Tasmota-firmware run: | curl -X POST https://api.github.com/repos/arendst/Tasmota-firmware/actions/workflows/fetch_deploy.yml/dispatches \ From 7f8f75d19694cce58d727095d63ecb8fd23826b4 Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Fri, 26 May 2023 21:10:45 +0200 Subject: [PATCH 197/289] checkout not needed for trigger --- .github/workflows/Tasmota_build_devel.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/Tasmota_build_devel.yml b/.github/workflows/Tasmota_build_devel.yml index 24b4815b6..1d7d24852 100644 --- a/.github/workflows/Tasmota_build_devel.yml +++ b/.github/workflows/Tasmota_build_devel.yml @@ -240,7 +240,6 @@ jobs: needs: [base-images, base32-images, language-images] runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 - name: Dispatch workflow in arendst/Tasmota-firmware run: | curl -X POST https://api.github.com/repos/arendst/Tasmota-firmware/actions/workflows/fetch_deploy.yml/dispatches \ From d91e1e8bcc0a8d67636fdbb39e17656041ef7ed6 Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Sat, 27 May 2023 12:33:50 +0200 Subject: [PATCH 198/289] Fix berry scheme select --- tasmota/tasmota_xdrv_driver/xdrv_04_light.ino | 11 +++++++---- tasmota/tasmota_xlgt_light/xlgt_01_ws2812.ino | 7 +------ 2 files changed, 8 insertions(+), 10 deletions(-) diff --git a/tasmota/tasmota_xdrv_driver/xdrv_04_light.ino b/tasmota/tasmota_xdrv_driver/xdrv_04_light.ino index 7323d4f26..f79e7da82 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_04_light.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_04_light.ino @@ -236,6 +236,7 @@ struct LIGHT { uint8_t fixed_color_index = 1; uint8_t pwm_offset = 0; // Offset in color buffer, used by sm16716 to drive itself RGB, and PWM for CCT (value is 0 or 3) uint8_t max_scheme = LS_MAX -1; + uint8_t last_scheme; uint32_t wakeup_start_time = 0; @@ -246,7 +247,7 @@ struct LIGHT { bool fade_initialized = false; // dont't fade at startup bool fade_running = false; #ifdef USE_DEVICE_GROUPS - uint8_t last_scheme = 0; + uint8_t last_dgr_scheme = 0; bool devgrp_no_channels_out = false; // don't share channels with device group (e.g. if scheme set by other device) #ifdef USE_DGR_LIGHT_SEQUENCE uint8_t sequence_offset = 0; // number of channel changes this light is behind the master @@ -1871,12 +1872,14 @@ void LightAnimate(void) } #ifdef USE_DEVICE_GROUPS - if (Settings->light_scheme != Light.last_scheme) { - Light.last_scheme = Settings->light_scheme; + if (Settings->light_scheme != Light.last_dgr_scheme) { + Light.last_dgr_scheme = Settings->light_scheme; SendDeviceGroupMessage(Light.device, DGR_MSGTYP_UPDATE, DGR_ITEM_LIGHT_SCHEME, Settings->light_scheme); Light.devgrp_no_channels_out = false; } #endif // USE_DEVICE_GROUPS + + Light.last_scheme = Settings->light_scheme; } if ((Settings->light_scheme < LS_MAX) || power_off) { // exclude WS281X Neopixel schemes @@ -2486,7 +2489,7 @@ void LightHandleDevGroupItem(void) break; case DGR_ITEM_LIGHT_SCHEME: if (Settings->light_scheme != value) { - Light.last_scheme = Settings->light_scheme = value; + Light.last_dgr_scheme = Settings->light_scheme = value; Light.devgrp_no_channels_out = (value != 0); send_state = true; } diff --git a/tasmota/tasmota_xlgt_light/xlgt_01_ws2812.ino b/tasmota/tasmota_xlgt_light/xlgt_01_ws2812.ino index d30a4fba5..9ddeb4928 100644 --- a/tasmota/tasmota_xlgt_light/xlgt_01_ws2812.ino +++ b/tasmota/tasmota_xlgt_light/xlgt_01_ws2812.ino @@ -197,7 +197,6 @@ struct WS2812 { uint8_t show_next = 1; uint8_t scheme_offset = 0; bool suspend_update = false; - bool scheme9; } Ws2812; /********************************************************************************************/ @@ -640,9 +639,6 @@ void Ws2812ShowScheme(void) { uint32_t scheme = Settings->light_scheme - Ws2812.scheme_offset; - if (scheme != 9) { - Ws2812.scheme9 = 0; - } #ifdef USE_NETWORK_LIGHT_SCHEMES if ((scheme != 10) && (ddp_udp_up)) { ddp_udp.stop(); @@ -658,9 +654,8 @@ void Ws2812ShowScheme(void) } break; case 9: // Clear - if (!Ws2812.scheme9) { + if (Settings->light_scheme != Light.last_scheme) { Ws2812Clear(); - Ws2812.scheme9 = 1; } break; #ifdef USE_NETWORK_LIGHT_SCHEMES From 7b55e1aca23aff2089a4af6afd7522114d92b9a8 Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Sat, 27 May 2023 17:00:14 +0200 Subject: [PATCH 199/289] Make `USE_DISPLAY_MODES1TO5` in firmware `LVGL` possible (#18729) * Make `USE_DISPLAY_MODES1TO5` in firmware `LVGL` possible --- tasmota/include/tasmota_configurations_ESP32.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tasmota/include/tasmota_configurations_ESP32.h b/tasmota/include/tasmota_configurations_ESP32.h index 04a563c5c..7120d7d18 100644 --- a/tasmota/include/tasmota_configurations_ESP32.h +++ b/tasmota/include/tasmota_configurations_ESP32.h @@ -314,7 +314,7 @@ #define USE_UNIVERSAL_DISPLAY #define USE_DISPLAY_LVGL_ONLY -#undef USE_DISPLAY_MODES1TO5 +//#undef USE_DISPLAY_MODES1TO5 #undef USE_DISPLAY_LCD #undef USE_DISPLAY_SSD1306 #undef USE_DISPLAY_MATRIX From fe570a1b268f402a6f31f66b3bd21f1197cce628 Mon Sep 17 00:00:00 2001 From: s-hadinger <49731213+s-hadinger@users.noreply.github.com> Date: Mon, 29 May 2023 10:40:24 +0200 Subject: [PATCH 200/289] Matter Border Router for ESP8266 (experimental) (#18734) --- CHANGELOG.md | 2 + .../berry_matter/src/be_matter_module.c | 54 + .../src/embedded/Matter_Commissioning.be | 2 +- .../src/embedded/Matter_Device.be | 24 + .../src/embedded/Matter_HTTP_async.be | 3 +- .../src/embedded/Matter_HTTP_remote.be | 195 +- .../src/embedded/Matter_Plugin.be | 34 +- .../src/embedded/Matter_Plugin_Bridge_HTTP.be | 157 +- .../embedded/Matter_Plugin_Bridge_Light0.be | 155 + .../embedded/Matter_Plugin_Bridge_Light1.be | 188 + .../embedded/Matter_Plugin_Bridge_Light2.be | 190 + .../embedded/Matter_Plugin_Bridge_Light3.be | 221 + .../embedded/Matter_Plugin_Bridge_OnOff.be | 128 +- .../embedded/Matter_Plugin_Bridge_Sensor.be | 98 + .../Matter_Plugin_Bridge_Sensor_Humidity.be | 99 + ...Matter_Plugin_Bridge_Sensor_Illuminance.be | 99 + .../Matter_Plugin_Bridge_Sensor_Pressure.be | 99 + .../Matter_Plugin_Bridge_Sensor_Temp.be | 99 + .../src/embedded/Matter_Plugin_Light0.be | 6 +- .../src/embedded/Matter_Plugin_Light1.be | 14 +- .../src/embedded/Matter_Plugin_Light2.be | 10 +- .../src/embedded/Matter_Plugin_Light3.be | 14 +- .../src/embedded/Matter_Plugin_OnOff.be | 10 +- .../Matter_Plugin_Sensor_Illuminance.be | 2 +- .../embedded/Matter_Plugin_Sensor_Pressure.be | 4 +- .../src/embedded/Matter_TCP_async.be | 1 + .../berry_matter/src/embedded/Matter_UI.be | 89 +- .../src/embedded/Matter_inspect.be | 13 + .../solidified_Matter_Commissioning.h | 41 +- .../src/solidify/solidified_Matter_Device.h | 7408 +++++++++-------- .../solidify/solidified_Matter_HTTP_async.h | 2 +- .../solidify/solidified_Matter_HTTP_remote.h | 924 +- .../src/solidify/solidified_Matter_Plugin.h | 1154 ++- .../solidified_Matter_Plugin_Bridge_HTTP.h | 873 +- .../solidified_Matter_Plugin_Bridge_Light0.h | 492 ++ .../solidified_Matter_Plugin_Bridge_Light1.h | 542 ++ .../solidified_Matter_Plugin_Bridge_Light2.h | 579 ++ .../solidified_Matter_Plugin_Bridge_Light3.h | 752 ++ .../solidified_Matter_Plugin_Bridge_OnOff.h | 441 +- .../solidified_Matter_Plugin_Bridge_Sensor.h | 241 + ...ied_Matter_Plugin_Bridge_Sensor_Humidity.h | 280 + ..._Matter_Plugin_Bridge_Sensor_Illuminance.h | 271 + ...ied_Matter_Plugin_Bridge_Sensor_Pressure.h | 271 + ...idified_Matter_Plugin_Bridge_Sensor_Temp.h | 277 + .../solidified_Matter_Plugin_Light0.h | 41 +- .../solidified_Matter_Plugin_Light1.h | 65 +- .../solidified_Matter_Plugin_Light2.h | 39 +- .../solidified_Matter_Plugin_Light3.h | 111 +- .../solidify/solidified_Matter_Plugin_OnOff.h | 115 +- .../solidify/solidified_Matter_TCP_async.h | 1034 +-- .../src/solidify/solidified_Matter_UI.h | 1982 +++-- .../src/solidify/solidified_Matter_inspect.h | 45 + .../xdrv_52_3_berry_matter.ino | 79 + 53 files changed, 12730 insertions(+), 7339 deletions(-) create mode 100644 lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Light0.be create mode 100644 lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Light1.be create mode 100644 lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Light2.be create mode 100644 lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Light3.be create mode 100644 lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Sensor.be create mode 100644 lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Sensor_Humidity.be create mode 100644 lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Sensor_Illuminance.be create mode 100644 lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Sensor_Pressure.be create mode 100644 lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Sensor_Temp.be create mode 100644 lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Light0.h create mode 100644 lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Light1.h create mode 100644 lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Light2.h create mode 100644 lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Light3.h create mode 100644 lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Sensor.h create mode 100644 lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Sensor_Humidity.h create mode 100644 lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Sensor_Illuminance.h create mode 100644 lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Sensor_Pressure.h create mode 100644 lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Sensor_Temp.h create mode 100644 tasmota/tasmota_xdrv_driver/xdrv_52_3_berry_matter.ino diff --git a/CHANGELOG.md b/CHANGELOG.md index 7b6890e91..b61bbf7f5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,8 +8,10 @@ All notable changes to this project will be documented in this file. - Command ``WifiPower 0`` to enable dynamic wifi power based on RSSI by @TD-er (#15443) - Command ``WifiPower 1`` to restore default wifi power - HASPmota `meta` attribute and improved `berry_run` +- Matter Border Router for ESP8266 (experimental) ### Breaking Changed +- Matter relay number starts at 1 instead of 0 to match Tasmota numbering ### Changed - InfluxDb resolves DNS name before request (#18015) diff --git a/lib/libesp32/berry_matter/src/be_matter_module.c b/lib/libesp32/berry_matter/src/be_matter_module.c index bed344cda..59f51901c 100644 --- a/lib/libesp32/berry_matter/src/be_matter_module.c +++ b/lib/libesp32/berry_matter/src/be_matter_module.c @@ -24,6 +24,7 @@ #include "be_constobj.h" #include "be_mapping.h" +#include // Matter logo static const uint8_t MATTER_LOGO[] = @@ -36,6 +37,38 @@ static const uint8_t MATTER_LOGO[] = "118.06a96.93,96.93,0,0,0-68.16,118.06l23.27-13.44a71.1,71.1,0,0,1,3.29-35.17L309.46,300l12.78-" "7.38V277.89l-54.39-31.4a71.13,71.13,0,0,1,28.82-20.43Z'/>"; +// Matter stylesheet +static const uint8_t MATTER_STYLESHEET[] = + ""; + +extern uint32_t matter_convert_seconds_to_dhm(uint32_t seconds, char *unit, uint32_t *color, bbool days); + +char* matter_seconds_to_dhm(int32_t seconds) { + static const char empty_resp[] = "

      Y=sp1}Ѩ1&`2&PU2&`2&`2&`"w+`'*\}"H62vcw&-6M ;(3wixHR&xYU= n :h1J(0Qc-LDc-LDL)LDu8 +w;Me٨aChpZ:|6'KhvU0_PH(5 (5 ^5 ("8[EAgXM$C`0Scj[j)4!c +@fuj@j?FU6Du fỴnqͳPFP%d%3r;[ k\#o422Y>.}0Y]xe`rocMuy䥥#,0t6-Hzs(KA>gR 5 +:ƕNDq0k]<lO]ek8nY-)6KʺҲjhR wz>&8 Nc0ݻ}(${GFɶҞ5-juCNκ}ct}T;0mt vƌ;܉mƨIw +@%w"wzyBL+Fqdѡw'6xDYG}L*wѷl7Lܶ{rdJ ܍mI 6)^ςhmG4:Wr,shP&Pa@By|4qeC@uҝnze%bۺHΉ3$ +r 䠫[fSW~&"&`BKue4 +f̲+[CUm}I~ߎf﷙KXA g)_K ecÈIhYI5Yڢ,sSȫF kϢDIt~&0U/q'lF[IuY3LV /Fb& +&14$apۉo2/~)H +Ҳp -lNHʆ‹ܝܹe4U30Y8 Od7fpS\fh@,FpnҜɮ`Dk&7cD.^WIC| غ1jI5:M}Z h,{ Պ3lVWifH}/^'2'$x@$f- '֣6 +endstream +endobj +913 0 obj +<< +/Length 31358 +>> +stream +Q +1 0 0 1 0 0 cm +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 377.35162 781.10431 Tm +(+DQJ]KRX) Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 415.64661 781.10431 Tm +(=KLDQ) Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 437.2991 781.10431 Tm +(7HFKQRORJ\\) Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 479.96661 781.10431 Tm +(&R) Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 495.21411 781.10431 Tm +(/WG) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 87.84 758.0603 Tm +(5HVSRQVH) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 111.87 758.0603 Tm +(SDFNHW) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 128.745 758.0603 Tm +(IRUPDW) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 96.2999 741.98059 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 104.6199 741.98059 Tm +(E\\WHV) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 160.86011 741.98059 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 169.18011 741.98059 Tm +(E\\WHV) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 228.06 741.98059 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 236.38 741.98059 Tm +(E\\WH) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 289.9805 741.98059 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 298.30051 741.98059 Tm +(E\\WHV) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 357.12061 741.98059 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 365.44061 741.98059 Tm +(E\\WH) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 419.0412 741.98059 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 427.36121 741.98059 Tm +(E\\WHV) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 104.22 725.90033 Tm +(%DRWRX) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 158.2803 725.90033 Tm +(0RGXOH) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 179.3288 725.90033 Tm +(DGGUHVV) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 228.0602 725.90033 Tm +(3DFNDJH) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 251.0502 725.90033 Tm +(,') Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 292.62051 725.90033 Tm +(SDFNDJH) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 309.38052 725.90033 Tm +(OHQJWK) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 357.12091 725.90033 Tm +(FRQILUPDWLRQ) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 382.38492 725.90033 Tm +(FRGH) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 421.68121 725.90033 Tm +(FKHFNVXP) Tj +ET +BT +/F5 9.5 Tf +0 0 0 rg +1 0 0 1 98.94 709.82031 Tm +([HI) Tj +ET +BT +/F5 10.5 Tf +0 0 0 rg +1 0 0 1 168.72079 709.82031 Tm +(;;;;) Tj +ET +BT +/F5 10.5 Tf +0 0 0 rg +1 0 0 1 233.2822 709.82031 Tm +([) Tj +ET +BT +/F5 9 Tf +0 0 0 rg +1 0 0 1 292.6228 709.82031 Tm +([) Tj +ET +BT +/F5 10.5 Tf +0 0 0 rg +1 0 0 1 370.26401 709.82031 Tm +(;) Tj +ET +BT +/F5 10.5 Tf +0 0 0 rg +1 0 0 1 429.54489 709.82031 Tm +(6XP) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 132.78 693.6803 Tm +(1RWH) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 151.097 693.6803 Tm +(&RQILUPDWLRQ) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 193.13901 693.6803 Tm +(FRGH [) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 227.8555 693.6803 Tm +(PHDQV) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 250.06599 693.6803 Tm +(2.) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 159.0605 678.08038 Tm +(&RQILUPDWLRQ) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 184.9325 678.08038 Tm +(FRGH [) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 206.29649 678.08038 Tm +(PHDQV) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 219.96449 678.08038 Tm +(WKHUH) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 231.08449 678.08038 Tm +(LV) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 235.07249 678.08038 Tm +(DQ) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 240.82849 678.08038 Tm +(HUURU) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 251.50049 678.08038 Tm +(LQ) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 256.04449 678.08038 Tm +(UHFHLYLQJ) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 274.1965 678.08038 Tm +(WKH) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 281.40851 678.08038 Tm +(SDFNDJH) Tj +ET +BT +/F6 7 Tf +0 0 0 rg +1 0 0 1 87.84 662.48059 Tm +() Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 96.408 662.48059 Tm +(,QVWUXFWLRQ) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 134.278 662.48059 Tm +(SDFNHW) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 157.903 662.48059 Tm +(FKHFNVXP) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 192.679 662.48059 Tm +( ) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 194.77901 662.48059 Tm +() Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 200.60301 662.48059 Tm +(E\\WHV ) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 224.41 662.48059 Tm +(3DFNDJH) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 253.67 662.48059 Tm +(,') Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 262.97299 662.48059 Tm +( ) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 265.073 662.48059 Tm +() Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 270.897 662.48059 Tm +(E\\WH ) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 287.34702 662.48059 Tm +() Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 291.35101 662.48059 Tm +(3DFNHW) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 314.90601 662.48059 Tm +(OHQJWK) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 337.96399 662.48059 Tm +( ) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 340.064 662.48059 Tm +() Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 345.888 662.48059 Tm +(E\\WHV ) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 365.69101 662.48059 Tm +() Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 369.69501 662.48059 Tm +(VFULSW) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 389.75702 662.48059 Tm +( ) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 391.85703 662.48059 Tm +() Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 397.68103 662.48059 Tm +(E\\WH ) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 414.13104 662.48059 Tm +() Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 418.13504 662.48059 Tm +(SDVVZRUG) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 451.82605 662.48059 Tm +( ) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 453.92606 662.48059 Tm +() Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 459.75006 662.48059 Tm +(E\\WHV ) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 479.55307 662.48059 Tm +() Tj +ET +BT +/F6 6.5 Tf +0 0 0 rg +1 0 0 1 87.841 646.8808 Tm +() Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 95.797 646.8808 Tm +($QVZHU) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 120.23051 646.8808 Tm +(SDFNHW) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 142.168 646.8808 Tm +(FKHFNVXP) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 174.45999 646.8808 Tm +( ) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 176.40999 646.8808 Tm +() Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 181.81799 646.8808 Tm +(E\\WHV ) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 203.9245 646.8808 Tm +(3DFNDJH) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 231.0945 646.8808 Tm +(,') Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 239.733 646.8808 Tm +( ) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 241.683 646.8808 Tm +() Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 247.091 646.8808 Tm +(E\\WH ) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 262.366 646.8808 Tm +() Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 266.08398 646.8808 Tm +(3DFNHW) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 287.95648 646.8808 Tm +(OHQJWK) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 309.36749 646.8808 Tm +( ) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 311.3175 646.8808 Tm +() Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 316.72549 646.8808 Tm +(E\\WHV ) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 335.11398 646.8808 Tm +() Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 338.83197 646.8808 Tm +(FRQILUPDWLRQ) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 379.88599 646.8808 Tm +(FRGH) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 396.29199 646.8808 Tm +( ) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 398.242 646.8808 Tm +() Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 403.64999 646.8808 Tm +(E\\WH ) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 418.92499 646.8808 Tm +() Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 87.8421 631.28088 Tm +() Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 94.5741 631.28088 Tm +(7KH) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 105.5631 631.28088 Tm +(FKHFNVXP) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 132.8871 631.28088 Tm +(LV) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 138.37061 631.28088 Tm +(DGGHG) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 156.1356 631.28088 Tm +(LQ) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 162.38361 631.28088 Tm +(E\\WHV) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 179.19711 631.28088 Tm +(WKH) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 189.11362 631.28088 Tm +(FDUU\\) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 203.61711 631.28088 Tm +(RYHU) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 216.54211 631.28088 Tm +() Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 221.11812 631.28088 Tm +(E\\WHV) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 236.45761 631.28088 Tm +(LV) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 241.94112 631.28088 Tm +(LJQRUHG) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 265.12912 631.28088 Tm +(DQG) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 276.42612 631.28088 Tm +(WKH) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 286.34262 631.28088 Tm +(KLJK) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 299.37213 631.28088 Tm +(E\\WH) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 312.07712 631.28088 Tm +(FRPHV) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 330.35361 631.28088 Tm +(ILUVW) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 341.98611 631.28088 Tm +(ZKHQ) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 357.6391 631.28088 Tm +(WUDQVPLWWLQJ) Tj +ET +BT +/F6 7.5 Tf +0 0 0 rg +1 0 0 1 87.8421 615.68103 Tm +() Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 97.0221 615.68103 Tm +(7KH) Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 112.0071 615.68103 Tm +(GHIDXOW) Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 138.86461 615.68103 Tm +(PRGXOH) Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 167.77711 615.68103 Tm +(DGGUHVV) Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 197.67212 615.68103 Tm +(LV) Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 205.14961 615.68103 Tm +() Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 208.20961 615.68103 Tm +([IIIIIIII) Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 240.16711 615.68103 Tm +() Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 244.12712 615.68103 Tm +(GHIDXOW) Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 270.98462 615.68103 Tm +(SDVVZRUG) Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 307.08212 615.68103 Tm +(LV) Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 314.55963 615.68103 Tm +() Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 317.61963 615.68103 Tm +<0013005B00130013001300130013001300130013020A> Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 362.88962 615.68103 Tm +() Tj +ET +BT +/F7 8 Tf +0 0 0 rg +1 0 0 1 87.84 585.5603 Tm +() Tj +ET +BT +/F7 8 Tf +0 0 0 rg +1 0 0 1 92.416 585.5603 Tm +( ) Tj +ET +BT +/F7 8 Tf +0 0 0 rg +1 0 0 1 97.208 585.5603 Tm +(VHW) Tj +ET +BT +/F7 8 Tf +0 0 0 rg +1 0 0 1 111.464 585.5603 Tm +(WKH) Tj +ET +BT +/F7 8 Tf +0 0 0 rg +1 0 0 1 127 585.5603 Tm +(PRGXOH) Tj +ET +BT +/F7 8 Tf +0 0 0 rg +1 0 0 1 159.37601 585.5603 Tm +(DGGUHVV) Tj +ET +BT +/F7 8 Tf +0 0 0 rg +1 0 0 1 192.72801 585.5603 Tm +(6HW$GGHU) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 129.84 555.98029 Tm +(\)XQFWLRQ) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 158.03049 555.98029 Tm +(GHVFULSWLRQ) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 195.69148 555.98029 Tm +(6HW) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 206.96248 555.98029 Tm +(WKH) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 218.68198 555.98029 Tm +(PRGXOH) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 243.73947 555.98029 Tm +(DGGUHVV) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 269.64847 555.98029 Tm +( VHH) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 283.73398 555.98029 Tm +() Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 294.60199 555.98029 Tm +(0RGXOH) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 319.47748 555.98029 Tm +(DGGUHVV ) Tj +ET +BT +/F5 10.5 Tf +0 0 0 rg +1 0 0 1 347.694 555.98029 Tm +() Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 129.84 540.38037 Tm +(,QSXW) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 145.30049 540.38037 Tm +(SDUDPHWHU) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 175.633 540.38037 Tm +(PRGXOH) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 196.83549 540.38037 Tm +(QHZ) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 209.08949 540.38037 Tm +(DGGUHVV) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 129.84 524.78058 Tm +(5HWXUQ) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 145.392 524.78058 Tm +(SDUDPHWHU) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 170.2095 524.78058 Tm +(FRQILUPDWLRQ) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 198.6315 524.78058 Tm +(ZRUG) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 129.84 509.18079 Tm +(&RPPDQG) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 165.967 509.18079 Tm +(FRGH) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 185.511 509.18079 Tm +([) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 87.84 493.5809 Tm +(,QVWUXFWLRQ) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 114.89 493.5809 Tm +(SDFNHW) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 131.765 493.5809 Tm +(IRUPDW) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 96.2999 477.50119 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 104.6199 477.50119 Tm +(E\\WHV) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 160.86011 477.50119 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 169.18011 477.50119 Tm +(E\\WHV) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 228.06 477.50119 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 236.38 477.50119 Tm +(E\\WH) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 289.9805 477.50119 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 298.30051 477.50119 Tm +(E\\WHV) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 357.12061 477.50119 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 365.44061 477.50119 Tm +(E\\WH) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 419.0412 477.50119 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 427.36121 477.50119 Tm +(E\\WHV) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 483.66229 477.50119 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 491.9823 477.50119 Tm +(E\\WHV) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 104.22 461.42029 Tm +(%DRWRX) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 152.9998 461.42029 Tm +(0RGXOH) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 170.2213 461.42029 Tm +(RULJLQDO) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 187.52829 461.42029 Tm +(DGGUHVV) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 228.0602 461.42029 Tm +(3DFNDJH) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 251.0502 461.42029 Tm +(,') Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 292.62051 461.42029 Tm +(SDFNDJH) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 309.38052 461.42029 Tm +(OHQJWK) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 357.12091 461.42029 Tm +(VFULSW) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 411.18121 461.42029 Tm +(0RGXOH) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 430.31622 461.42029 Tm +(QHZ) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 441.45624 461.42029 Tm +(DGGUHVV) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 486.3013 461.42029 Tm +(FKHFNVXP) Tj +ET +BT +/F5 9.5 Tf +0 0 0 rg +1 0 0 1 98.94 445.2803 Tm +([HI) Tj +ET +BT +/F5 10.5 Tf +0 0 0 rg +1 0 0 1 168.72079 445.2803 Tm +(;;;;) Tj +ET +BT +/F5 10.5 Tf +0 0 0 rg +1 0 0 1 233.2822 445.2803 Tm +([) Tj +ET +BT +/F5 9 Tf +0 0 0 rg +1 0 0 1 292.6228 445.2803 Tm +([) Tj +ET +BT +/F5 10.5 Tf +0 0 0 rg +1 0 0 1 362.34381 445.2803 Tm +([) Tj +ET +BT +/F5 10.5 Tf +0 0 0 rg +1 0 0 1 426.965 445.2803 Tm +(;;;;) Tj +ET +BT +/F5 10.5 Tf +0 0 0 rg +1 0 0 1 494.16489 445.2803 Tm +(6XP) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 87.84 429.20029 Tm +(5HVSRQVH) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 111.87 429.20029 Tm +(SDFNHW) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 128.745 429.20029 Tm +(IRUPDW) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 96.2999 413.12061 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 104.6199 413.12061 Tm +(E\\WHV) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 160.86011 413.12061 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 169.18011 413.12061 Tm +(E\\WHV) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 228.06 413.12061 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 236.38 413.12061 Tm +(E\\WH) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 289.9805 413.12061 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 298.30051 413.12061 Tm +(E\\WHV) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 357.12061 413.12061 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 365.44061 413.12061 Tm +(E\\WH) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 419.0412 413.12061 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 427.36121 413.12061 Tm +(E\\WHV) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 104.22 396.98029 Tm +(%DRWRX) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 152.9998 396.98029 Tm +(0RGXOH) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 172.1348 396.98029 Tm +(QHZ) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 183.2748 396.98029 Tm +(DGGUHVV) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 228.0602 396.98029 Tm +(3DFNDJH) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 251.0502 396.98029 Tm +(,') Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 292.62051 396.98029 Tm +(SDFNDJH) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 309.38052 396.98029 Tm +(OHQJWK) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 357.12091 396.98029 Tm +(FRQILUPDWLRQ) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 382.38492 396.98029 Tm +(FRGH) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 421.68121 396.98029 Tm +(FKHFNVXP) Tj +ET +BT +/F5 9.5 Tf +0 0 0 rg +1 0 0 1 98.94 380.9003 Tm +([HI) Tj +ET +BT +/F5 10.5 Tf +0 0 0 rg +1 0 0 1 168.72079 380.9003 Tm +(;;;;) Tj +ET +BT +/F5 10.5 Tf +0 0 0 rg +1 0 0 1 233.2822 380.9003 Tm +([) Tj +ET +BT +/F5 9 Tf +0 0 0 rg +1 0 0 1 292.6228 380.9003 Tm +([) Tj +ET +BT +/F5 10.5 Tf +0 0 0 rg +1 0 0 1 370.26401 380.9003 Tm +(;) Tj +ET +BT +/F5 10.5 Tf +0 0 0 rg +1 0 0 1 429.54489 380.9003 Tm +(6XP) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 132.78 364.76031 Tm +(1RWH) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 145.461 364.76031 Tm +(&RQILUPDWLRQ) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 174.567 364.76031 Tm +(FRGH [) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 198.6015 364.76031 Tm +(PHDQV) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 213.978 364.76031 Tm +(WKH) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 222.09149 364.76031 Tm +(DGGUHVV) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 240.02849 364.76031 Tm +(JHQHUDWLRQ) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 264.495 364.76031 Tm +(LV) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 268.98151 364.76031 Tm +(VXFFHVVIXO) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 153.78 349.1604 Tm +(&RQILUPDWLRQ) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 179.65199 349.1604 Tm +(FRGH [) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 201.01599 349.1604 Tm +(PHDQV) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 214.68399 349.1604 Tm +(WKHUH) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 225.80399 349.1604 Tm +(LV) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 229.79199 349.1604 Tm +(DQ) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 235.54799 349.1604 Tm +(HUURU) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 246.21999 349.1604 Tm +(LQ) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 250.76399 349.1604 Tm +(UHFHLYLQJ) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 268.91599 349.1604 Tm +(WKH) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 276.12799 349.1604 Tm +(SDFNDJH) Tj +ET +BT +/F6 7 Tf +0 0 0 rg +1 0 0 1 87.84 333.56061 Tm +() Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 96.408 333.56061 Tm +(,QVWUXFWLRQ) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 134.278 333.56061 Tm +(SDFNHW) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 157.903 333.56061 Tm +(FKHFNVXP) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 192.679 333.56061 Tm +( ) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 194.77901 333.56061 Tm +() Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 200.60301 333.56061 Tm +(E\\WHV ) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 224.41 333.56061 Tm +(3DFNDJH) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 253.67 333.56061 Tm +(,') Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 262.97299 333.56061 Tm +( ) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 265.073 333.56061 Tm +() Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 270.897 333.56061 Tm +(E\\WH ) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 287.34702 333.56061 Tm +() Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 291.35101 333.56061 Tm +(3DFNHW) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 314.90601 333.56061 Tm +(OHQJWK) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 337.96399 333.56061 Tm +( ) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 340.064 333.56061 Tm +() Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 345.888 333.56061 Tm +(E\\WHV ) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 365.69101 333.56061 Tm +() Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 369.69501 333.56061 Tm +(VFULSW) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 389.75702 333.56061 Tm +( ) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 391.85703 333.56061 Tm +() Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 397.68103 333.56061 Tm +(E\\WH ) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 414.13104 333.56061 Tm +() Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 418.13504 333.56061 Tm +(0RGXOH) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 444.92404 333.56061 Tm +(QHZ) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 460.52005 333.56061 Tm +(DGGUHVV) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 488.42206 333.56061 Tm +( ) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 490.52206 333.56061 Tm +() Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 496.34607 333.56061 Tm +(E\\WHV ) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 516.14905 333.56061 Tm +() Tj +ET +BT +/F6 6.5 Tf +0 0 0 rg +1 0 0 1 87.84 317.96082 Tm +() Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 95.796 317.96082 Tm +($QVZHU) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 120.2295 317.96082 Tm +(SDFNHW) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 142.16699 317.96082 Tm +(FKHFNVXP) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 174.45898 317.96082 Tm +( ) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 176.40898 317.96082 Tm +() Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 181.81699 317.96082 Tm +(E\\WHV ) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 203.92349 317.96082 Tm +(3DFNDJH) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 231.09349 317.96082 Tm +(,') Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 239.73199 317.96082 Tm +( ) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 241.68199 317.96082 Tm +() Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 247.09 317.96082 Tm +(E\\WH ) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 262.36499 317.96082 Tm +() Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 266.08298 317.96082 Tm +(3DFNHW) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 287.95547 317.96082 Tm +(OHQJWK) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 309.36649 317.96082 Tm +( ) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 311.3165 317.96082 Tm +() Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 316.72449 317.96082 Tm +(E\\WHV ) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 335.11298 317.96082 Tm +() Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 338.83096 317.96082 Tm +(FRQILUPDWLRQ) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 379.88495 317.96082 Tm +(FRGH) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 396.29095 317.96082 Tm +( ) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 398.24097 317.96082 Tm +() Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 403.64896 317.96082 Tm +(E\\WH ) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 418.92395 317.96082 Tm +() Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 87.841 302.3609 Tm +() Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 94.57301 302.3609 Tm +(7KH) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 105.562 302.3609 Tm +(FKHFNVXP) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 132.886 302.3609 Tm +(LV) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 138.36951 302.3609 Tm +(DGGHG) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 156.13451 302.3609 Tm +(LQ) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 162.38251 302.3609 Tm +(E\\WHV) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 179.19601 302.3609 Tm +(WKH) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 189.11252 302.3609 Tm +(FDUU\\) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 203.61601 302.3609 Tm +(RYHU) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 216.54102 302.3609 Tm +() Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 221.11702 302.3609 Tm +(E\\WHV) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 236.45651 302.3609 Tm +(LV) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 241.94002 302.3609 Tm +(LJQRUHG) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 265.12802 302.3609 Tm +(DQG) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 276.42502 302.3609 Tm +(WKH) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 286.34152 302.3609 Tm +(KLJK) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 299.37103 302.3609 Tm +(E\\WH) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 312.07602 302.3609 Tm +(FRPHV) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 330.35251 302.3609 Tm +(ILUVW) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 341.98502 302.3609 Tm +(ZKHQ) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 357.638 302.3609 Tm +(WUDQVPLWWLQJ) Tj +ET +BT +/F6 7.5 Tf +0 0 0 rg +1 0 0 1 87.841 286.76099 Tm +() Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 97.021 286.76099 Tm +(7KH) Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 112.006 286.76099 Tm +(GHIDXOW) Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 138.86351 286.76099 Tm +(PRGXOH) Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 167.77602 286.76099 Tm +(DGGUHVV) Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 197.67102 286.76099 Tm +(LV) Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 205.14851 286.76099 Tm +() Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 208.20851 286.76099 Tm +([IIIIIIII) Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 240.16602 286.76099 Tm +() Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 244.12602 286.76099 Tm +(GHIDXOW) Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 270.98352 286.76099 Tm +(SDVVZRUG) Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 307.08102 286.76099 Tm +(LV) Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 314.55853 286.76099 Tm +() Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 317.61853 286.76099 Tm +<0013005B00130013001300130013001300130013020A> Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 362.88852 286.76099 Tm +() Tj +ET +BT +/F7 6 Tf +0 0 0 rg +1 0 0 1 87.84 241.04028 Tm +() Tj +ET +BT +/F7 6 Tf +0 0 0 rg +1 0 0 1 91.272 241.04028 Tm +( ) Tj +ET +BT +/F7 6 Tf +0 0 0 rg +1 0 0 1 94.866 241.04028 Tm +(WR) Tj +ET +BT +/F7 6 Tf +0 0 0 rg +1 0 0 1 102.744 241.04028 Tm +(VHW) Tj +ET +BT +/F7 6 Tf +0 0 0 rg +1 0 0 1 113.436 241.04028 Tm +(WKH) Tj +ET +BT +/F7 6 Tf +0 0 0 rg +1 0 0 1 125.088 241.04028 Tm +(EDVLF) Tj +ET +BT +/F7 6 Tf +0 0 0 rg +1 0 0 1 141.966 241.04028 Tm +(SDUDPHWHUV) Tj +ET +BT +/F7 6 Tf +0 0 0 rg +1 0 0 1 178.59 241.04028 Tm +(RI) Tj +ET +BT +/F7 6 Tf +0 0 0 rg +1 0 0 1 186.18599 241.04028 Tm +(WKH) Tj +ET +BT +/F7 6 Tf +0 0 0 rg +1 0 0 1 197.83798 241.04028 Tm +(PRGXOH) Tj +ET +BT +/F7 6 Tf +0 0 0 rg +1 0 0 1 222.11998 241.04028 Tm +(V\\VWHP) Tj +ET +BT +/F7 6 Tf +0 0 0 rg +1 0 0 1 245.09998 241.04028 Tm +(6HW6\\V3DUD) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 123.72 211.46033 Tm +(\)XQFWLRQ) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 145.405 211.46033 Tm +(GHVFULSWLRQ) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 174.375 211.46033 Tm +(ZRUN) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 187.36501 211.46033 Tm +(SDUDPHWHU) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 213.60001 211.46033 Tm +(VHWWLQJ) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 231.18001 211.46033 Tm +( UHIHU) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 245.47 211.46033 Tm +(WR) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 251.60001 211.46033 Tm +() Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 259.96002 211.46033 Tm +(V\\VWHP) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 277.90002 211.46033 Tm +(FRQILJXUDWLRQ) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 310.97003 211.46033 Tm +(SDUDPHWHUV ) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 342.44003 211.46033 Tm +(,QSXW) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 123.72 195.86041 Tm +(SDUDPHWHU) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 151.295 195.86041 Tm +(SDUDPHWHU) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 177.53 195.86041 Tm +(VHULDO) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 191.495 195.86041 Tm +(QXPEHU) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 123.72 180.26062 Tm +(5HWXUQ) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 139.272 180.26062 Tm +(SDUDPHWHU) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 164.08951 180.26062 Tm +(FRQILUPDWLRQ) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 192.51151 180.26062 Tm +(ZRUG) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 123.72 164.66077 Tm +(&RPPDQG) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 159.847 164.66077 Tm +(FRGH) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 179.39101 164.66077 Tm +([H) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 87.8405 149.06091 Tm +(,QVWUXFWLRQ) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 114.8905 149.06091 Tm +(SDFNHW) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 131.7655 149.06091 Tm +(IRUPDW) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 92.2809 132.9812 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 100.6009 132.9812 Tm +(E\\WHV) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 148.74139 132.9812 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 157.0614 132.9812 Tm +(E\\WHV) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 207.84171 132.9812 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 216.16171 132.9812 Tm +(E\\WH) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 261.66251 132.9812 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 269.98251 132.9812 Tm +(E\\WHV) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 320.8226 132.9812 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 329.14261 132.9812 Tm +(E\\WH) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 377.34299 132.9812 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 385.66299 132.9812 Tm +(E\\WH) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 433.8035 132.9812 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 442.1235 132.9812 Tm +(E\\WH) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 487.6842 132.9812 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 496.00421 132.9812 Tm +(E\\WHV) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 100.14 116.90027 Tm +(%DRWRX) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 146.0995 116.90027 Tm +(0RGXOH) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 167.14801 116.90027 Tm +(DGGUHVV) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 207.8396 116.90027 Tm +(3DFNDJH) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 230.82961 116.90027 Tm +(,') Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 264.2991 116.90027 Tm +(SDFNDJH) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 281.05911 116.90027 Tm +(OHQJWK) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 320.81949 116.90027 Tm +(VFULSW) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 372.11938 116.90027 Tm +(SDUDPHWHU) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 395.7309 116.90027 Tm +(QXPEHU) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 439.07889 116.90027 Tm +(FRQWHQW) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 490.319 116.90027 Tm +(FKHFNVXP) Tj +ET +BT +/F5 9.5 Tf +0 0 0 rg +1 0 0 1 94.86 100.82031 Tm +([HI) Tj +ET +BT +/F5 10.5 Tf +0 0 0 rg +1 0 0 1 156.601 100.82031 Tm +(;;;;) Tj +ET +BT +/F5 10.5 Tf +0 0 0 rg +1 0 0 1 213.06149 100.82031 Tm +([) Tj +ET +BT +/F5 9 Tf +0 0 0 rg +1 0 0 1 264.30261 100.82031 Tm +([) Tj +ET +BT +/F5 10.5 Tf +0 0 0 rg +1 0 0 1 326.04349 100.82031 Tm +([H) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 379.9841 100.82031 Tm +() Tj +ET +BT +/F5 10.5 Tf +0 0 0 rg +1 0 0 1 446.94461 100.82031 Tm +(;) Tj +ET +BT +/F5 10.5 Tf +0 0 0 rg +1 0 0 1 498.1846 100.82031 Tm +(6XP) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 267.95999 45.86041 Tm +(WKH) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 277.8765 45.86041 Tm +(ILUVW) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 289.509 45.86041 Tm +() Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 297.23102 45.86041 Tm +(SDJHV) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 314.24802 45.86041 Tm +(RI) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 320.89752 45.86041 Tm +() Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 328.61951 45.86041 Tm +(3DJH) Tj +ET + +endstream +endobj +914 0 obj +<< +/Length 2 +>> +stream +q + +endstream +endobj +915 0 obj +<< +/Length 2796 +/Filter /FlateDecode +>> +stream +x[[ ~_1VG @0"aY;k/඿.3:3)H3C)~%oN=>x:緷?||٧/$I +)a-y5~pxzq+pg928-RNf𣃐UQ1zS(xw?~O1,y8rT v/SqT&)(aQ}bF + +PFĐx'匰7E1‡@oӭ<Ad V6WPH֪g%0Z6H0qa|.NYdûn S]eJEUi?yN/mjוJ_^h;-V*v u3bX_بhA8E:n-a o̻P3:%ZK2=4BH]BD@es8.#˪(G$d{ 6?oZExR93EY/&OӴR4XJѬYHu'/ ND%t6@N/+<:jHHGºJH5gw%fƙAsJ$+IKǒbLcrH]bY~\Ñ uſpd W )&º0FJr+yݐ t>M)Hu]8e_uxc,`'héΊ3}VZqfьk;SuhY D0Ι4sR Bw62rnOנwN!<{M%=.skb$]q>8\$NuT>bSfe=ɰrRp,7l) ?"nk)cKb.֍.mHB*ro+q64b3 +N(3uxM׺FK sRDRw-bDl3o2DZODڵ M:Z[ gQP~-Rl~uyy6IAE 9H,Ó!Mb*?Ά)~~9y6L6EM@vRWl UN9r&M +9GX -;N{\\bDZ1&99Dl. ;I(d܋R1w۱ENj|KeΤF%!#'2R@FyddR.f, s}7˹nB fY YNriLa*'v0R3$\Ѵ|FI+7h4-+@Zr-|!뻂kā+;w]'uA BlO 1{,M,.K24-_<S B\+HR=pfьk{.cFel}ҷUmV}ZjW+TuRz /q5¦5ZJu8-뵡e(¶[Pc#l&hb?I'41cU%Ib; wFH.OWw®] 2֗!p/~ +zk'`5v2 nT+| +ZBS+DhjC %4fh:#KB SfjMSBp֗BBit8"Aj`_lWlu Nu g +.[4dTS1и4yK&4oTւD /Ҽ5[(ykf3>UQKP|70na/}-eô[¦I8+T?ːZ_>Ul\Z.UJI; [m\)Ř|ʦ/[y,Z1]ve\Ro؉Zs*~?MQ:#tBLÔFЀ<%"d R߯ +endstream +endobj +916 0 obj +<< +/Length 31731 +>> +stream +Q +1 0 0 1 0 0 cm +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 377.35162 781.10431 Tm +(+DQJ]KRX) Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 415.64661 781.10431 Tm +(=KLDQ) Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 437.2991 781.10431 Tm +(7HFKQRORJ\\) Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 479.96661 781.10431 Tm +(&R) Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 495.21411 781.10431 Tm +(/WG) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 87.84 758.0603 Tm +(5HVSRQVH) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 111.87 758.0603 Tm +(SDFNHW) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 128.745 758.0603 Tm +(IRUPDW) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 96.2999 741.98059 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 104.6199 741.98059 Tm +(E\\WHV) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 160.86011 741.98059 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 169.18011 741.98059 Tm +(E\\WHV) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 228.06 741.98059 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 236.38 741.98059 Tm +(E\\WH) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 289.9805 741.98059 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 298.30051 741.98059 Tm +(E\\WHV) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 357.12061 741.98059 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 365.44061 741.98059 Tm +(E\\WH) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 419.0412 741.98059 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 427.36121 741.98059 Tm +(E\\WHV) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 104.22 725.90033 Tm +(%DRWRX) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 158.2803 725.90033 Tm +(0RGXOH) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 179.3288 725.90033 Tm +(DGGUHVV) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 228.0602 725.90033 Tm +(3DFNDJH) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 251.0502 725.90033 Tm +(,') Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 292.62051 725.90033 Tm +(SDFNDJH) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 309.38052 725.90033 Tm +(OHQJWK) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 357.12091 725.90033 Tm +(FRQILUPDWLRQ) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 382.38492 725.90033 Tm +(FRGH) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 421.68121 725.90033 Tm +(FKHFNVXP) Tj +ET +BT +/F5 9.5 Tf +0 0 0 rg +1 0 0 1 98.94 709.82031 Tm +([HI) Tj +ET +BT +/F5 10.5 Tf +0 0 0 rg +1 0 0 1 168.72079 709.82031 Tm +(;;;;) Tj +ET +BT +/F5 10.5 Tf +0 0 0 rg +1 0 0 1 233.2822 709.82031 Tm +([) Tj +ET +BT +/F5 9 Tf +0 0 0 rg +1 0 0 1 292.6228 709.82031 Tm +([) Tj +ET +BT +/F5 10.5 Tf +0 0 0 rg +1 0 0 1 370.26401 709.82031 Tm +(;) Tj +ET +BT +/F5 10.5 Tf +0 0 0 rg +1 0 0 1 429.54489 709.82031 Tm +(6XP) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 132.78 693.6803 Tm +(1RWH) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 151.097 693.6803 Tm +(&RQILUPDWLRQ) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 193.13901 693.6803 Tm +(FRGH [) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 227.8555 693.6803 Tm +(PHDQV) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 250.06599 693.6803 Tm +(2.) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 159.0605 678.08038 Tm +(&RQILUPDWLRQ) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 184.9325 678.08038 Tm +(FRGH [) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 206.29649 678.08038 Tm +(PHDQV) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 219.96449 678.08038 Tm +(WKHUH) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 231.08449 678.08038 Tm +(LV) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 235.07249 678.08038 Tm +(DQ) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 240.82849 678.08038 Tm +(HUURU) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 251.50049 678.08038 Tm +(LQ) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 256.04449 678.08038 Tm +(UHFHLYLQJ) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 274.1965 678.08038 Tm +(WKH) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 281.40851 678.08038 Tm +(SDFNDJH) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 159.0605 662.48059 Tm +(FRQILUPDWLRQ) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 187.4825 662.48059 Tm +(FRGH) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 198.8405 662.48059 Tm +( ) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 201.41451 662.48059 Tm +([D) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 212.63751 662.48059 Tm +(,QGLFDWHV) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 233.04501 662.48059 Tm +(WKDW) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 242.76952 662.48059 Tm +(WKH) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 250.88301 662.48059 Tm +(UHJLVWHU) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 268.5545 662.48059 Tm +(VHULDO) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 281.12302 662.48059 Tm +(QXPEHU) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 299.2265 662.48059 Tm +(LV) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 303.71301 662.48059 Tm +(LQFRUUHFW) Tj +ET +BT +/F6 6.5 Tf +0 0 0 rg +1 0 0 1 87.84 646.8808 Tm +() Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 95.796 646.8808 Tm +(,QVWUXFWLRQ) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 130.961 646.8808 Tm +(SDFNHW) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 152.8985 646.8808 Tm +(FKHFNVXP) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 185.19049 646.8808 Tm +( ) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 187.14049 646.8808 Tm +() Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 192.54849 646.8808 Tm +(E\\WHV ) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 214.655 646.8808 Tm +(3DFNDJH) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 241.825 646.8808 Tm +(,') Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 250.4635 646.8808 Tm +( ) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 252.4135 646.8808 Tm +() Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 257.8215 646.8808 Tm +(E\\WH ) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 273.0965 646.8808 Tm +() Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 276.81448 646.8808 Tm +(3DFNHW) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 298.68698 646.8808 Tm +(OHQJWK) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 320.09799 646.8808 Tm +( ) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 322.048 646.8808 Tm +() Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 327.45599 646.8808 Tm +(E\\WHV ) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 345.84448 646.8808 Tm +() Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 349.56247 646.8808 Tm +(VFULSW) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 368.19147 646.8808 Tm +( ) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 370.14148 646.8808 Tm +() Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 375.54947 646.8808 Tm +(E\\WH ) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 390.82446 646.8808 Tm +() Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 394.54245 646.8808 Tm +(SDUDPHWHU) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 428.64795 646.8808 Tm +(QXPEHU) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 454.79745 646.8808 Tm +( ) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 456.74747 646.8808 Tm +() Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 462.15546 646.8808 Tm +(E\\WH ) Tj +ET +BT +/F5 8 Tf +0 0 0 rg +1 0 0 1 208.62151 631.28088 Tm +() Tj +ET +BT +/F5 8 Tf +0 0 0 rg +1 0 0 1 215.27751 631.28088 Tm +(FRQWHQW) Tj +ET +BT +/F5 8 Tf +0 0 0 rg +1 0 0 1 246.21352 631.28088 Tm +( ) Tj +ET +BT +/F5 8 Tf +0 0 0 rg +1 0 0 1 248.61351 631.28088 Tm +() Tj +ET +BT +/F5 8 Tf +0 0 0 rg +1 0 0 1 255.26952 631.28088 Tm +(E\\WH ) Tj +ET +BT +/F5 8 Tf +0 0 0 rg +1 0 0 1 274.06952 631.28088 Tm +() Tj +ET +BT +/F6 6.5 Tf +0 0 0 rg +1 0 0 1 87.841 615.68103 Tm +() Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 95.797 615.68103 Tm +($QVZHU) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 120.23051 615.68103 Tm +(SDFNHW) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 142.168 615.68103 Tm +(FKHFNVXP) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 174.45999 615.68103 Tm +( ) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 176.40999 615.68103 Tm +() Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 181.81799 615.68103 Tm +(E\\WHV ) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 203.9245 615.68103 Tm +(3DFNDJH) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 231.0945 615.68103 Tm +(,') Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 239.733 615.68103 Tm +( ) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 241.683 615.68103 Tm +() Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 247.091 615.68103 Tm +(E\\WH ) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 262.366 615.68103 Tm +() Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 266.08398 615.68103 Tm +(3DFNHW) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 287.95648 615.68103 Tm +(OHQJWK) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 309.36749 615.68103 Tm +( ) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 311.3175 615.68103 Tm +() Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 316.72549 615.68103 Tm +(E\\WHV ) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 335.11398 615.68103 Tm +() Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 338.83197 615.68103 Tm +(FRQILUPDWLRQ) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 379.88599 615.68103 Tm +(FRGH) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 396.29199 615.68103 Tm +( ) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 398.242 615.68103 Tm +() Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 403.64999 615.68103 Tm +(E\\WH ) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 418.92499 615.68103 Tm +() Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 87.8421 600.08118 Tm +() Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 94.5741 600.08118 Tm +(7KH) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 105.5631 600.08118 Tm +(FKHFNVXP) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 132.8871 600.08118 Tm +(LV) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 138.37061 600.08118 Tm +(DGGHG) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 156.1356 600.08118 Tm +(LQ) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 162.38361 600.08118 Tm +(E\\WHV) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 179.19711 600.08118 Tm +(WKH) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 189.11362 600.08118 Tm +(FDUU\\) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 203.61711 600.08118 Tm +(RYHU) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 216.54211 600.08118 Tm +() Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 221.11812 600.08118 Tm +(E\\WHV) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 236.45761 600.08118 Tm +(LV) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 241.94112 600.08118 Tm +(LJQRUHG) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 265.12912 600.08118 Tm +(DQG) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 276.42612 600.08118 Tm +(WKH) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 286.34262 600.08118 Tm +(KLJK) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 299.37213 600.08118 Tm +(E\\WH) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 312.07712 600.08118 Tm +(FRPHV) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 330.35361 600.08118 Tm +(ILUVW) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 341.98611 600.08118 Tm +(ZKHQ) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 357.6391 600.08118 Tm +(WUDQVPLWWLQJ) Tj +ET +BT +/F6 7.5 Tf +0 0 0 rg +1 0 0 1 87.8421 584.48138 Tm +() Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 97.0221 584.48138 Tm +(7KH) Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 112.0071 584.48138 Tm +(GHIDXOW) Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 138.86461 584.48138 Tm +(PRGXOH) Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 167.77711 584.48138 Tm +(DGGUHVV) Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 197.67212 584.48138 Tm +(LV) Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 205.14961 584.48138 Tm +() Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 208.20961 584.48138 Tm +([IIIIIIII) Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 240.16711 584.48138 Tm +() Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 244.12712 584.48138 Tm +(GHIDXOW) Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 270.98462 584.48138 Tm +(SDVVZRUG) Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 307.08212 584.48138 Tm +(LV) Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 314.55963 584.48138 Tm +() Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 317.61963 584.48138 Tm +<0013005B00130013001300130013001300130013020A> Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 362.88962 584.48138 Tm +() Tj +ET +BT +/F7 10.5 Tf +0 0 0 rg +1 0 0 1 107.46 549.26031 Tm +(QDPH) Tj +ET +BT +/F7 4 Tf +0 0 0 rg +1 0 0 1 163.44 549.26031 Tm +(SDUDPHWHU) Tj +ET +BT +/F7 4 Tf +0 0 0 rg +1 0 0 1 185.868 549.26031 Tm +(QXPEHU) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 369.66 549.26031 Tm +(FRQWHQW) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 102.3 529.58032 Tm +(EDXG) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 119.6485 529.58032 Tm +(UDWH) Tj +ET +BT +/F5 10.5 Tf +0 0 0 rg +1 0 0 1 181.92 529.58032 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 220.86 529.58032 Tm +<001C001900130013009900310003> Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 259.66 529.58032 Tm +(ESV) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 279.35001 529.58032 Tm +( 1) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 292.55002 529.58032 Tm +(YDOXH) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 320.24002 529.58032 Tm +(UDQJH) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 353.23001 529.58032 Tm +() Tj +ET +BT +/F6 10 Tf +0 0 0 rg +1 0 0 1 358.95001 529.58032 Tm +<0590> Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 368.95001 529.58032 Tm +( ) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 97.02 513.50031 Tm +(6HFXULW\\) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 121.09799 513.50031 Tm +(/HYHO) Tj +ET +BT +/F5 10.5 Tf +0 0 0 rg +1 0 0 1 181.92 513.50031 Tm +() Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 220.86 513.50031 Tm +('LYLGHG) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 247.51601 513.50031 Tm +(LQWR) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 262.23001 513.50031 Tm +() Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 268.05402 513.50031 Tm +(OHYHOV) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 290.16702 513.50031 Tm +(WKH) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 302.78802 513.50031 Tm +(YDOXH) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 322.17102 513.50031 Tm +(UDQJH) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 345.26401 513.50031 Tm +() Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 352.96402 513.50031 Tm +() Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 360.66403 513.50031 Tm +() Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 368.36404 513.50031 Tm +() Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 376.06406 513.50031 Tm +() Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 91.8 497.42029 Tm +(SDFNDJH) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 110.655 497.42029 Tm +(FRQWHQW) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 128.0565 497.42029 Tm +(OHQJWK) Tj +ET +BT +/F5 10.5 Tf +0 0 0 rg +1 0 0 1 181.92 497.42029 Tm +() Tj +ET +BT +/F5 8 Tf +0 0 0 rg +1 0 0 1 220.86 497.42029 Tm +(9DOXH) Tj +ET +BT +/F5 8 Tf +0 0 0 rg +1 0 0 1 243.748 497.42029 Tm +(UDQJH) Tj +ET +BT +/F5 8 Tf +0 0 0 rg +1 0 0 1 270.14001 497.42029 Tm +() Tj +ET +BT +/F5 8 Tf +0 0 0 rg +1 0 0 1 278.94 497.42029 Tm +() Tj +ET +BT +/F5 8 Tf +0 0 0 rg +1 0 0 1 287.73999 497.42029 Tm +() Tj +ET +BT +/F5 8 Tf +0 0 0 rg +1 0 0 1 296.53998 497.42029 Tm +() Tj +ET +BT +/F5 8 Tf +0 0 0 rg +1 0 0 1 305.33997 497.42029 Tm +(FRUUHVSRQGLQJ) Tj +ET +BT +/F5 8 Tf +0 0 0 rg +1 0 0 1 362.60397 497.42029 Tm +(OHQJWK) Tj +ET +BT +/F5 8 Tf +0 0 0 rg +1 0 0 1 388.95596 497.42029 Tm +( QXPEHU) Tj +ET +BT +/F5 8 Tf +0 0 0 rg +1 0 0 1 423.53998 497.42029 Tm +(RI) Tj +ET +BT +/F5 8 Tf +0 0 0 rg +1 0 0 1 433.21198 497.42029 Tm +(E\\WHV ) Tj +ET +BT +/F5 8 Tf +0 0 0 rg +1 0 0 1 460.06796 497.42029 Tm +() Tj +ET +BT +/F5 8 Tf +0 0 0 rg +1 0 0 1 473.44397 497.42029 Tm +() Tj +ET +BT +/F5 8 Tf +0 0 0 rg +1 0 0 1 486.81998 497.42029 Tm +() Tj +ET +BT +/F5 8 Tf +0 0 0 rg +1 0 0 1 504.77197 497.42029 Tm +() Tj +ET +BT +/F7 6.5 Tf +0 0 0 rg +1 0 0 1 87.84 436.64029 Tm +() Tj +ET +BT +/F7 6.5 Tf +0 0 0 rg +1 0 0 1 91.558 436.64029 Tm +( ) Tj +ET +BT +/F7 6.5 Tf +0 0 0 rg +1 0 0 1 95.4515 436.64029 Tm +(WR) Tj +ET +BT +/F7 6.5 Tf +0 0 0 rg +1 0 0 1 103.986 436.64029 Tm +(UHDG) Tj +ET +BT +/F7 6.5 Tf +0 0 0 rg +1 0 0 1 120.509 436.64029 Tm +(V\\VWHP) Tj +ET +BT +/F7 6.5 Tf +0 0 0 rg +1 0 0 1 145.40401 436.64029 Tm +(SDUDPHWHUV) Tj +ET +BT +/F7 6.5 Tf +0 0 0 rg +1 0 0 1 185.08002 436.64029 Tm +(5HDG6\\V3DUD) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 124.62 407.0603 Tm +(\)XQFWLRQ) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 148.47351 407.0603 Tm +(GHVFULSWLRQ) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 180.34052 407.0603 Tm +(5HDG) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 194.76152 407.0603 Tm +(WKH) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 204.67802 407.0603 Tm +<0050005200470058004F0048000A00560003> Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 229.75253 407.0603 Tm +(VWDWXV) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 246.90703 407.0603 Tm +(UHJLVWHU) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 268.50552 407.0603 Tm +(DQG) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 279.80252 407.0603 Tm +(V\\VWHP) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 299.53653 407.0603 Tm +(EDVLF) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 314.12802 407.0603 Tm +(FRQILJXUDWLRQ) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 350.505 407.0603 Tm +(SDUDPHWHUV) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 381.99802 407.0603 Tm +( VHH) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 393.9165 407.0603 Tm +() Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 403.11252 407.0603 Tm +(6\\VWHP) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 423.23151 407.0603 Tm +(&RQILJXUDWLRQ) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 460.44452 407.0603 Tm +(3DUDPHWHUV) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 491.88251 407.0603 Tm +(DQG) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 503.1795 407.0603 Tm +() Tj +ET +BT +/F5 8 Tf +0 0 0 rg +1 0 0 1 177.12 391.45731 Tm +(V\\VWHP) Tj +ET +BT +/F5 8 Tf +0 0 0 rg +1 0 0 1 205.82399 391.45731 Tm +(VWDWXV) Tj +ET +BT +/F5 8 Tf +0 0 0 rg +1 0 0 1 230.77599 391.45731 Tm +(UHJLVWHU ) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 124.62 375.8606 Tm +(,QSXW) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 142.89151 375.8606 Tm +(SDUDPHWHU) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 178.73901 375.8606 Tm +(QRQH) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 124.62 360.2608 Tm +(5HWXUQ) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 141.90001 360.2608 Tm +(SDUDPHWHU) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 169.47501 360.2608 Tm +(FRQILUPDWLRQ) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 201.05501 360.2608 Tm +(ZRUG) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 214.45001 360.2608 Tm +() Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 218.61002 360.2608 Tm +(EDVLF) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 231.87502 360.2608 Tm +(SDUDPHWHU) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 124.62 344.66089 Tm +(&RPPDQG) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 160.74701 344.66089 Tm +(FRGH) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 180.29102 344.66089 Tm +([I) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 87.8396 329.0611 Tm +(,QVWUXFWLRQ) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 114.8896 329.0611 Tm +(SDFNHW) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 131.7646 329.0611 Tm +(IRUPDW) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 96.2994 312.98145 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 104.6194 312.98145 Tm +(E\\WHV) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 160.8596 312.98145 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 169.1796 312.98145 Tm +(E\\WHV) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 228.0596 312.98145 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 236.37961 312.98145 Tm +(E\\WH) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 289.9801 312.98145 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 298.30011 312.98145 Tm +(E\\WHV) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 357.12021 312.98145 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 365.44022 312.98145 Tm +(E\\WH) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 419.04071 312.98145 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 427.36072 312.98145 Tm +(E\\WHV) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 104.22 296.90027 Tm +(%DRWRX) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 158.2803 296.90027 Tm +(0RGXOH) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 179.3288 296.90027 Tm +(DGGUHVV) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 228.0602 296.90027 Tm +(3DFNDJH) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 251.0502 296.90027 Tm +(,') Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 292.62051 296.90027 Tm +(SDFNDJH) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 309.38052 296.90027 Tm +(OHQJWK) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 357.12091 296.90027 Tm +(VFULSW) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 421.68121 296.90027 Tm +(FKHFNVXP) Tj +ET +BT +/F5 9.5 Tf +0 0 0 rg +1 0 0 1 98.94 280.82031 Tm +([HI) Tj +ET +BT +/F5 10.5 Tf +0 0 0 rg +1 0 0 1 168.72079 280.82031 Tm +(;;;;) Tj +ET +BT +/F5 10.5 Tf +0 0 0 rg +1 0 0 1 233.2822 280.82031 Tm +([) Tj +ET +BT +/F5 9 Tf +0 0 0 rg +1 0 0 1 292.6228 280.82031 Tm +([) Tj +ET +BT +/F5 10.5 Tf +0 0 0 rg +1 0 0 1 362.34381 280.82031 Tm +([I) Tj +ET +BT +/F5 10.5 Tf +0 0 0 rg +1 0 0 1 429.5448 280.82031 Tm +(6XP) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 87.84 264.68042 Tm +(5HVSRQVH) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 111.87 264.68042 Tm +(SDFNHW) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 128.745 264.68042 Tm +(IRUPDW) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 96.2999 248.60071 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 104.6199 248.60071 Tm +(E\\WHV) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 160.86011 248.60071 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 169.18011 248.60071 Tm +(E\\WHV) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 228.06 248.60071 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 236.38 248.60071 Tm +(E\\WH) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 289.9805 248.60071 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 298.30051 248.60071 Tm +(E\\WHV) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 357.12061 248.60071 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 365.44061 248.60071 Tm +(E\\WH) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 416.40149 248.60071 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 430.4415 248.60071 Tm +(E\\WHV) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 483.66229 248.60071 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 491.9823 248.60071 Tm +(E\\WHV) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 104.22 232.52026 Tm +(%DRWRX) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 158.2803 232.52026 Tm +(0RGXOH) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 179.3288 232.52026 Tm +(DGGUHVV) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 228.0602 232.52026 Tm +(3DFNDJH) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 251.0502 232.52026 Tm +(,') Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 292.62051 232.52026 Tm +(SDFNDJH) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 309.38052 232.52026 Tm +(OHQJWK) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 357.12091 232.52026 Tm +(FRQILUPDWLRQ) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 382.38492 232.52026 Tm +(FRGH) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 416.4606 232.52026 Tm +(%DVLF) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 429.9006 232.52026 Tm +(SDUDPHWHUV) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 486.30029 232.52026 Tm +(FKHFNVXP) Tj +ET +BT +/F5 9.5 Tf +0 0 0 rg +1 0 0 1 98.94 216.38031 Tm +([HI) Tj +ET +BT +/F5 10.5 Tf +0 0 0 rg +1 0 0 1 168.7542 216.38031 Tm +(;;;;) Tj +ET +BT +/F5 10.5 Tf +0 0 0 rg +1 0 0 1 233.3174 216.38031 Tm +([) Tj +ET +BT +/F5 9 Tf +0 0 0 rg +1 0 0 1 292.61981 216.38031 Tm +([) Tj +ET +BT +/F5 10.5 Tf +0 0 0 rg +1 0 0 1 370.26929 216.38031 Tm +(;) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 411.17099 216.38031 Tm +(7KH) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 419.16299 216.38031 Tm +(VWUXFWXUH) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 437.431 216.38031 Tm +(LV) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 441.41901 216.38031 Tm +(VKRZQ) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 454.883 216.38031 Tm +(LQ) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 459.427 216.38031 Tm +(WKH) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 466.63901 216.38031 Tm +(WDEOH) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 477.11502 216.38031 Tm +(EHORZ) Tj +ET +BT +/F5 10.5 Tf +0 0 0 rg +1 0 0 1 494.20911 216.38031 Tm +(6XP) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 159.78 200.30029 Tm +(1RWH) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 176.688 200.30029 Tm +(&RQILUPDWLRQ) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 215.496 200.30029 Tm +(FRGH [) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 247.54201 200.30029 Tm +(PHDQV) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 268.04401 200.30029 Tm +(2.) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 180.05969 184.7005 Tm +(&RQILUPDWLRQ) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 205.93169 184.7005 Tm +(FRGH [) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 227.29568 184.7005 Tm +(PHDQV) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 240.96368 184.7005 Tm +(WKHUH) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 252.08368 184.7005 Tm +(LV) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 256.07169 184.7005 Tm +(DQ) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 261.8277 184.7005 Tm +(HUURU) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 272.49969 184.7005 Tm +(LQ) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 277.0437 184.7005 Tm +(UHFHLYLQJ) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 295.19571 184.7005 Tm +(WKH) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 302.40771 184.7005 Tm +(SDFNDJH) Tj +ET +BT +/F6 7 Tf +0 0 0 rg +1 0 0 1 87.8403 169.10059 Tm +() Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 96.4083 169.10059 Tm +(,QVWUXFWLRQ) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 134.27831 169.10059 Tm +(SDFNHW) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 157.90331 169.10059 Tm +(FKHFNVXP) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 192.67931 169.10059 Tm +( ) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 194.77931 169.10059 Tm +() Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 200.60332 169.10059 Tm +(E\\WHV ) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 224.41031 169.10059 Tm +(3DFNDJH) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 253.6703 169.10059 Tm +(,') Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 262.9733 169.10059 Tm +( ) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 265.0733 169.10059 Tm +() Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 270.89731 169.10059 Tm +(E\\WH ) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 287.34732 169.10059 Tm +() Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 291.35132 169.10059 Tm +(3DFNHW) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 314.90631 169.10059 Tm +(OHQJWK) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 337.96429 169.10059 Tm +( ) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 340.0643 169.10059 Tm +() Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 345.88831 169.10059 Tm +(E\\WHV ) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 365.69131 169.10059 Tm +() Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 369.69531 169.10059 Tm +(VFULSW) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 389.75732 169.10059 Tm +( ) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 391.85733 169.10059 Tm +() Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 397.68134 169.10059 Tm +(E\\WH ) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 414.13135 169.10059 Tm +() Tj +ET +BT +/F6 6.5 Tf +0 0 0 rg +1 0 0 1 87.8414 153.50073 Tm +() Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 95.7974 153.50073 Tm +($QVZHU) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 120.2309 153.50073 Tm +(SDFNHW) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 142.1684 153.50073 Tm +(FKHFNVXP) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 174.46039 153.50073 Tm +( ) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 176.41039 153.50073 Tm +() Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 181.81839 153.50073 Tm +(E\\WHV ) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 203.9249 153.50073 Tm +(3DFNDJH) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 231.09489 153.50073 Tm +(,') Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 239.7334 153.50073 Tm +( ) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 241.6834 153.50073 Tm +() Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 247.0914 153.50073 Tm +(E\\WH ) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 262.36639 153.50073 Tm +() Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 266.08438 153.50073 Tm +(3DFNHW) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 287.95688 153.50073 Tm +(OHQJWK) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 309.36789 153.50073 Tm +( ) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 311.3179 153.50073 Tm +() Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 316.72589 153.50073 Tm +(E\\WHV ) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 335.11438 153.50073 Tm +() Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 338.83237 153.50073 Tm +(FRQILUPDWLRQ) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 379.88635 153.50073 Tm +(FRGH) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 396.29236 153.50073 Tm +( ) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 398.24237 153.50073 Tm +() Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 403.65036 153.50073 Tm +(E\\WH ) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 418.92535 153.50073 Tm +() Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 422.64334 153.50073 Tm +(%DVLF) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 440.11536 153.50073 Tm +(SDUDPHWHUV ) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 477.59436 153.50073 Tm +() Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 486.72037 153.50073 Tm +(E\\WHV ) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 505.10886 153.50073 Tm +() Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 87.8424 137.90088 Tm +() Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 94.5744 137.90088 Tm +(7KH) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 105.5634 137.90088 Tm +(FKHFNVXP) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 132.88741 137.90088 Tm +(LV) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 138.37091 137.90088 Tm +(DGGHG) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 156.13591 137.90088 Tm +(LQ) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 162.38391 137.90088 Tm +(E\\WHV) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 179.19742 137.90088 Tm +(WKH) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 189.11392 137.90088 Tm +(FDUU\\) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 203.61742 137.90088 Tm +(RYHU) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 216.54242 137.90088 Tm +() Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 221.11842 137.90088 Tm +(E\\WHV) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 236.45792 137.90088 Tm +(LV) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 241.94142 137.90088 Tm +(LJQRUHG) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 265.12943 137.90088 Tm +(DQG) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 276.42642 137.90088 Tm +(WKH) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 286.34293 137.90088 Tm +(KLJK) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 299.37244 137.90088 Tm +(E\\WH) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 312.07742 137.90088 Tm +(FRPHV) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 330.35391 137.90088 Tm +(ILUVW) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 341.98642 137.90088 Tm +(ZKHQ) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 357.6394 137.90088 Tm +(WUDQVPLWWLQJ) Tj +ET +BT +/F6 7.5 Tf +0 0 0 rg +1 0 0 1 87.8424 122.30109 Tm +() Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 97.0224 122.30109 Tm +(7KH) Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 112.0074 122.30109 Tm +(GHIDXOW) Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 138.8649 122.30109 Tm +(PRGXOH) Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 167.7774 122.30109 Tm +(DGGUHVV) Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 197.67241 122.30109 Tm +(LV) Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 205.1499 122.30109 Tm +() Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 208.2099 122.30109 Tm +([IIIIIIII) Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 240.1674 122.30109 Tm +() Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 244.12741 122.30109 Tm +(GHIDXOW) Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 270.98492 122.30109 Tm +(SDVVZRUG) Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 307.08243 122.30109 Tm +(LV) Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 314.55994 122.30109 Tm +() Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 317.61993 122.30109 Tm +<0013005B00130013001300130013001300130013020A> Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 362.88992 122.30109 Tm +() Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 267.95999 45.86041 Tm +(WKH) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 277.8765 45.86041 Tm +(ILUVW) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 289.509 45.86041 Tm +() Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 297.23102 45.86041 Tm +(SDJHV) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 314.24802 45.86041 Tm +(RI) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 320.89752 45.86041 Tm +() Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 328.61951 45.86041 Tm +(3DJH) Tj +ET + +endstream +endobj +917 0 obj +<< +/Length 2 +>> +stream +q + +endstream +endobj +918 0 obj +<< +/Length 5283 +/Filter /FlateDecode +>> +stream +x]]%m?b 켣ϙ:Rh@. 0lob_;,඿Dj$ )l/%>C=x4?~y^_^?ay˷o?O_Ǿvm5~3v<7|x۶|`⡖/^/ۢmnyχ?㝋2ze?j o0`@<^ϣl~U'"R̍p~bzF 6.Z6Rߢk/ ? ==U +OAl.;Lx_N/ RBܡ:Oe7+_xn:DTOV -ǴDsdC"C`o˟j[}| x}D!ltaj1ҠbM_ոhEY³瑡4AaȂKpjk%"'A\,do:Ch\J=0ɻJmUd=5ݬ@מCƙu!$L9 8ZPq!gu`PD}P/Lr["Ḻi1[ z.6[0dWTBt_ +&c6-R(Y΄}ZWZP (woͱقF֍>̟P1&m햁:R]`??H8ja})-$5p!9qخWGï5XO +!ǯ2pふ8q|[s1[p"FIIyu0y%L`OG[!L#MS돔/ #2g*5dmbC[}ntZ@dO+)Ʉ Q+S{`M' ) j+S8XX5 W+T>&dC"XE+ErFWn+gt …Ya0k$Q gFYWyV~hItMض,'z8OPbla9Df`=d`<EfGRDxsys6S3L3l3:1جGO|@Oy3~dN9M=#I>wf:/'{Jlf.QMq*wNGENw q,(mr Ė!Ԯ22|M0kW-y'2Yd3Coeiaj:Xw߳u9g2wds\ }ɥ1vѽD{lec=[i1o%2o^~/$IJ:/¼}y^$Xrj[p!hejrɿ΋lׂNɎ)f `IV$@LA'V&Z z1A&={ɡEwX٢?+N$8>Tƒ!S1= 5@28qSojū"o+ !iWʩ|2?t|2gy* FDU[1B"S2Sl늮$Urcr- D/}J#_1_(X)VO=^C܉_ #e1ne2gkwg/Zs)e,\yeͪ)41.*m廻9ds&\^횎gֲJxv p a=26D`{8cg`p״ +uz-wU#6~ecRݭ3:cpՅ wy:JFzKfݲ* L>c0koÙ ;uxMQF\K6)HkI ݜ YrI:^u*iaJ\+`u:Xef'`7#ДwSv uja d-=n0)&HƦ4c (~8^eo*8RDbm[Sb{!uew}|%$3(/I iDj3f#M|ϻ=O1;P-9i ±O1Lc=ƦŴLS|#l}cS|pfS|g!^l8M]Jb%z0&:jQ$VȁUi:rUOaI^q}cSY4s>76W>76W>5v4s>{7ALBx--^KkDЦE+iUFZWky9Ŧ1uMikڇ3H!xTQ7?7X:{܁ ;KFup!S W)՗q)ɕ(uMinїs +*b+k\Ꚓݫ+ +}-RٞW7̧X8!խ5c5 ~٤9Z{E p_c8;d}j~m8)i8SZP%8pΕހ t7/$βy$K R^GؕfB#za.iy']ַٙ&RG,_%4vj95摜@sgyi|k=MhǞbp8xjmϹ:w{l: ǽm%c)c;7;⋡җ]x^/KGL 7ݮN㟓cm41okXi!Äl+ +g~ڎ}8z^z)8Oö&P8(q3}(Ss\ϭg2v]z)q>t5|kW k!-TBw`uҊP7~lm}_nQ)8(- %{SyN9Fg?j"wh8 I:dIVI4+dUSJJVI\+YOYLX{2d1e`bJߚŔ')kOS֞,ܭefDLRJZȏ!Rwuf2ʳ^k +3Ș +[:/$tēYGĐ'.0LeEKVw4~3dENQʊUV'jajfTSgD1,{2BVfA(%À X2,^J"C-Z9V*Ǟ(M5}68| 3"4Bk^LXPAYlnӨFLŧub_N1VΐayE $iG +S eRV&' +Z|6JӇsʲ9D(Q䩕3*ՈW2Q=DlӃ0Se„VΠ`ի3*bՈ Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 332.892 605.90033 Tm +(ESV ) Tj +ET +BT +/F5 10.5 Tf +0 0 0 rg +1 0 0 1 386.76001 605.60028 Tm +() Tj +ET +BT +/F5 10.5 Tf +0 0 0 rg +1 0 0 1 451.56 605.60028 Tm +() Tj +ET +BT +/F6 7 Tf +0 0 0 rg +1 0 0 1 87.84 559.04028 Tm +( ) Tj +ET +BT +/F6 7 Tf +0 0 0 rg +1 0 0 1 96.03699 559.04028 Tm +(5HDG) Tj +ET +BT +/F6 7 Tf +0 0 0 rg +1 0 0 1 115.27299 559.04028 Tm +(ILQJHUSULQW) Tj +ET +BT +/F6 7 Tf +0 0 0 rg +1 0 0 1 155.66299 559.04028 Tm +(WHPSODWH) Tj +ET +BT +/F6 7 Tf +0 0 0 rg +1 0 0 1 189.50099 559.04028 Tm +(LQGH[) Tj +ET +BT +/F6 7 Tf +0 0 0 rg +1 0 0 1 210.66899 559.04028 Tm +(WDEOH) Tj +ET +BT +/F6 7 Tf +0 0 0 rg +1 0 0 1 230.45799 559.04028 Tm +(5HDG&RQ/LVW) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 126.84 529.46033 Tm +(\)XQFWLRQ) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 150.6935 529.46033 Tm +(GHVFULSWLRQ) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 182.5605 529.46033 Tm +(5HDG) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 196.98151 529.46033 Tm +(WKH) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 206.89801 529.46033 Tm +(PRGXOH) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 228.10051 529.46033 Tm +(ILQJHUSULQW) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 257.45401 529.46033 Tm +(WHPSODWH) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 282.0885 529.46033 Tm +(LQGH[) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 297.7305 529.46033 Tm +(WDEOH) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 313.60901 529.46033 Tm +(DQG) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 324.90601 529.46033 Tm +(UHDG) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 338.17752 529.46033 Tm +(WKH) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 348.09402 529.46033 Tm +(LQGH[) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 363.73602 529.46033 Tm +(WDEOH) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 378.14053 529.46033 Tm +(RI) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 384.79004 529.46033 Tm +(XS) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 393.00153 529.46033 Tm +(WR) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 399.74454 529.46033 Tm +() Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 410.61255 529.46033 Tm +(ILQJHUSULQW) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 439.96606 529.46033 Tm +(WHPSODWHV) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 467.23508 529.46033 Tm +(HDFK) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 480.89157 529.46033 Tm +(WLPH) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 126.84 513.86041 Tm +(,QSXW) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 142.30049 513.86041 Tm +(SDUDPHWHU) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 172.633 513.86041 Tm +(LQGH[) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 188.27499 513.86041 Tm +(SDJH) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 179.36517 498.26059 Tm +(,QGH[) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 195.45267 498.26059 Tm +(SDJH) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 209.83517 498.26059 Tm +() Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 214.41118 498.26059 Tm +(PHDQV) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 233.20468 498.26059 Tm +(UHDGLQJ) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 254.67668 498.26059 Tm +() Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 257.82269 498.26059 Tm +<0590> Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 263.32269 498.26059 Tm +() Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 274.1907 498.26059 Tm +(ILQJHUSULQW) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 303.54419 498.26059 Tm +(WHPSODWH) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 328.17868 498.26059 Tm +(LQGH[) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 343.82068 498.26059 Tm +(WDEOH) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 358.22519 498.26059 Tm +(LQGH[) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 373.86719 498.26059 Tm +(SDJH) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 179.3159 482.66074 Tm +() Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 183.89191 482.66074 Tm +(PHDQV) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 202.68541 482.66074 Tm +(UHDGLQJ) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 224.15741 482.66074 Tm +() Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 233.59541 482.66074 Tm +<0590> Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 239.09541 482.66074 Tm +() Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 249.96341 482.66074 Tm +(ILQJHUSULQW) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 279.31689 482.66074 Tm +(WHPSODWH) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 303.95139 482.66074 Tm +(LQGH[) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 319.59338 482.66074 Tm +(WDEOH) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 333.99789 482.66074 Tm +(LQGH[) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 349.63989 482.66074 Tm +(SDJH) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 364.0224 482.66074 Tm +() Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 368.59839 482.66074 Tm +(PHDQV) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 179.2791 467.06091 Tm +(UHDGLQJ) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 200.7511 467.06091 Tm +() Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 210.1891 467.06091 Tm +<0590> Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 215.6891 467.06091 Tm +() Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 226.5571 467.06091 Tm +(ILQJHUSULQW) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 255.9106 467.06091 Tm +(WHPSODWH) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 280.5451 467.06091 Tm +(LQGH[) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 296.1871 467.06091 Tm +(WDEOH) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 310.59161 467.06091 Tm +(LQGH[) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 326.23361 467.06091 Tm +(SDJH) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 340.61612 467.06091 Tm +() Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 345.19211 467.06091 Tm +(PHDQV) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 363.9856 467.06091 Tm +(UHDGLQJ) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 179.2791 451.46106 Tm +() Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 188.7171 451.46106 Tm +<0590> Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 194.2171 451.46106 Tm +() Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 208.23111 451.46106 Tm +(ILQJHUSULQW) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 237.58461 451.46106 Tm +(WHPSODWH) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 262.21912 451.46106 Tm +(,QGH[) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 278.30661 451.46106 Tm +(WDEOH) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 292.71112 451.46106 Tm +(UHWXUQ) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 310.56961 451.46106 Tm +(SDUDPHWHUV) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 343.53662 451.46106 Tm +(FRQILUPDWLRQ) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 126.8389 435.86121 Tm +(ZRUG) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 141.57339 435.86121 Tm +() Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 146.1494 435.86121 Tm +(ILQJHUSULQW) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 175.5029 435.86121 Tm +(WHPSODWH) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 200.13741 435.86121 Tm +(LQGH[) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 215.7794 435.86121 Tm +(WDEOH) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 126.8389 420.26141 Tm +(&RPPDQG) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 162.9659 420.26141 Tm +(FRGH) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 182.5099 420.26141 Tm +([I) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 87.8388 404.6615 Tm +(,QVWUXFWLRQ) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 114.88879 404.6615 Tm +(SDFNHW) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 131.76379 404.6615 Tm +(IRUPDW) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 96.2986 388.58179 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 104.6186 388.58179 Tm +(E\\WHV) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 160.8589 388.58179 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 169.17889 388.58179 Tm +(E\\WHV) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 228.05881 388.58179 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 236.37881 388.58179 Tm +(E\\WH) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 289.9794 388.58179 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 298.29941 388.58179 Tm +(E\\WHV) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 357.11938 388.58179 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 365.43939 388.58179 Tm +(E\\WH) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 421.68069 388.58179 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 430.0007 388.58179 Tm +(E\\WH) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 483.6611 388.58179 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 491.98111 388.58179 Tm +(E\\WHV) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 104.22 372.50031 Tm +(%DRWRX) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 158.2803 372.50031 Tm +(&KLS) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 173.76981 372.50031 Tm +(DGGUHVV) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 228.0602 372.50031 Tm +(3DFNDJH) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 251.0502 372.50031 Tm +(,') Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 292.62051 372.50031 Tm +(SDFNDJH) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 309.38052 372.50031 Tm +(OHQJWK) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 357.12091 372.50031 Tm +(VFULSW) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 421.68121 372.50031 Tm +(LQGH[) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 438.74521 372.50031 Tm +(SDJH) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 486.3013 372.50031 Tm +(FKHFNVXP) Tj +ET +BT +/F5 9.5 Tf +0 0 0 rg +1 0 0 1 98.94 356.42029 Tm +([HI) Tj +ET +BT +/F5 10.5 Tf +0 0 0 rg +1 0 0 1 168.72079 356.42029 Tm +(;;;;) Tj +ET +BT +/F5 10.5 Tf +0 0 0 rg +1 0 0 1 233.2822 356.42029 Tm +([) Tj +ET +BT +/F5 9 Tf +0 0 0 rg +1 0 0 1 292.6228 356.42029 Tm +([) Tj +ET +BT +/F5 10.5 Tf +0 0 0 rg +1 0 0 1 362.34381 356.42029 Tm +([I) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 419.0448 356.42029 Tm +() Tj +ET +BT +/F5 10.5 Tf +0 0 0 rg +1 0 0 1 494.16489 356.42029 Tm +(6XP) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 87.84 340.2803 Tm +(5HVSRQVH) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 111.87 340.2803 Tm +(SDFNHW) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 128.745 340.2803 Tm +(IRUPDW) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 96.2999 324.20056 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 104.6199 324.20056 Tm +(E\\WHV) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 160.86011 324.20056 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 169.18011 324.20056 Tm +(E\\WHV) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 228.06 324.20056 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 236.38 324.20056 Tm +(E\\WH) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 289.9805 324.20056 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 298.30051 324.20056 Tm +(E\\WHV) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 357.12061 324.20056 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 365.44061 324.20056 Tm +(E\\WH) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 416.40149 324.20056 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 430.4415 324.20056 Tm +(E\\WHV) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 483.66229 324.20056 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 491.9823 324.20056 Tm +(E\\WHV) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 104.22 308.12036 Tm +(%DRWRX) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 158.2803 308.12036 Tm +(&KLS) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 173.76981 308.12036 Tm +(DGGUHVV) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 228.0602 308.12036 Tm +(3DFNDJH) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 251.0502 308.12036 Tm +(,') Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 292.62051 308.12036 Tm +(SDFNDJH) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 309.38052 308.12036 Tm +(OHQJWK) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 357.12091 308.12036 Tm +(FRQILUPDWLRQ) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 382.38492 308.12036 Tm +(FRGH) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 421.68121 308.12036 Tm +(GLUHFWLRQ) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 441.62521 308.12036 Tm +(FKDUW) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 486.3013 308.12036 Tm +(FKHFNVXP) Tj +ET +BT +/F5 9.5 Tf +0 0 0 rg +1 0 0 1 98.94 291.98029 Tm +([HI) Tj +ET +BT +/F5 10.5 Tf +0 0 0 rg +1 0 0 1 168.7542 291.98029 Tm +(;;;;) Tj +ET +BT +/F5 10.5 Tf +0 0 0 rg +1 0 0 1 233.3174 291.98029 Tm +([) Tj +ET +BT +/F5 9 Tf +0 0 0 rg +1 0 0 1 292.61981 291.98029 Tm +([) Tj +ET +BT +/F5 10.5 Tf +0 0 0 rg +1 0 0 1 370.26929 291.98029 Tm +(;) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 411.17099 291.98029 Tm +(7KH) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 419.16299 291.98029 Tm +(VWUXFWXUH) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 437.431 291.98029 Tm +(LV) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 441.41901 291.98029 Tm +(VKRZQ) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 454.883 291.98029 Tm +(LQ) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 459.427 291.98029 Tm +(WKH) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 466.63901 291.98029 Tm +(WDEOH) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 477.11502 291.98029 Tm +(EHORZ) Tj +ET +BT +/F5 10.5 Tf +0 0 0 rg +1 0 0 1 494.20911 291.98029 Tm +(6XP) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 132.78 275.90027 Tm +(1RWH) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 146.87 275.90027 Tm +() Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 152.37 275.90027 Tm +(&RQILUPDWLRQ) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 184.70999 275.90027 Tm +(FRGH) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 197.32999 275.90027 Tm +( ) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 201.48999 275.90027 Tm +([) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 214.01498 275.90027 Tm +(PHDQV) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 231.09999 275.90027 Tm +(UHDGLQJ) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 250.62 275.90027 Tm +(WKH) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 259.63501 275.90027 Tm +(LQGH[) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 273.85501 275.90027 Tm +(WDEOH) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 286.95001 275.90027 Tm +(VXFFHVVIXOO\\) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 169.5605 260.30042 Tm +(&RQILUPDWLRQ) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 195.4325 260.30042 Tm +(FRGH [) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 216.79649 260.30042 Tm +(PHDQV) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 230.46449 260.30042 Tm +(WKHUH) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 241.58449 260.30042 Tm +(LV) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 245.57249 260.30042 Tm +(DQ) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 251.32849 260.30042 Tm +(HUURU) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 262.00049 260.30042 Tm +(LQ) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 266.54449 260.30042 Tm +(UHFHLYLQJ) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 284.6965 260.30042 Tm +(WKH) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 291.90851 260.30042 Tm +(SDFNDJH) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 153.78 244.70062 Tm +() Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 160.38 244.70062 Tm +($W) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 167.94 244.70062 Tm +(PRVW) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 183.78 244.70062 Tm +() Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 195.636 244.70062 Tm +(ILQJHUSULQW) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 227.658 244.70062 Tm +(WHPSODWH) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 254.53201 244.70062 Tm +(LQGH[) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 271.59601 244.70062 Tm +(GDWD) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 285.74402 244.70062 Tm +(DUH) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 296.53201 244.70062 Tm +(UHDG) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 311.01001 244.70062 Tm +(HDFK) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 325.90802 244.70062 Tm +(WLPH) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 341.78403 244.70062 Tm +(DQG) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 354.10803 244.70062 Tm +<02090013020A0003> Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 363.40802 244.70062 Tm +(LV) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 369.39001 244.70062 Tm +(DGGHG) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 388.77002 244.70062 Tm +(LI) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 393.94202 244.70062 Tm +(WKH) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 404.76001 244.70062 Tm +(GDWD) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 418.90802 244.70062 Tm +(LV) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 424.89001 244.70062 Tm +(OHVV) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 437.13 244.70062 Tm +(WKDQ) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 451.638 244.70062 Tm +() Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 463.49399 244.70062 Tm +(ELWV) Tj +ET +BT +/F5 10.5 Tf +0 0 0 rg +1 0 0 1 473.9985 244.70062 Tm +() Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 153.78421 229.10083 Tm +() Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 159.83421 229.10083 Tm +(,QGH[) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 175.92171 229.10083 Tm +(WDEOH) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 190.3262 229.10083 Tm +(GDWD) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 203.2952 229.10083 Tm +(VWUXFWXUH) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 229.8877 229.10083 Tm +(HYHU\\) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 245.3922 229.10083 Tm +() Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 249.9682 229.10083 Tm +(ELWV) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 260.8197 229.10083 Tm +(LV) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 266.30319 229.10083 Tm +(D) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 270.8187 229.10083 Tm +(JURXS) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 289.48569 229.10083 Tm +(DQG) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 300.78268 229.10083 Tm +(HDFK) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 314.43918 229.10083 Tm +(JURXS) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 331.63217 229.10083 Tm +(VWDUWV) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 347.65918 229.10083 Tm +(WR) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 354.40219 229.10083 Tm +(RXWSXW) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 373.31119 229.10083 Tm +(IURP) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 387.37469 229.10083 Tm +(WKH) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 397.2912 229.10083 Tm +(KLJK) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 410.32071 229.10083 Tm +(ELW) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 420.01172 229.10083 Tm +(6HH) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 430.66522 229.10083 Tm +(WKH) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 440.58173 229.10083 Tm +(WDEOH) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 454.98624 229.10083 Tm +(EHORZ) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 471.97025 229.10083 Tm +(IRU) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 480.89124 229.10083 Tm +(GHWDLOV) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 102.8403 213.02112 Tm +(7UDQVPLVVLRQ) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 132.1758 213.02112 Tm +(RUGHU) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 170.6398 213.02112 Tm +(7KH) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 182.62781 213.02112 Tm +(VHTXHQFH) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 211.19981 213.02112 Tm +(LV) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 217.18181 213.02112 Tm +(RXWSXW) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 237.80981 213.02112 Tm +(IURP) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 253.15181 213.02112 Tm +(ORZ) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 264.6058 213.02112 Tm +(E\\WH) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 278.46579 213.02112 Tm +(WR) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 285.82178 213.02112 Tm +(KLJK) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 300.03577 213.02112 Tm +(E\\WH) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 315.50375 213.02112 Tm +(DQG) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 327.82776 213.02112 Tm +(HDFK) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 342.72577 213.02112 Tm +(E\\WH) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 356.58575 213.02112 Tm +(LV) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 362.56775 213.02112 Tm +(RXWSXW) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 383.19574 213.02112 Tm +(IURP) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 398.53775 213.02112 Tm +(KLJK) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 412.75174 213.02112 Tm +(E\\WH) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 113.34 196.88031 Tm +(ORZHVW) Tj +ET +BT +/F5 8 Tf +0 0 0 rg +1 0 0 1 102.84 181.28052 Tm +(YDOLG) Tj +ET +BT +/F5 8 Tf +0 0 0 rg +1 0 0 1 122.52 181.28052 Tm +(E\\WHV) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 196.14 196.88031 Tm +(7HPSODWH) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 214.836 196.88031 Tm +(QXPEHU) Tj +ET +BT +/F5 10.5 Tf +0 0 0 rg +1 0 0 1 273.35999 196.88031 Tm +() Tj +ET +BT +/F5 10.5 Tf +0 0 0 rg +1 0 0 1 308.28 196.88031 Tm +() Tj +ET +BT +/F5 10.5 Tf +0 0 0 rg +1 0 0 1 343.14001 196.88031 Tm +() Tj +ET +BT +/F5 10.5 Tf +0 0 0 rg +1 0 0 1 378.06 196.88031 Tm +() Tj +ET +BT +/F5 10.5 Tf +0 0 0 rg +1 0 0 1 413.04001 196.88031 Tm +() Tj +ET +BT +/F5 10.5 Tf +0 0 0 rg +1 0 0 1 447.89999 196.88031 Tm +() Tj +ET +BT +/F5 10.5 Tf +0 0 0 rg +1 0 0 1 482.82001 196.88031 Tm +() Tj +ET +BT +/F5 10.5 Tf +0 0 0 rg +1 0 0 1 517.73999 196.88031 Tm +() Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 175.1398 180.8006 Tm +(7HPSODWH) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 200.8468 180.8006 Tm +(LQGH[) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 216.4888 180.8006 Tm +(WDEOH) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 230.8933 180.8006 Tm +(GDWD) Tj +ET +BT +/F5 10.5 Tf +0 0 0 rg +1 0 0 1 268.15359 180.8006 Tm +() Tj +ET +BT +/F5 10.5 Tf +0 0 0 rg +1 0 0 1 303.0759 180.8006 Tm +() Tj +ET +BT +/F5 10.5 Tf +0 0 0 rg +1 0 0 1 337.93719 180.8006 Tm +() Tj +ET +BT +/F5 10.5 Tf +0 0 0 rg +1 0 0 1 372.8595 180.8006 Tm +() Tj +ET +BT +/F5 10.5 Tf +0 0 0 rg +1 0 0 1 407.76001 180.8006 Tm +() Tj +ET +BT +/F5 10.5 Tf +0 0 0 rg +1 0 0 1 442.6366 180.8006 Tm +() Tj +ET +BT +/F5 10.5 Tf +0 0 0 rg +1 0 0 1 477.5741 180.8006 Tm +() Tj +ET +BT +/F5 10.5 Tf +0 0 0 rg +1 0 0 1 512.5116 180.8006 Tm +() Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 113.34 164.72034 Tm +(ORZHU) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 126.327 164.72034 Tm +(WZR) Tj +ET +BT +/F5 8 Tf +0 0 0 rg +1 0 0 1 102.84 149.12048 Tm +(YDOLG) Tj +ET +BT +/F5 8 Tf +0 0 0 rg +1 0 0 1 122.52 149.12048 Tm +(E\\WHV) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 196.14 164.72034 Tm +(7HPSODWH) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 214.836 164.72034 Tm +(QXPEHU) Tj +ET +BT +/F5 10.5 Tf +0 0 0 rg +1 0 0 1 270.72 164.72034 Tm +() Tj +ET +BT +/F5 10.5 Tf +0 0 0 rg +1 0 0 1 305.64001 164.72034 Tm +() Tj +ET +BT +/F5 10.5 Tf +0 0 0 rg +1 0 0 1 340.5 164.72034 Tm +() Tj +ET +BT +/F5 10.5 Tf +0 0 0 rg +1 0 0 1 375.42001 164.72034 Tm +() Tj +ET +BT +/F5 10.5 Tf +0 0 0 rg +1 0 0 1 410.39999 164.72034 Tm +() Tj +ET +BT +/F5 10.5 Tf +0 0 0 rg +1 0 0 1 445.26001 164.72034 Tm +() Tj +ET +BT +/F5 10.5 Tf +0 0 0 rg +1 0 0 1 482.82001 164.72034 Tm +() Tj +ET +BT +/F5 10.5 Tf +0 0 0 rg +1 0 0 1 517.73999 164.72034 Tm +() Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 175.1398 148.58069 Tm +(7HPSODWH) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 200.8468 148.58069 Tm +(LQGH[) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 216.4888 148.58069 Tm +(WDEOH) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 230.8933 148.58069 Tm +(GDWD) Tj +ET +BT +/F5 10.5 Tf +0 0 0 rg +1 0 0 1 268.15359 148.58069 Tm +() Tj +ET +BT +/F5 10.5 Tf +0 0 0 rg +1 0 0 1 303.0759 148.58069 Tm +() Tj +ET +BT +/F5 10.5 Tf +0 0 0 rg +1 0 0 1 337.93719 148.58069 Tm +() Tj +ET +BT +/F5 10.5 Tf +0 0 0 rg +1 0 0 1 372.8595 148.58069 Tm +() Tj +ET +BT +/F5 10.5 Tf +0 0 0 rg +1 0 0 1 407.76001 148.58069 Tm +() Tj +ET +BT +/F5 10.5 Tf +0 0 0 rg +1 0 0 1 442.6366 148.58069 Tm +() Tj +ET +BT +/F5 10.5 Tf +0 0 0 rg +1 0 0 1 477.5741 148.58069 Tm +() Tj +ET +BT +/F5 10.5 Tf +0 0 0 rg +1 0 0 1 512.5116 148.58069 Tm +() Tj +ET +BT +/F5 10.5 Tf +0 0 0 rg +1 0 0 1 118.56 132.50031 Tm +() Tj +ET +BT +/F5 10.5 Tf +0 0 0 rg +1 0 0 1 206.6403 132.50031 Tm +() Tj +ET +BT +/F5 10.5 Tf +0 0 0 rg +1 0 0 1 392.9408 132.50031 Tm +() Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 113.34 116.42029 Tm +(+LJKHVW) Tj +ET +BT +/F5 8 Tf +0 0 0 rg +1 0 0 1 102.84 100.82037 Tm +(YDOLG) Tj +ET +BT +/F5 8 Tf +0 0 0 rg +1 0 0 1 122.52 100.82037 Tm +(E\\WHV) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 196.14 116.42029 Tm +(7HPSODWH) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 214.836 116.42029 Tm +(QXPEHU) Tj +ET +BT +/F5 10.5 Tf +0 0 0 rg +1 0 0 1 268.07999 116.42029 Tm +() Tj +ET +BT +/F5 10.5 Tf +0 0 0 rg +1 0 0 1 303 116.42029 Tm +() Tj +ET +BT +/F5 10.5 Tf +0 0 0 rg +1 0 0 1 337.85999 116.42029 Tm +() Tj +ET +BT +/F5 10.5 Tf +0 0 0 rg +1 0 0 1 372.78 116.42029 Tm +() Tj +ET +BT +/F5 10.5 Tf +0 0 0 rg +1 0 0 1 407.76001 116.42029 Tm +() Tj +ET +BT +/F5 10.5 Tf +0 0 0 rg +1 0 0 1 442.62 116.42029 Tm +() Tj +ET +BT +/F5 10.5 Tf +0 0 0 rg +1 0 0 1 477.54001 116.42029 Tm +() Tj +ET +BT +/F5 10.5 Tf +0 0 0 rg +1 0 0 1 512.46002 116.42029 Tm +() Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 175.1398 100.2807 Tm +(7HPSODWH) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 200.8468 100.2807 Tm +(LQGH[) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 216.4888 100.2807 Tm +(WDEOH) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 230.8933 100.2807 Tm +(GDWD) Tj +ET +BT +/F5 10.5 Tf +0 0 0 rg +1 0 0 1 268.15359 100.2807 Tm +() Tj +ET +BT +/F5 10.5 Tf +0 0 0 rg +1 0 0 1 303.0759 100.2807 Tm +() Tj +ET +BT +/F5 10.5 Tf +0 0 0 rg +1 0 0 1 337.93719 100.2807 Tm +() Tj +ET +BT +/F5 10.5 Tf +0 0 0 rg +1 0 0 1 372.8595 100.2807 Tm +() Tj +ET +BT +/F5 10.5 Tf +0 0 0 rg +1 0 0 1 407.76001 100.2807 Tm +() Tj +ET +BT +/F5 10.5 Tf +0 0 0 rg +1 0 0 1 442.6366 100.2807 Tm +() Tj +ET +BT +/F5 10.5 Tf +0 0 0 rg +1 0 0 1 477.5741 100.2807 Tm +() Tj +ET +BT +/F5 10.5 Tf +0 0 0 rg +1 0 0 1 512.5116 100.2807 Tm +() Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 87.84 84.20032 Tm +(1RWH) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 100.521 84.20032 Tm +(7KH) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 109.51199 84.20032 Tm +(LQGH[) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 122.31 84.20032 Tm +(WDEOH) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 134.09549 84.20032 Tm +(GDWD) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 144.70648 84.20032 Tm +() Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 152.12248 84.20032 Tm +(PHDQV) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 167.49898 84.20032 Tm +(WKDW) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 177.22348 84.20032 Tm +(WKHUH) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 189.73347 84.20032 Tm +(LV) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 194.21997 84.20032 Tm +(QR) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 200.89346 84.20032 Tm +(YDOLG) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 211.96347 84.20032 Tm +(WHPSODWH) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 232.11897 84.20032 Tm +(LQ) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 237.23097 84.20032 Tm +(WKH) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 245.34447 84.20032 Tm +(FRUUHVSRQGLQJ) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 277.55548 84.20032 Tm +(SRVLWLRQ) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 308.27698 84.20032 Tm +() Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 315.69296 84.20032 Tm +(PHDQV) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 331.06946 84.20032 Tm +(WKDW) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 340.79395 84.20032 Tm +(WKHUH) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 353.30396 84.20032 Tm +(LV) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 357.79047 84.20032 Tm +(D) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 361.48495 84.20032 Tm +(YDOLG) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 372.55496 84.20032 Tm +(WHPSODWH) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 392.71045 84.20032 Tm +(LQ) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 397.82245 84.20032 Tm +(WKH) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 405.93594 84.20032 Tm +(FRUUHVSRQGLQJ) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 438.14694 84.20032 Tm +(SRVLWLRQ) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 267.95999 45.86041 Tm +(WKH) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 277.8765 45.86041 Tm +(ILUVW) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 289.509 45.86041 Tm +() Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 297.23102 45.86041 Tm +(SDJHV) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 314.24802 45.86041 Tm +(RI) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 320.89752 45.86041 Tm +() Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 328.61951 45.86041 Tm +(3DJH) Tj +ET + +endstream +endobj +920 0 obj +<< +/Length 2 +>> +stream +q + +endstream +endobj +921 0 obj +<< +/Length 2229 +/Filter /FlateDecode +>> +stream +xZي[G}W`q$!z3& ‗NJSGRNt~{՝oo^çF}OѣO)DJڠ`r1'|RCQTEVTt+tb^7e/ +?& +F~[o{ ﳴ-.{$c1dp.J`hė7tyt-PdnŸ́bLA3;{ooi\ɞIVU4FsKXK@E۱A˵m NGBMrq{ ]q+Vjq.̞Spv:K0?^ty|xv !k>MIS\k/E,rנmud"s'0L& ԧ&GS~K|ݍ`*:ZL`DN"olqqsC=q*6H'DV`chUL9` 4fWr'2L] +^Ɩ @8`n.ːjSiX&[J#pYqg,6F0&VN8uPBX$&RĂ_ĵ!R_vPK-3,g"DˬSHiISM#@VŒJ&eA$M‹6+j33lZG`S乹xMgtllHMxr+)K ǒ,-NKcrSYRuа0uHxM#h$M˜JspgLyn{Ch8'us puSzEdZ=Da[4Њ1uYifR)0k8"5ؕa4kъ粣9\'W`Ĺ&%/∦хm4]KjUG`SYΦVZ#n Y.Kwp؉`M休n%݆֕"\& W iaK ?-lN [3?$)\W5lƷun]`,<.&Z(ET\{@:Z=DhiFZ(krMB1 wRSt!9 l.r6lT҄ɦSMaO%qF) N&N\:^Sz؅ᦌf#G]2r-JPWCetEeK6fTKHI7zd8[+tJcQ/PNq}Z݇9>Om}?#ʼn:~OQ:VyP>cx~7XƵ0xG6?U8谳J'm~k,3>*?ONNxerB)&U>֨};7-F9Vy1)#v6O`g)kBٶF`F~)e!/AӃƍ +=m_n+<*Afz8ؤF~ ^$+$஽ :yEh-Psޢ]zj6wC-*s A"f U3Jiac崰nFX`~GP[Ĺnlo ƪq4G`s>$txE#EH2渴{.-Hµ8/m'ĩs`S9qi ڨ &|p6|[|rkܱ~քi2 h&Qj0 é`TkfK4aքa!E& [Q};U$t11 GimaHsӰmgaXscN.jt¥΃8+Bsl1-aYZ؂c9hcqRB2\'`XSdn_XSIa_X%UELݢZZ4Ek֢(Vgk:jl^EYŠQ<O1 +endstream +endobj +922 0 obj +<< +/Length 31486 +>> +stream +Q +1 0 0 1 0 0 cm +BT +/F6 7.5 Tf +0 0 0 rg +1 0 0 1 377.35162 781.10431 Tm +(+DQJ]KRX) Tj +ET +BT +/F6 7.5 Tf +0 0 0 rg +1 0 0 1 415.64661 781.10431 Tm +(=KLDQ) Tj +ET +BT +/F6 7.5 Tf +0 0 0 rg +1 0 0 1 437.2991 781.10431 Tm +(7HFKQRORJ\\) Tj +ET +BT +/F6 7.5 Tf +0 0 0 rg +1 0 0 1 479.96661 781.10431 Tm +(&R) Tj +ET +BT +/F6 7.5 Tf +0 0 0 rg +1 0 0 1 495.21411 781.10431 Tm +(/WG) Tj +ET +BT +/F7 7 Tf +0 0 0 rg +1 0 0 1 87.8397 734.66083 Tm +() Tj +ET +BT +/F6 7 Tf +0 0 0 rg +1 0 0 1 96.4077 734.66083 Tm +(,QVWUXFWLRQ) Tj +ET +BT +/F6 7 Tf +0 0 0 rg +1 0 0 1 134.27769 734.66083 Tm +(SDFNHW) Tj +ET +BT +/F6 7 Tf +0 0 0 rg +1 0 0 1 157.90269 734.66083 Tm +(FKHFNVXP) Tj +ET +BT +/F6 7 Tf +0 0 0 rg +1 0 0 1 192.6787 734.66083 Tm +( ) Tj +ET +BT +/F6 7 Tf +0 0 0 rg +1 0 0 1 194.7787 734.66083 Tm +() Tj +ET +BT +/F6 7 Tf +0 0 0 rg +1 0 0 1 200.60271 734.66083 Tm +(E\\WHV ) Tj +ET +BT +/F6 7 Tf +0 0 0 rg +1 0 0 1 224.4097 734.66083 Tm +(3DFNDJH) Tj +ET +BT +/F6 7 Tf +0 0 0 rg +1 0 0 1 253.66969 734.66083 Tm +(,') Tj +ET +BT +/F6 7 Tf +0 0 0 rg +1 0 0 1 262.97269 734.66083 Tm +( ) Tj +ET +BT +/F6 7 Tf +0 0 0 rg +1 0 0 1 265.07269 734.66083 Tm +() Tj +ET +BT +/F6 7 Tf +0 0 0 rg +1 0 0 1 270.8967 734.66083 Tm +(E\\WH ) Tj +ET +BT +/F6 7 Tf +0 0 0 rg +1 0 0 1 287.34671 734.66083 Tm +() Tj +ET +BT +/F6 7 Tf +0 0 0 rg +1 0 0 1 291.35071 734.66083 Tm +(3DFNHW) Tj +ET +BT +/F6 7 Tf +0 0 0 rg +1 0 0 1 314.9057 734.66083 Tm +(OHQJWK) Tj +ET +BT +/F6 7 Tf +0 0 0 rg +1 0 0 1 337.96368 734.66083 Tm +( ) Tj +ET +BT +/F6 7 Tf +0 0 0 rg +1 0 0 1 340.06369 734.66083 Tm +() Tj +ET +BT +/F6 7 Tf +0 0 0 rg +1 0 0 1 345.8877 734.66083 Tm +(E\\WHV ) Tj +ET +BT +/F6 7 Tf +0 0 0 rg +1 0 0 1 365.6907 734.66083 Tm +() Tj +ET +BT +/F6 7 Tf +0 0 0 rg +1 0 0 1 369.6947 734.66083 Tm +(VFULSW) Tj +ET +BT +/F6 7 Tf +0 0 0 rg +1 0 0 1 389.75671 734.66083 Tm +( ) Tj +ET +BT +/F6 7 Tf +0 0 0 rg +1 0 0 1 391.85672 734.66083 Tm +() Tj +ET +BT +/F6 7 Tf +0 0 0 rg +1 0 0 1 397.68073 734.66083 Tm +(E\\WH ) Tj +ET +BT +/F6 7 Tf +0 0 0 rg +1 0 0 1 414.13074 734.66083 Tm +() Tj +ET +BT +/F6 7 Tf +0 0 0 rg +1 0 0 1 418.13474 734.66083 Tm +(LQGH[) Tj +ET +BT +/F6 7 Tf +0 0 0 rg +1 0 0 1 438.04272 734.66083 Tm +(SDJH) Tj +ET +BT +/F6 7 Tf +0 0 0 rg +1 0 0 1 456.34772 734.66083 Tm +( ) Tj +ET +BT +/F6 7 Tf +0 0 0 rg +1 0 0 1 458.44772 734.66083 Tm +() Tj +ET +BT +/F6 7 Tf +0 0 0 rg +1 0 0 1 464.27173 734.66083 Tm +(E\\WH ) Tj +ET +BT +/F6 7 Tf +0 0 0 rg +1 0 0 1 480.72174 734.66083 Tm +() Tj +ET +BT +/F7 6.5 Tf +0 0 0 rg +1 0 0 1 87.8407 719.06091 Tm +() Tj +ET +BT +/F6 6.5 Tf +0 0 0 rg +1 0 0 1 95.7967 719.06091 Tm +($QVZHU) Tj +ET +BT +/F6 6.5 Tf +0 0 0 rg +1 0 0 1 120.2302 719.06091 Tm +(SDFNHW) Tj +ET +BT +/F6 6.5 Tf +0 0 0 rg +1 0 0 1 142.16769 719.06091 Tm +(FKHFNVXP) Tj +ET +BT +/F6 6.5 Tf +0 0 0 rg +1 0 0 1 174.45969 719.06091 Tm +( ) Tj +ET +BT +/F6 6.5 Tf +0 0 0 rg +1 0 0 1 176.40968 719.06091 Tm +() Tj +ET +BT +/F6 6.5 Tf +0 0 0 rg +1 0 0 1 181.81769 719.06091 Tm +(E\\WHV ) Tj +ET +BT +/F6 6.5 Tf +0 0 0 rg +1 0 0 1 203.92419 719.06091 Tm +(3DFNDJH) Tj +ET +BT +/F6 6.5 Tf +0 0 0 rg +1 0 0 1 231.09419 719.06091 Tm +(,') Tj +ET +BT +/F6 6.5 Tf +0 0 0 rg +1 0 0 1 239.7327 719.06091 Tm +( ) Tj +ET +BT +/F6 6.5 Tf +0 0 0 rg +1 0 0 1 241.68269 719.06091 Tm +() Tj +ET +BT +/F6 6.5 Tf +0 0 0 rg +1 0 0 1 247.0907 719.06091 Tm +(E\\WH ) Tj +ET +BT +/F6 6.5 Tf +0 0 0 rg +1 0 0 1 262.36569 719.06091 Tm +() Tj +ET +BT +/F6 6.5 Tf +0 0 0 rg +1 0 0 1 266.08368 719.06091 Tm +(3DFNHW) Tj +ET +BT +/F6 6.5 Tf +0 0 0 rg +1 0 0 1 287.95618 719.06091 Tm +(OHQJWK) Tj +ET +BT +/F6 6.5 Tf +0 0 0 rg +1 0 0 1 309.36719 719.06091 Tm +( ) Tj +ET +BT +/F6 6.5 Tf +0 0 0 rg +1 0 0 1 311.3172 719.06091 Tm +() Tj +ET +BT +/F6 6.5 Tf +0 0 0 rg +1 0 0 1 316.72519 719.06091 Tm +(E\\WHV ) Tj +ET +BT +/F6 6.5 Tf +0 0 0 rg +1 0 0 1 335.11368 719.06091 Tm +() Tj +ET +BT +/F6 6.5 Tf +0 0 0 rg +1 0 0 1 338.83167 719.06091 Tm +(FRQILUPDWLRQ) Tj +ET +BT +/F6 6.5 Tf +0 0 0 rg +1 0 0 1 379.88568 719.06091 Tm +(FRGH) Tj +ET +BT +/F6 6.5 Tf +0 0 0 rg +1 0 0 1 396.29169 719.06091 Tm +( ) Tj +ET +BT +/F6 6.5 Tf +0 0 0 rg +1 0 0 1 398.2417 719.06091 Tm +() Tj +ET +BT +/F6 6.5 Tf +0 0 0 rg +1 0 0 1 403.64969 719.06091 Tm +(E\\WH ) Tj +ET +BT +/F6 6.5 Tf +0 0 0 rg +1 0 0 1 418.92468 719.06091 Tm +() Tj +ET +BT +/F6 6.5 Tf +0 0 0 rg +1 0 0 1 422.64267 719.06091 Tm +(GLUHFWLRQ) Tj +ET +BT +/F6 6.5 Tf +0 0 0 rg +1 0 0 1 451.45068 719.06091 Tm +(FKDUW ) Tj +ET +BT +/F6 6.5 Tf +0 0 0 rg +1 0 0 1 469.21518 719.06091 Tm +(1) Tj +ET +BT +/F6 6.5 Tf +0 0 0 rg +1 0 0 1 475.84518 719.06091 Tm +(E\\WHV ) Tj +ET +BT +/F6 6.5 Tf +0 0 0 rg +1 0 0 1 494.23367 719.06091 Tm +() Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 87.8418 703.461 Tm +() Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 94.5738 703.461 Tm +(7KH) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 105.5628 703.461 Tm +(FKHFNVXP) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 132.8868 703.461 Tm +(LV) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 138.3703 703.461 Tm +(DGGHG) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 156.1353 703.461 Tm +(LQ) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 162.3833 703.461 Tm +(E\\WHV) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 179.19681 703.461 Tm +(WKH) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 189.11331 703.461 Tm +(FDUU\\) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 203.61681 703.461 Tm +(RYHU) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 216.54181 703.461 Tm +() Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 221.11781 703.461 Tm +(E\\WHV) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 236.45731 703.461 Tm +(LV) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 241.94081 703.461 Tm +(LJQRUHG) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 265.12881 703.461 Tm +(DQG) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 276.42581 703.461 Tm +(WKH) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 286.34232 703.461 Tm +(KLJK) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 299.37183 703.461 Tm +(E\\WH) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 312.07681 703.461 Tm +(FRPHV) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 330.3533 703.461 Tm +(ILUVW) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 341.98581 703.461 Tm +(ZKHQ) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 357.63879 703.461 Tm +(WUDQVPLWWLQJ) Tj +ET +BT +/F7 7.5 Tf +0 0 0 rg +1 0 0 1 87.8418 687.86121 Tm +() Tj +ET +BT +/F6 7.5 Tf +0 0 0 rg +1 0 0 1 97.0218 687.86121 Tm +(7KH) Tj +ET +BT +/F6 7.5 Tf +0 0 0 rg +1 0 0 1 112.0068 687.86121 Tm +(GHIDXOW) Tj +ET +BT +/F6 7.5 Tf +0 0 0 rg +1 0 0 1 138.8643 687.86121 Tm +(PRGXOH) Tj +ET +BT +/F6 7.5 Tf +0 0 0 rg +1 0 0 1 167.77681 687.86121 Tm +(DGGUHVV) Tj +ET +BT +/F6 7.5 Tf +0 0 0 rg +1 0 0 1 197.67181 687.86121 Tm +(LV) Tj +ET +BT +/F6 7.5 Tf +0 0 0 rg +1 0 0 1 205.14931 687.86121 Tm +() Tj +ET +BT +/F6 7.5 Tf +0 0 0 rg +1 0 0 1 208.2093 687.86121 Tm +([IIIIIIII) Tj +ET +BT +/F6 7.5 Tf +0 0 0 rg +1 0 0 1 240.16681 687.86121 Tm +() Tj +ET +BT +/F6 7.5 Tf +0 0 0 rg +1 0 0 1 244.12682 687.86121 Tm +(GHIDXOW) Tj +ET +BT +/F6 7.5 Tf +0 0 0 rg +1 0 0 1 270.98431 687.86121 Tm +(SDVVZRUG) Tj +ET +BT +/F6 7.5 Tf +0 0 0 rg +1 0 0 1 307.08182 687.86121 Tm +(LV) Tj +ET +BT +/F6 7.5 Tf +0 0 0 rg +1 0 0 1 314.55933 687.86121 Tm +() Tj +ET +BT +/F6 7.5 Tf +0 0 0 rg +1 0 0 1 317.61932 687.86121 Tm +<0013005B00130013001300130013001300130013020A> Tj +ET +BT +/F6 7.5 Tf +0 0 0 rg +1 0 0 1 362.88931 687.86121 Tm +() Tj +ET +BT +/F8 6.5 Tf +0 0 0 rg +1 0 0 1 87.84 657.7403 Tm +() Tj +ET +BT +/F8 6.5 Tf +0 0 0 rg +1 0 0 1 91.558 657.7403 Tm +( ) Tj +ET +BT +/F8 6.5 Tf +0 0 0 rg +1 0 0 1 95.4515 657.7403 Tm +(UHDG) Tj +ET +BT +/F8 6.5 Tf +0 0 0 rg +1 0 0 1 111.9745 657.7403 Tm +(WKH) Tj +ET +BT +/F8 6.5 Tf +0 0 0 rg +1 0 0 1 124.5975 657.7403 Tm +(QXPEHU) Tj +ET +BT +/F8 6.5 Tf +0 0 0 rg +1 0 0 1 152.1185 657.7403 Tm +(RI) Tj +ET +BT +/F8 6.5 Tf +0 0 0 rg +1 0 0 1 160.3475 657.7403 Tm +(YDOLG) Tj +ET +BT +/F8 6.5 Tf +0 0 0 rg +1 0 0 1 177.7415 657.7403 Tm +(WHPSODWHV) Tj +ET +BT +/F8 6.5 Tf +0 0 0 rg +1 0 0 1 212.39301 657.7403 Tm +(7HPSOHWH1XP) Tj +ET +BT +/F6 5 Tf +0 0 0 rg +1 0 0 1 124.62 628.16028 Tm +(\)XQFWLRQ) Tj +ET +BT +/F6 5 Tf +0 0 0 rg +1 0 0 1 146.30501 628.16028 Tm +(GHVFULSWLRQ) Tj +ET +BT +/F6 5 Tf +0 0 0 rg +1 0 0 1 175.27501 628.16028 Tm +(5HDG) Tj +ET +BT +/F6 5 Tf +0 0 0 rg +1 0 0 1 188.38501 628.16028 Tm +(WKH) Tj +ET +BT +/F6 5 Tf +0 0 0 rg +1 0 0 1 197.40001 628.16028 Tm +(QXPEHU) Tj +ET +BT +/F6 5 Tf +0 0 0 rg +1 0 0 1 217.51501 628.16028 Tm +(RI) Tj +ET +BT +/F6 5 Tf +0 0 0 rg +1 0 0 1 223.56001 628.16028 Tm +(ILQJHUSULQW) Tj +ET +BT +/F6 5 Tf +0 0 0 rg +1 0 0 1 250.24501 628.16028 Tm +(WHPSODWHV) Tj +ET +BT +/F6 5 Tf +0 0 0 rg +1 0 0 1 275.035 628.16028 Tm +(VWRUHG) Tj +ET +BT +/F6 5 Tf +0 0 0 rg +1 0 0 1 291.52002 628.16028 Tm +(LQ) Tj +ET +BT +/F6 5 Tf +0 0 0 rg +1 0 0 1 297.20001 628.16028 Tm +(WKH) Tj +ET +BT +/F6 5 Tf +0 0 0 rg +1 0 0 1 306.21503 628.16028 Tm +(PRGXOH) Tj +ET +BT +/F6 6.5 Tf +0 0 0 rg +1 0 0 1 124.62 612.56049 Tm +(,QSXW) Tj +ET +BT +/F6 6.5 Tf +0 0 0 rg +1 0 0 1 142.89151 612.56049 Tm +(SDUDPHWHU) Tj +ET +BT +/F6 6.5 Tf +0 0 0 rg +1 0 0 1 178.73901 612.56049 Tm +(QRQH) Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 124.62 596.96057 Tm +(5HWXUQ) Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 145.356 596.96057 Tm +(SDUDPHWHU) Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 178.446 596.96057 Tm +(FRQILUPDWLRQ) Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 216.342 596.96057 Tm +(ZRUG) Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 232.416 596.96057 Tm +() Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 237.408 596.96057 Tm +(WHPSODWH) Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 124.62 581.36072 Tm +(QXPEHU) Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 148.758 581.36072 Tm +(1) Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 154.87799 581.36072 Tm +(&RPPDQG) Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 185.84399 581.36072 Tm +(FRGH) Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 202.59599 581.36072 Tm +([G) Tj +ET +BT +/F6 5 Tf +0 0 0 rg +1 0 0 1 87.8396 565.76093 Tm +(,QVWUXFWLRQ) Tj +ET +BT +/F6 5 Tf +0 0 0 rg +1 0 0 1 114.8896 565.76093 Tm +(SDFNHW) Tj +ET +BT +/F6 5 Tf +0 0 0 rg +1 0 0 1 131.7646 565.76093 Tm +(IRUPDW) Tj +ET +BT +/F6 10 Tf +0 0 0 rg +1 0 0 1 96.2994 549.68121 Tm +() Tj +ET +BT +/F6 10 Tf +0 0 0 rg +1 0 0 1 104.6194 549.68121 Tm +(E\\WHV) Tj +ET +BT +/F6 10 Tf +0 0 0 rg +1 0 0 1 160.8596 549.68121 Tm +() Tj +ET +BT +/F6 10 Tf +0 0 0 rg +1 0 0 1 169.1796 549.68121 Tm +(E\\WHV) Tj +ET +BT +/F6 10 Tf +0 0 0 rg +1 0 0 1 228.0596 549.68121 Tm +() Tj +ET +BT +/F6 10 Tf +0 0 0 rg +1 0 0 1 236.37961 549.68121 Tm +(E\\WH) Tj +ET +BT +/F6 10 Tf +0 0 0 rg +1 0 0 1 289.9801 549.68121 Tm +() Tj +ET +BT +/F6 10 Tf +0 0 0 rg +1 0 0 1 298.30011 549.68121 Tm +(E\\WHV) Tj +ET +BT +/F6 10 Tf +0 0 0 rg +1 0 0 1 357.12021 549.68121 Tm +() Tj +ET +BT +/F6 10 Tf +0 0 0 rg +1 0 0 1 365.44022 549.68121 Tm +(E\\WH) Tj +ET +BT +/F6 10 Tf +0 0 0 rg +1 0 0 1 419.04071 549.68121 Tm +() Tj +ET +BT +/F6 10 Tf +0 0 0 rg +1 0 0 1 427.36072 549.68121 Tm +(E\\WHV) Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 104.22 533.60028 Tm +(%DRWRX) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 158.2803 533.60028 Tm +(0RGXOH) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 179.3288 533.60028 Tm +(DGGUHVV) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 228.0602 533.60028 Tm +(3DFNDJH) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 251.0502 533.60028 Tm +(,') Tj +ET +BT +/F6 4 Tf +0 0 0 rg +1 0 0 1 292.62051 533.60028 Tm +(SDFNDJH) Tj +ET +BT +/F6 4 Tf +0 0 0 rg +1 0 0 1 309.38052 533.60028 Tm +(OHQJWK) Tj +ET +BT +/F6 10 Tf +0 0 0 rg +1 0 0 1 357.12091 533.60028 Tm +(VFULSW) Tj +ET +BT +/F6 6.5 Tf +0 0 0 rg +1 0 0 1 421.68121 533.60028 Tm +(FKHFNVXP) Tj +ET +BT +/F6 9.5 Tf +0 0 0 rg +1 0 0 1 98.94 517.52032 Tm +([HI) Tj +ET +BT +/F6 10.5 Tf +0 0 0 rg +1 0 0 1 168.72079 517.52032 Tm +(;;;;) Tj +ET +BT +/F6 10.5 Tf +0 0 0 rg +1 0 0 1 233.2822 517.52032 Tm +([) Tj +ET +BT +/F6 9 Tf +0 0 0 rg +1 0 0 1 292.6228 517.52032 Tm +([) Tj +ET +BT +/F6 10.5 Tf +0 0 0 rg +1 0 0 1 362.34381 517.52032 Tm +([G) Tj +ET +BT +/F6 9 Tf +0 0 0 rg +1 0 0 1 421.6846 517.52032 Tm +([) Tj +ET +BT +/F6 5 Tf +0 0 0 rg +1 0 0 1 87.84 501.38031 Tm +(5HVSRQVH) Tj +ET +BT +/F6 5 Tf +0 0 0 rg +1 0 0 1 111.87 501.38031 Tm +(SDFNHW) Tj +ET +BT +/F6 5 Tf +0 0 0 rg +1 0 0 1 128.745 501.38031 Tm +(IRUPDW) Tj +ET +BT +/F6 10 Tf +0 0 0 rg +1 0 0 1 96.2999 485.3006 Tm +() Tj +ET +BT +/F6 10 Tf +0 0 0 rg +1 0 0 1 104.6199 485.3006 Tm +(E\\WHV) Tj +ET +BT +/F6 10 Tf +0 0 0 rg +1 0 0 1 160.86011 485.3006 Tm +() Tj +ET +BT +/F6 10 Tf +0 0 0 rg +1 0 0 1 169.18011 485.3006 Tm +(E\\WHV) Tj +ET +BT +/F6 10 Tf +0 0 0 rg +1 0 0 1 228.06 485.3006 Tm +() Tj +ET +BT +/F6 10 Tf +0 0 0 rg +1 0 0 1 236.38 485.3006 Tm +(E\\WH) Tj +ET +BT +/F6 10 Tf +0 0 0 rg +1 0 0 1 289.9805 485.3006 Tm +() Tj +ET +BT +/F6 10 Tf +0 0 0 rg +1 0 0 1 298.30051 485.3006 Tm +(E\\WHV) Tj +ET +BT +/F6 10 Tf +0 0 0 rg +1 0 0 1 357.12061 485.3006 Tm +() Tj +ET +BT +/F6 10 Tf +0 0 0 rg +1 0 0 1 365.44061 485.3006 Tm +(E\\WH) Tj +ET +BT +/F6 10 Tf +0 0 0 rg +1 0 0 1 419.0412 485.3006 Tm +() Tj +ET +BT +/F6 10 Tf +0 0 0 rg +1 0 0 1 427.36121 485.3006 Tm +(E\\WHV) Tj +ET +BT +/F6 10 Tf +0 0 0 rg +1 0 0 1 483.66129 485.3006 Tm +() Tj +ET +BT +/F6 10 Tf +0 0 0 rg +1 0 0 1 491.98129 485.3006 Tm +(E\\WHV) Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 104.22 469.22031 Tm +(%DRWRX) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 158.2803 469.22031 Tm +(0RGXOH) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 179.3288 469.22031 Tm +(DGGUHVV) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 228.0602 469.22031 Tm +(3DFNDJH) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 251.0502 469.22031 Tm +(,') Tj +ET +BT +/F6 4 Tf +0 0 0 rg +1 0 0 1 292.62051 469.22031 Tm +(SDFNDJH) Tj +ET +BT +/F6 4 Tf +0 0 0 rg +1 0 0 1 309.38052 469.22031 Tm +(OHQJWK) Tj +ET +BT +/F6 4 Tf +0 0 0 rg +1 0 0 1 357.12091 469.22031 Tm +(FRQILUPDWLRQ) Tj +ET +BT +/F6 4 Tf +0 0 0 rg +1 0 0 1 382.38492 469.22031 Tm +(FRGH) Tj +ET +BT +/F6 4 Tf +0 0 0 rg +1 0 0 1 416.4606 469.22031 Tm +(1XPEHU) Tj +ET +BT +/F6 4 Tf +0 0 0 rg +1 0 0 1 433.12061 469.22031 Tm +(RI) Tj +ET +BT +/F6 4 Tf +0 0 0 rg +1 0 0 1 437.9566 469.22031 Tm +(WHPSODWHV) Tj +ET +BT +/F6 6.5 Tf +0 0 0 rg +1 0 0 1 486.30029 469.22031 Tm +(FKHFNVXP) Tj +ET +BT +/F6 9.5 Tf +0 0 0 rg +1 0 0 1 98.94 453.08029 Tm +([HI) Tj +ET +BT +/F6 10.5 Tf +0 0 0 rg +1 0 0 1 168.72079 453.08029 Tm +(;;;;) Tj +ET +BT +/F6 10.5 Tf +0 0 0 rg +1 0 0 1 233.2822 453.08029 Tm +([) Tj +ET +BT +/F6 9 Tf +0 0 0 rg +1 0 0 1 292.6228 453.08029 Tm +([) Tj +ET +BT +/F6 10.5 Tf +0 0 0 rg +1 0 0 1 370.26401 453.08029 Tm +(;) Tj +ET +BT +/F6 10.5 Tf +0 0 0 rg +1 0 0 1 434.82431 453.08029 Tm +(1) Tj +ET +BT +/F6 10.5 Tf +0 0 0 rg +1 0 0 1 494.16501 453.08029 Tm +(6XP) Tj +ET +BT +/F6 5 Tf +0 0 0 rg +1 0 0 1 132.78 437.00031 Tm +(1RWH) Tj +ET +BT +/F6 5 Tf +0 0 0 rg +1 0 0 1 146.87 437.00031 Tm +(&RQILUPDWLRQ) Tj +ET +BT +/F6 5 Tf +0 0 0 rg +1 0 0 1 179.20999 437.00031 Tm +(FRGH [) Tj +ET +BT +/F6 5 Tf +0 0 0 rg +1 0 0 1 205.91499 437.00031 Tm +(PHDQV) Tj +ET +BT +/F6 5 Tf +0 0 0 rg +1 0 0 1 223 437.00031 Tm +(WKH) Tj +ET +BT +/F6 5 Tf +0 0 0 rg +1 0 0 1 232.015 437.00031 Tm +(UHDGLQJ) Tj +ET +BT +/F6 5 Tf +0 0 0 rg +1 0 0 1 251.535 437.00031 Tm +(LV) Tj +ET +BT +/F6 5 Tf +0 0 0 rg +1 0 0 1 256.51999 437.00031 Tm +(VXFFHVVIXO) Tj +ET +BT +/F6 4 Tf +0 0 0 rg +1 0 0 1 153.78 421.40051 Tm +(&RQILUPDWLRQ) Tj +ET +BT +/F6 4 Tf +0 0 0 rg +1 0 0 1 179.65199 421.40051 Tm +(FRGH [) Tj +ET +BT +/F6 4 Tf +0 0 0 rg +1 0 0 1 201.01599 421.40051 Tm +(PHDQV) Tj +ET +BT +/F6 4 Tf +0 0 0 rg +1 0 0 1 214.68399 421.40051 Tm +(WKHUH) Tj +ET +BT +/F6 4 Tf +0 0 0 rg +1 0 0 1 225.80399 421.40051 Tm +(LV) Tj +ET +BT +/F6 4 Tf +0 0 0 rg +1 0 0 1 229.79199 421.40051 Tm +(DQ) Tj +ET +BT +/F6 4 Tf +0 0 0 rg +1 0 0 1 235.54799 421.40051 Tm +(HUURU) Tj +ET +BT +/F6 4 Tf +0 0 0 rg +1 0 0 1 246.21999 421.40051 Tm +(LQ) Tj +ET +BT +/F6 4 Tf +0 0 0 rg +1 0 0 1 250.76399 421.40051 Tm +(UHFHLYLQJ) Tj +ET +BT +/F6 4 Tf +0 0 0 rg +1 0 0 1 268.91599 421.40051 Tm +(WKH) Tj +ET +BT +/F6 4 Tf +0 0 0 rg +1 0 0 1 276.12799 421.40051 Tm +(SDFNDJH) Tj +ET +BT +/F7 7 Tf +0 0 0 rg +1 0 0 1 87.84 405.8006 Tm +() Tj +ET +BT +/F6 7 Tf +0 0 0 rg +1 0 0 1 96.408 405.8006 Tm +(,QVWUXFWLRQ) Tj +ET +BT +/F6 7 Tf +0 0 0 rg +1 0 0 1 134.278 405.8006 Tm +(SDFNHW) Tj +ET +BT +/F6 7 Tf +0 0 0 rg +1 0 0 1 157.903 405.8006 Tm +(FKHFNVXP) Tj +ET +BT +/F6 7 Tf +0 0 0 rg +1 0 0 1 192.679 405.8006 Tm +( ) Tj +ET +BT +/F6 7 Tf +0 0 0 rg +1 0 0 1 194.77901 405.8006 Tm +() Tj +ET +BT +/F6 7 Tf +0 0 0 rg +1 0 0 1 200.60301 405.8006 Tm +(E\\WHV ) Tj +ET +BT +/F6 7 Tf +0 0 0 rg +1 0 0 1 224.41 405.8006 Tm +(3DFNDJH) Tj +ET +BT +/F6 7 Tf +0 0 0 rg +1 0 0 1 253.67 405.8006 Tm +(,') Tj +ET +BT +/F6 7 Tf +0 0 0 rg +1 0 0 1 262.97299 405.8006 Tm +( ) Tj +ET +BT +/F6 7 Tf +0 0 0 rg +1 0 0 1 265.073 405.8006 Tm +() Tj +ET +BT +/F6 7 Tf +0 0 0 rg +1 0 0 1 270.897 405.8006 Tm +(E\\WH ) Tj +ET +BT +/F6 7 Tf +0 0 0 rg +1 0 0 1 287.34702 405.8006 Tm +() Tj +ET +BT +/F6 7 Tf +0 0 0 rg +1 0 0 1 291.35101 405.8006 Tm +(3DFNHW) Tj +ET +BT +/F6 7 Tf +0 0 0 rg +1 0 0 1 314.90601 405.8006 Tm +(OHQJWK) Tj +ET +BT +/F6 7 Tf +0 0 0 rg +1 0 0 1 337.96399 405.8006 Tm +( ) Tj +ET +BT +/F6 7 Tf +0 0 0 rg +1 0 0 1 340.064 405.8006 Tm +() Tj +ET +BT +/F6 7 Tf +0 0 0 rg +1 0 0 1 345.888 405.8006 Tm +(E\\WHV ) Tj +ET +BT +/F6 7 Tf +0 0 0 rg +1 0 0 1 365.69101 405.8006 Tm +() Tj +ET +BT +/F6 7 Tf +0 0 0 rg +1 0 0 1 369.69501 405.8006 Tm +(VFULSW) Tj +ET +BT +/F6 7 Tf +0 0 0 rg +1 0 0 1 389.75702 405.8006 Tm +( ) Tj +ET +BT +/F6 7 Tf +0 0 0 rg +1 0 0 1 391.85703 405.8006 Tm +() Tj +ET +BT +/F6 7 Tf +0 0 0 rg +1 0 0 1 397.68103 405.8006 Tm +(E\\WH ) Tj +ET +BT +/F6 7 Tf +0 0 0 rg +1 0 0 1 414.13104 405.8006 Tm +() Tj +ET +BT +/F7 6 Tf +0 0 0 rg +1 0 0 1 87.841 390.20071 Tm +() Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 95.18501 390.20071 Tm +($QVZHU) Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 117.73901 390.20071 Tm +(SDFNHW) Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 137.98901 390.20071 Tm +(FKHFNVXP) Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 167.79701 390.20071 Tm +( ) Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 169.59702 390.20071 Tm +() Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 174.58902 390.20071 Tm +(E\\WHV ) Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 194.99503 390.20071 Tm +(3DFNDJH) Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 220.07503 390.20071 Tm +(,') Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 228.04903 390.20071 Tm +( ) Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 229.84903 390.20071 Tm +() Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 234.84103 390.20071 Tm +(E\\WH ) Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 248.94104 390.20071 Tm +() Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 252.37305 390.20071 Tm +(3DFNHW) Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 272.56305 390.20071 Tm +(OHQJWK) Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 292.32706 390.20071 Tm +( ) Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 294.12704 390.20071 Tm +() Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 299.11905 390.20071 Tm +(E\\WHV ) Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 316.09305 390.20071 Tm +() Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 319.52505 390.20071 Tm +(FRQILUPDWLRQ) Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 357.42105 390.20071 Tm +(FRGH) Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 372.56506 390.20071 Tm +( ) Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 374.36505 390.20071 Tm +() Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 379.35706 390.20071 Tm +(E\\WH ) Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 393.45706 390.20071 Tm +() Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 396.88907 390.20071 Tm +(QXPEHU) Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 421.02707 390.20071 Tm +(RI) Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 428.28107 390.20071 Tm +(WHPSODWHV) Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 458.02905 390.20071 Tm +( ) Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 459.82904 390.20071 Tm +() Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 464.82104 390.20071 Tm +(E\\WHV ) Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 481.79504 390.20071 Tm +() Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 87.8421 374.60089 Tm +() Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 94.5741 374.60089 Tm +(7KH) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 105.5631 374.60089 Tm +(FKHFNVXP) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 132.8871 374.60089 Tm +(LV) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 138.37061 374.60089 Tm +(DGGHG) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 156.1356 374.60089 Tm +(LQ) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 162.38361 374.60089 Tm +(E\\WHV) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 179.19711 374.60089 Tm +(WKH) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 189.11362 374.60089 Tm +(FDUU\\) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 203.61711 374.60089 Tm +(RYHU) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 216.54211 374.60089 Tm +() Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 221.11812 374.60089 Tm +(E\\WHV) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 236.45761 374.60089 Tm +(LV) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 241.94112 374.60089 Tm +(LJQRUHG) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 265.12912 374.60089 Tm +(DQG) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 276.42612 374.60089 Tm +(WKH) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 286.34262 374.60089 Tm +(KLJK) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 299.37213 374.60089 Tm +(E\\WH) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 312.07712 374.60089 Tm +(FRPHV) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 330.35361 374.60089 Tm +(ILUVW) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 341.98611 374.60089 Tm +(ZKHQ) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 357.6391 374.60089 Tm +(WUDQVPLWWLQJ) Tj +ET +BT +/F7 7.5 Tf +0 0 0 rg +1 0 0 1 87.8421 359.0011 Tm +() Tj +ET +BT +/F6 7.5 Tf +0 0 0 rg +1 0 0 1 97.0221 359.0011 Tm +(7KH) Tj +ET +BT +/F6 7.5 Tf +0 0 0 rg +1 0 0 1 112.0071 359.0011 Tm +(GHIDXOW) Tj +ET +BT +/F6 7.5 Tf +0 0 0 rg +1 0 0 1 138.86461 359.0011 Tm +(PRGXOH) Tj +ET +BT +/F6 7.5 Tf +0 0 0 rg +1 0 0 1 167.77711 359.0011 Tm +(DGGUHVV) Tj +ET +BT +/F6 7.5 Tf +0 0 0 rg +1 0 0 1 197.67212 359.0011 Tm +(LV) Tj +ET +BT +/F6 7.5 Tf +0 0 0 rg +1 0 0 1 205.14961 359.0011 Tm +() Tj +ET +BT +/F6 7.5 Tf +0 0 0 rg +1 0 0 1 208.20961 359.0011 Tm +([IIIIIIII) Tj +ET +BT +/F6 7.5 Tf +0 0 0 rg +1 0 0 1 240.16711 359.0011 Tm +() Tj +ET +BT +/F6 7.5 Tf +0 0 0 rg +1 0 0 1 244.12712 359.0011 Tm +(GHIDXOW) Tj +ET +BT +/F6 7.5 Tf +0 0 0 rg +1 0 0 1 270.98462 359.0011 Tm +(SDVVZRUG) Tj +ET +BT +/F6 7.5 Tf +0 0 0 rg +1 0 0 1 307.08212 359.0011 Tm +(LV) Tj +ET +BT +/F6 7.5 Tf +0 0 0 rg +1 0 0 1 314.55963 359.0011 Tm +() Tj +ET +BT +/F6 7.5 Tf +0 0 0 rg +1 0 0 1 317.61963 359.0011 Tm +<0013005B00130013001300130013001300130013020A> Tj +ET +BT +/F6 7.5 Tf +0 0 0 rg +1 0 0 1 362.88962 359.0011 Tm +() Tj +ET +BT +/F8 7 Tf +0 0 0 rg +1 0 0 1 87.84 320.60034 Tm +() Tj +ET +BT +/F8 7 Tf +0 0 0 rg +1 0 0 1 99.66299 320.60034 Tm +(\)LQJHUSULQW) Tj +ET +BT +/F8 7 Tf +0 0 0 rg +1 0 0 1 141.187 320.60034 Tm +(SURFHVVLQJ) Tj +ET +BT +/F8 7 Tf +0 0 0 rg +1 0 0 1 180.80699 320.60034 Tm +(LQVWUXFWLRQV) Tj +ET +BT +/F8 6.5 Tf +0 0 0 rg +1 0 0 1 87.84 284.60034 Tm +() Tj +ET +BT +/F8 6.5 Tf +0 0 0 rg +1 0 0 1 91.558 284.60034 Tm +( ) Tj +ET +BT +/F8 6.5 Tf +0 0 0 rg +1 0 0 1 95.4515 284.60034 Tm +(UHFRUG) Tj +ET +BT +/F8 6.5 Tf +0 0 0 rg +1 0 0 1 118.364 284.60034 Tm +(ILQJHUSULQW) Tj +ET +BT +/F8 6.5 Tf +0 0 0 rg +1 0 0 1 155.869 284.60034 Tm +(LPDJH) Tj +ET +BT +/F8 6.5 Tf +0 0 0 rg +1 0 0 1 177.8065 284.60034 Tm +(*HQ,PJ) Tj +ET +BT +/F6 5 Tf +0 0 0 rg +1 0 0 1 127.32 255.08032 Tm +(\)XQFWLRQ) Tj +ET +BT +/F6 5 Tf +0 0 0 rg +1 0 0 1 149.005 255.08032 Tm +(GHVFULSWLRQ) Tj +ET +BT +/F6 5 Tf +0 0 0 rg +1 0 0 1 177.97501 255.08032 Tm +(GHWHFW) Tj +ET +BT +/F6 5 Tf +0 0 0 rg +1 0 0 1 194 255.08032 Tm +(WKH) Tj +ET +BT +/F6 5 Tf +0 0 0 rg +1 0 0 1 203.015 255.08032 Tm +(ILQJHU) Tj +ET +BT +/F6 5 Tf +0 0 0 rg +1 0 0 1 219.715 255.08032 Tm +(UHFRUG) Tj +ET +BT +/F6 5 Tf +0 0 0 rg +1 0 0 1 236.465 255.08032 Tm +(WKH) Tj +ET +BT +/F6 5 Tf +0 0 0 rg +1 0 0 1 245.48 255.08032 Tm +(ILQJHUSULQW) Tj +ET +BT +/F6 5 Tf +0 0 0 rg +1 0 0 1 272.16501 255.08032 Tm +(LPDJH) Tj +ET +BT +/F6 5 Tf +0 0 0 rg +1 0 0 1 288.13 255.08032 Tm +(DQG) Tj +ET +BT +/F6 5 Tf +0 0 0 rg +1 0 0 1 298.39999 255.08032 Tm +(VWRUH) Tj +ET +BT +/F6 5 Tf +0 0 0 rg +1 0 0 1 311.81 255.08032 Tm +(LW) Tj +ET +BT +/F6 5 Tf +0 0 0 rg +1 0 0 1 316.20499 255.08032 Tm +(LQ) Tj +ET +BT +/F6 5 Tf +0 0 0 rg +1 0 0 1 321.88498 255.08032 Tm +(,PDJH%XIIHU) Tj +ET +BT +/F6 5 Tf +0 0 0 rg +1 0 0 1 352.91998 255.08032 Tm +(DIWHU) Tj +ET +BT +/F6 5 Tf +0 0 0 rg +1 0 0 1 365.435 255.08032 Tm +(GHWHFWLRQ) Tj +ET +BT +/F6 5 Tf +0 0 0 rg +1 0 0 1 390.20499 255.08032 Tm +(DQG) Tj +ET +BT +/F6 5 Tf +0 0 0 rg +1 0 0 1 400.47498 255.08032 Tm +(UHWXUQ) Tj +ET +BT +/F6 5 Tf +0 0 0 rg +1 0 0 1 416.70996 255.08032 Tm +(WR) Tj +ET +BT +/F6 5 Tf +0 0 0 rg +1 0 0 1 422.83997 255.08032 Tm +(FRQILUP) Tj +ET +BT +/F6 5 Tf +0 0 0 rg +1 0 0 1 442.40497 255.08032 Tm +(WKH) Tj +ET +BT +/F6 5 Tf +0 0 0 rg +1 0 0 1 451.41998 255.08032 Tm +(VXFFHVV) Tj +ET +BT +/F6 5 Tf +0 0 0 rg +1 0 0 1 470.61499 255.08032 Tm +(RI) Tj +ET +BT +/F6 5 Tf +0 0 0 rg +1 0 0 1 476.66 255.08032 Tm +(WKH) Tj +ET +BT +/F6 5 Tf +0 0 0 rg +1 0 0 1 485.67499 255.08032 Tm +(UHJLVWUDWLRQ) Tj +ET +BT +/F6 5 Tf +0 0 0 rg +1 0 0 1 179.82001 239.47729 Tm +(FRGH) Tj +ET +BT +/F6 5 Tf +0 0 0 rg +1 0 0 1 193.78001 239.47729 Tm +(,I) Tj +ET +BT +/F6 5 Tf +0 0 0 rg +1 0 0 1 198.49501 239.47729 Tm +(QR) Tj +ET +BT +/F6 5 Tf +0 0 0 rg +1 0 0 1 205.91 239.47729 Tm +(ILQJHU) Tj +ET +BT +/F6 5 Tf +0 0 0 rg +1 0 0 1 221.27 239.47729 Tm +(LV) Tj +ET +BT +/F6 5 Tf +0 0 0 rg +1 0 0 1 226.255 239.47729 Tm +(GHWHFWHG) Tj +ET +BT +/F6 5 Tf +0 0 0 rg +1 0 0 1 249.515 239.47729 Tm +(LW) Tj +ET +BT +/F6 5 Tf +0 0 0 rg +1 0 0 1 253.91 239.47729 Tm +(ZLOO) Tj +ET +BT +/F6 5 Tf +0 0 0 rg +1 0 0 1 263.01001 239.47729 Tm +(GLUHFWO\\) Tj +ET +BT +/F6 5 Tf +0 0 0 rg +1 0 0 1 281.60501 239.47729 Tm +(UHWXUQ) Tj +ET +BT +/F6 5 Tf +0 0 0 rg +1 0 0 1 297.84003 239.47729 Tm +(WR) Tj +ET +BT +/F6 5 Tf +0 0 0 rg +1 0 0 1 303.97003 239.47729 Tm +(WKH) Tj +ET +BT +/F6 5 Tf +0 0 0 rg +1 0 0 1 312.98505 239.47729 Tm +(QR) Tj +ET +BT +/F6 5 Tf +0 0 0 rg +1 0 0 1 320.71005 239.47729 Tm +(ILQJHU) Tj +ET +BT +/F6 5 Tf +0 0 0 rg +1 0 0 1 336.07007 239.47729 Tm +(FRQILUPDWLRQ) Tj +ET +BT +/F6 5 Tf +0 0 0 rg +1 0 0 1 367.65005 239.47729 Tm +(FRGH) Tj +ET +BT +/F6 6.5 Tf +0 0 0 rg +1 0 0 1 129.84 223.88062 Tm +(,QSXW) Tj +ET +BT +/F6 6.5 Tf +0 0 0 rg +1 0 0 1 148.1115 223.88062 Tm +(SDUDPHWHU) Tj +ET +BT +/F6 6.5 Tf +0 0 0 rg +1 0 0 1 183.959 223.88062 Tm +(QRQH) Tj +ET +BT +/F6 4.5 Tf +0 0 0 rg +1 0 0 1 129.84 208.2807 Tm +(5HWXUQ) Tj +ET +BT +/F6 4.5 Tf +0 0 0 rg +1 0 0 1 145.392 208.2807 Tm +(SDUDPHWHU) Tj +ET +BT +/F6 4.5 Tf +0 0 0 rg +1 0 0 1 170.2095 208.2807 Tm +(FRQILUPDWLRQ) Tj +ET +BT +/F6 4.5 Tf +0 0 0 rg +1 0 0 1 198.6315 208.2807 Tm +(ZRUG) Tj +ET +BT +/F6 7 Tf +0 0 0 rg +1 0 0 1 129.84 192.68091 Tm +(&RPPDQG) Tj +ET +BT +/F6 7 Tf +0 0 0 rg +1 0 0 1 165.967 192.68091 Tm +(FRGH) Tj +ET +BT +/F6 7 Tf +0 0 0 rg +1 0 0 1 185.511 192.68091 Tm +([) Tj +ET +BT +/F6 5 Tf +0 0 0 rg +1 0 0 1 87.84 177.08112 Tm +(,QVWUXFWLRQ) Tj +ET +BT +/F6 5 Tf +0 0 0 rg +1 0 0 1 114.89 177.08112 Tm +(SDFNHW) Tj +ET +BT +/F6 5 Tf +0 0 0 rg +1 0 0 1 131.765 177.08112 Tm +(IRUPDW) Tj +ET +BT +/F6 10 Tf +0 0 0 rg +1 0 0 1 96.2999 161.00128 Tm +() Tj +ET +BT +/F6 10 Tf +0 0 0 rg +1 0 0 1 104.6199 161.00128 Tm +(E\\WHV) Tj +ET +BT +/F6 10 Tf +0 0 0 rg +1 0 0 1 160.86011 161.00128 Tm +() Tj +ET +BT +/F6 10 Tf +0 0 0 rg +1 0 0 1 169.18011 161.00128 Tm +(E\\WHV) Tj +ET +BT +/F6 10 Tf +0 0 0 rg +1 0 0 1 228.06 161.00128 Tm +() Tj +ET +BT +/F6 10 Tf +0 0 0 rg +1 0 0 1 236.38 161.00128 Tm +(E\\WH) Tj +ET +BT +/F6 10 Tf +0 0 0 rg +1 0 0 1 289.9805 161.00128 Tm +() Tj +ET +BT +/F6 10 Tf +0 0 0 rg +1 0 0 1 298.30051 161.00128 Tm +(E\\WHV) Tj +ET +BT +/F6 10 Tf +0 0 0 rg +1 0 0 1 357.12061 161.00128 Tm +() Tj +ET +BT +/F6 10 Tf +0 0 0 rg +1 0 0 1 365.44061 161.00128 Tm +(E\\WH) Tj +ET +BT +/F6 10 Tf +0 0 0 rg +1 0 0 1 419.0412 161.00128 Tm +() Tj +ET +BT +/F6 10 Tf +0 0 0 rg +1 0 0 1 427.36121 161.00128 Tm +(E\\WHV) Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 104.22 144.92029 Tm +(%DRWRX) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 158.2803 144.92029 Tm +(0RGXOH) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 179.3288 144.92029 Tm +(DGGUHVV) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 228.0602 144.92029 Tm +(3DFNDJH) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 251.0502 144.92029 Tm +(,') Tj +ET +BT +/F6 4 Tf +0 0 0 rg +1 0 0 1 292.62051 144.92029 Tm +(SDFNDJH) Tj +ET +BT +/F6 4 Tf +0 0 0 rg +1 0 0 1 309.38052 144.92029 Tm +(OHQJWK) Tj +ET +BT +/F6 10 Tf +0 0 0 rg +1 0 0 1 357.12091 144.92029 Tm +(VFULSW) Tj +ET +BT +/F6 6.5 Tf +0 0 0 rg +1 0 0 1 421.68121 144.92029 Tm +(FKHFNVXP) Tj +ET +BT +/F6 9.5 Tf +0 0 0 rg +1 0 0 1 98.94 128.78027 Tm +([HI) Tj +ET +BT +/F6 10.5 Tf +0 0 0 rg +1 0 0 1 168.72079 128.78027 Tm +(;;;;) Tj +ET +BT +/F6 10.5 Tf +0 0 0 rg +1 0 0 1 233.2822 128.78027 Tm +([) Tj +ET +BT +/F6 9 Tf +0 0 0 rg +1 0 0 1 292.6228 128.78027 Tm +([) Tj +ET +BT +/F6 10.5 Tf +0 0 0 rg +1 0 0 1 362.34381 128.78027 Tm +([) Tj +ET +BT +/F6 9 Tf +0 0 0 rg +1 0 0 1 421.6846 128.78027 Tm +([) Tj +ET +BT +/F6 5 Tf +0 0 0 rg +1 0 0 1 87.84 112.70032 Tm +(5HVSRQVH) Tj +ET +BT +/F6 5 Tf +0 0 0 rg +1 0 0 1 111.87 112.70032 Tm +(SDFNHW) Tj +ET +BT +/F6 5 Tf +0 0 0 rg +1 0 0 1 128.745 112.70032 Tm +(IRUPDW) Tj +ET +BT +/F6 10 Tf +0 0 0 rg +1 0 0 1 96.2999 96.62061 Tm +() Tj +ET +BT +/F6 10 Tf +0 0 0 rg +1 0 0 1 104.6199 96.62061 Tm +(E\\WHV) Tj +ET +BT +/F6 10 Tf +0 0 0 rg +1 0 0 1 160.86011 96.62061 Tm +() Tj +ET +BT +/F6 10 Tf +0 0 0 rg +1 0 0 1 169.18011 96.62061 Tm +(E\\WHV) Tj +ET +BT +/F6 10 Tf +0 0 0 rg +1 0 0 1 228.06 96.62061 Tm +() Tj +ET +BT +/F6 10 Tf +0 0 0 rg +1 0 0 1 236.38 96.62061 Tm +(E\\WH) Tj +ET +BT +/F6 10 Tf +0 0 0 rg +1 0 0 1 289.9805 96.62061 Tm +() Tj +ET +BT +/F6 10 Tf +0 0 0 rg +1 0 0 1 298.30051 96.62061 Tm +(E\\WHV) Tj +ET +BT +/F6 10 Tf +0 0 0 rg +1 0 0 1 357.12061 96.62061 Tm +() Tj +ET +BT +/F6 10 Tf +0 0 0 rg +1 0 0 1 365.44061 96.62061 Tm +(E\\WH) Tj +ET +BT +/F6 10 Tf +0 0 0 rg +1 0 0 1 419.0412 96.62061 Tm +() Tj +ET +BT +/F6 10 Tf +0 0 0 rg +1 0 0 1 427.36121 96.62061 Tm +(E\\WHV) Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 104.22 80.48029 Tm +(%DRWRX) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 158.2803 80.48029 Tm +(0RGXOH) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 179.3288 80.48029 Tm +(DGGUHVV) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 228.0602 80.48029 Tm +(3DFNDJH) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 251.0502 80.48029 Tm +(,') Tj +ET +BT +/F6 4 Tf +0 0 0 rg +1 0 0 1 292.62051 80.48029 Tm +(SDFNDJH) Tj +ET +BT +/F6 4 Tf +0 0 0 rg +1 0 0 1 309.38052 80.48029 Tm +(OHQJWK) Tj +ET +BT +/F6 4 Tf +0 0 0 rg +1 0 0 1 357.12091 80.48029 Tm +(FRQILUPDWLRQ) Tj +ET +BT +/F6 4 Tf +0 0 0 rg +1 0 0 1 382.38492 80.48029 Tm +(FRGH) Tj +ET +BT +/F6 6.5 Tf +0 0 0 rg +1 0 0 1 421.68121 80.48029 Tm +(FKHFNVXP) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 267.95999 45.86041 Tm +(WKH) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 277.8765 45.86041 Tm +(ILUVW) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 289.509 45.86041 Tm +() Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 297.23102 45.86041 Tm +(SDJHV) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 314.24802 45.86041 Tm +(RI) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 320.89752 45.86041 Tm +() Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 328.61951 45.86041 Tm +(3DJH) Tj +ET + +endstream +endobj +923 0 obj +<< +/Length 2 +>> +stream +q + +endstream +endobj +924 0 obj +<< +/Length 2395 +/Filter /FlateDecode +>> +stream +x[[G~_޾_@Ā$!&䨉&TMI9zvkgj޾yy{'><~}wׯBO~x-߿o/޾M=zxLNĨ + &gs7/W_Gonٍ~?ϟHkR +L*GD9`ʋwwJ<~-.lN餄7%[W!6lDLZw*f +2iio\2+}zu8ޘ{QkvKpM+b(W~umYX< ͳIĐO¹(A_Dž.Dz*HmEս ,)(W/G"HK"}?n>Ww"u`t)/tH pkIL,+3/Ა`&9T@:1.RScTClXH{0Deڷ:@ڠ,id RCªFk(YX -Un5+uf8-qr-PSV2ۼO@73p8HmjkˏNK8t% 9Yq&I +\HU*ङU_SNFD"N=IvRUy`e_ml/_noizg. ڑhKGhm܂34MTkHEh + _<%*mIϯ ݗʵ2.~/x[Hk~pMFyIm/!+B JCyT[OtBU<Ϸ/pi#"!S`.&-OFY +\63ACuE6eB$<3eD^< /pei}ƧEVO[h\DW;}6t2Ev2sNVozS#39ŀYL8+-k#XYGp"`BƒL}y}27 &1ϸw5π9P'dD]44U|*e3t1:+uV{ń)emu?aʞkSULY\)|Lc̲o fwfYS60!cj؄U&@!Ȑ4=>af3qLK\F.fqzbmD,jk֞DJ.MN)-.KA2V-\ւ&dZ,MȈD)+[ĺ E"!E1X!}mvl[ۡ=h[YavqG>ؾCa[Ѝ]ql@.WRnO cuJ]5NfdڐfT<9WXv4!cհގwƪaU9m0jB"H3Ҹ,j9zi޽y$l2ر +&d¾(}2ϓoCqMXmQ\2VQXBDWiPGq,j1[ТLjʷW)X%pQ^2ތv( O 5!c8"靱YΖ4H nFQ+p\] S]8.س6uF" Gv9EvE [k.+{2KZ:9b70wՇ'mwOœm'm{1IM=X_֖U6Dv%G6ƞq$%jysU2@I*gյO*gյOƓp%, wV]dpV][ڻL.i k[%=t)k]¸v2)_soW[& ,L/3ض%y3\^tnc#)oǢ(h5F7ugu~u̩IF &;c1QF`*=Whe+,"lWfĸ#plfe!Qy(MXwaDPu?;I4لل<"&d3h/ju!.SDí# kO^:$ipDUq9聼?V_Tڄ3Tڄ'J$ߢ2J,* ![S @&fm-jQFb+fZ{jgbG2Y3sbȲ}2޼we+2,˼"o1d>oce[%Tkt<+ntl v]F@{ЮXLءqGءlKB1,cj /{/묤z\&*T-K;#/-1LV;<"l\y&ef/r<:-Em qr?8G.}Ўtria +endstream +endobj +925 0 obj +<< +/Length 35731 +>> +stream +Q +1 0 0 1 0 0 cm +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 377.35162 781.10431 Tm +(+DQJ]KRX) Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 415.64661 781.10431 Tm +(=KLDQ) Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 437.2991 781.10431 Tm +(7HFKQRORJ\\) Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 479.96661 781.10431 Tm +(&R) Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 495.21411 781.10431 Tm +(/WG) Tj +ET +BT +/F5 9.5 Tf +0 0 0 rg +1 0 0 1 98.94 757.58032 Tm +([HI) Tj +ET +BT +/F5 10.5 Tf +0 0 0 rg +1 0 0 1 168.72079 757.58032 Tm +(;;;;) Tj +ET +BT +/F5 10.5 Tf +0 0 0 rg +1 0 0 1 233.2822 757.58032 Tm +([) Tj +ET +BT +/F5 9 Tf +0 0 0 rg +1 0 0 1 292.6228 757.58032 Tm +([) Tj +ET +BT +/F5 10.5 Tf +0 0 0 rg +1 0 0 1 370.26401 757.58032 Tm +(;) Tj +ET +BT +/F5 10.5 Tf +0 0 0 rg +1 0 0 1 429.54489 757.58032 Tm +(6XP) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 132.78 725.90051 Tm +(1RWH) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 146.87 725.90051 Tm +(&RQILUPDWLRQ) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 179.20999 725.90051 Tm +(FRGH [) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 205.91499 725.90051 Tm +(PHDQV) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 223 725.90051 Tm +(WKH) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 232.015 725.90051 Tm +(HQWU\\) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 245.645 725.90051 Tm +(LV) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 250.63 725.90051 Tm +(VXFFHVVIXO) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 153.78 710.3006 Tm +(&RQILUPDWLRQ) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 179.65199 710.3006 Tm +(FRGH [) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 201.01599 710.3006 Tm +(PHDQV) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 214.68399 710.3006 Tm +(WKHUH) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 225.80399 710.3006 Tm +(LV) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 229.79199 710.3006 Tm +(DQ) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 235.54799 710.3006 Tm +(HUURU) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 246.21999 710.3006 Tm +(LQ) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 250.76399 710.3006 Tm +(UHFHLYLQJ) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 268.91599 710.3006 Tm +(WKH) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 276.12799 710.3006 Tm +(SDFNDJH) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 153.78 694.70068 Tm +(&RQILUPDWLRQ) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 186.12 694.70068 Tm +(FRGH [) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 212.825 694.70068 Tm +(PHDQV) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 229.91 694.70068 Tm +(WKHUH) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 243.81 694.70068 Tm +(LV) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 248.795 694.70068 Tm +(QR) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 256.20999 694.70068 Tm +(ILQJHU) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 271.57001 694.70068 Tm +(RQ) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 278.98502 694.70068 Tm +(WKH) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 288 694.70068 Tm +(VHQVRU) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 153.78 679.10089 Tm +(&RQILUPDWLRQ) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 186.12 679.10089 Tm +(FRGH [) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 212.825 679.10089 Tm +(PHDQV) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 229.91 679.10089 Tm +(WKH) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 238.925 679.10089 Tm +(HQWU\\) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 252.55501 679.10089 Tm +(LV) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 257.54001 679.10089 Tm +(XQVXFFHVVIXO) Tj +ET +BT +/F6 7 Tf +0 0 0 rg +1 0 0 1 87.84 663.5011 Tm +() Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 96.408 663.5011 Tm +(,QVWUXFWLRQ) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 134.278 663.5011 Tm +(SDFNHW) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 157.903 663.5011 Tm +(FKHFNVXP) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 192.679 663.5011 Tm +( ) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 194.77901 663.5011 Tm +() Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 200.60301 663.5011 Tm +(E\\WHV ) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 224.41 663.5011 Tm +(3DFNDJH) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 253.67 663.5011 Tm +(,') Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 262.97299 663.5011 Tm +( ) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 265.073 663.5011 Tm +() Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 270.897 663.5011 Tm +(E\\WH ) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 287.34702 663.5011 Tm +() Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 291.35101 663.5011 Tm +(3DFNHW) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 314.90601 663.5011 Tm +(OHQJWK) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 337.96399 663.5011 Tm +( ) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 340.064 663.5011 Tm +() Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 345.888 663.5011 Tm +(E\\WHV ) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 365.69101 663.5011 Tm +() Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 369.69501 663.5011 Tm +(VFULSW) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 389.75702 663.5011 Tm +( ) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 391.85703 663.5011 Tm +() Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 397.68103 663.5011 Tm +(E\\WH ) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 414.13104 663.5011 Tm +() Tj +ET +BT +/F6 6.5 Tf +0 0 0 rg +1 0 0 1 87.841 647.90118 Tm +() Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 95.797 647.90118 Tm +($QVZHU) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 120.23051 647.90118 Tm +(SDFNHW) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 142.168 647.90118 Tm +(FKHFNVXP) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 174.45999 647.90118 Tm +( ) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 176.40999 647.90118 Tm +() Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 181.81799 647.90118 Tm +(E\\WHV ) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 203.9245 647.90118 Tm +(3DFNDJH) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 231.0945 647.90118 Tm +(,') Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 239.733 647.90118 Tm +( ) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 241.683 647.90118 Tm +() Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 247.091 647.90118 Tm +(E\\WH ) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 262.366 647.90118 Tm +() Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 266.08398 647.90118 Tm +(3DFNHW) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 287.95648 647.90118 Tm +(OHQJWK) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 309.36749 647.90118 Tm +( ) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 311.3175 647.90118 Tm +() Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 316.72549 647.90118 Tm +(E\\WHV ) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 335.11398 647.90118 Tm +() Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 338.83197 647.90118 Tm +(FRQILUPDWLRQ) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 379.88599 647.90118 Tm +(FRGH) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 396.29199 647.90118 Tm +( ) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 398.242 647.90118 Tm +() Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 403.64999 647.90118 Tm +(E\\WH ) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 418.92499 647.90118 Tm +() Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 87.8421 632.30127 Tm +() Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 94.5741 632.30127 Tm +(7KH) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 105.5631 632.30127 Tm +(FKHFNVXP) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 132.8871 632.30127 Tm +(LV) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 138.37061 632.30127 Tm +(DGGHG) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 156.1356 632.30127 Tm +(LQ) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 162.38361 632.30127 Tm +(E\\WHV) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 179.19711 632.30127 Tm +(WKH) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 189.11362 632.30127 Tm +(FDUU\\) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 203.61711 632.30127 Tm +(RYHU) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 216.54211 632.30127 Tm +() Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 221.11812 632.30127 Tm +(E\\WHV) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 236.45761 632.30127 Tm +(LV) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 241.94112 632.30127 Tm +(LJQRUHG) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 265.12912 632.30127 Tm +(DQG) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 276.42612 632.30127 Tm +(WKH) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 286.34262 632.30127 Tm +(KLJK) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 299.37213 632.30127 Tm +(E\\WH) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 312.07712 632.30127 Tm +(FRPHV) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 330.35361 632.30127 Tm +(ILUVW) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 341.98611 632.30127 Tm +(ZKHQ) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 357.6391 632.30127 Tm +(WUDQVPLWWLQJ) Tj +ET +BT +/F6 7.5 Tf +0 0 0 rg +1 0 0 1 87.8421 616.70148 Tm +() Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 97.0221 616.70148 Tm +(7KH) Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 112.0071 616.70148 Tm +(GHIDXOW) Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 138.86461 616.70148 Tm +(PRGXOH) Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 167.77711 616.70148 Tm +(DGGUHVV) Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 197.67212 616.70148 Tm +(LV) Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 205.14961 616.70148 Tm +() Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 208.20961 616.70148 Tm +([IIIIIIII) Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 240.16711 616.70148 Tm +() Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 244.12712 616.70148 Tm +(GHIDXOW) Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 270.98462 616.70148 Tm +(SDVVZRUG) Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 307.08212 616.70148 Tm +(LV) Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 314.55963 616.70148 Tm +() Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 317.61963 616.70148 Tm +<0013005B00130013001300130013001300130013020A> Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 362.88962 616.70148 Tm +() Tj +ET +BT +/F7 7 Tf +0 0 0 rg +1 0 0 1 87.84 570.98029 Tm +() Tj +ET +BT +/F7 7 Tf +0 0 0 rg +1 0 0 1 91.84399 570.98029 Tm +( ) Tj +ET +BT +/F7 7 Tf +0 0 0 rg +1 0 0 1 96.03699 570.98029 Tm +(WR) Tj +ET +BT +/F7 7 Tf +0 0 0 rg +1 0 0 1 105.228 570.98029 Tm +(XSORDG) Tj +ET +BT +/F7 7 Tf +0 0 0 rg +1 0 0 1 131.205 570.98029 Tm +(DQ) Tj +ET +BT +/F7 7 Tf +0 0 0 rg +1 0 0 1 141.85201 570.98029 Tm +(LPDJH) Tj +ET +BT +/F7 7 Tf +0 0 0 rg +1 0 0 1 165.47701 570.98029 Tm +(8S,PDJH) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 124.62 541.40033 Tm +(\)XQFWLRQ) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 148.47351 541.40033 Tm +(GHVFULSWLRQ) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 180.34052 541.40033 Tm +(8SORDG) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 200.38802 541.40033 Tm +(WKH) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 210.30452 541.40033 Tm +(GDWD) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 223.27351 541.40033 Tm +(LQ) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 229.52151 541.40033 Tm +(WKH) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 239.43802 541.40033 Tm +(PRGXOH) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 260.6405 541.40033 Tm +(LPDJH) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 278.202 541.40033 Tm +(EXIIHU) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 295.57098 541.40033 Tm +(,PDJH%XIIHU) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 329.70947 541.40033 Tm +(WR) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 336.45248 541.40033 Tm +(WKH) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 346.36899 541.40033 Tm +(XSSHU) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 363.33649 541.40033 Tm +(FRPSXWHU) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 390.017 541.40033 Tm +(DQG) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 401.314 541.40033 Tm +(XSORDG) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 420.73999 541.40033 Tm +(LW) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 425.57449 541.40033 Tm +(WR) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 432.3175 541.40033 Tm +(WKH) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 442.23401 541.40033 Tm +(XSSHU) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 459.20151 541.40033 Tm +(FRPSXWHU) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 485.88202 541.40033 Tm +( VHH) Tj +ET +BT +/F5 9.5 Tf +0 0 0 rg +1 0 0 1 177.12 525.7973 Tm +() Tj +ET +BT +/F5 9.5 Tf +0 0 0 rg +1 0 0 1 200.98399 525.7973 Tm +(LPDJH) Tj +ET +BT +/F5 9.5 Tf +0 0 0 rg +1 0 0 1 231.31749 525.7973 Tm +(EXIIHU ) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 124.619 510.20059 Tm +(,QSXW) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 142.8905 510.20059 Tm +(SDUDPHWHU) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 178.73801 510.20059 Tm +(QRQH) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 123.1185 494.6008 Tm +(5HWXUQ) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 138.6705 494.6008 Tm +(SDUDPHWHU) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 163.48801 494.6008 Tm +(FRQILUPDWLRQ) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 191.91 494.6008 Tm +(ZRUG) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 124.619 479.00089 Tm +(&RPPDQG) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 160.746 479.00089 Tm +(FRGH) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 180.29001 479.00089 Tm +([D) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 87.8385 463.401 Tm +(,QVWUXFWLRQ) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 114.8885 463.401 Tm +(SDFNHW) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 131.7635 463.401 Tm +(IRUPDW) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 96.2984 447.32141 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 104.6184 447.32141 Tm +(E\\WHV) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 160.8586 447.32141 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 169.17859 447.32141 Tm +(E\\WHV) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 228.0585 447.32141 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 236.37851 447.32141 Tm +(E\\WH) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 289.979 447.32141 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 298.29901 447.32141 Tm +(E\\WHV) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 357.11911 447.32141 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 365.43912 447.32141 Tm +(E\\WH) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 419.0397 447.32141 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 427.35971 447.32141 Tm +(E\\WHV) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 104.22 431.1803 Tm +(%DRWRX) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 158.2803 431.1803 Tm +(0RGXOH) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 179.3288 431.1803 Tm +(DGGUHVV) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 228.0602 431.1803 Tm +(3DFNDJH) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 251.0502 431.1803 Tm +(,') Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 292.62051 431.1803 Tm +(SDFNDJH) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 309.38052 431.1803 Tm +(OHQJWK) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 357.12091 431.1803 Tm +(VFULSW) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 421.68121 431.1803 Tm +(FKHFNVXP) Tj +ET +BT +/F5 9.5 Tf +0 0 0 rg +1 0 0 1 98.94 415.10031 Tm +([HI) Tj +ET +BT +/F5 10.5 Tf +0 0 0 rg +1 0 0 1 168.72079 415.10031 Tm +(;;;;) Tj +ET +BT +/F5 10.5 Tf +0 0 0 rg +1 0 0 1 233.2822 415.10031 Tm +([) Tj +ET +BT +/F5 9 Tf +0 0 0 rg +1 0 0 1 292.6228 415.10031 Tm +([) Tj +ET +BT +/F5 10.5 Tf +0 0 0 rg +1 0 0 1 362.34381 415.10031 Tm +([D) Tj +ET +BT +/F5 9 Tf +0 0 0 rg +1 0 0 1 421.6846 415.10031 Tm +([H) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 87.84 398.9603 Tm +(5HVSRQVH) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 111.87 398.9603 Tm +(SDFNHW) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 128.745 398.9603 Tm +(IRUPDW) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 96.2999 382.88062 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 104.6199 382.88062 Tm +(E\\WHV) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 160.86011 382.88062 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 169.18011 382.88062 Tm +(E\\WHV) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 228.06 382.88062 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 236.38 382.88062 Tm +(E\\WH) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 289.9805 382.88062 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 298.30051 382.88062 Tm +(E\\WHV) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 357.12061 382.88062 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 365.44061 382.88062 Tm +(E\\WH) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 419.0412 382.88062 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 427.36121 382.88062 Tm +(E\\WHV) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 104.22 366.80029 Tm +(%DRWRX) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 158.2803 366.80029 Tm +(0RGXOH) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 179.3288 366.80029 Tm +(DGGUHVV) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 228.0602 366.80029 Tm +(3DFNDJH) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 251.0502 366.80029 Tm +(,') Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 292.62051 366.80029 Tm +(SDFNDJH) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 309.38052 366.80029 Tm +(OHQJWK) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 357.12091 366.80029 Tm +(FRQILUPDWLRQ) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 382.38492 366.80029 Tm +(FRGH) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 421.68121 366.80029 Tm +(FKHFNVXP) Tj +ET +BT +/F5 9.5 Tf +0 0 0 rg +1 0 0 1 98.94 350.72031 Tm +([HI) Tj +ET +BT +/F5 10.5 Tf +0 0 0 rg +1 0 0 1 168.72079 350.72031 Tm +(;;;;) Tj +ET +BT +/F5 10.5 Tf +0 0 0 rg +1 0 0 1 233.2822 350.72031 Tm +([) Tj +ET +BT +/F5 9 Tf +0 0 0 rg +1 0 0 1 292.6228 350.72031 Tm +([) Tj +ET +BT +/F5 10.5 Tf +0 0 0 rg +1 0 0 1 372.90366 350.72031 Tm +(;) Tj +ET +BT +/F5 10.5 Tf +0 0 0 rg +1 0 0 1 429.54379 350.72031 Tm +(6XP) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 87.84 334.58041 Tm +('DWD) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 101.4415 334.58041 Tm +(SDFNHW) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 120.004 334.58041 Tm +( ZLWK) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 134.21049 334.58041 Tm +(VXEVHTXHQW) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 166.06099 334.58041 Tm +(SDFNHWV ) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 188.90799 334.58041 Tm +(IRUPDW) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 96.2999 318.50073 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 104.6199 318.50073 Tm +(E\\WHV) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 160.86011 318.50073 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 169.18011 318.50073 Tm +(E\\WHV) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 228.06 318.50073 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 236.38 318.50073 Tm +(E\\WH) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 289.9805 318.50073 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 298.30051 318.50073 Tm +(E\\WHV) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 354.4809 318.50073 Tm +(1) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 364.68091 318.50073 Tm +(E\\WHV) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 419.0412 318.50073 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 427.36121 318.50073 Tm +(E\\WHV) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 104.22 302.42029 Tm +(%DRWRX) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 158.2803 302.42029 Tm +(0RGXOH) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 179.3288 302.42029 Tm +(DGGUHVV) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 228.0602 302.42029 Tm +(3DFNDJH) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 251.0502 302.42029 Tm +(,') Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 292.62051 302.42029 Tm +(SDFNDJH) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 309.38052 302.42029 Tm +(OHQJWK) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 357.12091 302.42029 Tm +(3DFNDJH) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 373.84091 302.42029 Tm +(&RQWHQWV) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 421.68121 302.42029 Tm +(FKHFNVXP) Tj +ET +BT +/F5 9.5 Tf +0 0 0 rg +1 0 0 1 98.94 286.28027 Tm +([HI) Tj +ET +BT +/F5 10.5 Tf +0 0 0 rg +1 0 0 1 168.7666 286.28027 Tm +(;;;;) Tj +ET +BT +/F5 10.5 Tf +0 0 0 rg +1 0 0 1 233.3382 286.28027 Tm +([) Tj +ET +BT +/F5 10.5 Tf +0 0 0 rg +1 0 0 1 300.44751 286.28027 Tm +(1) Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 351.87851 286.28027 Tm +(LPDJH) Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 375.82602 286.28027 Tm +(GDWD) Tj +ET +BT +/F5 10.5 Tf +0 0 0 rg +1 0 0 1 429.57309 286.28027 Tm +(6XP) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 87.84 270.20032 Tm +(\(QG) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 100.134 270.20032 Tm +(SDFNHW) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 120.384 270.20032 Tm +( QR) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 131.082 270.20032 Tm +(VXEVHTXHQW) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 165.828 270.20032 Tm +(SDFNHWV ) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 190.752 270.20032 Tm +(IRUPDW) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 96.2999 254.12061 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 104.6199 254.12061 Tm +(E\\WHV) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 160.86011 254.12061 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 169.18011 254.12061 Tm +(E\\WHV) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 228.06 254.12061 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 236.38 254.12061 Tm +(E\\WH) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 289.9805 254.12061 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 298.30051 254.12061 Tm +(E\\WHV) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 354.4809 254.12061 Tm +(1) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 364.68091 254.12061 Tm +(E\\WHV) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 419.0412 254.12061 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 427.36121 254.12061 Tm +(E\\WHV) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 104.22 237.98029 Tm +(%DRWRX) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 158.2803 237.98029 Tm +(0RGXOH) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 179.3288 237.98029 Tm +(DGGUHVV) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 228.0602 237.98029 Tm +(3DFNDJH) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 251.0502 237.98029 Tm +(,') Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 292.62051 237.98029 Tm +(SDFNDJH) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 309.38052 237.98029 Tm +(OHQJWK) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 357.12091 237.98029 Tm +(3DFNDJH) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 373.84091 237.98029 Tm +(&RQWHQWV) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 421.68121 237.98029 Tm +(FKHFNVXP) Tj +ET +BT +/F5 9.5 Tf +0 0 0 rg +1 0 0 1 98.94 221.90027 Tm +([HI) Tj +ET +BT +/F5 10.5 Tf +0 0 0 rg +1 0 0 1 168.7666 221.90027 Tm +(;;;;) Tj +ET +BT +/F5 10.5 Tf +0 0 0 rg +1 0 0 1 233.3382 221.90027 Tm +([) Tj +ET +BT +/F5 10.5 Tf +0 0 0 rg +1 0 0 1 300.44751 221.90027 Tm +(1) Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 351.87851 221.90027 Tm +(LPDJH) Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 375.82602 221.90027 Tm +(GDWD) Tj +ET +BT +/F5 10.5 Tf +0 0 0 rg +1 0 0 1 429.57309 221.90027 Tm +(6XP) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 132.78 205.76031 Tm +(1RWH) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 149.688 205.76031 Tm +() Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 156.28801 205.76031 Tm +(&RQILUPDWLRQ) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 195.09601 205.76031 Tm +(FRGH [) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 227.14201 205.76031 Tm +(PHDQV) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 247.64401 205.76031 Tm +(WR) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 255.00002 205.76031 Tm +(VHQG) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 270.216 205.76031 Tm +(VXEVHTXHQW) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 304.96201 205.76031 Tm +(GDWD) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 319.11002 205.76031 Tm +(SDFNHWV) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 169.5605 190.1604 Tm +(&RQILUPDWLRQ) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 195.4325 190.1604 Tm +(FRGH [) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 216.79649 190.1604 Tm +(PHDQV) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 230.46449 190.1604 Tm +(WKHUH) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 241.58449 190.1604 Tm +(LV) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 245.57249 190.1604 Tm +(DQ) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 251.32849 190.1604 Tm +(HUURU) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 262.00049 190.1604 Tm +(LQ) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 266.54449 190.1604 Tm +(UHFHLYLQJ) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 284.6965 190.1604 Tm +(WKH) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 291.90851 190.1604 Tm +(SDFNDJH) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 169.5605 174.56061 Tm +(&RQILUPDWLRQ) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 201.9005 174.56061 Tm +(FRGH [I) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 227.4655 174.56061 Tm +(PHDQV) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 244.55051 174.56061 Tm +(WKDW) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 255.3555 174.56061 Tm +(VXEVHTXHQW) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 284.31049 174.56061 Tm +(GDWD) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 296.10049 174.56061 Tm +(SDFNHWV) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 315.37048 174.56061 Tm +(FDQQRW) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 332.8855 174.56061 Tm +(EH) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 340.08051 174.56061 Tm +(VHQW) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 153.78 158.96082 Tm +() Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 158.73 158.96082 Tm +(6HQG) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 170.457 158.96082 Tm +(WKH) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 178.5705 158.96082 Tm +(FRPPDQG) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 201.11099 158.96082 Tm +(SDFNHW) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 217.50449 158.96082 Tm +(WKH) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 225.61798 158.96082 Tm +(PRGXOH) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 242.96548 158.96082 Tm +(VHQGV) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 256.53299 158.96082 Tm +(WKH) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 264.64648 158.96082 Tm +(GDWD) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 275.25748 158.96082 Tm +(SDFNHW) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 290.44498 158.96082 Tm +(RU) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 296.19598 158.96082 Tm +(WKH) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 304.30948 158.96082 Tm +(HQG) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 313.56598 158.96082 Tm +(SDFNHW) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 328.75348 158.96082 Tm +(DIWHU) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 340.01697 158.96082 Tm +(WKH) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 348.13046 158.96082 Tm +(UHVSRQVH) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 370.02295 158.96082 Tm +(DQG) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 379.26596 158.96082 Tm +(WKH) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 387.37946 158.96082 Tm +(GDWD) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 397.99045 158.96082 Tm +(SDFNHW) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 413.17795 158.96082 Tm +(DQG) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 422.42096 158.96082 Tm +(WKH) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 430.53445 158.96082 Tm +(HQG) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 439.79095 158.96082 Tm +(SDFNHW) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 454.97845 158.96082 Tm +(KDYH) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 466.27795 158.96082 Tm +(QR) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 472.95145 158.96082 Tm +(UHVSRQVH) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 493.63794 158.96082 Tm +(SDFNHW) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 510.03143 158.96082 Tm +() Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 514.98145 158.96082 Tm +(7KH) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 153.78 143.3609 Tm +(YDOXH) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 166.24049 143.3609 Tm +(RI) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 171.681 143.3609 Tm +(WKH) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 179.79449 143.3609 Tm +(QXPEHU) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 197.89799 143.3609 Tm +(RI) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 203.3385 143.3609 Tm +(E\\WHV) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 215.88901 143.3609 Tm +(LQ) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 221.00101 143.3609 Tm +(WKH) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 229.1145 143.3609 Tm +(SDFNHW) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 244.302 143.3609 Tm +(FRQWHQW) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 261.70349 143.3609 Tm +(1) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 266.29349 143.3609 Tm +(LV) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 270.78 143.3609 Tm +(GHWHUPLQHG) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 296.73151 143.3609 Tm +(E\\) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 302.96402 143.3609 Tm +(WKH) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 311.07751 143.3609 Tm +(OHQJWK) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 325.90051 143.3609 Tm +(RI) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 331.341 143.3609 Tm +(WKH) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 339.4545 143.3609 Tm +(SDFNHW) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 354.642 143.3609 Tm +(FRQWHQW) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 373.24951 143.3609 Tm +(DQG) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 382.49252 143.3609 Tm +(WKH) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 390.60602 143.3609 Tm +(OHQJWK) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 405.42902 143.3609 Tm +(RI) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 410.86951 143.3609 Tm +(WKH) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 418.983 143.3609 Tm +(IDFWRU\\) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 434.88599 143.3609 Tm +(SDFNHW) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 450.07349 143.3609 Tm +(FRQWHQW) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 467.47498 143.3609 Tm +(LV) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 471.96149 143.3609 Tm +(VHW) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 479.44949 143.3609 Tm +(WR) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 484.96649 143.3609 Tm +() Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 493.85849 143.3609 Tm +(E\\WHV) Tj +ET +BT +/F6 7 Tf +0 0 0 rg +1 0 0 1 87.8389 127.76099 Tm +() Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 96.4069 127.76099 Tm +(,QVWUXFWLRQ) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 134.2769 127.76099 Tm +(SDFNHW) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 157.9019 127.76099 Tm +(FKHFNVXP) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 192.6779 127.76099 Tm +( ) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 194.77791 127.76099 Tm +() Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 200.60191 127.76099 Tm +(E\\WHV ) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 224.40891 127.76099 Tm +(3DFNDJH) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 253.6689 127.76099 Tm +(,') Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 262.97189 127.76099 Tm +( ) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 265.0719 127.76099 Tm +() Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 270.8959 127.76099 Tm +(E\\WH ) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 287.34592 127.76099 Tm +() Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 291.34991 127.76099 Tm +(3DFNHW) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 314.90491 127.76099 Tm +(OHQJWK) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 337.96289 127.76099 Tm +( ) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 340.0629 127.76099 Tm +() Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 345.8869 127.76099 Tm +(E\\WHV ) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 365.68991 127.76099 Tm +() Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 369.69391 127.76099 Tm +(VFULSW) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 389.75592 127.76099 Tm +( ) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 391.85593 127.76099 Tm +() Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 397.67993 127.76099 Tm +(E\\WH ) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 414.12994 127.76099 Tm +() Tj +ET +BT +/F6 6.5 Tf +0 0 0 rg +1 0 0 1 87.84 112.16119 Tm +() Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 95.796 112.16119 Tm +($QVZHU) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 120.2295 112.16119 Tm +(SDFNHW) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 142.16699 112.16119 Tm +(FKHFNVXP) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 174.45898 112.16119 Tm +( ) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 176.40898 112.16119 Tm +() Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 181.81699 112.16119 Tm +(E\\WHV ) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 203.92349 112.16119 Tm +(3DFNDJH) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 231.09349 112.16119 Tm +(,') Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 239.73199 112.16119 Tm +( ) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 241.68199 112.16119 Tm +() Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 247.09 112.16119 Tm +(E\\WH ) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 262.36499 112.16119 Tm +() Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 266.08298 112.16119 Tm +(3DFNHW) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 287.95547 112.16119 Tm +(OHQJWK) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 309.36649 112.16119 Tm +( ) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 311.3165 112.16119 Tm +() Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 316.72449 112.16119 Tm +(E\\WHV ) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 335.11298 112.16119 Tm +() Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 338.83096 112.16119 Tm +(FRQILUPDWLRQ) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 379.88495 112.16119 Tm +(FRGH) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 396.29095 112.16119 Tm +( ) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 398.24097 112.16119 Tm +() Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 403.64896 112.16119 Tm +(E\\WH ) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 418.92395 112.16119 Tm +() Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 87.841 96.5614 Tm +() Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 94.57301 96.5614 Tm +(7KH) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 105.562 96.5614 Tm +(FKHFNVXP) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 132.886 96.5614 Tm +(LV) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 138.36951 96.5614 Tm +(DGGHG) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 156.13451 96.5614 Tm +(LQ) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 162.38251 96.5614 Tm +(E\\WHV) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 179.19601 96.5614 Tm +(WKH) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 189.11252 96.5614 Tm +(FDUU\\) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 203.61601 96.5614 Tm +(RYHU) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 216.54102 96.5614 Tm +() Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 221.11702 96.5614 Tm +(E\\WHV) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 236.45651 96.5614 Tm +(LV) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 241.94002 96.5614 Tm +(LJQRUHG) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 265.12802 96.5614 Tm +(DQG) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 276.42502 96.5614 Tm +(WKH) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 286.34152 96.5614 Tm +(KLJK) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 299.37103 96.5614 Tm +(E\\WH) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 312.07602 96.5614 Tm +(FRPHV) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 330.35251 96.5614 Tm +(ILUVW) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 341.98502 96.5614 Tm +(ZKHQ) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 357.638 96.5614 Tm +(WUDQVPLWWLQJ) Tj +ET +BT +/F6 7.5 Tf +0 0 0 rg +1 0 0 1 87.841 80.96149 Tm +() Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 97.021 80.96149 Tm +(7KH) Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 112.006 80.96149 Tm +(GHIDXOW) Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 138.86351 80.96149 Tm +(PRGXOH) Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 167.77602 80.96149 Tm +(DGGUHVV) Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 197.67102 80.96149 Tm +(LV) Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 205.14851 80.96149 Tm +() Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 208.20851 80.96149 Tm +([IIIIIIII) Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 240.16602 80.96149 Tm +() Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 244.12602 80.96149 Tm +(GHIDXOW) Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 270.98352 80.96149 Tm +(SDVVZRUG) Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 307.08102 80.96149 Tm +(LV) Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 314.55853 80.96149 Tm +() Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 317.61853 80.96149 Tm +<0013005B00130013001300130013001300130013020A> Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 362.88852 80.96149 Tm +() Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 267.95999 45.86041 Tm +(WKH) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 277.8765 45.86041 Tm +(ILUVW) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 289.509 45.86041 Tm +() Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 297.23102 45.86041 Tm +(SDJHV) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 314.24802 45.86041 Tm +(RI) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 320.89752 45.86041 Tm +() Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 328.61951 45.86041 Tm +(3DJH) Tj +ET + +endstream +endobj +926 0 obj +<< +/Length 2 +>> +stream +q + +endstream +endobj +927 0 obj +<< +/Length 2229 +/Filter /FlateDecode +>> +stream +x[n7}߯'Rh- +ùo+̒N_sHg"}xvp=yrxp}xc_?ÛO_nᄚw`k'4pbd>n |=}ʞ?_եo~ӷ*k& +\x+K:tWQXvy:,؋ (&ngp< +&$xMR)":4l(3@jC)܀ܫj}|?.os_D(+x ImORp[K/\ ťe f@#^鰚:':mK ǥGV}k~Š :!}_=2~R}H.֡ޤx|>KwlDJ]5 f]?;{esH`zBՠ?T1Exm5%`-Zs)|. m"8zzí)p3{'Ng0xs.pRHy*n)# TEf '=)ye+pT]I!9@u*BgD0,BX_.5ib|(-wA㘒؄Pi#ҁbF`,w֎j{( d& P\ '#ڢ3,`=2*{dC(]0kDʤ6q\@R-`qF, +E8X#jYCnԯV,']Hz2Ȇ >P+=#,rUdC^"8M0 G|Pfu+Ԩ -źeeX7LVjeRL`pD-PK#l%psl1[;%(e @zK+{FB}T>՘`U.Z'Zڒ +Dh=YrB8X3[R`;,@# GYPQ_T>PQ_T>٘U>ِ[T>PyXTזf.XҚ@8 [mqK5pqE.%8vQ +ŗs'W=TgOfƶM|uƔ\_!%2PB6(&E"6*[LEQ%-("V#l#ڭ)EVF愣L7 qEy f=%f d"3۳ :Tc)P 4P BVrǔn NgĚF- &/іZFkUdJYuȆ +,:dc ِYlĴ !SRY:x#6(jbXY kb%^1h3 I-d巃G$Pll +LNɏ1΍{8x<Cl"2nlUA}kXDٗbtntl2ܶ2´& aZub2ܶ2ݖdmemIBt̍T]&c%zLM2P^t>JeTcoedCmedCme[pX *#4loP4E(VsPh}NTuZ%O)>˰1La1MdXlH2C6TfՈL뗆M$[`Xl!-fq-=s|A1ej/됍s[ 1?mrlaLʱؙFcYXDk2ܬX1U-6[bR ,J0)X"2 * o%jY5aY271o\j5)ah1)Z%߇wɔhҐ_Ue +ゼ ;c}ܔ'_{`6|ԍZDz< CA&*7U^#ӷɍ mr&}ZVaH{_6eS ߞ/.be:Z=G^ό9r?r<ӊ, +0ݳ- L +endstream +endobj +928 0 obj +<< +/Length 28784 +>> +stream +Q +1 0 0 1 0 0 cm +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 377.35162 781.10431 Tm +(+DQJ]KRX) Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 415.64661 781.10431 Tm +(=KLDQ) Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 437.2991 781.10431 Tm +(7HFKQRORJ\\) Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 479.96661 781.10431 Tm +(&R) Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 495.21411 781.10431 Tm +(/WG) Tj +ET +BT +/F6 6.5 Tf +0 0 0 rg +1 0 0 1 87.84 720.14032 Tm +() Tj +ET +BT +/F6 6.5 Tf +0 0 0 rg +1 0 0 1 95.27599 720.14032 Tm +( ) Tj +ET +BT +/F6 6.5 Tf +0 0 0 rg +1 0 0 1 99.16949 720.14032 Tm +(WR) Tj +ET +BT +/F6 6.5 Tf +0 0 0 rg +1 0 0 1 107.70399 720.14032 Tm +(GRZQORDG) Tj +ET +BT +/F6 6.5 Tf +0 0 0 rg +1 0 0 1 141.41299 720.14032 Tm +(WKH) Tj +ET +BT +/F6 6.5 Tf +0 0 0 rg +1 0 0 1 154.036 720.14032 Tm +(LPDJH) Tj +ET +BT +/F6 6.5 Tf +0 0 0 rg +1 0 0 1 175.9735 720.14032 Tm +('RZQ,PDJH) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 129.84 690.5603 Tm +(\)XQFWLRQ) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 155.862 690.5603 Tm +(GHVFULSWLRQ) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 190.62601 690.5603 Tm +(7KH) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 202.61401 690.5603 Tm +(KRVW) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 216.55202 690.5603 Tm +(FRPSXWHU) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 245.65802 690.5603 Tm +(GRZQORDGV) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 278.07001 690.5603 Tm +(WKH) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 288.888 690.5603 Tm +(LPDJH) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 308.04599 690.5603 Tm +(GDWD) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 322.194 690.5603 Tm +(WR) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 329.54999 690.5603 Tm +(WKH) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 340.36798 690.5603 Tm +(PRGXOH) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 363.49799 690.5603 Tm +(LPDJH) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 382.65598 690.5603 Tm +(EXIIHU) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 401.60397 690.5603 Tm +(,PDJH%XIIHU) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 440.45398 690.5603 Tm +(VHH) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 451.65598 690.5603 Tm +() Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 466.72797 690.5603 Tm +(LPDJH) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 485.88596 690.5603 Tm +(EXIIHU) Tj +ET +BT +/F5 9 Tf +0 0 0 rg +1 0 0 1 182.32947 674.95728 Tm +($UHD ) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 129.84 659.3606 Tm +(,QSXW) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 148.1115 659.3606 Tm +(SDUDPHWHU) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 183.959 659.3606 Tm +(QRQH) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 129.84 643.7608 Tm +(5HWXUQ) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 145.392 643.7608 Tm +(SDUDPHWHU) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 170.2095 643.7608 Tm +(FRQILUPDWLRQ) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 198.6315 643.7608 Tm +(ZRUG) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 129.84 628.16089 Tm +(&RPPDQG) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 165.967 628.16089 Tm +(FRGH) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 185.511 628.16089 Tm +([E) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 87.84 612.5611 Tm +(,QVWUXFWLRQ) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 114.89 612.5611 Tm +(SDFNHW) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 131.765 612.5611 Tm +(IRUPDW) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 96.2999 596.48138 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 104.6199 596.48138 Tm +(E\\WHV) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 160.86011 596.48138 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 169.18011 596.48138 Tm +(E\\WHV) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 228.06 596.48138 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 236.38 596.48138 Tm +(E\\WH) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 289.9805 596.48138 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 298.30051 596.48138 Tm +(E\\WHV) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 357.12061 596.48138 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 365.44061 596.48138 Tm +(E\\WH) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 419.0412 596.48138 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 427.36121 596.48138 Tm +(E\\WHV) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 104.22 580.40033 Tm +(%DRWRX) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 158.2803 580.40033 Tm +(0RGXOH) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 179.3288 580.40033 Tm +(DGGUHVV) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 228.0602 580.40033 Tm +(3DFNDJH) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 251.0502 580.40033 Tm +(,') Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 292.62051 580.40033 Tm +(SDFNDJH) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 309.38052 580.40033 Tm +(OHQJWK) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 357.12091 580.40033 Tm +(VFULSW) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 421.68121 580.40033 Tm +(FKHFNVXP) Tj +ET +BT +/F5 9.5 Tf +0 0 0 rg +1 0 0 1 98.94 564.32031 Tm +([HI) Tj +ET +BT +/F5 10.5 Tf +0 0 0 rg +1 0 0 1 168.72079 564.32031 Tm +(;;;;) Tj +ET +BT +/F5 10.5 Tf +0 0 0 rg +1 0 0 1 233.2822 564.32031 Tm +([) Tj +ET +BT +/F5 9 Tf +0 0 0 rg +1 0 0 1 292.6228 564.32031 Tm +([) Tj +ET +BT +/F5 10.5 Tf +0 0 0 rg +1 0 0 1 362.34381 564.32031 Tm +([E) Tj +ET +BT +/F5 9.5 Tf +0 0 0 rg +1 0 0 1 421.6846 564.32031 Tm +([I) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 87.84 548.1803 Tm +(5HVSRQVH) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 111.87 548.1803 Tm +(SDFNHW) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 128.745 548.1803 Tm +(IRUPDW) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 96.2999 532.10059 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 104.6199 532.10059 Tm +(E\\WHV) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 160.86011 532.10059 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 169.18011 532.10059 Tm +(E\\WHV) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 228.06 532.10059 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 236.38 532.10059 Tm +(E\\WH) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 289.9805 532.10059 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 298.30051 532.10059 Tm +(E\\WHV) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 357.12061 532.10059 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 365.44061 532.10059 Tm +(E\\WH) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 419.0412 532.10059 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 427.36121 532.10059 Tm +(E\\WHV) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 104.22 516.02032 Tm +(%DRWRX) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 158.2803 516.02032 Tm +(0RGXOH) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 179.3288 516.02032 Tm +(DGGUHVV) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 228.0602 516.02032 Tm +(3DFNDJH) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 251.0502 516.02032 Tm +(,') Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 292.62051 516.02032 Tm +(SDFNDJH) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 309.38052 516.02032 Tm +(OHQJWK) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 357.12091 516.02032 Tm +(FRQILUPDWLRQ) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 382.38492 516.02032 Tm +(FRGH) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 421.68121 516.02032 Tm +(FKHFNVXP) Tj +ET +BT +/F5 9.5 Tf +0 0 0 rg +1 0 0 1 98.94 499.88031 Tm +([HI) Tj +ET +BT +/F5 10.5 Tf +0 0 0 rg +1 0 0 1 168.72079 499.88031 Tm +(;;;;) Tj +ET +BT +/F5 10.5 Tf +0 0 0 rg +1 0 0 1 233.2822 499.88031 Tm +([) Tj +ET +BT +/F5 9 Tf +0 0 0 rg +1 0 0 1 292.6228 499.88031 Tm +([) Tj +ET +BT +/F5 10.5 Tf +0 0 0 rg +1 0 0 1 372.90366 499.88031 Tm +(;) Tj +ET +BT +/F5 10.5 Tf +0 0 0 rg +1 0 0 1 429.54379 499.88031 Tm +(6XP) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 87.84 483.80029 Tm +('DWD) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 101.4415 483.80029 Tm +(SDFNHW) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 120.004 483.80029 Tm +( ZLWK) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 134.21049 483.80029 Tm +(VXEVHTXHQW) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 166.06099 483.80029 Tm +(SDFNHWV ) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 188.90799 483.80029 Tm +(IRUPDW) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 96.2999 467.72061 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 104.6199 467.72061 Tm +(E\\WHV) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 160.86011 467.72061 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 169.18011 467.72061 Tm +(E\\WHV) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 228.06 467.72061 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 236.38 467.72061 Tm +(E\\WH) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 289.9805 467.72061 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 298.30051 467.72061 Tm +(E\\WHV) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 354.4809 467.72061 Tm +(1) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 364.68091 467.72061 Tm +(E\\WHV) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 419.0412 467.72061 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 427.36121 467.72061 Tm +(E\\WHV) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 104.22 451.58029 Tm +(%DRWRX) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 158.2803 451.58029 Tm +(0RGXOH) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 179.3288 451.58029 Tm +(DGGUHVV) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 228.0602 451.58029 Tm +(3DFNDJH) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 251.0502 451.58029 Tm +(,') Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 292.62051 451.58029 Tm +(SDFNDJH) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 309.38052 451.58029 Tm +(OHQJWK) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 357.12091 451.58029 Tm +(3DFNDJH) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 373.84091 451.58029 Tm +(&RQWHQWV) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 421.68121 451.58029 Tm +(FKHFNVXP) Tj +ET +BT +/F5 9.5 Tf +0 0 0 rg +1 0 0 1 98.94 435.50031 Tm +([HI) Tj +ET +BT +/F5 10.5 Tf +0 0 0 rg +1 0 0 1 168.7666 435.50031 Tm +(;;;;) Tj +ET +BT +/F5 10.5 Tf +0 0 0 rg +1 0 0 1 233.3382 435.50031 Tm +([) Tj +ET +BT +/F5 10.5 Tf +0 0 0 rg +1 0 0 1 300.44751 435.50031 Tm +(1) Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 351.87851 435.50031 Tm +(LPDJH) Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 375.82602 435.50031 Tm +(GDWD) Tj +ET +BT +/F5 10.5 Tf +0 0 0 rg +1 0 0 1 429.57309 435.50031 Tm +(6XP) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 87.84 419.36029 Tm +(\(QG) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 100.134 419.36029 Tm +(SDFNHW) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 120.384 419.36029 Tm +( QR) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 131.082 419.36029 Tm +(VXEVHTXHQW) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 165.828 419.36029 Tm +(SDFNHWV ) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 190.752 419.36029 Tm +(IRUPDW) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 96.2999 403.28061 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 104.6199 403.28061 Tm +(E\\WHV) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 160.86011 403.28061 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 169.18011 403.28061 Tm +(E\\WHV) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 228.06 403.28061 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 236.38 403.28061 Tm +(E\\WH) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 289.9805 403.28061 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 298.30051 403.28061 Tm +(E\\WHV) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 354.4809 403.28061 Tm +(1) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 364.68091 403.28061 Tm +(E\\WHV) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 419.0412 403.28061 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 427.36121 403.28061 Tm +(E\\WHV) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 104.22 387.20029 Tm +(%DRWRX) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 158.2803 387.20029 Tm +(0RGXOH) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 179.3288 387.20029 Tm +(DGGUHVV) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 228.0602 387.20029 Tm +(3DFNDJH) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 251.0502 387.20029 Tm +(,') Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 292.62051 387.20029 Tm +(SDFNDJH) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 309.38052 387.20029 Tm +(OHQJWK) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 357.12091 387.20029 Tm +(3DFNDJH) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 373.84091 387.20029 Tm +(&RQWHQWV) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 421.68121 387.20029 Tm +(FKHFNVXP) Tj +ET +BT +/F5 9.5 Tf +0 0 0 rg +1 0 0 1 98.94 371.1203 Tm +([HI) Tj +ET +BT +/F5 10.5 Tf +0 0 0 rg +1 0 0 1 168.7666 371.1203 Tm +(;;;;) Tj +ET +BT +/F5 10.5 Tf +0 0 0 rg +1 0 0 1 233.3382 371.1203 Tm +([) Tj +ET +BT +/F5 10.5 Tf +0 0 0 rg +1 0 0 1 300.44751 371.1203 Tm +(1) Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 351.87851 371.1203 Tm +(LPDJH) Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 375.82602 371.1203 Tm +(GDWD) Tj +ET +BT +/F5 10.5 Tf +0 0 0 rg +1 0 0 1 429.57309 371.1203 Tm +(6XP) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 132.78 354.98029 Tm +(1RWH) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 146.87 354.98029 Tm +() Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 152.37 354.98029 Tm +(&RQILUPDWLRQ) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 184.70999 354.98029 Tm +(FRGH [) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 211.41499 354.98029 Tm +(PHDQV) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 228.5 354.98029 Tm +(WKDW) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 239.30499 354.98029 Tm +(VXEVHTXHQW) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 268.25998 354.98029 Tm +(GDWD) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 280.04999 354.98029 Tm +(SDFNHWV) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 299.31998 354.98029 Tm +(FDQ) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 308.91498 354.98029 Tm +(EH) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 316.10999 354.98029 Tm +(UHFHLYHG) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 222.00681 339.3804 Tm +(&RQILUPDWLRQ) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 247.8788 339.3804 Tm +(FRGH [) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 269.2428 339.3804 Tm +(PHDQV) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 282.9108 339.3804 Tm +(WKHUH) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 294.03079 339.3804 Tm +(LV) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 298.0188 339.3804 Tm +(DQ) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 303.77481 339.3804 Tm +(HUURU) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 314.44681 339.3804 Tm +(LQ) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 318.99081 339.3804 Tm +(UHFHLYLQJ) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 337.14282 339.3804 Tm +(WKH) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 344.35483 339.3804 Tm +(SDFNDJH) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 222.0047 323.78064 Tm +(&RQILUPDWLRQ) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 251.1107 323.78064 Tm +(FRGH [H) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 275.10919 323.78064 Tm +(PHDQV) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 290.48569 323.78064 Tm +(WKDW) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 300.21017 323.78064 Tm +(VXEVHTXHQW) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 326.26968 323.78064 Tm +(GDWD) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 336.88068 323.78064 Tm +(SDFNHWV) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 354.22366 323.78064 Tm +(FDQQRW) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 369.98715 323.78064 Tm +(EH) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 376.46265 323.78064 Tm +(UHFHLYHG) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 153.78 308.18079 Tm +() Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 158.17999 308.18079 Tm +(6HQG) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 168.60399 308.18079 Tm +(WKH) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 175.81599 308.18079 Tm +(FRPPDQG) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 195.85199 308.18079 Tm +(SDFNHW) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 210.424 308.18079 Tm +(DQG) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 218.64 308.18079 Tm +(WKH) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 225.85201 308.18079 Tm +(PRGXOH) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 241.272 308.18079 Tm +(ZLOO) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 248.552 308.18079 Tm +(UHFHLYH) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 262.996 308.18079 Tm +(WKH) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 270.20801 308.18079 Tm +(GDWD) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 279.64001 308.18079 Tm +(SDFNHW) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 293.14001 308.18079 Tm +(RU) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 298.25201 308.18079 Tm +(HQG) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 306.48001 308.18079 Tm +(WKH) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 313.69202 308.18079 Tm +(SDFNHW) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 327.19202 308.18079 Tm +(DIWHU) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 337.20401 308.18079 Tm +(WKH) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 344.41602 308.18079 Tm +(PRGXOH) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 359.83603 308.18079 Tm +(UHVSRQGV) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 153.78 292.58093 Tm +() Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 158.73 292.58093 Tm +(7KH) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 167.72099 292.58093 Tm +(YDOXH) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 180.18149 292.58093 Tm +(RI) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 185.62199 292.58093 Tm +(WKH) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 193.73549 292.58093 Tm +(QXPEHU) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 211.83899 292.58093 Tm +(RI) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 217.2795 292.58093 Tm +(E\\WHV) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 229.83 292.58093 Tm +(RI) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 235.27051 292.58093 Tm +(SDFNDJH) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 254.1255 292.58093 Tm +(FRQWHQW) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 271.52701 292.58093 Tm +(1) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 276.117 292.58093 Tm +(LV) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 280.60352 292.58093 Tm +(GHWHUPLQHG) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 306.55502 292.58093 Tm +(E\\) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 312.78754 292.58093 Tm +(WKH) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 320.90103 292.58093 Tm +(OHQJWK) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 335.72403 292.58093 Tm +(RI) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 341.16452 292.58093 Tm +(WKH) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 349.27802 292.58093 Tm +(SDFNDJH) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 368.13303 292.58093 Tm +(FRQWHQW) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 386.74054 292.58093 Tm +(7KH) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 395.73154 292.58093 Tm +(OHQJWK) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 410.55453 292.58093 Tm +(RI) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 415.99503 292.58093 Tm +(WKH) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 424.10852 292.58093 Tm +(SDFNDJH) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 442.96353 292.58093 Tm +(FRQWHQW) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 460.36502 292.58093 Tm +(LQ) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 465.47702 292.58093 Tm +(WKH) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 473.59052 292.58093 Tm +(IDFWRU\\) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 489.49353 292.58093 Tm +(LV) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 493.98004 292.58093 Tm +(VHW) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 501.46805 292.58093 Tm +(WR) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 506.98505 292.58093 Tm +() Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 515.87708 292.58093 Tm +(E\\WHV) Tj +ET +BT +/F7 7 Tf +0 0 0 rg +1 0 0 1 87.8389 276.98096 Tm +() Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 96.4069 276.98096 Tm +(,QVWUXFWLRQ) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 134.2769 276.98096 Tm +(SDFNHW) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 157.9019 276.98096 Tm +(FKHFNVXP) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 192.6779 276.98096 Tm +( ) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 194.77791 276.98096 Tm +() Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 200.60191 276.98096 Tm +(E\\WHV ) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 224.40891 276.98096 Tm +(3DFNDJH) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 253.6689 276.98096 Tm +(,') Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 262.97189 276.98096 Tm +( ) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 265.0719 276.98096 Tm +() Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 270.8959 276.98096 Tm +(E\\WH ) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 287.34592 276.98096 Tm +() Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 291.34991 276.98096 Tm +(3DFNHW) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 314.90491 276.98096 Tm +(OHQJWK) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 337.96289 276.98096 Tm +( ) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 340.0629 276.98096 Tm +() Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 345.8869 276.98096 Tm +(E\\WHV ) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 365.68991 276.98096 Tm +() Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 369.69391 276.98096 Tm +(VFULSW) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 389.75592 276.98096 Tm +( ) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 391.85593 276.98096 Tm +() Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 397.67993 276.98096 Tm +(E\\WH ) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 414.12994 276.98096 Tm +() Tj +ET +BT +/F7 6.5 Tf +0 0 0 rg +1 0 0 1 87.84 261.38123 Tm +() Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 95.796 261.38123 Tm +($QVZHU) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 120.2295 261.38123 Tm +(SDFNHW) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 142.16699 261.38123 Tm +(FKHFNVXP) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 174.45898 261.38123 Tm +( ) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 176.40898 261.38123 Tm +() Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 181.81699 261.38123 Tm +(E\\WHV ) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 203.92349 261.38123 Tm +(3DFNDJH) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 231.09349 261.38123 Tm +(,') Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 239.73199 261.38123 Tm +( ) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 241.68199 261.38123 Tm +() Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 247.09 261.38123 Tm +(E\\WH ) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 262.36499 261.38123 Tm +() Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 266.08298 261.38123 Tm +(3DFNHW) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 287.95547 261.38123 Tm +(OHQJWK) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 309.36649 261.38123 Tm +( ) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 311.3165 261.38123 Tm +() Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 316.72449 261.38123 Tm +(E\\WHV ) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 335.11298 261.38123 Tm +() Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 338.83096 261.38123 Tm +(FRQILUPDWLRQ) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 379.88495 261.38123 Tm +(FRGH) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 396.29095 261.38123 Tm +( ) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 398.24097 261.38123 Tm +() Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 403.64896 261.38123 Tm +(E\\WH ) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 418.92395 261.38123 Tm +() Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 87.841 245.78137 Tm +() Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 94.57301 245.78137 Tm +(7KH) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 105.562 245.78137 Tm +(FKHFNVXP) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 132.886 245.78137 Tm +(LV) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 138.36951 245.78137 Tm +(DGGHG) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 156.13451 245.78137 Tm +(LQ) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 162.38251 245.78137 Tm +(E\\WHV) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 179.19601 245.78137 Tm +(WKH) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 189.11252 245.78137 Tm +(FDUU\\) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 203.61601 245.78137 Tm +(RYHU) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 216.54102 245.78137 Tm +() Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 221.11702 245.78137 Tm +(E\\WHV) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 236.45651 245.78137 Tm +(LV) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 241.94002 245.78137 Tm +(LJQRUHG) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 265.12802 245.78137 Tm +(DQG) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 276.42502 245.78137 Tm +(WKH) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 286.34152 245.78137 Tm +(KLJK) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 299.37103 245.78137 Tm +(E\\WH) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 312.07602 245.78137 Tm +(FRPHV) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 330.35251 245.78137 Tm +(ILUVW) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 341.98502 245.78137 Tm +(ZKHQ) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 357.638 245.78137 Tm +(WUDQVPLWWLQJ) Tj +ET +BT +/F7 7.5 Tf +0 0 0 rg +1 0 0 1 87.841 230.18152 Tm +() Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 97.021 230.18152 Tm +(7KH) Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 112.006 230.18152 Tm +(GHIDXOW) Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 138.86351 230.18152 Tm +(PRGXOH) Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 167.77602 230.18152 Tm +(DGGUHVV) Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 197.67102 230.18152 Tm +(LV) Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 205.14851 230.18152 Tm +() Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 208.20851 230.18152 Tm +([IIIIIIII) Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 240.16602 230.18152 Tm +() Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 244.12602 230.18152 Tm +(GHIDXOW) Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 270.98352 230.18152 Tm +(SDVVZRUG) Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 307.08102 230.18152 Tm +(LV) Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 314.55853 230.18152 Tm +() Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 317.61853 230.18152 Tm +<0013005B00130013001300130013001300130013020A> Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 362.88852 230.18152 Tm +() Tj +ET +BT +/F6 7 Tf +0 0 0 rg +1 0 0 1 87.84 200.0603 Tm +() Tj +ET +BT +/F6 7 Tf +0 0 0 rg +1 0 0 1 95.848 200.0603 Tm +( ) Tj +ET +BT +/F6 7 Tf +0 0 0 rg +1 0 0 1 100.041 200.0603 Tm +(LPDJH) Tj +ET +BT +/F6 7 Tf +0 0 0 rg +1 0 0 1 123.666 200.0603 Tm +(JHQHUDWLRQ) Tj +ET +BT +/F6 7 Tf +0 0 0 rg +1 0 0 1 164.30099 200.0603 Tm +(IHDWXUHV) Tj +ET +BT +/F6 7 Tf +0 0 0 rg +1 0 0 1 195.62599 200.0603 Tm +(,PJ7]) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 129 170.48029 Tm +(\)XQFWLRQ) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 157.19049 170.48029 Tm +(GHVFULSWLRQ) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 194.85149 170.48029 Tm +(*HQHUDWH) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 224.96599 170.48029 Tm +(ILQJHUSULQW) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 259.65649 170.48029 Tm +(IHDWXUHV) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 286.7225 170.48029 Tm +(IURP) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 303.34302 170.48029 Tm +(WKH) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 315.06253 170.48029 Tm +(RULJLQDO) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 340.06152 170.48029 Tm +(LPDJH) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 360.81604 170.48029 Tm +(LQ) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 368.20004 170.48029 Tm +(,PDJH%XIIHU) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 410.28754 170.48029 Tm +(DQG) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 423.63855 170.48029 Tm +(VWRUH) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 441.07153 170.48029 Tm +(WKH) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 452.79105 170.48029 Tm +(ILOH) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 463.73706 170.48029 Tm +(LQ) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 471.12106 170.48029 Tm +(&KDU%XIIHU) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 510.04956 170.48029 Tm +(RU) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 186.71851 154.87732 Tm +(&KDU%XIIHU) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 129.8389 139.28058 Tm +(,QSXW) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 148.1104 139.28058 Tm +(SDUDPHWHU) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 183.9579 139.28058 Tm +(%XIIHU,') Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 211.6609 139.28058 Tm +( IHDWXUH) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 237.5634 139.28058 Tm +(EXIIHU) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 258.09039 139.28058 Tm +(QXPEHU ) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 129.8389 123.68079 Tm +(5HWXUQ) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 145.3909 123.68079 Tm +(SDUDPHWHU) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 170.2084 123.68079 Tm +(FRQILUPDWLRQ) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 198.6304 123.68079 Tm +(ZRUG) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 129.8389 108.08093 Tm +(&RPPDQG) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 165.9659 108.08093 Tm +(FRGH) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 185.5099 108.08093 Tm +([) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 87.8389 92.48102 Tm +(,QVWUXFWLRQ) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 114.8889 92.48102 Tm +(SDFNHW) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 131.7639 92.48102 Tm +(IRUPDW) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 267.95999 45.86041 Tm +(WKH) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 277.8765 45.86041 Tm +(ILUVW) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 289.509 45.86041 Tm +() Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 297.23102 45.86041 Tm +(SDJHV) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 314.24802 45.86041 Tm +(RI) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 320.89752 45.86041 Tm +() Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 328.61951 45.86041 Tm +(3DJH) Tj +ET + +endstream +endobj +929 0 obj +<< +/Length 2 +>> +stream +q + +endstream +endobj +930 0 obj +<< +/Length 2262 +/Filter /FlateDecode +>> +stream +x[ۊG }ؚ_1,qȼ%{I>[Oԥ!<gGS*Iu$ܾ{}s+~N n8(NI.:|+?*r]/ mFĤ+pPUUPLVTu'tT>//˽5@vT`%tum,m,M +L|z=1I8wH4˛~}?ZV -a7"2E,#}[]qh~>~m'W`OO `tX+D#A'4,2ŽXo,J,rFː`V2% T.WŭD޺jվ} M]125$0B!8.NՀdNA9BV"d+G"NCH}tZzEmdbOҔ&&=lJ630Vag`\t(RK nl,'pD.a +G\E* +$%yȤz?,CC*<"XyX VBwHX靱 S2A giXep05!8Bw+ND؇TO{3֧Ԉ,TأWJӬ4GHEWTvh\3 +9*jG5OGŵپfHH*3Up 9 +@(5BFX@x9qlc(Դ~k+GX 0^&,,+]C 6ceBT X!3(K" OfK SG9.  {=5lmh┠lr5e (Bf'`r 2.dvJ(c.ܩG7!mq{nKtx..KHµdM5ɀKn+'.TscjNX9q0;QIf&s8 EDfKѪ^ ^P igvJڞMcu*^AY3c1㥍35@Gg*6%6'`Y#*~ʺb᳘lx,*k֖"Rv*Sj&\m"o=60^sm&`.2"cDtH+ +M.9uѹ!4{樋unֹT[g}%ß5rẢS>M;f/&N~V +endstream +endobj +931 0 obj +<< +/Length 35093 +>> +stream +Q +1 0 0 1 0 0 cm +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 377.35162 781.10431 Tm +(+DQJ]KRX) Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 415.64661 781.10431 Tm +(=KLDQ) Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 437.2991 781.10431 Tm +(7HFKQRORJ\\) Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 479.96661 781.10431 Tm +(&R) Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 495.21411 781.10431 Tm +(/WG) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 96.3 757.58032 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 104.62 757.58032 Tm +(E\\WHV) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 160.8602 757.58032 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 169.18021 757.58032 Tm +(E\\WHV) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 228.0602 757.58032 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 236.38019 757.58032 Tm +(E\\WH) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 289.98071 757.58032 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 298.30072 757.58032 Tm +(E\\WHV) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 357.12079 757.58032 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 365.4408 757.58032 Tm +(E\\WH) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 421.6821 757.58032 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 430.00211 757.58032 Tm +(E\\WH) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 483.66251 757.58032 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 491.98251 757.58032 Tm +(E\\WHV) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 104.22 741.50031 Tm +(%DRWRX) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 158.2803 741.50031 Tm +(0RGXOH) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 179.3288 741.50031 Tm +(DGGUHVV) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 228.0602 741.50031 Tm +(3DFNDJH) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 251.0502 741.50031 Tm +(,') Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 292.62051 741.50031 Tm +(SDFNDJH) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 309.38052 741.50031 Tm +(OHQJWK) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 357.12091 741.50031 Tm +(VFULSW) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 416.4606 741.50031 Tm +(EXIIHU) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 435.4086 741.50031 Tm +(QXPEHU) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 486.30029 741.50031 Tm +(FKHFNVXP) Tj +ET +BT +/F5 9.5 Tf +0 0 0 rg +1 0 0 1 98.94 725.42029 Tm +([HI) Tj +ET +BT +/F5 10.5 Tf +0 0 0 rg +1 0 0 1 168.72079 725.42029 Tm +(;;;;) Tj +ET +BT +/F5 10.5 Tf +0 0 0 rg +1 0 0 1 233.2822 725.42029 Tm +([) Tj +ET +BT +/F5 9 Tf +0 0 0 rg +1 0 0 1 292.6228 725.42029 Tm +([) Tj +ET +BT +/F5 10.5 Tf +0 0 0 rg +1 0 0 1 362.34381 725.42029 Tm +([) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 416.40521 725.42029 Tm +(%XIIHU,') Tj +ET +BT +/F5 10.5 Tf +0 0 0 rg +1 0 0 1 494.16599 725.42029 Tm +(6XP) Tj +ET +BT +/F5 8.5 Tf +0 0 0 rg +1 0 0 1 132.89999 709.28027 Tm +(1RWH) Tj +ET +BT +/F5 8.5 Tf +0 0 0 rg +1 0 0 1 156.853 709.28027 Tm +(7KH) Tj +ET +BT +/F5 8.5 Tf +0 0 0 rg +1 0 0 1 173.836 709.28027 Tm +(%XIIHU,'V) Tj +ET +BT +/F5 8.5 Tf +0 0 0 rg +1 0 0 1 214.13449 709.28027 Tm +(RI) Tj +ET +BT +/F5 8.5 Tf +0 0 0 rg +1 0 0 1 224.411 709.28027 Tm +(WKH) Tj +ET +BT +/F5 8.5 Tf +0 0 0 rg +1 0 0 1 239.7365 709.28027 Tm +(EXIIHU) Tj +ET +BT +/F5 8.5 Tf +0 0 0 rg +1 0 0 1 266.5795 709.28027 Tm +(&KDU%XIIHU) Tj +ET +BT +/F5 8.5 Tf +0 0 0 rg +1 0 0 1 317.48599 709.28027 Tm +(DQG) Tj +ET +BT +/F5 8.5 Tf +0 0 0 rg +1 0 0 1 334.94501 709.28027 Tm +(&KDU%XIIHU) Tj +ET +BT +/F5 8.5 Tf +0 0 0 rg +1 0 0 1 385.8515 709.28027 Tm +(DUH) Tj +ET +BT +/F5 8.5 Tf +0 0 0 rg +1 0 0 1 401.13449 709.28027 Tm +([) Tj +ET +BT +/F5 8.5 Tf +0 0 0 rg +1 0 0 1 422.427 709.28027 Tm +(DQG) Tj +ET +BT +/F5 8.5 Tf +0 0 0 rg +1 0 0 1 439.88599 709.28027 Tm +([) Tj +ET +BT +/F5 8.5 Tf +0 0 0 rg +1 0 0 1 461.1785 709.28027 Tm +(UHVSHFWLYHO\\) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 150.71849 693.67725 Tm +(,WV) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 160.07199 693.67725 Tm +(YDOXH) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 179.81248 693.67725 Tm +(DFFRUGLQJ) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 211.69499 693.67725 Tm +(WR) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 219.66399 693.67725 Tm +(&KDU%XIIHU) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 258.59247 693.67725 Tm +(SURFHVVLQJ) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 87.8392 678.08063 Tm +(5HVSRQVH) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 111.8692 678.08063 Tm +(SDFNHW) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 128.7442 678.08063 Tm +(IRUPDW) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 96.2991 662.00092 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 104.6191 662.00092 Tm +(E\\WHV) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 160.8593 662.00092 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 169.17929 662.00092 Tm +(E\\WHV) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 228.0593 662.00092 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 236.3793 662.00092 Tm +(E\\WH) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 289.9798 662.00092 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 298.2998 662.00092 Tm +(E\\WHV) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 357.1199 662.00092 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 365.43991 662.00092 Tm +(E\\WH) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 419.04041 662.00092 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 427.36041 662.00092 Tm +(E\\WHV) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 104.22 645.92029 Tm +(%DRWRX) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 158.2803 645.92029 Tm +(0RGXOH) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 179.3288 645.92029 Tm +(DGGUHVV) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 228.0602 645.92029 Tm +(3DFNDJH) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 251.0502 645.92029 Tm +(,') Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 292.62051 645.92029 Tm +(SDFNDJH) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 309.38052 645.92029 Tm +(OHQJWK) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 357.12091 645.92029 Tm +(FRQILUPDWLRQ) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 382.38492 645.92029 Tm +(FRGH) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 421.68121 645.92029 Tm +(FKHFNVXP) Tj +ET +BT +/F5 9.5 Tf +0 0 0 rg +1 0 0 1 98.94 629.78027 Tm +([HI) Tj +ET +BT +/F5 10.5 Tf +0 0 0 rg +1 0 0 1 168.72079 629.78027 Tm +(;;;;) Tj +ET +BT +/F5 10.5 Tf +0 0 0 rg +1 0 0 1 233.2822 629.78027 Tm +([) Tj +ET +BT +/F5 9 Tf +0 0 0 rg +1 0 0 1 292.6228 629.78027 Tm +([) Tj +ET +BT +/F5 10.5 Tf +0 0 0 rg +1 0 0 1 370.26401 629.78027 Tm +(;) Tj +ET +BT +/F5 10.5 Tf +0 0 0 rg +1 0 0 1 429.54489 629.78027 Tm +(6XP) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 132.78 613.70032 Tm +(1RWH) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 145.461 613.70032 Tm +(&RQILUPDWLRQ) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 174.567 613.70032 Tm +(FRGH [) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 198.6015 613.70032 Tm +(PHDQV) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 213.978 613.70032 Tm +(WKDW) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 223.7025 613.70032 Tm +(WKH) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 231.81599 613.70032 Tm +(IHDWXUH) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 248.3985 613.70032 Tm +(LV) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 252.88499 613.70032 Tm +(VXFFHVVIXOO\\) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 279.10651 613.70032 Tm +(JHQHUDWHG) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 153.78 598.1004 Tm +(&RQILUPDWLRQ) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 179.65199 598.1004 Tm +(FRGH [) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 201.01599 598.1004 Tm +(PHDQV) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 214.68399 598.1004 Tm +(WKHUH) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 225.80399 598.1004 Tm +(LV) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 229.79199 598.1004 Tm +(DQ) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 235.54799 598.1004 Tm +(HUURU) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 246.21999 598.1004 Tm +(LQ) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 250.76399 598.1004 Tm +(UHFHLYLQJ) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 268.91599 598.1004 Tm +(WKH) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 276.12799 598.1004 Tm +(SDFNDJH) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 153.78 582.50061 Tm +(&RQILUPDWLRQ) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 182.886 582.50061 Tm +(FRGH [) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 206.9205 582.50061 Tm +(PHDQV) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 222.297 582.50061 Tm +(WKDW) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 232.0215 582.50061 Tm +(WKH) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 240.13499 582.50061 Tm +(ILQJHUSULQW) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 264.15149 582.50061 Tm +(LPDJH) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 278.51999 582.50061 Tm +(LV) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 283.0065 582.50061 Tm +(WRR) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 291.246 582.50061 Tm +(PHVV\\) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 305.76752 582.50061 Tm +(WR) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 311.28452 582.50061 Tm +(JHQHUDWH) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 331.62451 582.50061 Tm +(IHDWXUHV) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 351.56851 582.50061 Tm +(&RQILUPDWLRQ) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 380.6745 582.50061 Tm +(FRGH [) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 404.70898 582.50061 Tm +(PHDQV) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 420.08548 582.50061 Tm +(WKDW) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 429.80997 582.50061 Tm +(WKH) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 153.78 566.90076 Tm +(ILQJHUSULQW) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 177.79649 566.90076 Tm +(LPDJH) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 192.16499 566.90076 Tm +(LV) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 196.65149 566.90076 Tm +(QRUPDO) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 214.28249 566.90076 Tm +(EXW) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 222.62549 566.90076 Tm +(WKHUH) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 235.13548 566.90076 Tm +(DUH) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 243.22649 566.90076 Tm +(WRR) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 251.46599 566.90076 Tm +(IHZ) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 260.259 566.90076 Tm +(IHDWXUH) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 276.84149 566.90076 Tm +(SRLQWV) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 291.22348 566.90076 Tm +(WR) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 296.74048 566.90076 Tm +(JHQHUDWH) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 317.08047 566.90076 Tm +(IHDWXUHV) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 337.02448 566.90076 Tm +(&RQILUPDWLRQ) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 366.13046 566.90076 Tm +(FRGH [) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 390.16498 566.90076 Tm +(PHDQV) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 405.54147 566.90076 Tm +(WKDW) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 415.26596 566.90076 Tm +(WKHUH) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 427.77597 566.90076 Tm +(LV) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 432.26248 566.90076 Tm +(QR) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 153.78 551.3009 Tm +(YDOLG) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 164.85001 551.3009 Tm +(RULJLQDO) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 182.15701 551.3009 Tm +(LPDJH) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 196.52551 551.3009 Tm +(LQ) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 201.63751 551.3009 Tm +(WKH) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 209.75101 551.3009 Tm +(LPDJH) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 224.11951 551.3009 Tm +(EXIIHU) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 238.33051 551.3009 Tm +(DQG) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 247.5735 551.3009 Tm +(WKH) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 255.687 551.3009 Tm +(LPDJH) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 270.05551 551.3009 Tm +(FDQQRW) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 285.819 551.3009 Tm +(EH) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 292.29449 551.3009 Tm +(JHQHUDWHG) Tj +ET +BT +/F6 7 Tf +0 0 0 rg +1 0 0 1 87.84 535.70099 Tm +() Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 96.408 535.70099 Tm +(,QVWUXFWLRQ) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 134.278 535.70099 Tm +(SDFNHW) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 157.903 535.70099 Tm +(FKHFNVXP) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 192.679 535.70099 Tm +( ) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 194.77901 535.70099 Tm +() Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 200.60301 535.70099 Tm +(E\\WHV ) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 224.41 535.70099 Tm +(3DFNDJH) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 253.67 535.70099 Tm +(,') Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 262.97299 535.70099 Tm +( ) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 265.073 535.70099 Tm +() Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 270.897 535.70099 Tm +(E\\WH ) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 287.34702 535.70099 Tm +() Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 291.35101 535.70099 Tm +(3DFNHW) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 314.90601 535.70099 Tm +(OHQJWK) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 337.96399 535.70099 Tm +( ) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 340.064 535.70099 Tm +() Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 345.888 535.70099 Tm +(E\\WHV ) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 365.69101 535.70099 Tm +() Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 369.69501 535.70099 Tm +(VFULSW) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 389.75702 535.70099 Tm +( ) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 391.85703 535.70099 Tm +() Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 397.68103 535.70099 Tm +(E\\WH ) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 414.13104 535.70099 Tm +() Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 418.13504 535.70099 Tm +(EXIIHU) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 440.24103 535.70099 Tm +(QXPEHU) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 468.40204 535.70099 Tm +( ) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 470.50204 535.70099 Tm +() Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 476.32605 535.70099 Tm +(E\\WH ) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 492.77606 535.70099 Tm +() Tj +ET +BT +/F6 6.5 Tf +0 0 0 rg +1 0 0 1 87.841 520.1012 Tm +() Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 95.797 520.1012 Tm +($QVZHU) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 120.23051 520.1012 Tm +(SDFNHW) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 142.168 520.1012 Tm +(FKHFNVXP) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 174.45999 520.1012 Tm +( ) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 176.40999 520.1012 Tm +() Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 181.81799 520.1012 Tm +(E\\WHV ) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 203.9245 520.1012 Tm +(3DFNDJH) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 231.0945 520.1012 Tm +(,') Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 239.733 520.1012 Tm +( ) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 241.683 520.1012 Tm +() Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 247.091 520.1012 Tm +(E\\WH ) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 262.366 520.1012 Tm +() Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 266.08398 520.1012 Tm +(3DFNHW) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 287.95648 520.1012 Tm +(OHQJWK) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 309.36749 520.1012 Tm +( ) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 311.3175 520.1012 Tm +() Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 316.72549 520.1012 Tm +(E\\WHV ) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 335.11398 520.1012 Tm +() Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 338.83197 520.1012 Tm +(FRQILUPDWLRQ) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 379.88599 520.1012 Tm +(FRGH) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 396.29199 520.1012 Tm +( ) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 398.242 520.1012 Tm +() Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 403.64999 520.1012 Tm +(E\\WH ) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 418.92499 520.1012 Tm +() Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 87.8421 504.50131 Tm +() Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 94.5741 504.50131 Tm +(7KH) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 105.5631 504.50131 Tm +(FKHFNVXP) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 132.8871 504.50131 Tm +(LV) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 138.37061 504.50131 Tm +(DGGHG) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 156.1356 504.50131 Tm +(LQ) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 162.38361 504.50131 Tm +(E\\WHV) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 179.19711 504.50131 Tm +(WKH) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 189.11362 504.50131 Tm +(FDUU\\) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 203.61711 504.50131 Tm +(RYHU) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 216.54211 504.50131 Tm +() Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 221.11812 504.50131 Tm +(E\\WHV) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 236.45761 504.50131 Tm +(LV) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 241.94112 504.50131 Tm +(LJQRUHG) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 265.12912 504.50131 Tm +(DQG) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 276.42612 504.50131 Tm +(WKH) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 286.34262 504.50131 Tm +(KLJK) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 299.37213 504.50131 Tm +(E\\WH) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 312.07712 504.50131 Tm +(FRPHV) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 330.35361 504.50131 Tm +(ILUVW) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 341.98611 504.50131 Tm +(ZKHQ) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 357.6391 504.50131 Tm +(WUDQVPLWWLQJ) Tj +ET +BT +/F6 7.5 Tf +0 0 0 rg +1 0 0 1 87.8421 488.90149 Tm +() Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 97.0221 488.90149 Tm +(7KH) Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 112.0071 488.90149 Tm +(GHIDXOW) Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 138.86461 488.90149 Tm +(PRGXOH) Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 167.77711 488.90149 Tm +(DGGUHVV) Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 197.67212 488.90149 Tm +(LV) Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 205.14961 488.90149 Tm +() Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 208.20961 488.90149 Tm +([IIIIIIII) Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 240.16711 488.90149 Tm +() Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 244.12712 488.90149 Tm +(GHIDXOW) Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 270.98462 488.90149 Tm +(SDVVZRUG) Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 307.08212 488.90149 Tm +(LV) Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 314.55963 488.90149 Tm +() Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 317.61963 488.90149 Tm +<0013005B00130013001300130013001300130013020A> Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 362.88962 488.90149 Tm +() Tj +ET +BT +/F7 7 Tf +0 0 0 rg +1 0 0 1 87.84 458.7803 Tm +() Tj +ET +BT +/F7 7 Tf +0 0 0 rg +1 0 0 1 95.848 458.7803 Tm +( ) Tj +ET +BT +/F7 7 Tf +0 0 0 rg +1 0 0 1 100.041 458.7803 Tm +(IHDWXUH) Tj +ET +BT +/F7 7 Tf +0 0 0 rg +1 0 0 1 127.887 458.7803 Tm +(V\\QWKHVLV) Tj +ET +BT +/F7 7 Tf +0 0 0 rg +1 0 0 1 162.63501 458.7803 Tm +(WHPSODWH) Tj +ET +BT +/F7 7 Tf +0 0 0 rg +1 0 0 1 196.47301 458.7803 Tm +(5HJ0RGHO) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 129.84 429.20029 Tm +(\)XQFWLRQ) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 158.03049 429.20029 Tm +(GHVFULSWLRQ) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 195.69148 429.20029 Tm +(0HUJH) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 217.29099 429.20029 Tm +(WKH) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 229.01048 429.20029 Tm +(IHDWXUH) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 252.96298 429.20029 Tm +(ILOHV) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 267.02249 429.20029 Tm +(LQ) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 274.40649 429.20029 Tm +(&KDU%XIIHU) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 313.33499 429.20029 Tm +(DQG) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 326.686 429.20029 Tm +(&KDU%XIIHU) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 365.6145 429.20029 Tm +(WR) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 373.5835 429.20029 Tm +(JHQHUDWH) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 402.9635 429.20029 Tm +(D) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 408.29999 429.20029 Tm +(WHPSODWH) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 439.15549 429.20029 Tm +(DQG) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 452.5065 429.20029 Tm +(WKH) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 464.22601 429.20029 Tm +(UHVXOW) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 483.4205 429.20029 Tm +(LV) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 489.901 429.20029 Tm +(VWRUHG) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 511.33151 429.20029 Tm +(LQ) Tj +ET +BT +/F5 8 Tf +0 0 0 rg +1 0 0 1 187.62149 413.59729 Tm +(&KDU%XIIHU) Tj +ET +BT +/F5 8 Tf +0 0 0 rg +1 0 0 1 235.53349 413.59729 Tm +(DQG) Tj +ET +BT +/F5 8 Tf +0 0 0 rg +1 0 0 1 251.96548 413.59729 Tm +(&KDU%XIIHU) Tj +ET +BT +/F5 8 Tf +0 0 0 rg +1 0 0 1 299.87747 413.59729 Tm +( WKH) Tj +ET +BT +/F5 8 Tf +0 0 0 rg +1 0 0 1 316.70148 413.59729 Tm +(VDPH) Tj +ET +BT +/F5 8 Tf +0 0 0 rg +1 0 0 1 339.09348 413.59729 Tm +(FRQWHQW ) Tj +ET +BT +/F5 8 Tf +0 0 0 rg +1 0 0 1 374.57349 413.59729 Tm +(,QSXW) Tj +ET +BT +/F5 8 Tf +0 0 0 rg +1 0 0 1 129.84 398.00061 Tm +(SDUDPHWHU) Tj +ET +BT +/F5 8 Tf +0 0 0 rg +1 0 0 1 173.95999 398.00061 Tm +(QRQH) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 129.84 382.40079 Tm +(5HWXUQ) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 145.392 382.40079 Tm +(SDUDPHWHU) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 170.2095 382.40079 Tm +(FRQILUPDWLRQ) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 198.6315 382.40079 Tm +(ZRUG) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 129.84 366.8009 Tm +(&RPPDQG) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 165.967 366.8009 Tm +(FRGH) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 185.511 366.8009 Tm +([) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 87.84 351.20099 Tm +(,QVWUXFWLRQ) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 114.89 351.20099 Tm +(SDFNHW) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 131.765 351.20099 Tm +(IRUPDW) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 96.2999 335.1214 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 104.6199 335.1214 Tm +(E\\WHV) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 160.86011 335.1214 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 169.18011 335.1214 Tm +(E\\WHV) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 228.06 335.1214 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 236.38 335.1214 Tm +(E\\WH) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 289.9805 335.1214 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 298.30051 335.1214 Tm +(E\\WHV) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 357.12061 335.1214 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 365.44061 335.1214 Tm +(E\\WH) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 419.0412 335.1214 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 427.36121 335.1214 Tm +(E\\WHV) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 104.22 318.98029 Tm +(%DRWRX) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 158.2803 318.98029 Tm +(0RGXOH) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 179.3288 318.98029 Tm +(DGGUHVV) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 228.0602 318.98029 Tm +(3DFNDJH) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 251.0502 318.98029 Tm +(,') Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 292.62051 318.98029 Tm +(SDFNDJH) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 309.38052 318.98029 Tm +(OHQJWK) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 357.12091 318.98029 Tm +(VFULSW) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 421.68121 318.98029 Tm +(FKHFNVXP) Tj +ET +BT +/F5 9.5 Tf +0 0 0 rg +1 0 0 1 98.94 302.90027 Tm +([HI) Tj +ET +BT +/F5 10.5 Tf +0 0 0 rg +1 0 0 1 168.72079 302.90027 Tm +(;;;;) Tj +ET +BT +/F5 10.5 Tf +0 0 0 rg +1 0 0 1 233.2822 302.90027 Tm +([) Tj +ET +BT +/F5 9 Tf +0 0 0 rg +1 0 0 1 292.6228 302.90027 Tm +([) Tj +ET +BT +/F5 10.5 Tf +0 0 0 rg +1 0 0 1 362.34381 302.90027 Tm +([) Tj +ET +BT +/F5 9 Tf +0 0 0 rg +1 0 0 1 421.6846 302.90027 Tm +([) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 87.84 286.76031 Tm +(5HVSRQVH) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 111.87 286.76031 Tm +(SDFNHW) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 128.745 286.76031 Tm +(IRUPDW) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 96.2999 270.6806 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 104.6199 270.6806 Tm +(E\\WHV) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 160.86011 270.6806 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 169.18011 270.6806 Tm +(E\\WHV) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 228.06 270.6806 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 236.38 270.6806 Tm +(E\\WH) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 289.9805 270.6806 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 298.30051 270.6806 Tm +(E\\WHV) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 357.12061 270.6806 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 365.44061 270.6806 Tm +(E\\WH) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 419.0412 270.6806 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 427.36121 270.6806 Tm +(E\\WHV) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 104.22 254.60028 Tm +(%DRWRX) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 158.2803 254.60028 Tm +(0RGXOH) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 179.3288 254.60028 Tm +(DGGUHVV) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 228.0602 254.60028 Tm +(3DFNDJH) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 251.0502 254.60028 Tm +(,') Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 292.62051 254.60028 Tm +(SDFNDJH) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 309.38052 254.60028 Tm +(OHQJWK) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 357.12091 254.60028 Tm +(FRQILUPDWLRQ) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 382.38492 254.60028 Tm +(FRGH) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 421.68121 254.60028 Tm +(FKHFNVXP) Tj +ET +BT +/F5 9.5 Tf +0 0 0 rg +1 0 0 1 98.94 238.52026 Tm +([HI) Tj +ET +BT +/F5 10.5 Tf +0 0 0 rg +1 0 0 1 168.72079 238.52026 Tm +(;;;;) Tj +ET +BT +/F5 10.5 Tf +0 0 0 rg +1 0 0 1 233.2822 238.52026 Tm +([) Tj +ET +BT +/F5 9 Tf +0 0 0 rg +1 0 0 1 292.6228 238.52026 Tm +([) Tj +ET +BT +/F5 10.5 Tf +0 0 0 rg +1 0 0 1 370.26401 238.52026 Tm +(;) Tj +ET +BT +/F5 10.5 Tf +0 0 0 rg +1 0 0 1 429.54489 238.52026 Tm +(6XP) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 132.78 222.38031 Tm +(1RWH) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 146.87 222.38031 Tm +(&RQILUPDWLRQ) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 179.20999 222.38031 Tm +(FRGH [) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 205.91499 222.38031 Tm +(PHDQV) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 223 222.38031 Tm +(WKH) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 232.015 222.38031 Tm +(PHUJHU) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 250.83499 222.38031 Tm +(LV) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 255.81999 222.38031 Tm +(VXFFHVVIXO) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 153.78 206.78052 Tm +(&RQILUPDWLRQ) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 179.65199 206.78052 Tm +(FRGH [) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 201.01599 206.78052 Tm +(PHDQV) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 214.68399 206.78052 Tm +(WKHUH) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 225.80399 206.78052 Tm +(LV) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 229.79199 206.78052 Tm +(DQ) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 235.54799 206.78052 Tm +(HUURU) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 246.21999 206.78052 Tm +(LQ) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 250.76399 206.78052 Tm +(UHFHLYLQJ) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 268.91599 206.78052 Tm +(WKH) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 276.12799 206.78052 Tm +(SDFNDJH) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 153.78 191.1806 Tm +(&RQILUPDWLRQ) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 186.12 191.1806 Tm +(FRGH [D) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 212.76999 191.1806 Tm +(PHDQV) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 229.855 191.1806 Tm +(WKH) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 238.87 191.1806 Tm +(PHUJLQJ) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 260.26001 191.1806 Tm +(IDLOV) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 271.06 191.1806 Tm +( WKH) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 281.57501 191.1806 Tm +(WZR) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 291.63501 191.1806 Tm +(ILQJHUSULQWV) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 320.715 191.1806 Tm +(GR) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 328.11499 191.1806 Tm +(QRW) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 337.33499 191.1806 Tm +(EHORQJ) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 355.00998 191.1806 Tm +(WR) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 361.13998 191.1806 Tm +(WKH) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 370.15497 191.1806 Tm +(VDPH) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 384.14996 191.1806 Tm +(ILQJHU ) Tj +ET +BT +/F6 7 Tf +0 0 0 rg +1 0 0 1 87.84 175.58069 Tm +() Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 96.408 175.58069 Tm +(,QVWUXFWLRQ) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 134.278 175.58069 Tm +(SDFNHW) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 157.903 175.58069 Tm +(FKHFNVXP) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 192.679 175.58069 Tm +( ) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 194.77901 175.58069 Tm +() Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 200.60301 175.58069 Tm +(E\\WHV ) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 224.41 175.58069 Tm +(3DFNDJH) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 253.67 175.58069 Tm +(,') Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 262.97299 175.58069 Tm +( ) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 265.073 175.58069 Tm +() Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 270.897 175.58069 Tm +(E\\WH ) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 287.34702 175.58069 Tm +() Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 291.35101 175.58069 Tm +(3DFNHW) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 314.90601 175.58069 Tm +(OHQJWK) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 337.96399 175.58069 Tm +( ) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 340.064 175.58069 Tm +() Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 345.888 175.58069 Tm +(E\\WHV ) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 365.69101 175.58069 Tm +() Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 369.69501 175.58069 Tm +(VFULSW) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 389.75702 175.58069 Tm +( ) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 391.85703 175.58069 Tm +() Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 397.68103 175.58069 Tm +(E\\WH ) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 414.13104 175.58069 Tm +() Tj +ET +BT +/F6 6.5 Tf +0 0 0 rg +1 0 0 1 87.841 159.9809 Tm +() Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 95.797 159.9809 Tm +($QVZHU) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 120.23051 159.9809 Tm +(SDFNHW) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 142.168 159.9809 Tm +(FKHFNVXP) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 174.45999 159.9809 Tm +( ) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 176.40999 159.9809 Tm +() Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 181.81799 159.9809 Tm +(E\\WHV ) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 203.9245 159.9809 Tm +(3DFNDJH) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 231.0945 159.9809 Tm +(,') Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 239.733 159.9809 Tm +( ) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 241.683 159.9809 Tm +() Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 247.091 159.9809 Tm +(E\\WH ) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 262.366 159.9809 Tm +() Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 266.08398 159.9809 Tm +(3DFNHW) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 287.95648 159.9809 Tm +(OHQJWK) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 309.36749 159.9809 Tm +( ) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 311.3175 159.9809 Tm +() Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 316.72549 159.9809 Tm +(E\\WHV ) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 335.11398 159.9809 Tm +() Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 338.83197 159.9809 Tm +(FRQILUPDWLRQ) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 379.88599 159.9809 Tm +(FRGH) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 396.29199 159.9809 Tm +( ) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 398.242 159.9809 Tm +() Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 403.64999 159.9809 Tm +(E\\WH ) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 418.92499 159.9809 Tm +() Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 87.8421 144.38098 Tm +() Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 94.5741 144.38098 Tm +(7KH) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 105.5631 144.38098 Tm +(FKHFNVXP) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 132.8871 144.38098 Tm +(LV) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 138.37061 144.38098 Tm +(DGGHG) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 156.1356 144.38098 Tm +(LQ) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 162.38361 144.38098 Tm +(E\\WHV) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 179.19711 144.38098 Tm +(WKH) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 189.11362 144.38098 Tm +(FDUU\\) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 203.61711 144.38098 Tm +(RYHU) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 216.54211 144.38098 Tm +() Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 221.11812 144.38098 Tm +(E\\WHV) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 236.45761 144.38098 Tm +(LV) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 241.94112 144.38098 Tm +(LJQRUHG) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 265.12912 144.38098 Tm +(DQG) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 276.42612 144.38098 Tm +(WKH) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 286.34262 144.38098 Tm +(KLJK) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 299.37213 144.38098 Tm +(E\\WH) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 312.07712 144.38098 Tm +(FRPHV) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 330.35361 144.38098 Tm +(ILUVW) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 341.98611 144.38098 Tm +(ZKHQ) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 357.6391 144.38098 Tm +(WUDQVPLWWLQJ) Tj +ET +BT +/F6 7.5 Tf +0 0 0 rg +1 0 0 1 87.8421 128.78119 Tm +() Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 97.0221 128.78119 Tm +(7KH) Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 112.0071 128.78119 Tm +(GHIDXOW) Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 138.86461 128.78119 Tm +(PRGXOH) Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 167.77711 128.78119 Tm +(DGGUHVV) Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 197.67212 128.78119 Tm +(LV) Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 205.14961 128.78119 Tm +() Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 208.20961 128.78119 Tm +([IIIIIIII) Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 240.16711 128.78119 Tm +() Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 244.12712 128.78119 Tm +(GHIDXOW) Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 270.98462 128.78119 Tm +(SDVVZRUG) Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 307.08212 128.78119 Tm +(LV) Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 314.55963 128.78119 Tm +() Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 317.61963 128.78119 Tm +<0013005B00130013001300130013001300130013020A> Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 362.88962 128.78119 Tm +() Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 267.95999 45.86041 Tm +(WKH) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 277.8765 45.86041 Tm +(ILUVW) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 289.509 45.86041 Tm +() Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 297.23102 45.86041 Tm +(SDJHV) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 314.24802 45.86041 Tm +(RI) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 320.89752 45.86041 Tm +() Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 328.61951 45.86041 Tm +(3DJH) Tj +ET + +endstream +endobj +932 0 obj +<< +/Length 2 +>> +stream +q + +endstream +endobj +933 0 obj +<< +/Length 2603 +/Filter /FlateDecode +>> +stream +x[ێ7}Z AM~3Y/8 M~[uuYb?/ 3}GUIQ/?}z|sӿ޿ϗ7|>ŋSɉAYდ,bN9[Gq~/9E F|yp:FMWݶeU̽GV6̈́p^\Ҧn^AԿW;T/JPZpE_ qz0kב4eKC?+#Ƙ՘d }uS=MY}Xĕe34%Nԍ \޵6/`$B"9t- A +"✞mC2Ԩ&)m!eDCI#Ny٠JL Wp(a”YL d8ҊCf!>&b-3f}ؐ%+C0#kktMҥOMkV#CȢ)Cô 2 +5ZIsPT@H18GףqGB1i-pR9OeC4cBF,ɈL!˦L~F =򌌕BE+UPۅP`W b=>0lD@437=Y'Շѱu*XITTtl510'c%@';;%c%O_\DpuO2"2@nA= 3Vv#npK Vj=gm Hviֶfe;-h +T#lq[IJl[XȢƦ~Ak")-x Ez% l%}D +bCDzғU2{2V*: +lv32V*󺟑Re518JYs .1BJ37 c-XO(SǠuW]R$"'˚:!c)ENxˡY'd,ehc2}IfHW~;?n ,`X.gq9-{HzǚX +(rߢ)'d<84儌M9!c@4ae< \ȺoR"*"p4 n$ a؃7lj?ܲ?Fee1py,Kz]\f;JMRXV^ +d{erBl49!c%-]C5ZX?QRt"/ь=bQp% +(hj]Ayسr"&d]2kBRp蚐j{Ct!d1Uٖ.\2No)9.v%Z}כH<)^j0&dz"`۶g}[ip.|GLS2^(h5F8.0 +8EZ0B]]m1QF6UFX!L.["Œʌhwn۵eۢ0݁< >/%ϜڔOQjo"Ϝ+5(X|g2vogT<"&d!ޔpTVyvdhC9CMt8:"@{OHmppwo:㖳7ݷ;!o;wBvv o;wQi{? +oLBW(6źbY b_1hS[L%̟Cֽ,[1eY-Yv݋!ˎx,ۓ- +S7Q lEunuaڃ0j2v2dem Bt,ݱR*pIXHLD^Fjn6v=H uOP-頸4^bn`:HvѤ`9ӑ-4,OJѵAzs~~?K!d7$v͹c1Z{j?~ZR^^i εomx1aݍ} 㣦5 kCa`!@+^ƽYrx~'{~)c/.M2AN;f7U`- XW xW ֏ !'|P89a B?h4IirG}w@$BI uj@6Pw׽ f̍^ v[)hxo}\#1=K- ƏICkf*/9e uuuUB0H&ΔaG5Ld/KiB+:ӄL2w60!ǵ=8Q ac-,P(nzZ-Jz{w:q xǽc2ws +iQHC,z+'VLZta&SaM/p!hDlza Q;lV?x +endstream +endobj +934 0 obj +<< +/Length 34154 +>> +stream +Q +1 0 0 1 0 0 cm +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 377.35162 781.10431 Tm +(+DQJ]KRX) Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 415.64661 781.10431 Tm +(=KLDQ) Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 437.2991 781.10431 Tm +(7HFKQRORJ\\) Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 479.96661 781.10431 Tm +(&R) Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 495.21411 781.10431 Tm +(/WG) Tj +ET +BT +/F6 7.5 Tf +0 0 0 rg +1 0 0 1 87.84 757.58032 Tm +() Tj +ET +BT +/F6 7.5 Tf +0 0 0 rg +1 0 0 1 96.42 757.58032 Tm +( ) Tj +ET +BT +/F6 7.5 Tf +0 0 0 rg +1 0 0 1 100.9125 757.58032 Tm +(XSORDG) Tj +ET +BT +/F6 7.5 Tf +0 0 0 rg +1 0 0 1 128.745 757.58032 Tm +(IHDWXUH) Tj +ET +BT +/F6 7.5 Tf +0 0 0 rg +1 0 0 1 158.57999 757.58032 Tm +(RU) Tj +ET +BT +/F6 7.5 Tf +0 0 0 rg +1 0 0 1 168.57748 757.58032 Tm +(WHPSODWH) Tj +ET +BT +/F6 7.5 Tf +0 0 0 rg +1 0 0 1 204.83249 757.58032 Tm +(8S&KDU) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 129.84 728.00031 Tm +(\)XQFWLRQ) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 158.03049 728.00031 Tm +(GHVFULSWLRQ) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 195.69148 728.00031 Tm +(8SORDG) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 219.38399 728.00031 Tm +(WKH) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 231.10349 728.00031 Tm +(FKDUDFWHULVWLF) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 273.659 728.00031 Tm +(ILOH) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 284.60501 728.00031 Tm +(LQ) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 291.98901 728.00031 Tm +(WKH) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 303.70853 728.00031 Tm +(FKDUDFWHULVWLF) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 346.26404 728.00031 Tm +(EXIIHU) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 366.79105 728.00031 Tm +(&KDU%XIIHU) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 405.71954 728.00031 Tm +(RU) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 414.02655 728.00031 Tm +(&KDU%XIIHU) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 452.95505 728.00031 Tm +(WR) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 460.92404 728.00031 Tm +(WKH) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 472.64355 728.00031 Tm +(XSSHU) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 129.84 712.40051 Tm +(FRPSXWHU) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 163.11349 712.40051 Tm +(,QSXW) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 181.38499 712.40051 Tm +(SDUDPHWHU) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 217.2325 712.40051 Tm +(%XIIHU,') Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 244.9355 712.40051 Tm +( EXIIHU) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 267.41251 712.40051 Tm +(QXPEHU ) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 129.84 696.8006 Tm +(5HWXUQ) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 145.392 696.8006 Tm +(SDUDPHWHU) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 170.2095 696.8006 Tm +(FRQILUPDWLRQ) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 198.6315 696.8006 Tm +(ZRUG) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 129.84 681.20068 Tm +(&RPPDQG) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 165.967 681.20068 Tm +(FRGH) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 185.511 681.20068 Tm +([) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 87.84 665.60089 Tm +(,QVWUXFWLRQ) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 114.89 665.60089 Tm +(SDFNHW) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 131.765 665.60089 Tm +(IRUPDW) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 96.2999 649.52118 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 104.6199 649.52118 Tm +(E\\WHV) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 160.86011 649.52118 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 169.18011 649.52118 Tm +(E\\WHV) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 228.06 649.52118 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 236.38 649.52118 Tm +(E\\WH) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 289.9805 649.52118 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 298.30051 649.52118 Tm +(E\\WHV) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 357.12061 649.52118 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 365.44061 649.52118 Tm +(E\\WH) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 421.68188 649.52118 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 430.00189 649.52118 Tm +(E\\WH) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 483.66229 649.52118 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 491.9823 649.52118 Tm +(E\\WHV) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 104.22 633.38031 Tm +(%DRWRX) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 158.2803 633.38031 Tm +(0RGXOH) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 179.3288 633.38031 Tm +(DGGUHVV) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 228.0602 633.38031 Tm +(3DFNDJH) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 251.0502 633.38031 Tm +(,') Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 292.62051 633.38031 Tm +(SDFNDJH) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 309.38052 633.38031 Tm +(OHQJWK) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 357.12091 633.38031 Tm +(VFULSW) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 416.4606 633.38031 Tm +(EXIIHU) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 435.4086 633.38031 Tm +(QXPEHU) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 486.30029 633.38031 Tm +(FKHFNVXP) Tj +ET +BT +/F5 9.5 Tf +0 0 0 rg +1 0 0 1 98.94 617.30029 Tm +([HI) Tj +ET +BT +/F5 10.5 Tf +0 0 0 rg +1 0 0 1 168.72079 617.30029 Tm +(;;;;) Tj +ET +BT +/F5 10.5 Tf +0 0 0 rg +1 0 0 1 233.2822 617.30029 Tm +([) Tj +ET +BT +/F5 9 Tf +0 0 0 rg +1 0 0 1 292.6228 617.30029 Tm +([) Tj +ET +BT +/F5 10.5 Tf +0 0 0 rg +1 0 0 1 362.34381 617.30029 Tm +([) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 416.40521 617.30029 Tm +(%XIIHU,') Tj +ET +BT +/F5 10.5 Tf +0 0 0 rg +1 0 0 1 494.16599 617.30029 Tm +(6XP) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 132.3 601.16028 Tm +(1RWH) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 150.617 601.16028 Tm +(7KH) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 163.604 601.16028 Tm +(%XIIHU,'V) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 194.4205 601.16028 Tm +(RI) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 202.27901 601.16028 Tm +(WKH) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 213.9985 601.16028 Tm +(EXIIHU) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 234.52551 601.16028 Tm +(&KDU%XIIHU) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 273.45401 601.16028 Tm +(DQG) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 286.80502 601.16028 Tm +(&KDU%XIIHU) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 325.73352 601.16028 Tm +(DUH) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 337.42053 601.16028 Tm +([) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 353.70303 601.16028 Tm +(DQG) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 367.05405 601.16028 Tm +([) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 383.33655 601.16028 Tm +(UHVSHFWLYHO\\) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 422.99954 601.16028 Tm +(5HVSRQVH) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 87.8398 585.56049 Tm +(SDFNHW) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 109.7773 585.56049 Tm +(IRUPDW) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 96.2997 569.48071 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 104.6197 569.48071 Tm +(E\\WHV) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 160.85989 569.48071 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 169.1799 569.48071 Tm +(E\\WHV) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 228.05991 569.48071 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 236.37991 569.48071 Tm +(E\\WH) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 289.98041 569.48071 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 298.30042 569.48071 Tm +(E\\WHV) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 357.12051 569.48071 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 365.44052 569.48071 Tm +(E\\WH) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 419.04099 569.48071 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 427.36099 569.48071 Tm +(E\\WHV) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 104.22 553.40033 Tm +(%DRWRX) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 158.2803 553.40033 Tm +(0RGXOH) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 179.3288 553.40033 Tm +(DGGUHVV) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 228.0602 553.40033 Tm +(3DFNDJH) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 251.0502 553.40033 Tm +(,') Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 292.62051 553.40033 Tm +(SDFNDJH) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 309.38052 553.40033 Tm +(OHQJWK) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 357.12091 553.40033 Tm +(FRQILUPDWLRQ) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 382.38492 553.40033 Tm +(FRGH) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 421.68121 553.40033 Tm +(FKHFNVXP) Tj +ET +BT +/F5 9.5 Tf +0 0 0 rg +1 0 0 1 98.94 537.32031 Tm +([HI) Tj +ET +BT +/F5 10.5 Tf +0 0 0 rg +1 0 0 1 168.72079 537.32031 Tm +(;;;;) Tj +ET +BT +/F5 10.5 Tf +0 0 0 rg +1 0 0 1 233.2822 537.32031 Tm +([) Tj +ET +BT +/F5 9 Tf +0 0 0 rg +1 0 0 1 292.6228 537.32031 Tm +([) Tj +ET +BT +/F5 10.5 Tf +0 0 0 rg +1 0 0 1 370.26401 537.32031 Tm +(;) Tj +ET +BT +/F5 10.5 Tf +0 0 0 rg +1 0 0 1 429.54489 537.32031 Tm +(6XP) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 87.84 521.1803 Tm +('DWD) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 101.4415 521.1803 Tm +(SDFNHW) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 120.004 521.1803 Tm +( ZLWK) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 134.21049 521.1803 Tm +(VXEVHTXHQW) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 166.06099 521.1803 Tm +(SDFNHWV ) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 188.90799 521.1803 Tm +(IRUPDW) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 96.2999 505.10059 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 104.6199 505.10059 Tm +(E\\WHV) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 160.86011 505.10059 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 169.18011 505.10059 Tm +(E\\WHV) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 228.06 505.10059 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 236.38 505.10059 Tm +(E\\WH) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 289.9805 505.10059 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 298.30051 505.10059 Tm +(E\\WHV) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 354.4809 505.10059 Tm +(1) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 364.68091 505.10059 Tm +(E\\WHV) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 419.0412 505.10059 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 427.36121 505.10059 Tm +(E\\WHV) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 104.22 489.02029 Tm +(%DRWRX) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 158.2803 489.02029 Tm +(0RGXOH) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 179.3288 489.02029 Tm +(DGGUHVV) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 228.0602 489.02029 Tm +(3DFNDJH) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 251.0502 489.02029 Tm +(,') Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 292.62051 489.02029 Tm +(SDFNDJH) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 309.38052 489.02029 Tm +(OHQJWK) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 357.12091 489.02029 Tm +(3DFNDJH) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 373.84091 489.02029 Tm +(&RQWHQWV) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 421.68121 489.02029 Tm +(FKHFNVXP) Tj +ET +BT +/F5 9.5 Tf +0 0 0 rg +1 0 0 1 98.94 472.88031 Tm +([HI) Tj +ET +BT +/F5 10.5 Tf +0 0 0 rg +1 0 0 1 168.7666 472.88031 Tm +(;;;;) Tj +ET +BT +/F5 10.5 Tf +0 0 0 rg +1 0 0 1 233.3382 472.88031 Tm +([) Tj +ET +BT +/F5 10.5 Tf +0 0 0 rg +1 0 0 1 300.44751 472.88031 Tm +(1) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 351.87851 472.88031 Tm +(WHPSODWH) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 378.7525 472.88031 Tm +(GDWD) Tj +ET +BT +/F5 10.5 Tf +0 0 0 rg +1 0 0 1 429.57309 472.88031 Tm +(6XP) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 87.84 456.80029 Tm +(\(QG) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 100.134 456.80029 Tm +(SDFNHW) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 120.384 456.80029 Tm +( QR) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 131.082 456.80029 Tm +(VXEVHTXHQW) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 165.828 456.80029 Tm +(SDFNHWV ) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 190.752 456.80029 Tm +(IRUPDW) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 96.2999 440.72061 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 104.6199 440.72061 Tm +(E\\WHV) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 160.86011 440.72061 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 169.18011 440.72061 Tm +(E\\WHV) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 228.06 440.72061 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 236.38 440.72061 Tm +(E\\WH) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 289.9805 440.72061 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 298.30051 440.72061 Tm +(E\\WHV) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 354.4809 440.72061 Tm +(1) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 364.68091 440.72061 Tm +(E\\WHV) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 419.0412 440.72061 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 427.36121 440.72061 Tm +(E\\WHV) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 104.22 424.58029 Tm +(%DRWRX) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 158.2803 424.58029 Tm +(0RGXOH) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 179.3288 424.58029 Tm +(DGGUHVV) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 228.0602 424.58029 Tm +(3DFNDJH) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 251.0502 424.58029 Tm +(,') Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 292.62051 424.58029 Tm +(SDFNDJH) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 309.38052 424.58029 Tm +(OHQJWK) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 357.12091 424.58029 Tm +(3DFNDJH) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 373.84091 424.58029 Tm +(&RQWHQWV) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 421.68121 424.58029 Tm +(FKHFNVXP) Tj +ET +BT +/F5 9.5 Tf +0 0 0 rg +1 0 0 1 98.94 408.50031 Tm +([HI) Tj +ET +BT +/F5 10.5 Tf +0 0 0 rg +1 0 0 1 168.7666 408.50031 Tm +(;;;;) Tj +ET +BT +/F5 10.5 Tf +0 0 0 rg +1 0 0 1 233.3382 408.50031 Tm +([) Tj +ET +BT +/F5 10.5 Tf +0 0 0 rg +1 0 0 1 300.44751 408.50031 Tm +(1) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 351.87851 408.50031 Tm +(WHPSODWH) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 378.7525 408.50031 Tm +(GDWD) Tj +ET +BT +/F5 10.5 Tf +0 0 0 rg +1 0 0 1 429.57309 408.50031 Tm +(6XP) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 132.78 392.36029 Tm +(1RWH) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 149.688 392.36029 Tm +() Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 156.28801 392.36029 Tm +(&RQILUPDWLRQ) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 195.09601 392.36029 Tm +(FRGH [) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 227.14201 392.36029 Tm +(PHDQV) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 247.64401 392.36029 Tm +(WR) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 255.00002 392.36029 Tm +(VHQG) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 270.216 392.36029 Tm +(GDWD) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 284.36401 392.36029 Tm +(SDFNHWV) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 307.48801 392.36029 Tm +(ODWHU) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 169.5605 376.7605 Tm +(&RQILUPDWLRQ) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 195.4325 376.7605 Tm +(FRGH [) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 216.79649 376.7605 Tm +(PHDQV) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 230.46449 376.7605 Tm +(WKHUH) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 241.58449 376.7605 Tm +(LV) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 245.57249 376.7605 Tm +(DQ) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 251.32849 376.7605 Tm +(HUURU) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 262.00049 376.7605 Tm +(LQ) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 266.54449 376.7605 Tm +(UHFHLYLQJ) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 284.6965 376.7605 Tm +(WKH) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 291.90851 376.7605 Tm +(SDFNDJH) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 169.5605 361.16061 Tm +(&RQILUPDWLRQ) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 198.6665 361.16061 Tm +(FRGH [G) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 222.8945 361.16061 Tm +(LQGLFDWHV) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 242.9375 361.16061 Tm +(WKDW) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 252.662 361.16061 Tm +(WKH) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 260.77551 361.16061 Tm +(FRPPDQG) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 283.31601 361.16061 Tm +(H[HFXWLRQ) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 305.17252 361.16061 Tm +(IDLOHG) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 150.84 345.5607 Tm +() Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 155.78999 345.5607 Tm +(6HQG) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 167.517 345.5607 Tm +(DQ) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 173.99249 345.5607 Tm +(LQVWUXFWLRQ) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 197.97299 345.5607 Tm +(SDFNHW) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 214.36649 345.5607 Tm +(WKH) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 222.47998 345.5607 Tm +(PRGXOH) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 239.82748 345.5607 Tm +(VHQGV) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 253.39499 345.5607 Tm +(D) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 257.08948 345.5607 Tm +(GDWD) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 267.70047 345.5607 Tm +(SDFNHW) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 282.88797 345.5607 Tm +(RU) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 288.63898 345.5607 Tm +(DQ) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 295.11447 345.5607 Tm +(HQG) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 304.37097 345.5607 Tm +(SDFNHW) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 319.55847 345.5607 Tm +(DIWHU) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 330.82196 345.5607 Tm +(UHVSRQGLQJ) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 357.49796 345.5607 Tm +(DQG) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 366.74097 345.5607 Tm +(WKHUH) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 379.25098 345.5607 Tm +(LV) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 383.73749 345.5607 Tm +(QR) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 390.41098 345.5607 Tm +(UHVSRQVH) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 411.09747 345.5607 Tm +(SDFNHW) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 426.28497 345.5607 Tm +(IRU) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 433.58398 345.5607 Tm +(WKH) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 441.69748 345.5607 Tm +(GDWD) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 452.30847 345.5607 Tm +(SDFNHW) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 467.49597 345.5607 Tm +(DQG) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 476.73898 345.5607 Tm +(WKH) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 484.85248 345.5607 Tm +(HQG) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 494.10898 345.5607 Tm +(SDFNHW) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 510.50247 345.5607 Tm +() Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 515.45245 345.5607 Tm +(7KH) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 150.84 329.96088 Tm +(YDOXH) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 163.30049 329.96088 Tm +(RI) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 168.741 329.96088 Tm +(WKH) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 176.85449 329.96088 Tm +(QXPEHU) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 194.95799 329.96088 Tm +(RI) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 200.3985 329.96088 Tm +(E\\WHV) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 212.94901 329.96088 Tm +(RI) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 218.38951 329.96088 Tm +(SDFNDJH) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 237.24451 329.96088 Tm +(FRQWHQW) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 254.64601 329.96088 Tm +(1) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 259.23602 329.96088 Tm +(LV) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 263.72253 329.96088 Tm +(GHWHUPLQHG) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 289.67404 329.96088 Tm +(E\\) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 295.90656 329.96088 Tm +(WKH) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 304.02005 329.96088 Tm +(OHQJWK) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 318.84305 329.96088 Tm +(RI) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 324.28354 329.96088 Tm +(WKH) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 332.39703 329.96088 Tm +(SDFNDJH) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 351.25204 329.96088 Tm +(FRQWHQW) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 369.85956 329.96088 Tm +(7KH) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 378.85056 329.96088 Tm +(OHQJWK) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 393.67355 329.96088 Tm +(RI) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 399.11404 329.96088 Tm +(WKH) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 407.22754 329.96088 Tm +(SDFNDJH) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 426.08255 329.96088 Tm +(FRQWHQW) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 443.48404 329.96088 Tm +(LQ) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 448.59604 329.96088 Tm +(WKH) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 456.70953 329.96088 Tm +(IDFWRU\\) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 472.61255 329.96088 Tm +(LV) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 477.09906 329.96088 Tm +(VHW) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 484.58707 329.96088 Tm +(WR) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 490.10406 329.96088 Tm +() Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 498.99606 329.96088 Tm +(E\\WHV) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 512.75256 329.96088 Tm +() Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 517.70258 329.96088 Tm +(7KLV) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 150.84 314.36108 Tm +(LQVWUXFWLRQ) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 174.8205 314.36108 Tm +(GRHV) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 186.174 314.36108 Tm +(QRW) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 194.472 314.36108 Tm +(DIIHFW) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 207.58501 314.36108 Tm +(WKH) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 215.6985 314.36108 Tm +(FRQWHQW) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 233.10001 314.36108 Tm +(LQ) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 238.21201 314.36108 Tm +(WKH) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 246.3255 314.36108 Tm +(PRGXOH) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 263.673 314.36108 Tm +(IHDWXUH) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 280.25549 314.36108 Tm +(EXIIHU) Tj +ET +BT +/F7 7 Tf +0 0 0 rg +1 0 0 1 87.84 298.76123 Tm +() Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 96.408 298.76123 Tm +(,QVWUXFWLRQ) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 134.278 298.76123 Tm +(SDFNHW) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 157.903 298.76123 Tm +(FKHFNVXP) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 192.679 298.76123 Tm +( ) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 194.77901 298.76123 Tm +() Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 200.60301 298.76123 Tm +(E\\WHV ) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 224.41 298.76123 Tm +(3DFNDJH) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 253.67 298.76123 Tm +(,') Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 262.97299 298.76123 Tm +( ) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 265.073 298.76123 Tm +() Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 270.897 298.76123 Tm +(E\\WH ) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 287.34702 298.76123 Tm +() Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 291.35101 298.76123 Tm +(3DFNHW) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 314.90601 298.76123 Tm +(OHQJWK) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 337.96399 298.76123 Tm +( ) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 340.064 298.76123 Tm +() Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 345.888 298.76123 Tm +(E\\WHV ) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 365.69101 298.76123 Tm +() Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 369.69501 298.76123 Tm +(VFULSW) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 389.75702 298.76123 Tm +( ) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 391.85703 298.76123 Tm +() Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 397.68103 298.76123 Tm +(E\\WH ) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 414.13104 298.76123 Tm +() Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 418.13504 298.76123 Tm +(JRRG) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 437.03503 298.76123 Tm +(EXIIHU) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 459.14102 298.76123 Tm +( ) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 461.24103 298.76123 Tm +() Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 467.06503 298.76123 Tm +(E\\WH ) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 483.51505 298.76123 Tm +() Tj +ET +BT +/F7 6.5 Tf +0 0 0 rg +1 0 0 1 87.841 283.16125 Tm +() Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 95.797 283.16125 Tm +($QVZHU) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 120.23051 283.16125 Tm +(SDFNHW) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 142.168 283.16125 Tm +(FKHFNVXP) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 174.45999 283.16125 Tm +( ) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 176.40999 283.16125 Tm +() Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 181.81799 283.16125 Tm +(E\\WHV ) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 203.9245 283.16125 Tm +(3DFNDJH) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 231.0945 283.16125 Tm +(,') Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 239.733 283.16125 Tm +( ) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 241.683 283.16125 Tm +() Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 247.091 283.16125 Tm +(E\\WH ) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 262.366 283.16125 Tm +() Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 266.08398 283.16125 Tm +(3DFNHW) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 287.95648 283.16125 Tm +(OHQJWK) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 309.36749 283.16125 Tm +( ) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 311.3175 283.16125 Tm +() Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 316.72549 283.16125 Tm +(E\\WHV ) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 335.11398 283.16125 Tm +() Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 338.83197 283.16125 Tm +(FRQILUPDWLRQ) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 379.88599 283.16125 Tm +(FRGH) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 396.29199 283.16125 Tm +( ) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 398.242 283.16125 Tm +() Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 403.64999 283.16125 Tm +(E\\WH ) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 418.92499 283.16125 Tm +() Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 87.8421 267.56152 Tm +() Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 94.5741 267.56152 Tm +(7KH) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 105.5631 267.56152 Tm +(FKHFNVXP) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 132.8871 267.56152 Tm +(LV) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 138.37061 267.56152 Tm +(DGGHG) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 156.1356 267.56152 Tm +(LQ) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 162.38361 267.56152 Tm +(E\\WHV) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 179.19711 267.56152 Tm +(WKH) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 189.11362 267.56152 Tm +(FDUU\\) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 203.61711 267.56152 Tm +(RYHU) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 216.54211 267.56152 Tm +() Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 221.11812 267.56152 Tm +(E\\WHV) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 236.45761 267.56152 Tm +(LV) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 241.94112 267.56152 Tm +(LJQRUHG) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 265.12912 267.56152 Tm +(DQG) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 276.42612 267.56152 Tm +(WKH) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 286.34262 267.56152 Tm +(KLJK) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 299.37213 267.56152 Tm +(E\\WH) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 312.07712 267.56152 Tm +(FRPHV) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 330.35361 267.56152 Tm +(ILUVW) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 341.98611 267.56152 Tm +(ZKHQ) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 357.6391 267.56152 Tm +(WUDQVPLWWLQJ) Tj +ET +BT +/F7 7.5 Tf +0 0 0 rg +1 0 0 1 87.8421 251.96167 Tm +() Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 97.0221 251.96167 Tm +(7KH) Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 112.0071 251.96167 Tm +(GHIDXOW) Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 138.86461 251.96167 Tm +(PRGXOH) Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 167.77711 251.96167 Tm +(DGGUHVV) Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 197.67212 251.96167 Tm +(LV) Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 205.14961 251.96167 Tm +() Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 208.20961 251.96167 Tm +([IIIIIIII) Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 240.16711 251.96167 Tm +() Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 244.12712 251.96167 Tm +(GHIDXOW) Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 270.98462 251.96167 Tm +(SDVVZRUG) Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 307.08212 251.96167 Tm +(LV) Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 314.55963 251.96167 Tm +() Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 317.61963 251.96167 Tm +<0013005B00130013001300130013001300130013020A> Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 362.88962 251.96167 Tm +() Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 87.84 221.84033 Tm +() Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 94.132 221.84033 Tm +( ) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 97.4265 221.84033 Tm +(WR) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 104.64799 221.84033 Tm +(GRZQORDG) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 133.17099 221.84033 Tm +(IHDWXUHV) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 157.78349 221.84033 Tm +(RU) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 165.11499 221.84033 Tm +(WHPSODWHV) Tj +ET +BT +/F6 9 Tf +0 0 0 rg +1 0 0 1 213.84479 221.84033 Tm +('RZQ&KDU) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 129.84 192.26031 Tm +(\)XQFWLRQ) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 155.862 192.26031 Tm +(GHVFULSWLRQ) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 190.62601 192.26031 Tm +(7KH) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 202.61401 192.26031 Tm +(KRVW) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 216.55202 192.26031 Tm +(FRPSXWHU) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 245.65802 192.26031 Tm +(GRZQORDGV) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 278.07001 192.26031 Tm +(WKH) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 288.888 192.26031 Tm +(IHDWXUH) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 310.99799 192.26031 Tm +(ILOH) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 321.10199 192.26031 Tm +(WR) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 328.45798 192.26031 Tm +(D) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 333.38397 192.26031 Tm +(IHDWXUH) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 355.49396 192.26031 Tm +(EXIIHU) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 374.44196 192.26031 Tm +(RI) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 381.69595 192.26031 Tm +(WKH) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 129.84 176.6604 Tm +(PRGXOH) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 154.578 176.6604 Tm +(,QSXW) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 171.444 176.6604 Tm +(SDUDPHWHU) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 204.534 176.6604 Tm +(%XIIHU,') Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 230.106 176.6604 Tm +( EXIIHU) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 250.854 176.6604 Tm +(QXPEHU ) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 129.84 161.06061 Tm +(5HWXUQ) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 145.392 161.06061 Tm +(SDUDPHWHU) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 170.2095 161.06061 Tm +(FRQILUPDWLRQ) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 198.6315 161.06061 Tm +(ZRUG) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 129.84 145.46082 Tm +(&RPPDQG) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 165.967 145.46082 Tm +(FRGH) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 185.511 145.46082 Tm +([) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 87.84 129.8609 Tm +(,QVWUXFWLRQ) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 114.89 129.8609 Tm +(SDFNHW) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 131.765 129.8609 Tm +(IRUPDW) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 96.2999 113.78119 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 104.6199 113.78119 Tm +(E\\WHV) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 160.86011 113.78119 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 169.18011 113.78119 Tm +(E\\WHV) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 228.06 113.78119 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 236.38 113.78119 Tm +(E\\WH) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 289.9805 113.78119 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 298.30051 113.78119 Tm +(E\\WHV) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 357.12061 113.78119 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 365.44061 113.78119 Tm +(E\\WH) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 421.68188 113.78119 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 430.00189 113.78119 Tm +(E\\WH) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 483.66229 113.78119 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 491.9823 113.78119 Tm +(E\\WHV) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 104.22 97.70032 Tm +(%DRWRX) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 158.2803 97.70032 Tm +(0RGXOH) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 179.3288 97.70032 Tm +(DGGUHVV) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 228.0602 97.70032 Tm +(3DFNDJH) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 251.0502 97.70032 Tm +(,') Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 292.62051 97.70032 Tm +(SDFNDJH) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 309.38052 97.70032 Tm +(OHQJWK) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 357.12091 97.70032 Tm +(VFULSW) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 416.4606 97.70032 Tm +(EXIIHU) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 435.4086 97.70032 Tm +(QXPEHU) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 486.30029 97.70032 Tm +(FKHFNVXP) Tj +ET +BT +/F5 9.5 Tf +0 0 0 rg +1 0 0 1 98.94 81.6203 Tm +([HI) Tj +ET +BT +/F5 10.5 Tf +0 0 0 rg +1 0 0 1 168.72079 81.6203 Tm +(;;;;) Tj +ET +BT +/F5 10.5 Tf +0 0 0 rg +1 0 0 1 233.2822 81.6203 Tm +([) Tj +ET +BT +/F5 9 Tf +0 0 0 rg +1 0 0 1 292.6228 81.6203 Tm +([) Tj +ET +BT +/F5 10.5 Tf +0 0 0 rg +1 0 0 1 362.34381 81.6203 Tm +([) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 416.40521 81.6203 Tm +(%XIIHU,') Tj +ET +BT +/F5 10.5 Tf +0 0 0 rg +1 0 0 1 494.16599 81.6203 Tm +(6XP) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 267.95999 45.86041 Tm +(WKH) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 275.172 45.86041 Tm +(ILUVW) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 283.63199 45.86041 Tm +(WZHQW\\) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 297.47198 45.86041 Tm +(RQH) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 305.65997 45.86041 Tm +(SDJHV) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 318.03598 45.86041 Tm +(RI) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 322.87198 45.86041 Tm +() Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 328.48798 45.86041 Tm +(3DJH) Tj +ET + +endstream +endobj +935 0 obj +<< +/Length 2 +>> +stream +q + +endstream +endobj +936 0 obj +<< +/Length 2731 +/Filter /FlateDecode +>> +stream +x[ێ} `VBdV#lY|}x陮j0ޝ3u&,_>ew_y׻˫|Oo~ۛ/>?UN*%%\n ѫhKYR{]tzSYurlV:ß&/HJ) ~[tX??~ˋOd+|,'lX.WhϧR+qElG|> +;ƩM<إv=xܗyƏJ(wlomhZ{KE#5 qk_qKExTHwfv| m[NGe,Gdӷ1n6&T/ݍ׻GFT֧(/??||զMۏqV%#okCjhRb{ni6˰AmSSj#L4I6j3.A'LAĔ!21Wp)J.o\@87ďG xGf}h 1>i]1uM5Dg,mY?4}E61az1;b1H.32Q:֨ v sx+ w$8`sYێجXY?3j<#?TА%guzcaĜԚM|}P[ޗhHC f5d}ۛٯBpI1Rw}uƯ]6n41]ŨΔٍ+͕q`5|o2a* i [h&GDg3T o {&:C/?`b 5`X/FYB~^DWn ,Ľ&_ZTֻ\w4/%,p [Sܑ JWqhk4 ^bțSS7[3efa;8(&ύ,n|a4ydGv%'\b];##lUKv&lAZ;}Ja?AJ(eQ0z `}4ÏG`@H#i $8(rxaa[.2 ?pɮS>d0ӧg!x7홬+32Y19NϞ5@<ӡ=)bS͑bRŢYղ0mY0Bhޤ 8/#' [Yw=1Ж1}I4D0p}6ÑnH=H\fh̞YyΖvnjM/tdrA G\l1ujƲשTmujδGc:5*ڶש9s$՞^7bM|;&wj(>-kXmWW;-Le߄0OxåE:m}P-+Jd0;SٕݨgJ~.KwEz:7 W +endstream +endobj +937 0 obj +<< +/Length 37141 +>> +stream +Q +1 0 0 1 0 0 cm +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 377.35162 781.10431 Tm +(+DQJ]KRX) Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 415.64661 781.10431 Tm +(=KLDQ) Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 437.2991 781.10431 Tm +(7HFKQRORJ\\) Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 479.96661 781.10431 Tm +(&R) Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 495.21411 781.10431 Tm +(/WG) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 132.78 758.0603 Tm +(1RWH) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 151.097 758.0603 Tm +(7KH) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 164.084 758.0603 Tm +(%XIIHU,'V) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 194.9005 758.0603 Tm +(RI) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 202.759 758.0603 Tm +(WKH) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 214.4785 758.0603 Tm +(EXIIHU) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 235.00549 758.0603 Tm +(&KDU%XIIHU) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 273.93399 758.0603 Tm +(DQG) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 287.285 758.0603 Tm +(&KDU%XIIHU) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 326.2135 758.0603 Tm +(DUH) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 337.90051 758.0603 Tm +([) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 354.18301 758.0603 Tm +(DQG) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 367.53403 758.0603 Tm +([) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 383.81653 758.0603 Tm +(UHVSHFWLYHO\\) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 423.47952 758.0603 Tm +(5HVSRQVH) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 87.84 742.46039 Tm +(SDFNHW) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 109.7775 742.46039 Tm +(IRUPDW) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 96.2999 726.3808 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 104.6199 726.3808 Tm +(E\\WHV) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 160.86011 726.3808 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 169.18011 726.3808 Tm +(E\\WHV) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 228.06 726.3808 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 236.38 726.3808 Tm +(E\\WH) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 289.9805 726.3808 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 298.30051 726.3808 Tm +(E\\WHV) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 357.12061 726.3808 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 365.44061 726.3808 Tm +(E\\WH) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 419.0412 726.3808 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 427.36121 726.3808 Tm +(E\\WHV) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 104.22 710.30029 Tm +(%DRWRX) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 158.2803 710.30029 Tm +(0RGXOH) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 179.3288 710.30029 Tm +(DGGUHVV) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 228.0602 710.30029 Tm +(3DFNDJH) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 251.0502 710.30029 Tm +(,') Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 292.62051 710.30029 Tm +(SDFNDJH) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 309.38052 710.30029 Tm +(OHQJWK) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 357.12091 710.30029 Tm +(FRQILUPDWLRQ) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 382.38492 710.30029 Tm +(FRGH) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 421.68121 710.30029 Tm +(FKHFNVXP) Tj +ET +BT +/F5 9.5 Tf +0 0 0 rg +1 0 0 1 98.94 694.22028 Tm +([HI) Tj +ET +BT +/F5 10.5 Tf +0 0 0 rg +1 0 0 1 168.72079 694.22028 Tm +(;;;;) Tj +ET +BT +/F5 10.5 Tf +0 0 0 rg +1 0 0 1 233.2822 694.22028 Tm +([) Tj +ET +BT +/F5 9 Tf +0 0 0 rg +1 0 0 1 292.6228 694.22028 Tm +([) Tj +ET +BT +/F5 10.5 Tf +0 0 0 rg +1 0 0 1 370.26401 694.22028 Tm +(;) Tj +ET +BT +/F5 10.5 Tf +0 0 0 rg +1 0 0 1 429.54489 694.22028 Tm +(6XP) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 87.84 678.08032 Tm +('DWD) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 101.4415 678.08032 Tm +(SDFNHW) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 120.004 678.08032 Tm +( ZLWK) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 134.21049 678.08032 Tm +(VXEVHTXHQW) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 166.06099 678.08032 Tm +(SDFNHWV ) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 188.90799 678.08032 Tm +(IRUPDW) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 96.2999 662.00061 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 104.6199 662.00061 Tm +(E\\WHV) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 160.86011 662.00061 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 169.18011 662.00061 Tm +(E\\WHV) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 228.06 662.00061 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 236.38 662.00061 Tm +(E\\WH) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 289.9805 662.00061 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 298.30051 662.00061 Tm +(E\\WHV) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 354.4809 662.00061 Tm +(1) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 364.68091 662.00061 Tm +(E\\WHV) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 419.0412 662.00061 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 427.36121 662.00061 Tm +(E\\WHV) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 104.22 645.92029 Tm +(%DRWRX) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 158.2803 645.92029 Tm +(0RGXOH) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 179.3288 645.92029 Tm +(DGGUHVV) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 228.0602 645.92029 Tm +(3DFNDJH) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 251.0502 645.92029 Tm +(,') Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 292.62051 645.92029 Tm +(SDFNDJH) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 309.38052 645.92029 Tm +(OHQJWK) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 357.12091 645.92029 Tm +(3DFNDJH) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 373.84091 645.92029 Tm +(&RQWHQWV) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 421.68121 645.92029 Tm +(FKHFNVXP) Tj +ET +BT +/F5 9.5 Tf +0 0 0 rg +1 0 0 1 98.94 629.78027 Tm +([HI) Tj +ET +BT +/F5 10.5 Tf +0 0 0 rg +1 0 0 1 168.7666 629.78027 Tm +(;;;;) Tj +ET +BT +/F5 10.5 Tf +0 0 0 rg +1 0 0 1 233.3382 629.78027 Tm +([) Tj +ET +BT +/F5 10.5 Tf +0 0 0 rg +1 0 0 1 300.44751 629.78027 Tm +(1) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 351.87851 629.78027 Tm +(WHPSODWH) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 378.7525 629.78027 Tm +(GDWD) Tj +ET +BT +/F5 10.5 Tf +0 0 0 rg +1 0 0 1 429.57309 629.78027 Tm +(6XP) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 87.84 613.70032 Tm +(\(QG) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 100.134 613.70032 Tm +(SDFNHW) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 120.384 613.70032 Tm +( QR) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 131.082 613.70032 Tm +(VXEVHTXHQW) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 165.828 613.70032 Tm +(SDFNHWV ) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 190.752 613.70032 Tm +(IRUPDW) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 96.2999 597.62061 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 104.6199 597.62061 Tm +(E\\WHV) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 160.86011 597.62061 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 169.18011 597.62061 Tm +(E\\WHV) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 228.06 597.62061 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 236.38 597.62061 Tm +(E\\WH) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 289.9805 597.62061 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 298.30051 597.62061 Tm +(E\\WHV) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 354.4809 597.62061 Tm +(1) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 364.68091 597.62061 Tm +(E\\WHV) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 419.0412 597.62061 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 427.36121 597.62061 Tm +(E\\WHV) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 104.22 581.48029 Tm +(%DRWRX) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 158.2803 581.48029 Tm +(0RGXOH) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 179.3288 581.48029 Tm +(DGGUHVV) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 228.0602 581.48029 Tm +(3DFNDJH) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 251.0502 581.48029 Tm +(,') Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 292.62051 581.48029 Tm +(SDFNDJH) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 309.38052 581.48029 Tm +(OHQJWK) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 357.12091 581.48029 Tm +(3DFNDJH) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 373.84091 581.48029 Tm +(&RQWHQWV) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 421.68121 581.48029 Tm +(FKHFNVXP) Tj +ET +BT +/F5 9.5 Tf +0 0 0 rg +1 0 0 1 98.94 565.40033 Tm +([HI) Tj +ET +BT +/F5 10.5 Tf +0 0 0 rg +1 0 0 1 168.7666 565.40033 Tm +(;;;;) Tj +ET +BT +/F5 10.5 Tf +0 0 0 rg +1 0 0 1 233.3382 565.40033 Tm +([) Tj +ET +BT +/F5 10.5 Tf +0 0 0 rg +1 0 0 1 300.44751 565.40033 Tm +(1) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 351.87851 565.40033 Tm +(WHPSODWH) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 378.7525 565.40033 Tm +(GDWD) Tj +ET +BT +/F5 10.5 Tf +0 0 0 rg +1 0 0 1 429.57309 565.40033 Tm +(6XP) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 132.78 549.26031 Tm +(1RWH) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 146.87 549.26031 Tm +() Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 152.37 549.26031 Tm +(&RQILUPDWLRQ) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 184.70999 549.26031 Tm +(FRGH [) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 211.41499 549.26031 Tm +(PHDQV) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 228.5 549.26031 Tm +(WKDW) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 239.30499 549.26031 Tm +(VXEVHTXHQW) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 268.25998 549.26031 Tm +(GDWD) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 280.04999 549.26031 Tm +(SDFNHWV) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 299.31998 549.26031 Tm +(FDQ) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 308.91498 549.26031 Tm +(EH) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 316.10999 549.26031 Tm +(UHFHLYHG) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 169.5605 533.6604 Tm +(&RQILUPDWLRQ) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 195.4325 533.6604 Tm +(FRGH [) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 216.79649 533.6604 Tm +(PHDQV) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 230.46449 533.6604 Tm +(WKHUH) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 241.58449 533.6604 Tm +(LV) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 245.57249 533.6604 Tm +(DQ) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 251.32849 533.6604 Tm +(HUURU) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 262.00049 533.6604 Tm +(LQ) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 266.54449 533.6604 Tm +(UHFHLYLQJ) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 284.6965 533.6604 Tm +(WKH) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 291.90851 533.6604 Tm +(SDFNDJH) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 169.5605 518.06061 Tm +(&RQILUPDWLRQ) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 198.6665 518.06061 Tm +(FRGH [H) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 222.66501 518.06061 Tm +(PHDQV) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 238.0415 518.06061 Tm +(WKDW) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 247.76601 518.06061 Tm +(VXEVHTXHQW) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 273.8255 518.06061 Tm +(GDWD) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 284.43649 518.06061 Tm +(SDFNHWV) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 301.77948 518.06061 Tm +(FDQQRW) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 317.54297 518.06061 Tm +(EH) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 324.01846 518.06061 Tm +(UHFHLYHG) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 153.77582 502.46078 Tm +() Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 156.06381 502.46078 Tm +() Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 158.17581 502.46078 Tm +(6HQG) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 168.59981 502.46078 Tm +(WKH) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 175.81181 502.46078 Tm +(FRPPDQG) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 195.84781 502.46078 Tm +(SDFNHW) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 210.41982 502.46078 Tm +(DQG) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 218.63582 502.46078 Tm +(WKH) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 225.84782 502.46078 Tm +(PRGXOH) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 241.26782 502.46078 Tm +(ZLOO) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 248.54782 502.46078 Tm +(UHFHLYH) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 262.99182 502.46078 Tm +(WKH) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 270.20383 502.46078 Tm +(GDWD) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 279.63583 502.46078 Tm +(SDFNHW) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 293.13583 502.46078 Tm +(RU) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 298.24783 502.46078 Tm +(HQG) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 306.47583 502.46078 Tm +(WKH) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 313.68784 502.46078 Tm +(SDFNHW) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 327.18784 502.46078 Tm +(DIWHU) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 337.19983 502.46078 Tm +(WKH) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 344.41183 502.46078 Tm +(PRGXOH) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 359.83185 502.46078 Tm +(UHVSRQGV) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 153.9008 486.8609 Tm +() Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 158.3008 486.8609 Tm +(7KH) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 166.2928 486.8609 Tm +(YDOXH) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 177.3688 486.8609 Tm +(RI) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 182.2048 486.8609 Tm +(WKH) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 189.41681 486.8609 Tm +(QXPEHU) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 205.5088 486.8609 Tm +(RI) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 210.3448 486.8609 Tm +(E\\WHV) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 221.50081 486.8609 Tm +(RI) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 226.33681 486.8609 Tm +(SDFNDJH) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 243.0968 486.8609 Tm +(FRQWHQW) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 258.56479 486.8609 Tm +(1) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 262.64478 486.8609 Tm +(LV) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 266.63278 486.8609 Tm +(GHWHUPLQHG) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 289.70078 486.8609 Tm +(E\\) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 295.24078 486.8609 Tm +(WKH) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 302.45279 486.8609 Tm +(OHQJWK) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 315.62878 486.8609 Tm +(RI) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 320.46478 486.8609 Tm +(WKH) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 327.67679 486.8609 Tm +(SDFNDJH) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 344.4368 486.8609 Tm +(FRQWHQW) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 360.97681 486.8609 Tm +(7KH) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 368.96881 486.8609 Tm +(OHQJWK) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 382.14481 486.8609 Tm +(RI) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 386.9808 486.8609 Tm +(WKH) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 394.19281 486.8609 Tm +(SDFNDJH) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 410.95282 486.8609 Tm +(FRQWHQW) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 426.42081 486.8609 Tm +(LQ) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 430.96481 486.8609 Tm +(WKH) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 438.17682 486.8609 Tm +(IDFWRU\\) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 452.31281 486.8609 Tm +(LV) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 456.30081 486.8609 Tm +(VHW) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 462.95682 486.8609 Tm +(WR) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 467.86081 486.8609 Tm +() Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 475.7648 486.8609 Tm +(E\\WHV) Tj +ET +BT +/F6 7 Tf +0 0 0 rg +1 0 0 1 87.84 471.26099 Tm +() Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 96.408 471.26099 Tm +(,QVWUXFWLRQ) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 134.278 471.26099 Tm +(SDFNHW) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 157.903 471.26099 Tm +(FKHFNVXP) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 192.679 471.26099 Tm +( ) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 194.77901 471.26099 Tm +() Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 200.60301 471.26099 Tm +(E\\WHV ) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 224.41 471.26099 Tm +(3DFNDJH) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 253.67 471.26099 Tm +(,') Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 262.97299 471.26099 Tm +( ) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 265.073 471.26099 Tm +() Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 270.897 471.26099 Tm +(E\\WH ) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 287.34702 471.26099 Tm +() Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 291.35101 471.26099 Tm +(3DFNHW) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 314.90601 471.26099 Tm +(OHQJWK) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 337.96399 471.26099 Tm +( ) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 340.064 471.26099 Tm +() Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 345.888 471.26099 Tm +(E\\WHV ) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 365.69101 471.26099 Tm +() Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 369.69501 471.26099 Tm +(VFULSW) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 389.75702 471.26099 Tm +( ) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 391.85703 471.26099 Tm +() Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 397.68103 471.26099 Tm +(E\\WH ) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 414.13104 471.26099 Tm +() Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 418.13504 471.26099 Tm +(EXIIHU) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 440.24103 471.26099 Tm +(QXPEHU) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 468.40204 471.26099 Tm +( ) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 470.50204 471.26099 Tm +() Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 476.32605 471.26099 Tm +(E\\WH ) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 492.77606 471.26099 Tm +() Tj +ET +BT +/F6 6.5 Tf +0 0 0 rg +1 0 0 1 87.841 455.66119 Tm +() Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 95.797 455.66119 Tm +($QVZHU) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 120.23051 455.66119 Tm +(SDFNHW) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 142.168 455.66119 Tm +(FKHFNVXP) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 174.45999 455.66119 Tm +( ) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 176.40999 455.66119 Tm +() Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 181.81799 455.66119 Tm +(E\\WHV ) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 203.9245 455.66119 Tm +(3DFNDJH) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 231.0945 455.66119 Tm +(,') Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 239.733 455.66119 Tm +( ) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 241.683 455.66119 Tm +() Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 247.091 455.66119 Tm +(E\\WH ) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 262.366 455.66119 Tm +() Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 266.08398 455.66119 Tm +(3DFNHW) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 287.95648 455.66119 Tm +(OHQJWK) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 309.36749 455.66119 Tm +( ) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 311.3175 455.66119 Tm +() Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 316.72549 455.66119 Tm +(E\\WHV ) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 335.11398 455.66119 Tm +() Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 338.83197 455.66119 Tm +(FRQILUPDWLRQ) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 379.88599 455.66119 Tm +(FRGH) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 396.29199 455.66119 Tm +( ) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 398.242 455.66119 Tm +() Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 403.64999 455.66119 Tm +(E\\WH ) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 418.92499 455.66119 Tm +() Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 87.8421 440.0614 Tm +() Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 94.5741 440.0614 Tm +(7KH) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 105.5631 440.0614 Tm +(FKHFNVXP) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 132.8871 440.0614 Tm +(LV) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 138.37061 440.0614 Tm +(DGGHG) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 156.1356 440.0614 Tm +(LQ) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 162.38361 440.0614 Tm +(E\\WHV) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 179.19711 440.0614 Tm +(WKH) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 189.11362 440.0614 Tm +(FDUU\\) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 203.61711 440.0614 Tm +(RYHU) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 216.54211 440.0614 Tm +() Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 221.11812 440.0614 Tm +(E\\WHV) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 236.45761 440.0614 Tm +(LV) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 241.94112 440.0614 Tm +(LJQRUHG) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 265.12912 440.0614 Tm +(DQG) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 276.42612 440.0614 Tm +(WKH) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 286.34262 440.0614 Tm +(KLJK) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 299.37213 440.0614 Tm +(E\\WH) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 312.07712 440.0614 Tm +(FRPHV) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 330.35361 440.0614 Tm +(ILUVW) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 341.98611 440.0614 Tm +(ZKHQ) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 357.6391 440.0614 Tm +(WUDQVPLWWLQJ) Tj +ET +BT +/F6 7.5 Tf +0 0 0 rg +1 0 0 1 87.8421 424.46149 Tm +() Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 97.0221 424.46149 Tm +(7KH) Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 112.0071 424.46149 Tm +(GHIDXOW) Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 138.86461 424.46149 Tm +(PRGXOH) Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 167.77711 424.46149 Tm +(DGGUHVV) Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 197.67212 424.46149 Tm +(LV) Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 205.14961 424.46149 Tm +() Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 208.20961 424.46149 Tm +([IIIIIIII) Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 240.16711 424.46149 Tm +() Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 244.12712 424.46149 Tm +(GHIDXOW) Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 270.98462 424.46149 Tm +(SDVVZRUG) Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 307.08212 424.46149 Tm +(LV) Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 314.55963 424.46149 Tm +() Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 317.61963 424.46149 Tm +<0013005B00130013001300130013001300130013020A> Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 362.88962 424.46149 Tm +() Tj +ET +BT +/F7 7.5 Tf +0 0 0 rg +1 0 0 1 87.84 394.3403 Tm +() Tj +ET +BT +/F7 7.5 Tf +0 0 0 rg +1 0 0 1 96.42 394.3403 Tm +( ) Tj +ET +BT +/F7 7.5 Tf +0 0 0 rg +1 0 0 1 100.9125 394.3403 Tm +(WR) Tj +ET +BT +/F7 7.5 Tf +0 0 0 rg +1 0 0 1 110.75999 394.3403 Tm +(VWRUH) Tj +ET +BT +/F7 7.5 Tf +0 0 0 rg +1 0 0 1 132.1725 394.3403 Tm +(WHPSODWHV) Tj +ET +BT +/F7 7.5 Tf +0 0 0 rg +1 0 0 1 172.155 394.3403 Tm +(6WRUH) Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 129.84 364.76031 Tm +(\)XQFWLRQ) Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 162.36749 364.76031 Tm +(GHVFULSWLRQ) Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 205.82249 364.76031 Tm +(VWRUH) Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 225.9375 364.76031 Tm +(WKH) Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 239.46001 364.76031 Tm +(WHPSODWH) Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 273.05249 364.76031 Tm +(GDWD) Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 290.73749 364.76031 Tm +(LQ) Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 299.25748 364.76031 Tm +(WKH) Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 312.77997 364.76031 Tm +(VSHFLILHG) Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 346.05746 364.76031 Tm +(IHDWXUH) Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 373.69498 364.76031 Tm +(EXIIHU) Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 397.37997 364.76031 Tm +( &KDU%XIIHU) Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 444.54749 364.76031 Tm +(RU) Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 454.13248 364.76031 Tm +(&KDU%XIIHU ) Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 501.29999 364.76031 Tm +(WR) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 182.34 349.15732 Tm +(\)ODVK) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 195.815 349.15732 Tm +(6SHFLI\\) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 213.715 349.15732 Tm +(WKH) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 222.73 349.15732 Tm +(ORFDWLRQ) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 242.75999 349.15732 Tm +(LQ) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 248.44 349.15732 Tm +(WKH) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 257.45502 349.15732 Tm +(ILQJHUSULQW) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 284.14001 349.15732 Tm +(OLEUDU\\) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 129.84 333.56061 Tm +(,QSXW) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 148.1115 333.56061 Tm +(SDUDPHWHUV) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 187.07249 333.56061 Tm +(%XIIHU,') Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 214.7755 333.56061 Tm +( EXIIHU) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 237.2525 333.56061 Tm +(QXPEHU ) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 265.35199 333.56061 Tm +() Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 270.75998 333.56061 Tm +(3DJH,') Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 294.64099 333.56061 Tm +( ILQJHUSULQW) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 331.28149 333.56061 Tm +(OLEUDU\\) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 352.6535 333.56061 Tm +(ORFDWLRQ) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 378.6925 333.56061 Tm +(QXPEHU) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 406.58401 333.56061 Tm +(WZR) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 419.66202 333.56061 Tm +(E\\WHV) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 439.53253 333.56061 Tm +(KLJK) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 454.93103 333.56061 Tm +(E\\WH) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 469.94604 333.56061 Tm +(ILUVW ) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 487.38556 333.56061 Tm +(5HWXUQ) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 129.84 317.96082 Tm +(SDUDPHWHU) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 165.6875 317.96082 Tm +(FRQILUPDWLRQ) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 206.7415 317.96082 Tm +(ZRUG) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 129.84 302.3609 Tm +(&RPPDQG) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 165.967 302.3609 Tm +(FRGH) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 185.511 302.3609 Tm +([) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 87.84 286.76099 Tm +(,QVWUXFWLRQ) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 114.89 286.76099 Tm +(SDFNHW) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 131.765 286.76099 Tm +(IRUPDW) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 92.2805 270.6814 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 100.6005 270.6814 Tm +(E\\WHV) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 148.741 270.6814 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 157.061 270.6814 Tm +(E\\WHV) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 207.8412 270.6814 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 216.16119 270.6814 Tm +(E\\WH) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 261.66199 270.6814 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 269.98199 270.6814 Tm +(E\\WHV) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 320.82211 270.6814 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 329.14212 270.6814 Tm +(E\\WH) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 377.3425 270.6814 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 385.66251 270.6814 Tm +(E\\WH) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 431.16339 270.6814 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 439.4834 270.6814 Tm +(E\\WHV) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 487.68369 270.6814 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 496.00369 270.6814 Tm +(E\\WHV) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 100.14 254.60028 Tm +(%DRWRX) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 146.0995 254.60028 Tm +(0RGXOH) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 167.14801 254.60028 Tm +(DGGUHVV) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 207.8396 254.60028 Tm +(3DFNDJH) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 230.82961 254.60028 Tm +(,') Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 264.2991 254.60028 Tm +(SDFNDJH) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 281.05911 254.60028 Tm +(OHQJWK) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 320.81949 254.60028 Tm +(VFULSW) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 372.11938 254.60028 Tm +(EXIIHU) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 391.06738 254.60028 Tm +(QXPEHU) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 433.7995 254.60028 Tm +(ORFDWLRQ) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 449.82349 254.60028 Tm +(QXPEHU) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 490.32001 254.60028 Tm +(FKHFNVXP) Tj +ET +BT +/F5 9.5 Tf +0 0 0 rg +1 0 0 1 94.86 238.52026 Tm +([HI) Tj +ET +BT +/F5 10.5 Tf +0 0 0 rg +1 0 0 1 156.601 238.52026 Tm +(;;;;) Tj +ET +BT +/F5 10.5 Tf +0 0 0 rg +1 0 0 1 213.06149 238.52026 Tm +([) Tj +ET +BT +/F5 9 Tf +0 0 0 rg +1 0 0 1 264.30261 238.52026 Tm +([) Tj +ET +BT +/F5 10.5 Tf +0 0 0 rg +1 0 0 1 326.04349 238.52026 Tm +([) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 372.0639 238.52026 Tm +(%XIIHU,') Tj +ET +BT +/F5 9 Tf +0 0 0 rg +1 0 0 1 433.80389 238.52026 Tm +(3DJH,') Tj +ET +BT +/F5 10.5 Tf +0 0 0 rg +1 0 0 1 498.1846 238.52026 Tm +(6XP) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 159.07199 222.38031 Tm +(1RWH) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 178.79799 222.38031 Tm +(7KH) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 192.784 222.38031 Tm +(%XIIHU,'V) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 225.97099 222.38031 Tm +(RI) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 234.43399 222.38031 Tm +(WKH) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 247.05499 222.38031 Tm +(EXIIHU) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 269.16098 222.38031 Tm +(&KDU%XIIHU) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 311.08398 222.38031 Tm +(DQG) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 325.46198 222.38031 Tm +(&KDU%XIIHU) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 367.38498 222.38031 Tm +(DUH) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 379.97098 222.38031 Tm +([) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 397.50598 222.38031 Tm +(DQG) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 411.88397 222.38031 Tm +([) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 429.41898 222.38031 Tm +(UHVSHFWLYHO\\) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 87.84 206.78052 Tm +(5HVSRQVH) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 111.87 206.78052 Tm +(SDFNHW) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 128.745 206.78052 Tm +(IRUPDW) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 96.2999 190.70068 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 104.6199 190.70068 Tm +(E\\WHV) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 160.86011 190.70068 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 169.18011 190.70068 Tm +(E\\WHV) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 228.06 190.70068 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 236.38 190.70068 Tm +(E\\WH) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 289.9805 190.70068 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 298.30051 190.70068 Tm +(E\\WHV) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 357.12061 190.70068 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 365.44061 190.70068 Tm +(E\\WH) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 419.0412 190.70068 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 427.36121 190.70068 Tm +(E\\WHV) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 104.22 174.6203 Tm +(%DRWRX) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 158.2803 174.6203 Tm +(0RGXOH) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 179.3288 174.6203 Tm +(DGGUHVV) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 228.0602 174.6203 Tm +(3DFNDJH) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 251.0502 174.6203 Tm +(,') Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 292.62051 174.6203 Tm +(SDFNDJH) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 309.38052 174.6203 Tm +(OHQJWK) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 357.12091 174.6203 Tm +(FRQILUPDWLRQ) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 382.38492 174.6203 Tm +(FRGH) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 421.68121 174.6203 Tm +(FKHFNVXP) Tj +ET +BT +/F5 9.5 Tf +0 0 0 rg +1 0 0 1 98.94 158.48029 Tm +([HI) Tj +ET +BT +/F5 10.5 Tf +0 0 0 rg +1 0 0 1 168.72079 158.48029 Tm +(;;;;) Tj +ET +BT +/F5 10.5 Tf +0 0 0 rg +1 0 0 1 233.2822 158.48029 Tm +([) Tj +ET +BT +/F5 9 Tf +0 0 0 rg +1 0 0 1 292.6228 158.48029 Tm +([) Tj +ET +BT +/F5 10.5 Tf +0 0 0 rg +1 0 0 1 370.26401 158.48029 Tm +(;) Tj +ET +BT +/F5 10.5 Tf +0 0 0 rg +1 0 0 1 429.54489 158.48029 Tm +(6XP) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 132.78 142.40027 Tm +(1RWH) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 146.87 142.40027 Tm +(&RQILUPDWLRQ) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 179.20999 142.40027 Tm +(FRGH [) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 205.91499 142.40027 Tm +(PHDQV) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 223 142.40027 Tm +(WKH) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 232.015 142.40027 Tm +(VWRUDJH) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 251.30499 142.40027 Tm +(LV) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 256.28998 142.40027 Tm +(VXFFHVVIXO) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 153.78 126.80042 Tm +(&RQILUPDWLRQ) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 179.65199 126.80042 Tm +(FRGH [) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 201.01599 126.80042 Tm +(PHDQV) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 214.68399 126.80042 Tm +(WKHUH) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 225.80399 126.80042 Tm +(LV) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 229.79199 126.80042 Tm +(DQ) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 235.54799 126.80042 Tm +(HUURU) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 246.21999 126.80042 Tm +(LQ) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 250.76399 126.80042 Tm +(UHFHLYLQJ) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 268.91599 126.80042 Tm +(WKH) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 276.12799 126.80042 Tm +(SDFNDJH) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 153.78 111.20062 Tm +(&RQILUPDWLRQ) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 186.12 111.20062 Tm +(FRGH [E) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 213.03999 111.20062 Tm +(PHDQV) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 230.125 111.20062 Tm +(WKDW) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 240.92999 111.20062 Tm +(3DJH,') Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 259.29999 111.20062 Tm +(LV) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 264.28497 111.20062 Tm +(EH\\RQG) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 283.21997 111.20062 Tm +(WKH) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 292.23499 111.20062 Tm +(UDQJH) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 307.38998 111.20062 Tm +(RI) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 313.435 111.20062 Tm +(ILQJHUSULQW) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 153.78 95.60083 Tm +(GDWDEDVH) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 178.005 95.60083 Tm +(&RQILUPDWLRQ) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 210.345 95.60083 Tm +(FRGH ) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 224.52499 95.60083 Tm +([) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 237.04999 95.60083 Tm +(PHDQV) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 254.13499 95.60083 Tm +(WR) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 260.26498 95.60083 Tm +(ZULWH) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 273.47498 95.60083 Tm +(\)/$6+) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 289.63498 95.60083 Tm +(HUURU) Tj +ET +BT +/F6 7 Tf +0 0 0 rg +1 0 0 1 87.8389 80.00092 Tm +() Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 96.4069 80.00092 Tm +(,QVWUXFWLRQ) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 134.2769 80.00092 Tm +(SDFNHW) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 157.9019 80.00092 Tm +(FKHFNVXP) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 192.6779 80.00092 Tm +( ) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 194.77791 80.00092 Tm +() Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 200.60191 80.00092 Tm +(E\\WHV ) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 224.40891 80.00092 Tm +(3DFNDJH) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 253.6689 80.00092 Tm +(,') Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 262.97189 80.00092 Tm +( ) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 265.0719 80.00092 Tm +() Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 270.8959 80.00092 Tm +(E\\WH ) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 287.34592 80.00092 Tm +() Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 291.34991 80.00092 Tm +(3DFNHW) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 314.90491 80.00092 Tm +(OHQJWK) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 337.96289 80.00092 Tm +( ) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 340.0629 80.00092 Tm +() Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 345.8869 80.00092 Tm +(E\\WHV ) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 365.68991 80.00092 Tm +() Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 369.69391 80.00092 Tm +(VFULSW) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 389.75592 80.00092 Tm +( ) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 391.85593 80.00092 Tm +() Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 397.67993 80.00092 Tm +(E\\WH ) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 414.12994 80.00092 Tm +() Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 418.13394 80.00092 Tm +(EXIIHU) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 440.23993 80.00092 Tm +(QXPEHU) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 468.40094 80.00092 Tm +( ) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 470.50095 80.00092 Tm +() Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 476.32495 80.00092 Tm +(E\\WH ) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 267.95999 45.86041 Tm +(WKH) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 275.172 45.86041 Tm +(ILUVW) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 283.63199 45.86041 Tm +(WZHQW\\) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 297.47198 45.86041 Tm +(WZR) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 305.51999 45.86041 Tm +(SDJHV) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 317.896 45.86041 Tm +(RI) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 322.73199 45.86041 Tm +() Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 328.34799 45.86041 Tm +(3DJH) Tj +ET + +endstream +endobj +938 0 obj +<< +/Length 2 +>> +stream +q + +endstream +endobj +939 0 obj +<< +/Length 2252 +/Filter /FlateDecode +>> +stream +xZێ7}Z `AffK 8:L_RRUWW-yXƌ#")N_y뇇7oxu:E7?,NϟMJQ&'bTeN9I⫯^NK~( +$U: 9`g|o?M>) &->.h|VBII->qÌށ 跁5|)qxقed ^pӎl9ZH M9fIC/b,P!`D Io1O8n*^ӫ׀n6lF372CPp<9fK!Ye +hLEkRR:xZTM_7´&^`9IEq_.U%'Q[b5_PsB͵eZ1 VqN7^xQ\{sܱ k׃Fbݗї D#d"ЀGfc= +%yV=ˎǺϹ63sc9n`3˙p663%Jqs,8F/lT}g h]KRI:`Z蔓qºRxKp0_DqC' /6Tu_;dx6_=;,41@yt:Ծ8mi췌9.-=ήHµnttʠ&.~VB6vՄb$ `cW;fT*X ` L)C2(U\.uUWas|ZUmQ mXuQbEi +ܸsDѺ3gXoNHx+eW>;S}ǢzP5"DeۜonNqyu HUaK*LC_hz"0nCe[5UY6'^ NT4#~e7`q% =N~ t8خM6<,G+;pMJմ0!Q9 4⼍}inlz-c-^bhn2Nܦ,txg6 -^*(Oa l" qX8=>]4ԔL6~\v= C~~D +ܱ2iUxSڵ$j?#m|FZ6isYg!hzZ)^1Ҽv4#;`Hi4&IyiN`-1uZ;ZB́HZlARVG}U;gH16X>FwQA;ƨrH;@`Kqo]*"*U4i,T9VlT2Y*U(֤hkb!k>a+UN+lCkd'5sTu +endstream +endobj +940 0 obj +<< +/Length 33180 +>> +stream +Q +1 0 0 1 0 0 cm +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 377.35162 781.10431 Tm +(+DQJ]KRX) Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 415.64661 781.10431 Tm +(=KLDQ) Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 437.2991 781.10431 Tm +(7HFKQRORJ\\) Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 479.96661 781.10431 Tm +(&R) Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 495.21411 781.10431 Tm +(/WG) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 208.62 758.0603 Tm +() Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 213.612 758.0603 Tm +(SRVLWLRQ) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 237.966 758.0603 Tm +(QXPEHU) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 262.104 758.0603 Tm +( ) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 263.90399 758.0603 Tm +() Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 268.896 758.0603 Tm +(E\\WHV ) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 285.87 758.0603 Tm +() Tj +ET +BT +/F6 6.5 Tf +0 0 0 rg +1 0 0 1 87.8396 742.46039 Tm +() Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 95.7956 742.46039 Tm +($QVZHU) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 120.2291 742.46039 Tm +(SDFNHW) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 142.1666 742.46039 Tm +(FKHFNVXP) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 174.45859 742.46039 Tm +( ) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 176.40858 742.46039 Tm +() Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 181.81659 742.46039 Tm +(E\\WHV ) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 203.9231 742.46039 Tm +(3DFNDJH) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 231.09309 742.46039 Tm +(,') Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 239.7316 742.46039 Tm +( ) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 241.68159 742.46039 Tm +() Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 247.0896 742.46039 Tm +(E\\WH ) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 262.36459 742.46039 Tm +() Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 266.08258 742.46039 Tm +(3DFNHW) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 287.95508 742.46039 Tm +(OHQJWK) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 309.36609 742.46039 Tm +( ) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 311.3161 742.46039 Tm +() Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 316.72409 742.46039 Tm +(E\\WHV ) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 335.11258 742.46039 Tm +() Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 338.83057 742.46039 Tm +(FRQILUPDWLRQ) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 379.88458 742.46039 Tm +(FRGH) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 396.29059 742.46039 Tm +( ) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 398.2406 742.46039 Tm +() Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 403.64859 742.46039 Tm +(E\\WH ) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 418.92358 742.46039 Tm +() Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 87.8406 726.8606 Tm +() Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 94.5726 726.8606 Tm +(7KH) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 105.5616 726.8606 Tm +(FKHFNVXP) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 132.8856 726.8606 Tm +(LV) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 138.36911 726.8606 Tm +(DGGHG) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 156.13411 726.8606 Tm +(LQ) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 162.38211 726.8606 Tm +(E\\WHV) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 179.19562 726.8606 Tm +(WKH) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 189.11212 726.8606 Tm +(FDUU\\) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 203.61562 726.8606 Tm +(RYHU) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 216.54062 726.8606 Tm +() Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 221.11662 726.8606 Tm +(E\\WHV) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 236.45612 726.8606 Tm +(LV) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 241.93962 726.8606 Tm +(LJQRUHG) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 265.12762 726.8606 Tm +(DQG) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 276.42462 726.8606 Tm +(WKH) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 286.34113 726.8606 Tm +(KLJK) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 299.37064 726.8606 Tm +(E\\WH) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 312.07562 726.8606 Tm +(FRPHV) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 330.35211 726.8606 Tm +(ILUVW) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 341.98462 726.8606 Tm +(ZKHQ) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 357.63763 726.8606 Tm +(WUDQVPLWWLQJ) Tj +ET +BT +/F6 7.5 Tf +0 0 0 rg +1 0 0 1 87.8406 711.2608 Tm +() Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 97.0206 711.2608 Tm +(7KH) Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 112.0056 711.2608 Tm +(GHIDXOW) Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 138.8631 711.2608 Tm +(PRGXOH) Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 167.7756 711.2608 Tm +(DGGUHVV) Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 197.67061 711.2608 Tm +(LV) Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 205.1481 711.2608 Tm +() Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 208.2081 711.2608 Tm +([IIIIIIII) Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 240.1656 711.2608 Tm +() Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 244.12561 711.2608 Tm +(GHIDXOW) Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 270.98312 711.2608 Tm +(SDVVZRUG) Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 307.08063 711.2608 Tm +(LV) Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 314.55814 711.2608 Tm +() Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 317.61813 711.2608 Tm +<0013005B00130013001300130013001300130013020A> Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 362.88812 711.2608 Tm +() Tj +ET +BT +/F7 7 Tf +0 0 0 rg +1 0 0 1 87.84 665.54028 Tm +() Tj +ET +BT +/F7 7 Tf +0 0 0 rg +1 0 0 1 95.848 665.54028 Tm +( ) Tj +ET +BT +/F7 7 Tf +0 0 0 rg +1 0 0 1 100.041 665.54028 Tm +(UHDG) Tj +ET +BT +/F7 7 Tf +0 0 0 rg +1 0 0 1 117.835 665.54028 Tm +(RXW) Tj +ET +BT +/F7 7 Tf +0 0 0 rg +1 0 0 1 131.625 665.54028 Tm +(WKH) Tj +ET +BT +/F7 7 Tf +0 0 0 rg +1 0 0 1 145.21899 665.54028 Tm +(WHPSODWH) Tj +ET +BT +/F7 7 Tf +0 0 0 rg +1 0 0 1 179.05699 665.54028 Tm +(/RDG&KDU) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 129.84 635.96033 Tm +(\)XQFWLRQ) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 153.6935 635.96033 Tm +(GHVFULSWLRQ) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 185.5605 635.96033 Tm +(5HDG) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 199.98151 635.96033 Tm +(WKH) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 209.89801 635.96033 Tm +(ILQJHUSULQW) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 239.25151 635.96033 Tm +(WHPSODWH) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 263.88602 635.96033 Tm +(ZLWK) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 276.4425 635.96033 Tm +(WKH) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 286.35901 635.96033 Tm +(VSHFLILHG) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 310.76251 635.96033 Tm +(,') Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 318.07202 635.96033 Tm +(QXPEHU) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 340.19852 635.96033 Tm +(LQ) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 346.4465 635.96033 Tm +(WKH) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 356.36301 635.96033 Tm +(IODVK) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 370.22299 635.96033 Tm +(GDWDEDVH) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 395.39648 635.96033 Tm +(LQWR) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 406.95749 635.96033 Tm +(WKH) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 416.87399 635.96033 Tm +(WHPSODWH) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 441.50848 635.96033 Tm +(EXIIHU) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 458.87747 635.96033 Tm +(&KDU%XIIHU) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 491.81696 635.96033 Tm +(RU) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 182.34 620.3573 Tm +(&KDU%XIIHU) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 129.84 604.76062 Tm +(,QSXW) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 146.70599 604.76062 Tm +(SDUDPHWHUV) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 182.67 604.76062 Tm +(%XIIHU,') Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 208.242 604.76062 Tm +( EXIIHU) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 228.99001 604.76062 Tm +(QXPEHU ) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 254.92801 604.76062 Tm +() Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 259.92001 604.76062 Tm +(3DJH,') Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 281.96402 604.76062 Tm +( ILQJHUSULQW) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 315.78601 604.76062 Tm +(OLEUDU\\) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 335.51401 604.76062 Tm +(WHPSODWH) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 362.388 604.76062 Tm +(QXPEHU) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 388.134 604.76062 Tm +(WZR) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 400.20599 604.76062 Tm +(E\\WHV) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 418.548 604.76062 Tm +(KLJK) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 432.76199 604.76062 Tm +(E\\WH) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 446.62198 604.76062 Tm +(ILUVW ) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 462.71997 604.76062 Tm +(5HWXUQ) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 483.45596 604.76062 Tm +(SDUDPHWHU) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 129.84 589.16083 Tm +(FRQILUPDWLRQ) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 167.73599 589.16083 Tm +(ZRUG) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 129.84 573.56091 Tm +(&RPPDQG) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 165.967 573.56091 Tm +(FRGH) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 185.511 573.56091 Tm +([) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 87.84 557.961 Tm +(,QVWUXFWLRQ) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 114.89 557.961 Tm +(SDFNHW) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 131.765 557.961 Tm +(IRUPDW) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 92.2805 541.88129 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 100.6005 541.88129 Tm +(E\\WHV) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 148.741 541.88129 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 157.061 541.88129 Tm +(E\\WHV) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 207.8412 541.88129 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 216.16119 541.88129 Tm +(E\\WH) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 261.66199 541.88129 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 269.98199 541.88129 Tm +(E\\WHV) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 320.82211 541.88129 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 329.14212 541.88129 Tm +(E\\WH) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 377.3425 541.88129 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 385.66251 541.88129 Tm +(E\\WH) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 431.16339 541.88129 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 439.4834 541.88129 Tm +(E\\WHV) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 487.68369 541.88129 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 496.00369 541.88129 Tm +(E\\WHV) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 100.14 525.80029 Tm +(%DRWRX) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 146.0995 525.80029 Tm +(0RGXOH) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 167.14801 525.80029 Tm +(DGGUHVV) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 207.8396 525.80029 Tm +(3DFNDJH) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 230.82961 525.80029 Tm +(,') Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 264.2991 525.80029 Tm +(SDFNDJH) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 281.05911 525.80029 Tm +(OHQJWK) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 320.81949 525.80029 Tm +(VFULSW) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 372.11938 525.80029 Tm +(EXIIHU) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 391.06738 525.80029 Tm +(QXPEHU) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 439.07889 525.80029 Tm +(SDJH) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 449.53888 525.80029 Tm +(QXPEHU) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 490.319 525.80029 Tm +(FKHFNVXP) Tj +ET +BT +/F5 9.5 Tf +0 0 0 rg +1 0 0 1 94.86 509.72031 Tm +([HI) Tj +ET +BT +/F5 10.5 Tf +0 0 0 rg +1 0 0 1 156.601 509.72031 Tm +(;;;;) Tj +ET +BT +/F5 10.5 Tf +0 0 0 rg +1 0 0 1 213.06149 509.72031 Tm +([) Tj +ET +BT +/F5 9 Tf +0 0 0 rg +1 0 0 1 264.30261 509.72031 Tm +([) Tj +ET +BT +/F5 10.5 Tf +0 0 0 rg +1 0 0 1 326.04349 509.72031 Tm +([) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 372.0639 509.72031 Tm +(%XIIHU,') Tj +ET +BT +/F5 9 Tf +0 0 0 rg +1 0 0 1 433.80389 509.72031 Tm +(3DJH,') Tj +ET +BT +/F5 10.5 Tf +0 0 0 rg +1 0 0 1 498.1846 509.72031 Tm +(6XP) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 132.3 493.58029 Tm +(1RWH) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 150.617 493.58029 Tm +(7KH) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 163.604 493.58029 Tm +(%XIIHU,'V) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 194.4205 493.58029 Tm +(RI) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 202.27901 493.58029 Tm +(WKH) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 213.9985 493.58029 Tm +(EXIIHU) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 234.52551 493.58029 Tm +(&KDU%XIIHU) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 273.45401 493.58029 Tm +(DQG) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 286.80502 493.58029 Tm +(&KDU%XIIHU) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 325.73352 493.58029 Tm +(DUH) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 337.42053 493.58029 Tm +([) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 353.70303 493.58029 Tm +(DQG) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 367.05405 493.58029 Tm +([) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 383.33655 493.58029 Tm +(UHVSHFWLYHO\\) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 422.99954 493.58029 Tm +(5HVSRQVH) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 87.8398 477.9805 Tm +(SDFNHW) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 109.7773 477.9805 Tm +(IRUPDW) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 96.2997 461.90079 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 104.6197 461.90079 Tm +(E\\WHV) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 160.85989 461.90079 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 169.1799 461.90079 Tm +(E\\WHV) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 228.05991 461.90079 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 236.37991 461.90079 Tm +(E\\WH) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 289.98041 461.90079 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 298.30042 461.90079 Tm +(E\\WHV) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 357.12051 461.90079 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 365.44052 461.90079 Tm +(E\\WH) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 419.04099 461.90079 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 427.36099 461.90079 Tm +(E\\WHV) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 104.22 445.82031 Tm +(%DRWRX) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 158.2803 445.82031 Tm +(0RGXOH) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 179.3288 445.82031 Tm +(DGGUHVV) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 228.0602 445.82031 Tm +(3DFNDJH) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 251.0502 445.82031 Tm +(,') Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 292.62051 445.82031 Tm +(SDFNDJH) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 309.38052 445.82031 Tm +(OHQJWK) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 357.12091 445.82031 Tm +(FRQILUPDWLRQ) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 382.38492 445.82031 Tm +(FRGH) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 421.68121 445.82031 Tm +(FKHFNVXP) Tj +ET +BT +/F5 9.5 Tf +0 0 0 rg +1 0 0 1 98.94 429.6803 Tm +([HI) Tj +ET +BT +/F5 10.5 Tf +0 0 0 rg +1 0 0 1 168.72079 429.6803 Tm +(;;;;) Tj +ET +BT +/F5 10.5 Tf +0 0 0 rg +1 0 0 1 233.2822 429.6803 Tm +([) Tj +ET +BT +/F5 9 Tf +0 0 0 rg +1 0 0 1 292.6228 429.6803 Tm +([) Tj +ET +BT +/F5 10.5 Tf +0 0 0 rg +1 0 0 1 370.26401 429.6803 Tm +(;) Tj +ET +BT +/F5 10.5 Tf +0 0 0 rg +1 0 0 1 429.54489 429.6803 Tm +(6XP) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 132.78 413.60031 Tm +(1RWH) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 146.87 413.60031 Tm +(&RQILUPDWLRQ) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 179.20999 413.60031 Tm +(FRGH [) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 205.91499 413.60031 Tm +(PHDQV) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 223 413.60031 Tm +(WKH) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 232.015 413.60031 Tm +(UHDGRXW) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 252 413.60031 Tm +(LV) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 256.98499 413.60031 Tm +(VXFFHVVIXO) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 153.78 398.0004 Tm +(&RQILUPDWLRQ) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 179.65199 398.0004 Tm +(FRGH [) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 201.01599 398.0004 Tm +(PHDQV) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 214.68399 398.0004 Tm +(WKHUH) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 225.80399 398.0004 Tm +(LV) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 229.79199 398.0004 Tm +(DQ) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 235.54799 398.0004 Tm +(HUURU) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 246.21999 398.0004 Tm +(LQ) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 250.76399 398.0004 Tm +(UHFHLYLQJ) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 268.91599 398.0004 Tm +(WKH) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 276.12799 398.0004 Tm +(SDFNDJH) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 153.78 382.4006 Tm +(&RQILUPDWLRQ) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 179.65199 382.4006 Tm +(FRGH [F) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 200.64799 382.4006 Tm +(LQGLFDWHV) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 218.46399 382.4006 Tm +(WKDW) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 227.10799 382.4006 Tm +(WKHUH) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 238.22798 382.4006 Tm +(LV) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 242.21599 382.4006 Tm +(DQ) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 247.97198 382.4006 Tm +(HUURU) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 258.64398 382.4006 Tm +(LQ) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 263.18799 382.4006 Tm +(UHDGLQJ) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 278.80399 382.4006 Tm +(RU) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 283.91599 382.4006 Tm +(WKH) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 291.12799 382.4006 Tm +(WHPSODWH) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 309.04401 382.4006 Tm +(LV) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 313.03201 382.4006 Tm +(LQYDOLG) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 153.78 366.80081 Tm +(&RQILUPDWLRQ) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 182.886 366.80081 Tm +(FRGH [) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 203.1765 366.80081 Tm +(E) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 207.114 366.80081 Tm +(\([SUHVV) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 224.64149 366.80081 Tm +(3DJH,') Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 241.1745 366.80081 Tm +(EH\\RQG) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 258.216 366.80081 Tm +(WKH) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 266.3295 366.80081 Tm +(VFRSH) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 279.84299 366.80081 Tm +(RI) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 285.28348 366.80081 Tm +(WKH) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 293.39697 366.80081 Tm +(ILQJHUSULQW) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 317.41348 366.80081 Tm +(GDWDEDVH) Tj +ET +BT +/F6 7 Tf +0 0 0 rg +1 0 0 1 87.84 351.2009 Tm +() Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 96.408 351.2009 Tm +(,QVWUXFWLRQ) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 134.278 351.2009 Tm +(SDFNHW) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 157.903 351.2009 Tm +(FKHFNVXP) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 192.679 351.2009 Tm +( ) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 194.77901 351.2009 Tm +() Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 200.60301 351.2009 Tm +(E\\WHV ) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 224.41 351.2009 Tm +(3DFNDJH) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 253.67 351.2009 Tm +(,') Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 262.97299 351.2009 Tm +( ) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 265.073 351.2009 Tm +() Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 270.897 351.2009 Tm +(E\\WH ) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 287.34702 351.2009 Tm +() Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 291.35101 351.2009 Tm +(3DFNHW) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 314.90601 351.2009 Tm +(OHQJWK) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 337.96399 351.2009 Tm +( ) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 340.064 351.2009 Tm +() Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 345.888 351.2009 Tm +(E\\WHV ) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 365.69101 351.2009 Tm +() Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 369.69501 351.2009 Tm +(VFULSW) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 389.75702 351.2009 Tm +( ) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 391.85703 351.2009 Tm +() Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 397.68103 351.2009 Tm +(E\\WH ) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 414.13104 351.2009 Tm +() Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 418.13504 351.2009 Tm +(EXIIHU) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 440.24103 351.2009 Tm +(QXPEHU) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 468.40204 351.2009 Tm +( ) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 470.50204 351.2009 Tm +() Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 476.32605 351.2009 Tm +(E\\WHV ) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 208.62151 335.60101 Tm +() Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 213.61351 335.60101 Tm +(SDJH) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 229.30351 335.60101 Tm +(QXPEHU) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 253.44151 335.60101 Tm +( ) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 255.24152 335.60101 Tm +() Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 260.23352 335.60101 Tm +(E\\WHV ) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 277.20752 335.60101 Tm +() Tj +ET +BT +/F6 6.5 Tf +0 0 0 rg +1 0 0 1 87.841 320.00122 Tm +() Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 95.797 320.00122 Tm +($QVZHU) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 120.23051 320.00122 Tm +(SDFNHW) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 142.168 320.00122 Tm +(FKHFNVXP) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 174.45999 320.00122 Tm +( ) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 176.40999 320.00122 Tm +() Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 181.81799 320.00122 Tm +(E\\WHV ) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 203.9245 320.00122 Tm +(3DFNDJH) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 231.0945 320.00122 Tm +(,') Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 239.733 320.00122 Tm +( ) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 241.683 320.00122 Tm +() Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 247.091 320.00122 Tm +(E\\WH ) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 262.366 320.00122 Tm +() Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 266.08398 320.00122 Tm +(3DFNHW) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 287.95648 320.00122 Tm +(OHQJWK) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 309.36749 320.00122 Tm +( ) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 311.3175 320.00122 Tm +() Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 316.72549 320.00122 Tm +(E\\WHV ) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 335.11398 320.00122 Tm +() Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 338.83197 320.00122 Tm +(FRQILUPDWLRQ) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 379.88599 320.00122 Tm +(FRGH) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 396.29199 320.00122 Tm +( ) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 398.242 320.00122 Tm +() Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 403.64999 320.00122 Tm +(E\\WH ) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 418.92499 320.00122 Tm +() Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 87.8421 304.40137 Tm +() Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 94.5741 304.40137 Tm +(7KH) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 105.5631 304.40137 Tm +(FKHFNVXP) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 132.8871 304.40137 Tm +(LV) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 138.37061 304.40137 Tm +(DGGHG) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 156.1356 304.40137 Tm +(LQ) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 162.38361 304.40137 Tm +(E\\WHV) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 179.19711 304.40137 Tm +(WKH) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 189.11362 304.40137 Tm +(FDUU\\) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 203.61711 304.40137 Tm +(RYHU) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 216.54211 304.40137 Tm +() Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 221.11812 304.40137 Tm +(E\\WHV) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 236.45761 304.40137 Tm +(LV) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 241.94112 304.40137 Tm +(LJQRUHG) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 265.12912 304.40137 Tm +(DQG) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 276.42612 304.40137 Tm +(WKH) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 286.34262 304.40137 Tm +(KLJK) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 299.37213 304.40137 Tm +(E\\WH) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 312.07712 304.40137 Tm +(FRPHV) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 330.35361 304.40137 Tm +(ILUVW) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 341.98611 304.40137 Tm +(ZKHQ) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 357.6391 304.40137 Tm +(WUDQVPLWWLQJ) Tj +ET +BT +/F6 7.5 Tf +0 0 0 rg +1 0 0 1 87.8421 288.80151 Tm +() Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 97.0221 288.80151 Tm +(7KH) Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 112.0071 288.80151 Tm +(GHIDXOW) Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 138.86461 288.80151 Tm +(PRGXOH) Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 167.77711 288.80151 Tm +(DGGUHVV) Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 197.67212 288.80151 Tm +(LV) Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 205.14961 288.80151 Tm +() Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 208.20961 288.80151 Tm +([IIIIIIII) Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 240.16711 288.80151 Tm +() Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 244.12712 288.80151 Tm +(GHIDXOW) Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 270.98462 288.80151 Tm +(SDVVZRUG) Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 307.08212 288.80151 Tm +(LV) Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 314.55963 288.80151 Tm +() Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 317.61963 288.80151 Tm +<0013005B00130013001300130013001300130013020A> Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 362.88962 288.80151 Tm +() Tj +ET +BT +/F7 7 Tf +0 0 0 rg +1 0 0 1 87.84 243.08032 Tm +() Tj +ET +BT +/F7 7 Tf +0 0 0 rg +1 0 0 1 95.848 243.08032 Tm +( ) Tj +ET +BT +/F7 7 Tf +0 0 0 rg +1 0 0 1 100.041 243.08032 Tm +(WR) Tj +ET +BT +/F7 7 Tf +0 0 0 rg +1 0 0 1 109.232 243.08032 Tm +(GHOHWH) Tj +ET +BT +/F7 7 Tf +0 0 0 rg +1 0 0 1 133.067 243.08032 Tm +(WKH) Tj +ET +BT +/F7 7 Tf +0 0 0 rg +1 0 0 1 146.661 243.08032 Tm +(WHPSODWH) Tj +ET +BT +/F7 7 Tf +0 0 0 rg +1 0 0 1 180.49899 243.08032 Tm +('HOHWH&KDU) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 129.84 213.50031 Tm +(\)XQFWLRQ) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 151.52499 213.50031 Tm +('HVFULSWLRQ) Tj +ET +BT +/F7 5 Tf +0 0 0 rg +1 0 0 1 178.42999 213.50031 Tm +() Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 179.855 213.50031 Tm +('HOHWH) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 196.36 213.50031 Tm +(WKH) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 205.375 213.50031 Tm +(VSHFLILHG) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 227.56 213.50031 Tm +(VHJPHQW) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 249.53999 213.50031 Tm +( 1) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 256.13998 213.50031 Tm +(ILQJHUSULQW) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 282.82498 213.50031 Tm +(WHPSODWHV) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 307.61499 213.50031 Tm +(VWDUWLQJ) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 327.245 213.50031 Tm +(ZLWK) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 338.66 213.50031 Tm +(WKH) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 347.67499 213.50031 Tm +(VSHFLILHG) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 369.85999 213.50031 Tm +(,') Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 376.50497 213.50031 Tm +(QXPEHU ) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 398.11996 213.50031 Tm +(WHPSODWH) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 420.51495 213.50031 Tm +(LQ) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 426.19495 213.50031 Tm +(WKH) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 435.20996 213.50031 Tm +(PRGXOH) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 454.48495 213.50031 Tm +(ILQJHUSULQW) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 481.16995 213.50031 Tm +(OLEUDU\\) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 498.94995 213.50031 Tm +(,QSXW) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 129.8389 197.90051 Tm +(SDUDPHWHUV) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 159.8089 197.90051 Tm +(3DJH,') Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 178.17889 197.90051 Tm +( ILQJHUSULQW) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 206.36389 197.90051 Tm +(OLEUDU\\) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 222.80389 197.90051 Tm +(WHPSODWH) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 245.1989 197.90051 Tm +(QXPEHU ) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 266.8139 197.90051 Tm +() Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 270.97391 197.90051 Tm +(1) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 276.07391 197.90051 Tm +(7KH) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 286.0639 197.90051 Tm +(QXPEHU) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 306.17889 197.90051 Tm +(RI) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 312.22391 197.90051 Tm +(WHPSODWHV) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 337.01392 197.90051 Tm +(WR) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 343.14392 197.90051 Tm +(EH) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 350.33893 197.90051 Tm +(GHOHWHG) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 129.8389 182.3006 Tm +(5HWXUQ) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 145.3909 182.3006 Tm +(SDUDPHWHU) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 170.2084 182.3006 Tm +(FRQILUPDWLRQ) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 198.6304 182.3006 Tm +(ZRUG) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 129.8389 166.70068 Tm +(&RPPDQG) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 165.9659 166.70068 Tm +(FRGH) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 185.5099 166.70068 Tm +([F) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 87.8389 151.10089 Tm +(,QVWUXFWLRQ) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 114.8889 151.10089 Tm +(SDFNHW) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 131.7639 151.10089 Tm +(IRUPDW) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 92.2794 135.02118 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 100.5994 135.02118 Tm +(E\\WHV) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 148.7399 135.02118 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 157.05991 135.02118 Tm +(E\\WHV) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 207.84019 135.02118 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 216.16019 135.02118 Tm +(E\\WH) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 261.66101 135.02118 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 269.98102 135.02118 Tm +(E\\WHV) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 320.82111 135.02118 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 329.14111 135.02118 Tm +(E\\WH) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 374.70181 135.02118 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 383.02182 135.02118 Tm +(E\\WHV) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 431.16229 135.02118 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 439.4823 135.02118 Tm +(E\\WHV) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 487.68271 135.02118 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 496.00272 135.02118 Tm +(E\\WHV) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 100.14 118.88031 Tm +(%DRWRX) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 146.0995 118.88031 Tm +(0RGXOH) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 167.14801 118.88031 Tm +(DGGUHVV) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 207.8396 118.88031 Tm +(3DFNDJH) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 230.82961 118.88031 Tm +(,') Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 264.2991 118.88031 Tm +(SDFNDJH) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 281.05911 118.88031 Tm +(OHQJWK) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 320.81949 118.88031 Tm +(VFULSW) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 382.61938 118.88031 Tm +(SDJH) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 393.07938 118.88031 Tm +(QXPEHU) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 428.57889 118.88031 Tm +(GHOHWH) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 446.1019 118.88031 Tm +(QXPEHU) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 490.319 118.88031 Tm +(FKHFNVXP) Tj +ET +BT +/F5 9.5 Tf +0 0 0 rg +1 0 0 1 94.86 102.80042 Tm +([HI) Tj +ET +BT +/F5 10.5 Tf +0 0 0 rg +1 0 0 1 156.601 102.80042 Tm +(;;;;) Tj +ET +BT +/F5 10.5 Tf +0 0 0 rg +1 0 0 1 213.06149 102.80042 Tm +([) Tj +ET +BT +/F5 9 Tf +0 0 0 rg +1 0 0 1 264.30261 102.80042 Tm +([) Tj +ET +BT +/F5 10.5 Tf +0 0 0 rg +1 0 0 1 326.04349 102.80042 Tm +([F) Tj +ET +BT +/F5 9 Tf +0 0 0 rg +1 0 0 1 377.34439 102.80042 Tm +(3DJH,') Tj +ET +BT +/F5 10.5 Tf +0 0 0 rg +1 0 0 1 446.94571 102.80042 Tm +(1) Tj +ET +BT +/F5 10.5 Tf +0 0 0 rg +1 0 0 1 498.1857 102.80042 Tm +(6XP) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 87.84 86.66028 Tm +(5HVSRQVH) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 111.87 86.66028 Tm +(SDFNHW) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 128.745 86.66028 Tm +(IRUPDW) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 267.95999 45.86041 Tm +(WKH) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 275.172 45.86041 Tm +(ILUVW) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 283.63199 45.86041 Tm +(WZHQW\\) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 297.47198 45.86041 Tm +(WKUHH) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 308.59198 45.86041 Tm +(SDJHV) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 320.96799 45.86041 Tm +(RI) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 325.80399 45.86041 Tm +() Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 331.41998 45.86041 Tm +(3DJH) Tj +ET + +endstream +endobj +941 0 obj +<< +/Length 2 +>> +stream +q + +endstream +endobj +942 0 obj +<< +/Length 2117 +/Filter /FlateDecode +>> +stream +xZjG?O/޾0K6?c( ˑNfgg{ 5Lu_WGͯ޳~vo?~~v`k'4pbd>n |=}._Mo~v/*k&G.%hct(,v{~?4$vv`?N+7p[u^?L1ԑG|ܤGeEU/O71dJZ Ƚz:xݕe>*פLtWRp[K/\d ey ϭEbnu?LuK(I'4rfJZhHA508bF6SD\ԖNYOʆVig%D„ +P]ԐkFPnP>܊S &R Q erdqNM>-rEЕ.-CEzNIn=nJQ!!tN׾8k~ E{8]HM[]3۷!1?)ԎUlvZ&O yBu=BH {u'F-y:ˡF2,|W3Ty=s6<ĶK$$Q/udU#L{^ZmMO֖{Ł9((lM$jLgrkx0}9Uꒀ1TM*hnuF:}Y7=K|.bViH + ]Ĉ҈*ZY+rhlܤJkkB@H973ާ>B$Υ#3(y=1O=1_:/6F{gc^z>ҭ~ݗ-Ex@iqax\X:.d@eKCSlØ%gz1a1!ɚǢ⯘hi)"n30,dwCpf`#nc`1:XlεXk(Vҥ"Pf)#YAc`na`j B0.u[8ẕQ%!հFYe@Mґ߫ to@!z~HJ^25 CyQ-Tw6 w +)Ig?k &e-dq?ePTTV]i0WO(Q2$.Fe/CE(użdVߪjHBU:ՆYV*(5RAA7Z[w +FHj"EU$2$v._]2HCT륧4F[Kek6Wo S̸#Pt)D/T#ED0{\Yfbab!M㚕kVFkVBOhfkAo[ +endstream +endobj +943 0 obj +<< +/Length 31207 +>> +stream +Q +1 0 0 1 0 0 cm +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 377.35162 781.10431 Tm +(+DQJ]KRX) Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 415.64661 781.10431 Tm +(=KLDQ) Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 437.2991 781.10431 Tm +(7HFKQRORJ\\) Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 479.96661 781.10431 Tm +(&R) Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 495.21411 781.10431 Tm +(/WG) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 96.3 757.58032 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 104.62 757.58032 Tm +(E\\WHV) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 160.8602 757.58032 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 169.18021 757.58032 Tm +(E\\WHV) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 228.0602 757.58032 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 236.38019 757.58032 Tm +(E\\WH) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 289.98071 757.58032 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 298.30072 757.58032 Tm +(E\\WHV) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 357.12079 757.58032 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 365.4408 757.58032 Tm +(E\\WH) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 419.04129 757.58032 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 427.3613 757.58032 Tm +(E\\WHV) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 104.22 741.50031 Tm +(%DRWRX) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 158.2803 741.50031 Tm +(0RGXOH) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 179.3288 741.50031 Tm +(DGGUHVV) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 228.0602 741.50031 Tm +(3DFNDJH) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 251.0502 741.50031 Tm +(,') Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 292.62051 741.50031 Tm +(SDFNDJH) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 309.38052 741.50031 Tm +(OHQJWK) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 357.12091 741.50031 Tm +(FRQILUPDWLRQ) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 382.38492 741.50031 Tm +(FRGH) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 421.68121 741.50031 Tm +(FKHFNVXP) Tj +ET +BT +/F5 9.5 Tf +0 0 0 rg +1 0 0 1 98.94 725.42029 Tm +([HI) Tj +ET +BT +/F5 10.5 Tf +0 0 0 rg +1 0 0 1 168.72079 725.42029 Tm +(;;;;) Tj +ET +BT +/F5 10.5 Tf +0 0 0 rg +1 0 0 1 233.2822 725.42029 Tm +([) Tj +ET +BT +/F5 9 Tf +0 0 0 rg +1 0 0 1 292.6228 725.42029 Tm +([) Tj +ET +BT +/F5 10.5 Tf +0 0 0 rg +1 0 0 1 370.26401 725.42029 Tm +(;) Tj +ET +BT +/F5 10.5 Tf +0 0 0 rg +1 0 0 1 429.54489 725.42029 Tm +(6XP) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 132.78 709.28027 Tm +(1RWH) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 146.87 709.28027 Tm +(&RQILUPDWLRQ) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 179.20999 709.28027 Tm +(FRGH [) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 205.91499 709.28027 Tm +(PHDQV) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 223 709.28027 Tm +(WKH) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 232.015 709.28027 Tm +(WHPSODWH) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 254.41 709.28027 Tm +(GHOHWLRQ) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 274.92502 709.28027 Tm +(LV) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 279.91 709.28027 Tm +(VXFFHVVIXO) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 153.78 693.68048 Tm +(&RQILUPDWLRQ) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 179.65199 693.68048 Tm +(FRGH [) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 201.01599 693.68048 Tm +(PHDQV) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 214.68399 693.68048 Tm +(WKHUH) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 225.80399 693.68048 Tm +(LV) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 229.79199 693.68048 Tm +(DQ) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 235.54799 693.68048 Tm +(HUURU) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 246.21999 693.68048 Tm +(LQ) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 250.76399 693.68048 Tm +(UHFHLYLQJ) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 268.91599 693.68048 Tm +(WKH) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 276.12799 693.68048 Tm +(SDFNDJH) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 153.78 678.08063 Tm +(&RQILUPDWLRQ) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 182.886 678.08063 Tm +(FRGH [) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 206.9205 678.08063 Tm +(PHDQV) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 222.297 678.08063 Tm +(WKDW) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 232.0215 678.08063 Tm +(WKH) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 240.13499 678.08063 Tm +(GHOHWLRQ) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 258.59851 678.08063 Tm +(RI) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 264.039 678.08063 Tm +(WKH) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 272.1525 678.08063 Tm +(WHPSODWH) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 292.30798 678.08063 Tm +(IDLOHG) Tj +ET +BT +/F6 6.5 Tf +0 0 0 rg +1 0 0 1 87.84 662.48071 Tm +() Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 95.796 662.48071 Tm +(,QVWUXFWLRQ) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 130.961 662.48071 Tm +(SDFNHW) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 152.8985 662.48071 Tm +(FKHFNVXP) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 185.19049 662.48071 Tm +( ) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 187.14049 662.48071 Tm +() Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 192.54849 662.48071 Tm +(E\\WHV ) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 214.655 662.48071 Tm +(3DFNDJH) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 241.825 662.48071 Tm +(,') Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 250.4635 662.48071 Tm +( ) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 252.4135 662.48071 Tm +() Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 257.8215 662.48071 Tm +(E\\WH ) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 273.0965 662.48071 Tm +() Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 276.81448 662.48071 Tm +(3DFNHW) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 298.68698 662.48071 Tm +(OHQJWK) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 320.09799 662.48071 Tm +( ) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 322.048 662.48071 Tm +() Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 327.45599 662.48071 Tm +(E\\WHV ) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 345.84448 662.48071 Tm +() Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 349.56247 662.48071 Tm +(VFULSW) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 368.19147 662.48071 Tm +( ) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 370.14148 662.48071 Tm +() Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 375.54947 662.48071 Tm +(E\\WH ) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 390.82446 662.48071 Tm +() Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 394.54245 662.48071 Tm +(SDJH) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 411.53995 662.48071 Tm +(QXPEHU ) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 437.94946 662.48071 Tm +() Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 443.35745 662.48071 Tm +(E\\WHV ) Tj +ET +BT +/F5 8 Tf +0 0 0 rg +1 0 0 1 208.62151 646.88092 Tm +() Tj +ET +BT +/F5 8 Tf +0 0 0 rg +1 0 0 1 215.27751 646.88092 Tm +(GHOHWH) Tj +ET +BT +/F5 8 Tf +0 0 0 rg +1 0 0 1 240.76552 646.88092 Tm +(FRXQW) Tj +ET +BT +/F5 8 Tf +0 0 0 rg +1 0 0 1 264.30151 646.88092 Tm +( ) Tj +ET +BT +/F5 8 Tf +0 0 0 rg +1 0 0 1 266.70151 646.88092 Tm +() Tj +ET +BT +/F5 8 Tf +0 0 0 rg +1 0 0 1 273.35751 646.88092 Tm +(E\\WHV ) Tj +ET +BT +/F5 8 Tf +0 0 0 rg +1 0 0 1 295.9895 646.88092 Tm +() Tj +ET +BT +/F6 6.5 Tf +0 0 0 rg +1 0 0 1 87.841 631.28113 Tm +() Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 95.797 631.28113 Tm +($QVZHU) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 120.23051 631.28113 Tm +(SDFNHW) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 142.168 631.28113 Tm +(FKHFNVXP) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 174.45999 631.28113 Tm +( ) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 176.40999 631.28113 Tm +() Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 181.81799 631.28113 Tm +(E\\WHV ) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 203.9245 631.28113 Tm +(3DFNDJH) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 231.0945 631.28113 Tm +(,') Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 239.733 631.28113 Tm +( ) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 241.683 631.28113 Tm +() Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 247.091 631.28113 Tm +(E\\WH ) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 262.366 631.28113 Tm +() Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 266.08398 631.28113 Tm +(3DFNHW) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 287.95648 631.28113 Tm +(OHQJWK) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 309.36749 631.28113 Tm +( ) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 311.3175 631.28113 Tm +() Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 316.72549 631.28113 Tm +(E\\WHV ) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 335.11398 631.28113 Tm +() Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 338.83197 631.28113 Tm +(FRQILUPDWLRQ) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 379.88599 631.28113 Tm +(FRGH) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 396.29199 631.28113 Tm +( ) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 398.242 631.28113 Tm +() Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 403.64999 631.28113 Tm +(E\\WH ) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 418.92499 631.28113 Tm +() Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 87.8421 615.68121 Tm +() Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 94.5741 615.68121 Tm +(7KH) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 105.5631 615.68121 Tm +(FKHFNVXP) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 132.8871 615.68121 Tm +(LV) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 138.37061 615.68121 Tm +(DGGHG) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 156.1356 615.68121 Tm +(LQ) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 162.38361 615.68121 Tm +(E\\WHV) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 179.19711 615.68121 Tm +(WKH) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 189.11362 615.68121 Tm +(FDUU\\) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 203.61711 615.68121 Tm +(RYHU) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 216.54211 615.68121 Tm +() Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 221.11812 615.68121 Tm +(E\\WHV) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 236.45761 615.68121 Tm +(LV) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 241.94112 615.68121 Tm +(LJQRUHG) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 265.12912 615.68121 Tm +(DQG) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 276.42612 615.68121 Tm +(WKH) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 286.34262 615.68121 Tm +(KLJK) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 299.37213 615.68121 Tm +(E\\WH) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 312.07712 615.68121 Tm +(FRPHV) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 330.35361 615.68121 Tm +(ILUVW) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 341.98611 615.68121 Tm +(ZKHQ) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 357.6391 615.68121 Tm +(WUDQVPLWWLQJ) Tj +ET +BT +/F6 7.5 Tf +0 0 0 rg +1 0 0 1 87.8421 600.0813 Tm +() Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 97.0221 600.0813 Tm +(7KH) Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 112.0071 600.0813 Tm +(GHIDXOW) Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 138.86461 600.0813 Tm +(PRGXOH) Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 167.77711 600.0813 Tm +(DGGUHVV) Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 197.67212 600.0813 Tm +(LV) Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 205.14961 600.0813 Tm +() Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 208.20961 600.0813 Tm +([IIIIIIII) Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 240.16711 600.0813 Tm +() Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 244.12712 600.0813 Tm +(GHIDXOW) Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 270.98462 600.0813 Tm +(SDVVZRUG) Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 307.08212 600.0813 Tm +(LV) Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 314.55963 600.0813 Tm +() Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 317.61963 600.0813 Tm +<0013005B00130013001300130013001300130013020A> Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 362.88962 600.0813 Tm +() Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 87.84 569.96033 Tm +() Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 94.132 569.96033 Tm +( ) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 97.4265 569.96033 Tm +(WR) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 104.64799 569.96033 Tm +(FOHDU) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 119.65199 569.96033 Tm +(WKH) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 130.33299 569.96033 Tm +(ILQJHUSULQW) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 162.06799 569.96033 Tm +(OLEUDU\\) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 181.78 569.96033 Tm +(\(PSW\\) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 129.84 540.38031 Tm +(\)XQFWLRQ) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 151.52499 540.38031 Tm +(GHVFULSWLRQ) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 180.495 540.38031 Tm +(GHOHWH) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 196.42499 540.38031 Tm +(DOO) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 203.10999 540.38031 Tm +(ILQJHUSULQW) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 229.79498 540.38031 Tm +(WHPSODWHV) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 254.58499 540.38031 Tm +(LQ) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 260.26498 540.38031 Tm +(WKH) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 269.27997 540.38031 Tm +(ILQJHUSULQW) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 295.96497 540.38031 Tm +(OLEUDU\\) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 312.40497 540.38031 Tm +(LQ) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 318.08496 540.38031 Tm +(WKH) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 327.09998 540.38031 Tm +(PRGXOH) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 129.84 524.78052 Tm +(,QSXW) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 148.1115 524.78052 Tm +(SDUDPHWHU) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 183.959 524.78052 Tm +(QRQH) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 129.84 509.1806 Tm +(5HWXUQ) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 145.392 509.1806 Tm +(SDUDPHWHU) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 170.2095 509.1806 Tm +(FRQILUPDWLRQ) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 198.6315 509.1806 Tm +(ZRUG) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 129.84 493.58069 Tm +(&RPPDQG) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 165.967 493.58069 Tm +(FRGH) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 185.511 493.58069 Tm +([G) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 87.84 477.9809 Tm +(,QVWUXFWLRQ) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 114.89 477.9809 Tm +(SDFNHW) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 131.765 477.9809 Tm +(IRUPDW) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 96.2999 461.90121 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 104.6199 461.90121 Tm +(E\\WHV) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 160.86011 461.90121 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 169.18011 461.90121 Tm +(E\\WHV) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 228.06 461.90121 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 236.38 461.90121 Tm +(E\\WH) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 289.9805 461.90121 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 298.30051 461.90121 Tm +(E\\WHV) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 357.12061 461.90121 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 365.44061 461.90121 Tm +(E\\WH) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 419.0412 461.90121 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 427.36121 461.90121 Tm +(E\\WHV) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 104.22 445.82031 Tm +(%DRWRX) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 158.2803 445.82031 Tm +(0RGXOH) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 179.3288 445.82031 Tm +(DGGUHVV) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 228.0602 445.82031 Tm +(3DFNDJH) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 251.0502 445.82031 Tm +(,') Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 292.62051 445.82031 Tm +(SDFNDJH) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 309.38052 445.82031 Tm +(OHQJWK) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 357.12091 445.82031 Tm +(VFULSW) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 421.68121 445.82031 Tm +(FKHFNVXP) Tj +ET +BT +/F5 9.5 Tf +0 0 0 rg +1 0 0 1 98.94 429.6803 Tm +([HI) Tj +ET +BT +/F5 10.5 Tf +0 0 0 rg +1 0 0 1 168.72079 429.6803 Tm +(;;;;) Tj +ET +BT +/F5 10.5 Tf +0 0 0 rg +1 0 0 1 233.2822 429.6803 Tm +([) Tj +ET +BT +/F5 9 Tf +0 0 0 rg +1 0 0 1 292.6228 429.6803 Tm +([) Tj +ET +BT +/F5 10.5 Tf +0 0 0 rg +1 0 0 1 362.34381 429.6803 Tm +([G) Tj +ET +BT +/F5 9 Tf +0 0 0 rg +1 0 0 1 421.6846 429.6803 Tm +([) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 87.84 413.60031 Tm +(5HVSRQVH) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 111.87 413.60031 Tm +(SDFNHW) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 128.745 413.60031 Tm +(IRUPDW) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 96.2999 397.5206 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 104.6199 397.5206 Tm +(E\\WHV) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 160.86011 397.5206 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 169.18011 397.5206 Tm +(E\\WHV) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 228.06 397.5206 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 236.38 397.5206 Tm +(E\\WH) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 289.9805 397.5206 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 298.30051 397.5206 Tm +(E\\WHV) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 357.12061 397.5206 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 365.44061 397.5206 Tm +(E\\WH) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 419.0412 397.5206 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 427.36121 397.5206 Tm +(E\\WHV) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 104.22 381.38031 Tm +(%DRWRX) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 158.2803 381.38031 Tm +(0RGXOH) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 179.3288 381.38031 Tm +(DGGUHVV) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 228.0602 381.38031 Tm +(3DFNDJH) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 251.0502 381.38031 Tm +(,') Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 292.62051 381.38031 Tm +(SDFNDJH) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 309.38052 381.38031 Tm +(OHQJWK) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 357.12091 381.38031 Tm +(FRQILUPDWLRQ) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 382.38492 381.38031 Tm +(FRGH) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 421.68121 381.38031 Tm +(FKHFNVXP) Tj +ET +BT +/F5 9.5 Tf +0 0 0 rg +1 0 0 1 98.94 365.30029 Tm +([HI) Tj +ET +BT +/F5 10.5 Tf +0 0 0 rg +1 0 0 1 168.72079 365.30029 Tm +(;;;;) Tj +ET +BT +/F5 10.5 Tf +0 0 0 rg +1 0 0 1 233.2822 365.30029 Tm +([) Tj +ET +BT +/F5 9 Tf +0 0 0 rg +1 0 0 1 292.6228 365.30029 Tm +([) Tj +ET +BT +/F5 10.5 Tf +0 0 0 rg +1 0 0 1 370.26401 365.30029 Tm +(;) Tj +ET +BT +/F5 10.5 Tf +0 0 0 rg +1 0 0 1 429.54489 365.30029 Tm +(6XP) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 132.78 349.16031 Tm +(1RWH) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 146.87 349.16031 Tm +(&RQILUPDWLRQ) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 179.20999 349.16031 Tm +(FRGH [) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 205.91499 349.16031 Tm +(PHDQV) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 223 349.16031 Tm +(FOHDULQJ) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 243.13499 349.16031 Tm +(LV) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 248.12 349.16031 Tm +(VXFFHVVIXO) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 153.78 333.56049 Tm +(&RQILUPDWLRQ) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 179.65199 333.56049 Tm +(FRGH [) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 201.01599 333.56049 Tm +(PHDQV) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 214.68399 333.56049 Tm +(WKHUH) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 225.80399 333.56049 Tm +(LV) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 229.79199 333.56049 Tm +(DQ) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 235.54799 333.56049 Tm +(HUURU) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 246.21999 333.56049 Tm +(LQ) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 250.76399 333.56049 Tm +(UHFHLYLQJ) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 268.91599 333.56049 Tm +(WKH) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 276.12799 333.56049 Tm +(SDFNDJH) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 153.78 317.96057 Tm +(&RQILUPDWLRQ) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 182.886 317.96057 Tm +(FRGH [) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 206.9205 317.96057 Tm +(LQGLFDWHV) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 226.9635 317.96057 Tm +(WKDW) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 236.688 317.96057 Tm +(WKH) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 244.8015 317.96057 Tm +(HPSW\\LQJ) Tj +ET +BT +/F5 4.5 Tf +0 0 0 rg +1 0 0 1 266.11349 317.96057 Tm +(IDLOHG) Tj +ET +BT +/F6 7 Tf +0 0 0 rg +1 0 0 1 87.84 302.36072 Tm +() Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 96.408 302.36072 Tm +(,QVWUXFWLRQ) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 134.278 302.36072 Tm +(SDFNHW) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 157.903 302.36072 Tm +(FKHFNVXP) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 192.679 302.36072 Tm +( ) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 194.77901 302.36072 Tm +() Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 200.60301 302.36072 Tm +(E\\WHV ) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 224.41 302.36072 Tm +(3DFNDJH) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 253.67 302.36072 Tm +(,') Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 262.97299 302.36072 Tm +( ) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 265.073 302.36072 Tm +() Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 270.897 302.36072 Tm +(E\\WH ) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 287.34702 302.36072 Tm +() Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 291.35101 302.36072 Tm +(3DFNHW) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 314.90601 302.36072 Tm +(OHQJWK) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 337.96399 302.36072 Tm +( ) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 340.064 302.36072 Tm +() Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 345.888 302.36072 Tm +(E\\WHV ) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 365.69101 302.36072 Tm +() Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 369.69501 302.36072 Tm +(VFULSW) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 389.75702 302.36072 Tm +( ) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 391.85703 302.36072 Tm +() Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 397.68103 302.36072 Tm +(E\\WH ) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 414.13104 302.36072 Tm +() Tj +ET +BT +/F6 6.5 Tf +0 0 0 rg +1 0 0 1 87.841 286.76086 Tm +() Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 95.797 286.76086 Tm +($QVZHU) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 120.23051 286.76086 Tm +(SDFNHW) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 142.168 286.76086 Tm +(FKHFNVXP) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 174.45999 286.76086 Tm +( ) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 176.40999 286.76086 Tm +() Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 181.81799 286.76086 Tm +(E\\WHV ) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 203.9245 286.76086 Tm +(3DFNDJH) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 231.0945 286.76086 Tm +(,') Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 239.733 286.76086 Tm +( ) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 241.683 286.76086 Tm +() Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 247.091 286.76086 Tm +(E\\WH ) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 262.366 286.76086 Tm +() Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 266.08398 286.76086 Tm +(3DFNHW) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 287.95648 286.76086 Tm +(OHQJWK) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 309.36749 286.76086 Tm +( ) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 311.3175 286.76086 Tm +() Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 316.72549 286.76086 Tm +(E\\WHV ) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 335.11398 286.76086 Tm +() Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 338.83197 286.76086 Tm +(FRQILUPDWLRQ) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 379.88599 286.76086 Tm +(FRGH) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 396.29199 286.76086 Tm +( ) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 398.242 286.76086 Tm +() Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 403.64999 286.76086 Tm +(E\\WH ) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 418.92499 286.76086 Tm +() Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 87.8421 271.16113 Tm +() Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 94.5741 271.16113 Tm +(7KH) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 105.5631 271.16113 Tm +(FKHFNVXP) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 132.8871 271.16113 Tm +(LV) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 138.37061 271.16113 Tm +(DGGHG) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 156.1356 271.16113 Tm +(LQ) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 162.38361 271.16113 Tm +(E\\WHV) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 179.19711 271.16113 Tm +(WKH) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 189.11362 271.16113 Tm +(FDUU\\) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 203.61711 271.16113 Tm +(RYHU) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 216.54211 271.16113 Tm +() Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 221.11812 271.16113 Tm +(E\\WHV) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 236.45761 271.16113 Tm +(LV) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 241.94112 271.16113 Tm +(LJQRUHG) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 265.12912 271.16113 Tm +(DQG) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 276.42612 271.16113 Tm +(WKH) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 286.34262 271.16113 Tm +(KLJK) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 299.37213 271.16113 Tm +(E\\WH) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 312.07712 271.16113 Tm +(FRPHV) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 330.35361 271.16113 Tm +(ILUVW) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 341.98611 271.16113 Tm +(ZKHQ) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 357.6391 271.16113 Tm +(WUDQVPLWWLQJ) Tj +ET +BT +/F6 7.5 Tf +0 0 0 rg +1 0 0 1 87.8421 255.56122 Tm +() Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 97.0221 255.56122 Tm +(7KH) Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 112.0071 255.56122 Tm +(GHIDXOW) Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 138.86461 255.56122 Tm +(PRGXOH) Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 167.77711 255.56122 Tm +(DGGUHVV) Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 197.67212 255.56122 Tm +(LV) Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 205.14961 255.56122 Tm +() Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 208.20961 255.56122 Tm +([IIIIIIII) Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 240.16711 255.56122 Tm +() Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 244.12712 255.56122 Tm +(GHIDXOW) Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 270.98462 255.56122 Tm +(SDVVZRUG) Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 307.08212 255.56122 Tm +(LV) Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 314.55963 255.56122 Tm +() Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 317.61963 255.56122 Tm +<0013005B00130013001300130013001300130013020A> Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 362.88962 255.56122 Tm +() Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 87.84 209.84033 Tm +() Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 94.132 209.84033 Tm +( ) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 97.4265 209.84033 Tm +(WR) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 104.64799 209.84033 Tm +(DFFXUDWHO\\) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 134.931 209.84033 Tm +(FRPSDUH) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 160.54449 209.84033 Tm +(WKH) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 171.22549 209.84033 Tm +(IHDWXUHV) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 195.838 209.84033 Tm +(RI) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 202.80099 209.84033 Tm +(WZR) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 214.7305 209.84033 Tm +(ILQJHUSULQWV) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 249.19901 209.84033 Tm +(0DWFK) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 129.84 180.26031 Tm +(\)XQFWLRQ) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 158.03049 180.26031 Tm +(GHVFULSWLRQ) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 195.69148 180.26031 Tm +(PRGXOH) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 220.74898 180.26031 Tm +(DFFXUDWH) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 248.68597 180.26031 Tm +(FRPSDULVRQ) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 286.57446 180.26031 Tm +( ) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 288.52448 180.26031 Tm +() Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 297.70248 180.26031 Tm +( ) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 301.3425 180.26031 Tm +(FKDUDFWHULVWLF) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 343.89801 180.26031 Tm +(ILOHV) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 357.95752 180.26031 Tm +(LQ) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 365.34152 180.26031 Tm +(&KDU%XIIHU) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 404.27002 180.26031 Tm +(DQG) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 417.62103 180.26031 Tm +(&KDU%XIIHU) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 458.29153 180.26031 Tm +(DQG) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 471.64255 180.26031 Tm +(JLYH) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 485.97504 180.26031 Tm +(WKH) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 497.69455 180.26031 Tm +(UDWLR) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 182.33998 164.65729 Tm +(WR) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 189.69598 164.65729 Tm +(WKH) Tj +ET +BT +/F5 6 Tf +0 0 0 rg +1 0 0 1 200.51398 164.65729 Tm +(UHVXOWV) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 129.84 149.06061 Tm +(,QSXW) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 148.1115 149.06061 Tm +(SDUDPHWHU) Tj +ET +BT +/F5 6.5 Tf +0 0 0 rg +1 0 0 1 183.959 149.06061 Tm +(QRQH) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 129.84 133.46082 Tm +(5HWXUQ) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 147.12 133.46082 Tm +(SDUDPHWHU) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 174.69499 133.46082 Tm +(FRQILUPDWLRQ) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 206.27499 133.46082 Tm +(ZRUG) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 219.67 133.46082 Tm +() Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 223.83 133.46082 Tm +(FRPSDULVRQ) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 252.97501 133.46082 Tm +(VFRUH) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 129.84 117.8609 Tm +(&RPPDQG) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 165.967 117.8609 Tm +(FRGH) Tj +ET +BT +/F5 7 Tf +0 0 0 rg +1 0 0 1 185.511 117.8609 Tm +([) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 87.84 102.26099 Tm +(,QVWUXFWLRQ) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 114.89 102.26099 Tm +(SDFNHW) Tj +ET +BT +/F5 5 Tf +0 0 0 rg +1 0 0 1 131.765 102.26099 Tm +(IRUPDW) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 96.2999 86.1814 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 104.6199 86.1814 Tm +(E\\WHV) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 160.86011 86.1814 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 169.18011 86.1814 Tm +(E\\WHV) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 228.06 86.1814 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 236.38 86.1814 Tm +(E\\WH) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 289.9805 86.1814 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 298.30051 86.1814 Tm +(E\\WHV) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 357.12061 86.1814 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 365.44061 86.1814 Tm +(E\\WH) Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 419.0412 86.1814 Tm +() Tj +ET +BT +/F5 10 Tf +0 0 0 rg +1 0 0 1 427.36121 86.1814 Tm +(E\\WHV) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 267.95999 45.86041 Tm +(WKH) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 275.172 45.86041 Tm +(ILUVW) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 283.63199 45.86041 Tm +(WZHQW\\) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 297.47198 45.86041 Tm +(IRXU) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 306.43198 45.86041 Tm +(SDJHV) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 318.80798 45.86041 Tm +(RI) Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 323.64398 45.86041 Tm +() Tj +ET +BT +/F5 4 Tf +0 0 0 rg +1 0 0 1 329.25998 45.86041 Tm +(3DJH) Tj +ET + +endstream +endobj +944 0 obj +<< +/Length 2 +>> +stream +q + +endstream +endobj +945 0 obj +<< +/Length 2717 +/Filter /FlateDecode +>> +stream +x[ێ} `VBd!V#ly%ff!٩C6YuBO޿y|ӛ{;:_>6Ηn8y rR)ivC^E[ʐJV÷_<}/Uj4٬tƟ&J)0<~<N;d | 'l. h|*xe0bUiE!TɣT?dw룝"{| Fg7uؕȻE .%c,ۃeɬa ,ׅU,h`,caX[b638h6hç̓1 *NJYc@6,3/s^< xA6='ڬnWÖ["xި K]31Wn`.tBwU ܶeEwM.JLGlHx%OB&C[g٘yM~c4v; +Kqg_uct'_To +2gq{lި>=APׅ"OPDZhd. .jW J+l+S:b30oҞ1XT0lrx(ȋF@ a`f~`e8lv`V6 'mS-i`,K"}`Lv_*#E>#h~{*t]fEVg U88iwis$`}ߜJo%`]LZ2EYe(lu/8Ya޼$T'WI$rR^&SB*(VttdQ^&54'_#?ab_S8&7.Bt5qQ?/nʝgtU1P@rDAk`}tc1Vwmi>>s ] + +OOY"-~9f.> :)0 z :}zo;xUL/td[CMa˾:S KҰwp'T!ˌض[IW%:*mU+c lhbtƫteNP-(7iWel8l*p;|H^ +tԱR8{ZED[XԢeP<ʛVjzXc`#uSX}KWZ`},M,ξP9Ss`)C<{gGƭ׌6Z0R C1"HtCR%kұ!I۽(PiC2a.%2ёNJ>$*2(fd|w!11ڀw!HK)2ZyLj݃2+fI[__ 8ܞ?av"dbNsqn@SkzH%z[4-K3 nc +endstream +endobj +946 0 obj +<< +/Length 36261 +>> +stream +Q +1 0 0 1 0 0 cm +BT +/F6 7.5 Tf +0 0 0 rg +1 0 0 1 377.35162 781.10431 Tm +(+DQJ]KRX) Tj +ET +BT +/F6 7.5 Tf +0 0 0 rg +1 0 0 1 415.64661 781.10431 Tm +(=KLDQ) Tj +ET +BT +/F6 7.5 Tf +0 0 0 rg +1 0 0 1 437.2991 781.10431 Tm +(7HFKQRORJ\\) Tj +ET +BT +/F6 7.5 Tf +0 0 0 rg +1 0 0 1 479.96661 781.10431 Tm +(&R) Tj +ET +BT +/F6 7.5 Tf +0 0 0 rg +1 0 0 1 495.21411 781.10431 Tm +(/WG) Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 104.22 757.58032 Tm +(%DRWRX) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 158.2803 757.58032 Tm +(0RGXOH) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 179.3288 757.58032 Tm +(DGGUHVV) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 228.0602 757.58032 Tm +(3DFNDJH) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 251.0502 757.58032 Tm +(,') Tj +ET +BT +/F6 4 Tf +0 0 0 rg +1 0 0 1 292.62051 757.58032 Tm +(SDFNDJH) Tj +ET +BT +/F6 4 Tf +0 0 0 rg +1 0 0 1 309.38052 757.58032 Tm +(OHQJWK) Tj +ET +BT +/F6 10 Tf +0 0 0 rg +1 0 0 1 357.12091 757.58032 Tm +(VFULSW) Tj +ET +BT +/F6 6.5 Tf +0 0 0 rg +1 0 0 1 421.68121 757.58032 Tm +(FKHFNVXP) Tj +ET +BT +/F6 9.5 Tf +0 0 0 rg +1 0 0 1 98.94 741.50031 Tm +([HI) Tj +ET +BT +/F6 10.5 Tf +0 0 0 rg +1 0 0 1 168.72079 741.50031 Tm +(;;;;) Tj +ET +BT +/F6 10.5 Tf +0 0 0 rg +1 0 0 1 233.2822 741.50031 Tm +([) Tj +ET +BT +/F6 9 Tf +0 0 0 rg +1 0 0 1 292.6228 741.50031 Tm +([) Tj +ET +BT +/F6 10.5 Tf +0 0 0 rg +1 0 0 1 362.34381 741.50031 Tm +([) Tj +ET +BT +/F6 9 Tf +0 0 0 rg +1 0 0 1 421.6846 741.50031 Tm +([) Tj +ET +BT +/F6 5 Tf +0 0 0 rg +1 0 0 1 87.84 725.36029 Tm +(5HVSRQVH) Tj +ET +BT +/F6 5 Tf +0 0 0 rg +1 0 0 1 111.87 725.36029 Tm +(SDFNHW) Tj +ET +BT +/F6 5 Tf +0 0 0 rg +1 0 0 1 128.745 725.36029 Tm +(IRUPDW) Tj +ET +BT +/F6 10 Tf +0 0 0 rg +1 0 0 1 96.2999 709.28058 Tm +() Tj +ET +BT +/F6 10 Tf +0 0 0 rg +1 0 0 1 104.6199 709.28058 Tm +(E\\WHV) Tj +ET +BT +/F6 10 Tf +0 0 0 rg +1 0 0 1 160.86011 709.28058 Tm +() Tj +ET +BT +/F6 10 Tf +0 0 0 rg +1 0 0 1 169.18011 709.28058 Tm +(E\\WHV) Tj +ET +BT +/F6 10 Tf +0 0 0 rg +1 0 0 1 228.06 709.28058 Tm +() Tj +ET +BT +/F6 10 Tf +0 0 0 rg +1 0 0 1 236.38 709.28058 Tm +(E\\WH) Tj +ET +BT +/F6 10 Tf +0 0 0 rg +1 0 0 1 289.9805 709.28058 Tm +() Tj +ET +BT +/F6 10 Tf +0 0 0 rg +1 0 0 1 298.30051 709.28058 Tm +(E\\WHV) Tj +ET +BT +/F6 10 Tf +0 0 0 rg +1 0 0 1 357.12061 709.28058 Tm +() Tj +ET +BT +/F6 10 Tf +0 0 0 rg +1 0 0 1 365.44061 709.28058 Tm +(E\\WH) Tj +ET +BT +/F6 10 Tf +0 0 0 rg +1 0 0 1 419.0412 709.28058 Tm +() Tj +ET +BT +/F6 10 Tf +0 0 0 rg +1 0 0 1 427.36121 709.28058 Tm +(E\\WHV) Tj +ET +BT +/F6 10 Tf +0 0 0 rg +1 0 0 1 483.66129 709.28058 Tm +() Tj +ET +BT +/F6 10 Tf +0 0 0 rg +1 0 0 1 491.98129 709.28058 Tm +(E\\WHV) Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 104.22 693.20032 Tm +(%DRWRX) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 158.2803 693.20032 Tm +(0RGXOH) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 179.3288 693.20032 Tm +(DGGUHVV) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 228.0602 693.20032 Tm +(3DFNDJH) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 251.0502 693.20032 Tm +(,') Tj +ET +BT +/F6 4 Tf +0 0 0 rg +1 0 0 1 292.62051 693.20032 Tm +(SDFNDJH) Tj +ET +BT +/F6 4 Tf +0 0 0 rg +1 0 0 1 309.38052 693.20032 Tm +(OHQJWK) Tj +ET +BT +/F6 4 Tf +0 0 0 rg +1 0 0 1 357.12091 693.20032 Tm +(FRQILUPDWLRQ) Tj +ET +BT +/F6 4 Tf +0 0 0 rg +1 0 0 1 382.38492 693.20032 Tm +(FRGH) Tj +ET +BT +/F6 7.5 Tf +0 0 0 rg +1 0 0 1 426.9606 693.20032 Tm +(6FRUH) Tj +ET +BT +/F6 6.5 Tf +0 0 0 rg +1 0 0 1 486.30029 693.20032 Tm +(FKHFNVXP) Tj +ET +BT +/F6 9.5 Tf +0 0 0 rg +1 0 0 1 98.94 677.1203 Tm +([HI) Tj +ET +BT +/F6 10.5 Tf +0 0 0 rg +1 0 0 1 168.72079 677.1203 Tm +(;;;;) Tj +ET +BT +/F6 10.5 Tf +0 0 0 rg +1 0 0 1 233.2822 677.1203 Tm +([) Tj +ET +BT +/F6 9 Tf +0 0 0 rg +1 0 0 1 292.6228 677.1203 Tm +([) Tj +ET +BT +/F6 10.5 Tf +0 0 0 rg +1 0 0 1 370.26401 677.1203 Tm +(;) Tj +ET +BT +/F6 10.5 Tf +0 0 0 rg +1 0 0 1 432.1846 677.1203 Tm +([[) Tj +ET +BT +/F6 10.5 Tf +0 0 0 rg +1 0 0 1 494.16501 677.1203 Tm +(6XP) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 132.78 660.98029 Tm +(1RWH) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 148.27899 660.98029 Tm +() Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 154.32899 660.98029 Tm +(&RQILUPDWLRQ) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 189.903 660.98029 Tm +(FRGH [) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 219.2785 660.98029 Tm +(PHDQV) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 238.07201 660.98029 Tm +(ILQJHUSULQW) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 267.42551 660.98029 Tm +(PDWFKLQJ) Tj +ET +BT +/F6 4 Tf +0 0 0 rg +1 0 0 1 169.5605 645.38037 Tm +(&RQILUPDWLRQ) Tj +ET +BT +/F6 4 Tf +0 0 0 rg +1 0 0 1 195.4325 645.38037 Tm +(FRGH [) Tj +ET +BT +/F6 4 Tf +0 0 0 rg +1 0 0 1 216.79649 645.38037 Tm +(PHDQV) Tj +ET +BT +/F6 4 Tf +0 0 0 rg +1 0 0 1 230.46449 645.38037 Tm +(WKHUH) Tj +ET +BT +/F6 4 Tf +0 0 0 rg +1 0 0 1 241.58449 645.38037 Tm +(LV) Tj +ET +BT +/F6 4 Tf +0 0 0 rg +1 0 0 1 245.57249 645.38037 Tm +(DQ) Tj +ET +BT +/F6 4 Tf +0 0 0 rg +1 0 0 1 251.32849 645.38037 Tm +(HUURU) Tj +ET +BT +/F6 4 Tf +0 0 0 rg +1 0 0 1 262.00049 645.38037 Tm +(LQ) Tj +ET +BT +/F6 4 Tf +0 0 0 rg +1 0 0 1 266.54449 645.38037 Tm +(UHFHLYLQJ) Tj +ET +BT +/F6 4 Tf +0 0 0 rg +1 0 0 1 284.6965 645.38037 Tm +(WKH) Tj +ET +BT +/F6 4 Tf +0 0 0 rg +1 0 0 1 291.90851 645.38037 Tm +(SDFNDJH) Tj +ET +BT +/F6 4.5 Tf +0 0 0 rg +1 0 0 1 169.5605 629.78058 Tm +(&RQILUPDWLRQ) Tj +ET +BT +/F6 4.5 Tf +0 0 0 rg +1 0 0 1 198.6665 629.78058 Tm +(FRGH [) Tj +ET +BT +/F6 4.5 Tf +0 0 0 rg +1 0 0 1 222.701 629.78058 Tm +(PHDQV) Tj +ET +BT +/F6 4.5 Tf +0 0 0 rg +1 0 0 1 238.0775 629.78058 Tm +(WKH) Tj +ET +BT +/F6 4.5 Tf +0 0 0 rg +1 0 0 1 246.19099 629.78058 Tm +(ILQJHUSULQWV) Tj +ET +BT +/F6 4.5 Tf +0 0 0 rg +1 0 0 1 272.36301 629.78058 Tm +(GR) Tj +ET +BT +/F6 4.5 Tf +0 0 0 rg +1 0 0 1 279.02301 629.78058 Tm +(QRW) Tj +ET +BT +/F6 4.5 Tf +0 0 0 rg +1 0 0 1 287.32101 629.78058 Tm +(PDWFK) Tj +ET +BT +/F6 5 Tf +0 0 0 rg +1 0 0 1 153.7811 614.18079 Tm +() Tj +ET +BT +/F6 5 Tf +0 0 0 rg +1 0 0 1 156.6411 614.18079 Tm +() Tj +ET +BT +/F6 5 Tf +0 0 0 rg +1 0 0 1 159.2811 614.18079 Tm +($IWHU) Tj +ET +BT +/F6 5 Tf +0 0 0 rg +1 0 0 1 172.1861 614.18079 Tm +(WKH) Tj +ET +BT +/F6 5 Tf +0 0 0 rg +1 0 0 1 181.2011 614.18079 Tm +(LQVWUXFWLRQ) Tj +ET +BT +/F6 5 Tf +0 0 0 rg +1 0 0 1 207.8461 614.18079 Tm +(LV) Tj +ET +BT +/F6 5 Tf +0 0 0 rg +1 0 0 1 212.8311 614.18079 Tm +(H[HFXWHG) Tj +ET +BT +/F6 5 Tf +0 0 0 rg +1 0 0 1 236.94611 614.18079 Tm +(WKH) Tj +ET +BT +/F6 5 Tf +0 0 0 rg +1 0 0 1 245.96111 614.18079 Tm +(FRQWHQWV) Tj +ET +BT +/F6 5 Tf +0 0 0 rg +1 0 0 1 267.6911 614.18079 Tm +(RI) Tj +ET +BT +/F6 5 Tf +0 0 0 rg +1 0 0 1 273.73611 614.18079 Tm +(WKH) Tj +ET +BT +/F6 5 Tf +0 0 0 rg +1 0 0 1 282.7511 614.18079 Tm +(WZR) Tj +ET +BT +/F6 5 Tf +0 0 0 rg +1 0 0 1 292.8111 614.18079 Tm +(IHDWXUH) Tj +ET +BT +/F6 5 Tf +0 0 0 rg +1 0 0 1 311.23608 614.18079 Tm +(EXIIHUV) Tj +ET +BT +/F6 5 Tf +0 0 0 rg +1 0 0 1 329.42108 614.18079 Tm +(UHPDLQ) Tj +ET +BT +/F6 5 Tf +0 0 0 rg +1 0 0 1 347.46609 614.18079 Tm +(XQFKDQJHG) Tj +ET +BT +/F7 7 Tf +0 0 0 rg +1 0 0 1 87.8421 598.58087 Tm +() Tj +ET +BT +/F6 7 Tf +0 0 0 rg +1 0 0 1 96.4101 598.58087 Tm +(,QVWUXFWLRQ) Tj +ET +BT +/F6 7 Tf +0 0 0 rg +1 0 0 1 134.28011 598.58087 Tm +(SDFNHW) Tj +ET +BT +/F6 7 Tf +0 0 0 rg +1 0 0 1 157.90511 598.58087 Tm +(FKHFNVXP) Tj +ET +BT +/F6 7 Tf +0 0 0 rg +1 0 0 1 192.68111 598.58087 Tm +( ) Tj +ET +BT +/F6 7 Tf +0 0 0 rg +1 0 0 1 194.78111 598.58087 Tm +() Tj +ET +BT +/F6 7 Tf +0 0 0 rg +1 0 0 1 200.60512 598.58087 Tm +(E\\WHV ) Tj +ET +BT +/F6 7 Tf +0 0 0 rg +1 0 0 1 224.41211 598.58087 Tm +(3DFNDJH) Tj +ET +BT +/F6 7 Tf +0 0 0 rg +1 0 0 1 253.6721 598.58087 Tm +(,') Tj +ET +BT +/F6 7 Tf +0 0 0 rg +1 0 0 1 262.9751 598.58087 Tm +( ) Tj +ET +BT +/F6 7 Tf +0 0 0 rg +1 0 0 1 265.0751 598.58087 Tm +() Tj +ET +BT +/F6 7 Tf +0 0 0 rg +1 0 0 1 270.89911 598.58087 Tm +(E\\WH ) Tj +ET +BT +/F6 7 Tf +0 0 0 rg +1 0 0 1 287.34912 598.58087 Tm +() Tj +ET +BT +/F6 7 Tf +0 0 0 rg +1 0 0 1 291.35312 598.58087 Tm +(3DFNHW) Tj +ET +BT +/F6 7 Tf +0 0 0 rg +1 0 0 1 314.90811 598.58087 Tm +(OHQJWK) Tj +ET +BT +/F6 7 Tf +0 0 0 rg +1 0 0 1 337.96613 598.58087 Tm +( ) Tj +ET +BT +/F6 7 Tf +0 0 0 rg +1 0 0 1 340.06613 598.58087 Tm +() Tj +ET +BT +/F6 7 Tf +0 0 0 rg +1 0 0 1 345.89014 598.58087 Tm +(E\\WHV ) Tj +ET +BT +/F6 7 Tf +0 0 0 rg +1 0 0 1 365.69315 598.58087 Tm +() Tj +ET +BT +/F6 7 Tf +0 0 0 rg +1 0 0 1 369.69714 598.58087 Tm +(VFULSW) Tj +ET +BT +/F6 7 Tf +0 0 0 rg +1 0 0 1 389.75916 598.58087 Tm +( ) Tj +ET +BT +/F6 7 Tf +0 0 0 rg +1 0 0 1 391.85916 598.58087 Tm +() Tj +ET +BT +/F6 7 Tf +0 0 0 rg +1 0 0 1 397.68317 598.58087 Tm +(E\\WH ) Tj +ET +BT +/F6 7 Tf +0 0 0 rg +1 0 0 1 414.13318 598.58087 Tm +() Tj +ET +BT +/F7 6.5 Tf +0 0 0 rg +1 0 0 1 87.8432 582.98102 Tm +() Tj +ET +BT +/F6 6.5 Tf +0 0 0 rg +1 0 0 1 95.7992 582.98102 Tm +($QVZHU) Tj +ET +BT +/F6 6.5 Tf +0 0 0 rg +1 0 0 1 120.2327 582.98102 Tm +(SDFNHW) Tj +ET +BT +/F6 6.5 Tf +0 0 0 rg +1 0 0 1 142.1702 582.98102 Tm +(FKHFNVXP) Tj +ET +BT +/F6 6.5 Tf +0 0 0 rg +1 0 0 1 174.46219 582.98102 Tm +( ) Tj +ET +BT +/F6 6.5 Tf +0 0 0 rg +1 0 0 1 176.41219 582.98102 Tm +() Tj +ET +BT +/F6 6.5 Tf +0 0 0 rg +1 0 0 1 181.82019 582.98102 Tm +(E\\WHV ) Tj +ET +BT +/F6 6.5 Tf +0 0 0 rg +1 0 0 1 203.9267 582.98102 Tm +(3DFNDJH) Tj +ET +BT +/F6 6.5 Tf +0 0 0 rg +1 0 0 1 231.09669 582.98102 Tm +(,') Tj +ET +BT +/F6 6.5 Tf +0 0 0 rg +1 0 0 1 239.7352 582.98102 Tm +( ) Tj +ET +BT +/F6 6.5 Tf +0 0 0 rg +1 0 0 1 241.6852 582.98102 Tm +() Tj +ET +BT +/F6 6.5 Tf +0 0 0 rg +1 0 0 1 247.0932 582.98102 Tm +(E\\WH ) Tj +ET +BT +/F6 6.5 Tf +0 0 0 rg +1 0 0 1 262.36819 582.98102 Tm +() Tj +ET +BT +/F6 6.5 Tf +0 0 0 rg +1 0 0 1 266.08618 582.98102 Tm +(3DFNHW) Tj +ET +BT +/F6 6.5 Tf +0 0 0 rg +1 0 0 1 287.95868 582.98102 Tm +(OHQJWK) Tj +ET +BT +/F6 6.5 Tf +0 0 0 rg +1 0 0 1 309.36969 582.98102 Tm +( ) Tj +ET +BT +/F6 6.5 Tf +0 0 0 rg +1 0 0 1 311.3197 582.98102 Tm +() Tj +ET +BT +/F6 6.5 Tf +0 0 0 rg +1 0 0 1 316.72769 582.98102 Tm +(E\\WHV ) Tj +ET +BT +/F6 6.5 Tf +0 0 0 rg +1 0 0 1 335.11618 582.98102 Tm +() Tj +ET +BT +/F6 6.5 Tf +0 0 0 rg +1 0 0 1 338.83417 582.98102 Tm +(FRQILUPDWLRQ) Tj +ET +BT +/F6 6.5 Tf +0 0 0 rg +1 0 0 1 379.88818 582.98102 Tm +(FRGH) Tj +ET +BT +/F6 6.5 Tf +0 0 0 rg +1 0 0 1 396.29419 582.98102 Tm +( ) Tj +ET +BT +/F6 6.5 Tf +0 0 0 rg +1 0 0 1 398.2442 582.98102 Tm +() Tj +ET +BT +/F6 6.5 Tf +0 0 0 rg +1 0 0 1 403.65219 582.98102 Tm +(E\\WH ) Tj +ET +BT +/F6 6.5 Tf +0 0 0 rg +1 0 0 1 418.92719 582.98102 Tm +() Tj +ET +BT +/F6 6.5 Tf +0 0 0 rg +1 0 0 1 422.64517 582.98102 Tm +(6FRUH ) Tj +ET +BT +/F6 6.5 Tf +0 0 0 rg +1 0 0 1 441.56668 582.98102 Tm +() Tj +ET +BT +/F6 6.5 Tf +0 0 0 rg +1 0 0 1 446.97467 582.98102 Tm +(E\\WHV ) Tj +ET +BT +/F6 6.5 Tf +0 0 0 rg +1 0 0 1 465.36316 582.98102 Tm +() Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 87.8442 567.38123 Tm +() Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 94.5762 567.38123 Tm +(7KH) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 105.5652 567.38123 Tm +(FKHFNVXP) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 132.88921 567.38123 Tm +(LV) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 138.37271 567.38123 Tm +(DGGHG) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 156.13771 567.38123 Tm +(LQ) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 162.38571 567.38123 Tm +(E\\WHV) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 179.19922 567.38123 Tm +(WKH) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 189.11572 567.38123 Tm +(FDUU\\) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 203.61922 567.38123 Tm +(RYHU) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 216.54422 567.38123 Tm +() Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 221.12022 567.38123 Tm +(E\\WHV) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 236.45972 567.38123 Tm +(LV) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 241.94322 567.38123 Tm +(LJQRUHG) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 265.13123 567.38123 Tm +(DQG) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 276.42822 567.38123 Tm +(WKH) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 286.34473 567.38123 Tm +(KLJK) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 299.37424 567.38123 Tm +(E\\WH) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 312.07922 567.38123 Tm +(FRPHV) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 330.35571 567.38123 Tm +(ILUVW) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 341.98822 567.38123 Tm +(ZKHQ) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 357.64124 567.38123 Tm +(WUDQVPLWWLQJ) Tj +ET +BT +/F7 7.5 Tf +0 0 0 rg +1 0 0 1 87.8442 551.78137 Tm +() Tj +ET +BT +/F6 7.5 Tf +0 0 0 rg +1 0 0 1 97.0242 551.78137 Tm +(7KH) Tj +ET +BT +/F6 7.5 Tf +0 0 0 rg +1 0 0 1 112.0092 551.78137 Tm +(GHIDXOW) Tj +ET +BT +/F6 7.5 Tf +0 0 0 rg +1 0 0 1 138.8667 551.78137 Tm +(PRGXOH) Tj +ET +BT +/F6 7.5 Tf +0 0 0 rg +1 0 0 1 167.77921 551.78137 Tm +(DGGUHVV) Tj +ET +BT +/F6 7.5 Tf +0 0 0 rg +1 0 0 1 197.67421 551.78137 Tm +(LV) Tj +ET +BT +/F6 7.5 Tf +0 0 0 rg +1 0 0 1 205.1517 551.78137 Tm +() Tj +ET +BT +/F6 7.5 Tf +0 0 0 rg +1 0 0 1 208.2117 551.78137 Tm +([IIIIIIII) Tj +ET +BT +/F6 7.5 Tf +0 0 0 rg +1 0 0 1 240.1692 551.78137 Tm +() Tj +ET +BT +/F6 7.5 Tf +0 0 0 rg +1 0 0 1 244.12921 551.78137 Tm +(GHIDXOW) Tj +ET +BT +/F6 7.5 Tf +0 0 0 rg +1 0 0 1 270.98672 551.78137 Tm +(SDVVZRUG) Tj +ET +BT +/F6 7.5 Tf +0 0 0 rg +1 0 0 1 307.08423 551.78137 Tm +(LV) Tj +ET +BT +/F6 7.5 Tf +0 0 0 rg +1 0 0 1 314.56174 551.78137 Tm +() Tj +ET +BT +/F6 7.5 Tf +0 0 0 rg +1 0 0 1 317.62173 551.78137 Tm +<0013005B00130013001300130013001300130013020A> Tj +ET +BT +/F6 7.5 Tf +0 0 0 rg +1 0 0 1 362.89172 551.78137 Tm +() Tj +ET +BT +/F8 6 Tf +0 0 0 rg +1 0 0 1 87.84 521.66028 Tm +() Tj +ET +BT +/F8 6 Tf +0 0 0 rg +1 0 0 1 94.70399 521.66028 Tm +( ) Tj +ET +BT +/F8 6 Tf +0 0 0 rg +1 0 0 1 98.298 521.66028 Tm +(WR) Tj +ET +BT +/F8 6 Tf +0 0 0 rg +1 0 0 1 106.17599 521.66028 Tm +(VHDUFK) Tj +ET +BT +/F8 6 Tf +0 0 0 rg +1 0 0 1 127.63799 521.66028 Tm +(IRU) Tj +ET +BT +/F8 6 Tf +0 0 0 rg +1 0 0 1 137.95799 521.66028 Tm +(ILQJHUSULQWV) Tj +ET +BT +/F8 6 Tf +0 0 0 rg +1 0 0 1 175.56 521.66028 Tm +(6HDUFK) Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 129.84 492.08029 Tm +(\)XQFWLRQ) Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 155.862 492.08029 Tm +(GHVFULSWLRQ) Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 190.62601 492.08029 Tm +(6HDUFK) Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 211.29601 492.08029 Tm +(WKH) Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 222.114 492.08029 Tm +(ZKROH) Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 240.66 492.08029 Tm +(RU) Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 248.328 492.08029 Tm +(SDUW) Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 261.58801 492.08029 Tm +(RI) Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 268.84201 492.08029 Tm +(WKH) Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 279.66 492.08029 Tm +(ILQJHUSULQW) Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 311.68201 492.08029 Tm +(OLEUDU\\) Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 331.41 492.08029 Tm +(ZLWK) Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 345.108 492.08029 Tm +(WKH) Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 355.92599 492.08029 Tm +(FKDUDFWHULVWLF) Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 395.20801 492.08029 Tm +(ILOHV) Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 408.186 492.08029 Tm +(LQ) Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 415.00201 492.08029 Tm +(&KDU%XIIHU) Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 450.936 492.08029 Tm +(RU) Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 458.604 492.08029 Tm +(&KDU%XIIHU) Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 496.146 492.08029 Tm +(LIVR) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 182.34001 476.47729 Tm +(,I) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 187.5265 476.47729 Tm +(IRXQG) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 205.83051 476.47729 Tm +(UHWXUQ) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 223.68901 476.47729 Tm +(WKH) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 233.60551 476.47729 Tm +(SDJH) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 247.98801 476.47729 Tm +(QXPEHU) Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 129.84 460.88062 Tm +(,QSXW) Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 146.70599 460.88062 Tm +(SDUDPHWHU) Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 179.79599 460.88062 Tm +(%XIIHU,') Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 205.368 460.88062 Tm +() Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 210.36 460.88062 Tm +(6WDUW3DJH) Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 239.45999 460.88062 Tm +( VWDUW) Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 255.87 460.88062 Tm +(SDJH ) Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 273.35999 460.88062 Tm +() Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 278.35199 460.88062 Tm +(3DJH1XP) Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 307.85999 460.88062 Tm +( SDJH) Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 325.34998 460.88062 Tm +(QXPEHU ) Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 351.28796 460.88062 Tm +(5HWXUQ) Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 372.02396 460.88062 Tm +(SDUDPHWHU) Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 129.84 445.2807 Tm +(FRQILUPDWLRQ) Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 167.73599 445.2807 Tm +(ZRUG) Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 183.81 445.2807 Tm +() Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 188.802 445.2807 Tm +(SDJH) Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 204.492 445.2807 Tm +(QXPEHU) Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 228.63 445.2807 Tm +( PDWFKLQJ) Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 258.66602 445.2807 Tm +(ILQJHUSULQW) Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 290.68802 445.2807 Tm +(WHPSODWH ) Tj +ET +BT +/F6 7 Tf +0 0 0 rg +1 0 0 1 129.84 429.68091 Tm +(&RPPDQG) Tj +ET +BT +/F6 7 Tf +0 0 0 rg +1 0 0 1 165.967 429.68091 Tm +(FRGH) Tj +ET +BT +/F6 7 Tf +0 0 0 rg +1 0 0 1 185.511 429.68091 Tm +([) Tj +ET +BT +/F6 5 Tf +0 0 0 rg +1 0 0 1 87.84 414.08109 Tm +(,QVWUXFWLRQ) Tj +ET +BT +/F6 5 Tf +0 0 0 rg +1 0 0 1 114.89 414.08109 Tm +(SDFNHW) Tj +ET +BT +/F6 5 Tf +0 0 0 rg +1 0 0 1 131.765 414.08109 Tm +(IRUPDW) Tj +ET +BT +/F6 10 Tf +0 0 0 rg +1 0 0 1 78.0004 398.00131 Tm +() Tj +ET +BT +/F6 10 Tf +0 0 0 rg +1 0 0 1 86.3204 398.00131 Tm +(E\\WHV) Tj +ET +BT +/F6 10 Tf +0 0 0 rg +1 0 0 1 129.3611 398.00131 Tm +() Tj +ET +BT +/F6 10 Tf +0 0 0 rg +1 0 0 1 137.68109 398.00131 Tm +(E\\WHV) Tj +ET +BT +/F6 10 Tf +0 0 0 rg +1 0 0 1 183.72169 398.00131 Tm +() Tj +ET +BT +/F6 10 Tf +0 0 0 rg +1 0 0 1 192.04169 398.00131 Tm +(E\\WH) Tj +ET +BT +/F6 10 Tf +0 0 0 rg +1 0 0 1 231.002 398.00131 Tm +() Tj +ET +BT +/F6 10 Tf +0 0 0 rg +1 0 0 1 239.32199 398.00131 Tm +(E\\WHV) Tj +ET +BT +/F6 10 Tf +0 0 0 rg +1 0 0 1 284.6423 398.00131 Tm +() Tj +ET +BT +/F6 10 Tf +0 0 0 rg +1 0 0 1 292.96231 398.00131 Tm +(E\\WH) Tj +ET +BT +/F6 10 Tf +0 0 0 rg +1 0 0 1 337.86359 398.00131 Tm +() Tj +ET +BT +/F6 10 Tf +0 0 0 rg +1 0 0 1 346.18359 398.00131 Tm +(E\\WH) Tj +ET +BT +/F6 10 Tf +0 0 0 rg +1 0 0 1 392.284 398.00131 Tm +() Tj +ET +BT +/F6 10 Tf +0 0 0 rg +1 0 0 1 400.604 398.00131 Tm +(E\\WHV) Tj +ET +BT +/F6 10 Tf +0 0 0 rg +1 0 0 1 446.70432 398.00131 Tm +() Tj +ET +BT +/F6 10 Tf +0 0 0 rg +1 0 0 1 455.02432 398.00131 Tm +(E\\WHV) Tj +ET +BT +/F6 10 Tf +0 0 0 rg +1 0 0 1 496.6843 398.00131 Tm +() Tj +ET +BT +/F6 10 Tf +0 0 0 rg +1 0 0 1 505.0043 398.00131 Tm +(E\\WHV) Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 85.92 381.92029 Tm +(%DRWRX) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 126.7797 381.92029 Tm +(0RGXOH) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 147.8282 381.92029 Tm +(DGGUHVV) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 183.78 381.92029 Tm +(3DFNDJH) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 206.77 381.92029 Tm +(,') Tj +ET +BT +/F6 4 Tf +0 0 0 rg +1 0 0 1 233.6403 381.92029 Tm +(SDFNDJH) Tj +ET +BT +/F6 4 Tf +0 0 0 rg +1 0 0 1 250.4003 381.92029 Tm +(OHQJWK) Tj +ET +BT +/F6 10 Tf +0 0 0 rg +1 0 0 1 284.6398 381.92029 Tm +(VFULSW) Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 332.63959 381.92029 Tm +(EXIIHU) Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 351.58759 381.92029 Tm +(QXPEHU) Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 394.91931 381.92029 Tm +(VWDUW) Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 409.5293 381.92029 Tm +(SDJH) Tj +ET +BT +/F6 4 Tf +0 0 0 rg +1 0 0 1 454.61911 381.92029 Tm +(QXPEHU) Tj +ET +BT +/F6 4 Tf +0 0 0 rg +1 0 0 1 470.71112 381.92029 Tm +(RI) Tj +ET +BT +/F6 4 Tf +0 0 0 rg +1 0 0 1 475.54712 381.92029 Tm +(SDJHV) Tj +ET +BT +/F6 6.5 Tf +0 0 0 rg +1 0 0 1 499.3186 381.92029 Tm +(FKHFNVXP) Tj +ET +BT +/F6 9.5 Tf +0 0 0 rg +1 0 0 1 80.64 365.7803 Tm +([HI) Tj +ET +BT +/F6 10.5 Tf +0 0 0 rg +1 0 0 1 137.2213 365.7803 Tm +(;;;;) Tj +ET +BT +/F6 10.5 Tf +0 0 0 rg +1 0 0 1 189.002 365.7803 Tm +([) Tj +ET +BT +/F6 9 Tf +0 0 0 rg +1 0 0 1 233.5829 365.7803 Tm +([) Tj +ET +BT +/F6 10.5 Tf +0 0 0 rg +1 0 0 1 289.8638 365.7803 Tm +([) Tj +ET +BT +/F6 10 Tf +0 0 0 rg +1 0 0 1 332.58511 365.7803 Tm +(%XIIHU,') Tj +ET +BT +/F6 10 Tf +0 0 0 rg +1 0 0 1 387.00549 365.7803 Tm +(6WDUW3DJH) Tj +ET +BT +/F6 7.5 Tf +0 0 0 rg +1 0 0 1 446.7063 365.7803 Tm +(3DJH1XP) Tj +ET +BT +/F6 10.5 Tf +0 0 0 rg +1 0 0 1 507.18631 365.7803 Tm +(6XP) Tj +ET +BT +/F6 6.5 Tf +0 0 0 rg +1 0 0 1 132.78 349.70029 Tm +(1RWH) Tj +ET +BT +/F6 6.5 Tf +0 0 0 rg +1 0 0 1 151.097 349.70029 Tm +(7KH) Tj +ET +BT +/F6 6.5 Tf +0 0 0 rg +1 0 0 1 164.084 349.70029 Tm +(%XIIHU,'V) Tj +ET +BT +/F6 6.5 Tf +0 0 0 rg +1 0 0 1 194.9005 349.70029 Tm +(RI) Tj +ET +BT +/F6 6.5 Tf +0 0 0 rg +1 0 0 1 202.759 349.70029 Tm +(WKH) Tj +ET +BT +/F6 6.5 Tf +0 0 0 rg +1 0 0 1 214.4785 349.70029 Tm +(EXIIHU) Tj +ET +BT +/F6 6.5 Tf +0 0 0 rg +1 0 0 1 235.00549 349.70029 Tm +(&KDU%XIIHU) Tj +ET +BT +/F6 6.5 Tf +0 0 0 rg +1 0 0 1 273.93399 349.70029 Tm +(DQG) Tj +ET +BT +/F6 6.5 Tf +0 0 0 rg +1 0 0 1 287.285 349.70029 Tm +(&KDU%XIIHU) Tj +ET +BT +/F6 6.5 Tf +0 0 0 rg +1 0 0 1 326.2135 349.70029 Tm +(DUH) Tj +ET +BT +/F6 6.5 Tf +0 0 0 rg +1 0 0 1 337.90051 349.70029 Tm +([) Tj +ET +BT +/F6 6.5 Tf +0 0 0 rg +1 0 0 1 354.18301 349.70029 Tm +(DQG) Tj +ET +BT +/F6 6.5 Tf +0 0 0 rg +1 0 0 1 367.53403 349.70029 Tm +([) Tj +ET +BT +/F6 6.5 Tf +0 0 0 rg +1 0 0 1 383.81653 349.70029 Tm +(UHVSHFWLYHO\\) Tj +ET +BT +/F6 6.5 Tf +0 0 0 rg +1 0 0 1 423.47952 349.70029 Tm +(5HVSRQVH) Tj +ET +BT +/F6 6.5 Tf +0 0 0 rg +1 0 0 1 87.84 334.1004 Tm +(SDFNHW) Tj +ET +BT +/F6 6.5 Tf +0 0 0 rg +1 0 0 1 109.7775 334.1004 Tm +(IRUPDW) Tj +ET +BT +/F6 10 Tf +0 0 0 rg +1 0 0 1 92.2805 318.02081 Tm +() Tj +ET +BT +/F6 10 Tf +0 0 0 rg +1 0 0 1 100.6005 318.02081 Tm +(E\\WHV) Tj +ET +BT +/F6 10 Tf +0 0 0 rg +1 0 0 1 148.741 318.02081 Tm +() Tj +ET +BT +/F6 10 Tf +0 0 0 rg +1 0 0 1 157.061 318.02081 Tm +(E\\WHV) Tj +ET +BT +/F6 10 Tf +0 0 0 rg +1 0 0 1 207.8412 318.02081 Tm +() Tj +ET +BT +/F6 10 Tf +0 0 0 rg +1 0 0 1 216.16119 318.02081 Tm +(E\\WH) Tj +ET +BT +/F6 10 Tf +0 0 0 rg +1 0 0 1 261.66199 318.02081 Tm +() Tj +ET +BT +/F6 10 Tf +0 0 0 rg +1 0 0 1 269.98199 318.02081 Tm +(E\\WHV) Tj +ET +BT +/F6 10 Tf +0 0 0 rg +1 0 0 1 320.82211 318.02081 Tm +() Tj +ET +BT +/F6 10 Tf +0 0 0 rg +1 0 0 1 329.14212 318.02081 Tm +(E\\WH) Tj +ET +BT +/F6 10 Tf +0 0 0 rg +1 0 0 1 372.66269 318.02081 Tm +() Tj +ET +BT +/F6 10 Tf +0 0 0 rg +1 0 0 1 380.9827 318.02081 Tm +(E\\WHV) Tj +ET +BT +/F6 10 Tf +0 0 0 rg +1 0 0 1 432.12311 318.02081 Tm +() Tj +ET +BT +/F6 10 Tf +0 0 0 rg +1 0 0 1 440.44312 318.02081 Tm +(E\\WHV) Tj +ET +BT +/F6 10 Tf +0 0 0 rg +1 0 0 1 490.74341 318.02081 Tm +() Tj +ET +BT +/F6 10 Tf +0 0 0 rg +1 0 0 1 499.06342 318.02081 Tm +(E\\WHV) Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 100.14 301.88031 Tm +(%DRWRX) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 146.0995 301.88031 Tm +(0RGXOH) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 167.14801 301.88031 Tm +(DGGUHVV) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 207.8396 301.88031 Tm +(3DFNDJH) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 230.82961 301.88031 Tm +(,') Tj +ET +BT +/F6 4 Tf +0 0 0 rg +1 0 0 1 264.2991 301.88031 Tm +(SDFNDJH) Tj +ET +BT +/F6 4 Tf +0 0 0 rg +1 0 0 1 281.05911 301.88031 Tm +(OHQJWK) Tj +ET +BT +/F6 4 Tf +0 0 0 rg +1 0 0 1 320.81949 301.88031 Tm +(FRQILUPDWLRQ) Tj +ET +BT +/F6 4 Tf +0 0 0 rg +1 0 0 1 346.0835 301.88031 Tm +(FRGH) Tj +ET +BT +/F6 4 Tf +0 0 0 rg +1 0 0 1 380.51941 301.88031 Tm +(SDJH) Tj +ET +BT +/F6 4 Tf +0 0 0 rg +1 0 0 1 390.9794 301.88031 Tm +(QXPEHU) Tj +ET +BT +/F6 7.5 Tf +0 0 0 rg +1 0 0 1 440.0397 301.88031 Tm +(6FRUH) Tj +ET +BT +/F6 6.5 Tf +0 0 0 rg +1 0 0 1 493.3797 301.88031 Tm +(FKHFNVXP) Tj +ET +BT +/F6 9.5 Tf +0 0 0 rg +1 0 0 1 94.86 285.80042 Tm +([HI) Tj +ET +BT +/F6 10.5 Tf +0 0 0 rg +1 0 0 1 156.601 285.80042 Tm +(;;;;) Tj +ET +BT +/F6 10.5 Tf +0 0 0 rg +1 0 0 1 213.06149 285.80042 Tm +([) Tj +ET +BT +/F6 9 Tf +0 0 0 rg +1 0 0 1 266.9422 285.80042 Tm +([) Tj +ET +BT +/F6 10.5 Tf +0 0 0 rg +1 0 0 1 333.96259 285.80042 Tm +(;) Tj +ET +BT +/F6 9 Tf +0 0 0 rg +1 0 0 1 375.24341 285.80042 Tm +(3DJH,') Tj +ET +BT +/F6 9 Tf +0 0 0 rg +1 0 0 1 424.26471 285.80042 Tm +(0DWFK6FRUH) Tj +ET +BT +/F6 10.5 Tf +0 0 0 rg +1 0 0 1 501.24429 285.80042 Tm +(6XP) Tj +ET +BT +/F6 6.5 Tf +0 0 0 rg +1 0 0 1 132.78 269.66028 Tm +(1RWH) Tj +ET +BT +/F6 6.5 Tf +0 0 0 rg +1 0 0 1 151.097 269.66028 Tm +() Tj +ET +BT +/F6 6.5 Tf +0 0 0 rg +1 0 0 1 158.24699 269.66028 Tm +(&RQILUPDWLRQ) Tj +ET +BT +/F6 6.5 Tf +0 0 0 rg +1 0 0 1 200.289 269.66028 Tm +(FRGH [) Tj +ET +BT +/F6 6.5 Tf +0 0 0 rg +1 0 0 1 235.00549 269.66028 Tm +(PHDQV) Tj +ET +BT +/F6 6.5 Tf +0 0 0 rg +1 0 0 1 257.216 269.66028 Tm +(VHDUFKHG) Tj +ET +BT +/F6 4 Tf +0 0 0 rg +1 0 0 1 169.5605 254.06049 Tm +(&RQILUPDWLRQ) Tj +ET +BT +/F6 4 Tf +0 0 0 rg +1 0 0 1 195.4325 254.06049 Tm +(FRGH [) Tj +ET +BT +/F6 4 Tf +0 0 0 rg +1 0 0 1 216.79649 254.06049 Tm +(PHDQV) Tj +ET +BT +/F6 4 Tf +0 0 0 rg +1 0 0 1 230.46449 254.06049 Tm +(WKHUH) Tj +ET +BT +/F6 4 Tf +0 0 0 rg +1 0 0 1 241.58449 254.06049 Tm +(LV) Tj +ET +BT +/F6 4 Tf +0 0 0 rg +1 0 0 1 245.57249 254.06049 Tm +(DQ) Tj +ET +BT +/F6 4 Tf +0 0 0 rg +1 0 0 1 251.32849 254.06049 Tm +(HUURU) Tj +ET +BT +/F6 4 Tf +0 0 0 rg +1 0 0 1 262.00049 254.06049 Tm +(LQ) Tj +ET +BT +/F6 4 Tf +0 0 0 rg +1 0 0 1 266.54449 254.06049 Tm +(UHFHLYLQJ) Tj +ET +BT +/F6 4 Tf +0 0 0 rg +1 0 0 1 284.6965 254.06049 Tm +(WKH) Tj +ET +BT +/F6 4 Tf +0 0 0 rg +1 0 0 1 291.90851 254.06049 Tm +(SDFNDJH) Tj +ET +BT +/F6 6.5 Tf +0 0 0 rg +1 0 0 1 169.5605 238.46057 Tm +(&RQILUPDWLRQ) Tj +ET +BT +/F6 6.5 Tf +0 0 0 rg +1 0 0 1 211.60251 238.46057 Tm +(FRGH [) Tj +ET +BT +/F6 6.5 Tf +0 0 0 rg +1 0 0 1 246.319 238.46057 Tm +(PHDQV) Tj +ET +BT +/F6 6.5 Tf +0 0 0 rg +1 0 0 1 268.52951 238.46057 Tm +(QRW) Tj +ET +BT +/F6 6.5 Tf +0 0 0 rg +1 0 0 1 280.5155 238.46057 Tm +(IRXQG) Tj +ET +BT +/F6 5 Tf +0 0 0 rg +1 0 0 1 153.78 222.86072 Tm +() Tj +ET +BT +/F8 5 Tf +0 0 0 rg +1 0 0 1 156.64 222.86072 Tm +() Tj +ET +BT +/F6 5 Tf +0 0 0 rg +1 0 0 1 158.065 222.86072 Tm +($IWHU) Tj +ET +BT +/F6 5 Tf +0 0 0 rg +1 0 0 1 170.97 222.86072 Tm +(WKLV) Tj +ET +BT +/F6 5 Tf +0 0 0 rg +1 0 0 1 180.85001 222.86072 Tm +(LQVWUXFWLRQ) Tj +ET +BT +/F6 5 Tf +0 0 0 rg +1 0 0 1 207.49501 222.86072 Tm +(LV) Tj +ET +BT +/F6 5 Tf +0 0 0 rg +1 0 0 1 212.48001 222.86072 Tm +(H[HFXWHG) Tj +ET +BT +/F6 5 Tf +0 0 0 rg +1 0 0 1 236.59502 222.86072 Tm +(WKH) Tj +ET +BT +/F6 5 Tf +0 0 0 rg +1 0 0 1 245.61002 222.86072 Tm +(FRQWHQW) Tj +ET +BT +/F6 5 Tf +0 0 0 rg +1 0 0 1 264.94501 222.86072 Tm +(LQ) Tj +ET +BT +/F6 5 Tf +0 0 0 rg +1 0 0 1 270.625 222.86072 Tm +(WKH) Tj +ET +BT +/F6 5 Tf +0 0 0 rg +1 0 0 1 279.64001 222.86072 Tm +(IHDWXUH) Tj +ET +BT +/F6 5 Tf +0 0 0 rg +1 0 0 1 298.065 222.86072 Tm +(EXIIHU) Tj +ET +BT +/F6 5 Tf +0 0 0 rg +1 0 0 1 313.85501 222.86072 Tm +(GRHV) Tj +ET +BT +/F6 5 Tf +0 0 0 rg +1 0 0 1 326.47 222.86072 Tm +(QRW) Tj +ET +BT +/F6 5 Tf +0 0 0 rg +1 0 0 1 335.69 222.86072 Tm +(FKDQJH) Tj +ET +BT +/F7 7 Tf +0 0 0 rg +1 0 0 1 87.84 207.26086 Tm +() Tj +ET +BT +/F6 7 Tf +0 0 0 rg +1 0 0 1 96.408 207.26086 Tm +(,QVWUXFWLRQ) Tj +ET +BT +/F6 7 Tf +0 0 0 rg +1 0 0 1 134.278 207.26086 Tm +(SDFNHW) Tj +ET +BT +/F6 7 Tf +0 0 0 rg +1 0 0 1 157.903 207.26086 Tm +(FKHFNVXP) Tj +ET +BT +/F6 7 Tf +0 0 0 rg +1 0 0 1 192.679 207.26086 Tm +( ) Tj +ET +BT +/F6 7 Tf +0 0 0 rg +1 0 0 1 194.77901 207.26086 Tm +() Tj +ET +BT +/F6 7 Tf +0 0 0 rg +1 0 0 1 200.60301 207.26086 Tm +(E\\WHV ) Tj +ET +BT +/F6 7 Tf +0 0 0 rg +1 0 0 1 224.41 207.26086 Tm +(3DFNDJH) Tj +ET +BT +/F6 7 Tf +0 0 0 rg +1 0 0 1 253.67 207.26086 Tm +(,') Tj +ET +BT +/F6 7 Tf +0 0 0 rg +1 0 0 1 262.97299 207.26086 Tm +( ) Tj +ET +BT +/F6 7 Tf +0 0 0 rg +1 0 0 1 265.073 207.26086 Tm +() Tj +ET +BT +/F6 7 Tf +0 0 0 rg +1 0 0 1 270.897 207.26086 Tm +(E\\WH ) Tj +ET +BT +/F6 7 Tf +0 0 0 rg +1 0 0 1 287.34702 207.26086 Tm +() Tj +ET +BT +/F6 7 Tf +0 0 0 rg +1 0 0 1 291.35101 207.26086 Tm +(3DFNHW) Tj +ET +BT +/F6 7 Tf +0 0 0 rg +1 0 0 1 314.90601 207.26086 Tm +(OHQJWK) Tj +ET +BT +/F6 7 Tf +0 0 0 rg +1 0 0 1 337.96399 207.26086 Tm +( ) Tj +ET +BT +/F6 7 Tf +0 0 0 rg +1 0 0 1 340.064 207.26086 Tm +() Tj +ET +BT +/F6 7 Tf +0 0 0 rg +1 0 0 1 345.888 207.26086 Tm +(E\\WHV ) Tj +ET +BT +/F6 7 Tf +0 0 0 rg +1 0 0 1 365.69101 207.26086 Tm +() Tj +ET +BT +/F6 7 Tf +0 0 0 rg +1 0 0 1 369.69501 207.26086 Tm +(VFULSW) Tj +ET +BT +/F6 7 Tf +0 0 0 rg +1 0 0 1 389.75702 207.26086 Tm +( ) Tj +ET +BT +/F6 7 Tf +0 0 0 rg +1 0 0 1 391.85703 207.26086 Tm +() Tj +ET +BT +/F6 7 Tf +0 0 0 rg +1 0 0 1 397.68103 207.26086 Tm +(E\\WH ) Tj +ET +BT +/F6 7 Tf +0 0 0 rg +1 0 0 1 414.13104 207.26086 Tm +() Tj +ET +BT +/F6 7 Tf +0 0 0 rg +1 0 0 1 418.13504 207.26086 Tm +(EXIIHU) Tj +ET +BT +/F6 7 Tf +0 0 0 rg +1 0 0 1 440.24103 207.26086 Tm +(QXPEHU) Tj +ET +BT +/F6 7 Tf +0 0 0 rg +1 0 0 1 468.40204 207.26086 Tm +( ) Tj +ET +BT +/F6 7 Tf +0 0 0 rg +1 0 0 1 470.50204 207.26086 Tm +() Tj +ET +BT +/F6 7 Tf +0 0 0 rg +1 0 0 1 476.32605 207.26086 Tm +(E\\WHV ) Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 208.62151 191.66113 Tm +() Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 213.61351 191.66113 Tm +(VWDUW) Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 228.22351 191.66113 Tm +(SDJH) Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 243.91351 191.66113 Tm +( ) Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 245.71352 191.66113 Tm +() Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 250.70552 191.66113 Tm +(E\\WHV ) Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 267.6795 191.66113 Tm +() Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 271.11151 191.66113 Tm +(QXPEHU) Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 295.24951 191.66113 Tm +(RI) Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 302.50351 191.66113 Tm +(SDJHV) Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 321.0675 191.66113 Tm +( ) Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 322.86749 191.66113 Tm +() Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 327.8595 191.66113 Tm +(E\\WHV ) Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 344.8335 191.66113 Tm +() Tj +ET +BT +/F7 6 Tf +0 0 0 rg +1 0 0 1 87.841 176.06122 Tm +() Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 95.18501 176.06122 Tm +($QVZHU) Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 117.73901 176.06122 Tm +(SDFNHW) Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 137.98901 176.06122 Tm +(FKHFNVXP) Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 167.79701 176.06122 Tm +( ) Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 169.59702 176.06122 Tm +() Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 174.58902 176.06122 Tm +(E\\WHV ) Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 194.99503 176.06122 Tm +(3DFNDJH) Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 220.07503 176.06122 Tm +(,') Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 228.04903 176.06122 Tm +( ) Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 229.84903 176.06122 Tm +() Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 234.84103 176.06122 Tm +(E\\WH ) Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 248.94104 176.06122 Tm +() Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 252.37305 176.06122 Tm +(3DFNHW) Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 272.56305 176.06122 Tm +(OHQJWK) Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 292.32706 176.06122 Tm +( ) Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 294.12704 176.06122 Tm +() Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 299.11905 176.06122 Tm +(E\\WHV ) Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 316.09305 176.06122 Tm +() Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 319.52505 176.06122 Tm +(FRQILUPDWLRQ) Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 357.42105 176.06122 Tm +(FRGH) Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 372.56506 176.06122 Tm +( ) Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 374.36505 176.06122 Tm +() Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 379.35706 176.06122 Tm +(E\\WH ) Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 393.45706 176.06122 Tm +() Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 396.88907 176.06122 Tm +(SDJH) Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 412.57907 176.06122 Tm +(QXPEHU ) Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 436.95706 176.06122 Tm +() Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 441.94907 176.06122 Tm +(E\\WHV ) Tj +ET +BT +/F6 9.5 Tf +0 0 0 rg +1 0 0 1 208.6225 160.4613 Tm +() Tj +ET +BT +/F6 9.5 Tf +0 0 0 rg +1 0 0 1 216.5265 160.4613 Tm +(VFRUH ) Tj +ET +BT +/F6 9.5 Tf +0 0 0 rg +1 0 0 1 243.51601 160.4613 Tm +() Tj +ET +BT +/F6 9.5 Tf +0 0 0 rg +1 0 0 1 251.42001 160.4613 Tm +(E\\WHV ) Tj +ET +BT +/F6 9.5 Tf +0 0 0 rg +1 0 0 1 278.2955 160.4613 Tm +() Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 87.8421 144.86151 Tm +() Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 94.5741 144.86151 Tm +(7KH) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 105.5631 144.86151 Tm +(FKHFNVXP) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 132.8871 144.86151 Tm +(LV) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 138.37061 144.86151 Tm +(DGGHG) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 156.1356 144.86151 Tm +(LQ) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 162.38361 144.86151 Tm +(E\\WHV) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 179.19711 144.86151 Tm +(WKH) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 189.11362 144.86151 Tm +(FDUU\\) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 203.61711 144.86151 Tm +(RYHU) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 216.54211 144.86151 Tm +() Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 221.11812 144.86151 Tm +(E\\WHV) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 236.45761 144.86151 Tm +(LV) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 241.94112 144.86151 Tm +(LJQRUHG) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 265.12912 144.86151 Tm +(DQG) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 276.42612 144.86151 Tm +(WKH) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 286.34262 144.86151 Tm +(KLJK) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 299.37213 144.86151 Tm +(E\\WH) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 312.07712 144.86151 Tm +(FRPHV) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 330.35361 144.86151 Tm +(ILUVW) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 341.98611 144.86151 Tm +(ZKHQ) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 357.6391 144.86151 Tm +(WUDQVPLWWLQJ) Tj +ET +BT +/F7 7.5 Tf +0 0 0 rg +1 0 0 1 87.8421 129.2616 Tm +() Tj +ET +BT +/F6 7.5 Tf +0 0 0 rg +1 0 0 1 97.0221 129.2616 Tm +(7KH) Tj +ET +BT +/F6 7.5 Tf +0 0 0 rg +1 0 0 1 112.0071 129.2616 Tm +(GHIDXOW) Tj +ET +BT +/F6 7.5 Tf +0 0 0 rg +1 0 0 1 138.86461 129.2616 Tm +(PRGXOH) Tj +ET +BT +/F6 7.5 Tf +0 0 0 rg +1 0 0 1 167.77711 129.2616 Tm +(DGGUHVV) Tj +ET +BT +/F6 7.5 Tf +0 0 0 rg +1 0 0 1 197.67212 129.2616 Tm +(LV) Tj +ET +BT +/F6 7.5 Tf +0 0 0 rg +1 0 0 1 205.14961 129.2616 Tm +() Tj +ET +BT +/F6 7.5 Tf +0 0 0 rg +1 0 0 1 208.20961 129.2616 Tm +([IIIIIIII) Tj +ET +BT +/F6 7.5 Tf +0 0 0 rg +1 0 0 1 240.16711 129.2616 Tm +() Tj +ET +BT +/F6 7.5 Tf +0 0 0 rg +1 0 0 1 244.12712 129.2616 Tm +(GHIDXOW) Tj +ET +BT +/F6 7.5 Tf +0 0 0 rg +1 0 0 1 270.98462 129.2616 Tm +(SDVVZRUG) Tj +ET +BT +/F6 7.5 Tf +0 0 0 rg +1 0 0 1 307.08212 129.2616 Tm +(LV) Tj +ET +BT +/F6 7.5 Tf +0 0 0 rg +1 0 0 1 314.55963 129.2616 Tm +() Tj +ET +BT +/F6 7.5 Tf +0 0 0 rg +1 0 0 1 317.61963 129.2616 Tm +<0013005B00130013001300130013001300130013020A> Tj +ET +BT +/F6 7.5 Tf +0 0 0 rg +1 0 0 1 362.88962 129.2616 Tm +() Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 267.95999 45.86041 Tm +(WKH) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 277.8765 45.86041 Tm +(ILUVW) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 289.509 45.86041 Tm +() Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 297.23102 45.86041 Tm +(SDJHV) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 314.24802 45.86041 Tm +(RI) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 320.89752 45.86041 Tm +() Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 328.61951 45.86041 Tm +(3DJH) Tj +ET + +endstream +endobj +947 0 obj +<< +/Length 2 +>> +stream +q + +endstream +endobj +948 0 obj +<< +/Length 1746 +/Filter /FlateDecode +>> +stream +xYn6}WB; H)oFΥ.8u wFVՌ.y- hxfx(/>>ۗ7|w^R/wnou^dƩPJ%k uiTե>մo~7ˏ&v`INMƏ6+v|(&ۯMQh;]p0ʪhp7Ϗ/]?4(.R#vs}f4C;=T?c^‡c,FjXْnlxtB.Qf>4.ߌy*ŢCV'<@=|j>7dv|t,g(ԌLb1Ys4,Og4#jiRɎGk.߾¯O". Y%,jStW>k(Nu_sD@\:!Ȧr끉b&zxYO2fɱV"ʌ'LChc \Noy$Y}֡@k:ojDE*B]&!4S~S726 x`4((6upWS!xT`zW65_"1pXb1ɸqIcl6=qze)[ZOpu*;HT~ܡtyA +}a r +e o1C[J/Žւg"jp*Α1Yi?,qW5 +`~oߧ*{7MWy~P~p$`ۋX"󱏧B#'mLvwan[zMx4}H!p㔰8`f6-zVٛT8̨K>7J=ڜؓN%(xf{"!|Qf +JE+vaEs?+M)+]X(#Xyt/@]P{V83{ gL=qE +66 P".,TƸR]TƘ{t?:b-Sizp/g.[ҜIE{3 HhOJS/LcE{k^:E{kH +J[X߭fH8"_ +endstream +endobj +949 0 obj +<< +/Length 16638 +>> +stream +Q +1 0 0 1 0 0 cm +BT +/F6 7.5 Tf +0 0 0 rg +1 0 0 1 377.35162 781.10431 Tm +(+DQJ]KRX) Tj +ET +BT +/F6 7.5 Tf +0 0 0 rg +1 0 0 1 415.64661 781.10431 Tm +(=KLDQ) Tj +ET +BT +/F6 7.5 Tf +0 0 0 rg +1 0 0 1 437.2991 781.10431 Tm +(7HFKQRORJ\\) Tj +ET +BT +/F6 7.5 Tf +0 0 0 rg +1 0 0 1 479.96661 781.10431 Tm +(&R) Tj +ET +BT +/F6 7.5 Tf +0 0 0 rg +1 0 0 1 495.21411 781.10431 Tm +(/WG) Tj +ET +BT +/F7 8 Tf +0 0 0 rg +1 0 0 1 87.84 748.28027 Tm +() Tj +ET +BT +/F7 8 Tf +0 0 0 rg +1 0 0 1 101.352 748.28027 Tm +(RWKHU) Tj +ET +BT +/F7 8 Tf +0 0 0 rg +1 0 0 1 125.472 748.28027 Tm +(LQVWUXFWLRQV) Tj +ET +BT +/F7 6 Tf +0 0 0 rg +1 0 0 1 87.84 712.34027 Tm +(WZHQW\\) Tj +ET +BT +/F7 6 Tf +0 0 0 rg +1 0 0 1 110.646 712.34027 Tm +(RQH) Tj +ET +BT +/F7 6 Tf +0 0 0 rg +1 0 0 1 121.84799 712.34027 Tm +( ) Tj +ET +BT +/F7 6 Tf +0 0 0 rg +1 0 0 1 125.44199 712.34027 Tm +(VDPSOLQJ) Tj +ET +BT +/F7 6 Tf +0 0 0 rg +1 0 0 1 154.698 712.34027 Tm +(UDQGRP) Tj +ET +BT +/F7 6 Tf +0 0 0 rg +1 0 0 1 179.952 712.34027 Tm +(QXPEHUV) Tj +ET +BT +/F7 6 Tf +0 0 0 rg +1 0 0 1 208.338 712.34027 Tm +(*HW5DQGRP&RGH) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 135.12 682.76031 Tm +(\)XQFWLRQ) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 158.9735 682.76031 Tm +(GHVFULSWLRQ) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 190.8405 682.76031 Tm +(PDNH) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 206.53751 682.76031 Tm +(WKH) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 216.45401 682.76031 Tm +(PRGXOH) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 237.65651 682.76031 Tm +(FKLS) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 249.927 682.76031 Tm +(JHQHUDWH) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 274.78699 682.76031 Tm +(D) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 279.30249 682.76031 Tm +(UDQGRP) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 301.341 682.76031 Tm +(QXPEHU) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 323.4675 682.76031 Tm +(DQG) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 334.7645 682.76031 Tm +(UHWXUQ) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 352.62299 682.76031 Tm +(LW) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 357.45749 682.76031 Tm +(WR) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 364.2005 682.76031 Tm +(WKH) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 374.117 682.76031 Tm +(KRVW) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 386.89349 682.76031 Tm +(FRPSXWHU) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 413.57401 682.76031 Tm +( VHH) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 425.49249 682.76031 Tm +() Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 434.68851 682.76031 Tm +(5DQGRP) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 457.8765 682.76031 Tm +(1XPEHU) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 480.784 682.76031 Tm +(*HQHUDWRU ) Tj +ET +BT +/F6 10.5 Tf +0 0 0 rg +1 0 0 1 507.828 682.76031 Tm +() Tj +ET +BT +/F6 6.5 Tf +0 0 0 rg +1 0 0 1 135.12 667.1604 Tm +(,QSXW) Tj +ET +BT +/F6 6.5 Tf +0 0 0 rg +1 0 0 1 153.39149 667.1604 Tm +(SDUDPHWHU) Tj +ET +BT +/F6 6.5 Tf +0 0 0 rg +1 0 0 1 189.239 667.1604 Tm +(QRQH) Tj +ET +BT +/F6 4.5 Tf +0 0 0 rg +1 0 0 1 135.12 651.56061 Tm +(5HWXUQ) Tj +ET +BT +/F6 4.5 Tf +0 0 0 rg +1 0 0 1 150.672 651.56061 Tm +(SDUDPHWHU) Tj +ET +BT +/F6 4.5 Tf +0 0 0 rg +1 0 0 1 175.4895 651.56061 Tm +(FRQILUPDWLRQ) Tj +ET +BT +/F6 4.5 Tf +0 0 0 rg +1 0 0 1 203.9115 651.56061 Tm +(ZRUG) Tj +ET +BT +/F6 7 Tf +0 0 0 rg +1 0 0 1 135.12 635.96082 Tm +(&RPPDQG) Tj +ET +BT +/F6 7 Tf +0 0 0 rg +1 0 0 1 171.24699 635.96082 Tm +(FRGH) Tj +ET +BT +/F6 7 Tf +0 0 0 rg +1 0 0 1 190.791 635.96082 Tm +([) Tj +ET +BT +/F6 5 Tf +0 0 0 rg +1 0 0 1 87.8396 620.3609 Tm +(,QVWUXFWLRQ) Tj +ET +BT +/F6 5 Tf +0 0 0 rg +1 0 0 1 114.8896 620.3609 Tm +(SDFNHW) Tj +ET +BT +/F6 5 Tf +0 0 0 rg +1 0 0 1 131.7646 620.3609 Tm +(IRUPDW) Tj +ET +BT +/F6 10 Tf +0 0 0 rg +1 0 0 1 96.2994 604.28119 Tm +() Tj +ET +BT +/F6 10 Tf +0 0 0 rg +1 0 0 1 104.6194 604.28119 Tm +(E\\WHV) Tj +ET +BT +/F6 10 Tf +0 0 0 rg +1 0 0 1 160.8596 604.28119 Tm +() Tj +ET +BT +/F6 10 Tf +0 0 0 rg +1 0 0 1 169.1796 604.28119 Tm +(E\\WHV) Tj +ET +BT +/F6 10 Tf +0 0 0 rg +1 0 0 1 228.0596 604.28119 Tm +() Tj +ET +BT +/F6 10 Tf +0 0 0 rg +1 0 0 1 236.37961 604.28119 Tm +(E\\WH) Tj +ET +BT +/F6 10 Tf +0 0 0 rg +1 0 0 1 289.9801 604.28119 Tm +() Tj +ET +BT +/F6 10 Tf +0 0 0 rg +1 0 0 1 298.30011 604.28119 Tm +(E\\WHV) Tj +ET +BT +/F6 10 Tf +0 0 0 rg +1 0 0 1 357.12021 604.28119 Tm +() Tj +ET +BT +/F6 10 Tf +0 0 0 rg +1 0 0 1 365.44022 604.28119 Tm +(E\\WH) Tj +ET +BT +/F6 10 Tf +0 0 0 rg +1 0 0 1 419.04071 604.28119 Tm +() Tj +ET +BT +/F6 10 Tf +0 0 0 rg +1 0 0 1 427.36072 604.28119 Tm +(E\\WHV) Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 104.22 588.20032 Tm +(%DRWRX) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 158.2803 588.20032 Tm +(0RGXOH) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 179.3288 588.20032 Tm +(DGGUHVV) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 228.0602 588.20032 Tm +(3DFNDJH) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 251.0502 588.20032 Tm +(,') Tj +ET +BT +/F6 4 Tf +0 0 0 rg +1 0 0 1 292.62051 588.20032 Tm +(SDFNDJH) Tj +ET +BT +/F6 4 Tf +0 0 0 rg +1 0 0 1 309.38052 588.20032 Tm +(OHQJWK) Tj +ET +BT +/F6 10 Tf +0 0 0 rg +1 0 0 1 357.12091 588.20032 Tm +(VFULSW) Tj +ET +BT +/F6 6.5 Tf +0 0 0 rg +1 0 0 1 421.68121 588.20032 Tm +(FKHFNVXP) Tj +ET +BT +/F6 9.5 Tf +0 0 0 rg +1 0 0 1 98.94 572.12042 Tm +([HI) Tj +ET +BT +/F6 10.5 Tf +0 0 0 rg +1 0 0 1 168.72079 572.12042 Tm +(;;;;) Tj +ET +BT +/F6 10.5 Tf +0 0 0 rg +1 0 0 1 233.2822 572.12042 Tm +([) Tj +ET +BT +/F6 9 Tf +0 0 0 rg +1 0 0 1 292.6228 572.12042 Tm +([) Tj +ET +BT +/F6 10.5 Tf +0 0 0 rg +1 0 0 1 362.34381 572.12042 Tm +([) Tj +ET +BT +/F6 9 Tf +0 0 0 rg +1 0 0 1 421.6846 572.12042 Tm +([) Tj +ET +BT +/F6 5 Tf +0 0 0 rg +1 0 0 1 87.84 555.98029 Tm +(5HVSRQVH) Tj +ET +BT +/F6 5 Tf +0 0 0 rg +1 0 0 1 111.87 555.98029 Tm +(SDFNHW) Tj +ET +BT +/F6 5 Tf +0 0 0 rg +1 0 0 1 128.745 555.98029 Tm +(IRUPDW) Tj +ET +BT +/F6 10 Tf +0 0 0 rg +1 0 0 1 96.2999 539.90057 Tm +() Tj +ET +BT +/F6 10 Tf +0 0 0 rg +1 0 0 1 104.6199 539.90057 Tm +(E\\WHV) Tj +ET +BT +/F6 10 Tf +0 0 0 rg +1 0 0 1 160.86011 539.90057 Tm +() Tj +ET +BT +/F6 10 Tf +0 0 0 rg +1 0 0 1 169.18011 539.90057 Tm +(E\\WHV) Tj +ET +BT +/F6 10 Tf +0 0 0 rg +1 0 0 1 228.06 539.90057 Tm +() Tj +ET +BT +/F6 10 Tf +0 0 0 rg +1 0 0 1 236.38 539.90057 Tm +(E\\WH) Tj +ET +BT +/F6 10 Tf +0 0 0 rg +1 0 0 1 289.9805 539.90057 Tm +() Tj +ET +BT +/F6 10 Tf +0 0 0 rg +1 0 0 1 298.30051 539.90057 Tm +(E\\WHV) Tj +ET +BT +/F6 10 Tf +0 0 0 rg +1 0 0 1 357.12061 539.90057 Tm +() Tj +ET +BT +/F6 10 Tf +0 0 0 rg +1 0 0 1 365.44061 539.90057 Tm +(E\\WH) Tj +ET +BT +/F6 10 Tf +0 0 0 rg +1 0 0 1 419.0412 539.90057 Tm +() Tj +ET +BT +/F6 10 Tf +0 0 0 rg +1 0 0 1 427.36121 539.90057 Tm +(E\\WHV) Tj +ET +BT +/F6 10 Tf +0 0 0 rg +1 0 0 1 483.66129 539.90057 Tm +() Tj +ET +BT +/F6 10 Tf +0 0 0 rg +1 0 0 1 491.98129 539.90057 Tm +(E\\WHV) Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 104.22 523.82031 Tm +(%DRWRX) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 158.2803 523.82031 Tm +(0RGXOH) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 179.3288 523.82031 Tm +(DGGUHVV) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 228.0602 523.82031 Tm +(3DFNDJH) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 251.0502 523.82031 Tm +(,') Tj +ET +BT +/F6 4 Tf +0 0 0 rg +1 0 0 1 292.62051 523.82031 Tm +(SDFNDJH) Tj +ET +BT +/F6 4 Tf +0 0 0 rg +1 0 0 1 309.38052 523.82031 Tm +(OHQJWK) Tj +ET +BT +/F6 4 Tf +0 0 0 rg +1 0 0 1 357.12091 523.82031 Tm +(FRQILUPDWLRQ) Tj +ET +BT +/F6 4 Tf +0 0 0 rg +1 0 0 1 382.38492 523.82031 Tm +(FRGH) Tj +ET +BT +/F6 4 Tf +0 0 0 rg +1 0 0 1 421.68121 523.82031 Tm +(UDQGRP) Tj +ET +BT +/F6 4 Tf +0 0 0 rg +1 0 0 1 437.70923 523.82031 Tm +(QXPEHU) Tj +ET +BT +/F6 6.5 Tf +0 0 0 rg +1 0 0 1 486.3013 523.82031 Tm +(FKHFNVXP) Tj +ET +BT +/F6 9.5 Tf +0 0 0 rg +1 0 0 1 98.94 507.6803 Tm +([HI) Tj +ET +BT +/F6 10.5 Tf +0 0 0 rg +1 0 0 1 168.72079 507.6803 Tm +(;;;;) Tj +ET +BT +/F6 10.5 Tf +0 0 0 rg +1 0 0 1 233.2822 507.6803 Tm +([) Tj +ET +BT +/F6 9 Tf +0 0 0 rg +1 0 0 1 292.6228 507.6803 Tm +([) Tj +ET +BT +/F6 10.5 Tf +0 0 0 rg +1 0 0 1 370.26401 507.6803 Tm +(;) Tj +ET +BT +/F6 10.5 Tf +0 0 0 rg +1 0 0 1 426.90411 507.6803 Tm +(;;;;) Tj +ET +BT +/F6 10.5 Tf +0 0 0 rg +1 0 0 1 494.16501 507.6803 Tm +(6XP) Tj +ET +BT +/F6 4.5 Tf +0 0 0 rg +1 0 0 1 132.78 491.60031 Tm +(1RWH) Tj +ET +BT +/F6 4.5 Tf +0 0 0 rg +1 0 0 1 145.461 491.60031 Tm +(&RQILUPDWLRQ) Tj +ET +BT +/F6 4.5 Tf +0 0 0 rg +1 0 0 1 174.567 491.60031 Tm +(FRGH [) Tj +ET +BT +/F6 4.5 Tf +0 0 0 rg +1 0 0 1 198.6015 491.60031 Tm +(PHDQV) Tj +ET +BT +/F6 4.5 Tf +0 0 0 rg +1 0 0 1 213.978 491.60031 Tm +(WKH) Tj +ET +BT +/F6 4.5 Tf +0 0 0 rg +1 0 0 1 222.09149 491.60031 Tm +(JHQHUDWLRQ) Tj +ET +BT +/F6 4.5 Tf +0 0 0 rg +1 0 0 1 246.55798 491.60031 Tm +(LV) Tj +ET +BT +/F6 4.5 Tf +0 0 0 rg +1 0 0 1 251.04448 491.60031 Tm +(VXFFHVVIXO) Tj +ET +BT +/F6 4 Tf +0 0 0 rg +1 0 0 1 153.78 476.0004 Tm +(&RQILUPDWLRQ) Tj +ET +BT +/F6 4 Tf +0 0 0 rg +1 0 0 1 179.65199 476.0004 Tm +(FRGH [) Tj +ET +BT +/F6 4 Tf +0 0 0 rg +1 0 0 1 201.01599 476.0004 Tm +(PHDQV) Tj +ET +BT +/F6 4 Tf +0 0 0 rg +1 0 0 1 214.68399 476.0004 Tm +(WKHUH) Tj +ET +BT +/F6 4 Tf +0 0 0 rg +1 0 0 1 225.80399 476.0004 Tm +(LV) Tj +ET +BT +/F6 4 Tf +0 0 0 rg +1 0 0 1 229.79199 476.0004 Tm +(DQ) Tj +ET +BT +/F6 4 Tf +0 0 0 rg +1 0 0 1 235.54799 476.0004 Tm +(HUURU) Tj +ET +BT +/F6 4 Tf +0 0 0 rg +1 0 0 1 246.21999 476.0004 Tm +(LQ) Tj +ET +BT +/F6 4 Tf +0 0 0 rg +1 0 0 1 250.76399 476.0004 Tm +(UHFHLYLQJ) Tj +ET +BT +/F6 4 Tf +0 0 0 rg +1 0 0 1 268.91599 476.0004 Tm +(WKH) Tj +ET +BT +/F6 4 Tf +0 0 0 rg +1 0 0 1 276.12799 476.0004 Tm +(SDFNDJH) Tj +ET +BT +/F8 7 Tf +0 0 0 rg +1 0 0 1 87.84 460.4006 Tm +() Tj +ET +BT +/F6 7 Tf +0 0 0 rg +1 0 0 1 96.408 460.4006 Tm +(,QVWUXFWLRQ) Tj +ET +BT +/F6 7 Tf +0 0 0 rg +1 0 0 1 134.278 460.4006 Tm +(SDFNHW) Tj +ET +BT +/F6 7 Tf +0 0 0 rg +1 0 0 1 157.903 460.4006 Tm +(FKHFNVXP) Tj +ET +BT +/F6 7 Tf +0 0 0 rg +1 0 0 1 192.679 460.4006 Tm +( ) Tj +ET +BT +/F6 7 Tf +0 0 0 rg +1 0 0 1 194.77901 460.4006 Tm +() Tj +ET +BT +/F6 7 Tf +0 0 0 rg +1 0 0 1 200.60301 460.4006 Tm +(E\\WHV ) Tj +ET +BT +/F6 7 Tf +0 0 0 rg +1 0 0 1 224.41 460.4006 Tm +(3DFNDJH) Tj +ET +BT +/F6 7 Tf +0 0 0 rg +1 0 0 1 253.67 460.4006 Tm +(,') Tj +ET +BT +/F6 7 Tf +0 0 0 rg +1 0 0 1 262.97299 460.4006 Tm +( ) Tj +ET +BT +/F6 7 Tf +0 0 0 rg +1 0 0 1 265.073 460.4006 Tm +() Tj +ET +BT +/F6 7 Tf +0 0 0 rg +1 0 0 1 270.897 460.4006 Tm +(E\\WH ) Tj +ET +BT +/F6 7 Tf +0 0 0 rg +1 0 0 1 287.34702 460.4006 Tm +() Tj +ET +BT +/F6 7 Tf +0 0 0 rg +1 0 0 1 291.35101 460.4006 Tm +(3DFNHW) Tj +ET +BT +/F6 7 Tf +0 0 0 rg +1 0 0 1 314.90601 460.4006 Tm +(OHQJWK) Tj +ET +BT +/F6 7 Tf +0 0 0 rg +1 0 0 1 337.96399 460.4006 Tm +( ) Tj +ET +BT +/F6 7 Tf +0 0 0 rg +1 0 0 1 340.064 460.4006 Tm +() Tj +ET +BT +/F6 7 Tf +0 0 0 rg +1 0 0 1 345.888 460.4006 Tm +(E\\WHV ) Tj +ET +BT +/F6 7 Tf +0 0 0 rg +1 0 0 1 365.69101 460.4006 Tm +() Tj +ET +BT +/F6 7 Tf +0 0 0 rg +1 0 0 1 369.69501 460.4006 Tm +(VFULSW) Tj +ET +BT +/F6 7 Tf +0 0 0 rg +1 0 0 1 389.75702 460.4006 Tm +( ) Tj +ET +BT +/F6 7 Tf +0 0 0 rg +1 0 0 1 391.85703 460.4006 Tm +() Tj +ET +BT +/F6 7 Tf +0 0 0 rg +1 0 0 1 397.68103 460.4006 Tm +(E\\WH ) Tj +ET +BT +/F6 7 Tf +0 0 0 rg +1 0 0 1 414.13104 460.4006 Tm +() Tj +ET +BT +/F8 6 Tf +0 0 0 rg +1 0 0 1 87.841 444.80081 Tm +() Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 95.18501 444.80081 Tm +($QVZHU) Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 117.73901 444.80081 Tm +(SDFNHW) Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 137.98901 444.80081 Tm +(FKHFNVXP) Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 167.79701 444.80081 Tm +( ) Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 169.59702 444.80081 Tm +() Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 174.58902 444.80081 Tm +(E\\WHV ) Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 194.99503 444.80081 Tm +(3DFNDJH) Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 220.07503 444.80081 Tm +(,') Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 228.04903 444.80081 Tm +( ) Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 229.84903 444.80081 Tm +() Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 234.84103 444.80081 Tm +(E\\WH ) Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 248.94104 444.80081 Tm +() Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 252.37305 444.80081 Tm +(3DFNHW) Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 272.56305 444.80081 Tm +(OHQJWK) Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 292.32706 444.80081 Tm +( ) Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 294.12704 444.80081 Tm +() Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 299.11905 444.80081 Tm +(E\\WHV ) Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 316.09305 444.80081 Tm +() Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 319.52505 444.80081 Tm +(FRQILUPDWLRQ) Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 357.42105 444.80081 Tm +(FRGH) Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 372.56506 444.80081 Tm +( ) Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 374.36505 444.80081 Tm +() Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 379.35706 444.80081 Tm +(E\\WH ) Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 393.45706 444.80081 Tm +() Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 396.88907 444.80081 Tm +(UDQGRP) Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 420.93106 444.80081 Tm +(QXPEHU ) Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 445.30905 444.80081 Tm +() Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 450.30106 444.80081 Tm +(E\\WHV ) Tj +ET +BT +/F6 6 Tf +0 0 0 rg +1 0 0 1 467.27505 444.80081 Tm +() Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 87.8421 429.2009 Tm +() Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 94.5741 429.2009 Tm +(7KH) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 105.5631 429.2009 Tm +(FKHFNVXP) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 132.8871 429.2009 Tm +(LV) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 138.37061 429.2009 Tm +(DGGHG) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 156.1356 429.2009 Tm +(LQ) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 162.38361 429.2009 Tm +(E\\WHV) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 179.19711 429.2009 Tm +(WKH) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 189.11362 429.2009 Tm +(FDUU\\) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 203.61711 429.2009 Tm +(RYHU) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 216.54211 429.2009 Tm +() Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 221.11812 429.2009 Tm +(E\\WHV) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 236.45761 429.2009 Tm +(LV) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 241.94112 429.2009 Tm +(LJQRUHG) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 265.12912 429.2009 Tm +(DQG) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 276.42612 429.2009 Tm +(WKH) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 286.34262 429.2009 Tm +(KLJK) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 299.37213 429.2009 Tm +(E\\WH) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 312.07712 429.2009 Tm +(FRPHV) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 330.35361 429.2009 Tm +(ILUVW) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 341.98611 429.2009 Tm +(ZKHQ) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 357.6391 429.2009 Tm +(WUDQVPLWWLQJ) Tj +ET +BT +/F8 7.5 Tf +0 0 0 rg +1 0 0 1 87.8421 413.60101 Tm +() Tj +ET +BT +/F6 7.5 Tf +0 0 0 rg +1 0 0 1 97.0221 413.60101 Tm +(7KH) Tj +ET +BT +/F6 7.5 Tf +0 0 0 rg +1 0 0 1 112.0071 413.60101 Tm +(GHIDXOW) Tj +ET +BT +/F6 7.5 Tf +0 0 0 rg +1 0 0 1 138.86461 413.60101 Tm +(PRGXOH) Tj +ET +BT +/F6 7.5 Tf +0 0 0 rg +1 0 0 1 167.77711 413.60101 Tm +(DGGUHVV) Tj +ET +BT +/F6 7.5 Tf +0 0 0 rg +1 0 0 1 197.67212 413.60101 Tm +(LV) Tj +ET +BT +/F6 7.5 Tf +0 0 0 rg +1 0 0 1 205.14961 413.60101 Tm +() Tj +ET +BT +/F6 7.5 Tf +0 0 0 rg +1 0 0 1 208.20961 413.60101 Tm +([IIIIIIII) Tj +ET +BT +/F6 7.5 Tf +0 0 0 rg +1 0 0 1 240.16711 413.60101 Tm +() Tj +ET +BT +/F6 7.5 Tf +0 0 0 rg +1 0 0 1 244.12712 413.60101 Tm +(GHIDXOW) Tj +ET +BT +/F6 7.5 Tf +0 0 0 rg +1 0 0 1 270.98462 413.60101 Tm +(SDVVZRUG) Tj +ET +BT +/F6 7.5 Tf +0 0 0 rg +1 0 0 1 307.08212 413.60101 Tm +(LV) Tj +ET +BT +/F6 7.5 Tf +0 0 0 rg +1 0 0 1 314.55963 413.60101 Tm +() Tj +ET +BT +/F6 7.5 Tf +0 0 0 rg +1 0 0 1 317.61963 413.60101 Tm +<0013005B00130013001300130013001300130013020A> Tj +ET +BT +/F6 7.5 Tf +0 0 0 rg +1 0 0 1 362.88962 413.60101 Tm +() Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 267.95999 45.86041 Tm +(WKH) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 277.8765 45.86041 Tm +(ILUVW) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 289.509 45.86041 Tm +() Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 297.23102 45.86041 Tm +(SDJHV) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 314.24802 45.86041 Tm +(RI) Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 320.89752 45.86041 Tm +() Tj +ET +BT +/F6 5.5 Tf +0 0 0 rg +1 0 0 1 328.61951 45.86041 Tm +(3DJH) Tj +ET + +endstream +endobj +950 0 obj +<< +/Length 2 +>> +stream +q + +endstream +endobj +951 0 obj +<< +/Length 811 +/Filter /FlateDecode +>> +stream +xVj1}߯V3+@섐iK-bK]H&;04Ԟ<ړzys mz+h7~-d.S4Ap >8(g9tڴ_Φݴ-=7 62XQ26#&Ph9SM{qot|kAXn&]v Uİ'㌳*kGo>JrY9Izs&ge6989OP/%qĪ|je$z &z Y+!TXa\#uԄ8h끐g,(D/Q=~.hIXi筒]MX*HXjYȦjz[ˉ@ȦfD%Q7N*[l*dTzgC!TͲl儔4zch bfX._olW @&֍ѕT76Pr:]A~76&]A~w6\WP띭gx!PȺ?] +endstream +endobj +952 0 obj +<< +/Length 1554 +>> +stream +Q +1 0 0 1 0 0 cm +BT +/F7 7.5 Tf +0 0 0 rg +1 0 0 1 377.35162 781.10431 Tm +(+DQJ]KRX) Tj +ET +BT +/F7 7.5 Tf +0 0 0 rg +1 0 0 1 415.64661 781.10431 Tm +(=KLDQ) Tj +ET +BT +/F7 7.5 Tf +0 0 0 rg +1 0 0 1 437.2991 781.10431 Tm +(7HFKQRORJ\\) Tj +ET +BT +/F7 7.5 Tf +0 0 0 rg +1 0 0 1 479.96661 781.10431 Tm +(&R) Tj +ET +BT +/F7 7.5 Tf +0 0 0 rg +1 0 0 1 495.21411 781.10431 Tm +(/WG) Tj +ET +BT +/F8 12 Tf +0 0 0 rg +1 0 0 1 182.16 736.88031 Tm +(&KDSWHU) Tj +ET +BT +/F8 12 Tf +0 0 0 rg +1 0 0 1 233.39999 736.88031 Tm +() Tj +ET +BT +/F8 12 Tf +0 0 0 rg +1 0 0 1 243.38399 736.88031 Tm +(3URJUDP) Tj +ET +BT +/F8 12 Tf +0 0 0 rg +1 0 0 1 298.99197 736.88031 Tm +('HYHORSPHQW) Tj +ET +BT +/F8 12 Tf +0 0 0 rg +1 0 0 1 382.65598 736.88031 Tm +(*XLGH) Tj +ET +BT +/F8 8.5 Tf +0 0 0 rg +1 0 0 1 87.84 656.36041 Tm +() Tj +ET +BT +/F8 8.5 Tf +0 0 0 rg +1 0 0 1 95.1245 656.36041 Tm +(3URJUDP) Tj +ET +BT +/F8 8.5 Tf +0 0 0 rg +1 0 0 1 134.51349 656.36041 Tm +(IORZ) Tj +ET +BT +/F8 8.5 Tf +0 0 0 rg +1 0 0 1 155.14299 656.36041 Tm +(FKDUW) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 267.95999 45.86041 Tm +(WKH) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 277.8765 45.86041 Tm +(ILUVW) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 289.509 45.86041 Tm +() Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 297.23102 45.86041 Tm +(SDJHV) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 314.24802 45.86041 Tm +(RI) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 320.89752 45.86041 Tm +() Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 328.61951 45.86041 Tm +(3DJH) Tj +ET + +endstream +endobj +953 0 obj +<< +/Length 2 +>> +stream +q + +endstream +endobj +954 0 obj +<< +/Length 490 +/Filter /FlateDecode +>> +stream +xmSj1}Wt4K:LS7cKRۉcpۯHލ7,e̙3pܬnn.^VKɼ9u}f9,B 4 8o noa4nր6T7oB><< h" +"oUmRJ:Vɖ`CQ2gy-|*wAZ/2 BD_  Xs+ Z J7@;/l.TGb8Ԋ\hE"tze\BXs,M}#!."Aa%B>Nɘ<7'_l!˪.]kѹ吙~mv3P=7auX$<_Ab7__k\z=C5EE P~!܃: 뭦}k'[zriQp1V.UI +endstream +endobj +955 0 obj +<< +/Length 1185 +>> +stream +Q +1 0 0 1 0 0 cm +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 377.35162 781.10431 Tm +(+DQJ]KRX) Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 415.64661 781.10431 Tm +(=KLDQ) Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 437.2991 781.10431 Tm +(7HFKQRORJ\\) Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 479.96661 781.10431 Tm +(&R) Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 495.21411 781.10431 Tm +(/WG) Tj +ET +BT +/F6 7 Tf +0 0 0 rg +1 0 0 1 87.84 749.00031 Tm +(\(QWU\\) Tj +ET +BT +/F6 7 Tf +0 0 0 rg +1 0 0 1 108.378 749.00031 Tm +(ILQJHUSULQW) Tj +ET +BT +/F6 7 Tf +0 0 0 rg +1 0 0 1 148.76801 749.00031 Tm +(IORZ) Tj +ET +BT +/F6 7 Tf +0 0 0 rg +1 0 0 1 165.757 749.00031 Tm +(FKDUW) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 267.95999 45.86041 Tm +(WKH) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 277.8765 45.86041 Tm +(ILUVW) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 289.509 45.86041 Tm +() Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 297.23102 45.86041 Tm +(SDJHV) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 314.24802 45.86041 Tm +(RI) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 320.89752 45.86041 Tm +() Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 328.61951 45.86041 Tm +(3DJH) Tj +ET + +endstream +endobj +956 0 obj +<< +/Length 91791 +/Subtype /Image +/Filter /DCTDecode +/BitsPerComponent 8 +/ColorSpace /DeviceGray +/Width 680 +/Height 1020 +/Type /XObject +>> +stream +JFIFC + + +      + }!1AQa"q2#BR$3br +%&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz?S((((((((((((((((((((((((((((((((((((((((((((((ciWyoiPܫ0DYwb$ 5 /?oN6ğeFo~۝> xb}?sBYy|ͻ~}q B~ wkG/|@#F>$y{|ᅟ|M>?X]xo_?"lޛsZNcVzyo鷰ͭ夫,3$GRC+)0$An(((((((((((((((((((+ƿ;V- ּYqƉ Ԧ%1/d_/3ш*g5c|Oktv\-+{xakƬn VV𵿈{=oSMjV1 4J7#Vf`3tQE暷So5k [w]+4vŤ]<3J{#VeV ';HZP4~;]?X^mnmOBŹf{@t +ji%ƋxM׆5M jʏ(#yinI_֊((((((((((((((((((V'"귚?u+}H{MWsZ fV)-x !TN_߇ZT4}.y Mypʪ/<w+4FY +((kEҢGL.^PVk;VTHx'@hdBr5i>$íVG֥oiixAjD"X)۲12!袊(((((((((((((((((}\4[ˍ3Wt7UҴcU`@ėGܒ]%H$CNciVzfgoiPK0D#DP(n((*U晩:m/mugw :xH*A yZG>kWlŶ{+KssFk{pđ--yDƃ袊(((((((((((((((((*?/)xɿa֓]aD"c]͜MzxoE]xBMoS? +hV|׷A-m} [N𽺢8w}_g˭ wEIE$s/K px.) jm?E/ک#R"08:O' mX{ɞ]CQE~+K(hI$J8-Q+%A?ڥ߅~wZțWm.rZx"Te$@6)ey ]ZZufROl.dUQ%VW +d"G ž*/K }*KoN"M6; bh_|K B74=4Hn[[VɓUm1++d_S^;[%FZj{m8vs3SGw.2Jf5QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEW~ϟ*Ӽw~kzdNb^vp#d HBzUgyZOiփ>6i剾zH5!ˆ[9⏇^ѥjv^<4Y%gS4\صYl9cA7Uxχ~1k_ <.|o7ïC $zbUV'۩)cY#CvyMqȅ^9UU(((((((((((((((((|Ym/>|7E,ﭼƏ΂T1ț\ A+I[? |Bխ㸻-t/ݘ*[R=C$ +&袊((V5[ |=խ临uaX۠!MC  K:a🅴xWFމk-GOO&GnrYXq&(((((((((((((((((jM^iVwq,Wс A ך`|CexR!-k;Q+H-WAோ.\h,]xc[jPƬ򈛉7 h(^uX7Ze"$&R6fDļC|cF ɏyLvlC' C?Oٜ/v.o7ZVḾ @}kO.mՠ. 8_q6k8$ +['w@_6xVo) |H. "K5*dq' + B~ wkG.O <]D'x{wZ B~ wkG.O <]D'x{wZ B~ wkG.O <]D'x{wZ B~ wkG.O <]D'x{wZ B~ wkG.O <]D'x{wZ B~ wkG.O <]D'x{wZ B~ wkG.O <]D'x{wZ B~ wkG.O <]D'x{wZ B~ wkG.O <]D'x{wZ B~ wkG.O <]D'x{wZ B~ wkG.O <]D'x{wZ B~ wkG.O <]D'x{wZ B~ wkG.O <]D'x{wZ B~ wkG.O <]D'x{wZ B~ wkG.O <]D'x{wZ B~ wkG.O KK1 b5[g\vW/ +(!-lc1-|4.m[9|k?fQHG|wOoͦ+JGcuyS,P]1e)tBZn'%[i+R9 3 D$ ?¿K_mbO ߑ?C>_xψ4)<- NC,q X3泊5des/_|Krxcz~wy;WvKu1ʨT utQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEyWO(s{YU(((Vkh-ǍCi3\h}Rk[b Y2HKjU__<?o}y iSDubc!JŠk"?:CxzۙӚ^"v[]3 +{_Tg|5WMcs%a/)US!HAbv3(O|*Ŀ9z~sip1-Da$LPG+ +c\| Fߘi~)IM!ZIMԟnڐE+l9Hw?¿?K:uk_mᥞPG5ߝZOZM_ |{'u]]%kϣ(]"HBn0EQEQEQEQEQEQEQEQEQEQEQEQEQEQ^UJ/kh((ciWyoiPܫ0DYwb$ 5Zǁ4?|O!ukDΒ1Iu$3|#$7 mg}?qw7Zi!k^ N=ƝΖ\KN!ԛeWɘn|+q/iiB|=E6?kɣff]ĢԸ&%|kcxgE3Oicv  YEm1nYY9z-|Au\ўȴ[w.#XKm{Xk5߉3EpUVGy ެq"ݘp̬ѬUuq + ? QEZm;]\KG#ѴA%Bѻ0R}|5UtdZ76z&L@ЬRq yg;Ӽy{/jcZxZXnm#(tKT+ ȑXA.$zW$i~K}A5+.ѠW$3lxWw Kx2?'4~ K |?{uj7B-7D~ruhxUv8񭏀4[mOPky=;JUUf^Cg%9Pp)~ +uH-u}+SM2Wԥv5{+Kó]y&no W:vpOZ2])PAu  efQu۾66r$1W5];VQ^B +O0˕[]XF2ffg\xZZ=⩦5+FF %G«30+i xi21luоâxC{x7ոK4&Q|ٿim*Aq&0uKyH/$5jwh $X[[_?k GSh7f n"HԮRw'i3K3lg>4k2I߂[l|=*ؒc9٧TKRqO0ğvxX; eϞ p0 -'^=XQWl>sjqA'+ym__[ %LT>)l^0+}ڴ ]_yG(%oѾdW>߅>|xԾ>-> 4[ċ5kN>]DE~\&iD4ka׈n-?jzxjx-R.1 U(ߨC\Yzx+ߵmi3xV_Zݧ'^#ӬೆMr/}/ahfv?V7Ob6p.tK]Ef.j*[Cs,[r3}+/W +GxnWxKsh~&m5uP#KSEV]B$h'$7xZ?zŋYl/%U1D*l0WC9WAEQEQEQEQEQEQEQEQEQEQEQEQEyWO(s{YU(Ğc+Iƚ\ͥڦ-tV2}]=òb劯:Rw_mgE1_,zV#*d{RɼY|h ̓iic*Z,,լȒ2] +ѬloifY4I>: / uM[xwi~(60|H~'ώ]ĐۓjkS 4?)Դ?c%5 >E{&.,ʱ >m(w袊(+ƿUWּ?n!mo+{-^ \2\B|r(eE9>)h?bP޶V᷼[@dME=̗27pK~ +'@֏\.=Z?rxO-h!??;'@֏\.=Z?rxO-h!??;'@֏\.=Z?rxO-h!??;'@֏\.=Z?rxO-h!??;'@֏\.=Z?rxO-h!??;'@֏\.=Z?rxO-h!??;'@֏\.=Z?rxO-h!??;^s:x/R.[Iuta+imA y +袊(((('_?9=תEQ\W~ +x~ݼC"V.ZA/dNXP$rZC%Gϰolug쑯Y{.d}K<_N|sP4x##{oXYm.txĪy;)&D|X +s6~}si|+Y_ښ yeiO;ΒI%oЂK+$kg4 /OZռg/Yu=hOo'$f-+1 !ƽrx]=I_#帳ҵM6H{O3d1]ƿ~ C7jmƑ\n%gQmG۫㏍~8ҼUIZ}7@m[{+nь2ە_\9sGfӼ>}UEQEW߁<%h7-6z}cTFP,vi,ņO:cv]A_/`I:ao.їk{BUT/_9\M#VsQ,(~KCy2)3  >柣 j.-̷2݌3%=]QEQEQEQEQEQEQEyWؙ_.Ыh(((('_?9=תEQEW?_ExZ?ئ1v^BeX +7c8b;Hj3iuktie16Z(nT14⿃w+Oh"> +g?0gHFPLF֓F>Ե[=2Zƥ2[i~/ Y(MdaTlo\]W?_t5. \ewk(V_2 %G*d`0?o%_g(ѓڿDN~V1˟6:*>j=gd}4ִwkF;YgAZ{o!-fn𡳂SȞx+Q5?eiZ7#L')[9b-.*1G3x0h%} !Yt6] +̛AP< xOC6kxoF?4.-dhY%kZ((((((((*?ICk8y~a +o@ h-3͞]c'.+j['<%-7 _x}cTFRW,ņݣn] +(((((((((*XU槩[m/suyw* "y؀ ,HM~uFOx%xrjGzXeH!>i hB|-:gOutkm!*ee8<#j((((+ʾ2EczQEQEQEQEW_ūx>[RUfd6j2;rוi? [T Ѽ?k~%hnu(f"eqfcDWp 7vϵaipY}fgns͎((((((((((S_11뺟ogo-ok8Z669_I%A4}?Z/߇V񭔗!'VV<ΌHqkI*ⅸ{9]xk9QI-!XɆֱD\I}z]y~Cĺ׉-Fg>,ZPfAKyQY_h纇OL=#]ʌYy+ZF b#r +/:fqk m[ӮtHۆU78h7O8!T6 vQEQEQEQEyWO(s{YU(&coIyn2fҨXhI3Ti `n/uk:cmgҪ5̢7'.8}'llz) VU$MJn`iTM,Qk$*4`0 7 ۪ciWyoiPܫ0DYwb$ 5n((*??<5zQEQEQEQEQEQEQEQEQE暷To4O _Z WsYʌCw3HL6Ʌ")=*# zƟ-M*KѷsA A2FD;$ >&y7Ϸ귗j77y_iy;l\*@(ƾ]*-?zMofUeKyTt&D'*\W 8wiK2ǎopvu#}/7mH: C/V߯~Gamu,qY +C)m#[ƵQEQEdS6^^l#6O:[L@Y61@ 1 +%qo~5ЭuUmv*%mEH]Q^UJ/kh(l[^I⋯k^ KѼ'4{(dT,Hhù;$ ]sSkA6S9Ku9$K85夂2_7?f< x[ m{)Pe2yry3DHU`Uvǀ,%wu]={mm8"еVE6 /ǟ%7ak 2[2AiJ&xEX ++ǿ[>>fx[ykdD,Mf;FK?Z4'>|>7iZY_c4[j<[^9#v,Qw?x|}_>%ˤ\R9tأU;)`@t !_5/7 om)@-UQ GgpLQA(2ܧ~"yg-c/?fӥh;=PǨ1iO [ˍ| Z'>3 S/Yd_]7~ѷoV+ʼ9'O v^EQEQEQEQEQEQEQEQESVլt *S-6bK<@UU$&VǂuI$IМ@3Dh-mgC"3?I-IМ23DY-C#?JtJ4;};M-l"X$P"U@@tQEQEWƒ:h7Viɭ^S+Ik ?ǎ| _ZC +VnuA72adBn,YB7 nyt6mbD%[ uEQ^)SkZEX1DgVLU j-v;I8)j Q9Э/=3PEׂt.k/g !{ݖ*:mo+#Zt׾/׈OkwԮu@ng썪ŬRu,-e'_?9=תEQ^o|xZm]ƗyqeqqQ\v#(FzGswOĚUw:^#%Zp6odIkuue[^%5σzŏ |86ooS:Ψ LyZȶ.%_2ô&JUrd_Zot;LsF,t]KƚZE(7 g+VHnJ|w ;H?kGT7Zލܗwf9DYN# j^V>tm_4qiZ5qfgwkkiOO /Q*_~͟^<)B/u]oPFj8,.渂6:M ikreo^#ii^>/bzVW_OmUɎB*(=sO{ 7%ٟدOmnW}wy?ݿtQ^U:&xkKZ((((((((7iVvj76f^yl\aA#_SGuoIyyz:2h"ue`h©~(['.mu法-m-kEQwץ?3ܶڵ͍HC$ȳvo5?|@E'?j/ ͩkpxQ-ѡH%ε_]YqH}-b_L?gg]twiIxH`gsy+%KE'aU-k~" Pw5sif]6M$Fm'X_`YyQu }LjK l..gN# NpNѻ|Ǿ+񏀾_ C?kVD4I\woq6؆X7&Ipd^)_|Am&[u-j̪"1M1indw|/tMgiohedh@$#V$#|fCszn=wLMa_Omh<[ʞWPś?Xx3:nO ;VId YԬ"1cvr|X4[kGx&$|JVOg@d1h>Tf;_*0k@XWO xUI5 ]v(MhޝsjF2q3Ay e)((*%Ow?k5QEQEQEQEQE|U-S HFkh4}?y]. _UZ4Fc2@K+WGg㞯s\M|8!?|#AqC4G?i 'Q  @ÏN??V?}~9|QZ;؂od 7IȄ8Y; xC΅koYAn5..mdJYNH+Z((*XU槩[m/suyw* "y؀ ,HMy.S/Ï-}=wSo `Ҭom~ga՟Fعf‚G+ ?Ŀ?𦏧 E5u]d3D9ёI-i?SUP|Og2\/]g*0)%+[0Z(i7K((((((k^bu=B]t&\꺐,. r̰oRqAl)m~+VFEs}E6pJrTn#jzljou:u M0Fq 0[&7Ť袊(+S;$nCj5 kMj]>H,],dE{&FU[+PTiǤkQK7%|HQ;$n]b]_ |tu_ j?}|',F(1B&% E#&((((((((ƾ]*-?zMofUeKyTt&D'*\W 8wiK2ǎopvu#}/7mH: C/V߯~Gamu,qY +C)m#[ƵQ^i~>MVD\|E=mux@w5ᯆk'XRa4ZgfUkFf@ko?ޝxTРWsnCZ!YD"ǂ p#ҼE#Kׄ4\[ a^v0֍½!cǵP7˸mW[9_ͭ`^ۭ;Qoa'E.#;D֗¬e/t_dOI<|sq ݒ@񭏊i\GqM4ƙT,hbJwqaOA\T?:uoMO}+=vp""7L0{/Cu>BCq'/lDaS߶ j:'-/;+kC^i> #h BO ]h`eؒ>V |cO SǍK.CCAռH[YyN]̗nKnASF0_xSM-熧!ko;OrS]Ceg fpCJ.$6wi:<%˽݁Po7[GR-zk^ѦWB~j !+L$P[ yۤ"`c8K~1aN|/%&v4M3I9nk' :ȂgTU[tb8W,K?9?s_Nmb>W]ۃ~YK/"^.o t6{Ưo +mfH[Eεf(yu_ ~SbP֭"VvFд9Q,U"&GƑF&7DOcjkZFS()CHӬ*VpW>#ekڃXx_km:O+bE,%B!gdKNG<{ |/lm]隖-timeu]ՆT(XDQfW_ +Jݎ|8lMrj1ZG:*mTHO"Ibo4^x~^ݭ[kDi,m῎Oo,evlNuq S[@n{}/;;xfB,ЬӋ23H-g@I+GEm}us0&dp䵤>}VDC\|:=mkxi5$v,ozty[Ye(ed.(((4N cWNZi^\#[l%KEcymP77!{{Oh_AMۛ+ -"[R|5UtdZ76z&L@ЬRq y{}?J׵xwfg>֒Y"w1x$TxK'k 㧅>^/>ߪqd_5=I.lbI-mC(H%swBB\]K2i ʹ[ú+%{v 5jNy2c{4Q;w[.idF/Uo-o>)a4m3Wo7swn;`ms3574XOm,.ItՅ M.!Mvc1c_~z-KO(֌u]VKE~γm(N'u((*?_6 77SyLtW?bߵ<$PqJV 6<9&XrM $+?4]WUKď!o^~o-Zɨ4sk-.n FQ{W?b>&V6Q-{5JA;FR~1`"O1'$K)IM mP a%kߋ-.'diֱ®AmIj? {z.5 .]ZY}ƳnF8ȡФu%BDXHMj]M]X8/~ ғϩߗ͟M>kvn2EH|Eҥ<9[Lmn"Vk;Ugx'@UdBpQEQEW~Z~ FΙ}cY|% Pҭ4hɸ{]#(SI +M|(k/Ϋe uoyM: 7+K5 x?j;5//ks$py$tgb0Xu6hZߌ~.^x~5jx{I}B쬷?kXķRmX ˸+;,R/~^:ZL~:ΝOƗo?%ѯm;ƴVXύS lM3'jWk}ǝkƷ[QYLrʹn`#Vg,YIV$"FO4jRZ kM7'T]lyb0"E``Zi:mA5Ӓ9ekf:dR2MGP7cEįv?UYaIgWT Br$c$֊((*?x㞫.4Bo&o,$zz*:dv;dd_|WV]_ExMLju{+ysq2HV8`"E߅nOxO|++MF{(&|I*?(0`>!  ~&|Ko .|!4zK$uy<@\O zk:[mN[=7z\k}U2# +HidB$Dx˴/o]3㧄-V|h[(wkes{u--bZG(y'L#_@~E4I +Sin8AotPC;;͑`!i/oӡu/ۥe(`k;ٖUDSҺĿfc[&4xnMR YԢmT x +|g|QLOE^ v4M Atf9W׿։ ?~z ;PJ)M/.aUcC+/@O[Oz5͏ tN65XAqIY"I [Ծ=ohs[>I5?Mtm2Mo8 W $,7ih?> ę帾Iu T HlBmo8G州?[|]cs +ŸjnO+ =߹nֶ͋'xe-.O:Ǎnu H'iumJέV#fG_ +Ϩ~>(\xNᯇגմuyOKi$L)Ry.1} xĿ ttn]'+#MԬ}+ 0ؼI}_@c4өjđxP'.$}GwW,BF $htQEQEq^5/ை:Zv kXjf࿁;cC,)vʼk[H]paV>u*6C+) H5Z{J5?56㺷A_t5_ \z%ݬY|.`XXȅu,H* xZ .?g?G;1i4K[BM=YLk坣aF1 +Rѿ8x&ɴ?xj?ڟ/0CPyq"u(_6_ŌS `6FjxHO$RGV?rxO-h!??;'@֏\.=Z?rxO-h!??;'@֏\.=Z5>LJ嶌ۡm&# #) |-+&i(>/);'>Ok=aHnLJ Y6)Z((((((ÿt6 WU.-R ;l&Yq_ KoḴ-.o\}si6էEqi^76iz ฆEݾ +B|MdVȒMּ?n3z=兤q, M#34o4g ʼnw-x[KZ\]CPf[xmVЮ2I:QEUM[V4OSӴ(^U"E,;UTX__*>{P|\%Bۄf`#Y-buhG?\x_=?J=Q>o*}K7SyLlbߵ$W<;JOo1xi.U^V%.f1u('Aௌ.jP5:JԍeSp-.f{eCnRkEQE|U_< ÿؖ φe}y}[2-mnX8^|kǃ>~_Cܖ7|s;/R]68WpexL*+s|Dy Ao/.m vsXݙ6x[|rw($?8w?xm~bƞֽ{k5tk/Gd/o 0ʑCit-Px-UO SöwG[²c+j1OhiJGy1)/_ă}KOnO:88*\UEQEQ\W~4x+x|C<"ö(E|, WF h`p!4O #^5XkɜuD,D0"f7SoY*֓ é%> 붓%7*70q 6(x +AoKFK(((((((t?L/hUQEQEQEQEQEQEQE~%iQi.֏6)vz݄WYD$V港V/G B~RtΉ|AWq4]$K#ncT?x\x?+x>EbMhE/+^ +Q)C$ڠ;ʴH; xC΅koYAn5..mdJYNH+Z+xºжhmsmϙۤmn`!X>$-FK;LIXHڝQMķBeWs@ Ĉ|_&4˯i: 6>fXI!TW'R[s/  GjzUw{qݥ.J>ɣF܌(Llk+_)V>$VVO'.uD kq쑖8yQcS\7J?~ T8O)V %B7(lKل>|~d½(j:ywve ^]ʱCHGv *K^k _'_jcokdQpY dk%xN+xGgOG +'>Oyo)m[$Rv +~iRmy7WO-5*\JļE49f'((((((((<3Ŀ]WEQEQEQEQEQEQEQE)k^!Sq|5.qq$j .2"򂀉vFr*{t*|4c5|%wU`(7..:xCĺ5Fg>ZRs}yRl“^EQEQEx'Ťzֻ,"tMNu!nY\KH`ޥ<0RۘhWt?v7[N=S]Dkl9݋GkI*ⅸ{9]xk9QI-!XɆֱD\I}z]QEQEQEQEQEQEQEQEWxN% +V((((((((O?WZ'4m?-?N-RmwaXdpTT>$6Ss{2Oޕk_5 +.ϑ̀ժxGCV?4˅մ$'%1,{KX Ɠ4?V߆?-#QmQHaT*XU槩[m/suyw* "y؀ ,HMy/ ~ᯅuH܍cSI}!%[afUc'af$Y +7|uXM +hyJpfkTc@m4Wᮕ. hegXEg UTR5PX ݌@+(((((((((*?&k루x_7 ĶFդ+().4j6ށ\W~2xKZN\]k.D4WREY S(# -<~Hhuc5O趱f NY] +ػ$v©~(['.mu法-m-kEQwץEQEQEQEQEQEQEQEQEQE^#ybgBU(((((((((O?WZ'4m?-?N-RmwaXdpT/I] xnJi5/X~5,2[r!$2Ae,xzW>32Լ9(Ɨ jj[ZK(f[g{#TPJ< p%L|a[x^ǿ|Qj/l4meY)gU$ci1/"BҞ_/)[|0,􅷺l|tRI%C(-^U_2x"K=-5 jz֔`C2i VfuR>/wCai/A\iM iܷ1Jv/1soU⿉ZeVkiVm +i"m+O-!,Ao2Aڪ1ITgwGVfv_OocԬ-RG.xUvN5oVlu*L6exJnee$ I>h|(>YL6h%F #`+C ^6:ղ[v47+K"H  ":UeR0@5=u[mOW֏V[\y{aE-J#O9F(f76mkWimzO[vJ\0zMlM sȫ,R,H$YT [Msaqwgouqa1hSdc&ჶFn((((MYx:/|OO ڧ51l]k:|vVV6KS3LPFy?zYc?WW,@<+´OVSUi:e}J+}6XX;V+kwC$LُҾj7\t :?dӶOsu\4sݳHlǴFQk*o QEj9?)"/2f_C2B{_xg֯⸹E KES5omne@M,QvTR"a~-#+?tY㺖9#.T6$Fea/{ +Fh:{n,0:K GJ!Օz(*??<5zQEQEQEQEQEQEQEQEQEQEWxN% +V((((((սO{{=Ox}]Z}wVQ 1Lkb`V[KY"jнͼRvׁ| DX<g{O xyt[2QFij w"ᖅiqfHҬT~sFh!Gb"_z? |e +.ךMĺbVv[-y1+,q ylbH^  xrBo% mWٞNc..egRU_W-W??$%Ei|A I.y?i/"]0Dla ȿxF{ ߙ'pق'ed[i++4fzÿIZY%mn"Exs_g ;l1ߺu|C.Ln<'rWF}]67 yri.fbXχ^_H7<)χ^_H7<)χ^_H7<)χ^_H7<)χ^_H7<)χ^_H7<)χ^_H7<)χ^_H7<)χ^_H7<)χ^_H7<)χ^_H7<)χ^_H7<)χ^_H7<)χ^_H7<)χ^_H7<)χ^_H7<)χ^_H7<)χ^_H7<)W'=s2Ěk:åꏨͺdI^L||Rk׾xSa6ek[XIsqim S{*]yP QEQEQEQEQEQEQEQEQEyW(s{FU(*?, ]k~$t趻|GTKkxw0E#eQ`:?<1>#M'zKm&Y}+UG8l܏1q?~/Ҵ/7oGqYN>S6r[]eKUPc #R>o|L&t 8'=ZXKUk̎  >柣 j.-̷2݌3%=]QEW)㯄L?t/~Ͽn/FۻbgA\(_+>7Wп[yO[X1RdٺlU|M񽞁30yhZ]Ė~ ]Jlԛ,bjK*ȫn +GpU?hxP%ɣYx[NGnecҟ bV=>mYj^8kյ t +-Rom3ռ +jZf8/8\㿍77W׾$xH/OJj{Y<ٌ&[RG^7n~3uˍCzƧg'n'kfhP&KhvBLԀexm䊾J;xoim욶{ R{{S K[bnd18>.V-?cmk@]Q>,mVHT ,(r˘.uo|H~'ԼAS.#Oŗ , +$Ȟa4Y=Vۼ+HWD'Fc~]叜v%7BK&GO|Zu kCS4jĭe3.y&"Tqoc]%Ž,- ]'V=OLtRUu #! S5ۭ~z}n6>OF6j;ڈS(rO +qoz#"xZ׀u3xk hn;җy"[ƲY?1ê|Ax>'\/|L49lci=)vYQdy؟Uuml${GM@uN+n-mdZ-pP-di + 2x¿xR^/ŋOLӬ"_H~u-"X}+㟁/).aWJ3j7vj1Y[1~+/~>gϋ<j5LJu na+Z[O][jmfe>Z,V=x~O/FVm9_|;CIyX_| Hae~-6,1_j?Q%)~csiotw܋c3&Y2h>gwxIhWߝgTKZHRH s|P|QE^Ǩ?^UƁcܺok>tKch%V_WQ2 l̢UYn'o xWC~,Ij <k]& +Y[h}D,a*]k%QEyW3+[̷߯$9*QYX3⿆9>"-Oߵt8Î%偷&g;3F +s㟆t|CgC|6r<_ |~y v@fo⛍<11K}?vA1Ì }(((((Q~;m^EQ^U?:&xK*Z((((((MnjŝDݲβIl卿h_,|8<- +E>onTІq/{a$yzwFo\u㿇> 6T/M:i̱-cw(ՑyfN_UI}S]=։.fʮ.-dwTt֊((+>sÚM ^; ֱK[vn'E)EVr;<FxoZԞ:myCzGJ ⾒(C*n$Y7_-[PX=υlO?/<k @lRY&0}奼?*!8Ծ3hz=g>O S 7Ykh~:_ng]_[sBW|>|[!xWE +ht{ ut˛h[h3*B42 +zwO?'n͞_ټ/;o'?=zQEQEx_ji>#~'%Fԯ4#3ڠfQu۾66r$1?֋W'-l j/-Dz\94*Gdx[Bռ`KEo1oK.P&}  @ÏN??G3O/?:f_u>8!?|#AqC +kIxKLѵOnnjZ/,: KB2rq!5QEQEQEW|;oGjZ(<3Ŀ]WEQEQEQEQEQEQEs5{_ZTZg5Masa)(VQ I`v3#+KѾoZǤ-yg ి[;xh*BYX'=d ;6M! o|5G>7)X}f?K=Ɲ5VF +ItЦX1 !N_++JStiLm/⼅% +c/0 pQE=gK> h=NJ_F5An[)|y#7xId`X K_.[ut ':ީhtL^\E5լW7 +q<+"Ck?SS^hƨTJ[\Iim$Zyi#tO Uxg↟o t|:%fLa+UׄMo }m ,_"/XdGS&yiX\Yvw]@|7mؑwYu'_s$>~3[(k ¿ t?xG,;n+8^R02Q +Oc\W4> <{'œIњh;\A~w W3)+>uh>xaա ܪΐg tBO-կd?"N+UYh*?kேkKxGZ?tf72YYU2T*7c8P; +((+ʼG'Ov^EQEQEQEyW(s{FU(*?[RUfd6j2;r? +c\| Fߘi~)IM!ZIMԟnڐE+l9HEœj-_x[Sm;Qӯ6<34JxCD׎FxxX٫R$C=Ҳ|8n$} OJukJ}GM.mo-%Ya'P":YH! tQE=+]kGe&^'8+dA_OI/폲>˿"HOio9 +8%9\"<Q W~DVѾF|k{.>bɧJM fՋQ) +%eKz7Aӛsʒ 8!|w0`qW|>e_ۯg\xW=( $cF(QEQEQE~u|t~z%}B?0YNѝW;%My9U>$O/F<>VsK˩St2C#?hV'm?-#NR]F*噘rX[_U<5{|>n{|+zmF&k\=UI1 l8/xX/#,avF>i$LΛCk%nBF̑7kw..ZTcktY*=L:]ʫ"Px((+ʾ Ec5zQEyWؙ_.Ыh(((((((((cWfgo鷰՝K,3Ut`C+) H5̾o +ZjOC94}ۇŜ.LJQ@kt߈_CtL֧/t]>MtmП6wa<::f k?IqxVm:sҢ1`WE\{ xOC6kxoF?4.-dhY%kZ(((+;JPo0IIi.Y%6bV©) +D&Eڥ\͵l2 +W +u_ZC5Vny/70&kdp-,j/ +=|6~CjrqHò`EV2{"zW߁w9a( ^_&R+12b}*2oo\ʣn/ +MR_xAŖ>>{KKI!k5M_Hf{"-]]|&u%ԼQ.c |gi.3$})H*GL $ +Q~;m^EQ^U?:&xK*Z((((((+W_57ç{ .>^xPF^Oe +\{,›ea2Kzx%5-hiZk-_q6W +&$`[F_"~yz7qo2nRUnRA?WB/6-Sz"KZekX!ylXŽ༿ +Q[ǁmK3Fn Rjw,Ddmyڴ(u[;K8"Bhm#7rHDf8Rp0ό4ρ>1 eΥCVӮ SDi0o]ŧwĞ5mzOꖳXj ڼ$w,Vӑ4oweZmGJ'ci" вrTڿj->[E{Wj![uYDxt'c>9OLj D/|Q-0[K&asp`FhvkwOOiZeNY\mo%ī K.]q9@$ ⣢|I|?7FנtvOnms$F߶@@u*%,SbS GEm3֯co5/{ˑ-̉EE^e\ӟҾ,xqVhZi]x-춷Q7Bͧ+4wmiUEOڵ5]V[M*]671fgg&hPryLY5 xL 7_-[XVdxTW +pCW)V߯]Ga.qXkF㏇'9 &3y}+tQ̑ٞvגO| ¿u?GVK+RP2] qZZMsqigokq0QD$aQ㓶5ῇvjz}RNyEo5[tI˱hW +5ҥ<#ºl,KyJ +F D(t_vQV(t?L/hUQEQEQEQEQEQEW?j(gH}K[.縶\ᲆfm +M*mGgYm M|Zx?Cң,]hI][#[t_*#mgdEWVuonj53>+5 v[ɂ ʖ+$i?>Y- x߇_ keoby'-e`!J.G4Jx +OU-%68ؠ[h6:oOjZk:V%VQ+xYFgܼUx?j^4e5i׶-"8`Tͯ^Y}[nv7x*?k:cUll[[{DX iexCiCJ俘`EyW?!ؙ.kh((T>ŖQH&%Feib{xe ܍bG&I|*↸u{ɒByk]H&YPɱez]SV!ִ>#.dU),l` [4W wۿxgÞ~68eRN͖]ܴ$`nZ^ .^ yQ3 |G%=FIl-m qbL+HRI )U/ :Yѿ;@=ᵝ ZjWhfy`YV y?Je5m|+_=?7?AO gWK.Ƽ'O4= >Ec<łFO5/%<&[RWZOrkno&nULa⁚I ^źPZj>Kgh\%,h,(mSKO'}cS jRZMuk]%w'J$95_`k_Xk6G,Aa6HKGXcGk?Ɵi^Ga).ĒB\Ė &O1~U]E{T›woUWA5rI=cZVRŪ[{UPC!I'5EWxN% +V((((((((((*??<5zQEQEQETմJ5;;}GMYa'RYIH A5q5Vo6$Ke,DqMj $k?ox//jlo:ω?v'HmI~Y~,sZ~th[GKKyF"VSR:֢((+ʿ|7햡nEi<p4VbUyʏ%??ž/6Vd 3"w{X줋pFT{_xÿti6]U.%b^y"VitQEQEQ^U?:&xK*Z((((((((((S,|gx3?cV 5 m-3֒5L"((((?O x] $98Уvl"@#FtMV(((<3Ŀ]WEQEQEQEQEQEQEQEQEQEy~:xCZ׆I#-BE6 -^fpWe٘M!R\ "/_uYt!77Gb Oa:*wCIY#aOkEQEQEQEQ\~WV h*b\gEy +JHE`+݌kqȉO )?y5/4]C}fTs必~O^>F!59aФuorDX׫jQV==V+'UCy.5\B.-|1Bn)fdILK0L;tbʙss%"[u/Klm0OlR˴_ | _\ix |Y/uE.dL&!=d"((((*?!ʊyKV9QUьy_kw..ZTcktY*=L:]ʫ"Px((((~ $n&Imog8?xfelGlHfTSi +<)ĚxnioM-R;ڦ`G_2A":<_Z<1Nf}$hfIV4H+~R֏]6Y̖z%VpUL#U º +((((+ʴ_ڟ_hw4?y7~}}~in7EQEQEQEQEQEQEQEQ\~!xWᮕe[Gyg UFFPX9ۜIkϮx^s _w5Oӡ|?}mxl卙wHc?S|x^sh~I4ZY΃FyD_$- Hʈ2<3/¯|4scÚ~wl:ynķw2˗v2JX$tQEQ\W~ +x~ݼC"V.ZA/dNXP$r_|Co/#Ov_SŸeo`S#?x#gٿvZyfNξKLn*%f +[޳Ej:]\͵6l2 +VQEQEQEWxN% +V(((((*??<5zQEQEQEQEQEQEQEzt#խk{ RZw!y15X-gP#<|Vc)}û=!&am.~Eu8ۧôQr|;᷄>"fh&uu;]kWj6zZKtI,]BHcYu utiW<}_ u]'LN>qsigh7 +!KH%(̀ ן߶ý;71ƩA>է5b2IHB ErGxFi^$Ra {-a2C6Ǐkܡup@op\4#"sGZZvt"*yO\G(wV.7XW_~ӡi5yl;h + 5A$ |3[k^,-"ZiW2Y%k;kѐĕ ~/xtZޛu%ƞW-3%'{EEu%ivn%*tOZ^vV׿2xYCdM-ݢ(bt3߅>|xԾ>-> 4[ċ5kN>]DE~\&iD4ka׈n-?jzxjx-R.1 U(ߨC\Yzx+o"YGiƵ=k}Ut/ 꺶=E)rIR&?/>$ZXg`Z[mLt4cf^ibp&uO%UF#ڿkoĺ9~3>)ѿ١O6/3~u[>ρ|4_,5YfMmgjd.\Vi"''UW[@|?-u j/Em<'o.m M\u[B"hzlibi`0Cq@n9[?6]|pZֵtjn,;mb4:"Ko)egnO|Q[y -1!8aspfm ?v[ګ^zupɮ[EAO- ~?3J>Is]w _@NkHWZ%XeKhbetNUFo|e_ =Ï x~m-sjhy HVD$$&O G/[k-.uն_I&4]Agh6Wu_ͨ[\m&\ik'9S# ! 'cwcy[?|wy4Լ ;M4}+罻MjmZ`MA {>dI<?/KE6mU֙jG &'yn⥔S%w^\ΆQ؄~>o?[xm[_33W֞&/ud$I [m[Sm_^;_4= Amezj<")+h{vYi%o/7⿊b[:4\hjڬ~=Q3NڪI43 >&1lWh-f,NF;wrK~yGSҴϺ<7Ut3Z4v Xe?q) jP|N~^Oy|C^ _K>>$m5K+Wb!qTP_6/Úfq^,}wI'&>ʼSG,p%2U̥6Iu+ʼ9'O v^EQEQEQEQEQEQ\W~4x+x|C<"ö(E|, WF h`p*/ +7ڏocY4 ^)a кv1%?t|Gյr>X%ңam$I!gu;7N4e'I4=3LӴ(R%"E +(UT +^ #]c \62ʒʑZ̞l(C!mp&~|0/|ccx·ֺG5 Z]P4Mk Y# ʊmQu!O +S׼Gjz^n{N@e$yk*:,ړ#9&XrM $+?4]WUKď!o^~o-Zɨ4sk-.n FQ{W?b>&V6Q-{5JA;FR~1`"O1'$K)IM mP a%kߋ-.'diֱ®AmIj? {z.5 .]ZY}Ƴn\-ػi{ *x :ڵ:x⯄>%<1=?X B ӝb+sm:Tudu* +:((*%Ow?k5QE|^-%߂|/&G~ձ2\cy0&';x HObφg۟iG_|>_y\& D[̻ HU +|R> LiCuK4rw!lWi<.f~~(U.[~[,Zk*-JX4pXcE۲0v`m5k?5} ]/KIf]4p8)+x!8m޳_~\GǞ(xSѡ-F $d]2Mn!XQ0^~ȟ -!&5X~~&=z,iI;LBz_ ?[KaǨ\2lӴ.UI+{8qU%u?@+ʼ9'O v^EQEQEQEQEQE_/xWDh[R١>fbam{y捁5g6qhV >/7o74)-CF~eRWIofsJƱ_Wᮕ. hegXEg UTR5PX ݌@++3|?ǿ +2WVVPMy崒T&Q`}BA+_?L ~\CizIcsM x'ȁV)_q?l1Oks@t  $ڜzo, V&uhdGaɠIni ^.<gO[¬з>Qx[.[Ů+K,,Qy(OXG>#x?i.Lj4_Uqk6o`g".w("w##ǏCy>t_R=_\2#Ȫ7;7^W^->kZڜmkSsn(ڳ"DA ʷ|{4淿}u=kK j~",dKq2A#43-IY)oWZL |3q|6؅TFq-o<<¶g?:͏>y)Wc{ms/mǕϛO_8˥Z]֟kuO }1ڕZ,G,̎!##P|QQ Z񝿃4K_%-hks%ĖH4R"\];8cW_xZ]"B6 u˝BQoO, lQ\4}9< 'gº'Ɖ/^+3Ll"uCsjbUXEY6O38H֊((S_ +!//iޟ2\ Km.QI#"0`T5iQjW t0𯎦mRYZOZ\:2^ꖲb4K^=oB.dve,l1"jX^sd B~ wkG.O <]D'x{wZ B~ wk_5~*x#ҾZ|G}sLFNB#y<عto6VA ǂ|iڪ*ȔR6-0J*[77ZPZK!i-S0o-7.voY^O z:uơ}6{Rn&q Vo.͗ayIZIߍ||AҢ֠dasosc{=ݬY|.`t(!hK$!ʻSO[.f7{.\JΗRq O,wr].KՕ|&[]^e75<{p7Uy\nhD +[|%u šlu x:퓟3IIq}jN+WSMfQKԵO2,xRnC"Dn-~ J+M>& mF+Hs:$ikc g߹ؚ >So[[.oaxS,]R+{"hEU*A}(O4?hWZ߉5?-?Q.w*TdX_~A}*jfwwo:.+oH¾/ſ?l$? L-gh-Ū˸ +] +.~|C<&WEgFY$`j0@h(S +!]Oi֫{Өhw{).l2tQEQEQEQEQU,:asy,1*5̢4I!.8M'lj:(|9'O v^EQEQEQEQEQEQE暷/yxjX}S^VC5ČLX{+M=ci 8*O 5?̋^_I?ukIuǂ7 B96e[R?1,ۆ9q'WZ} [$,n46v_zlqJZU6hV +##uUF}r^ ]缱3ilN2dQI,~q.7~ Ǎ<z?kw^u^Ja"[413B:!h[!d?lf ?eV/mb`рҔ.bS|^>#M#'¿/ݴmɴ?=yLuqDpT((S 5WmcV͜r>Y,aS1q)&Hße7m'0+Ȣ-=*LZ 붾!B٢uͷ'>fn պy;bBw/3O&eci#jwE4vw[ ^ywQ$2:JC!_~Ț.WcqS_[ŚK>ma$7yRI^dnIm$ tD,<3qV7ڄ?ښǟovpM+&r01嬯| _XWoCYY>osSI-KFX-GDiSMsz*O='%P\H, ]k~$t趻|GTKkxw0E#eQ`:?s*ׁ>WS0d3G(s^9cfu]V/sBoTMDȏ|Ts43ZnW  >柣 j.-̷2݌3%=]QEQEQEQEQEQEQEQEQE^bg]U(((((((((V<uk:-ǂ2SXʘiGdV|}___?n #Pӥí[LȖ"f-v <[Ʒ<+:n_UVV[[6(N+{)`A$`r~9|GW I;ĖZp.yyogn:rJTʇ'wK?>>&mf=h5b es̅ClIm*MNRxQ'iRz$]Cd( U?㯉ï&5oa7z䈛|ER!xդ۱ZX԰2 :NM +Xaq+4m)#p)Qp@|S nRPY,h^h׷Vny-oi6I[ϑ6F#mFV'/UCoo5Oڷ^GO77wy%zWxsNvV((((((((((+ʼ9'O v^EQEQEQEQEQEQE|`i -5zŬ<7|vK{wh#X&YʳL {djwėmǚχ՗_3#' {y@B>Ѽ:_Cu/C9oL7jHZFtJD ? Wk}麇/ˠˡ"x,Vo!Mb!idk0Vi*~7~kZ}//G4/u>7ܺ9T~*~I NFþmoY5ڋfmAkyG8f-|N㯊 +5~zqk7><| ׺xeM>d[yWK-pɱiW"V5WH)/⟂:_oYi;,O0CSH9d[[[qX$u6$iZ-b?j~ ƣ[薃Q7DzjͲeYeEU.5hVk=2k#n8+,.FO_17/˳A gLLUDdy$ m8)~*C_ۓ#?`, 9v"8\UGVGR((((((((((ßtLkQEQEQEQEQEQEQEQEQETյkJ;};Mn.X$R#UA%I5 7;7ow~_mR"eoƺFNUwאB4L2VV(B K]km[[WR啍Y # =r:[Ꮘa]`Q Ko[ :-W!{KUhMp=ǐm 7+mًw khuF~EݛvfhĊ[k GdM_KEjOPI[(Fe&(彷ghq%TBZ K}FO؋9\|4''/&J{.5MNJUyiT, ,QFJCςךkςt2=+M᥅ 3*+KPװi::֕g[vpݴ*UlQ2W+~,[jr\+LBbi̒%D֗+I eC`GUkNR\ix2\\|$\W[bVfb\W5=2+.qsigh7 +!KH%(̀ ן~׾{PG|q&k{i%/~aSgEM$v:xS~KcSԒ$D2W1xD,T/5Y|&<KE;R[}m kYv'&=0<y=Wis qES uvDbV C⟈|/#F5~=^^Ϳ.ϰgvܷ?;=_xsEWha5.]d"Og]]z>' MgIcM ]^kw6ӿq'I4=3LӴ(R%"E +(UT +C u[b:4/p$漺(lMŤn.R7ɔClc_*oZ[i? +\kL4]kx0&Mtڢ.b+wC3ƩOm#Zx{Q÷ ق5+&}e`r[/̒xwVAJǬEsv$XviⅮhԲ\B"ҿm & Z֢ݦoe%i[ .5XVCGaDEq@o8 ?6]|pZֵtjn,;mb4:"Ko)egnO|Q[y -1!8aspfmҿikD.յBW?cҟÞok[y00WO*ӼcÖzƯ~*>٣c^"}žx֒ݸ-?DXhe F% jx&|Zbƚ$zGdFbC`P_~YK/"^.o t6{Ưo +mfH[Eεf(yjߌ|ipxk-YIsoGGѵk6n oPYO%(4HYXO"VWѣxO˭jx`p}7cŖfB@/ >ZI_7_ڃÖ?9|DG]1A}%o-5i`@ks$lcCxI&ϤiSR֫awkZ==źԚj?e0 K+XXvR>Ү>cWfgo鷰՝K,3Ut`C+) H5κρ5|0kkΎ3Gu0n|;<6!m$C_k~&In7gvbhRLy +V=źoeqlKU.gxO$XW!O7e@((( +t3ƳoKQAZi--ѓpw* ;FP ^.QHEi_V;Z;yuM5ߟG-to7Wk*$~ vk__"H12ǖH`msJе\k&$hYn~-Աn,yPApVvX_ +u/xvZαxKĞ./<=Niuh!^DS6gT&sc,!<(Hω7IIiŗzD svUK4ׁ}u;ğ>15.K^[wiy iAؚgq&Nլ :׍n"'__idFϮX6 fHD$iԥҵ+W֚ok>O ŎYIu,aD1$݄WWǞ-P<->!mGQtԂk$s tȤe0dn>![_N+x5-~u’m I8I]QEWxsNvV((((((OSxtnmE)C$S)F4Zq?"#b˳<썞Vϓf6@CJuSP6J\\cwo H1[ta(N0k? {z.5 .]ZY}Ƴn O{<6y?ug_g[7V4ᩞ[Z.O3Ȇ mrIDUvYUn$ dT(/,#`rŘI&Edzt+Ě6 ojso6pUʬ28*Q^k|%ᆕyx#l!y,5?CnNy ~aD5ok|%Tji 5 [X|cmV9].hL"6{Ph>  -|@qA[??G4 Ljio# G7!?᥼#@n  -|@qA[??\>-|8vċ&M/$mSo  -|@qA[??G4 Ljio# G7!>*:/x> o{)5Tΐ2H^wDDta#+o?j]Z&h_eφ-@ywK>,'B|ȇ*3`Ҿ((((((M[xU֫y7 wqxB"er9/ *D_?:,=lu;huﻭXQH6C&(! ) ^9۵A[qcfyHQ 3Jḑʃ=V(/|<?g  >8,Yh}nwhJ!hē$Gu5[VZvg¶Fn#b&Y[O#@RFW |Si +tWG!XL*ȡoúQekZO]VY֬nrX) +D)Q\ imt#J?Q.%Wha5.]d"Og]]z>' MgIcM ]^kw6ӿq'I4=3LӴ(R%"E +(UT +EQEQEQEQEQEQEQEWxsNvV((((((((OC΅uxFAmR.m|n +UGA+q5Vo6$Ke,DqMj $k?`Co߇n#O3\ySŸaկ`^|!/ޟjL]ۜKm.Q*#PTEQEW)㯊i?P4 Qtۘ-e.#]ٝ),g7u IƱ6"IQD3CjnE1x; _wt Lӡ|$FO}I%ٶ F#|¿ ttkG,K=+8^RBQg +a]QEQEQEQEQEQEQEQEWxsNvV((((((((+¯|K Ú~w:}y;̶KFDȌr<_Z?1YNf}iHGƨ<+9:iH~e!k۾w&y7Ϸ귗j77y_iy;l\*@(((((((((ßtLkQEQEQEQEQEQEQEQEQEW'<[k_.xz}TEPoEOݻgnQHW⿃yxOh;i5g?)T,"HF+XjV9>6eks||)2|z}ȍw*$yѓ_ax³oGck/Fe:kX_ <~uH5/gS~kڞ7W'ٷ6Xݕmiex;*̚؏qq H.n?tPSp\1r_iWug7/oO 9]6Sr#VuW0xP#ƾդͨVww]Xݴm52csRpJ;.Ark ¿ t?xG,;n+8^R02Q +OcZNcVzyo鷰ͭ夫,3$GRC+)0$A<OieĚP s~T.sEX9?'eL\ԃGW_wutQ^U:&xkKZ(((((((((((*??<5zQEQEQEQEQEQE폨_?5oڦutQH-ϘiG`U!Ot/|[O hn~n%mAnͻIb10q":+WZ=,-VwwbK$K+;Yݙ9^ U׆=?M|7Αl6k,ɹvί|-B_\m,#D9TuGI-:MYeBֶv,P(T@ +VW~WV h*b\gEy +JHE`+݌j֛=Fd6#8ˈ F0.~|:tN>R!%ѭm6(t۹Lı(@SZON67'>6ywӊ袼ßtLkQEQEQEQEQEQEQEQEQEQEQ^U:&xkKZ((((((((((C6uY?R-|BYFO%k}[?*)q(c}=.+f,MZ}-0 {Ip2}ை^KGĺ?ئ6^h^BV1 +v8`{(((((((((((*??<5zQEQEQEQEQEQEQEQEQEy~:xCZ׆I,x~ԼOxφ3ƟA=I<ّ&`)kCkR|^romE#ţޢBW{$7:|Ox^v kzfm%IF&XAxgu{@kF𾱦ǩTZ o'if$Eo3v^xI?_-FYLpdXBgU 0̸$s2ؙ QEQEQEQEQEQ^⟎>޻uSx6Vm VH+/40(o l76켦OYHu7u&t5wP,љ"6v_n[\IPrAῄ>𧌴B;EhgKic{w~m p7Cl[nHXI~VmH||:A/&@֪fc[=ƟyonMlJ*":2VVFXq^[[,2j"`芽Y@ Q&coIyn2fҨXhI3Ti `n/uk:cmgҪ5̢7'.8}'llz)"%ΟfIj6>o}ywsaowyokq1iUQcaR>ѓ6=jzl彅 s*ƭ,,QF  <ՙ c%ơyoanClʱK,Q#*fe$Ec^[\XL-"Uvƒ,oOF57/jڞqk]oDntHۆfHh7$rd|7l/4ki-cZ-^@E$r¶sI:ݤh +gx>xdм^bW`;IGc<2Ʋlv^EQEQEdĶ~Ю{u K}ۍB`d+;TdHwxCPeMo5EIxͻ_c96}7XBamwci;\)!Ṏ+Sd)u?~#|I׾$S𾁡[> <1imtnnYde7W+U|_cCx#N7dG ͳG `ޯb6_τzM?xN]3V TU믳ۙٲyp9"e~񮫫i~ i#4}zSxqe54I4.Eh@劙0]+L|h>!]2v{\}eM0yEFZiږZfiiV>H/2?/xxXÚw×Mޣ{iXֺOdžo4l:BA?⨯_ͷK8ydj-I Dm/|>=xEִ},.tK̶i-<+}oDiYyw&τ1%$O`y`rxQ_jx>kADR̭mJ\G֨"FPgԬ>;؂od 7IȄ8Y;_|Bĭ*]O>%U1D*l0WC9WAEQESVQү--4xXkfe HDt,F\# ME𮥡]A6q\KI*mV=DiH"-xNoiR c6bZCU-īNʼny\\bƵψ(33%ޥiE Aռ j2"nvcÿ4;^<7ˮmo +%-6[ƹU <)+! ikKYcmϗgXbfûWf<ڏ5 VkWrjO_[$1@"HaUݹ gbI_+q-2XQ]6/'֖8iy%}ʆye1R0l!i#P|q殧*C# +<Һ$#oke7v aQeBIvn9;cQ@~~tlmSXkǂ-1f + $+i+ʿio'ZG~ԇNU((((Xbf3WEQEQEQEQ^⟍zxsH;]K8%9Tov+b +7/jfqu mo[nu]H[V6IfX7$86X.$W|g<]yá~?^ji>PLgNc a".需pw\_:7 RmSÏr8V8 Ż[ϙ :JkxᇈcsFŶzLJK2K$-9"XHd[wiL+f폶kS [Og7g[6y>O?ץ|Cq} +i ?GҼY&NhiTŧ_InRnD[iI"=g__iEҴk/M%bm82u7o +WvoK,B,`)˸ j@]jމZ -ݤLobIsl1]+GEm}us0&dpƽ]m|9 }#þ% ڦF,oy0,Pulv@((((+¾9xþ.{zVou9IɏBa`ADD!H%2FRAg/Oަo[-ݍVmn%DTpp 柴Ƨ-/7kk^5kB&-3O( +Oe%ωlm.+#&֮+:u\]G|TneYL[''Wwfx +Sӡmmj&ܤ-5ݴֲlY(Em4+<~O}[p Ⱥ>n4$>E@D ωڏA֧6.:/u(tȤ&Y$[Hsg0T%hEfv\xKþZQ]JL:4_jFQq;_;Ll!xB.-Z|z񆩨|@yx<-j&Y5&ܶϩZiIWA8K ^G O/t v 5A#eΐKE4v ;EmI)q꿴o; x$_:ߊu8|56ifSs<(}&YvE~ MG?o6&W>H$.<1%xd>YmgCN|@rYk Ȥ_-9,g/MEkqo)JReY+r5tK~+xx'Yxm\1|+i20\Eb45b>կ*>2ؙ QEQEQEQEW)㯅53οUQ߷5 U-z[*H.ѵoxm7Mjo m}ټctQEWxEUG<'47ok^ F%굸0}$]8h!jo/+|b/X麥 +ųV~0n,%; gK.y&_Zn +;㾓xEMXo;MoCQ4Y4c8͵|^g?ڏO|+xs0n|Od43]((廆\4Ya"cW[/o[xJ׶a$iFo('uqixnBW + &@=Wl~%x^."MmV+U"%³\#9=k((4վ>u5[VZvg¶Fn#b&Y[O#@RFWucO&|{%9ՙJAs"IڒPZk\Uņmĉu4W7w>'bXEInfhYGbjUᓾ;K?ᓾ;K?ᓾ;K?ᓾ;K?ᓾ;K?ᘼm*x^^^izVvw1AmY??G3O/?:f_u>8!?|#AqC4G?i 'Q  @ÏN??_%|I4oc㞡=b}^?Ut})/{+"Wei") \4Ȫ*◃qOFT SGV=DhlG]Mȍѣ4k7ᧅ,>jzx)um>Ukȓ[P쳵G+̱OxMvHicit\kQ/E[vQH$d͂s>4?|}lj&K4b;XW)^X^wWH]e7BLRtڇ/xH𦏧ۚ׉1w~z<:K" +oo}3o$? G3Wh=ue(wž5K-9m|Ky4ExYil|GcgU2Eq_ 'H|EԦX5/RM,m X ^j5A\w[r eO_ 5ctk%-Ϳ<@ҙg`] gʴOƞx)"6͜:l2\y$s~)w0LJK|'Ei BO1WȁmN> {s +r~|~ CS~0S7& 4imffkY"h:Ek{OU~xV(0xggvb:1^SSg$ +sCr[eWVMJ+Iq \Fv29]gO^^;/oFȎfG4I"u;VP7&ZoM;z}4/LuWS#弻 mӴ"!pRK)myWc&gHfU((((*U晩:m/mugw :xH*A y(; + |C|6~qCqH+XJ`vl24q_'!)S/> |)+od+KxsV-$Dw +oqN|2Ȅ+}?jGvԬVQnbbm͹3@9|ev0m~뉫h!f/aU-% 5fԡMUiV=-*_OD+KM5MB^{1I`RAfF|A XUI7K^OYu6#I8Df9YEĤ"U[Z~*7x>4EnX(ʷ_  +g|?Gtk-#Wy763qqֺ(+/ +5Ң]]ºl h5yJ G;s)=q__xOXf]đ}$"IV7"FƒW+:Ę:6nܺHxh#2ɿsi:MYeBֶv,P(T@ +U(((((+ʿio'ZG~ԇNU((((Xbf3WEQEQEQEQEQEq^5/ை:Zv kXjf࿁;cC,)v{⿁]j޷꺐,mܒ̰oPHql]Ih(((((+ʿio'ZG~ԇNU((((Xbf3WEQEQEQEQEQEUM[I3St^%u*0!T$_Q_jx>kADR̭mJ\G֨"FPgԬ>;؂od 7IȄ8Y;_|Bĭ*]O>%U1D*l0WC9WAEQY>)fm +[&E:[[ù.\*K \?  Eh k/4;F4Vk"3, +WTwڇm$ NGA{h,WS!Go ~ЭtO []Fڥ;lU31=MkQEQEQEQEQEQEQEyW-$HQEQEQEQEW~?k?LjZ(((((((XmOObZj7:Vm3 swi$S4ؿ\[ Wr9WZͧVS/ƃuS?cD9vu|-$m|=tu ráx]>HԴڴE{%FUћ+'UCy.5\B.-|1Bn)fdILK0L;tbʙsh絇OSSS=_])g*a6-|Bj[w<7j(M]-ż)YY CC *"QEQEQEQEQEQEQEQ^~OZִm^uKZFRn[vP6a++?O>y}j?#D?O>y}j?#D?O>y}j?#D?O>y}j?#D?O>y}j,ajZVc+xh5S,LA '5oy SQ '5oy SQ '5oy SQ '5oy SW)cHCgW3-Ho&<^fuݷ~v2:QEQEQEQEQEQEQEVO|'Bx@] Ե3NңD!+Ioe Dw%ٚr^EQEQEQEQEQEQEQEQEQEWxsNvV(((((((((((((((((((((~~ѿG߁jF,uyoۥW;MۇT>F29#}EQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEWji>ѵZo[xUmחCjl m} aW;?yq5mq^l?zx/&,QKBso41OP_5|G/=y|Ge66n}2 g:'hK?߱7gbN!Do?jeφ  u῵wϖ?oͷݳ{ + #E_<)O?я!x|o>^>nm5AOCk[\h7ݞ{~ +#kZO}$jzOmcᮯ2[*[tG`E Zyh"6o+f]QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQExF?oj֣i&hWe6B(I5 pO+ +\3h꧟.LHJ΅KY ץi:MYeBֶv,P(T@ +U((cWfgo鷰՝K,3Ut`C+) H5χ߾egG!=ގ9dɟOcM%1u^[FlZ5}"ʋq I \EQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQErug׮7ZKK_vkmݱHAXI%}_jZ]k-l {ɶ{ wI,K'WEQEQEx}RoWom/YX'~2 ܾuI eݱ9bXφ:°_]Xbmu eo#Kjwmޥd,rF=]QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEZ7\OqΕnek'jV\ݕ;촸5`RE'h]%o Gjn4cʰ<Ѽɷ 2++[FKG)?V_g/[Oټkմ͖1+eKMGưdxwK7缷ӤTnRmXvQ75=;Ǎ.=6xKfx̎9v 3>iKo!vlXi_Whḏq]KπO|B|/55^g[zMޥqq?,X(%rv9"җJ׮/| ^i\-^{83T+7UnhLդpZUn“Ɨv[LEWyGPrV*vе ~4;kXU(ڣ}3Hݾϧ"EQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEyW~&M,NwkNLg6^5?0M7ߍ&ųZ[QVuh&֭mmy"n'aJ@z|?{Bz׀<i{$|Gͦ49yH]UnŽ6Z>$ZQNhzX}_pÆ5 +|}m߄<5~Z.kd lẻLuOo/. Tdh!0I*=NRHQn- h!P{lQKd.fM+ʿiosPW~3ٮ`KY0|{l9Cvh(((((((((((((((((*oQw]~..?Z鷶Fq6bߵThKzOֲ]7PMIQb 6Wq 䴸hCa[O xo(bQXUDPTuZ¯xºoO?.{oB5\YϾ s+nw)Y(S-M#7AE^2㷁4+O3ڝ<[6i|:][g6=zQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE|XU=փ-U0PBph$ya,#2,n +񭏎tnbj:U]J0WF ". A{}ySv:ŏ/&^2ݿۺ_hٷ۽3r種WM ]xm6s߉>_ +|("}]V dHErUSUw n6?N5o?(_m}npidFPy'I4=3LӴ(R%"E +(UT +EQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEr:OaowwKm&q\'|7 {5]W~ۿ o%kF<)vMutQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQ_ + +endstream +endobj +957 0 obj +<< +/Length 2 +>> +stream +q + +endstream +endobj +958 0 obj +<< +/Length 505 +/Filter /FlateDecode +>> +stream +xSj1}Wt4K:LS7c%q1w$k,+igΜ9sVl~yw8/Ld޽d8{^ogn r0I -@h<pޢ)AH)`9nnބ|x"x~ND _:"Eުڤu"󍐣 p'  +h,d +JjyAXB^Z/2 BD_  XsN+ Z nJ7@;/l.T*qLUPU]Нꕅs M(FbOﳸ7ct X X:nFCkBPG`۟|),=BLVhwEJOKUe+G_eƖX՛ƣW> +stream +Q +1 0 0 1 0 0 cm +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 377.35162 781.10431 Tm +(+DQJ]KRX) Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 415.64661 781.10431 Tm +(=KLDQ) Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 437.2991 781.10431 Tm +(7HFKQRORJ\\) Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 479.96661 781.10431 Tm +(&R) Tj +ET +BT +/F5 7.5 Tf +0 0 0 rg +1 0 0 1 495.21411 781.10431 Tm +(/WG) Tj +ET +BT +/F6 6.5 Tf +0 0 0 rg +1 0 0 1 87.84 749.00031 Tm +(6HDUFK) Tj +ET +BT +/F6 6.5 Tf +0 0 0 rg +1 0 0 1 111.4415 749.00031 Tm +(ILQJHUSULQW) Tj +ET +BT +/F6 6.5 Tf +0 0 0 rg +1 0 0 1 148.9465 749.00031 Tm +(IORZ) Tj +ET +BT +/F6 6.5 Tf +0 0 0 rg +1 0 0 1 164.722 749.00031 Tm +(FKDUW) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 267.95999 45.86041 Tm +(WKH) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 277.8765 45.86041 Tm +(ILUVW) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 289.509 45.86041 Tm +() Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 297.23102 45.86041 Tm +(SDJHV) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 314.24802 45.86041 Tm +(RI) Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 320.89752 45.86041 Tm +() Tj +ET +BT +/F5 5.5 Tf +0 0 0 rg +1 0 0 1 328.61951 45.86041 Tm +(3DJH) Tj +ET + +endstream +endobj +960 0 obj +<< +/Length 65920 +/Subtype /Image +/Filter /DCTDecode +/BitsPerComponent 8 +/ColorSpace /DeviceGray +/Width 680 +/Height 907 +/Type /XObject +>> +stream +JFIFC + + +      + }!1AQa"q2#BR$3br +%&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz?S((((((((((((((((((((((((+_ uXxԥ\g6s+1DjTAWAEW?_ExZ?ئ1v^BeX +7c8b;C3χ16|ɥ}OGm`ߙkd|6˲# g\}}|c+죏2<I\ʲZC^3Wi:Yze徣—6dI AU((((((((((((((((((TWWQ\_^]-4*UVefPX;fTI$d7u4+lGa2]i56J:ʞi&c,,Q.F>֘ױ,V]AP+/ w[_xOxhPiTcEYĒ߭Њ]%|PZeNH +[$cs~mڊr-^N1=Lj-D4PCJe@%ڿg[⿌x+E;/ R="AtJjwS6V~H6|Ѽes+I&6#9R/='iwXZΚ9+¼ack:g|ixYҭln!yy2Ee\٣<˪Dm#Q +W>SGBaҬn&,1`Cq{W~&&?s7Ge`twcLO;3|ؐ@=V(((((((((((((((((J'|giә_:D;v$#sFZ*UzeŽ]Nxк* ˜/xS׎l/|-w?Ů C[i%]= r|ɵ3O]1_ c>}Ś~>U$XA=Ri6u6?fϩ>2Ykt{'T).-ڳ0w|?|?+~ m_YVB쬟ȉw ;p̔-+坔<\Q,VOMV>=my\~C-\ArAdsnZ$QnYm4<冕dcYĎ;y<c>hd懍<^ i:ݵ| kkF`"wR$m*J +r]_šϧ_^&P Hӭä <Hy &2eQ^U#&/k34oĩ {m"mp7\i񓵋"QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEs?U_%ƷLsg(!vV & I#F>5c}r+{OisIkv:'l;X%gɆ{yr]QEQEQ\Wx'>ߋ5IҴ ;gmBc& c%a_x*׃ti][B#kW:'Fyd;XAEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEy|-h*VGZ6P*kBC# fX^9J{n^?]*]CÚo"%fUV{{tVD' ]QEQEuExVZڤח ood1+HaT+wMoIZgkBm?IVE))%IBVkZݤ*~RG`OsQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEq^5s6kd+h#U㶽&HņƎd0h|Ksuχ߹gG&:ގ8.Od̫%51zVXU^[:m)skyi* :IԐA E[(jڵ^jz徝B7WrP)g݈ +Ā$ך> ᖁa':̵}CT1,v`x+/AUC?O>y}j?rxO-k'n +$> @u(u hJHkꁗ*#y}j?[V +v7_b$¯!^֓Ak}/X#2j[D,dU<~bڿ<]D'x{wZ B~ wkG.O <]D'x{wZ B~ wkG.O <]D'x{wZ B~ wkG.O <]D'x{wZ B~ wkG.O <]D'x{wZ B~ wkG.O <]D'x{wZ B~ wkG.O <]D'x{wZ B~ wkG.O <]D'x{wZ B~ wkG.O <]D'x{wZ B~ wkG.O <]D'x{wZ B~ wkG.O <]D'x{wZ B~ wkG.O <]D'x{wZ B~ wkG.O <]D'x{wZ B~ wkG.O <]D'x{wZ B~ wkG.O <]D'x{wZ B~ wkG.O <]D'x{wZ B~ wk]*?'5 +Z47[62Jmm[O4l+C9 WkEQEQEQEQEWzM0 sg,+MH2cD0vã}(((((((((((((((+ʾ Ec5zQEQEQEQEQ^U'ɬ|3Fkh(((((((((((((((_9=WEQEQEQEQEyO?~j>85>'mu/b 41MQ;ƫM g, CIt 御ukn]IU*J8Z8@ҴQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQ^UoJ/oѫh(((+Ə|>b5[g\vW/ +(!-lc1-/B(^5` D]^G+eXE=%Wx#jBү4|J/{ CAmiYbk "I XR8.<-9^|"Эto>9<#?wo5K}WFIYh:ƾQ߆8uֿK=%wYbk:*O붺 K!G.QTKE% ++}_^ɴ %ây)<"HF#5߳wmOUխ-ovg[hz;Mwd*YXʤU3⿆9>"-Oߵt8Î%偷&g;3FϮxW^;s #ouO B$ӦB?}yYwd Wܞ]a^iݹĶLr::H]QEQEQEQEQEQEQEQEQEQEQEQEQE_vQV(+SnwSĖMׇ=g>[#(u[;4x'~1./_l$u]L`gh˵X!*G*K.m&S9|(k?%QGt +/ேڬu k_;QV翝e#dqE*~ 6k- +q^!'{i {[͕gea7|yk7) zyUIm$)jb&UFm撯4;vox6<oMT;;/ .Z㈢]j1oUx>2Ѽ?kny=O{:^1CƁd&9!ƇM3[Wďo6&hGZϤ鷬6z$Vw# `Q 9d( }hrh4ysCӴ;JEo﷎XmRYdS#XҵoU64%L:溓Yԣ1iV%ҕ3x7^2Gg)d7EY.왣ix_i6dB]oHUh!MXDxêI&P[-Ti&'uCW>XLct4V +n7Ӡ_YRm?icKd}i4i%'x8c/n04]BmBƑ5[AK"!FGD,QC]Hti/ڤCnѮ'*^G5=IJyvk?¸kF-!-o$ 357 47.nLnq 7[^=2|GLGn,a-}?DUh G[L^8\Hn 5ρNmc]c!%[6G5ĐqFU 2dua#oKPhg\&1J@Xf{EߟV +J0da9KgjR.}ʶ7aYnR [E3 Ř?f|+VnO[d xRW}Gu,N߱Ī"(r6mS{𖽭kuu?y.m`YZ#pwV֥M}u)[PjxU-m5[[V6 vm6#Xx׭OX!E6!}^!sZY[ZoS;ÝK&2QYEg'gu:F1q%?x^"4x< ±\\Zq\F,xcOI@1+ȏ>6?~.x>'mi"-bX`{i෉H'MI*sr变QEUM[V4OSӴ(^U"E,;UTX_i k?nI[Im:e`7#Ff\FO|g_!ëA Ljo'FVtk8e@ekfr@43s?r˦_.5izVUYm)mkgi "H +[(((((((*> ؙ 5QEQEQEQEQ^UoJ/oѫh(+S-n /ė{E׈<=y>\E[7y"§~3(e ?¿K_mbO ߑ?C>_xψ4)<- NC,q X3泊5des/_|Krxcz~wy;WvKu1ʨT utQ^⟁ uZI{BYԶO8[{ѪD|o4Hr*_~Ũk}kpڍͬ:fao{2"^@ ˈnHa jh<}j76fv}\+y_0;q|-džMWM>k[o^pA.#G|ڛTYW?1m];Ht>/ SHV[8,&H~%v{^u tj1i׼CeCe5yImۋ-R!TxP#2yqOkZ|_Nk_wOso[+-Rf7f24(ݘe6@+/ +5Ң]]ºl h5yJ G;s)=q_n#/ ֩*ƀ۠i xOC6kxoF?4.-dhY%kZ(cWfgo鷰՝K,3Ut`C+) H5uO`ާn,%jokuЬx޲OxJ>'&p񄹆%sIquk4zVXU^[:m)skyi* :IԐA E[(j:ywve ^]ʱCHGv *KEc\[[_mUFFGd퍏E$[(*7%vhQEQEQEQEQEyW&oHaU((((((((k:Ң#jԴxZ+Ӧc?In2 .b:ȟ`j:Ai6hՍz4{n&B=4nls+O&}ZQ{{ˋ{Y4mдLqpdG07Hǫ|'u1 _е]1%D妛{sykeFn_LDR.!JU_|w^O,tCnOa,"G;xJWc*$^)~x]xdм^bW`;IGc<2Ʋlv^EUK-&N\K Js("H@˰(q +;Uֵ=Z>ks}Tl"]d I$4x+~R֏]6Y̖z%VpUL#U º +(*7%vhQEQ_:طL^6ּAoxOh7PިX dEчrvI*~ 5/x.-S3YI"df򐫖^~)kXKu? {G&qEjl1S$A_G_?WKo:׉d&eMt-g}+ +8IW~WQ|K|e|>}UtR5I淆ȈYd;vC?r~,iO^|8}o#MBҿ)h$'xrFPXnV>"¾/|K3WgHԥ6rFw_[BR.W"C¿=>j_o-OSxZ,GϖOPeቹOEׅ5xZDŽ_/-~ͧKmthvzPc3n61l2N|g C"_d/$ػ}~oo+U_w4o!V((((((((?\GexP𔉝[yd#{ymf÷Pd$S1S6%Z)m7P[hx~]`4j{ϰzYB7 nyt6mbD%[ uE|/׉|]/|7yUޝ$j:v=[X 2EviY;_KDx5{_ 弱-qO7R)AT[u,2 0фf_?hW6z6:U-JSVJTacJ^z?&ٗ/,?Ҿ)i?kW8!?|#AqC|=c|/-^h^jޥqq?kd("@7`((?[OPmu('Aௌ.jP5:JԍeSp-.f{eCnRkEQEQEW)㯊^qOɿ7JQٷ5 +V-b + &uxSY\HeM&bvYg̐I-i?:[ci2]C{s 70Cb,4ɍıi$g((((((((NX7bf0תEQEQEQEQEQEQEQEQEEI-]Zw +qo*Nd2ȄXkqȉO )?y5/4]C}fTs K?}'PswM6%]V56HctdEoU(+5oMVGՖ]f𭑹؉rVf{?__O~73h~ +YOMR.- pc/'U_q4-3ɿ6}UQٻMeO1bW +]QEQEQEQEQEQEQEQE_w4o!V(((((((((+ʿ឴? +|2me-t{M<nFkG'C+~.$h`-d_-Hْ&|Eҥ<9[Lmn"Vk;Ugx'@UdBpQY>)fm +[&E:[[ù.\*K ?7ǁ XM5hu,IJr!Tcr.4l(M?}O[^N'3'Ld';Gi:MYeBֶv,P(T@ +U(((((((((NX7bf0תEQEQEQEQEQEQEQEQEQEW_ +ū^okfo. .!S@V92"`yo4w>{?_OPo41ny>Oh/ +$.WZP7K;.)y/_CZ.4Ikxm4kä˧ZbA{)aerkhoW~OK^oٚ7xK[ѵ;֬x{o/%IIA|]^\/<g3J𕦙s,Gln^B$$,v@]1<{XsOkzWִ4 (i}9 5q(H扂$0˕./ďf{}}'>ӮmN8~* + |/`~_WE.m֭ZŦg}=imo3Ff>lm6~ƉLԭuKxY@%qLKM0!XIז'`EUb.ٴʋ+ tΟz'2Oo~ jz-ݕj֖1-F Hnb^+Vkğ-_iA]CHt{T!dW1Z$l'1M埽h(((((((*> ؙ 5QEQEQEQEQEQEQEQEQEQEQ^U'ɬ|3FkFg-dQ%z/5+]"[ʬ[_~׺EH$?&ZHҼa+Kϱ\\],9.Q]بBbtm\?^g«-&\h"2mw=4A$jvE%+y_þgx" OHE[.;#VUΊXevG?rω|1{O)<ZDsQXL&C"ocuo:m4KoxK6I%m7Vg{!1ۄcyǐ;o__ǦjZERA.爼n<<C; !|#|7*;`i"kqw{33hnfḆqy Qfud>#~/s|aqB e%ҵ{AIR%chfBe|Sc. b )nmq%̑*$WynEw*(((((((;Mc7^EQEQEQEQEQEQEQEQEQEQE_w4o!V(((((((((+ʿjxZ|z־ɬF^cv3VO-&X Y[ʿ~)e?k(lt=;KEeaM9p\ɿc%62n((((((((((+ʿd5&hC zQEQEQEQEQEQEQEQEQ^i~? VIM °ͮjVVC5M4J63VeRC2WW?~_ ZѾsCo dD܀m +uߊ>Eg]hk9渚u+m"nrƎ֓7|65[=Z"lfIM6Z20h7w4*8ިY My v_o⛍OB ?v3A*rSœx^mh>HڟvIL< 5䨪0<,⿆8i-O-ׂÎ&y;2(Fag!O'V^W7o\QEQEQEQEQEQEQEQEQEQ^U'ɬ|3Fkh(((((((dYėҴ&@Ҭ2NlKk[;H(`*FUPP*QEW2K)i|;?y ~ +,qns03(uDIߋJwwao:ciڍnfL +NQPŦ>_xψ4)<- NC,q X3泊5desWƿ|Ee|9T`uEvYF"h%Edcn+((((((((+ʿd5&hC zQEQEQEQEQEQEQU5mZ@ү5=NNl{˹V(`UPIb@ksҘRd?FCl5OOKwR.olA,@\ړ&Fx<x]4O?񄚭Ǔڊ6Wo't,9n&Hgw9ڭ|+)?.4LZ^]]]%NJ8M %niYIgK=Kui'I4bN`aYo +|Ȣ2K +\F2M𞇦xXBPx->g{p|ˁw+|Lj[xW 7W4It֢;J?C8MIdbV(G|Ck!tWEdǸB,"|Iĭ'Mt7>Ҿ%q^{vuoVO JЍ܁3jdw[Ck*Fc9UvPF ӏ*T|:+ɨxx@'_ +\ַR+qҍ~BN 6FmY#w|?kk[{=^F62[}-<6MSUmmn".((|tixFԴk}^k}CA`H٣khhP]FH5/*tZ# 1w||usdiͥ_$n,Rn%< +7&$Yk̞ Hvpjm cx`%k|OfJ<KB5o_MM=(`}dG72*-Tᢴ= ~ aF6g]JI`EIBFG4?V߆?-#QmQHaT(((vywoaq\A F\"42: f#䌰#_PoMռغfhqJbTt""UuJ|[}Ʒx;#/{AXYu(̊! RyMG'ĥt 4SGEq}eAX\j[ &QKH/.n|gkS})'MMܱĭxm]ciଖG+@_x~:{N}y5&)R(2 )TY;_*GUv5}*84Knh ZH;Ba‰1~EQE_w4o!V((((((?x?]/Yxn ilu dPfn$ݰ2 + Z^;'OQԼkA,Vʰ{XJ!F ULGZCIZ)uճ +,p٣c VV𵿈{=oSMjV1 4J7#Vf`3uW;|U]xsdfăD҄i_\HaBMqLΨõ?g{U&H5JW$6wpY eM,k9W5k$:Ώb_:x~M`:ĞK[m'm!"*5>(2u~#u5pumRTe%_\D3"1RvMzEF.<-Zijs^K$:/q,nQ-IGk|S~|U-ß>u SY޽/uK{t3(aUAB>XU9>7o<+mY渉t2DB۴gx+HQ𭌺y7z`y=hZȮbYmz_:j j:~&?EA&[W*dEwX5LJMor3ptH/]ΣkxZŚs&Xڰ #t[c<οoav5__|[i߄W#󢾸ȗrR.v dƳ:GxbVռAoڦc6xH-kf8Fxn7C\)=_OxKBtK⶟xAx^{v&s[\ZXCZEF̚W'%ZDqv&e.c=Λw-XNӽ[i`yOF6j;ڈS(r[ K7ƺTŝ¨[%\*g2 w_x3مkI~jzq$z'CԮ,fKԆiUWD*̬V袊((|SsZhWRoN]ivzHfd#Hw7xj]C6~ӵ{^OWHROt }hVQ]&xC<8;+Q}^/[=?%wIRyrD6$=gzTj6Z+öV%HtNxwT F<[]+-v+kMNKQԯ.{1/E?n+ҴQEQ^U'ɬ|3Fkh(((((Z7 뷑Zp*f; -X.rX¹^Q/]мgxė{~%y;d$+$p$ +# xOC6kxoF?4.-dhY%kZ(4g/Fg~-ƠS%奶]6jVIv_sҠY֓ীo! '쬉lY˰%]ʅHWplj> KVɧh,?e_z΍5SorDŘCyd*LhVsaxvO:ܥN..cppFe?bW[BP4[{ˉgWyfFsF@Uj;~iIO x֖mdR:HY>h" %pH "UU>Z$Em˯L#h"#[\Mn9eik=>|-O{m:K"]گ):E@`dH|-߅~Zt3Oa2> r ~GrdKJ['WygxiW-WMon#gb(*\˲Dc +drzo iv*|IkPn|>d:m/mugw{a'Rh2 +AF{@Ҭ3};M-l"KJ:WkeB4b*ܙM +̪b@"ZaN[WMsw9d7B7XĹ4Qz(>|S'WjWnUԘ'f7Fl? +ibx~{&}]I2yvk|nv *ݗ076okq0׈2!$k9vn9;cQ@Ewg0oὅ5Em5ieBYY$տG>7C.hs?AG>7C.hs?AG>7C.hs?Aj/ڪZO|?xZ;+HI`ͧ,m"gq;ܛ_0R/hWҿw4o!V((((((OC΅uxFAmR.m|n +UGA+oƍ s4iaӬ*S&7l~gi%Ānm5AOCk[\h7ݞ{~ +#cLJq_0m'H6wnH>J]ClSW/ +Jҥ#]ZlSi/4K!IBt;s0=tQEQ_%|9n?;@}DŽ4OSjW6n*!$H-Q劥 4jz6 442 >H Uo=q~w4f&:1Eψ:7so#fWejzv|- Hw4m q1FƱ5O4wkW֛HiWӑt8IyJYG^UA,$%ҭ|mc~2զJ-tk mh[LRcg11$UHbC/|}t'l>P TRg6:D +| ^) <{'œIњh;\A~w W3)Oן1M{>sK~ox=[Gk-gg4簰[k;_p rWW +5ҥ<#ºl,KyJ +F D(tQEQEQEQEQEQEQEyW&oHaU((((((+O|EbռG T`AkhY2{hudcHnk1xW #o4$Ӧ$O}mHo"Y$?"N5_v/-ni׀KUV?ᦼ +>ȟOi82 9l':eKWi:Yze徣—6dI AU( z]Wvz6iwڼDtL= :UY$u '4{M"÷:dF}۬UcexA#(c&#?wl{y᳴t EaEm%6xTSk'r; %ct PzQEQEQEQEQEQEQEQ^U'ɬ|3Fkh(((((((M[r}jqJg/;_+K$7[~FXVYZ^;⿅ԼYL0U1 Y.ƺa>7xcTc#j;~Ltc)RQEQ\W~5 ֫?^<"{][mJYP[)3Nȉ3; q\.o_C7zk>)-Nl}69KE͉HL%_2]?|x*;\|_P&rc Q!SMC$ɣ>fp9S+FzQEQEQEQEQEQEQEQEQ^U'ɬ|3Fkh((((((((|S=:։MOuӵKTk]*eVKѾoZǤ-yg ి[;xh*BYX? +~oE?$3j\xz^xaWhEd%c!@[?|_0YqMuQ]4) BHSW/ +Jҥ#]ZlSi/4K!IBt;s0=ZO4?hWZ߉5?-?Q.w*TdXh]>'gIᤋR 6rl?~3M#j7` y:+!UC #W+'؟gDv^n/3nߓf+~R֏]6Y̖z%VpUL#U º +((((((((((*> ؙ 5QEQEQEQEQEQEQEQEQEQ\W~ +x .?h" ]n[D]JUݨ@Ώ#Cs^i)|*_<9 ߌ5HE<'}6D¦#PB(((((((((((NX7bf0תEQEQEQEQEQEQEQEQEQE_w4o!V((((((((((+ʿd5&hC zQEQEQEQEQEQEQEQEQEQ^U'ɬ|3Fkh((((((((((NX7bf0תEQEQEQEQEQEQEQEQEQE_w4o!V((((((((((+ʿd5&hC zQEQEQEQEQEQEW~֞)| +>0G+YiIc} Vk$o%d)@(w >U|m~,hZC K?+:un5k"Pe1G 4iǟ4kQacxt|)[wKKȷ.Zhf Ǿry"ynWkjyn -v٢iT0L23ǧߺ/V[;2"r{ |> ^|P}_Iտ|/\^g 6ivEln ?K-uV2sukx_ß5-Bcu:4<+&n_G[k]6V_>5-}>~ |)5'WM'ZmkTԮ,a 2hK.n-yT5>h0VNͶ_A-`h-[xehfT; <?gicxQ!Ԇk2Kip.5op4Z"B *j_&z]Z6_jRoKװKٖUt@!)R$׿fx~WGڞ-BZ@[^{,VG* _̑h$&+ɑ! <.oKkțBm&M-D_,kk#F}EyW&oHaU((((((((((;Mc7^EQEQEQEQEQEQEQEQEQEW~kLѿZ(((((((((((*> ؙ 5QEQEQEQEQEQEQEQEQEQEyW&oHaU((((((((((;Mc7^EQEQEQEQEQEQEQEQEQEW~kLѿZ(((((((((((*> ؙ 5QEQEQEQEQEQEQEQEQEQ^iE|Fz;9 W,ӋfDc798_dSt_No".x7S;Znk"5\M~Qk֐d22ȲϨ(((((((((((XD|?7~>u]i>p&FBBBI*=V(((((((((S_<?xvnY}f_n3˞__*8/>G| e6nMww?k]&^~^MXI,Ed hc^x~0=[Yk;9o=YDrH]\@34ox7PÙH-KgiR4-c;H1.$#)Ε]tӵ|F̘ibWfʢMG.S/@?rږfX4&ò5#j7e +/O<_Hu+5VUqqhM#v vQEQEQEQEQEQEQEQEQEQEyW$Wş5QEQEQEQEQEQEQEQEdŚ+oĚΟoImorr̪2y,S\457OiI|-6yj #F3.#'ix?Z^~Xx'Ed*ha"5O|2 ~7iMpNz`^.S VAx?_n-. /lݳwmqWEQEs5{_ZTZg5Masa)(VQ I`v3#+G xSmsB[r|۾}Si]hIo6s})e%^K·4>|2<'ƓVњ;O`6v >4T.P7oh~9Эu :4[F%ͼXl V+)EkQEQEQEQEQEQEQEQEQE_O_?CתEQEQEQEQEQEQEWQ08[ }|Smfnv6L+֟+G]x\[:Y "PAא;(mU;'⿊Qf|AAJ1V) J5|1߂|5~qxHO\Zy,XK@Xo,ۊRӵ=3K I4+BŞ \Y%5սkro-T=ҹG4| Ѽq GNon S~.,.;[I,;M1fE\,?@A/_xSJQ4-wc(xhG^ZMRђN!De-_>{7[bR,4.N[yQZk[)ye[gPoxGt],ͺ,nv3|Ol}ړCO_?Z]5 =vZT<ϴ"@Τߵ/ksCKegg?İ;.JZ}Y kpM(B;_ |u񆗤!3 [h~8ZkLWe#dP@%j)ko/Xzh)-{N\6IBjdu@J"?[u?p^ +#:Nw+xJ-ȣSk_⻽C܉>fn QyC;]zQEQEQEQEQEQEQEQEyW$Wş5QEQEQEQEQEQE)ց>6wcKck'r4q%턇lg 8PXe߉>_ +|("}]V dHErUSUw n6? ~uk3yny~n"A ʌ<6?>^w?mS ׉>#BY./n;ETյkJ;};Mn.X$R#UA%I|bvĖi:6]툿ӬXnT qw)2K[I-gkM+Ğ=cB=-i +ӡWQ A۲aId6g~B|8ǣ_Ƨ V/m9w:<PUHDm39?-~͗_ Fd_|:}//JͻI- f7@WxC&iNkm[NZlgH"h%'yk:W x'X4}v:xc@G=+ jxYQ!hma9} IZźxSxnojWz BW([Aihf-M̨I0ʊ\dP`֬"F{KQ5ռosfBFdb:cQEQEQ\W~5 ֫?^<"{][mJYP[)3Nȉ3; q\O|iywBl> +.eǏaҴk-[yt!7XΨrYe!ig=ž*~η|̏I2?zz)v>U]E{T›woUQ +o] UG)v>U]E{T›woUVNm|}׆"z.gP]#gkK8LbxWEQEQEQEQE_O_?CתEQEQEQEQEQEQ\~WV h*b\gEy +JHE`+݌kxo+񇀤V:^Ykx,/!!2V>Ÿm ڴio"8mQY Xp?jqžg{ďoە]o{_|Bĭ*]O>%U1D*l0WC9WAEQ^?-ľE֐ݨ$Fc1k}4$D! 8V8/x3~1TƫeJnϳTFFT[e|AY>|=oo;WxKwOBrd[(mMdJ[x'W43AѵF{kfJʫ|:+LKqg ?OIknM_C藾I|n&lE,P ^$Ibg6BZOĭFkOŕʂ+_iVhPq.tWeG _|j"IS:6k67qo<- pzQE~Qj~..]6YwVpYaeƸh}/Y|OxO&5v"9M. fS/? ?-6co,|3Ɨ2_<{'VZh;a`w4W(*kேkKxGZ?tf72YYU2T*7c8P; +((+ʼG'Ov^EQEQEQEQEW~?NY^EQEQEQEQEQEQEQEq^5)/Z!-umu+5VfCovM#:k dh_ +|("}]V dHErUSUw n6?]O;s#S/lfpQɞ C"H-|W:']?Ŷq6[tfv>huO?|t>mŦh:W{(eWPcnRUwI!g7D[oCcqZ((((+ʿf'Z~,ԇQU(((((((((+ʿd5&hC zQEQEQEQE_?4=xu;CdhS+ɼ)]S7j-7[9( efܲ[]OG-6,~6:givve +[ZDCHR4E*V袊PvPmC"BהV +b"5evi7t?ls7@ϰLt{q]G>+VKX(kc'V=OLtRUu #! EQ^e^^χ[þ8K{ 2PK>H|jJ,GU'-;׀tYi:ƍqwYjym mq .NCH\?4Vׇ|q#Rݞb~[Ah܍똼C#E'k$I/Qj5;+w[nϼN"W%*Ho~(/kD2WPaم3㥾 ʼn\F:Ʊ5 l-gmGIӜO lw1FcF `::r0T/ּh,g-{;Ͷ}fp# Zm;J. ѣYYT3]rFX /?<9kkiq{DX~ѽWyU,fg_AQxO< x-1vi,<[M(FUL̥^28?NY^EQEQEQEQEQEQEQEQEQEW~kLѿZ((((ciWyoiPܫ0DYwb$ 5.X=}($(cbG`oh~9Эu :4[F%ͼXl V+)EkQU5kٴ*T;FfeRDhdt@FwU`2G|5u}oVy^Ҭkx{Wn'R?>f5qou?o#Y^4eԮtGM6kK*2kz[Kźo4{m5|%\wss+kN,) *#{%zwcYݦk_dڔ%[),C?vvsi^%GtfmkmZcu9#eQ|o(,A'-4+{:ƅo9(|U-8VvvB;]#Ŗ~2 |&u {Z|gsuq{q Ƣr΋,#,&%ῌu|8>Ӽ#Uڼ#kH 2CwGx_+> K&/⻘uDUo+VI k0IMɻ G>$u]?)u/Mi6 0vch5[A /iuHuZ(((((((?miex;*̚؏qq H.n?tPSp\1rW(^w÷jC,ޓwqvWqçCjkS\M1RTsZHϏ>zݟ׍mcM[_W:Օo5V])h4~6x&^xZV/k|W:vl`mQ fY3 9BZY;_xg֯⸹E KES5omne@M,QvTR"a]WVѯ9xC:d6w>m^o$x\.3x0ʡWIѬ|9x:7v>mRoФ󗺞ۮ3y3\)iHZk%^t&nm s1;},ۼfm&j +Ulj<</R$[TFj6 +'ڢ/- >;$R[]G2Ff{^I>΃4?V߆?-#QmQHaTWoT, +nn.og=4 #T4TP F_0\Y7nh%,Elbyh 5_bRHE^h4+3$s=(e1=ᯆXRaZg=Uk fBNkWItVPӴ{+14kX7o;!RV=Z !c ߄\?LӴlM,vV1vFH5ECgmōo,;}GR>4{}fŨDiwH@nvW_z>b; )bͯMf"Fc +ef#{៊V[b}ϋnsHm2Xaꘓ}ˬL<.@G2*OĝO࿄y-k?|;fŐ3]hx.tϨ\@sbь^:WT~ ,sqm3:4v uk;m1l&U-[tZdG ^G_>4<iI<3saA&lLGg22,!7Gqe\~>%x_c6c5<|%n'ͼ6w)r]wßt-.O'K-7xI5-MeuBR^~Kf~tn[?fK͇Kö#kk^ܐy;Ϋ tsFrĹ>1MNJ/tOZ6E.ujSkZqwn$h/Z#-_ +|2x:&3^SLxⶊYZK;@"9m+I&2à 9jv_YYмTo2I,>wL7O>x¿ou'Ik+k(R+(#yA 1853W)㯊^qOɿ7JQٷ5 +V-b + U +w +FiNj؋OLb?.I쒂GW +o] UG)v>U]E{T›woUQ +o] UG)v>U]E{T›woUQ +o] UG)v>Uq_gx 75kLJ[HnúMo冓jS g_i uLj|Aǥ ֗L$eXSjOh((((((~WQwBYXDw1] dhyr2} OCWm?fc>]_gٍx*ޓUYm)mkgi "H +NciVzfgoiPK0D#DP(jM^iVwq,Wс A պ((*> ؙ 5QEQEQEW?_xw.=&TaujY*żC:mD"`y+/,o 0=~qmڈ^(Gvyo|-$m|=tu ráx]>HԴڴE{%FUћ(((d5XOPe].i:-2ii,ԧPF +[syh-^Ѷ6t6)AU_q4-3ɿ6}UQٻMeO1bW +]QEQEQ^U4:sg:zQEQEQEQEQEQEQEQEQEQ^U'ɬ|3Fkh(((O?WZ'4m?-?N-RmwaXdpT@?FJ^nڑtס5{]C>/xwı[Te6e_-QEQ\W~/xw:ZqxqkwM3"Jb^!Ⱦ_g1ۣTk7 +r@M\-#?7qk.aYmxVi>%1h㏈?Gޔ,xx7}WlWR|ʒ/ْnO!-=OkӴTsm +ff8'j((((+ʿf'Z~,ԇQU(((((((((+ʿd5&hC zQEQEQEQEQE^#ybgBU((((+ʿf'Z~,ԇQU(((((((((+ʿd5&hC zQEQEQEQESVլt *S-6bK<@UU$&ZNY4s(1 ˰)hHEyWؙ_.Ыh((((٧I֯c?!kh(((((((((;Mc7^EQEQEQEQE_o{X|8vW; Ԋ LJ̛%~n2)x°T?|?eϏ{}HZle`WR8!?|#AqCSVWfwGM!xXgԫ2 +AU<-56kxm|awi~=׭dizrp9,OSZ>8!?|#AqC4G?i 'Q  @ÏN??U?g5z?bޯuOiSbk$o4+(+ʿi]oooin74鬮8!?|#AqC4G?i 'Q  @ÏNğ?.\ԴIӥj^8.&r716;SWA  @ÏN??G3O/?:f_u>8!?|#AqC4G?i 'Q  @ÏN~O|} W,~5_jLkҲn[xA +@>Z+:x\7kWZ֍A6j6Si$&}pH*9e9 sG#?49 sG#?49 sG#?5SV7J5?|7t^WѵYIH Abo~4OF}轻uO%EDbL;*v~c^(|o;\(|o;\(|o;\O .C M1xWu?\OXjKDtWqnQ#6$s\?k$Swԭ;}*L,ݬ]%4^RyDBAۊ<[?xCŚ?ìut>rivr/s22Og> T~֛孮| ;p3If LJOI6:|K[HC6&l-ͭ$ ~~#^2 dd>å[r_x4۝2]n >!Oci.džhJ$BH3?VK?[^0m⯉еx&}2UnieݽQ˲T%؄N/aautB?-ȝ o\\ Uռ77խ𝦘̚70f31|lp3F&Ҽ;y[Ǯ,z34SePLjw±W?{隮j0ie+\*N6Q-A5𾇦pKԵkxoڍ@JdRFOqY2~ҭ9>+4ۙGf!X653 ȳDYA!83|hV' "ik [#ȫk3K@=Օ`EjúfڵƅCovL0YJ +ͥ~oFK`Ixú/o)wH.d\ѓ6=il}M5Km*ȫ,R4RJ$YXE[NcVzyo鷰ͭ夫,3$GRC+)0$Anil}M5Km*ȫ,R4RJ$YXE[*?+0/um-//-l^ivKN8ȑH"|'3[x¶3xBmty#- Ѯ$[]KoKn8fMEJu;x>/<mZ,XķjDVX `^UDÿxcźVxNNjq]Zc>wfF4s??x^ f&vQi\XA f(a-QwDvQV(u?HtExI6ah7ZM`N 6qoWyरW}K~w'?~3u-/5;.4meK2(:KHo#ھ%=Bօx?o"Y<+I/Ʌ[eè5[!z=>  ~ ٖ;]zK"D +l3߳/-#^ cθNs{pfݤKŵxK)KJ$7ωu|A.>qVڜz޵o}o^â[ +]Oqqu ػ#A0*^)_~gO{[}A" 텼>mɍˡe_߃Z?ú5 :OV֚M%Axv\xc+⎉x yυthְz΁{I"Jinb2U!~^OW7^ Ӵ-?"z6\3% +cʼDN|e$w%~$5c5tzy#olU-!}.yc7rKiDŽvvW*6uOw:̊oxw K[+Ff/;!t0^Rſ:w#K;iSS +rj(|O7Zd_^Pi[}1["xmEY8v1O|?42xKggIԠNs{Ig51p#~Zp$~%xΟuK_xW^ ]߁5=LjjZ젲YfȍeHZ<// k^(і}hi~$YlK֚v1FFxFa'¾BҡV7ݴ1v$ʨ;UKW ++ßtLkW~N'^_~ў365|7{Xo- K&7=O&)子1I"#Nq?iIXAi4'^-Sv6H]cXV%΍]ߎtYږxgEut*KMבf8]R(VY! K/i>w˿Mψo\j6~&v쯣$[NO$+u4ar[(?uk}V]"ZfieZ*:$lR-Lmisû"vos&-'үA6 фZ|0C/'qc AGǺ% xߋu"R_ G߭}o+yY$i,cՒw?юa{j;H^ɥڼAmtW* Le׾0xMk:>]烮>mΓiw4/?e~^*՗š~A=*ӬTKk1Aw6֋+}v|Ԍr=v;ϋ^u?Û5Vv-Cbi.%Xi1 5XkʼG'Ov^EQEQEQEQEQEQ^UJ/jcas~iSa#HaK[h-ܡm漓_Xjn$VUcKxKdQ¤ ó[h^Zjq7^rA4sު5O)m[ ^ < \iwmooEųǶ[yf.nS*Idwº_h8e6E_MjQ3$R3v"D!F +x^!/5=oʎYu Ȃ7XȉeC+R" tmZ]60, n HO q' +>XtUP^e4]\K [f"+Q[*>p AM? sg h70մ +]=lO6PIi#ۼ ̘6 C({_ |<}ggkjV>(.ueL<䡣.c#@Kj-_hZφ|"5njuxB6Z5䤒!U#\*HP.~>[|gvJok;jiS[4(?Ba :_fSk\hV:2j-or)x."QrG"TIxdu: MW>7JºC0˼,BVIcEgu|'6FּWoj>Nk\m\VHJc0?|-ACSJ8Y[sq , weB%C,QM߾y|aOg3P}ݎdST8>Z^Grm(W\3 o,'?٫Fc;@Ei.}pYoBĆ8HV[gDhFJ/t|1k;j>.k;;ۋTҮ q ۝u 2Re>%iQi.iL.c/ BeH`+݌kW\no%B`٫~ O/n:t(ipKg%{fISbwV؉K:ýKX[' 3KX"SIZ-zSXD栒21~~NokHPi7w[w}F?ybP5hᏃgXԬ|[[_OccۼW!Ir)7a-ʒ +<;xf];_ âL>zMWk63w-2fi$!hZφ|"5njuxB6Z5䤒!U#\*HP.W?!ؙ.kh*i9OR:V>.Xx~-2Jӵ-FKc;K*[܂I!BE`Df5W> xotB(.K9-,"yGU Lp[[kK*Gx?,,IC}Jn^,&hbXw^dܗX!1'hj^<>zwWޡuՉT[x3Y|KWoOmfY-PV:+{#}I6c_,͐~KxGQ߅.5m,LG݃[I  +=0[VUƏ +9mƛxWҧM6QBJ,$?쭡ik"X uX}:X5Ρw4%mḘ;|Ss&ux4oqmfy5"lt(l2E=K>2~3wMWT0w};˖1TJ"Ӆ>o>8fFʳcpЛ 7u[yy-孭Z[.M>=HAi9{tDAke8!?|#AqC4G?gZ/~|4&ֱ3PO-rHR*嘜(gz3O/?:f_u>8!?|#AqC4G?i 'WUᎁTc?i{{qjzLPyC݀` +袊+^:6[蚔Z]5)-+²]Y$S$+s?AG>7C.hs?AG>7C.hs?AG>7C.hs?AG>7C.hs?AOj%?i_?ZHOlӯ/|l͹_|o;\(|o;\(|o;\(|o;\(|o;\կiE隭ݓ^B_"+,E՚)E8bAG>7C.hs?AG>7C.hs?AG>7C.hs?AG>7C.kioW_[Hwص/3? g߷.ld|o;\(|o;\(|o;\(iZz_ez5iexr}7>粕徹ݷ(_ē+h(((((((+ʿd5&hC zQEQEQEQEQE_? QfV(((((*j9RFV((((((((((*> ؙ 5QEQEQEQEQEW|d';GZ(((((iuHuZ((((((((((NX7bf0תEQEQEQEQEQ^UJ/kh((((٧I֯c?!kh(((((((((;Mc7^EQEQEQEQEQEyWO(s{YU((((+ʿf'Z~,ԇQU(((((((((+ʿd5&hC zQEQEQEQEQE_? QfV(((((*j9RFV((((((((((*> ؙ 5QEQEQEQEQEW|d';GZ(((((iuHuZ((((((((((NX7bf0תEQEQEQEQEQ^UJ/kh((((٧I֯c?!kh(((((((((l&~|1~ >Ak}/X#2j[D,dU<~bڿ<]D'x{wZ B~ wkG.O <]D'x{wZ B~ wkG.O <]D'x{wZ B~ wkG.O <]D'x{wZ B~ wkG.O <]D'x{wZ B~ wkG.O <]D'x{wZ^+k|vͨx|46Y PegX wZ B~ wkG.O <]D'x{wZ B~ wkG.O <]D'x{wZ B~ wkG.O <]D'x{wZ B~ wkG.O <]D'x{wZ B~ wkG.O <]D'x{&a-G<'xK:vgTeV5KRkq07WV# n1Z(((((((((([luهeݝŇ{9f]:jDdc&ჶFQEQEQEQEQEQEQEQEQEQEQY6-ɱ܇ UQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQ^i~ +o4m!.4Z5ұA V,C] +e$%B<DSV4>5\v7K"X[b3L81s?A|Y9k^9og XO.c7&rFT33&cxoM~es~d+/#X8+s?AO>+蟿|WPΗ,3(dd +lmj!--ھ50CW̮UKZI2e!2ޗEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEx4=xœ.?mlfdw8"I$(fe ¦> na'?h :˺"}C'vRj5ZNciVzfgoiPK0D#DP(n(i6:yjvv{ ]YIJ +OcMr[{jIڄth"`IKx BN]^kj/^ma.N_NP:4RH +0ß~sA+}h:E\,-$bH$2+$LwK/t7-&O-3GmaA?4F7d#ZN~ j_dYC_\G[{x%oBeLn͏wU_C|egH/~Ͽv3vۻc8CZt fVqLϓ"$w{ԹP!9=z&7oeϧC[LeҮ)v*7*⇈|g:MiRR/4vqrY]xotqxZ ~ j:/3/BSĨ4Ƀ~udR[T_>#|0ďX|Ar6P]%PYo0o?-Ya.~<x]ִPҼgDϋ<=57ʱ7FۻbyotGr$TQ^U#%Z/ EXh>34̯{m^mpvjs F;zQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEyW!oi23x/Z {v (Ug>f4k7͘ǚ##hڎyioqO [3)D#e' :2 ¾!~_l=O}E|3}-E5X0N.%r ;3BiĞ_ڧAemm \wOlX[<&p%?Շ V[V:oS^?6h jGSM=*GxWNW 'gxźkO:%ŧ wf$R "xl +gx> x5`4+d!X-\H%~_n=VmHԾǍ-=5']B uV3#:6ftW?vaP4u;bT9"w(3s7,uAYJdRzQ^U74֯CebҦǗ2 [hdkg ,f2.GlV(((((((((((((((((+񯂬|sEku-ōNlYRNUeYfVVVIExtnSI}MV@4jW%]2ܥ,Imݾqf)*ʚ˜tQEQEWj/Wh Jgm7D1FM7lբ!P[zx*T_^]nVUVvUPX"UT8T4E((((((((((((((((((i6:yjvv{ ]YIJ%U1D*l0WC9WAEW?_^kEĺ?tfkwYf*v8R{|M3G]geߗg.୾!! +\3h꧟.LHJ΅KY ץi:MYeBֶv,P(T@ +U(((((((((((((((((((u+USw|/J(Ewލmy2DFDb3ۜeki 'Q +o] UG)v>U>8!<C]V]O>u)a6^h5ecxIRȇnq֊((((((((((((((((((((((((((((((((((((( + +endstream +endobj +961 0 obj +<< +/Length 2 +>> +stream +q + +endstream +endobj +962 0 obj +<< +/Length 3899 +/Filter /FlateDecode +>> +stream +x\ێ}H0` 8о F Ȓ@I@._*շjr!igSdl^oN|so񿿿?ot}W)M1e'LSiv~ӳ_U>rᥚ~rfF)fNRۜsoӛor}|T]loE+K.mbҳGxX +ROj sNLI{;;(M+߃P`Eᯁ᳂Vom=<ۈ-4q5OvLS yir.ށho/.ן[_<ZԶj˃j[YjԺإ$zL* O˫/ill-V>_n מkSkٴjcJ+,‡ڹz{b9VN)P[7 7q}]wjfsuavl8^54lu1cѲό0=?Cf He5#d4ҚZ9N! aßYvbViD%N/>/?Kwo,@R^&T$@l`TK;F$ԨpZ(K[ET lѭSSl6K;C lf?l=Ō5쐅21X.1Zdrc"O +udǒ9笣Ț;}Qw'>|d]->;|3 A\ţ$.%qfI\B~xţD^UOFZ ha;,Eu؎CKGR6!&I UTlf;=bєI/X-\yu4{ނ-` ^X™XX‚$䮛B|SG:*6Wt؆Bs6=^Vt؆"̪[6h]+aR*A%4AM!VCPU5mpPScj)B.4$]E!>A'P +6B'zlC($>PX) + =Rbȓ&(`^!F +&I',HJLR]M-,HzaAR grMB^V3Ф"2tP^FPn]aՌq]XS4c[}Ji @!i`fX4Â$Օ/4Â$p&wt JRxw(e_ptWR]eu_[7{XۧSUJ&m8s :=,  9UW{4eyFĺB !̾7 ʸ?WgjDɧd {6j2o[X>ʽB09;@o)߄r | Q;+¦1@xܚIqe7r̊V +FAÛy.kr1ЫOK{E;lq䉭UҤҳVy3YZnb=xC\t% %p [+ܔth@`l0_M@:|Xgg[ҡ,AO'Xő.@|yo|9KLn%7Qrsxr4L\Bh.nM)a7q,.B Mƪ'nbP#d/>woɮ/˥|k7/]Vo7ަ:O1R ,197_GɹYm +AP[o<;%669P[|#v0;⑘5C)N?S=Qx֝`J1Y+(6g^r= Y'0nO&t +/<ؒ C6DA (#4F $m`I|Q Xmdr7!Z07vT~l<5Iϖ)g5QK8-8ɹ9yY4KF(-aTP6a$ ( GI,R]Y^C#ņ;'t zIHa0*';ɂ>< N<[,[a\!0 %&aEIKmГ,}{i8I9xlݞ)BPip*]l<.ߏ h/Jϣ,A>(}sl<}Fߒ=ORhnmlt}^Єk h4 Lh- +i]K֒_mckj z|$I7Jh-Ki7'2 zf=]:ٿMf >Ɏ[A rD̄2ijD~(6s>Q޶=0z#x[tD`u#,HG9TW`;΂tD:grwLvv(\|K]Gf@rPs0kgkkGH \!5 +tӇc^w3Qo!-=+&g##ڢG6BhٜBtluPݐKKAaRPl0a RP,Y" RPLR]-( Eșn0zM]]=.w-ݲ A(>q5%)tQ0I,H`Agl`A .8[jTo~muj谝/ YřQAFZki;l^w{h.Jc BK^6WT?vs|ƶ( mF8v-,->UY+N}VUh f=Kq54A8_.#Imlf1v H:6 +_'X &X f섁b@ƒm 6&[]u 6`HXn:=c'X0i arV0!Izlcg8g &<= 1`Yg> +stream +Q +1 0 0 1 0 0 cm +BT +/F7 7.5 Tf +0 0 0 rg +1 0 0 1 377.35162 781.10431 Tm +(+DQJ]KRX) Tj +ET +BT +/F7 7.5 Tf +0 0 0 rg +1 0 0 1 415.64661 781.10431 Tm +(=KLDQ) Tj +ET +BT +/F7 7.5 Tf +0 0 0 rg +1 0 0 1 437.2991 781.10431 Tm +(7HFKQRORJ\\) Tj +ET +BT +/F7 7.5 Tf +0 0 0 rg +1 0 0 1 479.96661 781.10431 Tm +(&R) Tj +ET +BT +/F7 7.5 Tf +0 0 0 rg +1 0 0 1 495.21411 781.10431 Tm +(/WG) Tj +ET +BT +/F8 7 Tf +0 0 0 rg +1 0 0 1 87.84 748.28027 Tm +() Tj +ET +BT +/F8 7 Tf +0 0 0 rg +1 0 0 1 99.66299 748.28027 Tm +(,QVWUXFWLRQ) Tj +ET +BT +/F8 7 Tf +0 0 0 rg +1 0 0 1 140.802 748.28027 Tm +(6HW) Tj +ET +BT +/F8 7 Tf +0 0 0 rg +1 0 0 1 153.65401 748.28027 Tm +(6XPPDU\\) Tj +ET +BT +/F8 7 Tf +0 0 0 rg +1 0 0 1 189.06702 748.28027 Tm +(7DEOH) Tj +ET +BT +/F8 9 Tf +0 0 0 rg +1 0 0 1 87.84 704.84027 Tm +() Tj +ET +BT +/F8 9 Tf +0 0 0 rg +1 0 0 1 110.754 704.84027 Tm +(6RUW) Tj +ET +BT +/F8 9 Tf +0 0 0 rg +1 0 0 1 131.616 704.84027 Tm +(E\\) Tj +ET +BT +/F8 9 Tf +0 0 0 rg +1 0 0 1 144.774 704.84027 Tm +(IXQFWLRQ) Tj +ET +BT +/F8 10.5 Tf +0 0 0 rg +1 0 0 1 108.1796 655.34137 Tm +(W\\SH) Tj +ET +BT +/F8 4 Tf +0 0 0 rg +1 0 0 1 142.3791 655.34137 Tm +(VHULDO) Tj +ET +BT +/F8 4 Tf +0 0 0 rg +1 0 0 1 154.4431 655.34137 Tm +(QXPEHU) Tj +ET +BT +/F8 10.5 Tf +0 0 0 rg +1 0 0 1 178.3185 655.34137 Tm +(FRGH) Tj +ET +BT +/F8 4 Tf +0 0 0 rg +1 0 0 1 235.3786 655.34137 Tm +(\)XQFWLRQ) Tj +ET +BT +/F8 4 Tf +0 0 0 rg +1 0 0 1 253.9866 655.34137 Tm +('HVFULSWLRQ) Tj +ET +BT +/F8 10.5 Tf +0 0 0 rg +1 0 0 1 313.5596 655.34137 Tm +(W\\SH) Tj +ET +BT +/F8 4 Tf +0 0 0 rg +1 0 0 1 347.75909 655.34137 Tm +(VHULDO) Tj +ET +BT +/F8 4 Tf +0 0 0 rg +1 0 0 1 359.82309 655.34137 Tm +(QXPEHU) Tj +ET +BT +/F8 10.5 Tf +0 0 0 rg +1 0 0 1 381.95859 655.34137 Tm +(FRGH) Tj +ET +BT +/F8 4 Tf +0 0 0 rg +1 0 0 1 439.0188 655.34137 Tm +(\)XQFWLRQ) Tj +ET +BT +/F8 4 Tf +0 0 0 rg +1 0 0 1 457.6268 655.34137 Tm +('HVFULSWLRQ) Tj +ET +BT +/F7 10.5 Tf +0 0 0 rg +1 0 0 1 150.3 637.22028 Tm +() Tj +ET +BT +/F7 10.5 Tf +0 0 0 rg +1 0 0 1 178.3026 637.22028 Tm +([) Tj +ET +BT +/F7 4 Tf +0 0 0 rg +1 0 0 1 212.2536 637.22028 Tm +(9DOLGDWLRQ) Tj +ET +BT +/F7 4 Tf +0 0 0 rg +1 0 0 1 232.07361 637.22028 Tm +(SDVVZRUG) Tj +ET +BT +/F8 4 Tf +0 0 0 rg +1 0 0 1 318.83969 637.22058 Tm +(UHIHU) Tj +ET +BT +/F8 4 Tf +0 0 0 rg +1 0 0 1 329.78769 637.22058 Tm +(WR) Tj +ET +BT +/F7 10.5 Tf +0 0 0 rg +1 0 0 1 353.06409 637.22028 Tm +() Tj +ET +BT +/F7 10.5 Tf +0 0 0 rg +1 0 0 1 381.9498 637.22028 Tm +([) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 415.91751 637.22028 Tm +(XSORDG) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 435.34351 637.22028 Tm +(IHDWXUH) Tj +ET +BT +/F8 10.5 Tf +0 0 0 rg +1 0 0 1 113.4597 622.6405 Tm +(7LH) Tj +ET +BT +/F7 10.5 Tf +0 0 0 rg +1 0 0 1 150.3 620.1203 Tm +() Tj +ET +BT +/F7 10.5 Tf +0 0 0 rg +1 0 0 1 178.3026 620.1203 Tm +([) Tj +ET +BT +/F7 6.5 Tf +0 0 0 rg +1 0 0 1 212.2536 620.1203 Tm +(VHW) Tj +ET +BT +/F7 6.5 Tf +0 0 0 rg +1 0 0 1 223.0696 620.1203 Tm +(SDVVZRUG) Tj +ET +BT +/F7 10.5 Tf +0 0 0 rg +1 0 0 1 353.06409 620.1203 Tm +() Tj +ET +BT +/F7 10.5 Tf +0 0 0 rg +1 0 0 1 381.9498 620.1203 Tm +([) Tj +ET +BT +/F7 4.5 Tf +0 0 0 rg +1 0 0 1 415.91751 620.1203 Tm +('RZQORDG) Tj +ET +BT +/F7 4.5 Tf +0 0 0 rg +1 0 0 1 438.5885 620.1203 Tm +(\)HDWXUHV) Tj +ET +BT +/F7 10.5 Tf +0 0 0 rg +1 0 0 1 150.3 603.02032 Tm +() Tj +ET +BT +/F7 10.5 Tf +0 0 0 rg +1 0 0 1 178.3026 603.02032 Tm +([) Tj +ET +BT +/F7 7.5 Tf +0 0 0 rg +1 0 0 1 212.2536 603.02032 Tm +(VHW) Tj +ET +BT +/F7 7.5 Tf +0 0 0 rg +1 0 0 1 224.7336 603.02032 Tm +(DGGUHVV) Tj +ET +BT +/F8 4 Tf +0 0 0 rg +1 0 0 1 318.83969 606.02087 Tm +(SDWWHUQ) Tj +ET +BT +/F7 10.5 Tf +0 0 0 rg +1 0 0 1 353.06409 603.02032 Tm +() Tj +ET +BT +/F7 10.5 Tf +0 0 0 rg +1 0 0 1 381.9498 603.02032 Tm +([) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 415.91751 603.02032 Tm +(VWRUH) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 430.66852 603.02032 Tm +(WHPSODWHV) Tj +ET +BT +/F8 4 Tf +0 0 0 rg +1 0 0 1 113.4586 591.4408 Tm +(V\\VWHP) Tj +ET +BT +/F7 10.5 Tf +0 0 0 rg +1 0 0 1 150.3 585.92029 Tm +() Tj +ET +BT +/F7 10.5 Tf +0 0 0 rg +1 0 0 1 178.30141 585.92029 Tm +([H) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 212.2478 585.92029 Tm +(6HW) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 221.78481 585.92029 Tm +(V\\VWHP) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 241.5188 585.92029 Tm +(SDUDPHWHUV) Tj +ET +BT +/F7 10.5 Tf +0 0 0 rg +1 0 0 1 353.07681 585.92029 Tm +() Tj +ET +BT +/F7 10.5 Tf +0 0 0 rg +1 0 0 1 381.96021 585.92029 Tm +([) Tj +ET +BT +/F7 6 Tf +0 0 0 rg +1 0 0 1 415.9245 585.92029 Tm +(UHDG) Tj +ET +BT +/F7 6 Tf +0 0 0 rg +1 0 0 1 430.4025 585.92029 Tm +(WHPSODWH) Tj +ET +BT +/F8 4 Tf +0 0 0 rg +1 0 0 1 318.83871 574.82123 Tm +(ZKHUH) Tj +ET +BT +/F7 10.5 Tf +0 0 0 rg +1 0 0 1 150.3 568.82031 Tm +() Tj +ET +BT +/F7 10.5 Tf +0 0 0 rg +1 0 0 1 178.3026 568.82031 Tm +([I) Tj +ET +BT +/F7 4.5 Tf +0 0 0 rg +1 0 0 1 212.2536 568.82031 Tm +(5HDG) Tj +ET +BT +/F7 4.5 Tf +0 0 0 rg +1 0 0 1 224.0526 568.82031 Tm +(V\\VWHP) Tj +ET +BT +/F7 4.5 Tf +0 0 0 rg +1 0 0 1 240.19859 568.82031 Tm +(SDUDPHWHUV) Tj +ET +BT +/F7 10.5 Tf +0 0 0 rg +1 0 0 1 353.07669 568.82031 Tm +() Tj +ET +BT +/F7 10.5 Tf +0 0 0 rg +1 0 0 1 381.9624 568.82031 Tm +([F) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 415.93011 568.82031 Tm +(GHOHWH) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 433.45313 568.82031 Tm +(WHPSODWH) Tj +ET +BT +/F8 10.5 Tf +0 0 0 rg +1 0 0 1 113.4576 560.24103 Tm +(NLQG) Tj +ET +BT +/F7 10.5 Tf +0 0 0 rg +1 0 0 1 150.3 551.72028 Tm +() Tj +ET +BT +/F7 10.5 Tf +0 0 0 rg +1 0 0 1 178.30051 551.72028 Tm +([I) Tj +ET +BT +/F7 4.5 Tf +0 0 0 rg +1 0 0 1 212.24319 551.72028 Tm +(5HDG) Tj +ET +BT +/F7 4.5 Tf +0 0 0 rg +1 0 0 1 224.04219 551.72028 Tm +(ILQJHUSULQW) Tj +ET +BT +/F7 4.5 Tf +0 0 0 rg +1 0 0 1 248.05869 551.72028 Tm +(WHPSODWH) Tj +ET +BT +/F7 4.5 Tf +0 0 0 rg +1 0 0 1 268.21417 551.72028 Tm +(LQGH[) Tj +ET +BT +/F7 4.5 Tf +0 0 0 rg +1 0 0 1 281.01218 551.72028 Tm +(WDEOH) Tj +ET +BT +/F7 10.5 Tf +0 0 0 rg +1 0 0 1 353.08771 551.72028 Tm +() Tj +ET +BT +/F7 10.5 Tf +0 0 0 rg +1 0 0 1 381.96921 551.72028 Tm +([G) Tj +ET +BT +/F7 4.5 Tf +0 0 0 rg +1 0 0 1 415.93069 551.72028 Tm +(&OHDU) Tj +ET +BT +/F7 4.5 Tf +0 0 0 rg +1 0 0 1 428.0267 551.72028 Tm +(ILQJHUSULQW) Tj +ET +BT +/F7 4.5 Tf +0 0 0 rg +1 0 0 1 452.04321 551.72028 Tm +(OLEUDU\\) Tj +ET +BT +/F8 4 Tf +0 0 0 rg +1 0 0 1 318.83871 543.62152 Tm +(UHDVRQ) Tj +ET +BT +/F7 10.5 Tf +0 0 0 rg +1 0 0 1 150.2979 534.62097 Tm +() Tj +ET +BT +/F7 10.5 Tf +0 0 0 rg +1 0 0 1 178.2993 534.62097 Tm +([G) Tj +ET +BT +/F7 4 Tf +0 0 0 rg +1 0 0 1 212.2457 534.62097 Tm +(1XPEHU) Tj +ET +BT +/F7 4 Tf +0 0 0 rg +1 0 0 1 228.9057 534.62097 Tm +(RI) Tj +ET +BT +/F7 4 Tf +0 0 0 rg +1 0 0 1 233.7417 534.62097 Tm +(ILQJHUSULQW) Tj +ET +BT +/F7 4 Tf +0 0 0 rg +1 0 0 1 255.08969 534.62097 Tm +(WHPSODWHV) Tj +ET +BT +/F7 10.5 Tf +0 0 0 rg +1 0 0 1 353.0748 534.62097 Tm +() Tj +ET +BT +/F7 10.5 Tf +0 0 0 rg +1 0 0 1 381.9581 534.62097 Tm +([) Tj +ET +BT +/F7 4 Tf +0 0 0 rg +1 0 0 1 415.92239 534.62097 Tm +(&RPSDUH) Tj +ET +BT +/F7 4 Tf +0 0 0 rg +1 0 0 1 434.26239 534.62097 Tm +(ILQJHUSULQWV) Tj +ET +BT +/F8 4 Tf +0 0 0 rg +1 0 0 1 113.46 517.52032 Tm +(UHIHU) Tj +ET +BT +/F8 4 Tf +0 0 0 rg +1 0 0 1 124.408 517.52032 Tm +(WR) Tj +ET +BT +/F8 4 Tf +0 0 0 rg +1 0 0 1 113.46 501.98029 Tm +(SDWWHUQ) Tj +ET +BT +/F8 4 Tf +0 0 0 rg +1 0 0 1 113.46 486.3804 Tm +(ZKHUH) Tj +ET +BT +/F8 4 Tf +0 0 0 rg +1 0 0 1 113.46 470.78061 Tm +(UHDVRQ) Tj +ET +BT +/F8 10.5 Tf +0 0 0 rg +1 0 0 1 113.46 455.18079 Tm +(NLQG) Tj +ET +BT +/F7 10.5 Tf +0 0 0 rg +1 0 0 1 150.3 517.52032 Tm +() Tj +ET +BT +/F7 10.5 Tf +0 0 0 rg +1 0 0 1 178.3026 517.52032 Tm +([) Tj +ET +BT +/F7 6 Tf +0 0 0 rg +1 0 0 1 212.2536 517.52032 Tm +(ILQJHUSULQW) Tj +ET +BT +/F7 6 Tf +0 0 0 rg +1 0 0 1 244.2756 517.52032 Tm +(LPDJH) Tj +ET +BT +/F8 10.5 Tf +0 0 0 rg +1 0 0 1 318.83871 512.42181 Tm +(NLQG) Tj +ET +BT +/F7 10.5 Tf +0 0 0 rg +1 0 0 1 353.07669 517.52032 Tm +() Tj +ET +BT +/F7 10.5 Tf +0 0 0 rg +1 0 0 1 381.9624 517.52032 Tm +([) Tj +ET +BT +/F7 4 Tf +0 0 0 rg +1 0 0 1 415.93011 517.52032 Tm +(VHDUFK) Tj +ET +BT +/F7 4 Tf +0 0 0 rg +1 0 0 1 429.43011 517.52032 Tm +(IRU) Tj +ET +BT +/F7 4 Tf +0 0 0 rg +1 0 0 1 435.91812 517.52032 Tm +(ILQJHUSULQWV) Tj +ET +BT +/F7 10.5 Tf +0 0 0 rg +1 0 0 1 150.3 500.42029 Tm +() Tj +ET +BT +/F7 10.5 Tf +0 0 0 rg +1 0 0 1 178.3026 500.42029 Tm +([D) Tj +ET +BT +/F7 6 Tf +0 0 0 rg +1 0 0 1 212.2536 500.42029 Tm +(XSORDG) Tj +ET +BT +/F7 6 Tf +0 0 0 rg +1 0 0 1 233.4456 500.42029 Tm +(LPDJH) Tj +ET +BT +/F7 10.5 Tf +0 0 0 rg +1 0 0 1 147.66 483.32031 Tm +() Tj +ET +BT +/F7 10.5 Tf +0 0 0 rg +1 0 0 1 178.28551 483.32031 Tm +([E) Tj +ET +BT +/F7 4.5 Tf +0 0 0 rg +1 0 0 1 212.2365 483.32031 Tm +('RZQORDG) Tj +ET +BT +/F7 4.5 Tf +0 0 0 rg +1 0 0 1 234.9075 483.32031 Tm +(LPDJHV) Tj +ET +BT +/F8 10.5 Tf +0 0 0 rg +1 0 0 1 318.84 484.3414 Tm +(7KDW) Tj +ET +BT +/F8 10.5 Tf +0 0 0 rg +1 0 0 1 318.84 468.74149 Tm +(KH) Tj +ET +BT +/F8 10.5 Tf +0 0 0 rg +1 0 0 1 318.84 453.1416 Tm +(NLQG) Tj +ET +BT +/F7 4 Tf +0 0 0 rg +1 0 0 1 353.047 483.32031 Tm +(WZHQW\\) Tj +ET +BT +/F7 4 Tf +0 0 0 rg +1 0 0 1 366.88699 483.32031 Tm +(RQH) Tj +ET +BT +/F7 10.5 Tf +0 0 0 rg +1 0 0 1 381.93271 483.32031 Tm +([) Tj +ET +BT +/F7 4 Tf +0 0 0 rg +1 0 0 1 415.90039 483.32031 Tm +(VDPSOLQJ) Tj +ET +BT +/F7 4 Tf +0 0 0 rg +1 0 0 1 434.29639 483.32031 Tm +(UDQGRP) Tj +ET +BT +/F7 4 Tf +0 0 0 rg +1 0 0 1 450.3244 483.32031 Tm +(QXPEHUV) Tj +ET +BT +/F7 10.5 Tf +0 0 0 rg +1 0 0 1 147.66 466.22031 Tm +() Tj +ET +BT +/F7 10.5 Tf +0 0 0 rg +1 0 0 1 178.28551 466.22031 Tm +([) Tj +ET +BT +/F7 6.5 Tf +0 0 0 rg +1 0 0 1 212.2365 466.22031 Tm +(LPDJH) Tj +ET +BT +/F7 6.5 Tf +0 0 0 rg +1 0 0 1 232.991 466.22031 Tm +(WR) Tj +ET +BT +/F7 6.5 Tf +0 0 0 rg +1 0 0 1 240.95999 466.22031 Tm +(IHDWXUH) Tj +ET +BT +/F7 10.5 Tf +0 0 0 rg +1 0 0 1 147.6595 450.14069 Tm +() Tj +ET +BT +/F7 10.5 Tf +0 0 0 rg +1 0 0 1 178.3195 449.12119 Tm +([) Tj +ET +BT +/F7 4.5 Tf +0 0 0 rg +1 0 0 1 212.2493 449.12119 Tm +(\)HDWXUH) Tj +ET +BT +/F7 4.5 Tf +0 0 0 rg +1 0 0 1 229.61929 449.12119 Tm +(6\\QWKHVLV) Tj +ET +BT +/F7 4.5 Tf +0 0 0 rg +1 0 0 1 250.7513 449.12119 Tm +(7HPSODWH) Tj +ET +BT +/F8 7.5 Tf +0 0 0 rg +1 0 0 1 87.84 409.2807 Tm +() Tj +ET +BT +/F8 7.5 Tf +0 0 0 rg +1 0 0 1 106.935 409.2807 Tm +(,Q) Tj +ET +BT +/F8 7.5 Tf +0 0 0 rg +1 0 0 1 116.73 409.2807 Tm +(RUGHU) Tj +ET +BT +/F8 7.5 Tf +0 0 0 rg +1 0 0 1 139.3125 409.2807 Tm +(RI) Tj +ET +BT +/F8 7.5 Tf +0 0 0 rg +1 0 0 1 148.8075 409.2807 Tm +(LQVWUXFWLRQ) Tj +ET +BT +/F8 7.5 Tf +0 0 0 rg +1 0 0 1 192.255 409.2807 Tm +(FRGH) Tj +ET +BT +/F8 10.5 Tf +0 0 0 rg +1 0 0 1 109.02 371.66031 Tm +(FRGH) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 153.2995 371.66031 Tm +(PQHPRQLF) Tj +ET +BT +/F8 4 Tf +0 0 0 rg +1 0 0 1 226.43941 371.66031 Tm +(\)XQFWLRQ) Tj +ET +BT +/F8 4 Tf +0 0 0 rg +1 0 0 1 245.04741 371.66031 Tm +('HVFULSWLRQ) Tj +ET +BT +/F8 10.5 Tf +0 0 0 rg +1 0 0 1 301.8598 371.66031 Tm +(FRGH) Tj +ET +BT +/F8 5.5 Tf +0 0 0 rg +1 0 0 1 355.0802 371.66031 Tm +(PQHPRQLF) Tj +ET +BT +/F8 4 Tf +0 0 0 rg +1 0 0 1 439.9202 371.66031 Tm +(\)XQFWLRQ) Tj +ET +BT +/F8 4 Tf +0 0 0 rg +1 0 0 1 458.5282 371.66031 Tm +('HVFULSWLRQ) Tj +ET +BT +/F7 10.5 Tf +0 0 0 rg +1 0 0 1 109.02 353.54031 Tm +([) Tj +ET +BT +/F7 8 Tf +0 0 0 rg +1 0 0 1 142.9203 353.54031 Tm +(*HQ,PJ) Tj +ET +BT +/F7 6 Tf +0 0 0 rg +1 0 0 1 206.2175 353.54031 Tm +(ILQJHUSULQW) Tj +ET +BT +/F7 6 Tf +0 0 0 rg +1 0 0 1 238.2395 353.54031 Tm +(LPDJH) Tj +ET +BT +/F7 10.5 Tf +0 0 0 rg +1 0 0 1 301.905 353.54031 Tm +([G) Tj +ET +BT +/F7 8.5 Tf +0 0 0 rg +1 0 0 1 335.82001 353.54031 Tm +(\(PSW\\) Tj +ET +BT +/F7 4.5 Tf +0 0 0 rg +1 0 0 1 416.81619 353.54031 Tm +(&OHDU) Tj +ET +BT +/F7 4.5 Tf +0 0 0 rg +1 0 0 1 428.9122 353.54031 Tm +(ILQJHUSULQW) Tj +ET +BT +/F7 4.5 Tf +0 0 0 rg +1 0 0 1 452.92871 353.54031 Tm +(OLEUDU\\) Tj +ET +BT +/F7 10.5 Tf +0 0 0 rg +1 0 0 1 109.02 336.5004 Tm +([) Tj +ET +BT +/F7 8.5 Tf +0 0 0 rg +1 0 0 1 142.9066 336.5004 Tm +(,PJ7]) Tj +ET +BT +/F7 6.5 Tf +0 0 0 rg +1 0 0 1 206.2162 336.5004 Tm +(LPDJH) Tj +ET +BT +/F7 6.5 Tf +0 0 0 rg +1 0 0 1 226.9707 336.5004 Tm +(WR) Tj +ET +BT +/F7 6.5 Tf +0 0 0 rg +1 0 0 1 234.9397 336.5004 Tm +(IHDWXUH) Tj +ET +BT +/F7 10.5 Tf +0 0 0 rg +1 0 0 1 301.91422 336.5004 Tm +([H) Tj +ET +BT +/F7 9.5 Tf +0 0 0 rg +1 0 0 1 335.82001 336.5004 Tm +(6HW6\\V3DUD) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 416.8201 336.5004 Tm +(6HW) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 426.35709 336.5004 Tm +(V\\VWHP) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 446.09109 336.5004 Tm +(SDUDPHWHUV) Tj +ET +BT +/F7 10.5 Tf +0 0 0 rg +1 0 0 1 109.02 319.40027 Tm +([) Tj +ET +BT +/F7 8.5 Tf +0 0 0 rg +1 0 0 1 142.9028 319.40027 Tm +(0DWFK) Tj +ET +BT +/F7 4 Tf +0 0 0 rg +1 0 0 1 206.2256 319.40027 Tm +(\)LQJHUSULQW) Tj +ET +BT +/F7 4 Tf +0 0 0 rg +1 0 0 1 228.27361 319.40027 Tm +(FRPSDULVRQ) Tj +ET +BT +/F7 10.5 Tf +0 0 0 rg +1 0 0 1 301.8598 319.40027 Tm +([I) Tj +ET +BT +/F7 9 Tf +0 0 0 rg +1 0 0 1 335.78961 319.40027 Tm +(5HDG6\\V3DUD) Tj +ET +BT +/F7 4.5 Tf +0 0 0 rg +1 0 0 1 416.81909 319.40027 Tm +(5HDG) Tj +ET +BT +/F7 4.5 Tf +0 0 0 rg +1 0 0 1 428.6181 319.40027 Tm +(V\\VWHP) Tj +ET +BT +/F7 4.5 Tf +0 0 0 rg +1 0 0 1 444.7641 319.40027 Tm +(SDUDPHWHUV) Tj +ET +BT +/F7 10.5 Tf +0 0 0 rg +1 0 0 1 109.02 302.30042 Tm +([) Tj +ET +BT +/F7 9.5 Tf +0 0 0 rg +1 0 0 1 142.9028 302.30042 Tm +(6HUDFK) Tj +ET +BT +/F7 4 Tf +0 0 0 rg +1 0 0 1 206.2068 302.30042 Tm +(VHDUFK) Tj +ET +BT +/F7 4 Tf +0 0 0 rg +1 0 0 1 219.7068 302.30042 Tm +(IRU) Tj +ET +BT +/F7 4 Tf +0 0 0 rg +1 0 0 1 226.19481 302.30042 Tm +(ILQJHUSULQWV) Tj +ET +BT +/F7 10.5 Tf +0 0 0 rg +1 0 0 1 301.8598 302.30042 Tm +([) Tj +ET +BT +/F7 8.5 Tf +0 0 0 rg +1 0 0 1 335.82141 302.30042 Tm +(6HW3ZG) Tj +ET +BT +/F7 6.5 Tf +0 0 0 rg +1 0 0 1 416.8252 302.30042 Tm +(VHW) Tj +ET +BT +/F7 6.5 Tf +0 0 0 rg +1 0 0 1 427.6412 302.30042 Tm +(SDVVZRUG) Tj +ET +BT +/F7 10.5 Tf +0 0 0 rg +1 0 0 1 109.02 285.20032 Tm +([) Tj +ET +BT +/F7 8.5 Tf +0 0 0 rg +1 0 0 1 142.8983 285.20032 Tm +(5HJ0RGHO) Tj +ET +BT +/F7 4.5 Tf +0 0 0 rg +1 0 0 1 206.21429 285.20032 Tm +(\)HDWXUH) Tj +ET +BT +/F7 4.5 Tf +0 0 0 rg +1 0 0 1 223.58429 285.20032 Tm +(6\\QWKHVLV) Tj +ET +BT +/F7 4.5 Tf +0 0 0 rg +1 0 0 1 244.71629 285.20032 Tm +(7HPSODWH) Tj +ET +BT +/F7 10.5 Tf +0 0 0 rg +1 0 0 1 301.8598 285.20032 Tm +([) Tj +ET +BT +/F7 8.5 Tf +0 0 0 rg +1 0 0 1 335.82141 285.20032 Tm +(9I\\3ZG) Tj +ET +BT +/F7 4 Tf +0 0 0 rg +1 0 0 1 416.8252 285.20032 Tm +(9DOLGDWLRQ) Tj +ET +BT +/F7 4 Tf +0 0 0 rg +1 0 0 1 436.6452 285.20032 Tm +(SDVVZRUG) Tj +ET +BT +/F7 10.5 Tf +0 0 0 rg +1 0 0 1 109.02 268.10034 Tm +([) Tj +ET +BT +/F7 10 Tf +0 0 0 rg +1 0 0 1 142.9028 268.10034 Tm +(6WRUH) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 206.2256 268.10034 Tm +(VWRUH) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 220.97659 268.10034 Tm +(WHPSODWHV) Tj +ET +BT +/F7 10.5 Tf +0 0 0 rg +1 0 0 1 301.8598 268.10034 Tm +([) Tj +ET +BT +/F7 8 Tf +0 0 0 rg +1 0 0 1 335.79919 268.10034 Tm +(*HW5DQGRP&RGH) Tj +ET +BT +/F7 4 Tf +0 0 0 rg +1 0 0 1 416.83789 268.10034 Tm +(VDPSOLQJ) Tj +ET +BT +/F7 4 Tf +0 0 0 rg +1 0 0 1 435.23389 268.10034 Tm +(UDQGRP) Tj +ET +BT +/F7 4 Tf +0 0 0 rg +1 0 0 1 451.2619 268.10034 Tm +(QXPEHUV) Tj +ET +BT +/F7 10.5 Tf +0 0 0 rg +1 0 0 1 109.02 251.00037 Tm +([) Tj +ET +BT +/F7 9 Tf +0 0 0 rg +1 0 0 1 142.9028 251.00037 Tm +(/RDG&KDU) Tj +ET +BT +/F7 6 Tf +0 0 0 rg +1 0 0 1 206.22791 251.00037 Tm +(UHDG) Tj +ET +BT +/F7 6 Tf +0 0 0 rg +1 0 0 1 220.7059 251.00037 Tm +(WHPSODWH) Tj +ET +BT +/F7 10.5 Tf +0 0 0 rg +1 0 0 1 301.8598 251.00037 Tm +([) Tj +ET +BT +/F7 9.5 Tf +0 0 0 rg +1 0 0 1 335.8179 251.00037 Tm +(6HW$GGHU) Tj +ET +BT +/F7 7.5 Tf +0 0 0 rg +1 0 0 1 416.8338 251.00037 Tm +(VHW) Tj +ET +BT +/F7 7.5 Tf +0 0 0 rg +1 0 0 1 429.31381 251.00037 Tm +(DGGUHVV) Tj +ET +BT +/F7 10.5 Tf +0 0 0 rg +1 0 0 1 109.02 233.90027 Tm +([) Tj +ET +BT +/F7 8.5 Tf +0 0 0 rg +1 0 0 1 142.9066 233.90027 Tm +(8S&KDU) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 206.2162 233.90027 Tm +(XSORDG) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 225.6422 233.90027 Tm +(IHDWXUH) Tj +ET +BT +/F7 10.5 Tf +0 0 0 rg +1 0 0 1 301.8598 233.90027 Tm +([G) Tj +ET +BT +/F7 8 Tf +0 0 0 rg +1 0 0 1 335.78961 233.90027 Tm +(7HPSOHWH1XP) Tj +ET +BT +/F7 4 Tf +0 0 0 rg +1 0 0 1 416.81909 233.90027 Tm +(1XPEHU) Tj +ET +BT +/F7 4 Tf +0 0 0 rg +1 0 0 1 433.4791 233.90027 Tm +(RI) Tj +ET +BT +/F7 4 Tf +0 0 0 rg +1 0 0 1 438.31509 233.90027 Tm +(ILQJHUSULQW) Tj +ET +BT +/F7 4 Tf +0 0 0 rg +1 0 0 1 459.66309 233.90027 Tm +(WHPSODWHV) Tj +ET +BT +/F7 10.5 Tf +0 0 0 rg +1 0 0 1 109.02 216.80029 Tm +([) Tj +ET +BT +/F7 8 Tf +0 0 0 rg +1 0 0 1 142.8983 216.80029 Tm +('RZQ&KU) Tj +ET +BT +/F7 4.5 Tf +0 0 0 rg +1 0 0 1 206.2343 216.80029 Tm +('RZQORDG) Tj +ET +BT +/F7 4.5 Tf +0 0 0 rg +1 0 0 1 228.9053 216.80029 Tm +(\)HDWXUHV) Tj +ET +BT +/F7 10.5 Tf +0 0 0 rg +1 0 0 1 301.8598 216.80029 Tm +([I) Tj +ET +BT +/F7 9.5 Tf +0 0 0 rg +1 0 0 1 335.78961 216.80029 Tm +(5HDG&RQ/LVW) Tj +ET +BT +/F7 4.5 Tf +0 0 0 rg +1 0 0 1 416.81909 216.80029 Tm +(5HDG) Tj +ET +BT +/F7 4.5 Tf +0 0 0 rg +1 0 0 1 428.6181 216.80029 Tm +(ILQJHUSULQW) Tj +ET +BT +/F7 4.5 Tf +0 0 0 rg +1 0 0 1 452.63461 216.80029 Tm +(WHPSODWH) Tj +ET +BT +/F7 4.5 Tf +0 0 0 rg +1 0 0 1 472.7901 216.80029 Tm +(LQGH[) Tj +ET +BT +/F7 4.5 Tf +0 0 0 rg +1 0 0 1 485.5881 216.80029 Tm +(WDEOH) Tj +ET +BT +/F7 10.5 Tf +0 0 0 rg +1 0 0 1 109.02 199.70032 Tm +([D) Tj +ET +BT +/F7 8 Tf +0 0 0 rg +1 0 0 1 142.8983 199.70032 Tm +(8S,PDJH) Tj +ET +BT +/F7 6 Tf +0 0 0 rg +1 0 0 1 206.2343 199.70032 Tm +(XSORDG) Tj +ET +BT +/F7 6 Tf +0 0 0 rg +1 0 0 1 227.4263 199.70032 Tm +(LPDJH) Tj +ET +BT +/F7 10.5 Tf +0 0 0 rg +1 0 0 1 109.02 182.60028 Tm +([E) Tj +ET +BT +/F7 8 Tf +0 0 0 rg +1 0 0 1 142.89371 182.60028 Tm +('RZQ,PDJH) Tj +ET +BT +/F7 4.5 Tf +0 0 0 rg +1 0 0 1 206.23849 182.60028 Tm +('RZQORDG) Tj +ET +BT +/F7 4.5 Tf +0 0 0 rg +1 0 0 1 228.9095 182.60028 Tm +(LPDJHV) Tj +ET +BT +/F7 10.5 Tf +0 0 0 rg +1 0 0 1 109.02 165.50031 Tm +([F) Tj +ET +BT +/F7 8.5 Tf +0 0 0 rg +1 0 0 1 142.9203 165.50031 Tm +('HOHWH&KDU) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 206.2276 165.50031 Tm +(GHOHWH) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 223.7506 165.50031 Tm +(WHPSODWH) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 267.95999 45.86041 Tm +(WKH) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 277.8765 45.86041 Tm +(ILUVW) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 289.509 45.86041 Tm +() Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 297.23102 45.86041 Tm +(SDJHV) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 314.24802 45.86041 Tm +(RI) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 320.89752 45.86041 Tm +() Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 328.61951 45.86041 Tm +(3DJH) Tj +ET + +endstream +endobj +964 0 obj +<< +/Length 2 +>> +stream +q + +endstream +endobj +965 0 obj +<< +/Length 839 +/Filter /FlateDecode +>> +stream +xVjA} "H⼅ K.b QsٙYwٞSϩvsv}.]RvCzy']Q6%3Ŝ9/tUoWT}^կ?}QyֈH$3%Qhsv7Y<]UٝCD١4U4BJm%l<5WX<?*|.*2͜ Ťv[ 2@-F-;싙u8溪W㎋׀Y֔XIDY¾Wg(w_5իUI1Q }""{ Mu[竳S zFxϛ![%AȌ](LAng R .L*޳p1η>X+:hXL'B;R#C)[O^vLŇލ]Rh?=;yxځʈcxs#nb/%PA.eK= \>];7@N9'es!GyGYx)"> +stream +Q +1 0 0 1 0 0 cm +BT +/F7 7.5 Tf +0 0 0 rg +1 0 0 1 377.35162 781.10431 Tm +(+DQJ]KRX) Tj +ET +BT +/F7 7.5 Tf +0 0 0 rg +1 0 0 1 415.64661 781.10431 Tm +(=KLDQ) Tj +ET +BT +/F7 7.5 Tf +0 0 0 rg +1 0 0 1 437.2991 781.10431 Tm +(7HFKQRORJ\\) Tj +ET +BT +/F7 7.5 Tf +0 0 0 rg +1 0 0 1 479.96661 781.10431 Tm +(&R) Tj +ET +BT +/F7 7.5 Tf +0 0 0 rg +1 0 0 1 495.21411 781.10431 Tm +(/WG) Tj +ET +BT +/F8 10.5 Tf +0 0 0 rg +1 0 0 1 87.84 736.88031 Tm +($SSHQGL[) Tj +ET +BT +/F8 9.5 Tf +0 0 0 rg +1 0 0 1 120 684.98029 Tm +() Tj +ET +BT +/F8 9.5 Tf +0 0 0 rg +1 0 0 1 127.904 684.98029 Tm +(6SOLW) Tj +ET +BT +/F8 9.5 Tf +0 0 0 rg +1 0 0 1 151.53999 684.98029 Tm +(PRWKHUERDUG) Tj +ET +BT +/F8 9.5 Tf +0 0 0 rg +1 0 0 1 217.47 684.98029 Tm +(GLPHQVLRQV) Tj +ET +BT +/F8 11 Tf +0 0 0 rg +1 0 0 1 120 487.4003 Tm +() Tj +ET +BT +/F8 11 Tf +0 0 0 rg +1 0 0 1 129.15201 487.4003 Tm +(2SWLFDO) Tj +ET +BT +/F8 11 Tf +0 0 0 rg +1 0 0 1 171.513 487.4003 Tm +(\)LQJHUSULQW) Tj +ET +BT +/F8 11 Tf +0 0 0 rg +1 0 0 1 236.765 487.4003 Tm +(6HQVRU) Tj +ET +BT +/F8 11 Tf +0 0 0 rg +1 0 0 1 276.68399 487.4003 Tm +( RU) Tj +ET +BT +/F8 11 Tf +0 0 0 rg +1 0 0 1 295.07599 487.4003 Tm +($OO) Tj +ET +BT +/F8 11 Tf +0 0 0 rg +1 0 0 1 312.918 487.4003 Tm +(LQ) Tj +ET +BT +/F8 11 Tf +0 0 0 rg +1 0 0 1 327.04199 487.4003 Tm +(2QH) Tj +ET +BT +/F8 11 Tf +0 0 0 rg +1 0 0 1 352.38599 487.4003 Tm +(0RGXOH ) Tj +ET +BT +/F8 11 Tf +0 0 0 rg +1 0 0 1 400.203 487.4003 Tm +('LPHQVLRQV) Tj +ET +BT +/F8 11 Tf +0 0 0 rg +1 0 0 1 467.41299 487.4003 Tm +( 8QLW) Tj +ET +BT +/F8 11 Tf +0 0 0 rg +1 0 0 1 497.94901 487.4003 Tm +(PP) Tj +ET +BT +/F8 11 Tf +0 0 0 rg +1 0 0 1 519.55298 487.4003 Tm +( ) Tj +ET +BT +/F8 13.5 Tf +0 0 0 rg +1 0 0 1 221.46001 100.70032 Tm +() Tj +ET +BT +/F8 13.5 Tf +0 0 0 rg +1 0 0 1 229.317 100.70032 Tm +() Tj +ET +BT +/F8 13.5 Tf +0 0 0 rg +1 0 0 1 237.174 100.70032 Tm +() Tj +ET +BT +/F8 13.5 Tf +0 0 0 rg +1 0 0 1 245.03099 100.70032 Tm +() Tj +ET +BT +/F8 13.5 Tf +0 0 0 rg +1 0 0 1 252.88799 100.70032 Tm +() Tj +ET +BT +/F8 13.5 Tf +0 0 0 rg +1 0 0 1 260.745 100.70032 Tm +() Tj +ET +BT +/F8 13.5 Tf +0 0 0 rg +1 0 0 1 268.60199 100.70032 Tm +() Tj +ET +BT +/F8 13.5 Tf +0 0 0 rg +1 0 0 1 276.45898 100.70032 Tm +() Tj +ET +BT +/F8 13.5 Tf +0 0 0 rg +1 0 0 1 284.31598 100.70032 Tm +() Tj +ET +BT +/F8 13.5 Tf +0 0 0 rg +1 0 0 1 292.17297 100.70032 Tm +() Tj +ET +BT +/F8 13.5 Tf +0 0 0 rg +1 0 0 1 300.02997 100.70032 Tm +() Tj +ET +BT +/F8 13.5 Tf +0 0 0 rg +1 0 0 1 307.88696 100.70032 Tm +(\(QG) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 267.95999 45.86041 Tm +(WKH) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 277.8765 45.86041 Tm +(ILUVW) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 289.509 45.86041 Tm +() Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 297.23102 45.86041 Tm +(SDJHV) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 314.24802 45.86041 Tm +(RI) Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 320.89752 45.86041 Tm +() Tj +ET +BT +/F7 5.5 Tf +0 0 0 rg +1 0 0 1 328.61951 45.86041 Tm +(3DJH) Tj +ET + +endstream +endobj +967 0 obj +<< +/Length 1040 +/Subtype /Image +/Filter /FlateDecode +/BitsPerComponent 4 +/ColorSpace [/Indexed [/ICCBased 808 0 R] + 15 970 0 R] +/Width 195 +/Height 123 +/Type /XObject +>> +stream +H[0 EUj7@ PIMd~#QI>MAO~ _NqBxO54.<:u1Ą#x]D]nc)UH&d'XXl#2 "f{VP/w&%`h\KRu Q\<4FM54~}MþL>9"GI~ǻUO" +Uh}b(G.' ap=,gY:#\_ C}@Ÿ1$SvJfZo-B¶>tN׃(J5|c#,CN/AQϲYǾH|X) ɪ@3T?2@| zMѩ. E렜k-Nj:a?Դ/tӀ9 6Zz|wwz=,,5/1p`Z4`Pqg}-\c%|k#|6 q!a +LyB԰|h$<LJopWf #䃫!I7j`# ak\0ҚOG:@j$+ڗGI(k  jDGiZ8uW! + +{켧蘍ʟk9ZncP\,LtB *@(DH0d)WBJ&qGisܣfVqk}DM%n@>!pAj^V6%$Mo hA+Eg7qcF\.a~S +tLNIS_yHFPw {B{N#\5 8c%{ 9ܻ|\f{ֺa`i_L5lk +OӀ>B}sK5]qsx@<.SRɏ6BɞtA-!|@|`OJoI1mm5o>S5/D/#W + +endstream +endobj +968 0 obj +<< +/Length 7143 +/Subtype /Image +/Filter /FlateDecode +/BitsPerComponent 4 +/ColorSpace [/Indexed [/ICCBased 808 0 R] + 15 832 0 R] +/Width 860 +/Height 640 +/Type /XObject +>> +stream +H r 5z?58&D!((((((4 ʅ(acz8sAx\^&m052(|m-r"qᕫ8yh#[llnXG˾ + {d,٢LX={7 +?xaj[d#C`(1Hᨷk0 +?E"rɖc(uvxF0ܰe}Q[W)Ũv}&֖umJ.0@ +bMτˌ jX/ޢ :X_QȓŖ$a'6Dg~=Y1Mi]۸%?^y'Aښ 5jk&LP[3fBm̈́ښ 5jk&LP[3fBm̈́ښ 5jk&K!@1xv"!K ac| m /X[06Rm=n:plB[Js|[0V8 A]*l-N[Lg(⺣]*tҸw#ZZ]h-Cs"U& "YǥT֖34`6[}RiEL>44nkQ.5|z/GmD-쿎&ָG[8`Ljgӿ[8bTjD5roG8d!k.MmYIm ZoՖd=\$[hMO`6%¨{!zׄj'o N r::G:׫-=dm~t!ӦVmm-MW4iS[?vOܦAťP[f-0{1ŅLڂ㬕PW]N4j~ro +z .m-;mBV=뿴b Nj"T[NlE.-'JB'l1GĎE@`.K#i?o xCkZsmk/@jo`f +6o|Ǔb7qmȴsY[6!q[ ؟/Ӷla[jDr[^Z-Zl-glajnR[,]Zz Kjk,~DrL႗b?DquqYR: +gq| Vh6ܗ +mﷵmqli&$.ˑ 5C"UlvgkRF[ UOLnT\նbm!29llz4Ve%|;s)}[\dF!-[Iʋű^i ƨA"z[-"TCeW/3 r/Bxmcܸ8"\4] a-uKOvz+[A#gY/ZY[PAmʕnÁv[ P[h1,${kP[<+X#-LS.g>hdmD0V0xNWܷ.gP[.:- 2W|9[#b/FS ھg ׹7lQE:ls?-̼[P[=kīSxb9%%}Ζ=v^z36w'z +m\)j1H/o͎#~ +|#~V"? 7_߱B{n0z䇅Rn@$t!Kg˶p_5∃M}"l 8 ORP4:5.n$Egp]-㫶$rx-p^-aÞUm#2w[V7n!6`-*Z*-- mpoKJ TyqjmU OBzQ\ZJLޖ OJ)msGznMmR9 EN_!l_EVEi% +2H~o(kڊ3;[HjJ-q;oڪZ\3S\vFJ lխqR5ϟ[UĖxUM wmU:f㕜nMlI9JΪ{م=yEOتLX > &khw6N.蒭7wي~onjg lESַ⮸5{:P2WTZOJ e߱U7yf!Ŗ*Ebfe5Uy;tVl3sѣgyf\0kx VIce}ߚ VR#[ٍbؖ3*e뙐x_pKe[5ӎIm`KB[\i/t Ef-a%\lk+[9q[5ȖVGl mKXg>i/-5o2=d؉ҊmFm LoftڒCJ![폣r@fV"Du/>io%GNvc-ypXmɁӥ-1ȏٺUZHi[rLi5+k+(ֽjH [~˖vLi2G}-9R[e$f(wmAVf+1 aм֛J~Ȗs\igmԖrdiueGc-e 2u*֯ڒ#-mَ߰Һo~ؖpliI[mKk:".Q/}B.[rR[Ze}͖xۊՅԓ:^iK@iU$wV--9Zj+V&_o%z@X'o}ZZ7mx/r~k][lזV1mq_Pi_6X _Q1&`{T#nim---nغ6 h pmeS|]ã%lН-tjΛ6=Zn'hm6۶2?m6>ZY#T-_h:Z-c-YV-Z[ uB--f{[ uRhK!hl]K.O[(]-5_.ڽh9--moPh ۚt4[<4Z"[ý `?TFmr[[M;ђne[7QpF/ym Y &~ub[AYm^piAYm bjSITun4ѫևmQ8Zw-׈dC][p&xt^ЄWuyra}k}XEv\7\.iε[8d"]xS0pmmr,[4M-nUwly(ȳEh]Q-ť-. +?o4\%GC.*j[ڏå lQ'aC#Y_(p/)桉Зlm&]{d2?W;~҄1V=|vy.%[5[CpXhc+M%[ AE7aٵ&lAfnSɖ6hu䣧lQ"ML5Gm-*wMwXR6Z>NID@zL^h@ݦE^ָ@rjE^$m%ۚԬ,EkЖdy[ECVY]V'm .TmնEmܖ<-%"K&v[3%"nkDa^5X"J,/Rm\V"KwfKD E}_5~^`^ m)ռ`kmqkt>DvqlKۑPmqKQBy!nkD:!?/,r[l֞eVҵiՖ,,Ay+XNp[p[8NQ,,-|"l,,,,,Om^G +h|0yEӵs+M i[%%~aqnr|֡sZ[0Es{[{nX>l-KOl5PR( +Tح~L;l13]?> +^XR,@ 75L_^iʂ.Iäj%~.If 4PksU8 njؚM4/>?R,2ǀ;Xb1_4/|k 5_Ś/@b| `Xh0_4/|k 5_Ś/@b| `Xh0_4/|k 5_Ś/@b+4D s$r)F +3q < jcP ..q =!N`@\롌{{.mqqíE~P6Ӿfkzx?|t0;!b̸҆8應Ҷփa KlX,3:kKT{ hX`vXCpRwl^]rqqqqqqqX;GNрppk'(2NQe +X;G)v 8rr@2s #V-. N`$!hpY6[>\9]/ G:WіWL &f}a~aVm(YCz/>_bq[(r[>p?pnkB8ycO0vInkqVr .8mep V<ö?J>փ} m ݷ`=Tf#2\ĝm,~$2p[uS{--E|u aؚX_I;-,}~09Jo@?OBZgwO+4]ʭ'HYz6.GZHU7߼;z1HNkֹkc!irj[ti9>r뷄֯FZ/QԤRǑ9H>--7~R88i*TxCqiyRS1Y[ХsVʫEZieXEZ0V!'> +stream +H엉z6;#p"K$pSd?`!A$dn2oک%[~{9OTOTOTOT-}a$KczNTm-}% e҇YgYi-S9T7o5G**'+3L+!YX?*#]YGh4$ ţ8 +G +{c] ٧sczCP! @_΍!_"p3,?J#֏!jF p O+a9lsj,H40 x(](R.IZˇD赉?ͳj$Q +oNAi%Q#yQl p@M/`F ].} Z߈]ɠӊD!E-ᄇ+arm#a&R W4T}"aA@ PoV+kqE&ًKe` +T{5R^:k+cjm ӏah,}1ۄ9Z@`\WK_jhWA07Ʋ76jܯH_7T 5j}oFj-c (VM^8OQ#RUuW,?QqKčAF 5R{05u')lćk>ww}n *-i]6DH-(R ] +w2YN -քC +rmp-}vM+lt@DH$si,\4Z"T*j(6Bjk8 WqLcVY)"*>^9 [ԜCAt'E4BHи%NiiC)%k#2|~SF'h<~pGöylQ褩zAP-:9[S44R&RZa8\L ʇv ,j[z?AX +O߿0h2gM_Gc(k` -%$Kc(YfJPjo*H--{T(&70[Pr9[&Aes%(Sr euIb\nJ},mrRk~ cUm`Ĺ'*A52F*po D0Dao>eP 9R1=\)7>tپt#2 +E[PH#\)<Ʊ7 Ȥ$AP|,Mzo0m0،;Ux8"YUA,IHq=°z7;6)c` 쉹|&KmY$}+9#/Fͽ v5&=}sGz/Luh@P cxh^q2c,T}shku^=)tRK䪘Ciΐ[~GxJ;2WDMҡ3b0'(p4G~Bd,`F\cF,sF{Hx]a5˪(yEUޡӵQ1 +tT~8WƤTȂ@ mF>tSnf`Z^SH*DWGg \u"]O FՍ H-lC_&Ժ} n oߴ\YMANSp?G~p9D2W06烺I׃[h#94Cm 6:w݁:3-bUSv BFui.#҈frqֈVM !yDv1=)p2gQuvl/EvׅۅbLP+ёpSAܭպl$^;+* +t:~]#Q"')`9/POYPDN؆@Hq,1OPD +#D'qs$/0]+GxA{L˘}G.`;= +Cl @Df4huy +`5 BcPqgiS6YyΡ@Kn?rl_X4x He ^y T˥]Ⱥ!b-*+#WIr>zUؑI! TcSm:o4ńp5:l$r@1dEuט=o0%!M`%8 M0Pc/.u]8aHe^R!f[Esꒂ6f<|𸑨[QU +CQ(bɤ7CABr}$ +y`!#f0mGm#3b,ď㗒İI1t#QpEҎ 죌@=!HV@jIAaH^9p<CGޚ`T g@B؜=C1i^:m$,B4nI|Qna5Cf(Mge܄AZ ʁp NX@_֟B5f oL0 FvhµՄ͑i`FNG Rr a^답*f $SQ)Z,UJ2Z6 9ŽʐV7ޚ T_njM<ZD +f۞ ElT0)N _UEau<f |ĿEg9 o{[F,ն« 5۰ )=( +vanlY -KC -.?e۶ Ea5יXH'o /͚)"y-Ge9-ڸ.sU"1tZi,aNltedyPfB[[ ( +a% +?p4-m;;%dΛ&:QG"u=51Ra=(82># !d1Lؚd `)-QF-1i2Z;Id,ei,! ;c;}z÷}:CKLf-A +DvvH_lI,l)&?2*kA9fa4 m DcIP_쳽iG!%L,"2쏽$ Xu4 +/}eL VRi f_x͢?HIP~Im,3Cl-QMThG^銂#sDhX 4{zyrd,aW)Peߘ?,jۯ -WؾgN jJ&X"i PA 3dBa$ #,GQItL~mFa5[L.ALL!3N!G0.K@&T_l&lgf(QG)pN+4֌˜2)GY{,+ ^XB=N@Tq0a=k[r}ePe-Ky< +:fgX/0 zF'}[:7,3ǵ@A`%xWF3Vk 28 %hzɌQ6cete3%tn3.Mw)آ; :t;h!2 Nm1(;TMKQOCO&cAA8췗@^MAhc YN[#z~S#ұD U`Ֆ>)8e9X oGX26r¾syd}e Cp,U:[%\/ K±;24" !d|r2BǶ pT!fzxi;hoV*>aY}ah0\3`['P(~#d ՌB^oĕ*vCBZʱlTF0;7,1Zzi'=km7 Vۏh;R*IF_vS3D?z%+SR|^\KiW FA90 ,K2 Z@}ʈ8 r;A}8i Cᚃ1@1(dMY<#Eckh'Fuo^y^a%>Q!@ \ZKbCPGY3( jAp9Fe]`2NijD KjcWhBOt o6{Vէc> U>CQndತhYgs)Oxʷ @xA)A <] OA߹\ A\x\gXZ ojy8Ozl1YTy1Piw]o\ 0[u + +endstream +endobj +970 0 obj +<< +/Length 49 +>> +stream + + +endstream +endobj +971 0 obj +<< +/Length 140 +/Filter /FlateDecode +>> +stream +H @ARXV!RH*B +)ޞfsɉ55:(H ̐`pOLD]*3VxuwWT>W,* p}1pDGe!;տe3d + +endstream +endobj +972 0 obj +<< +/SpaceAfter 0.0 +/TextAlign /Center +/O /Layout +/WritingMode /LrTb +/SpaceBefore 0.0 +/TextIndent 0.0 +/EndIndent 0.0 +/StartIndent 0.0 +>> +endobj +973 0 obj +<< +/SpaceAfter 0.0 +/TextAlign /Justify +/O /Layout +/WritingMode /LrTb +/SpaceBefore 0.0 +/TextIndent 0.0 +/EndIndent 0.0 +/StartIndent 0.0 +>> +endobj +974 0 obj +<< +/A [2847 0 R] +/K 6 +/P 59 0 R +/S /InlineShape +/Pg 21 0 R +>> +endobj +975 0 obj +<< +/MCID 0 +/Pg 22 0 R +/Type /MCR +>> +endobj +976 0 obj +<< +/SpaceAfter 0.0 +/TextAlign /Justify +/O /Layout +/WritingMode /LrTb +/SpaceBefore 0.0 +/TextIndent 30.0 +/EndIndent 0.0 +/StartIndent -0.999985 +>> +endobj +977 0 obj +<< +/SpaceAfter 0.0 +/TextAlign /Justify +/O /Layout +/WritingMode /LrTb +/SpaceBefore 0.0 +/TextIndent 24.0 +/EndIndent 0.0 +/StartIndent 0.0 +>> +endobj +978 0 obj +<< +/SpaceAfter 0.0 +/TextAlign /Justify +/O /Layout +/WritingMode /LrTb +/SpaceBefore 0.0 +/TextIndent 24.0 +/EndIndent 0.0 +/StartIndent -0.999985 +>> +endobj +979 0 obj +<< +/K 8 +/P 69 0 R +/S /blue1 +/Pg 22 0 R +>> +endobj +980 0 obj +<< +/SpaceAfter 0.0 +/TextAlign /Justify +/O /Layout +/WritingMode /LrTb +/SpaceBefore 0.0 +/TextIndent 80.0 +/EndIndent 0.0 +/StartIndent -80.0 +>> +endobj +981 0 obj +<< +/SpaceAfter 0.0 +/TextAlign /Center +/O /Layout +/WritingMode /LrTb +/SpaceBefore 0.0 +/TextIndent 94.0 +/EndIndent 0.0 +/StartIndent -80.0 +>> +endobj +982 0 obj +<< +/A [2848 0 R] +/K 12 +/P 72 0 R +/S /InlineShape +/Pg 22 0 R +>> +endobj +983 0 obj +<< +/SpaceAfter 0.0 +/TextAlign /Justify +/O /Layout +/WritingMode /LrTb +/SpaceBefore 0.0 +/TextIndent 18.0 +/EndIndent 0.0 +/StartIndent -80.0 +>> +endobj +984 0 obj +<< +/A 2849 0 R +/K 1239 0 R +/P 81 0 R +/S /TOCI +>> +endobj +985 0 obj +<< +/A 2850 0 R +/K 1240 0 R +/P 81 0 R +/S /TOCI +>> +endobj +986 0 obj +<< +/A 2850 0 R +/K 1241 0 R +/P 81 0 R +/S /TOCI +>> +endobj +987 0 obj +<< +/A 2849 0 R +/K 1242 0 R +/P 81 0 R +/S /TOCI +>> +endobj +988 0 obj +<< +/A 2849 0 R +/K 1243 0 R +/P 81 0 R +/S /TOCI +>> +endobj +989 0 obj +<< +/A 2850 0 R +/K 1244 0 R +/P 81 0 R +/S /TOCI +>> +endobj +990 0 obj +<< +/A 2851 0 R +/K 1245 0 R +/P 81 0 R +/S /TOCI +>> +endobj +991 0 obj +<< +/A 2851 0 R +/K 1246 0 R +/P 81 0 R +/S /TOCI +>> +endobj +992 0 obj +<< +/A 2850 0 R +/K 1247 0 R +/P 81 0 R +/S /TOCI +>> +endobj +993 0 obj +<< +/A 2849 0 R +/K 1248 0 R +/P 81 0 R +/S /TOCI +>> +endobj +994 0 obj +<< +/A 2850 0 R +/K 1249 0 R +/P 81 0 R +/S /TOCI +>> +endobj +995 0 obj +<< +/A 2851 0 R +/K 1250 0 R +/P 81 0 R +/S /TOCI +>> +endobj +996 0 obj +<< +/A 2851 0 R +/K 1251 0 R +/P 81 0 R +/S /TOCI +>> +endobj +997 0 obj +<< +/A 2850 0 R +/K 1252 0 R +/P 81 0 R +/S /TOCI +>> +endobj +998 0 obj +<< +/A 2850 0 R +/K 1253 0 R +/P 81 0 R +/S /TOCI +>> +endobj +999 0 obj +<< +/A 2851 0 R +/K 1254 0 R +/P 81 0 R +/S /TOCI +>> +endobj +1000 0 obj +<< +/A 2851 0 R +/K 1255 0 R +/P 81 0 R +/S /TOCI +>> +endobj +1001 0 obj +<< +/A 2851 0 R +/K 1256 0 R +/P 81 0 R +/S /TOCI +>> +endobj +1002 0 obj +<< +/A 2850 0 R +/K 1257 0 R +/P 81 0 R +/S /TOCI +>> +endobj +1003 0 obj +<< +/A 2850 0 R +/K 1258 0 R +/P 81 0 R +/S /TOCI +>> +endobj +1004 0 obj +<< +/A 2850 0 R +/K 1259 0 R +/P 81 0 R +/S /TOCI +>> +endobj +1005 0 obj +<< +/A 2850 0 R +/K 1260 0 R +/P 81 0 R +/S /TOCI +>> +endobj +1006 0 obj +<< +/A 2849 0 R +/K 1261 0 R +/P 81 0 R +/S /TOCI +>> +endobj +1007 0 obj +<< +/A 2850 0 R +/K 1262 0 R +/P 81 0 R +/S /TOCI +>> +endobj +1008 0 obj +<< +/A 2850 0 R +/K 1263 0 R +/P 81 0 R +/S /TOCI +>> +endobj +1009 0 obj +<< +/A 2849 0 R +/K 1264 0 R +/P 81 0 R +/S /TOCI +>> +endobj +1010 0 obj +<< +/A 2850 0 R +/K 1265 0 R +/P 81 0 R +/S /TOCI +>> +endobj +1011 0 obj +<< +/A 2850 0 R +/K 1266 0 R +/P 81 0 R +/S /TOCI +>> +endobj +1012 0 obj +<< +/A 2850 0 R +/K 1267 0 R +/P 81 0 R +/S /TOCI +>> +endobj +1013 0 obj +<< +/A 2850 0 R +/K 1268 0 R +/P 81 0 R +/S /TOCI +>> +endobj +1014 0 obj +<< +/A 2851 0 R +/K 1269 0 R +/P 81 0 R +/S /TOCI +>> +endobj +1015 0 obj +<< +/A 2851 0 R +/K 1270 0 R +/P 81 0 R +/S /TOCI +>> +endobj +1016 0 obj +<< +/A 2849 0 R +/K 1271 0 R +/P 81 0 R +/S /TOCI +>> +endobj +1017 0 obj +<< +/A 2850 0 R +/K 1272 0 R +/P 81 0 R +/S /TOCI +>> +endobj +1018 0 obj +<< +/A 2850 0 R +/K 1273 0 R +/P 81 0 R +/S /TOCI +>> +endobj +1019 0 obj +<< +/SpaceAfter 6.0 +/TextAlign /Justify +/O /Layout +/WritingMode /LrTb +/SpaceBefore 6.0 +/TextIndent 0.0 +/EndIndent 0.0 +/StartIndent 0.0 +>> +endobj +1020 0 obj +<< +/SpaceAfter 16.0 +/TextAlign /Center +/O /Layout +/WritingMode /LrTb +/SpaceBefore 17.0 +/TextIndent 0.0 +/EndIndent 0.0 +/StartIndent 0.0 +>> +endobj +1021 0 obj +<< +/SpaceAfter 0.0 +/TextAlign /Justify +/O /Layout +/WritingMode /LrTb +/SpaceBefore 0.0 +/TextIndent 21.0 +/EndIndent 0.0 +/StartIndent 0.0 +>> +endobj +1022 0 obj +<< +/SpaceAfter 13.0 +/TextAlign /Start +/O /Layout +/WritingMode /LrTb +/SpaceBefore 13.0 +/TextIndent 0.0 +/EndIndent 0.0 +/StartIndent 0.0 +>> +endobj +1023 0 obj +<< +/SpaceAfter 0.0 +/TextAlign /Justify +/O /Layout +/WritingMode /LrTb +/SpaceBefore 0.0 +/TextIndent 81.0 +/EndIndent 0.0 +/StartIndent 0.0 +>> +endobj +1024 0 obj +<< +/SpaceAfter 0.0 +/TextAlign /Center +/O /Layout +/WritingMode /LrTb +/SpaceBefore 0.0 +/TextIndent 20.0 +/EndIndent 0.0 +/StartIndent 0.0 +>> +endobj +1025 0 obj +<< +/SpaceAfter 0.0 +/TextAlign /Justify +/O /Layout +/WritingMode /LrTb +/SpaceBefore 0.0 +/TextIndent 20.0 +/EndIndent 0.0 +/StartIndent 0.0 +>> +endobj +1026 0 obj +<< +/SpaceAfter 0.0 +/TextAlign /Justify +/O /Layout +/WritingMode /LrTb +/SpaceBefore 0.0 +/TextIndent 252.0 +/EndIndent 0.0 +/StartIndent 0.0 +>> +endobj +1027 0 obj +<< +/SpaceAfter 0.0 +/TextAlign /Justify +/O /Layout +/WritingMode /LrTb +/SpaceBefore 0.0 +/TextIndent 10.0 +/EndIndent 0.0 +/StartIndent 336.0 +>> +endobj +1028 0 obj +<< +/SpaceAfter 0.0 +/TextAlign /Justify +/O /Layout +/WritingMode /LrTb +/SpaceBefore 0.0 +/TextIndent 264.0 +/EndIndent 0.0 +/StartIndent 0.0 +>> +endobj +1029 0 obj +<< +/SpaceAfter 0.0 +/TextAlign /Justify +/O /Layout +/WritingMode /LrTb +/SpaceBefore 0.0 +/TextIndent 304.0 +/EndIndent 0.0 +/StartIndent 0.0 +>> +endobj +1030 0 obj +<< +/SpaceAfter 0.0 +/TextAlign /Justify +/O /Layout +/WritingMode /LrTb +/SpaceBefore 0.0 +/TextIndent 168.0 +/EndIndent 0.0 +/StartIndent 0.0 +>> +endobj +1031 0 obj +<< +/SpaceAfter 0.0 +/TextAlign /Justify +/O /Layout +/WritingMode /LrTb +/SpaceBefore 0.0 +/TextIndent 115.0 +/EndIndent 0.0 +/StartIndent 0.0 +>> +endobj +1032 0 obj +<< +/SpaceAfter 0.0 +/TextAlign /End +/O /Layout +/WritingMode /LrTb +/SpaceBefore 0.0 +/TextIndent 0.0 +/EndIndent 0.0 +/StartIndent 0.0 +>> +endobj +1033 0 obj +<< +/Placement /Block +/O /Layout +/EndIndent 93.15 +/StartIndent 78.15 +/BBox [166.0 114.0 431.0 375.0] +>> +endobj +1034 0 obj +<< +/SpaceAfter 0.0 +/TextAlign /Justify +/O /Layout +/WritingMode /LrTb +/SpaceBefore 0.0 +/TextIndent 17.0 +/EndIndent 0.0 +/StartIndent 0.0 +>> +endobj +1035 0 obj +<< +/SpaceAfter 7.0 +/TextAlign /Justify +/O /Layout +/WritingMode /LrTb +/SpaceBefore 7.0 +/TextIndent 0.0 +/EndIndent 0.0 +/StartIndent 0.0 +>> +endobj +1036 0 obj +<< +/SpaceAfter 0.0 +/TextAlign /Justify +/O /Layout +/WritingMode /LrTb +/SpaceBefore 7.0 +/TextIndent 0.0 +/EndIndent 0.0 +/StartIndent 0.0 +>> +endobj +1037 0 obj +<< +/SpaceAfter 0.0 +/TextAlign /Justify +/O /Layout +/WritingMode /LrTb +/SpaceBefore 0.0 +/TextIndent 0.0 +/EndIndent 0.0 +/StartIndent 21.0 +>> +endobj +1038 0 obj +<< +/Placement /Block +/O /Layout +/EndIndent 150.657 +/StartIndent 112.395 +/BBox [112.395 430.675 444.563 523.482] +>> +endobj +1039 0 obj +<< +/K [2852 0 R 2853 0 R 2854 0 R 2855 0 R 2856 0 R 2857 0 R] +/P 141 0 R +/S /TBody +>> +endobj +1040 0 obj +<< +/SpaceAfter 0.0 +/TextAlign /Justify +/O /Layout +/WritingMode /LrTb +/SpaceBefore 0.0 +/TextIndent 27.0 +/EndIndent 0.0 +/StartIndent 0.0 +>> +endobj +1041 0 obj +<< +/SpaceAfter 14.0 +/TextAlign /Start +/O /Layout +/WritingMode /LrTb +/SpaceBefore 14.0 +/TextIndent 0.0 +/EndIndent 0.0 +/StartIndent 0.0 +>> +endobj +1042 0 obj +<< +/Placement /Block +/O /Layout +/EndIndent -185.85 +/StartIndent 35.15 +/BBox [123.0 163.0 710.0 222.0] +>> +endobj +1043 0 obj +<< +/K 1298 0 R +/P 153 0 R +/S /LI +>> +endobj +1044 0 obj +<< +/Placement /Block +/O /Layout +/EndIndent 91.791 +/StartIndent 116.22 +/BBox [116.22 550.657 503.429 647.394] +>> +endobj +1045 0 obj +<< +/K [2858 0 R 2859 0 R 2860 0 R 2861 0 R 2862 0 R 2863 0 R] +/P 154 0 R +/S /TBody +>> +endobj +1046 0 obj +<< +/K 1331 0 R +/P 155 0 R +/S /LI +>> +endobj +1047 0 obj +<< +/Placement /Block +/O /Layout +/EndIndent 107.196 +/StartIndent 117.675 +/BBox [117.675 459.625 488.024 522.354] +>> +endobj +1048 0 obj +<< +/K [2864 0 R 2865 0 R 2866 0 R 2867 0 R] +/P 156 0 R +/S /TBody +>> +endobj +1049 0 obj +<< +/K 1358 0 R +/P 157 0 R +/S /LI +>> +endobj +1050 0 obj +<< +/Placement /Block +/O /Layout +/EndIndent 94.55 +/StartIndent 117.36 +/BBox [117.36 321.925 500.67 432.954] +>> +endobj +1051 0 obj +<< +/K [2868 0 R 2869 0 R 2870 0 R 2871 0 R 2872 0 R 2873 0 R 2874 0 R] +/P 158 0 R +/S /TBody +>> +endobj +1052 0 obj +<< +/Placement /Block +/O /Layout +/EndIndent 71.6543 +/StartIndent 112.395 +/BBox [112.395 151.915 523.566 244.782] +>> +endobj +1053 0 obj +<< +/K [2875 0 R 2876 0 R 2877 0 R 2878 0 R 2879 0 R 2880 0 R] +/P 161 0 R +/S /TBody +>> +endobj +1054 0 obj +<< +/Placement /Block +/O /Layout +/EndIndent 155.633 +/StartIndent 163.98 +/BBox [163.98 355.24 439.587 381.778] +>> +endobj +1055 0 obj +<< +/K [2881 0 R 2882 0 R] +/P 231 0 R +/S /TBody +>> +endobj +1056 0 obj +<< +/SpaceAfter 0.0 +/TextAlign /Justify +/O /Layout +/WritingMode /LrTb +/SpaceBefore 0.0 +/TextIndent 21.0 +/EndIndent 0.0 +/StartIndent 42.0 +>> +endobj +1057 0 obj +<< +/K 1442 0 R +/P 233 0 R +/S /LI +>> +endobj +1058 0 obj +<< +/K 1443 0 R +/P 233 0 R +/S /LI +>> +endobj +1059 0 obj +<< +/K 1444 0 R +/P 233 0 R +/S /LI +>> +endobj +1060 0 obj +<< +/K 1445 0 R +/P 233 0 R +/S /LI +>> +endobj +1061 0 obj +<< +/SpaceAfter 7.0 +/TextAlign /Justify +/O /Layout +/WritingMode /LrTb +/SpaceBefore 0.0 +/TextIndent 21.0 +/EndIndent 0.0 +/StartIndent 0.0 +>> +endobj +1062 0 obj +<< +/Placement /Block +/O /Layout +/EndIndent 66.8896 +/StartIndent 113.34 +/BBox [113.34 503.02 528.33 513.478] +>> +endobj +1063 0 obj +<< +/K 2883 0 R +/P 279 0 R +/S /TBody +>> +endobj +1064 0 obj +<< +/SpaceAfter 7.0 +/TextAlign /Justify +/O /Layout +/WritingMode /LrTb +/SpaceBefore 0.0 +/TextIndent 20.0 +/EndIndent 0.0 +/StartIndent 0.0 +>> +endobj +1065 0 obj +<< +/Placement /Block +/O /Layout +/EndIndent 64.9713 +/StartIndent 121.56 +/BBox [121.56 142.297 530.249 471.103] +>> +endobj +1066 0 obj +<< +/K [2884 0 R 2885 0 R 2886 0 R 2887 0 R 2888 0 R 2889 0 R 2890 0 R 2891 0 R 2892 0 R 2893 0 R] +/P 281 0 R +/S /TBody +>> +endobj +1067 0 obj +<< +/K 1488 0 R +/P 290 0 R +/S /LI +>> +endobj +1068 0 obj +<< +/K 1489 0 R +/P 290 0 R +/S /LI +>> +endobj +1069 0 obj +<< +/K 1490 0 R +/P 290 0 R +/S /LI +>> +endobj +1070 0 obj +<< +/K 1491 0 R +/P 290 0 R +/S /LI +>> +endobj +1071 0 obj +<< +/K 1492 0 R +/P 290 0 R +/S /LI +>> +endobj +1072 0 obj +<< +/K 1493 0 R +/P 290 0 R +/S /LI +>> +endobj +1073 0 obj +<< +/K 1494 0 R +/P 290 0 R +/S /LI +>> +endobj +1074 0 obj +<< +/K 1495 0 R +/P 290 0 R +/S /LI +>> +endobj +1075 0 obj +<< +/K 1496 0 R +/P 290 0 R +/S /LI +>> +endobj +1076 0 obj +<< +/K 1497 0 R +/P 290 0 R +/S /LI +>> +endobj +1077 0 obj +<< +/K 1498 0 R +/P 290 0 R +/S /LI +>> +endobj +1078 0 obj +<< +/K 1499 0 R +/P 290 0 R +/S /LI +>> +endobj +1079 0 obj +<< +/K 1500 0 R +/P 290 0 R +/S /LI +>> +endobj +1080 0 obj +<< +/K 1501 0 R +/P 290 0 R +/S /LI +>> +endobj +1081 0 obj +<< +/K 1502 0 R +/P 290 0 R +/S /LI +>> +endobj +1082 0 obj +<< +/K 1503 0 R +/P 290 0 R +/S /LI +>> +endobj +1083 0 obj +<< +/K 1504 0 R +/P 290 0 R +/S /LI +>> +endobj +1084 0 obj +<< +/K 1505 0 R +/P 290 0 R +/S /LI +>> +endobj +1085 0 obj +<< +/K 1506 0 R +/P 290 0 R +/S /LI +>> +endobj +1086 0 obj +<< +/K 1507 0 R +/P 290 0 R +/S /LI +>> +endobj +1087 0 obj +<< +/K 1508 0 R +/P 290 0 R +/S /LI +>> +endobj +1088 0 obj +<< +/K 1509 0 R +/P 290 0 R +/S /LI +>> +endobj +1089 0 obj +<< +/K 1510 0 R +/P 290 0 R +/S /LI +>> +endobj +1090 0 obj +<< +/SpaceAfter 0.0 +/TextAlign /Justify +/O /Layout +/WritingMode /LrTb +/SpaceBefore 0.0 +/TextIndent 31.0 +/EndIndent 0.0 +/StartIndent 0.0 +>> +endobj +1091 0 obj +<< +/SpaceAfter 7.0 +/TextAlign /Justify +/O /Layout +/WritingMode /LrTb +/SpaceBefore 7.0 +/TextIndent 21.0 +/EndIndent 0.0 +/StartIndent 0.0 +>> +endobj +1092 0 obj +<< +/SpaceAfter 0.0 +/TextAlign /Justify +/O /Layout +/WritingMode /LrTb +/SpaceBefore 0.0 +/TextIndent 42.0 +/EndIndent 0.0 +/StartIndent 0.0 +>> +endobj +1093 0 obj +<< +/Placement /Block +/O /Layout +/EndIndent 69.564 +/StartIndent 96.2999 +/BBox [96.2999 455.32 525.656 497.999] +>> +endobj +1094 0 obj +<< +/K [2894 0 R 2895 0 R 2896 0 R] +/P 310 0 R +/S /TBody +>> +endobj +1095 0 obj +<< +/Placement /Block +/O /Layout +/EndIndent 134.124 +/StartIndent 96.2999 +/BBox [96.2999 390.94 461.096 433.558] +>> +endobj +1096 0 obj +<< +/K [2897 0 R 2898 0 R 2899 0 R] +/P 312 0 R +/S /TBody +>> +endobj +1097 0 obj +<< +/SpaceAfter 0.0 +/TextAlign /Justify +/O /Layout +/WritingMode /LrTb +/SpaceBefore 0.0 +/TextIndent 44.0 +/EndIndent 0.0 +/StartIndent 0.0 +>> +endobj +1098 0 obj +<< +/SpaceAfter 0.0 +/TextAlign /Justify +/O /Layout +/WritingMode /LrTb +/SpaceBefore 0.0 +/TextIndent 71.0 +/EndIndent 0.0 +/StartIndent 0.0 +>> +endobj +1099 0 obj +<< +/SpaceAfter 0.0 +/TextAlign /Justify +/O /Layout +/WritingMode /LrTb +/SpaceBefore 0.0 +/TextIndent -34.0 +/EndIndent 0.0 +/StartIndent 71.0 +>> +endobj +1100 0 obj +<< +/SpaceAfter 0.0 +/TextAlign /Justify +/O /Layout +/WritingMode /LrTb +/SpaceBefore 0.0 +/TextIndent 36.0 +/EndIndent 0.0 +/StartIndent 0.0 +>> +endobj +1101 0 obj +<< +/Placement /Block +/O /Layout +/EndIndent 69.5034 +/StartIndent 96.2995 +/BBox [96.2995 110.8 525.717 153.479] +>> +endobj +1102 0 obj +<< +/K [2900 0 R 2901 0 R 2902 0 R] +/P 326 0 R +/S /TBody +>> +endobj +1103 0 obj +<< +/Placement /Block +/O /Layout +/EndIndent 134.124 +/StartIndent 96.2999 +/BBox [96.2999 708.34 461.096 750.958] +>> +endobj +1104 0 obj +<< +/K [2903 0 R 2904 0 R 2905 0 R] +/P 329 0 R +/S /TBody +>> +endobj +1105 0 obj +<< +/SpaceAfter 0.0 +/TextAlign /Justify +/O /Layout +/WritingMode /LrTb +/SpaceBefore 0.0 +/TextIndent 21.0 +/EndIndent 0.0 +/StartIndent 21.0 +>> +endobj +1106 0 obj +<< +/Placement /Block +/O /Layout +/EndIndent 69.5031 +/StartIndent 96.2999 +/BBox [96.2999 443.8 525.717 486.479] +>> +endobj +1107 0 obj +<< +/K [2906 0 R 2907 0 R 2908 0 R] +/P 342 0 R +/S /TBody +>> +endobj +1108 0 obj +<< +/Placement /Block +/O /Layout +/EndIndent 134.124 +/StartIndent 96.2999 +/BBox [96.2999 379.42 461.096 422.098] +>> +endobj +1109 0 obj +<< +/K [2909 0 R 2910 0 R 2911 0 R] +/P 344 0 R +/S /TBody +>> +endobj +1110 0 obj +<< +/SpaceAfter 0.0 +/TextAlign /Justify +/O /Layout +/WritingMode /LrTb +/SpaceBefore 0.0 +/TextIndent 65.0 +/EndIndent 0.0 +/StartIndent 0.0 +>> +endobj +1111 0 obj +<< +/SpaceAfter 0.0 +/TextAlign /Justify +/O /Layout +/WritingMode /LrTb +/SpaceBefore 0.0 +/TextIndent 35.0 +/EndIndent 0.0 +/StartIndent 0.0 +>> +endobj +1112 0 obj +<< +/Placement /Block +/O /Layout +/EndIndent 65.4812 +/StartIndent 92.2809 +/BBox [92.2809 99.3397 529.739 141.959] +>> +endobj +1113 0 obj +<< +/K [2912 0 R 2913 0 R 2914 0 R] +/P 358 0 R +/S /TBody +>> +endobj +1114 0 obj +<< +/Placement /Block +/O /Layout +/EndIndent 134.124 +/StartIndent 96.2999 +/BBox [96.2999 708.34 461.096 750.958] +>> +endobj +1115 0 obj +<< +/K [2915 0 R 2916 0 R 2917 0 R] +/P 361 0 R +/S /TBody +>> +endobj +1116 0 obj +<< +/SpaceAfter 0.0 +/TextAlign /Justify +/O /Layout +/WritingMode /LrTb +/SpaceBefore 0.0 +/TextIndent 120.0 +/EndIndent 0.0 +/StartIndent 0.0 +>> +endobj +1117 0 obj +<< +/Placement /Block +/O /Layout +/EndIndent 55.6236 +/StartIndent 91.8 +/BBox [91.8 495.94 539.596 558.343] +>> +endobj +1118 0 obj +<< +/K [2918 0 R 2919 0 R 2920 0 R 2921 0 R] +/P 371 0 R +/S /TBody +>> +endobj +1119 0 obj +<< +/SpaceAfter 0.0 +/TextAlign /Justify +/O /Layout +/WritingMode /LrTb +/SpaceBefore 0.0 +/TextIndent -52.0 +/EndIndent 0.0 +/StartIndent 89.0 +>> +endobj +1120 0 obj +<< +/Placement /Block +/O /Layout +/EndIndent 134.125 +/StartIndent 96.2994 +/BBox [96.2994 279.34 461.095 321.959] +>> +endobj +1121 0 obj +<< +/K [2922 0 R 2923 0 R 2924 0 R] +/P 379 0 R +/S /TBody +>> +endobj +1122 0 obj +<< +/Placement /Block +/O /Layout +/EndIndent 69.5031 +/StartIndent 96.2999 +/BBox [96.2999 214.9 525.717 257.578] +>> +endobj +1123 0 obj +<< +/K [2925 0 R 2926 0 R 2927 0 R] +/P 381 0 R +/S /TBody +>> +endobj +1124 0 obj +<< +/SpaceAfter 0.0 +/TextAlign /Justify +/O /Layout +/WritingMode /LrTb +/SpaceBefore 0.0 +/TextIndent 44.0 +/EndIndent 0.0 +/StartIndent 27.0 +>> +endobj +1125 0 obj +<< +/SpaceAfter 0.0 +/TextAlign /Justify +/O /Layout +/WritingMode /LrTb +/SpaceBefore 0.0 +/TextIndent 92.0 +/EndIndent 0.0 +/StartIndent 0.0 +>> +endobj +1126 0 obj +<< +/Placement /Block +/O /Layout +/EndIndent 109.271 +/StartIndent 138.06 +/BBox [138.06 604.12 485.949 743.263] +>> +endobj +1127 0 obj +<< +/K [2928 0 R 2929 0 R 2930 0 R 2931 0 R 2932 0 R 2933 0 R 2934 0 R 2935 0 R] +/P 391 0 R +/S /TBody +>> +endobj +1128 0 obj +<< +/SpaceAfter 0.0 +/TextAlign /Justify +/O /Layout +/WritingMode /LrTb +/SpaceBefore 0.0 +/TextIndent 0.0 +/EndIndent 0.0 +/StartIndent 39.0 +>> +endobj +1129 0 obj +<< +/SpaceAfter 0.0 +/TextAlign /Justify +/O /Layout +/WritingMode /LrTb +/SpaceBefore 0.0 +/TextIndent 0.0 +/EndIndent 0.0 +/StartIndent 60.0 +>> +endobj +1130 0 obj +<< +/SpaceAfter 0.0 +/TextAlign /Justify +/O /Layout +/WritingMode /LrTb +/SpaceBefore 0.0 +/TextIndent 26.0 +/EndIndent 0.0 +/StartIndent 59.0 +>> +endobj +1131 0 obj +<< +/SpaceAfter 0.0 +/TextAlign /Justify +/O /Layout +/WritingMode /LrTb +/SpaceBefore 0.0 +/TextIndent 31.0 +/EndIndent 0.0 +/StartIndent 59.0 +>> +endobj +1132 0 obj +<< +/Placement /Block +/O /Layout +/EndIndent 69.5043 +/StartIndent 96.2986 +/BBox [96.2986 354.94 525.716 397.559] +>> +endobj +1133 0 obj +<< +/K [2936 0 R 2937 0 R 2938 0 R] +/P 403 0 R +/S /TBody +>> +endobj +1134 0 obj +<< +/Placement /Block +/O /Layout +/EndIndent 69.5031 +/StartIndent 96.2999 +/BBox [96.2999 290.5 525.717 333.178] +>> +endobj +1135 0 obj +<< +/K [2939 0 R 2940 0 R 2941 0 R] +/P 405 0 R +/S /TBody +>> +endobj +1136 0 obj +<< +/Placement /Block +/O /Layout +/EndIndent 61.6456 +/StartIndent 87.84 +/BBox [87.84 82.7197 533.574 221.999] +>> +endobj +1137 0 obj +<< +/K [2942 0 R 2943 0 R 2944 0 R 2945 0 R 2946 0 R 2947 0 R 2948 0 R 2949 0 R 2950 0 R] +/P 410 0 R +/S /TBody +>> +endobj +1138 0 obj +<< +/SpaceAfter 0.0 +/TextAlign /Justify +/O /Layout +/WritingMode /LrTb +/SpaceBefore 0.0 +/TextIndent 15.0 +/EndIndent 0.0 +/StartIndent 21.0 +>> +endobj +1139 0 obj +<< +/Placement /Block +/O /Layout +/EndIndent 134.125 +/StartIndent 96.2994 +/BBox [96.2994 516.04 461.095 558.659] +>> +endobj +1140 0 obj +<< +/K [2951 0 R 2952 0 R 2953 0 R] +/P 422 0 R +/S /TBody +>> +endobj +1141 0 obj +<< +/Placement /Block +/O /Layout +/EndIndent 69.5041 +/StartIndent 96.2999 +/BBox [96.2999 451.6 525.716 494.278] +>> +endobj +1142 0 obj +<< +/K [2954 0 R 2955 0 R 2956 0 R] +/P 424 0 R +/S /TBody +>> +endobj +1143 0 obj +<< +/SpaceAfter 0.0 +/TextAlign /Justify +/O /Layout +/WritingMode /LrTb +/SpaceBefore 0.0 +/TextIndent -52.0 +/EndIndent 0.0 +/StartIndent 92.0 +>> +endobj +1144 0 obj +<< +/Placement /Block +/O /Layout +/EndIndent 134.124 +/StartIndent 96.2999 +/BBox [96.2999 127.3 461.096 169.979] +>> +endobj +1145 0 obj +<< +/K [2957 0 R 2958 0 R 2959 0 R] +/P 438 0 R +/S /TBody +>> +endobj +1146 0 obj +<< +/Placement /Block +/O /Layout +/EndIndent 134.124 +/StartIndent 96.2999 +>> +endobj +1147 0 obj +<< +/K [2960 0 R 2961 0 R 2962 0 R] +/P 440 0 R +/S /TBody +>> +endobj +1148 0 obj +<< +/Placement /Block +/O /Layout +/EndIndent 134.126 +/StartIndent 96.2984 +/BBox [96.2984 413.62 461.094 456.299] +>> +endobj +1149 0 obj +<< +/K [2963 0 R 2964 0 R 2965 0 R] +/P 457 0 R +/S /TBody +>> +endobj +1150 0 obj +<< +/Placement /Block +/O /Layout +/EndIndent 134.124 +/StartIndent 96.2999 +/BBox [96.2999 349.24 461.096 391.858] +>> +endobj +1151 0 obj +<< +/K [2966 0 R 2967 0 R 2968 0 R] +/P 459 0 R +/S /TBody +>> +endobj +1152 0 obj +<< +/Placement /Block +/O /Layout +/EndIndent 134.124 +/StartIndent 96.2999 +/BBox [96.2999 284.8 461.096 327.478] +>> +endobj +1153 0 obj +<< +/K [2969 0 R 2970 0 R 2971 0 R] +/P 461 0 R +/S /TBody +>> +endobj +1154 0 obj +<< +/Placement /Block +/O /Layout +/EndIndent 134.124 +/StartIndent 96.2999 +/BBox [96.2999 220.42 461.096 263.098] +>> +endobj +1155 0 obj +<< +/K [2972 0 R 2973 0 R 2974 0 R] +/P 463 0 R +/S /TBody +>> +endobj +1156 0 obj +<< +/SpaceAfter 0.0 +/TextAlign /Justify +/O /Layout +/WritingMode /LrTb +/SpaceBefore 0.0 +/TextIndent -52.0 +/EndIndent 0.0 +/StartIndent 94.0 +>> +endobj +1157 0 obj +<< +/Placement /Block +/O /Layout +/EndIndent 134.124 +/StartIndent 96.2999 +/BBox [96.2999 562.84 461.096 605.459] +>> +endobj +1158 0 obj +<< +/K [2975 0 R 2976 0 R 2977 0 R] +/P 480 0 R +/S /TBody +>> +endobj +1159 0 obj +<< +/Placement /Block +/O /Layout +/EndIndent 134.124 +/StartIndent 96.2999 +/BBox [96.2999 498.4 461.096 541.078] +>> +endobj +1160 0 obj +<< +/K [2978 0 R 2979 0 R 2980 0 R] +/P 482 0 R +/S /TBody +>> +endobj +1161 0 obj +<< +/Placement /Block +/O /Layout +/EndIndent 134.124 +/StartIndent 96.2999 +/BBox [96.2999 434.02 461.096 476.698] +>> +endobj +1162 0 obj +<< +/K [2981 0 R 2982 0 R 2983 0 R] +/P 484 0 R +/S /TBody +>> +endobj +1163 0 obj +<< +/Placement /Block +/O /Layout +/EndIndent 134.124 +/StartIndent 96.2999 +/BBox [96.2999 369.64 461.096 412.258] +>> +endobj +1164 0 obj +<< +/K [2984 0 R 2985 0 R 2986 0 R] +/P 486 0 R +/S /TBody +>> +endobj +1165 0 obj +<< +/SpaceAfter 0.0 +/TextAlign /Justify +/O /Layout +/WritingMode /LrTb +/SpaceBefore 0.0 +/TextIndent -15.0 +/EndIndent 0.0 +/StartIndent 81.0 +>> +endobj +1166 0 obj +<< +/SpaceAfter 0.0 +/TextAlign /Justify +/O /Layout +/WritingMode /LrTb +/SpaceBefore 0.0 +/TextIndent -57.0 +/EndIndent 0.0 +/StartIndent 98.0 +>> +endobj +1167 0 obj +<< +/Placement /Block +/O /Layout +/EndIndent 69.5029 +/StartIndent 96.3 +/BBox [96.3 723.94 525.717 766.558] +>> +endobj +1168 0 obj +<< +/K [2987 0 R 2988 0 R 2989 0 R] +/P 502 0 R +/S /TBody +>> +endobj +1169 0 obj +<< +/SpaceAfter 0.0 +/TextAlign /Justify +/O /Layout +/WritingMode /LrTb +/SpaceBefore 0.0 +/TextIndent -17.0 +/EndIndent 0.0 +/StartIndent 62.0 +>> +endobj +1170 0 obj +<< +/Placement /Block +/O /Layout +/EndIndent 134.125 +/StartIndent 96.2991 +/BBox [96.2991 628.3 461.095 670.978] +>> +endobj +1171 0 obj +<< +/K [2990 0 R 2991 0 R 2992 0 R] +/P 505 0 R +/S /TBody +>> +endobj +1172 0 obj +<< +/SpaceAfter 0.0 +/TextAlign /Justify +/O /Layout +/WritingMode /LrTb +/SpaceBefore 0.0 +/TextIndent -57.0 +/EndIndent 0.0 +/StartIndent 99.0 +>> +endobj +1173 0 obj +<< +/SpaceAfter 0.0 +/TextAlign /Justify +/O /Layout +/WritingMode /LrTb +/SpaceBefore 0.0 +/TextIndent 0.0 +/EndIndent 0.0 +/StartIndent 42.0 +>> +endobj +1174 0 obj +<< +/Placement /Block +/O /Layout +/EndIndent 134.124 +/StartIndent 96.2999 +/BBox [96.2999 301.42 461.096 344.099] +>> +endobj +1175 0 obj +<< +/K [2993 0 R 2994 0 R 2995 0 R] +/P 521 0 R +/S /TBody +>> +endobj +1176 0 obj +<< +/Placement /Block +/O /Layout +/EndIndent 134.124 +/StartIndent 96.2999 +/BBox [96.2999 237.04 461.096 279.658] +>> +endobj +1177 0 obj +<< +/K [2996 0 R 2997 0 R 2998 0 R] +/P 523 0 R +/S /TBody +>> +endobj +1178 0 obj +<< +/Placement /Block +/O /Layout +/EndIndent 69.5031 +/StartIndent 96.2999 +/BBox [96.2999 615.82 525.717 658.499] +>> +endobj +1179 0 obj +<< +/K [2999 0 R 3000 0 R 3001 0 R] +/P 537 0 R +/S /TBody +>> +endobj +1180 0 obj +<< +/Placement /Block +/O /Layout +/EndIndent 134.124 +/StartIndent 96.2997 +/BBox [96.2997 535.84 461.096 578.458] +>> +endobj +1181 0 obj +<< +/K [3002 0 R 3003 0 R 3004 0 R] +/P 540 0 R +/S /TBody +>> +endobj +1182 0 obj +<< +/Placement /Block +/O /Layout +/EndIndent 134.124 +/StartIndent 96.2999 +/BBox [96.2999 471.4 461.096 514.078] +>> +endobj +1183 0 obj +<< +/K [3005 0 R 3006 0 R 3007 0 R] +/P 542 0 R +/S /TBody +>> +endobj +1184 0 obj +<< +/Placement /Block +/O /Layout +/EndIndent 134.124 +/StartIndent 96.2999 +/BBox [96.2999 407.02 461.096 449.698] +>> +endobj +1185 0 obj +<< +/K [3008 0 R 3009 0 R 3010 0 R] +/P 544 0 R +/S /TBody +>> +endobj +1186 0 obj +<< +/SpaceAfter 0.0 +/TextAlign /Justify +/O /Layout +/WritingMode /LrTb +/SpaceBefore 0.0 +/TextIndent 63.0 +/EndIndent 0.0 +/StartIndent 0.0 +>> +endobj +1187 0 obj +<< +/Placement /Block +/O /Layout +/EndIndent 69.5031 +/StartIndent 96.2999 +/BBox [96.2999 80.1397 525.717 122.759] +>> +endobj +1188 0 obj +<< +/K [3011 0 R 3012 0 R 3013 0 R] +/P 561 0 R +/S /TBody +>> +endobj +1189 0 obj +<< +/Placement /Block +/O /Layout +/EndIndent 134.124 +/StartIndent 96.2999 +/BBox [96.2999 692.74 461.096 735.358] +>> +endobj +1190 0 obj +<< +/K [3014 0 R 3015 0 R 3016 0 R] +/P 564 0 R +/S /TBody +>> +endobj +1191 0 obj +<< +/Placement /Block +/O /Layout +/EndIndent 134.124 +/StartIndent 96.2999 +/BBox [96.2999 628.3 461.096 670.978] +>> +endobj +1192 0 obj +<< +/K [3017 0 R 3018 0 R 3019 0 R] +/P 566 0 R +/S /TBody +>> +endobj +1193 0 obj +<< +/Placement /Block +/O /Layout +/EndIndent 134.124 +/StartIndent 96.2999 +/BBox [96.2999 563.92 461.096 606.598] +>> +endobj +1194 0 obj +<< +/K [3020 0 R 3021 0 R 3022 0 R] +/P 568 0 R +/S /TBody +>> +endobj +1195 0 obj +<< +/SpaceAfter 0.0 +/TextAlign /Justify +/O /Layout +/WritingMode /LrTb +/SpaceBefore 0.0 +/TextIndent -6.99998 +/EndIndent 0.0 +/StartIndent 73.0 +>> +endobj +1196 0 obj +<< +/Placement /Block +/O /Layout +/EndIndent 65.4817 +/StartIndent 92.2805 +/BBox [92.2805 237.04 529.738 279.659] +>> +endobj +1197 0 obj +<< +/K [3023 0 R 3024 0 R 3025 0 R] +/P 584 0 R +/S /TBody +>> +endobj +1198 0 obj +<< +/Placement /Block +/O /Layout +/EndIndent 134.124 +/StartIndent 96.2999 +/BBox [96.2999 157.0 461.096 199.678] +>> +endobj +1199 0 obj +<< +/K [3026 0 R 3027 0 R 3028 0 R] +/P 587 0 R +/S /TBody +>> +endobj +1200 0 obj +<< +/Placement /Block +/O /Layout +/EndIndent 65.4817 +/StartIndent 92.2805 +/BBox [92.2805 508.24 529.738 550.859] +>> +endobj +1201 0 obj +<< +/K [3029 0 R 3030 0 R 3031 0 R] +/P 604 0 R +/S /TBody +>> +endobj +1202 0 obj +<< +/Placement /Block +/O /Layout +/EndIndent 134.124 +/StartIndent 96.2997 +/BBox [96.2997 428.2 461.096 470.878] +>> +endobj +1203 0 obj +<< +/K [3032 0 R 3033 0 R 3034 0 R] +/P 607 0 R +/S /TBody +>> +endobj +1204 0 obj +<< +/Placement /Block +/O /Layout +/EndIndent 65.4827 +/StartIndent 92.2794 +/BBox [92.2794 101.32 529.737 143.999] +>> +endobj +1205 0 obj +<< +/K [3035 0 R 3036 0 R 3037 0 R] +/P 624 0 R +/S /TBody +>> +endobj +1206 0 obj +<< +/Placement /Block +/O /Layout +/EndIndent 134.124 +/StartIndent 96.3 +/BBox [96.3 723.94 461.096 766.558] +>> +endobj +1207 0 obj +<< +/K [3038 0 R 3039 0 R 3040 0 R] +/P 626 0 R +/S /TBody +>> +endobj +1208 0 obj +<< +/Placement /Block +/O /Layout +/EndIndent 134.124 +/StartIndent 96.2999 +/BBox [96.2999 428.2 461.096 470.879] +>> +endobj +1209 0 obj +<< +/K [3041 0 R 3042 0 R 3043 0 R] +/P 641 0 R +/S /TBody +>> +endobj +1210 0 obj +<< +/Placement /Block +/O /Layout +/EndIndent 134.124 +/StartIndent 96.2999 +/BBox [96.2999 363.82 461.096 406.498] +>> +endobj +1211 0 obj +<< +/K [3044 0 R 3045 0 R 3046 0 R] +/P 643 0 R +/S /TBody +>> +endobj +1212 0 obj +<< +/Placement /Block +/O /Layout +/EndIndent 134.124 +/StartIndent 96.2999 +>> +endobj +1213 0 obj +<< +/K [3047 0 R 3048 0 R 3049 0 R] +/P 658 0 R +/S /TBody +>> +endobj +1214 0 obj +<< +/Placement /Block +/O /Layout +/EndIndent 69.5041 +/StartIndent 96.2999 +/BBox [96.2999 675.64 525.716 718.258] +>> +endobj +1215 0 obj +<< +/K [3050 0 R 3051 0 R 3052 0 R] +/P 660 0 R +/S /TBody +>> +endobj +1216 0 obj +<< +/Placement /Block +/O /Layout +/EndIndent 59.1514 +/StartIndent 78.0004 +/BBox [78.0004 364.3 536.069 406.979] +>> +endobj +1217 0 obj +<< +/K [3053 0 R 3054 0 R 3055 0 R] +/P 675 0 R +/S /TBody +>> +endobj +1218 0 obj +<< +/Placement /Block +/O /Layout +/EndIndent 65.0903 +/StartIndent 92.2805 +/BBox [92.2805 284.32 530.13 326.998] +>> +endobj +1219 0 obj +<< +/K [3056 0 R 3057 0 R 3058 0 R] +/P 678 0 R +/S /TBody +>> +endobj +1220 0 obj +<< +/SpaceAfter 0.0 +/TextAlign /Justify +/O /Layout +/WritingMode /LrTb +/SpaceBefore 0.0 +/TextIndent -126.0 +/EndIndent 0.0 +/StartIndent 126.0 +>> +endobj +1221 0 obj +<< +/SpaceAfter 0.0 +/TextAlign /Justify +/O /Layout +/WritingMode /LrTb +/SpaceBefore 0.0 +/TextIndent 47.0 +/EndIndent 0.0 +/StartIndent 0.0 +>> +endobj +1222 0 obj +<< +/Placement /Block +/O /Layout +/EndIndent 134.125 +/StartIndent 96.2994 +/BBox [96.2994 570.64 461.095 613.259] +>> +endobj +1223 0 obj +<< +/K [3059 0 R 3060 0 R 3061 0 R] +/P 696 0 R +/S /TBody +>> +endobj +1224 0 obj +<< +/Placement /Block +/O /Layout +/EndIndent 69.5041 +/StartIndent 96.2999 +/BBox [96.2999 506.2 525.716 548.878] +>> +endobj +1225 0 obj +<< +/K [3062 0 R 3063 0 R 3064 0 R] +/P 698 0 R +/S /TBody +>> +endobj +1226 0 obj +<< +/SpaceAfter 0.0 +/TextAlign /Justify +/O /Layout +/WritingMode /LrTb +/SpaceBefore 0.0 +/TextIndent 78.0 +/EndIndent 0.0 +/StartIndent 0.0 +>> +endobj +1227 0 obj +<< +/A [3065 0 R] +/K 1 +/P 761 0 R +/S /InlineShape +/Pg 49 0 R +>> +endobj +1228 0 obj +<< +/A [3066 0 R] +/K 1 +/P 763 0 R +/S /InlineShape +/Pg 50 0 R +>> +endobj +1229 0 obj +<< +/Placement /Block +/O /Layout +/EndIndent 108.606 +/StartIndent 107.88 +/BBox [107.88 446.917 486.613 664.466] +>> +endobj +1230 0 obj +<< +/K [3067 0 R 3068 0 R 3069 0 R 3070 0 R 3071 0 R 3072 0 R 3073 0 R 3074 0 R 3075 0 R 3076 0 R +3077 0 R 3078 0 R 3079 0 R] +/P 767 0 R +/S /TBody +>> +endobj +1231 0 obj +<< +/Placement /Block +/O /Layout +/EndIndent 89.1509 +/StartIndent 108.915 +/BBox [108.915 163.915 506.069 380.785] +>> +endobj +1232 0 obj +<< +/K [3080 0 R 3081 0 R 3082 0 R 3083 0 R 3084 0 R 3085 0 R 3086 0 R 3087 0 R 3088 0 R 3089 0 R +3090 0 R 3091 0 R 3092 0 R] +/P 769 0 R +/S /TBody +>> +endobj +1233 0 obj +<< +/SpaceAfter 16.0 +/TextAlign /Start +/O /Layout +/WritingMode /LrTb +/SpaceBefore 17.0 +/TextIndent 0.0 +/EndIndent 0.0 +/StartIndent 0.0 +>> +endobj +1234 0 obj +<< +/SpaceAfter 13.0 +/TextAlign /Start +/O /Layout +/WritingMode /LrTb +/SpaceBefore 13.0 +/TextIndent 32.0 +/EndIndent 0.0 +/StartIndent 0.0 +>> +endobj +1235 0 obj +<< +/SpaceAfter 0.0 +/TextAlign /Center +/O /Layout +/WritingMode /LrTb +/SpaceBefore 0.0 +/TextIndent 36.0 +/EndIndent 0.0 +/StartIndent -44.0 +>> +endobj +1236 0 obj +<< +/A [3093 0 R] +/K 3 +/P 777 0 R +/S /InlineShape +/Pg 52 0 R +>> +endobj +1237 0 obj +<< +/Placement /Block +/O /Layout +/EndIndent -4.85001 +/StartIndent 1.14999 +/BBox [89.0 135.0 529.0 462.0] +>> +endobj +1238 0 obj +<< +/Placement /Block +/O /Layout +/EndIndent 18.15 +/StartIndent 291.15 +/BBox [379.0 161.0 506.0 262.0] +>> +endobj +1239 0 obj +<< +/K [1 3094 0 R] +/P 984 0 R +/S /Link +/Pg 23 0 R +>> +endobj +1240 0 obj +<< +/K [2 3095 0 R] +/P 985 0 R +/S /Link +/Pg 23 0 R +>> +endobj +1241 0 obj +<< +/K [3 3096 0 R] +/P 986 0 R +/S /Link +/Pg 23 0 R +>> +endobj +1242 0 obj +<< +/K [4 3097 0 R] +/P 987 0 R +/S /Link +/Pg 23 0 R +>> +endobj +1243 0 obj +<< +/K [5 3098 0 R] +/P 988 0 R +/S /Link +/Pg 23 0 R +>> +endobj +1244 0 obj +<< +/K [6 3099 0 R] +/P 989 0 R +/S /Link +/Pg 23 0 R +>> +endobj +1245 0 obj +<< +/K [7 3100 0 R] +/P 990 0 R +/S /Link +/Pg 23 0 R +>> +endobj +1246 0 obj +<< +/K [8 3101 0 R] +/P 991 0 R +/S /Link +/Pg 23 0 R +>> +endobj +1247 0 obj +<< +/K [9 3102 0 R] +/P 992 0 R +/S /Link +/Pg 23 0 R +>> +endobj +1248 0 obj +<< +/K [10 3103 0 R] +/P 993 0 R +/S /Link +/Pg 23 0 R +>> +endobj +1249 0 obj +<< +/K [11 3104 0 R] +/P 994 0 R +/S /Link +/Pg 23 0 R +>> +endobj +1250 0 obj +<< +/K [12 3105 0 R] +/P 995 0 R +/S /Link +/Pg 23 0 R +>> +endobj +1251 0 obj +<< +/K [13 3106 0 R] +/P 996 0 R +/S /Link +/Pg 23 0 R +>> +endobj +1252 0 obj +<< +/K [14 3107 0 R] +/P 997 0 R +/S /Link +/Pg 23 0 R +>> +endobj +1253 0 obj +<< +/K [15 3108 0 R] +/P 998 0 R +/S /Link +/Pg 23 0 R +>> +endobj +1254 0 obj +<< +/K [16 3109 0 R] +/P 999 0 R +/S /Link +/Pg 23 0 R +>> +endobj +1255 0 obj +<< +/K [17 3110 0 R] +/P 1000 0 R +/S /Link +/Pg 23 0 R +>> +endobj +1256 0 obj +<< +/K [18 3111 0 R] +/P 1001 0 R +/S /Link +/Pg 23 0 R +>> +endobj +1257 0 obj +<< +/K [19 3112 0 R] +/P 1002 0 R +/S /Link +/Pg 23 0 R +>> +endobj +1258 0 obj +<< +/K [20 3113 0 R] +/P 1003 0 R +/S /Link +/Pg 23 0 R +>> +endobj +1259 0 obj +<< +/K [21 3114 0 R] +/P 1004 0 R +/S /Link +/Pg 23 0 R +>> +endobj +1260 0 obj +<< +/K [22 3115 0 R] +/P 1005 0 R +/S /Link +/Pg 23 0 R +>> +endobj +1261 0 obj +<< +/K [23 3116 0 R] +/P 1006 0 R +/S /Link +/Pg 23 0 R +>> +endobj +1262 0 obj +<< +/K [24 3117 0 R] +/P 1007 0 R +/S /Link +/Pg 23 0 R +>> +endobj +1263 0 obj +<< +/K [25 3118 0 R] +/P 1008 0 R +/S /Link +/Pg 23 0 R +>> +endobj +1264 0 obj +<< +/K [26 3119 0 R] +/P 1009 0 R +/S /Link +/Pg 23 0 R +>> +endobj +1265 0 obj +<< +/K [27 3120 0 R] +/P 1010 0 R +/S /Link +/Pg 23 0 R +>> +endobj +1266 0 obj +<< +/K [28 3121 0 R] +/P 1011 0 R +/S /Link +/Pg 23 0 R +>> +endobj +1267 0 obj +<< +/K [29 3122 0 R] +/P 1012 0 R +/S /Link +/Pg 23 0 R +>> +endobj +1268 0 obj +<< +/K [30 3123 0 R] +/P 1013 0 R +/S /Link +/Pg 23 0 R +>> +endobj +1269 0 obj +<< +/K [31 3124 0 R] +/P 1014 0 R +/S /Link +/Pg 23 0 R +>> +endobj +1270 0 obj +<< +/K [32 3125 0 R] +/P 1015 0 R +/S /Link +/Pg 23 0 R +>> +endobj +1271 0 obj +<< +/K [33 3126 0 R] +/P 1016 0 R +/S /Link +/Pg 23 0 R +>> +endobj +1272 0 obj +<< +/K [34 3127 0 R] +/P 1017 0 R +/S /Link +/Pg 23 0 R +>> +endobj +1273 0 obj +<< +/K [35 3128 0 R] +/P 1018 0 R +/S /Link +/Pg 23 0 R +>> +endobj +1274 0 obj +<< +/A 972 0 R +/K 6 +/P 3129 0 R +/S /header +/Pg 26 0 R +>> +endobj +1275 0 obj +<< +/A 972 0 R +/K 7 +/P 3130 0 R +/S /Body#20Text +/Pg 26 0 R +>> +endobj +1276 0 obj +<< +/A 972 0 R +/K 8 +/P 3131 0 R +/S /Normal +/Pg 26 0 R +>> +endobj +1277 0 obj +<< +/A 972 0 R +/K 9 +/P 3132 0 R +/S /Note#20Heading +/Pg 26 0 R +>> +endobj +1278 0 obj +<< +/A 972 0 R +/K 10 +/P 3133 0 R +/S /Normal +/Pg 26 0 R +>> +endobj +1279 0 obj +<< +/A 972 0 R +/K 11 +/P 3134 0 R +/S /Body#20Text +/Pg 26 0 R +>> +endobj +1280 0 obj +<< +/A 972 0 R +/K 12 +/P 3135 0 R +/S /Note#20Heading +/Pg 26 0 R +>> +endobj +1281 0 obj +<< +/A 973 0 R +/K 13 +/P 3136 0 R +/S /Normal +/Pg 26 0 R +>> +endobj +1282 0 obj +<< +/A 972 0 R +/K 14 +/P 3137 0 R +/S /Normal +/Pg 26 0 R +>> +endobj +1283 0 obj +<< +/A 972 0 R +/K 15 +/P 3138 0 R +/S /Body#20Text +/Pg 26 0 R +>> +endobj +1284 0 obj +<< +/A 972 0 R +/K 16 +/P 3139 0 R +/S /Normal +/Pg 26 0 R +>> +endobj +1285 0 obj +<< +/A 973 0 R +/K 17 +/P 3140 0 R +/S /Normal +/Pg 26 0 R +>> +endobj +1286 0 obj +<< +/A 972 0 R +/K 18 +/P 3141 0 R +/S /Normal +/Pg 26 0 R +>> +endobj +1287 0 obj +<< +/A 972 0 R +/K 19 +/P 3142 0 R +/S /Normal +/Pg 26 0 R +>> +endobj +1288 0 obj +<< +/A 972 0 R +/K 20 +/P 3143 0 R +/S /Normal +/Pg 26 0 R +>> +endobj +1289 0 obj +<< +/A 973 0 R +/K 21 +/P 3144 0 R +/S /Normal +/Pg 26 0 R +>> +endobj +1290 0 obj +<< +/A 972 0 R +/K 22 +/P 3145 0 R +/S /Normal +/Pg 26 0 R +>> +endobj +1291 0 obj +<< +/A 972 0 R +/K 23 +/P 3146 0 R +/S /Normal +/Pg 26 0 R +>> +endobj +1292 0 obj +<< +/A 972 0 R +/K 24 +/P 3147 0 R +/S /Normal +/Pg 26 0 R +>> +endobj +1293 0 obj +<< +/A 973 0 R +/K 25 +/P 3148 0 R +/S /Normal +/Pg 26 0 R +>> +endobj +1294 0 obj +<< +/A 972 0 R +/K 26 +/P 3149 0 R +/S /Normal +/Pg 26 0 R +>> +endobj +1295 0 obj +<< +/A 972 0 R +/K 27 +/P 3150 0 R +/S /Normal +/Pg 26 0 R +>> +endobj +1296 0 obj +<< +/A 972 0 R +/K 28 +/P 3151 0 R +/S /Normal +/Pg 26 0 R +>> +endobj +1297 0 obj +<< +/A 973 0 R +/K 29 +/P 3152 0 R +/S /Normal +/Pg 26 0 R +>> +endobj +1298 0 obj +<< +/A 3153 0 R +/K 3 +/P 1043 0 R +/S /LBody +/Pg 27 0 R +>> +endobj +1299 0 obj +<< +/A 972 0 R +/K 4 +/P 3154 0 R +/S /Normal +/Pg 27 0 R +>> +endobj +1300 0 obj +<< +/A 972 0 R +/K 5 +/P 3155 0 R +/S /Normal +/Pg 27 0 R +>> +endobj +1301 0 obj +<< +/A 972 0 R +/K 6 +/P 3156 0 R +/S /Normal +/Pg 27 0 R +>> +endobj +1302 0 obj +<< +/A 972 0 R +/K 7 +/P 3157 0 R +/S /Normal +/Pg 27 0 R +>> +endobj +1303 0 obj +<< +/A 972 0 R +/K 8 +/P 3158 0 R +/S /Normal +/Pg 27 0 R +>> +endobj +1304 0 obj +<< +/A 972 0 R +/K 9 +/P 3159 0 R +/S /Normal +/Pg 27 0 R +>> +endobj +1305 0 obj +<< +/A 972 0 R +/K 10 +/P 3160 0 R +/S /Normal +/Pg 27 0 R +>> +endobj +1306 0 obj +<< +/A 972 0 R +/K 11 +/P 3161 0 R +/S /Normal +/Pg 27 0 R +>> +endobj +1307 0 obj +<< +/A 972 0 R +/K 12 +/P 3162 0 R +/S /Normal +/Pg 27 0 R +>> +endobj +1308 0 obj +<< +/A 972 0 R +/K 13 +/P 3163 0 R +/S /Normal +/Pg 27 0 R +>> +endobj +1309 0 obj +<< +/A 972 0 R +/K 14 +/P 3164 0 R +/S /Normal +/Pg 27 0 R +>> +endobj +1310 0 obj +<< +/A 972 0 R +/K 15 +/P 3165 0 R +/S /Normal +/Pg 27 0 R +>> +endobj +1311 0 obj +<< +/A 973 0 R +/K 16 +/P 3166 0 R +/S /Normal +/Pg 27 0 R +>> +endobj +1312 0 obj +<< +/A 972 0 R +/K [17 1313 0 R] +/P 3167 0 R +/S /Normal +/Pg 27 0 R +>> +endobj +1313 0 obj +<< +/A 3168 0 R +/K 18 +/P 1312 0 R +/S /Subscript +/Pg 27 0 R +>> +endobj +1314 0 obj +<< +/A 972 0 R +/K 19 +/P 3169 0 R +/S /Normal +/Pg 27 0 R +>> +endobj +1315 0 obj +<< +/A 972 0 R +/K 20 +/P 3170 0 R +/S /Normal +/Pg 27 0 R +>> +endobj +1316 0 obj +<< +/A 972 0 R +/K 21 +/P 3171 0 R +/S /Normal +/Pg 27 0 R +>> +endobj +1317 0 obj +<< +/A 972 0 R +/K 22 +/P 3172 0 R +/S /Normal +/Pg 27 0 R +>> +endobj +1318 0 obj +<< +/A 973 0 R +/K 23 +/P 3173 0 R +/S /Normal +/Pg 27 0 R +>> +endobj +1319 0 obj +<< +/A 972 0 R +/K 24 +/P 3174 0 R +/S /Normal +/Pg 27 0 R +>> +endobj +1320 0 obj +<< +/A 972 0 R +/K 25 +/P 3175 0 R +/S /Normal +/Pg 27 0 R +>> +endobj +1321 0 obj +<< +/A 972 0 R +/K 26 +/P 3176 0 R +/S /Normal +/Pg 27 0 R +>> +endobj +1322 0 obj +<< +/A 972 0 R +/K 27 +/P 3177 0 R +/S /Normal +/Pg 27 0 R +>> +endobj +1323 0 obj +<< +/A 972 0 R +/K 28 +/P 3178 0 R +/S /Normal +/Pg 27 0 R +>> +endobj +1324 0 obj +<< +/A 972 0 R +/K 29 +/P 3179 0 R +/S /Note#20Heading +/Pg 27 0 R +>> +endobj +1325 0 obj +<< +/A 972 0 R +/K 30 +/P 3180 0 R +/S /Normal +/Pg 27 0 R +>> +endobj +1326 0 obj +<< +/A 972 0 R +/K 31 +/P 3181 0 R +/S /Normal +/Pg 27 0 R +>> +endobj +1327 0 obj +<< +/A 972 0 R +/K 32 +/P 3182 0 R +/S /Note#20Heading +/Pg 27 0 R +>> +endobj +1328 0 obj +<< +/A 972 0 R +/K 33 +/P 3183 0 R +/S /Normal +/Pg 27 0 R +>> +endobj +1329 0 obj +<< +/A 972 0 R +/K 34 +/P 3184 0 R +/S /Normal +/Pg 27 0 R +>> +endobj +1330 0 obj +<< +/A 972 0 R +/K 35 +/P 3185 0 R +/S /Normal +/Pg 27 0 R +>> +endobj +1331 0 obj +<< +/A 3186 0 R +/K 36 +/P 1046 0 R +/S /LBody +/Pg 27 0 R +>> +endobj +1332 0 obj +<< +/A 972 0 R +/K 37 +/P 3187 0 R +/S /Normal +/Pg 27 0 R +>> +endobj +1333 0 obj +<< +/A 972 0 R +/K 38 +/P 3188 0 R +/S /Normal +/Pg 27 0 R +>> +endobj +1334 0 obj +<< +/A 972 0 R +/K 39 +/P 3189 0 R +/S /Normal +/Pg 27 0 R +>> +endobj +1335 0 obj +<< +/A 972 0 R +/K 40 +/P 3190 0 R +/S /Normal +/Pg 27 0 R +>> +endobj +1336 0 obj +<< +/A 972 0 R +/K 41 +/P 3191 0 R +/S /Normal +/Pg 27 0 R +>> +endobj +1337 0 obj +<< +/A 972 0 R +/K 42 +/P 3192 0 R +/S /Normal +/Pg 27 0 R +>> +endobj +1338 0 obj +<< +/A 972 0 R +/K 43 +/P 3193 0 R +/S /Normal +/Pg 27 0 R +>> +endobj +1339 0 obj +<< +/A 972 0 R +/K 44 +/P 3194 0 R +/S /Normal +/Pg 27 0 R +>> +endobj +1340 0 obj +<< +/A 972 0 R +/K [45 1341 0 R] +/P 3195 0 R +/S /Normal +/Pg 27 0 R +>> +endobj +1341 0 obj +<< +/A 3196 0 R +/K 46 +/P 1340 0 R +/S /Subscript +/Pg 27 0 R +>> +endobj +1342 0 obj +<< +/A 973 0 R +/K [47 1343 0 R 49] +/P 3197 0 R +/S /Normal +/Pg 27 0 R +>> +endobj +1343 0 obj +<< +/A 3198 0 R +/K 48 +/P 1342 0 R +/S /Subscript +/Pg 27 0 R +>> +endobj +1344 0 obj +<< +/A 972 0 R +/K 50 +/P 3199 0 R +/S /Note#20Heading +/Pg 27 0 R +>> +endobj +1345 0 obj +<< +/A 972 0 R +/K 51 +/P 3200 0 R +/S /Normal +/Pg 27 0 R +>> +endobj +1346 0 obj +<< +/A 972 0 R +/K 52 +/P 3201 0 R +/S /Normal +/Pg 27 0 R +>> +endobj +1347 0 obj +<< +/A 972 0 R +/K 53 +/P 3202 0 R +/S /Note#20Heading +/Pg 27 0 R +>> +endobj +1348 0 obj +<< +/A 973 0 R +/K 54 +/P 3203 0 R +/S /Normal +/Pg 27 0 R +>> +endobj +1349 0 obj +<< +/A 972 0 R +/K [55 1350 0 R] +/P 3204 0 R +/S /Normal +/Pg 27 0 R +>> +endobj +1350 0 obj +<< +/A 3205 0 R +/K 56 +/P 1349 0 R +/S /Subscript +/Pg 27 0 R +>> +endobj +1351 0 obj +<< +/A 973 0 R +/K [57 1352 0 R 59] +/P 3206 0 R +/S /Normal +/Pg 27 0 R +>> +endobj +1352 0 obj +<< +/A 3207 0 R +/K 58 +/P 1351 0 R +/S /Subscript +/Pg 27 0 R +>> +endobj +1353 0 obj +<< +/A 972 0 R +/K 60 +/P 3208 0 R +/S /Normal +/Pg 27 0 R +>> +endobj +1354 0 obj +<< +/A 972 0 R +/K 61 +/P 3209 0 R +/S /Normal +/Pg 27 0 R +>> +endobj +1355 0 obj +<< +/A 972 0 R +/K 62 +/P 3210 0 R +/S /Normal +/Pg 27 0 R +>> +endobj +1356 0 obj +<< +/A 972 0 R +/K 63 +/P 3211 0 R +/S /Normal +/Pg 27 0 R +>> +endobj +1357 0 obj +<< +/A 973 0 R +/K 64 +/P 3212 0 R +/S /Normal +/Pg 27 0 R +>> +endobj +1358 0 obj +<< +/A 3186 0 R +/K 65 +/P 1049 0 R +/S /LBody +/Pg 27 0 R +>> +endobj +1359 0 obj +<< +/A 972 0 R +/K 66 +/P 3213 0 R +/S /Normal +/Pg 27 0 R +>> +endobj +1360 0 obj +<< +/A 972 0 R +/K 67 +/P 3214 0 R +/S /Normal +/Pg 27 0 R +>> +endobj +1361 0 obj +<< +/A 972 0 R +/K 68 +/P 3215 0 R +/S /Normal +/Pg 27 0 R +>> +endobj +1362 0 obj +<< +/A 972 0 R +/K 69 +/P 3216 0 R +/S /Normal +/Pg 27 0 R +>> +endobj +1363 0 obj +<< +/A 972 0 R +/K 70 +/P 3217 0 R +/S /Normal +/Pg 27 0 R +>> +endobj +1364 0 obj +<< +/A 972 0 R +/K 71 +/P 3218 0 R +/S /Normal +/Pg 27 0 R +>> +endobj +1365 0 obj +<< +/A 972 0 R +/K 72 +/P 3219 0 R +/S /Normal +/Pg 27 0 R +>> +endobj +1366 0 obj +<< +/A 972 0 R +/K 73 +/P 3220 0 R +/S /Normal +/Pg 27 0 R +>> +endobj +1367 0 obj +<< +/A 972 0 R +/K [74 1368 0 R] +/P 3221 0 R +/S /Normal +/Pg 27 0 R +>> +endobj +1368 0 obj +<< +/A 3222 0 R +/K 75 +/P 1367 0 R +/S /Subscript +/Pg 27 0 R +>> +endobj +1369 0 obj +<< +/A 972 0 R +/K 76 +/P 3223 0 R +/S /Note#20Heading +/Pg 27 0 R +>> +endobj +1370 0 obj +<< +/A 972 0 R +/K 77 +/P 3224 0 R +/S /Note#20Heading +/Pg 27 0 R +>> +endobj +1371 0 obj +<< +/A 972 0 R +/K 78 +/P 3225 0 R +/S /Normal +/Pg 27 0 R +>> +endobj +1372 0 obj +<< +/A 972 0 R +/K 79 +/P 3226 0 R +/S /Note#20Heading +/Pg 27 0 R +>> +endobj +1373 0 obj +<< +/A 972 0 R +/K 80 +/P 3227 0 R +/S /Note#20Heading +/Pg 27 0 R +>> +endobj +1374 0 obj +<< +/A 973 0 R +/K 81 +/P 3228 0 R +/S /Normal +/Pg 27 0 R +>> +endobj +1375 0 obj +<< +/A 972 0 R +/K [82 1376 0 R] +/P 3229 0 R +/S /Normal +/Pg 27 0 R +>> +endobj +1376 0 obj +<< +/A 3230 0 R +/K 83 +/P 1375 0 R +/S /Subscript +/Pg 27 0 R +>> +endobj +1377 0 obj +<< +/A 972 0 R +/K 84 +/P 3231 0 R +/S /Normal +/Pg 27 0 R +>> +endobj +1378 0 obj +<< +/A 972 0 R +/K 85 +/P 3232 0 R +/S /Note#20Heading +/Pg 27 0 R +>> +endobj +1379 0 obj +<< +/A 972 0 R +/K 86 +/P 3233 0 R +/S /Note#20Heading +/Pg 27 0 R +>> +endobj +1380 0 obj +<< +/A 972 0 R +/K 87 +/P 3234 0 R +/S /Note#20Heading +/Pg 27 0 R +>> +endobj +1381 0 obj +<< +/A 972 0 R +/K 88 +/P 3235 0 R +/S /Normal +/Pg 27 0 R +>> +endobj +1382 0 obj +<< +/A 973 0 R +/K 89 +/P 3236 0 R +/S /Normal +/Pg 27 0 R +>> +endobj +1383 0 obj +<< +/A 973 0 R +/K [90 1384 0 R 92] +/P 3237 0 R +/S /Normal +/Pg 27 0 R +>> +endobj +1384 0 obj +<< +/A 3238 0 R +/K 91 +/P 1383 0 R +/S /Subscript +/Pg 27 0 R +>> +endobj +1385 0 obj +<< +/A 972 0 R +/K 93 +/P 3239 0 R +/S /Normal +/Pg 27 0 R +>> +endobj +1386 0 obj +<< +/A 972 0 R +/K 94 +/P 3240 0 R +/S /Note#20Heading +/Pg 27 0 R +>> +endobj +1387 0 obj +<< +/A 972 0 R +/K 95 +/P 3241 0 R +/S /Normal +/Pg 27 0 R +>> +endobj +1388 0 obj +<< +/A 972 0 R +/K 96 +/P 3242 0 R +/S /Note#20Heading +/Pg 27 0 R +>> +endobj +1389 0 obj +<< +/A 972 0 R +/K [97 1390 0 R] +/P 3243 0 R +/S /Normal +/Pg 27 0 R +>> +endobj +1390 0 obj +<< +/A 3244 0 R +/K 98 +/P 1389 0 R +/S /Subscript +/Pg 27 0 R +>> +endobj +1391 0 obj +<< +/A 973 0 R +/K [99 1392 0 R 101] +/P 3245 0 R +/S /Normal +/Pg 27 0 R +>> +endobj +1392 0 obj +<< +/A 3246 0 R +/K 100 +/P 1391 0 R +/S /Subscript +/Pg 27 0 R +>> +endobj +1393 0 obj +<< +/A 972 0 R +/K 102 +/P 3247 0 R +/S /Normal +/Pg 27 0 R +>> +endobj +1394 0 obj +<< +/A 972 0 R +/K 103 +/P 3248 0 R +/S /Note#20Heading +/Pg 27 0 R +>> +endobj +1395 0 obj +<< +/A 972 0 R +/K 104 +/P 3249 0 R +/S /Normal +/Pg 27 0 R +>> +endobj +1396 0 obj +<< +/A 972 0 R +/K 105 +/P 3250 0 R +/S /Note#20Heading +/Pg 27 0 R +>> +endobj +1397 0 obj +<< +/A 972 0 R +/K 106 +/P 3251 0 R +/S /Note#20Heading +/Pg 27 0 R +>> +endobj +1398 0 obj +<< +/A 972 0 R +/K [107 1399 0 R] +/P 3252 0 R +/S /Normal +/Pg 27 0 R +>> +endobj +1399 0 obj +<< +/A 3253 0 R +/K 108 +/P 1398 0 R +/S /Subscript +/Pg 27 0 R +>> +endobj +1400 0 obj +<< +/A 972 0 R +/K 109 +/P 3254 0 R +/S /Note#20Heading +/Pg 27 0 R +>> +endobj +1401 0 obj +<< +/A 972 0 R +/K 110 +/P 3255 0 R +/S /Normal +/Pg 27 0 R +>> +endobj +1402 0 obj +<< +/A 973 0 R +/K 111 +/P 3256 0 R +/S /Normal +/Pg 27 0 R +>> +endobj +1403 0 obj +<< +/A 972 0 R +/K 112 +/P 3257 0 R +/S /Note#20Heading +/Pg 27 0 R +>> +endobj +1404 0 obj +<< +/A 972 0 R +/K 113 +/P 3258 0 R +/S /Note#20Heading +/Pg 27 0 R +>> +endobj +1405 0 obj +<< +/A 973 0 R +/K 114 +/P 3259 0 R +/S /Normal +/Pg 27 0 R +>> +endobj +1406 0 obj +<< +/A 972 0 R +/K 117 +/P 3260 0 R +/S /header +/Pg 27 0 R +>> +endobj +1407 0 obj +<< +/A 972 0 R +/K 118 +/P 3261 0 R +/S /Body#20Text +/Pg 27 0 R +>> +endobj +1408 0 obj +<< +/A 972 0 R +/K 119 +/P 3262 0 R +/S /Normal +/Pg 27 0 R +>> +endobj +1409 0 obj +<< +/A 972 0 R +/K 120 +/P 3263 0 R +/S /Note#20Heading +/Pg 27 0 R +>> +endobj +1410 0 obj +<< +/A 972 0 R +/K 121 +/P 3264 0 R +/S /Normal +/Pg 27 0 R +>> +endobj +1411 0 obj +<< +/A 972 0 R +/K 122 +/P 3265 0 R +/S /Body#20Text +/Pg 27 0 R +>> +endobj +1412 0 obj +<< +/A 972 0 R +/K 123 +/P 3266 0 R +/S /Note#20Heading +/Pg 27 0 R +>> +endobj +1413 0 obj +<< +/A 973 0 R +/K 124 +/P 3267 0 R +/S /Normal +/Pg 27 0 R +>> +endobj +1414 0 obj +<< +/A 972 0 R +/K 125 +/P 3268 0 R +/S /Normal +/Pg 27 0 R +>> +endobj +1415 0 obj +<< +/A 972 0 R +/K 126 +/P 3269 0 R +/S /Body#20Text +/Pg 27 0 R +>> +endobj +1416 0 obj +<< +/A 972 0 R +/K 127 +/P 3270 0 R +/S /Normal +/Pg 27 0 R +>> +endobj +1417 0 obj +<< +/A 973 0 R +/K 128 +/P 3271 0 R +/S /Normal +/Pg 27 0 R +>> +endobj +1418 0 obj +<< +/A 972 0 R +/K 129 +/P 3272 0 R +/S /Normal +/Pg 27 0 R +>> +endobj +1419 0 obj +<< +/A 972 0 R +/K 130 +/P 3273 0 R +/S /Normal +/Pg 27 0 R +>> +endobj +1420 0 obj +<< +/A 972 0 R +/K 131 +/P 3274 0 R +/S /Normal +/Pg 27 0 R +>> +endobj +1421 0 obj +<< +/A 973 0 R +/K 132 +/P 3275 0 R +/S /Normal +/Pg 27 0 R +>> +endobj +1422 0 obj +<< +/A 972 0 R +/K 133 +/P 3276 0 R +/S /Normal +/Pg 27 0 R +>> +endobj +1423 0 obj +<< +/A 972 0 R +/K 134 +/P 3277 0 R +/S /Normal +/Pg 27 0 R +>> +endobj +1424 0 obj +<< +/A 972 0 R +/K 135 +/P 3278 0 R +/S /Normal +/Pg 27 0 R +>> +endobj +1425 0 obj +<< +/A 973 0 R +/K 136 +/P 3279 0 R +/S /Normal +/Pg 27 0 R +>> +endobj +1426 0 obj +<< +/A 972 0 R +/K 137 +/P 3280 0 R +/S /Normal +/Pg 27 0 R +>> +endobj +1427 0 obj +<< +/A 972 0 R +/K 138 +/P 3281 0 R +/S /Normal +/Pg 27 0 R +>> +endobj +1428 0 obj +<< +/A 972 0 R +/K 139 +/P 3282 0 R +/S /Normal +/Pg 27 0 R +>> +endobj +1429 0 obj +<< +/A 973 0 R +/K 140 +/P 3283 0 R +/S /Normal +/Pg 27 0 R +>> +endobj +1430 0 obj +<< +/A 3284 0 R +/K 11 +/P 3285 0 R +/S /Normal +/Pg 30 0 R +>> +endobj +1431 0 obj +<< +/A 3286 0 R +/K 12 +/P 3287 0 R +/S /Normal +/Pg 30 0 R +>> +endobj +1432 0 obj +<< +/A 972 0 R +/K 13 +/P 3288 0 R +/S /Note#20Heading +/Pg 30 0 R +>> +endobj +1433 0 obj +<< +/A 3284 0 R +/K 14 +/P 3289 0 R +/S /Normal +/Pg 30 0 R +>> +endobj +1434 0 obj +<< +/A 3284 0 R +/K 15 +/P 3290 0 R +/S /Normal +/Pg 30 0 R +>> +endobj +1435 0 obj +<< +/A 3284 0 R +/K 16 +/P 3291 0 R +/S /Normal +/Pg 30 0 R +>> +endobj +1436 0 obj +<< +/A 972 0 R +/K 17 +/P 3292 0 R +/S /Normal +/Pg 30 0 R +>> +endobj +1437 0 obj +<< +/A 3286 0 R +/K 18 +/P 3293 0 R +/S /Normal +/Pg 30 0 R +>> +endobj +1438 0 obj +<< +/A 972 0 R +/K 19 +/P 3294 0 R +/S /Normal +/Pg 30 0 R +>> +endobj +1439 0 obj +<< +/A 3284 0 R +/K 20 +/P 3295 0 R +/S /Normal +/Pg 30 0 R +>> +endobj +1440 0 obj +<< +/A 3284 0 R +/K 21 +/P 3296 0 R +/S /Normal +/Pg 30 0 R +>> +endobj +1441 0 obj +<< +/A 3284 0 R +/K 22 +/P 3297 0 R +/S /Normal +/Pg 30 0 R +>> +endobj +1442 0 obj +<< +/A 3298 0 R +/K 24 +/P 1057 0 R +/S /LBody +/Pg 30 0 R +>> +endobj +1443 0 obj +<< +/A 3298 0 R +/K 25 +/P 1058 0 R +/S /LBody +/Pg 30 0 R +>> +endobj +1444 0 obj +<< +/A 3298 0 R +/K 26 +/P 1059 0 R +/S /LBody +/Pg 30 0 R +>> +endobj +1445 0 obj +<< +/A 3298 0 R +/K 27 +/P 1060 0 R +/S /LBody +/Pg 30 0 R +>> +endobj +1446 0 obj +<< +/A 3299 0 R +/K 5 +/P 3300 0 R +/S /Normal +/Pg 32 0 R +>> +endobj +1447 0 obj +<< +/A 3299 0 R +/K 6 +/P 3301 0 R +/S /Normal +/Pg 32 0 R +>> +endobj +1448 0 obj +<< +/A 3299 0 R +/K 7 +/P 3302 0 R +/S /Normal +/Pg 32 0 R +>> +endobj +1449 0 obj +<< +/A 3299 0 R +/K 8 +/P 3303 0 R +/S /Normal +/Pg 32 0 R +>> +endobj +1450 0 obj +<< +/A 3299 0 R +/K 9 +/P 3304 0 R +/S /Normal +/Pg 32 0 R +>> +endobj +1451 0 obj +<< +/A 3299 0 R +/K 10 +/P 3305 0 R +/S /Normal +/Pg 32 0 R +>> +endobj +1452 0 obj +<< +/A 3299 0 R +/K 12 +/P 3306 0 R +/S /Normal +/Pg 32 0 R +>> +endobj +1453 0 obj +<< +/A 3299 0 R +/K 13 +/P 3307 0 R +/S /Normal +/Pg 32 0 R +>> +endobj +1454 0 obj +<< +/A 3299 0 R +/K 14 +/P 3308 0 R +/S /Normal +/Pg 32 0 R +>> +endobj +1455 0 obj +<< +/A 3299 0 R +/K 15 +/P 3309 0 R +/S /Normal +/Pg 32 0 R +>> +endobj +1456 0 obj +<< +/A 3299 0 R +/K 16 +/P 3310 0 R +/S /Note#20Heading +/Pg 32 0 R +>> +endobj +1457 0 obj +<< +/A 3299 0 R +/K 17 +/P 3311 0 R +/S /Note#20Heading +/Pg 32 0 R +>> +endobj +1458 0 obj +<< +/A 3299 0 R +/K 18 +/P 3312 0 R +/S /Normal +/Pg 32 0 R +>> +endobj +1459 0 obj +<< +/A 3313 0 R +/K 19 +/P 3314 0 R +/S /Normal +/Pg 32 0 R +>> +endobj +1460 0 obj +<< +/A 3299 0 R +/K 20 +/P 3315 0 R +/S /Note#20Heading +/Pg 32 0 R +>> +endobj +1461 0 obj +<< +/A 3299 0 R +/K 21 +/P 3316 0 R +/S /Note#20Heading +/Pg 32 0 R +>> +endobj +1462 0 obj +<< +/A 3299 0 R +/K 22 +/P 3317 0 R +/S /Normal +/Pg 32 0 R +>> +endobj +1463 0 obj +<< +/A 3313 0 R +/K 23 +/P 3318 0 R +/S /Normal +/Pg 32 0 R +>> +endobj +1464 0 obj +<< +/A 3299 0 R +/K 24 +/P 3319 0 R +/S /Normal +/Pg 32 0 R +>> +endobj +1465 0 obj +<< +/A 3313 0 R +/K 25 +/P 3320 0 R +/S /Normal +/Pg 32 0 R +>> +endobj +1466 0 obj +<< +/A 3299 0 R +/K 26 +/P 3321 0 R +/S /Normal +/Pg 32 0 R +>> +endobj +1467 0 obj +<< +/A 3313 0 R +/K 27 +/P 3322 0 R +/S /Normal +/Pg 32 0 R +>> +endobj +1468 0 obj +<< +/A 3313 0 R +/K 28 +/P 3322 0 R +/S /Salutation +/Pg 32 0 R +>> +endobj +1469 0 obj +<< +/A 3299 0 R +/K 29 +/P 3323 0 R +/S /Normal +/Pg 32 0 R +>> +endobj +1470 0 obj +<< +/A 3313 0 R +/K 30 +/P 3324 0 R +/S /Normal +/Pg 32 0 R +>> +endobj +1471 0 obj +<< +/A 3299 0 R +/K 31 +/P 3325 0 R +/S /Note#20Heading +/Pg 32 0 R +>> +endobj +1472 0 obj +<< +/A 3299 0 R +/K 32 +/P 3326 0 R +/S /Note#20Heading +/Pg 32 0 R +>> +endobj +1473 0 obj +<< +/A 3299 0 R +/K 33 +/P 3327 0 R +/S /Normal +/Pg 32 0 R +>> +endobj +1474 0 obj +<< +/A 3299 0 R +/K 34 +/P 3328 0 R +/S /Normal +/Pg 32 0 R +>> +endobj +1475 0 obj +<< +/A 3313 0 R +/K 35 +/P 3329 0 R +/S /Normal +/Pg 32 0 R +>> +endobj +1476 0 obj +<< +/A 3299 0 R +/K 36 +/P 3330 0 R +/S /Normal +/Pg 32 0 R +>> +endobj +1477 0 obj +<< +/A 3299 0 R +/K 37 +/P 3331 0 R +/S /Normal +/Pg 32 0 R +>> +endobj +1478 0 obj +<< +/A 3299 0 R +/K 38 +/P 3332 0 R +/S /Normal +/Pg 32 0 R +>> +endobj +1479 0 obj +<< +/A 3313 0 R +/K [39 40 41] +/P 3333 0 R +/S /Normal +/Pg 32 0 R +>> +endobj +1480 0 obj +<< +/A 3299 0 R +/K 42 +/P 3334 0 R +/S /Normal +/Pg 32 0 R +>> +endobj +1481 0 obj +<< +/A 3299 0 R +/K 43 +/P 3335 0 R +/S /Normal +/Pg 32 0 R +>> +endobj +1482 0 obj +<< +/A 3299 0 R +/K 44 +/P 3336 0 R +/S /Normal +/Pg 32 0 R +>> +endobj +1483 0 obj +<< +/A 3313 0 R +/K 45 +/P 3337 0 R +/S /Normal +/Pg 32 0 R +>> +endobj +1484 0 obj +<< +/A 3299 0 R +/K 46 +/P 3338 0 R +/S /Normal +/Pg 32 0 R +>> +endobj +1485 0 obj +<< +/A 3299 0 R +/K 47 +/P 3339 0 R +/S /Normal +/Pg 32 0 R +>> +endobj +1486 0 obj +<< +/A 3299 0 R +/K 48 +/P 3340 0 R +/S /Normal +/Pg 32 0 R +>> +endobj +1487 0 obj +<< +/A 3313 0 R +/K 49 +/P 3341 0 R +/S /Normal +/Pg 32 0 R +>> +endobj +1488 0 obj +<< +/A 3342 0 R +/K 7 +/P 1067 0 R +/S /LBody +/Pg 33 0 R +>> +endobj +1489 0 obj +<< +/A 3342 0 R +/K 8 +/P 1068 0 R +/S /LBody +/Pg 33 0 R +>> +endobj +1490 0 obj +<< +/A 3342 0 R +/K 9 +/P 1069 0 R +/S /LBody +/Pg 33 0 R +>> +endobj +1491 0 obj +<< +/A 3342 0 R +/K 10 +/P 1070 0 R +/S /LBody +/Pg 33 0 R +>> +endobj +1492 0 obj +<< +/A 3342 0 R +/K 11 +/P 1071 0 R +/S /LBody +/Pg 33 0 R +>> +endobj +1493 0 obj +<< +/A 3342 0 R +/K 12 +/P 1072 0 R +/S /LBody +/Pg 33 0 R +>> +endobj +1494 0 obj +<< +/A 3342 0 R +/K 13 +/P 1073 0 R +/S /LBody +/Pg 33 0 R +>> +endobj +1495 0 obj +<< +/A 3342 0 R +/K 14 +/P 1074 0 R +/S /LBody +/Pg 33 0 R +>> +endobj +1496 0 obj +<< +/A 3342 0 R +/K 15 +/P 1075 0 R +/S /LBody +/Pg 33 0 R +>> +endobj +1497 0 obj +<< +/A 3342 0 R +/K 16 +/P 1076 0 R +/S /LBody +/Pg 33 0 R +>> +endobj +1498 0 obj +<< +/A 3342 0 R +/K 17 +/P 1077 0 R +/S /LBody +/Pg 33 0 R +>> +endobj +1499 0 obj +<< +/A 3342 0 R +/K 18 +/P 1078 0 R +/S /LBody +/Pg 33 0 R +>> +endobj +1500 0 obj +<< +/A 3342 0 R +/K 19 +/P 1079 0 R +/S /LBody +/Pg 33 0 R +>> +endobj +1501 0 obj +<< +/A 3342 0 R +/K 20 +/P 1080 0 R +/S /LBody +/Pg 33 0 R +>> +endobj +1502 0 obj +<< +/A 3342 0 R +/K 21 +/P 1081 0 R +/S /LBody +/Pg 33 0 R +>> +endobj +1503 0 obj +<< +/A 3342 0 R +/K 22 +/P 1082 0 R +/S /LBody +/Pg 33 0 R +>> +endobj +1504 0 obj +<< +/A 3342 0 R +/K 23 +/P 1083 0 R +/S /LBody +/Pg 33 0 R +>> +endobj +1505 0 obj +<< +/A 3342 0 R +/K 24 +/P 1084 0 R +/S /LBody +/Pg 33 0 R +>> +endobj +1506 0 obj +<< +/A 3342 0 R +/K 25 +/P 1085 0 R +/S /LBody +/Pg 33 0 R +>> +endobj +1507 0 obj +<< +/A 3342 0 R +/K 26 +/P 1086 0 R +/S /LBody +/Pg 33 0 R +>> +endobj +1508 0 obj +<< +/A 3342 0 R +/K 27 +/P 1087 0 R +/S /LBody +/Pg 33 0 R +>> +endobj +1509 0 obj +<< +/A 3342 0 R +/K 28 +/P 1088 0 R +/S /LBody +/Pg 33 0 R +>> +endobj +1510 0 obj +<< +/A 3342 0 R +/K 29 +/P 1089 0 R +/S /LBody +/Pg 33 0 R +>> +endobj +1511 0 obj +<< +/A 972 0 R +/K 10 +/P 3343 0 R +/S /Normal +/Pg 34 0 R +>> +endobj +1512 0 obj +<< +/A 972 0 R +/K 11 +/P 3344 0 R +/S /Normal +/Pg 34 0 R +>> +endobj +1513 0 obj +<< +/A 972 0 R +/K 12 +/P 3345 0 R +/S /Normal +/Pg 34 0 R +>> +endobj +1514 0 obj +<< +/A 972 0 R +/K 13 +/P 3346 0 R +/S /Normal +/Pg 34 0 R +>> +endobj +1515 0 obj +<< +/A 972 0 R +/K 14 +/P 3347 0 R +/S /Normal +/Pg 34 0 R +>> +endobj +1516 0 obj +<< +/A 972 0 R +/K 15 +/P 3348 0 R +/S /Normal +/Pg 34 0 R +>> +endobj +1517 0 obj +<< +/A 972 0 R +/K 16 +/P 3349 0 R +/S /Normal +/Pg 34 0 R +>> +endobj +1518 0 obj +<< +/A 972 0 R +/K 17 +/P 3350 0 R +/S /Normal +/Pg 34 0 R +>> +endobj +1519 0 obj +<< +/A 972 0 R +/K 18 +/P 3351 0 R +/S /Normal +/Pg 34 0 R +>> +endobj +1520 0 obj +<< +/A 972 0 R +/K 19 +/P 3352 0 R +/S /Normal +/Pg 34 0 R +>> +endobj +1521 0 obj +<< +/A 972 0 R +/K 20 +/P 3353 0 R +/S /Normal +/Pg 34 0 R +>> +endobj +1522 0 obj +<< +/A 972 0 R +/K 21 +/P 3354 0 R +/S /Normal +/Pg 34 0 R +>> +endobj +1523 0 obj +<< +/A 972 0 R +/K 22 +/P 3355 0 R +/S /Normal +/Pg 34 0 R +>> +endobj +1524 0 obj +<< +/A 972 0 R +/K 23 +/P 3356 0 R +/S /Normal +/Pg 34 0 R +>> +endobj +1525 0 obj +<< +/A 972 0 R +/K 24 +/P 3357 0 R +/S /Normal +/Pg 34 0 R +>> +endobj +1526 0 obj +<< +/A 972 0 R +/K 25 +/P 3358 0 R +/S /Normal +/Pg 34 0 R +>> +endobj +1527 0 obj +<< +/A 972 0 R +/K 26 +/P 3359 0 R +/S /Normal +/Pg 34 0 R +>> +endobj +1528 0 obj +<< +/A 972 0 R +/K 27 +/P 3360 0 R +/S /Normal +/Pg 34 0 R +>> +endobj +1529 0 obj +<< +/A 972 0 R +/K 28 +/P 3361 0 R +/S /Normal +/Pg 34 0 R +>> +endobj +1530 0 obj +<< +/A 972 0 R +/K 29 +/P 3362 0 R +/S /Normal +/Pg 34 0 R +>> +endobj +1531 0 obj +<< +/A 972 0 R +/K 30 +/P 3363 0 R +/S /Normal +/Pg 34 0 R +>> +endobj +1532 0 obj +<< +/A 972 0 R +/K 32 +/P 3364 0 R +/S /Normal +/Pg 34 0 R +>> +endobj +1533 0 obj +<< +/A 972 0 R +/K 33 +/P 3365 0 R +/S /Normal +/Pg 34 0 R +>> +endobj +1534 0 obj +<< +/A 972 0 R +/K 34 +/P 3366 0 R +/S /Normal +/Pg 34 0 R +>> +endobj +1535 0 obj +<< +/A 972 0 R +/K 35 +/P 3367 0 R +/S /Normal +/Pg 34 0 R +>> +endobj +1536 0 obj +<< +/A 972 0 R +/K 36 +/P 3368 0 R +/S /Normal +/Pg 34 0 R +>> +endobj +1537 0 obj +<< +/A 972 0 R +/K 37 +/P 3369 0 R +/S /Normal +/Pg 34 0 R +>> +endobj +1538 0 obj +<< +/A 972 0 R +/K 38 +/P 3370 0 R +/S /Normal +/Pg 34 0 R +>> +endobj +1539 0 obj +<< +/A 972 0 R +/K 39 +/P 3371 0 R +/S /Normal +/Pg 34 0 R +>> +endobj +1540 0 obj +<< +/A 972 0 R +/K 40 +/P 3372 0 R +/S /Normal +/Pg 34 0 R +>> +endobj +1541 0 obj +<< +/A 972 0 R +/K 41 +/P 3373 0 R +/S /Normal +/Pg 34 0 R +>> +endobj +1542 0 obj +<< +/A 972 0 R +/K 42 +/P 3374 0 R +/S /Normal +/Pg 34 0 R +>> +endobj +1543 0 obj +<< +/A 972 0 R +/K 43 +/P 3375 0 R +/S /Normal +/Pg 34 0 R +>> +endobj +1544 0 obj +<< +/A 972 0 R +/K 44 +/P 3376 0 R +/S /Normal +/Pg 34 0 R +>> +endobj +1545 0 obj +<< +/A 972 0 R +/K 45 +/P 3377 0 R +/S /Normal +/Pg 34 0 R +>> +endobj +1546 0 obj +<< +/A 972 0 R +/K 46 +/P 3378 0 R +/S /Normal +/Pg 34 0 R +>> +endobj +1547 0 obj +<< +/A 972 0 R +/K 47 +/P 3379 0 R +/S /Normal +/Pg 34 0 R +>> +endobj +1548 0 obj +<< +/A 972 0 R +/K 48 +/P 3380 0 R +/S /Normal +/Pg 34 0 R +>> +endobj +1549 0 obj +<< +/A 972 0 R +/K 49 +/P 3381 0 R +/S /Normal +/Pg 34 0 R +>> +endobj +1550 0 obj +<< +/A 972 0 R +/K 63 +/P 3382 0 R +/S /Normal +/Pg 34 0 R +>> +endobj +1551 0 obj +<< +/A 972 0 R +/K 64 +/P 3383 0 R +/S /Normal +/Pg 34 0 R +>> +endobj +1552 0 obj +<< +/A 972 0 R +/K 65 +/P 3384 0 R +/S /Normal +/Pg 34 0 R +>> +endobj +1553 0 obj +<< +/A 972 0 R +/K 66 +/P 3385 0 R +/S /Normal +/Pg 34 0 R +>> +endobj +1554 0 obj +<< +/A 972 0 R +/K 67 +/P 3386 0 R +/S /Normal +/Pg 34 0 R +>> +endobj +1555 0 obj +<< +/A 972 0 R +/K 68 +/P 3387 0 R +/S /Normal +/Pg 34 0 R +>> +endobj +1556 0 obj +<< +/A 972 0 R +/K 69 +/P 3388 0 R +/S /Normal +/Pg 34 0 R +>> +endobj +1557 0 obj +<< +/A 972 0 R +/K 70 +/P 3389 0 R +/S /Normal +/Pg 34 0 R +>> +endobj +1558 0 obj +<< +/A 972 0 R +/K 71 +/P 3390 0 R +/S /Normal +/Pg 34 0 R +>> +endobj +1559 0 obj +<< +/A 972 0 R +/K 72 +/P 3391 0 R +/S /Normal +/Pg 34 0 R +>> +endobj +1560 0 obj +<< +/A 972 0 R +/K 73 +/P 3392 0 R +/S /Normal +/Pg 34 0 R +>> +endobj +1561 0 obj +<< +/A 972 0 R +/K 74 +/P 3393 0 R +/S /Normal +/Pg 34 0 R +>> +endobj +1562 0 obj +<< +/A 972 0 R +/K 75 +/P 3394 0 R +/S /Normal +/Pg 34 0 R +>> +endobj +1563 0 obj +<< +/A 972 0 R +/K 76 +/P 3395 0 R +/S /Normal +/Pg 34 0 R +>> +endobj +1564 0 obj +<< +/A 972 0 R +/K 77 +/P 3396 0 R +/S /Normal +/Pg 34 0 R +>> +endobj +1565 0 obj +<< +/A 972 0 R +/K 78 +/P 3397 0 R +/S /Normal +/Pg 34 0 R +>> +endobj +1566 0 obj +<< +/A 972 0 R +/K 79 +/P 3398 0 R +/S /Normal +/Pg 34 0 R +>> +endobj +1567 0 obj +<< +/A 972 0 R +/K 80 +/P 3399 0 R +/S /Normal +/Pg 34 0 R +>> +endobj +1568 0 obj +<< +/A 972 0 R +/K 81 +/P 3400 0 R +/S /Normal +/Pg 34 0 R +>> +endobj +1569 0 obj +<< +/A 972 0 R +/K 82 +/P 3401 0 R +/S /Normal +/Pg 34 0 R +>> +endobj +1570 0 obj +<< +/A 972 0 R +/K 83 +/P 3402 0 R +/S /Normal +/Pg 34 0 R +>> +endobj +1571 0 obj +<< +/A 972 0 R +/K 1 +/P 3403 0 R +/S /Normal +/Pg 35 0 R +>> +endobj +1572 0 obj +<< +/A 972 0 R +/K 2 +/P 3404 0 R +/S /Normal +/Pg 35 0 R +>> +endobj +1573 0 obj +<< +/A 972 0 R +/K 3 +/P 3405 0 R +/S /Normal +/Pg 35 0 R +>> +endobj +1574 0 obj +<< +/A 972 0 R +/K 4 +/P 3406 0 R +/S /Normal +/Pg 35 0 R +>> +endobj +1575 0 obj +<< +/A 972 0 R +/K 5 +/P 3407 0 R +/S /Normal +/Pg 35 0 R +>> +endobj +1576 0 obj +<< +/A 972 0 R +/K 6 +/P 3408 0 R +/S /Normal +/Pg 35 0 R +>> +endobj +1577 0 obj +<< +/A 972 0 R +/K 7 +/P 3409 0 R +/S /Normal +/Pg 35 0 R +>> +endobj +1578 0 obj +<< +/A 972 0 R +/K 8 +/P 3410 0 R +/S /Normal +/Pg 35 0 R +>> +endobj +1579 0 obj +<< +/A 972 0 R +/K 9 +/P 3411 0 R +/S /Normal +/Pg 35 0 R +>> +endobj +1580 0 obj +<< +/A 972 0 R +/K 10 +/P 3412 0 R +/S /Normal +/Pg 35 0 R +>> +endobj +1581 0 obj +<< +/A 972 0 R +/K 11 +/P 3413 0 R +/S /Normal +/Pg 35 0 R +>> +endobj +1582 0 obj +<< +/A 972 0 R +/K 12 +/P 3414 0 R +/S /Normal +/Pg 35 0 R +>> +endobj +1583 0 obj +<< +/A 972 0 R +/K 13 +/P 3415 0 R +/S /Normal +/Pg 35 0 R +>> +endobj +1584 0 obj +<< +/A 972 0 R +/K 14 +/P 3416 0 R +/S /Normal +/Pg 35 0 R +>> +endobj +1585 0 obj +<< +/A 972 0 R +/K 15 +/P 3417 0 R +/S /Normal +/Pg 35 0 R +>> +endobj +1586 0 obj +<< +/A 972 0 R +/K 16 +/P 3418 0 R +/S /Normal +/Pg 35 0 R +>> +endobj +1587 0 obj +<< +/A 972 0 R +/K 17 +/P 3419 0 R +/S /Normal +/Pg 35 0 R +>> +endobj +1588 0 obj +<< +/A 972 0 R +/K 18 +/P 3420 0 R +/S /Normal +/Pg 35 0 R +>> +endobj +1589 0 obj +<< +/A 972 0 R +/K 31 +/P 3421 0 R +/S /Normal +/Pg 35 0 R +>> +endobj +1590 0 obj +<< +/A 972 0 R +/K 32 +/P 3422 0 R +/S /Normal +/Pg 35 0 R +>> +endobj +1591 0 obj +<< +/A 972 0 R +/K 33 +/P 3423 0 R +/S /Normal +/Pg 35 0 R +>> +endobj +1592 0 obj +<< +/A 972 0 R +/K 34 +/P 3424 0 R +/S /Normal +/Pg 35 0 R +>> +endobj +1593 0 obj +<< +/A 972 0 R +/K 35 +/P 3425 0 R +/S /Normal +/Pg 35 0 R +>> +endobj +1594 0 obj +<< +/A 972 0 R +/K 36 +/P 3426 0 R +/S /Normal +/Pg 35 0 R +>> +endobj +1595 0 obj +<< +/A 972 0 R +/K 37 +/P 3427 0 R +/S /Normal +/Pg 35 0 R +>> +endobj +1596 0 obj +<< +/A 972 0 R +/K 38 +/P 3428 0 R +/S /Normal +/Pg 35 0 R +>> +endobj +1597 0 obj +<< +/A 972 0 R +/K 39 +/P 3429 0 R +/S /Normal +/Pg 35 0 R +>> +endobj +1598 0 obj +<< +/A 972 0 R +/K 40 +/P 3430 0 R +/S /Normal +/Pg 35 0 R +>> +endobj +1599 0 obj +<< +/A 972 0 R +/K 41 +/P 3431 0 R +/S /Normal +/Pg 35 0 R +>> +endobj +1600 0 obj +<< +/A 972 0 R +/K 42 +/P 3432 0 R +/S /Normal +/Pg 35 0 R +>> +endobj +1601 0 obj +<< +/A 972 0 R +/K 43 +/P 3433 0 R +/S /Normal +/Pg 35 0 R +>> +endobj +1602 0 obj +<< +/A 972 0 R +/K 44 +/P 3434 0 R +/S /Normal +/Pg 35 0 R +>> +endobj +1603 0 obj +<< +/A 972 0 R +/K 45 +/P 3435 0 R +/S /Normal +/Pg 35 0 R +>> +endobj +1604 0 obj +<< +/A 972 0 R +/K 46 +/P 3436 0 R +/S /Normal +/Pg 35 0 R +>> +endobj +1605 0 obj +<< +/A 972 0 R +/K 47 +/P 3437 0 R +/S /Normal +/Pg 35 0 R +>> +endobj +1606 0 obj +<< +/A 972 0 R +/K 48 +/P 3438 0 R +/S /Normal +/Pg 35 0 R +>> +endobj +1607 0 obj +<< +/A 972 0 R +/K 49 +/P 3439 0 R +/S /Normal +/Pg 35 0 R +>> +endobj +1608 0 obj +<< +/A 972 0 R +/K 50 +/P 3440 0 R +/S /Normal +/Pg 35 0 R +>> +endobj +1609 0 obj +<< +/A 972 0 R +/K 51 +/P 3441 0 R +/S /Normal +/Pg 35 0 R +>> +endobj +1610 0 obj +<< +/A 972 0 R +/K 53 +/P 3442 0 R +/S /Normal +/Pg 35 0 R +>> +endobj +1611 0 obj +<< +/A 972 0 R +/K 54 +/P 3443 0 R +/S /Normal +/Pg 35 0 R +>> +endobj +1612 0 obj +<< +/A 972 0 R +/K 55 +/P 3444 0 R +/S /Normal +/Pg 35 0 R +>> +endobj +1613 0 obj +<< +/A 972 0 R +/K 56 +/P 3445 0 R +/S /Normal +/Pg 35 0 R +>> +endobj +1614 0 obj +<< +/A 972 0 R +/K 57 +/P 3446 0 R +/S /Normal +/Pg 35 0 R +>> +endobj +1615 0 obj +<< +/A 972 0 R +/K 58 +/P 3447 0 R +/S /Normal +/Pg 35 0 R +>> +endobj +1616 0 obj +<< +/A 972 0 R +/K 59 +/P 3448 0 R +/S /Normal +/Pg 35 0 R +>> +endobj +1617 0 obj +<< +/A 972 0 R +/K 60 +/P 3449 0 R +/S /Normal +/Pg 35 0 R +>> +endobj +1618 0 obj +<< +/A 972 0 R +/K 61 +/P 3450 0 R +/S /Normal +/Pg 35 0 R +>> +endobj +1619 0 obj +<< +/A 972 0 R +/K 62 +/P 3451 0 R +/S /Normal +/Pg 35 0 R +>> +endobj +1620 0 obj +<< +/A 972 0 R +/K 63 +/P 3452 0 R +/S /Normal +/Pg 35 0 R +>> +endobj +1621 0 obj +<< +/A 972 0 R +/K 64 +/P 3453 0 R +/S /Normal +/Pg 35 0 R +>> +endobj +1622 0 obj +<< +/A 972 0 R +/K 65 +/P 3454 0 R +/S /Normal +/Pg 35 0 R +>> +endobj +1623 0 obj +<< +/A 972 0 R +/K 66 +/P 3455 0 R +/S /Normal +/Pg 35 0 R +>> +endobj +1624 0 obj +<< +/A 972 0 R +/K 67 +/P 3456 0 R +/S /Normal +/Pg 35 0 R +>> +endobj +1625 0 obj +<< +/A 972 0 R +/K 68 +/P 3457 0 R +/S /Normal +/Pg 35 0 R +>> +endobj +1626 0 obj +<< +/A 972 0 R +/K 69 +/P 3458 0 R +/S /Normal +/Pg 35 0 R +>> +endobj +1627 0 obj +<< +/A 972 0 R +/K 70 +/P 3459 0 R +/S /Normal +/Pg 35 0 R +>> +endobj +1628 0 obj +<< +/A 972 0 R +/K 84 +/P 3460 0 R +/S /Normal +/Pg 35 0 R +>> +endobj +1629 0 obj +<< +/A 972 0 R +/K 85 +/P 3461 0 R +/S /Normal +/Pg 35 0 R +>> +endobj +1630 0 obj +<< +/A 972 0 R +/K 86 +/P 3462 0 R +/S /Normal +/Pg 35 0 R +>> +endobj +1631 0 obj +<< +/A 972 0 R +/K 87 +/P 3463 0 R +/S /Normal +/Pg 35 0 R +>> +endobj +1632 0 obj +<< +/A 972 0 R +/K 88 +/P 3464 0 R +/S /Normal +/Pg 35 0 R +>> +endobj +1633 0 obj +<< +/A 972 0 R +/K 89 +/P 3465 0 R +/S /Normal +/Pg 35 0 R +>> +endobj +1634 0 obj +<< +/A 972 0 R +/K 90 +/P 3466 0 R +/S /Normal +/Pg 35 0 R +>> +endobj +1635 0 obj +<< +/A 972 0 R +/K 91 +/P 3467 0 R +/S /Normal +/Pg 35 0 R +>> +endobj +1636 0 obj +<< +/A 972 0 R +/K 92 +/P 3468 0 R +/S /Normal +/Pg 35 0 R +>> +endobj +1637 0 obj +<< +/A 972 0 R +/K 93 +/P 3469 0 R +/S /Normal +/Pg 35 0 R +>> +endobj +1638 0 obj +<< +/A 972 0 R +/K 94 +/P 3470 0 R +/S /Normal +/Pg 35 0 R +>> +endobj +1639 0 obj +<< +/A 972 0 R +/K 95 +/P 3471 0 R +/S /Normal +/Pg 35 0 R +>> +endobj +1640 0 obj +<< +/A 972 0 R +/K 96 +/P 3472 0 R +/S /Normal +/Pg 35 0 R +>> +endobj +1641 0 obj +<< +/A 972 0 R +/K 97 +/P 3473 0 R +/S /Normal +/Pg 35 0 R +>> +endobj +1642 0 obj +<< +/A 972 0 R +/K 98 +/P 3474 0 R +/S /Normal +/Pg 35 0 R +>> +endobj +1643 0 obj +<< +/A 972 0 R +/K 99 +/P 3475 0 R +/S /Normal +/Pg 35 0 R +>> +endobj +1644 0 obj +<< +/A 972 0 R +/K 100 +/P 3476 0 R +/S /Normal +/Pg 35 0 R +>> +endobj +1645 0 obj +<< +/A 972 0 R +/K 101 +/P 3477 0 R +/S /Normal +/Pg 35 0 R +>> +endobj +1646 0 obj +<< +/A 972 0 R +/K 102 +/P 3478 0 R +/S /Normal +/Pg 35 0 R +>> +endobj +1647 0 obj +<< +/A 972 0 R +/K 103 +/P 3479 0 R +/S /Normal +/Pg 35 0 R +>> +endobj +1648 0 obj +<< +/A 972 0 R +/K 104 +/P 3480 0 R +/S /Normal +/Pg 35 0 R +>> +endobj +1649 0 obj +<< +/A 972 0 R +/K 105 +/P 3481 0 R +/S /Normal +/Pg 35 0 R +>> +endobj +1650 0 obj +<< +/A 972 0 R +/K 106 +/P 3482 0 R +/S /Normal +/Pg 35 0 R +>> +endobj +1651 0 obj +<< +/A 972 0 R +/K 107 +/P 3483 0 R +/S /Normal +/Pg 35 0 R +>> +endobj +1652 0 obj +<< +/A 972 0 R +/K 1 +/P 3484 0 R +/S /Normal +/Pg 36 0 R +>> +endobj +1653 0 obj +<< +/A 972 0 R +/K 2 +/P 3485 0 R +/S /Normal +/Pg 36 0 R +>> +endobj +1654 0 obj +<< +/A 972 0 R +/K 3 +/P 3486 0 R +/S /Normal +/Pg 36 0 R +>> +endobj +1655 0 obj +<< +/A 972 0 R +/K 4 +/P 3487 0 R +/S /Normal +/Pg 36 0 R +>> +endobj +1656 0 obj +<< +/A 972 0 R +/K 5 +/P 3488 0 R +/S /Normal +/Pg 36 0 R +>> +endobj +1657 0 obj +<< +/A 972 0 R +/K 6 +/P 3489 0 R +/S /Normal +/Pg 36 0 R +>> +endobj +1658 0 obj +<< +/A 972 0 R +/K 7 +/P 3490 0 R +/S /Normal +/Pg 36 0 R +>> +endobj +1659 0 obj +<< +/A 972 0 R +/K 8 +/P 3491 0 R +/S /Normal +/Pg 36 0 R +>> +endobj +1660 0 obj +<< +/A 972 0 R +/K 9 +/P 3492 0 R +/S /Normal +/Pg 36 0 R +>> +endobj +1661 0 obj +<< +/A 972 0 R +/K 10 +/P 3493 0 R +/S /Normal +/Pg 36 0 R +>> +endobj +1662 0 obj +<< +/A 972 0 R +/K 11 +/P 3494 0 R +/S /Normal +/Pg 36 0 R +>> +endobj +1663 0 obj +<< +/A 972 0 R +/K 12 +/P 3495 0 R +/S /Normal +/Pg 36 0 R +>> +endobj +1664 0 obj +<< +/A 972 0 R +/K 13 +/P 3496 0 R +/S /Normal +/Pg 36 0 R +>> +endobj +1665 0 obj +<< +/A 972 0 R +/K 14 +/P 3497 0 R +/S /Normal +/Pg 36 0 R +>> +endobj +1666 0 obj +<< +/A 972 0 R +/K 15 +/P 3498 0 R +/S /Normal +/Pg 36 0 R +>> +endobj +1667 0 obj +<< +/A 972 0 R +/K 16 +/P 3499 0 R +/S /Normal +/Pg 36 0 R +>> +endobj +1668 0 obj +<< +/A 972 0 R +/K 17 +/P 3500 0 R +/S /Normal +/Pg 36 0 R +>> +endobj +1669 0 obj +<< +/A 972 0 R +/K 18 +/P 3501 0 R +/S /Normal +/Pg 36 0 R +>> +endobj +1670 0 obj +<< +/A 972 0 R +/K 28 +/P 3502 0 R +/S /Normal +/Pg 36 0 R +>> +endobj +1671 0 obj +<< +/A 972 0 R +/K 29 +/P 3503 0 R +/S /Normal +/Pg 36 0 R +>> +endobj +1672 0 obj +<< +/A 972 0 R +/K 30 +/P 3504 0 R +/S /Normal +/Pg 36 0 R +>> +endobj +1673 0 obj +<< +/A 972 0 R +/K 31 +/P 3505 0 R +/S /Normal +/Pg 36 0 R +>> +endobj +1674 0 obj +<< +/A 972 0 R +/K 32 +/P 3506 0 R +/S /Normal +/Pg 36 0 R +>> +endobj +1675 0 obj +<< +/A 973 0 R +/K 33 +/P 3507 0 R +/S /Normal +/Pg 36 0 R +>> +endobj +1676 0 obj +<< +/A 972 0 R +/K 34 +/P 3508 0 R +/S /Normal +/Pg 36 0 R +>> +endobj +1677 0 obj +<< +/A 972 0 R +/K 35 +/P 3509 0 R +/S /Normal +/Pg 36 0 R +>> +endobj +1678 0 obj +<< +/A 973 0 R +/K 36 +/P 3510 0 R +/S /Normal +/Pg 36 0 R +>> +endobj +1679 0 obj +<< +/A 972 0 R +/K 37 +/P 3511 0 R +/S /Normal +/Pg 36 0 R +>> +endobj +1680 0 obj +<< +/A 972 0 R +/K 38 +/P 3512 0 R +/S /Normal +/Pg 36 0 R +>> +endobj +1681 0 obj +<< +/A 973 0 R +/K 39 +/P 3513 0 R +/S /Normal +/Pg 36 0 R +>> +endobj +1682 0 obj +<< +/A 972 0 R +/K 47 +/P 3514 0 R +/S /Normal +/Pg 36 0 R +>> +endobj +1683 0 obj +<< +/A 972 0 R +/K 48 +/P 3515 0 R +/S /Normal +/Pg 36 0 R +>> +endobj +1684 0 obj +<< +/A 972 0 R +/K 49 +/P 3516 0 R +/S /Normal +/Pg 36 0 R +>> +endobj +1685 0 obj +<< +/A 972 0 R +/K 50 +/P 3517 0 R +/S /Normal +/Pg 36 0 R +>> +endobj +1686 0 obj +<< +/A 972 0 R +/K 51 +/P 3518 0 R +/S /Normal +/Pg 36 0 R +>> +endobj +1687 0 obj +<< +/A 972 0 R +/K 52 +/P 3519 0 R +/S /Normal +/Pg 36 0 R +>> +endobj +1688 0 obj +<< +/A 972 0 R +/K 53 +/P 3520 0 R +/S /Normal +/Pg 36 0 R +>> +endobj +1689 0 obj +<< +/A 972 0 R +/K 54 +/P 3521 0 R +/S /Normal +/Pg 36 0 R +>> +endobj +1690 0 obj +<< +/A 972 0 R +/K 55 +/P 3522 0 R +/S /Normal +/Pg 36 0 R +>> +endobj +1691 0 obj +<< +/A 972 0 R +/K 56 +/P 3523 0 R +/S /Normal +/Pg 36 0 R +>> +endobj +1692 0 obj +<< +/A 972 0 R +/K 57 +/P 3524 0 R +/S /Normal +/Pg 36 0 R +>> +endobj +1693 0 obj +<< +/A 972 0 R +/K 58 +/P 3525 0 R +/S /Normal +/Pg 36 0 R +>> +endobj +1694 0 obj +<< +/A 972 0 R +/K 59 +/P 3526 0 R +/S /Normal +/Pg 36 0 R +>> +endobj +1695 0 obj +<< +/A 972 0 R +/K 60 +/P 3527 0 R +/S /Normal +/Pg 36 0 R +>> +endobj +1696 0 obj +<< +/A 972 0 R +/K 61 +/P 3528 0 R +/S /Normal +/Pg 36 0 R +>> +endobj +1697 0 obj +<< +/A 972 0 R +/K 62 +/P 3529 0 R +/S /Normal +/Pg 36 0 R +>> +endobj +1698 0 obj +<< +/A 972 0 R +/K 63 +/P 3530 0 R +/S /Normal +/Pg 36 0 R +>> +endobj +1699 0 obj +<< +/A 972 0 R +/K 64 +/P 3531 0 R +/S /Normal +/Pg 36 0 R +>> +endobj +1700 0 obj +<< +/A 972 0 R +/K 66 +/P 3532 0 R +/S /Normal +/Pg 36 0 R +>> +endobj +1701 0 obj +<< +/A 972 0 R +/K 67 +/P 3533 0 R +/S /Normal +/Pg 36 0 R +>> +endobj +1702 0 obj +<< +/A 972 0 R +/K 68 +/P 3534 0 R +/S /Normal +/Pg 36 0 R +>> +endobj +1703 0 obj +<< +/A 972 0 R +/K 69 +/P 3535 0 R +/S /Normal +/Pg 36 0 R +>> +endobj +1704 0 obj +<< +/A 972 0 R +/K 70 +/P 3536 0 R +/S /Normal +/Pg 36 0 R +>> +endobj +1705 0 obj +<< +/A 972 0 R +/K 71 +/P 3537 0 R +/S /Normal +/Pg 36 0 R +>> +endobj +1706 0 obj +<< +/A 972 0 R +/K 72 +/P 3538 0 R +/S /Normal +/Pg 36 0 R +>> +endobj +1707 0 obj +<< +/A 972 0 R +/K 73 +/P 3539 0 R +/S /Normal +/Pg 36 0 R +>> +endobj +1708 0 obj +<< +/A 972 0 R +/K 74 +/P 3540 0 R +/S /Normal +/Pg 36 0 R +>> +endobj +1709 0 obj +<< +/A 972 0 R +/K 75 +/P 3541 0 R +/S /Normal +/Pg 36 0 R +>> +endobj +1710 0 obj +<< +/A 972 0 R +/K 76 +/P 3542 0 R +/S /Normal +/Pg 36 0 R +>> +endobj +1711 0 obj +<< +/A 972 0 R +/K 77 +/P 3543 0 R +/S /Normal +/Pg 36 0 R +>> +endobj +1712 0 obj +<< +/A 972 0 R +/K 78 +/P 3544 0 R +/S /Normal +/Pg 36 0 R +>> +endobj +1713 0 obj +<< +/A 972 0 R +/K 79 +/P 3545 0 R +/S /Normal +/Pg 36 0 R +>> +endobj +1714 0 obj +<< +/A 972 0 R +/K 80 +/P 3546 0 R +/S /Normal +/Pg 36 0 R +>> +endobj +1715 0 obj +<< +/A 972 0 R +/K 81 +/P 3547 0 R +/S /Normal +/Pg 36 0 R +>> +endobj +1716 0 obj +<< +/A 972 0 R +/K 82 +/P 3548 0 R +/S /Normal +/Pg 36 0 R +>> +endobj +1717 0 obj +<< +/A 972 0 R +/K 83 +/P 3549 0 R +/S /Normal +/Pg 36 0 R +>> +endobj +1718 0 obj +<< +/A 972 0 R +/K 84 +/P 3550 0 R +/S /Normal +/Pg 36 0 R +>> +endobj +1719 0 obj +<< +/A 972 0 R +/K 85 +/P 3551 0 R +/S /Normal +/Pg 36 0 R +>> +endobj +1720 0 obj +<< +/A 972 0 R +/K 86 +/P 3552 0 R +/S /Normal +/Pg 36 0 R +>> +endobj +1721 0 obj +<< +/A 3553 0 R +/K 1 +/P 3554 0 R +/S /Normal +/Pg 37 0 R +>> +endobj +1722 0 obj +<< +/A 972 0 R +/K 2 +/P 3555 0 R +/S /Normal +/Pg 37 0 R +>> +endobj +1723 0 obj +<< +/A 972 0 R +/K [3 4] +/P 3556 0 R +/S /Normal +/Pg 37 0 R +>> +endobj +1724 0 obj +<< +/A 972 0 R +/K 5 +/P 3557 0 R +/S /Normal +/Pg 37 0 R +>> +endobj +1725 0 obj +<< +/A 972 0 R +/K 6 +/P 3558 0 R +/S /Normal +/Pg 37 0 R +>> +endobj +1726 0 obj +<< +/A 973 0 R +/K 7 +/P 3559 0 R +/S /Normal +/Pg 37 0 R +>> +endobj +1727 0 obj +<< +/A 972 0 R +/K 8 +/P 3560 0 R +/S /Normal +/Pg 37 0 R +>> +endobj +1728 0 obj +<< +/A 972 0 R +/K 9 +/P 3561 0 R +/S /Normal +/Pg 37 0 R +>> +endobj +1729 0 obj +<< +/A 972 0 R +/K 10 +/P 3562 0 R +/S /Normal +/Pg 37 0 R +>> +endobj +1730 0 obj +<< +/A 973 0 R +/K 11 +/P 3563 0 R +/S /Normal +/Pg 37 0 R +>> +endobj +1731 0 obj +<< +/A 972 0 R +/K 12 +/P 3564 0 R +/S /Normal +/Pg 37 0 R +>> +endobj +1732 0 obj +<< +/A 972 0 R +/K 13 +/P 3565 0 R +/S /Normal +/Pg 37 0 R +>> +endobj +1733 0 obj +<< +/A 972 0 R +/K 14 +/P 3566 0 R +/S /Normal +/Pg 37 0 R +>> +endobj +1734 0 obj +<< +/A 973 0 R +/K 15 +/P 3567 0 R +/S /Normal +/Pg 37 0 R +>> +endobj +1735 0 obj +<< +/A 972 0 R +/K 16 +/P 3568 0 R +/S /Normal +/Pg 37 0 R +>> +endobj +1736 0 obj +<< +/A 972 0 R +/K 17 +/P 3569 0 R +/S /Normal +/Pg 37 0 R +>> +endobj +1737 0 obj +<< +/A 972 0 R +/K 18 +/P 3570 0 R +/S /Normal +/Pg 37 0 R +>> +endobj +1738 0 obj +<< +/A 973 0 R +/K 19 +/P 3571 0 R +/S /Normal +/Pg 37 0 R +>> +endobj +1739 0 obj +<< +/A 972 0 R +/K 20 +/P 3572 0 R +/S /Normal +/Pg 37 0 R +>> +endobj +1740 0 obj +<< +/A 972 0 R +/K 21 +/P 3573 0 R +/S /Normal +/Pg 37 0 R +>> +endobj +1741 0 obj +<< +/A 972 0 R +/K 22 +/P 3574 0 R +/S /Normal +/Pg 37 0 R +>> +endobj +1742 0 obj +<< +/A 973 0 R +/K 23 +/P 3575 0 R +/S /Normal +/Pg 37 0 R +>> +endobj +1743 0 obj +<< +/A 972 0 R +/K 24 +/P 3576 0 R +/S /Normal +/Pg 37 0 R +>> +endobj +1744 0 obj +<< +/A 972 0 R +/K 25 +/P 3577 0 R +/S /Normal +/Pg 37 0 R +>> +endobj +1745 0 obj +<< +/A 972 0 R +/K 26 +/P 3578 0 R +/S /Normal +/Pg 37 0 R +>> +endobj +1746 0 obj +<< +/A 973 0 R +/K 27 +/P 3579 0 R +/S /Normal +/Pg 37 0 R +>> +endobj +1747 0 obj +<< +/A 972 0 R +/K 28 +/P 3580 0 R +/S /Normal +/Pg 37 0 R +>> +endobj +1748 0 obj +<< +/A 972 0 R +/K 29 +/P 3581 0 R +/S /Normal +/Pg 37 0 R +>> +endobj +1749 0 obj +<< +/A 972 0 R +/K 30 +/P 3582 0 R +/S /Normal +/Pg 37 0 R +>> +endobj +1750 0 obj +<< +/A 973 0 R +/K 31 +/P 3583 0 R +/S /Normal +/Pg 37 0 R +>> +endobj +1751 0 obj +<< +/A 972 0 R +/K 32 +/P 3584 0 R +/S /Normal +/Pg 37 0 R +>> +endobj +1752 0 obj +<< +/A 972 0 R +/K 33 +/P 3585 0 R +/S /Normal +/Pg 37 0 R +>> +endobj +1753 0 obj +<< +/A 972 0 R +/K 45 +/P 3586 0 R +/S /Normal +/Pg 37 0 R +>> +endobj +1754 0 obj +<< +/A 972 0 R +/K 46 +/P 3587 0 R +/S /Normal +/Pg 37 0 R +>> +endobj +1755 0 obj +<< +/A 972 0 R +/K 47 +/P 3588 0 R +/S /Normal +/Pg 37 0 R +>> +endobj +1756 0 obj +<< +/A 972 0 R +/K 48 +/P 3589 0 R +/S /Normal +/Pg 37 0 R +>> +endobj +1757 0 obj +<< +/A 972 0 R +/K 49 +/P 3590 0 R +/S /Normal +/Pg 37 0 R +>> +endobj +1758 0 obj +<< +/A 972 0 R +/K 50 +/P 3591 0 R +/S /Normal +/Pg 37 0 R +>> +endobj +1759 0 obj +<< +/A 972 0 R +/K 51 +/P 3592 0 R +/S /Normal +/Pg 37 0 R +>> +endobj +1760 0 obj +<< +/A 972 0 R +/K 52 +/P 3593 0 R +/S /Normal +/Pg 37 0 R +>> +endobj +1761 0 obj +<< +/A 972 0 R +/K 53 +/P 3594 0 R +/S /Normal +/Pg 37 0 R +>> +endobj +1762 0 obj +<< +/A 972 0 R +/K 54 +/P 3595 0 R +/S /Normal +/Pg 37 0 R +>> +endobj +1763 0 obj +<< +/A 972 0 R +/K 55 +/P 3596 0 R +/S /Normal +/Pg 37 0 R +>> +endobj +1764 0 obj +<< +/A 972 0 R +/K 56 +/P 3597 0 R +/S /Normal +/Pg 37 0 R +>> +endobj +1765 0 obj +<< +/A 972 0 R +/K 57 +/P 3598 0 R +/S /Normal +/Pg 37 0 R +>> +endobj +1766 0 obj +<< +/A 972 0 R +/K 58 +/P 3599 0 R +/S /Normal +/Pg 37 0 R +>> +endobj +1767 0 obj +<< +/A 972 0 R +/K 59 +/P 3600 0 R +/S /Normal +/Pg 37 0 R +>> +endobj +1768 0 obj +<< +/A 972 0 R +/K 60 +/P 3601 0 R +/S /Normal +/Pg 37 0 R +>> +endobj +1769 0 obj +<< +/A 972 0 R +/K 61 +/P 3602 0 R +/S /Normal +/Pg 37 0 R +>> +endobj +1770 0 obj +<< +/A 972 0 R +/K 62 +/P 3603 0 R +/S /Normal +/Pg 37 0 R +>> +endobj +1771 0 obj +<< +/A 972 0 R +/K 63 +/P 3604 0 R +/S /Normal +/Pg 37 0 R +>> +endobj +1772 0 obj +<< +/A 972 0 R +/K 64 +/P 3605 0 R +/S /Normal +/Pg 37 0 R +>> +endobj +1773 0 obj +<< +/A 972 0 R +/K 65 +/P 3606 0 R +/S /Normal +/Pg 37 0 R +>> +endobj +1774 0 obj +<< +/A 972 0 R +/K 67 +/P 3607 0 R +/S /Normal +/Pg 37 0 R +>> +endobj +1775 0 obj +<< +/A 972 0 R +/K 68 +/P 3608 0 R +/S /Normal +/Pg 37 0 R +>> +endobj +1776 0 obj +<< +/A 972 0 R +/K 69 +/P 3609 0 R +/S /Normal +/Pg 37 0 R +>> +endobj +1777 0 obj +<< +/A 972 0 R +/K 70 +/P 3610 0 R +/S /Normal +/Pg 37 0 R +>> +endobj +1778 0 obj +<< +/A 972 0 R +/K 71 +/P 3611 0 R +/S /Normal +/Pg 37 0 R +>> +endobj +1779 0 obj +<< +/A 972 0 R +/K 72 +/P 3612 0 R +/S /Normal +/Pg 37 0 R +>> +endobj +1780 0 obj +<< +/A 972 0 R +/K 73 +/P 3613 0 R +/S /Normal +/Pg 37 0 R +>> +endobj +1781 0 obj +<< +/A 972 0 R +/K 74 +/P 3614 0 R +/S /Normal +/Pg 37 0 R +>> +endobj +1782 0 obj +<< +/A 972 0 R +/K 75 +/P 3615 0 R +/S /Normal +/Pg 37 0 R +>> +endobj +1783 0 obj +<< +/A 972 0 R +/K 76 +/P 3616 0 R +/S /Normal +/Pg 37 0 R +>> +endobj +1784 0 obj +<< +/A 972 0 R +/K 77 +/P 3617 0 R +/S /Normal +/Pg 37 0 R +>> +endobj +1785 0 obj +<< +/A 972 0 R +/K 78 +/P 3618 0 R +/S /Normal +/Pg 37 0 R +>> +endobj +1786 0 obj +<< +/A 972 0 R +/K 79 +/P 3619 0 R +/S /Normal +/Pg 37 0 R +>> +endobj +1787 0 obj +<< +/A 972 0 R +/K 80 +/P 3620 0 R +/S /Normal +/Pg 37 0 R +>> +endobj +1788 0 obj +<< +/A 972 0 R +/K 81 +/P 3621 0 R +/S /Normal +/Pg 37 0 R +>> +endobj +1789 0 obj +<< +/A 972 0 R +/K 82 +/P 3622 0 R +/S /Normal +/Pg 37 0 R +>> +endobj +1790 0 obj +<< +/A 972 0 R +/K 83 +/P 3623 0 R +/S /Normal +/Pg 37 0 R +>> +endobj +1791 0 obj +<< +/A 972 0 R +/K 84 +/P 3624 0 R +/S /Normal +/Pg 37 0 R +>> +endobj +1792 0 obj +<< +/A 972 0 R +/K 85 +/P 3625 0 R +/S /Normal +/Pg 37 0 R +>> +endobj +1793 0 obj +<< +/A 972 0 R +/K 86 +/P 3626 0 R +/S /Normal +/Pg 37 0 R +>> +endobj +1794 0 obj +<< +/A 972 0 R +/K 87 +/P 3627 0 R +/S /Normal +/Pg 37 0 R +>> +endobj +1795 0 obj +<< +/A 972 0 R +/K 92 +/P 3628 0 R +/S /Normal +/Pg 37 0 R +>> +endobj +1796 0 obj +<< +/A 973 0 R +/K 93 +/P 3629 0 R +/S /Normal +/Pg 37 0 R +>> +endobj +1797 0 obj +<< +/A 972 0 R +/K 94 +/P 3630 0 R +/S /Normal +/Pg 37 0 R +>> +endobj +1798 0 obj +<< +/A 972 0 R +/K 95 +/P 3631 0 R +/S /Normal +/Pg 37 0 R +>> +endobj +1799 0 obj +<< +/A 972 0 R +/K 96 +/P 3632 0 R +/S /Normal +/Pg 37 0 R +>> +endobj +1800 0 obj +<< +/A 972 0 R +/K 97 +/P 3633 0 R +/S /Normal +/Pg 37 0 R +>> +endobj +1801 0 obj +<< +/A 972 0 R +/K 98 +/P 3634 0 R +/S /Normal +/Pg 37 0 R +>> +endobj +1802 0 obj +<< +/A 972 0 R +/K 99 +/P 3635 0 R +/S /Normal +/Pg 37 0 R +>> +endobj +1803 0 obj +<< +/A 972 0 R +/K 100 +/P 3636 0 R +/S /Normal +/Pg 37 0 R +>> +endobj +1804 0 obj +<< +/A 972 0 R +/K 101 +/P 3637 0 R +/S /Normal +/Pg 37 0 R +>> +endobj +1805 0 obj +<< +/A 972 0 R +/K 102 +/P 3638 0 R +/S /Normal +/Pg 37 0 R +>> +endobj +1806 0 obj +<< +/A 972 0 R +/K 103 +/P 3639 0 R +/S /Normal +/Pg 37 0 R +>> +endobj +1807 0 obj +<< +/A 972 0 R +/K 104 +/P 3639 0 R +/S /Normal +/Pg 37 0 R +>> +endobj +1808 0 obj +<< +/A 972 0 R +/K 105 +/P 3640 0 R +/S /Normal +/Pg 37 0 R +>> +endobj +1809 0 obj +<< +/A 972 0 R +/K 106 +/P 3641 0 R +/S /Normal +/Pg 37 0 R +>> +endobj +1810 0 obj +<< +/A 972 0 R +/K 107 +/P 3642 0 R +/S /Normal +/Pg 37 0 R +>> +endobj +1811 0 obj +<< +/A 972 0 R +/K 108 +/P 3643 0 R +/S /Normal +/Pg 37 0 R +>> +endobj +1812 0 obj +<< +/A 972 0 R +/K 109 +/P 3644 0 R +/S /Normal +/Pg 37 0 R +>> +endobj +1813 0 obj +<< +/A 972 0 R +/K 110 +/P 3645 0 R +/S /Normal +/Pg 37 0 R +>> +endobj +1814 0 obj +<< +/A 972 0 R +/K 111 +/P 3646 0 R +/S /Normal +/Pg 37 0 R +>> +endobj +1815 0 obj +<< +/A 972 0 R +/K 112 +/P 3647 0 R +/S /Normal +/Pg 37 0 R +>> +endobj +1816 0 obj +<< +/A 972 0 R +/K 113 +/P 3648 0 R +/S /Normal +/Pg 37 0 R +>> +endobj +1817 0 obj +<< +/A 972 0 R +/K 114 +/P 3649 0 R +/S /Normal +/Pg 37 0 R +>> +endobj +1818 0 obj +<< +/A 972 0 R +/K 115 +/P 3650 0 R +/S /Normal +/Pg 37 0 R +>> +endobj +1819 0 obj +<< +/A 972 0 R +/K 116 +/P 3651 0 R +/S /Normal +/Pg 37 0 R +>> +endobj +1820 0 obj +<< +/A 972 0 R +/K 117 +/P 3652 0 R +/S /Normal +/Pg 37 0 R +>> +endobj +1821 0 obj +<< +/A 972 0 R +/K 118 +/P 3653 0 R +/S /Normal +/Pg 37 0 R +>> +endobj +1822 0 obj +<< +/A 972 0 R +/K 119 +/P 3654 0 R +/S /Normal +/Pg 37 0 R +>> +endobj +1823 0 obj +<< +/A 972 0 R +/K 120 +/P 3655 0 R +/S /Normal +/Pg 37 0 R +>> +endobj +1824 0 obj +<< +/A 972 0 R +/K 121 +/P 3656 0 R +/S /Normal +/Pg 37 0 R +>> +endobj +1825 0 obj +<< +/A 972 0 R +/K 122 +/P 3657 0 R +/S /Normal +/Pg 37 0 R +>> +endobj +1826 0 obj +<< +/A 972 0 R +/K 123 +/P 3658 0 R +/S /Normal +/Pg 37 0 R +>> +endobj +1827 0 obj +<< +/A 972 0 R +/K 124 +/P 3658 0 R +/S /Normal +/Pg 37 0 R +>> +endobj +1828 0 obj +<< +/A 972 0 R +/K 125 +/P 3659 0 R +/S /Normal +/Pg 37 0 R +>> +endobj +1829 0 obj +<< +/A 972 0 R +/K 126 +/P 3660 0 R +/S /Normal +/Pg 37 0 R +>> +endobj +1830 0 obj +<< +/A 972 0 R +/K 127 +/P 3661 0 R +/S /Normal +/Pg 37 0 R +>> +endobj +1831 0 obj +<< +/A 972 0 R +/K 128 +/P 3662 0 R +/S /Normal +/Pg 37 0 R +>> +endobj +1832 0 obj +<< +/A 972 0 R +/K 129 +/P 3663 0 R +/S /Normal +/Pg 37 0 R +>> +endobj +1833 0 obj +<< +/A 972 0 R +/K 130 +/P 3664 0 R +/S /Normal +/Pg 37 0 R +>> +endobj +1834 0 obj +<< +/A 972 0 R +/K 131 +/P 3665 0 R +/S /Normal +/Pg 37 0 R +>> +endobj +1835 0 obj +<< +/A 972 0 R +/K 132 +/P 3666 0 R +/S /Normal +/Pg 37 0 R +>> +endobj +1836 0 obj +<< +/A 972 0 R +/K 133 +/P 3667 0 R +/S /Normal +/Pg 37 0 R +>> +endobj +1837 0 obj +<< +/A 972 0 R +/K 134 +/P 3668 0 R +/S /Normal +/Pg 37 0 R +>> +endobj +1838 0 obj +<< +/A 972 0 R +/K 135 +/P 3669 0 R +/S /Normal +/Pg 37 0 R +>> +endobj +1839 0 obj +<< +/A 972 0 R +/K 136 +/P 3670 0 R +/S /Normal +/Pg 37 0 R +>> +endobj +1840 0 obj +<< +/A 972 0 R +/K 137 +/P 3671 0 R +/S /Normal +/Pg 37 0 R +>> +endobj +1841 0 obj +<< +/A 972 0 R +/K 138 +/P 3672 0 R +/S /Normal +/Pg 37 0 R +>> +endobj +1842 0 obj +<< +/A 972 0 R +/K 139 +/P 3673 0 R +/S /Normal +/Pg 37 0 R +>> +endobj +1843 0 obj +<< +/A 972 0 R +/K 140 +/P 3674 0 R +/S /Normal +/Pg 37 0 R +>> +endobj +1844 0 obj +<< +/A 972 0 R +/K 141 +/P 3675 0 R +/S /Normal +/Pg 37 0 R +>> +endobj +1845 0 obj +<< +/A 972 0 R +/K 142 +/P 3676 0 R +/S /Normal +/Pg 37 0 R +>> +endobj +1846 0 obj +<< +/A 972 0 R +/K 143 +/P 3677 0 R +/S /Normal +/Pg 37 0 R +>> +endobj +1847 0 obj +<< +/A 972 0 R +/K 144 +/P 3678 0 R +/S /Normal +/Pg 37 0 R +>> +endobj +1848 0 obj +<< +/A 972 0 R +/K 145 +/P 3679 0 R +/S /Normal +/Pg 37 0 R +>> +endobj +1849 0 obj +<< +/A 972 0 R +/K 146 +/P 3680 0 R +/S /Normal +/Pg 37 0 R +>> +endobj +1850 0 obj +<< +/A 972 0 R +/K 147 +/P 3680 0 R +/S /Normal +/Pg 37 0 R +>> +endobj +1851 0 obj +<< +/A 972 0 R +/K 148 +/P 3681 0 R +/S /Normal +/Pg 37 0 R +>> +endobj +1852 0 obj +<< +/A 972 0 R +/K 149 +/P 3682 0 R +/S /Normal +/Pg 37 0 R +>> +endobj +1853 0 obj +<< +/A 972 0 R +/K 150 +/P 3683 0 R +/S /Normal +/Pg 37 0 R +>> +endobj +1854 0 obj +<< +/A 972 0 R +/K 151 +/P 3684 0 R +/S /Normal +/Pg 37 0 R +>> +endobj +1855 0 obj +<< +/A 972 0 R +/K 152 +/P 3685 0 R +/S /Normal +/Pg 37 0 R +>> +endobj +1856 0 obj +<< +/A 972 0 R +/K 153 +/P 3686 0 R +/S /Normal +/Pg 37 0 R +>> +endobj +1857 0 obj +<< +/A 972 0 R +/K 154 +/P 3687 0 R +/S /Normal +/Pg 37 0 R +>> +endobj +1858 0 obj +<< +/A 972 0 R +/K 155 +/P 3688 0 R +/S /Normal +/Pg 37 0 R +>> +endobj +1859 0 obj +<< +/A 972 0 R +/K 156 +/P 3689 0 R +/S /Normal +/Pg 37 0 R +>> +endobj +1860 0 obj +<< +/A 973 0 R +/K 157 +/P 3690 0 R +/S /Normal +/Pg 37 0 R +>> +endobj +1861 0 obj +<< +/A 972 0 R +/K 11 +/P 3691 0 R +/S /Note#20Heading +/Pg 38 0 R +>> +endobj +1862 0 obj +<< +/A 972 0 R +/K 12 +/P 3692 0 R +/S /Normal +/Pg 38 0 R +>> +endobj +1863 0 obj +<< +/A 972 0 R +/K 13 +/P 3693 0 R +/S /Normal +/Pg 38 0 R +>> +endobj +1864 0 obj +<< +/A 972 0 R +/K 14 +/P 3694 0 R +/S /Note#20Heading +/Pg 38 0 R +>> +endobj +1865 0 obj +<< +/A 972 0 R +/K 15 +/P 3695 0 R +/S /Normal +/Pg 38 0 R +>> +endobj +1866 0 obj +<< +/A 972 0 R +/K 16 +/P 3696 0 R +/S /Normal +/Pg 38 0 R +>> +endobj +1867 0 obj +<< +/A 972 0 R +/K 17 +/P 3697 0 R +/S /Normal +/Pg 38 0 R +>> +endobj +1868 0 obj +<< +/A 972 0 R +/K 18 +/P 3698 0 R +/S /Normal +/Pg 38 0 R +>> +endobj +1869 0 obj +<< +/A 972 0 R +/K 19 +/P 3699 0 R +/S /Normal +/Pg 38 0 R +>> +endobj +1870 0 obj +<< +/A 972 0 R +/K 20 +/P 3700 0 R +/S /Normal +/Pg 38 0 R +>> +endobj +1871 0 obj +<< +/A 972 0 R +/K 21 +/P 3701 0 R +/S /Normal +/Pg 38 0 R +>> +endobj +1872 0 obj +<< +/A 972 0 R +/K 22 +/P 3702 0 R +/S /Normal +/Pg 38 0 R +>> +endobj +1873 0 obj +<< +/A 972 0 R +/K 23 +/P 3703 0 R +/S /Normal +/Pg 38 0 R +>> +endobj +1874 0 obj +<< +/A 972 0 R +/K 24 +/P 3704 0 R +/S /Normal +/Pg 38 0 R +>> +endobj +1875 0 obj +<< +/A 972 0 R +/K 25 +/P 3705 0 R +/S /Normal +/Pg 38 0 R +>> +endobj +1876 0 obj +<< +/A 972 0 R +/K 26 +/P 3706 0 R +/S /Normal +/Pg 38 0 R +>> +endobj +1877 0 obj +<< +/A 972 0 R +/K 27 +/P 3707 0 R +/S /Normal +/Pg 38 0 R +>> +endobj +1878 0 obj +<< +/A 972 0 R +/K 28 +/P 3708 0 R +/S /Normal +/Pg 38 0 R +>> +endobj +1879 0 obj +<< +/A 972 0 R +/K 30 +/P 3709 0 R +/S /Normal +/Pg 38 0 R +>> +endobj +1880 0 obj +<< +/A 972 0 R +/K 31 +/P 3710 0 R +/S /Normal +/Pg 38 0 R +>> +endobj +1881 0 obj +<< +/A 972 0 R +/K 32 +/P 3711 0 R +/S /Normal +/Pg 38 0 R +>> +endobj +1882 0 obj +<< +/A 972 0 R +/K 33 +/P 3712 0 R +/S /Normal +/Pg 38 0 R +>> +endobj +1883 0 obj +<< +/A 972 0 R +/K 34 +/P 3713 0 R +/S /Normal +/Pg 38 0 R +>> +endobj +1884 0 obj +<< +/A 972 0 R +/K 35 +/P 3714 0 R +/S /Normal +/Pg 38 0 R +>> +endobj +1885 0 obj +<< +/A 972 0 R +/K 36 +/P 3715 0 R +/S /Normal +/Pg 38 0 R +>> +endobj +1886 0 obj +<< +/A 972 0 R +/K 37 +/P 3716 0 R +/S /Normal +/Pg 38 0 R +>> +endobj +1887 0 obj +<< +/A 972 0 R +/K 38 +/P 3717 0 R +/S /Normal +/Pg 38 0 R +>> +endobj +1888 0 obj +<< +/A 972 0 R +/K 39 +/P 3718 0 R +/S /Normal +/Pg 38 0 R +>> +endobj +1889 0 obj +<< +/A 972 0 R +/K 40 +/P 3719 0 R +/S /Normal +/Pg 38 0 R +>> +endobj +1890 0 obj +<< +/A 972 0 R +/K 41 +/P 3720 0 R +/S /Normal +/Pg 38 0 R +>> +endobj +1891 0 obj +<< +/A 972 0 R +/K 42 +/P 3721 0 R +/S /Normal +/Pg 38 0 R +>> +endobj +1892 0 obj +<< +/A 972 0 R +/K 43 +/P 3722 0 R +/S /Normal +/Pg 38 0 R +>> +endobj +1893 0 obj +<< +/A 972 0 R +/K 44 +/P 3723 0 R +/S /Normal +/Pg 38 0 R +>> +endobj +1894 0 obj +<< +/A 972 0 R +/K 45 +/P 3724 0 R +/S /Normal +/Pg 38 0 R +>> +endobj +1895 0 obj +<< +/A 972 0 R +/K 46 +/P 3725 0 R +/S /Normal +/Pg 38 0 R +>> +endobj +1896 0 obj +<< +/A 972 0 R +/K 47 +/P 3726 0 R +/S /Normal +/Pg 38 0 R +>> +endobj +1897 0 obj +<< +/A 972 0 R +/K 48 +/P 3727 0 R +/S /Normal +/Pg 38 0 R +>> +endobj +1898 0 obj +<< +/A 972 0 R +/K 49 +/P 3728 0 R +/S /Normal +/Pg 38 0 R +>> +endobj +1899 0 obj +<< +/A 972 0 R +/K 50 +/P 3729 0 R +/S /Normal +/Pg 38 0 R +>> +endobj +1900 0 obj +<< +/A 972 0 R +/K 64 +/P 3730 0 R +/S /Normal +/Pg 38 0 R +>> +endobj +1901 0 obj +<< +/A 972 0 R +/K 65 +/P 3731 0 R +/S /Normal +/Pg 38 0 R +>> +endobj +1902 0 obj +<< +/A 972 0 R +/K 66 +/P 3732 0 R +/S /Normal +/Pg 38 0 R +>> +endobj +1903 0 obj +<< +/A 972 0 R +/K 67 +/P 3733 0 R +/S /Normal +/Pg 38 0 R +>> +endobj +1904 0 obj +<< +/A 972 0 R +/K 68 +/P 3734 0 R +/S /Normal +/Pg 38 0 R +>> +endobj +1905 0 obj +<< +/A 972 0 R +/K 69 +/P 3735 0 R +/S /Normal +/Pg 38 0 R +>> +endobj +1906 0 obj +<< +/A 972 0 R +/K 70 +/P 3736 0 R +/S /Normal +/Pg 38 0 R +>> +endobj +1907 0 obj +<< +/A 972 0 R +/K 71 +/P 3737 0 R +/S /Normal +/Pg 38 0 R +>> +endobj +1908 0 obj +<< +/A 972 0 R +/K 72 +/P 3738 0 R +/S /Normal +/Pg 38 0 R +>> +endobj +1909 0 obj +<< +/A 972 0 R +/K 73 +/P 3739 0 R +/S /Normal +/Pg 38 0 R +>> +endobj +1910 0 obj +<< +/A 972 0 R +/K 74 +/P 3740 0 R +/S /Normal +/Pg 38 0 R +>> +endobj +1911 0 obj +<< +/A 972 0 R +/K 75 +/P 3741 0 R +/S /Normal +/Pg 38 0 R +>> +endobj +1912 0 obj +<< +/A 972 0 R +/K 76 +/P 3742 0 R +/S /Normal +/Pg 38 0 R +>> +endobj +1913 0 obj +<< +/A 972 0 R +/K 77 +/P 3743 0 R +/S /Normal +/Pg 38 0 R +>> +endobj +1914 0 obj +<< +/A 972 0 R +/K 78 +/P 3744 0 R +/S /Normal +/Pg 38 0 R +>> +endobj +1915 0 obj +<< +/A 972 0 R +/K 79 +/P 3745 0 R +/S /Normal +/Pg 38 0 R +>> +endobj +1916 0 obj +<< +/A 972 0 R +/K 80 +/P 3746 0 R +/S /Normal +/Pg 38 0 R +>> +endobj +1917 0 obj +<< +/A 972 0 R +/K 81 +/P 3747 0 R +/S /Normal +/Pg 38 0 R +>> +endobj +1918 0 obj +<< +/A 972 0 R +/K 83 +/P 3748 0 R +/S /Normal +/Pg 38 0 R +>> +endobj +1919 0 obj +<< +/A 972 0 R +/K 84 +/P 3749 0 R +/S /Normal +/Pg 38 0 R +>> +endobj +1920 0 obj +<< +/A 972 0 R +/K 85 +/P 3750 0 R +/S /Normal +/Pg 38 0 R +>> +endobj +1921 0 obj +<< +/A 972 0 R +/K 86 +/P 3751 0 R +/S /Normal +/Pg 38 0 R +>> +endobj +1922 0 obj +<< +/A 972 0 R +/K 87 +/P 3752 0 R +/S /Normal +/Pg 38 0 R +>> +endobj +1923 0 obj +<< +/A 972 0 R +/K 88 +/P 3753 0 R +/S /Normal +/Pg 38 0 R +>> +endobj +1924 0 obj +<< +/A 972 0 R +/K 89 +/P 3754 0 R +/S /Normal +/Pg 38 0 R +>> +endobj +1925 0 obj +<< +/A 972 0 R +/K 90 +/P 3755 0 R +/S /Normal +/Pg 38 0 R +>> +endobj +1926 0 obj +<< +/A 972 0 R +/K 91 +/P 3756 0 R +/S /Normal +/Pg 38 0 R +>> +endobj +1927 0 obj +<< +/A 972 0 R +/K 92 +/P 3757 0 R +/S /Normal +/Pg 38 0 R +>> +endobj +1928 0 obj +<< +/A 972 0 R +/K 93 +/P 3758 0 R +/S /Normal +/Pg 38 0 R +>> +endobj +1929 0 obj +<< +/A 972 0 R +/K 94 +/P 3759 0 R +/S /Normal +/Pg 38 0 R +>> +endobj +1930 0 obj +<< +/A 972 0 R +/K 0 +/P 3760 0 R +/S /Normal +/Pg 39 0 R +>> +endobj +1931 0 obj +<< +/A 972 0 R +/K 1 +/P 3761 0 R +/S /Normal +/Pg 39 0 R +>> +endobj +1932 0 obj +<< +/A 972 0 R +/K 2 +/P 3762 0 R +/S /Normal +/Pg 39 0 R +>> +endobj +1933 0 obj +<< +/A 972 0 R +/K 3 +/P 3763 0 R +/S /Normal +/Pg 39 0 R +>> +endobj +1934 0 obj +<< +/A 972 0 R +/K 4 +/P 3764 0 R +/S /Normal +/Pg 39 0 R +>> +endobj +1935 0 obj +<< +/A 972 0 R +/K 5 +/P 3765 0 R +/S /Normal +/Pg 39 0 R +>> +endobj +1936 0 obj +<< +/A 972 0 R +/K 22 +/P 3766 0 R +/S /Normal +/Pg 39 0 R +>> +endobj +1937 0 obj +<< +/A 972 0 R +/K 23 +/P 3767 0 R +/S /Normal +/Pg 39 0 R +>> +endobj +1938 0 obj +<< +/A 972 0 R +/K 24 +/P 3768 0 R +/S /Normal +/Pg 39 0 R +>> +endobj +1939 0 obj +<< +/A 972 0 R +/K 25 +/P 3769 0 R +/S /Normal +/Pg 39 0 R +>> +endobj +1940 0 obj +<< +/A 972 0 R +/K 26 +/P 3770 0 R +/S /Normal +/Pg 39 0 R +>> +endobj +1941 0 obj +<< +/A 972 0 R +/K 27 +/P 3771 0 R +/S /Normal +/Pg 39 0 R +>> +endobj +1942 0 obj +<< +/A 972 0 R +/K 28 +/P 3772 0 R +/S /Normal +/Pg 39 0 R +>> +endobj +1943 0 obj +<< +/A 972 0 R +/K 29 +/P 3773 0 R +/S /Normal +/Pg 39 0 R +>> +endobj +1944 0 obj +<< +/A 972 0 R +/K 30 +/P 3774 0 R +/S /Normal +/Pg 39 0 R +>> +endobj +1945 0 obj +<< +/A 972 0 R +/K 31 +/P 3775 0 R +/S /Normal +/Pg 39 0 R +>> +endobj +1946 0 obj +<< +/A 972 0 R +/K 32 +/P 3776 0 R +/S /Normal +/Pg 39 0 R +>> +endobj +1947 0 obj +<< +/A 972 0 R +/K 33 +/P 3777 0 R +/S /Normal +/Pg 39 0 R +>> +endobj +1948 0 obj +<< +/A 972 0 R +/K 34 +/P 3778 0 R +/S /Normal +/Pg 39 0 R +>> +endobj +1949 0 obj +<< +/A 972 0 R +/K 35 +/P 3779 0 R +/S /Normal +/Pg 39 0 R +>> +endobj +1950 0 obj +<< +/A 972 0 R +/K 36 +/P 3780 0 R +/S /Normal +/Pg 39 0 R +>> +endobj +1951 0 obj +<< +/A 972 0 R +/K 37 +/P 3781 0 R +/S /Normal +/Pg 39 0 R +>> +endobj +1952 0 obj +<< +/A 972 0 R +/K 38 +/P 3782 0 R +/S /Normal +/Pg 39 0 R +>> +endobj +1953 0 obj +<< +/A 972 0 R +/K 39 +/P 3783 0 R +/S /Normal +/Pg 39 0 R +>> +endobj +1954 0 obj +<< +/A 972 0 R +/K 41 +/P 3784 0 R +/S /Normal +/Pg 39 0 R +>> +endobj +1955 0 obj +<< +/A 972 0 R +/K 42 +/P 3785 0 R +/S /Normal +/Pg 39 0 R +>> +endobj +1956 0 obj +<< +/A 972 0 R +/K 43 +/P 3786 0 R +/S /Normal +/Pg 39 0 R +>> +endobj +1957 0 obj +<< +/A 972 0 R +/K 44 +/P 3787 0 R +/S /Normal +/Pg 39 0 R +>> +endobj +1958 0 obj +<< +/A 972 0 R +/K 45 +/P 3788 0 R +/S /Normal +/Pg 39 0 R +>> +endobj +1959 0 obj +<< +/A 972 0 R +/K 46 +/P 3789 0 R +/S /Normal +/Pg 39 0 R +>> +endobj +1960 0 obj +<< +/A 972 0 R +/K 47 +/P 3790 0 R +/S /Normal +/Pg 39 0 R +>> +endobj +1961 0 obj +<< +/A 972 0 R +/K 48 +/P 3791 0 R +/S /Normal +/Pg 39 0 R +>> +endobj +1962 0 obj +<< +/A 972 0 R +/K 49 +/P 3792 0 R +/S /Normal +/Pg 39 0 R +>> +endobj +1963 0 obj +<< +/A 972 0 R +/K 50 +/P 3793 0 R +/S /Normal +/Pg 39 0 R +>> +endobj +1964 0 obj +<< +/A 972 0 R +/K 51 +/P 3794 0 R +/S /Normal +/Pg 39 0 R +>> +endobj +1965 0 obj +<< +/A 972 0 R +/K 52 +/P 3795 0 R +/S /Normal +/Pg 39 0 R +>> +endobj +1966 0 obj +<< +/A 972 0 R +/K 53 +/P 3796 0 R +/S /Normal +/Pg 39 0 R +>> +endobj +1967 0 obj +<< +/A 972 0 R +/K 54 +/P 3797 0 R +/S /Normal +/Pg 39 0 R +>> +endobj +1968 0 obj +<< +/A 972 0 R +/K 55 +/P 3798 0 R +/S /Normal +/Pg 39 0 R +>> +endobj +1969 0 obj +<< +/A 972 0 R +/K 56 +/P 3799 0 R +/S /Normal +/Pg 39 0 R +>> +endobj +1970 0 obj +<< +/A 972 0 R +/K 57 +/P 3800 0 R +/S /Normal +/Pg 39 0 R +>> +endobj +1971 0 obj +<< +/A 972 0 R +/K 58 +/P 3801 0 R +/S /Normal +/Pg 39 0 R +>> +endobj +1972 0 obj +<< +/A 972 0 R +/K 60 +/P 3802 0 R +/S /Normal +/Pg 39 0 R +>> +endobj +1973 0 obj +<< +/A 972 0 R +/K 61 +/P 3803 0 R +/S /Normal +/Pg 39 0 R +>> +endobj +1974 0 obj +<< +/A 972 0 R +/K 62 +/P 3804 0 R +/S /Normal +/Pg 39 0 R +>> +endobj +1975 0 obj +<< +/A 972 0 R +/K 63 +/P 3805 0 R +/S /Normal +/Pg 39 0 R +>> +endobj +1976 0 obj +<< +/A 972 0 R +/K 64 +/P 3806 0 R +/S /Normal +/Pg 39 0 R +>> +endobj +1977 0 obj +<< +/A 972 0 R +/K 65 +/P 3807 0 R +/S /Normal +/Pg 39 0 R +>> +endobj +1978 0 obj +<< +/A 972 0 R +/K 66 +/P 3808 0 R +/S /Normal +/Pg 39 0 R +>> +endobj +1979 0 obj +<< +/A 972 0 R +/K 67 +/P 3809 0 R +/S /Normal +/Pg 39 0 R +>> +endobj +1980 0 obj +<< +/A 972 0 R +/K 68 +/P 3810 0 R +/S /Normal +/Pg 39 0 R +>> +endobj +1981 0 obj +<< +/A 972 0 R +/K 69 +/P 3811 0 R +/S /Normal +/Pg 39 0 R +>> +endobj +1982 0 obj +<< +/A 972 0 R +/K 70 +/P 3812 0 R +/S /Normal +/Pg 39 0 R +>> +endobj +1983 0 obj +<< +/A 972 0 R +/K 71 +/P 3813 0 R +/S /Normal +/Pg 39 0 R +>> +endobj +1984 0 obj +<< +/A 972 0 R +/K 72 +/P 3814 0 R +/S /Normal +/Pg 39 0 R +>> +endobj +1985 0 obj +<< +/A 972 0 R +/K 73 +/P 3815 0 R +/S /Normal +/Pg 39 0 R +>> +endobj +1986 0 obj +<< +/A 972 0 R +/K 74 +/P 3816 0 R +/S /Normal +/Pg 39 0 R +>> +endobj +1987 0 obj +<< +/A 972 0 R +/K 75 +/P 3817 0 R +/S /Normal +/Pg 39 0 R +>> +endobj +1988 0 obj +<< +/A 972 0 R +/K 76 +/P 3818 0 R +/S /Normal +/Pg 39 0 R +>> +endobj +1989 0 obj +<< +/A 972 0 R +/K 77 +/P 3819 0 R +/S /Normal +/Pg 39 0 R +>> +endobj +1990 0 obj +<< +/A 972 0 R +/K 79 +/P 3820 0 R +/S /Normal +/Pg 39 0 R +>> +endobj +1991 0 obj +<< +/A 972 0 R +/K 80 +/P 3821 0 R +/S /Normal +/Pg 39 0 R +>> +endobj +1992 0 obj +<< +/A 972 0 R +/K 81 +/P 3822 0 R +/S /Normal +/Pg 39 0 R +>> +endobj +1993 0 obj +<< +/A 972 0 R +/K 82 +/P 3823 0 R +/S /Normal +/Pg 39 0 R +>> +endobj +1994 0 obj +<< +/A 972 0 R +/K 83 +/P 3824 0 R +/S /Normal +/Pg 39 0 R +>> +endobj +1995 0 obj +<< +/A 972 0 R +/K 84 +/P 3825 0 R +/S /Normal +/Pg 39 0 R +>> +endobj +1996 0 obj +<< +/A 972 0 R +/K 85 +/P 3826 0 R +/S /Normal +/Pg 39 0 R +>> +endobj +1997 0 obj +<< +/A 972 0 R +/K 86 +/P 3827 0 R +/S /Normal +/Pg 39 0 R +>> +endobj +1998 0 obj +<< +/A 972 0 R +/K 87 +/P 3828 0 R +/S /Normal +/Pg 39 0 R +>> +endobj +1999 0 obj +<< +/A 972 0 R +/K 88 +/P 3829 0 R +/S /Normal +/Pg 39 0 R +>> +endobj +2000 0 obj +<< +/A 972 0 R +/K 89 +/P 3830 0 R +/S /Normal +/Pg 39 0 R +>> +endobj +2001 0 obj +<< +/A 972 0 R +/K 90 +/P 3831 0 R +/S /Normal +/Pg 39 0 R +>> +endobj +2002 0 obj +<< +/A 972 0 R +/K 91 +/P 3832 0 R +/S /Normal +/Pg 39 0 R +>> +endobj +2003 0 obj +<< +/A 972 0 R +/K 92 +/P 3833 0 R +/S /Normal +/Pg 39 0 R +>> +endobj +2004 0 obj +<< +/A 972 0 R +/K 93 +/P 3834 0 R +/S /Normal +/Pg 39 0 R +>> +endobj +2005 0 obj +<< +/A 972 0 R +/K 94 +/P 3835 0 R +/S /Normal +/Pg 39 0 R +>> +endobj +2006 0 obj +<< +/A 972 0 R +/K 95 +/P 3836 0 R +/S /Normal +/Pg 39 0 R +>> +endobj +2007 0 obj +<< +/A 972 0 R +/K 96 +/P 3837 0 R +/S /Normal +/Pg 39 0 R +>> +endobj +2008 0 obj +<< +/A 972 0 R +/K 7 +/P 3838 0 R +/S /Normal +/Pg 40 0 R +>> +endobj +2009 0 obj +<< +/A 972 0 R +/K 8 +/P 3839 0 R +/S /Normal +/Pg 40 0 R +>> +endobj +2010 0 obj +<< +/A 972 0 R +/K 9 +/P 3840 0 R +/S /Normal +/Pg 40 0 R +>> +endobj +2011 0 obj +<< +/A 972 0 R +/K 10 +/P 3841 0 R +/S /Normal +/Pg 40 0 R +>> +endobj +2012 0 obj +<< +/A 972 0 R +/K 11 +/P 3842 0 R +/S /Normal +/Pg 40 0 R +>> +endobj +2013 0 obj +<< +/A 972 0 R +/K 12 +/P 3843 0 R +/S /Normal +/Pg 40 0 R +>> +endobj +2014 0 obj +<< +/A 972 0 R +/K 13 +/P 3844 0 R +/S /Normal +/Pg 40 0 R +>> +endobj +2015 0 obj +<< +/A 972 0 R +/K 14 +/P 3845 0 R +/S /Normal +/Pg 40 0 R +>> +endobj +2016 0 obj +<< +/A 972 0 R +/K 15 +/P 3846 0 R +/S /Normal +/Pg 40 0 R +>> +endobj +2017 0 obj +<< +/A 972 0 R +/K 16 +/P 3847 0 R +/S /Normal +/Pg 40 0 R +>> +endobj +2018 0 obj +<< +/A 972 0 R +/K 17 +/P 3848 0 R +/S /Normal +/Pg 40 0 R +>> +endobj +2019 0 obj +<< +/A 972 0 R +/K 18 +/P 3849 0 R +/S /Normal +/Pg 40 0 R +>> +endobj +2020 0 obj +<< +/A 972 0 R +/K 19 +/P 3850 0 R +/S /Normal +/Pg 40 0 R +>> +endobj +2021 0 obj +<< +/A 972 0 R +/K 20 +/P 3851 0 R +/S /Normal +/Pg 40 0 R +>> +endobj +2022 0 obj +<< +/A 972 0 R +/K 21 +/P 3852 0 R +/S /Normal +/Pg 40 0 R +>> +endobj +2023 0 obj +<< +/A 972 0 R +/K 22 +/P 3853 0 R +/S /Normal +/Pg 40 0 R +>> +endobj +2024 0 obj +<< +/A 972 0 R +/K 23 +/P 3854 0 R +/S /Normal +/Pg 40 0 R +>> +endobj +2025 0 obj +<< +/A 972 0 R +/K 24 +/P 3855 0 R +/S /Normal +/Pg 40 0 R +>> +endobj +2026 0 obj +<< +/A 972 0 R +/K 26 +/P 3856 0 R +/S /Normal +/Pg 40 0 R +>> +endobj +2027 0 obj +<< +/A 972 0 R +/K 27 +/P 3857 0 R +/S /Normal +/Pg 40 0 R +>> +endobj +2028 0 obj +<< +/A 972 0 R +/K 28 +/P 3858 0 R +/S /Normal +/Pg 40 0 R +>> +endobj +2029 0 obj +<< +/A 972 0 R +/K 29 +/P 3859 0 R +/S /Normal +/Pg 40 0 R +>> +endobj +2030 0 obj +<< +/A 972 0 R +/K 30 +/P 3860 0 R +/S /Normal +/Pg 40 0 R +>> +endobj +2031 0 obj +<< +/A 972 0 R +/K 31 +/P 3861 0 R +/S /Normal +/Pg 40 0 R +>> +endobj +2032 0 obj +<< +/A 972 0 R +/K 32 +/P 3862 0 R +/S /Normal +/Pg 40 0 R +>> +endobj +2033 0 obj +<< +/A 972 0 R +/K 33 +/P 3863 0 R +/S /Normal +/Pg 40 0 R +>> +endobj +2034 0 obj +<< +/A 972 0 R +/K 34 +/P 3864 0 R +/S /Normal +/Pg 40 0 R +>> +endobj +2035 0 obj +<< +/A 972 0 R +/K 35 +/P 3865 0 R +/S /Normal +/Pg 40 0 R +>> +endobj +2036 0 obj +<< +/A 972 0 R +/K 36 +/P 3866 0 R +/S /Normal +/Pg 40 0 R +>> +endobj +2037 0 obj +<< +/A 972 0 R +/K 37 +/P 3867 0 R +/S /Normal +/Pg 40 0 R +>> +endobj +2038 0 obj +<< +/A 972 0 R +/K 38 +/P 3868 0 R +/S /Normal +/Pg 40 0 R +>> +endobj +2039 0 obj +<< +/A 972 0 R +/K 39 +/P 3869 0 R +/S /Normal +/Pg 40 0 R +>> +endobj +2040 0 obj +<< +/A 972 0 R +/K 40 +/P 3870 0 R +/S /Normal +/Pg 40 0 R +>> +endobj +2041 0 obj +<< +/A 972 0 R +/K 41 +/P 3871 0 R +/S /Normal +/Pg 40 0 R +>> +endobj +2042 0 obj +<< +/A 972 0 R +/K 42 +/P 3872 0 R +/S /Normal +/Pg 40 0 R +>> +endobj +2043 0 obj +<< +/A 972 0 R +/K 43 +/P 3873 0 R +/S /Normal +/Pg 40 0 R +>> +endobj +2044 0 obj +<< +/A 972 0 R +/K 45 +/P 3874 0 R +/S /Normal +/Pg 40 0 R +>> +endobj +2045 0 obj +<< +/A 972 0 R +/K 46 +/P 3875 0 R +/S /Normal +/Pg 40 0 R +>> +endobj +2046 0 obj +<< +/A 972 0 R +/K 47 +/P 3876 0 R +/S /Normal +/Pg 40 0 R +>> +endobj +2047 0 obj +<< +/A 972 0 R +/K 48 +/P 3877 0 R +/S /Normal +/Pg 40 0 R +>> +endobj +2048 0 obj +<< +/A 972 0 R +/K 49 +/P 3878 0 R +/S /Normal +/Pg 40 0 R +>> +endobj +2049 0 obj +<< +/A 972 0 R +/K 50 +/P 3879 0 R +/S /Normal +/Pg 40 0 R +>> +endobj +2050 0 obj +<< +/A 972 0 R +/K 51 +/P 3880 0 R +/S /Normal +/Pg 40 0 R +>> +endobj +2051 0 obj +<< +/A 972 0 R +/K 52 +/P 3881 0 R +/S /Normal +/Pg 40 0 R +>> +endobj +2052 0 obj +<< +/A 972 0 R +/K 53 +/P 3882 0 R +/S /Normal +/Pg 40 0 R +>> +endobj +2053 0 obj +<< +/A 972 0 R +/K 54 +/P 3883 0 R +/S /Normal +/Pg 40 0 R +>> +endobj +2054 0 obj +<< +/A 972 0 R +/K 55 +/P 3884 0 R +/S /Normal +/Pg 40 0 R +>> +endobj +2055 0 obj +<< +/A 972 0 R +/K 56 +/P 3885 0 R +/S /Normal +/Pg 40 0 R +>> +endobj +2056 0 obj +<< +/A 972 0 R +/K 57 +/P 3886 0 R +/S /Normal +/Pg 40 0 R +>> +endobj +2057 0 obj +<< +/A 972 0 R +/K 58 +/P 3887 0 R +/S /Normal +/Pg 40 0 R +>> +endobj +2058 0 obj +<< +/A 972 0 R +/K 59 +/P 3888 0 R +/S /Normal +/Pg 40 0 R +>> +endobj +2059 0 obj +<< +/A 972 0 R +/K 60 +/P 3889 0 R +/S /Normal +/Pg 40 0 R +>> +endobj +2060 0 obj +<< +/A 972 0 R +/K 61 +/P 3890 0 R +/S /Normal +/Pg 40 0 R +>> +endobj +2061 0 obj +<< +/A 972 0 R +/K 62 +/P 3891 0 R +/S /Normal +/Pg 40 0 R +>> +endobj +2062 0 obj +<< +/A 972 0 R +/K 64 +/P 3892 0 R +/S /Normal +/Pg 40 0 R +>> +endobj +2063 0 obj +<< +/A 972 0 R +/K 65 +/P 3893 0 R +/S /Normal +/Pg 40 0 R +>> +endobj +2064 0 obj +<< +/A 972 0 R +/K 66 +/P 3894 0 R +/S /Normal +/Pg 40 0 R +>> +endobj +2065 0 obj +<< +/A 972 0 R +/K 67 +/P 3895 0 R +/S /Normal +/Pg 40 0 R +>> +endobj +2066 0 obj +<< +/A 972 0 R +/K 68 +/P 3896 0 R +/S /Normal +/Pg 40 0 R +>> +endobj +2067 0 obj +<< +/A 972 0 R +/K 69 +/P 3897 0 R +/S /Normal +/Pg 40 0 R +>> +endobj +2068 0 obj +<< +/A 972 0 R +/K 70 +/P 3898 0 R +/S /Normal +/Pg 40 0 R +>> +endobj +2069 0 obj +<< +/A 972 0 R +/K 71 +/P 3899 0 R +/S /Normal +/Pg 40 0 R +>> +endobj +2070 0 obj +<< +/A 972 0 R +/K 72 +/P 3900 0 R +/S /Normal +/Pg 40 0 R +>> +endobj +2071 0 obj +<< +/A 972 0 R +/K 73 +/P 3901 0 R +/S /Normal +/Pg 40 0 R +>> +endobj +2072 0 obj +<< +/A 972 0 R +/K 74 +/P 3902 0 R +/S /Normal +/Pg 40 0 R +>> +endobj +2073 0 obj +<< +/A 972 0 R +/K 75 +/P 3903 0 R +/S /Normal +/Pg 40 0 R +>> +endobj +2074 0 obj +<< +/A 972 0 R +/K 76 +/P 3904 0 R +/S /Normal +/Pg 40 0 R +>> +endobj +2075 0 obj +<< +/A 972 0 R +/K 77 +/P 3905 0 R +/S /Normal +/Pg 40 0 R +>> +endobj +2076 0 obj +<< +/A 972 0 R +/K 78 +/P 3906 0 R +/S /Normal +/Pg 40 0 R +>> +endobj +2077 0 obj +<< +/A 972 0 R +/K 79 +/P 3907 0 R +/S /Normal +/Pg 40 0 R +>> +endobj +2078 0 obj +<< +/A 972 0 R +/K 80 +/P 3908 0 R +/S /Normal +/Pg 40 0 R +>> +endobj +2079 0 obj +<< +/A 972 0 R +/K 81 +/P 3909 0 R +/S /Normal +/Pg 40 0 R +>> +endobj +2080 0 obj +<< +/A 972 0 R +/K 0 +/P 3910 0 R +/S /Normal +/Pg 41 0 R +>> +endobj +2081 0 obj +<< +/A 972 0 R +/K 1 +/P 3911 0 R +/S /Normal +/Pg 41 0 R +>> +endobj +2082 0 obj +<< +/A 972 0 R +/K 2 +/P 3912 0 R +/S /Normal +/Pg 41 0 R +>> +endobj +2083 0 obj +<< +/A 972 0 R +/K 3 +/P 3913 0 R +/S /Normal +/Pg 41 0 R +>> +endobj +2084 0 obj +<< +/A 972 0 R +/K 4 +/P 3914 0 R +/S /Normal +/Pg 41 0 R +>> +endobj +2085 0 obj +<< +/A 972 0 R +/K 5 +/P 3915 0 R +/S /Normal +/Pg 41 0 R +>> +endobj +2086 0 obj +<< +/A 972 0 R +/K 6 +/P 3916 0 R +/S /Normal +/Pg 41 0 R +>> +endobj +2087 0 obj +<< +/A 972 0 R +/K 7 +/P 3917 0 R +/S /Normal +/Pg 41 0 R +>> +endobj +2088 0 obj +<< +/A 972 0 R +/K 8 +/P 3918 0 R +/S /Normal +/Pg 41 0 R +>> +endobj +2089 0 obj +<< +/A 972 0 R +/K 9 +/P 3919 0 R +/S /Normal +/Pg 41 0 R +>> +endobj +2090 0 obj +<< +/A 972 0 R +/K 10 +/P 3920 0 R +/S /Normal +/Pg 41 0 R +>> +endobj +2091 0 obj +<< +/A 972 0 R +/K 11 +/P 3921 0 R +/S /Normal +/Pg 41 0 R +>> +endobj +2092 0 obj +<< +/A 972 0 R +/K 12 +/P 3922 0 R +/S /Normal +/Pg 41 0 R +>> +endobj +2093 0 obj +<< +/A 972 0 R +/K 13 +/P 3923 0 R +/S /Normal +/Pg 41 0 R +>> +endobj +2094 0 obj +<< +/A 972 0 R +/K 14 +/P 3924 0 R +/S /Normal +/Pg 41 0 R +>> +endobj +2095 0 obj +<< +/A 972 0 R +/K 15 +/P 3925 0 R +/S /Normal +/Pg 41 0 R +>> +endobj +2096 0 obj +<< +/A 972 0 R +/K 16 +/P 3926 0 R +/S /Normal +/Pg 41 0 R +>> +endobj +2097 0 obj +<< +/A 972 0 R +/K 17 +/P 3927 0 R +/S /Normal +/Pg 41 0 R +>> +endobj +2098 0 obj +<< +/A 972 0 R +/K 18 +/P 3928 0 R +/S /Normal +/Pg 41 0 R +>> +endobj +2099 0 obj +<< +/A 972 0 R +/K 19 +/P 3929 0 R +/S /Normal +/Pg 41 0 R +>> +endobj +2100 0 obj +<< +/A 972 0 R +/K 20 +/P 3930 0 R +/S /Normal +/Pg 41 0 R +>> +endobj +2101 0 obj +<< +/A 972 0 R +/K 23 +/P 3931 0 R +/S /Normal +/Pg 41 0 R +>> +endobj +2102 0 obj +<< +/A 972 0 R +/K 24 +/P 3932 0 R +/S /Normal +/Pg 41 0 R +>> +endobj +2103 0 obj +<< +/A 972 0 R +/K 25 +/P 3933 0 R +/S /Normal +/Pg 41 0 R +>> +endobj +2104 0 obj +<< +/A 972 0 R +/K 26 +/P 3934 0 R +/S /Normal +/Pg 41 0 R +>> +endobj +2105 0 obj +<< +/A 972 0 R +/K 27 +/P 3935 0 R +/S /Normal +/Pg 41 0 R +>> +endobj +2106 0 obj +<< +/A 972 0 R +/K 28 +/P 3936 0 R +/S /Normal +/Pg 41 0 R +>> +endobj +2107 0 obj +<< +/A 972 0 R +/K 29 +/P 3937 0 R +/S /Normal +/Pg 41 0 R +>> +endobj +2108 0 obj +<< +/A 972 0 R +/K 30 +/P 3938 0 R +/S /Normal +/Pg 41 0 R +>> +endobj +2109 0 obj +<< +/A 972 0 R +/K 31 +/P 3939 0 R +/S /Normal +/Pg 41 0 R +>> +endobj +2110 0 obj +<< +/A 972 0 R +/K 32 +/P 3940 0 R +/S /Normal +/Pg 41 0 R +>> +endobj +2111 0 obj +<< +/A 972 0 R +/K 33 +/P 3941 0 R +/S /Normal +/Pg 41 0 R +>> +endobj +2112 0 obj +<< +/A 972 0 R +/K 34 +/P 3942 0 R +/S /Normal +/Pg 41 0 R +>> +endobj +2113 0 obj +<< +/A 972 0 R +/K 35 +/P 3943 0 R +/S /Normal +/Pg 41 0 R +>> +endobj +2114 0 obj +<< +/A 972 0 R +/K 36 +/P 3944 0 R +/S /Normal +/Pg 41 0 R +>> +endobj +2115 0 obj +<< +/A 972 0 R +/K 37 +/P 3945 0 R +/S /Normal +/Pg 41 0 R +>> +endobj +2116 0 obj +<< +/A 972 0 R +/K 38 +/P 3946 0 R +/S /Normal +/Pg 41 0 R +>> +endobj +2117 0 obj +<< +/A 972 0 R +/K 39 +/P 3947 0 R +/S /Normal +/Pg 41 0 R +>> +endobj +2118 0 obj +<< +/A 972 0 R +/K 40 +/P 3948 0 R +/S /Normal +/Pg 41 0 R +>> +endobj +2119 0 obj +<< +/A 972 0 R +/K 56 +/P 3949 0 R +/S /Normal +/Pg 41 0 R +>> +endobj +2120 0 obj +<< +/A 972 0 R +/K 57 +/P 3950 0 R +/S /Normal +/Pg 41 0 R +>> +endobj +2121 0 obj +<< +/A 972 0 R +/K 58 +/P 3951 0 R +/S /Normal +/Pg 41 0 R +>> +endobj +2122 0 obj +<< +/A 972 0 R +/K 59 +/P 3952 0 R +/S /Normal +/Pg 41 0 R +>> +endobj +2123 0 obj +<< +/A 972 0 R +/K 60 +/P 3953 0 R +/S /Normal +/Pg 41 0 R +>> +endobj +2124 0 obj +<< +/A 972 0 R +/K 61 +/P 3954 0 R +/S /Normal +/Pg 41 0 R +>> +endobj +2125 0 obj +<< +/A 972 0 R +/K 62 +/P 3955 0 R +/S /Normal +/Pg 41 0 R +>> +endobj +2126 0 obj +<< +/A 972 0 R +/K 63 +/P 3956 0 R +/S /Normal +/Pg 41 0 R +>> +endobj +2127 0 obj +<< +/A 972 0 R +/K 64 +/P 3957 0 R +/S /Normal +/Pg 41 0 R +>> +endobj +2128 0 obj +<< +/A 972 0 R +/K 65 +/P 3958 0 R +/S /Normal +/Pg 41 0 R +>> +endobj +2129 0 obj +<< +/A 972 0 R +/K 66 +/P 3959 0 R +/S /Normal +/Pg 41 0 R +>> +endobj +2130 0 obj +<< +/A 972 0 R +/K 67 +/P 3960 0 R +/S /Normal +/Pg 41 0 R +>> +endobj +2131 0 obj +<< +/A 972 0 R +/K 68 +/P 3961 0 R +/S /Normal +/Pg 41 0 R +>> +endobj +2132 0 obj +<< +/A 972 0 R +/K 69 +/P 3962 0 R +/S /Normal +/Pg 41 0 R +>> +endobj +2133 0 obj +<< +/A 972 0 R +/K 70 +/P 3963 0 R +/S /Normal +/Pg 41 0 R +>> +endobj +2134 0 obj +<< +/A 972 0 R +/K 71 +/P 3964 0 R +/S /Normal +/Pg 41 0 R +>> +endobj +2135 0 obj +<< +/A 972 0 R +/K 72 +/P 3965 0 R +/S /Normal +/Pg 41 0 R +>> +endobj +2136 0 obj +<< +/A 972 0 R +/K 73 +/P 3966 0 R +/S /Normal +/Pg 41 0 R +>> +endobj +2137 0 obj +<< +/A 972 0 R +/K 75 +/P 3967 0 R +/S /Normal +/Pg 41 0 R +>> +endobj +2138 0 obj +<< +/A 972 0 R +/K 76 +/P 3968 0 R +/S /Normal +/Pg 41 0 R +>> +endobj +2139 0 obj +<< +/A 972 0 R +/K 77 +/P 3969 0 R +/S /Normal +/Pg 41 0 R +>> +endobj +2140 0 obj +<< +/A 972 0 R +/K 78 +/P 3970 0 R +/S /Normal +/Pg 41 0 R +>> +endobj +2141 0 obj +<< +/A 972 0 R +/K 79 +/P 3971 0 R +/S /Normal +/Pg 41 0 R +>> +endobj +2142 0 obj +<< +/A 972 0 R +/K 80 +/P 3972 0 R +/S /Normal +/Pg 41 0 R +>> +endobj +2143 0 obj +<< +/A 972 0 R +/K 81 +/P 3973 0 R +/S /Normal +/Pg 41 0 R +>> +endobj +2144 0 obj +<< +/A 972 0 R +/K 82 +/P 3974 0 R +/S /Normal +/Pg 41 0 R +>> +endobj +2145 0 obj +<< +/A 972 0 R +/K 83 +/P 3975 0 R +/S /Normal +/Pg 41 0 R +>> +endobj +2146 0 obj +<< +/A 972 0 R +/K 84 +/P 3976 0 R +/S /Normal +/Pg 41 0 R +>> +endobj +2147 0 obj +<< +/A 972 0 R +/K 85 +/P 3977 0 R +/S /Normal +/Pg 41 0 R +>> +endobj +2148 0 obj +<< +/A 972 0 R +/K 86 +/P 3978 0 R +/S /Normal +/Pg 41 0 R +>> +endobj +2149 0 obj +<< +/A 972 0 R +/K 87 +/P 3979 0 R +/S /Normal +/Pg 41 0 R +>> +endobj +2150 0 obj +<< +/A 972 0 R +/K 88 +/P 3980 0 R +/S /Normal +/Pg 41 0 R +>> +endobj +2151 0 obj +<< +/A 972 0 R +/K 89 +/P 3981 0 R +/S /Normal +/Pg 41 0 R +>> +endobj +2152 0 obj +<< +/A 972 0 R +/K 90 +/P 3982 0 R +/S /Normal +/Pg 41 0 R +>> +endobj +2153 0 obj +<< +/A 972 0 R +/K 91 +/P 3983 0 R +/S /Normal +/Pg 41 0 R +>> +endobj +2154 0 obj +<< +/A 972 0 R +/K 92 +/P 3984 0 R +/S /Normal +/Pg 41 0 R +>> +endobj +2155 0 obj +<< +/A 972 0 R +/K 6 +/P 3985 0 R +/S /Normal +/Pg 42 0 R +>> +endobj +2156 0 obj +<< +/A 972 0 R +/K 7 +/P 3986 0 R +/S /Normal +/Pg 42 0 R +>> +endobj +2157 0 obj +<< +/A 972 0 R +/K 8 +/P 3987 0 R +/S /Normal +/Pg 42 0 R +>> +endobj +2158 0 obj +<< +/A 972 0 R +/K 9 +/P 3988 0 R +/S /Normal +/Pg 42 0 R +>> +endobj +2159 0 obj +<< +/A 972 0 R +/K 10 +/P 3989 0 R +/S /Normal +/Pg 42 0 R +>> +endobj +2160 0 obj +<< +/A 972 0 R +/K 11 +/P 3990 0 R +/S /Normal +/Pg 42 0 R +>> +endobj +2161 0 obj +<< +/A 972 0 R +/K 12 +/P 3991 0 R +/S /Normal +/Pg 42 0 R +>> +endobj +2162 0 obj +<< +/A 972 0 R +/K 13 +/P 3992 0 R +/S /Normal +/Pg 42 0 R +>> +endobj +2163 0 obj +<< +/A 972 0 R +/K 14 +/P 3993 0 R +/S /Normal +/Pg 42 0 R +>> +endobj +2164 0 obj +<< +/A 972 0 R +/K 15 +/P 3994 0 R +/S /Normal +/Pg 42 0 R +>> +endobj +2165 0 obj +<< +/A 972 0 R +/K 16 +/P 3995 0 R +/S /Normal +/Pg 42 0 R +>> +endobj +2166 0 obj +<< +/A 972 0 R +/K 17 +/P 3996 0 R +/S /Normal +/Pg 42 0 R +>> +endobj +2167 0 obj +<< +/A 972 0 R +/K 18 +/P 3997 0 R +/S /Normal +/Pg 42 0 R +>> +endobj +2168 0 obj +<< +/A 972 0 R +/K 19 +/P 3998 0 R +/S /Normal +/Pg 42 0 R +>> +endobj +2169 0 obj +<< +/A 972 0 R +/K 20 +/P 3999 0 R +/S /Normal +/Pg 42 0 R +>> +endobj +2170 0 obj +<< +/A 972 0 R +/K 21 +/P 4000 0 R +/S /Normal +/Pg 42 0 R +>> +endobj +2171 0 obj +<< +/A 972 0 R +/K 22 +/P 4001 0 R +/S /Normal +/Pg 42 0 R +>> +endobj +2172 0 obj +<< +/A 972 0 R +/K 23 +/P 4002 0 R +/S /Normal +/Pg 42 0 R +>> +endobj +2173 0 obj +<< +/A 972 0 R +/K 24 +/P 4003 0 R +/S /Normal +/Pg 42 0 R +>> +endobj +2174 0 obj +<< +/A 972 0 R +/K 25 +/P 4004 0 R +/S /Normal +/Pg 42 0 R +>> +endobj +2175 0 obj +<< +/A 972 0 R +/K 26 +/P 4005 0 R +/S /Normal +/Pg 42 0 R +>> +endobj +2176 0 obj +<< +/A 972 0 R +/K 29 +/P 4006 0 R +/S /Normal +/Pg 42 0 R +>> +endobj +2177 0 obj +<< +/A 972 0 R +/K 30 +/P 4007 0 R +/S /Normal +/Pg 42 0 R +>> +endobj +2178 0 obj +<< +/A 972 0 R +/K 31 +/P 4008 0 R +/S /Normal +/Pg 42 0 R +>> +endobj +2179 0 obj +<< +/A 972 0 R +/K 32 +/P 4009 0 R +/S /Normal +/Pg 42 0 R +>> +endobj +2180 0 obj +<< +/A 972 0 R +/K 33 +/P 4010 0 R +/S /Normal +/Pg 42 0 R +>> +endobj +2181 0 obj +<< +/A 972 0 R +/K 34 +/P 4011 0 R +/S /Normal +/Pg 42 0 R +>> +endobj +2182 0 obj +<< +/A 972 0 R +/K 35 +/P 4012 0 R +/S /Normal +/Pg 42 0 R +>> +endobj +2183 0 obj +<< +/A 972 0 R +/K 36 +/P 4013 0 R +/S /Normal +/Pg 42 0 R +>> +endobj +2184 0 obj +<< +/A 972 0 R +/K 37 +/P 4014 0 R +/S /Normal +/Pg 42 0 R +>> +endobj +2185 0 obj +<< +/A 972 0 R +/K 38 +/P 4015 0 R +/S /Normal +/Pg 42 0 R +>> +endobj +2186 0 obj +<< +/A 972 0 R +/K 39 +/P 4016 0 R +/S /Normal +/Pg 42 0 R +>> +endobj +2187 0 obj +<< +/A 972 0 R +/K 40 +/P 4017 0 R +/S /Normal +/Pg 42 0 R +>> +endobj +2188 0 obj +<< +/A 972 0 R +/K 41 +/P 4018 0 R +/S /Normal +/Pg 42 0 R +>> +endobj +2189 0 obj +<< +/A 972 0 R +/K 42 +/P 4019 0 R +/S /Normal +/Pg 42 0 R +>> +endobj +2190 0 obj +<< +/A 972 0 R +/K 43 +/P 4020 0 R +/S /Normal +/Pg 42 0 R +>> +endobj +2191 0 obj +<< +/A 972 0 R +/K 44 +/P 4021 0 R +/S /Normal +/Pg 42 0 R +>> +endobj +2192 0 obj +<< +/A 972 0 R +/K 45 +/P 4022 0 R +/S /Normal +/Pg 42 0 R +>> +endobj +2193 0 obj +<< +/A 972 0 R +/K 46 +/P 4023 0 R +/S /Normal +/Pg 42 0 R +>> +endobj +2194 0 obj +<< +/A 972 0 R +/K 48 +/P 4024 0 R +/S /Normal +/Pg 42 0 R +>> +endobj +2195 0 obj +<< +/A 972 0 R +/K 49 +/P 4025 0 R +/S /Normal +/Pg 42 0 R +>> +endobj +2196 0 obj +<< +/A 972 0 R +/K 50 +/P 4026 0 R +/S /Normal +/Pg 42 0 R +>> +endobj +2197 0 obj +<< +/A 972 0 R +/K 51 +/P 4027 0 R +/S /Normal +/Pg 42 0 R +>> +endobj +2198 0 obj +<< +/A 972 0 R +/K 52 +/P 4028 0 R +/S /Normal +/Pg 42 0 R +>> +endobj +2199 0 obj +<< +/A 972 0 R +/K 53 +/P 4029 0 R +/S /Normal +/Pg 42 0 R +>> +endobj +2200 0 obj +<< +/A 972 0 R +/K 54 +/P 4030 0 R +/S /Normal +/Pg 42 0 R +>> +endobj +2201 0 obj +<< +/A 972 0 R +/K 55 +/P 4031 0 R +/S /Normal +/Pg 42 0 R +>> +endobj +2202 0 obj +<< +/A 972 0 R +/K 56 +/P 4032 0 R +/S /Normal +/Pg 42 0 R +>> +endobj +2203 0 obj +<< +/A 972 0 R +/K 57 +/P 4033 0 R +/S /Normal +/Pg 42 0 R +>> +endobj +2204 0 obj +<< +/A 972 0 R +/K 58 +/P 4034 0 R +/S /Normal +/Pg 42 0 R +>> +endobj +2205 0 obj +<< +/A 972 0 R +/K 59 +/P 4035 0 R +/S /Normal +/Pg 42 0 R +>> +endobj +2206 0 obj +<< +/A 972 0 R +/K 60 +/P 4036 0 R +/S /Normal +/Pg 42 0 R +>> +endobj +2207 0 obj +<< +/A 972 0 R +/K 61 +/P 4037 0 R +/S /Normal +/Pg 42 0 R +>> +endobj +2208 0 obj +<< +/A 972 0 R +/K 62 +/P 4038 0 R +/S /Normal +/Pg 42 0 R +>> +endobj +2209 0 obj +<< +/A 972 0 R +/K 63 +/P 4039 0 R +/S /Normal +/Pg 42 0 R +>> +endobj +2210 0 obj +<< +/A 972 0 R +/K 64 +/P 4040 0 R +/S /Normal +/Pg 42 0 R +>> +endobj +2211 0 obj +<< +/A 972 0 R +/K 65 +/P 4041 0 R +/S /Normal +/Pg 42 0 R +>> +endobj +2212 0 obj +<< +/A 972 0 R +/K 67 +/P 4042 0 R +/S /Normal +/Pg 42 0 R +>> +endobj +2213 0 obj +<< +/A 972 0 R +/K 68 +/P 4043 0 R +/S /Normal +/Pg 42 0 R +>> +endobj +2214 0 obj +<< +/A 972 0 R +/K 69 +/P 4044 0 R +/S /Normal +/Pg 42 0 R +>> +endobj +2215 0 obj +<< +/A 972 0 R +/K 70 +/P 4045 0 R +/S /Normal +/Pg 42 0 R +>> +endobj +2216 0 obj +<< +/A 972 0 R +/K 71 +/P 4046 0 R +/S /Normal +/Pg 42 0 R +>> +endobj +2217 0 obj +<< +/A 972 0 R +/K 72 +/P 4047 0 R +/S /Normal +/Pg 42 0 R +>> +endobj +2218 0 obj +<< +/A 972 0 R +/K 73 +/P 4048 0 R +/S /Normal +/Pg 42 0 R +>> +endobj +2219 0 obj +<< +/A 972 0 R +/K 74 +/P 4049 0 R +/S /Normal +/Pg 42 0 R +>> +endobj +2220 0 obj +<< +/A 972 0 R +/K 75 +/P 4050 0 R +/S /Normal +/Pg 42 0 R +>> +endobj +2221 0 obj +<< +/A 972 0 R +/K 76 +/P 4051 0 R +/S /Normal +/Pg 42 0 R +>> +endobj +2222 0 obj +<< +/A 972 0 R +/K 77 +/P 4052 0 R +/S /Normal +/Pg 42 0 R +>> +endobj +2223 0 obj +<< +/A 972 0 R +/K 78 +/P 4053 0 R +/S /Normal +/Pg 42 0 R +>> +endobj +2224 0 obj +<< +/A 972 0 R +/K 79 +/P 4054 0 R +/S /Normal +/Pg 42 0 R +>> +endobj +2225 0 obj +<< +/A 972 0 R +/K 80 +/P 4055 0 R +/S /Normal +/Pg 42 0 R +>> +endobj +2226 0 obj +<< +/A 972 0 R +/K 81 +/P 4056 0 R +/S /Normal +/Pg 42 0 R +>> +endobj +2227 0 obj +<< +/A 972 0 R +/K 82 +/P 4057 0 R +/S /Normal +/Pg 42 0 R +>> +endobj +2228 0 obj +<< +/A 972 0 R +/K 83 +/P 4058 0 R +/S /Normal +/Pg 42 0 R +>> +endobj +2229 0 obj +<< +/A 972 0 R +/K 84 +/P 4059 0 R +/S /Normal +/Pg 42 0 R +>> +endobj +2230 0 obj +<< +/A 972 0 R +/K 101 +/P 4060 0 R +/S /Normal +/Pg 42 0 R +>> +endobj +2231 0 obj +<< +/A 972 0 R +/K 102 +/P 4061 0 R +/S /Normal +/Pg 42 0 R +>> +endobj +2232 0 obj +<< +/A 972 0 R +/K 103 +/P 4062 0 R +/S /Normal +/Pg 42 0 R +>> +endobj +2233 0 obj +<< +/A 972 0 R +/K 104 +/P 4063 0 R +/S /Normal +/Pg 42 0 R +>> +endobj +2234 0 obj +<< +/A 972 0 R +/K 105 +/P 4064 0 R +/S /Normal +/Pg 42 0 R +>> +endobj +2235 0 obj +<< +/A 972 0 R +/K 106 +/P 4065 0 R +/S /Normal +/Pg 42 0 R +>> +endobj +2236 0 obj +<< +/A 972 0 R +/K 107 +/P 4066 0 R +/S /Normal +/Pg 42 0 R +>> +endobj +2237 0 obj +<< +/A 972 0 R +/K 108 +/P 4067 0 R +/S /Normal +/Pg 42 0 R +>> +endobj +2238 0 obj +<< +/A 972 0 R +/K 109 +/P 4068 0 R +/S /Normal +/Pg 42 0 R +>> +endobj +2239 0 obj +<< +/A 972 0 R +/K 110 +/P 4069 0 R +/S /Normal +/Pg 42 0 R +>> +endobj +2240 0 obj +<< +/A 972 0 R +/K 111 +/P 4070 0 R +/S /Normal +/Pg 42 0 R +>> +endobj +2241 0 obj +<< +/A 972 0 R +/K 112 +/P 4071 0 R +/S /Normal +/Pg 42 0 R +>> +endobj +2242 0 obj +<< +/A 972 0 R +/K 113 +/P 4072 0 R +/S /Normal +/Pg 42 0 R +>> +endobj +2243 0 obj +<< +/A 972 0 R +/K 114 +/P 4073 0 R +/S /Normal +/Pg 42 0 R +>> +endobj +2244 0 obj +<< +/A 972 0 R +/K 115 +/P 4074 0 R +/S /Normal +/Pg 42 0 R +>> +endobj +2245 0 obj +<< +/A 972 0 R +/K 116 +/P 4075 0 R +/S /Normal +/Pg 42 0 R +>> +endobj +2246 0 obj +<< +/A 972 0 R +/K 117 +/P 4076 0 R +/S /Normal +/Pg 42 0 R +>> +endobj +2247 0 obj +<< +/A 972 0 R +/K 118 +/P 4077 0 R +/S /Normal +/Pg 42 0 R +>> +endobj +2248 0 obj +<< +/A 972 0 R +/K 119 +/P 4078 0 R +/S /Normal +/Pg 42 0 R +>> +endobj +2249 0 obj +<< +/A 972 0 R +/K 120 +/P 4079 0 R +/S /Normal +/Pg 42 0 R +>> +endobj +2250 0 obj +<< +/A 972 0 R +/K 121 +/P 4080 0 R +/S /Normal +/Pg 42 0 R +>> +endobj +2251 0 obj +<< +/A 972 0 R +/K 2 +/P 4081 0 R +/S /Normal +/Pg 43 0 R +>> +endobj +2252 0 obj +<< +/A 972 0 R +/K 3 +/P 4082 0 R +/S /Normal +/Pg 43 0 R +>> +endobj +2253 0 obj +<< +/A 972 0 R +/K 4 +/P 4083 0 R +/S /Normal +/Pg 43 0 R +>> +endobj +2254 0 obj +<< +/A 972 0 R +/K 5 +/P 4084 0 R +/S /Normal +/Pg 43 0 R +>> +endobj +2255 0 obj +<< +/A 972 0 R +/K 6 +/P 4085 0 R +/S /Normal +/Pg 43 0 R +>> +endobj +2256 0 obj +<< +/A 972 0 R +/K 7 +/P 4086 0 R +/S /Normal +/Pg 43 0 R +>> +endobj +2257 0 obj +<< +/A 972 0 R +/K 8 +/P 4087 0 R +/S /Normal +/Pg 43 0 R +>> +endobj +2258 0 obj +<< +/A 972 0 R +/K 9 +/P 4088 0 R +/S /Normal +/Pg 43 0 R +>> +endobj +2259 0 obj +<< +/A 972 0 R +/K 10 +/P 4089 0 R +/S /Normal +/Pg 43 0 R +>> +endobj +2260 0 obj +<< +/A 972 0 R +/K 11 +/P 4090 0 R +/S /Normal +/Pg 43 0 R +>> +endobj +2261 0 obj +<< +/A 972 0 R +/K 12 +/P 4091 0 R +/S /Normal +/Pg 43 0 R +>> +endobj +2262 0 obj +<< +/A 972 0 R +/K 13 +/P 4092 0 R +/S /Normal +/Pg 43 0 R +>> +endobj +2263 0 obj +<< +/A 972 0 R +/K 14 +/P 4093 0 R +/S /Normal +/Pg 43 0 R +>> +endobj +2264 0 obj +<< +/A 972 0 R +/K 15 +/P 4094 0 R +/S /Normal +/Pg 43 0 R +>> +endobj +2265 0 obj +<< +/A 972 0 R +/K 16 +/P 4095 0 R +/S /Normal +/Pg 43 0 R +>> +endobj +2266 0 obj +<< +/A 972 0 R +/K 17 +/P 4096 0 R +/S /Normal +/Pg 43 0 R +>> +endobj +2267 0 obj +<< +/A 972 0 R +/K 18 +/P 4097 0 R +/S /Normal +/Pg 43 0 R +>> +endobj +2268 0 obj +<< +/A 972 0 R +/K 19 +/P 4098 0 R +/S /Normal +/Pg 43 0 R +>> +endobj +2269 0 obj +<< +/A 972 0 R +/K 21 +/P 4099 0 R +/S /Normal +/Pg 43 0 R +>> +endobj +2270 0 obj +<< +/A 972 0 R +/K 22 +/P 4100 0 R +/S /Normal +/Pg 43 0 R +>> +endobj +2271 0 obj +<< +/A 972 0 R +/K 23 +/P 4101 0 R +/S /Normal +/Pg 43 0 R +>> +endobj +2272 0 obj +<< +/A 972 0 R +/K 24 +/P 4102 0 R +/S /Normal +/Pg 43 0 R +>> +endobj +2273 0 obj +<< +/A 972 0 R +/K 25 +/P 4103 0 R +/S /Normal +/Pg 43 0 R +>> +endobj +2274 0 obj +<< +/A 972 0 R +/K 26 +/P 4104 0 R +/S /Normal +/Pg 43 0 R +>> +endobj +2275 0 obj +<< +/A 972 0 R +/K 27 +/P 4105 0 R +/S /Normal +/Pg 43 0 R +>> +endobj +2276 0 obj +<< +/A 972 0 R +/K 28 +/P 4106 0 R +/S /Normal +/Pg 43 0 R +>> +endobj +2277 0 obj +<< +/A 972 0 R +/K 29 +/P 4107 0 R +/S /Normal +/Pg 43 0 R +>> +endobj +2278 0 obj +<< +/A 972 0 R +/K 30 +/P 4108 0 R +/S /Normal +/Pg 43 0 R +>> +endobj +2279 0 obj +<< +/A 972 0 R +/K 31 +/P 4109 0 R +/S /Normal +/Pg 43 0 R +>> +endobj +2280 0 obj +<< +/A 972 0 R +/K 32 +/P 4110 0 R +/S /Normal +/Pg 43 0 R +>> +endobj +2281 0 obj +<< +/A 972 0 R +/K 33 +/P 4111 0 R +/S /Normal +/Pg 43 0 R +>> +endobj +2282 0 obj +<< +/A 972 0 R +/K 34 +/P 4112 0 R +/S /Normal +/Pg 43 0 R +>> +endobj +2283 0 obj +<< +/A 972 0 R +/K 35 +/P 4113 0 R +/S /Normal +/Pg 43 0 R +>> +endobj +2284 0 obj +<< +/A 972 0 R +/K 36 +/P 4114 0 R +/S /Normal +/Pg 43 0 R +>> +endobj +2285 0 obj +<< +/A 972 0 R +/K 37 +/P 4115 0 R +/S /Normal +/Pg 43 0 R +>> +endobj +2286 0 obj +<< +/A 972 0 R +/K 38 +/P 4116 0 R +/S /Normal +/Pg 43 0 R +>> +endobj +2287 0 obj +<< +/A 972 0 R +/K 40 +/P 4117 0 R +/S /Normal +/Pg 43 0 R +>> +endobj +2288 0 obj +<< +/A 972 0 R +/K 41 +/P 4118 0 R +/S /Normal +/Pg 43 0 R +>> +endobj +2289 0 obj +<< +/A 972 0 R +/K 42 +/P 4119 0 R +/S /Normal +/Pg 43 0 R +>> +endobj +2290 0 obj +<< +/A 972 0 R +/K 43 +/P 4120 0 R +/S /Normal +/Pg 43 0 R +>> +endobj +2291 0 obj +<< +/A 972 0 R +/K 44 +/P 4121 0 R +/S /Normal +/Pg 43 0 R +>> +endobj +2292 0 obj +<< +/A 972 0 R +/K 45 +/P 4122 0 R +/S /Normal +/Pg 43 0 R +>> +endobj +2293 0 obj +<< +/A 972 0 R +/K 46 +/P 4123 0 R +/S /Normal +/Pg 43 0 R +>> +endobj +2294 0 obj +<< +/A 972 0 R +/K 47 +/P 4124 0 R +/S /Normal +/Pg 43 0 R +>> +endobj +2295 0 obj +<< +/A 972 0 R +/K 48 +/P 4125 0 R +/S /Normal +/Pg 43 0 R +>> +endobj +2296 0 obj +<< +/A 972 0 R +/K 49 +/P 4126 0 R +/S /Normal +/Pg 43 0 R +>> +endobj +2297 0 obj +<< +/A 972 0 R +/K 50 +/P 4127 0 R +/S /Normal +/Pg 43 0 R +>> +endobj +2298 0 obj +<< +/A 972 0 R +/K 51 +/P 4128 0 R +/S /Normal +/Pg 43 0 R +>> +endobj +2299 0 obj +<< +/A 972 0 R +/K 52 +/P 4129 0 R +/S /Normal +/Pg 43 0 R +>> +endobj +2300 0 obj +<< +/A 972 0 R +/K 53 +/P 4130 0 R +/S /Normal +/Pg 43 0 R +>> +endobj +2301 0 obj +<< +/A 972 0 R +/K 54 +/P 4131 0 R +/S /Normal +/Pg 43 0 R +>> +endobj +2302 0 obj +<< +/A 972 0 R +/K 55 +/P 4132 0 R +/S /Normal +/Pg 43 0 R +>> +endobj +2303 0 obj +<< +/A 972 0 R +/K 56 +/P 4133 0 R +/S /Normal +/Pg 43 0 R +>> +endobj +2304 0 obj +<< +/A 972 0 R +/K 57 +/P 4134 0 R +/S /Normal +/Pg 43 0 R +>> +endobj +2305 0 obj +<< +/A 972 0 R +/K 73 +/P 4135 0 R +/S /Normal +/Pg 43 0 R +>> +endobj +2306 0 obj +<< +/A 972 0 R +/K 74 +/P 4136 0 R +/S /Normal +/Pg 43 0 R +>> +endobj +2307 0 obj +<< +/A 972 0 R +/K 75 +/P 4137 0 R +/S /Normal +/Pg 43 0 R +>> +endobj +2308 0 obj +<< +/A 972 0 R +/K 76 +/P 4138 0 R +/S /Normal +/Pg 43 0 R +>> +endobj +2309 0 obj +<< +/A 972 0 R +/K 77 +/P 4139 0 R +/S /Normal +/Pg 43 0 R +>> +endobj +2310 0 obj +<< +/A 972 0 R +/K 78 +/P 4140 0 R +/S /Normal +/Pg 43 0 R +>> +endobj +2311 0 obj +<< +/A 972 0 R +/K 79 +/P 4141 0 R +/S /Normal +/Pg 43 0 R +>> +endobj +2312 0 obj +<< +/A 972 0 R +/K 80 +/P 4142 0 R +/S /Normal +/Pg 43 0 R +>> +endobj +2313 0 obj +<< +/A 972 0 R +/K 81 +/P 4143 0 R +/S /Normal +/Pg 43 0 R +>> +endobj +2314 0 obj +<< +/A 972 0 R +/K 82 +/P 4144 0 R +/S /Normal +/Pg 43 0 R +>> +endobj +2315 0 obj +<< +/A 972 0 R +/K 83 +/P 4145 0 R +/S /Normal +/Pg 43 0 R +>> +endobj +2316 0 obj +<< +/A 972 0 R +/K 84 +/P 4146 0 R +/S /Normal +/Pg 43 0 R +>> +endobj +2317 0 obj +<< +/A 972 0 R +/K 85 +/P 4147 0 R +/S /Normal +/Pg 43 0 R +>> +endobj +2318 0 obj +<< +/A 972 0 R +/K 86 +/P 4148 0 R +/S /Normal +/Pg 43 0 R +>> +endobj +2319 0 obj +<< +/A 972 0 R +/K 87 +/P 4149 0 R +/S /Normal +/Pg 43 0 R +>> +endobj +2320 0 obj +<< +/A 972 0 R +/K 88 +/P 4150 0 R +/S /Normal +/Pg 43 0 R +>> +endobj +2321 0 obj +<< +/A 972 0 R +/K 89 +/P 4151 0 R +/S /Normal +/Pg 43 0 R +>> +endobj +2322 0 obj +<< +/A 972 0 R +/K 90 +/P 4152 0 R +/S /Normal +/Pg 43 0 R +>> +endobj +2323 0 obj +<< +/A 972 0 R +/K 91 +/P 4153 0 R +/S /Normal +/Pg 43 0 R +>> +endobj +2324 0 obj +<< +/A 972 0 R +/K 92 +/P 4154 0 R +/S /Normal +/Pg 43 0 R +>> +endobj +2325 0 obj +<< +/A 972 0 R +/K 93 +/P 4155 0 R +/S /Normal +/Pg 43 0 R +>> +endobj +2326 0 obj +<< +/A 972 0 R +/K 94 +/P 4156 0 R +/S /Normal +/Pg 43 0 R +>> +endobj +2327 0 obj +<< +/A 972 0 R +/K 95 +/P 4157 0 R +/S /Normal +/Pg 43 0 R +>> +endobj +2328 0 obj +<< +/A 972 0 R +/K 96 +/P 4158 0 R +/S /Normal +/Pg 43 0 R +>> +endobj +2329 0 obj +<< +/A 972 0 R +/K 99 +/P 4159 0 R +/S /Normal +/Pg 43 0 R +>> +endobj +2330 0 obj +<< +/A 972 0 R +/K 100 +/P 4160 0 R +/S /Normal +/Pg 43 0 R +>> +endobj +2331 0 obj +<< +/A 972 0 R +/K 101 +/P 4161 0 R +/S /Normal +/Pg 43 0 R +>> +endobj +2332 0 obj +<< +/A 972 0 R +/K 102 +/P 4162 0 R +/S /Normal +/Pg 43 0 R +>> +endobj +2333 0 obj +<< +/A 972 0 R +/K 103 +/P 4163 0 R +/S /Normal +/Pg 43 0 R +>> +endobj +2334 0 obj +<< +/A 972 0 R +/K 104 +/P 4164 0 R +/S /Normal +/Pg 43 0 R +>> +endobj +2335 0 obj +<< +/A 972 0 R +/K 105 +/P 4165 0 R +/S /Normal +/Pg 43 0 R +>> +endobj +2336 0 obj +<< +/A 972 0 R +/K 106 +/P 4166 0 R +/S /Normal +/Pg 43 0 R +>> +endobj +2337 0 obj +<< +/A 972 0 R +/K 107 +/P 4167 0 R +/S /Normal +/Pg 43 0 R +>> +endobj +2338 0 obj +<< +/A 972 0 R +/K 108 +/P 4168 0 R +/S /Normal +/Pg 43 0 R +>> +endobj +2339 0 obj +<< +/A 972 0 R +/K 109 +/P 4169 0 R +/S /Normal +/Pg 43 0 R +>> +endobj +2340 0 obj +<< +/A 972 0 R +/K 110 +/P 4170 0 R +/S /Normal +/Pg 43 0 R +>> +endobj +2341 0 obj +<< +/A 972 0 R +/K 111 +/P 4171 0 R +/S /Normal +/Pg 43 0 R +>> +endobj +2342 0 obj +<< +/A 972 0 R +/K 112 +/P 4172 0 R +/S /Normal +/Pg 43 0 R +>> +endobj +2343 0 obj +<< +/A 972 0 R +/K 113 +/P 4173 0 R +/S /Normal +/Pg 43 0 R +>> +endobj +2344 0 obj +<< +/A 972 0 R +/K 114 +/P 4174 0 R +/S /Normal +/Pg 43 0 R +>> +endobj +2345 0 obj +<< +/A 972 0 R +/K 115 +/P 4175 0 R +/S /Normal +/Pg 43 0 R +>> +endobj +2346 0 obj +<< +/A 972 0 R +/K 116 +/P 4176 0 R +/S /Normal +/Pg 43 0 R +>> +endobj +2347 0 obj +<< +/A 972 0 R +/K 11 +/P 4177 0 R +/S /Normal +/Pg 44 0 R +>> +endobj +2348 0 obj +<< +/A 972 0 R +/K 12 +/P 4178 0 R +/S /Normal +/Pg 44 0 R +>> +endobj +2349 0 obj +<< +/A 972 0 R +/K 13 +/P 4179 0 R +/S /Normal +/Pg 44 0 R +>> +endobj +2350 0 obj +<< +/A 972 0 R +/K 14 +/P 4180 0 R +/S /Normal +/Pg 44 0 R +>> +endobj +2351 0 obj +<< +/A 972 0 R +/K 15 +/P 4181 0 R +/S /Normal +/Pg 44 0 R +>> +endobj +2352 0 obj +<< +/A 972 0 R +/K 16 +/P 4182 0 R +/S /Normal +/Pg 44 0 R +>> +endobj +2353 0 obj +<< +/A 972 0 R +/K 17 +/P 4183 0 R +/S /Normal +/Pg 44 0 R +>> +endobj +2354 0 obj +<< +/A 972 0 R +/K 18 +/P 4184 0 R +/S /Normal +/Pg 44 0 R +>> +endobj +2355 0 obj +<< +/A 972 0 R +/K 19 +/P 4185 0 R +/S /Normal +/Pg 44 0 R +>> +endobj +2356 0 obj +<< +/A 972 0 R +/K 20 +/P 4186 0 R +/S /Normal +/Pg 44 0 R +>> +endobj +2357 0 obj +<< +/A 972 0 R +/K 21 +/P 4187 0 R +/S /Normal +/Pg 44 0 R +>> +endobj +2358 0 obj +<< +/A 972 0 R +/K 22 +/P 4188 0 R +/S /Normal +/Pg 44 0 R +>> +endobj +2359 0 obj +<< +/A 972 0 R +/K 23 +/P 4189 0 R +/S /Normal +/Pg 44 0 R +>> +endobj +2360 0 obj +<< +/A 972 0 R +/K 24 +/P 4190 0 R +/S /Normal +/Pg 44 0 R +>> +endobj +2361 0 obj +<< +/A 972 0 R +/K 25 +/P 4191 0 R +/S /Normal +/Pg 44 0 R +>> +endobj +2362 0 obj +<< +/A 972 0 R +/K 26 +/P 4192 0 R +/S /Normal +/Pg 44 0 R +>> +endobj +2363 0 obj +<< +/A 972 0 R +/K 27 +/P 4193 0 R +/S /Normal +/Pg 44 0 R +>> +endobj +2364 0 obj +<< +/A 972 0 R +/K 28 +/P 4194 0 R +/S /Normal +/Pg 44 0 R +>> +endobj +2365 0 obj +<< +/A 972 0 R +/K 29 +/P 4195 0 R +/S /Normal +/Pg 44 0 R +>> +endobj +2366 0 obj +<< +/A 972 0 R +/K 30 +/P 4196 0 R +/S /Normal +/Pg 44 0 R +>> +endobj +2367 0 obj +<< +/A 972 0 R +/K 31 +/P 4197 0 R +/S /Normal +/Pg 44 0 R +>> +endobj +2368 0 obj +<< +/A 972 0 R +/K 32 +/P 4198 0 R +/S /Normal +/Pg 44 0 R +>> +endobj +2369 0 obj +<< +/A 972 0 R +/K 33 +/P 4199 0 R +/S /Normal +/Pg 44 0 R +>> +endobj +2370 0 obj +<< +/A 972 0 R +/K 34 +/P 4200 0 R +/S /Normal +/Pg 44 0 R +>> +endobj +2371 0 obj +<< +/A 972 0 R +/K 37 +/P 4201 0 R +/S /Normal +/Pg 44 0 R +>> +endobj +2372 0 obj +<< +/A 972 0 R +/K 38 +/P 4202 0 R +/S /Normal +/Pg 44 0 R +>> +endobj +2373 0 obj +<< +/A 972 0 R +/K 39 +/P 4203 0 R +/S /Normal +/Pg 44 0 R +>> +endobj +2374 0 obj +<< +/A 972 0 R +/K 40 +/P 4204 0 R +/S /Normal +/Pg 44 0 R +>> +endobj +2375 0 obj +<< +/A 972 0 R +/K 41 +/P 4205 0 R +/S /Normal +/Pg 44 0 R +>> +endobj +2376 0 obj +<< +/A 972 0 R +/K 42 +/P 4206 0 R +/S /Normal +/Pg 44 0 R +>> +endobj +2377 0 obj +<< +/A 972 0 R +/K 43 +/P 4207 0 R +/S /Normal +/Pg 44 0 R +>> +endobj +2378 0 obj +<< +/A 972 0 R +/K 44 +/P 4208 0 R +/S /Normal +/Pg 44 0 R +>> +endobj +2379 0 obj +<< +/A 972 0 R +/K 45 +/P 4209 0 R +/S /Normal +/Pg 44 0 R +>> +endobj +2380 0 obj +<< +/A 972 0 R +/K 46 +/P 4210 0 R +/S /Normal +/Pg 44 0 R +>> +endobj +2381 0 obj +<< +/A 972 0 R +/K 47 +/P 4211 0 R +/S /Normal +/Pg 44 0 R +>> +endobj +2382 0 obj +<< +/A 972 0 R +/K 48 +/P 4212 0 R +/S /Normal +/Pg 44 0 R +>> +endobj +2383 0 obj +<< +/A 972 0 R +/K 49 +/P 4213 0 R +/S /Normal +/Pg 44 0 R +>> +endobj +2384 0 obj +<< +/A 972 0 R +/K 50 +/P 4214 0 R +/S /Normal +/Pg 44 0 R +>> +endobj +2385 0 obj +<< +/A 972 0 R +/K 51 +/P 4215 0 R +/S /Normal +/Pg 44 0 R +>> +endobj +2386 0 obj +<< +/A 972 0 R +/K 52 +/P 4216 0 R +/S /Normal +/Pg 44 0 R +>> +endobj +2387 0 obj +<< +/A 972 0 R +/K 53 +/P 4217 0 R +/S /Normal +/Pg 44 0 R +>> +endobj +2388 0 obj +<< +/A 972 0 R +/K 54 +/P 4218 0 R +/S /Normal +/Pg 44 0 R +>> +endobj +2389 0 obj +<< +/A 972 0 R +/K 71 +/P 4219 0 R +/S /Normal +/Pg 44 0 R +>> +endobj +2390 0 obj +<< +/A 972 0 R +/K 72 +/P 4220 0 R +/S /Normal +/Pg 44 0 R +>> +endobj +2391 0 obj +<< +/A 972 0 R +/K 73 +/P 4221 0 R +/S /Normal +/Pg 44 0 R +>> +endobj +2392 0 obj +<< +/A 972 0 R +/K 74 +/P 4222 0 R +/S /Normal +/Pg 44 0 R +>> +endobj +2393 0 obj +<< +/A 972 0 R +/K 75 +/P 4223 0 R +/S /Normal +/Pg 44 0 R +>> +endobj +2394 0 obj +<< +/A 972 0 R +/K 76 +/P 4224 0 R +/S /Normal +/Pg 44 0 R +>> +endobj +2395 0 obj +<< +/A 972 0 R +/K 77 +/P 4225 0 R +/S /Normal +/Pg 44 0 R +>> +endobj +2396 0 obj +<< +/A 972 0 R +/K 78 +/P 4226 0 R +/S /Normal +/Pg 44 0 R +>> +endobj +2397 0 obj +<< +/A 972 0 R +/K 79 +/P 4227 0 R +/S /Normal +/Pg 44 0 R +>> +endobj +2398 0 obj +<< +/A 972 0 R +/K 80 +/P 4228 0 R +/S /Normal +/Pg 44 0 R +>> +endobj +2399 0 obj +<< +/A 972 0 R +/K 81 +/P 4229 0 R +/S /Normal +/Pg 44 0 R +>> +endobj +2400 0 obj +<< +/A 972 0 R +/K 82 +/P 4230 0 R +/S /Normal +/Pg 44 0 R +>> +endobj +2401 0 obj +<< +/A 972 0 R +/K 83 +/P 4231 0 R +/S /Normal +/Pg 44 0 R +>> +endobj +2402 0 obj +<< +/A 972 0 R +/K 84 +/P 4232 0 R +/S /Normal +/Pg 44 0 R +>> +endobj +2403 0 obj +<< +/A 972 0 R +/K 85 +/P 4233 0 R +/S /Normal +/Pg 44 0 R +>> +endobj +2404 0 obj +<< +/A 972 0 R +/K 86 +/P 4234 0 R +/S /Normal +/Pg 44 0 R +>> +endobj +2405 0 obj +<< +/A 972 0 R +/K 87 +/P 4235 0 R +/S /Normal +/Pg 44 0 R +>> +endobj +2406 0 obj +<< +/A 972 0 R +/K 88 +/P 4236 0 R +/S /Normal +/Pg 44 0 R +>> +endobj +2407 0 obj +<< +/A 972 0 R +/K 89 +/P 4237 0 R +/S /Normal +/Pg 44 0 R +>> +endobj +2408 0 obj +<< +/A 972 0 R +/K 90 +/P 4238 0 R +/S /Normal +/Pg 44 0 R +>> +endobj +2409 0 obj +<< +/A 972 0 R +/K 91 +/P 4239 0 R +/S /Normal +/Pg 44 0 R +>> +endobj +2410 0 obj +<< +/A 972 0 R +/K 92 +/P 4240 0 R +/S /Normal +/Pg 44 0 R +>> +endobj +2411 0 obj +<< +/A 972 0 R +/K 93 +/P 4241 0 R +/S /Normal +/Pg 44 0 R +>> +endobj +2412 0 obj +<< +/A 972 0 R +/K 94 +/P 4242 0 R +/S /Normal +/Pg 44 0 R +>> +endobj +2413 0 obj +<< +/A 972 0 R +/K 0 +/P 4243 0 R +/S /Normal +/Pg 45 0 R +>> +endobj +2414 0 obj +<< +/A 972 0 R +/K 1 +/P 4244 0 R +/S /Normal +/Pg 45 0 R +>> +endobj +2415 0 obj +<< +/A 972 0 R +/K 2 +/P 4245 0 R +/S /Normal +/Pg 45 0 R +>> +endobj +2416 0 obj +<< +/A 972 0 R +/K 3 +/P 4246 0 R +/S /Normal +/Pg 45 0 R +>> +endobj +2417 0 obj +<< +/A 972 0 R +/K 4 +/P 4247 0 R +/S /Normal +/Pg 45 0 R +>> +endobj +2418 0 obj +<< +/A 972 0 R +/K 5 +/P 4248 0 R +/S /Normal +/Pg 45 0 R +>> +endobj +2419 0 obj +<< +/A 972 0 R +/K 6 +/P 4249 0 R +/S /Normal +/Pg 45 0 R +>> +endobj +2420 0 obj +<< +/A 972 0 R +/K 7 +/P 4250 0 R +/S /Normal +/Pg 45 0 R +>> +endobj +2421 0 obj +<< +/A 972 0 R +/K 8 +/P 4251 0 R +/S /Normal +/Pg 45 0 R +>> +endobj +2422 0 obj +<< +/A 972 0 R +/K 9 +/P 4252 0 R +/S /Normal +/Pg 45 0 R +>> +endobj +2423 0 obj +<< +/A 972 0 R +/K 10 +/P 4253 0 R +/S /Normal +/Pg 45 0 R +>> +endobj +2424 0 obj +<< +/A 972 0 R +/K 11 +/P 4254 0 R +/S /Normal +/Pg 45 0 R +>> +endobj +2425 0 obj +<< +/A 972 0 R +/K 12 +/P 4255 0 R +/S /Normal +/Pg 45 0 R +>> +endobj +2426 0 obj +<< +/A 972 0 R +/K 13 +/P 4256 0 R +/S /Normal +/Pg 45 0 R +>> +endobj +2427 0 obj +<< +/A 972 0 R +/K 14 +/P 4257 0 R +/S /Normal +/Pg 45 0 R +>> +endobj +2428 0 obj +<< +/A 972 0 R +/K 15 +/P 4258 0 R +/S /Normal +/Pg 45 0 R +>> +endobj +2429 0 obj +<< +/A 972 0 R +/K 16 +/P 4259 0 R +/S /Normal +/Pg 45 0 R +>> +endobj +2430 0 obj +<< +/A 972 0 R +/K 17 +/P 4260 0 R +/S /Normal +/Pg 45 0 R +>> +endobj +2431 0 obj +<< +/A 972 0 R +/K 32 +/P 4261 0 R +/S /Normal +/Pg 45 0 R +>> +endobj +2432 0 obj +<< +/A 972 0 R +/K 33 +/P 4262 0 R +/S /Normal +/Pg 45 0 R +>> +endobj +2433 0 obj +<< +/A 972 0 R +/K 34 +/P 4263 0 R +/S /Normal +/Pg 45 0 R +>> +endobj +2434 0 obj +<< +/A 972 0 R +/K 35 +/P 4264 0 R +/S /Normal +/Pg 45 0 R +>> +endobj +2435 0 obj +<< +/A 972 0 R +/K 36 +/P 4265 0 R +/S /Normal +/Pg 45 0 R +>> +endobj +2436 0 obj +<< +/A 972 0 R +/K 37 +/P 4266 0 R +/S /Normal +/Pg 45 0 R +>> +endobj +2437 0 obj +<< +/A 972 0 R +/K 38 +/P 4267 0 R +/S /Normal +/Pg 45 0 R +>> +endobj +2438 0 obj +<< +/A 972 0 R +/K 39 +/P 4268 0 R +/S /Normal +/Pg 45 0 R +>> +endobj +2439 0 obj +<< +/A 972 0 R +/K 40 +/P 4269 0 R +/S /Normal +/Pg 45 0 R +>> +endobj +2440 0 obj +<< +/A 972 0 R +/K 41 +/P 4270 0 R +/S /Normal +/Pg 45 0 R +>> +endobj +2441 0 obj +<< +/A 972 0 R +/K 42 +/P 4271 0 R +/S /Normal +/Pg 45 0 R +>> +endobj +2442 0 obj +<< +/A 972 0 R +/K 43 +/P 4272 0 R +/S /Normal +/Pg 45 0 R +>> +endobj +2443 0 obj +<< +/A 972 0 R +/K 44 +/P 4273 0 R +/S /Normal +/Pg 45 0 R +>> +endobj +2444 0 obj +<< +/A 972 0 R +/K 45 +/P 4274 0 R +/S /Normal +/Pg 45 0 R +>> +endobj +2445 0 obj +<< +/A 972 0 R +/K 46 +/P 4275 0 R +/S /Normal +/Pg 45 0 R +>> +endobj +2446 0 obj +<< +/A 972 0 R +/K 47 +/P 4276 0 R +/S /Normal +/Pg 45 0 R +>> +endobj +2447 0 obj +<< +/A 972 0 R +/K 48 +/P 4277 0 R +/S /Normal +/Pg 45 0 R +>> +endobj +2448 0 obj +<< +/A 972 0 R +/K 49 +/P 4278 0 R +/S /Normal +/Pg 45 0 R +>> +endobj +2449 0 obj +<< +/A 972 0 R +/K 51 +/P 4279 0 R +/S /Normal +/Pg 45 0 R +>> +endobj +2450 0 obj +<< +/A 972 0 R +/K 52 +/P 4280 0 R +/S /Normal +/Pg 45 0 R +>> +endobj +2451 0 obj +<< +/A 972 0 R +/K 53 +/P 4281 0 R +/S /Normal +/Pg 45 0 R +>> +endobj +2452 0 obj +<< +/A 972 0 R +/K 54 +/P 4282 0 R +/S /Normal +/Pg 45 0 R +>> +endobj +2453 0 obj +<< +/A 972 0 R +/K 55 +/P 4283 0 R +/S /Normal +/Pg 45 0 R +>> +endobj +2454 0 obj +<< +/A 972 0 R +/K 56 +/P 4284 0 R +/S /Normal +/Pg 45 0 R +>> +endobj +2455 0 obj +<< +/A 972 0 R +/K 57 +/P 4285 0 R +/S /Normal +/Pg 45 0 R +>> +endobj +2456 0 obj +<< +/A 972 0 R +/K 58 +/P 4286 0 R +/S /Normal +/Pg 45 0 R +>> +endobj +2457 0 obj +<< +/A 972 0 R +/K 59 +/P 4287 0 R +/S /Normal +/Pg 45 0 R +>> +endobj +2458 0 obj +<< +/A 972 0 R +/K 60 +/P 4288 0 R +/S /Normal +/Pg 45 0 R +>> +endobj +2459 0 obj +<< +/A 972 0 R +/K 61 +/P 4289 0 R +/S /Normal +/Pg 45 0 R +>> +endobj +2460 0 obj +<< +/A 972 0 R +/K 62 +/P 4290 0 R +/S /Normal +/Pg 45 0 R +>> +endobj +2461 0 obj +<< +/A 972 0 R +/K 63 +/P 4291 0 R +/S /Normal +/Pg 45 0 R +>> +endobj +2462 0 obj +<< +/A 972 0 R +/K 64 +/P 4292 0 R +/S /Normal +/Pg 45 0 R +>> +endobj +2463 0 obj +<< +/A 972 0 R +/K 65 +/P 4293 0 R +/S /Normal +/Pg 45 0 R +>> +endobj +2464 0 obj +<< +/A 972 0 R +/K 66 +/P 4294 0 R +/S /Normal +/Pg 45 0 R +>> +endobj +2465 0 obj +<< +/A 972 0 R +/K 67 +/P 4295 0 R +/S /Normal +/Pg 45 0 R +>> +endobj +2466 0 obj +<< +/A 972 0 R +/K 68 +/P 4296 0 R +/S /Normal +/Pg 45 0 R +>> +endobj +2467 0 obj +<< +/A 972 0 R +/K 83 +/P 4297 0 R +/S /Normal +/Pg 45 0 R +>> +endobj +2468 0 obj +<< +/A 972 0 R +/K 84 +/P 4298 0 R +/S /Normal +/Pg 45 0 R +>> +endobj +2469 0 obj +<< +/A 972 0 R +/K 85 +/P 4299 0 R +/S /Normal +/Pg 45 0 R +>> +endobj +2470 0 obj +<< +/A 972 0 R +/K 86 +/P 4300 0 R +/S /Normal +/Pg 45 0 R +>> +endobj +2471 0 obj +<< +/A 972 0 R +/K 87 +/P 4301 0 R +/S /Normal +/Pg 45 0 R +>> +endobj +2472 0 obj +<< +/A 972 0 R +/K 88 +/P 4302 0 R +/S /Normal +/Pg 45 0 R +>> +endobj +2473 0 obj +<< +/A 972 0 R +/K 0 +/P 4303 0 R +/S /Normal +/Pg 46 0 R +>> +endobj +2474 0 obj +<< +/A 972 0 R +/K 1 +/P 4304 0 R +/S /Normal +/Pg 46 0 R +>> +endobj +2475 0 obj +<< +/A 972 0 R +/K 2 +/P 4305 0 R +/S /Normal +/Pg 46 0 R +>> +endobj +2476 0 obj +<< +/A 972 0 R +/K 3 +/P 4306 0 R +/S /Normal +/Pg 46 0 R +>> +endobj +2477 0 obj +<< +/A 972 0 R +/K 4 +/P 4307 0 R +/S /Normal +/Pg 46 0 R +>> +endobj +2478 0 obj +<< +/A 972 0 R +/K 5 +/P 4308 0 R +/S /Normal +/Pg 46 0 R +>> +endobj +2479 0 obj +<< +/A 972 0 R +/K 6 +/P 4309 0 R +/S /Normal +/Pg 46 0 R +>> +endobj +2480 0 obj +<< +/A 972 0 R +/K 7 +/P 4310 0 R +/S /Normal +/Pg 46 0 R +>> +endobj +2481 0 obj +<< +/A 972 0 R +/K 8 +/P 4311 0 R +/S /Normal +/Pg 46 0 R +>> +endobj +2482 0 obj +<< +/A 972 0 R +/K 9 +/P 4312 0 R +/S /Normal +/Pg 46 0 R +>> +endobj +2483 0 obj +<< +/A 972 0 R +/K 10 +/P 4313 0 R +/S /Normal +/Pg 46 0 R +>> +endobj +2484 0 obj +<< +/A 972 0 R +/K 11 +/P 4314 0 R +/S /Normal +/Pg 46 0 R +>> +endobj +2485 0 obj +<< +/A 972 0 R +/K 13 +/P 4315 0 R +/S /Normal +/Pg 46 0 R +>> +endobj +2486 0 obj +<< +/A 972 0 R +/K 14 +/P 4316 0 R +/S /Normal +/Pg 46 0 R +>> +endobj +2487 0 obj +<< +/A 972 0 R +/K 15 +/P 4317 0 R +/S /Normal +/Pg 46 0 R +>> +endobj +2488 0 obj +<< +/A 972 0 R +/K 16 +/P 4318 0 R +/S /Normal +/Pg 46 0 R +>> +endobj +2489 0 obj +<< +/A 972 0 R +/K 17 +/P 4319 0 R +/S /Normal +/Pg 46 0 R +>> +endobj +2490 0 obj +<< +/A 972 0 R +/K 18 +/P 4320 0 R +/S /Normal +/Pg 46 0 R +>> +endobj +2491 0 obj +<< +/A 972 0 R +/K 19 +/P 4321 0 R +/S /Normal +/Pg 46 0 R +>> +endobj +2492 0 obj +<< +/A 972 0 R +/K 20 +/P 4322 0 R +/S /Normal +/Pg 46 0 R +>> +endobj +2493 0 obj +<< +/A 972 0 R +/K 21 +/P 4323 0 R +/S /Normal +/Pg 46 0 R +>> +endobj +2494 0 obj +<< +/A 972 0 R +/K 22 +/P 4324 0 R +/S /Normal +/Pg 46 0 R +>> +endobj +2495 0 obj +<< +/A 972 0 R +/K 23 +/P 4325 0 R +/S /Normal +/Pg 46 0 R +>> +endobj +2496 0 obj +<< +/A 972 0 R +/K 24 +/P 4326 0 R +/S /Normal +/Pg 46 0 R +>> +endobj +2497 0 obj +<< +/A 972 0 R +/K 25 +/P 4327 0 R +/S /Normal +/Pg 46 0 R +>> +endobj +2498 0 obj +<< +/A 972 0 R +/K 26 +/P 4328 0 R +/S /Normal +/Pg 46 0 R +>> +endobj +2499 0 obj +<< +/A 972 0 R +/K 27 +/P 4329 0 R +/S /Normal +/Pg 46 0 R +>> +endobj +2500 0 obj +<< +/A 972 0 R +/K 28 +/P 4330 0 R +/S /Normal +/Pg 46 0 R +>> +endobj +2501 0 obj +<< +/A 972 0 R +/K 29 +/P 4331 0 R +/S /Normal +/Pg 46 0 R +>> +endobj +2502 0 obj +<< +/A 972 0 R +/K 30 +/P 4332 0 R +/S /Normal +/Pg 46 0 R +>> +endobj +2503 0 obj +<< +/A 972 0 R +/K 31 +/P 4333 0 R +/S /Normal +/Pg 46 0 R +>> +endobj +2504 0 obj +<< +/A 972 0 R +/K 32 +/P 4334 0 R +/S /Normal +/Pg 46 0 R +>> +endobj +2505 0 obj +<< +/A 972 0 R +/K 33 +/P 4335 0 R +/S /Normal +/Pg 46 0 R +>> +endobj +2506 0 obj +<< +/A 972 0 R +/K 48 +/P 4336 0 R +/S /Normal +/Pg 46 0 R +>> +endobj +2507 0 obj +<< +/A 972 0 R +/K 49 +/P 4337 0 R +/S /Normal +/Pg 46 0 R +>> +endobj +2508 0 obj +<< +/A 972 0 R +/K 50 +/P 4338 0 R +/S /Normal +/Pg 46 0 R +>> +endobj +2509 0 obj +<< +/A 972 0 R +/K 51 +/P 4339 0 R +/S /Normal +/Pg 46 0 R +>> +endobj +2510 0 obj +<< +/A 972 0 R +/K 52 +/P 4340 0 R +/S /Normal +/Pg 46 0 R +>> +endobj +2511 0 obj +<< +/A 972 0 R +/K 53 +/P 4341 0 R +/S /Normal +/Pg 46 0 R +>> +endobj +2512 0 obj +<< +/A 972 0 R +/K 54 +/P 4342 0 R +/S /Normal +/Pg 46 0 R +>> +endobj +2513 0 obj +<< +/A 972 0 R +/K 55 +/P 4343 0 R +/S /Normal +/Pg 46 0 R +>> +endobj +2514 0 obj +<< +/A 972 0 R +/K 56 +/P 4344 0 R +/S /Normal +/Pg 46 0 R +>> +endobj +2515 0 obj +<< +/A 972 0 R +/K 57 +/P 4345 0 R +/S /Normal +/Pg 46 0 R +>> +endobj +2516 0 obj +<< +/A 972 0 R +/K 58 +/P 4346 0 R +/S /Normal +/Pg 46 0 R +>> +endobj +2517 0 obj +<< +/A 972 0 R +/K 59 +/P 4347 0 R +/S /Normal +/Pg 46 0 R +>> +endobj +2518 0 obj +<< +/A 972 0 R +/K 60 +/P 4348 0 R +/S /Normal +/Pg 46 0 R +>> +endobj +2519 0 obj +<< +/A 972 0 R +/K 61 +/P 4349 0 R +/S /Normal +/Pg 46 0 R +>> +endobj +2520 0 obj +<< +/A 972 0 R +/K 62 +/P 4350 0 R +/S /Normal +/Pg 46 0 R +>> +endobj +2521 0 obj +<< +/A 972 0 R +/K 63 +/P 4351 0 R +/S /Normal +/Pg 46 0 R +>> +endobj +2522 0 obj +<< +/A 972 0 R +/K 64 +/P 4352 0 R +/S /Normal +/Pg 46 0 R +>> +endobj +2523 0 obj +<< +/A 972 0 R +/K 65 +/P 4353 0 R +/S /Normal +/Pg 46 0 R +>> +endobj +2524 0 obj +<< +/A 972 0 R +/K 66 +/P 4354 0 R +/S /Normal +/Pg 46 0 R +>> +endobj +2525 0 obj +<< +/A 972 0 R +/K 67 +/P 4355 0 R +/S /Normal +/Pg 46 0 R +>> +endobj +2526 0 obj +<< +/A 972 0 R +/K 68 +/P 4356 0 R +/S /Normal +/Pg 46 0 R +>> +endobj +2527 0 obj +<< +/A 972 0 R +/K 69 +/P 4357 0 R +/S /Normal +/Pg 46 0 R +>> +endobj +2528 0 obj +<< +/A 972 0 R +/K 70 +/P 4358 0 R +/S /Normal +/Pg 46 0 R +>> +endobj +2529 0 obj +<< +/A 972 0 R +/K 71 +/P 4359 0 R +/S /Normal +/Pg 46 0 R +>> +endobj +2530 0 obj +<< +/A 972 0 R +/K 72 +/P 4360 0 R +/S /Normal +/Pg 46 0 R +>> +endobj +2531 0 obj +<< +/A 972 0 R +/K 73 +/P 4361 0 R +/S /Normal +/Pg 46 0 R +>> +endobj +2532 0 obj +<< +/A 972 0 R +/K 74 +/P 4362 0 R +/S /Normal +/Pg 46 0 R +>> +endobj +2533 0 obj +<< +/A 972 0 R +/K 77 +/P 4363 0 R +/S /Normal +/Pg 46 0 R +>> +endobj +2534 0 obj +<< +/A 972 0 R +/K 78 +/P 4364 0 R +/S /Normal +/Pg 46 0 R +>> +endobj +2535 0 obj +<< +/A 972 0 R +/K 79 +/P 4365 0 R +/S /Normal +/Pg 46 0 R +>> +endobj +2536 0 obj +<< +/A 972 0 R +/K 80 +/P 4366 0 R +/S /Normal +/Pg 46 0 R +>> +endobj +2537 0 obj +<< +/A 972 0 R +/K 81 +/P 4367 0 R +/S /Normal +/Pg 46 0 R +>> +endobj +2538 0 obj +<< +/A 972 0 R +/K 82 +/P 4368 0 R +/S /Normal +/Pg 46 0 R +>> +endobj +2539 0 obj +<< +/A 972 0 R +/K 83 +/P 4369 0 R +/S /Normal +/Pg 46 0 R +>> +endobj +2540 0 obj +<< +/A 972 0 R +/K 84 +/P 4370 0 R +/S /Normal +/Pg 46 0 R +>> +endobj +2541 0 obj +<< +/A 972 0 R +/K 85 +/P 4371 0 R +/S /Normal +/Pg 46 0 R +>> +endobj +2542 0 obj +<< +/A 972 0 R +/K 86 +/P 4372 0 R +/S /Normal +/Pg 46 0 R +>> +endobj +2543 0 obj +<< +/A 972 0 R +/K 87 +/P 4373 0 R +/S /Normal +/Pg 46 0 R +>> +endobj +2544 0 obj +<< +/A 972 0 R +/K 88 +/P 4374 0 R +/S /Note#20Heading +/Pg 46 0 R +>> +endobj +2545 0 obj +<< +/A 972 0 R +/K 89 +/P 4375 0 R +/S /Normal +/Pg 46 0 R +>> +endobj +2546 0 obj +<< +/A 972 0 R +/K 90 +/P 4376 0 R +/S /Normal +/Pg 46 0 R +>> +endobj +2547 0 obj +<< +/A 972 0 R +/K 91 +/P 4377 0 R +/S /Normal +/Pg 46 0 R +>> +endobj +2548 0 obj +<< +/A 972 0 R +/K 92 +/P 4378 0 R +/S /Normal +/Pg 46 0 R +>> +endobj +2549 0 obj +<< +/A 972 0 R +/K 93 +/P 4379 0 R +/S /Normal +/Pg 46 0 R +>> +endobj +2550 0 obj +<< +/A 972 0 R +/K 94 +/P 4380 0 R +/S /Normal +/Pg 46 0 R +>> +endobj +2551 0 obj +<< +/A 972 0 R +/K 95 +/P 4381 0 R +/S /Normal +/Pg 46 0 R +>> +endobj +2552 0 obj +<< +/A 972 0 R +/K 96 +/P 4382 0 R +/S /Normal +/Pg 46 0 R +>> +endobj +2553 0 obj +<< +/A 972 0 R +/K 97 +/P 4383 0 R +/S /Normal +/Pg 46 0 R +>> +endobj +2554 0 obj +<< +/A 972 0 R +/K 98 +/P 4384 0 R +/S /Normal +/Pg 46 0 R +>> +endobj +2555 0 obj +<< +/A 972 0 R +/K 99 +/P 4385 0 R +/S /Normal +/Pg 46 0 R +>> +endobj +2556 0 obj +<< +/A 972 0 R +/K 100 +/P 4386 0 R +/S /Normal +/Pg 46 0 R +>> +endobj +2557 0 obj +<< +/A 972 0 R +/K 7 +/P 4387 0 R +/S /Normal +/Pg 47 0 R +>> +endobj +2558 0 obj +<< +/A 972 0 R +/K 8 +/P 4388 0 R +/S /Normal +/Pg 47 0 R +>> +endobj +2559 0 obj +<< +/A 972 0 R +/K 9 +/P 4389 0 R +/S /Normal +/Pg 47 0 R +>> +endobj +2560 0 obj +<< +/A 972 0 R +/K 10 +/P 4390 0 R +/S /Normal +/Pg 47 0 R +>> +endobj +2561 0 obj +<< +/A 972 0 R +/K 11 +/P 4391 0 R +/S /Normal +/Pg 47 0 R +>> +endobj +2562 0 obj +<< +/A 972 0 R +/K 12 +/P 4392 0 R +/S /Normal +/Pg 47 0 R +>> +endobj +2563 0 obj +<< +/A 972 0 R +/K 13 +/P 4393 0 R +/S /Normal +/Pg 47 0 R +>> +endobj +2564 0 obj +<< +/A 972 0 R +/K 14 +/P 4394 0 R +/S /Normal +/Pg 47 0 R +>> +endobj +2565 0 obj +<< +/A 972 0 R +/K 15 +/P 4395 0 R +/S /Normal +/Pg 47 0 R +>> +endobj +2566 0 obj +<< +/A 972 0 R +/K 16 +/P 4396 0 R +/S /Normal +/Pg 47 0 R +>> +endobj +2567 0 obj +<< +/A 972 0 R +/K 17 +/P 4397 0 R +/S /Normal +/Pg 47 0 R +>> +endobj +2568 0 obj +<< +/A 972 0 R +/K 18 +/P 4398 0 R +/S /Normal +/Pg 47 0 R +>> +endobj +2569 0 obj +<< +/A 972 0 R +/K 19 +/P 4399 0 R +/S /Normal +/Pg 47 0 R +>> +endobj +2570 0 obj +<< +/A 972 0 R +/K 20 +/P 4400 0 R +/S /Normal +/Pg 47 0 R +>> +endobj +2571 0 obj +<< +/A 972 0 R +/K 21 +/P 4401 0 R +/S /Normal +/Pg 47 0 R +>> +endobj +2572 0 obj +<< +/A 972 0 R +/K 22 +/P 4402 0 R +/S /Normal +/Pg 47 0 R +>> +endobj +2573 0 obj +<< +/A 972 0 R +/K 23 +/P 4403 0 R +/S /Normal +/Pg 47 0 R +>> +endobj +2574 0 obj +<< +/A 972 0 R +/K 24 +/P 4404 0 R +/S /Normal +/Pg 47 0 R +>> +endobj +2575 0 obj +<< +/A 972 0 R +/K 26 +/P 4405 0 R +/S /Normal +/Pg 47 0 R +>> +endobj +2576 0 obj +<< +/A 972 0 R +/K 27 +/P 4406 0 R +/S /Normal +/Pg 47 0 R +>> +endobj +2577 0 obj +<< +/A 972 0 R +/K 28 +/P 4407 0 R +/S /Normal +/Pg 47 0 R +>> +endobj +2578 0 obj +<< +/A 972 0 R +/K 29 +/P 4408 0 R +/S /Normal +/Pg 47 0 R +>> +endobj +2579 0 obj +<< +/A 972 0 R +/K 30 +/P 4409 0 R +/S /Normal +/Pg 47 0 R +>> +endobj +2580 0 obj +<< +/A 972 0 R +/K 31 +/P 4410 0 R +/S /Normal +/Pg 47 0 R +>> +endobj +2581 0 obj +<< +/A 972 0 R +/K 32 +/P 4411 0 R +/S /Normal +/Pg 47 0 R +>> +endobj +2582 0 obj +<< +/A 972 0 R +/K 33 +/P 4412 0 R +/S /Normal +/Pg 47 0 R +>> +endobj +2583 0 obj +<< +/A 972 0 R +/K 34 +/P 4413 0 R +/S /Normal +/Pg 47 0 R +>> +endobj +2584 0 obj +<< +/A 972 0 R +/K 35 +/P 4414 0 R +/S /Normal +/Pg 47 0 R +>> +endobj +2585 0 obj +<< +/A 972 0 R +/K 36 +/P 4415 0 R +/S /Normal +/Pg 47 0 R +>> +endobj +2586 0 obj +<< +/A 972 0 R +/K 37 +/P 4416 0 R +/S /Normal +/Pg 47 0 R +>> +endobj +2587 0 obj +<< +/A 972 0 R +/K 38 +/P 4417 0 R +/S /Normal +/Pg 47 0 R +>> +endobj +2588 0 obj +<< +/A 972 0 R +/K 39 +/P 4418 0 R +/S /Normal +/Pg 47 0 R +>> +endobj +2589 0 obj +<< +/A 972 0 R +/K 40 +/P 4419 0 R +/S /Normal +/Pg 47 0 R +>> +endobj +2590 0 obj +<< +/A 972 0 R +/K 41 +/P 4420 0 R +/S /Normal +/Pg 47 0 R +>> +endobj +2591 0 obj +<< +/A 972 0 R +/K 42 +/P 4421 0 R +/S /Normal +/Pg 47 0 R +>> +endobj +2592 0 obj +<< +/A 972 0 R +/K 43 +/P 4422 0 R +/S /Normal +/Pg 47 0 R +>> +endobj +2593 0 obj +<< +/A 972 0 R +/K 44 +/P 4423 0 R +/S /Normal +/Pg 47 0 R +>> +endobj +2594 0 obj +<< +/A 972 0 R +/K 45 +/P 4424 0 R +/S /Normal +/Pg 47 0 R +>> +endobj +2595 0 obj +<< +/A 972 0 R +/K 46 +/P 4425 0 R +/S /Normal +/Pg 47 0 R +>> +endobj +2596 0 obj +<< +/A 972 0 R +/K 3 +/P 4426 0 R +/S /header +/Pg 51 0 R +>> +endobj +2597 0 obj +<< +/A 972 0 R +/K 4 +/P 4427 0 R +/S /header +/Pg 51 0 R +>> +endobj +2598 0 obj +<< +/A 972 0 R +/K 5 +/P 4428 0 R +/S /header +/Pg 51 0 R +>> +endobj +2599 0 obj +<< +/A 972 0 R +/K 6 +/P 4429 0 R +/S /header +/Pg 51 0 R +>> +endobj +2600 0 obj +<< +/A 972 0 R +/K 7 +/P 4430 0 R +/S /header +/Pg 51 0 R +>> +endobj +2601 0 obj +<< +/A 972 0 R +/K 8 +/P 4431 0 R +/S /header +/Pg 51 0 R +>> +endobj +2602 0 obj +<< +/A 972 0 R +/K 9 +/P 4432 0 R +/S /header +/Pg 51 0 R +>> +endobj +2603 0 obj +<< +/A 973 0 R +/K 10 +/P 4433 0 R +/S /header +/Pg 51 0 R +>> +endobj +2604 0 obj +<< +/A 973 0 R +/K 11 +/P 4434 0 R +/S /header +/Pg 51 0 R +>> +endobj +2605 0 obj +<< +/A 972 0 R +/K 12 +/P 4435 0 R +/S /header +/Pg 51 0 R +>> +endobj +2606 0 obj +<< +/A 973 0 R +/K 13 +/P 4436 0 R +/S /header +/Pg 51 0 R +>> +endobj +2607 0 obj +<< +/A 973 0 R +/K 14 +/P 4437 0 R +/S /header +/Pg 51 0 R +>> +endobj +2608 0 obj +<< +/A 972 0 R +/K 15 +/P 4438 0 R +/S /header +/Pg 51 0 R +>> +endobj +2609 0 obj +<< +/A 973 0 R +/K 16 +/P 4439 0 R +/S /header +/Pg 51 0 R +>> +endobj +2610 0 obj +<< +/A 973 0 R +/K 17 +/P 4440 0 R +/S /header +/Pg 51 0 R +>> +endobj +2611 0 obj +<< +/A 972 0 R +/K 18 +/P 4441 0 R +/S /header +/Pg 51 0 R +>> +endobj +2612 0 obj +<< +/A 973 0 R +/K 19 +/P 4442 0 R +/S /header +/Pg 51 0 R +>> +endobj +2613 0 obj +<< +/A 973 0 R +/K 20 +/P 4443 0 R +/S /header +/Pg 51 0 R +>> +endobj +2614 0 obj +<< +/A 972 0 R +/K 21 +/P 4444 0 R +/S /header +/Pg 51 0 R +>> +endobj +2615 0 obj +<< +/A 973 0 R +/K 22 +/P 4445 0 R +/S /header +/Pg 51 0 R +>> +endobj +2616 0 obj +<< +/A 973 0 R +/K 23 +/P 4446 0 R +/S /header +/Pg 51 0 R +>> +endobj +2617 0 obj +<< +/A 972 0 R +/K 24 +/P 4447 0 R +/S /header +/Pg 51 0 R +>> +endobj +2618 0 obj +<< +/A 973 0 R +/K 25 +/P 4448 0 R +/S /header +/Pg 51 0 R +>> +endobj +2619 0 obj +<< +/A 973 0 R +/K 26 +/P 4449 0 R +/S /header +/Pg 51 0 R +>> +endobj +2620 0 obj +<< +/A 972 0 R +/K 27 +/P 4450 0 R +/S /header +/Pg 51 0 R +>> +endobj +2621 0 obj +<< +/A 973 0 R +/K 28 +/P 4451 0 R +/S /header +/Pg 51 0 R +>> +endobj +2622 0 obj +<< +/A 973 0 R +/K 29 +/P 4452 0 R +/S /header +/Pg 51 0 R +>> +endobj +2623 0 obj +<< +/A 972 0 R +/K 30 +/P 4453 0 R +/S /header +/Pg 51 0 R +>> +endobj +2624 0 obj +<< +/A 973 0 R +/K 31 +/P 4454 0 R +/S /header +/Pg 51 0 R +>> +endobj +2625 0 obj +<< +/A 973 0 R +/K 32 +/P 4455 0 R +/S /header +/Pg 51 0 R +>> +endobj +2626 0 obj +<< +/A 972 0 R +/K 33 +/P 4456 0 R +/S /header +/Pg 51 0 R +>> +endobj +2627 0 obj +<< +/A 973 0 R +/K 34 +/P 4457 0 R +/S /header +/Pg 51 0 R +>> +endobj +2628 0 obj +<< +/A 973 0 R +/K 35 +/P 4458 0 R +/S /header +/Pg 51 0 R +>> +endobj +2629 0 obj +<< +/A 972 0 R +/K 36 +/P 4459 0 R +/S /header +/Pg 51 0 R +>> +endobj +2630 0 obj +<< +/A 973 0 R +/K 37 +/P 4460 0 R +/S /header +/Pg 51 0 R +>> +endobj +2631 0 obj +<< +/A 973 0 R +/K 38 +/P 4461 0 R +/S /header +/Pg 51 0 R +>> +endobj +2632 0 obj +<< +/A 972 0 R +/K 39 +/P 4462 0 R +/S /header +/Pg 51 0 R +>> +endobj +2633 0 obj +<< +/A 973 0 R +/K 40 +/P 4463 0 R +/S /header +/Pg 51 0 R +>> +endobj +2634 0 obj +<< +/A 973 0 R +/K 41 +/P 4464 0 R +/S /header +/Pg 51 0 R +>> +endobj +2635 0 obj +<< +/A 972 0 R +/K 42 +/P 4465 0 R +/S /header +/Pg 51 0 R +>> +endobj +2636 0 obj +<< +/A 973 0 R +/K 43 +/P 4466 0 R +/S /header +/Pg 51 0 R +>> +endobj +2637 0 obj +<< +/A 973 0 R +/K 44 +/P 4467 0 R +/S /header +/Pg 51 0 R +>> +endobj +2638 0 obj +<< +/A 972 0 R +/K 45 +/P 4468 0 R +/S /header +/Pg 51 0 R +>> +endobj +2639 0 obj +<< +/A 973 0 R +/K 46 +/P 4469 0 R +/S /header +/Pg 51 0 R +>> +endobj +2640 0 obj +<< +/A 973 0 R +/K 47 +/P 4470 0 R +/S /header +/Pg 51 0 R +>> +endobj +2641 0 obj +<< +/A 972 0 R +/K 48 +/P 4471 0 R +/S /header +/Pg 51 0 R +>> +endobj +2642 0 obj +<< +/A 973 0 R +/K 49 +/P 4472 0 R +/S /header +/Pg 51 0 R +>> +endobj +2643 0 obj +<< +/A 973 0 R +/K 50 +/P 4473 0 R +/S /header +/Pg 51 0 R +>> +endobj +2644 0 obj +<< +/A 972 0 R +/K 51 +/P 4474 0 R +/S /header +/Pg 51 0 R +>> +endobj +2645 0 obj +<< +/A 973 0 R +/K 52 +/P 4475 0 R +/S /header +/Pg 51 0 R +>> +endobj +2646 0 obj +<< +/A 973 0 R +/K 53 +/P 4476 0 R +/S /header +/Pg 51 0 R +>> +endobj +2647 0 obj +<< +/A 972 0 R +/K 54 +/P 4477 0 R +/S /header +/Pg 51 0 R +>> +endobj +2648 0 obj +<< +/A 973 0 R +/K 55 +/P 4478 0 R +/S /header +/Pg 51 0 R +>> +endobj +2649 0 obj +<< +/A 973 0 R +/K 56 +/P 4479 0 R +/S /header +/Pg 51 0 R +>> +endobj +2650 0 obj +<< +/A 972 0 R +/K 57 +/P 4480 0 R +/S /header +/Pg 51 0 R +>> +endobj +2651 0 obj +<< +/A 973 0 R +/K 58 +/P 4481 0 R +/S /header +/Pg 51 0 R +>> +endobj +2652 0 obj +<< +/A 973 0 R +/K 59 +/P 4482 0 R +/S /header +/Pg 51 0 R +>> +endobj +2653 0 obj +<< +/A 972 0 R +/K 60 +/P 4483 0 R +/S /header +/Pg 51 0 R +>> +endobj +2654 0 obj +<< +/A 973 0 R +/K 61 +/P 4484 0 R +/S /header +/Pg 51 0 R +>> +endobj +2655 0 obj +<< +/A 973 0 R +/K 62 +/P 4485 0 R +/S /header +/Pg 51 0 R +>> +endobj +2656 0 obj +<< +/A 972 0 R +/K 63 +/P 4486 0 R +/S /header +/Pg 51 0 R +>> +endobj +2657 0 obj +<< +/A 973 0 R +/K 64 +/P 4487 0 R +/S /header +/Pg 51 0 R +>> +endobj +2658 0 obj +<< +/A 973 0 R +/K 65 +/P 4488 0 R +/S /header +/Pg 51 0 R +>> +endobj +2659 0 obj +<< +/A 972 0 R +/K 66 +/P 4489 0 R +/S /header +/Pg 51 0 R +>> +endobj +2660 0 obj +<< +/A 973 0 R +/K 67 +/P 4490 0 R +/S /header +/Pg 51 0 R +>> +endobj +2661 0 obj +<< +/A 973 0 R +/K 68 +/P 4491 0 R +/S /header +/Pg 51 0 R +>> +endobj +2662 0 obj +<< +/A 972 0 R +/K 69 +/P 4492 0 R +/S /header +/Pg 51 0 R +>> +endobj +2663 0 obj +<< +/A 973 0 R +/K 70 +/P 4493 0 R +/S /header +/Pg 51 0 R +>> +endobj +2664 0 obj +<< +/A 973 0 R +/K 71 +/P 4494 0 R +/S /header +/Pg 51 0 R +>> +endobj +2665 0 obj +<< +/A 972 0 R +/K 72 +/P 4495 0 R +/S /header +/Pg 51 0 R +>> +endobj +2666 0 obj +<< +/A 973 0 R +/K 73 +/P 4496 0 R +/S /header +/Pg 51 0 R +>> +endobj +2667 0 obj +<< +/A 973 0 R +/K 74 +/P 4497 0 R +/S /header +/Pg 51 0 R +>> +endobj +2668 0 obj +<< +/A 972 0 R +/K 75 +/P 4498 0 R +/S /header +/Pg 51 0 R +>> +endobj +2669 0 obj +<< +/A 973 0 R +/K 76 +/P 4499 0 R +/S /header +/Pg 51 0 R +>> +endobj +2670 0 obj +<< +/A 973 0 R +/K 77 +/P 4500 0 R +/S /header +/Pg 51 0 R +>> +endobj +2671 0 obj +<< +/A 972 0 R +/K 78 +/P 4501 0 R +/S /header +/Pg 51 0 R +>> +endobj +2672 0 obj +<< +/A 973 0 R +/K 79 +/P 4502 0 R +/S /header +/Pg 51 0 R +>> +endobj +2673 0 obj +<< +/A 973 0 R +/K 80 +/P 4503 0 R +/S /header +/Pg 51 0 R +>> +endobj +2674 0 obj +<< +/A 972 0 R +/K 86 +/P 4504 0 R +/S /header +/Pg 51 0 R +>> +endobj +2675 0 obj +<< +/A 972 0 R +/K 87 +/P 4505 0 R +/S /header +/Pg 51 0 R +>> +endobj +2676 0 obj +<< +/A 972 0 R +/K 88 +/P 4506 0 R +/S /header +/Pg 51 0 R +>> +endobj +2677 0 obj +<< +/A 972 0 R +/K 89 +/P 4507 0 R +/S /header +/Pg 51 0 R +>> +endobj +2678 0 obj +<< +/A 972 0 R +/K 90 +/P 4508 0 R +/S /header +/Pg 51 0 R +>> +endobj +2679 0 obj +<< +/A 972 0 R +/K 91 +/P 4509 0 R +/S /header +/Pg 51 0 R +>> +endobj +2680 0 obj +<< +/A 972 0 R +/K 92 +/P 4510 0 R +/S /header +/Pg 51 0 R +>> +endobj +2681 0 obj +<< +/A 972 0 R +/K 93 +/P 4511 0 R +/S /header +/Pg 51 0 R +>> +endobj +2682 0 obj +<< +/A 972 0 R +/K 94 +/P 4512 0 R +/S /header +/Pg 51 0 R +>> +endobj +2683 0 obj +<< +/A 972 0 R +/K 95 +/P 4513 0 R +/S /header +/Pg 51 0 R +>> +endobj +2684 0 obj +<< +/A 973 0 R +/K 96 +/P 4514 0 R +/S /header +/Pg 51 0 R +>> +endobj +2685 0 obj +<< +/A 972 0 R +/K 97 +/P 4515 0 R +/S /header +/Pg 51 0 R +>> +endobj +2686 0 obj +<< +/A 972 0 R +/K 98 +/P 4516 0 R +/S /header +/Pg 51 0 R +>> +endobj +2687 0 obj +<< +/A 973 0 R +/K 99 +/P 4517 0 R +/S /header +/Pg 51 0 R +>> +endobj +2688 0 obj +<< +/A 972 0 R +/K 100 +/P 4518 0 R +/S /header +/Pg 51 0 R +>> +endobj +2689 0 obj +<< +/A 972 0 R +/K 101 +/P 4519 0 R +/S /header +/Pg 51 0 R +>> +endobj +2690 0 obj +<< +/A 973 0 R +/K 102 +/P 4520 0 R +/S /header +/Pg 51 0 R +>> +endobj +2691 0 obj +<< +/A 972 0 R +/K 103 +/P 4521 0 R +/S /header +/Pg 51 0 R +>> +endobj +2692 0 obj +<< +/A 972 0 R +/K 104 +/P 4522 0 R +/S /header +/Pg 51 0 R +>> +endobj +2693 0 obj +<< +/A 973 0 R +/K 105 +/P 4523 0 R +/S /header +/Pg 51 0 R +>> +endobj +2694 0 obj +<< +/A 972 0 R +/K 106 +/P 4524 0 R +/S /header +/Pg 51 0 R +>> +endobj +2695 0 obj +<< +/A 972 0 R +/K 107 +/P 4525 0 R +/S /header +/Pg 51 0 R +>> +endobj +2696 0 obj +<< +/A 973 0 R +/K 108 +/P 4526 0 R +/S /header +/Pg 51 0 R +>> +endobj +2697 0 obj +<< +/A 972 0 R +/K 109 +/P 4527 0 R +/S /header +/Pg 51 0 R +>> +endobj +2698 0 obj +<< +/A 972 0 R +/K 110 +/P 4528 0 R +/S /header +/Pg 51 0 R +>> +endobj +2699 0 obj +<< +/A 973 0 R +/K 111 +/P 4529 0 R +/S /header +/Pg 51 0 R +>> +endobj +2700 0 obj +<< +/A 972 0 R +/K 112 +/P 4530 0 R +/S /header +/Pg 51 0 R +>> +endobj +2701 0 obj +<< +/A 972 0 R +/K 113 +/P 4531 0 R +/S /header +/Pg 51 0 R +>> +endobj +2702 0 obj +<< +/A 973 0 R +/K 114 +/P 4532 0 R +/S /header +/Pg 51 0 R +>> +endobj +2703 0 obj +<< +/A 972 0 R +/K 115 +/P 4533 0 R +/S /header +/Pg 51 0 R +>> +endobj +2704 0 obj +<< +/A 972 0 R +/K 116 +/P 4534 0 R +/S /header +/Pg 51 0 R +>> +endobj +2705 0 obj +<< +/A 973 0 R +/K 117 +/P 4535 0 R +/S /header +/Pg 51 0 R +>> +endobj +2706 0 obj +<< +/A 972 0 R +/K 118 +/P 4536 0 R +/S /header +/Pg 51 0 R +>> +endobj +2707 0 obj +<< +/A 972 0 R +/K 119 +/P 4537 0 R +/S /header +/Pg 51 0 R +>> +endobj +2708 0 obj +<< +/A 973 0 R +/K 120 +/P 4538 0 R +/S /header +/Pg 51 0 R +>> +endobj +2709 0 obj +<< +/A 972 0 R +/K 121 +/P 4539 0 R +/S /header +/Pg 51 0 R +>> +endobj +2710 0 obj +<< +/A 972 0 R +/K 122 +/P 4540 0 R +/S /header +/Pg 51 0 R +>> +endobj +2711 0 obj +<< +/A 973 0 R +/K 123 +/P 4541 0 R +/S /header +/Pg 51 0 R +>> +endobj +2712 0 obj +<< +/A 972 0 R +/K 124 +/P 4542 0 R +/S /header +/Pg 51 0 R +>> +endobj +2713 0 obj +<< +/A 972 0 R +/K 125 +/P 4543 0 R +/S /header +/Pg 51 0 R +>> +endobj +2714 0 obj +<< +/A 4544 0 R +/K 126 +/P 4545 0 R +/S /header +/Pg 51 0 R +>> +endobj +2715 0 obj +<< +/A 972 0 R +/K 127 +/P 4546 0 R +/S /header +/Pg 51 0 R +>> +endobj +2716 0 obj +<< +/A 972 0 R +/K 128 +/P 4547 0 R +/S /header +/Pg 51 0 R +>> +endobj +2717 0 obj +<< +/A 973 0 R +/K 129 +/P 4548 0 R +/S /header +/Pg 51 0 R +>> +endobj +2718 0 obj +<< +/A 973 0 R +/K 130 +/P 4549 0 R +/S /Normal +/Pg 51 0 R +>> +endobj +2719 0 obj +<< +/A 972 0 R +/K 131 +/P 4550 0 R +/S /Normal +/Pg 51 0 R +>> +endobj +2720 0 obj +<< +/A 972 0 R +/K 132 +/P 4550 0 R +/S /Normal +/Pg 51 0 R +>> +endobj +2721 0 obj +<< +/A 972 0 R +/K 133 +/P 4550 0 R +/S /Normal +/Pg 51 0 R +>> +endobj +2722 0 obj +<< +/A 972 0 R +/K 134 +/P 4550 0 R +/S /Normal +/Pg 51 0 R +>> +endobj +2723 0 obj +<< +/A 972 0 R +/K 135 +/P 4551 0 R +/S /Normal +/Pg 51 0 R +>> +endobj +2724 0 obj +<< +/A 972 0 R +/K 136 +/P 4552 0 R +/S /header +/Pg 51 0 R +>> +endobj +2725 0 obj +<< +/A 972 0 R +/K 137 +/P 4553 0 R +/S /header +/Pg 51 0 R +>> +endobj +2726 0 obj +<< +/A 973 0 R +/K 138 +/P 4554 0 R +/S /header +/Pg 51 0 R +>> +endobj +2727 0 obj +<< +/A 972 0 R +/K 139 +/P 4555 0 R +/S /header +/Pg 51 0 R +>> +endobj +2728 0 obj +<< +/A 972 0 R +/K 140 +/P 4556 0 R +/S /header +/Pg 51 0 R +>> +endobj +2729 0 obj +<< +/A 973 0 R +/K 141 +/P 4557 0 R +/S /header +/Pg 51 0 R +>> +endobj +2730 0 obj +<< +/A 972 0 R +/K 142 +/P 4558 0 R +/S /header +/Pg 51 0 R +>> +endobj +2731 0 obj +<< +/A 972 0 R +/K 143 +/P 4559 0 R +/S /header +/Pg 51 0 R +>> +endobj +2732 0 obj +<< +/A 973 0 R +/K 144 +/P 4560 0 R +/S /header +/Pg 51 0 R +>> +endobj +2733 0 obj +<< +/A 972 0 R +/K 145 +/P 4561 0 R +/S /header +/Pg 51 0 R +>> +endobj +2734 0 obj +<< +/A 972 0 R +/K 146 +/P 4562 0 R +/S /header +/Pg 51 0 R +>> +endobj +2735 0 obj +<< +/A 973 0 R +/K 147 +/P 4563 0 R +/S /header +/Pg 51 0 R +>> +endobj +2736 0 obj +<< +/A 972 0 R +/K 148 +/P 4564 0 R +/S /header +/Pg 51 0 R +>> +endobj +2737 0 obj +<< +/A 972 0 R +/K 149 +/P 4565 0 R +/S /header +/Pg 51 0 R +>> +endobj +2738 0 obj +<< +/A 973 0 R +/K 150 +/P 4566 0 R +/S /header +/Pg 51 0 R +>> +endobj +2739 0 obj +<< +/A 972 0 R +/K 151 +/P 4567 0 R +/S /header +/Pg 51 0 R +>> +endobj +2740 0 obj +<< +/A 972 0 R +/K 152 +/P 4567 0 R +/S /header +/Pg 51 0 R +>> +endobj +2741 0 obj +<< +/A 972 0 R +/K 153 +/P 4567 0 R +/S /header +/Pg 51 0 R +>> +endobj +2742 0 obj +<< +/A 972 0 R +/K 154 +/P 4567 0 R +/S /header +/Pg 51 0 R +>> +endobj +2743 0 obj +<< +/A 972 0 R +/K 155 +/P 4567 0 R +/S /header +/Pg 51 0 R +>> +endobj +2744 0 obj +<< +/A 972 0 R +/K 156 +/P 4567 0 R +/S /header +/Pg 51 0 R +>> +endobj +2745 0 obj +<< +/A 972 0 R +/K 157 +/P 4567 0 R +/S /header +/Pg 51 0 R +>> +endobj +2746 0 obj +<< +/A 972 0 R +/K 158 +/P 4567 0 R +/S /header +/Pg 51 0 R +>> +endobj +2747 0 obj +<< +/A 972 0 R +/K 159 +/P 4568 0 R +/S /header +/Pg 51 0 R +>> +endobj +2748 0 obj +<< +/A 972 0 R +/K 160 +/P 4569 0 R +/S /header +/Pg 51 0 R +>> +endobj +2749 0 obj +<< +/A 972 0 R +/K 161 +/P 4570 0 R +/S /header +/Pg 51 0 R +>> +endobj +2750 0 obj +<< +/A 973 0 R +/K 162 +/P 4571 0 R +/S /header +/Pg 51 0 R +>> +endobj +2751 0 obj +<< +/A 972 0 R +/K 163 +/P 4572 0 R +/S /header +/Pg 51 0 R +>> +endobj +2752 0 obj +<< +/A 972 0 R +/K 164 +/P 4573 0 R +/S /header +/Pg 51 0 R +>> +endobj +2753 0 obj +<< +/A 973 0 R +/K 165 +/P 4574 0 R +/S /header +/Pg 51 0 R +>> +endobj +2754 0 obj +<< +/A 972 0 R +/K 166 +/P 4575 0 R +/S /header +/Pg 51 0 R +>> +endobj +2755 0 obj +<< +/A 972 0 R +/K 167 +/P 4576 0 R +/S /header +/Pg 51 0 R +>> +endobj +2756 0 obj +<< +/A 973 0 R +/K 168 +/P 4577 0 R +/S /header +/Pg 51 0 R +>> +endobj +2757 0 obj +<< +/A 972 0 R +/K 169 +/P 4578 0 R +/S /header +/Pg 51 0 R +>> +endobj +2758 0 obj +<< +/A 972 0 R +/K 170 +/P 4579 0 R +/S /header +/Pg 51 0 R +>> +endobj +2759 0 obj +<< +/A 973 0 R +/K 171 +/P 4580 0 R +/S /header +/Pg 51 0 R +>> +endobj +2760 0 obj +<< +/A 972 0 R +/K 172 +/P 4581 0 R +/S /header +/Pg 51 0 R +>> +endobj +2761 0 obj +<< +/A 972 0 R +/K 173 +/P 4582 0 R +/S /header +/Pg 51 0 R +>> +endobj +2762 0 obj +<< +/A 973 0 R +/K 174 +/P 4583 0 R +/S /header +/Pg 51 0 R +>> +endobj +2763 0 obj +<< +/A 972 0 R +/K 175 +/P 4584 0 R +/S /header +/Pg 51 0 R +>> +endobj +2764 0 obj +<< +/A 972 0 R +/K 176 +/P 4584 0 R +/S /header +/Pg 51 0 R +>> +endobj +2765 0 obj +<< +/A 972 0 R +/K 177 +/P 4584 0 R +/S /header +/Pg 51 0 R +>> +endobj +2766 0 obj +<< +/A 972 0 R +/K 178 +/P 4584 0 R +/S /header +/Pg 51 0 R +>> +endobj +2767 0 obj +<< +/A 972 0 R +/K 179 +/P 4585 0 R +/S /header +/Pg 51 0 R +>> +endobj +2768 0 obj +<< +/A 972 0 R +/K 180 +/P 4586 0 R +/S /Normal +/Pg 51 0 R +>> +endobj +2769 0 obj +<< +/A 972 0 R +/K 181 +/P 4587 0 R +/S /header +/Pg 51 0 R +>> +endobj +2770 0 obj +<< +/A 973 0 R +/K 182 +/P 4588 0 R +/S /header +/Pg 51 0 R +>> +endobj +2771 0 obj +<< +/A 972 0 R +/K 183 +/P 4589 0 R +/S /Normal +/Pg 51 0 R +>> +endobj +2772 0 obj +<< +/A 972 0 R +/K 184 +/P 4589 0 R +/S /Normal +/Pg 51 0 R +>> +endobj +2773 0 obj +<< +/A 972 0 R +/K 185 +/P 4590 0 R +/S /Normal +/Pg 51 0 R +>> +endobj +2774 0 obj +<< +/A 972 0 R +/K 186 +/P 4591 0 R +/S /header +/Pg 51 0 R +>> +endobj +2775 0 obj +<< +/A 972 0 R +/K 187 +/P 4592 0 R +/S /header +/Pg 51 0 R +>> +endobj +2776 0 obj +<< +/A 973 0 R +/K 188 +/P 4593 0 R +/S /header +/Pg 51 0 R +>> +endobj +2777 0 obj +<< +/D [24 0 R /XYZ 0 472 null] +/S /GoTo +>> +endobj +2778 0 obj +<< +/Parent 9 0 R +/A 4594 0 R +/Next 4595 0 R +/Prev 796 0 R +/Title +>> +endobj +2779 0 obj +<< +/D [52 0 R /XYZ 0 692 null] +/S /GoTo +>> +endobj +2780 0 obj +<< +/D [52 0 R /XYZ 0 508 null] +/S /GoTo +>> +endobj +2781 0 obj +<< +/First 4596 0 R +/Parent 800 0 R +/A 4597 0 R +/Next 2783 0 R +/Count 2 +/Last 4598 0 R +/Title +>> +endobj +2782 0 obj +<< +/D [48 0 R /XYZ 0 769 null] +/S /GoTo +>> +endobj +2783 0 obj +<< +/First 4599 0 R +/Parent 800 0 R +/A 4600 0 R +/Count 2 +/Last 4601 0 R +/Prev 2781 0 R +/Title +>> +endobj +2784 0 obj +<< +/First 4602 0 R +/Parent 9 0 R +/A 4603 0 R +/Next 800 0 R +/Count 25 +/Last 4604 0 R +/Prev 4605 0 R +/Title +>> +endobj +2785 0 obj +<< +/BitsPerComponent 8 +/Predictor 15 +/Columns 43 +/Colors 3 +>> +endobj +2786 0 obj +<< +/Length 413 +/Type /XObject +/Subtype /Image +/Filter /FlateDecode +/BitsPerComponent 8 +/Width 43 +/Height 44 +/ColorSpace /DeviceGray +>> +stream +x+qF-9Hiܴ˔&QR;( ZJE0',8(R~Pb\f}W{g}'>qk__TC,UsrH`< qDm+J'W8!j=!=Uro 8Lsm l[zmR/)A:3D4J?P*:;-m%I2m)`[l-!"5t!$8tG?~=`=D("ZW\cUSDh0M= :B[Zj?zMyYG3Z*Eq[5, |,'>2Ӝ4uG{^0(ZK\9E24vЪ\Ywɒs teJx$}6~ٿOƇ +endstream +endobj +2787 0 obj +<< +/StemV 82 +/FontName /TimesNewRomanPSMT +/FontStretch /Normal +/FontWeight 400 +/Flags 34 +/Descent -216 +/FontBBox [-568 -307 2000 1007] +/Ascent 891 +/FontFamily (Times New Roman) +/CapHeight 656 +/XHeight -546 +/Type /FontDescriptor +/ItalicAngle 0 +>> +endobj +2788 0 obj +<< +/StemV 136 +/FontName /TimesNewRomanPS-BoldMT +/FontStretch /Normal +/FontWeight 700 +/Flags 34 +/Descent -216 +/FontBBox [-558 -307 2000 1026] +/Ascent 891 +/FontFamily (Times New Roman) +/CapHeight 656 +/XHeight -546 +/Type /FontDescriptor +/ItalicAngle 0 +>> +endobj +2789 0 obj +<< +/Subtype /CIDFontType2 +/FontDescriptor 4606 0 R +/BaseFont /PKKFJM+SimSun +/W [3 [500] + 8 [500] + 11 12 500 14 29 500 +32 [500] + 36 51 500 53 59 500 61 [500] +68 76 500 78 83 500 85 93 500] +/CIDSystemInfo << +/Supplement 0 +/Ordering (Identity) +/Registry (Adobe) +>> +/DW 1000 +/Type /Font +>> +endobj +2790 0 obj +<< +/Length 3214 +/Filter /FlateDecode +>> +stream +H|IFwiE<ܚ@ y_U% V[;wcx ffDdL4\>>q{v}yn^~;/7n{~_nO/?_?>_n߿{X>??ޞ~^^տ7sik=ߜؾ~{onclׇ[nù:~c *P?ox%v.AָAθ!AGP2N;h"?A>owQ\E1=,Aa5_E!(* +jP.HEqvQm8lEZ2 9hꐡv͜ٹsG߂D;Oqs%nDTt.,</Fl$}[ +e )F sBfEʄ]~Ⱥxpnܡ8lOg>,! +69ǍR>E"97\iϾRNHr`'C9W84CMT/庋f(/|FvӍrNg g3 4\Br":r"_to;/H,@W2d9d4ymzFdV<|Jl=)dk'Y'U& 5#"sf- \y`:G7뉶mQ1vݗ:r%B(=*&!+&;9ȹ"s}g笝z~NvKH8Ev"]EVH1Ibr@6dՉ>/iNfFoG&?c-F3Qo;v={,I;{TKQ{J:į-@g%ǻ ]s:wŨz Kå7-V޴UwJ/2WՍN^?kjPKriO5C$/ -݉ +&44Lh4m6X=AҬHY -A2+C yjG_3Nl3O/AO[6H 5t5!εΐPtI*n%H BJkTͺk$X q/KM*$/UY,f%; xзJC$FM;VgLݘ T #G}87qs rWI]LFsשMnf|2Cwf|L0$͜RE썾m"}I?ު E['N1dNE2Y33<޼#~]iqyc(A^]wz5WaՋC;UyU!6ٹg!dpXh8pdme%sd3H#)C|tH.m%CJ1Cn E,)F6Yp|ٙT|>UTûeyD@ŋE.T+`ZѤ 9%Q$S]6In@@1JPBh ;zO=;~ D*ǂհzj%38BT^+g4J/lmYGШIXм3]PUN߶*4 ܦ?'d_vjʦ=xdvaZ7ԑ:dQz m ¦:ꍦ]It% 5,ԅpuv ,K[vP%UHjI/=d AdIa-fAuX)8⼣r^ԃ2HߚiiC>M U,c\ut1փQ4l5 [ +hjlB I 4$n +a+ <->( +&di8ynZ2M <A2Adk˔WGxE +qg\Arě苾eľue__9o׉*Vz:tZy{l) [ ;K  ÖZ嵢3;߽]ݳ_D= +u!eJv +e]th(NnܑtEJK^ M+M:W4ھJgA|IK` <.LnsZWUdyE>!cXDf*rFCHO L\CdVsELiA)4̄ tDQ( ?G"B";$Z%WrMtEy!panN 7Q낃AiFp!Bvnɳ&ۻnsy%uLhS tnI1r .d}'i6o> Ӯ"WMd9!:e̷qgkuԳrb`Z(ʱZbg#Ź`{"yAN`L uZxq. kb҉P >VS$EbL.2 V]mc:8l_=+:SkmN'9ɻMm&RBh, 5"B[~02x)>|>_o~|ϯ^m|ߧK. + +endstream +endobj +2791 0 obj +<< +/Subtype /CIDFontType2 +/FontDescriptor 4607 0 R +/BaseFont /PKKFMO+LiSu +/CIDSystemInfo << +/Supplement 0 +/Ordering (Identity) +/Registry (Adobe) +>> +/DW 1000 +/Type /Font +>> +endobj +2792 0 obj +<< +/Length 587 +/Filter /FlateDecode +>> +stream +HTˮ0< !HE=vN#Xꂠ3qux9LUߖK|76SZr_bf}~'&$Kc= xfV/pa>NȪK8+Zw>8Xæ:|/9 +ǜgK׹y馷̶\)c[;cyJ7Y?_ݲypBP(@= E +HK j- i%#ElR +-(P4l;qj(@BddѵEN{DFtgas,JƷT%ztQAӢB{2Yir ׃s+T;}2^z,oIDOE.(xI4%UBxMx3~%g'"8PХAnLrp5p{w{i BSࠓP Ҝ2r͑2RVROxROY|t5־Fu~Ri@G 21ƴ!kgPK;y΂;eR6FA'utQD4pp/:x1042ӘoGZJ + +endstream +endobj +2793 0 obj +<< +/Subtype /CIDFontType2 +/FontDescriptor 4608 0 R +/BaseFont /PKKHBH+SimHei +/W [3 [500] + 12 [500] + 17 28 500 36 [500] + 38 +40 500 42 [500] + 44 [500] + 47 49 500 51 +[500] + 53 57 500 68 [500] + 70 76 500 79 +83 500 85 88 500 90 [500] + 92 93 500] +/CIDSystemInfo << +/Supplement 0 +/Ordering (Identity) +/Registry (Adobe) +>> +/DW 1000 +/Type /Font +>> +endobj +2794 0 obj +<< +/Length 403 +/Filter /FlateDecode +>> +stream +HT͎0> +endobj +2796 0 obj +<< +/Length 345 +/Filter /FlateDecode +>> +stream +x]j0^,jԵ "f\5^3 |əL.k}کo`<]m,\~9ҏaK7Xabiʽ/79/v\N0JJ_hoz>2.a`[k}-{%{5E:O?IMۃmX껑r#cy$g t?C$+A {1B i(@ %’ UsI\ntŸ&ɉ~xDw/|t$ +9`I"X! ^ܵn}7d{> +endobj +2798 0 obj +<< +/Length 287 +/Filter /FlateDecode +>> +stream +x]j0 E +/fȢ[ 1ב)`$R[xj Xaw0˒k-c:&Ycmq~凳:ckU51oa%гXu\X(0a=FJP:)Y4̮U[;+N񔼸S2;{"[鳨Cz*>>b\VӜ2yBIITZw 0TS]!~VTq966ca_Z +endstream +endobj +2799 0 obj +<< +/S /U +/W 0 +>> +endobj +2800 0 obj +<< +/Type /Action +/S /URI +/URI (https://www.onlinedoctranslator.com/en/?utm_source=onlinedoctranslator&utm_medium=pdf&utm_campaign=attribution) +>> +endobj +2801 0 obj +<< +/Subtype /CIDFontType2 +/FontDescriptor 4615 0 R +/BaseFont /PKKHDH+STXingkai +/W [3 [244] +] +/CIDSystemInfo << +/Supplement 0 +/Ordering (Identity) +/Registry (Adobe) +>> +/DW 1000 +/Type /Font +>> +endobj +2802 0 obj +<< +/Length 301 +/Filter /FlateDecode +>> +stream +HT=O0 + |6Tu + |;9*4J{{bHۯnݸ{ 9 +vtCe>it $ Y7JŇ˲wv{L.kX[`a0Sˏ9 +=k'#b=xm0hwBh8y k>K9璷G*2H;:/#YI$T "$HuYK!U~TAJ\%,HCWS9WBr^gO~܈6 + +endstream +endobj +2803 0 obj +<< +/Subtype /CIDFontType2 +/FontDescriptor 4616 0 R +/BaseFont /PKKHEI+STLiti +/W [3 [244] +] +/CIDSystemInfo << +/Supplement 0 +/Ordering (Identity) +/Registry (Adobe) +>> +/DW 1000 +/Type /Font +>> +endobj +2804 0 obj +<< +/Length 216 +/Filter /FlateDecode +>> +stream +HTP1n0 + 2Hq0EtW$PS-}$IЁ$x᎔%A~7FY/l8:C֙u%IܭsĩC] s^mv ?";r.? pBi Cd!>~ U8m5R굹$~g]Y<+Ոᙗoz0 sX/FGM!7jp + +endstream +endobj +2805 0 obj +<< +/D [24 0 R /XYZ 0 842 null] +/S /GoTo +>> +endobj +2806 0 obj +<< +/D [24 0 R /XYZ 0 842 null] +/S /GoTo +>> +endobj +2807 0 obj +<< +/D [24 0 R /XYZ 0 842 null] +/S /GoTo +>> +endobj +2808 0 obj +<< +/D [25 0 R /XYZ 0 842 null] +/S /GoTo +>> +endobj +2809 0 obj +<< +/D [26 0 R /XYZ 0 842 null] +/S /GoTo +>> +endobj +2810 0 obj +<< +/D [26 0 R /XYZ 0 842 null] +/S /GoTo +>> +endobj +2811 0 obj +<< +/D [26 0 R /XYZ 0 842 null] +/S /GoTo +>> +endobj +2812 0 obj +<< +/D [27 0 R /XYZ 0 842 null] +/S /GoTo +>> +endobj +2813 0 obj +<< +/D [28 0 R /XYZ 0 842 null] +/S /GoTo +>> +endobj +2814 0 obj +<< +/D [29 0 R /XYZ 0 842 null] +/S /GoTo +>> +endobj +2815 0 obj +<< +/D [29 0 R /XYZ 0 842 null] +/S /GoTo +>> +endobj +2816 0 obj +<< +/D [29 0 R /XYZ 0 842 null] +/S /GoTo +>> +endobj +2817 0 obj +<< +/D [29 0 R /XYZ 0 842 null] +/S /GoTo +>> +endobj +2818 0 obj +<< +/D [29 0 R /XYZ 0 842 null] +/S /GoTo +>> +endobj +2819 0 obj +<< +/D [29 0 R /XYZ 0 842 null] +/S /GoTo +>> +endobj +2820 0 obj +<< +/D [30 0 R /XYZ 0 842 null] +/S /GoTo +>> +endobj +2821 0 obj +<< +/D [30 0 R /XYZ 0 842 null] +/S /GoTo +>> +endobj +2822 0 obj +<< +/D [30 0 R /XYZ 0 842 null] +/S /GoTo +>> +endobj +2823 0 obj +<< +/D [30 0 R /XYZ 0 842 null] +/S /GoTo +>> +endobj +2824 0 obj +<< +/D [30 0 R /XYZ 0 842 null] +/S /GoTo +>> +endobj +2825 0 obj +<< +/D [31 0 R /XYZ 0 842 null] +/S /GoTo +>> +endobj +2826 0 obj +<< +/D [31 0 R /XYZ 0 842 null] +/S /GoTo +>> +endobj +2827 0 obj +<< +/D [32 0 R /XYZ 0 842 null] +/S /GoTo +>> +endobj +2828 0 obj +<< +/D [32 0 R /XYZ 0 842 null] +/S /GoTo +>> +endobj +2829 0 obj +<< +/D [33 0 R /XYZ 0 842 null] +/S /GoTo +>> +endobj +2830 0 obj +<< +/D [34 0 R /XYZ 0 842 null] +/S /GoTo +>> +endobj +2831 0 obj +<< +/D [34 0 R /XYZ 0 842 null] +/S /GoTo +>> +endobj +2832 0 obj +<< +/D [38 0 R /XYZ 0 842 null] +/S /GoTo +>> +endobj +2833 0 obj +<< +/D [47 0 R /XYZ 0 842 null] +/S /GoTo +>> +endobj +2834 0 obj +<< +/D [51 0 R /XYZ 0 842 null] +/S /GoTo +>> +endobj +2835 0 obj +<< +/D [51 0 R /XYZ 0 842 null] +/S /GoTo +>> +endobj +2836 0 obj +<< +/D [51 0 R /XYZ 0 842 null] +/S /GoTo +>> +endobj +2837 0 obj +<< +/D [52 0 R /XYZ 0 842 null] +/S /GoTo +>> +endobj +2838 0 obj +<< +/D [52 0 R /XYZ 0 842 null] +/S /GoTo +>> +endobj +2839 0 obj +<< +/D [52 0 R /XYZ 0 842 null] +/S /GoTo +>> +endobj +2840 0 obj +<< +/StemV 138 +/FontName /Arial-BoldMT +/FontStretch /Normal +/FontWeight 700 +/Flags 32 +/Descent -211 +/FontBBox [-628 -376 2000 1010] +/Ascent 905 +/FontFamily (Arial) +/CapHeight 718 +/XHeight 515 +/Type /FontDescriptor +/ItalicAngle 0 +>> +endobj +2841 0 obj +<< +/Type /Font +/Subtype /CIDFontType2 +/BaseFont /AABHCF+NotoSansCJKsc-Regular +/CIDSystemInfo 4617 0 R +/FontDescriptor 4618 0 R +/W [1 [224] + 10 [338] + 47 [722] + 67 [618] + 81 [620] +84 [468] +] +/CIDToGIDMap 4619 0 R +>> +endobj +2842 0 obj +<< +/Length 303 +/Filter /FlateDecode +>> +stream +x]j0 ~ +C&-rR[)1{ϖf0YlKٱ=Iu`0O7_j,%F{P;Ew*}9z޼o앯]s0 \+g[:& S0sq%Yrz4̮W{{Vj^5q wrAgȣ!RIl(") E$[bwQͲ H$X)"%RIV!Ft]FӿI=ګn> +endobj +2844 0 obj +<< +/Subtype /CIDFontType2 +/FontDescriptor 4620 0 R +/BaseFont /PKKMKM+Wingdings-Regular +/W [122 [746] +] +/CIDSystemInfo << +/Supplement 0 +/Ordering (Identity) +/Registry (Adobe) +>> +/DW 1000 +/Type /Font +>> +endobj +2845 0 obj +<< +/Subtype /CIDFontType2 +/FontDescriptor 4621 0 R +/BaseFont /PKKNCM+KaiTi_GB2312 +/W [3 [500] +] +/CIDSystemInfo << +/Supplement 0 +/Ordering (Identity) +/Registry (Adobe) +>> +/DW 1000 +/Type /Font +>> +endobj +2846 0 obj +<< +/Length 307 +/Filter /FlateDecode +>> +stream +HTKo0 | +7 +TBH+=!i(CCEux:i} 4B@0J|빳 (xY7f\(Nusk0{ ^݀n2'2%'YgkqF@Tϝ}fgm/!b՗Wit9!RʸgԺ4@sZ?pɒ(B =*#Jc2(U)MطqJZ+X՞tF6L'f\(+?}IʀvG4gH> +kՙ g'`I + +endstream +endobj +2847 0 obj +<< +/Placement /Inline +/O /Layout +/BBox [87.0 164.0 528.0 548.0] +>> +endobj +2848 0 obj +<< +/Placement /Inline +/O /Layout +/BBox [320.0 278.0 329.0 285.0] +>> +endobj +2849 0 obj +<< +/SpaceAfter 6.0 +/TextAlign /Start +/O /Layout +/WritingMode /LrTb +/SpaceBefore 6.0 +/TextIndent 0.0 +/EndIndent 0.0 +/StartIndent 0.0 +>> +endobj +2850 0 obj +<< +/SpaceAfter 0.0 +/TextAlign /Start +/O /Layout +/WritingMode /LrTb +/SpaceBefore 0.0 +/TextIndent 0.0 +/EndIndent 0.0 +/StartIndent 10.0 +>> +endobj +2851 0 obj +<< +/SpaceAfter 0.0 +/TextAlign /Start +/O /Layout +/WritingMode /LrTb +/SpaceBefore 0.0 +/TextIndent 0.0 +/EndIndent 0.0 +/StartIndent 21.0 +>> +endobj +2852 0 obj +<< +/K [3129 0 R 3130 0 R 3131 0 R 3132 0 R] +/P 1039 0 R +/S /TR +>> +endobj +2853 0 obj +<< +/K [3133 0 R 3134 0 R 3135 0 R 3136 0 R] +/P 1039 0 R +/S /TR +>> +endobj +2854 0 obj +<< +/K [3137 0 R 3138 0 R 3139 0 R 3140 0 R] +/P 1039 0 R +/S /TR +>> +endobj +2855 0 obj +<< +/K [3141 0 R 3142 0 R 3143 0 R 3144 0 R] +/P 1039 0 R +/S /TR +>> +endobj +2856 0 obj +<< +/K [3145 0 R 3146 0 R 3147 0 R 3148 0 R] +/P 1039 0 R +/S /TR +>> +endobj +2857 0 obj +<< +/K [3149 0 R 3150 0 R 3151 0 R 3152 0 R] +/P 1039 0 R +/S /TR +>> +endobj +2858 0 obj +<< +/K [3155 0 R 3154 0 R 3159 0 R 3160 0 R] +/P 1045 0 R +/S /TR +>> +endobj +2859 0 obj +<< +/K [4622 0 R 3156 0 R 3157 0 R 3158 0 R 4623 0 R 4624 0 R] +/P 1045 0 R +/S /TR +>> +endobj +2860 0 obj +<< +/K [3161 0 R 3162 0 R 3163 0 R 3164 0 R 3165 0 R 3166 0 R] +/P 1045 0 R +/S /TR +>> +endobj +2861 0 obj +<< +/K [3167 0 R 3169 0 R 3170 0 R 3171 0 R 3172 0 R 3173 0 R] +/P 1045 0 R +/S /TR +>> +endobj +2862 0 obj +<< +/K [3174 0 R 3175 0 R 3176 0 R 3177 0 R 3178 0 R 3179 0 R] +/P 1045 0 R +/S /TR +>> +endobj +2863 0 obj +<< +/K [3180 0 R 3181 0 R 3182 0 R 3183 0 R 3184 0 R 3185 0 R] +/P 1045 0 R +/S /TR +>> +endobj +2864 0 obj +<< +/K [3188 0 R 3189 0 R 3187 0 R 3193 0 R 3194 0 R] +/P 1048 0 R +/S /TR +>> +endobj +2865 0 obj +<< +/K [4625 0 R 4626 0 R 3190 0 R 3191 0 R 3192 0 R 4627 0 R 4628 0 R] +/P 1048 0 R +/S /TR +>> +endobj +2866 0 obj +<< +/K [3195 0 R 3197 0 R 3199 0 R 3200 0 R 3201 0 R 3202 0 R 3203 0 R] +/P 1048 0 R +/S /TR +>> +endobj +2867 0 obj +<< +/K [3204 0 R 3206 0 R 3208 0 R 3209 0 R 3210 0 R 3211 0 R 3212 0 R] +/P 1048 0 R +/S /TR +>> +endobj +2868 0 obj +<< +/K [3214 0 R 3215 0 R 3213 0 R 3219 0 R 3220 0 R] +/P 1051 0 R +/S /TR +>> +endobj +2869 0 obj +<< +/K [4629 0 R 4630 0 R 3216 0 R 3217 0 R 3218 0 R 4631 0 R 4632 0 R] +/P 1051 0 R +/S /TR +>> +endobj +2870 0 obj +<< +/K [3221 0 R 3223 0 R 3224 0 R 3225 0 R 3226 0 R 3227 0 R 3228 0 R] +/P 1051 0 R +/S /TR +>> +endobj +2871 0 obj +<< +/K [3229 0 R 3231 0 R 3232 0 R 3233 0 R 3234 0 R 3235 0 R 3236 0 R] +/P 1051 0 R +/S /TR +>> +endobj +2872 0 obj +<< +/K [3243 0 R 3237 0 R 3239 0 R 3240 0 R 3241 0 R 3242 0 R 3251 0 R] +/P 1051 0 R +/S /TR +>> +endobj +2873 0 obj +<< +/K [4633 0 R 3245 0 R 3247 0 R 3248 0 R 3249 0 R 3250 0 R 4634 0 R] +/P 1051 0 R +/S /TR +>> +endobj +2874 0 obj +<< +/K [3252 0 R 3254 0 R 3255 0 R 3256 0 R 3257 0 R 3258 0 R 3259 0 R] +/P 1051 0 R +/S /TR +>> +endobj +2875 0 obj +<< +/K [3260 0 R 3261 0 R 3262 0 R 3263 0 R] +/P 1053 0 R +/S /TR +>> +endobj +2876 0 obj +<< +/K [3264 0 R 3265 0 R 3266 0 R 3267 0 R] +/P 1053 0 R +/S /TR +>> +endobj +2877 0 obj +<< +/K [3268 0 R 3269 0 R 3270 0 R 3271 0 R] +/P 1053 0 R +/S /TR +>> +endobj +2878 0 obj +<< +/K [3272 0 R 3273 0 R 3274 0 R 3275 0 R] +/P 1053 0 R +/S /TR +>> +endobj +2879 0 obj +<< +/K [3276 0 R 3277 0 R 3278 0 R 3279 0 R] +/P 1053 0 R +/S /TR +>> +endobj +2880 0 obj +<< +/K [3280 0 R 3281 0 R 3282 0 R 3283 0 R] +/P 1053 0 R +/S /TR +>> +endobj +2881 0 obj +<< +/K [3285 0 R 3287 0 R 3288 0 R 3289 0 R 3290 0 R 3291 0 R] +/P 1055 0 R +/S /TR +>> +endobj +2882 0 obj +<< +/K [3292 0 R 3293 0 R 3294 0 R 3295 0 R 3296 0 R 3297 0 R] +/P 1055 0 R +/S /TR +>> +endobj +2883 0 obj +<< +/K [3300 0 R 3301 0 R 3302 0 R 3303 0 R 3304 0 R 3305 0 R] +/P 1063 0 R +/S /TR +>> +endobj +2884 0 obj +<< +/K [3306 0 R 3307 0 R 3308 0 R 3309 0 R] +/P 1066 0 R +/S /TR +>> +endobj +2885 0 obj +<< +/K [3310 0 R 3311 0 R 3312 0 R 3314 0 R] +/P 1066 0 R +/S /TR +>> +endobj +2886 0 obj +<< +/K [3315 0 R 3316 0 R 3317 0 R 3318 0 R] +/P 1066 0 R +/S /TR +>> +endobj +2887 0 obj +<< +/K [3325 0 R 3326 0 R 3327 0 R 3319 0 R 3320 0 R] +/P 1066 0 R +/S /TR +>> +endobj +2888 0 obj +<< +/K [4635 0 R 4636 0 R 4637 0 R 3321 0 R 3322 0 R] +/P 1066 0 R +/S /TR +>> +endobj +2889 0 obj +<< +/K [4638 0 R 4639 0 R 4640 0 R 3323 0 R 3324 0 R] +/P 1066 0 R +/S /TR +>> +endobj +2890 0 obj +<< +/K [4641 0 R 4642 0 R 4643 0 R 3328 0 R 3329 0 R] +/P 1066 0 R +/S /TR +>> +endobj +2891 0 obj +<< +/K [3330 0 R 3331 0 R 3332 0 R 3333 0 R] +/P 1066 0 R +/S /TR +>> +endobj +2892 0 obj +<< +/K [3334 0 R 3335 0 R 3336 0 R 3337 0 R] +/P 1066 0 R +/S /TR +>> +endobj +2893 0 obj +<< +/K [3338 0 R 3339 0 R 3340 0 R 3341 0 R] +/P 1066 0 R +/S /TR +>> +endobj +2894 0 obj +<< +/K [3343 0 R 3344 0 R 3345 0 R 3346 0 R 3347 0 R 3348 0 R 3349 0 R] +/P 1094 0 R +/S /TR +>> +endobj +2895 0 obj +<< +/K [3350 0 R 3351 0 R 3352 0 R 3353 0 R 3354 0 R 3355 0 R 3356 0 R] +/P 1094 0 R +/S /TR +>> +endobj +2896 0 obj +<< +/K [3357 0 R 3358 0 R 3359 0 R 3360 0 R 3361 0 R 3362 0 R 3363 0 R] +/P 1094 0 R +/S /TR +>> +endobj +2897 0 obj +<< +/K [3364 0 R 3365 0 R 3366 0 R 3367 0 R 3368 0 R 3369 0 R] +/P 1096 0 R +/S /TR +>> +endobj +2898 0 obj +<< +/K [3370 0 R 3371 0 R 3372 0 R 3373 0 R 3374 0 R 3375 0 R] +/P 1096 0 R +/S /TR +>> +endobj +2899 0 obj +<< +/K [3376 0 R 3377 0 R 3378 0 R 3379 0 R 3380 0 R 3381 0 R] +/P 1096 0 R +/S /TR +>> +endobj +2900 0 obj +<< +/K [3382 0 R 3383 0 R 3384 0 R 3385 0 R 3386 0 R 3387 0 R 3388 0 R] +/P 1102 0 R +/S /TR +>> +endobj +2901 0 obj +<< +/K [3389 0 R 3390 0 R 3391 0 R 3392 0 R 3393 0 R 3394 0 R 3395 0 R] +/P 1102 0 R +/S /TR +>> +endobj +2902 0 obj +<< +/K [3396 0 R 3397 0 R 3398 0 R 3399 0 R 3400 0 R 3401 0 R 3402 0 R] +/P 1102 0 R +/S /TR +>> +endobj +2903 0 obj +<< +/K [3403 0 R 3404 0 R 3405 0 R 3406 0 R 3407 0 R 3408 0 R] +/P 1104 0 R +/S /TR +>> +endobj +2904 0 obj +<< +/K [3409 0 R 3410 0 R 3411 0 R 3412 0 R 3413 0 R 3414 0 R] +/P 1104 0 R +/S /TR +>> +endobj +2905 0 obj +<< +/K [3415 0 R 3416 0 R 3417 0 R 3418 0 R 3419 0 R 3420 0 R] +/P 1104 0 R +/S /TR +>> +endobj +2906 0 obj +<< +/K [3421 0 R 3422 0 R 3423 0 R 3424 0 R 3425 0 R 3426 0 R 3427 0 R] +/P 1107 0 R +/S /TR +>> +endobj +2907 0 obj +<< +/K [3428 0 R 3429 0 R 3430 0 R 3431 0 R 3432 0 R 3433 0 R 3434 0 R] +/P 1107 0 R +/S /TR +>> +endobj +2908 0 obj +<< +/K [3435 0 R 3436 0 R 3437 0 R 3438 0 R 3439 0 R 3440 0 R 3441 0 R] +/P 1107 0 R +/S /TR +>> +endobj +2909 0 obj +<< +/K [3442 0 R 3443 0 R 3444 0 R 3445 0 R 3446 0 R 3447 0 R] +/P 1109 0 R +/S /TR +>> +endobj +2910 0 obj +<< +/K [3448 0 R 3449 0 R 3450 0 R 3451 0 R 3452 0 R 3453 0 R] +/P 1109 0 R +/S /TR +>> +endobj +2911 0 obj +<< +/K [3454 0 R 3455 0 R 3456 0 R 3457 0 R 3458 0 R 3459 0 R] +/P 1109 0 R +/S /TR +>> +endobj +2912 0 obj +<< +/K [3460 0 R 3461 0 R 3462 0 R 3463 0 R 3464 0 R 3465 0 R 3466 0 R 3467 0 R] +/P 1113 0 R +/S /TR +>> +endobj +2913 0 obj +<< +/K [3468 0 R 3469 0 R 3470 0 R 3471 0 R 3472 0 R 3473 0 R 3474 0 R 3475 0 R] +/P 1113 0 R +/S /TR +>> +endobj +2914 0 obj +<< +/K [3476 0 R 3477 0 R 3478 0 R 3479 0 R 3480 0 R 3481 0 R 3482 0 R 3483 0 R] +/P 1113 0 R +/S /TR +>> +endobj +2915 0 obj +<< +/K [3484 0 R 3485 0 R 3486 0 R 3487 0 R 3488 0 R 3489 0 R] +/P 1115 0 R +/S /TR +>> +endobj +2916 0 obj +<< +/K [3490 0 R 3491 0 R 3492 0 R 3493 0 R 3494 0 R 3495 0 R] +/P 1115 0 R +/S /TR +>> +endobj +2917 0 obj +<< +/K [3496 0 R 3497 0 R 3498 0 R 3499 0 R 3500 0 R 3501 0 R] +/P 1115 0 R +/S /TR +>> +endobj +2918 0 obj +<< +/K [3502 0 R 3503 0 R 3504 0 R] +/P 1118 0 R +/S /TR +>> +endobj +2919 0 obj +<< +/K [3505 0 R 3506 0 R 3507 0 R] +/P 1118 0 R +/S /TR +>> +endobj +2920 0 obj +<< +/K [3508 0 R 3509 0 R 3510 0 R] +/P 1118 0 R +/S /TR +>> +endobj +2921 0 obj +<< +/K [3511 0 R 3512 0 R 3513 0 R] +/P 1118 0 R +/S /TR +>> +endobj +2922 0 obj +<< +/K [3514 0 R 3515 0 R 3516 0 R 3517 0 R 3518 0 R 3519 0 R] +/P 1121 0 R +/S /TR +>> +endobj +2923 0 obj +<< +/K [3520 0 R 3521 0 R 3522 0 R 3523 0 R 3524 0 R 3525 0 R] +/P 1121 0 R +/S /TR +>> +endobj +2924 0 obj +<< +/K [3526 0 R 3527 0 R 3528 0 R 3529 0 R 3530 0 R 3531 0 R] +/P 1121 0 R +/S /TR +>> +endobj +2925 0 obj +<< +/K [3532 0 R 3533 0 R 3534 0 R 3535 0 R 3536 0 R 3537 0 R 3538 0 R] +/P 1123 0 R +/S /TR +>> +endobj +2926 0 obj +<< +/K [3539 0 R 3540 0 R 3541 0 R 3542 0 R 3543 0 R 3544 0 R 3545 0 R] +/P 1123 0 R +/S /TR +>> +endobj +2927 0 obj +<< +/K [3546 0 R 3547 0 R 3548 0 R 3549 0 R 3550 0 R 3551 0 R 3552 0 R] +/P 1123 0 R +/S /TR +>> +endobj +2928 0 obj +<< +/K [3554 0 R 3555 0 R 3556 0 R 3557 0 R] +/P 1127 0 R +/S /TR +>> +endobj +2929 0 obj +<< +/K [3558 0 R 3559 0 R 3560 0 R 3561 0 R] +/P 1127 0 R +/S /TR +>> +endobj +2930 0 obj +<< +/K [3562 0 R 3563 0 R 3564 0 R 3565 0 R] +/P 1127 0 R +/S /TR +>> +endobj +2931 0 obj +<< +/K [3566 0 R 3567 0 R 3568 0 R 3569 0 R] +/P 1127 0 R +/S /TR +>> +endobj +2932 0 obj +<< +/K [3570 0 R 3571 0 R 3572 0 R 3573 0 R] +/P 1127 0 R +/S /TR +>> +endobj +2933 0 obj +<< +/K [3574 0 R 3575 0 R 3576 0 R 3577 0 R] +/P 1127 0 R +/S /TR +>> +endobj +2934 0 obj +<< +/K [3578 0 R 3579 0 R 3580 0 R 3581 0 R] +/P 1127 0 R +/S /TR +>> +endobj +2935 0 obj +<< +/K [3582 0 R 3583 0 R 3584 0 R 3585 0 R] +/P 1127 0 R +/S /TR +>> +endobj +2936 0 obj +<< +/K [3586 0 R 3587 0 R 3588 0 R 3589 0 R 3590 0 R 3591 0 R 3592 0 R] +/P 1133 0 R +/S /TR +>> +endobj +2937 0 obj +<< +/K [3593 0 R 3594 0 R 3595 0 R 3596 0 R 3597 0 R 3598 0 R 3599 0 R] +/P 1133 0 R +/S /TR +>> +endobj +2938 0 obj +<< +/K [3600 0 R 3601 0 R 3602 0 R 3603 0 R 3604 0 R 3605 0 R 3606 0 R] +/P 1133 0 R +/S /TR +>> +endobj +2939 0 obj +<< +/K [3607 0 R 3608 0 R 3609 0 R 3610 0 R 3611 0 R 3612 0 R 3613 0 R] +/P 1135 0 R +/S /TR +>> +endobj +2940 0 obj +<< +/K [3614 0 R 3615 0 R 3616 0 R 3617 0 R 3618 0 R 3619 0 R 3620 0 R] +/P 1135 0 R +/S /TR +>> +endobj +2941 0 obj +<< +/K [3621 0 R 3622 0 R 3623 0 R 3624 0 R 3625 0 R 3626 0 R 3627 0 R] +/P 1135 0 R +/S /TR +>> +endobj +2942 0 obj +<< +/K [3628 0 R 3629 0 R] +/P 1137 0 R +/S /TR +>> +endobj +2943 0 obj +<< +/K [3639 0 R 3630 0 R 3631 0 R 3632 0 R 3633 0 R 3634 0 R 3635 0 R 3636 0 R 3637 0 R 3638 0 R] +/P 1137 0 R +/S /TR +>> +endobj +2944 0 obj +<< +/K [4644 0 R 3640 0 R 3641 0 R 3642 0 R 3643 0 R 3644 0 R 3645 0 R 3646 0 R 3647 0 R 3648 0 R] +/P 1137 0 R +/S /TR +>> +endobj +2945 0 obj +<< +/K [3658 0 R 3649 0 R 3650 0 R 3651 0 R 3652 0 R 3653 0 R 3654 0 R 3655 0 R 3656 0 R 3657 0 R] +/P 1137 0 R +/S /TR +>> +endobj +2946 0 obj +<< +/K [4645 0 R 3659 0 R 3660 0 R 3661 0 R 3662 0 R 3663 0 R 3664 0 R 3665 0 R 3666 0 R 3667 0 R] +/P 1137 0 R +/S /TR +>> +endobj +2947 0 obj +<< +/K [3668 0 R 3669 0 R 3670 0 R] +/P 1137 0 R +/S /TR +>> +endobj +2948 0 obj +<< +/K [3680 0 R 3671 0 R 3672 0 R 3673 0 R 3674 0 R 3675 0 R 3676 0 R 3677 0 R 3678 0 R 3679 0 R] +/P 1137 0 R +/S /TR +>> +endobj +2949 0 obj +<< +/K [4646 0 R 3681 0 R 3682 0 R 3683 0 R 3684 0 R 3685 0 R 3686 0 R 3687 0 R 3688 0 R 3689 0 R] +/P 1137 0 R +/S /TR +>> +endobj +2950 0 obj +<< +/K 3690 0 R +/P 1137 0 R +/S /TR +>> +endobj +2951 0 obj +<< +/K [3691 0 R 3692 0 R 3693 0 R 3694 0 R 3695 0 R 3696 0 R] +/P 1140 0 R +/S /TR +>> +endobj +2952 0 obj +<< +/K [3697 0 R 3698 0 R 3699 0 R 3700 0 R 3701 0 R 3702 0 R] +/P 1140 0 R +/S /TR +>> +endobj +2953 0 obj +<< +/K [3703 0 R 3704 0 R 3705 0 R 3706 0 R 3707 0 R 3708 0 R] +/P 1140 0 R +/S /TR +>> +endobj +2954 0 obj +<< +/K [3709 0 R 3710 0 R 3711 0 R 3712 0 R 3713 0 R 3714 0 R 3715 0 R] +/P 1142 0 R +/S /TR +>> +endobj +2955 0 obj +<< +/K [3716 0 R 3717 0 R 3718 0 R 3719 0 R 3720 0 R 3721 0 R 3722 0 R] +/P 1142 0 R +/S /TR +>> +endobj +2956 0 obj +<< +/K [3723 0 R 3724 0 R 3725 0 R 3726 0 R 3727 0 R 3728 0 R 3729 0 R] +/P 1142 0 R +/S /TR +>> +endobj +2957 0 obj +<< +/K [3730 0 R 3731 0 R 3732 0 R 3733 0 R 3734 0 R 3735 0 R] +/P 1145 0 R +/S /TR +>> +endobj +2958 0 obj +<< +/K [3736 0 R 3737 0 R 3738 0 R 3739 0 R 3740 0 R 3741 0 R] +/P 1145 0 R +/S /TR +>> +endobj +2959 0 obj +<< +/K [3742 0 R 3743 0 R 3744 0 R 3745 0 R 3746 0 R 3747 0 R] +/P 1145 0 R +/S /TR +>> +endobj +2960 0 obj +<< +/K [3748 0 R 3749 0 R 3750 0 R 3751 0 R 3752 0 R 3753 0 R] +/P 1147 0 R +/S /TR +>> +endobj +2961 0 obj +<< +/K [3754 0 R 3755 0 R 3756 0 R 3757 0 R 3758 0 R 3759 0 R] +/P 1147 0 R +/S /TR +>> +endobj +2962 0 obj +<< +/K [3760 0 R 3761 0 R 3762 0 R 3763 0 R 3764 0 R 3765 0 R] +/P 1147 0 R +/S /TR +>> +endobj +2963 0 obj +<< +/K [3766 0 R 3767 0 R 3768 0 R 3769 0 R 3770 0 R 3771 0 R] +/P 1149 0 R +/S /TR +>> +endobj +2964 0 obj +<< +/K [3772 0 R 3773 0 R 3774 0 R 3775 0 R 3776 0 R 3777 0 R] +/P 1149 0 R +/S /TR +>> +endobj +2965 0 obj +<< +/K [3778 0 R 3779 0 R 3780 0 R 3781 0 R 3782 0 R 3783 0 R] +/P 1149 0 R +/S /TR +>> +endobj +2966 0 obj +<< +/K [3784 0 R 3785 0 R 3786 0 R 3787 0 R 3788 0 R 3789 0 R] +/P 1151 0 R +/S /TR +>> +endobj +2967 0 obj +<< +/K [3790 0 R 3791 0 R 3792 0 R 3793 0 R 3794 0 R 3795 0 R] +/P 1151 0 R +/S /TR +>> +endobj +2968 0 obj +<< +/K [3796 0 R 3797 0 R 3798 0 R 3799 0 R 3800 0 R 3801 0 R] +/P 1151 0 R +/S /TR +>> +endobj +2969 0 obj +<< +/K [3802 0 R 3803 0 R 3804 0 R 3805 0 R 3806 0 R 3807 0 R] +/P 1153 0 R +/S /TR +>> +endobj +2970 0 obj +<< +/K [3808 0 R 3809 0 R 3810 0 R 3811 0 R 3812 0 R 3813 0 R] +/P 1153 0 R +/S /TR +>> +endobj +2971 0 obj +<< +/K [3814 0 R 3815 0 R 3816 0 R 3817 0 R 3818 0 R 3819 0 R] +/P 1153 0 R +/S /TR +>> +endobj +2972 0 obj +<< +/K [3820 0 R 3821 0 R 3822 0 R 3823 0 R 3824 0 R 3825 0 R] +/P 1155 0 R +/S /TR +>> +endobj +2973 0 obj +<< +/K [3826 0 R 3827 0 R 3828 0 R 3829 0 R 3830 0 R 3831 0 R] +/P 1155 0 R +/S /TR +>> +endobj +2974 0 obj +<< +/K [3832 0 R 3833 0 R 3834 0 R 3835 0 R 3836 0 R 3837 0 R] +/P 1155 0 R +/S /TR +>> +endobj +2975 0 obj +<< +/K [3838 0 R 3839 0 R 3840 0 R 3841 0 R 3842 0 R 3843 0 R] +/P 1158 0 R +/S /TR +>> +endobj +2976 0 obj +<< +/K [3844 0 R 3845 0 R 3846 0 R 3847 0 R 3848 0 R 3849 0 R] +/P 1158 0 R +/S /TR +>> +endobj +2977 0 obj +<< +/K [3850 0 R 3851 0 R 3852 0 R 3853 0 R 3854 0 R 3855 0 R] +/P 1158 0 R +/S /TR +>> +endobj +2978 0 obj +<< +/K [3856 0 R 3857 0 R 3858 0 R 3859 0 R 3860 0 R 3861 0 R] +/P 1160 0 R +/S /TR +>> +endobj +2979 0 obj +<< +/K [3862 0 R 3863 0 R 3864 0 R 3865 0 R 3866 0 R 3867 0 R] +/P 1160 0 R +/S /TR +>> +endobj +2980 0 obj +<< +/K [3868 0 R 3869 0 R 3870 0 R 3871 0 R 3872 0 R 3873 0 R] +/P 1160 0 R +/S /TR +>> +endobj +2981 0 obj +<< +/K [3874 0 R 3875 0 R 3876 0 R 3877 0 R 3878 0 R 3879 0 R] +/P 1162 0 R +/S /TR +>> +endobj +2982 0 obj +<< +/K [3880 0 R 3881 0 R 3882 0 R 3883 0 R 3884 0 R 3885 0 R] +/P 1162 0 R +/S /TR +>> +endobj +2983 0 obj +<< +/K [3886 0 R 3887 0 R 3888 0 R 3889 0 R 3890 0 R 3891 0 R] +/P 1162 0 R +/S /TR +>> +endobj +2984 0 obj +<< +/K [3892 0 R 3893 0 R 3894 0 R 3895 0 R 3896 0 R 3897 0 R] +/P 1164 0 R +/S /TR +>> +endobj +2985 0 obj +<< +/K [3898 0 R 3899 0 R 3900 0 R 3901 0 R 3902 0 R 3903 0 R] +/P 1164 0 R +/S /TR +>> +endobj +2986 0 obj +<< +/K [3904 0 R 3905 0 R 3906 0 R 3907 0 R 3908 0 R 3909 0 R] +/P 1164 0 R +/S /TR +>> +endobj +2987 0 obj +<< +/K [3910 0 R 3911 0 R 3912 0 R 3913 0 R 3914 0 R 3915 0 R 3916 0 R] +/P 1168 0 R +/S /TR +>> +endobj +2988 0 obj +<< +/K [3917 0 R 3918 0 R 3919 0 R 3920 0 R 3921 0 R 3922 0 R 3923 0 R] +/P 1168 0 R +/S /TR +>> +endobj +2989 0 obj +<< +/K [3924 0 R 3925 0 R 3926 0 R 3927 0 R 3928 0 R 3929 0 R 3930 0 R] +/P 1168 0 R +/S /TR +>> +endobj +2990 0 obj +<< +/K [3931 0 R 3932 0 R 3933 0 R 3934 0 R 3935 0 R 3936 0 R] +/P 1171 0 R +/S /TR +>> +endobj +2991 0 obj +<< +/K [3937 0 R 3938 0 R 3939 0 R 3940 0 R 3941 0 R 3942 0 R] +/P 1171 0 R +/S /TR +>> +endobj +2992 0 obj +<< +/K [3943 0 R 3944 0 R 3945 0 R 3946 0 R 3947 0 R 3948 0 R] +/P 1171 0 R +/S /TR +>> +endobj +2993 0 obj +<< +/K [3949 0 R 3950 0 R 3951 0 R 3952 0 R 3953 0 R 3954 0 R] +/P 1175 0 R +/S /TR +>> +endobj +2994 0 obj +<< +/K [3955 0 R 3956 0 R 3957 0 R 3958 0 R 3959 0 R 3960 0 R] +/P 1175 0 R +/S /TR +>> +endobj +2995 0 obj +<< +/K [3961 0 R 3962 0 R 3963 0 R 3964 0 R 3965 0 R 3966 0 R] +/P 1175 0 R +/S /TR +>> +endobj +2996 0 obj +<< +/K [3967 0 R 3968 0 R 3969 0 R 3970 0 R 3971 0 R 3972 0 R] +/P 1177 0 R +/S /TR +>> +endobj +2997 0 obj +<< +/K [3973 0 R 3974 0 R 3975 0 R 3976 0 R 3977 0 R 3978 0 R] +/P 1177 0 R +/S /TR +>> +endobj +2998 0 obj +<< +/K [3979 0 R 3980 0 R 3981 0 R 3982 0 R 3983 0 R 3984 0 R] +/P 1177 0 R +/S /TR +>> +endobj +2999 0 obj +<< +/K [3985 0 R 3986 0 R 3987 0 R 3988 0 R 3989 0 R 3990 0 R 3991 0 R] +/P 1179 0 R +/S /TR +>> +endobj +3000 0 obj +<< +/K [3992 0 R 3993 0 R 3994 0 R 3995 0 R 3996 0 R 3997 0 R 3998 0 R] +/P 1179 0 R +/S /TR +>> +endobj +3001 0 obj +<< +/K [3999 0 R 4000 0 R 4001 0 R 4002 0 R 4003 0 R 4004 0 R 4005 0 R] +/P 1179 0 R +/S /TR +>> +endobj +3002 0 obj +<< +/K [4006 0 R 4007 0 R 4008 0 R 4009 0 R 4010 0 R 4011 0 R] +/P 1181 0 R +/S /TR +>> +endobj +3003 0 obj +<< +/K [4012 0 R 4013 0 R 4014 0 R 4015 0 R 4016 0 R 4017 0 R] +/P 1181 0 R +/S /TR +>> +endobj +3004 0 obj +<< +/K [4018 0 R 4019 0 R 4020 0 R 4021 0 R 4022 0 R 4023 0 R] +/P 1181 0 R +/S /TR +>> +endobj +3005 0 obj +<< +/K [4024 0 R 4025 0 R 4026 0 R 4027 0 R 4028 0 R 4029 0 R] +/P 1183 0 R +/S /TR +>> +endobj +3006 0 obj +<< +/K [4030 0 R 4031 0 R 4032 0 R 4033 0 R 4034 0 R 4035 0 R] +/P 1183 0 R +/S /TR +>> +endobj +3007 0 obj +<< +/K [4036 0 R 4037 0 R 4038 0 R 4039 0 R 4040 0 R 4041 0 R] +/P 1183 0 R +/S /TR +>> +endobj +3008 0 obj +<< +/K [4042 0 R 4043 0 R 4044 0 R 4045 0 R 4046 0 R 4047 0 R] +/P 1185 0 R +/S /TR +>> +endobj +3009 0 obj +<< +/K [4048 0 R 4049 0 R 4050 0 R 4051 0 R 4052 0 R 4053 0 R] +/P 1185 0 R +/S /TR +>> +endobj +3010 0 obj +<< +/K [4054 0 R 4055 0 R 4056 0 R 4057 0 R 4058 0 R 4059 0 R] +/P 1185 0 R +/S /TR +>> +endobj +3011 0 obj +<< +/K [4060 0 R 4061 0 R 4062 0 R 4063 0 R 4064 0 R 4065 0 R 4066 0 R] +/P 1188 0 R +/S /TR +>> +endobj +3012 0 obj +<< +/K [4067 0 R 4068 0 R 4069 0 R 4070 0 R 4071 0 R 4072 0 R 4073 0 R] +/P 1188 0 R +/S /TR +>> +endobj +3013 0 obj +<< +/K [4074 0 R 4075 0 R 4076 0 R 4077 0 R 4078 0 R 4079 0 R 4080 0 R] +/P 1188 0 R +/S /TR +>> +endobj +3014 0 obj +<< +/K [4081 0 R 4082 0 R 4083 0 R 4084 0 R 4085 0 R 4086 0 R] +/P 1190 0 R +/S /TR +>> +endobj +3015 0 obj +<< +/K [4087 0 R 4088 0 R 4089 0 R 4090 0 R 4091 0 R 4092 0 R] +/P 1190 0 R +/S /TR +>> +endobj +3016 0 obj +<< +/K [4093 0 R 4094 0 R 4095 0 R 4096 0 R 4097 0 R 4098 0 R] +/P 1190 0 R +/S /TR +>> +endobj +3017 0 obj +<< +/K [4099 0 R 4100 0 R 4101 0 R 4102 0 R 4103 0 R 4104 0 R] +/P 1192 0 R +/S /TR +>> +endobj +3018 0 obj +<< +/K [4105 0 R 4106 0 R 4107 0 R 4108 0 R 4109 0 R 4110 0 R] +/P 1192 0 R +/S /TR +>> +endobj +3019 0 obj +<< +/K [4111 0 R 4112 0 R 4113 0 R 4114 0 R 4115 0 R 4116 0 R] +/P 1192 0 R +/S /TR +>> +endobj +3020 0 obj +<< +/K [4117 0 R 4118 0 R 4119 0 R 4120 0 R 4121 0 R 4122 0 R] +/P 1194 0 R +/S /TR +>> +endobj +3021 0 obj +<< +/K [4123 0 R 4124 0 R 4125 0 R 4126 0 R 4127 0 R 4128 0 R] +/P 1194 0 R +/S /TR +>> +endobj +3022 0 obj +<< +/K [4129 0 R 4130 0 R 4131 0 R 4132 0 R 4133 0 R 4134 0 R] +/P 1194 0 R +/S /TR +>> +endobj +3023 0 obj +<< +/K [4135 0 R 4136 0 R 4137 0 R 4138 0 R 4139 0 R 4140 0 R 4141 0 R 4142 0 R] +/P 1197 0 R +/S /TR +>> +endobj +3024 0 obj +<< +/K [4143 0 R 4144 0 R 4145 0 R 4146 0 R 4147 0 R 4148 0 R 4149 0 R 4150 0 R] +/P 1197 0 R +/S /TR +>> +endobj +3025 0 obj +<< +/K [4151 0 R 4152 0 R 4153 0 R 4154 0 R 4155 0 R 4156 0 R 4157 0 R 4158 0 R] +/P 1197 0 R +/S /TR +>> +endobj +3026 0 obj +<< +/K [4159 0 R 4160 0 R 4161 0 R 4162 0 R 4163 0 R 4164 0 R] +/P 1199 0 R +/S /TR +>> +endobj +3027 0 obj +<< +/K [4165 0 R 4166 0 R 4167 0 R 4168 0 R 4169 0 R 4170 0 R] +/P 1199 0 R +/S /TR +>> +endobj +3028 0 obj +<< +/K [4171 0 R 4172 0 R 4173 0 R 4174 0 R 4175 0 R 4176 0 R] +/P 1199 0 R +/S /TR +>> +endobj +3029 0 obj +<< +/K [4177 0 R 4178 0 R 4179 0 R 4180 0 R 4181 0 R 4182 0 R 4183 0 R 4184 0 R] +/P 1201 0 R +/S /TR +>> +endobj +3030 0 obj +<< +/K [4185 0 R 4186 0 R 4187 0 R 4188 0 R 4189 0 R 4190 0 R 4191 0 R 4192 0 R] +/P 1201 0 R +/S /TR +>> +endobj +3031 0 obj +<< +/K [4193 0 R 4194 0 R 4195 0 R 4196 0 R 4197 0 R 4198 0 R 4199 0 R 4200 0 R] +/P 1201 0 R +/S /TR +>> +endobj +3032 0 obj +<< +/K [4201 0 R 4202 0 R 4203 0 R 4204 0 R 4205 0 R 4206 0 R] +/P 1203 0 R +/S /TR +>> +endobj +3033 0 obj +<< +/K [4207 0 R 4208 0 R 4209 0 R 4210 0 R 4211 0 R 4212 0 R] +/P 1203 0 R +/S /TR +>> +endobj +3034 0 obj +<< +/K [4213 0 R 4214 0 R 4215 0 R 4216 0 R 4217 0 R 4218 0 R] +/P 1203 0 R +/S /TR +>> +endobj +3035 0 obj +<< +/K [4219 0 R 4220 0 R 4221 0 R 4222 0 R 4223 0 R 4224 0 R 4225 0 R 4226 0 R] +/P 1205 0 R +/S /TR +>> +endobj +3036 0 obj +<< +/K [4227 0 R 4228 0 R 4229 0 R 4230 0 R 4231 0 R 4232 0 R 4233 0 R 4234 0 R] +/P 1205 0 R +/S /TR +>> +endobj +3037 0 obj +<< +/K [4235 0 R 4236 0 R 4237 0 R 4238 0 R 4239 0 R 4240 0 R 4241 0 R 4242 0 R] +/P 1205 0 R +/S /TR +>> +endobj +3038 0 obj +<< +/K [4243 0 R 4244 0 R 4245 0 R 4246 0 R 4247 0 R 4248 0 R] +/P 1207 0 R +/S /TR +>> +endobj +3039 0 obj +<< +/K [4249 0 R 4250 0 R 4251 0 R 4252 0 R 4253 0 R 4254 0 R] +/P 1207 0 R +/S /TR +>> +endobj +3040 0 obj +<< +/K [4255 0 R 4256 0 R 4257 0 R 4258 0 R 4259 0 R 4260 0 R] +/P 1207 0 R +/S /TR +>> +endobj +3041 0 obj +<< +/K [4261 0 R 4262 0 R 4263 0 R 4264 0 R 4265 0 R 4266 0 R] +/P 1209 0 R +/S /TR +>> +endobj +3042 0 obj +<< +/K [4267 0 R 4268 0 R 4269 0 R 4270 0 R 4271 0 R 4272 0 R] +/P 1209 0 R +/S /TR +>> +endobj +3043 0 obj +<< +/K [4273 0 R 4274 0 R 4275 0 R 4276 0 R 4277 0 R 4278 0 R] +/P 1209 0 R +/S /TR +>> +endobj +3044 0 obj +<< +/K [4279 0 R 4280 0 R 4281 0 R 4282 0 R 4283 0 R 4284 0 R] +/P 1211 0 R +/S /TR +>> +endobj +3045 0 obj +<< +/K [4285 0 R 4286 0 R 4287 0 R 4288 0 R 4289 0 R 4290 0 R] +/P 1211 0 R +/S /TR +>> +endobj +3046 0 obj +<< +/K [4291 0 R 4292 0 R 4293 0 R 4294 0 R 4295 0 R 4296 0 R] +/P 1211 0 R +/S /TR +>> +endobj +3047 0 obj +<< +/K [4297 0 R 4298 0 R 4299 0 R 4300 0 R 4301 0 R 4302 0 R] +/P 1213 0 R +/S /TR +>> +endobj +3048 0 obj +<< +/K [4303 0 R 4304 0 R 4305 0 R 4306 0 R 4307 0 R 4308 0 R] +/P 1213 0 R +/S /TR +>> +endobj +3049 0 obj +<< +/K [4309 0 R 4310 0 R 4311 0 R 4312 0 R 4313 0 R 4314 0 R] +/P 1213 0 R +/S /TR +>> +endobj +3050 0 obj +<< +/K [4315 0 R 4316 0 R 4317 0 R 4318 0 R 4319 0 R 4320 0 R 4321 0 R] +/P 1215 0 R +/S /TR +>> +endobj +3051 0 obj +<< +/K [4322 0 R 4323 0 R 4324 0 R 4325 0 R 4326 0 R 4327 0 R 4328 0 R] +/P 1215 0 R +/S /TR +>> +endobj +3052 0 obj +<< +/K [4329 0 R 4330 0 R 4331 0 R 4332 0 R 4333 0 R 4334 0 R 4335 0 R] +/P 1215 0 R +/S /TR +>> +endobj +3053 0 obj +<< +/K [4336 0 R 4337 0 R 4338 0 R 4339 0 R 4340 0 R 4341 0 R 4342 0 R 4343 0 R 4344 0 R] +/P 1217 0 R +/S /TR +>> +endobj +3054 0 obj +<< +/K [4345 0 R 4346 0 R 4347 0 R 4348 0 R 4349 0 R 4350 0 R 4351 0 R 4352 0 R 4353 0 R] +/P 1217 0 R +/S /TR +>> +endobj +3055 0 obj +<< +/K [4354 0 R 4355 0 R 4356 0 R 4357 0 R 4358 0 R 4359 0 R 4360 0 R 4361 0 R 4362 0 R] +/P 1217 0 R +/S /TR +>> +endobj +3056 0 obj +<< +/K [4363 0 R 4364 0 R 4365 0 R 4366 0 R 4367 0 R 4368 0 R 4369 0 R 4370 0 R] +/P 1219 0 R +/S /TR +>> +endobj +3057 0 obj +<< +/K [4371 0 R 4372 0 R 4373 0 R 4374 0 R 4375 0 R 4376 0 R 4377 0 R 4378 0 R] +/P 1219 0 R +/S /TR +>> +endobj +3058 0 obj +<< +/K [4379 0 R 4380 0 R 4381 0 R 4382 0 R 4383 0 R 4384 0 R 4385 0 R 4386 0 R] +/P 1219 0 R +/S /TR +>> +endobj +3059 0 obj +<< +/K [4387 0 R 4388 0 R 4389 0 R 4390 0 R 4391 0 R 4392 0 R] +/P 1223 0 R +/S /TR +>> +endobj +3060 0 obj +<< +/K [4393 0 R 4394 0 R 4395 0 R 4396 0 R 4397 0 R 4398 0 R] +/P 1223 0 R +/S /TR +>> +endobj +3061 0 obj +<< +/K [4399 0 R 4400 0 R 4401 0 R 4402 0 R 4403 0 R 4404 0 R] +/P 1223 0 R +/S /TR +>> +endobj +3062 0 obj +<< +/K [4405 0 R 4406 0 R 4407 0 R 4408 0 R 4409 0 R 4410 0 R 4411 0 R] +/P 1225 0 R +/S /TR +>> +endobj +3063 0 obj +<< +/K [4412 0 R 4413 0 R 4414 0 R 4415 0 R 4416 0 R 4417 0 R 4418 0 R] +/P 1225 0 R +/S /TR +>> +endobj +3064 0 obj +<< +/K [4419 0 R 4420 0 R 4421 0 R 4422 0 R 4423 0 R 4424 0 R 4425 0 R] +/P 1225 0 R +/S /TR +>> +endobj +3065 0 obj +<< +/Placement /Inline +/O /Layout +/BBox [87.0 103.0 508.0 734.0] +>> +endobj +3066 0 obj +<< +/Placement /Inline +/O /Layout +/BBox [87.0 137.0 524.0 720.0] +>> +endobj +3067 0 obj +<< +/K [4504 0 R 4505 0 R 4506 0 R 4507 0 R 4508 0 R 4509 0 R 4510 0 R 4511 0 R] +/P 1230 0 R +/S /TR +>> +endobj +3068 0 obj +<< +/K [4551 0 R 4512 0 R 4513 0 R 4514 0 R 4568 0 R 4515 0 R 4516 0 R 4517 0 R] +/P 1230 0 R +/S /TR +>> +endobj +3069 0 obj +<< +/K [4647 0 R 4518 0 R 4519 0 R 4520 0 R 4648 0 R 4521 0 R 4522 0 R 4523 0 R] +/P 1230 0 R +/S /TR +>> +endobj +3070 0 obj +<< +/K [4649 0 R 4524 0 R 4525 0 R 4526 0 R 4650 0 R 4527 0 R 4528 0 R 4529 0 R] +/P 1230 0 R +/S /TR +>> +endobj +3071 0 obj +<< +/K [4651 0 R 4530 0 R 4531 0 R 4532 0 R 4652 0 R 4533 0 R 4534 0 R 4535 0 R] +/P 1230 0 R +/S /TR +>> +endobj +3072 0 obj +<< +/K [4653 0 R 4536 0 R 4537 0 R 4538 0 R 4654 0 R 4539 0 R 4540 0 R 4541 0 R] +/P 1230 0 R +/S /TR +>> +endobj +3073 0 obj +<< +/K [4655 0 R 4542 0 R 4543 0 R 4545 0 R 4656 0 R 4546 0 R 4547 0 R 4548 0 R] +/P 1230 0 R +/S /TR +>> +endobj +3074 0 obj +<< +/K [4657 0 R 4552 0 R 4553 0 R 4554 0 R 4658 0 R 4555 0 R 4556 0 R 4557 0 R] +/P 1230 0 R +/S /TR +>> +endobj +3075 0 obj +<< +/K [4585 0 R 4558 0 R 4559 0 R 4560 0 R 4659 0 R 4561 0 R 4562 0 R 4563 0 R] +/P 1230 0 R +/S /TR +>> +endobj +3076 0 obj +<< +/K [4660 0 R 4564 0 R 4565 0 R 4566 0 R 4661 0 R 4569 0 R 4570 0 R 4571 0 R] +/P 1230 0 R +/S /TR +>> +endobj +3077 0 obj +<< +/K [4662 0 R 4572 0 R 4573 0 R 4574 0 R 4590 0 R 4575 0 R 4576 0 R 4577 0 R] +/P 1230 0 R +/S /TR +>> +endobj +3078 0 obj +<< +/K [4663 0 R 4578 0 R 4579 0 R 4580 0 R 4664 0 R 4581 0 R 4582 0 R 4583 0 R] +/P 1230 0 R +/S /TR +>> +endobj +3079 0 obj +<< +/K [4665 0 R 4586 0 R 4587 0 R 4588 0 R 4666 0 R 4591 0 R 4592 0 R 4593 0 R] +/P 1230 0 R +/S /TR +>> +endobj +3080 0 obj +<< +/K [4426 0 R 4427 0 R 4428 0 R 4429 0 R 4430 0 R 4431 0 R] +/P 1232 0 R +/S /TR +>> +endobj +3081 0 obj +<< +/K [4432 0 R 4433 0 R 4434 0 R 4435 0 R 4436 0 R 4437 0 R] +/P 1232 0 R +/S /TR +>> +endobj +3082 0 obj +<< +/K [4438 0 R 4439 0 R 4440 0 R 4441 0 R 4442 0 R 4443 0 R] +/P 1232 0 R +/S /TR +>> +endobj +3083 0 obj +<< +/K [4444 0 R 4445 0 R 4446 0 R 4447 0 R 4448 0 R 4449 0 R] +/P 1232 0 R +/S /TR +>> +endobj +3084 0 obj +<< +/K [4450 0 R 4451 0 R 4452 0 R 4453 0 R 4454 0 R 4455 0 R] +/P 1232 0 R +/S /TR +>> +endobj +3085 0 obj +<< +/K [4456 0 R 4457 0 R 4458 0 R 4459 0 R 4460 0 R 4461 0 R] +/P 1232 0 R +/S /TR +>> +endobj +3086 0 obj +<< +/K [4462 0 R 4463 0 R 4464 0 R 4465 0 R 4466 0 R 4467 0 R] +/P 1232 0 R +/S /TR +>> +endobj +3087 0 obj +<< +/K [4468 0 R 4469 0 R 4470 0 R 4471 0 R 4472 0 R 4473 0 R] +/P 1232 0 R +/S /TR +>> +endobj +3088 0 obj +<< +/K [4474 0 R 4475 0 R 4476 0 R 4477 0 R 4478 0 R 4479 0 R] +/P 1232 0 R +/S /TR +>> +endobj +3089 0 obj +<< +/K [4480 0 R 4481 0 R 4482 0 R 4483 0 R 4484 0 R 4485 0 R] +/P 1232 0 R +/S /TR +>> +endobj +3090 0 obj +<< +/K [4486 0 R 4487 0 R 4488 0 R 4489 0 R 4490 0 R 4491 0 R] +/P 1232 0 R +/S /TR +>> +endobj +3091 0 obj +<< +/K [4492 0 R 4493 0 R 4494 0 R 4495 0 R 4496 0 R 4497 0 R] +/P 1232 0 R +/S /TR +>> +endobj +3092 0 obj +<< +/K [4498 0 R 4499 0 R 4500 0 R 4501 0 R 4502 0 R 4503 0 R] +/P 1232 0 R +/S /TR +>> +endobj +3093 0 obj +<< +/Placement /Inline +/O /Layout +/BBox [199.0 527.0 404.0 656.0] +>> +endobj +3094 0 obj +<< +/Obj 835 0 R +/Type /OBJR +>> +endobj +3095 0 obj +<< +/Obj 836 0 R +/Type /OBJR +>> +endobj +3096 0 obj +<< +/Obj 837 0 R +/Type /OBJR +>> +endobj +3097 0 obj +<< +/Obj 838 0 R +/Type /OBJR +>> +endobj +3098 0 obj +<< +/Obj 839 0 R +/Type /OBJR +>> +endobj +3099 0 obj +<< +/Obj 840 0 R +/Type /OBJR +>> +endobj +3100 0 obj +<< +/Obj 841 0 R +/Type /OBJR +>> +endobj +3101 0 obj +<< +/Obj 842 0 R +/Type /OBJR +>> +endobj +3102 0 obj +<< +/Obj 843 0 R +/Type /OBJR +>> +endobj +3103 0 obj +<< +/Obj 844 0 R +/Type /OBJR +>> +endobj +3104 0 obj +<< +/Obj 845 0 R +/Type /OBJR +>> +endobj +3105 0 obj +<< +/Obj 846 0 R +/Type /OBJR +>> +endobj +3106 0 obj +<< +/Obj 847 0 R +/Type /OBJR +>> +endobj +3107 0 obj +<< +/Obj 848 0 R +/Type /OBJR +>> +endobj +3108 0 obj +<< +/Obj 849 0 R +/Type /OBJR +>> +endobj +3109 0 obj +<< +/Obj 850 0 R +/Type /OBJR +>> +endobj +3110 0 obj +<< +/Obj 851 0 R +/Type /OBJR +>> +endobj +3111 0 obj +<< +/Obj 852 0 R +/Type /OBJR +>> +endobj +3112 0 obj +<< +/Obj 853 0 R +/Type /OBJR +>> +endobj +3113 0 obj +<< +/Obj 854 0 R +/Type /OBJR +>> +endobj +3114 0 obj +<< +/Obj 855 0 R +/Type /OBJR +>> +endobj +3115 0 obj +<< +/Obj 856 0 R +/Type /OBJR +>> +endobj +3116 0 obj +<< +/Obj 857 0 R +/Type /OBJR +>> +endobj +3117 0 obj +<< +/Obj 858 0 R +/Type /OBJR +>> +endobj +3118 0 obj +<< +/Obj 859 0 R +/Type /OBJR +>> +endobj +3119 0 obj +<< +/Obj 860 0 R +/Type /OBJR +>> +endobj +3120 0 obj +<< +/Obj 861 0 R +/Type /OBJR +>> +endobj +3121 0 obj +<< +/Obj 862 0 R +/Type /OBJR +>> +endobj +3122 0 obj +<< +/Obj 863 0 R +/Type /OBJR +>> +endobj +3123 0 obj +<< +/Obj 864 0 R +/Type /OBJR +>> +endobj +3124 0 obj +<< +/Obj 865 0 R +/Type /OBJR +>> +endobj +3125 0 obj +<< +/Obj 866 0 R +/Type /OBJR +>> +endobj +3126 0 obj +<< +/Obj 867 0 R +/Type /OBJR +>> +endobj +3127 0 obj +<< +/Obj 868 0 R +/Type /OBJR +>> +endobj +3128 0 obj +<< +/Obj 869 0 R +/Type /OBJR +>> +endobj +3129 0 obj +<< +/A 4667 0 R +/K 1274 0 R +/P 2852 0 R +/S /TD +>> +endobj +3130 0 obj +<< +/A 4667 0 R +/K 1275 0 R +/P 2852 0 R +/S /TD +>> +endobj +3131 0 obj +<< +/A 4667 0 R +/K 1276 0 R +/P 2852 0 R +/S /TD +>> +endobj +3132 0 obj +<< +/A 4667 0 R +/K 1277 0 R +/P 2852 0 R +/S /TD +>> +endobj +3133 0 obj +<< +/A 4668 0 R +/K 1278 0 R +/P 2853 0 R +/S /TD +>> +endobj +3134 0 obj +<< +/A 4668 0 R +/K 1279 0 R +/P 2853 0 R +/S /TD +>> +endobj +3135 0 obj +<< +/A 4668 0 R +/K 1280 0 R +/P 2853 0 R +/S /TD +>> +endobj +3136 0 obj +<< +/A 4668 0 R +/K 1281 0 R +/P 2853 0 R +/S /TD +>> +endobj +3137 0 obj +<< +/A 4667 0 R +/K 1282 0 R +/P 2854 0 R +/S /TD +>> +endobj +3138 0 obj +<< +/A 4667 0 R +/K 1283 0 R +/P 2854 0 R +/S /TD +>> +endobj +3139 0 obj +<< +/A 4667 0 R +/K 1284 0 R +/P 2854 0 R +/S /TD +>> +endobj +3140 0 obj +<< +/A 4667 0 R +/K 1285 0 R +/P 2854 0 R +/S /TD +>> +endobj +3141 0 obj +<< +/A 4668 0 R +/K 1286 0 R +/P 2855 0 R +/S /TD +>> +endobj +3142 0 obj +<< +/A 4668 0 R +/K 1287 0 R +/P 2855 0 R +/S /TD +>> +endobj +3143 0 obj +<< +/A 4668 0 R +/K 1288 0 R +/P 2855 0 R +/S /TD +>> +endobj +3144 0 obj +<< +/A 4668 0 R +/K 1289 0 R +/P 2855 0 R +/S /TD +>> +endobj +3145 0 obj +<< +/A 4667 0 R +/K 1290 0 R +/P 2856 0 R +/S /TD +>> +endobj +3146 0 obj +<< +/A 4667 0 R +/K 1291 0 R +/P 2856 0 R +/S /TD +>> +endobj +3147 0 obj +<< +/A 4667 0 R +/K 1292 0 R +/P 2856 0 R +/S /TD +>> +endobj +3148 0 obj +<< +/A 4667 0 R +/K 1293 0 R +/P 2856 0 R +/S /TD +>> +endobj +3149 0 obj +<< +/A 4668 0 R +/K 1294 0 R +/P 2857 0 R +/S /TD +>> +endobj +3150 0 obj +<< +/A 4668 0 R +/K 1295 0 R +/P 2857 0 R +/S /TD +>> +endobj +3151 0 obj +<< +/A 4668 0 R +/K 1296 0 R +/P 2857 0 R +/S /TD +>> +endobj +3152 0 obj +<< +/A 4668 0 R +/K 1297 0 R +/P 2857 0 R +/S /TD +>> +endobj +3153 0 obj +<< +/SpaceAfter 0.0 +/TextAlign /Justify +/O /Layout +/WritingMode /LrTb +/SpaceBefore 0.0 +/TextIndent -21.0 +/EndIndent 0.0 +/StartIndent 50.0 +>> +endobj +3154 0 obj +<< +/A [4667 0 R 4669 0 R] +/K 1299 0 R +/P 2858 0 R +/S /TD +>> +endobj +3155 0 obj +<< +/A [4667 0 R 4670 0 R] +/K 1300 0 R +/P 2858 0 R +/S /TD +>> +endobj +3156 0 obj +<< +/A 4667 0 R +/K 1301 0 R +/P 2859 0 R +/S /TD +>> +endobj +3157 0 obj +<< +/A 4667 0 R +/K 1302 0 R +/P 2859 0 R +/S /TD +>> +endobj +3158 0 obj +<< +/A 4667 0 R +/K 1303 0 R +/P 2859 0 R +/S /TD +>> +endobj +3159 0 obj +<< +/A 4667 0 R +/K 1304 0 R +/P 2858 0 R +/S /TD +>> +endobj +3160 0 obj +<< +/A 4667 0 R +/K 1305 0 R +/P 2858 0 R +/S /TD +>> +endobj +3161 0 obj +<< +/A 4668 0 R +/K 1306 0 R +/P 2860 0 R +/S /TD +>> +endobj +3162 0 obj +<< +/A 4668 0 R +/K 1307 0 R +/P 2860 0 R +/S /TD +>> +endobj +3163 0 obj +<< +/A 4668 0 R +/K 1308 0 R +/P 2860 0 R +/S /TD +>> +endobj +3164 0 obj +<< +/A 4668 0 R +/K 1309 0 R +/P 2860 0 R +/S /TD +>> +endobj +3165 0 obj +<< +/A 4668 0 R +/K 1310 0 R +/P 2860 0 R +/S /TD +>> +endobj +3166 0 obj +<< +/A 4668 0 R +/K 1311 0 R +/P 2860 0 R +/S /TD +>> +endobj +3167 0 obj +<< +/A 4667 0 R +/K 1312 0 R +/P 2861 0 R +/S /TD +>> +endobj +3168 0 obj +<< +/O /Layout +/BaselineShift -4 +>> +endobj +3169 0 obj +<< +/A 4667 0 R +/K 1314 0 R +/P 2861 0 R +/S /TD +>> +endobj +3170 0 obj +<< +/A 4667 0 R +/K 1315 0 R +/P 2861 0 R +/S /TD +>> +endobj +3171 0 obj +<< +/A 4667 0 R +/K 1316 0 R +/P 2861 0 R +/S /TD +>> +endobj +3172 0 obj +<< +/A 4667 0 R +/K 1317 0 R +/P 2861 0 R +/S /TD +>> +endobj +3173 0 obj +<< +/A 4667 0 R +/K 1318 0 R +/P 2861 0 R +/S /TD +>> +endobj +3174 0 obj +<< +/A 4668 0 R +/K 1319 0 R +/P 2862 0 R +/S /TD +>> +endobj +3175 0 obj +<< +/A 4668 0 R +/K 1320 0 R +/P 2862 0 R +/S /TD +>> +endobj +3176 0 obj +<< +/A 4668 0 R +/K 1321 0 R +/P 2862 0 R +/S /TD +>> +endobj +3177 0 obj +<< +/A 4668 0 R +/K 1322 0 R +/P 2862 0 R +/S /TD +>> +endobj +3178 0 obj +<< +/A 4668 0 R +/K 1323 0 R +/P 2862 0 R +/S /TD +>> +endobj +3179 0 obj +<< +/A 4668 0 R +/K 1324 0 R +/P 2862 0 R +/S /TD +>> +endobj +3180 0 obj +<< +/A 4667 0 R +/K 1325 0 R +/P 2863 0 R +/S /TD +>> +endobj +3181 0 obj +<< +/A 4667 0 R +/K 1326 0 R +/P 2863 0 R +/S /TD +>> +endobj +3182 0 obj +<< +/A 4667 0 R +/K 1327 0 R +/P 2863 0 R +/S /TD +>> +endobj +3183 0 obj +<< +/A 4667 0 R +/K 1328 0 R +/P 2863 0 R +/S /TD +>> +endobj +3184 0 obj +<< +/A 4667 0 R +/K 1329 0 R +/P 2863 0 R +/S /TD +>> +endobj +3185 0 obj +<< +/A 4667 0 R +/K 1330 0 R +/P 2863 0 R +/S /TD +>> +endobj +3186 0 obj +<< +/SpaceAfter 0.0 +/TextAlign /Justify +/O /Layout +/WritingMode /LrTb +/SpaceBefore 7.0 +/TextIndent -21.0 +/EndIndent 0.0 +/StartIndent 50.0 +>> +endobj +3187 0 obj +<< +/A [4667 0 R 4671 0 R] +/K 1332 0 R +/P 2864 0 R +/S /TD +>> +endobj +3188 0 obj +<< +/A [4667 0 R 4672 0 R] +/K 1333 0 R +/P 2864 0 R +/S /TD +>> +endobj +3189 0 obj +<< +/A [4667 0 R 4673 0 R] +/K 1334 0 R +/P 2864 0 R +/S /TD +>> +endobj +3190 0 obj +<< +/A 4667 0 R +/K 1335 0 R +/P 2865 0 R +/S /TD +>> +endobj +3191 0 obj +<< +/A 4667 0 R +/K 1336 0 R +/P 2865 0 R +/S /TD +>> +endobj +3192 0 obj +<< +/A 4667 0 R +/K 1337 0 R +/P 2865 0 R +/S /TD +>> +endobj +3193 0 obj +<< +/A 4667 0 R +/K 1338 0 R +/P 2864 0 R +/S /TD +>> +endobj +3194 0 obj +<< +/A 4667 0 R +/K 1339 0 R +/P 2864 0 R +/S /TD +>> +endobj +3195 0 obj +<< +/A 4668 0 R +/K 1340 0 R +/P 2866 0 R +/S /TD +>> +endobj +3196 0 obj +<< +/O /Layout +/BaselineShift -4 +>> +endobj +3197 0 obj +<< +/A 4668 0 R +/K 1342 0 R +/P 2866 0 R +/S /TD +>> +endobj +3198 0 obj +<< +/O /Layout +/BaselineShift -4 +>> +endobj +3199 0 obj +<< +/A 4668 0 R +/K 1344 0 R +/P 2866 0 R +/S /TD +>> +endobj +3200 0 obj +<< +/A 4668 0 R +/K 1345 0 R +/P 2866 0 R +/S /TD +>> +endobj +3201 0 obj +<< +/A 4668 0 R +/K 1346 0 R +/P 2866 0 R +/S /TD +>> +endobj +3202 0 obj +<< +/A 4668 0 R +/K 1347 0 R +/P 2866 0 R +/S /TD +>> +endobj +3203 0 obj +<< +/A 4668 0 R +/K 1348 0 R +/P 2866 0 R +/S /TD +>> +endobj +3204 0 obj +<< +/A 4667 0 R +/K 1349 0 R +/P 2867 0 R +/S /TD +>> +endobj +3205 0 obj +<< +/O /Layout +/BaselineShift -4 +>> +endobj +3206 0 obj +<< +/A 4667 0 R +/K 1351 0 R +/P 2867 0 R +/S /TD +>> +endobj +3207 0 obj +<< +/O /Layout +/BaselineShift -4 +>> +endobj +3208 0 obj +<< +/A 4667 0 R +/K 1353 0 R +/P 2867 0 R +/S /TD +>> +endobj +3209 0 obj +<< +/A 4667 0 R +/K 1354 0 R +/P 2867 0 R +/S /TD +>> +endobj +3210 0 obj +<< +/A 4667 0 R +/K 1355 0 R +/P 2867 0 R +/S /TD +>> +endobj +3211 0 obj +<< +/A 4667 0 R +/K 1356 0 R +/P 2867 0 R +/S /TD +>> +endobj +3212 0 obj +<< +/A 4667 0 R +/K 1357 0 R +/P 2867 0 R +/S /TD +>> +endobj +3213 0 obj +<< +/A [4667 0 R 4674 0 R] +/K 1359 0 R +/P 2868 0 R +/S /TD +>> +endobj +3214 0 obj +<< +/A [4667 0 R 4675 0 R] +/K 1360 0 R +/P 2868 0 R +/S /TD +>> +endobj +3215 0 obj +<< +/A [4667 0 R 4676 0 R] +/K 1361 0 R +/P 2868 0 R +/S /TD +>> +endobj +3216 0 obj +<< +/A 4667 0 R +/K 1362 0 R +/P 2869 0 R +/S /TD +>> +endobj +3217 0 obj +<< +/A 4667 0 R +/K 1363 0 R +/P 2869 0 R +/S /TD +>> +endobj +3218 0 obj +<< +/A 4667 0 R +/K 1364 0 R +/P 2869 0 R +/S /TD +>> +endobj +3219 0 obj +<< +/A 4667 0 R +/K 1365 0 R +/P 2868 0 R +/S /TD +>> +endobj +3220 0 obj +<< +/A 4667 0 R +/K 1366 0 R +/P 2868 0 R +/S /TD +>> +endobj +3221 0 obj +<< +/A 4668 0 R +/K 1367 0 R +/P 2870 0 R +/S /TD +>> +endobj +3222 0 obj +<< +/O /Layout +/BaselineShift -4 +>> +endobj +3223 0 obj +<< +/A 4668 0 R +/K 1369 0 R +/P 2870 0 R +/S /TD +>> +endobj +3224 0 obj +<< +/A 4668 0 R +/K 1370 0 R +/P 2870 0 R +/S /TD +>> +endobj +3225 0 obj +<< +/A 4668 0 R +/K 1371 0 R +/P 2870 0 R +/S /TD +>> +endobj +3226 0 obj +<< +/A 4668 0 R +/K 1372 0 R +/P 2870 0 R +/S /TD +>> +endobj +3227 0 obj +<< +/A 4668 0 R +/K 1373 0 R +/P 2870 0 R +/S /TD +>> +endobj +3228 0 obj +<< +/A 4668 0 R +/K 1374 0 R +/P 2870 0 R +/S /TD +>> +endobj +3229 0 obj +<< +/A 4667 0 R +/K 1375 0 R +/P 2871 0 R +/S /TD +>> +endobj +3230 0 obj +<< +/O /Layout +/BaselineShift -4 +>> +endobj +3231 0 obj +<< +/A 4667 0 R +/K 1377 0 R +/P 2871 0 R +/S /TD +>> +endobj +3232 0 obj +<< +/A 4667 0 R +/K 1378 0 R +/P 2871 0 R +/S /TD +>> +endobj +3233 0 obj +<< +/A 4667 0 R +/K 1379 0 R +/P 2871 0 R +/S /TD +>> +endobj +3234 0 obj +<< +/A 4667 0 R +/K 1380 0 R +/P 2871 0 R +/S /TD +>> +endobj +3235 0 obj +<< +/A 4667 0 R +/K 1381 0 R +/P 2871 0 R +/S /TD +>> +endobj +3236 0 obj +<< +/A 4667 0 R +/K 1382 0 R +/P 2871 0 R +/S /TD +>> +endobj +3237 0 obj +<< +/A 4668 0 R +/K 1383 0 R +/P 2872 0 R +/S /TD +>> +endobj +3238 0 obj +<< +/O /Layout +/BaselineShift -4 +>> +endobj +3239 0 obj +<< +/A 4668 0 R +/K 1385 0 R +/P 2872 0 R +/S /TD +>> +endobj +3240 0 obj +<< +/A 4668 0 R +/K 1386 0 R +/P 2872 0 R +/S /TD +>> +endobj +3241 0 obj +<< +/A 4668 0 R +/K 1387 0 R +/P 2872 0 R +/S /TD +>> +endobj +3242 0 obj +<< +/A 4668 0 R +/K 1388 0 R +/P 2872 0 R +/S /TD +>> +endobj +3243 0 obj +<< +/A [4667 0 R 4677 0 R] +/K 1389 0 R +/P 2872 0 R +/S /TD +>> +endobj +3244 0 obj +<< +/O /Layout +/BaselineShift -4 +>> +endobj +3245 0 obj +<< +/A 4667 0 R +/K 1391 0 R +/P 2873 0 R +/S /TD +>> +endobj +3246 0 obj +<< +/O /Layout +/BaselineShift -4 +>> +endobj +3247 0 obj +<< +/A 4667 0 R +/K 1393 0 R +/P 2873 0 R +/S /TD +>> +endobj +3248 0 obj +<< +/A 4667 0 R +/K 1394 0 R +/P 2873 0 R +/S /TD +>> +endobj +3249 0 obj +<< +/A 4667 0 R +/K 1395 0 R +/P 2873 0 R +/S /TD +>> +endobj +3250 0 obj +<< +/A 4667 0 R +/K 1396 0 R +/P 2873 0 R +/S /TD +>> +endobj +3251 0 obj +<< +/A [4668 0 R 4678 0 R] +/K 1397 0 R +/P 2872 0 R +/S /TD +>> +endobj +3252 0 obj +<< +/A 4668 0 R +/K 1398 0 R +/P 2874 0 R +/S /TD +>> +endobj +3253 0 obj +<< +/O /Layout +/BaselineShift -4 +>> +endobj +3254 0 obj +<< +/A 4668 0 R +/K 1400 0 R +/P 2874 0 R +/S /TD +>> +endobj +3255 0 obj +<< +/A 4668 0 R +/K 1401 0 R +/P 2874 0 R +/S /TD +>> +endobj +3256 0 obj +<< +/A 4668 0 R +/K 1402 0 R +/P 2874 0 R +/S /TD +>> +endobj +3257 0 obj +<< +/A 4668 0 R +/K 1403 0 R +/P 2874 0 R +/S /TD +>> +endobj +3258 0 obj +<< +/A 4668 0 R +/K 1404 0 R +/P 2874 0 R +/S /TD +>> +endobj +3259 0 obj +<< +/A 4668 0 R +/K 1405 0 R +/P 2874 0 R +/S /TD +>> +endobj +3260 0 obj +<< +/A 4667 0 R +/K 1406 0 R +/P 2875 0 R +/S /TD +>> +endobj +3261 0 obj +<< +/A 4667 0 R +/K 1407 0 R +/P 2875 0 R +/S /TD +>> +endobj +3262 0 obj +<< +/A 4667 0 R +/K 1408 0 R +/P 2875 0 R +/S /TD +>> +endobj +3263 0 obj +<< +/A 4667 0 R +/K 1409 0 R +/P 2875 0 R +/S /TD +>> +endobj +3264 0 obj +<< +/A 4668 0 R +/K 1410 0 R +/P 2876 0 R +/S /TD +>> +endobj +3265 0 obj +<< +/A 4668 0 R +/K 1411 0 R +/P 2876 0 R +/S /TD +>> +endobj +3266 0 obj +<< +/A 4668 0 R +/K 1412 0 R +/P 2876 0 R +/S /TD +>> +endobj +3267 0 obj +<< +/A 4668 0 R +/K 1413 0 R +/P 2876 0 R +/S /TD +>> +endobj +3268 0 obj +<< +/A 4667 0 R +/K 1414 0 R +/P 2877 0 R +/S /TD +>> +endobj +3269 0 obj +<< +/A 4667 0 R +/K 1415 0 R +/P 2877 0 R +/S /TD +>> +endobj +3270 0 obj +<< +/A 4667 0 R +/K 1416 0 R +/P 2877 0 R +/S /TD +>> +endobj +3271 0 obj +<< +/A 4667 0 R +/K 1417 0 R +/P 2877 0 R +/S /TD +>> +endobj +3272 0 obj +<< +/A 4668 0 R +/K 1418 0 R +/P 2878 0 R +/S /TD +>> +endobj +3273 0 obj +<< +/A 4668 0 R +/K 1419 0 R +/P 2878 0 R +/S /TD +>> +endobj +3274 0 obj +<< +/A 4668 0 R +/K 1420 0 R +/P 2878 0 R +/S /TD +>> +endobj +3275 0 obj +<< +/A 4668 0 R +/K 1421 0 R +/P 2878 0 R +/S /TD +>> +endobj +3276 0 obj +<< +/A 4667 0 R +/K 1422 0 R +/P 2879 0 R +/S /TD +>> +endobj +3277 0 obj +<< +/A 4667 0 R +/K 1423 0 R +/P 2879 0 R +/S /TD +>> +endobj +3278 0 obj +<< +/A 4667 0 R +/K 1424 0 R +/P 2879 0 R +/S /TD +>> +endobj +3279 0 obj +<< +/A 4667 0 R +/K 1425 0 R +/P 2879 0 R +/S /TD +>> +endobj +3280 0 obj +<< +/A 4668 0 R +/K 1426 0 R +/P 2880 0 R +/S /TD +>> +endobj +3281 0 obj +<< +/A 4668 0 R +/K 1427 0 R +/P 2880 0 R +/S /TD +>> +endobj +3282 0 obj +<< +/A 4668 0 R +/K 1428 0 R +/P 2880 0 R +/S /TD +>> +endobj +3283 0 obj +<< +/A 4668 0 R +/K 1429 0 R +/P 2880 0 R +/S /TD +>> +endobj +3284 0 obj +<< +/SpaceAfter 0.0 +/TextAlign /Center +/O /Layout +/WritingMode /LrTb +/SpaceBefore 0.0 +/TextIndent 0.0 +/EndIndent 0.0 +/StartIndent -2.99998 +>> +endobj +3285 0 obj +<< +/A 4667 0 R +/K 1430 0 R +/P 2881 0 R +/S /TD +>> +endobj +3286 0 obj +<< +/SpaceAfter 0.0 +/TextAlign /Center +/O /Layout +/WritingMode /LrTb +/SpaceBefore 0.0 +/TextIndent 0.0 +/EndIndent 0.0 +/StartIndent 5.0 +>> +endobj +3287 0 obj +<< +/A 4667 0 R +/K 1431 0 R +/P 2881 0 R +/S /TD +>> +endobj +3288 0 obj +<< +/A 4667 0 R +/K 1432 0 R +/P 2881 0 R +/S /TD +>> +endobj +3289 0 obj +<< +/A 4667 0 R +/K 1433 0 R +/P 2881 0 R +/S /TD +>> +endobj +3290 0 obj +<< +/A 4667 0 R +/K 1434 0 R +/P 2881 0 R +/S /TD +>> +endobj +3291 0 obj +<< +/A 4667 0 R +/K 1435 0 R +/P 2881 0 R +/S /TD +>> +endobj +3292 0 obj +<< +/A 4667 0 R +/K 1436 0 R +/P 2882 0 R +/S /TD +>> +endobj +3293 0 obj +<< +/A 4667 0 R +/K 1437 0 R +/P 2882 0 R +/S /TD +>> +endobj +3294 0 obj +<< +/A 4667 0 R +/K 1438 0 R +/P 2882 0 R +/S /TD +>> +endobj +3295 0 obj +<< +/A 4667 0 R +/K 1439 0 R +/P 2882 0 R +/S /TD +>> +endobj +3296 0 obj +<< +/A 4667 0 R +/K 1440 0 R +/P 2882 0 R +/S /TD +>> +endobj +3297 0 obj +<< +/A 4667 0 R +/K 1441 0 R +/P 2882 0 R +/S /TD +>> +endobj +3298 0 obj +<< +/SpaceAfter 0.0 +/TextAlign /Justify +/O /Layout +/WritingMode /LrTb +/SpaceBefore 0.0 +/TextIndent -21.0 +/EndIndent 0.0 +/StartIndent 84.0 +>> +endobj +3299 0 obj +<< +/SpaceAfter 2.0 +/TextAlign /Center +/O /Layout +/WritingMode /LrTb +/SpaceBefore 0.0 +/TextIndent 0.0 +/EndIndent 0.0 +/StartIndent 0.0 +>> +endobj +3300 0 obj +<< +/A 4667 0 R +/K 1446 0 R +/P 2883 0 R +/S /TD +>> +endobj +3301 0 obj +<< +/A 4667 0 R +/K 1447 0 R +/P 2883 0 R +/S /TD +>> +endobj +3302 0 obj +<< +/A 4667 0 R +/K 1448 0 R +/P 2883 0 R +/S /TD +>> +endobj +3303 0 obj +<< +/A 4667 0 R +/K 1449 0 R +/P 2883 0 R +/S /TD +>> +endobj +3304 0 obj +<< +/A 4667 0 R +/K 1450 0 R +/P 2883 0 R +/S /TD +>> +endobj +3305 0 obj +<< +/A 4667 0 R +/K 1451 0 R +/P 2883 0 R +/S /TD +>> +endobj +3306 0 obj +<< +/A 4667 0 R +/K 1452 0 R +/P 2884 0 R +/S /TD +>> +endobj +3307 0 obj +<< +/A 4667 0 R +/K 1453 0 R +/P 2884 0 R +/S /TD +>> +endobj +3308 0 obj +<< +/A 4667 0 R +/K 1454 0 R +/P 2884 0 R +/S /TD +>> +endobj +3309 0 obj +<< +/A [4667 0 R 4679 0 R] +/K 1455 0 R +/P 2884 0 R +/S /TD +>> +endobj +3310 0 obj +<< +/A 4667 0 R +/K 1456 0 R +/P 2885 0 R +/S /TD +>> +endobj +3311 0 obj +<< +/A 4667 0 R +/K 1457 0 R +/P 2885 0 R +/S /TD +>> +endobj +3312 0 obj +<< +/A 4667 0 R +/K 1458 0 R +/P 2885 0 R +/S /TD +>> +endobj +3313 0 obj +<< +/SpaceAfter 2.0 +/TextAlign /Justify +/O /Layout +/WritingMode /LrTb +/SpaceBefore 0.0 +/TextIndent 0.0 +/EndIndent 0.0 +/StartIndent 0.0 +>> +endobj +3314 0 obj +<< +/A [4667 0 R 4680 0 R] +/K 1459 0 R +/P 2885 0 R +/S /TD +>> +endobj +3315 0 obj +<< +/A 4667 0 R +/K 1460 0 R +/P 2886 0 R +/S /TD +>> +endobj +3316 0 obj +<< +/A 4667 0 R +/K 1461 0 R +/P 2886 0 R +/S /TD +>> +endobj +3317 0 obj +<< +/A 4667 0 R +/K 1462 0 R +/P 2886 0 R +/S /TD +>> +endobj +3318 0 obj +<< +/A [4667 0 R 4681 0 R] +/K 1463 0 R +/P 2886 0 R +/S /TD +>> +endobj +3319 0 obj +<< +/A 4667 0 R +/K 1464 0 R +/P 2887 0 R +/S /TD +>> +endobj +3320 0 obj +<< +/A 4667 0 R +/K 1465 0 R +/P 2887 0 R +/S /TD +>> +endobj +3321 0 obj +<< +/A 4667 0 R +/K 1466 0 R +/P 2888 0 R +/S /TD +>> +endobj +3322 0 obj +<< +/A 4667 0 R +/K [1467 0 R 1468 0 R] +/P 2888 0 R +/S /TD +>> +endobj +3323 0 obj +<< +/A 4667 0 R +/K 1469 0 R +/P 2889 0 R +/S /TD +>> +endobj +3324 0 obj +<< +/A 4667 0 R +/K 1470 0 R +/P 2889 0 R +/S /TD +>> +endobj +3325 0 obj +<< +/A [4667 0 R 4682 0 R] +/K 1471 0 R +/P 2887 0 R +/S /TD +>> +endobj +3326 0 obj +<< +/A [4667 0 R 4683 0 R] +/K 1472 0 R +/P 2887 0 R +/S /TD +>> +endobj +3327 0 obj +<< +/A [4667 0 R 4684 0 R] +/K 1473 0 R +/P 2887 0 R +/S /TD +>> +endobj +3328 0 obj +<< +/A 4667 0 R +/K 1474 0 R +/P 2890 0 R +/S /TD +>> +endobj +3329 0 obj +<< +/A 4667 0 R +/K 1475 0 R +/P 2890 0 R +/S /TD +>> +endobj +3330 0 obj +<< +/A 4667 0 R +/K 1476 0 R +/P 2891 0 R +/S /TD +>> +endobj +3331 0 obj +<< +/A 4667 0 R +/K 1477 0 R +/P 2891 0 R +/S /TD +>> +endobj +3332 0 obj +<< +/A 4667 0 R +/K 1478 0 R +/P 2891 0 R +/S /TD +>> +endobj +3333 0 obj +<< +/A [4667 0 R 4685 0 R] +/K 1479 0 R +/P 2891 0 R +/S /TD +>> +endobj +3334 0 obj +<< +/A 4667 0 R +/K 1480 0 R +/P 2892 0 R +/S /TD +>> +endobj +3335 0 obj +<< +/A 4667 0 R +/K 1481 0 R +/P 2892 0 R +/S /TD +>> +endobj +3336 0 obj +<< +/A 4667 0 R +/K 1482 0 R +/P 2892 0 R +/S /TD +>> +endobj +3337 0 obj +<< +/A [4667 0 R 4686 0 R] +/K 1483 0 R +/P 2892 0 R +/S /TD +>> +endobj +3338 0 obj +<< +/A 4667 0 R +/K 1484 0 R +/P 2893 0 R +/S /TD +>> +endobj +3339 0 obj +<< +/A 4667 0 R +/K 1485 0 R +/P 2893 0 R +/S /TD +>> +endobj +3340 0 obj +<< +/A 4667 0 R +/K 1486 0 R +/P 2893 0 R +/S /TD +>> +endobj +3341 0 obj +<< +/A [4667 0 R 4687 0 R] +/K 1487 0 R +/P 2893 0 R +/S /TD +>> +endobj +3342 0 obj +<< +/SpaceAfter 0.0 +/TextAlign /Justify +/O /Layout +/WritingMode /LrTb +/SpaceBefore 0.0 +/TextIndent -21.0 +/EndIndent 0.0 +/StartIndent 63.0 +>> +endobj +3343 0 obj +<< +/A 4667 0 R +/K 1511 0 R +/P 2894 0 R +/S /TD +>> +endobj +3344 0 obj +<< +/A 4667 0 R +/K 1512 0 R +/P 2894 0 R +/S /TD +>> +endobj +3345 0 obj +<< +/A 4667 0 R +/K 1513 0 R +/P 2894 0 R +/S /TD +>> +endobj +3346 0 obj +<< +/A 4667 0 R +/K 1514 0 R +/P 2894 0 R +/S /TD +>> +endobj +3347 0 obj +<< +/A 4667 0 R +/K 1515 0 R +/P 2894 0 R +/S /TD +>> +endobj +3348 0 obj +<< +/A 4667 0 R +/K 1516 0 R +/P 2894 0 R +/S /TD +>> +endobj +3349 0 obj +<< +/A 4667 0 R +/K 1517 0 R +/P 2894 0 R +/S /TD +>> +endobj +3350 0 obj +<< +/A 4667 0 R +/K 1518 0 R +/P 2895 0 R +/S /TD +>> +endobj +3351 0 obj +<< +/A 4667 0 R +/K 1519 0 R +/P 2895 0 R +/S /TD +>> +endobj +3352 0 obj +<< +/A 4667 0 R +/K 1520 0 R +/P 2895 0 R +/S /TD +>> +endobj +3353 0 obj +<< +/A 4667 0 R +/K 1521 0 R +/P 2895 0 R +/S /TD +>> +endobj +3354 0 obj +<< +/A 4667 0 R +/K 1522 0 R +/P 2895 0 R +/S /TD +>> +endobj +3355 0 obj +<< +/A 4667 0 R +/K 1523 0 R +/P 2895 0 R +/S /TD +>> +endobj +3356 0 obj +<< +/A 4667 0 R +/K 1524 0 R +/P 2895 0 R +/S /TD +>> +endobj +3357 0 obj +<< +/A 4667 0 R +/K 1525 0 R +/P 2896 0 R +/S /TD +>> +endobj +3358 0 obj +<< +/A 4667 0 R +/K 1526 0 R +/P 2896 0 R +/S /TD +>> +endobj +3359 0 obj +<< +/A 4667 0 R +/K 1527 0 R +/P 2896 0 R +/S /TD +>> +endobj +3360 0 obj +<< +/A 4667 0 R +/K 1528 0 R +/P 2896 0 R +/S /TD +>> +endobj +3361 0 obj +<< +/A 4667 0 R +/K 1529 0 R +/P 2896 0 R +/S /TD +>> +endobj +3362 0 obj +<< +/A 4667 0 R +/K 1530 0 R +/P 2896 0 R +/S /TD +>> +endobj +3363 0 obj +<< +/A 4667 0 R +/K 1531 0 R +/P 2896 0 R +/S /TD +>> +endobj +3364 0 obj +<< +/A 4667 0 R +/K 1532 0 R +/P 2897 0 R +/S /TD +>> +endobj +3365 0 obj +<< +/A 4667 0 R +/K 1533 0 R +/P 2897 0 R +/S /TD +>> +endobj +3366 0 obj +<< +/A 4667 0 R +/K 1534 0 R +/P 2897 0 R +/S /TD +>> +endobj +3367 0 obj +<< +/A 4667 0 R +/K 1535 0 R +/P 2897 0 R +/S /TD +>> +endobj +3368 0 obj +<< +/A 4667 0 R +/K 1536 0 R +/P 2897 0 R +/S /TD +>> +endobj +3369 0 obj +<< +/A 4667 0 R +/K 1537 0 R +/P 2897 0 R +/S /TD +>> +endobj +3370 0 obj +<< +/A 4667 0 R +/K 1538 0 R +/P 2898 0 R +/S /TD +>> +endobj +3371 0 obj +<< +/A 4667 0 R +/K 1539 0 R +/P 2898 0 R +/S /TD +>> +endobj +3372 0 obj +<< +/A 4667 0 R +/K 1540 0 R +/P 2898 0 R +/S /TD +>> +endobj +3373 0 obj +<< +/A 4667 0 R +/K 1541 0 R +/P 2898 0 R +/S /TD +>> +endobj +3374 0 obj +<< +/A 4667 0 R +/K 1542 0 R +/P 2898 0 R +/S /TD +>> +endobj +3375 0 obj +<< +/A 4667 0 R +/K 1543 0 R +/P 2898 0 R +/S /TD +>> +endobj +3376 0 obj +<< +/A 4667 0 R +/K 1544 0 R +/P 2899 0 R +/S /TD +>> +endobj +3377 0 obj +<< +/A 4667 0 R +/K 1545 0 R +/P 2899 0 R +/S /TD +>> +endobj +3378 0 obj +<< +/A 4667 0 R +/K 1546 0 R +/P 2899 0 R +/S /TD +>> +endobj +3379 0 obj +<< +/A 4667 0 R +/K 1547 0 R +/P 2899 0 R +/S /TD +>> +endobj +3380 0 obj +<< +/A 4667 0 R +/K 1548 0 R +/P 2899 0 R +/S /TD +>> +endobj +3381 0 obj +<< +/A 4667 0 R +/K 1549 0 R +/P 2899 0 R +/S /TD +>> +endobj +3382 0 obj +<< +/A 4667 0 R +/K 1550 0 R +/P 2900 0 R +/S /TD +>> +endobj +3383 0 obj +<< +/A 4667 0 R +/K 1551 0 R +/P 2900 0 R +/S /TD +>> +endobj +3384 0 obj +<< +/A 4667 0 R +/K 1552 0 R +/P 2900 0 R +/S /TD +>> +endobj +3385 0 obj +<< +/A 4667 0 R +/K 1553 0 R +/P 2900 0 R +/S /TD +>> +endobj +3386 0 obj +<< +/A 4667 0 R +/K 1554 0 R +/P 2900 0 R +/S /TD +>> +endobj +3387 0 obj +<< +/A 4667 0 R +/K 1555 0 R +/P 2900 0 R +/S /TD +>> +endobj +3388 0 obj +<< +/A 4667 0 R +/K 1556 0 R +/P 2900 0 R +/S /TD +>> +endobj +3389 0 obj +<< +/A 4667 0 R +/K 1557 0 R +/P 2901 0 R +/S /TD +>> +endobj +3390 0 obj +<< +/A 4667 0 R +/K 1558 0 R +/P 2901 0 R +/S /TD +>> +endobj +3391 0 obj +<< +/A 4667 0 R +/K 1559 0 R +/P 2901 0 R +/S /TD +>> +endobj +3392 0 obj +<< +/A 4667 0 R +/K 1560 0 R +/P 2901 0 R +/S /TD +>> +endobj +3393 0 obj +<< +/A 4667 0 R +/K 1561 0 R +/P 2901 0 R +/S /TD +>> +endobj +3394 0 obj +<< +/A 4667 0 R +/K 1562 0 R +/P 2901 0 R +/S /TD +>> +endobj +3395 0 obj +<< +/A 4667 0 R +/K 1563 0 R +/P 2901 0 R +/S /TD +>> +endobj +3396 0 obj +<< +/A 4667 0 R +/K 1564 0 R +/P 2902 0 R +/S /TD +>> +endobj +3397 0 obj +<< +/A 4667 0 R +/K 1565 0 R +/P 2902 0 R +/S /TD +>> +endobj +3398 0 obj +<< +/A 4667 0 R +/K 1566 0 R +/P 2902 0 R +/S /TD +>> +endobj +3399 0 obj +<< +/A 4667 0 R +/K 1567 0 R +/P 2902 0 R +/S /TD +>> +endobj +3400 0 obj +<< +/A 4667 0 R +/K 1568 0 R +/P 2902 0 R +/S /TD +>> +endobj +3401 0 obj +<< +/A 4667 0 R +/K 1569 0 R +/P 2902 0 R +/S /TD +>> +endobj +3402 0 obj +<< +/A 4667 0 R +/K 1570 0 R +/P 2902 0 R +/S /TD +>> +endobj +3403 0 obj +<< +/A 4667 0 R +/K 1571 0 R +/P 2903 0 R +/S /TD +>> +endobj +3404 0 obj +<< +/A 4667 0 R +/K 1572 0 R +/P 2903 0 R +/S /TD +>> +endobj +3405 0 obj +<< +/A 4667 0 R +/K 1573 0 R +/P 2903 0 R +/S /TD +>> +endobj +3406 0 obj +<< +/A 4667 0 R +/K 1574 0 R +/P 2903 0 R +/S /TD +>> +endobj +3407 0 obj +<< +/A 4667 0 R +/K 1575 0 R +/P 2903 0 R +/S /TD +>> +endobj +3408 0 obj +<< +/A 4667 0 R +/K 1576 0 R +/P 2903 0 R +/S /TD +>> +endobj +3409 0 obj +<< +/A 4667 0 R +/K 1577 0 R +/P 2904 0 R +/S /TD +>> +endobj +3410 0 obj +<< +/A 4667 0 R +/K 1578 0 R +/P 2904 0 R +/S /TD +>> +endobj +3411 0 obj +<< +/A 4667 0 R +/K 1579 0 R +/P 2904 0 R +/S /TD +>> +endobj +3412 0 obj +<< +/A 4667 0 R +/K 1580 0 R +/P 2904 0 R +/S /TD +>> +endobj +3413 0 obj +<< +/A 4667 0 R +/K 1581 0 R +/P 2904 0 R +/S /TD +>> +endobj +3414 0 obj +<< +/A 4667 0 R +/K 1582 0 R +/P 2904 0 R +/S /TD +>> +endobj +3415 0 obj +<< +/A 4667 0 R +/K 1583 0 R +/P 2905 0 R +/S /TD +>> +endobj +3416 0 obj +<< +/A 4667 0 R +/K 1584 0 R +/P 2905 0 R +/S /TD +>> +endobj +3417 0 obj +<< +/A 4667 0 R +/K 1585 0 R +/P 2905 0 R +/S /TD +>> +endobj +3418 0 obj +<< +/A 4667 0 R +/K 1586 0 R +/P 2905 0 R +/S /TD +>> +endobj +3419 0 obj +<< +/A 4667 0 R +/K 1587 0 R +/P 2905 0 R +/S /TD +>> +endobj +3420 0 obj +<< +/A 4667 0 R +/K 1588 0 R +/P 2905 0 R +/S /TD +>> +endobj +3421 0 obj +<< +/A 4667 0 R +/K 1589 0 R +/P 2906 0 R +/S /TD +>> +endobj +3422 0 obj +<< +/A 4667 0 R +/K 1590 0 R +/P 2906 0 R +/S /TD +>> +endobj +3423 0 obj +<< +/A 4667 0 R +/K 1591 0 R +/P 2906 0 R +/S /TD +>> +endobj +3424 0 obj +<< +/A 4667 0 R +/K 1592 0 R +/P 2906 0 R +/S /TD +>> +endobj +3425 0 obj +<< +/A 4667 0 R +/K 1593 0 R +/P 2906 0 R +/S /TD +>> +endobj +3426 0 obj +<< +/A 4667 0 R +/K 1594 0 R +/P 2906 0 R +/S /TD +>> +endobj +3427 0 obj +<< +/A 4667 0 R +/K 1595 0 R +/P 2906 0 R +/S /TD +>> +endobj +3428 0 obj +<< +/A 4667 0 R +/K 1596 0 R +/P 2907 0 R +/S /TD +>> +endobj +3429 0 obj +<< +/A 4667 0 R +/K 1597 0 R +/P 2907 0 R +/S /TD +>> +endobj +3430 0 obj +<< +/A 4667 0 R +/K 1598 0 R +/P 2907 0 R +/S /TD +>> +endobj +3431 0 obj +<< +/A 4667 0 R +/K 1599 0 R +/P 2907 0 R +/S /TD +>> +endobj +3432 0 obj +<< +/A 4667 0 R +/K 1600 0 R +/P 2907 0 R +/S /TD +>> +endobj +3433 0 obj +<< +/A 4667 0 R +/K 1601 0 R +/P 2907 0 R +/S /TD +>> +endobj +3434 0 obj +<< +/A 4667 0 R +/K 1602 0 R +/P 2907 0 R +/S /TD +>> +endobj +3435 0 obj +<< +/A 4667 0 R +/K 1603 0 R +/P 2908 0 R +/S /TD +>> +endobj +3436 0 obj +<< +/A 4667 0 R +/K 1604 0 R +/P 2908 0 R +/S /TD +>> +endobj +3437 0 obj +<< +/A 4667 0 R +/K 1605 0 R +/P 2908 0 R +/S /TD +>> +endobj +3438 0 obj +<< +/A 4667 0 R +/K 1606 0 R +/P 2908 0 R +/S /TD +>> +endobj +3439 0 obj +<< +/A 4667 0 R +/K 1607 0 R +/P 2908 0 R +/S /TD +>> +endobj +3440 0 obj +<< +/A 4667 0 R +/K 1608 0 R +/P 2908 0 R +/S /TD +>> +endobj +3441 0 obj +<< +/A 4667 0 R +/K 1609 0 R +/P 2908 0 R +/S /TD +>> +endobj +3442 0 obj +<< +/A 4667 0 R +/K 1610 0 R +/P 2909 0 R +/S /TD +>> +endobj +3443 0 obj +<< +/A 4667 0 R +/K 1611 0 R +/P 2909 0 R +/S /TD +>> +endobj +3444 0 obj +<< +/A 4667 0 R +/K 1612 0 R +/P 2909 0 R +/S /TD +>> +endobj +3445 0 obj +<< +/A 4667 0 R +/K 1613 0 R +/P 2909 0 R +/S /TD +>> +endobj +3446 0 obj +<< +/A 4667 0 R +/K 1614 0 R +/P 2909 0 R +/S /TD +>> +endobj +3447 0 obj +<< +/A 4667 0 R +/K 1615 0 R +/P 2909 0 R +/S /TD +>> +endobj +3448 0 obj +<< +/A 4667 0 R +/K 1616 0 R +/P 2910 0 R +/S /TD +>> +endobj +3449 0 obj +<< +/A 4667 0 R +/K 1617 0 R +/P 2910 0 R +/S /TD +>> +endobj +3450 0 obj +<< +/A 4667 0 R +/K 1618 0 R +/P 2910 0 R +/S /TD +>> +endobj +3451 0 obj +<< +/A 4667 0 R +/K 1619 0 R +/P 2910 0 R +/S /TD +>> +endobj +3452 0 obj +<< +/A 4667 0 R +/K 1620 0 R +/P 2910 0 R +/S /TD +>> +endobj +3453 0 obj +<< +/A 4667 0 R +/K 1621 0 R +/P 2910 0 R +/S /TD +>> +endobj +3454 0 obj +<< +/A 4667 0 R +/K 1622 0 R +/P 2911 0 R +/S /TD +>> +endobj +3455 0 obj +<< +/A 4667 0 R +/K 1623 0 R +/P 2911 0 R +/S /TD +>> +endobj +3456 0 obj +<< +/A 4667 0 R +/K 1624 0 R +/P 2911 0 R +/S /TD +>> +endobj +3457 0 obj +<< +/A 4667 0 R +/K 1625 0 R +/P 2911 0 R +/S /TD +>> +endobj +3458 0 obj +<< +/A 4667 0 R +/K 1626 0 R +/P 2911 0 R +/S /TD +>> +endobj +3459 0 obj +<< +/A 4667 0 R +/K 1627 0 R +/P 2911 0 R +/S /TD +>> +endobj +3460 0 obj +<< +/A 4667 0 R +/K 1628 0 R +/P 2912 0 R +/S /TD +>> +endobj +3461 0 obj +<< +/A 4667 0 R +/K 1629 0 R +/P 2912 0 R +/S /TD +>> +endobj +3462 0 obj +<< +/A 4667 0 R +/K 1630 0 R +/P 2912 0 R +/S /TD +>> +endobj +3463 0 obj +<< +/A 4667 0 R +/K 1631 0 R +/P 2912 0 R +/S /TD +>> +endobj +3464 0 obj +<< +/A 4667 0 R +/K 1632 0 R +/P 2912 0 R +/S /TD +>> +endobj +3465 0 obj +<< +/A 4667 0 R +/K 1633 0 R +/P 2912 0 R +/S /TD +>> +endobj +3466 0 obj +<< +/A 4667 0 R +/K 1634 0 R +/P 2912 0 R +/S /TD +>> +endobj +3467 0 obj +<< +/A 4667 0 R +/K 1635 0 R +/P 2912 0 R +/S /TD +>> +endobj +3468 0 obj +<< +/A 4667 0 R +/K 1636 0 R +/P 2913 0 R +/S /TD +>> +endobj +3469 0 obj +<< +/A 4667 0 R +/K 1637 0 R +/P 2913 0 R +/S /TD +>> +endobj +3470 0 obj +<< +/A 4667 0 R +/K 1638 0 R +/P 2913 0 R +/S /TD +>> +endobj +3471 0 obj +<< +/A 4667 0 R +/K 1639 0 R +/P 2913 0 R +/S /TD +>> +endobj +3472 0 obj +<< +/A 4667 0 R +/K 1640 0 R +/P 2913 0 R +/S /TD +>> +endobj +3473 0 obj +<< +/A 4667 0 R +/K 1641 0 R +/P 2913 0 R +/S /TD +>> +endobj +3474 0 obj +<< +/A 4667 0 R +/K 1642 0 R +/P 2913 0 R +/S /TD +>> +endobj +3475 0 obj +<< +/A 4667 0 R +/K 1643 0 R +/P 2913 0 R +/S /TD +>> +endobj +3476 0 obj +<< +/A 4667 0 R +/K 1644 0 R +/P 2914 0 R +/S /TD +>> +endobj +3477 0 obj +<< +/A 4667 0 R +/K 1645 0 R +/P 2914 0 R +/S /TD +>> +endobj +3478 0 obj +<< +/A 4667 0 R +/K 1646 0 R +/P 2914 0 R +/S /TD +>> +endobj +3479 0 obj +<< +/A 4667 0 R +/K 1647 0 R +/P 2914 0 R +/S /TD +>> +endobj +3480 0 obj +<< +/A 4667 0 R +/K 1648 0 R +/P 2914 0 R +/S /TD +>> +endobj +3481 0 obj +<< +/A 4667 0 R +/K 1649 0 R +/P 2914 0 R +/S /TD +>> +endobj +3482 0 obj +<< +/A 4667 0 R +/K 1650 0 R +/P 2914 0 R +/S /TD +>> +endobj +3483 0 obj +<< +/A 4667 0 R +/K 1651 0 R +/P 2914 0 R +/S /TD +>> +endobj +3484 0 obj +<< +/A 4667 0 R +/K 1652 0 R +/P 2915 0 R +/S /TD +>> +endobj +3485 0 obj +<< +/A 4667 0 R +/K 1653 0 R +/P 2915 0 R +/S /TD +>> +endobj +3486 0 obj +<< +/A 4667 0 R +/K 1654 0 R +/P 2915 0 R +/S /TD +>> +endobj +3487 0 obj +<< +/A 4667 0 R +/K 1655 0 R +/P 2915 0 R +/S /TD +>> +endobj +3488 0 obj +<< +/A 4667 0 R +/K 1656 0 R +/P 2915 0 R +/S /TD +>> +endobj +3489 0 obj +<< +/A 4667 0 R +/K 1657 0 R +/P 2915 0 R +/S /TD +>> +endobj +3490 0 obj +<< +/A 4667 0 R +/K 1658 0 R +/P 2916 0 R +/S /TD +>> +endobj +3491 0 obj +<< +/A 4667 0 R +/K 1659 0 R +/P 2916 0 R +/S /TD +>> +endobj +3492 0 obj +<< +/A 4667 0 R +/K 1660 0 R +/P 2916 0 R +/S /TD +>> +endobj +3493 0 obj +<< +/A 4667 0 R +/K 1661 0 R +/P 2916 0 R +/S /TD +>> +endobj +3494 0 obj +<< +/A 4667 0 R +/K 1662 0 R +/P 2916 0 R +/S /TD +>> +endobj +3495 0 obj +<< +/A 4667 0 R +/K 1663 0 R +/P 2916 0 R +/S /TD +>> +endobj +3496 0 obj +<< +/A 4667 0 R +/K 1664 0 R +/P 2917 0 R +/S /TD +>> +endobj +3497 0 obj +<< +/A 4667 0 R +/K 1665 0 R +/P 2917 0 R +/S /TD +>> +endobj +3498 0 obj +<< +/A 4667 0 R +/K 1666 0 R +/P 2917 0 R +/S /TD +>> +endobj +3499 0 obj +<< +/A 4667 0 R +/K 1667 0 R +/P 2917 0 R +/S /TD +>> +endobj +3500 0 obj +<< +/A 4667 0 R +/K 1668 0 R +/P 2917 0 R +/S /TD +>> +endobj +3501 0 obj +<< +/A 4667 0 R +/K 1669 0 R +/P 2917 0 R +/S /TD +>> +endobj +3502 0 obj +<< +/A 4688 0 R +/K 1670 0 R +/P 2918 0 R +/S /TD +>> +endobj +3503 0 obj +<< +/A 4688 0 R +/K 1671 0 R +/P 2918 0 R +/S /TD +>> +endobj +3504 0 obj +<< +/A 4688 0 R +/K 1672 0 R +/P 2918 0 R +/S /TD +>> +endobj +3505 0 obj +<< +/A 4688 0 R +/K 1673 0 R +/P 2919 0 R +/S /TD +>> +endobj +3506 0 obj +<< +/A 4688 0 R +/K 1674 0 R +/P 2919 0 R +/S /TD +>> +endobj +3507 0 obj +<< +/A 4688 0 R +/K 1675 0 R +/P 2919 0 R +/S /TD +>> +endobj +3508 0 obj +<< +/A 4688 0 R +/K 1676 0 R +/P 2920 0 R +/S /TD +>> +endobj +3509 0 obj +<< +/A 4688 0 R +/K 1677 0 R +/P 2920 0 R +/S /TD +>> +endobj +3510 0 obj +<< +/A 4688 0 R +/K 1678 0 R +/P 2920 0 R +/S /TD +>> +endobj +3511 0 obj +<< +/A 4688 0 R +/K 1679 0 R +/P 2921 0 R +/S /TD +>> +endobj +3512 0 obj +<< +/A 4688 0 R +/K 1680 0 R +/P 2921 0 R +/S /TD +>> +endobj +3513 0 obj +<< +/A 4688 0 R +/K 1681 0 R +/P 2921 0 R +/S /TD +>> +endobj +3514 0 obj +<< +/A 4667 0 R +/K 1682 0 R +/P 2922 0 R +/S /TD +>> +endobj +3515 0 obj +<< +/A 4667 0 R +/K 1683 0 R +/P 2922 0 R +/S /TD +>> +endobj +3516 0 obj +<< +/A 4667 0 R +/K 1684 0 R +/P 2922 0 R +/S /TD +>> +endobj +3517 0 obj +<< +/A 4667 0 R +/K 1685 0 R +/P 2922 0 R +/S /TD +>> +endobj +3518 0 obj +<< +/A 4667 0 R +/K 1686 0 R +/P 2922 0 R +/S /TD +>> +endobj +3519 0 obj +<< +/A 4667 0 R +/K 1687 0 R +/P 2922 0 R +/S /TD +>> +endobj +3520 0 obj +<< +/A 4667 0 R +/K 1688 0 R +/P 2923 0 R +/S /TD +>> +endobj +3521 0 obj +<< +/A 4667 0 R +/K 1689 0 R +/P 2923 0 R +/S /TD +>> +endobj +3522 0 obj +<< +/A 4667 0 R +/K 1690 0 R +/P 2923 0 R +/S /TD +>> +endobj +3523 0 obj +<< +/A 4667 0 R +/K 1691 0 R +/P 2923 0 R +/S /TD +>> +endobj +3524 0 obj +<< +/A 4667 0 R +/K 1692 0 R +/P 2923 0 R +/S /TD +>> +endobj +3525 0 obj +<< +/A 4667 0 R +/K 1693 0 R +/P 2923 0 R +/S /TD +>> +endobj +3526 0 obj +<< +/A 4667 0 R +/K 1694 0 R +/P 2924 0 R +/S /TD +>> +endobj +3527 0 obj +<< +/A 4667 0 R +/K 1695 0 R +/P 2924 0 R +/S /TD +>> +endobj +3528 0 obj +<< +/A 4667 0 R +/K 1696 0 R +/P 2924 0 R +/S /TD +>> +endobj +3529 0 obj +<< +/A 4667 0 R +/K 1697 0 R +/P 2924 0 R +/S /TD +>> +endobj +3530 0 obj +<< +/A 4667 0 R +/K 1698 0 R +/P 2924 0 R +/S /TD +>> +endobj +3531 0 obj +<< +/A 4667 0 R +/K 1699 0 R +/P 2924 0 R +/S /TD +>> +endobj +3532 0 obj +<< +/A 4667 0 R +/K 1700 0 R +/P 2925 0 R +/S /TD +>> +endobj +3533 0 obj +<< +/A 4667 0 R +/K 1701 0 R +/P 2925 0 R +/S /TD +>> +endobj +3534 0 obj +<< +/A 4667 0 R +/K 1702 0 R +/P 2925 0 R +/S /TD +>> +endobj +3535 0 obj +<< +/A 4667 0 R +/K 1703 0 R +/P 2925 0 R +/S /TD +>> +endobj +3536 0 obj +<< +/A 4667 0 R +/K 1704 0 R +/P 2925 0 R +/S /TD +>> +endobj +3537 0 obj +<< +/A 4667 0 R +/K 1705 0 R +/P 2925 0 R +/S /TD +>> +endobj +3538 0 obj +<< +/A 4667 0 R +/K 1706 0 R +/P 2925 0 R +/S /TD +>> +endobj +3539 0 obj +<< +/A 4667 0 R +/K 1707 0 R +/P 2926 0 R +/S /TD +>> +endobj +3540 0 obj +<< +/A 4667 0 R +/K 1708 0 R +/P 2926 0 R +/S /TD +>> +endobj +3541 0 obj +<< +/A 4667 0 R +/K 1709 0 R +/P 2926 0 R +/S /TD +>> +endobj +3542 0 obj +<< +/A 4667 0 R +/K 1710 0 R +/P 2926 0 R +/S /TD +>> +endobj +3543 0 obj +<< +/A 4667 0 R +/K 1711 0 R +/P 2926 0 R +/S /TD +>> +endobj +3544 0 obj +<< +/A 4667 0 R +/K 1712 0 R +/P 2926 0 R +/S /TD +>> +endobj +3545 0 obj +<< +/A 4667 0 R +/K 1713 0 R +/P 2926 0 R +/S /TD +>> +endobj +3546 0 obj +<< +/A 4667 0 R +/K 1714 0 R +/P 2927 0 R +/S /TD +>> +endobj +3547 0 obj +<< +/A 4667 0 R +/K 1715 0 R +/P 2927 0 R +/S /TD +>> +endobj +3548 0 obj +<< +/A 4667 0 R +/K 1716 0 R +/P 2927 0 R +/S /TD +>> +endobj +3549 0 obj +<< +/A 4667 0 R +/K 1717 0 R +/P 2927 0 R +/S /TD +>> +endobj +3550 0 obj +<< +/A 4667 0 R +/K 1718 0 R +/P 2927 0 R +/S /TD +>> +endobj +3551 0 obj +<< +/A 4667 0 R +/K 1719 0 R +/P 2927 0 R +/S /TD +>> +endobj +3552 0 obj +<< +/A 4667 0 R +/K 1720 0 R +/P 2927 0 R +/S /TD +>> +endobj +3553 0 obj +<< +/SpaceAfter 0.0 +/TextAlign /Center +/O /Layout +/WritingMode /LrTb +/SpaceBefore 0.0 +/TextIndent 24.0 +/EndIndent 0.0 +/StartIndent -24.0 +>> +endobj +3554 0 obj +<< +/A 4688 0 R +/K 1721 0 R +/P 2928 0 R +/S /TD +>> +endobj +3555 0 obj +<< +/A 4688 0 R +/K 1722 0 R +/P 2928 0 R +/S /TD +>> +endobj +3556 0 obj +<< +/A 4688 0 R +/K 1723 0 R +/P 2928 0 R +/S /TD +>> +endobj +3557 0 obj +<< +/A 4688 0 R +/K 1724 0 R +/P 2928 0 R +/S /TD +>> +endobj +3558 0 obj +<< +/A 4688 0 R +/K 1725 0 R +/P 2929 0 R +/S /TD +>> +endobj +3559 0 obj +<< +/A 4688 0 R +/K 1726 0 R +/P 2929 0 R +/S /TD +>> +endobj +3560 0 obj +<< +/A 4688 0 R +/K 1727 0 R +/P 2929 0 R +/S /TD +>> +endobj +3561 0 obj +<< +/A 4688 0 R +/K 1728 0 R +/P 2929 0 R +/S /TD +>> +endobj +3562 0 obj +<< +/A 4688 0 R +/K 1729 0 R +/P 2930 0 R +/S /TD +>> +endobj +3563 0 obj +<< +/A 4688 0 R +/K 1730 0 R +/P 2930 0 R +/S /TD +>> +endobj +3564 0 obj +<< +/A 4688 0 R +/K 1731 0 R +/P 2930 0 R +/S /TD +>> +endobj +3565 0 obj +<< +/A 4688 0 R +/K 1732 0 R +/P 2930 0 R +/S /TD +>> +endobj +3566 0 obj +<< +/A 4688 0 R +/K 1733 0 R +/P 2931 0 R +/S /TD +>> +endobj +3567 0 obj +<< +/A 4688 0 R +/K 1734 0 R +/P 2931 0 R +/S /TD +>> +endobj +3568 0 obj +<< +/A 4688 0 R +/K 1735 0 R +/P 2931 0 R +/S /TD +>> +endobj +3569 0 obj +<< +/A 4688 0 R +/K 1736 0 R +/P 2931 0 R +/S /TD +>> +endobj +3570 0 obj +<< +/A 4688 0 R +/K 1737 0 R +/P 2932 0 R +/S /TD +>> +endobj +3571 0 obj +<< +/A 4688 0 R +/K 1738 0 R +/P 2932 0 R +/S /TD +>> +endobj +3572 0 obj +<< +/A 4688 0 R +/K 1739 0 R +/P 2932 0 R +/S /TD +>> +endobj +3573 0 obj +<< +/A 4688 0 R +/K 1740 0 R +/P 2932 0 R +/S /TD +>> +endobj +3574 0 obj +<< +/A 4688 0 R +/K 1741 0 R +/P 2933 0 R +/S /TD +>> +endobj +3575 0 obj +<< +/A 4688 0 R +/K 1742 0 R +/P 2933 0 R +/S /TD +>> +endobj +3576 0 obj +<< +/A 4688 0 R +/K 1743 0 R +/P 2933 0 R +/S /TD +>> +endobj +3577 0 obj +<< +/A 4688 0 R +/K 1744 0 R +/P 2933 0 R +/S /TD +>> +endobj +3578 0 obj +<< +/A 4688 0 R +/K 1745 0 R +/P 2934 0 R +/S /TD +>> +endobj +3579 0 obj +<< +/A 4688 0 R +/K 1746 0 R +/P 2934 0 R +/S /TD +>> +endobj +3580 0 obj +<< +/A 4688 0 R +/K 1747 0 R +/P 2934 0 R +/S /TD +>> +endobj +3581 0 obj +<< +/A 4688 0 R +/K 1748 0 R +/P 2934 0 R +/S /TD +>> +endobj +3582 0 obj +<< +/A 4688 0 R +/K 1749 0 R +/P 2935 0 R +/S /TD +>> +endobj +3583 0 obj +<< +/A 4688 0 R +/K 1750 0 R +/P 2935 0 R +/S /TD +>> +endobj +3584 0 obj +<< +/A 4688 0 R +/K 1751 0 R +/P 2935 0 R +/S /TD +>> +endobj +3585 0 obj +<< +/A 4688 0 R +/K 1752 0 R +/P 2935 0 R +/S /TD +>> +endobj +3586 0 obj +<< +/A 4667 0 R +/K 1753 0 R +/P 2936 0 R +/S /TD +>> +endobj +3587 0 obj +<< +/A 4667 0 R +/K 1754 0 R +/P 2936 0 R +/S /TD +>> +endobj +3588 0 obj +<< +/A 4667 0 R +/K 1755 0 R +/P 2936 0 R +/S /TD +>> +endobj +3589 0 obj +<< +/A 4667 0 R +/K 1756 0 R +/P 2936 0 R +/S /TD +>> +endobj +3590 0 obj +<< +/A 4667 0 R +/K 1757 0 R +/P 2936 0 R +/S /TD +>> +endobj +3591 0 obj +<< +/A 4667 0 R +/K 1758 0 R +/P 2936 0 R +/S /TD +>> +endobj +3592 0 obj +<< +/A 4667 0 R +/K 1759 0 R +/P 2936 0 R +/S /TD +>> +endobj +3593 0 obj +<< +/A 4667 0 R +/K 1760 0 R +/P 2937 0 R +/S /TD +>> +endobj +3594 0 obj +<< +/A 4667 0 R +/K 1761 0 R +/P 2937 0 R +/S /TD +>> +endobj +3595 0 obj +<< +/A 4667 0 R +/K 1762 0 R +/P 2937 0 R +/S /TD +>> +endobj +3596 0 obj +<< +/A 4667 0 R +/K 1763 0 R +/P 2937 0 R +/S /TD +>> +endobj +3597 0 obj +<< +/A 4667 0 R +/K 1764 0 R +/P 2937 0 R +/S /TD +>> +endobj +3598 0 obj +<< +/A 4667 0 R +/K 1765 0 R +/P 2937 0 R +/S /TD +>> +endobj +3599 0 obj +<< +/A 4667 0 R +/K 1766 0 R +/P 2937 0 R +/S /TD +>> +endobj +3600 0 obj +<< +/A 4667 0 R +/K 1767 0 R +/P 2938 0 R +/S /TD +>> +endobj +3601 0 obj +<< +/A 4667 0 R +/K 1768 0 R +/P 2938 0 R +/S /TD +>> +endobj +3602 0 obj +<< +/A 4667 0 R +/K 1769 0 R +/P 2938 0 R +/S /TD +>> +endobj +3603 0 obj +<< +/A 4667 0 R +/K 1770 0 R +/P 2938 0 R +/S /TD +>> +endobj +3604 0 obj +<< +/A 4667 0 R +/K 1771 0 R +/P 2938 0 R +/S /TD +>> +endobj +3605 0 obj +<< +/A 4667 0 R +/K 1772 0 R +/P 2938 0 R +/S /TD +>> +endobj +3606 0 obj +<< +/A 4667 0 R +/K 1773 0 R +/P 2938 0 R +/S /TD +>> +endobj +3607 0 obj +<< +/A 4667 0 R +/K 1774 0 R +/P 2939 0 R +/S /TD +>> +endobj +3608 0 obj +<< +/A 4667 0 R +/K 1775 0 R +/P 2939 0 R +/S /TD +>> +endobj +3609 0 obj +<< +/A 4667 0 R +/K 1776 0 R +/P 2939 0 R +/S /TD +>> +endobj +3610 0 obj +<< +/A 4667 0 R +/K 1777 0 R +/P 2939 0 R +/S /TD +>> +endobj +3611 0 obj +<< +/A 4667 0 R +/K 1778 0 R +/P 2939 0 R +/S /TD +>> +endobj +3612 0 obj +<< +/A 4667 0 R +/K 1779 0 R +/P 2939 0 R +/S /TD +>> +endobj +3613 0 obj +<< +/A 4667 0 R +/K 1780 0 R +/P 2939 0 R +/S /TD +>> +endobj +3614 0 obj +<< +/A 4667 0 R +/K 1781 0 R +/P 2940 0 R +/S /TD +>> +endobj +3615 0 obj +<< +/A 4667 0 R +/K 1782 0 R +/P 2940 0 R +/S /TD +>> +endobj +3616 0 obj +<< +/A 4667 0 R +/K 1783 0 R +/P 2940 0 R +/S /TD +>> +endobj +3617 0 obj +<< +/A 4667 0 R +/K 1784 0 R +/P 2940 0 R +/S /TD +>> +endobj +3618 0 obj +<< +/A 4667 0 R +/K 1785 0 R +/P 2940 0 R +/S /TD +>> +endobj +3619 0 obj +<< +/A 4667 0 R +/K 1786 0 R +/P 2940 0 R +/S /TD +>> +endobj +3620 0 obj +<< +/A 4667 0 R +/K 1787 0 R +/P 2940 0 R +/S /TD +>> +endobj +3621 0 obj +<< +/A 4667 0 R +/K 1788 0 R +/P 2941 0 R +/S /TD +>> +endobj +3622 0 obj +<< +/A 4667 0 R +/K 1789 0 R +/P 2941 0 R +/S /TD +>> +endobj +3623 0 obj +<< +/A 4667 0 R +/K 1790 0 R +/P 2941 0 R +/S /TD +>> +endobj +3624 0 obj +<< +/A 4667 0 R +/K 1791 0 R +/P 2941 0 R +/S /TD +>> +endobj +3625 0 obj +<< +/A 4667 0 R +/K 1792 0 R +/P 2941 0 R +/S /TD +>> +endobj +3626 0 obj +<< +/A 4667 0 R +/K 1793 0 R +/P 2941 0 R +/S /TD +>> +endobj +3627 0 obj +<< +/A 4667 0 R +/K 1794 0 R +/P 2941 0 R +/S /TD +>> +endobj +3628 0 obj +<< +/A 4667 0 R +/K 1795 0 R +/P 2942 0 R +/S /TD +>> +endobj +3629 0 obj +<< +/A [4667 0 R 4689 0 R] +/K 1796 0 R +/P 2942 0 R +/S /TD +>> +endobj +3630 0 obj +<< +/A 4688 0 R +/K 1797 0 R +/P 2943 0 R +/S /TD +>> +endobj +3631 0 obj +<< +/A 4688 0 R +/K 1798 0 R +/P 2943 0 R +/S /TD +>> +endobj +3632 0 obj +<< +/A 4688 0 R +/K 1799 0 R +/P 2943 0 R +/S /TD +>> +endobj +3633 0 obj +<< +/A 4688 0 R +/K 1800 0 R +/P 2943 0 R +/S /TD +>> +endobj +3634 0 obj +<< +/A 4688 0 R +/K 1801 0 R +/P 2943 0 R +/S /TD +>> +endobj +3635 0 obj +<< +/A 4688 0 R +/K 1802 0 R +/P 2943 0 R +/S /TD +>> +endobj +3636 0 obj +<< +/A 4688 0 R +/K 1803 0 R +/P 2943 0 R +/S /TD +>> +endobj +3637 0 obj +<< +/A 4688 0 R +/K 1804 0 R +/P 2943 0 R +/S /TD +>> +endobj +3638 0 obj +<< +/A 4688 0 R +/K 1805 0 R +/P 2943 0 R +/S /TD +>> +endobj +3639 0 obj +<< +/A [4667 0 R 4690 0 R] +/K [1806 0 R 1807 0 R] +/P 2943 0 R +/S /TD +>> +endobj +3640 0 obj +<< +/A 4667 0 R +/K 1808 0 R +/P 2944 0 R +/S /TD +>> +endobj +3641 0 obj +<< +/A 4667 0 R +/K 1809 0 R +/P 2944 0 R +/S /TD +>> +endobj +3642 0 obj +<< +/A 4667 0 R +/K 1810 0 R +/P 2944 0 R +/S /TD +>> +endobj +3643 0 obj +<< +/A 4667 0 R +/K 1811 0 R +/P 2944 0 R +/S /TD +>> +endobj +3644 0 obj +<< +/A 4667 0 R +/K 1812 0 R +/P 2944 0 R +/S /TD +>> +endobj +3645 0 obj +<< +/A 4667 0 R +/K 1813 0 R +/P 2944 0 R +/S /TD +>> +endobj +3646 0 obj +<< +/A 4667 0 R +/K 1814 0 R +/P 2944 0 R +/S /TD +>> +endobj +3647 0 obj +<< +/A 4667 0 R +/K 1815 0 R +/P 2944 0 R +/S /TD +>> +endobj +3648 0 obj +<< +/A 4667 0 R +/K 1816 0 R +/P 2944 0 R +/S /TD +>> +endobj +3649 0 obj +<< +/A 4688 0 R +/K 1817 0 R +/P 2945 0 R +/S /TD +>> +endobj +3650 0 obj +<< +/A 4688 0 R +/K 1818 0 R +/P 2945 0 R +/S /TD +>> +endobj +3651 0 obj +<< +/A 4688 0 R +/K 1819 0 R +/P 2945 0 R +/S /TD +>> +endobj +3652 0 obj +<< +/A 4688 0 R +/K 1820 0 R +/P 2945 0 R +/S /TD +>> +endobj +3653 0 obj +<< +/A 4688 0 R +/K 1821 0 R +/P 2945 0 R +/S /TD +>> +endobj +3654 0 obj +<< +/A 4688 0 R +/K 1822 0 R +/P 2945 0 R +/S /TD +>> +endobj +3655 0 obj +<< +/A 4688 0 R +/K 1823 0 R +/P 2945 0 R +/S /TD +>> +endobj +3656 0 obj +<< +/A 4688 0 R +/K 1824 0 R +/P 2945 0 R +/S /TD +>> +endobj +3657 0 obj +<< +/A 4688 0 R +/K 1825 0 R +/P 2945 0 R +/S /TD +>> +endobj +3658 0 obj +<< +/A [4667 0 R 4691 0 R] +/K [1826 0 R 1827 0 R] +/P 2945 0 R +/S /TD +>> +endobj +3659 0 obj +<< +/A 4667 0 R +/K 1828 0 R +/P 2946 0 R +/S /TD +>> +endobj +3660 0 obj +<< +/A 4667 0 R +/K 1829 0 R +/P 2946 0 R +/S /TD +>> +endobj +3661 0 obj +<< +/A 4667 0 R +/K 1830 0 R +/P 2946 0 R +/S /TD +>> +endobj +3662 0 obj +<< +/A 4667 0 R +/K 1831 0 R +/P 2946 0 R +/S /TD +>> +endobj +3663 0 obj +<< +/A 4667 0 R +/K 1832 0 R +/P 2946 0 R +/S /TD +>> +endobj +3664 0 obj +<< +/A 4667 0 R +/K 1833 0 R +/P 2946 0 R +/S /TD +>> +endobj +3665 0 obj +<< +/A 4667 0 R +/K 1834 0 R +/P 2946 0 R +/S /TD +>> +endobj +3666 0 obj +<< +/A 4667 0 R +/K 1835 0 R +/P 2946 0 R +/S /TD +>> +endobj +3667 0 obj +<< +/A 4667 0 R +/K 1836 0 R +/P 2946 0 R +/S /TD +>> +endobj +3668 0 obj +<< +/A 4667 0 R +/K 1837 0 R +/P 2947 0 R +/S /TD +>> +endobj +3669 0 obj +<< +/A 4667 0 R +/K 1838 0 R +/P 2947 0 R +/S /TD +>> +endobj +3670 0 obj +<< +/A [4667 0 R 4692 0 R] +/K 1839 0 R +/P 2947 0 R +/S /TD +>> +endobj +3671 0 obj +<< +/A 4688 0 R +/K 1840 0 R +/P 2948 0 R +/S /TD +>> +endobj +3672 0 obj +<< +/A 4688 0 R +/K 1841 0 R +/P 2948 0 R +/S /TD +>> +endobj +3673 0 obj +<< +/A 4688 0 R +/K 1842 0 R +/P 2948 0 R +/S /TD +>> +endobj +3674 0 obj +<< +/A 4688 0 R +/K 1843 0 R +/P 2948 0 R +/S /TD +>> +endobj +3675 0 obj +<< +/A 4688 0 R +/K 1844 0 R +/P 2948 0 R +/S /TD +>> +endobj +3676 0 obj +<< +/A 4688 0 R +/K 1845 0 R +/P 2948 0 R +/S /TD +>> +endobj +3677 0 obj +<< +/A 4688 0 R +/K 1846 0 R +/P 2948 0 R +/S /TD +>> +endobj +3678 0 obj +<< +/A 4688 0 R +/K 1847 0 R +/P 2948 0 R +/S /TD +>> +endobj +3679 0 obj +<< +/A 4688 0 R +/K 1848 0 R +/P 2948 0 R +/S /TD +>> +endobj +3680 0 obj +<< +/A [4667 0 R 4693 0 R] +/K [1849 0 R 1850 0 R] +/P 2948 0 R +/S /TD +>> +endobj +3681 0 obj +<< +/A 4667 0 R +/K 1851 0 R +/P 2949 0 R +/S /TD +>> +endobj +3682 0 obj +<< +/A 4667 0 R +/K 1852 0 R +/P 2949 0 R +/S /TD +>> +endobj +3683 0 obj +<< +/A 4667 0 R +/K 1853 0 R +/P 2949 0 R +/S /TD +>> +endobj +3684 0 obj +<< +/A 4667 0 R +/K 1854 0 R +/P 2949 0 R +/S /TD +>> +endobj +3685 0 obj +<< +/A 4667 0 R +/K 1855 0 R +/P 2949 0 R +/S /TD +>> +endobj +3686 0 obj +<< +/A 4667 0 R +/K 1856 0 R +/P 2949 0 R +/S /TD +>> +endobj +3687 0 obj +<< +/A 4667 0 R +/K 1857 0 R +/P 2949 0 R +/S /TD +>> +endobj +3688 0 obj +<< +/A 4667 0 R +/K 1858 0 R +/P 2949 0 R +/S /TD +>> +endobj +3689 0 obj +<< +/A 4667 0 R +/K 1859 0 R +/P 2949 0 R +/S /TD +>> +endobj +3690 0 obj +<< +/A [4667 0 R 4694 0 R] +/K 1860 0 R +/P 2950 0 R +/S /TD +>> +endobj +3691 0 obj +<< +/A 4667 0 R +/K 1861 0 R +/P 2951 0 R +/S /TD +>> +endobj +3692 0 obj +<< +/A 4667 0 R +/K 1862 0 R +/P 2951 0 R +/S /TD +>> +endobj +3693 0 obj +<< +/A 4667 0 R +/K 1863 0 R +/P 2951 0 R +/S /TD +>> +endobj +3694 0 obj +<< +/A 4667 0 R +/K 1864 0 R +/P 2951 0 R +/S /TD +>> +endobj +3695 0 obj +<< +/A 4667 0 R +/K 1865 0 R +/P 2951 0 R +/S /TD +>> +endobj +3696 0 obj +<< +/A 4667 0 R +/K 1866 0 R +/P 2951 0 R +/S /TD +>> +endobj +3697 0 obj +<< +/A 4667 0 R +/K 1867 0 R +/P 2952 0 R +/S /TD +>> +endobj +3698 0 obj +<< +/A 4667 0 R +/K 1868 0 R +/P 2952 0 R +/S /TD +>> +endobj +3699 0 obj +<< +/A 4667 0 R +/K 1869 0 R +/P 2952 0 R +/S /TD +>> +endobj +3700 0 obj +<< +/A 4667 0 R +/K 1870 0 R +/P 2952 0 R +/S /TD +>> +endobj +3701 0 obj +<< +/A 4667 0 R +/K 1871 0 R +/P 2952 0 R +/S /TD +>> +endobj +3702 0 obj +<< +/A 4667 0 R +/K 1872 0 R +/P 2952 0 R +/S /TD +>> +endobj +3703 0 obj +<< +/A 4667 0 R +/K 1873 0 R +/P 2953 0 R +/S /TD +>> +endobj +3704 0 obj +<< +/A 4667 0 R +/K 1874 0 R +/P 2953 0 R +/S /TD +>> +endobj +3705 0 obj +<< +/A 4667 0 R +/K 1875 0 R +/P 2953 0 R +/S /TD +>> +endobj +3706 0 obj +<< +/A 4667 0 R +/K 1876 0 R +/P 2953 0 R +/S /TD +>> +endobj +3707 0 obj +<< +/A 4667 0 R +/K 1877 0 R +/P 2953 0 R +/S /TD +>> +endobj +3708 0 obj +<< +/A 4667 0 R +/K 1878 0 R +/P 2953 0 R +/S /TD +>> +endobj +3709 0 obj +<< +/A 4667 0 R +/K 1879 0 R +/P 2954 0 R +/S /TD +>> +endobj +3710 0 obj +<< +/A 4667 0 R +/K 1880 0 R +/P 2954 0 R +/S /TD +>> +endobj +3711 0 obj +<< +/A 4667 0 R +/K 1881 0 R +/P 2954 0 R +/S /TD +>> +endobj +3712 0 obj +<< +/A 4667 0 R +/K 1882 0 R +/P 2954 0 R +/S /TD +>> +endobj +3713 0 obj +<< +/A 4667 0 R +/K 1883 0 R +/P 2954 0 R +/S /TD +>> +endobj +3714 0 obj +<< +/A 4667 0 R +/K 1884 0 R +/P 2954 0 R +/S /TD +>> +endobj +3715 0 obj +<< +/A 4667 0 R +/K 1885 0 R +/P 2954 0 R +/S /TD +>> +endobj +3716 0 obj +<< +/A 4667 0 R +/K 1886 0 R +/P 2955 0 R +/S /TD +>> +endobj +3717 0 obj +<< +/A 4667 0 R +/K 1887 0 R +/P 2955 0 R +/S /TD +>> +endobj +3718 0 obj +<< +/A 4667 0 R +/K 1888 0 R +/P 2955 0 R +/S /TD +>> +endobj +3719 0 obj +<< +/A 4667 0 R +/K 1889 0 R +/P 2955 0 R +/S /TD +>> +endobj +3720 0 obj +<< +/A 4667 0 R +/K 1890 0 R +/P 2955 0 R +/S /TD +>> +endobj +3721 0 obj +<< +/A 4667 0 R +/K 1891 0 R +/P 2955 0 R +/S /TD +>> +endobj +3722 0 obj +<< +/A 4667 0 R +/K 1892 0 R +/P 2955 0 R +/S /TD +>> +endobj +3723 0 obj +<< +/A 4667 0 R +/K 1893 0 R +/P 2956 0 R +/S /TD +>> +endobj +3724 0 obj +<< +/A 4667 0 R +/K 1894 0 R +/P 2956 0 R +/S /TD +>> +endobj +3725 0 obj +<< +/A 4667 0 R +/K 1895 0 R +/P 2956 0 R +/S /TD +>> +endobj +3726 0 obj +<< +/A 4667 0 R +/K 1896 0 R +/P 2956 0 R +/S /TD +>> +endobj +3727 0 obj +<< +/A 4667 0 R +/K 1897 0 R +/P 2956 0 R +/S /TD +>> +endobj +3728 0 obj +<< +/A 4667 0 R +/K 1898 0 R +/P 2956 0 R +/S /TD +>> +endobj +3729 0 obj +<< +/A 4667 0 R +/K 1899 0 R +/P 2956 0 R +/S /TD +>> +endobj +3730 0 obj +<< +/A 4667 0 R +/K 1900 0 R +/P 2957 0 R +/S /TD +>> +endobj +3731 0 obj +<< +/A 4667 0 R +/K 1901 0 R +/P 2957 0 R +/S /TD +>> +endobj +3732 0 obj +<< +/A 4667 0 R +/K 1902 0 R +/P 2957 0 R +/S /TD +>> +endobj +3733 0 obj +<< +/A 4667 0 R +/K 1903 0 R +/P 2957 0 R +/S /TD +>> +endobj +3734 0 obj +<< +/A 4667 0 R +/K 1904 0 R +/P 2957 0 R +/S /TD +>> +endobj +3735 0 obj +<< +/A 4667 0 R +/K 1905 0 R +/P 2957 0 R +/S /TD +>> +endobj +3736 0 obj +<< +/A 4667 0 R +/K 1906 0 R +/P 2958 0 R +/S /TD +>> +endobj +3737 0 obj +<< +/A 4667 0 R +/K 1907 0 R +/P 2958 0 R +/S /TD +>> +endobj +3738 0 obj +<< +/A 4667 0 R +/K 1908 0 R +/P 2958 0 R +/S /TD +>> +endobj +3739 0 obj +<< +/A 4667 0 R +/K 1909 0 R +/P 2958 0 R +/S /TD +>> +endobj +3740 0 obj +<< +/A 4667 0 R +/K 1910 0 R +/P 2958 0 R +/S /TD +>> +endobj +3741 0 obj +<< +/A 4667 0 R +/K 1911 0 R +/P 2958 0 R +/S /TD +>> +endobj +3742 0 obj +<< +/A 4667 0 R +/K 1912 0 R +/P 2959 0 R +/S /TD +>> +endobj +3743 0 obj +<< +/A 4667 0 R +/K 1913 0 R +/P 2959 0 R +/S /TD +>> +endobj +3744 0 obj +<< +/A 4667 0 R +/K 1914 0 R +/P 2959 0 R +/S /TD +>> +endobj +3745 0 obj +<< +/A 4667 0 R +/K 1915 0 R +/P 2959 0 R +/S /TD +>> +endobj +3746 0 obj +<< +/A 4667 0 R +/K 1916 0 R +/P 2959 0 R +/S /TD +>> +endobj +3747 0 obj +<< +/A 4667 0 R +/K 1917 0 R +/P 2959 0 R +/S /TD +>> +endobj +3748 0 obj +<< +/A 4667 0 R +/K 1918 0 R +/P 2960 0 R +/S /TD +>> +endobj +3749 0 obj +<< +/A 4667 0 R +/K 1919 0 R +/P 2960 0 R +/S /TD +>> +endobj +3750 0 obj +<< +/A 4667 0 R +/K 1920 0 R +/P 2960 0 R +/S /TD +>> +endobj +3751 0 obj +<< +/A 4667 0 R +/K 1921 0 R +/P 2960 0 R +/S /TD +>> +endobj +3752 0 obj +<< +/A 4667 0 R +/K 1922 0 R +/P 2960 0 R +/S /TD +>> +endobj +3753 0 obj +<< +/A 4667 0 R +/K 1923 0 R +/P 2960 0 R +/S /TD +>> +endobj +3754 0 obj +<< +/A 4667 0 R +/K 1924 0 R +/P 2961 0 R +/S /TD +>> +endobj +3755 0 obj +<< +/A 4667 0 R +/K 1925 0 R +/P 2961 0 R +/S /TD +>> +endobj +3756 0 obj +<< +/A 4667 0 R +/K 1926 0 R +/P 2961 0 R +/S /TD +>> +endobj +3757 0 obj +<< +/A 4667 0 R +/K 1927 0 R +/P 2961 0 R +/S /TD +>> +endobj +3758 0 obj +<< +/A 4667 0 R +/K 1928 0 R +/P 2961 0 R +/S /TD +>> +endobj +3759 0 obj +<< +/A 4667 0 R +/K 1929 0 R +/P 2961 0 R +/S /TD +>> +endobj +3760 0 obj +<< +/A 4667 0 R +/K 1930 0 R +/P 2962 0 R +/S /TD +>> +endobj +3761 0 obj +<< +/A 4667 0 R +/K 1931 0 R +/P 2962 0 R +/S /TD +>> +endobj +3762 0 obj +<< +/A 4667 0 R +/K 1932 0 R +/P 2962 0 R +/S /TD +>> +endobj +3763 0 obj +<< +/A 4667 0 R +/K 1933 0 R +/P 2962 0 R +/S /TD +>> +endobj +3764 0 obj +<< +/A 4667 0 R +/K 1934 0 R +/P 2962 0 R +/S /TD +>> +endobj +3765 0 obj +<< +/A 4667 0 R +/K 1935 0 R +/P 2962 0 R +/S /TD +>> +endobj +3766 0 obj +<< +/A 4667 0 R +/K 1936 0 R +/P 2963 0 R +/S /TD +>> +endobj +3767 0 obj +<< +/A 4667 0 R +/K 1937 0 R +/P 2963 0 R +/S /TD +>> +endobj +3768 0 obj +<< +/A 4667 0 R +/K 1938 0 R +/P 2963 0 R +/S /TD +>> +endobj +3769 0 obj +<< +/A 4667 0 R +/K 1939 0 R +/P 2963 0 R +/S /TD +>> +endobj +3770 0 obj +<< +/A 4667 0 R +/K 1940 0 R +/P 2963 0 R +/S /TD +>> +endobj +3771 0 obj +<< +/A 4667 0 R +/K 1941 0 R +/P 2963 0 R +/S /TD +>> +endobj +3772 0 obj +<< +/A 4667 0 R +/K 1942 0 R +/P 2964 0 R +/S /TD +>> +endobj +3773 0 obj +<< +/A 4667 0 R +/K 1943 0 R +/P 2964 0 R +/S /TD +>> +endobj +3774 0 obj +<< +/A 4667 0 R +/K 1944 0 R +/P 2964 0 R +/S /TD +>> +endobj +3775 0 obj +<< +/A 4667 0 R +/K 1945 0 R +/P 2964 0 R +/S /TD +>> +endobj +3776 0 obj +<< +/A 4667 0 R +/K 1946 0 R +/P 2964 0 R +/S /TD +>> +endobj +3777 0 obj +<< +/A 4667 0 R +/K 1947 0 R +/P 2964 0 R +/S /TD +>> +endobj +3778 0 obj +<< +/A 4667 0 R +/K 1948 0 R +/P 2965 0 R +/S /TD +>> +endobj +3779 0 obj +<< +/A 4667 0 R +/K 1949 0 R +/P 2965 0 R +/S /TD +>> +endobj +3780 0 obj +<< +/A 4667 0 R +/K 1950 0 R +/P 2965 0 R +/S /TD +>> +endobj +3781 0 obj +<< +/A 4667 0 R +/K 1951 0 R +/P 2965 0 R +/S /TD +>> +endobj +3782 0 obj +<< +/A 4667 0 R +/K 1952 0 R +/P 2965 0 R +/S /TD +>> +endobj +3783 0 obj +<< +/A 4667 0 R +/K 1953 0 R +/P 2965 0 R +/S /TD +>> +endobj +3784 0 obj +<< +/A 4667 0 R +/K 1954 0 R +/P 2966 0 R +/S /TD +>> +endobj +3785 0 obj +<< +/A 4667 0 R +/K 1955 0 R +/P 2966 0 R +/S /TD +>> +endobj +3786 0 obj +<< +/A 4667 0 R +/K 1956 0 R +/P 2966 0 R +/S /TD +>> +endobj +3787 0 obj +<< +/A 4667 0 R +/K 1957 0 R +/P 2966 0 R +/S /TD +>> +endobj +3788 0 obj +<< +/A 4667 0 R +/K 1958 0 R +/P 2966 0 R +/S /TD +>> +endobj +3789 0 obj +<< +/A 4667 0 R +/K 1959 0 R +/P 2966 0 R +/S /TD +>> +endobj +3790 0 obj +<< +/A 4667 0 R +/K 1960 0 R +/P 2967 0 R +/S /TD +>> +endobj +3791 0 obj +<< +/A 4667 0 R +/K 1961 0 R +/P 2967 0 R +/S /TD +>> +endobj +3792 0 obj +<< +/A 4667 0 R +/K 1962 0 R +/P 2967 0 R +/S /TD +>> +endobj +3793 0 obj +<< +/A 4667 0 R +/K 1963 0 R +/P 2967 0 R +/S /TD +>> +endobj +3794 0 obj +<< +/A 4667 0 R +/K 1964 0 R +/P 2967 0 R +/S /TD +>> +endobj +3795 0 obj +<< +/A 4667 0 R +/K 1965 0 R +/P 2967 0 R +/S /TD +>> +endobj +3796 0 obj +<< +/A 4667 0 R +/K 1966 0 R +/P 2968 0 R +/S /TD +>> +endobj +3797 0 obj +<< +/A 4667 0 R +/K 1967 0 R +/P 2968 0 R +/S /TD +>> +endobj +3798 0 obj +<< +/A 4667 0 R +/K 1968 0 R +/P 2968 0 R +/S /TD +>> +endobj +3799 0 obj +<< +/A 4667 0 R +/K 1969 0 R +/P 2968 0 R +/S /TD +>> +endobj +3800 0 obj +<< +/A 4667 0 R +/K 1970 0 R +/P 2968 0 R +/S /TD +>> +endobj +3801 0 obj +<< +/A 4667 0 R +/K 1971 0 R +/P 2968 0 R +/S /TD +>> +endobj +3802 0 obj +<< +/A 4667 0 R +/K 1972 0 R +/P 2969 0 R +/S /TD +>> +endobj +3803 0 obj +<< +/A 4667 0 R +/K 1973 0 R +/P 2969 0 R +/S /TD +>> +endobj +3804 0 obj +<< +/A 4667 0 R +/K 1974 0 R +/P 2969 0 R +/S /TD +>> +endobj +3805 0 obj +<< +/A 4667 0 R +/K 1975 0 R +/P 2969 0 R +/S /TD +>> +endobj +3806 0 obj +<< +/A 4667 0 R +/K 1976 0 R +/P 2969 0 R +/S /TD +>> +endobj +3807 0 obj +<< +/A 4667 0 R +/K 1977 0 R +/P 2969 0 R +/S /TD +>> +endobj +3808 0 obj +<< +/A 4667 0 R +/K 1978 0 R +/P 2970 0 R +/S /TD +>> +endobj +3809 0 obj +<< +/A 4667 0 R +/K 1979 0 R +/P 2970 0 R +/S /TD +>> +endobj +3810 0 obj +<< +/A 4667 0 R +/K 1980 0 R +/P 2970 0 R +/S /TD +>> +endobj +3811 0 obj +<< +/A 4667 0 R +/K 1981 0 R +/P 2970 0 R +/S /TD +>> +endobj +3812 0 obj +<< +/A 4667 0 R +/K 1982 0 R +/P 2970 0 R +/S /TD +>> +endobj +3813 0 obj +<< +/A 4667 0 R +/K 1983 0 R +/P 2970 0 R +/S /TD +>> +endobj +3814 0 obj +<< +/A 4667 0 R +/K 1984 0 R +/P 2971 0 R +/S /TD +>> +endobj +3815 0 obj +<< +/A 4667 0 R +/K 1985 0 R +/P 2971 0 R +/S /TD +>> +endobj +3816 0 obj +<< +/A 4667 0 R +/K 1986 0 R +/P 2971 0 R +/S /TD +>> +endobj +3817 0 obj +<< +/A 4667 0 R +/K 1987 0 R +/P 2971 0 R +/S /TD +>> +endobj +3818 0 obj +<< +/A 4667 0 R +/K 1988 0 R +/P 2971 0 R +/S /TD +>> +endobj +3819 0 obj +<< +/A 4667 0 R +/K 1989 0 R +/P 2971 0 R +/S /TD +>> +endobj +3820 0 obj +<< +/A 4667 0 R +/K 1990 0 R +/P 2972 0 R +/S /TD +>> +endobj +3821 0 obj +<< +/A 4667 0 R +/K 1991 0 R +/P 2972 0 R +/S /TD +>> +endobj +3822 0 obj +<< +/A 4667 0 R +/K 1992 0 R +/P 2972 0 R +/S /TD +>> +endobj +3823 0 obj +<< +/A 4667 0 R +/K 1993 0 R +/P 2972 0 R +/S /TD +>> +endobj +3824 0 obj +<< +/A 4667 0 R +/K 1994 0 R +/P 2972 0 R +/S /TD +>> +endobj +3825 0 obj +<< +/A 4667 0 R +/K 1995 0 R +/P 2972 0 R +/S /TD +>> +endobj +3826 0 obj +<< +/A 4667 0 R +/K 1996 0 R +/P 2973 0 R +/S /TD +>> +endobj +3827 0 obj +<< +/A 4667 0 R +/K 1997 0 R +/P 2973 0 R +/S /TD +>> +endobj +3828 0 obj +<< +/A 4667 0 R +/K 1998 0 R +/P 2973 0 R +/S /TD +>> +endobj +3829 0 obj +<< +/A 4667 0 R +/K 1999 0 R +/P 2973 0 R +/S /TD +>> +endobj +3830 0 obj +<< +/A 4667 0 R +/K 2000 0 R +/P 2973 0 R +/S /TD +>> +endobj +3831 0 obj +<< +/A 4667 0 R +/K 2001 0 R +/P 2973 0 R +/S /TD +>> +endobj +3832 0 obj +<< +/A 4667 0 R +/K 2002 0 R +/P 2974 0 R +/S /TD +>> +endobj +3833 0 obj +<< +/A 4667 0 R +/K 2003 0 R +/P 2974 0 R +/S /TD +>> +endobj +3834 0 obj +<< +/A 4667 0 R +/K 2004 0 R +/P 2974 0 R +/S /TD +>> +endobj +3835 0 obj +<< +/A 4667 0 R +/K 2005 0 R +/P 2974 0 R +/S /TD +>> +endobj +3836 0 obj +<< +/A 4667 0 R +/K 2006 0 R +/P 2974 0 R +/S /TD +>> +endobj +3837 0 obj +<< +/A 4667 0 R +/K 2007 0 R +/P 2974 0 R +/S /TD +>> +endobj +3838 0 obj +<< +/A 4667 0 R +/K 2008 0 R +/P 2975 0 R +/S /TD +>> +endobj +3839 0 obj +<< +/A 4667 0 R +/K 2009 0 R +/P 2975 0 R +/S /TD +>> +endobj +3840 0 obj +<< +/A 4667 0 R +/K 2010 0 R +/P 2975 0 R +/S /TD +>> +endobj +3841 0 obj +<< +/A 4667 0 R +/K 2011 0 R +/P 2975 0 R +/S /TD +>> +endobj +3842 0 obj +<< +/A 4667 0 R +/K 2012 0 R +/P 2975 0 R +/S /TD +>> +endobj +3843 0 obj +<< +/A 4667 0 R +/K 2013 0 R +/P 2975 0 R +/S /TD +>> +endobj +3844 0 obj +<< +/A 4667 0 R +/K 2014 0 R +/P 2976 0 R +/S /TD +>> +endobj +3845 0 obj +<< +/A 4667 0 R +/K 2015 0 R +/P 2976 0 R +/S /TD +>> +endobj +3846 0 obj +<< +/A 4667 0 R +/K 2016 0 R +/P 2976 0 R +/S /TD +>> +endobj +3847 0 obj +<< +/A 4667 0 R +/K 2017 0 R +/P 2976 0 R +/S /TD +>> +endobj +3848 0 obj +<< +/A 4667 0 R +/K 2018 0 R +/P 2976 0 R +/S /TD +>> +endobj +3849 0 obj +<< +/A 4667 0 R +/K 2019 0 R +/P 2976 0 R +/S /TD +>> +endobj +3850 0 obj +<< +/A 4667 0 R +/K 2020 0 R +/P 2977 0 R +/S /TD +>> +endobj +3851 0 obj +<< +/A 4667 0 R +/K 2021 0 R +/P 2977 0 R +/S /TD +>> +endobj +3852 0 obj +<< +/A 4667 0 R +/K 2022 0 R +/P 2977 0 R +/S /TD +>> +endobj +3853 0 obj +<< +/A 4667 0 R +/K 2023 0 R +/P 2977 0 R +/S /TD +>> +endobj +3854 0 obj +<< +/A 4667 0 R +/K 2024 0 R +/P 2977 0 R +/S /TD +>> +endobj +3855 0 obj +<< +/A 4667 0 R +/K 2025 0 R +/P 2977 0 R +/S /TD +>> +endobj +3856 0 obj +<< +/A 4667 0 R +/K 2026 0 R +/P 2978 0 R +/S /TD +>> +endobj +3857 0 obj +<< +/A 4667 0 R +/K 2027 0 R +/P 2978 0 R +/S /TD +>> +endobj +3858 0 obj +<< +/A 4667 0 R +/K 2028 0 R +/P 2978 0 R +/S /TD +>> +endobj +3859 0 obj +<< +/A 4667 0 R +/K 2029 0 R +/P 2978 0 R +/S /TD +>> +endobj +3860 0 obj +<< +/A 4667 0 R +/K 2030 0 R +/P 2978 0 R +/S /TD +>> +endobj +3861 0 obj +<< +/A 4667 0 R +/K 2031 0 R +/P 2978 0 R +/S /TD +>> +endobj +3862 0 obj +<< +/A 4667 0 R +/K 2032 0 R +/P 2979 0 R +/S /TD +>> +endobj +3863 0 obj +<< +/A 4667 0 R +/K 2033 0 R +/P 2979 0 R +/S /TD +>> +endobj +3864 0 obj +<< +/A 4667 0 R +/K 2034 0 R +/P 2979 0 R +/S /TD +>> +endobj +3865 0 obj +<< +/A 4667 0 R +/K 2035 0 R +/P 2979 0 R +/S /TD +>> +endobj +3866 0 obj +<< +/A 4667 0 R +/K 2036 0 R +/P 2979 0 R +/S /TD +>> +endobj +3867 0 obj +<< +/A 4667 0 R +/K 2037 0 R +/P 2979 0 R +/S /TD +>> +endobj +3868 0 obj +<< +/A 4667 0 R +/K 2038 0 R +/P 2980 0 R +/S /TD +>> +endobj +3869 0 obj +<< +/A 4667 0 R +/K 2039 0 R +/P 2980 0 R +/S /TD +>> +endobj +3870 0 obj +<< +/A 4667 0 R +/K 2040 0 R +/P 2980 0 R +/S /TD +>> +endobj +3871 0 obj +<< +/A 4667 0 R +/K 2041 0 R +/P 2980 0 R +/S /TD +>> +endobj +3872 0 obj +<< +/A 4667 0 R +/K 2042 0 R +/P 2980 0 R +/S /TD +>> +endobj +3873 0 obj +<< +/A 4667 0 R +/K 2043 0 R +/P 2980 0 R +/S /TD +>> +endobj +3874 0 obj +<< +/A 4667 0 R +/K 2044 0 R +/P 2981 0 R +/S /TD +>> +endobj +3875 0 obj +<< +/A 4667 0 R +/K 2045 0 R +/P 2981 0 R +/S /TD +>> +endobj +3876 0 obj +<< +/A 4667 0 R +/K 2046 0 R +/P 2981 0 R +/S /TD +>> +endobj +3877 0 obj +<< +/A 4667 0 R +/K 2047 0 R +/P 2981 0 R +/S /TD +>> +endobj +3878 0 obj +<< +/A 4667 0 R +/K 2048 0 R +/P 2981 0 R +/S /TD +>> +endobj +3879 0 obj +<< +/A 4667 0 R +/K 2049 0 R +/P 2981 0 R +/S /TD +>> +endobj +3880 0 obj +<< +/A 4667 0 R +/K 2050 0 R +/P 2982 0 R +/S /TD +>> +endobj +3881 0 obj +<< +/A 4667 0 R +/K 2051 0 R +/P 2982 0 R +/S /TD +>> +endobj +3882 0 obj +<< +/A 4667 0 R +/K 2052 0 R +/P 2982 0 R +/S /TD +>> +endobj +3883 0 obj +<< +/A 4667 0 R +/K 2053 0 R +/P 2982 0 R +/S /TD +>> +endobj +3884 0 obj +<< +/A 4667 0 R +/K 2054 0 R +/P 2982 0 R +/S /TD +>> +endobj +3885 0 obj +<< +/A 4667 0 R +/K 2055 0 R +/P 2982 0 R +/S /TD +>> +endobj +3886 0 obj +<< +/A 4667 0 R +/K 2056 0 R +/P 2983 0 R +/S /TD +>> +endobj +3887 0 obj +<< +/A 4667 0 R +/K 2057 0 R +/P 2983 0 R +/S /TD +>> +endobj +3888 0 obj +<< +/A 4667 0 R +/K 2058 0 R +/P 2983 0 R +/S /TD +>> +endobj +3889 0 obj +<< +/A 4667 0 R +/K 2059 0 R +/P 2983 0 R +/S /TD +>> +endobj +3890 0 obj +<< +/A 4667 0 R +/K 2060 0 R +/P 2983 0 R +/S /TD +>> +endobj +3891 0 obj +<< +/A 4667 0 R +/K 2061 0 R +/P 2983 0 R +/S /TD +>> +endobj +3892 0 obj +<< +/A 4667 0 R +/K 2062 0 R +/P 2984 0 R +/S /TD +>> +endobj +3893 0 obj +<< +/A 4667 0 R +/K 2063 0 R +/P 2984 0 R +/S /TD +>> +endobj +3894 0 obj +<< +/A 4667 0 R +/K 2064 0 R +/P 2984 0 R +/S /TD +>> +endobj +3895 0 obj +<< +/A 4667 0 R +/K 2065 0 R +/P 2984 0 R +/S /TD +>> +endobj +3896 0 obj +<< +/A 4667 0 R +/K 2066 0 R +/P 2984 0 R +/S /TD +>> +endobj +3897 0 obj +<< +/A 4667 0 R +/K 2067 0 R +/P 2984 0 R +/S /TD +>> +endobj +3898 0 obj +<< +/A 4667 0 R +/K 2068 0 R +/P 2985 0 R +/S /TD +>> +endobj +3899 0 obj +<< +/A 4667 0 R +/K 2069 0 R +/P 2985 0 R +/S /TD +>> +endobj +3900 0 obj +<< +/A 4667 0 R +/K 2070 0 R +/P 2985 0 R +/S /TD +>> +endobj +3901 0 obj +<< +/A 4667 0 R +/K 2071 0 R +/P 2985 0 R +/S /TD +>> +endobj +3902 0 obj +<< +/A 4667 0 R +/K 2072 0 R +/P 2985 0 R +/S /TD +>> +endobj +3903 0 obj +<< +/A 4667 0 R +/K 2073 0 R +/P 2985 0 R +/S /TD +>> +endobj +3904 0 obj +<< +/A 4667 0 R +/K 2074 0 R +/P 2986 0 R +/S /TD +>> +endobj +3905 0 obj +<< +/A 4667 0 R +/K 2075 0 R +/P 2986 0 R +/S /TD +>> +endobj +3906 0 obj +<< +/A 4667 0 R +/K 2076 0 R +/P 2986 0 R +/S /TD +>> +endobj +3907 0 obj +<< +/A 4667 0 R +/K 2077 0 R +/P 2986 0 R +/S /TD +>> +endobj +3908 0 obj +<< +/A 4667 0 R +/K 2078 0 R +/P 2986 0 R +/S /TD +>> +endobj +3909 0 obj +<< +/A 4667 0 R +/K 2079 0 R +/P 2986 0 R +/S /TD +>> +endobj +3910 0 obj +<< +/A 4667 0 R +/K 2080 0 R +/P 2987 0 R +/S /TD +>> +endobj +3911 0 obj +<< +/A 4667 0 R +/K 2081 0 R +/P 2987 0 R +/S /TD +>> +endobj +3912 0 obj +<< +/A 4667 0 R +/K 2082 0 R +/P 2987 0 R +/S /TD +>> +endobj +3913 0 obj +<< +/A 4667 0 R +/K 2083 0 R +/P 2987 0 R +/S /TD +>> +endobj +3914 0 obj +<< +/A 4667 0 R +/K 2084 0 R +/P 2987 0 R +/S /TD +>> +endobj +3915 0 obj +<< +/A 4667 0 R +/K 2085 0 R +/P 2987 0 R +/S /TD +>> +endobj +3916 0 obj +<< +/A 4667 0 R +/K 2086 0 R +/P 2987 0 R +/S /TD +>> +endobj +3917 0 obj +<< +/A 4667 0 R +/K 2087 0 R +/P 2988 0 R +/S /TD +>> +endobj +3918 0 obj +<< +/A 4667 0 R +/K 2088 0 R +/P 2988 0 R +/S /TD +>> +endobj +3919 0 obj +<< +/A 4667 0 R +/K 2089 0 R +/P 2988 0 R +/S /TD +>> +endobj +3920 0 obj +<< +/A 4667 0 R +/K 2090 0 R +/P 2988 0 R +/S /TD +>> +endobj +3921 0 obj +<< +/A 4667 0 R +/K 2091 0 R +/P 2988 0 R +/S /TD +>> +endobj +3922 0 obj +<< +/A 4667 0 R +/K 2092 0 R +/P 2988 0 R +/S /TD +>> +endobj +3923 0 obj +<< +/A 4667 0 R +/K 2093 0 R +/P 2988 0 R +/S /TD +>> +endobj +3924 0 obj +<< +/A 4667 0 R +/K 2094 0 R +/P 2989 0 R +/S /TD +>> +endobj +3925 0 obj +<< +/A 4667 0 R +/K 2095 0 R +/P 2989 0 R +/S /TD +>> +endobj +3926 0 obj +<< +/A 4667 0 R +/K 2096 0 R +/P 2989 0 R +/S /TD +>> +endobj +3927 0 obj +<< +/A 4667 0 R +/K 2097 0 R +/P 2989 0 R +/S /TD +>> +endobj +3928 0 obj +<< +/A 4667 0 R +/K 2098 0 R +/P 2989 0 R +/S /TD +>> +endobj +3929 0 obj +<< +/A 4667 0 R +/K 2099 0 R +/P 2989 0 R +/S /TD +>> +endobj +3930 0 obj +<< +/A 4667 0 R +/K 2100 0 R +/P 2989 0 R +/S /TD +>> +endobj +3931 0 obj +<< +/A 4667 0 R +/K 2101 0 R +/P 2990 0 R +/S /TD +>> +endobj +3932 0 obj +<< +/A 4667 0 R +/K 2102 0 R +/P 2990 0 R +/S /TD +>> +endobj +3933 0 obj +<< +/A 4667 0 R +/K 2103 0 R +/P 2990 0 R +/S /TD +>> +endobj +3934 0 obj +<< +/A 4667 0 R +/K 2104 0 R +/P 2990 0 R +/S /TD +>> +endobj +3935 0 obj +<< +/A 4667 0 R +/K 2105 0 R +/P 2990 0 R +/S /TD +>> +endobj +3936 0 obj +<< +/A 4667 0 R +/K 2106 0 R +/P 2990 0 R +/S /TD +>> +endobj +3937 0 obj +<< +/A 4667 0 R +/K 2107 0 R +/P 2991 0 R +/S /TD +>> +endobj +3938 0 obj +<< +/A 4667 0 R +/K 2108 0 R +/P 2991 0 R +/S /TD +>> +endobj +3939 0 obj +<< +/A 4667 0 R +/K 2109 0 R +/P 2991 0 R +/S /TD +>> +endobj +3940 0 obj +<< +/A 4667 0 R +/K 2110 0 R +/P 2991 0 R +/S /TD +>> +endobj +3941 0 obj +<< +/A 4667 0 R +/K 2111 0 R +/P 2991 0 R +/S /TD +>> +endobj +3942 0 obj +<< +/A 4667 0 R +/K 2112 0 R +/P 2991 0 R +/S /TD +>> +endobj +3943 0 obj +<< +/A 4667 0 R +/K 2113 0 R +/P 2992 0 R +/S /TD +>> +endobj +3944 0 obj +<< +/A 4667 0 R +/K 2114 0 R +/P 2992 0 R +/S /TD +>> +endobj +3945 0 obj +<< +/A 4667 0 R +/K 2115 0 R +/P 2992 0 R +/S /TD +>> +endobj +3946 0 obj +<< +/A 4667 0 R +/K 2116 0 R +/P 2992 0 R +/S /TD +>> +endobj +3947 0 obj +<< +/A 4667 0 R +/K 2117 0 R +/P 2992 0 R +/S /TD +>> +endobj +3948 0 obj +<< +/A 4667 0 R +/K 2118 0 R +/P 2992 0 R +/S /TD +>> +endobj +3949 0 obj +<< +/A 4667 0 R +/K 2119 0 R +/P 2993 0 R +/S /TD +>> +endobj +3950 0 obj +<< +/A 4667 0 R +/K 2120 0 R +/P 2993 0 R +/S /TD +>> +endobj +3951 0 obj +<< +/A 4667 0 R +/K 2121 0 R +/P 2993 0 R +/S /TD +>> +endobj +3952 0 obj +<< +/A 4667 0 R +/K 2122 0 R +/P 2993 0 R +/S /TD +>> +endobj +3953 0 obj +<< +/A 4667 0 R +/K 2123 0 R +/P 2993 0 R +/S /TD +>> +endobj +3954 0 obj +<< +/A 4667 0 R +/K 2124 0 R +/P 2993 0 R +/S /TD +>> +endobj +3955 0 obj +<< +/A 4667 0 R +/K 2125 0 R +/P 2994 0 R +/S /TD +>> +endobj +3956 0 obj +<< +/A 4667 0 R +/K 2126 0 R +/P 2994 0 R +/S /TD +>> +endobj +3957 0 obj +<< +/A 4667 0 R +/K 2127 0 R +/P 2994 0 R +/S /TD +>> +endobj +3958 0 obj +<< +/A 4667 0 R +/K 2128 0 R +/P 2994 0 R +/S /TD +>> +endobj +3959 0 obj +<< +/A 4667 0 R +/K 2129 0 R +/P 2994 0 R +/S /TD +>> +endobj +3960 0 obj +<< +/A 4667 0 R +/K 2130 0 R +/P 2994 0 R +/S /TD +>> +endobj +3961 0 obj +<< +/A 4667 0 R +/K 2131 0 R +/P 2995 0 R +/S /TD +>> +endobj +3962 0 obj +<< +/A 4667 0 R +/K 2132 0 R +/P 2995 0 R +/S /TD +>> +endobj +3963 0 obj +<< +/A 4667 0 R +/K 2133 0 R +/P 2995 0 R +/S /TD +>> +endobj +3964 0 obj +<< +/A 4667 0 R +/K 2134 0 R +/P 2995 0 R +/S /TD +>> +endobj +3965 0 obj +<< +/A 4667 0 R +/K 2135 0 R +/P 2995 0 R +/S /TD +>> +endobj +3966 0 obj +<< +/A 4667 0 R +/K 2136 0 R +/P 2995 0 R +/S /TD +>> +endobj +3967 0 obj +<< +/A 4667 0 R +/K 2137 0 R +/P 2996 0 R +/S /TD +>> +endobj +3968 0 obj +<< +/A 4667 0 R +/K 2138 0 R +/P 2996 0 R +/S /TD +>> +endobj +3969 0 obj +<< +/A 4667 0 R +/K 2139 0 R +/P 2996 0 R +/S /TD +>> +endobj +3970 0 obj +<< +/A 4667 0 R +/K 2140 0 R +/P 2996 0 R +/S /TD +>> +endobj +3971 0 obj +<< +/A 4667 0 R +/K 2141 0 R +/P 2996 0 R +/S /TD +>> +endobj +3972 0 obj +<< +/A 4667 0 R +/K 2142 0 R +/P 2996 0 R +/S /TD +>> +endobj +3973 0 obj +<< +/A 4667 0 R +/K 2143 0 R +/P 2997 0 R +/S /TD +>> +endobj +3974 0 obj +<< +/A 4667 0 R +/K 2144 0 R +/P 2997 0 R +/S /TD +>> +endobj +3975 0 obj +<< +/A 4667 0 R +/K 2145 0 R +/P 2997 0 R +/S /TD +>> +endobj +3976 0 obj +<< +/A 4667 0 R +/K 2146 0 R +/P 2997 0 R +/S /TD +>> +endobj +3977 0 obj +<< +/A 4667 0 R +/K 2147 0 R +/P 2997 0 R +/S /TD +>> +endobj +3978 0 obj +<< +/A 4667 0 R +/K 2148 0 R +/P 2997 0 R +/S /TD +>> +endobj +3979 0 obj +<< +/A 4667 0 R +/K 2149 0 R +/P 2998 0 R +/S /TD +>> +endobj +3980 0 obj +<< +/A 4667 0 R +/K 2150 0 R +/P 2998 0 R +/S /TD +>> +endobj +3981 0 obj +<< +/A 4667 0 R +/K 2151 0 R +/P 2998 0 R +/S /TD +>> +endobj +3982 0 obj +<< +/A 4667 0 R +/K 2152 0 R +/P 2998 0 R +/S /TD +>> +endobj +3983 0 obj +<< +/A 4667 0 R +/K 2153 0 R +/P 2998 0 R +/S /TD +>> +endobj +3984 0 obj +<< +/A 4667 0 R +/K 2154 0 R +/P 2998 0 R +/S /TD +>> +endobj +3985 0 obj +<< +/A 4667 0 R +/K 2155 0 R +/P 2999 0 R +/S /TD +>> +endobj +3986 0 obj +<< +/A 4667 0 R +/K 2156 0 R +/P 2999 0 R +/S /TD +>> +endobj +3987 0 obj +<< +/A 4667 0 R +/K 2157 0 R +/P 2999 0 R +/S /TD +>> +endobj +3988 0 obj +<< +/A 4667 0 R +/K 2158 0 R +/P 2999 0 R +/S /TD +>> +endobj +3989 0 obj +<< +/A 4667 0 R +/K 2159 0 R +/P 2999 0 R +/S /TD +>> +endobj +3990 0 obj +<< +/A 4667 0 R +/K 2160 0 R +/P 2999 0 R +/S /TD +>> +endobj +3991 0 obj +<< +/A 4667 0 R +/K 2161 0 R +/P 2999 0 R +/S /TD +>> +endobj +3992 0 obj +<< +/A 4667 0 R +/K 2162 0 R +/P 3000 0 R +/S /TD +>> +endobj +3993 0 obj +<< +/A 4667 0 R +/K 2163 0 R +/P 3000 0 R +/S /TD +>> +endobj +3994 0 obj +<< +/A 4667 0 R +/K 2164 0 R +/P 3000 0 R +/S /TD +>> +endobj +3995 0 obj +<< +/A 4667 0 R +/K 2165 0 R +/P 3000 0 R +/S /TD +>> +endobj +3996 0 obj +<< +/A 4667 0 R +/K 2166 0 R +/P 3000 0 R +/S /TD +>> +endobj +3997 0 obj +<< +/A 4667 0 R +/K 2167 0 R +/P 3000 0 R +/S /TD +>> +endobj +3998 0 obj +<< +/A 4667 0 R +/K 2168 0 R +/P 3000 0 R +/S /TD +>> +endobj +3999 0 obj +<< +/A 4667 0 R +/K 2169 0 R +/P 3001 0 R +/S /TD +>> +endobj +4000 0 obj +<< +/A 4667 0 R +/K 2170 0 R +/P 3001 0 R +/S /TD +>> +endobj +4001 0 obj +<< +/A 4667 0 R +/K 2171 0 R +/P 3001 0 R +/S /TD +>> +endobj +4002 0 obj +<< +/A 4667 0 R +/K 2172 0 R +/P 3001 0 R +/S /TD +>> +endobj +4003 0 obj +<< +/A 4667 0 R +/K 2173 0 R +/P 3001 0 R +/S /TD +>> +endobj +4004 0 obj +<< +/A 4667 0 R +/K 2174 0 R +/P 3001 0 R +/S /TD +>> +endobj +4005 0 obj +<< +/A 4667 0 R +/K 2175 0 R +/P 3001 0 R +/S /TD +>> +endobj +4006 0 obj +<< +/A 4667 0 R +/K 2176 0 R +/P 3002 0 R +/S /TD +>> +endobj +4007 0 obj +<< +/A 4667 0 R +/K 2177 0 R +/P 3002 0 R +/S /TD +>> +endobj +4008 0 obj +<< +/A 4667 0 R +/K 2178 0 R +/P 3002 0 R +/S /TD +>> +endobj +4009 0 obj +<< +/A 4667 0 R +/K 2179 0 R +/P 3002 0 R +/S /TD +>> +endobj +4010 0 obj +<< +/A 4667 0 R +/K 2180 0 R +/P 3002 0 R +/S /TD +>> +endobj +4011 0 obj +<< +/A 4667 0 R +/K 2181 0 R +/P 3002 0 R +/S /TD +>> +endobj +4012 0 obj +<< +/A 4667 0 R +/K 2182 0 R +/P 3003 0 R +/S /TD +>> +endobj +4013 0 obj +<< +/A 4667 0 R +/K 2183 0 R +/P 3003 0 R +/S /TD +>> +endobj +4014 0 obj +<< +/A 4667 0 R +/K 2184 0 R +/P 3003 0 R +/S /TD +>> +endobj +4015 0 obj +<< +/A 4667 0 R +/K 2185 0 R +/P 3003 0 R +/S /TD +>> +endobj +4016 0 obj +<< +/A 4667 0 R +/K 2186 0 R +/P 3003 0 R +/S /TD +>> +endobj +4017 0 obj +<< +/A 4667 0 R +/K 2187 0 R +/P 3003 0 R +/S /TD +>> +endobj +4018 0 obj +<< +/A 4667 0 R +/K 2188 0 R +/P 3004 0 R +/S /TD +>> +endobj +4019 0 obj +<< +/A 4667 0 R +/K 2189 0 R +/P 3004 0 R +/S /TD +>> +endobj +4020 0 obj +<< +/A 4667 0 R +/K 2190 0 R +/P 3004 0 R +/S /TD +>> +endobj +4021 0 obj +<< +/A 4667 0 R +/K 2191 0 R +/P 3004 0 R +/S /TD +>> +endobj +4022 0 obj +<< +/A 4667 0 R +/K 2192 0 R +/P 3004 0 R +/S /TD +>> +endobj +4023 0 obj +<< +/A 4667 0 R +/K 2193 0 R +/P 3004 0 R +/S /TD +>> +endobj +4024 0 obj +<< +/A 4667 0 R +/K 2194 0 R +/P 3005 0 R +/S /TD +>> +endobj +4025 0 obj +<< +/A 4667 0 R +/K 2195 0 R +/P 3005 0 R +/S /TD +>> +endobj +4026 0 obj +<< +/A 4667 0 R +/K 2196 0 R +/P 3005 0 R +/S /TD +>> +endobj +4027 0 obj +<< +/A 4667 0 R +/K 2197 0 R +/P 3005 0 R +/S /TD +>> +endobj +4028 0 obj +<< +/A 4667 0 R +/K 2198 0 R +/P 3005 0 R +/S /TD +>> +endobj +4029 0 obj +<< +/A 4667 0 R +/K 2199 0 R +/P 3005 0 R +/S /TD +>> +endobj +4030 0 obj +<< +/A 4667 0 R +/K 2200 0 R +/P 3006 0 R +/S /TD +>> +endobj +4031 0 obj +<< +/A 4667 0 R +/K 2201 0 R +/P 3006 0 R +/S /TD +>> +endobj +4032 0 obj +<< +/A 4667 0 R +/K 2202 0 R +/P 3006 0 R +/S /TD +>> +endobj +4033 0 obj +<< +/A 4667 0 R +/K 2203 0 R +/P 3006 0 R +/S /TD +>> +endobj +4034 0 obj +<< +/A 4667 0 R +/K 2204 0 R +/P 3006 0 R +/S /TD +>> +endobj +4035 0 obj +<< +/A 4667 0 R +/K 2205 0 R +/P 3006 0 R +/S /TD +>> +endobj +4036 0 obj +<< +/A 4667 0 R +/K 2206 0 R +/P 3007 0 R +/S /TD +>> +endobj +4037 0 obj +<< +/A 4667 0 R +/K 2207 0 R +/P 3007 0 R +/S /TD +>> +endobj +4038 0 obj +<< +/A 4667 0 R +/K 2208 0 R +/P 3007 0 R +/S /TD +>> +endobj +4039 0 obj +<< +/A 4667 0 R +/K 2209 0 R +/P 3007 0 R +/S /TD +>> +endobj +4040 0 obj +<< +/A 4667 0 R +/K 2210 0 R +/P 3007 0 R +/S /TD +>> +endobj +4041 0 obj +<< +/A 4667 0 R +/K 2211 0 R +/P 3007 0 R +/S /TD +>> +endobj +4042 0 obj +<< +/A 4667 0 R +/K 2212 0 R +/P 3008 0 R +/S /TD +>> +endobj +4043 0 obj +<< +/A 4667 0 R +/K 2213 0 R +/P 3008 0 R +/S /TD +>> +endobj +4044 0 obj +<< +/A 4667 0 R +/K 2214 0 R +/P 3008 0 R +/S /TD +>> +endobj +4045 0 obj +<< +/A 4667 0 R +/K 2215 0 R +/P 3008 0 R +/S /TD +>> +endobj +4046 0 obj +<< +/A 4667 0 R +/K 2216 0 R +/P 3008 0 R +/S /TD +>> +endobj +4047 0 obj +<< +/A 4667 0 R +/K 2217 0 R +/P 3008 0 R +/S /TD +>> +endobj +4048 0 obj +<< +/A 4667 0 R +/K 2218 0 R +/P 3009 0 R +/S /TD +>> +endobj +4049 0 obj +<< +/A 4667 0 R +/K 2219 0 R +/P 3009 0 R +/S /TD +>> +endobj +4050 0 obj +<< +/A 4667 0 R +/K 2220 0 R +/P 3009 0 R +/S /TD +>> +endobj +4051 0 obj +<< +/A 4667 0 R +/K 2221 0 R +/P 3009 0 R +/S /TD +>> +endobj +4052 0 obj +<< +/A 4667 0 R +/K 2222 0 R +/P 3009 0 R +/S /TD +>> +endobj +4053 0 obj +<< +/A 4667 0 R +/K 2223 0 R +/P 3009 0 R +/S /TD +>> +endobj +4054 0 obj +<< +/A 4667 0 R +/K 2224 0 R +/P 3010 0 R +/S /TD +>> +endobj +4055 0 obj +<< +/A 4667 0 R +/K 2225 0 R +/P 3010 0 R +/S /TD +>> +endobj +4056 0 obj +<< +/A 4667 0 R +/K 2226 0 R +/P 3010 0 R +/S /TD +>> +endobj +4057 0 obj +<< +/A 4667 0 R +/K 2227 0 R +/P 3010 0 R +/S /TD +>> +endobj +4058 0 obj +<< +/A 4667 0 R +/K 2228 0 R +/P 3010 0 R +/S /TD +>> +endobj +4059 0 obj +<< +/A 4667 0 R +/K 2229 0 R +/P 3010 0 R +/S /TD +>> +endobj +4060 0 obj +<< +/A 4667 0 R +/K 2230 0 R +/P 3011 0 R +/S /TD +>> +endobj +4061 0 obj +<< +/A 4667 0 R +/K 2231 0 R +/P 3011 0 R +/S /TD +>> +endobj +4062 0 obj +<< +/A 4667 0 R +/K 2232 0 R +/P 3011 0 R +/S /TD +>> +endobj +4063 0 obj +<< +/A 4667 0 R +/K 2233 0 R +/P 3011 0 R +/S /TD +>> +endobj +4064 0 obj +<< +/A 4667 0 R +/K 2234 0 R +/P 3011 0 R +/S /TD +>> +endobj +4065 0 obj +<< +/A 4667 0 R +/K 2235 0 R +/P 3011 0 R +/S /TD +>> +endobj +4066 0 obj +<< +/A 4667 0 R +/K 2236 0 R +/P 3011 0 R +/S /TD +>> +endobj +4067 0 obj +<< +/A 4667 0 R +/K 2237 0 R +/P 3012 0 R +/S /TD +>> +endobj +4068 0 obj +<< +/A 4667 0 R +/K 2238 0 R +/P 3012 0 R +/S /TD +>> +endobj +4069 0 obj +<< +/A 4667 0 R +/K 2239 0 R +/P 3012 0 R +/S /TD +>> +endobj +4070 0 obj +<< +/A 4667 0 R +/K 2240 0 R +/P 3012 0 R +/S /TD +>> +endobj +4071 0 obj +<< +/A 4667 0 R +/K 2241 0 R +/P 3012 0 R +/S /TD +>> +endobj +4072 0 obj +<< +/A 4667 0 R +/K 2242 0 R +/P 3012 0 R +/S /TD +>> +endobj +4073 0 obj +<< +/A 4667 0 R +/K 2243 0 R +/P 3012 0 R +/S /TD +>> +endobj +4074 0 obj +<< +/A 4667 0 R +/K 2244 0 R +/P 3013 0 R +/S /TD +>> +endobj +4075 0 obj +<< +/A 4667 0 R +/K 2245 0 R +/P 3013 0 R +/S /TD +>> +endobj +4076 0 obj +<< +/A 4667 0 R +/K 2246 0 R +/P 3013 0 R +/S /TD +>> +endobj +4077 0 obj +<< +/A 4667 0 R +/K 2247 0 R +/P 3013 0 R +/S /TD +>> +endobj +4078 0 obj +<< +/A 4667 0 R +/K 2248 0 R +/P 3013 0 R +/S /TD +>> +endobj +4079 0 obj +<< +/A 4667 0 R +/K 2249 0 R +/P 3013 0 R +/S /TD +>> +endobj +4080 0 obj +<< +/A 4667 0 R +/K 2250 0 R +/P 3013 0 R +/S /TD +>> +endobj +4081 0 obj +<< +/A 4667 0 R +/K 2251 0 R +/P 3014 0 R +/S /TD +>> +endobj +4082 0 obj +<< +/A 4667 0 R +/K 2252 0 R +/P 3014 0 R +/S /TD +>> +endobj +4083 0 obj +<< +/A 4667 0 R +/K 2253 0 R +/P 3014 0 R +/S /TD +>> +endobj +4084 0 obj +<< +/A 4667 0 R +/K 2254 0 R +/P 3014 0 R +/S /TD +>> +endobj +4085 0 obj +<< +/A 4667 0 R +/K 2255 0 R +/P 3014 0 R +/S /TD +>> +endobj +4086 0 obj +<< +/A 4667 0 R +/K 2256 0 R +/P 3014 0 R +/S /TD +>> +endobj +4087 0 obj +<< +/A 4667 0 R +/K 2257 0 R +/P 3015 0 R +/S /TD +>> +endobj +4088 0 obj +<< +/A 4667 0 R +/K 2258 0 R +/P 3015 0 R +/S /TD +>> +endobj +4089 0 obj +<< +/A 4667 0 R +/K 2259 0 R +/P 3015 0 R +/S /TD +>> +endobj +4090 0 obj +<< +/A 4667 0 R +/K 2260 0 R +/P 3015 0 R +/S /TD +>> +endobj +4091 0 obj +<< +/A 4667 0 R +/K 2261 0 R +/P 3015 0 R +/S /TD +>> +endobj +4092 0 obj +<< +/A 4667 0 R +/K 2262 0 R +/P 3015 0 R +/S /TD +>> +endobj +4093 0 obj +<< +/A 4667 0 R +/K 2263 0 R +/P 3016 0 R +/S /TD +>> +endobj +4094 0 obj +<< +/A 4667 0 R +/K 2264 0 R +/P 3016 0 R +/S /TD +>> +endobj +4095 0 obj +<< +/A 4667 0 R +/K 2265 0 R +/P 3016 0 R +/S /TD +>> +endobj +4096 0 obj +<< +/A 4667 0 R +/K 2266 0 R +/P 3016 0 R +/S /TD +>> +endobj +4097 0 obj +<< +/A 4667 0 R +/K 2267 0 R +/P 3016 0 R +/S /TD +>> +endobj +4098 0 obj +<< +/A 4667 0 R +/K 2268 0 R +/P 3016 0 R +/S /TD +>> +endobj +4099 0 obj +<< +/A 4667 0 R +/K 2269 0 R +/P 3017 0 R +/S /TD +>> +endobj +4100 0 obj +<< +/A 4667 0 R +/K 2270 0 R +/P 3017 0 R +/S /TD +>> +endobj +4101 0 obj +<< +/A 4667 0 R +/K 2271 0 R +/P 3017 0 R +/S /TD +>> +endobj +4102 0 obj +<< +/A 4667 0 R +/K 2272 0 R +/P 3017 0 R +/S /TD +>> +endobj +4103 0 obj +<< +/A 4667 0 R +/K 2273 0 R +/P 3017 0 R +/S /TD +>> +endobj +4104 0 obj +<< +/A 4667 0 R +/K 2274 0 R +/P 3017 0 R +/S /TD +>> +endobj +4105 0 obj +<< +/A 4667 0 R +/K 2275 0 R +/P 3018 0 R +/S /TD +>> +endobj +4106 0 obj +<< +/A 4667 0 R +/K 2276 0 R +/P 3018 0 R +/S /TD +>> +endobj +4107 0 obj +<< +/A 4667 0 R +/K 2277 0 R +/P 3018 0 R +/S /TD +>> +endobj +4108 0 obj +<< +/A 4667 0 R +/K 2278 0 R +/P 3018 0 R +/S /TD +>> +endobj +4109 0 obj +<< +/A 4667 0 R +/K 2279 0 R +/P 3018 0 R +/S /TD +>> +endobj +4110 0 obj +<< +/A 4667 0 R +/K 2280 0 R +/P 3018 0 R +/S /TD +>> +endobj +4111 0 obj +<< +/A 4667 0 R +/K 2281 0 R +/P 3019 0 R +/S /TD +>> +endobj +4112 0 obj +<< +/A 4667 0 R +/K 2282 0 R +/P 3019 0 R +/S /TD +>> +endobj +4113 0 obj +<< +/A 4667 0 R +/K 2283 0 R +/P 3019 0 R +/S /TD +>> +endobj +4114 0 obj +<< +/A 4667 0 R +/K 2284 0 R +/P 3019 0 R +/S /TD +>> +endobj +4115 0 obj +<< +/A 4667 0 R +/K 2285 0 R +/P 3019 0 R +/S /TD +>> +endobj +4116 0 obj +<< +/A 4667 0 R +/K 2286 0 R +/P 3019 0 R +/S /TD +>> +endobj +4117 0 obj +<< +/A 4667 0 R +/K 2287 0 R +/P 3020 0 R +/S /TD +>> +endobj +4118 0 obj +<< +/A 4667 0 R +/K 2288 0 R +/P 3020 0 R +/S /TD +>> +endobj +4119 0 obj +<< +/A 4667 0 R +/K 2289 0 R +/P 3020 0 R +/S /TD +>> +endobj +4120 0 obj +<< +/A 4667 0 R +/K 2290 0 R +/P 3020 0 R +/S /TD +>> +endobj +4121 0 obj +<< +/A 4667 0 R +/K 2291 0 R +/P 3020 0 R +/S /TD +>> +endobj +4122 0 obj +<< +/A 4667 0 R +/K 2292 0 R +/P 3020 0 R +/S /TD +>> +endobj +4123 0 obj +<< +/A 4667 0 R +/K 2293 0 R +/P 3021 0 R +/S /TD +>> +endobj +4124 0 obj +<< +/A 4667 0 R +/K 2294 0 R +/P 3021 0 R +/S /TD +>> +endobj +4125 0 obj +<< +/A 4667 0 R +/K 2295 0 R +/P 3021 0 R +/S /TD +>> +endobj +4126 0 obj +<< +/A 4667 0 R +/K 2296 0 R +/P 3021 0 R +/S /TD +>> +endobj +4127 0 obj +<< +/A 4667 0 R +/K 2297 0 R +/P 3021 0 R +/S /TD +>> +endobj +4128 0 obj +<< +/A 4667 0 R +/K 2298 0 R +/P 3021 0 R +/S /TD +>> +endobj +4129 0 obj +<< +/A 4667 0 R +/K 2299 0 R +/P 3022 0 R +/S /TD +>> +endobj +4130 0 obj +<< +/A 4667 0 R +/K 2300 0 R +/P 3022 0 R +/S /TD +>> +endobj +4131 0 obj +<< +/A 4667 0 R +/K 2301 0 R +/P 3022 0 R +/S /TD +>> +endobj +4132 0 obj +<< +/A 4667 0 R +/K 2302 0 R +/P 3022 0 R +/S /TD +>> +endobj +4133 0 obj +<< +/A 4667 0 R +/K 2303 0 R +/P 3022 0 R +/S /TD +>> +endobj +4134 0 obj +<< +/A 4667 0 R +/K 2304 0 R +/P 3022 0 R +/S /TD +>> +endobj +4135 0 obj +<< +/A 4667 0 R +/K 2305 0 R +/P 3023 0 R +/S /TD +>> +endobj +4136 0 obj +<< +/A 4667 0 R +/K 2306 0 R +/P 3023 0 R +/S /TD +>> +endobj +4137 0 obj +<< +/A 4667 0 R +/K 2307 0 R +/P 3023 0 R +/S /TD +>> +endobj +4138 0 obj +<< +/A 4667 0 R +/K 2308 0 R +/P 3023 0 R +/S /TD +>> +endobj +4139 0 obj +<< +/A 4667 0 R +/K 2309 0 R +/P 3023 0 R +/S /TD +>> +endobj +4140 0 obj +<< +/A 4667 0 R +/K 2310 0 R +/P 3023 0 R +/S /TD +>> +endobj +4141 0 obj +<< +/A 4667 0 R +/K 2311 0 R +/P 3023 0 R +/S /TD +>> +endobj +4142 0 obj +<< +/A 4667 0 R +/K 2312 0 R +/P 3023 0 R +/S /TD +>> +endobj +4143 0 obj +<< +/A 4667 0 R +/K 2313 0 R +/P 3024 0 R +/S /TD +>> +endobj +4144 0 obj +<< +/A 4667 0 R +/K 2314 0 R +/P 3024 0 R +/S /TD +>> +endobj +4145 0 obj +<< +/A 4667 0 R +/K 2315 0 R +/P 3024 0 R +/S /TD +>> +endobj +4146 0 obj +<< +/A 4667 0 R +/K 2316 0 R +/P 3024 0 R +/S /TD +>> +endobj +4147 0 obj +<< +/A 4667 0 R +/K 2317 0 R +/P 3024 0 R +/S /TD +>> +endobj +4148 0 obj +<< +/A 4667 0 R +/K 2318 0 R +/P 3024 0 R +/S /TD +>> +endobj +4149 0 obj +<< +/A 4667 0 R +/K 2319 0 R +/P 3024 0 R +/S /TD +>> +endobj +4150 0 obj +<< +/A 4667 0 R +/K 2320 0 R +/P 3024 0 R +/S /TD +>> +endobj +4151 0 obj +<< +/A 4667 0 R +/K 2321 0 R +/P 3025 0 R +/S /TD +>> +endobj +4152 0 obj +<< +/A 4667 0 R +/K 2322 0 R +/P 3025 0 R +/S /TD +>> +endobj +4153 0 obj +<< +/A 4667 0 R +/K 2323 0 R +/P 3025 0 R +/S /TD +>> +endobj +4154 0 obj +<< +/A 4667 0 R +/K 2324 0 R +/P 3025 0 R +/S /TD +>> +endobj +4155 0 obj +<< +/A 4667 0 R +/K 2325 0 R +/P 3025 0 R +/S /TD +>> +endobj +4156 0 obj +<< +/A 4667 0 R +/K 2326 0 R +/P 3025 0 R +/S /TD +>> +endobj +4157 0 obj +<< +/A 4667 0 R +/K 2327 0 R +/P 3025 0 R +/S /TD +>> +endobj +4158 0 obj +<< +/A 4667 0 R +/K 2328 0 R +/P 3025 0 R +/S /TD +>> +endobj +4159 0 obj +<< +/A 4667 0 R +/K 2329 0 R +/P 3026 0 R +/S /TD +>> +endobj +4160 0 obj +<< +/A 4667 0 R +/K 2330 0 R +/P 3026 0 R +/S /TD +>> +endobj +4161 0 obj +<< +/A 4667 0 R +/K 2331 0 R +/P 3026 0 R +/S /TD +>> +endobj +4162 0 obj +<< +/A 4667 0 R +/K 2332 0 R +/P 3026 0 R +/S /TD +>> +endobj +4163 0 obj +<< +/A 4667 0 R +/K 2333 0 R +/P 3026 0 R +/S /TD +>> +endobj +4164 0 obj +<< +/A 4667 0 R +/K 2334 0 R +/P 3026 0 R +/S /TD +>> +endobj +4165 0 obj +<< +/A 4667 0 R +/K 2335 0 R +/P 3027 0 R +/S /TD +>> +endobj +4166 0 obj +<< +/A 4667 0 R +/K 2336 0 R +/P 3027 0 R +/S /TD +>> +endobj +4167 0 obj +<< +/A 4667 0 R +/K 2337 0 R +/P 3027 0 R +/S /TD +>> +endobj +4168 0 obj +<< +/A 4667 0 R +/K 2338 0 R +/P 3027 0 R +/S /TD +>> +endobj +4169 0 obj +<< +/A 4667 0 R +/K 2339 0 R +/P 3027 0 R +/S /TD +>> +endobj +4170 0 obj +<< +/A 4667 0 R +/K 2340 0 R +/P 3027 0 R +/S /TD +>> +endobj +4171 0 obj +<< +/A 4667 0 R +/K 2341 0 R +/P 3028 0 R +/S /TD +>> +endobj +4172 0 obj +<< +/A 4667 0 R +/K 2342 0 R +/P 3028 0 R +/S /TD +>> +endobj +4173 0 obj +<< +/A 4667 0 R +/K 2343 0 R +/P 3028 0 R +/S /TD +>> +endobj +4174 0 obj +<< +/A 4667 0 R +/K 2344 0 R +/P 3028 0 R +/S /TD +>> +endobj +4175 0 obj +<< +/A 4667 0 R +/K 2345 0 R +/P 3028 0 R +/S /TD +>> +endobj +4176 0 obj +<< +/A 4667 0 R +/K 2346 0 R +/P 3028 0 R +/S /TD +>> +endobj +4177 0 obj +<< +/A 4667 0 R +/K 2347 0 R +/P 3029 0 R +/S /TD +>> +endobj +4178 0 obj +<< +/A 4667 0 R +/K 2348 0 R +/P 3029 0 R +/S /TD +>> +endobj +4179 0 obj +<< +/A 4667 0 R +/K 2349 0 R +/P 3029 0 R +/S /TD +>> +endobj +4180 0 obj +<< +/A 4667 0 R +/K 2350 0 R +/P 3029 0 R +/S /TD +>> +endobj +4181 0 obj +<< +/A 4667 0 R +/K 2351 0 R +/P 3029 0 R +/S /TD +>> +endobj +4182 0 obj +<< +/A 4667 0 R +/K 2352 0 R +/P 3029 0 R +/S /TD +>> +endobj +4183 0 obj +<< +/A 4667 0 R +/K 2353 0 R +/P 3029 0 R +/S /TD +>> +endobj +4184 0 obj +<< +/A 4667 0 R +/K 2354 0 R +/P 3029 0 R +/S /TD +>> +endobj +4185 0 obj +<< +/A 4667 0 R +/K 2355 0 R +/P 3030 0 R +/S /TD +>> +endobj +4186 0 obj +<< +/A 4667 0 R +/K 2356 0 R +/P 3030 0 R +/S /TD +>> +endobj +4187 0 obj +<< +/A 4667 0 R +/K 2357 0 R +/P 3030 0 R +/S /TD +>> +endobj +4188 0 obj +<< +/A 4667 0 R +/K 2358 0 R +/P 3030 0 R +/S /TD +>> +endobj +4189 0 obj +<< +/A 4667 0 R +/K 2359 0 R +/P 3030 0 R +/S /TD +>> +endobj +4190 0 obj +<< +/A 4667 0 R +/K 2360 0 R +/P 3030 0 R +/S /TD +>> +endobj +4191 0 obj +<< +/A 4667 0 R +/K 2361 0 R +/P 3030 0 R +/S /TD +>> +endobj +4192 0 obj +<< +/A 4667 0 R +/K 2362 0 R +/P 3030 0 R +/S /TD +>> +endobj +4193 0 obj +<< +/A 4667 0 R +/K 2363 0 R +/P 3031 0 R +/S /TD +>> +endobj +4194 0 obj +<< +/A 4667 0 R +/K 2364 0 R +/P 3031 0 R +/S /TD +>> +endobj +4195 0 obj +<< +/A 4667 0 R +/K 2365 0 R +/P 3031 0 R +/S /TD +>> +endobj +4196 0 obj +<< +/A 4667 0 R +/K 2366 0 R +/P 3031 0 R +/S /TD +>> +endobj +4197 0 obj +<< +/A 4667 0 R +/K 2367 0 R +/P 3031 0 R +/S /TD +>> +endobj +4198 0 obj +<< +/A 4667 0 R +/K 2368 0 R +/P 3031 0 R +/S /TD +>> +endobj +4199 0 obj +<< +/A 4667 0 R +/K 2369 0 R +/P 3031 0 R +/S /TD +>> +endobj +4200 0 obj +<< +/A 4667 0 R +/K 2370 0 R +/P 3031 0 R +/S /TD +>> +endobj +4201 0 obj +<< +/A 4667 0 R +/K 2371 0 R +/P 3032 0 R +/S /TD +>> +endobj +4202 0 obj +<< +/A 4667 0 R +/K 2372 0 R +/P 3032 0 R +/S /TD +>> +endobj +4203 0 obj +<< +/A 4667 0 R +/K 2373 0 R +/P 3032 0 R +/S /TD +>> +endobj +4204 0 obj +<< +/A 4667 0 R +/K 2374 0 R +/P 3032 0 R +/S /TD +>> +endobj +4205 0 obj +<< +/A 4667 0 R +/K 2375 0 R +/P 3032 0 R +/S /TD +>> +endobj +4206 0 obj +<< +/A 4667 0 R +/K 2376 0 R +/P 3032 0 R +/S /TD +>> +endobj +4207 0 obj +<< +/A 4667 0 R +/K 2377 0 R +/P 3033 0 R +/S /TD +>> +endobj +4208 0 obj +<< +/A 4667 0 R +/K 2378 0 R +/P 3033 0 R +/S /TD +>> +endobj +4209 0 obj +<< +/A 4667 0 R +/K 2379 0 R +/P 3033 0 R +/S /TD +>> +endobj +4210 0 obj +<< +/A 4667 0 R +/K 2380 0 R +/P 3033 0 R +/S /TD +>> +endobj +4211 0 obj +<< +/A 4667 0 R +/K 2381 0 R +/P 3033 0 R +/S /TD +>> +endobj +4212 0 obj +<< +/A 4667 0 R +/K 2382 0 R +/P 3033 0 R +/S /TD +>> +endobj +4213 0 obj +<< +/A 4667 0 R +/K 2383 0 R +/P 3034 0 R +/S /TD +>> +endobj +4214 0 obj +<< +/A 4667 0 R +/K 2384 0 R +/P 3034 0 R +/S /TD +>> +endobj +4215 0 obj +<< +/A 4667 0 R +/K 2385 0 R +/P 3034 0 R +/S /TD +>> +endobj +4216 0 obj +<< +/A 4667 0 R +/K 2386 0 R +/P 3034 0 R +/S /TD +>> +endobj +4217 0 obj +<< +/A 4667 0 R +/K 2387 0 R +/P 3034 0 R +/S /TD +>> +endobj +4218 0 obj +<< +/A 4667 0 R +/K 2388 0 R +/P 3034 0 R +/S /TD +>> +endobj +4219 0 obj +<< +/A 4667 0 R +/K 2389 0 R +/P 3035 0 R +/S /TD +>> +endobj +4220 0 obj +<< +/A 4667 0 R +/K 2390 0 R +/P 3035 0 R +/S /TD +>> +endobj +4221 0 obj +<< +/A 4667 0 R +/K 2391 0 R +/P 3035 0 R +/S /TD +>> +endobj +4222 0 obj +<< +/A 4667 0 R +/K 2392 0 R +/P 3035 0 R +/S /TD +>> +endobj +4223 0 obj +<< +/A 4667 0 R +/K 2393 0 R +/P 3035 0 R +/S /TD +>> +endobj +4224 0 obj +<< +/A 4667 0 R +/K 2394 0 R +/P 3035 0 R +/S /TD +>> +endobj +4225 0 obj +<< +/A 4667 0 R +/K 2395 0 R +/P 3035 0 R +/S /TD +>> +endobj +4226 0 obj +<< +/A 4667 0 R +/K 2396 0 R +/P 3035 0 R +/S /TD +>> +endobj +4227 0 obj +<< +/A 4667 0 R +/K 2397 0 R +/P 3036 0 R +/S /TD +>> +endobj +4228 0 obj +<< +/A 4667 0 R +/K 2398 0 R +/P 3036 0 R +/S /TD +>> +endobj +4229 0 obj +<< +/A 4667 0 R +/K 2399 0 R +/P 3036 0 R +/S /TD +>> +endobj +4230 0 obj +<< +/A 4667 0 R +/K 2400 0 R +/P 3036 0 R +/S /TD +>> +endobj +4231 0 obj +<< +/A 4667 0 R +/K 2401 0 R +/P 3036 0 R +/S /TD +>> +endobj +4232 0 obj +<< +/A 4667 0 R +/K 2402 0 R +/P 3036 0 R +/S /TD +>> +endobj +4233 0 obj +<< +/A 4667 0 R +/K 2403 0 R +/P 3036 0 R +/S /TD +>> +endobj +4234 0 obj +<< +/A 4667 0 R +/K 2404 0 R +/P 3036 0 R +/S /TD +>> +endobj +4235 0 obj +<< +/A 4667 0 R +/K 2405 0 R +/P 3037 0 R +/S /TD +>> +endobj +4236 0 obj +<< +/A 4667 0 R +/K 2406 0 R +/P 3037 0 R +/S /TD +>> +endobj +4237 0 obj +<< +/A 4667 0 R +/K 2407 0 R +/P 3037 0 R +/S /TD +>> +endobj +4238 0 obj +<< +/A 4667 0 R +/K 2408 0 R +/P 3037 0 R +/S /TD +>> +endobj +4239 0 obj +<< +/A 4667 0 R +/K 2409 0 R +/P 3037 0 R +/S /TD +>> +endobj +4240 0 obj +<< +/A 4667 0 R +/K 2410 0 R +/P 3037 0 R +/S /TD +>> +endobj +4241 0 obj +<< +/A 4667 0 R +/K 2411 0 R +/P 3037 0 R +/S /TD +>> +endobj +4242 0 obj +<< +/A 4667 0 R +/K 2412 0 R +/P 3037 0 R +/S /TD +>> +endobj +4243 0 obj +<< +/A 4667 0 R +/K 2413 0 R +/P 3038 0 R +/S /TD +>> +endobj +4244 0 obj +<< +/A 4667 0 R +/K 2414 0 R +/P 3038 0 R +/S /TD +>> +endobj +4245 0 obj +<< +/A 4667 0 R +/K 2415 0 R +/P 3038 0 R +/S /TD +>> +endobj +4246 0 obj +<< +/A 4667 0 R +/K 2416 0 R +/P 3038 0 R +/S /TD +>> +endobj +4247 0 obj +<< +/A 4667 0 R +/K 2417 0 R +/P 3038 0 R +/S /TD +>> +endobj +4248 0 obj +<< +/A 4667 0 R +/K 2418 0 R +/P 3038 0 R +/S /TD +>> +endobj +4249 0 obj +<< +/A 4667 0 R +/K 2419 0 R +/P 3039 0 R +/S /TD +>> +endobj +4250 0 obj +<< +/A 4667 0 R +/K 2420 0 R +/P 3039 0 R +/S /TD +>> +endobj +4251 0 obj +<< +/A 4667 0 R +/K 2421 0 R +/P 3039 0 R +/S /TD +>> +endobj +4252 0 obj +<< +/A 4667 0 R +/K 2422 0 R +/P 3039 0 R +/S /TD +>> +endobj +4253 0 obj +<< +/A 4667 0 R +/K 2423 0 R +/P 3039 0 R +/S /TD +>> +endobj +4254 0 obj +<< +/A 4667 0 R +/K 2424 0 R +/P 3039 0 R +/S /TD +>> +endobj +4255 0 obj +<< +/A 4667 0 R +/K 2425 0 R +/P 3040 0 R +/S /TD +>> +endobj +4256 0 obj +<< +/A 4667 0 R +/K 2426 0 R +/P 3040 0 R +/S /TD +>> +endobj +4257 0 obj +<< +/A 4667 0 R +/K 2427 0 R +/P 3040 0 R +/S /TD +>> +endobj +4258 0 obj +<< +/A 4667 0 R +/K 2428 0 R +/P 3040 0 R +/S /TD +>> +endobj +4259 0 obj +<< +/A 4667 0 R +/K 2429 0 R +/P 3040 0 R +/S /TD +>> +endobj +4260 0 obj +<< +/A 4667 0 R +/K 2430 0 R +/P 3040 0 R +/S /TD +>> +endobj +4261 0 obj +<< +/A 4667 0 R +/K 2431 0 R +/P 3041 0 R +/S /TD +>> +endobj +4262 0 obj +<< +/A 4667 0 R +/K 2432 0 R +/P 3041 0 R +/S /TD +>> +endobj +4263 0 obj +<< +/A 4667 0 R +/K 2433 0 R +/P 3041 0 R +/S /TD +>> +endobj +4264 0 obj +<< +/A 4667 0 R +/K 2434 0 R +/P 3041 0 R +/S /TD +>> +endobj +4265 0 obj +<< +/A 4667 0 R +/K 2435 0 R +/P 3041 0 R +/S /TD +>> +endobj +4266 0 obj +<< +/A 4667 0 R +/K 2436 0 R +/P 3041 0 R +/S /TD +>> +endobj +4267 0 obj +<< +/A 4667 0 R +/K 2437 0 R +/P 3042 0 R +/S /TD +>> +endobj +4268 0 obj +<< +/A 4667 0 R +/K 2438 0 R +/P 3042 0 R +/S /TD +>> +endobj +4269 0 obj +<< +/A 4667 0 R +/K 2439 0 R +/P 3042 0 R +/S /TD +>> +endobj +4270 0 obj +<< +/A 4667 0 R +/K 2440 0 R +/P 3042 0 R +/S /TD +>> +endobj +4271 0 obj +<< +/A 4667 0 R +/K 2441 0 R +/P 3042 0 R +/S /TD +>> +endobj +4272 0 obj +<< +/A 4667 0 R +/K 2442 0 R +/P 3042 0 R +/S /TD +>> +endobj +4273 0 obj +<< +/A 4667 0 R +/K 2443 0 R +/P 3043 0 R +/S /TD +>> +endobj +4274 0 obj +<< +/A 4667 0 R +/K 2444 0 R +/P 3043 0 R +/S /TD +>> +endobj +4275 0 obj +<< +/A 4667 0 R +/K 2445 0 R +/P 3043 0 R +/S /TD +>> +endobj +4276 0 obj +<< +/A 4667 0 R +/K 2446 0 R +/P 3043 0 R +/S /TD +>> +endobj +4277 0 obj +<< +/A 4667 0 R +/K 2447 0 R +/P 3043 0 R +/S /TD +>> +endobj +4278 0 obj +<< +/A 4667 0 R +/K 2448 0 R +/P 3043 0 R +/S /TD +>> +endobj +4279 0 obj +<< +/A 4667 0 R +/K 2449 0 R +/P 3044 0 R +/S /TD +>> +endobj +4280 0 obj +<< +/A 4667 0 R +/K 2450 0 R +/P 3044 0 R +/S /TD +>> +endobj +4281 0 obj +<< +/A 4667 0 R +/K 2451 0 R +/P 3044 0 R +/S /TD +>> +endobj +4282 0 obj +<< +/A 4667 0 R +/K 2452 0 R +/P 3044 0 R +/S /TD +>> +endobj +4283 0 obj +<< +/A 4667 0 R +/K 2453 0 R +/P 3044 0 R +/S /TD +>> +endobj +4284 0 obj +<< +/A 4667 0 R +/K 2454 0 R +/P 3044 0 R +/S /TD +>> +endobj +4285 0 obj +<< +/A 4667 0 R +/K 2455 0 R +/P 3045 0 R +/S /TD +>> +endobj +4286 0 obj +<< +/A 4667 0 R +/K 2456 0 R +/P 3045 0 R +/S /TD +>> +endobj +4287 0 obj +<< +/A 4667 0 R +/K 2457 0 R +/P 3045 0 R +/S /TD +>> +endobj +4288 0 obj +<< +/A 4667 0 R +/K 2458 0 R +/P 3045 0 R +/S /TD +>> +endobj +4289 0 obj +<< +/A 4667 0 R +/K 2459 0 R +/P 3045 0 R +/S /TD +>> +endobj +4290 0 obj +<< +/A 4667 0 R +/K 2460 0 R +/P 3045 0 R +/S /TD +>> +endobj +4291 0 obj +<< +/A 4667 0 R +/K 2461 0 R +/P 3046 0 R +/S /TD +>> +endobj +4292 0 obj +<< +/A 4667 0 R +/K 2462 0 R +/P 3046 0 R +/S /TD +>> +endobj +4293 0 obj +<< +/A 4667 0 R +/K 2463 0 R +/P 3046 0 R +/S /TD +>> +endobj +4294 0 obj +<< +/A 4667 0 R +/K 2464 0 R +/P 3046 0 R +/S /TD +>> +endobj +4295 0 obj +<< +/A 4667 0 R +/K 2465 0 R +/P 3046 0 R +/S /TD +>> +endobj +4296 0 obj +<< +/A 4667 0 R +/K 2466 0 R +/P 3046 0 R +/S /TD +>> +endobj +4297 0 obj +<< +/A 4667 0 R +/K 2467 0 R +/P 3047 0 R +/S /TD +>> +endobj +4298 0 obj +<< +/A 4667 0 R +/K 2468 0 R +/P 3047 0 R +/S /TD +>> +endobj +4299 0 obj +<< +/A 4667 0 R +/K 2469 0 R +/P 3047 0 R +/S /TD +>> +endobj +4300 0 obj +<< +/A 4667 0 R +/K 2470 0 R +/P 3047 0 R +/S /TD +>> +endobj +4301 0 obj +<< +/A 4667 0 R +/K 2471 0 R +/P 3047 0 R +/S /TD +>> +endobj +4302 0 obj +<< +/A 4667 0 R +/K 2472 0 R +/P 3047 0 R +/S /TD +>> +endobj +4303 0 obj +<< +/A 4667 0 R +/K 2473 0 R +/P 3048 0 R +/S /TD +>> +endobj +4304 0 obj +<< +/A 4667 0 R +/K 2474 0 R +/P 3048 0 R +/S /TD +>> +endobj +4305 0 obj +<< +/A 4667 0 R +/K 2475 0 R +/P 3048 0 R +/S /TD +>> +endobj +4306 0 obj +<< +/A 4667 0 R +/K 2476 0 R +/P 3048 0 R +/S /TD +>> +endobj +4307 0 obj +<< +/A 4667 0 R +/K 2477 0 R +/P 3048 0 R +/S /TD +>> +endobj +4308 0 obj +<< +/A 4667 0 R +/K 2478 0 R +/P 3048 0 R +/S /TD +>> +endobj +4309 0 obj +<< +/A 4667 0 R +/K 2479 0 R +/P 3049 0 R +/S /TD +>> +endobj +4310 0 obj +<< +/A 4667 0 R +/K 2480 0 R +/P 3049 0 R +/S /TD +>> +endobj +4311 0 obj +<< +/A 4667 0 R +/K 2481 0 R +/P 3049 0 R +/S /TD +>> +endobj +4312 0 obj +<< +/A 4667 0 R +/K 2482 0 R +/P 3049 0 R +/S /TD +>> +endobj +4313 0 obj +<< +/A 4667 0 R +/K 2483 0 R +/P 3049 0 R +/S /TD +>> +endobj +4314 0 obj +<< +/A 4667 0 R +/K 2484 0 R +/P 3049 0 R +/S /TD +>> +endobj +4315 0 obj +<< +/A 4667 0 R +/K 2485 0 R +/P 3050 0 R +/S /TD +>> +endobj +4316 0 obj +<< +/A 4667 0 R +/K 2486 0 R +/P 3050 0 R +/S /TD +>> +endobj +4317 0 obj +<< +/A 4667 0 R +/K 2487 0 R +/P 3050 0 R +/S /TD +>> +endobj +4318 0 obj +<< +/A 4667 0 R +/K 2488 0 R +/P 3050 0 R +/S /TD +>> +endobj +4319 0 obj +<< +/A 4667 0 R +/K 2489 0 R +/P 3050 0 R +/S /TD +>> +endobj +4320 0 obj +<< +/A 4667 0 R +/K 2490 0 R +/P 3050 0 R +/S /TD +>> +endobj +4321 0 obj +<< +/A 4667 0 R +/K 2491 0 R +/P 3050 0 R +/S /TD +>> +endobj +4322 0 obj +<< +/A 4667 0 R +/K 2492 0 R +/P 3051 0 R +/S /TD +>> +endobj +4323 0 obj +<< +/A 4667 0 R +/K 2493 0 R +/P 3051 0 R +/S /TD +>> +endobj +4324 0 obj +<< +/A 4667 0 R +/K 2494 0 R +/P 3051 0 R +/S /TD +>> +endobj +4325 0 obj +<< +/A 4667 0 R +/K 2495 0 R +/P 3051 0 R +/S /TD +>> +endobj +4326 0 obj +<< +/A 4667 0 R +/K 2496 0 R +/P 3051 0 R +/S /TD +>> +endobj +4327 0 obj +<< +/A 4667 0 R +/K 2497 0 R +/P 3051 0 R +/S /TD +>> +endobj +4328 0 obj +<< +/A 4667 0 R +/K 2498 0 R +/P 3051 0 R +/S /TD +>> +endobj +4329 0 obj +<< +/A 4667 0 R +/K 2499 0 R +/P 3052 0 R +/S /TD +>> +endobj +4330 0 obj +<< +/A 4667 0 R +/K 2500 0 R +/P 3052 0 R +/S /TD +>> +endobj +4331 0 obj +<< +/A 4667 0 R +/K 2501 0 R +/P 3052 0 R +/S /TD +>> +endobj +4332 0 obj +<< +/A 4667 0 R +/K 2502 0 R +/P 3052 0 R +/S /TD +>> +endobj +4333 0 obj +<< +/A 4667 0 R +/K 2503 0 R +/P 3052 0 R +/S /TD +>> +endobj +4334 0 obj +<< +/A 4667 0 R +/K 2504 0 R +/P 3052 0 R +/S /TD +>> +endobj +4335 0 obj +<< +/A 4667 0 R +/K 2505 0 R +/P 3052 0 R +/S /TD +>> +endobj +4336 0 obj +<< +/A 4667 0 R +/K 2506 0 R +/P 3053 0 R +/S /TD +>> +endobj +4337 0 obj +<< +/A 4667 0 R +/K 2507 0 R +/P 3053 0 R +/S /TD +>> +endobj +4338 0 obj +<< +/A 4667 0 R +/K 2508 0 R +/P 3053 0 R +/S /TD +>> +endobj +4339 0 obj +<< +/A 4667 0 R +/K 2509 0 R +/P 3053 0 R +/S /TD +>> +endobj +4340 0 obj +<< +/A 4667 0 R +/K 2510 0 R +/P 3053 0 R +/S /TD +>> +endobj +4341 0 obj +<< +/A 4667 0 R +/K 2511 0 R +/P 3053 0 R +/S /TD +>> +endobj +4342 0 obj +<< +/A 4667 0 R +/K 2512 0 R +/P 3053 0 R +/S /TD +>> +endobj +4343 0 obj +<< +/A 4667 0 R +/K 2513 0 R +/P 3053 0 R +/S /TD +>> +endobj +4344 0 obj +<< +/A 4667 0 R +/K 2514 0 R +/P 3053 0 R +/S /TD +>> +endobj +4345 0 obj +<< +/A 4667 0 R +/K 2515 0 R +/P 3054 0 R +/S /TD +>> +endobj +4346 0 obj +<< +/A 4667 0 R +/K 2516 0 R +/P 3054 0 R +/S /TD +>> +endobj +4347 0 obj +<< +/A 4667 0 R +/K 2517 0 R +/P 3054 0 R +/S /TD +>> +endobj +4348 0 obj +<< +/A 4667 0 R +/K 2518 0 R +/P 3054 0 R +/S /TD +>> +endobj +4349 0 obj +<< +/A 4667 0 R +/K 2519 0 R +/P 3054 0 R +/S /TD +>> +endobj +4350 0 obj +<< +/A 4667 0 R +/K 2520 0 R +/P 3054 0 R +/S /TD +>> +endobj +4351 0 obj +<< +/A 4667 0 R +/K 2521 0 R +/P 3054 0 R +/S /TD +>> +endobj +4352 0 obj +<< +/A 4667 0 R +/K 2522 0 R +/P 3054 0 R +/S /TD +>> +endobj +4353 0 obj +<< +/A 4667 0 R +/K 2523 0 R +/P 3054 0 R +/S /TD +>> +endobj +4354 0 obj +<< +/A 4667 0 R +/K 2524 0 R +/P 3055 0 R +/S /TD +>> +endobj +4355 0 obj +<< +/A 4667 0 R +/K 2525 0 R +/P 3055 0 R +/S /TD +>> +endobj +4356 0 obj +<< +/A 4667 0 R +/K 2526 0 R +/P 3055 0 R +/S /TD +>> +endobj +4357 0 obj +<< +/A 4667 0 R +/K 2527 0 R +/P 3055 0 R +/S /TD +>> +endobj +4358 0 obj +<< +/A 4667 0 R +/K 2528 0 R +/P 3055 0 R +/S /TD +>> +endobj +4359 0 obj +<< +/A 4667 0 R +/K 2529 0 R +/P 3055 0 R +/S /TD +>> +endobj +4360 0 obj +<< +/A 4667 0 R +/K 2530 0 R +/P 3055 0 R +/S /TD +>> +endobj +4361 0 obj +<< +/A 4667 0 R +/K 2531 0 R +/P 3055 0 R +/S /TD +>> +endobj +4362 0 obj +<< +/A 4667 0 R +/K 2532 0 R +/P 3055 0 R +/S /TD +>> +endobj +4363 0 obj +<< +/A 4667 0 R +/K 2533 0 R +/P 3056 0 R +/S /TD +>> +endobj +4364 0 obj +<< +/A 4667 0 R +/K 2534 0 R +/P 3056 0 R +/S /TD +>> +endobj +4365 0 obj +<< +/A 4667 0 R +/K 2535 0 R +/P 3056 0 R +/S /TD +>> +endobj +4366 0 obj +<< +/A 4667 0 R +/K 2536 0 R +/P 3056 0 R +/S /TD +>> +endobj +4367 0 obj +<< +/A 4667 0 R +/K 2537 0 R +/P 3056 0 R +/S /TD +>> +endobj +4368 0 obj +<< +/A 4667 0 R +/K 2538 0 R +/P 3056 0 R +/S /TD +>> +endobj +4369 0 obj +<< +/A 4667 0 R +/K 2539 0 R +/P 3056 0 R +/S /TD +>> +endobj +4370 0 obj +<< +/A 4667 0 R +/K 2540 0 R +/P 3056 0 R +/S /TD +>> +endobj +4371 0 obj +<< +/A 4667 0 R +/K 2541 0 R +/P 3057 0 R +/S /TD +>> +endobj +4372 0 obj +<< +/A 4667 0 R +/K 2542 0 R +/P 3057 0 R +/S /TD +>> +endobj +4373 0 obj +<< +/A 4667 0 R +/K 2543 0 R +/P 3057 0 R +/S /TD +>> +endobj +4374 0 obj +<< +/A 4667 0 R +/K 2544 0 R +/P 3057 0 R +/S /TD +>> +endobj +4375 0 obj +<< +/A 4667 0 R +/K 2545 0 R +/P 3057 0 R +/S /TD +>> +endobj +4376 0 obj +<< +/A 4667 0 R +/K 2546 0 R +/P 3057 0 R +/S /TD +>> +endobj +4377 0 obj +<< +/A 4667 0 R +/K 2547 0 R +/P 3057 0 R +/S /TD +>> +endobj +4378 0 obj +<< +/A 4667 0 R +/K 2548 0 R +/P 3057 0 R +/S /TD +>> +endobj +4379 0 obj +<< +/A 4667 0 R +/K 2549 0 R +/P 3058 0 R +/S /TD +>> +endobj +4380 0 obj +<< +/A 4667 0 R +/K 2550 0 R +/P 3058 0 R +/S /TD +>> +endobj +4381 0 obj +<< +/A 4667 0 R +/K 2551 0 R +/P 3058 0 R +/S /TD +>> +endobj +4382 0 obj +<< +/A 4667 0 R +/K 2552 0 R +/P 3058 0 R +/S /TD +>> +endobj +4383 0 obj +<< +/A 4667 0 R +/K 2553 0 R +/P 3058 0 R +/S /TD +>> +endobj +4384 0 obj +<< +/A 4667 0 R +/K 2554 0 R +/P 3058 0 R +/S /TD +>> +endobj +4385 0 obj +<< +/A 4667 0 R +/K 2555 0 R +/P 3058 0 R +/S /TD +>> +endobj +4386 0 obj +<< +/A 4667 0 R +/K 2556 0 R +/P 3058 0 R +/S /TD +>> +endobj +4387 0 obj +<< +/A 4667 0 R +/K 2557 0 R +/P 3059 0 R +/S /TD +>> +endobj +4388 0 obj +<< +/A 4667 0 R +/K 2558 0 R +/P 3059 0 R +/S /TD +>> +endobj +4389 0 obj +<< +/A 4667 0 R +/K 2559 0 R +/P 3059 0 R +/S /TD +>> +endobj +4390 0 obj +<< +/A 4667 0 R +/K 2560 0 R +/P 3059 0 R +/S /TD +>> +endobj +4391 0 obj +<< +/A 4667 0 R +/K 2561 0 R +/P 3059 0 R +/S /TD +>> +endobj +4392 0 obj +<< +/A 4667 0 R +/K 2562 0 R +/P 3059 0 R +/S /TD +>> +endobj +4393 0 obj +<< +/A 4667 0 R +/K 2563 0 R +/P 3060 0 R +/S /TD +>> +endobj +4394 0 obj +<< +/A 4667 0 R +/K 2564 0 R +/P 3060 0 R +/S /TD +>> +endobj +4395 0 obj +<< +/A 4667 0 R +/K 2565 0 R +/P 3060 0 R +/S /TD +>> +endobj +4396 0 obj +<< +/A 4667 0 R +/K 2566 0 R +/P 3060 0 R +/S /TD +>> +endobj +4397 0 obj +<< +/A 4667 0 R +/K 2567 0 R +/P 3060 0 R +/S /TD +>> +endobj +4398 0 obj +<< +/A 4667 0 R +/K 2568 0 R +/P 3060 0 R +/S /TD +>> +endobj +4399 0 obj +<< +/A 4667 0 R +/K 2569 0 R +/P 3061 0 R +/S /TD +>> +endobj +4400 0 obj +<< +/A 4667 0 R +/K 2570 0 R +/P 3061 0 R +/S /TD +>> +endobj +4401 0 obj +<< +/A 4667 0 R +/K 2571 0 R +/P 3061 0 R +/S /TD +>> +endobj +4402 0 obj +<< +/A 4667 0 R +/K 2572 0 R +/P 3061 0 R +/S /TD +>> +endobj +4403 0 obj +<< +/A 4667 0 R +/K 2573 0 R +/P 3061 0 R +/S /TD +>> +endobj +4404 0 obj +<< +/A 4667 0 R +/K 2574 0 R +/P 3061 0 R +/S /TD +>> +endobj +4405 0 obj +<< +/A 4667 0 R +/K 2575 0 R +/P 3062 0 R +/S /TD +>> +endobj +4406 0 obj +<< +/A 4667 0 R +/K 2576 0 R +/P 3062 0 R +/S /TD +>> +endobj +4407 0 obj +<< +/A 4667 0 R +/K 2577 0 R +/P 3062 0 R +/S /TD +>> +endobj +4408 0 obj +<< +/A 4667 0 R +/K 2578 0 R +/P 3062 0 R +/S /TD +>> +endobj +4409 0 obj +<< +/A 4667 0 R +/K 2579 0 R +/P 3062 0 R +/S /TD +>> +endobj +4410 0 obj +<< +/A 4667 0 R +/K 2580 0 R +/P 3062 0 R +/S /TD +>> +endobj +4411 0 obj +<< +/A 4667 0 R +/K 2581 0 R +/P 3062 0 R +/S /TD +>> +endobj +4412 0 obj +<< +/A 4667 0 R +/K 2582 0 R +/P 3063 0 R +/S /TD +>> +endobj +4413 0 obj +<< +/A 4667 0 R +/K 2583 0 R +/P 3063 0 R +/S /TD +>> +endobj +4414 0 obj +<< +/A 4667 0 R +/K 2584 0 R +/P 3063 0 R +/S /TD +>> +endobj +4415 0 obj +<< +/A 4667 0 R +/K 2585 0 R +/P 3063 0 R +/S /TD +>> +endobj +4416 0 obj +<< +/A 4667 0 R +/K 2586 0 R +/P 3063 0 R +/S /TD +>> +endobj +4417 0 obj +<< +/A 4667 0 R +/K 2587 0 R +/P 3063 0 R +/S /TD +>> +endobj +4418 0 obj +<< +/A 4667 0 R +/K 2588 0 R +/P 3063 0 R +/S /TD +>> +endobj +4419 0 obj +<< +/A 4667 0 R +/K 2589 0 R +/P 3064 0 R +/S /TD +>> +endobj +4420 0 obj +<< +/A 4667 0 R +/K 2590 0 R +/P 3064 0 R +/S /TD +>> +endobj +4421 0 obj +<< +/A 4667 0 R +/K 2591 0 R +/P 3064 0 R +/S /TD +>> +endobj +4422 0 obj +<< +/A 4667 0 R +/K 2592 0 R +/P 3064 0 R +/S /TD +>> +endobj +4423 0 obj +<< +/A 4667 0 R +/K 2593 0 R +/P 3064 0 R +/S /TD +>> +endobj +4424 0 obj +<< +/A 4667 0 R +/K 2594 0 R +/P 3064 0 R +/S /TD +>> +endobj +4425 0 obj +<< +/A 4667 0 R +/K 2595 0 R +/P 3064 0 R +/S /TD +>> +endobj +4426 0 obj +<< +/A 4667 0 R +/K 2596 0 R +/P 3080 0 R +/S /TD +>> +endobj +4427 0 obj +<< +/A 4667 0 R +/K 2597 0 R +/P 3080 0 R +/S /TD +>> +endobj +4428 0 obj +<< +/A 4667 0 R +/K 2598 0 R +/P 3080 0 R +/S /TD +>> +endobj +4429 0 obj +<< +/A 4667 0 R +/K 2599 0 R +/P 3080 0 R +/S /TD +>> +endobj +4430 0 obj +<< +/A 4667 0 R +/K 2600 0 R +/P 3080 0 R +/S /TD +>> +endobj +4431 0 obj +<< +/A 4667 0 R +/K 2601 0 R +/P 3080 0 R +/S /TD +>> +endobj +4432 0 obj +<< +/A 4667 0 R +/K 2602 0 R +/P 3081 0 R +/S /TD +>> +endobj +4433 0 obj +<< +/A 4667 0 R +/K 2603 0 R +/P 3081 0 R +/S /TD +>> +endobj +4434 0 obj +<< +/A 4667 0 R +/K 2604 0 R +/P 3081 0 R +/S /TD +>> +endobj +4435 0 obj +<< +/A 4667 0 R +/K 2605 0 R +/P 3081 0 R +/S /TD +>> +endobj +4436 0 obj +<< +/A 4667 0 R +/K 2606 0 R +/P 3081 0 R +/S /TD +>> +endobj +4437 0 obj +<< +/A 4667 0 R +/K 2607 0 R +/P 3081 0 R +/S /TD +>> +endobj +4438 0 obj +<< +/A 4667 0 R +/K 2608 0 R +/P 3082 0 R +/S /TD +>> +endobj +4439 0 obj +<< +/A 4667 0 R +/K 2609 0 R +/P 3082 0 R +/S /TD +>> +endobj +4440 0 obj +<< +/A 4667 0 R +/K 2610 0 R +/P 3082 0 R +/S /TD +>> +endobj +4441 0 obj +<< +/A 4667 0 R +/K 2611 0 R +/P 3082 0 R +/S /TD +>> +endobj +4442 0 obj +<< +/A 4667 0 R +/K 2612 0 R +/P 3082 0 R +/S /TD +>> +endobj +4443 0 obj +<< +/A 4667 0 R +/K 2613 0 R +/P 3082 0 R +/S /TD +>> +endobj +4444 0 obj +<< +/A 4667 0 R +/K 2614 0 R +/P 3083 0 R +/S /TD +>> +endobj +4445 0 obj +<< +/A 4667 0 R +/K 2615 0 R +/P 3083 0 R +/S /TD +>> +endobj +4446 0 obj +<< +/A 4667 0 R +/K 2616 0 R +/P 3083 0 R +/S /TD +>> +endobj +4447 0 obj +<< +/A 4667 0 R +/K 2617 0 R +/P 3083 0 R +/S /TD +>> +endobj +4448 0 obj +<< +/A 4667 0 R +/K 2618 0 R +/P 3083 0 R +/S /TD +>> +endobj +4449 0 obj +<< +/A 4667 0 R +/K 2619 0 R +/P 3083 0 R +/S /TD +>> +endobj +4450 0 obj +<< +/A 4667 0 R +/K 2620 0 R +/P 3084 0 R +/S /TD +>> +endobj +4451 0 obj +<< +/A 4667 0 R +/K 2621 0 R +/P 3084 0 R +/S /TD +>> +endobj +4452 0 obj +<< +/A 4667 0 R +/K 2622 0 R +/P 3084 0 R +/S /TD +>> +endobj +4453 0 obj +<< +/A 4667 0 R +/K 2623 0 R +/P 3084 0 R +/S /TD +>> +endobj +4454 0 obj +<< +/A 4667 0 R +/K 2624 0 R +/P 3084 0 R +/S /TD +>> +endobj +4455 0 obj +<< +/A 4667 0 R +/K 2625 0 R +/P 3084 0 R +/S /TD +>> +endobj +4456 0 obj +<< +/A 4667 0 R +/K 2626 0 R +/P 3085 0 R +/S /TD +>> +endobj +4457 0 obj +<< +/A 4667 0 R +/K 2627 0 R +/P 3085 0 R +/S /TD +>> +endobj +4458 0 obj +<< +/A 4667 0 R +/K 2628 0 R +/P 3085 0 R +/S /TD +>> +endobj +4459 0 obj +<< +/A 4667 0 R +/K 2629 0 R +/P 3085 0 R +/S /TD +>> +endobj +4460 0 obj +<< +/A 4667 0 R +/K 2630 0 R +/P 3085 0 R +/S /TD +>> +endobj +4461 0 obj +<< +/A 4667 0 R +/K 2631 0 R +/P 3085 0 R +/S /TD +>> +endobj +4462 0 obj +<< +/A 4667 0 R +/K 2632 0 R +/P 3086 0 R +/S /TD +>> +endobj +4463 0 obj +<< +/A 4667 0 R +/K 2633 0 R +/P 3086 0 R +/S /TD +>> +endobj +4464 0 obj +<< +/A 4667 0 R +/K 2634 0 R +/P 3086 0 R +/S /TD +>> +endobj +4465 0 obj +<< +/A 4667 0 R +/K 2635 0 R +/P 3086 0 R +/S /TD +>> +endobj +4466 0 obj +<< +/A 4667 0 R +/K 2636 0 R +/P 3086 0 R +/S /TD +>> +endobj +4467 0 obj +<< +/A 4667 0 R +/K 2637 0 R +/P 3086 0 R +/S /TD +>> +endobj +4468 0 obj +<< +/A 4667 0 R +/K 2638 0 R +/P 3087 0 R +/S /TD +>> +endobj +4469 0 obj +<< +/A 4667 0 R +/K 2639 0 R +/P 3087 0 R +/S /TD +>> +endobj +4470 0 obj +<< +/A 4667 0 R +/K 2640 0 R +/P 3087 0 R +/S /TD +>> +endobj +4471 0 obj +<< +/A 4667 0 R +/K 2641 0 R +/P 3087 0 R +/S /TD +>> +endobj +4472 0 obj +<< +/A 4667 0 R +/K 2642 0 R +/P 3087 0 R +/S /TD +>> +endobj +4473 0 obj +<< +/A 4667 0 R +/K 2643 0 R +/P 3087 0 R +/S /TD +>> +endobj +4474 0 obj +<< +/A 4667 0 R +/K 2644 0 R +/P 3088 0 R +/S /TD +>> +endobj +4475 0 obj +<< +/A 4667 0 R +/K 2645 0 R +/P 3088 0 R +/S /TD +>> +endobj +4476 0 obj +<< +/A 4667 0 R +/K 2646 0 R +/P 3088 0 R +/S /TD +>> +endobj +4477 0 obj +<< +/A 4667 0 R +/K 2647 0 R +/P 3088 0 R +/S /TD +>> +endobj +4478 0 obj +<< +/A 4667 0 R +/K 2648 0 R +/P 3088 0 R +/S /TD +>> +endobj +4479 0 obj +<< +/A 4667 0 R +/K 2649 0 R +/P 3088 0 R +/S /TD +>> +endobj +4480 0 obj +<< +/A 4667 0 R +/K 2650 0 R +/P 3089 0 R +/S /TD +>> +endobj +4481 0 obj +<< +/A 4667 0 R +/K 2651 0 R +/P 3089 0 R +/S /TD +>> +endobj +4482 0 obj +<< +/A 4667 0 R +/K 2652 0 R +/P 3089 0 R +/S /TD +>> +endobj +4483 0 obj +<< +/A 4667 0 R +/K 2653 0 R +/P 3089 0 R +/S /TD +>> +endobj +4484 0 obj +<< +/A 4667 0 R +/K 2654 0 R +/P 3089 0 R +/S /TD +>> +endobj +4485 0 obj +<< +/A 4667 0 R +/K 2655 0 R +/P 3089 0 R +/S /TD +>> +endobj +4486 0 obj +<< +/A 4667 0 R +/K 2656 0 R +/P 3090 0 R +/S /TD +>> +endobj +4487 0 obj +<< +/A 4667 0 R +/K 2657 0 R +/P 3090 0 R +/S /TD +>> +endobj +4488 0 obj +<< +/A 4667 0 R +/K 2658 0 R +/P 3090 0 R +/S /TD +>> +endobj +4489 0 obj +<< +/A 4667 0 R +/K 2659 0 R +/P 3090 0 R +/S /TD +>> +endobj +4490 0 obj +<< +/A 4667 0 R +/K 2660 0 R +/P 3090 0 R +/S /TD +>> +endobj +4491 0 obj +<< +/A 4667 0 R +/K 2661 0 R +/P 3090 0 R +/S /TD +>> +endobj +4492 0 obj +<< +/A 4667 0 R +/K 2662 0 R +/P 3091 0 R +/S /TD +>> +endobj +4493 0 obj +<< +/A 4667 0 R +/K 2663 0 R +/P 3091 0 R +/S /TD +>> +endobj +4494 0 obj +<< +/A 4667 0 R +/K 2664 0 R +/P 3091 0 R +/S /TD +>> +endobj +4495 0 obj +<< +/A 4667 0 R +/K 2665 0 R +/P 3091 0 R +/S /TD +>> +endobj +4496 0 obj +<< +/A 4667 0 R +/K 2666 0 R +/P 3091 0 R +/S /TD +>> +endobj +4497 0 obj +<< +/A 4667 0 R +/K 2667 0 R +/P 3091 0 R +/S /TD +>> +endobj +4498 0 obj +<< +/A 4667 0 R +/K 2668 0 R +/P 3092 0 R +/S /TD +>> +endobj +4499 0 obj +<< +/A 4667 0 R +/K 2669 0 R +/P 3092 0 R +/S /TD +>> +endobj +4500 0 obj +<< +/A 4667 0 R +/K 2670 0 R +/P 3092 0 R +/S /TD +>> +endobj +4501 0 obj +<< +/A 4667 0 R +/K 2671 0 R +/P 3092 0 R +/S /TD +>> +endobj +4502 0 obj +<< +/A 4667 0 R +/K 2672 0 R +/P 3092 0 R +/S /TD +>> +endobj +4503 0 obj +<< +/A 4667 0 R +/K 2673 0 R +/P 3092 0 R +/S /TD +>> +endobj +4504 0 obj +<< +/A 4667 0 R +/K 2674 0 R +/P 3067 0 R +/S /TD +>> +endobj +4505 0 obj +<< +/A 4667 0 R +/K 2675 0 R +/P 3067 0 R +/S /TD +>> +endobj +4506 0 obj +<< +/A 4667 0 R +/K 2676 0 R +/P 3067 0 R +/S /TD +>> +endobj +4507 0 obj +<< +/A 4667 0 R +/K 2677 0 R +/P 3067 0 R +/S /TD +>> +endobj +4508 0 obj +<< +/A 4667 0 R +/K 2678 0 R +/P 3067 0 R +/S /TD +>> +endobj +4509 0 obj +<< +/A 4667 0 R +/K 2679 0 R +/P 3067 0 R +/S /TD +>> +endobj +4510 0 obj +<< +/A 4667 0 R +/K 2680 0 R +/P 3067 0 R +/S /TD +>> +endobj +4511 0 obj +<< +/A 4667 0 R +/K 2681 0 R +/P 3067 0 R +/S /TD +>> +endobj +4512 0 obj +<< +/A 4667 0 R +/K 2682 0 R +/P 3068 0 R +/S /TD +>> +endobj +4513 0 obj +<< +/A 4667 0 R +/K 2683 0 R +/P 3068 0 R +/S /TD +>> +endobj +4514 0 obj +<< +/A 4667 0 R +/K 2684 0 R +/P 3068 0 R +/S /TD +>> +endobj +4515 0 obj +<< +/A 4667 0 R +/K 2685 0 R +/P 3068 0 R +/S /TD +>> +endobj +4516 0 obj +<< +/A 4667 0 R +/K 2686 0 R +/P 3068 0 R +/S /TD +>> +endobj +4517 0 obj +<< +/A 4667 0 R +/K 2687 0 R +/P 3068 0 R +/S /TD +>> +endobj +4518 0 obj +<< +/A 4667 0 R +/K 2688 0 R +/P 3069 0 R +/S /TD +>> +endobj +4519 0 obj +<< +/A 4667 0 R +/K 2689 0 R +/P 3069 0 R +/S /TD +>> +endobj +4520 0 obj +<< +/A 4667 0 R +/K 2690 0 R +/P 3069 0 R +/S /TD +>> +endobj +4521 0 obj +<< +/A 4667 0 R +/K 2691 0 R +/P 3069 0 R +/S /TD +>> +endobj +4522 0 obj +<< +/A 4667 0 R +/K 2692 0 R +/P 3069 0 R +/S /TD +>> +endobj +4523 0 obj +<< +/A 4667 0 R +/K 2693 0 R +/P 3069 0 R +/S /TD +>> +endobj +4524 0 obj +<< +/A 4667 0 R +/K 2694 0 R +/P 3070 0 R +/S /TD +>> +endobj +4525 0 obj +<< +/A 4667 0 R +/K 2695 0 R +/P 3070 0 R +/S /TD +>> +endobj +4526 0 obj +<< +/A 4667 0 R +/K 2696 0 R +/P 3070 0 R +/S /TD +>> +endobj +4527 0 obj +<< +/A 4667 0 R +/K 2697 0 R +/P 3070 0 R +/S /TD +>> +endobj +4528 0 obj +<< +/A 4667 0 R +/K 2698 0 R +/P 3070 0 R +/S /TD +>> +endobj +4529 0 obj +<< +/A 4667 0 R +/K 2699 0 R +/P 3070 0 R +/S /TD +>> +endobj +4530 0 obj +<< +/A 4667 0 R +/K 2700 0 R +/P 3071 0 R +/S /TD +>> +endobj +4531 0 obj +<< +/A 4667 0 R +/K 2701 0 R +/P 3071 0 R +/S /TD +>> +endobj +4532 0 obj +<< +/A 4667 0 R +/K 2702 0 R +/P 3071 0 R +/S /TD +>> +endobj +4533 0 obj +<< +/A 4667 0 R +/K 2703 0 R +/P 3071 0 R +/S /TD +>> +endobj +4534 0 obj +<< +/A 4667 0 R +/K 2704 0 R +/P 3071 0 R +/S /TD +>> +endobj +4535 0 obj +<< +/A 4667 0 R +/K 2705 0 R +/P 3071 0 R +/S /TD +>> +endobj +4536 0 obj +<< +/A 4667 0 R +/K 2706 0 R +/P 3072 0 R +/S /TD +>> +endobj +4537 0 obj +<< +/A 4667 0 R +/K 2707 0 R +/P 3072 0 R +/S /TD +>> +endobj +4538 0 obj +<< +/A 4667 0 R +/K 2708 0 R +/P 3072 0 R +/S /TD +>> +endobj +4539 0 obj +<< +/A 4667 0 R +/K 2709 0 R +/P 3072 0 R +/S /TD +>> +endobj +4540 0 obj +<< +/A 4667 0 R +/K 2710 0 R +/P 3072 0 R +/S /TD +>> +endobj +4541 0 obj +<< +/A 4667 0 R +/K 2711 0 R +/P 3072 0 R +/S /TD +>> +endobj +4542 0 obj +<< +/A 4667 0 R +/K 2712 0 R +/P 3073 0 R +/S /TD +>> +endobj +4543 0 obj +<< +/A 4667 0 R +/K 2713 0 R +/P 3073 0 R +/S /TD +>> +endobj +4544 0 obj +<< +/SpaceAfter 0.0 +/TextAlign /Justify +/O /Layout +/WritingMode /LrTb +/SpaceBefore 0.0 +/TextIndent 0.0 +/EndIndent -0.999985 +/StartIndent 0.0 +>> +endobj +4545 0 obj +<< +/A 4667 0 R +/K 2714 0 R +/P 3073 0 R +/S /TD +>> +endobj +4546 0 obj +<< +/A 4667 0 R +/K 2715 0 R +/P 3073 0 R +/S /TD +>> +endobj +4547 0 obj +<< +/A 4667 0 R +/K 2716 0 R +/P 3073 0 R +/S /TD +>> +endobj +4548 0 obj +<< +/A 4667 0 R +/K 2717 0 R +/P 3073 0 R +/S /TD +>> +endobj +4549 0 obj +<< +/K 2718 0 R +/P 4551 0 R +/S /Frame +>> +endobj +4550 0 obj +<< +/K [2719 0 R 2720 0 R 2721 0 R 2722 0 R] +/P 4551 0 R +/S /Frame +>> +endobj +4551 0 obj +<< +/A [4667 0 R 4695 0 R] +/K [4549 0 R 4550 0 R 2723 0 R] +/P 3068 0 R +/S /TD +>> +endobj +4552 0 obj +<< +/A 4667 0 R +/K 2724 0 R +/P 3074 0 R +/S /TD +>> +endobj +4553 0 obj +<< +/A 4667 0 R +/K 2725 0 R +/P 3074 0 R +/S /TD +>> +endobj +4554 0 obj +<< +/A 4667 0 R +/K 2726 0 R +/P 3074 0 R +/S /TD +>> +endobj +4555 0 obj +<< +/A 4667 0 R +/K 2727 0 R +/P 3074 0 R +/S /TD +>> +endobj +4556 0 obj +<< +/A 4667 0 R +/K 2728 0 R +/P 3074 0 R +/S /TD +>> +endobj +4557 0 obj +<< +/A 4667 0 R +/K 2729 0 R +/P 3074 0 R +/S /TD +>> +endobj +4558 0 obj +<< +/A 4667 0 R +/K 2730 0 R +/P 3075 0 R +/S /TD +>> +endobj +4559 0 obj +<< +/A 4667 0 R +/K 2731 0 R +/P 3075 0 R +/S /TD +>> +endobj +4560 0 obj +<< +/A 4667 0 R +/K 2732 0 R +/P 3075 0 R +/S /TD +>> +endobj +4561 0 obj +<< +/A 4667 0 R +/K 2733 0 R +/P 3075 0 R +/S /TD +>> +endobj +4562 0 obj +<< +/A 4667 0 R +/K 2734 0 R +/P 3075 0 R +/S /TD +>> +endobj +4563 0 obj +<< +/A 4667 0 R +/K 2735 0 R +/P 3075 0 R +/S /TD +>> +endobj +4564 0 obj +<< +/A 4667 0 R +/K 2736 0 R +/P 3076 0 R +/S /TD +>> +endobj +4565 0 obj +<< +/A 4667 0 R +/K 2737 0 R +/P 3076 0 R +/S /TD +>> +endobj +4566 0 obj +<< +/A 4667 0 R +/K 2738 0 R +/P 3076 0 R +/S /TD +>> +endobj +4567 0 obj +<< +/K [2739 0 R 2740 0 R 2741 0 R 2742 0 R 2743 0 R 2744 0 R 2745 0 R 2746 0 R] +/P 4568 0 R +/S /Frame +>> +endobj +4568 0 obj +<< +/A [4667 0 R 4696 0 R] +/K [4567 0 R 2747 0 R] +/P 3068 0 R +/S /TD +>> +endobj +4569 0 obj +<< +/A 4667 0 R +/K 2748 0 R +/P 3076 0 R +/S /TD +>> +endobj +4570 0 obj +<< +/A 4667 0 R +/K 2749 0 R +/P 3076 0 R +/S /TD +>> +endobj +4571 0 obj +<< +/A 4667 0 R +/K 2750 0 R +/P 3076 0 R +/S /TD +>> +endobj +4572 0 obj +<< +/A 4667 0 R +/K 2751 0 R +/P 3077 0 R +/S /TD +>> +endobj +4573 0 obj +<< +/A 4667 0 R +/K 2752 0 R +/P 3077 0 R +/S /TD +>> +endobj +4574 0 obj +<< +/A 4667 0 R +/K 2753 0 R +/P 3077 0 R +/S /TD +>> +endobj +4575 0 obj +<< +/A 4667 0 R +/K 2754 0 R +/P 3077 0 R +/S /TD +>> +endobj +4576 0 obj +<< +/A 4667 0 R +/K 2755 0 R +/P 3077 0 R +/S /TD +>> +endobj +4577 0 obj +<< +/A 4667 0 R +/K 2756 0 R +/P 3077 0 R +/S /TD +>> +endobj +4578 0 obj +<< +/A 4667 0 R +/K 2757 0 R +/P 3078 0 R +/S /TD +>> +endobj +4579 0 obj +<< +/A 4667 0 R +/K 2758 0 R +/P 3078 0 R +/S /TD +>> +endobj +4580 0 obj +<< +/A 4667 0 R +/K 2759 0 R +/P 3078 0 R +/S /TD +>> +endobj +4581 0 obj +<< +/A 4667 0 R +/K 2760 0 R +/P 3078 0 R +/S /TD +>> +endobj +4582 0 obj +<< +/A 4667 0 R +/K 2761 0 R +/P 3078 0 R +/S /TD +>> +endobj +4583 0 obj +<< +/A 4667 0 R +/K 2762 0 R +/P 3078 0 R +/S /TD +>> +endobj +4584 0 obj +<< +/K [2763 0 R 2764 0 R 2765 0 R 2766 0 R] +/P 4585 0 R +/S /Frame +>> +endobj +4585 0 obj +<< +/A [4667 0 R 4697 0 R] +/K [4584 0 R 2767 0 R] +/P 3075 0 R +/S /TD +>> +endobj +4586 0 obj +<< +/A 4667 0 R +/K 2768 0 R +/P 3079 0 R +/S /TD +>> +endobj +4587 0 obj +<< +/A 4667 0 R +/K 2769 0 R +/P 3079 0 R +/S /TD +>> +endobj +4588 0 obj +<< +/A 4667 0 R +/K 2770 0 R +/P 3079 0 R +/S /TD +>> +endobj +4589 0 obj +<< +/K [2771 0 R 2772 0 R] +/P 4590 0 R +/S /Frame +>> +endobj +4590 0 obj +<< +/A [4667 0 R 4698 0 R] +/K [4589 0 R 2773 0 R] +/P 3077 0 R +/S /TD +>> +endobj +4591 0 obj +<< +/A 4667 0 R +/K 2774 0 R +/P 3079 0 R +/S /TD +>> +endobj +4592 0 obj +<< +/A 4667 0 R +/K 2775 0 R +/P 3079 0 R +/S /TD +>> +endobj +4593 0 obj +<< +/A 4667 0 R +/K 2776 0 R +/P 3079 0 R +/S /TD +>> +endobj +4594 0 obj +<< +/D [25 0 R /XYZ 0 769 null] +/S /GoTo +>> +endobj +4595 0 obj +<< +/First 4699 0 R +/Parent 9 0 R +/A 4700 0 R +/Next 4701 0 R +/Count 8 +/Last 4702 0 R +/Prev 2778 0 R +/Title +>> +endobj +4596 0 obj +<< +/Parent 2781 0 R +/A 4703 0 R +/Next 4598 0 R +/Title +>> +endobj +4597 0 obj +<< +/D [48 0 R /XYZ 0 677 null] +/S /GoTo +>> +endobj +4598 0 obj +<< +/Parent 2781 0 R +/A 4704 0 R +/Prev 4596 0 R +/Title +>> +endobj +4599 0 obj +<< +/Parent 2783 0 R +/A 4705 0 R +/Next 4601 0 R +/Title +>> +endobj +4600 0 obj +<< +/D [51 0 R /XYZ 0 768 null] +/S /GoTo +>> +endobj +4601 0 obj +<< +/Parent 2783 0 R +/A 4706 0 R +/Prev 4599 0 R +/Title +>> +endobj +4602 0 obj +<< +/First 4707 0 R +/Parent 2784 0 R +/A 4708 0 R +/Next 4709 0 R +/Count 8 +/Last 4707 0 R +/Title +>> +endobj +4603 0 obj +<< +/D [34 0 R /XYZ 0 769 null] +/S /GoTo +>> +endobj +4604 0 obj +<< +/First 4710 0 R +/Parent 2784 0 R +/A 4711 0 R +/Count 1 +/Last 4710 0 R +/Prev 4709 0 R +/Title +>> +endobj +4605 0 obj +<< +/First 4712 0 R +/Parent 9 0 R +/A 4713 0 R +/Next 2784 0 R +/Count 2 +/Last 4714 0 R +/Prev 4701 0 R +/Title +>> +endobj +4606 0 obj +<< +/StemV 0 +/FontName /PKKFJM+SimSun +/FontStretch /Normal +/FontFile2 4715 0 R +/FontWeight 400 +/Flags 4 +/Descent -140 +/FontBBox [0 -141 996 855] +/Ascent 859 +/FontFamily (SimSun) +/CapHeight 0 +/Type /FontDescriptor +/ItalicAngle 0 +/Lang /zh-CN +>> +endobj +4607 0 obj +<< +/StemV 0 +/FontName /PKKFMO+LiSu +/FontStretch /Normal +/FontFile2 4716 0 R +/FontWeight 400 +/Flags 5 +/Descent -140 +/FontBBox [-8 -227 1031 859] +/Ascent 859 +/FontFamily (LiSu) +/CapHeight 0 +/Type /FontDescriptor +/ItalicAngle 0 +/Lang /zh-CN +>> +endobj +4608 0 obj +<< +/StemV 0 +/FontName /PKKHBH+SimHei +/FontStretch /Normal +/FontFile2 4717 0 R +/FontWeight 400 +/Flags 4 +/Descent -140 +/FontBBox [0 -141 996 855] +/Ascent 859 +/FontFamily (SimHei) +/CapHeight 0 +/Type /FontDescriptor +/ItalicAngle 0 +/Lang /zh-CN +>> +endobj +4609 0 obj +<< +/Registry (Adobe) +/Ordering (Identity) +/Supplement 0 +>> +endobj +4610 0 obj +<< +/Type /FontDescriptor +/FontName /AAAGGN+NotoSans-Regular +/Flags 4 +/FontWeight 400.0 +/ItalicAngle 0.0 +/FontBBox [-621.0 -389.0 2800.0 1067.0] +/Ascent 1069.0 +/Descent -293.0 +/CapHeight 714.0 +/XHeight 536.0 +/StemV 444.72998 +/FontFile2 4718 0 R +/CIDSet 4719 0 R +>> +endobj +4611 0 obj +<< +/Length 181 +/Filter /FlateDecode +>> +stream +xNDA Ѓ;,,. 0Ynx@H'iMf(HQYRTQ:4jҬE69:tҭG> 4d؈Qc +M4eڌ41gނEK~ZM[صg߁CG8u܅KWݸuރlI9e'W~oB!B!-H +endstream +endobj +4612 0 obj +<< +/Registry (Adobe) +/Ordering (Identity) +/Supplement 0 +>> +endobj +4613 0 obj +<< +/Type /FontDescriptor +/FontName /AAAZZG+NotoSans-Bold +/Flags 4 +/FontWeight 700.0 +/ItalicAngle 0.0 +/FontBBox [-644.0 -389.0 2800.0 1069.0] +/Ascent 1069.0 +/Descent -293.0 +/CapHeight 714.0 +/XHeight 546.0 +/StemV 447.71997 +/FontFile2 4720 0 R +/CIDSet 4721 0 R +>> +endobj +4614 0 obj +<< +/Length 117 +/Filter /FlateDecode +>> +stream +xUVBDMHҍ-*J]2f&*v׸ I)iY9yE%BNv <ū7>| +0[XZY_wptrvq +endstream +endobj +4615 0 obj +<< +/StemV 0 +/FontName /PKKHDH+STXingkai +/FontStretch /Normal +/FontFile2 4722 0 R +/FontWeight 400 +/Flags 4 +/Descent -289 +/FontBBox [-166 -289 1037 802] +/Ascent 802 +/FontFamily (STXingkai) +/CapHeight 0 +/Type /FontDescriptor +/ItalicAngle 0 +/Lang /zh-CN +>> +endobj +4616 0 obj +<< +/StemV 0 +/FontName /PKKHEI+STLiti +/FontStretch /Normal +/FontFile2 4723 0 R +/FontWeight 400 +/Flags 4 +/Descent -259 +/FontBBox [-146 -259 1045 800] +/Ascent 800 +/FontFamily (STLiti) +/CapHeight 0 +/Type /FontDescriptor +/ItalicAngle 0 +/Lang /zh-CN +>> +endobj +4617 0 obj +<< +/Registry (Adobe) +/Ordering (Identity) +/Supplement 0 +>> +endobj +4618 0 obj +<< +/Type /FontDescriptor +/FontName /AABHCF+NotoSansCJKsc-Regular +/Flags 4 +/FontWeight 400.0 +/ItalicAngle 0.0 +/FontBBox [-1002.0 -1048.0 2928.0 1808.0] +/Ascent 1160.0 +/Descent -288.0 +/CapHeight 733.0 +/XHeight 543.0 +/StemV 510.9 +/FontFile2 4724 0 R +/CIDSet 4725 0 R +>> +endobj +4619 0 obj +<< +/Length 179 +/Filter /FlateDecode +>> +stream +x; +@ @wKYbHx^{U'aL?V5 +X8 +endstream +endobj +4620 0 obj +<< +/StemV 0 +/FontName /PKKMKM+Wingdings-Regular +/FontStretch /Normal +/FontFile2 4726 0 R +/FontWeight 400 +/Flags 4 +/Descent -210 +/FontBBox [0 -211 1359 899] +/Ascent 898 +/FontFamily (Wingdings) +/CapHeight 0 +/Type /FontDescriptor +/ItalicAngle 0 +>> +endobj +4621 0 obj +<< +/StemV 0 +/FontName /PKKNCM+KaiTi_GB2312 +/FontStretch /Normal +/FontFile2 4727 0 R +/FontWeight 400 +/Flags 5 +/Descent -140 +/FontBBox [0 -141 996 855] +/Ascent 859 +/FontFamily (KaiTi_GB2312) +/CapHeight 0 +/Type /FontDescriptor +/ItalicAngle 0 +/Lang /zh-CN +>> +endobj +4622 0 obj +<< +/A 4667 0 R +/K 4728 0 R +/P 2859 0 R +/S /TD +>> +endobj +4623 0 obj +<< +/A 4667 0 R +/K 4729 0 R +/P 2859 0 R +/S /TD +>> +endobj +4624 0 obj +<< +/A 4667 0 R +/K 4730 0 R +/P 2859 0 R +/S /TD +>> +endobj +4625 0 obj +<< +/A 4667 0 R +/K 4731 0 R +/P 2865 0 R +/S /TD +>> +endobj +4626 0 obj +<< +/A 4667 0 R +/K 4732 0 R +/P 2865 0 R +/S /TD +>> +endobj +4627 0 obj +<< +/A 4667 0 R +/K 4733 0 R +/P 2865 0 R +/S /TD +>> +endobj +4628 0 obj +<< +/A 4667 0 R +/K 4734 0 R +/P 2865 0 R +/S /TD +>> +endobj +4629 0 obj +<< +/A 4667 0 R +/K 4735 0 R +/P 2869 0 R +/S /TD +>> +endobj +4630 0 obj +<< +/A 4667 0 R +/K 4736 0 R +/P 2869 0 R +/S /TD +>> +endobj +4631 0 obj +<< +/A 4667 0 R +/K 4737 0 R +/P 2869 0 R +/S /TD +>> +endobj +4632 0 obj +<< +/A 4667 0 R +/K 4738 0 R +/P 2869 0 R +/S /TD +>> +endobj +4633 0 obj +<< +/A 4667 0 R +/K 4739 0 R +/P 2873 0 R +/S /TD +>> +endobj +4634 0 obj +<< +/A 4667 0 R +/K 4740 0 R +/P 2873 0 R +/S /TD +>> +endobj +4635 0 obj +<< +/A 4667 0 R +/K 4741 0 R +/P 2888 0 R +/S /TD +>> +endobj +4636 0 obj +<< +/A 4667 0 R +/K 4742 0 R +/P 2888 0 R +/S /TD +>> +endobj +4637 0 obj +<< +/A 4667 0 R +/K 4743 0 R +/P 2888 0 R +/S /TD +>> +endobj +4638 0 obj +<< +/A 4667 0 R +/K 4744 0 R +/P 2889 0 R +/S /TD +>> +endobj +4639 0 obj +<< +/A 4667 0 R +/K 4745 0 R +/P 2889 0 R +/S /TD +>> +endobj +4640 0 obj +<< +/A 4667 0 R +/K 4746 0 R +/P 2889 0 R +/S /TD +>> +endobj +4641 0 obj +<< +/A 4667 0 R +/K 4747 0 R +/P 2890 0 R +/S /TD +>> +endobj +4642 0 obj +<< +/A 4667 0 R +/K 4748 0 R +/P 2890 0 R +/S /TD +>> +endobj +4643 0 obj +<< +/A 4667 0 R +/K 4749 0 R +/P 2890 0 R +/S /TD +>> +endobj +4644 0 obj +<< +/A 4667 0 R +/K 4750 0 R +/P 2944 0 R +/S /TD +>> +endobj +4645 0 obj +<< +/A 4667 0 R +/K 4751 0 R +/P 2946 0 R +/S /TD +>> +endobj +4646 0 obj +<< +/A 4667 0 R +/K 4752 0 R +/P 2949 0 R +/S /TD +>> +endobj +4647 0 obj +<< +/A 4667 0 R +/K 4753 0 R +/P 3069 0 R +/S /TD +>> +endobj +4648 0 obj +<< +/A 4667 0 R +/K 4754 0 R +/P 3069 0 R +/S /TD +>> +endobj +4649 0 obj +<< +/A 4667 0 R +/K 4755 0 R +/P 3070 0 R +/S /TD +>> +endobj +4650 0 obj +<< +/A 4667 0 R +/K 4756 0 R +/P 3070 0 R +/S /TD +>> +endobj +4651 0 obj +<< +/A 4667 0 R +/K 4757 0 R +/P 3071 0 R +/S /TD +>> +endobj +4652 0 obj +<< +/A 4667 0 R +/K 4758 0 R +/P 3071 0 R +/S /TD +>> +endobj +4653 0 obj +<< +/A 4667 0 R +/K 4759 0 R +/P 3072 0 R +/S /TD +>> +endobj +4654 0 obj +<< +/A 4667 0 R +/K 4760 0 R +/P 3072 0 R +/S /TD +>> +endobj +4655 0 obj +<< +/A 4667 0 R +/K 4761 0 R +/P 3073 0 R +/S /TD +>> +endobj +4656 0 obj +<< +/A 4667 0 R +/K 4762 0 R +/P 3073 0 R +/S /TD +>> +endobj +4657 0 obj +<< +/A 4667 0 R +/K 4763 0 R +/P 3074 0 R +/S /TD +>> +endobj +4658 0 obj +<< +/A 4667 0 R +/K 4764 0 R +/P 3074 0 R +/S /TD +>> +endobj +4659 0 obj +<< +/A 4667 0 R +/K 4765 0 R +/P 3075 0 R +/S /TD +>> +endobj +4660 0 obj +<< +/A 4667 0 R +/K 4766 0 R +/P 3076 0 R +/S /TD +>> +endobj +4661 0 obj +<< +/A 4667 0 R +/K 4767 0 R +/P 3076 0 R +/S /TD +>> +endobj +4662 0 obj +<< +/A 4667 0 R +/K 4768 0 R +/P 3077 0 R +/S /TD +>> +endobj +4663 0 obj +<< +/A 4667 0 R +/K 4769 0 R +/P 3078 0 R +/S /TD +>> +endobj +4664 0 obj +<< +/A 4667 0 R +/K 4770 0 R +/P 3078 0 R +/S /TD +>> +endobj +4665 0 obj +<< +/A 4667 0 R +/K 4771 0 R +/P 3079 0 R +/S /TD +>> +endobj +4666 0 obj +<< +/A 4667 0 R +/K 4772 0 R +/P 3079 0 R +/S /TD +>> +endobj +4667 0 obj +<< +/BorderStyle (Solid) +/BorderColor [0.0 0.0 0.0] +/O /Layout +/BorderThickness 1.0 +>> +endobj +4668 0 obj +<< +/BackgroundColor [0.952942 0.952942 0.952942] +/BorderStyle (Solid) +/BorderColor [0.0 0.0 0.0] +/O /Layout +/BorderThickness 1.0 +>> +endobj +4669 0 obj +<< +/O /Table +/ColSpan 3 +/RowSpan 1 +>> +endobj +4670 0 obj +<< +/O /Table +/ColSpan 1 +/RowSpan 2 +>> +endobj +4671 0 obj +<< +/O /Table +/ColSpan 3 +/RowSpan 1 +>> +endobj +4672 0 obj +<< +/O /Table +/ColSpan 1 +/RowSpan 2 +>> +endobj +4673 0 obj +<< +/O /Table +/ColSpan 1 +/RowSpan 2 +>> +endobj +4674 0 obj +<< +/O /Table +/ColSpan 3 +/RowSpan 1 +>> +endobj +4675 0 obj +<< +/O /Table +/ColSpan 1 +/RowSpan 2 +>> +endobj +4676 0 obj +<< +/O /Table +/ColSpan 1 +/RowSpan 2 +>> +endobj +4677 0 obj +<< +/O /Table +/ColSpan 1 +/RowSpan 2 +>> +endobj +4678 0 obj +<< +/O /Table +/ColSpan 1 +/RowSpan 2 +>> +endobj +4679 0 obj +<< +/O /Table +/ColSpan 2 +/RowSpan 1 +>> +endobj +4680 0 obj +<< +/O /Table +/ColSpan 2 +/RowSpan 1 +>> +endobj +4681 0 obj +<< +/O /Table +/ColSpan 2 +/RowSpan 1 +>> +endobj +4682 0 obj +<< +/O /Table +/ColSpan 1 +/RowSpan 4 +>> +endobj +4683 0 obj +<< +/O /Table +/ColSpan 1 +/RowSpan 4 +>> +endobj +4684 0 obj +<< +/O /Table +/ColSpan 1 +/RowSpan 4 +>> +endobj +4685 0 obj +<< +/O /Table +/ColSpan 2 +/RowSpan 1 +>> +endobj +4686 0 obj +<< +/O /Table +/ColSpan 2 +/RowSpan 1 +>> +endobj +4687 0 obj +<< +/O /Table +/ColSpan 2 +/RowSpan 1 +>> +endobj +4688 0 obj +<< +/BackgroundColor [0.901962 0.901962 0.901962] +/BorderStyle (Solid) +/BorderColor [0.0 0.0 0.0] +/O /Layout +/BorderThickness 1.0 +>> +endobj +4689 0 obj +<< +/O /Table +/ColSpan 9 +/RowSpan 1 +>> +endobj +4690 0 obj +<< +/O /Table +/ColSpan 1 +/RowSpan 2 +>> +endobj +4691 0 obj +<< +/O /Table +/ColSpan 1 +/RowSpan 2 +>> +endobj +4692 0 obj +<< +/O /Table +/ColSpan 8 +/RowSpan 1 +>> +endobj +4693 0 obj +<< +/O /Table +/ColSpan 1 +/RowSpan 2 +>> +endobj +4694 0 obj +<< +/O /Table +/ColSpan 10 +/RowSpan 1 +>> +endobj +4695 0 obj +<< +/O /Table +/ColSpan 1 +/RowSpan 7 +>> +endobj +4696 0 obj +<< +/O /Table +/ColSpan 1 +/RowSpan 9 +>> +endobj +4697 0 obj +<< +/O /Table +/ColSpan 1 +/RowSpan 5 +>> +endobj +4698 0 obj +<< +/O /Table +/ColSpan 1 +/RowSpan 3 +>> +endobj +4699 0 obj +<< +/First 4773 0 R +/Parent 4595 0 R +/A 4774 0 R +/Next 4702 0 R +/Count 6 +/Last 4775 0 R +/Title +>> +endobj +4700 0 obj +<< +/D [26 0 R /XYZ 0 760 null] +/S /GoTo +>> +endobj +4701 0 obj +<< +/First 4776 0 R +/Parent 9 0 R +/A 4777 0 R +/Next 4605 0 R +/Count 12 +/Last 4778 0 R +/Prev 4595 0 R +/Title +>> +endobj +4702 0 obj +<< +/Parent 4595 0 R +/A 4779 0 R +/Prev 4699 0 R +/Title +>> +endobj +4703 0 obj +<< +/D [49 0 R /XYZ 0 768 null] +/S /GoTo +>> +endobj +4704 0 obj +<< +/D [50 0 R /XYZ 0 755 null] +/S /GoTo +>> +endobj +4705 0 obj +<< +/D [51 0 R /XYZ 0 711 null] +/S /GoTo +>> +endobj +4706 0 obj +<< +/D [51 0 R /XYZ 0 429 null] +/S /GoTo +>> +endobj +4707 0 obj +<< +/First 4780 0 R +/Parent 4602 0 R +/A 4781 0 R +/Count 7 +/Last 4782 0 R +/Title +>> +endobj +4708 0 obj +<< +/D [34 0 R /XYZ 0 653 null] +/S /GoTo +>> +endobj +4709 0 obj +<< +/First 4783 0 R +/Parent 2784 0 R +/A 4784 0 R +/Next 4604 0 R +/Count 13 +/Last 4783 0 R +/Prev 4602 0 R +/Title +>> +endobj +4710 0 obj +<< +/Parent 4604 0 R +/A 4785 0 R +/Title +>> +endobj +4711 0 obj +<< +/D [47 0 R /XYZ 0 768 null] +/S /GoTo +>> +endobj +4712 0 obj +<< +/Parent 4605 0 R +/A 4786 0 R +/Next 4714 0 R +/Title +>> +endobj +4713 0 obj +<< +/D [32 0 R /XYZ 0 769 null] +/S /GoTo +>> +endobj +4714 0 obj +<< +/Parent 4605 0 R +/A 4787 0 R +/Prev 4712 0 R +/Title +>> +endobj +4715 0 obj +<< +/Length 106108 +/Filter /FlateDecode +/Length1 313916 +>> +stream +HWKlWvyrB7Y~*=xg t#,cWpH` +?g`gcX;&xJp\pNpUSව籯'qv 6Yȟ!;Q<3sa} VP|4b}B,tۏc} ~~Ocov,<+ h4 ~(l J.[P]놿z=0j&s X V1ڹApGs- x ~ט.`"|T3Xmy>~ #P'IDY.io|ko"oc"&ug~5iѺպ6kS;qt֛'wϬΧ}T_{AB{ P53i?XYS(٣voՇ { gCelG 8?}(3n+E~Oo7Isg ~Rg`ir2w !gdnt> +2(d+wx!Scy ?l G|#_NaL{G`wl\z){5]؎6vb]u&ktnq2n}j5 :}c3>msUkQY}w195 -Q͙KG2|,`?Iн;W|N 0W=4^;m2n]};f{G;Q76sh\F3/o5'IVy1\5wa=tJc[?tl{ƫF}Bﮚ7WA9|=k]g8uDkfX8ڽNo>KC9qgagi1.E`ΤnДpx_;cr^wk8kyz7HgL驼!t؍kx`HӾj\!N25ʐ[xנoq7fِżU蓧'u3Сa:ȑ1ynz|GJNc,_ӄj=k)f$vG΋fX_{/ۂWl5c㓡L ؏,A&I~#al ultq2dS7ǁzHD2F^맱4*-^Ģ;*c:vCF?^sW\o~gϻoΕU⣶!^߷;z;EQ=okA7TGydyi:;9Kr8',N|剶G[};Ĝ ̉λd^&2Jcu93ta={.-48M/O@&tYdi/e=/wt̷<<̒O \J;zR6-fWyr* xfHƦkEw\1q8j\V=-cisR/'.ٛD fc:7k92f3ݻqwi'ɀ79B 9;Լ▾z`ܗ=POI,!Ұ})-\țDz'/\7K=9`JG2]Vk]72[iszgof9Z~Ζz~}߿W~_9w72"ڗz>晆 8)ȏͥ2V{>b7Y;&ϕ6;io*|ɻvEdǻjXCM}ry븙o:8wf ߷[ۯSGgރ>f!Lq=FQwE'h;qҎ^LM|\-ߓhz9{ۍT8qHe`lסݾs^ܙu䟵ǹuF9 {`eޘ}7tlܖ67W⠳}ոeMVFPu=1~ײƋP({1߸ts+z,粮s٫pйs s2]ݾqe'6lw}s|A |xAד}g`fAɡ|sƴ Z6{ i|X?wct?=WG}g߹UZߞ7;M$sg3ۙsGHoHqx(z¼-;ǎY֭[g/<eϲgz6Z֌8~S\9}e=Ϭg{5Ͼ>vxXgfs8so4/s1ggc{df+j}۬ r{?r 3]/]']ys Cj g[/s9<[zg.TNޢ0zكxu_y'=Tvu< 26Εc\z<ˣU~x)-z\~,Y;҉ّ:g>u_NkrkMb+8Jã~/673I4 `p{ԜG}S_Y4yA]若^C[tgs$} 9K}'!x78ߵsUy. `ٸ9uLWy^8(E/OKvc%1{-ӯYO*~]td,gճ*=bV.?{q6x-?rf뵴zI"O :bU?909'=z )r> -' ^1z|-R>̷x߉ gExzOr~_>@OU`߀C?u;7 ve?pLO՚Q7>&R[!+zGl71s)&c c٨3ו!.zڱ=>|weݗu_Qy-A{@K}Lx$u~4vg_Z/]dٿ.sgGz>h)5O{Gܱd9C72 5G&ח]uW}rg wƱ1DHI|GOǘ\->|_3߯+6q?{ki[C?C{6k2?gශ~A[~[⾿A<~/ƹa~xo㖼w, E6zQOO9?}"<&2N{x$ۭ5g.yr f8˜z~'!;kX^[ڳ%qeø&}ɋxV36c?=Տy~7Ĺk,rV2sxծ_xN/y9v[H +'o s% ;k>)^=%u̷䩳){u7yKjw4x)EC:o[9;.sm~{_|_?gNW-5{uvU +k{53 >KH1ֺǙIuqm'=3 g`ùDx|e twV5rECAC67{v?"p(h|}A78=D{\^y~4X}`>U ? +uU]E} #wے7gtԋq“_FUҢS|5\Lެx ;|#ZRł@ݫs6Zļ@{ׁN_,׭eV:k z!X3_ιhWxXS+G4m\W >*U>Y9O⌉)=ό_/t/Fco3u؛e-+{34RNJvوq9FG/N[nmSo9bk>7?z118<<9MdM_h܀vfO:#Fo׌=tξҧg؍`0g:'ߊ%Y|EūÙc#ोh%9[Тz*zʘw<:e[L{!uYU˨7О]<ƇteMM@3ާx5VRh2h;\ډm59536u, qD=d:˾GಷTh1V9'TF_r Z3o%>[;Q~\mcmMi[O9R25Źh0|dUywoU>h&8Rϡ_ӏ'{1fx2z>R7|dgM9p\|[yYip?g$o Ƈ2|Wke_tx*Φ)osx~ƚa8Lʸ?r^쫌-3Y՗N8ӺZ[Yyvm߻;w/{c/왪W؝s(yu~I;}b#}2!K[[ľw^:f580DsmU-_;ً:3S W^:B0){iaZ>`m|~#ΰ!>y0%K­zdMlJYI ug^Ys^cWy8e}]eXXg^۽ưnk5/wL'%^vϹ+Μ^{9S9F==ZN%9t^g3.1b4&ۂ_:<:>wF܇Λ0OFq@!f_9Fy14+{%Ͷc'SE>zY_t|s^Z86e|(#u ߗU97jJU.O͎:lssQKV{o2c;iQϷL2 #eOWA[_;~%[{GQ^IN^ܺ?WЛpޛi޾SUm8+JD9)㭉G29NQۯϤW_?.-~F<)<[w3* 4z.>˯-{>9s>0.aY}//1=o\?׿=֙{{e 4^kN7Z_Oiy~Kܯ)={R\ c[[)-Npv璸] (xhŤޙ>+&₹yt&{eA7op\> ^Λֹ=X͐]c:Phtۨp0;F[w>|4'(ώެM? cy/WڝoÚ_zbuKTRLxoߥ~N[_cݩ|^)_פ3ZӮ\'© p8fUsPW#~O৞Z<gO;z5/{%(???ł B9i'J^ XC:^(r/wмnka7om(R3`dg5%l6:('5(?αOqvp[jh|+l3/$SAwu_cᏱBVOYK5Meqȃw7ə:,+t>KD@ +;^{Yu9Hk3WsRkWRdmdgOl٣|dUZ0mY߳6w&>i,>2ّr{~>=\igLFl6jm\_YR5_fqM[ 웸cMWkVc"3gp;Yg)Nf'e喞o_`HNX>} mUr:]Bw>ibY-׷7{5#HV>q7Ǹ /7t_ Aԍ~˟ef y?U|^4=~Nۉ'Y{Ӛ?5'hVb߉n΀w +9XmVƞr'g[Ao.&tMIBXfq^20Ƴ\e[FG?Q&y/4KwG:oվ5}Ђ 8g~iy,<G݅{)w][toG[5ŶN?w K"l'4?ft]c֎kr{.tЩ3dO%W&#h 7n?\|D,9ƣwfK=sȩIcg{a}bT}Nv~c? }ϡoE}#zt[|H[ف|3^`C5F7[󤞚՟俎Ky5lϱ +B<{R_c^bϻ/o{n~-p3x/K1xמ#2&(C1ڒyoal{9 Yo7XѐLmR3v}/wŎwuEdW8I{6gmѬ-sC=ҥ =O?9 m~p`]U»3?)c\9;]ď{~O@>aY+bH3"8ܹ^C|&@"e8xx|Qe_coU ҋߤKZz>{l~ecbr=%}垲}_͇.۠jvd9}H=)x"_C._&/nLwON`09?)j +8zxoKߡˆs}aAޣ%l+8&=4w8|~ޭ=}$NR2^[/H]q,~sdS>?|Y->ڡS;OzjrSGig+d5zd~w_ԩ7}S(Գ(O(jp\%mɺzH1G./q]n8㝱=&bu9 aitob5sX'X +5{e?Z ~&|[(%ܿ3z+bO^S>b2X]ء/2x_ǽ}_]nsU]̎g~<ǸWzy?2]gSntq$MՑ] \䡝K>c%?=5+e3,^c1G$'|}sYdf)>ӗݒ5a|f~Ɨy]rnYk Gq1< +'w۹;{W}VFKG]uF:-{rHf)cAyŃqU?d_cnL_X7;{RcYʿEjv5bc;m>C_W2NFCw{ yN9KhKN˻bÚelsoƛn%3 ,W8GѯnOゲLvO;s]^M>b:?8&-sgɃʸebzە5fnOrx\wj9Ϡb~~dr|`Eߊ0}s|G]su>Iz_&י̙<^#U˩?xO2 w3ӫ{6+dߙ;ӣ/1 dvFse169k{=,ecd,F{dzviWtZbyKV +5^+k~c~sӳcM3\ׇp7~~vƂbvuءr5oItƄ˦ِM[]V޿Poɝo9ko)g9v7L.f/"ӎZ™i _s>1ggLkN%]έ̹I'l&,󔃴71x&asGVuQPk{jbqM\gT>Ӯg_,~&r6%h{播v~*Mbop+7 ٕ;ϐw;_ +νzHaX.̈|zz4ĕXp.5XfgBm?#F,Ln/q B/ zb5/Jx2g1wg)ƒ; [O0^P/goWxlT6]wq2Yͥ-;|d+)V_+g(E|f0Y|٤1> [1"x <TΡ5{\ӮeEet_sPpO^~サdZ֙ɤ[5>~Ѳ_x 5zOeF]9I/p6cMΒ{b%cmy>}UpSw"xcd{ zژTmk1M;ϥ3u966N˙:̚qXmBA/r{-?{q[:ԃo mz.ZZW тf[Ƶsj|J{lzKϷRT?}՘\ֹ,Vq49tK;N)=rirf9~ޣ⤱ٌzfɞl~6 +^fƳ)uڙI|:Ie cT)cpHq /Aw0mw k+֍GЃC48ڨO_Js&dk%lʻ/|d<2ݜ/ssցexKd8__c졢>1ְ[p&IpXk'\8;w&|Wԋ) G|]WiJ伤{.saWS~cl4~gy&Sif? 9w#22 j״} g;+CO5?3=xMGi+Wg|6EO]{wNO6UH߀gkkw]i]2\N%%2[foE=n}=|W*^/:)e}K +m-Pgwd9n7O3.J^{ -qWϼNc/jXNYe3yO۞=U+08%{ +^jxĭ'N įyy| 5ೝwo_k~!/^'&k1{9k|!%c vϏ+9΁s ٗ O-]S<5WV<#xIS_Lo}?t% + y2IwNw]ŷ眢}mq.C=޺ +>KШz`9EׅAssuj[=!Oqz}Wg:W\]g89.)Og 8ۃ%p6.q~C&v>2EňMƞ/C_s|sqsel u-h>k|Śxv lMLm@2|fIW,)^)Ob=`-gn٬&F rWrymXqd39J'krk?}.s(Vfe U>2@M_M1s 'O+/,jcvmk]ncts}*wx} Vt< uoSI=יm ^}8Yqk[x/>c?({tsKg utU{>n7k*YA5ZAה^{`_ʭ~3Q=sx(CO#OwO7tPrvflu}ȧ=tsY٘35-t.Ì<;>"K֪9}Pڅ8oIM;S|Wdg>zm7W lM(ݮ YQ|Z)G$GT_ }g 9ґ}H=sc?+۸eO|gJp ,܀ߵfVn6?xn{TY{8@'_O]l hfy+^ۜgÚ=G~皿<6MMj+-~h |n'/zzؕ!G^[YdOYq|1_3?e5k[&o_5cshksOr֞&~^] s6jmYW4 ښ~=zCbX~Mफ़ȎscaT$s Tz҇u+sG҂@6p9K\b݁dzӜu]>[`]>cnCdxUkf3o<)k k>w!ɷ܇}e 5j] }-286ޕq2 ht+l!mHͱ}.u'Pq2}T#xWMe/>9ϭݍ=h=0-sPQ7ƃq@M}ޅ2Y]#sT3*G$6AwF?ʮi >ysC՗]zgQG}ϩ[ӵ+=oaX_߳07t7w6zߕイcqm>֊Uz&Fݼ;}ſr#~2zy?>̪8an.[ye=Ɲeӵ^ <|.,Nᣧ2;)Nz[_9+l71},lZ^o_gSRnƵ,zzMZ\U |w.:t^?_o7'o7 jp 9]qe|fwgfnuw{ě^]MR4DLSC@@$j HU£VH +%T$qr9AA.mB\%TE:ʿfvg7u&܏= +Da0J `x{|e%#H, mGR:,׉ Z ǕN:vu.\|}bk7<~G_|qO| SCc7`9Ml|8V1-}qJ.}Ϟ>t5{.qSm +)pS&=`BFutOQnn.Jzܛ[yɏX>Y>_~xg,Gʟ()emˉAF7G`{6~ "&5g[ʸ\-JK %dypt6m8zu [RX2_q&&-~o ίj7unTIi32\)pO6Ue T]ՍS=ŴG 7[|q#kǓ1Ӊ'q7\Օw!{Pmq(yw7q8UɃc|PܥT%"]p]l#\v4׌š[W׼8&<$\t1qH.+c%41vs씝 FqTRJGGc+EE m@^h,-:zTwC"Õd0dN/.4[cVr@#$XU"JdJ(XK?eJek;_>\· ?&nj_ ?7Ϙsߘ4om6Eu@~ޟ'gcJjqjجZD +AZfZ\3KWţBZq: W.XfHRTꆡ2鬸IQJ$a"Ta2K]563LTwk=OJ?Wx)}p6}6lb<}sC 8(8uAkz!W 7fsĩP{../p\vZ +YɩV +P~:0m,YϬ bBKdP.X2i{ɔIԎG ĭR>SE)d9œըOk޴&>'̻ +^WN‹ID֦#I2,ȥTCU-/ӻY=ОAkIħMPx.圂|T;֖r~pq!?iCV*YG SYIP1PB0M:[3Lx&;T4@ 찦d?3jtC{:YF଍ZLUA7y#^ |:8 PH}ጓ37_to$|W[l2ݹ/efkl/YU_E`uoo\v8 yz82nvw{IcSg&"ʔRn*1G~8i0ӌB<0ªsWXTb&j:D`I#f7iaku,Ɉ;1X<%s)!棇7R]^2-JS_K.w7zP}M=>^Q?IJV亀(Uϫ$u  ;ND5x0Q FB /DtfMVl} VmjK/i@xImK{aeEk5 +뻲hwz{ ǫ2")*^J@p}?(aGa>Q| &oh/'&t|ҟirvۺМj.1* p9 s+aS%S zɴ"3+:Do@u{[7_>1x4÷{&066)xVά訮c rStD0tC["ihJ<%=inćMA . +K +:x_۩ 7W7y\#>LG=ɞٞyY-/IDcz1"T=01.G vqCÙn 2GۋF1x@uw˷1DQF<{VXAȷ`˂*9O000,_,YAC@H`BS{(/RnFҬRaK)R&tN lzfE 9¾Vl/[7ɞ)V/z4{Fmy>Z=z0h_ +25D<ƀio֍w@9xtO}1=M;;aB,r?GDK4D/E2uV,kac1 cn}.8='Tԯe;غH?}(;O83zǝݝkއwv^XTmR@ir~@ST-jKBҴ +C Q  ?jbBj6!b+h)H8 )j""j-Yݱ4|9{)-}ި7S~O2g:w|vq[hCX 7=^HۚN0f4Y'Q!q͝At ?*ʍGזkka"#>9N1J!xQ +Le]Z?헪5SÅ; +X@??#gkqI%_ UIO.X[AI q r:P@>jRIMs5Ř;bI\} hMY kl;1T6>_M%v Յ2l?Zq1> }tCI/^ <{^BË]/!ꯁ_wD 55 b8-Wd@sJ[ҫy$he&3;Etq8d0SaJoJ:2J&`XB23c*^P%uA%jlwgٹ,E4dQ äO2!mug7hx@k%d ^*p'mns:8"@Pv/xS.rr'\Ye=hmwtW+1=&z.Nx5Phѹ("V./I@*F;LiƱ.{sJ$-}JOmRgfjܝٽsԎWb)!暁ĄR0{,ccFE$*]ǎD =ѩ(']A'&goQeKh`]T57npW;J]O4+I-ECzOP[:X>_Y3?!%\{;/ENFޏFcy{YyS"(9HPDٞ @dXlb(cNy92@M[h+g0 ?񦏇𸆇hxs-xv>#p0`CMe@!-0j! @iۘ)(9&;e%\9&j, O1W^iB7Q3([XLIf4v[q%f&mf@ž\irf t=+~$1F C*\"!᝝=8t8>`{[!C\.P5"$Hy3Q؎<|G.^{y%1cϑg$j Y)¥6HE\F(0$$̘~I't otA\f C2"l1 wi #GwuΜ#8$ u Ll2]}5'%wKf +2BdCMMo\iifKE=oUʷm~|:qAD9cYxHTrfndPhSY="qL/Htt@``%4 keU5 q rM_^s7P5yJz8&YCDEi߾л +')EE?[𳠌_ٿ!_Wn$]ޓ]t}IG#mt;6!'C{"t8_׉6U-6sfv.gf6{جۻq\r)8"PUMU-iD(MZ! ThIDy0V[qCbC)B+^<; ݙٙt'YwW ^n`Sdqx0xg] IjfzO)Wfl5t&SY(0væi׆8:ʯr +[%"T畣`XT)]$[>32i][]DD2 8phhqsOCZ+pѐڶ12 it5׾j)w/ GƞF#t;#pڷb<1 G?$*EqcL$ELP=>l_үmw Q:'{fˮpb}iZG˭LZ\B]93[>6yw]vF,+7r jg,-/}VY%i"3Og̿&5%"T +UY-HBN&6;0˕ʵk"/zƬT)qblȸIٷ)@;246BTomx  :|۱Nfel߷W֍Enh5T!=@j}!%c>2<$ɣ +a˓9ڶxCES̋E,qK@0(M6M)(=[. +j +(/pf+ʘ1ۊkܵ3⺨j%er>8A&Ȥ?] +uy92Z:j:Q}JU%d@Zv] mљ>VXcJx{>@ .8`R 3q`-8<s xwŚ'ou[awSG# A/j.^3@=L5MIʦפ@ 8&Nsaڼ]hU׷_\''BeT$K"<[9=OiTI47z'jm֜'P`'khܵ<G〒qI +C5~ 0veKʳnt&Ž& x\cUؾh^5od~՜8U_z67Po,W#=z*GP-p{1o~?ɍG63bIyR`fÜ͏ET _ +oiq0 {ɶ4$дTB」+5;kD"!OIM!Ne(Ƙjr !8b{]!6!<6dS[IX!Lln&2i !wp(QEm,$*zb"qcO͸JCD`P>Į,rz(ޫ-6 sr~fgwvfg&zcul7t׭hIPJ4VrV}%. +*\x39n^Eof-boF7,5u,ڊ<\l+:70\Iزtv_?ä W% n q.Ȼ   @q<}y 4KkffnV|ߏ֮5m$s6`E: ؃ܾ &b wUx ]@.ўiJEf' (8"R͸EdC{hasx,X]hB cYQ ^08f&;Gn{?e_f_ge.x^d'n=LU[%ەLZ@K/  d~~ֿU2~bw ?ndN3e;\*%qt4^:Y,-])+%=!t +ͅP lۿM6 W%`fpv~K`~gP\AM/L}vxpm85XOxE\㣖^*i jX2.lB,ʫgG I(* +b}DqVUMyAZy}8=V,1{vo"(TRA-ߚ9N}0 }Y ?z>M1-'\gɳҮ/K4w@RXd$v3Bt 4aE@72CFoF lEd$0Ԫwk<\DeVYOzA&,޻5C-0W_)v񹍟G׉]0|74y\%&xcD8, Sy.h +BRtvHbbLuhf&h٦u9 +Qܪiuc_}PFef#ٶ~Y$0 ʄbh蜇͵dzr952KsHTվE MK_R<])^oRIIc' Arbp曙\s-h:+Kf} KUc^ ]7ow]6^oy%dVy+B50Q {S yD`xP?H"0x@SHpʇky cTT+Ks3sQCn$({w,ӫ24LFUꪊL\,(r,ʓڈLS qSH۶Q tԎ:ȏ +s'IssCv'/r6w(2t-)] u Bx:D.\#l-ǂDhf@/`T˵ťH+w|H{p÷_\'LQ?}a#-,@DJجrf꺓Dv[|bXQpEO[U|~BwE +A1F ـ5'{VpŸ"Ӳ#͢,j2m%ZLFG4_h+ ;4tsJKpG 1c؂U0Pt?4)G׎4h:,d 7R1z y[֚y,AO|Jd*>ӡG(*P$wxN+WTrP?F)cژ>+ROg3rA ;2|J#x"m +b[ CtdW{lyvv|cl3w `Pܒkhi +URmH4FTUE@V(DDUT(}DUhRTQ=HL|;&{Uwv֏t|+˛(BshP G 7b@l;!W@ z2jс(8=@q0V<1mЕF1|8|"|~?|JЛ?}aM)%jxz V,q鎗J83XڠCauTݠnUOH1ӺUHZ T)8#^A  xJ6x̫"nNϳ]2?B0ІL@Ϻ-vҮwIc`=@'qJJUY1Ԣ +hK=8te<Sx׃ /:ɛ^]ZJҥd~q~лZ! !4Sr:X9d&ik:stȚNUޒߴ܎ xIMl{"@b@[$BiZ'}J|ҔL ;Fth}|'e^Ah\.ZeSU%'iT)@mM$N+h{ٲ$`cQO)@ټ'rd/UT%)چCՇ|b`5P@!2eLR|D cJd#+K̵Cה7=9?Vm(/(_EB:6f7ߛLń`a5,͌y&)Q_1 YwpQi P%q}kNև`7۝Za,y}~UM5m̔Ni\I jߡ#QozΚ|bOV'UGZ`AEsHb,cJjae$D +ҟFߒ. k,'V|Q[4ӖM5#!G.D^ҤHM4ωf\LBJq*z p(9RrkJalz~;Eԃ9{tE0XS8m,edbu}Q?B[P(3y4*`?)nB|7A@3ɍM 'n\gh@ iЍ V)JM + G +r<7{U14/1EƂvՠ+XN{]tVرׁ yӥjt-|XRE"@+;ѹŒ/Zh$;pςM/-DjXvR,6ٴ稦J:K*][fP lml#@_IoO3ť.:XU*Y]6vB-5FB\\zQ+/ZU]&A! KD 2U[CbzX>!otirJ$We`KDž]QrOQav YL'vHѻ[d$n&W O@Kܖ~CGuQw_ -4 Whi B_W,K[<o)@b/|ЂL;Mcۖ5XUM\=[JNtOĹMŸYVUIz`V5G"a(!rfE؜}>zzXV쇷]A0DGvqUsggܙ{Xzw+$v8qy9"V4T!ʣHHP)H<~ EQUBxRZ sIcs9w24D[.Fg;tHeD`{<1:Ttq8.l/U'SJoBWHɕ m>^S76Ű&K+nju׾Do ӡ?~O0yJ{2 ۯ\n'3bk^7RA6A,et޼:_9zsDp<="f[wxZt 63ɒ/\75\d;˂n&@GݬkU1 +¬ˆ4 + 3}Q[RKݼ*Ղ<Jpe`j`\c +lT}|݀Ⱥ?_q٦Lb4+bzyAcf}R +RQ[J69ՄYq(zk<1#+shkn)~P殾_EEYwIg1&*UۡްVqumL@Sڐ8q e#>>?bU.B {u`ۡHe:i(2/vz AU*G2gjM"/1O{73f!dlrQ\ji3ZNq)u*XpzZfb][x" P y8AJ70ڝBQ0^d>I|ZeEYYR$Ш*n# ,_9"yʼnU #iEʗm8ߪMV|J%!;橦WctTxO&{P + xn0CN|^xO8=0g!k{l4g^tdyTNkfdA#Z՝[ 5ml6'SӃ} K)^XŢ U%|Ea*2w`#-D^͉:pG/Qτ02R52KӊW@u6T'²##'~ +.oqRm|#xsf}܀& ^6muJkqZO45&jTaޑq<299gNTV(f}^ Z%T+Cc1ŝʒq TZce%r Um +y5\pT Hf~N إ=*K睳߂mǘ ! JF2ELSt-:SF!'v&+IÙ|ʠ{30t{t)P5b-{Peꊊ4z9/`8á.̑Ixs WܤYgf+ +4ˮY4yz Όj_ öPmdD·QP?uUօ1}IKwUBH"⇮b+>M;1<{RhJv99%àvDGZPMp +):q>eP`DKlATʊԶ5~A8 p7 u"Z~h"ғ \uYPB]`W"^7$Gs4AOfn%1٭++kC( M^Y t;3]nq\uߙs\fe;{؎ln⦉]4Iim5iRU*pD/*x/@xEBBA:4B!"B@_L7*zRugf=ɍx>xPidHhqWRjENO `,gUN|~ڽǔZ$r^7#L^H.Qx-ߋ}L pzc4z.|蓡\7 yK4 x+ݦ +jyҩ`=WC ;-]"G`<_sk4pst>+T{@k9eN)bLäHRkb72 ;l|!w-@"w@כF5$[ lzjs$;V %CKPO*yFs.)#r<6Myh2sRC-V oak cmI, کp6jD<~i1luEn4pCo'3JIDÒ#SwKaZUjP7eoԋtURudݶB1[ &8-V1nj<0ya^͆op"nߧ rה[XtI.y%'xyA^z K.U]AKyC?vMMcJ}فKK=}k0]IEw])ϖk xie"hh9iԺEsG|i5$4bHS8 Z'׉'Nr:?rHg U+D Ap2G8}?np3v*]{4ckXC~>c3_@=NIp١xuv1>:$cOgŶ;c1T5/9b1#\ԛ=!C ^llǑ(%Xd_p/3x~6V6s">4#x8q[m mPkp ?m0e?&جѵk$%AH9b^S}ŅoK jxLd7I}6>:˔7@߈N P|sWAVrPw`9ǚ(k;lۓ,۝_9"[odWST!ͼxZorfE9>@93 -792Wq( +ap\DІɖ|9hbloz +ط@իK[5?Lͯ. $Lgbjy9u7rHK(cjl8(޹7Q>N0J& {p gt[Rgߥ<#.vQ컎'nv$l.!C"-<ǐrz4{|jJT (k|^`/Btyܟ"}OU=%AY.]R\^> J\b—CkT}T&~ +mVQRt}\G+W +WV+'+y˼X}i`G+I?;D\xpJ! ?e#Yާ{{gsoGInQv$u'Yfm"=-HDor“'4 庻24x*8gHbMaGo,l}&U}.g3aC0{d3~aA(K`? +6GZScu' ~W%|1$oh mX P#f3 +ZrmILrmO4nfel퀒ʫ* ~bVNh +`7ƿWdhs}6ޒDn@6] fF#ߑJys5Lˆ?luN;LH+jDXIqw^{fN"}k@ BB?G5u!tj*ya8> g/.,nE␄٩+'Alx Nԯ?&[[[.iQQ!9"9Yh-N4t.o36Bun3'|FO0Ź5*-Fk0z>F\oxc1u +sO~ ۾Z隆x9-VE 쎒r(_֜7;ar!8ω@w}ҥاMP昒Vt~$>Ԍ s$,Fl!D{z| "PqtHLMM +}mtԷMr.Q'N~5e…v  [z90ؙ;alǢLҡį ^k˞$#.Ϣ{cZZ֬aBJ-U,ՙM3h94El7V7qX2 ^PĠ0`:Ö(BWgLp>3#c[L}}axfE?G,T?5ocCx%aI7| ;d9z#hsW6]kǗ u5;$?uһZe_X 6 Y%{|',Wmf/=`\$~J$F7 V="'Z(x:(j2CxӼʘ`?(uYuzj6qm%VP:l$`Z#nZӼlX4n-@2ENϓfκQBLP2|E@b=-9 +~}dh枢Ajn):B2"Ý׮RaKrWENpkڶ>7lI'uJӧqVY>#r߸LZP7M4lOvU,S:߫.K(܉ GN)HϏQwy;'I% E}@2EIU]q;+g)M]p>X*O{O{f>}9zc=A@ܑ+! TuR#F'eO2>4\ª`_tʉ#BZWG3G 6MZbJcNu O8 ઎x-QJ&#y(^߁N˄9p]:9h* \6%Gʁ[[P΁(FXMev;UD[B@܁oN!%4fyeK*=R:P2+#eׅ.S[ %EK~c ޙEazO^&%=.fnug>k'{Q +ڷ{a2:l}|\U3;6Lu33;WNsOaOqD=#КA ۹M\yLf +\HC}@'zһ +HVnH"1!#bmr2gXBrpLɹE'i17V/h}8ڥn"جK<v-|&Gtv4d2Ͳ#Wfҋ6-?dyQCxH1X`G*jۘɊUָNh$]mVPO$˨kFƹw`'o Z;P@+TTS.ّ. 9tn*"}%1^}37Zhv+$cݠ;#nW v*<5~`bq(埅S/!2_C)&O0!⏁H>UiH]Y,-]lm l"eR-zavۓY@==B{#ahu{;o2|aϺC5FH4QC2I3YLCi+9OĉD:v%X<˩ T׫t4Aq:u_PvH|ėN8d1\Ě=nHasa|ȴ][QKC{ '03PX3WNՀ](ohN;Ԉ^f8^l ?IIdL ͯII~p?+ h(T*P:ԙ-{V('@8NF,~hˇuZ>)QZMGӛjtß4HtH<~HnU/r&)嬲_CU>JR]>e~ c?evj}:Mn~.~FE тj͵v=%Ef0Š 42i´=Zhtg8a2w{,p +BǶMh>k˞@F=Z؄ukfԚNu&Efn]7w-v{o.*Wr-yGL>9ϖ;wzwudxR='V!JIŧ&m#փ>W+ɀz6jviLlD4bS?ShYAyfWVR4>TR&+5T҅@^18GA]m @>k-cDC44ﮯ"(MI*>5"oܣjU'?Ԍ@xϩwZ,K}h$ZWp@ + 5 JvކFgQ )~"Nb `{͞Wo Lt}7p%)$/qM-K,k,:~)=)).lWoWs̹}vvvzu|YfNP&mXD%* +}@P(UM7XEUhDٍ7.(D,b ƒ@,s Jaam9(r@Ym4[1>#5i$vڻ+# : *EY$@ۓw:lN9\s( UC|Ϫj~'PGB\gd1i7H=nJ5Bsk\oCw%RN`:i̽ 1474$i~4DKt>S k'۵kל䩦ZVnLMW )!׮RPoXMRNSZg_&&j8+(hz "F4|l̘q@8i3 +NUYĶRyĚTJA%ۡzOătdOA\1(=sHZ n!g4|bC?u <7B]p1{R2x]!8OkנPev=t)O5^ $YyJ9(w[Lnb^|dMkxܥ DNLѼiB\]$'S#[ c OԪ^cmjڭԤ&nM , +7ŶʗFuvHU>ăAj7XRp| ڌ]Ԁ0;mdQ²F V̕a?OEoť | +z@mVY$ ֢U4Zu^Q]X~:s!d|ٶy|`otK1*ydΦ~M0X@j:m`׃rA7 +Jy5=ɧ<|FWٵ\=@ehRY= +-"ẻM'Ӑ+j2yf.S7؋;C[1-*Z_Y4(&Pu}bYY{~Q);ܒ ] L`6۽Nkl朤.f5A4sc9'Syo갇X$KEdRyvh2t :fO&ĕuE&=hBQ"B:|! M>!oqBwośjg["7m#<>#Mq( C[nCN$^dx8wÞ<7 Kbnx y,Чonp1G,dՠ"q|퐨G ʢ[8~ $ṭ+n=Q0nC|\!yAŞj~<3:4YC0tCVH:$&a̡ { p 1&loW̙srΙ9sۙˬw^߽-Q +8!z$J@ZZZUЀ@Kԗ P/[E+UBPxHH +*fQW#}#.F?{75Jh6t1bG&&ɚV{( T_z)E)OHo*'YIx&ϛEqmBͽ$tEr˔D-1R|AŶjʑ3eR)xB\^%ԚZM]6Xv ްY\x=rKҴ 3Y4'Zc˨R\D~l7 UsmnaSj&OQ Fd # tstYZn$6Qi>g4{dXuhFpƶK ,l"b;AFSWk رv +M/0PJiiC?!Ww nFVeuYhʁ:7t`Jɍu`~%q]k_h^ZM4}t+'0T@{e\A1OO .C&MzTʭ+6M@:9#`!y%5"Yk/&pP!^"IkkpSdr\_~T6(!fY*ćRpQ%N1Mٖ n3+{I;HQ`RM^+%io?Oi,aj-xK,,m9(Ų.TF<&2aU\J4HW/Gݿ3_vF+uFo3.r1)%<;ΡܧK8/ܶBcAը?t1o${>ac $qXM/5gm}B٥rҕr>J 82tyb >v\Y+"~9CjM&M[0&_1BʼnuxEɏoz ̣( #8)c9Bxs>_ujD Y >+s9?|F3=*"Z|E9:ColqPK׺B]x j:YR~]]XөL͢n%79;_vVNXVS' I}0[bCυǪ=O|~S9yǧȅOC7,Bt:M{-=؇*YiZg](0K0ap!w++JP\#epZ *zEaTu)gtFa8] alMޑd˰P&1zsj8{[dıgõkcYr=GbmμgFq6A?T&ڱl_;-ᢃ¸ #V+oĵܦϟhjsxkp?dun]~CoĬͱa9uϩD9R*ү|+YhFXٙ1%vmO-3ka-`ОY̡cÍd_TXr Fԑhtіۃ+֏)Y2:poPۡi 1L{*[}CSBآ)V YOχڥ"uА$KkԢl ~e:޶4VAK\dC v/8k:OH2Pɴ ˸³quFq\6 q'jke]Zn2a f"-<]f63`Lј:6Q@FrrZ1&LAI8eí#Jlo\uz7W Y\qtWYl\Ws]9wy3c==;^je4钥&dERQZ (HPHB" +RAx!" ;oqriʾo8)?ڗ%HaǸ椬c@ +fXpP)l <ڴZzF_P΁k9ߙ7ᙲ"thbHj^}?NtZ%4>Ftچ>x_Dה .r1 H1'PMMY{ڳ $3^L(f~QX",W)svZ4\KOC`MѾaԺ`P0ʕIn^;RdMUjaKEХfzzPf{P`| N$e"j9Nu(CicF+,}2 Ka<YJ63l7DS\a%hYZR}JDv $x::U=P`99jg~NJ..JdZ8MeT IV +Xv \yzgK=_揙x".B5=-2M()7oZLEb{s]pӿ):<7AnwGqgŢlvB&N K+]Z5 BV1Wfd:o +n|̯b +LN}>XY퐱Z^$q#_ghnrbhr 28p#iV8rb{r& <+KvٷY00oP$)oy%%i6H{Ldt"ܿH=wAG?%Trb[[6y>?#z_֡o>BT8?,-_1LnϞҘ9v+S}^7e{)K@!R8zLX Jg3(t8j.rɵ e&]cG2%EqHt )46:JAybMtۙEH#M1nE YF s釉|ذ<3""!%,}؏N|g|B]yɖu}E*4*eg9l2rxTʑ?E_3(N}jFq/Nj6Td:J ko^cbz6|nv veS:̪U#1Mvz'kp-RK{w>6E0J7`[ $|Ә6VB^7MT|A|~j(~MQ3)XͫLF QEzߎ!$+ 䔦p|ƙqT$7pn)4}˦W6͉F3j;tTuZ8Cgj| vw1tܹgB564痠r9U1Lפ ıvh]T~E~dz_CR@bP}ܣ~T Ap-j=G=٬]n_l2Q4r 1IM/@.4;OX'~ z9A:*zx#v򋪮EpyґZLu +]sl skKӿ }6d^HқK{ҏD ܀y`^dh u.hsD`Nຜ3UfMtV:f?Ů/Zݯٖx(;oOWݹKpcpϫ\T}%8Wa7\ מԠ''f_Uq Fvk4c F2 ~[;Ի Ύw9'GG)0RZryafZhɚYklyX H4h!z,<@APAk-!5;w+lw1zP}l\"d͘)oVF<Lj!ڂV;KO}+攌]Vd,^Å |0*78Tz*ކEco{scͱ;{{=lGzIM 9j&%QDi ! !(\ʥ @VERA(BHE#|:v[[w9%cNkJI@qsȝMe0{9cS(Nm Z)Lok@Sm/ĘcjnKuׂsE)03z^GFBB+r)p^u܇ kbm$ؠ=˶ӊp %+1q(ǕhsZ>Ǘ;@ğ9/љ1NqU!HXAQ]\7LB\A}2p?t#FsU=0L8IjQO?اUfD\V;ynVηrP 2}=fcOfd/qC,ЦpeOqd6pH9,؂Ud&ɉ{N8xB_ZI%P ]_KJ00:Onj)Z|FoyFnݮ]iKt [L#8,2Y#P[G1сDž3Q+¦Y^LIt965E:?wӒ.l:A:VI18IJeVDOߑRdh<-?*l6*lAݚ]owm|J(\ϧ6% ѫ:xsD!z \八&Kv{ʗ?#RqLn5ϴȻ4ڛm3/yPo:ܿܕw~uJr֔lg)g^^&)i/L֖Ý9dOL7#֬JilF՚!=Thc4EO[Rn\tpkFZl,k|U<QL~K) "pP:T]K;eOu8 Oͅ|m z QHns@NrfZQ-$.i'~OɒuMq_'Sq r%P@N뒜]7h +=z>Hh*x 6EޔG7oQ&sM"*ޥ 0 8YmP@̮zeG$Nf-Tj3xC82ઃ'YFc){HinW-`l ? t>ݣv18@VVszM q 0!E00naHD {*,e7nci{I\rWB+8xxQ^+Wn;x<lv\^vEYׯiMz;*8mƲ{[NU-\Я;Z{ +4#=B?\7GlD4f3Y;]+z!Њgf =I$&aԌ8)&+\\23UJ +?b6oAۚ:L@vcPϭJ(>o?ن^>ԝ p3t/`_pp,_/3>Alq4dۨ6\/Q[LioH~ )n$un4"uĢl gA ++' Ȝ^} oxX1v-[l~ki:c~}%:(! -*;τ3ރ`{Ci̹90.kxqj~q>]iP +.8G-pv#9Q<.z#XMK4}w; +abE$ m-\} rj[Äz!Ou/|*(LN"S(鎣iBFV-ޓ ߸3Nr3վ]^Ȯe;vdɆ8mmā6A0 +9E饗Z@Ks) +B 4HP 9DK 8a +]ZPم/8NH\Gة^CP db!S9(|xC`t-Ѕlx)p#@O]w6Ox}04#T=))Pdwuzp|Kj\w8,qG²{2z7<>1'$h6kn3;xs)}AL(0,JVsJ‘suh:nĜk:&7GeiڱkPT֫MCE#M_u KsMɸ+VUǺEunTL7=+A}+Zt$#Xs|mnbOY3OQ50YU²-UoK¡6|%_*J&@ n=W;ʒbY؅]:]:"Y+ NUyA9T7'n/FoFQf_2|֊PázemhuN0qr̓,jeNHjI!\BchJfֲ61PXWaa^+0˖|sȝ0 +%ԭJ +D2wDK+E'nlR]1^Q҈e]h귉波NoIid V@\0kW9i`Ύ |b6c#`3hFŁ}bXM +Zk;A'*LfØN 2_b. @@/aZdfR(|{~^OrfiL5,dQ t ^$A& RB&xU? D#TvHi`lkK!/ش`T9A^׫j3+:̝Tz +vV$ ͣP}х[#?%R} g y5ܞڌ|tL'KoSPNG) 96~@MTG~DpR%vc]R=K<,wW.),Ɠ97&,>Pt 0V*!#ҝj[}BD..(~. QpCǷxп^a`s4G\HMt:c5o//QVZPq[a+X-kq5*CcHCea{="!~fX +Ql,KFE#+W}"'*ĤqM-_'KgG;ϵ.0)g<>便*`)_g@ +@ж6MNu'=O\*q.ڹ`K5^d] r>y'l_[\sQ +6Qq~{F)V"Eѽ#(+vAݰIGyq!!hc9^N6"1`P ??ؙLz|ՙY %UoPm݆6Z@"MT6QTNxBrLjFڰPHvmy\ZhσFy; 2ko gՈXKplpc jk⽢V]C{dM\잡tSw$5D<2fj*sÞؖxqMN%6$74R&-k0`EK(d*U7N4%ۄ̓׆6>>Xۜtcw`OAFl'Yv+`ƣrnd?nZ=C uigFq8^KuJgzRI*/V塈8OyB7m9zqE F9jp#&ʫ==*˭GDƼE1~M}7Y)(JCVI^Y~X뮯U7q79TLN W] +[,v稒v;6./:Z5цX%7L;QOÝ}@J1W2I8LvPN&,> ]$^J748w}̋@z/ۡo{N~X +]ѓ6Ncݩ2\{"‰J:hۏ ^Qcpk_ ZUxj°6|RzFDr,"#~`# ^F7vSds\c-N ݵ i|oe) +˥v(M+FRcXF_snj/&yp|6{d8Nb!Qv1#] /leyV蹦;V9]O`z)(>3ĔuFrA@h^ZIBektq}7TB>2+@Wqm2@?;poHG1rC*رf? jfeR |)ի +GJLte4%"`gNkB[`]%yZZeTMđlgA?8)~.VT_=@*;j;NcL/GnNThe pl^?iS'Y$.r[YeHݼىI;Z5nZ +pp Af*oUq̭1TEK!6(+6OӴ!qPpqUM|~p˰ +*_ 0er]ٛ؃ P.Vyc) Dv:V=]#wv4?U{CR‰ >qz]rQ\j]?B7(w +QDd/UALIc& GNi{ΊFQjΑ>^ y i[|'|D5#,8ڲvqq=3=ϝ><`?dÒ+@ɉ!8!C,('x NU쬔VS{}Ws/.V3goOekp\i"6%էb<-mJJSg*KOj|M bPacqaD{6N1j'!Va'`RI{øLO [E6YCk9/^D= UqC ")݀ +)ׄ-pJ PYӦ T@<>k#T-`(X8=C9YyIh*9( v%cFѴ1Οefev7yS +(6J _Μ2s,TRT˷_ #G=|>5)4pt_f! +$Z`(egʻL:-%z𹢿D*.6ޝ9}?N1-iBiKBB + +O $J_- xQ-eD-:-#\* F턶/Uï <]Gr@}1$. &*mHTudD%.L1݃0XWcmFX:ꌋ".|9!Qpui_|3/)#Sm X߈#7YD"Ij3nhouU` +t{nmǩ\Ө%\=4^5 6?%H[]?zXKa3: +o^UV(ƃg,`V<U327f(Gm/i>Nt\e79۴{Odt(lr##N _[^ta@Vz㐕Tdd\z!/!-7FHV՚Հ*&%Ա|%a/ nr}y\щVNyNGFFp%mz/WłW(kgBqL͂!mLŽ3 nmm]ڎ; ?^@[ ^tb}H\d"%NEM"?olA>xKK'+yyA{|x;TS6 `B8F5r5{uFl-?uNS fAXWÏ9>w&j +u 58lc{Rx418dB ԞՅ@~Vjt]m]>#$ĎkQ( %#)5n` Vrvj'Nh9R!lzC_,zA{8SwPT1gn2ƷW\97A,5zߕ :1Eu&9v:fE5 G~[ O+=(' ;DdZ'an_< {$jr]- >#K0. HV ,xlWo Cpf!9$w{eIzX,ؒJZ~H #(E>>I[ z+kf)=4mZ=~>$y*z荩:\ca~U=J$,x v{PמnUM(Q7Γhm~IM*oz&JbK-adz'=Ml”߹2 wU3ꤡ8&Y@hY@to(q |_tuf +E.BXlc~ff:D Zn$1c/=t y2&fTChk`]Y*x{|U33pu[ooZ֣!g*|e9sabwx$ڸߧһ@=| zOye_EQ QPyU :|R._ qҕ.Q?='bZa +pN>#o@0`T8f,Hz>Īi$n-:?~kG!Wwv)uD`(Xt#S*לO9ИI֔Edctm} VXSFCԫZC .SiS`:#;K&G9]̒{ylgEsOhsEw™IZEԋX jXQu vz5Wc;.:lON\ɘ 3ZXJZ4bѪ ;_\QmGNZdmYvdrRߞ&Q&_*0kA>HY$5(a kc_+@].80xg%Uu&IU@9,K(jy +J|`&$1={V=wq[ݎU3gg S˯sDg-fm [dMWօ;u*oLlM\(*Ć8Ud j5x*v v//~7[yF5 ]NlB4m~R!"z +{zsjQ 'oT,%A$L#8+Y޶MK1 +ɮ+ATZܚVmXc{8ߪQGW%5P ._A}xD~--'a;߭XVO.={,ڋXmx<\1 MS#`-,ŧ߀ciM]ZW+ LmCu!Qѩǜ=y)~z9mq.R_@ \f8>֓cҟW0FH=~|N{#SFq5:$5kF!'~mG;O58@c,>kYZJ>Wꫬp/Qc2"@Eu4{pn6O9 +=<%ͷ/QL V%PY]^4 ng H^f +5x@E"pmVw9S]pq'O,uːxp_2L?o[keA`Rn_06=Vk0hPk_9ڪG7)׷ +8"3o՟yJ}Ke3\tx"9n8^vNttl;mgB1f$F, hڞˁ6ȿǴHF| +}*rZ`}qldTCY~27YM="-sWj[%(!I(fTێMvjPt\q ! FA}?&luNT,V[q"G.a:%BZz个pGUݪ{zWWW?{?&x2gf J6G R !Er@Y@5~@6HRH!׆pgZԢs=(2W*!S{i͑Ja3X,7oxִ+ڋnAa5=1rǭb~Q\ + L8 +gZ gMdU!;aym`1EX A}w/">3S D0kD}ߦ,Ey ~Gt"1rT +Hj$-Tj'po!gt{g :T|RIǡ̜e+9ჱ!LڥT/-5<=v+[>+/sY{?(Tffp& c$eʈ'.O=ߍv[7#!J%NcX>X6M~4&95! 0'Anóqhr +:v&Sad!K߹ +=pFX'8Q3Ä. +b)."ͣML'<#V,c=#_=)B@EWD%E7tɀB潦־Cʶ$Ok˘]ROJ--<[t8[=O9b.*[ӓh׻,PjQxg:w>t!B1缃lSUqv*0R@{JKbt>QvGws<o4vLD " YHrPz{NJUALT@ϥ'iKaaAaF ?~iÞ͉WTܥ[~7LylV11Y="m{a4:WĩS~j.N2;jYSouHF?l۩W;v>l?iz Ӓ(6 1gN d}ґE g%?(2SGhV 5 :bOɵ4KzkBy} +AFâ툨Ջ1L {a[-ɴȩhܫ%uJ"x]ws] +2;=ه}y^ۅ={A&5]֜yXҖ H]Ȣm"ȇVM9'6Z.:+ߨ6^GÝ@XcxK q=Qd<֚Ӹю0sj; ZV*牛);رlC!9v(m~8U~YK,%2+h?n_ +0ɛԛ!O|:~`ɜd`u#Y/.]` + ]hJtx崡'3[2"-5 xOթ8G7`6߀۵E՗#?>bA^ad(U8J&,: iT 07K^v W^Al/[:b4'H6dl x4np*^C) +ξD6 c|F_ʎgM3Y_H2*k_D]j`6"j}ɒvo6#SymkZyVjQ`\kI+&-ʹ9w`ٽ@G[gT4#MFڌ̘.֜'nJ+3h#E dwgOJ;iyNfGH<ѱSos96fm*ixG_}afNQS q^DRݨ +)V"Y6Y%LgePsʞgvV+h%[e8e/X0d1^gg}0ȑBװ0ᶏ)ڬXe\BKL6d~3wuqs9\g؞I8;I(mJX$) JlĆ+Vd_B,X;m{mNX'q{}߯yLLģqxfǮ}P42GyiO@5RN&Б㰩Jp`LِW 㨘9RW8/=55a5D/C2S吸9ۍdn!#gT>L5mҥMGLoccn#/OSg|t3ճ-("^Q`DT= itp ި<#tP,q -ii5 F"*E0MjۏR?=>BM`vƮghypH6UK`ϿjΆsyN6CѐX7vH l,DqCh %!u,UԏB8+} ݑoH>8O61 +vaObcIX8n^iet=xEþn`u*th7K]$PIn\ )<ӂ+'}%sfK?dE{@WFt+wkݰg ~x>8\-eSOqĚk̞'$ LZ!{,YK3-_<{ɵ(\"x4`bRp[*n%7P+\`Ki&Q8J M+ HUy tYRm]Xеg-7[ +¾+ Wnl.Ytt; \ͱΞZ{1Q"`Q)>b /-Ϋ2_gI کfne/8ߞBbYVŒ`)k8Q9:KC[xQv))Фmp|$O,CU^6 {q4*iIP鸩C Bp_3Fj3%;DS)Arm:ܹ3s>[ 9$EHzgF];hKA8M_ .ڢ (nZU]t.E/onof(Eӄ(4s{9s;XUfT92g2l"/w,>I"3t sHҸ_H=X6%it=v eExAdA2%"=\D>~ E#ʰvm*mjqlJ.o9k:Q Qmby' {[Y8)try +feq/=VvZ~$;UN/[CO1a" ZFŀBа>|h +[=LcJĒ 6J[W|}5~2 H QQH +!y?9Q3GQ\,\|!:[K ĉ帣@Cv돖^|1tX\v83gfu^W^J] +LϾKNaW6gԣ~ץzrG"x̯tk2kJaj#5Wt9iǮt `eO-meLXspY;J j|htKЍ@Uu:FߘY's%)SqX"D *pxm,a,Q#haڍ|`0D)յa\of<1c"_ 兮^WK^"H̭C%n 6.+Lt$@vh{*%Fᡏh D0[B]S(w_#y {Ň0 5=cQhUf44wmpݖ *M,!lF}CtTAIkMBNj Elw5ѻpuZWhlq>I6a?h/ +n[(d, 4$0sMBf,WO0 b'Q +&ze&bdN:izh5H/w'"YAe)o?95 Ӵ T$B[\|aqTktܖRoz +'+ϫG5TC+cA;+q XsMScW\irNX#FR?B.Z+@ wfjTiuv5`c^s yqd2ge3:J,8bkBumݍ2!Y +<#MYP&9& +2ejBs-]+[&yUv|D\5QkXg( b^ۙLū!,zB/<ͿTqnz Nѹr7г Ba꤉r[:G.s (E=9^ZMq +t*/uvM98| GrK,DEVBv>0;vY%| ``uO K SsYў]n+IE_˙MF5|5e#B<)"өfU 0gAV3ھU#UV=x6gzo3,Vr@HHE Q$8ĉX̕CqAgԭ^a"!Ri$iJqVF> +3ݚ@fZADe{}sFR,u$gJёh] +D9rV;jث7o'L=e~2Q3q8NOjNgwzn84}jZ/s]Agc]ꁴDrTGB:"k*sR *I``,~;kˣP}egk>ޞ o +<{ԳYm E-X ɰZ.#$5TR%baA0a{@TCɞp{wpZ+WP\5eeU9E`MD/MHq+#4tn?2eFpjw#em{+' cNi< (ҧBjNhaVWUڜ@sJRUY$r"0Un@ʨJU/*z+7=6\]A҈VfY~bSmDR(PLsib6R.7`NylACLW'{JwQ5/hȅNS7#y+R_FϕPtzx׳%JՈ{I6L%9B>r-?] +8*(M~EqQOm<`1-lRN ?3_r5dJ&EO-jS2LǏ(ԋ}ˉw\xR|:wa1j*po}>PZp=7FGҖ );:N(p5kGE3ӚnF/4{Ϡ}YGp*h&)!e#X(@D}V_RuZ3u-rU욗Z&[M)W8w#):}|=l%O%8-,YVTz9̀Jp(1sjC +28]"yyHۡjX4SKQZPŕ8rJslkbw>볱YD7{k;h]"݃#:i5!pΫKt \sh5qYX ׮hUЈЗԝ:j_&fo]Xp]B1w@t_6;uAeRkLOo(opa$U ]󫤀%|}^Bwo7F|<psز͔i'Bnؤ^0W|oM ZP4kgxY@=b2.s$Я~c[u’Maw^Xddžk|ŵO-!lGeCN,,fIW޸wn҂Qtg}~Q SXv {d8^u3~cX6.ow 3Uۂάpi:̥)Pp őGN-Ejg Z<72ɔ^OSPnŻí${T\~ш~f:%[[wN5؈[su+Vz5MU[3|˒5/~tR$ 5Z~C|4o46Zz̀! 7RD 6h!$xེ {N3yiFU,r ;{M{ .}긡a놦!&`fm/ )y%fʸ N=6A{:N.<ɫ^$5fZn۱ 5R`jM3I?LY_ԟ/S^tl8 tK2eCtbuzm,MKHdǸ MЎA|ݲIhŵҨH|5W\$E &-R909@f }؜;Wtnx n?0վJ]d5##Md)t//+Wdjm]&\uWUo^ڻ^K{/cφ6,HěI(2!@ 'nAB$   +g@\߫1U]j| DͶ۾#!''o `;ͷNN_ԁ_VrJCBwZW]AF >A> #SQ;˒lߠW}5/x{l?_%t &fo,ќw.Y6PΑm%|̂|z΍uͰϴȇTXht\j+ +C2]B_C8vWp+J$B^e)#L@GY>䍊"ȋh|pIQb9CcpeƘiosM{hF *a簑""PS)d'3դg'́}lny&%-%..f{>gmj Get*^rGݯ5Tfi?P|~KƥYnGh[s%X)FJ3eJ[a8s{W +n򉊤HBt@ڥy:v5 pقY8Uaw263I +Pr tW%sYswEj8?ed&CY̏UєQ{j7?e+޵U/q1mB6Ar]ϡs&P +g:mG{'c,am Av-"34MBъ"5" ( ,X6noүL̻]^X vJ((j/ZygTK?kA.蝃i>&W! -|!`>'{А8qVbNAh]V1/MVVط#N +QϚj@\lc-$-v$pb>%rӆ-BEPRl'jgw5z&SG,maq(HC/ 8[rY: 8XYpkCdȁ)n +tЁPgJv=k!NNGM86n,\hΙ"H+˜8He奛>#h3mFmL oOQ,Ign1K:kjBUDQԄ޸of<4LkF9Mϰ^˂S=UUte&PrMٖz$R27+@~5);9Bbi)Uf/^܇!$859³lu)ͻ'xp +xjNSiqrs(̪V&`7M{ŽCdwcv&2xrZ3؅Y:޵Brȵ,d%܊Q7^`Xu +1~8G;nkk%-)v~8>g3sΜsfKk&qR'44MhS,Z!( J* +Ux m5~%7!d yt yA[,^_tۢw~B[{ )K{5; Ę>v.ITtjqv -C{jSl/v^| WCK-Ÿ-$SٞTMZ'1T؆ƍ,NEPy@IJ5; {߮%=hŚS 1 83@*}tPjԚtS5Eio$k݈t)v*\RDiHlS!c8[RYm$反I֖K|&MXe)Y=:ʊfrJiͻPHP +EcsK#세Pߏ"Y S*SJ/Q}5R-IZeKi'g8jEFѭ +mةku7;[_R5FXmIuR%h3T@ + *Gv|"BUUafTּߴzbobUEKd9RU*S [c0$pWYDւķه-HPPԂ\~y gR}D3mixhpC"}0:*bS6 *flYlkEdub_ĥ>-PsƓCѤ ab2p*׉Gy4!4+I +K65HPa~zJf!NKA%̄䇑:󰐷a$&n߁ÁN4o VΈH6)#Z9/#1=j`0e 2&dq%,Ǯ@$?_ȩ-IE1QpIk!fvuͭ6mYۋDVO|;(Μ{^dR{a.C`XMP 56q<,-u5߄;< +>^sDbQW!޽p1uֵ٤ne"~Θ4I58̈́(7Hlc\Vu.܏zMXs.Ϡ{yjeǺT!n]LJ]3r)IQd%3`FwUi'i:T'^&QOab?6seE>p 7V`<^/k$Ы*abxxt76)u癜un.B?+lN+gҌHq6DP ?%_ܧJ +B8F膏0|^ͣPFc| #jS[ÒKc&k7$aeALF8UدEyUqx!Eqi:е (.R]Xۻl9unc5D E5Ḕ`W{hK \%AC9VX+`LGn4yçvy;D-.Jm+BM0ƎWW(DY S^ ۴\u7ѵA3]xn٘^0.qp9\O RprC\GDz!1Aj<ꬢi/i٪N+Nj[Bϲ2&FNٓ R==kQV8L˖3{lnyϕ?@Kfه[uzZ( 6 jks\[V>~gl`7gbЫO Zx#Åuaf܁ƱpZ| if{O=-4`2-=iۧ6)Pz8-Vgz9ˌU4*wɐwm:A9GE=*9Ƹ8#$!#,#^j=25-dxXzQu{U'z?+P1o0.W\h[t𦇕M6OPRvCc+ +Nzx%A6ÁDM!]=qu͛7oͼ~]ۉcgIpN4)JJ&AEzJ $ *Bv1#gyWhȀyG\H,\H?Mw}ɂUvih} ZBu#GuZ~<5&h RT2tsAaVIl]+m65}0i"g"shf L c/ l@c2E'=,.d`..N{}=CB8 ͩ`bn|m ]^-"uyН O ʖ`!?0ȩC'kC1]c7xeU/`-r_S?MیU BShuKT/+UD.!ݭS'Wo`gLJ]A'K{ ;Mg%%>JYC̷4ޞ1{5܏yVA ,#㷅gX6 $}^TXVYnR-0}6Mj\Ӎ3wB"3$ʾ5Jo +\ʿGrU8~3(.jPdʘ: dBx̹}J㊮J4gIʙoؠ]M"Xޓ>DFsnWP'EJ3\+FˮDh9*:@L {Yv6WKiM+z/IÚrEHir,HQ$;,` ϻԺ},XUɧq|G&.Dd~_DmDֽ=~WTY{^fɭ iŪ@jDz5w&'B˛yMT4CoV,Dh[4YUpT ʳ @+\6^|t<34VmcUuҚuϝs9Y$rʸ砹6Ǥ?6|oD-mƢ ;\bɪ0\nU*vq$v:I'q'VgҭVBCh1hxY 0xjf+,x/Ê5@<%plMEY9Fl+!qfzH 7U00[қj1Iߧx! FV<8^C#C>Qp3O'8'bǛe3;V +lCzdNGMs<(Mަ}d;l + +kWu$ E<Ļ:8ƅ{Gfqgnq6,EP%?3o|hf}'fo4Aan[?\E+[%F]O1X^^_߰#Uj6 kdx 5۞sүPyA 贌 y8~Q1:~w֩,w[])+(e + /5" +ؽdlШx1#F$XÊv L}mjY)-dٝŐBBv)>t<y#%`f Ăv;hey =u?d| +oGR(T(8KwcOe;iQ8E^\Z2̻ujZ[NN#*<;k) B"gٿ^ ]bT^3;Kyoonn=,k'8 l_ڗL@Aj08Kߝ p,\ ՗^ aqOf\KbRD?sm7dH 䱙6XHl(w_ yjw۬~X'~7" ҩˊD7 "JEwyy9s5pU̲5 ȳYڏ*"jLH[wX^/k[[GQG9\AS9msg!r%ە咭Ϯ{QUWl6]1乀2\80+_8fѮa,Z1id;~{4 ۜL'$#8g֣6]R +L3YS#S*8./ WΗUt lCk=^wooo }PC$cRZI9,:pUO2Tsԯ^|P 5p:s.E><dp-Ce^@B:Cork(L/Z1M2Ojs^Ss{0t-kE$B0ݒP(` cV,1ys%W):h^jZ +5婂uy)17<@9_Q fZa(vx +*x(Y?21elVp|Axp wBP"9\OAc)qKdgȷpd<3<j(o.]Z/Չy32@&u}A?:9evzA͉ݷ}&)icsq͜Hw53EH +a &, (I +,'ٝL"XP=&;b̨GI%@ܫĉU}Go?_=7ɊWLw# |_;]=죞=9LH~K3Ȏ""!5QpviՊ=ClM*X*X߰ΖаHxuk\3=s$t Ih.SS0BPK"UB@C""KXV ZK I߽ϙK2AÙ̜yKREٝ!\lB>ɨlgBc>GcP.߾mm}A[6<[s'nsכWrO!q_c5,;y#ay!2"v4ٲZsq|_ļ^o}&FF dV**N#|E9eaK]ُ$w77}=q\xkKpȝݨHBxx  SV}Meiܞ>qn9T̩?eiAb9U08x}K F|ژk{(o9}o⫻( H{y$R"O4ntd"7a'ךդ&bz(шi b52zѹ?|S#->5~@H@vHdYOmIXSAM8߬ênqf׶zF[ ~VSBRJZqn̊F'}ЈGZ~g]L3֣U89l[zAJI\~QcI)~ԿD.r!da|@ +~dMu#OU\q)$kAj0O*VkY됷L=X؄ [pL-Ș iYjDkyhJ%X󃄶;of8lxbb =h\'0ߖ~ wϽG,@^'巑pݖ--泺iX'?1 ƙt|>!''קh}jyfިbloQ^⺶]Zv72PT=,,Eta0>B|aqs|G{9_ky+9CKƢ-WzM@8Z~Nu&&^y,! qƧ Q"j5CU"\@W'6Hç*Ng7Yddo +ud*}8QufWe4ÃryߝDoF=)kH(Bq =?!u9ܡ8ZL|/?K7cjxI:_\ %X#sB-mJ<׫YZh @<_Ҧ&&2f7-Ж [@údG\H (~V)Ui "}^-r^KftDIC~ថ^dp@KoD*Z8hjӪT8G+_ /M7Iڴ(ҽ>j tRyqȤ-ZmdI n/Yq6vJިuIvհj i(bcq})__8f:GYy|؛z] Pڬ4r`Uð^t|egڂlA&J&V5ZH^5ꟜeEZ 3 9 SϊfXxsi.m3 kUܜTJ2 |Ԡ4}%*GKwEs3f1I=q(#hKIiΛΚ/6+{g1o$IS)Y(Y#"DZcI$#v"E8Ѣ] @EuE"6 E* +H )ٲHs9w~bӂBkq-E~J)H}k\Ѽ܈?HfZ7sKim2D& _5h:t+$Yx0 )eEpr o49b0ǬRW9*oBjA۰t'A;`Hɸ eJEٜ5[N& 4WVfY<+Ri<=8ߥ=ExԞ>(ڝÙ,ݫZS1%WK.{s|;wO평= Ssi.h>;IWb% H<&O!,9ߠ>YHLJJ%hVW#VG^N{7/92ڀ_\iL;/,VNy[a8,] +(dQb_릠lh$+:MxZ}e٪/#x۠ʾ;ɲ4Q3VvUƆ`{)vE4o8:r5)k~L" &֝G9 +by( +uz:Oeڟ`͵&}rvf'TM +v dZϰٍm*G󜒲`!^pґ,WN_y4vwFmj R o MSY$;qHm G ]/yJHw +Q(+!0L3b9R93}˰*IԹVß1E"y)28X`U &u)#&p&yRU_I1s)3J;⬔)iҏS +:RiX7$`!2xl3ZZVS@xwK*>[sA 1m9nuhkkg ~)uOsarM+R> fZ-MIJGDK|20iQ_ZD}ˀJxbvSϼ* F*GmX-FQ"e"F=īi}.9R/^@c xk̄kj P{H08%N` "_* +-%^5"%Ba>&Bbv 좟9\] 1ҔBT{ANV/4*T^ƍՕn {cνC[׽u=95~H:S1N'g foZ[qM2BIx@$sr߂p"Y@"\Ov8+LdtwCBX+Vl~i'C=rcCAdN&DR60'mC-SLS8%)Xt?sN*9zG4|]¯p+ Zu2ӡ{f'Hb#s՘24aFHˎtpױR T LdYҥ.8rcdTN(9Sͩe jjpe jkG3ͫ#1rrهε3=ɭ '^)m JѩpUep>0ggD41wN 7xeP* <{5K q#%"x $\.bep±/Q0.GzJR5N + Fk{ttΫEߝiVD*ޔI (Ho>!w(ή= f&U,H戉et#whs_z|mɍ=me؂K MY7*, P{{ /CXctq{[G$o՞p[i[67-d2W, (S914gid[~} 9 [(C-+]V.Xs% s9_Y9rګpI^ZBmn5=!T@[*kB 1ZQw3%x<3"_,x?U\nO2*)/(e\*ѩ<)~tǂy(b,2&i4LwM+.Hrm!!PW8{[C4.sHXB-c"_kvyA4 @E EG!uFDZ,H'!QW篵k/W '2hiRUi۶կ"}vFg>`)<\|eC25H]O +6CQ(  iLTտا>.U⡆H84(G6$mJa2CBNydNfb{_ 0h漨n9|+*6*zBjKBEޕCCV+oApp ] gPrB *,ʭuȴPHY)&Irb1*3OkT"kօB합@uװxVYfSn\rVxA7m6P"1.Ϸzګm@xypyfYMzzҵK֏QX`֍7g5Ku $Y`sItk-է̽VW9`Sc)S:y\{Y!ẍ́JoDO/G^bLj᧝!sV +Ƚ~k'9o9y +g3=[' +%gI;y,?~L+4nR +Ae:_Ҷ^fZuR[C}":|g<{ +1/P^ƒiv"Ag6WMmG gSj7! &{sp.г1I+5Ș Ep~p}"H$'YKguO\ͅx6G1^)5zfl"ݖ cN\yq B%G!ՈЉO}h7Z$BF""5f<b#l !g˵14E*:ܟr5JVy{ee*,wwgIV#4j袢/ @ĢsևjRi1^m/\eN9U}TOLmgggfgflָh k.I yBEAA Ccwfw }h~~v1KzUg;S'?#ifL!;;~IYv_꬐ε;T ևxƌgY~B<8ı<̾bB%;f)n$U= +Y %V.p{{rOR\=PƏ=X[>O%Idڀ?rDXk3ĦnI;Ţ Q1Tz)t* a-t gMb޲oUlb]Oy>D V9S"摕_-rq>cM9!SS0 @6̒Ng̹})YKˁPɸ{UyJㆲVTa`t6:6 TI-tinuvʔ\vgT{F>Vs#cS0Aj>L1_/֫x\@ѥT<OH;Α5]ވdYr~B?EY8Indz5 + ߌ\$<bُN[XʧG-硟܏qjҰZ8j t,-Yg:pO`Ԍ8&hFU~rMc73pzNltӏu-wy$|D6e|jk0\jBUá,_" 2!Q|QYTU=&ɥɦk.z8SYhXMbjF +I6.gqUNIma/5qCp[UOꍃO n z潨1/D;HՇ*=s4 ˝fZ~3կ#_Q6'C4gK*5QC.u2 R|7`;C2ƽXg&`V.nAyꭧwHKk!}4~{xwN#)U[{V7׭ڠWеߦ>\萺(Jx-$.:/U#UE{xßjU==lmhϳn‘0 )(DHEP$"-6LĆ}lwWWɓVDeuѩtp BR,VD>3?OeЈ\dUlt]C?V=_f2>Sg{P;.$JIBC"$Mk~ ԫoOdTt'r64i>335G\Cb[]+`4)`K;܏rtP*;y9}1m}n\ CT!oԷOT/F@寧HL_SIHXI+ϨۥCR-|VL%4 syl=/<ɋcާ6ЄT;jhUZi?sI|V,o'b^G*݂ jvKvR7&} +p蒸ĶXYv@8IjqX7,``kmt㿃}| uxUKk5q-{/+4Ɲ[1#$RuhP^J䗢NlBL k/HHHuqǺ0#]N`cܹJO۵P[g{pjZ8*H.X?/1wwI*x N*3p{ŎH>=1&9RP춗t?8/Cզș-[(ai={\#gwʩ3ieh4j+ +䙰Hۭ IoCޥaB_Royo׺TT;J/;wTw↪|mm-De[F@9g' ,IjQ<\6_#DGLÈ +lFH#׍ifl>&$Tp Y_驮Q$ G7.Plj!~PRh^}PaN\jlex3!HZ {vZmha,cA'8fv 3VfF N#m+Ƙ) ED Ip2/Rd;_6ǀSAs~+O+V/ n|7;SOG`5IS/ROX<q +K Fz(:oH.[j7wtvurةr9KFg$r;0:J:K^ϸ C,bɓ/k Z9^}7R7cOơx@Ѝad4PFJWz{XqnπWA9N tޮ"}\ A ;j;+v=#3"L +hMNy@p\ЂzD\$7[ޚ mwjy%[T&8Ec./xס^+ɰ?e{Y=1d@2tꚕKQAKn0|M:À/SS&]/IBiR"5+󈹯Dԑ4'֯ir .bWKmQ1U gx5ߏ u,{[*㷴x(5$@G1Xq W1W:s'6όRNo>I' `%DmTHֺ ?0 +z{܉qK($ˑ]Ɉގ+bxx?*!$D\R}P1mGD=V"B4\ƜZSל:c_E(y 7.-2$8(TFы4g;y>fLE ^mq\e|Ϝ9̹9sۙz^Ǝ4&ĉ UI\ *TMJTT<@B$xT!T@^ᛙiT4g[nHI5>5 ~ۂJ|!#{%e&hpP&f1O.FNap!+L 0 O ukI9N5:Tg(<0֦3 B}=ǑmFc1 rhnYTK=f`|ϗI~(BNo|TQzGÚ$6] I15#%k}QNCOuׁ(6 XJ:2ZIMÖLs@T[Ƴ ֔&"o}Ĕc?ʰEW a Zyw\ڭw +B mMDZ m?|e5sAj@imn`6-zsRaWx[@uf -jT~.v:GUMn._87\^v%WEKrAn+@qD|I5ǙSQN\)ly})Y;b/C}-ӄ-|F0ݕVt+/eٙؿ=ط鮘3YKp@v00o= +'ϻ 1O8^L8Wt$WIњRWK^EnqZDЮaE|旓qtNVJ+@ul} +?NJg81C<~򈫄P&ѭjM{5/] P= ܀DN%8]orX'ps q(5j +d#T4VbEԇkv92a@izv%0[$q&Qg2-n<)Lp>xePfgZ=4\gkLy'!׎8@`owb!q``v]MV[/jMcFMxv]WA'"'SR J !liU?U#C@2kP'Þ>y=t+gez8+JV=ڃjHaȻ;n("5h NY͝W0aD#{%pZ5Tȵ+Vj7+ۣxFB۴|5rk 5P;x\"_IXl,= `H9U8tE~1I@B -Pʣ^to[\F{Bz[wQ[YzAL h)Fߠ 55p<Wv5&.FV@ݟ NxvX٨|Wh CNg"tSm!/ ++de-a-<Öcs)UBO 7%ُ)0i +ʰ@I>H)>]ju0cGJ/:j{xg`6&V(T6J?=g;p8Q )!E9qD0kG4ok"/[G'F ѱ7-*]v]=?um+~~DL21W)^h$yEmۻ8Tؼ 3go9ݏKQ Ljk_%6ssνu3w^gƎ';vv؎&j!E)U@ 6$*Z!Q ,"P$DHK (3Ix1㹶o?^6b8aޯ܁SaZ p-ۀc]9Wpܱo;p2?e6 !Uup'Y /ӳ;*ЅNɔa._X+ρKK|3_Xe +=pLS5?v"p^5ğ}>٘# y !}rJݛÎ_"x}Zf7j1_ L-= VI1 n4zo?{9 +w"GxR^Lu6ڕ}ނowrN8mm&)-c%${#2X}M7Dok뮖&O:gR~h7[$TnŪ:gϵsV%%s̓tB:? <9'q<3^I"?-;@>6n{]HG南Y +WFimH$|4yȍ40ꤌ[[9Vݘ#\R59'AtCeإ͚>L2#uvVOrS1WYMtȬrǓe6(=la`wo^%>G8=f&y[] Ʊ*OJ8  +䢵D*!!1Pz?6(SH*m*Ni^w,?s=BiQ scSdN8w|FDE{)2%/9Lk5*H{{;c@ͣs eR/%LML9o0$OMz{! ~n!vJ- +ԍ,r +fÈb5P \EÖk/YZZ#kNv݃d^p rI7u7#Vxa`EELVS[qmHPiZUKF2i&~D c="#0KGdizinm9Wes$^ԖTMcdM IV|GU(r$z@Ǵ'7ƻꋾGHvݵ"n:Ww.</.?>G$9cv)3+QIWιH>A^fo^.pCl GgjiGsƿ5n'SS6I ('(Q-]lx{53D5be +V'WVXl](fȑZ+ƫ)g|S-aQMX 4׿&Cma ~a9ePnקN&s<=#UI›W_-^CsBX!܄Mq߻zZh o^xv7h4n9բa<2׶\.eT3wrʶ +`?38ͪ>c9<ԞY Yy9$ D"yo*l]ڳ@RCdb*ډ8 [S(ic7)jo|D+V5:;M4)_J_]o +0Ğ ^wpfU`7tF'fD9Lւ0sVW.3jG,ĸm,p#,Hvx줸DjVŵSQY jo)B/; Wsډ@udhq5F/. :'v +ѠS(Xf?*.vp$0L3t JfOFpn}sTdt,@C]@|{U܇mcqR8eu\_k T HZ +i +v"!BhtL M4_.9܆0-kQLk>]x'褛l7O\T`&χS4e8O0< o :^7^"Eԃ11<*JX_t"iς@]k^0ͪUiR-,GZE +]K!H+64qm^[\.@{7{ ~+[tNsRM`J;MoXj]wi]*$[]],֠zvٶ҉׈T[h60:/ S|!|v+侑@"$Ô(a},at?p42m/VC Q{5leTHyYdZh!ax'+~̓4#%0_7 +uV}?]~=vxƃdX$DA " !^b)BBI VH[ Sm{d%nme9}6pZ !6?~㐈 Ih=g\&;CzrvߜGe*)%\sk |{bGIa  X׎ɱLr20;m5HZ4dm=x7>+*t^+ [tUQp\g}𠦄9so}9h./Yxhʆ +/Юeіx#U֒|XW)n(T6Hm[UmRJ(pR/AoeڪM$Hpip[nL#)) чm,;$gPsfꐏwXoD,Obʏ͞;hWol J\V#x͊h!9 +']D.#w(i'gDl  7&= !j?m!4QB3 l[W|;,wlG _{3Hj:<`~ v֡޴B/c[,qK>[б_H:^ e^pC7<ꬮnQBc]Dr`lP%DڟmLq"Lt'na,loyҴ+Ԇۣf(y&v}MvYඣH $ P6>&;#繚2.$rUfd= xdas$sIui]Q#ռC AE!S1:9M <'54.4sE,x ǭi/d aO} 2*qЋhqHt1gZ +)- +<6*b& ȓ2XtL:w<\ԧa}s̫6gnoͽ䰕M(}HԖpCZW'=i<@]}` }J1p;Jσx +۞+O,^fk J`GV$v~;@jSd77kqPt1HIRH _rI[ôz@$/YdY:Nt!]ܮӪS lV=]^e}loh^(?KB+̴7LQU]nuաt% <J1n/|Orv{Au|BD+ϭkOG8ɉ|z6g8Ymz*/)p8+PmR3&ibJ ,5. +U~kn^h&)1#>MU8` ,@(M +7 <8āBkoC.tvj>%Θܰ/ӓ|k>  +5'ji?RMQQKWPhEj J#2HXfi)O(H^=CbAbS߇Z2txƑz{VGv?ev(8q&NL30!1a Y(b1!,`3l@@_f@ݪv.UJ=sηcu6~V[TgY7%vc/ 8ѯ@ ;Dхxpy(4̵W9X1˗8x1t|yܝݢT2ePb.g?[vMI0 + ^3}-@̌=agM8 [3[S~CV&\VGA!_UӏEJeb +1Zfv* 擐WrWZ⇢f^Aq*젘UGS  p\}T95Eыx]d\v;.*yJXI]3]2yjFr mnp +<1{jC,ÞDYd;rV,L,%W}" 10sSlVڇ#PXΪWti!_52%Lxu y-RqkW. S2r]gH8^eT*27c.);9Т/#%q+dE;jJE\VPUi6vTNC^pf/x4E;׿Z]iGs*PH4LU_)`6?_lWOEˠ]Qjs)g X?OII +W$w0  O-j*N L q+6IJ{or/LGz>a6QR~_CyIex\M5횩v&uz9,j%cc} +H(ۼ Y~`1,y'LCa8̅t R$a3pi*YUʬ@6kO؂:wKL!mr]!k8I|Җ4[1e :D iiOkj m[9zx_Ɠ8a\kmm#ƚ>'b 5C ؼI˫P-2+竘cyXz6Wyŧjc9<7*$Ez 4v$7vRM{Y\ חrV(PGѸiUA D8^OBp!]fO+?5qCvͭaCuOt>8oM\[G}oQV3e8еc;:8'WWzހ{.GKBAI^"o'br1Uϩց.8'Z8O7<`=e6'^vq~s]jp#_U \|B⼭\]8!!N ;RvhDE @#ZS'9 .L~t:`3$Dp˳9ΦdMM* SEӽ .PW@0`T"okp%Rt-PwUagAߗp1Nq(sQ r콈ũoƫ-6 ̙9sΜۜ}u;NP&( Ei> +BRv*#ye٫E6eq><<' lxG4} Fe-WnveK GE(neگgVpήiq( 7 wi|fm/PT1.~6G`7Etpl҆5̓8lR/uBN=3,>KvQ첻4>4ڀžaǠᨿs9`kCXOu\9 ī+|muSJP/[  ?7ZFB4⤬a>\þG4=\C*)PUu+fGAo"ͬP#!G2,5]ekZ,VԷj߫L\IM(+q4+Q]~tSkWe>Kw +NYq}q|wIЮN`+4R͛. א +Z`$FA[)ݢ֢s-/"eeUx5`P%"\Ik@sDa+w\o;qJ2;O2d cdYk^SYz A*uݬ8ymXpЧ!E |aeNk`ޮ{p$ 0e΅=yhot׋옑Ӛu)hZ] E#:Xpb[^ʬp08">>yg#4| Rdu YyZ$g+Nz Q0{;6Cv'ƼqXed<1EM~)%Gck%Ñ ?y:N_٠q2ozB&y:4|6Emեե7?g*Z})KUx*(ЗJ-/3di*}2ҙf9瞏ߟBh#iHg#MknqlÉ4ר75$ϡDp/NDgLdL 쾦.ؾnwt/_poumBHom]|&T56Yk:OO1G;֜^[5nz +rNl9Vnya&ɖT`Z8KG$< L8 ܅ę^RHIJ5O=NgUN}P`a%RPdLfKIt:r5a.[l$h((*',s<~O ^ ӖgIaܟ4|w?psyQ~};.Zk5~]nF_]SWop6艃> S:N0?z'|B#q^p{1$9GzMkJc̣B>?﹗ia18*K-Z3 cSNyB>}У%c]+HG9W9ѨzcȨ+HQ-}29֪Q1. 0ۋEVJ5Cenj~>5O[82H˰ G$~; "ÄoT)Aм,` Bڛ}g"qjDmE ]ioLM]UJ fּKpgk8Ҝl3'H9F6#Bm q2=-܃sȑiٔgg94*VS/kMR{, : l4;Ebv5Lw]^qc}9z!F NWT[N6Eqm\^6'鶨)2M!.V8QB*Γp 2K#n lJ''&,:FkHp!F62}T =4G:%oYWn εpDSˤp1xߨE˜d5H06,s̾y}QOKU,ⶨXFfԃޱ[*ͅQ\_9sgKf%ZMltgfe 0=C6z4F]/I{C'%Qlc#P<ĐK읝SӞZYyGdMZOQy,#qn{u&4%S*V5g b]rpF1-n{I dɔGX%F%o_Y]ݣqY q +.k퐒5f:RZ>s?ĭ=1痗*\u/SV+O\˰'Dyg_d(ߦg [4nҲi 'D!s g.8j!<`5(hXAO[' è~M+J"!0_NU\.3Q Jb7_*H/]Pk"'*pHTXſj.˙DkK\5xDb^Vyٵʖvbg||hEWH¢#BdZkNVs'HMג $3mɹY";ʕ.ٽ}m쉹sd .|}~v dڋOll$Ϣ @|@'~ w +@*@>@$ҡ + */*6&?ҷƑON }u :>}Ÿf17X^ߖ1ڇn9앛vwam\6;7ch޴_?`QyUB%<88C8SxɌ*VS#2"""2"2""822#"2#̈3#כٝSnXT 9I?ծ4dnI{gPTrHB7m-?"[qs :EceFMI/x|Oь ز{0h޽22PQuhؕA;{/P?X9QcA4CK*Ć{wNC4HMy!գsh@"%=^3fyO踩$tx 5jT0j6"gbbܼ>x#4㵸y9'ὂx֣^KRnf@~^wjz'Ioh9'QLitg-WܽB=WJIdw,{^((}x(G_|eSv5n!R'zzzjzG9vp&=N҄8S—~25!cT_ h.ƹ&i|S~cTߞA'|d#>\ȱ/ʌKcb hbel@mp(e% 3fVfrT%ˇqngH?#G{ɗ7—ඐ_Fڏ9yۯoa뙓84ɱln4 +|Ae~i-k4NҼh²@HF +,^ #`@H|R`.AmUuAzeͫ;&T4k'U9HcbYe%< !4:.ٸE>"lJ&6 (~ ֋ֺ` @:%[sJUD;tPFJF!Ͷ@@ 5 9hϏ7k>Η=mR7zXZ`L}&@]J}[*@;(q psqx(&cW/M fgz:8T9QGf5mH6N]k·8 + 9\P #tt.gcvy1@>(Dp1ixc뫌fcvĹg Es<jB.5RYUY{ ڸk6ծޑdge'F_+E_nâMvf2 ) ڬT|)mG(Z6EhJGy'ijOApځL?>-( Z|ͳP6ڃO .(AZ\^gp,|n:ęu1Ze(&d3ݎ۲P*|p +ƭ?! n:.ްZ\= J"`Q|e$o!dݬ 0g ՂU )E + +endstream +endobj +4716 0 obj +<< +/Length 29241 +/Filter /FlateDecode +/Length1 158724 +>> +stream +HVy\Wr+Br&} +@!(b!iUP9DC**X(" +. VZA@QAiVN8v}ߛ}!R!suɦK8 4hԍ?3A dnRFQΆ 1Y{4gt|qBT\rԇ!]VG[n愫@H,z~4GD\iEGX +ʕTa$q\gpX ¿x4w'<3$+j̣ Ěd5o`)Tiy! N5!DXlR? LǡR A" ą $ħdCD%R. +{bjX#i(]eOr|`ǀ¯qD<Q1h DYՅ,>۟ !&r".QS]0`z31S`<+X%B [L +:mCC8LQs߂1I>U&xdpX>q,B9XDi]`mj4k"`浫ԟ^N0G%Ab,p֒CY^[wIЪ~cR|'Fvz0Fy8+0޹SfS2[J`~:pϏ/6Tɺ]Wk-(-(5'G8OLj:'L &"@L-% 0(Ip6r#.^t^MRm>,b_t>>ongrqgvVJg9&X(CF ! `2` 1&Ű"e1 C)&Qyuҽَ rlo#הhha[>Wg}>k/0i~2`5g< ypo#(v{7~%;=RݧV8%*#=о2owouQإî'gvkH +kTZjzW/R[4^[.fff$v*UV:a%*? M{ ^%y댓iBǃYV:&D YGtI +/O`/I +.S0)@& mU J$rk ww c^HlU<7!H9 SH$ fc4f.E_]2CލcSP@Ոޛ@-=t^lBusTe%:`V9gKs6/aeg˒ʩ]5M-$i_<%SVJ٘|TSYP@{v)w:3_|10`4zn\^2-T9fnuy*(B67KfC7Е h.-L;0 빮#YV!hN +˪l:v~ uھpjlW5[[ ɠdE]MXڣHʿdYXIAiOx :VVk_bCa\FhY׳-LZ_jƀgL`D/mH.֝ݩMv/>&+R8BZ|C]((;mݰNE!p:]y.Q`ȗa E㍧RNotyiT#֡5i%2IDQ!NU +KP;}`Q??q$yCrkXKTN-)D:+n@h!soDg}H=qnm~DXċiRiw)j060kdUc`1nO\7*4=&8shxǙ |of[&7qj`2d[ nw"X@Ma.MViTҥG1H[5݂].]3PRie_%hĒ>=w)F3 eL!܌….vtpڨU$fC{ӷ ܙ.l#"mPնNbE׍'U%B95Q[q*~f V8(l1IͺYqحܮ9{43> x)"e~?]A#'1~^~:>DSd8&lyV3˒!cDU~ʷ+@(C) 3(d5TAH!$4j:'ozz3ڦ6| C) +@\ `JXK(j x8-YgZ^i}.s˭BƲgP>w)褑2~VWNu7f챃};L畻4B?.Md-611O{UWTBc1nN$1噶q>wz8%hAI?rq-|gj59w__'V:0_ޣOiPO(/B>ɸI-d]_SD|YX>t1D4DYNXTIl/^:rqEX)A0{3_^11XY<G~z!q,wM_/D{nku)X"N=p3(r(û13Nc.K4mۀ~KjK woU׻{<6"zcNAf%x\a1fYP$JVFipysg9uJ 8P} Tܐ;`a$1RFs%7s&'NcO׶dKcVv[ +k4VllYrVA4ާ)K;HkLtʅ&?óF1k7Q)!w+tV+Ir\;AgorE wJ`m=n +"${W7G [@O _x* 1'B;pu/^]2~Άd7Kp^H(|Eܮksz +EE(1ri)OOLEWURlM ³x]5g9%ذQwQgdRi"@);gK^)^1#37JoPВ*u +gM:2JQw%hGpEք1Q//Ƚj@=%\!]9֜IXb``Ka7x !֎j 37Ap~HX!.0( VXoUi !ݰCڙp_]kX)&ʃ؁Wn_8$ Bc%|qll2ER}#L (Si9\f!C#3v;6G_R@!75ZʳlOor?A-|@Թ#( +Il%fǎ)=R"Ӫ#6A2!O<Ս9Ԫ43,U9"?*i%rpo.f0`֟e[.UZ% G)j0W7h25:vņSC?kAM +jkh\PcV5zk98Hx쁶 V\;`|^{R˄9_(^/UO ^(O,>5npR;P`ljczW;kGA)*3wdJ6QAOՂ+(wGjyެx|}a^pW#xOtյ?W6]o} +\t 1a-zyu`^@-1kvv>ws߹q&roV> ĩXci~.[o;5OFPLf&qJwzIo dS\;ŹHW-7Ns4;) sI9 Ys|l'*{7:u }2fB3`Fom"u9_>w3m} һ8yp㎥b*2qQo%VQ*k2f"W)yxo\F.>!z_G/ɳXWnXx-@<7@`\Y/\K-_a%f{o`óDT9'E37*M 5UQJO#ΗD /RTcèX $#R*ʗjWDb_73) 7J([v kfwKdVcBq-NxlFLZÆՐӨXF[ײpKpm1ƪƊmVuhVգ\Eeη 'S9M8#ΓNzy9I8#3nKou+[3O*k:*`"Fԅ1{4[{'Bq-IRϤ?5+u:>+r69,Z0c6ua@j!ZYk;V2٩y\g +\MbO4SgƪsWOH/RN"}`$LV;T5^tV Fxf)HS,rUxJNfNEZkW,EƙjαBk:|XsE5V5d^EFA[I2zv{kR溎nc<:v[)4}RXuu4?ښ'uN7.2j[?=%zĪS?F;TY6K=]ZC:~Ovs{vտѵǿUIr#!(iae1f1Ə~2"2ջ%-H-mWXr7uŧGe#&L|}B9-0y&tI[}ٟQ]uUd%aR2݄7T=52]7!a=XlW8qIT/3!AVR{*yN1TXuvY9Y_DWu| k^{U5^W΅:ޭQ#As'wO_Y*nE 3T.W*ѺpLƢW({;VYz>&e \qӞzKƺPW ~_˄=@ŴTG'U]#PARՋgi;ISmݧԛ)Mo铱;:#w\u0]n-Y޿X +U,/X7MBmkJ&Ln cߗ/WcE +d]@|{~b̸Q@DU+R䤷ms}N !oZ=7Nk'R`s.%kn~K@62/>7$h'mȪ +t_U'x;]qRɊIG Ibas;e m <Mf^ v8=f&}5x~彃?1~X>lrt-bw:- 4d=z+'1bnG@X#؝KOHukX~. Sڶ„]D)A gE5&JqŒЭ]a"2-qeoFrrZptVcmX~#hx=/f<'srZD~3qNތ.XQBA<؁7Zq[E=MKA p:W IAc:iR7v:$64veF_(;X?sF 'AŇ4Z'qĩT*gս>F R?701ZئnV-fK\^[[ш+V'/r^<5rc;k^'ӫ%:U@HhT+yuh;Hl3;iƌN(YG/ITb;|~qJeUvR"ƃ6Ov}%#`InNYmIN:ɎEj=93%Gm3pѿu#PQ8^sSjI{xSBGRkN|{Lg}u_9`kMu?ﰇO[FXzQL{IOGTo0g>-n~˽o''#M_Ûsۭ©{݇;=J}/oz]O \GIOﻋ߈'-%cpW](7buNPzCșOq;Tbb'9o%ޜӻ:7#4ΦZUkzR-[ C +Ɉ;/.q8i.\›R`OیN*ܛR}jv*Gģ?oV;rhӲaldϗ%W8dgl٫\%/qBcY=A,'"~󸖰4Z9|}ծ#bY5yD]O-Sl=یV).3+S +c:=\1CH 1IBNVVj;sQ9n렆= F7mO*|;?r[>7ƻ0geogCavZZtȊ+g6K5͍82-1ۣ-ﳒ5eX<1r-EPVj33fqO-e"yٶFl[[N([ة27k xǾ)rDdmV'9W^Q12P3CnqoF,s#+rƾ,h9͘-9Eݙ>},݆${Mdd[` ++yl8POEKIt3?6}+pd pIz9*K_c< ZM hE_NfFԡTɮu(1B0 },]QUIsHYJj}&>FD(BR{R$4sZI,n*qfuEm 7A\YYӿGn  VȧEnҫ4?v^/q >|lz~}߁|79b)Rb֟GOܾ^pDfO>Y}DT~,h;R +HUK7.wZКkdm^?^޻ͮuj)VZ|i~ajNw)y>I-vohq?=QUv.>JGkd_^h+֕ռqgtr[*,懞=, +&ȿ^k?_>^kON1w?O?+/w·>~Ыۯqh~C|EW}xշ#xQjx};ܴ\kSYwƊjI.GtdGjN<^Ygҡ4`*"N\G UX;-V57h5X]3轅Fo Wsk0%;fM3iW|R8-dZkEx5-5N<g,rYfUI5Bv4+ͯܥUX h{}Tm{K>nIjT&revL 4wv w{Z˿Em F,sWbUgUfl(o:=d]f zwYQD>WWj^O_\y;knWȟq:9!ۻ$:痡g?x5*˕ƳK.3\_o*vNeQ~)Œ$ >٣JܝUn0zp9s:Ů0հ +nI'MóB-b$TGX)Uns"{)AAq릳FI#>EƔ͈;̥{MQ#1I +;`MhdMq5x8Fg-haG:4iymm6i)55#8Lx6{i!vh{IuaMcgN5-EDù jGe9EV-͢IJxuZ[.)fs{wZE-ÇJG76H&c[AC OFe?Y|2:Kk~8I&C,ԫrVHt R:9 0Np23㉵? dEF5M%'q7W*9DNFT@}+qUOzS_[%TġqGĴG.ry ҭg.B6 iQVWNR!6HŻ^+o%2I $Wbe:jc⻽') rV<;þcMWk4'՛縂4(v^hzwXj\J 19\q:1t ݹrZ|WgҌԼRsF`N7#RJ*Y7l3|`l挦T5) +K%M=;FR`gfYI[O_/CQO:.!óy5pzkN kKB}XY 87 ~LUOa_ljeQ54ymw[g@uEU h.QȖEdꪭ1 &M]^>\S냜,=a^S8R7j'lbq1J aC]#Q4N\T$cƋc7S/ +ihz] Ϻ#:+8_P-s?ʐ x ɪvU >Q]Ya#Ɋ'gs޸D|Z-=6u]8Oj|=.͠Y@[vc *瞊+3QLK'Qwܿh#kgS5j08=+eRcDYG3q>468q!׬35~ێ.#1k'j!CRv` K)F{6p<~vv"@ +cގN=Ce0u⤎7 w:Ѣq {bǚkIS{7\{o^BƢG{^➺xgm)vOD~ dC&l]lQu.s n մ +(`~׿'%Yg|3^t12fM^+:ڕO9i4XQyVbȲHL_*bMW9RjFl&kbnqɑ_9EC.^͌m̏\-Lj|Gvڨ& +>7_vopk҈' V9bTT{(uS:8+cN}KLM/WtS.M2vLXBXօJwX̰=%NVonH7-㽂SLWF~%wr@߆WKVM!X2P +$ f!+YQ f%]urn&9&INEKg;Fw60o^M㡶$r$nxcZnajpg3_yi4:j(o&XvM=5" k/iѥPk& Իu؄3oۢEu3ʂ9_&z]G/)Nf>L*7~C7s^ĊtI65bZbObkXQQrwFsB7laIo4']ӊGu +'MBfYQl Lļ<}~yu+UL{W׌C_h=I@x9eUQǡrcJz<>-V^c`0N~pN=3"0WF~o ح)2T+;T3Sׄ@gd*kᰂ{oNȓi<5a$(7O5FB0+% "ny <ЖڧECM۬}FR`i'g:U|:6/vKϤzMUSwOk46bJ1|UA aP늮pcEkDV_tW݋dG?][emY^T_N;v=8,=3u,ca aY,iaSԽV8u>~w2/#dmɜeݒʬ,c| ksɁEx(,J}&tOW,-C-F(˾$vs̓=UuՊ!M5YJt,ԮE J$r*?{J^ڮgdHǖ/$ gl*^UDZO?)F Aj#HUS&,T>XF’šz~{}عTR ޮű#%@J{n$:ֽaD6aLJ\oȚ%<;U \=/TR!X3>rӞxBzmAʶ{ R@-cZiŻ"{x)7|ahl(AH2TΓQ0.so^PtW#ErV <=%$#v0w)y0*CЖTgPfI׮#f2Ԕd 恳|YyCHG()wtuM{Ɯ kY꿫 Ñk3avph$ GPѰ+awخelfђA׾SBPM`WKr<(eeix ; +I%eު&,8ю Wo*f1ś<$[g3v#"}A{k rzSu3P#=%=b=RX zKf +B` +_`;o:50F  !mJ`)hp\ +u[%s޻Dg'Pt_%J-*67ŎcܹH @\a!y9$13d "d1Dj nb_ J]ko /}3{fT^u^'ڳo%y惡Yf2oYGpFqaC'Y0IlG!g"#sY g)jh8Q,}i`j 8~y 4*k#lw]`+! ^O9~/ [.{GL:xG.pp <{|j CwClw1kc!>h.v7~ Op;v8}'~#dQDGqYoӏn}|~~Wq_^{{>o:}rWծ[rVB +;]zFd _§p`c6q:]`> :4{fR{rTkuΫWỸ*혝˃Œf#yw]o=F[6wnk2``lVJ7x ާSeqEPE%a Ts<-#r'W(37cc QƨWd鍑c'+4YSNʽ~ +ۤoRwåRaaL˕z5MpVS*:ԣvV5 2&)c2 +SNo*v{ԍʶ13ۜf.Yz5g%..v;dg|3PBʂޓ /3ĥ|ՉۓQaB/żA,=o|gq ֿymodrqP.:KX+*z2.c[עq)bČ/16^GAi&GZq=%ɞ1󬧃gUvvg<7<_`}Ru-2g^6FE@kYmBѦm#=𦏳15:*B/ d}<~]郦C=4癸4 /-De[JTx?€s8 +sø -G8ќW+ƹnoot3fO268 Df*8jsnj *}mSiօ~]kP'.9ٻ)3ն92咧Px]&9πsj냪g{.Gf2^m;{EC.WI2W(NWE(uL}u"qa%cĐE Y"ƕ+] sf2s}?>kmx C>H)RD\蒷c^ܩmLnq-=.<nTThc:F.u3Y)}ŕit="?ٯ“Ǿ@qm;;5]ڙ%#x% /kOuuoyjwbKg0Ua==oԎ$BʄU-(k$ i/iTKN![25 Ϋz(p:PE'<&ƪp{;T5"͑3oX[C>.b;̢i xinf}cOˮdE>ݗC2mbvyƮul +BمO/"^e'iL3B *ZSJŤ:Բ&/z'Ϭ?y%Ő#R9Efp!20muRy`_ c,QÞ v59`Cf+|@fIH?LwfQ"ISf͛*br*݈9"K]bјF!F@އNe(jtRc==[)\!ʇ- Z + +gڬOSv^ofظ[<ؘ9xg ]#vst41/l!m;l)"&aHeį ,ڪR A@ #k*G"?*ڕ Gcy.5¶]|ʭiP}bg;HJ Uto_}~]n4AQo]|,㔭G=OMѭVzMPlɊ7l5tE͑T 2,qHœ%a{*|\ٕnb]{zUT0;{|)ZKA"|`v>歛ݴR{$Q9% +-[eS*Wh1Xq=%ˢɃ}Gb-_X$m5699`ꫢeNfݯ7yMi蠥h 1N 9iJh 4@nh;-,i,J*5Ǥl &]1O8 m@FQ1|}q9j/eBEY\5sm^9:S^xݯ7]^Z0ߗ~vưvis\Qf@m +HmWnJfޅ~D$ޤ-1 i +L‰ ,qrum)&R::=p< |yB1 +3A_4뜔 sUShGM ]!=YbLdPĘލ?(DF1EO2$+W4w +HW=MFJ%BuyMC6̲oP'};Nq~T.mRviQY"BC\ĸW'UuW_|Ղ O#qx12jd\b9|e"gjlf]$ZNc!C ]r`1e'npzPCM_y4FӐʕ11¹JM;y/7UB7ZkelEnɽHm~hU!7q4鞄 {Y|HSƚiJJFc +SҶby/ׇkAkk##kԼqa _]?άՉţo6B-r*%*ʑs娸$Tar1{}Y -]ЁzF37__^?>auڎ為Y0`['$t +h_׳ǚ{bNqR0v|>&n$eۛۏ(R7 w9lyWhNZGI/<hT^Q]K5T )LsE)2J$ES-9k6+OpƓyC܎J({g +e ~lϹL[u5i>nX[րͽ}i~/)ط u,PB8}Wv8gsڊˡmHiNWb&nmW \X0t%)xժGͅIyi$L9{U>ctJM;R~-۟EݭO8Bu4Ngroj4]w\Ngckwsb)(IXBy&KJ6m*_5J-Tu%}q19q:]e_'IeE ԍ P))xސ~>m5siw(=xNeWå~v>yMƤ 0Zzbn+ @3-?Ӯ#Uot;Rs+Bf̭EMI]p] MbPxPYNK#`ap}>bb-iZ 8_) D=LP'=$A"dE,j:`yʪ/6p뢫Z/r/IQ Z D!01u캢Vݻx\:^7"ZU4WS4ݸI1fCL'OTmODL $/FMjNӤFg% xBa*ldâj9J E0$eO/ffod?g֍0fv7>a=\nT~IJh0jt#d1V*0:ve29ʅzgYTkCd3)60]ȃO#L@!+\Qr%UȏJy_A)'~'\u"@zmPIp> ],lB՜r|J+;/߀ͭѝlDnƈռ N=8\1K:ԁ$!S0ލ+Eu=L%SV)W|~_ wEЙѮqM,a!4=H$ +mA߫ 1+~ũi|?fod~$crf}$yn[1Ʀ~^DoQe^jukޏ +e#yaZ7E$sD&D,moi9-W/PrcY+2^@IU͂ļ< WEk3y޷CDgA&i2Eb&M+BHYAشXo&E.|kRJ'Zd4|dOOOd_ʮpטs#i Όp@tx@L?Chܱ7KiZqNAF% fM*] eִ:ϋcvjb\c>\زH$SHֆ=Qu9_4gC2k&%1A:5 +9z?e}vY旣mMRX MmrrxCekj^(]X2|2U 1Sۡح]YXZ,DtDHU .V[YAɿR'kմ%?Zr+mj5c.aog''<;J{?V6U_re2p޼'|w48垓iB,E{rW(aټa62M{SR\iG5lF0ՇYX ;G ܑ@h _GiC(}h;T6ępEקA@i0:215[メi4u9eR[zGgJ)T +WJXFʴ"yl4k ^%u ':Eٓz),= o! 72_dO5֓g:/n.?9)11z;nlhVä»g/-@}{$)kk0"XZ'ϧl7zx؝n>egh8b>a!Ic}䒱D&xa>%*"Z4Xzk(J,'A~=˞MU;pjp3҇ePxt2YS FK[*鯎ZflD;~|IT"4|AY0^ã k6$ܫ 9:yMUVj&U23=[쒚~J0Q6ΘX(נ޶*Vvȟd:kۍ Z3]**Jv߮R#=VHur65{#{nȈgjKNJb!%띓0c7Uo݄T{v}dikyx\~XrCx۹ƲjFj34XiL]W y!+5je+^nOD_j~v75<N؈N:bQP-PpEmefS\; j&wJٲX&of/egفʿc3(ȭ ZX+ʼn!ұG푥~.PZǫ۫Y }ߠdp_] Cwz!%qaViv8ԯ!?Nt mi9hc#T^dd=6 +6w3r2~B1KξϮlӚ_8aeZ:QG?e?rkG]USFtrbgMHr<$$Z&U8XRYm };*¬6]% iմc[Hvܰh&.YT&`g5RyU6.ERc&Zmx6~btG0<g)Ju +uaԶW7Xyj#} "YVN"KJRM#:YL?6{c)֍F[p5q+Wg``pklȏn0$ TʔATɸ2 +\ jyO/ cja{FPt[<ٌz+~v*焍8c5Ӵh2 {*є]&ʻHuT۪č,qI3թJa֫zUp!w:U\'KF#KST,x:7ܛXk<-umՅU?$Smc_VXPkÝMu[ O'ADL&9o$Qha]KftҠ/Qfj:}OP.V/΋JjUVQֱY$NZ}B;PWVMclE,:o|nAU}S?8X[ n'Q99_my|HÐہ|QS~CգL=jF>GXG0U֫ {ߙf'ii񩊨B2LV{|z"TuUVۡHϬuT[򪷱AIY{^Ś`R֚ͫyi<}iixv;( 𥳐.q+]BY寑ٹ^w8[e9ͺSX1ǥo;saѷ<6W 6 f:tilf7?Rԫ!kU^&IjR"k~9֭&xGNvi=EU3Rjb[#Kr4SPZ}K֝Y]JΊh x"y({!̕7r:M,fǃ*6婥+sGU)@:ʀql\9a7p Gv*ZE:*(md'`roݏ_/e5ڨz\3_c-OP6T|*M`dir-u/t˻:QWLTڶk6*'Qq1Jk޵SeUeծ g% V4mhfij U(Bk6Ӧ&T4}K%"/jOo !|ndN +9wƈloo!|:,wOUdxqcG7_YKtjk)lۍָv7V+np~6Og_6`l_j2>X.|~ [x6̯]ַV{` +lwn`+^0},;w2>ugq ܹ9w8^fr{\%6~C]O#]#n;G~ݩS@yaxM/C]1t;]t܂zruZk<9r Kg9qqe~ٿc{ǗNSN?s<{;;g--uOc{=vnɝp/o3N3[;厸\G_Wy^sI{'u-/Vq;uy{=߾݊{c9Y_QGӷ]cqKNvG~OUrƇ7Zݿc * + +endstream +endobj +4717 0 obj +<< +/Length 23532 +/Filter /FlateDecode +/Length1 146556 +>> +stream +HWMl\W>x̛LǓlj$c'4v~5!)'McUMȰJ*P(B,`PbĆ%|ͼqZ$H{{')eEٗv= ǀxpܺ"=~m֝SȺ?c>ukE~ȎK7__>9O,ѓZmҝo}""޾}b8y"HJ[˗z ͻwn6~hQzơoo\~4"}6U%%+Ю]@#Q֥.JGeV'O% +?ӏPzd~xCNea)JY*R~,{eLv||iZ香ZT{N.w值 o=i MmP(J) +_2?Wxy& _R|Fa/ ld28_D\PbU'ͯɱ2ϐF'?G ueMVV G:5rcٱ?JP?6%7CAP\ ƨ'm U1@bbHWhK|%1^ @yڴ0 g py^[2 Xv; +xp p + "*͒yIPRnQ=WrI̯m"h^jN d {&璮֍WH{)G57ou{Wkخc% wA->'toNTgVk ڡrK5M}i=؜rؤQp2&~dQTw>H9BOp~ǶL$|ٝϒNc:B9iW\U>ַ~i(tir:3н@a|'iD\PY3 &uZjޖ-Ah5$a]H%O體|?Rv+3XQvoiA@vmMUd;廲w&: ާ'v\Nm7dC>жWpIP 7 5@ %SངrcțcrSUXtRa,'Y99PC(n/\;2M/oBV=,_h i|e+~(CkrQE; Ó@6&ۇ';@t3p[PfK{>5Dބe+o boȒ@LQr&mwhذ7C IV]b.y(C+b2mt{-\82 tvO?0ھtynmfk4tW\vhFjecZSTDQ.+۝DVJRMvTBvj ؉ى]۸hBӱ~ xEZèqlj܄(vQ!΋jH;3γYR`$ +W/Q2/ҶϲV@i'ϊX/l,0wozKO?([_ +,yq|^ɛzzGYQ0+҉:g5m>omjFoEԳS:0 s6ӭ@`w1Je굞M%Xv^NT9*f] H|^G"5'qp{+ }edz(ijW +|[fe-wWK}B0GJ~D),%i'm˘ȼH=粤lekOi-x7RJsV[_ݔoWߚeUErw­۳i[4B_aZH7|ڬ4O͇+qѭ1g\dne:(q_ozV_ݝ.gf-7%Lͻju&z2_oꕞ# @Rfjo1*ꆭMU~jbjٻ߆`ݴkQ[|rfyU5LV,jV7YF:Krv'U,7np~Od͌ 1R$ +de=ϷO|w uesK\ziӡ H+'y[o՛PZ߹v=XwG Fڎ}̄}:`>y,0Z.<сԁaNԁƂ8dBЦ4XfZ%wFSUJe7aɂQvfŞּ!'EVG v\!_ثI tcܑW1Cu(ӂ:UexRO?#bx* NYt_u>,db|l3k@O(Xacad=718,4#ԭ.#+'_VdŜ +N4$Mmo+k~z?ezcX̷EV0NPӢgF/,Nk*Ả6Tmv͓cힱk^d$1M\+~D~iag'd|x^g'i_[y ͽNypI 3*UL(n5fbl|_4H4b1 v8B +]'] -6|ݡ xa +>(5e C+76b:k8 #G,|Luiq@g>Zd'=}&{#nah^n1W8< aozJ'o8o9ZϕNݭc뼖mg(*muʿ Gf=fd'!5 GDEa!C{<{F|*X2e]?$%$Cn|1ݫZ$҄pG2&4  B#'tIԮ P]/tXWT5䍘qYǍ9{Td~+vkWiHZ̤:^V]g=C_mUBg3`+"y_f@1/>󽫇|ǚSO0܆; Rz'g0l]HgdT8O>&6ҙ?V}q_Y ]㯓Sv `a Qy]I& K7xXf7d?fg2Q=O=|K λ^ΰ #׹Ћd} &[=OI2"/UȚQYG)8 e?Qꅘl8w.t{7dz>vs]L +~ν6y|MXW`UӈUa +?%;fĜ`:cN3|1$[y=^א1#c>u{C ?Qw}ɜ_EygHM߱;ߪzEVaR +vKBe艽F윑Rw +jY"S7D=g8{YgqгS8D9,+6_C? +S |ѳ,Oۖa'z9J;-ӍV+#+S'm]e'?%M'&= _bfP8]<l!.o+Jm|blB7Q [F?FH/FwEkYVM +7R"UkӛA,MYg;an #`E5þ^,|YrIca(OER'3ik||Q~gYdSxdxR8PLB/hK'"y~m +ʡ(E4;"(SUͯsnܭp"]yv%Y" D񵨑B21*EE| A:Y̚hyzǁB&5J_,IrۈGMb%Hƚd;}:^L-$侼5:c<*6*"/ 3U1J!QFfeD6HZ=S+L*p5F]u>5f۬~^Et GD?٧ NNL$2ѳGu#Έ U:1o-fڞ$vx#;N-~O|ǹ{ XHBp20vi;M;>x݁zJ{3d{EUvvFN{o{!a\z@:@bh:xI?5H b y;t%fwT.-7zp)-ж`P>u_i't!v쓨x*|]2H̘,.AoNWa=uZHYexhw_׈~ʘ.-zND'G=Y,Ӫgo1W">AʳU&w>+ClQ~k-}8-źbxu-@2q _4"BNc7pRk՘1#<*7[˳)w6֟%j!XDosr`:st]9>hGJ'HQDKgQ< ]+(f|YM^W"--JәI<^ FJtNټ9p"YJq ℸ_9n@T8(Ms,X +M戝>N'# +G ͙fdY9#:rt +ljoN1ǹsA}TujjTwDsOoZ$Mk[=N{oݬv96rZ(PXV*m"dY#ɗWHyLyM"*̍k8M&u9$_i]]Mw"e޴$5mILLy|ȳ|%Vs0VYd+o&VnCh-69E1_yqNB9]zG1ӎjTDrL?_SbV0Ƶ8Isw\umcMoVՎz~?O截pu< ;+VE1i6p;vjTǼ\y'´ef(Q?/ƺQV`Vj3{B-<4;2=O ̄=O~GzGO'V>e_QL^$s&ϥMPYμ,ɲTf45śؑ<[xs~:ͼ,J"y<7ʣvNIѢ궜wIh'1,1nkXy|ӅSfY k,IrbAB-Nm&T/,Q(+JN1t1 6 m-zyT̉BEǸ!#5v@ ?/1]Zvt]7r?,"Q~G?U fy~_'"U;Wq"REqJ>$ba}EǨUhPgntu,JTfẄz8xоx1OlyNXD7v0]U[0krMwmЁxBi!ͼWuu'{y.YթSir)lSֱ>t*kuĂw^(ya< M;60|WV|Z8m6jvXP/D+r^d/W}þ})#^g{վ:k0igׄHB\xhz-q옔Ss! "F +$Č=QS=漶p΢;$2w@-{Z 瓺;g(u-6q,T?ۮS>ib^ kɛ8EJ?5iW;XdQJr>I=ѓMEPZÁ]Cu8IYDPUkxQ[sABQ_8;BVi ]S;dT qmʶW#O|@O;TG*o<;ˁ>5}2wf;t{Dal;*@?#2]?6@ $ Ai#kߡ!5v=Ǡh5n@fk>qΦwq>y\ڡu=t}/`WoM:Fe\/2' +o +/96^QDM~п+q[g6ϸcNg_OiJ^ӝYu~WDMWH qvc(62B4S+wIKڕ4]^Y l nUy1zS?Ϋlu܆ɒiv$_ȃf&)-A H 8=SNk줶G3u=5ϴ,Z/TэuQSE5ZvmɊq#&}41/W;!u; +YEjN? 8C*ڲIN5Su^w 9FXvU +R>53݉+/D XJh7`:6^٭+ YGvtYWໃJtɈLW*f1I7ʡ)62[\Rg'Y׺ڈ3֓Tr(UQ 9y睜7ʮQYvhp1nFH&3o;ٛX{Ģ ) |K|yyFHm5s|FBoev͌*W_^#q(w_ XT3zfc"N & DGߐK4*ɡȍd1ߖj)m2D"OD!gzif#TLsV"^SMJ +kTʹ\MoDD⎆#Rע qFO2Q,uY(ㆹY?<*0>/Tx\} gP[7Փ+/WpR*Vz'<$U25O g֭da^Б]sg|׈5w)#5"j{9E'}zkwLр" 0 LNN3 Nm[/p~-vݧv yST1]0.Hw9KdSmU= @/.BBEf{FfD^S)'zvMNQg7{v}h5O ,7ͨ[Gqo%j$6ױC;kCfl-Z Ȕ,Wd~>LH#>H"jUaf՚)<?~WtN=<-O3OiG`*dkS'HD*_w)3ѽ֘>;Lɞ#d?֭:N[ v6TgxZG%IgӃI8gz[3vT`Ǫz.k /4Yi{JߣƓ Mgs9`SZ6jo8͂Ӛ<ВˊD^Ӌp}Mݜ~G$r)OZGd1gIt:8Iv&w-Y[Yoz'4ʢQu: {jglʷP|ӘO,ٷZPo:Z{w}= +n$Q}/UGAToxԯo7ztN('fߛ2Qg?_? 7ߏ2ǏCWU{}ez gB/Vp;Wy@wˬX^81s+*뭜u)PsnV9=ʪp-2WOF~>Qp`<o{P܄ p"L3 3&}zεH\~] MMب7] 3xTDz^ -Ȟ {owůeߣ<ߠwz;*_HpEԅB$> +~,@*O%tc:ٺ.£&NJ!P0iƍ[h7A*a겠/ڞ٪H;ԯxSTlOA}qd0kFX:7XRWxH詯 ^:gw%:@N3 .Tګ _h+>Uw_~b*Dk.M`?%H:DВTRS5<k38Zk"IǕǪ"aA4%YD* +MF!%m8gA0`׋erL!`Œ4-z7Uej^ +qr%Vrt˜||#1OixyD^J_bձܓeE]Pu칹ӧOJGEhHސKGRrψ׺Oqr|ELoϳn&P)s6Tۙgڧsy@_[QTҕo+4F3~3NZ +8q˅3~RX-[@Wkw I%׾TQQ_"A&H-"qh߽]|ğ{d>|ӊ&0d"{3 +:9t-1twzɞ7kwjӉh3:_ zqa㉙5 1v|6Wy4j:"i;hjjtazDjzAvNo\Xs@{_!J~ NPg{ #g틓~jeggg̙՗&v}[p%8R&D+"hLP"ըDU$R"UJPJ 1 +kY<&3:@2 2TQD|~SzّժM,'+)ȮT[wUEf!֚X&'+y}^ C(u +6`n,W6Ϣ1gx9+V`}+%]>B-|kz 083VTT걕g󈐆!**<@*`_4Ƹ^A+#ph1{Bt݇'i:O ޥoZ oT6UC8EU}vU3p <S-J)˨^gAo^ +ħ#ZcdcocqHaP?01j& +B\,˅ԥYjZos1t+0,|+Ҳ}-EveKMOMO- ɱWvvFxXBgZm6]Ϳ罝OOy d!6\O?8ձZ_A>" nz0[@"BrzQ-6o?Z˝Ge 2;iq{&lNrf1\MRld#)XvMp>ӘNEĄx~R)&AɡbY09lkU_7_Oy:ϧ B{>wkp6j*85 +:CP:Ed`zy5dmCpe\]`f1NPPx%qZMp8X,Qj;MJy tV˪\+O[ M{q8N.r}ˀH*-֖p130A"f42x' + 1DAV-`qMAF9Q{1MEc xؑDÛjNQw?Y9O)%Rᓂ>Hy|Fa>,ҴX*Q݂ "~7M*7$eLGTviCw$@%hp-A,3M+Q'!@Cd̞ZƱJ)u8 l`s&SfpVj׭]ٙ@:fYw8[=NOT(q$WݠhqOut-U_ +VPwg z#qkr-Hz퉪"Bt$MR.4-t~RڴahO/U +~:qF{!PXZCoi-cU&ML@%XHy<<ԅs.sL'-Ww%>sX_^.mvЁ~8m&|0ؑ97$bnK $]?)[>^~)2u:B:RƪOt{pɺ%:6)A-:帹RBDPȓH}'.bh(S BDcggrMf]EEw1R']uQ\W|;wݝz^ v0Ecm٨1RڮPP x@Z-*RdQpTT~j{wm ]sa4v sߌF㰂cQΰzr@ىÒGbֽ`*ğWqɂ5Ɂ/bkRHAkb?f;7|.Wa:J{85Y8HrG-7Ab?7 |qUD!qzr8MO["]E<5*P DW5XS c *%* rTSӚG" Z^";W) e6~ 89vق狕sIzz/ZӰNGV=MmI Kj|!^I> + ΑV@>c/cٜ S+?7bȅ5Xz^e]Q ÎʎBP; 1 L!ϱ$csn^tT]rxJg6=JT!P'LPmGWttvvKeo,UMzPS(RM̀mM,b> +!6GU%qczz$[ų>Ç%ۚvIJtC;o :G |1u kNq ,rk,sPsAs_)@QUg0{Y5'Ll67ן65k=' IcF;>h`{ruS -:*]ygP}'CB!sh8%i}Muy6OFo> l tUlb*;kao8cvEوv>KjŽ?.Zcp7ؿ\g~>sIw?ds.)wzk!};Nsm8s_uf*\7. #s0,LMR1Wa)X0k;' +Etoh_+x n;P ڔQI'`9X9L1_Fm_LxZ+r4g@/aiey! +Yx,MN6}3dmfD(a(Hb4, +u`")B(>z5x"9D,%޸7% nH']R]W,8HVէi]\@gH*&axB )8lD:vA_t BXlUb(<7& Z(v"h^o7o~"JtkZ))/)%/2vz7Ewr7ջd2rc^#ybr*H2n!J)Z8kg^ Y<5ƐHa>$Y$qp`; ʴ *WCoiT!g<7)~# LRS{~fPJ>YNmW0 $MoOg#ݙwe8zĩ)־ԭVr` 0Mtrgqwk30,0Bl߷2,J[[{m@d"q%G3cx )<L6OAU_z 3PnJ%4fJV{LՔ914$cX,U}3?Y辟S$EBPt/ZRO; +Nu2@ Q(WMl_3f쌽6/زqqHm6 *b +rU8E8Hu0vЏZ>X8ʡR-!U5J\^:ٝy~G(jTt!"汪yԨy2|  ş)Jt8C6EMMCkml{UhiOB =Pv% Dr$@1DrTʻ3 C%6ݪ+`P&Vq]g4x:;:`,.e6oO0 H+o}{˕͊V+Iws-lF4xɶ3mv[R7ðip }9i2lڎjp+ڎB7-5M6;Xݶ9ݻyI^ VI? -U hG@l:bJ/V+EfM +2 oOHU 8\^/T~~AY0Q↭RKaGh7[`5ǁw`Hfy0i>+t TB5iW-!,x01Lf#LCFH^7(]u~!jC +7@VˑNpoi]%nJ*BTt,,'cyaȾ)ܖ-bO% @;xf P`I]t6İSŔlcTeRT +R7)n1He?/t||VF.]-,ە١T6雒Ysm¥`nbLB˄[0厏q!̃m6v} xI #<MFW,0ݫ3krU!F5>](L(v1 Ds=1\0iʖ\j*NBsM9vttĝ̂fuZrQ:~jx,/_ S4Q㘡G~b| 8o[aDO`lyT[V.ue(n6ӋgNJQxl-;.ּ̛31R3kVͩ,@VNɞL~b⮵A%㮽$ua/%|پ(9|ޞ??g +:G^L"%KDM-/aLɃ CZr+h M"54.?<_^1aZ($ n iir[#5h +\`+kp%3o tMLeRPqeVs?j.9M\92s6cuvQHao? rڝsop0^ .,](C-ˢm<"ɀc޸7]s0.Q>@u`U5غc:н!d”T +g=Ia^B3tGsILf=н)~ozqrћtk|'.ҜZ2anPY:t[pdNa Qħ+rH6. R2`_$egGG?`Aq/ѧ=P@U 'pb1Y]?6~SW+4htVsa[܂j1c 3ʸ[M}Sw) Ѵ_.tLMPC([$[-_0RϞ*|"q +T+z6IbA:z& ^q$~qq?ggf̹nl&lƴIDM7&M7mGA_UED%)XE +BX))qD|ǜ +tC .O/R +e#wssR*~+ vʼ߲?V}[mFcXh7{oK'57Xb֨oQ]tƔ/'LK:m;r86 _'ri 2SZʳT)(~Ab߱!z[>H*/K;>-Zlj輑㮴lIÜ=aOTX=O 3zh{R?CMKFwÚ>r1=?~4hI6>\6oГ@ޱ-MvR&;aoknv!mVAE*;hn5ooAo@i}뎟lWX +ݦ4]Ʋ(bM(vº0GI1 +, ei,W~-^|cK6eOW$6@Ou KMmaS{Q mrZ{Ui&zX/^&GUn=բO:ىUqZvOr>6շ62jB=S>ם!Z--:x+zi{{sWmqT*L_{TB|&Fb[/m[ȯh) dYZ"1&,FoVr_ǒ}%L[c:[* f,rD/kte2֘$/3֔nQ[?gleƆ_z?vj:gK#t~nJMo=[!Wt/{sp'W`{qV&ḨoelP<_Vͦt%3:bb*UlPr[bN1c׫f<F~]ܻ~ɍǯwN_|h 7֯]ӝ==pҮkWVV߸YxMuV֞XJ5=F%@vl]h>2;6uL]~PkI:[kNl=̎T:]ήҕ=l?):{=FW^){έo~S-%|\2#&~'i/1/~|c+k*ɷg_|͛l6.Zʇ&0 + +endstream +endobj +4718 0 obj +<< +/Length 9575 +/Filter /FlateDecode +/Length1 15620 +>> +stream +x{ x[ՙ9>$ےdIWǒ_d;qI%;q,ىmNy BhPSJKʖiev{ vmmmh ,e-mgngaX+vM=BGvNG`$ޅ^B]xĚ=? 㵸vcB} _ gћlkC_+?O^O$ ;>LǠ+2 +:e48#H,Ha\9\Kěܜ4pdQ\J\Fgb 2Ι 2 J. sAlAl;gfb+xL{8exv^Sg.B`uEG/,8V儮l&dJ\b2-4=Oys)_Mɼorƻe;9oft2 SN`( +r;g20Snj*n,gri*=#N:WJ{:d2h4-~ +wG\C{5hBq Sq=R, A'`{VdUhAu:.t@B›S98Y6g3Nlk=~>ҙIV.7qspc1.lL6ɁjV/=dyS>7 c. e.K#$ 'at>@+$W\F]1LZ Z'-[ցi%Psv;FdBXr s8bV7 +4Z -ϊ +G>>+"}VWTY\Qgmp>AYNKF 7LZ'Ɇ ʤ3 D=JH s^n>%>=@}z>}-@}}tv2m +±'8=<g"#l:rc BҔu +o-xE'vS[WlNST6`Aga f{S\8%ɉ.}%-VpsX r[ Ks D^g3I]oy9)%!ׅԎ *we`+ˍٹ {vls6*ɢ+@;S#+Sp:>2VH=3\gSd*L3ݸ& z@C#ViI"8 +'oWؑ"Hp;IE, / tKqJ.e=RJUd!%Fᴌ)A'+/ +Y[Eʹ=/- ⚡ ΍$DH#b3ӸҌ`;7͎:Rfc7]a+Ay{L2Fu @Ph +T?} +糐ҩJ`>`y=R5%*bJc L(p:.)ϗ<5E ,C6nj[w}x?l& Ay<)n B˃^F:)` ^ld:ld7IBg1 +C;{) /C/ =zM@OpQ8OXo±4=:3L3igI;s:vP9Hahgᕀ"Ë1h0Ë^wE{G^wE{ǁǝE`or'NJbv +bmҥ01RVQtYK}.3K>]bo nK+] +~|TR J ;]do >KWXҥJ<\2[Yt\ EL, Ȝ'u@fxm C?g99BQ?ȕ#[@c2<0B*Q3-2 ^5=#ȵE/ډ{z.0>x!^vl7Qk 8sA{fVErІZteTW /jB+RhPEV 0`?[ƕrD%%$„,!G4~2qE-`NE*IP&FQCorVz^E_aДkuZpY0mZ̢E­-fkhk$,lGko0C,Ӄ{}ċ}lxo;|;t\ RO~zapG*52{Ly`Z4HJDˈ[:XE}0 ˬ&LֶHqI>_]r`wO2=:;39_JN}>0paE !Ɂdg7Oo`Vtn/*0cD^@@a ? +EH)&-kw4$Q461D\[誶žSW:ua!aMԁw"s"!KRڻGt`@8 kO!n ԢSQVVxZ55^֗¯y2Q&yb3|8^\J RF~r@*qd( O!+J*^RlTD[$e͋{ϞjZ;s{H;5O=Ni{##*@z]z,T-1,CEn܂~16눢]źӴ#jG3j'u}'Nk8̄Y*dA6n9d{BӮ)!1|ySp + +x&1&%d*[^ok^ۂ{~|[7t S;%xedSϧXM ᛥv|-׊'% +_鯻`W +FhW@oDȠ0$"TaH4koIlܛN˫țjMmU +H!.A񀊪$7 ,Q' ~1FFJWn5T+X_R:E:`GŐᾏ/ޗ=y'w Bݱ[# "f!ȽԱ#nŗDmѰ ¯BG)Inua!$n53]+^2,b&cS|ҩ{ϝkSW7q;!?wr_8r;bi <EV'Jz.w>VPTQ^BN?zN?tmYGz/h`2%YA6"SNAC$~8rCk-ARIE-n@H*Wl77xkëEy|Dv=h=W *iQ!E%ʻlɲa,T⡩"?mcn\jtCn})<>{dh4|$'S#=}u~=uyW5w {soc{ +?}Z*A^빂`,\(Xr|&i +5ojm73QboIQ# aׯ//[]c+f?׳"RN6bySrF^·Eu1NjXZU rHO3UP`e QMA`LwW e%S@WH6 X_\|`TK.Ln`[ 1T@~p45sxB39rof1f.$Z~NyZ?*B)$ +8- +?naWPɇQYA2hZSeu\j}H7~IE$8<ԎwHTόv{dn|pyy7w}v;tx#m kAm@e S)`d1u%B-ܘҭg8<#vwˀaV}ap r,~ܟm7hJ/d!]ynxF>g,!P}5rȤS,d90wX/!EwO"0~͊ms:+,آVhPS C6͟9;5\EV:X&LjtiC寬{}K'gi AhTBt#4xDUTKPڰ-kzcdqA鞋>E2pTm;;zvwwѾ8h4tˤJ&ƨ +x۽r\B5HGX-LǏ̏2( +74A"myn%OOMuFL6}5 ◷.NҎKz%7p3G˭`( + ~I@Y"yg<8*E~@p`Zڀ3PiJDvw`PM%7ʡB/97aZMAs۹&o=xmzFv wݖNGGz,G.̮CY˱i%&Hgw5jHFb*q9`8oLn&sѤʃf_LxvvD<&uҖ 90Ļ_AYŨeiԫ| +֬4}[AZh86i7|=E5֚55; GuvdmױdMÁB5̗J&G!aٷr?ST.kP@H>uBڕKCTcAM 빽#\hs5v u V?D5Gp#VϪIU;liȠD M̉&_?:?6ACk'8E0{sc~ +*3{_F;wr$!os ©Dk]zM@uSF^%XlQvj; )M$|WۇZFdgeGm'j akOj޵o0Ժs߱qDYDUzɂq晀 @ +i&ri|zZGͷ'Fٳfw켶'nI f4K}k&^**Ճ +e~HCI+e#sO +4ay/L9EB>* .eZݖ@%nܛ>=eN,&plHs)i ;>2qn%}z(eԧtu.GgjfS6:Lx#jUHytwOd4NE,Z]^  JoRqUIuN^/z.Ҥ3 oxiBςL}%Gj"_pO*Ə}LrQ^łj}lL7?s_>??mSN;T3=ܡ`B_Cl4 A S:M[~JX[[ ܹB/NEؿ7*4V(=;M0(C9ص'kQQ73irW2jzf_kܴej7@ڰ͊sNUWq ^>e 7Rn4 ,s![[Wz6bڵܟr+ +xMsg%ߩ4 @?ʾ2bT6Qrȋ[{em* ź>Wܼ !|8d8o9-3ؙDXڎ?)q-)OBmӹ"'-+N 1%b<2G2T0>(" &kUz[ReoIVu2wPDcVCmlhæQ*1Y-C)~#'h^ ֶRTLG1_^ۗL{[{p}0և(t~/6MWm6<+_?LizOy:OkH 7{J %&VO?XO*]sL +rmݭtV x [Ԭ)f6M,(|.V:x2F0E9>hm~ '/GotAJO*%eCýa6^oz;Rq]&=w^ʝ+`0AOE A̾ziӥȏ#i47NnjAo8ՐNc ڂcA4ىZe5CkfZ`~~+נZڇNQA 4W- ec]xja~?A+%&o=4daC)h54>  iTaG e~(e{p8WUFs/@l jvO} [0h)hAquf=U?GHpB{ kE8YRZuPtثT 4ڇi` <4!u{ת3W2C1c'4vm̀p,BY7CZaxUY*xV jZ gpA%Kq3 Yo:^?.1tfz=?x4'22Vw+H]p +A4z6b~@}F%{]bߪJJSϋ'h{v1 )}lg;ZگZjDUdLN~޷'V<} M+uy5RP"XӡoCM}`nOa;> +stream +x4P^1 +endstream +endobj +4720 0 obj +<< +/Length 8352 +/Filter /FlateDecode +/Length1 13452 +>> +stream +x{ tu{ofn$ 0H + EnQHDPVR$ZeImڎUۍ4qd;N6jzEc'qz4uI&Mo.N3;ݗD(!$\ ;^/yF^!Nɽ %Ę/y| +L Y&Nˆކ#C'JfBj4퇁& ONM~]/7qdO1B7ói2yjJ(7'!!#Ա񩡞o0/'sb a^BL݅Xp|̼8~|z~>q k>^zf>3N~gL>3^JKWqsʅs|ŽM,;>~AxGTU%ޕ7qc۴=6Պ^yfK\eWHٳGu{<*I$t^!FU* *R⠌(U!cqxC"X2@" !?J4QJA(}IIz%f)Q,Ru\ ylN?quk㷚=ҵG*=0g8kV6GD\Ix97%MJٱ45gU\hRe{UQUjvPFjHFeA$eSm$hgpr+ )Oۅ>"w(IT*6qBT Df*NMeX[ ]5 Nq+D%q~p.u,Y*j~l=nhH50<̰ E쁓UslDU3J6ıDjWNU`x&mq+%%>gTVt.LRB P|ot4 ǚ*= +,nm'H8{`tn9B +++R-{ֵ9Zܥ +\TEXI4E `&lY r@ Q@x/ x/ Ήxw$tx/^{ip.I+rJoAoR&Gɪecڤ$j~|Si"2x/^*ޫr7ؚ !ёW)8a5lmP 5u +=M$ ÍgT߭ࡨE"3U9^-ABGӃ2ҕVӺ嵋ϲ4(e5΍,gTQRVrܖ6ێ\VĂ;3f61`ꦨjVtq>PE5@pj qz،8lA"ۂW!D9^vGډx8 8`D g"0g"qzC>NW'@9]t!tӅ!NB.&9]t!tdܶ)F<C(<\ƙ@Ĺ4 Xfqד8"'p"Y D}qs@D~L#ܩp"݀vq{GW> Dae D DWryeWD&tAa0 YP6t*@gtaC 4_s +DO*#Waam1[n DD@̒=fEJ=ISoM!]:% 4kz'a tX64C:p*~EOΞj9]?=9O;>}`d7lv6^ijjl?y7:4}v.'iH ݖ VYX7 328x.zoM:`$&tdDP2\*7z%T3\- #?#In$=J˼ȆPn)^K}R_wW|r^_OrDp=8#)U(}2}4U،-|ĜG R)"O}$,>J|h(D)" MHdsQWǜu;8U{xDž3*[J:~_2|_:s|Ξ崶3pzqG\9ْ% MȳG1Ap>sI8g +7˺Ҽ莯fbR4 v, ?m W14 BÉvs W%5å];"ڝ4|5Jү$šmё[iZ@6%@FT|TAPQD60}>Rg(6kR华PSl ؚXs~lz{x`cGI_)* ++U={Z/8]͡U@?T$K(YC?!vR)Q"~ N*} ŃH!:Xh&ԧؕFO# C`aEbz|$I|1_fo͇@ژ"v8ر rcBeQ}<'`"1Z̔z =n\`)75ekh疨xVb΅[V{:ߣ=M^v}h|lI_ٜ<̮~^Y[ 򆛄# .]L 1B?Ȓ|vAs،yz DB2sil۹eWp[fgG:g'Uld[,gξ8JD}}4Iw dvYzw8ݠF!]@'%HE!T܂2P:Y>) UרFϾS-=FpTGK}W6;&wOщ9.?`'QL`77 4Z;ĞK}6ԅrk'Gss$Y7fv0\_ov׷m]۶m߫غ"U_[-PM3"#Nф y҈#\@,Dɤ +K-{ω:[s{f~lТΑrOFDtBط_^(~ޮZ'G{.Cn2ճ8VS(! XB`}%T&jmC;|W᨟0|7濿HlGJE?|pjsZPp4Y kBb}6A~VJpЯG0.OχhrӚ_^g,teUuO:}iݺKN?noݝܼydd+{䅝;_sK?'OFSZgE8zO.Lݧd@yp7Sb5;MNC91Rcz"(}k|南]?8Q.dJ}ZRR.@V/|D fTH 1H[J@دҒ϶/X0dSs`uΩp]@ug,cՀ\ncP:yMyXkɬ:%CVŪaݘ3>wRoإO֟z$T_wp}U kKiټ r/oeĨy3!d-av߽{| uݦv8·a?v6Ga\p_h.2)BQ/?n+I!;7agwyg?_2 /@z`CPK3nWAW>2Gv{rxj1gILTX,i% bҬ!='/_sQc:E(M&_WƜcx6n1[2=V{X`tk*Q켶0*6~r[X% ^: +7T 5N%I=e&I;R(0x')A9?70T@̬/RlեFZ}Ţ2عn̙U rmUM]\߶I\ +yY-4Ti} >.K&P4=e=+Q8pHCDt9Nl)gAb=#`ҞLXߺ.GNCkXM{uS5<Уw8gMlQ} +p9)87޶C,ZZ5tCT{:OohTT֔L z}9=6v͑hyaxqa`lԄM%j"3<$b o4<'T#湤5$I"t:(IK۔oNYZ]ƐCc֐w]IȚ=V ׷Ӻh]ssʺkZ#y>[sr:f.pnGkAI,A`0[rE_rgdփ8#Ǎ}zz[+kvLZzd^ͺ쮑ͭ|AU6cu$OEP$ KI ^zJAΓDV?]RLJcxe)l;fk{~sEaiJj^魨ٓReeBϽx yГ39A)} ]9o;g#&| s1P}B\JIte2@͌0Y띡0ְZcox<5[ļs3S3>uJcXp{n=c_ԛzECXH&2x}@Aƒ^U͢}EvMgeݙ,H)@%} +L:bg7ޜ,h8Ԍ +o[veli0$X0mP7~+ow|UQ✼f6ƻH3~l 2wGED$"f7ڠYƆ9zpGEB31h7++-j;;p3u_c[k#^r?}M6_0Ars +l +DxLN\/澣0!+ 8vJv!4g-K|sYBܕ OtHFt>p(IC +D!9"y,2 ![b\L$" ʬ E8[wGzfd!&R¼;+4:Vz\VzWzAR_f[[W}|b45t)oVXh7:~YflUk8NqHd|H j: S4:]nZ&./ua[VR`&4xꩬ|l2G$'_MkOOT[N bCLLlDd4GgFH0 0d#6Z5jKuRb܋CiftcJcXv6J)N785췎<"A m;OdzxM}մ́<V;'h1j!]d.¬6S>S}&jFN3s1b|k9J]Ş"1; 0:;:-ƼtwX5T?[ 5hH˽{h5<a@2՗z^:~%ꤹ_RԯZdj.m'>s9;C~GXzg-'g͟Mݖ[̈́b6,ROHk9M/X[&RW -&4-gm V W\ +\]F|v|lggpGPo^묑l W\E07 8*',Fl?6oLm\1b;I%;M!Um U.E1hH/[&8<( 8;Xs8aqâDB2ٜg0SN @ʞ0.h>@'BypCH,lXo<\>׏p] ዄe`,!1u~nqbsA(1;kq'u"./1BYp%bX_*!%p-!pr\#1 +CGȓ0 ?`# QJ85GHuܲ&|v֩Yln.*gsS.td8$vպħLю\o$Rq]_\3]˻ʅ$O}pPι2zƸ?csFHg=WC_˺@El331N֠K7=#W1L +endstream +endobj +4721 0 obj +<< +/Length 13 +/Filter /FlateDecode +>> +stream +xM +endstream +endobj +4722 0 obj +<< +/Length 22434 +/Filter /FlateDecode +/Length1 81012 +>> +stream +HVy\Wp[7Q@KPB8 HH9WIDBUQrXP`U֖SQA٢;h۝z{Z״ţXRÛ:h; v![\(LknMXl@y,J,Nn8H⭣qy^!(.Ds<^5;ScL_En.q< )?f<5bup r' +ßZ4IW4X傫}2sd9S2BB6Tٯ44 +px?h ⷓd@HqXKXPPp}/MX~ ېnI⍔Sil~p*'BǖB21$(gP:?^ D}Y.jH>Yp0C43,%aBǎBXl& rJH6^n^^􍨫cj4A?]hk0*|.V+!m+llC #R(:=ܱ@'S-DseU܍h[argJ6lYڡtL>wi؟B1>ט2eUȖ|ҴyJr^vutK>?KPM=mNN" Ab~ҒCE~{OiA;&ˤ?noOؓ)}R4ud!fc[Z`q6hO*+7wTꬩ6ʿd`RʃGw _OWvM0PL"@1q[12ɜM܈ôKצP<bTAl3W&Wfmt#@h2hPYZ&$$Xlǃx˱D!-`oq,F#4%3v/#2M.jv_n;iC\[JMTo\rŅ):N c2Y~K[`TKȾ +6IT>j`@[;KyqX ꔺ˒p.Iϫ;I*J-9bYC%$g4Zydaa.|9"*߬ȶןҕ cU ޏ jQ0CÎ_0CXE:6^nhi ٓh{f,#lϗ5lAaoK#dNwǿ߲H@?p&-olξ2-&'dNrF[ |C)(*! +Hrm8|ن}:O;'Jj7*t`ճ:npjq[NRvg 뽜>lvxMkۇVX3ʇRay134Mvӻ*(IDJuVSC սJ̓7zm}UqTiCQo2r C1:yZ>:S/k~,׵D# uGec6؇7JiwaBbSZ@a.ʲ>G V'#DX/7ץkoJf:Pk}YFRt`uOÚu&gS~"2H1 ڴ/*ùlʸ=q0/~LĞ{̒훱ʧ D)HEf(Q)HU}|6qL ~ݜ 1PJy_+@8ZS)28l1TEɢ6_t}?ܩ*BX(| @ yRZP_@HG04jlA}ll%oDͻZi%͓ gҌլ/k߬|X19MlJNsI26~[ˏguot8SĜ~y$ >CLT(碝G@V%#Ef㡰?*$fk'{6jfD.P藓ȥ̿Ǘ˕qͤU\PLմe?pX806qͭ1-w0.IqaH4a)>O %a%0ޏx%ί ! F<@3^Hb7!Fm0>-9c&dWabg-||oغiqHl0Tyܙsx4CߝL{}T~RQa/$- +7ˀF ,]+բn@K\UCx "Aa4kK[e ~%QU%*Ul}w;eÅKz) 0 #ì`zPB15?9661";"#M Qt8̡v׶`^7xCn9N/wv9_"G~U:?.pxfB{ْzTe`Őh՟LFoR5 ryRi6?rKeJz/_wD[52*HU6?BG4U8ѹ)[N[ӱt?Sp ])-|vr[ ?V\LבO:sh]z֜ZwS[1)=V#mWOqIRt@G4HGC]J,rRWPdO=(K- +2K<@W!<@ 3C "x ZHKu\\U(>VDz.O. @|f,׺9iot/З? (@@#;fq8gpfXUzDY%Kֹ,1OvmkltO%z[Pȱ9rO͹@fWfqNd,WT1V'0#J4qI:~nBt1݀YKm7 vS\b \ɨy~6?{P~$F)jP&^| b|G1*>hl|4?kCXآScm߳{.3NlӉsw~{Ξ=?Oǫ)3~t\tͷluXΖ iQv&U7]r+!蛻jL7<[QSH;2ѱzU8a\]J.O,o"hӪYAp|NT'{x GɊiNƉ`AGx58~ibQ"'&GhJP:m=NO_=c:+\RSSx"=Xt9=kZz6؍N7 K)WVYrhx֨BZ27Jphd-U [`U]Cmk4Bt606ƅP^ʲkYՇI4Z5> -o;/x rUMZj) tCau8.t[}ǬxJUIk層v+%Z%QGmCڪ9%ꢺ/޿q _ * e_W)ul5qQ/b6o⽥OYV!Gbcq?aahY;)ώv)~ϋE#,E|^6ٍj+؏y›wO0| +@o&A. G z[wLy*b瀡T]@x`:@;⌟Z_&HxK>`x+AfM`.8/,Yl6P/{A2HS80L A!,r)W u?Ƌ|_Fi"wms$>|P Hu/Qu{[曼h8'8Rf.9kװ AV^<ρ\d\cy @,qQ `,Au v?62@@o$c<^(_z `= >oGQn<$.JFOc·+'LL4Q^F_K΃C&O~ 3HOnϿ2X<ƵuIxz +5Kf"W~,$thWu<'9ܷ`L`I߲͜L9:!mWޡ}5y oȸψWK^CWX37n-{-WU.ks@%oAׂ7<)1Qe\9 HO\5o%!zM~ >{9H_I=E㷞msɕqgfI$n[l7mM9NI*>M^wI 3Γ%i\%qc mr|"ρyL1]ou:Nyι4C6OS+{D~w۬/1,1L88Y|๋N?>0]{;je<|X\Rg8p~-~Kcm9?R7Ⱥ"R9/g9[/es5&uo^߼}db;BAo3-9=s\2J쇼[öY48c>E)iz3miZ_Ygm%!f2QE܄!LyUh + + +  +*"s۲%S>ȲOfY,[>;bbY}8ysιr'ኞ!Qd*o_4R_3u!j@r}^ŬրծcM1sL{Vayh;+_GbMϧ=>Kp/Lq5qW ͚17VgO`b֑燣>/1 1Zfs#9imH:E=|3 v iMZz~񙹠˄x}*f?e"5Vz +甦P~ 1E4++僙Ds %Ŵ&}~وTҟfjBhn>¬2 0gqV B]Yh̽éfRҚIDi~U\szLyqԇb|bҵ݋9h0wчzQ֊\,Hfƾ?3 3u6ę:A3 kٚ{Im12[EGޫ~{!ο}t떺dg&082nzѳ'\ǮQ7ڮ=mi?6|$7p~sD9힕"yAqm0rƿ]{%D 5[G\q&_'oO}c6k6c''hsmu$ļV{=?c)7̂5:Oc~W5ȘG->x ~G/珌~zşx۽,^lM-%/{%51u!jz}>Y,]$sJZ_[Xޙs r>|.ȡ]^FS{Z~En9|OC!֞^͖ NbrK瘸CCC:\sZƳRJ'ʼ߻ܷ#.]) 8jąD/cϊqܣG;89~3ŀ]!7_IkB +vO:o>G1q\ Ziv| ymubՋv[yXr1nv?]ܵP ׵^Kߘn yn~jC3xr{stC RSTrb?:0q*-RWuťBܾ\9/1fֿjy>5{OffbV~b/&g1ϝZkpvg{}u&DV=hP%7k|m~&iC?zY' ֮-4VW30}7W8oG^+" ^SnW8'1o5>SKsXj[h\91B':@}B~V.ϛkQ;FG^w?%.wuГ/aYYȵG%hlBǵQ.*]` o+MEE}Y'Ԋ9wc,j}hbb=,{گ0~u*Ki c>VwyOE;9ߑ3ԾF <1NL c ryGi Ɗ'uףq4ve^-G/7bkVx3bb8[/֟=r4\v\з'C~h}쐏n*#uc~0zm>a/hX*"%s 5>~bF#zŵrZBxh,/yF*3ŪDmNhG{|'6zr>9 ycxjZb ~Onp?֖|/Z)>U~Z~h o=߂p}-qO1jP&u@}"jr͐ȬwO*8/I<+}SN'7AGF*_ۋ{:Ϙ7 ͝֐3&m>mb~ǍU?}V_'l@Uwy;F猫X~a\O=irjr0WC6.SvZAjp~V֓v:Sjiasu?5WMbޡGFYl|pG_@GO*Fhc mݩ?I]+-!?bMl=,Uߧkzemyir|q?_Ħ^}ttkg#gS gC\VK\$cz\H_n;䴼E.&)Ǎ;ܻK^ݾGP~wMSqxzn4P&bNyzy"G>0c,ACZMFv5ݓxDqGۍoZ^Qhw;xP S瞽X:8}O<}lrMf{"헌8!@zO띐וͪ;=-;G_b4/ļ~ϸ9i|1G/35Lq97U|6 Xޓ+{6za>!\%LIX$ʇB~V :-/t66>?Afi6p. @V(-X*奔ꀶZ,} Ek8P2Ktpeˢeɲĸ-Ya'K99}뺯SmL =qN"ù@X͂}`~LNh!ۜUx^q_X~_ڙ-=B'Ŵ5p@Ʊ5AC1>?+-ȃ:ỵL3!zw"ޢZm><:?QKEA S&.'Ojи1'g,ҏ_b:{(b/*H-oy%O Qebo>#|Od,]Uc~ʍr:Q {7E1-g.\H`k_27] .703A'sq{ڱB\Bi9lf1Vix1rJ\_Mαھ3z p6j>-.\6h3u%n;'wŰC:]bǵiss׵5[a6hκ,NoYk8Ζv*񒱝 +kOyV9!98\ {ɽg8$7]r}=jha/3'\x;Cjb>/V~k!eJfiofcyb^i>+01+;)#^hhtZRw+msꝺ7S/LnC{VWl~Loﺹ\Ē8NjOO3&+`zHL|q.SFGhƽE!vBOC{o݋ji[]t򛐞3? +1,@luysUy4gCqM:mQ mr(7==}KFHFs'Or{O\W=5zI/c|+9@B+ Kdzx{Wb???u{'I9l]*D}٢Yn{#ⅇ[)kL\K"NЇ!K3)ĹFf<jCcVx =No3ǽrŅ8ϛg_24;M<>ixZ<11@{b4ݸ Зqv}9Bϡ_oxA~]bJmrOvSRK-?ZS2=&VqR^ż¼;s3

    U2Kr5~mpliOQ9g=|ds0u@Rm6 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

  •  🕗%02d%c
    ") + webserver.content_send(matter._STYLESHEET) + + for host: bridge_plugin_by_host.keys() + webserver.content_send(string.format("", webserver.html_escape(host))) + var http_remote = bridge_plugin_by_host[host][0].http_remote # get the http_remote object from the first in list + webserver.content_send(http_remote.web_last_seen()) + + for plg: bridge_plugin_by_host[host] + webserver.content_send("") + end + end + + + webserver.content_send("
    %s
    ") + plg.web_values() # show values + webserver.content_send("

    ") + + end + #- display sensor value in the web UI -# def web_sensor() import webserver @@ -503,25 +554,31 @@ class Matter_UI var matter_enabled = tasmota.get_option(matter.MATTER_OPTION) if matter_enabled - if self.device.is_root_commissioning_open() - self.show_commissioning_info() - end # mtc0 = close, mtc1 = open commissioning var fabrics_count = self.device.sessions.count_active_fabrics() if fabrics_count == 0 - webserver.content_send(string.format("
    %s
    ", "No active association")) + webserver.content_send(string.format("
    %s
    ", "Matter: No active association")) else var plural = fabrics_count > 1 - webserver.content_send(string.format("
    %s
    ", str(fabrics_count) + " active association" + (plural ? "s" : ""))) + webserver.content_send(string.format("
    %s
    ", "Matter: " + str(fabrics_count) + " active association" + (plural ? "s" : ""))) end - webserver.content_send(string.format("") - else - webserver.content_send(" Close Commissioning") + self.show_bridge_status() + + if self.device.is_root_commissioning_open() + self.show_commissioning_info() + end + + # display the open/close commissioning button only if there is no active session + if fabrics_count == 0 + webserver.content_send(string.format("") + else + webserver.content_send(" Close Commissioning") + end end end end diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_inspect.be b/lib/libesp32/berry_matter/src/embedded/Matter_inspect.be index c9f9a15d2..c5dfe0be4 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_inspect.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_inspect.be @@ -35,6 +35,19 @@ def sort(l) end matter.sort = sort +#@ solidify:matter.jitter,weak +############################################################# +# jitter +# +# compute a random jitter time for an update_time value +def jitter(update_time) + # initialization to a random value within range + import crypto + var rand31 = crypto.random(4).get(0,4) & 0x7FFFFFFF # random int over 31 bits + return tasmota.millis(rand31 % update_time) +end +matter.jitter = jitter + #@ solidify:matter.inspect,weak # debug function def inspect(p) diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Commissioning.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Commissioning.h index dfc95aae1..1123b4a22 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Commissioning.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Commissioning.h @@ -1281,7 +1281,7 @@ be_local_closure(Matter_Commisioning_Context_process_incoming, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[20]) { /* constants */ + ( &(const bvalue[19]) { /* constants */ /* K0 */ be_nested_str_weak(device), /* K1 */ be_nested_str_weak(is_commissioning_open), /* K2 */ be_nested_str_weak(opcode), @@ -1292,16 +1292,15 @@ be_local_closure(Matter_Commisioning_Context_process_incoming, /* name */ /* K7 */ be_nested_str_weak(MTR_X3A_X20received_X20message_X20), /* K8 */ be_nested_str_weak(matter), /* K9 */ be_nested_str_weak(inspect), - /* K10 */ be_const_int(3), - /* K11 */ be_nested_str_weak(parse_PBKDFParamRequest), - /* K12 */ be_nested_str_weak(parse_Pake1), - /* K13 */ be_nested_str_weak(parse_Pake3), - /* K14 */ be_nested_str_weak(parse_Sigma1), - /* K15 */ be_nested_str_weak(parse_Sigma3), - /* K16 */ be_nested_str_weak(parse_StatusReport), - /* K17 */ be_nested_str_weak(string), - /* K18 */ be_nested_str_weak(format), - /* K19 */ be_nested_str_weak(MTR_X3A_X20_X3E_X3F_X3F_X3F_X3F_X3F_X3F_X3F_X3F_X3F_X20Unknown_X20OpCode_X20_X28secure_X20channel_X29_X20_X2502X), + /* K10 */ be_nested_str_weak(parse_PBKDFParamRequest), + /* K11 */ be_nested_str_weak(parse_Pake1), + /* K12 */ be_nested_str_weak(parse_Pake3), + /* K13 */ be_nested_str_weak(parse_Sigma1), + /* K14 */ be_nested_str_weak(parse_Sigma3), + /* K15 */ be_nested_str_weak(parse_StatusReport), + /* K16 */ be_nested_str_weak(string), + /* K17 */ be_nested_str_weak(format), + /* K18 */ be_nested_str_weak(MTR_X3A_X20_X3E_X3F_X3F_X3F_X3F_X3F_X3F_X3F_X3F_X3F_X20Unknown_X20OpCode_X20_X28secure_X20channel_X29_X20_X2502X), }), be_str_weak(process_incoming), &be_const_str_solidified, @@ -1332,7 +1331,7 @@ be_local_closure(Matter_Commisioning_Context_process_incoming, /* name */ 0x5C180200, // 0017 MOVE R6 R1 0x7C100400, // 0018 CALL R4 2 0x00120E04, // 0019 ADD R4 K7 R4 - 0x5814000A, // 001A LDCONST R5 K10 + 0x54160003, // 001A LDINT R5 4 0x7C080600, // 001B CALL R2 3 0x88080302, // 001C GETMBR R2 R1 K2 0x540E000F, // 001D LDINT R3 16 @@ -1343,7 +1342,7 @@ be_local_closure(Matter_Commisioning_Context_process_incoming, /* name */ 0x540E001F, // 0022 LDINT R3 32 0x1C080403, // 0023 EQ R2 R2 R3 0x780A0004, // 0024 JMPF R2 #002A - 0x8C08010B, // 0025 GETMET R2 R0 K11 + 0x8C08010A, // 0025 GETMET R2 R0 K10 0x5C100200, // 0026 MOVE R4 R1 0x7C080400, // 0027 CALL R2 2 0x80040400, // 0028 RET 1 R2 @@ -1352,7 +1351,7 @@ be_local_closure(Matter_Commisioning_Context_process_incoming, /* name */ 0x540E0021, // 002B LDINT R3 34 0x1C080403, // 002C EQ R2 R2 R3 0x780A0004, // 002D JMPF R2 #0033 - 0x8C08010C, // 002E GETMET R2 R0 K12 + 0x8C08010B, // 002E GETMET R2 R0 K11 0x5C100200, // 002F MOVE R4 R1 0x7C080400, // 0030 CALL R2 2 0x80040400, // 0031 RET 1 R2 @@ -1361,7 +1360,7 @@ be_local_closure(Matter_Commisioning_Context_process_incoming, /* name */ 0x540E0023, // 0034 LDINT R3 36 0x1C080403, // 0035 EQ R2 R2 R3 0x780A0004, // 0036 JMPF R2 #003C - 0x8C08010D, // 0037 GETMET R2 R0 K13 + 0x8C08010C, // 0037 GETMET R2 R0 K12 0x5C100200, // 0038 MOVE R4 R1 0x7C080400, // 0039 CALL R2 2 0x80040400, // 003A RET 1 R2 @@ -1370,7 +1369,7 @@ be_local_closure(Matter_Commisioning_Context_process_incoming, /* name */ 0x540E002F, // 003D LDINT R3 48 0x1C080403, // 003E EQ R2 R2 R3 0x780A0004, // 003F JMPF R2 #0045 - 0x8C08010E, // 0040 GETMET R2 R0 K14 + 0x8C08010D, // 0040 GETMET R2 R0 K13 0x5C100200, // 0041 MOVE R4 R1 0x7C080400, // 0042 CALL R2 2 0x80040400, // 0043 RET 1 R2 @@ -1379,7 +1378,7 @@ be_local_closure(Matter_Commisioning_Context_process_incoming, /* name */ 0x540E0031, // 0046 LDINT R3 50 0x1C080403, // 0047 EQ R2 R2 R3 0x780A0004, // 0048 JMPF R2 #004E - 0x8C08010F, // 0049 GETMET R2 R0 K15 + 0x8C08010E, // 0049 GETMET R2 R0 K14 0x5C100200, // 004A MOVE R4 R1 0x7C080400, // 004B CALL R2 2 0x80040400, // 004C RET 1 R2 @@ -1388,16 +1387,16 @@ be_local_closure(Matter_Commisioning_Context_process_incoming, /* name */ 0x540E003F, // 004F LDINT R3 64 0x1C080403, // 0050 EQ R2 R2 R3 0x780A0004, // 0051 JMPF R2 #0057 - 0x8C080110, // 0052 GETMET R2 R0 K16 + 0x8C08010F, // 0052 GETMET R2 R0 K15 0x5C100200, // 0053 MOVE R4 R1 0x7C080400, // 0054 CALL R2 2 0x80040400, // 0055 RET 1 R2 0x7002000A, // 0056 JMP #0062 - 0xA40A2200, // 0057 IMPORT R2 K17 + 0xA40A2000, // 0057 IMPORT R2 K16 0xB80E0600, // 0058 GETNGBL R3 K3 0x8C0C0704, // 0059 GETMET R3 R3 K4 - 0x8C140512, // 005A GETMET R5 R2 K18 - 0x581C0013, // 005B LDCONST R7 K19 + 0x8C140511, // 005A GETMET R5 R2 K17 + 0x581C0012, // 005B LDCONST R7 K18 0x88200302, // 005C GETMBR R8 R1 K2 0x7C140600, // 005D CALL R5 3 0x58180006, // 005E LDCONST R6 K6 diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Device.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Device.h index 42d886046..bf8d29a39 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Device.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Device.h @@ -6,6 +6,1626 @@ extern const bclass be_class_Matter_Device; +/******************************************************************** +** Solidified function: k2l_num +********************************************************************/ +be_local_closure(Matter_Device_k2l_num, /* name */ + be_nested_proto( + 9, /* nstack */ + 1, /* argc */ + 4, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 6]) { /* constants */ + /* K0 */ be_const_class(be_class_Matter_Device), + /* K1 */ be_nested_str_weak(keys), + /* K2 */ be_nested_str_weak(push), + /* K3 */ be_nested_str_weak(stop_iteration), + /* K4 */ be_const_int(1), + /* K5 */ be_const_int(0), + }), + be_str_weak(k2l_num), + &be_const_str_solidified, + ( &(const binstruction[52]) { /* code */ + 0x58040000, // 0000 LDCONST R1 K0 + 0x60080012, // 0001 GETGBL R2 G18 + 0x7C080000, // 0002 CALL R2 0 + 0x4C0C0000, // 0003 LDNIL R3 + 0x1C0C0003, // 0004 EQ R3 R0 R3 + 0x780E0000, // 0005 JMPF R3 #0007 + 0x80040400, // 0006 RET 1 R2 + 0x600C0010, // 0007 GETGBL R3 G16 + 0x8C100101, // 0008 GETMET R4 R0 K1 + 0x7C100200, // 0009 CALL R4 1 + 0x7C0C0200, // 000A CALL R3 1 + 0xA8020007, // 000B EXBLK 0 #0014 + 0x5C100600, // 000C MOVE R4 R3 + 0x7C100000, // 000D CALL R4 0 + 0x8C140502, // 000E GETMET R5 R2 K2 + 0x601C0009, // 000F GETGBL R7 G9 + 0x5C200800, // 0010 MOVE R8 R4 + 0x7C1C0200, // 0011 CALL R7 1 + 0x7C140400, // 0012 CALL R5 2 + 0x7001FFF7, // 0013 JMP #000C + 0x580C0003, // 0014 LDCONST R3 K3 + 0xAC0C0200, // 0015 CATCH R3 1 0 + 0xB0080000, // 0016 RAISE 2 R0 R0 + 0x600C0010, // 0017 GETGBL R3 G16 + 0x6010000C, // 0018 GETGBL R4 G12 + 0x5C140400, // 0019 MOVE R5 R2 + 0x7C100200, // 001A CALL R4 1 + 0x04100904, // 001B SUB R4 R4 K4 + 0x40120804, // 001C CONNECT R4 K4 R4 + 0x7C0C0200, // 001D CALL R3 1 + 0xA8020010, // 001E EXBLK 0 #0030 + 0x5C100600, // 001F MOVE R4 R3 + 0x7C100000, // 0020 CALL R4 0 + 0x94140404, // 0021 GETIDX R5 R2 R4 + 0x5C180800, // 0022 MOVE R6 R4 + 0x241C0D05, // 0023 GT R7 R6 K5 + 0x781E0008, // 0024 JMPF R7 #002E + 0x041C0D04, // 0025 SUB R7 R6 K4 + 0x941C0407, // 0026 GETIDX R7 R2 R7 + 0x241C0E05, // 0027 GT R7 R7 R5 + 0x781E0004, // 0028 JMPF R7 #002E + 0x041C0D04, // 0029 SUB R7 R6 K4 + 0x941C0407, // 002A GETIDX R7 R2 R7 + 0x98080C07, // 002B SETIDX R2 R6 R7 + 0x04180D04, // 002C SUB R6 R6 K4 + 0x7001FFF4, // 002D JMP #0023 + 0x98080C05, // 002E SETIDX R2 R6 R5 + 0x7001FFEE, // 002F JMP #001F + 0x580C0003, // 0030 LDCONST R3 K3 + 0xAC0C0200, // 0031 CATCH R3 1 0 + 0xB0080000, // 0032 RAISE 2 R0 R0 + 0x80040400, // 0033 RET 1 R2 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: register_native_classes +********************************************************************/ +be_local_closure(Matter_Device_register_native_classes, /* name */ + be_nested_proto( + 12, /* nstack */ + 3, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[17]) { /* constants */ + /* K0 */ be_nested_str_weak(introspect), + /* K1 */ be_nested_str_weak(string), + /* K2 */ be_nested_str_weak(members), + /* K3 */ be_nested_str_weak(matter), + /* K4 */ be_nested_str_weak(get), + /* K5 */ be_nested_str_weak(class), + /* K6 */ be_nested_str_weak(find), + /* K7 */ be_nested_str_weak(Plugin_), + /* K8 */ be_const_int(0), + /* K9 */ be_nested_str_weak(register_plugin_class), + /* K10 */ be_nested_str_weak(stop_iteration), + /* K11 */ be_nested_str_weak(tasmota), + /* K12 */ be_nested_str_weak(log), + /* K13 */ be_nested_str_weak(MTR_X3A_X20registered_X20classes_X20), + /* K14 */ be_nested_str_weak(k2l), + /* K15 */ be_nested_str_weak(plugins_classes), + /* K16 */ be_const_int(3), + }), + be_str_weak(register_native_classes), + &be_const_str_solidified, + ( &(const binstruction[43]) { /* code */ + 0xA40E0000, // 0000 IMPORT R3 K0 + 0xA4120200, // 0001 IMPORT R4 K1 + 0x60140010, // 0002 GETGBL R5 G16 + 0x8C180702, // 0003 GETMET R6 R3 K2 + 0xB8220600, // 0004 GETNGBL R8 K3 + 0x7C180400, // 0005 CALL R6 2 + 0x7C140200, // 0006 CALL R5 1 + 0xA8020014, // 0007 EXBLK 0 #001D + 0x5C180A00, // 0008 MOVE R6 R5 + 0x7C180000, // 0009 CALL R6 0 + 0x8C1C0704, // 000A GETMET R7 R3 K4 + 0xB8260600, // 000B GETNGBL R9 K3 + 0x5C280C00, // 000C MOVE R10 R6 + 0x7C1C0600, // 000D CALL R7 3 + 0x60200004, // 000E GETGBL R8 G4 + 0x5C240E00, // 000F MOVE R9 R7 + 0x7C200200, // 0010 CALL R8 1 + 0x1C201105, // 0011 EQ R8 R8 K5 + 0x78220008, // 0012 JMPF R8 #001C + 0x8C200906, // 0013 GETMET R8 R4 K6 + 0x5C280C00, // 0014 MOVE R10 R6 + 0x582C0007, // 0015 LDCONST R11 K7 + 0x7C200600, // 0016 CALL R8 3 + 0x1C201108, // 0017 EQ R8 R8 K8 + 0x78220002, // 0018 JMPF R8 #001C + 0x8C200109, // 0019 GETMET R8 R0 K9 + 0x5C280E00, // 001A MOVE R10 R7 + 0x7C200400, // 001B CALL R8 2 + 0x7001FFEA, // 001C JMP #0008 + 0x5814000A, // 001D LDCONST R5 K10 + 0xAC140200, // 001E CATCH R5 1 0 + 0xB0080000, // 001F RAISE 2 R0 R0 + 0xB8161600, // 0020 GETNGBL R5 K11 + 0x8C140B0C, // 0021 GETMET R5 R5 K12 + 0x601C0008, // 0022 GETGBL R7 G8 + 0x8C20010E, // 0023 GETMET R8 R0 K14 + 0x8828010F, // 0024 GETMBR R10 R0 K15 + 0x7C200400, // 0025 CALL R8 2 + 0x7C1C0200, // 0026 CALL R7 1 + 0x001E1A07, // 0027 ADD R7 K13 R7 + 0x58200010, // 0028 LDCONST R8 K16 + 0x7C140600, // 0029 CALL R5 3 + 0x80000000, // 002A RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: save_before_restart +********************************************************************/ +be_local_closure(Matter_Device_save_before_restart, /* name */ + be_nested_proto( + 3, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 2]) { /* constants */ + /* K0 */ be_nested_str_weak(stop_basic_commissioning), + /* K1 */ be_nested_str_weak(mdns_remove_op_discovery_all_fabrics), + }), + be_str_weak(save_before_restart), + &be_const_str_solidified, + ( &(const binstruction[ 5]) { /* code */ + 0x8C040100, // 0000 GETMET R1 R0 K0 + 0x7C040200, // 0001 CALL R1 1 + 0x8C040101, // 0002 GETMET R1 R0 K1 + 0x7C040200, // 0003 CALL R1 1 + 0x80000000, // 0004 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: stop_basic_commissioning +********************************************************************/ +be_local_closure(Matter_Device_stop_basic_commissioning, /* name */ + be_nested_proto( + 5, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[13]) { /* constants */ + /* K0 */ be_nested_str_weak(is_root_commissioning_open), + /* K1 */ be_nested_str_weak(tasmota), + /* K2 */ be_nested_str_weak(publish_result), + /* K3 */ be_nested_str_weak(_X7B_X22Matter_X22_X3A_X7B_X22Commissioning_X22_X3A0_X7D_X7D), + /* K4 */ be_nested_str_weak(Matter), + /* K5 */ be_nested_str_weak(commissioning_open), + /* K6 */ be_nested_str_weak(mdns_remove_PASE), + /* K7 */ be_nested_str_weak(commissioning_iterations), + /* K8 */ be_nested_str_weak(commissioning_discriminator), + /* K9 */ be_nested_str_weak(commissioning_salt), + /* K10 */ be_nested_str_weak(commissioning_w0), + /* K11 */ be_nested_str_weak(commissioning_L), + /* K12 */ be_nested_str_weak(commissioning_admin_fabric), + }), + be_str_weak(stop_basic_commissioning), + &be_const_str_solidified, + ( &(const binstruction[25]) { /* code */ + 0x8C040100, // 0000 GETMET R1 R0 K0 + 0x7C040200, // 0001 CALL R1 1 + 0x78060004, // 0002 JMPF R1 #0008 + 0xB8060200, // 0003 GETNGBL R1 K1 + 0x8C040302, // 0004 GETMET R1 R1 K2 + 0x580C0003, // 0005 LDCONST R3 K3 + 0x58100004, // 0006 LDCONST R4 K4 + 0x7C040600, // 0007 CALL R1 3 + 0x4C040000, // 0008 LDNIL R1 + 0x90020A01, // 0009 SETMBR R0 K5 R1 + 0x8C040106, // 000A GETMET R1 R0 K6 + 0x7C040200, // 000B CALL R1 1 + 0x4C040000, // 000C LDNIL R1 + 0x90020E01, // 000D SETMBR R0 K7 R1 + 0x4C040000, // 000E LDNIL R1 + 0x90021001, // 000F SETMBR R0 K8 R1 + 0x4C040000, // 0010 LDNIL R1 + 0x90021201, // 0011 SETMBR R0 K9 R1 + 0x4C040000, // 0012 LDNIL R1 + 0x90021401, // 0013 SETMBR R0 K10 R1 + 0x4C040000, // 0014 LDNIL R1 + 0x90021601, // 0015 SETMBR R0 K11 R1 + 0x4C040000, // 0016 LDNIL R1 + 0x90021801, // 0017 SETMBR R0 K12 R1 + 0x80000000, // 0018 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: get_plugin_class_arg +********************************************************************/ +be_local_closure(Matter_Device_get_plugin_class_arg, /* name */ + be_nested_proto( + 5, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 4]) { /* constants */ + /* K0 */ be_nested_str_weak(plugins_classes), + /* K1 */ be_nested_str_weak(find), + /* K2 */ be_nested_str_weak(ARG), + /* K3 */ be_nested_str_weak(), + }), + be_str_weak(get_plugin_class_arg), + &be_const_str_solidified, + ( &(const binstruction[ 9]) { /* code */ + 0x88080100, // 0000 GETMBR R2 R0 K0 + 0x8C080501, // 0001 GETMET R2 R2 K1 + 0x5C100200, // 0002 MOVE R4 R1 + 0x7C080400, // 0003 CALL R2 2 + 0x780A0001, // 0004 JMPF R2 #0007 + 0x880C0502, // 0005 GETMBR R3 R2 K2 + 0x70020000, // 0006 JMP #0008 + 0x580C0003, // 0007 LDCONST R3 K3 + 0x80040600, // 0008 RET 1 R3 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: start_commissioning_complete +********************************************************************/ +be_local_closure(Matter_Device_start_commissioning_complete, /* name */ + be_nested_proto( + 6, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 5]) { /* constants */ + /* K0 */ be_nested_str_weak(tasmota), + /* K1 */ be_nested_str_weak(log), + /* K2 */ be_nested_str_weak(MTR_X3A_X20_X2A_X2A_X2A_X20Commissioning_X20complete_X20_X2A_X2A_X2A), + /* K3 */ be_const_int(2), + /* K4 */ be_nested_str_weak(stop_basic_commissioning), + }), + be_str_weak(start_commissioning_complete), + &be_const_str_solidified, + ( &(const binstruction[ 8]) { /* code */ + 0xB80A0000, // 0000 GETNGBL R2 K0 + 0x8C080501, // 0001 GETMET R2 R2 K1 + 0x58100002, // 0002 LDCONST R4 K2 + 0x58140003, // 0003 LDCONST R5 K3 + 0x7C080600, // 0004 CALL R2 3 + 0x8C080104, // 0005 GETMET R2 R0 K4 + 0x7C080200, // 0006 CALL R2 1 + 0x80000000, // 0007 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: register_commands +********************************************************************/ +be_local_closure(Matter_Device_register_commands, /* name */ + be_nested_proto( + 5, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 1, /* has sup protos */ + ( &(const struct bproto*[ 1]) { + be_nested_proto( + 10, /* nstack */ + 4, /* argc */ + 0, /* varg */ + 1, /* has upvals */ + ( &(const bupvaldesc[ 1]) { /* upvals */ + be_local_const_upval(1, 0), + }), + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 1]) { /* constants */ + /* K0 */ be_nested_str_weak(MtrJoin), + }), + be_str_weak(_X3Clambda_X3E), + &be_const_str_solidified, + ( &(const binstruction[ 8]) { /* code */ + 0x68100000, // 0000 GETUPV R4 U0 + 0x8C100900, // 0001 GETMET R4 R4 K0 + 0x5C180000, // 0002 MOVE R6 R0 + 0x5C1C0200, // 0003 MOVE R7 R1 + 0x5C200400, // 0004 MOVE R8 R2 + 0x5C240600, // 0005 MOVE R9 R3 + 0x7C100A00, // 0006 CALL R4 5 + 0x80040800, // 0007 RET 1 R4 + }) + ), + }), + 1, /* has constants */ + ( &(const bvalue[ 3]) { /* constants */ + /* K0 */ be_nested_str_weak(tasmota), + /* K1 */ be_nested_str_weak(add_cmd), + /* K2 */ be_nested_str_weak(MtrJoin), + }), + be_str_weak(register_commands), + &be_const_str_solidified, + ( &(const binstruction[ 7]) { /* code */ + 0xB8060000, // 0000 GETNGBL R1 K0 + 0x8C040301, // 0001 GETMET R1 R1 K1 + 0x580C0002, // 0002 LDCONST R3 K2 + 0x84100000, // 0003 CLOSURE R4 P0 + 0x7C040600, // 0004 CALL R1 3 + 0xA0000000, // 0005 CLOSE R0 + 0x80000000, // 0006 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: get_plugin_class_displayname +********************************************************************/ +be_local_closure(Matter_Device_get_plugin_class_displayname, /* name */ + be_nested_proto( + 5, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 4]) { /* constants */ + /* K0 */ be_nested_str_weak(plugins_classes), + /* K1 */ be_nested_str_weak(find), + /* K2 */ be_nested_str_weak(NAME), + /* K3 */ be_nested_str_weak(), + }), + be_str_weak(get_plugin_class_displayname), + &be_const_str_solidified, + ( &(const binstruction[ 9]) { /* code */ + 0x88080100, // 0000 GETMBR R2 R0 K0 + 0x8C080501, // 0001 GETMET R2 R2 K1 + 0x5C100200, // 0002 MOVE R4 R1 + 0x7C080400, // 0003 CALL R2 2 + 0x780A0001, // 0004 JMPF R2 #0007 + 0x880C0502, // 0005 GETMBR R3 R2 K2 + 0x70020000, // 0006 JMP #0008 + 0x580C0003, // 0007 LDCONST R3 K3 + 0x80040600, // 0008 RET 1 R3 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: start_operational_discovery_deferred +********************************************************************/ +be_local_closure(Matter_Device_start_operational_discovery_deferred, /* name */ + be_nested_proto( + 6, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 1, /* has sup protos */ + ( &(const struct bproto*[ 1]) { + be_nested_proto( + 3, /* nstack */ + 0, /* argc */ + 0, /* varg */ + 1, /* has upvals */ + ( &(const bupvaldesc[ 2]) { /* upvals */ + be_local_const_upval(1, 0), + be_local_const_upval(1, 1), + }), + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 1]) { /* constants */ + /* K0 */ be_nested_str_weak(start_operational_discovery), + }), + be_str_weak(_X3Clambda_X3E), + &be_const_str_solidified, + ( &(const binstruction[ 5]) { /* code */ + 0x68000000, // 0000 GETUPV R0 U0 + 0x8C000100, // 0001 GETMET R0 R0 K0 + 0x68080001, // 0002 GETUPV R2 U1 + 0x7C000400, // 0003 CALL R0 2 + 0x80040000, // 0004 RET 1 R0 + }) + ), + }), + 1, /* has constants */ + ( &(const bvalue[ 3]) { /* constants */ + /* K0 */ be_nested_str_weak(tasmota), + /* K1 */ be_nested_str_weak(set_timer), + /* K2 */ be_const_int(0), + }), + be_str_weak(start_operational_discovery_deferred), + &be_const_str_solidified, + ( &(const binstruction[ 7]) { /* code */ + 0xB80A0000, // 0000 GETNGBL R2 K0 + 0x8C080501, // 0001 GETMET R2 R2 K1 + 0x58100002, // 0002 LDCONST R4 K2 + 0x84140000, // 0003 CLOSURE R5 P0 + 0x7C080600, // 0004 CALL R2 3 + 0xA0000000, // 0005 CLOSE R0 + 0x80000000, // 0006 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: every_50ms +********************************************************************/ +be_local_closure(Matter_Device_every_50ms, /* name */ + be_nested_proto( + 2, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 2]) { /* constants */ + /* K0 */ be_nested_str_weak(tick), + /* K1 */ be_const_int(1), + }), + be_str_weak(every_50ms), + &be_const_str_solidified, + ( &(const binstruction[ 4]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x00040301, // 0001 ADD R1 R1 K1 + 0x90020001, // 0002 SETMBR R0 K0 R1 + 0x80000000, // 0003 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: compute_qrcode_content +********************************************************************/ +be_local_closure(Matter_Device_compute_qrcode_content, /* name */ + be_nested_proto( + 8, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[12]) { /* constants */ + /* K0 */ be_nested_str_weak(resize), + /* K1 */ be_nested_str_weak(setbits), + /* K2 */ be_const_int(3), + /* K3 */ be_nested_str_weak(vendorid), + /* K4 */ be_nested_str_weak(productid), + /* K5 */ be_nested_str_weak(root_discriminator), + /* K6 */ be_nested_str_weak(root_passcode), + /* K7 */ be_const_int(134217727), + /* K8 */ be_nested_str_weak(MT_X3A), + /* K9 */ be_nested_str_weak(matter), + /* K10 */ be_nested_str_weak(Base38), + /* K11 */ be_nested_str_weak(encode), + }), + be_str_weak(compute_qrcode_content), + &be_const_str_solidified, + ( &(const binstruction[40]) { /* code */ + 0x60040015, // 0000 GETGBL R1 G21 + 0x7C040000, // 0001 CALL R1 0 + 0x8C040300, // 0002 GETMET R1 R1 K0 + 0x540E000A, // 0003 LDINT R3 11 + 0x7C040400, // 0004 CALL R1 2 + 0x8C080301, // 0005 GETMET R2 R1 K1 + 0x58100002, // 0006 LDCONST R4 K2 + 0x5416000F, // 0007 LDINT R5 16 + 0x88180103, // 0008 GETMBR R6 R0 K3 + 0x7C080800, // 0009 CALL R2 4 + 0x8C080301, // 000A GETMET R2 R1 K1 + 0x54120012, // 000B LDINT R4 19 + 0x5416000F, // 000C LDINT R5 16 + 0x88180104, // 000D GETMBR R6 R0 K4 + 0x7C080800, // 000E CALL R2 4 + 0x8C080301, // 000F GETMET R2 R1 K1 + 0x54120024, // 0010 LDINT R4 37 + 0x54160007, // 0011 LDINT R5 8 + 0x541A0003, // 0012 LDINT R6 4 + 0x7C080800, // 0013 CALL R2 4 + 0x8C080301, // 0014 GETMET R2 R1 K1 + 0x5412002C, // 0015 LDINT R4 45 + 0x5416000B, // 0016 LDINT R5 12 + 0x88180105, // 0017 GETMBR R6 R0 K5 + 0x541E0FFE, // 0018 LDINT R7 4095 + 0x2C180C07, // 0019 AND R6 R6 R7 + 0x7C080800, // 001A CALL R2 4 + 0x8C080301, // 001B GETMET R2 R1 K1 + 0x54120038, // 001C LDINT R4 57 + 0x5416001A, // 001D LDINT R5 27 + 0x88180106, // 001E GETMBR R6 R0 K6 + 0x2C180D07, // 001F AND R6 R6 K7 + 0x7C080800, // 0020 CALL R2 4 + 0xB80A1200, // 0021 GETNGBL R2 K9 + 0x8808050A, // 0022 GETMBR R2 R2 K10 + 0x8C08050B, // 0023 GETMET R2 R2 K11 + 0x5C100200, // 0024 MOVE R4 R1 + 0x7C080400, // 0025 CALL R2 2 + 0x000A1002, // 0026 ADD R2 K8 R2 + 0x80040400, // 0027 RET 1 R2 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: _start_udp +********************************************************************/ +be_local_closure(Matter_Device__start_udp, /* name */ + be_nested_proto( + 6, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 1, /* has sup protos */ + ( &(const struct bproto*[ 1]) { + be_nested_proto( + 8, /* nstack */ + 3, /* argc */ + 0, /* varg */ + 1, /* has upvals */ + ( &(const bupvaldesc[ 1]) { /* upvals */ + be_local_const_upval(1, 0), + }), + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 1]) { /* constants */ + /* K0 */ be_nested_str_weak(msg_received), + }), + be_str_weak(_X3Clambda_X3E), + &be_const_str_solidified, + ( &(const binstruction[ 7]) { /* code */ + 0x680C0000, // 0000 GETUPV R3 U0 + 0x8C0C0700, // 0001 GETMET R3 R3 K0 + 0x5C140000, // 0002 MOVE R5 R0 + 0x5C180200, // 0003 MOVE R6 R1 + 0x5C1C0400, // 0004 MOVE R7 R2 + 0x7C0C0800, // 0005 CALL R3 4 + 0x80040600, // 0006 RET 1 R3 + }) + ), + }), + 1, /* has constants */ + ( &(const bvalue[ 9]) { /* constants */ + /* K0 */ be_nested_str_weak(udp_server), + /* K1 */ be_nested_str_weak(tasmota), + /* K2 */ be_nested_str_weak(log), + /* K3 */ be_nested_str_weak(MTR_X3A_X20starting_X20UDP_X20server_X20on_X20port_X3A_X20), + /* K4 */ be_const_int(2), + /* K5 */ be_nested_str_weak(matter), + /* K6 */ be_nested_str_weak(UDPServer), + /* K7 */ be_nested_str_weak(), + /* K8 */ be_nested_str_weak(start), + }), + be_str_weak(_start_udp), + &be_const_str_solidified, + ( &(const binstruction[27]) { /* code */ + 0x88080100, // 0000 GETMBR R2 R0 K0 + 0x780A0000, // 0001 JMPF R2 #0003 + 0x80000400, // 0002 RET 0 + 0x4C080000, // 0003 LDNIL R2 + 0x1C080202, // 0004 EQ R2 R1 R2 + 0x780A0000, // 0005 JMPF R2 #0007 + 0x540615A3, // 0006 LDINT R1 5540 + 0xB80A0200, // 0007 GETNGBL R2 K1 + 0x8C080502, // 0008 GETMET R2 R2 K2 + 0x60100008, // 0009 GETGBL R4 G8 + 0x5C140200, // 000A MOVE R5 R1 + 0x7C100200, // 000B CALL R4 1 + 0x00120604, // 000C ADD R4 K3 R4 + 0x58140004, // 000D LDCONST R5 K4 + 0x7C080600, // 000E CALL R2 3 + 0xB80A0A00, // 000F GETNGBL R2 K5 + 0x8C080506, // 0010 GETMET R2 R2 K6 + 0x58100007, // 0011 LDCONST R4 K7 + 0x5C140200, // 0012 MOVE R5 R1 + 0x7C080600, // 0013 CALL R2 3 + 0x90020002, // 0014 SETMBR R0 K0 R2 + 0x88080100, // 0015 GETMBR R2 R0 K0 + 0x8C080508, // 0016 GETMET R2 R2 K8 + 0x84100000, // 0017 CLOSURE R4 P0 + 0x7C080400, // 0018 CALL R2 2 + 0xA0000000, // 0019 CLOSE R0 + 0x80000000, // 001A RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: _init_basic_commissioning +********************************************************************/ +be_local_closure(Matter_Device__init_basic_commissioning, /* name */ + be_nested_proto( + 3, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 4]) { /* constants */ + /* K0 */ be_nested_str_weak(sessions), + /* K1 */ be_nested_str_weak(count_active_fabrics), + /* K2 */ be_const_int(0), + /* K3 */ be_nested_str_weak(start_root_basic_commissioning), + }), + be_str_weak(_init_basic_commissioning), + &be_const_str_solidified, + ( &(const binstruction[ 8]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x8C040301, // 0001 GETMET R1 R1 K1 + 0x7C040200, // 0002 CALL R1 1 + 0x1C040302, // 0003 EQ R1 R1 K2 + 0x78060001, // 0004 JMPF R1 #0007 + 0x8C040103, // 0005 GETMET R1 R0 K3 + 0x7C040200, // 0006 CALL R1 1 + 0x80000000, // 0007 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: compute_manual_pairing_code +********************************************************************/ +be_local_closure(Matter_Device_compute_manual_pairing_code, /* name */ + be_nested_proto( + 11, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 8]) { /* constants */ + /* K0 */ be_nested_str_weak(string), + /* K1 */ be_nested_str_weak(root_discriminator), + /* K2 */ be_nested_str_weak(root_passcode), + /* K3 */ be_nested_str_weak(format), + /* K4 */ be_nested_str_weak(_X251i_X2505i_X2504i), + /* K5 */ be_nested_str_weak(matter), + /* K6 */ be_nested_str_weak(Verhoeff), + /* K7 */ be_nested_str_weak(checksum), + }), + be_str_weak(compute_manual_pairing_code), + &be_const_str_solidified, + ( &(const binstruction[31]) { /* code */ + 0xA4060000, // 0000 IMPORT R1 K0 + 0x88080101, // 0001 GETMBR R2 R0 K1 + 0x540E0FFE, // 0002 LDINT R3 4095 + 0x2C080403, // 0003 AND R2 R2 R3 + 0x540E0009, // 0004 LDINT R3 10 + 0x3C080403, // 0005 SHR R2 R2 R3 + 0x880C0101, // 0006 GETMBR R3 R0 K1 + 0x541202FF, // 0007 LDINT R4 768 + 0x2C0C0604, // 0008 AND R3 R3 R4 + 0x54120005, // 0009 LDINT R4 6 + 0x380C0604, // 000A SHL R3 R3 R4 + 0x88100102, // 000B GETMBR R4 R0 K2 + 0x54163FFE, // 000C LDINT R5 16383 + 0x2C100805, // 000D AND R4 R4 R5 + 0x300C0604, // 000E OR R3 R3 R4 + 0x88100102, // 000F GETMBR R4 R0 K2 + 0x5416000D, // 0010 LDINT R5 14 + 0x3C100805, // 0011 SHR R4 R4 R5 + 0x8C140303, // 0012 GETMET R5 R1 K3 + 0x581C0004, // 0013 LDCONST R7 K4 + 0x5C200400, // 0014 MOVE R8 R2 + 0x5C240600, // 0015 MOVE R9 R3 + 0x5C280800, // 0016 MOVE R10 R4 + 0x7C140A00, // 0017 CALL R5 5 + 0xB81A0A00, // 0018 GETNGBL R6 K5 + 0x88180D06, // 0019 GETMBR R6 R6 K6 + 0x8C180D07, // 001A GETMET R6 R6 K7 + 0x5C200A00, // 001B MOVE R8 R5 + 0x7C180400, // 001C CALL R6 2 + 0x00140A06, // 001D ADD R5 R5 R6 + 0x80040A00, // 001E RET 1 R5 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: _trigger_read_sensors +********************************************************************/ +be_local_closure(Matter_Device__trigger_read_sensors, /* name */ + be_nested_proto( + 8, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[11]) { /* constants */ + /* K0 */ be_nested_str_weak(json), + /* K1 */ be_nested_str_weak(tasmota), + /* K2 */ be_nested_str_weak(read_sensors), + /* K3 */ be_nested_str_weak(load), + /* K4 */ be_const_int(0), + /* K5 */ be_nested_str_weak(plugins), + /* K6 */ be_nested_str_weak(parse_sensors), + /* K7 */ be_const_int(1), + /* K8 */ be_nested_str_weak(log), + /* K9 */ be_nested_str_weak(MTR_X3A_X20unable_X20to_X20parse_X20read_sensors_X3A_X20), + /* K10 */ be_const_int(3), + }), + be_str_weak(_trigger_read_sensors), + &be_const_str_solidified, + ( &(const binstruction[37]) { /* code */ + 0xA4060000, // 0000 IMPORT R1 K0 + 0xB80A0200, // 0001 GETNGBL R2 K1 + 0x8C080502, // 0002 GETMET R2 R2 K2 + 0x7C080200, // 0003 CALL R2 1 + 0x4C0C0000, // 0004 LDNIL R3 + 0x1C0C0403, // 0005 EQ R3 R2 R3 + 0x780E0000, // 0006 JMPF R3 #0008 + 0x80000600, // 0007 RET 0 + 0x8C0C0303, // 0008 GETMET R3 R1 K3 + 0x5C140400, // 0009 MOVE R5 R2 + 0x7C0C0400, // 000A CALL R3 2 + 0x4C100000, // 000B LDNIL R4 + 0x20100604, // 000C NE R4 R3 R4 + 0x7812000D, // 000D JMPF R4 #001C + 0x58100004, // 000E LDCONST R4 K4 + 0x6014000C, // 000F GETGBL R5 G12 + 0x88180105, // 0010 GETMBR R6 R0 K5 + 0x7C140200, // 0011 CALL R5 1 + 0x14140805, // 0012 LT R5 R4 R5 + 0x78160006, // 0013 JMPF R5 #001B + 0x88140105, // 0014 GETMBR R5 R0 K5 + 0x94140A04, // 0015 GETIDX R5 R5 R4 + 0x8C140B06, // 0016 GETMET R5 R5 K6 + 0x5C1C0600, // 0017 MOVE R7 R3 + 0x7C140400, // 0018 CALL R5 2 + 0x00100907, // 0019 ADD R4 R4 K7 + 0x7001FFF3, // 001A JMP #000F + 0x70020007, // 001B JMP #0024 + 0xB8120200, // 001C GETNGBL R4 K1 + 0x8C100908, // 001D GETMET R4 R4 K8 + 0x60180008, // 001E GETGBL R6 G8 + 0x5C1C0400, // 001F MOVE R7 R2 + 0x7C180200, // 0020 CALL R6 1 + 0x001A1206, // 0021 ADD R6 K9 R6 + 0x581C000A, // 0022 LDCONST R7 K10 + 0x7C100600, // 0023 CALL R4 3 + 0x80000000, // 0024 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: k2l +********************************************************************/ +be_local_closure(Matter_Device_k2l, /* name */ + be_nested_proto( + 8, /* nstack */ + 1, /* argc */ + 4, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 6]) { /* constants */ + /* K0 */ be_const_class(be_class_Matter_Device), + /* K1 */ be_nested_str_weak(keys), + /* K2 */ be_nested_str_weak(push), + /* K3 */ be_nested_str_weak(stop_iteration), + /* K4 */ be_const_int(1), + /* K5 */ be_const_int(0), + }), + be_str_weak(k2l), + &be_const_str_solidified, + ( &(const binstruction[50]) { /* code */ + 0x58040000, // 0000 LDCONST R1 K0 + 0x60080012, // 0001 GETGBL R2 G18 + 0x7C080000, // 0002 CALL R2 0 + 0x4C0C0000, // 0003 LDNIL R3 + 0x1C0C0003, // 0004 EQ R3 R0 R3 + 0x780E0000, // 0005 JMPF R3 #0007 + 0x80040400, // 0006 RET 1 R2 + 0x600C0010, // 0007 GETGBL R3 G16 + 0x8C100101, // 0008 GETMET R4 R0 K1 + 0x7C100200, // 0009 CALL R4 1 + 0x7C0C0200, // 000A CALL R3 1 + 0xA8020005, // 000B EXBLK 0 #0012 + 0x5C100600, // 000C MOVE R4 R3 + 0x7C100000, // 000D CALL R4 0 + 0x8C140502, // 000E GETMET R5 R2 K2 + 0x5C1C0800, // 000F MOVE R7 R4 + 0x7C140400, // 0010 CALL R5 2 + 0x7001FFF9, // 0011 JMP #000C + 0x580C0003, // 0012 LDCONST R3 K3 + 0xAC0C0200, // 0013 CATCH R3 1 0 + 0xB0080000, // 0014 RAISE 2 R0 R0 + 0x600C0010, // 0015 GETGBL R3 G16 + 0x6010000C, // 0016 GETGBL R4 G12 + 0x5C140400, // 0017 MOVE R5 R2 + 0x7C100200, // 0018 CALL R4 1 + 0x04100904, // 0019 SUB R4 R4 K4 + 0x40120804, // 001A CONNECT R4 K4 R4 + 0x7C0C0200, // 001B CALL R3 1 + 0xA8020010, // 001C EXBLK 0 #002E + 0x5C100600, // 001D MOVE R4 R3 + 0x7C100000, // 001E CALL R4 0 + 0x94140404, // 001F GETIDX R5 R2 R4 + 0x5C180800, // 0020 MOVE R6 R4 + 0x241C0D05, // 0021 GT R7 R6 K5 + 0x781E0008, // 0022 JMPF R7 #002C + 0x041C0D04, // 0023 SUB R7 R6 K4 + 0x941C0407, // 0024 GETIDX R7 R2 R7 + 0x241C0E05, // 0025 GT R7 R7 R5 + 0x781E0004, // 0026 JMPF R7 #002C + 0x041C0D04, // 0027 SUB R7 R6 K4 + 0x941C0407, // 0028 GETIDX R7 R2 R7 + 0x98080C07, // 0029 SETIDX R2 R6 R7 + 0x04180D04, // 002A SUB R6 R6 K4 + 0x7001FFF4, // 002B JMP #0021 + 0x98080C05, // 002C SETIDX R2 R6 R5 + 0x7001FFEE, // 002D JMP #001D + 0x580C0003, // 002E LDCONST R3 K3 + 0xAC0C0200, // 002F CATCH R3 1 0 + 0xB0080000, // 0030 RAISE 2 R0 R0 + 0x80040400, // 0031 RET 1 R2 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: mdns_announce_op_discovery_all_fabrics +********************************************************************/ +be_local_closure(Matter_Device_mdns_announce_op_discovery_all_fabrics, /* name */ + be_nested_proto( + 6, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 6]) { /* constants */ + /* K0 */ be_nested_str_weak(sessions), + /* K1 */ be_nested_str_weak(active_fabrics), + /* K2 */ be_nested_str_weak(get_device_id), + /* K3 */ be_nested_str_weak(get_fabric_id), + /* K4 */ be_nested_str_weak(mdns_announce_op_discovery), + /* K5 */ be_nested_str_weak(stop_iteration), + }), + be_str_weak(mdns_announce_op_discovery_all_fabrics), + &be_const_str_solidified, + ( &(const binstruction[22]) { /* code */ + 0x60040010, // 0000 GETGBL R1 G16 + 0x88080100, // 0001 GETMBR R2 R0 K0 + 0x8C080501, // 0002 GETMET R2 R2 K1 + 0x7C080200, // 0003 CALL R2 1 + 0x7C040200, // 0004 CALL R1 1 + 0xA802000B, // 0005 EXBLK 0 #0012 + 0x5C080200, // 0006 MOVE R2 R1 + 0x7C080000, // 0007 CALL R2 0 + 0x8C0C0502, // 0008 GETMET R3 R2 K2 + 0x7C0C0200, // 0009 CALL R3 1 + 0x780E0005, // 000A JMPF R3 #0011 + 0x8C0C0503, // 000B GETMET R3 R2 K3 + 0x7C0C0200, // 000C CALL R3 1 + 0x780E0002, // 000D JMPF R3 #0011 + 0x8C0C0104, // 000E GETMET R3 R0 K4 + 0x5C140400, // 000F MOVE R5 R2 + 0x7C0C0400, // 0010 CALL R3 2 + 0x7001FFF3, // 0011 JMP #0006 + 0x58040005, // 0012 LDCONST R1 K5 + 0xAC040200, // 0013 CATCH R1 1 0 + 0xB0080000, // 0014 RAISE 2 R0 R0 + 0x80000000, // 0015 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: _mdns_announce_hostname +********************************************************************/ +be_local_closure(Matter_Device__mdns_announce_hostname, /* name */ + be_nested_proto( + 16, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[28]) { /* constants */ + /* K0 */ be_nested_str_weak(mdns), + /* K1 */ be_nested_str_weak(string), + /* K2 */ be_nested_str_weak(start), + /* K3 */ be_nested_str_weak(tasmota), + /* K4 */ be_nested_str_weak(eth), + /* K5 */ be_nested_str_weak(hostname_eth), + /* K6 */ be_nested_str_weak(replace), + /* K7 */ be_nested_str_weak(find), + /* K8 */ be_nested_str_weak(mac), + /* K9 */ be_nested_str_weak(_X3A), + /* K10 */ be_nested_str_weak(), + /* K11 */ be_nested_str_weak(ipv4only), + /* K12 */ be_nested_str_weak(log), + /* K13 */ be_nested_str_weak(format), + /* K14 */ be_nested_str_weak(MTR_X3A_X20calling_X20mdns_X2Eadd_hostname_X28_X25s_X2C_X20_X25s_X2C_X20_X25s_X29), + /* K15 */ be_nested_str_weak(ip6local), + /* K16 */ be_nested_str_weak(ip), + /* K17 */ be_const_int(3), + /* K18 */ be_nested_str_weak(add_hostname), + /* K19 */ be_nested_str_weak(ip6), + /* K20 */ be_nested_str_weak(MTR_X3A_X20calling_X20mdns_X2Eadd_hostname_X28_X25s_X2C_X20_X25s_X29), + /* K21 */ be_nested_str_weak(wifi), + /* K22 */ be_nested_str_weak(hostname_wifi), + /* K23 */ be_nested_str_weak(MTR_X3A_X20start_X20mDNS_X20on_X20_X25s_X20host_X20_X27_X25s_X2Elocal_X27), + /* K24 */ be_const_int(2), + /* K25 */ be_nested_str_weak(MTR_X3A_X20Exception), + /* K26 */ be_nested_str_weak(_X7C), + /* K27 */ be_nested_str_weak(mdns_announce_op_discovery_all_fabrics), + }), + be_str_weak(_mdns_announce_hostname), + &be_const_str_solidified, + ( &(const binstruction[172]) { /* code */ + 0xA40A0000, // 0000 IMPORT R2 K0 + 0xA40E0200, // 0001 IMPORT R3 K1 + 0x8C100502, // 0002 GETMET R4 R2 K2 + 0x7C100200, // 0003 CALL R4 1 + 0xA8020092, // 0004 EXBLK 0 #0098 + 0x78060040, // 0005 JMPF R1 #0047 + 0xB8120600, // 0006 GETNGBL R4 K3 + 0x8C100904, // 0007 GETMET R4 R4 K4 + 0x7C100200, // 0008 CALL R4 1 + 0x8C140706, // 0009 GETMET R5 R3 K6 + 0x8C1C0907, // 000A GETMET R7 R4 K7 + 0x58240008, // 000B LDCONST R9 K8 + 0x7C1C0400, // 000C CALL R7 2 + 0x58200009, // 000D LDCONST R8 K9 + 0x5824000A, // 000E LDCONST R9 K10 + 0x7C140800, // 000F CALL R5 4 + 0x90020A05, // 0010 SETMBR R0 K5 R5 + 0x8814010B, // 0011 GETMBR R5 R0 K11 + 0x7416001F, // 0012 JMPT R5 #0033 + 0xB8160600, // 0013 GETNGBL R5 K3 + 0x8C140B0C, // 0014 GETMET R5 R5 K12 + 0x8C1C070D, // 0015 GETMET R7 R3 K13 + 0x5824000E, // 0016 LDCONST R9 K14 + 0x88280105, // 0017 GETMBR R10 R0 K5 + 0x8C2C0907, // 0018 GETMET R11 R4 K7 + 0x5834000F, // 0019 LDCONST R13 K15 + 0x5838000A, // 001A LDCONST R14 K10 + 0x7C2C0600, // 001B CALL R11 3 + 0x8C300907, // 001C GETMET R12 R4 K7 + 0x58380010, // 001D LDCONST R14 K16 + 0x583C000A, // 001E LDCONST R15 K10 + 0x7C300600, // 001F CALL R12 3 + 0x7C1C0A00, // 0020 CALL R7 5 + 0x58200011, // 0021 LDCONST R8 K17 + 0x7C140600, // 0022 CALL R5 3 + 0x8C140512, // 0023 GETMET R5 R2 K18 + 0x881C0105, // 0024 GETMBR R7 R0 K5 + 0x8C200907, // 0025 GETMET R8 R4 K7 + 0x5828000F, // 0026 LDCONST R10 K15 + 0x582C000A, // 0027 LDCONST R11 K10 + 0x7C200600, // 0028 CALL R8 3 + 0x8C240907, // 0029 GETMET R9 R4 K7 + 0x582C0010, // 002A LDCONST R11 K16 + 0x5830000A, // 002B LDCONST R12 K10 + 0x7C240600, // 002C CALL R9 3 + 0x8C280907, // 002D GETMET R10 R4 K7 + 0x58300013, // 002E LDCONST R12 K19 + 0x5834000A, // 002F LDCONST R13 K10 + 0x7C280600, // 0030 CALL R10 3 + 0x7C140A00, // 0031 CALL R5 5 + 0x70020012, // 0032 JMP #0046 + 0xB8160600, // 0033 GETNGBL R5 K3 + 0x8C140B0C, // 0034 GETMET R5 R5 K12 + 0x8C1C070D, // 0035 GETMET R7 R3 K13 + 0x58240014, // 0036 LDCONST R9 K20 + 0x88280105, // 0037 GETMBR R10 R0 K5 + 0x8C2C0907, // 0038 GETMET R11 R4 K7 + 0x58340010, // 0039 LDCONST R13 K16 + 0x5838000A, // 003A LDCONST R14 K10 + 0x7C2C0600, // 003B CALL R11 3 + 0x7C1C0800, // 003C CALL R7 4 + 0x58200011, // 003D LDCONST R8 K17 + 0x7C140600, // 003E CALL R5 3 + 0x8C140512, // 003F GETMET R5 R2 K18 + 0x881C0105, // 0040 GETMBR R7 R0 K5 + 0x8C200907, // 0041 GETMET R8 R4 K7 + 0x58280010, // 0042 LDCONST R10 K16 + 0x582C000A, // 0043 LDCONST R11 K10 + 0x7C200600, // 0044 CALL R8 3 + 0x7C140600, // 0045 CALL R5 3 + 0x7002003F, // 0046 JMP #0087 + 0xB8120600, // 0047 GETNGBL R4 K3 + 0x8C100915, // 0048 GETMET R4 R4 K21 + 0x7C100200, // 0049 CALL R4 1 + 0x8C140706, // 004A GETMET R5 R3 K6 + 0x8C1C0907, // 004B GETMET R7 R4 K7 + 0x58240008, // 004C LDCONST R9 K8 + 0x7C1C0400, // 004D CALL R7 2 + 0x58200009, // 004E LDCONST R8 K9 + 0x5824000A, // 004F LDCONST R9 K10 + 0x7C140800, // 0050 CALL R5 4 + 0x90022C05, // 0051 SETMBR R0 K22 R5 + 0x8814010B, // 0052 GETMBR R5 R0 K11 + 0x7416001F, // 0053 JMPT R5 #0074 + 0xB8160600, // 0054 GETNGBL R5 K3 + 0x8C140B0C, // 0055 GETMET R5 R5 K12 + 0x8C1C070D, // 0056 GETMET R7 R3 K13 + 0x5824000E, // 0057 LDCONST R9 K14 + 0x88280116, // 0058 GETMBR R10 R0 K22 + 0x8C2C0907, // 0059 GETMET R11 R4 K7 + 0x5834000F, // 005A LDCONST R13 K15 + 0x5838000A, // 005B LDCONST R14 K10 + 0x7C2C0600, // 005C CALL R11 3 + 0x8C300907, // 005D GETMET R12 R4 K7 + 0x58380010, // 005E LDCONST R14 K16 + 0x583C000A, // 005F LDCONST R15 K10 + 0x7C300600, // 0060 CALL R12 3 + 0x7C1C0A00, // 0061 CALL R7 5 + 0x58200011, // 0062 LDCONST R8 K17 + 0x7C140600, // 0063 CALL R5 3 + 0x8C140512, // 0064 GETMET R5 R2 K18 + 0x881C0116, // 0065 GETMBR R7 R0 K22 + 0x8C200907, // 0066 GETMET R8 R4 K7 + 0x5828000F, // 0067 LDCONST R10 K15 + 0x582C000A, // 0068 LDCONST R11 K10 + 0x7C200600, // 0069 CALL R8 3 + 0x8C240907, // 006A GETMET R9 R4 K7 + 0x582C0010, // 006B LDCONST R11 K16 + 0x5830000A, // 006C LDCONST R12 K10 + 0x7C240600, // 006D CALL R9 3 + 0x8C280907, // 006E GETMET R10 R4 K7 + 0x58300013, // 006F LDCONST R12 K19 + 0x5834000A, // 0070 LDCONST R13 K10 + 0x7C280600, // 0071 CALL R10 3 + 0x7C140A00, // 0072 CALL R5 5 + 0x70020012, // 0073 JMP #0087 + 0xB8160600, // 0074 GETNGBL R5 K3 + 0x8C140B0C, // 0075 GETMET R5 R5 K12 + 0x8C1C070D, // 0076 GETMET R7 R3 K13 + 0x58240014, // 0077 LDCONST R9 K20 + 0x88280105, // 0078 GETMBR R10 R0 K5 + 0x8C2C0907, // 0079 GETMET R11 R4 K7 + 0x58340010, // 007A LDCONST R13 K16 + 0x5838000A, // 007B LDCONST R14 K10 + 0x7C2C0600, // 007C CALL R11 3 + 0x7C1C0800, // 007D CALL R7 4 + 0x58200011, // 007E LDCONST R8 K17 + 0x7C140600, // 007F CALL R5 3 + 0x8C140512, // 0080 GETMET R5 R2 K18 + 0x881C0116, // 0081 GETMBR R7 R0 K22 + 0x8C200907, // 0082 GETMET R8 R4 K7 + 0x58280010, // 0083 LDCONST R10 K16 + 0x582C000A, // 0084 LDCONST R11 K10 + 0x7C200600, // 0085 CALL R8 3 + 0x7C140600, // 0086 CALL R5 3 + 0xB8120600, // 0087 GETNGBL R4 K3 + 0x8C10090C, // 0088 GETMET R4 R4 K12 + 0x8C18070D, // 0089 GETMET R6 R3 K13 + 0x58200017, // 008A LDCONST R8 K23 + 0x78060001, // 008B JMPF R1 #008E + 0x58240004, // 008C LDCONST R9 K4 + 0x70020000, // 008D JMP #008F + 0x58240015, // 008E LDCONST R9 K21 + 0x78060001, // 008F JMPF R1 #0092 + 0x88280105, // 0090 GETMBR R10 R0 K5 + 0x70020000, // 0091 JMP #0093 + 0x88280116, // 0092 GETMBR R10 R0 K22 + 0x7C180800, // 0093 CALL R6 4 + 0x581C0018, // 0094 LDCONST R7 K24 + 0x7C100600, // 0095 CALL R4 3 + 0xA8040001, // 0096 EXBLK 1 1 + 0x70020010, // 0097 JMP #00A9 + 0xAC100002, // 0098 CATCH R4 0 2 + 0x7002000D, // 0099 JMP #00A8 + 0xB81A0600, // 009A GETNGBL R6 K3 + 0x8C180D0C, // 009B GETMET R6 R6 K12 + 0x60200008, // 009C GETGBL R8 G8 + 0x5C240800, // 009D MOVE R9 R4 + 0x7C200200, // 009E CALL R8 1 + 0x00223208, // 009F ADD R8 K25 R8 + 0x0020111A, // 00A0 ADD R8 R8 K26 + 0x60240008, // 00A1 GETGBL R9 G8 + 0x5C280A00, // 00A2 MOVE R10 R5 + 0x7C240200, // 00A3 CALL R9 1 + 0x00201009, // 00A4 ADD R8 R8 R9 + 0x58240018, // 00A5 LDCONST R9 K24 + 0x7C180600, // 00A6 CALL R6 3 + 0x70020000, // 00A7 JMP #00A9 + 0xB0080000, // 00A8 RAISE 2 R0 R0 + 0x8C10011B, // 00A9 GETMET R4 R0 K27 + 0x7C100200, // 00AA CALL R4 1 + 0x80000000, // 00AB RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: msg_received +********************************************************************/ +be_local_closure(Matter_Device_msg_received, /* name */ + be_nested_proto( + 9, /* nstack */ + 4, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 2]) { /* constants */ + /* K0 */ be_nested_str_weak(message_handler), + /* K1 */ be_nested_str_weak(msg_received), + }), + be_str_weak(msg_received), + &be_const_str_solidified, + ( &(const binstruction[ 7]) { /* code */ + 0x88100100, // 0000 GETMBR R4 R0 K0 + 0x8C100901, // 0001 GETMET R4 R4 K1 + 0x5C180200, // 0002 MOVE R6 R1 + 0x5C1C0400, // 0003 MOVE R7 R2 + 0x5C200600, // 0004 MOVE R8 R3 + 0x7C100800, // 0005 CALL R4 4 + 0x80040800, // 0006 RET 1 R4 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: attribute_updated +********************************************************************/ +be_local_closure(Matter_Device_attribute_updated, /* name */ + be_nested_proto( + 10, /* nstack */ + 5, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 9]) { /* constants */ + /* K0 */ be_nested_str_weak(matter), + /* K1 */ be_nested_str_weak(Path), + /* K2 */ be_nested_str_weak(endpoint), + /* K3 */ be_nested_str_weak(cluster), + /* K4 */ be_nested_str_weak(attribute), + /* K5 */ be_nested_str_weak(message_handler), + /* K6 */ be_nested_str_weak(im), + /* K7 */ be_nested_str_weak(subs_shop), + /* K8 */ be_nested_str_weak(attribute_updated_ctx), + }), + be_str_weak(attribute_updated), + &be_const_str_solidified, + ( &(const binstruction[18]) { /* code */ + 0x4C140000, // 0000 LDNIL R5 + 0x1C140805, // 0001 EQ R5 R4 R5 + 0x78160000, // 0002 JMPF R5 #0004 + 0x50100000, // 0003 LDBOOL R4 0 0 + 0xB8160000, // 0004 GETNGBL R5 K0 + 0x8C140B01, // 0005 GETMET R5 R5 K1 + 0x7C140200, // 0006 CALL R5 1 + 0x90160401, // 0007 SETMBR R5 K2 R1 + 0x90160602, // 0008 SETMBR R5 K3 R2 + 0x90160803, // 0009 SETMBR R5 K4 R3 + 0x88180105, // 000A GETMBR R6 R0 K5 + 0x88180D06, // 000B GETMBR R6 R6 K6 + 0x88180D07, // 000C GETMBR R6 R6 K7 + 0x8C180D08, // 000D GETMET R6 R6 K8 + 0x5C200A00, // 000E MOVE R8 R5 + 0x5C240800, // 000F MOVE R9 R4 + 0x7C180600, // 0010 CALL R6 3 + 0x80000000, // 0011 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: mdns_remove_op_discovery +********************************************************************/ +be_local_closure(Matter_Device_mdns_remove_op_discovery, /* name */ + be_nested_proto( + 14, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[24]) { /* constants */ + /* K0 */ be_nested_str_weak(mdns), + /* K1 */ be_nested_str_weak(string), + /* K2 */ be_nested_str_weak(get_device_id), + /* K3 */ be_nested_str_weak(copy), + /* K4 */ be_nested_str_weak(reverse), + /* K5 */ be_nested_str_weak(get_fabric_compressed), + /* K6 */ be_nested_str_weak(tohex), + /* K7 */ be_nested_str_weak(_X2D), + /* K8 */ be_nested_str_weak(tasmota), + /* K9 */ be_nested_str_weak(eth), + /* K10 */ be_nested_str_weak(find), + /* K11 */ be_nested_str_weak(up), + /* K12 */ be_nested_str_weak(log), + /* K13 */ be_nested_str_weak(format), + /* K14 */ be_nested_str_weak(MTR_X3A_X20remove_X20mDNS_X20on_X20_X25s_X20_X27_X25s_X27), + /* K15 */ be_const_int(2), + /* K16 */ be_nested_str_weak(remove_service), + /* K17 */ be_nested_str_weak(_matter), + /* K18 */ be_nested_str_weak(_tcp), + /* K19 */ be_nested_str_weak(hostname_eth), + /* K20 */ be_nested_str_weak(wifi), + /* K21 */ be_nested_str_weak(hostname_wifi), + /* K22 */ be_nested_str_weak(MTR_X3A_X20Exception), + /* K23 */ be_nested_str_weak(_X7C), + }), + be_str_weak(mdns_remove_op_discovery), + &be_const_str_solidified, + ( &(const binstruction[81]) { /* code */ + 0xA40A0000, // 0000 IMPORT R2 K0 + 0xA40E0200, // 0001 IMPORT R3 K1 + 0xA802003B, // 0002 EXBLK 0 #003F + 0x8C100302, // 0003 GETMET R4 R1 K2 + 0x7C100200, // 0004 CALL R4 1 + 0x8C100903, // 0005 GETMET R4 R4 K3 + 0x7C100200, // 0006 CALL R4 1 + 0x8C100904, // 0007 GETMET R4 R4 K4 + 0x7C100200, // 0008 CALL R4 1 + 0x8C140305, // 0009 GETMET R5 R1 K5 + 0x7C140200, // 000A CALL R5 1 + 0x8C180B06, // 000B GETMET R6 R5 K6 + 0x7C180200, // 000C CALL R6 1 + 0x00180D07, // 000D ADD R6 R6 K7 + 0x8C1C0906, // 000E GETMET R7 R4 K6 + 0x7C1C0200, // 000F CALL R7 1 + 0x00180C07, // 0010 ADD R6 R6 R7 + 0xB81E1000, // 0011 GETNGBL R7 K8 + 0x8C1C0F09, // 0012 GETMET R7 R7 K9 + 0x7C1C0200, // 0013 CALL R7 1 + 0x8C1C0F0A, // 0014 GETMET R7 R7 K10 + 0x5824000B, // 0015 LDCONST R9 K11 + 0x7C1C0400, // 0016 CALL R7 2 + 0x781E000E, // 0017 JMPF R7 #0027 + 0xB81E1000, // 0018 GETNGBL R7 K8 + 0x8C1C0F0C, // 0019 GETMET R7 R7 K12 + 0x8C24070D, // 001A GETMET R9 R3 K13 + 0x582C000E, // 001B LDCONST R11 K14 + 0x58300009, // 001C LDCONST R12 K9 + 0x5C340C00, // 001D MOVE R13 R6 + 0x7C240800, // 001E CALL R9 4 + 0x5828000F, // 001F LDCONST R10 K15 + 0x7C1C0600, // 0020 CALL R7 3 + 0x8C1C0510, // 0021 GETMET R7 R2 K16 + 0x58240011, // 0022 LDCONST R9 K17 + 0x58280012, // 0023 LDCONST R10 K18 + 0x5C2C0C00, // 0024 MOVE R11 R6 + 0x88300113, // 0025 GETMBR R12 R0 K19 + 0x7C1C0A00, // 0026 CALL R7 5 + 0xB81E1000, // 0027 GETNGBL R7 K8 + 0x8C1C0F14, // 0028 GETMET R7 R7 K20 + 0x7C1C0200, // 0029 CALL R7 1 + 0x8C1C0F0A, // 002A GETMET R7 R7 K10 + 0x5824000B, // 002B LDCONST R9 K11 + 0x7C1C0400, // 002C CALL R7 2 + 0x781E000E, // 002D JMPF R7 #003D + 0xB81E1000, // 002E GETNGBL R7 K8 + 0x8C1C0F0C, // 002F GETMET R7 R7 K12 + 0x8C24070D, // 0030 GETMET R9 R3 K13 + 0x582C000E, // 0031 LDCONST R11 K14 + 0x58300014, // 0032 LDCONST R12 K20 + 0x5C340C00, // 0033 MOVE R13 R6 + 0x7C240800, // 0034 CALL R9 4 + 0x5828000F, // 0035 LDCONST R10 K15 + 0x7C1C0600, // 0036 CALL R7 3 + 0x8C1C0510, // 0037 GETMET R7 R2 K16 + 0x58240011, // 0038 LDCONST R9 K17 + 0x58280012, // 0039 LDCONST R10 K18 + 0x5C2C0C00, // 003A MOVE R11 R6 + 0x88300115, // 003B GETMBR R12 R0 K21 + 0x7C1C0A00, // 003C CALL R7 5 + 0xA8040001, // 003D EXBLK 1 1 + 0x70020010, // 003E JMP #0050 + 0xAC100002, // 003F CATCH R4 0 2 + 0x7002000D, // 0040 JMP #004F + 0xB81A1000, // 0041 GETNGBL R6 K8 + 0x8C180D0C, // 0042 GETMET R6 R6 K12 + 0x60200008, // 0043 GETGBL R8 G8 + 0x5C240800, // 0044 MOVE R9 R4 + 0x7C200200, // 0045 CALL R8 1 + 0x00222C08, // 0046 ADD R8 K22 R8 + 0x00201117, // 0047 ADD R8 R8 K23 + 0x60240008, // 0048 GETGBL R9 G8 + 0x5C280A00, // 0049 MOVE R10 R5 + 0x7C240200, // 004A CALL R9 1 + 0x00201009, // 004B ADD R8 R8 R9 + 0x5824000F, // 004C LDCONST R9 K15 + 0x7C180600, // 004D CALL R6 3 + 0x70020000, // 004E JMP #0050 + 0xB0080000, // 004F RAISE 2 R0 R0 + 0x80000000, // 0050 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: start_basic_commissioning +********************************************************************/ +be_local_closure(Matter_Device_start_basic_commissioning, /* name */ + be_nested_proto( + 13, /* nstack */ + 8, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 1, /* has sup protos */ + ( &(const struct bproto*[ 2]) { + be_nested_proto( + 4, /* nstack */ + 0, /* argc */ + 0, /* varg */ + 1, /* has upvals */ + ( &(const bupvaldesc[ 1]) { /* upvals */ + be_local_const_upval(1, 0), + }), + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 4]) { /* constants */ + /* K0 */ be_nested_str_weak(mdns_announce_PASE), + /* K1 */ be_nested_str_weak(tasmota), + /* K2 */ be_nested_str_weak(remove_rule), + /* K3 */ be_nested_str_weak(Wifi_X23Connected), + }), + be_str_weak(_anonymous_), + &be_const_str_solidified, + ( &(const binstruction[ 9]) { /* code */ + 0x68000000, // 0000 GETUPV R0 U0 + 0x8C000100, // 0001 GETMET R0 R0 K0 + 0x7C000200, // 0002 CALL R0 1 + 0xB8020200, // 0003 GETNGBL R0 K1 + 0x8C000102, // 0004 GETMET R0 R0 K2 + 0x58080003, // 0005 LDCONST R2 K3 + 0x580C0000, // 0006 LDCONST R3 K0 + 0x7C000600, // 0007 CALL R0 3 + 0x80000000, // 0008 RET 0 + }) + ), + be_nested_proto( + 4, /* nstack */ + 0, /* argc */ + 0, /* varg */ + 1, /* has upvals */ + ( &(const bupvaldesc[ 1]) { /* upvals */ + be_local_const_upval(1, 0), + }), + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 4]) { /* constants */ + /* K0 */ be_nested_str_weak(mdns_announce_PASE), + /* K1 */ be_nested_str_weak(tasmota), + /* K2 */ be_nested_str_weak(remove_rule), + /* K3 */ be_nested_str_weak(Eth_X23Connected), + }), + be_str_weak(_anonymous_), + &be_const_str_solidified, + ( &(const binstruction[ 9]) { /* code */ + 0x68000000, // 0000 GETUPV R0 U0 + 0x8C000100, // 0001 GETMET R0 R0 K0 + 0x7C000200, // 0002 CALL R0 1 + 0xB8020200, // 0003 GETNGBL R0 K1 + 0x8C000102, // 0004 GETMET R0 R0 K2 + 0x58080003, // 0005 LDCONST R2 K3 + 0x580C0000, // 0006 LDCONST R3 K0 + 0x7C000600, // 0007 CALL R0 3 + 0x80000000, // 0008 RET 0 + }) + ), + }), + 1, /* has constants */ + ( &(const bvalue[16]) { /* constants */ + /* K0 */ be_nested_str_weak(commissioning_open), + /* K1 */ be_nested_str_weak(tasmota), + /* K2 */ be_nested_str_weak(millis), + /* K3 */ be_nested_str_weak(commissioning_iterations), + /* K4 */ be_nested_str_weak(commissioning_discriminator), + /* K5 */ be_nested_str_weak(commissioning_salt), + /* K6 */ be_nested_str_weak(commissioning_w0), + /* K7 */ be_nested_str_weak(commissioning_L), + /* K8 */ be_nested_str_weak(commissioning_admin_fabric), + /* K9 */ be_nested_str_weak(wifi), + /* K10 */ be_nested_str_weak(up), + /* K11 */ be_nested_str_weak(eth), + /* K12 */ be_nested_str_weak(mdns_announce_PASE), + /* K13 */ be_nested_str_weak(add_rule), + /* K14 */ be_nested_str_weak(Wifi_X23Connected), + /* K15 */ be_nested_str_weak(Eth_X23Connected), + }), + be_str_weak(start_basic_commissioning), + &be_const_str_solidified, + ( &(const binstruction[40]) { /* code */ + 0xB8220200, // 0000 GETNGBL R8 K1 + 0x8C201102, // 0001 GETMET R8 R8 K2 + 0x7C200200, // 0002 CALL R8 1 + 0x542603E7, // 0003 LDINT R9 1000 + 0x08240209, // 0004 MUL R9 R1 R9 + 0x00201009, // 0005 ADD R8 R8 R9 + 0x90020008, // 0006 SETMBR R0 K0 R8 + 0x90020602, // 0007 SETMBR R0 K3 R2 + 0x90020803, // 0008 SETMBR R0 K4 R3 + 0x90020A04, // 0009 SETMBR R0 K5 R4 + 0x90020C05, // 000A SETMBR R0 K6 R5 + 0x90020E06, // 000B SETMBR R0 K7 R6 + 0x90021007, // 000C SETMBR R0 K8 R7 + 0xB8220200, // 000D GETNGBL R8 K1 + 0x8C201109, // 000E GETMET R8 R8 K9 + 0x7C200200, // 000F CALL R8 1 + 0x9420110A, // 0010 GETIDX R8 R8 K10 + 0x74220004, // 0011 JMPT R8 #0017 + 0xB8220200, // 0012 GETNGBL R8 K1 + 0x8C20110B, // 0013 GETMET R8 R8 K11 + 0x7C200200, // 0014 CALL R8 1 + 0x9420110A, // 0015 GETIDX R8 R8 K10 + 0x78220002, // 0016 JMPF R8 #001A + 0x8C20010C, // 0017 GETMET R8 R0 K12 + 0x7C200200, // 0018 CALL R8 1 + 0x7002000B, // 0019 JMP #0026 + 0xB8220200, // 001A GETNGBL R8 K1 + 0x8C20110D, // 001B GETMET R8 R8 K13 + 0x5828000E, // 001C LDCONST R10 K14 + 0x842C0000, // 001D CLOSURE R11 P0 + 0x5830000C, // 001E LDCONST R12 K12 + 0x7C200800, // 001F CALL R8 4 + 0xB8220200, // 0020 GETNGBL R8 K1 + 0x8C20110D, // 0021 GETMET R8 R8 K13 + 0x5828000F, // 0022 LDCONST R10 K15 + 0x842C0001, // 0023 CLOSURE R11 P1 + 0x5830000C, // 0024 LDCONST R12 K12 + 0x7C200800, // 0025 CALL R8 4 + 0xA0000000, // 0026 CLOSE R0 + 0x80000000, // 0027 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: mdns_remove_op_discovery_all_fabrics +********************************************************************/ +be_local_closure(Matter_Device_mdns_remove_op_discovery_all_fabrics, /* name */ + be_nested_proto( + 6, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 6]) { /* constants */ + /* K0 */ be_nested_str_weak(sessions), + /* K1 */ be_nested_str_weak(active_fabrics), + /* K2 */ be_nested_str_weak(get_device_id), + /* K3 */ be_nested_str_weak(get_fabric_id), + /* K4 */ be_nested_str_weak(mdns_remove_op_discovery), + /* K5 */ be_nested_str_weak(stop_iteration), + }), + be_str_weak(mdns_remove_op_discovery_all_fabrics), + &be_const_str_solidified, + ( &(const binstruction[22]) { /* code */ + 0x60040010, // 0000 GETGBL R1 G16 + 0x88080100, // 0001 GETMBR R2 R0 K0 + 0x8C080501, // 0002 GETMET R2 R2 K1 + 0x7C080200, // 0003 CALL R2 1 + 0x7C040200, // 0004 CALL R1 1 + 0xA802000B, // 0005 EXBLK 0 #0012 + 0x5C080200, // 0006 MOVE R2 R1 + 0x7C080000, // 0007 CALL R2 0 + 0x8C0C0502, // 0008 GETMET R3 R2 K2 + 0x7C0C0200, // 0009 CALL R3 1 + 0x780E0005, // 000A JMPF R3 #0011 + 0x8C0C0503, // 000B GETMET R3 R2 K3 + 0x7C0C0200, // 000C CALL R3 1 + 0x780E0002, // 000D JMPF R3 #0011 + 0x8C0C0104, // 000E GETMET R3 R0 K4 + 0x5C140400, // 000F MOVE R5 R2 + 0x7C0C0400, // 0010 CALL R3 2 + 0x7001FFF3, // 0011 JMP #0006 + 0x58040005, // 0012 LDCONST R1 K5 + 0xAC040200, // 0013 CATCH R1 1 0 + 0xB0080000, // 0014 RAISE 2 R0 R0 + 0x80000000, // 0015 RET 0 + }) + ) +); +/*******************************************************************/ + + /******************************************************************** ** Solidified function: start ********************************************************************/ @@ -83,6 +1703,372 @@ be_local_closure(Matter_Device_start, /* name */ /*******************************************************************/ +/******************************************************************** +** Solidified function: sort_distinct +********************************************************************/ +be_local_closure(Matter_Device_sort_distinct, /* name */ + be_nested_proto( + 7, /* nstack */ + 1, /* argc */ + 4, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 5]) { /* constants */ + /* K0 */ be_const_class(be_class_Matter_Device), + /* K1 */ be_const_int(1), + /* K2 */ be_const_int(0), + /* K3 */ be_nested_str_weak(stop_iteration), + /* K4 */ be_nested_str_weak(remove), + }), + be_str_weak(sort_distinct), + &be_const_str_solidified, + ( &(const binstruction[53]) { /* code */ + 0x58040000, // 0000 LDCONST R1 K0 + 0x60080010, // 0001 GETGBL R2 G16 + 0x600C000C, // 0002 GETGBL R3 G12 + 0x5C100000, // 0003 MOVE R4 R0 + 0x7C0C0200, // 0004 CALL R3 1 + 0x040C0701, // 0005 SUB R3 R3 K1 + 0x400E0203, // 0006 CONNECT R3 K1 R3 + 0x7C080200, // 0007 CALL R2 1 + 0xA8020010, // 0008 EXBLK 0 #001A + 0x5C0C0400, // 0009 MOVE R3 R2 + 0x7C0C0000, // 000A CALL R3 0 + 0x94100003, // 000B GETIDX R4 R0 R3 + 0x5C140600, // 000C MOVE R5 R3 + 0x24180B02, // 000D GT R6 R5 K2 + 0x781A0008, // 000E JMPF R6 #0018 + 0x04180B01, // 000F SUB R6 R5 K1 + 0x94180006, // 0010 GETIDX R6 R0 R6 + 0x24180C04, // 0011 GT R6 R6 R4 + 0x781A0004, // 0012 JMPF R6 #0018 + 0x04180B01, // 0013 SUB R6 R5 K1 + 0x94180006, // 0014 GETIDX R6 R0 R6 + 0x98000A06, // 0015 SETIDX R0 R5 R6 + 0x04140B01, // 0016 SUB R5 R5 K1 + 0x7001FFF4, // 0017 JMP #000D + 0x98000A04, // 0018 SETIDX R0 R5 R4 + 0x7001FFEE, // 0019 JMP #0009 + 0x58080003, // 001A LDCONST R2 K3 + 0xAC080200, // 001B CATCH R2 1 0 + 0xB0080000, // 001C RAISE 2 R0 R0 + 0x58080001, // 001D LDCONST R2 K1 + 0x600C000C, // 001E GETGBL R3 G12 + 0x5C100000, // 001F MOVE R4 R0 + 0x7C0C0200, // 0020 CALL R3 1 + 0x180C0701, // 0021 LE R3 R3 K1 + 0x780E0000, // 0022 JMPF R3 #0024 + 0x80040000, // 0023 RET 1 R0 + 0x940C0102, // 0024 GETIDX R3 R0 K2 + 0x6010000C, // 0025 GETGBL R4 G12 + 0x5C140000, // 0026 MOVE R5 R0 + 0x7C100200, // 0027 CALL R4 1 + 0x14100404, // 0028 LT R4 R2 R4 + 0x78120009, // 0029 JMPF R4 #0034 + 0x94100002, // 002A GETIDX R4 R0 R2 + 0x1C100803, // 002B EQ R4 R4 R3 + 0x78120003, // 002C JMPF R4 #0031 + 0x8C100104, // 002D GETMET R4 R0 K4 + 0x5C180400, // 002E MOVE R6 R2 + 0x7C100400, // 002F CALL R4 2 + 0x70020001, // 0030 JMP #0033 + 0x940C0002, // 0031 GETIDX R3 R0 R2 + 0x00080501, // 0032 ADD R2 R2 K1 + 0x7001FFF0, // 0033 JMP #0025 + 0x80040000, // 0034 RET 1 R0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: _compute_pbkdf +********************************************************************/ +be_local_closure(Matter_Device__compute_pbkdf, /* name */ + be_nested_proto( + 14, /* nstack */ + 4, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[11]) { /* constants */ + /* K0 */ be_nested_str_weak(crypto), + /* K1 */ be_nested_str_weak(string), + /* K2 */ be_nested_str_weak(add), + /* K3 */ be_nested_str_weak(PBKDF2_HMAC_SHA256), + /* K4 */ be_nested_str_weak(derive), + /* K5 */ be_const_int(0), + /* K6 */ be_nested_str_weak(root_w0), + /* K7 */ be_nested_str_weak(EC_P256), + /* K8 */ be_nested_str_weak(mod), + /* K9 */ be_nested_str_weak(root_L), + /* K10 */ be_nested_str_weak(public_key), + }), + be_str_weak(_compute_pbkdf), + &be_const_str_solidified, + ( &(const binstruction[41]) { /* code */ + 0xA4120000, // 0000 IMPORT R4 K0 + 0xA4160200, // 0001 IMPORT R5 K1 + 0x60180015, // 0002 GETGBL R6 G21 + 0x7C180000, // 0003 CALL R6 0 + 0x8C180D02, // 0004 GETMET R6 R6 K2 + 0x5C200200, // 0005 MOVE R8 R1 + 0x54260003, // 0006 LDINT R9 4 + 0x7C180600, // 0007 CALL R6 3 + 0x8C1C0903, // 0008 GETMET R7 R4 K3 + 0x7C1C0200, // 0009 CALL R7 1 + 0x8C1C0F04, // 000A GETMET R7 R7 K4 + 0x5C240C00, // 000B MOVE R9 R6 + 0x5C280600, // 000C MOVE R10 R3 + 0x5C2C0400, // 000D MOVE R11 R2 + 0x5432004F, // 000E LDINT R12 80 + 0x7C1C0A00, // 000F CALL R7 5 + 0x54220026, // 0010 LDINT R8 39 + 0x40220A08, // 0011 CONNECT R8 K5 R8 + 0x94200E08, // 0012 GETIDX R8 R7 R8 + 0x54260027, // 0013 LDINT R9 40 + 0x542A004E, // 0014 LDINT R10 79 + 0x4024120A, // 0015 CONNECT R9 R9 R10 + 0x94240E09, // 0016 GETIDX R9 R7 R9 + 0x8C280907, // 0017 GETMET R10 R4 K7 + 0x7C280200, // 0018 CALL R10 1 + 0x8C281508, // 0019 GETMET R10 R10 K8 + 0x5C301000, // 001A MOVE R12 R8 + 0x7C280400, // 001B CALL R10 2 + 0x90020C0A, // 001C SETMBR R0 K6 R10 + 0x8C280907, // 001D GETMET R10 R4 K7 + 0x7C280200, // 001E CALL R10 1 + 0x8C281508, // 001F GETMET R10 R10 K8 + 0x5C301200, // 0020 MOVE R12 R9 + 0x7C280400, // 0021 CALL R10 2 + 0x8C2C0907, // 0022 GETMET R11 R4 K7 + 0x7C2C0200, // 0023 CALL R11 1 + 0x8C2C170A, // 0024 GETMET R11 R11 K10 + 0x5C341400, // 0025 MOVE R13 R10 + 0x7C2C0400, // 0026 CALL R11 2 + 0x9002120B, // 0027 SETMBR R0 K9 R11 + 0x80000000, // 0028 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: mdns_remove_PASE +********************************************************************/ +be_local_closure(Matter_Device_mdns_remove_PASE, /* name */ + be_nested_proto( + 12, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[22]) { /* constants */ + /* K0 */ be_nested_str_weak(mdns), + /* K1 */ be_nested_str_weak(string), + /* K2 */ be_nested_str_weak(mdns_pase_eth), + /* K3 */ be_nested_str_weak(tasmota), + /* K4 */ be_nested_str_weak(log), + /* K5 */ be_nested_str_weak(format), + /* K6 */ be_nested_str_weak(MTR_X3A_X20calling_X20mdns_X2Eremove_service_X28_X25s_X2C_X20_X25s_X2C_X20_X25s_X2C_X20_X25s_X29), + /* K7 */ be_nested_str_weak(_matterc), + /* K8 */ be_nested_str_weak(_udp), + /* K9 */ be_nested_str_weak(commissioning_instance_eth), + /* K10 */ be_nested_str_weak(hostname_eth), + /* K11 */ be_const_int(3), + /* K12 */ be_nested_str_weak(MTR_X3A_X20remove_X20mDNS_X20on_X20_X25s_X20_X27_X25s_X27), + /* K13 */ be_nested_str_weak(eth), + /* K14 */ be_const_int(2), + /* K15 */ be_nested_str_weak(remove_service), + /* K16 */ be_nested_str_weak(mdns_pase_wifi), + /* K17 */ be_nested_str_weak(commissioning_instance_wifi), + /* K18 */ be_nested_str_weak(hostname_wifi), + /* K19 */ be_nested_str_weak(wifi), + /* K20 */ be_nested_str_weak(MTR_X3A_X20Exception), + /* K21 */ be_nested_str_weak(_X7C), + }), + be_str_weak(mdns_remove_PASE), + &be_const_str_solidified, + ( &(const binstruction[83]) { /* code */ + 0xA4060000, // 0000 IMPORT R1 K0 + 0xA40A0200, // 0001 IMPORT R2 K1 + 0xA802003D, // 0002 EXBLK 0 #0041 + 0x880C0102, // 0003 GETMBR R3 R0 K2 + 0x780E001B, // 0004 JMPF R3 #0021 + 0xB80E0600, // 0005 GETNGBL R3 K3 + 0x8C0C0704, // 0006 GETMET R3 R3 K4 + 0x8C140505, // 0007 GETMET R5 R2 K5 + 0x581C0006, // 0008 LDCONST R7 K6 + 0x58200007, // 0009 LDCONST R8 K7 + 0x58240008, // 000A LDCONST R9 K8 + 0x88280109, // 000B GETMBR R10 R0 K9 + 0x882C010A, // 000C GETMBR R11 R0 K10 + 0x7C140C00, // 000D CALL R5 6 + 0x5818000B, // 000E LDCONST R6 K11 + 0x7C0C0600, // 000F CALL R3 3 + 0xB80E0600, // 0010 GETNGBL R3 K3 + 0x8C0C0704, // 0011 GETMET R3 R3 K4 + 0x8C140505, // 0012 GETMET R5 R2 K5 + 0x581C000C, // 0013 LDCONST R7 K12 + 0x5820000D, // 0014 LDCONST R8 K13 + 0x88240109, // 0015 GETMBR R9 R0 K9 + 0x7C140800, // 0016 CALL R5 4 + 0x5818000E, // 0017 LDCONST R6 K14 + 0x7C0C0600, // 0018 CALL R3 3 + 0x500C0000, // 0019 LDBOOL R3 0 0 + 0x90020403, // 001A SETMBR R0 K2 R3 + 0x8C0C030F, // 001B GETMET R3 R1 K15 + 0x58140007, // 001C LDCONST R5 K7 + 0x58180008, // 001D LDCONST R6 K8 + 0x881C0109, // 001E GETMBR R7 R0 K9 + 0x8820010A, // 001F GETMBR R8 R0 K10 + 0x7C0C0A00, // 0020 CALL R3 5 + 0x880C0110, // 0021 GETMBR R3 R0 K16 + 0x780E001B, // 0022 JMPF R3 #003F + 0xB80E0600, // 0023 GETNGBL R3 K3 + 0x8C0C0704, // 0024 GETMET R3 R3 K4 + 0x8C140505, // 0025 GETMET R5 R2 K5 + 0x581C0006, // 0026 LDCONST R7 K6 + 0x58200007, // 0027 LDCONST R8 K7 + 0x58240008, // 0028 LDCONST R9 K8 + 0x88280111, // 0029 GETMBR R10 R0 K17 + 0x882C0112, // 002A GETMBR R11 R0 K18 + 0x7C140C00, // 002B CALL R5 6 + 0x5818000B, // 002C LDCONST R6 K11 + 0x7C0C0600, // 002D CALL R3 3 + 0xB80E0600, // 002E GETNGBL R3 K3 + 0x8C0C0704, // 002F GETMET R3 R3 K4 + 0x8C140505, // 0030 GETMET R5 R2 K5 + 0x581C000C, // 0031 LDCONST R7 K12 + 0x58200013, // 0032 LDCONST R8 K19 + 0x88240111, // 0033 GETMBR R9 R0 K17 + 0x7C140800, // 0034 CALL R5 4 + 0x5818000E, // 0035 LDCONST R6 K14 + 0x7C0C0600, // 0036 CALL R3 3 + 0x500C0000, // 0037 LDBOOL R3 0 0 + 0x90022003, // 0038 SETMBR R0 K16 R3 + 0x8C0C030F, // 0039 GETMET R3 R1 K15 + 0x58140007, // 003A LDCONST R5 K7 + 0x58180008, // 003B LDCONST R6 K8 + 0x881C0111, // 003C GETMBR R7 R0 K17 + 0x88200112, // 003D GETMBR R8 R0 K18 + 0x7C0C0A00, // 003E CALL R3 5 + 0xA8040001, // 003F EXBLK 1 1 + 0x70020010, // 0040 JMP #0052 + 0xAC0C0002, // 0041 CATCH R3 0 2 + 0x7002000D, // 0042 JMP #0051 + 0xB8160600, // 0043 GETNGBL R5 K3 + 0x8C140B04, // 0044 GETMET R5 R5 K4 + 0x601C0008, // 0045 GETGBL R7 G8 + 0x5C200600, // 0046 MOVE R8 R3 + 0x7C1C0200, // 0047 CALL R7 1 + 0x001E2807, // 0048 ADD R7 K20 R7 + 0x001C0F15, // 0049 ADD R7 R7 K21 + 0x60200008, // 004A GETGBL R8 G8 + 0x5C240800, // 004B MOVE R9 R4 + 0x7C200200, // 004C CALL R8 1 + 0x001C0E08, // 004D ADD R7 R7 R8 + 0x5820000E, // 004E LDCONST R8 K14 + 0x7C140600, // 004F CALL R5 3 + 0x70020000, // 0050 JMP #0052 + 0xB0080000, // 0051 RAISE 2 R0 R0 + 0x80000000, // 0052 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: received_ack +********************************************************************/ +be_local_closure(Matter_Device_received_ack, /* name */ + be_nested_proto( + 5, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 2]) { /* constants */ + /* K0 */ be_nested_str_weak(udp_server), + /* K1 */ be_nested_str_weak(received_ack), + }), + be_str_weak(received_ack), + &be_const_str_solidified, + ( &(const binstruction[ 5]) { /* code */ + 0x88080100, // 0000 GETMBR R2 R0 K0 + 0x8C080501, // 0001 GETMET R2 R2 K1 + 0x5C100200, // 0002 MOVE R4 R1 + 0x7C080400, // 0003 CALL R2 2 + 0x80040400, // 0004 RET 1 R2 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: every_second +********************************************************************/ +be_local_closure(Matter_Device_every_second, /* name */ + be_nested_proto( + 4, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 6]) { /* constants */ + /* K0 */ be_nested_str_weak(sessions), + /* K1 */ be_nested_str_weak(every_second), + /* K2 */ be_nested_str_weak(message_handler), + /* K3 */ be_nested_str_weak(commissioning_open), + /* K4 */ be_nested_str_weak(tasmota), + /* K5 */ be_nested_str_weak(time_reached), + }), + be_str_weak(every_second), + &be_const_str_solidified, + ( &(const binstruction[18]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x8C040301, // 0001 GETMET R1 R1 K1 + 0x7C040200, // 0002 CALL R1 1 + 0x88040102, // 0003 GETMBR R1 R0 K2 + 0x8C040301, // 0004 GETMET R1 R1 K1 + 0x7C040200, // 0005 CALL R1 1 + 0x88040103, // 0006 GETMBR R1 R0 K3 + 0x4C080000, // 0007 LDNIL R2 + 0x20040202, // 0008 NE R1 R1 R2 + 0x78060006, // 0009 JMPF R1 #0011 + 0xB8060800, // 000A GETNGBL R1 K4 + 0x8C040305, // 000B GETMET R1 R1 K5 + 0x880C0103, // 000C GETMBR R3 R0 K3 + 0x7C040400, // 000D CALL R1 2 + 0x78060001, // 000E JMPF R1 #0011 + 0x4C040000, // 000F LDNIL R1 + 0x90020601, // 0010 SETMBR R0 K3 R1 + 0x80000000, // 0011 RET 0 + }) + ) +); +/*******************************************************************/ + + /******************************************************************** ** Solidified function: generate_random_passcode ********************************************************************/ @@ -265,6 +2251,286 @@ be_local_closure(Matter_Device_save_param, /* name */ /*******************************************************************/ +/******************************************************************** +** Solidified function: _load_plugins_config +********************************************************************/ +be_local_closure(Matter_Device__load_plugins_config, /* name */ + be_nested_proto( + 19, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[27]) { /* constants */ + /* K0 */ be_nested_str_weak(string), + /* K1 */ be_nested_str_weak(k2l_num), + /* K2 */ be_nested_str_weak(tasmota), + /* K3 */ be_nested_str_weak(log), + /* K4 */ be_nested_str_weak(MTR_X3A_X20endpoints_X20to_X20be_X20configured_X20), + /* K5 */ be_const_int(3), + /* K6 */ be_nested_str_weak(format), + /* K7 */ be_nested_str_weak(MTR_X3A_X20endpoint_X20_X25i_X20config_X20_X25s), + /* K8 */ be_nested_str_weak(find), + /* K9 */ be_nested_str_weak(type), + /* K10 */ be_nested_str_weak(MTR_X3A_X20no_X20class_X20name_X2C_X20skipping), + /* K11 */ be_nested_str_weak(plugins_classes), + /* K12 */ be_nested_str_weak(MTR_X3A_X20unknown_X20class_X20name_X20_X27), + /* K13 */ be_nested_str_weak(_X27_X20skipping), + /* K14 */ be_const_int(2), + /* K15 */ be_nested_str_weak(plugins), + /* K16 */ be_nested_str_weak(push), + /* K17 */ be_nested_str_weak(), + /* K18 */ be_nested_str_weak(k2l), + /* K19 */ be_nested_str_weak(_X20_X25s_X3A_X25s), + /* K20 */ be_nested_str_weak(stop_iteration), + /* K21 */ be_nested_str_weak(MTR_X3A_X20endpoint_X3A_X25i_X20type_X3A_X25s_X25s), + /* K22 */ be_nested_str_weak(MTR_X3A_X20Exception), + /* K23 */ be_nested_str_weak(_X7C), + /* K24 */ be_nested_str_weak(publish_result), + /* K25 */ be_nested_str_weak(_X7B_X22Matter_X22_X3A_X7B_X22Initialized_X22_X3A1_X7D_X7D), + /* K26 */ be_nested_str_weak(Matter), + }), + be_str_weak(_load_plugins_config), + &be_const_str_solidified, + ( &(const binstruction[133]) { /* code */ + 0xA40A0000, // 0000 IMPORT R2 K0 + 0x8C0C0101, // 0001 GETMET R3 R0 K1 + 0x5C140200, // 0002 MOVE R5 R1 + 0x7C0C0400, // 0003 CALL R3 2 + 0xB8120400, // 0004 GETNGBL R4 K2 + 0x8C100903, // 0005 GETMET R4 R4 K3 + 0x60180008, // 0006 GETGBL R6 G8 + 0x5C1C0600, // 0007 MOVE R7 R3 + 0x7C180200, // 0008 CALL R6 1 + 0x001A0806, // 0009 ADD R6 K4 R6 + 0x581C0005, // 000A LDCONST R7 K5 + 0x7C100600, // 000B CALL R4 3 + 0x60100010, // 000C GETGBL R4 G16 + 0x5C140600, // 000D MOVE R5 R3 + 0x7C100200, // 000E CALL R4 1 + 0xA802006B, // 000F EXBLK 0 #007C + 0x5C140800, // 0010 MOVE R5 R4 + 0x7C140000, // 0011 CALL R5 0 + 0xA8020056, // 0012 EXBLK 0 #006A + 0x60180008, // 0013 GETGBL R6 G8 + 0x5C1C0A00, // 0014 MOVE R7 R5 + 0x7C180200, // 0015 CALL R6 1 + 0x94180206, // 0016 GETIDX R6 R1 R6 + 0xB81E0400, // 0017 GETNGBL R7 K2 + 0x8C1C0F03, // 0018 GETMET R7 R7 K3 + 0x8C240506, // 0019 GETMET R9 R2 K6 + 0x582C0007, // 001A LDCONST R11 K7 + 0x5C300A00, // 001B MOVE R12 R5 + 0x5C340C00, // 001C MOVE R13 R6 + 0x7C240800, // 001D CALL R9 4 + 0x58280005, // 001E LDCONST R10 K5 + 0x7C1C0600, // 001F CALL R7 3 + 0x8C1C0D08, // 0020 GETMET R7 R6 K8 + 0x58240009, // 0021 LDCONST R9 K9 + 0x7C1C0400, // 0022 CALL R7 2 + 0x4C200000, // 0023 LDNIL R8 + 0x1C200E08, // 0024 EQ R8 R7 R8 + 0x78220006, // 0025 JMPF R8 #002D + 0xB8220400, // 0026 GETNGBL R8 K2 + 0x8C201103, // 0027 GETMET R8 R8 K3 + 0x5828000A, // 0028 LDCONST R10 K10 + 0x582C0005, // 0029 LDCONST R11 K5 + 0x7C200600, // 002A CALL R8 3 + 0xA8040001, // 002B EXBLK 1 1 + 0x7001FFE2, // 002C JMP #0010 + 0x8820010B, // 002D GETMBR R8 R0 K11 + 0x8C201108, // 002E GETMET R8 R8 K8 + 0x5C280E00, // 002F MOVE R10 R7 + 0x7C200400, // 0030 CALL R8 2 + 0x4C240000, // 0031 LDNIL R9 + 0x1C241009, // 0032 EQ R9 R8 R9 + 0x7826000A, // 0033 JMPF R9 #003F + 0xB8260400, // 0034 GETNGBL R9 K2 + 0x8C241303, // 0035 GETMET R9 R9 K3 + 0x602C0008, // 0036 GETGBL R11 G8 + 0x5C300E00, // 0037 MOVE R12 R7 + 0x7C2C0200, // 0038 CALL R11 1 + 0x002E180B, // 0039 ADD R11 K12 R11 + 0x002C170D, // 003A ADD R11 R11 K13 + 0x5830000E, // 003B LDCONST R12 K14 + 0x7C240600, // 003C CALL R9 3 + 0xA8040001, // 003D EXBLK 1 1 + 0x7001FFD0, // 003E JMP #0010 + 0x5C241000, // 003F MOVE R9 R8 + 0x5C280000, // 0040 MOVE R10 R0 + 0x5C2C0A00, // 0041 MOVE R11 R5 + 0x5C300C00, // 0042 MOVE R12 R6 + 0x7C240600, // 0043 CALL R9 3 + 0x8828010F, // 0044 GETMBR R10 R0 K15 + 0x8C281510, // 0045 GETMET R10 R10 K16 + 0x5C301200, // 0046 MOVE R12 R9 + 0x7C280400, // 0047 CALL R10 2 + 0x58280011, // 0048 LDCONST R10 K17 + 0x602C0010, // 0049 GETGBL R11 G16 + 0x8C300112, // 004A GETMET R12 R0 K18 + 0x5C380C00, // 004B MOVE R14 R6 + 0x7C300400, // 004C CALL R12 2 + 0x7C2C0200, // 004D CALL R11 1 + 0xA802000B, // 004E EXBLK 0 #005B + 0x5C301600, // 004F MOVE R12 R11 + 0x7C300000, // 0050 CALL R12 0 + 0x1C341909, // 0051 EQ R13 R12 K9 + 0x78360000, // 0052 JMPF R13 #0054 + 0x7001FFFA, // 0053 JMP #004F + 0x8C340506, // 0054 GETMET R13 R2 K6 + 0x583C0013, // 0055 LDCONST R15 K19 + 0x5C401800, // 0056 MOVE R16 R12 + 0x94440C0C, // 0057 GETIDX R17 R6 R12 + 0x7C340800, // 0058 CALL R13 4 + 0x0028140D, // 0059 ADD R10 R10 R13 + 0x7001FFF3, // 005A JMP #004F + 0x582C0014, // 005B LDCONST R11 K20 + 0xAC2C0200, // 005C CATCH R11 1 0 + 0xB0080000, // 005D RAISE 2 R0 R0 + 0xB82E0400, // 005E GETNGBL R11 K2 + 0x8C2C1703, // 005F GETMET R11 R11 K3 + 0x8C340506, // 0060 GETMET R13 R2 K6 + 0x583C0015, // 0061 LDCONST R15 K21 + 0x5C400A00, // 0062 MOVE R16 R5 + 0x5C440E00, // 0063 MOVE R17 R7 + 0x5C481400, // 0064 MOVE R18 R10 + 0x7C340A00, // 0065 CALL R13 5 + 0x5838000E, // 0066 LDCONST R14 K14 + 0x7C2C0600, // 0067 CALL R11 3 + 0xA8040001, // 0068 EXBLK 1 1 + 0x70020010, // 0069 JMP #007B + 0xAC180002, // 006A CATCH R6 0 2 + 0x7002000D, // 006B JMP #007A + 0xB8220400, // 006C GETNGBL R8 K2 + 0x8C201103, // 006D GETMET R8 R8 K3 + 0x60280008, // 006E GETGBL R10 G8 + 0x5C2C0C00, // 006F MOVE R11 R6 + 0x7C280200, // 0070 CALL R10 1 + 0x002A2C0A, // 0071 ADD R10 K22 R10 + 0x00281517, // 0072 ADD R10 R10 K23 + 0x602C0008, // 0073 GETGBL R11 G8 + 0x5C300E00, // 0074 MOVE R12 R7 + 0x7C2C0200, // 0075 CALL R11 1 + 0x0028140B, // 0076 ADD R10 R10 R11 + 0x582C000E, // 0077 LDCONST R11 K14 + 0x7C200600, // 0078 CALL R8 3 + 0x70020000, // 0079 JMP #007B + 0xB0080000, // 007A RAISE 2 R0 R0 + 0x7001FF93, // 007B JMP #0010 + 0x58100014, // 007C LDCONST R4 K20 + 0xAC100200, // 007D CATCH R4 1 0 + 0xB0080000, // 007E RAISE 2 R0 R0 + 0xB8120400, // 007F GETNGBL R4 K2 + 0x8C100918, // 0080 GETMET R4 R4 K24 + 0x58180019, // 0081 LDCONST R6 K25 + 0x581C001A, // 0082 LDCONST R7 K26 + 0x7C100600, // 0083 CALL R4 3 + 0x80000000, // 0084 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: start_root_basic_commissioning +********************************************************************/ +be_local_closure(Matter_Device_start_root_basic_commissioning, /* name */ + be_nested_proto( + 14, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[23]) { /* constants */ + /* K0 */ be_nested_str_weak(string), + /* K1 */ be_nested_str_weak(PASE_TIMEOUT), + /* K2 */ be_nested_str_weak(compute_manual_pairing_code), + /* K3 */ be_nested_str_weak(tasmota), + /* K4 */ be_nested_str_weak(log), + /* K5 */ be_nested_str_weak(format), + /* K6 */ be_nested_str_weak(MTR_X3A_X20Manual_X20pairing_X20code_X3A_X20_X25s_X2D_X25s_X2D_X25s), + /* K7 */ be_const_int(0), + /* K8 */ be_const_int(3), + /* K9 */ be_const_int(2147483647), + /* K10 */ be_const_int(2), + /* K11 */ be_nested_str_weak(compute_qrcode_content), + /* K12 */ be_nested_str_weak(publish_result), + /* K13 */ be_nested_str_weak(_X7B_X22Matter_X22_X3A_X7B_X22Commissioning_X22_X3A1_X2C_X22PairingCode_X22_X3A_X22_X25s_X22_X2C_X22QRCode_X22_X3A_X22_X25s_X22_X7D_X7D), + /* K14 */ be_nested_str_weak(Matter), + /* K15 */ be_nested_str_weak(_compute_pbkdf), + /* K16 */ be_nested_str_weak(root_passcode), + /* K17 */ be_nested_str_weak(root_iterations), + /* K18 */ be_nested_str_weak(root_salt), + /* K19 */ be_nested_str_weak(start_basic_commissioning), + /* K20 */ be_nested_str_weak(root_discriminator), + /* K21 */ be_nested_str_weak(root_w0), + /* K22 */ be_nested_str_weak(root_L), + }), + be_str_weak(start_root_basic_commissioning), + &be_const_str_solidified, + ( &(const binstruction[49]) { /* code */ + 0xA40A0000, // 0000 IMPORT R2 K0 + 0x4C0C0000, // 0001 LDNIL R3 + 0x1C0C0203, // 0002 EQ R3 R1 R3 + 0x780E0000, // 0003 JMPF R3 #0005 + 0x88040101, // 0004 GETMBR R1 R0 K1 + 0x8C0C0102, // 0005 GETMET R3 R0 K2 + 0x7C0C0200, // 0006 CALL R3 1 + 0xB8120600, // 0007 GETNGBL R4 K3 + 0x8C100904, // 0008 GETMET R4 R4 K4 + 0x8C180505, // 0009 GETMET R6 R2 K5 + 0x58200006, // 000A LDCONST R8 K6 + 0x40260F08, // 000B CONNECT R9 K7 K8 + 0x94240609, // 000C GETIDX R9 R3 R9 + 0x542A0003, // 000D LDINT R10 4 + 0x542E0005, // 000E LDINT R11 6 + 0x4028140B, // 000F CONNECT R10 R10 R11 + 0x9428060A, // 0010 GETIDX R10 R3 R10 + 0x542E0006, // 0011 LDINT R11 7 + 0x402C1709, // 0012 CONNECT R11 R11 K9 + 0x942C060B, // 0013 GETIDX R11 R3 R11 + 0x7C180A00, // 0014 CALL R6 5 + 0x581C000A, // 0015 LDCONST R7 K10 + 0x7C100600, // 0016 CALL R4 3 + 0x8C10010B, // 0017 GETMET R4 R0 K11 + 0x7C100200, // 0018 CALL R4 1 + 0xB8160600, // 0019 GETNGBL R5 K3 + 0x8C140B0C, // 001A GETMET R5 R5 K12 + 0x8C1C0505, // 001B GETMET R7 R2 K5 + 0x5824000D, // 001C LDCONST R9 K13 + 0x5C280600, // 001D MOVE R10 R3 + 0x5C2C0800, // 001E MOVE R11 R4 + 0x7C1C0800, // 001F CALL R7 4 + 0x5820000E, // 0020 LDCONST R8 K14 + 0x7C140600, // 0021 CALL R5 3 + 0x8C14010F, // 0022 GETMET R5 R0 K15 + 0x881C0110, // 0023 GETMBR R7 R0 K16 + 0x88200111, // 0024 GETMBR R8 R0 K17 + 0x88240112, // 0025 GETMBR R9 R0 K18 + 0x7C140800, // 0026 CALL R5 4 + 0x8C140113, // 0027 GETMET R5 R0 K19 + 0x5C1C0200, // 0028 MOVE R7 R1 + 0x88200111, // 0029 GETMBR R8 R0 K17 + 0x88240114, // 002A GETMBR R9 R0 K20 + 0x88280112, // 002B GETMBR R10 R0 K18 + 0x882C0115, // 002C GETMBR R11 R0 K21 + 0x88300116, // 002D GETMBR R12 R0 K22 + 0x4C340000, // 002E LDNIL R13 + 0x7C141000, // 002F CALL R5 8 + 0x80000000, // 0030 RET 0 + }) + ) +); +/*******************************************************************/ + + /******************************************************************** ** Solidified function: remove_fabric ********************************************************************/ @@ -345,98 +2611,11 @@ be_local_closure(Matter_Device_remove_fabric, /* name */ /******************************************************************** -** Solidified function: _start_udp +** Solidified function: load_param ********************************************************************/ -be_local_closure(Matter_Device__start_udp, /* name */ +be_local_closure(Matter_Device_load_param, /* name */ be_nested_proto( - 6, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 1, /* has sup protos */ - ( &(const struct bproto*[ 1]) { - be_nested_proto( - 8, /* nstack */ - 3, /* argc */ - 0, /* varg */ - 1, /* has upvals */ - ( &(const bupvaldesc[ 1]) { /* upvals */ - be_local_const_upval(1, 0), - }), - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 1]) { /* constants */ - /* K0 */ be_nested_str_weak(msg_received), - }), - be_str_weak(_X3Clambda_X3E), - &be_const_str_solidified, - ( &(const binstruction[ 7]) { /* code */ - 0x680C0000, // 0000 GETUPV R3 U0 - 0x8C0C0700, // 0001 GETMET R3 R3 K0 - 0x5C140000, // 0002 MOVE R5 R0 - 0x5C180200, // 0003 MOVE R6 R1 - 0x5C1C0400, // 0004 MOVE R7 R2 - 0x7C0C0800, // 0005 CALL R3 4 - 0x80040600, // 0006 RET 1 R3 - }) - ), - }), - 1, /* has constants */ - ( &(const bvalue[ 9]) { /* constants */ - /* K0 */ be_nested_str_weak(udp_server), - /* K1 */ be_nested_str_weak(tasmota), - /* K2 */ be_nested_str_weak(log), - /* K3 */ be_nested_str_weak(MTR_X3A_X20starting_X20UDP_X20server_X20on_X20port_X3A_X20), - /* K4 */ be_const_int(2), - /* K5 */ be_nested_str_weak(matter), - /* K6 */ be_nested_str_weak(UDPServer), - /* K7 */ be_nested_str_weak(), - /* K8 */ be_nested_str_weak(start), - }), - be_str_weak(_start_udp), - &be_const_str_solidified, - ( &(const binstruction[27]) { /* code */ - 0x88080100, // 0000 GETMBR R2 R0 K0 - 0x780A0000, // 0001 JMPF R2 #0003 - 0x80000400, // 0002 RET 0 - 0x4C080000, // 0003 LDNIL R2 - 0x1C080202, // 0004 EQ R2 R1 R2 - 0x780A0000, // 0005 JMPF R2 #0007 - 0x540615A3, // 0006 LDINT R1 5540 - 0xB80A0200, // 0007 GETNGBL R2 K1 - 0x8C080502, // 0008 GETMET R2 R2 K2 - 0x60100008, // 0009 GETGBL R4 G8 - 0x5C140200, // 000A MOVE R5 R1 - 0x7C100200, // 000B CALL R4 1 - 0x00120604, // 000C ADD R4 K3 R4 - 0x58140004, // 000D LDCONST R5 K4 - 0x7C080600, // 000E CALL R2 3 - 0xB80A0A00, // 000F GETNGBL R2 K5 - 0x8C080506, // 0010 GETMET R2 R2 K6 - 0x58100007, // 0011 LDCONST R4 K7 - 0x5C140200, // 0012 MOVE R5 R1 - 0x7C080600, // 0013 CALL R2 3 - 0x90020002, // 0014 SETMBR R0 K0 R2 - 0x88080100, // 0015 GETMBR R2 R0 K0 - 0x8C080508, // 0016 GETMET R2 R2 K8 - 0x84100000, // 0017 CLOSURE R4 P0 - 0x7C080400, // 0018 CALL R2 2 - 0xA0000000, // 0019 CLOSE R0 - 0x80000000, // 001A RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: every_50ms -********************************************************************/ -be_local_closure(Matter_Device_every_50ms, /* name */ - be_nested_proto( - 2, /* nstack */ + 12, /* nstack */ 1, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -444,17 +2623,130 @@ be_local_closure(Matter_Device_every_50ms, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[ 2]) { /* constants */ - /* K0 */ be_nested_str_weak(tick), - /* K1 */ be_const_int(1), + ( &(const bvalue[28]) { /* constants */ + /* K0 */ be_nested_str_weak(string), + /* K1 */ be_nested_str_weak(crypto), + /* K2 */ be_nested_str_weak(FILENAME), + /* K3 */ be_nested_str_weak(read), + /* K4 */ be_nested_str_weak(close), + /* K5 */ be_nested_str_weak(json), + /* K6 */ be_nested_str_weak(load), + /* K7 */ be_nested_str_weak(root_discriminator), + /* K8 */ be_nested_str_weak(find), + /* K9 */ be_nested_str_weak(distinguish), + /* K10 */ be_nested_str_weak(root_passcode), + /* K11 */ be_nested_str_weak(passcode), + /* K12 */ be_nested_str_weak(ipv4only), + /* K13 */ be_nested_str_weak(plugins_config), + /* K14 */ be_nested_str_weak(config), + /* K15 */ be_nested_str_weak(_load_plugins_config), + /* K16 */ be_nested_str_weak(plugins_persist), + /* K17 */ be_nested_str_weak(io_error), + /* K18 */ be_nested_str_weak(tasmota), + /* K19 */ be_nested_str_weak(log), + /* K20 */ be_nested_str_weak(MTR_X3A_X20Session_Store_X3A_X3Aload_X20Exception_X3A), + /* K21 */ be_nested_str_weak(_X7C), + /* K22 */ be_const_int(2), + /* K23 */ be_nested_str_weak(random), + /* K24 */ be_nested_str_weak(get), + /* K25 */ be_const_int(0), + /* K26 */ be_nested_str_weak(generate_random_passcode), + /* K27 */ be_nested_str_weak(save_param), }), - be_str_weak(every_50ms), + be_str_weak(load_param), &be_const_str_solidified, - ( &(const binstruction[ 4]) { /* code */ - 0x88040100, // 0000 GETMBR R1 R0 K0 - 0x00040301, // 0001 ADD R1 R1 K1 - 0x90020001, // 0002 SETMBR R0 K0 R1 - 0x80000000, // 0003 RET 0 + ( &(const binstruction[91]) { /* code */ + 0xA4060000, // 0000 IMPORT R1 K0 + 0xA40A0200, // 0001 IMPORT R2 K1 + 0xA8020028, // 0002 EXBLK 0 #002C + 0x600C0011, // 0003 GETGBL R3 G17 + 0x88100102, // 0004 GETMBR R4 R0 K2 + 0x7C0C0200, // 0005 CALL R3 1 + 0x8C100703, // 0006 GETMET R4 R3 K3 + 0x7C100200, // 0007 CALL R4 1 + 0x8C140704, // 0008 GETMET R5 R3 K4 + 0x7C140200, // 0009 CALL R5 1 + 0xA4160A00, // 000A IMPORT R5 K5 + 0x8C180B06, // 000B GETMET R6 R5 K6 + 0x5C200800, // 000C MOVE R8 R4 + 0x7C180400, // 000D CALL R6 2 + 0x8C1C0D08, // 000E GETMET R7 R6 K8 + 0x58240009, // 000F LDCONST R9 K9 + 0x88280107, // 0010 GETMBR R10 R0 K7 + 0x7C1C0600, // 0011 CALL R7 3 + 0x90020E07, // 0012 SETMBR R0 K7 R7 + 0x8C1C0D08, // 0013 GETMET R7 R6 K8 + 0x5824000B, // 0014 LDCONST R9 K11 + 0x8828010A, // 0015 GETMBR R10 R0 K10 + 0x7C1C0600, // 0016 CALL R7 3 + 0x90021407, // 0017 SETMBR R0 K10 R7 + 0x601C0017, // 0018 GETGBL R7 G23 + 0x8C200D08, // 0019 GETMET R8 R6 K8 + 0x5828000C, // 001A LDCONST R10 K12 + 0x502C0000, // 001B LDBOOL R11 0 0 + 0x7C200600, // 001C CALL R8 3 + 0x7C1C0200, // 001D CALL R7 1 + 0x90021807, // 001E SETMBR R0 K12 R7 + 0x8C1C0D08, // 001F GETMET R7 R6 K8 + 0x5824000E, // 0020 LDCONST R9 K14 + 0x7C1C0400, // 0021 CALL R7 2 + 0x90021A07, // 0022 SETMBR R0 K13 R7 + 0x881C010D, // 0023 GETMBR R7 R0 K13 + 0x781E0004, // 0024 JMPF R7 #002A + 0x8C1C010F, // 0025 GETMET R7 R0 K15 + 0x8824010D, // 0026 GETMBR R9 R0 K13 + 0x7C1C0400, // 0027 CALL R7 2 + 0x501C0200, // 0028 LDBOOL R7 1 0 + 0x90022007, // 0029 SETMBR R0 K16 R7 + 0xA8040001, // 002A EXBLK 1 1 + 0x70020012, // 002B JMP #003F + 0xAC0C0002, // 002C CATCH R3 0 2 + 0x7002000F, // 002D JMP #003E + 0x20140711, // 002E NE R5 R3 K17 + 0x7816000C, // 002F JMPF R5 #003D + 0xB8162400, // 0030 GETNGBL R5 K18 + 0x8C140B13, // 0031 GETMET R5 R5 K19 + 0x601C0008, // 0032 GETGBL R7 G8 + 0x5C200600, // 0033 MOVE R8 R3 + 0x7C1C0200, // 0034 CALL R7 1 + 0x001E2807, // 0035 ADD R7 K20 R7 + 0x001C0F15, // 0036 ADD R7 R7 K21 + 0x60200008, // 0037 GETGBL R8 G8 + 0x5C240800, // 0038 MOVE R9 R4 + 0x7C200200, // 0039 CALL R8 1 + 0x001C0E08, // 003A ADD R7 R7 R8 + 0x58200016, // 003B LDCONST R8 K22 + 0x7C140600, // 003C CALL R5 3 + 0x70020000, // 003D JMP #003F + 0xB0080000, // 003E RAISE 2 R0 R0 + 0x500C0000, // 003F LDBOOL R3 0 0 + 0x88100107, // 0040 GETMBR R4 R0 K7 + 0x4C140000, // 0041 LDNIL R5 + 0x1C100805, // 0042 EQ R4 R4 R5 + 0x7812000A, // 0043 JMPF R4 #004F + 0x8C100517, // 0044 GETMET R4 R2 K23 + 0x58180016, // 0045 LDCONST R6 K22 + 0x7C100400, // 0046 CALL R4 2 + 0x8C100918, // 0047 GETMET R4 R4 K24 + 0x58180019, // 0048 LDCONST R6 K25 + 0x581C0016, // 0049 LDCONST R7 K22 + 0x7C100600, // 004A CALL R4 3 + 0x54160FFE, // 004B LDINT R5 4095 + 0x2C100805, // 004C AND R4 R4 R5 + 0x90020E04, // 004D SETMBR R0 K7 R4 + 0x500C0200, // 004E LDBOOL R3 1 0 + 0x8810010A, // 004F GETMBR R4 R0 K10 + 0x4C140000, // 0050 LDNIL R5 + 0x1C100805, // 0051 EQ R4 R4 R5 + 0x78120003, // 0052 JMPF R4 #0057 + 0x8C10011A, // 0053 GETMET R4 R0 K26 + 0x7C100200, // 0054 CALL R4 1 + 0x90021404, // 0055 SETMBR R0 K10 R4 + 0x500C0200, // 0056 LDBOOL R3 1 0 + 0x780E0001, // 0057 JMPF R3 #005A + 0x8C10011B, // 0058 GETMET R4 R0 K27 + 0x7C100200, // 0059 CALL R4 1 + 0x80000000, // 005A RET 0 }) ) ); @@ -462,635 +2754,231 @@ be_local_closure(Matter_Device_every_50ms, /* name */ /******************************************************************** -** Solidified function: stop +** Solidified function: init ********************************************************************/ -be_local_closure(Matter_Device_stop, /* name */ +be_local_closure(Matter_Device_init, /* name */ be_nested_proto( - 4, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 4]) { /* constants */ - /* K0 */ be_nested_str_weak(tasmota), - /* K1 */ be_nested_str_weak(remove_driver), - /* K2 */ be_nested_str_weak(udp_server), - /* K3 */ be_nested_str_weak(stop), - }), - be_str_weak(stop), - &be_const_str_solidified, - ( &(const binstruction[10]) { /* code */ - 0xB8060000, // 0000 GETNGBL R1 K0 - 0x8C040301, // 0001 GETMET R1 R1 K1 - 0x5C0C0000, // 0002 MOVE R3 R0 - 0x7C040400, // 0003 CALL R1 2 - 0x88040102, // 0004 GETMBR R1 R0 K2 - 0x78060002, // 0005 JMPF R1 #0009 - 0x88040102, // 0006 GETMBR R1 R0 K2 - 0x8C040303, // 0007 GETMET R1 R1 K3 - 0x7C040200, // 0008 CALL R1 1 - 0x80000000, // 0009 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: start_commissioning_complete -********************************************************************/ -be_local_closure(Matter_Device_start_commissioning_complete, /* name */ - be_nested_proto( - 6, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 5]) { /* constants */ - /* K0 */ be_nested_str_weak(tasmota), - /* K1 */ be_nested_str_weak(log), - /* K2 */ be_nested_str_weak(MTR_X3A_X20_X2A_X2A_X2A_X20Commissioning_X20complete_X20_X2A_X2A_X2A), - /* K3 */ be_const_int(2), - /* K4 */ be_nested_str_weak(stop_basic_commissioning), - }), - be_str_weak(start_commissioning_complete), - &be_const_str_solidified, - ( &(const binstruction[ 8]) { /* code */ - 0xB80A0000, // 0000 GETNGBL R2 K0 - 0x8C080501, // 0001 GETMET R2 R2 K1 - 0x58100002, // 0002 LDCONST R4 K2 - 0x58140003, // 0003 LDCONST R5 K3 - 0x7C080600, // 0004 CALL R2 3 - 0x8C080104, // 0005 GETMET R2 R0 K4 - 0x7C080200, // 0006 CALL R2 1 - 0x80000000, // 0007 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: register_commands -********************************************************************/ -be_local_closure(Matter_Device_register_commands, /* name */ - be_nested_proto( - 5, /* nstack */ + 8, /* nstack */ 1, /* argc */ 2, /* varg */ 0, /* has upvals */ NULL, /* no upvals */ 1, /* has sup protos */ - ( &(const struct bproto*[ 1]) { + ( &(const struct bproto*[ 2]) { be_nested_proto( - 10, /* nstack */ - 4, /* argc */ - 0, /* varg */ - 1, /* has upvals */ - ( &(const bupvaldesc[ 1]) { /* upvals */ - be_local_const_upval(1, 0), - }), - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 1]) { /* constants */ - /* K0 */ be_nested_str_weak(MtrJoin), - }), - be_str_weak(_X3Clambda_X3E), - &be_const_str_solidified, - ( &(const binstruction[ 8]) { /* code */ - 0x68100000, // 0000 GETUPV R4 U0 - 0x8C100900, // 0001 GETMET R4 R4 K0 - 0x5C180000, // 0002 MOVE R6 R0 - 0x5C1C0200, // 0003 MOVE R7 R1 - 0x5C200400, // 0004 MOVE R8 R2 - 0x5C240600, // 0005 MOVE R9 R3 - 0x7C100A00, // 0006 CALL R4 5 - 0x80040800, // 0007 RET 1 R4 - }) - ), - }), - 1, /* has constants */ - ( &(const bvalue[ 3]) { /* constants */ - /* K0 */ be_nested_str_weak(tasmota), - /* K1 */ be_nested_str_weak(add_cmd), - /* K2 */ be_nested_str_weak(MtrJoin), - }), - be_str_weak(register_commands), - &be_const_str_solidified, - ( &(const binstruction[ 7]) { /* code */ - 0xB8060000, // 0000 GETNGBL R1 K0 - 0x8C040301, // 0001 GETMET R1 R1 K1 - 0x580C0002, // 0002 LDCONST R3 K2 - 0x84100000, // 0003 CLOSURE R4 P0 - 0x7C040600, // 0004 CALL R1 3 - 0xA0000000, // 0005 CLOSE R0 - 0x80000000, // 0006 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: start_operational_discovery_deferred -********************************************************************/ -be_local_closure(Matter_Device_start_operational_discovery_deferred, /* name */ - be_nested_proto( - 6, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 1, /* has sup protos */ - ( &(const struct bproto*[ 1]) { - be_nested_proto( - 3, /* nstack */ + 4, /* nstack */ 0, /* argc */ 0, /* varg */ 1, /* has upvals */ - ( &(const bupvaldesc[ 2]) { /* upvals */ + ( &(const bupvaldesc[ 1]) { /* upvals */ be_local_const_upval(1, 0), - be_local_const_upval(1, 1), }), 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[ 1]) { /* constants */ - /* K0 */ be_nested_str_weak(start_operational_discovery), + ( &(const bvalue[ 5]) { /* constants */ + /* K0 */ be_nested_str_weak(start), + /* K1 */ be_nested_str_weak(tasmota), + /* K2 */ be_nested_str_weak(remove_rule), + /* K3 */ be_nested_str_weak(Wifi_X23Connected), + /* K4 */ be_nested_str_weak(matter_start), }), - be_str_weak(_X3Clambda_X3E), + be_str_weak(_anonymous_), &be_const_str_solidified, - ( &(const binstruction[ 5]) { /* code */ + ( &(const binstruction[ 9]) { /* code */ 0x68000000, // 0000 GETUPV R0 U0 0x8C000100, // 0001 GETMET R0 R0 K0 - 0x68080001, // 0002 GETUPV R2 U1 - 0x7C000400, // 0003 CALL R0 2 - 0x80040000, // 0004 RET 1 R0 + 0x7C000200, // 0002 CALL R0 1 + 0xB8020200, // 0003 GETNGBL R0 K1 + 0x8C000102, // 0004 GETMET R0 R0 K2 + 0x58080003, // 0005 LDCONST R2 K3 + 0x580C0004, // 0006 LDCONST R3 K4 + 0x7C000600, // 0007 CALL R0 3 + 0x80000000, // 0008 RET 0 + }) + ), + be_nested_proto( + 4, /* nstack */ + 0, /* argc */ + 0, /* varg */ + 1, /* has upvals */ + ( &(const bupvaldesc[ 1]) { /* upvals */ + be_local_const_upval(1, 0), + }), + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 5]) { /* constants */ + /* K0 */ be_nested_str_weak(start), + /* K1 */ be_nested_str_weak(tasmota), + /* K2 */ be_nested_str_weak(remove_rule), + /* K3 */ be_nested_str_weak(Eth_X23Connected), + /* K4 */ be_nested_str_weak(matter_start), + }), + be_str_weak(_anonymous_), + &be_const_str_solidified, + ( &(const binstruction[ 9]) { /* code */ + 0x68000000, // 0000 GETUPV R0 U0 + 0x8C000100, // 0001 GETMET R0 R0 K0 + 0x7C000200, // 0002 CALL R0 1 + 0xB8020200, // 0003 GETNGBL R0 K1 + 0x8C000102, // 0004 GETMET R0 R0 K2 + 0x58080003, // 0005 LDCONST R2 K3 + 0x580C0004, // 0006 LDCONST R3 K4 + 0x7C000600, // 0007 CALL R0 3 + 0x80000000, // 0008 RET 0 }) ), }), 1, /* has constants */ - ( &(const bvalue[ 3]) { /* constants */ - /* K0 */ be_nested_str_weak(tasmota), - /* K1 */ be_nested_str_weak(set_timer), - /* K2 */ be_const_int(0), - }), - be_str_weak(start_operational_discovery_deferred), - &be_const_str_solidified, - ( &(const binstruction[ 7]) { /* code */ - 0xB80A0000, // 0000 GETNGBL R2 K0 - 0x8C080501, // 0001 GETMET R2 R2 K1 - 0x58100002, // 0002 LDCONST R4 K2 - 0x84140000, // 0003 CLOSURE R5 P0 - 0x7C080600, // 0004 CALL R2 3 - 0xA0000000, // 0005 CLOSE R0 - 0x80000000, // 0006 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: register_native_classes -********************************************************************/ -be_local_closure(Matter_Device_register_native_classes, /* name */ - be_nested_proto( - 12, /* nstack */ - 3, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[17]) { /* constants */ - /* K0 */ be_nested_str_weak(introspect), + ( &(const bvalue[41]) { /* constants */ + /* K0 */ be_nested_str_weak(crypto), /* K1 */ be_nested_str_weak(string), - /* K2 */ be_nested_str_weak(members), - /* K3 */ be_nested_str_weak(matter), - /* K4 */ be_nested_str_weak(get), - /* K5 */ be_nested_str_weak(class), - /* K6 */ be_nested_str_weak(find), - /* K7 */ be_nested_str_weak(Plugin_), - /* K8 */ be_const_int(0), - /* K9 */ be_nested_str_weak(register_plugin_class), - /* K10 */ be_nested_str_weak(stop_iteration), - /* K11 */ be_nested_str_weak(tasmota), - /* K12 */ be_nested_str_weak(log), - /* K13 */ be_nested_str_weak(MTR_X3A_X20registered_X20classes_X20), - /* K14 */ be_nested_str_weak(k2l), - /* K15 */ be_nested_str_weak(plugins_classes), - /* K16 */ be_const_int(3), + /* K2 */ be_nested_str_weak(tasmota), + /* K3 */ be_nested_str_weak(get_option), + /* K4 */ be_nested_str_weak(matter), + /* K5 */ be_nested_str_weak(MATTER_OPTION), + /* K6 */ be_nested_str_weak(UI), + /* K7 */ be_nested_str_weak(started), + /* K8 */ be_nested_str_weak(tick), + /* K9 */ be_const_int(0), + /* K10 */ be_nested_str_weak(plugins), + /* K11 */ be_nested_str_weak(plugins_persist), + /* K12 */ be_nested_str_weak(plugins_classes), + /* K13 */ be_nested_str_weak(register_native_classes), + /* K14 */ be_nested_str_weak(vendorid), + /* K15 */ be_nested_str_weak(VENDOR_ID), + /* K16 */ be_nested_str_weak(productid), + /* K17 */ be_nested_str_weak(PRODUCT_ID), + /* K18 */ be_nested_str_weak(root_iterations), + /* K19 */ be_nested_str_weak(PBKDF_ITERATIONS), + /* K20 */ be_nested_str_weak(root_salt), + /* K21 */ be_nested_str_weak(random), + /* K22 */ be_nested_str_weak(ipv4only), + /* K23 */ be_nested_str_weak(load_param), + /* K24 */ be_nested_str_weak(sessions), + /* K25 */ be_nested_str_weak(Session_Store), + /* K26 */ be_nested_str_weak(load_fabrics), + /* K27 */ be_nested_str_weak(message_handler), + /* K28 */ be_nested_str_weak(MessageHandler), + /* K29 */ be_nested_str_weak(ui), + /* K30 */ be_nested_str_weak(wifi), + /* K31 */ be_nested_str_weak(up), + /* K32 */ be_nested_str_weak(eth), + /* K33 */ be_nested_str_weak(start), + /* K34 */ be_nested_str_weak(add_rule), + /* K35 */ be_nested_str_weak(Wifi_X23Connected), + /* K36 */ be_nested_str_weak(matter_start), + /* K37 */ be_nested_str_weak(Eth_X23Connected), + /* K38 */ be_nested_str_weak(_init_basic_commissioning), + /* K39 */ be_nested_str_weak(add_driver), + /* K40 */ be_nested_str_weak(register_commands), }), - be_str_weak(register_native_classes), + be_str_weak(init), &be_const_str_solidified, - ( &(const binstruction[43]) { /* code */ - 0xA40E0000, // 0000 IMPORT R3 K0 - 0xA4120200, // 0001 IMPORT R4 K1 - 0x60140010, // 0002 GETGBL R5 G16 - 0x8C180702, // 0003 GETMET R6 R3 K2 - 0xB8220600, // 0004 GETNGBL R8 K3 - 0x7C180400, // 0005 CALL R6 2 - 0x7C140200, // 0006 CALL R5 1 - 0xA8020014, // 0007 EXBLK 0 #001D - 0x5C180A00, // 0008 MOVE R6 R5 - 0x7C180000, // 0009 CALL R6 0 - 0x8C1C0704, // 000A GETMET R7 R3 K4 - 0xB8260600, // 000B GETNGBL R9 K3 - 0x5C280C00, // 000C MOVE R10 R6 - 0x7C1C0600, // 000D CALL R7 3 - 0x60200004, // 000E GETGBL R8 G4 - 0x5C240E00, // 000F MOVE R9 R7 - 0x7C200200, // 0010 CALL R8 1 - 0x1C201105, // 0011 EQ R8 R8 K5 - 0x78220008, // 0012 JMPF R8 #001C - 0x8C200906, // 0013 GETMET R8 R4 K6 - 0x5C280C00, // 0014 MOVE R10 R6 - 0x582C0007, // 0015 LDCONST R11 K7 - 0x7C200600, // 0016 CALL R8 3 - 0x1C201108, // 0017 EQ R8 R8 K8 - 0x78220002, // 0018 JMPF R8 #001C - 0x8C200109, // 0019 GETMET R8 R0 K9 - 0x5C280E00, // 001A MOVE R10 R7 - 0x7C200400, // 001B CALL R8 2 - 0x7001FFEA, // 001C JMP #0008 - 0x5814000A, // 001D LDCONST R5 K10 - 0xAC140200, // 001E CATCH R5 1 0 - 0xB0080000, // 001F RAISE 2 R0 R0 - 0xB8161600, // 0020 GETNGBL R5 K11 - 0x8C140B0C, // 0021 GETMET R5 R5 K12 - 0x601C0008, // 0022 GETGBL R7 G8 - 0x8C20010E, // 0023 GETMET R8 R0 K14 - 0x8828010F, // 0024 GETMBR R10 R0 K15 - 0x7C200400, // 0025 CALL R8 2 - 0x7C1C0200, // 0026 CALL R7 1 - 0x001E1A07, // 0027 ADD R7 K13 R7 - 0x58200010, // 0028 LDCONST R8 K16 - 0x7C140600, // 0029 CALL R5 3 - 0x80000000, // 002A RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: stop_basic_commissioning -********************************************************************/ -be_local_closure(Matter_Device_stop_basic_commissioning, /* name */ - be_nested_proto( - 5, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[13]) { /* constants */ - /* K0 */ be_nested_str_weak(is_root_commissioning_open), - /* K1 */ be_nested_str_weak(tasmota), - /* K2 */ be_nested_str_weak(publish_result), - /* K3 */ be_nested_str_weak(_X7B_X22Matter_X22_X3A_X7B_X22Commissioning_X22_X3A0_X7D_X7D), - /* K4 */ be_nested_str_weak(Matter), - /* K5 */ be_nested_str_weak(commissioning_open), - /* K6 */ be_nested_str_weak(mdns_remove_PASE), - /* K7 */ be_nested_str_weak(commissioning_iterations), - /* K8 */ be_nested_str_weak(commissioning_discriminator), - /* K9 */ be_nested_str_weak(commissioning_salt), - /* K10 */ be_nested_str_weak(commissioning_w0), - /* K11 */ be_nested_str_weak(commissioning_L), - /* K12 */ be_nested_str_weak(commissioning_admin_fabric), - }), - be_str_weak(stop_basic_commissioning), - &be_const_str_solidified, - ( &(const binstruction[25]) { /* code */ - 0x8C040100, // 0000 GETMET R1 R0 K0 - 0x7C040200, // 0001 CALL R1 1 - 0x78060004, // 0002 JMPF R1 #0008 - 0xB8060200, // 0003 GETNGBL R1 K1 - 0x8C040302, // 0004 GETMET R1 R1 K2 - 0x580C0003, // 0005 LDCONST R3 K3 - 0x58100004, // 0006 LDCONST R4 K4 - 0x7C040600, // 0007 CALL R1 3 - 0x4C040000, // 0008 LDNIL R1 - 0x90020A01, // 0009 SETMBR R0 K5 R1 - 0x8C040106, // 000A GETMET R1 R0 K6 - 0x7C040200, // 000B CALL R1 1 - 0x4C040000, // 000C LDNIL R1 - 0x90020E01, // 000D SETMBR R0 K7 R1 - 0x4C040000, // 000E LDNIL R1 - 0x90021001, // 000F SETMBR R0 K8 R1 - 0x4C040000, // 0010 LDNIL R1 - 0x90021201, // 0011 SETMBR R0 K9 R1 - 0x4C040000, // 0012 LDNIL R1 - 0x90021401, // 0013 SETMBR R0 K10 R1 - 0x4C040000, // 0014 LDNIL R1 - 0x90021601, // 0015 SETMBR R0 K11 R1 - 0x4C040000, // 0016 LDNIL R1 - 0x90021801, // 0017 SETMBR R0 K12 R1 - 0x80000000, // 0018 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: _trigger_read_sensors -********************************************************************/ -be_local_closure(Matter_Device__trigger_read_sensors, /* name */ - be_nested_proto( - 8, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[11]) { /* constants */ - /* K0 */ be_nested_str_weak(json), - /* K1 */ be_nested_str_weak(tasmota), - /* K2 */ be_nested_str_weak(read_sensors), - /* K3 */ be_nested_str_weak(load), - /* K4 */ be_const_int(0), - /* K5 */ be_nested_str_weak(plugins), - /* K6 */ be_nested_str_weak(parse_sensors), - /* K7 */ be_const_int(1), - /* K8 */ be_nested_str_weak(log), - /* K9 */ be_nested_str_weak(MTR_X3A_X20unable_X20to_X20parse_X20read_sensors_X3A_X20), - /* K10 */ be_const_int(3), - }), - be_str_weak(_trigger_read_sensors), - &be_const_str_solidified, - ( &(const binstruction[37]) { /* code */ + ( &(const binstruction[102]) { /* code */ 0xA4060000, // 0000 IMPORT R1 K0 - 0xB80A0200, // 0001 GETNGBL R2 K1 - 0x8C080502, // 0002 GETMET R2 R2 K2 - 0x7C080200, // 0003 CALL R2 1 - 0x4C0C0000, // 0004 LDNIL R3 - 0x1C0C0403, // 0005 EQ R3 R2 R3 - 0x780E0000, // 0006 JMPF R3 #0008 - 0x80000600, // 0007 RET 0 - 0x8C0C0303, // 0008 GETMET R3 R1 K3 - 0x5C140400, // 0009 MOVE R5 R2 - 0x7C0C0400, // 000A CALL R3 2 - 0x4C100000, // 000B LDNIL R4 - 0x20100604, // 000C NE R4 R3 R4 - 0x7812000D, // 000D JMPF R4 #001C - 0x58100004, // 000E LDCONST R4 K4 - 0x6014000C, // 000F GETGBL R5 G12 - 0x88180105, // 0010 GETMBR R6 R0 K5 - 0x7C140200, // 0011 CALL R5 1 - 0x14140805, // 0012 LT R5 R4 R5 - 0x78160006, // 0013 JMPF R5 #001B - 0x88140105, // 0014 GETMBR R5 R0 K5 - 0x94140A04, // 0015 GETIDX R5 R5 R4 - 0x8C140B06, // 0016 GETMET R5 R5 K6 - 0x5C1C0600, // 0017 MOVE R7 R3 - 0x7C140400, // 0018 CALL R5 2 - 0x00100907, // 0019 ADD R4 R4 K7 - 0x7001FFF3, // 001A JMP #000F - 0x70020007, // 001B JMP #0024 - 0xB8120200, // 001C GETNGBL R4 K1 - 0x8C100908, // 001D GETMET R4 R4 K8 - 0x60180008, // 001E GETGBL R6 G8 - 0x5C1C0400, // 001F MOVE R7 R2 - 0x7C180200, // 0020 CALL R6 1 - 0x001A1206, // 0021 ADD R6 K9 R6 - 0x581C000A, // 0022 LDCONST R7 K10 - 0x7C100600, // 0023 CALL R4 3 - 0x80000000, // 0024 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: _init_basic_commissioning -********************************************************************/ -be_local_closure(Matter_Device__init_basic_commissioning, /* name */ - be_nested_proto( - 3, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 4]) { /* constants */ - /* K0 */ be_nested_str_weak(sessions), - /* K1 */ be_nested_str_weak(count_active_fabrics), - /* K2 */ be_const_int(0), - /* K3 */ be_nested_str_weak(start_root_basic_commissioning), - }), - be_str_weak(_init_basic_commissioning), - &be_const_str_solidified, - ( &(const binstruction[ 8]) { /* code */ - 0x88040100, // 0000 GETMBR R1 R0 K0 - 0x8C040301, // 0001 GETMET R1 R1 K1 - 0x7C040200, // 0002 CALL R1 1 - 0x1C040302, // 0003 EQ R1 R1 K2 - 0x78060001, // 0004 JMPF R1 #0007 - 0x8C040103, // 0005 GETMET R1 R0 K3 - 0x7C040200, // 0006 CALL R1 1 - 0x80000000, // 0007 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: compute_qrcode_content -********************************************************************/ -be_local_closure(Matter_Device_compute_qrcode_content, /* name */ - be_nested_proto( - 8, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[12]) { /* constants */ - /* K0 */ be_nested_str_weak(resize), - /* K1 */ be_nested_str_weak(setbits), - /* K2 */ be_const_int(3), - /* K3 */ be_nested_str_weak(vendorid), - /* K4 */ be_nested_str_weak(productid), - /* K5 */ be_nested_str_weak(root_discriminator), - /* K6 */ be_nested_str_weak(root_passcode), - /* K7 */ be_const_int(134217727), - /* K8 */ be_nested_str_weak(MT_X3A), - /* K9 */ be_nested_str_weak(matter), - /* K10 */ be_nested_str_weak(Base38), - /* K11 */ be_nested_str_weak(encode), - }), - be_str_weak(compute_qrcode_content), - &be_const_str_solidified, - ( &(const binstruction[40]) { /* code */ - 0x60040015, // 0000 GETGBL R1 G21 - 0x7C040000, // 0001 CALL R1 0 - 0x8C040300, // 0002 GETMET R1 R1 K0 - 0x540E000A, // 0003 LDINT R3 11 - 0x7C040400, // 0004 CALL R1 2 - 0x8C080301, // 0005 GETMET R2 R1 K1 - 0x58100002, // 0006 LDCONST R4 K2 - 0x5416000F, // 0007 LDINT R5 16 - 0x88180103, // 0008 GETMBR R6 R0 K3 - 0x7C080800, // 0009 CALL R2 4 - 0x8C080301, // 000A GETMET R2 R1 K1 - 0x54120012, // 000B LDINT R4 19 - 0x5416000F, // 000C LDINT R5 16 - 0x88180104, // 000D GETMBR R6 R0 K4 - 0x7C080800, // 000E CALL R2 4 - 0x8C080301, // 000F GETMET R2 R1 K1 - 0x54120024, // 0010 LDINT R4 37 - 0x54160007, // 0011 LDINT R5 8 - 0x541A0003, // 0012 LDINT R6 4 - 0x7C080800, // 0013 CALL R2 4 - 0x8C080301, // 0014 GETMET R2 R1 K1 - 0x5412002C, // 0015 LDINT R4 45 - 0x5416000B, // 0016 LDINT R5 12 - 0x88180105, // 0017 GETMBR R6 R0 K5 - 0x541E0FFE, // 0018 LDINT R7 4095 - 0x2C180C07, // 0019 AND R6 R6 R7 - 0x7C080800, // 001A CALL R2 4 - 0x8C080301, // 001B GETMET R2 R1 K1 - 0x54120038, // 001C LDINT R4 57 - 0x5416001A, // 001D LDINT R5 27 - 0x88180106, // 001E GETMBR R6 R0 K6 - 0x2C180D07, // 001F AND R6 R6 K7 - 0x7C080800, // 0020 CALL R2 4 - 0xB80A1200, // 0021 GETNGBL R2 K9 - 0x8808050A, // 0022 GETMBR R2 R2 K10 - 0x8C08050B, // 0023 GETMET R2 R2 K11 - 0x5C100200, // 0024 MOVE R4 R1 - 0x7C080400, // 0025 CALL R2 2 - 0x000A1002, // 0026 ADD R2 K8 R2 - 0x80040400, // 0027 RET 1 R2 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: get_active_endpoints -********************************************************************/ -be_local_closure(Matter_Device_get_active_endpoints, /* name */ - be_nested_proto( - 9, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 6]) { /* constants */ - /* K0 */ be_nested_str_weak(plugins), - /* K1 */ be_nested_str_weak(get_endpoint), - /* K2 */ be_const_int(0), - /* K3 */ be_nested_str_weak(find), - /* K4 */ be_nested_str_weak(push), - /* K5 */ be_nested_str_weak(stop_iteration), - }), - be_str_weak(get_active_endpoints), - &be_const_str_solidified, - ( &(const binstruction[28]) { /* code */ - 0x60080012, // 0000 GETGBL R2 G18 - 0x7C080000, // 0001 CALL R2 0 - 0x600C0010, // 0002 GETGBL R3 G16 - 0x88100100, // 0003 GETMBR R4 R0 K0 - 0x7C0C0200, // 0004 CALL R3 1 - 0xA8020011, // 0005 EXBLK 0 #0018 - 0x5C100600, // 0006 MOVE R4 R3 - 0x7C100000, // 0007 CALL R4 0 - 0x8C140901, // 0008 GETMET R5 R4 K1 - 0x7C140200, // 0009 CALL R5 1 - 0x78060002, // 000A JMPF R1 #000E - 0x1C180B02, // 000B EQ R6 R5 K2 - 0x781A0000, // 000C JMPF R6 #000E - 0x7001FFF7, // 000D JMP #0006 - 0x8C180503, // 000E GETMET R6 R2 K3 - 0x5C200A00, // 000F MOVE R8 R5 - 0x7C180400, // 0010 CALL R6 2 - 0x4C1C0000, // 0011 LDNIL R7 - 0x1C180C07, // 0012 EQ R6 R6 R7 - 0x781A0002, // 0013 JMPF R6 #0017 - 0x8C180504, // 0014 GETMET R6 R2 K4 - 0x5C200A00, // 0015 MOVE R8 R5 - 0x7C180400, // 0016 CALL R6 2 - 0x7001FFED, // 0017 JMP #0006 - 0x580C0005, // 0018 LDCONST R3 K5 - 0xAC0C0200, // 0019 CATCH R3 1 0 - 0xB0080000, // 001A RAISE 2 R0 R0 - 0x80040400, // 001B RET 1 R2 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: attribute_updated -********************************************************************/ -be_local_closure(Matter_Device_attribute_updated, /* name */ - be_nested_proto( - 10, /* nstack */ - 5, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 9]) { /* constants */ - /* K0 */ be_nested_str_weak(matter), - /* K1 */ be_nested_str_weak(Path), - /* K2 */ be_nested_str_weak(endpoint), - /* K3 */ be_nested_str_weak(cluster), - /* K4 */ be_nested_str_weak(attribute), - /* K5 */ be_nested_str_weak(message_handler), - /* K6 */ be_nested_str_weak(im), - /* K7 */ be_nested_str_weak(subs_shop), - /* K8 */ be_nested_str_weak(attribute_updated_ctx), - }), - be_str_weak(attribute_updated), - &be_const_str_solidified, - ( &(const binstruction[18]) { /* code */ - 0x4C140000, // 0000 LDNIL R5 - 0x1C140805, // 0001 EQ R5 R4 R5 - 0x78160000, // 0002 JMPF R5 #0004 - 0x50100000, // 0003 LDBOOL R4 0 0 - 0xB8160000, // 0004 GETNGBL R5 K0 - 0x8C140B01, // 0005 GETMET R5 R5 K1 - 0x7C140200, // 0006 CALL R5 1 - 0x90160401, // 0007 SETMBR R5 K2 R1 - 0x90160602, // 0008 SETMBR R5 K3 R2 - 0x90160803, // 0009 SETMBR R5 K4 R3 - 0x88180105, // 000A GETMBR R6 R0 K5 - 0x88180D06, // 000B GETMBR R6 R6 K6 - 0x88180D07, // 000C GETMBR R6 R6 K7 - 0x8C180D08, // 000D GETMET R6 R6 K8 - 0x5C200A00, // 000E MOVE R8 R5 - 0x5C240800, // 000F MOVE R9 R4 - 0x7C180600, // 0010 CALL R6 3 - 0x80000000, // 0011 RET 0 + 0xA40A0200, // 0001 IMPORT R2 K1 + 0xB80E0400, // 0002 GETNGBL R3 K2 + 0x8C0C0703, // 0003 GETMET R3 R3 K3 + 0xB8160800, // 0004 GETNGBL R5 K4 + 0x88140B05, // 0005 GETMBR R5 R5 K5 + 0x7C0C0400, // 0006 CALL R3 2 + 0x740E0004, // 0007 JMPT R3 #000D + 0xB80E0800, // 0008 GETNGBL R3 K4 + 0x8C0C0706, // 0009 GETMET R3 R3 K6 + 0x5C140000, // 000A MOVE R5 R0 + 0x7C0C0400, // 000B CALL R3 2 + 0x80000600, // 000C RET 0 + 0x500C0000, // 000D LDBOOL R3 0 0 + 0x90020E03, // 000E SETMBR R0 K7 R3 + 0x90021109, // 000F SETMBR R0 K8 K9 + 0x600C0012, // 0010 GETGBL R3 G18 + 0x7C0C0000, // 0011 CALL R3 0 + 0x90021403, // 0012 SETMBR R0 K10 R3 + 0x500C0000, // 0013 LDBOOL R3 0 0 + 0x90021603, // 0014 SETMBR R0 K11 R3 + 0x600C0013, // 0015 GETGBL R3 G19 + 0x7C0C0000, // 0016 CALL R3 0 + 0x90021803, // 0017 SETMBR R0 K12 R3 + 0x8C0C010D, // 0018 GETMET R3 R0 K13 + 0x7C0C0200, // 0019 CALL R3 1 + 0x880C010F, // 001A GETMBR R3 R0 K15 + 0x90021C03, // 001B SETMBR R0 K14 R3 + 0x880C0111, // 001C GETMBR R3 R0 K17 + 0x90022003, // 001D SETMBR R0 K16 R3 + 0x880C0113, // 001E GETMBR R3 R0 K19 + 0x90022403, // 001F SETMBR R0 K18 R3 + 0x8C0C0315, // 0020 GETMET R3 R1 K21 + 0x5416000F, // 0021 LDINT R5 16 + 0x7C0C0400, // 0022 CALL R3 2 + 0x90022803, // 0023 SETMBR R0 K20 R3 + 0x500C0000, // 0024 LDBOOL R3 0 0 + 0x90022C03, // 0025 SETMBR R0 K22 R3 + 0x8C0C0117, // 0026 GETMET R3 R0 K23 + 0x7C0C0200, // 0027 CALL R3 1 + 0xB80E0800, // 0028 GETNGBL R3 K4 + 0x8C0C0719, // 0029 GETMET R3 R3 K25 + 0x5C140000, // 002A MOVE R5 R0 + 0x7C0C0400, // 002B CALL R3 2 + 0x90023003, // 002C SETMBR R0 K24 R3 + 0x880C0118, // 002D GETMBR R3 R0 K24 + 0x8C0C071A, // 002E GETMET R3 R3 K26 + 0x7C0C0200, // 002F CALL R3 1 + 0xB80E0800, // 0030 GETNGBL R3 K4 + 0x8C0C071C, // 0031 GETMET R3 R3 K28 + 0x5C140000, // 0032 MOVE R5 R0 + 0x7C0C0400, // 0033 CALL R3 2 + 0x90023603, // 0034 SETMBR R0 K27 R3 + 0xB80E0800, // 0035 GETNGBL R3 K4 + 0x8C0C0706, // 0036 GETMET R3 R3 K6 + 0x5C140000, // 0037 MOVE R5 R0 + 0x7C0C0400, // 0038 CALL R3 2 + 0x90023A03, // 0039 SETMBR R0 K29 R3 + 0xB80E0400, // 003A GETNGBL R3 K2 + 0x8C0C071E, // 003B GETMET R3 R3 K30 + 0x7C0C0200, // 003C CALL R3 1 + 0x940C071F, // 003D GETIDX R3 R3 K31 + 0x740E0004, // 003E JMPT R3 #0044 + 0xB80E0400, // 003F GETNGBL R3 K2 + 0x8C0C0720, // 0040 GETMET R3 R3 K32 + 0x7C0C0200, // 0041 CALL R3 1 + 0x940C071F, // 0042 GETIDX R3 R3 K31 + 0x780E0001, // 0043 JMPF R3 #0046 + 0x8C0C0121, // 0044 GETMET R3 R0 K33 + 0x7C0C0200, // 0045 CALL R3 1 + 0xB80E0400, // 0046 GETNGBL R3 K2 + 0x8C0C071E, // 0047 GETMET R3 R3 K30 + 0x7C0C0200, // 0048 CALL R3 1 + 0x940C071F, // 0049 GETIDX R3 R3 K31 + 0x740E0005, // 004A JMPT R3 #0051 + 0xB80E0400, // 004B GETNGBL R3 K2 + 0x8C0C0722, // 004C GETMET R3 R3 K34 + 0x58140023, // 004D LDCONST R5 K35 + 0x84180000, // 004E CLOSURE R6 P0 + 0x581C0024, // 004F LDCONST R7 K36 + 0x7C0C0800, // 0050 CALL R3 4 + 0xB80E0400, // 0051 GETNGBL R3 K2 + 0x8C0C0720, // 0052 GETMET R3 R3 K32 + 0x7C0C0200, // 0053 CALL R3 1 + 0x940C071F, // 0054 GETIDX R3 R3 K31 + 0x740E0005, // 0055 JMPT R3 #005C + 0xB80E0400, // 0056 GETNGBL R3 K2 + 0x8C0C0722, // 0057 GETMET R3 R3 K34 + 0x58140025, // 0058 LDCONST R5 K37 + 0x84180001, // 0059 CLOSURE R6 P1 + 0x581C0024, // 005A LDCONST R7 K36 + 0x7C0C0800, // 005B CALL R3 4 + 0x8C0C0126, // 005C GETMET R3 R0 K38 + 0x7C0C0200, // 005D CALL R3 1 + 0xB80E0400, // 005E GETNGBL R3 K2 + 0x8C0C0727, // 005F GETMET R3 R3 K39 + 0x5C140000, // 0060 MOVE R5 R0 + 0x7C0C0400, // 0061 CALL R3 2 + 0x8C0C0128, // 0062 GETMET R3 R0 K40 + 0x7C0C0200, // 0063 CALL R3 1 + 0xA0000000, // 0064 CLOSE R0 + 0x80000000, // 0065 RET 0 }) ) ); @@ -1195,81 +3083,44 @@ be_local_closure(Matter_Device_event_fabrics_saved, /* name */ /******************************************************************** -** Solidified function: sort_distinct +** Solidified function: every_250ms ********************************************************************/ -be_local_closure(Matter_Device_sort_distinct, /* name */ +be_local_closure(Matter_Device_every_250ms, /* name */ be_nested_proto( - 7, /* nstack */ + 4, /* nstack */ 1, /* argc */ - 4, /* varg */ + 2, /* varg */ 0, /* has upvals */ NULL, /* no upvals */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ ( &(const bvalue[ 5]) { /* constants */ - /* K0 */ be_const_class(be_class_Matter_Device), - /* K1 */ be_const_int(1), + /* K0 */ be_nested_str_weak(message_handler), + /* K1 */ be_nested_str_weak(every_250ms), /* K2 */ be_const_int(0), - /* K3 */ be_nested_str_weak(stop_iteration), - /* K4 */ be_nested_str_weak(remove), + /* K3 */ be_nested_str_weak(plugins), + /* K4 */ be_const_int(1), }), - be_str_weak(sort_distinct), + be_str_weak(every_250ms), &be_const_str_solidified, - ( &(const binstruction[53]) { /* code */ - 0x58040000, // 0000 LDCONST R1 K0 - 0x60080010, // 0001 GETGBL R2 G16 - 0x600C000C, // 0002 GETGBL R3 G12 - 0x5C100000, // 0003 MOVE R4 R0 - 0x7C0C0200, // 0004 CALL R3 1 - 0x040C0701, // 0005 SUB R3 R3 K1 - 0x400E0203, // 0006 CONNECT R3 K1 R3 - 0x7C080200, // 0007 CALL R2 1 - 0xA8020010, // 0008 EXBLK 0 #001A - 0x5C0C0400, // 0009 MOVE R3 R2 - 0x7C0C0000, // 000A CALL R3 0 - 0x94100003, // 000B GETIDX R4 R0 R3 - 0x5C140600, // 000C MOVE R5 R3 - 0x24180B02, // 000D GT R6 R5 K2 - 0x781A0008, // 000E JMPF R6 #0018 - 0x04180B01, // 000F SUB R6 R5 K1 - 0x94180006, // 0010 GETIDX R6 R0 R6 - 0x24180C04, // 0011 GT R6 R6 R4 - 0x781A0004, // 0012 JMPF R6 #0018 - 0x04180B01, // 0013 SUB R6 R5 K1 - 0x94180006, // 0014 GETIDX R6 R0 R6 - 0x98000A06, // 0015 SETIDX R0 R5 R6 - 0x04140B01, // 0016 SUB R5 R5 K1 - 0x7001FFF4, // 0017 JMP #000D - 0x98000A04, // 0018 SETIDX R0 R5 R4 - 0x7001FFEE, // 0019 JMP #0009 - 0x58080003, // 001A LDCONST R2 K3 - 0xAC080200, // 001B CATCH R2 1 0 - 0xB0080000, // 001C RAISE 2 R0 R0 - 0x58080001, // 001D LDCONST R2 K1 - 0x600C000C, // 001E GETGBL R3 G12 - 0x5C100000, // 001F MOVE R4 R0 - 0x7C0C0200, // 0020 CALL R3 1 - 0x180C0701, // 0021 LE R3 R3 K1 - 0x780E0000, // 0022 JMPF R3 #0024 - 0x80040000, // 0023 RET 1 R0 - 0x940C0102, // 0024 GETIDX R3 R0 K2 - 0x6010000C, // 0025 GETGBL R4 G12 - 0x5C140000, // 0026 MOVE R5 R0 - 0x7C100200, // 0027 CALL R4 1 - 0x14100404, // 0028 LT R4 R2 R4 - 0x78120009, // 0029 JMPF R4 #0034 - 0x94100002, // 002A GETIDX R4 R0 R2 - 0x1C100803, // 002B EQ R4 R4 R3 - 0x78120003, // 002C JMPF R4 #0031 - 0x8C100104, // 002D GETMET R4 R0 K4 - 0x5C180400, // 002E MOVE R6 R2 - 0x7C100400, // 002F CALL R4 2 - 0x70020001, // 0030 JMP #0033 - 0x940C0002, // 0031 GETIDX R3 R0 R2 - 0x00080501, // 0032 ADD R2 R2 K1 - 0x7001FFF0, // 0033 JMP #0025 - 0x80040000, // 0034 RET 1 R0 + ( &(const binstruction[16]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x8C040301, // 0001 GETMET R1 R1 K1 + 0x7C040200, // 0002 CALL R1 1 + 0x58040002, // 0003 LDCONST R1 K2 + 0x6008000C, // 0004 GETGBL R2 G12 + 0x880C0103, // 0005 GETMBR R3 R0 K3 + 0x7C080200, // 0006 CALL R2 1 + 0x14080202, // 0007 LT R2 R1 R2 + 0x780A0005, // 0008 JMPF R2 #000F + 0x88080103, // 0009 GETMBR R2 R0 K3 + 0x94080401, // 000A GETIDX R2 R2 R1 + 0x8C080501, // 000B GETMET R2 R2 K1 + 0x7C080200, // 000C CALL R2 1 + 0x00040304, // 000D ADD R1 R1 K4 + 0x7001FFF4, // 000E JMP #0004 + 0x80000000, // 000F RET 0 }) ) ); @@ -1277,81 +3128,30 @@ be_local_closure(Matter_Device_sort_distinct, /* name */ /******************************************************************** -** Solidified function: k2l_num +** Solidified function: msg_send ********************************************************************/ -be_local_closure(Matter_Device_k2l_num, /* name */ +be_local_closure(Matter_Device_msg_send, /* name */ be_nested_proto( - 9, /* nstack */ - 1, /* argc */ - 4, /* varg */ + 5, /* nstack */ + 2, /* argc */ + 2, /* varg */ 0, /* has upvals */ NULL, /* no upvals */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[ 6]) { /* constants */ - /* K0 */ be_const_class(be_class_Matter_Device), - /* K1 */ be_nested_str_weak(keys), - /* K2 */ be_nested_str_weak(push), - /* K3 */ be_nested_str_weak(stop_iteration), - /* K4 */ be_const_int(1), - /* K5 */ be_const_int(0), + ( &(const bvalue[ 2]) { /* constants */ + /* K0 */ be_nested_str_weak(udp_server), + /* K1 */ be_nested_str_weak(send_UDP), }), - be_str_weak(k2l_num), + be_str_weak(msg_send), &be_const_str_solidified, - ( &(const binstruction[52]) { /* code */ - 0x58040000, // 0000 LDCONST R1 K0 - 0x60080012, // 0001 GETGBL R2 G18 - 0x7C080000, // 0002 CALL R2 0 - 0x4C0C0000, // 0003 LDNIL R3 - 0x1C0C0003, // 0004 EQ R3 R0 R3 - 0x780E0000, // 0005 JMPF R3 #0007 - 0x80040400, // 0006 RET 1 R2 - 0x600C0010, // 0007 GETGBL R3 G16 - 0x8C100101, // 0008 GETMET R4 R0 K1 - 0x7C100200, // 0009 CALL R4 1 - 0x7C0C0200, // 000A CALL R3 1 - 0xA8020007, // 000B EXBLK 0 #0014 - 0x5C100600, // 000C MOVE R4 R3 - 0x7C100000, // 000D CALL R4 0 - 0x8C140502, // 000E GETMET R5 R2 K2 - 0x601C0009, // 000F GETGBL R7 G9 - 0x5C200800, // 0010 MOVE R8 R4 - 0x7C1C0200, // 0011 CALL R7 1 - 0x7C140400, // 0012 CALL R5 2 - 0x7001FFF7, // 0013 JMP #000C - 0x580C0003, // 0014 LDCONST R3 K3 - 0xAC0C0200, // 0015 CATCH R3 1 0 - 0xB0080000, // 0016 RAISE 2 R0 R0 - 0x600C0010, // 0017 GETGBL R3 G16 - 0x6010000C, // 0018 GETGBL R4 G12 - 0x5C140400, // 0019 MOVE R5 R2 - 0x7C100200, // 001A CALL R4 1 - 0x04100904, // 001B SUB R4 R4 K4 - 0x40120804, // 001C CONNECT R4 K4 R4 - 0x7C0C0200, // 001D CALL R3 1 - 0xA8020010, // 001E EXBLK 0 #0030 - 0x5C100600, // 001F MOVE R4 R3 - 0x7C100000, // 0020 CALL R4 0 - 0x94140404, // 0021 GETIDX R5 R2 R4 - 0x5C180800, // 0022 MOVE R6 R4 - 0x241C0D05, // 0023 GT R7 R6 K5 - 0x781E0008, // 0024 JMPF R7 #002E - 0x041C0D04, // 0025 SUB R7 R6 K4 - 0x941C0407, // 0026 GETIDX R7 R2 R7 - 0x241C0E05, // 0027 GT R7 R7 R5 - 0x781E0004, // 0028 JMPF R7 #002E - 0x041C0D04, // 0029 SUB R7 R6 K4 - 0x941C0407, // 002A GETIDX R7 R2 R7 - 0x98080C07, // 002B SETIDX R2 R6 R7 - 0x04180D04, // 002C SUB R6 R6 K4 - 0x7001FFF4, // 002D JMP #0023 - 0x98080C05, // 002E SETIDX R2 R6 R5 - 0x7001FFEE, // 002F JMP #001F - 0x580C0003, // 0030 LDCONST R3 K3 - 0xAC0C0200, // 0031 CATCH R3 1 0 - 0xB0080000, // 0032 RAISE 2 R0 R0 - 0x80040400, // 0033 RET 1 R2 + ( &(const binstruction[ 5]) { /* code */ + 0x88080100, // 0000 GETMBR R2 R0 K0 + 0x8C080501, // 0001 GETMET R2 R2 K1 + 0x5C100200, // 0002 MOVE R4 R1 + 0x7C080400, // 0003 CALL R2 2 + 0x80040400, // 0004 RET 1 R2 }) ) ); @@ -1534,47 +3334,328 @@ be_local_closure(Matter_Device_mdns_announce_op_discovery, /* name */ /******************************************************************** -** Solidified function: every_second +** Solidified function: process_attribute_expansion ********************************************************************/ -be_local_closure(Matter_Device_every_second, /* name */ +be_local_closure(Matter_Device_process_attribute_expansion, /* name */ be_nested_proto( - 4, /* nstack */ - 1, /* argc */ + 29, /* nstack */ + 3, /* argc */ 2, /* varg */ 0, /* has upvals */ NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 6]) { /* constants */ - /* K0 */ be_nested_str_weak(sessions), - /* K1 */ be_nested_str_weak(every_second), - /* K2 */ be_nested_str_weak(message_handler), - /* K3 */ be_nested_str_weak(commissioning_open), - /* K4 */ be_nested_str_weak(tasmota), - /* K5 */ be_nested_str_weak(time_reached), + 1, /* has sup protos */ + ( &(const struct bproto*[ 1]) { + be_nested_proto( + 7, /* nstack */ + 1, /* argc */ + 0, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 5]) { /* constants */ + /* K0 */ be_nested_str_weak(keys), + /* K1 */ be_nested_str_weak(push), + /* K2 */ be_nested_str_weak(stop_iteration), + /* K3 */ be_const_int(1), + /* K4 */ be_const_int(0), + }), + be_str_weak(keys_sorted), + &be_const_str_solidified, + ( &(const binstruction[45]) { /* code */ + 0x60040012, // 0000 GETGBL R1 G18 + 0x7C040000, // 0001 CALL R1 0 + 0x60080010, // 0002 GETGBL R2 G16 + 0x8C0C0100, // 0003 GETMET R3 R0 K0 + 0x7C0C0200, // 0004 CALL R3 1 + 0x7C080200, // 0005 CALL R2 1 + 0xA8020005, // 0006 EXBLK 0 #000D + 0x5C0C0400, // 0007 MOVE R3 R2 + 0x7C0C0000, // 0008 CALL R3 0 + 0x8C100301, // 0009 GETMET R4 R1 K1 + 0x5C180600, // 000A MOVE R6 R3 + 0x7C100400, // 000B CALL R4 2 + 0x7001FFF9, // 000C JMP #0007 + 0x58080002, // 000D LDCONST R2 K2 + 0xAC080200, // 000E CATCH R2 1 0 + 0xB0080000, // 000F RAISE 2 R0 R0 + 0x60080010, // 0010 GETGBL R2 G16 + 0x600C000C, // 0011 GETGBL R3 G12 + 0x5C100200, // 0012 MOVE R4 R1 + 0x7C0C0200, // 0013 CALL R3 1 + 0x040C0703, // 0014 SUB R3 R3 K3 + 0x400E0603, // 0015 CONNECT R3 K3 R3 + 0x7C080200, // 0016 CALL R2 1 + 0xA8020010, // 0017 EXBLK 0 #0029 + 0x5C0C0400, // 0018 MOVE R3 R2 + 0x7C0C0000, // 0019 CALL R3 0 + 0x94100203, // 001A GETIDX R4 R1 R3 + 0x5C140600, // 001B MOVE R5 R3 + 0x24180B04, // 001C GT R6 R5 K4 + 0x781A0008, // 001D JMPF R6 #0027 + 0x04180B03, // 001E SUB R6 R5 K3 + 0x94180206, // 001F GETIDX R6 R1 R6 + 0x24180C04, // 0020 GT R6 R6 R4 + 0x781A0004, // 0021 JMPF R6 #0027 + 0x04180B03, // 0022 SUB R6 R5 K3 + 0x94180206, // 0023 GETIDX R6 R1 R6 + 0x98040A06, // 0024 SETIDX R1 R5 R6 + 0x04140B03, // 0025 SUB R5 R5 K3 + 0x7001FFF4, // 0026 JMP #001C + 0x98040A04, // 0027 SETIDX R1 R5 R4 + 0x7001FFEE, // 0028 JMP #0018 + 0x58080002, // 0029 LDCONST R2 K2 + 0xAC080200, // 002A CATCH R2 1 0 + 0xB0080000, // 002B RAISE 2 R0 R0 + 0x80040200, // 002C RET 1 R1 + }) + ), }), - be_str_weak(every_second), + 1, /* has constants */ + ( &(const bvalue[22]) { /* constants */ + /* K0 */ be_nested_str_weak(string), + /* K1 */ be_nested_str_weak(endpoint), + /* K2 */ be_nested_str_weak(cluster), + /* K3 */ be_nested_str_weak(attribute), + /* K4 */ be_nested_str_weak(plugins), + /* K5 */ be_nested_str_weak(get_endpoint), + /* K6 */ be_nested_str_weak(contains), + /* K7 */ be_nested_str_weak(get_cluster_list), + /* K8 */ be_nested_str_weak(get_attribute_list), + /* K9 */ be_nested_str_weak(push), + /* K10 */ be_nested_str_weak(stop_iteration), + /* K11 */ be_nested_str_weak(tasmota), + /* K12 */ be_nested_str_weak(log), + /* K13 */ be_nested_str_weak(format), + /* K14 */ be_nested_str_weak(MTR_X3A_X20expansion_X20_X5B_X2502X_X5D_X2504X_X2F_X2504X), + /* K15 */ be_const_int(3), + /* K16 */ be_nested_str_weak(status), + /* K17 */ be_nested_str_weak(matter), + /* K18 */ be_nested_str_weak(UNSUPPORTED_ENDPOINT), + /* K19 */ be_nested_str_weak(UNSUPPORTED_CLUSTER), + /* K20 */ be_nested_str_weak(UNSUPPORTED_ATTRIBUTE), + /* K21 */ be_nested_str_weak(UNREPORTABLE_ATTRIBUTE), + }), + be_str_weak(process_attribute_expansion), &be_const_str_solidified, - ( &(const binstruction[18]) { /* code */ - 0x88040100, // 0000 GETMBR R1 R0 K0 - 0x8C040301, // 0001 GETMET R1 R1 K1 - 0x7C040200, // 0002 CALL R1 1 - 0x88040102, // 0003 GETMBR R1 R0 K2 - 0x8C040301, // 0004 GETMET R1 R1 K1 - 0x7C040200, // 0005 CALL R1 1 - 0x88040103, // 0006 GETMBR R1 R0 K3 - 0x4C080000, // 0007 LDNIL R2 - 0x20040202, // 0008 NE R1 R1 R2 - 0x78060006, // 0009 JMPF R1 #0011 - 0xB8060800, // 000A GETNGBL R1 K4 - 0x8C040305, // 000B GETMET R1 R1 K5 - 0x880C0103, // 000C GETMBR R3 R0 K3 - 0x7C040400, // 000D CALL R1 2 - 0x78060001, // 000E JMPF R1 #0011 - 0x4C040000, // 000F LDNIL R1 - 0x90020601, // 0010 SETMBR R0 K3 R1 - 0x80000000, // 0011 RET 0 + ( &(const binstruction[216]) { /* code */ + 0x840C0000, // 0000 CLOSURE R3 P0 + 0xA4120000, // 0001 IMPORT R4 K0 + 0x88140301, // 0002 GETMBR R5 R1 K1 + 0x50180000, // 0003 LDBOOL R6 0 0 + 0x881C0302, // 0004 GETMBR R7 R1 K2 + 0x50200000, // 0005 LDBOOL R8 0 0 + 0x88240303, // 0006 GETMBR R9 R1 K3 + 0x50280000, // 0007 LDBOOL R10 0 0 + 0x882C0301, // 0008 GETMBR R11 R1 K1 + 0x4C300000, // 0009 LDNIL R12 + 0x202C160C, // 000A NE R11 R11 R12 + 0x782E0007, // 000B JMPF R11 #0014 + 0x882C0302, // 000C GETMBR R11 R1 K2 + 0x4C300000, // 000D LDNIL R12 + 0x202C160C, // 000E NE R11 R11 R12 + 0x782E0003, // 000F JMPF R11 #0014 + 0x882C0303, // 0010 GETMBR R11 R1 K3 + 0x4C300000, // 0011 LDNIL R12 + 0x202C160C, // 0012 NE R11 R11 R12 + 0x742E0000, // 0013 JMPT R11 #0015 + 0x502C0001, // 0014 LDBOOL R11 0 1 + 0x502C0200, // 0015 LDBOOL R11 1 0 + 0x60300013, // 0016 GETGBL R12 G19 + 0x7C300000, // 0017 CALL R12 0 + 0x60340010, // 0018 GETGBL R13 G16 + 0x88380104, // 0019 GETMBR R14 R0 K4 + 0x7C340200, // 001A CALL R13 1 + 0xA8020055, // 001B EXBLK 0 #0072 + 0x5C381A00, // 001C MOVE R14 R13 + 0x7C380000, // 001D CALL R14 0 + 0x8C3C1D05, // 001E GETMET R15 R14 K5 + 0x7C3C0200, // 001F CALL R15 1 + 0x4C400000, // 0020 LDNIL R16 + 0x20400A10, // 0021 NE R16 R5 R16 + 0x78420002, // 0022 JMPF R16 #0026 + 0x20401E05, // 0023 NE R16 R15 R5 + 0x78420000, // 0024 JMPF R16 #0026 + 0x7001FFF5, // 0025 JMP #001C + 0x8C401906, // 0026 GETMET R16 R12 K6 + 0x5C481E00, // 0027 MOVE R18 R15 + 0x7C400400, // 0028 CALL R16 2 + 0x74420002, // 0029 JMPT R16 #002D + 0x60400013, // 002A GETGBL R16 G19 + 0x7C400000, // 002B CALL R16 0 + 0x98301E10, // 002C SETIDX R12 R15 R16 + 0x50180200, // 002D LDBOOL R6 1 0 + 0x8C401D07, // 002E GETMET R16 R14 K7 + 0x5C481E00, // 002F MOVE R18 R15 + 0x7C400400, // 0030 CALL R16 2 + 0x60440010, // 0031 GETGBL R17 G16 + 0x5C482000, // 0032 MOVE R18 R16 + 0x7C440200, // 0033 CALL R17 1 + 0xA8020038, // 0034 EXBLK 0 #006E + 0x5C482200, // 0035 MOVE R18 R17 + 0x7C480000, // 0036 CALL R18 0 + 0x4C4C0000, // 0037 LDNIL R19 + 0x204C0E13, // 0038 NE R19 R7 R19 + 0x784E0002, // 0039 JMPF R19 #003D + 0x204C2407, // 003A NE R19 R18 R7 + 0x784E0000, // 003B JMPF R19 #003D + 0x7001FFF7, // 003C JMP #0035 + 0x944C180F, // 003D GETIDX R19 R12 R15 + 0x8C4C2706, // 003E GETMET R19 R19 K6 + 0x5C542400, // 003F MOVE R21 R18 + 0x7C4C0400, // 0040 CALL R19 2 + 0x744E0003, // 0041 JMPT R19 #0046 + 0x944C180F, // 0042 GETIDX R19 R12 R15 + 0x60500013, // 0043 GETGBL R20 G19 + 0x7C500000, // 0044 CALL R20 0 + 0x984C2414, // 0045 SETIDX R19 R18 R20 + 0x50200200, // 0046 LDBOOL R8 1 0 + 0x8C4C1D08, // 0047 GETMET R19 R14 K8 + 0x5C541E00, // 0048 MOVE R21 R15 + 0x5C582400, // 0049 MOVE R22 R18 + 0x7C4C0600, // 004A CALL R19 3 + 0x60500010, // 004B GETGBL R20 G16 + 0x5C542600, // 004C MOVE R21 R19 + 0x7C500200, // 004D CALL R20 1 + 0xA802001A, // 004E EXBLK 0 #006A + 0x5C542800, // 004F MOVE R21 R20 + 0x7C540000, // 0050 CALL R21 0 + 0x4C580000, // 0051 LDNIL R22 + 0x20581216, // 0052 NE R22 R9 R22 + 0x785A0002, // 0053 JMPF R22 #0057 + 0x20582A09, // 0054 NE R22 R21 R9 + 0x785A0000, // 0055 JMPF R22 #0057 + 0x7001FFF7, // 0056 JMP #004F + 0x9458180F, // 0057 GETIDX R22 R12 R15 + 0x94582C12, // 0058 GETIDX R22 R22 R18 + 0x8C582D06, // 0059 GETMET R22 R22 K6 + 0x5C602A00, // 005A MOVE R24 R21 + 0x7C580400, // 005B CALL R22 2 + 0x745A0004, // 005C JMPT R22 #0062 + 0x9458180F, // 005D GETIDX R22 R12 R15 + 0x94582C12, // 005E GETIDX R22 R22 R18 + 0x605C0012, // 005F GETGBL R23 G18 + 0x7C5C0000, // 0060 CALL R23 0 + 0x98582A17, // 0061 SETIDX R22 R21 R23 + 0x50280200, // 0062 LDBOOL R10 1 0 + 0x9458180F, // 0063 GETIDX R22 R12 R15 + 0x94582C12, // 0064 GETIDX R22 R22 R18 + 0x94582C15, // 0065 GETIDX R22 R22 R21 + 0x8C582D09, // 0066 GETMET R22 R22 K9 + 0x5C601C00, // 0067 MOVE R24 R14 + 0x7C580400, // 0068 CALL R22 2 + 0x7001FFE4, // 0069 JMP #004F + 0x5850000A, // 006A LDCONST R20 K10 + 0xAC500200, // 006B CATCH R20 1 0 + 0xB0080000, // 006C RAISE 2 R0 R0 + 0x7001FFC6, // 006D JMP #0035 + 0x5844000A, // 006E LDCONST R17 K10 + 0xAC440200, // 006F CATCH R17 1 0 + 0xB0080000, // 0070 RAISE 2 R0 R0 + 0x7001FFA9, // 0071 JMP #001C + 0x5834000A, // 0072 LDCONST R13 K10 + 0xAC340200, // 0073 CATCH R13 1 0 + 0xB0080000, // 0074 RAISE 2 R0 R0 + 0x60340010, // 0075 GETGBL R13 G16 + 0x5C380600, // 0076 MOVE R14 R3 + 0x5C3C1800, // 0077 MOVE R15 R12 + 0x7C380200, // 0078 CALL R14 1 + 0x7C340200, // 0079 CALL R13 1 + 0xA802003D, // 007A EXBLK 0 #00B9 + 0x5C381A00, // 007B MOVE R14 R13 + 0x7C380000, // 007C CALL R14 0 + 0x603C0010, // 007D GETGBL R15 G16 + 0x5C400600, // 007E MOVE R16 R3 + 0x9444180E, // 007F GETIDX R17 R12 R14 + 0x7C400200, // 0080 CALL R16 1 + 0x7C3C0200, // 0081 CALL R15 1 + 0xA8020031, // 0082 EXBLK 0 #00B5 + 0x5C401E00, // 0083 MOVE R16 R15 + 0x7C400000, // 0084 CALL R16 0 + 0x60440010, // 0085 GETGBL R17 G16 + 0x5C480600, // 0086 MOVE R18 R3 + 0x944C180E, // 0087 GETIDX R19 R12 R14 + 0x944C2610, // 0088 GETIDX R19 R19 R16 + 0x7C480200, // 0089 CALL R18 1 + 0x7C440200, // 008A CALL R17 1 + 0xA8020024, // 008B EXBLK 0 #00B1 + 0x5C482200, // 008C MOVE R18 R17 + 0x7C480000, // 008D CALL R18 0 + 0x604C0010, // 008E GETGBL R19 G16 + 0x9450180E, // 008F GETIDX R20 R12 R14 + 0x94502810, // 0090 GETIDX R20 R20 R16 + 0x94502812, // 0091 GETIDX R20 R20 R18 + 0x7C4C0200, // 0092 CALL R19 1 + 0xA8020018, // 0093 EXBLK 0 #00AD + 0x5C502600, // 0094 MOVE R20 R19 + 0x7C500000, // 0095 CALL R20 0 + 0xB8561600, // 0096 GETNGBL R21 K11 + 0x8C542B0C, // 0097 GETMET R21 R21 K12 + 0x8C5C090D, // 0098 GETMET R23 R4 K13 + 0x5864000E, // 0099 LDCONST R25 K14 + 0x5C681C00, // 009A MOVE R26 R14 + 0x5C6C2000, // 009B MOVE R27 R16 + 0x5C702400, // 009C MOVE R28 R18 + 0x7C5C0A00, // 009D CALL R23 5 + 0x5860000F, // 009E LDCONST R24 K15 + 0x7C540600, // 009F CALL R21 3 + 0x9006020E, // 00A0 SETMBR R1 K1 R14 + 0x90060410, // 00A1 SETMBR R1 K2 R16 + 0x90060612, // 00A2 SETMBR R1 K3 R18 + 0x5C540400, // 00A3 MOVE R21 R2 + 0x5C582800, // 00A4 MOVE R22 R20 + 0x5C5C0200, // 00A5 MOVE R23 R1 + 0x5C601600, // 00A6 MOVE R24 R11 + 0x7C540600, // 00A7 CALL R21 3 + 0x782E0002, // 00A8 JMPF R11 #00AC + 0x78560001, // 00A9 JMPF R21 #00AC + 0xA8040004, // 00AA EXBLK 1 4 + 0x80002C00, // 00AB RET 0 + 0x7001FFE6, // 00AC JMP #0094 + 0x584C000A, // 00AD LDCONST R19 K10 + 0xAC4C0200, // 00AE CATCH R19 1 0 + 0xB0080000, // 00AF RAISE 2 R0 R0 + 0x7001FFDA, // 00B0 JMP #008C + 0x5844000A, // 00B1 LDCONST R17 K10 + 0xAC440200, // 00B2 CATCH R17 1 0 + 0xB0080000, // 00B3 RAISE 2 R0 R0 + 0x7001FFCD, // 00B4 JMP #0083 + 0x583C000A, // 00B5 LDCONST R15 K10 + 0xAC3C0200, // 00B6 CATCH R15 1 0 + 0xB0080000, // 00B7 RAISE 2 R0 R0 + 0x7001FFC1, // 00B8 JMP #007B + 0x5834000A, // 00B9 LDCONST R13 K10 + 0xAC340200, // 00BA CATCH R13 1 0 + 0xB0080000, // 00BB RAISE 2 R0 R0 + 0x782E0019, // 00BC JMPF R11 #00D7 + 0x5C340C00, // 00BD MOVE R13 R6 + 0x74360003, // 00BE JMPT R13 #00C3 + 0xB8362200, // 00BF GETNGBL R13 K17 + 0x88341B12, // 00C0 GETMBR R13 R13 K18 + 0x9006200D, // 00C1 SETMBR R1 K16 R13 + 0x7002000E, // 00C2 JMP #00D2 + 0x5C341000, // 00C3 MOVE R13 R8 + 0x74360003, // 00C4 JMPT R13 #00C9 + 0xB8362200, // 00C5 GETNGBL R13 K17 + 0x88341B13, // 00C6 GETMBR R13 R13 K19 + 0x9006200D, // 00C7 SETMBR R1 K16 R13 + 0x70020008, // 00C8 JMP #00D2 + 0x5C341400, // 00C9 MOVE R13 R10 + 0x74360003, // 00CA JMPT R13 #00CF + 0xB8362200, // 00CB GETNGBL R13 K17 + 0x88341B14, // 00CC GETMBR R13 R13 K20 + 0x9006200D, // 00CD SETMBR R1 K16 R13 + 0x70020002, // 00CE JMP #00D2 + 0xB8362200, // 00CF GETNGBL R13 K17 + 0x88341B15, // 00D0 GETMBR R13 R13 K21 + 0x9006200D, // 00D1 SETMBR R1 K16 R13 + 0x5C340400, // 00D2 MOVE R13 R2 + 0x4C380000, // 00D3 LDNIL R14 + 0x5C3C0200, // 00D4 MOVE R15 R1 + 0x50400200, // 00D5 LDBOOL R16 1 0 + 0x7C340600, // 00D6 CALL R13 3 + 0x80000000, // 00D7 RET 0 }) ) ); @@ -1582,11 +3663,100 @@ be_local_closure(Matter_Device_every_second, /* name */ /******************************************************************** -** Solidified function: get_plugin_class_arg +** Solidified function: is_commissioning_open ********************************************************************/ -be_local_closure(Matter_Device_get_plugin_class_arg, /* name */ +be_local_closure(Matter_Device_is_commissioning_open, /* name */ be_nested_proto( - 5, /* nstack */ + 3, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 1]) { /* constants */ + /* K0 */ be_nested_str_weak(commissioning_open), + }), + be_str_weak(is_commissioning_open), + &be_const_str_solidified, + ( &(const binstruction[ 4]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x4C080000, // 0001 LDNIL R2 + 0x20040202, // 0002 NE R1 R1 R2 + 0x80040200, // 0003 RET 1 R1 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: start_commissioning_complete_deferred +********************************************************************/ +be_local_closure(Matter_Device_start_commissioning_complete_deferred, /* name */ + be_nested_proto( + 6, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 1, /* has sup protos */ + ( &(const struct bproto*[ 1]) { + be_nested_proto( + 3, /* nstack */ + 0, /* argc */ + 0, /* varg */ + 1, /* has upvals */ + ( &(const bupvaldesc[ 2]) { /* upvals */ + be_local_const_upval(1, 0), + be_local_const_upval(1, 1), + }), + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 1]) { /* constants */ + /* K0 */ be_nested_str_weak(start_commissioning_complete), + }), + be_str_weak(_X3Clambda_X3E), + &be_const_str_solidified, + ( &(const binstruction[ 5]) { /* code */ + 0x68000000, // 0000 GETUPV R0 U0 + 0x8C000100, // 0001 GETMET R0 R0 K0 + 0x68080001, // 0002 GETUPV R2 U1 + 0x7C000400, // 0003 CALL R0 2 + 0x80040000, // 0004 RET 1 R0 + }) + ), + }), + 1, /* has constants */ + ( &(const bvalue[ 3]) { /* constants */ + /* K0 */ be_nested_str_weak(tasmota), + /* K1 */ be_nested_str_weak(set_timer), + /* K2 */ be_const_int(0), + }), + be_str_weak(start_commissioning_complete_deferred), + &be_const_str_solidified, + ( &(const binstruction[ 7]) { /* code */ + 0xB80A0000, // 0000 GETNGBL R2 K0 + 0x8C080501, // 0001 GETMET R2 R2 K1 + 0x58100002, // 0002 LDCONST R4 K2 + 0x84140000, // 0003 CLOSURE R5 P0 + 0x7C080600, // 0004 CALL R2 3 + 0xA0000000, // 0005 CLOSE R0 + 0x80000000, // 0006 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: start_operational_discovery +********************************************************************/ +be_local_closure(Matter_Device_start_operational_discovery, /* name */ + be_nested_proto( + 8, /* nstack */ 2, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -1594,24 +3764,31 @@ be_local_closure(Matter_Device_get_plugin_class_arg, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[ 4]) { /* constants */ - /* K0 */ be_nested_str_weak(plugins_classes), - /* K1 */ be_nested_str_weak(find), - /* K2 */ be_nested_str_weak(ARG), - /* K3 */ be_nested_str_weak(), + ( &(const bvalue[ 7]) { /* constants */ + /* K0 */ be_nested_str_weak(crypto), + /* K1 */ be_nested_str_weak(mdns), + /* K2 */ be_nested_str_weak(string), + /* K3 */ be_nested_str_weak(stop_basic_commissioning), + /* K4 */ be_nested_str_weak(root_w0), + /* K5 */ be_nested_str_weak(root_L), + /* K6 */ be_nested_str_weak(mdns_announce_op_discovery), }), - be_str_weak(get_plugin_class_arg), + be_str_weak(start_operational_discovery), &be_const_str_solidified, - ( &(const binstruction[ 9]) { /* code */ - 0x88080100, // 0000 GETMBR R2 R0 K0 - 0x8C080501, // 0001 GETMET R2 R2 K1 - 0x5C100200, // 0002 MOVE R4 R1 - 0x7C080400, // 0003 CALL R2 2 - 0x780A0001, // 0004 JMPF R2 #0007 - 0x880C0502, // 0005 GETMBR R3 R2 K2 - 0x70020000, // 0006 JMP #0008 - 0x580C0003, // 0007 LDCONST R3 K3 - 0x80040600, // 0008 RET 1 R3 + ( &(const binstruction[13]) { /* code */ + 0xA40A0000, // 0000 IMPORT R2 K0 + 0xA40E0200, // 0001 IMPORT R3 K1 + 0xA4120400, // 0002 IMPORT R4 K2 + 0x8C140103, // 0003 GETMET R5 R0 K3 + 0x7C140200, // 0004 CALL R5 1 + 0x4C140000, // 0005 LDNIL R5 + 0x90020805, // 0006 SETMBR R0 K4 R5 + 0x4C140000, // 0007 LDNIL R5 + 0x90020A05, // 0008 SETMBR R0 K5 R5 + 0x8C140106, // 0009 GETMET R5 R0 K6 + 0x5C1C0200, // 000A MOVE R7 R1 + 0x7C140400, // 000B CALL R5 2 + 0x80000000, // 000C RET 0 }) ) ); @@ -1656,11 +3833,89 @@ be_local_closure(Matter_Device_is_root_commissioning_open, /* name */ /******************************************************************** -** Solidified function: mdns_announce_PASE +** Solidified function: register_plugin_class ********************************************************************/ -be_local_closure(Matter_Device_mdns_announce_PASE, /* name */ +be_local_closure(Matter_Device_register_plugin_class, /* name */ be_nested_proto( - 16, /* nstack */ + 7, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 4]) { /* constants */ + /* K0 */ be_nested_str_weak(introspect), + /* K1 */ be_nested_str_weak(get), + /* K2 */ be_nested_str_weak(TYPE), + /* K3 */ be_nested_str_weak(plugins_classes), + }), + be_str_weak(register_plugin_class), + &be_const_str_solidified, + ( &(const binstruction[ 9]) { /* code */ + 0xA40A0000, // 0000 IMPORT R2 K0 + 0x8C0C0501, // 0001 GETMET R3 R2 K1 + 0x5C140200, // 0002 MOVE R5 R1 + 0x58180002, // 0003 LDCONST R6 K2 + 0x7C0C0600, // 0004 CALL R3 3 + 0x780E0001, // 0005 JMPF R3 #0008 + 0x88100103, // 0006 GETMBR R4 R0 K3 + 0x98100601, // 0007 SETIDX R4 R3 R1 + 0x80000000, // 0008 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: MtrJoin +********************************************************************/ +be_local_closure(Matter_Device_MtrJoin, /* name */ + be_nested_proto( + 8, /* nstack */ + 5, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 4]) { /* constants */ + /* K0 */ be_nested_str_weak(start_root_basic_commissioning), + /* K1 */ be_nested_str_weak(stop_basic_commissioning), + /* K2 */ be_nested_str_weak(tasmota), + /* K3 */ be_nested_str_weak(resp_cmnd_done), + }), + be_str_weak(MtrJoin), + &be_const_str_solidified, + ( &(const binstruction[13]) { /* code */ + 0x60140009, // 0000 GETGBL R5 G9 + 0x5C180600, // 0001 MOVE R6 R3 + 0x7C140200, // 0002 CALL R5 1 + 0x78160002, // 0003 JMPF R5 #0007 + 0x8C180100, // 0004 GETMET R6 R0 K0 + 0x7C180200, // 0005 CALL R6 1 + 0x70020001, // 0006 JMP #0009 + 0x8C180101, // 0007 GETMET R6 R0 K1 + 0x7C180200, // 0008 CALL R6 1 + 0xB81A0400, // 0009 GETNGBL R6 K2 + 0x8C180D03, // 000A GETMET R6 R6 K3 + 0x7C180200, // 000B CALL R6 1 + 0x80000000, // 000C RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: autoconf_device +********************************************************************/ +be_local_closure(Matter_Device_autoconf_device, /* name */ + be_nested_proto( + 7, /* nstack */ 1, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -1668,322 +3923,98 @@ be_local_closure(Matter_Device_mdns_announce_PASE, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[44]) { /* constants */ - /* K0 */ be_nested_str_weak(mdns), - /* K1 */ be_nested_str_weak(string), - /* K2 */ be_nested_str_weak(crypto), - /* K3 */ be_nested_str_weak(VP), - /* K4 */ be_nested_str_weak(vendorid), - /* K5 */ be_nested_str_weak(_X2B), - /* K6 */ be_nested_str_weak(productid), - /* K7 */ be_nested_str_weak(D), - /* K8 */ be_nested_str_weak(commissioning_discriminator), - /* K9 */ be_nested_str_weak(CM), - /* K10 */ be_const_int(1), - /* K11 */ be_nested_str_weak(T), - /* K12 */ be_const_int(0), - /* K13 */ be_nested_str_weak(SII), - /* K14 */ be_nested_str_weak(SAI), - /* K15 */ be_nested_str_weak(commissioning_instance_wifi), - /* K16 */ be_nested_str_weak(random), - /* K17 */ be_nested_str_weak(tohex), - /* K18 */ be_nested_str_weak(commissioning_instance_eth), - /* K19 */ be_nested_str_weak(hostname_eth), - /* K20 */ be_nested_str_weak(tasmota), - /* K21 */ be_nested_str_weak(log), - /* K22 */ be_nested_str_weak(format), - /* K23 */ be_nested_str_weak(MTR_X3A_X20calling_X20mdns_X2Eadd_service_X28_X25s_X2C_X20_X25s_X2C_X20_X25i_X2C_X20_X25s_X2C_X20_X25s_X2C_X20_X25s_X29), - /* K24 */ be_nested_str_weak(_matterc), - /* K25 */ be_nested_str_weak(_udp), - /* K26 */ be_const_int(3), - /* K27 */ be_nested_str_weak(add_service), - /* K28 */ be_nested_str_weak(mdns_pase_eth), - /* K29 */ be_nested_str_weak(MTR_X3A_X20announce_X20mDNS_X20on_X20_X25s_X20_X27_X25s_X27_X20ptr_X20to_X20_X60_X25s_X2Elocal_X60), - /* K30 */ be_nested_str_weak(eth), - /* K31 */ be_const_int(2), - /* K32 */ be_nested_str_weak(_L), - /* K33 */ be_nested_str_weak(MTR_X3A_X20adding_X20subtype_X3A_X20), - /* K34 */ be_nested_str_weak(add_subtype), - /* K35 */ be_nested_str_weak(_S), - /* K36 */ be_nested_str_weak(_V), - /* K37 */ be_nested_str_weak(_CM1), - /* K38 */ be_nested_str_weak(hostname_wifi), - /* K39 */ be_nested_str_weak(mdns_pase_wifi), - /* K40 */ be_nested_str_weak(MTR_X3A_X20starting_X20mDNS_X20on_X20_X25s_X20_X27_X25s_X27_X20ptr_X20to_X20_X60_X25s_X2Elocal_X60), - /* K41 */ be_nested_str_weak(wifi), - /* K42 */ be_nested_str_weak(MTR_X3A_X20Exception), - /* K43 */ be_nested_str_weak(_X7C), + ( &(const bvalue[15]) { /* constants */ + /* K0 */ be_nested_str_weak(string), + /* K1 */ be_nested_str_weak(json), + /* K2 */ be_nested_str_weak(plugins), + /* K3 */ be_const_int(0), + /* K4 */ be_nested_str_weak(plugins_config), + /* K5 */ be_nested_str_weak(autoconf_device_map), + /* K6 */ be_nested_str_weak(tasmota), + /* K7 */ be_nested_str_weak(log), + /* K8 */ be_nested_str_weak(MTR_X3A_X20autoconfig_X20_X3D_X20), + /* K9 */ be_const_int(3), + /* K10 */ be_nested_str_weak(_load_plugins_config), + /* K11 */ be_nested_str_weak(plugins_persist), + /* K12 */ be_nested_str_weak(sessions), + /* K13 */ be_nested_str_weak(count_active_fabrics), + /* K14 */ be_nested_str_weak(save_param), }), - be_str_weak(mdns_announce_PASE), + be_str_weak(autoconf_device), &be_const_str_solidified, - ( &(const binstruction[267]) { /* code */ + ( &(const binstruction[34]) { /* code */ 0xA4060000, // 0000 IMPORT R1 K0 0xA40A0200, // 0001 IMPORT R2 K1 - 0xA40E0400, // 0002 IMPORT R3 K2 - 0x60100013, // 0003 GETGBL R4 G19 - 0x7C100000, // 0004 CALL R4 0 - 0x60140008, // 0005 GETGBL R5 G8 - 0x88180104, // 0006 GETMBR R6 R0 K4 - 0x7C140200, // 0007 CALL R5 1 - 0x00140B05, // 0008 ADD R5 R5 K5 - 0x60180008, // 0009 GETGBL R6 G8 - 0x881C0106, // 000A GETMBR R7 R0 K6 - 0x7C180200, // 000B CALL R6 1 - 0x00140A06, // 000C ADD R5 R5 R6 - 0x98120605, // 000D SETIDX R4 K3 R5 - 0x88140108, // 000E GETMBR R5 R0 K8 - 0x98120E05, // 000F SETIDX R4 K7 R5 - 0x9812130A, // 0010 SETIDX R4 K9 K10 - 0x9812170C, // 0011 SETIDX R4 K11 K12 - 0x54161387, // 0012 LDINT R5 5000 - 0x98121A05, // 0013 SETIDX R4 K13 R5 - 0x5416012B, // 0014 LDINT R5 300 - 0x98121C05, // 0015 SETIDX R4 K14 R5 - 0x8C140710, // 0016 GETMET R5 R3 K16 - 0x541E0007, // 0017 LDINT R7 8 - 0x7C140400, // 0018 CALL R5 2 - 0x8C140B11, // 0019 GETMET R5 R5 K17 - 0x7C140200, // 001A CALL R5 1 - 0x90021E05, // 001B SETMBR R0 K15 R5 - 0x8C140710, // 001C GETMET R5 R3 K16 - 0x541E0007, // 001D LDINT R7 8 - 0x7C140400, // 001E CALL R5 2 - 0x8C140B11, // 001F GETMET R5 R5 K17 - 0x7C140200, // 0020 CALL R5 1 - 0x90022405, // 0021 SETMBR R0 K18 R5 - 0xA80200D5, // 0022 EXBLK 0 #00F9 - 0x88140113, // 0023 GETMBR R5 R0 K19 - 0x78160067, // 0024 JMPF R5 #008D - 0xB8162800, // 0025 GETNGBL R5 K20 - 0x8C140B15, // 0026 GETMET R5 R5 K21 - 0x8C1C0516, // 0027 GETMET R7 R2 K22 - 0x58240017, // 0028 LDCONST R9 K23 - 0x58280018, // 0029 LDCONST R10 K24 - 0x582C0019, // 002A LDCONST R11 K25 - 0x543215A3, // 002B LDINT R12 5540 - 0x60340008, // 002C GETGBL R13 G8 - 0x5C380800, // 002D MOVE R14 R4 - 0x7C340200, // 002E CALL R13 1 - 0x88380112, // 002F GETMBR R14 R0 K18 - 0x883C0113, // 0030 GETMBR R15 R0 K19 - 0x7C1C1000, // 0031 CALL R7 8 - 0x5820001A, // 0032 LDCONST R8 K26 - 0x7C140600, // 0033 CALL R5 3 - 0x8C14031B, // 0034 GETMET R5 R1 K27 - 0x581C0018, // 0035 LDCONST R7 K24 - 0x58200019, // 0036 LDCONST R8 K25 - 0x542615A3, // 0037 LDINT R9 5540 - 0x5C280800, // 0038 MOVE R10 R4 - 0x882C0112, // 0039 GETMBR R11 R0 K18 - 0x88300113, // 003A GETMBR R12 R0 K19 - 0x7C140E00, // 003B CALL R5 7 - 0x50140200, // 003C LDBOOL R5 1 0 - 0x90023805, // 003D SETMBR R0 K28 R5 - 0xB8162800, // 003E GETNGBL R5 K20 - 0x8C140B15, // 003F GETMET R5 R5 K21 - 0x8C1C0516, // 0040 GETMET R7 R2 K22 - 0x5824001D, // 0041 LDCONST R9 K29 - 0x5828001E, // 0042 LDCONST R10 K30 - 0x882C0112, // 0043 GETMBR R11 R0 K18 - 0x88300113, // 0044 GETMBR R12 R0 K19 - 0x7C1C0A00, // 0045 CALL R7 5 - 0x5820001F, // 0046 LDCONST R8 K31 - 0x7C140600, // 0047 CALL R5 3 - 0x60140008, // 0048 GETGBL R5 G8 - 0x88180108, // 0049 GETMBR R6 R0 K8 - 0x541E0FFE, // 004A LDINT R7 4095 - 0x2C180C07, // 004B AND R6 R6 R7 - 0x7C140200, // 004C CALL R5 1 - 0x00164005, // 004D ADD R5 K32 R5 - 0xB81A2800, // 004E GETNGBL R6 K20 - 0x8C180D15, // 004F GETMET R6 R6 K21 - 0x00224205, // 0050 ADD R8 K33 R5 - 0x5824001F, // 0051 LDCONST R9 K31 - 0x7C180600, // 0052 CALL R6 3 - 0x8C180322, // 0053 GETMET R6 R1 K34 - 0x58200018, // 0054 LDCONST R8 K24 - 0x58240019, // 0055 LDCONST R9 K25 - 0x88280112, // 0056 GETMBR R10 R0 K18 - 0x882C0113, // 0057 GETMBR R11 R0 K19 - 0x5C300A00, // 0058 MOVE R12 R5 - 0x7C180C00, // 0059 CALL R6 6 - 0x60180008, // 005A GETGBL R6 G8 - 0x881C0108, // 005B GETMBR R7 R0 K8 - 0x54220EFF, // 005C LDINT R8 3840 - 0x2C1C0E08, // 005D AND R7 R7 R8 - 0x54220007, // 005E LDINT R8 8 - 0x3C1C0E08, // 005F SHR R7 R7 R8 - 0x7C180200, // 0060 CALL R6 1 - 0x001A4606, // 0061 ADD R6 K35 R6 - 0x5C140C00, // 0062 MOVE R5 R6 - 0xB81A2800, // 0063 GETNGBL R6 K20 - 0x8C180D15, // 0064 GETMET R6 R6 K21 - 0x00224205, // 0065 ADD R8 K33 R5 - 0x5824001F, // 0066 LDCONST R9 K31 - 0x7C180600, // 0067 CALL R6 3 - 0x8C180322, // 0068 GETMET R6 R1 K34 - 0x58200018, // 0069 LDCONST R8 K24 - 0x58240019, // 006A LDCONST R9 K25 - 0x88280112, // 006B GETMBR R10 R0 K18 - 0x882C0113, // 006C GETMBR R11 R0 K19 - 0x5C300A00, // 006D MOVE R12 R5 - 0x7C180C00, // 006E CALL R6 6 - 0x60180008, // 006F GETGBL R6 G8 - 0x881C0104, // 0070 GETMBR R7 R0 K4 - 0x7C180200, // 0071 CALL R6 1 - 0x001A4806, // 0072 ADD R6 K36 R6 - 0x5C140C00, // 0073 MOVE R5 R6 - 0xB81A2800, // 0074 GETNGBL R6 K20 - 0x8C180D15, // 0075 GETMET R6 R6 K21 - 0x00224205, // 0076 ADD R8 K33 R5 - 0x5824001F, // 0077 LDCONST R9 K31 - 0x7C180600, // 0078 CALL R6 3 - 0x8C180322, // 0079 GETMET R6 R1 K34 - 0x58200018, // 007A LDCONST R8 K24 - 0x58240019, // 007B LDCONST R9 K25 - 0x88280112, // 007C GETMBR R10 R0 K18 - 0x882C0113, // 007D GETMBR R11 R0 K19 - 0x5C300A00, // 007E MOVE R12 R5 - 0x7C180C00, // 007F CALL R6 6 - 0x58140025, // 0080 LDCONST R5 K37 - 0xB81A2800, // 0081 GETNGBL R6 K20 - 0x8C180D15, // 0082 GETMET R6 R6 K21 - 0x00224205, // 0083 ADD R8 K33 R5 - 0x5824001F, // 0084 LDCONST R9 K31 - 0x7C180600, // 0085 CALL R6 3 - 0x8C180322, // 0086 GETMET R6 R1 K34 - 0x58200018, // 0087 LDCONST R8 K24 - 0x58240019, // 0088 LDCONST R9 K25 - 0x88280112, // 0089 GETMBR R10 R0 K18 - 0x882C0113, // 008A GETMBR R11 R0 K19 - 0x5C300A00, // 008B MOVE R12 R5 - 0x7C180C00, // 008C CALL R6 6 - 0x88140126, // 008D GETMBR R5 R0 K38 - 0x78160067, // 008E JMPF R5 #00F7 - 0xB8162800, // 008F GETNGBL R5 K20 - 0x8C140B15, // 0090 GETMET R5 R5 K21 - 0x8C1C0516, // 0091 GETMET R7 R2 K22 - 0x58240017, // 0092 LDCONST R9 K23 - 0x58280018, // 0093 LDCONST R10 K24 - 0x582C0019, // 0094 LDCONST R11 K25 - 0x543215A3, // 0095 LDINT R12 5540 - 0x60340008, // 0096 GETGBL R13 G8 - 0x5C380800, // 0097 MOVE R14 R4 - 0x7C340200, // 0098 CALL R13 1 - 0x8838010F, // 0099 GETMBR R14 R0 K15 - 0x883C0126, // 009A GETMBR R15 R0 K38 - 0x7C1C1000, // 009B CALL R7 8 - 0x5820001A, // 009C LDCONST R8 K26 - 0x7C140600, // 009D CALL R5 3 - 0x8C14031B, // 009E GETMET R5 R1 K27 - 0x581C0018, // 009F LDCONST R7 K24 - 0x58200019, // 00A0 LDCONST R8 K25 - 0x542615A3, // 00A1 LDINT R9 5540 - 0x5C280800, // 00A2 MOVE R10 R4 - 0x882C010F, // 00A3 GETMBR R11 R0 K15 - 0x88300126, // 00A4 GETMBR R12 R0 K38 - 0x7C140E00, // 00A5 CALL R5 7 - 0x50140200, // 00A6 LDBOOL R5 1 0 - 0x90024E05, // 00A7 SETMBR R0 K39 R5 - 0xB8162800, // 00A8 GETNGBL R5 K20 - 0x8C140B15, // 00A9 GETMET R5 R5 K21 - 0x8C1C0516, // 00AA GETMET R7 R2 K22 - 0x58240028, // 00AB LDCONST R9 K40 - 0x58280029, // 00AC LDCONST R10 K41 - 0x882C010F, // 00AD GETMBR R11 R0 K15 - 0x88300126, // 00AE GETMBR R12 R0 K38 - 0x7C1C0A00, // 00AF CALL R7 5 - 0x5820001F, // 00B0 LDCONST R8 K31 - 0x7C140600, // 00B1 CALL R5 3 - 0x60140008, // 00B2 GETGBL R5 G8 - 0x88180108, // 00B3 GETMBR R6 R0 K8 - 0x541E0FFE, // 00B4 LDINT R7 4095 - 0x2C180C07, // 00B5 AND R6 R6 R7 - 0x7C140200, // 00B6 CALL R5 1 - 0x00164005, // 00B7 ADD R5 K32 R5 - 0xB81A2800, // 00B8 GETNGBL R6 K20 - 0x8C180D15, // 00B9 GETMET R6 R6 K21 - 0x00224205, // 00BA ADD R8 K33 R5 - 0x5824001F, // 00BB LDCONST R9 K31 - 0x7C180600, // 00BC CALL R6 3 - 0x8C180322, // 00BD GETMET R6 R1 K34 - 0x58200018, // 00BE LDCONST R8 K24 - 0x58240019, // 00BF LDCONST R9 K25 - 0x8828010F, // 00C0 GETMBR R10 R0 K15 - 0x882C0126, // 00C1 GETMBR R11 R0 K38 - 0x5C300A00, // 00C2 MOVE R12 R5 - 0x7C180C00, // 00C3 CALL R6 6 - 0x60180008, // 00C4 GETGBL R6 G8 - 0x881C0108, // 00C5 GETMBR R7 R0 K8 - 0x54220EFF, // 00C6 LDINT R8 3840 - 0x2C1C0E08, // 00C7 AND R7 R7 R8 - 0x54220007, // 00C8 LDINT R8 8 - 0x3C1C0E08, // 00C9 SHR R7 R7 R8 - 0x7C180200, // 00CA CALL R6 1 - 0x001A4606, // 00CB ADD R6 K35 R6 - 0x5C140C00, // 00CC MOVE R5 R6 - 0xB81A2800, // 00CD GETNGBL R6 K20 - 0x8C180D15, // 00CE GETMET R6 R6 K21 - 0x00224205, // 00CF ADD R8 K33 R5 - 0x5824001F, // 00D0 LDCONST R9 K31 - 0x7C180600, // 00D1 CALL R6 3 - 0x8C180322, // 00D2 GETMET R6 R1 K34 - 0x58200018, // 00D3 LDCONST R8 K24 - 0x58240019, // 00D4 LDCONST R9 K25 - 0x8828010F, // 00D5 GETMBR R10 R0 K15 - 0x882C0126, // 00D6 GETMBR R11 R0 K38 - 0x5C300A00, // 00D7 MOVE R12 R5 - 0x7C180C00, // 00D8 CALL R6 6 - 0x60180008, // 00D9 GETGBL R6 G8 - 0x881C0104, // 00DA GETMBR R7 R0 K4 - 0x7C180200, // 00DB CALL R6 1 - 0x001A4806, // 00DC ADD R6 K36 R6 - 0x5C140C00, // 00DD MOVE R5 R6 - 0xB81A2800, // 00DE GETNGBL R6 K20 - 0x8C180D15, // 00DF GETMET R6 R6 K21 - 0x00224205, // 00E0 ADD R8 K33 R5 - 0x5824001F, // 00E1 LDCONST R9 K31 - 0x7C180600, // 00E2 CALL R6 3 - 0x8C180322, // 00E3 GETMET R6 R1 K34 - 0x58200018, // 00E4 LDCONST R8 K24 - 0x58240019, // 00E5 LDCONST R9 K25 - 0x8828010F, // 00E6 GETMBR R10 R0 K15 - 0x882C0126, // 00E7 GETMBR R11 R0 K38 - 0x5C300A00, // 00E8 MOVE R12 R5 - 0x7C180C00, // 00E9 CALL R6 6 - 0x58140025, // 00EA LDCONST R5 K37 - 0xB81A2800, // 00EB GETNGBL R6 K20 - 0x8C180D15, // 00EC GETMET R6 R6 K21 - 0x00224205, // 00ED ADD R8 K33 R5 - 0x5824001F, // 00EE LDCONST R9 K31 - 0x7C180600, // 00EF CALL R6 3 - 0x8C180322, // 00F0 GETMET R6 R1 K34 - 0x58200018, // 00F1 LDCONST R8 K24 - 0x58240019, // 00F2 LDCONST R9 K25 - 0x8828010F, // 00F3 GETMBR R10 R0 K15 - 0x882C0126, // 00F4 GETMBR R11 R0 K38 - 0x5C300A00, // 00F5 MOVE R12 R5 - 0x7C180C00, // 00F6 CALL R6 6 - 0xA8040001, // 00F7 EXBLK 1 1 - 0x70020010, // 00F8 JMP #010A - 0xAC140002, // 00F9 CATCH R5 0 2 - 0x7002000D, // 00FA JMP #0109 - 0xB81E2800, // 00FB GETNGBL R7 K20 - 0x8C1C0F15, // 00FC GETMET R7 R7 K21 - 0x60240008, // 00FD GETGBL R9 G8 - 0x5C280A00, // 00FE MOVE R10 R5 - 0x7C240200, // 00FF CALL R9 1 - 0x00265409, // 0100 ADD R9 K42 R9 - 0x0024132B, // 0101 ADD R9 R9 K43 - 0x60280008, // 0102 GETGBL R10 G8 - 0x5C2C0C00, // 0103 MOVE R11 R6 - 0x7C280200, // 0104 CALL R10 1 - 0x0024120A, // 0105 ADD R9 R9 R10 - 0x5828001F, // 0106 LDCONST R10 K31 - 0x7C1C0600, // 0107 CALL R7 3 - 0x70020000, // 0108 JMP #010A - 0xB0080000, // 0109 RAISE 2 R0 R0 - 0x80000000, // 010A RET 0 + 0x600C000C, // 0002 GETGBL R3 G12 + 0x88100102, // 0003 GETMBR R4 R0 K2 + 0x7C0C0200, // 0004 CALL R3 1 + 0x240C0703, // 0005 GT R3 R3 K3 + 0x780E0000, // 0006 JMPF R3 #0008 + 0x80000600, // 0007 RET 0 + 0x8C0C0105, // 0008 GETMET R3 R0 K5 + 0x7C0C0200, // 0009 CALL R3 1 + 0x90020803, // 000A SETMBR R0 K4 R3 + 0xB80E0C00, // 000B GETNGBL R3 K6 + 0x8C0C0707, // 000C GETMET R3 R3 K7 + 0x60140008, // 000D GETGBL R5 G8 + 0x88180104, // 000E GETMBR R6 R0 K4 + 0x7C140200, // 000F CALL R5 1 + 0x00161005, // 0010 ADD R5 K8 R5 + 0x58180009, // 0011 LDCONST R6 K9 + 0x7C0C0600, // 0012 CALL R3 3 + 0x8C0C010A, // 0013 GETMET R3 R0 K10 + 0x88140104, // 0014 GETMBR R5 R0 K4 + 0x7C0C0400, // 0015 CALL R3 2 + 0x880C010B, // 0016 GETMBR R3 R0 K11 + 0x740E0008, // 0017 JMPT R3 #0021 + 0x880C010C, // 0018 GETMBR R3 R0 K12 + 0x8C0C070D, // 0019 GETMET R3 R3 K13 + 0x7C0C0200, // 001A CALL R3 1 + 0x240C0703, // 001B GT R3 R3 K3 + 0x780E0003, // 001C JMPF R3 #0021 + 0x500C0200, // 001D LDBOOL R3 1 0 + 0x90021603, // 001E SETMBR R0 K11 R3 + 0x8C0C010E, // 001F GETMET R3 R0 K14 + 0x7C0C0200, // 0020 CALL R3 1 + 0x80000000, // 0021 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: stop +********************************************************************/ +be_local_closure(Matter_Device_stop, /* name */ + be_nested_proto( + 4, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 4]) { /* constants */ + /* K0 */ be_nested_str_weak(tasmota), + /* K1 */ be_nested_str_weak(remove_driver), + /* K2 */ be_nested_str_weak(udp_server), + /* K3 */ be_nested_str_weak(stop), + }), + be_str_weak(stop), + &be_const_str_solidified, + ( &(const binstruction[10]) { /* code */ + 0xB8060000, // 0000 GETNGBL R1 K0 + 0x8C040301, // 0001 GETMET R1 R1 K1 + 0x5C0C0000, // 0002 MOVE R3 R0 + 0x7C040400, // 0003 CALL R1 2 + 0x88040102, // 0004 GETMBR R1 R0 K2 + 0x78060002, // 0005 JMPF R1 #0009 + 0x88040102, // 0006 GETMBR R1 R0 K2 + 0x8C040303, // 0007 GETMET R1 R1 K3 + 0x7C040200, // 0008 CALL R1 1 + 0x80000000, // 0009 RET 0 }) ) ); @@ -2410,613 +4441,396 @@ be_local_closure(Matter_Device_autoconf_device_map, /* name */ /******************************************************************** -** Solidified function: is_commissioning_open +** Solidified function: register_http_remote ********************************************************************/ -be_local_closure(Matter_Device_is_commissioning_open, /* name */ - be_nested_proto( - 3, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 1]) { /* constants */ - /* K0 */ be_nested_str_weak(commissioning_open), - }), - be_str_weak(is_commissioning_open), - &be_const_str_solidified, - ( &(const binstruction[ 4]) { /* code */ - 0x88040100, // 0000 GETMBR R1 R0 K0 - 0x4C080000, // 0001 LDNIL R2 - 0x20040202, // 0002 NE R1 R1 R2 - 0x80040200, // 0003 RET 1 R1 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: init -********************************************************************/ -be_local_closure(Matter_Device_init, /* name */ +be_local_closure(Matter_Device_register_http_remote, /* name */ be_nested_proto( 8, /* nstack */ + 3, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 6]) { /* constants */ + /* K0 */ be_nested_str_weak(http_remotes), + /* K1 */ be_nested_str_weak(contains), + /* K2 */ be_nested_str_weak(get_timeout), + /* K3 */ be_nested_str_weak(set_timeout), + /* K4 */ be_nested_str_weak(matter), + /* K5 */ be_nested_str_weak(HTTP_remote), + }), + be_str_weak(register_http_remote), + &be_const_str_solidified, + ( &(const binstruction[32]) { /* code */ + 0x880C0100, // 0000 GETMBR R3 R0 K0 + 0x4C100000, // 0001 LDNIL R4 + 0x1C0C0604, // 0002 EQ R3 R3 R4 + 0x780E0002, // 0003 JMPF R3 #0007 + 0x600C0013, // 0004 GETGBL R3 G19 + 0x7C0C0000, // 0005 CALL R3 0 + 0x90020003, // 0006 SETMBR R0 K0 R3 + 0x4C0C0000, // 0007 LDNIL R3 + 0x88100100, // 0008 GETMBR R4 R0 K0 + 0x8C100901, // 0009 GETMET R4 R4 K1 + 0x5C180200, // 000A MOVE R6 R1 + 0x7C100400, // 000B CALL R4 2 + 0x78120009, // 000C JMPF R4 #0017 + 0x88100100, // 000D GETMBR R4 R0 K0 + 0x940C0801, // 000E GETIDX R3 R4 R1 + 0x8C140702, // 000F GETMET R5 R3 K2 + 0x7C140200, // 0010 CALL R5 1 + 0x14140405, // 0011 LT R5 R2 R5 + 0x78160002, // 0012 JMPF R5 #0016 + 0x8C140703, // 0013 GETMET R5 R3 K3 + 0x5C1C0400, // 0014 MOVE R7 R2 + 0x7C140400, // 0015 CALL R5 2 + 0x70020007, // 0016 JMP #001F + 0xB8120800, // 0017 GETNGBL R4 K4 + 0x8C100905, // 0018 GETMET R4 R4 K5 + 0x5C180200, // 0019 MOVE R6 R1 + 0x5C1C0400, // 001A MOVE R7 R2 + 0x7C100600, // 001B CALL R4 3 + 0x5C0C0800, // 001C MOVE R3 R4 + 0x88100100, // 001D GETMBR R4 R0 K0 + 0x98100203, // 001E SETIDX R4 R1 R3 + 0x80040600, // 001F RET 1 R3 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: mdns_announce_PASE +********************************************************************/ +be_local_closure(Matter_Device_mdns_announce_PASE, /* name */ + be_nested_proto( + 16, /* nstack */ 1, /* argc */ 2, /* varg */ 0, /* has upvals */ NULL, /* no upvals */ - 1, /* has sup protos */ - ( &(const struct bproto*[ 2]) { - be_nested_proto( - 4, /* nstack */ - 0, /* argc */ - 0, /* varg */ - 1, /* has upvals */ - ( &(const bupvaldesc[ 1]) { /* upvals */ - be_local_const_upval(1, 0), - }), - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 5]) { /* constants */ - /* K0 */ be_nested_str_weak(start), - /* K1 */ be_nested_str_weak(tasmota), - /* K2 */ be_nested_str_weak(remove_rule), - /* K3 */ be_nested_str_weak(Wifi_X23Connected), - /* K4 */ be_nested_str_weak(matter_start), - }), - be_str_weak(_anonymous_), - &be_const_str_solidified, - ( &(const binstruction[ 9]) { /* code */ - 0x68000000, // 0000 GETUPV R0 U0 - 0x8C000100, // 0001 GETMET R0 R0 K0 - 0x7C000200, // 0002 CALL R0 1 - 0xB8020200, // 0003 GETNGBL R0 K1 - 0x8C000102, // 0004 GETMET R0 R0 K2 - 0x58080003, // 0005 LDCONST R2 K3 - 0x580C0004, // 0006 LDCONST R3 K4 - 0x7C000600, // 0007 CALL R0 3 - 0x80000000, // 0008 RET 0 - }) - ), - be_nested_proto( - 4, /* nstack */ - 0, /* argc */ - 0, /* varg */ - 1, /* has upvals */ - ( &(const bupvaldesc[ 1]) { /* upvals */ - be_local_const_upval(1, 0), - }), - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 5]) { /* constants */ - /* K0 */ be_nested_str_weak(start), - /* K1 */ be_nested_str_weak(tasmota), - /* K2 */ be_nested_str_weak(remove_rule), - /* K3 */ be_nested_str_weak(Eth_X23Connected), - /* K4 */ be_nested_str_weak(matter_start), - }), - be_str_weak(_anonymous_), - &be_const_str_solidified, - ( &(const binstruction[ 9]) { /* code */ - 0x68000000, // 0000 GETUPV R0 U0 - 0x8C000100, // 0001 GETMET R0 R0 K0 - 0x7C000200, // 0002 CALL R0 1 - 0xB8020200, // 0003 GETNGBL R0 K1 - 0x8C000102, // 0004 GETMET R0 R0 K2 - 0x58080003, // 0005 LDCONST R2 K3 - 0x580C0004, // 0006 LDCONST R3 K4 - 0x7C000600, // 0007 CALL R0 3 - 0x80000000, // 0008 RET 0 - }) - ), - }), + 0, /* has sup protos */ + NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[41]) { /* constants */ - /* K0 */ be_nested_str_weak(crypto), + ( &(const bvalue[44]) { /* constants */ + /* K0 */ be_nested_str_weak(mdns), /* K1 */ be_nested_str_weak(string), - /* K2 */ be_nested_str_weak(tasmota), - /* K3 */ be_nested_str_weak(get_option), - /* K4 */ be_nested_str_weak(matter), - /* K5 */ be_nested_str_weak(MATTER_OPTION), - /* K6 */ be_nested_str_weak(UI), - /* K7 */ be_nested_str_weak(started), - /* K8 */ be_nested_str_weak(tick), - /* K9 */ be_const_int(0), - /* K10 */ be_nested_str_weak(plugins), - /* K11 */ be_nested_str_weak(plugins_persist), - /* K12 */ be_nested_str_weak(plugins_classes), - /* K13 */ be_nested_str_weak(register_native_classes), - /* K14 */ be_nested_str_weak(vendorid), - /* K15 */ be_nested_str_weak(VENDOR_ID), - /* K16 */ be_nested_str_weak(productid), - /* K17 */ be_nested_str_weak(PRODUCT_ID), - /* K18 */ be_nested_str_weak(root_iterations), - /* K19 */ be_nested_str_weak(PBKDF_ITERATIONS), - /* K20 */ be_nested_str_weak(root_salt), - /* K21 */ be_nested_str_weak(random), - /* K22 */ be_nested_str_weak(ipv4only), - /* K23 */ be_nested_str_weak(load_param), - /* K24 */ be_nested_str_weak(sessions), - /* K25 */ be_nested_str_weak(Session_Store), - /* K26 */ be_nested_str_weak(load_fabrics), - /* K27 */ be_nested_str_weak(message_handler), - /* K28 */ be_nested_str_weak(MessageHandler), - /* K29 */ be_nested_str_weak(ui), - /* K30 */ be_nested_str_weak(wifi), - /* K31 */ be_nested_str_weak(up), - /* K32 */ be_nested_str_weak(eth), - /* K33 */ be_nested_str_weak(start), - /* K34 */ be_nested_str_weak(add_rule), - /* K35 */ be_nested_str_weak(Wifi_X23Connected), - /* K36 */ be_nested_str_weak(matter_start), - /* K37 */ be_nested_str_weak(Eth_X23Connected), - /* K38 */ be_nested_str_weak(_init_basic_commissioning), - /* K39 */ be_nested_str_weak(add_driver), - /* K40 */ be_nested_str_weak(register_commands), + /* K2 */ be_nested_str_weak(crypto), + /* K3 */ be_nested_str_weak(VP), + /* K4 */ be_nested_str_weak(vendorid), + /* K5 */ be_nested_str_weak(_X2B), + /* K6 */ be_nested_str_weak(productid), + /* K7 */ be_nested_str_weak(D), + /* K8 */ be_nested_str_weak(commissioning_discriminator), + /* K9 */ be_nested_str_weak(CM), + /* K10 */ be_const_int(1), + /* K11 */ be_nested_str_weak(T), + /* K12 */ be_const_int(0), + /* K13 */ be_nested_str_weak(SII), + /* K14 */ be_nested_str_weak(SAI), + /* K15 */ be_nested_str_weak(commissioning_instance_wifi), + /* K16 */ be_nested_str_weak(random), + /* K17 */ be_nested_str_weak(tohex), + /* K18 */ be_nested_str_weak(commissioning_instance_eth), + /* K19 */ be_nested_str_weak(hostname_eth), + /* K20 */ be_nested_str_weak(tasmota), + /* K21 */ be_nested_str_weak(log), + /* K22 */ be_nested_str_weak(format), + /* K23 */ be_nested_str_weak(MTR_X3A_X20calling_X20mdns_X2Eadd_service_X28_X25s_X2C_X20_X25s_X2C_X20_X25i_X2C_X20_X25s_X2C_X20_X25s_X2C_X20_X25s_X29), + /* K24 */ be_nested_str_weak(_matterc), + /* K25 */ be_nested_str_weak(_udp), + /* K26 */ be_const_int(3), + /* K27 */ be_nested_str_weak(add_service), + /* K28 */ be_nested_str_weak(mdns_pase_eth), + /* K29 */ be_nested_str_weak(MTR_X3A_X20announce_X20mDNS_X20on_X20_X25s_X20_X27_X25s_X27_X20ptr_X20to_X20_X60_X25s_X2Elocal_X60), + /* K30 */ be_nested_str_weak(eth), + /* K31 */ be_const_int(2), + /* K32 */ be_nested_str_weak(_L), + /* K33 */ be_nested_str_weak(MTR_X3A_X20adding_X20subtype_X3A_X20), + /* K34 */ be_nested_str_weak(add_subtype), + /* K35 */ be_nested_str_weak(_S), + /* K36 */ be_nested_str_weak(_V), + /* K37 */ be_nested_str_weak(_CM1), + /* K38 */ be_nested_str_weak(hostname_wifi), + /* K39 */ be_nested_str_weak(mdns_pase_wifi), + /* K40 */ be_nested_str_weak(MTR_X3A_X20starting_X20mDNS_X20on_X20_X25s_X20_X27_X25s_X27_X20ptr_X20to_X20_X60_X25s_X2Elocal_X60), + /* K41 */ be_nested_str_weak(wifi), + /* K42 */ be_nested_str_weak(MTR_X3A_X20Exception), + /* K43 */ be_nested_str_weak(_X7C), }), - be_str_weak(init), + be_str_weak(mdns_announce_PASE), &be_const_str_solidified, - ( &(const binstruction[102]) { /* code */ + ( &(const binstruction[267]) { /* code */ 0xA4060000, // 0000 IMPORT R1 K0 0xA40A0200, // 0001 IMPORT R2 K1 - 0xB80E0400, // 0002 GETNGBL R3 K2 - 0x8C0C0703, // 0003 GETMET R3 R3 K3 - 0xB8160800, // 0004 GETNGBL R5 K4 - 0x88140B05, // 0005 GETMBR R5 R5 K5 - 0x7C0C0400, // 0006 CALL R3 2 - 0x740E0004, // 0007 JMPT R3 #000D - 0xB80E0800, // 0008 GETNGBL R3 K4 - 0x8C0C0706, // 0009 GETMET R3 R3 K6 - 0x5C140000, // 000A MOVE R5 R0 - 0x7C0C0400, // 000B CALL R3 2 - 0x80000600, // 000C RET 0 - 0x500C0000, // 000D LDBOOL R3 0 0 - 0x90020E03, // 000E SETMBR R0 K7 R3 - 0x90021109, // 000F SETMBR R0 K8 K9 - 0x600C0012, // 0010 GETGBL R3 G18 - 0x7C0C0000, // 0011 CALL R3 0 - 0x90021403, // 0012 SETMBR R0 K10 R3 - 0x500C0000, // 0013 LDBOOL R3 0 0 - 0x90021603, // 0014 SETMBR R0 K11 R3 - 0x600C0013, // 0015 GETGBL R3 G19 - 0x7C0C0000, // 0016 CALL R3 0 - 0x90021803, // 0017 SETMBR R0 K12 R3 - 0x8C0C010D, // 0018 GETMET R3 R0 K13 - 0x7C0C0200, // 0019 CALL R3 1 - 0x880C010F, // 001A GETMBR R3 R0 K15 - 0x90021C03, // 001B SETMBR R0 K14 R3 - 0x880C0111, // 001C GETMBR R3 R0 K17 - 0x90022003, // 001D SETMBR R0 K16 R3 - 0x880C0113, // 001E GETMBR R3 R0 K19 - 0x90022403, // 001F SETMBR R0 K18 R3 - 0x8C0C0315, // 0020 GETMET R3 R1 K21 - 0x5416000F, // 0021 LDINT R5 16 - 0x7C0C0400, // 0022 CALL R3 2 - 0x90022803, // 0023 SETMBR R0 K20 R3 - 0x500C0000, // 0024 LDBOOL R3 0 0 - 0x90022C03, // 0025 SETMBR R0 K22 R3 - 0x8C0C0117, // 0026 GETMET R3 R0 K23 - 0x7C0C0200, // 0027 CALL R3 1 - 0xB80E0800, // 0028 GETNGBL R3 K4 - 0x8C0C0719, // 0029 GETMET R3 R3 K25 - 0x5C140000, // 002A MOVE R5 R0 - 0x7C0C0400, // 002B CALL R3 2 - 0x90023003, // 002C SETMBR R0 K24 R3 - 0x880C0118, // 002D GETMBR R3 R0 K24 - 0x8C0C071A, // 002E GETMET R3 R3 K26 - 0x7C0C0200, // 002F CALL R3 1 - 0xB80E0800, // 0030 GETNGBL R3 K4 - 0x8C0C071C, // 0031 GETMET R3 R3 K28 - 0x5C140000, // 0032 MOVE R5 R0 - 0x7C0C0400, // 0033 CALL R3 2 - 0x90023603, // 0034 SETMBR R0 K27 R3 - 0xB80E0800, // 0035 GETNGBL R3 K4 - 0x8C0C0706, // 0036 GETMET R3 R3 K6 - 0x5C140000, // 0037 MOVE R5 R0 - 0x7C0C0400, // 0038 CALL R3 2 - 0x90023A03, // 0039 SETMBR R0 K29 R3 - 0xB80E0400, // 003A GETNGBL R3 K2 - 0x8C0C071E, // 003B GETMET R3 R3 K30 - 0x7C0C0200, // 003C CALL R3 1 - 0x940C071F, // 003D GETIDX R3 R3 K31 - 0x740E0004, // 003E JMPT R3 #0044 - 0xB80E0400, // 003F GETNGBL R3 K2 - 0x8C0C0720, // 0040 GETMET R3 R3 K32 - 0x7C0C0200, // 0041 CALL R3 1 - 0x940C071F, // 0042 GETIDX R3 R3 K31 - 0x780E0001, // 0043 JMPF R3 #0046 - 0x8C0C0121, // 0044 GETMET R3 R0 K33 - 0x7C0C0200, // 0045 CALL R3 1 - 0xB80E0400, // 0046 GETNGBL R3 K2 - 0x8C0C071E, // 0047 GETMET R3 R3 K30 - 0x7C0C0200, // 0048 CALL R3 1 - 0x940C071F, // 0049 GETIDX R3 R3 K31 - 0x740E0005, // 004A JMPT R3 #0051 - 0xB80E0400, // 004B GETNGBL R3 K2 - 0x8C0C0722, // 004C GETMET R3 R3 K34 - 0x58140023, // 004D LDCONST R5 K35 - 0x84180000, // 004E CLOSURE R6 P0 - 0x581C0024, // 004F LDCONST R7 K36 - 0x7C0C0800, // 0050 CALL R3 4 - 0xB80E0400, // 0051 GETNGBL R3 K2 - 0x8C0C0720, // 0052 GETMET R3 R3 K32 - 0x7C0C0200, // 0053 CALL R3 1 - 0x940C071F, // 0054 GETIDX R3 R3 K31 - 0x740E0005, // 0055 JMPT R3 #005C - 0xB80E0400, // 0056 GETNGBL R3 K2 - 0x8C0C0722, // 0057 GETMET R3 R3 K34 - 0x58140025, // 0058 LDCONST R5 K37 - 0x84180001, // 0059 CLOSURE R6 P1 - 0x581C0024, // 005A LDCONST R7 K36 - 0x7C0C0800, // 005B CALL R3 4 - 0x8C0C0126, // 005C GETMET R3 R0 K38 - 0x7C0C0200, // 005D CALL R3 1 - 0xB80E0400, // 005E GETNGBL R3 K2 - 0x8C0C0727, // 005F GETMET R3 R3 K39 - 0x5C140000, // 0060 MOVE R5 R0 - 0x7C0C0400, // 0061 CALL R3 2 - 0x8C0C0128, // 0062 GETMET R3 R0 K40 - 0x7C0C0200, // 0063 CALL R3 1 - 0xA0000000, // 0064 CLOSE R0 - 0x80000000, // 0065 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: mdns_remove_op_discovery -********************************************************************/ -be_local_closure(Matter_Device_mdns_remove_op_discovery, /* name */ - be_nested_proto( - 14, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[24]) { /* constants */ - /* K0 */ be_nested_str_weak(mdns), - /* K1 */ be_nested_str_weak(string), - /* K2 */ be_nested_str_weak(get_device_id), - /* K3 */ be_nested_str_weak(copy), - /* K4 */ be_nested_str_weak(reverse), - /* K5 */ be_nested_str_weak(get_fabric_compressed), - /* K6 */ be_nested_str_weak(tohex), - /* K7 */ be_nested_str_weak(_X2D), - /* K8 */ be_nested_str_weak(tasmota), - /* K9 */ be_nested_str_weak(eth), - /* K10 */ be_nested_str_weak(find), - /* K11 */ be_nested_str_weak(up), - /* K12 */ be_nested_str_weak(log), - /* K13 */ be_nested_str_weak(format), - /* K14 */ be_nested_str_weak(MTR_X3A_X20remove_X20mDNS_X20on_X20_X25s_X20_X27_X25s_X27), - /* K15 */ be_const_int(2), - /* K16 */ be_nested_str_weak(remove_service), - /* K17 */ be_nested_str_weak(_matter), - /* K18 */ be_nested_str_weak(_tcp), - /* K19 */ be_nested_str_weak(hostname_eth), - /* K20 */ be_nested_str_weak(wifi), - /* K21 */ be_nested_str_weak(hostname_wifi), - /* K22 */ be_nested_str_weak(MTR_X3A_X20Exception), - /* K23 */ be_nested_str_weak(_X7C), - }), - be_str_weak(mdns_remove_op_discovery), - &be_const_str_solidified, - ( &(const binstruction[81]) { /* code */ - 0xA40A0000, // 0000 IMPORT R2 K0 - 0xA40E0200, // 0001 IMPORT R3 K1 - 0xA802003B, // 0002 EXBLK 0 #003F - 0x8C100302, // 0003 GETMET R4 R1 K2 - 0x7C100200, // 0004 CALL R4 1 - 0x8C100903, // 0005 GETMET R4 R4 K3 - 0x7C100200, // 0006 CALL R4 1 - 0x8C100904, // 0007 GETMET R4 R4 K4 - 0x7C100200, // 0008 CALL R4 1 - 0x8C140305, // 0009 GETMET R5 R1 K5 - 0x7C140200, // 000A CALL R5 1 - 0x8C180B06, // 000B GETMET R6 R5 K6 - 0x7C180200, // 000C CALL R6 1 - 0x00180D07, // 000D ADD R6 R6 K7 - 0x8C1C0906, // 000E GETMET R7 R4 K6 - 0x7C1C0200, // 000F CALL R7 1 - 0x00180C07, // 0010 ADD R6 R6 R7 - 0xB81E1000, // 0011 GETNGBL R7 K8 - 0x8C1C0F09, // 0012 GETMET R7 R7 K9 - 0x7C1C0200, // 0013 CALL R7 1 - 0x8C1C0F0A, // 0014 GETMET R7 R7 K10 - 0x5824000B, // 0015 LDCONST R9 K11 - 0x7C1C0400, // 0016 CALL R7 2 - 0x781E000E, // 0017 JMPF R7 #0027 - 0xB81E1000, // 0018 GETNGBL R7 K8 - 0x8C1C0F0C, // 0019 GETMET R7 R7 K12 - 0x8C24070D, // 001A GETMET R9 R3 K13 - 0x582C000E, // 001B LDCONST R11 K14 - 0x58300009, // 001C LDCONST R12 K9 - 0x5C340C00, // 001D MOVE R13 R6 - 0x7C240800, // 001E CALL R9 4 - 0x5828000F, // 001F LDCONST R10 K15 - 0x7C1C0600, // 0020 CALL R7 3 - 0x8C1C0510, // 0021 GETMET R7 R2 K16 - 0x58240011, // 0022 LDCONST R9 K17 - 0x58280012, // 0023 LDCONST R10 K18 - 0x5C2C0C00, // 0024 MOVE R11 R6 - 0x88300113, // 0025 GETMBR R12 R0 K19 - 0x7C1C0A00, // 0026 CALL R7 5 - 0xB81E1000, // 0027 GETNGBL R7 K8 - 0x8C1C0F14, // 0028 GETMET R7 R7 K20 - 0x7C1C0200, // 0029 CALL R7 1 - 0x8C1C0F0A, // 002A GETMET R7 R7 K10 - 0x5824000B, // 002B LDCONST R9 K11 - 0x7C1C0400, // 002C CALL R7 2 - 0x781E000E, // 002D JMPF R7 #003D - 0xB81E1000, // 002E GETNGBL R7 K8 - 0x8C1C0F0C, // 002F GETMET R7 R7 K12 - 0x8C24070D, // 0030 GETMET R9 R3 K13 - 0x582C000E, // 0031 LDCONST R11 K14 - 0x58300014, // 0032 LDCONST R12 K20 - 0x5C340C00, // 0033 MOVE R13 R6 - 0x7C240800, // 0034 CALL R9 4 - 0x5828000F, // 0035 LDCONST R10 K15 - 0x7C1C0600, // 0036 CALL R7 3 - 0x8C1C0510, // 0037 GETMET R7 R2 K16 - 0x58240011, // 0038 LDCONST R9 K17 - 0x58280012, // 0039 LDCONST R10 K18 - 0x5C2C0C00, // 003A MOVE R11 R6 - 0x88300115, // 003B GETMBR R12 R0 K21 - 0x7C1C0A00, // 003C CALL R7 5 - 0xA8040001, // 003D EXBLK 1 1 - 0x70020010, // 003E JMP #0050 - 0xAC100002, // 003F CATCH R4 0 2 - 0x7002000D, // 0040 JMP #004F - 0xB81A1000, // 0041 GETNGBL R6 K8 - 0x8C180D0C, // 0042 GETMET R6 R6 K12 - 0x60200008, // 0043 GETGBL R8 G8 - 0x5C240800, // 0044 MOVE R9 R4 - 0x7C200200, // 0045 CALL R8 1 - 0x00222C08, // 0046 ADD R8 K22 R8 - 0x00201117, // 0047 ADD R8 R8 K23 - 0x60240008, // 0048 GETGBL R9 G8 - 0x5C280A00, // 0049 MOVE R10 R5 - 0x7C240200, // 004A CALL R9 1 - 0x00201009, // 004B ADD R8 R8 R9 - 0x5824000F, // 004C LDCONST R9 K15 - 0x7C180600, // 004D CALL R6 3 - 0x70020000, // 004E JMP #0050 - 0xB0080000, // 004F RAISE 2 R0 R0 - 0x80000000, // 0050 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: _mdns_announce_hostname -********************************************************************/ -be_local_closure(Matter_Device__mdns_announce_hostname, /* name */ - be_nested_proto( - 16, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[28]) { /* constants */ - /* K0 */ be_nested_str_weak(mdns), - /* K1 */ be_nested_str_weak(string), - /* K2 */ be_nested_str_weak(start), - /* K3 */ be_nested_str_weak(tasmota), - /* K4 */ be_nested_str_weak(eth), - /* K5 */ be_nested_str_weak(hostname_eth), - /* K6 */ be_nested_str_weak(replace), - /* K7 */ be_nested_str_weak(find), - /* K8 */ be_nested_str_weak(mac), - /* K9 */ be_nested_str_weak(_X3A), - /* K10 */ be_nested_str_weak(), - /* K11 */ be_nested_str_weak(ipv4only), - /* K12 */ be_nested_str_weak(log), - /* K13 */ be_nested_str_weak(format), - /* K14 */ be_nested_str_weak(MTR_X3A_X20calling_X20mdns_X2Eadd_hostname_X28_X25s_X2C_X20_X25s_X2C_X20_X25s_X29), - /* K15 */ be_nested_str_weak(ip6local), - /* K16 */ be_nested_str_weak(ip), - /* K17 */ be_const_int(3), - /* K18 */ be_nested_str_weak(add_hostname), - /* K19 */ be_nested_str_weak(ip6), - /* K20 */ be_nested_str_weak(MTR_X3A_X20calling_X20mdns_X2Eadd_hostname_X28_X25s_X2C_X20_X25s_X29), - /* K21 */ be_nested_str_weak(wifi), - /* K22 */ be_nested_str_weak(hostname_wifi), - /* K23 */ be_nested_str_weak(MTR_X3A_X20start_X20mDNS_X20on_X20_X25s_X20host_X20_X27_X25s_X2Elocal_X27), - /* K24 */ be_const_int(2), - /* K25 */ be_nested_str_weak(MTR_X3A_X20Exception), - /* K26 */ be_nested_str_weak(_X7C), - /* K27 */ be_nested_str_weak(mdns_announce_op_discovery_all_fabrics), - }), - be_str_weak(_mdns_announce_hostname), - &be_const_str_solidified, - ( &(const binstruction[172]) { /* code */ - 0xA40A0000, // 0000 IMPORT R2 K0 - 0xA40E0200, // 0001 IMPORT R3 K1 - 0x8C100502, // 0002 GETMET R4 R2 K2 - 0x7C100200, // 0003 CALL R4 1 - 0xA8020092, // 0004 EXBLK 0 #0098 - 0x78060040, // 0005 JMPF R1 #0047 - 0xB8120600, // 0006 GETNGBL R4 K3 - 0x8C100904, // 0007 GETMET R4 R4 K4 - 0x7C100200, // 0008 CALL R4 1 - 0x8C140706, // 0009 GETMET R5 R3 K6 - 0x8C1C0907, // 000A GETMET R7 R4 K7 - 0x58240008, // 000B LDCONST R9 K8 - 0x7C1C0400, // 000C CALL R7 2 - 0x58200009, // 000D LDCONST R8 K9 - 0x5824000A, // 000E LDCONST R9 K10 - 0x7C140800, // 000F CALL R5 4 - 0x90020A05, // 0010 SETMBR R0 K5 R5 - 0x8814010B, // 0011 GETMBR R5 R0 K11 - 0x7416001F, // 0012 JMPT R5 #0033 - 0xB8160600, // 0013 GETNGBL R5 K3 - 0x8C140B0C, // 0014 GETMET R5 R5 K12 - 0x8C1C070D, // 0015 GETMET R7 R3 K13 - 0x5824000E, // 0016 LDCONST R9 K14 - 0x88280105, // 0017 GETMBR R10 R0 K5 - 0x8C2C0907, // 0018 GETMET R11 R4 K7 - 0x5834000F, // 0019 LDCONST R13 K15 - 0x5838000A, // 001A LDCONST R14 K10 - 0x7C2C0600, // 001B CALL R11 3 - 0x8C300907, // 001C GETMET R12 R4 K7 - 0x58380010, // 001D LDCONST R14 K16 - 0x583C000A, // 001E LDCONST R15 K10 - 0x7C300600, // 001F CALL R12 3 - 0x7C1C0A00, // 0020 CALL R7 5 - 0x58200011, // 0021 LDCONST R8 K17 - 0x7C140600, // 0022 CALL R5 3 - 0x8C140512, // 0023 GETMET R5 R2 K18 - 0x881C0105, // 0024 GETMBR R7 R0 K5 - 0x8C200907, // 0025 GETMET R8 R4 K7 - 0x5828000F, // 0026 LDCONST R10 K15 - 0x582C000A, // 0027 LDCONST R11 K10 - 0x7C200600, // 0028 CALL R8 3 - 0x8C240907, // 0029 GETMET R9 R4 K7 - 0x582C0010, // 002A LDCONST R11 K16 - 0x5830000A, // 002B LDCONST R12 K10 - 0x7C240600, // 002C CALL R9 3 - 0x8C280907, // 002D GETMET R10 R4 K7 - 0x58300013, // 002E LDCONST R12 K19 - 0x5834000A, // 002F LDCONST R13 K10 - 0x7C280600, // 0030 CALL R10 3 - 0x7C140A00, // 0031 CALL R5 5 - 0x70020012, // 0032 JMP #0046 - 0xB8160600, // 0033 GETNGBL R5 K3 - 0x8C140B0C, // 0034 GETMET R5 R5 K12 - 0x8C1C070D, // 0035 GETMET R7 R3 K13 - 0x58240014, // 0036 LDCONST R9 K20 - 0x88280105, // 0037 GETMBR R10 R0 K5 - 0x8C2C0907, // 0038 GETMET R11 R4 K7 - 0x58340010, // 0039 LDCONST R13 K16 - 0x5838000A, // 003A LDCONST R14 K10 - 0x7C2C0600, // 003B CALL R11 3 - 0x7C1C0800, // 003C CALL R7 4 - 0x58200011, // 003D LDCONST R8 K17 - 0x7C140600, // 003E CALL R5 3 - 0x8C140512, // 003F GETMET R5 R2 K18 - 0x881C0105, // 0040 GETMBR R7 R0 K5 - 0x8C200907, // 0041 GETMET R8 R4 K7 - 0x58280010, // 0042 LDCONST R10 K16 - 0x582C000A, // 0043 LDCONST R11 K10 - 0x7C200600, // 0044 CALL R8 3 - 0x7C140600, // 0045 CALL R5 3 - 0x7002003F, // 0046 JMP #0087 - 0xB8120600, // 0047 GETNGBL R4 K3 - 0x8C100915, // 0048 GETMET R4 R4 K21 - 0x7C100200, // 0049 CALL R4 1 - 0x8C140706, // 004A GETMET R5 R3 K6 - 0x8C1C0907, // 004B GETMET R7 R4 K7 - 0x58240008, // 004C LDCONST R9 K8 - 0x7C1C0400, // 004D CALL R7 2 - 0x58200009, // 004E LDCONST R8 K9 - 0x5824000A, // 004F LDCONST R9 K10 - 0x7C140800, // 0050 CALL R5 4 - 0x90022C05, // 0051 SETMBR R0 K22 R5 - 0x8814010B, // 0052 GETMBR R5 R0 K11 - 0x7416001F, // 0053 JMPT R5 #0074 - 0xB8160600, // 0054 GETNGBL R5 K3 - 0x8C140B0C, // 0055 GETMET R5 R5 K12 - 0x8C1C070D, // 0056 GETMET R7 R3 K13 - 0x5824000E, // 0057 LDCONST R9 K14 - 0x88280116, // 0058 GETMBR R10 R0 K22 - 0x8C2C0907, // 0059 GETMET R11 R4 K7 - 0x5834000F, // 005A LDCONST R13 K15 - 0x5838000A, // 005B LDCONST R14 K10 - 0x7C2C0600, // 005C CALL R11 3 - 0x8C300907, // 005D GETMET R12 R4 K7 - 0x58380010, // 005E LDCONST R14 K16 - 0x583C000A, // 005F LDCONST R15 K10 - 0x7C300600, // 0060 CALL R12 3 - 0x7C1C0A00, // 0061 CALL R7 5 - 0x58200011, // 0062 LDCONST R8 K17 - 0x7C140600, // 0063 CALL R5 3 - 0x8C140512, // 0064 GETMET R5 R2 K18 - 0x881C0116, // 0065 GETMBR R7 R0 K22 - 0x8C200907, // 0066 GETMET R8 R4 K7 - 0x5828000F, // 0067 LDCONST R10 K15 - 0x582C000A, // 0068 LDCONST R11 K10 - 0x7C200600, // 0069 CALL R8 3 - 0x8C240907, // 006A GETMET R9 R4 K7 - 0x582C0010, // 006B LDCONST R11 K16 - 0x5830000A, // 006C LDCONST R12 K10 - 0x7C240600, // 006D CALL R9 3 - 0x8C280907, // 006E GETMET R10 R4 K7 - 0x58300013, // 006F LDCONST R12 K19 - 0x5834000A, // 0070 LDCONST R13 K10 - 0x7C280600, // 0071 CALL R10 3 - 0x7C140A00, // 0072 CALL R5 5 - 0x70020012, // 0073 JMP #0087 - 0xB8160600, // 0074 GETNGBL R5 K3 - 0x8C140B0C, // 0075 GETMET R5 R5 K12 - 0x8C1C070D, // 0076 GETMET R7 R3 K13 - 0x58240014, // 0077 LDCONST R9 K20 - 0x88280105, // 0078 GETMBR R10 R0 K5 - 0x8C2C0907, // 0079 GETMET R11 R4 K7 - 0x58340010, // 007A LDCONST R13 K16 - 0x5838000A, // 007B LDCONST R14 K10 - 0x7C2C0600, // 007C CALL R11 3 - 0x7C1C0800, // 007D CALL R7 4 - 0x58200011, // 007E LDCONST R8 K17 - 0x7C140600, // 007F CALL R5 3 - 0x8C140512, // 0080 GETMET R5 R2 K18 - 0x881C0116, // 0081 GETMBR R7 R0 K22 - 0x8C200907, // 0082 GETMET R8 R4 K7 - 0x58280010, // 0083 LDCONST R10 K16 - 0x582C000A, // 0084 LDCONST R11 K10 - 0x7C200600, // 0085 CALL R8 3 - 0x7C140600, // 0086 CALL R5 3 - 0xB8120600, // 0087 GETNGBL R4 K3 - 0x8C10090C, // 0088 GETMET R4 R4 K12 - 0x8C18070D, // 0089 GETMET R6 R3 K13 - 0x58200017, // 008A LDCONST R8 K23 - 0x78060001, // 008B JMPF R1 #008E - 0x58240004, // 008C LDCONST R9 K4 - 0x70020000, // 008D JMP #008F - 0x58240015, // 008E LDCONST R9 K21 - 0x78060001, // 008F JMPF R1 #0092 - 0x88280105, // 0090 GETMBR R10 R0 K5 - 0x70020000, // 0091 JMP #0093 - 0x88280116, // 0092 GETMBR R10 R0 K22 - 0x7C180800, // 0093 CALL R6 4 - 0x581C0018, // 0094 LDCONST R7 K24 - 0x7C100600, // 0095 CALL R4 3 - 0xA8040001, // 0096 EXBLK 1 1 - 0x70020010, // 0097 JMP #00A9 - 0xAC100002, // 0098 CATCH R4 0 2 - 0x7002000D, // 0099 JMP #00A8 - 0xB81A0600, // 009A GETNGBL R6 K3 - 0x8C180D0C, // 009B GETMET R6 R6 K12 - 0x60200008, // 009C GETGBL R8 G8 - 0x5C240800, // 009D MOVE R9 R4 - 0x7C200200, // 009E CALL R8 1 - 0x00223208, // 009F ADD R8 K25 R8 - 0x0020111A, // 00A0 ADD R8 R8 K26 - 0x60240008, // 00A1 GETGBL R9 G8 - 0x5C280A00, // 00A2 MOVE R10 R5 - 0x7C240200, // 00A3 CALL R9 1 - 0x00201009, // 00A4 ADD R8 R8 R9 - 0x58240018, // 00A5 LDCONST R9 K24 - 0x7C180600, // 00A6 CALL R6 3 - 0x70020000, // 00A7 JMP #00A9 - 0xB0080000, // 00A8 RAISE 2 R0 R0 - 0x8C10011B, // 00A9 GETMET R4 R0 K27 - 0x7C100200, // 00AA CALL R4 1 - 0x80000000, // 00AB RET 0 + 0xA40E0400, // 0002 IMPORT R3 K2 + 0x60100013, // 0003 GETGBL R4 G19 + 0x7C100000, // 0004 CALL R4 0 + 0x60140008, // 0005 GETGBL R5 G8 + 0x88180104, // 0006 GETMBR R6 R0 K4 + 0x7C140200, // 0007 CALL R5 1 + 0x00140B05, // 0008 ADD R5 R5 K5 + 0x60180008, // 0009 GETGBL R6 G8 + 0x881C0106, // 000A GETMBR R7 R0 K6 + 0x7C180200, // 000B CALL R6 1 + 0x00140A06, // 000C ADD R5 R5 R6 + 0x98120605, // 000D SETIDX R4 K3 R5 + 0x88140108, // 000E GETMBR R5 R0 K8 + 0x98120E05, // 000F SETIDX R4 K7 R5 + 0x9812130A, // 0010 SETIDX R4 K9 K10 + 0x9812170C, // 0011 SETIDX R4 K11 K12 + 0x54161387, // 0012 LDINT R5 5000 + 0x98121A05, // 0013 SETIDX R4 K13 R5 + 0x5416012B, // 0014 LDINT R5 300 + 0x98121C05, // 0015 SETIDX R4 K14 R5 + 0x8C140710, // 0016 GETMET R5 R3 K16 + 0x541E0007, // 0017 LDINT R7 8 + 0x7C140400, // 0018 CALL R5 2 + 0x8C140B11, // 0019 GETMET R5 R5 K17 + 0x7C140200, // 001A CALL R5 1 + 0x90021E05, // 001B SETMBR R0 K15 R5 + 0x8C140710, // 001C GETMET R5 R3 K16 + 0x541E0007, // 001D LDINT R7 8 + 0x7C140400, // 001E CALL R5 2 + 0x8C140B11, // 001F GETMET R5 R5 K17 + 0x7C140200, // 0020 CALL R5 1 + 0x90022405, // 0021 SETMBR R0 K18 R5 + 0xA80200D5, // 0022 EXBLK 0 #00F9 + 0x88140113, // 0023 GETMBR R5 R0 K19 + 0x78160067, // 0024 JMPF R5 #008D + 0xB8162800, // 0025 GETNGBL R5 K20 + 0x8C140B15, // 0026 GETMET R5 R5 K21 + 0x8C1C0516, // 0027 GETMET R7 R2 K22 + 0x58240017, // 0028 LDCONST R9 K23 + 0x58280018, // 0029 LDCONST R10 K24 + 0x582C0019, // 002A LDCONST R11 K25 + 0x543215A3, // 002B LDINT R12 5540 + 0x60340008, // 002C GETGBL R13 G8 + 0x5C380800, // 002D MOVE R14 R4 + 0x7C340200, // 002E CALL R13 1 + 0x88380112, // 002F GETMBR R14 R0 K18 + 0x883C0113, // 0030 GETMBR R15 R0 K19 + 0x7C1C1000, // 0031 CALL R7 8 + 0x5820001A, // 0032 LDCONST R8 K26 + 0x7C140600, // 0033 CALL R5 3 + 0x8C14031B, // 0034 GETMET R5 R1 K27 + 0x581C0018, // 0035 LDCONST R7 K24 + 0x58200019, // 0036 LDCONST R8 K25 + 0x542615A3, // 0037 LDINT R9 5540 + 0x5C280800, // 0038 MOVE R10 R4 + 0x882C0112, // 0039 GETMBR R11 R0 K18 + 0x88300113, // 003A GETMBR R12 R0 K19 + 0x7C140E00, // 003B CALL R5 7 + 0x50140200, // 003C LDBOOL R5 1 0 + 0x90023805, // 003D SETMBR R0 K28 R5 + 0xB8162800, // 003E GETNGBL R5 K20 + 0x8C140B15, // 003F GETMET R5 R5 K21 + 0x8C1C0516, // 0040 GETMET R7 R2 K22 + 0x5824001D, // 0041 LDCONST R9 K29 + 0x5828001E, // 0042 LDCONST R10 K30 + 0x882C0112, // 0043 GETMBR R11 R0 K18 + 0x88300113, // 0044 GETMBR R12 R0 K19 + 0x7C1C0A00, // 0045 CALL R7 5 + 0x5820001F, // 0046 LDCONST R8 K31 + 0x7C140600, // 0047 CALL R5 3 + 0x60140008, // 0048 GETGBL R5 G8 + 0x88180108, // 0049 GETMBR R6 R0 K8 + 0x541E0FFE, // 004A LDINT R7 4095 + 0x2C180C07, // 004B AND R6 R6 R7 + 0x7C140200, // 004C CALL R5 1 + 0x00164005, // 004D ADD R5 K32 R5 + 0xB81A2800, // 004E GETNGBL R6 K20 + 0x8C180D15, // 004F GETMET R6 R6 K21 + 0x00224205, // 0050 ADD R8 K33 R5 + 0x5824001F, // 0051 LDCONST R9 K31 + 0x7C180600, // 0052 CALL R6 3 + 0x8C180322, // 0053 GETMET R6 R1 K34 + 0x58200018, // 0054 LDCONST R8 K24 + 0x58240019, // 0055 LDCONST R9 K25 + 0x88280112, // 0056 GETMBR R10 R0 K18 + 0x882C0113, // 0057 GETMBR R11 R0 K19 + 0x5C300A00, // 0058 MOVE R12 R5 + 0x7C180C00, // 0059 CALL R6 6 + 0x60180008, // 005A GETGBL R6 G8 + 0x881C0108, // 005B GETMBR R7 R0 K8 + 0x54220EFF, // 005C LDINT R8 3840 + 0x2C1C0E08, // 005D AND R7 R7 R8 + 0x54220007, // 005E LDINT R8 8 + 0x3C1C0E08, // 005F SHR R7 R7 R8 + 0x7C180200, // 0060 CALL R6 1 + 0x001A4606, // 0061 ADD R6 K35 R6 + 0x5C140C00, // 0062 MOVE R5 R6 + 0xB81A2800, // 0063 GETNGBL R6 K20 + 0x8C180D15, // 0064 GETMET R6 R6 K21 + 0x00224205, // 0065 ADD R8 K33 R5 + 0x5824001F, // 0066 LDCONST R9 K31 + 0x7C180600, // 0067 CALL R6 3 + 0x8C180322, // 0068 GETMET R6 R1 K34 + 0x58200018, // 0069 LDCONST R8 K24 + 0x58240019, // 006A LDCONST R9 K25 + 0x88280112, // 006B GETMBR R10 R0 K18 + 0x882C0113, // 006C GETMBR R11 R0 K19 + 0x5C300A00, // 006D MOVE R12 R5 + 0x7C180C00, // 006E CALL R6 6 + 0x60180008, // 006F GETGBL R6 G8 + 0x881C0104, // 0070 GETMBR R7 R0 K4 + 0x7C180200, // 0071 CALL R6 1 + 0x001A4806, // 0072 ADD R6 K36 R6 + 0x5C140C00, // 0073 MOVE R5 R6 + 0xB81A2800, // 0074 GETNGBL R6 K20 + 0x8C180D15, // 0075 GETMET R6 R6 K21 + 0x00224205, // 0076 ADD R8 K33 R5 + 0x5824001F, // 0077 LDCONST R9 K31 + 0x7C180600, // 0078 CALL R6 3 + 0x8C180322, // 0079 GETMET R6 R1 K34 + 0x58200018, // 007A LDCONST R8 K24 + 0x58240019, // 007B LDCONST R9 K25 + 0x88280112, // 007C GETMBR R10 R0 K18 + 0x882C0113, // 007D GETMBR R11 R0 K19 + 0x5C300A00, // 007E MOVE R12 R5 + 0x7C180C00, // 007F CALL R6 6 + 0x58140025, // 0080 LDCONST R5 K37 + 0xB81A2800, // 0081 GETNGBL R6 K20 + 0x8C180D15, // 0082 GETMET R6 R6 K21 + 0x00224205, // 0083 ADD R8 K33 R5 + 0x5824001F, // 0084 LDCONST R9 K31 + 0x7C180600, // 0085 CALL R6 3 + 0x8C180322, // 0086 GETMET R6 R1 K34 + 0x58200018, // 0087 LDCONST R8 K24 + 0x58240019, // 0088 LDCONST R9 K25 + 0x88280112, // 0089 GETMBR R10 R0 K18 + 0x882C0113, // 008A GETMBR R11 R0 K19 + 0x5C300A00, // 008B MOVE R12 R5 + 0x7C180C00, // 008C CALL R6 6 + 0x88140126, // 008D GETMBR R5 R0 K38 + 0x78160067, // 008E JMPF R5 #00F7 + 0xB8162800, // 008F GETNGBL R5 K20 + 0x8C140B15, // 0090 GETMET R5 R5 K21 + 0x8C1C0516, // 0091 GETMET R7 R2 K22 + 0x58240017, // 0092 LDCONST R9 K23 + 0x58280018, // 0093 LDCONST R10 K24 + 0x582C0019, // 0094 LDCONST R11 K25 + 0x543215A3, // 0095 LDINT R12 5540 + 0x60340008, // 0096 GETGBL R13 G8 + 0x5C380800, // 0097 MOVE R14 R4 + 0x7C340200, // 0098 CALL R13 1 + 0x8838010F, // 0099 GETMBR R14 R0 K15 + 0x883C0126, // 009A GETMBR R15 R0 K38 + 0x7C1C1000, // 009B CALL R7 8 + 0x5820001A, // 009C LDCONST R8 K26 + 0x7C140600, // 009D CALL R5 3 + 0x8C14031B, // 009E GETMET R5 R1 K27 + 0x581C0018, // 009F LDCONST R7 K24 + 0x58200019, // 00A0 LDCONST R8 K25 + 0x542615A3, // 00A1 LDINT R9 5540 + 0x5C280800, // 00A2 MOVE R10 R4 + 0x882C010F, // 00A3 GETMBR R11 R0 K15 + 0x88300126, // 00A4 GETMBR R12 R0 K38 + 0x7C140E00, // 00A5 CALL R5 7 + 0x50140200, // 00A6 LDBOOL R5 1 0 + 0x90024E05, // 00A7 SETMBR R0 K39 R5 + 0xB8162800, // 00A8 GETNGBL R5 K20 + 0x8C140B15, // 00A9 GETMET R5 R5 K21 + 0x8C1C0516, // 00AA GETMET R7 R2 K22 + 0x58240028, // 00AB LDCONST R9 K40 + 0x58280029, // 00AC LDCONST R10 K41 + 0x882C010F, // 00AD GETMBR R11 R0 K15 + 0x88300126, // 00AE GETMBR R12 R0 K38 + 0x7C1C0A00, // 00AF CALL R7 5 + 0x5820001F, // 00B0 LDCONST R8 K31 + 0x7C140600, // 00B1 CALL R5 3 + 0x60140008, // 00B2 GETGBL R5 G8 + 0x88180108, // 00B3 GETMBR R6 R0 K8 + 0x541E0FFE, // 00B4 LDINT R7 4095 + 0x2C180C07, // 00B5 AND R6 R6 R7 + 0x7C140200, // 00B6 CALL R5 1 + 0x00164005, // 00B7 ADD R5 K32 R5 + 0xB81A2800, // 00B8 GETNGBL R6 K20 + 0x8C180D15, // 00B9 GETMET R6 R6 K21 + 0x00224205, // 00BA ADD R8 K33 R5 + 0x5824001F, // 00BB LDCONST R9 K31 + 0x7C180600, // 00BC CALL R6 3 + 0x8C180322, // 00BD GETMET R6 R1 K34 + 0x58200018, // 00BE LDCONST R8 K24 + 0x58240019, // 00BF LDCONST R9 K25 + 0x8828010F, // 00C0 GETMBR R10 R0 K15 + 0x882C0126, // 00C1 GETMBR R11 R0 K38 + 0x5C300A00, // 00C2 MOVE R12 R5 + 0x7C180C00, // 00C3 CALL R6 6 + 0x60180008, // 00C4 GETGBL R6 G8 + 0x881C0108, // 00C5 GETMBR R7 R0 K8 + 0x54220EFF, // 00C6 LDINT R8 3840 + 0x2C1C0E08, // 00C7 AND R7 R7 R8 + 0x54220007, // 00C8 LDINT R8 8 + 0x3C1C0E08, // 00C9 SHR R7 R7 R8 + 0x7C180200, // 00CA CALL R6 1 + 0x001A4606, // 00CB ADD R6 K35 R6 + 0x5C140C00, // 00CC MOVE R5 R6 + 0xB81A2800, // 00CD GETNGBL R6 K20 + 0x8C180D15, // 00CE GETMET R6 R6 K21 + 0x00224205, // 00CF ADD R8 K33 R5 + 0x5824001F, // 00D0 LDCONST R9 K31 + 0x7C180600, // 00D1 CALL R6 3 + 0x8C180322, // 00D2 GETMET R6 R1 K34 + 0x58200018, // 00D3 LDCONST R8 K24 + 0x58240019, // 00D4 LDCONST R9 K25 + 0x8828010F, // 00D5 GETMBR R10 R0 K15 + 0x882C0126, // 00D6 GETMBR R11 R0 K38 + 0x5C300A00, // 00D7 MOVE R12 R5 + 0x7C180C00, // 00D8 CALL R6 6 + 0x60180008, // 00D9 GETGBL R6 G8 + 0x881C0104, // 00DA GETMBR R7 R0 K4 + 0x7C180200, // 00DB CALL R6 1 + 0x001A4806, // 00DC ADD R6 K36 R6 + 0x5C140C00, // 00DD MOVE R5 R6 + 0xB81A2800, // 00DE GETNGBL R6 K20 + 0x8C180D15, // 00DF GETMET R6 R6 K21 + 0x00224205, // 00E0 ADD R8 K33 R5 + 0x5824001F, // 00E1 LDCONST R9 K31 + 0x7C180600, // 00E2 CALL R6 3 + 0x8C180322, // 00E3 GETMET R6 R1 K34 + 0x58200018, // 00E4 LDCONST R8 K24 + 0x58240019, // 00E5 LDCONST R9 K25 + 0x8828010F, // 00E6 GETMBR R10 R0 K15 + 0x882C0126, // 00E7 GETMBR R11 R0 K38 + 0x5C300A00, // 00E8 MOVE R12 R5 + 0x7C180C00, // 00E9 CALL R6 6 + 0x58140025, // 00EA LDCONST R5 K37 + 0xB81A2800, // 00EB GETNGBL R6 K20 + 0x8C180D15, // 00EC GETMET R6 R6 K21 + 0x00224205, // 00ED ADD R8 K33 R5 + 0x5824001F, // 00EE LDCONST R9 K31 + 0x7C180600, // 00EF CALL R6 3 + 0x8C180322, // 00F0 GETMET R6 R1 K34 + 0x58200018, // 00F1 LDCONST R8 K24 + 0x58240019, // 00F2 LDCONST R9 K25 + 0x8828010F, // 00F3 GETMBR R10 R0 K15 + 0x882C0126, // 00F4 GETMBR R11 R0 K38 + 0x5C300A00, // 00F5 MOVE R12 R5 + 0x7C180C00, // 00F6 CALL R6 6 + 0xA8040001, // 00F7 EXBLK 1 1 + 0x70020010, // 00F8 JMP #010A + 0xAC140002, // 00F9 CATCH R5 0 2 + 0x7002000D, // 00FA JMP #0109 + 0xB81E2800, // 00FB GETNGBL R7 K20 + 0x8C1C0F15, // 00FC GETMET R7 R7 K21 + 0x60240008, // 00FD GETGBL R9 G8 + 0x5C280A00, // 00FE MOVE R10 R5 + 0x7C240200, // 00FF CALL R9 1 + 0x00265409, // 0100 ADD R9 K42 R9 + 0x0024132B, // 0101 ADD R9 R9 K43 + 0x60280008, // 0102 GETGBL R10 G8 + 0x5C2C0C00, // 0103 MOVE R11 R6 + 0x7C280200, // 0104 CALL R10 1 + 0x0024120A, // 0105 ADD R9 R9 R10 + 0x5828001F, // 0106 LDCONST R10 K31 + 0x7C1C0600, // 0107 CALL R7 3 + 0x70020000, // 0108 JMP #010A + 0xB0080000, // 0109 RAISE 2 R0 R0 + 0x80000000, // 010A RET 0 }) ) ); @@ -3156,1503 +4970,11 @@ be_local_closure(Matter_Device_start_mdns_announce_hostnames, /* name */ /******************************************************************** -** Solidified function: MtrJoin +** Solidified function: get_active_endpoints ********************************************************************/ -be_local_closure(Matter_Device_MtrJoin, /* name */ - be_nested_proto( - 8, /* nstack */ - 5, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 4]) { /* constants */ - /* K0 */ be_nested_str_weak(start_root_basic_commissioning), - /* K1 */ be_nested_str_weak(stop_basic_commissioning), - /* K2 */ be_nested_str_weak(tasmota), - /* K3 */ be_nested_str_weak(resp_cmnd_done), - }), - be_str_weak(MtrJoin), - &be_const_str_solidified, - ( &(const binstruction[13]) { /* code */ - 0x60140009, // 0000 GETGBL R5 G9 - 0x5C180600, // 0001 MOVE R6 R3 - 0x7C140200, // 0002 CALL R5 1 - 0x78160002, // 0003 JMPF R5 #0007 - 0x8C180100, // 0004 GETMET R6 R0 K0 - 0x7C180200, // 0005 CALL R6 1 - 0x70020001, // 0006 JMP #0009 - 0x8C180101, // 0007 GETMET R6 R0 K1 - 0x7C180200, // 0008 CALL R6 1 - 0xB81A0400, // 0009 GETNGBL R6 K2 - 0x8C180D03, // 000A GETMET R6 R6 K3 - 0x7C180200, // 000B CALL R6 1 - 0x80000000, // 000C RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: _load_plugins_config -********************************************************************/ -be_local_closure(Matter_Device__load_plugins_config, /* name */ - be_nested_proto( - 19, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[27]) { /* constants */ - /* K0 */ be_nested_str_weak(string), - /* K1 */ be_nested_str_weak(k2l_num), - /* K2 */ be_nested_str_weak(tasmota), - /* K3 */ be_nested_str_weak(log), - /* K4 */ be_nested_str_weak(MTR_X3A_X20endpoints_X20to_X20be_X20configured_X20), - /* K5 */ be_const_int(3), - /* K6 */ be_nested_str_weak(format), - /* K7 */ be_nested_str_weak(MTR_X3A_X20endpoint_X20_X25i_X20config_X20_X25s), - /* K8 */ be_nested_str_weak(find), - /* K9 */ be_nested_str_weak(type), - /* K10 */ be_nested_str_weak(MTR_X3A_X20no_X20class_X20name_X2C_X20skipping), - /* K11 */ be_nested_str_weak(plugins_classes), - /* K12 */ be_nested_str_weak(MTR_X3A_X20unknown_X20class_X20name_X20_X27), - /* K13 */ be_nested_str_weak(_X27_X20skipping), - /* K14 */ be_const_int(2), - /* K15 */ be_nested_str_weak(plugins), - /* K16 */ be_nested_str_weak(push), - /* K17 */ be_nested_str_weak(), - /* K18 */ be_nested_str_weak(k2l), - /* K19 */ be_nested_str_weak(_X20_X25s_X3A_X25s), - /* K20 */ be_nested_str_weak(stop_iteration), - /* K21 */ be_nested_str_weak(MTR_X3A_X20endpoint_X3A_X25i_X20type_X3A_X25s_X25s), - /* K22 */ be_nested_str_weak(MTR_X3A_X20Exception), - /* K23 */ be_nested_str_weak(_X7C), - /* K24 */ be_nested_str_weak(publish_result), - /* K25 */ be_nested_str_weak(_X7B_X22Matter_X22_X3A_X7B_X22Initialized_X22_X3A1_X7D_X7D), - /* K26 */ be_nested_str_weak(Matter), - }), - be_str_weak(_load_plugins_config), - &be_const_str_solidified, - ( &(const binstruction[133]) { /* code */ - 0xA40A0000, // 0000 IMPORT R2 K0 - 0x8C0C0101, // 0001 GETMET R3 R0 K1 - 0x5C140200, // 0002 MOVE R5 R1 - 0x7C0C0400, // 0003 CALL R3 2 - 0xB8120400, // 0004 GETNGBL R4 K2 - 0x8C100903, // 0005 GETMET R4 R4 K3 - 0x60180008, // 0006 GETGBL R6 G8 - 0x5C1C0600, // 0007 MOVE R7 R3 - 0x7C180200, // 0008 CALL R6 1 - 0x001A0806, // 0009 ADD R6 K4 R6 - 0x581C0005, // 000A LDCONST R7 K5 - 0x7C100600, // 000B CALL R4 3 - 0x60100010, // 000C GETGBL R4 G16 - 0x5C140600, // 000D MOVE R5 R3 - 0x7C100200, // 000E CALL R4 1 - 0xA802006B, // 000F EXBLK 0 #007C - 0x5C140800, // 0010 MOVE R5 R4 - 0x7C140000, // 0011 CALL R5 0 - 0xA8020056, // 0012 EXBLK 0 #006A - 0x60180008, // 0013 GETGBL R6 G8 - 0x5C1C0A00, // 0014 MOVE R7 R5 - 0x7C180200, // 0015 CALL R6 1 - 0x94180206, // 0016 GETIDX R6 R1 R6 - 0xB81E0400, // 0017 GETNGBL R7 K2 - 0x8C1C0F03, // 0018 GETMET R7 R7 K3 - 0x8C240506, // 0019 GETMET R9 R2 K6 - 0x582C0007, // 001A LDCONST R11 K7 - 0x5C300A00, // 001B MOVE R12 R5 - 0x5C340C00, // 001C MOVE R13 R6 - 0x7C240800, // 001D CALL R9 4 - 0x58280005, // 001E LDCONST R10 K5 - 0x7C1C0600, // 001F CALL R7 3 - 0x8C1C0D08, // 0020 GETMET R7 R6 K8 - 0x58240009, // 0021 LDCONST R9 K9 - 0x7C1C0400, // 0022 CALL R7 2 - 0x4C200000, // 0023 LDNIL R8 - 0x1C200E08, // 0024 EQ R8 R7 R8 - 0x78220006, // 0025 JMPF R8 #002D - 0xB8220400, // 0026 GETNGBL R8 K2 - 0x8C201103, // 0027 GETMET R8 R8 K3 - 0x5828000A, // 0028 LDCONST R10 K10 - 0x582C0005, // 0029 LDCONST R11 K5 - 0x7C200600, // 002A CALL R8 3 - 0xA8040001, // 002B EXBLK 1 1 - 0x7001FFE2, // 002C JMP #0010 - 0x8820010B, // 002D GETMBR R8 R0 K11 - 0x8C201108, // 002E GETMET R8 R8 K8 - 0x5C280E00, // 002F MOVE R10 R7 - 0x7C200400, // 0030 CALL R8 2 - 0x4C240000, // 0031 LDNIL R9 - 0x1C241009, // 0032 EQ R9 R8 R9 - 0x7826000A, // 0033 JMPF R9 #003F - 0xB8260400, // 0034 GETNGBL R9 K2 - 0x8C241303, // 0035 GETMET R9 R9 K3 - 0x602C0008, // 0036 GETGBL R11 G8 - 0x5C300E00, // 0037 MOVE R12 R7 - 0x7C2C0200, // 0038 CALL R11 1 - 0x002E180B, // 0039 ADD R11 K12 R11 - 0x002C170D, // 003A ADD R11 R11 K13 - 0x5830000E, // 003B LDCONST R12 K14 - 0x7C240600, // 003C CALL R9 3 - 0xA8040001, // 003D EXBLK 1 1 - 0x7001FFD0, // 003E JMP #0010 - 0x5C241000, // 003F MOVE R9 R8 - 0x5C280000, // 0040 MOVE R10 R0 - 0x5C2C0A00, // 0041 MOVE R11 R5 - 0x5C300C00, // 0042 MOVE R12 R6 - 0x7C240600, // 0043 CALL R9 3 - 0x8828010F, // 0044 GETMBR R10 R0 K15 - 0x8C281510, // 0045 GETMET R10 R10 K16 - 0x5C301200, // 0046 MOVE R12 R9 - 0x7C280400, // 0047 CALL R10 2 - 0x58280011, // 0048 LDCONST R10 K17 - 0x602C0010, // 0049 GETGBL R11 G16 - 0x8C300112, // 004A GETMET R12 R0 K18 - 0x5C380C00, // 004B MOVE R14 R6 - 0x7C300400, // 004C CALL R12 2 - 0x7C2C0200, // 004D CALL R11 1 - 0xA802000B, // 004E EXBLK 0 #005B - 0x5C301600, // 004F MOVE R12 R11 - 0x7C300000, // 0050 CALL R12 0 - 0x1C341909, // 0051 EQ R13 R12 K9 - 0x78360000, // 0052 JMPF R13 #0054 - 0x7001FFFA, // 0053 JMP #004F - 0x8C340506, // 0054 GETMET R13 R2 K6 - 0x583C0013, // 0055 LDCONST R15 K19 - 0x5C401800, // 0056 MOVE R16 R12 - 0x94440C0C, // 0057 GETIDX R17 R6 R12 - 0x7C340800, // 0058 CALL R13 4 - 0x0028140D, // 0059 ADD R10 R10 R13 - 0x7001FFF3, // 005A JMP #004F - 0x582C0014, // 005B LDCONST R11 K20 - 0xAC2C0200, // 005C CATCH R11 1 0 - 0xB0080000, // 005D RAISE 2 R0 R0 - 0xB82E0400, // 005E GETNGBL R11 K2 - 0x8C2C1703, // 005F GETMET R11 R11 K3 - 0x8C340506, // 0060 GETMET R13 R2 K6 - 0x583C0015, // 0061 LDCONST R15 K21 - 0x5C400A00, // 0062 MOVE R16 R5 - 0x5C440E00, // 0063 MOVE R17 R7 - 0x5C481400, // 0064 MOVE R18 R10 - 0x7C340A00, // 0065 CALL R13 5 - 0x5838000E, // 0066 LDCONST R14 K14 - 0x7C2C0600, // 0067 CALL R11 3 - 0xA8040001, // 0068 EXBLK 1 1 - 0x70020010, // 0069 JMP #007B - 0xAC180002, // 006A CATCH R6 0 2 - 0x7002000D, // 006B JMP #007A - 0xB8220400, // 006C GETNGBL R8 K2 - 0x8C201103, // 006D GETMET R8 R8 K3 - 0x60280008, // 006E GETGBL R10 G8 - 0x5C2C0C00, // 006F MOVE R11 R6 - 0x7C280200, // 0070 CALL R10 1 - 0x002A2C0A, // 0071 ADD R10 K22 R10 - 0x00281517, // 0072 ADD R10 R10 K23 - 0x602C0008, // 0073 GETGBL R11 G8 - 0x5C300E00, // 0074 MOVE R12 R7 - 0x7C2C0200, // 0075 CALL R11 1 - 0x0028140B, // 0076 ADD R10 R10 R11 - 0x582C000E, // 0077 LDCONST R11 K14 - 0x7C200600, // 0078 CALL R8 3 - 0x70020000, // 0079 JMP #007B - 0xB0080000, // 007A RAISE 2 R0 R0 - 0x7001FF93, // 007B JMP #0010 - 0x58100014, // 007C LDCONST R4 K20 - 0xAC100200, // 007D CATCH R4 1 0 - 0xB0080000, // 007E RAISE 2 R0 R0 - 0xB8120400, // 007F GETNGBL R4 K2 - 0x8C100918, // 0080 GETMET R4 R4 K24 - 0x58180019, // 0081 LDCONST R6 K25 - 0x581C001A, // 0082 LDCONST R7 K26 - 0x7C100600, // 0083 CALL R4 3 - 0x80000000, // 0084 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: save_before_restart -********************************************************************/ -be_local_closure(Matter_Device_save_before_restart, /* name */ - be_nested_proto( - 3, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 2]) { /* constants */ - /* K0 */ be_nested_str_weak(stop_basic_commissioning), - /* K1 */ be_nested_str_weak(mdns_remove_op_discovery_all_fabrics), - }), - be_str_weak(save_before_restart), - &be_const_str_solidified, - ( &(const binstruction[ 5]) { /* code */ - 0x8C040100, // 0000 GETMET R1 R0 K0 - 0x7C040200, // 0001 CALL R1 1 - 0x8C040101, // 0002 GETMET R1 R0 K1 - 0x7C040200, // 0003 CALL R1 1 - 0x80000000, // 0004 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: start_root_basic_commissioning -********************************************************************/ -be_local_closure(Matter_Device_start_root_basic_commissioning, /* name */ - be_nested_proto( - 14, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[23]) { /* constants */ - /* K0 */ be_nested_str_weak(string), - /* K1 */ be_nested_str_weak(PASE_TIMEOUT), - /* K2 */ be_nested_str_weak(compute_manual_pairing_code), - /* K3 */ be_nested_str_weak(tasmota), - /* K4 */ be_nested_str_weak(log), - /* K5 */ be_nested_str_weak(format), - /* K6 */ be_nested_str_weak(MTR_X3A_X20Manual_X20pairing_X20code_X3A_X20_X25s_X2D_X25s_X2D_X25s), - /* K7 */ be_const_int(0), - /* K8 */ be_const_int(3), - /* K9 */ be_const_int(2147483647), - /* K10 */ be_const_int(2), - /* K11 */ be_nested_str_weak(compute_qrcode_content), - /* K12 */ be_nested_str_weak(publish_result), - /* K13 */ be_nested_str_weak(_X7B_X22Matter_X22_X3A_X7B_X22Commissioning_X22_X3A1_X2C_X22PairingCode_X22_X3A_X22_X25s_X22_X2C_X22QRCode_X22_X3A_X22_X25s_X22_X7D_X7D), - /* K14 */ be_nested_str_weak(Matter), - /* K15 */ be_nested_str_weak(_compute_pbkdf), - /* K16 */ be_nested_str_weak(root_passcode), - /* K17 */ be_nested_str_weak(root_iterations), - /* K18 */ be_nested_str_weak(root_salt), - /* K19 */ be_nested_str_weak(start_basic_commissioning), - /* K20 */ be_nested_str_weak(root_discriminator), - /* K21 */ be_nested_str_weak(root_w0), - /* K22 */ be_nested_str_weak(root_L), - }), - be_str_weak(start_root_basic_commissioning), - &be_const_str_solidified, - ( &(const binstruction[49]) { /* code */ - 0xA40A0000, // 0000 IMPORT R2 K0 - 0x4C0C0000, // 0001 LDNIL R3 - 0x1C0C0203, // 0002 EQ R3 R1 R3 - 0x780E0000, // 0003 JMPF R3 #0005 - 0x88040101, // 0004 GETMBR R1 R0 K1 - 0x8C0C0102, // 0005 GETMET R3 R0 K2 - 0x7C0C0200, // 0006 CALL R3 1 - 0xB8120600, // 0007 GETNGBL R4 K3 - 0x8C100904, // 0008 GETMET R4 R4 K4 - 0x8C180505, // 0009 GETMET R6 R2 K5 - 0x58200006, // 000A LDCONST R8 K6 - 0x40260F08, // 000B CONNECT R9 K7 K8 - 0x94240609, // 000C GETIDX R9 R3 R9 - 0x542A0003, // 000D LDINT R10 4 - 0x542E0005, // 000E LDINT R11 6 - 0x4028140B, // 000F CONNECT R10 R10 R11 - 0x9428060A, // 0010 GETIDX R10 R3 R10 - 0x542E0006, // 0011 LDINT R11 7 - 0x402C1709, // 0012 CONNECT R11 R11 K9 - 0x942C060B, // 0013 GETIDX R11 R3 R11 - 0x7C180A00, // 0014 CALL R6 5 - 0x581C000A, // 0015 LDCONST R7 K10 - 0x7C100600, // 0016 CALL R4 3 - 0x8C10010B, // 0017 GETMET R4 R0 K11 - 0x7C100200, // 0018 CALL R4 1 - 0xB8160600, // 0019 GETNGBL R5 K3 - 0x8C140B0C, // 001A GETMET R5 R5 K12 - 0x8C1C0505, // 001B GETMET R7 R2 K5 - 0x5824000D, // 001C LDCONST R9 K13 - 0x5C280600, // 001D MOVE R10 R3 - 0x5C2C0800, // 001E MOVE R11 R4 - 0x7C1C0800, // 001F CALL R7 4 - 0x5820000E, // 0020 LDCONST R8 K14 - 0x7C140600, // 0021 CALL R5 3 - 0x8C14010F, // 0022 GETMET R5 R0 K15 - 0x881C0110, // 0023 GETMBR R7 R0 K16 - 0x88200111, // 0024 GETMBR R8 R0 K17 - 0x88240112, // 0025 GETMBR R9 R0 K18 - 0x7C140800, // 0026 CALL R5 4 - 0x8C140113, // 0027 GETMET R5 R0 K19 - 0x5C1C0200, // 0028 MOVE R7 R1 - 0x88200111, // 0029 GETMBR R8 R0 K17 - 0x88240114, // 002A GETMBR R9 R0 K20 - 0x88280112, // 002B GETMBR R10 R0 K18 - 0x882C0115, // 002C GETMBR R11 R0 K21 - 0x88300116, // 002D GETMBR R12 R0 K22 - 0x4C340000, // 002E LDNIL R13 - 0x7C141000, // 002F CALL R5 8 - 0x80000000, // 0030 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: received_ack -********************************************************************/ -be_local_closure(Matter_Device_received_ack, /* name */ - be_nested_proto( - 5, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 2]) { /* constants */ - /* K0 */ be_nested_str_weak(udp_server), - /* K1 */ be_nested_str_weak(received_ack), - }), - be_str_weak(received_ack), - &be_const_str_solidified, - ( &(const binstruction[ 5]) { /* code */ - 0x88080100, // 0000 GETMBR R2 R0 K0 - 0x8C080501, // 0001 GETMET R2 R2 K1 - 0x5C100200, // 0002 MOVE R4 R1 - 0x7C080400, // 0003 CALL R2 2 - 0x80040400, // 0004 RET 1 R2 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: _compute_pbkdf -********************************************************************/ -be_local_closure(Matter_Device__compute_pbkdf, /* name */ - be_nested_proto( - 14, /* nstack */ - 4, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[11]) { /* constants */ - /* K0 */ be_nested_str_weak(crypto), - /* K1 */ be_nested_str_weak(string), - /* K2 */ be_nested_str_weak(add), - /* K3 */ be_nested_str_weak(PBKDF2_HMAC_SHA256), - /* K4 */ be_nested_str_weak(derive), - /* K5 */ be_const_int(0), - /* K6 */ be_nested_str_weak(root_w0), - /* K7 */ be_nested_str_weak(EC_P256), - /* K8 */ be_nested_str_weak(mod), - /* K9 */ be_nested_str_weak(root_L), - /* K10 */ be_nested_str_weak(public_key), - }), - be_str_weak(_compute_pbkdf), - &be_const_str_solidified, - ( &(const binstruction[41]) { /* code */ - 0xA4120000, // 0000 IMPORT R4 K0 - 0xA4160200, // 0001 IMPORT R5 K1 - 0x60180015, // 0002 GETGBL R6 G21 - 0x7C180000, // 0003 CALL R6 0 - 0x8C180D02, // 0004 GETMET R6 R6 K2 - 0x5C200200, // 0005 MOVE R8 R1 - 0x54260003, // 0006 LDINT R9 4 - 0x7C180600, // 0007 CALL R6 3 - 0x8C1C0903, // 0008 GETMET R7 R4 K3 - 0x7C1C0200, // 0009 CALL R7 1 - 0x8C1C0F04, // 000A GETMET R7 R7 K4 - 0x5C240C00, // 000B MOVE R9 R6 - 0x5C280600, // 000C MOVE R10 R3 - 0x5C2C0400, // 000D MOVE R11 R2 - 0x5432004F, // 000E LDINT R12 80 - 0x7C1C0A00, // 000F CALL R7 5 - 0x54220026, // 0010 LDINT R8 39 - 0x40220A08, // 0011 CONNECT R8 K5 R8 - 0x94200E08, // 0012 GETIDX R8 R7 R8 - 0x54260027, // 0013 LDINT R9 40 - 0x542A004E, // 0014 LDINT R10 79 - 0x4024120A, // 0015 CONNECT R9 R9 R10 - 0x94240E09, // 0016 GETIDX R9 R7 R9 - 0x8C280907, // 0017 GETMET R10 R4 K7 - 0x7C280200, // 0018 CALL R10 1 - 0x8C281508, // 0019 GETMET R10 R10 K8 - 0x5C301000, // 001A MOVE R12 R8 - 0x7C280400, // 001B CALL R10 2 - 0x90020C0A, // 001C SETMBR R0 K6 R10 - 0x8C280907, // 001D GETMET R10 R4 K7 - 0x7C280200, // 001E CALL R10 1 - 0x8C281508, // 001F GETMET R10 R10 K8 - 0x5C301200, // 0020 MOVE R12 R9 - 0x7C280400, // 0021 CALL R10 2 - 0x8C2C0907, // 0022 GETMET R11 R4 K7 - 0x7C2C0200, // 0023 CALL R11 1 - 0x8C2C170A, // 0024 GETMET R11 R11 K10 - 0x5C341400, // 0025 MOVE R13 R10 - 0x7C2C0400, // 0026 CALL R11 2 - 0x9002120B, // 0027 SETMBR R0 K9 R11 - 0x80000000, // 0028 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: start_commissioning_complete_deferred -********************************************************************/ -be_local_closure(Matter_Device_start_commissioning_complete_deferred, /* name */ - be_nested_proto( - 6, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 1, /* has sup protos */ - ( &(const struct bproto*[ 1]) { - be_nested_proto( - 3, /* nstack */ - 0, /* argc */ - 0, /* varg */ - 1, /* has upvals */ - ( &(const bupvaldesc[ 2]) { /* upvals */ - be_local_const_upval(1, 0), - be_local_const_upval(1, 1), - }), - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 1]) { /* constants */ - /* K0 */ be_nested_str_weak(start_commissioning_complete), - }), - be_str_weak(_X3Clambda_X3E), - &be_const_str_solidified, - ( &(const binstruction[ 5]) { /* code */ - 0x68000000, // 0000 GETUPV R0 U0 - 0x8C000100, // 0001 GETMET R0 R0 K0 - 0x68080001, // 0002 GETUPV R2 U1 - 0x7C000400, // 0003 CALL R0 2 - 0x80040000, // 0004 RET 1 R0 - }) - ), - }), - 1, /* has constants */ - ( &(const bvalue[ 3]) { /* constants */ - /* K0 */ be_nested_str_weak(tasmota), - /* K1 */ be_nested_str_weak(set_timer), - /* K2 */ be_const_int(0), - }), - be_str_weak(start_commissioning_complete_deferred), - &be_const_str_solidified, - ( &(const binstruction[ 7]) { /* code */ - 0xB80A0000, // 0000 GETNGBL R2 K0 - 0x8C080501, // 0001 GETMET R2 R2 K1 - 0x58100002, // 0002 LDCONST R4 K2 - 0x84140000, // 0003 CLOSURE R5 P0 - 0x7C080600, // 0004 CALL R2 3 - 0xA0000000, // 0005 CLOSE R0 - 0x80000000, // 0006 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: start_basic_commissioning -********************************************************************/ -be_local_closure(Matter_Device_start_basic_commissioning, /* name */ - be_nested_proto( - 13, /* nstack */ - 8, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 1, /* has sup protos */ - ( &(const struct bproto*[ 2]) { - be_nested_proto( - 4, /* nstack */ - 0, /* argc */ - 0, /* varg */ - 1, /* has upvals */ - ( &(const bupvaldesc[ 1]) { /* upvals */ - be_local_const_upval(1, 0), - }), - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 4]) { /* constants */ - /* K0 */ be_nested_str_weak(mdns_announce_PASE), - /* K1 */ be_nested_str_weak(tasmota), - /* K2 */ be_nested_str_weak(remove_rule), - /* K3 */ be_nested_str_weak(Wifi_X23Connected), - }), - be_str_weak(_anonymous_), - &be_const_str_solidified, - ( &(const binstruction[ 9]) { /* code */ - 0x68000000, // 0000 GETUPV R0 U0 - 0x8C000100, // 0001 GETMET R0 R0 K0 - 0x7C000200, // 0002 CALL R0 1 - 0xB8020200, // 0003 GETNGBL R0 K1 - 0x8C000102, // 0004 GETMET R0 R0 K2 - 0x58080003, // 0005 LDCONST R2 K3 - 0x580C0000, // 0006 LDCONST R3 K0 - 0x7C000600, // 0007 CALL R0 3 - 0x80000000, // 0008 RET 0 - }) - ), - be_nested_proto( - 4, /* nstack */ - 0, /* argc */ - 0, /* varg */ - 1, /* has upvals */ - ( &(const bupvaldesc[ 1]) { /* upvals */ - be_local_const_upval(1, 0), - }), - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 4]) { /* constants */ - /* K0 */ be_nested_str_weak(mdns_announce_PASE), - /* K1 */ be_nested_str_weak(tasmota), - /* K2 */ be_nested_str_weak(remove_rule), - /* K3 */ be_nested_str_weak(Eth_X23Connected), - }), - be_str_weak(_anonymous_), - &be_const_str_solidified, - ( &(const binstruction[ 9]) { /* code */ - 0x68000000, // 0000 GETUPV R0 U0 - 0x8C000100, // 0001 GETMET R0 R0 K0 - 0x7C000200, // 0002 CALL R0 1 - 0xB8020200, // 0003 GETNGBL R0 K1 - 0x8C000102, // 0004 GETMET R0 R0 K2 - 0x58080003, // 0005 LDCONST R2 K3 - 0x580C0000, // 0006 LDCONST R3 K0 - 0x7C000600, // 0007 CALL R0 3 - 0x80000000, // 0008 RET 0 - }) - ), - }), - 1, /* has constants */ - ( &(const bvalue[16]) { /* constants */ - /* K0 */ be_nested_str_weak(commissioning_open), - /* K1 */ be_nested_str_weak(tasmota), - /* K2 */ be_nested_str_weak(millis), - /* K3 */ be_nested_str_weak(commissioning_iterations), - /* K4 */ be_nested_str_weak(commissioning_discriminator), - /* K5 */ be_nested_str_weak(commissioning_salt), - /* K6 */ be_nested_str_weak(commissioning_w0), - /* K7 */ be_nested_str_weak(commissioning_L), - /* K8 */ be_nested_str_weak(commissioning_admin_fabric), - /* K9 */ be_nested_str_weak(wifi), - /* K10 */ be_nested_str_weak(up), - /* K11 */ be_nested_str_weak(eth), - /* K12 */ be_nested_str_weak(mdns_announce_PASE), - /* K13 */ be_nested_str_weak(add_rule), - /* K14 */ be_nested_str_weak(Wifi_X23Connected), - /* K15 */ be_nested_str_weak(Eth_X23Connected), - }), - be_str_weak(start_basic_commissioning), - &be_const_str_solidified, - ( &(const binstruction[40]) { /* code */ - 0xB8220200, // 0000 GETNGBL R8 K1 - 0x8C201102, // 0001 GETMET R8 R8 K2 - 0x7C200200, // 0002 CALL R8 1 - 0x542603E7, // 0003 LDINT R9 1000 - 0x08240209, // 0004 MUL R9 R1 R9 - 0x00201009, // 0005 ADD R8 R8 R9 - 0x90020008, // 0006 SETMBR R0 K0 R8 - 0x90020602, // 0007 SETMBR R0 K3 R2 - 0x90020803, // 0008 SETMBR R0 K4 R3 - 0x90020A04, // 0009 SETMBR R0 K5 R4 - 0x90020C05, // 000A SETMBR R0 K6 R5 - 0x90020E06, // 000B SETMBR R0 K7 R6 - 0x90021007, // 000C SETMBR R0 K8 R7 - 0xB8220200, // 000D GETNGBL R8 K1 - 0x8C201109, // 000E GETMET R8 R8 K9 - 0x7C200200, // 000F CALL R8 1 - 0x9420110A, // 0010 GETIDX R8 R8 K10 - 0x74220004, // 0011 JMPT R8 #0017 - 0xB8220200, // 0012 GETNGBL R8 K1 - 0x8C20110B, // 0013 GETMET R8 R8 K11 - 0x7C200200, // 0014 CALL R8 1 - 0x9420110A, // 0015 GETIDX R8 R8 K10 - 0x78220002, // 0016 JMPF R8 #001A - 0x8C20010C, // 0017 GETMET R8 R0 K12 - 0x7C200200, // 0018 CALL R8 1 - 0x7002000B, // 0019 JMP #0026 - 0xB8220200, // 001A GETNGBL R8 K1 - 0x8C20110D, // 001B GETMET R8 R8 K13 - 0x5828000E, // 001C LDCONST R10 K14 - 0x842C0000, // 001D CLOSURE R11 P0 - 0x5830000C, // 001E LDCONST R12 K12 - 0x7C200800, // 001F CALL R8 4 - 0xB8220200, // 0020 GETNGBL R8 K1 - 0x8C20110D, // 0021 GETMET R8 R8 K13 - 0x5828000F, // 0022 LDCONST R10 K15 - 0x842C0001, // 0023 CLOSURE R11 P1 - 0x5830000C, // 0024 LDCONST R12 K12 - 0x7C200800, // 0025 CALL R8 4 - 0xA0000000, // 0026 CLOSE R0 - 0x80000000, // 0027 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: mdns_announce_op_discovery_all_fabrics -********************************************************************/ -be_local_closure(Matter_Device_mdns_announce_op_discovery_all_fabrics, /* name */ - be_nested_proto( - 6, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 6]) { /* constants */ - /* K0 */ be_nested_str_weak(sessions), - /* K1 */ be_nested_str_weak(active_fabrics), - /* K2 */ be_nested_str_weak(get_device_id), - /* K3 */ be_nested_str_weak(get_fabric_id), - /* K4 */ be_nested_str_weak(mdns_announce_op_discovery), - /* K5 */ be_nested_str_weak(stop_iteration), - }), - be_str_weak(mdns_announce_op_discovery_all_fabrics), - &be_const_str_solidified, - ( &(const binstruction[22]) { /* code */ - 0x60040010, // 0000 GETGBL R1 G16 - 0x88080100, // 0001 GETMBR R2 R0 K0 - 0x8C080501, // 0002 GETMET R2 R2 K1 - 0x7C080200, // 0003 CALL R2 1 - 0x7C040200, // 0004 CALL R1 1 - 0xA802000B, // 0005 EXBLK 0 #0012 - 0x5C080200, // 0006 MOVE R2 R1 - 0x7C080000, // 0007 CALL R2 0 - 0x8C0C0502, // 0008 GETMET R3 R2 K2 - 0x7C0C0200, // 0009 CALL R3 1 - 0x780E0005, // 000A JMPF R3 #0011 - 0x8C0C0503, // 000B GETMET R3 R2 K3 - 0x7C0C0200, // 000C CALL R3 1 - 0x780E0002, // 000D JMPF R3 #0011 - 0x8C0C0104, // 000E GETMET R3 R0 K4 - 0x5C140400, // 000F MOVE R5 R2 - 0x7C0C0400, // 0010 CALL R3 2 - 0x7001FFF3, // 0011 JMP #0006 - 0x58040005, // 0012 LDCONST R1 K5 - 0xAC040200, // 0013 CATCH R1 1 0 - 0xB0080000, // 0014 RAISE 2 R0 R0 - 0x80000000, // 0015 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: load_param -********************************************************************/ -be_local_closure(Matter_Device_load_param, /* name */ - be_nested_proto( - 12, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[28]) { /* constants */ - /* K0 */ be_nested_str_weak(string), - /* K1 */ be_nested_str_weak(crypto), - /* K2 */ be_nested_str_weak(FILENAME), - /* K3 */ be_nested_str_weak(read), - /* K4 */ be_nested_str_weak(close), - /* K5 */ be_nested_str_weak(json), - /* K6 */ be_nested_str_weak(load), - /* K7 */ be_nested_str_weak(root_discriminator), - /* K8 */ be_nested_str_weak(find), - /* K9 */ be_nested_str_weak(distinguish), - /* K10 */ be_nested_str_weak(root_passcode), - /* K11 */ be_nested_str_weak(passcode), - /* K12 */ be_nested_str_weak(ipv4only), - /* K13 */ be_nested_str_weak(plugins_config), - /* K14 */ be_nested_str_weak(config), - /* K15 */ be_nested_str_weak(_load_plugins_config), - /* K16 */ be_nested_str_weak(plugins_persist), - /* K17 */ be_nested_str_weak(io_error), - /* K18 */ be_nested_str_weak(tasmota), - /* K19 */ be_nested_str_weak(log), - /* K20 */ be_nested_str_weak(MTR_X3A_X20Session_Store_X3A_X3Aload_X20Exception_X3A), - /* K21 */ be_nested_str_weak(_X7C), - /* K22 */ be_const_int(2), - /* K23 */ be_nested_str_weak(random), - /* K24 */ be_nested_str_weak(get), - /* K25 */ be_const_int(0), - /* K26 */ be_nested_str_weak(generate_random_passcode), - /* K27 */ be_nested_str_weak(save_param), - }), - be_str_weak(load_param), - &be_const_str_solidified, - ( &(const binstruction[91]) { /* code */ - 0xA4060000, // 0000 IMPORT R1 K0 - 0xA40A0200, // 0001 IMPORT R2 K1 - 0xA8020028, // 0002 EXBLK 0 #002C - 0x600C0011, // 0003 GETGBL R3 G17 - 0x88100102, // 0004 GETMBR R4 R0 K2 - 0x7C0C0200, // 0005 CALL R3 1 - 0x8C100703, // 0006 GETMET R4 R3 K3 - 0x7C100200, // 0007 CALL R4 1 - 0x8C140704, // 0008 GETMET R5 R3 K4 - 0x7C140200, // 0009 CALL R5 1 - 0xA4160A00, // 000A IMPORT R5 K5 - 0x8C180B06, // 000B GETMET R6 R5 K6 - 0x5C200800, // 000C MOVE R8 R4 - 0x7C180400, // 000D CALL R6 2 - 0x8C1C0D08, // 000E GETMET R7 R6 K8 - 0x58240009, // 000F LDCONST R9 K9 - 0x88280107, // 0010 GETMBR R10 R0 K7 - 0x7C1C0600, // 0011 CALL R7 3 - 0x90020E07, // 0012 SETMBR R0 K7 R7 - 0x8C1C0D08, // 0013 GETMET R7 R6 K8 - 0x5824000B, // 0014 LDCONST R9 K11 - 0x8828010A, // 0015 GETMBR R10 R0 K10 - 0x7C1C0600, // 0016 CALL R7 3 - 0x90021407, // 0017 SETMBR R0 K10 R7 - 0x601C0017, // 0018 GETGBL R7 G23 - 0x8C200D08, // 0019 GETMET R8 R6 K8 - 0x5828000C, // 001A LDCONST R10 K12 - 0x502C0000, // 001B LDBOOL R11 0 0 - 0x7C200600, // 001C CALL R8 3 - 0x7C1C0200, // 001D CALL R7 1 - 0x90021807, // 001E SETMBR R0 K12 R7 - 0x8C1C0D08, // 001F GETMET R7 R6 K8 - 0x5824000E, // 0020 LDCONST R9 K14 - 0x7C1C0400, // 0021 CALL R7 2 - 0x90021A07, // 0022 SETMBR R0 K13 R7 - 0x881C010D, // 0023 GETMBR R7 R0 K13 - 0x781E0004, // 0024 JMPF R7 #002A - 0x8C1C010F, // 0025 GETMET R7 R0 K15 - 0x8824010D, // 0026 GETMBR R9 R0 K13 - 0x7C1C0400, // 0027 CALL R7 2 - 0x501C0200, // 0028 LDBOOL R7 1 0 - 0x90022007, // 0029 SETMBR R0 K16 R7 - 0xA8040001, // 002A EXBLK 1 1 - 0x70020012, // 002B JMP #003F - 0xAC0C0002, // 002C CATCH R3 0 2 - 0x7002000F, // 002D JMP #003E - 0x20140711, // 002E NE R5 R3 K17 - 0x7816000C, // 002F JMPF R5 #003D - 0xB8162400, // 0030 GETNGBL R5 K18 - 0x8C140B13, // 0031 GETMET R5 R5 K19 - 0x601C0008, // 0032 GETGBL R7 G8 - 0x5C200600, // 0033 MOVE R8 R3 - 0x7C1C0200, // 0034 CALL R7 1 - 0x001E2807, // 0035 ADD R7 K20 R7 - 0x001C0F15, // 0036 ADD R7 R7 K21 - 0x60200008, // 0037 GETGBL R8 G8 - 0x5C240800, // 0038 MOVE R9 R4 - 0x7C200200, // 0039 CALL R8 1 - 0x001C0E08, // 003A ADD R7 R7 R8 - 0x58200016, // 003B LDCONST R8 K22 - 0x7C140600, // 003C CALL R5 3 - 0x70020000, // 003D JMP #003F - 0xB0080000, // 003E RAISE 2 R0 R0 - 0x500C0000, // 003F LDBOOL R3 0 0 - 0x88100107, // 0040 GETMBR R4 R0 K7 - 0x4C140000, // 0041 LDNIL R5 - 0x1C100805, // 0042 EQ R4 R4 R5 - 0x7812000A, // 0043 JMPF R4 #004F - 0x8C100517, // 0044 GETMET R4 R2 K23 - 0x58180016, // 0045 LDCONST R6 K22 - 0x7C100400, // 0046 CALL R4 2 - 0x8C100918, // 0047 GETMET R4 R4 K24 - 0x58180019, // 0048 LDCONST R6 K25 - 0x581C0016, // 0049 LDCONST R7 K22 - 0x7C100600, // 004A CALL R4 3 - 0x54160FFE, // 004B LDINT R5 4095 - 0x2C100805, // 004C AND R4 R4 R5 - 0x90020E04, // 004D SETMBR R0 K7 R4 - 0x500C0200, // 004E LDBOOL R3 1 0 - 0x8810010A, // 004F GETMBR R4 R0 K10 - 0x4C140000, // 0050 LDNIL R5 - 0x1C100805, // 0051 EQ R4 R4 R5 - 0x78120003, // 0052 JMPF R4 #0057 - 0x8C10011A, // 0053 GETMET R4 R0 K26 - 0x7C100200, // 0054 CALL R4 1 - 0x90021404, // 0055 SETMBR R0 K10 R4 - 0x500C0200, // 0056 LDBOOL R3 1 0 - 0x780E0001, // 0057 JMPF R3 #005A - 0x8C10011B, // 0058 GETMET R4 R0 K27 - 0x7C100200, // 0059 CALL R4 1 - 0x80000000, // 005A RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: k2l -********************************************************************/ -be_local_closure(Matter_Device_k2l, /* name */ - be_nested_proto( - 8, /* nstack */ - 1, /* argc */ - 4, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 6]) { /* constants */ - /* K0 */ be_const_class(be_class_Matter_Device), - /* K1 */ be_nested_str_weak(keys), - /* K2 */ be_nested_str_weak(push), - /* K3 */ be_nested_str_weak(stop_iteration), - /* K4 */ be_const_int(1), - /* K5 */ be_const_int(0), - }), - be_str_weak(k2l), - &be_const_str_solidified, - ( &(const binstruction[50]) { /* code */ - 0x58040000, // 0000 LDCONST R1 K0 - 0x60080012, // 0001 GETGBL R2 G18 - 0x7C080000, // 0002 CALL R2 0 - 0x4C0C0000, // 0003 LDNIL R3 - 0x1C0C0003, // 0004 EQ R3 R0 R3 - 0x780E0000, // 0005 JMPF R3 #0007 - 0x80040400, // 0006 RET 1 R2 - 0x600C0010, // 0007 GETGBL R3 G16 - 0x8C100101, // 0008 GETMET R4 R0 K1 - 0x7C100200, // 0009 CALL R4 1 - 0x7C0C0200, // 000A CALL R3 1 - 0xA8020005, // 000B EXBLK 0 #0012 - 0x5C100600, // 000C MOVE R4 R3 - 0x7C100000, // 000D CALL R4 0 - 0x8C140502, // 000E GETMET R5 R2 K2 - 0x5C1C0800, // 000F MOVE R7 R4 - 0x7C140400, // 0010 CALL R5 2 - 0x7001FFF9, // 0011 JMP #000C - 0x580C0003, // 0012 LDCONST R3 K3 - 0xAC0C0200, // 0013 CATCH R3 1 0 - 0xB0080000, // 0014 RAISE 2 R0 R0 - 0x600C0010, // 0015 GETGBL R3 G16 - 0x6010000C, // 0016 GETGBL R4 G12 - 0x5C140400, // 0017 MOVE R5 R2 - 0x7C100200, // 0018 CALL R4 1 - 0x04100904, // 0019 SUB R4 R4 K4 - 0x40120804, // 001A CONNECT R4 K4 R4 - 0x7C0C0200, // 001B CALL R3 1 - 0xA8020010, // 001C EXBLK 0 #002E - 0x5C100600, // 001D MOVE R4 R3 - 0x7C100000, // 001E CALL R4 0 - 0x94140404, // 001F GETIDX R5 R2 R4 - 0x5C180800, // 0020 MOVE R6 R4 - 0x241C0D05, // 0021 GT R7 R6 K5 - 0x781E0008, // 0022 JMPF R7 #002C - 0x041C0D04, // 0023 SUB R7 R6 K4 - 0x941C0407, // 0024 GETIDX R7 R2 R7 - 0x241C0E05, // 0025 GT R7 R7 R5 - 0x781E0004, // 0026 JMPF R7 #002C - 0x041C0D04, // 0027 SUB R7 R6 K4 - 0x941C0407, // 0028 GETIDX R7 R2 R7 - 0x98080C07, // 0029 SETIDX R2 R6 R7 - 0x04180D04, // 002A SUB R6 R6 K4 - 0x7001FFF4, // 002B JMP #0021 - 0x98080C05, // 002C SETIDX R2 R6 R5 - 0x7001FFEE, // 002D JMP #001D - 0x580C0003, // 002E LDCONST R3 K3 - 0xAC0C0200, // 002F CATCH R3 1 0 - 0xB0080000, // 0030 RAISE 2 R0 R0 - 0x80040400, // 0031 RET 1 R2 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: autoconf_device -********************************************************************/ -be_local_closure(Matter_Device_autoconf_device, /* name */ - be_nested_proto( - 7, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[15]) { /* constants */ - /* K0 */ be_nested_str_weak(string), - /* K1 */ be_nested_str_weak(json), - /* K2 */ be_nested_str_weak(plugins), - /* K3 */ be_const_int(0), - /* K4 */ be_nested_str_weak(plugins_config), - /* K5 */ be_nested_str_weak(autoconf_device_map), - /* K6 */ be_nested_str_weak(tasmota), - /* K7 */ be_nested_str_weak(log), - /* K8 */ be_nested_str_weak(MTR_X3A_X20autoconfig_X20_X3D_X20), - /* K9 */ be_const_int(3), - /* K10 */ be_nested_str_weak(_load_plugins_config), - /* K11 */ be_nested_str_weak(plugins_persist), - /* K12 */ be_nested_str_weak(sessions), - /* K13 */ be_nested_str_weak(count_active_fabrics), - /* K14 */ be_nested_str_weak(save_param), - }), - be_str_weak(autoconf_device), - &be_const_str_solidified, - ( &(const binstruction[34]) { /* code */ - 0xA4060000, // 0000 IMPORT R1 K0 - 0xA40A0200, // 0001 IMPORT R2 K1 - 0x600C000C, // 0002 GETGBL R3 G12 - 0x88100102, // 0003 GETMBR R4 R0 K2 - 0x7C0C0200, // 0004 CALL R3 1 - 0x240C0703, // 0005 GT R3 R3 K3 - 0x780E0000, // 0006 JMPF R3 #0008 - 0x80000600, // 0007 RET 0 - 0x8C0C0105, // 0008 GETMET R3 R0 K5 - 0x7C0C0200, // 0009 CALL R3 1 - 0x90020803, // 000A SETMBR R0 K4 R3 - 0xB80E0C00, // 000B GETNGBL R3 K6 - 0x8C0C0707, // 000C GETMET R3 R3 K7 - 0x60140008, // 000D GETGBL R5 G8 - 0x88180104, // 000E GETMBR R6 R0 K4 - 0x7C140200, // 000F CALL R5 1 - 0x00161005, // 0010 ADD R5 K8 R5 - 0x58180009, // 0011 LDCONST R6 K9 - 0x7C0C0600, // 0012 CALL R3 3 - 0x8C0C010A, // 0013 GETMET R3 R0 K10 - 0x88140104, // 0014 GETMBR R5 R0 K4 - 0x7C0C0400, // 0015 CALL R3 2 - 0x880C010B, // 0016 GETMBR R3 R0 K11 - 0x740E0008, // 0017 JMPT R3 #0021 - 0x880C010C, // 0018 GETMBR R3 R0 K12 - 0x8C0C070D, // 0019 GETMET R3 R3 K13 - 0x7C0C0200, // 001A CALL R3 1 - 0x240C0703, // 001B GT R3 R3 K3 - 0x780E0003, // 001C JMPF R3 #0021 - 0x500C0200, // 001D LDBOOL R3 1 0 - 0x90021603, // 001E SETMBR R0 K11 R3 - 0x8C0C010E, // 001F GETMET R3 R0 K14 - 0x7C0C0200, // 0020 CALL R3 1 - 0x80000000, // 0021 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: process_attribute_expansion -********************************************************************/ -be_local_closure(Matter_Device_process_attribute_expansion, /* name */ - be_nested_proto( - 29, /* nstack */ - 3, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 1, /* has sup protos */ - ( &(const struct bproto*[ 1]) { - be_nested_proto( - 7, /* nstack */ - 1, /* argc */ - 0, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 5]) { /* constants */ - /* K0 */ be_nested_str_weak(keys), - /* K1 */ be_nested_str_weak(push), - /* K2 */ be_nested_str_weak(stop_iteration), - /* K3 */ be_const_int(1), - /* K4 */ be_const_int(0), - }), - be_str_weak(keys_sorted), - &be_const_str_solidified, - ( &(const binstruction[45]) { /* code */ - 0x60040012, // 0000 GETGBL R1 G18 - 0x7C040000, // 0001 CALL R1 0 - 0x60080010, // 0002 GETGBL R2 G16 - 0x8C0C0100, // 0003 GETMET R3 R0 K0 - 0x7C0C0200, // 0004 CALL R3 1 - 0x7C080200, // 0005 CALL R2 1 - 0xA8020005, // 0006 EXBLK 0 #000D - 0x5C0C0400, // 0007 MOVE R3 R2 - 0x7C0C0000, // 0008 CALL R3 0 - 0x8C100301, // 0009 GETMET R4 R1 K1 - 0x5C180600, // 000A MOVE R6 R3 - 0x7C100400, // 000B CALL R4 2 - 0x7001FFF9, // 000C JMP #0007 - 0x58080002, // 000D LDCONST R2 K2 - 0xAC080200, // 000E CATCH R2 1 0 - 0xB0080000, // 000F RAISE 2 R0 R0 - 0x60080010, // 0010 GETGBL R2 G16 - 0x600C000C, // 0011 GETGBL R3 G12 - 0x5C100200, // 0012 MOVE R4 R1 - 0x7C0C0200, // 0013 CALL R3 1 - 0x040C0703, // 0014 SUB R3 R3 K3 - 0x400E0603, // 0015 CONNECT R3 K3 R3 - 0x7C080200, // 0016 CALL R2 1 - 0xA8020010, // 0017 EXBLK 0 #0029 - 0x5C0C0400, // 0018 MOVE R3 R2 - 0x7C0C0000, // 0019 CALL R3 0 - 0x94100203, // 001A GETIDX R4 R1 R3 - 0x5C140600, // 001B MOVE R5 R3 - 0x24180B04, // 001C GT R6 R5 K4 - 0x781A0008, // 001D JMPF R6 #0027 - 0x04180B03, // 001E SUB R6 R5 K3 - 0x94180206, // 001F GETIDX R6 R1 R6 - 0x24180C04, // 0020 GT R6 R6 R4 - 0x781A0004, // 0021 JMPF R6 #0027 - 0x04180B03, // 0022 SUB R6 R5 K3 - 0x94180206, // 0023 GETIDX R6 R1 R6 - 0x98040A06, // 0024 SETIDX R1 R5 R6 - 0x04140B03, // 0025 SUB R5 R5 K3 - 0x7001FFF4, // 0026 JMP #001C - 0x98040A04, // 0027 SETIDX R1 R5 R4 - 0x7001FFEE, // 0028 JMP #0018 - 0x58080002, // 0029 LDCONST R2 K2 - 0xAC080200, // 002A CATCH R2 1 0 - 0xB0080000, // 002B RAISE 2 R0 R0 - 0x80040200, // 002C RET 1 R1 - }) - ), - }), - 1, /* has constants */ - ( &(const bvalue[22]) { /* constants */ - /* K0 */ be_nested_str_weak(string), - /* K1 */ be_nested_str_weak(endpoint), - /* K2 */ be_nested_str_weak(cluster), - /* K3 */ be_nested_str_weak(attribute), - /* K4 */ be_nested_str_weak(plugins), - /* K5 */ be_nested_str_weak(get_endpoint), - /* K6 */ be_nested_str_weak(contains), - /* K7 */ be_nested_str_weak(get_cluster_list), - /* K8 */ be_nested_str_weak(get_attribute_list), - /* K9 */ be_nested_str_weak(push), - /* K10 */ be_nested_str_weak(stop_iteration), - /* K11 */ be_nested_str_weak(tasmota), - /* K12 */ be_nested_str_weak(log), - /* K13 */ be_nested_str_weak(format), - /* K14 */ be_nested_str_weak(MTR_X3A_X20expansion_X20_X5B_X2502X_X5D_X2504X_X2F_X2504X), - /* K15 */ be_const_int(3), - /* K16 */ be_nested_str_weak(status), - /* K17 */ be_nested_str_weak(matter), - /* K18 */ be_nested_str_weak(UNSUPPORTED_ENDPOINT), - /* K19 */ be_nested_str_weak(UNSUPPORTED_CLUSTER), - /* K20 */ be_nested_str_weak(UNSUPPORTED_ATTRIBUTE), - /* K21 */ be_nested_str_weak(UNREPORTABLE_ATTRIBUTE), - }), - be_str_weak(process_attribute_expansion), - &be_const_str_solidified, - ( &(const binstruction[216]) { /* code */ - 0x840C0000, // 0000 CLOSURE R3 P0 - 0xA4120000, // 0001 IMPORT R4 K0 - 0x88140301, // 0002 GETMBR R5 R1 K1 - 0x50180000, // 0003 LDBOOL R6 0 0 - 0x881C0302, // 0004 GETMBR R7 R1 K2 - 0x50200000, // 0005 LDBOOL R8 0 0 - 0x88240303, // 0006 GETMBR R9 R1 K3 - 0x50280000, // 0007 LDBOOL R10 0 0 - 0x882C0301, // 0008 GETMBR R11 R1 K1 - 0x4C300000, // 0009 LDNIL R12 - 0x202C160C, // 000A NE R11 R11 R12 - 0x782E0007, // 000B JMPF R11 #0014 - 0x882C0302, // 000C GETMBR R11 R1 K2 - 0x4C300000, // 000D LDNIL R12 - 0x202C160C, // 000E NE R11 R11 R12 - 0x782E0003, // 000F JMPF R11 #0014 - 0x882C0303, // 0010 GETMBR R11 R1 K3 - 0x4C300000, // 0011 LDNIL R12 - 0x202C160C, // 0012 NE R11 R11 R12 - 0x742E0000, // 0013 JMPT R11 #0015 - 0x502C0001, // 0014 LDBOOL R11 0 1 - 0x502C0200, // 0015 LDBOOL R11 1 0 - 0x60300013, // 0016 GETGBL R12 G19 - 0x7C300000, // 0017 CALL R12 0 - 0x60340010, // 0018 GETGBL R13 G16 - 0x88380104, // 0019 GETMBR R14 R0 K4 - 0x7C340200, // 001A CALL R13 1 - 0xA8020055, // 001B EXBLK 0 #0072 - 0x5C381A00, // 001C MOVE R14 R13 - 0x7C380000, // 001D CALL R14 0 - 0x8C3C1D05, // 001E GETMET R15 R14 K5 - 0x7C3C0200, // 001F CALL R15 1 - 0x4C400000, // 0020 LDNIL R16 - 0x20400A10, // 0021 NE R16 R5 R16 - 0x78420002, // 0022 JMPF R16 #0026 - 0x20401E05, // 0023 NE R16 R15 R5 - 0x78420000, // 0024 JMPF R16 #0026 - 0x7001FFF5, // 0025 JMP #001C - 0x8C401906, // 0026 GETMET R16 R12 K6 - 0x5C481E00, // 0027 MOVE R18 R15 - 0x7C400400, // 0028 CALL R16 2 - 0x74420002, // 0029 JMPT R16 #002D - 0x60400013, // 002A GETGBL R16 G19 - 0x7C400000, // 002B CALL R16 0 - 0x98301E10, // 002C SETIDX R12 R15 R16 - 0x50180200, // 002D LDBOOL R6 1 0 - 0x8C401D07, // 002E GETMET R16 R14 K7 - 0x5C481E00, // 002F MOVE R18 R15 - 0x7C400400, // 0030 CALL R16 2 - 0x60440010, // 0031 GETGBL R17 G16 - 0x5C482000, // 0032 MOVE R18 R16 - 0x7C440200, // 0033 CALL R17 1 - 0xA8020038, // 0034 EXBLK 0 #006E - 0x5C482200, // 0035 MOVE R18 R17 - 0x7C480000, // 0036 CALL R18 0 - 0x4C4C0000, // 0037 LDNIL R19 - 0x204C0E13, // 0038 NE R19 R7 R19 - 0x784E0002, // 0039 JMPF R19 #003D - 0x204C2407, // 003A NE R19 R18 R7 - 0x784E0000, // 003B JMPF R19 #003D - 0x7001FFF7, // 003C JMP #0035 - 0x944C180F, // 003D GETIDX R19 R12 R15 - 0x8C4C2706, // 003E GETMET R19 R19 K6 - 0x5C542400, // 003F MOVE R21 R18 - 0x7C4C0400, // 0040 CALL R19 2 - 0x744E0003, // 0041 JMPT R19 #0046 - 0x944C180F, // 0042 GETIDX R19 R12 R15 - 0x60500013, // 0043 GETGBL R20 G19 - 0x7C500000, // 0044 CALL R20 0 - 0x984C2414, // 0045 SETIDX R19 R18 R20 - 0x50200200, // 0046 LDBOOL R8 1 0 - 0x8C4C1D08, // 0047 GETMET R19 R14 K8 - 0x5C541E00, // 0048 MOVE R21 R15 - 0x5C582400, // 0049 MOVE R22 R18 - 0x7C4C0600, // 004A CALL R19 3 - 0x60500010, // 004B GETGBL R20 G16 - 0x5C542600, // 004C MOVE R21 R19 - 0x7C500200, // 004D CALL R20 1 - 0xA802001A, // 004E EXBLK 0 #006A - 0x5C542800, // 004F MOVE R21 R20 - 0x7C540000, // 0050 CALL R21 0 - 0x4C580000, // 0051 LDNIL R22 - 0x20581216, // 0052 NE R22 R9 R22 - 0x785A0002, // 0053 JMPF R22 #0057 - 0x20582A09, // 0054 NE R22 R21 R9 - 0x785A0000, // 0055 JMPF R22 #0057 - 0x7001FFF7, // 0056 JMP #004F - 0x9458180F, // 0057 GETIDX R22 R12 R15 - 0x94582C12, // 0058 GETIDX R22 R22 R18 - 0x8C582D06, // 0059 GETMET R22 R22 K6 - 0x5C602A00, // 005A MOVE R24 R21 - 0x7C580400, // 005B CALL R22 2 - 0x745A0004, // 005C JMPT R22 #0062 - 0x9458180F, // 005D GETIDX R22 R12 R15 - 0x94582C12, // 005E GETIDX R22 R22 R18 - 0x605C0012, // 005F GETGBL R23 G18 - 0x7C5C0000, // 0060 CALL R23 0 - 0x98582A17, // 0061 SETIDX R22 R21 R23 - 0x50280200, // 0062 LDBOOL R10 1 0 - 0x9458180F, // 0063 GETIDX R22 R12 R15 - 0x94582C12, // 0064 GETIDX R22 R22 R18 - 0x94582C15, // 0065 GETIDX R22 R22 R21 - 0x8C582D09, // 0066 GETMET R22 R22 K9 - 0x5C601C00, // 0067 MOVE R24 R14 - 0x7C580400, // 0068 CALL R22 2 - 0x7001FFE4, // 0069 JMP #004F - 0x5850000A, // 006A LDCONST R20 K10 - 0xAC500200, // 006B CATCH R20 1 0 - 0xB0080000, // 006C RAISE 2 R0 R0 - 0x7001FFC6, // 006D JMP #0035 - 0x5844000A, // 006E LDCONST R17 K10 - 0xAC440200, // 006F CATCH R17 1 0 - 0xB0080000, // 0070 RAISE 2 R0 R0 - 0x7001FFA9, // 0071 JMP #001C - 0x5834000A, // 0072 LDCONST R13 K10 - 0xAC340200, // 0073 CATCH R13 1 0 - 0xB0080000, // 0074 RAISE 2 R0 R0 - 0x60340010, // 0075 GETGBL R13 G16 - 0x5C380600, // 0076 MOVE R14 R3 - 0x5C3C1800, // 0077 MOVE R15 R12 - 0x7C380200, // 0078 CALL R14 1 - 0x7C340200, // 0079 CALL R13 1 - 0xA802003D, // 007A EXBLK 0 #00B9 - 0x5C381A00, // 007B MOVE R14 R13 - 0x7C380000, // 007C CALL R14 0 - 0x603C0010, // 007D GETGBL R15 G16 - 0x5C400600, // 007E MOVE R16 R3 - 0x9444180E, // 007F GETIDX R17 R12 R14 - 0x7C400200, // 0080 CALL R16 1 - 0x7C3C0200, // 0081 CALL R15 1 - 0xA8020031, // 0082 EXBLK 0 #00B5 - 0x5C401E00, // 0083 MOVE R16 R15 - 0x7C400000, // 0084 CALL R16 0 - 0x60440010, // 0085 GETGBL R17 G16 - 0x5C480600, // 0086 MOVE R18 R3 - 0x944C180E, // 0087 GETIDX R19 R12 R14 - 0x944C2610, // 0088 GETIDX R19 R19 R16 - 0x7C480200, // 0089 CALL R18 1 - 0x7C440200, // 008A CALL R17 1 - 0xA8020024, // 008B EXBLK 0 #00B1 - 0x5C482200, // 008C MOVE R18 R17 - 0x7C480000, // 008D CALL R18 0 - 0x604C0010, // 008E GETGBL R19 G16 - 0x9450180E, // 008F GETIDX R20 R12 R14 - 0x94502810, // 0090 GETIDX R20 R20 R16 - 0x94502812, // 0091 GETIDX R20 R20 R18 - 0x7C4C0200, // 0092 CALL R19 1 - 0xA8020018, // 0093 EXBLK 0 #00AD - 0x5C502600, // 0094 MOVE R20 R19 - 0x7C500000, // 0095 CALL R20 0 - 0xB8561600, // 0096 GETNGBL R21 K11 - 0x8C542B0C, // 0097 GETMET R21 R21 K12 - 0x8C5C090D, // 0098 GETMET R23 R4 K13 - 0x5864000E, // 0099 LDCONST R25 K14 - 0x5C681C00, // 009A MOVE R26 R14 - 0x5C6C2000, // 009B MOVE R27 R16 - 0x5C702400, // 009C MOVE R28 R18 - 0x7C5C0A00, // 009D CALL R23 5 - 0x5860000F, // 009E LDCONST R24 K15 - 0x7C540600, // 009F CALL R21 3 - 0x9006020E, // 00A0 SETMBR R1 K1 R14 - 0x90060410, // 00A1 SETMBR R1 K2 R16 - 0x90060612, // 00A2 SETMBR R1 K3 R18 - 0x5C540400, // 00A3 MOVE R21 R2 - 0x5C582800, // 00A4 MOVE R22 R20 - 0x5C5C0200, // 00A5 MOVE R23 R1 - 0x5C601600, // 00A6 MOVE R24 R11 - 0x7C540600, // 00A7 CALL R21 3 - 0x782E0002, // 00A8 JMPF R11 #00AC - 0x78560001, // 00A9 JMPF R21 #00AC - 0xA8040004, // 00AA EXBLK 1 4 - 0x80002C00, // 00AB RET 0 - 0x7001FFE6, // 00AC JMP #0094 - 0x584C000A, // 00AD LDCONST R19 K10 - 0xAC4C0200, // 00AE CATCH R19 1 0 - 0xB0080000, // 00AF RAISE 2 R0 R0 - 0x7001FFDA, // 00B0 JMP #008C - 0x5844000A, // 00B1 LDCONST R17 K10 - 0xAC440200, // 00B2 CATCH R17 1 0 - 0xB0080000, // 00B3 RAISE 2 R0 R0 - 0x7001FFCD, // 00B4 JMP #0083 - 0x583C000A, // 00B5 LDCONST R15 K10 - 0xAC3C0200, // 00B6 CATCH R15 1 0 - 0xB0080000, // 00B7 RAISE 2 R0 R0 - 0x7001FFC1, // 00B8 JMP #007B - 0x5834000A, // 00B9 LDCONST R13 K10 - 0xAC340200, // 00BA CATCH R13 1 0 - 0xB0080000, // 00BB RAISE 2 R0 R0 - 0x782E0019, // 00BC JMPF R11 #00D7 - 0x5C340C00, // 00BD MOVE R13 R6 - 0x74360003, // 00BE JMPT R13 #00C3 - 0xB8362200, // 00BF GETNGBL R13 K17 - 0x88341B12, // 00C0 GETMBR R13 R13 K18 - 0x9006200D, // 00C1 SETMBR R1 K16 R13 - 0x7002000E, // 00C2 JMP #00D2 - 0x5C341000, // 00C3 MOVE R13 R8 - 0x74360003, // 00C4 JMPT R13 #00C9 - 0xB8362200, // 00C5 GETNGBL R13 K17 - 0x88341B13, // 00C6 GETMBR R13 R13 K19 - 0x9006200D, // 00C7 SETMBR R1 K16 R13 - 0x70020008, // 00C8 JMP #00D2 - 0x5C341400, // 00C9 MOVE R13 R10 - 0x74360003, // 00CA JMPT R13 #00CF - 0xB8362200, // 00CB GETNGBL R13 K17 - 0x88341B14, // 00CC GETMBR R13 R13 K20 - 0x9006200D, // 00CD SETMBR R1 K16 R13 - 0x70020002, // 00CE JMP #00D2 - 0xB8362200, // 00CF GETNGBL R13 K17 - 0x88341B15, // 00D0 GETMBR R13 R13 K21 - 0x9006200D, // 00D1 SETMBR R1 K16 R13 - 0x5C340400, // 00D2 MOVE R13 R2 - 0x4C380000, // 00D3 LDNIL R14 - 0x5C3C0200, // 00D4 MOVE R15 R1 - 0x50400200, // 00D5 LDBOOL R16 1 0 - 0x7C340600, // 00D6 CALL R13 3 - 0x80000000, // 00D7 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: msg_send -********************************************************************/ -be_local_closure(Matter_Device_msg_send, /* name */ - be_nested_proto( - 5, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 2]) { /* constants */ - /* K0 */ be_nested_str_weak(udp_server), - /* K1 */ be_nested_str_weak(send_UDP), - }), - be_str_weak(msg_send), - &be_const_str_solidified, - ( &(const binstruction[ 5]) { /* code */ - 0x88080100, // 0000 GETMBR R2 R0 K0 - 0x8C080501, // 0001 GETMET R2 R2 K1 - 0x5C100200, // 0002 MOVE R4 R1 - 0x7C080400, // 0003 CALL R2 2 - 0x80040400, // 0004 RET 1 R2 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: get_plugin_class_displayname -********************************************************************/ -be_local_closure(Matter_Device_get_plugin_class_displayname, /* name */ - be_nested_proto( - 5, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 4]) { /* constants */ - /* K0 */ be_nested_str_weak(plugins_classes), - /* K1 */ be_nested_str_weak(find), - /* K2 */ be_nested_str_weak(NAME), - /* K3 */ be_nested_str_weak(), - }), - be_str_weak(get_plugin_class_displayname), - &be_const_str_solidified, - ( &(const binstruction[ 9]) { /* code */ - 0x88080100, // 0000 GETMBR R2 R0 K0 - 0x8C080501, // 0001 GETMET R2 R2 K1 - 0x5C100200, // 0002 MOVE R4 R1 - 0x7C080400, // 0003 CALL R2 2 - 0x780A0001, // 0004 JMPF R2 #0007 - 0x880C0502, // 0005 GETMBR R3 R2 K2 - 0x70020000, // 0006 JMP #0008 - 0x580C0003, // 0007 LDCONST R3 K3 - 0x80040600, // 0008 RET 1 R3 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: mdns_remove_op_discovery_all_fabrics -********************************************************************/ -be_local_closure(Matter_Device_mdns_remove_op_discovery_all_fabrics, /* name */ - be_nested_proto( - 6, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 6]) { /* constants */ - /* K0 */ be_nested_str_weak(sessions), - /* K1 */ be_nested_str_weak(active_fabrics), - /* K2 */ be_nested_str_weak(get_device_id), - /* K3 */ be_nested_str_weak(get_fabric_id), - /* K4 */ be_nested_str_weak(mdns_remove_op_discovery), - /* K5 */ be_nested_str_weak(stop_iteration), - }), - be_str_weak(mdns_remove_op_discovery_all_fabrics), - &be_const_str_solidified, - ( &(const binstruction[22]) { /* code */ - 0x60040010, // 0000 GETGBL R1 G16 - 0x88080100, // 0001 GETMBR R2 R0 K0 - 0x8C080501, // 0002 GETMET R2 R2 K1 - 0x7C080200, // 0003 CALL R2 1 - 0x7C040200, // 0004 CALL R1 1 - 0xA802000B, // 0005 EXBLK 0 #0012 - 0x5C080200, // 0006 MOVE R2 R1 - 0x7C080000, // 0007 CALL R2 0 - 0x8C0C0502, // 0008 GETMET R3 R2 K2 - 0x7C0C0200, // 0009 CALL R3 1 - 0x780E0005, // 000A JMPF R3 #0011 - 0x8C0C0503, // 000B GETMET R3 R2 K3 - 0x7C0C0200, // 000C CALL R3 1 - 0x780E0002, // 000D JMPF R3 #0011 - 0x8C0C0104, // 000E GETMET R3 R0 K4 - 0x5C140400, // 000F MOVE R5 R2 - 0x7C0C0400, // 0010 CALL R3 2 - 0x7001FFF3, // 0011 JMP #0006 - 0x58040005, // 0012 LDCONST R1 K5 - 0xAC040200, // 0013 CATCH R1 1 0 - 0xB0080000, // 0014 RAISE 2 R0 R0 - 0x80000000, // 0015 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: msg_received -********************************************************************/ -be_local_closure(Matter_Device_msg_received, /* name */ +be_local_closure(Matter_Device_get_active_endpoints, /* name */ be_nested_proto( 9, /* nstack */ - 4, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 2]) { /* constants */ - /* K0 */ be_nested_str_weak(message_handler), - /* K1 */ be_nested_str_weak(msg_received), - }), - be_str_weak(msg_received), - &be_const_str_solidified, - ( &(const binstruction[ 7]) { /* code */ - 0x88100100, // 0000 GETMBR R4 R0 K0 - 0x8C100901, // 0001 GETMET R4 R4 K1 - 0x5C180200, // 0002 MOVE R6 R1 - 0x5C1C0400, // 0003 MOVE R7 R2 - 0x5C200600, // 0004 MOVE R8 R3 - 0x7C100800, // 0005 CALL R4 4 - 0x80040800, // 0006 RET 1 R4 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: start_operational_discovery -********************************************************************/ -be_local_closure(Matter_Device_start_operational_discovery, /* name */ - be_nested_proto( - 8, /* nstack */ 2, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -4660,305 +4982,45 @@ be_local_closure(Matter_Device_start_operational_discovery, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[ 7]) { /* constants */ - /* K0 */ be_nested_str_weak(crypto), - /* K1 */ be_nested_str_weak(mdns), - /* K2 */ be_nested_str_weak(string), - /* K3 */ be_nested_str_weak(stop_basic_commissioning), - /* K4 */ be_nested_str_weak(root_w0), - /* K5 */ be_nested_str_weak(root_L), - /* K6 */ be_nested_str_weak(mdns_announce_op_discovery), - }), - be_str_weak(start_operational_discovery), - &be_const_str_solidified, - ( &(const binstruction[13]) { /* code */ - 0xA40A0000, // 0000 IMPORT R2 K0 - 0xA40E0200, // 0001 IMPORT R3 K1 - 0xA4120400, // 0002 IMPORT R4 K2 - 0x8C140103, // 0003 GETMET R5 R0 K3 - 0x7C140200, // 0004 CALL R5 1 - 0x4C140000, // 0005 LDNIL R5 - 0x90020805, // 0006 SETMBR R0 K4 R5 - 0x4C140000, // 0007 LDNIL R5 - 0x90020A05, // 0008 SETMBR R0 K5 R5 - 0x8C140106, // 0009 GETMET R5 R0 K6 - 0x5C1C0200, // 000A MOVE R7 R1 - 0x7C140400, // 000B CALL R5 2 - 0x80000000, // 000C RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: every_250ms -********************************************************************/ -be_local_closure(Matter_Device_every_250ms, /* name */ - be_nested_proto( - 4, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 5]) { /* constants */ - /* K0 */ be_nested_str_weak(message_handler), - /* K1 */ be_nested_str_weak(every_250ms), + ( &(const bvalue[ 6]) { /* constants */ + /* K0 */ be_nested_str_weak(plugins), + /* K1 */ be_nested_str_weak(get_endpoint), /* K2 */ be_const_int(0), - /* K3 */ be_nested_str_weak(plugins), - /* K4 */ be_const_int(1), + /* K3 */ be_nested_str_weak(find), + /* K4 */ be_nested_str_weak(push), + /* K5 */ be_nested_str_weak(stop_iteration), }), - be_str_weak(every_250ms), + be_str_weak(get_active_endpoints), &be_const_str_solidified, - ( &(const binstruction[16]) { /* code */ - 0x88040100, // 0000 GETMBR R1 R0 K0 - 0x8C040301, // 0001 GETMET R1 R1 K1 - 0x7C040200, // 0002 CALL R1 1 - 0x58040002, // 0003 LDCONST R1 K2 - 0x6008000C, // 0004 GETGBL R2 G12 - 0x880C0103, // 0005 GETMBR R3 R0 K3 - 0x7C080200, // 0006 CALL R2 1 - 0x14080202, // 0007 LT R2 R1 R2 - 0x780A0005, // 0008 JMPF R2 #000F - 0x88080103, // 0009 GETMBR R2 R0 K3 - 0x94080401, // 000A GETIDX R2 R2 R1 - 0x8C080501, // 000B GETMET R2 R2 K1 - 0x7C080200, // 000C CALL R2 1 - 0x00040304, // 000D ADD R1 R1 K4 - 0x7001FFF4, // 000E JMP #0004 - 0x80000000, // 000F RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: register_plugin_class -********************************************************************/ -be_local_closure(Matter_Device_register_plugin_class, /* name */ - be_nested_proto( - 7, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 4]) { /* constants */ - /* K0 */ be_nested_str_weak(introspect), - /* K1 */ be_nested_str_weak(get), - /* K2 */ be_nested_str_weak(TYPE), - /* K3 */ be_nested_str_weak(plugins_classes), - }), - be_str_weak(register_plugin_class), - &be_const_str_solidified, - ( &(const binstruction[ 9]) { /* code */ - 0xA40A0000, // 0000 IMPORT R2 K0 - 0x8C0C0501, // 0001 GETMET R3 R2 K1 - 0x5C140200, // 0002 MOVE R5 R1 - 0x58180002, // 0003 LDCONST R6 K2 - 0x7C0C0600, // 0004 CALL R3 3 - 0x780E0001, // 0005 JMPF R3 #0008 - 0x88100103, // 0006 GETMBR R4 R0 K3 - 0x98100601, // 0007 SETIDX R4 R3 R1 - 0x80000000, // 0008 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: mdns_remove_PASE -********************************************************************/ -be_local_closure(Matter_Device_mdns_remove_PASE, /* name */ - be_nested_proto( - 12, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[22]) { /* constants */ - /* K0 */ be_nested_str_weak(mdns), - /* K1 */ be_nested_str_weak(string), - /* K2 */ be_nested_str_weak(mdns_pase_eth), - /* K3 */ be_nested_str_weak(tasmota), - /* K4 */ be_nested_str_weak(log), - /* K5 */ be_nested_str_weak(format), - /* K6 */ be_nested_str_weak(MTR_X3A_X20calling_X20mdns_X2Eremove_service_X28_X25s_X2C_X20_X25s_X2C_X20_X25s_X2C_X20_X25s_X29), - /* K7 */ be_nested_str_weak(_matterc), - /* K8 */ be_nested_str_weak(_udp), - /* K9 */ be_nested_str_weak(commissioning_instance_eth), - /* K10 */ be_nested_str_weak(hostname_eth), - /* K11 */ be_const_int(3), - /* K12 */ be_nested_str_weak(MTR_X3A_X20remove_X20mDNS_X20on_X20_X25s_X20_X27_X25s_X27), - /* K13 */ be_nested_str_weak(eth), - /* K14 */ be_const_int(2), - /* K15 */ be_nested_str_weak(remove_service), - /* K16 */ be_nested_str_weak(mdns_pase_wifi), - /* K17 */ be_nested_str_weak(commissioning_instance_wifi), - /* K18 */ be_nested_str_weak(hostname_wifi), - /* K19 */ be_nested_str_weak(wifi), - /* K20 */ be_nested_str_weak(MTR_X3A_X20Exception), - /* K21 */ be_nested_str_weak(_X7C), - }), - be_str_weak(mdns_remove_PASE), - &be_const_str_solidified, - ( &(const binstruction[83]) { /* code */ - 0xA4060000, // 0000 IMPORT R1 K0 - 0xA40A0200, // 0001 IMPORT R2 K1 - 0xA802003D, // 0002 EXBLK 0 #0041 - 0x880C0102, // 0003 GETMBR R3 R0 K2 - 0x780E001B, // 0004 JMPF R3 #0021 - 0xB80E0600, // 0005 GETNGBL R3 K3 - 0x8C0C0704, // 0006 GETMET R3 R3 K4 - 0x8C140505, // 0007 GETMET R5 R2 K5 - 0x581C0006, // 0008 LDCONST R7 K6 - 0x58200007, // 0009 LDCONST R8 K7 - 0x58240008, // 000A LDCONST R9 K8 - 0x88280109, // 000B GETMBR R10 R0 K9 - 0x882C010A, // 000C GETMBR R11 R0 K10 - 0x7C140C00, // 000D CALL R5 6 - 0x5818000B, // 000E LDCONST R6 K11 - 0x7C0C0600, // 000F CALL R3 3 - 0xB80E0600, // 0010 GETNGBL R3 K3 - 0x8C0C0704, // 0011 GETMET R3 R3 K4 - 0x8C140505, // 0012 GETMET R5 R2 K5 - 0x581C000C, // 0013 LDCONST R7 K12 - 0x5820000D, // 0014 LDCONST R8 K13 - 0x88240109, // 0015 GETMBR R9 R0 K9 - 0x7C140800, // 0016 CALL R5 4 - 0x5818000E, // 0017 LDCONST R6 K14 - 0x7C0C0600, // 0018 CALL R3 3 - 0x500C0000, // 0019 LDBOOL R3 0 0 - 0x90020403, // 001A SETMBR R0 K2 R3 - 0x8C0C030F, // 001B GETMET R3 R1 K15 - 0x58140007, // 001C LDCONST R5 K7 - 0x58180008, // 001D LDCONST R6 K8 - 0x881C0109, // 001E GETMBR R7 R0 K9 - 0x8820010A, // 001F GETMBR R8 R0 K10 - 0x7C0C0A00, // 0020 CALL R3 5 - 0x880C0110, // 0021 GETMBR R3 R0 K16 - 0x780E001B, // 0022 JMPF R3 #003F - 0xB80E0600, // 0023 GETNGBL R3 K3 - 0x8C0C0704, // 0024 GETMET R3 R3 K4 - 0x8C140505, // 0025 GETMET R5 R2 K5 - 0x581C0006, // 0026 LDCONST R7 K6 - 0x58200007, // 0027 LDCONST R8 K7 - 0x58240008, // 0028 LDCONST R9 K8 - 0x88280111, // 0029 GETMBR R10 R0 K17 - 0x882C0112, // 002A GETMBR R11 R0 K18 - 0x7C140C00, // 002B CALL R5 6 - 0x5818000B, // 002C LDCONST R6 K11 - 0x7C0C0600, // 002D CALL R3 3 - 0xB80E0600, // 002E GETNGBL R3 K3 - 0x8C0C0704, // 002F GETMET R3 R3 K4 - 0x8C140505, // 0030 GETMET R5 R2 K5 - 0x581C000C, // 0031 LDCONST R7 K12 - 0x58200013, // 0032 LDCONST R8 K19 - 0x88240111, // 0033 GETMBR R9 R0 K17 - 0x7C140800, // 0034 CALL R5 4 - 0x5818000E, // 0035 LDCONST R6 K14 - 0x7C0C0600, // 0036 CALL R3 3 - 0x500C0000, // 0037 LDBOOL R3 0 0 - 0x90022003, // 0038 SETMBR R0 K16 R3 - 0x8C0C030F, // 0039 GETMET R3 R1 K15 - 0x58140007, // 003A LDCONST R5 K7 - 0x58180008, // 003B LDCONST R6 K8 - 0x881C0111, // 003C GETMBR R7 R0 K17 - 0x88200112, // 003D GETMBR R8 R0 K18 - 0x7C0C0A00, // 003E CALL R3 5 - 0xA8040001, // 003F EXBLK 1 1 - 0x70020010, // 0040 JMP #0052 - 0xAC0C0002, // 0041 CATCH R3 0 2 - 0x7002000D, // 0042 JMP #0051 - 0xB8160600, // 0043 GETNGBL R5 K3 - 0x8C140B04, // 0044 GETMET R5 R5 K4 - 0x601C0008, // 0045 GETGBL R7 G8 - 0x5C200600, // 0046 MOVE R8 R3 - 0x7C1C0200, // 0047 CALL R7 1 - 0x001E2807, // 0048 ADD R7 K20 R7 - 0x001C0F15, // 0049 ADD R7 R7 K21 - 0x60200008, // 004A GETGBL R8 G8 - 0x5C240800, // 004B MOVE R9 R4 - 0x7C200200, // 004C CALL R8 1 - 0x001C0E08, // 004D ADD R7 R7 R8 - 0x5820000E, // 004E LDCONST R8 K14 - 0x7C140600, // 004F CALL R5 3 - 0x70020000, // 0050 JMP #0052 - 0xB0080000, // 0051 RAISE 2 R0 R0 - 0x80000000, // 0052 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: compute_manual_pairing_code -********************************************************************/ -be_local_closure(Matter_Device_compute_manual_pairing_code, /* name */ - be_nested_proto( - 11, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 8]) { /* constants */ - /* K0 */ be_nested_str_weak(string), - /* K1 */ be_nested_str_weak(root_discriminator), - /* K2 */ be_nested_str_weak(root_passcode), - /* K3 */ be_nested_str_weak(format), - /* K4 */ be_nested_str_weak(_X251i_X2505i_X2504i), - /* K5 */ be_nested_str_weak(matter), - /* K6 */ be_nested_str_weak(Verhoeff), - /* K7 */ be_nested_str_weak(checksum), - }), - be_str_weak(compute_manual_pairing_code), - &be_const_str_solidified, - ( &(const binstruction[31]) { /* code */ - 0xA4060000, // 0000 IMPORT R1 K0 - 0x88080101, // 0001 GETMBR R2 R0 K1 - 0x540E0FFE, // 0002 LDINT R3 4095 - 0x2C080403, // 0003 AND R2 R2 R3 - 0x540E0009, // 0004 LDINT R3 10 - 0x3C080403, // 0005 SHR R2 R2 R3 - 0x880C0101, // 0006 GETMBR R3 R0 K1 - 0x541202FF, // 0007 LDINT R4 768 - 0x2C0C0604, // 0008 AND R3 R3 R4 - 0x54120005, // 0009 LDINT R4 6 - 0x380C0604, // 000A SHL R3 R3 R4 - 0x88100102, // 000B GETMBR R4 R0 K2 - 0x54163FFE, // 000C LDINT R5 16383 - 0x2C100805, // 000D AND R4 R4 R5 - 0x300C0604, // 000E OR R3 R3 R4 - 0x88100102, // 000F GETMBR R4 R0 K2 - 0x5416000D, // 0010 LDINT R5 14 - 0x3C100805, // 0011 SHR R4 R4 R5 - 0x8C140303, // 0012 GETMET R5 R1 K3 - 0x581C0004, // 0013 LDCONST R7 K4 - 0x5C200400, // 0014 MOVE R8 R2 - 0x5C240600, // 0015 MOVE R9 R3 - 0x5C280800, // 0016 MOVE R10 R4 - 0x7C140A00, // 0017 CALL R5 5 - 0xB81A0A00, // 0018 GETNGBL R6 K5 - 0x88180D06, // 0019 GETMBR R6 R6 K6 - 0x8C180D07, // 001A GETMET R6 R6 K7 - 0x5C200A00, // 001B MOVE R8 R5 - 0x7C180400, // 001C CALL R6 2 - 0x00140A06, // 001D ADD R5 R5 R6 - 0x80040A00, // 001E RET 1 R5 + ( &(const binstruction[28]) { /* code */ + 0x60080012, // 0000 GETGBL R2 G18 + 0x7C080000, // 0001 CALL R2 0 + 0x600C0010, // 0002 GETGBL R3 G16 + 0x88100100, // 0003 GETMBR R4 R0 K0 + 0x7C0C0200, // 0004 CALL R3 1 + 0xA8020011, // 0005 EXBLK 0 #0018 + 0x5C100600, // 0006 MOVE R4 R3 + 0x7C100000, // 0007 CALL R4 0 + 0x8C140901, // 0008 GETMET R5 R4 K1 + 0x7C140200, // 0009 CALL R5 1 + 0x78060002, // 000A JMPF R1 #000E + 0x1C180B02, // 000B EQ R6 R5 K2 + 0x781A0000, // 000C JMPF R6 #000E + 0x7001FFF7, // 000D JMP #0006 + 0x8C180503, // 000E GETMET R6 R2 K3 + 0x5C200A00, // 000F MOVE R8 R5 + 0x7C180400, // 0010 CALL R6 2 + 0x4C1C0000, // 0011 LDNIL R7 + 0x1C180C07, // 0012 EQ R6 R6 R7 + 0x781A0002, // 0013 JMPF R6 #0017 + 0x8C180504, // 0014 GETMET R6 R2 K4 + 0x5C200A00, // 0015 MOVE R8 R5 + 0x7C180400, // 0016 CALL R6 2 + 0x7001FFED, // 0017 JMP #0006 + 0x580C0005, // 0018 LDCONST R3 K5 + 0xAC0C0200, // 0019 CATCH R3 1 0 + 0xB0080000, // 001A RAISE 2 R0 R0 + 0x80040400, // 001B RET 1 R2 }) ) ); @@ -4969,83 +5031,74 @@ be_local_closure(Matter_Device_compute_manual_pairing_code, /* name */ ** Solidified class: Matter_Device ********************************************************************/ be_local_class(Matter_Device, - 32, + 33, NULL, - be_nested_map(93, + be_nested_map(95, ( (struct bmapnode*) &(const bmapnode[]) { - { be_const_key_weak(message_handler, -1), be_const_var(6) }, - { be_const_key_weak(generate_random_passcode, -1), be_const_closure(Matter_Device_generate_random_passcode_closure) }, - { be_const_key_weak(save_param, -1), be_const_closure(Matter_Device_save_param_closure) }, - { be_const_key_weak(mdns_pase_wifi, -1), be_const_var(24) }, - { be_const_key_weak(remove_fabric, 28), be_const_closure(Matter_Device_remove_fabric_closure) }, - { be_const_key_weak(_start_udp, -1), be_const_closure(Matter_Device__start_udp_closure) }, - { be_const_key_weak(root_iterations, -1), be_const_var(28) }, - { be_const_key_weak(commissioning_discriminator, -1), be_const_var(12) }, - { be_const_key_weak(commissioning_w0, -1), be_const_var(14) }, - { be_const_key_weak(compute_manual_pairing_code, 66), be_const_closure(Matter_Device_compute_manual_pairing_code_closure) }, - { be_const_key_weak(root_discriminator, -1), be_const_var(25) }, - { be_const_key_weak(stop, -1), be_const_closure(Matter_Device_stop_closure) }, - { be_const_key_weak(mdns_remove_PASE, 22), be_const_closure(Matter_Device_mdns_remove_PASE_closure) }, - { be_const_key_weak(plugins_config, -1), be_const_var(4) }, - { be_const_key_weak(start_commissioning_complete, -1), be_const_closure(Matter_Device_start_commissioning_complete_closure) }, - { be_const_key_weak(_trigger_read_sensors, 62), be_const_closure(Matter_Device__trigger_read_sensors_closure) }, - { be_const_key_weak(register_plugin_class, -1), be_const_closure(Matter_Device_register_plugin_class_closure) }, - { be_const_key_weak(root_passcode, 12), be_const_var(26) }, - { be_const_key_weak(every_250ms, 19), be_const_closure(Matter_Device_every_250ms_closure) }, - { be_const_key_weak(commissioning_instance_eth, -1), be_const_var(18) }, - { be_const_key_weak(vendorid, -1), be_const_var(21) }, - { be_const_key_weak(register_native_classes, 89), be_const_closure(Matter_Device_register_native_classes_closure) }, - { be_const_key_weak(start_operational_discovery, 15), be_const_closure(Matter_Device_start_operational_discovery_closure) }, - { be_const_key_weak(_init_basic_commissioning, -1), be_const_closure(Matter_Device__init_basic_commissioning_closure) }, - { be_const_key_weak(compute_qrcode_content, -1), be_const_closure(Matter_Device_compute_qrcode_content_closure) }, - { be_const_key_weak(is_root_commissioning_open, -1), be_const_closure(Matter_Device_is_root_commissioning_open_closure) }, - { be_const_key_weak(commissioning_open, -1), be_const_var(10) }, - { be_const_key_weak(commissioning_instance_wifi, -1), be_const_var(17) }, - { be_const_key_weak(msg_received, -1), be_const_closure(Matter_Device_msg_received_closure) }, - { be_const_key_weak(get_active_endpoints, -1), be_const_closure(Matter_Device_get_active_endpoints_closure) }, - { be_const_key_weak(MtrJoin, -1), be_const_closure(Matter_Device_MtrJoin_closure) }, - { be_const_key_weak(productid, 73), be_const_var(22) }, - { be_const_key_weak(invoke_request, -1), be_const_closure(Matter_Device_invoke_request_closure) }, - { be_const_key_weak(get_plugin_class_displayname, 59), be_const_closure(Matter_Device_get_plugin_class_displayname_closure) }, - { be_const_key_weak(event_fabrics_saved, -1), be_const_closure(Matter_Device_event_fabrics_saved_closure) }, - { be_const_key_weak(start, 86), be_const_closure(Matter_Device_start_closure) }, + { be_const_key_weak(plugins_classes, -1), be_const_var(3) }, { be_const_key_weak(k2l_num, -1), be_const_static_closure(Matter_Device_k2l_num_closure) }, - { be_const_key_weak(mdns_announce_op_discovery, -1), be_const_closure(Matter_Device_mdns_announce_op_discovery_closure) }, - { be_const_key_weak(root_salt, -1), be_const_var(29) }, - { be_const_key_weak(every_second, 78), be_const_closure(Matter_Device_every_second_closure) }, - { be_const_key_weak(commissioning_L, -1), be_const_var(15) }, - { be_const_key_weak(hostname_wifi, 18), be_const_var(19) }, - { be_const_key_weak(get_plugin_class_arg, 61), be_const_closure(Matter_Device_get_plugin_class_arg_closure) }, - { be_const_key_weak(started, 84), be_const_var(0) }, - { be_const_key_weak(root_w0, 25), be_const_var(30) }, - { be_const_key_weak(mdns_announce_PASE, -1), be_const_closure(Matter_Device_mdns_announce_PASE_closure) }, - { be_const_key_weak(autoconf_device_map, 82), be_const_closure(Matter_Device_autoconf_device_map_closure) }, - { be_const_key_weak(every_50ms, -1), be_const_closure(Matter_Device_every_50ms_closure) }, + { be_const_key_weak(register_native_classes, -1), be_const_closure(Matter_Device_register_native_classes_closure) }, + { be_const_key_weak(save_before_restart, -1), be_const_closure(Matter_Device_save_before_restart_closure) }, + { be_const_key_weak(stop_basic_commissioning, -1), be_const_closure(Matter_Device_stop_basic_commissioning_closure) }, { be_const_key_weak(commissioning_admin_fabric, -1), be_const_var(16) }, - { be_const_key_weak(msg_send, 30), be_const_closure(Matter_Device_msg_send_closure) }, - { be_const_key_weak(commissioning_salt, -1), be_const_var(13) }, - { be_const_key_weak(plugins, -1), be_const_var(1) }, - { be_const_key_weak(PBKDF_ITERATIONS, -1), be_const_int(1000) }, - { be_const_key_weak(_mdns_announce_hostname, 50), be_const_closure(Matter_Device__mdns_announce_hostname_closure) }, - { be_const_key_weak(start_mdns_announce_hostnames, -1), be_const_closure(Matter_Device_start_mdns_announce_hostnames_closure) }, - { be_const_key_weak(attribute_updated, 49), be_const_closure(Matter_Device_attribute_updated_closure) }, - { be_const_key_weak(PRODUCT_ID, -1), be_const_int(32768) }, - { be_const_key_weak(root_L, -1), be_const_var(31) }, - { be_const_key_weak(register_commands, 77), be_const_closure(Matter_Device_register_commands_closure) }, - { be_const_key_weak(plugins_persist, -1), be_const_var(2) }, - { be_const_key_weak(init, 57), be_const_closure(Matter_Device_init_closure) }, - { be_const_key_weak(_compute_pbkdf, -1), be_const_closure(Matter_Device__compute_pbkdf_closure) }, - { be_const_key_weak(hostname_eth, -1), be_const_var(20) }, - { be_const_key_weak(received_ack, -1), be_const_closure(Matter_Device_received_ack_closure) }, - { be_const_key_weak(VENDOR_ID, -1), be_const_int(65521) }, - { be_const_key_weak(FILENAME, -1), be_nested_str_weak(_matter_device_X2Ejson) }, - { be_const_key_weak(load_param, -1), be_const_closure(Matter_Device_load_param_closure) }, - { be_const_key_weak(mdns_announce_op_discovery_all_fabrics, -1), be_const_closure(Matter_Device_mdns_announce_op_discovery_all_fabrics_closure) }, - { be_const_key_weak(tick, 70), be_const_var(9) }, - { be_const_key_weak(udp_server, 67), be_const_var(5) }, - { be_const_key_weak(start_basic_commissioning, -1), be_const_closure(Matter_Device_start_basic_commissioning_closure) }, + { be_const_key_weak(get_plugin_class_arg, -1), be_const_closure(Matter_Device_get_plugin_class_arg_closure) }, + { be_const_key_weak(commissioning_w0, 93), be_const_var(14) }, + { be_const_key_weak(get_active_endpoints, 10), be_const_closure(Matter_Device_get_active_endpoints_closure) }, + { be_const_key_weak(start_mdns_announce_hostnames, 62), be_const_closure(Matter_Device_start_mdns_announce_hostnames_closure) }, + { be_const_key_weak(mdns_announce_PASE, 18), be_const_closure(Matter_Device_mdns_announce_PASE_closure) }, + { be_const_key_weak(mdns_remove_op_discovery, -1), be_const_closure(Matter_Device_mdns_remove_op_discovery_closure) }, + { be_const_key_weak(root_discriminator, -1), be_const_var(26) }, + { be_const_key_weak(UDP_PORT, -1), be_const_int(5540) }, { be_const_key_weak(k2l, -1), be_const_static_closure(Matter_Device_k2l_closure) }, - { be_const_key_weak(PASSCODE_INVALID, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_list, { + { be_const_key_weak(ipv4only, -1), be_const_var(28) }, + { be_const_key_weak(get_plugin_class_displayname, 31), be_const_closure(Matter_Device_get_plugin_class_displayname_closure) }, + { be_const_key_weak(root_salt, -1), be_const_var(30) }, + { be_const_key_weak(autoconf_device_map, -1), be_const_closure(Matter_Device_autoconf_device_map_closure) }, + { be_const_key_weak(PRODUCT_ID, 20), be_const_int(32768) }, + { be_const_key_weak(PBKDF_ITERATIONS, -1), be_const_int(1000) }, + { be_const_key_weak(stop, -1), be_const_closure(Matter_Device_stop_closure) }, + { be_const_key_weak(autoconf_device, 86), be_const_closure(Matter_Device_autoconf_device_closure) }, + { be_const_key_weak(every_second, -1), be_const_closure(Matter_Device_every_second_closure) }, + { be_const_key_weak(_init_basic_commissioning, -1), be_const_closure(Matter_Device__init_basic_commissioning_closure) }, + { be_const_key_weak(compute_manual_pairing_code, -1), be_const_closure(Matter_Device_compute_manual_pairing_code_closure) }, + { be_const_key_weak(MtrJoin, 35), be_const_closure(Matter_Device_MtrJoin_closure) }, + { be_const_key_weak(vendorid, 14), be_const_var(21) }, + { be_const_key_weak(root_passcode, 79), be_const_var(27) }, + { be_const_key_weak(mdns_announce_op_discovery_all_fabrics, 22), be_const_closure(Matter_Device_mdns_announce_op_discovery_all_fabrics_closure) }, + { be_const_key_weak(register_plugin_class, -1), be_const_closure(Matter_Device_register_plugin_class_closure) }, + { be_const_key_weak(generate_random_passcode, -1), be_const_closure(Matter_Device_generate_random_passcode_closure) }, + { be_const_key_weak(ui, -1), be_const_var(8) }, + { be_const_key_weak(msg_received, -1), be_const_closure(Matter_Device_msg_received_closure) }, + { be_const_key_weak(save_param, 68), be_const_closure(Matter_Device_save_param_closure) }, + { be_const_key_weak(commissioning_L, -1), be_const_var(15) }, + { be_const_key_weak(start_root_basic_commissioning, -1), be_const_closure(Matter_Device_start_root_basic_commissioning_closure) }, + { be_const_key_weak(commissioning_instance_eth, -1), be_const_var(18) }, + { be_const_key_weak(start_basic_commissioning, -1), be_const_closure(Matter_Device_start_basic_commissioning_closure) }, + { be_const_key_weak(message_handler, 9), be_const_var(6) }, + { be_const_key_weak(mdns_remove_op_discovery_all_fabrics, 36), be_const_closure(Matter_Device_mdns_remove_op_discovery_all_fabrics_closure) }, + { be_const_key_weak(start, -1), be_const_closure(Matter_Device_start_closure) }, + { be_const_key_weak(FILENAME, -1), be_nested_str_weak(_matter_device_X2Ejson) }, + { be_const_key_weak(start_operational_discovery, -1), be_const_closure(Matter_Device_start_operational_discovery_closure) }, + { be_const_key_weak(_compute_pbkdf, -1), be_const_closure(Matter_Device__compute_pbkdf_closure) }, + { be_const_key_weak(plugins_persist, -1), be_const_var(2) }, + { be_const_key_weak(root_iterations, 88), be_const_var(29) }, + { be_const_key_weak(start_commissioning_complete_deferred, -1), be_const_closure(Matter_Device_start_commissioning_complete_deferred_closure) }, + { be_const_key_weak(sessions, -1), be_const_var(7) }, + { be_const_key_weak(remove_fabric, -1), be_const_closure(Matter_Device_remove_fabric_closure) }, + { be_const_key_weak(attribute_updated, 23), be_const_closure(Matter_Device_attribute_updated_closure) }, + { be_const_key_weak(plugins_config, -1), be_const_var(4) }, + { be_const_key_weak(plugins, -1), be_const_var(1) }, + { be_const_key_weak(http_remotes, 34), be_const_var(25) }, + { be_const_key_weak(msg_send, -1), be_const_closure(Matter_Device_msg_send_closure) }, + { be_const_key_weak(every_250ms, 71), be_const_closure(Matter_Device_every_250ms_closure) }, + { be_const_key_weak(hostname_wifi, -1), be_const_var(19) }, + { be_const_key_weak(compute_qrcode_content, 49), be_const_closure(Matter_Device_compute_qrcode_content_closure) }, + { be_const_key_weak(_mdns_announce_hostname, 51), be_const_closure(Matter_Device__mdns_announce_hostname_closure) }, + { be_const_key_weak(load_param, -1), be_const_closure(Matter_Device_load_param_closure) }, + { be_const_key_weak(commissioning_discriminator, -1), be_const_var(12) }, + { be_const_key_weak(register_commands, 52), be_const_closure(Matter_Device_register_commands_closure) }, + { be_const_key_weak(received_ack, -1), be_const_closure(Matter_Device_received_ack_closure) }, + { be_const_key_weak(PASSCODE_INVALID, 54), be_const_simple_instance(be_nested_simple_instance(&be_class_list, { be_const_list( * be_nested_list(12, ( (struct bvalue*) &(const bvalue[]) { be_const_int(0), @@ -5061,26 +5114,37 @@ be_local_class(Matter_Device, be_const_int(12345678), be_const_int(87654321), })) ) } )) }, - { be_const_key_weak(start_root_basic_commissioning, -1), be_const_closure(Matter_Device_start_root_basic_commissioning_closure) }, - { be_const_key_weak(autoconf_device, -1), be_const_closure(Matter_Device_autoconf_device_closure) }, - { be_const_key_weak(save_before_restart, 56), be_const_closure(Matter_Device_save_before_restart_closure) }, - { be_const_key_weak(process_attribute_expansion, -1), be_const_closure(Matter_Device_process_attribute_expansion_closure) }, - { be_const_key_weak(_load_plugins_config, -1), be_const_closure(Matter_Device__load_plugins_config_closure) }, + { be_const_key_weak(commissioning_open, -1), be_const_var(10) }, { be_const_key_weak(mdns_pase_eth, -1), be_const_var(23) }, - { be_const_key_weak(PASE_TIMEOUT, 33), be_const_int(600) }, - { be_const_key_weak(is_commissioning_open, 31), be_const_closure(Matter_Device_is_commissioning_open_closure) }, - { be_const_key_weak(mdns_remove_op_discovery_all_fabrics, -1), be_const_closure(Matter_Device_mdns_remove_op_discovery_all_fabrics_closure) }, - { be_const_key_weak(mdns_remove_op_discovery, -1), be_const_closure(Matter_Device_mdns_remove_op_discovery_closure) }, - { be_const_key_weak(ui, -1), be_const_var(8) }, - { be_const_key_weak(sessions, -1), be_const_var(7) }, - { be_const_key_weak(plugins_classes, -1), be_const_var(3) }, - { be_const_key_weak(sort_distinct, 47), be_const_static_closure(Matter_Device_sort_distinct_closure) }, - { be_const_key_weak(commissioning_iterations, 16), be_const_var(11) }, - { be_const_key_weak(UDP_PORT, -1), be_const_int(5540) }, - { be_const_key_weak(stop_basic_commissioning, -1), be_const_closure(Matter_Device_stop_basic_commissioning_closure) }, - { be_const_key_weak(start_commissioning_complete_deferred, 9), be_const_closure(Matter_Device_start_commissioning_complete_deferred_closure) }, - { be_const_key_weak(ipv4only, 3), be_const_var(27) }, - { be_const_key_weak(start_operational_discovery_deferred, 0), be_const_closure(Matter_Device_start_operational_discovery_deferred_closure) }, + { be_const_key_weak(VENDOR_ID, 69), be_const_int(65521) }, + { be_const_key_weak(invoke_request, -1), be_const_closure(Matter_Device_invoke_request_closure) }, + { be_const_key_weak(commissioning_salt, -1), be_const_var(13) }, + { be_const_key_weak(productid, -1), be_const_var(22) }, + { be_const_key_weak(start_commissioning_complete, 55), be_const_closure(Matter_Device_start_commissioning_complete_closure) }, + { be_const_key_weak(init, 89), be_const_closure(Matter_Device_init_closure) }, + { be_const_key_weak(mdns_announce_op_discovery, -1), be_const_closure(Matter_Device_mdns_announce_op_discovery_closure) }, + { be_const_key_weak(process_attribute_expansion, -1), be_const_closure(Matter_Device_process_attribute_expansion_closure) }, + { be_const_key_weak(is_commissioning_open, -1), be_const_closure(Matter_Device_is_commissioning_open_closure) }, + { be_const_key_weak(root_w0, 47), be_const_var(31) }, + { be_const_key_weak(started, 45), be_const_var(0) }, + { be_const_key_weak(start_operational_discovery_deferred, 43), be_const_closure(Matter_Device_start_operational_discovery_deferred_closure) }, + { be_const_key_weak(root_L, -1), be_const_var(32) }, + { be_const_key_weak(_load_plugins_config, 94), be_const_closure(Matter_Device__load_plugins_config_closure) }, + { be_const_key_weak(mdns_pase_wifi, -1), be_const_var(24) }, + { be_const_key_weak(is_root_commissioning_open, -1), be_const_closure(Matter_Device_is_root_commissioning_open_closure) }, + { be_const_key_weak(commissioning_iterations, 30), be_const_var(11) }, + { be_const_key_weak(every_50ms, 28), be_const_closure(Matter_Device_every_50ms_closure) }, + { be_const_key_weak(hostname_eth, 26), be_const_var(20) }, + { be_const_key_weak(udp_server, -1), be_const_var(5) }, + { be_const_key_weak(tick, -1), be_const_var(9) }, + { be_const_key_weak(event_fabrics_saved, 21), be_const_closure(Matter_Device_event_fabrics_saved_closure) }, + { be_const_key_weak(commissioning_instance_wifi, -1), be_const_var(17) }, + { be_const_key_weak(mdns_remove_PASE, 11), be_const_closure(Matter_Device_mdns_remove_PASE_closure) }, + { be_const_key_weak(register_http_remote, -1), be_const_closure(Matter_Device_register_http_remote_closure) }, + { be_const_key_weak(PASE_TIMEOUT, -1), be_const_int(600) }, + { be_const_key_weak(sort_distinct, 8), be_const_static_closure(Matter_Device_sort_distinct_closure) }, + { be_const_key_weak(_trigger_read_sensors, -1), be_const_closure(Matter_Device__trigger_read_sensors_closure) }, + { be_const_key_weak(_start_udp, -1), be_const_closure(Matter_Device__start_udp_closure) }, })), be_str_weak(Matter_Device) ); diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_HTTP_async.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_HTTP_async.h index 13a3a1112..a649c4ef6 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_HTTP_async.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_HTTP_async.h @@ -1097,7 +1097,7 @@ be_local_class(Matter_HTTP_async, { be_const_key_weak(is_chunked, 13), be_const_var(7) }, { be_const_key_weak(SPINLOCK, -1), be_const_int(5) }, { be_const_key_weak(response_offset, 10), be_const_var(2) }, - { be_const_key_weak(HTTP_STATUS_REGEX, -1), be_nested_str_weak(HTTP_X2F1_X5C_X2E_X5B1_X2D2_X5D_X20_X28_X5Cd_X2B_X29_X20_X2E_X2A_X3F_X0D_X0A) }, + { be_const_key_weak(HTTP_STATUS_REGEX, -1), be_nested_str_weak(HTTP_X2F1_X5C_X2E_X5B0_X2D1_X5D_X20_X28_X5Cd_X2B_X29_X20_X2E_X2A_X3F_X0D_X0A) }, { be_const_key_weak(event_established, -1), be_const_closure(Matter_HTTP_async_event_established_closure) }, { be_const_key_weak(event_available, 1), be_const_closure(Matter_HTTP_async_event_available_closure) }, })), diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_HTTP_remote.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_HTTP_remote.h index ec18ad0ee..7f0bad2b8 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_HTTP_remote.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_HTTP_remote.h @@ -7,34 +7,40 @@ extern const bclass be_class_Matter_HTTP_remote; /******************************************************************** -** Solidified function: init +** Solidified function: device_is_alive ********************************************************************/ -be_local_closure(Matter_HTTP_remote_init, /* name */ +be_local_closure(Matter_HTTP_remote_device_is_alive, /* name */ be_nested_proto( - 11, /* nstack */ - 5, /* argc */ + 4, /* nstack */ + 2, /* argc */ 2, /* varg */ 0, /* has upvals */ NULL, /* no upvals */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[ 1]) { /* constants */ - /* K0 */ be_nested_str_weak(init), + ( &(const bvalue[ 5]) { /* constants */ + /* K0 */ be_nested_str_weak(reachable), + /* K1 */ be_nested_str_weak(reachable_utc), + /* K2 */ be_nested_str_weak(tasmota), + /* K3 */ be_nested_str_weak(rtc), + /* K4 */ be_nested_str_weak(utc), }), - be_str_weak(init), + be_str_weak(device_is_alive), &be_const_str_solidified, - ( &(const binstruction[10]) { /* code */ - 0x60140003, // 0000 GETGBL R5 G3 - 0x5C180000, // 0001 MOVE R6 R0 - 0x7C140200, // 0002 CALL R5 1 - 0x8C140B00, // 0003 GETMET R5 R5 K0 - 0x5C1C0200, // 0004 MOVE R7 R1 - 0x5C200400, // 0005 MOVE R8 R2 - 0x5C240600, // 0006 MOVE R9 R3 - 0x5C280800, // 0007 MOVE R10 R4 - 0x7C140A00, // 0008 CALL R5 5 - 0x80000000, // 0009 RET 0 + ( &(const binstruction[12]) { /* code */ + 0x78060007, // 0000 JMPF R1 #0009 + 0x50080200, // 0001 LDBOOL R2 1 0 + 0x90020002, // 0002 SETMBR R0 K0 R2 + 0xB80A0400, // 0003 GETNGBL R2 K2 + 0x8C080503, // 0004 GETMET R2 R2 K3 + 0x7C080200, // 0005 CALL R2 1 + 0x94080504, // 0006 GETIDX R2 R2 K4 + 0x90020202, // 0007 SETMBR R0 K1 R2 + 0x70020001, // 0008 JMP #000B + 0x50080000, // 0009 LDBOOL R2 0 0 + 0x90020002, // 000A SETMBR R0 K0 R2 + 0x80000000, // 000B RET 0 }) ) ); @@ -42,11 +48,11 @@ be_local_closure(Matter_HTTP_remote_init, /* name */ /******************************************************************** -** Solidified function: begin_sync +** Solidified function: call_sync ********************************************************************/ -be_local_closure(Matter_HTTP_remote_begin_sync, /* name */ +be_local_closure(Matter_HTTP_remote_call_sync, /* name */ be_nested_proto( - 12, /* nstack */ + 17, /* nstack */ 3, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -54,38 +60,158 @@ be_local_closure(Matter_HTTP_remote_begin_sync, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[ 9]) { /* constants */ + ( &(const bvalue[25]) { /* constants */ /* K0 */ be_nested_str_weak(string), - /* K1 */ be_nested_str_weak(tasmota), - /* K2 */ be_nested_str_weak(log), - /* K3 */ be_nested_str_weak(format), - /* K4 */ be_nested_str_weak(MTR_X3A_X20HTTP_X20sync_X20request_X20_X27http_X3A_X2F_X2F_X25s_X3A_X25i_X25s_X27), - /* K5 */ be_nested_str_weak(addr), - /* K6 */ be_nested_str_weak(port), - /* K7 */ be_const_int(3), - /* K8 */ be_nested_str_weak(begin_sync), + /* K1 */ be_nested_str_weak(webserver), + /* K2 */ be_nested_str_weak(tasmota), + /* K3 */ be_nested_str_weak(wifi), + /* K4 */ be_nested_str_weak(up), + /* K5 */ be_nested_str_weak(eth), + /* K6 */ be_nested_str_weak(current_cmd), + /* K7 */ be_nested_str_weak(_X2Fcm_X3Fcmnd_X3D), + /* K8 */ be_nested_str_weak(tr), + /* K9 */ be_nested_str_weak(_X20), + /* K10 */ be_nested_str_weak(_X2B), + /* K11 */ be_nested_str_weak(log), + /* K12 */ be_nested_str_weak(format), + /* K13 */ be_nested_str_weak(MTR_X3A_X20HTTP_X20sync_X20request_X20_X27http_X3A_X2F_X2F_X25s_X3A_X25i_X25s_X27), + /* K14 */ be_nested_str_weak(addr), + /* K15 */ be_nested_str_weak(port), + /* K16 */ be_const_int(2), + /* K17 */ be_nested_str_weak(begin_sync), + /* K18 */ be_nested_str_weak(nil), + /* K19 */ be_const_int(0), + /* K20 */ be_nested_str_weak(_X2E_X2E_X2E), + /* K21 */ be_nested_str_weak(MTR_X3A_X20HTTP_X20sync_X2Dresp_X20_X20in_X20_X25i_X20ms_X20from_X20_X25s_X3A_X20_X5B_X25i_X5D_X20_X27_X25s_X27), + /* K22 */ be_nested_str_weak(millis), + /* K23 */ be_nested_str_weak(time_start), + /* K24 */ be_nested_str_weak(payload), }), - be_str_weak(begin_sync), + be_str_weak(call_sync), + &be_const_str_solidified, + ( &(const binstruction[72]) { /* code */ + 0xA40E0000, // 0000 IMPORT R3 K0 + 0xA4120200, // 0001 IMPORT R4 K1 + 0xB8160400, // 0002 GETNGBL R5 K2 + 0x8C140B03, // 0003 GETMET R5 R5 K3 + 0x7C140200, // 0004 CALL R5 1 + 0x94140B04, // 0005 GETIDX R5 R5 K4 + 0x74160006, // 0006 JMPT R5 #000E + 0xB8160400, // 0007 GETNGBL R5 K2 + 0x8C140B05, // 0008 GETMET R5 R5 K5 + 0x7C140200, // 0009 CALL R5 1 + 0x94140B04, // 000A GETIDX R5 R5 K4 + 0x74160001, // 000B JMPT R5 #000E + 0x4C140000, // 000C LDNIL R5 + 0x80040A00, // 000D RET 1 R5 + 0x4C140000, // 000E LDNIL R5 + 0x90020C05, // 000F SETMBR R0 K6 R5 + 0x8C140708, // 0010 GETMET R5 R3 K8 + 0x5C1C0200, // 0011 MOVE R7 R1 + 0x58200009, // 0012 LDCONST R8 K9 + 0x5824000A, // 0013 LDCONST R9 K10 + 0x7C140800, // 0014 CALL R5 4 + 0x00160E05, // 0015 ADD R5 K7 R5 + 0xB81A0400, // 0016 GETNGBL R6 K2 + 0x8C180D0B, // 0017 GETMET R6 R6 K11 + 0x8C20070C, // 0018 GETMET R8 R3 K12 + 0x5828000D, // 0019 LDCONST R10 K13 + 0x882C010E, // 001A GETMBR R11 R0 K14 + 0x8830010F, // 001B GETMBR R12 R0 K15 + 0x5C340A00, // 001C MOVE R13 R5 + 0x7C200A00, // 001D CALL R8 5 + 0x58240010, // 001E LDCONST R9 K16 + 0x7C180600, // 001F CALL R6 3 + 0x60180003, // 0020 GETGBL R6 G3 + 0x5C1C0000, // 0021 MOVE R7 R0 + 0x7C180200, // 0022 CALL R6 1 + 0x8C180D11, // 0023 GETMET R6 R6 K17 + 0x5C200A00, // 0024 MOVE R8 R5 + 0x5C240400, // 0025 MOVE R9 R2 + 0x7C180600, // 0026 CALL R6 3 + 0x781A0001, // 0027 JMPF R6 #002A + 0x5C1C0C00, // 0028 MOVE R7 R6 + 0x70020000, // 0029 JMP #002B + 0x581C0012, // 002A LDCONST R7 K18 + 0x6020000C, // 002B GETGBL R8 G12 + 0x5C240E00, // 002C MOVE R9 R7 + 0x7C200200, // 002D CALL R8 1 + 0x5426001D, // 002E LDINT R9 30 + 0x24201009, // 002F GT R8 R8 R9 + 0x78220004, // 0030 JMPF R8 #0036 + 0x5422001C, // 0031 LDINT R8 29 + 0x40222608, // 0032 CONNECT R8 K19 R8 + 0x94200E08, // 0033 GETIDX R8 R7 R8 + 0x00201114, // 0034 ADD R8 R8 K20 + 0x5C1C1000, // 0035 MOVE R7 R8 + 0xB8220400, // 0036 GETNGBL R8 K2 + 0x8C20110B, // 0037 GETMET R8 R8 K11 + 0x8C28070C, // 0038 GETMET R10 R3 K12 + 0x58300015, // 0039 LDCONST R12 K21 + 0xB8360400, // 003A GETNGBL R13 K2 + 0x8C341B16, // 003B GETMET R13 R13 K22 + 0x7C340200, // 003C CALL R13 1 + 0x88380117, // 003D GETMBR R14 R0 K23 + 0x04341A0E, // 003E SUB R13 R13 R14 + 0x8838010E, // 003F GETMBR R14 R0 K14 + 0x603C000C, // 0040 GETGBL R15 G12 + 0x88400118, // 0041 GETMBR R16 R0 K24 + 0x7C3C0200, // 0042 CALL R15 1 + 0x5C400E00, // 0043 MOVE R16 R7 + 0x7C280C00, // 0044 CALL R10 6 + 0x582C0010, // 0045 LDCONST R11 K16 + 0x7C200600, // 0046 CALL R8 3 + 0x80040C00, // 0047 RET 1 R6 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: web_last_seen +********************************************************************/ +be_local_closure(Matter_HTTP_remote_web_last_seen, /* name */ + be_nested_proto( + 7, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 8]) { /* constants */ + /* K0 */ be_nested_str_weak(webserver), + /* K1 */ be_nested_str_weak(string), + /* K2 */ be_nested_str_weak(reachable_utc), + /* K3 */ be_nested_str_weak(tasmota), + /* K4 */ be_nested_str_weak(rtc), + /* K5 */ be_nested_str_weak(utc), + /* K6 */ be_nested_str_weak(matter), + /* K7 */ be_nested_str_weak(seconds_to_dhm), + }), + be_str_weak(web_last_seen), &be_const_str_solidified, ( &(const binstruction[19]) { /* code */ - 0xA40E0000, // 0000 IMPORT R3 K0 - 0xB8120200, // 0001 GETNGBL R4 K1 - 0x8C100902, // 0002 GETMET R4 R4 K2 - 0x8C180703, // 0003 GETMET R6 R3 K3 - 0x58200004, // 0004 LDCONST R8 K4 - 0x88240105, // 0005 GETMBR R9 R0 K5 - 0x88280106, // 0006 GETMBR R10 R0 K6 - 0x5C2C0200, // 0007 MOVE R11 R1 - 0x7C180A00, // 0008 CALL R6 5 - 0x581C0007, // 0009 LDCONST R7 K7 - 0x7C100600, // 000A CALL R4 3 - 0x60100003, // 000B GETGBL R4 G3 - 0x5C140000, // 000C MOVE R5 R0 - 0x7C100200, // 000D CALL R4 1 - 0x8C100908, // 000E GETMET R4 R4 K8 - 0x5C180200, // 000F MOVE R6 R1 - 0x5C1C0400, // 0010 MOVE R7 R2 - 0x7C100600, // 0011 CALL R4 3 + 0xA4060000, // 0000 IMPORT R1 K0 + 0xA40A0200, // 0001 IMPORT R2 K1 + 0x540DFFFE, // 0002 LDINT R3 -1 + 0x88100102, // 0003 GETMBR R4 R0 K2 + 0x4C140000, // 0004 LDNIL R5 + 0x20100805, // 0005 NE R4 R4 R5 + 0x78120006, // 0006 JMPF R4 #000E + 0xB8120600, // 0007 GETNGBL R4 K3 + 0x8C100904, // 0008 GETMET R4 R4 K4 + 0x7C100200, // 0009 CALL R4 1 + 0x94100905, // 000A GETIDX R4 R4 K5 + 0x88140102, // 000B GETMBR R5 R0 K2 + 0x04100805, // 000C SUB R4 R4 R5 + 0x5C0C0800, // 000D MOVE R3 R4 + 0xB8120C00, // 000E GETNGBL R4 K6 + 0x8C100907, // 000F GETMET R4 R4 K7 + 0x5C180600, // 0010 MOVE R6 R3 + 0x7C100400, // 0011 CALL R4 2 0x80040800, // 0012 RET 1 R4 }) ) @@ -93,12 +219,168 @@ be_local_closure(Matter_HTTP_remote_begin_sync, /* name */ /*******************************************************************/ +/******************************************************************** +** Solidified function: dispatch_cb +********************************************************************/ +be_local_closure(Matter_HTTP_remote_dispatch_cb, /* name */ + be_nested_proto( + 11, /* nstack */ + 3, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 5]) { /* constants */ + /* K0 */ be_const_int(0), + /* K1 */ be_nested_str_weak(async_cb_map), + /* K2 */ be_nested_str_weak(keys), + /* K3 */ be_nested_str_weak(current_cmd), + /* K4 */ be_nested_str_weak(stop_iteration), + }), + be_str_weak(dispatch_cb), + &be_const_str_solidified, + ( &(const binstruction[27]) { /* code */ + 0x580C0000, // 0000 LDCONST R3 K0 + 0x60100010, // 0001 GETGBL R4 G16 + 0x88140101, // 0002 GETMBR R5 R0 K1 + 0x8C140B02, // 0003 GETMET R5 R5 K2 + 0x7C140200, // 0004 CALL R5 1 + 0x7C100200, // 0005 CALL R4 1 + 0xA802000F, // 0006 EXBLK 0 #0017 + 0x5C140800, // 0007 MOVE R5 R4 + 0x7C140000, // 0008 CALL R5 0 + 0x88180101, // 0009 GETMBR R6 R0 K1 + 0x94180C05, // 000A GETIDX R6 R6 R5 + 0x881C0103, // 000B GETMBR R7 R0 K3 + 0x1C1C0C07, // 000C EQ R7 R6 R7 + 0x741E0002, // 000D JMPT R7 #0011 + 0x4C1C0000, // 000E LDNIL R7 + 0x1C1C0C07, // 000F EQ R7 R6 R7 + 0x781E0004, // 0010 JMPF R7 #0016 + 0x5C1C0A00, // 0011 MOVE R7 R5 + 0x5C200200, // 0012 MOVE R8 R1 + 0x5C240400, // 0013 MOVE R9 R2 + 0x88280103, // 0014 GETMBR R10 R0 K3 + 0x7C1C0600, // 0015 CALL R7 3 + 0x7001FFEF, // 0016 JMP #0007 + 0x58100004, // 0017 LDCONST R4 K4 + 0xAC100200, // 0018 CATCH R4 1 0 + 0xB0080000, // 0019 RAISE 2 R0 R0 + 0x80000000, // 001A RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: scheduler +********************************************************************/ +be_local_closure(Matter_HTTP_remote_scheduler, /* name */ + be_nested_proto( + 7, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[10]) { /* constants */ + /* K0 */ be_nested_str_weak(probe_next_timestamp_map), + /* K1 */ be_nested_str_weak(keys), + /* K2 */ be_const_int(0), + /* K3 */ be_nested_str_weak(stop_iteration), + /* K4 */ be_nested_str_weak(tasmota), + /* K5 */ be_nested_str_weak(time_reached), + /* K6 */ be_nested_str_weak(tcp_connected), + /* K7 */ be_nested_str_weak(millis), + /* K8 */ be_nested_str_weak(probe_update_time_map), + /* K9 */ be_nested_str_weak(probe_async), + }), + be_str_weak(scheduler), + &be_const_str_solidified, + ( &(const binstruction[66]) { /* code */ + 0x4C040000, // 0000 LDNIL R1 + 0x60080010, // 0001 GETGBL R2 G16 + 0x880C0100, // 0002 GETMBR R3 R0 K0 + 0x8C0C0701, // 0003 GETMET R3 R3 K1 + 0x7C0C0200, // 0004 CALL R3 1 + 0x7C080200, // 0005 CALL R2 1 + 0xA802000A, // 0006 EXBLK 0 #0012 + 0x5C0C0400, // 0007 MOVE R3 R2 + 0x7C0C0000, // 0008 CALL R3 0 + 0x88100100, // 0009 GETMBR R4 R0 K0 + 0x94100803, // 000A GETIDX R4 R4 R3 + 0x1C100902, // 000B EQ R4 R4 K2 + 0x78120001, // 000C JMPF R4 #000F + 0x5C040600, // 000D MOVE R1 R3 + 0x70020000, // 000E JMP #0010 + 0x7001FFF6, // 000F JMP #0007 + 0xA8040001, // 0010 EXBLK 1 1 + 0x70020002, // 0011 JMP #0015 + 0x58080003, // 0012 LDCONST R2 K3 + 0xAC080200, // 0013 CATCH R2 1 0 + 0xB0080000, // 0014 RAISE 2 R0 R0 + 0x4C080000, // 0015 LDNIL R2 + 0x1C080202, // 0016 EQ R2 R1 R2 + 0x780A0015, // 0017 JMPF R2 #002E + 0x60080010, // 0018 GETGBL R2 G16 + 0x880C0100, // 0019 GETMBR R3 R0 K0 + 0x8C0C0701, // 001A GETMET R3 R3 K1 + 0x7C0C0200, // 001B CALL R3 1 + 0x7C080200, // 001C CALL R2 1 + 0xA802000C, // 001D EXBLK 0 #002B + 0x5C0C0400, // 001E MOVE R3 R2 + 0x7C0C0000, // 001F CALL R3 0 + 0xB8120800, // 0020 GETNGBL R4 K4 + 0x8C100905, // 0021 GETMET R4 R4 K5 + 0x88180100, // 0022 GETMBR R6 R0 K0 + 0x94180C03, // 0023 GETIDX R6 R6 R3 + 0x7C100400, // 0024 CALL R4 2 + 0x78120001, // 0025 JMPF R4 #0028 + 0x5C040600, // 0026 MOVE R1 R3 + 0x70020000, // 0027 JMP #0029 + 0x7001FFF4, // 0028 JMP #001E + 0xA8040001, // 0029 EXBLK 1 1 + 0x70020002, // 002A JMP #002E + 0x58080003, // 002B LDCONST R2 K3 + 0xAC080200, // 002C CATCH R2 1 0 + 0xB0080000, // 002D RAISE 2 R0 R0 + 0x4C080000, // 002E LDNIL R2 + 0x1C080202, // 002F EQ R2 R1 R2 + 0x780A0000, // 0030 JMPF R2 #0032 + 0x80000400, // 0031 RET 0 + 0x88080106, // 0032 GETMBR R2 R0 K6 + 0x780A0002, // 0033 JMPF R2 #0037 + 0x88080100, // 0034 GETMBR R2 R0 K0 + 0x98080302, // 0035 SETIDX R2 R1 K2 + 0x80000400, // 0036 RET 0 + 0x88080100, // 0037 GETMBR R2 R0 K0 + 0xB80E0800, // 0038 GETNGBL R3 K4 + 0x8C0C0707, // 0039 GETMET R3 R3 K7 + 0x88140108, // 003A GETMBR R5 R0 K8 + 0x94140A01, // 003B GETIDX R5 R5 R1 + 0x7C0C0400, // 003C CALL R3 2 + 0x98080203, // 003D SETIDX R2 R1 R3 + 0x8C080109, // 003E GETMET R2 R0 K9 + 0x5C100200, // 003F MOVE R4 R1 + 0x7C080400, // 0040 CALL R2 2 + 0x80000000, // 0041 RET 0 + }) + ) +); +/*******************************************************************/ + + /******************************************************************** ** Solidified function: event_http_finished ********************************************************************/ be_local_closure(Matter_HTTP_remote_event_http_finished, /* name */ be_nested_proto( - 10, /* nstack */ + 12, /* nstack */ 1, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -106,64 +388,203 @@ be_local_closure(Matter_HTTP_remote_event_http_finished, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[14]) { /* constants */ - /* K0 */ be_nested_str_weak(string), - /* K1 */ be_nested_str_weak(payload), - /* K2 */ be_nested_str_weak(nil), - /* K3 */ be_const_int(0), - /* K4 */ be_nested_str_weak(_X2E_X2E_X2E), - /* K5 */ be_nested_str_weak(tasmota), - /* K6 */ be_nested_str_weak(log), - /* K7 */ be_nested_str_weak(format), - /* K8 */ be_nested_str_weak(MTR_X3A_X20HTTP_X20response_X20in_X20_X25i_X20ms_X3A_X20_X27_X25s_X27), - /* K9 */ be_nested_str_weak(millis), - /* K10 */ be_nested_str_weak(time_start), - /* K11 */ be_const_int(3), - /* K12 */ be_nested_str_weak(cb), - /* K13 */ be_nested_str_weak(http_status), + ( &(const bvalue[16]) { /* constants */ + /* K0 */ be_nested_str_weak(current_cmd), + /* K1 */ be_nested_str_weak(string), + /* K2 */ be_nested_str_weak(payload), + /* K3 */ be_nested_str_weak(nil), + /* K4 */ be_const_int(0), + /* K5 */ be_nested_str_weak(_X2E_X2E_X2E), + /* K6 */ be_nested_str_weak(tasmota), + /* K7 */ be_nested_str_weak(log), + /* K8 */ be_nested_str_weak(format), + /* K9 */ be_nested_str_weak(MTR_X3A_X20HTTP_X20async_X2Dresp_X20in_X20_X25i_X20ms_X20from_X20_X25s_X3A_X20_X5B_X25i_X5D_X20_X27_X25s_X27), + /* K10 */ be_nested_str_weak(millis), + /* K11 */ be_nested_str_weak(time_start), + /* K12 */ be_nested_str_weak(addr), + /* K13 */ be_const_int(2), + /* K14 */ be_nested_str_weak(dispatch_cb), + /* K15 */ be_nested_str_weak(http_status), }), be_str_weak(event_http_finished), &be_const_str_solidified, - ( &(const binstruction[39]) { /* code */ - 0xA4060000, // 0000 IMPORT R1 K0 - 0x88080101, // 0001 GETMBR R2 R0 K1 - 0x4C0C0000, // 0002 LDNIL R3 - 0x20080403, // 0003 NE R2 R2 R3 - 0x780A0001, // 0004 JMPF R2 #0007 - 0x88080101, // 0005 GETMBR R2 R0 K1 - 0x70020000, // 0006 JMP #0008 - 0x58080002, // 0007 LDCONST R2 K2 - 0x600C000C, // 0008 GETGBL R3 G12 - 0x5C100400, // 0009 MOVE R4 R2 - 0x7C0C0200, // 000A CALL R3 1 - 0x5412001D, // 000B LDINT R4 30 - 0x240C0604, // 000C GT R3 R3 R4 - 0x780E0004, // 000D JMPF R3 #0013 - 0x540E001C, // 000E LDINT R3 29 - 0x400E0603, // 000F CONNECT R3 K3 R3 - 0x940C0403, // 0010 GETIDX R3 R2 R3 - 0x000C0704, // 0011 ADD R3 R3 K4 - 0x5C080600, // 0012 MOVE R2 R3 - 0xB80E0A00, // 0013 GETNGBL R3 K5 - 0x8C0C0706, // 0014 GETMET R3 R3 K6 - 0x8C140307, // 0015 GETMET R5 R1 K7 - 0x581C0008, // 0016 LDCONST R7 K8 - 0xB8220A00, // 0017 GETNGBL R8 K5 - 0x8C201109, // 0018 GETMET R8 R8 K9 - 0x7C200200, // 0019 CALL R8 1 - 0x8824010A, // 001A GETMBR R9 R0 K10 - 0x04201009, // 001B SUB R8 R8 R9 - 0x5C240400, // 001C MOVE R9 R2 - 0x7C140800, // 001D CALL R5 4 - 0x5818000B, // 001E LDCONST R6 K11 - 0x7C0C0600, // 001F CALL R3 3 - 0x880C010C, // 0020 GETMBR R3 R0 K12 - 0x780E0003, // 0021 JMPF R3 #0026 - 0x8C0C010C, // 0022 GETMET R3 R0 K12 - 0x8814010D, // 0023 GETMBR R5 R0 K13 - 0x88180101, // 0024 GETMBR R6 R0 K1 - 0x7C0C0600, // 0025 CALL R3 3 - 0x80000000, // 0026 RET 0 + ( &(const binstruction[46]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x4C080000, // 0001 LDNIL R2 + 0x1C040202, // 0002 EQ R1 R1 R2 + 0x78060000, // 0003 JMPF R1 #0005 + 0x80000200, // 0004 RET 0 + 0xA4060200, // 0005 IMPORT R1 K1 + 0x88080102, // 0006 GETMBR R2 R0 K2 + 0x4C0C0000, // 0007 LDNIL R3 + 0x20080403, // 0008 NE R2 R2 R3 + 0x780A0001, // 0009 JMPF R2 #000C + 0x88080102, // 000A GETMBR R2 R0 K2 + 0x70020000, // 000B JMP #000D + 0x58080003, // 000C LDCONST R2 K3 + 0x600C000C, // 000D GETGBL R3 G12 + 0x5C100400, // 000E MOVE R4 R2 + 0x7C0C0200, // 000F CALL R3 1 + 0x5412001D, // 0010 LDINT R4 30 + 0x240C0604, // 0011 GT R3 R3 R4 + 0x780E0004, // 0012 JMPF R3 #0018 + 0x540E001C, // 0013 LDINT R3 29 + 0x400E0803, // 0014 CONNECT R3 K4 R3 + 0x940C0403, // 0015 GETIDX R3 R2 R3 + 0x000C0705, // 0016 ADD R3 R3 K5 + 0x5C080600, // 0017 MOVE R2 R3 + 0xB80E0C00, // 0018 GETNGBL R3 K6 + 0x8C0C0707, // 0019 GETMET R3 R3 K7 + 0x8C140308, // 001A GETMET R5 R1 K8 + 0x581C0009, // 001B LDCONST R7 K9 + 0xB8220C00, // 001C GETNGBL R8 K6 + 0x8C20110A, // 001D GETMET R8 R8 K10 + 0x7C200200, // 001E CALL R8 1 + 0x8824010B, // 001F GETMBR R9 R0 K11 + 0x04201009, // 0020 SUB R8 R8 R9 + 0x8824010C, // 0021 GETMBR R9 R0 K12 + 0x6028000C, // 0022 GETGBL R10 G12 + 0x882C0102, // 0023 GETMBR R11 R0 K2 + 0x7C280200, // 0024 CALL R10 1 + 0x5C2C0400, // 0025 MOVE R11 R2 + 0x7C140C00, // 0026 CALL R5 6 + 0x5818000D, // 0027 LDCONST R6 K13 + 0x7C0C0600, // 0028 CALL R3 3 + 0x8C0C010E, // 0029 GETMET R3 R0 K14 + 0x8814010F, // 002A GETMBR R5 R0 K15 + 0x88180102, // 002B GETMBR R6 R0 K2 + 0x7C0C0600, // 002C CALL R3 3 + 0x80000000, // 002D RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: probe_async +********************************************************************/ +be_local_closure(Matter_HTTP_remote_probe_async, /* name */ + be_nested_proto( + 13, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[18]) { /* constants */ + /* K0 */ be_nested_str_weak(string), + /* K1 */ be_nested_str_weak(webserver), + /* K2 */ be_nested_str_weak(tasmota), + /* K3 */ be_nested_str_weak(wifi), + /* K4 */ be_nested_str_weak(up), + /* K5 */ be_nested_str_weak(eth), + /* K6 */ be_nested_str_weak(current_cmd), + /* K7 */ be_nested_str_weak(_X2Fcm_X3Fcmnd_X3D), + /* K8 */ be_nested_str_weak(tr), + /* K9 */ be_nested_str_weak(_X20), + /* K10 */ be_nested_str_weak(_X2B), + /* K11 */ be_nested_str_weak(log), + /* K12 */ be_nested_str_weak(format), + /* K13 */ be_nested_str_weak(MTR_X3A_X20HTTP_X20async_X20request_X20_X27http_X3A_X2F_X2F_X25s_X3A_X25i_X25s_X27), + /* K14 */ be_nested_str_weak(addr), + /* K15 */ be_nested_str_weak(port), + /* K16 */ be_const_int(3), + /* K17 */ be_nested_str_weak(begin), + }), + be_str_weak(probe_async), + &be_const_str_solidified, + ( &(const binstruction[35]) { /* code */ + 0xA40A0000, // 0000 IMPORT R2 K0 + 0xA40E0200, // 0001 IMPORT R3 K1 + 0xB8120400, // 0002 GETNGBL R4 K2 + 0x8C100903, // 0003 GETMET R4 R4 K3 + 0x7C100200, // 0004 CALL R4 1 + 0x94100904, // 0005 GETIDX R4 R4 K4 + 0x74120006, // 0006 JMPT R4 #000E + 0xB8120400, // 0007 GETNGBL R4 K2 + 0x8C100905, // 0008 GETMET R4 R4 K5 + 0x7C100200, // 0009 CALL R4 1 + 0x94100904, // 000A GETIDX R4 R4 K4 + 0x74120001, // 000B JMPT R4 #000E + 0x4C100000, // 000C LDNIL R4 + 0x80040800, // 000D RET 1 R4 + 0x90020C01, // 000E SETMBR R0 K6 R1 + 0x8C100508, // 000F GETMET R4 R2 K8 + 0x5C180200, // 0010 MOVE R6 R1 + 0x581C0009, // 0011 LDCONST R7 K9 + 0x5820000A, // 0012 LDCONST R8 K10 + 0x7C100800, // 0013 CALL R4 4 + 0x00120E04, // 0014 ADD R4 K7 R4 + 0xB8160400, // 0015 GETNGBL R5 K2 + 0x8C140B0B, // 0016 GETMET R5 R5 K11 + 0x8C1C050C, // 0017 GETMET R7 R2 K12 + 0x5824000D, // 0018 LDCONST R9 K13 + 0x8828010E, // 0019 GETMBR R10 R0 K14 + 0x882C010F, // 001A GETMBR R11 R0 K15 + 0x5C300800, // 001B MOVE R12 R4 + 0x7C1C0A00, // 001C CALL R7 5 + 0x58200010, // 001D LDCONST R8 K16 + 0x7C140600, // 001E CALL R5 3 + 0x8C140111, // 001F GETMET R5 R0 K17 + 0x5C1C0800, // 0020 MOVE R7 R4 + 0x7C140400, // 0021 CALL R5 2 + 0x80000000, // 0022 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: init +********************************************************************/ +be_local_closure(Matter_HTTP_remote_init, /* name */ + be_nested_proto( + 10, /* nstack */ + 4, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 6]) { /* constants */ + /* K0 */ be_nested_str_weak(probe_update_time_map), + /* K1 */ be_nested_str_weak(probe_next_timestamp_map), + /* K2 */ be_nested_str_weak(async_cb_map), + /* K3 */ be_nested_str_weak(current_cmd), + /* K4 */ be_nested_str_weak(reachable), + /* K5 */ be_nested_str_weak(init), + }), + be_str_weak(init), + &be_const_str_solidified, + ( &(const binstruction[23]) { /* code */ + 0x60100013, // 0000 GETGBL R4 G19 + 0x7C100000, // 0001 CALL R4 0 + 0x90020004, // 0002 SETMBR R0 K0 R4 + 0x60100013, // 0003 GETGBL R4 G19 + 0x7C100000, // 0004 CALL R4 0 + 0x90020204, // 0005 SETMBR R0 K1 R4 + 0x60100013, // 0006 GETGBL R4 G19 + 0x7C100000, // 0007 CALL R4 0 + 0x90020404, // 0008 SETMBR R0 K2 R4 + 0x4C100000, // 0009 LDNIL R4 + 0x90020604, // 000A SETMBR R0 K3 R4 + 0x50100000, // 000B LDBOOL R4 0 0 + 0x90020804, // 000C SETMBR R0 K4 R4 + 0x60100003, // 000D GETGBL R4 G3 + 0x5C140000, // 000E MOVE R5 R0 + 0x7C100200, // 000F CALL R4 1 + 0x8C100905, // 0010 GETMET R4 R4 K5 + 0x5C180200, // 0011 MOVE R6 R1 + 0x541E004F, // 0012 LDINT R7 80 + 0x5C200400, // 0013 MOVE R8 R2 + 0x5C240600, // 0014 MOVE R9 R3 + 0x7C100A00, // 0015 CALL R4 5 + 0x80000000, // 0016 RET 0 }) ) ); @@ -183,107 +604,33 @@ be_local_closure(Matter_HTTP_remote_event_http_failed, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[ 6]) { /* constants */ - /* K0 */ be_nested_str_weak(tasmota), - /* K1 */ be_nested_str_weak(log), - /* K2 */ be_nested_str_weak(MTR_X3A_X20HTTP_X20failed), - /* K3 */ be_const_int(3), - /* K4 */ be_nested_str_weak(cb), - /* K5 */ be_nested_str_weak(http_status), + ( &(const bvalue[ 7]) { /* constants */ + /* K0 */ be_nested_str_weak(current_cmd), + /* K1 */ be_nested_str_weak(tasmota), + /* K2 */ be_nested_str_weak(log), + /* K3 */ be_nested_str_weak(MTR_X3A_X20HTTP_X20failed), + /* K4 */ be_const_int(3), + /* K5 */ be_nested_str_weak(dispatch_cb), + /* K6 */ be_nested_str_weak(http_status), }), be_str_weak(event_http_failed), &be_const_str_solidified, - ( &(const binstruction[12]) { /* code */ - 0xB8060000, // 0000 GETNGBL R1 K0 - 0x8C040301, // 0001 GETMET R1 R1 K1 - 0x580C0002, // 0002 LDCONST R3 K2 - 0x58100003, // 0003 LDCONST R4 K3 - 0x7C040600, // 0004 CALL R1 3 - 0x88040104, // 0005 GETMBR R1 R0 K4 - 0x78060003, // 0006 JMPF R1 #000B - 0x8C040104, // 0007 GETMET R1 R0 K4 - 0x880C0105, // 0008 GETMBR R3 R0 K5 - 0x4C100000, // 0009 LDNIL R4 - 0x7C040600, // 000A CALL R1 3 - 0x80000000, // 000B RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: set_cb -********************************************************************/ -be_local_closure(Matter_HTTP_remote_set_cb, /* name */ - be_nested_proto( - 2, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 1]) { /* constants */ - /* K0 */ be_nested_str_weak(cb), - }), - be_str_weak(set_cb), - &be_const_str_solidified, - ( &(const binstruction[ 2]) { /* code */ - 0x90020001, // 0000 SETMBR R0 K0 R1 - 0x80000000, // 0001 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: begin -********************************************************************/ -be_local_closure(Matter_HTTP_remote_begin, /* name */ - be_nested_proto( - 11, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 9]) { /* constants */ - /* K0 */ be_nested_str_weak(string), - /* K1 */ be_nested_str_weak(tasmota), - /* K2 */ be_nested_str_weak(log), - /* K3 */ be_nested_str_weak(format), - /* K4 */ be_nested_str_weak(MTR_X3A_X20HTTP_X20async_X20request_X20_X27http_X3A_X2F_X2F_X25s_X3A_X25i_X25s_X27), - /* K5 */ be_nested_str_weak(addr), - /* K6 */ be_nested_str_weak(port), - /* K7 */ be_const_int(3), - /* K8 */ be_nested_str_weak(begin), - }), - be_str_weak(begin), - &be_const_str_solidified, - ( &(const binstruction[18]) { /* code */ - 0xA40A0000, // 0000 IMPORT R2 K0 - 0xB80E0200, // 0001 GETNGBL R3 K1 - 0x8C0C0702, // 0002 GETMET R3 R3 K2 - 0x8C140503, // 0003 GETMET R5 R2 K3 - 0x581C0004, // 0004 LDCONST R7 K4 - 0x88200105, // 0005 GETMBR R8 R0 K5 - 0x88240106, // 0006 GETMBR R9 R0 K6 - 0x5C280200, // 0007 MOVE R10 R1 - 0x7C140A00, // 0008 CALL R5 5 - 0x58180007, // 0009 LDCONST R6 K7 - 0x7C0C0600, // 000A CALL R3 3 - 0x600C0003, // 000B GETGBL R3 G3 - 0x5C100000, // 000C MOVE R4 R0 - 0x7C0C0200, // 000D CALL R3 1 - 0x8C0C0708, // 000E GETMET R3 R3 K8 - 0x5C140200, // 000F MOVE R5 R1 - 0x7C0C0400, // 0010 CALL R3 2 - 0x80040600, // 0011 RET 1 R3 + ( &(const binstruction[15]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x4C080000, // 0001 LDNIL R2 + 0x1C040202, // 0002 EQ R1 R1 R2 + 0x78060000, // 0003 JMPF R1 #0005 + 0x80000200, // 0004 RET 0 + 0xB8060200, // 0005 GETNGBL R1 K1 + 0x8C040302, // 0006 GETMET R1 R1 K2 + 0x580C0003, // 0007 LDCONST R3 K3 + 0x58100004, // 0008 LDCONST R4 K4 + 0x7C040600, // 0009 CALL R1 3 + 0x8C040105, // 000A GETMET R1 R0 K5 + 0x880C0106, // 000B GETMBR R3 R0 K6 + 0x4C100000, // 000C LDNIL R4 + 0x7C040600, // 000D CALL R1 3 + 0x80000000, // 000E RET 0 }) ) ); @@ -295,7 +642,7 @@ be_local_closure(Matter_HTTP_remote_begin, /* name */ ********************************************************************/ be_local_closure(Matter_HTTP_remote_event_http_timeout, /* name */ be_nested_proto( - 5, /* nstack */ + 12, /* nstack */ 1, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -303,29 +650,130 @@ be_local_closure(Matter_HTTP_remote_event_http_timeout, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[ 6]) { /* constants */ - /* K0 */ be_nested_str_weak(tasmota), - /* K1 */ be_nested_str_weak(log), - /* K2 */ be_nested_str_weak(MTR_X3A_X20HTTP_X20timeout), - /* K3 */ be_const_int(3), - /* K4 */ be_nested_str_weak(cb), - /* K5 */ be_nested_str_weak(http_status), + ( &(const bvalue[12]) { /* constants */ + /* K0 */ be_nested_str_weak(string), + /* K1 */ be_nested_str_weak(current_cmd), + /* K2 */ be_nested_str_weak(tasmota), + /* K3 */ be_nested_str_weak(log), + /* K4 */ be_nested_str_weak(format), + /* K5 */ be_nested_str_weak(MTR_X3A_X20HTTP_X20timeout_X20http_status_X3D_X25i_X20phase_X3D_X25i_X20tcp_status_X3D_X25i_X20size_payload_X3D_X25i), + /* K6 */ be_nested_str_weak(http_status), + /* K7 */ be_nested_str_weak(phase), + /* K8 */ be_nested_str_weak(status), + /* K9 */ be_nested_str_weak(payload), + /* K10 */ be_const_int(2), + /* K11 */ be_nested_str_weak(dispatch_cb), }), be_str_weak(event_http_timeout), &be_const_str_solidified, - ( &(const binstruction[12]) { /* code */ - 0xB8060000, // 0000 GETNGBL R1 K0 - 0x8C040301, // 0001 GETMET R1 R1 K1 - 0x580C0002, // 0002 LDCONST R3 K2 - 0x58100003, // 0003 LDCONST R4 K3 - 0x7C040600, // 0004 CALL R1 3 - 0x88040104, // 0005 GETMBR R1 R0 K4 - 0x78060003, // 0006 JMPF R1 #000B - 0x8C040104, // 0007 GETMET R1 R0 K4 - 0x880C0105, // 0008 GETMBR R3 R0 K5 - 0x4C100000, // 0009 LDNIL R4 - 0x7C040600, // 000A CALL R1 3 - 0x80000000, // 000B RET 0 + ( &(const binstruction[24]) { /* code */ + 0xA4060000, // 0000 IMPORT R1 K0 + 0x88080101, // 0001 GETMBR R2 R0 K1 + 0x4C0C0000, // 0002 LDNIL R3 + 0x1C080403, // 0003 EQ R2 R2 R3 + 0x780A0000, // 0004 JMPF R2 #0006 + 0x80000400, // 0005 RET 0 + 0xB80A0400, // 0006 GETNGBL R2 K2 + 0x8C080503, // 0007 GETMET R2 R2 K3 + 0x8C100304, // 0008 GETMET R4 R1 K4 + 0x58180005, // 0009 LDCONST R6 K5 + 0x881C0106, // 000A GETMBR R7 R0 K6 + 0x88200107, // 000B GETMBR R8 R0 K7 + 0x88240108, // 000C GETMBR R9 R0 K8 + 0x6028000C, // 000D GETGBL R10 G12 + 0x882C0109, // 000E GETMBR R11 R0 K9 + 0x7C280200, // 000F CALL R10 1 + 0x7C100C00, // 0010 CALL R4 6 + 0x5814000A, // 0011 LDCONST R5 K10 + 0x7C080600, // 0012 CALL R2 3 + 0x8C08010B, // 0013 GETMET R2 R0 K11 + 0x88100106, // 0014 GETMBR R4 R0 K6 + 0x4C140000, // 0015 LDNIL R5 + 0x7C080600, // 0016 CALL R2 3 + 0x80000000, // 0017 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: add_async_cb +********************************************************************/ +be_local_closure(Matter_HTTP_remote_add_async_cb, /* name */ + be_nested_proto( + 4, /* nstack */ + 3, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 1]) { /* constants */ + /* K0 */ be_nested_str_weak(async_cb_map), + }), + be_str_weak(add_async_cb), + &be_const_str_solidified, + ( &(const binstruction[ 3]) { /* code */ + 0x880C0100, // 0000 GETMBR R3 R0 K0 + 0x980C0202, // 0001 SETIDX R3 R1 R2 + 0x80000000, // 0002 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: add_schedule +********************************************************************/ +be_local_closure(Matter_HTTP_remote_add_schedule, /* name */ + be_nested_proto( + 8, /* nstack */ + 4, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 6]) { /* constants */ + /* K0 */ be_nested_str_weak(probe_update_time_map), + /* K1 */ be_nested_str_weak(contains), + /* K2 */ be_nested_str_weak(probe_next_timestamp_map), + /* K3 */ be_nested_str_weak(matter), + /* K4 */ be_nested_str_weak(jitter), + /* K5 */ be_nested_str_weak(add_async_cb), + }), + be_str_weak(add_schedule), + &be_const_str_solidified, + ( &(const binstruction[25]) { /* code */ + 0x88100100, // 0000 GETMBR R4 R0 K0 + 0x8C100901, // 0001 GETMET R4 R4 K1 + 0x5C180200, // 0002 MOVE R6 R1 + 0x7C100400, // 0003 CALL R4 2 + 0x78120003, // 0004 JMPF R4 #0009 + 0x88100100, // 0005 GETMBR R4 R0 K0 + 0x94100801, // 0006 GETIDX R4 R4 R1 + 0x14100404, // 0007 LT R4 R2 R4 + 0x78120007, // 0008 JMPF R4 #0011 + 0x88100100, // 0009 GETMBR R4 R0 K0 + 0x98100202, // 000A SETIDX R4 R1 R2 + 0x88100102, // 000B GETMBR R4 R0 K2 + 0xB8160600, // 000C GETNGBL R5 K3 + 0x8C140B04, // 000D GETMET R5 R5 K4 + 0x5C1C0400, // 000E MOVE R7 R2 + 0x7C140400, // 000F CALL R5 2 + 0x98100205, // 0010 SETIDX R4 R1 R5 + 0x4C100000, // 0011 LDNIL R4 + 0x20100604, // 0012 NE R4 R3 R4 + 0x78120003, // 0013 JMPF R4 #0018 + 0x8C100105, // 0014 GETMET R4 R0 K5 + 0x5C180600, // 0015 MOVE R6 R3 + 0x5C1C0200, // 0016 MOVE R7 R1 + 0x7C100600, // 0017 CALL R4 3 + 0x80000000, // 0018 RET 0 }) ) ); @@ -337,18 +785,28 @@ be_local_closure(Matter_HTTP_remote_event_http_timeout, /* name */ ********************************************************************/ extern const bclass be_class_Matter_HTTP_async; be_local_class(Matter_HTTP_remote, - 1, + 6, &be_class_Matter_HTTP_async, - be_nested_map(8, + be_nested_map(18, ( (struct bmapnode*) &(const bmapnode[]) { - { be_const_key_weak(cb, 1), be_const_var(0) }, - { be_const_key_weak(event_http_timeout, -1), be_const_closure(Matter_HTTP_remote_event_http_timeout_closure) }, - { be_const_key_weak(event_http_failed, -1), be_const_closure(Matter_HTTP_remote_event_http_failed_closure) }, - { be_const_key_weak(init, 7), be_const_closure(Matter_HTTP_remote_init_closure) }, - { be_const_key_weak(begin_sync, 2), be_const_closure(Matter_HTTP_remote_begin_sync_closure) }, - { be_const_key_weak(set_cb, -1), be_const_closure(Matter_HTTP_remote_set_cb_closure) }, - { be_const_key_weak(begin, -1), be_const_closure(Matter_HTTP_remote_begin_closure) }, + { be_const_key_weak(device_is_alive, 4), be_const_closure(Matter_HTTP_remote_device_is_alive_closure) }, + { be_const_key_weak(current_cmd, -1), be_const_var(3) }, + { be_const_key_weak(reachable, -1), be_const_var(4) }, + { be_const_key_weak(probe_next_timestamp_map, -1), be_const_var(1) }, + { be_const_key_weak(web_last_seen, -1), be_const_closure(Matter_HTTP_remote_web_last_seen_closure) }, + { be_const_key_weak(dispatch_cb, -1), be_const_closure(Matter_HTTP_remote_dispatch_cb_closure) }, + { be_const_key_weak(async_cb_map, -1), be_const_var(2) }, + { be_const_key_weak(add_async_cb, -1), be_const_closure(Matter_HTTP_remote_add_async_cb_closure) }, + { be_const_key_weak(probe_update_time_map, 11), be_const_var(0) }, { be_const_key_weak(event_http_finished, -1), be_const_closure(Matter_HTTP_remote_event_http_finished_closure) }, + { be_const_key_weak(probe_async, -1), be_const_closure(Matter_HTTP_remote_probe_async_closure) }, + { be_const_key_weak(scheduler, -1), be_const_closure(Matter_HTTP_remote_scheduler_closure) }, + { be_const_key_weak(event_http_failed, -1), be_const_closure(Matter_HTTP_remote_event_http_failed_closure) }, + { be_const_key_weak(reachable_utc, -1), be_const_var(5) }, + { be_const_key_weak(event_http_timeout, -1), be_const_closure(Matter_HTTP_remote_event_http_timeout_closure) }, + { be_const_key_weak(init, 7), be_const_closure(Matter_HTTP_remote_init_closure) }, + { be_const_key_weak(add_schedule, -1), be_const_closure(Matter_HTTP_remote_add_schedule_closure) }, + { be_const_key_weak(call_sync, 3), be_const_closure(Matter_HTTP_remote_call_sync_closure) }, })), be_str_weak(Matter_HTTP_remote) ); diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin.h index 56a8e65a6..e12baa6a7 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin.h @@ -7,74 +7,24 @@ extern const bclass be_class_Matter_Plugin; /******************************************************************** -** Solidified function: every_250ms +** Solidified function: read_event ********************************************************************/ -be_local_closure(Matter_Plugin_every_250ms, /* name */ +be_local_closure(Matter_Plugin_read_event, /* name */ be_nested_proto( 6, /* nstack */ - 1, /* argc */ + 5, /* argc */ 2, /* varg */ 0, /* has upvals */ NULL, /* no upvals */ 0, /* has sup protos */ NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[13]) { /* constants */ - /* K0 */ be_nested_str_weak(update_next), - /* K1 */ be_nested_str_weak(crypto), - /* K2 */ be_nested_str_weak(random), - /* K3 */ be_nested_str_weak(get), - /* K4 */ be_const_int(0), - /* K5 */ be_const_int(2147483647), - /* K6 */ be_nested_str_weak(tasmota), - /* K7 */ be_nested_str_weak(millis), - /* K8 */ be_nested_str_weak(UPDATE_TIME), - /* K9 */ be_nested_str_weak(time_reached), - /* K10 */ be_nested_str_weak(tick), - /* K11 */ be_nested_str_weak(device), - /* K12 */ be_nested_str_weak(probe_shadow_async), - }), - be_str_weak(every_250ms), + 0, /* has constants */ + NULL, /* no const */ + be_str_weak(read_event), &be_const_str_solidified, - ( &(const binstruction[38]) { /* code */ - 0x88040100, // 0000 GETMBR R1 R0 K0 - 0x4C080000, // 0001 LDNIL R2 - 0x1C040202, // 0002 EQ R1 R1 R2 - 0x7806000F, // 0003 JMPF R1 #0014 - 0xA4060200, // 0004 IMPORT R1 K1 - 0x8C080302, // 0005 GETMET R2 R1 K2 - 0x54120003, // 0006 LDINT R4 4 - 0x7C080400, // 0007 CALL R2 2 - 0x8C080503, // 0008 GETMET R2 R2 K3 - 0x58100004, // 0009 LDCONST R4 K4 - 0x54160003, // 000A LDINT R5 4 - 0x7C080600, // 000B CALL R2 3 - 0x2C080505, // 000C AND R2 R2 K5 - 0xB80E0C00, // 000D GETNGBL R3 K6 - 0x8C0C0707, // 000E GETMET R3 R3 K7 - 0x88140108, // 000F GETMBR R5 R0 K8 - 0x10140405, // 0010 MOD R5 R2 R5 - 0x7C0C0400, // 0011 CALL R3 2 - 0x90020003, // 0012 SETMBR R0 K0 R3 - 0x70020010, // 0013 JMP #0025 - 0xB8060C00, // 0014 GETNGBL R1 K6 - 0x8C040309, // 0015 GETMET R1 R1 K9 - 0x880C0100, // 0016 GETMBR R3 R0 K0 - 0x7C040400, // 0017 CALL R1 2 - 0x7806000B, // 0018 JMPF R1 #0025 - 0x8804010A, // 0019 GETMBR R1 R0 K10 - 0x8808010B, // 001A GETMBR R2 R0 K11 - 0x8808050A, // 001B GETMBR R2 R2 K10 - 0x20040202, // 001C NE R1 R1 R2 - 0x78060001, // 001D JMPF R1 #0020 - 0x8C04010C, // 001E GETMET R1 R0 K12 - 0x7C040200, // 001F CALL R1 1 - 0xB8060C00, // 0020 GETNGBL R1 K6 - 0x8C040307, // 0021 GETMET R1 R1 K7 - 0x880C0108, // 0022 GETMBR R3 R0 K8 - 0x7C040400, // 0023 CALL R1 2 - 0x90020001, // 0024 SETMBR R0 K0 R1 - 0x80000000, // 0025 RET 0 + ( &(const binstruction[ 2]) { /* code */ + 0x4C140000, // 0000 LDNIL R5 + 0x80040A00, // 0001 RET 1 R5 }) ) ); @@ -127,6 +77,57 @@ be_local_closure(Matter_Plugin_get_cluster_list, /* name */ /*******************************************************************/ +/******************************************************************** +** Solidified function: get_endpoint +********************************************************************/ +be_local_closure(Matter_Plugin_get_endpoint, /* name */ + be_nested_proto( + 2, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 1]) { /* constants */ + /* K0 */ be_nested_str_weak(endpoint), + }), + be_str_weak(get_endpoint), + &be_const_str_solidified, + ( &(const binstruction[ 2]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x80040200, // 0001 RET 1 R1 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: parse_sensors +********************************************************************/ +be_local_closure(Matter_Plugin_parse_sensors, /* name */ + be_nested_proto( + 2, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 0, /* has constants */ + NULL, /* no const */ + be_str_weak(parse_sensors), + &be_const_str_solidified, + ( &(const binstruction[ 1]) { /* code */ + 0x80000000, // 0000 RET 0 + }) + ) +); +/*******************************************************************/ + + /******************************************************************** ** Solidified function: ********************************************************************/ @@ -154,6 +155,171 @@ be_local_closure(Matter_Plugin__X3Clambda_X3E, /* name */ /*******************************************************************/ +/******************************************************************** +** Solidified function: update_shadow_lazy +********************************************************************/ +be_local_closure(Matter_Plugin_update_shadow_lazy, /* name */ + be_nested_proto( + 3, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 3]) { /* constants */ + /* K0 */ be_nested_str_weak(tick), + /* K1 */ be_nested_str_weak(device), + /* K2 */ be_nested_str_weak(update_shadow), + }), + be_str_weak(update_shadow_lazy), + &be_const_str_solidified, + ( &(const binstruction[11]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x88080101, // 0001 GETMBR R2 R0 K1 + 0x88080500, // 0002 GETMBR R2 R2 K0 + 0x20040202, // 0003 NE R1 R1 R2 + 0x78060004, // 0004 JMPF R1 #000A + 0x8C040102, // 0005 GETMET R1 R0 K2 + 0x7C040200, // 0006 CALL R1 1 + 0x88040101, // 0007 GETMBR R1 R0 K1 + 0x88040300, // 0008 GETMBR R1 R1 K0 + 0x90020001, // 0009 SETMBR R0 K0 R1 + 0x80000000, // 000A RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: subscribe_event +********************************************************************/ +be_local_closure(Matter_Plugin_subscribe_event, /* name */ + be_nested_proto( + 6, /* nstack */ + 5, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 0, /* has constants */ + NULL, /* no const */ + be_str_weak(subscribe_event), + &be_const_str_solidified, + ( &(const binstruction[ 2]) { /* code */ + 0x4C140000, // 0000 LDNIL R5 + 0x80040A00, // 0001 RET 1 R5 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: every_250ms +********************************************************************/ +be_local_closure(Matter_Plugin_every_250ms, /* name */ + be_nested_proto( + 4, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[10]) { /* constants */ + /* K0 */ be_nested_str_weak(update_next), + /* K1 */ be_nested_str_weak(matter), + /* K2 */ be_nested_str_weak(jitter), + /* K3 */ be_nested_str_weak(UPDATE_TIME), + /* K4 */ be_nested_str_weak(tasmota), + /* K5 */ be_nested_str_weak(time_reached), + /* K6 */ be_nested_str_weak(tick), + /* K7 */ be_nested_str_weak(device), + /* K8 */ be_nested_str_weak(update_shadow), + /* K9 */ be_nested_str_weak(millis), + }), + be_str_weak(every_250ms), + &be_const_str_solidified, + ( &(const binstruction[28]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x4C080000, // 0001 LDNIL R2 + 0x1C040202, // 0002 EQ R1 R1 R2 + 0x78060005, // 0003 JMPF R1 #000A + 0xB8060200, // 0004 GETNGBL R1 K1 + 0x8C040302, // 0005 GETMET R1 R1 K2 + 0x880C0103, // 0006 GETMBR R3 R0 K3 + 0x7C040400, // 0007 CALL R1 2 + 0x90020001, // 0008 SETMBR R0 K0 R1 + 0x70020010, // 0009 JMP #001B + 0xB8060800, // 000A GETNGBL R1 K4 + 0x8C040305, // 000B GETMET R1 R1 K5 + 0x880C0100, // 000C GETMBR R3 R0 K0 + 0x7C040400, // 000D CALL R1 2 + 0x7806000B, // 000E JMPF R1 #001B + 0x88040106, // 000F GETMBR R1 R0 K6 + 0x88080107, // 0010 GETMBR R2 R0 K7 + 0x88080506, // 0011 GETMBR R2 R2 K6 + 0x20040202, // 0012 NE R1 R1 R2 + 0x78060001, // 0013 JMPF R1 #0016 + 0x8C040108, // 0014 GETMET R1 R0 K8 + 0x7C040200, // 0015 CALL R1 1 + 0xB8060800, // 0016 GETNGBL R1 K4 + 0x8C040309, // 0017 GETMET R1 R1 K9 + 0x880C0103, // 0018 GETMBR R3 R0 K3 + 0x7C040400, // 0019 CALL R1 2 + 0x90020001, // 001A SETMBR R0 K0 R1 + 0x80000000, // 001B RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: ui_conf_to_string +********************************************************************/ +be_local_closure(Matter_Plugin_ui_conf_to_string, /* name */ + be_nested_proto( + 9, /* nstack */ + 2, /* argc */ + 4, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 4]) { /* constants */ + /* K0 */ be_const_class(be_class_Matter_Plugin), + /* K1 */ be_nested_str_weak(ARG), + /* K2 */ be_nested_str_weak(find), + /* K3 */ be_nested_str_weak(), + }), + be_str_weak(ui_conf_to_string), + &be_const_str_solidified, + ( &(const binstruction[12]) { /* code */ + 0x58080000, // 0000 LDCONST R2 K0 + 0x880C0101, // 0001 GETMBR R3 R0 K1 + 0x780E0006, // 0002 JMPF R3 #000A + 0x60100008, // 0003 GETGBL R4 G8 + 0x8C140302, // 0004 GETMET R5 R1 K2 + 0x5C1C0600, // 0005 MOVE R7 R3 + 0x58200003, // 0006 LDCONST R8 K3 + 0x7C140600, // 0007 CALL R5 3 + 0x7C100200, // 0008 CALL R4 1 + 0x70020000, // 0009 JMP #000B + 0x58100003, // 000A LDCONST R4 K3 + 0x80040800, // 000B RET 1 R4 + }) + ) +); +/*******************************************************************/ + + /******************************************************************** ** Solidified function: write_attribute ********************************************************************/ @@ -180,12 +346,12 @@ be_local_closure(Matter_Plugin_write_attribute, /* name */ /******************************************************************** -** Solidified function: parse_sensors +** Solidified function: subscribe_attribute ********************************************************************/ -be_local_closure(Matter_Plugin_parse_sensors, /* name */ +be_local_closure(Matter_Plugin_subscribe_attribute, /* name */ be_nested_proto( - 2, /* nstack */ - 2, /* argc */ + 6, /* nstack */ + 5, /* argc */ 2, /* varg */ 0, /* has upvals */ NULL, /* no upvals */ @@ -193,35 +359,11 @@ be_local_closure(Matter_Plugin_parse_sensors, /* name */ NULL, /* no sub protos */ 0, /* has constants */ NULL, /* no const */ - be_str_weak(parse_sensors), - &be_const_str_solidified, - ( &(const binstruction[ 1]) { /* code */ - 0x80000000, // 0000 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: invoke_request -********************************************************************/ -be_local_closure(Matter_Plugin_invoke_request, /* name */ - be_nested_proto( - 5, /* nstack */ - 4, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 0, /* has constants */ - NULL, /* no const */ - be_str_weak(invoke_request), + be_str_weak(subscribe_attribute), &be_const_str_solidified, ( &(const binstruction[ 2]) { /* code */ - 0x4C100000, // 0000 LDNIL R4 - 0x80040800, // 0001 RET 1 R4 + 0x4C140000, // 0000 LDNIL R5 + 0x80040A00, // 0001 RET 1 R5 }) ) ); @@ -331,6 +473,257 @@ be_local_closure(Matter_Plugin_consolidate_clusters, /* name */ /*******************************************************************/ +/******************************************************************** +** Solidified function: read_attribute +********************************************************************/ +be_local_closure(Matter_Plugin_read_attribute, /* name */ + be_nested_proto( + 16, /* nstack */ + 3, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[18]) { /* constants */ + /* K0 */ be_nested_str_weak(matter), + /* K1 */ be_nested_str_weak(TLV), + /* K2 */ be_nested_str_weak(cluster), + /* K3 */ be_nested_str_weak(attribute), + /* K4 */ be_const_int(0), + /* K5 */ be_nested_str_weak(Matter_TLV_array), + /* K6 */ be_nested_str_weak(TYPES), + /* K7 */ be_nested_str_weak(keys), + /* K8 */ be_nested_str_weak(add_struct), + /* K9 */ be_nested_str_weak(add_TLV), + /* K10 */ be_nested_str_weak(U2), + /* K11 */ be_const_int(1), + /* K12 */ be_nested_str_weak(stop_iteration), + /* K13 */ be_nested_str_weak(get_cluster_list), + /* K14 */ be_nested_str_weak(U4), + /* K15 */ be_const_int(2), + /* K16 */ be_const_int(3), + /* K17 */ be_nested_str_weak(create_TLV), + }), + be_str_weak(read_attribute), + &be_const_str_solidified, + ( &(const binstruction[92]) { /* code */ + 0xB80E0000, // 0000 GETNGBL R3 K0 + 0x880C0701, // 0001 GETMBR R3 R3 K1 + 0x88100502, // 0002 GETMBR R4 R2 K2 + 0x88140503, // 0003 GETMBR R5 R2 K3 + 0x541A001C, // 0004 LDINT R6 29 + 0x1C180806, // 0005 EQ R6 R4 R6 + 0x781A0051, // 0006 JMPF R6 #0059 + 0x1C180B04, // 0007 EQ R6 R5 K4 + 0x781A001B, // 0008 JMPF R6 #0025 + 0x8C180705, // 0009 GETMET R6 R3 K5 + 0x7C180200, // 000A CALL R6 1 + 0x881C0106, // 000B GETMBR R7 R0 K6 + 0x60200010, // 000C GETGBL R8 G16 + 0x8C240F07, // 000D GETMET R9 R7 K7 + 0x7C240200, // 000E CALL R9 1 + 0x7C200200, // 000F CALL R8 1 + 0xA802000E, // 0010 EXBLK 0 #0020 + 0x5C241000, // 0011 MOVE R9 R8 + 0x7C240000, // 0012 CALL R9 0 + 0x8C280D08, // 0013 GETMET R10 R6 K8 + 0x7C280200, // 0014 CALL R10 1 + 0x8C2C1509, // 0015 GETMET R11 R10 K9 + 0x58340004, // 0016 LDCONST R13 K4 + 0x8838070A, // 0017 GETMBR R14 R3 K10 + 0x5C3C1200, // 0018 MOVE R15 R9 + 0x7C2C0800, // 0019 CALL R11 4 + 0x8C2C1509, // 001A GETMET R11 R10 K9 + 0x5834000B, // 001B LDCONST R13 K11 + 0x8838070A, // 001C GETMBR R14 R3 K10 + 0x943C0E09, // 001D GETIDX R15 R7 R9 + 0x7C2C0800, // 001E CALL R11 4 + 0x7001FFF0, // 001F JMP #0011 + 0x5820000C, // 0020 LDCONST R8 K12 + 0xAC200200, // 0021 CATCH R8 1 0 + 0xB0080000, // 0022 RAISE 2 R0 R0 + 0x80040C00, // 0023 RET 1 R6 + 0x70020032, // 0024 JMP #0058 + 0x1C180B0B, // 0025 EQ R6 R5 K11 + 0x781A0013, // 0026 JMPF R6 #003B + 0x8C180705, // 0027 GETMET R6 R3 K5 + 0x7C180200, // 0028 CALL R6 1 + 0x601C0010, // 0029 GETGBL R7 G16 + 0x8C20010D, // 002A GETMET R8 R0 K13 + 0x7C200200, // 002B CALL R8 1 + 0x7C1C0200, // 002C CALL R7 1 + 0xA8020007, // 002D EXBLK 0 #0036 + 0x5C200E00, // 002E MOVE R8 R7 + 0x7C200000, // 002F CALL R8 0 + 0x8C240D09, // 0030 GETMET R9 R6 K9 + 0x4C2C0000, // 0031 LDNIL R11 + 0x8830070E, // 0032 GETMBR R12 R3 K14 + 0x5C341000, // 0033 MOVE R13 R8 + 0x7C240800, // 0034 CALL R9 4 + 0x7001FFF7, // 0035 JMP #002E + 0x581C000C, // 0036 LDCONST R7 K12 + 0xAC1C0200, // 0037 CATCH R7 1 0 + 0xB0080000, // 0038 RAISE 2 R0 R0 + 0x80040C00, // 0039 RET 1 R6 + 0x7002001C, // 003A JMP #0058 + 0x1C180B0F, // 003B EQ R6 R5 K15 + 0x781A0003, // 003C JMPF R6 #0041 + 0x8C180705, // 003D GETMET R6 R3 K5 + 0x7C180200, // 003E CALL R6 1 + 0x80040C00, // 003F RET 1 R6 + 0x70020016, // 0040 JMP #0058 + 0x1C180B10, // 0041 EQ R6 R5 K16 + 0x781A0003, // 0042 JMPF R6 #0047 + 0x8C180705, // 0043 GETMET R6 R3 K5 + 0x7C180200, // 0044 CALL R6 1 + 0x80040C00, // 0045 RET 1 R6 + 0x70020010, // 0046 JMP #0058 + 0x541AFFFB, // 0047 LDINT R6 65532 + 0x1C180A06, // 0048 EQ R6 R5 R6 + 0x781A0005, // 0049 JMPF R6 #0050 + 0x8C180711, // 004A GETMET R6 R3 K17 + 0x8820070E, // 004B GETMBR R8 R3 K14 + 0x58240004, // 004C LDCONST R9 K4 + 0x7C180600, // 004D CALL R6 3 + 0x80040C00, // 004E RET 1 R6 + 0x70020007, // 004F JMP #0058 + 0x541AFFFC, // 0050 LDINT R6 65533 + 0x1C180A06, // 0051 EQ R6 R5 R6 + 0x781A0004, // 0052 JMPF R6 #0058 + 0x8C180711, // 0053 GETMET R6 R3 K17 + 0x8820070E, // 0054 GETMBR R8 R3 K14 + 0x5824000B, // 0055 LDCONST R9 K11 + 0x7C180600, // 0056 CALL R6 3 + 0x80040C00, // 0057 RET 1 R6 + 0x70020001, // 0058 JMP #005B + 0x4C180000, // 0059 LDNIL R6 + 0x80040C00, // 005A RET 1 R6 + 0x80000000, // 005B RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: invoke_request +********************************************************************/ +be_local_closure(Matter_Plugin_invoke_request, /* name */ + be_nested_proto( + 5, /* nstack */ + 4, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 0, /* has constants */ + NULL, /* no const */ + be_str_weak(invoke_request), + &be_const_str_solidified, + ( &(const binstruction[ 2]) { /* code */ + 0x4C100000, // 0000 LDNIL R4 + 0x80040800, // 0001 RET 1 R4 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: timed_request +********************************************************************/ +be_local_closure(Matter_Plugin_timed_request, /* name */ + be_nested_proto( + 5, /* nstack */ + 4, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 0, /* has constants */ + NULL, /* no const */ + be_str_weak(timed_request), + &be_const_str_solidified, + ( &(const binstruction[ 2]) { /* code */ + 0x4C100000, // 0000 LDNIL R4 + 0x80040800, // 0001 RET 1 R4 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: update_shadow +********************************************************************/ +be_local_closure(Matter_Plugin_update_shadow, /* name */ + be_nested_proto( + 2, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 2]) { /* constants */ + /* K0 */ be_nested_str_weak(tick), + /* K1 */ be_nested_str_weak(device), + }), + be_str_weak(update_shadow), + &be_const_str_solidified, + ( &(const binstruction[ 4]) { /* code */ + 0x88040101, // 0000 GETMBR R1 R0 K1 + 0x88040300, // 0001 GETMBR R1 R1 K0 + 0x90020001, // 0002 SETMBR R0 K0 R1 + 0x80000000, // 0003 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: ui_string_to_conf +********************************************************************/ +be_local_closure(Matter_Plugin_ui_string_to_conf, /* name */ + be_nested_proto( + 8, /* nstack */ + 3, /* argc */ + 4, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 3]) { /* constants */ + /* K0 */ be_const_class(be_class_Matter_Plugin), + /* K1 */ be_nested_str_weak(ARG), + /* K2 */ be_nested_str_weak(ARG_TYPE), + }), + be_str_weak(ui_string_to_conf), + &be_const_str_solidified, + ( &(const binstruction[10]) { /* code */ + 0x580C0000, // 0000 LDCONST R3 K0 + 0x88100101, // 0001 GETMBR R4 R0 K1 + 0x88140102, // 0002 GETMBR R5 R0 K2 + 0x780A0004, // 0003 JMPF R2 #0009 + 0x78120003, // 0004 JMPF R4 #0009 + 0x5C180A00, // 0005 MOVE R6 R5 + 0x5C1C0400, // 0006 MOVE R7 R2 + 0x7C180200, // 0007 CALL R6 1 + 0x98040806, // 0008 SETIDX R1 R4 R6 + 0x80040200, // 0009 RET 1 R1 + }) + ) +); +/*******************************************************************/ + + /******************************************************************** ** Solidified function: attribute_updated ********************************************************************/ @@ -410,88 +803,32 @@ be_local_closure(Matter_Plugin_has, /* name */ /******************************************************************** -** Solidified function: update_shadow_lazy +** Solidified function: get_attribute_list ********************************************************************/ -be_local_closure(Matter_Plugin_update_shadow_lazy, /* name */ +be_local_closure(Matter_Plugin_get_attribute_list, /* name */ be_nested_proto( - 3, /* nstack */ - 1, /* argc */ + 7, /* nstack */ + 3, /* argc */ 2, /* varg */ 0, /* has upvals */ NULL, /* no upvals */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[ 3]) { /* constants */ - /* K0 */ be_nested_str_weak(tick), - /* K1 */ be_nested_str_weak(device), - /* K2 */ be_nested_str_weak(update_shadow), + ( &(const bvalue[ 2]) { /* constants */ + /* K0 */ be_nested_str_weak(clusters), + /* K1 */ be_nested_str_weak(find), }), - be_str_weak(update_shadow_lazy), + be_str_weak(get_attribute_list), &be_const_str_solidified, - ( &(const binstruction[11]) { /* code */ - 0x88040100, // 0000 GETMBR R1 R0 K0 - 0x88080101, // 0001 GETMBR R2 R0 K1 - 0x88080500, // 0002 GETMBR R2 R2 K0 - 0x20040202, // 0003 NE R1 R1 R2 - 0x78060004, // 0004 JMPF R1 #000A - 0x8C040102, // 0005 GETMET R1 R0 K2 - 0x7C040200, // 0006 CALL R1 1 - 0x88040101, // 0007 GETMBR R1 R0 K1 - 0x88040300, // 0008 GETMBR R1 R1 K0 - 0x90020001, // 0009 SETMBR R0 K0 R1 - 0x80000000, // 000A RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: get_endpoint -********************************************************************/ -be_local_closure(Matter_Plugin_get_endpoint, /* name */ - be_nested_proto( - 2, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 1]) { /* constants */ - /* K0 */ be_nested_str_weak(endpoint), - }), - be_str_weak(get_endpoint), - &be_const_str_solidified, - ( &(const binstruction[ 2]) { /* code */ - 0x88040100, // 0000 GETMBR R1 R0 K0 - 0x80040200, // 0001 RET 1 R1 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: parse_update -********************************************************************/ -be_local_closure(Matter_Plugin_parse_update, /* name */ - be_nested_proto( - 2, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 0, /* has constants */ - NULL, /* no const */ - be_str_weak(parse_update), - &be_const_str_solidified, - ( &(const binstruction[ 1]) { /* code */ - 0x80000000, // 0000 RET 0 + ( &(const binstruction[ 7]) { /* code */ + 0x880C0100, // 0000 GETMBR R3 R0 K0 + 0x8C0C0701, // 0001 GETMET R3 R3 K1 + 0x5C140400, // 0002 MOVE R5 R2 + 0x60180012, // 0003 GETGBL R6 G18 + 0x7C180000, // 0004 CALL R6 0 + 0x7C0C0600, // 0005 CALL R3 3 + 0x80040600, // 0006 RET 1 R3 }) ) ); @@ -532,474 +869,22 @@ be_local_closure(Matter_Plugin_init, /* name */ /*******************************************************************/ -/******************************************************************** -** Solidified function: read_event -********************************************************************/ -be_local_closure(Matter_Plugin_read_event, /* name */ - be_nested_proto( - 6, /* nstack */ - 5, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 0, /* has constants */ - NULL, /* no const */ - be_str_weak(read_event), - &be_const_str_solidified, - ( &(const binstruction[ 2]) { /* code */ - 0x4C140000, // 0000 LDNIL R5 - 0x80040A00, // 0001 RET 1 R5 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: subscribe_attribute -********************************************************************/ -be_local_closure(Matter_Plugin_subscribe_attribute, /* name */ - be_nested_proto( - 6, /* nstack */ - 5, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 0, /* has constants */ - NULL, /* no const */ - be_str_weak(subscribe_attribute), - &be_const_str_solidified, - ( &(const binstruction[ 2]) { /* code */ - 0x4C140000, // 0000 LDNIL R5 - 0x80040A00, // 0001 RET 1 R5 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: ui_string_to_conf -********************************************************************/ -be_local_closure(Matter_Plugin_ui_string_to_conf, /* name */ - be_nested_proto( - 8, /* nstack */ - 3, /* argc */ - 4, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 3]) { /* constants */ - /* K0 */ be_const_class(be_class_Matter_Plugin), - /* K1 */ be_nested_str_weak(ARG), - /* K2 */ be_nested_str_weak(ARG_TYPE), - }), - be_str_weak(ui_string_to_conf), - &be_const_str_solidified, - ( &(const binstruction[10]) { /* code */ - 0x580C0000, // 0000 LDCONST R3 K0 - 0x88100101, // 0001 GETMBR R4 R0 K1 - 0x88140102, // 0002 GETMBR R5 R0 K2 - 0x780A0004, // 0003 JMPF R2 #0009 - 0x78120003, // 0004 JMPF R4 #0009 - 0x5C180A00, // 0005 MOVE R6 R5 - 0x5C1C0400, // 0006 MOVE R7 R2 - 0x7C180200, // 0007 CALL R6 1 - 0x98040806, // 0008 SETIDX R1 R4 R6 - 0x80040200, // 0009 RET 1 R1 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: subscribe_event -********************************************************************/ -be_local_closure(Matter_Plugin_subscribe_event, /* name */ - be_nested_proto( - 6, /* nstack */ - 5, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 0, /* has constants */ - NULL, /* no const */ - be_str_weak(subscribe_event), - &be_const_str_solidified, - ( &(const binstruction[ 2]) { /* code */ - 0x4C140000, // 0000 LDNIL R5 - 0x80040A00, // 0001 RET 1 R5 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: get_attribute_list -********************************************************************/ -be_local_closure(Matter_Plugin_get_attribute_list, /* name */ - be_nested_proto( - 7, /* nstack */ - 3, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 2]) { /* constants */ - /* K0 */ be_nested_str_weak(clusters), - /* K1 */ be_nested_str_weak(find), - }), - be_str_weak(get_attribute_list), - &be_const_str_solidified, - ( &(const binstruction[ 7]) { /* code */ - 0x880C0100, // 0000 GETMBR R3 R0 K0 - 0x8C0C0701, // 0001 GETMET R3 R3 K1 - 0x5C140400, // 0002 MOVE R5 R2 - 0x60180012, // 0003 GETGBL R6 G18 - 0x7C180000, // 0004 CALL R6 0 - 0x7C0C0600, // 0005 CALL R3 3 - 0x80040600, // 0006 RET 1 R3 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: timed_request -********************************************************************/ -be_local_closure(Matter_Plugin_timed_request, /* name */ - be_nested_proto( - 5, /* nstack */ - 4, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 0, /* has constants */ - NULL, /* no const */ - be_str_weak(timed_request), - &be_const_str_solidified, - ( &(const binstruction[ 2]) { /* code */ - 0x4C100000, // 0000 LDNIL R4 - 0x80040800, // 0001 RET 1 R4 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: update_shadow -********************************************************************/ -be_local_closure(Matter_Plugin_update_shadow, /* name */ - be_nested_proto( - 4, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 3]) { /* constants */ - /* K0 */ be_nested_str_weak(tick), - /* K1 */ be_nested_str_weak(device), - /* K2 */ be_nested_str_weak(parse_update), - }), - be_str_weak(update_shadow), - &be_const_str_solidified, - ( &(const binstruction[ 7]) { /* code */ - 0x88040101, // 0000 GETMBR R1 R0 K1 - 0x88040300, // 0001 GETMBR R1 R1 K0 - 0x90020001, // 0002 SETMBR R0 K0 R1 - 0x8C040102, // 0003 GETMET R1 R0 K2 - 0x4C0C0000, // 0004 LDNIL R3 - 0x7C040400, // 0005 CALL R1 2 - 0x80000000, // 0006 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: probe_shadow_async -********************************************************************/ -be_local_closure(Matter_Plugin_probe_shadow_async, /* name */ - be_nested_proto( - 3, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 1]) { /* constants */ - /* K0 */ be_nested_str_weak(update_shadow), - }), - be_str_weak(probe_shadow_async), - &be_const_str_solidified, - ( &(const binstruction[ 3]) { /* code */ - 0x8C040100, // 0000 GETMET R1 R0 K0 - 0x7C040200, // 0001 CALL R1 1 - 0x80000000, // 0002 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: read_attribute -********************************************************************/ -be_local_closure(Matter_Plugin_read_attribute, /* name */ - be_nested_proto( - 16, /* nstack */ - 3, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[18]) { /* constants */ - /* K0 */ be_nested_str_weak(matter), - /* K1 */ be_nested_str_weak(TLV), - /* K2 */ be_nested_str_weak(cluster), - /* K3 */ be_nested_str_weak(attribute), - /* K4 */ be_const_int(0), - /* K5 */ be_nested_str_weak(Matter_TLV_array), - /* K6 */ be_nested_str_weak(get_types), - /* K7 */ be_nested_str_weak(keys), - /* K8 */ be_nested_str_weak(add_struct), - /* K9 */ be_nested_str_weak(add_TLV), - /* K10 */ be_nested_str_weak(U2), - /* K11 */ be_const_int(1), - /* K12 */ be_nested_str_weak(stop_iteration), - /* K13 */ be_nested_str_weak(get_cluster_list), - /* K14 */ be_nested_str_weak(U4), - /* K15 */ be_const_int(2), - /* K16 */ be_const_int(3), - /* K17 */ be_nested_str_weak(create_TLV), - }), - be_str_weak(read_attribute), - &be_const_str_solidified, - ( &(const binstruction[93]) { /* code */ - 0xB80E0000, // 0000 GETNGBL R3 K0 - 0x880C0701, // 0001 GETMBR R3 R3 K1 - 0x88100502, // 0002 GETMBR R4 R2 K2 - 0x88140503, // 0003 GETMBR R5 R2 K3 - 0x541A001C, // 0004 LDINT R6 29 - 0x1C180806, // 0005 EQ R6 R4 R6 - 0x781A0052, // 0006 JMPF R6 #005A - 0x1C180B04, // 0007 EQ R6 R5 K4 - 0x781A001C, // 0008 JMPF R6 #0026 - 0x8C180705, // 0009 GETMET R6 R3 K5 - 0x7C180200, // 000A CALL R6 1 - 0x8C1C0106, // 000B GETMET R7 R0 K6 - 0x7C1C0200, // 000C CALL R7 1 - 0x60200010, // 000D GETGBL R8 G16 - 0x8C240F07, // 000E GETMET R9 R7 K7 - 0x7C240200, // 000F CALL R9 1 - 0x7C200200, // 0010 CALL R8 1 - 0xA802000E, // 0011 EXBLK 0 #0021 - 0x5C241000, // 0012 MOVE R9 R8 - 0x7C240000, // 0013 CALL R9 0 - 0x8C280D08, // 0014 GETMET R10 R6 K8 - 0x7C280200, // 0015 CALL R10 1 - 0x8C2C1509, // 0016 GETMET R11 R10 K9 - 0x58340004, // 0017 LDCONST R13 K4 - 0x8838070A, // 0018 GETMBR R14 R3 K10 - 0x5C3C1200, // 0019 MOVE R15 R9 - 0x7C2C0800, // 001A CALL R11 4 - 0x8C2C1509, // 001B GETMET R11 R10 K9 - 0x5834000B, // 001C LDCONST R13 K11 - 0x8838070A, // 001D GETMBR R14 R3 K10 - 0x943C0E09, // 001E GETIDX R15 R7 R9 - 0x7C2C0800, // 001F CALL R11 4 - 0x7001FFF0, // 0020 JMP #0012 - 0x5820000C, // 0021 LDCONST R8 K12 - 0xAC200200, // 0022 CATCH R8 1 0 - 0xB0080000, // 0023 RAISE 2 R0 R0 - 0x80040C00, // 0024 RET 1 R6 - 0x70020032, // 0025 JMP #0059 - 0x1C180B0B, // 0026 EQ R6 R5 K11 - 0x781A0013, // 0027 JMPF R6 #003C - 0x8C180705, // 0028 GETMET R6 R3 K5 - 0x7C180200, // 0029 CALL R6 1 - 0x601C0010, // 002A GETGBL R7 G16 - 0x8C20010D, // 002B GETMET R8 R0 K13 - 0x7C200200, // 002C CALL R8 1 - 0x7C1C0200, // 002D CALL R7 1 - 0xA8020007, // 002E EXBLK 0 #0037 - 0x5C200E00, // 002F MOVE R8 R7 - 0x7C200000, // 0030 CALL R8 0 - 0x8C240D09, // 0031 GETMET R9 R6 K9 - 0x4C2C0000, // 0032 LDNIL R11 - 0x8830070E, // 0033 GETMBR R12 R3 K14 - 0x5C341000, // 0034 MOVE R13 R8 - 0x7C240800, // 0035 CALL R9 4 - 0x7001FFF7, // 0036 JMP #002F - 0x581C000C, // 0037 LDCONST R7 K12 - 0xAC1C0200, // 0038 CATCH R7 1 0 - 0xB0080000, // 0039 RAISE 2 R0 R0 - 0x80040C00, // 003A RET 1 R6 - 0x7002001C, // 003B JMP #0059 - 0x1C180B0F, // 003C EQ R6 R5 K15 - 0x781A0003, // 003D JMPF R6 #0042 - 0x8C180705, // 003E GETMET R6 R3 K5 - 0x7C180200, // 003F CALL R6 1 - 0x80040C00, // 0040 RET 1 R6 - 0x70020016, // 0041 JMP #0059 - 0x1C180B10, // 0042 EQ R6 R5 K16 - 0x781A0003, // 0043 JMPF R6 #0048 - 0x8C180705, // 0044 GETMET R6 R3 K5 - 0x7C180200, // 0045 CALL R6 1 - 0x80040C00, // 0046 RET 1 R6 - 0x70020010, // 0047 JMP #0059 - 0x541AFFFB, // 0048 LDINT R6 65532 - 0x1C180A06, // 0049 EQ R6 R5 R6 - 0x781A0005, // 004A JMPF R6 #0051 - 0x8C180711, // 004B GETMET R6 R3 K17 - 0x8820070E, // 004C GETMBR R8 R3 K14 - 0x58240004, // 004D LDCONST R9 K4 - 0x7C180600, // 004E CALL R6 3 - 0x80040C00, // 004F RET 1 R6 - 0x70020007, // 0050 JMP #0059 - 0x541AFFFC, // 0051 LDINT R6 65533 - 0x1C180A06, // 0052 EQ R6 R5 R6 - 0x781A0004, // 0053 JMPF R6 #0059 - 0x8C180711, // 0054 GETMET R6 R3 K17 - 0x8820070E, // 0055 GETMBR R8 R3 K14 - 0x5824000B, // 0056 LDCONST R9 K11 - 0x7C180600, // 0057 CALL R6 3 - 0x80040C00, // 0058 RET 1 R6 - 0x70020001, // 0059 JMP #005C - 0x4C180000, // 005A LDNIL R6 - 0x80040C00, // 005B RET 1 R6 - 0x80000000, // 005C RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: ui_conf_to_string -********************************************************************/ -be_local_closure(Matter_Plugin_ui_conf_to_string, /* name */ - be_nested_proto( - 9, /* nstack */ - 2, /* argc */ - 4, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 4]) { /* constants */ - /* K0 */ be_const_class(be_class_Matter_Plugin), - /* K1 */ be_nested_str_weak(ARG), - /* K2 */ be_nested_str_weak(find), - /* K3 */ be_nested_str_weak(), - }), - be_str_weak(ui_conf_to_string), - &be_const_str_solidified, - ( &(const binstruction[12]) { /* code */ - 0x58080000, // 0000 LDCONST R2 K0 - 0x880C0101, // 0001 GETMBR R3 R0 K1 - 0x780E0006, // 0002 JMPF R3 #000A - 0x60100008, // 0003 GETGBL R4 G8 - 0x8C140302, // 0004 GETMET R5 R1 K2 - 0x5C1C0600, // 0005 MOVE R7 R3 - 0x58200003, // 0006 LDCONST R8 K3 - 0x7C140600, // 0007 CALL R5 3 - 0x7C100200, // 0008 CALL R4 1 - 0x70020000, // 0009 JMP #000B - 0x58100003, // 000A LDCONST R4 K3 - 0x80040800, // 000B RET 1 R4 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: get_types -********************************************************************/ -be_local_closure(Matter_Plugin_get_types, /* name */ - be_nested_proto( - 2, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 1]) { /* constants */ - /* K0 */ be_nested_str_weak(TYPES), - }), - be_str_weak(get_types), - &be_const_str_solidified, - ( &(const binstruction[ 2]) { /* code */ - 0x88040100, // 0000 GETMBR R1 R0 K0 - 0x80040200, // 0001 RET 1 R1 - }) - ) -); -/*******************************************************************/ - - /******************************************************************** ** Solidified class: Matter_Plugin ********************************************************************/ be_local_class(Matter_Plugin, 5, NULL, - be_nested_map(34, + be_nested_map(31, ( (struct bmapnode*) &(const bmapnode[]) { - { be_const_key_weak(every_250ms, 11), be_const_closure(Matter_Plugin_every_250ms_closure) }, - { be_const_key_weak(get_cluster_list, 24), be_const_closure(Matter_Plugin_get_cluster_list_closure) }, - { be_const_key_weak(NAME, -1), be_nested_str_weak() }, - { be_const_key_weak(consolidate_clusters, -1), be_const_closure(Matter_Plugin_consolidate_clusters_closure) }, - { be_const_key_weak(tick, -1), be_const_var(4) }, - { be_const_key_weak(write_attribute, -1), be_const_closure(Matter_Plugin_write_attribute_closure) }, - { be_const_key_weak(has, -1), be_const_closure(Matter_Plugin_has_closure) }, - { be_const_key_weak(invoke_request, 6), be_const_closure(Matter_Plugin_invoke_request_closure) }, - { be_const_key_weak(parse_sensors, 29), be_const_closure(Matter_Plugin_parse_sensors_closure) }, - { be_const_key_weak(attribute_updated, -1), be_const_closure(Matter_Plugin_attribute_updated_closure) }, - { be_const_key_weak(parse_update, -1), be_const_closure(Matter_Plugin_parse_update_closure) }, - { be_const_key_weak(update_next, -1), be_const_var(0) }, - { be_const_key_weak(update_shadow_lazy, -1), be_const_closure(Matter_Plugin_update_shadow_lazy_closure) }, + { be_const_key_weak(read_event, -1), be_const_closure(Matter_Plugin_read_event_closure) }, + { be_const_key_weak(clusters, 21), be_const_var(3) }, + { be_const_key_weak(get_cluster_list, 14), be_const_closure(Matter_Plugin_get_cluster_list_closure) }, { be_const_key_weak(get_endpoint, -1), be_const_closure(Matter_Plugin_get_endpoint_closure) }, - { be_const_key_weak(clusters, 10), be_const_var(3) }, - { be_const_key_weak(init, -1), be_const_closure(Matter_Plugin_init_closure) }, - { be_const_key_weak(read_event, 18), be_const_closure(Matter_Plugin_read_event_closure) }, - { be_const_key_weak(read_attribute, 19), be_const_closure(Matter_Plugin_read_attribute_closure) }, - { be_const_key_weak(ui_string_to_conf, -1), be_const_static_closure(Matter_Plugin_ui_string_to_conf_closure) }, - { be_const_key_weak(UPDATE_TIME, -1), be_const_int(5000) }, - { be_const_key_weak(subscribe_event, -1), be_const_closure(Matter_Plugin_subscribe_event_closure) }, - { be_const_key_weak(get_attribute_list, -1), be_const_closure(Matter_Plugin_get_attribute_list_closure) }, - { be_const_key_weak(timed_request, -1), be_const_closure(Matter_Plugin_timed_request_closure) }, - { be_const_key_weak(update_shadow, -1), be_const_closure(Matter_Plugin_update_shadow_closure) }, - { be_const_key_weak(device, -1), be_const_var(1) }, - { be_const_key_weak(ARG, -1), be_nested_str_weak() }, + { be_const_key_weak(tick, 23), be_const_var(4) }, + { be_const_key_weak(NAME, -1), be_nested_str_weak() }, + { be_const_key_weak(ARG_TYPE, 4), be_const_static_closure(Matter_Plugin__X3Clambda_X3E_closure) }, + { be_const_key_weak(update_shadow_lazy, 28), be_const_closure(Matter_Plugin_update_shadow_lazy_closure) }, { be_const_key_weak(CLUSTERS, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { be_const_map( * be_nested_map(1, ( (struct bmapnode*) &(const bmapnode[]) { @@ -1014,13 +899,28 @@ be_local_class(Matter_Plugin, be_const_int(65533), })) ) } )) }, })) ) } )) }, - { be_const_key_weak(probe_shadow_async, -1), be_const_closure(Matter_Plugin_probe_shadow_async_closure) }, - { be_const_key_weak(ARG_TYPE, 17), be_const_static_closure(Matter_Plugin__X3Clambda_X3E_closure) }, - { be_const_key_weak(subscribe_attribute, 3), be_const_closure(Matter_Plugin_subscribe_attribute_closure) }, + { be_const_key_weak(subscribe_event, -1), be_const_closure(Matter_Plugin_subscribe_event_closure) }, + { be_const_key_weak(every_250ms, -1), be_const_closure(Matter_Plugin_every_250ms_closure) }, { be_const_key_weak(ui_conf_to_string, -1), be_const_static_closure(Matter_Plugin_ui_conf_to_string_closure) }, + { be_const_key_weak(write_attribute, -1), be_const_closure(Matter_Plugin_write_attribute_closure) }, + { be_const_key_weak(parse_sensors, 25), be_const_closure(Matter_Plugin_parse_sensors_closure) }, + { be_const_key_weak(consolidate_clusters, -1), be_const_closure(Matter_Plugin_consolidate_clusters_closure) }, + { be_const_key_weak(UPDATE_TIME, 18), be_const_int(5000) }, { be_const_key_weak(TYPE, -1), be_nested_str_weak() }, - { be_const_key_weak(endpoint, 4), be_const_var(2) }, - { be_const_key_weak(get_types, -1), be_const_closure(Matter_Plugin_get_types_closure) }, + { be_const_key_weak(read_attribute, -1), be_const_closure(Matter_Plugin_read_attribute_closure) }, + { be_const_key_weak(get_attribute_list, -1), be_const_closure(Matter_Plugin_get_attribute_list_closure) }, + { be_const_key_weak(timed_request, -1), be_const_closure(Matter_Plugin_timed_request_closure) }, + { be_const_key_weak(ARG, -1), be_nested_str_weak() }, + { be_const_key_weak(invoke_request, -1), be_const_closure(Matter_Plugin_invoke_request_closure) }, + { be_const_key_weak(ui_string_to_conf, -1), be_const_static_closure(Matter_Plugin_ui_string_to_conf_closure) }, + { be_const_key_weak(update_next, 20), be_const_var(0) }, + { be_const_key_weak(attribute_updated, -1), be_const_closure(Matter_Plugin_attribute_updated_closure) }, + { be_const_key_weak(update_shadow, 30), be_const_closure(Matter_Plugin_update_shadow_closure) }, + { be_const_key_weak(has, -1), be_const_closure(Matter_Plugin_has_closure) }, + { be_const_key_weak(device, 15), be_const_var(1) }, + { be_const_key_weak(endpoint, -1), be_const_var(2) }, + { be_const_key_weak(init, -1), be_const_closure(Matter_Plugin_init_closure) }, + { be_const_key_weak(subscribe_attribute, -1), be_const_closure(Matter_Plugin_subscribe_attribute_closure) }, })), be_str_weak(Matter_Plugin) ); diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_HTTP.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_HTTP.h index df532e975..d63c564df 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_HTTP.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_HTTP.h @@ -6,6 +6,194 @@ extern const bclass be_class_Matter_Plugin_Bridge_HTTP; +/******************************************************************** +** Solidified function: read_attribute +********************************************************************/ +be_local_closure(Matter_Plugin_Bridge_HTTP_read_attribute, /* name */ + be_nested_proto( + 10, /* nstack */ + 3, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[10]) { /* constants */ + /* K0 */ be_nested_str_weak(matter), + /* K1 */ be_nested_str_weak(TLV), + /* K2 */ be_nested_str_weak(cluster), + /* K3 */ be_nested_str_weak(attribute), + /* K4 */ be_const_int(0), + /* K5 */ be_nested_str_weak(create_TLV), + /* K6 */ be_nested_str_weak(BOOL), + /* K7 */ be_nested_str_weak(http_remote), + /* K8 */ be_nested_str_weak(reachable), + /* K9 */ be_nested_str_weak(read_attribute), + }), + be_str_weak(read_attribute), + &be_const_str_solidified, + ( &(const binstruction[29]) { /* code */ + 0xB80E0000, // 0000 GETNGBL R3 K0 + 0x880C0701, // 0001 GETMBR R3 R3 K1 + 0x88100502, // 0002 GETMBR R4 R2 K2 + 0x88140503, // 0003 GETMBR R5 R2 K3 + 0x541A0038, // 0004 LDINT R6 57 + 0x1C180806, // 0005 EQ R6 R4 R6 + 0x781A000C, // 0006 JMPF R6 #0014 + 0x1C180B04, // 0007 EQ R6 R5 K4 + 0x781A0000, // 0008 JMPF R6 #000A + 0x70020008, // 0009 JMP #0013 + 0x541A0010, // 000A LDINT R6 17 + 0x1C180A06, // 000B EQ R6 R5 R6 + 0x781A0005, // 000C JMPF R6 #0013 + 0x8C180705, // 000D GETMET R6 R3 K5 + 0x88200706, // 000E GETMBR R8 R3 K6 + 0x88240107, // 000F GETMBR R9 R0 K7 + 0x88241308, // 0010 GETMBR R9 R9 K8 + 0x7C180600, // 0011 CALL R6 3 + 0x80040C00, // 0012 RET 1 R6 + 0x70020007, // 0013 JMP #001C + 0x60180003, // 0014 GETGBL R6 G3 + 0x5C1C0000, // 0015 MOVE R7 R0 + 0x7C180200, // 0016 CALL R6 1 + 0x8C180D09, // 0017 GETMET R6 R6 K9 + 0x5C200200, // 0018 MOVE R8 R1 + 0x5C240400, // 0019 MOVE R9 R2 + 0x7C180600, // 001A CALL R6 3 + 0x80040C00, // 001B RET 1 R6 + 0x80000000, // 001C RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: call_remote_sync +********************************************************************/ +be_local_closure(Matter_Plugin_Bridge_HTTP_call_remote_sync, /* name */ + be_nested_proto( + 11, /* nstack */ + 3, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[15]) { /* constants */ + /* K0 */ be_nested_str_weak(string), + /* K1 */ be_nested_str_weak(json), + /* K2 */ be_const_int(2), + /* K3 */ be_nested_str_weak(_X20), + /* K4 */ be_const_int(0), + /* K5 */ be_nested_str_weak(http_remote), + /* K6 */ be_nested_str_weak(call_sync), + /* K7 */ be_nested_str_weak(SYNC_TIMEOUT), + /* K8 */ be_nested_str_weak(device_is_alive), + /* K9 */ be_nested_str_weak(load), + /* K10 */ be_const_int(1), + /* K11 */ be_nested_str_weak(tasmota), + /* K12 */ be_nested_str_weak(log), + /* K13 */ be_nested_str_weak(MTR_X3A_X20HTTP_X20GET_X20retrying), + /* K14 */ be_const_int(3), + }), + be_str_weak(call_remote_sync), + &be_const_str_solidified, + ( &(const binstruction[43]) { /* code */ + 0xA40E0000, // 0000 IMPORT R3 K0 + 0xA4120200, // 0001 IMPORT R4 K1 + 0x58140002, // 0002 LDCONST R5 K2 + 0x4C180000, // 0003 LDNIL R6 + 0x20180406, // 0004 NE R6 R2 R6 + 0x781A0005, // 0005 JMPF R6 #000C + 0x00180303, // 0006 ADD R6 R1 K3 + 0x601C0008, // 0007 GETGBL R7 G8 + 0x5C200400, // 0008 MOVE R8 R2 + 0x7C1C0200, // 0009 CALL R7 1 + 0x00180C07, // 000A ADD R6 R6 R7 + 0x5C040C00, // 000B MOVE R1 R6 + 0x24180B04, // 000C GT R6 R5 K4 + 0x781A0016, // 000D JMPF R6 #0025 + 0x88180105, // 000E GETMBR R6 R0 K5 + 0x8C180D06, // 000F GETMET R6 R6 K6 + 0x5C200200, // 0010 MOVE R8 R1 + 0x88240107, // 0011 GETMBR R9 R0 K7 + 0x7C180600, // 0012 CALL R6 3 + 0x4C1C0000, // 0013 LDNIL R7 + 0x201C0C07, // 0014 NE R7 R6 R7 + 0x781E0007, // 0015 JMPF R7 #001E + 0x881C0105, // 0016 GETMBR R7 R0 K5 + 0x8C1C0F08, // 0017 GETMET R7 R7 K8 + 0x50240200, // 0018 LDBOOL R9 1 0 + 0x7C1C0400, // 0019 CALL R7 2 + 0x8C1C0909, // 001A GETMET R7 R4 K9 + 0x5C240C00, // 001B MOVE R9 R6 + 0x7C1C0400, // 001C CALL R7 2 + 0x80040E00, // 001D RET 1 R7 + 0x04140B0A, // 001E SUB R5 R5 K10 + 0xB81E1600, // 001F GETNGBL R7 K11 + 0x8C1C0F0C, // 0020 GETMET R7 R7 K12 + 0x5824000D, // 0021 LDCONST R9 K13 + 0x5828000E, // 0022 LDCONST R10 K14 + 0x7C1C0600, // 0023 CALL R7 3 + 0x7001FFE6, // 0024 JMP #000C + 0x88180105, // 0025 GETMBR R6 R0 K5 + 0x8C180D08, // 0026 GETMET R6 R6 K8 + 0x50200000, // 0027 LDBOOL R8 0 0 + 0x7C180400, // 0028 CALL R6 2 + 0x4C180000, // 0029 LDNIL R6 + 0x80040C00, // 002A RET 1 R6 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: update_shadow +********************************************************************/ +be_local_closure(Matter_Plugin_Bridge_HTTP_update_shadow, /* name */ + be_nested_proto( + 7, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 6]) { /* constants */ + /* K0 */ be_nested_str_weak(tick), + /* K1 */ be_nested_str_weak(device), + /* K2 */ be_nested_str_weak(call_remote_sync), + /* K3 */ be_nested_str_weak(UPDATE_CMD), + /* K4 */ be_nested_str_weak(parse_http_response), + /* K5 */ be_const_int(1), + }), + be_str_weak(update_shadow), + &be_const_str_solidified, + ( &(const binstruction[13]) { /* code */ + 0x88040101, // 0000 GETMBR R1 R0 K1 + 0x88040300, // 0001 GETMBR R1 R1 K0 + 0x90020001, // 0002 SETMBR R0 K0 R1 + 0x8C040102, // 0003 GETMET R1 R0 K2 + 0x880C0103, // 0004 GETMBR R3 R0 K3 + 0x7C040400, // 0005 CALL R1 2 + 0x78060004, // 0006 JMPF R1 #000C + 0x8C080104, // 0007 GETMET R2 R0 K4 + 0x58100005, // 0008 LDCONST R4 K5 + 0x5C140200, // 0009 MOVE R5 R1 + 0x88180103, // 000A GETMBR R6 R0 K3 + 0x7C080800, // 000B CALL R2 4 + 0x80000000, // 000C RET 0 + }) + ) +); +/*******************************************************************/ + + /******************************************************************** ** Solidified function: ui_conf_to_string ********************************************************************/ @@ -53,227 +241,75 @@ be_local_closure(Matter_Plugin_Bridge_HTTP_ui_conf_to_string, /* name */ /*******************************************************************/ -/******************************************************************** -** Solidified function: init -********************************************************************/ -be_local_closure(Matter_Plugin_Bridge_HTTP_init, /* name */ - be_nested_proto( - 11, /* nstack */ - 4, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 1, /* has sup protos */ - ( &(const struct bproto*[ 1]) { - be_nested_proto( - 6, /* nstack */ - 2, /* argc */ - 0, /* varg */ - 1, /* has upvals */ - ( &(const bupvaldesc[ 1]) { /* upvals */ - be_local_const_upval(1, 0), - }), - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 1]) { /* constants */ - /* K0 */ be_nested_str_weak(parse_http_response), - }), - be_str_weak(_X3Clambda_X3E), - &be_const_str_solidified, - ( &(const binstruction[ 6]) { /* code */ - 0x68080000, // 0000 GETUPV R2 U0 - 0x8C080500, // 0001 GETMET R2 R2 K0 - 0x5C100000, // 0002 MOVE R4 R0 - 0x5C140200, // 0003 MOVE R5 R1 - 0x7C080600, // 0004 CALL R2 3 - 0x80040400, // 0005 RET 1 R2 - }) - ), - }), - 1, /* has constants */ - ( &(const bvalue[12]) { /* constants */ - /* K0 */ be_nested_str_weak(string), - /* K1 */ be_nested_str_weak(init), - /* K2 */ be_nested_str_weak(find), - /* K3 */ be_nested_str_weak(ARG_HTTP), - /* K4 */ be_nested_str_weak(http_shadow_map), - /* K5 */ be_nested_str_weak(reachable), - /* K6 */ be_nested_str_weak(next_probe_timestamp), - /* K7 */ be_nested_str_weak(http_remote), - /* K8 */ be_nested_str_weak(matter), - /* K9 */ be_nested_str_weak(HTTP_remote), - /* K10 */ be_nested_str_weak(PROBE_TIMEOUT), - /* K11 */ be_nested_str_weak(set_cb), - }), - be_str_weak(init), - &be_const_str_solidified, - ( &(const binstruction[32]) { /* code */ - 0xA4120000, // 0000 IMPORT R4 K0 - 0x60140003, // 0001 GETGBL R5 G3 - 0x5C180000, // 0002 MOVE R6 R0 - 0x7C140200, // 0003 CALL R5 1 - 0x8C140B01, // 0004 GETMET R5 R5 K1 - 0x5C1C0200, // 0005 MOVE R7 R1 - 0x5C200400, // 0006 MOVE R8 R2 - 0x5C240600, // 0007 MOVE R9 R3 - 0x7C140800, // 0008 CALL R5 4 - 0x8C140702, // 0009 GETMET R5 R3 K2 - 0x881C0103, // 000A GETMBR R7 R0 K3 - 0x7C140400, // 000B CALL R5 2 - 0x60180013, // 000C GETGBL R6 G19 - 0x7C180000, // 000D CALL R6 0 - 0x90020806, // 000E SETMBR R0 K4 R6 - 0x50180000, // 000F LDBOOL R6 0 0 - 0x90020A06, // 0010 SETMBR R0 K5 R6 - 0x4C180000, // 0011 LDNIL R6 - 0x90020C06, // 0012 SETMBR R0 K6 R6 - 0xB81A1000, // 0013 GETNGBL R6 K8 - 0x8C180D09, // 0014 GETMET R6 R6 K9 - 0x5C200A00, // 0015 MOVE R8 R5 - 0x5426004F, // 0016 LDINT R9 80 - 0x8828010A, // 0017 GETMBR R10 R0 K10 - 0x7C180800, // 0018 CALL R6 4 - 0x90020E06, // 0019 SETMBR R0 K7 R6 - 0x88180107, // 001A GETMBR R6 R0 K7 - 0x8C180D0B, // 001B GETMET R6 R6 K11 - 0x84200000, // 001C CLOSURE R8 P0 - 0x7C180400, // 001D CALL R6 2 - 0xA0000000, // 001E CLOSE R0 - 0x80000000, // 001F RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: get_remote_status_lazy -********************************************************************/ -be_local_closure(Matter_Plugin_Bridge_HTTP_get_remote_status_lazy, /* name */ - be_nested_proto( - 10, /* nstack */ - 3, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 7]) { /* constants */ - /* K0 */ be_nested_str_weak(device), - /* K1 */ be_nested_str_weak(tick), - /* K2 */ be_nested_str_weak(http_shadow_map), - /* K3 */ be_nested_str_weak(find), - /* K4 */ be_nested_str_weak(_tick), - /* K5 */ be_nested_str_weak(call_remote_sync), - /* K6 */ be_nested_str_weak(Status), - }), - be_str_weak(get_remote_status_lazy), - &be_const_str_solidified, - ( &(const binstruction[20]) { /* code */ - 0x880C0100, // 0000 GETMBR R3 R0 K0 - 0x880C0701, // 0001 GETMBR R3 R3 K1 - 0x88100102, // 0002 GETMBR R4 R0 K2 - 0x8C100903, // 0003 GETMET R4 R4 K3 - 0x5C180200, // 0004 MOVE R6 R1 - 0x7C100400, // 0005 CALL R4 2 - 0x78120005, // 0006 JMPF R4 #000D - 0x8C140903, // 0007 GETMET R5 R4 K3 - 0x581C0004, // 0008 LDCONST R7 K4 - 0x7C140400, // 0009 CALL R5 2 - 0x1C140A03, // 000A EQ R5 R5 R3 - 0x78160000, // 000B JMPF R5 #000D - 0x80040800, // 000C RET 1 R4 - 0x8C140105, // 000D GETMET R5 R0 K5 - 0x581C0006, // 000E LDCONST R7 K6 - 0x60200008, // 000F GETGBL R8 G8 - 0x5C240200, // 0010 MOVE R9 R1 - 0x7C200200, // 0011 CALL R8 1 - 0x7C140600, // 0012 CALL R5 3 - 0x80040A00, // 0013 RET 1 R5 - }) - ) -); -/*******************************************************************/ - - /******************************************************************** ** Solidified function: parse_http_response ********************************************************************/ be_local_closure(Matter_Plugin_Bridge_HTTP_parse_http_response, /* name */ be_nested_proto( - 11, /* nstack */ - 3, /* argc */ + 12, /* nstack */ + 4, /* argc */ 2, /* varg */ 0, /* has upvals */ NULL, /* no upvals */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[14]) { /* constants */ + ( &(const bvalue[12]) { /* constants */ /* K0 */ be_const_int(0), - /* K1 */ be_nested_str_weak(reachable), - /* K2 */ be_nested_str_weak(device), - /* K3 */ be_nested_str_weak(tick), - /* K4 */ be_nested_str_weak(reachable_tick), + /* K1 */ be_nested_str_weak(http_remote), + /* K2 */ be_nested_str_weak(device_is_alive), + /* K3 */ be_nested_str_weak(device), + /* K4 */ be_nested_str_weak(tick), /* K5 */ be_nested_str_weak(json), /* K6 */ be_nested_str_weak(load), /* K7 */ be_nested_str_weak(contains), /* K8 */ be_nested_str_weak(StatusSNS), /* K9 */ be_nested_str_weak(StatusSTS), /* K10 */ be_nested_str_weak(StatusSHT), - /* K11 */ be_nested_str_weak(_tick), - /* K12 */ be_nested_str_weak(http_shadow_map), - /* K13 */ be_nested_str_weak(parse_update), + /* K11 */ be_nested_str_weak(parse_update), }), be_str_weak(parse_http_response), &be_const_str_solidified, - ( &(const binstruction[44]) { /* code */ - 0x240C0300, // 0000 GT R3 R1 K0 - 0x780E0028, // 0001 JMPF R3 #002B - 0x500C0200, // 0002 LDBOOL R3 1 0 - 0x90020203, // 0003 SETMBR R0 K1 R3 - 0x880C0102, // 0004 GETMBR R3 R0 K2 - 0x880C0703, // 0005 GETMBR R3 R3 K3 - 0x90020803, // 0006 SETMBR R0 K4 R3 - 0xA4120A00, // 0007 IMPORT R4 K5 - 0x8C140906, // 0008 GETMET R5 R4 K6 - 0x5C1C0400, // 0009 MOVE R7 R2 - 0x7C140400, // 000A CALL R5 2 - 0x4C180000, // 000B LDNIL R6 - 0x7816001D, // 000C JMPF R5 #002B - 0x8C1C0B07, // 000D GETMET R7 R5 K7 - 0x58240008, // 000E LDCONST R9 K8 - 0x7C1C0400, // 000F CALL R7 2 - 0x781E0002, // 0010 JMPF R7 #0014 - 0x94140B08, // 0011 GETIDX R5 R5 K8 - 0x541A0007, // 0012 LDINT R6 8 - 0x7002000C, // 0013 JMP #0021 - 0x8C1C0B07, // 0014 GETMET R7 R5 K7 - 0x58240009, // 0015 LDCONST R9 K9 - 0x7C1C0400, // 0016 CALL R7 2 - 0x781E0002, // 0017 JMPF R7 #001B - 0x94140B09, // 0018 GETIDX R5 R5 K9 - 0x541A000A, // 0019 LDINT R6 11 - 0x70020005, // 001A JMP #0021 - 0x8C1C0B07, // 001B GETMET R7 R5 K7 - 0x5824000A, // 001C LDCONST R9 K10 - 0x7C1C0400, // 001D CALL R7 2 - 0x781E0001, // 001E JMPF R7 #0021 - 0x94140B09, // 001F GETIDX R5 R5 K9 - 0x541A000C, // 0020 LDINT R6 13 - 0x4C1C0000, // 0021 LDNIL R7 - 0x201C0C07, // 0022 NE R7 R6 R7 - 0x781E0002, // 0023 JMPF R7 #0027 - 0x98161603, // 0024 SETIDX R5 K11 R3 - 0x881C010C, // 0025 GETMBR R7 R0 K12 - 0x981C0C05, // 0026 SETIDX R7 R6 R5 - 0x8C1C010D, // 0027 GETMET R7 R0 K13 - 0x5C240A00, // 0028 MOVE R9 R5 - 0x5C280C00, // 0029 MOVE R10 R6 - 0x7C1C0600, // 002A CALL R7 3 - 0x80000000, // 002B RET 0 + ( &(const binstruction[39]) { /* code */ + 0x24100300, // 0000 GT R4 R1 K0 + 0x78120023, // 0001 JMPF R4 #0026 + 0x88100101, // 0002 GETMBR R4 R0 K1 + 0x8C100902, // 0003 GETMET R4 R4 K2 + 0x50180200, // 0004 LDBOOL R6 1 0 + 0x7C100400, // 0005 CALL R4 2 + 0x88100103, // 0006 GETMBR R4 R0 K3 + 0x88100904, // 0007 GETMBR R4 R4 K4 + 0xA4160A00, // 0008 IMPORT R5 K5 + 0x8C180B06, // 0009 GETMET R6 R5 K6 + 0x5C200400, // 000A MOVE R8 R2 + 0x7C180400, // 000B CALL R6 2 + 0x4C1C0000, // 000C LDNIL R7 + 0x781A0017, // 000D JMPF R6 #0026 + 0x8C200D07, // 000E GETMET R8 R6 K7 + 0x58280008, // 000F LDCONST R10 K8 + 0x7C200400, // 0010 CALL R8 2 + 0x78220002, // 0011 JMPF R8 #0015 + 0x94180D08, // 0012 GETIDX R6 R6 K8 + 0x541E0007, // 0013 LDINT R7 8 + 0x7002000C, // 0014 JMP #0022 + 0x8C200D07, // 0015 GETMET R8 R6 K7 + 0x58280009, // 0016 LDCONST R10 K9 + 0x7C200400, // 0017 CALL R8 2 + 0x78220002, // 0018 JMPF R8 #001C + 0x94180D09, // 0019 GETIDX R6 R6 K9 + 0x541E000A, // 001A LDINT R7 11 + 0x70020005, // 001B JMP #0022 + 0x8C200D07, // 001C GETMET R8 R6 K7 + 0x5828000A, // 001D LDCONST R10 K10 + 0x7C200400, // 001E CALL R8 2 + 0x78220001, // 001F JMPF R8 #0022 + 0x94180D09, // 0020 GETIDX R6 R6 K9 + 0x541E000C, // 0021 LDINT R7 13 + 0x8C20010B, // 0022 GETMET R8 R0 K11 + 0x5C280C00, // 0023 MOVE R10 R6 + 0x5C2C0E00, // 0024 MOVE R11 R7 + 0x7C200600, // 0025 CALL R8 3 + 0x80000000, // 0026 RET 0 }) ) ); @@ -281,9 +317,39 @@ be_local_closure(Matter_Plugin_Bridge_HTTP_parse_http_response, /* name */ /******************************************************************** -** Solidified function: get_types +** Solidified function: every_250ms ********************************************************************/ -be_local_closure(Matter_Plugin_Bridge_HTTP_get_types, /* name */ +be_local_closure(Matter_Plugin_Bridge_HTTP_every_250ms, /* name */ + be_nested_proto( + 3, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 2]) { /* constants */ + /* K0 */ be_nested_str_weak(http_remote), + /* K1 */ be_nested_str_weak(scheduler), + }), + be_str_weak(every_250ms), + &be_const_str_solidified, + ( &(const binstruction[ 4]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x8C040301, // 0001 GETMET R1 R1 K1 + 0x7C040200, // 0002 CALL R1 1 + 0x80000000, // 0003 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: web_values +********************************************************************/ +be_local_closure(Matter_Plugin_Bridge_HTTP_web_values, /* name */ be_nested_proto( 5, /* nstack */ 1, /* argc */ @@ -293,35 +359,23 @@ be_local_closure(Matter_Plugin_Bridge_HTTP_get_types, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[ 4]) { /* constants */ - /* K0 */ be_nested_str_weak(TYPES), - /* K1 */ be_nested_str_weak(keys), - /* K2 */ be_nested_str_weak(stop_iteration), - /* K3 */ be_const_int(1), + ( &(const bvalue[ 5]) { /* constants */ + /* K0 */ be_nested_str_weak(webserver), + /* K1 */ be_nested_str_weak(content_send), + /* K2 */ be_nested_str_weak(_X7C_X20_X26lt_X3B_X2D_X2D_X20_X28), + /* K3 */ be_nested_str_weak(NAME), + /* K4 */ be_nested_str_weak(_X29_X20_X2D_X2D_X26gt_X3B), }), - be_str_weak(get_types), + be_str_weak(web_values), &be_const_str_solidified, - ( &(const binstruction[20]) { /* code */ - 0x60040013, // 0000 GETGBL R1 G19 - 0x7C040000, // 0001 CALL R1 0 - 0x60080010, // 0002 GETGBL R2 G16 - 0x880C0100, // 0003 GETMBR R3 R0 K0 - 0x8C0C0701, // 0004 GETMET R3 R3 K1 - 0x7C0C0200, // 0005 CALL R3 1 - 0x7C080200, // 0006 CALL R2 1 - 0xA8020005, // 0007 EXBLK 0 #000E - 0x5C0C0400, // 0008 MOVE R3 R2 - 0x7C0C0000, // 0009 CALL R3 0 - 0x88100100, // 000A GETMBR R4 R0 K0 - 0x94100803, // 000B GETIDX R4 R4 R3 - 0x98040604, // 000C SETIDX R1 R3 R4 - 0x7001FFF9, // 000D JMP #0008 - 0x58080002, // 000E LDCONST R2 K2 - 0xAC080200, // 000F CATCH R2 1 0 - 0xB0080000, // 0010 RAISE 2 R0 R0 - 0x540A0012, // 0011 LDINT R2 19 - 0x98040503, // 0012 SETIDX R1 R2 K3 - 0x80040200, // 0013 RET 1 R1 + ( &(const binstruction[ 7]) { /* code */ + 0xA4060000, // 0000 IMPORT R1 K0 + 0x8C080301, // 0001 GETMET R2 R1 K1 + 0x88100103, // 0002 GETMBR R4 R0 K3 + 0x00120404, // 0003 ADD R4 K2 R4 + 0x00100904, // 0004 ADD R4 R4 K4 + 0x7C080400, // 0005 CALL R2 2 + 0x80000000, // 0006 RET 0 }) ) ); @@ -381,12 +435,12 @@ be_local_closure(Matter_Plugin_Bridge_HTTP_ui_string_to_conf, /* name */ /******************************************************************** -** Solidified function: probe_shadow_async +** Solidified function: parse_update ********************************************************************/ -be_local_closure(Matter_Plugin_Bridge_HTTP_probe_shadow_async, /* name */ +be_local_closure(Matter_Plugin_Bridge_HTTP_parse_update, /* name */ be_nested_proto( - 1, /* nstack */ - 1, /* argc */ + 3, /* nstack */ + 3, /* argc */ 2, /* varg */ 0, /* has upvals */ NULL, /* no upvals */ @@ -394,7 +448,7 @@ be_local_closure(Matter_Plugin_Bridge_HTTP_probe_shadow_async, /* name */ NULL, /* no sub protos */ 0, /* has constants */ NULL, /* no const */ - be_str_weak(probe_shadow_async), + be_str_weak(parse_update), &be_const_str_solidified, ( &(const binstruction[ 1]) { /* code */ 0x80000000, // 0000 RET 0 @@ -405,12 +459,12 @@ be_local_closure(Matter_Plugin_Bridge_HTTP_probe_shadow_async, /* name */ /******************************************************************** -** Solidified function: read_attribute +** Solidified function: init ********************************************************************/ -be_local_closure(Matter_Plugin_Bridge_HTTP_read_attribute, /* name */ +be_local_closure(Matter_Plugin_Bridge_HTTP_init, /* name */ be_nested_proto( 10, /* nstack */ - 3, /* argc */ + 4, /* argc */ 2, /* varg */ 0, /* has upvals */ NULL, /* no upvals */ @@ -418,47 +472,40 @@ be_local_closure(Matter_Plugin_Bridge_HTTP_read_attribute, /* name */ NULL, /* no sub protos */ 1, /* has constants */ ( &(const bvalue[ 9]) { /* constants */ - /* K0 */ be_nested_str_weak(matter), - /* K1 */ be_nested_str_weak(TLV), - /* K2 */ be_nested_str_weak(cluster), - /* K3 */ be_nested_str_weak(attribute), - /* K4 */ be_const_int(0), - /* K5 */ be_nested_str_weak(create_TLV), - /* K6 */ be_nested_str_weak(BOOL), - /* K7 */ be_nested_str_weak(reachable), - /* K8 */ be_nested_str_weak(read_attribute), + /* K0 */ be_nested_str_weak(string), + /* K1 */ be_nested_str_weak(init), + /* K2 */ be_nested_str_weak(find), + /* K3 */ be_nested_str_weak(ARG_HTTP), + /* K4 */ be_nested_str_weak(http_remote), + /* K5 */ be_nested_str_weak(device), + /* K6 */ be_nested_str_weak(register_http_remote), + /* K7 */ be_nested_str_weak(PROBE_TIMEOUT), + /* K8 */ be_nested_str_weak(register_cmd_cb), }), - be_str_weak(read_attribute), + be_str_weak(init), &be_const_str_solidified, - ( &(const binstruction[28]) { /* code */ - 0xB80E0000, // 0000 GETNGBL R3 K0 - 0x880C0701, // 0001 GETMBR R3 R3 K1 - 0x88100502, // 0002 GETMBR R4 R2 K2 - 0x88140503, // 0003 GETMBR R5 R2 K3 - 0x541A0038, // 0004 LDINT R6 57 - 0x1C180806, // 0005 EQ R6 R4 R6 - 0x781A000B, // 0006 JMPF R6 #0013 - 0x1C180B04, // 0007 EQ R6 R5 K4 - 0x781A0000, // 0008 JMPF R6 #000A - 0x70020007, // 0009 JMP #0012 - 0x541A0010, // 000A LDINT R6 17 - 0x1C180A06, // 000B EQ R6 R5 R6 - 0x781A0004, // 000C JMPF R6 #0012 - 0x8C180705, // 000D GETMET R6 R3 K5 - 0x88200706, // 000E GETMBR R8 R3 K6 + ( &(const binstruction[21]) { /* code */ + 0xA4120000, // 0000 IMPORT R4 K0 + 0x60140003, // 0001 GETGBL R5 G3 + 0x5C180000, // 0002 MOVE R6 R0 + 0x7C140200, // 0003 CALL R5 1 + 0x8C140B01, // 0004 GETMET R5 R5 K1 + 0x5C1C0200, // 0005 MOVE R7 R1 + 0x5C200400, // 0006 MOVE R8 R2 + 0x5C240600, // 0007 MOVE R9 R3 + 0x7C140800, // 0008 CALL R5 4 + 0x8C140702, // 0009 GETMET R5 R3 K2 + 0x881C0103, // 000A GETMBR R7 R0 K3 + 0x7C140400, // 000B CALL R5 2 + 0x88180105, // 000C GETMBR R6 R0 K5 + 0x8C180D06, // 000D GETMET R6 R6 K6 + 0x5C200A00, // 000E MOVE R8 R5 0x88240107, // 000F GETMBR R9 R0 K7 0x7C180600, // 0010 CALL R6 3 - 0x80040C00, // 0011 RET 1 R6 - 0x70020007, // 0012 JMP #001B - 0x60180003, // 0013 GETGBL R6 G3 - 0x5C1C0000, // 0014 MOVE R7 R0 - 0x7C180200, // 0015 CALL R6 1 - 0x8C180D08, // 0016 GETMET R6 R6 K8 - 0x5C200200, // 0017 MOVE R8 R1 - 0x5C240400, // 0018 MOVE R9 R2 - 0x7C180600, // 0019 CALL R6 3 - 0x80040C00, // 001A RET 1 R6 - 0x80000000, // 001B RET 0 + 0x90020806, // 0011 SETMBR R0 K4 R6 + 0x8C180108, // 0012 GETMET R6 R0 K8 + 0x7C180200, // 0013 CALL R6 1 + 0x80000000, // 0014 RET 0 }) ) ); @@ -466,199 +513,62 @@ be_local_closure(Matter_Plugin_Bridge_HTTP_read_attribute, /* name */ /******************************************************************** -** Solidified function: is_reachable_sync +** Solidified function: register_cmd_cb ********************************************************************/ -be_local_closure(Matter_Plugin_Bridge_HTTP_is_reachable_sync, /* name */ +be_local_closure(Matter_Plugin_Bridge_HTTP_register_cmd_cb, /* name */ be_nested_proto( - 5, /* nstack */ + 6, /* nstack */ 1, /* argc */ 2, /* varg */ 0, /* has upvals */ NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 6]) { /* constants */ - /* K0 */ be_nested_str_weak(device), - /* K1 */ be_nested_str_weak(tick), - /* K2 */ be_nested_str_weak(reachable_tick), - /* K3 */ be_nested_str_weak(call_remote_sync), - /* K4 */ be_nested_str_weak(), - /* K5 */ be_nested_str_weak(reachable), + 1, /* has sup protos */ + ( &(const struct bproto*[ 1]) { + be_nested_proto( + 8, /* nstack */ + 3, /* argc */ + 0, /* varg */ + 1, /* has upvals */ + ( &(const bupvaldesc[ 1]) { /* upvals */ + be_local_const_upval(1, 0), + }), + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 1]) { /* constants */ + /* K0 */ be_nested_str_weak(parse_http_response), + }), + be_str_weak(_X3Clambda_X3E), + &be_const_str_solidified, + ( &(const binstruction[ 7]) { /* code */ + 0x680C0000, // 0000 GETUPV R3 U0 + 0x8C0C0700, // 0001 GETMET R3 R3 K0 + 0x5C140000, // 0002 MOVE R5 R0 + 0x5C180200, // 0003 MOVE R6 R1 + 0x5C1C0400, // 0004 MOVE R7 R2 + 0x7C0C0800, // 0005 CALL R3 4 + 0x80040600, // 0006 RET 1 R3 + }) + ), }), - be_str_weak(is_reachable_sync), + 1, /* has constants */ + ( &(const bvalue[ 4]) { /* constants */ + /* K0 */ be_nested_str_weak(http_remote), + /* K1 */ be_nested_str_weak(add_schedule), + /* K2 */ be_nested_str_weak(UPDATE_CMD), + /* K3 */ be_nested_str_weak(UPDATE_TIME), + }), + be_str_weak(register_cmd_cb), &be_const_str_solidified, - ( &(const binstruction[14]) { /* code */ + ( &(const binstruction[ 8]) { /* code */ 0x88040100, // 0000 GETMBR R1 R0 K0 - 0x88040301, // 0001 GETMBR R1 R1 K1 - 0x88080102, // 0002 GETMBR R2 R0 K2 - 0x20040202, // 0003 NE R1 R1 R2 - 0x78060006, // 0004 JMPF R1 #000C - 0x8C040103, // 0005 GETMET R1 R0 K3 - 0x580C0004, // 0006 LDCONST R3 K4 - 0x58100004, // 0007 LDCONST R4 K4 - 0x7C040600, // 0008 CALL R1 3 - 0x4C080000, // 0009 LDNIL R2 - 0x20080202, // 000A NE R2 R1 R2 - 0x90020A02, // 000B SETMBR R0 K5 R2 - 0x88040105, // 000C GETMBR R1 R0 K5 - 0x80040200, // 000D RET 1 R1 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: call_remote_sync -********************************************************************/ -be_local_closure(Matter_Plugin_Bridge_HTTP_call_remote_sync, /* name */ - be_nested_proto( - 11, /* nstack */ - 3, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[21]) { /* constants */ - /* K0 */ be_nested_str_weak(string), - /* K1 */ be_nested_str_weak(tasmota), - /* K2 */ be_nested_str_weak(wifi), - /* K3 */ be_nested_str_weak(up), - /* K4 */ be_nested_str_weak(eth), - /* K5 */ be_const_int(2), - /* K6 */ be_nested_str_weak(format), - /* K7 */ be_nested_str_weak(_X2Fcm_X3Fcmnd_X3D_X25s_X25_X2520_X25s), - /* K8 */ be_nested_str_weak(), - /* K9 */ be_const_int(0), - /* K10 */ be_nested_str_weak(http_remote), - /* K11 */ be_nested_str_weak(begin_sync), - /* K12 */ be_nested_str_weak(SYNC_TIMEOUT), - /* K13 */ be_nested_str_weak(reachable), - /* K14 */ be_nested_str_weak(reachable_tick), - /* K15 */ be_nested_str_weak(device), - /* K16 */ be_nested_str_weak(tick), - /* K17 */ be_const_int(1), - /* K18 */ be_nested_str_weak(log), - /* K19 */ be_nested_str_weak(MTR_X3A_X20HTTP_X20GET_X20retrying), - /* K20 */ be_const_int(3), - }), - be_str_weak(call_remote_sync), - &be_const_str_solidified, - ( &(const binstruction[49]) { /* code */ - 0xA40E0000, // 0000 IMPORT R3 K0 - 0xB8120200, // 0001 GETNGBL R4 K1 - 0x8C100902, // 0002 GETMET R4 R4 K2 - 0x7C100200, // 0003 CALL R4 1 - 0x94100903, // 0004 GETIDX R4 R4 K3 - 0x74120006, // 0005 JMPT R4 #000D - 0xB8120200, // 0006 GETNGBL R4 K1 - 0x8C100904, // 0007 GETMET R4 R4 K4 - 0x7C100200, // 0008 CALL R4 1 - 0x94100903, // 0009 GETIDX R4 R4 K3 - 0x74120001, // 000A JMPT R4 #000D - 0x4C100000, // 000B LDNIL R4 - 0x80040800, // 000C RET 1 R4 - 0x58100005, // 000D LDCONST R4 K5 - 0x8C140706, // 000E GETMET R5 R3 K6 - 0x581C0007, // 000F LDCONST R7 K7 - 0x5C200200, // 0010 MOVE R8 R1 - 0x780A0001, // 0011 JMPF R2 #0014 - 0x5C240400, // 0012 MOVE R9 R2 - 0x70020000, // 0013 JMP #0015 - 0x58240008, // 0014 LDCONST R9 K8 - 0x7C140800, // 0015 CALL R5 4 - 0x24180909, // 0016 GT R6 R4 K9 - 0x781A0014, // 0017 JMPF R6 #002D - 0x8818010A, // 0018 GETMBR R6 R0 K10 - 0x8C180D0B, // 0019 GETMET R6 R6 K11 - 0x5C200A00, // 001A MOVE R8 R5 - 0x8824010C, // 001B GETMBR R9 R0 K12 - 0x7C180600, // 001C CALL R6 3 - 0x4C1C0000, // 001D LDNIL R7 - 0x201C0C07, // 001E NE R7 R6 R7 - 0x781E0005, // 001F JMPF R7 #0026 - 0x501C0200, // 0020 LDBOOL R7 1 0 - 0x90021A07, // 0021 SETMBR R0 K13 R7 - 0x881C010F, // 0022 GETMBR R7 R0 K15 - 0x881C0F10, // 0023 GETMBR R7 R7 K16 - 0x90021C07, // 0024 SETMBR R0 K14 R7 - 0x80040C00, // 0025 RET 1 R6 - 0x04100911, // 0026 SUB R4 R4 K17 - 0xB81E0200, // 0027 GETNGBL R7 K1 - 0x8C1C0F12, // 0028 GETMET R7 R7 K18 - 0x58240013, // 0029 LDCONST R9 K19 - 0x58280014, // 002A LDCONST R10 K20 - 0x7C1C0600, // 002B CALL R7 3 - 0x7001FFE8, // 002C JMP #0016 - 0x50180000, // 002D LDBOOL R6 0 0 - 0x90021A06, // 002E SETMBR R0 K13 R6 - 0x4C180000, // 002F LDNIL R6 - 0x80040C00, // 0030 RET 1 R6 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: call_remote_async -********************************************************************/ -be_local_closure(Matter_Plugin_Bridge_HTTP_call_remote_async, /* name */ - be_nested_proto( - 9, /* nstack */ - 3, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[11]) { /* constants */ - /* K0 */ be_nested_str_weak(string), - /* K1 */ be_nested_str_weak(tasmota), - /* K2 */ be_nested_str_weak(wifi), - /* K3 */ be_nested_str_weak(up), - /* K4 */ be_nested_str_weak(eth), - /* K5 */ be_nested_str_weak(format), - /* K6 */ be_nested_str_weak(_X2Fcm_X3Fcmnd_X3D_X25s_X25_X2520_X25s), - /* K7 */ be_nested_str_weak(), - /* K8 */ be_nested_str_weak(http_remote), - /* K9 */ be_nested_str_weak(begin), - /* K10 */ be_nested_str_weak(PROBE_TIMEOUT), - }), - be_str_weak(call_remote_async), - &be_const_str_solidified, - ( &(const binstruction[27]) { /* code */ - 0xA40E0000, // 0000 IMPORT R3 K0 - 0xB8120200, // 0001 GETNGBL R4 K1 - 0x8C100902, // 0002 GETMET R4 R4 K2 - 0x7C100200, // 0003 CALL R4 1 - 0x94100903, // 0004 GETIDX R4 R4 K3 - 0x74120006, // 0005 JMPT R4 #000D - 0xB8120200, // 0006 GETNGBL R4 K1 - 0x8C100904, // 0007 GETMET R4 R4 K4 - 0x7C100200, // 0008 CALL R4 1 - 0x94100903, // 0009 GETIDX R4 R4 K3 - 0x74120001, // 000A JMPT R4 #000D - 0x4C100000, // 000B LDNIL R4 - 0x80040800, // 000C RET 1 R4 - 0x8C100705, // 000D GETMET R4 R3 K5 - 0x58180006, // 000E LDCONST R6 K6 - 0x5C1C0200, // 000F MOVE R7 R1 - 0x780A0001, // 0010 JMPF R2 #0013 - 0x5C200400, // 0011 MOVE R8 R2 - 0x70020000, // 0012 JMP #0014 - 0x58200007, // 0013 LDCONST R8 K7 - 0x7C100800, // 0014 CALL R4 4 - 0x88140108, // 0015 GETMBR R5 R0 K8 - 0x8C140B09, // 0016 GETMET R5 R5 K9 - 0x5C1C0800, // 0017 MOVE R7 R4 - 0x8820010A, // 0018 GETMBR R8 R0 K10 - 0x7C140600, // 0019 CALL R5 3 - 0x80000000, // 001A RET 0 + 0x8C040301, // 0001 GETMET R1 R1 K1 + 0x880C0102, // 0002 GETMBR R3 R0 K2 + 0x88100103, // 0003 GETMBR R4 R0 K3 + 0x84140000, // 0004 CLOSURE R5 P0 + 0x7C040800, // 0005 CALL R1 4 + 0xA0000000, // 0006 CLOSE R0 + 0x80000000, // 0007 RET 0 }) ) ); @@ -670,27 +580,12 @@ be_local_closure(Matter_Plugin_Bridge_HTTP_call_remote_async, /* name */ ********************************************************************/ extern const bclass be_class_Matter_Plugin_Device; be_local_class(Matter_Plugin_Bridge_HTTP, - 5, + 1, &be_class_Matter_Plugin_Device, - be_nested_map(24, + be_nested_map(21, ( (struct bmapnode*) &(const bmapnode[]) { - { be_const_key_weak(ARG_HTTP, 1), be_nested_str_weak(url) }, - { be_const_key_weak(UPDATE_TIME, -1), be_const_int(3000) }, - { be_const_key_weak(SYNC_TIMEOUT, -1), be_const_int(500) }, - { be_const_key_weak(init, -1), be_const_closure(Matter_Plugin_Bridge_HTTP_init_closure) }, - { be_const_key_weak(get_remote_status_lazy, 19), be_const_closure(Matter_Plugin_Bridge_HTTP_get_remote_status_lazy_closure) }, - { be_const_key_weak(parse_http_response, -1), be_const_closure(Matter_Plugin_Bridge_HTTP_parse_http_response_closure) }, - { be_const_key_weak(NAME, -1), be_nested_str_weak() }, - { be_const_key_weak(call_remote_sync, 16), be_const_closure(Matter_Plugin_Bridge_HTTP_call_remote_sync_closure) }, - { be_const_key_weak(reachable, -1), be_const_var(0) }, - { be_const_key_weak(get_types, 12), be_const_closure(Matter_Plugin_Bridge_HTTP_get_types_closure) }, - { be_const_key_weak(ui_conf_to_string, 7), be_const_static_closure(Matter_Plugin_Bridge_HTTP_ui_conf_to_string_closure) }, - { be_const_key_weak(http_shadow_map, -1), be_const_var(2) }, - { be_const_key_weak(probe_shadow_async, -1), be_const_closure(Matter_Plugin_Bridge_HTTP_probe_shadow_async_closure) }, - { be_const_key_weak(TYPE, 14), be_nested_str_weak() }, - { be_const_key_weak(PROBE_TIMEOUT, -1), be_const_int(700) }, - { be_const_key_weak(ARG, -1), be_nested_str_weak() }, - { be_const_key_weak(CLUSTERS, 22), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { + { be_const_key_weak(read_attribute, -1), be_const_closure(Matter_Plugin_Bridge_HTTP_read_attribute_closure) }, + { be_const_key_weak(CLUSTERS, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { be_const_map( * be_nested_map(1, ( (struct bmapnode*) &(const bmapnode[]) { { be_const_key_int(57, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_list, { @@ -699,13 +594,25 @@ be_local_class(Matter_Plugin_Bridge_HTTP, be_const_int(17), })) ) } )) }, })) ) } )) }, - { be_const_key_weak(read_attribute, -1), be_const_closure(Matter_Plugin_Bridge_HTTP_read_attribute_closure) }, - { be_const_key_weak(next_probe_timestamp, 17), be_const_var(4) }, - { be_const_key_weak(http_remote, -1), be_const_var(3) }, - { be_const_key_weak(reachable_tick, -1), be_const_var(1) }, - { be_const_key_weak(is_reachable_sync, -1), be_const_closure(Matter_Plugin_Bridge_HTTP_is_reachable_sync_closure) }, + { be_const_key_weak(SYNC_TIMEOUT, -1), be_const_int(500) }, + { be_const_key_weak(http_remote, -1), be_const_var(0) }, + { be_const_key_weak(init, 17), be_const_closure(Matter_Plugin_Bridge_HTTP_init_closure) }, + { be_const_key_weak(parse_http_response, -1), be_const_closure(Matter_Plugin_Bridge_HTTP_parse_http_response_closure) }, + { be_const_key_weak(ARG, -1), be_nested_str_weak() }, + { be_const_key_weak(update_shadow, 1), be_const_closure(Matter_Plugin_Bridge_HTTP_update_shadow_closure) }, + { be_const_key_weak(every_250ms, -1), be_const_closure(Matter_Plugin_Bridge_HTTP_every_250ms_closure) }, + { be_const_key_weak(UPDATE_TIME, -1), be_const_int(3000) }, + { be_const_key_weak(TYPE, -1), be_nested_str_weak() }, + { be_const_key_weak(web_values, -1), be_const_closure(Matter_Plugin_Bridge_HTTP_web_values_closure) }, + { be_const_key_weak(ARG_HTTP, 4), be_nested_str_weak(url) }, + { be_const_key_weak(PROBE_TIMEOUT, 18), be_const_int(1700) }, + { be_const_key_weak(parse_update, -1), be_const_closure(Matter_Plugin_Bridge_HTTP_parse_update_closure) }, + { be_const_key_weak(NAME, 6), be_nested_str_weak() }, + { be_const_key_weak(call_remote_sync, 14), be_const_closure(Matter_Plugin_Bridge_HTTP_call_remote_sync_closure) }, + { be_const_key_weak(UPDATE_CMD, -1), be_nested_str_weak(Status_X2011) }, { be_const_key_weak(ui_string_to_conf, -1), be_const_static_closure(Matter_Plugin_Bridge_HTTP_ui_string_to_conf_closure) }, - { be_const_key_weak(call_remote_async, -1), be_const_closure(Matter_Plugin_Bridge_HTTP_call_remote_async_closure) }, + { be_const_key_weak(ui_conf_to_string, 3), be_const_static_closure(Matter_Plugin_Bridge_HTTP_ui_conf_to_string_closure) }, + { be_const_key_weak(register_cmd_cb, -1), be_const_closure(Matter_Plugin_Bridge_HTTP_register_cmd_cb_closure) }, })), be_str_weak(Matter_Plugin_Bridge_HTTP) ); diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Light0.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Light0.h new file mode 100644 index 000000000..3da8f171b --- /dev/null +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Light0.h @@ -0,0 +1,492 @@ +/* Solidification of Matter_Plugin_Bridge_Light0.h */ +/********************************************************************\ +* Generated code, don't edit * +\********************************************************************/ +#include "be_constobj.h" + +extern const bclass be_class_Matter_Plugin_Bridge_Light0; + +/******************************************************************** +** Solidified function: init +********************************************************************/ +be_local_closure(Matter_Plugin_Bridge_Light0_init, /* name */ + be_nested_proto( + 9, /* nstack */ + 4, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 7]) { /* constants */ + /* K0 */ be_nested_str_weak(init), + /* K1 */ be_nested_str_weak(shadow_onoff), + /* K2 */ be_nested_str_weak(tasmota_relay_index), + /* K3 */ be_nested_str_weak(find), + /* K4 */ be_nested_str_weak(ARG), + /* K5 */ be_const_int(1), + /* K6 */ be_const_int(0), + }), + be_str_weak(init), + &be_const_str_solidified, + ( &(const binstruction[22]) { /* code */ + 0x60100003, // 0000 GETGBL R4 G3 + 0x5C140000, // 0001 MOVE R5 R0 + 0x7C100200, // 0002 CALL R4 1 + 0x8C100900, // 0003 GETMET R4 R4 K0 + 0x5C180200, // 0004 MOVE R6 R1 + 0x5C1C0400, // 0005 MOVE R7 R2 + 0x5C200600, // 0006 MOVE R8 R3 + 0x7C100800, // 0007 CALL R4 4 + 0x50100000, // 0008 LDBOOL R4 0 0 + 0x90020204, // 0009 SETMBR R0 K1 R4 + 0x60100009, // 000A GETGBL R4 G9 + 0x8C140703, // 000B GETMET R5 R3 K3 + 0x881C0104, // 000C GETMBR R7 R0 K4 + 0x58200005, // 000D LDCONST R8 K5 + 0x7C140600, // 000E CALL R5 3 + 0x7C100200, // 000F CALL R4 1 + 0x90020404, // 0010 SETMBR R0 K2 R4 + 0x88100102, // 0011 GETMBR R4 R0 K2 + 0x18100906, // 0012 LE R4 R4 K6 + 0x78120000, // 0013 JMPF R4 #0015 + 0x90020505, // 0014 SETMBR R0 K2 K5 + 0x80000000, // 0015 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: parse_update +********************************************************************/ +be_local_closure(Matter_Plugin_Bridge_Light0_parse_update, /* name */ + be_nested_proto( + 8, /* nstack */ + 3, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 9]) { /* constants */ + /* K0 */ be_nested_str_weak(tasmota_relay_index), + /* K1 */ be_const_int(1), + /* K2 */ be_nested_str_weak(contains), + /* K3 */ be_nested_str_weak(POWER), + /* K4 */ be_nested_str_weak(find), + /* K5 */ be_nested_str_weak(ON), + /* K6 */ be_nested_str_weak(shadow_onoff), + /* K7 */ be_nested_str_weak(attribute_updated), + /* K8 */ be_const_int(0), + }), + be_str_weak(parse_update), + &be_const_str_solidified, + ( &(const binstruction[41]) { /* code */ + 0x540E000A, // 0000 LDINT R3 11 + 0x1C0C0403, // 0001 EQ R3 R2 R3 + 0x780E0024, // 0002 JMPF R3 #0028 + 0x500C0000, // 0003 LDBOOL R3 0 0 + 0x88100100, // 0004 GETMBR R4 R0 K0 + 0x1C100901, // 0005 EQ R4 R4 K1 + 0x78120009, // 0006 JMPF R4 #0011 + 0x8C100302, // 0007 GETMET R4 R1 K2 + 0x58180003, // 0008 LDCONST R6 K3 + 0x7C100400, // 0009 CALL R4 2 + 0x78120005, // 000A JMPF R4 #0011 + 0x8C100304, // 000B GETMET R4 R1 K4 + 0x58180003, // 000C LDCONST R6 K3 + 0x7C100400, // 000D CALL R4 2 + 0x1C100905, // 000E EQ R4 R4 K5 + 0x5C0C0800, // 000F MOVE R3 R4 + 0x70020007, // 0010 JMP #0019 + 0x8C100304, // 0011 GETMET R4 R1 K4 + 0x60180008, // 0012 GETGBL R6 G8 + 0x881C0100, // 0013 GETMBR R7 R0 K0 + 0x7C180200, // 0014 CALL R6 1 + 0x001A0606, // 0015 ADD R6 K3 R6 + 0x7C100400, // 0016 CALL R4 2 + 0x1C100905, // 0017 EQ R4 R4 K5 + 0x5C0C0800, // 0018 MOVE R3 R4 + 0x88100106, // 0019 GETMBR R4 R0 K6 + 0x4C140000, // 001A LDNIL R5 + 0x20100805, // 001B NE R4 R4 R5 + 0x78120009, // 001C JMPF R4 #0027 + 0x88100106, // 001D GETMBR R4 R0 K6 + 0x60140017, // 001E GETGBL R5 G23 + 0x5C180600, // 001F MOVE R6 R3 + 0x7C140200, // 0020 CALL R5 1 + 0x20100805, // 0021 NE R4 R4 R5 + 0x78120003, // 0022 JMPF R4 #0027 + 0x8C100107, // 0023 GETMET R4 R0 K7 + 0x541A0005, // 0024 LDINT R6 6 + 0x581C0008, // 0025 LDCONST R7 K8 + 0x7C100600, // 0026 CALL R4 3 + 0x90020C03, // 0027 SETMBR R0 K6 R3 + 0x80000000, // 0028 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: invoke_request +********************************************************************/ +be_local_closure(Matter_Plugin_Bridge_Light0_invoke_request, /* name */ + be_nested_proto( + 10, /* nstack */ + 4, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[10]) { /* constants */ + /* K0 */ be_nested_str_weak(matter), + /* K1 */ be_nested_str_weak(TLV), + /* K2 */ be_nested_str_weak(cluster), + /* K3 */ be_nested_str_weak(command), + /* K4 */ be_nested_str_weak(update_shadow_lazy), + /* K5 */ be_const_int(0), + /* K6 */ be_nested_str_weak(set_onoff), + /* K7 */ be_const_int(1), + /* K8 */ be_const_int(2), + /* K9 */ be_nested_str_weak(shadow_onoff), + }), + be_str_weak(invoke_request), + &be_const_str_solidified, + ( &(const binstruction[36]) { /* code */ + 0xB8120000, // 0000 GETNGBL R4 K0 + 0x88100901, // 0001 GETMBR R4 R4 K1 + 0x88140702, // 0002 GETMBR R5 R3 K2 + 0x88180703, // 0003 GETMBR R6 R3 K3 + 0x541E0005, // 0004 LDINT R7 6 + 0x1C1C0A07, // 0005 EQ R7 R5 R7 + 0x781E001B, // 0006 JMPF R7 #0023 + 0x8C1C0104, // 0007 GETMET R7 R0 K4 + 0x7C1C0200, // 0008 CALL R7 1 + 0x1C1C0D05, // 0009 EQ R7 R6 K5 + 0x781E0005, // 000A JMPF R7 #0011 + 0x8C1C0106, // 000B GETMET R7 R0 K6 + 0x50240000, // 000C LDBOOL R9 0 0 + 0x7C1C0400, // 000D CALL R7 2 + 0x501C0200, // 000E LDBOOL R7 1 0 + 0x80040E00, // 000F RET 1 R7 + 0x70020011, // 0010 JMP #0023 + 0x1C1C0D07, // 0011 EQ R7 R6 K7 + 0x781E0005, // 0012 JMPF R7 #0019 + 0x8C1C0106, // 0013 GETMET R7 R0 K6 + 0x50240200, // 0014 LDBOOL R9 1 0 + 0x7C1C0400, // 0015 CALL R7 2 + 0x501C0200, // 0016 LDBOOL R7 1 0 + 0x80040E00, // 0017 RET 1 R7 + 0x70020009, // 0018 JMP #0023 + 0x1C1C0D08, // 0019 EQ R7 R6 K8 + 0x781E0007, // 001A JMPF R7 #0023 + 0x8C1C0106, // 001B GETMET R7 R0 K6 + 0x88240109, // 001C GETMBR R9 R0 K9 + 0x78260000, // 001D JMPF R9 #001F + 0x50240001, // 001E LDBOOL R9 0 1 + 0x50240200, // 001F LDBOOL R9 1 0 + 0x7C1C0400, // 0020 CALL R7 2 + 0x501C0200, // 0021 LDBOOL R7 1 0 + 0x80040E00, // 0022 RET 1 R7 + 0x80000000, // 0023 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: set_onoff +********************************************************************/ +be_local_closure(Matter_Plugin_Bridge_Light0_set_onoff, /* name */ + be_nested_proto( + 7, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 6]) { /* constants */ + /* K0 */ be_nested_str_weak(call_remote_sync), + /* K1 */ be_nested_str_weak(Power), + /* K2 */ be_nested_str_weak(tasmota_relay_index), + /* K3 */ be_nested_str_weak(1), + /* K4 */ be_nested_str_weak(0), + /* K5 */ be_nested_str_weak(parse_update), + }), + be_str_weak(set_onoff), + &be_const_str_solidified, + ( &(const binstruction[18]) { /* code */ + 0x8C080100, // 0000 GETMET R2 R0 K0 + 0x60100008, // 0001 GETGBL R4 G8 + 0x88140102, // 0002 GETMBR R5 R0 K2 + 0x7C100200, // 0003 CALL R4 1 + 0x00120204, // 0004 ADD R4 K1 R4 + 0x78060001, // 0005 JMPF R1 #0008 + 0x58140003, // 0006 LDCONST R5 K3 + 0x70020000, // 0007 JMP #0009 + 0x58140004, // 0008 LDCONST R5 K4 + 0x7C080600, // 0009 CALL R2 3 + 0x4C0C0000, // 000A LDNIL R3 + 0x200C0403, // 000B NE R3 R2 R3 + 0x780E0003, // 000C JMPF R3 #0011 + 0x8C0C0105, // 000D GETMET R3 R0 K5 + 0x5C140400, // 000E MOVE R5 R2 + 0x541A000A, // 000F LDINT R6 11 + 0x7C0C0600, // 0010 CALL R3 3 + 0x80000000, // 0011 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: +********************************************************************/ +be_local_closure(Matter_Plugin_Bridge_Light0__X3Clambda_X3E, /* name */ + be_nested_proto( + 3, /* nstack */ + 1, /* argc */ + 0, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 0, /* has constants */ + NULL, /* no const */ + be_str_weak(_X3Clambda_X3E), + &be_const_str_solidified, + ( &(const binstruction[ 4]) { /* code */ + 0x60040009, // 0000 GETGBL R1 G9 + 0x5C080000, // 0001 MOVE R2 R0 + 0x7C040200, // 0002 CALL R1 1 + 0x80040200, // 0003 RET 1 R1 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: web_values +********************************************************************/ +be_local_closure(Matter_Plugin_Bridge_Light0_web_values, /* name */ + be_nested_proto( + 10, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 6]) { /* constants */ + /* K0 */ be_nested_str_weak(webserver), + /* K1 */ be_nested_str_weak(string), + /* K2 */ be_nested_str_weak(content_send), + /* K3 */ be_nested_str_weak(format), + /* K4 */ be_nested_str_weak(_X7C_X20Light_X20_X25s), + /* K5 */ be_nested_str_weak(web_value_onoff), + }), + be_str_weak(web_values), + &be_const_str_solidified, + ( &(const binstruction[10]) { /* code */ + 0xA4060000, // 0000 IMPORT R1 K0 + 0xA40A0200, // 0001 IMPORT R2 K1 + 0x8C0C0302, // 0002 GETMET R3 R1 K2 + 0x8C140503, // 0003 GETMET R5 R2 K3 + 0x581C0004, // 0004 LDCONST R7 K4 + 0x8C200105, // 0005 GETMET R8 R0 K5 + 0x7C200200, // 0006 CALL R8 1 + 0x7C140600, // 0007 CALL R5 3 + 0x7C0C0400, // 0008 CALL R3 2 + 0x80000000, // 0009 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: web_value_onoff +********************************************************************/ +be_local_closure(Matter_Plugin_Bridge_Light0_web_value_onoff, /* name */ + be_nested_proto( + 3, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 4]) { /* constants */ + /* K0 */ be_nested_str_weak(shadow_onoff), + /* K1 */ be_nested_str_weak(_X3Cb_X3EOn_X3C_X2Fb_X3E), + /* K2 */ be_nested_str_weak(Off), + /* K3 */ be_nested_str_weak(), + }), + be_str_weak(web_value_onoff), + &be_const_str_solidified, + ( &(const binstruction[12]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x4C080000, // 0001 LDNIL R2 + 0x20040202, // 0002 NE R1 R1 R2 + 0x78060005, // 0003 JMPF R1 #000A + 0x88040100, // 0004 GETMBR R1 R0 K0 + 0x78060001, // 0005 JMPF R1 #0008 + 0x58040001, // 0006 LDCONST R1 K1 + 0x70020000, // 0007 JMP #0009 + 0x58040002, // 0008 LDCONST R1 K2 + 0x70020000, // 0009 JMP #000B + 0x58040003, // 000A LDCONST R1 K3 + 0x80040200, // 000B RET 1 R1 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: read_attribute +********************************************************************/ +be_local_closure(Matter_Plugin_Bridge_Light0_read_attribute, /* name */ + be_nested_proto( + 11, /* nstack */ + 3, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[12]) { /* constants */ + /* K0 */ be_nested_str_weak(string), + /* K1 */ be_nested_str_weak(matter), + /* K2 */ be_nested_str_weak(TLV), + /* K3 */ be_nested_str_weak(cluster), + /* K4 */ be_nested_str_weak(attribute), + /* K5 */ be_nested_str_weak(update_shadow_lazy), + /* K6 */ be_const_int(0), + /* K7 */ be_nested_str_weak(create_TLV), + /* K8 */ be_nested_str_weak(BOOL), + /* K9 */ be_nested_str_weak(shadow_onoff), + /* K10 */ be_nested_str_weak(U4), + /* K11 */ be_nested_str_weak(read_attribute), + }), + be_str_weak(read_attribute), + &be_const_str_solidified, + ( &(const binstruction[45]) { /* code */ + 0xA40E0000, // 0000 IMPORT R3 K0 + 0xB8120200, // 0001 GETNGBL R4 K1 + 0x88100902, // 0002 GETMBR R4 R4 K2 + 0x88140503, // 0003 GETMBR R5 R2 K3 + 0x88180504, // 0004 GETMBR R6 R2 K4 + 0x541E0005, // 0005 LDINT R7 6 + 0x1C1C0A07, // 0006 EQ R7 R5 R7 + 0x781E001B, // 0007 JMPF R7 #0024 + 0x8C1C0105, // 0008 GETMET R7 R0 K5 + 0x7C1C0200, // 0009 CALL R7 1 + 0x1C1C0D06, // 000A EQ R7 R6 K6 + 0x781E0005, // 000B JMPF R7 #0012 + 0x8C1C0907, // 000C GETMET R7 R4 K7 + 0x88240908, // 000D GETMBR R9 R4 K8 + 0x88280109, // 000E GETMBR R10 R0 K9 + 0x7C1C0600, // 000F CALL R7 3 + 0x80040E00, // 0010 RET 1 R7 + 0x70020010, // 0011 JMP #0023 + 0x541EFFFB, // 0012 LDINT R7 65532 + 0x1C1C0C07, // 0013 EQ R7 R6 R7 + 0x781E0005, // 0014 JMPF R7 #001B + 0x8C1C0907, // 0015 GETMET R7 R4 K7 + 0x8824090A, // 0016 GETMBR R9 R4 K10 + 0x58280006, // 0017 LDCONST R10 K6 + 0x7C1C0600, // 0018 CALL R7 3 + 0x80040E00, // 0019 RET 1 R7 + 0x70020007, // 001A JMP #0023 + 0x541EFFFC, // 001B LDINT R7 65533 + 0x1C1C0C07, // 001C EQ R7 R6 R7 + 0x781E0004, // 001D JMPF R7 #0023 + 0x8C1C0907, // 001E GETMET R7 R4 K7 + 0x8824090A, // 001F GETMBR R9 R4 K10 + 0x542A0003, // 0020 LDINT R10 4 + 0x7C1C0600, // 0021 CALL R7 3 + 0x80040E00, // 0022 RET 1 R7 + 0x70020007, // 0023 JMP #002C + 0x601C0003, // 0024 GETGBL R7 G3 + 0x5C200000, // 0025 MOVE R8 R0 + 0x7C1C0200, // 0026 CALL R7 1 + 0x8C1C0F0B, // 0027 GETMET R7 R7 K11 + 0x5C240200, // 0028 MOVE R9 R1 + 0x5C280400, // 0029 MOVE R10 R2 + 0x7C1C0600, // 002A CALL R7 3 + 0x80040E00, // 002B RET 1 R7 + 0x80000000, // 002C RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified class: Matter_Plugin_Bridge_Light0 +********************************************************************/ +extern const bclass be_class_Matter_Plugin_Bridge_HTTP; +be_local_class(Matter_Plugin_Bridge_Light0, + 2, + &be_class_Matter_Plugin_Bridge_HTTP, + be_nested_map(15, + ( (struct bmapnode*) &(const bmapnode[]) { + { be_const_key_weak(init, -1), be_const_closure(Matter_Plugin_Bridge_Light0_init_closure) }, + { be_const_key_weak(parse_update, -1), be_const_closure(Matter_Plugin_Bridge_Light0_parse_update_closure) }, + { be_const_key_weak(invoke_request, 14), be_const_closure(Matter_Plugin_Bridge_Light0_invoke_request_closure) }, + { be_const_key_weak(set_onoff, -1), be_const_closure(Matter_Plugin_Bridge_Light0_set_onoff_closure) }, + { be_const_key_weak(ARG_TYPE, 11), be_const_static_closure(Matter_Plugin_Bridge_Light0__X3Clambda_X3E_closure) }, + { be_const_key_weak(tasmota_relay_index, 7), be_const_var(0) }, + { be_const_key_weak(ARG, -1), be_nested_str_weak(relay) }, + { be_const_key_weak(TYPES, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { + be_const_map( * be_nested_map(2, + ( (struct bmapnode*) &(const bmapnode[]) { + { be_const_key_int(256, -1), be_const_int(2) }, + { be_const_key_int(19, -1), be_const_int(1) }, + })) ) } )) }, + { be_const_key_weak(TYPE, -1), be_nested_str_weak(http_light0) }, + { be_const_key_weak(NAME, 6), be_nested_str_weak(_X26_X23x1F517_X3B_X20Light_X200_X20On) }, + { be_const_key_weak(web_value_onoff, -1), be_const_closure(Matter_Plugin_Bridge_Light0_web_value_onoff_closure) }, + { be_const_key_weak(CLUSTERS, 8), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { + be_const_map( * be_nested_map(1, + ( (struct bmapnode*) &(const bmapnode[]) { + { be_const_key_int(6, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_list, { + be_const_list( * be_nested_list(3, + ( (struct bvalue*) &(const bvalue[]) { + be_const_int(0), + be_const_int(65532), + be_const_int(65533), + })) ) } )) }, + })) ) } )) }, + { be_const_key_weak(read_attribute, -1), be_const_closure(Matter_Plugin_Bridge_Light0_read_attribute_closure) }, + { be_const_key_weak(shadow_onoff, -1), be_const_var(1) }, + { be_const_key_weak(web_values, -1), be_const_closure(Matter_Plugin_Bridge_Light0_web_values_closure) }, + })), + be_str_weak(Matter_Plugin_Bridge_Light0) +); +/*******************************************************************/ + +void be_load_Matter_Plugin_Bridge_Light0_class(bvm *vm) { + be_pushntvclass(vm, &be_class_Matter_Plugin_Bridge_Light0); + be_setglobal(vm, "Matter_Plugin_Bridge_Light0"); + be_pop(vm, 1); +} +/********************************************************************/ +/* End of solidification */ diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Light1.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Light1.h new file mode 100644 index 000000000..2ff2c9f37 --- /dev/null +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Light1.h @@ -0,0 +1,542 @@ +/* Solidification of Matter_Plugin_Bridge_Light1.h */ +/********************************************************************\ +* Generated code, don't edit * +\********************************************************************/ +#include "be_constobj.h" + +extern const bclass be_class_Matter_Plugin_Bridge_Light1; + +/******************************************************************** +** Solidified function: invoke_request +********************************************************************/ +be_local_closure(Matter_Plugin_Bridge_Light1_invoke_request, /* name */ + be_nested_proto( + 12, /* nstack */ + 4, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[15]) { /* constants */ + /* K0 */ be_nested_str_weak(matter), + /* K1 */ be_nested_str_weak(TLV), + /* K2 */ be_nested_str_weak(cluster), + /* K3 */ be_nested_str_weak(command), + /* K4 */ be_nested_str_weak(update_shadow_lazy), + /* K5 */ be_const_int(0), + /* K6 */ be_nested_str_weak(findsubval), + /* K7 */ be_nested_str_weak(set_bri), + /* K8 */ be_nested_str_weak(log), + /* K9 */ be_nested_str_weak(bri_X3A), + /* K10 */ be_const_int(1), + /* K11 */ be_const_int(2), + /* K12 */ be_const_int(3), + /* K13 */ be_nested_str_weak(set_onoff), + /* K14 */ be_nested_str_weak(invoke_request), + }), + be_str_weak(invoke_request), + &be_const_str_solidified, + ( &(const binstruction[89]) { /* code */ + 0xB8120000, // 0000 GETNGBL R4 K0 + 0x88100901, // 0001 GETMBR R4 R4 K1 + 0x88140702, // 0002 GETMBR R5 R3 K2 + 0x88180703, // 0003 GETMBR R6 R3 K3 + 0x541E0007, // 0004 LDINT R7 8 + 0x1C1C0A07, // 0005 EQ R7 R5 R7 + 0x781E0047, // 0006 JMPF R7 #004F + 0x8C1C0104, // 0007 GETMET R7 R0 K4 + 0x7C1C0200, // 0008 CALL R7 1 + 0x1C1C0D05, // 0009 EQ R7 R6 K5 + 0x781E000D, // 000A JMPF R7 #0019 + 0x8C1C0506, // 000B GETMET R7 R2 K6 + 0x58240005, // 000C LDCONST R9 K5 + 0x7C1C0400, // 000D CALL R7 2 + 0x8C200107, // 000E GETMET R8 R0 K7 + 0x5C280E00, // 000F MOVE R10 R7 + 0x7C200400, // 0010 CALL R8 2 + 0x60200008, // 0011 GETGBL R8 G8 + 0x5C240E00, // 0012 MOVE R9 R7 + 0x7C200200, // 0013 CALL R8 1 + 0x00221208, // 0014 ADD R8 K9 R8 + 0x900E1008, // 0015 SETMBR R3 K8 R8 + 0x50200200, // 0016 LDBOOL R8 1 0 + 0x80041000, // 0017 RET 1 R8 + 0x70020034, // 0018 JMP #004E + 0x1C1C0D0A, // 0019 EQ R7 R6 K10 + 0x781E0002, // 001A JMPF R7 #001E + 0x501C0200, // 001B LDBOOL R7 1 0 + 0x80040E00, // 001C RET 1 R7 + 0x7002002F, // 001D JMP #004E + 0x1C1C0D0B, // 001E EQ R7 R6 K11 + 0x781E0002, // 001F JMPF R7 #0023 + 0x501C0200, // 0020 LDBOOL R7 1 0 + 0x80040E00, // 0021 RET 1 R7 + 0x7002002A, // 0022 JMP #004E + 0x1C1C0D0C, // 0023 EQ R7 R6 K12 + 0x781E0002, // 0024 JMPF R7 #0028 + 0x501C0200, // 0025 LDBOOL R7 1 0 + 0x80040E00, // 0026 RET 1 R7 + 0x70020025, // 0027 JMP #004E + 0x541E0003, // 0028 LDINT R7 4 + 0x1C1C0C07, // 0029 EQ R7 R6 R7 + 0x781E0011, // 002A JMPF R7 #003D + 0x8C1C0506, // 002B GETMET R7 R2 K6 + 0x58240005, // 002C LDCONST R9 K5 + 0x7C1C0400, // 002D CALL R7 2 + 0x8C200107, // 002E GETMET R8 R0 K7 + 0x5C280E00, // 002F MOVE R10 R7 + 0x7C200400, // 0030 CALL R8 2 + 0x24200F05, // 0031 GT R8 R7 K5 + 0x8C24010D, // 0032 GETMET R9 R0 K13 + 0x5C2C1000, // 0033 MOVE R11 R8 + 0x7C240400, // 0034 CALL R9 2 + 0x60240008, // 0035 GETGBL R9 G8 + 0x5C280E00, // 0036 MOVE R10 R7 + 0x7C240200, // 0037 CALL R9 1 + 0x00261209, // 0038 ADD R9 K9 R9 + 0x900E1009, // 0039 SETMBR R3 K8 R9 + 0x50240200, // 003A LDBOOL R9 1 0 + 0x80041200, // 003B RET 1 R9 + 0x70020010, // 003C JMP #004E + 0x541E0004, // 003D LDINT R7 5 + 0x1C1C0C07, // 003E EQ R7 R6 R7 + 0x781E0002, // 003F JMPF R7 #0043 + 0x501C0200, // 0040 LDBOOL R7 1 0 + 0x80040E00, // 0041 RET 1 R7 + 0x7002000A, // 0042 JMP #004E + 0x541E0005, // 0043 LDINT R7 6 + 0x1C1C0C07, // 0044 EQ R7 R6 R7 + 0x781E0002, // 0045 JMPF R7 #0049 + 0x501C0200, // 0046 LDBOOL R7 1 0 + 0x80040E00, // 0047 RET 1 R7 + 0x70020004, // 0048 JMP #004E + 0x541E0006, // 0049 LDINT R7 7 + 0x1C1C0C07, // 004A EQ R7 R6 R7 + 0x781E0001, // 004B JMPF R7 #004E + 0x501C0200, // 004C LDBOOL R7 1 0 + 0x80040E00, // 004D RET 1 R7 + 0x70020008, // 004E JMP #0058 + 0x601C0003, // 004F GETGBL R7 G3 + 0x5C200000, // 0050 MOVE R8 R0 + 0x7C1C0200, // 0051 CALL R7 1 + 0x8C1C0F0E, // 0052 GETMET R7 R7 K14 + 0x5C240200, // 0053 MOVE R9 R1 + 0x5C280400, // 0054 MOVE R10 R2 + 0x5C2C0600, // 0055 MOVE R11 R3 + 0x7C1C0800, // 0056 CALL R7 4 + 0x80040E00, // 0057 RET 1 R7 + 0x80000000, // 0058 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: read_attribute +********************************************************************/ +be_local_closure(Matter_Plugin_Bridge_Light1_read_attribute, /* name */ + be_nested_proto( + 11, /* nstack */ + 3, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[16]) { /* constants */ + /* K0 */ be_nested_str_weak(string), + /* K1 */ be_nested_str_weak(matter), + /* K2 */ be_nested_str_weak(TLV), + /* K3 */ be_nested_str_weak(cluster), + /* K4 */ be_nested_str_weak(attribute), + /* K5 */ be_nested_str_weak(update_shadow_lazy), + /* K6 */ be_const_int(0), + /* K7 */ be_nested_str_weak(shadow_bri), + /* K8 */ be_nested_str_weak(create_TLV), + /* K9 */ be_nested_str_weak(U1), + /* K10 */ be_nested_str_weak(NULL), + /* K11 */ be_const_int(2), + /* K12 */ be_const_int(3), + /* K13 */ be_nested_str_weak(U4), + /* K14 */ be_const_int(1), + /* K15 */ be_nested_str_weak(read_attribute), + }), + be_str_weak(read_attribute), + &be_const_str_solidified, + ( &(const binstruction[99]) { /* code */ + 0xA40E0000, // 0000 IMPORT R3 K0 + 0xB8120200, // 0001 GETNGBL R4 K1 + 0x88100902, // 0002 GETMBR R4 R4 K2 + 0x88140503, // 0003 GETMBR R5 R2 K3 + 0x88180504, // 0004 GETMBR R6 R2 K4 + 0x541E0007, // 0005 LDINT R7 8 + 0x1C1C0A07, // 0006 EQ R7 R5 R7 + 0x781E0051, // 0007 JMPF R7 #005A + 0x8C1C0105, // 0008 GETMET R7 R0 K5 + 0x7C1C0200, // 0009 CALL R7 1 + 0x1C1C0D06, // 000A EQ R7 R6 K6 + 0x781E000F, // 000B JMPF R7 #001C + 0x881C0107, // 000C GETMBR R7 R0 K7 + 0x4C200000, // 000D LDNIL R8 + 0x201C0E08, // 000E NE R7 R7 R8 + 0x781E0005, // 000F JMPF R7 #0016 + 0x8C1C0908, // 0010 GETMET R7 R4 K8 + 0x88240909, // 0011 GETMBR R9 R4 K9 + 0x88280107, // 0012 GETMBR R10 R0 K7 + 0x7C1C0600, // 0013 CALL R7 3 + 0x80040E00, // 0014 RET 1 R7 + 0x70020004, // 0015 JMP #001B + 0x8C1C0908, // 0016 GETMET R7 R4 K8 + 0x8824090A, // 0017 GETMBR R9 R4 K10 + 0x4C280000, // 0018 LDNIL R10 + 0x7C1C0600, // 0019 CALL R7 3 + 0x80040E00, // 001A RET 1 R7 + 0x7002003C, // 001B JMP #0059 + 0x1C1C0D0B, // 001C EQ R7 R6 K11 + 0x781E0005, // 001D JMPF R7 #0024 + 0x8C1C0908, // 001E GETMET R7 R4 K8 + 0x88240909, // 001F GETMBR R9 R4 K9 + 0x58280006, // 0020 LDCONST R10 K6 + 0x7C1C0600, // 0021 CALL R7 3 + 0x80040E00, // 0022 RET 1 R7 + 0x70020034, // 0023 JMP #0059 + 0x1C1C0D0C, // 0024 EQ R7 R6 K12 + 0x781E0005, // 0025 JMPF R7 #002C + 0x8C1C0908, // 0026 GETMET R7 R4 K8 + 0x88240909, // 0027 GETMBR R9 R4 K9 + 0x542A00FD, // 0028 LDINT R10 254 + 0x7C1C0600, // 0029 CALL R7 3 + 0x80040E00, // 002A RET 1 R7 + 0x7002002C, // 002B JMP #0059 + 0x541E000E, // 002C LDINT R7 15 + 0x1C1C0C07, // 002D EQ R7 R6 R7 + 0x781E0005, // 002E JMPF R7 #0035 + 0x8C1C0908, // 002F GETMET R7 R4 K8 + 0x88240909, // 0030 GETMBR R9 R4 K9 + 0x58280006, // 0031 LDCONST R10 K6 + 0x7C1C0600, // 0032 CALL R7 3 + 0x80040E00, // 0033 RET 1 R7 + 0x70020023, // 0034 JMP #0059 + 0x541E0010, // 0035 LDINT R7 17 + 0x1C1C0C07, // 0036 EQ R7 R6 R7 + 0x781E000F, // 0037 JMPF R7 #0048 + 0x881C0107, // 0038 GETMBR R7 R0 K7 + 0x4C200000, // 0039 LDNIL R8 + 0x201C0E08, // 003A NE R7 R7 R8 + 0x781E0005, // 003B JMPF R7 #0042 + 0x8C1C0908, // 003C GETMET R7 R4 K8 + 0x88240909, // 003D GETMBR R9 R4 K9 + 0x88280107, // 003E GETMBR R10 R0 K7 + 0x7C1C0600, // 003F CALL R7 3 + 0x80040E00, // 0040 RET 1 R7 + 0x70020004, // 0041 JMP #0047 + 0x8C1C0908, // 0042 GETMET R7 R4 K8 + 0x8824090A, // 0043 GETMBR R9 R4 K10 + 0x4C280000, // 0044 LDNIL R10 + 0x7C1C0600, // 0045 CALL R7 3 + 0x80040E00, // 0046 RET 1 R7 + 0x70020010, // 0047 JMP #0059 + 0x541EFFFB, // 0048 LDINT R7 65532 + 0x1C1C0C07, // 0049 EQ R7 R6 R7 + 0x781E0005, // 004A JMPF R7 #0051 + 0x8C1C0908, // 004B GETMET R7 R4 K8 + 0x8824090D, // 004C GETMBR R9 R4 K13 + 0x5828000E, // 004D LDCONST R10 K14 + 0x7C1C0600, // 004E CALL R7 3 + 0x80040E00, // 004F RET 1 R7 + 0x70020007, // 0050 JMP #0059 + 0x541EFFFC, // 0051 LDINT R7 65533 + 0x1C1C0C07, // 0052 EQ R7 R6 R7 + 0x781E0004, // 0053 JMPF R7 #0059 + 0x8C1C0908, // 0054 GETMET R7 R4 K8 + 0x8824090D, // 0055 GETMBR R9 R4 K13 + 0x542A0004, // 0056 LDINT R10 5 + 0x7C1C0600, // 0057 CALL R7 3 + 0x80040E00, // 0058 RET 1 R7 + 0x70020007, // 0059 JMP #0062 + 0x601C0003, // 005A GETGBL R7 G3 + 0x5C200000, // 005B MOVE R8 R0 + 0x7C1C0200, // 005C CALL R7 1 + 0x8C1C0F0F, // 005D GETMET R7 R7 K15 + 0x5C240200, // 005E MOVE R9 R1 + 0x5C280400, // 005F MOVE R10 R2 + 0x7C1C0600, // 0060 CALL R7 3 + 0x80040E00, // 0061 RET 1 R7 + 0x80000000, // 0062 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: web_values +********************************************************************/ +be_local_closure(Matter_Plugin_Bridge_Light1_web_values, /* name */ + be_nested_proto( + 11, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 7]) { /* constants */ + /* K0 */ be_nested_str_weak(webserver), + /* K1 */ be_nested_str_weak(string), + /* K2 */ be_nested_str_weak(content_send), + /* K3 */ be_nested_str_weak(format), + /* K4 */ be_nested_str_weak(_X7C_X20Light_X20_X25s_X20_X25s), + /* K5 */ be_nested_str_weak(web_value_onoff), + /* K6 */ be_nested_str_weak(web_value_dimmer), + }), + be_str_weak(web_values), + &be_const_str_solidified, + ( &(const binstruction[12]) { /* code */ + 0xA4060000, // 0000 IMPORT R1 K0 + 0xA40A0200, // 0001 IMPORT R2 K1 + 0x8C0C0302, // 0002 GETMET R3 R1 K2 + 0x8C140503, // 0003 GETMET R5 R2 K3 + 0x581C0004, // 0004 LDCONST R7 K4 + 0x8C200105, // 0005 GETMET R8 R0 K5 + 0x7C200200, // 0006 CALL R8 1 + 0x8C240106, // 0007 GETMET R9 R0 K6 + 0x7C240200, // 0008 CALL R9 1 + 0x7C140800, // 0009 CALL R5 4 + 0x7C0C0400, // 000A CALL R3 2 + 0x80000000, // 000B RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: set_bri +********************************************************************/ +be_local_closure(Matter_Plugin_Bridge_Light1_set_bri, /* name */ + be_nested_proto( + 9, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 6]) { /* constants */ + /* K0 */ be_nested_str_weak(tasmota), + /* K1 */ be_nested_str_weak(scale_uint), + /* K2 */ be_const_int(0), + /* K3 */ be_nested_str_weak(call_remote_sync), + /* K4 */ be_nested_str_weak(Dimmer), + /* K5 */ be_nested_str_weak(parse_update), + }), + be_str_weak(set_bri), + &be_const_str_solidified, + ( &(const binstruction[22]) { /* code */ + 0xB80A0000, // 0000 GETNGBL R2 K0 + 0x8C080501, // 0001 GETMET R2 R2 K1 + 0x5C100200, // 0002 MOVE R4 R1 + 0x58140002, // 0003 LDCONST R5 K2 + 0x541A00FD, // 0004 LDINT R6 254 + 0x581C0002, // 0005 LDCONST R7 K2 + 0x54220063, // 0006 LDINT R8 100 + 0x7C080C00, // 0007 CALL R2 6 + 0x8C0C0103, // 0008 GETMET R3 R0 K3 + 0x58140004, // 0009 LDCONST R5 K4 + 0x60180008, // 000A GETGBL R6 G8 + 0x5C1C0400, // 000B MOVE R7 R2 + 0x7C180200, // 000C CALL R6 1 + 0x7C0C0600, // 000D CALL R3 3 + 0x4C100000, // 000E LDNIL R4 + 0x20100604, // 000F NE R4 R3 R4 + 0x78120003, // 0010 JMPF R4 #0015 + 0x8C100105, // 0011 GETMET R4 R0 K5 + 0x5C180600, // 0012 MOVE R6 R3 + 0x541E000A, // 0013 LDINT R7 11 + 0x7C100600, // 0014 CALL R4 3 + 0x80000000, // 0015 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: parse_update +********************************************************************/ +be_local_closure(Matter_Plugin_Bridge_Light1_parse_update, /* name */ + be_nested_proto( + 11, /* nstack */ + 3, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 8]) { /* constants */ + /* K0 */ be_nested_str_weak(parse_update), + /* K1 */ be_nested_str_weak(find), + /* K2 */ be_nested_str_weak(Dimmer), + /* K3 */ be_nested_str_weak(tasmota), + /* K4 */ be_nested_str_weak(scale_uint), + /* K5 */ be_const_int(0), + /* K6 */ be_nested_str_weak(shadow_bri), + /* K7 */ be_nested_str_weak(attribute_updated), + }), + be_str_weak(parse_update), + &be_const_str_solidified, + ( &(const binstruction[35]) { /* code */ + 0x600C0003, // 0000 GETGBL R3 G3 + 0x5C100000, // 0001 MOVE R4 R0 + 0x7C0C0200, // 0002 CALL R3 1 + 0x8C0C0700, // 0003 GETMET R3 R3 K0 + 0x5C140200, // 0004 MOVE R5 R1 + 0x5C180400, // 0005 MOVE R6 R2 + 0x7C0C0600, // 0006 CALL R3 3 + 0x540E000A, // 0007 LDINT R3 11 + 0x1C0C0403, // 0008 EQ R3 R2 R3 + 0x780E0017, // 0009 JMPF R3 #0022 + 0x600C0009, // 000A GETGBL R3 G9 + 0x8C100301, // 000B GETMET R4 R1 K1 + 0x58180002, // 000C LDCONST R6 K2 + 0x7C100400, // 000D CALL R4 2 + 0x7C0C0200, // 000E CALL R3 1 + 0x4C100000, // 000F LDNIL R4 + 0x20100604, // 0010 NE R4 R3 R4 + 0x7812000F, // 0011 JMPF R4 #0022 + 0xB8120600, // 0012 GETNGBL R4 K3 + 0x8C100904, // 0013 GETMET R4 R4 K4 + 0x5C180600, // 0014 MOVE R6 R3 + 0x581C0005, // 0015 LDCONST R7 K5 + 0x54220063, // 0016 LDINT R8 100 + 0x58240005, // 0017 LDCONST R9 K5 + 0x542A00FD, // 0018 LDINT R10 254 + 0x7C100C00, // 0019 CALL R4 6 + 0x88140106, // 001A GETMBR R5 R0 K6 + 0x20140805, // 001B NE R5 R4 R5 + 0x78160004, // 001C JMPF R5 #0022 + 0x8C140107, // 001D GETMET R5 R0 K7 + 0x541E0007, // 001E LDINT R7 8 + 0x58200005, // 001F LDCONST R8 K5 + 0x7C140600, // 0020 CALL R5 3 + 0x90020C04, // 0021 SETMBR R0 K6 R4 + 0x80000000, // 0022 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: web_value_dimmer +********************************************************************/ +be_local_closure(Matter_Plugin_Bridge_Light1_web_value_dimmer, /* name */ + be_nested_proto( + 10, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 9]) { /* constants */ + /* K0 */ be_nested_str_weak(string), + /* K1 */ be_nested_str_weak(), + /* K2 */ be_nested_str_weak(shadow_bri), + /* K3 */ be_nested_str_weak(tasmota), + /* K4 */ be_nested_str_weak(scale_uint), + /* K5 */ be_const_int(0), + /* K6 */ be_nested_str_weak(format), + /* K7 */ be_nested_str_weak(_X25i_X25_X25), + /* K8 */ be_nested_str_weak(_X26_X23128261_X3B_X20), + }), + be_str_weak(web_value_dimmer), + &be_const_str_solidified, + ( &(const binstruction[21]) { /* code */ + 0xA4060000, // 0000 IMPORT R1 K0 + 0x58080001, // 0001 LDCONST R2 K1 + 0x880C0102, // 0002 GETMBR R3 R0 K2 + 0x4C100000, // 0003 LDNIL R4 + 0x200C0604, // 0004 NE R3 R3 R4 + 0x780E000C, // 0005 JMPF R3 #0013 + 0xB80E0600, // 0006 GETNGBL R3 K3 + 0x8C0C0704, // 0007 GETMET R3 R3 K4 + 0x88140102, // 0008 GETMBR R5 R0 K2 + 0x58180005, // 0009 LDCONST R6 K5 + 0x541E00FD, // 000A LDINT R7 254 + 0x58200005, // 000B LDCONST R8 K5 + 0x54260063, // 000C LDINT R9 100 + 0x7C0C0C00, // 000D CALL R3 6 + 0x8C100306, // 000E GETMET R4 R1 K6 + 0x58180007, // 000F LDCONST R6 K7 + 0x5C1C0600, // 0010 MOVE R7 R3 + 0x7C100600, // 0011 CALL R4 3 + 0x5C080800, // 0012 MOVE R2 R4 + 0x000E1002, // 0013 ADD R3 K8 R2 + 0x80040600, // 0014 RET 1 R3 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified class: Matter_Plugin_Bridge_Light1 +********************************************************************/ +extern const bclass be_class_Matter_Plugin_Bridge_Light0; +be_local_class(Matter_Plugin_Bridge_Light1, + 1, + &be_class_Matter_Plugin_Bridge_Light0, + be_nested_map(11, + ( (struct bmapnode*) &(const bmapnode[]) { + { be_const_key_weak(web_value_dimmer, -1), be_const_closure(Matter_Plugin_Bridge_Light1_web_value_dimmer_closure) }, + { be_const_key_weak(parse_update, -1), be_const_closure(Matter_Plugin_Bridge_Light1_parse_update_closure) }, + { be_const_key_weak(TYPES, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { + be_const_map( * be_nested_map(2, + ( (struct bmapnode*) &(const bmapnode[]) { + { be_const_key_int(257, -1), be_const_int(2) }, + { be_const_key_int(19, 0), be_const_int(1) }, + })) ) } )) }, + { be_const_key_weak(read_attribute, -1), be_const_closure(Matter_Plugin_Bridge_Light1_read_attribute_closure) }, + { be_const_key_weak(TYPE, 2), be_nested_str_weak(http_light1) }, + { be_const_key_weak(shadow_bri, 8), be_const_var(0) }, + { be_const_key_weak(CLUSTERS, 5), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { + be_const_map( * be_nested_map(1, + ( (struct bmapnode*) &(const bmapnode[]) { + { be_const_key_int(8, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_list, { + be_const_list( * be_nested_list(7, + ( (struct bvalue*) &(const bvalue[]) { + be_const_int(0), + be_const_int(2), + be_const_int(3), + be_const_int(15), + be_const_int(17), + be_const_int(65532), + be_const_int(65533), + })) ) } )) }, + })) ) } )) }, + { be_const_key_weak(set_bri, -1), be_const_closure(Matter_Plugin_Bridge_Light1_set_bri_closure) }, + { be_const_key_weak(NAME, -1), be_nested_str_weak(_X26_X23x1F517_X3B_X20Light_X201_X20Dimmer) }, + { be_const_key_weak(web_values, 1), be_const_closure(Matter_Plugin_Bridge_Light1_web_values_closure) }, + { be_const_key_weak(invoke_request, 0), be_const_closure(Matter_Plugin_Bridge_Light1_invoke_request_closure) }, + })), + be_str_weak(Matter_Plugin_Bridge_Light1) +); +/*******************************************************************/ + +void be_load_Matter_Plugin_Bridge_Light1_class(bvm *vm) { + be_pushntvclass(vm, &be_class_Matter_Plugin_Bridge_Light1); + be_setglobal(vm, "Matter_Plugin_Bridge_Light1"); + be_pop(vm, 1); +} +/********************************************************************/ +/* End of solidification */ diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Light2.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Light2.h new file mode 100644 index 000000000..88870f768 --- /dev/null +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Light2.h @@ -0,0 +1,579 @@ +/* Solidification of Matter_Plugin_Bridge_Light2.h */ +/********************************************************************\ +* Generated code, don't edit * +\********************************************************************/ +#include "be_constobj.h" + +extern const bclass be_class_Matter_Plugin_Bridge_Light2; + +/******************************************************************** +** Solidified function: init +********************************************************************/ +be_local_closure(Matter_Plugin_Bridge_Light2_init, /* name */ + be_nested_proto( + 9, /* nstack */ + 4, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 2]) { /* constants */ + /* K0 */ be_nested_str_weak(init), + /* K1 */ be_nested_str_weak(update_ct_minmax), + }), + be_str_weak(init), + &be_const_str_solidified, + ( &(const binstruction[11]) { /* code */ + 0x60100003, // 0000 GETGBL R4 G3 + 0x5C140000, // 0001 MOVE R5 R0 + 0x7C100200, // 0002 CALL R4 1 + 0x8C100900, // 0003 GETMET R4 R4 K0 + 0x5C180200, // 0004 MOVE R6 R1 + 0x5C1C0400, // 0005 MOVE R7 R2 + 0x5C200600, // 0006 MOVE R8 R3 + 0x7C100800, // 0007 CALL R4 4 + 0x8C100101, // 0008 GETMET R4 R0 K1 + 0x7C100200, // 0009 CALL R4 1 + 0x80000000, // 000A RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: parse_update +********************************************************************/ +be_local_closure(Matter_Plugin_Bridge_Light2_parse_update, /* name */ + be_nested_proto( + 8, /* nstack */ + 3, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 7]) { /* constants */ + /* K0 */ be_nested_str_weak(parse_update), + /* K1 */ be_nested_str_weak(find), + /* K2 */ be_nested_str_weak(CT), + /* K3 */ be_nested_str_weak(shadow_ct), + /* K4 */ be_nested_str_weak(ct_min), + /* K5 */ be_nested_str_weak(ct_max), + /* K6 */ be_nested_str_weak(attribute_updated), + }), + be_str_weak(parse_update), + &be_const_str_solidified, + ( &(const binstruction[35]) { /* code */ + 0x600C0003, // 0000 GETGBL R3 G3 + 0x5C100000, // 0001 MOVE R4 R0 + 0x7C0C0200, // 0002 CALL R3 1 + 0x8C0C0700, // 0003 GETMET R3 R3 K0 + 0x5C140200, // 0004 MOVE R5 R1 + 0x5C180400, // 0005 MOVE R6 R2 + 0x7C0C0600, // 0006 CALL R3 3 + 0x540E000A, // 0007 LDINT R3 11 + 0x1C0C0403, // 0008 EQ R3 R2 R3 + 0x780E0017, // 0009 JMPF R3 #0022 + 0x600C0009, // 000A GETGBL R3 G9 + 0x8C100301, // 000B GETMET R4 R1 K1 + 0x58180002, // 000C LDCONST R6 K2 + 0x7C100400, // 000D CALL R4 2 + 0x7C0C0200, // 000E CALL R3 1 + 0x4C100000, // 000F LDNIL R4 + 0x20100604, // 0010 NE R4 R3 R4 + 0x7812000F, // 0011 JMPF R4 #0022 + 0x88100103, // 0012 GETMBR R4 R0 K3 + 0x20100604, // 0013 NE R4 R3 R4 + 0x7812000C, // 0014 JMPF R4 #0022 + 0x88100104, // 0015 GETMBR R4 R0 K4 + 0x14100604, // 0016 LT R4 R3 R4 + 0x78120000, // 0017 JMPF R4 #0019 + 0x880C0104, // 0018 GETMBR R3 R0 K4 + 0x88100105, // 0019 GETMBR R4 R0 K5 + 0x24100604, // 001A GT R4 R3 R4 + 0x78120000, // 001B JMPF R4 #001D + 0x880C0105, // 001C GETMBR R3 R0 K5 + 0x8C100106, // 001D GETMET R4 R0 K6 + 0x541A02FF, // 001E LDINT R6 768 + 0x541E0006, // 001F LDINT R7 7 + 0x7C100600, // 0020 CALL R4 3 + 0x90020603, // 0021 SETMBR R0 K3 R3 + 0x80000000, // 0022 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: web_values +********************************************************************/ +be_local_closure(Matter_Plugin_Bridge_Light2_web_values, /* name */ + be_nested_proto( + 12, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 8]) { /* constants */ + /* K0 */ be_nested_str_weak(webserver), + /* K1 */ be_nested_str_weak(string), + /* K2 */ be_nested_str_weak(content_send), + /* K3 */ be_nested_str_weak(format), + /* K4 */ be_nested_str_weak(_X7C_X20Light_X20_X25s_X20_X25s_X20_X25s), + /* K5 */ be_nested_str_weak(web_value_onoff), + /* K6 */ be_nested_str_weak(web_value_dimmer), + /* K7 */ be_nested_str_weak(web_value_ct), + }), + be_str_weak(web_values), + &be_const_str_solidified, + ( &(const binstruction[14]) { /* code */ + 0xA4060000, // 0000 IMPORT R1 K0 + 0xA40A0200, // 0001 IMPORT R2 K1 + 0x8C0C0302, // 0002 GETMET R3 R1 K2 + 0x8C140503, // 0003 GETMET R5 R2 K3 + 0x581C0004, // 0004 LDCONST R7 K4 + 0x8C200105, // 0005 GETMET R8 R0 K5 + 0x7C200200, // 0006 CALL R8 1 + 0x8C240106, // 0007 GETMET R9 R0 K6 + 0x7C240200, // 0008 CALL R9 1 + 0x8C280107, // 0009 GETMET R10 R0 K7 + 0x7C280200, // 000A CALL R10 1 + 0x7C140A00, // 000B CALL R5 5 + 0x7C0C0400, // 000C CALL R3 2 + 0x80000000, // 000D RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: web_value_ct +********************************************************************/ +be_local_closure(Matter_Plugin_Bridge_Light2_web_value_ct, /* name */ + be_nested_proto( + 8, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 7]) { /* constants */ + /* K0 */ be_nested_str_weak(string), + /* K1 */ be_nested_str_weak(), + /* K2 */ be_nested_str_weak(shadow_ct), + /* K3 */ be_const_int(1000000), + /* K4 */ be_nested_str_weak(format), + /* K5 */ be_nested_str_weak(_X25iK), + /* K6 */ be_nested_str_weak(_X26_X239898_X3B_X20), + }), + be_str_weak(web_value_ct), + &be_const_str_solidified, + ( &(const binstruction[21]) { /* code */ + 0xA4060000, // 0000 IMPORT R1 K0 + 0x58080001, // 0001 LDCONST R2 K1 + 0x880C0102, // 0002 GETMBR R3 R0 K2 + 0x4C100000, // 0003 LDNIL R4 + 0x200C0604, // 0004 NE R3 R3 R4 + 0x780E000C, // 0005 JMPF R3 #0013 + 0x880C0102, // 0006 GETMBR R3 R0 K2 + 0x0C0E0603, // 0007 DIV R3 K3 R3 + 0x54120018, // 0008 LDINT R4 25 + 0x000C0604, // 0009 ADD R3 R3 R4 + 0x54120031, // 000A LDINT R4 50 + 0x0C0C0604, // 000B DIV R3 R3 R4 + 0x54120031, // 000C LDINT R4 50 + 0x080C0604, // 000D MUL R3 R3 R4 + 0x8C100304, // 000E GETMET R4 R1 K4 + 0x58180005, // 000F LDCONST R6 K5 + 0x5C1C0600, // 0010 MOVE R7 R3 + 0x7C100600, // 0011 CALL R4 3 + 0x5C080800, // 0012 MOVE R2 R4 + 0x000E0C02, // 0013 ADD R3 K6 R2 + 0x80040600, // 0014 RET 1 R3 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: set_ct +********************************************************************/ +be_local_closure(Matter_Plugin_Bridge_Light2_set_ct, /* name */ + be_nested_proto( + 7, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 3]) { /* constants */ + /* K0 */ be_nested_str_weak(call_remote_sync), + /* K1 */ be_nested_str_weak(CT), + /* K2 */ be_nested_str_weak(parse_update), + }), + be_str_weak(set_ct), + &be_const_str_solidified, + ( &(const binstruction[14]) { /* code */ + 0x8C080100, // 0000 GETMET R2 R0 K0 + 0x58100001, // 0001 LDCONST R4 K1 + 0x60140008, // 0002 GETGBL R5 G8 + 0x5C180200, // 0003 MOVE R6 R1 + 0x7C140200, // 0004 CALL R5 1 + 0x7C080600, // 0005 CALL R2 3 + 0x4C0C0000, // 0006 LDNIL R3 + 0x200C0403, // 0007 NE R3 R2 R3 + 0x780E0003, // 0008 JMPF R3 #000D + 0x8C0C0102, // 0009 GETMET R3 R0 K2 + 0x5C140400, // 000A MOVE R5 R2 + 0x541A000A, // 000B LDINT R6 11 + 0x7C0C0600, // 000C CALL R3 3 + 0x80000000, // 000D RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: invoke_request +********************************************************************/ +be_local_closure(Matter_Plugin_Bridge_Light2_invoke_request, /* name */ + be_nested_proto( + 12, /* nstack */ + 4, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[13]) { /* constants */ + /* K0 */ be_nested_str_weak(matter), + /* K1 */ be_nested_str_weak(TLV), + /* K2 */ be_nested_str_weak(cluster), + /* K3 */ be_nested_str_weak(command), + /* K4 */ be_nested_str_weak(update_shadow_lazy), + /* K5 */ be_nested_str_weak(findsubval), + /* K6 */ be_const_int(0), + /* K7 */ be_nested_str_weak(ct_min), + /* K8 */ be_nested_str_weak(ct_max), + /* K9 */ be_nested_str_weak(set_ct), + /* K10 */ be_nested_str_weak(log), + /* K11 */ be_nested_str_weak(ct_X3A), + /* K12 */ be_nested_str_weak(invoke_request), + }), + be_str_weak(invoke_request), + &be_const_str_solidified, + ( &(const binstruction[62]) { /* code */ + 0xB8120000, // 0000 GETNGBL R4 K0 + 0x88100901, // 0001 GETMBR R4 R4 K1 + 0x88140702, // 0002 GETMBR R5 R3 K2 + 0x88180703, // 0003 GETMBR R6 R3 K3 + 0x541E02FF, // 0004 LDINT R7 768 + 0x1C1C0A07, // 0005 EQ R7 R5 R7 + 0x781E002C, // 0006 JMPF R7 #0034 + 0x8C1C0104, // 0007 GETMET R7 R0 K4 + 0x7C1C0200, // 0008 CALL R7 1 + 0x541E0009, // 0009 LDINT R7 10 + 0x1C1C0C07, // 000A EQ R7 R6 R7 + 0x781E0015, // 000B JMPF R7 #0022 + 0x8C1C0505, // 000C GETMET R7 R2 K5 + 0x58240006, // 000D LDCONST R9 K6 + 0x7C1C0400, // 000E CALL R7 2 + 0x88200107, // 000F GETMBR R8 R0 K7 + 0x14200E08, // 0010 LT R8 R7 R8 + 0x78220000, // 0011 JMPF R8 #0013 + 0x881C0107, // 0012 GETMBR R7 R0 K7 + 0x88200108, // 0013 GETMBR R8 R0 K8 + 0x24200E08, // 0014 GT R8 R7 R8 + 0x78220000, // 0015 JMPF R8 #0017 + 0x881C0108, // 0016 GETMBR R7 R0 K8 + 0x8C200109, // 0017 GETMET R8 R0 K9 + 0x5C280E00, // 0018 MOVE R10 R7 + 0x7C200400, // 0019 CALL R8 2 + 0x60200008, // 001A GETGBL R8 G8 + 0x5C240E00, // 001B MOVE R9 R7 + 0x7C200200, // 001C CALL R8 1 + 0x00221608, // 001D ADD R8 K11 R8 + 0x900E1408, // 001E SETMBR R3 K10 R8 + 0x50200200, // 001F LDBOOL R8 1 0 + 0x80041000, // 0020 RET 1 R8 + 0x70020010, // 0021 JMP #0033 + 0x541E0046, // 0022 LDINT R7 71 + 0x1C1C0C07, // 0023 EQ R7 R6 R7 + 0x781E0002, // 0024 JMPF R7 #0028 + 0x501C0200, // 0025 LDBOOL R7 1 0 + 0x80040E00, // 0026 RET 1 R7 + 0x7002000A, // 0027 JMP #0033 + 0x541E004A, // 0028 LDINT R7 75 + 0x1C1C0C07, // 0029 EQ R7 R6 R7 + 0x781E0002, // 002A JMPF R7 #002E + 0x501C0200, // 002B LDBOOL R7 1 0 + 0x80040E00, // 002C RET 1 R7 + 0x70020004, // 002D JMP #0033 + 0x541E004B, // 002E LDINT R7 76 + 0x1C1C0C07, // 002F EQ R7 R6 R7 + 0x781E0001, // 0030 JMPF R7 #0033 + 0x501C0200, // 0031 LDBOOL R7 1 0 + 0x80040E00, // 0032 RET 1 R7 + 0x70020008, // 0033 JMP #003D + 0x601C0003, // 0034 GETGBL R7 G3 + 0x5C200000, // 0035 MOVE R8 R0 + 0x7C1C0200, // 0036 CALL R7 1 + 0x8C1C0F0C, // 0037 GETMET R7 R7 K12 + 0x5C240200, // 0038 MOVE R9 R1 + 0x5C280400, // 0039 MOVE R10 R2 + 0x5C2C0600, // 003A MOVE R11 R3 + 0x7C1C0800, // 003B CALL R7 4 + 0x80040E00, // 003C RET 1 R7 + 0x80000000, // 003D RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: update_ct_minmax +********************************************************************/ +be_local_closure(Matter_Plugin_Bridge_Light2_update_ct_minmax, /* name */ + be_nested_proto( + 4, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 4]) { /* constants */ + /* K0 */ be_nested_str_weak(tasmota), + /* K1 */ be_nested_str_weak(get_option), + /* K2 */ be_nested_str_weak(ct_min), + /* K3 */ be_nested_str_weak(ct_max), + }), + be_str_weak(update_ct_minmax), + &be_const_str_solidified, + ( &(const binstruction[15]) { /* code */ + 0xB8060000, // 0000 GETNGBL R1 K0 + 0x8C040301, // 0001 GETMET R1 R1 K1 + 0x540E0051, // 0002 LDINT R3 82 + 0x7C040400, // 0003 CALL R1 2 + 0x78060001, // 0004 JMPF R1 #0007 + 0x540A00C7, // 0005 LDINT R2 200 + 0x70020000, // 0006 JMP #0008 + 0x540A0098, // 0007 LDINT R2 153 + 0x90020402, // 0008 SETMBR R0 K2 R2 + 0x78060001, // 0009 JMPF R1 #000C + 0x540A017B, // 000A LDINT R2 380 + 0x70020000, // 000B JMP #000D + 0x540A01F3, // 000C LDINT R2 500 + 0x90020602, // 000D SETMBR R0 K3 R2 + 0x80000000, // 000E RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: read_attribute +********************************************************************/ +be_local_closure(Matter_Plugin_Bridge_Light2_read_attribute, /* name */ + be_nested_proto( + 11, /* nstack */ + 3, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[16]) { /* constants */ + /* K0 */ be_nested_str_weak(string), + /* K1 */ be_nested_str_weak(matter), + /* K2 */ be_nested_str_weak(TLV), + /* K3 */ be_nested_str_weak(cluster), + /* K4 */ be_nested_str_weak(attribute), + /* K5 */ be_nested_str_weak(update_shadow_lazy), + /* K6 */ be_nested_str_weak(shadow_ct), + /* K7 */ be_nested_str_weak(create_TLV), + /* K8 */ be_nested_str_weak(U1), + /* K9 */ be_nested_str_weak(NULL), + /* K10 */ be_const_int(2), + /* K11 */ be_const_int(0), + /* K12 */ be_nested_str_weak(ct_min), + /* K13 */ be_nested_str_weak(ct_max), + /* K14 */ be_nested_str_weak(U4), + /* K15 */ be_nested_str_weak(read_attribute), + }), + be_str_weak(read_attribute), + &be_const_str_solidified, + ( &(const binstruction[92]) { /* code */ + 0xA40E0000, // 0000 IMPORT R3 K0 + 0xB8120200, // 0001 GETNGBL R4 K1 + 0x88100902, // 0002 GETMBR R4 R4 K2 + 0x88140503, // 0003 GETMBR R5 R2 K3 + 0x88180504, // 0004 GETMBR R6 R2 K4 + 0x541E02FF, // 0005 LDINT R7 768 + 0x1C1C0A07, // 0006 EQ R7 R5 R7 + 0x781E004A, // 0007 JMPF R7 #0053 + 0x8C1C0105, // 0008 GETMET R7 R0 K5 + 0x7C1C0200, // 0009 CALL R7 1 + 0x541E0006, // 000A LDINT R7 7 + 0x1C1C0C07, // 000B EQ R7 R6 R7 + 0x781E000F, // 000C JMPF R7 #001D + 0x881C0106, // 000D GETMBR R7 R0 K6 + 0x4C200000, // 000E LDNIL R8 + 0x201C0E08, // 000F NE R7 R7 R8 + 0x781E0005, // 0010 JMPF R7 #0017 + 0x8C1C0907, // 0011 GETMET R7 R4 K7 + 0x88240908, // 0012 GETMBR R9 R4 K8 + 0x88280106, // 0013 GETMBR R10 R0 K6 + 0x7C1C0600, // 0014 CALL R7 3 + 0x80040E00, // 0015 RET 1 R7 + 0x70020004, // 0016 JMP #001C + 0x8C1C0907, // 0017 GETMET R7 R4 K7 + 0x88240909, // 0018 GETMBR R9 R4 K9 + 0x4C280000, // 0019 LDNIL R10 + 0x7C1C0600, // 001A CALL R7 3 + 0x80040E00, // 001B RET 1 R7 + 0x70020034, // 001C JMP #0052 + 0x541E0007, // 001D LDINT R7 8 + 0x1C1C0C07, // 001E EQ R7 R6 R7 + 0x781E0005, // 001F JMPF R7 #0026 + 0x8C1C0907, // 0020 GETMET R7 R4 K7 + 0x88240908, // 0021 GETMBR R9 R4 K8 + 0x5828000A, // 0022 LDCONST R10 K10 + 0x7C1C0600, // 0023 CALL R7 3 + 0x80040E00, // 0024 RET 1 R7 + 0x7002002B, // 0025 JMP #0052 + 0x541E000E, // 0026 LDINT R7 15 + 0x1C1C0C07, // 0027 EQ R7 R6 R7 + 0x781E0005, // 0028 JMPF R7 #002F + 0x8C1C0907, // 0029 GETMET R7 R4 K7 + 0x88240908, // 002A GETMBR R9 R4 K8 + 0x5828000B, // 002B LDCONST R10 K11 + 0x7C1C0600, // 002C CALL R7 3 + 0x80040E00, // 002D RET 1 R7 + 0x70020022, // 002E JMP #0052 + 0x541E400A, // 002F LDINT R7 16395 + 0x1C1C0C07, // 0030 EQ R7 R6 R7 + 0x781E0005, // 0031 JMPF R7 #0038 + 0x8C1C0907, // 0032 GETMET R7 R4 K7 + 0x88240908, // 0033 GETMBR R9 R4 K8 + 0x8828010C, // 0034 GETMBR R10 R0 K12 + 0x7C1C0600, // 0035 CALL R7 3 + 0x80040E00, // 0036 RET 1 R7 + 0x70020019, // 0037 JMP #0052 + 0x541E400B, // 0038 LDINT R7 16396 + 0x1C1C0C07, // 0039 EQ R7 R6 R7 + 0x781E0005, // 003A JMPF R7 #0041 + 0x8C1C0907, // 003B GETMET R7 R4 K7 + 0x88240908, // 003C GETMBR R9 R4 K8 + 0x8828010D, // 003D GETMBR R10 R0 K13 + 0x7C1C0600, // 003E CALL R7 3 + 0x80040E00, // 003F RET 1 R7 + 0x70020010, // 0040 JMP #0052 + 0x541EFFFB, // 0041 LDINT R7 65532 + 0x1C1C0C07, // 0042 EQ R7 R6 R7 + 0x781E0005, // 0043 JMPF R7 #004A + 0x8C1C0907, // 0044 GETMET R7 R4 K7 + 0x8824090E, // 0045 GETMBR R9 R4 K14 + 0x542A000F, // 0046 LDINT R10 16 + 0x7C1C0600, // 0047 CALL R7 3 + 0x80040E00, // 0048 RET 1 R7 + 0x70020007, // 0049 JMP #0052 + 0x541EFFFC, // 004A LDINT R7 65533 + 0x1C1C0C07, // 004B EQ R7 R6 R7 + 0x781E0004, // 004C JMPF R7 #0052 + 0x8C1C0907, // 004D GETMET R7 R4 K7 + 0x8824090E, // 004E GETMBR R9 R4 K14 + 0x542A0004, // 004F LDINT R10 5 + 0x7C1C0600, // 0050 CALL R7 3 + 0x80040E00, // 0051 RET 1 R7 + 0x70020007, // 0052 JMP #005B + 0x601C0003, // 0053 GETGBL R7 G3 + 0x5C200000, // 0054 MOVE R8 R0 + 0x7C1C0200, // 0055 CALL R7 1 + 0x8C1C0F0F, // 0056 GETMET R7 R7 K15 + 0x5C240200, // 0057 MOVE R9 R1 + 0x5C280400, // 0058 MOVE R10 R2 + 0x7C1C0600, // 0059 CALL R7 3 + 0x80040E00, // 005A RET 1 R7 + 0x80000000, // 005B RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified class: Matter_Plugin_Bridge_Light2 +********************************************************************/ +extern const bclass be_class_Matter_Plugin_Bridge_Light1; +be_local_class(Matter_Plugin_Bridge_Light2, + 3, + &be_class_Matter_Plugin_Bridge_Light1, + be_nested_map(15, + ( (struct bmapnode*) &(const bmapnode[]) { + { be_const_key_weak(init, -1), be_const_closure(Matter_Plugin_Bridge_Light2_init_closure) }, + { be_const_key_weak(parse_update, 10), be_const_closure(Matter_Plugin_Bridge_Light2_parse_update_closure) }, + { be_const_key_weak(web_values, 11), be_const_closure(Matter_Plugin_Bridge_Light2_web_values_closure) }, + { be_const_key_weak(ct_max, -1), be_const_var(2) }, + { be_const_key_weak(CLUSTERS, 14), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { + be_const_map( * be_nested_map(1, + ( (struct bmapnode*) &(const bmapnode[]) { + { be_const_key_int(768, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_list, { + be_const_list( * be_nested_list(7, + ( (struct bvalue*) &(const bvalue[]) { + be_const_int(7), + be_const_int(8), + be_const_int(15), + be_const_int(16395), + be_const_int(16396), + be_const_int(65532), + be_const_int(65533), + })) ) } )) }, + })) ) } )) }, + { be_const_key_weak(TYPES, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { + be_const_map( * be_nested_map(2, + ( (struct bmapnode*) &(const bmapnode[]) { + { be_const_key_int(268, -1), be_const_int(2) }, + { be_const_key_int(19, -1), be_const_int(1) }, + })) ) } )) }, + { be_const_key_weak(web_value_ct, -1), be_const_closure(Matter_Plugin_Bridge_Light2_web_value_ct_closure) }, + { be_const_key_weak(set_ct, -1), be_const_closure(Matter_Plugin_Bridge_Light2_set_ct_closure) }, + { be_const_key_weak(read_attribute, -1), be_const_closure(Matter_Plugin_Bridge_Light2_read_attribute_closure) }, + { be_const_key_weak(NAME, -1), be_nested_str_weak(_X26_X23x1F517_X3B_X20Light_X202_X20CT) }, + { be_const_key_weak(shadow_ct, -1), be_const_var(0) }, + { be_const_key_weak(invoke_request, -1), be_const_closure(Matter_Plugin_Bridge_Light2_invoke_request_closure) }, + { be_const_key_weak(update_ct_minmax, 8), be_const_closure(Matter_Plugin_Bridge_Light2_update_ct_minmax_closure) }, + { be_const_key_weak(ct_min, -1), be_const_var(1) }, + { be_const_key_weak(TYPE, -1), be_nested_str_weak(http_light2) }, + })), + be_str_weak(Matter_Plugin_Bridge_Light2) +); +/*******************************************************************/ + +void be_load_Matter_Plugin_Bridge_Light2_class(bvm *vm) { + be_pushntvclass(vm, &be_class_Matter_Plugin_Bridge_Light2); + be_setglobal(vm, "Matter_Plugin_Bridge_Light2"); + be_pop(vm, 1); +} +/********************************************************************/ +/* End of solidification */ diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Light3.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Light3.h new file mode 100644 index 000000000..13daccf0e --- /dev/null +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Light3.h @@ -0,0 +1,752 @@ +/* Solidification of Matter_Plugin_Bridge_Light3.h */ +/********************************************************************\ +* Generated code, don't edit * +\********************************************************************/ +#include "be_constobj.h" + +extern const bclass be_class_Matter_Plugin_Bridge_Light3; + +/******************************************************************** +** Solidified function: set_sat +********************************************************************/ +be_local_closure(Matter_Plugin_Bridge_Light3_set_sat, /* name */ + be_nested_proto( + 9, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 6]) { /* constants */ + /* K0 */ be_nested_str_weak(tasmota), + /* K1 */ be_nested_str_weak(scale_uint), + /* K2 */ be_const_int(0), + /* K3 */ be_nested_str_weak(call_remote_sync), + /* K4 */ be_nested_str_weak(HSBColor2), + /* K5 */ be_nested_str_weak(parse_update), + }), + be_str_weak(set_sat), + &be_const_str_solidified, + ( &(const binstruction[20]) { /* code */ + 0xB80A0000, // 0000 GETNGBL R2 K0 + 0x8C080501, // 0001 GETMET R2 R2 K1 + 0x5C100200, // 0002 MOVE R4 R1 + 0x58140002, // 0003 LDCONST R5 K2 + 0x541A00FD, // 0004 LDINT R6 254 + 0x581C0002, // 0005 LDCONST R7 K2 + 0x54220063, // 0006 LDINT R8 100 + 0x7C080C00, // 0007 CALL R2 6 + 0x8C0C0103, // 0008 GETMET R3 R0 K3 + 0x58140004, // 0009 LDCONST R5 K4 + 0x5C180400, // 000A MOVE R6 R2 + 0x7C0C0600, // 000B CALL R3 3 + 0x4C100000, // 000C LDNIL R4 + 0x20100604, // 000D NE R4 R3 R4 + 0x78120003, // 000E JMPF R4 #0013 + 0x8C100105, // 000F GETMET R4 R0 K5 + 0x5C180600, // 0010 MOVE R6 R3 + 0x541E000A, // 0011 LDINT R7 11 + 0x7C100600, // 0012 CALL R4 3 + 0x80000000, // 0013 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: parse_update +********************************************************************/ +be_local_closure(Matter_Plugin_Bridge_Light3_parse_update, /* name */ + be_nested_proto( + 15, /* nstack */ + 3, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[13]) { /* constants */ + /* K0 */ be_nested_str_weak(parse_update), + /* K1 */ be_nested_str_weak(find), + /* K2 */ be_nested_str_weak(HSBColor), + /* K3 */ be_nested_str_weak(string), + /* K4 */ be_nested_str_weak(split), + /* K5 */ be_nested_str_weak(_X2C), + /* K6 */ be_const_int(0), + /* K7 */ be_const_int(1), + /* K8 */ be_nested_str_weak(tasmota), + /* K9 */ be_nested_str_weak(scale_uint), + /* K10 */ be_nested_str_weak(shadow_hue), + /* K11 */ be_nested_str_weak(shadow_sat), + /* K12 */ be_nested_str_weak(attribute_updated), + }), + be_str_weak(parse_update), + &be_const_str_solidified, + ( &(const binstruction[70]) { /* code */ + 0x600C0003, // 0000 GETGBL R3 G3 + 0x5C100000, // 0001 MOVE R4 R0 + 0x7C0C0200, // 0002 CALL R3 1 + 0x8C0C0700, // 0003 GETMET R3 R3 K0 + 0x5C140200, // 0004 MOVE R5 R1 + 0x5C180400, // 0005 MOVE R6 R2 + 0x7C0C0600, // 0006 CALL R3 3 + 0x540E000A, // 0007 LDINT R3 11 + 0x1C0C0403, // 0008 EQ R3 R2 R3 + 0x780E003A, // 0009 JMPF R3 #0045 + 0x8C0C0301, // 000A GETMET R3 R1 K1 + 0x58140002, // 000B LDCONST R5 K2 + 0x7C0C0400, // 000C CALL R3 2 + 0x780E0036, // 000D JMPF R3 #0045 + 0xA4120600, // 000E IMPORT R4 K3 + 0x8C140904, // 000F GETMET R5 R4 K4 + 0x5C1C0600, // 0010 MOVE R7 R3 + 0x58200005, // 0011 LDCONST R8 K5 + 0x7C140600, // 0012 CALL R5 3 + 0x60180009, // 0013 GETGBL R6 G9 + 0x941C0B06, // 0014 GETIDX R7 R5 K6 + 0x7C180200, // 0015 CALL R6 1 + 0x601C0009, // 0016 GETGBL R7 G9 + 0x94200B07, // 0017 GETIDX R8 R5 K7 + 0x7C1C0200, // 0018 CALL R7 1 + 0x4C200000, // 0019 LDNIL R8 + 0x20200C08, // 001A NE R8 R6 R8 + 0x78220009, // 001B JMPF R8 #0026 + 0xB8221000, // 001C GETNGBL R8 K8 + 0x8C201109, // 001D GETMET R8 R8 K9 + 0x5C280C00, // 001E MOVE R10 R6 + 0x582C0006, // 001F LDCONST R11 K6 + 0x54320167, // 0020 LDINT R12 360 + 0x58340006, // 0021 LDCONST R13 K6 + 0x543A00FD, // 0022 LDINT R14 254 + 0x7C200C00, // 0023 CALL R8 6 + 0x5C181000, // 0024 MOVE R6 R8 + 0x70020000, // 0025 JMP #0027 + 0x8818010A, // 0026 GETMBR R6 R0 K10 + 0x4C200000, // 0027 LDNIL R8 + 0x20200E08, // 0028 NE R8 R7 R8 + 0x78220009, // 0029 JMPF R8 #0034 + 0xB8221000, // 002A GETNGBL R8 K8 + 0x8C201109, // 002B GETMET R8 R8 K9 + 0x5C280E00, // 002C MOVE R10 R7 + 0x582C0006, // 002D LDCONST R11 K6 + 0x54320063, // 002E LDINT R12 100 + 0x58340006, // 002F LDCONST R13 K6 + 0x543A00FD, // 0030 LDINT R14 254 + 0x7C200C00, // 0031 CALL R8 6 + 0x5C1C1000, // 0032 MOVE R7 R8 + 0x70020000, // 0033 JMP #0035 + 0x881C010B, // 0034 GETMBR R7 R0 K11 + 0x8820010A, // 0035 GETMBR R8 R0 K10 + 0x20200C08, // 0036 NE R8 R6 R8 + 0x78220004, // 0037 JMPF R8 #003D + 0x8C20010C, // 0038 GETMET R8 R0 K12 + 0x542A02FF, // 0039 LDINT R10 768 + 0x582C0006, // 003A LDCONST R11 K6 + 0x7C200600, // 003B CALL R8 3 + 0x90021406, // 003C SETMBR R0 K10 R6 + 0x8820010B, // 003D GETMBR R8 R0 K11 + 0x20200E08, // 003E NE R8 R7 R8 + 0x78220004, // 003F JMPF R8 #0045 + 0x8C20010C, // 0040 GETMET R8 R0 K12 + 0x542A02FF, // 0041 LDINT R10 768 + 0x582C0007, // 0042 LDCONST R11 K7 + 0x7C200600, // 0043 CALL R8 3 + 0x90021607, // 0044 SETMBR R0 K11 R7 + 0x80000000, // 0045 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: web_values +********************************************************************/ +be_local_closure(Matter_Plugin_Bridge_Light3_web_values, /* name */ + be_nested_proto( + 12, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 8]) { /* constants */ + /* K0 */ be_nested_str_weak(webserver), + /* K1 */ be_nested_str_weak(string), + /* K2 */ be_nested_str_weak(content_send), + /* K3 */ be_nested_str_weak(format), + /* K4 */ be_nested_str_weak(_X7C_X20Light_X20_X25s_X20_X25s_X20_X25s), + /* K5 */ be_nested_str_weak(web_value_onoff), + /* K6 */ be_nested_str_weak(web_value_dimmer), + /* K7 */ be_nested_str_weak(web_value_RGB), + }), + be_str_weak(web_values), + &be_const_str_solidified, + ( &(const binstruction[14]) { /* code */ + 0xA4060000, // 0000 IMPORT R1 K0 + 0xA40A0200, // 0001 IMPORT R2 K1 + 0x8C0C0302, // 0002 GETMET R3 R1 K2 + 0x8C140503, // 0003 GETMET R5 R2 K3 + 0x581C0004, // 0004 LDCONST R7 K4 + 0x8C200105, // 0005 GETMET R8 R0 K5 + 0x7C200200, // 0006 CALL R8 1 + 0x8C240106, // 0007 GETMET R9 R0 K6 + 0x7C240200, // 0008 CALL R9 1 + 0x8C280107, // 0009 GETMET R10 R0 K7 + 0x7C280200, // 000A CALL R10 1 + 0x7C140A00, // 000B CALL R5 5 + 0x7C0C0400, // 000C CALL R3 2 + 0x80000000, // 000D RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: web_value_RGB +********************************************************************/ +be_local_closure(Matter_Plugin_Bridge_Light3_web_value_RGB, /* name */ + be_nested_proto( + 13, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[17]) { /* constants */ + /* K0 */ be_nested_str_weak(string), + /* K1 */ be_nested_str_weak(shadow_hue), + /* K2 */ be_nested_str_weak(shadow_sat), + /* K3 */ be_nested_str_weak(light_state), + /* K4 */ be_const_int(3), + /* K5 */ be_nested_str_weak(set_bri), + /* K6 */ be_nested_str_weak(set_huesat), + /* K7 */ be_nested_str_weak(tasmota), + /* K8 */ be_nested_str_weak(scale_uint), + /* K9 */ be_const_int(0), + /* K10 */ be_nested_str_weak(format), + /* K11 */ be_nested_str_weak(_X23_X2502X_X2502X_X2502X), + /* K12 */ be_nested_str_weak(r), + /* K13 */ be_nested_str_weak(g), + /* K14 */ be_nested_str_weak(b), + /* K15 */ be_nested_str_weak(_X3Ci_X20class_X3D_X22bxm_X22_X20style_X3D_X22_X2D_X2Dcl_X3A_X25s_X22_X3E_X3C_X2Fi_X3E_X25s), + /* K16 */ be_nested_str_weak(), + }), + be_str_weak(web_value_RGB), + &be_const_str_solidified, + ( &(const binstruction[46]) { /* code */ + 0xA4060000, // 0000 IMPORT R1 K0 + 0x88080101, // 0001 GETMBR R2 R0 K1 + 0x4C0C0000, // 0002 LDNIL R3 + 0x20080403, // 0003 NE R2 R2 R3 + 0x780A0027, // 0004 JMPF R2 #002D + 0x88080102, // 0005 GETMBR R2 R0 K2 + 0x4C0C0000, // 0006 LDNIL R3 + 0x20080403, // 0007 NE R2 R2 R3 + 0x780A0023, // 0008 JMPF R2 #002D + 0xB80A0600, // 0009 GETNGBL R2 K3 + 0x580C0004, // 000A LDCONST R3 K4 + 0x7C080200, // 000B CALL R2 1 + 0x8C0C0505, // 000C GETMET R3 R2 K5 + 0x541600FE, // 000D LDINT R5 255 + 0x7C0C0400, // 000E CALL R3 2 + 0x8C0C0506, // 000F GETMET R3 R2 K6 + 0xB8160E00, // 0010 GETNGBL R5 K7 + 0x8C140B08, // 0011 GETMET R5 R5 K8 + 0x881C0101, // 0012 GETMBR R7 R0 K1 + 0x58200009, // 0013 LDCONST R8 K9 + 0x542600FD, // 0014 LDINT R9 254 + 0x58280009, // 0015 LDCONST R10 K9 + 0x542E0167, // 0016 LDINT R11 360 + 0x7C140C00, // 0017 CALL R5 6 + 0xB81A0E00, // 0018 GETNGBL R6 K7 + 0x8C180D08, // 0019 GETMET R6 R6 K8 + 0x88200102, // 001A GETMBR R8 R0 K2 + 0x58240009, // 001B LDCONST R9 K9 + 0x542A00FD, // 001C LDINT R10 254 + 0x582C0009, // 001D LDCONST R11 K9 + 0x543200FE, // 001E LDINT R12 255 + 0x7C180C00, // 001F CALL R6 6 + 0x7C0C0600, // 0020 CALL R3 3 + 0x8C0C030A, // 0021 GETMET R3 R1 K10 + 0x5814000B, // 0022 LDCONST R5 K11 + 0x8818050C, // 0023 GETMBR R6 R2 K12 + 0x881C050D, // 0024 GETMBR R7 R2 K13 + 0x8820050E, // 0025 GETMBR R8 R2 K14 + 0x7C0C0A00, // 0026 CALL R3 5 + 0x8C10030A, // 0027 GETMET R4 R1 K10 + 0x5818000F, // 0028 LDCONST R6 K15 + 0x5C1C0600, // 0029 MOVE R7 R3 + 0x5C200600, // 002A MOVE R8 R3 + 0x7C100800, // 002B CALL R4 4 + 0x80040800, // 002C RET 1 R4 + 0x80062000, // 002D RET 1 K16 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: invoke_request +********************************************************************/ +be_local_closure(Matter_Plugin_Bridge_Light3_invoke_request, /* name */ + be_nested_proto( + 12, /* nstack */ + 4, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[17]) { /* constants */ + /* K0 */ be_nested_str_weak(matter), + /* K1 */ be_nested_str_weak(TLV), + /* K2 */ be_nested_str_weak(cluster), + /* K3 */ be_nested_str_weak(command), + /* K4 */ be_nested_str_weak(update_shadow_lazy), + /* K5 */ be_const_int(0), + /* K6 */ be_nested_str_weak(findsubval), + /* K7 */ be_nested_str_weak(set_hue), + /* K8 */ be_nested_str_weak(log), + /* K9 */ be_nested_str_weak(hue_X3A), + /* K10 */ be_const_int(1), + /* K11 */ be_const_int(2), + /* K12 */ be_const_int(3), + /* K13 */ be_nested_str_weak(set_sat), + /* K14 */ be_nested_str_weak(sat_X3A), + /* K15 */ be_nested_str_weak(_X20sat_X3A), + /* K16 */ be_nested_str_weak(invoke_request), + }), + be_str_weak(invoke_request), + &be_const_str_solidified, + ( &(const binstruction[107]) { /* code */ + 0xB8120000, // 0000 GETNGBL R4 K0 + 0x88100901, // 0001 GETMBR R4 R4 K1 + 0x88140702, // 0002 GETMBR R5 R3 K2 + 0x88180703, // 0003 GETMBR R6 R3 K3 + 0x541E02FF, // 0004 LDINT R7 768 + 0x1C1C0A07, // 0005 EQ R7 R5 R7 + 0x781E0059, // 0006 JMPF R7 #0061 + 0x8C1C0104, // 0007 GETMET R7 R0 K4 + 0x7C1C0200, // 0008 CALL R7 1 + 0x1C1C0D05, // 0009 EQ R7 R6 K5 + 0x781E000D, // 000A JMPF R7 #0019 + 0x8C1C0506, // 000B GETMET R7 R2 K6 + 0x58240005, // 000C LDCONST R9 K5 + 0x7C1C0400, // 000D CALL R7 2 + 0x8C200107, // 000E GETMET R8 R0 K7 + 0x5C280E00, // 000F MOVE R10 R7 + 0x7C200400, // 0010 CALL R8 2 + 0x60200008, // 0011 GETGBL R8 G8 + 0x5C240E00, // 0012 MOVE R9 R7 + 0x7C200200, // 0013 CALL R8 1 + 0x00221208, // 0014 ADD R8 K9 R8 + 0x900E1008, // 0015 SETMBR R3 K8 R8 + 0x50200200, // 0016 LDBOOL R8 1 0 + 0x80041000, // 0017 RET 1 R8 + 0x70020046, // 0018 JMP #0060 + 0x1C1C0D0A, // 0019 EQ R7 R6 K10 + 0x781E0002, // 001A JMPF R7 #001E + 0x501C0200, // 001B LDBOOL R7 1 0 + 0x80040E00, // 001C RET 1 R7 + 0x70020041, // 001D JMP #0060 + 0x1C1C0D0B, // 001E EQ R7 R6 K11 + 0x781E0002, // 001F JMPF R7 #0023 + 0x501C0200, // 0020 LDBOOL R7 1 0 + 0x80040E00, // 0021 RET 1 R7 + 0x7002003C, // 0022 JMP #0060 + 0x1C1C0D0C, // 0023 EQ R7 R6 K12 + 0x781E000D, // 0024 JMPF R7 #0033 + 0x8C1C0506, // 0025 GETMET R7 R2 K6 + 0x58240005, // 0026 LDCONST R9 K5 + 0x7C1C0400, // 0027 CALL R7 2 + 0x8C20010D, // 0028 GETMET R8 R0 K13 + 0x5C280E00, // 0029 MOVE R10 R7 + 0x7C200400, // 002A CALL R8 2 + 0x60200008, // 002B GETGBL R8 G8 + 0x5C240E00, // 002C MOVE R9 R7 + 0x7C200200, // 002D CALL R8 1 + 0x00221C08, // 002E ADD R8 K14 R8 + 0x900E1008, // 002F SETMBR R3 K8 R8 + 0x50200200, // 0030 LDBOOL R8 1 0 + 0x80041000, // 0031 RET 1 R8 + 0x7002002C, // 0032 JMP #0060 + 0x541E0003, // 0033 LDINT R7 4 + 0x1C1C0C07, // 0034 EQ R7 R6 R7 + 0x781E0002, // 0035 JMPF R7 #0039 + 0x501C0200, // 0036 LDBOOL R7 1 0 + 0x80040E00, // 0037 RET 1 R7 + 0x70020026, // 0038 JMP #0060 + 0x541E0004, // 0039 LDINT R7 5 + 0x1C1C0C07, // 003A EQ R7 R6 R7 + 0x781E0002, // 003B JMPF R7 #003F + 0x501C0200, // 003C LDBOOL R7 1 0 + 0x80040E00, // 003D RET 1 R7 + 0x70020020, // 003E JMP #0060 + 0x541E0005, // 003F LDINT R7 6 + 0x1C1C0C07, // 0040 EQ R7 R6 R7 + 0x781E0018, // 0041 JMPF R7 #005B + 0x8C1C0506, // 0042 GETMET R7 R2 K6 + 0x58240005, // 0043 LDCONST R9 K5 + 0x7C1C0400, // 0044 CALL R7 2 + 0x8C200506, // 0045 GETMET R8 R2 K6 + 0x5828000A, // 0046 LDCONST R10 K10 + 0x7C200400, // 0047 CALL R8 2 + 0x8C240107, // 0048 GETMET R9 R0 K7 + 0x5C2C0E00, // 0049 MOVE R11 R7 + 0x7C240400, // 004A CALL R9 2 + 0x8C24010D, // 004B GETMET R9 R0 K13 + 0x5C2C1000, // 004C MOVE R11 R8 + 0x7C240400, // 004D CALL R9 2 + 0x60240008, // 004E GETGBL R9 G8 + 0x5C280E00, // 004F MOVE R10 R7 + 0x7C240200, // 0050 CALL R9 1 + 0x00261209, // 0051 ADD R9 K9 R9 + 0x0024130F, // 0052 ADD R9 R9 K15 + 0x60280008, // 0053 GETGBL R10 G8 + 0x5C2C1000, // 0054 MOVE R11 R8 + 0x7C280200, // 0055 CALL R10 1 + 0x0024120A, // 0056 ADD R9 R9 R10 + 0x900E1009, // 0057 SETMBR R3 K8 R9 + 0x50240200, // 0058 LDBOOL R9 1 0 + 0x80041200, // 0059 RET 1 R9 + 0x70020004, // 005A JMP #0060 + 0x541E0046, // 005B LDINT R7 71 + 0x1C1C0C07, // 005C EQ R7 R6 R7 + 0x781E0001, // 005D JMPF R7 #0060 + 0x501C0200, // 005E LDBOOL R7 1 0 + 0x80040E00, // 005F RET 1 R7 + 0x70020008, // 0060 JMP #006A + 0x601C0003, // 0061 GETGBL R7 G3 + 0x5C200000, // 0062 MOVE R8 R0 + 0x7C1C0200, // 0063 CALL R7 1 + 0x8C1C0F10, // 0064 GETMET R7 R7 K16 + 0x5C240200, // 0065 MOVE R9 R1 + 0x5C280400, // 0066 MOVE R10 R2 + 0x5C2C0600, // 0067 MOVE R11 R3 + 0x7C1C0800, // 0068 CALL R7 4 + 0x80040E00, // 0069 RET 1 R7 + 0x80000000, // 006A RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: read_attribute +********************************************************************/ +be_local_closure(Matter_Plugin_Bridge_Light3_read_attribute, /* name */ + be_nested_proto( + 11, /* nstack */ + 3, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[15]) { /* constants */ + /* K0 */ be_nested_str_weak(string), + /* K1 */ be_nested_str_weak(matter), + /* K2 */ be_nested_str_weak(TLV), + /* K3 */ be_nested_str_weak(cluster), + /* K4 */ be_nested_str_weak(attribute), + /* K5 */ be_nested_str_weak(update_shadow_lazy), + /* K6 */ be_const_int(0), + /* K7 */ be_nested_str_weak(shadow_hue), + /* K8 */ be_nested_str_weak(create_TLV), + /* K9 */ be_nested_str_weak(U1), + /* K10 */ be_nested_str_weak(NULL), + /* K11 */ be_const_int(1), + /* K12 */ be_nested_str_weak(shadow_sat), + /* K13 */ be_nested_str_weak(U4), + /* K14 */ be_nested_str_weak(read_attribute), + }), + be_str_weak(read_attribute), + &be_const_str_solidified, + ( &(const binstruction[127]) { /* code */ + 0xA40E0000, // 0000 IMPORT R3 K0 + 0xB8120200, // 0001 GETNGBL R4 K1 + 0x88100902, // 0002 GETMBR R4 R4 K2 + 0x88140503, // 0003 GETMBR R5 R2 K3 + 0x88180504, // 0004 GETMBR R6 R2 K4 + 0x541E02FF, // 0005 LDINT R7 768 + 0x1C1C0A07, // 0006 EQ R7 R5 R7 + 0x781E006D, // 0007 JMPF R7 #0076 + 0x8C1C0105, // 0008 GETMET R7 R0 K5 + 0x7C1C0200, // 0009 CALL R7 1 + 0x1C1C0D06, // 000A EQ R7 R6 K6 + 0x781E000F, // 000B JMPF R7 #001C + 0x881C0107, // 000C GETMBR R7 R0 K7 + 0x4C200000, // 000D LDNIL R8 + 0x201C0E08, // 000E NE R7 R7 R8 + 0x781E0005, // 000F JMPF R7 #0016 + 0x8C1C0908, // 0010 GETMET R7 R4 K8 + 0x88240909, // 0011 GETMBR R9 R4 K9 + 0x88280107, // 0012 GETMBR R10 R0 K7 + 0x7C1C0600, // 0013 CALL R7 3 + 0x80040E00, // 0014 RET 1 R7 + 0x70020004, // 0015 JMP #001B + 0x8C1C0908, // 0016 GETMET R7 R4 K8 + 0x8824090A, // 0017 GETMBR R9 R4 K10 + 0x4C280000, // 0018 LDNIL R10 + 0x7C1C0600, // 0019 CALL R7 3 + 0x80040E00, // 001A RET 1 R7 + 0x70020058, // 001B JMP #0075 + 0x1C1C0D0B, // 001C EQ R7 R6 K11 + 0x781E000F, // 001D JMPF R7 #002E + 0x881C010C, // 001E GETMBR R7 R0 K12 + 0x4C200000, // 001F LDNIL R8 + 0x201C0E08, // 0020 NE R7 R7 R8 + 0x781E0005, // 0021 JMPF R7 #0028 + 0x8C1C0908, // 0022 GETMET R7 R4 K8 + 0x88240909, // 0023 GETMBR R9 R4 K9 + 0x8828010C, // 0024 GETMBR R10 R0 K12 + 0x7C1C0600, // 0025 CALL R7 3 + 0x80040E00, // 0026 RET 1 R7 + 0x70020004, // 0027 JMP #002D + 0x8C1C0908, // 0028 GETMET R7 R4 K8 + 0x8824090A, // 0029 GETMBR R9 R4 K10 + 0x4C280000, // 002A LDNIL R10 + 0x7C1C0600, // 002B CALL R7 3 + 0x80040E00, // 002C RET 1 R7 + 0x70020046, // 002D JMP #0075 + 0x541E0006, // 002E LDINT R7 7 + 0x1C1C0C07, // 002F EQ R7 R6 R7 + 0x781E0005, // 0030 JMPF R7 #0037 + 0x8C1C0908, // 0031 GETMET R7 R4 K8 + 0x88240909, // 0032 GETMBR R9 R4 K9 + 0x58280006, // 0033 LDCONST R10 K6 + 0x7C1C0600, // 0034 CALL R7 3 + 0x80040E00, // 0035 RET 1 R7 + 0x7002003D, // 0036 JMP #0075 + 0x541E0007, // 0037 LDINT R7 8 + 0x1C1C0C07, // 0038 EQ R7 R6 R7 + 0x781E0005, // 0039 JMPF R7 #0040 + 0x8C1C0908, // 003A GETMET R7 R4 K8 + 0x88240909, // 003B GETMBR R9 R4 K9 + 0x58280006, // 003C LDCONST R10 K6 + 0x7C1C0600, // 003D CALL R7 3 + 0x80040E00, // 003E RET 1 R7 + 0x70020034, // 003F JMP #0075 + 0x541E000E, // 0040 LDINT R7 15 + 0x1C1C0C07, // 0041 EQ R7 R6 R7 + 0x781E0005, // 0042 JMPF R7 #0049 + 0x8C1C0908, // 0043 GETMET R7 R4 K8 + 0x88240909, // 0044 GETMBR R9 R4 K9 + 0x58280006, // 0045 LDCONST R10 K6 + 0x7C1C0600, // 0046 CALL R7 3 + 0x80040E00, // 0047 RET 1 R7 + 0x7002002B, // 0048 JMP #0075 + 0x541E4000, // 0049 LDINT R7 16385 + 0x1C1C0C07, // 004A EQ R7 R6 R7 + 0x781E0005, // 004B JMPF R7 #0052 + 0x8C1C0908, // 004C GETMET R7 R4 K8 + 0x88240909, // 004D GETMBR R9 R4 K9 + 0x58280006, // 004E LDCONST R10 K6 + 0x7C1C0600, // 004F CALL R7 3 + 0x80040E00, // 0050 RET 1 R7 + 0x70020022, // 0051 JMP #0075 + 0x541E4009, // 0052 LDINT R7 16394 + 0x1C1C0C07, // 0053 EQ R7 R6 R7 + 0x781E0005, // 0054 JMPF R7 #005B + 0x8C1C0908, // 0055 GETMET R7 R4 K8 + 0x88240909, // 0056 GETMBR R9 R4 K9 + 0x58280006, // 0057 LDCONST R10 K6 + 0x7C1C0600, // 0058 CALL R7 3 + 0x80040E00, // 0059 RET 1 R7 + 0x70020019, // 005A JMP #0075 + 0x541E000F, // 005B LDINT R7 16 + 0x1C1C0C07, // 005C EQ R7 R6 R7 + 0x781E0005, // 005D JMPF R7 #0064 + 0x8C1C0908, // 005E GETMET R7 R4 K8 + 0x88240909, // 005F GETMBR R9 R4 K9 + 0x58280006, // 0060 LDCONST R10 K6 + 0x7C1C0600, // 0061 CALL R7 3 + 0x80040E00, // 0062 RET 1 R7 + 0x70020010, // 0063 JMP #0075 + 0x541EFFFB, // 0064 LDINT R7 65532 + 0x1C1C0C07, // 0065 EQ R7 R6 R7 + 0x781E0005, // 0066 JMPF R7 #006D + 0x8C1C0908, // 0067 GETMET R7 R4 K8 + 0x8824090D, // 0068 GETMBR R9 R4 K13 + 0x5828000B, // 0069 LDCONST R10 K11 + 0x7C1C0600, // 006A CALL R7 3 + 0x80040E00, // 006B RET 1 R7 + 0x70020007, // 006C JMP #0075 + 0x541EFFFC, // 006D LDINT R7 65533 + 0x1C1C0C07, // 006E EQ R7 R6 R7 + 0x781E0004, // 006F JMPF R7 #0075 + 0x8C1C0908, // 0070 GETMET R7 R4 K8 + 0x8824090D, // 0071 GETMBR R9 R4 K13 + 0x542A0004, // 0072 LDINT R10 5 + 0x7C1C0600, // 0073 CALL R7 3 + 0x80040E00, // 0074 RET 1 R7 + 0x70020007, // 0075 JMP #007E + 0x601C0003, // 0076 GETGBL R7 G3 + 0x5C200000, // 0077 MOVE R8 R0 + 0x7C1C0200, // 0078 CALL R7 1 + 0x8C1C0F0E, // 0079 GETMET R7 R7 K14 + 0x5C240200, // 007A MOVE R9 R1 + 0x5C280400, // 007B MOVE R10 R2 + 0x7C1C0600, // 007C CALL R7 3 + 0x80040E00, // 007D RET 1 R7 + 0x80000000, // 007E RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: set_hue +********************************************************************/ +be_local_closure(Matter_Plugin_Bridge_Light3_set_hue, /* name */ + be_nested_proto( + 9, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 6]) { /* constants */ + /* K0 */ be_nested_str_weak(tasmota), + /* K1 */ be_nested_str_weak(scale_uint), + /* K2 */ be_const_int(0), + /* K3 */ be_nested_str_weak(call_remote_sync), + /* K4 */ be_nested_str_weak(HSBColor1), + /* K5 */ be_nested_str_weak(parse_update), + }), + be_str_weak(set_hue), + &be_const_str_solidified, + ( &(const binstruction[20]) { /* code */ + 0xB80A0000, // 0000 GETNGBL R2 K0 + 0x8C080501, // 0001 GETMET R2 R2 K1 + 0x5C100200, // 0002 MOVE R4 R1 + 0x58140002, // 0003 LDCONST R5 K2 + 0x541A00FD, // 0004 LDINT R6 254 + 0x581C0002, // 0005 LDCONST R7 K2 + 0x54220167, // 0006 LDINT R8 360 + 0x7C080C00, // 0007 CALL R2 6 + 0x8C0C0103, // 0008 GETMET R3 R0 K3 + 0x58140004, // 0009 LDCONST R5 K4 + 0x5C180400, // 000A MOVE R6 R2 + 0x7C0C0600, // 000B CALL R3 3 + 0x4C100000, // 000C LDNIL R4 + 0x20100604, // 000D NE R4 R3 R4 + 0x78120003, // 000E JMPF R4 #0013 + 0x8C100105, // 000F GETMET R4 R0 K5 + 0x5C180600, // 0010 MOVE R6 R3 + 0x541E000A, // 0011 LDINT R7 11 + 0x7C100600, // 0012 CALL R4 3 + 0x80000000, // 0013 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: init +********************************************************************/ +be_local_closure(Matter_Plugin_Bridge_Light3_init, /* name */ + be_nested_proto( + 9, /* nstack */ + 4, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 1]) { /* constants */ + /* K0 */ be_nested_str_weak(init), + }), + be_str_weak(init), + &be_const_str_solidified, + ( &(const binstruction[ 9]) { /* code */ + 0x60100003, // 0000 GETGBL R4 G3 + 0x5C140000, // 0001 MOVE R5 R0 + 0x7C100200, // 0002 CALL R4 1 + 0x8C100900, // 0003 GETMET R4 R4 K0 + 0x5C180200, // 0004 MOVE R6 R1 + 0x5C1C0400, // 0005 MOVE R7 R2 + 0x5C200600, // 0006 MOVE R8 R3 + 0x7C100800, // 0007 CALL R4 4 + 0x80000000, // 0008 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified class: Matter_Plugin_Bridge_Light3 +********************************************************************/ +extern const bclass be_class_Matter_Plugin_Bridge_Light1; +be_local_class(Matter_Plugin_Bridge_Light3, + 2, + &be_class_Matter_Plugin_Bridge_Light1, + be_nested_map(14, + ( (struct bmapnode*) &(const bmapnode[]) { + { be_const_key_weak(set_sat, 12), be_const_closure(Matter_Plugin_Bridge_Light3_set_sat_closure) }, + { be_const_key_weak(init, -1), be_const_closure(Matter_Plugin_Bridge_Light3_init_closure) }, + { be_const_key_weak(parse_update, -1), be_const_closure(Matter_Plugin_Bridge_Light3_parse_update_closure) }, + { be_const_key_weak(TYPE, -1), be_nested_str_weak(http_light3) }, + { be_const_key_weak(web_values, -1), be_const_closure(Matter_Plugin_Bridge_Light3_web_values_closure) }, + { be_const_key_weak(web_value_RGB, 1), be_const_closure(Matter_Plugin_Bridge_Light3_web_value_RGB_closure) }, + { be_const_key_weak(shadow_sat, 9), be_const_var(1) }, + { be_const_key_weak(invoke_request, -1), be_const_closure(Matter_Plugin_Bridge_Light3_invoke_request_closure) }, + { be_const_key_weak(NAME, -1), be_nested_str_weak(_X26_X23x1F517_X3B_X20Light_X203_X20RGB) }, + { be_const_key_weak(TYPES, 11), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { + be_const_map( * be_nested_map(2, + ( (struct bmapnode*) &(const bmapnode[]) { + { be_const_key_int(269, -1), be_const_int(2) }, + { be_const_key_int(19, 0), be_const_int(1) }, + })) ) } )) }, + { be_const_key_weak(shadow_hue, 6), be_const_var(0) }, + { be_const_key_weak(set_hue, -1), be_const_closure(Matter_Plugin_Bridge_Light3_set_hue_closure) }, + { be_const_key_weak(read_attribute, 13), be_const_closure(Matter_Plugin_Bridge_Light3_read_attribute_closure) }, + { be_const_key_weak(CLUSTERS, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { + be_const_map( * be_nested_map(1, + ( (struct bmapnode*) &(const bmapnode[]) { + { be_const_key_int(768, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_list, { + be_const_list( * be_nested_list(9, + ( (struct bvalue*) &(const bvalue[]) { + be_const_int(0), + be_const_int(1), + be_const_int(7), + be_const_int(8), + be_const_int(15), + be_const_int(16385), + be_const_int(16394), + be_const_int(65532), + be_const_int(65533), + })) ) } )) }, + })) ) } )) }, + })), + be_str_weak(Matter_Plugin_Bridge_Light3) +); +/*******************************************************************/ + +void be_load_Matter_Plugin_Bridge_Light3_class(bvm *vm) { + be_pushntvclass(vm, &be_class_Matter_Plugin_Bridge_Light3); + be_setglobal(vm, "Matter_Plugin_Bridge_Light3"); + be_pop(vm, 1); +} +/********************************************************************/ +/* End of solidification */ diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_OnOff.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_OnOff.h index 6a210e0ee..d80c3e6fa 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_OnOff.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_OnOff.h @@ -7,12 +7,12 @@ extern const bclass be_class_Matter_Plugin_Bridge_OnOff; /******************************************************************** -** Solidified function: init +** Solidified function: web_values ********************************************************************/ -be_local_closure(Matter_Plugin_Bridge_OnOff_init, /* name */ +be_local_closure(Matter_Plugin_Bridge_OnOff_web_values, /* name */ be_nested_proto( - 10, /* nstack */ - 4, /* argc */ + 11, /* nstack */ + 1, /* argc */ 2, /* varg */ 0, /* has upvals */ NULL, /* no upvals */ @@ -20,385 +20,28 @@ be_local_closure(Matter_Plugin_Bridge_OnOff_init, /* name */ NULL, /* no sub protos */ 1, /* has constants */ ( &(const bvalue[ 7]) { /* constants */ - /* K0 */ be_nested_str_weak(string), - /* K1 */ be_nested_str_weak(init), - /* K2 */ be_nested_str_weak(shadow_onoff), - /* K3 */ be_nested_str_weak(tasmota_relay_index), - /* K4 */ be_nested_str_weak(find), - /* K5 */ be_nested_str_weak(ARG), - /* K6 */ be_const_int(0), + /* K0 */ be_nested_str_weak(webserver), + /* K1 */ be_nested_str_weak(string), + /* K2 */ be_nested_str_weak(content_send), + /* K3 */ be_nested_str_weak(format), + /* K4 */ be_nested_str_weak(_X7C_X20Relay_X20_X25i_X20_X25s), + /* K5 */ be_nested_str_weak(tasmota_relay_index), + /* K6 */ be_nested_str_weak(web_value_onoff), }), - be_str_weak(init), + be_str_weak(web_values), &be_const_str_solidified, - ( &(const binstruction[21]) { /* code */ - 0xA4120000, // 0000 IMPORT R4 K0 - 0x60140003, // 0001 GETGBL R5 G3 - 0x5C180000, // 0002 MOVE R6 R0 - 0x7C140200, // 0003 CALL R5 1 - 0x8C140B01, // 0004 GETMET R5 R5 K1 - 0x5C1C0200, // 0005 MOVE R7 R1 - 0x5C200400, // 0006 MOVE R8 R2 - 0x5C240600, // 0007 MOVE R9 R3 + ( &(const binstruction[11]) { /* code */ + 0xA4060000, // 0000 IMPORT R1 K0 + 0xA40A0200, // 0001 IMPORT R2 K1 + 0x8C0C0302, // 0002 GETMET R3 R1 K2 + 0x8C140503, // 0003 GETMET R5 R2 K3 + 0x581C0004, // 0004 LDCONST R7 K4 + 0x88200105, // 0005 GETMBR R8 R0 K5 + 0x8C240106, // 0006 GETMET R9 R0 K6 + 0x7C240200, // 0007 CALL R9 1 0x7C140800, // 0008 CALL R5 4 - 0x50140000, // 0009 LDBOOL R5 0 0 - 0x90020405, // 000A SETMBR R0 K2 R5 - 0x8C140704, // 000B GETMET R5 R3 K4 - 0x881C0105, // 000C GETMBR R7 R0 K5 - 0x7C140400, // 000D CALL R5 2 - 0x90020605, // 000E SETMBR R0 K3 R5 - 0x88140103, // 000F GETMBR R5 R0 K3 - 0x4C180000, // 0010 LDNIL R6 - 0x1C140A06, // 0011 EQ R5 R5 R6 - 0x78160000, // 0012 JMPF R5 #0014 - 0x90020706, // 0013 SETMBR R0 K3 K6 - 0x80000000, // 0014 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: parse_update -********************************************************************/ -be_local_closure(Matter_Plugin_Bridge_OnOff_parse_update, /* name */ - be_nested_proto( - 8, /* nstack */ - 3, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 6]) { /* constants */ - /* K0 */ be_nested_str_weak(find), - /* K1 */ be_nested_str_weak(POWER), - /* K2 */ be_nested_str_weak(ON), - /* K3 */ be_nested_str_weak(shadow_onoff), - /* K4 */ be_nested_str_weak(attribute_updated), - /* K5 */ be_const_int(0), - }), - be_str_weak(parse_update), - &be_const_str_solidified, - ( &(const binstruction[23]) { /* code */ - 0x540E000A, // 0000 LDINT R3 11 - 0x1C0C0403, // 0001 EQ R3 R2 R3 - 0x780E0012, // 0002 JMPF R3 #0016 - 0x8C0C0300, // 0003 GETMET R3 R1 K0 - 0x58140001, // 0004 LDCONST R5 K1 - 0x7C0C0400, // 0005 CALL R3 2 - 0x1C0C0702, // 0006 EQ R3 R3 K2 - 0x88100103, // 0007 GETMBR R4 R0 K3 - 0x4C140000, // 0008 LDNIL R5 - 0x20100805, // 0009 NE R4 R4 R5 - 0x78120009, // 000A JMPF R4 #0015 - 0x88100103, // 000B GETMBR R4 R0 K3 - 0x60140017, // 000C GETGBL R5 G23 - 0x5C180600, // 000D MOVE R6 R3 - 0x7C140200, // 000E CALL R5 1 - 0x20100805, // 000F NE R4 R4 R5 - 0x78120003, // 0010 JMPF R4 #0015 - 0x8C100104, // 0011 GETMET R4 R0 K4 - 0x541A0005, // 0012 LDINT R6 6 - 0x581C0005, // 0013 LDCONST R7 K5 - 0x7C100600, // 0014 CALL R4 3 - 0x90020603, // 0015 SETMBR R0 K3 R3 - 0x80000000, // 0016 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: invoke_request -********************************************************************/ -be_local_closure(Matter_Plugin_Bridge_OnOff_invoke_request, /* name */ - be_nested_proto( - 10, /* nstack */ - 4, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[11]) { /* constants */ - /* K0 */ be_nested_str_weak(matter), - /* K1 */ be_nested_str_weak(TLV), - /* K2 */ be_nested_str_weak(cluster), - /* K3 */ be_nested_str_weak(command), - /* K4 */ be_nested_str_weak(update_shadow_lazy), - /* K5 */ be_const_int(0), - /* K6 */ be_nested_str_weak(set_onoff), - /* K7 */ be_nested_str_weak(update_shadow), - /* K8 */ be_const_int(1), - /* K9 */ be_const_int(2), - /* K10 */ be_nested_str_weak(shadow_onoff), - }), - be_str_weak(invoke_request), - &be_const_str_solidified, - ( &(const binstruction[42]) { /* code */ - 0xB8120000, // 0000 GETNGBL R4 K0 - 0x88100901, // 0001 GETMBR R4 R4 K1 - 0x88140702, // 0002 GETMBR R5 R3 K2 - 0x88180703, // 0003 GETMBR R6 R3 K3 - 0x541E0005, // 0004 LDINT R7 6 - 0x1C1C0A07, // 0005 EQ R7 R5 R7 - 0x781E0021, // 0006 JMPF R7 #0029 - 0x8C1C0104, // 0007 GETMET R7 R0 K4 - 0x7C1C0200, // 0008 CALL R7 1 - 0x1C1C0D05, // 0009 EQ R7 R6 K5 - 0x781E0007, // 000A JMPF R7 #0013 - 0x8C1C0106, // 000B GETMET R7 R0 K6 - 0x50240000, // 000C LDBOOL R9 0 0 - 0x7C1C0400, // 000D CALL R7 2 - 0x8C1C0107, // 000E GETMET R7 R0 K7 - 0x7C1C0200, // 000F CALL R7 1 - 0x501C0200, // 0010 LDBOOL R7 1 0 - 0x80040E00, // 0011 RET 1 R7 - 0x70020015, // 0012 JMP #0029 - 0x1C1C0D08, // 0013 EQ R7 R6 K8 - 0x781E0007, // 0014 JMPF R7 #001D - 0x8C1C0106, // 0015 GETMET R7 R0 K6 - 0x50240200, // 0016 LDBOOL R9 1 0 - 0x7C1C0400, // 0017 CALL R7 2 - 0x8C1C0107, // 0018 GETMET R7 R0 K7 - 0x7C1C0200, // 0019 CALL R7 1 - 0x501C0200, // 001A LDBOOL R7 1 0 - 0x80040E00, // 001B RET 1 R7 - 0x7002000B, // 001C JMP #0029 - 0x1C1C0D09, // 001D EQ R7 R6 K9 - 0x781E0009, // 001E JMPF R7 #0029 - 0x8C1C0106, // 001F GETMET R7 R0 K6 - 0x8824010A, // 0020 GETMBR R9 R0 K10 - 0x78260000, // 0021 JMPF R9 #0023 - 0x50240001, // 0022 LDBOOL R9 0 1 - 0x50240200, // 0023 LDBOOL R9 1 0 - 0x7C1C0400, // 0024 CALL R7 2 - 0x8C1C0107, // 0025 GETMET R7 R0 K7 - 0x7C1C0200, // 0026 CALL R7 1 - 0x501C0200, // 0027 LDBOOL R7 1 0 - 0x80040E00, // 0028 RET 1 R7 - 0x80000000, // 0029 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: set_onoff -********************************************************************/ -be_local_closure(Matter_Plugin_Bridge_OnOff_set_onoff, /* name */ - be_nested_proto( - 6, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 5]) { /* constants */ - /* K0 */ be_nested_str_weak(call_remote_sync), - /* K1 */ be_nested_str_weak(Power), - /* K2 */ be_nested_str_weak(1), - /* K3 */ be_nested_str_weak(0), - /* K4 */ be_nested_str_weak(update_shadow), - }), - be_str_weak(set_onoff), - &be_const_str_solidified, - ( &(const binstruction[10]) { /* code */ - 0x8C080100, // 0000 GETMET R2 R0 K0 - 0x58100001, // 0001 LDCONST R4 K1 - 0x78060001, // 0002 JMPF R1 #0005 - 0x58140002, // 0003 LDCONST R5 K2 - 0x70020000, // 0004 JMP #0006 - 0x58140003, // 0005 LDCONST R5 K3 - 0x7C080600, // 0006 CALL R2 3 - 0x8C080104, // 0007 GETMET R2 R0 K4 - 0x7C080200, // 0008 CALL R2 1 - 0x80000000, // 0009 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: -********************************************************************/ -be_local_closure(Matter_Plugin_Bridge_OnOff__X3Clambda_X3E, /* name */ - be_nested_proto( - 3, /* nstack */ - 1, /* argc */ - 0, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 0, /* has constants */ - NULL, /* no const */ - be_str_weak(_X3Clambda_X3E), - &be_const_str_solidified, - ( &(const binstruction[ 4]) { /* code */ - 0x60040009, // 0000 GETGBL R1 G9 - 0x5C080000, // 0001 MOVE R2 R0 - 0x7C040200, // 0002 CALL R1 1 - 0x80040200, // 0003 RET 1 R1 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: probe_shadow_async -********************************************************************/ -be_local_closure(Matter_Plugin_Bridge_OnOff_probe_shadow_async, /* name */ - be_nested_proto( - 5, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 3]) { /* constants */ - /* K0 */ be_nested_str_weak(call_remote_async), - /* K1 */ be_nested_str_weak(Status), - /* K2 */ be_nested_str_weak(11), - }), - be_str_weak(probe_shadow_async), - &be_const_str_solidified, - ( &(const binstruction[ 5]) { /* code */ - 0x8C040100, // 0000 GETMET R1 R0 K0 - 0x580C0001, // 0001 LDCONST R3 K1 - 0x58100002, // 0002 LDCONST R4 K2 - 0x7C040600, // 0003 CALL R1 3 - 0x80000000, // 0004 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: read_attribute -********************************************************************/ -be_local_closure(Matter_Plugin_Bridge_OnOff_read_attribute, /* name */ - be_nested_proto( - 11, /* nstack */ - 3, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[12]) { /* constants */ - /* K0 */ be_nested_str_weak(string), - /* K1 */ be_nested_str_weak(matter), - /* K2 */ be_nested_str_weak(TLV), - /* K3 */ be_nested_str_weak(cluster), - /* K4 */ be_nested_str_weak(attribute), - /* K5 */ be_nested_str_weak(update_shadow_lazy), - /* K6 */ be_const_int(0), - /* K7 */ be_nested_str_weak(create_TLV), - /* K8 */ be_nested_str_weak(BOOL), - /* K9 */ be_nested_str_weak(shadow_onoff), - /* K10 */ be_nested_str_weak(U4), - /* K11 */ be_nested_str_weak(read_attribute), - }), - be_str_weak(read_attribute), - &be_const_str_solidified, - ( &(const binstruction[45]) { /* code */ - 0xA40E0000, // 0000 IMPORT R3 K0 - 0xB8120200, // 0001 GETNGBL R4 K1 - 0x88100902, // 0002 GETMBR R4 R4 K2 - 0x88140503, // 0003 GETMBR R5 R2 K3 - 0x88180504, // 0004 GETMBR R6 R2 K4 - 0x541E0005, // 0005 LDINT R7 6 - 0x1C1C0A07, // 0006 EQ R7 R5 R7 - 0x781E001B, // 0007 JMPF R7 #0024 - 0x8C1C0105, // 0008 GETMET R7 R0 K5 - 0x7C1C0200, // 0009 CALL R7 1 - 0x1C1C0D06, // 000A EQ R7 R6 K6 - 0x781E0005, // 000B JMPF R7 #0012 - 0x8C1C0907, // 000C GETMET R7 R4 K7 - 0x88240908, // 000D GETMBR R9 R4 K8 - 0x88280109, // 000E GETMBR R10 R0 K9 - 0x7C1C0600, // 000F CALL R7 3 - 0x80040E00, // 0010 RET 1 R7 - 0x70020010, // 0011 JMP #0023 - 0x541EFFFB, // 0012 LDINT R7 65532 - 0x1C1C0C07, // 0013 EQ R7 R6 R7 - 0x781E0005, // 0014 JMPF R7 #001B - 0x8C1C0907, // 0015 GETMET R7 R4 K7 - 0x8824090A, // 0016 GETMBR R9 R4 K10 - 0x58280006, // 0017 LDCONST R10 K6 - 0x7C1C0600, // 0018 CALL R7 3 - 0x80040E00, // 0019 RET 1 R7 - 0x70020007, // 001A JMP #0023 - 0x541EFFFC, // 001B LDINT R7 65533 - 0x1C1C0C07, // 001C EQ R7 R6 R7 - 0x781E0004, // 001D JMPF R7 #0023 - 0x8C1C0907, // 001E GETMET R7 R4 K7 - 0x8824090A, // 001F GETMBR R9 R4 K10 - 0x542A0003, // 0020 LDINT R10 4 - 0x7C1C0600, // 0021 CALL R7 3 - 0x80040E00, // 0022 RET 1 R7 - 0x70020007, // 0023 JMP #002C - 0x601C0003, // 0024 GETGBL R7 G3 - 0x5C200000, // 0025 MOVE R8 R0 - 0x7C1C0200, // 0026 CALL R7 1 - 0x8C1C0F0B, // 0027 GETMET R7 R7 K11 - 0x5C240200, // 0028 MOVE R9 R1 - 0x5C280400, // 0029 MOVE R10 R2 - 0x7C1C0600, // 002A CALL R7 3 - 0x80040E00, // 002B RET 1 R7 - 0x80000000, // 002C RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: update_shadow -********************************************************************/ -be_local_closure(Matter_Plugin_Bridge_OnOff_update_shadow, /* name */ - be_nested_proto( - 5, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 4]) { /* constants */ - /* K0 */ be_nested_str_weak(call_remote_sync), - /* K1 */ be_nested_str_weak(Status), - /* K2 */ be_nested_str_weak(11), - /* K3 */ be_nested_str_weak(update_shadow), - }), - be_str_weak(update_shadow), - &be_const_str_solidified, - ( &(const binstruction[10]) { /* code */ - 0x8C040100, // 0000 GETMET R1 R0 K0 - 0x580C0001, // 0001 LDCONST R3 K1 - 0x58100002, // 0002 LDCONST R4 K2 - 0x7C040600, // 0003 CALL R1 3 - 0x60080003, // 0004 GETGBL R2 G3 - 0x5C0C0000, // 0005 MOVE R3 R0 - 0x7C080200, // 0006 CALL R2 1 - 0x8C080503, // 0007 GETMET R2 R2 K3 - 0x7C080200, // 0008 CALL R2 1 - 0x80000000, // 0009 RET 0 + 0x7C0C0400, // 0009 CALL R3 2 + 0x80000000, // 000A RET 0 }) ) ); @@ -408,40 +51,20 @@ be_local_closure(Matter_Plugin_Bridge_OnOff_update_shadow, /* name */ /******************************************************************** ** Solidified class: Matter_Plugin_Bridge_OnOff ********************************************************************/ -extern const bclass be_class_Matter_Plugin_Bridge_HTTP; +extern const bclass be_class_Matter_Plugin_Bridge_Light0; be_local_class(Matter_Plugin_Bridge_OnOff, - 2, - &be_class_Matter_Plugin_Bridge_HTTP, - be_nested_map(15, + 0, + &be_class_Matter_Plugin_Bridge_Light0, + be_nested_map(4, ( (struct bmapnode*) &(const bmapnode[]) { - { be_const_key_weak(init, -1), be_const_closure(Matter_Plugin_Bridge_OnOff_init_closure) }, - { be_const_key_weak(parse_update, -1), be_const_closure(Matter_Plugin_Bridge_OnOff_parse_update_closure) }, - { be_const_key_weak(invoke_request, -1), be_const_closure(Matter_Plugin_Bridge_OnOff_invoke_request_closure) }, - { be_const_key_weak(set_onoff, -1), be_const_closure(Matter_Plugin_Bridge_OnOff_set_onoff_closure) }, - { be_const_key_weak(ARG_TYPE, 7), be_const_static_closure(Matter_Plugin_Bridge_OnOff__X3Clambda_X3E_closure) }, - { be_const_key_weak(tasmota_relay_index, 11), be_const_var(0) }, - { be_const_key_weak(probe_shadow_async, -1), be_const_closure(Matter_Plugin_Bridge_OnOff_probe_shadow_async_closure) }, - { be_const_key_weak(update_shadow, 10), be_const_closure(Matter_Plugin_Bridge_OnOff_update_shadow_closure) }, - { be_const_key_weak(NAME, -1), be_nested_str_weak(_X26_X23x1F517_X3B_X20Relay) }, - { be_const_key_weak(ARG, 8), be_nested_str_weak(relay) }, - { be_const_key_weak(TYPE, 14), be_nested_str_weak(http_relay) }, + { be_const_key_weak(web_values, -1), be_const_closure(Matter_Plugin_Bridge_OnOff_web_values_closure) }, + { be_const_key_weak(TYPE, -1), be_nested_str_weak(http_relay) }, + { be_const_key_weak(NAME, 3), be_nested_str_weak(_X26_X23x1F517_X3B_X20Relay) }, { be_const_key_weak(TYPES, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { - be_const_map( * be_nested_map(1, + be_const_map( * be_nested_map(2, ( (struct bmapnode*) &(const bmapnode[]) { { be_const_key_int(266, -1), be_const_int(2) }, - })) ) } )) }, - { be_const_key_weak(read_attribute, -1), be_const_closure(Matter_Plugin_Bridge_OnOff_read_attribute_closure) }, - { be_const_key_weak(shadow_onoff, -1), be_const_var(1) }, - { be_const_key_weak(CLUSTERS, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { - be_const_map( * be_nested_map(1, - ( (struct bmapnode*) &(const bmapnode[]) { - { be_const_key_int(6, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_list, { - be_const_list( * be_nested_list(3, - ( (struct bvalue*) &(const bvalue[]) { - be_const_int(0), - be_const_int(65532), - be_const_int(65533), - })) ) } )) }, + { be_const_key_int(19, -1), be_const_int(1) }, })) ) } )) }, })), be_str_weak(Matter_Plugin_Bridge_OnOff) diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Sensor.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Sensor.h new file mode 100644 index 000000000..5569b9ba6 --- /dev/null +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Sensor.h @@ -0,0 +1,241 @@ +/* Solidification of Matter_Plugin_Bridge_Sensor.h */ +/********************************************************************\ +* Generated code, don't edit * +\********************************************************************/ +#include "be_constobj.h" + +extern const bclass be_class_Matter_Plugin_Bridge_Sensor; + +/******************************************************************** +** Solidified function: filter_name_html +********************************************************************/ +be_local_closure(Matter_Plugin_Bridge_Sensor_filter_name_html, /* name */ + be_nested_proto( + 9, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 8]) { /* constants */ + /* K0 */ be_nested_str_weak(tasmota_sensor_filter), + /* K1 */ be_nested_str_weak(string), + /* K2 */ be_nested_str_weak(webserver), + /* K3 */ be_nested_str_weak(html_escape), + /* K4 */ be_nested_str_weak(split), + /* K5 */ be_nested_str_weak(_X23), + /* K6 */ be_const_int(0), + /* K7 */ be_nested_str_weak(), + }), + be_str_weak(filter_name_html), + &be_const_str_solidified, + ( &(const binstruction[13]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x78060009, // 0001 JMPF R1 #000C + 0xA4060200, // 0002 IMPORT R1 K1 + 0xA40A0400, // 0003 IMPORT R2 K2 + 0x8C0C0503, // 0004 GETMET R3 R2 K3 + 0x8C140304, // 0005 GETMET R5 R1 K4 + 0x881C0100, // 0006 GETMBR R7 R0 K0 + 0x58200005, // 0007 LDCONST R8 K5 + 0x7C140600, // 0008 CALL R5 3 + 0x94140B06, // 0009 GETIDX R5 R5 K6 + 0x7C0C0400, // 000A CALL R3 2 + 0x80040600, // 000B RET 1 R3 + 0x80060E00, // 000C RET 1 K7 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: init +********************************************************************/ +be_local_closure(Matter_Plugin_Bridge_Sensor_init, /* name */ + be_nested_proto( + 9, /* nstack */ + 4, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 8]) { /* constants */ + /* K0 */ be_nested_str_weak(init), + /* K1 */ be_nested_str_weak(tasmota_sensor_filter), + /* K2 */ be_nested_str_weak(find), + /* K3 */ be_nested_str_weak(ARG), + /* K4 */ be_nested_str_weak(tasmota_sensor_matcher), + /* K5 */ be_nested_str_weak(tasmota), + /* K6 */ be_nested_str_weak(Rule_Matcher), + /* K7 */ be_nested_str_weak(parse), + }), + be_str_weak(init), + &be_const_str_solidified, + ( &(const binstruction[21]) { /* code */ + 0x60100003, // 0000 GETGBL R4 G3 + 0x5C140000, // 0001 MOVE R5 R0 + 0x7C100200, // 0002 CALL R4 1 + 0x8C100900, // 0003 GETMET R4 R4 K0 + 0x5C180200, // 0004 MOVE R6 R1 + 0x5C1C0400, // 0005 MOVE R7 R2 + 0x5C200600, // 0006 MOVE R8 R3 + 0x7C100800, // 0007 CALL R4 4 + 0x8C100702, // 0008 GETMET R4 R3 K2 + 0x88180103, // 0009 GETMBR R6 R0 K3 + 0x7C100400, // 000A CALL R4 2 + 0x90020204, // 000B SETMBR R0 K1 R4 + 0x88100101, // 000C GETMBR R4 R0 K1 + 0x78120005, // 000D JMPF R4 #0014 + 0xB8120A00, // 000E GETNGBL R4 K5 + 0x88100906, // 000F GETMBR R4 R4 K6 + 0x8C100907, // 0010 GETMET R4 R4 K7 + 0x88180101, // 0011 GETMBR R6 R0 K1 + 0x7C100400, // 0012 CALL R4 2 + 0x90020804, // 0013 SETMBR R0 K4 R4 + 0x80000000, // 0014 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: pre_value +********************************************************************/ +be_local_closure(Matter_Plugin_Bridge_Sensor_pre_value, /* name */ + be_nested_proto( + 2, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 0, /* has constants */ + NULL, /* no const */ + be_str_weak(pre_value), + &be_const_str_solidified, + ( &(const binstruction[ 1]) { /* code */ + 0x80040200, // 0000 RET 1 R1 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: parse_update +********************************************************************/ +be_local_closure(Matter_Plugin_Bridge_Sensor_parse_update, /* name */ + be_nested_proto( + 9, /* nstack */ + 3, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 5]) { /* constants */ + /* K0 */ be_nested_str_weak(tasmota_sensor_matcher), + /* K1 */ be_nested_str_weak(pre_value), + /* K2 */ be_nested_str_weak(match), + /* K3 */ be_nested_str_weak(shadow_value), + /* K4 */ be_nested_str_weak(value_changed), + }), + be_str_weak(parse_update), + &be_const_str_solidified, + ( &(const binstruction[24]) { /* code */ + 0x540E0007, // 0000 LDINT R3 8 + 0x1C0C0403, // 0001 EQ R3 R2 R3 + 0x780E0013, // 0002 JMPF R3 #0017 + 0x880C0100, // 0003 GETMBR R3 R0 K0 + 0x780E0011, // 0004 JMPF R3 #0017 + 0x8C0C0101, // 0005 GETMET R3 R0 K1 + 0x6014000A, // 0006 GETGBL R5 G10 + 0x88180100, // 0007 GETMBR R6 R0 K0 + 0x8C180D02, // 0008 GETMET R6 R6 K2 + 0x5C200200, // 0009 MOVE R8 R1 + 0x7C180400, // 000A CALL R6 2 + 0x7C140200, // 000B CALL R5 1 + 0x7C0C0400, // 000C CALL R3 2 + 0x4C100000, // 000D LDNIL R4 + 0x20100604, // 000E NE R4 R3 R4 + 0x78120006, // 000F JMPF R4 #0017 + 0x88100103, // 0010 GETMBR R4 R0 K3 + 0x20100604, // 0011 NE R4 R3 R4 + 0x78120002, // 0012 JMPF R4 #0016 + 0x8C100104, // 0013 GETMET R4 R0 K4 + 0x5C180600, // 0014 MOVE R6 R3 + 0x7C100400, // 0015 CALL R4 2 + 0x90020603, // 0016 SETMBR R0 K3 R3 + 0x80000000, // 0017 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: value_changed +********************************************************************/ +be_local_closure(Matter_Plugin_Bridge_Sensor_value_changed, /* name */ + be_nested_proto( + 2, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 0, /* has constants */ + NULL, /* no const */ + be_str_weak(value_changed), + &be_const_str_solidified, + ( &(const binstruction[ 1]) { /* code */ + 0x80000000, // 0000 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified class: Matter_Plugin_Bridge_Sensor +********************************************************************/ +extern const bclass be_class_Matter_Plugin_Bridge_HTTP; +be_local_class(Matter_Plugin_Bridge_Sensor, + 3, + &be_class_Matter_Plugin_Bridge_HTTP, + be_nested_map(13, + ( (struct bmapnode*) &(const bmapnode[]) { + { be_const_key_weak(ARG, 1), be_nested_str_weak(filter) }, + { be_const_key_weak(value_changed, -1), be_const_closure(Matter_Plugin_Bridge_Sensor_value_changed_closure) }, + { be_const_key_weak(UPDATE_TIME, -1), be_const_int(5000) }, + { be_const_key_weak(tasmota_sensor_filter, 8), be_const_var(0) }, + { be_const_key_weak(tasmota_sensor_matcher, -1), be_const_var(1) }, + { be_const_key_weak(PROBE_TIMEOUT, -1), be_const_int(1700) }, + { be_const_key_weak(filter_name_html, 12), be_const_closure(Matter_Plugin_Bridge_Sensor_filter_name_html_closure) }, + { be_const_key_weak(UPDATE_CMD, -1), be_nested_str_weak(Status_X208) }, + { be_const_key_weak(pre_value, -1), be_const_closure(Matter_Plugin_Bridge_Sensor_pre_value_closure) }, + { be_const_key_weak(parse_update, -1), be_const_closure(Matter_Plugin_Bridge_Sensor_parse_update_closure) }, + { be_const_key_weak(shadow_value, 7), be_const_var(2) }, + { be_const_key_weak(ARG_HTTP, 2), be_nested_str_weak(url) }, + { be_const_key_weak(init, -1), be_const_closure(Matter_Plugin_Bridge_Sensor_init_closure) }, + })), + be_str_weak(Matter_Plugin_Bridge_Sensor) +); +/*******************************************************************/ + +void be_load_Matter_Plugin_Bridge_Sensor_class(bvm *vm) { + be_pushntvclass(vm, &be_class_Matter_Plugin_Bridge_Sensor); + be_setglobal(vm, "Matter_Plugin_Bridge_Sensor"); + be_pop(vm, 1); +} +/********************************************************************/ +/* End of solidification */ diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Sensor_Humidity.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Sensor_Humidity.h new file mode 100644 index 000000000..1fa58bec6 --- /dev/null +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Sensor_Humidity.h @@ -0,0 +1,280 @@ +/* Solidification of Matter_Plugin_Bridge_Sensor_Humidity.h */ +/********************************************************************\ +* Generated code, don't edit * +\********************************************************************/ +#include "be_constobj.h" + +extern const bclass be_class_Matter_Plugin_Bridge_Sensor_Humidity; + +/******************************************************************** +** Solidified function: pre_value +********************************************************************/ +be_local_closure(Matter_Plugin_Bridge_Sensor_Humidity_pre_value, /* name */ + be_nested_proto( + 4, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 0, /* has constants */ + NULL, /* no const */ + be_str_weak(pre_value), + &be_const_str_solidified, + ( &(const binstruction[10]) { /* code */ + 0x4C080000, // 0000 LDNIL R2 + 0x20080202, // 0001 NE R2 R1 R2 + 0x780A0004, // 0002 JMPF R2 #0008 + 0x60080009, // 0003 GETGBL R2 G9 + 0x540E0063, // 0004 LDINT R3 100 + 0x080C0203, // 0005 MUL R3 R1 R3 + 0x7C080200, // 0006 CALL R2 1 + 0x70020000, // 0007 JMP #0009 + 0x4C080000, // 0008 LDNIL R2 + 0x80040400, // 0009 RET 1 R2 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: read_attribute +********************************************************************/ +be_local_closure(Matter_Plugin_Bridge_Sensor_Humidity_read_attribute, /* name */ + be_nested_proto( + 12, /* nstack */ + 3, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[15]) { /* constants */ + /* K0 */ be_nested_str_weak(string), + /* K1 */ be_nested_str_weak(matter), + /* K2 */ be_nested_str_weak(TLV), + /* K3 */ be_nested_str_weak(cluster), + /* K4 */ be_nested_str_weak(attribute), + /* K5 */ be_const_int(0), + /* K6 */ be_nested_str_weak(shadow_value), + /* K7 */ be_nested_str_weak(create_TLV), + /* K8 */ be_nested_str_weak(U2), + /* K9 */ be_nested_str_weak(NULL), + /* K10 */ be_const_int(1), + /* K11 */ be_const_int(2), + /* K12 */ be_nested_str_weak(U4), + /* K13 */ be_const_int(3), + /* K14 */ be_nested_str_weak(read_attribute), + }), + be_str_weak(read_attribute), + &be_const_str_solidified, + ( &(const binstruction[71]) { /* code */ + 0xA40E0000, // 0000 IMPORT R3 K0 + 0xB8120200, // 0001 GETNGBL R4 K1 + 0x88100902, // 0002 GETMBR R4 R4 K2 + 0x88140503, // 0003 GETMBR R5 R2 K3 + 0x88180504, // 0004 GETMBR R6 R2 K4 + 0x541E0404, // 0005 LDINT R7 1029 + 0x1C1C0A07, // 0006 EQ R7 R5 R7 + 0x781E0035, // 0007 JMPF R7 #003E + 0x1C1C0D05, // 0008 EQ R7 R6 K5 + 0x781E0011, // 0009 JMPF R7 #001C + 0x881C0106, // 000A GETMBR R7 R0 K6 + 0x4C200000, // 000B LDNIL R8 + 0x201C0E08, // 000C NE R7 R7 R8 + 0x781E0007, // 000D JMPF R7 #0016 + 0x8C1C0907, // 000E GETMET R7 R4 K7 + 0x88240908, // 000F GETMBR R9 R4 K8 + 0x60280009, // 0010 GETGBL R10 G9 + 0x882C0106, // 0011 GETMBR R11 R0 K6 + 0x7C280200, // 0012 CALL R10 1 + 0x7C1C0600, // 0013 CALL R7 3 + 0x80040E00, // 0014 RET 1 R7 + 0x70020004, // 0015 JMP #001B + 0x8C1C0907, // 0016 GETMET R7 R4 K7 + 0x88240909, // 0017 GETMBR R9 R4 K9 + 0x4C280000, // 0018 LDNIL R10 + 0x7C1C0600, // 0019 CALL R7 3 + 0x80040E00, // 001A RET 1 R7 + 0x70020020, // 001B JMP #003D + 0x1C1C0D0A, // 001C EQ R7 R6 K10 + 0x781E0005, // 001D JMPF R7 #0024 + 0x8C1C0907, // 001E GETMET R7 R4 K7 + 0x88240908, // 001F GETMBR R9 R4 K8 + 0x542A01F3, // 0020 LDINT R10 500 + 0x7C1C0600, // 0021 CALL R7 3 + 0x80040E00, // 0022 RET 1 R7 + 0x70020018, // 0023 JMP #003D + 0x1C1C0D0B, // 0024 EQ R7 R6 K11 + 0x781E0005, // 0025 JMPF R7 #002C + 0x8C1C0907, // 0026 GETMET R7 R4 K7 + 0x88240908, // 0027 GETMBR R9 R4 K8 + 0x542A270F, // 0028 LDINT R10 10000 + 0x7C1C0600, // 0029 CALL R7 3 + 0x80040E00, // 002A RET 1 R7 + 0x70020010, // 002B JMP #003D + 0x541EFFFB, // 002C LDINT R7 65532 + 0x1C1C0C07, // 002D EQ R7 R6 R7 + 0x781E0005, // 002E JMPF R7 #0035 + 0x8C1C0907, // 002F GETMET R7 R4 K7 + 0x8824090C, // 0030 GETMBR R9 R4 K12 + 0x58280005, // 0031 LDCONST R10 K5 + 0x7C1C0600, // 0032 CALL R7 3 + 0x80040E00, // 0033 RET 1 R7 + 0x70020007, // 0034 JMP #003D + 0x541EFFFC, // 0035 LDINT R7 65533 + 0x1C1C0C07, // 0036 EQ R7 R6 R7 + 0x781E0004, // 0037 JMPF R7 #003D + 0x8C1C0907, // 0038 GETMET R7 R4 K7 + 0x8824090C, // 0039 GETMBR R9 R4 K12 + 0x5828000D, // 003A LDCONST R10 K13 + 0x7C1C0600, // 003B CALL R7 3 + 0x80040E00, // 003C RET 1 R7 + 0x70020007, // 003D JMP #0046 + 0x601C0003, // 003E GETGBL R7 G3 + 0x5C200000, // 003F MOVE R8 R0 + 0x7C1C0200, // 0040 CALL R7 1 + 0x8C1C0F0E, // 0041 GETMET R7 R7 K14 + 0x5C240200, // 0042 MOVE R9 R1 + 0x5C280400, // 0043 MOVE R10 R2 + 0x7C1C0600, // 0044 CALL R7 3 + 0x80040E00, // 0045 RET 1 R7 + 0x80000000, // 0046 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: value_changed +********************************************************************/ +be_local_closure(Matter_Plugin_Bridge_Sensor_Humidity_value_changed, /* name */ + be_nested_proto( + 6, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 2]) { /* constants */ + /* K0 */ be_nested_str_weak(attribute_updated), + /* K1 */ be_const_int(0), + }), + be_str_weak(value_changed), + &be_const_str_solidified, + ( &(const binstruction[ 5]) { /* code */ + 0x8C080100, // 0000 GETMET R2 R0 K0 + 0x54120404, // 0001 LDINT R4 1029 + 0x58140001, // 0002 LDCONST R5 K1 + 0x7C080600, // 0003 CALL R2 3 + 0x80000000, // 0004 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: web_values +********************************************************************/ +be_local_closure(Matter_Plugin_Bridge_Sensor_Humidity_web_values, /* name */ + be_nested_proto( + 11, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 7]) { /* constants */ + /* K0 */ be_nested_str_weak(webserver), + /* K1 */ be_nested_str_weak(string), + /* K2 */ be_nested_str_weak(content_send), + /* K3 */ be_nested_str_weak(format), + /* K4 */ be_nested_str_weak(_X7C_X20_X25s_X20_X26_X23x1F4A7_X3B_X20_X252_X2E0f_X25_X25), + /* K5 */ be_nested_str_weak(filter_name_html), + /* K6 */ be_nested_str_weak(shadow_value), + }), + be_str_weak(web_values), + &be_const_str_solidified, + ( &(const binstruction[21]) { /* code */ + 0xA4060000, // 0000 IMPORT R1 K0 + 0xA40A0200, // 0001 IMPORT R2 K1 + 0x8C0C0302, // 0002 GETMET R3 R1 K2 + 0x8C140503, // 0003 GETMET R5 R2 K3 + 0x581C0004, // 0004 LDCONST R7 K4 + 0x8C200105, // 0005 GETMET R8 R0 K5 + 0x7C200200, // 0006 CALL R8 1 + 0x88240106, // 0007 GETMBR R9 R0 K6 + 0x4C280000, // 0008 LDNIL R10 + 0x2024120A, // 0009 NE R9 R9 R10 + 0x78260005, // 000A JMPF R9 #0011 + 0x6024000A, // 000B GETGBL R9 G10 + 0x88280106, // 000C GETMBR R10 R0 K6 + 0x7C240200, // 000D CALL R9 1 + 0x542A0063, // 000E LDINT R10 100 + 0x0C24120A, // 000F DIV R9 R9 R10 + 0x70020000, // 0010 JMP #0012 + 0x4C240000, // 0011 LDNIL R9 + 0x7C140800, // 0012 CALL R5 4 + 0x7C0C0400, // 0013 CALL R3 2 + 0x80000000, // 0014 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified class: Matter_Plugin_Bridge_Sensor_Humidity +********************************************************************/ +extern const bclass be_class_Matter_Plugin_Bridge_Sensor; +be_local_class(Matter_Plugin_Bridge_Sensor_Humidity, + 0, + &be_class_Matter_Plugin_Bridge_Sensor, + be_nested_map(8, + ( (struct bmapnode*) &(const bmapnode[]) { + { be_const_key_weak(pre_value, 1), be_const_closure(Matter_Plugin_Bridge_Sensor_Humidity_pre_value_closure) }, + { be_const_key_weak(web_values, -1), be_const_closure(Matter_Plugin_Bridge_Sensor_Humidity_web_values_closure) }, + { be_const_key_weak(CLUSTERS, 3), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { + be_const_map( * be_nested_map(1, + ( (struct bmapnode*) &(const bmapnode[]) { + { be_const_key_int(1029, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_list, { + be_const_list( * be_nested_list(5, + ( (struct bvalue*) &(const bvalue[]) { + be_const_int(0), + be_const_int(1), + be_const_int(2), + be_const_int(65532), + be_const_int(65533), + })) ) } )) }, + })) ) } )) }, + { be_const_key_weak(read_attribute, 7), be_const_closure(Matter_Plugin_Bridge_Sensor_Humidity_read_attribute_closure) }, + { be_const_key_weak(value_changed, -1), be_const_closure(Matter_Plugin_Bridge_Sensor_Humidity_value_changed_closure) }, + { be_const_key_weak(TYPE, 4), be_nested_str_weak(http_humidity) }, + { be_const_key_weak(NAME, -1), be_nested_str_weak(_X26_X23x1F517_X3B_X20Humidity) }, + { be_const_key_weak(TYPES, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { + be_const_map( * be_nested_map(2, + ( (struct bmapnode*) &(const bmapnode[]) { + { be_const_key_int(775, -1), be_const_int(2) }, + { be_const_key_int(19, 0), be_const_int(1) }, + })) ) } )) }, + })), + be_str_weak(Matter_Plugin_Bridge_Sensor_Humidity) +); +/*******************************************************************/ + +void be_load_Matter_Plugin_Bridge_Sensor_Humidity_class(bvm *vm) { + be_pushntvclass(vm, &be_class_Matter_Plugin_Bridge_Sensor_Humidity); + be_setglobal(vm, "Matter_Plugin_Bridge_Sensor_Humidity"); + be_pop(vm, 1); +} +/********************************************************************/ +/* End of solidification */ diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Sensor_Illuminance.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Sensor_Illuminance.h new file mode 100644 index 000000000..2db6b0396 --- /dev/null +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Sensor_Illuminance.h @@ -0,0 +1,271 @@ +/* Solidification of Matter_Plugin_Bridge_Sensor_Illuminance.h */ +/********************************************************************\ +* Generated code, don't edit * +\********************************************************************/ +#include "be_constobj.h" + +extern const bclass be_class_Matter_Plugin_Bridge_Sensor_Illuminance; + +/******************************************************************** +** Solidified function: pre_value +********************************************************************/ +be_local_closure(Matter_Plugin_Bridge_Sensor_Illuminance_pre_value, /* name */ + be_nested_proto( + 4, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 0, /* has constants */ + NULL, /* no const */ + be_str_weak(pre_value), + &be_const_str_solidified, + ( &(const binstruction[ 9]) { /* code */ + 0x4C080000, // 0000 LDNIL R2 + 0x20080202, // 0001 NE R2 R1 R2 + 0x780A0003, // 0002 JMPF R2 #0007 + 0x60080009, // 0003 GETGBL R2 G9 + 0x5C0C0200, // 0004 MOVE R3 R1 + 0x7C080200, // 0005 CALL R2 1 + 0x70020000, // 0006 JMP #0008 + 0x4C080000, // 0007 LDNIL R2 + 0x80040400, // 0008 RET 1 R2 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: read_attribute +********************************************************************/ +be_local_closure(Matter_Plugin_Bridge_Sensor_Illuminance_read_attribute, /* name */ + be_nested_proto( + 12, /* nstack */ + 3, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[15]) { /* constants */ + /* K0 */ be_nested_str_weak(string), + /* K1 */ be_nested_str_weak(matter), + /* K2 */ be_nested_str_weak(TLV), + /* K3 */ be_nested_str_weak(cluster), + /* K4 */ be_nested_str_weak(attribute), + /* K5 */ be_const_int(0), + /* K6 */ be_nested_str_weak(shadow_value), + /* K7 */ be_nested_str_weak(create_TLV), + /* K8 */ be_nested_str_weak(I2), + /* K9 */ be_nested_str_weak(NULL), + /* K10 */ be_const_int(1), + /* K11 */ be_const_int(2), + /* K12 */ be_nested_str_weak(U4), + /* K13 */ be_const_int(3), + /* K14 */ be_nested_str_weak(read_attribute), + }), + be_str_weak(read_attribute), + &be_const_str_solidified, + ( &(const binstruction[71]) { /* code */ + 0xA40E0000, // 0000 IMPORT R3 K0 + 0xB8120200, // 0001 GETNGBL R4 K1 + 0x88100902, // 0002 GETMBR R4 R4 K2 + 0x88140503, // 0003 GETMBR R5 R2 K3 + 0x88180504, // 0004 GETMBR R6 R2 K4 + 0x541E03FF, // 0005 LDINT R7 1024 + 0x1C1C0A07, // 0006 EQ R7 R5 R7 + 0x781E0035, // 0007 JMPF R7 #003E + 0x1C1C0D05, // 0008 EQ R7 R6 K5 + 0x781E0011, // 0009 JMPF R7 #001C + 0x881C0106, // 000A GETMBR R7 R0 K6 + 0x4C200000, // 000B LDNIL R8 + 0x201C0E08, // 000C NE R7 R7 R8 + 0x781E0007, // 000D JMPF R7 #0016 + 0x8C1C0907, // 000E GETMET R7 R4 K7 + 0x88240908, // 000F GETMBR R9 R4 K8 + 0x60280009, // 0010 GETGBL R10 G9 + 0x882C0106, // 0011 GETMBR R11 R0 K6 + 0x7C280200, // 0012 CALL R10 1 + 0x7C1C0600, // 0013 CALL R7 3 + 0x80040E00, // 0014 RET 1 R7 + 0x70020004, // 0015 JMP #001B + 0x8C1C0907, // 0016 GETMET R7 R4 K7 + 0x88240909, // 0017 GETMBR R9 R4 K9 + 0x4C280000, // 0018 LDNIL R10 + 0x7C1C0600, // 0019 CALL R7 3 + 0x80040E00, // 001A RET 1 R7 + 0x70020020, // 001B JMP #003D + 0x1C1C0D0A, // 001C EQ R7 R6 K10 + 0x781E0005, // 001D JMPF R7 #0024 + 0x8C1C0907, // 001E GETMET R7 R4 K7 + 0x88240908, // 001F GETMBR R9 R4 K8 + 0x58280005, // 0020 LDCONST R10 K5 + 0x7C1C0600, // 0021 CALL R7 3 + 0x80040E00, // 0022 RET 1 R7 + 0x70020018, // 0023 JMP #003D + 0x1C1C0D0B, // 0024 EQ R7 R6 K11 + 0x781E0005, // 0025 JMPF R7 #002C + 0x8C1C0907, // 0026 GETMET R7 R4 K7 + 0x88240908, // 0027 GETMBR R9 R4 K8 + 0x542A270F, // 0028 LDINT R10 10000 + 0x7C1C0600, // 0029 CALL R7 3 + 0x80040E00, // 002A RET 1 R7 + 0x70020010, // 002B JMP #003D + 0x541EFFFB, // 002C LDINT R7 65532 + 0x1C1C0C07, // 002D EQ R7 R6 R7 + 0x781E0005, // 002E JMPF R7 #0035 + 0x8C1C0907, // 002F GETMET R7 R4 K7 + 0x8824090C, // 0030 GETMBR R9 R4 K12 + 0x58280005, // 0031 LDCONST R10 K5 + 0x7C1C0600, // 0032 CALL R7 3 + 0x80040E00, // 0033 RET 1 R7 + 0x70020007, // 0034 JMP #003D + 0x541EFFFC, // 0035 LDINT R7 65533 + 0x1C1C0C07, // 0036 EQ R7 R6 R7 + 0x781E0004, // 0037 JMPF R7 #003D + 0x8C1C0907, // 0038 GETMET R7 R4 K7 + 0x8824090C, // 0039 GETMBR R9 R4 K12 + 0x5828000D, // 003A LDCONST R10 K13 + 0x7C1C0600, // 003B CALL R7 3 + 0x80040E00, // 003C RET 1 R7 + 0x70020007, // 003D JMP #0046 + 0x601C0003, // 003E GETGBL R7 G3 + 0x5C200000, // 003F MOVE R8 R0 + 0x7C1C0200, // 0040 CALL R7 1 + 0x8C1C0F0E, // 0041 GETMET R7 R7 K14 + 0x5C240200, // 0042 MOVE R9 R1 + 0x5C280400, // 0043 MOVE R10 R2 + 0x7C1C0600, // 0044 CALL R7 3 + 0x80040E00, // 0045 RET 1 R7 + 0x80000000, // 0046 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: value_changed +********************************************************************/ +be_local_closure(Matter_Plugin_Bridge_Sensor_Illuminance_value_changed, /* name */ + be_nested_proto( + 6, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 2]) { /* constants */ + /* K0 */ be_nested_str_weak(attribute_updated), + /* K1 */ be_const_int(0), + }), + be_str_weak(value_changed), + &be_const_str_solidified, + ( &(const binstruction[ 5]) { /* code */ + 0x8C080100, // 0000 GETMET R2 R0 K0 + 0x541203FF, // 0001 LDINT R4 1024 + 0x58140001, // 0002 LDCONST R5 K1 + 0x7C080600, // 0003 CALL R2 3 + 0x80000000, // 0004 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: web_values +********************************************************************/ +be_local_closure(Matter_Plugin_Bridge_Sensor_Illuminance_web_values, /* name */ + be_nested_proto( + 11, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 7]) { /* constants */ + /* K0 */ be_nested_str_weak(webserver), + /* K1 */ be_nested_str_weak(string), + /* K2 */ be_nested_str_weak(content_send), + /* K3 */ be_nested_str_weak(format), + /* K4 */ be_nested_str_weak(_X7C_X20_X25s_X20_X26_X23128261_X3B_X20_X25ilux), + /* K5 */ be_nested_str_weak(filter_name_html), + /* K6 */ be_nested_str_weak(shadow_value), + }), + be_str_weak(web_values), + &be_const_str_solidified, + ( &(const binstruction[13]) { /* code */ + 0xA4060000, // 0000 IMPORT R1 K0 + 0xA40A0200, // 0001 IMPORT R2 K1 + 0x8C0C0302, // 0002 GETMET R3 R1 K2 + 0x8C140503, // 0003 GETMET R5 R2 K3 + 0x581C0004, // 0004 LDCONST R7 K4 + 0x8C200105, // 0005 GETMET R8 R0 K5 + 0x7C200200, // 0006 CALL R8 1 + 0x60240009, // 0007 GETGBL R9 G9 + 0x88280106, // 0008 GETMBR R10 R0 K6 + 0x7C240200, // 0009 CALL R9 1 + 0x7C140800, // 000A CALL R5 4 + 0x7C0C0400, // 000B CALL R3 2 + 0x80000000, // 000C RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified class: Matter_Plugin_Bridge_Sensor_Illuminance +********************************************************************/ +extern const bclass be_class_Matter_Plugin_Bridge_Sensor; +be_local_class(Matter_Plugin_Bridge_Sensor_Illuminance, + 0, + &be_class_Matter_Plugin_Bridge_Sensor, + be_nested_map(8, + ( (struct bmapnode*) &(const bmapnode[]) { + { be_const_key_weak(pre_value, 1), be_const_closure(Matter_Plugin_Bridge_Sensor_Illuminance_pre_value_closure) }, + { be_const_key_weak(web_values, -1), be_const_closure(Matter_Plugin_Bridge_Sensor_Illuminance_web_values_closure) }, + { be_const_key_weak(CLUSTERS, 3), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { + be_const_map( * be_nested_map(1, + ( (struct bmapnode*) &(const bmapnode[]) { + { be_const_key_int(1024, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_list, { + be_const_list( * be_nested_list(5, + ( (struct bvalue*) &(const bvalue[]) { + be_const_int(0), + be_const_int(1), + be_const_int(2), + be_const_int(65532), + be_const_int(65533), + })) ) } )) }, + })) ) } )) }, + { be_const_key_weak(read_attribute, 7), be_const_closure(Matter_Plugin_Bridge_Sensor_Illuminance_read_attribute_closure) }, + { be_const_key_weak(value_changed, -1), be_const_closure(Matter_Plugin_Bridge_Sensor_Illuminance_value_changed_closure) }, + { be_const_key_weak(TYPE, 4), be_nested_str_weak(http_illuminance) }, + { be_const_key_weak(NAME, -1), be_nested_str_weak(_X26_X23x1F517_X3B_X20Illuminance) }, + { be_const_key_weak(TYPES, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { + be_const_map( * be_nested_map(2, + ( (struct bmapnode*) &(const bmapnode[]) { + { be_const_key_int(262, -1), be_const_int(2) }, + { be_const_key_int(19, -1), be_const_int(1) }, + })) ) } )) }, + })), + be_str_weak(Matter_Plugin_Bridge_Sensor_Illuminance) +); +/*******************************************************************/ + +void be_load_Matter_Plugin_Bridge_Sensor_Illuminance_class(bvm *vm) { + be_pushntvclass(vm, &be_class_Matter_Plugin_Bridge_Sensor_Illuminance); + be_setglobal(vm, "Matter_Plugin_Bridge_Sensor_Illuminance"); + be_pop(vm, 1); +} +/********************************************************************/ +/* End of solidification */ diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Sensor_Pressure.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Sensor_Pressure.h new file mode 100644 index 000000000..3b36094c4 --- /dev/null +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Sensor_Pressure.h @@ -0,0 +1,271 @@ +/* Solidification of Matter_Plugin_Bridge_Sensor_Pressure.h */ +/********************************************************************\ +* Generated code, don't edit * +\********************************************************************/ +#include "be_constobj.h" + +extern const bclass be_class_Matter_Plugin_Bridge_Sensor_Pressure; + +/******************************************************************** +** Solidified function: pre_value +********************************************************************/ +be_local_closure(Matter_Plugin_Bridge_Sensor_Pressure_pre_value, /* name */ + be_nested_proto( + 4, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 0, /* has constants */ + NULL, /* no const */ + be_str_weak(pre_value), + &be_const_str_solidified, + ( &(const binstruction[ 9]) { /* code */ + 0x4C080000, // 0000 LDNIL R2 + 0x20080202, // 0001 NE R2 R1 R2 + 0x780A0003, // 0002 JMPF R2 #0007 + 0x60080009, // 0003 GETGBL R2 G9 + 0x5C0C0200, // 0004 MOVE R3 R1 + 0x7C080200, // 0005 CALL R2 1 + 0x70020000, // 0006 JMP #0008 + 0x4C080000, // 0007 LDNIL R2 + 0x80040400, // 0008 RET 1 R2 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: read_attribute +********************************************************************/ +be_local_closure(Matter_Plugin_Bridge_Sensor_Pressure_read_attribute, /* name */ + be_nested_proto( + 12, /* nstack */ + 3, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[15]) { /* constants */ + /* K0 */ be_nested_str_weak(string), + /* K1 */ be_nested_str_weak(matter), + /* K2 */ be_nested_str_weak(TLV), + /* K3 */ be_nested_str_weak(cluster), + /* K4 */ be_nested_str_weak(attribute), + /* K5 */ be_const_int(0), + /* K6 */ be_nested_str_weak(shadow_value), + /* K7 */ be_nested_str_weak(create_TLV), + /* K8 */ be_nested_str_weak(I2), + /* K9 */ be_nested_str_weak(NULL), + /* K10 */ be_const_int(1), + /* K11 */ be_const_int(2), + /* K12 */ be_nested_str_weak(U4), + /* K13 */ be_const_int(3), + /* K14 */ be_nested_str_weak(read_attribute), + }), + be_str_weak(read_attribute), + &be_const_str_solidified, + ( &(const binstruction[71]) { /* code */ + 0xA40E0000, // 0000 IMPORT R3 K0 + 0xB8120200, // 0001 GETNGBL R4 K1 + 0x88100902, // 0002 GETMBR R4 R4 K2 + 0x88140503, // 0003 GETMBR R5 R2 K3 + 0x88180504, // 0004 GETMBR R6 R2 K4 + 0x541E0402, // 0005 LDINT R7 1027 + 0x1C1C0A07, // 0006 EQ R7 R5 R7 + 0x781E0035, // 0007 JMPF R7 #003E + 0x1C1C0D05, // 0008 EQ R7 R6 K5 + 0x781E0011, // 0009 JMPF R7 #001C + 0x881C0106, // 000A GETMBR R7 R0 K6 + 0x4C200000, // 000B LDNIL R8 + 0x201C0E08, // 000C NE R7 R7 R8 + 0x781E0007, // 000D JMPF R7 #0016 + 0x8C1C0907, // 000E GETMET R7 R4 K7 + 0x88240908, // 000F GETMBR R9 R4 K8 + 0x60280009, // 0010 GETGBL R10 G9 + 0x882C0106, // 0011 GETMBR R11 R0 K6 + 0x7C280200, // 0012 CALL R10 1 + 0x7C1C0600, // 0013 CALL R7 3 + 0x80040E00, // 0014 RET 1 R7 + 0x70020004, // 0015 JMP #001B + 0x8C1C0907, // 0016 GETMET R7 R4 K7 + 0x88240909, // 0017 GETMBR R9 R4 K9 + 0x4C280000, // 0018 LDNIL R10 + 0x7C1C0600, // 0019 CALL R7 3 + 0x80040E00, // 001A RET 1 R7 + 0x70020020, // 001B JMP #003D + 0x1C1C0D0A, // 001C EQ R7 R6 K10 + 0x781E0005, // 001D JMPF R7 #0024 + 0x8C1C0907, // 001E GETMET R7 R4 K7 + 0x88240908, // 001F GETMBR R9 R4 K8 + 0x542A01F3, // 0020 LDINT R10 500 + 0x7C1C0600, // 0021 CALL R7 3 + 0x80040E00, // 0022 RET 1 R7 + 0x70020018, // 0023 JMP #003D + 0x1C1C0D0B, // 0024 EQ R7 R6 K11 + 0x781E0005, // 0025 JMPF R7 #002C + 0x8C1C0907, // 0026 GETMET R7 R4 K7 + 0x88240908, // 0027 GETMBR R9 R4 K8 + 0x542A05DB, // 0028 LDINT R10 1500 + 0x7C1C0600, // 0029 CALL R7 3 + 0x80040E00, // 002A RET 1 R7 + 0x70020010, // 002B JMP #003D + 0x541EFFFB, // 002C LDINT R7 65532 + 0x1C1C0C07, // 002D EQ R7 R6 R7 + 0x781E0005, // 002E JMPF R7 #0035 + 0x8C1C0907, // 002F GETMET R7 R4 K7 + 0x8824090C, // 0030 GETMBR R9 R4 K12 + 0x58280005, // 0031 LDCONST R10 K5 + 0x7C1C0600, // 0032 CALL R7 3 + 0x80040E00, // 0033 RET 1 R7 + 0x70020007, // 0034 JMP #003D + 0x541EFFFC, // 0035 LDINT R7 65533 + 0x1C1C0C07, // 0036 EQ R7 R6 R7 + 0x781E0004, // 0037 JMPF R7 #003D + 0x8C1C0907, // 0038 GETMET R7 R4 K7 + 0x8824090C, // 0039 GETMBR R9 R4 K12 + 0x5828000D, // 003A LDCONST R10 K13 + 0x7C1C0600, // 003B CALL R7 3 + 0x80040E00, // 003C RET 1 R7 + 0x70020007, // 003D JMP #0046 + 0x601C0003, // 003E GETGBL R7 G3 + 0x5C200000, // 003F MOVE R8 R0 + 0x7C1C0200, // 0040 CALL R7 1 + 0x8C1C0F0E, // 0041 GETMET R7 R7 K14 + 0x5C240200, // 0042 MOVE R9 R1 + 0x5C280400, // 0043 MOVE R10 R2 + 0x7C1C0600, // 0044 CALL R7 3 + 0x80040E00, // 0045 RET 1 R7 + 0x80000000, // 0046 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: value_changed +********************************************************************/ +be_local_closure(Matter_Plugin_Bridge_Sensor_Pressure_value_changed, /* name */ + be_nested_proto( + 6, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 2]) { /* constants */ + /* K0 */ be_nested_str_weak(attribute_updated), + /* K1 */ be_const_int(0), + }), + be_str_weak(value_changed), + &be_const_str_solidified, + ( &(const binstruction[ 5]) { /* code */ + 0x8C080100, // 0000 GETMET R2 R0 K0 + 0x54120402, // 0001 LDINT R4 1027 + 0x58140001, // 0002 LDCONST R5 K1 + 0x7C080600, // 0003 CALL R2 3 + 0x80000000, // 0004 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: web_values +********************************************************************/ +be_local_closure(Matter_Plugin_Bridge_Sensor_Pressure_web_values, /* name */ + be_nested_proto( + 11, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 7]) { /* constants */ + /* K0 */ be_nested_str_weak(webserver), + /* K1 */ be_nested_str_weak(string), + /* K2 */ be_nested_str_weak(content_send), + /* K3 */ be_nested_str_weak(format), + /* K4 */ be_nested_str_weak(_X7C_X20_X25s_X20_X26_X23x26C5_X3B_X20_X25i_X20hPa), + /* K5 */ be_nested_str_weak(filter_name_html), + /* K6 */ be_nested_str_weak(shadow_value), + }), + be_str_weak(web_values), + &be_const_str_solidified, + ( &(const binstruction[13]) { /* code */ + 0xA4060000, // 0000 IMPORT R1 K0 + 0xA40A0200, // 0001 IMPORT R2 K1 + 0x8C0C0302, // 0002 GETMET R3 R1 K2 + 0x8C140503, // 0003 GETMET R5 R2 K3 + 0x581C0004, // 0004 LDCONST R7 K4 + 0x8C200105, // 0005 GETMET R8 R0 K5 + 0x7C200200, // 0006 CALL R8 1 + 0x60240009, // 0007 GETGBL R9 G9 + 0x88280106, // 0008 GETMBR R10 R0 K6 + 0x7C240200, // 0009 CALL R9 1 + 0x7C140800, // 000A CALL R5 4 + 0x7C0C0400, // 000B CALL R3 2 + 0x80000000, // 000C RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified class: Matter_Plugin_Bridge_Sensor_Pressure +********************************************************************/ +extern const bclass be_class_Matter_Plugin_Bridge_Sensor; +be_local_class(Matter_Plugin_Bridge_Sensor_Pressure, + 0, + &be_class_Matter_Plugin_Bridge_Sensor, + be_nested_map(8, + ( (struct bmapnode*) &(const bmapnode[]) { + { be_const_key_weak(pre_value, 1), be_const_closure(Matter_Plugin_Bridge_Sensor_Pressure_pre_value_closure) }, + { be_const_key_weak(web_values, -1), be_const_closure(Matter_Plugin_Bridge_Sensor_Pressure_web_values_closure) }, + { be_const_key_weak(CLUSTERS, 3), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { + be_const_map( * be_nested_map(1, + ( (struct bmapnode*) &(const bmapnode[]) { + { be_const_key_int(1027, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_list, { + be_const_list( * be_nested_list(5, + ( (struct bvalue*) &(const bvalue[]) { + be_const_int(0), + be_const_int(1), + be_const_int(2), + be_const_int(65532), + be_const_int(65533), + })) ) } )) }, + })) ) } )) }, + { be_const_key_weak(read_attribute, 7), be_const_closure(Matter_Plugin_Bridge_Sensor_Pressure_read_attribute_closure) }, + { be_const_key_weak(value_changed, -1), be_const_closure(Matter_Plugin_Bridge_Sensor_Pressure_value_changed_closure) }, + { be_const_key_weak(TYPE, 4), be_nested_str_weak(http_pressure) }, + { be_const_key_weak(NAME, -1), be_nested_str_weak(_X26_X23x1F517_X3B_X20Pressure) }, + { be_const_key_weak(TYPES, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { + be_const_map( * be_nested_map(2, + ( (struct bmapnode*) &(const bmapnode[]) { + { be_const_key_int(773, -1), be_const_int(2) }, + { be_const_key_int(19, 0), be_const_int(1) }, + })) ) } )) }, + })), + be_str_weak(Matter_Plugin_Bridge_Sensor_Pressure) +); +/*******************************************************************/ + +void be_load_Matter_Plugin_Bridge_Sensor_Pressure_class(bvm *vm) { + be_pushntvclass(vm, &be_class_Matter_Plugin_Bridge_Sensor_Pressure); + be_setglobal(vm, "Matter_Plugin_Bridge_Sensor_Pressure"); + be_pop(vm, 1); +} +/********************************************************************/ +/* End of solidification */ diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Sensor_Temp.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Sensor_Temp.h new file mode 100644 index 000000000..fb5ab423a --- /dev/null +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Sensor_Temp.h @@ -0,0 +1,277 @@ +/* Solidification of Matter_Plugin_Bridge_Sensor_Temp.h */ +/********************************************************************\ +* Generated code, don't edit * +\********************************************************************/ +#include "be_constobj.h" + +extern const bclass be_class_Matter_Plugin_Bridge_Sensor_Temp; + +/******************************************************************** +** Solidified function: pre_value +********************************************************************/ +be_local_closure(Matter_Plugin_Bridge_Sensor_Temp_pre_value, /* name */ + be_nested_proto( + 4, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 0, /* has constants */ + NULL, /* no const */ + be_str_weak(pre_value), + &be_const_str_solidified, + ( &(const binstruction[10]) { /* code */ + 0x4C080000, // 0000 LDNIL R2 + 0x20080202, // 0001 NE R2 R1 R2 + 0x780A0004, // 0002 JMPF R2 #0008 + 0x60080009, // 0003 GETGBL R2 G9 + 0x540E0063, // 0004 LDINT R3 100 + 0x080C0203, // 0005 MUL R3 R1 R3 + 0x7C080200, // 0006 CALL R2 1 + 0x70020000, // 0007 JMP #0009 + 0x4C080000, // 0008 LDNIL R2 + 0x80040400, // 0009 RET 1 R2 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: read_attribute +********************************************************************/ +be_local_closure(Matter_Plugin_Bridge_Sensor_Temp_read_attribute, /* name */ + be_nested_proto( + 11, /* nstack */ + 3, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[14]) { /* constants */ + /* K0 */ be_nested_str_weak(string), + /* K1 */ be_nested_str_weak(matter), + /* K2 */ be_nested_str_weak(TLV), + /* K3 */ be_nested_str_weak(cluster), + /* K4 */ be_nested_str_weak(attribute), + /* K5 */ be_const_int(0), + /* K6 */ be_nested_str_weak(shadow_value), + /* K7 */ be_nested_str_weak(create_TLV), + /* K8 */ be_nested_str_weak(I2), + /* K9 */ be_nested_str_weak(NULL), + /* K10 */ be_const_int(1), + /* K11 */ be_const_int(2), + /* K12 */ be_nested_str_weak(U4), + /* K13 */ be_nested_str_weak(read_attribute), + }), + be_str_weak(read_attribute), + &be_const_str_solidified, + ( &(const binstruction[69]) { /* code */ + 0xA40E0000, // 0000 IMPORT R3 K0 + 0xB8120200, // 0001 GETNGBL R4 K1 + 0x88100902, // 0002 GETMBR R4 R4 K2 + 0x88140503, // 0003 GETMBR R5 R2 K3 + 0x88180504, // 0004 GETMBR R6 R2 K4 + 0x541E0401, // 0005 LDINT R7 1026 + 0x1C1C0A07, // 0006 EQ R7 R5 R7 + 0x781E0033, // 0007 JMPF R7 #003C + 0x1C1C0D05, // 0008 EQ R7 R6 K5 + 0x781E000F, // 0009 JMPF R7 #001A + 0x881C0106, // 000A GETMBR R7 R0 K6 + 0x4C200000, // 000B LDNIL R8 + 0x201C0E08, // 000C NE R7 R7 R8 + 0x781E0005, // 000D JMPF R7 #0014 + 0x8C1C0907, // 000E GETMET R7 R4 K7 + 0x88240908, // 000F GETMBR R9 R4 K8 + 0x88280106, // 0010 GETMBR R10 R0 K6 + 0x7C1C0600, // 0011 CALL R7 3 + 0x80040E00, // 0012 RET 1 R7 + 0x70020004, // 0013 JMP #0019 + 0x8C1C0907, // 0014 GETMET R7 R4 K7 + 0x88240909, // 0015 GETMBR R9 R4 K9 + 0x4C280000, // 0016 LDNIL R10 + 0x7C1C0600, // 0017 CALL R7 3 + 0x80040E00, // 0018 RET 1 R7 + 0x70020020, // 0019 JMP #003B + 0x1C1C0D0A, // 001A EQ R7 R6 K10 + 0x781E0005, // 001B JMPF R7 #0022 + 0x8C1C0907, // 001C GETMET R7 R4 K7 + 0x88240908, // 001D GETMBR R9 R4 K8 + 0x5429EC77, // 001E LDINT R10 -5000 + 0x7C1C0600, // 001F CALL R7 3 + 0x80040E00, // 0020 RET 1 R7 + 0x70020018, // 0021 JMP #003B + 0x1C1C0D0B, // 0022 EQ R7 R6 K11 + 0x781E0005, // 0023 JMPF R7 #002A + 0x8C1C0907, // 0024 GETMET R7 R4 K7 + 0x88240908, // 0025 GETMBR R9 R4 K8 + 0x542A3A97, // 0026 LDINT R10 15000 + 0x7C1C0600, // 0027 CALL R7 3 + 0x80040E00, // 0028 RET 1 R7 + 0x70020010, // 0029 JMP #003B + 0x541EFFFB, // 002A LDINT R7 65532 + 0x1C1C0C07, // 002B EQ R7 R6 R7 + 0x781E0005, // 002C JMPF R7 #0033 + 0x8C1C0907, // 002D GETMET R7 R4 K7 + 0x8824090C, // 002E GETMBR R9 R4 K12 + 0x58280005, // 002F LDCONST R10 K5 + 0x7C1C0600, // 0030 CALL R7 3 + 0x80040E00, // 0031 RET 1 R7 + 0x70020007, // 0032 JMP #003B + 0x541EFFFC, // 0033 LDINT R7 65533 + 0x1C1C0C07, // 0034 EQ R7 R6 R7 + 0x781E0004, // 0035 JMPF R7 #003B + 0x8C1C0907, // 0036 GETMET R7 R4 K7 + 0x8824090C, // 0037 GETMBR R9 R4 K12 + 0x542A0003, // 0038 LDINT R10 4 + 0x7C1C0600, // 0039 CALL R7 3 + 0x80040E00, // 003A RET 1 R7 + 0x70020007, // 003B JMP #0044 + 0x601C0003, // 003C GETGBL R7 G3 + 0x5C200000, // 003D MOVE R8 R0 + 0x7C1C0200, // 003E CALL R7 1 + 0x8C1C0F0D, // 003F GETMET R7 R7 K13 + 0x5C240200, // 0040 MOVE R9 R1 + 0x5C280400, // 0041 MOVE R10 R2 + 0x7C1C0600, // 0042 CALL R7 3 + 0x80040E00, // 0043 RET 1 R7 + 0x80000000, // 0044 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: value_changed +********************************************************************/ +be_local_closure(Matter_Plugin_Bridge_Sensor_Temp_value_changed, /* name */ + be_nested_proto( + 6, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 2]) { /* constants */ + /* K0 */ be_nested_str_weak(attribute_updated), + /* K1 */ be_const_int(0), + }), + be_str_weak(value_changed), + &be_const_str_solidified, + ( &(const binstruction[ 5]) { /* code */ + 0x8C080100, // 0000 GETMET R2 R0 K0 + 0x54120401, // 0001 LDINT R4 1026 + 0x58140001, // 0002 LDCONST R5 K1 + 0x7C080600, // 0003 CALL R2 3 + 0x80000000, // 0004 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: web_values +********************************************************************/ +be_local_closure(Matter_Plugin_Bridge_Sensor_Temp_web_values, /* name */ + be_nested_proto( + 11, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 7]) { /* constants */ + /* K0 */ be_nested_str_weak(webserver), + /* K1 */ be_nested_str_weak(string), + /* K2 */ be_nested_str_weak(content_send), + /* K3 */ be_nested_str_weak(format), + /* K4 */ be_nested_str_weak(_X7C_X20_X25s_X20_X26_X23x2600_X3B_X26_X23xFE0F_X3B_X20_X25_X2E1f_X20_XC2_XB0C), + /* K5 */ be_nested_str_weak(filter_name_html), + /* K6 */ be_nested_str_weak(shadow_value), + }), + be_str_weak(web_values), + &be_const_str_solidified, + ( &(const binstruction[21]) { /* code */ + 0xA4060000, // 0000 IMPORT R1 K0 + 0xA40A0200, // 0001 IMPORT R2 K1 + 0x8C0C0302, // 0002 GETMET R3 R1 K2 + 0x8C140503, // 0003 GETMET R5 R2 K3 + 0x581C0004, // 0004 LDCONST R7 K4 + 0x8C200105, // 0005 GETMET R8 R0 K5 + 0x7C200200, // 0006 CALL R8 1 + 0x88240106, // 0007 GETMBR R9 R0 K6 + 0x4C280000, // 0008 LDNIL R10 + 0x2024120A, // 0009 NE R9 R9 R10 + 0x78260005, // 000A JMPF R9 #0011 + 0x6024000A, // 000B GETGBL R9 G10 + 0x88280106, // 000C GETMBR R10 R0 K6 + 0x7C240200, // 000D CALL R9 1 + 0x542A0063, // 000E LDINT R10 100 + 0x0C24120A, // 000F DIV R9 R9 R10 + 0x70020000, // 0010 JMP #0012 + 0x4C240000, // 0011 LDNIL R9 + 0x7C140800, // 0012 CALL R5 4 + 0x7C0C0400, // 0013 CALL R3 2 + 0x80000000, // 0014 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified class: Matter_Plugin_Bridge_Sensor_Temp +********************************************************************/ +extern const bclass be_class_Matter_Plugin_Bridge_Sensor; +be_local_class(Matter_Plugin_Bridge_Sensor_Temp, + 0, + &be_class_Matter_Plugin_Bridge_Sensor, + be_nested_map(8, + ( (struct bmapnode*) &(const bmapnode[]) { + { be_const_key_weak(pre_value, 1), be_const_closure(Matter_Plugin_Bridge_Sensor_Temp_pre_value_closure) }, + { be_const_key_weak(web_values, -1), be_const_closure(Matter_Plugin_Bridge_Sensor_Temp_web_values_closure) }, + { be_const_key_weak(CLUSTERS, 3), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { + be_const_map( * be_nested_map(1, + ( (struct bmapnode*) &(const bmapnode[]) { + { be_const_key_int(1026, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_list, { + be_const_list( * be_nested_list(5, + ( (struct bvalue*) &(const bvalue[]) { + be_const_int(0), + be_const_int(1), + be_const_int(2), + be_const_int(65532), + be_const_int(65533), + })) ) } )) }, + })) ) } )) }, + { be_const_key_weak(read_attribute, 7), be_const_closure(Matter_Plugin_Bridge_Sensor_Temp_read_attribute_closure) }, + { be_const_key_weak(value_changed, -1), be_const_closure(Matter_Plugin_Bridge_Sensor_Temp_value_changed_closure) }, + { be_const_key_weak(TYPE, 4), be_nested_str_weak(http_temperature) }, + { be_const_key_weak(NAME, -1), be_nested_str_weak(_X26_X23x1F517_X3B_X20Temperature) }, + { be_const_key_weak(TYPES, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { + be_const_map( * be_nested_map(2, + ( (struct bmapnode*) &(const bmapnode[]) { + { be_const_key_int(770, -1), be_const_int(2) }, + { be_const_key_int(19, -1), be_const_int(1) }, + })) ) } )) }, + })), + be_str_weak(Matter_Plugin_Bridge_Sensor_Temp) +); +/*******************************************************************/ + +void be_load_Matter_Plugin_Bridge_Sensor_Temp_class(bvm *vm) { + be_pushntvclass(vm, &be_class_Matter_Plugin_Bridge_Sensor_Temp); + be_setglobal(vm, "Matter_Plugin_Bridge_Sensor_Temp"); + be_pop(vm, 1); +} +/********************************************************************/ +/* End of solidification */ diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Light0.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Light0.h index d8782dcac..1cdb57d29 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Light0.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Light0.h @@ -31,28 +31,31 @@ be_local_closure(Matter_Plugin_Light0_update_shadow, /* name */ }), be_str_weak(update_shadow), &be_const_str_solidified, - ( &(const binstruction[21]) { /* code */ + ( &(const binstruction[24]) { /* code */ 0xA4060000, // 0000 IMPORT R1 K0 0x8C080301, // 0001 GETMET R2 R1 K1 0x7C080200, // 0002 CALL R2 1 - 0x8C0C0502, // 0003 GETMET R3 R2 K2 - 0x58140003, // 0004 LDCONST R5 K3 - 0x4C180000, // 0005 LDNIL R6 - 0x7C0C0600, // 0006 CALL R3 3 - 0x88100104, // 0007 GETMBR R4 R0 K4 - 0x20100604, // 0008 NE R4 R3 R4 - 0x78120004, // 0009 JMPF R4 #000F - 0x8C100105, // 000A GETMET R4 R0 K5 - 0x541A0005, // 000B LDINT R6 6 - 0x581C0006, // 000C LDCONST R7 K6 - 0x7C100600, // 000D CALL R4 3 - 0x90020803, // 000E SETMBR R0 K4 R3 - 0x60100003, // 000F GETGBL R4 G3 - 0x5C140000, // 0010 MOVE R5 R0 - 0x7C100200, // 0011 CALL R4 1 - 0x8C100907, // 0012 GETMET R4 R4 K7 - 0x7C100200, // 0013 CALL R4 1 - 0x80000000, // 0014 RET 0 + 0x4C0C0000, // 0003 LDNIL R3 + 0x200C0403, // 0004 NE R3 R2 R3 + 0x780E000B, // 0005 JMPF R3 #0012 + 0x8C0C0502, // 0006 GETMET R3 R2 K2 + 0x58140003, // 0007 LDCONST R5 K3 + 0x4C180000, // 0008 LDNIL R6 + 0x7C0C0600, // 0009 CALL R3 3 + 0x88100104, // 000A GETMBR R4 R0 K4 + 0x20100604, // 000B NE R4 R3 R4 + 0x78120004, // 000C JMPF R4 #0012 + 0x8C100105, // 000D GETMET R4 R0 K5 + 0x541A0005, // 000E LDINT R6 6 + 0x581C0006, // 000F LDCONST R7 K6 + 0x7C100600, // 0010 CALL R4 3 + 0x90020803, // 0011 SETMBR R0 K4 R3 + 0x600C0003, // 0012 GETGBL R3 G3 + 0x5C100000, // 0013 MOVE R4 R0 + 0x7C0C0200, // 0014 CALL R3 1 + 0x8C0C0707, // 0015 GETMET R3 R3 K7 + 0x7C0C0200, // 0016 CALL R3 1 + 0x80000000, // 0017 RET 0 }) ) ); diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Light1.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Light1.h index 4fad7a876..df604d067 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Light1.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Light1.h @@ -33,40 +33,43 @@ be_local_closure(Matter_Plugin_Light1_update_shadow, /* name */ }), be_str_weak(update_shadow), &be_const_str_solidified, - ( &(const binstruction[33]) { /* code */ + ( &(const binstruction[36]) { /* code */ 0xA4060000, // 0000 IMPORT R1 K0 0x8C080301, // 0001 GETMET R2 R1 K1 0x7C080200, // 0002 CALL R2 1 - 0x8C0C0502, // 0003 GETMET R3 R2 K2 - 0x58140003, // 0004 LDCONST R5 K3 - 0x4C180000, // 0005 LDNIL R6 - 0x7C0C0600, // 0006 CALL R3 3 - 0x4C100000, // 0007 LDNIL R4 - 0x20100604, // 0008 NE R4 R3 R4 - 0x78120010, // 0009 JMPF R4 #001B - 0xB8120800, // 000A GETNGBL R4 K4 - 0x8C100905, // 000B GETMET R4 R4 K5 - 0x5C180600, // 000C MOVE R6 R3 - 0x581C0006, // 000D LDCONST R7 K6 - 0x542200FE, // 000E LDINT R8 255 - 0x58240006, // 000F LDCONST R9 K6 - 0x542A00FD, // 0010 LDINT R10 254 - 0x7C100C00, // 0011 CALL R4 6 - 0x5C0C0800, // 0012 MOVE R3 R4 - 0x88100107, // 0013 GETMBR R4 R0 K7 - 0x20100604, // 0014 NE R4 R3 R4 - 0x78120004, // 0015 JMPF R4 #001B - 0x8C100108, // 0016 GETMET R4 R0 K8 - 0x541A0007, // 0017 LDINT R6 8 - 0x581C0006, // 0018 LDCONST R7 K6 - 0x7C100600, // 0019 CALL R4 3 - 0x90020E03, // 001A SETMBR R0 K7 R3 - 0x60100003, // 001B GETGBL R4 G3 - 0x5C140000, // 001C MOVE R5 R0 - 0x7C100200, // 001D CALL R4 1 - 0x8C100909, // 001E GETMET R4 R4 K9 - 0x7C100200, // 001F CALL R4 1 - 0x80000000, // 0020 RET 0 + 0x4C0C0000, // 0003 LDNIL R3 + 0x200C0403, // 0004 NE R3 R2 R3 + 0x780E0017, // 0005 JMPF R3 #001E + 0x8C0C0502, // 0006 GETMET R3 R2 K2 + 0x58140003, // 0007 LDCONST R5 K3 + 0x4C180000, // 0008 LDNIL R6 + 0x7C0C0600, // 0009 CALL R3 3 + 0x4C100000, // 000A LDNIL R4 + 0x20100604, // 000B NE R4 R3 R4 + 0x78120010, // 000C JMPF R4 #001E + 0xB8120800, // 000D GETNGBL R4 K4 + 0x8C100905, // 000E GETMET R4 R4 K5 + 0x5C180600, // 000F MOVE R6 R3 + 0x581C0006, // 0010 LDCONST R7 K6 + 0x542200FE, // 0011 LDINT R8 255 + 0x58240006, // 0012 LDCONST R9 K6 + 0x542A00FD, // 0013 LDINT R10 254 + 0x7C100C00, // 0014 CALL R4 6 + 0x5C0C0800, // 0015 MOVE R3 R4 + 0x88100107, // 0016 GETMBR R4 R0 K7 + 0x20100604, // 0017 NE R4 R3 R4 + 0x78120004, // 0018 JMPF R4 #001E + 0x8C100108, // 0019 GETMET R4 R0 K8 + 0x541A0007, // 001A LDINT R6 8 + 0x581C0006, // 001B LDCONST R7 K6 + 0x7C100600, // 001C CALL R4 3 + 0x90020E03, // 001D SETMBR R0 K7 R3 + 0x600C0003, // 001E GETGBL R3 G3 + 0x5C100000, // 001F MOVE R4 R0 + 0x7C0C0200, // 0020 CALL R3 1 + 0x8C0C0709, // 0021 GETMET R3 R3 K9 + 0x7C0C0200, // 0022 CALL R3 1 + 0x80000000, // 0023 RET 0 }) ) ); diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Light2.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Light2.h index 50328f5df..51ed67fe8 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Light2.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Light2.h @@ -152,7 +152,7 @@ be_local_closure(Matter_Plugin_Light2_update_shadow, /* name */ }), be_str_weak(update_shadow), &be_const_str_solidified, - ( &(const binstruction[27]) { /* code */ + ( &(const binstruction[30]) { /* code */ 0xA4060000, // 0000 IMPORT R1 K0 0x8C080101, // 0001 GETMET R2 R0 K1 0x7C080200, // 0002 CALL R2 1 @@ -163,23 +163,26 @@ be_local_closure(Matter_Plugin_Light2_update_shadow, /* name */ 0x7C080200, // 0007 CALL R2 1 0x8C080303, // 0008 GETMET R2 R1 K3 0x7C080200, // 0009 CALL R2 1 - 0x8C0C0504, // 000A GETMET R3 R2 K4 - 0x58140005, // 000B LDCONST R5 K5 - 0x4C180000, // 000C LDNIL R6 - 0x7C0C0600, // 000D CALL R3 3 - 0x4C100000, // 000E LDNIL R4 - 0x1C100604, // 000F EQ R4 R3 R4 - 0x78120000, // 0010 JMPF R4 #0012 - 0x880C0106, // 0011 GETMBR R3 R0 K6 - 0x88100106, // 0012 GETMBR R4 R0 K6 - 0x20100604, // 0013 NE R4 R3 R4 - 0x78120004, // 0014 JMPF R4 #001A - 0x8C100107, // 0015 GETMET R4 R0 K7 - 0x541A02FF, // 0016 LDINT R6 768 - 0x541E0006, // 0017 LDINT R7 7 - 0x7C100600, // 0018 CALL R4 3 - 0x90020C03, // 0019 SETMBR R0 K6 R3 - 0x80000000, // 001A RET 0 + 0x4C0C0000, // 000A LDNIL R3 + 0x200C0403, // 000B NE R3 R2 R3 + 0x780E000F, // 000C JMPF R3 #001D + 0x8C0C0504, // 000D GETMET R3 R2 K4 + 0x58140005, // 000E LDCONST R5 K5 + 0x4C180000, // 000F LDNIL R6 + 0x7C0C0600, // 0010 CALL R3 3 + 0x4C100000, // 0011 LDNIL R4 + 0x1C100604, // 0012 EQ R4 R3 R4 + 0x78120000, // 0013 JMPF R4 #0015 + 0x880C0106, // 0014 GETMBR R3 R0 K6 + 0x88100106, // 0015 GETMBR R4 R0 K6 + 0x20100604, // 0016 NE R4 R3 R4 + 0x78120004, // 0017 JMPF R4 #001D + 0x8C100107, // 0018 GETMET R4 R0 K7 + 0x541A02FF, // 0019 LDINT R6 768 + 0x541E0006, // 001A LDINT R7 7 + 0x7C100600, // 001B CALL R4 3 + 0x90020C03, // 001C SETMBR R0 K6 R3 + 0x80000000, // 001D RET 0 }) ) ); diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Light3.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Light3.h index abfb7e030..025159bc7 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Light3.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Light3.h @@ -36,7 +36,7 @@ be_local_closure(Matter_Plugin_Light3_update_shadow, /* name */ }), be_str_weak(update_shadow), &be_const_str_solidified, - ( &(const binstruction[61]) { /* code */ + ( &(const binstruction[64]) { /* code */ 0xA4060000, // 0000 IMPORT R1 K0 0x60080003, // 0001 GETGBL R2 G3 0x5C0C0000, // 0002 MOVE R3 R0 @@ -45,59 +45,62 @@ be_local_closure(Matter_Plugin_Light3_update_shadow, /* name */ 0x7C080200, // 0005 CALL R2 1 0x8C080302, // 0006 GETMET R2 R1 K2 0x7C080200, // 0007 CALL R2 1 - 0x8C0C0503, // 0008 GETMET R3 R2 K3 - 0x58140004, // 0009 LDCONST R5 K4 - 0x4C180000, // 000A LDNIL R6 - 0x7C0C0600, // 000B CALL R3 3 - 0x8C100503, // 000C GETMET R4 R2 K3 - 0x58180005, // 000D LDCONST R6 K5 - 0x4C1C0000, // 000E LDNIL R7 - 0x7C100600, // 000F CALL R4 3 - 0x4C140000, // 0010 LDNIL R5 - 0x20140605, // 0011 NE R5 R3 R5 - 0x78160009, // 0012 JMPF R5 #001D - 0xB8160C00, // 0013 GETNGBL R5 K6 - 0x8C140B07, // 0014 GETMET R5 R5 K7 - 0x5C1C0600, // 0015 MOVE R7 R3 - 0x58200008, // 0016 LDCONST R8 K8 - 0x54260167, // 0017 LDINT R9 360 - 0x58280008, // 0018 LDCONST R10 K8 - 0x542E00FD, // 0019 LDINT R11 254 - 0x7C140C00, // 001A CALL R5 6 - 0x5C0C0A00, // 001B MOVE R3 R5 - 0x70020000, // 001C JMP #001E - 0x880C0109, // 001D GETMBR R3 R0 K9 - 0x4C140000, // 001E LDNIL R5 - 0x20140805, // 001F NE R5 R4 R5 - 0x78160009, // 0020 JMPF R5 #002B - 0xB8160C00, // 0021 GETNGBL R5 K6 - 0x8C140B07, // 0022 GETMET R5 R5 K7 - 0x5C1C0800, // 0023 MOVE R7 R4 - 0x58200008, // 0024 LDCONST R8 K8 - 0x542600FE, // 0025 LDINT R9 255 - 0x58280008, // 0026 LDCONST R10 K8 - 0x542E00FD, // 0027 LDINT R11 254 - 0x7C140C00, // 0028 CALL R5 6 - 0x5C100A00, // 0029 MOVE R4 R5 - 0x70020000, // 002A JMP #002C - 0x8810010A, // 002B GETMBR R4 R0 K10 - 0x88140109, // 002C GETMBR R5 R0 K9 - 0x20140605, // 002D NE R5 R3 R5 - 0x78160004, // 002E JMPF R5 #0034 - 0x8C14010B, // 002F GETMET R5 R0 K11 - 0x541E02FF, // 0030 LDINT R7 768 - 0x58200008, // 0031 LDCONST R8 K8 - 0x7C140600, // 0032 CALL R5 3 - 0x90021203, // 0033 SETMBR R0 K9 R3 - 0x8814010A, // 0034 GETMBR R5 R0 K10 - 0x20140805, // 0035 NE R5 R4 R5 - 0x78160004, // 0036 JMPF R5 #003C - 0x8C14010B, // 0037 GETMET R5 R0 K11 - 0x541E02FF, // 0038 LDINT R7 768 - 0x5820000C, // 0039 LDCONST R8 K12 - 0x7C140600, // 003A CALL R5 3 - 0x90021404, // 003B SETMBR R0 K10 R4 - 0x80000000, // 003C RET 0 + 0x4C0C0000, // 0008 LDNIL R3 + 0x200C0403, // 0009 NE R3 R2 R3 + 0x780E0033, // 000A JMPF R3 #003F + 0x8C0C0503, // 000B GETMET R3 R2 K3 + 0x58140004, // 000C LDCONST R5 K4 + 0x4C180000, // 000D LDNIL R6 + 0x7C0C0600, // 000E CALL R3 3 + 0x8C100503, // 000F GETMET R4 R2 K3 + 0x58180005, // 0010 LDCONST R6 K5 + 0x4C1C0000, // 0011 LDNIL R7 + 0x7C100600, // 0012 CALL R4 3 + 0x4C140000, // 0013 LDNIL R5 + 0x20140605, // 0014 NE R5 R3 R5 + 0x78160009, // 0015 JMPF R5 #0020 + 0xB8160C00, // 0016 GETNGBL R5 K6 + 0x8C140B07, // 0017 GETMET R5 R5 K7 + 0x5C1C0600, // 0018 MOVE R7 R3 + 0x58200008, // 0019 LDCONST R8 K8 + 0x54260167, // 001A LDINT R9 360 + 0x58280008, // 001B LDCONST R10 K8 + 0x542E00FD, // 001C LDINT R11 254 + 0x7C140C00, // 001D CALL R5 6 + 0x5C0C0A00, // 001E MOVE R3 R5 + 0x70020000, // 001F JMP #0021 + 0x880C0109, // 0020 GETMBR R3 R0 K9 + 0x4C140000, // 0021 LDNIL R5 + 0x20140805, // 0022 NE R5 R4 R5 + 0x78160009, // 0023 JMPF R5 #002E + 0xB8160C00, // 0024 GETNGBL R5 K6 + 0x8C140B07, // 0025 GETMET R5 R5 K7 + 0x5C1C0800, // 0026 MOVE R7 R4 + 0x58200008, // 0027 LDCONST R8 K8 + 0x542600FE, // 0028 LDINT R9 255 + 0x58280008, // 0029 LDCONST R10 K8 + 0x542E00FD, // 002A LDINT R11 254 + 0x7C140C00, // 002B CALL R5 6 + 0x5C100A00, // 002C MOVE R4 R5 + 0x70020000, // 002D JMP #002F + 0x8810010A, // 002E GETMBR R4 R0 K10 + 0x88140109, // 002F GETMBR R5 R0 K9 + 0x20140605, // 0030 NE R5 R3 R5 + 0x78160004, // 0031 JMPF R5 #0037 + 0x8C14010B, // 0032 GETMET R5 R0 K11 + 0x541E02FF, // 0033 LDINT R7 768 + 0x58200008, // 0034 LDCONST R8 K8 + 0x7C140600, // 0035 CALL R5 3 + 0x90021203, // 0036 SETMBR R0 K9 R3 + 0x8814010A, // 0037 GETMBR R5 R0 K10 + 0x20140805, // 0038 NE R5 R4 R5 + 0x78160004, // 0039 JMPF R5 #003F + 0x8C14010B, // 003A GETMET R5 R0 K11 + 0x541E02FF, // 003B LDINT R7 768 + 0x5820000C, // 003C LDCONST R8 K12 + 0x7C140600, // 003D CALL R5 3 + 0x90021404, // 003E SETMBR R0 K10 R4 + 0x80000000, // 003F RET 0 }) ) ); diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_OnOff.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_OnOff.h index 4d753eca5..0c816dfe8 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_OnOff.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_OnOff.h @@ -46,17 +46,18 @@ be_local_closure(Matter_Plugin_OnOff_init, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[ 6]) { /* constants */ + ( &(const bvalue[ 7]) { /* constants */ /* K0 */ be_nested_str_weak(init), /* K1 */ be_nested_str_weak(shadow_onoff), /* K2 */ be_nested_str_weak(tasmota_relay_index), /* K3 */ be_nested_str_weak(find), /* K4 */ be_nested_str_weak(ARG), - /* K5 */ be_const_int(0), + /* K5 */ be_const_int(1), + /* K6 */ be_const_int(0), }), be_str_weak(init), &be_const_str_solidified, - ( &(const binstruction[20]) { /* code */ + ( &(const binstruction[22]) { /* code */ 0x60100003, // 0000 GETGBL R4 G3 0x5C140000, // 0001 MOVE R5 R0 0x7C100200, // 0002 CALL R4 1 @@ -67,16 +68,18 @@ be_local_closure(Matter_Plugin_OnOff_init, /* name */ 0x7C100800, // 0007 CALL R4 4 0x50100000, // 0008 LDBOOL R4 0 0 0x90020204, // 0009 SETMBR R0 K1 R4 - 0x8C100703, // 000A GETMET R4 R3 K3 - 0x88180104, // 000B GETMBR R6 R0 K4 - 0x7C100400, // 000C CALL R4 2 - 0x90020404, // 000D SETMBR R0 K2 R4 - 0x88100102, // 000E GETMBR R4 R0 K2 - 0x4C140000, // 000F LDNIL R5 - 0x1C100805, // 0010 EQ R4 R4 R5 - 0x78120000, // 0011 JMPF R4 #0013 - 0x90020505, // 0012 SETMBR R0 K2 K5 - 0x80000000, // 0013 RET 0 + 0x60100009, // 000A GETGBL R4 G9 + 0x8C140703, // 000B GETMET R5 R3 K3 + 0x881C0104, // 000C GETMBR R7 R0 K4 + 0x58200005, // 000D LDCONST R8 K5 + 0x7C140600, // 000E CALL R5 3 + 0x7C100200, // 000F CALL R4 1 + 0x90020404, // 0010 SETMBR R0 K2 R4 + 0x88100102, // 0011 GETMBR R4 R0 K2 + 0x18100906, // 0012 LE R4 R4 K6 + 0x78120000, // 0013 JMPF R4 #0015 + 0x90020505, // 0014 SETMBR R0 K2 K5 + 0x80000000, // 0015 RET 0 }) ) ); @@ -96,25 +99,27 @@ be_local_closure(Matter_Plugin_OnOff_set_onoff, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[ 4]) { /* constants */ + ( &(const bvalue[ 5]) { /* constants */ /* K0 */ be_nested_str_weak(tasmota), /* K1 */ be_nested_str_weak(set_power), /* K2 */ be_nested_str_weak(tasmota_relay_index), - /* K3 */ be_nested_str_weak(update_shadow), + /* K3 */ be_const_int(1), + /* K4 */ be_nested_str_weak(update_shadow), }), be_str_weak(set_onoff), &be_const_str_solidified, - ( &(const binstruction[10]) { /* code */ + ( &(const binstruction[11]) { /* code */ 0xB80A0000, // 0000 GETNGBL R2 K0 0x8C080501, // 0001 GETMET R2 R2 K1 0x88100102, // 0002 GETMBR R4 R0 K2 - 0x60140017, // 0003 GETGBL R5 G23 - 0x5C180200, // 0004 MOVE R6 R1 - 0x7C140200, // 0005 CALL R5 1 - 0x7C080600, // 0006 CALL R2 3 - 0x8C080103, // 0007 GETMET R2 R0 K3 - 0x7C080200, // 0008 CALL R2 1 - 0x80000000, // 0009 RET 0 + 0x04100903, // 0003 SUB R4 R4 K3 + 0x60140017, // 0004 GETGBL R5 G23 + 0x5C180200, // 0005 MOVE R6 R1 + 0x7C140200, // 0006 CALL R5 1 + 0x7C080600, // 0007 CALL R2 3 + 0x8C080104, // 0008 GETMET R2 R0 K4 + 0x7C080200, // 0009 CALL R2 1 + 0x80000000, // 000A RET 0 }) ) ); @@ -292,46 +297,48 @@ be_local_closure(Matter_Plugin_OnOff_update_shadow, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[ 7]) { /* constants */ + ( &(const bvalue[ 8]) { /* constants */ /* K0 */ be_nested_str_weak(tasmota), /* K1 */ be_nested_str_weak(get_power), /* K2 */ be_nested_str_weak(tasmota_relay_index), - /* K3 */ be_nested_str_weak(shadow_onoff), - /* K4 */ be_nested_str_weak(attribute_updated), - /* K5 */ be_const_int(0), - /* K6 */ be_nested_str_weak(update_shadow), + /* K3 */ be_const_int(1), + /* K4 */ be_nested_str_weak(shadow_onoff), + /* K5 */ be_nested_str_weak(attribute_updated), + /* K6 */ be_const_int(0), + /* K7 */ be_nested_str_weak(update_shadow), }), be_str_weak(update_shadow), &be_const_str_solidified, - ( &(const binstruction[28]) { /* code */ + ( &(const binstruction[29]) { /* code */ 0xB8060000, // 0000 GETNGBL R1 K0 0x8C040301, // 0001 GETMET R1 R1 K1 0x880C0102, // 0002 GETMBR R3 R0 K2 - 0x7C040400, // 0003 CALL R1 2 - 0x4C080000, // 0004 LDNIL R2 - 0x20080202, // 0005 NE R2 R1 R2 - 0x780A000E, // 0006 JMPF R2 #0016 - 0x88080103, // 0007 GETMBR R2 R0 K3 - 0x4C0C0000, // 0008 LDNIL R3 - 0x20080403, // 0009 NE R2 R2 R3 - 0x780A0009, // 000A JMPF R2 #0015 - 0x88080103, // 000B GETMBR R2 R0 K3 - 0x600C0017, // 000C GETGBL R3 G23 - 0x5C100200, // 000D MOVE R4 R1 - 0x7C0C0200, // 000E CALL R3 1 - 0x20080403, // 000F NE R2 R2 R3 - 0x780A0003, // 0010 JMPF R2 #0015 - 0x8C080104, // 0011 GETMET R2 R0 K4 - 0x54120005, // 0012 LDINT R4 6 - 0x58140005, // 0013 LDCONST R5 K5 - 0x7C080600, // 0014 CALL R2 3 - 0x90020601, // 0015 SETMBR R0 K3 R1 - 0x60080003, // 0016 GETGBL R2 G3 - 0x5C0C0000, // 0017 MOVE R3 R0 - 0x7C080200, // 0018 CALL R2 1 - 0x8C080506, // 0019 GETMET R2 R2 K6 - 0x7C080200, // 001A CALL R2 1 - 0x80000000, // 001B RET 0 + 0x040C0703, // 0003 SUB R3 R3 K3 + 0x7C040400, // 0004 CALL R1 2 + 0x4C080000, // 0005 LDNIL R2 + 0x20080202, // 0006 NE R2 R1 R2 + 0x780A000E, // 0007 JMPF R2 #0017 + 0x88080104, // 0008 GETMBR R2 R0 K4 + 0x4C0C0000, // 0009 LDNIL R3 + 0x20080403, // 000A NE R2 R2 R3 + 0x780A0009, // 000B JMPF R2 #0016 + 0x88080104, // 000C GETMBR R2 R0 K4 + 0x600C0017, // 000D GETGBL R3 G23 + 0x5C100200, // 000E MOVE R4 R1 + 0x7C0C0200, // 000F CALL R3 1 + 0x20080403, // 0010 NE R2 R2 R3 + 0x780A0003, // 0011 JMPF R2 #0016 + 0x8C080105, // 0012 GETMET R2 R0 K5 + 0x54120005, // 0013 LDINT R4 6 + 0x58140006, // 0014 LDCONST R5 K6 + 0x7C080600, // 0015 CALL R2 3 + 0x90020801, // 0016 SETMBR R0 K4 R1 + 0x60080003, // 0017 GETGBL R2 G3 + 0x5C0C0000, // 0018 MOVE R3 R0 + 0x7C080200, // 0019 CALL R2 1 + 0x8C080507, // 001A GETMET R2 R2 K7 + 0x7C080200, // 001B CALL R2 1 + 0x80000000, // 001C RET 0 }) ) ); diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_TCP_async.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_TCP_async.h index 62c3ff37e..6893bc3ce 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_TCP_async.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_TCP_async.h @@ -6,456 +6,6 @@ extern const bclass be_class_Matter_TCP_async; -/******************************************************************** -** Solidified function: write -********************************************************************/ -be_local_closure(Matter_TCP_async_write, /* name */ - be_nested_proto( - 5, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 4]) { /* constants */ - /* K0 */ be_nested_str_weak(tcp_connected), - /* K1 */ be_nested_str_weak(tcp), - /* K2 */ be_nested_str_weak(write), - /* K3 */ be_const_int(0), - }), - be_str_weak(write), - &be_const_str_solidified, - ( &(const binstruction[ 8]) { /* code */ - 0x88080100, // 0000 GETMBR R2 R0 K0 - 0x780A0004, // 0001 JMPF R2 #0007 - 0x88080101, // 0002 GETMBR R2 R0 K1 - 0x8C080502, // 0003 GETMET R2 R2 K2 - 0x5C100200, // 0004 MOVE R4 R1 - 0x7C080400, // 0005 CALL R2 2 - 0x80040400, // 0006 RET 1 R2 - 0x80060600, // 0007 RET 1 K3 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: readbytes -********************************************************************/ -be_local_closure(Matter_TCP_async_readbytes, /* name */ - be_nested_proto( - 3, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 3]) { /* constants */ - /* K0 */ be_nested_str_weak(tcp_connected), - /* K1 */ be_nested_str_weak(tcp), - /* K2 */ be_nested_str_weak(readbytes), - }), - be_str_weak(readbytes), - &be_const_str_solidified, - ( &(const binstruction[ 8]) { /* code */ - 0x88040100, // 0000 GETMBR R1 R0 K0 - 0x78060003, // 0001 JMPF R1 #0006 - 0x88040101, // 0002 GETMBR R1 R0 K1 - 0x8C040302, // 0003 GETMET R1 R1 K2 - 0x7C040200, // 0004 CALL R1 1 - 0x80040200, // 0005 RET 1 R1 - 0x4C040000, // 0006 LDNIL R1 - 0x80040200, // 0007 RET 1 R1 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: every_50ms -********************************************************************/ -be_local_closure(Matter_TCP_async_every_50ms, /* name */ - be_nested_proto( - 3, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 1]) { /* constants */ - /* K0 */ be_nested_str_weak(loop), - }), - be_str_weak(every_50ms), - &be_const_str_solidified, - ( &(const binstruction[ 3]) { /* code */ - 0x8C040100, // 0000 GETMET R1 R0 K0 - 0x7C040200, // 0001 CALL R1 1 - 0x80000000, // 0002 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: listening -********************************************************************/ -be_local_closure(Matter_TCP_async_listening, /* name */ - be_nested_proto( - 3, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 3]) { /* constants */ - /* K0 */ be_nested_str_weak(tcp_connected), - /* K1 */ be_nested_str_weak(tcp), - /* K2 */ be_nested_str_weak(listening), - }), - be_str_weak(listening), - &be_const_str_solidified, - ( &(const binstruction[ 8]) { /* code */ - 0x88040100, // 0000 GETMBR R1 R0 K0 - 0x78060003, // 0001 JMPF R1 #0006 - 0x88040101, // 0002 GETMBR R1 R0 K1 - 0x8C040302, // 0003 GETMET R1 R1 K2 - 0x7C040200, // 0004 CALL R1 1 - 0x80040200, // 0005 RET 1 R1 - 0x50040000, // 0006 LDBOOL R1 0 0 - 0x80040200, // 0007 RET 1 R1 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: loop -********************************************************************/ -be_local_closure(Matter_TCP_async_loop, /* name */ - be_nested_proto( - 4, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[18]) { /* constants */ - /* K0 */ be_nested_str_weak(tcp_connected), - /* K1 */ be_nested_str_weak(status), - /* K2 */ be_nested_str_weak(close), - /* K3 */ be_nested_str_weak(tcp), - /* K4 */ be_nested_str_weak(connected), - /* K5 */ be_const_int(1), - /* K6 */ be_nested_str_weak(event_established), - /* K7 */ be_nested_str_weak(event_refused), - /* K8 */ be_nested_str_weak(tasmota), - /* K9 */ be_nested_str_weak(millis), - /* K10 */ be_nested_str_weak(time_start), - /* K11 */ be_nested_str_weak(timeout), - /* K12 */ be_nested_str_weak(event_timeout), - /* K13 */ be_nested_str_weak(event_closed), - /* K14 */ be_nested_str_weak(available), - /* K15 */ be_nested_str_weak(event_available), - /* K16 */ be_nested_str_weak(listening), - /* K17 */ be_nested_str_weak(event_listening), - }), - be_str_weak(loop), - &be_const_str_solidified, - ( &(const binstruction[89]) { /* code */ - 0x88040100, // 0000 GETMBR R1 R0 K0 - 0x88080101, // 0001 GETMBR R2 R0 K1 - 0x4C0C0000, // 0002 LDNIL R3 - 0x1C080403, // 0003 EQ R2 R2 R3 - 0x780A0002, // 0004 JMPF R2 #0008 - 0x8C080102, // 0005 GETMET R2 R0 K2 - 0x7C080200, // 0006 CALL R2 1 - 0x80000400, // 0007 RET 0 - 0x88080103, // 0008 GETMBR R2 R0 K3 - 0x8C080504, // 0009 GETMET R2 R2 K4 - 0x7C080200, // 000A CALL R2 1 - 0x90020002, // 000B SETMBR R0 K0 R2 - 0x4C080000, // 000C LDNIL R2 - 0x1C080202, // 000D EQ R2 R1 R2 - 0x780A0021, // 000E JMPF R2 #0031 - 0x88080100, // 000F GETMBR R2 R0 K0 - 0x500C0200, // 0010 LDBOOL R3 1 0 - 0x1C080403, // 0011 EQ R2 R2 R3 - 0x780A0003, // 0012 JMPF R2 #0017 - 0x90020305, // 0013 SETMBR R0 K1 K5 - 0x8C080106, // 0014 GETMET R2 R0 K6 - 0x7C080200, // 0015 CALL R2 1 - 0x70020019, // 0016 JMP #0031 - 0x88080100, // 0017 GETMBR R2 R0 K0 - 0x500C0000, // 0018 LDBOOL R3 0 0 - 0x1C080403, // 0019 EQ R2 R2 R3 - 0x780A0007, // 001A JMPF R2 #0023 - 0x5409FFFD, // 001B LDINT R2 -2 - 0x90020202, // 001C SETMBR R0 K1 R2 - 0x8C080107, // 001D GETMET R2 R0 K7 - 0x7C080200, // 001E CALL R2 1 - 0x8C080102, // 001F GETMET R2 R0 K2 - 0x7C080200, // 0020 CALL R2 1 - 0x80000400, // 0021 RET 0 - 0x7002000D, // 0022 JMP #0031 - 0xB80A1000, // 0023 GETNGBL R2 K8 - 0x8C080509, // 0024 GETMET R2 R2 K9 - 0x7C080200, // 0025 CALL R2 1 - 0x880C010A, // 0026 GETMBR R3 R0 K10 - 0x04080403, // 0027 SUB R2 R2 R3 - 0x880C010B, // 0028 GETMBR R3 R0 K11 - 0x24080403, // 0029 GT R2 R2 R3 - 0x780A0005, // 002A JMPF R2 #0031 - 0x5409FFFC, // 002B LDINT R2 -3 - 0x90020202, // 002C SETMBR R0 K1 R2 - 0x50080000, // 002D LDBOOL R2 0 0 - 0x90020002, // 002E SETMBR R0 K0 R2 - 0x8C08010C, // 002F GETMET R2 R0 K12 - 0x7C080200, // 0030 CALL R2 1 - 0xB80A1000, // 0031 GETNGBL R2 K8 - 0x8C080509, // 0032 GETMET R2 R2 K9 - 0x7C080200, // 0033 CALL R2 1 - 0x880C010A, // 0034 GETMBR R3 R0 K10 - 0x04080403, // 0035 SUB R2 R2 R3 - 0x880C010B, // 0036 GETMBR R3 R0 K11 - 0x24080403, // 0037 GT R2 R2 R3 - 0x780A0006, // 0038 JMPF R2 #0040 - 0x8C080102, // 0039 GETMET R2 R0 K2 - 0x7C080200, // 003A CALL R2 1 - 0x5409FFFC, // 003B LDINT R2 -3 - 0x90020202, // 003C SETMBR R0 K1 R2 - 0x8C08010C, // 003D GETMET R2 R0 K12 - 0x7C080200, // 003E CALL R2 1 - 0x80000400, // 003F RET 0 - 0x88080100, // 0040 GETMBR R2 R0 K0 - 0x500C0000, // 0041 LDBOOL R3 0 0 - 0x1C080403, // 0042 EQ R2 R2 R3 - 0x780A0007, // 0043 JMPF R2 #004C - 0x50080200, // 0044 LDBOOL R2 1 0 - 0x1C080202, // 0045 EQ R2 R1 R2 - 0x780A0001, // 0046 JMPF R2 #0049 - 0x8C08010D, // 0047 GETMET R2 R0 K13 - 0x7C080200, // 0048 CALL R2 1 - 0x8C080102, // 0049 GETMET R2 R0 K2 - 0x7C080200, // 004A CALL R2 1 - 0x80000400, // 004B RET 0 - 0x88080103, // 004C GETMBR R2 R0 K3 - 0x8C08050E, // 004D GETMET R2 R2 K14 - 0x7C080200, // 004E CALL R2 1 - 0x780A0001, // 004F JMPF R2 #0052 - 0x8C08010F, // 0050 GETMET R2 R0 K15 - 0x7C080200, // 0051 CALL R2 1 - 0x88080103, // 0052 GETMBR R2 R0 K3 - 0x8C080510, // 0053 GETMET R2 R2 K16 - 0x7C080200, // 0054 CALL R2 1 - 0x780A0001, // 0055 JMPF R2 #0058 - 0x8C080111, // 0056 GETMET R2 R0 K17 - 0x7C080200, // 0057 CALL R2 1 - 0x80000000, // 0058 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: event_established -********************************************************************/ -be_local_closure(Matter_TCP_async_event_established, /* name */ - be_nested_proto( - 1, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 0, /* has constants */ - NULL, /* no const */ - be_str_weak(event_established), - &be_const_str_solidified, - ( &(const binstruction[ 1]) { /* code */ - 0x80000000, // 0000 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: reset -********************************************************************/ -be_local_closure(Matter_TCP_async_reset, /* name */ - be_nested_proto( - 3, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 3]) { /* constants */ - /* K0 */ be_nested_str_weak(tcp), - /* K1 */ be_nested_str_weak(close), - /* K2 */ be_nested_str_weak(tcp_connected), - }), - be_str_weak(reset), - &be_const_str_solidified, - ( &(const binstruction[ 6]) { /* code */ - 0x88040100, // 0000 GETMBR R1 R0 K0 - 0x8C040301, // 0001 GETMET R1 R1 K1 - 0x7C040200, // 0002 CALL R1 1 - 0x4C040000, // 0003 LDNIL R1 - 0x90020401, // 0004 SETMBR R0 K2 R1 - 0x80000000, // 0005 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: event_listening -********************************************************************/ -be_local_closure(Matter_TCP_async_event_listening, /* name */ - be_nested_proto( - 1, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 0, /* has constants */ - NULL, /* no const */ - be_str_weak(event_listening), - &be_const_str_solidified, - ( &(const binstruction[ 1]) { /* code */ - 0x80000000, // 0000 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: init -********************************************************************/ -be_local_closure(Matter_TCP_async_init, /* name */ - be_nested_proto( - 7, /* nstack */ - 5, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 1, /* has sup protos */ - ( &(const struct bproto*[ 1]) { - be_nested_proto( - 2, /* nstack */ - 0, /* argc */ - 0, /* varg */ - 1, /* has upvals */ - ( &(const bupvaldesc[ 1]) { /* upvals */ - be_local_const_upval(1, 0), - }), - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 1]) { /* constants */ - /* K0 */ be_nested_str_weak(loop), - }), - be_str_weak(_X3Clambda_X3E), - &be_const_str_solidified, - ( &(const binstruction[ 4]) { /* code */ - 0x68000000, // 0000 GETUPV R0 U0 - 0x8C000100, // 0001 GETMET R0 R0 K0 - 0x7C000200, // 0002 CALL R0 1 - 0x80040000, // 0003 RET 1 R0 - }) - ), - }), - 1, /* has constants */ - ( &(const bvalue[ 7]) { /* constants */ - /* K0 */ be_nested_str_weak(TIMEOUT), - /* K1 */ be_nested_str_weak(addr), - /* K2 */ be_nested_str_weak(port), - /* K3 */ be_nested_str_weak(timeout), - /* K4 */ be_nested_str_weak(tcp), - /* K5 */ be_nested_str_weak(tcpclientasync), - /* K6 */ be_nested_str_weak(fast_loop), - }), - be_str_weak(init), - &be_const_str_solidified, - ( &(const binstruction[25]) { /* code */ - 0x4C140000, // 0000 LDNIL R5 - 0x1C140605, // 0001 EQ R5 R3 R5 - 0x78160000, // 0002 JMPF R5 #0004 - 0x880C0100, // 0003 GETMBR R3 R0 K0 - 0x4C140000, // 0004 LDNIL R5 - 0x1C140405, // 0005 EQ R5 R2 R5 - 0x78160000, // 0006 JMPF R5 #0008 - 0x540A004F, // 0007 LDINT R2 80 - 0x60140008, // 0008 GETGBL R5 G8 - 0x5C180200, // 0009 MOVE R6 R1 - 0x7C140200, // 000A CALL R5 1 - 0x90020205, // 000B SETMBR R0 K1 R5 - 0x60140009, // 000C GETGBL R5 G9 - 0x5C180400, // 000D MOVE R6 R2 - 0x7C140200, // 000E CALL R5 1 - 0x90020405, // 000F SETMBR R0 K2 R5 - 0x90020603, // 0010 SETMBR R0 K3 R3 - 0xB8160A00, // 0011 GETNGBL R5 K5 - 0x7C140000, // 0012 CALL R5 0 - 0x90020805, // 0013 SETMBR R0 K4 R5 - 0x78120001, // 0014 JMPF R4 #0017 - 0x84140000, // 0015 CLOSURE R5 P0 - 0x90020C05, // 0016 SETMBR R0 K6 R5 - 0xA0000000, // 0017 CLOSE R0 - 0x80000000, // 0018 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: event_closed -********************************************************************/ -be_local_closure(Matter_TCP_async_event_closed, /* name */ - be_nested_proto( - 1, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 0, /* has constants */ - NULL, /* no const */ - be_str_weak(event_closed), - &be_const_str_solidified, - ( &(const binstruction[ 1]) { /* code */ - 0x80000000, // 0000 RET 0 - }) - ) -); -/*******************************************************************/ - - /******************************************************************** ** Solidified function: read ********************************************************************/ @@ -605,9 +155,44 @@ be_local_closure(Matter_TCP_async_begin, /* name */ /******************************************************************** -** Solidified function: event_timeout +** Solidified function: readbytes ********************************************************************/ -be_local_closure(Matter_TCP_async_event_timeout, /* name */ +be_local_closure(Matter_TCP_async_readbytes, /* name */ + be_nested_proto( + 3, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 3]) { /* constants */ + /* K0 */ be_nested_str_weak(tcp_connected), + /* K1 */ be_nested_str_weak(tcp), + /* K2 */ be_nested_str_weak(readbytes), + }), + be_str_weak(readbytes), + &be_const_str_solidified, + ( &(const binstruction[ 8]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x78060003, // 0001 JMPF R1 #0006 + 0x88040101, // 0002 GETMBR R1 R0 K1 + 0x8C040302, // 0003 GETMET R1 R1 K2 + 0x7C040200, // 0004 CALL R1 1 + 0x80040200, // 0005 RET 1 R1 + 0x4C040000, // 0006 LDNIL R1 + 0x80040200, // 0007 RET 1 R1 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: event_closed +********************************************************************/ +be_local_closure(Matter_TCP_async_event_closed, /* name */ be_nested_proto( 1, /* nstack */ 1, /* argc */ @@ -618,7 +203,7 @@ be_local_closure(Matter_TCP_async_event_timeout, /* name */ NULL, /* no sub protos */ 0, /* has constants */ NULL, /* no const */ - be_str_weak(event_timeout), + be_str_weak(event_closed), &be_const_str_solidified, ( &(const binstruction[ 1]) { /* code */ 0x80000000, // 0000 RET 0 @@ -664,9 +249,9 @@ be_local_closure(Matter_TCP_async_available, /* name */ /******************************************************************** -** Solidified function: event_refused +** Solidified function: event_listening ********************************************************************/ -be_local_closure(Matter_TCP_async_event_refused, /* name */ +be_local_closure(Matter_TCP_async_event_listening, /* name */ be_nested_proto( 1, /* nstack */ 1, /* argc */ @@ -677,7 +262,7 @@ be_local_closure(Matter_TCP_async_event_refused, /* name */ NULL, /* no sub protos */ 0, /* has constants */ NULL, /* no const */ - be_str_weak(event_refused), + be_str_weak(event_listening), &be_const_str_solidified, ( &(const binstruction[ 1]) { /* code */ 0x80000000, // 0000 RET 0 @@ -688,9 +273,144 @@ be_local_closure(Matter_TCP_async_event_refused, /* name */ /******************************************************************** -** Solidified function: event_dnsfailed +** Solidified function: get_timeout ********************************************************************/ -be_local_closure(Matter_TCP_async_event_dnsfailed, /* name */ +be_local_closure(Matter_TCP_async_get_timeout, /* name */ + be_nested_proto( + 2, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 1]) { /* constants */ + /* K0 */ be_nested_str_weak(timeout), + }), + be_str_weak(get_timeout), + &be_const_str_solidified, + ( &(const binstruction[ 2]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x80040200, // 0001 RET 1 R1 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: init +********************************************************************/ +be_local_closure(Matter_TCP_async_init, /* name */ + be_nested_proto( + 7, /* nstack */ + 5, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 1, /* has sup protos */ + ( &(const struct bproto*[ 1]) { + be_nested_proto( + 2, /* nstack */ + 0, /* argc */ + 0, /* varg */ + 1, /* has upvals */ + ( &(const bupvaldesc[ 1]) { /* upvals */ + be_local_const_upval(1, 0), + }), + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 1]) { /* constants */ + /* K0 */ be_nested_str_weak(loop), + }), + be_str_weak(_X3Clambda_X3E), + &be_const_str_solidified, + ( &(const binstruction[ 4]) { /* code */ + 0x68000000, // 0000 GETUPV R0 U0 + 0x8C000100, // 0001 GETMET R0 R0 K0 + 0x7C000200, // 0002 CALL R0 1 + 0x80040000, // 0003 RET 1 R0 + }) + ), + }), + 1, /* has constants */ + ( &(const bvalue[ 7]) { /* constants */ + /* K0 */ be_nested_str_weak(TIMEOUT), + /* K1 */ be_nested_str_weak(addr), + /* K2 */ be_nested_str_weak(port), + /* K3 */ be_nested_str_weak(timeout), + /* K4 */ be_nested_str_weak(tcp), + /* K5 */ be_nested_str_weak(tcpclientasync), + /* K6 */ be_nested_str_weak(fast_loop), + }), + be_str_weak(init), + &be_const_str_solidified, + ( &(const binstruction[25]) { /* code */ + 0x4C140000, // 0000 LDNIL R5 + 0x1C140605, // 0001 EQ R5 R3 R5 + 0x78160000, // 0002 JMPF R5 #0004 + 0x880C0100, // 0003 GETMBR R3 R0 K0 + 0x4C140000, // 0004 LDNIL R5 + 0x1C140405, // 0005 EQ R5 R2 R5 + 0x78160000, // 0006 JMPF R5 #0008 + 0x540A004F, // 0007 LDINT R2 80 + 0x60140008, // 0008 GETGBL R5 G8 + 0x5C180200, // 0009 MOVE R6 R1 + 0x7C140200, // 000A CALL R5 1 + 0x90020205, // 000B SETMBR R0 K1 R5 + 0x60140009, // 000C GETGBL R5 G9 + 0x5C180400, // 000D MOVE R6 R2 + 0x7C140200, // 000E CALL R5 1 + 0x90020405, // 000F SETMBR R0 K2 R5 + 0x90020603, // 0010 SETMBR R0 K3 R3 + 0xB8160A00, // 0011 GETNGBL R5 K5 + 0x7C140000, // 0012 CALL R5 0 + 0x90020805, // 0013 SETMBR R0 K4 R5 + 0x78120001, // 0014 JMPF R4 #0017 + 0x84140000, // 0015 CLOSURE R5 P0 + 0x90020C05, // 0016 SETMBR R0 K6 R5 + 0xA0000000, // 0017 CLOSE R0 + 0x80000000, // 0018 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: every_50ms +********************************************************************/ +be_local_closure(Matter_TCP_async_every_50ms, /* name */ + be_nested_proto( + 3, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 1]) { /* constants */ + /* K0 */ be_nested_str_weak(loop), + }), + be_str_weak(every_50ms), + &be_const_str_solidified, + ( &(const binstruction[ 3]) { /* code */ + 0x8C040100, // 0000 GETMET R1 R0 K0 + 0x7C040200, // 0001 CALL R1 1 + 0x80000000, // 0002 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: event_timeout +********************************************************************/ +be_local_closure(Matter_TCP_async_event_timeout, /* name */ be_nested_proto( 1, /* nstack */ 1, /* argc */ @@ -701,7 +421,7 @@ be_local_closure(Matter_TCP_async_event_dnsfailed, /* name */ NULL, /* no sub protos */ 0, /* has constants */ NULL, /* no const */ - be_str_weak(event_dnsfailed), + be_str_weak(event_timeout), &be_const_str_solidified, ( &(const binstruction[ 1]) { /* code */ 0x80000000, // 0000 RET 0 @@ -735,6 +455,321 @@ be_local_closure(Matter_TCP_async_event_available, /* name */ /*******************************************************************/ +/******************************************************************** +** Solidified function: write +********************************************************************/ +be_local_closure(Matter_TCP_async_write, /* name */ + be_nested_proto( + 5, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 4]) { /* constants */ + /* K0 */ be_nested_str_weak(tcp_connected), + /* K1 */ be_nested_str_weak(tcp), + /* K2 */ be_nested_str_weak(write), + /* K3 */ be_const_int(0), + }), + be_str_weak(write), + &be_const_str_solidified, + ( &(const binstruction[ 8]) { /* code */ + 0x88080100, // 0000 GETMBR R2 R0 K0 + 0x780A0004, // 0001 JMPF R2 #0007 + 0x88080101, // 0002 GETMBR R2 R0 K1 + 0x8C080502, // 0003 GETMET R2 R2 K2 + 0x5C100200, // 0004 MOVE R4 R1 + 0x7C080400, // 0005 CALL R2 2 + 0x80040400, // 0006 RET 1 R2 + 0x80060600, // 0007 RET 1 K3 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: event_established +********************************************************************/ +be_local_closure(Matter_TCP_async_event_established, /* name */ + be_nested_proto( + 1, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 0, /* has constants */ + NULL, /* no const */ + be_str_weak(event_established), + &be_const_str_solidified, + ( &(const binstruction[ 1]) { /* code */ + 0x80000000, // 0000 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: reset +********************************************************************/ +be_local_closure(Matter_TCP_async_reset, /* name */ + be_nested_proto( + 3, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 3]) { /* constants */ + /* K0 */ be_nested_str_weak(tcp), + /* K1 */ be_nested_str_weak(close), + /* K2 */ be_nested_str_weak(tcp_connected), + }), + be_str_weak(reset), + &be_const_str_solidified, + ( &(const binstruction[ 6]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x8C040301, // 0001 GETMET R1 R1 K1 + 0x7C040200, // 0002 CALL R1 1 + 0x4C040000, // 0003 LDNIL R1 + 0x90020401, // 0004 SETMBR R0 K2 R1 + 0x80000000, // 0005 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: loop +********************************************************************/ +be_local_closure(Matter_TCP_async_loop, /* name */ + be_nested_proto( + 4, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[18]) { /* constants */ + /* K0 */ be_nested_str_weak(tcp_connected), + /* K1 */ be_nested_str_weak(status), + /* K2 */ be_nested_str_weak(close), + /* K3 */ be_nested_str_weak(tcp), + /* K4 */ be_nested_str_weak(connected), + /* K5 */ be_const_int(1), + /* K6 */ be_nested_str_weak(event_established), + /* K7 */ be_nested_str_weak(event_refused), + /* K8 */ be_nested_str_weak(tasmota), + /* K9 */ be_nested_str_weak(millis), + /* K10 */ be_nested_str_weak(time_start), + /* K11 */ be_nested_str_weak(timeout), + /* K12 */ be_nested_str_weak(event_timeout), + /* K13 */ be_nested_str_weak(event_closed), + /* K14 */ be_nested_str_weak(available), + /* K15 */ be_nested_str_weak(event_available), + /* K16 */ be_nested_str_weak(listening), + /* K17 */ be_nested_str_weak(event_listening), + }), + be_str_weak(loop), + &be_const_str_solidified, + ( &(const binstruction[89]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x88080101, // 0001 GETMBR R2 R0 K1 + 0x4C0C0000, // 0002 LDNIL R3 + 0x1C080403, // 0003 EQ R2 R2 R3 + 0x780A0002, // 0004 JMPF R2 #0008 + 0x8C080102, // 0005 GETMET R2 R0 K2 + 0x7C080200, // 0006 CALL R2 1 + 0x80000400, // 0007 RET 0 + 0x88080103, // 0008 GETMBR R2 R0 K3 + 0x8C080504, // 0009 GETMET R2 R2 K4 + 0x7C080200, // 000A CALL R2 1 + 0x90020002, // 000B SETMBR R0 K0 R2 + 0x4C080000, // 000C LDNIL R2 + 0x1C080202, // 000D EQ R2 R1 R2 + 0x780A0021, // 000E JMPF R2 #0031 + 0x88080100, // 000F GETMBR R2 R0 K0 + 0x500C0200, // 0010 LDBOOL R3 1 0 + 0x1C080403, // 0011 EQ R2 R2 R3 + 0x780A0003, // 0012 JMPF R2 #0017 + 0x90020305, // 0013 SETMBR R0 K1 K5 + 0x8C080106, // 0014 GETMET R2 R0 K6 + 0x7C080200, // 0015 CALL R2 1 + 0x70020019, // 0016 JMP #0031 + 0x88080100, // 0017 GETMBR R2 R0 K0 + 0x500C0000, // 0018 LDBOOL R3 0 0 + 0x1C080403, // 0019 EQ R2 R2 R3 + 0x780A0007, // 001A JMPF R2 #0023 + 0x5409FFFD, // 001B LDINT R2 -2 + 0x90020202, // 001C SETMBR R0 K1 R2 + 0x8C080107, // 001D GETMET R2 R0 K7 + 0x7C080200, // 001E CALL R2 1 + 0x8C080102, // 001F GETMET R2 R0 K2 + 0x7C080200, // 0020 CALL R2 1 + 0x80000400, // 0021 RET 0 + 0x7002000D, // 0022 JMP #0031 + 0xB80A1000, // 0023 GETNGBL R2 K8 + 0x8C080509, // 0024 GETMET R2 R2 K9 + 0x7C080200, // 0025 CALL R2 1 + 0x880C010A, // 0026 GETMBR R3 R0 K10 + 0x04080403, // 0027 SUB R2 R2 R3 + 0x880C010B, // 0028 GETMBR R3 R0 K11 + 0x24080403, // 0029 GT R2 R2 R3 + 0x780A0005, // 002A JMPF R2 #0031 + 0x5409FFFC, // 002B LDINT R2 -3 + 0x90020202, // 002C SETMBR R0 K1 R2 + 0x50080000, // 002D LDBOOL R2 0 0 + 0x90020002, // 002E SETMBR R0 K0 R2 + 0x8C08010C, // 002F GETMET R2 R0 K12 + 0x7C080200, // 0030 CALL R2 1 + 0xB80A1000, // 0031 GETNGBL R2 K8 + 0x8C080509, // 0032 GETMET R2 R2 K9 + 0x7C080200, // 0033 CALL R2 1 + 0x880C010A, // 0034 GETMBR R3 R0 K10 + 0x04080403, // 0035 SUB R2 R2 R3 + 0x880C010B, // 0036 GETMBR R3 R0 K11 + 0x24080403, // 0037 GT R2 R2 R3 + 0x780A0006, // 0038 JMPF R2 #0040 + 0x8C080102, // 0039 GETMET R2 R0 K2 + 0x7C080200, // 003A CALL R2 1 + 0x5409FFFC, // 003B LDINT R2 -3 + 0x90020202, // 003C SETMBR R0 K1 R2 + 0x8C08010C, // 003D GETMET R2 R0 K12 + 0x7C080200, // 003E CALL R2 1 + 0x80000400, // 003F RET 0 + 0x88080100, // 0040 GETMBR R2 R0 K0 + 0x500C0000, // 0041 LDBOOL R3 0 0 + 0x1C080403, // 0042 EQ R2 R2 R3 + 0x780A0007, // 0043 JMPF R2 #004C + 0x50080200, // 0044 LDBOOL R2 1 0 + 0x1C080202, // 0045 EQ R2 R1 R2 + 0x780A0001, // 0046 JMPF R2 #0049 + 0x8C08010D, // 0047 GETMET R2 R0 K13 + 0x7C080200, // 0048 CALL R2 1 + 0x8C080102, // 0049 GETMET R2 R0 K2 + 0x7C080200, // 004A CALL R2 1 + 0x80000400, // 004B RET 0 + 0x88080103, // 004C GETMBR R2 R0 K3 + 0x8C08050E, // 004D GETMET R2 R2 K14 + 0x7C080200, // 004E CALL R2 1 + 0x780A0001, // 004F JMPF R2 #0052 + 0x8C08010F, // 0050 GETMET R2 R0 K15 + 0x7C080200, // 0051 CALL R2 1 + 0x88080103, // 0052 GETMBR R2 R0 K3 + 0x8C080510, // 0053 GETMET R2 R2 K16 + 0x7C080200, // 0054 CALL R2 1 + 0x780A0001, // 0055 JMPF R2 #0058 + 0x8C080111, // 0056 GETMET R2 R0 K17 + 0x7C080200, // 0057 CALL R2 1 + 0x80000000, // 0058 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: listening +********************************************************************/ +be_local_closure(Matter_TCP_async_listening, /* name */ + be_nested_proto( + 3, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 3]) { /* constants */ + /* K0 */ be_nested_str_weak(tcp_connected), + /* K1 */ be_nested_str_weak(tcp), + /* K2 */ be_nested_str_weak(listening), + }), + be_str_weak(listening), + &be_const_str_solidified, + ( &(const binstruction[ 8]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x78060003, // 0001 JMPF R1 #0006 + 0x88040101, // 0002 GETMBR R1 R0 K1 + 0x8C040302, // 0003 GETMET R1 R1 K2 + 0x7C040200, // 0004 CALL R1 1 + 0x80040200, // 0005 RET 1 R1 + 0x50040000, // 0006 LDBOOL R1 0 0 + 0x80040200, // 0007 RET 1 R1 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: set_timeout +********************************************************************/ +be_local_closure(Matter_TCP_async_set_timeout, /* name */ + be_nested_proto( + 3, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 2]) { /* constants */ + /* K0 */ be_nested_str_weak(TIMEOUT), + /* K1 */ be_nested_str_weak(timeout), + }), + be_str_weak(set_timeout), + &be_const_str_solidified, + ( &(const binstruction[ 6]) { /* code */ + 0x4C080000, // 0000 LDNIL R2 + 0x1C080202, // 0001 EQ R2 R1 R2 + 0x780A0000, // 0002 JMPF R2 #0004 + 0x88040100, // 0003 GETMBR R1 R0 K0 + 0x90020201, // 0004 SETMBR R0 K1 R1 + 0x80000000, // 0005 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: event_dnsfailed +********************************************************************/ +be_local_closure(Matter_TCP_async_event_dnsfailed, /* name */ + be_nested_proto( + 1, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 0, /* has constants */ + NULL, /* no const */ + be_str_weak(event_dnsfailed), + &be_const_str_solidified, + ( &(const binstruction[ 1]) { /* code */ + 0x80000000, // 0000 RET 0 + }) + ) +); +/*******************************************************************/ + + /******************************************************************** ** Solidified function: close ********************************************************************/ @@ -791,31 +826,23 @@ be_local_closure(Matter_TCP_async_close, /* name */ /******************************************************************** -** Solidified function: set_timeout +** Solidified function: event_refused ********************************************************************/ -be_local_closure(Matter_TCP_async_set_timeout, /* name */ +be_local_closure(Matter_TCP_async_event_refused, /* name */ be_nested_proto( - 3, /* nstack */ - 2, /* argc */ + 1, /* nstack */ + 1, /* argc */ 2, /* varg */ 0, /* has upvals */ NULL, /* no upvals */ 0, /* has sup protos */ NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 2]) { /* constants */ - /* K0 */ be_nested_str_weak(TIMEOUT), - /* K1 */ be_nested_str_weak(timeout), - }), - be_str_weak(set_timeout), + 0, /* has constants */ + NULL, /* no const */ + be_str_weak(event_refused), &be_const_str_solidified, - ( &(const binstruction[ 6]) { /* code */ - 0x4C080000, // 0000 LDNIL R2 - 0x1C080202, // 0001 EQ R2 R1 R2 - 0x780A0000, // 0002 JMPF R2 #0004 - 0x88040100, // 0003 GETMBR R1 R0 K0 - 0x90020201, // 0004 SETMBR R0 K1 R1 - 0x80000000, // 0005 RET 0 + ( &(const binstruction[ 1]) { /* code */ + 0x80000000, // 0000 RET 0 }) ) ); @@ -828,36 +855,37 @@ be_local_closure(Matter_TCP_async_set_timeout, /* name */ be_local_class(Matter_TCP_async, 8, NULL, - be_nested_map(28, + be_nested_map(29, ( (struct bmapnode*) &(const bmapnode[]) { - { be_const_key_weak(write, -1), be_const_closure(Matter_TCP_async_write_closure) }, - { be_const_key_weak(timeout, -1), be_const_var(2) }, - { be_const_key_weak(port, -1), be_const_var(1) }, - { be_const_key_weak(close, 7), be_const_closure(Matter_TCP_async_close_closure) }, - { be_const_key_weak(tcp, -1), be_const_var(3) }, - { be_const_key_weak(tcp_connected, -1), be_const_var(5) }, - { be_const_key_weak(listening, -1), be_const_closure(Matter_TCP_async_listening_closure) }, - { be_const_key_weak(event_available, -1), be_const_closure(Matter_TCP_async_event_available_closure) }, - { be_const_key_weak(readbytes, 1), be_const_closure(Matter_TCP_async_readbytes_closure) }, - { be_const_key_weak(event_dnsfailed, -1), be_const_closure(Matter_TCP_async_event_dnsfailed_closure) }, - { be_const_key_weak(event_established, -1), be_const_closure(Matter_TCP_async_event_established_closure) }, - { be_const_key_weak(event_refused, 21), be_const_closure(Matter_TCP_async_event_refused_closure) }, - { be_const_key_weak(reset, -1), be_const_closure(Matter_TCP_async_reset_closure) }, - { be_const_key_weak(event_listening, -1), be_const_closure(Matter_TCP_async_event_listening_closure) }, - { be_const_key_weak(event_timeout, -1), be_const_closure(Matter_TCP_async_event_timeout_closure) }, - { be_const_key_weak(status, 25), be_const_var(6) }, - { be_const_key_weak(every_50ms, 11), be_const_closure(Matter_TCP_async_every_50ms_closure) }, - { be_const_key_weak(read, -1), be_const_closure(Matter_TCP_async_read_closure) }, + { be_const_key_weak(read, 13), be_const_closure(Matter_TCP_async_read_closure) }, + { be_const_key_weak(addr, -1), be_const_var(0) }, + { be_const_key_weak(event_refused, -1), be_const_closure(Matter_TCP_async_event_refused_closure) }, { be_const_key_weak(begin, -1), be_const_closure(Matter_TCP_async_begin_closure) }, - { be_const_key_weak(init, 14), be_const_closure(Matter_TCP_async_init_closure) }, - { be_const_key_weak(available, -1), be_const_closure(Matter_TCP_async_available_closure) }, - { be_const_key_weak(event_closed, -1), be_const_closure(Matter_TCP_async_event_closed_closure) }, - { be_const_key_weak(addr, 9), be_const_var(0) }, - { be_const_key_weak(loop, 3), be_const_closure(Matter_TCP_async_loop_closure) }, - { be_const_key_weak(TIMEOUT, 5), be_const_int(1000) }, - { be_const_key_weak(time_start, -1), be_const_var(4) }, - { be_const_key_weak(fast_loop, 2), be_const_var(7) }, + { be_const_key_weak(readbytes, -1), be_const_closure(Matter_TCP_async_readbytes_closure) }, + { be_const_key_weak(event_closed, 11), be_const_closure(Matter_TCP_async_event_closed_closure) }, + { be_const_key_weak(event_listening, -1), be_const_closure(Matter_TCP_async_event_listening_closure) }, + { be_const_key_weak(tcp_connected, -1), be_const_var(5) }, + { be_const_key_weak(get_timeout, -1), be_const_closure(Matter_TCP_async_get_timeout_closure) }, + { be_const_key_weak(timeout, 18), be_const_var(2) }, + { be_const_key_weak(init, -1), be_const_closure(Matter_TCP_async_init_closure) }, + { be_const_key_weak(event_timeout, 6), be_const_closure(Matter_TCP_async_event_timeout_closure) }, { be_const_key_weak(set_timeout, -1), be_const_closure(Matter_TCP_async_set_timeout_closure) }, + { be_const_key_weak(listening, 23), be_const_closure(Matter_TCP_async_listening_closure) }, + { be_const_key_weak(tcp, -1), be_const_var(3) }, + { be_const_key_weak(event_available, -1), be_const_closure(Matter_TCP_async_event_available_closure) }, + { be_const_key_weak(write, -1), be_const_closure(Matter_TCP_async_write_closure) }, + { be_const_key_weak(event_established, -1), be_const_closure(Matter_TCP_async_event_established_closure) }, + { be_const_key_weak(TIMEOUT, 7), be_const_int(1000) }, + { be_const_key_weak(time_start, 22), be_const_var(4) }, + { be_const_key_weak(reset, -1), be_const_closure(Matter_TCP_async_reset_closure) }, + { be_const_key_weak(loop, -1), be_const_closure(Matter_TCP_async_loop_closure) }, + { be_const_key_weak(status, -1), be_const_var(6) }, + { be_const_key_weak(port, -1), be_const_var(1) }, + { be_const_key_weak(every_50ms, 12), be_const_closure(Matter_TCP_async_every_50ms_closure) }, + { be_const_key_weak(fast_loop, -1), be_const_var(7) }, + { be_const_key_weak(event_dnsfailed, -1), be_const_closure(Matter_TCP_async_event_dnsfailed_closure) }, + { be_const_key_weak(close, -1), be_const_closure(Matter_TCP_async_close_closure) }, + { be_const_key_weak(available, 2), be_const_closure(Matter_TCP_async_available_closure) }, })), be_str_weak(Matter_TCP_async) ); diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_UI.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_UI.h index 76d72c390..fe0022411 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_UI.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_UI.h @@ -6,247 +6,6 @@ extern const bclass be_class_Matter_UI; -/******************************************************************** -** Solidified function: show_plugins_configuration -********************************************************************/ -be_local_closure(Matter_UI_show_plugins_configuration, /* name */ - be_nested_proto( - 19, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[36]) { /* constants */ - /* K0 */ be_nested_str_weak(webserver), - /* K1 */ be_nested_str_weak(string), - /* K2 */ be_nested_str_weak(content_send), - /* K3 */ be_nested_str_weak(_X3Cfieldset_X3E_X3Clegend_X3E_X3Cb_X3E_X26nbsp_X3BCurrent_X20Configuration_X26nbsp_X3B_X3C_X2Fb_X3E_X3C_X2Flegend_X3E_X3Cp_X3E_X3C_X2Fp_X3E), - /* K4 */ be_nested_str_weak(_X3Cform_X20action_X3D_X27_X2Fmatterc_X27_X20method_X3D_X27post_X27), - /* K5 */ be_nested_str_weak(onsubmit_X3D_X27return_X20confirm_X28_X22This_X20will_X20RESET_X20the_X20configuration_X20to_X20the_X20default_X2E_X20You_X20will_X20need_X20to_X20associate_X20again_X2E_X22_X29_X3B_X27_X3E), - /* K6 */ be_nested_str_weak(_X3Cbutton_X20name_X3D_X27auto_X27_X20class_X3D_X27button_X20bred_X27_X3EReset_X20to_X20default_X3C_X2Fbutton_X3E_X3Cp_X3E_X3C_X2Fp_X3E_X3C_X2Fform_X3E), - /* K7 */ be_nested_str_weak(onsubmit_X3D_X27return_X20confirm_X28_X22Changing_X20the_X20configuration_X20requires_X20to_X20associate_X20again_X2E_X22_X29_X3B_X27_X3E), - /* K8 */ be_nested_str_weak(_X3Ctable_X20style_X3D_X27width_X3A100_X25_X27_X3E), - /* K9 */ be_nested_str_weak(_X3Ctr_X3E_X3Ctd_X20width_X3D_X2735_X27_X3E_X3Cb_X3EEp_X2E_X3C_X2Fb_X3E_X3C_X2Ftd_X3E_X3Ctd_X3E_X3Cb_X3EType_X3C_X2Fb_X3E_X3C_X2Ftd_X3E_X3Ctd_X3E_X3Cb_X3EParam_X3C_X2Fb_X3E_X3C_X2Ftd_X3E_X3C_X2Ftr_X3E), - /* K10 */ be_nested_str_weak(device), - /* K11 */ be_nested_str_weak(k2l_num), - /* K12 */ be_nested_str_weak(plugins_config), - /* K13 */ be_const_int(0), - /* K14 */ be_nested_str_weak(find), - /* K15 */ be_nested_str_weak(type), - /* K16 */ be_nested_str_weak(format), - /* K17 */ be_nested_str_weak(_X3Ctr_X3E_X3Ctd_X3E_X3Cinput_X20type_X3D_X27text_X27_X20name_X3D_X27ep_X2503i_X27_X20maxlength_X3D_X274_X27_X20size_X3D_X273_X27_X20value_X3D_X270_X27_X20readonly_X3E_X3C_X2Ftd_X3E), - /* K18 */ be_nested_str_weak(_X3Ctd_X3E_X3Cselect_X20name_X3D_X27pi_X2503i_X27_X3E), - /* K19 */ be_nested_str_weak(plugin_option), - /* K20 */ be_nested_str_weak(), - /* K21 */ be_nested_str_weak(_ROOT_TYPES), - /* K22 */ be_nested_str_weak(_X3C_X2Fselect_X3E_X3C_X2Ftd_X3E), - /* K23 */ be_nested_str_weak(_X3Ctd_X3E_X3Cfont_X20size_X3D_X27_X2D1_X27_X3E_X26nbsp_X3B_X3C_X2Ffont_X3E_X3C_X2Ftd_X3E), - /* K24 */ be_const_int(1), - /* K25 */ be_nested_str_weak(plugins_classes), - /* K26 */ be_nested_str_weak(ui_conf_to_string), - /* K27 */ be_nested_str_weak(_X3Ctr_X3E_X3Ctd_X3E_X3Cinput_X20type_X3D_X27text_X27_X20name_X3D_X27ep_X2503i_X27_X20maxlength_X3D_X274_X27_X20size_X3D_X273_X27_X20pattern_X3D_X27_X5B0_X2D9_X5D_X7B1_X2C4_X7D_X27_X20value_X3D_X27_X25i_X27_X3E_X3C_X2Ftd_X3E), - /* K28 */ be_nested_str_weak(_CLASSES_TYPES), - /* K29 */ be_nested_str_weak(_X3Ctd_X3E_X3Cfont_X20size_X3D_X27_X2D1_X27_X3E_X3Cinput_X20type_X3D_X27text_X27_X20name_X3D_X27arg_X2503i_X27_X20minlength_X3D_X270_X27_X20size_X3D_X278_X27_X20value_X3D_X27_X25s_X27_X3E_X3C_X2Ffont_X3E_X3C_X2Ftd_X3E), - /* K30 */ be_nested_str_weak(html_escape), - /* K31 */ be_nested_str_weak(_X3Ctr_X3E_X3Ctd_X3E_X3Cinput_X20type_X3D_X27text_X27_X20name_X3D_X27ep_X2503i_X27_X20maxlength_X3D_X274_X27_X20size_X3D_X273_X27_X20pattern_X3D_X27_X5B0_X2D9_X5D_X7B1_X2C4_X7D_X27_X20value_X3D_X27_X27_X3E_X3C_X2Ftd_X3E), - /* K32 */ be_nested_str_weak(_X3Ctd_X3E_X3Cfont_X20size_X3D_X27_X2D1_X27_X3E_X3Cinput_X20type_X3D_X27text_X27_X20name_X3D_X27arg_X2503i_X27_X20minlength_X3D_X270_X27_X20size_X3D_X278_X27_X20value_X3D_X27_X27_X3E_X3C_X2Ffont_X3E_X3C_X2Ftd_X3E), - /* K33 */ be_nested_str_weak(_X3C_X2Ftable_X3E_X3Cp_X3E_X3C_X2Fp_X3E), - /* K34 */ be_nested_str_weak(_X3Cbutton_X20name_X3D_X27config_X27_X20class_X3D_X27button_X20bgrn_X27_X3EChange_X20configuration_X3C_X2Fbutton_X3E_X3C_X2Fform_X3E), - /* K35 */ be_nested_str_weak(_X3Cp_X3E_X3C_X2Fp_X3E_X3C_X2Ffieldset_X3E_X3Cp_X3E_X3C_X2Fp_X3E), - }), - be_str_weak(show_plugins_configuration), - &be_const_str_solidified, - ( &(const binstruction[181]) { /* code */ - 0xA4060000, // 0000 IMPORT R1 K0 - 0xA40A0200, // 0001 IMPORT R2 K1 - 0x8C0C0302, // 0002 GETMET R3 R1 K2 - 0x58140003, // 0003 LDCONST R5 K3 - 0x7C0C0400, // 0004 CALL R3 2 - 0x8C0C0302, // 0005 GETMET R3 R1 K2 - 0x58140004, // 0006 LDCONST R5 K4 - 0x7C0C0400, // 0007 CALL R3 2 - 0x8C0C0302, // 0008 GETMET R3 R1 K2 - 0x58140005, // 0009 LDCONST R5 K5 - 0x7C0C0400, // 000A CALL R3 2 - 0x8C0C0302, // 000B GETMET R3 R1 K2 - 0x58140006, // 000C LDCONST R5 K6 - 0x7C0C0400, // 000D CALL R3 2 - 0x8C0C0302, // 000E GETMET R3 R1 K2 - 0x58140004, // 000F LDCONST R5 K4 - 0x7C0C0400, // 0010 CALL R3 2 - 0x8C0C0302, // 0011 GETMET R3 R1 K2 - 0x58140007, // 0012 LDCONST R5 K7 - 0x7C0C0400, // 0013 CALL R3 2 - 0x8C0C0302, // 0014 GETMET R3 R1 K2 - 0x58140008, // 0015 LDCONST R5 K8 - 0x7C0C0400, // 0016 CALL R3 2 - 0x8C0C0302, // 0017 GETMET R3 R1 K2 - 0x58140009, // 0018 LDCONST R5 K9 - 0x7C0C0400, // 0019 CALL R3 2 - 0x880C010A, // 001A GETMBR R3 R0 K10 - 0x8C0C070B, // 001B GETMET R3 R3 K11 - 0x8814010A, // 001C GETMBR R5 R0 K10 - 0x88140B0C, // 001D GETMBR R5 R5 K12 - 0x7C0C0400, // 001E CALL R3 2 - 0x5810000D, // 001F LDCONST R4 K13 - 0x9414070D, // 0020 GETIDX R5 R3 K13 - 0x1C140B0D, // 0021 EQ R5 R5 K13 - 0x78160026, // 0022 JMPF R5 #004A - 0x94140604, // 0023 GETIDX R5 R3 R4 - 0x8818010A, // 0024 GETMBR R6 R0 K10 - 0x601C0008, // 0025 GETGBL R7 G8 - 0x5C200A00, // 0026 MOVE R8 R5 - 0x7C1C0200, // 0027 CALL R7 1 - 0x88180D0C, // 0028 GETMBR R6 R6 K12 - 0x94180C07, // 0029 GETIDX R6 R6 R7 - 0x8C200D0E, // 002A GETMET R8 R6 K14 - 0x5828000F, // 002B LDCONST R10 K15 - 0x7C200400, // 002C CALL R8 2 - 0x5C1C1000, // 002D MOVE R7 R8 - 0x8C200302, // 002E GETMET R8 R1 K2 - 0x8C280510, // 002F GETMET R10 R2 K16 - 0x58300011, // 0030 LDCONST R12 K17 - 0x5C340800, // 0031 MOVE R13 R4 - 0x7C280600, // 0032 CALL R10 3 - 0x7C200400, // 0033 CALL R8 2 - 0x8C200302, // 0034 GETMET R8 R1 K2 - 0x8C280510, // 0035 GETMET R10 R2 K16 - 0x58300012, // 0036 LDCONST R12 K18 - 0x5C340800, // 0037 MOVE R13 R4 - 0x7C280600, // 0038 CALL R10 3 - 0x7C200400, // 0039 CALL R8 2 - 0x8C200113, // 003A GETMET R8 R0 K19 - 0x8C280D0E, // 003B GETMET R10 R6 K14 - 0x5830000F, // 003C LDCONST R12 K15 - 0x58340014, // 003D LDCONST R13 K20 - 0x7C280600, // 003E CALL R10 3 - 0x882C0115, // 003F GETMBR R11 R0 K21 - 0x7C200600, // 0040 CALL R8 3 - 0x8C200302, // 0041 GETMET R8 R1 K2 - 0x8C280510, // 0042 GETMET R10 R2 K16 - 0x58300016, // 0043 LDCONST R12 K22 - 0x7C280400, // 0044 CALL R10 2 - 0x7C200400, // 0045 CALL R8 2 - 0x8C200302, // 0046 GETMET R8 R1 K2 - 0x58280017, // 0047 LDCONST R10 K23 - 0x7C200400, // 0048 CALL R8 2 - 0x00100918, // 0049 ADD R4 R4 K24 - 0x6014000C, // 004A GETGBL R5 G12 - 0x5C180600, // 004B MOVE R6 R3 - 0x7C140200, // 004C CALL R5 1 - 0x14140805, // 004D LT R5 R4 R5 - 0x78160040, // 004E JMPF R5 #0090 - 0x94140604, // 004F GETIDX R5 R3 R4 - 0x8818010A, // 0050 GETMBR R6 R0 K10 - 0x601C0008, // 0051 GETGBL R7 G8 - 0x5C200A00, // 0052 MOVE R8 R5 - 0x7C1C0200, // 0053 CALL R7 1 - 0x88180D0C, // 0054 GETMBR R6 R6 K12 - 0x94180C07, // 0055 GETIDX R6 R6 R7 - 0x8C200D0E, // 0056 GETMET R8 R6 K14 - 0x5828000F, // 0057 LDCONST R10 K15 - 0x7C200400, // 0058 CALL R8 2 - 0x5C1C1000, // 0059 MOVE R7 R8 - 0x5C200E00, // 005A MOVE R8 R7 - 0x74220001, // 005B JMPT R8 #005E - 0x00100918, // 005C ADD R4 R4 K24 - 0x7001FFEB, // 005D JMP #004A - 0x8820010A, // 005E GETMBR R8 R0 K10 - 0x88201119, // 005F GETMBR R8 R8 K25 - 0x8C20110E, // 0060 GETMET R8 R8 K14 - 0x5C280E00, // 0061 MOVE R10 R7 - 0x7C200400, // 0062 CALL R8 2 - 0x58240014, // 0063 LDCONST R9 K20 - 0x4C280000, // 0064 LDNIL R10 - 0x2028100A, // 0065 NE R10 R8 R10 - 0x782A0004, // 0066 JMPF R10 #006C - 0x8C28111A, // 0067 GETMET R10 R8 K26 - 0x5C301000, // 0068 MOVE R12 R8 - 0x5C340C00, // 0069 MOVE R13 R6 - 0x7C280600, // 006A CALL R10 3 - 0x5C241400, // 006B MOVE R9 R10 - 0x8C280302, // 006C GETMET R10 R1 K2 - 0x8C300510, // 006D GETMET R12 R2 K16 - 0x5838001B, // 006E LDCONST R14 K27 - 0x5C3C0800, // 006F MOVE R15 R4 - 0x5C400A00, // 0070 MOVE R16 R5 - 0x7C300800, // 0071 CALL R12 4 - 0x7C280400, // 0072 CALL R10 2 - 0x8C280302, // 0073 GETMET R10 R1 K2 - 0x8C300510, // 0074 GETMET R12 R2 K16 - 0x58380012, // 0075 LDCONST R14 K18 - 0x5C3C0800, // 0076 MOVE R15 R4 - 0x7C300600, // 0077 CALL R12 3 - 0x7C280400, // 0078 CALL R10 2 - 0x8C280113, // 0079 GETMET R10 R0 K19 - 0x8C300D0E, // 007A GETMET R12 R6 K14 - 0x5838000F, // 007B LDCONST R14 K15 - 0x583C0014, // 007C LDCONST R15 K20 - 0x7C300600, // 007D CALL R12 3 - 0x8834011C, // 007E GETMBR R13 R0 K28 - 0x7C280600, // 007F CALL R10 3 - 0x8C280302, // 0080 GETMET R10 R1 K2 - 0x8C300510, // 0081 GETMET R12 R2 K16 - 0x58380016, // 0082 LDCONST R14 K22 - 0x7C300400, // 0083 CALL R12 2 - 0x7C280400, // 0084 CALL R10 2 - 0x8C280302, // 0085 GETMET R10 R1 K2 - 0x8C300510, // 0086 GETMET R12 R2 K16 - 0x5838001D, // 0087 LDCONST R14 K29 - 0x5C3C0800, // 0088 MOVE R15 R4 - 0x8C40031E, // 0089 GETMET R16 R1 K30 - 0x5C481200, // 008A MOVE R18 R9 - 0x7C400400, // 008B CALL R16 2 - 0x7C300800, // 008C CALL R12 4 - 0x7C280400, // 008D CALL R10 2 - 0x00100918, // 008E ADD R4 R4 K24 - 0x7001FFB9, // 008F JMP #004A - 0x8C140302, // 0090 GETMET R5 R1 K2 - 0x8C1C0510, // 0091 GETMET R7 R2 K16 - 0x5824001F, // 0092 LDCONST R9 K31 - 0x5C280800, // 0093 MOVE R10 R4 - 0x7C1C0600, // 0094 CALL R7 3 - 0x7C140400, // 0095 CALL R5 2 - 0x8C140302, // 0096 GETMET R5 R1 K2 - 0x8C1C0510, // 0097 GETMET R7 R2 K16 - 0x58240012, // 0098 LDCONST R9 K18 - 0x5C280800, // 0099 MOVE R10 R4 - 0x7C1C0600, // 009A CALL R7 3 - 0x7C140400, // 009B CALL R5 2 - 0x8C140113, // 009C GETMET R5 R0 K19 - 0x581C0014, // 009D LDCONST R7 K20 - 0x8820011C, // 009E GETMBR R8 R0 K28 - 0x7C140600, // 009F CALL R5 3 - 0x8C140302, // 00A0 GETMET R5 R1 K2 - 0x8C1C0510, // 00A1 GETMET R7 R2 K16 - 0x58240016, // 00A2 LDCONST R9 K22 - 0x7C1C0400, // 00A3 CALL R7 2 - 0x7C140400, // 00A4 CALL R5 2 - 0x8C140302, // 00A5 GETMET R5 R1 K2 - 0x8C1C0510, // 00A6 GETMET R7 R2 K16 - 0x58240020, // 00A7 LDCONST R9 K32 - 0x5C280800, // 00A8 MOVE R10 R4 - 0x7C1C0600, // 00A9 CALL R7 3 - 0x7C140400, // 00AA CALL R5 2 - 0x8C140302, // 00AB GETMET R5 R1 K2 - 0x581C0021, // 00AC LDCONST R7 K33 - 0x7C140400, // 00AD CALL R5 2 - 0x8C140302, // 00AE GETMET R5 R1 K2 - 0x581C0022, // 00AF LDCONST R7 K34 - 0x7C140400, // 00B0 CALL R5 2 - 0x8C140302, // 00B1 GETMET R5 R1 K2 - 0x581C0023, // 00B2 LDCONST R7 K35 - 0x7C140400, // 00B3 CALL R5 2 - 0x80000000, // 00B4 RET 0 - }) - ) -); -/*******************************************************************/ - - /******************************************************************** ** Solidified function: page_part_mgr ********************************************************************/ @@ -312,11 +71,109 @@ be_local_closure(Matter_UI_page_part_mgr, /* name */ /******************************************************************** -** Solidified function: show_commissioning_info +** Solidified function: plugin_option ********************************************************************/ -be_local_closure(Matter_UI_show_commissioning_info, /* name */ +be_local_closure(Matter_UI_plugin_option, /* name */ be_nested_proto( - 14, /* nstack */ + 17, /* nstack */ + 3, /* argc */ + 3, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[17]) { /* constants */ + /* K0 */ be_nested_str_weak(webserver), + /* K1 */ be_nested_str_weak(string), + /* K2 */ be_nested_str_weak(split), + /* K3 */ be_nested_str_weak(_X7C), + /* K4 */ be_nested_str_weak(stop_iteration), + /* K5 */ be_const_int(0), + /* K6 */ be_nested_str_weak(), + /* K7 */ be_nested_str_weak(content_send), + /* K8 */ be_nested_str_weak(_X3Coption_X20value_X3D_X27_X27_X3E_X3C_X2Foption_X3E), + /* K9 */ be_nested_str_weak(_X2Dhttp), + /* K10 */ be_nested_str_weak(_X3Coption_X20value_X3D_X27_X27_X20disabled_X3E_X2D_X2D_X2D_X20Tasmota_X20Remote_X20_X2D_X2D_X2D_X3C_X2Foption_X3E), + /* K11 */ be_nested_str_weak(device), + /* K12 */ be_nested_str_weak(get_plugin_class_displayname), + /* K13 */ be_nested_str_weak(format), + /* K14 */ be_nested_str_weak(_X3Coption_X20value_X3D_X27_X25s_X27_X25s_X3E_X25s_X3C_X2Foption_X3E), + /* K15 */ be_nested_str_weak(_X20selected), + /* K16 */ be_const_int(1), + }), + be_str_weak(plugin_option), + &be_const_str_solidified, + ( &(const binstruction[57]) { /* code */ + 0xA40E0000, // 0000 IMPORT R3 K0 + 0xA4120200, // 0001 IMPORT R4 K1 + 0x60140012, // 0002 GETGBL R5 G18 + 0x7C140000, // 0003 CALL R5 0 + 0x60180010, // 0004 GETGBL R6 G16 + 0x5C1C0400, // 0005 MOVE R7 R2 + 0x7C180200, // 0006 CALL R6 1 + 0xA8020007, // 0007 EXBLK 0 #0010 + 0x5C1C0C00, // 0008 MOVE R7 R6 + 0x7C1C0000, // 0009 CALL R7 0 + 0x8C200902, // 000A GETMET R8 R4 K2 + 0x5C280E00, // 000B MOVE R10 R7 + 0x582C0003, // 000C LDCONST R11 K3 + 0x7C200600, // 000D CALL R8 3 + 0x00140A08, // 000E ADD R5 R5 R8 + 0x7001FFF7, // 000F JMP #0008 + 0x58180004, // 0010 LDCONST R6 K4 + 0xAC180200, // 0011 CATCH R6 1 0 + 0xB0080000, // 0012 RAISE 2 R0 R0 + 0x58180005, // 0013 LDCONST R6 K5 + 0x601C000C, // 0014 GETGBL R7 G12 + 0x5C200A00, // 0015 MOVE R8 R5 + 0x7C1C0200, // 0016 CALL R7 1 + 0x141C0C07, // 0017 LT R7 R6 R7 + 0x781E001E, // 0018 JMPF R7 #0038 + 0x941C0A06, // 0019 GETIDX R7 R5 R6 + 0x1C200F06, // 001A EQ R8 R7 K6 + 0x78220003, // 001B JMPF R8 #0020 + 0x8C200707, // 001C GETMET R8 R3 K7 + 0x58280008, // 001D LDCONST R10 K8 + 0x7C200400, // 001E CALL R8 2 + 0x70020015, // 001F JMP #0036 + 0x1C200F09, // 0020 EQ R8 R7 K9 + 0x78220003, // 0021 JMPF R8 #0026 + 0x8C200707, // 0022 GETMET R8 R3 K7 + 0x5828000A, // 0023 LDCONST R10 K10 + 0x7C200400, // 0024 CALL R8 2 + 0x7002000F, // 0025 JMP #0036 + 0x8820010B, // 0026 GETMBR R8 R0 K11 + 0x8C20110C, // 0027 GETMET R8 R8 K12 + 0x5C280E00, // 0028 MOVE R10 R7 + 0x7C200400, // 0029 CALL R8 2 + 0x8C240707, // 002A GETMET R9 R3 K7 + 0x8C2C090D, // 002B GETMET R11 R4 K13 + 0x5834000E, // 002C LDCONST R13 K14 + 0x5C380E00, // 002D MOVE R14 R7 + 0x1C3C0E01, // 002E EQ R15 R7 R1 + 0x783E0001, // 002F JMPF R15 #0032 + 0x583C000F, // 0030 LDCONST R15 K15 + 0x70020000, // 0031 JMP #0033 + 0x583C0006, // 0032 LDCONST R15 K6 + 0x5C401000, // 0033 MOVE R16 R8 + 0x7C2C0A00, // 0034 CALL R11 5 + 0x7C240400, // 0035 CALL R9 2 + 0x00180D10, // 0036 ADD R6 R6 K16 + 0x7001FFDB, // 0037 JMP #0014 + 0x80000000, // 0038 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: show_bridge_status +********************************************************************/ +be_local_closure(Matter_UI_show_bridge_status, /* name */ + be_nested_proto( + 15, /* nstack */ 1, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -324,97 +181,139 @@ be_local_closure(Matter_UI_show_commissioning_info, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[20]) { /* constants */ + ( &(const bvalue[26]) { /* constants */ /* K0 */ be_nested_str_weak(webserver), /* K1 */ be_nested_str_weak(string), - /* K2 */ be_nested_str_weak(device), - /* K3 */ be_nested_str_weak(commissioning_open), - /* K4 */ be_nested_str_weak(tasmota), - /* K5 */ be_nested_str_weak(millis), - /* K6 */ be_const_int(0), - /* K7 */ be_nested_str_weak(content_send), - /* K8 */ be_nested_str_weak(format), - /* K9 */ be_nested_str_weak(_X3Cfieldset_X3E_X3Clegend_X3E_X3Cb_X3E_X26nbsp_X3BCommissioning_X20open_X20for_X20_X25i_X20min_X26nbsp_X3B_X3C_X2Fb_X3E_X3C_X2Flegend_X3E_X3Cp_X3E_X3C_X2Fp_X3E), - /* K10 */ be_nested_str_weak(compute_manual_pairing_code), - /* K11 */ be_nested_str_weak(_X3Cp_X3EManual_X20pairing_X20code_X3A_X3Cbr_X3E_X3Cb_X3E_X25s_X2D_X25s_X2D_X25s_X3C_X2Fb_X3E_X3C_X2Fp_X3E_X3Chr_X3E), - /* K12 */ be_const_int(3), - /* K13 */ be_const_int(2147483647), - /* K14 */ be_nested_str_weak(_X3Cdiv_X3E_X3Ccenter_X3E), - /* K15 */ be_nested_str_weak(compute_qrcode_content), - /* K16 */ be_nested_str_weak(show_qrcode), - /* K17 */ be_nested_str_weak(_X3Cp_X3E_X20_X25s_X3C_X2Fp_X3E), - /* K18 */ be_nested_str_weak(_X3C_X2Fdiv_X3E), - /* K19 */ be_nested_str_weak(_X3Cp_X3E_X3C_X2Fp_X3E_X3C_X2Ffieldset_X3E_X3Cp_X3E_X3C_X2Fp_X3E), + /* K2 */ be_const_int(0), + /* K3 */ be_nested_str_weak(device), + /* K4 */ be_nested_str_weak(plugins), + /* K5 */ be_nested_str_weak(matter), + /* K6 */ be_nested_str_weak(Plugin_Bridge_HTTP), + /* K7 */ be_nested_str_weak(http_remote), + /* K8 */ be_nested_str_weak(addr), + /* K9 */ be_nested_str_weak(contains), + /* K10 */ be_nested_str_weak(push), + /* K11 */ be_const_int(1), + /* K12 */ be_nested_str_weak(content_send), + /* K13 */ be_nested_str_weak(_X3Chr_X3E), + /* K14 */ be_nested_str_weak(_X3Ctable_X20style_X3D_X27width_X3A100_X25_X27_X3E), + /* K15 */ be_nested_str_weak(_STYLESHEET), + /* K16 */ be_nested_str_weak(keys), + /* K17 */ be_nested_str_weak(format), + /* K18 */ be_nested_str_weak(_X3Ctr_X20class_X3D_X27ztdm_X20htrm_X27_X3E_X3Ctd_X3E_X3Cb_X3E_X25s_X3C_X2Fb_X3E_X3C_X2Ftd_X3E), + /* K19 */ be_nested_str_weak(html_escape), + /* K20 */ be_nested_str_weak(web_last_seen), + /* K21 */ be_nested_str_weak(_X3Ctr_X20class_X3D_X27htrm_X27_X3E_X3Ctd_X20colspan_X3D_X272_X27_X3E), + /* K22 */ be_nested_str_weak(web_values), + /* K23 */ be_nested_str_weak(_X3C_X2Ftd_X3E_X3C_X2Ftr_X3E), + /* K24 */ be_nested_str_weak(stop_iteration), + /* K25 */ be_nested_str_weak(_X3C_X2Ftable_X3E_X3Chr_X3E), }), - be_str_weak(show_commissioning_info), + be_str_weak(show_bridge_status), &be_const_str_solidified, - ( &(const binstruction[66]) { /* code */ + ( &(const binstruction[102]) { /* code */ 0xA4060000, // 0000 IMPORT R1 K0 0xA40A0200, // 0001 IMPORT R2 K1 - 0x880C0102, // 0002 GETMBR R3 R0 K2 - 0x880C0703, // 0003 GETMBR R3 R3 K3 - 0xB8120800, // 0004 GETNGBL R4 K4 - 0x8C100905, // 0005 GETMET R4 R4 K5 - 0x7C100200, // 0006 CALL R4 1 - 0x040C0604, // 0007 SUB R3 R3 R4 - 0x541203E7, // 0008 LDINT R4 1000 - 0x0C0C0604, // 0009 DIV R3 R3 R4 - 0x14100706, // 000A LT R4 R3 K6 - 0x78120000, // 000B JMPF R4 #000D - 0x580C0006, // 000C LDCONST R3 K6 - 0x5412001D, // 000D LDINT R4 30 - 0x00100604, // 000E ADD R4 R3 R4 - 0x5416003B, // 000F LDINT R5 60 - 0x0C100805, // 0010 DIV R4 R4 R5 - 0x8C140307, // 0011 GETMET R5 R1 K7 - 0x8C1C0508, // 0012 GETMET R7 R2 K8 - 0x58240009, // 0013 LDCONST R9 K9 - 0x5C280800, // 0014 MOVE R10 R4 - 0x7C1C0600, // 0015 CALL R7 3 - 0x7C140400, // 0016 CALL R5 2 - 0x88140102, // 0017 GETMBR R5 R0 K2 - 0x8C140B0A, // 0018 GETMET R5 R5 K10 - 0x7C140200, // 0019 CALL R5 1 - 0x8C180307, // 001A GETMET R6 R1 K7 - 0x8C200508, // 001B GETMET R8 R2 K8 - 0x5828000B, // 001C LDCONST R10 K11 - 0x402E0D0C, // 001D CONNECT R11 K6 K12 - 0x942C0A0B, // 001E GETIDX R11 R5 R11 - 0x54320003, // 001F LDINT R12 4 - 0x54360005, // 0020 LDINT R13 6 - 0x4030180D, // 0021 CONNECT R12 R12 R13 - 0x94300A0C, // 0022 GETIDX R12 R5 R12 - 0x54360006, // 0023 LDINT R13 7 - 0x40341B0D, // 0024 CONNECT R13 R13 K13 - 0x94340A0D, // 0025 GETIDX R13 R5 R13 - 0x7C200A00, // 0026 CALL R8 5 - 0x7C180400, // 0027 CALL R6 2 - 0x8C180307, // 0028 GETMET R6 R1 K7 - 0x8C200508, // 0029 GETMET R8 R2 K8 - 0x5828000E, // 002A LDCONST R10 K14 - 0x7C200400, // 002B CALL R8 2 - 0x7C180400, // 002C CALL R6 2 - 0x88180102, // 002D GETMBR R6 R0 K2 - 0x8C180D0F, // 002E GETMET R6 R6 K15 - 0x7C180200, // 002F CALL R6 1 - 0x8C1C0110, // 0030 GETMET R7 R0 K16 - 0x5C240C00, // 0031 MOVE R9 R6 - 0x7C1C0400, // 0032 CALL R7 2 - 0x8C1C0307, // 0033 GETMET R7 R1 K7 - 0x8C240508, // 0034 GETMET R9 R2 K8 - 0x582C0011, // 0035 LDCONST R11 K17 - 0x5C300C00, // 0036 MOVE R12 R6 - 0x7C240600, // 0037 CALL R9 3 - 0x7C1C0400, // 0038 CALL R7 2 - 0x8C1C0307, // 0039 GETMET R7 R1 K7 - 0x8C240508, // 003A GETMET R9 R2 K8 - 0x582C0012, // 003B LDCONST R11 K18 - 0x7C240400, // 003C CALL R9 2 - 0x7C1C0400, // 003D CALL R7 2 - 0x8C1C0307, // 003E GETMET R7 R1 K7 - 0x58240013, // 003F LDCONST R9 K19 - 0x7C1C0400, // 0040 CALL R7 2 - 0x80000000, // 0041 RET 0 + 0x4C0C0000, // 0002 LDNIL R3 + 0x58100002, // 0003 LDCONST R4 K2 + 0x6014000C, // 0004 GETGBL R5 G12 + 0x88180103, // 0005 GETMBR R6 R0 K3 + 0x88180D04, // 0006 GETMBR R6 R6 K4 + 0x7C140200, // 0007 CALL R5 1 + 0x14140805, // 0008 LT R5 R4 R5 + 0x7816001D, // 0009 JMPF R5 #0028 + 0x88140103, // 000A GETMBR R5 R0 K3 + 0x88140B04, // 000B GETMBR R5 R5 K4 + 0x94140A04, // 000C GETIDX R5 R5 R4 + 0x6018000F, // 000D GETGBL R6 G15 + 0x5C1C0A00, // 000E MOVE R7 R5 + 0xB8220A00, // 000F GETNGBL R8 K5 + 0x88201106, // 0010 GETMBR R8 R8 K6 + 0x7C180400, // 0011 CALL R6 2 + 0x781A0012, // 0012 JMPF R6 #0026 + 0x4C180000, // 0013 LDNIL R6 + 0x1C180606, // 0014 EQ R6 R3 R6 + 0x781A0002, // 0015 JMPF R6 #0019 + 0x60180013, // 0016 GETGBL R6 G19 + 0x7C180000, // 0017 CALL R6 0 + 0x5C0C0C00, // 0018 MOVE R3 R6 + 0x88180B07, // 0019 GETMBR R6 R5 K7 + 0x88180D08, // 001A GETMBR R6 R6 K8 + 0x8C1C0709, // 001B GETMET R7 R3 K9 + 0x5C240C00, // 001C MOVE R9 R6 + 0x7C1C0400, // 001D CALL R7 2 + 0x741E0002, // 001E JMPT R7 #0022 + 0x601C0012, // 001F GETGBL R7 G18 + 0x7C1C0000, // 0020 CALL R7 0 + 0x980C0C07, // 0021 SETIDX R3 R6 R7 + 0x941C0606, // 0022 GETIDX R7 R3 R6 + 0x8C1C0F0A, // 0023 GETMET R7 R7 K10 + 0x5C240A00, // 0024 MOVE R9 R5 + 0x7C1C0400, // 0025 CALL R7 2 + 0x0010090B, // 0026 ADD R4 R4 K11 + 0x7001FFDB, // 0027 JMP #0004 + 0x4C140000, // 0028 LDNIL R5 + 0x1C140605, // 0029 EQ R5 R3 R5 + 0x78160000, // 002A JMPF R5 #002C + 0x80000A00, // 002B RET 0 + 0x8C14030C, // 002C GETMET R5 R1 K12 + 0x581C000D, // 002D LDCONST R7 K13 + 0x7C140400, // 002E CALL R5 2 + 0x8C14030C, // 002F GETMET R5 R1 K12 + 0x581C000E, // 0030 LDCONST R7 K14 + 0x7C140400, // 0031 CALL R5 2 + 0x8C14030C, // 0032 GETMET R5 R1 K12 + 0xB81E0A00, // 0033 GETNGBL R7 K5 + 0x881C0F0F, // 0034 GETMBR R7 R7 K15 + 0x7C140400, // 0035 CALL R5 2 + 0x60140010, // 0036 GETGBL R5 G16 + 0x8C180710, // 0037 GETMET R6 R3 K16 + 0x7C180200, // 0038 CALL R6 1 + 0x7C140200, // 0039 CALL R5 1 + 0xA8020023, // 003A EXBLK 0 #005F + 0x5C180A00, // 003B MOVE R6 R5 + 0x7C180000, // 003C CALL R6 0 + 0x8C1C030C, // 003D GETMET R7 R1 K12 + 0x8C240511, // 003E GETMET R9 R2 K17 + 0x582C0012, // 003F LDCONST R11 K18 + 0x8C300313, // 0040 GETMET R12 R1 K19 + 0x5C380C00, // 0041 MOVE R14 R6 + 0x7C300400, // 0042 CALL R12 2 + 0x7C240600, // 0043 CALL R9 3 + 0x7C1C0400, // 0044 CALL R7 2 + 0x941C0606, // 0045 GETIDX R7 R3 R6 + 0x941C0F02, // 0046 GETIDX R7 R7 K2 + 0x881C0F07, // 0047 GETMBR R7 R7 K7 + 0x8C20030C, // 0048 GETMET R8 R1 K12 + 0x8C280F14, // 0049 GETMET R10 R7 K20 + 0x7C280200, // 004A CALL R10 1 + 0x7C200400, // 004B CALL R8 2 + 0x60200010, // 004C GETGBL R8 G16 + 0x94240606, // 004D GETIDX R9 R3 R6 + 0x7C200200, // 004E CALL R8 1 + 0xA802000A, // 004F EXBLK 0 #005B + 0x5C241000, // 0050 MOVE R9 R8 + 0x7C240000, // 0051 CALL R9 0 + 0x8C28030C, // 0052 GETMET R10 R1 K12 + 0x58300015, // 0053 LDCONST R12 K21 + 0x7C280400, // 0054 CALL R10 2 + 0x8C281316, // 0055 GETMET R10 R9 K22 + 0x7C280200, // 0056 CALL R10 1 + 0x8C28030C, // 0057 GETMET R10 R1 K12 + 0x58300017, // 0058 LDCONST R12 K23 + 0x7C280400, // 0059 CALL R10 2 + 0x7001FFF4, // 005A JMP #0050 + 0x58200018, // 005B LDCONST R8 K24 + 0xAC200200, // 005C CATCH R8 1 0 + 0xB0080000, // 005D RAISE 2 R0 R0 + 0x7001FFDB, // 005E JMP #003B + 0x58140018, // 005F LDCONST R5 K24 + 0xAC140200, // 0060 CATCH R5 1 0 + 0xB0080000, // 0061 RAISE 2 R0 R0 + 0x8C14030C, // 0062 GETMET R5 R1 K12 + 0x581C0019, // 0063 LDCONST R7 K25 + 0x7C140400, // 0064 CALL R5 2 + 0x80000000, // 0065 RET 0 }) ) ); @@ -422,88 +321,165 @@ be_local_closure(Matter_UI_show_commissioning_info, /* name */ /******************************************************************** -** Solidified function: web_add_handler +** Solidified function: show_qrcode ********************************************************************/ -be_local_closure(Matter_UI_web_add_handler, /* name */ +be_local_closure(Matter_UI_show_qrcode, /* name */ be_nested_proto( - 7, /* nstack */ - 1, /* argc */ + 18, /* nstack */ + 2, /* argc */ 2, /* varg */ 0, /* has upvals */ NULL, /* no upvals */ - 1, /* has sup protos */ - ( &(const struct bproto*[ 2]) { - be_nested_proto( - 2, /* nstack */ - 0, /* argc */ - 0, /* varg */ - 1, /* has upvals */ - ( &(const bupvaldesc[ 1]) { /* upvals */ - be_local_const_upval(1, 0), - }), - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 1]) { /* constants */ - /* K0 */ be_nested_str_weak(page_part_mgr), - }), - be_str_weak(_X3Clambda_X3E), - &be_const_str_solidified, - ( &(const binstruction[ 4]) { /* code */ - 0x68000000, // 0000 GETUPV R0 U0 - 0x8C000100, // 0001 GETMET R0 R0 K0 - 0x7C000200, // 0002 CALL R0 1 - 0x80040000, // 0003 RET 1 R0 - }) - ), - be_nested_proto( - 2, /* nstack */ - 0, /* argc */ - 0, /* varg */ - 1, /* has upvals */ - ( &(const bupvaldesc[ 1]) { /* upvals */ - be_local_const_upval(1, 0), - }), - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 1]) { /* constants */ - /* K0 */ be_nested_str_weak(page_part_ctl), - }), - be_str_weak(_X3Clambda_X3E), - &be_const_str_solidified, - ( &(const binstruction[ 4]) { /* code */ - 0x68000000, // 0000 GETUPV R0 U0 - 0x8C000100, // 0001 GETMET R0 R0 K0 - 0x7C000200, // 0002 CALL R0 1 - 0x80040000, // 0003 RET 1 R0 - }) - ), - }), + 0, /* has sup protos */ + NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[ 5]) { /* constants */ + ( &(const bvalue[22]) { /* constants */ /* K0 */ be_nested_str_weak(webserver), - /* K1 */ be_nested_str_weak(on), - /* K2 */ be_nested_str_weak(_X2Fmatterc), - /* K3 */ be_nested_str_weak(HTTP_GET), - /* K4 */ be_nested_str_weak(HTTP_POST), + /* K1 */ be_nested_str_weak(_X20), + /* K2 */ be_nested_str_weak(_XE2_X96_X84), + /* K3 */ be_nested_str_weak(_XE2_X96_X80), + /* K4 */ be_nested_str_weak(_XE2_X96_X88), + /* K5 */ be_nested_str_weak(matter), + /* K6 */ be_nested_str_weak(QRCode), + /* K7 */ be_nested_str_weak(encode_str), + /* K8 */ be_nested_str_weak(bitmap), + /* K9 */ be_nested_str_weak(size), + /* K10 */ be_nested_str_weak(content_send), + /* K11 */ be_nested_str_weak(_X3Cstyle_X3E_X2Eqr_X7Bfont_X2Dfamily_X3Amonospace_X3B_X20margin_X3A0_X3B_X20padding_X3A0_X3B_X20white_X2Dspace_X3Apre_X3B_X20font_X2Dsize_X3A18px_X3B_X20color_X3A_X23fff_X3B_X20line_X2Dheight_X3A100_X25_X3B_X7D_X3C_X2Fstyle_X3E), + /* K12 */ be_nested_str_weak(_X3Cdiv_X20style_X3D_X27transform_X3Ascale_X28_X2E8_X2C1_X29_X3B_X20display_X3Ainline_X2Dblock_X3B_X27_X3E), + /* K13 */ be_nested_str_weak(_X3Cdiv_X20class_X3D_X27qr_X27_X3E), + /* K14 */ be_nested_str_weak(), + /* K15 */ be_const_int(0), + /* K16 */ be_const_int(1), + /* K17 */ be_nested_str_weak(stop_iteration), + /* K18 */ be_nested_str_weak(_X3C_X2Fdiv_X3E), + /* K19 */ be_const_int(2), + /* K20 */ be_nested_str_weak(_X3Cdiv_X20class_X3D_X27qr_X27_X20style_X3D_X27background_X2Dcolor_X3A_X23000_X3B_X27_X3E), + /* K21 */ be_nested_str_weak(_X2F_X3Cdiv_X3E), }), - be_str_weak(web_add_handler), + be_str_weak(show_qrcode), &be_const_str_solidified, - ( &(const binstruction[13]) { /* code */ - 0xA4060000, // 0000 IMPORT R1 K0 - 0x8C080301, // 0001 GETMET R2 R1 K1 + ( &(const binstruction[120]) { /* code */ + 0xA40A0000, // 0000 IMPORT R2 K0 + 0x580C0001, // 0001 LDCONST R3 K1 0x58100002, // 0002 LDCONST R4 K2 - 0x84140000, // 0003 CLOSURE R5 P0 - 0x88180303, // 0004 GETMBR R6 R1 K3 - 0x7C080800, // 0005 CALL R2 4 - 0x8C080301, // 0006 GETMET R2 R1 K1 - 0x58100002, // 0007 LDCONST R4 K2 - 0x84140001, // 0008 CLOSURE R5 P1 - 0x88180304, // 0009 GETMBR R6 R1 K4 - 0x7C080800, // 000A CALL R2 4 - 0xA0000000, // 000B CLOSE R0 - 0x80000000, // 000C RET 0 + 0x58140003, // 0003 LDCONST R5 K3 + 0x58180004, // 0004 LDCONST R6 K4 + 0xB81E0A00, // 0005 GETNGBL R7 K5 + 0x881C0F06, // 0006 GETMBR R7 R7 K6 + 0x8C1C0F07, // 0007 GETMET R7 R7 K7 + 0x5C240200, // 0008 MOVE R9 R1 + 0x7C1C0400, // 0009 CALL R7 2 + 0x94200F08, // 000A GETIDX R8 R7 K8 + 0x94240F09, // 000B GETIDX R9 R7 K9 + 0x8C28050A, // 000C GETMET R10 R2 K10 + 0x5830000B, // 000D LDCONST R12 K11 + 0x7C280400, // 000E CALL R10 2 + 0x8C28050A, // 000F GETMET R10 R2 K10 + 0x5830000C, // 0010 LDCONST R12 K12 + 0x7C280400, // 0011 CALL R10 2 + 0x5828000D, // 0012 LDCONST R10 K13 + 0x8C2C050A, // 0013 GETMET R11 R2 K10 + 0x5C341400, // 0014 MOVE R13 R10 + 0x7C2C0400, // 0015 CALL R11 2 + 0x5828000E, // 0016 LDCONST R10 K14 + 0x602C0010, // 0017 GETGBL R11 G16 + 0x00301310, // 0018 ADD R12 R9 K16 + 0x40321E0C, // 0019 CONNECT R12 K15 R12 + 0x7C2C0200, // 001A CALL R11 1 + 0xA8020003, // 001B EXBLK 0 #0020 + 0x5C301600, // 001C MOVE R12 R11 + 0x7C300000, // 001D CALL R12 0 + 0x00281404, // 001E ADD R10 R10 R4 + 0x7001FFFB, // 001F JMP #001C + 0x582C0011, // 0020 LDCONST R11 K17 + 0xAC2C0200, // 0021 CATCH R11 1 0 + 0xB0080000, // 0022 RAISE 2 R0 R0 + 0x00281512, // 0023 ADD R10 R10 K18 + 0x8C2C050A, // 0024 GETMET R11 R2 K10 + 0x5C341400, // 0025 MOVE R13 R10 + 0x7C2C0400, // 0026 CALL R11 2 + 0x602C0010, // 0027 GETGBL R11 G16 + 0x00301310, // 0028 ADD R12 R9 K16 + 0x0C301913, // 0029 DIV R12 R12 K19 + 0x04301910, // 002A SUB R12 R12 K16 + 0x40321E0C, // 002B CONNECT R12 K15 R12 + 0x7C2C0200, // 002C CALL R11 1 + 0xA802002E, // 002D EXBLK 0 #005D + 0x5C301600, // 002E MOVE R12 R11 + 0x7C300000, // 002F CALL R12 0 + 0x00362806, // 0030 ADD R13 K20 R6 + 0x5C281A00, // 0031 MOVE R10 R13 + 0x60340010, // 0032 GETGBL R13 G16 + 0x04381310, // 0033 SUB R14 R9 K16 + 0x403A1E0E, // 0034 CONNECT R14 K15 R14 + 0x7C340200, // 0035 CALL R13 1 + 0xA802001C, // 0036 EXBLK 0 #0054 + 0x5C381A00, // 0037 MOVE R14 R13 + 0x7C380000, // 0038 CALL R14 0 + 0x083C1913, // 0039 MUL R15 R12 K19 + 0x943C100F, // 003A GETIDX R15 R8 R15 + 0x943C1E0E, // 003B GETIDX R15 R15 R14 + 0x1C3C1F01, // 003C EQ R15 R15 K1 + 0x08401913, // 003D MUL R16 R12 K19 + 0x00402110, // 003E ADD R16 R16 K16 + 0x14402009, // 003F LT R16 R16 R9 + 0x78420005, // 0040 JMPF R16 #0047 + 0x08401913, // 0041 MUL R16 R12 K19 + 0x00402110, // 0042 ADD R16 R16 K16 + 0x94401010, // 0043 GETIDX R16 R8 R16 + 0x9440200E, // 0044 GETIDX R16 R16 R14 + 0x1C402101, // 0045 EQ R16 R16 K1 + 0x70020000, // 0046 JMP #0048 + 0x50400200, // 0047 LDBOOL R16 1 0 + 0x783E0004, // 0048 JMPF R15 #004E + 0x78420001, // 0049 JMPF R16 #004C + 0x5C440C00, // 004A MOVE R17 R6 + 0x70020000, // 004B JMP #004D + 0x5C440A00, // 004C MOVE R17 R5 + 0x70020003, // 004D JMP #0052 + 0x78420001, // 004E JMPF R16 #0051 + 0x5C440800, // 004F MOVE R17 R4 + 0x70020000, // 0050 JMP #0052 + 0x5C440600, // 0051 MOVE R17 R3 + 0x00281411, // 0052 ADD R10 R10 R17 + 0x7001FFE2, // 0053 JMP #0037 + 0x58340011, // 0054 LDCONST R13 K17 + 0xAC340200, // 0055 CATCH R13 1 0 + 0xB0080000, // 0056 RAISE 2 R0 R0 + 0x00281406, // 0057 ADD R10 R10 R6 + 0x00281512, // 0058 ADD R10 R10 K18 + 0x8C34050A, // 0059 GETMET R13 R2 K10 + 0x5C3C1400, // 005A MOVE R15 R10 + 0x7C340400, // 005B CALL R13 2 + 0x7001FFD0, // 005C JMP #002E + 0x582C0011, // 005D LDCONST R11 K17 + 0xAC2C0200, // 005E CATCH R11 1 0 + 0xB0080000, // 005F RAISE 2 R0 R0 + 0x102C1313, // 0060 MOD R11 R9 K19 + 0x1C2C170F, // 0061 EQ R11 R11 K15 + 0x782E0010, // 0062 JMPF R11 #0074 + 0x58280014, // 0063 LDCONST R10 K20 + 0x602C0010, // 0064 GETGBL R11 G16 + 0x00301310, // 0065 ADD R12 R9 K16 + 0x40321E0C, // 0066 CONNECT R12 K15 R12 + 0x7C2C0200, // 0067 CALL R11 1 + 0xA8020003, // 0068 EXBLK 0 #006D + 0x5C301600, // 0069 MOVE R12 R11 + 0x7C300000, // 006A CALL R12 0 + 0x00281405, // 006B ADD R10 R10 R5 + 0x7001FFFB, // 006C JMP #0069 + 0x582C0011, // 006D LDCONST R11 K17 + 0xAC2C0200, // 006E CATCH R11 1 0 + 0xB0080000, // 006F RAISE 2 R0 R0 + 0x00281515, // 0070 ADD R10 R10 K21 + 0x8C2C050A, // 0071 GETMET R11 R2 K10 + 0x5C341400, // 0072 MOVE R13 R10 + 0x7C2C0400, // 0073 CALL R11 2 + 0x8C2C050A, // 0074 GETMET R11 R2 K10 + 0x58340012, // 0075 LDCONST R13 K18 + 0x7C2C0400, // 0076 CALL R11 2 + 0x80000000, // 0077 RET 0 }) ) ); @@ -511,9 +487,9 @@ be_local_closure(Matter_UI_web_add_handler, /* name */ /******************************************************************** -** Solidified function: web_get_arg +** Solidified function: web_add_config_button ********************************************************************/ -be_local_closure(Matter_UI_web_get_arg, /* name */ +be_local_closure(Matter_UI_web_add_config_button, /* name */ be_nested_proto( 5, /* nstack */ 1, /* argc */ @@ -523,124 +499,29 @@ be_local_closure(Matter_UI_web_get_arg, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[ 7]) { /* constants */ + ( &(const bvalue[ 6]) { /* constants */ /* K0 */ be_nested_str_weak(webserver), - /* K1 */ be_nested_str_weak(has_arg), - /* K2 */ be_nested_str_weak(mtc0), - /* K3 */ be_nested_str_weak(device), - /* K4 */ be_nested_str_weak(stop_basic_commissioning), - /* K5 */ be_nested_str_weak(mtc1), - /* K6 */ be_nested_str_weak(start_root_basic_commissioning), + /* K1 */ be_nested_str_weak(content_send), + /* K2 */ be_nested_str_weak(_X3Cp_X3E_X3Cform_X20id_X3Dac_X20action_X3D_X27matterc_X27_X20style_X3D_X27display_X3A_X20block_X3B_X27_X20method_X3D_X27get_X27_X3E_X3Cbutton_X3E), + /* K3 */ be_nested_str_weak(matter), + /* K4 */ be_nested_str_weak(_LOGO), + /* K5 */ be_nested_str_weak(_X20Configure_X20Matter_X3C_X2Fbutton_X3E_X3C_X2Fform_X3E_X3C_X2Fp_X3E), }), - be_str_weak(web_get_arg), + be_str_weak(web_add_config_button), &be_const_str_solidified, - ( &(const binstruction[17]) { /* code */ + ( &(const binstruction[12]) { /* code */ 0xA4060000, // 0000 IMPORT R1 K0 0x8C080301, // 0001 GETMET R2 R1 K1 0x58100002, // 0002 LDCONST R4 K2 0x7C080400, // 0003 CALL R2 2 - 0x780A0003, // 0004 JMPF R2 #0009 - 0x88080103, // 0005 GETMBR R2 R0 K3 - 0x8C080504, // 0006 GETMET R2 R2 K4 - 0x7C080200, // 0007 CALL R2 1 - 0x70020006, // 0008 JMP #0010 - 0x8C080301, // 0009 GETMET R2 R1 K1 - 0x58100005, // 000A LDCONST R4 K5 - 0x7C080400, // 000B CALL R2 2 - 0x780A0002, // 000C JMPF R2 #0010 - 0x88080103, // 000D GETMBR R2 R0 K3 - 0x8C080506, // 000E GETMET R2 R2 K6 - 0x7C080200, // 000F CALL R2 1 - 0x80000000, // 0010 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: show_passcode_form -********************************************************************/ -be_local_closure(Matter_UI_show_passcode_form, /* name */ - be_nested_proto( - 9, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[19]) { /* constants */ - /* K0 */ be_nested_str_weak(webserver), - /* K1 */ be_nested_str_weak(string), - /* K2 */ be_nested_str_weak(content_send), - /* K3 */ be_nested_str_weak(_X3Cfieldset_X3E_X3Clegend_X3E_X3Cb_X3E_X26nbsp_X3BMatter_X20Passcode_X26nbsp_X3B_X3C_X2Fb_X3E_X3C_X2Flegend_X3E_X3Cp_X3E_X3C_X2Fp_X3E), - /* K4 */ be_nested_str_weak(_X3Cform_X20action_X3D_X27_X2Fmatterc_X27_X20method_X3D_X27post_X27_X20onsubmit_X3D_X27return_X20confirm_X28_X22This_X20will_X20cause_X20a_X20restart_X2E_X22_X29_X3B_X27_X3E), - /* K5 */ be_nested_str_weak(_X3Cp_X3EPasscode_X3A_X3C_X2Fp_X3E), - /* K6 */ be_nested_str_weak(format), - /* K7 */ be_nested_str_weak(_X3Cinput_X20type_X3D_X27number_X27_X20min_X3D_X271_X27_X20max_X3D_X2799999998_X27_X20name_X3D_X27passcode_X27_X20value_X3D_X27_X25i_X27_X3E), - /* K8 */ be_nested_str_weak(device), - /* K9 */ be_nested_str_weak(root_passcode), - /* K10 */ be_nested_str_weak(_X3Cp_X3EDistinguish_X20id_X3A_X3C_X2Fp_X3E), - /* K11 */ be_nested_str_weak(_X3Cinput_X20type_X3D_X27number_X27_X20min_X3D_X270_X27_X20max_X3D_X274095_X27_X20name_X3D_X27discriminator_X27_X20value_X3D_X27_X25i_X27_X3E), - /* K12 */ be_nested_str_weak(root_discriminator), - /* K13 */ be_nested_str_weak(_X3Cp_X3E_X3Cinput_X20type_X3D_X27checkbox_X27_X20name_X3D_X27ipv4_X27_X25s_X3EIPv4_X20only_X3C_X2Fp_X3E), - /* K14 */ be_nested_str_weak(ipv4only), - /* K15 */ be_nested_str_weak(_X20checked), - /* K16 */ be_nested_str_weak(), - /* K17 */ be_nested_str_weak(_X3Cp_X3E_X3C_X2Fp_X3E_X3Cbutton_X20name_X3D_X27passcode_X27_X20class_X3D_X27button_X20bgrn_X27_X3EChange_X3C_X2Fbutton_X3E_X3C_X2Fform_X3E_X3C_X2Fp_X3E), - /* K18 */ be_nested_str_weak(_X3Cp_X3E_X3C_X2Fp_X3E_X3C_X2Ffieldset_X3E_X3Cp_X3E_X3C_X2Fp_X3E), - }), - be_str_weak(show_passcode_form), - &be_const_str_solidified, - ( &(const binstruction[46]) { /* code */ - 0xA4060000, // 0000 IMPORT R1 K0 - 0xA40A0200, // 0001 IMPORT R2 K1 - 0x8C0C0302, // 0002 GETMET R3 R1 K2 - 0x58140003, // 0003 LDCONST R5 K3 - 0x7C0C0400, // 0004 CALL R3 2 - 0x8C0C0302, // 0005 GETMET R3 R1 K2 - 0x58140004, // 0006 LDCONST R5 K4 - 0x7C0C0400, // 0007 CALL R3 2 - 0x8C0C0302, // 0008 GETMET R3 R1 K2 - 0x58140005, // 0009 LDCONST R5 K5 - 0x7C0C0400, // 000A CALL R3 2 - 0x8C0C0302, // 000B GETMET R3 R1 K2 - 0x8C140506, // 000C GETMET R5 R2 K6 - 0x581C0007, // 000D LDCONST R7 K7 - 0x88200108, // 000E GETMBR R8 R0 K8 - 0x88201109, // 000F GETMBR R8 R8 K9 - 0x7C140600, // 0010 CALL R5 3 - 0x7C0C0400, // 0011 CALL R3 2 - 0x8C0C0302, // 0012 GETMET R3 R1 K2 - 0x5814000A, // 0013 LDCONST R5 K10 - 0x7C0C0400, // 0014 CALL R3 2 - 0x8C0C0302, // 0015 GETMET R3 R1 K2 - 0x8C140506, // 0016 GETMET R5 R2 K6 - 0x581C000B, // 0017 LDCONST R7 K11 - 0x88200108, // 0018 GETMBR R8 R0 K8 - 0x8820110C, // 0019 GETMBR R8 R8 K12 - 0x7C140600, // 001A CALL R5 3 - 0x7C0C0400, // 001B CALL R3 2 - 0x8C0C0302, // 001C GETMET R3 R1 K2 - 0x8C140506, // 001D GETMET R5 R2 K6 - 0x581C000D, // 001E LDCONST R7 K13 - 0x88200108, // 001F GETMBR R8 R0 K8 - 0x8820110E, // 0020 GETMBR R8 R8 K14 - 0x78220001, // 0021 JMPF R8 #0024 - 0x5820000F, // 0022 LDCONST R8 K15 - 0x70020000, // 0023 JMP #0025 - 0x58200010, // 0024 LDCONST R8 K16 - 0x7C140600, // 0025 CALL R5 3 - 0x7C0C0400, // 0026 CALL R3 2 - 0x8C0C0302, // 0027 GETMET R3 R1 K2 - 0x58140011, // 0028 LDCONST R5 K17 - 0x7C0C0400, // 0029 CALL R3 2 - 0x8C0C0302, // 002A GETMET R3 R1 K2 - 0x58140012, // 002B LDCONST R5 K18 - 0x7C0C0400, // 002C CALL R3 2 - 0x80000000, // 002D RET 0 + 0x8C080301, // 0004 GETMET R2 R1 K1 + 0xB8120600, // 0005 GETNGBL R4 K3 + 0x88100904, // 0006 GETMBR R4 R4 K4 + 0x7C080400, // 0007 CALL R2 2 + 0x8C080301, // 0008 GETMET R2 R1 K1 + 0x58100005, // 0009 LDCONST R4 K5 + 0x7C080400, // 000A CALL R2 2 + 0x80000000, // 000B RET 0 }) ) ); @@ -1096,11 +977,11 @@ be_local_closure(Matter_UI_page_part_ctl, /* name */ /******************************************************************** -** Solidified function: web_add_config_button +** Solidified function: show_passcode_form ********************************************************************/ -be_local_closure(Matter_UI_web_add_config_button, /* name */ +be_local_closure(Matter_UI_show_passcode_form, /* name */ be_nested_proto( - 5, /* nstack */ + 9, /* nstack */ 1, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -1108,283 +989,165 @@ be_local_closure(Matter_UI_web_add_config_button, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[ 6]) { /* constants */ + ( &(const bvalue[19]) { /* constants */ /* K0 */ be_nested_str_weak(webserver), - /* K1 */ be_nested_str_weak(content_send), - /* K2 */ be_nested_str_weak(_X3Cp_X3E_X3Cform_X20id_X3Dac_X20action_X3D_X27matterc_X27_X20style_X3D_X27display_X3A_X20block_X3B_X27_X20method_X3D_X27get_X27_X3E_X3Cbutton_X3E), - /* K3 */ be_nested_str_weak(matter), - /* K4 */ be_nested_str_weak(_LOGO), - /* K5 */ be_nested_str_weak(_X20Configure_X20Matter_X3C_X2Fbutton_X3E_X3C_X2Fform_X3E_X3C_X2Fp_X3E), + /* K1 */ be_nested_str_weak(string), + /* K2 */ be_nested_str_weak(content_send), + /* K3 */ be_nested_str_weak(_X3Cfieldset_X3E_X3Clegend_X3E_X3Cb_X3E_X26nbsp_X3BMatter_X20Passcode_X26nbsp_X3B_X3C_X2Fb_X3E_X3C_X2Flegend_X3E_X3Cp_X3E_X3C_X2Fp_X3E), + /* K4 */ be_nested_str_weak(_X3Cform_X20action_X3D_X27_X2Fmatterc_X27_X20method_X3D_X27post_X27_X20onsubmit_X3D_X27return_X20confirm_X28_X22This_X20will_X20cause_X20a_X20restart_X2E_X22_X29_X3B_X27_X3E), + /* K5 */ be_nested_str_weak(_X3Cp_X3EPasscode_X3A_X3C_X2Fp_X3E), + /* K6 */ be_nested_str_weak(format), + /* K7 */ be_nested_str_weak(_X3Cinput_X20type_X3D_X27number_X27_X20min_X3D_X271_X27_X20max_X3D_X2799999998_X27_X20name_X3D_X27passcode_X27_X20value_X3D_X27_X25i_X27_X3E), + /* K8 */ be_nested_str_weak(device), + /* K9 */ be_nested_str_weak(root_passcode), + /* K10 */ be_nested_str_weak(_X3Cp_X3EDistinguish_X20id_X3A_X3C_X2Fp_X3E), + /* K11 */ be_nested_str_weak(_X3Cinput_X20type_X3D_X27number_X27_X20min_X3D_X270_X27_X20max_X3D_X274095_X27_X20name_X3D_X27discriminator_X27_X20value_X3D_X27_X25i_X27_X3E), + /* K12 */ be_nested_str_weak(root_discriminator), + /* K13 */ be_nested_str_weak(_X3Cp_X3E_X3Cinput_X20type_X3D_X27checkbox_X27_X20name_X3D_X27ipv4_X27_X25s_X3EIPv4_X20only_X3C_X2Fp_X3E), + /* K14 */ be_nested_str_weak(ipv4only), + /* K15 */ be_nested_str_weak(_X20checked), + /* K16 */ be_nested_str_weak(), + /* K17 */ be_nested_str_weak(_X3Cp_X3E_X3C_X2Fp_X3E_X3Cbutton_X20name_X3D_X27passcode_X27_X20class_X3D_X27button_X20bgrn_X27_X3EChange_X3C_X2Fbutton_X3E_X3C_X2Fform_X3E_X3C_X2Fp_X3E), + /* K18 */ be_nested_str_weak(_X3Cp_X3E_X3C_X2Fp_X3E_X3C_X2Ffieldset_X3E_X3Cp_X3E_X3C_X2Fp_X3E), }), - be_str_weak(web_add_config_button), + be_str_weak(show_passcode_form), &be_const_str_solidified, - ( &(const binstruction[12]) { /* code */ + ( &(const binstruction[46]) { /* code */ + 0xA4060000, // 0000 IMPORT R1 K0 + 0xA40A0200, // 0001 IMPORT R2 K1 + 0x8C0C0302, // 0002 GETMET R3 R1 K2 + 0x58140003, // 0003 LDCONST R5 K3 + 0x7C0C0400, // 0004 CALL R3 2 + 0x8C0C0302, // 0005 GETMET R3 R1 K2 + 0x58140004, // 0006 LDCONST R5 K4 + 0x7C0C0400, // 0007 CALL R3 2 + 0x8C0C0302, // 0008 GETMET R3 R1 K2 + 0x58140005, // 0009 LDCONST R5 K5 + 0x7C0C0400, // 000A CALL R3 2 + 0x8C0C0302, // 000B GETMET R3 R1 K2 + 0x8C140506, // 000C GETMET R5 R2 K6 + 0x581C0007, // 000D LDCONST R7 K7 + 0x88200108, // 000E GETMBR R8 R0 K8 + 0x88201109, // 000F GETMBR R8 R8 K9 + 0x7C140600, // 0010 CALL R5 3 + 0x7C0C0400, // 0011 CALL R3 2 + 0x8C0C0302, // 0012 GETMET R3 R1 K2 + 0x5814000A, // 0013 LDCONST R5 K10 + 0x7C0C0400, // 0014 CALL R3 2 + 0x8C0C0302, // 0015 GETMET R3 R1 K2 + 0x8C140506, // 0016 GETMET R5 R2 K6 + 0x581C000B, // 0017 LDCONST R7 K11 + 0x88200108, // 0018 GETMBR R8 R0 K8 + 0x8820110C, // 0019 GETMBR R8 R8 K12 + 0x7C140600, // 001A CALL R5 3 + 0x7C0C0400, // 001B CALL R3 2 + 0x8C0C0302, // 001C GETMET R3 R1 K2 + 0x8C140506, // 001D GETMET R5 R2 K6 + 0x581C000D, // 001E LDCONST R7 K13 + 0x88200108, // 001F GETMBR R8 R0 K8 + 0x8820110E, // 0020 GETMBR R8 R8 K14 + 0x78220001, // 0021 JMPF R8 #0024 + 0x5820000F, // 0022 LDCONST R8 K15 + 0x70020000, // 0023 JMP #0025 + 0x58200010, // 0024 LDCONST R8 K16 + 0x7C140600, // 0025 CALL R5 3 + 0x7C0C0400, // 0026 CALL R3 2 + 0x8C0C0302, // 0027 GETMET R3 R1 K2 + 0x58140011, // 0028 LDCONST R5 K17 + 0x7C0C0400, // 0029 CALL R3 2 + 0x8C0C0302, // 002A GETMET R3 R1 K2 + 0x58140012, // 002B LDCONST R5 K18 + 0x7C0C0400, // 002C CALL R3 2 + 0x80000000, // 002D RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: web_add_handler +********************************************************************/ +be_local_closure(Matter_UI_web_add_handler, /* name */ + be_nested_proto( + 7, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 1, /* has sup protos */ + ( &(const struct bproto*[ 2]) { + be_nested_proto( + 2, /* nstack */ + 0, /* argc */ + 0, /* varg */ + 1, /* has upvals */ + ( &(const bupvaldesc[ 1]) { /* upvals */ + be_local_const_upval(1, 0), + }), + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 1]) { /* constants */ + /* K0 */ be_nested_str_weak(page_part_mgr), + }), + be_str_weak(_X3Clambda_X3E), + &be_const_str_solidified, + ( &(const binstruction[ 4]) { /* code */ + 0x68000000, // 0000 GETUPV R0 U0 + 0x8C000100, // 0001 GETMET R0 R0 K0 + 0x7C000200, // 0002 CALL R0 1 + 0x80040000, // 0003 RET 1 R0 + }) + ), + be_nested_proto( + 2, /* nstack */ + 0, /* argc */ + 0, /* varg */ + 1, /* has upvals */ + ( &(const bupvaldesc[ 1]) { /* upvals */ + be_local_const_upval(1, 0), + }), + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 1]) { /* constants */ + /* K0 */ be_nested_str_weak(page_part_ctl), + }), + be_str_weak(_X3Clambda_X3E), + &be_const_str_solidified, + ( &(const binstruction[ 4]) { /* code */ + 0x68000000, // 0000 GETUPV R0 U0 + 0x8C000100, // 0001 GETMET R0 R0 K0 + 0x7C000200, // 0002 CALL R0 1 + 0x80040000, // 0003 RET 1 R0 + }) + ), + }), + 1, /* has constants */ + ( &(const bvalue[ 5]) { /* constants */ + /* K0 */ be_nested_str_weak(webserver), + /* K1 */ be_nested_str_weak(on), + /* K2 */ be_nested_str_weak(_X2Fmatterc), + /* K3 */ be_nested_str_weak(HTTP_GET), + /* K4 */ be_nested_str_weak(HTTP_POST), + }), + be_str_weak(web_add_handler), + &be_const_str_solidified, + ( &(const binstruction[13]) { /* code */ 0xA4060000, // 0000 IMPORT R1 K0 0x8C080301, // 0001 GETMET R2 R1 K1 0x58100002, // 0002 LDCONST R4 K2 - 0x7C080400, // 0003 CALL R2 2 - 0x8C080301, // 0004 GETMET R2 R1 K1 - 0xB8120600, // 0005 GETNGBL R4 K3 - 0x88100904, // 0006 GETMBR R4 R4 K4 - 0x7C080400, // 0007 CALL R2 2 - 0x8C080301, // 0008 GETMET R2 R1 K1 - 0x58100005, // 0009 LDCONST R4 K5 - 0x7C080400, // 000A CALL R2 2 - 0x80000000, // 000B RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: show_qrcode -********************************************************************/ -be_local_closure(Matter_UI_show_qrcode, /* name */ - be_nested_proto( - 18, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[22]) { /* constants */ - /* K0 */ be_nested_str_weak(webserver), - /* K1 */ be_nested_str_weak(_X20), - /* K2 */ be_nested_str_weak(_XE2_X96_X84), - /* K3 */ be_nested_str_weak(_XE2_X96_X80), - /* K4 */ be_nested_str_weak(_XE2_X96_X88), - /* K5 */ be_nested_str_weak(matter), - /* K6 */ be_nested_str_weak(QRCode), - /* K7 */ be_nested_str_weak(encode_str), - /* K8 */ be_nested_str_weak(bitmap), - /* K9 */ be_nested_str_weak(size), - /* K10 */ be_nested_str_weak(content_send), - /* K11 */ be_nested_str_weak(_X3Cstyle_X3E_X2Eqr_X7Bfont_X2Dfamily_X3Amonospace_X3B_X20margin_X3A0_X3B_X20padding_X3A0_X3B_X20white_X2Dspace_X3Apre_X3B_X20font_X2Dsize_X3A18px_X3B_X20color_X3A_X23fff_X3B_X20line_X2Dheight_X3A100_X25_X3B_X7D_X3C_X2Fstyle_X3E), - /* K12 */ be_nested_str_weak(_X3Cdiv_X20style_X3D_X27transform_X3Ascale_X28_X2E8_X2C1_X29_X3B_X20display_X3Ainline_X2Dblock_X3B_X27_X3E), - /* K13 */ be_nested_str_weak(_X3Cdiv_X20class_X3D_X27qr_X27_X3E), - /* K14 */ be_nested_str_weak(), - /* K15 */ be_const_int(0), - /* K16 */ be_const_int(1), - /* K17 */ be_nested_str_weak(stop_iteration), - /* K18 */ be_nested_str_weak(_X3C_X2Fdiv_X3E), - /* K19 */ be_const_int(2), - /* K20 */ be_nested_str_weak(_X3Cdiv_X20class_X3D_X27qr_X27_X20style_X3D_X27background_X2Dcolor_X3A_X23000_X3B_X27_X3E), - /* K21 */ be_nested_str_weak(_X2F_X3Cdiv_X3E), - }), - be_str_weak(show_qrcode), - &be_const_str_solidified, - ( &(const binstruction[120]) { /* code */ - 0xA40A0000, // 0000 IMPORT R2 K0 - 0x580C0001, // 0001 LDCONST R3 K1 - 0x58100002, // 0002 LDCONST R4 K2 - 0x58140003, // 0003 LDCONST R5 K3 - 0x58180004, // 0004 LDCONST R6 K4 - 0xB81E0A00, // 0005 GETNGBL R7 K5 - 0x881C0F06, // 0006 GETMBR R7 R7 K6 - 0x8C1C0F07, // 0007 GETMET R7 R7 K7 - 0x5C240200, // 0008 MOVE R9 R1 - 0x7C1C0400, // 0009 CALL R7 2 - 0x94200F08, // 000A GETIDX R8 R7 K8 - 0x94240F09, // 000B GETIDX R9 R7 K9 - 0x8C28050A, // 000C GETMET R10 R2 K10 - 0x5830000B, // 000D LDCONST R12 K11 - 0x7C280400, // 000E CALL R10 2 - 0x8C28050A, // 000F GETMET R10 R2 K10 - 0x5830000C, // 0010 LDCONST R12 K12 - 0x7C280400, // 0011 CALL R10 2 - 0x5828000D, // 0012 LDCONST R10 K13 - 0x8C2C050A, // 0013 GETMET R11 R2 K10 - 0x5C341400, // 0014 MOVE R13 R10 - 0x7C2C0400, // 0015 CALL R11 2 - 0x5828000E, // 0016 LDCONST R10 K14 - 0x602C0010, // 0017 GETGBL R11 G16 - 0x00301310, // 0018 ADD R12 R9 K16 - 0x40321E0C, // 0019 CONNECT R12 K15 R12 - 0x7C2C0200, // 001A CALL R11 1 - 0xA8020003, // 001B EXBLK 0 #0020 - 0x5C301600, // 001C MOVE R12 R11 - 0x7C300000, // 001D CALL R12 0 - 0x00281404, // 001E ADD R10 R10 R4 - 0x7001FFFB, // 001F JMP #001C - 0x582C0011, // 0020 LDCONST R11 K17 - 0xAC2C0200, // 0021 CATCH R11 1 0 - 0xB0080000, // 0022 RAISE 2 R0 R0 - 0x00281512, // 0023 ADD R10 R10 K18 - 0x8C2C050A, // 0024 GETMET R11 R2 K10 - 0x5C341400, // 0025 MOVE R13 R10 - 0x7C2C0400, // 0026 CALL R11 2 - 0x602C0010, // 0027 GETGBL R11 G16 - 0x00301310, // 0028 ADD R12 R9 K16 - 0x0C301913, // 0029 DIV R12 R12 K19 - 0x04301910, // 002A SUB R12 R12 K16 - 0x40321E0C, // 002B CONNECT R12 K15 R12 - 0x7C2C0200, // 002C CALL R11 1 - 0xA802002E, // 002D EXBLK 0 #005D - 0x5C301600, // 002E MOVE R12 R11 - 0x7C300000, // 002F CALL R12 0 - 0x00362806, // 0030 ADD R13 K20 R6 - 0x5C281A00, // 0031 MOVE R10 R13 - 0x60340010, // 0032 GETGBL R13 G16 - 0x04381310, // 0033 SUB R14 R9 K16 - 0x403A1E0E, // 0034 CONNECT R14 K15 R14 - 0x7C340200, // 0035 CALL R13 1 - 0xA802001C, // 0036 EXBLK 0 #0054 - 0x5C381A00, // 0037 MOVE R14 R13 - 0x7C380000, // 0038 CALL R14 0 - 0x083C1913, // 0039 MUL R15 R12 K19 - 0x943C100F, // 003A GETIDX R15 R8 R15 - 0x943C1E0E, // 003B GETIDX R15 R15 R14 - 0x1C3C1F01, // 003C EQ R15 R15 K1 - 0x08401913, // 003D MUL R16 R12 K19 - 0x00402110, // 003E ADD R16 R16 K16 - 0x14402009, // 003F LT R16 R16 R9 - 0x78420005, // 0040 JMPF R16 #0047 - 0x08401913, // 0041 MUL R16 R12 K19 - 0x00402110, // 0042 ADD R16 R16 K16 - 0x94401010, // 0043 GETIDX R16 R8 R16 - 0x9440200E, // 0044 GETIDX R16 R16 R14 - 0x1C402101, // 0045 EQ R16 R16 K1 - 0x70020000, // 0046 JMP #0048 - 0x50400200, // 0047 LDBOOL R16 1 0 - 0x783E0004, // 0048 JMPF R15 #004E - 0x78420001, // 0049 JMPF R16 #004C - 0x5C440C00, // 004A MOVE R17 R6 - 0x70020000, // 004B JMP #004D - 0x5C440A00, // 004C MOVE R17 R5 - 0x70020003, // 004D JMP #0052 - 0x78420001, // 004E JMPF R16 #0051 - 0x5C440800, // 004F MOVE R17 R4 - 0x70020000, // 0050 JMP #0052 - 0x5C440600, // 0051 MOVE R17 R3 - 0x00281411, // 0052 ADD R10 R10 R17 - 0x7001FFE2, // 0053 JMP #0037 - 0x58340011, // 0054 LDCONST R13 K17 - 0xAC340200, // 0055 CATCH R13 1 0 - 0xB0080000, // 0056 RAISE 2 R0 R0 - 0x00281406, // 0057 ADD R10 R10 R6 - 0x00281512, // 0058 ADD R10 R10 K18 - 0x8C34050A, // 0059 GETMET R13 R2 K10 - 0x5C3C1400, // 005A MOVE R15 R10 - 0x7C340400, // 005B CALL R13 2 - 0x7001FFD0, // 005C JMP #002E - 0x582C0011, // 005D LDCONST R11 K17 - 0xAC2C0200, // 005E CATCH R11 1 0 - 0xB0080000, // 005F RAISE 2 R0 R0 - 0x102C1313, // 0060 MOD R11 R9 K19 - 0x1C2C170F, // 0061 EQ R11 R11 K15 - 0x782E0010, // 0062 JMPF R11 #0074 - 0x58280014, // 0063 LDCONST R10 K20 - 0x602C0010, // 0064 GETGBL R11 G16 - 0x00301310, // 0065 ADD R12 R9 K16 - 0x40321E0C, // 0066 CONNECT R12 K15 R12 - 0x7C2C0200, // 0067 CALL R11 1 - 0xA8020003, // 0068 EXBLK 0 #006D - 0x5C301600, // 0069 MOVE R12 R11 - 0x7C300000, // 006A CALL R12 0 - 0x00281405, // 006B ADD R10 R10 R5 - 0x7001FFFB, // 006C JMP #0069 - 0x582C0011, // 006D LDCONST R11 K17 - 0xAC2C0200, // 006E CATCH R11 1 0 - 0xB0080000, // 006F RAISE 2 R0 R0 - 0x00281515, // 0070 ADD R10 R10 K21 - 0x8C2C050A, // 0071 GETMET R11 R2 K10 - 0x5C341400, // 0072 MOVE R13 R10 - 0x7C2C0400, // 0073 CALL R11 2 - 0x8C2C050A, // 0074 GETMET R11 R2 K10 - 0x58340012, // 0075 LDCONST R13 K18 - 0x7C2C0400, // 0076 CALL R11 2 - 0x80000000, // 0077 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: plugin_option -********************************************************************/ -be_local_closure(Matter_UI_plugin_option, /* name */ - be_nested_proto( - 17, /* nstack */ - 3, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[16]) { /* constants */ - /* K0 */ be_nested_str_weak(webserver), - /* K1 */ be_nested_str_weak(string), - /* K2 */ be_nested_str_weak(split), - /* K3 */ be_nested_str_weak(_X7C), - /* K4 */ be_const_int(0), - /* K5 */ be_nested_str_weak(), - /* K6 */ be_nested_str_weak(content_send), - /* K7 */ be_nested_str_weak(_X3Coption_X20value_X3D_X27_X27_X3E_X3C_X2Foption_X3E), - /* K8 */ be_nested_str_weak(_X2Dhttp), - /* K9 */ be_nested_str_weak(_X3Coption_X20value_X3D_X27_X27_X20disabled_X3E_X2D_X2D_X2D_X20Tasmota_X20Remote_X20_X2D_X2D_X2D_X3C_X2Foption_X3E), - /* K10 */ be_nested_str_weak(device), - /* K11 */ be_nested_str_weak(get_plugin_class_displayname), - /* K12 */ be_nested_str_weak(format), - /* K13 */ be_nested_str_weak(_X3Coption_X20value_X3D_X27_X25s_X27_X25s_X3E_X25s_X3C_X2Foption_X3E), - /* K14 */ be_nested_str_weak(_X20selected), - /* K15 */ be_const_int(1), - }), - be_str_weak(plugin_option), - &be_const_str_solidified, - ( &(const binstruction[48]) { /* code */ - 0xA40E0000, // 0000 IMPORT R3 K0 - 0xA4120200, // 0001 IMPORT R4 K1 - 0x780A0004, // 0002 JMPF R2 #0008 - 0x8C140902, // 0003 GETMET R5 R4 K2 - 0x5C1C0400, // 0004 MOVE R7 R2 - 0x58200003, // 0005 LDCONST R8 K3 - 0x7C140600, // 0006 CALL R5 3 - 0x70020001, // 0007 JMP #000A - 0x60140012, // 0008 GETGBL R5 G18 - 0x7C140000, // 0009 CALL R5 0 - 0x58180004, // 000A LDCONST R6 K4 - 0x601C000C, // 000B GETGBL R7 G12 - 0x5C200A00, // 000C MOVE R8 R5 - 0x7C1C0200, // 000D CALL R7 1 - 0x141C0C07, // 000E LT R7 R6 R7 - 0x781E001E, // 000F JMPF R7 #002F - 0x941C0A06, // 0010 GETIDX R7 R5 R6 - 0x1C200F05, // 0011 EQ R8 R7 K5 - 0x78220003, // 0012 JMPF R8 #0017 - 0x8C200706, // 0013 GETMET R8 R3 K6 - 0x58280007, // 0014 LDCONST R10 K7 - 0x7C200400, // 0015 CALL R8 2 - 0x70020015, // 0016 JMP #002D - 0x1C200F08, // 0017 EQ R8 R7 K8 - 0x78220003, // 0018 JMPF R8 #001D - 0x8C200706, // 0019 GETMET R8 R3 K6 - 0x58280009, // 001A LDCONST R10 K9 - 0x7C200400, // 001B CALL R8 2 - 0x7002000F, // 001C JMP #002D - 0x8820010A, // 001D GETMBR R8 R0 K10 - 0x8C20110B, // 001E GETMET R8 R8 K11 - 0x5C280E00, // 001F MOVE R10 R7 - 0x7C200400, // 0020 CALL R8 2 - 0x8C240706, // 0021 GETMET R9 R3 K6 - 0x8C2C090C, // 0022 GETMET R11 R4 K12 - 0x5834000D, // 0023 LDCONST R13 K13 - 0x5C380E00, // 0024 MOVE R14 R7 - 0x1C3C0E01, // 0025 EQ R15 R7 R1 - 0x783E0001, // 0026 JMPF R15 #0029 - 0x583C000E, // 0027 LDCONST R15 K14 - 0x70020000, // 0028 JMP #002A - 0x583C0005, // 0029 LDCONST R15 K5 - 0x5C401000, // 002A MOVE R16 R8 - 0x7C2C0A00, // 002B CALL R11 5 - 0x7C240400, // 002C CALL R9 2 - 0x00180D0F, // 002D ADD R6 R6 K15 - 0x7001FFDB, // 002E JMP #000B - 0x80000000, // 002F RET 0 + 0x84140000, // 0003 CLOSURE R5 P0 + 0x88180303, // 0004 GETMBR R6 R1 K3 + 0x7C080800, // 0005 CALL R2 4 + 0x8C080301, // 0006 GETMET R2 R1 K1 + 0x58100002, // 0007 LDCONST R4 K2 + 0x84140001, // 0008 CLOSURE R5 P1 + 0x88180304, // 0009 GETMBR R6 R1 K4 + 0x7C080800, // 000A CALL R2 4 + 0xA0000000, // 000B CLOSE R0 + 0x80000000, // 000C RET 0 }) ) ); @@ -1480,11 +1243,11 @@ be_local_closure(Matter_UI_show_enable, /* name */ /******************************************************************** -** Solidified function: web_sensor +** Solidified function: web_get_arg ********************************************************************/ -be_local_closure(Matter_UI_web_sensor, /* name */ +be_local_closure(Matter_UI_web_get_arg, /* name */ be_nested_proto( - 13, /* nstack */ + 5, /* nstack */ 1, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -1492,108 +1255,35 @@ be_local_closure(Matter_UI_web_sensor, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[25]) { /* constants */ + ( &(const bvalue[ 7]) { /* constants */ /* K0 */ be_nested_str_weak(webserver), - /* K1 */ be_nested_str_weak(string), - /* K2 */ be_nested_str_weak(tasmota), - /* K3 */ be_nested_str_weak(get_option), - /* K4 */ be_nested_str_weak(matter), - /* K5 */ be_nested_str_weak(MATTER_OPTION), - /* K6 */ be_nested_str_weak(device), - /* K7 */ be_nested_str_weak(is_root_commissioning_open), - /* K8 */ be_nested_str_weak(show_commissioning_info), - /* K9 */ be_nested_str_weak(sessions), - /* K10 */ be_nested_str_weak(count_active_fabrics), - /* K11 */ be_const_int(0), - /* K12 */ be_nested_str_weak(content_send), - /* K13 */ be_nested_str_weak(format), - /* K14 */ be_nested_str_weak(_X3Cdiv_X20style_X3D_X27text_X2Dalign_X3Aright_X3Bfont_X2Dsize_X3A11px_X3Bcolor_X3A_X23aaa_X3B_X27_X3E_X25s_X3C_X2Fdiv_X3E), - /* K15 */ be_nested_str_weak(No_X20active_X20association), - /* K16 */ be_const_int(1), - /* K17 */ be_nested_str_weak(_X20active_X20association), - /* K18 */ be_nested_str_weak(s), - /* K19 */ be_nested_str_weak(), - /* K20 */ be_nested_str_weak(_X3Cbutton_X20onclick_X3D_X27la_X28_X22_X26mtc_X25i_X3D1_X22_X29_X3B_X27_X3E), - /* K21 */ be_nested_str_weak(commissioning_open), - /* K22 */ be_nested_str_weak(_LOGO), - /* K23 */ be_nested_str_weak(_X20Open_X20Commissioning_X3C_X2Fbutton_X3E), - /* K24 */ be_nested_str_weak(_X20Close_X20Commissioning_X3C_X2Fbutton_X3E), + /* K1 */ be_nested_str_weak(has_arg), + /* K2 */ be_nested_str_weak(mtc0), + /* K3 */ be_nested_str_weak(device), + /* K4 */ be_nested_str_weak(stop_basic_commissioning), + /* K5 */ be_nested_str_weak(mtc1), + /* K6 */ be_nested_str_weak(start_root_basic_commissioning), }), - be_str_weak(web_sensor), + be_str_weak(web_get_arg), &be_const_str_solidified, - ( &(const binstruction[72]) { /* code */ + ( &(const binstruction[17]) { /* code */ 0xA4060000, // 0000 IMPORT R1 K0 - 0xA40A0200, // 0001 IMPORT R2 K1 - 0xB80E0400, // 0002 GETNGBL R3 K2 - 0x8C0C0703, // 0003 GETMET R3 R3 K3 - 0xB8160800, // 0004 GETNGBL R5 K4 - 0x88140B05, // 0005 GETMBR R5 R5 K5 - 0x7C0C0400, // 0006 CALL R3 2 - 0x780E003E, // 0007 JMPF R3 #0047 - 0x88100106, // 0008 GETMBR R4 R0 K6 - 0x8C100907, // 0009 GETMET R4 R4 K7 - 0x7C100200, // 000A CALL R4 1 - 0x78120001, // 000B JMPF R4 #000E - 0x8C100108, // 000C GETMET R4 R0 K8 - 0x7C100200, // 000D CALL R4 1 - 0x88100106, // 000E GETMBR R4 R0 K6 - 0x88100909, // 000F GETMBR R4 R4 K9 - 0x8C10090A, // 0010 GETMET R4 R4 K10 - 0x7C100200, // 0011 CALL R4 1 - 0x1C14090B, // 0012 EQ R5 R4 K11 - 0x78160006, // 0013 JMPF R5 #001B - 0x8C14030C, // 0014 GETMET R5 R1 K12 - 0x8C1C050D, // 0015 GETMET R7 R2 K13 - 0x5824000E, // 0016 LDCONST R9 K14 - 0x5828000F, // 0017 LDCONST R10 K15 - 0x7C1C0600, // 0018 CALL R7 3 - 0x7C140400, // 0019 CALL R5 2 - 0x7002000E, // 001A JMP #002A - 0x24140910, // 001B GT R5 R4 K16 - 0x8C18030C, // 001C GETMET R6 R1 K12 - 0x8C20050D, // 001D GETMET R8 R2 K13 - 0x5828000E, // 001E LDCONST R10 K14 - 0x602C0008, // 001F GETGBL R11 G8 - 0x5C300800, // 0020 MOVE R12 R4 - 0x7C2C0200, // 0021 CALL R11 1 - 0x002C1711, // 0022 ADD R11 R11 K17 - 0x78160001, // 0023 JMPF R5 #0026 - 0x58300012, // 0024 LDCONST R12 K18 - 0x70020000, // 0025 JMP #0027 - 0x58300013, // 0026 LDCONST R12 K19 - 0x002C160C, // 0027 ADD R11 R11 R12 - 0x7C200600, // 0028 CALL R8 3 - 0x7C180400, // 0029 CALL R6 2 - 0x8C14030C, // 002A GETMET R5 R1 K12 - 0x8C1C050D, // 002B GETMET R7 R2 K13 - 0x58240014, // 002C LDCONST R9 K20 - 0x88280106, // 002D GETMBR R10 R0 K6 - 0x88281515, // 002E GETMBR R10 R10 K21 - 0x4C2C0000, // 002F LDNIL R11 - 0x1C28140B, // 0030 EQ R10 R10 R11 - 0x782A0001, // 0031 JMPF R10 #0034 - 0x58280010, // 0032 LDCONST R10 K16 - 0x70020000, // 0033 JMP #0035 - 0x5828000B, // 0034 LDCONST R10 K11 - 0x7C1C0600, // 0035 CALL R7 3 - 0x7C140400, // 0036 CALL R5 2 - 0x8C14030C, // 0037 GETMET R5 R1 K12 - 0xB81E0800, // 0038 GETNGBL R7 K4 - 0x881C0F16, // 0039 GETMBR R7 R7 K22 - 0x7C140400, // 003A CALL R5 2 - 0x88140106, // 003B GETMBR R5 R0 K6 - 0x88140B15, // 003C GETMBR R5 R5 K21 - 0x4C180000, // 003D LDNIL R6 - 0x1C140A06, // 003E EQ R5 R5 R6 - 0x78160003, // 003F JMPF R5 #0044 - 0x8C14030C, // 0040 GETMET R5 R1 K12 - 0x581C0017, // 0041 LDCONST R7 K23 - 0x7C140400, // 0042 CALL R5 2 - 0x70020002, // 0043 JMP #0047 - 0x8C14030C, // 0044 GETMET R5 R1 K12 - 0x581C0018, // 0045 LDCONST R7 K24 - 0x7C140400, // 0046 CALL R5 2 - 0x80000000, // 0047 RET 0 + 0x8C080301, // 0001 GETMET R2 R1 K1 + 0x58100002, // 0002 LDCONST R4 K2 + 0x7C080400, // 0003 CALL R2 2 + 0x780A0003, // 0004 JMPF R2 #0009 + 0x88080103, // 0005 GETMBR R2 R0 K3 + 0x8C080504, // 0006 GETMET R2 R2 K4 + 0x7C080200, // 0007 CALL R2 1 + 0x70020006, // 0008 JMP #0010 + 0x8C080301, // 0009 GETMET R2 R1 K1 + 0x58100005, // 000A LDCONST R4 K5 + 0x7C080400, // 000B CALL R2 2 + 0x780A0002, // 000C JMPF R2 #0010 + 0x88080103, // 000D GETMBR R2 R0 K3 + 0x8C080506, // 000E GETMET R2 R2 K6 + 0x7C080200, // 000F CALL R2 1 + 0x80000000, // 0010 RET 0 }) ) ); @@ -1633,6 +1323,488 @@ be_local_closure(Matter_UI_init, /* name */ /*******************************************************************/ +/******************************************************************** +** Solidified function: web_sensor +********************************************************************/ +be_local_closure(Matter_UI_web_sensor, /* name */ + be_nested_proto( + 13, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[27]) { /* constants */ + /* K0 */ be_nested_str_weak(webserver), + /* K1 */ be_nested_str_weak(string), + /* K2 */ be_nested_str_weak(tasmota), + /* K3 */ be_nested_str_weak(get_option), + /* K4 */ be_nested_str_weak(matter), + /* K5 */ be_nested_str_weak(MATTER_OPTION), + /* K6 */ be_nested_str_weak(device), + /* K7 */ be_nested_str_weak(sessions), + /* K8 */ be_nested_str_weak(count_active_fabrics), + /* K9 */ be_const_int(0), + /* K10 */ be_nested_str_weak(content_send), + /* K11 */ be_nested_str_weak(format), + /* K12 */ be_nested_str_weak(_X3Cdiv_X20style_X3D_X27text_X2Dalign_X3Aright_X3Bfont_X2Dsize_X3A11px_X3Bcolor_X3A_X23aaa_X3Bpadding_X3A0px_X3B_X27_X3E_X25s_X3C_X2Fdiv_X3E), + /* K13 */ be_nested_str_weak(Matter_X3A_X20No_X20active_X20association), + /* K14 */ be_const_int(1), + /* K15 */ be_nested_str_weak(Matter_X3A_X20), + /* K16 */ be_nested_str_weak(_X20active_X20association), + /* K17 */ be_nested_str_weak(s), + /* K18 */ be_nested_str_weak(), + /* K19 */ be_nested_str_weak(show_bridge_status), + /* K20 */ be_nested_str_weak(is_root_commissioning_open), + /* K21 */ be_nested_str_weak(show_commissioning_info), + /* K22 */ be_nested_str_weak(_X3Cbutton_X20onclick_X3D_X27la_X28_X22_X26mtc_X25i_X3D1_X22_X29_X3B_X27_X3E), + /* K23 */ be_nested_str_weak(commissioning_open), + /* K24 */ be_nested_str_weak(_LOGO), + /* K25 */ be_nested_str_weak(_X20Open_X20Commissioning_X3C_X2Fbutton_X3E), + /* K26 */ be_nested_str_weak(_X20Close_X20Commissioning_X3C_X2Fbutton_X3E), + }), + be_str_weak(web_sensor), + &be_const_str_solidified, + ( &(const binstruction[77]) { /* code */ + 0xA4060000, // 0000 IMPORT R1 K0 + 0xA40A0200, // 0001 IMPORT R2 K1 + 0xB80E0400, // 0002 GETNGBL R3 K2 + 0x8C0C0703, // 0003 GETMET R3 R3 K3 + 0xB8160800, // 0004 GETNGBL R5 K4 + 0x88140B05, // 0005 GETMBR R5 R5 K5 + 0x7C0C0400, // 0006 CALL R3 2 + 0x780E0043, // 0007 JMPF R3 #004C + 0x88100106, // 0008 GETMBR R4 R0 K6 + 0x88100907, // 0009 GETMBR R4 R4 K7 + 0x8C100908, // 000A GETMET R4 R4 K8 + 0x7C100200, // 000B CALL R4 1 + 0x1C140909, // 000C EQ R5 R4 K9 + 0x78160006, // 000D JMPF R5 #0015 + 0x8C14030A, // 000E GETMET R5 R1 K10 + 0x8C1C050B, // 000F GETMET R7 R2 K11 + 0x5824000C, // 0010 LDCONST R9 K12 + 0x5828000D, // 0011 LDCONST R10 K13 + 0x7C1C0600, // 0012 CALL R7 3 + 0x7C140400, // 0013 CALL R5 2 + 0x7002000F, // 0014 JMP #0025 + 0x2414090E, // 0015 GT R5 R4 K14 + 0x8C18030A, // 0016 GETMET R6 R1 K10 + 0x8C20050B, // 0017 GETMET R8 R2 K11 + 0x5828000C, // 0018 LDCONST R10 K12 + 0x602C0008, // 0019 GETGBL R11 G8 + 0x5C300800, // 001A MOVE R12 R4 + 0x7C2C0200, // 001B CALL R11 1 + 0x002E1E0B, // 001C ADD R11 K15 R11 + 0x002C1710, // 001D ADD R11 R11 K16 + 0x78160001, // 001E JMPF R5 #0021 + 0x58300011, // 001F LDCONST R12 K17 + 0x70020000, // 0020 JMP #0022 + 0x58300012, // 0021 LDCONST R12 K18 + 0x002C160C, // 0022 ADD R11 R11 R12 + 0x7C200600, // 0023 CALL R8 3 + 0x7C180400, // 0024 CALL R6 2 + 0x8C140113, // 0025 GETMET R5 R0 K19 + 0x7C140200, // 0026 CALL R5 1 + 0x88140106, // 0027 GETMBR R5 R0 K6 + 0x8C140B14, // 0028 GETMET R5 R5 K20 + 0x7C140200, // 0029 CALL R5 1 + 0x78160001, // 002A JMPF R5 #002D + 0x8C140115, // 002B GETMET R5 R0 K21 + 0x7C140200, // 002C CALL R5 1 + 0x1C140909, // 002D EQ R5 R4 K9 + 0x7816001C, // 002E JMPF R5 #004C + 0x8C14030A, // 002F GETMET R5 R1 K10 + 0x8C1C050B, // 0030 GETMET R7 R2 K11 + 0x58240016, // 0031 LDCONST R9 K22 + 0x88280106, // 0032 GETMBR R10 R0 K6 + 0x88281517, // 0033 GETMBR R10 R10 K23 + 0x4C2C0000, // 0034 LDNIL R11 + 0x1C28140B, // 0035 EQ R10 R10 R11 + 0x782A0001, // 0036 JMPF R10 #0039 + 0x5828000E, // 0037 LDCONST R10 K14 + 0x70020000, // 0038 JMP #003A + 0x58280009, // 0039 LDCONST R10 K9 + 0x7C1C0600, // 003A CALL R7 3 + 0x7C140400, // 003B CALL R5 2 + 0x8C14030A, // 003C GETMET R5 R1 K10 + 0xB81E0800, // 003D GETNGBL R7 K4 + 0x881C0F18, // 003E GETMBR R7 R7 K24 + 0x7C140400, // 003F CALL R5 2 + 0x88140106, // 0040 GETMBR R5 R0 K6 + 0x88140B17, // 0041 GETMBR R5 R5 K23 + 0x4C180000, // 0042 LDNIL R6 + 0x1C140A06, // 0043 EQ R5 R5 R6 + 0x78160003, // 0044 JMPF R5 #0049 + 0x8C14030A, // 0045 GETMET R5 R1 K10 + 0x581C0019, // 0046 LDCONST R7 K25 + 0x7C140400, // 0047 CALL R5 2 + 0x70020002, // 0048 JMP #004C + 0x8C14030A, // 0049 GETMET R5 R1 K10 + 0x581C001A, // 004A LDCONST R7 K26 + 0x7C140400, // 004B CALL R5 2 + 0x80000000, // 004C RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: show_plugins_configuration +********************************************************************/ +be_local_closure(Matter_UI_show_plugins_configuration, /* name */ + be_nested_proto( + 19, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[37]) { /* constants */ + /* K0 */ be_nested_str_weak(webserver), + /* K1 */ be_nested_str_weak(string), + /* K2 */ be_nested_str_weak(content_send), + /* K3 */ be_nested_str_weak(_X3Cfieldset_X3E_X3Clegend_X3E_X3Cb_X3E_X26nbsp_X3BCurrent_X20Configuration_X26nbsp_X3B_X3C_X2Fb_X3E_X3C_X2Flegend_X3E_X3Cp_X3E_X3C_X2Fp_X3E), + /* K4 */ be_nested_str_weak(_X3Cform_X20action_X3D_X27_X2Fmatterc_X27_X20method_X3D_X27post_X27), + /* K5 */ be_nested_str_weak(onsubmit_X3D_X27return_X20confirm_X28_X22This_X20will_X20RESET_X20the_X20configuration_X20to_X20the_X20default_X2E_X20You_X20will_X20need_X20to_X20associate_X20again_X2E_X22_X29_X3B_X27_X3E), + /* K6 */ be_nested_str_weak(_X3Cbutton_X20name_X3D_X27auto_X27_X20class_X3D_X27button_X20bred_X27_X3EReset_X20to_X20default_X3C_X2Fbutton_X3E_X3Cp_X3E_X3C_X2Fp_X3E_X3C_X2Fform_X3E), + /* K7 */ be_nested_str_weak(onsubmit_X3D_X27return_X20confirm_X28_X22Changing_X20the_X20configuration_X20requires_X20to_X20associate_X20again_X2E_X22_X29_X3B_X27_X3E), + /* K8 */ be_nested_str_weak(_X3Ctable_X20style_X3D_X27width_X3A100_X25_X27_X3E), + /* K9 */ be_nested_str_weak(_X3Ctr_X3E_X3Ctd_X20width_X3D_X2735_X27_X3E_X3Cb_X3EEp_X2E_X3C_X2Fb_X3E_X3C_X2Ftd_X3E_X3Ctd_X3E_X3Cb_X3EType_X3C_X2Fb_X3E_X3C_X2Ftd_X3E_X3Ctd_X3E_X3Cb_X3EParam_X3C_X2Fb_X3E_X3C_X2Ftd_X3E_X3C_X2Ftr_X3E), + /* K10 */ be_nested_str_weak(device), + /* K11 */ be_nested_str_weak(k2l_num), + /* K12 */ be_nested_str_weak(plugins_config), + /* K13 */ be_const_int(0), + /* K14 */ be_nested_str_weak(find), + /* K15 */ be_nested_str_weak(type), + /* K16 */ be_nested_str_weak(format), + /* K17 */ be_nested_str_weak(_X3Ctr_X3E_X3Ctd_X3E_X3Cinput_X20type_X3D_X27text_X27_X20name_X3D_X27ep_X2503i_X27_X20maxlength_X3D_X274_X27_X20size_X3D_X273_X27_X20value_X3D_X270_X27_X20readonly_X3E_X3C_X2Ftd_X3E), + /* K18 */ be_nested_str_weak(_X3Ctd_X3E_X3Cselect_X20name_X3D_X27pi_X2503i_X27_X3E), + /* K19 */ be_nested_str_weak(plugin_option), + /* K20 */ be_nested_str_weak(), + /* K21 */ be_nested_str_weak(_ROOT_TYPES), + /* K22 */ be_nested_str_weak(_X3C_X2Fselect_X3E_X3C_X2Ftd_X3E), + /* K23 */ be_nested_str_weak(_X3Ctd_X3E_X3Cfont_X20size_X3D_X27_X2D1_X27_X3E_X26nbsp_X3B_X3C_X2Ffont_X3E_X3C_X2Ftd_X3E), + /* K24 */ be_const_int(1), + /* K25 */ be_nested_str_weak(plugins_classes), + /* K26 */ be_nested_str_weak(ui_conf_to_string), + /* K27 */ be_nested_str_weak(_X3Ctr_X3E_X3Ctd_X3E_X3Cinput_X20type_X3D_X27text_X27_X20name_X3D_X27ep_X2503i_X27_X20maxlength_X3D_X274_X27_X20size_X3D_X273_X27_X20pattern_X3D_X27_X5B0_X2D9_X5D_X7B1_X2C4_X7D_X27_X20value_X3D_X27_X25i_X27_X3E_X3C_X2Ftd_X3E), + /* K28 */ be_nested_str_weak(_CLASSES_TYPES), + /* K29 */ be_nested_str_weak(_CLASSES_TYPES2), + /* K30 */ be_nested_str_weak(_X3Ctd_X3E_X3Cfont_X20size_X3D_X27_X2D1_X27_X3E_X3Cinput_X20type_X3D_X27text_X27_X20name_X3D_X27arg_X2503i_X27_X20minlength_X3D_X270_X27_X20size_X3D_X278_X27_X20value_X3D_X27_X25s_X27_X3E_X3C_X2Ffont_X3E_X3C_X2Ftd_X3E), + /* K31 */ be_nested_str_weak(html_escape), + /* K32 */ be_nested_str_weak(_X3Ctr_X3E_X3Ctd_X3E_X3Cinput_X20type_X3D_X27text_X27_X20name_X3D_X27ep_X2503i_X27_X20maxlength_X3D_X274_X27_X20size_X3D_X273_X27_X20pattern_X3D_X27_X5B0_X2D9_X5D_X7B1_X2C4_X7D_X27_X20value_X3D_X27_X27_X3E_X3C_X2Ftd_X3E), + /* K33 */ be_nested_str_weak(_X3Ctd_X3E_X3Cfont_X20size_X3D_X27_X2D1_X27_X3E_X3Cinput_X20type_X3D_X27text_X27_X20name_X3D_X27arg_X2503i_X27_X20minlength_X3D_X270_X27_X20size_X3D_X278_X27_X20value_X3D_X27_X27_X3E_X3C_X2Ffont_X3E_X3C_X2Ftd_X3E), + /* K34 */ be_nested_str_weak(_X3C_X2Ftable_X3E_X3Cp_X3E_X3C_X2Fp_X3E), + /* K35 */ be_nested_str_weak(_X3Cbutton_X20name_X3D_X27config_X27_X20class_X3D_X27button_X20bgrn_X27_X3EChange_X20configuration_X3C_X2Fbutton_X3E_X3C_X2Fform_X3E), + /* K36 */ be_nested_str_weak(_X3Cp_X3E_X3C_X2Fp_X3E_X3C_X2Ffieldset_X3E_X3Cp_X3E_X3C_X2Fp_X3E), + }), + be_str_weak(show_plugins_configuration), + &be_const_str_solidified, + ( &(const binstruction[183]) { /* code */ + 0xA4060000, // 0000 IMPORT R1 K0 + 0xA40A0200, // 0001 IMPORT R2 K1 + 0x8C0C0302, // 0002 GETMET R3 R1 K2 + 0x58140003, // 0003 LDCONST R5 K3 + 0x7C0C0400, // 0004 CALL R3 2 + 0x8C0C0302, // 0005 GETMET R3 R1 K2 + 0x58140004, // 0006 LDCONST R5 K4 + 0x7C0C0400, // 0007 CALL R3 2 + 0x8C0C0302, // 0008 GETMET R3 R1 K2 + 0x58140005, // 0009 LDCONST R5 K5 + 0x7C0C0400, // 000A CALL R3 2 + 0x8C0C0302, // 000B GETMET R3 R1 K2 + 0x58140006, // 000C LDCONST R5 K6 + 0x7C0C0400, // 000D CALL R3 2 + 0x8C0C0302, // 000E GETMET R3 R1 K2 + 0x58140004, // 000F LDCONST R5 K4 + 0x7C0C0400, // 0010 CALL R3 2 + 0x8C0C0302, // 0011 GETMET R3 R1 K2 + 0x58140007, // 0012 LDCONST R5 K7 + 0x7C0C0400, // 0013 CALL R3 2 + 0x8C0C0302, // 0014 GETMET R3 R1 K2 + 0x58140008, // 0015 LDCONST R5 K8 + 0x7C0C0400, // 0016 CALL R3 2 + 0x8C0C0302, // 0017 GETMET R3 R1 K2 + 0x58140009, // 0018 LDCONST R5 K9 + 0x7C0C0400, // 0019 CALL R3 2 + 0x880C010A, // 001A GETMBR R3 R0 K10 + 0x8C0C070B, // 001B GETMET R3 R3 K11 + 0x8814010A, // 001C GETMBR R5 R0 K10 + 0x88140B0C, // 001D GETMBR R5 R5 K12 + 0x7C0C0400, // 001E CALL R3 2 + 0x5810000D, // 001F LDCONST R4 K13 + 0x9414070D, // 0020 GETIDX R5 R3 K13 + 0x1C140B0D, // 0021 EQ R5 R5 K13 + 0x78160026, // 0022 JMPF R5 #004A + 0x94140604, // 0023 GETIDX R5 R3 R4 + 0x8818010A, // 0024 GETMBR R6 R0 K10 + 0x601C0008, // 0025 GETGBL R7 G8 + 0x5C200A00, // 0026 MOVE R8 R5 + 0x7C1C0200, // 0027 CALL R7 1 + 0x88180D0C, // 0028 GETMBR R6 R6 K12 + 0x94180C07, // 0029 GETIDX R6 R6 R7 + 0x8C200D0E, // 002A GETMET R8 R6 K14 + 0x5828000F, // 002B LDCONST R10 K15 + 0x7C200400, // 002C CALL R8 2 + 0x5C1C1000, // 002D MOVE R7 R8 + 0x8C200302, // 002E GETMET R8 R1 K2 + 0x8C280510, // 002F GETMET R10 R2 K16 + 0x58300011, // 0030 LDCONST R12 K17 + 0x5C340800, // 0031 MOVE R13 R4 + 0x7C280600, // 0032 CALL R10 3 + 0x7C200400, // 0033 CALL R8 2 + 0x8C200302, // 0034 GETMET R8 R1 K2 + 0x8C280510, // 0035 GETMET R10 R2 K16 + 0x58300012, // 0036 LDCONST R12 K18 + 0x5C340800, // 0037 MOVE R13 R4 + 0x7C280600, // 0038 CALL R10 3 + 0x7C200400, // 0039 CALL R8 2 + 0x8C200113, // 003A GETMET R8 R0 K19 + 0x8C280D0E, // 003B GETMET R10 R6 K14 + 0x5830000F, // 003C LDCONST R12 K15 + 0x58340014, // 003D LDCONST R13 K20 + 0x7C280600, // 003E CALL R10 3 + 0x882C0115, // 003F GETMBR R11 R0 K21 + 0x7C200600, // 0040 CALL R8 3 + 0x8C200302, // 0041 GETMET R8 R1 K2 + 0x8C280510, // 0042 GETMET R10 R2 K16 + 0x58300016, // 0043 LDCONST R12 K22 + 0x7C280400, // 0044 CALL R10 2 + 0x7C200400, // 0045 CALL R8 2 + 0x8C200302, // 0046 GETMET R8 R1 K2 + 0x58280017, // 0047 LDCONST R10 K23 + 0x7C200400, // 0048 CALL R8 2 + 0x00100918, // 0049 ADD R4 R4 K24 + 0x6014000C, // 004A GETGBL R5 G12 + 0x5C180600, // 004B MOVE R6 R3 + 0x7C140200, // 004C CALL R5 1 + 0x14140805, // 004D LT R5 R4 R5 + 0x78160041, // 004E JMPF R5 #0091 + 0x94140604, // 004F GETIDX R5 R3 R4 + 0x8818010A, // 0050 GETMBR R6 R0 K10 + 0x601C0008, // 0051 GETGBL R7 G8 + 0x5C200A00, // 0052 MOVE R8 R5 + 0x7C1C0200, // 0053 CALL R7 1 + 0x88180D0C, // 0054 GETMBR R6 R6 K12 + 0x94180C07, // 0055 GETIDX R6 R6 R7 + 0x8C200D0E, // 0056 GETMET R8 R6 K14 + 0x5828000F, // 0057 LDCONST R10 K15 + 0x7C200400, // 0058 CALL R8 2 + 0x5C1C1000, // 0059 MOVE R7 R8 + 0x5C200E00, // 005A MOVE R8 R7 + 0x74220001, // 005B JMPT R8 #005E + 0x00100918, // 005C ADD R4 R4 K24 + 0x7001FFEB, // 005D JMP #004A + 0x8820010A, // 005E GETMBR R8 R0 K10 + 0x88201119, // 005F GETMBR R8 R8 K25 + 0x8C20110E, // 0060 GETMET R8 R8 K14 + 0x5C280E00, // 0061 MOVE R10 R7 + 0x7C200400, // 0062 CALL R8 2 + 0x58240014, // 0063 LDCONST R9 K20 + 0x4C280000, // 0064 LDNIL R10 + 0x2028100A, // 0065 NE R10 R8 R10 + 0x782A0004, // 0066 JMPF R10 #006C + 0x8C28111A, // 0067 GETMET R10 R8 K26 + 0x5C301000, // 0068 MOVE R12 R8 + 0x5C340C00, // 0069 MOVE R13 R6 + 0x7C280600, // 006A CALL R10 3 + 0x5C241400, // 006B MOVE R9 R10 + 0x8C280302, // 006C GETMET R10 R1 K2 + 0x8C300510, // 006D GETMET R12 R2 K16 + 0x5838001B, // 006E LDCONST R14 K27 + 0x5C3C0800, // 006F MOVE R15 R4 + 0x5C400A00, // 0070 MOVE R16 R5 + 0x7C300800, // 0071 CALL R12 4 + 0x7C280400, // 0072 CALL R10 2 + 0x8C280302, // 0073 GETMET R10 R1 K2 + 0x8C300510, // 0074 GETMET R12 R2 K16 + 0x58380012, // 0075 LDCONST R14 K18 + 0x5C3C0800, // 0076 MOVE R15 R4 + 0x7C300600, // 0077 CALL R12 3 + 0x7C280400, // 0078 CALL R10 2 + 0x8C280113, // 0079 GETMET R10 R0 K19 + 0x8C300D0E, // 007A GETMET R12 R6 K14 + 0x5838000F, // 007B LDCONST R14 K15 + 0x583C0014, // 007C LDCONST R15 K20 + 0x7C300600, // 007D CALL R12 3 + 0x8834011C, // 007E GETMBR R13 R0 K28 + 0x8838011D, // 007F GETMBR R14 R0 K29 + 0x7C280800, // 0080 CALL R10 4 + 0x8C280302, // 0081 GETMET R10 R1 K2 + 0x8C300510, // 0082 GETMET R12 R2 K16 + 0x58380016, // 0083 LDCONST R14 K22 + 0x7C300400, // 0084 CALL R12 2 + 0x7C280400, // 0085 CALL R10 2 + 0x8C280302, // 0086 GETMET R10 R1 K2 + 0x8C300510, // 0087 GETMET R12 R2 K16 + 0x5838001E, // 0088 LDCONST R14 K30 + 0x5C3C0800, // 0089 MOVE R15 R4 + 0x8C40031F, // 008A GETMET R16 R1 K31 + 0x5C481200, // 008B MOVE R18 R9 + 0x7C400400, // 008C CALL R16 2 + 0x7C300800, // 008D CALL R12 4 + 0x7C280400, // 008E CALL R10 2 + 0x00100918, // 008F ADD R4 R4 K24 + 0x7001FFB8, // 0090 JMP #004A + 0x8C140302, // 0091 GETMET R5 R1 K2 + 0x8C1C0510, // 0092 GETMET R7 R2 K16 + 0x58240020, // 0093 LDCONST R9 K32 + 0x5C280800, // 0094 MOVE R10 R4 + 0x7C1C0600, // 0095 CALL R7 3 + 0x7C140400, // 0096 CALL R5 2 + 0x8C140302, // 0097 GETMET R5 R1 K2 + 0x8C1C0510, // 0098 GETMET R7 R2 K16 + 0x58240012, // 0099 LDCONST R9 K18 + 0x5C280800, // 009A MOVE R10 R4 + 0x7C1C0600, // 009B CALL R7 3 + 0x7C140400, // 009C CALL R5 2 + 0x8C140113, // 009D GETMET R5 R0 K19 + 0x581C0014, // 009E LDCONST R7 K20 + 0x8820011C, // 009F GETMBR R8 R0 K28 + 0x8824011D, // 00A0 GETMBR R9 R0 K29 + 0x7C140800, // 00A1 CALL R5 4 + 0x8C140302, // 00A2 GETMET R5 R1 K2 + 0x8C1C0510, // 00A3 GETMET R7 R2 K16 + 0x58240016, // 00A4 LDCONST R9 K22 + 0x7C1C0400, // 00A5 CALL R7 2 + 0x7C140400, // 00A6 CALL R5 2 + 0x8C140302, // 00A7 GETMET R5 R1 K2 + 0x8C1C0510, // 00A8 GETMET R7 R2 K16 + 0x58240021, // 00A9 LDCONST R9 K33 + 0x5C280800, // 00AA MOVE R10 R4 + 0x7C1C0600, // 00AB CALL R7 3 + 0x7C140400, // 00AC CALL R5 2 + 0x8C140302, // 00AD GETMET R5 R1 K2 + 0x581C0022, // 00AE LDCONST R7 K34 + 0x7C140400, // 00AF CALL R5 2 + 0x8C140302, // 00B0 GETMET R5 R1 K2 + 0x581C0023, // 00B1 LDCONST R7 K35 + 0x7C140400, // 00B2 CALL R5 2 + 0x8C140302, // 00B3 GETMET R5 R1 K2 + 0x581C0024, // 00B4 LDCONST R7 K36 + 0x7C140400, // 00B5 CALL R5 2 + 0x80000000, // 00B6 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: show_commissioning_info +********************************************************************/ +be_local_closure(Matter_UI_show_commissioning_info, /* name */ + be_nested_proto( + 14, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[20]) { /* constants */ + /* K0 */ be_nested_str_weak(webserver), + /* K1 */ be_nested_str_weak(string), + /* K2 */ be_nested_str_weak(device), + /* K3 */ be_nested_str_weak(commissioning_open), + /* K4 */ be_nested_str_weak(tasmota), + /* K5 */ be_nested_str_weak(millis), + /* K6 */ be_const_int(0), + /* K7 */ be_nested_str_weak(content_send), + /* K8 */ be_nested_str_weak(format), + /* K9 */ be_nested_str_weak(_X3Cfieldset_X3E_X3Clegend_X3E_X3Cb_X3E_X26nbsp_X3BCommissioning_X20open_X20for_X20_X25i_X20min_X26nbsp_X3B_X3C_X2Fb_X3E_X3C_X2Flegend_X3E_X3Cp_X3E_X3C_X2Fp_X3E), + /* K10 */ be_nested_str_weak(compute_manual_pairing_code), + /* K11 */ be_nested_str_weak(_X3Cp_X3EManual_X20pairing_X20code_X3A_X3Cbr_X3E_X3Cb_X3E_X25s_X2D_X25s_X2D_X25s_X3C_X2Fb_X3E_X3C_X2Fp_X3E_X3Chr_X3E), + /* K12 */ be_const_int(3), + /* K13 */ be_const_int(2147483647), + /* K14 */ be_nested_str_weak(_X3Cdiv_X3E_X3Ccenter_X3E), + /* K15 */ be_nested_str_weak(compute_qrcode_content), + /* K16 */ be_nested_str_weak(show_qrcode), + /* K17 */ be_nested_str_weak(_X3Cp_X3E_X20_X25s_X3C_X2Fp_X3E), + /* K18 */ be_nested_str_weak(_X3C_X2Fdiv_X3E), + /* K19 */ be_nested_str_weak(_X3Cp_X3E_X3C_X2Fp_X3E_X3C_X2Ffieldset_X3E_X3Cp_X3E_X3C_X2Fp_X3E), + }), + be_str_weak(show_commissioning_info), + &be_const_str_solidified, + ( &(const binstruction[66]) { /* code */ + 0xA4060000, // 0000 IMPORT R1 K0 + 0xA40A0200, // 0001 IMPORT R2 K1 + 0x880C0102, // 0002 GETMBR R3 R0 K2 + 0x880C0703, // 0003 GETMBR R3 R3 K3 + 0xB8120800, // 0004 GETNGBL R4 K4 + 0x8C100905, // 0005 GETMET R4 R4 K5 + 0x7C100200, // 0006 CALL R4 1 + 0x040C0604, // 0007 SUB R3 R3 R4 + 0x541203E7, // 0008 LDINT R4 1000 + 0x0C0C0604, // 0009 DIV R3 R3 R4 + 0x14100706, // 000A LT R4 R3 K6 + 0x78120000, // 000B JMPF R4 #000D + 0x580C0006, // 000C LDCONST R3 K6 + 0x5412001D, // 000D LDINT R4 30 + 0x00100604, // 000E ADD R4 R3 R4 + 0x5416003B, // 000F LDINT R5 60 + 0x0C100805, // 0010 DIV R4 R4 R5 + 0x8C140307, // 0011 GETMET R5 R1 K7 + 0x8C1C0508, // 0012 GETMET R7 R2 K8 + 0x58240009, // 0013 LDCONST R9 K9 + 0x5C280800, // 0014 MOVE R10 R4 + 0x7C1C0600, // 0015 CALL R7 3 + 0x7C140400, // 0016 CALL R5 2 + 0x88140102, // 0017 GETMBR R5 R0 K2 + 0x8C140B0A, // 0018 GETMET R5 R5 K10 + 0x7C140200, // 0019 CALL R5 1 + 0x8C180307, // 001A GETMET R6 R1 K7 + 0x8C200508, // 001B GETMET R8 R2 K8 + 0x5828000B, // 001C LDCONST R10 K11 + 0x402E0D0C, // 001D CONNECT R11 K6 K12 + 0x942C0A0B, // 001E GETIDX R11 R5 R11 + 0x54320003, // 001F LDINT R12 4 + 0x54360005, // 0020 LDINT R13 6 + 0x4030180D, // 0021 CONNECT R12 R12 R13 + 0x94300A0C, // 0022 GETIDX R12 R5 R12 + 0x54360006, // 0023 LDINT R13 7 + 0x40341B0D, // 0024 CONNECT R13 R13 K13 + 0x94340A0D, // 0025 GETIDX R13 R5 R13 + 0x7C200A00, // 0026 CALL R8 5 + 0x7C180400, // 0027 CALL R6 2 + 0x8C180307, // 0028 GETMET R6 R1 K7 + 0x8C200508, // 0029 GETMET R8 R2 K8 + 0x5828000E, // 002A LDCONST R10 K14 + 0x7C200400, // 002B CALL R8 2 + 0x7C180400, // 002C CALL R6 2 + 0x88180102, // 002D GETMBR R6 R0 K2 + 0x8C180D0F, // 002E GETMET R6 R6 K15 + 0x7C180200, // 002F CALL R6 1 + 0x8C1C0110, // 0030 GETMET R7 R0 K16 + 0x5C240C00, // 0031 MOVE R9 R6 + 0x7C1C0400, // 0032 CALL R7 2 + 0x8C1C0307, // 0033 GETMET R7 R1 K7 + 0x8C240508, // 0034 GETMET R9 R2 K8 + 0x582C0011, // 0035 LDCONST R11 K17 + 0x5C300C00, // 0036 MOVE R12 R6 + 0x7C240600, // 0037 CALL R9 3 + 0x7C1C0400, // 0038 CALL R7 2 + 0x8C1C0307, // 0039 GETMET R7 R1 K7 + 0x8C240508, // 003A GETMET R9 R2 K8 + 0x582C0012, // 003B LDCONST R11 K18 + 0x7C240400, // 003C CALL R9 2 + 0x7C1C0400, // 003D CALL R7 2 + 0x8C1C0307, // 003E GETMET R7 R1 K7 + 0x58240013, // 003F LDCONST R9 K19 + 0x7C1C0400, // 0040 CALL R7 2 + 0x80000000, // 0041 RET 0 + }) + ) +); +/*******************************************************************/ + + /******************************************************************** ** Solidified function: show_fabric_info ********************************************************************/ @@ -1795,25 +1967,27 @@ be_local_closure(Matter_UI_show_fabric_info, /* name */ be_local_class(Matter_UI, 1, NULL, - be_nested_map(17, + be_nested_map(19, ( (struct bmapnode*) &(const bmapnode[]) { - { be_const_key_weak(show_plugins_configuration, -1), be_const_closure(Matter_UI_show_plugins_configuration_closure) }, - { be_const_key_weak(_CLASSES_TYPES, 2), be_nested_str_weak(_X7Crelay_X7Clight0_X7Clight1_X7Clight2_X7Clight3_X7Cshutter_X7Cshutter_X2Btilt_X7Ctemperature_X7Cpressure_X7Cilluminance_X7Chumidity_X7C_X2Dhttp_X7Chttp_relay) }, - { be_const_key_weak(show_fabric_info, 7), be_const_closure(Matter_UI_show_fabric_info_closure) }, - { be_const_key_weak(init, -1), be_const_closure(Matter_UI_init_closure) }, - { be_const_key_weak(web_add_handler, -1), be_const_closure(Matter_UI_web_add_handler_closure) }, - { be_const_key_weak(_ROOT_TYPES, 11), be_nested_str_weak(root) }, - { be_const_key_weak(show_commissioning_info, 16), be_const_closure(Matter_UI_show_commissioning_info_closure) }, + { be_const_key_weak(_CLASSES_TYPES, -1), be_nested_str_weak(_X7Crelay_X7Clight0_X7Clight1_X7Clight2_X7Clight3_X7Cshutter_X7Cshutter_X2Btilt_X7Ctemperature_X7Cpressure_X7Cilluminance_X7Chumidity) }, { be_const_key_weak(device, -1), be_const_var(0) }, - { be_const_key_weak(web_add_config_button, -1), be_const_closure(Matter_UI_web_add_config_button_closure) }, - { be_const_key_weak(page_part_ctl, 5), be_const_closure(Matter_UI_page_part_ctl_closure) }, - { be_const_key_weak(web_get_arg, 13), be_const_closure(Matter_UI_web_get_arg_closure) }, - { be_const_key_weak(web_sensor, 12), be_const_closure(Matter_UI_web_sensor_closure) }, - { be_const_key_weak(show_enable, 14), be_const_closure(Matter_UI_show_enable_closure) }, + { be_const_key_weak(show_enable, -1), be_const_closure(Matter_UI_show_enable_closure) }, { be_const_key_weak(plugin_option, -1), be_const_closure(Matter_UI_plugin_option_closure) }, + { be_const_key_weak(show_bridge_status, -1), be_const_closure(Matter_UI_show_bridge_status_closure) }, { be_const_key_weak(show_qrcode, -1), be_const_closure(Matter_UI_show_qrcode_closure) }, - { be_const_key_weak(page_part_mgr, 3), be_const_closure(Matter_UI_page_part_mgr_closure) }, - { be_const_key_weak(show_passcode_form, -1), be_const_closure(Matter_UI_show_passcode_form_closure) }, + { be_const_key_weak(web_get_arg, -1), be_const_closure(Matter_UI_web_get_arg_closure) }, + { be_const_key_weak(show_plugins_configuration, 1), be_const_closure(Matter_UI_show_plugins_configuration_closure) }, + { be_const_key_weak(web_sensor, -1), be_const_closure(Matter_UI_web_sensor_closure) }, + { be_const_key_weak(show_passcode_form, 2), be_const_closure(Matter_UI_show_passcode_form_closure) }, + { be_const_key_weak(web_add_handler, -1), be_const_closure(Matter_UI_web_add_handler_closure) }, + { be_const_key_weak(init, -1), be_const_closure(Matter_UI_init_closure) }, + { be_const_key_weak(_ROOT_TYPES, 6), be_nested_str_weak(root) }, + { be_const_key_weak(page_part_ctl, 11), be_const_closure(Matter_UI_page_part_ctl_closure) }, + { be_const_key_weak(web_add_config_button, 8), be_const_closure(Matter_UI_web_add_config_button_closure) }, + { be_const_key_weak(page_part_mgr, 7), be_const_closure(Matter_UI_page_part_mgr_closure) }, + { be_const_key_weak(show_commissioning_info, -1), be_const_closure(Matter_UI_show_commissioning_info_closure) }, + { be_const_key_weak(_CLASSES_TYPES2, -1), be_nested_str_weak(_X2Dhttp_X7Chttp_relay_X7Chttp_light0_X7Chttp_light1_X7Chttp_light2_X7Chttp_light3_X7Chttp_temperature_X7Chttp_pressure_X7Chttp_illuminance_X7Chttp_humidity) }, + { be_const_key_weak(show_fabric_info, -1), be_const_closure(Matter_UI_show_fabric_info_closure) }, })), be_str_weak(Matter_UI) ); diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_inspect.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_inspect.h index 3c038fc3a..ffd15d643 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_inspect.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_inspect.h @@ -60,6 +60,51 @@ be_local_closure(matter_sort, /* name */ /*******************************************************************/ +/******************************************************************** +** Solidified function: jitter +********************************************************************/ +be_local_closure(matter_jitter, /* name */ + be_nested_proto( + 6, /* nstack */ + 1, /* argc */ + 0, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 7]) { /* constants */ + /* K0 */ be_nested_str_weak(crypto), + /* K1 */ be_nested_str_weak(random), + /* K2 */ be_nested_str_weak(get), + /* K3 */ be_const_int(0), + /* K4 */ be_const_int(2147483647), + /* K5 */ be_nested_str_weak(tasmota), + /* K6 */ be_nested_str_weak(millis), + }), + be_str_weak(jitter), + &be_const_str_solidified, + ( &(const binstruction[14]) { /* code */ + 0xA4060000, // 0000 IMPORT R1 K0 + 0x8C080301, // 0001 GETMET R2 R1 K1 + 0x54120003, // 0002 LDINT R4 4 + 0x7C080400, // 0003 CALL R2 2 + 0x8C080502, // 0004 GETMET R2 R2 K2 + 0x58100003, // 0005 LDCONST R4 K3 + 0x54160003, // 0006 LDINT R5 4 + 0x7C080600, // 0007 CALL R2 3 + 0x2C080504, // 0008 AND R2 R2 K4 + 0xB80E0A00, // 0009 GETNGBL R3 K5 + 0x8C0C0706, // 000A GETMET R3 R3 K6 + 0x10140400, // 000B MOD R5 R2 R0 + 0x7C0C0400, // 000C CALL R3 2 + 0x80040600, // 000D RET 1 R3 + }) + ) +); +/*******************************************************************/ + + /******************************************************************** ** Solidified function: inspect ********************************************************************/ diff --git a/tasmota/tasmota_xdrv_driver/xdrv_52_3_berry_matter.ino b/tasmota/tasmota_xdrv_driver/xdrv_52_3_berry_matter.ino new file mode 100644 index 000000000..4503500e8 --- /dev/null +++ b/tasmota/tasmota_xdrv_driver/xdrv_52_3_berry_matter.ino @@ -0,0 +1,79 @@ +/* + xdrv_52_3_berry_matter.ino - Berry support for Matter UI + + Copyright (C) 2021 Stephan Hadinger, Berry language by Guan Wenliang https://github.com/Skiars/berry + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +// Mappgin from internal light and a generic `light_state` Berry class + +#ifdef USE_BERRY + +// Convert seconds to a string representing days, hours or minutes present in the n-value. +// The string will contain the most coarse time only, rounded down (61m == 01h, 01h37m == 01h). +// Inputs: +// - seconds: uint32_t representing some number of seconds +// Outputs: +// - char for unit (d for day, h for hour, m for minute) +// - the hex color to be used to display the text +// +extern "C" uint32_t matter_convert_seconds_to_dhm(uint32_t seconds, char *unit, uint32_t *color, bbool days) { + *color = WebColor(COL_TEXT); + static const uint32_t conversions[3] = {24 * 3600, 3600, 60}; + static const char units[3] = { 'd', 'h', 'm'}; // day, hour, minute + static const uint32_t color_threshold_hours[2] = {24 * 3600, 3600}; // 0 - 1 hour - 1 day + static const uint32_t color_threshold_days[2] = {7 * 24 * 3600, 2 * 24 * 3600}; // 0 - 2 days - 7 days + + uint32_t color_text_8 = WebColor(COL_TEXT); // color of text on 8 bits + uint8_t color_text_8_r = (color_text_8 & 0xFF0000) >> 16; + uint8_t color_text_8_g = (color_text_8 & 0x00FF00) >> 8; + uint8_t color_text_8_b = (color_text_8 & 0x0000FF); + + uint32_t color_back_8 = WebColor(COL_BACKGROUND); // color of background on 8 bits + uint8_t color_back_8_r = (color_back_8 & 0xFF0000) >> 16; + uint8_t color_back_8_g = (color_back_8 & 0x00FF00) >> 8; + uint8_t color_back_8_b = (color_back_8 & 0x0000FF); + + int32_t colors[3] = { + ((changeUIntScale( 6, 0, 16, color_back_8_r, color_text_8_r) & 0xFF) << 16U) | // 6/16 of text + ((changeUIntScale( 6, 0, 16, color_back_8_g, color_text_8_g) & 0xFF) << 8U) | // 6/16 of text + ( changeUIntScale( 6, 0, 16, color_back_8_b, color_text_8_r) & 0xFF), // 6/16 of text + + ((changeUIntScale(10, 0, 16, color_back_8_r, color_text_8_r) & 0xFF) << 16U) | // 10/16 of text + ((changeUIntScale(10, 0, 16, color_back_8_g, color_text_8_g) & 0xFF) << 8U) | // 10/16 of text + ( changeUIntScale(10, 0, 16, color_back_8_b, color_text_8_r) & 0xFF), // 10/16 of text + + (color_text_8_r << 16U) | + (color_text_8_g << 8U) | + (color_text_8_b) + }; + + *color = (uint32_t)colors[2]; + for (uint32_t i = 0; i < 2; i++) { + if (seconds > (days ? color_threshold_days[i] : color_threshold_hours[i])) { + *color = (uint32_t)colors[i]; + break; + } + } + for(uint32_t i = 0; i < 3; ++i) { + *unit = units[i]; + if (seconds > conversions[i]) { // always pass even if 00m + return seconds / conversions[i]; + } + } + return 0; +} + +#endif // USE_BERRY From b053cf87ece5eb14b013c51ab457fe372d5a153c Mon Sep 17 00:00:00 2001 From: s-hadinger <49731213+s-hadinger@users.noreply.github.com> Date: Mon, 29 May 2023 11:00:20 +0200 Subject: [PATCH 201/289] Berry safeguard when freeing null pointer (#18735) --- lib/libesp32/berry/src/be_mem.c | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/libesp32/berry/src/be_mem.c b/lib/libesp32/berry/src/be_mem.c index 976afece1..3657fd951 100644 --- a/lib/libesp32/berry/src/be_mem.c +++ b/lib/libesp32/berry/src/be_mem.c @@ -66,6 +66,7 @@ BERRY_API void* be_realloc(bvm *vm, void *ptr, size_t old_size, size_t new_size) /* Case 2: deallocate */ else if (new_size == 0) { + if (ptr == NULL) { return NULL; } /* safeguard */ #if BE_USE_DEBUG_GC memset(ptr, 0xFF, old_size); /* fill the structure with invalid pointers */ #endif From 8e741052b8f8db722fdc52f228575d578fa25da0 Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Mon, 29 May 2023 13:04:23 +0200 Subject: [PATCH 202/289] Core 2.0.9 from 2023.05.29 (#18736) --- platformio_tasmota32.ini | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platformio_tasmota32.ini b/platformio_tasmota32.ini index db80956c6..5cad9e835 100644 --- a/platformio_tasmota32.ini +++ b/platformio_tasmota32.ini @@ -42,7 +42,7 @@ extra_scripts = pre:pio-tools/add_c_flags.py ${esp_defaults.extra_scripts} [core32] -platform = https://github.com/tasmota/platform-espressif32/releases/download/2023.05.01/platform-espressif32.zip +platform = https://github.com/tasmota/platform-espressif32/releases/download/2023.05.02/platform-espressif32.zip platform_packages = build_unflags = ${esp32_defaults.build_unflags} build_flags = ${esp32_defaults.build_flags} From bf2982854bc1e243debdc7933b8597603048b12a Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Mon, 29 May 2023 14:21:33 +0200 Subject: [PATCH 203/289] Fix #18737 --- tasmota/tasmota_xx2c_global/xsns_interface.ino | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tasmota/tasmota_xx2c_global/xsns_interface.ino b/tasmota/tasmota_xx2c_global/xsns_interface.ino index acff24be0..f78d5e9e2 100644 --- a/tasmota/tasmota_xx2c_global/xsns_interface.ino +++ b/tasmota/tasmota_xx2c_global/xsns_interface.ino @@ -456,7 +456,7 @@ bool (* const xsns_func_ptr[])(uint32_t) = { // Sensor Function Pointers for si #endif #ifdef XSNS_109 - &Xsns109 + &Xsns109, #endif #ifdef XSNS_110 From 07b7a7ee9a5b1e7d5ffbb676502431293c69b6f3 Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Mon, 29 May 2023 16:19:55 +0200 Subject: [PATCH 204/289] Fix initial ESP32 Energy kWh total time --- RELEASENOTES.md | 1 + tasmota/tasmota_support/support_rtc.ino | 10 ++++------ tasmota/tasmota_xdrv_driver/xdrv_03_energy.ino | 3 +++ tasmota/tasmota_xdrv_driver/xdrv_03_esp32_energy.ino | 4 ++++ 4 files changed, 12 insertions(+), 6 deletions(-) diff --git a/RELEASENOTES.md b/RELEASENOTES.md index 12a7eb682..309e280cf 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -131,6 +131,7 @@ The latter links can be used for OTA upgrades too like ``OtaUrl https://ota.tasm ### Breaking Changed - Change command ``FileUpload`` index binary data detection from >199 to >299 +- Matter relay number starts at 1 instead of 0 to match Tasmota numbering ### Changed - AdafruitFingerprint library from v2.0.4 to v2.1.0 diff --git a/tasmota/tasmota_support/support_rtc.ino b/tasmota/tasmota_support/support_rtc.ino index 84f775a98..ff93c14d6 100644 --- a/tasmota/tasmota_support/support_rtc.ino +++ b/tasmota/tasmota_support/support_rtc.ino @@ -442,17 +442,15 @@ void RtcSecond(void) { last_sync = Rtc.utc_time; } - Rtc.local_time = Rtc.utc_time; - if (Rtc.local_time > START_VALID_TIME) { // 2016-01-01 + if (Rtc.utc_time > START_VALID_TIME) { // 2016-01-01 Rtc.time_timezone = RtcTimeZoneOffset(Rtc.utc_time); - Rtc.local_time += Rtc.time_timezone; + Rtc.local_time = Rtc.utc_time + Rtc.time_timezone; Rtc.time_timezone /= 60; - if (!Settings->energy_kWhtotal_time) { - Settings->energy_kWhtotal_time = Rtc.local_time; - } if (Settings->bootcount_reset_time < START_VALID_TIME) { Settings->bootcount_reset_time = Rtc.local_time; } + } else { + Rtc.local_time = Rtc.utc_time; } BreakNanoTime(Rtc.local_time, Rtc.nanos, RtcTime); diff --git a/tasmota/tasmota_xdrv_driver/xdrv_03_energy.ino b/tasmota/tasmota_xdrv_driver/xdrv_03_energy.ino index 1ef4fbdd4..ffe80ba22 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_03_energy.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_03_energy.ino @@ -389,6 +389,9 @@ void Energy200ms(void) { XnrgCall(FUNC_ENERGY_EVERY_SECOND); if (RtcTime.valid) { + if (!Settings->energy_kWhtotal_time) { + Settings->energy_kWhtotal_time = LocalTime(); + } if (!Energy->kWhtoday_offset_init && (RtcTime.day_of_year == Settings->energy_kWhdoy)) { Energy->kWhtoday_offset_init = true; diff --git a/tasmota/tasmota_xdrv_driver/xdrv_03_esp32_energy.ino b/tasmota/tasmota_xdrv_driver/xdrv_03_esp32_energy.ino index c7d8be494..71a19d25e 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_03_esp32_energy.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_03_esp32_energy.ino @@ -309,6 +309,7 @@ void EnergySettingsLoad(bool erase) { // Settings->energy_kWhtoday_ph[i], &Energy->Settings.energy_today_kWh[i], // Settings->energy_kWhyesterday_ph[i], &Energy->Settings.energy_yesterday_kWh[i]); } + Energy->Settings.energy_kWhtotal_time = Settings->energy_kWhtotal_time; // v0102 additions Energy->Settings.gui_display = ENERGY_GUI_DISPLAY_MODE; @@ -609,6 +610,9 @@ void Energy200ms(void) { XnrgCall(FUNC_ENERGY_EVERY_SECOND); if (RtcTime.valid) { + if (!Energy->Settings.energy_kWhtotal_time) { + Energy->Settings.energy_kWhtotal_time = LocalTime(); + } if (!Energy->kWhtoday_offset_init && (RtcTime.day_of_year == Energy->Settings.energy_kWhdoy)) { Energy->kWhtoday_offset_init = true; From 3f094c9be1d11751d673042217352fb700bf14b4 Mon Sep 17 00:00:00 2001 From: s-hadinger <49731213+s-hadinger@users.noreply.github.com> Date: Mon, 29 May 2023 18:50:03 +0200 Subject: [PATCH 205/289] Display descriptor for ST7735 128x160 display (#18741) --- CHANGELOG.md | 1 + .../displaydesc/ST7735_128x160_display.ini | 36 +++++++++++++++++++ 2 files changed, 37 insertions(+) create mode 100644 tasmota/displaydesc/ST7735_128x160_display.ini diff --git a/CHANGELOG.md b/CHANGELOG.md index b61bbf7f5..2c9a5e076 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,7 @@ All notable changes to this project will be documented in this file. - Command ``WifiPower 1`` to restore default wifi power - HASPmota `meta` attribute and improved `berry_run` - Matter Border Router for ESP8266 (experimental) +- Display descriptor for ST7735 128x160 display ### Breaking Changed - Matter relay number starts at 1 instead of 0 to match Tasmota numbering diff --git a/tasmota/displaydesc/ST7735_128x160_display.ini b/tasmota/displaydesc/ST7735_128x160_display.ini new file mode 100644 index 000000000..3aba00292 --- /dev/null +++ b/tasmota/displaydesc/ST7735_128x160_display.ini @@ -0,0 +1,36 @@ +:H,ST7735,128,160,16,SPI,1,*,*,*,*,*,*,*,40 +:S,2,1,1,0,40,20 +:I +EF,3,03,80,02 +CF,3,00,C1,30 +ED,4,64,03,12,81 +E8,3,85,00,78 +CB,5,39,2C,00,34,02 +F7,1,20 +EA,2,00,00 +C0,1,23 +C1,1,10 +C5,2,3e,28 +C7,1,86 +36,1,48 +37,1,00 +3A,1,55 +B1,2,00,18 +B4,1,04 +B6,3,08,82,27 +F2,1,00 +26,1,01 +E0,0F,0F,31,2B,0C,0E,08,4E,F1,37,07,10,03,0E,09,00 +E1,0F,00,0E,14,03,11,07,31,C1,48,08,0F,0C,31,36,0F +11,80 +29,80 +:o,28 +:O,29 +:A,2A,2B,2C,16 +:R,36 +:0,C0,00,00,00 +:1,A0,00,00,01 +:2,00,00,00,02 +:3,60,00,00,03 +:i,20,21 +# From 83e47fa4a8018199cb58135498721f87830e09c1 Mon Sep 17 00:00:00 2001 From: s-hadinger <49731213+s-hadinger@users.noreply.github.com> Date: Mon, 29 May 2023 19:24:06 +0200 Subject: [PATCH 206/289] Matter support for Occupancy via Switch (experimental) (#18742) --- CHANGELOG.md | 1 + .../berry_matter/src/be_matter_module.c | 4 + .../src/embedded/Matter_Message.be | 2 +- .../src/embedded/Matter_Plugin_Bridge_HTTP.be | 5 + .../embedded/Matter_Plugin_Bridge_Light0.be | 8 +- .../embedded/Matter_Plugin_Bridge_Light1.be | 2 +- .../embedded/Matter_Plugin_Bridge_Light2.be | 2 +- .../embedded/Matter_Plugin_Bridge_Light3.be | 2 +- .../embedded/Matter_Plugin_Bridge_OnOff.be | 2 +- .../Matter_Plugin_Bridge_Sensor_Occupancy.be | 111 +++ .../Matter_Plugin_Sensor_Occupancy.be | 104 +++ .../berry_matter/src/embedded/Matter_UI.be | 3 +- .../src/solidify/solidified_Matter_Message.h | 140 ++-- .../solidified_Matter_Plugin_Bridge_HTTP.h | 614 ++++++++-------- .../solidified_Matter_Plugin_Bridge_Light0.h | 691 +++++++++--------- .../solidified_Matter_Plugin_Bridge_Light1.h | 20 +- .../solidified_Matter_Plugin_Bridge_Light2.h | 26 +- .../solidified_Matter_Plugin_Bridge_Light3.h | 26 +- .../solidified_Matter_Plugin_Bridge_OnOff.h | 16 +- ...ed_Matter_Plugin_Bridge_Sensor_Occupancy.h | 348 +++++++++ ...olidified_Matter_Plugin_Sensor_Occupancy.h | 324 ++++++++ .../src/solidify/solidified_Matter_UI.h | 4 +- 22 files changed, 1676 insertions(+), 779 deletions(-) create mode 100644 lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Sensor_Occupancy.be create mode 100644 lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor_Occupancy.be create mode 100644 lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Sensor_Occupancy.h create mode 100644 lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor_Occupancy.h diff --git a/CHANGELOG.md b/CHANGELOG.md index 2c9a5e076..ce9e73f27 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,7 @@ All notable changes to this project will be documented in this file. - HASPmota `meta` attribute and improved `berry_run` - Matter Border Router for ESP8266 (experimental) - Display descriptor for ST7735 128x160 display +- Matter support for Occupancy via Switch (experimental) ### Breaking Changed - Matter relay number starts at 1 instead of 0 to match Tasmota numbering diff --git a/lib/libesp32/berry_matter/src/be_matter_module.c b/lib/libesp32/berry_matter/src/be_matter_module.c index 59f51901c..b335cd147 100644 --- a/lib/libesp32/berry_matter/src/be_matter_module.c +++ b/lib/libesp32/berry_matter/src/be_matter_module.c @@ -202,6 +202,7 @@ extern const bclass be_class_Matter_TLV; // need to declare it upfront because #include "solidify/solidified_Matter_Plugin_Sensor_Temp.h" #include "solidify/solidified_Matter_Plugin_Sensor_Illuminance.h" #include "solidify/solidified_Matter_Plugin_Sensor_Humidity.h" +#include "solidify/solidified_Matter_Plugin_Sensor_Occupancy.h" #include "solidify/solidified_Matter_Plugin_Bridge_HTTP.h" #include "solidify/solidified_Matter_Plugin_Bridge_OnOff.h" #include "solidify/solidified_Matter_Plugin_Bridge_Light0.h" @@ -213,6 +214,7 @@ extern const bclass be_class_Matter_TLV; // need to declare it upfront because #include "solidify/solidified_Matter_Plugin_Bridge_Sensor_Temp.h" #include "solidify/solidified_Matter_Plugin_Bridge_Sensor_Illuminance.h" #include "solidify/solidified_Matter_Plugin_Bridge_Sensor_Humidity.h" +#include "solidify/solidified_Matter_Plugin_Bridge_Sensor_Occupancy.h" /*********************************************************************************************\ * Get a bytes() object of the certificate DAC/PAI_Cert @@ -399,6 +401,7 @@ module matter (scope: global, strings: weak) { Plugin_Sensor_Temp, class(be_class_Matter_Plugin_Sensor_Temp) // Temperature Sensor Plugin_Sensor_Illuminance, class(be_class_Matter_Plugin_Sensor_Illuminance) // Illuminance Sensor Plugin_Sensor_Humidity, class(be_class_Matter_Plugin_Sensor_Humidity) // Humidity Sensor + Plugin_Sensor_Occupancy, class(be_class_Matter_Plugin_Sensor_Occupancy) // Occupancy Sensor Plugin_Bridge_HTTP, class(be_class_Matter_Plugin_Bridge_HTTP) // HTTP bridge superclass Plugin_Bridge_OnOff, class(be_class_Matter_Plugin_Bridge_OnOff) // HTTP Relay/Light behavior (OnOff) Plugin_Bridge_Light0, class(be_class_Matter_Plugin_Bridge_Light0) // HTTP OnOff Light @@ -410,6 +413,7 @@ module matter (scope: global, strings: weak) { Plugin_Bridge_Sensor_Temp, class(be_class_Matter_Plugin_Bridge_Sensor_Temp) // HTTP Temperature sensor Plugin_Bridge_Sensor_Illuminance, class(be_class_Matter_Plugin_Bridge_Sensor_Illuminance) // HTTP Illuminance sensor Plugin_Bridge_Sensor_Humidity, class(be_class_Matter_Plugin_Bridge_Sensor_Humidity) // HTTP Humidity sensor + Plugin_Bridge_Sensor_Occupancy, class(be_class_Matter_Plugin_Bridge_Sensor_Occupancy) // HTTP Occupancy sensor } @const_object_info_end */ diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Message.be b/lib/libesp32/berry_matter/src/embedded/Matter_Message.be index 81cbe4a7e..39cf74e30 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Message.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Message.be @@ -364,7 +364,7 @@ class Matter_Frame var m = self.raw[4 .. self.payload_idx-1] var m_clear = crypto.AES_CTR(k).decrypt(m, n, 2) # replace in-place - self.raw = self.raw[0..3] + m_clear + m[self.self.payload_idx .. ] + self.raw = self.raw[0..3] + m_clear + m[self.payload_idx .. ] end # use AES_CCM diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_HTTP.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_HTTP.be index ca96619f5..2ab00695b 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_HTTP.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_HTTP.be @@ -232,5 +232,10 @@ class Matter_Plugin_Bridge_HTTP : Matter_Plugin_Device webserver.content_send("| <-- (" + self.NAME + ") -->") end + # Show on/off value as html + def web_value_onoff(onoff) + var onoff_html = (onoff != nil ? (onoff ? "On" : "Off") : "") + return onoff_html + end end matter.Plugin_Bridge_HTTP = Matter_Plugin_Bridge_HTTP diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Light0.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Light0.be index c601a17df..b35184d51 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Light0.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Light0.be @@ -142,14 +142,8 @@ class Matter_Plugin_Bridge_Light0 : Matter_Plugin_Bridge_HTTP def web_values() import webserver import string - webserver.content_send(string.format("| Light %s", self.web_value_onoff())) + webserver.content_send(string.format("| Light %s", self.web_value_onoff(self.shadow_onoff))) end - # Show on/off value as html - def web_value_onoff() - var onoff_html = (self.shadow_onoff != nil ? (self.shadow_onoff ? "On" : "Off") : "") - return onoff_html - end - end matter.Plugin_Bridge_Light0 = Matter_Plugin_Bridge_Light0 diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Light1.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Light1.be index d6b4ef551..788a278f0 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Light1.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Light1.be @@ -171,7 +171,7 @@ class Matter_Plugin_Bridge_Light1 : Matter_Plugin_Bridge_Light0 def web_values() import webserver import string - webserver.content_send(string.format("| Light %s %s", self.web_value_onoff(), self.web_value_dimmer())) + webserver.content_send(string.format("| Light %s %s", self.web_value_onoff(self.shadow_onoff), self.web_value_dimmer())) end # Show on/off value as html diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Light2.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Light2.be index 4d7940bbc..b1ca99831 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Light2.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Light2.be @@ -172,7 +172,7 @@ class Matter_Plugin_Bridge_Light2 : Matter_Plugin_Bridge_Light1 import webserver import string webserver.content_send(string.format("| Light %s %s %s", - self.web_value_onoff(), self.web_value_dimmer(), + self.web_value_onoff(self.shadow_onoff), self.web_value_dimmer(), self.web_value_ct())) end diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Light3.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Light3.be index 6561ac795..5a687b88a 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Light3.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Light3.be @@ -200,7 +200,7 @@ class Matter_Plugin_Bridge_Light3 : Matter_Plugin_Bridge_Light1 import webserver import string webserver.content_send(string.format("| Light %s %s %s", - self.web_value_onoff(), self.web_value_dimmer(), + self.web_value_onoff(self.shadow_onoff), self.web_value_dimmer(), self.web_value_RGB())) end diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_OnOff.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_OnOff.be index e26763aa0..465454329 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_OnOff.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_OnOff.be @@ -36,7 +36,7 @@ class Matter_Plugin_Bridge_OnOff : Matter_Plugin_Bridge_Light0 def web_values() import webserver import string - webserver.content_send(string.format("| Relay %i %s", self.tasmota_relay_index, self.web_value_onoff())) + webserver.content_send(string.format("| Relay %i %s", self.tasmota_relay_index, self.web_value_onoff(self.shadow_onoff))) end end diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Sensor_Occupancy.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Sensor_Occupancy.be new file mode 100644 index 000000000..b40bbf1c8 --- /dev/null +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Sensor_Occupancy.be @@ -0,0 +1,111 @@ +# +# Matter_Plugin_Bridge_Sensor_Occupancy.be - implements base class for a Occupancy Sensor via HTTP to Tasmota +# +# Copyright (C) 2023 Stephan Hadinger & Theo Arends +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +# + +# Matter plug-in for core behavior + +# dummy declaration for solidification +class Matter_Plugin_Bridge_HTTP end + +#@ solidify:Matter_Plugin_Bridge_Sensor_Occupancy,weak + +class Matter_Plugin_Bridge_Sensor_Occupancy : Matter_Plugin_Bridge_HTTP + static var TYPE = "http_occupancy" # name of the plug-in in json + static var NAME = "🔗 Occupancy" # display name of the plug-in + static var ARG = "switch" # additional argument name (or empty if none) + static var ARG_TYPE = / x -> int(x) # function to convert argument to the right type + static var UPDATE_TIME = 5000 # update every 5s + static var UPDATE_CMD = "Status 8" # command to send for updates + + static var CLUSTERS = { + 0x0406: [0,1,2,0xFFFC,0xFFFD], # Occupancy Sensing p.105 - no writable + } + static var TYPES = { 0x0107: 2, 0x0013: 1 } # Occupancy Sensor, rev 2 + + var tasmota_switch_index # Switch number in Tasmota (one based) + var shadow_occupancy + + ############################################################# + # Constructor + def init(device, endpoint, arguments) + super(self).init(device, endpoint, arguments) + self.tasmota_switch_index = int(arguments.find(self.ARG #-'relay'-#, 1)) + if self.tasmota_switch_index <= 0 self.tasmota_switch_index = 1 end + end + + ############################################################# + # Stub for updating shadow values (local copies of what we published to the Matter gateway) + # + # This call is synnchronous and blocking. + def parse_update(data, index) + if index == 8 # Status 8 + var state = false + + state = (data.find("Switch" + str(self.tasmota_switch_index)) == "ON") + + if self.shadow_occupancy != nil && self.shadow_occupancy != bool(state) + self.attribute_updated(0x0406, 0x0000) + end + self.shadow_occupancy = state + end + end + + ############################################################# + # read an attribute + # + def read_attribute(session, ctx) + import string + var TLV = matter.TLV + var cluster = ctx.cluster + var attribute = ctx.attribute + + # ==================================================================================================== + if cluster == 0x0406 # ========== Occupancy Sensing ========== + if attribute == 0x0000 # ---------- Occupancy / U8 ---------- + if self.shadow_occupancy != nil + return TLV.create_TLV(TLV.U1, self.shadow_occupancy) + else + return TLV.create_TLV(TLV.NULL, nil) + end + elif attribute == 0x0001 # ---------- OccupancySensorType / enum8 ---------- + return TLV.create_TLV(TLV.U1, 3) # physical contact + elif attribute == 0x0002 # ---------- OccupancySensorTypeBitmap / u8 ---------- + return TLV.create_TLV(TLV.U1, 0) # unknown + elif attribute == 0xFFFC # ---------- FeatureMap / map32 ---------- + return TLV.create_TLV(TLV.U4, 0) + elif attribute == 0xFFFD # ---------- ClusterRevision / u2 ---------- + return TLV.create_TLV(TLV.U4, 3) # 4 = New data model format and notation + end + + else + return super(self).read_attribute(session, ctx) + end + end + + ############################################################# + # web_values + # + # Show values of the remote device as HTML + def web_values() + import webserver + import string + webserver.content_send(string.format("| Occupancy%i %s", self.tasmota_switch_index, self.web_value_onoff(self.shadow_occupancy))) + end + +end +matter.Plugin_Bridge_Sensor_Occupancy = Matter_Plugin_Bridge_Sensor_Occupancy diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor_Occupancy.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor_Occupancy.be new file mode 100644 index 000000000..fb0c0d079 --- /dev/null +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor_Occupancy.be @@ -0,0 +1,104 @@ +# +# Matter_Plugin_Sensor_Occupancy.be - implements the behavior for a Occupany Switch +# +# Copyright (C) 2023 Stephan Hadinger & Theo Arends +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +# + +# Matter plug-in for core behavior + +# dummy declaration for solidification +class Matter_Plugin_Device end + +#@ solidify:Matter_Plugin_Sensor_Occupancy,weak + +class Matter_Plugin_Sensor_Occupancy : Matter_Plugin_Device + static var TYPE = "occupancy" # name of the plug-in in json + static var NAME = "Occupancy" # display name of the plug-in + static var ARG = "switch" # additional argument name (or empty if none) + static var ARG_TYPE = / x -> int(x) # function to convert argument to the right type + static var UPDATE_TIME = 5000 # update every 250ms + static var CLUSTERS = { + 0x0406: [0,1,2,0xFFFC,0xFFFD], # Occupancy Sensing p.105 - no writable + } + static var TYPES = { 0x0107: 2 } # Occupancy Sensor, rev 2 + + var tasmota_switch_index # Switch number in Tasmota (one based) + var shadow_occupancy + + ############################################################# + # Constructor + def init(device, endpoint, arguments) + super(self).init(device, endpoint, arguments) + self.tasmota_switch_index = int(arguments.find(self.ARG #-'relay'-#, 1)) + if self.tasmota_switch_index <= 0 self.tasmota_switch_index = 1 end + end + + ############################################################# + # Update shadow + # + def update_shadow() + super(self).update_shadow() + + import json + var ret = tasmota.cmd("Status 8", true) + if ret != nil + var j = json.load(ret) + if j != nil + var state = false + state = (j.find("Switch" + str(self.tasmota_switch_index)) == "ON") + + if self.shadow_occupancy != nil && self.shadow_occupancy != bool(state) + self.attribute_updated(0x0406, 0x0000) + end + self.shadow_occupancy = state + end + end + end + + ############################################################# + # read an attribute + # + def read_attribute(session, ctx) + import string + var TLV = matter.TLV + var cluster = ctx.cluster + var attribute = ctx.attribute + + # ==================================================================================================== + if cluster == 0x0406 # ========== Occupancy Sensing ========== + if attribute == 0x0000 # ---------- Occupancy / U8 ---------- + if self.shadow_occupancy != nil + return TLV.create_TLV(TLV.U1, self.shadow_occupancy) + else + return TLV.create_TLV(TLV.NULL, nil) + end + elif attribute == 0x0001 # ---------- OccupancySensorType / enum8 ---------- + return TLV.create_TLV(TLV.U1, 3) # physical contact + elif attribute == 0x0002 # ---------- OccupancySensorTypeBitmap / u8 ---------- + return TLV.create_TLV(TLV.U1, 0) # unknown + elif attribute == 0xFFFC # ---------- FeatureMap / map32 ---------- + return TLV.create_TLV(TLV.U4, 0) + elif attribute == 0xFFFD # ---------- ClusterRevision / u2 ---------- + return TLV.create_TLV(TLV.U4, 3) # 4 = New data model format and notation + end + + else + return super(self).read_attribute(session, ctx) + end + end + +end +matter.Plugin_Sensor_Occupancy = Matter_Plugin_Sensor_Occupancy diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_UI.be b/lib/libesp32/berry_matter/src/embedded/Matter_UI.be index 5e7429aeb..a59955ded 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_UI.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_UI.be @@ -34,9 +34,10 @@ import matter class Matter_UI static var _ROOT_TYPES = "root" static var _CLASSES_TYPES = "|relay|light0|light1|light2|light3|shutter|shutter+tilt" - "|temperature|pressure|illuminance|humidity" + "|temperature|pressure|illuminance|humidity|occupancy" static var _CLASSES_TYPES2= "-http|http_relay|http_light0|http_light1|http_light2|http_light3" "|http_temperature|http_pressure|http_illuminance|http_humidity" + "|http_occupancy" var device def init(device) diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Message.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Message.h index 55aa4510b..5bfbc0bee 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Message.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Message.h @@ -1039,7 +1039,7 @@ be_local_closure(Matter_Frame_decrypt, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[28]) { /* constants */ + ( &(const bvalue[27]) { /* constants */ /* K0 */ be_nested_str_weak(crypto), /* K1 */ be_nested_str_weak(session), /* K2 */ be_nested_str_weak(raw), @@ -1059,19 +1059,18 @@ be_local_closure(Matter_Frame_decrypt, /* name */ /* K16 */ be_nested_str_weak(decrypt), /* K17 */ be_const_int(0), /* K18 */ be_const_int(3), - /* K19 */ be_nested_str_weak(self), - /* K20 */ be_nested_str_weak(flags), - /* K21 */ be_nested_str_weak(message_counter), - /* K22 */ be_nested_str_weak(source_node_id), - /* K23 */ be_nested_str_weak(peer_node_id), - /* K24 */ be_nested_str_weak(resize), - /* K25 */ be_nested_str_weak(AES_CCM), - /* K26 */ be_nested_str_weak(tag), - /* K27 */ be_nested_str_weak(MTR_X3A_X20rejected_X20packet_X20due_X20to_X20invalid_X20MIC), + /* K19 */ be_nested_str_weak(flags), + /* K20 */ be_nested_str_weak(message_counter), + /* K21 */ be_nested_str_weak(source_node_id), + /* K22 */ be_nested_str_weak(peer_node_id), + /* K23 */ be_nested_str_weak(resize), + /* K24 */ be_nested_str_weak(AES_CCM), + /* K25 */ be_nested_str_weak(tag), + /* K26 */ be_nested_str_weak(MTR_X3A_X20rejected_X20packet_X20due_X20to_X20invalid_X20MIC), }), be_str_weak(decrypt), &be_const_str_solidified, - ( &(const binstruction[106]) { /* code */ + ( &(const binstruction[105]) { /* code */ 0xA4060000, // 0000 IMPORT R1 K0 0x88080101, // 0001 GETMBR R2 R0 K1 0x880C0102, // 0002 GETMBR R3 R0 K2 @@ -1081,7 +1080,7 @@ be_local_closure(Matter_Frame_decrypt, /* name */ 0x8C140504, // 0006 GETMET R5 R2 K4 0x7C140200, // 0007 CALL R5 1 0x88180105, // 0008 GETMBR R6 R0 K5 - 0x781A002A, // 0009 JMPF R6 #0035 + 0x781A0029, // 0009 JMPF R6 #0034 0xB81A0C00, // 000A GETNGBL R6 K6 0x8C180D07, // 000B GETMET R6 R6 K7 0x58200008, // 000C LDCONST R8 K8 @@ -1119,65 +1118,64 @@ be_local_closure(Matter_Frame_decrypt, /* name */ 0x882C0102, // 002C GETMBR R11 R0 K2 0x9428160A, // 002D GETIDX R10 R11 R10 0x00281409, // 002E ADD R10 R10 R9 - 0x882C0113, // 002F GETMBR R11 R0 K19 - 0x882C170D, // 0030 GETMBR R11 R11 K13 - 0x402C1703, // 0031 CONNECT R11 R11 K3 - 0x942C100B, // 0032 GETIDX R11 R8 R11 - 0x0028140B, // 0033 ADD R10 R10 R11 - 0x9002040A, // 0034 SETMBR R0 K2 R10 - 0x8818010D, // 0035 GETMBR R6 R0 K13 - 0x04180D0E, // 0036 SUB R6 R6 K14 - 0x401A2206, // 0037 CONNECT R6 K17 R6 - 0x94180606, // 0038 GETIDX R6 R3 R6 - 0x881C010D, // 0039 GETMBR R7 R0 K13 - 0x5421FFEE, // 003A LDINT R8 -17 - 0x401C0E08, // 003B CONNECT R7 R7 R8 - 0x941C0607, // 003C GETIDX R7 R3 R7 - 0x60200015, // 003D GETGBL R8 G21 - 0x7C200000, // 003E CALL R8 0 - 0x8C24110B, // 003F GETMET R9 R8 K11 - 0x882C0114, // 0040 GETMBR R11 R0 K20 - 0x5830000E, // 0041 LDCONST R12 K14 - 0x7C240600, // 0042 CALL R9 3 - 0x8C24110B, // 0043 GETMET R9 R8 K11 - 0x882C0115, // 0044 GETMBR R11 R0 K21 - 0x54320003, // 0045 LDINT R12 4 - 0x7C240600, // 0046 CALL R9 3 - 0x88240116, // 0047 GETMBR R9 R0 K22 - 0x78260001, // 0048 JMPF R9 #004B - 0x40241103, // 0049 CONNECT R9 R8 K3 - 0x70020006, // 004A JMP #0052 - 0x88240517, // 004B GETMBR R9 R2 K23 - 0x78260001, // 004C JMPF R9 #004F - 0x88240517, // 004D GETMBR R9 R2 K23 - 0x40241009, // 004E CONNECT R9 R8 R9 - 0x8C241118, // 004F GETMET R9 R8 K24 - 0x542E000C, // 0050 LDINT R11 13 - 0x7C240400, // 0051 CALL R9 2 - 0x8C240319, // 0052 GETMET R9 R1 K25 - 0x5C2C0A00, // 0053 MOVE R11 R5 - 0x5C301000, // 0054 MOVE R12 R8 - 0x5C340C00, // 0055 MOVE R13 R6 - 0x6038000C, // 0056 GETGBL R14 G12 - 0x5C3C0E00, // 0057 MOVE R15 R7 - 0x7C380200, // 0058 CALL R14 1 - 0x543E000F, // 0059 LDINT R15 16 - 0x7C240C00, // 005A CALL R9 6 - 0x8C281310, // 005B GETMET R10 R9 K16 - 0x5C300E00, // 005C MOVE R12 R7 - 0x7C280400, // 005D CALL R10 2 - 0x8C2C131A, // 005E GETMET R11 R9 K26 - 0x7C2C0200, // 005F CALL R11 1 - 0x20301604, // 0060 NE R12 R11 R4 - 0x78320006, // 0061 JMPF R12 #0069 - 0xB8320C00, // 0062 GETNGBL R12 K6 - 0x8C301907, // 0063 GETMET R12 R12 K7 - 0x5838001B, // 0064 LDCONST R14 K27 - 0x583C0009, // 0065 LDCONST R15 K9 - 0x7C300600, // 0066 CALL R12 3 - 0x4C300000, // 0067 LDNIL R12 - 0x80041800, // 0068 RET 1 R12 - 0x80041400, // 0069 RET 1 R10 + 0x882C010D, // 002F GETMBR R11 R0 K13 + 0x402C1703, // 0030 CONNECT R11 R11 K3 + 0x942C100B, // 0031 GETIDX R11 R8 R11 + 0x0028140B, // 0032 ADD R10 R10 R11 + 0x9002040A, // 0033 SETMBR R0 K2 R10 + 0x8818010D, // 0034 GETMBR R6 R0 K13 + 0x04180D0E, // 0035 SUB R6 R6 K14 + 0x401A2206, // 0036 CONNECT R6 K17 R6 + 0x94180606, // 0037 GETIDX R6 R3 R6 + 0x881C010D, // 0038 GETMBR R7 R0 K13 + 0x5421FFEE, // 0039 LDINT R8 -17 + 0x401C0E08, // 003A CONNECT R7 R7 R8 + 0x941C0607, // 003B GETIDX R7 R3 R7 + 0x60200015, // 003C GETGBL R8 G21 + 0x7C200000, // 003D CALL R8 0 + 0x8C24110B, // 003E GETMET R9 R8 K11 + 0x882C0113, // 003F GETMBR R11 R0 K19 + 0x5830000E, // 0040 LDCONST R12 K14 + 0x7C240600, // 0041 CALL R9 3 + 0x8C24110B, // 0042 GETMET R9 R8 K11 + 0x882C0114, // 0043 GETMBR R11 R0 K20 + 0x54320003, // 0044 LDINT R12 4 + 0x7C240600, // 0045 CALL R9 3 + 0x88240115, // 0046 GETMBR R9 R0 K21 + 0x78260001, // 0047 JMPF R9 #004A + 0x40241103, // 0048 CONNECT R9 R8 K3 + 0x70020006, // 0049 JMP #0051 + 0x88240516, // 004A GETMBR R9 R2 K22 + 0x78260001, // 004B JMPF R9 #004E + 0x88240516, // 004C GETMBR R9 R2 K22 + 0x40241009, // 004D CONNECT R9 R8 R9 + 0x8C241117, // 004E GETMET R9 R8 K23 + 0x542E000C, // 004F LDINT R11 13 + 0x7C240400, // 0050 CALL R9 2 + 0x8C240318, // 0051 GETMET R9 R1 K24 + 0x5C2C0A00, // 0052 MOVE R11 R5 + 0x5C301000, // 0053 MOVE R12 R8 + 0x5C340C00, // 0054 MOVE R13 R6 + 0x6038000C, // 0055 GETGBL R14 G12 + 0x5C3C0E00, // 0056 MOVE R15 R7 + 0x7C380200, // 0057 CALL R14 1 + 0x543E000F, // 0058 LDINT R15 16 + 0x7C240C00, // 0059 CALL R9 6 + 0x8C281310, // 005A GETMET R10 R9 K16 + 0x5C300E00, // 005B MOVE R12 R7 + 0x7C280400, // 005C CALL R10 2 + 0x8C2C1319, // 005D GETMET R11 R9 K25 + 0x7C2C0200, // 005E CALL R11 1 + 0x20301604, // 005F NE R12 R11 R4 + 0x78320006, // 0060 JMPF R12 #0068 + 0xB8320C00, // 0061 GETNGBL R12 K6 + 0x8C301907, // 0062 GETMET R12 R12 K7 + 0x5838001A, // 0063 LDCONST R14 K26 + 0x583C0009, // 0064 LDCONST R15 K9 + 0x7C300600, // 0065 CALL R12 3 + 0x4C300000, // 0066 LDNIL R12 + 0x80041800, // 0067 RET 1 R12 + 0x80041400, // 0068 RET 1 R10 }) ) ); diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_HTTP.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_HTTP.h index d63c564df..ad91a53e0 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_HTTP.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_HTTP.h @@ -6,151 +6,6 @@ extern const bclass be_class_Matter_Plugin_Bridge_HTTP; -/******************************************************************** -** Solidified function: read_attribute -********************************************************************/ -be_local_closure(Matter_Plugin_Bridge_HTTP_read_attribute, /* name */ - be_nested_proto( - 10, /* nstack */ - 3, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[10]) { /* constants */ - /* K0 */ be_nested_str_weak(matter), - /* K1 */ be_nested_str_weak(TLV), - /* K2 */ be_nested_str_weak(cluster), - /* K3 */ be_nested_str_weak(attribute), - /* K4 */ be_const_int(0), - /* K5 */ be_nested_str_weak(create_TLV), - /* K6 */ be_nested_str_weak(BOOL), - /* K7 */ be_nested_str_weak(http_remote), - /* K8 */ be_nested_str_weak(reachable), - /* K9 */ be_nested_str_weak(read_attribute), - }), - be_str_weak(read_attribute), - &be_const_str_solidified, - ( &(const binstruction[29]) { /* code */ - 0xB80E0000, // 0000 GETNGBL R3 K0 - 0x880C0701, // 0001 GETMBR R3 R3 K1 - 0x88100502, // 0002 GETMBR R4 R2 K2 - 0x88140503, // 0003 GETMBR R5 R2 K3 - 0x541A0038, // 0004 LDINT R6 57 - 0x1C180806, // 0005 EQ R6 R4 R6 - 0x781A000C, // 0006 JMPF R6 #0014 - 0x1C180B04, // 0007 EQ R6 R5 K4 - 0x781A0000, // 0008 JMPF R6 #000A - 0x70020008, // 0009 JMP #0013 - 0x541A0010, // 000A LDINT R6 17 - 0x1C180A06, // 000B EQ R6 R5 R6 - 0x781A0005, // 000C JMPF R6 #0013 - 0x8C180705, // 000D GETMET R6 R3 K5 - 0x88200706, // 000E GETMBR R8 R3 K6 - 0x88240107, // 000F GETMBR R9 R0 K7 - 0x88241308, // 0010 GETMBR R9 R9 K8 - 0x7C180600, // 0011 CALL R6 3 - 0x80040C00, // 0012 RET 1 R6 - 0x70020007, // 0013 JMP #001C - 0x60180003, // 0014 GETGBL R6 G3 - 0x5C1C0000, // 0015 MOVE R7 R0 - 0x7C180200, // 0016 CALL R6 1 - 0x8C180D09, // 0017 GETMET R6 R6 K9 - 0x5C200200, // 0018 MOVE R8 R1 - 0x5C240400, // 0019 MOVE R9 R2 - 0x7C180600, // 001A CALL R6 3 - 0x80040C00, // 001B RET 1 R6 - 0x80000000, // 001C RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: call_remote_sync -********************************************************************/ -be_local_closure(Matter_Plugin_Bridge_HTTP_call_remote_sync, /* name */ - be_nested_proto( - 11, /* nstack */ - 3, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[15]) { /* constants */ - /* K0 */ be_nested_str_weak(string), - /* K1 */ be_nested_str_weak(json), - /* K2 */ be_const_int(2), - /* K3 */ be_nested_str_weak(_X20), - /* K4 */ be_const_int(0), - /* K5 */ be_nested_str_weak(http_remote), - /* K6 */ be_nested_str_weak(call_sync), - /* K7 */ be_nested_str_weak(SYNC_TIMEOUT), - /* K8 */ be_nested_str_weak(device_is_alive), - /* K9 */ be_nested_str_weak(load), - /* K10 */ be_const_int(1), - /* K11 */ be_nested_str_weak(tasmota), - /* K12 */ be_nested_str_weak(log), - /* K13 */ be_nested_str_weak(MTR_X3A_X20HTTP_X20GET_X20retrying), - /* K14 */ be_const_int(3), - }), - be_str_weak(call_remote_sync), - &be_const_str_solidified, - ( &(const binstruction[43]) { /* code */ - 0xA40E0000, // 0000 IMPORT R3 K0 - 0xA4120200, // 0001 IMPORT R4 K1 - 0x58140002, // 0002 LDCONST R5 K2 - 0x4C180000, // 0003 LDNIL R6 - 0x20180406, // 0004 NE R6 R2 R6 - 0x781A0005, // 0005 JMPF R6 #000C - 0x00180303, // 0006 ADD R6 R1 K3 - 0x601C0008, // 0007 GETGBL R7 G8 - 0x5C200400, // 0008 MOVE R8 R2 - 0x7C1C0200, // 0009 CALL R7 1 - 0x00180C07, // 000A ADD R6 R6 R7 - 0x5C040C00, // 000B MOVE R1 R6 - 0x24180B04, // 000C GT R6 R5 K4 - 0x781A0016, // 000D JMPF R6 #0025 - 0x88180105, // 000E GETMBR R6 R0 K5 - 0x8C180D06, // 000F GETMET R6 R6 K6 - 0x5C200200, // 0010 MOVE R8 R1 - 0x88240107, // 0011 GETMBR R9 R0 K7 - 0x7C180600, // 0012 CALL R6 3 - 0x4C1C0000, // 0013 LDNIL R7 - 0x201C0C07, // 0014 NE R7 R6 R7 - 0x781E0007, // 0015 JMPF R7 #001E - 0x881C0105, // 0016 GETMBR R7 R0 K5 - 0x8C1C0F08, // 0017 GETMET R7 R7 K8 - 0x50240200, // 0018 LDBOOL R9 1 0 - 0x7C1C0400, // 0019 CALL R7 2 - 0x8C1C0909, // 001A GETMET R7 R4 K9 - 0x5C240C00, // 001B MOVE R9 R6 - 0x7C1C0400, // 001C CALL R7 2 - 0x80040E00, // 001D RET 1 R7 - 0x04140B0A, // 001E SUB R5 R5 K10 - 0xB81E1600, // 001F GETNGBL R7 K11 - 0x8C1C0F0C, // 0020 GETMET R7 R7 K12 - 0x5824000D, // 0021 LDCONST R9 K13 - 0x5828000E, // 0022 LDCONST R10 K14 - 0x7C1C0600, // 0023 CALL R7 3 - 0x7001FFE6, // 0024 JMP #000C - 0x88180105, // 0025 GETMBR R6 R0 K5 - 0x8C180D08, // 0026 GETMET R6 R6 K8 - 0x50200000, // 0027 LDBOOL R8 0 0 - 0x7C180400, // 0028 CALL R6 2 - 0x4C180000, // 0029 LDNIL R6 - 0x80040C00, // 002A RET 1 R6 - }) - ) -); -/*******************************************************************/ - - /******************************************************************** ** Solidified function: update_shadow ********************************************************************/ @@ -194,6 +49,69 @@ be_local_closure(Matter_Plugin_Bridge_HTTP_update_shadow, /* name */ /*******************************************************************/ +/******************************************************************** +** Solidified function: register_cmd_cb +********************************************************************/ +be_local_closure(Matter_Plugin_Bridge_HTTP_register_cmd_cb, /* name */ + be_nested_proto( + 6, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 1, /* has sup protos */ + ( &(const struct bproto*[ 1]) { + be_nested_proto( + 8, /* nstack */ + 3, /* argc */ + 0, /* varg */ + 1, /* has upvals */ + ( &(const bupvaldesc[ 1]) { /* upvals */ + be_local_const_upval(1, 0), + }), + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 1]) { /* constants */ + /* K0 */ be_nested_str_weak(parse_http_response), + }), + be_str_weak(_X3Clambda_X3E), + &be_const_str_solidified, + ( &(const binstruction[ 7]) { /* code */ + 0x680C0000, // 0000 GETUPV R3 U0 + 0x8C0C0700, // 0001 GETMET R3 R3 K0 + 0x5C140000, // 0002 MOVE R5 R0 + 0x5C180200, // 0003 MOVE R6 R1 + 0x5C1C0400, // 0004 MOVE R7 R2 + 0x7C0C0800, // 0005 CALL R3 4 + 0x80040600, // 0006 RET 1 R3 + }) + ), + }), + 1, /* has constants */ + ( &(const bvalue[ 4]) { /* constants */ + /* K0 */ be_nested_str_weak(http_remote), + /* K1 */ be_nested_str_weak(add_schedule), + /* K2 */ be_nested_str_weak(UPDATE_CMD), + /* K3 */ be_nested_str_weak(UPDATE_TIME), + }), + be_str_weak(register_cmd_cb), + &be_const_str_solidified, + ( &(const binstruction[ 8]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x8C040301, // 0001 GETMET R1 R1 K1 + 0x880C0102, // 0002 GETMBR R3 R0 K2 + 0x88100103, // 0003 GETMBR R4 R0 K3 + 0x84140000, // 0004 CLOSURE R5 P0 + 0x7C040800, // 0005 CALL R1 4 + 0xA0000000, // 0006 CLOSE R0 + 0x80000000, // 0007 RET 0 + }) + ) +); +/*******************************************************************/ + + /******************************************************************** ** Solidified function: ui_conf_to_string ********************************************************************/ @@ -317,29 +235,53 @@ be_local_closure(Matter_Plugin_Bridge_HTTP_parse_http_response, /* name */ /******************************************************************** -** Solidified function: every_250ms +** Solidified function: init ********************************************************************/ -be_local_closure(Matter_Plugin_Bridge_HTTP_every_250ms, /* name */ +be_local_closure(Matter_Plugin_Bridge_HTTP_init, /* name */ be_nested_proto( - 3, /* nstack */ - 1, /* argc */ + 10, /* nstack */ + 4, /* argc */ 2, /* varg */ 0, /* has upvals */ NULL, /* no upvals */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[ 2]) { /* constants */ - /* K0 */ be_nested_str_weak(http_remote), - /* K1 */ be_nested_str_weak(scheduler), + ( &(const bvalue[ 9]) { /* constants */ + /* K0 */ be_nested_str_weak(string), + /* K1 */ be_nested_str_weak(init), + /* K2 */ be_nested_str_weak(find), + /* K3 */ be_nested_str_weak(ARG_HTTP), + /* K4 */ be_nested_str_weak(http_remote), + /* K5 */ be_nested_str_weak(device), + /* K6 */ be_nested_str_weak(register_http_remote), + /* K7 */ be_nested_str_weak(PROBE_TIMEOUT), + /* K8 */ be_nested_str_weak(register_cmd_cb), }), - be_str_weak(every_250ms), + be_str_weak(init), &be_const_str_solidified, - ( &(const binstruction[ 4]) { /* code */ - 0x88040100, // 0000 GETMBR R1 R0 K0 - 0x8C040301, // 0001 GETMET R1 R1 K1 - 0x7C040200, // 0002 CALL R1 1 - 0x80000000, // 0003 RET 0 + ( &(const binstruction[21]) { /* code */ + 0xA4120000, // 0000 IMPORT R4 K0 + 0x60140003, // 0001 GETGBL R5 G3 + 0x5C180000, // 0002 MOVE R6 R0 + 0x7C140200, // 0003 CALL R5 1 + 0x8C140B01, // 0004 GETMET R5 R5 K1 + 0x5C1C0200, // 0005 MOVE R7 R1 + 0x5C200400, // 0006 MOVE R8 R2 + 0x5C240600, // 0007 MOVE R9 R3 + 0x7C140800, // 0008 CALL R5 4 + 0x8C140702, // 0009 GETMET R5 R3 K2 + 0x881C0103, // 000A GETMBR R7 R0 K3 + 0x7C140400, // 000B CALL R5 2 + 0x88180105, // 000C GETMBR R6 R0 K5 + 0x8C180D06, // 000D GETMET R6 R6 K6 + 0x5C200A00, // 000E MOVE R8 R5 + 0x88240107, // 000F GETMBR R9 R0 K7 + 0x7C180600, // 0010 CALL R6 3 + 0x90020806, // 0011 SETMBR R0 K4 R6 + 0x8C180108, // 0012 GETMET R6 R0 K8 + 0x7C180200, // 0013 CALL R6 1 + 0x80000000, // 0014 RET 0 }) ) ); @@ -347,35 +289,105 @@ be_local_closure(Matter_Plugin_Bridge_HTTP_every_250ms, /* name */ /******************************************************************** -** Solidified function: web_values +** Solidified function: call_remote_sync ********************************************************************/ -be_local_closure(Matter_Plugin_Bridge_HTTP_web_values, /* name */ +be_local_closure(Matter_Plugin_Bridge_HTTP_call_remote_sync, /* name */ be_nested_proto( - 5, /* nstack */ - 1, /* argc */ + 11, /* nstack */ + 3, /* argc */ 2, /* varg */ 0, /* has upvals */ NULL, /* no upvals */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[ 5]) { /* constants */ - /* K0 */ be_nested_str_weak(webserver), - /* K1 */ be_nested_str_weak(content_send), - /* K2 */ be_nested_str_weak(_X7C_X20_X26lt_X3B_X2D_X2D_X20_X28), - /* K3 */ be_nested_str_weak(NAME), - /* K4 */ be_nested_str_weak(_X29_X20_X2D_X2D_X26gt_X3B), + ( &(const bvalue[15]) { /* constants */ + /* K0 */ be_nested_str_weak(string), + /* K1 */ be_nested_str_weak(json), + /* K2 */ be_const_int(2), + /* K3 */ be_nested_str_weak(_X20), + /* K4 */ be_const_int(0), + /* K5 */ be_nested_str_weak(http_remote), + /* K6 */ be_nested_str_weak(call_sync), + /* K7 */ be_nested_str_weak(SYNC_TIMEOUT), + /* K8 */ be_nested_str_weak(device_is_alive), + /* K9 */ be_nested_str_weak(load), + /* K10 */ be_const_int(1), + /* K11 */ be_nested_str_weak(tasmota), + /* K12 */ be_nested_str_weak(log), + /* K13 */ be_nested_str_weak(MTR_X3A_X20HTTP_X20GET_X20retrying), + /* K14 */ be_const_int(3), }), - be_str_weak(web_values), + be_str_weak(call_remote_sync), &be_const_str_solidified, - ( &(const binstruction[ 7]) { /* code */ - 0xA4060000, // 0000 IMPORT R1 K0 - 0x8C080301, // 0001 GETMET R2 R1 K1 - 0x88100103, // 0002 GETMBR R4 R0 K3 - 0x00120404, // 0003 ADD R4 K2 R4 - 0x00100904, // 0004 ADD R4 R4 K4 - 0x7C080400, // 0005 CALL R2 2 - 0x80000000, // 0006 RET 0 + ( &(const binstruction[43]) { /* code */ + 0xA40E0000, // 0000 IMPORT R3 K0 + 0xA4120200, // 0001 IMPORT R4 K1 + 0x58140002, // 0002 LDCONST R5 K2 + 0x4C180000, // 0003 LDNIL R6 + 0x20180406, // 0004 NE R6 R2 R6 + 0x781A0005, // 0005 JMPF R6 #000C + 0x00180303, // 0006 ADD R6 R1 K3 + 0x601C0008, // 0007 GETGBL R7 G8 + 0x5C200400, // 0008 MOVE R8 R2 + 0x7C1C0200, // 0009 CALL R7 1 + 0x00180C07, // 000A ADD R6 R6 R7 + 0x5C040C00, // 000B MOVE R1 R6 + 0x24180B04, // 000C GT R6 R5 K4 + 0x781A0016, // 000D JMPF R6 #0025 + 0x88180105, // 000E GETMBR R6 R0 K5 + 0x8C180D06, // 000F GETMET R6 R6 K6 + 0x5C200200, // 0010 MOVE R8 R1 + 0x88240107, // 0011 GETMBR R9 R0 K7 + 0x7C180600, // 0012 CALL R6 3 + 0x4C1C0000, // 0013 LDNIL R7 + 0x201C0C07, // 0014 NE R7 R6 R7 + 0x781E0007, // 0015 JMPF R7 #001E + 0x881C0105, // 0016 GETMBR R7 R0 K5 + 0x8C1C0F08, // 0017 GETMET R7 R7 K8 + 0x50240200, // 0018 LDBOOL R9 1 0 + 0x7C1C0400, // 0019 CALL R7 2 + 0x8C1C0909, // 001A GETMET R7 R4 K9 + 0x5C240C00, // 001B MOVE R9 R6 + 0x7C1C0400, // 001C CALL R7 2 + 0x80040E00, // 001D RET 1 R7 + 0x04140B0A, // 001E SUB R5 R5 K10 + 0xB81E1600, // 001F GETNGBL R7 K11 + 0x8C1C0F0C, // 0020 GETMET R7 R7 K12 + 0x5824000D, // 0021 LDCONST R9 K13 + 0x5828000E, // 0022 LDCONST R10 K14 + 0x7C1C0600, // 0023 CALL R7 3 + 0x7001FFE6, // 0024 JMP #000C + 0x88180105, // 0025 GETMBR R6 R0 K5 + 0x8C180D08, // 0026 GETMET R6 R6 K8 + 0x50200000, // 0027 LDBOOL R8 0 0 + 0x7C180400, // 0028 CALL R6 2 + 0x4C180000, // 0029 LDNIL R6 + 0x80040C00, // 002A RET 1 R6 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: parse_update +********************************************************************/ +be_local_closure(Matter_Plugin_Bridge_HTTP_parse_update, /* name */ + be_nested_proto( + 3, /* nstack */ + 3, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 0, /* has constants */ + NULL, /* no const */ + be_str_weak(parse_update), + &be_const_str_solidified, + ( &(const binstruction[ 1]) { /* code */ + 0x80000000, // 0000 RET 0 }) ) ); @@ -435,23 +447,62 @@ be_local_closure(Matter_Plugin_Bridge_HTTP_ui_string_to_conf, /* name */ /******************************************************************** -** Solidified function: parse_update +** Solidified function: read_attribute ********************************************************************/ -be_local_closure(Matter_Plugin_Bridge_HTTP_parse_update, /* name */ +be_local_closure(Matter_Plugin_Bridge_HTTP_read_attribute, /* name */ be_nested_proto( - 3, /* nstack */ + 10, /* nstack */ 3, /* argc */ 2, /* varg */ 0, /* has upvals */ NULL, /* no upvals */ 0, /* has sup protos */ NULL, /* no sub protos */ - 0, /* has constants */ - NULL, /* no const */ - be_str_weak(parse_update), + 1, /* has constants */ + ( &(const bvalue[10]) { /* constants */ + /* K0 */ be_nested_str_weak(matter), + /* K1 */ be_nested_str_weak(TLV), + /* K2 */ be_nested_str_weak(cluster), + /* K3 */ be_nested_str_weak(attribute), + /* K4 */ be_const_int(0), + /* K5 */ be_nested_str_weak(create_TLV), + /* K6 */ be_nested_str_weak(BOOL), + /* K7 */ be_nested_str_weak(http_remote), + /* K8 */ be_nested_str_weak(reachable), + /* K9 */ be_nested_str_weak(read_attribute), + }), + be_str_weak(read_attribute), &be_const_str_solidified, - ( &(const binstruction[ 1]) { /* code */ - 0x80000000, // 0000 RET 0 + ( &(const binstruction[29]) { /* code */ + 0xB80E0000, // 0000 GETNGBL R3 K0 + 0x880C0701, // 0001 GETMBR R3 R3 K1 + 0x88100502, // 0002 GETMBR R4 R2 K2 + 0x88140503, // 0003 GETMBR R5 R2 K3 + 0x541A0038, // 0004 LDINT R6 57 + 0x1C180806, // 0005 EQ R6 R4 R6 + 0x781A000C, // 0006 JMPF R6 #0014 + 0x1C180B04, // 0007 EQ R6 R5 K4 + 0x781A0000, // 0008 JMPF R6 #000A + 0x70020008, // 0009 JMP #0013 + 0x541A0010, // 000A LDINT R6 17 + 0x1C180A06, // 000B EQ R6 R5 R6 + 0x781A0005, // 000C JMPF R6 #0013 + 0x8C180705, // 000D GETMET R6 R3 K5 + 0x88200706, // 000E GETMBR R8 R3 K6 + 0x88240107, // 000F GETMBR R9 R0 K7 + 0x88241308, // 0010 GETMBR R9 R9 K8 + 0x7C180600, // 0011 CALL R6 3 + 0x80040C00, // 0012 RET 1 R6 + 0x70020007, // 0013 JMP #001C + 0x60180003, // 0014 GETGBL R6 G3 + 0x5C1C0000, // 0015 MOVE R7 R0 + 0x7C180200, // 0016 CALL R6 1 + 0x8C180D09, // 0017 GETMET R6 R6 K9 + 0x5C200200, // 0018 MOVE R8 R1 + 0x5C240400, // 0019 MOVE R9 R2 + 0x7C180600, // 001A CALL R6 3 + 0x80040C00, // 001B RET 1 R6 + 0x80000000, // 001C RET 0 }) ) ); @@ -459,53 +510,29 @@ be_local_closure(Matter_Plugin_Bridge_HTTP_parse_update, /* name */ /******************************************************************** -** Solidified function: init +** Solidified function: every_250ms ********************************************************************/ -be_local_closure(Matter_Plugin_Bridge_HTTP_init, /* name */ +be_local_closure(Matter_Plugin_Bridge_HTTP_every_250ms, /* name */ be_nested_proto( - 10, /* nstack */ - 4, /* argc */ + 3, /* nstack */ + 1, /* argc */ 2, /* varg */ 0, /* has upvals */ NULL, /* no upvals */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[ 9]) { /* constants */ - /* K0 */ be_nested_str_weak(string), - /* K1 */ be_nested_str_weak(init), - /* K2 */ be_nested_str_weak(find), - /* K3 */ be_nested_str_weak(ARG_HTTP), - /* K4 */ be_nested_str_weak(http_remote), - /* K5 */ be_nested_str_weak(device), - /* K6 */ be_nested_str_weak(register_http_remote), - /* K7 */ be_nested_str_weak(PROBE_TIMEOUT), - /* K8 */ be_nested_str_weak(register_cmd_cb), + ( &(const bvalue[ 2]) { /* constants */ + /* K0 */ be_nested_str_weak(http_remote), + /* K1 */ be_nested_str_weak(scheduler), }), - be_str_weak(init), + be_str_weak(every_250ms), &be_const_str_solidified, - ( &(const binstruction[21]) { /* code */ - 0xA4120000, // 0000 IMPORT R4 K0 - 0x60140003, // 0001 GETGBL R5 G3 - 0x5C180000, // 0002 MOVE R6 R0 - 0x7C140200, // 0003 CALL R5 1 - 0x8C140B01, // 0004 GETMET R5 R5 K1 - 0x5C1C0200, // 0005 MOVE R7 R1 - 0x5C200400, // 0006 MOVE R8 R2 - 0x5C240600, // 0007 MOVE R9 R3 - 0x7C140800, // 0008 CALL R5 4 - 0x8C140702, // 0009 GETMET R5 R3 K2 - 0x881C0103, // 000A GETMBR R7 R0 K3 - 0x7C140400, // 000B CALL R5 2 - 0x88180105, // 000C GETMBR R6 R0 K5 - 0x8C180D06, // 000D GETMET R6 R6 K6 - 0x5C200A00, // 000E MOVE R8 R5 - 0x88240107, // 000F GETMBR R9 R0 K7 - 0x7C180600, // 0010 CALL R6 3 - 0x90020806, // 0011 SETMBR R0 K4 R6 - 0x8C180108, // 0012 GETMET R6 R0 K8 - 0x7C180200, // 0013 CALL R6 1 - 0x80000000, // 0014 RET 0 + ( &(const binstruction[ 4]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x8C040301, // 0001 GETMET R1 R1 K1 + 0x7C040200, // 0002 CALL R1 1 + 0x80000000, // 0003 RET 0 }) ) ); @@ -513,62 +540,72 @@ be_local_closure(Matter_Plugin_Bridge_HTTP_init, /* name */ /******************************************************************** -** Solidified function: register_cmd_cb +** Solidified function: web_value_onoff ********************************************************************/ -be_local_closure(Matter_Plugin_Bridge_HTTP_register_cmd_cb, /* name */ +be_local_closure(Matter_Plugin_Bridge_HTTP_web_value_onoff, /* name */ be_nested_proto( - 6, /* nstack */ + 3, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 3]) { /* constants */ + /* K0 */ be_nested_str_weak(_X3Cb_X3EOn_X3C_X2Fb_X3E), + /* K1 */ be_nested_str_weak(Off), + /* K2 */ be_nested_str_weak(), + }), + be_str_weak(web_value_onoff), + &be_const_str_solidified, + ( &(const binstruction[10]) { /* code */ + 0x4C080000, // 0000 LDNIL R2 + 0x20080202, // 0001 NE R2 R1 R2 + 0x780A0004, // 0002 JMPF R2 #0008 + 0x78060001, // 0003 JMPF R1 #0006 + 0x58080000, // 0004 LDCONST R2 K0 + 0x70020000, // 0005 JMP #0007 + 0x58080001, // 0006 LDCONST R2 K1 + 0x70020000, // 0007 JMP #0009 + 0x58080002, // 0008 LDCONST R2 K2 + 0x80040400, // 0009 RET 1 R2 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: web_values +********************************************************************/ +be_local_closure(Matter_Plugin_Bridge_HTTP_web_values, /* name */ + be_nested_proto( + 5, /* nstack */ 1, /* argc */ 2, /* varg */ 0, /* has upvals */ NULL, /* no upvals */ - 1, /* has sup protos */ - ( &(const struct bproto*[ 1]) { - be_nested_proto( - 8, /* nstack */ - 3, /* argc */ - 0, /* varg */ - 1, /* has upvals */ - ( &(const bupvaldesc[ 1]) { /* upvals */ - be_local_const_upval(1, 0), - }), - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 1]) { /* constants */ - /* K0 */ be_nested_str_weak(parse_http_response), - }), - be_str_weak(_X3Clambda_X3E), - &be_const_str_solidified, - ( &(const binstruction[ 7]) { /* code */ - 0x680C0000, // 0000 GETUPV R3 U0 - 0x8C0C0700, // 0001 GETMET R3 R3 K0 - 0x5C140000, // 0002 MOVE R5 R0 - 0x5C180200, // 0003 MOVE R6 R1 - 0x5C1C0400, // 0004 MOVE R7 R2 - 0x7C0C0800, // 0005 CALL R3 4 - 0x80040600, // 0006 RET 1 R3 - }) - ), - }), + 0, /* has sup protos */ + NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[ 4]) { /* constants */ - /* K0 */ be_nested_str_weak(http_remote), - /* K1 */ be_nested_str_weak(add_schedule), - /* K2 */ be_nested_str_weak(UPDATE_CMD), - /* K3 */ be_nested_str_weak(UPDATE_TIME), + ( &(const bvalue[ 5]) { /* constants */ + /* K0 */ be_nested_str_weak(webserver), + /* K1 */ be_nested_str_weak(content_send), + /* K2 */ be_nested_str_weak(_X7C_X20_X26lt_X3B_X2D_X2D_X20_X28), + /* K3 */ be_nested_str_weak(NAME), + /* K4 */ be_nested_str_weak(_X29_X20_X2D_X2D_X26gt_X3B), }), - be_str_weak(register_cmd_cb), + be_str_weak(web_values), &be_const_str_solidified, - ( &(const binstruction[ 8]) { /* code */ - 0x88040100, // 0000 GETMBR R1 R0 K0 - 0x8C040301, // 0001 GETMET R1 R1 K1 - 0x880C0102, // 0002 GETMBR R3 R0 K2 - 0x88100103, // 0003 GETMBR R4 R0 K3 - 0x84140000, // 0004 CLOSURE R5 P0 - 0x7C040800, // 0005 CALL R1 4 - 0xA0000000, // 0006 CLOSE R0 - 0x80000000, // 0007 RET 0 + ( &(const binstruction[ 7]) { /* code */ + 0xA4060000, // 0000 IMPORT R1 K0 + 0x8C080301, // 0001 GETMET R2 R1 K1 + 0x88100103, // 0002 GETMBR R4 R0 K3 + 0x00120404, // 0003 ADD R4 K2 R4 + 0x00100904, // 0004 ADD R4 R4 K4 + 0x7C080400, // 0005 CALL R2 2 + 0x80000000, // 0006 RET 0 }) ) ); @@ -582,10 +619,15 @@ extern const bclass be_class_Matter_Plugin_Device; be_local_class(Matter_Plugin_Bridge_HTTP, 1, &be_class_Matter_Plugin_Device, - be_nested_map(21, + be_nested_map(22, ( (struct bmapnode*) &(const bmapnode[]) { - { be_const_key_weak(read_attribute, -1), be_const_closure(Matter_Plugin_Bridge_HTTP_read_attribute_closure) }, - { be_const_key_weak(CLUSTERS, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { + { be_const_key_weak(NAME, 2), be_nested_str_weak() }, + { be_const_key_weak(web_values, 11), be_const_closure(Matter_Plugin_Bridge_HTTP_web_values_closure) }, + { be_const_key_weak(web_value_onoff, 21), be_const_closure(Matter_Plugin_Bridge_HTTP_web_value_onoff_closure) }, + { be_const_key_weak(register_cmd_cb, -1), be_const_closure(Matter_Plugin_Bridge_HTTP_register_cmd_cb_closure) }, + { be_const_key_weak(ui_conf_to_string, -1), be_const_static_closure(Matter_Plugin_Bridge_HTTP_ui_conf_to_string_closure) }, + { be_const_key_weak(http_remote, -1), be_const_var(0) }, + { be_const_key_weak(CLUSTERS, 0), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { be_const_map( * be_nested_map(1, ( (struct bmapnode*) &(const bmapnode[]) { { be_const_key_int(57, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_list, { @@ -594,25 +636,21 @@ be_local_class(Matter_Plugin_Bridge_HTTP, be_const_int(17), })) ) } )) }, })) ) } )) }, - { be_const_key_weak(SYNC_TIMEOUT, -1), be_const_int(500) }, - { be_const_key_weak(http_remote, -1), be_const_var(0) }, - { be_const_key_weak(init, 17), be_const_closure(Matter_Plugin_Bridge_HTTP_init_closure) }, - { be_const_key_weak(parse_http_response, -1), be_const_closure(Matter_Plugin_Bridge_HTTP_parse_http_response_closure) }, { be_const_key_weak(ARG, -1), be_nested_str_weak() }, - { be_const_key_weak(update_shadow, 1), be_const_closure(Matter_Plugin_Bridge_HTTP_update_shadow_closure) }, - { be_const_key_weak(every_250ms, -1), be_const_closure(Matter_Plugin_Bridge_HTTP_every_250ms_closure) }, - { be_const_key_weak(UPDATE_TIME, -1), be_const_int(3000) }, - { be_const_key_weak(TYPE, -1), be_nested_str_weak() }, - { be_const_key_weak(web_values, -1), be_const_closure(Matter_Plugin_Bridge_HTTP_web_values_closure) }, - { be_const_key_weak(ARG_HTTP, 4), be_nested_str_weak(url) }, - { be_const_key_weak(PROBE_TIMEOUT, 18), be_const_int(1700) }, - { be_const_key_weak(parse_update, -1), be_const_closure(Matter_Plugin_Bridge_HTTP_parse_update_closure) }, - { be_const_key_weak(NAME, 6), be_nested_str_weak() }, - { be_const_key_weak(call_remote_sync, 14), be_const_closure(Matter_Plugin_Bridge_HTTP_call_remote_sync_closure) }, { be_const_key_weak(UPDATE_CMD, -1), be_nested_str_weak(Status_X2011) }, + { be_const_key_weak(parse_http_response, 19), be_const_closure(Matter_Plugin_Bridge_HTTP_parse_http_response_closure) }, + { be_const_key_weak(call_remote_sync, -1), be_const_closure(Matter_Plugin_Bridge_HTTP_call_remote_sync_closure) }, + { be_const_key_weak(parse_update, -1), be_const_closure(Matter_Plugin_Bridge_HTTP_parse_update_closure) }, + { be_const_key_weak(ARG_HTTP, 16), be_nested_str_weak(url) }, + { be_const_key_weak(TYPE, -1), be_nested_str_weak() }, + { be_const_key_weak(read_attribute, -1), be_const_closure(Matter_Plugin_Bridge_HTTP_read_attribute_closure) }, + { be_const_key_weak(PROBE_TIMEOUT, 13), be_const_int(1700) }, { be_const_key_weak(ui_string_to_conf, -1), be_const_static_closure(Matter_Plugin_Bridge_HTTP_ui_string_to_conf_closure) }, - { be_const_key_weak(ui_conf_to_string, 3), be_const_static_closure(Matter_Plugin_Bridge_HTTP_ui_conf_to_string_closure) }, - { be_const_key_weak(register_cmd_cb, -1), be_const_closure(Matter_Plugin_Bridge_HTTP_register_cmd_cb_closure) }, + { be_const_key_weak(update_shadow, 8), be_const_closure(Matter_Plugin_Bridge_HTTP_update_shadow_closure) }, + { be_const_key_weak(every_250ms, 5), be_const_closure(Matter_Plugin_Bridge_HTTP_every_250ms_closure) }, + { be_const_key_weak(init, -1), be_const_closure(Matter_Plugin_Bridge_HTTP_init_closure) }, + { be_const_key_weak(UPDATE_TIME, 1), be_const_int(3000) }, + { be_const_key_weak(SYNC_TIMEOUT, -1), be_const_int(500) }, })), be_str_weak(Matter_Plugin_Bridge_HTTP) ); diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Light0.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Light0.h index 3da8f171b..25839355b 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Light0.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Light0.h @@ -6,358 +6,6 @@ extern const bclass be_class_Matter_Plugin_Bridge_Light0; -/******************************************************************** -** Solidified function: init -********************************************************************/ -be_local_closure(Matter_Plugin_Bridge_Light0_init, /* name */ - be_nested_proto( - 9, /* nstack */ - 4, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 7]) { /* constants */ - /* K0 */ be_nested_str_weak(init), - /* K1 */ be_nested_str_weak(shadow_onoff), - /* K2 */ be_nested_str_weak(tasmota_relay_index), - /* K3 */ be_nested_str_weak(find), - /* K4 */ be_nested_str_weak(ARG), - /* K5 */ be_const_int(1), - /* K6 */ be_const_int(0), - }), - be_str_weak(init), - &be_const_str_solidified, - ( &(const binstruction[22]) { /* code */ - 0x60100003, // 0000 GETGBL R4 G3 - 0x5C140000, // 0001 MOVE R5 R0 - 0x7C100200, // 0002 CALL R4 1 - 0x8C100900, // 0003 GETMET R4 R4 K0 - 0x5C180200, // 0004 MOVE R6 R1 - 0x5C1C0400, // 0005 MOVE R7 R2 - 0x5C200600, // 0006 MOVE R8 R3 - 0x7C100800, // 0007 CALL R4 4 - 0x50100000, // 0008 LDBOOL R4 0 0 - 0x90020204, // 0009 SETMBR R0 K1 R4 - 0x60100009, // 000A GETGBL R4 G9 - 0x8C140703, // 000B GETMET R5 R3 K3 - 0x881C0104, // 000C GETMBR R7 R0 K4 - 0x58200005, // 000D LDCONST R8 K5 - 0x7C140600, // 000E CALL R5 3 - 0x7C100200, // 000F CALL R4 1 - 0x90020404, // 0010 SETMBR R0 K2 R4 - 0x88100102, // 0011 GETMBR R4 R0 K2 - 0x18100906, // 0012 LE R4 R4 K6 - 0x78120000, // 0013 JMPF R4 #0015 - 0x90020505, // 0014 SETMBR R0 K2 K5 - 0x80000000, // 0015 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: parse_update -********************************************************************/ -be_local_closure(Matter_Plugin_Bridge_Light0_parse_update, /* name */ - be_nested_proto( - 8, /* nstack */ - 3, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 9]) { /* constants */ - /* K0 */ be_nested_str_weak(tasmota_relay_index), - /* K1 */ be_const_int(1), - /* K2 */ be_nested_str_weak(contains), - /* K3 */ be_nested_str_weak(POWER), - /* K4 */ be_nested_str_weak(find), - /* K5 */ be_nested_str_weak(ON), - /* K6 */ be_nested_str_weak(shadow_onoff), - /* K7 */ be_nested_str_weak(attribute_updated), - /* K8 */ be_const_int(0), - }), - be_str_weak(parse_update), - &be_const_str_solidified, - ( &(const binstruction[41]) { /* code */ - 0x540E000A, // 0000 LDINT R3 11 - 0x1C0C0403, // 0001 EQ R3 R2 R3 - 0x780E0024, // 0002 JMPF R3 #0028 - 0x500C0000, // 0003 LDBOOL R3 0 0 - 0x88100100, // 0004 GETMBR R4 R0 K0 - 0x1C100901, // 0005 EQ R4 R4 K1 - 0x78120009, // 0006 JMPF R4 #0011 - 0x8C100302, // 0007 GETMET R4 R1 K2 - 0x58180003, // 0008 LDCONST R6 K3 - 0x7C100400, // 0009 CALL R4 2 - 0x78120005, // 000A JMPF R4 #0011 - 0x8C100304, // 000B GETMET R4 R1 K4 - 0x58180003, // 000C LDCONST R6 K3 - 0x7C100400, // 000D CALL R4 2 - 0x1C100905, // 000E EQ R4 R4 K5 - 0x5C0C0800, // 000F MOVE R3 R4 - 0x70020007, // 0010 JMP #0019 - 0x8C100304, // 0011 GETMET R4 R1 K4 - 0x60180008, // 0012 GETGBL R6 G8 - 0x881C0100, // 0013 GETMBR R7 R0 K0 - 0x7C180200, // 0014 CALL R6 1 - 0x001A0606, // 0015 ADD R6 K3 R6 - 0x7C100400, // 0016 CALL R4 2 - 0x1C100905, // 0017 EQ R4 R4 K5 - 0x5C0C0800, // 0018 MOVE R3 R4 - 0x88100106, // 0019 GETMBR R4 R0 K6 - 0x4C140000, // 001A LDNIL R5 - 0x20100805, // 001B NE R4 R4 R5 - 0x78120009, // 001C JMPF R4 #0027 - 0x88100106, // 001D GETMBR R4 R0 K6 - 0x60140017, // 001E GETGBL R5 G23 - 0x5C180600, // 001F MOVE R6 R3 - 0x7C140200, // 0020 CALL R5 1 - 0x20100805, // 0021 NE R4 R4 R5 - 0x78120003, // 0022 JMPF R4 #0027 - 0x8C100107, // 0023 GETMET R4 R0 K7 - 0x541A0005, // 0024 LDINT R6 6 - 0x581C0008, // 0025 LDCONST R7 K8 - 0x7C100600, // 0026 CALL R4 3 - 0x90020C03, // 0027 SETMBR R0 K6 R3 - 0x80000000, // 0028 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: invoke_request -********************************************************************/ -be_local_closure(Matter_Plugin_Bridge_Light0_invoke_request, /* name */ - be_nested_proto( - 10, /* nstack */ - 4, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[10]) { /* constants */ - /* K0 */ be_nested_str_weak(matter), - /* K1 */ be_nested_str_weak(TLV), - /* K2 */ be_nested_str_weak(cluster), - /* K3 */ be_nested_str_weak(command), - /* K4 */ be_nested_str_weak(update_shadow_lazy), - /* K5 */ be_const_int(0), - /* K6 */ be_nested_str_weak(set_onoff), - /* K7 */ be_const_int(1), - /* K8 */ be_const_int(2), - /* K9 */ be_nested_str_weak(shadow_onoff), - }), - be_str_weak(invoke_request), - &be_const_str_solidified, - ( &(const binstruction[36]) { /* code */ - 0xB8120000, // 0000 GETNGBL R4 K0 - 0x88100901, // 0001 GETMBR R4 R4 K1 - 0x88140702, // 0002 GETMBR R5 R3 K2 - 0x88180703, // 0003 GETMBR R6 R3 K3 - 0x541E0005, // 0004 LDINT R7 6 - 0x1C1C0A07, // 0005 EQ R7 R5 R7 - 0x781E001B, // 0006 JMPF R7 #0023 - 0x8C1C0104, // 0007 GETMET R7 R0 K4 - 0x7C1C0200, // 0008 CALL R7 1 - 0x1C1C0D05, // 0009 EQ R7 R6 K5 - 0x781E0005, // 000A JMPF R7 #0011 - 0x8C1C0106, // 000B GETMET R7 R0 K6 - 0x50240000, // 000C LDBOOL R9 0 0 - 0x7C1C0400, // 000D CALL R7 2 - 0x501C0200, // 000E LDBOOL R7 1 0 - 0x80040E00, // 000F RET 1 R7 - 0x70020011, // 0010 JMP #0023 - 0x1C1C0D07, // 0011 EQ R7 R6 K7 - 0x781E0005, // 0012 JMPF R7 #0019 - 0x8C1C0106, // 0013 GETMET R7 R0 K6 - 0x50240200, // 0014 LDBOOL R9 1 0 - 0x7C1C0400, // 0015 CALL R7 2 - 0x501C0200, // 0016 LDBOOL R7 1 0 - 0x80040E00, // 0017 RET 1 R7 - 0x70020009, // 0018 JMP #0023 - 0x1C1C0D08, // 0019 EQ R7 R6 K8 - 0x781E0007, // 001A JMPF R7 #0023 - 0x8C1C0106, // 001B GETMET R7 R0 K6 - 0x88240109, // 001C GETMBR R9 R0 K9 - 0x78260000, // 001D JMPF R9 #001F - 0x50240001, // 001E LDBOOL R9 0 1 - 0x50240200, // 001F LDBOOL R9 1 0 - 0x7C1C0400, // 0020 CALL R7 2 - 0x501C0200, // 0021 LDBOOL R7 1 0 - 0x80040E00, // 0022 RET 1 R7 - 0x80000000, // 0023 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: set_onoff -********************************************************************/ -be_local_closure(Matter_Plugin_Bridge_Light0_set_onoff, /* name */ - be_nested_proto( - 7, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 6]) { /* constants */ - /* K0 */ be_nested_str_weak(call_remote_sync), - /* K1 */ be_nested_str_weak(Power), - /* K2 */ be_nested_str_weak(tasmota_relay_index), - /* K3 */ be_nested_str_weak(1), - /* K4 */ be_nested_str_weak(0), - /* K5 */ be_nested_str_weak(parse_update), - }), - be_str_weak(set_onoff), - &be_const_str_solidified, - ( &(const binstruction[18]) { /* code */ - 0x8C080100, // 0000 GETMET R2 R0 K0 - 0x60100008, // 0001 GETGBL R4 G8 - 0x88140102, // 0002 GETMBR R5 R0 K2 - 0x7C100200, // 0003 CALL R4 1 - 0x00120204, // 0004 ADD R4 K1 R4 - 0x78060001, // 0005 JMPF R1 #0008 - 0x58140003, // 0006 LDCONST R5 K3 - 0x70020000, // 0007 JMP #0009 - 0x58140004, // 0008 LDCONST R5 K4 - 0x7C080600, // 0009 CALL R2 3 - 0x4C0C0000, // 000A LDNIL R3 - 0x200C0403, // 000B NE R3 R2 R3 - 0x780E0003, // 000C JMPF R3 #0011 - 0x8C0C0105, // 000D GETMET R3 R0 K5 - 0x5C140400, // 000E MOVE R5 R2 - 0x541A000A, // 000F LDINT R6 11 - 0x7C0C0600, // 0010 CALL R3 3 - 0x80000000, // 0011 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: -********************************************************************/ -be_local_closure(Matter_Plugin_Bridge_Light0__X3Clambda_X3E, /* name */ - be_nested_proto( - 3, /* nstack */ - 1, /* argc */ - 0, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 0, /* has constants */ - NULL, /* no const */ - be_str_weak(_X3Clambda_X3E), - &be_const_str_solidified, - ( &(const binstruction[ 4]) { /* code */ - 0x60040009, // 0000 GETGBL R1 G9 - 0x5C080000, // 0001 MOVE R2 R0 - 0x7C040200, // 0002 CALL R1 1 - 0x80040200, // 0003 RET 1 R1 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: web_values -********************************************************************/ -be_local_closure(Matter_Plugin_Bridge_Light0_web_values, /* name */ - be_nested_proto( - 10, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 6]) { /* constants */ - /* K0 */ be_nested_str_weak(webserver), - /* K1 */ be_nested_str_weak(string), - /* K2 */ be_nested_str_weak(content_send), - /* K3 */ be_nested_str_weak(format), - /* K4 */ be_nested_str_weak(_X7C_X20Light_X20_X25s), - /* K5 */ be_nested_str_weak(web_value_onoff), - }), - be_str_weak(web_values), - &be_const_str_solidified, - ( &(const binstruction[10]) { /* code */ - 0xA4060000, // 0000 IMPORT R1 K0 - 0xA40A0200, // 0001 IMPORT R2 K1 - 0x8C0C0302, // 0002 GETMET R3 R1 K2 - 0x8C140503, // 0003 GETMET R5 R2 K3 - 0x581C0004, // 0004 LDCONST R7 K4 - 0x8C200105, // 0005 GETMET R8 R0 K5 - 0x7C200200, // 0006 CALL R8 1 - 0x7C140600, // 0007 CALL R5 3 - 0x7C0C0400, // 0008 CALL R3 2 - 0x80000000, // 0009 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: web_value_onoff -********************************************************************/ -be_local_closure(Matter_Plugin_Bridge_Light0_web_value_onoff, /* name */ - be_nested_proto( - 3, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 4]) { /* constants */ - /* K0 */ be_nested_str_weak(shadow_onoff), - /* K1 */ be_nested_str_weak(_X3Cb_X3EOn_X3C_X2Fb_X3E), - /* K2 */ be_nested_str_weak(Off), - /* K3 */ be_nested_str_weak(), - }), - be_str_weak(web_value_onoff), - &be_const_str_solidified, - ( &(const binstruction[12]) { /* code */ - 0x88040100, // 0000 GETMBR R1 R0 K0 - 0x4C080000, // 0001 LDNIL R2 - 0x20040202, // 0002 NE R1 R1 R2 - 0x78060005, // 0003 JMPF R1 #000A - 0x88040100, // 0004 GETMBR R1 R0 K0 - 0x78060001, // 0005 JMPF R1 #0008 - 0x58040001, // 0006 LDCONST R1 K1 - 0x70020000, // 0007 JMP #0009 - 0x58040002, // 0008 LDCONST R1 K2 - 0x70020000, // 0009 JMP #000B - 0x58040003, // 000A LDCONST R1 K3 - 0x80040200, // 000B RET 1 R1 - }) - ) -); -/*******************************************************************/ - - /******************************************************************** ** Solidified function: read_attribute ********************************************************************/ @@ -439,6 +87,320 @@ be_local_closure(Matter_Plugin_Bridge_Light0_read_attribute, /* name */ /*******************************************************************/ +/******************************************************************** +** Solidified function: +********************************************************************/ +be_local_closure(Matter_Plugin_Bridge_Light0__X3Clambda_X3E, /* name */ + be_nested_proto( + 3, /* nstack */ + 1, /* argc */ + 0, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 0, /* has constants */ + NULL, /* no const */ + be_str_weak(_X3Clambda_X3E), + &be_const_str_solidified, + ( &(const binstruction[ 4]) { /* code */ + 0x60040009, // 0000 GETGBL R1 G9 + 0x5C080000, // 0001 MOVE R2 R0 + 0x7C040200, // 0002 CALL R1 1 + 0x80040200, // 0003 RET 1 R1 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: web_values +********************************************************************/ +be_local_closure(Matter_Plugin_Bridge_Light0_web_values, /* name */ + be_nested_proto( + 11, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 7]) { /* constants */ + /* K0 */ be_nested_str_weak(webserver), + /* K1 */ be_nested_str_weak(string), + /* K2 */ be_nested_str_weak(content_send), + /* K3 */ be_nested_str_weak(format), + /* K4 */ be_nested_str_weak(_X7C_X20Light_X20_X25s), + /* K5 */ be_nested_str_weak(web_value_onoff), + /* K6 */ be_nested_str_weak(shadow_onoff), + }), + be_str_weak(web_values), + &be_const_str_solidified, + ( &(const binstruction[11]) { /* code */ + 0xA4060000, // 0000 IMPORT R1 K0 + 0xA40A0200, // 0001 IMPORT R2 K1 + 0x8C0C0302, // 0002 GETMET R3 R1 K2 + 0x8C140503, // 0003 GETMET R5 R2 K3 + 0x581C0004, // 0004 LDCONST R7 K4 + 0x8C200105, // 0005 GETMET R8 R0 K5 + 0x88280106, // 0006 GETMBR R10 R0 K6 + 0x7C200400, // 0007 CALL R8 2 + 0x7C140600, // 0008 CALL R5 3 + 0x7C0C0400, // 0009 CALL R3 2 + 0x80000000, // 000A RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: init +********************************************************************/ +be_local_closure(Matter_Plugin_Bridge_Light0_init, /* name */ + be_nested_proto( + 9, /* nstack */ + 4, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 7]) { /* constants */ + /* K0 */ be_nested_str_weak(init), + /* K1 */ be_nested_str_weak(shadow_onoff), + /* K2 */ be_nested_str_weak(tasmota_relay_index), + /* K3 */ be_nested_str_weak(find), + /* K4 */ be_nested_str_weak(ARG), + /* K5 */ be_const_int(1), + /* K6 */ be_const_int(0), + }), + be_str_weak(init), + &be_const_str_solidified, + ( &(const binstruction[22]) { /* code */ + 0x60100003, // 0000 GETGBL R4 G3 + 0x5C140000, // 0001 MOVE R5 R0 + 0x7C100200, // 0002 CALL R4 1 + 0x8C100900, // 0003 GETMET R4 R4 K0 + 0x5C180200, // 0004 MOVE R6 R1 + 0x5C1C0400, // 0005 MOVE R7 R2 + 0x5C200600, // 0006 MOVE R8 R3 + 0x7C100800, // 0007 CALL R4 4 + 0x50100000, // 0008 LDBOOL R4 0 0 + 0x90020204, // 0009 SETMBR R0 K1 R4 + 0x60100009, // 000A GETGBL R4 G9 + 0x8C140703, // 000B GETMET R5 R3 K3 + 0x881C0104, // 000C GETMBR R7 R0 K4 + 0x58200005, // 000D LDCONST R8 K5 + 0x7C140600, // 000E CALL R5 3 + 0x7C100200, // 000F CALL R4 1 + 0x90020404, // 0010 SETMBR R0 K2 R4 + 0x88100102, // 0011 GETMBR R4 R0 K2 + 0x18100906, // 0012 LE R4 R4 K6 + 0x78120000, // 0013 JMPF R4 #0015 + 0x90020505, // 0014 SETMBR R0 K2 K5 + 0x80000000, // 0015 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: set_onoff +********************************************************************/ +be_local_closure(Matter_Plugin_Bridge_Light0_set_onoff, /* name */ + be_nested_proto( + 7, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 6]) { /* constants */ + /* K0 */ be_nested_str_weak(call_remote_sync), + /* K1 */ be_nested_str_weak(Power), + /* K2 */ be_nested_str_weak(tasmota_relay_index), + /* K3 */ be_nested_str_weak(1), + /* K4 */ be_nested_str_weak(0), + /* K5 */ be_nested_str_weak(parse_update), + }), + be_str_weak(set_onoff), + &be_const_str_solidified, + ( &(const binstruction[18]) { /* code */ + 0x8C080100, // 0000 GETMET R2 R0 K0 + 0x60100008, // 0001 GETGBL R4 G8 + 0x88140102, // 0002 GETMBR R5 R0 K2 + 0x7C100200, // 0003 CALL R4 1 + 0x00120204, // 0004 ADD R4 K1 R4 + 0x78060001, // 0005 JMPF R1 #0008 + 0x58140003, // 0006 LDCONST R5 K3 + 0x70020000, // 0007 JMP #0009 + 0x58140004, // 0008 LDCONST R5 K4 + 0x7C080600, // 0009 CALL R2 3 + 0x4C0C0000, // 000A LDNIL R3 + 0x200C0403, // 000B NE R3 R2 R3 + 0x780E0003, // 000C JMPF R3 #0011 + 0x8C0C0105, // 000D GETMET R3 R0 K5 + 0x5C140400, // 000E MOVE R5 R2 + 0x541A000A, // 000F LDINT R6 11 + 0x7C0C0600, // 0010 CALL R3 3 + 0x80000000, // 0011 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: invoke_request +********************************************************************/ +be_local_closure(Matter_Plugin_Bridge_Light0_invoke_request, /* name */ + be_nested_proto( + 10, /* nstack */ + 4, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[10]) { /* constants */ + /* K0 */ be_nested_str_weak(matter), + /* K1 */ be_nested_str_weak(TLV), + /* K2 */ be_nested_str_weak(cluster), + /* K3 */ be_nested_str_weak(command), + /* K4 */ be_nested_str_weak(update_shadow_lazy), + /* K5 */ be_const_int(0), + /* K6 */ be_nested_str_weak(set_onoff), + /* K7 */ be_const_int(1), + /* K8 */ be_const_int(2), + /* K9 */ be_nested_str_weak(shadow_onoff), + }), + be_str_weak(invoke_request), + &be_const_str_solidified, + ( &(const binstruction[36]) { /* code */ + 0xB8120000, // 0000 GETNGBL R4 K0 + 0x88100901, // 0001 GETMBR R4 R4 K1 + 0x88140702, // 0002 GETMBR R5 R3 K2 + 0x88180703, // 0003 GETMBR R6 R3 K3 + 0x541E0005, // 0004 LDINT R7 6 + 0x1C1C0A07, // 0005 EQ R7 R5 R7 + 0x781E001B, // 0006 JMPF R7 #0023 + 0x8C1C0104, // 0007 GETMET R7 R0 K4 + 0x7C1C0200, // 0008 CALL R7 1 + 0x1C1C0D05, // 0009 EQ R7 R6 K5 + 0x781E0005, // 000A JMPF R7 #0011 + 0x8C1C0106, // 000B GETMET R7 R0 K6 + 0x50240000, // 000C LDBOOL R9 0 0 + 0x7C1C0400, // 000D CALL R7 2 + 0x501C0200, // 000E LDBOOL R7 1 0 + 0x80040E00, // 000F RET 1 R7 + 0x70020011, // 0010 JMP #0023 + 0x1C1C0D07, // 0011 EQ R7 R6 K7 + 0x781E0005, // 0012 JMPF R7 #0019 + 0x8C1C0106, // 0013 GETMET R7 R0 K6 + 0x50240200, // 0014 LDBOOL R9 1 0 + 0x7C1C0400, // 0015 CALL R7 2 + 0x501C0200, // 0016 LDBOOL R7 1 0 + 0x80040E00, // 0017 RET 1 R7 + 0x70020009, // 0018 JMP #0023 + 0x1C1C0D08, // 0019 EQ R7 R6 K8 + 0x781E0007, // 001A JMPF R7 #0023 + 0x8C1C0106, // 001B GETMET R7 R0 K6 + 0x88240109, // 001C GETMBR R9 R0 K9 + 0x78260000, // 001D JMPF R9 #001F + 0x50240001, // 001E LDBOOL R9 0 1 + 0x50240200, // 001F LDBOOL R9 1 0 + 0x7C1C0400, // 0020 CALL R7 2 + 0x501C0200, // 0021 LDBOOL R7 1 0 + 0x80040E00, // 0022 RET 1 R7 + 0x80000000, // 0023 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: parse_update +********************************************************************/ +be_local_closure(Matter_Plugin_Bridge_Light0_parse_update, /* name */ + be_nested_proto( + 8, /* nstack */ + 3, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 9]) { /* constants */ + /* K0 */ be_nested_str_weak(tasmota_relay_index), + /* K1 */ be_const_int(1), + /* K2 */ be_nested_str_weak(contains), + /* K3 */ be_nested_str_weak(POWER), + /* K4 */ be_nested_str_weak(find), + /* K5 */ be_nested_str_weak(ON), + /* K6 */ be_nested_str_weak(shadow_onoff), + /* K7 */ be_nested_str_weak(attribute_updated), + /* K8 */ be_const_int(0), + }), + be_str_weak(parse_update), + &be_const_str_solidified, + ( &(const binstruction[41]) { /* code */ + 0x540E000A, // 0000 LDINT R3 11 + 0x1C0C0403, // 0001 EQ R3 R2 R3 + 0x780E0024, // 0002 JMPF R3 #0028 + 0x500C0000, // 0003 LDBOOL R3 0 0 + 0x88100100, // 0004 GETMBR R4 R0 K0 + 0x1C100901, // 0005 EQ R4 R4 K1 + 0x78120009, // 0006 JMPF R4 #0011 + 0x8C100302, // 0007 GETMET R4 R1 K2 + 0x58180003, // 0008 LDCONST R6 K3 + 0x7C100400, // 0009 CALL R4 2 + 0x78120005, // 000A JMPF R4 #0011 + 0x8C100304, // 000B GETMET R4 R1 K4 + 0x58180003, // 000C LDCONST R6 K3 + 0x7C100400, // 000D CALL R4 2 + 0x1C100905, // 000E EQ R4 R4 K5 + 0x5C0C0800, // 000F MOVE R3 R4 + 0x70020007, // 0010 JMP #0019 + 0x8C100304, // 0011 GETMET R4 R1 K4 + 0x60180008, // 0012 GETGBL R6 G8 + 0x881C0100, // 0013 GETMBR R7 R0 K0 + 0x7C180200, // 0014 CALL R6 1 + 0x001A0606, // 0015 ADD R6 K3 R6 + 0x7C100400, // 0016 CALL R4 2 + 0x1C100905, // 0017 EQ R4 R4 K5 + 0x5C0C0800, // 0018 MOVE R3 R4 + 0x88100106, // 0019 GETMBR R4 R0 K6 + 0x4C140000, // 001A LDNIL R5 + 0x20100805, // 001B NE R4 R4 R5 + 0x78120009, // 001C JMPF R4 #0027 + 0x88100106, // 001D GETMBR R4 R0 K6 + 0x60140017, // 001E GETGBL R5 G23 + 0x5C180600, // 001F MOVE R6 R3 + 0x7C140200, // 0020 CALL R5 1 + 0x20100805, // 0021 NE R4 R4 R5 + 0x78120003, // 0022 JMPF R4 #0027 + 0x8C100107, // 0023 GETMET R4 R0 K7 + 0x541A0005, // 0024 LDINT R6 6 + 0x581C0008, // 0025 LDCONST R7 K8 + 0x7C100600, // 0026 CALL R4 3 + 0x90020C03, // 0027 SETMBR R0 K6 R3 + 0x80000000, // 0028 RET 0 + }) + ) +); +/*******************************************************************/ + + /******************************************************************** ** Solidified class: Matter_Plugin_Bridge_Light0 ********************************************************************/ @@ -446,25 +408,25 @@ extern const bclass be_class_Matter_Plugin_Bridge_HTTP; be_local_class(Matter_Plugin_Bridge_Light0, 2, &be_class_Matter_Plugin_Bridge_HTTP, - be_nested_map(15, + be_nested_map(14, ( (struct bmapnode*) &(const bmapnode[]) { - { be_const_key_weak(init, -1), be_const_closure(Matter_Plugin_Bridge_Light0_init_closure) }, - { be_const_key_weak(parse_update, -1), be_const_closure(Matter_Plugin_Bridge_Light0_parse_update_closure) }, - { be_const_key_weak(invoke_request, 14), be_const_closure(Matter_Plugin_Bridge_Light0_invoke_request_closure) }, - { be_const_key_weak(set_onoff, -1), be_const_closure(Matter_Plugin_Bridge_Light0_set_onoff_closure) }, - { be_const_key_weak(ARG_TYPE, 11), be_const_static_closure(Matter_Plugin_Bridge_Light0__X3Clambda_X3E_closure) }, - { be_const_key_weak(tasmota_relay_index, 7), be_const_var(0) }, + { be_const_key_weak(read_attribute, 11), be_const_closure(Matter_Plugin_Bridge_Light0_read_attribute_closure) }, { be_const_key_weak(ARG, -1), be_nested_str_weak(relay) }, + { be_const_key_weak(ARG_TYPE, 12), be_const_static_closure(Matter_Plugin_Bridge_Light0__X3Clambda_X3E_closure) }, + { be_const_key_weak(TYPE, -1), be_nested_str_weak(http_light0) }, + { be_const_key_weak(web_values, -1), be_const_closure(Matter_Plugin_Bridge_Light0_web_values_closure) }, + { be_const_key_weak(init, -1), be_const_closure(Matter_Plugin_Bridge_Light0_init_closure) }, + { be_const_key_weak(set_onoff, 13), be_const_closure(Matter_Plugin_Bridge_Light0_set_onoff_closure) }, + { be_const_key_weak(invoke_request, -1), be_const_closure(Matter_Plugin_Bridge_Light0_invoke_request_closure) }, + { be_const_key_weak(NAME, -1), be_nested_str_weak(_X26_X23x1F517_X3B_X20Light_X200_X20On) }, + { be_const_key_weak(tasmota_relay_index, -1), be_const_var(0) }, { be_const_key_weak(TYPES, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { be_const_map( * be_nested_map(2, ( (struct bmapnode*) &(const bmapnode[]) { { be_const_key_int(256, -1), be_const_int(2) }, { be_const_key_int(19, -1), be_const_int(1) }, })) ) } )) }, - { be_const_key_weak(TYPE, -1), be_nested_str_weak(http_light0) }, - { be_const_key_weak(NAME, 6), be_nested_str_weak(_X26_X23x1F517_X3B_X20Light_X200_X20On) }, - { be_const_key_weak(web_value_onoff, -1), be_const_closure(Matter_Plugin_Bridge_Light0_web_value_onoff_closure) }, - { be_const_key_weak(CLUSTERS, 8), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { + { be_const_key_weak(CLUSTERS, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { be_const_map( * be_nested_map(1, ( (struct bmapnode*) &(const bmapnode[]) { { be_const_key_int(6, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_list, { @@ -475,9 +437,8 @@ be_local_class(Matter_Plugin_Bridge_Light0, be_const_int(65533), })) ) } )) }, })) ) } )) }, - { be_const_key_weak(read_attribute, -1), be_const_closure(Matter_Plugin_Bridge_Light0_read_attribute_closure) }, + { be_const_key_weak(parse_update, -1), be_const_closure(Matter_Plugin_Bridge_Light0_parse_update_closure) }, { be_const_key_weak(shadow_onoff, -1), be_const_var(1) }, - { be_const_key_weak(web_values, -1), be_const_closure(Matter_Plugin_Bridge_Light0_web_values_closure) }, })), be_str_weak(Matter_Plugin_Bridge_Light0) ); diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Light1.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Light1.h index 2ff2c9f37..d82710edf 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Light1.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Light1.h @@ -286,30 +286,32 @@ be_local_closure(Matter_Plugin_Bridge_Light1_web_values, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[ 7]) { /* constants */ + ( &(const bvalue[ 8]) { /* constants */ /* K0 */ be_nested_str_weak(webserver), /* K1 */ be_nested_str_weak(string), /* K2 */ be_nested_str_weak(content_send), /* K3 */ be_nested_str_weak(format), /* K4 */ be_nested_str_weak(_X7C_X20Light_X20_X25s_X20_X25s), /* K5 */ be_nested_str_weak(web_value_onoff), - /* K6 */ be_nested_str_weak(web_value_dimmer), + /* K6 */ be_nested_str_weak(shadow_onoff), + /* K7 */ be_nested_str_weak(web_value_dimmer), }), be_str_weak(web_values), &be_const_str_solidified, - ( &(const binstruction[12]) { /* code */ + ( &(const binstruction[13]) { /* code */ 0xA4060000, // 0000 IMPORT R1 K0 0xA40A0200, // 0001 IMPORT R2 K1 0x8C0C0302, // 0002 GETMET R3 R1 K2 0x8C140503, // 0003 GETMET R5 R2 K3 0x581C0004, // 0004 LDCONST R7 K4 0x8C200105, // 0005 GETMET R8 R0 K5 - 0x7C200200, // 0006 CALL R8 1 - 0x8C240106, // 0007 GETMET R9 R0 K6 - 0x7C240200, // 0008 CALL R9 1 - 0x7C140800, // 0009 CALL R5 4 - 0x7C0C0400, // 000A CALL R3 2 - 0x80000000, // 000B RET 0 + 0x88280106, // 0006 GETMBR R10 R0 K6 + 0x7C200400, // 0007 CALL R8 2 + 0x8C240107, // 0008 GETMET R9 R0 K7 + 0x7C240200, // 0009 CALL R9 1 + 0x7C140800, // 000A CALL R5 4 + 0x7C0C0400, // 000B CALL R3 2 + 0x80000000, // 000C RET 0 }) ) ); diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Light2.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Light2.h index 88870f768..b6a09c24e 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Light2.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Light2.h @@ -122,33 +122,35 @@ be_local_closure(Matter_Plugin_Bridge_Light2_web_values, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[ 8]) { /* constants */ + ( &(const bvalue[ 9]) { /* constants */ /* K0 */ be_nested_str_weak(webserver), /* K1 */ be_nested_str_weak(string), /* K2 */ be_nested_str_weak(content_send), /* K3 */ be_nested_str_weak(format), /* K4 */ be_nested_str_weak(_X7C_X20Light_X20_X25s_X20_X25s_X20_X25s), /* K5 */ be_nested_str_weak(web_value_onoff), - /* K6 */ be_nested_str_weak(web_value_dimmer), - /* K7 */ be_nested_str_weak(web_value_ct), + /* K6 */ be_nested_str_weak(shadow_onoff), + /* K7 */ be_nested_str_weak(web_value_dimmer), + /* K8 */ be_nested_str_weak(web_value_ct), }), be_str_weak(web_values), &be_const_str_solidified, - ( &(const binstruction[14]) { /* code */ + ( &(const binstruction[15]) { /* code */ 0xA4060000, // 0000 IMPORT R1 K0 0xA40A0200, // 0001 IMPORT R2 K1 0x8C0C0302, // 0002 GETMET R3 R1 K2 0x8C140503, // 0003 GETMET R5 R2 K3 0x581C0004, // 0004 LDCONST R7 K4 0x8C200105, // 0005 GETMET R8 R0 K5 - 0x7C200200, // 0006 CALL R8 1 - 0x8C240106, // 0007 GETMET R9 R0 K6 - 0x7C240200, // 0008 CALL R9 1 - 0x8C280107, // 0009 GETMET R10 R0 K7 - 0x7C280200, // 000A CALL R10 1 - 0x7C140A00, // 000B CALL R5 5 - 0x7C0C0400, // 000C CALL R3 2 - 0x80000000, // 000D RET 0 + 0x88280106, // 0006 GETMBR R10 R0 K6 + 0x7C200400, // 0007 CALL R8 2 + 0x8C240107, // 0008 GETMET R9 R0 K7 + 0x7C240200, // 0009 CALL R9 1 + 0x8C280108, // 000A GETMET R10 R0 K8 + 0x7C280200, // 000B CALL R10 1 + 0x7C140A00, // 000C CALL R5 5 + 0x7C0C0400, // 000D CALL R3 2 + 0x80000000, // 000E RET 0 }) ) ); diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Light3.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Light3.h index 13daccf0e..d9af0894e 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Light3.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Light3.h @@ -176,33 +176,35 @@ be_local_closure(Matter_Plugin_Bridge_Light3_web_values, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[ 8]) { /* constants */ + ( &(const bvalue[ 9]) { /* constants */ /* K0 */ be_nested_str_weak(webserver), /* K1 */ be_nested_str_weak(string), /* K2 */ be_nested_str_weak(content_send), /* K3 */ be_nested_str_weak(format), /* K4 */ be_nested_str_weak(_X7C_X20Light_X20_X25s_X20_X25s_X20_X25s), /* K5 */ be_nested_str_weak(web_value_onoff), - /* K6 */ be_nested_str_weak(web_value_dimmer), - /* K7 */ be_nested_str_weak(web_value_RGB), + /* K6 */ be_nested_str_weak(shadow_onoff), + /* K7 */ be_nested_str_weak(web_value_dimmer), + /* K8 */ be_nested_str_weak(web_value_RGB), }), be_str_weak(web_values), &be_const_str_solidified, - ( &(const binstruction[14]) { /* code */ + ( &(const binstruction[15]) { /* code */ 0xA4060000, // 0000 IMPORT R1 K0 0xA40A0200, // 0001 IMPORT R2 K1 0x8C0C0302, // 0002 GETMET R3 R1 K2 0x8C140503, // 0003 GETMET R5 R2 K3 0x581C0004, // 0004 LDCONST R7 K4 0x8C200105, // 0005 GETMET R8 R0 K5 - 0x7C200200, // 0006 CALL R8 1 - 0x8C240106, // 0007 GETMET R9 R0 K6 - 0x7C240200, // 0008 CALL R9 1 - 0x8C280107, // 0009 GETMET R10 R0 K7 - 0x7C280200, // 000A CALL R10 1 - 0x7C140A00, // 000B CALL R5 5 - 0x7C0C0400, // 000C CALL R3 2 - 0x80000000, // 000D RET 0 + 0x88280106, // 0006 GETMBR R10 R0 K6 + 0x7C200400, // 0007 CALL R8 2 + 0x8C240107, // 0008 GETMET R9 R0 K7 + 0x7C240200, // 0009 CALL R9 1 + 0x8C280108, // 000A GETMET R10 R0 K8 + 0x7C280200, // 000B CALL R10 1 + 0x7C140A00, // 000C CALL R5 5 + 0x7C0C0400, // 000D CALL R3 2 + 0x80000000, // 000E RET 0 }) ) ); diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_OnOff.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_OnOff.h index d80c3e6fa..a547e02c6 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_OnOff.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_OnOff.h @@ -11,7 +11,7 @@ extern const bclass be_class_Matter_Plugin_Bridge_OnOff; ********************************************************************/ be_local_closure(Matter_Plugin_Bridge_OnOff_web_values, /* name */ be_nested_proto( - 11, /* nstack */ + 12, /* nstack */ 1, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -19,7 +19,7 @@ be_local_closure(Matter_Plugin_Bridge_OnOff_web_values, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[ 7]) { /* constants */ + ( &(const bvalue[ 8]) { /* constants */ /* K0 */ be_nested_str_weak(webserver), /* K1 */ be_nested_str_weak(string), /* K2 */ be_nested_str_weak(content_send), @@ -27,10 +27,11 @@ be_local_closure(Matter_Plugin_Bridge_OnOff_web_values, /* name */ /* K4 */ be_nested_str_weak(_X7C_X20Relay_X20_X25i_X20_X25s), /* K5 */ be_nested_str_weak(tasmota_relay_index), /* K6 */ be_nested_str_weak(web_value_onoff), + /* K7 */ be_nested_str_weak(shadow_onoff), }), be_str_weak(web_values), &be_const_str_solidified, - ( &(const binstruction[11]) { /* code */ + ( &(const binstruction[12]) { /* code */ 0xA4060000, // 0000 IMPORT R1 K0 0xA40A0200, // 0001 IMPORT R2 K1 0x8C0C0302, // 0002 GETMET R3 R1 K2 @@ -38,10 +39,11 @@ be_local_closure(Matter_Plugin_Bridge_OnOff_web_values, /* name */ 0x581C0004, // 0004 LDCONST R7 K4 0x88200105, // 0005 GETMBR R8 R0 K5 0x8C240106, // 0006 GETMET R9 R0 K6 - 0x7C240200, // 0007 CALL R9 1 - 0x7C140800, // 0008 CALL R5 4 - 0x7C0C0400, // 0009 CALL R3 2 - 0x80000000, // 000A RET 0 + 0x882C0107, // 0007 GETMBR R11 R0 K7 + 0x7C240400, // 0008 CALL R9 2 + 0x7C140800, // 0009 CALL R5 4 + 0x7C0C0400, // 000A CALL R3 2 + 0x80000000, // 000B RET 0 }) ) ); diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Sensor_Occupancy.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Sensor_Occupancy.h new file mode 100644 index 000000000..5edda2ce7 --- /dev/null +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Sensor_Occupancy.h @@ -0,0 +1,348 @@ +/* Solidification of Matter_Plugin_Bridge_Sensor_Occupancy.h */ +/********************************************************************\ +* Generated code, don't edit * +\********************************************************************/ +#include "be_constobj.h" + +extern const bclass be_class_Matter_Plugin_Bridge_Sensor_Occupancy; + +/******************************************************************** +** Solidified function: web_values +********************************************************************/ +be_local_closure(Matter_Plugin_Bridge_Sensor_Occupancy_web_values, /* name */ + be_nested_proto( + 12, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 8]) { /* constants */ + /* K0 */ be_nested_str_weak(webserver), + /* K1 */ be_nested_str_weak(string), + /* K2 */ be_nested_str_weak(content_send), + /* K3 */ be_nested_str_weak(format), + /* K4 */ be_nested_str_weak(_X7C_X20Occupancy_X25i_X20_X25s), + /* K5 */ be_nested_str_weak(tasmota_switch_index), + /* K6 */ be_nested_str_weak(web_value_onoff), + /* K7 */ be_nested_str_weak(shadow_occupancy), + }), + be_str_weak(web_values), + &be_const_str_solidified, + ( &(const binstruction[12]) { /* code */ + 0xA4060000, // 0000 IMPORT R1 K0 + 0xA40A0200, // 0001 IMPORT R2 K1 + 0x8C0C0302, // 0002 GETMET R3 R1 K2 + 0x8C140503, // 0003 GETMET R5 R2 K3 + 0x581C0004, // 0004 LDCONST R7 K4 + 0x88200105, // 0005 GETMBR R8 R0 K5 + 0x8C240106, // 0006 GETMET R9 R0 K6 + 0x882C0107, // 0007 GETMBR R11 R0 K7 + 0x7C240400, // 0008 CALL R9 2 + 0x7C140800, // 0009 CALL R5 4 + 0x7C0C0400, // 000A CALL R3 2 + 0x80000000, // 000B RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: read_attribute +********************************************************************/ +be_local_closure(Matter_Plugin_Bridge_Sensor_Occupancy_read_attribute, /* name */ + be_nested_proto( + 11, /* nstack */ + 3, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[15]) { /* constants */ + /* K0 */ be_nested_str_weak(string), + /* K1 */ be_nested_str_weak(matter), + /* K2 */ be_nested_str_weak(TLV), + /* K3 */ be_nested_str_weak(cluster), + /* K4 */ be_nested_str_weak(attribute), + /* K5 */ be_const_int(0), + /* K6 */ be_nested_str_weak(shadow_occupancy), + /* K7 */ be_nested_str_weak(create_TLV), + /* K8 */ be_nested_str_weak(U1), + /* K9 */ be_nested_str_weak(NULL), + /* K10 */ be_const_int(1), + /* K11 */ be_const_int(3), + /* K12 */ be_const_int(2), + /* K13 */ be_nested_str_weak(U4), + /* K14 */ be_nested_str_weak(read_attribute), + }), + be_str_weak(read_attribute), + &be_const_str_solidified, + ( &(const binstruction[69]) { /* code */ + 0xA40E0000, // 0000 IMPORT R3 K0 + 0xB8120200, // 0001 GETNGBL R4 K1 + 0x88100902, // 0002 GETMBR R4 R4 K2 + 0x88140503, // 0003 GETMBR R5 R2 K3 + 0x88180504, // 0004 GETMBR R6 R2 K4 + 0x541E0405, // 0005 LDINT R7 1030 + 0x1C1C0A07, // 0006 EQ R7 R5 R7 + 0x781E0033, // 0007 JMPF R7 #003C + 0x1C1C0D05, // 0008 EQ R7 R6 K5 + 0x781E000F, // 0009 JMPF R7 #001A + 0x881C0106, // 000A GETMBR R7 R0 K6 + 0x4C200000, // 000B LDNIL R8 + 0x201C0E08, // 000C NE R7 R7 R8 + 0x781E0005, // 000D JMPF R7 #0014 + 0x8C1C0907, // 000E GETMET R7 R4 K7 + 0x88240908, // 000F GETMBR R9 R4 K8 + 0x88280106, // 0010 GETMBR R10 R0 K6 + 0x7C1C0600, // 0011 CALL R7 3 + 0x80040E00, // 0012 RET 1 R7 + 0x70020004, // 0013 JMP #0019 + 0x8C1C0907, // 0014 GETMET R7 R4 K7 + 0x88240909, // 0015 GETMBR R9 R4 K9 + 0x4C280000, // 0016 LDNIL R10 + 0x7C1C0600, // 0017 CALL R7 3 + 0x80040E00, // 0018 RET 1 R7 + 0x70020020, // 0019 JMP #003B + 0x1C1C0D0A, // 001A EQ R7 R6 K10 + 0x781E0005, // 001B JMPF R7 #0022 + 0x8C1C0907, // 001C GETMET R7 R4 K7 + 0x88240908, // 001D GETMBR R9 R4 K8 + 0x5828000B, // 001E LDCONST R10 K11 + 0x7C1C0600, // 001F CALL R7 3 + 0x80040E00, // 0020 RET 1 R7 + 0x70020018, // 0021 JMP #003B + 0x1C1C0D0C, // 0022 EQ R7 R6 K12 + 0x781E0005, // 0023 JMPF R7 #002A + 0x8C1C0907, // 0024 GETMET R7 R4 K7 + 0x88240908, // 0025 GETMBR R9 R4 K8 + 0x58280005, // 0026 LDCONST R10 K5 + 0x7C1C0600, // 0027 CALL R7 3 + 0x80040E00, // 0028 RET 1 R7 + 0x70020010, // 0029 JMP #003B + 0x541EFFFB, // 002A LDINT R7 65532 + 0x1C1C0C07, // 002B EQ R7 R6 R7 + 0x781E0005, // 002C JMPF R7 #0033 + 0x8C1C0907, // 002D GETMET R7 R4 K7 + 0x8824090D, // 002E GETMBR R9 R4 K13 + 0x58280005, // 002F LDCONST R10 K5 + 0x7C1C0600, // 0030 CALL R7 3 + 0x80040E00, // 0031 RET 1 R7 + 0x70020007, // 0032 JMP #003B + 0x541EFFFC, // 0033 LDINT R7 65533 + 0x1C1C0C07, // 0034 EQ R7 R6 R7 + 0x781E0004, // 0035 JMPF R7 #003B + 0x8C1C0907, // 0036 GETMET R7 R4 K7 + 0x8824090D, // 0037 GETMBR R9 R4 K13 + 0x5828000B, // 0038 LDCONST R10 K11 + 0x7C1C0600, // 0039 CALL R7 3 + 0x80040E00, // 003A RET 1 R7 + 0x70020007, // 003B JMP #0044 + 0x601C0003, // 003C GETGBL R7 G3 + 0x5C200000, // 003D MOVE R8 R0 + 0x7C1C0200, // 003E CALL R7 1 + 0x8C1C0F0E, // 003F GETMET R7 R7 K14 + 0x5C240200, // 0040 MOVE R9 R1 + 0x5C280400, // 0041 MOVE R10 R2 + 0x7C1C0600, // 0042 CALL R7 3 + 0x80040E00, // 0043 RET 1 R7 + 0x80000000, // 0044 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: parse_update +********************************************************************/ +be_local_closure(Matter_Plugin_Bridge_Sensor_Occupancy_parse_update, /* name */ + be_nested_proto( + 8, /* nstack */ + 3, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 7]) { /* constants */ + /* K0 */ be_nested_str_weak(find), + /* K1 */ be_nested_str_weak(Switch), + /* K2 */ be_nested_str_weak(tasmota_switch_index), + /* K3 */ be_nested_str_weak(ON), + /* K4 */ be_nested_str_weak(shadow_occupancy), + /* K5 */ be_nested_str_weak(attribute_updated), + /* K6 */ be_const_int(0), + }), + be_str_weak(parse_update), + &be_const_str_solidified, + ( &(const binstruction[28]) { /* code */ + 0x540E0007, // 0000 LDINT R3 8 + 0x1C0C0403, // 0001 EQ R3 R2 R3 + 0x780E0017, // 0002 JMPF R3 #001B + 0x500C0000, // 0003 LDBOOL R3 0 0 + 0x8C100300, // 0004 GETMET R4 R1 K0 + 0x60180008, // 0005 GETGBL R6 G8 + 0x881C0102, // 0006 GETMBR R7 R0 K2 + 0x7C180200, // 0007 CALL R6 1 + 0x001A0206, // 0008 ADD R6 K1 R6 + 0x7C100400, // 0009 CALL R4 2 + 0x1C100903, // 000A EQ R4 R4 K3 + 0x5C0C0800, // 000B MOVE R3 R4 + 0x88100104, // 000C GETMBR R4 R0 K4 + 0x4C140000, // 000D LDNIL R5 + 0x20100805, // 000E NE R4 R4 R5 + 0x78120009, // 000F JMPF R4 #001A + 0x88100104, // 0010 GETMBR R4 R0 K4 + 0x60140017, // 0011 GETGBL R5 G23 + 0x5C180600, // 0012 MOVE R6 R3 + 0x7C140200, // 0013 CALL R5 1 + 0x20100805, // 0014 NE R4 R4 R5 + 0x78120003, // 0015 JMPF R4 #001A + 0x8C100105, // 0016 GETMET R4 R0 K5 + 0x541A0405, // 0017 LDINT R6 1030 + 0x581C0006, // 0018 LDCONST R7 K6 + 0x7C100600, // 0019 CALL R4 3 + 0x90020803, // 001A SETMBR R0 K4 R3 + 0x80000000, // 001B RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: +********************************************************************/ +be_local_closure(Matter_Plugin_Bridge_Sensor_Occupancy__X3Clambda_X3E, /* name */ + be_nested_proto( + 3, /* nstack */ + 1, /* argc */ + 0, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 0, /* has constants */ + NULL, /* no const */ + be_str_weak(_X3Clambda_X3E), + &be_const_str_solidified, + ( &(const binstruction[ 4]) { /* code */ + 0x60040009, // 0000 GETGBL R1 G9 + 0x5C080000, // 0001 MOVE R2 R0 + 0x7C040200, // 0002 CALL R1 1 + 0x80040200, // 0003 RET 1 R1 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: init +********************************************************************/ +be_local_closure(Matter_Plugin_Bridge_Sensor_Occupancy_init, /* name */ + be_nested_proto( + 9, /* nstack */ + 4, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 6]) { /* constants */ + /* K0 */ be_nested_str_weak(init), + /* K1 */ be_nested_str_weak(tasmota_switch_index), + /* K2 */ be_nested_str_weak(find), + /* K3 */ be_nested_str_weak(ARG), + /* K4 */ be_const_int(1), + /* K5 */ be_const_int(0), + }), + be_str_weak(init), + &be_const_str_solidified, + ( &(const binstruction[20]) { /* code */ + 0x60100003, // 0000 GETGBL R4 G3 + 0x5C140000, // 0001 MOVE R5 R0 + 0x7C100200, // 0002 CALL R4 1 + 0x8C100900, // 0003 GETMET R4 R4 K0 + 0x5C180200, // 0004 MOVE R6 R1 + 0x5C1C0400, // 0005 MOVE R7 R2 + 0x5C200600, // 0006 MOVE R8 R3 + 0x7C100800, // 0007 CALL R4 4 + 0x60100009, // 0008 GETGBL R4 G9 + 0x8C140702, // 0009 GETMET R5 R3 K2 + 0x881C0103, // 000A GETMBR R7 R0 K3 + 0x58200004, // 000B LDCONST R8 K4 + 0x7C140600, // 000C CALL R5 3 + 0x7C100200, // 000D CALL R4 1 + 0x90020204, // 000E SETMBR R0 K1 R4 + 0x88100101, // 000F GETMBR R4 R0 K1 + 0x18100905, // 0010 LE R4 R4 K5 + 0x78120000, // 0011 JMPF R4 #0013 + 0x90020304, // 0012 SETMBR R0 K1 K4 + 0x80000000, // 0013 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified class: Matter_Plugin_Bridge_Sensor_Occupancy +********************************************************************/ +extern const bclass be_class_Matter_Plugin_Bridge_HTTP; +be_local_class(Matter_Plugin_Bridge_Sensor_Occupancy, + 2, + &be_class_Matter_Plugin_Bridge_HTTP, + be_nested_map(14, + ( (struct bmapnode*) &(const bmapnode[]) { + { be_const_key_weak(CLUSTERS, 6), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { + be_const_map( * be_nested_map(1, + ( (struct bmapnode*) &(const bmapnode[]) { + { be_const_key_int(1030, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_list, { + be_const_list( * be_nested_list(5, + ( (struct bvalue*) &(const bvalue[]) { + be_const_int(0), + be_const_int(1), + be_const_int(2), + be_const_int(65532), + be_const_int(65533), + })) ) } )) }, + })) ) } )) }, + { be_const_key_weak(ARG, -1), be_nested_str_weak(switch) }, + { be_const_key_weak(UPDATE_TIME, 7), be_const_int(5000) }, + { be_const_key_weak(TYPE, -1), be_nested_str_weak(http_occupancy) }, + { be_const_key_weak(web_values, -1), be_const_closure(Matter_Plugin_Bridge_Sensor_Occupancy_web_values_closure) }, + { be_const_key_weak(UPDATE_CMD, 9), be_nested_str_weak(Status_X208) }, + { be_const_key_weak(read_attribute, -1), be_const_closure(Matter_Plugin_Bridge_Sensor_Occupancy_read_attribute_closure) }, + { be_const_key_weak(tasmota_switch_index, 11), be_const_var(0) }, + { be_const_key_weak(NAME, -1), be_nested_str_weak(_X26_X23x1F517_X3B_X20Occupancy) }, + { be_const_key_weak(init, -1), be_const_closure(Matter_Plugin_Bridge_Sensor_Occupancy_init_closure) }, + { be_const_key_weak(TYPES, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { + be_const_map( * be_nested_map(2, + ( (struct bmapnode*) &(const bmapnode[]) { + { be_const_key_int(263, -1), be_const_int(2) }, + { be_const_key_int(19, 0), be_const_int(1) }, + })) ) } )) }, + { be_const_key_weak(ARG_TYPE, 12), be_const_static_closure(Matter_Plugin_Bridge_Sensor_Occupancy__X3Clambda_X3E_closure) }, + { be_const_key_weak(parse_update, -1), be_const_closure(Matter_Plugin_Bridge_Sensor_Occupancy_parse_update_closure) }, + { be_const_key_weak(shadow_occupancy, -1), be_const_var(1) }, + })), + be_str_weak(Matter_Plugin_Bridge_Sensor_Occupancy) +); +/*******************************************************************/ + +void be_load_Matter_Plugin_Bridge_Sensor_Occupancy_class(bvm *vm) { + be_pushntvclass(vm, &be_class_Matter_Plugin_Bridge_Sensor_Occupancy); + be_setglobal(vm, "Matter_Plugin_Bridge_Sensor_Occupancy"); + be_pop(vm, 1); +} +/********************************************************************/ +/* End of solidification */ diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor_Occupancy.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor_Occupancy.h new file mode 100644 index 000000000..5ce78e2dd --- /dev/null +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor_Occupancy.h @@ -0,0 +1,324 @@ +/* Solidification of Matter_Plugin_Sensor_Occupancy.h */ +/********************************************************************\ +* Generated code, don't edit * +\********************************************************************/ +#include "be_constobj.h" + +extern const bclass be_class_Matter_Plugin_Sensor_Occupancy; + +/******************************************************************** +** Solidified function: init +********************************************************************/ +be_local_closure(Matter_Plugin_Sensor_Occupancy_init, /* name */ + be_nested_proto( + 9, /* nstack */ + 4, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 6]) { /* constants */ + /* K0 */ be_nested_str_weak(init), + /* K1 */ be_nested_str_weak(tasmota_switch_index), + /* K2 */ be_nested_str_weak(find), + /* K3 */ be_nested_str_weak(ARG), + /* K4 */ be_const_int(1), + /* K5 */ be_const_int(0), + }), + be_str_weak(init), + &be_const_str_solidified, + ( &(const binstruction[20]) { /* code */ + 0x60100003, // 0000 GETGBL R4 G3 + 0x5C140000, // 0001 MOVE R5 R0 + 0x7C100200, // 0002 CALL R4 1 + 0x8C100900, // 0003 GETMET R4 R4 K0 + 0x5C180200, // 0004 MOVE R6 R1 + 0x5C1C0400, // 0005 MOVE R7 R2 + 0x5C200600, // 0006 MOVE R8 R3 + 0x7C100800, // 0007 CALL R4 4 + 0x60100009, // 0008 GETGBL R4 G9 + 0x8C140702, // 0009 GETMET R5 R3 K2 + 0x881C0103, // 000A GETMBR R7 R0 K3 + 0x58200004, // 000B LDCONST R8 K4 + 0x7C140600, // 000C CALL R5 3 + 0x7C100200, // 000D CALL R4 1 + 0x90020204, // 000E SETMBR R0 K1 R4 + 0x88100101, // 000F GETMBR R4 R0 K1 + 0x18100905, // 0010 LE R4 R4 K5 + 0x78120000, // 0011 JMPF R4 #0013 + 0x90020304, // 0012 SETMBR R0 K1 K4 + 0x80000000, // 0013 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: +********************************************************************/ +be_local_closure(Matter_Plugin_Sensor_Occupancy__X3Clambda_X3E, /* name */ + be_nested_proto( + 3, /* nstack */ + 1, /* argc */ + 0, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 0, /* has constants */ + NULL, /* no const */ + be_str_weak(_X3Clambda_X3E), + &be_const_str_solidified, + ( &(const binstruction[ 4]) { /* code */ + 0x60040009, // 0000 GETGBL R1 G9 + 0x5C080000, // 0001 MOVE R2 R0 + 0x7C040200, // 0002 CALL R1 1 + 0x80040200, // 0003 RET 1 R1 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: read_attribute +********************************************************************/ +be_local_closure(Matter_Plugin_Sensor_Occupancy_read_attribute, /* name */ + be_nested_proto( + 11, /* nstack */ + 3, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[15]) { /* constants */ + /* K0 */ be_nested_str_weak(string), + /* K1 */ be_nested_str_weak(matter), + /* K2 */ be_nested_str_weak(TLV), + /* K3 */ be_nested_str_weak(cluster), + /* K4 */ be_nested_str_weak(attribute), + /* K5 */ be_const_int(0), + /* K6 */ be_nested_str_weak(shadow_occupancy), + /* K7 */ be_nested_str_weak(create_TLV), + /* K8 */ be_nested_str_weak(U1), + /* K9 */ be_nested_str_weak(NULL), + /* K10 */ be_const_int(1), + /* K11 */ be_const_int(3), + /* K12 */ be_const_int(2), + /* K13 */ be_nested_str_weak(U4), + /* K14 */ be_nested_str_weak(read_attribute), + }), + be_str_weak(read_attribute), + &be_const_str_solidified, + ( &(const binstruction[69]) { /* code */ + 0xA40E0000, // 0000 IMPORT R3 K0 + 0xB8120200, // 0001 GETNGBL R4 K1 + 0x88100902, // 0002 GETMBR R4 R4 K2 + 0x88140503, // 0003 GETMBR R5 R2 K3 + 0x88180504, // 0004 GETMBR R6 R2 K4 + 0x541E0405, // 0005 LDINT R7 1030 + 0x1C1C0A07, // 0006 EQ R7 R5 R7 + 0x781E0033, // 0007 JMPF R7 #003C + 0x1C1C0D05, // 0008 EQ R7 R6 K5 + 0x781E000F, // 0009 JMPF R7 #001A + 0x881C0106, // 000A GETMBR R7 R0 K6 + 0x4C200000, // 000B LDNIL R8 + 0x201C0E08, // 000C NE R7 R7 R8 + 0x781E0005, // 000D JMPF R7 #0014 + 0x8C1C0907, // 000E GETMET R7 R4 K7 + 0x88240908, // 000F GETMBR R9 R4 K8 + 0x88280106, // 0010 GETMBR R10 R0 K6 + 0x7C1C0600, // 0011 CALL R7 3 + 0x80040E00, // 0012 RET 1 R7 + 0x70020004, // 0013 JMP #0019 + 0x8C1C0907, // 0014 GETMET R7 R4 K7 + 0x88240909, // 0015 GETMBR R9 R4 K9 + 0x4C280000, // 0016 LDNIL R10 + 0x7C1C0600, // 0017 CALL R7 3 + 0x80040E00, // 0018 RET 1 R7 + 0x70020020, // 0019 JMP #003B + 0x1C1C0D0A, // 001A EQ R7 R6 K10 + 0x781E0005, // 001B JMPF R7 #0022 + 0x8C1C0907, // 001C GETMET R7 R4 K7 + 0x88240908, // 001D GETMBR R9 R4 K8 + 0x5828000B, // 001E LDCONST R10 K11 + 0x7C1C0600, // 001F CALL R7 3 + 0x80040E00, // 0020 RET 1 R7 + 0x70020018, // 0021 JMP #003B + 0x1C1C0D0C, // 0022 EQ R7 R6 K12 + 0x781E0005, // 0023 JMPF R7 #002A + 0x8C1C0907, // 0024 GETMET R7 R4 K7 + 0x88240908, // 0025 GETMBR R9 R4 K8 + 0x58280005, // 0026 LDCONST R10 K5 + 0x7C1C0600, // 0027 CALL R7 3 + 0x80040E00, // 0028 RET 1 R7 + 0x70020010, // 0029 JMP #003B + 0x541EFFFB, // 002A LDINT R7 65532 + 0x1C1C0C07, // 002B EQ R7 R6 R7 + 0x781E0005, // 002C JMPF R7 #0033 + 0x8C1C0907, // 002D GETMET R7 R4 K7 + 0x8824090D, // 002E GETMBR R9 R4 K13 + 0x58280005, // 002F LDCONST R10 K5 + 0x7C1C0600, // 0030 CALL R7 3 + 0x80040E00, // 0031 RET 1 R7 + 0x70020007, // 0032 JMP #003B + 0x541EFFFC, // 0033 LDINT R7 65533 + 0x1C1C0C07, // 0034 EQ R7 R6 R7 + 0x781E0004, // 0035 JMPF R7 #003B + 0x8C1C0907, // 0036 GETMET R7 R4 K7 + 0x8824090D, // 0037 GETMBR R9 R4 K13 + 0x5828000B, // 0038 LDCONST R10 K11 + 0x7C1C0600, // 0039 CALL R7 3 + 0x80040E00, // 003A RET 1 R7 + 0x70020007, // 003B JMP #0044 + 0x601C0003, // 003C GETGBL R7 G3 + 0x5C200000, // 003D MOVE R8 R0 + 0x7C1C0200, // 003E CALL R7 1 + 0x8C1C0F0E, // 003F GETMET R7 R7 K14 + 0x5C240200, // 0040 MOVE R9 R1 + 0x5C280400, // 0041 MOVE R10 R2 + 0x7C1C0600, // 0042 CALL R7 3 + 0x80040E00, // 0043 RET 1 R7 + 0x80000000, // 0044 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: update_shadow +********************************************************************/ +be_local_closure(Matter_Plugin_Sensor_Occupancy_update_shadow, /* name */ + be_nested_proto( + 9, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[13]) { /* constants */ + /* K0 */ be_nested_str_weak(update_shadow), + /* K1 */ be_nested_str_weak(json), + /* K2 */ be_nested_str_weak(tasmota), + /* K3 */ be_nested_str_weak(cmd), + /* K4 */ be_nested_str_weak(Status_X208), + /* K5 */ be_nested_str_weak(load), + /* K6 */ be_nested_str_weak(find), + /* K7 */ be_nested_str_weak(Switch), + /* K8 */ be_nested_str_weak(tasmota_switch_index), + /* K9 */ be_nested_str_weak(ON), + /* K10 */ be_nested_str_weak(shadow_occupancy), + /* K11 */ be_nested_str_weak(attribute_updated), + /* K12 */ be_const_int(0), + }), + be_str_weak(update_shadow), + &be_const_str_solidified, + ( &(const binstruction[45]) { /* code */ + 0x60040003, // 0000 GETGBL R1 G3 + 0x5C080000, // 0001 MOVE R2 R0 + 0x7C040200, // 0002 CALL R1 1 + 0x8C040300, // 0003 GETMET R1 R1 K0 + 0x7C040200, // 0004 CALL R1 1 + 0xA4060200, // 0005 IMPORT R1 K1 + 0xB80A0400, // 0006 GETNGBL R2 K2 + 0x8C080503, // 0007 GETMET R2 R2 K3 + 0x58100004, // 0008 LDCONST R4 K4 + 0x50140200, // 0009 LDBOOL R5 1 0 + 0x7C080600, // 000A CALL R2 3 + 0x4C0C0000, // 000B LDNIL R3 + 0x200C0403, // 000C NE R3 R2 R3 + 0x780E001D, // 000D JMPF R3 #002C + 0x8C0C0305, // 000E GETMET R3 R1 K5 + 0x5C140400, // 000F MOVE R5 R2 + 0x7C0C0400, // 0010 CALL R3 2 + 0x4C100000, // 0011 LDNIL R4 + 0x20100604, // 0012 NE R4 R3 R4 + 0x78120017, // 0013 JMPF R4 #002C + 0x50100000, // 0014 LDBOOL R4 0 0 + 0x8C140706, // 0015 GETMET R5 R3 K6 + 0x601C0008, // 0016 GETGBL R7 G8 + 0x88200108, // 0017 GETMBR R8 R0 K8 + 0x7C1C0200, // 0018 CALL R7 1 + 0x001E0E07, // 0019 ADD R7 K7 R7 + 0x7C140400, // 001A CALL R5 2 + 0x1C140B09, // 001B EQ R5 R5 K9 + 0x5C100A00, // 001C MOVE R4 R5 + 0x8814010A, // 001D GETMBR R5 R0 K10 + 0x4C180000, // 001E LDNIL R6 + 0x20140A06, // 001F NE R5 R5 R6 + 0x78160009, // 0020 JMPF R5 #002B + 0x8814010A, // 0021 GETMBR R5 R0 K10 + 0x60180017, // 0022 GETGBL R6 G23 + 0x5C1C0800, // 0023 MOVE R7 R4 + 0x7C180200, // 0024 CALL R6 1 + 0x20140A06, // 0025 NE R5 R5 R6 + 0x78160003, // 0026 JMPF R5 #002B + 0x8C14010B, // 0027 GETMET R5 R0 K11 + 0x541E0405, // 0028 LDINT R7 1030 + 0x5820000C, // 0029 LDCONST R8 K12 + 0x7C140600, // 002A CALL R5 3 + 0x90021404, // 002B SETMBR R0 K10 R4 + 0x80000000, // 002C RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified class: Matter_Plugin_Sensor_Occupancy +********************************************************************/ +extern const bclass be_class_Matter_Plugin_Device; +be_local_class(Matter_Plugin_Sensor_Occupancy, + 2, + &be_class_Matter_Plugin_Device, + be_nested_map(12, + ( (struct bmapnode*) &(const bmapnode[]) { + { be_const_key_weak(UPDATE_TIME, -1), be_const_int(5000) }, + { be_const_key_weak(TYPE, 9), be_nested_str_weak(occupancy) }, + { be_const_key_weak(TYPES, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { + be_const_map( * be_nested_map(1, + ( (struct bmapnode*) &(const bmapnode[]) { + { be_const_key_int(263, -1), be_const_int(2) }, + })) ) } )) }, + { be_const_key_weak(init, 11), be_const_closure(Matter_Plugin_Sensor_Occupancy_init_closure) }, + { be_const_key_weak(ARG_TYPE, -1), be_const_static_closure(Matter_Plugin_Sensor_Occupancy__X3Clambda_X3E_closure) }, + { be_const_key_weak(NAME, -1), be_nested_str_weak(Occupancy) }, + { be_const_key_weak(read_attribute, 5), be_const_closure(Matter_Plugin_Sensor_Occupancy_read_attribute_closure) }, + { be_const_key_weak(shadow_occupancy, -1), be_const_var(1) }, + { be_const_key_weak(CLUSTERS, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { + be_const_map( * be_nested_map(1, + ( (struct bmapnode*) &(const bmapnode[]) { + { be_const_key_int(1030, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_list, { + be_const_list( * be_nested_list(5, + ( (struct bvalue*) &(const bvalue[]) { + be_const_int(0), + be_const_int(1), + be_const_int(2), + be_const_int(65532), + be_const_int(65533), + })) ) } )) }, + })) ) } )) }, + { be_const_key_weak(update_shadow, -1), be_const_closure(Matter_Plugin_Sensor_Occupancy_update_shadow_closure) }, + { be_const_key_weak(tasmota_switch_index, 8), be_const_var(0) }, + { be_const_key_weak(ARG, -1), be_nested_str_weak(switch) }, + })), + be_str_weak(Matter_Plugin_Sensor_Occupancy) +); +/*******************************************************************/ + +void be_load_Matter_Plugin_Sensor_Occupancy_class(bvm *vm) { + be_pushntvclass(vm, &be_class_Matter_Plugin_Sensor_Occupancy); + be_setglobal(vm, "Matter_Plugin_Sensor_Occupancy"); + be_pop(vm, 1); +} +/********************************************************************/ +/* End of solidification */ diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_UI.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_UI.h index fe0022411..5081bf00b 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_UI.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_UI.h @@ -1969,7 +1969,7 @@ be_local_class(Matter_UI, NULL, be_nested_map(19, ( (struct bmapnode*) &(const bmapnode[]) { - { be_const_key_weak(_CLASSES_TYPES, -1), be_nested_str_weak(_X7Crelay_X7Clight0_X7Clight1_X7Clight2_X7Clight3_X7Cshutter_X7Cshutter_X2Btilt_X7Ctemperature_X7Cpressure_X7Cilluminance_X7Chumidity) }, + { be_const_key_weak(_CLASSES_TYPES, -1), be_nested_str_weak(_X7Crelay_X7Clight0_X7Clight1_X7Clight2_X7Clight3_X7Cshutter_X7Cshutter_X2Btilt_X7Ctemperature_X7Cpressure_X7Cilluminance_X7Chumidity_X7Coccupancy) }, { be_const_key_weak(device, -1), be_const_var(0) }, { be_const_key_weak(show_enable, -1), be_const_closure(Matter_UI_show_enable_closure) }, { be_const_key_weak(plugin_option, -1), be_const_closure(Matter_UI_plugin_option_closure) }, @@ -1986,7 +1986,7 @@ be_local_class(Matter_UI, { be_const_key_weak(web_add_config_button, 8), be_const_closure(Matter_UI_web_add_config_button_closure) }, { be_const_key_weak(page_part_mgr, 7), be_const_closure(Matter_UI_page_part_mgr_closure) }, { be_const_key_weak(show_commissioning_info, -1), be_const_closure(Matter_UI_show_commissioning_info_closure) }, - { be_const_key_weak(_CLASSES_TYPES2, -1), be_nested_str_weak(_X2Dhttp_X7Chttp_relay_X7Chttp_light0_X7Chttp_light1_X7Chttp_light2_X7Chttp_light3_X7Chttp_temperature_X7Chttp_pressure_X7Chttp_illuminance_X7Chttp_humidity) }, + { be_const_key_weak(_CLASSES_TYPES2, -1), be_nested_str_weak(_X2Dhttp_X7Chttp_relay_X7Chttp_light0_X7Chttp_light1_X7Chttp_light2_X7Chttp_light3_X7Chttp_temperature_X7Chttp_pressure_X7Chttp_illuminance_X7Chttp_humidity_X7Chttp_occupancy) }, { be_const_key_weak(show_fabric_info, -1), be_const_closure(Matter_UI_show_fabric_info_closure) }, })), be_str_weak(Matter_UI) From 3c75bc92a2b3b5cfe853fbd904b48a640e4d83f5 Mon Sep 17 00:00:00 2001 From: s-hadinger <49731213+s-hadinger@users.noreply.github.com> Date: Mon, 29 May 2023 23:05:45 +0200 Subject: [PATCH 207/289] Zigbee Berry mapping fix attributes (#18747) --- lib/libesp32/berry/src/be_introspectlib.c | 13 +-- .../src/embedded/zigbee_zb_coord.be | 15 +++- .../src/embedded/zigbee_zcl_attribute.be | 2 +- .../src/solidify/solidified_zigbee_zb_coord.h | 80 +++++++++++++++---- .../xdrv_52_3_berry_zigbee.ino | 11 +-- 5 files changed, 93 insertions(+), 28 deletions(-) diff --git a/lib/libesp32/berry/src/be_introspectlib.c b/lib/libesp32/berry/src/be_introspectlib.c index a87ce3932..4f98f2d94 100644 --- a/lib/libesp32/berry/src/be_introspectlib.c +++ b/lib/libesp32/berry/src/be_introspectlib.c @@ -70,12 +70,15 @@ static int m_findmember(bvm *vm) if (top >= 3) { protected = !be_tobool(vm, 3); } - if (top >= 2) { - if (protected && (be_isinstance(vm, 1) || be_ismodule(vm, 1) || be_isclass(vm, 1)) && be_isstring(vm, 2)) { - int ret = be_execprotected(vm, &m_findmember_protected, (void*) be_tostring(vm, 2)); - if (ret == BE_OK) { - be_return(vm); + if (top >= 2 && be_isstring(vm, 2)) { + if (protected) { + if (be_isinstance(vm, 1) || be_ismodule(vm, 1) || be_isclass(vm, 1)) { + int ret = be_execprotected(vm, &m_findmember_protected, (void*) be_tostring(vm, 2)); + if (ret == BE_OK) { + be_return(vm); + } } + be_return_nil(vm); } else { /* run unprotected */ if (be_getmember(vm, 1, be_tostring(vm, 2))) { diff --git a/lib/libesp32/berry_tasmota/src/embedded/zigbee_zb_coord.be b/lib/libesp32/berry_tasmota/src/embedded/zigbee_zb_coord.be index aab49d271..58a81ca60 100644 --- a/lib/libesp32/berry_tasmota/src/embedded/zigbee_zb_coord.be +++ b/lib/libesp32/berry_tasmota/src/embedded/zigbee_zb_coord.be @@ -17,12 +17,23 @@ class zb_coord : zb_coord_ntv raise "value_error", "instance required" end if self._handlers - self._handlers.push(h) - else + if self._handlers.find(h) == nil # make it idempotent + self._handlers.push(h) + end + else self._handlers = [h] end end + def remove_handler(h) + if self._handlers + var idx = self._handlers.find(h) + if idx != nil + self._handlers.remove(idx) + end + end + end + # dispatch incomind events # # event_type: diff --git a/lib/libesp32/berry_tasmota/src/embedded/zigbee_zcl_attribute.be b/lib/libesp32/berry_tasmota/src/embedded/zigbee_zcl_attribute.be index e58c463d9..361826787 100644 --- a/lib/libesp32/berry_tasmota/src/embedded/zigbee_zcl_attribute.be +++ b/lib/libesp32/berry_tasmota/src/embedded/zigbee_zcl_attribute.be @@ -46,7 +46,7 @@ class zcl_attribute : zcl_attribute_ntv elif k == "key" return self._get_key() else - return super(self).member(k) + return super(self).member(k) # natural mapping end end diff --git a/lib/libesp32/berry_tasmota/src/solidify/solidified_zigbee_zb_coord.h b/lib/libesp32/berry_tasmota/src/solidify/solidified_zigbee_zb_coord.h index 10dc93c33..425e256a3 100644 --- a/lib/libesp32/berry_tasmota/src/solidify/solidified_zigbee_zb_coord.h +++ b/lib/libesp32/berry_tasmota/src/solidify/solidified_zigbee_zb_coord.h @@ -50,16 +50,17 @@ be_local_closure(zb_coord_add_handler, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[ 5]) { /* constants */ + ( &(const bvalue[ 6]) { /* constants */ /* K0 */ be_nested_str_weak(instance), /* K1 */ be_nested_str_weak(value_error), /* K2 */ be_nested_str_weak(instance_X20required), /* K3 */ be_nested_str_weak(_handlers), - /* K4 */ be_nested_str_weak(push), + /* K4 */ be_nested_str_weak(find), + /* K5 */ be_nested_str_weak(push), }), be_str_weak(add_handler), &be_const_str_solidified, - ( &(const binstruction[18]) { /* code */ + ( &(const binstruction[25]) { /* code */ 0x60080004, // 0000 GETGBL R2 G4 0x5C0C0200, // 0001 MOVE R3 R1 0x7C080200, // 0002 CALL R2 1 @@ -67,17 +68,24 @@ be_local_closure(zb_coord_add_handler, /* name */ 0x780A0000, // 0004 JMPF R2 #0006 0xB0060302, // 0005 RAISE 1 K1 K2 0x88080103, // 0006 GETMBR R2 R0 K3 - 0x780A0004, // 0007 JMPF R2 #000D + 0x780A000B, // 0007 JMPF R2 #0014 0x88080103, // 0008 GETMBR R2 R0 K3 0x8C080504, // 0009 GETMET R2 R2 K4 0x5C100200, // 000A MOVE R4 R1 0x7C080400, // 000B CALL R2 2 - 0x70020003, // 000C JMP #0011 - 0x60080012, // 000D GETGBL R2 G18 - 0x7C080000, // 000E CALL R2 0 - 0x400C0401, // 000F CONNECT R3 R2 R1 - 0x90020602, // 0010 SETMBR R0 K3 R2 - 0x80000000, // 0011 RET 0 + 0x4C0C0000, // 000C LDNIL R3 + 0x1C080403, // 000D EQ R2 R2 R3 + 0x780A0003, // 000E JMPF R2 #0013 + 0x88080103, // 000F GETMBR R2 R0 K3 + 0x8C080505, // 0010 GETMET R2 R2 K5 + 0x5C100200, // 0011 MOVE R4 R1 + 0x7C080400, // 0012 CALL R2 2 + 0x70020003, // 0013 JMP #0018 + 0x60080012, // 0014 GETGBL R2 G18 + 0x7C080000, // 0015 CALL R2 0 + 0x400C0401, // 0016 CONNECT R3 R2 R1 + 0x90020602, // 0017 SETMBR R0 K3 R2 + 0x80000000, // 0018 RET 0 }) ) ); @@ -195,6 +203,47 @@ be_local_closure(zb_coord_dispatch, /* name */ /*******************************************************************/ +/******************************************************************** +** Solidified function: remove_handler +********************************************************************/ +be_local_closure(zb_coord_remove_handler, /* name */ + be_nested_proto( + 6, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 3]) { /* constants */ + /* K0 */ be_nested_str_weak(_handlers), + /* K1 */ be_nested_str_weak(find), + /* K2 */ be_nested_str_weak(remove), + }), + be_str_weak(remove_handler), + &be_const_str_solidified, + ( &(const binstruction[14]) { /* code */ + 0x88080100, // 0000 GETMBR R2 R0 K0 + 0x780A000A, // 0001 JMPF R2 #000D + 0x88080100, // 0002 GETMBR R2 R0 K0 + 0x8C080501, // 0003 GETMET R2 R2 K1 + 0x5C100200, // 0004 MOVE R4 R1 + 0x7C080400, // 0005 CALL R2 2 + 0x4C0C0000, // 0006 LDNIL R3 + 0x200C0403, // 0007 NE R3 R2 R3 + 0x780E0003, // 0008 JMPF R3 #000D + 0x880C0100, // 0009 GETMBR R3 R0 K0 + 0x8C0C0702, // 000A GETMET R3 R3 K2 + 0x5C140400, // 000B MOVE R5 R2 + 0x7C0C0400, // 000C CALL R3 2 + 0x80000000, // 000D RET 0 + }) + ) +); +/*******************************************************************/ + + /******************************************************************** ** Solidified class: zb_coord ********************************************************************/ @@ -202,12 +251,13 @@ extern const bclass be_class_zb_coord_ntv; be_local_class(zb_coord, 1, &be_class_zb_coord_ntv, - be_nested_map(4, + be_nested_map(5, ( (struct bmapnode*) &(const bmapnode[]) { - { be_const_key_weak(dispatch, 1), be_const_closure(zb_coord_dispatch_closure) }, - { be_const_key_weak(add_handler, 2), be_const_closure(zb_coord_add_handler_closure) }, - { be_const_key_weak(_handlers, -1), be_const_var(0) }, - { be_const_key_weak(init, 0), be_const_closure(zb_coord_init_closure) }, + { be_const_key_weak(init, -1), be_const_closure(zb_coord_init_closure) }, + { be_const_key_weak(remove_handler, 2), be_const_closure(zb_coord_remove_handler_closure) }, + { be_const_key_weak(add_handler, -1), be_const_closure(zb_coord_add_handler_closure) }, + { be_const_key_weak(dispatch, -1), be_const_closure(zb_coord_dispatch_closure) }, + { be_const_key_weak(_handlers, 1), be_const_var(0) }, })), be_str_weak(zb_coord) ); diff --git a/tasmota/tasmota_xdrv_driver/xdrv_52_3_berry_zigbee.ino b/tasmota/tasmota_xdrv_driver/xdrv_52_3_berry_zigbee.ino index 7e93e3751..1fca11afe 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_52_3_berry_zigbee.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_52_3_berry_zigbee.ino @@ -255,22 +255,23 @@ extern "C" { extern const be_ctypes_structure_t be_zigbee_zcl_attribute_struct = { sizeof(Z_attribute), /* size in bytes */ - 10, /* number of elements */ + 11, /* number of elements */ nullptr, - (const be_ctypes_structure_item_t[10]) { + (const be_ctypes_structure_item_t[11]) { { "_attr_id", offsetof(Z_attribute, attr_id), 0, 0, ctypes_u16, 0 }, { "_cluster", offsetof(Z_attribute, cluster), 0, 0, ctypes_u16, 0 }, { "_cmd", offsetof(Z_attribute, attr_id), 0, 0, ctypes_u8, 0 }, // low 8 bits of attr_id { "_cmd_general", offsetof(Z_attribute, attr_id) + 1, 1, 1, ctypes_u8, 0 }, // bit #1 of byte+1 { "_direction", offsetof(Z_attribute, attr_id) + 1, 0, 1, ctypes_u8, 0 }, // bit #0 of byte+1 { "_iscmd", offsetof(Z_attribute, key_is_cmd), 0, 0, ctypes_u8, 0 }, - { "attr_multiplier", offsetof(Z_attribute, attr_multiplier), 0, 0, ctypes_i8, 0 }, - { "attr_divider", offsetof(Z_attribute, attr_divider), 0, 0, ctypes_i8, 0 }, - { "attr_type", offsetof(Z_attribute, attr_type), 0, 0, ctypes_u8, 0 }, + { "attr_multiplier", offsetof(Z_attribute, attr_multiplier), 0, 0, ctypes_u32, 0 }, + { "attr_divider", offsetof(Z_attribute, attr_divider), 0, 0, ctypes_u32, 0 }, + { "attr_type", offsetof(Z_attribute, attr_type), 0, 0, ctypes_i32, 0 }, // { "key", offsetof(Z_attribute, key), 0, 0, ctypes_ptr32, 0 }, // { "key_is_pmem", offsetof(Z_attribute, key_is_pmem), 0, 0, ctypes_u8, 0 }, // { "key_is_str", offsetof(Z_attribute, key_is_str), 0, 0, ctypes_u8, 0 }, { "key_suffix", offsetof(Z_attribute, key_suffix), 0, 0, ctypes_u8, 0 }, + { "manuf", offsetof(Z_attribute, manuf), 0, 0, ctypes_u16, 0 }, // { "type", offsetof(Z_attribute, type), 0, 0, ctypes_u8, 0 }, // { "val_float", offsetof(Z_attribute, val), 0, 0, ctypes_float, 0 }, // { "val_i32", offsetof(Z_attribute, val), 0, 0, ctypes_i32, 0 }, From 596482284cab41ae04800cf0f548347619c6ed6a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ludovic=20BOU=C3=89?= Date: Mon, 29 May 2023 23:12:55 +0200 Subject: [PATCH 208/289] Update CHANGELOG.md (#18748) Replace Border Router by bridge --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ce9e73f27..5fd13836b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,7 +8,7 @@ All notable changes to this project will be documented in this file. - Command ``WifiPower 0`` to enable dynamic wifi power based on RSSI by @TD-er (#15443) - Command ``WifiPower 1`` to restore default wifi power - HASPmota `meta` attribute and improved `berry_run` -- Matter Border Router for ESP8266 (experimental) +- Matter bridge for ESP8266 remote endpoints (experimental) - Display descriptor for ST7735 128x160 display - Matter support for Occupancy via Switch (experimental) From 87547657ec1ec5d298ad95fb6c7cdbda59a120f9 Mon Sep 17 00:00:00 2001 From: s-hadinger <49731213+s-hadinger@users.noreply.github.com> Date: Tue, 30 May 2023 22:25:59 +0200 Subject: [PATCH 209/289] Matter add 0300/400A for CT (#18757) --- .../embedded/Matter_Plugin_Bridge_Light2.be | 4 +- .../embedded/Matter_Plugin_Bridge_Light3.be | 4 +- .../solidified_Matter_Plugin_Bridge_Light2.h | 50 +++++++++++-------- .../solidified_Matter_Plugin_Bridge_Light3.h | 8 +-- 4 files changed, 39 insertions(+), 27 deletions(-) diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Light2.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Light2.be index b1ca99831..2a76b8136 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Light2.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Light2.be @@ -36,7 +36,7 @@ class Matter_Plugin_Bridge_Light2 : Matter_Plugin_Bridge_Light1 # 0x0005: inherited # Scenes 1.4 p.30 - no writable # 0x0006: inherited # On/Off 1.5 p.48 # 0x0008: inherited # Level Control 1.6 p.57 - 0x0300: [7,8,0xF,0x400B,0x400C,0xFFFC,0xFFFD], # Color Control 3.2 p.111 + 0x0300: [7,8,0xF,0x400A,0x400B,0x400C,0xFFFC,0xFFFD], # Color Control 3.2 p.111 } static var TYPES = { 0x010C: 2, 0x0013: 1 } # Dimmable Light @@ -117,6 +117,8 @@ class Matter_Plugin_Bridge_Light2 : Matter_Plugin_Bridge_Light1 elif attribute == 0x400C # ---------- ColorTempPhysicalMaxMireds / u2 ---------- return TLV.create_TLV(TLV.U1, self.ct_max) + elif attribute == 0x400A # ---------- ColorCapabilities / map32 ---------- + return TLV.create_TLV(TLV.U4, 0x10) # CT elif attribute == 0xFFFC # ---------- FeatureMap / map32 ---------- return TLV.create_TLV(TLV.U4, 0x10) # CT elif attribute == 0xFFFD # ---------- ClusterRevision / u2 ---------- diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Light3.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Light3.be index 5a687b88a..fd18ef739 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Light3.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Light3.be @@ -122,13 +122,13 @@ class Matter_Plugin_Bridge_Light3 : Matter_Plugin_Bridge_Light1 return TLV.create_TLV(TLV.U1, 0) elif attribute == 0x4001 # ---------- EnhancedColorMode / u1 ---------- return TLV.create_TLV(TLV.U1, 0) - elif attribute == 0x400A # ---------- ColorCapabilities / map2 ---------- - return TLV.create_TLV(TLV.U1, 0) # Defined Primaries Information Attribute Set elif attribute == 0x0010 # ---------- NumberOfPrimaries / u1 ---------- return TLV.create_TLV(TLV.U1, 0) + elif attribute == 0x400A # ---------- ColorCapabilities / map32 ---------- + return TLV.create_TLV(TLV.U4, 0x01) elif attribute == 0xFFFC # ---------- FeatureMap / map32 ---------- return TLV.create_TLV(TLV.U4, 0x01) # HS elif attribute == 0xFFFD # ---------- ClusterRevision / u2 ---------- diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Light2.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Light2.h index b6a09c24e..637895aae 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Light2.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Light2.h @@ -425,7 +425,7 @@ be_local_closure(Matter_Plugin_Bridge_Light2_read_attribute, /* name */ }), be_str_weak(read_attribute), &be_const_str_solidified, - ( &(const binstruction[92]) { /* code */ + ( &(const binstruction[101]) { /* code */ 0xA40E0000, // 0000 IMPORT R3 K0 0xB8120200, // 0001 GETNGBL R4 K1 0x88100902, // 0002 GETMBR R4 R4 K2 @@ -433,7 +433,7 @@ be_local_closure(Matter_Plugin_Bridge_Light2_read_attribute, /* name */ 0x88180504, // 0004 GETMBR R6 R2 K4 0x541E02FF, // 0005 LDINT R7 768 0x1C1C0A07, // 0006 EQ R7 R5 R7 - 0x781E004A, // 0007 JMPF R7 #0053 + 0x781E0053, // 0007 JMPF R7 #005C 0x8C1C0105, // 0008 GETMET R7 R0 K5 0x7C1C0200, // 0009 CALL R7 1 0x541E0006, // 000A LDINT R7 7 @@ -454,7 +454,7 @@ be_local_closure(Matter_Plugin_Bridge_Light2_read_attribute, /* name */ 0x4C280000, // 0019 LDNIL R10 0x7C1C0600, // 001A CALL R7 3 0x80040E00, // 001B RET 1 R7 - 0x70020034, // 001C JMP #0052 + 0x7002003D, // 001C JMP #005B 0x541E0007, // 001D LDINT R7 8 0x1C1C0C07, // 001E EQ R7 R6 R7 0x781E0005, // 001F JMPF R7 #0026 @@ -463,7 +463,7 @@ be_local_closure(Matter_Plugin_Bridge_Light2_read_attribute, /* name */ 0x5828000A, // 0022 LDCONST R10 K10 0x7C1C0600, // 0023 CALL R7 3 0x80040E00, // 0024 RET 1 R7 - 0x7002002B, // 0025 JMP #0052 + 0x70020034, // 0025 JMP #005B 0x541E000E, // 0026 LDINT R7 15 0x1C1C0C07, // 0027 EQ R7 R6 R7 0x781E0005, // 0028 JMPF R7 #002F @@ -472,7 +472,7 @@ be_local_closure(Matter_Plugin_Bridge_Light2_read_attribute, /* name */ 0x5828000B, // 002B LDCONST R10 K11 0x7C1C0600, // 002C CALL R7 3 0x80040E00, // 002D RET 1 R7 - 0x70020022, // 002E JMP #0052 + 0x7002002B, // 002E JMP #005B 0x541E400A, // 002F LDINT R7 16395 0x1C1C0C07, // 0030 EQ R7 R6 R7 0x781E0005, // 0031 JMPF R7 #0038 @@ -481,7 +481,7 @@ be_local_closure(Matter_Plugin_Bridge_Light2_read_attribute, /* name */ 0x8828010C, // 0034 GETMBR R10 R0 K12 0x7C1C0600, // 0035 CALL R7 3 0x80040E00, // 0036 RET 1 R7 - 0x70020019, // 0037 JMP #0052 + 0x70020022, // 0037 JMP #005B 0x541E400B, // 0038 LDINT R7 16396 0x1C1C0C07, // 0039 EQ R7 R6 R7 0x781E0005, // 003A JMPF R7 #0041 @@ -490,8 +490,8 @@ be_local_closure(Matter_Plugin_Bridge_Light2_read_attribute, /* name */ 0x8828010D, // 003D GETMBR R10 R0 K13 0x7C1C0600, // 003E CALL R7 3 0x80040E00, // 003F RET 1 R7 - 0x70020010, // 0040 JMP #0052 - 0x541EFFFB, // 0041 LDINT R7 65532 + 0x70020019, // 0040 JMP #005B + 0x541E4009, // 0041 LDINT R7 16394 0x1C1C0C07, // 0042 EQ R7 R6 R7 0x781E0005, // 0043 JMPF R7 #004A 0x8C1C0907, // 0044 GETMET R7 R4 K7 @@ -499,25 +499,34 @@ be_local_closure(Matter_Plugin_Bridge_Light2_read_attribute, /* name */ 0x542A000F, // 0046 LDINT R10 16 0x7C1C0600, // 0047 CALL R7 3 0x80040E00, // 0048 RET 1 R7 - 0x70020007, // 0049 JMP #0052 - 0x541EFFFC, // 004A LDINT R7 65533 + 0x70020010, // 0049 JMP #005B + 0x541EFFFB, // 004A LDINT R7 65532 0x1C1C0C07, // 004B EQ R7 R6 R7 - 0x781E0004, // 004C JMPF R7 #0052 + 0x781E0005, // 004C JMPF R7 #0053 0x8C1C0907, // 004D GETMET R7 R4 K7 0x8824090E, // 004E GETMBR R9 R4 K14 - 0x542A0004, // 004F LDINT R10 5 + 0x542A000F, // 004F LDINT R10 16 0x7C1C0600, // 0050 CALL R7 3 0x80040E00, // 0051 RET 1 R7 0x70020007, // 0052 JMP #005B - 0x601C0003, // 0053 GETGBL R7 G3 - 0x5C200000, // 0054 MOVE R8 R0 - 0x7C1C0200, // 0055 CALL R7 1 - 0x8C1C0F0F, // 0056 GETMET R7 R7 K15 - 0x5C240200, // 0057 MOVE R9 R1 - 0x5C280400, // 0058 MOVE R10 R2 + 0x541EFFFC, // 0053 LDINT R7 65533 + 0x1C1C0C07, // 0054 EQ R7 R6 R7 + 0x781E0004, // 0055 JMPF R7 #005B + 0x8C1C0907, // 0056 GETMET R7 R4 K7 + 0x8824090E, // 0057 GETMBR R9 R4 K14 + 0x542A0004, // 0058 LDINT R10 5 0x7C1C0600, // 0059 CALL R7 3 0x80040E00, // 005A RET 1 R7 - 0x80000000, // 005B RET 0 + 0x70020007, // 005B JMP #0064 + 0x601C0003, // 005C GETGBL R7 G3 + 0x5C200000, // 005D MOVE R8 R0 + 0x7C1C0200, // 005E CALL R7 1 + 0x8C1C0F0F, // 005F GETMET R7 R7 K15 + 0x5C240200, // 0060 MOVE R9 R1 + 0x5C280400, // 0061 MOVE R10 R2 + 0x7C1C0600, // 0062 CALL R7 3 + 0x80040E00, // 0063 RET 1 R7 + 0x80000000, // 0064 RET 0 }) ) ); @@ -541,11 +550,12 @@ be_local_class(Matter_Plugin_Bridge_Light2, be_const_map( * be_nested_map(1, ( (struct bmapnode*) &(const bmapnode[]) { { be_const_key_int(768, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_list, { - be_const_list( * be_nested_list(7, + be_const_list( * be_nested_list(8, ( (struct bvalue*) &(const bvalue[]) { be_const_int(7), be_const_int(8), be_const_int(15), + be_const_int(16394), be_const_int(16395), be_const_int(16396), be_const_int(65532), diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Light3.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Light3.h index d9af0894e..ddbedf913 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Light3.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Light3.h @@ -561,7 +561,7 @@ be_local_closure(Matter_Plugin_Bridge_Light3_read_attribute, /* name */ 0x7C1C0600, // 004F CALL R7 3 0x80040E00, // 0050 RET 1 R7 0x70020022, // 0051 JMP #0075 - 0x541E4009, // 0052 LDINT R7 16394 + 0x541E000F, // 0052 LDINT R7 16 0x1C1C0C07, // 0053 EQ R7 R6 R7 0x781E0005, // 0054 JMPF R7 #005B 0x8C1C0908, // 0055 GETMET R7 R4 K8 @@ -570,12 +570,12 @@ be_local_closure(Matter_Plugin_Bridge_Light3_read_attribute, /* name */ 0x7C1C0600, // 0058 CALL R7 3 0x80040E00, // 0059 RET 1 R7 0x70020019, // 005A JMP #0075 - 0x541E000F, // 005B LDINT R7 16 + 0x541E4009, // 005B LDINT R7 16394 0x1C1C0C07, // 005C EQ R7 R6 R7 0x781E0005, // 005D JMPF R7 #0064 0x8C1C0908, // 005E GETMET R7 R4 K8 - 0x88240909, // 005F GETMBR R9 R4 K9 - 0x58280006, // 0060 LDCONST R10 K6 + 0x8824090D, // 005F GETMBR R9 R4 K13 + 0x5828000B, // 0060 LDCONST R10 K11 0x7C1C0600, // 0061 CALL R7 3 0x80040E00, // 0062 RET 1 R7 0x70020010, // 0063 JMP #0075 From 10821b7e2487f9f543c11ae15b9252525ebf7a2b Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Wed, 31 May 2023 21:54:59 +0200 Subject: [PATCH 210/289] fix factory file not removed (#18761) --- pio-tools/name-firmware.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/pio-tools/name-firmware.py b/pio-tools/name-firmware.py index 0d853d035..e2d38f6fd 100644 --- a/pio-tools/name-firmware.py +++ b/pio-tools/name-firmware.py @@ -13,6 +13,7 @@ def bin_map_copy(source, target, env): # get locations and file names based on variant map_file = tasmotapiolib.get_final_map_path(env) bin_file = tasmotapiolib.get_final_bin_path(env) + one_bin_file = bin_file if env["PIOPLATFORM"] == "espressif32": factory_tmp = pathlib.Path(firsttarget).with_suffix("") @@ -21,7 +22,7 @@ def bin_map_copy(source, target, env): one_bin_file = one_bin_tmp.with_suffix(one_bin_tmp.suffix + ".factory.bin") # check if new target files exist and remove if necessary - for f in [map_file, bin_file]: + for f in [map_file, bin_file, one_bin_file]: if f.is_file(): f.unlink() From 74f9973b8b703731a50f56b72f2636edf0f68bfa Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Wed, 31 May 2023 22:41:35 +0200 Subject: [PATCH 211/289] Core 2.0.9 from 2023.05.31 (#18762) --- platformio_tasmota32.ini | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platformio_tasmota32.ini b/platformio_tasmota32.ini index 5cad9e835..b6da613ee 100644 --- a/platformio_tasmota32.ini +++ b/platformio_tasmota32.ini @@ -42,7 +42,7 @@ extra_scripts = pre:pio-tools/add_c_flags.py ${esp_defaults.extra_scripts} [core32] -platform = https://github.com/tasmota/platform-espressif32/releases/download/2023.05.02/platform-espressif32.zip +platform = https://github.com/tasmota/platform-espressif32/releases/download/2023.05.03/platform-espressif32.zip platform_packages = build_unflags = ${esp32_defaults.build_unflags} build_flags = ${esp32_defaults.build_flags} From b9d855ef79e8634d66f513dfc2892ddeea296f34 Mon Sep 17 00:00:00 2001 From: s-hadinger <49731213+s-hadinger@users.noreply.github.com> Date: Thu, 1 Jun 2023 10:02:23 +0200 Subject: [PATCH 212/289] Berry RS256 crypto algorithm (RSASSA-MCKS1_v1-5 with SHA256) used for JWT (#18763) --- CHANGELOG.md | 1 + lib/lib_ssl/bearssl-esp8266/src/t_inner.h | 6 ++- .../berry_tasmota/src/be_crypto_lib.c | 11 ++++ .../xdrv_52_3_berry_crypto.ino | 50 +++++++++++++++++++ 4 files changed, 67 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5fd13836b..2dbaa1d90 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,7 @@ All notable changes to this project will be documented in this file. - Matter bridge for ESP8266 remote endpoints (experimental) - Display descriptor for ST7735 128x160 display - Matter support for Occupancy via Switch (experimental) +- Berry RS256 crypto algorithm (RSASSA-MCKS1_v1-5 with SHA256) used for JWT ### Breaking Changed - Matter relay number starts at 1 instead of 0 to match Tasmota numbering diff --git a/lib/lib_ssl/bearssl-esp8266/src/t_inner.h b/lib/lib_ssl/bearssl-esp8266/src/t_inner.h index 924486db7..d5fecd71b 100644 --- a/lib/lib_ssl/bearssl-esp8266/src/t_inner.h +++ b/lib/lib_ssl/bearssl-esp8266/src/t_inner.h @@ -2597,7 +2597,11 @@ br_cpuid(uint32_t mask_eax, uint32_t mask_ebx, #endif #define _debugBearSSL (0) - extern void optimistic_yield(uint32_t); + #ifdef ESP8266 + extern void optimistic_yield(uint32_t); + #else + #define optimistic_yield(ignored) + #endif #ifdef __cplusplus } #endif diff --git a/lib/libesp32/berry_tasmota/src/be_crypto_lib.c b/lib/libesp32/berry_tasmota/src/be_crypto_lib.c index 621d17113..0162bc369 100644 --- a/lib/libesp32/berry_tasmota/src/be_crypto_lib.c +++ b/lib/libesp32/berry_tasmota/src/be_crypto_lib.c @@ -11,6 +11,8 @@ extern int be_class_crypto_member(bvm *vm); extern int m_crypto_random(bvm *vm); +extern int m_rsa_rsassa_pkcs1_v1_5(bvm *vm); + extern int m_aes_ccm_init(bvm *vm); extern int m_aes_ccm_encryt(bvm *vm); extern int m_aes_ccm_decryt(bvm *vm); @@ -56,6 +58,7 @@ extern const bclass be_class_md5; #include "solidify/solidified_crypto_pbkdf2_hmac_sha256.h" #include "solidify/solidified_crypto_spake2p_matter.h" +#include "be_fixed_be_class_rsa.h" #include "be_fixed_be_class_aes_ccm.h" #include "be_fixed_be_class_aes_gcm.h" #include "be_fixed_be_class_aes_ctr.h" @@ -104,6 +107,10 @@ const be_const_member_t be_crypto_members[] = { { "/PBKDF2_HMAC_SHA256", (intptr_t) &be_class_pbkdf2_hmac_sha256 }, #endif // USE_BERRY_CRYPTO_PBKDF2_HMAC_SHA256 +#ifdef USE_BERRY_CRYPTO_RSA + { "/RSA", (intptr_t) &be_class_rsa }, +#endif // USE_BERRY_CRYPTO_PBKDF2_HMAC_SHA256 + #ifdef USE_BERRY_CRYPTO_SHA256 { "/SHA256", (intptr_t) &be_class_sha256 }, #endif // USE_BERRY_CRYPTO_SHA256 @@ -118,6 +125,10 @@ const size_t be_crypto_members_size = sizeof(be_crypto_members)/sizeof(be_crypto /* @const_object_info_begin +class be_class_rsa (scope: global, name: RSA) { + rs256, static_func(m_rsa_rsassa_pkcs1_v1_5) +} + class be_class_aes_ccm (scope: global, name: AES_CCM) { .p1, var .p2, var diff --git a/tasmota/tasmota_xdrv_driver/xdrv_52_3_berry_crypto.ino b/tasmota/tasmota_xdrv_driver/xdrv_52_3_berry_crypto.ino index bec624546..d422f09d8 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_52_3_berry_crypto.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_52_3_berry_crypto.ino @@ -65,6 +65,56 @@ extern "C" { } } +/*********************************************************************************************\ + * RSA class + * +\*********************************************************************************************/ +extern "C" { + // crypto.RSA.rsassa_pkcs1_v1_5(private_key:bytes(), msg:bytes()) -> bytes() + // Parses RSA private key from DER binary + int32_t m_rsa_rsassa_pkcs1_v1_5(bvm *vm); + int32_t m_rsa_rsassa_pkcs1_v1_5(bvm *vm) { + int32_t argc = be_top(vm); // Get the number of arguments + if (argc >= 2 && be_isbytes(vm, 1)) { + size_t sk_len = 0; + uint8_t * sk_der = (uint8_t*) be_tobytes(vm, 1, &sk_len); + + // 1. decode the DER private key + br_skey_decoder_context sdc; + br_skey_decoder_init(&sdc); + br_skey_decoder_push(&sdc, sk_der, sk_len); + if (int ret = br_skey_decoder_last_error(&sdc)) { + be_raisef(vm, "value_error", "invalid private key %i", ret); + } + if (br_skey_decoder_key_type(&sdc) != BR_KEYTYPE_RSA) { + be_raise(vm, "value_error", "key is not RSA"); + } + const br_rsa_private_key *sk = br_skey_decoder_get_rsa(&sdc); + + // 2. Hash the message with SHA + size_t msg_len = 0; + uint8_t * msg = (uint8_t*) be_tobytes(vm, 2, &msg_len); + uint8_t hash[32]; + br_sha256_context ctx; + br_sha256_init(&ctx); + br_sha256_update(&ctx, msg, msg_len); + br_sha256_out(&ctx, hash); + + // 3. sign the message + size_t sign_len = (sk->n_bitlen + 7) / 8; + uint8_t x[sign_len] = {}; + int err = br_rsa_i15_pkcs1_sign(BR_HASH_OID_SHA256, hash, sizeof(hash), sk, x); + if (err != 1) { + be_raisef(vm, "value_error", "signature failed %i", err); + } + + be_pushbytes(vm, x, sign_len); + be_return(vm); + } + be_raise(vm, kTypeError, nullptr); + } +} + /*********************************************************************************************\ * AES_GCM class * From 9d57a19be3b2d48acb2885dd8435cd0bc204b029 Mon Sep 17 00:00:00 2001 From: jonschz <17198703+jonschz@users.noreply.github.com> Date: Thu, 1 Jun 2023 22:12:57 +0200 Subject: [PATCH 213/289] Fix interaction of `SO92`, `VirtualCT`, and `RGBWWTable` (#18768) * remove unused variable * Relocate SO92 implementation This way, SO92 does not ignore SO106 * Relocate RGBWWTable implementation This fixes a bug related to RGBWWTable and SO92. Also, the code is tidier this way * Cleanup: Reduce code duplication * more consistent behaviour for SO92 and free_cw --------- Co-authored-by: jonschz --- tasmota/tasmota_xdrv_driver/xdrv_04_light.ino | 54 +++++++++---------- 1 file changed, 25 insertions(+), 29 deletions(-) diff --git a/tasmota/tasmota_xdrv_driver/xdrv_04_light.ino b/tasmota/tasmota_xdrv_driver/xdrv_04_light.ino index f79e7da82..f5e48f174 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_04_light.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_04_light.ino @@ -1911,21 +1911,14 @@ void LightAnimate(void) cur_col_10[i] = change8to10(Light.new_color[i]); } - bool rgbwwtable_applied_white = false; // did we already applied RGBWWTable to white channels (ex: in white_blend_mode or virtual_ct) if (Light.pwm_multi_channels) { calcGammaMultiChannels(cur_col_10); } else { // AddLog(LOG_LEVEL_INFO, PSTR(">>> calcGammaBulbs In %03X,%03X,%03X,%03X,%03X"), cur_col_10[0], cur_col_10[1], cur_col_10[2], cur_col_10[3], cur_col_10[4]); - rgbwwtable_applied_white = calcGammaBulbs(cur_col_10); // true means that one PWM channel is used for CT + calcGammaBulbs(cur_col_10); // AddLog(LOG_LEVEL_INFO, PSTR(">>> calcGammaBulbs Out %03X,%03X,%03X,%03X,%03X"), cur_col_10[0], cur_col_10[1], cur_col_10[2], cur_col_10[3], cur_col_10[4]); } - // Apply RGBWWTable only if not Settings->flag4.white_blend_mode - for (uint32_t i = 0; i < (rgbwwtable_applied_white ? 3 : Light.subtype); i++) { - uint32_t adjust = change8to10(Settings->rgbwwTable[i]); - cur_col_10[i] = changeUIntScale(cur_col_10[i], 0, 1023, 0, adjust); - } - // final adjusments for PMW ranges, post-gamma correction for (uint32_t i = 0; i < LST_MAX; i++) { // scale from 0..1023 to 0..pwm_range, but keep any non-zero value to at least 1 @@ -2320,9 +2313,8 @@ void calcGammaBulb5Channels_8(uint8_t in8[LST_MAX], uint16_t col10[LST_MAX]) { calcGammaBulb5Channels(col10, nullptr, nullptr); } -bool calcGammaBulbs(uint16_t cur_col_10[5]) { +void calcGammaBulbs(uint16_t cur_col_10[5]) { bool rgbwwtable_applied_white = false; - bool pwm_ct = false; bool white_free_cw = false; // true if White channels are uncorrelated. Happens when CW+WW>255, i.e. manually setting white channels to exceed to total power of a single channel (may harm the power supply) // Various values needed for accurate White calculation // CT value streteched to 0..1023 (from within CT range, so not necessarily from 153 to 500). 0=Cold, 1023=Warm @@ -2340,24 +2332,7 @@ bool calcGammaBulbs(uint16_t cur_col_10[5]) { calcGammaBulbCW(cur_col_10, &white_bri10, &white_free_cw); } - // Now we know ct_10 and white_bri10 (gamma corrected if needed) - - if ((LST_COLDWARM == Light.subtype) || (LST_RGBCW == Light.subtype)) { -#ifdef ESP8266 - if ((PHILIPS == TasmotaGlobal.module_type) || (Settings->flag4.pwm_ct_mode)) { // channel 1 is the color tone, mapped to cold channel (0..255) -#else - if (Settings->flag4.pwm_ct_mode) { // channel 1 is the color tone, mapped to cold channel (0..255) -#endif // ESP8266 - pwm_ct = true; - // Xiaomi Philips bulbs follow a different scheme: - // channel 0=intensity, channel1=temperature - cur_col_10[cw0] = white_bri10; - cur_col_10[cw0+1] = ct_10; - return false; // avoid any interference - } - } - - // Now see if we need to mix RGB and White + // Now see if we need to mix RGB and White // Valid only for LST_RGBW, LST_RGBCW, SetOption105 1, and white is zero (see doc) if ((LST_RGBW <= Light.subtype) && (Settings->flag4.white_blend_mode) && (0 == cur_col_10[3]+cur_col_10[4])) { uint32_t min_rgb_10 = min3(cur_col_10[0], cur_col_10[1], cur_col_10[2]); @@ -2421,7 +2396,28 @@ bool calcGammaBulbs(uint16_t cur_col_10[5]) { cur_col_10[cw0] = white_bri10 - cur_col_10[cw0+1]; } } - return rgbwwtable_applied_white; + + // Apply RGBWWTable (RGB: always, CW: only if white_blend_mode is not engaged) + for (uint32_t i = 0; i < (rgbwwtable_applied_white ? 3 : Light.subtype); i++) { + uint32_t adjust = change8to10(Settings->rgbwwTable[i]); + cur_col_10[i] = changeUIntScale(cur_col_10[i], 0, 1023, 0, adjust); + } + + // Implement SO92: Some lights like Xiaomi Philips bulbs follow the scheme + // cw0=intensity, cw0+1=temperature + if (ChannelCT() >= 0) { + // Need to compute white_bri10 and ct_10 from cur_col_10[] for compatibility with VirtualCT + white_bri10 = cur_col_10[cw0] + cur_col_10[cw0+1]; + ct_10 = changeUIntScale(cur_col_10[cw0+1], 0, white_bri10, 0, 1023); + if (white_bri10 > 1023) { + // In white_free_cw mode, the combined brightness of cw and ww may be larger than 1023. + // This cannot be represented in pwm_ct_mode, so we set the maximum brightness instead. + white_bri10 = 1023; + } + + cur_col_10[cw0] = white_bri10; + cur_col_10[cw0+1] = ct_10; + } } #ifdef USE_DEVICE_GROUPS From 55b109de68f25206c3d56bba54ce9cd76eea7d9f Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Thu, 1 Jun 2023 23:35:14 +0200 Subject: [PATCH 214/289] esptool v4.6.1 (#18771) --- platformio_tasmota32.ini | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platformio_tasmota32.ini b/platformio_tasmota32.ini index b6da613ee..b628b94ad 100644 --- a/platformio_tasmota32.ini +++ b/platformio_tasmota32.ini @@ -42,7 +42,7 @@ extra_scripts = pre:pio-tools/add_c_flags.py ${esp_defaults.extra_scripts} [core32] -platform = https://github.com/tasmota/platform-espressif32/releases/download/2023.05.03/platform-espressif32.zip +platform = https://github.com/tasmota/platform-espressif32/releases/download/2023.06.01/platform-espressif32.zip platform_packages = build_unflags = ${esp32_defaults.build_unflags} build_flags = ${esp32_defaults.build_flags} From 541da60ca665aff0ed6bd446f41d8aa9517666e1 Mon Sep 17 00:00:00 2001 From: s-hadinger <49731213+s-hadinger@users.noreply.github.com> Date: Fri, 2 Jun 2023 09:38:43 +0200 Subject: [PATCH 215/289] Fix Matter Berry solidification (#18773) --- lib/libesp32/berry_matter/src/embedded/Matter_Device.be | 2 ++ lib/libesp32/berry_matter/src/embedded/Matter_HTTP_async.be | 2 ++ lib/libesp32/berry_matter/src/embedded/Matter_HTTP_remote.be | 2 ++ lib/libesp32/berry_matter/src/embedded/Matter_Plugin.be | 2 ++ .../berry_matter/src/embedded/Matter_Plugin_Bridge_HTTP.be | 2 ++ .../berry_matter/src/embedded/Matter_Plugin_Bridge_Light0.be | 2 ++ .../berry_matter/src/embedded/Matter_Plugin_Bridge_Light1.be | 2 ++ .../berry_matter/src/embedded/Matter_Plugin_Bridge_Light2.be | 2 ++ .../berry_matter/src/embedded/Matter_Plugin_Bridge_Light3.be | 2 ++ .../berry_matter/src/embedded/Matter_Plugin_Bridge_OnOff.be | 2 ++ .../berry_matter/src/embedded/Matter_Plugin_Bridge_Sensor.be | 2 ++ .../src/embedded/Matter_Plugin_Bridge_Sensor_Humidity.be | 2 ++ .../src/embedded/Matter_Plugin_Bridge_Sensor_Illuminance.be | 2 ++ .../src/embedded/Matter_Plugin_Bridge_Sensor_Occupancy.be | 2 ++ .../src/embedded/Matter_Plugin_Bridge_Sensor_Pressure.be | 2 ++ .../src/embedded/Matter_Plugin_Bridge_Sensor_Temp.be | 2 ++ lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Device.be | 2 ++ lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Light0.be | 2 ++ lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Light1.be | 2 ++ lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Light2.be | 2 ++ lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Light3.be | 2 ++ lib/libesp32/berry_matter/src/embedded/Matter_Plugin_OnOff.be | 2 ++ lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Root.be | 2 ++ lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor.be | 2 ++ .../berry_matter/src/embedded/Matter_Plugin_Sensor_Humidity.be | 2 ++ .../src/embedded/Matter_Plugin_Sensor_Illuminance.be | 2 ++ .../berry_matter/src/embedded/Matter_Plugin_Sensor_Occupancy.be | 2 ++ .../berry_matter/src/embedded/Matter_Plugin_Sensor_Pressure.be | 2 ++ .../berry_matter/src/embedded/Matter_Plugin_Sensor_Temp.be | 2 ++ lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Shutter.be | 2 ++ .../berry_matter/src/embedded/Matter_Plugin_ShutterTilt.be | 2 ++ lib/libesp32/berry_matter/src/embedded/Matter_TCP_async.be | 2 ++ 32 files changed, 64 insertions(+) diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Device.be b/lib/libesp32/berry_matter/src/embedded/Matter_Device.be index 489dd33b2..4db220670 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Device.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Device.be @@ -17,6 +17,8 @@ # along with this program. If not, see . # +import matter + #@ solidify:Matter_Device,weak class Matter_Device diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_HTTP_async.be b/lib/libesp32/berry_matter/src/embedded/Matter_HTTP_async.be index df3989169..b768100cc 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_HTTP_async.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_HTTP_async.be @@ -17,6 +17,8 @@ # along with this program. If not, see . # +import matter + #@ solidify:Matter_HTTP_async,weak # dummy declaration for solidification diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_HTTP_remote.be b/lib/libesp32/berry_matter/src/embedded/Matter_HTTP_remote.be index a0a86367f..05b16d9b7 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_HTTP_remote.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_HTTP_remote.be @@ -17,6 +17,8 @@ # along with this program. If not, see . # +import matter + #@ solidify:Matter_HTTP_remote,weak # dummy declaration for solidification diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin.be index 6d4cd1041..03e8d8734 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin.be @@ -17,6 +17,8 @@ # along with this program. If not, see . # +import matter + # Matter modules for extensibility # template but not actually used diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_HTTP.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_HTTP.be index 2ab00695b..3918882ad 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_HTTP.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_HTTP.be @@ -17,6 +17,8 @@ # along with this program. If not, see . # +import matter + # Matter plug-in for core behavior # dummy declaration for solidification diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Light0.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Light0.be index b35184d51..7c1802264 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Light0.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Light0.be @@ -17,6 +17,8 @@ # along with this program. If not, see . # +import matter + # Matter plug-in for core behavior # dummy declaration for solidification diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Light1.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Light1.be index 788a278f0..bd51c6e0e 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Light1.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Light1.be @@ -17,6 +17,8 @@ # along with this program. If not, see . # +import matter + # Matter plug-in for core behavior # dummy declaration for solidification diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Light2.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Light2.be index 2a76b8136..39abe4beb 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Light2.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Light2.be @@ -17,6 +17,8 @@ # along with this program. If not, see . # +import matter + # Matter plug-in for core behavior # dummy declaration for solidification diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Light3.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Light3.be index fd18ef739..8bfdc19e4 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Light3.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Light3.be @@ -17,6 +17,8 @@ # along with this program. If not, see . # +import matter + # Matter plug-in for core behavior # dummy declaration for solidification diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_OnOff.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_OnOff.be index 465454329..96ca06eec 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_OnOff.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_OnOff.be @@ -17,6 +17,8 @@ # along with this program. If not, see . # +import matter + # Matter plug-in for core behavior # dummy declaration for solidification diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Sensor.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Sensor.be index 677f54a5a..a220a7370 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Sensor.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Sensor.be @@ -17,6 +17,8 @@ # along with this program. If not, see . # +import matter + # Matter plug-in for core behavior # dummy declaration for solidification diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Sensor_Humidity.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Sensor_Humidity.be index cabcec6ac..5c10a5283 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Sensor_Humidity.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Sensor_Humidity.be @@ -17,6 +17,8 @@ # along with this program. If not, see . # +import matter + # Matter plug-in for core behavior # dummy declaration for solidification diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Sensor_Illuminance.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Sensor_Illuminance.be index 7d3851d41..ff92f6fcc 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Sensor_Illuminance.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Sensor_Illuminance.be @@ -17,6 +17,8 @@ # along with this program. If not, see . # +import matter + # Matter plug-in for core behavior # dummy declaration for solidification diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Sensor_Occupancy.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Sensor_Occupancy.be index b40bbf1c8..1c9fd8a00 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Sensor_Occupancy.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Sensor_Occupancy.be @@ -17,6 +17,8 @@ # along with this program. If not, see . # +import matter + # Matter plug-in for core behavior # dummy declaration for solidification diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Sensor_Pressure.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Sensor_Pressure.be index 795a08bcb..74aec0828 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Sensor_Pressure.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Sensor_Pressure.be @@ -17,6 +17,8 @@ # along with this program. If not, see . # +import matter + # Matter plug-in for core behavior # dummy declaration for solidification diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Sensor_Temp.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Sensor_Temp.be index bd1bd5e03..42aa90bc9 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Sensor_Temp.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Sensor_Temp.be @@ -17,6 +17,8 @@ # along with this program. If not, see . # +import matter + # Matter plug-in for core behavior # dummy declaration for solidification diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Device.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Device.be index 648d008f0..a69dce90d 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Device.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Device.be @@ -17,6 +17,8 @@ # along with this program. If not, see . # +import matter + # dummy declaration for solidification class Matter_Plugin end diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Light0.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Light0.be index b8b16bc36..2757cd8de 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Light0.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Light0.be @@ -17,6 +17,8 @@ # along with this program. If not, see . # +import matter + # Matter plug-in for core behavior # dummy declaration for solidification diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Light1.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Light1.be index f5d965fba..3da79d178 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Light1.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Light1.be @@ -17,6 +17,8 @@ # along with this program. If not, see . # +import matter + # Matter plug-in for core behavior # dummy declaration for solidification diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Light2.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Light2.be index ad321cc5d..67875f282 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Light2.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Light2.be @@ -17,6 +17,8 @@ # along with this program. If not, see . # +import matter + # Matter plug-in for core behavior # dummy declaration for solidification diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Light3.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Light3.be index da5f107da..acfa4b17f 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Light3.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Light3.be @@ -17,6 +17,8 @@ # along with this program. If not, see . # +import matter + # Matter plug-in for core behavior # dummy declaration for solidification diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_OnOff.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_OnOff.be index fb0b0f928..0dc55cbc7 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_OnOff.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_OnOff.be @@ -17,6 +17,8 @@ # along with this program. If not, see . # +import matter + # Matter plug-in for core behavior # dummy declaration for solidification diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Root.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Root.be index 9977d6b62..7d7c1b820 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Root.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Root.be @@ -17,6 +17,8 @@ # along with this program. If not, see . # +import matter + # Matter plug-in for root behavior # dummy declaration for solidification diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor.be index c3f595045..86ea86680 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor.be @@ -17,6 +17,8 @@ # along with this program. If not, see . # +import matter + # Matter plug-in for core behavior # dummy declaration for solidification diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor_Humidity.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor_Humidity.be index 1165b9e65..08ab4c419 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor_Humidity.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor_Humidity.be @@ -17,6 +17,8 @@ # along with this program. If not, see . # +import matter + # Matter plug-in for core behavior # dummy declaration for solidification diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor_Illuminance.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor_Illuminance.be index e75ee9b1a..0907b431b 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor_Illuminance.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor_Illuminance.be @@ -17,6 +17,8 @@ # along with this program. If not, see . # +import matter + # Matter plug-in for core behavior # dummy declaration for solidification diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor_Occupancy.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor_Occupancy.be index fb0c0d079..3dacc0925 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor_Occupancy.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor_Occupancy.be @@ -17,6 +17,8 @@ # along with this program. If not, see . # +import matter + # Matter plug-in for core behavior # dummy declaration for solidification diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor_Pressure.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor_Pressure.be index cf539219e..41f7f86c0 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor_Pressure.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor_Pressure.be @@ -17,6 +17,8 @@ # along with this program. If not, see . # +import matter + # Matter plug-in for core behavior # dummy declaration for solidification diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor_Temp.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor_Temp.be index 4d2d9f23b..9a42ac195 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor_Temp.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor_Temp.be @@ -17,6 +17,8 @@ # along with this program. If not, see . # +import matter + # Matter plug-in for core behavior # dummy declaration for solidification diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Shutter.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Shutter.be index c08289cab..da881d173 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Shutter.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Shutter.be @@ -17,6 +17,8 @@ # along with this program. If not, see . # +import matter + # Matter plug-in for core behavior # dummy declaration for solidification diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_ShutterTilt.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_ShutterTilt.be index 8c99aab51..a9902ffab 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_ShutterTilt.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_ShutterTilt.be @@ -17,6 +17,8 @@ # along with this program. If not, see . # +import matter + # Matter plug-in for core behavior # dummy declaration for solidification diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_TCP_async.be b/lib/libesp32/berry_matter/src/embedded/Matter_TCP_async.be index 72cd81ceb..e8d235886 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_TCP_async.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_TCP_async.be @@ -17,6 +17,8 @@ # along with this program. If not, see . # +import matter + #@ solidify:Matter_TCP_async,weak # Status: From 82895c53e3477d778ac9837735292a4c0867c979 Mon Sep 17 00:00:00 2001 From: s-hadinger <49731213+s-hadinger@users.noreply.github.com> Date: Fri, 2 Jun 2023 09:58:39 +0200 Subject: [PATCH 216/289] Berry add `set_lsb_justified(bool)` to `AudioOutputI2S` (#18774) --- CHANGELOG.md | 1 + lib/libesp32/berry_tasmota/src/be_i2s_audio_lib.cpp | 10 ++++++++++ 2 files changed, 11 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2dbaa1d90..ad76b48aa 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,7 @@ All notable changes to this project will be documented in this file. - Display descriptor for ST7735 128x160 display - Matter support for Occupancy via Switch (experimental) - Berry RS256 crypto algorithm (RSASSA-MCKS1_v1-5 with SHA256) used for JWT +- Berry add `set_lsb_justified(bool)` to `AudioOutputI2S` ### Breaking Changed - Matter relay number starts at 1 instead of 0 to match Tasmota numbering diff --git a/lib/libesp32/berry_tasmota/src/be_i2s_audio_lib.cpp b/lib/libesp32/berry_tasmota/src/be_i2s_audio_lib.cpp index 4ff02c6e1..9ded69468 100644 --- a/lib/libesp32/berry_tasmota/src/be_i2s_audio_lib.cpp +++ b/lib/libesp32/berry_tasmota/src/be_i2s_audio_lib.cpp @@ -149,6 +149,14 @@ int32_t be_audio_output_consume_silence(struct bvm *vm) { #include "AudioOutputI2S.h" +// AudioOutputI2S.set_lsb_justified(gain:real) -> nil +int i2s_output_i2s_set_lsb_justified_ntv(AudioOutputI2S* out, bbool lsbJustified) { + return out->SetLsbJustified(lsbJustified); +} +int32_t i2s_output_i2s_set_lsb_justified(struct bvm *vm) { + return be_call_c_func(vm, (void*) &i2s_output_i2s_set_lsb_justified_ntv, "", ".b"); +} + extern "C" { #include "be_fixed_be_class_AudioOutput.h" @@ -196,6 +204,8 @@ class be_class_AudioOutputI2S (scope: global, name: AudioOutputI2S, super: be_cl init, func(i2s_output_i2s_init) deinit, func(i2s_output_i2s_deinit) stop, func(i2s_output_i2s_stop) + + set_lsb_justified, func(i2s_output_i2s_set_lsb_justified) } class be_class_AudioGeneratorWAV (scope: global, name: AudioGeneratorWAV, super: be_class_AudioGenerator, strings: weak) { From 4e7475dbd44ce1ec861869815a51721062b9bdaf Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Fri, 2 Jun 2023 10:25:02 +0200 Subject: [PATCH 217/289] Bump version v12.5.0.4 --- CHANGELOG.md | 16 +++++++++++++--- RELEASENOTES.md | 2 +- tasmota/include/tasmota_version.h | 2 +- 3 files changed, 15 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ad76b48aa..f833e28c1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,7 +3,19 @@ All notable changes to this project will be documented in this file. ## [Unreleased] - Development -## [12.5.0.3] +## [12.5.0.4] + +### Added + +### Breaking Changed + +### Changed + +### Fixed + +### Removed + +## [12.5.0.3] 20230602 ### Added - Command ``WifiPower 0`` to enable dynamic wifi power based on RSSI by @TD-er (#15443) - Command ``WifiPower 1`` to restore default wifi power @@ -31,8 +43,6 @@ All notable changes to this project will be documented in this file. - Matter fix fabric provisioning from CASE session for iOS 16.5 (#18709) - ESP32 SPI initialization for MFRC522 (#18711) -### Removed - ## [12.5.0.2] 20230516 ### Added - Matter support for Shutters with Tilt diff --git a/RELEASENOTES.md b/RELEASENOTES.md index 309e280cf..ebbb2690f 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -110,7 +110,7 @@ The latter links can be used for OTA upgrades too like ``OtaUrl https://ota.tasm [Complete list](BUILDS.md) of available feature and sensors. -## Changelog v12.5.0.3 +## Changelog v12.5.0.4 ### Added - Command ``SetOption152 0/1`` to select two (0 = default) pin bistable or one (1) pin latching relay control [#18386](https://github.com/arendst/Tasmota/issues/18386) - Command ``I2cScan0`` to scan both busses on ESP32 with one command diff --git a/tasmota/include/tasmota_version.h b/tasmota/include/tasmota_version.h index fc65acab4..72b7c002e 100644 --- a/tasmota/include/tasmota_version.h +++ b/tasmota/include/tasmota_version.h @@ -20,6 +20,6 @@ #ifndef _TASMOTA_VERSION_H_ #define _TASMOTA_VERSION_H_ -const uint32_t VERSION = 0x0C050003; // 12.5.0.3 +const uint32_t VERSION = 0x0C050004; // 12.5.0.4 #endif // _TASMOTA_VERSION_H_ From f8df9e5f00f12f9ff383fa4484965ff92fc2f992 Mon Sep 17 00:00:00 2001 From: s-hadinger <49731213+s-hadinger@users.noreply.github.com> Date: Fri, 2 Jun 2023 13:29:57 +0200 Subject: [PATCH 218/289] Berry `webclient.url_encode()` is now a static class method, no change required to existing code (#18775) --- CHANGELOG.md | 1 + lib/libesp32/berry_tasmota/src/be_webclient_lib.c | 2 +- tasmota/tasmota_xdrv_driver/xdrv_52_3_berry_webclient.ino | 6 +++--- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f833e28c1..f902a3802 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -33,6 +33,7 @@ All notable changes to this project will be documented in this file. - InfluxDb resolves DNS name before request (#18015) - Shutter sliders in WEBGUI automatically appear and disappear during configuration and update during movement (#18701) - AdafruitFingerprint library from v2.0.4 to v2.1.0 +- Berry `webclient.url_encode()` is now a static class method, no change required to existing code ### Fixed - ESP32 InfluxDb initial connection delays using HTTPClient (#18015) diff --git a/lib/libesp32/berry_tasmota/src/be_webclient_lib.c b/lib/libesp32/berry_tasmota/src/be_webclient_lib.c index a5c888d01..6458169a5 100644 --- a/lib/libesp32/berry_tasmota/src/be_webclient_lib.c +++ b/lib/libesp32/berry_tasmota/src/be_webclient_lib.c @@ -45,7 +45,7 @@ class be_class_webclient (scope: global, name: webclient) { .w, var init, func(wc_init) deinit, func(wc_deinit) - url_encode, func(wc_urlencode) + url_encode, static_func(wc_urlencode) begin, func(wc_begin) set_timeouts, func(wc_set_timeouts) diff --git a/tasmota/tasmota_xdrv_driver/xdrv_52_3_berry_webclient.ino b/tasmota/tasmota_xdrv_driver/xdrv_52_3_berry_webclient.ino index 17d590879..f81326570 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_52_3_berry_webclient.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_52_3_berry_webclient.ino @@ -153,12 +153,12 @@ extern "C" { be_return_nil(vm); } - // wc.url_encode(string) -> string + // wc.url_encode(string) -> string (static method) int32_t wc_urlencode(struct bvm *vm); int32_t wc_urlencode(struct bvm *vm) { int32_t argc = be_top(vm); - if (argc >= 2 && be_isstring(vm, 2)) { - const char * s = be_tostring(vm, 2); + if (argc >= 1 && be_isstring(vm, 1)) { + const char * s = be_tostring(vm, 1); String url = wc_UrlEncode(String(s)); be_pushstring(vm, url.c_str()); be_return(vm); /* return self */ From 51286f22755f09404c397f36de79ed1407aed13c Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Fri, 2 Jun 2023 14:24:46 +0200 Subject: [PATCH 219/289] Update changelogs --- CHANGELOG.md | 18 +++++++++++------- RELEASENOTES.md | 15 +++++++++++++-- 2 files changed, 24 insertions(+), 9 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f902a3802..4c5d75448 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,8 +10,10 @@ All notable changes to this project will be documented in this file. ### Breaking Changed ### Changed +- Berry `webclient.url_encode()` is now a static class method, no change required to existing code (#18775) ### Fixed +- Interaction of ``SetOption92``, ``VirtualCT``, and ``RGBWWTable`` (#18768) ### Removed @@ -19,12 +21,12 @@ All notable changes to this project will be documented in this file. ### Added - Command ``WifiPower 0`` to enable dynamic wifi power based on RSSI by @TD-er (#15443) - Command ``WifiPower 1`` to restore default wifi power -- HASPmota `meta` attribute and improved `berry_run` -- Matter bridge for ESP8266 remote endpoints (experimental) -- Display descriptor for ST7735 128x160 display -- Matter support for Occupancy via Switch (experimental) -- Berry RS256 crypto algorithm (RSASSA-MCKS1_v1-5 with SHA256) used for JWT -- Berry add `set_lsb_justified(bool)` to `AudioOutputI2S` +- HASPmota `meta` attribute and improved `berry_run` (#18685) +- Matter bridge for ESP8266 remote endpoints (experimental) (#18734) +- Display descriptor for ST7735 128x160 display (#18741) +- Matter support for Occupancy via Switch (experimental) (#18742) +- Berry RS256 crypto algorithm (RSASSA-MCKS1_v1-5 with SHA256) used for JWT (#18763) +- Berry add `set_lsb_justified(bool)` to `AudioOutputI2S` (#18774) ### Breaking Changed - Matter relay number starts at 1 instead of 0 to match Tasmota numbering @@ -33,7 +35,6 @@ All notable changes to this project will be documented in this file. - InfluxDb resolves DNS name before request (#18015) - Shutter sliders in WEBGUI automatically appear and disappear during configuration and update during movement (#18701) - AdafruitFingerprint library from v2.0.4 to v2.1.0 -- Berry `webclient.url_encode()` is now a static class method, no change required to existing code ### Fixed - ESP32 InfluxDb initial connection delays using HTTPClient (#18015) @@ -43,6 +44,9 @@ All notable changes to this project will be documented in this file. - Inverted shutter now reflect status also in WEBGUI and several minor fixes to make "inverted" consistant (#18701) - Matter fix fabric provisioning from CASE session for iOS 16.5 (#18709) - ESP32 SPI initialization for MFRC522 (#18711) +- Freeze BMP readings before deepsleep (#18720) +- ESP32 Neopixel busy time adjustment (#18723) +- Zigbee attributes handling in Berry mapping (#18747) ## [12.5.0.2] 20230516 ### Added diff --git a/RELEASENOTES.md b/RELEASENOTES.md index ebbb2690f..f8864cbb2 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -119,15 +119,21 @@ The latter links can be used for OTA upgrades too like ``OtaUrl https://ota.tasm - Support for TC74 temperature sensor by Michael Loftis [#18042](https://github.com/arendst/Tasmota/issues/18042) - Support for GM861 1D and 2D bar code reader [#18399](https://github.com/arendst/Tasmota/issues/18399) - Support for PCA9557 8-bit I/O expander [#18632](https://github.com/arendst/Tasmota/issues/18632) +- Display descriptor for ST7735 128x160 display [#18741](https://github.com/arendst/Tasmota/issues/18741) - Zigbee support for air sensors [#18665](https://github.com/arendst/Tasmota/issues/18665) - ESP32 command ``Shuttersetup`` for "Shelly 2.5 pro" automatic calibration and setup (experimental) - ESP32 Enhanced Shutterbuttons functionality to control tilt position, additionally incr/decr possible to position and tilt. +- Berry RS256 crypto algorithm (RSASSA-MCKS1_v1-5 with SHA256) used for JWT [#18763](https://github.com/arendst/Tasmota/issues/18763) +- Berry `tcpclientasync` class for non-blocking TCP client +- Berry add `set_lsb_justified(bool)` to `AudioOutputI2S` [#18774](https://github.com/arendst/Tasmota/issues/18774) +- HASPmota `meta` attribute and improved `berry_run` [#18685](https://github.com/arendst/Tasmota/issues/18685) - Matter sensors Humidity, Pressure, Illuminance [#18441](https://github.com/arendst/Tasmota/issues/18441) - Matter allow `Matter#Initialized` rule once the device is configured [#18451](https://github.com/arendst/Tasmota/issues/18451) - Matter UI to change endpoints configuration [#18498](https://github.com/arendst/Tasmota/issues/18498) - Matter support for Shutters with Tilt [#18509](https://github.com/arendst/Tasmota/issues/18509) -- Matter support for remote relays [#18656](https://github.com/arendst/Tasmota/issues/18656) -- Berry `tcpclientasync` class for non-blocking TCP client +- Matter support for async HTTP used for bridged devices and remote relays [#18656](https://github.com/arendst/Tasmota/issues/18656) +- Matter bridge for ESP8266 remote endpoints (experimental) [#18734](https://github.com/arendst/Tasmota/issues/18734) +- Matter support for Occupancy via Switch (experimental) [#18742](https://github.com/arendst/Tasmota/issues/18742) ### Breaking Changed - Change command ``FileUpload`` index binary data detection from >199 to >299 @@ -141,6 +147,7 @@ The latter links can be used for OTA upgrades too like ``OtaUrl https://ota.tasm - Refactored Zero Cross Dimmer [#18481](https://github.com/arendst/Tasmota/issues/18481) - Energy power delta report delayed by two seconds allowing hardware to stabilize [#17751](https://github.com/arendst/Tasmota/issues/17751) - Shutter sliders in WEBGUI automatically appear and disappear during configuration and update during movement [#18701](https://github.com/arendst/Tasmota/issues/18701) +- Berry `webclient.url_encode()` is now a static class method, no change required to existing code [#18775](https://github.com/arendst/Tasmota/issues/18775) ### Fixed - ESP8266 no update on Energy Export Active regression from v12.3.1.3 @@ -148,10 +155,14 @@ The latter links can be used for OTA upgrades too like ``OtaUrl https://ota.tasm - LED PWM ac_dimmer curve was wrongly applied instead of Gamma regression from v12.2.0.5 [#18666](https://github.com/arendst/Tasmota/issues/18666) - Shutter bootloop using more than 4 shutters [#18673](https://github.com/arendst/Tasmota/issues/18673) - Inverted shutter now reflect status also in WEBGUI and several minor fixes to make "inverted" consistant [#18701](https://github.com/arendst/Tasmota/issues/18701) +- Interaction of ``SetOption92``, ``VirtualCT``, and ``RGBWWTable`` [#18768](https://github.com/arendst/Tasmota/issues/18768) +- Freeze BMP readings before deepsleep [#18720](https://github.com/arendst/Tasmota/issues/18720) - ESP32 Partition_Manager.tapp - ESP32 InfluxDb initial connection delays using HTTPClient [#18015](https://github.com/arendst/Tasmota/issues/18015) - ESP32 AIThinker webcam issues [#18652](https://github.com/arendst/Tasmota/issues/18652) - ESP32 SPI initialization for MFRC522 [#18711](https://github.com/arendst/Tasmota/issues/18711) +- ESP32 Neopixel busy time adjustment [#18723](https://github.com/arendst/Tasmota/issues/18723) - Berry a rare condition when a GC causes a memory corruption - Berry rules for string comparisons [#18464](https://github.com/arendst/Tasmota/issues/18464) +- Zigbee attributes handling in Berry mapping [#18747](https://github.com/arendst/Tasmota/issues/18747) - Matter fix fabric provisioning from CASE session for iOS 16.5 [#18709](https://github.com/arendst/Tasmota/issues/18709) From 61f17221d0b1eab2b7a3228b1e5d7142bae668d7 Mon Sep 17 00:00:00 2001 From: s-hadinger <49731213+s-hadinger@users.noreply.github.com> Date: Fri, 2 Jun 2023 16:36:09 +0200 Subject: [PATCH 220/289] Berry simplify I2S implementation (#18778) --- .../berry_tasmota/src/be_i2s_audio_lib.cpp | 98 +++++++------------ tasmota/my_user_config.h | 1 + 2 files changed, 39 insertions(+), 60 deletions(-) diff --git a/lib/libesp32/berry_tasmota/src/be_i2s_audio_lib.cpp b/lib/libesp32/berry_tasmota/src/be_i2s_audio_lib.cpp index 9ded69468..40322c08f 100644 --- a/lib/libesp32/berry_tasmota/src/be_i2s_audio_lib.cpp +++ b/lib/libesp32/berry_tasmota/src/be_i2s_audio_lib.cpp @@ -39,69 +39,55 @@ extern "C" { } // AudioOutput.set_rate(rate_hz:int) -> bool -AudioOutput* be_audio_output_init_ntv(void) { +AudioOutput* be_audio_output_init(void) { return new AudioOutput(); } -int32_t be_audio_output_init(struct bvm *vm) { - return be_call_c_func(vm, (void*) &be_audio_output_init_ntv, "+.p", ""); -} +BE_FUNC_CTYPE_DECLARE(be_audio_output_init, "+.p", ""); // AudioOutput.set_rate(rate_hz:int) -> bool -int be_audio_output_set_rate_ntv(AudioOutput* out, int hz) { +int be_audio_output_set_rate(AudioOutput* out, int hz) { return out->SetRate(hz); } -int32_t be_audio_output_set_rate(struct bvm *vm) { - return be_call_c_func(vm, (void*) &be_audio_output_set_rate_ntv, "b", ".i"); -} +BE_FUNC_CTYPE_DECLARE(be_audio_output_set_rate, "b", ".i"); // AudioOutput.set_bits_per_sample(bits_per_sample:int) -> bool -int be_audio_output_set_bits_per_sample_ntv(AudioOutput* out, int bps) { +int be_audio_output_set_bits_per_sample(AudioOutput* out, int bps) { return out->SetBitsPerSample(bps); } -int32_t be_audio_output_set_bits_per_sample(struct bvm *vm) { - return be_call_c_func(vm, (void*) &be_audio_output_set_bits_per_sample_ntv, "b", ".i"); -} +BE_FUNC_CTYPE_DECLARE(be_audio_output_set_bits_per_sample, "b", ".i"); // AudioOutput.set_channels(channels:int) -> bool -int be_audio_output_set_channels_ntv(AudioOutput* out, int channels) { +int be_audio_output_set_channels(AudioOutput* out, int channels) { return out->SetChannels(channels); } -int32_t be_audio_output_set_channels(struct bvm *vm) { - return be_call_c_func(vm, (void*) &be_audio_output_set_channels_ntv, "b", ".i"); -} +BE_FUNC_CTYPE_DECLARE(be_audio_output_set_channels, "b", ".i"); // AudioOutput.set_gain(gain:real) -> bool -int be_audio_output_set_gain_ntv(AudioOutput* out, float gain) { +int be_audio_output_set_gain(AudioOutput* out, float gain) { return out->SetGain(gain); } -int32_t be_audio_output_set_gain(struct bvm *vm) { - return be_call_c_func(vm, (void*) &be_audio_output_set_gain_ntv, "b", ".f"); -} +BE_FUNC_CTYPE_DECLARE(be_audio_output_set_gain, "b", ".f"); // AudioOutput.begin() -> bool -int be_audio_output_begin_ntv(AudioOutput* out) { +int be_audio_output_begin(AudioOutput* out) { return out->begin(); } -int32_t be_audio_output_begin(struct bvm *vm) { - return be_call_c_func(vm, (void*) &be_audio_output_begin_ntv, "b", "."); -} +BE_FUNC_CTYPE_DECLARE(be_audio_output_begin, "b", "."); + // AudioOutput.stop() -> bool -int be_audio_output_stop_ntv(AudioOutput* out) { +int be_audio_output_stop(AudioOutput* out) { return out->stop(); } -int32_t be_audio_output_stop(struct bvm *vm) { - return be_call_c_func(vm, (void*) &be_audio_output_stop_ntv, "b", "."); -} +BE_FUNC_CTYPE_DECLARE(be_audio_output_stop, "b", "."); + // AudioOutput.flush() -> bool -void be_audio_output_flush_ntv(AudioOutput* out) { +void be_audio_output_flush(AudioOutput* out) { out->flush(); } -int32_t be_audio_output_flush(struct bvm *vm) { - return be_call_c_func(vm, (void*) &be_audio_output_flush_ntv, "", "."); -} +BE_FUNC_CTYPE_DECLARE(be_audio_output_flush, "", "."); // AudioOutput.consume_mono(bytes) -> int -int be_audio_output_consume_mono_ntv(AudioOutput* out, uint16_t *pcm, int bytes_len, int index) { +int be_audio_output_consume_mono(AudioOutput* out, uint16_t *pcm, int bytes_len, int index) { int pcm_len = bytes_len / 2; int n; // berry_log_C("be_audio_output_consume_mono_ntv out=%p pcm=%p bytes_len=%i index=%i", out, pcm, bytes_len, index); @@ -112,12 +98,10 @@ int be_audio_output_consume_mono_ntv(AudioOutput* out, uint16_t *pcm, int bytes_ } return n; } -int32_t be_audio_output_consume_mono(struct bvm *vm) { - return be_call_c_func(vm, (void*) &be_audio_output_consume_mono_ntv, "i", ".(bytes)~i"); -} +BE_FUNC_CTYPE_DECLARE(be_audio_output_consume_mono, "i", ".(bytes)~i"); // AudioOutput.consume_stereo(bytes) -> int -int be_audio_output_consume_stereo_ntv(AudioOutput* out, uint16_t *pcm, int bytes_len, int index) { +int be_audio_output_consume_stereo(AudioOutput* out, uint16_t *pcm, int bytes_len, int index) { int pcm_len = bytes_len / 4; // 2 samples LEFT+RIGHT of 2 bytes each int n; // berry_log_C("be_audio_output_consume_stereo_ntv out=%p pcm=%p bytes_len=%i index=%i", out, pcm, bytes_len, index); @@ -129,12 +113,10 @@ int be_audio_output_consume_stereo_ntv(AudioOutput* out, uint16_t *pcm, int byte } return n; } -int32_t be_audio_output_consume_stereo(struct bvm *vm) { - return be_call_c_func(vm, (void*) &be_audio_output_consume_stereo_ntv, "i", ".(bytes)~i"); -} +BE_FUNC_CTYPE_DECLARE(be_audio_output_consume_stereo, "i", ".(bytes)~i"); // AudioOutput.consume_silence() -> int, push silence frames -int be_audio_output_consume_silence_ntv(AudioOutput* out) { +int be_audio_output_consume_silence(AudioOutput* out) { int n = 0; int16_t ms[2] = {0, 0}; while (true) { @@ -143,19 +125,15 @@ int be_audio_output_consume_silence_ntv(AudioOutput* out) { } return n; } -int32_t be_audio_output_consume_silence(struct bvm *vm) { - return be_call_c_func(vm, (void*) &be_audio_output_consume_silence_ntv, "i", "."); -} +BE_FUNC_CTYPE_DECLARE(be_audio_output_consume_silence, "i", "."); #include "AudioOutputI2S.h" // AudioOutputI2S.set_lsb_justified(gain:real) -> nil -int i2s_output_i2s_set_lsb_justified_ntv(AudioOutputI2S* out, bbool lsbJustified) { +int i2s_output_i2s_set_lsb_justified(AudioOutputI2S* out, bbool lsbJustified) { return out->SetLsbJustified(lsbJustified); } -int32_t i2s_output_i2s_set_lsb_justified(struct bvm *vm) { - return be_call_c_func(vm, (void*) &i2s_output_i2s_set_lsb_justified_ntv, "", ".b"); -} +BE_FUNC_CTYPE_DECLARE(i2s_output_i2s_set_lsb_justified, "b", ".b"); extern "C" { @@ -172,20 +150,20 @@ extern "C" { class be_class_AudioOutput (scope: global, name: AudioOutput, strings: weak) { .p, var - init, func(be_audio_output_init) + init, ctype_func(be_audio_output_init) - begin, func(be_audio_output_begin) - stop, func(be_audio_output_stop) - flush, func(be_audio_output_flush) + begin, ctype_func(be_audio_output_begin) + stop, ctype_func(be_audio_output_stop) + flush, ctype_func(be_audio_output_flush) - consume_mono, func(be_audio_output_consume_mono) - consume_stereo, func(be_audio_output_consume_stereo) - consume_silence, func(be_audio_output_consume_silence) + consume_mono, ctype_func(be_audio_output_consume_mono) + consume_stereo, ctype_func(be_audio_output_consume_stereo) + consume_silence, ctype_func(be_audio_output_consume_silence) - set_rate, func(be_audio_output_set_rate) - set_bits_per_sample, func(be_audio_output_set_bits_per_sample) - set_channels, func(be_audio_output_set_channels) - set_gain, func(be_audio_output_set_gain) + set_rate, ctype_func(be_audio_output_set_rate) + set_bits_per_sample, ctype_func(be_audio_output_set_bits_per_sample) + set_channels, ctype_func(be_audio_output_set_channels) + set_gain, ctype_func(be_audio_output_set_gain) } class be_class_AudioGenerator (scope: global, name: AudioGenerator, strings: weak) { @@ -205,7 +183,7 @@ class be_class_AudioOutputI2S (scope: global, name: AudioOutputI2S, super: be_cl deinit, func(i2s_output_i2s_deinit) stop, func(i2s_output_i2s_stop) - set_lsb_justified, func(i2s_output_i2s_set_lsb_justified) + set_lsb_justified, ctype_func(i2s_output_i2s_set_lsb_justified) } class be_class_AudioGeneratorWAV (scope: global, name: AudioGeneratorWAV, super: be_class_AudioGenerator, strings: weak) { diff --git a/tasmota/my_user_config.h b/tasmota/my_user_config.h index 15013780e..64ff38362 100644 --- a/tasmota/my_user_config.h +++ b/tasmota/my_user_config.h @@ -1143,6 +1143,7 @@ // #define USE_BERRY_CRYPTO_PBKDF2_HMAC_SHA256 // PBKDF2 with HMAC SHA256, used in Matter protocol // #define USE_BERRY_CRYPTO_HKDF_SHA256 // HKDF with HMAC SHA256, used in Matter protocol // #define USE_BERRY_CRYPTO_SPAKE2P_MATTER // SPAKE2+ used in Matter 1.0, complete name is SPAKE2+-P256-SHA256-HKDF-SHA256-HMAC-SHA256 + // #define USE_BERRY_CRYPTO_RSA // RSA primitives including JWT RS256 (3.9KB flash) #define USE_CSE7761 // Add support for CSE7761 Energy monitor as used in Sonoff Dual R3 // -- LVGL Graphics Library --------------------------------- From 6fdfdb847597f91086d9fb5c1fa0593c63fd6d2b Mon Sep 17 00:00:00 2001 From: s-hadinger <49731213+s-hadinger@users.noreply.github.com> Date: Sat, 3 Jun 2023 19:01:36 +0200 Subject: [PATCH 221/289] Matter Bridge mode always on (#18785) --- CHANGELOG.md | 1 + .../berry_matter/src/be_matter_module.c | 2 + .../src/embedded/Matter_Device.be | 13 +- .../src/embedded/Matter_Plugin.be | 7 + .../src/embedded/Matter_Plugin_Aggregator.be | 71 + .../src/embedded/Matter_Plugin_Bridge_HTTP.be | 6 +- .../embedded/Matter_Plugin_Sensor_OnOff.be | 97 + .../berry_matter/src/embedded/Matter_UI.be | 141 +- .../src/solidify/solidified_Matter_Device.h | 1113 ++++---- .../src/solidify/solidified_Matter_Plugin.h | 32 +- .../solidified_Matter_Plugin_Aggregator.h | 128 + .../solidified_Matter_Plugin_Bridge_HTTP.h | 65 +- .../solidified_Matter_Plugin_Sensor_OnOff.h | 295 ++ .../src/solidify/solidified_Matter_UI.h | 2432 +++++++++-------- 14 files changed, 2555 insertions(+), 1848 deletions(-) create mode 100644 lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Aggregator.be create mode 100644 lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor_OnOff.be create mode 100644 lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Aggregator.h create mode 100644 lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor_OnOff.h diff --git a/CHANGELOG.md b/CHANGELOG.md index 4c5d75448..dc6daa042 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,7 @@ All notable changes to this project will be documented in this file. ### Changed - Berry `webclient.url_encode()` is now a static class method, no change required to existing code (#18775) +- Matter Bridge mode always on ### Fixed - Interaction of ``SetOption92``, ``VirtualCT``, and ``RGBWWTable`` (#18768) diff --git a/lib/libesp32/berry_matter/src/be_matter_module.c b/lib/libesp32/berry_matter/src/be_matter_module.c index b335cd147..bef0a4253 100644 --- a/lib/libesp32/berry_matter/src/be_matter_module.c +++ b/lib/libesp32/berry_matter/src/be_matter_module.c @@ -189,6 +189,7 @@ extern const bclass be_class_Matter_TLV; // need to declare it upfront because #include "../generate/be_matter_certs.h" #include "solidify/solidified_Matter_Plugin_Root.h" +#include "solidify/solidified_Matter_Plugin_Aggregator.h" #include "solidify/solidified_Matter_Plugin_Device.h" #include "solidify/solidified_Matter_Plugin_OnOff.h" #include "solidify/solidified_Matter_Plugin_Light0.h" @@ -388,6 +389,7 @@ module matter (scope: global, strings: weak) { // Plugins Plugin_Root, class(be_class_Matter_Plugin_Root) // Generic behavior common to all devices + Plugin_Aggregator, class(be_class_Matter_Plugin_Aggregator) // Aggregator Plugin_Device, class(be_class_Matter_Plugin_Device) // Generic device (abstract) Plugin_OnOff, class(be_class_Matter_Plugin_OnOff) // Relay/Light behavior (OnOff) Plugin_Light0, class(be_class_Matter_Plugin_Light0) // OnOff Light diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Device.be b/lib/libesp32/berry_matter/src/embedded/Matter_Device.be index 4db220670..4f4c215ca 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Device.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Device.be @@ -680,13 +680,23 @@ class Matter_Device var endpoints = self.k2l_num(config) tasmota.log("MTR: endpoints to be configured "+str(endpoints), 3) + # start with mandatory endpoint 0 for root node + self.plugins.push(matter.Plugin_Root(self, 0, {})) + tasmota.log(string.format("MTR: endpoint:%i type:%s%s", 0, 'root', ''), 2) + + # always include an aggregator for dynamic endpoints + self.plugins.push(matter.Plugin_Aggregator(self, 0xFF00, {})) + tasmota.log(string.format("MTR: endpoint:%i type:%s%s", 0xFF00, 'aggregator', ''), 2) + for ep: endpoints + if ep == 0 continue end # skip endpoint 0 try var plugin_conf = config[str(ep)] tasmota.log(string.format("MTR: endpoint %i config %s", ep, plugin_conf), 3) var pi_class_name = plugin_conf.find('type') if pi_class_name == nil tasmota.log("MTR: no class name, skipping", 3) continue end + if pi_class_name == 'root' tasmota.log("MTR: only one root node allowed", 3) continue end var pi_class = self.plugins_classes.find(pi_class_name) if pi_class == nil tasmota.log("MTR: unknown class name '"+str(pi_class_name)+"' skipping", 2) continue end @@ -1004,9 +1014,6 @@ class Matter_Device import json var m = {} - # add the default plugin - m["0"] = {'type':'root'} - # check if we have a light var endpoint = 1 var light_present = false diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin.be index 03e8d8734..dafeb7793 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin.be @@ -36,6 +36,7 @@ class Matter_Plugin # Configuration of the plugin: clusters and type static var CLUSTERS = { 0x001D: [0,1,2,3,0xFFFC,0xFFFD], # Descriptor Cluster 9.5 p.453 + 0x0039: [0x11], # Bridged Device Basic Information 9.13 p.485 } var device # reference to the `device` global object var endpoint # current endpoint @@ -180,6 +181,12 @@ class Matter_Plugin return TLV.create_TLV(TLV.U4, 1) # "Initial Release" end + # ==================================================================================================== + elif cluster == 0x0039 # ========== Bridged Device Basic Information 9.13 p.485 ========== + + if attribute == 0x0011 # ---------- Reachable / bool ---------- + return TLV.create_TLV(TLV.BOOL, 1) # by default we are reachable + end else return nil end diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Aggregator.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Aggregator.be new file mode 100644 index 000000000..90a9255ac --- /dev/null +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Aggregator.be @@ -0,0 +1,71 @@ +# +# Matter_Plugin_Aggregator.be - implements the Aggregator endpoint +# +# Copyright (C) 2023 Stephan Hadinger & Theo Arends +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +# + +import matter + +# Matter plug-in for root behavior + +# dummy declaration for solidification +class Matter_Plugin end + +#@ solidify:Matter_Plugin_Aggregator,weak + +class Matter_Plugin_Aggregator : Matter_Plugin + static var TYPE = "aggregator" # name of the plug-in in json + static var NAME = "Aggregator" # display name of the plug-in +# static var CLUSTERS = { +# # 0x001D: inherited # Descriptor Cluster 9.5 p.453 +# } + static var TYPES = { 0x000E: 1 } # Aggregator + + ############################################################# + # read an attribute + # + def read_attribute(session, ctx) + import string + var TLV = matter.TLV + var cluster = ctx.cluster + var attribute = ctx.attribute + + if cluster == 0x001D # ========== Descriptor Cluster 9.5 p.453 ========== + + # overwrite PartsList + if attribute == 0x0003 # ---------- PartsList / list[endpoint-no]---------- + var pl = TLV.Matter_TLV_array() + var eps = self.device.get_active_endpoints(true) + for ep: eps + if ep != 0xFF00 + pl.add_TLV(nil, TLV.U2, ep) # add each endpoint + end + end + return pl + else + return super(self).read_attribute(session, ctx) + end + + else + return super(self).read_attribute(session, ctx) + + end + # no match found, return that the attribute is unsupported + end + +end +matter.Plugin_Aggregator = Matter_Plugin_Aggregator + \ No newline at end of file diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_HTTP.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_HTTP.be index 3918882ad..12c487449 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_HTTP.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_HTTP.be @@ -43,7 +43,7 @@ class Matter_Plugin_Bridge_HTTP : Matter_Plugin_Device # 0x0006: [0,0xFFFC,0xFFFD], # On/Off 1.5 p.48 # 0x0028: [0,1,2,3,4,5,6,7,8,9,0x0A,0x0F,0x12,0x13],# Basic Information Cluster cluster 11.1 p.565 - 0x0039: [0x11] # Bridged Device Basic Information 9.13 p.485 + # 0x0039: [0x11] # Bridged Device Basic Information 9.13 p.485 } # static var TYPES = { 0x010A: 2 } # On/Off Light @@ -176,9 +176,7 @@ class Matter_Plugin_Bridge_HTTP : Matter_Plugin_Device # ==================================================================================================== if cluster == 0x0039 # ========== Bridged Device Basic Information 9.13 p.485 ========== - if attribute == 0x0000 # ---------- DataModelRevision / CommissioningWindowStatus ---------- - # return TLV.create_TLV(TLV.U2, 1) - elif attribute == 0x0011 # ---------- Reachable / bool ---------- + if attribute == 0x0011 # ---------- Reachable / bool ---------- # self.is_reachable_lazy_sync() # Not needed anymore return TLV.create_TLV(TLV.BOOL, self.http_remote.reachable) # TODO find a way to do a ping end diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor_OnOff.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor_OnOff.be new file mode 100644 index 000000000..be1184866 --- /dev/null +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor_OnOff.be @@ -0,0 +1,97 @@ +# +# Matter_Plugin_Sensor_OnOff.be - implements the behavior for a Occupany Switch +# +# Copyright (C) 2023 Stephan Hadinger & Theo Arends +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +# + +# Matter plug-in for core behavior + +# dummy declaration for solidification +class Matter_Plugin_Device end + +#@ solidify:Matter_Plugin_Sensor_OnOff,weak + +class Matter_Plugin_Sensor_OnOff : Matter_Plugin_Device + static var TYPE = "occupancy" # name of the plug-in in json + static var NAME = "OnOff" # display name of the plug-in + static var ARG = "switch" # additional argument name (or empty if none) + static var ARG_TYPE = / x -> int(x) # function to convert argument to the right type + static var UPDATE_TIME = 5000 # update every 250ms + static var CLUSTERS = { + 0x0006: [0,0xFFFC,0xFFFD], # On/Off 1.5 p.48 + } + static var TYPES = { 0x0850: 2 } # OnOff Sensor, rev 2 + + var tasmota_switch_index # Switch number in Tasmota (one based) + var shadow_onoff + + ############################################################# + # Constructor + def init(device, endpoint, arguments) + super(self).init(device, endpoint, arguments) + self.tasmota_switch_index = int(arguments.find(self.ARG #-'relay'-#, 1)) + if self.tasmota_switch_index <= 0 self.tasmota_switch_index = 1 end + end + + ############################################################# + # Update shadow + # + def update_shadow() + super(self).update_shadow() + + import json + var ret = tasmota.cmd("Status 8", true) + if ret != nil + var j = json.load(ret) + if j != nil + var state = false + state = (j.find("Switch" + str(self.tasmota_switch_index)) == "ON") + + if self.shadow_onoff != nil && self.shadow_onoff != bool(state) + self.attribute_updated(0x0406, 0x0000) + end + self.shadow_onoff = state + end + end + end + + ############################################################# + # read an attribute + # + def read_attribute(session, ctx) + import string + var TLV = matter.TLV + var cluster = ctx.cluster + var attribute = ctx.attribute + + # ==================================================================================================== + if cluster == 0x0006 # ========== On/Off 1.5 p.48 ========== + self.update_shadow_lazy() + if attribute == 0x0000 # ---------- OnOff / bool ---------- + return TLV.create_TLV(TLV.BOOL, self.shadow_onoff) + elif attribute == 0xFFFC # ---------- FeatureMap / map32 ---------- + return TLV.create_TLV(TLV.U4, 0) # 0 = no Level Control for Lighting + elif attribute == 0xFFFD # ---------- ClusterRevision / u2 ---------- + return TLV.create_TLV(TLV.U4, 4) # 0 = no Level Control for Lighting + end + + else + return super(self).read_attribute(session, ctx) + end + end + +end +matter.Plugin_Sensor_OnOff = Matter_Plugin_Sensor_OnOff diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_UI.be b/lib/libesp32/berry_matter/src/embedded/Matter_UI.be index a59955ded..769a458c9 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_UI.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_UI.be @@ -32,7 +32,6 @@ import matter # WebUI for the partition manager ################################################################################# class Matter_UI - static var _ROOT_TYPES = "root" static var _CLASSES_TYPES = "|relay|light0|light1|light2|light3|shutter|shutter+tilt" "|temperature|pressure|illuminance|humidity|occupancy" static var _CLASSES_TYPES2= "-http|http_relay|http_light0|http_light1|http_light2|http_light3" @@ -164,6 +163,15 @@ class Matter_UI import string webserver.content_send("
     Matter Passcode 

    ") + # button for open/close commissioning + webserver.content_send("") + if self.device.commissioning_open == nil + webserver.content_send(string.format("

    ", "Open Commissioning")) + else + webserver.content_send(string.format("

    ", "Close Commissioning")) + end + webserver.content_send("

    ") + # webserver.content_send("
    ") webserver.content_send("

    Passcode:

    ") webserver.content_send(string.format("", self.device.root_passcode)) @@ -239,22 +247,16 @@ class Matter_UI var i = 0 # special case for root node - if endpoints[0] == 0 - var ep = endpoints[i] - var conf = self.device.plugins_config[str(ep)] - var typ = conf.find('type') - - webserver.content_send(string.format("", i)) - webserver.content_send(string.format("")) - webserver.content_send(" ") - - i += 1 - end + # display a fake configuration item (disabled) + webserver.content_send("") + webserver.content_send("") + webserver.content_send(" ") while i < size(endpoints) var ep = endpoints[i] + if ep == 0 i += 1 continue end # skip endpoint 0 (leftover from previous versions) var conf = self.device.plugins_config[str(ep)] var typ = conf.find('type') if !typ i += 1 continue end @@ -371,6 +373,16 @@ class Matter_UI #- and force restart -# webserver.redirect("/?rst=") + #---------------------------------------------------------------------# + # Enable or Disable Commissioning + #---------------------------------------------------------------------# + elif webserver.has_arg("open_comm") + self.device.start_root_basic_commissioning() + webserver.redirect("/") + elif webserver.has_arg("clos_comm") + self.device.stop_basic_commissioning() + webserver.redirect("/") + #---------------------------------------------------------------------# # Enable Matter #---------------------------------------------------------------------# @@ -421,72 +433,69 @@ class Matter_UI #---------------------------------------------------------------------# # Apply new configuration template #---------------------------------------------------------------------# - elif webserver.has_arg("config") - var config = {} + elif webserver.has_arg("config") + var config = {} - tasmota.log(string.format("MTR: /matterc received '%s' command", 'config'), 3) - # iterate by id - var idx = 0 - var idx_str = string.format("%03i", idx) - while webserver.has_arg('ep'+idx_str) + tasmota.log(string.format("MTR: /matterc received '%s' command", 'config'), 3) + # iterate by id + var idx = 1 + var idx_str = string.format("%03i", idx) + while webserver.has_arg('ep'+idx_str) - var ep = webserver.arg('ep'+idx_str) - var ep_int = int(ep) - var typ = webserver.arg('pi'+idx_str) - var arg = webserver.arg('arg'+idx_str) - tasmota.log(string.format("MTR: ep=%i type=%s arg=%s", ep, typ, arg), 3) + var ep = webserver.arg('ep'+idx_str) + var ep_int = int(ep) + var typ = webserver.arg('pi'+idx_str) + var arg = webserver.arg('arg'+idx_str) + tasmota.log(string.format("MTR: ep=%i type=%s arg=%s", ep, typ, arg), 3) - if ep != '' && typ != '' - - # check if type exists - var typ_class = self.device.plugins_classes.find(typ) - if typ_class != nil - var elt = {'type':typ} - typ_class.ui_string_to_conf(typ_class, elt, arg) - # var arg_name = typ_class.ARG - # var arg_type = typ_class.ARG_TYPE - # if arg && arg_name - # elt[arg_name] = arg_type(arg) - # end - config[ep] = elt + if ep != '' && typ != '' && ep != '0' + + # check if type exists + var typ_class = self.device.plugins_classes.find(typ) + if typ_class != nil + var elt = {'type':typ} + typ_class.ui_string_to_conf(typ_class, elt, arg) + # var arg_name = typ_class.ARG + # var arg_type = typ_class.ARG_TYPE + # if arg && arg_name + # elt[arg_name] = arg_type(arg) + # end + config[ep] = elt + + else + tasmota.log(string.format("MTR: unknown type = %s", typ), 2) + end else - tasmota.log(string.format("MTR: unknown type = %s", typ), 2) + tasmota.log("MTR: skipping parameter", 2) end - else - tasmota.log("MTR: skipping parameter", 2) + idx += 1 + idx_str = string.format("%03i", idx) + end + + tasmota.log(string.format("MTR: config = %s", str(config)), 3) + + if error + tasmota.log(string.format("MTR: config error = %s", error), 3) + else + self.device.plugins_config = config + self.device.plugins_persist = true + self.device.save_param() + #- and force restart -# + webserver.redirect("/?rst=") end - idx += 1 - idx_str = string.format("%03i", idx) end - tasmota.log(string.format("MTR: config = %s", str(config)), 3) - - # sanity check - if !config.contains("0") error = "Missing endpoint 0" end - if error - tasmota.log(string.format("MTR: config error = %s", error), 3) - else - self.device.plugins_config = config - self.device.plugins_persist = true - self.device.save_param() - #- and force restart -# - webserver.redirect("/?rst=") + webserver.content_start("Parameter error") #- title of the web page -# + webserver.content_send_style() #- send standard Tasmota styles -# + webserver.content_send(string.format("

    Error:%s

    ", webserver.html_escape(error))) + webserver.content_button(webserver.BUTTON_CONFIGURATION) #- button back to configuration page -# + webserver.content_stop() #- end of web page -# end - end - - if error - webserver.content_start("Parameter error") #- title of the web page -# - webserver.content_send_style() #- send standard Tasmota styles -# - webserver.content_send(string.format("

    Error:%s

    ", webserver.html_escape(error))) - webserver.content_button(webserver.BUTTON_CONFIGURATION) #- button back to configuration page -# - webserver.content_stop() #- end of web page -# - end - except .. as e, m tasmota.log(string.format("BRY: Exception> '%s' - %s", e, m), 2) #- display error page -# diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Device.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Device.h index bf8d29a39..f7a6b4bec 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Device.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Device.h @@ -2264,38 +2264,45 @@ be_local_closure(Matter_Device__load_plugins_config, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[27]) { /* constants */ + ( &(const bvalue[34]) { /* constants */ /* K0 */ be_nested_str_weak(string), /* K1 */ be_nested_str_weak(k2l_num), /* K2 */ be_nested_str_weak(tasmota), /* K3 */ be_nested_str_weak(log), /* K4 */ be_nested_str_weak(MTR_X3A_X20endpoints_X20to_X20be_X20configured_X20), /* K5 */ be_const_int(3), - /* K6 */ be_nested_str_weak(format), - /* K7 */ be_nested_str_weak(MTR_X3A_X20endpoint_X20_X25i_X20config_X20_X25s), - /* K8 */ be_nested_str_weak(find), - /* K9 */ be_nested_str_weak(type), - /* K10 */ be_nested_str_weak(MTR_X3A_X20no_X20class_X20name_X2C_X20skipping), - /* K11 */ be_nested_str_weak(plugins_classes), - /* K12 */ be_nested_str_weak(MTR_X3A_X20unknown_X20class_X20name_X20_X27), - /* K13 */ be_nested_str_weak(_X27_X20skipping), - /* K14 */ be_const_int(2), - /* K15 */ be_nested_str_weak(plugins), - /* K16 */ be_nested_str_weak(push), - /* K17 */ be_nested_str_weak(), - /* K18 */ be_nested_str_weak(k2l), - /* K19 */ be_nested_str_weak(_X20_X25s_X3A_X25s), - /* K20 */ be_nested_str_weak(stop_iteration), - /* K21 */ be_nested_str_weak(MTR_X3A_X20endpoint_X3A_X25i_X20type_X3A_X25s_X25s), - /* K22 */ be_nested_str_weak(MTR_X3A_X20Exception), - /* K23 */ be_nested_str_weak(_X7C), - /* K24 */ be_nested_str_weak(publish_result), - /* K25 */ be_nested_str_weak(_X7B_X22Matter_X22_X3A_X7B_X22Initialized_X22_X3A1_X7D_X7D), - /* K26 */ be_nested_str_weak(Matter), + /* K6 */ be_nested_str_weak(plugins), + /* K7 */ be_nested_str_weak(push), + /* K8 */ be_nested_str_weak(matter), + /* K9 */ be_nested_str_weak(Plugin_Root), + /* K10 */ be_const_int(0), + /* K11 */ be_nested_str_weak(format), + /* K12 */ be_nested_str_weak(MTR_X3A_X20endpoint_X3A_X25i_X20type_X3A_X25s_X25s), + /* K13 */ be_nested_str_weak(root), + /* K14 */ be_nested_str_weak(), + /* K15 */ be_const_int(2), + /* K16 */ be_nested_str_weak(Plugin_Aggregator), + /* K17 */ be_nested_str_weak(aggregator), + /* K18 */ be_nested_str_weak(MTR_X3A_X20endpoint_X20_X25i_X20config_X20_X25s), + /* K19 */ be_nested_str_weak(find), + /* K20 */ be_nested_str_weak(type), + /* K21 */ be_nested_str_weak(MTR_X3A_X20no_X20class_X20name_X2C_X20skipping), + /* K22 */ be_nested_str_weak(MTR_X3A_X20only_X20one_X20root_X20node_X20allowed), + /* K23 */ be_nested_str_weak(plugins_classes), + /* K24 */ be_nested_str_weak(MTR_X3A_X20unknown_X20class_X20name_X20_X27), + /* K25 */ be_nested_str_weak(_X27_X20skipping), + /* K26 */ be_nested_str_weak(k2l), + /* K27 */ be_nested_str_weak(_X20_X25s_X3A_X25s), + /* K28 */ be_nested_str_weak(stop_iteration), + /* K29 */ be_nested_str_weak(MTR_X3A_X20Exception), + /* K30 */ be_nested_str_weak(_X7C), + /* K31 */ be_nested_str_weak(publish_result), + /* K32 */ be_nested_str_weak(_X7B_X22Matter_X22_X3A_X7B_X22Initialized_X22_X3A1_X7D_X7D), + /* K33 */ be_nested_str_weak(Matter), }), be_str_weak(_load_plugins_config), &be_const_str_solidified, - ( &(const binstruction[133]) { /* code */ + ( &(const binstruction[185]) { /* code */ 0xA40A0000, // 0000 IMPORT R2 K0 0x8C0C0101, // 0001 GETMET R3 R0 K1 0x5C140200, // 0002 MOVE R5 R1 @@ -2308,127 +2315,179 @@ be_local_closure(Matter_Device__load_plugins_config, /* name */ 0x001A0806, // 0009 ADD R6 K4 R6 0x581C0005, // 000A LDCONST R7 K5 0x7C100600, // 000B CALL R4 3 - 0x60100010, // 000C GETGBL R4 G16 - 0x5C140600, // 000D MOVE R5 R3 - 0x7C100200, // 000E CALL R4 1 - 0xA802006B, // 000F EXBLK 0 #007C - 0x5C140800, // 0010 MOVE R5 R4 - 0x7C140000, // 0011 CALL R5 0 - 0xA8020056, // 0012 EXBLK 0 #006A - 0x60180008, // 0013 GETGBL R6 G8 - 0x5C1C0A00, // 0014 MOVE R7 R5 - 0x7C180200, // 0015 CALL R6 1 - 0x94180206, // 0016 GETIDX R6 R1 R6 - 0xB81E0400, // 0017 GETNGBL R7 K2 - 0x8C1C0F03, // 0018 GETMET R7 R7 K3 - 0x8C240506, // 0019 GETMET R9 R2 K6 - 0x582C0007, // 001A LDCONST R11 K7 - 0x5C300A00, // 001B MOVE R12 R5 - 0x5C340C00, // 001C MOVE R13 R6 - 0x7C240800, // 001D CALL R9 4 - 0x58280005, // 001E LDCONST R10 K5 - 0x7C1C0600, // 001F CALL R7 3 - 0x8C1C0D08, // 0020 GETMET R7 R6 K8 - 0x58240009, // 0021 LDCONST R9 K9 - 0x7C1C0400, // 0022 CALL R7 2 - 0x4C200000, // 0023 LDNIL R8 - 0x1C200E08, // 0024 EQ R8 R7 R8 - 0x78220006, // 0025 JMPF R8 #002D - 0xB8220400, // 0026 GETNGBL R8 K2 - 0x8C201103, // 0027 GETMET R8 R8 K3 - 0x5828000A, // 0028 LDCONST R10 K10 - 0x582C0005, // 0029 LDCONST R11 K5 - 0x7C200600, // 002A CALL R8 3 - 0xA8040001, // 002B EXBLK 1 1 - 0x7001FFE2, // 002C JMP #0010 - 0x8820010B, // 002D GETMBR R8 R0 K11 - 0x8C201108, // 002E GETMET R8 R8 K8 - 0x5C280E00, // 002F MOVE R10 R7 - 0x7C200400, // 0030 CALL R8 2 - 0x4C240000, // 0031 LDNIL R9 - 0x1C241009, // 0032 EQ R9 R8 R9 - 0x7826000A, // 0033 JMPF R9 #003F - 0xB8260400, // 0034 GETNGBL R9 K2 - 0x8C241303, // 0035 GETMET R9 R9 K3 - 0x602C0008, // 0036 GETGBL R11 G8 - 0x5C300E00, // 0037 MOVE R12 R7 - 0x7C2C0200, // 0038 CALL R11 1 - 0x002E180B, // 0039 ADD R11 K12 R11 - 0x002C170D, // 003A ADD R11 R11 K13 - 0x5830000E, // 003B LDCONST R12 K14 - 0x7C240600, // 003C CALL R9 3 - 0xA8040001, // 003D EXBLK 1 1 - 0x7001FFD0, // 003E JMP #0010 - 0x5C241000, // 003F MOVE R9 R8 - 0x5C280000, // 0040 MOVE R10 R0 - 0x5C2C0A00, // 0041 MOVE R11 R5 - 0x5C300C00, // 0042 MOVE R12 R6 - 0x7C240600, // 0043 CALL R9 3 - 0x8828010F, // 0044 GETMBR R10 R0 K15 - 0x8C281510, // 0045 GETMET R10 R10 K16 - 0x5C301200, // 0046 MOVE R12 R9 - 0x7C280400, // 0047 CALL R10 2 - 0x58280011, // 0048 LDCONST R10 K17 - 0x602C0010, // 0049 GETGBL R11 G16 - 0x8C300112, // 004A GETMET R12 R0 K18 - 0x5C380C00, // 004B MOVE R14 R6 - 0x7C300400, // 004C CALL R12 2 - 0x7C2C0200, // 004D CALL R11 1 - 0xA802000B, // 004E EXBLK 0 #005B - 0x5C301600, // 004F MOVE R12 R11 - 0x7C300000, // 0050 CALL R12 0 - 0x1C341909, // 0051 EQ R13 R12 K9 - 0x78360000, // 0052 JMPF R13 #0054 - 0x7001FFFA, // 0053 JMP #004F - 0x8C340506, // 0054 GETMET R13 R2 K6 - 0x583C0013, // 0055 LDCONST R15 K19 - 0x5C401800, // 0056 MOVE R16 R12 - 0x94440C0C, // 0057 GETIDX R17 R6 R12 - 0x7C340800, // 0058 CALL R13 4 - 0x0028140D, // 0059 ADD R10 R10 R13 - 0x7001FFF3, // 005A JMP #004F - 0x582C0014, // 005B LDCONST R11 K20 - 0xAC2C0200, // 005C CATCH R11 1 0 - 0xB0080000, // 005D RAISE 2 R0 R0 - 0xB82E0400, // 005E GETNGBL R11 K2 - 0x8C2C1703, // 005F GETMET R11 R11 K3 - 0x8C340506, // 0060 GETMET R13 R2 K6 - 0x583C0015, // 0061 LDCONST R15 K21 - 0x5C400A00, // 0062 MOVE R16 R5 - 0x5C440E00, // 0063 MOVE R17 R7 - 0x5C481400, // 0064 MOVE R18 R10 - 0x7C340A00, // 0065 CALL R13 5 - 0x5838000E, // 0066 LDCONST R14 K14 - 0x7C2C0600, // 0067 CALL R11 3 - 0xA8040001, // 0068 EXBLK 1 1 - 0x70020010, // 0069 JMP #007B - 0xAC180002, // 006A CATCH R6 0 2 - 0x7002000D, // 006B JMP #007A - 0xB8220400, // 006C GETNGBL R8 K2 - 0x8C201103, // 006D GETMET R8 R8 K3 - 0x60280008, // 006E GETGBL R10 G8 - 0x5C2C0C00, // 006F MOVE R11 R6 - 0x7C280200, // 0070 CALL R10 1 - 0x002A2C0A, // 0071 ADD R10 K22 R10 - 0x00281517, // 0072 ADD R10 R10 K23 - 0x602C0008, // 0073 GETGBL R11 G8 - 0x5C300E00, // 0074 MOVE R12 R7 - 0x7C2C0200, // 0075 CALL R11 1 - 0x0028140B, // 0076 ADD R10 R10 R11 - 0x582C000E, // 0077 LDCONST R11 K14 - 0x7C200600, // 0078 CALL R8 3 - 0x70020000, // 0079 JMP #007B - 0xB0080000, // 007A RAISE 2 R0 R0 - 0x7001FF93, // 007B JMP #0010 - 0x58100014, // 007C LDCONST R4 K20 - 0xAC100200, // 007D CATCH R4 1 0 - 0xB0080000, // 007E RAISE 2 R0 R0 - 0xB8120400, // 007F GETNGBL R4 K2 - 0x8C100918, // 0080 GETMET R4 R4 K24 - 0x58180019, // 0081 LDCONST R6 K25 - 0x581C001A, // 0082 LDCONST R7 K26 - 0x7C100600, // 0083 CALL R4 3 - 0x80000000, // 0084 RET 0 + 0x88100106, // 000C GETMBR R4 R0 K6 + 0x8C100907, // 000D GETMET R4 R4 K7 + 0xB81A1000, // 000E GETNGBL R6 K8 + 0x8C180D09, // 000F GETMET R6 R6 K9 + 0x5C200000, // 0010 MOVE R8 R0 + 0x5824000A, // 0011 LDCONST R9 K10 + 0x60280013, // 0012 GETGBL R10 G19 + 0x7C280000, // 0013 CALL R10 0 + 0x7C180800, // 0014 CALL R6 4 + 0x7C100400, // 0015 CALL R4 2 + 0xB8120400, // 0016 GETNGBL R4 K2 + 0x8C100903, // 0017 GETMET R4 R4 K3 + 0x8C18050B, // 0018 GETMET R6 R2 K11 + 0x5820000C, // 0019 LDCONST R8 K12 + 0x5824000A, // 001A LDCONST R9 K10 + 0x5828000D, // 001B LDCONST R10 K13 + 0x582C000E, // 001C LDCONST R11 K14 + 0x7C180A00, // 001D CALL R6 5 + 0x581C000F, // 001E LDCONST R7 K15 + 0x7C100600, // 001F CALL R4 3 + 0x88100106, // 0020 GETMBR R4 R0 K6 + 0x8C100907, // 0021 GETMET R4 R4 K7 + 0xB81A1000, // 0022 GETNGBL R6 K8 + 0x8C180D10, // 0023 GETMET R6 R6 K16 + 0x5C200000, // 0024 MOVE R8 R0 + 0x5426FEFF, // 0025 LDINT R9 65280 + 0x60280013, // 0026 GETGBL R10 G19 + 0x7C280000, // 0027 CALL R10 0 + 0x7C180800, // 0028 CALL R6 4 + 0x7C100400, // 0029 CALL R4 2 + 0xB8120400, // 002A GETNGBL R4 K2 + 0x8C100903, // 002B GETMET R4 R4 K3 + 0x8C18050B, // 002C GETMET R6 R2 K11 + 0x5820000C, // 002D LDCONST R8 K12 + 0x5426FEFF, // 002E LDINT R9 65280 + 0x58280011, // 002F LDCONST R10 K17 + 0x582C000E, // 0030 LDCONST R11 K14 + 0x7C180A00, // 0031 CALL R6 5 + 0x581C000F, // 0032 LDCONST R7 K15 + 0x7C100600, // 0033 CALL R4 3 + 0x60100010, // 0034 GETGBL R4 G16 + 0x5C140600, // 0035 MOVE R5 R3 + 0x7C100200, // 0036 CALL R4 1 + 0xA8020077, // 0037 EXBLK 0 #00B0 + 0x5C140800, // 0038 MOVE R5 R4 + 0x7C140000, // 0039 CALL R5 0 + 0x1C180B0A, // 003A EQ R6 R5 K10 + 0x781A0000, // 003B JMPF R6 #003D + 0x7001FFFA, // 003C JMP #0038 + 0xA802005F, // 003D EXBLK 0 #009E + 0x60180008, // 003E GETGBL R6 G8 + 0x5C1C0A00, // 003F MOVE R7 R5 + 0x7C180200, // 0040 CALL R6 1 + 0x94180206, // 0041 GETIDX R6 R1 R6 + 0xB81E0400, // 0042 GETNGBL R7 K2 + 0x8C1C0F03, // 0043 GETMET R7 R7 K3 + 0x8C24050B, // 0044 GETMET R9 R2 K11 + 0x582C0012, // 0045 LDCONST R11 K18 + 0x5C300A00, // 0046 MOVE R12 R5 + 0x5C340C00, // 0047 MOVE R13 R6 + 0x7C240800, // 0048 CALL R9 4 + 0x58280005, // 0049 LDCONST R10 K5 + 0x7C1C0600, // 004A CALL R7 3 + 0x8C1C0D13, // 004B GETMET R7 R6 K19 + 0x58240014, // 004C LDCONST R9 K20 + 0x7C1C0400, // 004D CALL R7 2 + 0x4C200000, // 004E LDNIL R8 + 0x1C200E08, // 004F EQ R8 R7 R8 + 0x78220006, // 0050 JMPF R8 #0058 + 0xB8220400, // 0051 GETNGBL R8 K2 + 0x8C201103, // 0052 GETMET R8 R8 K3 + 0x58280015, // 0053 LDCONST R10 K21 + 0x582C0005, // 0054 LDCONST R11 K5 + 0x7C200600, // 0055 CALL R8 3 + 0xA8040001, // 0056 EXBLK 1 1 + 0x7001FFDF, // 0057 JMP #0038 + 0x1C200F0D, // 0058 EQ R8 R7 K13 + 0x78220006, // 0059 JMPF R8 #0061 + 0xB8220400, // 005A GETNGBL R8 K2 + 0x8C201103, // 005B GETMET R8 R8 K3 + 0x58280016, // 005C LDCONST R10 K22 + 0x582C0005, // 005D LDCONST R11 K5 + 0x7C200600, // 005E CALL R8 3 + 0xA8040001, // 005F EXBLK 1 1 + 0x7001FFD6, // 0060 JMP #0038 + 0x88200117, // 0061 GETMBR R8 R0 K23 + 0x8C201113, // 0062 GETMET R8 R8 K19 + 0x5C280E00, // 0063 MOVE R10 R7 + 0x7C200400, // 0064 CALL R8 2 + 0x4C240000, // 0065 LDNIL R9 + 0x1C241009, // 0066 EQ R9 R8 R9 + 0x7826000A, // 0067 JMPF R9 #0073 + 0xB8260400, // 0068 GETNGBL R9 K2 + 0x8C241303, // 0069 GETMET R9 R9 K3 + 0x602C0008, // 006A GETGBL R11 G8 + 0x5C300E00, // 006B MOVE R12 R7 + 0x7C2C0200, // 006C CALL R11 1 + 0x002E300B, // 006D ADD R11 K24 R11 + 0x002C1719, // 006E ADD R11 R11 K25 + 0x5830000F, // 006F LDCONST R12 K15 + 0x7C240600, // 0070 CALL R9 3 + 0xA8040001, // 0071 EXBLK 1 1 + 0x7001FFC4, // 0072 JMP #0038 + 0x5C241000, // 0073 MOVE R9 R8 + 0x5C280000, // 0074 MOVE R10 R0 + 0x5C2C0A00, // 0075 MOVE R11 R5 + 0x5C300C00, // 0076 MOVE R12 R6 + 0x7C240600, // 0077 CALL R9 3 + 0x88280106, // 0078 GETMBR R10 R0 K6 + 0x8C281507, // 0079 GETMET R10 R10 K7 + 0x5C301200, // 007A MOVE R12 R9 + 0x7C280400, // 007B CALL R10 2 + 0x5828000E, // 007C LDCONST R10 K14 + 0x602C0010, // 007D GETGBL R11 G16 + 0x8C30011A, // 007E GETMET R12 R0 K26 + 0x5C380C00, // 007F MOVE R14 R6 + 0x7C300400, // 0080 CALL R12 2 + 0x7C2C0200, // 0081 CALL R11 1 + 0xA802000B, // 0082 EXBLK 0 #008F + 0x5C301600, // 0083 MOVE R12 R11 + 0x7C300000, // 0084 CALL R12 0 + 0x1C341914, // 0085 EQ R13 R12 K20 + 0x78360000, // 0086 JMPF R13 #0088 + 0x7001FFFA, // 0087 JMP #0083 + 0x8C34050B, // 0088 GETMET R13 R2 K11 + 0x583C001B, // 0089 LDCONST R15 K27 + 0x5C401800, // 008A MOVE R16 R12 + 0x94440C0C, // 008B GETIDX R17 R6 R12 + 0x7C340800, // 008C CALL R13 4 + 0x0028140D, // 008D ADD R10 R10 R13 + 0x7001FFF3, // 008E JMP #0083 + 0x582C001C, // 008F LDCONST R11 K28 + 0xAC2C0200, // 0090 CATCH R11 1 0 + 0xB0080000, // 0091 RAISE 2 R0 R0 + 0xB82E0400, // 0092 GETNGBL R11 K2 + 0x8C2C1703, // 0093 GETMET R11 R11 K3 + 0x8C34050B, // 0094 GETMET R13 R2 K11 + 0x583C000C, // 0095 LDCONST R15 K12 + 0x5C400A00, // 0096 MOVE R16 R5 + 0x5C440E00, // 0097 MOVE R17 R7 + 0x5C481400, // 0098 MOVE R18 R10 + 0x7C340A00, // 0099 CALL R13 5 + 0x5838000F, // 009A LDCONST R14 K15 + 0x7C2C0600, // 009B CALL R11 3 + 0xA8040001, // 009C EXBLK 1 1 + 0x70020010, // 009D JMP #00AF + 0xAC180002, // 009E CATCH R6 0 2 + 0x7002000D, // 009F JMP #00AE + 0xB8220400, // 00A0 GETNGBL R8 K2 + 0x8C201103, // 00A1 GETMET R8 R8 K3 + 0x60280008, // 00A2 GETGBL R10 G8 + 0x5C2C0C00, // 00A3 MOVE R11 R6 + 0x7C280200, // 00A4 CALL R10 1 + 0x002A3A0A, // 00A5 ADD R10 K29 R10 + 0x0028151E, // 00A6 ADD R10 R10 K30 + 0x602C0008, // 00A7 GETGBL R11 G8 + 0x5C300E00, // 00A8 MOVE R12 R7 + 0x7C2C0200, // 00A9 CALL R11 1 + 0x0028140B, // 00AA ADD R10 R10 R11 + 0x582C000F, // 00AB LDCONST R11 K15 + 0x7C200600, // 00AC CALL R8 3 + 0x70020000, // 00AD JMP #00AF + 0xB0080000, // 00AE RAISE 2 R0 R0 + 0x7001FF87, // 00AF JMP #0038 + 0x5810001C, // 00B0 LDCONST R4 K28 + 0xAC100200, // 00B1 CATCH R4 1 0 + 0xB0080000, // 00B2 RAISE 2 R0 R0 + 0xB8120400, // 00B3 GETNGBL R4 K2 + 0x8C10091F, // 00B4 GETMET R4 R4 K31 + 0x58180020, // 00B5 LDCONST R6 K32 + 0x581C0021, // 00B6 LDCONST R7 K33 + 0x7C100600, // 00B7 CALL R4 3 + 0x80000000, // 00B8 RET 0 }) ) ); @@ -4034,406 +4093,400 @@ be_local_closure(Matter_Device_autoconf_device_map, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[53]) { /* constants */ + ( &(const bvalue[51]) { /* constants */ /* K0 */ be_nested_str_weak(string), /* K1 */ be_nested_str_weak(json), - /* K2 */ be_nested_str_weak(0), - /* K3 */ be_nested_str_weak(type), - /* K4 */ be_nested_str_weak(root), - /* K5 */ be_const_int(1), - /* K6 */ be_nested_str_weak(light), - /* K7 */ be_nested_str_weak(get), - /* K8 */ be_nested_str_weak(find), - /* K9 */ be_nested_str_weak(channels), - /* K10 */ be_nested_str_weak(), - /* K11 */ be_const_int(0), - /* K12 */ be_nested_str_weak(light1), - /* K13 */ be_const_int(2), - /* K14 */ be_nested_str_weak(light2), - /* K15 */ be_nested_str_weak(light3), - /* K16 */ be_nested_str_weak(tasmota), - /* K17 */ be_nested_str_weak(cmd), - /* K18 */ be_nested_str_weak(Status_X2013), - /* K19 */ be_nested_str_weak(log), - /* K20 */ be_nested_str_weak(MTR_X3A_X20Status_X2013_X20_X3D_X20), - /* K21 */ be_const_int(3), - /* K22 */ be_nested_str_weak(contains), - /* K23 */ be_nested_str_weak(StatusSHT), - /* K24 */ be_nested_str_weak(SHT), - /* K25 */ be_nested_str_weak(format), - /* K26 */ be_nested_str_weak(MTR_X3A_X20_X27_X25s_X27_X20_X3D_X20_X25s), - /* K27 */ be_nested_str_weak(Relay1), - /* K28 */ be_nested_str_weak(Relay2), - /* K29 */ be_nested_str_weak(push), - /* K30 */ be_nested_str_weak(MTR_X3A_X20relay1_X20_X3D_X20_X25s_X2C_X20relay2_X20_X3D_X20_X25s), - /* K31 */ be_nested_str_weak(TiltConfig), - /* K32 */ be_nested_str_weak(shutter_X2Btilt), - /* K33 */ be_nested_str_weak(shutter), - /* K34 */ be_nested_str_weak(get_power), - /* K35 */ be_nested_str_weak(relay), - /* K36 */ be_nested_str_weak(load), - /* K37 */ be_nested_str_weak(read_sensors), - /* K38 */ be_nested_str_weak(k2l), - /* K39 */ be_nested_str_weak(Temperature), - /* K40 */ be_nested_str_weak(_X23Temperature), - /* K41 */ be_nested_str_weak(temperature), - /* K42 */ be_nested_str_weak(filter), - /* K43 */ be_nested_str_weak(stop_iteration), - /* K44 */ be_nested_str_weak(Pressure), - /* K45 */ be_nested_str_weak(_X23Pressure), - /* K46 */ be_nested_str_weak(pressure), - /* K47 */ be_nested_str_weak(Illuminance), - /* K48 */ be_nested_str_weak(_X23Illuminance), - /* K49 */ be_nested_str_weak(illuminance), - /* K50 */ be_nested_str_weak(Humidity), - /* K51 */ be_nested_str_weak(_X23Humidity), - /* K52 */ be_nested_str_weak(humidity), + /* K2 */ be_const_int(1), + /* K3 */ be_nested_str_weak(light), + /* K4 */ be_nested_str_weak(get), + /* K5 */ be_nested_str_weak(find), + /* K6 */ be_nested_str_weak(channels), + /* K7 */ be_nested_str_weak(), + /* K8 */ be_const_int(0), + /* K9 */ be_nested_str_weak(type), + /* K10 */ be_nested_str_weak(light1), + /* K11 */ be_const_int(2), + /* K12 */ be_nested_str_weak(light2), + /* K13 */ be_nested_str_weak(light3), + /* K14 */ be_nested_str_weak(tasmota), + /* K15 */ be_nested_str_weak(cmd), + /* K16 */ be_nested_str_weak(Status_X2013), + /* K17 */ be_nested_str_weak(log), + /* K18 */ be_nested_str_weak(MTR_X3A_X20Status_X2013_X20_X3D_X20), + /* K19 */ be_const_int(3), + /* K20 */ be_nested_str_weak(contains), + /* K21 */ be_nested_str_weak(StatusSHT), + /* K22 */ be_nested_str_weak(SHT), + /* K23 */ be_nested_str_weak(format), + /* K24 */ be_nested_str_weak(MTR_X3A_X20_X27_X25s_X27_X20_X3D_X20_X25s), + /* K25 */ be_nested_str_weak(Relay1), + /* K26 */ be_nested_str_weak(Relay2), + /* K27 */ be_nested_str_weak(push), + /* K28 */ be_nested_str_weak(MTR_X3A_X20relay1_X20_X3D_X20_X25s_X2C_X20relay2_X20_X3D_X20_X25s), + /* K29 */ be_nested_str_weak(TiltConfig), + /* K30 */ be_nested_str_weak(shutter_X2Btilt), + /* K31 */ be_nested_str_weak(shutter), + /* K32 */ be_nested_str_weak(get_power), + /* K33 */ be_nested_str_weak(relay), + /* K34 */ be_nested_str_weak(load), + /* K35 */ be_nested_str_weak(read_sensors), + /* K36 */ be_nested_str_weak(k2l), + /* K37 */ be_nested_str_weak(Temperature), + /* K38 */ be_nested_str_weak(_X23Temperature), + /* K39 */ be_nested_str_weak(temperature), + /* K40 */ be_nested_str_weak(filter), + /* K41 */ be_nested_str_weak(stop_iteration), + /* K42 */ be_nested_str_weak(Pressure), + /* K43 */ be_nested_str_weak(_X23Pressure), + /* K44 */ be_nested_str_weak(pressure), + /* K45 */ be_nested_str_weak(Illuminance), + /* K46 */ be_nested_str_weak(_X23Illuminance), + /* K47 */ be_nested_str_weak(illuminance), + /* K48 */ be_nested_str_weak(Humidity), + /* K49 */ be_nested_str_weak(_X23Humidity), + /* K50 */ be_nested_str_weak(humidity), }), be_str_weak(autoconf_device_map), &be_const_str_solidified, - ( &(const binstruction[342]) { /* code */ + ( &(const binstruction[338]) { /* code */ 0xA4060000, // 0000 IMPORT R1 K0 0xA40A0200, // 0001 IMPORT R2 K1 0x600C0013, // 0002 GETGBL R3 G19 0x7C0C0000, // 0003 CALL R3 0 - 0x60100013, // 0004 GETGBL R4 G19 - 0x7C100000, // 0005 CALL R4 0 - 0x98120704, // 0006 SETIDX R4 K3 K4 - 0x980E0404, // 0007 SETIDX R3 K2 R4 - 0x58100005, // 0008 LDCONST R4 K5 - 0x50140000, // 0009 LDBOOL R5 0 0 - 0xA41A0C00, // 000A IMPORT R6 K6 - 0x8C1C0D07, // 000B GETMET R7 R6 K7 - 0x7C1C0200, // 000C CALL R7 1 - 0x4C200000, // 000D LDNIL R8 - 0x20200E08, // 000E NE R8 R7 R8 - 0x78220024, // 000F JMPF R8 #0035 - 0x6020000C, // 0010 GETGBL R8 G12 - 0x8C240F08, // 0011 GETMET R9 R7 K8 - 0x582C0009, // 0012 LDCONST R11 K9 - 0x5830000A, // 0013 LDCONST R12 K10 - 0x7C240600, // 0014 CALL R9 3 - 0x7C200200, // 0015 CALL R8 1 - 0x2424110B, // 0016 GT R9 R8 K11 - 0x7826001C, // 0017 JMPF R9 #0035 - 0x1C241105, // 0018 EQ R9 R8 K5 - 0x78260007, // 0019 JMPF R9 #0022 - 0x60240008, // 001A GETGBL R9 G8 - 0x5C280800, // 001B MOVE R10 R4 - 0x7C240200, // 001C CALL R9 1 - 0x60280013, // 001D GETGBL R10 G19 - 0x7C280000, // 001E CALL R10 0 - 0x982A070C, // 001F SETIDX R10 K3 K12 - 0x980C120A, // 0020 SETIDX R3 R9 R10 - 0x70020010, // 0021 JMP #0033 - 0x1C24110D, // 0022 EQ R9 R8 K13 - 0x78260007, // 0023 JMPF R9 #002C - 0x60240008, // 0024 GETGBL R9 G8 - 0x5C280800, // 0025 MOVE R10 R4 - 0x7C240200, // 0026 CALL R9 1 - 0x60280013, // 0027 GETGBL R10 G19 - 0x7C280000, // 0028 CALL R10 0 - 0x982A070E, // 0029 SETIDX R10 K3 K14 - 0x980C120A, // 002A SETIDX R3 R9 R10 - 0x70020006, // 002B JMP #0033 - 0x60240008, // 002C GETGBL R9 G8 - 0x5C280800, // 002D MOVE R10 R4 - 0x7C240200, // 002E CALL R9 1 - 0x60280013, // 002F GETGBL R10 G19 - 0x7C280000, // 0030 CALL R10 0 - 0x982A070F, // 0031 SETIDX R10 K3 K15 - 0x980C120A, // 0032 SETIDX R3 R9 R10 - 0x50140200, // 0033 LDBOOL R5 1 0 - 0x00100905, // 0034 ADD R4 R4 K5 - 0xB8222000, // 0035 GETNGBL R8 K16 - 0x8C201111, // 0036 GETMET R8 R8 K17 - 0x58280012, // 0037 LDCONST R10 K18 - 0x502C0200, // 0038 LDBOOL R11 1 0 - 0x7C200600, // 0039 CALL R8 3 - 0x60240012, // 003A GETGBL R9 G18 - 0x7C240000, // 003B CALL R9 0 - 0xB82A2000, // 003C GETNGBL R10 K16 - 0x8C281513, // 003D GETMET R10 R10 K19 - 0x60300008, // 003E GETGBL R12 G8 - 0x5C341000, // 003F MOVE R13 R8 - 0x7C300200, // 0040 CALL R12 1 - 0x0032280C, // 0041 ADD R12 K20 R12 - 0x58340015, // 0042 LDCONST R13 K21 - 0x7C280600, // 0043 CALL R10 3 - 0x4C280000, // 0044 LDNIL R10 - 0x2028100A, // 0045 NE R10 R8 R10 - 0x782A0051, // 0046 JMPF R10 #0099 - 0x8C281116, // 0047 GETMET R10 R8 K22 - 0x58300017, // 0048 LDCONST R12 K23 - 0x7C280400, // 0049 CALL R10 2 - 0x782A004D, // 004A JMPF R10 #0099 - 0x94201117, // 004B GETIDX R8 R8 K23 - 0x5828000B, // 004C LDCONST R10 K11 - 0x502C0200, // 004D LDBOOL R11 1 0 - 0x782E0049, // 004E JMPF R11 #0099 - 0x602C0008, // 004F GETGBL R11 G8 - 0x5C301400, // 0050 MOVE R12 R10 - 0x7C2C0200, // 0051 CALL R11 1 - 0x002E300B, // 0052 ADD R11 K24 R11 - 0x8C301116, // 0053 GETMET R12 R8 K22 - 0x5C381600, // 0054 MOVE R14 R11 - 0x7C300400, // 0055 CALL R12 2 - 0x74320000, // 0056 JMPT R12 #0058 - 0x70020040, // 0057 JMP #0099 - 0x9430100B, // 0058 GETIDX R12 R8 R11 - 0xB8362000, // 0059 GETNGBL R13 K16 - 0x8C341B13, // 005A GETMET R13 R13 K19 - 0x8C3C0319, // 005B GETMET R15 R1 K25 - 0x5844001A, // 005C LDCONST R17 K26 - 0x5C481600, // 005D MOVE R18 R11 - 0x604C0008, // 005E GETGBL R19 G8 - 0x5C501800, // 005F MOVE R20 R12 - 0x7C4C0200, // 0060 CALL R19 1 - 0x7C3C0800, // 0061 CALL R15 4 - 0x58400015, // 0062 LDCONST R16 K21 + 0x58100002, // 0004 LDCONST R4 K2 + 0x50140000, // 0005 LDBOOL R5 0 0 + 0xA41A0600, // 0006 IMPORT R6 K3 + 0x8C1C0D04, // 0007 GETMET R7 R6 K4 + 0x7C1C0200, // 0008 CALL R7 1 + 0x4C200000, // 0009 LDNIL R8 + 0x20200E08, // 000A NE R8 R7 R8 + 0x78220024, // 000B JMPF R8 #0031 + 0x6020000C, // 000C GETGBL R8 G12 + 0x8C240F05, // 000D GETMET R9 R7 K5 + 0x582C0006, // 000E LDCONST R11 K6 + 0x58300007, // 000F LDCONST R12 K7 + 0x7C240600, // 0010 CALL R9 3 + 0x7C200200, // 0011 CALL R8 1 + 0x24241108, // 0012 GT R9 R8 K8 + 0x7826001C, // 0013 JMPF R9 #0031 + 0x1C241102, // 0014 EQ R9 R8 K2 + 0x78260007, // 0015 JMPF R9 #001E + 0x60240008, // 0016 GETGBL R9 G8 + 0x5C280800, // 0017 MOVE R10 R4 + 0x7C240200, // 0018 CALL R9 1 + 0x60280013, // 0019 GETGBL R10 G19 + 0x7C280000, // 001A CALL R10 0 + 0x982A130A, // 001B SETIDX R10 K9 K10 + 0x980C120A, // 001C SETIDX R3 R9 R10 + 0x70020010, // 001D JMP #002F + 0x1C24110B, // 001E EQ R9 R8 K11 + 0x78260007, // 001F JMPF R9 #0028 + 0x60240008, // 0020 GETGBL R9 G8 + 0x5C280800, // 0021 MOVE R10 R4 + 0x7C240200, // 0022 CALL R9 1 + 0x60280013, // 0023 GETGBL R10 G19 + 0x7C280000, // 0024 CALL R10 0 + 0x982A130C, // 0025 SETIDX R10 K9 K12 + 0x980C120A, // 0026 SETIDX R3 R9 R10 + 0x70020006, // 0027 JMP #002F + 0x60240008, // 0028 GETGBL R9 G8 + 0x5C280800, // 0029 MOVE R10 R4 + 0x7C240200, // 002A CALL R9 1 + 0x60280013, // 002B GETGBL R10 G19 + 0x7C280000, // 002C CALL R10 0 + 0x982A130D, // 002D SETIDX R10 K9 K13 + 0x980C120A, // 002E SETIDX R3 R9 R10 + 0x50140200, // 002F LDBOOL R5 1 0 + 0x00100902, // 0030 ADD R4 R4 K2 + 0xB8221C00, // 0031 GETNGBL R8 K14 + 0x8C20110F, // 0032 GETMET R8 R8 K15 + 0x58280010, // 0033 LDCONST R10 K16 + 0x502C0200, // 0034 LDBOOL R11 1 0 + 0x7C200600, // 0035 CALL R8 3 + 0x60240012, // 0036 GETGBL R9 G18 + 0x7C240000, // 0037 CALL R9 0 + 0xB82A1C00, // 0038 GETNGBL R10 K14 + 0x8C281511, // 0039 GETMET R10 R10 K17 + 0x60300008, // 003A GETGBL R12 G8 + 0x5C341000, // 003B MOVE R13 R8 + 0x7C300200, // 003C CALL R12 1 + 0x0032240C, // 003D ADD R12 K18 R12 + 0x58340013, // 003E LDCONST R13 K19 + 0x7C280600, // 003F CALL R10 3 + 0x4C280000, // 0040 LDNIL R10 + 0x2028100A, // 0041 NE R10 R8 R10 + 0x782A0051, // 0042 JMPF R10 #0095 + 0x8C281114, // 0043 GETMET R10 R8 K20 + 0x58300015, // 0044 LDCONST R12 K21 + 0x7C280400, // 0045 CALL R10 2 + 0x782A004D, // 0046 JMPF R10 #0095 + 0x94201115, // 0047 GETIDX R8 R8 K21 + 0x58280008, // 0048 LDCONST R10 K8 + 0x502C0200, // 0049 LDBOOL R11 1 0 + 0x782E0049, // 004A JMPF R11 #0095 + 0x602C0008, // 004B GETGBL R11 G8 + 0x5C301400, // 004C MOVE R12 R10 + 0x7C2C0200, // 004D CALL R11 1 + 0x002E2C0B, // 004E ADD R11 K22 R11 + 0x8C301114, // 004F GETMET R12 R8 K20 + 0x5C381600, // 0050 MOVE R14 R11 + 0x7C300400, // 0051 CALL R12 2 + 0x74320000, // 0052 JMPT R12 #0054 + 0x70020040, // 0053 JMP #0095 + 0x9430100B, // 0054 GETIDX R12 R8 R11 + 0xB8361C00, // 0055 GETNGBL R13 K14 + 0x8C341B11, // 0056 GETMET R13 R13 K17 + 0x8C3C0317, // 0057 GETMET R15 R1 K23 + 0x58440018, // 0058 LDCONST R17 K24 + 0x5C481600, // 0059 MOVE R18 R11 + 0x604C0008, // 005A GETGBL R19 G8 + 0x5C501800, // 005B MOVE R20 R12 + 0x7C4C0200, // 005C CALL R19 1 + 0x7C3C0800, // 005D CALL R15 4 + 0x58400013, // 005E LDCONST R16 K19 + 0x7C340600, // 005F CALL R13 3 + 0x8C341905, // 0060 GETMET R13 R12 K5 + 0x583C0019, // 0061 LDCONST R15 K25 + 0x58400008, // 0062 LDCONST R16 K8 0x7C340600, // 0063 CALL R13 3 - 0x8C341908, // 0064 GETMET R13 R12 K8 - 0x583C001B, // 0065 LDCONST R15 K27 - 0x5840000B, // 0066 LDCONST R16 K11 - 0x7C340600, // 0067 CALL R13 3 - 0x04341B05, // 0068 SUB R13 R13 K5 - 0x8C381908, // 0069 GETMET R14 R12 K8 - 0x5840001C, // 006A LDCONST R16 K28 - 0x5844000B, // 006B LDCONST R17 K11 - 0x7C380600, // 006C CALL R14 3 - 0x04381D05, // 006D SUB R14 R14 K5 - 0x283C1B0B, // 006E GE R15 R13 K11 - 0x783E0002, // 006F JMPF R15 #0073 - 0x8C3C131D, // 0070 GETMET R15 R9 K29 - 0x5C441A00, // 0071 MOVE R17 R13 - 0x7C3C0400, // 0072 CALL R15 2 - 0x283C1D0B, // 0073 GE R15 R14 K11 - 0x783E0002, // 0074 JMPF R15 #0078 - 0x8C3C131D, // 0075 GETMET R15 R9 K29 - 0x5C441C00, // 0076 MOVE R17 R14 - 0x7C3C0400, // 0077 CALL R15 2 - 0xB83E2000, // 0078 GETNGBL R15 K16 - 0x8C3C1F13, // 0079 GETMET R15 R15 K19 - 0x8C440319, // 007A GETMET R17 R1 K25 - 0x584C001E, // 007B LDCONST R19 K30 - 0x5C501A00, // 007C MOVE R20 R13 - 0x5C541C00, // 007D MOVE R21 R14 - 0x7C440800, // 007E CALL R17 4 - 0x58480015, // 007F LDCONST R18 K21 - 0x7C3C0600, // 0080 CALL R15 3 - 0x8C3C1908, // 0081 GETMET R15 R12 K8 - 0x5844001F, // 0082 LDCONST R17 K31 - 0x7C3C0400, // 0083 CALL R15 2 - 0x783E0002, // 0084 JMPF R15 #0088 - 0x94401F0D, // 0085 GETIDX R16 R15 K13 - 0x2440210B, // 0086 GT R16 R16 K11 - 0x74420000, // 0087 JMPT R16 #0089 - 0x50400001, // 0088 LDBOOL R16 0 1 - 0x50400200, // 0089 LDBOOL R16 1 0 - 0x60440008, // 008A GETGBL R17 G8 - 0x5C480800, // 008B MOVE R18 R4 - 0x7C440200, // 008C CALL R17 1 - 0x60480013, // 008D GETGBL R18 G19 - 0x7C480000, // 008E CALL R18 0 - 0x78420001, // 008F JMPF R16 #0092 - 0x584C0020, // 0090 LDCONST R19 K32 - 0x70020000, // 0091 JMP #0093 - 0x584C0021, // 0092 LDCONST R19 K33 - 0x984A0613, // 0093 SETIDX R18 K3 R19 - 0x984A420A, // 0094 SETIDX R18 K33 R10 - 0x980C2212, // 0095 SETIDX R3 R17 R18 - 0x00100905, // 0096 ADD R4 R4 K5 - 0x00281505, // 0097 ADD R10 R10 K5 - 0x7001FFB3, // 0098 JMP #004D - 0x6028000C, // 0099 GETGBL R10 G12 - 0xB82E2000, // 009A GETNGBL R11 K16 - 0x8C2C1722, // 009B GETMET R11 R11 K34 - 0x7C2C0200, // 009C CALL R11 1 - 0x7C280200, // 009D CALL R10 1 - 0x582C000B, // 009E LDCONST R11 K11 - 0x78160000, // 009F JMPF R5 #00A1 - 0x04281505, // 00A0 SUB R10 R10 K5 - 0x1430160A, // 00A1 LT R12 R11 R10 - 0x78320010, // 00A2 JMPF R12 #00B4 - 0x8C301308, // 00A3 GETMET R12 R9 K8 - 0x5C381600, // 00A4 MOVE R14 R11 - 0x7C300400, // 00A5 CALL R12 2 - 0x4C340000, // 00A6 LDNIL R13 - 0x1C30180D, // 00A7 EQ R12 R12 R13 - 0x78320008, // 00A8 JMPF R12 #00B2 - 0x60300008, // 00A9 GETGBL R12 G8 - 0x5C340800, // 00AA MOVE R13 R4 - 0x7C300200, // 00AB CALL R12 1 - 0x60340013, // 00AC GETGBL R13 G19 - 0x7C340000, // 00AD CALL R13 0 - 0x98360723, // 00AE SETIDX R13 K3 K35 - 0x9836460B, // 00AF SETIDX R13 K35 R11 - 0x980C180D, // 00B0 SETIDX R3 R12 R13 - 0x00100905, // 00B1 ADD R4 R4 K5 - 0x002C1705, // 00B2 ADD R11 R11 K5 - 0x7001FFEC, // 00B3 JMP #00A1 - 0x8C300524, // 00B4 GETMET R12 R2 K36 - 0xB83A2000, // 00B5 GETNGBL R14 K16 - 0x8C381D25, // 00B6 GETMET R14 R14 K37 - 0x7C380200, // 00B7 CALL R14 1 - 0x7C300400, // 00B8 CALL R12 2 - 0x5412001F, // 00B9 LDINT R4 32 - 0x60340010, // 00BA GETGBL R13 G16 - 0x8C380126, // 00BB GETMET R14 R0 K38 - 0x5C401800, // 00BC MOVE R16 R12 - 0x7C380400, // 00BD CALL R14 2 - 0x7C340200, // 00BE CALL R13 1 - 0xA802001C, // 00BF EXBLK 0 #00DD - 0x5C381A00, // 00C0 MOVE R14 R13 - 0x7C380000, // 00C1 CALL R14 0 - 0x943C180E, // 00C2 GETIDX R15 R12 R14 - 0x6040000F, // 00C3 GETGBL R16 G15 - 0x5C441E00, // 00C4 MOVE R17 R15 - 0x60480013, // 00C5 GETGBL R18 G19 + 0x04341B02, // 0064 SUB R13 R13 K2 + 0x8C381905, // 0065 GETMET R14 R12 K5 + 0x5840001A, // 0066 LDCONST R16 K26 + 0x58440008, // 0067 LDCONST R17 K8 + 0x7C380600, // 0068 CALL R14 3 + 0x04381D02, // 0069 SUB R14 R14 K2 + 0x283C1B08, // 006A GE R15 R13 K8 + 0x783E0002, // 006B JMPF R15 #006F + 0x8C3C131B, // 006C GETMET R15 R9 K27 + 0x5C441A00, // 006D MOVE R17 R13 + 0x7C3C0400, // 006E CALL R15 2 + 0x283C1D08, // 006F GE R15 R14 K8 + 0x783E0002, // 0070 JMPF R15 #0074 + 0x8C3C131B, // 0071 GETMET R15 R9 K27 + 0x5C441C00, // 0072 MOVE R17 R14 + 0x7C3C0400, // 0073 CALL R15 2 + 0xB83E1C00, // 0074 GETNGBL R15 K14 + 0x8C3C1F11, // 0075 GETMET R15 R15 K17 + 0x8C440317, // 0076 GETMET R17 R1 K23 + 0x584C001C, // 0077 LDCONST R19 K28 + 0x5C501A00, // 0078 MOVE R20 R13 + 0x5C541C00, // 0079 MOVE R21 R14 + 0x7C440800, // 007A CALL R17 4 + 0x58480013, // 007B LDCONST R18 K19 + 0x7C3C0600, // 007C CALL R15 3 + 0x8C3C1905, // 007D GETMET R15 R12 K5 + 0x5844001D, // 007E LDCONST R17 K29 + 0x7C3C0400, // 007F CALL R15 2 + 0x783E0002, // 0080 JMPF R15 #0084 + 0x94401F0B, // 0081 GETIDX R16 R15 K11 + 0x24402108, // 0082 GT R16 R16 K8 + 0x74420000, // 0083 JMPT R16 #0085 + 0x50400001, // 0084 LDBOOL R16 0 1 + 0x50400200, // 0085 LDBOOL R16 1 0 + 0x60440008, // 0086 GETGBL R17 G8 + 0x5C480800, // 0087 MOVE R18 R4 + 0x7C440200, // 0088 CALL R17 1 + 0x60480013, // 0089 GETGBL R18 G19 + 0x7C480000, // 008A CALL R18 0 + 0x78420001, // 008B JMPF R16 #008E + 0x584C001E, // 008C LDCONST R19 K30 + 0x70020000, // 008D JMP #008F + 0x584C001F, // 008E LDCONST R19 K31 + 0x984A1213, // 008F SETIDX R18 K9 R19 + 0x984A3E0A, // 0090 SETIDX R18 K31 R10 + 0x980C2212, // 0091 SETIDX R3 R17 R18 + 0x00100902, // 0092 ADD R4 R4 K2 + 0x00281502, // 0093 ADD R10 R10 K2 + 0x7001FFB3, // 0094 JMP #0049 + 0x6028000C, // 0095 GETGBL R10 G12 + 0xB82E1C00, // 0096 GETNGBL R11 K14 + 0x8C2C1720, // 0097 GETMET R11 R11 K32 + 0x7C2C0200, // 0098 CALL R11 1 + 0x7C280200, // 0099 CALL R10 1 + 0x582C0008, // 009A LDCONST R11 K8 + 0x78160000, // 009B JMPF R5 #009D + 0x04281502, // 009C SUB R10 R10 K2 + 0x1430160A, // 009D LT R12 R11 R10 + 0x78320010, // 009E JMPF R12 #00B0 + 0x8C301305, // 009F GETMET R12 R9 K5 + 0x5C381600, // 00A0 MOVE R14 R11 + 0x7C300400, // 00A1 CALL R12 2 + 0x4C340000, // 00A2 LDNIL R13 + 0x1C30180D, // 00A3 EQ R12 R12 R13 + 0x78320008, // 00A4 JMPF R12 #00AE + 0x60300008, // 00A5 GETGBL R12 G8 + 0x5C340800, // 00A6 MOVE R13 R4 + 0x7C300200, // 00A7 CALL R12 1 + 0x60340013, // 00A8 GETGBL R13 G19 + 0x7C340000, // 00A9 CALL R13 0 + 0x98361321, // 00AA SETIDX R13 K9 K33 + 0x9836420B, // 00AB SETIDX R13 K33 R11 + 0x980C180D, // 00AC SETIDX R3 R12 R13 + 0x00100902, // 00AD ADD R4 R4 K2 + 0x002C1702, // 00AE ADD R11 R11 K2 + 0x7001FFEC, // 00AF JMP #009D + 0x8C300522, // 00B0 GETMET R12 R2 K34 + 0xB83A1C00, // 00B1 GETNGBL R14 K14 + 0x8C381D23, // 00B2 GETMET R14 R14 K35 + 0x7C380200, // 00B3 CALL R14 1 + 0x7C300400, // 00B4 CALL R12 2 + 0x5412001F, // 00B5 LDINT R4 32 + 0x60340010, // 00B6 GETGBL R13 G16 + 0x8C380124, // 00B7 GETMET R14 R0 K36 + 0x5C401800, // 00B8 MOVE R16 R12 + 0x7C380400, // 00B9 CALL R14 2 + 0x7C340200, // 00BA CALL R13 1 + 0xA802001C, // 00BB EXBLK 0 #00D9 + 0x5C381A00, // 00BC MOVE R14 R13 + 0x7C380000, // 00BD CALL R14 0 + 0x943C180E, // 00BE GETIDX R15 R12 R14 + 0x6040000F, // 00BF GETGBL R16 G15 + 0x5C441E00, // 00C0 MOVE R17 R15 + 0x60480013, // 00C1 GETGBL R18 G19 + 0x7C400400, // 00C2 CALL R16 2 + 0x7842000D, // 00C3 JMPF R16 #00D2 + 0x8C401F14, // 00C4 GETMET R16 R15 K20 + 0x58480025, // 00C5 LDCONST R18 K37 0x7C400400, // 00C6 CALL R16 2 - 0x7842000D, // 00C7 JMPF R16 #00D6 - 0x8C401F16, // 00C8 GETMET R16 R15 K22 - 0x58480027, // 00C9 LDCONST R18 K39 - 0x7C400400, // 00CA CALL R16 2 - 0x78420009, // 00CB JMPF R16 #00D6 - 0x00401D28, // 00CC ADD R16 R14 K40 - 0x60440008, // 00CD GETGBL R17 G8 - 0x5C480800, // 00CE MOVE R18 R4 - 0x7C440200, // 00CF CALL R17 1 - 0x60480013, // 00D0 GETGBL R18 G19 - 0x7C480000, // 00D1 CALL R18 0 - 0x984A0729, // 00D2 SETIDX R18 K3 K41 - 0x984A5410, // 00D3 SETIDX R18 K42 R16 - 0x980C2212, // 00D4 SETIDX R3 R17 R18 - 0x00100905, // 00D5 ADD R4 R4 K5 - 0x54420027, // 00D6 LDINT R16 40 - 0x24400810, // 00D7 GT R16 R4 R16 - 0x78420000, // 00D8 JMPF R16 #00DA - 0x70020000, // 00D9 JMP #00DB - 0x7001FFE4, // 00DA JMP #00C0 - 0xA8040001, // 00DB EXBLK 1 1 - 0x70020002, // 00DC JMP #00E0 - 0x5834002B, // 00DD LDCONST R13 K43 - 0xAC340200, // 00DE CATCH R13 1 0 - 0xB0080000, // 00DF RAISE 2 R0 R0 - 0x54120027, // 00E0 LDINT R4 40 - 0x60340010, // 00E1 GETGBL R13 G16 - 0x8C380126, // 00E2 GETMET R14 R0 K38 - 0x5C401800, // 00E3 MOVE R16 R12 - 0x7C380400, // 00E4 CALL R14 2 - 0x7C340200, // 00E5 CALL R13 1 - 0xA802001C, // 00E6 EXBLK 0 #0104 - 0x5C381A00, // 00E7 MOVE R14 R13 - 0x7C380000, // 00E8 CALL R14 0 - 0x943C180E, // 00E9 GETIDX R15 R12 R14 - 0x6040000F, // 00EA GETGBL R16 G15 - 0x5C441E00, // 00EB MOVE R17 R15 - 0x60480013, // 00EC GETGBL R18 G19 + 0x78420009, // 00C7 JMPF R16 #00D2 + 0x00401D26, // 00C8 ADD R16 R14 K38 + 0x60440008, // 00C9 GETGBL R17 G8 + 0x5C480800, // 00CA MOVE R18 R4 + 0x7C440200, // 00CB CALL R17 1 + 0x60480013, // 00CC GETGBL R18 G19 + 0x7C480000, // 00CD CALL R18 0 + 0x984A1327, // 00CE SETIDX R18 K9 K39 + 0x984A5010, // 00CF SETIDX R18 K40 R16 + 0x980C2212, // 00D0 SETIDX R3 R17 R18 + 0x00100902, // 00D1 ADD R4 R4 K2 + 0x54420027, // 00D2 LDINT R16 40 + 0x24400810, // 00D3 GT R16 R4 R16 + 0x78420000, // 00D4 JMPF R16 #00D6 + 0x70020000, // 00D5 JMP #00D7 + 0x7001FFE4, // 00D6 JMP #00BC + 0xA8040001, // 00D7 EXBLK 1 1 + 0x70020002, // 00D8 JMP #00DC + 0x58340029, // 00D9 LDCONST R13 K41 + 0xAC340200, // 00DA CATCH R13 1 0 + 0xB0080000, // 00DB RAISE 2 R0 R0 + 0x54120027, // 00DC LDINT R4 40 + 0x60340010, // 00DD GETGBL R13 G16 + 0x8C380124, // 00DE GETMET R14 R0 K36 + 0x5C401800, // 00DF MOVE R16 R12 + 0x7C380400, // 00E0 CALL R14 2 + 0x7C340200, // 00E1 CALL R13 1 + 0xA802001C, // 00E2 EXBLK 0 #0100 + 0x5C381A00, // 00E3 MOVE R14 R13 + 0x7C380000, // 00E4 CALL R14 0 + 0x943C180E, // 00E5 GETIDX R15 R12 R14 + 0x6040000F, // 00E6 GETGBL R16 G15 + 0x5C441E00, // 00E7 MOVE R17 R15 + 0x60480013, // 00E8 GETGBL R18 G19 + 0x7C400400, // 00E9 CALL R16 2 + 0x7842000D, // 00EA JMPF R16 #00F9 + 0x8C401F14, // 00EB GETMET R16 R15 K20 + 0x5848002A, // 00EC LDCONST R18 K42 0x7C400400, // 00ED CALL R16 2 - 0x7842000D, // 00EE JMPF R16 #00FD - 0x8C401F16, // 00EF GETMET R16 R15 K22 - 0x5848002C, // 00F0 LDCONST R18 K44 - 0x7C400400, // 00F1 CALL R16 2 - 0x78420009, // 00F2 JMPF R16 #00FD - 0x00401D2D, // 00F3 ADD R16 R14 K45 - 0x60440008, // 00F4 GETGBL R17 G8 - 0x5C480800, // 00F5 MOVE R18 R4 - 0x7C440200, // 00F6 CALL R17 1 - 0x60480013, // 00F7 GETGBL R18 G19 - 0x7C480000, // 00F8 CALL R18 0 - 0x984A072E, // 00F9 SETIDX R18 K3 K46 - 0x984A5410, // 00FA SETIDX R18 K42 R16 - 0x980C2212, // 00FB SETIDX R3 R17 R18 - 0x00100905, // 00FC ADD R4 R4 K5 - 0x5442002E, // 00FD LDINT R16 47 - 0x24400810, // 00FE GT R16 R4 R16 - 0x78420000, // 00FF JMPF R16 #0101 - 0x70020000, // 0100 JMP #0102 - 0x7001FFE4, // 0101 JMP #00E7 - 0xA8040001, // 0102 EXBLK 1 1 - 0x70020002, // 0103 JMP #0107 - 0x5834002B, // 0104 LDCONST R13 K43 - 0xAC340200, // 0105 CATCH R13 1 0 - 0xB0080000, // 0106 RAISE 2 R0 R0 - 0x5412002F, // 0107 LDINT R4 48 - 0x60340010, // 0108 GETGBL R13 G16 - 0x8C380126, // 0109 GETMET R14 R0 K38 - 0x5C401800, // 010A MOVE R16 R12 - 0x7C380400, // 010B CALL R14 2 - 0x7C340200, // 010C CALL R13 1 - 0xA802001C, // 010D EXBLK 0 #012B - 0x5C381A00, // 010E MOVE R14 R13 - 0x7C380000, // 010F CALL R14 0 - 0x943C180E, // 0110 GETIDX R15 R12 R14 - 0x6040000F, // 0111 GETGBL R16 G15 - 0x5C441E00, // 0112 MOVE R17 R15 - 0x60480013, // 0113 GETGBL R18 G19 + 0x78420009, // 00EE JMPF R16 #00F9 + 0x00401D2B, // 00EF ADD R16 R14 K43 + 0x60440008, // 00F0 GETGBL R17 G8 + 0x5C480800, // 00F1 MOVE R18 R4 + 0x7C440200, // 00F2 CALL R17 1 + 0x60480013, // 00F3 GETGBL R18 G19 + 0x7C480000, // 00F4 CALL R18 0 + 0x984A132C, // 00F5 SETIDX R18 K9 K44 + 0x984A5010, // 00F6 SETIDX R18 K40 R16 + 0x980C2212, // 00F7 SETIDX R3 R17 R18 + 0x00100902, // 00F8 ADD R4 R4 K2 + 0x5442002E, // 00F9 LDINT R16 47 + 0x24400810, // 00FA GT R16 R4 R16 + 0x78420000, // 00FB JMPF R16 #00FD + 0x70020000, // 00FC JMP #00FE + 0x7001FFE4, // 00FD JMP #00E3 + 0xA8040001, // 00FE EXBLK 1 1 + 0x70020002, // 00FF JMP #0103 + 0x58340029, // 0100 LDCONST R13 K41 + 0xAC340200, // 0101 CATCH R13 1 0 + 0xB0080000, // 0102 RAISE 2 R0 R0 + 0x5412002F, // 0103 LDINT R4 48 + 0x60340010, // 0104 GETGBL R13 G16 + 0x8C380124, // 0105 GETMET R14 R0 K36 + 0x5C401800, // 0106 MOVE R16 R12 + 0x7C380400, // 0107 CALL R14 2 + 0x7C340200, // 0108 CALL R13 1 + 0xA802001C, // 0109 EXBLK 0 #0127 + 0x5C381A00, // 010A MOVE R14 R13 + 0x7C380000, // 010B CALL R14 0 + 0x943C180E, // 010C GETIDX R15 R12 R14 + 0x6040000F, // 010D GETGBL R16 G15 + 0x5C441E00, // 010E MOVE R17 R15 + 0x60480013, // 010F GETGBL R18 G19 + 0x7C400400, // 0110 CALL R16 2 + 0x7842000D, // 0111 JMPF R16 #0120 + 0x8C401F14, // 0112 GETMET R16 R15 K20 + 0x5848002D, // 0113 LDCONST R18 K45 0x7C400400, // 0114 CALL R16 2 - 0x7842000D, // 0115 JMPF R16 #0124 - 0x8C401F16, // 0116 GETMET R16 R15 K22 - 0x5848002F, // 0117 LDCONST R18 K47 - 0x7C400400, // 0118 CALL R16 2 - 0x78420009, // 0119 JMPF R16 #0124 - 0x00401D30, // 011A ADD R16 R14 K48 - 0x60440008, // 011B GETGBL R17 G8 - 0x5C480800, // 011C MOVE R18 R4 - 0x7C440200, // 011D CALL R17 1 - 0x60480013, // 011E GETGBL R18 G19 - 0x7C480000, // 011F CALL R18 0 - 0x984A0731, // 0120 SETIDX R18 K3 K49 - 0x984A5410, // 0121 SETIDX R18 K42 R16 - 0x980C2212, // 0122 SETIDX R3 R17 R18 - 0x00100905, // 0123 ADD R4 R4 K5 - 0x54420037, // 0124 LDINT R16 56 - 0x24400810, // 0125 GT R16 R4 R16 - 0x78420000, // 0126 JMPF R16 #0128 - 0x70020000, // 0127 JMP #0129 - 0x7001FFE4, // 0128 JMP #010E - 0xA8040001, // 0129 EXBLK 1 1 - 0x70020002, // 012A JMP #012E - 0x5834002B, // 012B LDCONST R13 K43 - 0xAC340200, // 012C CATCH R13 1 0 - 0xB0080000, // 012D RAISE 2 R0 R0 - 0x54120037, // 012E LDINT R4 56 - 0x60340010, // 012F GETGBL R13 G16 - 0x8C380126, // 0130 GETMET R14 R0 K38 - 0x5C401800, // 0131 MOVE R16 R12 - 0x7C380400, // 0132 CALL R14 2 - 0x7C340200, // 0133 CALL R13 1 - 0xA802001C, // 0134 EXBLK 0 #0152 - 0x5C381A00, // 0135 MOVE R14 R13 - 0x7C380000, // 0136 CALL R14 0 - 0x943C180E, // 0137 GETIDX R15 R12 R14 - 0x6040000F, // 0138 GETGBL R16 G15 - 0x5C441E00, // 0139 MOVE R17 R15 - 0x60480013, // 013A GETGBL R18 G19 + 0x78420009, // 0115 JMPF R16 #0120 + 0x00401D2E, // 0116 ADD R16 R14 K46 + 0x60440008, // 0117 GETGBL R17 G8 + 0x5C480800, // 0118 MOVE R18 R4 + 0x7C440200, // 0119 CALL R17 1 + 0x60480013, // 011A GETGBL R18 G19 + 0x7C480000, // 011B CALL R18 0 + 0x984A132F, // 011C SETIDX R18 K9 K47 + 0x984A5010, // 011D SETIDX R18 K40 R16 + 0x980C2212, // 011E SETIDX R3 R17 R18 + 0x00100902, // 011F ADD R4 R4 K2 + 0x54420037, // 0120 LDINT R16 56 + 0x24400810, // 0121 GT R16 R4 R16 + 0x78420000, // 0122 JMPF R16 #0124 + 0x70020000, // 0123 JMP #0125 + 0x7001FFE4, // 0124 JMP #010A + 0xA8040001, // 0125 EXBLK 1 1 + 0x70020002, // 0126 JMP #012A + 0x58340029, // 0127 LDCONST R13 K41 + 0xAC340200, // 0128 CATCH R13 1 0 + 0xB0080000, // 0129 RAISE 2 R0 R0 + 0x54120037, // 012A LDINT R4 56 + 0x60340010, // 012B GETGBL R13 G16 + 0x8C380124, // 012C GETMET R14 R0 K36 + 0x5C401800, // 012D MOVE R16 R12 + 0x7C380400, // 012E CALL R14 2 + 0x7C340200, // 012F CALL R13 1 + 0xA802001C, // 0130 EXBLK 0 #014E + 0x5C381A00, // 0131 MOVE R14 R13 + 0x7C380000, // 0132 CALL R14 0 + 0x943C180E, // 0133 GETIDX R15 R12 R14 + 0x6040000F, // 0134 GETGBL R16 G15 + 0x5C441E00, // 0135 MOVE R17 R15 + 0x60480013, // 0136 GETGBL R18 G19 + 0x7C400400, // 0137 CALL R16 2 + 0x7842000D, // 0138 JMPF R16 #0147 + 0x8C401F14, // 0139 GETMET R16 R15 K20 + 0x58480030, // 013A LDCONST R18 K48 0x7C400400, // 013B CALL R16 2 - 0x7842000D, // 013C JMPF R16 #014B - 0x8C401F16, // 013D GETMET R16 R15 K22 - 0x58480032, // 013E LDCONST R18 K50 - 0x7C400400, // 013F CALL R16 2 - 0x78420009, // 0140 JMPF R16 #014B - 0x00401D33, // 0141 ADD R16 R14 K51 - 0x60440008, // 0142 GETGBL R17 G8 - 0x5C480800, // 0143 MOVE R18 R4 - 0x7C440200, // 0144 CALL R17 1 - 0x60480013, // 0145 GETGBL R18 G19 - 0x7C480000, // 0146 CALL R18 0 - 0x984A0734, // 0147 SETIDX R18 K3 K52 - 0x984A5410, // 0148 SETIDX R18 K42 R16 - 0x980C2212, // 0149 SETIDX R3 R17 R18 - 0x00100905, // 014A ADD R4 R4 K5 - 0x5442003F, // 014B LDINT R16 64 - 0x24400810, // 014C GT R16 R4 R16 - 0x78420000, // 014D JMPF R16 #014F - 0x70020000, // 014E JMP #0150 - 0x7001FFE4, // 014F JMP #0135 - 0xA8040001, // 0150 EXBLK 1 1 - 0x70020002, // 0151 JMP #0155 - 0x5834002B, // 0152 LDCONST R13 K43 - 0xAC340200, // 0153 CATCH R13 1 0 - 0xB0080000, // 0154 RAISE 2 R0 R0 - 0x80040600, // 0155 RET 1 R3 + 0x78420009, // 013C JMPF R16 #0147 + 0x00401D31, // 013D ADD R16 R14 K49 + 0x60440008, // 013E GETGBL R17 G8 + 0x5C480800, // 013F MOVE R18 R4 + 0x7C440200, // 0140 CALL R17 1 + 0x60480013, // 0141 GETGBL R18 G19 + 0x7C480000, // 0142 CALL R18 0 + 0x984A1332, // 0143 SETIDX R18 K9 K50 + 0x984A5010, // 0144 SETIDX R18 K40 R16 + 0x980C2212, // 0145 SETIDX R3 R17 R18 + 0x00100902, // 0146 ADD R4 R4 K2 + 0x5442003F, // 0147 LDINT R16 64 + 0x24400810, // 0148 GT R16 R4 R16 + 0x78420000, // 0149 JMPF R16 #014B + 0x70020000, // 014A JMP #014C + 0x7001FFE4, // 014B JMP #0131 + 0xA8040001, // 014C EXBLK 1 1 + 0x70020002, // 014D JMP #0151 + 0x58340029, // 014E LDCONST R13 K41 + 0xAC340200, // 014F CATCH R13 1 0 + 0xB0080000, // 0150 RAISE 2 R0 R0 + 0x80040600, // 0151 RET 1 R3 }) ) ); diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin.h index e12baa6a7..505b03178 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin.h @@ -486,7 +486,7 @@ be_local_closure(Matter_Plugin_read_attribute, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[18]) { /* constants */ + ( &(const bvalue[19]) { /* constants */ /* K0 */ be_nested_str_weak(matter), /* K1 */ be_nested_str_weak(TLV), /* K2 */ be_nested_str_weak(cluster), @@ -505,10 +505,11 @@ be_local_closure(Matter_Plugin_read_attribute, /* name */ /* K15 */ be_const_int(2), /* K16 */ be_const_int(3), /* K17 */ be_nested_str_weak(create_TLV), + /* K18 */ be_nested_str_weak(BOOL), }), be_str_weak(read_attribute), &be_const_str_solidified, - ( &(const binstruction[92]) { /* code */ + ( &(const binstruction[104]) { /* code */ 0xB80E0000, // 0000 GETNGBL R3 K0 0x880C0701, // 0001 GETMBR R3 R3 K1 0x88100502, // 0002 GETMBR R4 R2 K2 @@ -597,10 +598,22 @@ be_local_closure(Matter_Plugin_read_attribute, /* name */ 0x5824000B, // 0055 LDCONST R9 K11 0x7C180600, // 0056 CALL R6 3 0x80040C00, // 0057 RET 1 R6 - 0x70020001, // 0058 JMP #005B - 0x4C180000, // 0059 LDNIL R6 - 0x80040C00, // 005A RET 1 R6 - 0x80000000, // 005B RET 0 + 0x7002000D, // 0058 JMP #0067 + 0x541A0038, // 0059 LDINT R6 57 + 0x1C180806, // 005A EQ R6 R4 R6 + 0x781A0008, // 005B JMPF R6 #0065 + 0x541A0010, // 005C LDINT R6 17 + 0x1C180A06, // 005D EQ R6 R5 R6 + 0x781A0004, // 005E JMPF R6 #0064 + 0x8C180711, // 005F GETMET R6 R3 K17 + 0x88200712, // 0060 GETMBR R8 R3 K18 + 0x5824000B, // 0061 LDCONST R9 K11 + 0x7C180600, // 0062 CALL R6 3 + 0x80040C00, // 0063 RET 1 R6 + 0x70020001, // 0064 JMP #0067 + 0x4C180000, // 0065 LDNIL R6 + 0x80040C00, // 0066 RET 1 R6 + 0x80000000, // 0067 RET 0 }) ) ); @@ -886,7 +899,7 @@ be_local_class(Matter_Plugin, { be_const_key_weak(ARG_TYPE, 4), be_const_static_closure(Matter_Plugin__X3Clambda_X3E_closure) }, { be_const_key_weak(update_shadow_lazy, 28), be_const_closure(Matter_Plugin_update_shadow_lazy_closure) }, { be_const_key_weak(CLUSTERS, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { - be_const_map( * be_nested_map(1, + be_const_map( * be_nested_map(2, ( (struct bmapnode*) &(const bmapnode[]) { { be_const_key_int(29, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_list, { be_const_list( * be_nested_list(6, @@ -897,6 +910,11 @@ be_local_class(Matter_Plugin, be_const_int(3), be_const_int(65532), be_const_int(65533), + })) ) } )) }, + { be_const_key_int(57, 0), be_const_simple_instance(be_nested_simple_instance(&be_class_list, { + be_const_list( * be_nested_list(1, + ( (struct bvalue*) &(const bvalue[]) { + be_const_int(17), })) ) } )) }, })) ) } )) }, { be_const_key_weak(subscribe_event, -1), be_const_closure(Matter_Plugin_subscribe_event_closure) }, diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Aggregator.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Aggregator.h new file mode 100644 index 000000000..3cc5a0075 --- /dev/null +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Aggregator.h @@ -0,0 +1,128 @@ +/* Solidification of Matter_Plugin_Aggregator.h */ +/********************************************************************\ +* Generated code, don't edit * +\********************************************************************/ +#include "be_constobj.h" + +extern const bclass be_class_Matter_Plugin_Aggregator; + +/******************************************************************** +** Solidified function: read_attribute +********************************************************************/ +be_local_closure(Matter_Plugin_Aggregator_read_attribute, /* name */ + be_nested_proto( + 16, /* nstack */ + 3, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[13]) { /* constants */ + /* K0 */ be_nested_str_weak(string), + /* K1 */ be_nested_str_weak(matter), + /* K2 */ be_nested_str_weak(TLV), + /* K3 */ be_nested_str_weak(cluster), + /* K4 */ be_nested_str_weak(attribute), + /* K5 */ be_const_int(3), + /* K6 */ be_nested_str_weak(Matter_TLV_array), + /* K7 */ be_nested_str_weak(device), + /* K8 */ be_nested_str_weak(get_active_endpoints), + /* K9 */ be_nested_str_weak(add_TLV), + /* K10 */ be_nested_str_weak(U2), + /* K11 */ be_nested_str_weak(stop_iteration), + /* K12 */ be_nested_str_weak(read_attribute), + }), + be_str_weak(read_attribute), + &be_const_str_solidified, + ( &(const binstruction[54]) { /* code */ + 0xA40E0000, // 0000 IMPORT R3 K0 + 0xB8120200, // 0001 GETNGBL R4 K1 + 0x88100902, // 0002 GETMBR R4 R4 K2 + 0x88140503, // 0003 GETMBR R5 R2 K3 + 0x88180504, // 0004 GETMBR R6 R2 K4 + 0x541E001C, // 0005 LDINT R7 29 + 0x1C1C0A07, // 0006 EQ R7 R5 R7 + 0x781E0024, // 0007 JMPF R7 #002D + 0x1C1C0D05, // 0008 EQ R7 R6 K5 + 0x781E0019, // 0009 JMPF R7 #0024 + 0x8C1C0906, // 000A GETMET R7 R4 K6 + 0x7C1C0200, // 000B CALL R7 1 + 0x88200107, // 000C GETMBR R8 R0 K7 + 0x8C201108, // 000D GETMET R8 R8 K8 + 0x50280200, // 000E LDBOOL R10 1 0 + 0x7C200400, // 000F CALL R8 2 + 0x60240010, // 0010 GETGBL R9 G16 + 0x5C281000, // 0011 MOVE R10 R8 + 0x7C240200, // 0012 CALL R9 1 + 0xA802000A, // 0013 EXBLK 0 #001F + 0x5C281200, // 0014 MOVE R10 R9 + 0x7C280000, // 0015 CALL R10 0 + 0x542EFEFF, // 0016 LDINT R11 65280 + 0x202C140B, // 0017 NE R11 R10 R11 + 0x782E0004, // 0018 JMPF R11 #001E + 0x8C2C0F09, // 0019 GETMET R11 R7 K9 + 0x4C340000, // 001A LDNIL R13 + 0x8838090A, // 001B GETMBR R14 R4 K10 + 0x5C3C1400, // 001C MOVE R15 R10 + 0x7C2C0800, // 001D CALL R11 4 + 0x7001FFF4, // 001E JMP #0014 + 0x5824000B, // 001F LDCONST R9 K11 + 0xAC240200, // 0020 CATCH R9 1 0 + 0xB0080000, // 0021 RAISE 2 R0 R0 + 0x80040E00, // 0022 RET 1 R7 + 0x70020007, // 0023 JMP #002C + 0x601C0003, // 0024 GETGBL R7 G3 + 0x5C200000, // 0025 MOVE R8 R0 + 0x7C1C0200, // 0026 CALL R7 1 + 0x8C1C0F0C, // 0027 GETMET R7 R7 K12 + 0x5C240200, // 0028 MOVE R9 R1 + 0x5C280400, // 0029 MOVE R10 R2 + 0x7C1C0600, // 002A CALL R7 3 + 0x80040E00, // 002B RET 1 R7 + 0x70020007, // 002C JMP #0035 + 0x601C0003, // 002D GETGBL R7 G3 + 0x5C200000, // 002E MOVE R8 R0 + 0x7C1C0200, // 002F CALL R7 1 + 0x8C1C0F0C, // 0030 GETMET R7 R7 K12 + 0x5C240200, // 0031 MOVE R9 R1 + 0x5C280400, // 0032 MOVE R10 R2 + 0x7C1C0600, // 0033 CALL R7 3 + 0x80040E00, // 0034 RET 1 R7 + 0x80000000, // 0035 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified class: Matter_Plugin_Aggregator +********************************************************************/ +extern const bclass be_class_Matter_Plugin; +be_local_class(Matter_Plugin_Aggregator, + 0, + &be_class_Matter_Plugin, + be_nested_map(4, + ( (struct bmapnode*) &(const bmapnode[]) { + { be_const_key_weak(NAME, 3), be_nested_str_weak(Aggregator) }, + { be_const_key_weak(TYPE, -1), be_nested_str_weak(aggregator) }, + { be_const_key_weak(TYPES, 0), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { + be_const_map( * be_nested_map(1, + ( (struct bmapnode*) &(const bmapnode[]) { + { be_const_key_int(14, -1), be_const_int(1) }, + })) ) } )) }, + { be_const_key_weak(read_attribute, -1), be_const_closure(Matter_Plugin_Aggregator_read_attribute_closure) }, + })), + be_str_weak(Matter_Plugin_Aggregator) +); +/*******************************************************************/ + +void be_load_Matter_Plugin_Aggregator_class(bvm *vm) { + be_pushntvclass(vm, &be_class_Matter_Plugin_Aggregator); + be_setglobal(vm, "Matter_Plugin_Aggregator"); + be_pop(vm, 1); +} +/********************************************************************/ +/* End of solidification */ diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_HTTP.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_HTTP.h index ad91a53e0..377e8f6f0 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_HTTP.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_HTTP.h @@ -459,50 +459,46 @@ be_local_closure(Matter_Plugin_Bridge_HTTP_read_attribute, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[10]) { /* constants */ + ( &(const bvalue[ 9]) { /* constants */ /* K0 */ be_nested_str_weak(matter), /* K1 */ be_nested_str_weak(TLV), /* K2 */ be_nested_str_weak(cluster), /* K3 */ be_nested_str_weak(attribute), - /* K4 */ be_const_int(0), - /* K5 */ be_nested_str_weak(create_TLV), - /* K6 */ be_nested_str_weak(BOOL), - /* K7 */ be_nested_str_weak(http_remote), - /* K8 */ be_nested_str_weak(reachable), - /* K9 */ be_nested_str_weak(read_attribute), + /* K4 */ be_nested_str_weak(create_TLV), + /* K5 */ be_nested_str_weak(BOOL), + /* K6 */ be_nested_str_weak(http_remote), + /* K7 */ be_nested_str_weak(reachable), + /* K8 */ be_nested_str_weak(read_attribute), }), be_str_weak(read_attribute), &be_const_str_solidified, - ( &(const binstruction[29]) { /* code */ + ( &(const binstruction[26]) { /* code */ 0xB80E0000, // 0000 GETNGBL R3 K0 0x880C0701, // 0001 GETMBR R3 R3 K1 0x88100502, // 0002 GETMBR R4 R2 K2 0x88140503, // 0003 GETMBR R5 R2 K3 0x541A0038, // 0004 LDINT R6 57 0x1C180806, // 0005 EQ R6 R4 R6 - 0x781A000C, // 0006 JMPF R6 #0014 - 0x1C180B04, // 0007 EQ R6 R5 K4 - 0x781A0000, // 0008 JMPF R6 #000A - 0x70020008, // 0009 JMP #0013 - 0x541A0010, // 000A LDINT R6 17 - 0x1C180A06, // 000B EQ R6 R5 R6 - 0x781A0005, // 000C JMPF R6 #0013 - 0x8C180705, // 000D GETMET R6 R3 K5 - 0x88200706, // 000E GETMBR R8 R3 K6 - 0x88240107, // 000F GETMBR R9 R0 K7 - 0x88241308, // 0010 GETMBR R9 R9 K8 - 0x7C180600, // 0011 CALL R6 3 - 0x80040C00, // 0012 RET 1 R6 - 0x70020007, // 0013 JMP #001C - 0x60180003, // 0014 GETGBL R6 G3 - 0x5C1C0000, // 0015 MOVE R7 R0 - 0x7C180200, // 0016 CALL R6 1 - 0x8C180D09, // 0017 GETMET R6 R6 K9 - 0x5C200200, // 0018 MOVE R8 R1 - 0x5C240400, // 0019 MOVE R9 R2 - 0x7C180600, // 001A CALL R6 3 - 0x80040C00, // 001B RET 1 R6 - 0x80000000, // 001C RET 0 + 0x781A0009, // 0006 JMPF R6 #0011 + 0x541A0010, // 0007 LDINT R6 17 + 0x1C180A06, // 0008 EQ R6 R5 R6 + 0x781A0005, // 0009 JMPF R6 #0010 + 0x8C180704, // 000A GETMET R6 R3 K4 + 0x88200705, // 000B GETMBR R8 R3 K5 + 0x88240106, // 000C GETMBR R9 R0 K6 + 0x88241307, // 000D GETMBR R9 R9 K7 + 0x7C180600, // 000E CALL R6 3 + 0x80040C00, // 000F RET 1 R6 + 0x70020007, // 0010 JMP #0019 + 0x60180003, // 0011 GETGBL R6 G3 + 0x5C1C0000, // 0012 MOVE R7 R0 + 0x7C180200, // 0013 CALL R6 1 + 0x8C180D08, // 0014 GETMET R6 R6 K8 + 0x5C200200, // 0015 MOVE R8 R1 + 0x5C240400, // 0016 MOVE R9 R2 + 0x7C180600, // 0017 CALL R6 3 + 0x80040C00, // 0018 RET 1 R6 + 0x80000000, // 0019 RET 0 }) ) ); @@ -628,13 +624,8 @@ be_local_class(Matter_Plugin_Bridge_HTTP, { be_const_key_weak(ui_conf_to_string, -1), be_const_static_closure(Matter_Plugin_Bridge_HTTP_ui_conf_to_string_closure) }, { be_const_key_weak(http_remote, -1), be_const_var(0) }, { be_const_key_weak(CLUSTERS, 0), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { - be_const_map( * be_nested_map(1, + be_const_map( * be_nested_map(0, ( (struct bmapnode*) &(const bmapnode[]) { - { be_const_key_int(57, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_list, { - be_const_list( * be_nested_list(1, - ( (struct bvalue*) &(const bvalue[]) { - be_const_int(17), - })) ) } )) }, })) ) } )) }, { be_const_key_weak(ARG, -1), be_nested_str_weak() }, { be_const_key_weak(UPDATE_CMD, -1), be_nested_str_weak(Status_X2011) }, diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor_OnOff.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor_OnOff.h new file mode 100644 index 000000000..3e14c2a04 --- /dev/null +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor_OnOff.h @@ -0,0 +1,295 @@ +/* Solidification of Matter_Plugin_Sensor_OnOff.h */ +/********************************************************************\ +* Generated code, don't edit * +\********************************************************************/ +#include "be_constobj.h" + +extern const bclass be_class_Matter_Plugin_Sensor_OnOff; + +/******************************************************************** +** Solidified function: +********************************************************************/ +be_local_closure(Matter_Plugin_Sensor_OnOff__X3Clambda_X3E, /* name */ + be_nested_proto( + 3, /* nstack */ + 1, /* argc */ + 0, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 0, /* has constants */ + NULL, /* no const */ + be_str_weak(_X3Clambda_X3E), + &be_const_str_solidified, + ( &(const binstruction[ 4]) { /* code */ + 0x60040009, // 0000 GETGBL R1 G9 + 0x5C080000, // 0001 MOVE R2 R0 + 0x7C040200, // 0002 CALL R1 1 + 0x80040200, // 0003 RET 1 R1 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: read_attribute +********************************************************************/ +be_local_closure(Matter_Plugin_Sensor_OnOff_read_attribute, /* name */ + be_nested_proto( + 11, /* nstack */ + 3, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[12]) { /* constants */ + /* K0 */ be_nested_str_weak(string), + /* K1 */ be_nested_str_weak(matter), + /* K2 */ be_nested_str_weak(TLV), + /* K3 */ be_nested_str_weak(cluster), + /* K4 */ be_nested_str_weak(attribute), + /* K5 */ be_nested_str_weak(update_shadow_lazy), + /* K6 */ be_const_int(0), + /* K7 */ be_nested_str_weak(create_TLV), + /* K8 */ be_nested_str_weak(BOOL), + /* K9 */ be_nested_str_weak(shadow_onoff), + /* K10 */ be_nested_str_weak(U4), + /* K11 */ be_nested_str_weak(read_attribute), + }), + be_str_weak(read_attribute), + &be_const_str_solidified, + ( &(const binstruction[45]) { /* code */ + 0xA40E0000, // 0000 IMPORT R3 K0 + 0xB8120200, // 0001 GETNGBL R4 K1 + 0x88100902, // 0002 GETMBR R4 R4 K2 + 0x88140503, // 0003 GETMBR R5 R2 K3 + 0x88180504, // 0004 GETMBR R6 R2 K4 + 0x541E0005, // 0005 LDINT R7 6 + 0x1C1C0A07, // 0006 EQ R7 R5 R7 + 0x781E001B, // 0007 JMPF R7 #0024 + 0x8C1C0105, // 0008 GETMET R7 R0 K5 + 0x7C1C0200, // 0009 CALL R7 1 + 0x1C1C0D06, // 000A EQ R7 R6 K6 + 0x781E0005, // 000B JMPF R7 #0012 + 0x8C1C0907, // 000C GETMET R7 R4 K7 + 0x88240908, // 000D GETMBR R9 R4 K8 + 0x88280109, // 000E GETMBR R10 R0 K9 + 0x7C1C0600, // 000F CALL R7 3 + 0x80040E00, // 0010 RET 1 R7 + 0x70020010, // 0011 JMP #0023 + 0x541EFFFB, // 0012 LDINT R7 65532 + 0x1C1C0C07, // 0013 EQ R7 R6 R7 + 0x781E0005, // 0014 JMPF R7 #001B + 0x8C1C0907, // 0015 GETMET R7 R4 K7 + 0x8824090A, // 0016 GETMBR R9 R4 K10 + 0x58280006, // 0017 LDCONST R10 K6 + 0x7C1C0600, // 0018 CALL R7 3 + 0x80040E00, // 0019 RET 1 R7 + 0x70020007, // 001A JMP #0023 + 0x541EFFFC, // 001B LDINT R7 65533 + 0x1C1C0C07, // 001C EQ R7 R6 R7 + 0x781E0004, // 001D JMPF R7 #0023 + 0x8C1C0907, // 001E GETMET R7 R4 K7 + 0x8824090A, // 001F GETMBR R9 R4 K10 + 0x542A0003, // 0020 LDINT R10 4 + 0x7C1C0600, // 0021 CALL R7 3 + 0x80040E00, // 0022 RET 1 R7 + 0x70020007, // 0023 JMP #002C + 0x601C0003, // 0024 GETGBL R7 G3 + 0x5C200000, // 0025 MOVE R8 R0 + 0x7C1C0200, // 0026 CALL R7 1 + 0x8C1C0F0B, // 0027 GETMET R7 R7 K11 + 0x5C240200, // 0028 MOVE R9 R1 + 0x5C280400, // 0029 MOVE R10 R2 + 0x7C1C0600, // 002A CALL R7 3 + 0x80040E00, // 002B RET 1 R7 + 0x80000000, // 002C RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: update_shadow +********************************************************************/ +be_local_closure(Matter_Plugin_Sensor_OnOff_update_shadow, /* name */ + be_nested_proto( + 9, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[13]) { /* constants */ + /* K0 */ be_nested_str_weak(update_shadow), + /* K1 */ be_nested_str_weak(json), + /* K2 */ be_nested_str_weak(tasmota), + /* K3 */ be_nested_str_weak(cmd), + /* K4 */ be_nested_str_weak(Status_X208), + /* K5 */ be_nested_str_weak(load), + /* K6 */ be_nested_str_weak(find), + /* K7 */ be_nested_str_weak(Switch), + /* K8 */ be_nested_str_weak(tasmota_switch_index), + /* K9 */ be_nested_str_weak(ON), + /* K10 */ be_nested_str_weak(shadow_onoff), + /* K11 */ be_nested_str_weak(attribute_updated), + /* K12 */ be_const_int(0), + }), + be_str_weak(update_shadow), + &be_const_str_solidified, + ( &(const binstruction[45]) { /* code */ + 0x60040003, // 0000 GETGBL R1 G3 + 0x5C080000, // 0001 MOVE R2 R0 + 0x7C040200, // 0002 CALL R1 1 + 0x8C040300, // 0003 GETMET R1 R1 K0 + 0x7C040200, // 0004 CALL R1 1 + 0xA4060200, // 0005 IMPORT R1 K1 + 0xB80A0400, // 0006 GETNGBL R2 K2 + 0x8C080503, // 0007 GETMET R2 R2 K3 + 0x58100004, // 0008 LDCONST R4 K4 + 0x50140200, // 0009 LDBOOL R5 1 0 + 0x7C080600, // 000A CALL R2 3 + 0x4C0C0000, // 000B LDNIL R3 + 0x200C0403, // 000C NE R3 R2 R3 + 0x780E001D, // 000D JMPF R3 #002C + 0x8C0C0305, // 000E GETMET R3 R1 K5 + 0x5C140400, // 000F MOVE R5 R2 + 0x7C0C0400, // 0010 CALL R3 2 + 0x4C100000, // 0011 LDNIL R4 + 0x20100604, // 0012 NE R4 R3 R4 + 0x78120017, // 0013 JMPF R4 #002C + 0x50100000, // 0014 LDBOOL R4 0 0 + 0x8C140706, // 0015 GETMET R5 R3 K6 + 0x601C0008, // 0016 GETGBL R7 G8 + 0x88200108, // 0017 GETMBR R8 R0 K8 + 0x7C1C0200, // 0018 CALL R7 1 + 0x001E0E07, // 0019 ADD R7 K7 R7 + 0x7C140400, // 001A CALL R5 2 + 0x1C140B09, // 001B EQ R5 R5 K9 + 0x5C100A00, // 001C MOVE R4 R5 + 0x8814010A, // 001D GETMBR R5 R0 K10 + 0x4C180000, // 001E LDNIL R6 + 0x20140A06, // 001F NE R5 R5 R6 + 0x78160009, // 0020 JMPF R5 #002B + 0x8814010A, // 0021 GETMBR R5 R0 K10 + 0x60180017, // 0022 GETGBL R6 G23 + 0x5C1C0800, // 0023 MOVE R7 R4 + 0x7C180200, // 0024 CALL R6 1 + 0x20140A06, // 0025 NE R5 R5 R6 + 0x78160003, // 0026 JMPF R5 #002B + 0x8C14010B, // 0027 GETMET R5 R0 K11 + 0x541E0405, // 0028 LDINT R7 1030 + 0x5820000C, // 0029 LDCONST R8 K12 + 0x7C140600, // 002A CALL R5 3 + 0x90021404, // 002B SETMBR R0 K10 R4 + 0x80000000, // 002C RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: init +********************************************************************/ +be_local_closure(Matter_Plugin_Sensor_OnOff_init, /* name */ + be_nested_proto( + 9, /* nstack */ + 4, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 6]) { /* constants */ + /* K0 */ be_nested_str_weak(init), + /* K1 */ be_nested_str_weak(tasmota_switch_index), + /* K2 */ be_nested_str_weak(find), + /* K3 */ be_nested_str_weak(ARG), + /* K4 */ be_const_int(1), + /* K5 */ be_const_int(0), + }), + be_str_weak(init), + &be_const_str_solidified, + ( &(const binstruction[20]) { /* code */ + 0x60100003, // 0000 GETGBL R4 G3 + 0x5C140000, // 0001 MOVE R5 R0 + 0x7C100200, // 0002 CALL R4 1 + 0x8C100900, // 0003 GETMET R4 R4 K0 + 0x5C180200, // 0004 MOVE R6 R1 + 0x5C1C0400, // 0005 MOVE R7 R2 + 0x5C200600, // 0006 MOVE R8 R3 + 0x7C100800, // 0007 CALL R4 4 + 0x60100009, // 0008 GETGBL R4 G9 + 0x8C140702, // 0009 GETMET R5 R3 K2 + 0x881C0103, // 000A GETMBR R7 R0 K3 + 0x58200004, // 000B LDCONST R8 K4 + 0x7C140600, // 000C CALL R5 3 + 0x7C100200, // 000D CALL R4 1 + 0x90020204, // 000E SETMBR R0 K1 R4 + 0x88100101, // 000F GETMBR R4 R0 K1 + 0x18100905, // 0010 LE R4 R4 K5 + 0x78120000, // 0011 JMPF R4 #0013 + 0x90020304, // 0012 SETMBR R0 K1 K4 + 0x80000000, // 0013 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified class: Matter_Plugin_Sensor_OnOff +********************************************************************/ +extern const bclass be_class_Matter_Plugin_Device; +be_local_class(Matter_Plugin_Sensor_OnOff, + 2, + &be_class_Matter_Plugin_Device, + be_nested_map(12, + ( (struct bmapnode*) &(const bmapnode[]) { + { be_const_key_weak(UPDATE_TIME, -1), be_const_int(5000) }, + { be_const_key_weak(TYPE, 11), be_nested_str_weak(occupancy) }, + { be_const_key_weak(TYPES, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { + be_const_map( * be_nested_map(1, + ( (struct bmapnode*) &(const bmapnode[]) { + { be_const_key_int(2128, -1), be_const_int(2) }, + })) ) } )) }, + { be_const_key_weak(ARG, 9), be_nested_str_weak(switch) }, + { be_const_key_weak(ARG_TYPE, 8), be_const_static_closure(Matter_Plugin_Sensor_OnOff__X3Clambda_X3E_closure) }, + { be_const_key_weak(NAME, -1), be_nested_str_weak(OnOff) }, + { be_const_key_weak(read_attribute, 5), be_const_closure(Matter_Plugin_Sensor_OnOff_read_attribute_closure) }, + { be_const_key_weak(tasmota_switch_index, -1), be_const_var(0) }, + { be_const_key_weak(shadow_onoff, -1), be_const_var(1) }, + { be_const_key_weak(init, -1), be_const_closure(Matter_Plugin_Sensor_OnOff_init_closure) }, + { be_const_key_weak(CLUSTERS, 7), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { + be_const_map( * be_nested_map(1, + ( (struct bmapnode*) &(const bmapnode[]) { + { be_const_key_int(6, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_list, { + be_const_list( * be_nested_list(3, + ( (struct bvalue*) &(const bvalue[]) { + be_const_int(0), + be_const_int(65532), + be_const_int(65533), + })) ) } )) }, + })) ) } )) }, + { be_const_key_weak(update_shadow, -1), be_const_closure(Matter_Plugin_Sensor_OnOff_update_shadow_closure) }, + })), + be_str_weak(Matter_Plugin_Sensor_OnOff) +); +/*******************************************************************/ + +void be_load_Matter_Plugin_Sensor_OnOff_class(bvm *vm) { + be_pushntvclass(vm, &be_class_Matter_Plugin_Sensor_OnOff); + be_setglobal(vm, "Matter_Plugin_Sensor_OnOff"); + be_pop(vm, 1); +} +/********************************************************************/ +/* End of solidification */ diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_UI.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_UI.h index 5081bf00b..308381b54 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_UI.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_UI.h @@ -71,109 +71,11 @@ be_local_closure(Matter_UI_page_part_mgr, /* name */ /******************************************************************** -** Solidified function: plugin_option +** Solidified function: show_commissioning_info ********************************************************************/ -be_local_closure(Matter_UI_plugin_option, /* name */ +be_local_closure(Matter_UI_show_commissioning_info, /* name */ be_nested_proto( - 17, /* nstack */ - 3, /* argc */ - 3, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[17]) { /* constants */ - /* K0 */ be_nested_str_weak(webserver), - /* K1 */ be_nested_str_weak(string), - /* K2 */ be_nested_str_weak(split), - /* K3 */ be_nested_str_weak(_X7C), - /* K4 */ be_nested_str_weak(stop_iteration), - /* K5 */ be_const_int(0), - /* K6 */ be_nested_str_weak(), - /* K7 */ be_nested_str_weak(content_send), - /* K8 */ be_nested_str_weak(_X3Coption_X20value_X3D_X27_X27_X3E_X3C_X2Foption_X3E), - /* K9 */ be_nested_str_weak(_X2Dhttp), - /* K10 */ be_nested_str_weak(_X3Coption_X20value_X3D_X27_X27_X20disabled_X3E_X2D_X2D_X2D_X20Tasmota_X20Remote_X20_X2D_X2D_X2D_X3C_X2Foption_X3E), - /* K11 */ be_nested_str_weak(device), - /* K12 */ be_nested_str_weak(get_plugin_class_displayname), - /* K13 */ be_nested_str_weak(format), - /* K14 */ be_nested_str_weak(_X3Coption_X20value_X3D_X27_X25s_X27_X25s_X3E_X25s_X3C_X2Foption_X3E), - /* K15 */ be_nested_str_weak(_X20selected), - /* K16 */ be_const_int(1), - }), - be_str_weak(plugin_option), - &be_const_str_solidified, - ( &(const binstruction[57]) { /* code */ - 0xA40E0000, // 0000 IMPORT R3 K0 - 0xA4120200, // 0001 IMPORT R4 K1 - 0x60140012, // 0002 GETGBL R5 G18 - 0x7C140000, // 0003 CALL R5 0 - 0x60180010, // 0004 GETGBL R6 G16 - 0x5C1C0400, // 0005 MOVE R7 R2 - 0x7C180200, // 0006 CALL R6 1 - 0xA8020007, // 0007 EXBLK 0 #0010 - 0x5C1C0C00, // 0008 MOVE R7 R6 - 0x7C1C0000, // 0009 CALL R7 0 - 0x8C200902, // 000A GETMET R8 R4 K2 - 0x5C280E00, // 000B MOVE R10 R7 - 0x582C0003, // 000C LDCONST R11 K3 - 0x7C200600, // 000D CALL R8 3 - 0x00140A08, // 000E ADD R5 R5 R8 - 0x7001FFF7, // 000F JMP #0008 - 0x58180004, // 0010 LDCONST R6 K4 - 0xAC180200, // 0011 CATCH R6 1 0 - 0xB0080000, // 0012 RAISE 2 R0 R0 - 0x58180005, // 0013 LDCONST R6 K5 - 0x601C000C, // 0014 GETGBL R7 G12 - 0x5C200A00, // 0015 MOVE R8 R5 - 0x7C1C0200, // 0016 CALL R7 1 - 0x141C0C07, // 0017 LT R7 R6 R7 - 0x781E001E, // 0018 JMPF R7 #0038 - 0x941C0A06, // 0019 GETIDX R7 R5 R6 - 0x1C200F06, // 001A EQ R8 R7 K6 - 0x78220003, // 001B JMPF R8 #0020 - 0x8C200707, // 001C GETMET R8 R3 K7 - 0x58280008, // 001D LDCONST R10 K8 - 0x7C200400, // 001E CALL R8 2 - 0x70020015, // 001F JMP #0036 - 0x1C200F09, // 0020 EQ R8 R7 K9 - 0x78220003, // 0021 JMPF R8 #0026 - 0x8C200707, // 0022 GETMET R8 R3 K7 - 0x5828000A, // 0023 LDCONST R10 K10 - 0x7C200400, // 0024 CALL R8 2 - 0x7002000F, // 0025 JMP #0036 - 0x8820010B, // 0026 GETMBR R8 R0 K11 - 0x8C20110C, // 0027 GETMET R8 R8 K12 - 0x5C280E00, // 0028 MOVE R10 R7 - 0x7C200400, // 0029 CALL R8 2 - 0x8C240707, // 002A GETMET R9 R3 K7 - 0x8C2C090D, // 002B GETMET R11 R4 K13 - 0x5834000E, // 002C LDCONST R13 K14 - 0x5C380E00, // 002D MOVE R14 R7 - 0x1C3C0E01, // 002E EQ R15 R7 R1 - 0x783E0001, // 002F JMPF R15 #0032 - 0x583C000F, // 0030 LDCONST R15 K15 - 0x70020000, // 0031 JMP #0033 - 0x583C0006, // 0032 LDCONST R15 K6 - 0x5C401000, // 0033 MOVE R16 R8 - 0x7C2C0A00, // 0034 CALL R11 5 - 0x7C240400, // 0035 CALL R9 2 - 0x00180D10, // 0036 ADD R6 R6 K16 - 0x7001FFDB, // 0037 JMP #0014 - 0x80000000, // 0038 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: show_bridge_status -********************************************************************/ -be_local_closure(Matter_UI_show_bridge_status, /* name */ - be_nested_proto( - 15, /* nstack */ + 14, /* nstack */ 1, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -181,139 +83,97 @@ be_local_closure(Matter_UI_show_bridge_status, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[26]) { /* constants */ + ( &(const bvalue[20]) { /* constants */ /* K0 */ be_nested_str_weak(webserver), /* K1 */ be_nested_str_weak(string), - /* K2 */ be_const_int(0), - /* K3 */ be_nested_str_weak(device), - /* K4 */ be_nested_str_weak(plugins), - /* K5 */ be_nested_str_weak(matter), - /* K6 */ be_nested_str_weak(Plugin_Bridge_HTTP), - /* K7 */ be_nested_str_weak(http_remote), - /* K8 */ be_nested_str_weak(addr), - /* K9 */ be_nested_str_weak(contains), - /* K10 */ be_nested_str_weak(push), - /* K11 */ be_const_int(1), - /* K12 */ be_nested_str_weak(content_send), - /* K13 */ be_nested_str_weak(_X3Chr_X3E), - /* K14 */ be_nested_str_weak(_X3Ctable_X20style_X3D_X27width_X3A100_X25_X27_X3E), - /* K15 */ be_nested_str_weak(_STYLESHEET), - /* K16 */ be_nested_str_weak(keys), - /* K17 */ be_nested_str_weak(format), - /* K18 */ be_nested_str_weak(_X3Ctr_X20class_X3D_X27ztdm_X20htrm_X27_X3E_X3Ctd_X3E_X3Cb_X3E_X25s_X3C_X2Fb_X3E_X3C_X2Ftd_X3E), - /* K19 */ be_nested_str_weak(html_escape), - /* K20 */ be_nested_str_weak(web_last_seen), - /* K21 */ be_nested_str_weak(_X3Ctr_X20class_X3D_X27htrm_X27_X3E_X3Ctd_X20colspan_X3D_X272_X27_X3E), - /* K22 */ be_nested_str_weak(web_values), - /* K23 */ be_nested_str_weak(_X3C_X2Ftd_X3E_X3C_X2Ftr_X3E), - /* K24 */ be_nested_str_weak(stop_iteration), - /* K25 */ be_nested_str_weak(_X3C_X2Ftable_X3E_X3Chr_X3E), + /* K2 */ be_nested_str_weak(device), + /* K3 */ be_nested_str_weak(commissioning_open), + /* K4 */ be_nested_str_weak(tasmota), + /* K5 */ be_nested_str_weak(millis), + /* K6 */ be_const_int(0), + /* K7 */ be_nested_str_weak(content_send), + /* K8 */ be_nested_str_weak(format), + /* K9 */ be_nested_str_weak(_X3Cfieldset_X3E_X3Clegend_X3E_X3Cb_X3E_X26nbsp_X3BCommissioning_X20open_X20for_X20_X25i_X20min_X26nbsp_X3B_X3C_X2Fb_X3E_X3C_X2Flegend_X3E_X3Cp_X3E_X3C_X2Fp_X3E), + /* K10 */ be_nested_str_weak(compute_manual_pairing_code), + /* K11 */ be_nested_str_weak(_X3Cp_X3EManual_X20pairing_X20code_X3A_X3Cbr_X3E_X3Cb_X3E_X25s_X2D_X25s_X2D_X25s_X3C_X2Fb_X3E_X3C_X2Fp_X3E_X3Chr_X3E), + /* K12 */ be_const_int(3), + /* K13 */ be_const_int(2147483647), + /* K14 */ be_nested_str_weak(_X3Cdiv_X3E_X3Ccenter_X3E), + /* K15 */ be_nested_str_weak(compute_qrcode_content), + /* K16 */ be_nested_str_weak(show_qrcode), + /* K17 */ be_nested_str_weak(_X3Cp_X3E_X20_X25s_X3C_X2Fp_X3E), + /* K18 */ be_nested_str_weak(_X3C_X2Fdiv_X3E), + /* K19 */ be_nested_str_weak(_X3Cp_X3E_X3C_X2Fp_X3E_X3C_X2Ffieldset_X3E_X3Cp_X3E_X3C_X2Fp_X3E), }), - be_str_weak(show_bridge_status), + be_str_weak(show_commissioning_info), &be_const_str_solidified, - ( &(const binstruction[102]) { /* code */ + ( &(const binstruction[66]) { /* code */ 0xA4060000, // 0000 IMPORT R1 K0 0xA40A0200, // 0001 IMPORT R2 K1 - 0x4C0C0000, // 0002 LDNIL R3 - 0x58100002, // 0003 LDCONST R4 K2 - 0x6014000C, // 0004 GETGBL R5 G12 - 0x88180103, // 0005 GETMBR R6 R0 K3 - 0x88180D04, // 0006 GETMBR R6 R6 K4 - 0x7C140200, // 0007 CALL R5 1 - 0x14140805, // 0008 LT R5 R4 R5 - 0x7816001D, // 0009 JMPF R5 #0028 - 0x88140103, // 000A GETMBR R5 R0 K3 - 0x88140B04, // 000B GETMBR R5 R5 K4 - 0x94140A04, // 000C GETIDX R5 R5 R4 - 0x6018000F, // 000D GETGBL R6 G15 - 0x5C1C0A00, // 000E MOVE R7 R5 - 0xB8220A00, // 000F GETNGBL R8 K5 - 0x88201106, // 0010 GETMBR R8 R8 K6 - 0x7C180400, // 0011 CALL R6 2 - 0x781A0012, // 0012 JMPF R6 #0026 - 0x4C180000, // 0013 LDNIL R6 - 0x1C180606, // 0014 EQ R6 R3 R6 - 0x781A0002, // 0015 JMPF R6 #0019 - 0x60180013, // 0016 GETGBL R6 G19 - 0x7C180000, // 0017 CALL R6 0 - 0x5C0C0C00, // 0018 MOVE R3 R6 - 0x88180B07, // 0019 GETMBR R6 R5 K7 - 0x88180D08, // 001A GETMBR R6 R6 K8 - 0x8C1C0709, // 001B GETMET R7 R3 K9 - 0x5C240C00, // 001C MOVE R9 R6 - 0x7C1C0400, // 001D CALL R7 2 - 0x741E0002, // 001E JMPT R7 #0022 - 0x601C0012, // 001F GETGBL R7 G18 - 0x7C1C0000, // 0020 CALL R7 0 - 0x980C0C07, // 0021 SETIDX R3 R6 R7 - 0x941C0606, // 0022 GETIDX R7 R3 R6 - 0x8C1C0F0A, // 0023 GETMET R7 R7 K10 - 0x5C240A00, // 0024 MOVE R9 R5 - 0x7C1C0400, // 0025 CALL R7 2 - 0x0010090B, // 0026 ADD R4 R4 K11 - 0x7001FFDB, // 0027 JMP #0004 - 0x4C140000, // 0028 LDNIL R5 - 0x1C140605, // 0029 EQ R5 R3 R5 - 0x78160000, // 002A JMPF R5 #002C - 0x80000A00, // 002B RET 0 - 0x8C14030C, // 002C GETMET R5 R1 K12 - 0x581C000D, // 002D LDCONST R7 K13 - 0x7C140400, // 002E CALL R5 2 - 0x8C14030C, // 002F GETMET R5 R1 K12 - 0x581C000E, // 0030 LDCONST R7 K14 - 0x7C140400, // 0031 CALL R5 2 - 0x8C14030C, // 0032 GETMET R5 R1 K12 - 0xB81E0A00, // 0033 GETNGBL R7 K5 - 0x881C0F0F, // 0034 GETMBR R7 R7 K15 - 0x7C140400, // 0035 CALL R5 2 - 0x60140010, // 0036 GETGBL R5 G16 - 0x8C180710, // 0037 GETMET R6 R3 K16 - 0x7C180200, // 0038 CALL R6 1 - 0x7C140200, // 0039 CALL R5 1 - 0xA8020023, // 003A EXBLK 0 #005F - 0x5C180A00, // 003B MOVE R6 R5 - 0x7C180000, // 003C CALL R6 0 - 0x8C1C030C, // 003D GETMET R7 R1 K12 - 0x8C240511, // 003E GETMET R9 R2 K17 - 0x582C0012, // 003F LDCONST R11 K18 - 0x8C300313, // 0040 GETMET R12 R1 K19 - 0x5C380C00, // 0041 MOVE R14 R6 - 0x7C300400, // 0042 CALL R12 2 - 0x7C240600, // 0043 CALL R9 3 - 0x7C1C0400, // 0044 CALL R7 2 - 0x941C0606, // 0045 GETIDX R7 R3 R6 - 0x941C0F02, // 0046 GETIDX R7 R7 K2 - 0x881C0F07, // 0047 GETMBR R7 R7 K7 - 0x8C20030C, // 0048 GETMET R8 R1 K12 - 0x8C280F14, // 0049 GETMET R10 R7 K20 - 0x7C280200, // 004A CALL R10 1 - 0x7C200400, // 004B CALL R8 2 - 0x60200010, // 004C GETGBL R8 G16 - 0x94240606, // 004D GETIDX R9 R3 R6 - 0x7C200200, // 004E CALL R8 1 - 0xA802000A, // 004F EXBLK 0 #005B - 0x5C241000, // 0050 MOVE R9 R8 - 0x7C240000, // 0051 CALL R9 0 - 0x8C28030C, // 0052 GETMET R10 R1 K12 - 0x58300015, // 0053 LDCONST R12 K21 - 0x7C280400, // 0054 CALL R10 2 - 0x8C281316, // 0055 GETMET R10 R9 K22 - 0x7C280200, // 0056 CALL R10 1 - 0x8C28030C, // 0057 GETMET R10 R1 K12 - 0x58300017, // 0058 LDCONST R12 K23 - 0x7C280400, // 0059 CALL R10 2 - 0x7001FFF4, // 005A JMP #0050 - 0x58200018, // 005B LDCONST R8 K24 - 0xAC200200, // 005C CATCH R8 1 0 - 0xB0080000, // 005D RAISE 2 R0 R0 - 0x7001FFDB, // 005E JMP #003B - 0x58140018, // 005F LDCONST R5 K24 - 0xAC140200, // 0060 CATCH R5 1 0 - 0xB0080000, // 0061 RAISE 2 R0 R0 - 0x8C14030C, // 0062 GETMET R5 R1 K12 - 0x581C0019, // 0063 LDCONST R7 K25 - 0x7C140400, // 0064 CALL R5 2 - 0x80000000, // 0065 RET 0 + 0x880C0102, // 0002 GETMBR R3 R0 K2 + 0x880C0703, // 0003 GETMBR R3 R3 K3 + 0xB8120800, // 0004 GETNGBL R4 K4 + 0x8C100905, // 0005 GETMET R4 R4 K5 + 0x7C100200, // 0006 CALL R4 1 + 0x040C0604, // 0007 SUB R3 R3 R4 + 0x541203E7, // 0008 LDINT R4 1000 + 0x0C0C0604, // 0009 DIV R3 R3 R4 + 0x14100706, // 000A LT R4 R3 K6 + 0x78120000, // 000B JMPF R4 #000D + 0x580C0006, // 000C LDCONST R3 K6 + 0x5412001D, // 000D LDINT R4 30 + 0x00100604, // 000E ADD R4 R3 R4 + 0x5416003B, // 000F LDINT R5 60 + 0x0C100805, // 0010 DIV R4 R4 R5 + 0x8C140307, // 0011 GETMET R5 R1 K7 + 0x8C1C0508, // 0012 GETMET R7 R2 K8 + 0x58240009, // 0013 LDCONST R9 K9 + 0x5C280800, // 0014 MOVE R10 R4 + 0x7C1C0600, // 0015 CALL R7 3 + 0x7C140400, // 0016 CALL R5 2 + 0x88140102, // 0017 GETMBR R5 R0 K2 + 0x8C140B0A, // 0018 GETMET R5 R5 K10 + 0x7C140200, // 0019 CALL R5 1 + 0x8C180307, // 001A GETMET R6 R1 K7 + 0x8C200508, // 001B GETMET R8 R2 K8 + 0x5828000B, // 001C LDCONST R10 K11 + 0x402E0D0C, // 001D CONNECT R11 K6 K12 + 0x942C0A0B, // 001E GETIDX R11 R5 R11 + 0x54320003, // 001F LDINT R12 4 + 0x54360005, // 0020 LDINT R13 6 + 0x4030180D, // 0021 CONNECT R12 R12 R13 + 0x94300A0C, // 0022 GETIDX R12 R5 R12 + 0x54360006, // 0023 LDINT R13 7 + 0x40341B0D, // 0024 CONNECT R13 R13 K13 + 0x94340A0D, // 0025 GETIDX R13 R5 R13 + 0x7C200A00, // 0026 CALL R8 5 + 0x7C180400, // 0027 CALL R6 2 + 0x8C180307, // 0028 GETMET R6 R1 K7 + 0x8C200508, // 0029 GETMET R8 R2 K8 + 0x5828000E, // 002A LDCONST R10 K14 + 0x7C200400, // 002B CALL R8 2 + 0x7C180400, // 002C CALL R6 2 + 0x88180102, // 002D GETMBR R6 R0 K2 + 0x8C180D0F, // 002E GETMET R6 R6 K15 + 0x7C180200, // 002F CALL R6 1 + 0x8C1C0110, // 0030 GETMET R7 R0 K16 + 0x5C240C00, // 0031 MOVE R9 R6 + 0x7C1C0400, // 0032 CALL R7 2 + 0x8C1C0307, // 0033 GETMET R7 R1 K7 + 0x8C240508, // 0034 GETMET R9 R2 K8 + 0x582C0011, // 0035 LDCONST R11 K17 + 0x5C300C00, // 0036 MOVE R12 R6 + 0x7C240600, // 0037 CALL R9 3 + 0x7C1C0400, // 0038 CALL R7 2 + 0x8C1C0307, // 0039 GETMET R7 R1 K7 + 0x8C240508, // 003A GETMET R9 R2 K8 + 0x582C0012, // 003B LDCONST R11 K18 + 0x7C240400, // 003C CALL R9 2 + 0x7C1C0400, // 003D CALL R7 2 + 0x8C1C0307, // 003E GETMET R7 R1 K7 + 0x58240013, // 003F LDCONST R9 K19 + 0x7C1C0400, // 0040 CALL R7 2 + 0x80000000, // 0041 RET 0 }) ) ); @@ -486,48 +346,6 @@ be_local_closure(Matter_UI_show_qrcode, /* name */ /*******************************************************************/ -/******************************************************************** -** Solidified function: web_add_config_button -********************************************************************/ -be_local_closure(Matter_UI_web_add_config_button, /* name */ - be_nested_proto( - 5, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 6]) { /* constants */ - /* K0 */ be_nested_str_weak(webserver), - /* K1 */ be_nested_str_weak(content_send), - /* K2 */ be_nested_str_weak(_X3Cp_X3E_X3Cform_X20id_X3Dac_X20action_X3D_X27matterc_X27_X20style_X3D_X27display_X3A_X20block_X3B_X27_X20method_X3D_X27get_X27_X3E_X3Cbutton_X3E), - /* K3 */ be_nested_str_weak(matter), - /* K4 */ be_nested_str_weak(_LOGO), - /* K5 */ be_nested_str_weak(_X20Configure_X20Matter_X3C_X2Fbutton_X3E_X3C_X2Fform_X3E_X3C_X2Fp_X3E), - }), - be_str_weak(web_add_config_button), - &be_const_str_solidified, - ( &(const binstruction[12]) { /* code */ - 0xA4060000, // 0000 IMPORT R1 K0 - 0x8C080301, // 0001 GETMET R2 R1 K1 - 0x58100002, // 0002 LDCONST R4 K2 - 0x7C080400, // 0003 CALL R2 2 - 0x8C080301, // 0004 GETMET R2 R1 K1 - 0xB8120600, // 0005 GETNGBL R4 K3 - 0x88100904, // 0006 GETMBR R4 R4 K4 - 0x7C080400, // 0007 CALL R2 2 - 0x8C080301, // 0008 GETMET R2 R1 K1 - 0x58100005, // 0009 LDCONST R4 K5 - 0x7C080400, // 000A CALL R2 2 - 0x80000000, // 000B RET 0 - }) - ) -); -/*******************************************************************/ - - /******************************************************************** ** Solidified function: page_part_ctl ********************************************************************/ @@ -541,7 +359,7 @@ be_local_closure(Matter_UI_page_part_ctl, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[71]) { /* constants */ + ( &(const bvalue[74]) { /* constants */ /* K0 */ be_nested_str_weak(webserver), /* K1 */ be_nested_str_weak(check_privileged_access), /* K2 */ be_nested_str_weak(string), @@ -565,58 +383,61 @@ be_local_closure(Matter_UI_page_part_ctl, /* name */ /* K20 */ be_nested_str_weak(save_param), /* K21 */ be_nested_str_weak(redirect), /* K22 */ be_nested_str_weak(_X2F_X3Frst_X3D), - /* K23 */ be_nested_str_weak(enable), - /* K24 */ be_nested_str_weak(cmd), - /* K25 */ be_nested_str_weak(SetOption), - /* K26 */ be_nested_str_weak(matter), - /* K27 */ be_nested_str_weak(MATTER_OPTION), - /* K28 */ be_nested_str_weak(_X201), - /* K29 */ be_nested_str_weak(disable), - /* K30 */ be_nested_str_weak(_X200), - /* K31 */ be_nested_str_weak(del_fabric), - /* K32 */ be_const_int(0), - /* K33 */ be_nested_str_weak(sessions), - /* K34 */ be_nested_str_weak(fabrics), - /* K35 */ be_nested_str_weak(get_fabric_index), - /* K36 */ be_nested_str_weak(remove_fabric), - /* K37 */ be_const_int(1), - /* K38 */ be_nested_str_weak(_X2Fmatterc_X3F), - /* K39 */ be_nested_str_weak(auto), - /* K40 */ be_nested_str_weak(plugins_persist), - /* K41 */ be_nested_str_weak(config), - /* K42 */ be_nested_str_weak(_X2503i), - /* K43 */ be_nested_str_weak(ep), - /* K44 */ be_nested_str_weak(pi), - /* K45 */ be_nested_str_weak(MTR_X3A_X20ep_X3D_X25i_X20type_X3D_X25s_X20arg_X3D_X25s), - /* K46 */ be_nested_str_weak(), - /* K47 */ be_nested_str_weak(plugins_classes), - /* K48 */ be_nested_str_weak(find), - /* K49 */ be_nested_str_weak(type), - /* K50 */ be_nested_str_weak(ui_string_to_conf), - /* K51 */ be_nested_str_weak(MTR_X3A_X20unknown_X20type_X20_X3D_X20_X25s), - /* K52 */ be_const_int(2), - /* K53 */ be_nested_str_weak(MTR_X3A_X20skipping_X20parameter), - /* K54 */ be_nested_str_weak(MTR_X3A_X20config_X20_X3D_X20_X25s), - /* K55 */ be_nested_str_weak(contains), - /* K56 */ be_nested_str_weak(0), - /* K57 */ be_nested_str_weak(Missing_X20endpoint_X200), - /* K58 */ be_nested_str_weak(MTR_X3A_X20config_X20error_X20_X3D_X20_X25s), - /* K59 */ be_nested_str_weak(plugins_config), - /* K60 */ be_nested_str_weak(content_start), - /* K61 */ be_nested_str_weak(Parameter_X20error), - /* K62 */ be_nested_str_weak(content_send_style), - /* K63 */ be_nested_str_weak(content_send), - /* K64 */ be_nested_str_weak(_X3Cp_X20style_X3D_X27width_X3A340px_X3B_X27_X3E_X3Cb_X3EError_X3A_X3C_X2Fb_X3E_X25s_X3C_X2Fp_X3E), - /* K65 */ be_nested_str_weak(html_escape), - /* K66 */ be_nested_str_weak(content_button), - /* K67 */ be_nested_str_weak(BUTTON_CONFIGURATION), - /* K68 */ be_nested_str_weak(content_stop), - /* K69 */ be_nested_str_weak(BRY_X3A_X20Exception_X3E_X20_X27_X25s_X27_X20_X2D_X20_X25s), - /* K70 */ be_nested_str_weak(_X3Cp_X20style_X3D_X27width_X3A340px_X3B_X27_X3E_X3Cb_X3EException_X3A_X3C_X2Fb_X3E_X3Cbr_X3E_X27_X25s_X27_X3Cbr_X3E_X25s_X3C_X2Fp_X3E), + /* K23 */ be_nested_str_weak(open_comm), + /* K24 */ be_nested_str_weak(start_root_basic_commissioning), + /* K25 */ be_nested_str_weak(_X2F), + /* K26 */ be_nested_str_weak(clos_comm), + /* K27 */ be_nested_str_weak(stop_basic_commissioning), + /* K28 */ be_nested_str_weak(enable), + /* K29 */ be_nested_str_weak(cmd), + /* K30 */ be_nested_str_weak(SetOption), + /* K31 */ be_nested_str_weak(matter), + /* K32 */ be_nested_str_weak(MATTER_OPTION), + /* K33 */ be_nested_str_weak(_X201), + /* K34 */ be_nested_str_weak(disable), + /* K35 */ be_nested_str_weak(_X200), + /* K36 */ be_nested_str_weak(del_fabric), + /* K37 */ be_const_int(0), + /* K38 */ be_nested_str_weak(sessions), + /* K39 */ be_nested_str_weak(fabrics), + /* K40 */ be_nested_str_weak(get_fabric_index), + /* K41 */ be_nested_str_weak(remove_fabric), + /* K42 */ be_const_int(1), + /* K43 */ be_nested_str_weak(_X2Fmatterc_X3F), + /* K44 */ be_nested_str_weak(auto), + /* K45 */ be_nested_str_weak(plugins_persist), + /* K46 */ be_nested_str_weak(config), + /* K47 */ be_nested_str_weak(_X2503i), + /* K48 */ be_nested_str_weak(ep), + /* K49 */ be_nested_str_weak(pi), + /* K50 */ be_nested_str_weak(MTR_X3A_X20ep_X3D_X25i_X20type_X3D_X25s_X20arg_X3D_X25s), + /* K51 */ be_nested_str_weak(), + /* K52 */ be_nested_str_weak(0), + /* K53 */ be_nested_str_weak(plugins_classes), + /* K54 */ be_nested_str_weak(find), + /* K55 */ be_nested_str_weak(type), + /* K56 */ be_nested_str_weak(ui_string_to_conf), + /* K57 */ be_nested_str_weak(MTR_X3A_X20unknown_X20type_X20_X3D_X20_X25s), + /* K58 */ be_const_int(2), + /* K59 */ be_nested_str_weak(MTR_X3A_X20skipping_X20parameter), + /* K60 */ be_nested_str_weak(MTR_X3A_X20config_X20_X3D_X20_X25s), + /* K61 */ be_nested_str_weak(MTR_X3A_X20config_X20error_X20_X3D_X20_X25s), + /* K62 */ be_nested_str_weak(plugins_config), + /* K63 */ be_nested_str_weak(content_start), + /* K64 */ be_nested_str_weak(Parameter_X20error), + /* K65 */ be_nested_str_weak(content_send_style), + /* K66 */ be_nested_str_weak(content_send), + /* K67 */ be_nested_str_weak(_X3Cp_X20style_X3D_X27width_X3A340px_X3B_X27_X3E_X3Cb_X3EError_X3A_X3C_X2Fb_X3E_X25s_X3C_X2Fp_X3E), + /* K68 */ be_nested_str_weak(html_escape), + /* K69 */ be_nested_str_weak(content_button), + /* K70 */ be_nested_str_weak(BUTTON_CONFIGURATION), + /* K71 */ be_nested_str_weak(content_stop), + /* K72 */ be_nested_str_weak(BRY_X3A_X20Exception_X3E_X20_X27_X25s_X27_X20_X2D_X20_X25s), + /* K73 */ be_nested_str_weak(_X3Cp_X20style_X3D_X27width_X3A340px_X3B_X27_X3E_X3Cb_X3EException_X3A_X3C_X2Fb_X3E_X3Cbr_X3E_X27_X25s_X27_X3Cbr_X3E_X25s_X3C_X2Fp_X3E), }), be_str_weak(page_part_ctl), &be_const_str_solidified, - ( &(const binstruction[353]) { /* code */ + ( &(const binstruction[372]) { /* code */ 0xA4060000, // 0000 IMPORT R1 K0 0x8C080301, // 0001 GETMET R2 R1 K1 0x7C080200, // 0002 CALL R2 1 @@ -627,7 +448,7 @@ be_local_closure(Matter_UI_page_part_ctl, /* name */ 0xA40E0600, // 0007 IMPORT R3 K3 0xA4120800, // 0008 IMPORT R4 K4 0x4C140000, // 0009 LDNIL R5 - 0xA8020136, // 000A EXBLK 0 #0142 + 0xA8020149, // 000A EXBLK 0 #0155 0x8C180305, // 000B GETMET R6 R1 K5 0x58200006, // 000C LDCONST R8 K6 0x7C180400, // 000D CALL R6 2 @@ -678,564 +499,317 @@ be_local_closure(Matter_UI_page_part_ctl, /* name */ 0x8C180315, // 003A GETMET R6 R1 K21 0x58200016, // 003B LDCONST R8 K22 0x7C180400, // 003C CALL R6 2 - 0x700200EE, // 003D JMP #012D + 0x70020101, // 003D JMP #0140 0x8C180305, // 003E GETMET R6 R1 K5 0x58200017, // 003F LDCONST R8 K23 0x7C180400, // 0040 CALL R6 2 - 0x781A0014, // 0041 JMPF R6 #0057 - 0xB81A1000, // 0042 GETNGBL R6 K8 - 0x8C180D09, // 0043 GETMET R6 R6 K9 - 0x8C20050A, // 0044 GETMET R8 R2 K10 - 0x5828000B, // 0045 LDCONST R10 K11 - 0x582C0017, // 0046 LDCONST R11 K23 - 0x7C200600, // 0047 CALL R8 3 - 0x5824000C, // 0048 LDCONST R9 K12 - 0x7C180600, // 0049 CALL R6 3 - 0xB81A1000, // 004A GETNGBL R6 K8 - 0x8C180D18, // 004B GETMET R6 R6 K24 - 0x60200008, // 004C GETGBL R8 G8 - 0xB8263400, // 004D GETNGBL R9 K26 - 0x8824131B, // 004E GETMBR R9 R9 K27 - 0x7C200200, // 004F CALL R8 1 - 0x00223208, // 0050 ADD R8 K25 R8 - 0x0020111C, // 0051 ADD R8 R8 K28 + 0x781A0006, // 0041 JMPF R6 #0049 + 0x8818010D, // 0042 GETMBR R6 R0 K13 + 0x8C180D18, // 0043 GETMET R6 R6 K24 + 0x7C180200, // 0044 CALL R6 1 + 0x8C180315, // 0045 GETMET R6 R1 K21 + 0x58200019, // 0046 LDCONST R8 K25 + 0x7C180400, // 0047 CALL R6 2 + 0x700200F6, // 0048 JMP #0140 + 0x8C180305, // 0049 GETMET R6 R1 K5 + 0x5820001A, // 004A LDCONST R8 K26 + 0x7C180400, // 004B CALL R6 2 + 0x781A0006, // 004C JMPF R6 #0054 + 0x8818010D, // 004D GETMBR R6 R0 K13 + 0x8C180D1B, // 004E GETMET R6 R6 K27 + 0x7C180200, // 004F CALL R6 1 + 0x8C180315, // 0050 GETMET R6 R1 K21 + 0x58200019, // 0051 LDCONST R8 K25 0x7C180400, // 0052 CALL R6 2 - 0x8C180315, // 0053 GETMET R6 R1 K21 - 0x58200016, // 0054 LDCONST R8 K22 - 0x7C180400, // 0055 CALL R6 2 - 0x700200D5, // 0056 JMP #012D - 0x8C180305, // 0057 GETMET R6 R1 K5 - 0x5820001D, // 0058 LDCONST R8 K29 - 0x7C180400, // 0059 CALL R6 2 - 0x781A0014, // 005A JMPF R6 #0070 - 0xB81A1000, // 005B GETNGBL R6 K8 - 0x8C180D09, // 005C GETMET R6 R6 K9 - 0x8C20050A, // 005D GETMET R8 R2 K10 - 0x5828000B, // 005E LDCONST R10 K11 - 0x582C001D, // 005F LDCONST R11 K29 - 0x7C200600, // 0060 CALL R8 3 - 0x5824000C, // 0061 LDCONST R9 K12 - 0x7C180600, // 0062 CALL R6 3 - 0xB81A1000, // 0063 GETNGBL R6 K8 - 0x8C180D18, // 0064 GETMET R6 R6 K24 - 0x60200008, // 0065 GETGBL R8 G8 - 0xB8263400, // 0066 GETNGBL R9 K26 - 0x8824131B, // 0067 GETMBR R9 R9 K27 - 0x7C200200, // 0068 CALL R8 1 - 0x00223208, // 0069 ADD R8 K25 R8 - 0x0020111E, // 006A ADD R8 R8 K30 + 0x700200EB, // 0053 JMP #0140 + 0x8C180305, // 0054 GETMET R6 R1 K5 + 0x5820001C, // 0055 LDCONST R8 K28 + 0x7C180400, // 0056 CALL R6 2 + 0x781A0014, // 0057 JMPF R6 #006D + 0xB81A1000, // 0058 GETNGBL R6 K8 + 0x8C180D09, // 0059 GETMET R6 R6 K9 + 0x8C20050A, // 005A GETMET R8 R2 K10 + 0x5828000B, // 005B LDCONST R10 K11 + 0x582C001C, // 005C LDCONST R11 K28 + 0x7C200600, // 005D CALL R8 3 + 0x5824000C, // 005E LDCONST R9 K12 + 0x7C180600, // 005F CALL R6 3 + 0xB81A1000, // 0060 GETNGBL R6 K8 + 0x8C180D1D, // 0061 GETMET R6 R6 K29 + 0x60200008, // 0062 GETGBL R8 G8 + 0xB8263E00, // 0063 GETNGBL R9 K31 + 0x88241320, // 0064 GETMBR R9 R9 K32 + 0x7C200200, // 0065 CALL R8 1 + 0x00223C08, // 0066 ADD R8 K30 R8 + 0x00201121, // 0067 ADD R8 R8 K33 + 0x7C180400, // 0068 CALL R6 2 + 0x8C180315, // 0069 GETMET R6 R1 K21 + 0x58200016, // 006A LDCONST R8 K22 0x7C180400, // 006B CALL R6 2 - 0x8C180315, // 006C GETMET R6 R1 K21 - 0x58200016, // 006D LDCONST R8 K22 - 0x7C180400, // 006E CALL R6 2 - 0x700200BC, // 006F JMP #012D - 0x8C180305, // 0070 GETMET R6 R1 K5 - 0x5820001F, // 0071 LDCONST R8 K31 - 0x7C180400, // 0072 CALL R6 2 - 0x781A0026, // 0073 JMPF R6 #009B - 0xB81A1000, // 0074 GETNGBL R6 K8 - 0x8C180D09, // 0075 GETMET R6 R6 K9 - 0x8C20050A, // 0076 GETMET R8 R2 K10 - 0x5828000B, // 0077 LDCONST R10 K11 - 0x582C001F, // 0078 LDCONST R11 K31 - 0x7C200600, // 0079 CALL R8 3 - 0x5824000C, // 007A LDCONST R9 K12 - 0x7C180600, // 007B CALL R6 3 - 0x60180009, // 007C GETGBL R6 G9 - 0x8C1C030F, // 007D GETMET R7 R1 K15 - 0x5824001F, // 007E LDCONST R9 K31 - 0x7C1C0400, // 007F CALL R7 2 - 0x7C180200, // 0080 CALL R6 1 - 0x581C0020, // 0081 LDCONST R7 K32 - 0x8820010D, // 0082 GETMBR R8 R0 K13 - 0x88201121, // 0083 GETMBR R8 R8 K33 - 0x88201122, // 0084 GETMBR R8 R8 K34 - 0x6024000C, // 0085 GETGBL R9 G12 - 0x5C281000, // 0086 MOVE R10 R8 - 0x7C240200, // 0087 CALL R9 1 - 0x14240E09, // 0088 LT R9 R7 R9 - 0x7826000C, // 0089 JMPF R9 #0097 - 0x94241007, // 008A GETIDX R9 R8 R7 - 0x8C241323, // 008B GETMET R9 R9 K35 - 0x7C240200, // 008C CALL R9 1 - 0x1C241206, // 008D EQ R9 R9 R6 - 0x78260005, // 008E JMPF R9 #0095 - 0x8824010D, // 008F GETMBR R9 R0 K13 - 0x8C241324, // 0090 GETMET R9 R9 K36 - 0x942C1007, // 0091 GETIDX R11 R8 R7 - 0x7C240400, // 0092 CALL R9 2 - 0x70020002, // 0093 JMP #0097 - 0x70020000, // 0094 JMP #0096 - 0x001C0F25, // 0095 ADD R7 R7 K37 - 0x7001FFED, // 0096 JMP #0085 - 0x8C240315, // 0097 GETMET R9 R1 K21 - 0x582C0026, // 0098 LDCONST R11 K38 - 0x7C240400, // 0099 CALL R9 2 - 0x70020091, // 009A JMP #012D - 0x8C180305, // 009B GETMET R6 R1 K5 - 0x58200027, // 009C LDCONST R8 K39 - 0x7C180400, // 009D CALL R6 2 - 0x781A0011, // 009E JMPF R6 #00B1 - 0xB81A1000, // 009F GETNGBL R6 K8 - 0x8C180D09, // 00A0 GETMET R6 R6 K9 - 0x8C20050A, // 00A1 GETMET R8 R2 K10 - 0x5828000B, // 00A2 LDCONST R10 K11 - 0x582C0027, // 00A3 LDCONST R11 K39 - 0x7C200600, // 00A4 CALL R8 3 - 0x5824000C, // 00A5 LDCONST R9 K12 - 0x7C180600, // 00A6 CALL R6 3 - 0x8818010D, // 00A7 GETMBR R6 R0 K13 - 0x501C0000, // 00A8 LDBOOL R7 0 0 - 0x901A5007, // 00A9 SETMBR R6 K40 R7 - 0x8818010D, // 00AA GETMBR R6 R0 K13 - 0x8C180D14, // 00AB GETMET R6 R6 K20 - 0x7C180200, // 00AC CALL R6 1 - 0x8C180315, // 00AD GETMET R6 R1 K21 - 0x58200016, // 00AE LDCONST R8 K22 - 0x7C180400, // 00AF CALL R6 2 - 0x7002007B, // 00B0 JMP #012D + 0x700200D2, // 006C JMP #0140 + 0x8C180305, // 006D GETMET R6 R1 K5 + 0x58200022, // 006E LDCONST R8 K34 + 0x7C180400, // 006F CALL R6 2 + 0x781A0014, // 0070 JMPF R6 #0086 + 0xB81A1000, // 0071 GETNGBL R6 K8 + 0x8C180D09, // 0072 GETMET R6 R6 K9 + 0x8C20050A, // 0073 GETMET R8 R2 K10 + 0x5828000B, // 0074 LDCONST R10 K11 + 0x582C0022, // 0075 LDCONST R11 K34 + 0x7C200600, // 0076 CALL R8 3 + 0x5824000C, // 0077 LDCONST R9 K12 + 0x7C180600, // 0078 CALL R6 3 + 0xB81A1000, // 0079 GETNGBL R6 K8 + 0x8C180D1D, // 007A GETMET R6 R6 K29 + 0x60200008, // 007B GETGBL R8 G8 + 0xB8263E00, // 007C GETNGBL R9 K31 + 0x88241320, // 007D GETMBR R9 R9 K32 + 0x7C200200, // 007E CALL R8 1 + 0x00223C08, // 007F ADD R8 K30 R8 + 0x00201123, // 0080 ADD R8 R8 K35 + 0x7C180400, // 0081 CALL R6 2 + 0x8C180315, // 0082 GETMET R6 R1 K21 + 0x58200016, // 0083 LDCONST R8 K22 + 0x7C180400, // 0084 CALL R6 2 + 0x700200B9, // 0085 JMP #0140 + 0x8C180305, // 0086 GETMET R6 R1 K5 + 0x58200024, // 0087 LDCONST R8 K36 + 0x7C180400, // 0088 CALL R6 2 + 0x781A0026, // 0089 JMPF R6 #00B1 + 0xB81A1000, // 008A GETNGBL R6 K8 + 0x8C180D09, // 008B GETMET R6 R6 K9 + 0x8C20050A, // 008C GETMET R8 R2 K10 + 0x5828000B, // 008D LDCONST R10 K11 + 0x582C0024, // 008E LDCONST R11 K36 + 0x7C200600, // 008F CALL R8 3 + 0x5824000C, // 0090 LDCONST R9 K12 + 0x7C180600, // 0091 CALL R6 3 + 0x60180009, // 0092 GETGBL R6 G9 + 0x8C1C030F, // 0093 GETMET R7 R1 K15 + 0x58240024, // 0094 LDCONST R9 K36 + 0x7C1C0400, // 0095 CALL R7 2 + 0x7C180200, // 0096 CALL R6 1 + 0x581C0025, // 0097 LDCONST R7 K37 + 0x8820010D, // 0098 GETMBR R8 R0 K13 + 0x88201126, // 0099 GETMBR R8 R8 K38 + 0x88201127, // 009A GETMBR R8 R8 K39 + 0x6024000C, // 009B GETGBL R9 G12 + 0x5C281000, // 009C MOVE R10 R8 + 0x7C240200, // 009D CALL R9 1 + 0x14240E09, // 009E LT R9 R7 R9 + 0x7826000C, // 009F JMPF R9 #00AD + 0x94241007, // 00A0 GETIDX R9 R8 R7 + 0x8C241328, // 00A1 GETMET R9 R9 K40 + 0x7C240200, // 00A2 CALL R9 1 + 0x1C241206, // 00A3 EQ R9 R9 R6 + 0x78260005, // 00A4 JMPF R9 #00AB + 0x8824010D, // 00A5 GETMBR R9 R0 K13 + 0x8C241329, // 00A6 GETMET R9 R9 K41 + 0x942C1007, // 00A7 GETIDX R11 R8 R7 + 0x7C240400, // 00A8 CALL R9 2 + 0x70020002, // 00A9 JMP #00AD + 0x70020000, // 00AA JMP #00AC + 0x001C0F2A, // 00AB ADD R7 R7 K42 + 0x7001FFED, // 00AC JMP #009B + 0x8C240315, // 00AD GETMET R9 R1 K21 + 0x582C002B, // 00AE LDCONST R11 K43 + 0x7C240400, // 00AF CALL R9 2 + 0x7002008E, // 00B0 JMP #0140 0x8C180305, // 00B1 GETMET R6 R1 K5 - 0x58200029, // 00B2 LDCONST R8 K41 + 0x5820002C, // 00B2 LDCONST R8 K44 0x7C180400, // 00B3 CALL R6 2 - 0x781A0077, // 00B4 JMPF R6 #012D - 0x60180013, // 00B5 GETGBL R6 G19 - 0x7C180000, // 00B6 CALL R6 0 - 0xB81E1000, // 00B7 GETNGBL R7 K8 - 0x8C1C0F09, // 00B8 GETMET R7 R7 K9 - 0x8C24050A, // 00B9 GETMET R9 R2 K10 - 0x582C000B, // 00BA LDCONST R11 K11 - 0x58300029, // 00BB LDCONST R12 K41 - 0x7C240600, // 00BC CALL R9 3 - 0x5828000C, // 00BD LDCONST R10 K12 - 0x7C1C0600, // 00BE CALL R7 3 - 0x581C0020, // 00BF LDCONST R7 K32 - 0x8C20050A, // 00C0 GETMET R8 R2 K10 - 0x5828002A, // 00C1 LDCONST R10 K42 - 0x5C2C0E00, // 00C2 MOVE R11 R7 - 0x7C200600, // 00C3 CALL R8 3 - 0x8C240305, // 00C4 GETMET R9 R1 K5 - 0x002E5608, // 00C5 ADD R11 K43 R8 - 0x7C240400, // 00C6 CALL R9 2 - 0x78260040, // 00C7 JMPF R9 #0109 - 0x8C24030F, // 00C8 GETMET R9 R1 K15 - 0x002E5608, // 00C9 ADD R11 K43 R8 - 0x7C240400, // 00CA CALL R9 2 - 0x60280009, // 00CB GETGBL R10 G9 - 0x5C2C1200, // 00CC MOVE R11 R9 - 0x7C280200, // 00CD CALL R10 1 - 0x8C2C030F, // 00CE GETMET R11 R1 K15 - 0x00365808, // 00CF ADD R13 K44 R8 - 0x7C2C0400, // 00D0 CALL R11 2 - 0x8C30030F, // 00D1 GETMET R12 R1 K15 - 0x003A1E08, // 00D2 ADD R14 K15 R8 - 0x7C300400, // 00D3 CALL R12 2 - 0xB8361000, // 00D4 GETNGBL R13 K8 - 0x8C341B09, // 00D5 GETMET R13 R13 K9 - 0x8C3C050A, // 00D6 GETMET R15 R2 K10 - 0x5844002D, // 00D7 LDCONST R17 K45 - 0x5C481200, // 00D8 MOVE R18 R9 - 0x5C4C1600, // 00D9 MOVE R19 R11 - 0x5C501800, // 00DA MOVE R20 R12 - 0x7C3C0A00, // 00DB CALL R15 5 - 0x5840000C, // 00DC LDCONST R16 K12 - 0x7C340600, // 00DD CALL R13 3 - 0x2034132E, // 00DE NE R13 R9 K46 - 0x7836001C, // 00DF JMPF R13 #00FD - 0x2034172E, // 00E0 NE R13 R11 K46 - 0x7836001A, // 00E1 JMPF R13 #00FD - 0x8834010D, // 00E2 GETMBR R13 R0 K13 - 0x88341B2F, // 00E3 GETMBR R13 R13 K47 - 0x8C341B30, // 00E4 GETMET R13 R13 K48 - 0x5C3C1600, // 00E5 MOVE R15 R11 - 0x7C340400, // 00E6 CALL R13 2 - 0x4C380000, // 00E7 LDNIL R14 - 0x20381A0E, // 00E8 NE R14 R13 R14 - 0x783A0009, // 00E9 JMPF R14 #00F4 - 0x60380013, // 00EA GETGBL R14 G19 - 0x7C380000, // 00EB CALL R14 0 - 0x983A620B, // 00EC SETIDX R14 K49 R11 - 0x8C3C1B32, // 00ED GETMET R15 R13 K50 - 0x5C441A00, // 00EE MOVE R17 R13 - 0x5C481C00, // 00EF MOVE R18 R14 - 0x5C4C1800, // 00F0 MOVE R19 R12 - 0x7C3C0800, // 00F1 CALL R15 4 - 0x9818120E, // 00F2 SETIDX R6 R9 R14 - 0x70020007, // 00F3 JMP #00FC - 0xB83A1000, // 00F4 GETNGBL R14 K8 - 0x8C381D09, // 00F5 GETMET R14 R14 K9 - 0x8C40050A, // 00F6 GETMET R16 R2 K10 - 0x58480033, // 00F7 LDCONST R18 K51 - 0x5C4C1600, // 00F8 MOVE R19 R11 - 0x7C400600, // 00F9 CALL R16 3 - 0x58440034, // 00FA LDCONST R17 K52 - 0x7C380600, // 00FB CALL R14 3 - 0x70020004, // 00FC JMP #0102 - 0xB8361000, // 00FD GETNGBL R13 K8 - 0x8C341B09, // 00FE GETMET R13 R13 K9 - 0x583C0035, // 00FF LDCONST R15 K53 - 0x58400034, // 0100 LDCONST R16 K52 - 0x7C340600, // 0101 CALL R13 3 - 0x001C0F25, // 0102 ADD R7 R7 K37 - 0x8C34050A, // 0103 GETMET R13 R2 K10 - 0x583C002A, // 0104 LDCONST R15 K42 - 0x5C400E00, // 0105 MOVE R16 R7 - 0x7C340600, // 0106 CALL R13 3 - 0x5C201A00, // 0107 MOVE R8 R13 - 0x7001FFBA, // 0108 JMP #00C4 - 0xB8261000, // 0109 GETNGBL R9 K8 - 0x8C241309, // 010A GETMET R9 R9 K9 - 0x8C2C050A, // 010B GETMET R11 R2 K10 - 0x58340036, // 010C LDCONST R13 K54 - 0x60380008, // 010D GETGBL R14 G8 - 0x5C3C0C00, // 010E MOVE R15 R6 - 0x7C380200, // 010F CALL R14 1 - 0x7C2C0600, // 0110 CALL R11 3 - 0x5830000C, // 0111 LDCONST R12 K12 - 0x7C240600, // 0112 CALL R9 3 - 0x8C240D37, // 0113 GETMET R9 R6 K55 - 0x582C0038, // 0114 LDCONST R11 K56 - 0x7C240400, // 0115 CALL R9 2 - 0x74260000, // 0116 JMPT R9 #0118 - 0x58140039, // 0117 LDCONST R5 K57 - 0x78160008, // 0118 JMPF R5 #0122 - 0xB8261000, // 0119 GETNGBL R9 K8 - 0x8C241309, // 011A GETMET R9 R9 K9 - 0x8C2C050A, // 011B GETMET R11 R2 K10 - 0x5834003A, // 011C LDCONST R13 K58 - 0x5C380A00, // 011D MOVE R14 R5 - 0x7C2C0600, // 011E CALL R11 3 - 0x5830000C, // 011F LDCONST R12 K12 - 0x7C240600, // 0120 CALL R9 3 - 0x7002000A, // 0121 JMP #012D - 0x8824010D, // 0122 GETMBR R9 R0 K13 - 0x90267606, // 0123 SETMBR R9 K59 R6 - 0x8824010D, // 0124 GETMBR R9 R0 K13 - 0x50280200, // 0125 LDBOOL R10 1 0 - 0x9026500A, // 0126 SETMBR R9 K40 R10 - 0x8824010D, // 0127 GETMBR R9 R0 K13 - 0x8C241314, // 0128 GETMET R9 R9 K20 - 0x7C240200, // 0129 CALL R9 1 - 0x8C240315, // 012A GETMET R9 R1 K21 - 0x582C0016, // 012B LDCONST R11 K22 - 0x7C240400, // 012C CALL R9 2 - 0x78160011, // 012D JMPF R5 #0140 - 0x8C18033C, // 012E GETMET R6 R1 K60 - 0x5820003D, // 012F LDCONST R8 K61 - 0x7C180400, // 0130 CALL R6 2 - 0x8C18033E, // 0131 GETMET R6 R1 K62 - 0x7C180200, // 0132 CALL R6 1 - 0x8C18033F, // 0133 GETMET R6 R1 K63 - 0x8C20050A, // 0134 GETMET R8 R2 K10 - 0x58280040, // 0135 LDCONST R10 K64 - 0x8C2C0341, // 0136 GETMET R11 R1 K65 - 0x5C340A00, // 0137 MOVE R13 R5 - 0x7C2C0400, // 0138 CALL R11 2 - 0x7C200600, // 0139 CALL R8 3 - 0x7C180400, // 013A CALL R6 2 - 0x8C180342, // 013B GETMET R6 R1 K66 - 0x88200343, // 013C GETMBR R8 R1 K67 - 0x7C180400, // 013D CALL R6 2 - 0x8C180344, // 013E GETMET R6 R1 K68 - 0x7C180200, // 013F CALL R6 1 - 0xA8040001, // 0140 EXBLK 1 1 - 0x7002001D, // 0141 JMP #0160 - 0xAC180002, // 0142 CATCH R6 0 2 - 0x7002001A, // 0143 JMP #015F - 0xB8221000, // 0144 GETNGBL R8 K8 - 0x8C201109, // 0145 GETMET R8 R8 K9 - 0x8C28050A, // 0146 GETMET R10 R2 K10 - 0x58300045, // 0147 LDCONST R12 K69 - 0x5C340C00, // 0148 MOVE R13 R6 - 0x5C380E00, // 0149 MOVE R14 R7 - 0x7C280800, // 014A CALL R10 4 - 0x582C0034, // 014B LDCONST R11 K52 + 0x781A0011, // 00B4 JMPF R6 #00C7 + 0xB81A1000, // 00B5 GETNGBL R6 K8 + 0x8C180D09, // 00B6 GETMET R6 R6 K9 + 0x8C20050A, // 00B7 GETMET R8 R2 K10 + 0x5828000B, // 00B8 LDCONST R10 K11 + 0x582C002C, // 00B9 LDCONST R11 K44 + 0x7C200600, // 00BA CALL R8 3 + 0x5824000C, // 00BB LDCONST R9 K12 + 0x7C180600, // 00BC CALL R6 3 + 0x8818010D, // 00BD GETMBR R6 R0 K13 + 0x501C0000, // 00BE LDBOOL R7 0 0 + 0x901A5A07, // 00BF SETMBR R6 K45 R7 + 0x8818010D, // 00C0 GETMBR R6 R0 K13 + 0x8C180D14, // 00C1 GETMET R6 R6 K20 + 0x7C180200, // 00C2 CALL R6 1 + 0x8C180315, // 00C3 GETMET R6 R1 K21 + 0x58200016, // 00C4 LDCONST R8 K22 + 0x7C180400, // 00C5 CALL R6 2 + 0x70020078, // 00C6 JMP #0140 + 0x8C180305, // 00C7 GETMET R6 R1 K5 + 0x5820002E, // 00C8 LDCONST R8 K46 + 0x7C180400, // 00C9 CALL R6 2 + 0x781A0074, // 00CA JMPF R6 #0140 + 0x60180013, // 00CB GETGBL R6 G19 + 0x7C180000, // 00CC CALL R6 0 + 0xB81E1000, // 00CD GETNGBL R7 K8 + 0x8C1C0F09, // 00CE GETMET R7 R7 K9 + 0x8C24050A, // 00CF GETMET R9 R2 K10 + 0x582C000B, // 00D0 LDCONST R11 K11 + 0x5830002E, // 00D1 LDCONST R12 K46 + 0x7C240600, // 00D2 CALL R9 3 + 0x5828000C, // 00D3 LDCONST R10 K12 + 0x7C1C0600, // 00D4 CALL R7 3 + 0x581C002A, // 00D5 LDCONST R7 K42 + 0x8C20050A, // 00D6 GETMET R8 R2 K10 + 0x5828002F, // 00D7 LDCONST R10 K47 + 0x5C2C0E00, // 00D8 MOVE R11 R7 + 0x7C200600, // 00D9 CALL R8 3 + 0x8C240305, // 00DA GETMET R9 R1 K5 + 0x002E6008, // 00DB ADD R11 K48 R8 + 0x7C240400, // 00DC CALL R9 2 + 0x78260042, // 00DD JMPF R9 #0121 + 0x8C24030F, // 00DE GETMET R9 R1 K15 + 0x002E6008, // 00DF ADD R11 K48 R8 + 0x7C240400, // 00E0 CALL R9 2 + 0x60280009, // 00E1 GETGBL R10 G9 + 0x5C2C1200, // 00E2 MOVE R11 R9 + 0x7C280200, // 00E3 CALL R10 1 + 0x8C2C030F, // 00E4 GETMET R11 R1 K15 + 0x00366208, // 00E5 ADD R13 K49 R8 + 0x7C2C0400, // 00E6 CALL R11 2 + 0x8C30030F, // 00E7 GETMET R12 R1 K15 + 0x003A1E08, // 00E8 ADD R14 K15 R8 + 0x7C300400, // 00E9 CALL R12 2 + 0xB8361000, // 00EA GETNGBL R13 K8 + 0x8C341B09, // 00EB GETMET R13 R13 K9 + 0x8C3C050A, // 00EC GETMET R15 R2 K10 + 0x58440032, // 00ED LDCONST R17 K50 + 0x5C481200, // 00EE MOVE R18 R9 + 0x5C4C1600, // 00EF MOVE R19 R11 + 0x5C501800, // 00F0 MOVE R20 R12 + 0x7C3C0A00, // 00F1 CALL R15 5 + 0x5840000C, // 00F2 LDCONST R16 K12 + 0x7C340600, // 00F3 CALL R13 3 + 0x20341333, // 00F4 NE R13 R9 K51 + 0x7836001E, // 00F5 JMPF R13 #0115 + 0x20341733, // 00F6 NE R13 R11 K51 + 0x7836001C, // 00F7 JMPF R13 #0115 + 0x20341334, // 00F8 NE R13 R9 K52 + 0x7836001A, // 00F9 JMPF R13 #0115 + 0x8834010D, // 00FA GETMBR R13 R0 K13 + 0x88341B35, // 00FB GETMBR R13 R13 K53 + 0x8C341B36, // 00FC GETMET R13 R13 K54 + 0x5C3C1600, // 00FD MOVE R15 R11 + 0x7C340400, // 00FE CALL R13 2 + 0x4C380000, // 00FF LDNIL R14 + 0x20381A0E, // 0100 NE R14 R13 R14 + 0x783A0009, // 0101 JMPF R14 #010C + 0x60380013, // 0102 GETGBL R14 G19 + 0x7C380000, // 0103 CALL R14 0 + 0x983A6E0B, // 0104 SETIDX R14 K55 R11 + 0x8C3C1B38, // 0105 GETMET R15 R13 K56 + 0x5C441A00, // 0106 MOVE R17 R13 + 0x5C481C00, // 0107 MOVE R18 R14 + 0x5C4C1800, // 0108 MOVE R19 R12 + 0x7C3C0800, // 0109 CALL R15 4 + 0x9818120E, // 010A SETIDX R6 R9 R14 + 0x70020007, // 010B JMP #0114 + 0xB83A1000, // 010C GETNGBL R14 K8 + 0x8C381D09, // 010D GETMET R14 R14 K9 + 0x8C40050A, // 010E GETMET R16 R2 K10 + 0x58480039, // 010F LDCONST R18 K57 + 0x5C4C1600, // 0110 MOVE R19 R11 + 0x7C400600, // 0111 CALL R16 3 + 0x5844003A, // 0112 LDCONST R17 K58 + 0x7C380600, // 0113 CALL R14 3 + 0x70020004, // 0114 JMP #011A + 0xB8361000, // 0115 GETNGBL R13 K8 + 0x8C341B09, // 0116 GETMET R13 R13 K9 + 0x583C003B, // 0117 LDCONST R15 K59 + 0x5840003A, // 0118 LDCONST R16 K58 + 0x7C340600, // 0119 CALL R13 3 + 0x001C0F2A, // 011A ADD R7 R7 K42 + 0x8C34050A, // 011B GETMET R13 R2 K10 + 0x583C002F, // 011C LDCONST R15 K47 + 0x5C400E00, // 011D MOVE R16 R7 + 0x7C340600, // 011E CALL R13 3 + 0x5C201A00, // 011F MOVE R8 R13 + 0x7001FFB8, // 0120 JMP #00DA + 0xB8261000, // 0121 GETNGBL R9 K8 + 0x8C241309, // 0122 GETMET R9 R9 K9 + 0x8C2C050A, // 0123 GETMET R11 R2 K10 + 0x5834003C, // 0124 LDCONST R13 K60 + 0x60380008, // 0125 GETGBL R14 G8 + 0x5C3C0C00, // 0126 MOVE R15 R6 + 0x7C380200, // 0127 CALL R14 1 + 0x7C2C0600, // 0128 CALL R11 3 + 0x5830000C, // 0129 LDCONST R12 K12 + 0x7C240600, // 012A CALL R9 3 + 0x78160008, // 012B JMPF R5 #0135 + 0xB8261000, // 012C GETNGBL R9 K8 + 0x8C241309, // 012D GETMET R9 R9 K9 + 0x8C2C050A, // 012E GETMET R11 R2 K10 + 0x5834003D, // 012F LDCONST R13 K61 + 0x5C380A00, // 0130 MOVE R14 R5 + 0x7C2C0600, // 0131 CALL R11 3 + 0x5830000C, // 0132 LDCONST R12 K12 + 0x7C240600, // 0133 CALL R9 3 + 0x7002000A, // 0134 JMP #0140 + 0x8824010D, // 0135 GETMBR R9 R0 K13 + 0x90267C06, // 0136 SETMBR R9 K62 R6 + 0x8824010D, // 0137 GETMBR R9 R0 K13 + 0x50280200, // 0138 LDBOOL R10 1 0 + 0x90265A0A, // 0139 SETMBR R9 K45 R10 + 0x8824010D, // 013A GETMBR R9 R0 K13 + 0x8C241314, // 013B GETMET R9 R9 K20 + 0x7C240200, // 013C CALL R9 1 + 0x8C240315, // 013D GETMET R9 R1 K21 + 0x582C0016, // 013E LDCONST R11 K22 + 0x7C240400, // 013F CALL R9 2 + 0x78160011, // 0140 JMPF R5 #0153 + 0x8C18033F, // 0141 GETMET R6 R1 K63 + 0x58200040, // 0142 LDCONST R8 K64 + 0x7C180400, // 0143 CALL R6 2 + 0x8C180341, // 0144 GETMET R6 R1 K65 + 0x7C180200, // 0145 CALL R6 1 + 0x8C180342, // 0146 GETMET R6 R1 K66 + 0x8C20050A, // 0147 GETMET R8 R2 K10 + 0x58280043, // 0148 LDCONST R10 K67 + 0x8C2C0344, // 0149 GETMET R11 R1 K68 + 0x5C340A00, // 014A MOVE R13 R5 + 0x7C2C0400, // 014B CALL R11 2 0x7C200600, // 014C CALL R8 3 - 0x8C20033C, // 014D GETMET R8 R1 K60 - 0x5828003D, // 014E LDCONST R10 K61 - 0x7C200400, // 014F CALL R8 2 - 0x8C20033E, // 0150 GETMET R8 R1 K62 - 0x7C200200, // 0151 CALL R8 1 - 0x8C20033F, // 0152 GETMET R8 R1 K63 - 0x8C28050A, // 0153 GETMET R10 R2 K10 - 0x58300046, // 0154 LDCONST R12 K70 - 0x5C340C00, // 0155 MOVE R13 R6 - 0x5C380E00, // 0156 MOVE R14 R7 - 0x7C280800, // 0157 CALL R10 4 - 0x7C200400, // 0158 CALL R8 2 - 0x8C200342, // 0159 GETMET R8 R1 K66 - 0x88280343, // 015A GETMBR R10 R1 K67 - 0x7C200400, // 015B CALL R8 2 - 0x8C200344, // 015C GETMET R8 R1 K68 - 0x7C200200, // 015D CALL R8 1 - 0x70020000, // 015E JMP #0160 - 0xB0080000, // 015F RAISE 2 R0 R0 - 0x80000000, // 0160 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: show_passcode_form -********************************************************************/ -be_local_closure(Matter_UI_show_passcode_form, /* name */ - be_nested_proto( - 9, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[19]) { /* constants */ - /* K0 */ be_nested_str_weak(webserver), - /* K1 */ be_nested_str_weak(string), - /* K2 */ be_nested_str_weak(content_send), - /* K3 */ be_nested_str_weak(_X3Cfieldset_X3E_X3Clegend_X3E_X3Cb_X3E_X26nbsp_X3BMatter_X20Passcode_X26nbsp_X3B_X3C_X2Fb_X3E_X3C_X2Flegend_X3E_X3Cp_X3E_X3C_X2Fp_X3E), - /* K4 */ be_nested_str_weak(_X3Cform_X20action_X3D_X27_X2Fmatterc_X27_X20method_X3D_X27post_X27_X20onsubmit_X3D_X27return_X20confirm_X28_X22This_X20will_X20cause_X20a_X20restart_X2E_X22_X29_X3B_X27_X3E), - /* K5 */ be_nested_str_weak(_X3Cp_X3EPasscode_X3A_X3C_X2Fp_X3E), - /* K6 */ be_nested_str_weak(format), - /* K7 */ be_nested_str_weak(_X3Cinput_X20type_X3D_X27number_X27_X20min_X3D_X271_X27_X20max_X3D_X2799999998_X27_X20name_X3D_X27passcode_X27_X20value_X3D_X27_X25i_X27_X3E), - /* K8 */ be_nested_str_weak(device), - /* K9 */ be_nested_str_weak(root_passcode), - /* K10 */ be_nested_str_weak(_X3Cp_X3EDistinguish_X20id_X3A_X3C_X2Fp_X3E), - /* K11 */ be_nested_str_weak(_X3Cinput_X20type_X3D_X27number_X27_X20min_X3D_X270_X27_X20max_X3D_X274095_X27_X20name_X3D_X27discriminator_X27_X20value_X3D_X27_X25i_X27_X3E), - /* K12 */ be_nested_str_weak(root_discriminator), - /* K13 */ be_nested_str_weak(_X3Cp_X3E_X3Cinput_X20type_X3D_X27checkbox_X27_X20name_X3D_X27ipv4_X27_X25s_X3EIPv4_X20only_X3C_X2Fp_X3E), - /* K14 */ be_nested_str_weak(ipv4only), - /* K15 */ be_nested_str_weak(_X20checked), - /* K16 */ be_nested_str_weak(), - /* K17 */ be_nested_str_weak(_X3Cp_X3E_X3C_X2Fp_X3E_X3Cbutton_X20name_X3D_X27passcode_X27_X20class_X3D_X27button_X20bgrn_X27_X3EChange_X3C_X2Fbutton_X3E_X3C_X2Fform_X3E_X3C_X2Fp_X3E), - /* K18 */ be_nested_str_weak(_X3Cp_X3E_X3C_X2Fp_X3E_X3C_X2Ffieldset_X3E_X3Cp_X3E_X3C_X2Fp_X3E), - }), - be_str_weak(show_passcode_form), - &be_const_str_solidified, - ( &(const binstruction[46]) { /* code */ - 0xA4060000, // 0000 IMPORT R1 K0 - 0xA40A0200, // 0001 IMPORT R2 K1 - 0x8C0C0302, // 0002 GETMET R3 R1 K2 - 0x58140003, // 0003 LDCONST R5 K3 - 0x7C0C0400, // 0004 CALL R3 2 - 0x8C0C0302, // 0005 GETMET R3 R1 K2 - 0x58140004, // 0006 LDCONST R5 K4 - 0x7C0C0400, // 0007 CALL R3 2 - 0x8C0C0302, // 0008 GETMET R3 R1 K2 - 0x58140005, // 0009 LDCONST R5 K5 - 0x7C0C0400, // 000A CALL R3 2 - 0x8C0C0302, // 000B GETMET R3 R1 K2 - 0x8C140506, // 000C GETMET R5 R2 K6 - 0x581C0007, // 000D LDCONST R7 K7 - 0x88200108, // 000E GETMBR R8 R0 K8 - 0x88201109, // 000F GETMBR R8 R8 K9 - 0x7C140600, // 0010 CALL R5 3 - 0x7C0C0400, // 0011 CALL R3 2 - 0x8C0C0302, // 0012 GETMET R3 R1 K2 - 0x5814000A, // 0013 LDCONST R5 K10 - 0x7C0C0400, // 0014 CALL R3 2 - 0x8C0C0302, // 0015 GETMET R3 R1 K2 - 0x8C140506, // 0016 GETMET R5 R2 K6 - 0x581C000B, // 0017 LDCONST R7 K11 - 0x88200108, // 0018 GETMBR R8 R0 K8 - 0x8820110C, // 0019 GETMBR R8 R8 K12 - 0x7C140600, // 001A CALL R5 3 - 0x7C0C0400, // 001B CALL R3 2 - 0x8C0C0302, // 001C GETMET R3 R1 K2 - 0x8C140506, // 001D GETMET R5 R2 K6 - 0x581C000D, // 001E LDCONST R7 K13 - 0x88200108, // 001F GETMBR R8 R0 K8 - 0x8820110E, // 0020 GETMBR R8 R8 K14 - 0x78220001, // 0021 JMPF R8 #0024 - 0x5820000F, // 0022 LDCONST R8 K15 - 0x70020000, // 0023 JMP #0025 - 0x58200010, // 0024 LDCONST R8 K16 - 0x7C140600, // 0025 CALL R5 3 - 0x7C0C0400, // 0026 CALL R3 2 - 0x8C0C0302, // 0027 GETMET R3 R1 K2 - 0x58140011, // 0028 LDCONST R5 K17 - 0x7C0C0400, // 0029 CALL R3 2 - 0x8C0C0302, // 002A GETMET R3 R1 K2 - 0x58140012, // 002B LDCONST R5 K18 - 0x7C0C0400, // 002C CALL R3 2 - 0x80000000, // 002D RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: web_add_handler -********************************************************************/ -be_local_closure(Matter_UI_web_add_handler, /* name */ - be_nested_proto( - 7, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 1, /* has sup protos */ - ( &(const struct bproto*[ 2]) { - be_nested_proto( - 2, /* nstack */ - 0, /* argc */ - 0, /* varg */ - 1, /* has upvals */ - ( &(const bupvaldesc[ 1]) { /* upvals */ - be_local_const_upval(1, 0), - }), - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 1]) { /* constants */ - /* K0 */ be_nested_str_weak(page_part_mgr), - }), - be_str_weak(_X3Clambda_X3E), - &be_const_str_solidified, - ( &(const binstruction[ 4]) { /* code */ - 0x68000000, // 0000 GETUPV R0 U0 - 0x8C000100, // 0001 GETMET R0 R0 K0 - 0x7C000200, // 0002 CALL R0 1 - 0x80040000, // 0003 RET 1 R0 - }) - ), - be_nested_proto( - 2, /* nstack */ - 0, /* argc */ - 0, /* varg */ - 1, /* has upvals */ - ( &(const bupvaldesc[ 1]) { /* upvals */ - be_local_const_upval(1, 0), - }), - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 1]) { /* constants */ - /* K0 */ be_nested_str_weak(page_part_ctl), - }), - be_str_weak(_X3Clambda_X3E), - &be_const_str_solidified, - ( &(const binstruction[ 4]) { /* code */ - 0x68000000, // 0000 GETUPV R0 U0 - 0x8C000100, // 0001 GETMET R0 R0 K0 - 0x7C000200, // 0002 CALL R0 1 - 0x80040000, // 0003 RET 1 R0 - }) - ), - }), - 1, /* has constants */ - ( &(const bvalue[ 5]) { /* constants */ - /* K0 */ be_nested_str_weak(webserver), - /* K1 */ be_nested_str_weak(on), - /* K2 */ be_nested_str_weak(_X2Fmatterc), - /* K3 */ be_nested_str_weak(HTTP_GET), - /* K4 */ be_nested_str_weak(HTTP_POST), - }), - be_str_weak(web_add_handler), - &be_const_str_solidified, - ( &(const binstruction[13]) { /* code */ - 0xA4060000, // 0000 IMPORT R1 K0 - 0x8C080301, // 0001 GETMET R2 R1 K1 - 0x58100002, // 0002 LDCONST R4 K2 - 0x84140000, // 0003 CLOSURE R5 P0 - 0x88180303, // 0004 GETMBR R6 R1 K3 - 0x7C080800, // 0005 CALL R2 4 - 0x8C080301, // 0006 GETMET R2 R1 K1 - 0x58100002, // 0007 LDCONST R4 K2 - 0x84140001, // 0008 CLOSURE R5 P1 - 0x88180304, // 0009 GETMBR R6 R1 K4 - 0x7C080800, // 000A CALL R2 4 - 0xA0000000, // 000B CLOSE R0 - 0x80000000, // 000C RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: show_enable -********************************************************************/ -be_local_closure(Matter_UI_show_enable, /* name */ - be_nested_proto( - 11, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[20]) { /* constants */ - /* K0 */ be_nested_str_weak(webserver), - /* K1 */ be_nested_str_weak(string), - /* K2 */ be_nested_str_weak(tasmota), - /* K3 */ be_nested_str_weak(get_option), - /* K4 */ be_nested_str_weak(matter), - /* K5 */ be_nested_str_weak(MATTER_OPTION), - /* K6 */ be_nested_str_weak(content_send), - /* K7 */ be_nested_str_weak(format), - /* K8 */ be_nested_str_weak(_X3Cfieldset_X3E_X3Clegend_X3E_X3Cb_X3E_X26nbsp_X3BMatter_X20_X25s_X26nbsp_X3B_X3C_X2Fb_X3E_X3C_X2Flegend_X3E_X3Cp_X3E_X3C_X2Fp_X3E), - /* K9 */ be_nested_str_weak(Enabled), - /* K10 */ be_nested_str_weak(Disabled), - /* K11 */ be_nested_str_weak(_X3Cp_X20style_X3D_X27width_X3A320px_X3B_X27_X3ECheck_X20the_X20_X3Ca_X20href_X3D_X27https_X3A_X2F_X2Ftasmota_X2Egithub_X2Eio_X2Fdocs_X2FMatter_X2F_X27_X20target_X3D_X27_blank_X27_X3EMatter_X20documentation_X3C_X2Fa_X3E_X2E_X3C_X2Fp_X3E), - /* K12 */ be_nested_str_weak(_X3Cform_X20action_X3D_X27_X2Fmatterc_X27_X20method_X3D_X27post_X27_X20onsubmit_X3D_X27return_X20confirm_X28_X22This_X20will_X20cause_X20a_X20restart_X2E_X22_X29_X3B_X27_X3E), - /* K13 */ be_nested_str_weak(_X3Cp_X3E_X3C_X2Fp_X3E_X3Cbutton_X20name_X3D_X27_X25s_X27_X20class_X3D_X27button_X20bgrn_X27_X3E), - /* K14 */ be_nested_str_weak(disable), - /* K15 */ be_nested_str_weak(enable), - /* K16 */ be_nested_str_weak(Disable), - /* K17 */ be_nested_str_weak(Enable), - /* K18 */ be_nested_str_weak(_X20Matter_X3C_X2Fbutton_X3E_X3C_X2Fform_X3E_X3C_X2Fp_X3E), - /* K19 */ be_nested_str_weak(_X3Cp_X3E_X3C_X2Fp_X3E_X3C_X2Ffieldset_X3E_X3Cp_X3E_X3C_X2Fp_X3E), - }), - be_str_weak(show_enable), - &be_const_str_solidified, - ( &(const binstruction[44]) { /* code */ - 0xA40A0000, // 0000 IMPORT R2 K0 - 0xA40E0200, // 0001 IMPORT R3 K1 - 0xB8120400, // 0002 GETNGBL R4 K2 - 0x8C100903, // 0003 GETMET R4 R4 K3 - 0xB81A0800, // 0004 GETNGBL R6 K4 - 0x88180D05, // 0005 GETMBR R6 R6 K5 - 0x7C100400, // 0006 CALL R4 2 - 0x8C140506, // 0007 GETMET R5 R2 K6 - 0x8C1C0707, // 0008 GETMET R7 R3 K7 - 0x58240008, // 0009 LDCONST R9 K8 - 0x78120001, // 000A JMPF R4 #000D - 0x58280009, // 000B LDCONST R10 K9 - 0x70020000, // 000C JMP #000E - 0x5828000A, // 000D LDCONST R10 K10 - 0x7C1C0600, // 000E CALL R7 3 - 0x7C140400, // 000F CALL R5 2 - 0x8C140506, // 0010 GETMET R5 R2 K6 - 0x581C000B, // 0011 LDCONST R7 K11 - 0x7C140400, // 0012 CALL R5 2 - 0x8C140506, // 0013 GETMET R5 R2 K6 - 0x581C000C, // 0014 LDCONST R7 K12 - 0x7C140400, // 0015 CALL R5 2 - 0x8C140506, // 0016 GETMET R5 R2 K6 - 0x8C1C0707, // 0017 GETMET R7 R3 K7 - 0x5824000D, // 0018 LDCONST R9 K13 - 0x78120001, // 0019 JMPF R4 #001C - 0x5828000E, // 001A LDCONST R10 K14 - 0x70020000, // 001B JMP #001D - 0x5828000F, // 001C LDCONST R10 K15 - 0x7C1C0600, // 001D CALL R7 3 - 0x7C140400, // 001E CALL R5 2 - 0x8C140506, // 001F GETMET R5 R2 K6 - 0x78120001, // 0020 JMPF R4 #0023 - 0x581C0010, // 0021 LDCONST R7 K16 - 0x70020000, // 0022 JMP #0024 - 0x581C0011, // 0023 LDCONST R7 K17 - 0x7C140400, // 0024 CALL R5 2 - 0x8C140506, // 0025 GETMET R5 R2 K6 - 0x581C0012, // 0026 LDCONST R7 K18 - 0x7C140400, // 0027 CALL R5 2 - 0x8C140506, // 0028 GETMET R5 R2 K6 - 0x581C0013, // 0029 LDCONST R7 K19 - 0x7C140400, // 002A CALL R5 2 - 0x80040800, // 002B RET 1 R4 + 0x7C180400, // 014D CALL R6 2 + 0x8C180345, // 014E GETMET R6 R1 K69 + 0x88200346, // 014F GETMBR R8 R1 K70 + 0x7C180400, // 0150 CALL R6 2 + 0x8C180347, // 0151 GETMET R6 R1 K71 + 0x7C180200, // 0152 CALL R6 1 + 0xA8040001, // 0153 EXBLK 1 1 + 0x7002001D, // 0154 JMP #0173 + 0xAC180002, // 0155 CATCH R6 0 2 + 0x7002001A, // 0156 JMP #0172 + 0xB8221000, // 0157 GETNGBL R8 K8 + 0x8C201109, // 0158 GETMET R8 R8 K9 + 0x8C28050A, // 0159 GETMET R10 R2 K10 + 0x58300048, // 015A LDCONST R12 K72 + 0x5C340C00, // 015B MOVE R13 R6 + 0x5C380E00, // 015C MOVE R14 R7 + 0x7C280800, // 015D CALL R10 4 + 0x582C003A, // 015E LDCONST R11 K58 + 0x7C200600, // 015F CALL R8 3 + 0x8C20033F, // 0160 GETMET R8 R1 K63 + 0x58280040, // 0161 LDCONST R10 K64 + 0x7C200400, // 0162 CALL R8 2 + 0x8C200341, // 0163 GETMET R8 R1 K65 + 0x7C200200, // 0164 CALL R8 1 + 0x8C200342, // 0165 GETMET R8 R1 K66 + 0x8C28050A, // 0166 GETMET R10 R2 K10 + 0x58300049, // 0167 LDCONST R12 K73 + 0x5C340C00, // 0168 MOVE R13 R6 + 0x5C380E00, // 0169 MOVE R14 R7 + 0x7C280800, // 016A CALL R10 4 + 0x7C200400, // 016B CALL R8 2 + 0x8C200345, // 016C GETMET R8 R1 K69 + 0x88280346, // 016D GETMBR R10 R1 K70 + 0x7C200400, // 016E CALL R8 2 + 0x8C200347, // 016F GETMET R8 R1 K71 + 0x7C200200, // 0170 CALL R8 1 + 0x70020000, // 0171 JMP #0173 + 0xB0080000, // 0172 RAISE 2 R0 R0 + 0x80000000, // 0173 RET 0 }) ) ); @@ -1290,6 +864,228 @@ be_local_closure(Matter_UI_web_get_arg, /* name */ /*******************************************************************/ +/******************************************************************** +** Solidified function: show_plugins_configuration +********************************************************************/ +be_local_closure(Matter_UI_show_plugins_configuration, /* name */ + be_nested_proto( + 19, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[38]) { /* constants */ + /* K0 */ be_nested_str_weak(webserver), + /* K1 */ be_nested_str_weak(string), + /* K2 */ be_nested_str_weak(content_send), + /* K3 */ be_nested_str_weak(_X3Cfieldset_X3E_X3Clegend_X3E_X3Cb_X3E_X26nbsp_X3BCurrent_X20Configuration_X26nbsp_X3B_X3C_X2Fb_X3E_X3C_X2Flegend_X3E_X3Cp_X3E_X3C_X2Fp_X3E), + /* K4 */ be_nested_str_weak(_X3Cform_X20action_X3D_X27_X2Fmatterc_X27_X20method_X3D_X27post_X27), + /* K5 */ be_nested_str_weak(onsubmit_X3D_X27return_X20confirm_X28_X22This_X20will_X20RESET_X20the_X20configuration_X20to_X20the_X20default_X2E_X20You_X20will_X20need_X20to_X20associate_X20again_X2E_X22_X29_X3B_X27_X3E), + /* K6 */ be_nested_str_weak(_X3Cbutton_X20name_X3D_X27auto_X27_X20class_X3D_X27button_X20bred_X27_X3EReset_X20to_X20default_X3C_X2Fbutton_X3E_X3Cp_X3E_X3C_X2Fp_X3E_X3C_X2Fform_X3E), + /* K7 */ be_nested_str_weak(onsubmit_X3D_X27return_X20confirm_X28_X22Changing_X20the_X20configuration_X20requires_X20to_X20associate_X20again_X2E_X22_X29_X3B_X27_X3E), + /* K8 */ be_nested_str_weak(_X3Ctable_X20style_X3D_X27width_X3A100_X25_X27_X3E), + /* K9 */ be_nested_str_weak(_X3Ctr_X3E_X3Ctd_X20width_X3D_X2735_X27_X3E_X3Cb_X3EEp_X2E_X3C_X2Fb_X3E_X3C_X2Ftd_X3E_X3Ctd_X3E_X3Cb_X3EType_X3C_X2Fb_X3E_X3C_X2Ftd_X3E_X3Ctd_X3E_X3Cb_X3EParam_X3C_X2Fb_X3E_X3C_X2Ftd_X3E_X3C_X2Ftr_X3E), + /* K10 */ be_nested_str_weak(device), + /* K11 */ be_nested_str_weak(k2l_num), + /* K12 */ be_nested_str_weak(plugins_config), + /* K13 */ be_const_int(0), + /* K14 */ be_nested_str_weak(_X3Ctr_X3E_X3Ctd_X3E_X3Cinput_X20type_X3D_X27text_X27_X20name_X3D_X27ep000_X27_X20maxlength_X3D_X274_X27_X20size_X3D_X273_X27_X20value_X3D_X270_X27_X20readonly_X20disabled_X3E_X3C_X2Ftd_X3E), + /* K15 */ be_nested_str_weak(_X3Ctd_X3E_X3Cselect_X20name_X3D_X27pi000_X27_X3E), + /* K16 */ be_nested_str_weak(_X3Coption_X20value_X3D_X27_X27_X20selected_X20disabled_X3ERoot_X20node_X3C_X2Foption_X3E), + /* K17 */ be_nested_str_weak(_X3C_X2Fselect_X3E_X3C_X2Ftd_X3E), + /* K18 */ be_nested_str_weak(_X3Ctd_X3E_X3Cfont_X20size_X3D_X27_X2D1_X27_X3E_X26nbsp_X3B_X3C_X2Ffont_X3E_X3C_X2Ftd_X3E), + /* K19 */ be_const_int(1), + /* K20 */ be_nested_str_weak(find), + /* K21 */ be_nested_str_weak(type), + /* K22 */ be_nested_str_weak(plugins_classes), + /* K23 */ be_nested_str_weak(), + /* K24 */ be_nested_str_weak(ui_conf_to_string), + /* K25 */ be_nested_str_weak(format), + /* K26 */ be_nested_str_weak(_X3Ctr_X3E_X3Ctd_X3E_X3Cinput_X20type_X3D_X27text_X27_X20name_X3D_X27ep_X2503i_X27_X20maxlength_X3D_X274_X27_X20size_X3D_X273_X27_X20pattern_X3D_X27_X5B0_X2D9_X5D_X7B1_X2C4_X7D_X27_X20value_X3D_X27_X25i_X27_X3E_X3C_X2Ftd_X3E), + /* K27 */ be_nested_str_weak(_X3Ctd_X3E_X3Cselect_X20name_X3D_X27pi_X2503i_X27_X3E), + /* K28 */ be_nested_str_weak(plugin_option), + /* K29 */ be_nested_str_weak(_CLASSES_TYPES), + /* K30 */ be_nested_str_weak(_CLASSES_TYPES2), + /* K31 */ be_nested_str_weak(_X3Ctd_X3E_X3Cfont_X20size_X3D_X27_X2D1_X27_X3E_X3Cinput_X20type_X3D_X27text_X27_X20name_X3D_X27arg_X2503i_X27_X20minlength_X3D_X270_X27_X20size_X3D_X278_X27_X20value_X3D_X27_X25s_X27_X3E_X3C_X2Ffont_X3E_X3C_X2Ftd_X3E), + /* K32 */ be_nested_str_weak(html_escape), + /* K33 */ be_nested_str_weak(_X3Ctr_X3E_X3Ctd_X3E_X3Cinput_X20type_X3D_X27text_X27_X20name_X3D_X27ep_X2503i_X27_X20maxlength_X3D_X274_X27_X20size_X3D_X273_X27_X20pattern_X3D_X27_X5B0_X2D9_X5D_X7B1_X2C4_X7D_X27_X20value_X3D_X27_X27_X3E_X3C_X2Ftd_X3E), + /* K34 */ be_nested_str_weak(_X3Ctd_X3E_X3Cfont_X20size_X3D_X27_X2D1_X27_X3E_X3Cinput_X20type_X3D_X27text_X27_X20name_X3D_X27arg_X2503i_X27_X20minlength_X3D_X270_X27_X20size_X3D_X278_X27_X20value_X3D_X27_X27_X3E_X3C_X2Ffont_X3E_X3C_X2Ftd_X3E), + /* K35 */ be_nested_str_weak(_X3C_X2Ftable_X3E_X3Cp_X3E_X3C_X2Fp_X3E), + /* K36 */ be_nested_str_weak(_X3Cbutton_X20name_X3D_X27config_X27_X20class_X3D_X27button_X20bgrn_X27_X3EChange_X20configuration_X3C_X2Fbutton_X3E_X3C_X2Fform_X3E), + /* K37 */ be_nested_str_weak(_X3Cp_X3E_X3C_X2Fp_X3E_X3C_X2Ffieldset_X3E_X3Cp_X3E_X3C_X2Fp_X3E), + }), + be_str_weak(show_plugins_configuration), + &be_const_str_solidified, + ( &(const binstruction[160]) { /* code */ + 0xA4060000, // 0000 IMPORT R1 K0 + 0xA40A0200, // 0001 IMPORT R2 K1 + 0x8C0C0302, // 0002 GETMET R3 R1 K2 + 0x58140003, // 0003 LDCONST R5 K3 + 0x7C0C0400, // 0004 CALL R3 2 + 0x8C0C0302, // 0005 GETMET R3 R1 K2 + 0x58140004, // 0006 LDCONST R5 K4 + 0x7C0C0400, // 0007 CALL R3 2 + 0x8C0C0302, // 0008 GETMET R3 R1 K2 + 0x58140005, // 0009 LDCONST R5 K5 + 0x7C0C0400, // 000A CALL R3 2 + 0x8C0C0302, // 000B GETMET R3 R1 K2 + 0x58140006, // 000C LDCONST R5 K6 + 0x7C0C0400, // 000D CALL R3 2 + 0x8C0C0302, // 000E GETMET R3 R1 K2 + 0x58140004, // 000F LDCONST R5 K4 + 0x7C0C0400, // 0010 CALL R3 2 + 0x8C0C0302, // 0011 GETMET R3 R1 K2 + 0x58140007, // 0012 LDCONST R5 K7 + 0x7C0C0400, // 0013 CALL R3 2 + 0x8C0C0302, // 0014 GETMET R3 R1 K2 + 0x58140008, // 0015 LDCONST R5 K8 + 0x7C0C0400, // 0016 CALL R3 2 + 0x8C0C0302, // 0017 GETMET R3 R1 K2 + 0x58140009, // 0018 LDCONST R5 K9 + 0x7C0C0400, // 0019 CALL R3 2 + 0x880C010A, // 001A GETMBR R3 R0 K10 + 0x8C0C070B, // 001B GETMET R3 R3 K11 + 0x8814010A, // 001C GETMBR R5 R0 K10 + 0x88140B0C, // 001D GETMBR R5 R5 K12 + 0x7C0C0400, // 001E CALL R3 2 + 0x5810000D, // 001F LDCONST R4 K13 + 0x8C140302, // 0020 GETMET R5 R1 K2 + 0x581C000E, // 0021 LDCONST R7 K14 + 0x7C140400, // 0022 CALL R5 2 + 0x8C140302, // 0023 GETMET R5 R1 K2 + 0x581C000F, // 0024 LDCONST R7 K15 + 0x7C140400, // 0025 CALL R5 2 + 0x8C140302, // 0026 GETMET R5 R1 K2 + 0x581C0010, // 0027 LDCONST R7 K16 + 0x7C140400, // 0028 CALL R5 2 + 0x8C140302, // 0029 GETMET R5 R1 K2 + 0x581C0011, // 002A LDCONST R7 K17 + 0x7C140400, // 002B CALL R5 2 + 0x8C140302, // 002C GETMET R5 R1 K2 + 0x581C0012, // 002D LDCONST R7 K18 + 0x7C140400, // 002E CALL R5 2 + 0x6014000C, // 002F GETGBL R5 G12 + 0x5C180600, // 0030 MOVE R6 R3 + 0x7C140200, // 0031 CALL R5 1 + 0x14140805, // 0032 LT R5 R4 R5 + 0x78160045, // 0033 JMPF R5 #007A + 0x94140604, // 0034 GETIDX R5 R3 R4 + 0x1C180B0D, // 0035 EQ R6 R5 K13 + 0x781A0001, // 0036 JMPF R6 #0039 + 0x00100913, // 0037 ADD R4 R4 K19 + 0x7001FFF5, // 0038 JMP #002F + 0x8818010A, // 0039 GETMBR R6 R0 K10 + 0x601C0008, // 003A GETGBL R7 G8 + 0x5C200A00, // 003B MOVE R8 R5 + 0x7C1C0200, // 003C CALL R7 1 + 0x88180D0C, // 003D GETMBR R6 R6 K12 + 0x94180C07, // 003E GETIDX R6 R6 R7 + 0x8C200D14, // 003F GETMET R8 R6 K20 + 0x58280015, // 0040 LDCONST R10 K21 + 0x7C200400, // 0041 CALL R8 2 + 0x5C1C1000, // 0042 MOVE R7 R8 + 0x5C200E00, // 0043 MOVE R8 R7 + 0x74220001, // 0044 JMPT R8 #0047 + 0x00100913, // 0045 ADD R4 R4 K19 + 0x7001FFE7, // 0046 JMP #002F + 0x8820010A, // 0047 GETMBR R8 R0 K10 + 0x88201116, // 0048 GETMBR R8 R8 K22 + 0x8C201114, // 0049 GETMET R8 R8 K20 + 0x5C280E00, // 004A MOVE R10 R7 + 0x7C200400, // 004B CALL R8 2 + 0x58240017, // 004C LDCONST R9 K23 + 0x4C280000, // 004D LDNIL R10 + 0x2028100A, // 004E NE R10 R8 R10 + 0x782A0004, // 004F JMPF R10 #0055 + 0x8C281118, // 0050 GETMET R10 R8 K24 + 0x5C301000, // 0051 MOVE R12 R8 + 0x5C340C00, // 0052 MOVE R13 R6 + 0x7C280600, // 0053 CALL R10 3 + 0x5C241400, // 0054 MOVE R9 R10 + 0x8C280302, // 0055 GETMET R10 R1 K2 + 0x8C300519, // 0056 GETMET R12 R2 K25 + 0x5838001A, // 0057 LDCONST R14 K26 + 0x5C3C0800, // 0058 MOVE R15 R4 + 0x5C400A00, // 0059 MOVE R16 R5 + 0x7C300800, // 005A CALL R12 4 + 0x7C280400, // 005B CALL R10 2 + 0x8C280302, // 005C GETMET R10 R1 K2 + 0x8C300519, // 005D GETMET R12 R2 K25 + 0x5838001B, // 005E LDCONST R14 K27 + 0x5C3C0800, // 005F MOVE R15 R4 + 0x7C300600, // 0060 CALL R12 3 + 0x7C280400, // 0061 CALL R10 2 + 0x8C28011C, // 0062 GETMET R10 R0 K28 + 0x8C300D14, // 0063 GETMET R12 R6 K20 + 0x58380015, // 0064 LDCONST R14 K21 + 0x583C0017, // 0065 LDCONST R15 K23 + 0x7C300600, // 0066 CALL R12 3 + 0x8834011D, // 0067 GETMBR R13 R0 K29 + 0x8838011E, // 0068 GETMBR R14 R0 K30 + 0x7C280800, // 0069 CALL R10 4 + 0x8C280302, // 006A GETMET R10 R1 K2 + 0x8C300519, // 006B GETMET R12 R2 K25 + 0x58380011, // 006C LDCONST R14 K17 + 0x7C300400, // 006D CALL R12 2 + 0x7C280400, // 006E CALL R10 2 + 0x8C280302, // 006F GETMET R10 R1 K2 + 0x8C300519, // 0070 GETMET R12 R2 K25 + 0x5838001F, // 0071 LDCONST R14 K31 + 0x5C3C0800, // 0072 MOVE R15 R4 + 0x8C400320, // 0073 GETMET R16 R1 K32 + 0x5C481200, // 0074 MOVE R18 R9 + 0x7C400400, // 0075 CALL R16 2 + 0x7C300800, // 0076 CALL R12 4 + 0x7C280400, // 0077 CALL R10 2 + 0x00100913, // 0078 ADD R4 R4 K19 + 0x7001FFB4, // 0079 JMP #002F + 0x8C140302, // 007A GETMET R5 R1 K2 + 0x8C1C0519, // 007B GETMET R7 R2 K25 + 0x58240021, // 007C LDCONST R9 K33 + 0x5C280800, // 007D MOVE R10 R4 + 0x7C1C0600, // 007E CALL R7 3 + 0x7C140400, // 007F CALL R5 2 + 0x8C140302, // 0080 GETMET R5 R1 K2 + 0x8C1C0519, // 0081 GETMET R7 R2 K25 + 0x5824001B, // 0082 LDCONST R9 K27 + 0x5C280800, // 0083 MOVE R10 R4 + 0x7C1C0600, // 0084 CALL R7 3 + 0x7C140400, // 0085 CALL R5 2 + 0x8C14011C, // 0086 GETMET R5 R0 K28 + 0x581C0017, // 0087 LDCONST R7 K23 + 0x8820011D, // 0088 GETMBR R8 R0 K29 + 0x8824011E, // 0089 GETMBR R9 R0 K30 + 0x7C140800, // 008A CALL R5 4 + 0x8C140302, // 008B GETMET R5 R1 K2 + 0x8C1C0519, // 008C GETMET R7 R2 K25 + 0x58240011, // 008D LDCONST R9 K17 + 0x7C1C0400, // 008E CALL R7 2 + 0x7C140400, // 008F CALL R5 2 + 0x8C140302, // 0090 GETMET R5 R1 K2 + 0x8C1C0519, // 0091 GETMET R7 R2 K25 + 0x58240022, // 0092 LDCONST R9 K34 + 0x5C280800, // 0093 MOVE R10 R4 + 0x7C1C0600, // 0094 CALL R7 3 + 0x7C140400, // 0095 CALL R5 2 + 0x8C140302, // 0096 GETMET R5 R1 K2 + 0x581C0023, // 0097 LDCONST R7 K35 + 0x7C140400, // 0098 CALL R5 2 + 0x8C140302, // 0099 GETMET R5 R1 K2 + 0x581C0024, // 009A LDCONST R7 K36 + 0x7C140400, // 009B CALL R5 2 + 0x8C140302, // 009C GETMET R5 R1 K2 + 0x581C0025, // 009D LDCONST R7 K37 + 0x7C140400, // 009E CALL R5 2 + 0x80000000, // 009F RET 0 + }) + ) +); +/*******************************************************************/ + + /******************************************************************** ** Solidified function: init ********************************************************************/ @@ -1452,11 +1248,11 @@ be_local_closure(Matter_UI_web_sensor, /* name */ /******************************************************************** -** Solidified function: show_plugins_configuration +** Solidified function: web_add_config_button ********************************************************************/ -be_local_closure(Matter_UI_show_plugins_configuration, /* name */ +be_local_closure(Matter_UI_web_add_config_button, /* name */ be_nested_proto( - 19, /* nstack */ + 5, /* nstack */ 1, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -1464,231 +1260,29 @@ be_local_closure(Matter_UI_show_plugins_configuration, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[37]) { /* constants */ + ( &(const bvalue[ 6]) { /* constants */ /* K0 */ be_nested_str_weak(webserver), - /* K1 */ be_nested_str_weak(string), - /* K2 */ be_nested_str_weak(content_send), - /* K3 */ be_nested_str_weak(_X3Cfieldset_X3E_X3Clegend_X3E_X3Cb_X3E_X26nbsp_X3BCurrent_X20Configuration_X26nbsp_X3B_X3C_X2Fb_X3E_X3C_X2Flegend_X3E_X3Cp_X3E_X3C_X2Fp_X3E), - /* K4 */ be_nested_str_weak(_X3Cform_X20action_X3D_X27_X2Fmatterc_X27_X20method_X3D_X27post_X27), - /* K5 */ be_nested_str_weak(onsubmit_X3D_X27return_X20confirm_X28_X22This_X20will_X20RESET_X20the_X20configuration_X20to_X20the_X20default_X2E_X20You_X20will_X20need_X20to_X20associate_X20again_X2E_X22_X29_X3B_X27_X3E), - /* K6 */ be_nested_str_weak(_X3Cbutton_X20name_X3D_X27auto_X27_X20class_X3D_X27button_X20bred_X27_X3EReset_X20to_X20default_X3C_X2Fbutton_X3E_X3Cp_X3E_X3C_X2Fp_X3E_X3C_X2Fform_X3E), - /* K7 */ be_nested_str_weak(onsubmit_X3D_X27return_X20confirm_X28_X22Changing_X20the_X20configuration_X20requires_X20to_X20associate_X20again_X2E_X22_X29_X3B_X27_X3E), - /* K8 */ be_nested_str_weak(_X3Ctable_X20style_X3D_X27width_X3A100_X25_X27_X3E), - /* K9 */ be_nested_str_weak(_X3Ctr_X3E_X3Ctd_X20width_X3D_X2735_X27_X3E_X3Cb_X3EEp_X2E_X3C_X2Fb_X3E_X3C_X2Ftd_X3E_X3Ctd_X3E_X3Cb_X3EType_X3C_X2Fb_X3E_X3C_X2Ftd_X3E_X3Ctd_X3E_X3Cb_X3EParam_X3C_X2Fb_X3E_X3C_X2Ftd_X3E_X3C_X2Ftr_X3E), - /* K10 */ be_nested_str_weak(device), - /* K11 */ be_nested_str_weak(k2l_num), - /* K12 */ be_nested_str_weak(plugins_config), - /* K13 */ be_const_int(0), - /* K14 */ be_nested_str_weak(find), - /* K15 */ be_nested_str_weak(type), - /* K16 */ be_nested_str_weak(format), - /* K17 */ be_nested_str_weak(_X3Ctr_X3E_X3Ctd_X3E_X3Cinput_X20type_X3D_X27text_X27_X20name_X3D_X27ep_X2503i_X27_X20maxlength_X3D_X274_X27_X20size_X3D_X273_X27_X20value_X3D_X270_X27_X20readonly_X3E_X3C_X2Ftd_X3E), - /* K18 */ be_nested_str_weak(_X3Ctd_X3E_X3Cselect_X20name_X3D_X27pi_X2503i_X27_X3E), - /* K19 */ be_nested_str_weak(plugin_option), - /* K20 */ be_nested_str_weak(), - /* K21 */ be_nested_str_weak(_ROOT_TYPES), - /* K22 */ be_nested_str_weak(_X3C_X2Fselect_X3E_X3C_X2Ftd_X3E), - /* K23 */ be_nested_str_weak(_X3Ctd_X3E_X3Cfont_X20size_X3D_X27_X2D1_X27_X3E_X26nbsp_X3B_X3C_X2Ffont_X3E_X3C_X2Ftd_X3E), - /* K24 */ be_const_int(1), - /* K25 */ be_nested_str_weak(plugins_classes), - /* K26 */ be_nested_str_weak(ui_conf_to_string), - /* K27 */ be_nested_str_weak(_X3Ctr_X3E_X3Ctd_X3E_X3Cinput_X20type_X3D_X27text_X27_X20name_X3D_X27ep_X2503i_X27_X20maxlength_X3D_X274_X27_X20size_X3D_X273_X27_X20pattern_X3D_X27_X5B0_X2D9_X5D_X7B1_X2C4_X7D_X27_X20value_X3D_X27_X25i_X27_X3E_X3C_X2Ftd_X3E), - /* K28 */ be_nested_str_weak(_CLASSES_TYPES), - /* K29 */ be_nested_str_weak(_CLASSES_TYPES2), - /* K30 */ be_nested_str_weak(_X3Ctd_X3E_X3Cfont_X20size_X3D_X27_X2D1_X27_X3E_X3Cinput_X20type_X3D_X27text_X27_X20name_X3D_X27arg_X2503i_X27_X20minlength_X3D_X270_X27_X20size_X3D_X278_X27_X20value_X3D_X27_X25s_X27_X3E_X3C_X2Ffont_X3E_X3C_X2Ftd_X3E), - /* K31 */ be_nested_str_weak(html_escape), - /* K32 */ be_nested_str_weak(_X3Ctr_X3E_X3Ctd_X3E_X3Cinput_X20type_X3D_X27text_X27_X20name_X3D_X27ep_X2503i_X27_X20maxlength_X3D_X274_X27_X20size_X3D_X273_X27_X20pattern_X3D_X27_X5B0_X2D9_X5D_X7B1_X2C4_X7D_X27_X20value_X3D_X27_X27_X3E_X3C_X2Ftd_X3E), - /* K33 */ be_nested_str_weak(_X3Ctd_X3E_X3Cfont_X20size_X3D_X27_X2D1_X27_X3E_X3Cinput_X20type_X3D_X27text_X27_X20name_X3D_X27arg_X2503i_X27_X20minlength_X3D_X270_X27_X20size_X3D_X278_X27_X20value_X3D_X27_X27_X3E_X3C_X2Ffont_X3E_X3C_X2Ftd_X3E), - /* K34 */ be_nested_str_weak(_X3C_X2Ftable_X3E_X3Cp_X3E_X3C_X2Fp_X3E), - /* K35 */ be_nested_str_weak(_X3Cbutton_X20name_X3D_X27config_X27_X20class_X3D_X27button_X20bgrn_X27_X3EChange_X20configuration_X3C_X2Fbutton_X3E_X3C_X2Fform_X3E), - /* K36 */ be_nested_str_weak(_X3Cp_X3E_X3C_X2Fp_X3E_X3C_X2Ffieldset_X3E_X3Cp_X3E_X3C_X2Fp_X3E), + /* K1 */ be_nested_str_weak(content_send), + /* K2 */ be_nested_str_weak(_X3Cp_X3E_X3Cform_X20id_X3Dac_X20action_X3D_X27matterc_X27_X20style_X3D_X27display_X3A_X20block_X3B_X27_X20method_X3D_X27get_X27_X3E_X3Cbutton_X3E), + /* K3 */ be_nested_str_weak(matter), + /* K4 */ be_nested_str_weak(_LOGO), + /* K5 */ be_nested_str_weak(_X20Configure_X20Matter_X3C_X2Fbutton_X3E_X3C_X2Fform_X3E_X3C_X2Fp_X3E), }), - be_str_weak(show_plugins_configuration), + be_str_weak(web_add_config_button), &be_const_str_solidified, - ( &(const binstruction[183]) { /* code */ + ( &(const binstruction[12]) { /* code */ 0xA4060000, // 0000 IMPORT R1 K0 - 0xA40A0200, // 0001 IMPORT R2 K1 - 0x8C0C0302, // 0002 GETMET R3 R1 K2 - 0x58140003, // 0003 LDCONST R5 K3 - 0x7C0C0400, // 0004 CALL R3 2 - 0x8C0C0302, // 0005 GETMET R3 R1 K2 - 0x58140004, // 0006 LDCONST R5 K4 - 0x7C0C0400, // 0007 CALL R3 2 - 0x8C0C0302, // 0008 GETMET R3 R1 K2 - 0x58140005, // 0009 LDCONST R5 K5 - 0x7C0C0400, // 000A CALL R3 2 - 0x8C0C0302, // 000B GETMET R3 R1 K2 - 0x58140006, // 000C LDCONST R5 K6 - 0x7C0C0400, // 000D CALL R3 2 - 0x8C0C0302, // 000E GETMET R3 R1 K2 - 0x58140004, // 000F LDCONST R5 K4 - 0x7C0C0400, // 0010 CALL R3 2 - 0x8C0C0302, // 0011 GETMET R3 R1 K2 - 0x58140007, // 0012 LDCONST R5 K7 - 0x7C0C0400, // 0013 CALL R3 2 - 0x8C0C0302, // 0014 GETMET R3 R1 K2 - 0x58140008, // 0015 LDCONST R5 K8 - 0x7C0C0400, // 0016 CALL R3 2 - 0x8C0C0302, // 0017 GETMET R3 R1 K2 - 0x58140009, // 0018 LDCONST R5 K9 - 0x7C0C0400, // 0019 CALL R3 2 - 0x880C010A, // 001A GETMBR R3 R0 K10 - 0x8C0C070B, // 001B GETMET R3 R3 K11 - 0x8814010A, // 001C GETMBR R5 R0 K10 - 0x88140B0C, // 001D GETMBR R5 R5 K12 - 0x7C0C0400, // 001E CALL R3 2 - 0x5810000D, // 001F LDCONST R4 K13 - 0x9414070D, // 0020 GETIDX R5 R3 K13 - 0x1C140B0D, // 0021 EQ R5 R5 K13 - 0x78160026, // 0022 JMPF R5 #004A - 0x94140604, // 0023 GETIDX R5 R3 R4 - 0x8818010A, // 0024 GETMBR R6 R0 K10 - 0x601C0008, // 0025 GETGBL R7 G8 - 0x5C200A00, // 0026 MOVE R8 R5 - 0x7C1C0200, // 0027 CALL R7 1 - 0x88180D0C, // 0028 GETMBR R6 R6 K12 - 0x94180C07, // 0029 GETIDX R6 R6 R7 - 0x8C200D0E, // 002A GETMET R8 R6 K14 - 0x5828000F, // 002B LDCONST R10 K15 - 0x7C200400, // 002C CALL R8 2 - 0x5C1C1000, // 002D MOVE R7 R8 - 0x8C200302, // 002E GETMET R8 R1 K2 - 0x8C280510, // 002F GETMET R10 R2 K16 - 0x58300011, // 0030 LDCONST R12 K17 - 0x5C340800, // 0031 MOVE R13 R4 - 0x7C280600, // 0032 CALL R10 3 - 0x7C200400, // 0033 CALL R8 2 - 0x8C200302, // 0034 GETMET R8 R1 K2 - 0x8C280510, // 0035 GETMET R10 R2 K16 - 0x58300012, // 0036 LDCONST R12 K18 - 0x5C340800, // 0037 MOVE R13 R4 - 0x7C280600, // 0038 CALL R10 3 - 0x7C200400, // 0039 CALL R8 2 - 0x8C200113, // 003A GETMET R8 R0 K19 - 0x8C280D0E, // 003B GETMET R10 R6 K14 - 0x5830000F, // 003C LDCONST R12 K15 - 0x58340014, // 003D LDCONST R13 K20 - 0x7C280600, // 003E CALL R10 3 - 0x882C0115, // 003F GETMBR R11 R0 K21 - 0x7C200600, // 0040 CALL R8 3 - 0x8C200302, // 0041 GETMET R8 R1 K2 - 0x8C280510, // 0042 GETMET R10 R2 K16 - 0x58300016, // 0043 LDCONST R12 K22 - 0x7C280400, // 0044 CALL R10 2 - 0x7C200400, // 0045 CALL R8 2 - 0x8C200302, // 0046 GETMET R8 R1 K2 - 0x58280017, // 0047 LDCONST R10 K23 - 0x7C200400, // 0048 CALL R8 2 - 0x00100918, // 0049 ADD R4 R4 K24 - 0x6014000C, // 004A GETGBL R5 G12 - 0x5C180600, // 004B MOVE R6 R3 - 0x7C140200, // 004C CALL R5 1 - 0x14140805, // 004D LT R5 R4 R5 - 0x78160041, // 004E JMPF R5 #0091 - 0x94140604, // 004F GETIDX R5 R3 R4 - 0x8818010A, // 0050 GETMBR R6 R0 K10 - 0x601C0008, // 0051 GETGBL R7 G8 - 0x5C200A00, // 0052 MOVE R8 R5 - 0x7C1C0200, // 0053 CALL R7 1 - 0x88180D0C, // 0054 GETMBR R6 R6 K12 - 0x94180C07, // 0055 GETIDX R6 R6 R7 - 0x8C200D0E, // 0056 GETMET R8 R6 K14 - 0x5828000F, // 0057 LDCONST R10 K15 - 0x7C200400, // 0058 CALL R8 2 - 0x5C1C1000, // 0059 MOVE R7 R8 - 0x5C200E00, // 005A MOVE R8 R7 - 0x74220001, // 005B JMPT R8 #005E - 0x00100918, // 005C ADD R4 R4 K24 - 0x7001FFEB, // 005D JMP #004A - 0x8820010A, // 005E GETMBR R8 R0 K10 - 0x88201119, // 005F GETMBR R8 R8 K25 - 0x8C20110E, // 0060 GETMET R8 R8 K14 - 0x5C280E00, // 0061 MOVE R10 R7 - 0x7C200400, // 0062 CALL R8 2 - 0x58240014, // 0063 LDCONST R9 K20 - 0x4C280000, // 0064 LDNIL R10 - 0x2028100A, // 0065 NE R10 R8 R10 - 0x782A0004, // 0066 JMPF R10 #006C - 0x8C28111A, // 0067 GETMET R10 R8 K26 - 0x5C301000, // 0068 MOVE R12 R8 - 0x5C340C00, // 0069 MOVE R13 R6 - 0x7C280600, // 006A CALL R10 3 - 0x5C241400, // 006B MOVE R9 R10 - 0x8C280302, // 006C GETMET R10 R1 K2 - 0x8C300510, // 006D GETMET R12 R2 K16 - 0x5838001B, // 006E LDCONST R14 K27 - 0x5C3C0800, // 006F MOVE R15 R4 - 0x5C400A00, // 0070 MOVE R16 R5 - 0x7C300800, // 0071 CALL R12 4 - 0x7C280400, // 0072 CALL R10 2 - 0x8C280302, // 0073 GETMET R10 R1 K2 - 0x8C300510, // 0074 GETMET R12 R2 K16 - 0x58380012, // 0075 LDCONST R14 K18 - 0x5C3C0800, // 0076 MOVE R15 R4 - 0x7C300600, // 0077 CALL R12 3 - 0x7C280400, // 0078 CALL R10 2 - 0x8C280113, // 0079 GETMET R10 R0 K19 - 0x8C300D0E, // 007A GETMET R12 R6 K14 - 0x5838000F, // 007B LDCONST R14 K15 - 0x583C0014, // 007C LDCONST R15 K20 - 0x7C300600, // 007D CALL R12 3 - 0x8834011C, // 007E GETMBR R13 R0 K28 - 0x8838011D, // 007F GETMBR R14 R0 K29 - 0x7C280800, // 0080 CALL R10 4 - 0x8C280302, // 0081 GETMET R10 R1 K2 - 0x8C300510, // 0082 GETMET R12 R2 K16 - 0x58380016, // 0083 LDCONST R14 K22 - 0x7C300400, // 0084 CALL R12 2 - 0x7C280400, // 0085 CALL R10 2 - 0x8C280302, // 0086 GETMET R10 R1 K2 - 0x8C300510, // 0087 GETMET R12 R2 K16 - 0x5838001E, // 0088 LDCONST R14 K30 - 0x5C3C0800, // 0089 MOVE R15 R4 - 0x8C40031F, // 008A GETMET R16 R1 K31 - 0x5C481200, // 008B MOVE R18 R9 - 0x7C400400, // 008C CALL R16 2 - 0x7C300800, // 008D CALL R12 4 - 0x7C280400, // 008E CALL R10 2 - 0x00100918, // 008F ADD R4 R4 K24 - 0x7001FFB8, // 0090 JMP #004A - 0x8C140302, // 0091 GETMET R5 R1 K2 - 0x8C1C0510, // 0092 GETMET R7 R2 K16 - 0x58240020, // 0093 LDCONST R9 K32 - 0x5C280800, // 0094 MOVE R10 R4 - 0x7C1C0600, // 0095 CALL R7 3 - 0x7C140400, // 0096 CALL R5 2 - 0x8C140302, // 0097 GETMET R5 R1 K2 - 0x8C1C0510, // 0098 GETMET R7 R2 K16 - 0x58240012, // 0099 LDCONST R9 K18 - 0x5C280800, // 009A MOVE R10 R4 - 0x7C1C0600, // 009B CALL R7 3 - 0x7C140400, // 009C CALL R5 2 - 0x8C140113, // 009D GETMET R5 R0 K19 - 0x581C0014, // 009E LDCONST R7 K20 - 0x8820011C, // 009F GETMBR R8 R0 K28 - 0x8824011D, // 00A0 GETMBR R9 R0 K29 - 0x7C140800, // 00A1 CALL R5 4 - 0x8C140302, // 00A2 GETMET R5 R1 K2 - 0x8C1C0510, // 00A3 GETMET R7 R2 K16 - 0x58240016, // 00A4 LDCONST R9 K22 - 0x7C1C0400, // 00A5 CALL R7 2 - 0x7C140400, // 00A6 CALL R5 2 - 0x8C140302, // 00A7 GETMET R5 R1 K2 - 0x8C1C0510, // 00A8 GETMET R7 R2 K16 - 0x58240021, // 00A9 LDCONST R9 K33 - 0x5C280800, // 00AA MOVE R10 R4 - 0x7C1C0600, // 00AB CALL R7 3 - 0x7C140400, // 00AC CALL R5 2 - 0x8C140302, // 00AD GETMET R5 R1 K2 - 0x581C0022, // 00AE LDCONST R7 K34 - 0x7C140400, // 00AF CALL R5 2 - 0x8C140302, // 00B0 GETMET R5 R1 K2 - 0x581C0023, // 00B1 LDCONST R7 K35 - 0x7C140400, // 00B2 CALL R5 2 - 0x8C140302, // 00B3 GETMET R5 R1 K2 - 0x581C0024, // 00B4 LDCONST R7 K36 - 0x7C140400, // 00B5 CALL R5 2 - 0x80000000, // 00B6 RET 0 + 0x8C080301, // 0001 GETMET R2 R1 K1 + 0x58100002, // 0002 LDCONST R4 K2 + 0x7C080400, // 0003 CALL R2 2 + 0x8C080301, // 0004 GETMET R2 R1 K1 + 0xB8120600, // 0005 GETNGBL R4 K3 + 0x88100904, // 0006 GETMBR R4 R4 K4 + 0x7C080400, // 0007 CALL R2 2 + 0x8C080301, // 0008 GETMET R2 R1 K1 + 0x58100005, // 0009 LDCONST R4 K5 + 0x7C080400, // 000A CALL R2 2 + 0x80000000, // 000B RET 0 }) ) ); @@ -1696,12 +1290,110 @@ be_local_closure(Matter_UI_show_plugins_configuration, /* name */ /******************************************************************** -** Solidified function: show_commissioning_info +** Solidified function: plugin_option ********************************************************************/ -be_local_closure(Matter_UI_show_commissioning_info, /* name */ +be_local_closure(Matter_UI_plugin_option, /* name */ be_nested_proto( - 14, /* nstack */ - 1, /* argc */ + 17, /* nstack */ + 3, /* argc */ + 3, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[17]) { /* constants */ + /* K0 */ be_nested_str_weak(webserver), + /* K1 */ be_nested_str_weak(string), + /* K2 */ be_nested_str_weak(split), + /* K3 */ be_nested_str_weak(_X7C), + /* K4 */ be_nested_str_weak(stop_iteration), + /* K5 */ be_const_int(0), + /* K6 */ be_nested_str_weak(), + /* K7 */ be_nested_str_weak(content_send), + /* K8 */ be_nested_str_weak(_X3Coption_X20value_X3D_X27_X27_X3E_X3C_X2Foption_X3E), + /* K9 */ be_nested_str_weak(_X2Dhttp), + /* K10 */ be_nested_str_weak(_X3Coption_X20value_X3D_X27_X27_X20disabled_X3E_X2D_X2D_X2D_X20Tasmota_X20Remote_X20_X2D_X2D_X2D_X3C_X2Foption_X3E), + /* K11 */ be_nested_str_weak(device), + /* K12 */ be_nested_str_weak(get_plugin_class_displayname), + /* K13 */ be_nested_str_weak(format), + /* K14 */ be_nested_str_weak(_X3Coption_X20value_X3D_X27_X25s_X27_X25s_X3E_X25s_X3C_X2Foption_X3E), + /* K15 */ be_nested_str_weak(_X20selected), + /* K16 */ be_const_int(1), + }), + be_str_weak(plugin_option), + &be_const_str_solidified, + ( &(const binstruction[57]) { /* code */ + 0xA40E0000, // 0000 IMPORT R3 K0 + 0xA4120200, // 0001 IMPORT R4 K1 + 0x60140012, // 0002 GETGBL R5 G18 + 0x7C140000, // 0003 CALL R5 0 + 0x60180010, // 0004 GETGBL R6 G16 + 0x5C1C0400, // 0005 MOVE R7 R2 + 0x7C180200, // 0006 CALL R6 1 + 0xA8020007, // 0007 EXBLK 0 #0010 + 0x5C1C0C00, // 0008 MOVE R7 R6 + 0x7C1C0000, // 0009 CALL R7 0 + 0x8C200902, // 000A GETMET R8 R4 K2 + 0x5C280E00, // 000B MOVE R10 R7 + 0x582C0003, // 000C LDCONST R11 K3 + 0x7C200600, // 000D CALL R8 3 + 0x00140A08, // 000E ADD R5 R5 R8 + 0x7001FFF7, // 000F JMP #0008 + 0x58180004, // 0010 LDCONST R6 K4 + 0xAC180200, // 0011 CATCH R6 1 0 + 0xB0080000, // 0012 RAISE 2 R0 R0 + 0x58180005, // 0013 LDCONST R6 K5 + 0x601C000C, // 0014 GETGBL R7 G12 + 0x5C200A00, // 0015 MOVE R8 R5 + 0x7C1C0200, // 0016 CALL R7 1 + 0x141C0C07, // 0017 LT R7 R6 R7 + 0x781E001E, // 0018 JMPF R7 #0038 + 0x941C0A06, // 0019 GETIDX R7 R5 R6 + 0x1C200F06, // 001A EQ R8 R7 K6 + 0x78220003, // 001B JMPF R8 #0020 + 0x8C200707, // 001C GETMET R8 R3 K7 + 0x58280008, // 001D LDCONST R10 K8 + 0x7C200400, // 001E CALL R8 2 + 0x70020015, // 001F JMP #0036 + 0x1C200F09, // 0020 EQ R8 R7 K9 + 0x78220003, // 0021 JMPF R8 #0026 + 0x8C200707, // 0022 GETMET R8 R3 K7 + 0x5828000A, // 0023 LDCONST R10 K10 + 0x7C200400, // 0024 CALL R8 2 + 0x7002000F, // 0025 JMP #0036 + 0x8820010B, // 0026 GETMBR R8 R0 K11 + 0x8C20110C, // 0027 GETMET R8 R8 K12 + 0x5C280E00, // 0028 MOVE R10 R7 + 0x7C200400, // 0029 CALL R8 2 + 0x8C240707, // 002A GETMET R9 R3 K7 + 0x8C2C090D, // 002B GETMET R11 R4 K13 + 0x5834000E, // 002C LDCONST R13 K14 + 0x5C380E00, // 002D MOVE R14 R7 + 0x1C3C0E01, // 002E EQ R15 R7 R1 + 0x783E0001, // 002F JMPF R15 #0032 + 0x583C000F, // 0030 LDCONST R15 K15 + 0x70020000, // 0031 JMP #0033 + 0x583C0006, // 0032 LDCONST R15 K6 + 0x5C401000, // 0033 MOVE R16 R8 + 0x7C2C0A00, // 0034 CALL R11 5 + 0x7C240400, // 0035 CALL R9 2 + 0x00180D10, // 0036 ADD R6 R6 K16 + 0x7001FFDB, // 0037 JMP #0014 + 0x80000000, // 0038 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: show_enable +********************************************************************/ +be_local_closure(Matter_UI_show_enable, /* name */ + be_nested_proto( + 11, /* nstack */ + 2, /* argc */ 2, /* varg */ 0, /* has upvals */ NULL, /* no upvals */ @@ -1711,94 +1403,72 @@ be_local_closure(Matter_UI_show_commissioning_info, /* name */ ( &(const bvalue[20]) { /* constants */ /* K0 */ be_nested_str_weak(webserver), /* K1 */ be_nested_str_weak(string), - /* K2 */ be_nested_str_weak(device), - /* K3 */ be_nested_str_weak(commissioning_open), - /* K4 */ be_nested_str_weak(tasmota), - /* K5 */ be_nested_str_weak(millis), - /* K6 */ be_const_int(0), - /* K7 */ be_nested_str_weak(content_send), - /* K8 */ be_nested_str_weak(format), - /* K9 */ be_nested_str_weak(_X3Cfieldset_X3E_X3Clegend_X3E_X3Cb_X3E_X26nbsp_X3BCommissioning_X20open_X20for_X20_X25i_X20min_X26nbsp_X3B_X3C_X2Fb_X3E_X3C_X2Flegend_X3E_X3Cp_X3E_X3C_X2Fp_X3E), - /* K10 */ be_nested_str_weak(compute_manual_pairing_code), - /* K11 */ be_nested_str_weak(_X3Cp_X3EManual_X20pairing_X20code_X3A_X3Cbr_X3E_X3Cb_X3E_X25s_X2D_X25s_X2D_X25s_X3C_X2Fb_X3E_X3C_X2Fp_X3E_X3Chr_X3E), - /* K12 */ be_const_int(3), - /* K13 */ be_const_int(2147483647), - /* K14 */ be_nested_str_weak(_X3Cdiv_X3E_X3Ccenter_X3E), - /* K15 */ be_nested_str_weak(compute_qrcode_content), - /* K16 */ be_nested_str_weak(show_qrcode), - /* K17 */ be_nested_str_weak(_X3Cp_X3E_X20_X25s_X3C_X2Fp_X3E), - /* K18 */ be_nested_str_weak(_X3C_X2Fdiv_X3E), + /* K2 */ be_nested_str_weak(tasmota), + /* K3 */ be_nested_str_weak(get_option), + /* K4 */ be_nested_str_weak(matter), + /* K5 */ be_nested_str_weak(MATTER_OPTION), + /* K6 */ be_nested_str_weak(content_send), + /* K7 */ be_nested_str_weak(format), + /* K8 */ be_nested_str_weak(_X3Cfieldset_X3E_X3Clegend_X3E_X3Cb_X3E_X26nbsp_X3BMatter_X20_X25s_X26nbsp_X3B_X3C_X2Fb_X3E_X3C_X2Flegend_X3E_X3Cp_X3E_X3C_X2Fp_X3E), + /* K9 */ be_nested_str_weak(Enabled), + /* K10 */ be_nested_str_weak(Disabled), + /* K11 */ be_nested_str_weak(_X3Cp_X20style_X3D_X27width_X3A320px_X3B_X27_X3ECheck_X20the_X20_X3Ca_X20href_X3D_X27https_X3A_X2F_X2Ftasmota_X2Egithub_X2Eio_X2Fdocs_X2FMatter_X2F_X27_X20target_X3D_X27_blank_X27_X3EMatter_X20documentation_X3C_X2Fa_X3E_X2E_X3C_X2Fp_X3E), + /* K12 */ be_nested_str_weak(_X3Cform_X20action_X3D_X27_X2Fmatterc_X27_X20method_X3D_X27post_X27_X20onsubmit_X3D_X27return_X20confirm_X28_X22This_X20will_X20cause_X20a_X20restart_X2E_X22_X29_X3B_X27_X3E), + /* K13 */ be_nested_str_weak(_X3Cp_X3E_X3C_X2Fp_X3E_X3Cbutton_X20name_X3D_X27_X25s_X27_X20class_X3D_X27button_X20bgrn_X27_X3E), + /* K14 */ be_nested_str_weak(disable), + /* K15 */ be_nested_str_weak(enable), + /* K16 */ be_nested_str_weak(Disable), + /* K17 */ be_nested_str_weak(Enable), + /* K18 */ be_nested_str_weak(_X20Matter_X3C_X2Fbutton_X3E_X3C_X2Fform_X3E_X3C_X2Fp_X3E), /* K19 */ be_nested_str_weak(_X3Cp_X3E_X3C_X2Fp_X3E_X3C_X2Ffieldset_X3E_X3Cp_X3E_X3C_X2Fp_X3E), }), - be_str_weak(show_commissioning_info), + be_str_weak(show_enable), &be_const_str_solidified, - ( &(const binstruction[66]) { /* code */ - 0xA4060000, // 0000 IMPORT R1 K0 - 0xA40A0200, // 0001 IMPORT R2 K1 - 0x880C0102, // 0002 GETMBR R3 R0 K2 - 0x880C0703, // 0003 GETMBR R3 R3 K3 - 0xB8120800, // 0004 GETNGBL R4 K4 - 0x8C100905, // 0005 GETMET R4 R4 K5 - 0x7C100200, // 0006 CALL R4 1 - 0x040C0604, // 0007 SUB R3 R3 R4 - 0x541203E7, // 0008 LDINT R4 1000 - 0x0C0C0604, // 0009 DIV R3 R3 R4 - 0x14100706, // 000A LT R4 R3 K6 - 0x78120000, // 000B JMPF R4 #000D - 0x580C0006, // 000C LDCONST R3 K6 - 0x5412001D, // 000D LDINT R4 30 - 0x00100604, // 000E ADD R4 R3 R4 - 0x5416003B, // 000F LDINT R5 60 - 0x0C100805, // 0010 DIV R4 R4 R5 - 0x8C140307, // 0011 GETMET R5 R1 K7 - 0x8C1C0508, // 0012 GETMET R7 R2 K8 - 0x58240009, // 0013 LDCONST R9 K9 - 0x5C280800, // 0014 MOVE R10 R4 - 0x7C1C0600, // 0015 CALL R7 3 - 0x7C140400, // 0016 CALL R5 2 - 0x88140102, // 0017 GETMBR R5 R0 K2 - 0x8C140B0A, // 0018 GETMET R5 R5 K10 - 0x7C140200, // 0019 CALL R5 1 - 0x8C180307, // 001A GETMET R6 R1 K7 - 0x8C200508, // 001B GETMET R8 R2 K8 - 0x5828000B, // 001C LDCONST R10 K11 - 0x402E0D0C, // 001D CONNECT R11 K6 K12 - 0x942C0A0B, // 001E GETIDX R11 R5 R11 - 0x54320003, // 001F LDINT R12 4 - 0x54360005, // 0020 LDINT R13 6 - 0x4030180D, // 0021 CONNECT R12 R12 R13 - 0x94300A0C, // 0022 GETIDX R12 R5 R12 - 0x54360006, // 0023 LDINT R13 7 - 0x40341B0D, // 0024 CONNECT R13 R13 K13 - 0x94340A0D, // 0025 GETIDX R13 R5 R13 - 0x7C200A00, // 0026 CALL R8 5 - 0x7C180400, // 0027 CALL R6 2 - 0x8C180307, // 0028 GETMET R6 R1 K7 - 0x8C200508, // 0029 GETMET R8 R2 K8 - 0x5828000E, // 002A LDCONST R10 K14 - 0x7C200400, // 002B CALL R8 2 - 0x7C180400, // 002C CALL R6 2 - 0x88180102, // 002D GETMBR R6 R0 K2 - 0x8C180D0F, // 002E GETMET R6 R6 K15 - 0x7C180200, // 002F CALL R6 1 - 0x8C1C0110, // 0030 GETMET R7 R0 K16 - 0x5C240C00, // 0031 MOVE R9 R6 - 0x7C1C0400, // 0032 CALL R7 2 - 0x8C1C0307, // 0033 GETMET R7 R1 K7 - 0x8C240508, // 0034 GETMET R9 R2 K8 - 0x582C0011, // 0035 LDCONST R11 K17 - 0x5C300C00, // 0036 MOVE R12 R6 - 0x7C240600, // 0037 CALL R9 3 - 0x7C1C0400, // 0038 CALL R7 2 - 0x8C1C0307, // 0039 GETMET R7 R1 K7 - 0x8C240508, // 003A GETMET R9 R2 K8 - 0x582C0012, // 003B LDCONST R11 K18 - 0x7C240400, // 003C CALL R9 2 - 0x7C1C0400, // 003D CALL R7 2 - 0x8C1C0307, // 003E GETMET R7 R1 K7 - 0x58240013, // 003F LDCONST R9 K19 - 0x7C1C0400, // 0040 CALL R7 2 - 0x80000000, // 0041 RET 0 + ( &(const binstruction[44]) { /* code */ + 0xA40A0000, // 0000 IMPORT R2 K0 + 0xA40E0200, // 0001 IMPORT R3 K1 + 0xB8120400, // 0002 GETNGBL R4 K2 + 0x8C100903, // 0003 GETMET R4 R4 K3 + 0xB81A0800, // 0004 GETNGBL R6 K4 + 0x88180D05, // 0005 GETMBR R6 R6 K5 + 0x7C100400, // 0006 CALL R4 2 + 0x8C140506, // 0007 GETMET R5 R2 K6 + 0x8C1C0707, // 0008 GETMET R7 R3 K7 + 0x58240008, // 0009 LDCONST R9 K8 + 0x78120001, // 000A JMPF R4 #000D + 0x58280009, // 000B LDCONST R10 K9 + 0x70020000, // 000C JMP #000E + 0x5828000A, // 000D LDCONST R10 K10 + 0x7C1C0600, // 000E CALL R7 3 + 0x7C140400, // 000F CALL R5 2 + 0x8C140506, // 0010 GETMET R5 R2 K6 + 0x581C000B, // 0011 LDCONST R7 K11 + 0x7C140400, // 0012 CALL R5 2 + 0x8C140506, // 0013 GETMET R5 R2 K6 + 0x581C000C, // 0014 LDCONST R7 K12 + 0x7C140400, // 0015 CALL R5 2 + 0x8C140506, // 0016 GETMET R5 R2 K6 + 0x8C1C0707, // 0017 GETMET R7 R3 K7 + 0x5824000D, // 0018 LDCONST R9 K13 + 0x78120001, // 0019 JMPF R4 #001C + 0x5828000E, // 001A LDCONST R10 K14 + 0x70020000, // 001B JMP #001D + 0x5828000F, // 001C LDCONST R10 K15 + 0x7C1C0600, // 001D CALL R7 3 + 0x7C140400, // 001E CALL R5 2 + 0x8C140506, // 001F GETMET R5 R2 K6 + 0x78120001, // 0020 JMPF R4 #0023 + 0x581C0010, // 0021 LDCONST R7 K16 + 0x70020000, // 0022 JMP #0024 + 0x581C0011, // 0023 LDCONST R7 K17 + 0x7C140400, // 0024 CALL R5 2 + 0x8C140506, // 0025 GETMET R5 R2 K6 + 0x581C0012, // 0026 LDCONST R7 K18 + 0x7C140400, // 0027 CALL R5 2 + 0x8C140506, // 0028 GETMET R5 R2 K6 + 0x581C0013, // 0029 LDCONST R7 K19 + 0x7C140400, // 002A CALL R5 2 + 0x80040800, // 002B RET 1 R4 }) ) ); @@ -1961,33 +1631,393 @@ be_local_closure(Matter_UI_show_fabric_info, /* name */ /*******************************************************************/ +/******************************************************************** +** Solidified function: web_add_handler +********************************************************************/ +be_local_closure(Matter_UI_web_add_handler, /* name */ + be_nested_proto( + 7, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 1, /* has sup protos */ + ( &(const struct bproto*[ 2]) { + be_nested_proto( + 2, /* nstack */ + 0, /* argc */ + 0, /* varg */ + 1, /* has upvals */ + ( &(const bupvaldesc[ 1]) { /* upvals */ + be_local_const_upval(1, 0), + }), + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 1]) { /* constants */ + /* K0 */ be_nested_str_weak(page_part_mgr), + }), + be_str_weak(_X3Clambda_X3E), + &be_const_str_solidified, + ( &(const binstruction[ 4]) { /* code */ + 0x68000000, // 0000 GETUPV R0 U0 + 0x8C000100, // 0001 GETMET R0 R0 K0 + 0x7C000200, // 0002 CALL R0 1 + 0x80040000, // 0003 RET 1 R0 + }) + ), + be_nested_proto( + 2, /* nstack */ + 0, /* argc */ + 0, /* varg */ + 1, /* has upvals */ + ( &(const bupvaldesc[ 1]) { /* upvals */ + be_local_const_upval(1, 0), + }), + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 1]) { /* constants */ + /* K0 */ be_nested_str_weak(page_part_ctl), + }), + be_str_weak(_X3Clambda_X3E), + &be_const_str_solidified, + ( &(const binstruction[ 4]) { /* code */ + 0x68000000, // 0000 GETUPV R0 U0 + 0x8C000100, // 0001 GETMET R0 R0 K0 + 0x7C000200, // 0002 CALL R0 1 + 0x80040000, // 0003 RET 1 R0 + }) + ), + }), + 1, /* has constants */ + ( &(const bvalue[ 5]) { /* constants */ + /* K0 */ be_nested_str_weak(webserver), + /* K1 */ be_nested_str_weak(on), + /* K2 */ be_nested_str_weak(_X2Fmatterc), + /* K3 */ be_nested_str_weak(HTTP_GET), + /* K4 */ be_nested_str_weak(HTTP_POST), + }), + be_str_weak(web_add_handler), + &be_const_str_solidified, + ( &(const binstruction[13]) { /* code */ + 0xA4060000, // 0000 IMPORT R1 K0 + 0x8C080301, // 0001 GETMET R2 R1 K1 + 0x58100002, // 0002 LDCONST R4 K2 + 0x84140000, // 0003 CLOSURE R5 P0 + 0x88180303, // 0004 GETMBR R6 R1 K3 + 0x7C080800, // 0005 CALL R2 4 + 0x8C080301, // 0006 GETMET R2 R1 K1 + 0x58100002, // 0007 LDCONST R4 K2 + 0x84140001, // 0008 CLOSURE R5 P1 + 0x88180304, // 0009 GETMBR R6 R1 K4 + 0x7C080800, // 000A CALL R2 4 + 0xA0000000, // 000B CLOSE R0 + 0x80000000, // 000C RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: show_passcode_form +********************************************************************/ +be_local_closure(Matter_UI_show_passcode_form, /* name */ + be_nested_proto( + 9, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[26]) { /* constants */ + /* K0 */ be_nested_str_weak(webserver), + /* K1 */ be_nested_str_weak(string), + /* K2 */ be_nested_str_weak(content_send), + /* K3 */ be_nested_str_weak(_X3Cfieldset_X3E_X3Clegend_X3E_X3Cb_X3E_X26nbsp_X3BMatter_X20Passcode_X26nbsp_X3B_X3C_X2Fb_X3E_X3C_X2Flegend_X3E_X3Cp_X3E_X3C_X2Fp_X3E), + /* K4 */ be_nested_str_weak(_X3Cform_X20action_X3D_X27_X2Fmatterc_X27_X20method_X3D_X27post_X27_X3E), + /* K5 */ be_nested_str_weak(device), + /* K6 */ be_nested_str_weak(commissioning_open), + /* K7 */ be_nested_str_weak(format), + /* K8 */ be_nested_str_weak(_X3Cp_X3E_X3C_X2Fp_X3E_X3Cbutton_X20name_X3D_X27open_comm_X27_X20class_X3D_X27button_X20bgrn_X27_X3E_X25s_X3C_X2Fbutton_X3E), + /* K9 */ be_nested_str_weak(Open_X20Commissioning), + /* K10 */ be_nested_str_weak(_X3Cp_X3E_X3C_X2Fp_X3E_X3Cbutton_X20name_X3D_X27clos_comm_X27_X20class_X3D_X27button_X20bgrn_X27_X3E_X25s_X3C_X2Fbutton_X3E), + /* K11 */ be_nested_str_weak(Close_X20Commissioning), + /* K12 */ be_nested_str_weak(_X3C_X2Fform_X3E_X3C_X2Fp_X3E), + /* K13 */ be_nested_str_weak(_X3Cform_X20action_X3D_X27_X2Fmatterc_X27_X20method_X3D_X27post_X27_X20onsubmit_X3D_X27return_X20confirm_X28_X22This_X20will_X20cause_X20a_X20restart_X2E_X22_X29_X3B_X27_X3E), + /* K14 */ be_nested_str_weak(_X3Cp_X3EPasscode_X3A_X3C_X2Fp_X3E), + /* K15 */ be_nested_str_weak(_X3Cinput_X20type_X3D_X27number_X27_X20min_X3D_X271_X27_X20max_X3D_X2799999998_X27_X20name_X3D_X27passcode_X27_X20value_X3D_X27_X25i_X27_X3E), + /* K16 */ be_nested_str_weak(root_passcode), + /* K17 */ be_nested_str_weak(_X3Cp_X3EDistinguish_X20id_X3A_X3C_X2Fp_X3E), + /* K18 */ be_nested_str_weak(_X3Cinput_X20type_X3D_X27number_X27_X20min_X3D_X270_X27_X20max_X3D_X274095_X27_X20name_X3D_X27discriminator_X27_X20value_X3D_X27_X25i_X27_X3E), + /* K19 */ be_nested_str_weak(root_discriminator), + /* K20 */ be_nested_str_weak(_X3Cp_X3E_X3Cinput_X20type_X3D_X27checkbox_X27_X20name_X3D_X27ipv4_X27_X25s_X3EIPv4_X20only_X3C_X2Fp_X3E), + /* K21 */ be_nested_str_weak(ipv4only), + /* K22 */ be_nested_str_weak(_X20checked), + /* K23 */ be_nested_str_weak(), + /* K24 */ be_nested_str_weak(_X3Cp_X3E_X3C_X2Fp_X3E_X3Cbutton_X20name_X3D_X27passcode_X27_X20class_X3D_X27button_X20bgrn_X27_X3EChange_X3C_X2Fbutton_X3E_X3C_X2Fform_X3E_X3C_X2Fp_X3E), + /* K25 */ be_nested_str_weak(_X3Cp_X3E_X3C_X2Fp_X3E_X3C_X2Ffieldset_X3E_X3Cp_X3E_X3C_X2Fp_X3E), + }), + be_str_weak(show_passcode_form), + &be_const_str_solidified, + ( &(const binstruction[70]) { /* code */ + 0xA4060000, // 0000 IMPORT R1 K0 + 0xA40A0200, // 0001 IMPORT R2 K1 + 0x8C0C0302, // 0002 GETMET R3 R1 K2 + 0x58140003, // 0003 LDCONST R5 K3 + 0x7C0C0400, // 0004 CALL R3 2 + 0x8C0C0302, // 0005 GETMET R3 R1 K2 + 0x58140004, // 0006 LDCONST R5 K4 + 0x7C0C0400, // 0007 CALL R3 2 + 0x880C0105, // 0008 GETMBR R3 R0 K5 + 0x880C0706, // 0009 GETMBR R3 R3 K6 + 0x4C100000, // 000A LDNIL R4 + 0x1C0C0604, // 000B EQ R3 R3 R4 + 0x780E0006, // 000C JMPF R3 #0014 + 0x8C0C0302, // 000D GETMET R3 R1 K2 + 0x8C140507, // 000E GETMET R5 R2 K7 + 0x581C0008, // 000F LDCONST R7 K8 + 0x58200009, // 0010 LDCONST R8 K9 + 0x7C140600, // 0011 CALL R5 3 + 0x7C0C0400, // 0012 CALL R3 2 + 0x70020005, // 0013 JMP #001A + 0x8C0C0302, // 0014 GETMET R3 R1 K2 + 0x8C140507, // 0015 GETMET R5 R2 K7 + 0x581C000A, // 0016 LDCONST R7 K10 + 0x5820000B, // 0017 LDCONST R8 K11 + 0x7C140600, // 0018 CALL R5 3 + 0x7C0C0400, // 0019 CALL R3 2 + 0x8C0C0302, // 001A GETMET R3 R1 K2 + 0x5814000C, // 001B LDCONST R5 K12 + 0x7C0C0400, // 001C CALL R3 2 + 0x8C0C0302, // 001D GETMET R3 R1 K2 + 0x5814000D, // 001E LDCONST R5 K13 + 0x7C0C0400, // 001F CALL R3 2 + 0x8C0C0302, // 0020 GETMET R3 R1 K2 + 0x5814000E, // 0021 LDCONST R5 K14 + 0x7C0C0400, // 0022 CALL R3 2 + 0x8C0C0302, // 0023 GETMET R3 R1 K2 + 0x8C140507, // 0024 GETMET R5 R2 K7 + 0x581C000F, // 0025 LDCONST R7 K15 + 0x88200105, // 0026 GETMBR R8 R0 K5 + 0x88201110, // 0027 GETMBR R8 R8 K16 + 0x7C140600, // 0028 CALL R5 3 + 0x7C0C0400, // 0029 CALL R3 2 + 0x8C0C0302, // 002A GETMET R3 R1 K2 + 0x58140011, // 002B LDCONST R5 K17 + 0x7C0C0400, // 002C CALL R3 2 + 0x8C0C0302, // 002D GETMET R3 R1 K2 + 0x8C140507, // 002E GETMET R5 R2 K7 + 0x581C0012, // 002F LDCONST R7 K18 + 0x88200105, // 0030 GETMBR R8 R0 K5 + 0x88201113, // 0031 GETMBR R8 R8 K19 + 0x7C140600, // 0032 CALL R5 3 + 0x7C0C0400, // 0033 CALL R3 2 + 0x8C0C0302, // 0034 GETMET R3 R1 K2 + 0x8C140507, // 0035 GETMET R5 R2 K7 + 0x581C0014, // 0036 LDCONST R7 K20 + 0x88200105, // 0037 GETMBR R8 R0 K5 + 0x88201115, // 0038 GETMBR R8 R8 K21 + 0x78220001, // 0039 JMPF R8 #003C + 0x58200016, // 003A LDCONST R8 K22 + 0x70020000, // 003B JMP #003D + 0x58200017, // 003C LDCONST R8 K23 + 0x7C140600, // 003D CALL R5 3 + 0x7C0C0400, // 003E CALL R3 2 + 0x8C0C0302, // 003F GETMET R3 R1 K2 + 0x58140018, // 0040 LDCONST R5 K24 + 0x7C0C0400, // 0041 CALL R3 2 + 0x8C0C0302, // 0042 GETMET R3 R1 K2 + 0x58140019, // 0043 LDCONST R5 K25 + 0x7C0C0400, // 0044 CALL R3 2 + 0x80000000, // 0045 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: show_bridge_status +********************************************************************/ +be_local_closure(Matter_UI_show_bridge_status, /* name */ + be_nested_proto( + 15, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[26]) { /* constants */ + /* K0 */ be_nested_str_weak(webserver), + /* K1 */ be_nested_str_weak(string), + /* K2 */ be_const_int(0), + /* K3 */ be_nested_str_weak(device), + /* K4 */ be_nested_str_weak(plugins), + /* K5 */ be_nested_str_weak(matter), + /* K6 */ be_nested_str_weak(Plugin_Bridge_HTTP), + /* K7 */ be_nested_str_weak(http_remote), + /* K8 */ be_nested_str_weak(addr), + /* K9 */ be_nested_str_weak(contains), + /* K10 */ be_nested_str_weak(push), + /* K11 */ be_const_int(1), + /* K12 */ be_nested_str_weak(content_send), + /* K13 */ be_nested_str_weak(_X3Chr_X3E), + /* K14 */ be_nested_str_weak(_X3Ctable_X20style_X3D_X27width_X3A100_X25_X27_X3E), + /* K15 */ be_nested_str_weak(_STYLESHEET), + /* K16 */ be_nested_str_weak(keys), + /* K17 */ be_nested_str_weak(format), + /* K18 */ be_nested_str_weak(_X3Ctr_X20class_X3D_X27ztdm_X20htrm_X27_X3E_X3Ctd_X3E_X3Cb_X3E_X25s_X3C_X2Fb_X3E_X3C_X2Ftd_X3E), + /* K19 */ be_nested_str_weak(html_escape), + /* K20 */ be_nested_str_weak(web_last_seen), + /* K21 */ be_nested_str_weak(_X3Ctr_X20class_X3D_X27htrm_X27_X3E_X3Ctd_X20colspan_X3D_X272_X27_X3E), + /* K22 */ be_nested_str_weak(web_values), + /* K23 */ be_nested_str_weak(_X3C_X2Ftd_X3E_X3C_X2Ftr_X3E), + /* K24 */ be_nested_str_weak(stop_iteration), + /* K25 */ be_nested_str_weak(_X3C_X2Ftable_X3E_X3Chr_X3E), + }), + be_str_weak(show_bridge_status), + &be_const_str_solidified, + ( &(const binstruction[102]) { /* code */ + 0xA4060000, // 0000 IMPORT R1 K0 + 0xA40A0200, // 0001 IMPORT R2 K1 + 0x4C0C0000, // 0002 LDNIL R3 + 0x58100002, // 0003 LDCONST R4 K2 + 0x6014000C, // 0004 GETGBL R5 G12 + 0x88180103, // 0005 GETMBR R6 R0 K3 + 0x88180D04, // 0006 GETMBR R6 R6 K4 + 0x7C140200, // 0007 CALL R5 1 + 0x14140805, // 0008 LT R5 R4 R5 + 0x7816001D, // 0009 JMPF R5 #0028 + 0x88140103, // 000A GETMBR R5 R0 K3 + 0x88140B04, // 000B GETMBR R5 R5 K4 + 0x94140A04, // 000C GETIDX R5 R5 R4 + 0x6018000F, // 000D GETGBL R6 G15 + 0x5C1C0A00, // 000E MOVE R7 R5 + 0xB8220A00, // 000F GETNGBL R8 K5 + 0x88201106, // 0010 GETMBR R8 R8 K6 + 0x7C180400, // 0011 CALL R6 2 + 0x781A0012, // 0012 JMPF R6 #0026 + 0x4C180000, // 0013 LDNIL R6 + 0x1C180606, // 0014 EQ R6 R3 R6 + 0x781A0002, // 0015 JMPF R6 #0019 + 0x60180013, // 0016 GETGBL R6 G19 + 0x7C180000, // 0017 CALL R6 0 + 0x5C0C0C00, // 0018 MOVE R3 R6 + 0x88180B07, // 0019 GETMBR R6 R5 K7 + 0x88180D08, // 001A GETMBR R6 R6 K8 + 0x8C1C0709, // 001B GETMET R7 R3 K9 + 0x5C240C00, // 001C MOVE R9 R6 + 0x7C1C0400, // 001D CALL R7 2 + 0x741E0002, // 001E JMPT R7 #0022 + 0x601C0012, // 001F GETGBL R7 G18 + 0x7C1C0000, // 0020 CALL R7 0 + 0x980C0C07, // 0021 SETIDX R3 R6 R7 + 0x941C0606, // 0022 GETIDX R7 R3 R6 + 0x8C1C0F0A, // 0023 GETMET R7 R7 K10 + 0x5C240A00, // 0024 MOVE R9 R5 + 0x7C1C0400, // 0025 CALL R7 2 + 0x0010090B, // 0026 ADD R4 R4 K11 + 0x7001FFDB, // 0027 JMP #0004 + 0x4C140000, // 0028 LDNIL R5 + 0x1C140605, // 0029 EQ R5 R3 R5 + 0x78160000, // 002A JMPF R5 #002C + 0x80000A00, // 002B RET 0 + 0x8C14030C, // 002C GETMET R5 R1 K12 + 0x581C000D, // 002D LDCONST R7 K13 + 0x7C140400, // 002E CALL R5 2 + 0x8C14030C, // 002F GETMET R5 R1 K12 + 0x581C000E, // 0030 LDCONST R7 K14 + 0x7C140400, // 0031 CALL R5 2 + 0x8C14030C, // 0032 GETMET R5 R1 K12 + 0xB81E0A00, // 0033 GETNGBL R7 K5 + 0x881C0F0F, // 0034 GETMBR R7 R7 K15 + 0x7C140400, // 0035 CALL R5 2 + 0x60140010, // 0036 GETGBL R5 G16 + 0x8C180710, // 0037 GETMET R6 R3 K16 + 0x7C180200, // 0038 CALL R6 1 + 0x7C140200, // 0039 CALL R5 1 + 0xA8020023, // 003A EXBLK 0 #005F + 0x5C180A00, // 003B MOVE R6 R5 + 0x7C180000, // 003C CALL R6 0 + 0x8C1C030C, // 003D GETMET R7 R1 K12 + 0x8C240511, // 003E GETMET R9 R2 K17 + 0x582C0012, // 003F LDCONST R11 K18 + 0x8C300313, // 0040 GETMET R12 R1 K19 + 0x5C380C00, // 0041 MOVE R14 R6 + 0x7C300400, // 0042 CALL R12 2 + 0x7C240600, // 0043 CALL R9 3 + 0x7C1C0400, // 0044 CALL R7 2 + 0x941C0606, // 0045 GETIDX R7 R3 R6 + 0x941C0F02, // 0046 GETIDX R7 R7 K2 + 0x881C0F07, // 0047 GETMBR R7 R7 K7 + 0x8C20030C, // 0048 GETMET R8 R1 K12 + 0x8C280F14, // 0049 GETMET R10 R7 K20 + 0x7C280200, // 004A CALL R10 1 + 0x7C200400, // 004B CALL R8 2 + 0x60200010, // 004C GETGBL R8 G16 + 0x94240606, // 004D GETIDX R9 R3 R6 + 0x7C200200, // 004E CALL R8 1 + 0xA802000A, // 004F EXBLK 0 #005B + 0x5C241000, // 0050 MOVE R9 R8 + 0x7C240000, // 0051 CALL R9 0 + 0x8C28030C, // 0052 GETMET R10 R1 K12 + 0x58300015, // 0053 LDCONST R12 K21 + 0x7C280400, // 0054 CALL R10 2 + 0x8C281316, // 0055 GETMET R10 R9 K22 + 0x7C280200, // 0056 CALL R10 1 + 0x8C28030C, // 0057 GETMET R10 R1 K12 + 0x58300017, // 0058 LDCONST R12 K23 + 0x7C280400, // 0059 CALL R10 2 + 0x7001FFF4, // 005A JMP #0050 + 0x58200018, // 005B LDCONST R8 K24 + 0xAC200200, // 005C CATCH R8 1 0 + 0xB0080000, // 005D RAISE 2 R0 R0 + 0x7001FFDB, // 005E JMP #003B + 0x58140018, // 005F LDCONST R5 K24 + 0xAC140200, // 0060 CATCH R5 1 0 + 0xB0080000, // 0061 RAISE 2 R0 R0 + 0x8C14030C, // 0062 GETMET R5 R1 K12 + 0x581C0019, // 0063 LDCONST R7 K25 + 0x7C140400, // 0064 CALL R5 2 + 0x80000000, // 0065 RET 0 + }) + ) +); +/*******************************************************************/ + + /******************************************************************** ** Solidified class: Matter_UI ********************************************************************/ be_local_class(Matter_UI, 1, NULL, - be_nested_map(19, + be_nested_map(18, ( (struct bmapnode*) &(const bmapnode[]) { - { be_const_key_weak(_CLASSES_TYPES, -1), be_nested_str_weak(_X7Crelay_X7Clight0_X7Clight1_X7Clight2_X7Clight3_X7Cshutter_X7Cshutter_X2Btilt_X7Ctemperature_X7Cpressure_X7Cilluminance_X7Chumidity_X7Coccupancy) }, - { be_const_key_weak(device, -1), be_const_var(0) }, - { be_const_key_weak(show_enable, -1), be_const_closure(Matter_UI_show_enable_closure) }, - { be_const_key_weak(plugin_option, -1), be_const_closure(Matter_UI_plugin_option_closure) }, { be_const_key_weak(show_bridge_status, -1), be_const_closure(Matter_UI_show_bridge_status_closure) }, - { be_const_key_weak(show_qrcode, -1), be_const_closure(Matter_UI_show_qrcode_closure) }, - { be_const_key_weak(web_get_arg, -1), be_const_closure(Matter_UI_web_get_arg_closure) }, - { be_const_key_weak(show_plugins_configuration, 1), be_const_closure(Matter_UI_show_plugins_configuration_closure) }, - { be_const_key_weak(web_sensor, -1), be_const_closure(Matter_UI_web_sensor_closure) }, - { be_const_key_weak(show_passcode_form, 2), be_const_closure(Matter_UI_show_passcode_form_closure) }, - { be_const_key_weak(web_add_handler, -1), be_const_closure(Matter_UI_web_add_handler_closure) }, - { be_const_key_weak(init, -1), be_const_closure(Matter_UI_init_closure) }, - { be_const_key_weak(_ROOT_TYPES, 6), be_nested_str_weak(root) }, - { be_const_key_weak(page_part_ctl, 11), be_const_closure(Matter_UI_page_part_ctl_closure) }, - { be_const_key_weak(web_add_config_button, 8), be_const_closure(Matter_UI_web_add_config_button_closure) }, - { be_const_key_weak(page_part_mgr, 7), be_const_closure(Matter_UI_page_part_mgr_closure) }, { be_const_key_weak(show_commissioning_info, -1), be_const_closure(Matter_UI_show_commissioning_info_closure) }, - { be_const_key_weak(_CLASSES_TYPES2, -1), be_nested_str_weak(_X2Dhttp_X7Chttp_relay_X7Chttp_light0_X7Chttp_light1_X7Chttp_light2_X7Chttp_light3_X7Chttp_temperature_X7Chttp_pressure_X7Chttp_illuminance_X7Chttp_humidity_X7Chttp_occupancy) }, + { be_const_key_weak(show_passcode_form, 11), be_const_closure(Matter_UI_show_passcode_form_closure) }, + { be_const_key_weak(device, -1), be_const_var(0) }, + { be_const_key_weak(web_get_arg, -1), be_const_closure(Matter_UI_web_get_arg_closure) }, + { be_const_key_weak(show_qrcode, 4), be_const_closure(Matter_UI_show_qrcode_closure) }, + { be_const_key_weak(show_plugins_configuration, -1), be_const_closure(Matter_UI_show_plugins_configuration_closure) }, + { be_const_key_weak(_CLASSES_TYPES, -1), be_nested_str_weak(_X7Crelay_X7Clight0_X7Clight1_X7Clight2_X7Clight3_X7Cshutter_X7Cshutter_X2Btilt_X7Ctemperature_X7Cpressure_X7Cilluminance_X7Chumidity_X7Coccupancy) }, + { be_const_key_weak(web_sensor, -1), be_const_closure(Matter_UI_web_sensor_closure) }, + { be_const_key_weak(web_add_config_button, -1), be_const_closure(Matter_UI_web_add_config_button_closure) }, + { be_const_key_weak(_CLASSES_TYPES2, 7), be_nested_str_weak(_X2Dhttp_X7Chttp_relay_X7Chttp_light0_X7Chttp_light1_X7Chttp_light2_X7Chttp_light3_X7Chttp_temperature_X7Chttp_pressure_X7Chttp_illuminance_X7Chttp_humidity_X7Chttp_occupancy) }, + { be_const_key_weak(plugin_option, -1), be_const_closure(Matter_UI_plugin_option_closure) }, + { be_const_key_weak(show_enable, -1), be_const_closure(Matter_UI_show_enable_closure) }, { be_const_key_weak(show_fabric_info, -1), be_const_closure(Matter_UI_show_fabric_info_closure) }, + { be_const_key_weak(web_add_handler, -1), be_const_closure(Matter_UI_web_add_handler_closure) }, + { be_const_key_weak(init, 3), be_const_closure(Matter_UI_init_closure) }, + { be_const_key_weak(page_part_ctl, 2), be_const_closure(Matter_UI_page_part_ctl_closure) }, + { be_const_key_weak(page_part_mgr, 0), be_const_closure(Matter_UI_page_part_mgr_closure) }, })), be_str_weak(Matter_UI) ); From c09165c7b21809fd19c40767906558c0f3f654f4 Mon Sep 17 00:00:00 2001 From: s-hadinger <49731213+s-hadinger@users.noreply.github.com> Date: Sat, 3 Jun 2023 19:47:10 +0200 Subject: [PATCH 222/289] Matter fix saving config (#18786) --- lib/libesp32/berry_matter/src/embedded/Matter_UI.be | 6 +++--- .../berry_matter/src/solidify/solidified_Matter_UI.h | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_UI.be b/lib/libesp32/berry_matter/src/embedded/Matter_UI.be index 769a458c9..169fbc7f4 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_UI.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_UI.be @@ -248,8 +248,8 @@ class Matter_UI # special case for root node # display a fake configuration item (disabled) - webserver.content_send("") - webserver.content_send("") + webserver.content_send("") webserver.content_send(" ") @@ -438,7 +438,7 @@ class Matter_UI tasmota.log(string.format("MTR: /matterc received '%s' command", 'config'), 3) # iterate by id - var idx = 1 + var idx = 0 var idx_str = string.format("%03i", idx) while webserver.has_arg('ep'+idx_str) diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_UI.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_UI.h index 308381b54..c950220be 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_UI.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_UI.h @@ -651,7 +651,7 @@ be_local_closure(Matter_UI_page_part_ctl, /* name */ 0x7C240600, // 00D2 CALL R9 3 0x5828000C, // 00D3 LDCONST R10 K12 0x7C1C0600, // 00D4 CALL R7 3 - 0x581C002A, // 00D5 LDCONST R7 K42 + 0x581C0025, // 00D5 LDCONST R7 K37 0x8C20050A, // 00D6 GETMET R8 R2 K10 0x5828002F, // 00D7 LDCONST R10 K47 0x5C2C0E00, // 00D8 MOVE R11 R7 @@ -892,8 +892,8 @@ be_local_closure(Matter_UI_show_plugins_configuration, /* name */ /* K11 */ be_nested_str_weak(k2l_num), /* K12 */ be_nested_str_weak(plugins_config), /* K13 */ be_const_int(0), - /* K14 */ be_nested_str_weak(_X3Ctr_X3E_X3Ctd_X3E_X3Cinput_X20type_X3D_X27text_X27_X20name_X3D_X27ep000_X27_X20maxlength_X3D_X274_X27_X20size_X3D_X273_X27_X20value_X3D_X270_X27_X20readonly_X20disabled_X3E_X3C_X2Ftd_X3E), - /* K15 */ be_nested_str_weak(_X3Ctd_X3E_X3Cselect_X20name_X3D_X27pi000_X27_X3E), + /* K14 */ be_nested_str_weak(_X3Ctr_X3E_X3Ctd_X3E_X3Cinput_X20type_X3D_X27text_X27_X20name_X3D_X27epnone_X27_X20maxlength_X3D_X274_X27_X20size_X3D_X273_X27_X20value_X3D_X270_X27_X20readonly_X20disabled_X3E_X3C_X2Ftd_X3E), + /* K15 */ be_nested_str_weak(_X3Ctd_X3E_X3Cselect_X20name_X3D_X27pinone_X27_X3E), /* K16 */ be_nested_str_weak(_X3Coption_X20value_X3D_X27_X27_X20selected_X20disabled_X3ERoot_X20node_X3C_X2Foption_X3E), /* K17 */ be_nested_str_weak(_X3C_X2Fselect_X3E_X3C_X2Ftd_X3E), /* K18 */ be_nested_str_weak(_X3Ctd_X3E_X3Cfont_X20size_X3D_X27_X2D1_X27_X3E_X26nbsp_X3B_X3C_X2Ffont_X3E_X3C_X2Ftd_X3E), From e66439cb504aa7ae9e6e277baaa8affd96da74ee Mon Sep 17 00:00:00 2001 From: s-hadinger <49731213+s-hadinger@users.noreply.github.com> Date: Sun, 4 Jun 2023 19:35:36 +0200 Subject: [PATCH 223/289] Matter ability to add or remove endpoint in bridge mode (code only) (#18790) --- CHANGELOG.md | 1 + .../src/embedded/Matter_Device.be | 134 +- .../src/embedded/Matter_Fabric.be | 2 +- .../src/embedded/Matter_Plugin_Aggregator.be | 2 +- .../berry_matter/src/embedded/Matter_UI.be | 4 +- .../src/solidify/solidified_Matter_Device.h | 7994 +++++++++-------- .../src/solidify/solidified_Matter_Fabric.h | 18 +- .../solidified_Matter_Plugin_Aggregator.h | 2 +- .../src/solidify/solidified_Matter_UI.h | 131 +- 9 files changed, 4336 insertions(+), 3952 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index dc6daa042..db8ae8e28 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,7 @@ All notable changes to this project will be documented in this file. ## [12.5.0.4] ### Added +- Matter ability to add or remove endpoint in bridge mode (code only) ### Breaking Changed diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Device.be b/lib/libesp32/berry_matter/src/embedded/Matter_Device.be index 4f4c215ca..222766a78 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Device.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Device.be @@ -62,6 +62,7 @@ class Matter_Device var root_discriminator # as `int` var root_passcode # as `int` var ipv4only # advertize only IPv4 addresses (no IPv6) + var next_ep # next endpoint to be allocated for bridge, start at 51 # context for PBKDF var root_iterations # PBKDF number of iterations # PBKDF information used only during PASE (freed afterwards) @@ -87,6 +88,7 @@ class Matter_Device self.vendorid = self.VENDOR_ID self.productid = self.PRODUCT_ID self.root_iterations = self.PBKDF_ITERATIONS + self.next_ep = 51 # start at endpoint 51 for dynamically allocated endpoints self.root_salt = crypto.random(16) self.ipv4only = false self.load_param() @@ -128,6 +130,7 @@ class Matter_Device self.autoconf_device() # for now read sensors every 30 seconds + # TODO still needed? tasmota.add_cron("*/30 * * * * *", def () self._trigger_read_sensors() end, "matter_sensors_30s") self._start_udp(self.UDP_PORT) @@ -610,7 +613,7 @@ class Matter_Device def save_param() import string import json - var j = string.format('{"distinguish":%i,"passcode":%i,"ipv4only":%s', self.root_discriminator, self.root_passcode, self.ipv4only ? 'true':'false') + var j = string.format('{"distinguish":%i,"passcode":%i,"ipv4only":%s,"nextep":%i', self.root_discriminator, self.root_passcode, self.ipv4only ? 'true':'false', self.next_ep) if self.plugins_persist j += ',"config":' j += json.dump(self.plugins_config) @@ -638,16 +641,17 @@ class Matter_Device var f = open(self.FILENAME) var s = f.read() f.close() - import json var j = json.load(s) self.root_discriminator = j.find("distinguish", self.root_discriminator) self.root_passcode = j.find("passcode", self.root_passcode) self.ipv4only = bool(j.find("ipv4only", false)) + self.next_ep = j.find("nextep", self.next_ep) self.plugins_config = j.find("config") - if self.plugins_config - self._load_plugins_config(self.plugins_config) + if self.plugins_config != nil + tasmota.log("MTR: load_config = " + str(self.plugins_config), 3) + self.adjust_next_ep() self.plugins_persist = true end except .. as e, m @@ -674,7 +678,7 @@ class Matter_Device # 'config' is a map # Ex: # {'32': {'filter': 'AXP192#Temperature', 'type': 'temperature'}, '40': {'filter': 'BMP280#Pressure', 'type': 'pressure'}, '34': {'filter': 'SHT3X#Temperature', 'type': 'temperature'}, '33': {'filter': 'BMP280#Temperature', 'type': 'temperature'}, '1': {'relay': 0, 'type': 'relay'}, '56': {'filter': 'SHT3X#Humidity', 'type': 'humidity'}, '0': {'type': 'root'}} - def _load_plugins_config(config) + def _instantiate_plugins_from_config(config) import string var endpoints = self.k2l_num(config) @@ -995,9 +999,12 @@ class Matter_Device if size(self.plugins) > 0 return end # already configured - self.plugins_config = self.autoconf_device_map() - tasmota.log("MTR: autoconfig = " + str(self.plugins_config), 3) - self._load_plugins_config(self.plugins_config) + if !self.plugins_persist + self.plugins_config = self.autoconf_device_map() + self.adjust_next_ep() + tasmota.log("MTR: autoconfig = " + str(self.plugins_config), 3) + end + self._instantiate_plugins_from_config(self.plugins_config) if !self.plugins_persist && self.sessions.count_active_fabrics() > 0 self.plugins_persist = true @@ -1084,8 +1091,6 @@ class Matter_Device var sensors = json.load(tasmota.read_sensors()) # temperature sensors - # they are starting at endpoint `32..39` (8 max) - endpoint = 0x20 for k1:self.k2l(sensors) var sensor_2 = sensors[k1] if isinstance(sensor_2, map) && sensor_2.contains("Temperature") @@ -1093,12 +1098,9 @@ class Matter_Device m[str(endpoint)] = {'type':'temperature','filter':temp_rule} endpoint += 1 end - if endpoint > 0x28 break end end # pressure sensors - # they are starting at endpoint `40..47` (8 max) - endpoint = 0x28 for k1:self.k2l(sensors) var sensor_2 = sensors[k1] if isinstance(sensor_2, map) && sensor_2.contains("Pressure") @@ -1106,12 +1108,9 @@ class Matter_Device m[str(endpoint)] = {'type':'pressure','filter':temp_rule} endpoint += 1 end - if endpoint > 0x2F break end end # light sensors - # they are starting at endpoint `48..55` (8 max) - endpoint = 0x30 for k1:self.k2l(sensors) var sensor_2 = sensors[k1] if isinstance(sensor_2, map) && sensor_2.contains("Illuminance") @@ -1119,12 +1118,9 @@ class Matter_Device m[str(endpoint)] = {'type':'illuminance','filter':temp_rule} endpoint += 1 end - if endpoint > 0x38 break end end # huidity sensors - # they are starting at endpoint `56..63` (8 max) - endpoint = 0x38 for k1:self.k2l(sensors) var sensor_2 = sensors[k1] if isinstance(sensor_2, map) && sensor_2.contains("Humidity") @@ -1132,9 +1128,8 @@ class Matter_Device m[str(endpoint)] = {'type':'humidity','filter':temp_rule} endpoint += 1 end - if endpoint > 0x40 break end end - # tasmota.publish_result('{"Matter":{"Initialized":1}}', 'Matter') + # tasmota.publish_result('{"Matter":{"Initialized":1}}', 'Matter') # MQTT is not yet connected return m end @@ -1195,6 +1190,103 @@ class Matter_Device tasmota.log("MTR: registered classes "+str(self.k2l(self.plugins_classes)), 3) end + ############################################################# + # Dynamic adding and removal of endpoints (bridge mode) + ############################################################# + # Add endpoint + # + # Args: + # `pi_class_name`: name of the type of pluging, ex: `light3` + # `plugin_conf`: map of configuration as native Berry map + # returns endpoint number newly allocated, or `nil` if failed + def bridge_add_endpoint(pi_class_name, plugin_conf) + var pi_class = self.plugins_classes.find(pi_class_name) + if pi_class == nil tasmota.log("MTR: unknown class name '"+str(pi_class_name)+"' skipping", 2) return end + + # get the next allocated endpoint number + var ep = self.next_ep + var ep_str = str(ep) + + var pi = pi_class(self, ep, plugin_conf) + self.plugins.push(pi) + + # add to in-memoru config + # Example: {'filter': 'AXP192#Temperature', 'type': 'temperature'} + var pi_conf = {'type': pi_class_name} + # copy args + for k:plugin_conf.keys() + pi_conf[k] = plugin_conf[k] + end + # add to main + self.plugins_config[ep_str] = pi_conf + self.plugins_persist = true + self.next_ep += 1 # increment next allocated endpoint before saving + + # try saving parameters + self.save_param() + self.signal_endpoints_changed() + + return ep + end + + ############################################################# + # Remove an existing endpoint + # + def bridge_remove_endpoint(ep) + import string + import json + + var ep_str = str(ep) + var config + var f_in + + if !self.plugins_config.contains(ep_str) + tasmota.log("MTR: Cannot remove an enpoint not configured: " + ep_str, 3) + return + end + self.plugins_config.remove(ep_str) + self.plugins_persist = true + + # try saving parameters + self.save_param() + self.signal_endpoints_changed() + + # now remove from in-memory configuration + var idx = 0 + while idx < size(self.plugins) + if ep == self.plugins[idx].get_endpoint() + self.plugins.remove(idx) + self.signal_endpoints_changed() + break + else + idx += 1 + end + end + end + + ############################################################# + # Signal to controller that endpoints changed via subcriptions + # + def signal_endpoints_changed() + # mark parts lists as changed + self.attribute_updated(0x0000, 0x001D, 0x0003, false) + self.attribute_updated(0xFF00, 0x001D, 0x0003, false) + end + + ############################################################# + # Adjust next_ep + # + # Make sure that next_ep (used to allow dynamic endpoints) + # will not collide with an existing ep + def adjust_next_ep() + for k: self.plugins_config.keys() + var ep = int(k) + if ep >= self.next_ep + self.next_ep = ep + 1 + end + end + end + ##################################################################### # Events ##################################################################### diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Fabric.be b/lib/libesp32/berry_matter/src/embedded/Matter_Fabric.be index 0b990ccf5..046201337 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Fabric.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Fabric.be @@ -205,7 +205,7 @@ class Matter_Fabric : Matter_Expirable # Called before removal def log_new_fabric() import string - tasmota.log(string.format("MTR: +Fabric fab='%s'", self.get_fabric_id().copy().reverse().tohex()), 2) + tasmota.log(string.format("MTR: +Fabric fab='%s' vendorid=0x%04X", self.get_fabric_id().copy().reverse().tohex(), self.admin_vendor), 2) end ############################################################# diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Aggregator.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Aggregator.be index 90a9255ac..16af42074 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Aggregator.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Aggregator.be @@ -50,7 +50,7 @@ class Matter_Plugin_Aggregator : Matter_Plugin var pl = TLV.Matter_TLV_array() var eps = self.device.get_active_endpoints(true) for ep: eps - if ep != 0xFF00 + if ep < 0xFF00 pl.add_TLV(nil, TLV.U2, ep) # add each endpoint end end diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_UI.be b/lib/libesp32/berry_matter/src/embedded/Matter_UI.be index 169fbc7f4..c856ed102 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_UI.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_UI.be @@ -205,7 +205,7 @@ class Matter_UI if !label label = "" end label = webserver.html_escape(label) # protect against HTML injection - webserver.content_send(string.format("
     #%i %s 

    ", f.get_fabric_index(), label)) + webserver.content_send(string.format("
     #%i %s (0x%04X) 

    ", f.get_fabric_index(), label, f.get_admin_vendor())) var fabric_rev = f.get_fabric_id().copy().reverse() var deviceid_rev = f.get_device_id().copy().reverse() @@ -235,7 +235,7 @@ class Matter_UI webserver.content_send("") - webserver.content_send("

    ") + webserver.content_send("

    ") webserver.content_send("
    ") diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Device.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Device.h index f7a6b4bec..69e3f8350 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Device.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Device.h @@ -7,308 +7,12 @@ extern const bclass be_class_Matter_Device; /******************************************************************** -** Solidified function: k2l_num +** Solidified function: every_250ms ********************************************************************/ -be_local_closure(Matter_Device_k2l_num, /* name */ +be_local_closure(Matter_Device_every_250ms, /* name */ be_nested_proto( - 9, /* nstack */ + 4, /* nstack */ 1, /* argc */ - 4, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 6]) { /* constants */ - /* K0 */ be_const_class(be_class_Matter_Device), - /* K1 */ be_nested_str_weak(keys), - /* K2 */ be_nested_str_weak(push), - /* K3 */ be_nested_str_weak(stop_iteration), - /* K4 */ be_const_int(1), - /* K5 */ be_const_int(0), - }), - be_str_weak(k2l_num), - &be_const_str_solidified, - ( &(const binstruction[52]) { /* code */ - 0x58040000, // 0000 LDCONST R1 K0 - 0x60080012, // 0001 GETGBL R2 G18 - 0x7C080000, // 0002 CALL R2 0 - 0x4C0C0000, // 0003 LDNIL R3 - 0x1C0C0003, // 0004 EQ R3 R0 R3 - 0x780E0000, // 0005 JMPF R3 #0007 - 0x80040400, // 0006 RET 1 R2 - 0x600C0010, // 0007 GETGBL R3 G16 - 0x8C100101, // 0008 GETMET R4 R0 K1 - 0x7C100200, // 0009 CALL R4 1 - 0x7C0C0200, // 000A CALL R3 1 - 0xA8020007, // 000B EXBLK 0 #0014 - 0x5C100600, // 000C MOVE R4 R3 - 0x7C100000, // 000D CALL R4 0 - 0x8C140502, // 000E GETMET R5 R2 K2 - 0x601C0009, // 000F GETGBL R7 G9 - 0x5C200800, // 0010 MOVE R8 R4 - 0x7C1C0200, // 0011 CALL R7 1 - 0x7C140400, // 0012 CALL R5 2 - 0x7001FFF7, // 0013 JMP #000C - 0x580C0003, // 0014 LDCONST R3 K3 - 0xAC0C0200, // 0015 CATCH R3 1 0 - 0xB0080000, // 0016 RAISE 2 R0 R0 - 0x600C0010, // 0017 GETGBL R3 G16 - 0x6010000C, // 0018 GETGBL R4 G12 - 0x5C140400, // 0019 MOVE R5 R2 - 0x7C100200, // 001A CALL R4 1 - 0x04100904, // 001B SUB R4 R4 K4 - 0x40120804, // 001C CONNECT R4 K4 R4 - 0x7C0C0200, // 001D CALL R3 1 - 0xA8020010, // 001E EXBLK 0 #0030 - 0x5C100600, // 001F MOVE R4 R3 - 0x7C100000, // 0020 CALL R4 0 - 0x94140404, // 0021 GETIDX R5 R2 R4 - 0x5C180800, // 0022 MOVE R6 R4 - 0x241C0D05, // 0023 GT R7 R6 K5 - 0x781E0008, // 0024 JMPF R7 #002E - 0x041C0D04, // 0025 SUB R7 R6 K4 - 0x941C0407, // 0026 GETIDX R7 R2 R7 - 0x241C0E05, // 0027 GT R7 R7 R5 - 0x781E0004, // 0028 JMPF R7 #002E - 0x041C0D04, // 0029 SUB R7 R6 K4 - 0x941C0407, // 002A GETIDX R7 R2 R7 - 0x98080C07, // 002B SETIDX R2 R6 R7 - 0x04180D04, // 002C SUB R6 R6 K4 - 0x7001FFF4, // 002D JMP #0023 - 0x98080C05, // 002E SETIDX R2 R6 R5 - 0x7001FFEE, // 002F JMP #001F - 0x580C0003, // 0030 LDCONST R3 K3 - 0xAC0C0200, // 0031 CATCH R3 1 0 - 0xB0080000, // 0032 RAISE 2 R0 R0 - 0x80040400, // 0033 RET 1 R2 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: register_native_classes -********************************************************************/ -be_local_closure(Matter_Device_register_native_classes, /* name */ - be_nested_proto( - 12, /* nstack */ - 3, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[17]) { /* constants */ - /* K0 */ be_nested_str_weak(introspect), - /* K1 */ be_nested_str_weak(string), - /* K2 */ be_nested_str_weak(members), - /* K3 */ be_nested_str_weak(matter), - /* K4 */ be_nested_str_weak(get), - /* K5 */ be_nested_str_weak(class), - /* K6 */ be_nested_str_weak(find), - /* K7 */ be_nested_str_weak(Plugin_), - /* K8 */ be_const_int(0), - /* K9 */ be_nested_str_weak(register_plugin_class), - /* K10 */ be_nested_str_weak(stop_iteration), - /* K11 */ be_nested_str_weak(tasmota), - /* K12 */ be_nested_str_weak(log), - /* K13 */ be_nested_str_weak(MTR_X3A_X20registered_X20classes_X20), - /* K14 */ be_nested_str_weak(k2l), - /* K15 */ be_nested_str_weak(plugins_classes), - /* K16 */ be_const_int(3), - }), - be_str_weak(register_native_classes), - &be_const_str_solidified, - ( &(const binstruction[43]) { /* code */ - 0xA40E0000, // 0000 IMPORT R3 K0 - 0xA4120200, // 0001 IMPORT R4 K1 - 0x60140010, // 0002 GETGBL R5 G16 - 0x8C180702, // 0003 GETMET R6 R3 K2 - 0xB8220600, // 0004 GETNGBL R8 K3 - 0x7C180400, // 0005 CALL R6 2 - 0x7C140200, // 0006 CALL R5 1 - 0xA8020014, // 0007 EXBLK 0 #001D - 0x5C180A00, // 0008 MOVE R6 R5 - 0x7C180000, // 0009 CALL R6 0 - 0x8C1C0704, // 000A GETMET R7 R3 K4 - 0xB8260600, // 000B GETNGBL R9 K3 - 0x5C280C00, // 000C MOVE R10 R6 - 0x7C1C0600, // 000D CALL R7 3 - 0x60200004, // 000E GETGBL R8 G4 - 0x5C240E00, // 000F MOVE R9 R7 - 0x7C200200, // 0010 CALL R8 1 - 0x1C201105, // 0011 EQ R8 R8 K5 - 0x78220008, // 0012 JMPF R8 #001C - 0x8C200906, // 0013 GETMET R8 R4 K6 - 0x5C280C00, // 0014 MOVE R10 R6 - 0x582C0007, // 0015 LDCONST R11 K7 - 0x7C200600, // 0016 CALL R8 3 - 0x1C201108, // 0017 EQ R8 R8 K8 - 0x78220002, // 0018 JMPF R8 #001C - 0x8C200109, // 0019 GETMET R8 R0 K9 - 0x5C280E00, // 001A MOVE R10 R7 - 0x7C200400, // 001B CALL R8 2 - 0x7001FFEA, // 001C JMP #0008 - 0x5814000A, // 001D LDCONST R5 K10 - 0xAC140200, // 001E CATCH R5 1 0 - 0xB0080000, // 001F RAISE 2 R0 R0 - 0xB8161600, // 0020 GETNGBL R5 K11 - 0x8C140B0C, // 0021 GETMET R5 R5 K12 - 0x601C0008, // 0022 GETGBL R7 G8 - 0x8C20010E, // 0023 GETMET R8 R0 K14 - 0x8828010F, // 0024 GETMBR R10 R0 K15 - 0x7C200400, // 0025 CALL R8 2 - 0x7C1C0200, // 0026 CALL R7 1 - 0x001E1A07, // 0027 ADD R7 K13 R7 - 0x58200010, // 0028 LDCONST R8 K16 - 0x7C140600, // 0029 CALL R5 3 - 0x80000000, // 002A RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: save_before_restart -********************************************************************/ -be_local_closure(Matter_Device_save_before_restart, /* name */ - be_nested_proto( - 3, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 2]) { /* constants */ - /* K0 */ be_nested_str_weak(stop_basic_commissioning), - /* K1 */ be_nested_str_weak(mdns_remove_op_discovery_all_fabrics), - }), - be_str_weak(save_before_restart), - &be_const_str_solidified, - ( &(const binstruction[ 5]) { /* code */ - 0x8C040100, // 0000 GETMET R1 R0 K0 - 0x7C040200, // 0001 CALL R1 1 - 0x8C040101, // 0002 GETMET R1 R0 K1 - 0x7C040200, // 0003 CALL R1 1 - 0x80000000, // 0004 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: stop_basic_commissioning -********************************************************************/ -be_local_closure(Matter_Device_stop_basic_commissioning, /* name */ - be_nested_proto( - 5, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[13]) { /* constants */ - /* K0 */ be_nested_str_weak(is_root_commissioning_open), - /* K1 */ be_nested_str_weak(tasmota), - /* K2 */ be_nested_str_weak(publish_result), - /* K3 */ be_nested_str_weak(_X7B_X22Matter_X22_X3A_X7B_X22Commissioning_X22_X3A0_X7D_X7D), - /* K4 */ be_nested_str_weak(Matter), - /* K5 */ be_nested_str_weak(commissioning_open), - /* K6 */ be_nested_str_weak(mdns_remove_PASE), - /* K7 */ be_nested_str_weak(commissioning_iterations), - /* K8 */ be_nested_str_weak(commissioning_discriminator), - /* K9 */ be_nested_str_weak(commissioning_salt), - /* K10 */ be_nested_str_weak(commissioning_w0), - /* K11 */ be_nested_str_weak(commissioning_L), - /* K12 */ be_nested_str_weak(commissioning_admin_fabric), - }), - be_str_weak(stop_basic_commissioning), - &be_const_str_solidified, - ( &(const binstruction[25]) { /* code */ - 0x8C040100, // 0000 GETMET R1 R0 K0 - 0x7C040200, // 0001 CALL R1 1 - 0x78060004, // 0002 JMPF R1 #0008 - 0xB8060200, // 0003 GETNGBL R1 K1 - 0x8C040302, // 0004 GETMET R1 R1 K2 - 0x580C0003, // 0005 LDCONST R3 K3 - 0x58100004, // 0006 LDCONST R4 K4 - 0x7C040600, // 0007 CALL R1 3 - 0x4C040000, // 0008 LDNIL R1 - 0x90020A01, // 0009 SETMBR R0 K5 R1 - 0x8C040106, // 000A GETMET R1 R0 K6 - 0x7C040200, // 000B CALL R1 1 - 0x4C040000, // 000C LDNIL R1 - 0x90020E01, // 000D SETMBR R0 K7 R1 - 0x4C040000, // 000E LDNIL R1 - 0x90021001, // 000F SETMBR R0 K8 R1 - 0x4C040000, // 0010 LDNIL R1 - 0x90021201, // 0011 SETMBR R0 K9 R1 - 0x4C040000, // 0012 LDNIL R1 - 0x90021401, // 0013 SETMBR R0 K10 R1 - 0x4C040000, // 0014 LDNIL R1 - 0x90021601, // 0015 SETMBR R0 K11 R1 - 0x4C040000, // 0016 LDNIL R1 - 0x90021801, // 0017 SETMBR R0 K12 R1 - 0x80000000, // 0018 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: get_plugin_class_arg -********************************************************************/ -be_local_closure(Matter_Device_get_plugin_class_arg, /* name */ - be_nested_proto( - 5, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 4]) { /* constants */ - /* K0 */ be_nested_str_weak(plugins_classes), - /* K1 */ be_nested_str_weak(find), - /* K2 */ be_nested_str_weak(ARG), - /* K3 */ be_nested_str_weak(), - }), - be_str_weak(get_plugin_class_arg), - &be_const_str_solidified, - ( &(const binstruction[ 9]) { /* code */ - 0x88080100, // 0000 GETMBR R2 R0 K0 - 0x8C080501, // 0001 GETMET R2 R2 K1 - 0x5C100200, // 0002 MOVE R4 R1 - 0x7C080400, // 0003 CALL R2 2 - 0x780A0001, // 0004 JMPF R2 #0007 - 0x880C0502, // 0005 GETMBR R3 R2 K2 - 0x70020000, // 0006 JMP #0008 - 0x580C0003, // 0007 LDCONST R3 K3 - 0x80040600, // 0008 RET 1 R3 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: start_commissioning_complete -********************************************************************/ -be_local_closure(Matter_Device_start_commissioning_complete, /* name */ - be_nested_proto( - 6, /* nstack */ - 2, /* argc */ 2, /* varg */ 0, /* has upvals */ NULL, /* no upvals */ @@ -316,474 +20,31 @@ be_local_closure(Matter_Device_start_commissioning_complete, /* name */ NULL, /* no sub protos */ 1, /* has constants */ ( &(const bvalue[ 5]) { /* constants */ - /* K0 */ be_nested_str_weak(tasmota), - /* K1 */ be_nested_str_weak(log), - /* K2 */ be_nested_str_weak(MTR_X3A_X20_X2A_X2A_X2A_X20Commissioning_X20complete_X20_X2A_X2A_X2A), - /* K3 */ be_const_int(2), - /* K4 */ be_nested_str_weak(stop_basic_commissioning), - }), - be_str_weak(start_commissioning_complete), - &be_const_str_solidified, - ( &(const binstruction[ 8]) { /* code */ - 0xB80A0000, // 0000 GETNGBL R2 K0 - 0x8C080501, // 0001 GETMET R2 R2 K1 - 0x58100002, // 0002 LDCONST R4 K2 - 0x58140003, // 0003 LDCONST R5 K3 - 0x7C080600, // 0004 CALL R2 3 - 0x8C080104, // 0005 GETMET R2 R0 K4 - 0x7C080200, // 0006 CALL R2 1 - 0x80000000, // 0007 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: register_commands -********************************************************************/ -be_local_closure(Matter_Device_register_commands, /* name */ - be_nested_proto( - 5, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 1, /* has sup protos */ - ( &(const struct bproto*[ 1]) { - be_nested_proto( - 10, /* nstack */ - 4, /* argc */ - 0, /* varg */ - 1, /* has upvals */ - ( &(const bupvaldesc[ 1]) { /* upvals */ - be_local_const_upval(1, 0), - }), - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 1]) { /* constants */ - /* K0 */ be_nested_str_weak(MtrJoin), - }), - be_str_weak(_X3Clambda_X3E), - &be_const_str_solidified, - ( &(const binstruction[ 8]) { /* code */ - 0x68100000, // 0000 GETUPV R4 U0 - 0x8C100900, // 0001 GETMET R4 R4 K0 - 0x5C180000, // 0002 MOVE R6 R0 - 0x5C1C0200, // 0003 MOVE R7 R1 - 0x5C200400, // 0004 MOVE R8 R2 - 0x5C240600, // 0005 MOVE R9 R3 - 0x7C100A00, // 0006 CALL R4 5 - 0x80040800, // 0007 RET 1 R4 - }) - ), - }), - 1, /* has constants */ - ( &(const bvalue[ 3]) { /* constants */ - /* K0 */ be_nested_str_weak(tasmota), - /* K1 */ be_nested_str_weak(add_cmd), - /* K2 */ be_nested_str_weak(MtrJoin), - }), - be_str_weak(register_commands), - &be_const_str_solidified, - ( &(const binstruction[ 7]) { /* code */ - 0xB8060000, // 0000 GETNGBL R1 K0 - 0x8C040301, // 0001 GETMET R1 R1 K1 - 0x580C0002, // 0002 LDCONST R3 K2 - 0x84100000, // 0003 CLOSURE R4 P0 - 0x7C040600, // 0004 CALL R1 3 - 0xA0000000, // 0005 CLOSE R0 - 0x80000000, // 0006 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: get_plugin_class_displayname -********************************************************************/ -be_local_closure(Matter_Device_get_plugin_class_displayname, /* name */ - be_nested_proto( - 5, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 4]) { /* constants */ - /* K0 */ be_nested_str_weak(plugins_classes), - /* K1 */ be_nested_str_weak(find), - /* K2 */ be_nested_str_weak(NAME), - /* K3 */ be_nested_str_weak(), - }), - be_str_weak(get_plugin_class_displayname), - &be_const_str_solidified, - ( &(const binstruction[ 9]) { /* code */ - 0x88080100, // 0000 GETMBR R2 R0 K0 - 0x8C080501, // 0001 GETMET R2 R2 K1 - 0x5C100200, // 0002 MOVE R4 R1 - 0x7C080400, // 0003 CALL R2 2 - 0x780A0001, // 0004 JMPF R2 #0007 - 0x880C0502, // 0005 GETMBR R3 R2 K2 - 0x70020000, // 0006 JMP #0008 - 0x580C0003, // 0007 LDCONST R3 K3 - 0x80040600, // 0008 RET 1 R3 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: start_operational_discovery_deferred -********************************************************************/ -be_local_closure(Matter_Device_start_operational_discovery_deferred, /* name */ - be_nested_proto( - 6, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 1, /* has sup protos */ - ( &(const struct bproto*[ 1]) { - be_nested_proto( - 3, /* nstack */ - 0, /* argc */ - 0, /* varg */ - 1, /* has upvals */ - ( &(const bupvaldesc[ 2]) { /* upvals */ - be_local_const_upval(1, 0), - be_local_const_upval(1, 1), - }), - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 1]) { /* constants */ - /* K0 */ be_nested_str_weak(start_operational_discovery), - }), - be_str_weak(_X3Clambda_X3E), - &be_const_str_solidified, - ( &(const binstruction[ 5]) { /* code */ - 0x68000000, // 0000 GETUPV R0 U0 - 0x8C000100, // 0001 GETMET R0 R0 K0 - 0x68080001, // 0002 GETUPV R2 U1 - 0x7C000400, // 0003 CALL R0 2 - 0x80040000, // 0004 RET 1 R0 - }) - ), - }), - 1, /* has constants */ - ( &(const bvalue[ 3]) { /* constants */ - /* K0 */ be_nested_str_weak(tasmota), - /* K1 */ be_nested_str_weak(set_timer), + /* K0 */ be_nested_str_weak(message_handler), + /* K1 */ be_nested_str_weak(every_250ms), /* K2 */ be_const_int(0), + /* K3 */ be_nested_str_weak(plugins), + /* K4 */ be_const_int(1), }), - be_str_weak(start_operational_discovery_deferred), + be_str_weak(every_250ms), &be_const_str_solidified, - ( &(const binstruction[ 7]) { /* code */ - 0xB80A0000, // 0000 GETNGBL R2 K0 - 0x8C080501, // 0001 GETMET R2 R2 K1 - 0x58100002, // 0002 LDCONST R4 K2 - 0x84140000, // 0003 CLOSURE R5 P0 - 0x7C080600, // 0004 CALL R2 3 - 0xA0000000, // 0005 CLOSE R0 - 0x80000000, // 0006 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: every_50ms -********************************************************************/ -be_local_closure(Matter_Device_every_50ms, /* name */ - be_nested_proto( - 2, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 2]) { /* constants */ - /* K0 */ be_nested_str_weak(tick), - /* K1 */ be_const_int(1), - }), - be_str_weak(every_50ms), - &be_const_str_solidified, - ( &(const binstruction[ 4]) { /* code */ - 0x88040100, // 0000 GETMBR R1 R0 K0 - 0x00040301, // 0001 ADD R1 R1 K1 - 0x90020001, // 0002 SETMBR R0 K0 R1 - 0x80000000, // 0003 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: compute_qrcode_content -********************************************************************/ -be_local_closure(Matter_Device_compute_qrcode_content, /* name */ - be_nested_proto( - 8, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[12]) { /* constants */ - /* K0 */ be_nested_str_weak(resize), - /* K1 */ be_nested_str_weak(setbits), - /* K2 */ be_const_int(3), - /* K3 */ be_nested_str_weak(vendorid), - /* K4 */ be_nested_str_weak(productid), - /* K5 */ be_nested_str_weak(root_discriminator), - /* K6 */ be_nested_str_weak(root_passcode), - /* K7 */ be_const_int(134217727), - /* K8 */ be_nested_str_weak(MT_X3A), - /* K9 */ be_nested_str_weak(matter), - /* K10 */ be_nested_str_weak(Base38), - /* K11 */ be_nested_str_weak(encode), - }), - be_str_weak(compute_qrcode_content), - &be_const_str_solidified, - ( &(const binstruction[40]) { /* code */ - 0x60040015, // 0000 GETGBL R1 G21 - 0x7C040000, // 0001 CALL R1 0 - 0x8C040300, // 0002 GETMET R1 R1 K0 - 0x540E000A, // 0003 LDINT R3 11 - 0x7C040400, // 0004 CALL R1 2 - 0x8C080301, // 0005 GETMET R2 R1 K1 - 0x58100002, // 0006 LDCONST R4 K2 - 0x5416000F, // 0007 LDINT R5 16 - 0x88180103, // 0008 GETMBR R6 R0 K3 - 0x7C080800, // 0009 CALL R2 4 - 0x8C080301, // 000A GETMET R2 R1 K1 - 0x54120012, // 000B LDINT R4 19 - 0x5416000F, // 000C LDINT R5 16 - 0x88180104, // 000D GETMBR R6 R0 K4 - 0x7C080800, // 000E CALL R2 4 - 0x8C080301, // 000F GETMET R2 R1 K1 - 0x54120024, // 0010 LDINT R4 37 - 0x54160007, // 0011 LDINT R5 8 - 0x541A0003, // 0012 LDINT R6 4 - 0x7C080800, // 0013 CALL R2 4 - 0x8C080301, // 0014 GETMET R2 R1 K1 - 0x5412002C, // 0015 LDINT R4 45 - 0x5416000B, // 0016 LDINT R5 12 - 0x88180105, // 0017 GETMBR R6 R0 K5 - 0x541E0FFE, // 0018 LDINT R7 4095 - 0x2C180C07, // 0019 AND R6 R6 R7 - 0x7C080800, // 001A CALL R2 4 - 0x8C080301, // 001B GETMET R2 R1 K1 - 0x54120038, // 001C LDINT R4 57 - 0x5416001A, // 001D LDINT R5 27 - 0x88180106, // 001E GETMBR R6 R0 K6 - 0x2C180D07, // 001F AND R6 R6 K7 - 0x7C080800, // 0020 CALL R2 4 - 0xB80A1200, // 0021 GETNGBL R2 K9 - 0x8808050A, // 0022 GETMBR R2 R2 K10 - 0x8C08050B, // 0023 GETMET R2 R2 K11 - 0x5C100200, // 0024 MOVE R4 R1 - 0x7C080400, // 0025 CALL R2 2 - 0x000A1002, // 0026 ADD R2 K8 R2 - 0x80040400, // 0027 RET 1 R2 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: _start_udp -********************************************************************/ -be_local_closure(Matter_Device__start_udp, /* name */ - be_nested_proto( - 6, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 1, /* has sup protos */ - ( &(const struct bproto*[ 1]) { - be_nested_proto( - 8, /* nstack */ - 3, /* argc */ - 0, /* varg */ - 1, /* has upvals */ - ( &(const bupvaldesc[ 1]) { /* upvals */ - be_local_const_upval(1, 0), - }), - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 1]) { /* constants */ - /* K0 */ be_nested_str_weak(msg_received), - }), - be_str_weak(_X3Clambda_X3E), - &be_const_str_solidified, - ( &(const binstruction[ 7]) { /* code */ - 0x680C0000, // 0000 GETUPV R3 U0 - 0x8C0C0700, // 0001 GETMET R3 R3 K0 - 0x5C140000, // 0002 MOVE R5 R0 - 0x5C180200, // 0003 MOVE R6 R1 - 0x5C1C0400, // 0004 MOVE R7 R2 - 0x7C0C0800, // 0005 CALL R3 4 - 0x80040600, // 0006 RET 1 R3 - }) - ), - }), - 1, /* has constants */ - ( &(const bvalue[ 9]) { /* constants */ - /* K0 */ be_nested_str_weak(udp_server), - /* K1 */ be_nested_str_weak(tasmota), - /* K2 */ be_nested_str_weak(log), - /* K3 */ be_nested_str_weak(MTR_X3A_X20starting_X20UDP_X20server_X20on_X20port_X3A_X20), - /* K4 */ be_const_int(2), - /* K5 */ be_nested_str_weak(matter), - /* K6 */ be_nested_str_weak(UDPServer), - /* K7 */ be_nested_str_weak(), - /* K8 */ be_nested_str_weak(start), - }), - be_str_weak(_start_udp), - &be_const_str_solidified, - ( &(const binstruction[27]) { /* code */ - 0x88080100, // 0000 GETMBR R2 R0 K0 - 0x780A0000, // 0001 JMPF R2 #0003 - 0x80000400, // 0002 RET 0 - 0x4C080000, // 0003 LDNIL R2 - 0x1C080202, // 0004 EQ R2 R1 R2 - 0x780A0000, // 0005 JMPF R2 #0007 - 0x540615A3, // 0006 LDINT R1 5540 - 0xB80A0200, // 0007 GETNGBL R2 K1 - 0x8C080502, // 0008 GETMET R2 R2 K2 - 0x60100008, // 0009 GETGBL R4 G8 - 0x5C140200, // 000A MOVE R5 R1 - 0x7C100200, // 000B CALL R4 1 - 0x00120604, // 000C ADD R4 K3 R4 - 0x58140004, // 000D LDCONST R5 K4 - 0x7C080600, // 000E CALL R2 3 - 0xB80A0A00, // 000F GETNGBL R2 K5 - 0x8C080506, // 0010 GETMET R2 R2 K6 - 0x58100007, // 0011 LDCONST R4 K7 - 0x5C140200, // 0012 MOVE R5 R1 - 0x7C080600, // 0013 CALL R2 3 - 0x90020002, // 0014 SETMBR R0 K0 R2 - 0x88080100, // 0015 GETMBR R2 R0 K0 - 0x8C080508, // 0016 GETMET R2 R2 K8 - 0x84100000, // 0017 CLOSURE R4 P0 - 0x7C080400, // 0018 CALL R2 2 - 0xA0000000, // 0019 CLOSE R0 - 0x80000000, // 001A RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: _init_basic_commissioning -********************************************************************/ -be_local_closure(Matter_Device__init_basic_commissioning, /* name */ - be_nested_proto( - 3, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 4]) { /* constants */ - /* K0 */ be_nested_str_weak(sessions), - /* K1 */ be_nested_str_weak(count_active_fabrics), - /* K2 */ be_const_int(0), - /* K3 */ be_nested_str_weak(start_root_basic_commissioning), - }), - be_str_weak(_init_basic_commissioning), - &be_const_str_solidified, - ( &(const binstruction[ 8]) { /* code */ + ( &(const binstruction[16]) { /* code */ 0x88040100, // 0000 GETMBR R1 R0 K0 0x8C040301, // 0001 GETMET R1 R1 K1 0x7C040200, // 0002 CALL R1 1 - 0x1C040302, // 0003 EQ R1 R1 K2 - 0x78060001, // 0004 JMPF R1 #0007 - 0x8C040103, // 0005 GETMET R1 R0 K3 - 0x7C040200, // 0006 CALL R1 1 - 0x80000000, // 0007 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: compute_manual_pairing_code -********************************************************************/ -be_local_closure(Matter_Device_compute_manual_pairing_code, /* name */ - be_nested_proto( - 11, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 8]) { /* constants */ - /* K0 */ be_nested_str_weak(string), - /* K1 */ be_nested_str_weak(root_discriminator), - /* K2 */ be_nested_str_weak(root_passcode), - /* K3 */ be_nested_str_weak(format), - /* K4 */ be_nested_str_weak(_X251i_X2505i_X2504i), - /* K5 */ be_nested_str_weak(matter), - /* K6 */ be_nested_str_weak(Verhoeff), - /* K7 */ be_nested_str_weak(checksum), - }), - be_str_weak(compute_manual_pairing_code), - &be_const_str_solidified, - ( &(const binstruction[31]) { /* code */ - 0xA4060000, // 0000 IMPORT R1 K0 - 0x88080101, // 0001 GETMBR R2 R0 K1 - 0x540E0FFE, // 0002 LDINT R3 4095 - 0x2C080403, // 0003 AND R2 R2 R3 - 0x540E0009, // 0004 LDINT R3 10 - 0x3C080403, // 0005 SHR R2 R2 R3 - 0x880C0101, // 0006 GETMBR R3 R0 K1 - 0x541202FF, // 0007 LDINT R4 768 - 0x2C0C0604, // 0008 AND R3 R3 R4 - 0x54120005, // 0009 LDINT R4 6 - 0x380C0604, // 000A SHL R3 R3 R4 - 0x88100102, // 000B GETMBR R4 R0 K2 - 0x54163FFE, // 000C LDINT R5 16383 - 0x2C100805, // 000D AND R4 R4 R5 - 0x300C0604, // 000E OR R3 R3 R4 - 0x88100102, // 000F GETMBR R4 R0 K2 - 0x5416000D, // 0010 LDINT R5 14 - 0x3C100805, // 0011 SHR R4 R4 R5 - 0x8C140303, // 0012 GETMET R5 R1 K3 - 0x581C0004, // 0013 LDCONST R7 K4 - 0x5C200400, // 0014 MOVE R8 R2 - 0x5C240600, // 0015 MOVE R9 R3 - 0x5C280800, // 0016 MOVE R10 R4 - 0x7C140A00, // 0017 CALL R5 5 - 0xB81A0A00, // 0018 GETNGBL R6 K5 - 0x88180D06, // 0019 GETMBR R6 R6 K6 - 0x8C180D07, // 001A GETMET R6 R6 K7 - 0x5C200A00, // 001B MOVE R8 R5 - 0x7C180400, // 001C CALL R6 2 - 0x00140A06, // 001D ADD R5 R5 R6 - 0x80040A00, // 001E RET 1 R5 + 0x58040002, // 0003 LDCONST R1 K2 + 0x6008000C, // 0004 GETGBL R2 G12 + 0x880C0103, // 0005 GETMBR R3 R0 K3 + 0x7C080200, // 0006 CALL R2 1 + 0x14080202, // 0007 LT R2 R1 R2 + 0x780A0005, // 0008 JMPF R2 #000F + 0x88080103, // 0009 GETMBR R2 R0 K3 + 0x94080401, // 000A GETIDX R2 R2 R1 + 0x8C080501, // 000B GETMET R2 R2 K1 + 0x7C080200, // 000C CALL R2 1 + 0x00040304, // 000D ADD R1 R1 K4 + 0x7001FFF4, // 000E JMP #0004 + 0x80000000, // 000F RET 0 }) ) ); @@ -862,6 +123,238 @@ be_local_closure(Matter_Device__trigger_read_sensors, /* name */ /*******************************************************************/ +/******************************************************************** +** Solidified function: every_50ms +********************************************************************/ +be_local_closure(Matter_Device_every_50ms, /* name */ + be_nested_proto( + 2, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 2]) { /* constants */ + /* K0 */ be_nested_str_weak(tick), + /* K1 */ be_const_int(1), + }), + be_str_weak(every_50ms), + &be_const_str_solidified, + ( &(const binstruction[ 4]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x00040301, // 0001 ADD R1 R1 K1 + 0x90020001, // 0002 SETMBR R0 K0 R1 + 0x80000000, // 0003 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: start +********************************************************************/ +be_local_closure(Matter_Device_start, /* name */ + be_nested_proto( + 6, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 1, /* has sup protos */ + ( &(const struct bproto*[ 1]) { + be_nested_proto( + 2, /* nstack */ + 0, /* argc */ + 0, /* varg */ + 1, /* has upvals */ + ( &(const bupvaldesc[ 1]) { /* upvals */ + be_local_const_upval(1, 0), + }), + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 1]) { /* constants */ + /* K0 */ be_nested_str_weak(_trigger_read_sensors), + }), + be_str_weak(_anonymous_), + &be_const_str_solidified, + ( &(const binstruction[ 4]) { /* code */ + 0x68000000, // 0000 GETUPV R0 U0 + 0x8C000100, // 0001 GETMET R0 R0 K0 + 0x7C000200, // 0002 CALL R0 1 + 0x80000000, // 0003 RET 0 + }) + ), + }), + 1, /* has constants */ + ( &(const bvalue[ 9]) { /* constants */ + /* K0 */ be_nested_str_weak(started), + /* K1 */ be_nested_str_weak(autoconf_device), + /* K2 */ be_nested_str_weak(tasmota), + /* K3 */ be_nested_str_weak(add_cron), + /* K4 */ be_nested_str_weak(_X2A_X2F30_X20_X2A_X20_X2A_X20_X2A_X20_X2A_X20_X2A), + /* K5 */ be_nested_str_weak(matter_sensors_30s), + /* K6 */ be_nested_str_weak(_start_udp), + /* K7 */ be_nested_str_weak(UDP_PORT), + /* K8 */ be_nested_str_weak(start_mdns_announce_hostnames), + }), + be_str_weak(start), + &be_const_str_solidified, + ( &(const binstruction[20]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x78060000, // 0001 JMPF R1 #0003 + 0x80000200, // 0002 RET 0 + 0x8C040101, // 0003 GETMET R1 R0 K1 + 0x7C040200, // 0004 CALL R1 1 + 0xB8060400, // 0005 GETNGBL R1 K2 + 0x8C040303, // 0006 GETMET R1 R1 K3 + 0x580C0004, // 0007 LDCONST R3 K4 + 0x84100000, // 0008 CLOSURE R4 P0 + 0x58140005, // 0009 LDCONST R5 K5 + 0x7C040800, // 000A CALL R1 4 + 0x8C040106, // 000B GETMET R1 R0 K6 + 0x880C0107, // 000C GETMBR R3 R0 K7 + 0x7C040400, // 000D CALL R1 2 + 0x8C040108, // 000E GETMET R1 R0 K8 + 0x7C040200, // 000F CALL R1 1 + 0x50040200, // 0010 LDBOOL R1 1 0 + 0x90020001, // 0011 SETMBR R0 K0 R1 + 0xA0000000, // 0012 CLOSE R0 + 0x80000000, // 0013 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: compute_manual_pairing_code +********************************************************************/ +be_local_closure(Matter_Device_compute_manual_pairing_code, /* name */ + be_nested_proto( + 11, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 8]) { /* constants */ + /* K0 */ be_nested_str_weak(string), + /* K1 */ be_nested_str_weak(root_discriminator), + /* K2 */ be_nested_str_weak(root_passcode), + /* K3 */ be_nested_str_weak(format), + /* K4 */ be_nested_str_weak(_X251i_X2505i_X2504i), + /* K5 */ be_nested_str_weak(matter), + /* K6 */ be_nested_str_weak(Verhoeff), + /* K7 */ be_nested_str_weak(checksum), + }), + be_str_weak(compute_manual_pairing_code), + &be_const_str_solidified, + ( &(const binstruction[31]) { /* code */ + 0xA4060000, // 0000 IMPORT R1 K0 + 0x88080101, // 0001 GETMBR R2 R0 K1 + 0x540E0FFE, // 0002 LDINT R3 4095 + 0x2C080403, // 0003 AND R2 R2 R3 + 0x540E0009, // 0004 LDINT R3 10 + 0x3C080403, // 0005 SHR R2 R2 R3 + 0x880C0101, // 0006 GETMBR R3 R0 K1 + 0x541202FF, // 0007 LDINT R4 768 + 0x2C0C0604, // 0008 AND R3 R3 R4 + 0x54120005, // 0009 LDINT R4 6 + 0x380C0604, // 000A SHL R3 R3 R4 + 0x88100102, // 000B GETMBR R4 R0 K2 + 0x54163FFE, // 000C LDINT R5 16383 + 0x2C100805, // 000D AND R4 R4 R5 + 0x300C0604, // 000E OR R3 R3 R4 + 0x88100102, // 000F GETMBR R4 R0 K2 + 0x5416000D, // 0010 LDINT R5 14 + 0x3C100805, // 0011 SHR R4 R4 R5 + 0x8C140303, // 0012 GETMET R5 R1 K3 + 0x581C0004, // 0013 LDCONST R7 K4 + 0x5C200400, // 0014 MOVE R8 R2 + 0x5C240600, // 0015 MOVE R9 R3 + 0x5C280800, // 0016 MOVE R10 R4 + 0x7C140A00, // 0017 CALL R5 5 + 0xB81A0A00, // 0018 GETNGBL R6 K5 + 0x88180D06, // 0019 GETMBR R6 R6 K6 + 0x8C180D07, // 001A GETMET R6 R6 K7 + 0x5C200A00, // 001B MOVE R8 R5 + 0x7C180400, // 001C CALL R6 2 + 0x00140A06, // 001D ADD R5 R5 R6 + 0x80040A00, // 001E RET 1 R5 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: register_commands +********************************************************************/ +be_local_closure(Matter_Device_register_commands, /* name */ + be_nested_proto( + 5, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 1, /* has sup protos */ + ( &(const struct bproto*[ 1]) { + be_nested_proto( + 10, /* nstack */ + 4, /* argc */ + 0, /* varg */ + 1, /* has upvals */ + ( &(const bupvaldesc[ 1]) { /* upvals */ + be_local_const_upval(1, 0), + }), + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 1]) { /* constants */ + /* K0 */ be_nested_str_weak(MtrJoin), + }), + be_str_weak(_X3Clambda_X3E), + &be_const_str_solidified, + ( &(const binstruction[ 8]) { /* code */ + 0x68100000, // 0000 GETUPV R4 U0 + 0x8C100900, // 0001 GETMET R4 R4 K0 + 0x5C180000, // 0002 MOVE R6 R0 + 0x5C1C0200, // 0003 MOVE R7 R1 + 0x5C200400, // 0004 MOVE R8 R2 + 0x5C240600, // 0005 MOVE R9 R3 + 0x7C100A00, // 0006 CALL R4 5 + 0x80040800, // 0007 RET 1 R4 + }) + ), + }), + 1, /* has constants */ + ( &(const bvalue[ 3]) { /* constants */ + /* K0 */ be_nested_str_weak(tasmota), + /* K1 */ be_nested_str_weak(add_cmd), + /* K2 */ be_nested_str_weak(MtrJoin), + }), + be_str_weak(register_commands), + &be_const_str_solidified, + ( &(const binstruction[ 7]) { /* code */ + 0xB8060000, // 0000 GETNGBL R1 K0 + 0x8C040301, // 0001 GETMET R1 R1 K1 + 0x580C0002, // 0002 LDCONST R3 K2 + 0x84100000, // 0003 CLOSURE R4 P0 + 0x7C040600, // 0004 CALL R1 3 + 0xA0000000, // 0005 CLOSE R0 + 0x80000000, // 0006 RET 0 + }) + ) +); +/*******************************************************************/ + + /******************************************************************** ** Solidified function: k2l ********************************************************************/ @@ -943,11 +436,11 @@ be_local_closure(Matter_Device_k2l, /* name */ /******************************************************************** -** Solidified function: mdns_announce_op_discovery_all_fabrics +** Solidified function: is_commissioning_open ********************************************************************/ -be_local_closure(Matter_Device_mdns_announce_op_discovery_all_fabrics, /* name */ +be_local_closure(Matter_Device_is_commissioning_open, /* name */ be_nested_proto( - 6, /* nstack */ + 3, /* nstack */ 1, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -955,39 +448,16 @@ be_local_closure(Matter_Device_mdns_announce_op_discovery_all_fabrics, /* name 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[ 6]) { /* constants */ - /* K0 */ be_nested_str_weak(sessions), - /* K1 */ be_nested_str_weak(active_fabrics), - /* K2 */ be_nested_str_weak(get_device_id), - /* K3 */ be_nested_str_weak(get_fabric_id), - /* K4 */ be_nested_str_weak(mdns_announce_op_discovery), - /* K5 */ be_nested_str_weak(stop_iteration), + ( &(const bvalue[ 1]) { /* constants */ + /* K0 */ be_nested_str_weak(commissioning_open), }), - be_str_weak(mdns_announce_op_discovery_all_fabrics), + be_str_weak(is_commissioning_open), &be_const_str_solidified, - ( &(const binstruction[22]) { /* code */ - 0x60040010, // 0000 GETGBL R1 G16 - 0x88080100, // 0001 GETMBR R2 R0 K0 - 0x8C080501, // 0002 GETMET R2 R2 K1 - 0x7C080200, // 0003 CALL R2 1 - 0x7C040200, // 0004 CALL R1 1 - 0xA802000B, // 0005 EXBLK 0 #0012 - 0x5C080200, // 0006 MOVE R2 R1 - 0x7C080000, // 0007 CALL R2 0 - 0x8C0C0502, // 0008 GETMET R3 R2 K2 - 0x7C0C0200, // 0009 CALL R3 1 - 0x780E0005, // 000A JMPF R3 #0011 - 0x8C0C0503, // 000B GETMET R3 R2 K3 - 0x7C0C0200, // 000C CALL R3 1 - 0x780E0002, // 000D JMPF R3 #0011 - 0x8C0C0104, // 000E GETMET R3 R0 K4 - 0x5C140400, // 000F MOVE R5 R2 - 0x7C0C0400, // 0010 CALL R3 2 - 0x7001FFF3, // 0011 JMP #0006 - 0x58040005, // 0012 LDCONST R1 K5 - 0xAC040200, // 0013 CATCH R1 1 0 - 0xB0080000, // 0014 RAISE 2 R0 R0 - 0x80000000, // 0015 RET 0 + ( &(const binstruction[ 4]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x4C080000, // 0001 LDNIL R2 + 0x20040202, // 0002 NE R1 R1 R2 + 0x80040200, // 0003 RET 1 R1 }) ) ); @@ -995,11 +465,11 @@ be_local_closure(Matter_Device_mdns_announce_op_discovery_all_fabrics, /* name /******************************************************************** -** Solidified function: _mdns_announce_hostname +** Solidified function: register_plugin_class ********************************************************************/ -be_local_closure(Matter_Device__mdns_announce_hostname, /* name */ +be_local_closure(Matter_Device_register_plugin_class, /* name */ be_nested_proto( - 16, /* nstack */ + 7, /* nstack */ 2, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -1007,424 +477,24 @@ be_local_closure(Matter_Device__mdns_announce_hostname, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[28]) { /* constants */ - /* K0 */ be_nested_str_weak(mdns), - /* K1 */ be_nested_str_weak(string), - /* K2 */ be_nested_str_weak(start), - /* K3 */ be_nested_str_weak(tasmota), - /* K4 */ be_nested_str_weak(eth), - /* K5 */ be_nested_str_weak(hostname_eth), - /* K6 */ be_nested_str_weak(replace), - /* K7 */ be_nested_str_weak(find), - /* K8 */ be_nested_str_weak(mac), - /* K9 */ be_nested_str_weak(_X3A), - /* K10 */ be_nested_str_weak(), - /* K11 */ be_nested_str_weak(ipv4only), - /* K12 */ be_nested_str_weak(log), - /* K13 */ be_nested_str_weak(format), - /* K14 */ be_nested_str_weak(MTR_X3A_X20calling_X20mdns_X2Eadd_hostname_X28_X25s_X2C_X20_X25s_X2C_X20_X25s_X29), - /* K15 */ be_nested_str_weak(ip6local), - /* K16 */ be_nested_str_weak(ip), - /* K17 */ be_const_int(3), - /* K18 */ be_nested_str_weak(add_hostname), - /* K19 */ be_nested_str_weak(ip6), - /* K20 */ be_nested_str_weak(MTR_X3A_X20calling_X20mdns_X2Eadd_hostname_X28_X25s_X2C_X20_X25s_X29), - /* K21 */ be_nested_str_weak(wifi), - /* K22 */ be_nested_str_weak(hostname_wifi), - /* K23 */ be_nested_str_weak(MTR_X3A_X20start_X20mDNS_X20on_X20_X25s_X20host_X20_X27_X25s_X2Elocal_X27), - /* K24 */ be_const_int(2), - /* K25 */ be_nested_str_weak(MTR_X3A_X20Exception), - /* K26 */ be_nested_str_weak(_X7C), - /* K27 */ be_nested_str_weak(mdns_announce_op_discovery_all_fabrics), + ( &(const bvalue[ 4]) { /* constants */ + /* K0 */ be_nested_str_weak(introspect), + /* K1 */ be_nested_str_weak(get), + /* K2 */ be_nested_str_weak(TYPE), + /* K3 */ be_nested_str_weak(plugins_classes), }), - be_str_weak(_mdns_announce_hostname), + be_str_weak(register_plugin_class), &be_const_str_solidified, - ( &(const binstruction[172]) { /* code */ + ( &(const binstruction[ 9]) { /* code */ 0xA40A0000, // 0000 IMPORT R2 K0 - 0xA40E0200, // 0001 IMPORT R3 K1 - 0x8C100502, // 0002 GETMET R4 R2 K2 - 0x7C100200, // 0003 CALL R4 1 - 0xA8020092, // 0004 EXBLK 0 #0098 - 0x78060040, // 0005 JMPF R1 #0047 - 0xB8120600, // 0006 GETNGBL R4 K3 - 0x8C100904, // 0007 GETMET R4 R4 K4 - 0x7C100200, // 0008 CALL R4 1 - 0x8C140706, // 0009 GETMET R5 R3 K6 - 0x8C1C0907, // 000A GETMET R7 R4 K7 - 0x58240008, // 000B LDCONST R9 K8 - 0x7C1C0400, // 000C CALL R7 2 - 0x58200009, // 000D LDCONST R8 K9 - 0x5824000A, // 000E LDCONST R9 K10 - 0x7C140800, // 000F CALL R5 4 - 0x90020A05, // 0010 SETMBR R0 K5 R5 - 0x8814010B, // 0011 GETMBR R5 R0 K11 - 0x7416001F, // 0012 JMPT R5 #0033 - 0xB8160600, // 0013 GETNGBL R5 K3 - 0x8C140B0C, // 0014 GETMET R5 R5 K12 - 0x8C1C070D, // 0015 GETMET R7 R3 K13 - 0x5824000E, // 0016 LDCONST R9 K14 - 0x88280105, // 0017 GETMBR R10 R0 K5 - 0x8C2C0907, // 0018 GETMET R11 R4 K7 - 0x5834000F, // 0019 LDCONST R13 K15 - 0x5838000A, // 001A LDCONST R14 K10 - 0x7C2C0600, // 001B CALL R11 3 - 0x8C300907, // 001C GETMET R12 R4 K7 - 0x58380010, // 001D LDCONST R14 K16 - 0x583C000A, // 001E LDCONST R15 K10 - 0x7C300600, // 001F CALL R12 3 - 0x7C1C0A00, // 0020 CALL R7 5 - 0x58200011, // 0021 LDCONST R8 K17 - 0x7C140600, // 0022 CALL R5 3 - 0x8C140512, // 0023 GETMET R5 R2 K18 - 0x881C0105, // 0024 GETMBR R7 R0 K5 - 0x8C200907, // 0025 GETMET R8 R4 K7 - 0x5828000F, // 0026 LDCONST R10 K15 - 0x582C000A, // 0027 LDCONST R11 K10 - 0x7C200600, // 0028 CALL R8 3 - 0x8C240907, // 0029 GETMET R9 R4 K7 - 0x582C0010, // 002A LDCONST R11 K16 - 0x5830000A, // 002B LDCONST R12 K10 - 0x7C240600, // 002C CALL R9 3 - 0x8C280907, // 002D GETMET R10 R4 K7 - 0x58300013, // 002E LDCONST R12 K19 - 0x5834000A, // 002F LDCONST R13 K10 - 0x7C280600, // 0030 CALL R10 3 - 0x7C140A00, // 0031 CALL R5 5 - 0x70020012, // 0032 JMP #0046 - 0xB8160600, // 0033 GETNGBL R5 K3 - 0x8C140B0C, // 0034 GETMET R5 R5 K12 - 0x8C1C070D, // 0035 GETMET R7 R3 K13 - 0x58240014, // 0036 LDCONST R9 K20 - 0x88280105, // 0037 GETMBR R10 R0 K5 - 0x8C2C0907, // 0038 GETMET R11 R4 K7 - 0x58340010, // 0039 LDCONST R13 K16 - 0x5838000A, // 003A LDCONST R14 K10 - 0x7C2C0600, // 003B CALL R11 3 - 0x7C1C0800, // 003C CALL R7 4 - 0x58200011, // 003D LDCONST R8 K17 - 0x7C140600, // 003E CALL R5 3 - 0x8C140512, // 003F GETMET R5 R2 K18 - 0x881C0105, // 0040 GETMBR R7 R0 K5 - 0x8C200907, // 0041 GETMET R8 R4 K7 - 0x58280010, // 0042 LDCONST R10 K16 - 0x582C000A, // 0043 LDCONST R11 K10 - 0x7C200600, // 0044 CALL R8 3 - 0x7C140600, // 0045 CALL R5 3 - 0x7002003F, // 0046 JMP #0087 - 0xB8120600, // 0047 GETNGBL R4 K3 - 0x8C100915, // 0048 GETMET R4 R4 K21 - 0x7C100200, // 0049 CALL R4 1 - 0x8C140706, // 004A GETMET R5 R3 K6 - 0x8C1C0907, // 004B GETMET R7 R4 K7 - 0x58240008, // 004C LDCONST R9 K8 - 0x7C1C0400, // 004D CALL R7 2 - 0x58200009, // 004E LDCONST R8 K9 - 0x5824000A, // 004F LDCONST R9 K10 - 0x7C140800, // 0050 CALL R5 4 - 0x90022C05, // 0051 SETMBR R0 K22 R5 - 0x8814010B, // 0052 GETMBR R5 R0 K11 - 0x7416001F, // 0053 JMPT R5 #0074 - 0xB8160600, // 0054 GETNGBL R5 K3 - 0x8C140B0C, // 0055 GETMET R5 R5 K12 - 0x8C1C070D, // 0056 GETMET R7 R3 K13 - 0x5824000E, // 0057 LDCONST R9 K14 - 0x88280116, // 0058 GETMBR R10 R0 K22 - 0x8C2C0907, // 0059 GETMET R11 R4 K7 - 0x5834000F, // 005A LDCONST R13 K15 - 0x5838000A, // 005B LDCONST R14 K10 - 0x7C2C0600, // 005C CALL R11 3 - 0x8C300907, // 005D GETMET R12 R4 K7 - 0x58380010, // 005E LDCONST R14 K16 - 0x583C000A, // 005F LDCONST R15 K10 - 0x7C300600, // 0060 CALL R12 3 - 0x7C1C0A00, // 0061 CALL R7 5 - 0x58200011, // 0062 LDCONST R8 K17 - 0x7C140600, // 0063 CALL R5 3 - 0x8C140512, // 0064 GETMET R5 R2 K18 - 0x881C0116, // 0065 GETMBR R7 R0 K22 - 0x8C200907, // 0066 GETMET R8 R4 K7 - 0x5828000F, // 0067 LDCONST R10 K15 - 0x582C000A, // 0068 LDCONST R11 K10 - 0x7C200600, // 0069 CALL R8 3 - 0x8C240907, // 006A GETMET R9 R4 K7 - 0x582C0010, // 006B LDCONST R11 K16 - 0x5830000A, // 006C LDCONST R12 K10 - 0x7C240600, // 006D CALL R9 3 - 0x8C280907, // 006E GETMET R10 R4 K7 - 0x58300013, // 006F LDCONST R12 K19 - 0x5834000A, // 0070 LDCONST R13 K10 - 0x7C280600, // 0071 CALL R10 3 - 0x7C140A00, // 0072 CALL R5 5 - 0x70020012, // 0073 JMP #0087 - 0xB8160600, // 0074 GETNGBL R5 K3 - 0x8C140B0C, // 0075 GETMET R5 R5 K12 - 0x8C1C070D, // 0076 GETMET R7 R3 K13 - 0x58240014, // 0077 LDCONST R9 K20 - 0x88280105, // 0078 GETMBR R10 R0 K5 - 0x8C2C0907, // 0079 GETMET R11 R4 K7 - 0x58340010, // 007A LDCONST R13 K16 - 0x5838000A, // 007B LDCONST R14 K10 - 0x7C2C0600, // 007C CALL R11 3 - 0x7C1C0800, // 007D CALL R7 4 - 0x58200011, // 007E LDCONST R8 K17 - 0x7C140600, // 007F CALL R5 3 - 0x8C140512, // 0080 GETMET R5 R2 K18 - 0x881C0116, // 0081 GETMBR R7 R0 K22 - 0x8C200907, // 0082 GETMET R8 R4 K7 - 0x58280010, // 0083 LDCONST R10 K16 - 0x582C000A, // 0084 LDCONST R11 K10 - 0x7C200600, // 0085 CALL R8 3 - 0x7C140600, // 0086 CALL R5 3 - 0xB8120600, // 0087 GETNGBL R4 K3 - 0x8C10090C, // 0088 GETMET R4 R4 K12 - 0x8C18070D, // 0089 GETMET R6 R3 K13 - 0x58200017, // 008A LDCONST R8 K23 - 0x78060001, // 008B JMPF R1 #008E - 0x58240004, // 008C LDCONST R9 K4 - 0x70020000, // 008D JMP #008F - 0x58240015, // 008E LDCONST R9 K21 - 0x78060001, // 008F JMPF R1 #0092 - 0x88280105, // 0090 GETMBR R10 R0 K5 - 0x70020000, // 0091 JMP #0093 - 0x88280116, // 0092 GETMBR R10 R0 K22 - 0x7C180800, // 0093 CALL R6 4 - 0x581C0018, // 0094 LDCONST R7 K24 - 0x7C100600, // 0095 CALL R4 3 - 0xA8040001, // 0096 EXBLK 1 1 - 0x70020010, // 0097 JMP #00A9 - 0xAC100002, // 0098 CATCH R4 0 2 - 0x7002000D, // 0099 JMP #00A8 - 0xB81A0600, // 009A GETNGBL R6 K3 - 0x8C180D0C, // 009B GETMET R6 R6 K12 - 0x60200008, // 009C GETGBL R8 G8 - 0x5C240800, // 009D MOVE R9 R4 - 0x7C200200, // 009E CALL R8 1 - 0x00223208, // 009F ADD R8 K25 R8 - 0x0020111A, // 00A0 ADD R8 R8 K26 - 0x60240008, // 00A1 GETGBL R9 G8 - 0x5C280A00, // 00A2 MOVE R10 R5 - 0x7C240200, // 00A3 CALL R9 1 - 0x00201009, // 00A4 ADD R8 R8 R9 - 0x58240018, // 00A5 LDCONST R9 K24 - 0x7C180600, // 00A6 CALL R6 3 - 0x70020000, // 00A7 JMP #00A9 - 0xB0080000, // 00A8 RAISE 2 R0 R0 - 0x8C10011B, // 00A9 GETMET R4 R0 K27 - 0x7C100200, // 00AA CALL R4 1 - 0x80000000, // 00AB RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: msg_received -********************************************************************/ -be_local_closure(Matter_Device_msg_received, /* name */ - be_nested_proto( - 9, /* nstack */ - 4, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 2]) { /* constants */ - /* K0 */ be_nested_str_weak(message_handler), - /* K1 */ be_nested_str_weak(msg_received), - }), - be_str_weak(msg_received), - &be_const_str_solidified, - ( &(const binstruction[ 7]) { /* code */ - 0x88100100, // 0000 GETMBR R4 R0 K0 - 0x8C100901, // 0001 GETMET R4 R4 K1 - 0x5C180200, // 0002 MOVE R6 R1 - 0x5C1C0400, // 0003 MOVE R7 R2 - 0x5C200600, // 0004 MOVE R8 R3 - 0x7C100800, // 0005 CALL R4 4 - 0x80040800, // 0006 RET 1 R4 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: attribute_updated -********************************************************************/ -be_local_closure(Matter_Device_attribute_updated, /* name */ - be_nested_proto( - 10, /* nstack */ - 5, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 9]) { /* constants */ - /* K0 */ be_nested_str_weak(matter), - /* K1 */ be_nested_str_weak(Path), - /* K2 */ be_nested_str_weak(endpoint), - /* K3 */ be_nested_str_weak(cluster), - /* K4 */ be_nested_str_weak(attribute), - /* K5 */ be_nested_str_weak(message_handler), - /* K6 */ be_nested_str_weak(im), - /* K7 */ be_nested_str_weak(subs_shop), - /* K8 */ be_nested_str_weak(attribute_updated_ctx), - }), - be_str_weak(attribute_updated), - &be_const_str_solidified, - ( &(const binstruction[18]) { /* code */ - 0x4C140000, // 0000 LDNIL R5 - 0x1C140805, // 0001 EQ R5 R4 R5 - 0x78160000, // 0002 JMPF R5 #0004 - 0x50100000, // 0003 LDBOOL R4 0 0 - 0xB8160000, // 0004 GETNGBL R5 K0 - 0x8C140B01, // 0005 GETMET R5 R5 K1 - 0x7C140200, // 0006 CALL R5 1 - 0x90160401, // 0007 SETMBR R5 K2 R1 - 0x90160602, // 0008 SETMBR R5 K3 R2 - 0x90160803, // 0009 SETMBR R5 K4 R3 - 0x88180105, // 000A GETMBR R6 R0 K5 - 0x88180D06, // 000B GETMBR R6 R6 K6 - 0x88180D07, // 000C GETMBR R6 R6 K7 - 0x8C180D08, // 000D GETMET R6 R6 K8 - 0x5C200A00, // 000E MOVE R8 R5 - 0x5C240800, // 000F MOVE R9 R4 - 0x7C180600, // 0010 CALL R6 3 - 0x80000000, // 0011 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: mdns_remove_op_discovery -********************************************************************/ -be_local_closure(Matter_Device_mdns_remove_op_discovery, /* name */ - be_nested_proto( - 14, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[24]) { /* constants */ - /* K0 */ be_nested_str_weak(mdns), - /* K1 */ be_nested_str_weak(string), - /* K2 */ be_nested_str_weak(get_device_id), - /* K3 */ be_nested_str_weak(copy), - /* K4 */ be_nested_str_weak(reverse), - /* K5 */ be_nested_str_weak(get_fabric_compressed), - /* K6 */ be_nested_str_weak(tohex), - /* K7 */ be_nested_str_weak(_X2D), - /* K8 */ be_nested_str_weak(tasmota), - /* K9 */ be_nested_str_weak(eth), - /* K10 */ be_nested_str_weak(find), - /* K11 */ be_nested_str_weak(up), - /* K12 */ be_nested_str_weak(log), - /* K13 */ be_nested_str_weak(format), - /* K14 */ be_nested_str_weak(MTR_X3A_X20remove_X20mDNS_X20on_X20_X25s_X20_X27_X25s_X27), - /* K15 */ be_const_int(2), - /* K16 */ be_nested_str_weak(remove_service), - /* K17 */ be_nested_str_weak(_matter), - /* K18 */ be_nested_str_weak(_tcp), - /* K19 */ be_nested_str_weak(hostname_eth), - /* K20 */ be_nested_str_weak(wifi), - /* K21 */ be_nested_str_weak(hostname_wifi), - /* K22 */ be_nested_str_weak(MTR_X3A_X20Exception), - /* K23 */ be_nested_str_weak(_X7C), - }), - be_str_weak(mdns_remove_op_discovery), - &be_const_str_solidified, - ( &(const binstruction[81]) { /* code */ - 0xA40A0000, // 0000 IMPORT R2 K0 - 0xA40E0200, // 0001 IMPORT R3 K1 - 0xA802003B, // 0002 EXBLK 0 #003F - 0x8C100302, // 0003 GETMET R4 R1 K2 - 0x7C100200, // 0004 CALL R4 1 - 0x8C100903, // 0005 GETMET R4 R4 K3 - 0x7C100200, // 0006 CALL R4 1 - 0x8C100904, // 0007 GETMET R4 R4 K4 - 0x7C100200, // 0008 CALL R4 1 - 0x8C140305, // 0009 GETMET R5 R1 K5 - 0x7C140200, // 000A CALL R5 1 - 0x8C180B06, // 000B GETMET R6 R5 K6 - 0x7C180200, // 000C CALL R6 1 - 0x00180D07, // 000D ADD R6 R6 K7 - 0x8C1C0906, // 000E GETMET R7 R4 K6 - 0x7C1C0200, // 000F CALL R7 1 - 0x00180C07, // 0010 ADD R6 R6 R7 - 0xB81E1000, // 0011 GETNGBL R7 K8 - 0x8C1C0F09, // 0012 GETMET R7 R7 K9 - 0x7C1C0200, // 0013 CALL R7 1 - 0x8C1C0F0A, // 0014 GETMET R7 R7 K10 - 0x5824000B, // 0015 LDCONST R9 K11 - 0x7C1C0400, // 0016 CALL R7 2 - 0x781E000E, // 0017 JMPF R7 #0027 - 0xB81E1000, // 0018 GETNGBL R7 K8 - 0x8C1C0F0C, // 0019 GETMET R7 R7 K12 - 0x8C24070D, // 001A GETMET R9 R3 K13 - 0x582C000E, // 001B LDCONST R11 K14 - 0x58300009, // 001C LDCONST R12 K9 - 0x5C340C00, // 001D MOVE R13 R6 - 0x7C240800, // 001E CALL R9 4 - 0x5828000F, // 001F LDCONST R10 K15 - 0x7C1C0600, // 0020 CALL R7 3 - 0x8C1C0510, // 0021 GETMET R7 R2 K16 - 0x58240011, // 0022 LDCONST R9 K17 - 0x58280012, // 0023 LDCONST R10 K18 - 0x5C2C0C00, // 0024 MOVE R11 R6 - 0x88300113, // 0025 GETMBR R12 R0 K19 - 0x7C1C0A00, // 0026 CALL R7 5 - 0xB81E1000, // 0027 GETNGBL R7 K8 - 0x8C1C0F14, // 0028 GETMET R7 R7 K20 - 0x7C1C0200, // 0029 CALL R7 1 - 0x8C1C0F0A, // 002A GETMET R7 R7 K10 - 0x5824000B, // 002B LDCONST R9 K11 - 0x7C1C0400, // 002C CALL R7 2 - 0x781E000E, // 002D JMPF R7 #003D - 0xB81E1000, // 002E GETNGBL R7 K8 - 0x8C1C0F0C, // 002F GETMET R7 R7 K12 - 0x8C24070D, // 0030 GETMET R9 R3 K13 - 0x582C000E, // 0031 LDCONST R11 K14 - 0x58300014, // 0032 LDCONST R12 K20 - 0x5C340C00, // 0033 MOVE R13 R6 - 0x7C240800, // 0034 CALL R9 4 - 0x5828000F, // 0035 LDCONST R10 K15 - 0x7C1C0600, // 0036 CALL R7 3 - 0x8C1C0510, // 0037 GETMET R7 R2 K16 - 0x58240011, // 0038 LDCONST R9 K17 - 0x58280012, // 0039 LDCONST R10 K18 - 0x5C2C0C00, // 003A MOVE R11 R6 - 0x88300115, // 003B GETMBR R12 R0 K21 - 0x7C1C0A00, // 003C CALL R7 5 - 0xA8040001, // 003D EXBLK 1 1 - 0x70020010, // 003E JMP #0050 - 0xAC100002, // 003F CATCH R4 0 2 - 0x7002000D, // 0040 JMP #004F - 0xB81A1000, // 0041 GETNGBL R6 K8 - 0x8C180D0C, // 0042 GETMET R6 R6 K12 - 0x60200008, // 0043 GETGBL R8 G8 - 0x5C240800, // 0044 MOVE R9 R4 - 0x7C200200, // 0045 CALL R8 1 - 0x00222C08, // 0046 ADD R8 K22 R8 - 0x00201117, // 0047 ADD R8 R8 K23 - 0x60240008, // 0048 GETGBL R9 G8 - 0x5C280A00, // 0049 MOVE R10 R5 - 0x7C240200, // 004A CALL R9 1 - 0x00201009, // 004B ADD R8 R8 R9 - 0x5824000F, // 004C LDCONST R9 K15 - 0x7C180600, // 004D CALL R6 3 - 0x70020000, // 004E JMP #0050 - 0xB0080000, // 004F RAISE 2 R0 R0 - 0x80000000, // 0050 RET 0 + 0x8C0C0501, // 0001 GETMET R3 R2 K1 + 0x5C140200, // 0002 MOVE R5 R1 + 0x58180002, // 0003 LDCONST R6 K2 + 0x7C0C0600, // 0004 CALL R3 3 + 0x780E0001, // 0005 JMPF R3 #0008 + 0x88100103, // 0006 GETMBR R4 R0 K3 + 0x98100601, // 0007 SETIDX R4 R3 R1 + 0x80000000, // 0008 RET 0 }) ) ); @@ -1575,296 +645,9 @@ be_local_closure(Matter_Device_start_basic_commissioning, /* name */ /******************************************************************** -** Solidified function: mdns_remove_op_discovery_all_fabrics +** Solidified function: load_param ********************************************************************/ -be_local_closure(Matter_Device_mdns_remove_op_discovery_all_fabrics, /* name */ - be_nested_proto( - 6, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 6]) { /* constants */ - /* K0 */ be_nested_str_weak(sessions), - /* K1 */ be_nested_str_weak(active_fabrics), - /* K2 */ be_nested_str_weak(get_device_id), - /* K3 */ be_nested_str_weak(get_fabric_id), - /* K4 */ be_nested_str_weak(mdns_remove_op_discovery), - /* K5 */ be_nested_str_weak(stop_iteration), - }), - be_str_weak(mdns_remove_op_discovery_all_fabrics), - &be_const_str_solidified, - ( &(const binstruction[22]) { /* code */ - 0x60040010, // 0000 GETGBL R1 G16 - 0x88080100, // 0001 GETMBR R2 R0 K0 - 0x8C080501, // 0002 GETMET R2 R2 K1 - 0x7C080200, // 0003 CALL R2 1 - 0x7C040200, // 0004 CALL R1 1 - 0xA802000B, // 0005 EXBLK 0 #0012 - 0x5C080200, // 0006 MOVE R2 R1 - 0x7C080000, // 0007 CALL R2 0 - 0x8C0C0502, // 0008 GETMET R3 R2 K2 - 0x7C0C0200, // 0009 CALL R3 1 - 0x780E0005, // 000A JMPF R3 #0011 - 0x8C0C0503, // 000B GETMET R3 R2 K3 - 0x7C0C0200, // 000C CALL R3 1 - 0x780E0002, // 000D JMPF R3 #0011 - 0x8C0C0104, // 000E GETMET R3 R0 K4 - 0x5C140400, // 000F MOVE R5 R2 - 0x7C0C0400, // 0010 CALL R3 2 - 0x7001FFF3, // 0011 JMP #0006 - 0x58040005, // 0012 LDCONST R1 K5 - 0xAC040200, // 0013 CATCH R1 1 0 - 0xB0080000, // 0014 RAISE 2 R0 R0 - 0x80000000, // 0015 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: start -********************************************************************/ -be_local_closure(Matter_Device_start, /* name */ - be_nested_proto( - 6, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 1, /* has sup protos */ - ( &(const struct bproto*[ 1]) { - be_nested_proto( - 2, /* nstack */ - 0, /* argc */ - 0, /* varg */ - 1, /* has upvals */ - ( &(const bupvaldesc[ 1]) { /* upvals */ - be_local_const_upval(1, 0), - }), - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 1]) { /* constants */ - /* K0 */ be_nested_str_weak(_trigger_read_sensors), - }), - be_str_weak(_anonymous_), - &be_const_str_solidified, - ( &(const binstruction[ 4]) { /* code */ - 0x68000000, // 0000 GETUPV R0 U0 - 0x8C000100, // 0001 GETMET R0 R0 K0 - 0x7C000200, // 0002 CALL R0 1 - 0x80000000, // 0003 RET 0 - }) - ), - }), - 1, /* has constants */ - ( &(const bvalue[ 9]) { /* constants */ - /* K0 */ be_nested_str_weak(started), - /* K1 */ be_nested_str_weak(autoconf_device), - /* K2 */ be_nested_str_weak(tasmota), - /* K3 */ be_nested_str_weak(add_cron), - /* K4 */ be_nested_str_weak(_X2A_X2F30_X20_X2A_X20_X2A_X20_X2A_X20_X2A_X20_X2A), - /* K5 */ be_nested_str_weak(matter_sensors_30s), - /* K6 */ be_nested_str_weak(_start_udp), - /* K7 */ be_nested_str_weak(UDP_PORT), - /* K8 */ be_nested_str_weak(start_mdns_announce_hostnames), - }), - be_str_weak(start), - &be_const_str_solidified, - ( &(const binstruction[20]) { /* code */ - 0x88040100, // 0000 GETMBR R1 R0 K0 - 0x78060000, // 0001 JMPF R1 #0003 - 0x80000200, // 0002 RET 0 - 0x8C040101, // 0003 GETMET R1 R0 K1 - 0x7C040200, // 0004 CALL R1 1 - 0xB8060400, // 0005 GETNGBL R1 K2 - 0x8C040303, // 0006 GETMET R1 R1 K3 - 0x580C0004, // 0007 LDCONST R3 K4 - 0x84100000, // 0008 CLOSURE R4 P0 - 0x58140005, // 0009 LDCONST R5 K5 - 0x7C040800, // 000A CALL R1 4 - 0x8C040106, // 000B GETMET R1 R0 K6 - 0x880C0107, // 000C GETMBR R3 R0 K7 - 0x7C040400, // 000D CALL R1 2 - 0x8C040108, // 000E GETMET R1 R0 K8 - 0x7C040200, // 000F CALL R1 1 - 0x50040200, // 0010 LDBOOL R1 1 0 - 0x90020001, // 0011 SETMBR R0 K0 R1 - 0xA0000000, // 0012 CLOSE R0 - 0x80000000, // 0013 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: sort_distinct -********************************************************************/ -be_local_closure(Matter_Device_sort_distinct, /* name */ - be_nested_proto( - 7, /* nstack */ - 1, /* argc */ - 4, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 5]) { /* constants */ - /* K0 */ be_const_class(be_class_Matter_Device), - /* K1 */ be_const_int(1), - /* K2 */ be_const_int(0), - /* K3 */ be_nested_str_weak(stop_iteration), - /* K4 */ be_nested_str_weak(remove), - }), - be_str_weak(sort_distinct), - &be_const_str_solidified, - ( &(const binstruction[53]) { /* code */ - 0x58040000, // 0000 LDCONST R1 K0 - 0x60080010, // 0001 GETGBL R2 G16 - 0x600C000C, // 0002 GETGBL R3 G12 - 0x5C100000, // 0003 MOVE R4 R0 - 0x7C0C0200, // 0004 CALL R3 1 - 0x040C0701, // 0005 SUB R3 R3 K1 - 0x400E0203, // 0006 CONNECT R3 K1 R3 - 0x7C080200, // 0007 CALL R2 1 - 0xA8020010, // 0008 EXBLK 0 #001A - 0x5C0C0400, // 0009 MOVE R3 R2 - 0x7C0C0000, // 000A CALL R3 0 - 0x94100003, // 000B GETIDX R4 R0 R3 - 0x5C140600, // 000C MOVE R5 R3 - 0x24180B02, // 000D GT R6 R5 K2 - 0x781A0008, // 000E JMPF R6 #0018 - 0x04180B01, // 000F SUB R6 R5 K1 - 0x94180006, // 0010 GETIDX R6 R0 R6 - 0x24180C04, // 0011 GT R6 R6 R4 - 0x781A0004, // 0012 JMPF R6 #0018 - 0x04180B01, // 0013 SUB R6 R5 K1 - 0x94180006, // 0014 GETIDX R6 R0 R6 - 0x98000A06, // 0015 SETIDX R0 R5 R6 - 0x04140B01, // 0016 SUB R5 R5 K1 - 0x7001FFF4, // 0017 JMP #000D - 0x98000A04, // 0018 SETIDX R0 R5 R4 - 0x7001FFEE, // 0019 JMP #0009 - 0x58080003, // 001A LDCONST R2 K3 - 0xAC080200, // 001B CATCH R2 1 0 - 0xB0080000, // 001C RAISE 2 R0 R0 - 0x58080001, // 001D LDCONST R2 K1 - 0x600C000C, // 001E GETGBL R3 G12 - 0x5C100000, // 001F MOVE R4 R0 - 0x7C0C0200, // 0020 CALL R3 1 - 0x180C0701, // 0021 LE R3 R3 K1 - 0x780E0000, // 0022 JMPF R3 #0024 - 0x80040000, // 0023 RET 1 R0 - 0x940C0102, // 0024 GETIDX R3 R0 K2 - 0x6010000C, // 0025 GETGBL R4 G12 - 0x5C140000, // 0026 MOVE R5 R0 - 0x7C100200, // 0027 CALL R4 1 - 0x14100404, // 0028 LT R4 R2 R4 - 0x78120009, // 0029 JMPF R4 #0034 - 0x94100002, // 002A GETIDX R4 R0 R2 - 0x1C100803, // 002B EQ R4 R4 R3 - 0x78120003, // 002C JMPF R4 #0031 - 0x8C100104, // 002D GETMET R4 R0 K4 - 0x5C180400, // 002E MOVE R6 R2 - 0x7C100400, // 002F CALL R4 2 - 0x70020001, // 0030 JMP #0033 - 0x940C0002, // 0031 GETIDX R3 R0 R2 - 0x00080501, // 0032 ADD R2 R2 K1 - 0x7001FFF0, // 0033 JMP #0025 - 0x80040000, // 0034 RET 1 R0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: _compute_pbkdf -********************************************************************/ -be_local_closure(Matter_Device__compute_pbkdf, /* name */ - be_nested_proto( - 14, /* nstack */ - 4, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[11]) { /* constants */ - /* K0 */ be_nested_str_weak(crypto), - /* K1 */ be_nested_str_weak(string), - /* K2 */ be_nested_str_weak(add), - /* K3 */ be_nested_str_weak(PBKDF2_HMAC_SHA256), - /* K4 */ be_nested_str_weak(derive), - /* K5 */ be_const_int(0), - /* K6 */ be_nested_str_weak(root_w0), - /* K7 */ be_nested_str_weak(EC_P256), - /* K8 */ be_nested_str_weak(mod), - /* K9 */ be_nested_str_weak(root_L), - /* K10 */ be_nested_str_weak(public_key), - }), - be_str_weak(_compute_pbkdf), - &be_const_str_solidified, - ( &(const binstruction[41]) { /* code */ - 0xA4120000, // 0000 IMPORT R4 K0 - 0xA4160200, // 0001 IMPORT R5 K1 - 0x60180015, // 0002 GETGBL R6 G21 - 0x7C180000, // 0003 CALL R6 0 - 0x8C180D02, // 0004 GETMET R6 R6 K2 - 0x5C200200, // 0005 MOVE R8 R1 - 0x54260003, // 0006 LDINT R9 4 - 0x7C180600, // 0007 CALL R6 3 - 0x8C1C0903, // 0008 GETMET R7 R4 K3 - 0x7C1C0200, // 0009 CALL R7 1 - 0x8C1C0F04, // 000A GETMET R7 R7 K4 - 0x5C240C00, // 000B MOVE R9 R6 - 0x5C280600, // 000C MOVE R10 R3 - 0x5C2C0400, // 000D MOVE R11 R2 - 0x5432004F, // 000E LDINT R12 80 - 0x7C1C0A00, // 000F CALL R7 5 - 0x54220026, // 0010 LDINT R8 39 - 0x40220A08, // 0011 CONNECT R8 K5 R8 - 0x94200E08, // 0012 GETIDX R8 R7 R8 - 0x54260027, // 0013 LDINT R9 40 - 0x542A004E, // 0014 LDINT R10 79 - 0x4024120A, // 0015 CONNECT R9 R9 R10 - 0x94240E09, // 0016 GETIDX R9 R7 R9 - 0x8C280907, // 0017 GETMET R10 R4 K7 - 0x7C280200, // 0018 CALL R10 1 - 0x8C281508, // 0019 GETMET R10 R10 K8 - 0x5C301000, // 001A MOVE R12 R8 - 0x7C280400, // 001B CALL R10 2 - 0x90020C0A, // 001C SETMBR R0 K6 R10 - 0x8C280907, // 001D GETMET R10 R4 K7 - 0x7C280200, // 001E CALL R10 1 - 0x8C281508, // 001F GETMET R10 R10 K8 - 0x5C301200, // 0020 MOVE R12 R9 - 0x7C280400, // 0021 CALL R10 2 - 0x8C2C0907, // 0022 GETMET R11 R4 K7 - 0x7C2C0200, // 0023 CALL R11 1 - 0x8C2C170A, // 0024 GETMET R11 R11 K10 - 0x5C341400, // 0025 MOVE R13 R10 - 0x7C2C0400, // 0026 CALL R11 2 - 0x9002120B, // 0027 SETMBR R0 K9 R11 - 0x80000000, // 0028 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: mdns_remove_PASE -********************************************************************/ -be_local_closure(Matter_Device_mdns_remove_PASE, /* name */ +be_local_closure(Matter_Device_load_param, /* name */ be_nested_proto( 12, /* nstack */ 1, /* argc */ @@ -1874,195 +657,148 @@ be_local_closure(Matter_Device_mdns_remove_PASE, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[22]) { /* constants */ - /* K0 */ be_nested_str_weak(mdns), - /* K1 */ be_nested_str_weak(string), - /* K2 */ be_nested_str_weak(mdns_pase_eth), - /* K3 */ be_nested_str_weak(tasmota), - /* K4 */ be_nested_str_weak(log), - /* K5 */ be_nested_str_weak(format), - /* K6 */ be_nested_str_weak(MTR_X3A_X20calling_X20mdns_X2Eremove_service_X28_X25s_X2C_X20_X25s_X2C_X20_X25s_X2C_X20_X25s_X29), - /* K7 */ be_nested_str_weak(_matterc), - /* K8 */ be_nested_str_weak(_udp), - /* K9 */ be_nested_str_weak(commissioning_instance_eth), - /* K10 */ be_nested_str_weak(hostname_eth), - /* K11 */ be_const_int(3), - /* K12 */ be_nested_str_weak(MTR_X3A_X20remove_X20mDNS_X20on_X20_X25s_X20_X27_X25s_X27), - /* K13 */ be_nested_str_weak(eth), - /* K14 */ be_const_int(2), - /* K15 */ be_nested_str_weak(remove_service), - /* K16 */ be_nested_str_weak(mdns_pase_wifi), - /* K17 */ be_nested_str_weak(commissioning_instance_wifi), - /* K18 */ be_nested_str_weak(hostname_wifi), - /* K19 */ be_nested_str_weak(wifi), - /* K20 */ be_nested_str_weak(MTR_X3A_X20Exception), - /* K21 */ be_nested_str_weak(_X7C), + ( &(const bvalue[32]) { /* constants */ + /* K0 */ be_nested_str_weak(string), + /* K1 */ be_nested_str_weak(crypto), + /* K2 */ be_nested_str_weak(FILENAME), + /* K3 */ be_nested_str_weak(read), + /* K4 */ be_nested_str_weak(close), + /* K5 */ be_nested_str_weak(json), + /* K6 */ be_nested_str_weak(load), + /* K7 */ be_nested_str_weak(root_discriminator), + /* K8 */ be_nested_str_weak(find), + /* K9 */ be_nested_str_weak(distinguish), + /* K10 */ be_nested_str_weak(root_passcode), + /* K11 */ be_nested_str_weak(passcode), + /* K12 */ be_nested_str_weak(ipv4only), + /* K13 */ be_nested_str_weak(next_ep), + /* K14 */ be_nested_str_weak(nextep), + /* K15 */ be_nested_str_weak(plugins_config), + /* K16 */ be_nested_str_weak(config), + /* K17 */ be_nested_str_weak(tasmota), + /* K18 */ be_nested_str_weak(log), + /* K19 */ be_nested_str_weak(MTR_X3A_X20load_config_X20_X3D_X20), + /* K20 */ be_const_int(3), + /* K21 */ be_nested_str_weak(adjust_next_ep), + /* K22 */ be_nested_str_weak(plugins_persist), + /* K23 */ be_nested_str_weak(io_error), + /* K24 */ be_nested_str_weak(MTR_X3A_X20Session_Store_X3A_X3Aload_X20Exception_X3A), + /* K25 */ be_nested_str_weak(_X7C), + /* K26 */ be_const_int(2), + /* K27 */ be_nested_str_weak(random), + /* K28 */ be_nested_str_weak(get), + /* K29 */ be_const_int(0), + /* K30 */ be_nested_str_weak(generate_random_passcode), + /* K31 */ be_nested_str_weak(save_param), }), - be_str_weak(mdns_remove_PASE), + be_str_weak(load_param), &be_const_str_solidified, - ( &(const binstruction[83]) { /* code */ + ( &(const binstruction[105]) { /* code */ 0xA4060000, // 0000 IMPORT R1 K0 0xA40A0200, // 0001 IMPORT R2 K1 - 0xA802003D, // 0002 EXBLK 0 #0041 - 0x880C0102, // 0003 GETMBR R3 R0 K2 - 0x780E001B, // 0004 JMPF R3 #0021 - 0xB80E0600, // 0005 GETNGBL R3 K3 - 0x8C0C0704, // 0006 GETMET R3 R3 K4 - 0x8C140505, // 0007 GETMET R5 R2 K5 - 0x581C0006, // 0008 LDCONST R7 K6 - 0x58200007, // 0009 LDCONST R8 K7 - 0x58240008, // 000A LDCONST R9 K8 - 0x88280109, // 000B GETMBR R10 R0 K9 - 0x882C010A, // 000C GETMBR R11 R0 K10 - 0x7C140C00, // 000D CALL R5 6 - 0x5818000B, // 000E LDCONST R6 K11 - 0x7C0C0600, // 000F CALL R3 3 - 0xB80E0600, // 0010 GETNGBL R3 K3 - 0x8C0C0704, // 0011 GETMET R3 R3 K4 - 0x8C140505, // 0012 GETMET R5 R2 K5 - 0x581C000C, // 0013 LDCONST R7 K12 - 0x5820000D, // 0014 LDCONST R8 K13 - 0x88240109, // 0015 GETMBR R9 R0 K9 - 0x7C140800, // 0016 CALL R5 4 - 0x5818000E, // 0017 LDCONST R6 K14 - 0x7C0C0600, // 0018 CALL R3 3 - 0x500C0000, // 0019 LDBOOL R3 0 0 - 0x90020403, // 001A SETMBR R0 K2 R3 - 0x8C0C030F, // 001B GETMET R3 R1 K15 - 0x58140007, // 001C LDCONST R5 K7 - 0x58180008, // 001D LDCONST R6 K8 - 0x881C0109, // 001E GETMBR R7 R0 K9 - 0x8820010A, // 001F GETMBR R8 R0 K10 - 0x7C0C0A00, // 0020 CALL R3 5 - 0x880C0110, // 0021 GETMBR R3 R0 K16 - 0x780E001B, // 0022 JMPF R3 #003F - 0xB80E0600, // 0023 GETNGBL R3 K3 - 0x8C0C0704, // 0024 GETMET R3 R3 K4 - 0x8C140505, // 0025 GETMET R5 R2 K5 - 0x581C0006, // 0026 LDCONST R7 K6 - 0x58200007, // 0027 LDCONST R8 K7 - 0x58240008, // 0028 LDCONST R9 K8 - 0x88280111, // 0029 GETMBR R10 R0 K17 - 0x882C0112, // 002A GETMBR R11 R0 K18 - 0x7C140C00, // 002B CALL R5 6 - 0x5818000B, // 002C LDCONST R6 K11 - 0x7C0C0600, // 002D CALL R3 3 - 0xB80E0600, // 002E GETNGBL R3 K3 - 0x8C0C0704, // 002F GETMET R3 R3 K4 - 0x8C140505, // 0030 GETMET R5 R2 K5 - 0x581C000C, // 0031 LDCONST R7 K12 - 0x58200013, // 0032 LDCONST R8 K19 - 0x88240111, // 0033 GETMBR R9 R0 K17 - 0x7C140800, // 0034 CALL R5 4 - 0x5818000E, // 0035 LDCONST R6 K14 - 0x7C0C0600, // 0036 CALL R3 3 - 0x500C0000, // 0037 LDBOOL R3 0 0 - 0x90022003, // 0038 SETMBR R0 K16 R3 - 0x8C0C030F, // 0039 GETMET R3 R1 K15 - 0x58140007, // 003A LDCONST R5 K7 - 0x58180008, // 003B LDCONST R6 K8 - 0x881C0111, // 003C GETMBR R7 R0 K17 - 0x88200112, // 003D GETMBR R8 R0 K18 - 0x7C0C0A00, // 003E CALL R3 5 - 0xA8040001, // 003F EXBLK 1 1 - 0x70020010, // 0040 JMP #0052 - 0xAC0C0002, // 0041 CATCH R3 0 2 - 0x7002000D, // 0042 JMP #0051 - 0xB8160600, // 0043 GETNGBL R5 K3 - 0x8C140B04, // 0044 GETMET R5 R5 K4 - 0x601C0008, // 0045 GETGBL R7 G8 - 0x5C200600, // 0046 MOVE R8 R3 - 0x7C1C0200, // 0047 CALL R7 1 - 0x001E2807, // 0048 ADD R7 K20 R7 - 0x001C0F15, // 0049 ADD R7 R7 K21 - 0x60200008, // 004A GETGBL R8 G8 - 0x5C240800, // 004B MOVE R9 R4 - 0x7C200200, // 004C CALL R8 1 - 0x001C0E08, // 004D ADD R7 R7 R8 - 0x5820000E, // 004E LDCONST R8 K14 - 0x7C140600, // 004F CALL R5 3 - 0x70020000, // 0050 JMP #0052 - 0xB0080000, // 0051 RAISE 2 R0 R0 - 0x80000000, // 0052 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: received_ack -********************************************************************/ -be_local_closure(Matter_Device_received_ack, /* name */ - be_nested_proto( - 5, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 2]) { /* constants */ - /* K0 */ be_nested_str_weak(udp_server), - /* K1 */ be_nested_str_weak(received_ack), - }), - be_str_weak(received_ack), - &be_const_str_solidified, - ( &(const binstruction[ 5]) { /* code */ - 0x88080100, // 0000 GETMBR R2 R0 K0 - 0x8C080501, // 0001 GETMET R2 R2 K1 - 0x5C100200, // 0002 MOVE R4 R1 - 0x7C080400, // 0003 CALL R2 2 - 0x80040400, // 0004 RET 1 R2 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: every_second -********************************************************************/ -be_local_closure(Matter_Device_every_second, /* name */ - be_nested_proto( - 4, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 6]) { /* constants */ - /* K0 */ be_nested_str_weak(sessions), - /* K1 */ be_nested_str_weak(every_second), - /* K2 */ be_nested_str_weak(message_handler), - /* K3 */ be_nested_str_weak(commissioning_open), - /* K4 */ be_nested_str_weak(tasmota), - /* K5 */ be_nested_str_weak(time_reached), - }), - be_str_weak(every_second), - &be_const_str_solidified, - ( &(const binstruction[18]) { /* code */ - 0x88040100, // 0000 GETMBR R1 R0 K0 - 0x8C040301, // 0001 GETMET R1 R1 K1 - 0x7C040200, // 0002 CALL R1 1 - 0x88040102, // 0003 GETMBR R1 R0 K2 - 0x8C040301, // 0004 GETMET R1 R1 K1 - 0x7C040200, // 0005 CALL R1 1 - 0x88040103, // 0006 GETMBR R1 R0 K3 - 0x4C080000, // 0007 LDNIL R2 - 0x20040202, // 0008 NE R1 R1 R2 - 0x78060006, // 0009 JMPF R1 #0011 - 0xB8060800, // 000A GETNGBL R1 K4 - 0x8C040305, // 000B GETMET R1 R1 K5 - 0x880C0103, // 000C GETMBR R3 R0 K3 - 0x7C040400, // 000D CALL R1 2 - 0x78060001, // 000E JMPF R1 #0011 - 0x4C040000, // 000F LDNIL R1 - 0x90020601, // 0010 SETMBR R0 K3 R1 - 0x80000000, // 0011 RET 0 + 0xA8020036, // 0002 EXBLK 0 #003A + 0x600C0011, // 0003 GETGBL R3 G17 + 0x88100102, // 0004 GETMBR R4 R0 K2 + 0x7C0C0200, // 0005 CALL R3 1 + 0x8C100703, // 0006 GETMET R4 R3 K3 + 0x7C100200, // 0007 CALL R4 1 + 0x8C140704, // 0008 GETMET R5 R3 K4 + 0x7C140200, // 0009 CALL R5 1 + 0xA4160A00, // 000A IMPORT R5 K5 + 0x8C180B06, // 000B GETMET R6 R5 K6 + 0x5C200800, // 000C MOVE R8 R4 + 0x7C180400, // 000D CALL R6 2 + 0x8C1C0D08, // 000E GETMET R7 R6 K8 + 0x58240009, // 000F LDCONST R9 K9 + 0x88280107, // 0010 GETMBR R10 R0 K7 + 0x7C1C0600, // 0011 CALL R7 3 + 0x90020E07, // 0012 SETMBR R0 K7 R7 + 0x8C1C0D08, // 0013 GETMET R7 R6 K8 + 0x5824000B, // 0014 LDCONST R9 K11 + 0x8828010A, // 0015 GETMBR R10 R0 K10 + 0x7C1C0600, // 0016 CALL R7 3 + 0x90021407, // 0017 SETMBR R0 K10 R7 + 0x601C0017, // 0018 GETGBL R7 G23 + 0x8C200D08, // 0019 GETMET R8 R6 K8 + 0x5828000C, // 001A LDCONST R10 K12 + 0x502C0000, // 001B LDBOOL R11 0 0 + 0x7C200600, // 001C CALL R8 3 + 0x7C1C0200, // 001D CALL R7 1 + 0x90021807, // 001E SETMBR R0 K12 R7 + 0x8C1C0D08, // 001F GETMET R7 R6 K8 + 0x5824000E, // 0020 LDCONST R9 K14 + 0x8828010D, // 0021 GETMBR R10 R0 K13 + 0x7C1C0600, // 0022 CALL R7 3 + 0x90021A07, // 0023 SETMBR R0 K13 R7 + 0x8C1C0D08, // 0024 GETMET R7 R6 K8 + 0x58240010, // 0025 LDCONST R9 K16 + 0x7C1C0400, // 0026 CALL R7 2 + 0x90021E07, // 0027 SETMBR R0 K15 R7 + 0x881C010F, // 0028 GETMBR R7 R0 K15 + 0x4C200000, // 0029 LDNIL R8 + 0x201C0E08, // 002A NE R7 R7 R8 + 0x781E000B, // 002B JMPF R7 #0038 + 0xB81E2200, // 002C GETNGBL R7 K17 + 0x8C1C0F12, // 002D GETMET R7 R7 K18 + 0x60240008, // 002E GETGBL R9 G8 + 0x8828010F, // 002F GETMBR R10 R0 K15 + 0x7C240200, // 0030 CALL R9 1 + 0x00262609, // 0031 ADD R9 K19 R9 + 0x58280014, // 0032 LDCONST R10 K20 + 0x7C1C0600, // 0033 CALL R7 3 + 0x8C1C0115, // 0034 GETMET R7 R0 K21 + 0x7C1C0200, // 0035 CALL R7 1 + 0x501C0200, // 0036 LDBOOL R7 1 0 + 0x90022C07, // 0037 SETMBR R0 K22 R7 + 0xA8040001, // 0038 EXBLK 1 1 + 0x70020012, // 0039 JMP #004D + 0xAC0C0002, // 003A CATCH R3 0 2 + 0x7002000F, // 003B JMP #004C + 0x20140717, // 003C NE R5 R3 K23 + 0x7816000C, // 003D JMPF R5 #004B + 0xB8162200, // 003E GETNGBL R5 K17 + 0x8C140B12, // 003F GETMET R5 R5 K18 + 0x601C0008, // 0040 GETGBL R7 G8 + 0x5C200600, // 0041 MOVE R8 R3 + 0x7C1C0200, // 0042 CALL R7 1 + 0x001E3007, // 0043 ADD R7 K24 R7 + 0x001C0F19, // 0044 ADD R7 R7 K25 + 0x60200008, // 0045 GETGBL R8 G8 + 0x5C240800, // 0046 MOVE R9 R4 + 0x7C200200, // 0047 CALL R8 1 + 0x001C0E08, // 0048 ADD R7 R7 R8 + 0x5820001A, // 0049 LDCONST R8 K26 + 0x7C140600, // 004A CALL R5 3 + 0x70020000, // 004B JMP #004D + 0xB0080000, // 004C RAISE 2 R0 R0 + 0x500C0000, // 004D LDBOOL R3 0 0 + 0x88100107, // 004E GETMBR R4 R0 K7 + 0x4C140000, // 004F LDNIL R5 + 0x1C100805, // 0050 EQ R4 R4 R5 + 0x7812000A, // 0051 JMPF R4 #005D + 0x8C10051B, // 0052 GETMET R4 R2 K27 + 0x5818001A, // 0053 LDCONST R6 K26 + 0x7C100400, // 0054 CALL R4 2 + 0x8C10091C, // 0055 GETMET R4 R4 K28 + 0x5818001D, // 0056 LDCONST R6 K29 + 0x581C001A, // 0057 LDCONST R7 K26 + 0x7C100600, // 0058 CALL R4 3 + 0x54160FFE, // 0059 LDINT R5 4095 + 0x2C100805, // 005A AND R4 R4 R5 + 0x90020E04, // 005B SETMBR R0 K7 R4 + 0x500C0200, // 005C LDBOOL R3 1 0 + 0x8810010A, // 005D GETMBR R4 R0 K10 + 0x4C140000, // 005E LDNIL R5 + 0x1C100805, // 005F EQ R4 R4 R5 + 0x78120003, // 0060 JMPF R4 #0065 + 0x8C10011E, // 0061 GETMET R4 R0 K30 + 0x7C100200, // 0062 CALL R4 1 + 0x90021404, // 0063 SETMBR R0 K10 R4 + 0x500C0200, // 0064 LDBOOL R3 1 0 + 0x780E0001, // 0065 JMPF R3 #0068 + 0x8C10011F, // 0066 GETMET R4 R0 K31 + 0x7C100200, // 0067 CALL R4 1 + 0x80000000, // 0068 RET 0 }) ) ); @@ -2136,1262 +872,6 @@ be_local_closure(Matter_Device_generate_random_passcode, /* name */ /*******************************************************************/ -/******************************************************************** -** Solidified function: save_param -********************************************************************/ -be_local_closure(Matter_Device_save_param, /* name */ - be_nested_proto( - 11, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[26]) { /* constants */ - /* K0 */ be_nested_str_weak(string), - /* K1 */ be_nested_str_weak(json), - /* K2 */ be_nested_str_weak(format), - /* K3 */ be_nested_str_weak(_X7B_X22distinguish_X22_X3A_X25i_X2C_X22passcode_X22_X3A_X25i_X2C_X22ipv4only_X22_X3A_X25s), - /* K4 */ be_nested_str_weak(root_discriminator), - /* K5 */ be_nested_str_weak(root_passcode), - /* K6 */ be_nested_str_weak(ipv4only), - /* K7 */ be_nested_str_weak(true), - /* K8 */ be_nested_str_weak(false), - /* K9 */ be_nested_str_weak(plugins_persist), - /* K10 */ be_nested_str_weak(_X2C_X22config_X22_X3A), - /* K11 */ be_nested_str_weak(dump), - /* K12 */ be_nested_str_weak(plugins_config), - /* K13 */ be_nested_str_weak(_X7D), - /* K14 */ be_nested_str_weak(FILENAME), - /* K15 */ be_nested_str_weak(w), - /* K16 */ be_nested_str_weak(write), - /* K17 */ be_nested_str_weak(close), - /* K18 */ be_nested_str_weak(tasmota), - /* K19 */ be_nested_str_weak(log), - /* K20 */ be_nested_str_weak(MTR_X3A_X20_X3DSaved_X20_X20_X20_X20_X20parameters_X25s), - /* K21 */ be_nested_str_weak(_X20and_X20condiguration), - /* K22 */ be_nested_str_weak(), - /* K23 */ be_const_int(2), - /* K24 */ be_nested_str_weak(MTR_X3A_X20Session_Store_X3A_X3Asave_X20Exception_X3A), - /* K25 */ be_nested_str_weak(_X7C), - }), - be_str_weak(save_param), - &be_const_str_solidified, - ( &(const binstruction[65]) { /* code */ - 0xA4060000, // 0000 IMPORT R1 K0 - 0xA40A0200, // 0001 IMPORT R2 K1 - 0x8C0C0302, // 0002 GETMET R3 R1 K2 - 0x58140003, // 0003 LDCONST R5 K3 - 0x88180104, // 0004 GETMBR R6 R0 K4 - 0x881C0105, // 0005 GETMBR R7 R0 K5 - 0x88200106, // 0006 GETMBR R8 R0 K6 - 0x78220001, // 0007 JMPF R8 #000A - 0x58200007, // 0008 LDCONST R8 K7 - 0x70020000, // 0009 JMP #000B - 0x58200008, // 000A LDCONST R8 K8 - 0x7C0C0A00, // 000B CALL R3 5 - 0x88100109, // 000C GETMBR R4 R0 K9 - 0x78120004, // 000D JMPF R4 #0013 - 0x000C070A, // 000E ADD R3 R3 K10 - 0x8C10050B, // 000F GETMET R4 R2 K11 - 0x8818010C, // 0010 GETMBR R6 R0 K12 - 0x7C100400, // 0011 CALL R4 2 - 0x000C0604, // 0012 ADD R3 R3 R4 - 0x000C070D, // 0013 ADD R3 R3 K13 - 0xA8020018, // 0014 EXBLK 0 #002E - 0x60100011, // 0015 GETGBL R4 G17 - 0x8814010E, // 0016 GETMBR R5 R0 K14 - 0x5818000F, // 0017 LDCONST R6 K15 - 0x7C100400, // 0018 CALL R4 2 - 0x8C140910, // 0019 GETMET R5 R4 K16 - 0x5C1C0600, // 001A MOVE R7 R3 - 0x7C140400, // 001B CALL R5 2 - 0x8C140911, // 001C GETMET R5 R4 K17 - 0x7C140200, // 001D CALL R5 1 - 0xB8162400, // 001E GETNGBL R5 K18 - 0x8C140B13, // 001F GETMET R5 R5 K19 - 0x8C1C0302, // 0020 GETMET R7 R1 K2 - 0x58240014, // 0021 LDCONST R9 K20 - 0x88280109, // 0022 GETMBR R10 R0 K9 - 0x782A0001, // 0023 JMPF R10 #0026 - 0x58280015, // 0024 LDCONST R10 K21 - 0x70020000, // 0025 JMP #0027 - 0x58280016, // 0026 LDCONST R10 K22 - 0x7C1C0600, // 0027 CALL R7 3 - 0x58200017, // 0028 LDCONST R8 K23 - 0x7C140600, // 0029 CALL R5 3 - 0xA8040001, // 002A EXBLK 1 1 - 0x80040600, // 002B RET 1 R3 - 0xA8040001, // 002C EXBLK 1 1 - 0x70020011, // 002D JMP #0040 - 0xAC100002, // 002E CATCH R4 0 2 - 0x7002000E, // 002F JMP #003F - 0xB81A2400, // 0030 GETNGBL R6 K18 - 0x8C180D13, // 0031 GETMET R6 R6 K19 - 0x60200008, // 0032 GETGBL R8 G8 - 0x5C240800, // 0033 MOVE R9 R4 - 0x7C200200, // 0034 CALL R8 1 - 0x00223008, // 0035 ADD R8 K24 R8 - 0x00201119, // 0036 ADD R8 R8 K25 - 0x60240008, // 0037 GETGBL R9 G8 - 0x5C280A00, // 0038 MOVE R10 R5 - 0x7C240200, // 0039 CALL R9 1 - 0x00201009, // 003A ADD R8 R8 R9 - 0x58240017, // 003B LDCONST R9 K23 - 0x7C180600, // 003C CALL R6 3 - 0x80040600, // 003D RET 1 R3 - 0x70020000, // 003E JMP #0040 - 0xB0080000, // 003F RAISE 2 R0 R0 - 0x80000000, // 0040 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: _load_plugins_config -********************************************************************/ -be_local_closure(Matter_Device__load_plugins_config, /* name */ - be_nested_proto( - 19, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[34]) { /* constants */ - /* K0 */ be_nested_str_weak(string), - /* K1 */ be_nested_str_weak(k2l_num), - /* K2 */ be_nested_str_weak(tasmota), - /* K3 */ be_nested_str_weak(log), - /* K4 */ be_nested_str_weak(MTR_X3A_X20endpoints_X20to_X20be_X20configured_X20), - /* K5 */ be_const_int(3), - /* K6 */ be_nested_str_weak(plugins), - /* K7 */ be_nested_str_weak(push), - /* K8 */ be_nested_str_weak(matter), - /* K9 */ be_nested_str_weak(Plugin_Root), - /* K10 */ be_const_int(0), - /* K11 */ be_nested_str_weak(format), - /* K12 */ be_nested_str_weak(MTR_X3A_X20endpoint_X3A_X25i_X20type_X3A_X25s_X25s), - /* K13 */ be_nested_str_weak(root), - /* K14 */ be_nested_str_weak(), - /* K15 */ be_const_int(2), - /* K16 */ be_nested_str_weak(Plugin_Aggregator), - /* K17 */ be_nested_str_weak(aggregator), - /* K18 */ be_nested_str_weak(MTR_X3A_X20endpoint_X20_X25i_X20config_X20_X25s), - /* K19 */ be_nested_str_weak(find), - /* K20 */ be_nested_str_weak(type), - /* K21 */ be_nested_str_weak(MTR_X3A_X20no_X20class_X20name_X2C_X20skipping), - /* K22 */ be_nested_str_weak(MTR_X3A_X20only_X20one_X20root_X20node_X20allowed), - /* K23 */ be_nested_str_weak(plugins_classes), - /* K24 */ be_nested_str_weak(MTR_X3A_X20unknown_X20class_X20name_X20_X27), - /* K25 */ be_nested_str_weak(_X27_X20skipping), - /* K26 */ be_nested_str_weak(k2l), - /* K27 */ be_nested_str_weak(_X20_X25s_X3A_X25s), - /* K28 */ be_nested_str_weak(stop_iteration), - /* K29 */ be_nested_str_weak(MTR_X3A_X20Exception), - /* K30 */ be_nested_str_weak(_X7C), - /* K31 */ be_nested_str_weak(publish_result), - /* K32 */ be_nested_str_weak(_X7B_X22Matter_X22_X3A_X7B_X22Initialized_X22_X3A1_X7D_X7D), - /* K33 */ be_nested_str_weak(Matter), - }), - be_str_weak(_load_plugins_config), - &be_const_str_solidified, - ( &(const binstruction[185]) { /* code */ - 0xA40A0000, // 0000 IMPORT R2 K0 - 0x8C0C0101, // 0001 GETMET R3 R0 K1 - 0x5C140200, // 0002 MOVE R5 R1 - 0x7C0C0400, // 0003 CALL R3 2 - 0xB8120400, // 0004 GETNGBL R4 K2 - 0x8C100903, // 0005 GETMET R4 R4 K3 - 0x60180008, // 0006 GETGBL R6 G8 - 0x5C1C0600, // 0007 MOVE R7 R3 - 0x7C180200, // 0008 CALL R6 1 - 0x001A0806, // 0009 ADD R6 K4 R6 - 0x581C0005, // 000A LDCONST R7 K5 - 0x7C100600, // 000B CALL R4 3 - 0x88100106, // 000C GETMBR R4 R0 K6 - 0x8C100907, // 000D GETMET R4 R4 K7 - 0xB81A1000, // 000E GETNGBL R6 K8 - 0x8C180D09, // 000F GETMET R6 R6 K9 - 0x5C200000, // 0010 MOVE R8 R0 - 0x5824000A, // 0011 LDCONST R9 K10 - 0x60280013, // 0012 GETGBL R10 G19 - 0x7C280000, // 0013 CALL R10 0 - 0x7C180800, // 0014 CALL R6 4 - 0x7C100400, // 0015 CALL R4 2 - 0xB8120400, // 0016 GETNGBL R4 K2 - 0x8C100903, // 0017 GETMET R4 R4 K3 - 0x8C18050B, // 0018 GETMET R6 R2 K11 - 0x5820000C, // 0019 LDCONST R8 K12 - 0x5824000A, // 001A LDCONST R9 K10 - 0x5828000D, // 001B LDCONST R10 K13 - 0x582C000E, // 001C LDCONST R11 K14 - 0x7C180A00, // 001D CALL R6 5 - 0x581C000F, // 001E LDCONST R7 K15 - 0x7C100600, // 001F CALL R4 3 - 0x88100106, // 0020 GETMBR R4 R0 K6 - 0x8C100907, // 0021 GETMET R4 R4 K7 - 0xB81A1000, // 0022 GETNGBL R6 K8 - 0x8C180D10, // 0023 GETMET R6 R6 K16 - 0x5C200000, // 0024 MOVE R8 R0 - 0x5426FEFF, // 0025 LDINT R9 65280 - 0x60280013, // 0026 GETGBL R10 G19 - 0x7C280000, // 0027 CALL R10 0 - 0x7C180800, // 0028 CALL R6 4 - 0x7C100400, // 0029 CALL R4 2 - 0xB8120400, // 002A GETNGBL R4 K2 - 0x8C100903, // 002B GETMET R4 R4 K3 - 0x8C18050B, // 002C GETMET R6 R2 K11 - 0x5820000C, // 002D LDCONST R8 K12 - 0x5426FEFF, // 002E LDINT R9 65280 - 0x58280011, // 002F LDCONST R10 K17 - 0x582C000E, // 0030 LDCONST R11 K14 - 0x7C180A00, // 0031 CALL R6 5 - 0x581C000F, // 0032 LDCONST R7 K15 - 0x7C100600, // 0033 CALL R4 3 - 0x60100010, // 0034 GETGBL R4 G16 - 0x5C140600, // 0035 MOVE R5 R3 - 0x7C100200, // 0036 CALL R4 1 - 0xA8020077, // 0037 EXBLK 0 #00B0 - 0x5C140800, // 0038 MOVE R5 R4 - 0x7C140000, // 0039 CALL R5 0 - 0x1C180B0A, // 003A EQ R6 R5 K10 - 0x781A0000, // 003B JMPF R6 #003D - 0x7001FFFA, // 003C JMP #0038 - 0xA802005F, // 003D EXBLK 0 #009E - 0x60180008, // 003E GETGBL R6 G8 - 0x5C1C0A00, // 003F MOVE R7 R5 - 0x7C180200, // 0040 CALL R6 1 - 0x94180206, // 0041 GETIDX R6 R1 R6 - 0xB81E0400, // 0042 GETNGBL R7 K2 - 0x8C1C0F03, // 0043 GETMET R7 R7 K3 - 0x8C24050B, // 0044 GETMET R9 R2 K11 - 0x582C0012, // 0045 LDCONST R11 K18 - 0x5C300A00, // 0046 MOVE R12 R5 - 0x5C340C00, // 0047 MOVE R13 R6 - 0x7C240800, // 0048 CALL R9 4 - 0x58280005, // 0049 LDCONST R10 K5 - 0x7C1C0600, // 004A CALL R7 3 - 0x8C1C0D13, // 004B GETMET R7 R6 K19 - 0x58240014, // 004C LDCONST R9 K20 - 0x7C1C0400, // 004D CALL R7 2 - 0x4C200000, // 004E LDNIL R8 - 0x1C200E08, // 004F EQ R8 R7 R8 - 0x78220006, // 0050 JMPF R8 #0058 - 0xB8220400, // 0051 GETNGBL R8 K2 - 0x8C201103, // 0052 GETMET R8 R8 K3 - 0x58280015, // 0053 LDCONST R10 K21 - 0x582C0005, // 0054 LDCONST R11 K5 - 0x7C200600, // 0055 CALL R8 3 - 0xA8040001, // 0056 EXBLK 1 1 - 0x7001FFDF, // 0057 JMP #0038 - 0x1C200F0D, // 0058 EQ R8 R7 K13 - 0x78220006, // 0059 JMPF R8 #0061 - 0xB8220400, // 005A GETNGBL R8 K2 - 0x8C201103, // 005B GETMET R8 R8 K3 - 0x58280016, // 005C LDCONST R10 K22 - 0x582C0005, // 005D LDCONST R11 K5 - 0x7C200600, // 005E CALL R8 3 - 0xA8040001, // 005F EXBLK 1 1 - 0x7001FFD6, // 0060 JMP #0038 - 0x88200117, // 0061 GETMBR R8 R0 K23 - 0x8C201113, // 0062 GETMET R8 R8 K19 - 0x5C280E00, // 0063 MOVE R10 R7 - 0x7C200400, // 0064 CALL R8 2 - 0x4C240000, // 0065 LDNIL R9 - 0x1C241009, // 0066 EQ R9 R8 R9 - 0x7826000A, // 0067 JMPF R9 #0073 - 0xB8260400, // 0068 GETNGBL R9 K2 - 0x8C241303, // 0069 GETMET R9 R9 K3 - 0x602C0008, // 006A GETGBL R11 G8 - 0x5C300E00, // 006B MOVE R12 R7 - 0x7C2C0200, // 006C CALL R11 1 - 0x002E300B, // 006D ADD R11 K24 R11 - 0x002C1719, // 006E ADD R11 R11 K25 - 0x5830000F, // 006F LDCONST R12 K15 - 0x7C240600, // 0070 CALL R9 3 - 0xA8040001, // 0071 EXBLK 1 1 - 0x7001FFC4, // 0072 JMP #0038 - 0x5C241000, // 0073 MOVE R9 R8 - 0x5C280000, // 0074 MOVE R10 R0 - 0x5C2C0A00, // 0075 MOVE R11 R5 - 0x5C300C00, // 0076 MOVE R12 R6 - 0x7C240600, // 0077 CALL R9 3 - 0x88280106, // 0078 GETMBR R10 R0 K6 - 0x8C281507, // 0079 GETMET R10 R10 K7 - 0x5C301200, // 007A MOVE R12 R9 - 0x7C280400, // 007B CALL R10 2 - 0x5828000E, // 007C LDCONST R10 K14 - 0x602C0010, // 007D GETGBL R11 G16 - 0x8C30011A, // 007E GETMET R12 R0 K26 - 0x5C380C00, // 007F MOVE R14 R6 - 0x7C300400, // 0080 CALL R12 2 - 0x7C2C0200, // 0081 CALL R11 1 - 0xA802000B, // 0082 EXBLK 0 #008F - 0x5C301600, // 0083 MOVE R12 R11 - 0x7C300000, // 0084 CALL R12 0 - 0x1C341914, // 0085 EQ R13 R12 K20 - 0x78360000, // 0086 JMPF R13 #0088 - 0x7001FFFA, // 0087 JMP #0083 - 0x8C34050B, // 0088 GETMET R13 R2 K11 - 0x583C001B, // 0089 LDCONST R15 K27 - 0x5C401800, // 008A MOVE R16 R12 - 0x94440C0C, // 008B GETIDX R17 R6 R12 - 0x7C340800, // 008C CALL R13 4 - 0x0028140D, // 008D ADD R10 R10 R13 - 0x7001FFF3, // 008E JMP #0083 - 0x582C001C, // 008F LDCONST R11 K28 - 0xAC2C0200, // 0090 CATCH R11 1 0 - 0xB0080000, // 0091 RAISE 2 R0 R0 - 0xB82E0400, // 0092 GETNGBL R11 K2 - 0x8C2C1703, // 0093 GETMET R11 R11 K3 - 0x8C34050B, // 0094 GETMET R13 R2 K11 - 0x583C000C, // 0095 LDCONST R15 K12 - 0x5C400A00, // 0096 MOVE R16 R5 - 0x5C440E00, // 0097 MOVE R17 R7 - 0x5C481400, // 0098 MOVE R18 R10 - 0x7C340A00, // 0099 CALL R13 5 - 0x5838000F, // 009A LDCONST R14 K15 - 0x7C2C0600, // 009B CALL R11 3 - 0xA8040001, // 009C EXBLK 1 1 - 0x70020010, // 009D JMP #00AF - 0xAC180002, // 009E CATCH R6 0 2 - 0x7002000D, // 009F JMP #00AE - 0xB8220400, // 00A0 GETNGBL R8 K2 - 0x8C201103, // 00A1 GETMET R8 R8 K3 - 0x60280008, // 00A2 GETGBL R10 G8 - 0x5C2C0C00, // 00A3 MOVE R11 R6 - 0x7C280200, // 00A4 CALL R10 1 - 0x002A3A0A, // 00A5 ADD R10 K29 R10 - 0x0028151E, // 00A6 ADD R10 R10 K30 - 0x602C0008, // 00A7 GETGBL R11 G8 - 0x5C300E00, // 00A8 MOVE R12 R7 - 0x7C2C0200, // 00A9 CALL R11 1 - 0x0028140B, // 00AA ADD R10 R10 R11 - 0x582C000F, // 00AB LDCONST R11 K15 - 0x7C200600, // 00AC CALL R8 3 - 0x70020000, // 00AD JMP #00AF - 0xB0080000, // 00AE RAISE 2 R0 R0 - 0x7001FF87, // 00AF JMP #0038 - 0x5810001C, // 00B0 LDCONST R4 K28 - 0xAC100200, // 00B1 CATCH R4 1 0 - 0xB0080000, // 00B2 RAISE 2 R0 R0 - 0xB8120400, // 00B3 GETNGBL R4 K2 - 0x8C10091F, // 00B4 GETMET R4 R4 K31 - 0x58180020, // 00B5 LDCONST R6 K32 - 0x581C0021, // 00B6 LDCONST R7 K33 - 0x7C100600, // 00B7 CALL R4 3 - 0x80000000, // 00B8 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: start_root_basic_commissioning -********************************************************************/ -be_local_closure(Matter_Device_start_root_basic_commissioning, /* name */ - be_nested_proto( - 14, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[23]) { /* constants */ - /* K0 */ be_nested_str_weak(string), - /* K1 */ be_nested_str_weak(PASE_TIMEOUT), - /* K2 */ be_nested_str_weak(compute_manual_pairing_code), - /* K3 */ be_nested_str_weak(tasmota), - /* K4 */ be_nested_str_weak(log), - /* K5 */ be_nested_str_weak(format), - /* K6 */ be_nested_str_weak(MTR_X3A_X20Manual_X20pairing_X20code_X3A_X20_X25s_X2D_X25s_X2D_X25s), - /* K7 */ be_const_int(0), - /* K8 */ be_const_int(3), - /* K9 */ be_const_int(2147483647), - /* K10 */ be_const_int(2), - /* K11 */ be_nested_str_weak(compute_qrcode_content), - /* K12 */ be_nested_str_weak(publish_result), - /* K13 */ be_nested_str_weak(_X7B_X22Matter_X22_X3A_X7B_X22Commissioning_X22_X3A1_X2C_X22PairingCode_X22_X3A_X22_X25s_X22_X2C_X22QRCode_X22_X3A_X22_X25s_X22_X7D_X7D), - /* K14 */ be_nested_str_weak(Matter), - /* K15 */ be_nested_str_weak(_compute_pbkdf), - /* K16 */ be_nested_str_weak(root_passcode), - /* K17 */ be_nested_str_weak(root_iterations), - /* K18 */ be_nested_str_weak(root_salt), - /* K19 */ be_nested_str_weak(start_basic_commissioning), - /* K20 */ be_nested_str_weak(root_discriminator), - /* K21 */ be_nested_str_weak(root_w0), - /* K22 */ be_nested_str_weak(root_L), - }), - be_str_weak(start_root_basic_commissioning), - &be_const_str_solidified, - ( &(const binstruction[49]) { /* code */ - 0xA40A0000, // 0000 IMPORT R2 K0 - 0x4C0C0000, // 0001 LDNIL R3 - 0x1C0C0203, // 0002 EQ R3 R1 R3 - 0x780E0000, // 0003 JMPF R3 #0005 - 0x88040101, // 0004 GETMBR R1 R0 K1 - 0x8C0C0102, // 0005 GETMET R3 R0 K2 - 0x7C0C0200, // 0006 CALL R3 1 - 0xB8120600, // 0007 GETNGBL R4 K3 - 0x8C100904, // 0008 GETMET R4 R4 K4 - 0x8C180505, // 0009 GETMET R6 R2 K5 - 0x58200006, // 000A LDCONST R8 K6 - 0x40260F08, // 000B CONNECT R9 K7 K8 - 0x94240609, // 000C GETIDX R9 R3 R9 - 0x542A0003, // 000D LDINT R10 4 - 0x542E0005, // 000E LDINT R11 6 - 0x4028140B, // 000F CONNECT R10 R10 R11 - 0x9428060A, // 0010 GETIDX R10 R3 R10 - 0x542E0006, // 0011 LDINT R11 7 - 0x402C1709, // 0012 CONNECT R11 R11 K9 - 0x942C060B, // 0013 GETIDX R11 R3 R11 - 0x7C180A00, // 0014 CALL R6 5 - 0x581C000A, // 0015 LDCONST R7 K10 - 0x7C100600, // 0016 CALL R4 3 - 0x8C10010B, // 0017 GETMET R4 R0 K11 - 0x7C100200, // 0018 CALL R4 1 - 0xB8160600, // 0019 GETNGBL R5 K3 - 0x8C140B0C, // 001A GETMET R5 R5 K12 - 0x8C1C0505, // 001B GETMET R7 R2 K5 - 0x5824000D, // 001C LDCONST R9 K13 - 0x5C280600, // 001D MOVE R10 R3 - 0x5C2C0800, // 001E MOVE R11 R4 - 0x7C1C0800, // 001F CALL R7 4 - 0x5820000E, // 0020 LDCONST R8 K14 - 0x7C140600, // 0021 CALL R5 3 - 0x8C14010F, // 0022 GETMET R5 R0 K15 - 0x881C0110, // 0023 GETMBR R7 R0 K16 - 0x88200111, // 0024 GETMBR R8 R0 K17 - 0x88240112, // 0025 GETMBR R9 R0 K18 - 0x7C140800, // 0026 CALL R5 4 - 0x8C140113, // 0027 GETMET R5 R0 K19 - 0x5C1C0200, // 0028 MOVE R7 R1 - 0x88200111, // 0029 GETMBR R8 R0 K17 - 0x88240114, // 002A GETMBR R9 R0 K20 - 0x88280112, // 002B GETMBR R10 R0 K18 - 0x882C0115, // 002C GETMBR R11 R0 K21 - 0x88300116, // 002D GETMBR R12 R0 K22 - 0x4C340000, // 002E LDNIL R13 - 0x7C141000, // 002F CALL R5 8 - 0x80000000, // 0030 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: remove_fabric -********************************************************************/ -be_local_closure(Matter_Device_remove_fabric, /* name */ - be_nested_proto( - 9, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[12]) { /* constants */ - /* K0 */ be_nested_str_weak(sessions), - /* K1 */ be_nested_str_weak(find_children_fabrics), - /* K2 */ be_nested_str_weak(get_fabric_index), - /* K3 */ be_nested_str_weak(find_fabric_by_index), - /* K4 */ be_nested_str_weak(message_handler), - /* K5 */ be_nested_str_weak(im), - /* K6 */ be_nested_str_weak(subs_shop), - /* K7 */ be_nested_str_weak(remove_by_fabric), - /* K8 */ be_nested_str_weak(mdns_remove_op_discovery), - /* K9 */ be_nested_str_weak(remove_fabric), - /* K10 */ be_nested_str_weak(stop_iteration), - /* K11 */ be_nested_str_weak(save_fabrics), - }), - be_str_weak(remove_fabric), - &be_const_str_solidified, - ( &(const binstruction[43]) { /* code */ - 0x88080100, // 0000 GETMBR R2 R0 K0 - 0x8C080501, // 0001 GETMET R2 R2 K1 - 0x8C100302, // 0002 GETMET R4 R1 K2 - 0x7C100200, // 0003 CALL R4 1 - 0x7C080400, // 0004 CALL R2 2 - 0x4C0C0000, // 0005 LDNIL R3 - 0x1C0C0403, // 0006 EQ R3 R2 R3 - 0x780E0000, // 0007 JMPF R3 #0009 - 0x80000600, // 0008 RET 0 - 0x600C0010, // 0009 GETGBL R3 G16 - 0x5C100400, // 000A MOVE R4 R2 - 0x7C0C0200, // 000B CALL R3 1 - 0xA8020016, // 000C EXBLK 0 #0024 - 0x5C100600, // 000D MOVE R4 R3 - 0x7C100000, // 000E CALL R4 0 - 0x88140100, // 000F GETMBR R5 R0 K0 - 0x8C140B03, // 0010 GETMET R5 R5 K3 - 0x5C1C0800, // 0011 MOVE R7 R4 - 0x7C140400, // 0012 CALL R5 2 - 0x4C180000, // 0013 LDNIL R6 - 0x20180A06, // 0014 NE R6 R5 R6 - 0x781A000C, // 0015 JMPF R6 #0023 - 0x88180104, // 0016 GETMBR R6 R0 K4 - 0x88180D05, // 0017 GETMBR R6 R6 K5 - 0x88180D06, // 0018 GETMBR R6 R6 K6 - 0x8C180D07, // 0019 GETMET R6 R6 K7 - 0x5C200A00, // 001A MOVE R8 R5 - 0x7C180400, // 001B CALL R6 2 - 0x8C180108, // 001C GETMET R6 R0 K8 - 0x5C200A00, // 001D MOVE R8 R5 - 0x7C180400, // 001E CALL R6 2 - 0x88180100, // 001F GETMBR R6 R0 K0 - 0x8C180D09, // 0020 GETMET R6 R6 K9 - 0x5C200A00, // 0021 MOVE R8 R5 - 0x7C180400, // 0022 CALL R6 2 - 0x7001FFE8, // 0023 JMP #000D - 0x580C000A, // 0024 LDCONST R3 K10 - 0xAC0C0200, // 0025 CATCH R3 1 0 - 0xB0080000, // 0026 RAISE 2 R0 R0 - 0x880C0100, // 0027 GETMBR R3 R0 K0 - 0x8C0C070B, // 0028 GETMET R3 R3 K11 - 0x7C0C0200, // 0029 CALL R3 1 - 0x80000000, // 002A RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: load_param -********************************************************************/ -be_local_closure(Matter_Device_load_param, /* name */ - be_nested_proto( - 12, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[28]) { /* constants */ - /* K0 */ be_nested_str_weak(string), - /* K1 */ be_nested_str_weak(crypto), - /* K2 */ be_nested_str_weak(FILENAME), - /* K3 */ be_nested_str_weak(read), - /* K4 */ be_nested_str_weak(close), - /* K5 */ be_nested_str_weak(json), - /* K6 */ be_nested_str_weak(load), - /* K7 */ be_nested_str_weak(root_discriminator), - /* K8 */ be_nested_str_weak(find), - /* K9 */ be_nested_str_weak(distinguish), - /* K10 */ be_nested_str_weak(root_passcode), - /* K11 */ be_nested_str_weak(passcode), - /* K12 */ be_nested_str_weak(ipv4only), - /* K13 */ be_nested_str_weak(plugins_config), - /* K14 */ be_nested_str_weak(config), - /* K15 */ be_nested_str_weak(_load_plugins_config), - /* K16 */ be_nested_str_weak(plugins_persist), - /* K17 */ be_nested_str_weak(io_error), - /* K18 */ be_nested_str_weak(tasmota), - /* K19 */ be_nested_str_weak(log), - /* K20 */ be_nested_str_weak(MTR_X3A_X20Session_Store_X3A_X3Aload_X20Exception_X3A), - /* K21 */ be_nested_str_weak(_X7C), - /* K22 */ be_const_int(2), - /* K23 */ be_nested_str_weak(random), - /* K24 */ be_nested_str_weak(get), - /* K25 */ be_const_int(0), - /* K26 */ be_nested_str_weak(generate_random_passcode), - /* K27 */ be_nested_str_weak(save_param), - }), - be_str_weak(load_param), - &be_const_str_solidified, - ( &(const binstruction[91]) { /* code */ - 0xA4060000, // 0000 IMPORT R1 K0 - 0xA40A0200, // 0001 IMPORT R2 K1 - 0xA8020028, // 0002 EXBLK 0 #002C - 0x600C0011, // 0003 GETGBL R3 G17 - 0x88100102, // 0004 GETMBR R4 R0 K2 - 0x7C0C0200, // 0005 CALL R3 1 - 0x8C100703, // 0006 GETMET R4 R3 K3 - 0x7C100200, // 0007 CALL R4 1 - 0x8C140704, // 0008 GETMET R5 R3 K4 - 0x7C140200, // 0009 CALL R5 1 - 0xA4160A00, // 000A IMPORT R5 K5 - 0x8C180B06, // 000B GETMET R6 R5 K6 - 0x5C200800, // 000C MOVE R8 R4 - 0x7C180400, // 000D CALL R6 2 - 0x8C1C0D08, // 000E GETMET R7 R6 K8 - 0x58240009, // 000F LDCONST R9 K9 - 0x88280107, // 0010 GETMBR R10 R0 K7 - 0x7C1C0600, // 0011 CALL R7 3 - 0x90020E07, // 0012 SETMBR R0 K7 R7 - 0x8C1C0D08, // 0013 GETMET R7 R6 K8 - 0x5824000B, // 0014 LDCONST R9 K11 - 0x8828010A, // 0015 GETMBR R10 R0 K10 - 0x7C1C0600, // 0016 CALL R7 3 - 0x90021407, // 0017 SETMBR R0 K10 R7 - 0x601C0017, // 0018 GETGBL R7 G23 - 0x8C200D08, // 0019 GETMET R8 R6 K8 - 0x5828000C, // 001A LDCONST R10 K12 - 0x502C0000, // 001B LDBOOL R11 0 0 - 0x7C200600, // 001C CALL R8 3 - 0x7C1C0200, // 001D CALL R7 1 - 0x90021807, // 001E SETMBR R0 K12 R7 - 0x8C1C0D08, // 001F GETMET R7 R6 K8 - 0x5824000E, // 0020 LDCONST R9 K14 - 0x7C1C0400, // 0021 CALL R7 2 - 0x90021A07, // 0022 SETMBR R0 K13 R7 - 0x881C010D, // 0023 GETMBR R7 R0 K13 - 0x781E0004, // 0024 JMPF R7 #002A - 0x8C1C010F, // 0025 GETMET R7 R0 K15 - 0x8824010D, // 0026 GETMBR R9 R0 K13 - 0x7C1C0400, // 0027 CALL R7 2 - 0x501C0200, // 0028 LDBOOL R7 1 0 - 0x90022007, // 0029 SETMBR R0 K16 R7 - 0xA8040001, // 002A EXBLK 1 1 - 0x70020012, // 002B JMP #003F - 0xAC0C0002, // 002C CATCH R3 0 2 - 0x7002000F, // 002D JMP #003E - 0x20140711, // 002E NE R5 R3 K17 - 0x7816000C, // 002F JMPF R5 #003D - 0xB8162400, // 0030 GETNGBL R5 K18 - 0x8C140B13, // 0031 GETMET R5 R5 K19 - 0x601C0008, // 0032 GETGBL R7 G8 - 0x5C200600, // 0033 MOVE R8 R3 - 0x7C1C0200, // 0034 CALL R7 1 - 0x001E2807, // 0035 ADD R7 K20 R7 - 0x001C0F15, // 0036 ADD R7 R7 K21 - 0x60200008, // 0037 GETGBL R8 G8 - 0x5C240800, // 0038 MOVE R9 R4 - 0x7C200200, // 0039 CALL R8 1 - 0x001C0E08, // 003A ADD R7 R7 R8 - 0x58200016, // 003B LDCONST R8 K22 - 0x7C140600, // 003C CALL R5 3 - 0x70020000, // 003D JMP #003F - 0xB0080000, // 003E RAISE 2 R0 R0 - 0x500C0000, // 003F LDBOOL R3 0 0 - 0x88100107, // 0040 GETMBR R4 R0 K7 - 0x4C140000, // 0041 LDNIL R5 - 0x1C100805, // 0042 EQ R4 R4 R5 - 0x7812000A, // 0043 JMPF R4 #004F - 0x8C100517, // 0044 GETMET R4 R2 K23 - 0x58180016, // 0045 LDCONST R6 K22 - 0x7C100400, // 0046 CALL R4 2 - 0x8C100918, // 0047 GETMET R4 R4 K24 - 0x58180019, // 0048 LDCONST R6 K25 - 0x581C0016, // 0049 LDCONST R7 K22 - 0x7C100600, // 004A CALL R4 3 - 0x54160FFE, // 004B LDINT R5 4095 - 0x2C100805, // 004C AND R4 R4 R5 - 0x90020E04, // 004D SETMBR R0 K7 R4 - 0x500C0200, // 004E LDBOOL R3 1 0 - 0x8810010A, // 004F GETMBR R4 R0 K10 - 0x4C140000, // 0050 LDNIL R5 - 0x1C100805, // 0051 EQ R4 R4 R5 - 0x78120003, // 0052 JMPF R4 #0057 - 0x8C10011A, // 0053 GETMET R4 R0 K26 - 0x7C100200, // 0054 CALL R4 1 - 0x90021404, // 0055 SETMBR R0 K10 R4 - 0x500C0200, // 0056 LDBOOL R3 1 0 - 0x780E0001, // 0057 JMPF R3 #005A - 0x8C10011B, // 0058 GETMET R4 R0 K27 - 0x7C100200, // 0059 CALL R4 1 - 0x80000000, // 005A RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: init -********************************************************************/ -be_local_closure(Matter_Device_init, /* name */ - be_nested_proto( - 8, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 1, /* has sup protos */ - ( &(const struct bproto*[ 2]) { - be_nested_proto( - 4, /* nstack */ - 0, /* argc */ - 0, /* varg */ - 1, /* has upvals */ - ( &(const bupvaldesc[ 1]) { /* upvals */ - be_local_const_upval(1, 0), - }), - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 5]) { /* constants */ - /* K0 */ be_nested_str_weak(start), - /* K1 */ be_nested_str_weak(tasmota), - /* K2 */ be_nested_str_weak(remove_rule), - /* K3 */ be_nested_str_weak(Wifi_X23Connected), - /* K4 */ be_nested_str_weak(matter_start), - }), - be_str_weak(_anonymous_), - &be_const_str_solidified, - ( &(const binstruction[ 9]) { /* code */ - 0x68000000, // 0000 GETUPV R0 U0 - 0x8C000100, // 0001 GETMET R0 R0 K0 - 0x7C000200, // 0002 CALL R0 1 - 0xB8020200, // 0003 GETNGBL R0 K1 - 0x8C000102, // 0004 GETMET R0 R0 K2 - 0x58080003, // 0005 LDCONST R2 K3 - 0x580C0004, // 0006 LDCONST R3 K4 - 0x7C000600, // 0007 CALL R0 3 - 0x80000000, // 0008 RET 0 - }) - ), - be_nested_proto( - 4, /* nstack */ - 0, /* argc */ - 0, /* varg */ - 1, /* has upvals */ - ( &(const bupvaldesc[ 1]) { /* upvals */ - be_local_const_upval(1, 0), - }), - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 5]) { /* constants */ - /* K0 */ be_nested_str_weak(start), - /* K1 */ be_nested_str_weak(tasmota), - /* K2 */ be_nested_str_weak(remove_rule), - /* K3 */ be_nested_str_weak(Eth_X23Connected), - /* K4 */ be_nested_str_weak(matter_start), - }), - be_str_weak(_anonymous_), - &be_const_str_solidified, - ( &(const binstruction[ 9]) { /* code */ - 0x68000000, // 0000 GETUPV R0 U0 - 0x8C000100, // 0001 GETMET R0 R0 K0 - 0x7C000200, // 0002 CALL R0 1 - 0xB8020200, // 0003 GETNGBL R0 K1 - 0x8C000102, // 0004 GETMET R0 R0 K2 - 0x58080003, // 0005 LDCONST R2 K3 - 0x580C0004, // 0006 LDCONST R3 K4 - 0x7C000600, // 0007 CALL R0 3 - 0x80000000, // 0008 RET 0 - }) - ), - }), - 1, /* has constants */ - ( &(const bvalue[41]) { /* constants */ - /* K0 */ be_nested_str_weak(crypto), - /* K1 */ be_nested_str_weak(string), - /* K2 */ be_nested_str_weak(tasmota), - /* K3 */ be_nested_str_weak(get_option), - /* K4 */ be_nested_str_weak(matter), - /* K5 */ be_nested_str_weak(MATTER_OPTION), - /* K6 */ be_nested_str_weak(UI), - /* K7 */ be_nested_str_weak(started), - /* K8 */ be_nested_str_weak(tick), - /* K9 */ be_const_int(0), - /* K10 */ be_nested_str_weak(plugins), - /* K11 */ be_nested_str_weak(plugins_persist), - /* K12 */ be_nested_str_weak(plugins_classes), - /* K13 */ be_nested_str_weak(register_native_classes), - /* K14 */ be_nested_str_weak(vendorid), - /* K15 */ be_nested_str_weak(VENDOR_ID), - /* K16 */ be_nested_str_weak(productid), - /* K17 */ be_nested_str_weak(PRODUCT_ID), - /* K18 */ be_nested_str_weak(root_iterations), - /* K19 */ be_nested_str_weak(PBKDF_ITERATIONS), - /* K20 */ be_nested_str_weak(root_salt), - /* K21 */ be_nested_str_weak(random), - /* K22 */ be_nested_str_weak(ipv4only), - /* K23 */ be_nested_str_weak(load_param), - /* K24 */ be_nested_str_weak(sessions), - /* K25 */ be_nested_str_weak(Session_Store), - /* K26 */ be_nested_str_weak(load_fabrics), - /* K27 */ be_nested_str_weak(message_handler), - /* K28 */ be_nested_str_weak(MessageHandler), - /* K29 */ be_nested_str_weak(ui), - /* K30 */ be_nested_str_weak(wifi), - /* K31 */ be_nested_str_weak(up), - /* K32 */ be_nested_str_weak(eth), - /* K33 */ be_nested_str_weak(start), - /* K34 */ be_nested_str_weak(add_rule), - /* K35 */ be_nested_str_weak(Wifi_X23Connected), - /* K36 */ be_nested_str_weak(matter_start), - /* K37 */ be_nested_str_weak(Eth_X23Connected), - /* K38 */ be_nested_str_weak(_init_basic_commissioning), - /* K39 */ be_nested_str_weak(add_driver), - /* K40 */ be_nested_str_weak(register_commands), - }), - be_str_weak(init), - &be_const_str_solidified, - ( &(const binstruction[102]) { /* code */ - 0xA4060000, // 0000 IMPORT R1 K0 - 0xA40A0200, // 0001 IMPORT R2 K1 - 0xB80E0400, // 0002 GETNGBL R3 K2 - 0x8C0C0703, // 0003 GETMET R3 R3 K3 - 0xB8160800, // 0004 GETNGBL R5 K4 - 0x88140B05, // 0005 GETMBR R5 R5 K5 - 0x7C0C0400, // 0006 CALL R3 2 - 0x740E0004, // 0007 JMPT R3 #000D - 0xB80E0800, // 0008 GETNGBL R3 K4 - 0x8C0C0706, // 0009 GETMET R3 R3 K6 - 0x5C140000, // 000A MOVE R5 R0 - 0x7C0C0400, // 000B CALL R3 2 - 0x80000600, // 000C RET 0 - 0x500C0000, // 000D LDBOOL R3 0 0 - 0x90020E03, // 000E SETMBR R0 K7 R3 - 0x90021109, // 000F SETMBR R0 K8 K9 - 0x600C0012, // 0010 GETGBL R3 G18 - 0x7C0C0000, // 0011 CALL R3 0 - 0x90021403, // 0012 SETMBR R0 K10 R3 - 0x500C0000, // 0013 LDBOOL R3 0 0 - 0x90021603, // 0014 SETMBR R0 K11 R3 - 0x600C0013, // 0015 GETGBL R3 G19 - 0x7C0C0000, // 0016 CALL R3 0 - 0x90021803, // 0017 SETMBR R0 K12 R3 - 0x8C0C010D, // 0018 GETMET R3 R0 K13 - 0x7C0C0200, // 0019 CALL R3 1 - 0x880C010F, // 001A GETMBR R3 R0 K15 - 0x90021C03, // 001B SETMBR R0 K14 R3 - 0x880C0111, // 001C GETMBR R3 R0 K17 - 0x90022003, // 001D SETMBR R0 K16 R3 - 0x880C0113, // 001E GETMBR R3 R0 K19 - 0x90022403, // 001F SETMBR R0 K18 R3 - 0x8C0C0315, // 0020 GETMET R3 R1 K21 - 0x5416000F, // 0021 LDINT R5 16 - 0x7C0C0400, // 0022 CALL R3 2 - 0x90022803, // 0023 SETMBR R0 K20 R3 - 0x500C0000, // 0024 LDBOOL R3 0 0 - 0x90022C03, // 0025 SETMBR R0 K22 R3 - 0x8C0C0117, // 0026 GETMET R3 R0 K23 - 0x7C0C0200, // 0027 CALL R3 1 - 0xB80E0800, // 0028 GETNGBL R3 K4 - 0x8C0C0719, // 0029 GETMET R3 R3 K25 - 0x5C140000, // 002A MOVE R5 R0 - 0x7C0C0400, // 002B CALL R3 2 - 0x90023003, // 002C SETMBR R0 K24 R3 - 0x880C0118, // 002D GETMBR R3 R0 K24 - 0x8C0C071A, // 002E GETMET R3 R3 K26 - 0x7C0C0200, // 002F CALL R3 1 - 0xB80E0800, // 0030 GETNGBL R3 K4 - 0x8C0C071C, // 0031 GETMET R3 R3 K28 - 0x5C140000, // 0032 MOVE R5 R0 - 0x7C0C0400, // 0033 CALL R3 2 - 0x90023603, // 0034 SETMBR R0 K27 R3 - 0xB80E0800, // 0035 GETNGBL R3 K4 - 0x8C0C0706, // 0036 GETMET R3 R3 K6 - 0x5C140000, // 0037 MOVE R5 R0 - 0x7C0C0400, // 0038 CALL R3 2 - 0x90023A03, // 0039 SETMBR R0 K29 R3 - 0xB80E0400, // 003A GETNGBL R3 K2 - 0x8C0C071E, // 003B GETMET R3 R3 K30 - 0x7C0C0200, // 003C CALL R3 1 - 0x940C071F, // 003D GETIDX R3 R3 K31 - 0x740E0004, // 003E JMPT R3 #0044 - 0xB80E0400, // 003F GETNGBL R3 K2 - 0x8C0C0720, // 0040 GETMET R3 R3 K32 - 0x7C0C0200, // 0041 CALL R3 1 - 0x940C071F, // 0042 GETIDX R3 R3 K31 - 0x780E0001, // 0043 JMPF R3 #0046 - 0x8C0C0121, // 0044 GETMET R3 R0 K33 - 0x7C0C0200, // 0045 CALL R3 1 - 0xB80E0400, // 0046 GETNGBL R3 K2 - 0x8C0C071E, // 0047 GETMET R3 R3 K30 - 0x7C0C0200, // 0048 CALL R3 1 - 0x940C071F, // 0049 GETIDX R3 R3 K31 - 0x740E0005, // 004A JMPT R3 #0051 - 0xB80E0400, // 004B GETNGBL R3 K2 - 0x8C0C0722, // 004C GETMET R3 R3 K34 - 0x58140023, // 004D LDCONST R5 K35 - 0x84180000, // 004E CLOSURE R6 P0 - 0x581C0024, // 004F LDCONST R7 K36 - 0x7C0C0800, // 0050 CALL R3 4 - 0xB80E0400, // 0051 GETNGBL R3 K2 - 0x8C0C0720, // 0052 GETMET R3 R3 K32 - 0x7C0C0200, // 0053 CALL R3 1 - 0x940C071F, // 0054 GETIDX R3 R3 K31 - 0x740E0005, // 0055 JMPT R3 #005C - 0xB80E0400, // 0056 GETNGBL R3 K2 - 0x8C0C0722, // 0057 GETMET R3 R3 K34 - 0x58140025, // 0058 LDCONST R5 K37 - 0x84180001, // 0059 CLOSURE R6 P1 - 0x581C0024, // 005A LDCONST R7 K36 - 0x7C0C0800, // 005B CALL R3 4 - 0x8C0C0126, // 005C GETMET R3 R0 K38 - 0x7C0C0200, // 005D CALL R3 1 - 0xB80E0400, // 005E GETNGBL R3 K2 - 0x8C0C0727, // 005F GETMET R3 R3 K39 - 0x5C140000, // 0060 MOVE R5 R0 - 0x7C0C0400, // 0061 CALL R3 2 - 0x8C0C0128, // 0062 GETMET R3 R0 K40 - 0x7C0C0200, // 0063 CALL R3 1 - 0xA0000000, // 0064 CLOSE R0 - 0x80000000, // 0065 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: invoke_request -********************************************************************/ -be_local_closure(Matter_Device_invoke_request, /* name */ - be_nested_proto( - 12, /* nstack */ - 4, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 8]) { /* constants */ - /* K0 */ be_const_int(0), - /* K1 */ be_nested_str_weak(endpoint), - /* K2 */ be_nested_str_weak(plugins), - /* K3 */ be_nested_str_weak(invoke_request), - /* K4 */ be_const_int(1), - /* K5 */ be_nested_str_weak(status), - /* K6 */ be_nested_str_weak(matter), - /* K7 */ be_nested_str_weak(UNSUPPORTED_ENDPOINT), - }), - be_str_weak(invoke_request), - &be_const_str_solidified, - ( &(const binstruction[24]) { /* code */ - 0x58100000, // 0000 LDCONST R4 K0 - 0x88140701, // 0001 GETMBR R5 R3 K1 - 0x6018000C, // 0002 GETGBL R6 G12 - 0x881C0102, // 0003 GETMBR R7 R0 K2 - 0x7C180200, // 0004 CALL R6 1 - 0x14180806, // 0005 LT R6 R4 R6 - 0x781A000C, // 0006 JMPF R6 #0014 - 0x88180102, // 0007 GETMBR R6 R0 K2 - 0x94180C04, // 0008 GETIDX R6 R6 R4 - 0x881C0D01, // 0009 GETMBR R7 R6 K1 - 0x1C1C0E05, // 000A EQ R7 R7 R5 - 0x781E0005, // 000B JMPF R7 #0012 - 0x8C1C0D03, // 000C GETMET R7 R6 K3 - 0x5C240200, // 000D MOVE R9 R1 - 0x5C280400, // 000E MOVE R10 R2 - 0x5C2C0600, // 000F MOVE R11 R3 - 0x7C1C0800, // 0010 CALL R7 4 - 0x80040E00, // 0011 RET 1 R7 - 0x00100904, // 0012 ADD R4 R4 K4 - 0x7001FFED, // 0013 JMP #0002 - 0xB81A0C00, // 0014 GETNGBL R6 K6 - 0x88180D07, // 0015 GETMBR R6 R6 K7 - 0x900E0A06, // 0016 SETMBR R3 K5 R6 - 0x80000000, // 0017 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: event_fabrics_saved -********************************************************************/ -be_local_closure(Matter_Device_event_fabrics_saved, /* name */ - be_nested_proto( - 3, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 5]) { /* constants */ - /* K0 */ be_nested_str_weak(sessions), - /* K1 */ be_nested_str_weak(count_active_fabrics), - /* K2 */ be_const_int(0), - /* K3 */ be_nested_str_weak(plugins_persist), - /* K4 */ be_nested_str_weak(save_param), - }), - be_str_weak(event_fabrics_saved), - &be_const_str_solidified, - ( &(const binstruction[12]) { /* code */ - 0x88040100, // 0000 GETMBR R1 R0 K0 - 0x8C040301, // 0001 GETMET R1 R1 K1 - 0x7C040200, // 0002 CALL R1 1 - 0x24040302, // 0003 GT R1 R1 K2 - 0x78060005, // 0004 JMPF R1 #000B - 0x88040103, // 0005 GETMBR R1 R0 K3 - 0x74060003, // 0006 JMPT R1 #000B - 0x50040200, // 0007 LDBOOL R1 1 0 - 0x90020601, // 0008 SETMBR R0 K3 R1 - 0x8C040104, // 0009 GETMET R1 R0 K4 - 0x7C040200, // 000A CALL R1 1 - 0x80000000, // 000B RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: every_250ms -********************************************************************/ -be_local_closure(Matter_Device_every_250ms, /* name */ - be_nested_proto( - 4, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 5]) { /* constants */ - /* K0 */ be_nested_str_weak(message_handler), - /* K1 */ be_nested_str_weak(every_250ms), - /* K2 */ be_const_int(0), - /* K3 */ be_nested_str_weak(plugins), - /* K4 */ be_const_int(1), - }), - be_str_weak(every_250ms), - &be_const_str_solidified, - ( &(const binstruction[16]) { /* code */ - 0x88040100, // 0000 GETMBR R1 R0 K0 - 0x8C040301, // 0001 GETMET R1 R1 K1 - 0x7C040200, // 0002 CALL R1 1 - 0x58040002, // 0003 LDCONST R1 K2 - 0x6008000C, // 0004 GETGBL R2 G12 - 0x880C0103, // 0005 GETMBR R3 R0 K3 - 0x7C080200, // 0006 CALL R2 1 - 0x14080202, // 0007 LT R2 R1 R2 - 0x780A0005, // 0008 JMPF R2 #000F - 0x88080103, // 0009 GETMBR R2 R0 K3 - 0x94080401, // 000A GETIDX R2 R2 R1 - 0x8C080501, // 000B GETMET R2 R2 K1 - 0x7C080200, // 000C CALL R2 1 - 0x00040304, // 000D ADD R1 R1 K4 - 0x7001FFF4, // 000E JMP #0004 - 0x80000000, // 000F RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: msg_send -********************************************************************/ -be_local_closure(Matter_Device_msg_send, /* name */ - be_nested_proto( - 5, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 2]) { /* constants */ - /* K0 */ be_nested_str_weak(udp_server), - /* K1 */ be_nested_str_weak(send_UDP), - }), - be_str_weak(msg_send), - &be_const_str_solidified, - ( &(const binstruction[ 5]) { /* code */ - 0x88080100, // 0000 GETMBR R2 R0 K0 - 0x8C080501, // 0001 GETMET R2 R2 K1 - 0x5C100200, // 0002 MOVE R4 R1 - 0x7C080400, // 0003 CALL R2 2 - 0x80040400, // 0004 RET 1 R2 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: mdns_announce_op_discovery -********************************************************************/ -be_local_closure(Matter_Device_mdns_announce_op_discovery, /* name */ - be_nested_proto( - 15, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[29]) { /* constants */ - /* K0 */ be_nested_str_weak(mdns), - /* K1 */ be_nested_str_weak(string), - /* K2 */ be_nested_str_weak(get_device_id), - /* K3 */ be_nested_str_weak(copy), - /* K4 */ be_nested_str_weak(reverse), - /* K5 */ be_nested_str_weak(get_fabric_compressed), - /* K6 */ be_nested_str_weak(tohex), - /* K7 */ be_nested_str_weak(_X2D), - /* K8 */ be_nested_str_weak(tasmota), - /* K9 */ be_nested_str_weak(log), - /* K10 */ be_nested_str_weak(MTR_X3A_X20Operational_X20Discovery_X20node_X20_X3D_X20), - /* K11 */ be_const_int(2), - /* K12 */ be_nested_str_weak(eth), - /* K13 */ be_nested_str_weak(find), - /* K14 */ be_nested_str_weak(up), - /* K15 */ be_nested_str_weak(format), - /* K16 */ be_nested_str_weak(MTR_X3A_X20adding_X20mDNS_X20on_X20_X25s_X20_X27_X25s_X27_X20ptr_X20to_X20_X60_X25s_X2Elocal_X60), - /* K17 */ be_nested_str_weak(hostname_eth), - /* K18 */ be_const_int(3), - /* K19 */ be_nested_str_weak(add_service), - /* K20 */ be_nested_str_weak(_matter), - /* K21 */ be_nested_str_weak(_tcp), - /* K22 */ be_nested_str_weak(_I), - /* K23 */ be_nested_str_weak(MTR_X3A_X20adding_X20subtype_X3A_X20), - /* K24 */ be_nested_str_weak(add_subtype), - /* K25 */ be_nested_str_weak(wifi), - /* K26 */ be_nested_str_weak(hostname_wifi), - /* K27 */ be_nested_str_weak(MTR_X3A_X20Exception), - /* K28 */ be_nested_str_weak(_X7C), - }), - be_str_weak(mdns_announce_op_discovery), - &be_const_str_solidified, - ( &(const binstruction[122]) { /* code */ - 0xA40A0000, // 0000 IMPORT R2 K0 - 0xA40E0200, // 0001 IMPORT R3 K1 - 0xA8020064, // 0002 EXBLK 0 #0068 - 0x8C100302, // 0003 GETMET R4 R1 K2 - 0x7C100200, // 0004 CALL R4 1 - 0x8C100903, // 0005 GETMET R4 R4 K3 - 0x7C100200, // 0006 CALL R4 1 - 0x8C100904, // 0007 GETMET R4 R4 K4 - 0x7C100200, // 0008 CALL R4 1 - 0x8C140305, // 0009 GETMET R5 R1 K5 - 0x7C140200, // 000A CALL R5 1 - 0x8C180B06, // 000B GETMET R6 R5 K6 - 0x7C180200, // 000C CALL R6 1 - 0x00180D07, // 000D ADD R6 R6 K7 - 0x8C1C0906, // 000E GETMET R7 R4 K6 - 0x7C1C0200, // 000F CALL R7 1 - 0x00180C07, // 0010 ADD R6 R6 R7 - 0xB81E1000, // 0011 GETNGBL R7 K8 - 0x8C1C0F09, // 0012 GETMET R7 R7 K9 - 0x00261406, // 0013 ADD R9 K10 R6 - 0x5828000B, // 0014 LDCONST R10 K11 - 0x7C1C0600, // 0015 CALL R7 3 - 0xB81E1000, // 0016 GETNGBL R7 K8 - 0x8C1C0F0C, // 0017 GETMET R7 R7 K12 - 0x7C1C0200, // 0018 CALL R7 1 - 0x8C1C0F0D, // 0019 GETMET R7 R7 K13 - 0x5824000E, // 001A LDCONST R9 K14 - 0x7C1C0400, // 001B CALL R7 2 - 0x781E0020, // 001C JMPF R7 #003E - 0xB81E1000, // 001D GETNGBL R7 K8 - 0x8C1C0F09, // 001E GETMET R7 R7 K9 - 0x8C24070F, // 001F GETMET R9 R3 K15 - 0x582C0010, // 0020 LDCONST R11 K16 - 0x5830000C, // 0021 LDCONST R12 K12 - 0x5C340C00, // 0022 MOVE R13 R6 - 0x88380111, // 0023 GETMBR R14 R0 K17 - 0x7C240A00, // 0024 CALL R9 5 - 0x58280012, // 0025 LDCONST R10 K18 - 0x7C1C0600, // 0026 CALL R7 3 - 0x8C1C0513, // 0027 GETMET R7 R2 K19 - 0x58240014, // 0028 LDCONST R9 K20 - 0x58280015, // 0029 LDCONST R10 K21 - 0x542E15A3, // 002A LDINT R11 5540 - 0x4C300000, // 002B LDNIL R12 - 0x5C340C00, // 002C MOVE R13 R6 - 0x88380111, // 002D GETMBR R14 R0 K17 - 0x7C1C0E00, // 002E CALL R7 7 - 0x8C1C0B06, // 002F GETMET R7 R5 K6 - 0x7C1C0200, // 0030 CALL R7 1 - 0x001E2C07, // 0031 ADD R7 K22 R7 - 0xB8221000, // 0032 GETNGBL R8 K8 - 0x8C201109, // 0033 GETMET R8 R8 K9 - 0x002A2E07, // 0034 ADD R10 K23 R7 - 0x582C0012, // 0035 LDCONST R11 K18 - 0x7C200600, // 0036 CALL R8 3 - 0x8C200518, // 0037 GETMET R8 R2 K24 - 0x58280014, // 0038 LDCONST R10 K20 - 0x582C0015, // 0039 LDCONST R11 K21 - 0x5C300C00, // 003A MOVE R12 R6 - 0x88340111, // 003B GETMBR R13 R0 K17 - 0x5C380E00, // 003C MOVE R14 R7 - 0x7C200C00, // 003D CALL R8 6 - 0xB81E1000, // 003E GETNGBL R7 K8 - 0x8C1C0F19, // 003F GETMET R7 R7 K25 - 0x7C1C0200, // 0040 CALL R7 1 - 0x8C1C0F0D, // 0041 GETMET R7 R7 K13 - 0x5824000E, // 0042 LDCONST R9 K14 - 0x7C1C0400, // 0043 CALL R7 2 - 0x781E0020, // 0044 JMPF R7 #0066 - 0xB81E1000, // 0045 GETNGBL R7 K8 - 0x8C1C0F09, // 0046 GETMET R7 R7 K9 - 0x8C24070F, // 0047 GETMET R9 R3 K15 - 0x582C0010, // 0048 LDCONST R11 K16 - 0x58300019, // 0049 LDCONST R12 K25 - 0x5C340C00, // 004A MOVE R13 R6 - 0x8838011A, // 004B GETMBR R14 R0 K26 - 0x7C240A00, // 004C CALL R9 5 - 0x58280012, // 004D LDCONST R10 K18 - 0x7C1C0600, // 004E CALL R7 3 - 0x8C1C0513, // 004F GETMET R7 R2 K19 - 0x58240014, // 0050 LDCONST R9 K20 - 0x58280015, // 0051 LDCONST R10 K21 - 0x542E15A3, // 0052 LDINT R11 5540 - 0x4C300000, // 0053 LDNIL R12 - 0x5C340C00, // 0054 MOVE R13 R6 - 0x8838011A, // 0055 GETMBR R14 R0 K26 - 0x7C1C0E00, // 0056 CALL R7 7 - 0x8C1C0B06, // 0057 GETMET R7 R5 K6 - 0x7C1C0200, // 0058 CALL R7 1 - 0x001E2C07, // 0059 ADD R7 K22 R7 - 0xB8221000, // 005A GETNGBL R8 K8 - 0x8C201109, // 005B GETMET R8 R8 K9 - 0x002A2E07, // 005C ADD R10 K23 R7 - 0x582C0012, // 005D LDCONST R11 K18 - 0x7C200600, // 005E CALL R8 3 - 0x8C200518, // 005F GETMET R8 R2 K24 - 0x58280014, // 0060 LDCONST R10 K20 - 0x582C0015, // 0061 LDCONST R11 K21 - 0x5C300C00, // 0062 MOVE R12 R6 - 0x8834011A, // 0063 GETMBR R13 R0 K26 - 0x5C380E00, // 0064 MOVE R14 R7 - 0x7C200C00, // 0065 CALL R8 6 - 0xA8040001, // 0066 EXBLK 1 1 - 0x70020010, // 0067 JMP #0079 - 0xAC100002, // 0068 CATCH R4 0 2 - 0x7002000D, // 0069 JMP #0078 - 0xB81A1000, // 006A GETNGBL R6 K8 - 0x8C180D09, // 006B GETMET R6 R6 K9 - 0x60200008, // 006C GETGBL R8 G8 - 0x5C240800, // 006D MOVE R9 R4 - 0x7C200200, // 006E CALL R8 1 - 0x00223608, // 006F ADD R8 K27 R8 - 0x0020111C, // 0070 ADD R8 R8 K28 - 0x60240008, // 0071 GETGBL R9 G8 - 0x5C280A00, // 0072 MOVE R10 R5 - 0x7C240200, // 0073 CALL R9 1 - 0x00201009, // 0074 ADD R8 R8 R9 - 0x5824000B, // 0075 LDCONST R9 K11 - 0x7C180600, // 0076 CALL R6 3 - 0x70020000, // 0077 JMP #0079 - 0xB0080000, // 0078 RAISE 2 R0 R0 - 0x80000000, // 0079 RET 0 - }) - ) -); -/*******************************************************************/ - - /******************************************************************** ** Solidified function: process_attribute_expansion ********************************************************************/ @@ -3722,169 +1202,30 @@ be_local_closure(Matter_Device_process_attribute_expansion, /* name */ /******************************************************************** -** Solidified function: is_commissioning_open +** Solidified function: received_ack ********************************************************************/ -be_local_closure(Matter_Device_is_commissioning_open, /* name */ +be_local_closure(Matter_Device_received_ack, /* name */ be_nested_proto( - 3, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 1]) { /* constants */ - /* K0 */ be_nested_str_weak(commissioning_open), - }), - be_str_weak(is_commissioning_open), - &be_const_str_solidified, - ( &(const binstruction[ 4]) { /* code */ - 0x88040100, // 0000 GETMBR R1 R0 K0 - 0x4C080000, // 0001 LDNIL R2 - 0x20040202, // 0002 NE R1 R1 R2 - 0x80040200, // 0003 RET 1 R1 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: start_commissioning_complete_deferred -********************************************************************/ -be_local_closure(Matter_Device_start_commissioning_complete_deferred, /* name */ - be_nested_proto( - 6, /* nstack */ + 5, /* nstack */ 2, /* argc */ 2, /* varg */ 0, /* has upvals */ NULL, /* no upvals */ - 1, /* has sup protos */ - ( &(const struct bproto*[ 1]) { - be_nested_proto( - 3, /* nstack */ - 0, /* argc */ - 0, /* varg */ - 1, /* has upvals */ - ( &(const bupvaldesc[ 2]) { /* upvals */ - be_local_const_upval(1, 0), - be_local_const_upval(1, 1), - }), - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 1]) { /* constants */ - /* K0 */ be_nested_str_weak(start_commissioning_complete), - }), - be_str_weak(_X3Clambda_X3E), - &be_const_str_solidified, - ( &(const binstruction[ 5]) { /* code */ - 0x68000000, // 0000 GETUPV R0 U0 - 0x8C000100, // 0001 GETMET R0 R0 K0 - 0x68080001, // 0002 GETUPV R2 U1 - 0x7C000400, // 0003 CALL R0 2 - 0x80040000, // 0004 RET 1 R0 - }) - ), - }), - 1, /* has constants */ - ( &(const bvalue[ 3]) { /* constants */ - /* K0 */ be_nested_str_weak(tasmota), - /* K1 */ be_nested_str_weak(set_timer), - /* K2 */ be_const_int(0), - }), - be_str_weak(start_commissioning_complete_deferred), - &be_const_str_solidified, - ( &(const binstruction[ 7]) { /* code */ - 0xB80A0000, // 0000 GETNGBL R2 K0 - 0x8C080501, // 0001 GETMET R2 R2 K1 - 0x58100002, // 0002 LDCONST R4 K2 - 0x84140000, // 0003 CLOSURE R5 P0 - 0x7C080600, // 0004 CALL R2 3 - 0xA0000000, // 0005 CLOSE R0 - 0x80000000, // 0006 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: start_operational_discovery -********************************************************************/ -be_local_closure(Matter_Device_start_operational_discovery, /* name */ - be_nested_proto( - 8, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 7]) { /* constants */ - /* K0 */ be_nested_str_weak(crypto), - /* K1 */ be_nested_str_weak(mdns), - /* K2 */ be_nested_str_weak(string), - /* K3 */ be_nested_str_weak(stop_basic_commissioning), - /* K4 */ be_nested_str_weak(root_w0), - /* K5 */ be_nested_str_weak(root_L), - /* K6 */ be_nested_str_weak(mdns_announce_op_discovery), - }), - be_str_weak(start_operational_discovery), - &be_const_str_solidified, - ( &(const binstruction[13]) { /* code */ - 0xA40A0000, // 0000 IMPORT R2 K0 - 0xA40E0200, // 0001 IMPORT R3 K1 - 0xA4120400, // 0002 IMPORT R4 K2 - 0x8C140103, // 0003 GETMET R5 R0 K3 - 0x7C140200, // 0004 CALL R5 1 - 0x4C140000, // 0005 LDNIL R5 - 0x90020805, // 0006 SETMBR R0 K4 R5 - 0x4C140000, // 0007 LDNIL R5 - 0x90020A05, // 0008 SETMBR R0 K5 R5 - 0x8C140106, // 0009 GETMET R5 R0 K6 - 0x5C1C0200, // 000A MOVE R7 R1 - 0x7C140400, // 000B CALL R5 2 - 0x80000000, // 000C RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: is_root_commissioning_open -********************************************************************/ -be_local_closure(Matter_Device_is_root_commissioning_open, /* name */ - be_nested_proto( - 3, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ ( &(const bvalue[ 2]) { /* constants */ - /* K0 */ be_nested_str_weak(commissioning_open), - /* K1 */ be_nested_str_weak(commissioning_admin_fabric), + /* K0 */ be_nested_str_weak(udp_server), + /* K1 */ be_nested_str_weak(received_ack), }), - be_str_weak(is_root_commissioning_open), + be_str_weak(received_ack), &be_const_str_solidified, - ( &(const binstruction[11]) { /* code */ - 0x88040100, // 0000 GETMBR R1 R0 K0 - 0x4C080000, // 0001 LDNIL R2 - 0x20040202, // 0002 NE R1 R1 R2 - 0x78060003, // 0003 JMPF R1 #0008 - 0x88040101, // 0004 GETMBR R1 R0 K1 - 0x4C080000, // 0005 LDNIL R2 - 0x1C040202, // 0006 EQ R1 R1 R2 - 0x74060000, // 0007 JMPT R1 #0009 - 0x50040001, // 0008 LDBOOL R1 0 1 - 0x50040200, // 0009 LDBOOL R1 1 0 - 0x80040200, // 000A RET 1 R1 + ( &(const binstruction[ 5]) { /* code */ + 0x88080100, // 0000 GETMBR R2 R0 K0 + 0x8C080501, // 0001 GETMET R2 R2 K1 + 0x5C100200, // 0002 MOVE R4 R1 + 0x7C080400, // 0003 CALL R2 2 + 0x80040400, // 0004 RET 1 R2 }) ) ); @@ -3892,150 +1233,81 @@ be_local_closure(Matter_Device_is_root_commissioning_open, /* name */ /******************************************************************** -** Solidified function: register_plugin_class +** Solidified function: sort_distinct ********************************************************************/ -be_local_closure(Matter_Device_register_plugin_class, /* name */ - be_nested_proto( - 7, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 4]) { /* constants */ - /* K0 */ be_nested_str_weak(introspect), - /* K1 */ be_nested_str_weak(get), - /* K2 */ be_nested_str_weak(TYPE), - /* K3 */ be_nested_str_weak(plugins_classes), - }), - be_str_weak(register_plugin_class), - &be_const_str_solidified, - ( &(const binstruction[ 9]) { /* code */ - 0xA40A0000, // 0000 IMPORT R2 K0 - 0x8C0C0501, // 0001 GETMET R3 R2 K1 - 0x5C140200, // 0002 MOVE R5 R1 - 0x58180002, // 0003 LDCONST R6 K2 - 0x7C0C0600, // 0004 CALL R3 3 - 0x780E0001, // 0005 JMPF R3 #0008 - 0x88100103, // 0006 GETMBR R4 R0 K3 - 0x98100601, // 0007 SETIDX R4 R3 R1 - 0x80000000, // 0008 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: MtrJoin -********************************************************************/ -be_local_closure(Matter_Device_MtrJoin, /* name */ - be_nested_proto( - 8, /* nstack */ - 5, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 4]) { /* constants */ - /* K0 */ be_nested_str_weak(start_root_basic_commissioning), - /* K1 */ be_nested_str_weak(stop_basic_commissioning), - /* K2 */ be_nested_str_weak(tasmota), - /* K3 */ be_nested_str_weak(resp_cmnd_done), - }), - be_str_weak(MtrJoin), - &be_const_str_solidified, - ( &(const binstruction[13]) { /* code */ - 0x60140009, // 0000 GETGBL R5 G9 - 0x5C180600, // 0001 MOVE R6 R3 - 0x7C140200, // 0002 CALL R5 1 - 0x78160002, // 0003 JMPF R5 #0007 - 0x8C180100, // 0004 GETMET R6 R0 K0 - 0x7C180200, // 0005 CALL R6 1 - 0x70020001, // 0006 JMP #0009 - 0x8C180101, // 0007 GETMET R6 R0 K1 - 0x7C180200, // 0008 CALL R6 1 - 0xB81A0400, // 0009 GETNGBL R6 K2 - 0x8C180D03, // 000A GETMET R6 R6 K3 - 0x7C180200, // 000B CALL R6 1 - 0x80000000, // 000C RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: autoconf_device -********************************************************************/ -be_local_closure(Matter_Device_autoconf_device, /* name */ +be_local_closure(Matter_Device_sort_distinct, /* name */ be_nested_proto( 7, /* nstack */ 1, /* argc */ - 2, /* varg */ + 4, /* varg */ 0, /* has upvals */ NULL, /* no upvals */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[15]) { /* constants */ - /* K0 */ be_nested_str_weak(string), - /* K1 */ be_nested_str_weak(json), - /* K2 */ be_nested_str_weak(plugins), - /* K3 */ be_const_int(0), - /* K4 */ be_nested_str_weak(plugins_config), - /* K5 */ be_nested_str_weak(autoconf_device_map), - /* K6 */ be_nested_str_weak(tasmota), - /* K7 */ be_nested_str_weak(log), - /* K8 */ be_nested_str_weak(MTR_X3A_X20autoconfig_X20_X3D_X20), - /* K9 */ be_const_int(3), - /* K10 */ be_nested_str_weak(_load_plugins_config), - /* K11 */ be_nested_str_weak(plugins_persist), - /* K12 */ be_nested_str_weak(sessions), - /* K13 */ be_nested_str_weak(count_active_fabrics), - /* K14 */ be_nested_str_weak(save_param), + ( &(const bvalue[ 5]) { /* constants */ + /* K0 */ be_const_class(be_class_Matter_Device), + /* K1 */ be_const_int(1), + /* K2 */ be_const_int(0), + /* K3 */ be_nested_str_weak(stop_iteration), + /* K4 */ be_nested_str_weak(remove), }), - be_str_weak(autoconf_device), + be_str_weak(sort_distinct), &be_const_str_solidified, - ( &(const binstruction[34]) { /* code */ - 0xA4060000, // 0000 IMPORT R1 K0 - 0xA40A0200, // 0001 IMPORT R2 K1 + ( &(const binstruction[53]) { /* code */ + 0x58040000, // 0000 LDCONST R1 K0 + 0x60080010, // 0001 GETGBL R2 G16 0x600C000C, // 0002 GETGBL R3 G12 - 0x88100102, // 0003 GETMBR R4 R0 K2 + 0x5C100000, // 0003 MOVE R4 R0 0x7C0C0200, // 0004 CALL R3 1 - 0x240C0703, // 0005 GT R3 R3 K3 - 0x780E0000, // 0006 JMPF R3 #0008 - 0x80000600, // 0007 RET 0 - 0x8C0C0105, // 0008 GETMET R3 R0 K5 - 0x7C0C0200, // 0009 CALL R3 1 - 0x90020803, // 000A SETMBR R0 K4 R3 - 0xB80E0C00, // 000B GETNGBL R3 K6 - 0x8C0C0707, // 000C GETMET R3 R3 K7 - 0x60140008, // 000D GETGBL R5 G8 - 0x88180104, // 000E GETMBR R6 R0 K4 - 0x7C140200, // 000F CALL R5 1 - 0x00161005, // 0010 ADD R5 K8 R5 - 0x58180009, // 0011 LDCONST R6 K9 - 0x7C0C0600, // 0012 CALL R3 3 - 0x8C0C010A, // 0013 GETMET R3 R0 K10 - 0x88140104, // 0014 GETMBR R5 R0 K4 - 0x7C0C0400, // 0015 CALL R3 2 - 0x880C010B, // 0016 GETMBR R3 R0 K11 - 0x740E0008, // 0017 JMPT R3 #0021 - 0x880C010C, // 0018 GETMBR R3 R0 K12 - 0x8C0C070D, // 0019 GETMET R3 R3 K13 - 0x7C0C0200, // 001A CALL R3 1 - 0x240C0703, // 001B GT R3 R3 K3 - 0x780E0003, // 001C JMPF R3 #0021 - 0x500C0200, // 001D LDBOOL R3 1 0 - 0x90021603, // 001E SETMBR R0 K11 R3 - 0x8C0C010E, // 001F GETMET R3 R0 K14 + 0x040C0701, // 0005 SUB R3 R3 K1 + 0x400E0203, // 0006 CONNECT R3 K1 R3 + 0x7C080200, // 0007 CALL R2 1 + 0xA8020010, // 0008 EXBLK 0 #001A + 0x5C0C0400, // 0009 MOVE R3 R2 + 0x7C0C0000, // 000A CALL R3 0 + 0x94100003, // 000B GETIDX R4 R0 R3 + 0x5C140600, // 000C MOVE R5 R3 + 0x24180B02, // 000D GT R6 R5 K2 + 0x781A0008, // 000E JMPF R6 #0018 + 0x04180B01, // 000F SUB R6 R5 K1 + 0x94180006, // 0010 GETIDX R6 R0 R6 + 0x24180C04, // 0011 GT R6 R6 R4 + 0x781A0004, // 0012 JMPF R6 #0018 + 0x04180B01, // 0013 SUB R6 R5 K1 + 0x94180006, // 0014 GETIDX R6 R0 R6 + 0x98000A06, // 0015 SETIDX R0 R5 R6 + 0x04140B01, // 0016 SUB R5 R5 K1 + 0x7001FFF4, // 0017 JMP #000D + 0x98000A04, // 0018 SETIDX R0 R5 R4 + 0x7001FFEE, // 0019 JMP #0009 + 0x58080003, // 001A LDCONST R2 K3 + 0xAC080200, // 001B CATCH R2 1 0 + 0xB0080000, // 001C RAISE 2 R0 R0 + 0x58080001, // 001D LDCONST R2 K1 + 0x600C000C, // 001E GETGBL R3 G12 + 0x5C100000, // 001F MOVE R4 R0 0x7C0C0200, // 0020 CALL R3 1 - 0x80000000, // 0021 RET 0 + 0x180C0701, // 0021 LE R3 R3 K1 + 0x780E0000, // 0022 JMPF R3 #0024 + 0x80040000, // 0023 RET 1 R0 + 0x940C0102, // 0024 GETIDX R3 R0 K2 + 0x6010000C, // 0025 GETGBL R4 G12 + 0x5C140000, // 0026 MOVE R5 R0 + 0x7C100200, // 0027 CALL R4 1 + 0x14100404, // 0028 LT R4 R2 R4 + 0x78120009, // 0029 JMPF R4 #0034 + 0x94100002, // 002A GETIDX R4 R0 R2 + 0x1C100803, // 002B EQ R4 R4 R3 + 0x78120003, // 002C JMPF R4 #0031 + 0x8C100104, // 002D GETMET R4 R0 K4 + 0x5C180400, // 002E MOVE R6 R2 + 0x7C100400, // 002F CALL R4 2 + 0x70020001, // 0030 JMP #0033 + 0x940C0002, // 0031 GETIDX R3 R0 R2 + 0x00080501, // 0032 ADD R2 R2 K1 + 0x7001FFF0, // 0033 JMP #0025 + 0x80040000, // 0034 RET 1 R0 }) ) ); @@ -4043,512 +1315,55 @@ be_local_closure(Matter_Device_autoconf_device, /* name */ /******************************************************************** -** Solidified function: stop +** Solidified function: invoke_request ********************************************************************/ -be_local_closure(Matter_Device_stop, /* name */ +be_local_closure(Matter_Device_invoke_request, /* name */ be_nested_proto( - 4, /* nstack */ - 1, /* argc */ + 12, /* nstack */ + 4, /* argc */ 2, /* varg */ 0, /* has upvals */ NULL, /* no upvals */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[ 4]) { /* constants */ - /* K0 */ be_nested_str_weak(tasmota), - /* K1 */ be_nested_str_weak(remove_driver), - /* K2 */ be_nested_str_weak(udp_server), - /* K3 */ be_nested_str_weak(stop), + ( &(const bvalue[ 8]) { /* constants */ + /* K0 */ be_const_int(0), + /* K1 */ be_nested_str_weak(endpoint), + /* K2 */ be_nested_str_weak(plugins), + /* K3 */ be_nested_str_weak(invoke_request), + /* K4 */ be_const_int(1), + /* K5 */ be_nested_str_weak(status), + /* K6 */ be_nested_str_weak(matter), + /* K7 */ be_nested_str_weak(UNSUPPORTED_ENDPOINT), }), - be_str_weak(stop), + be_str_weak(invoke_request), &be_const_str_solidified, - ( &(const binstruction[10]) { /* code */ - 0xB8060000, // 0000 GETNGBL R1 K0 - 0x8C040301, // 0001 GETMET R1 R1 K1 - 0x5C0C0000, // 0002 MOVE R3 R0 - 0x7C040400, // 0003 CALL R1 2 - 0x88040102, // 0004 GETMBR R1 R0 K2 - 0x78060002, // 0005 JMPF R1 #0009 - 0x88040102, // 0006 GETMBR R1 R0 K2 - 0x8C040303, // 0007 GETMET R1 R1 K3 - 0x7C040200, // 0008 CALL R1 1 - 0x80000000, // 0009 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: autoconf_device_map -********************************************************************/ -be_local_closure(Matter_Device_autoconf_device_map, /* name */ - be_nested_proto( - 22, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[51]) { /* constants */ - /* K0 */ be_nested_str_weak(string), - /* K1 */ be_nested_str_weak(json), - /* K2 */ be_const_int(1), - /* K3 */ be_nested_str_weak(light), - /* K4 */ be_nested_str_weak(get), - /* K5 */ be_nested_str_weak(find), - /* K6 */ be_nested_str_weak(channels), - /* K7 */ be_nested_str_weak(), - /* K8 */ be_const_int(0), - /* K9 */ be_nested_str_weak(type), - /* K10 */ be_nested_str_weak(light1), - /* K11 */ be_const_int(2), - /* K12 */ be_nested_str_weak(light2), - /* K13 */ be_nested_str_weak(light3), - /* K14 */ be_nested_str_weak(tasmota), - /* K15 */ be_nested_str_weak(cmd), - /* K16 */ be_nested_str_weak(Status_X2013), - /* K17 */ be_nested_str_weak(log), - /* K18 */ be_nested_str_weak(MTR_X3A_X20Status_X2013_X20_X3D_X20), - /* K19 */ be_const_int(3), - /* K20 */ be_nested_str_weak(contains), - /* K21 */ be_nested_str_weak(StatusSHT), - /* K22 */ be_nested_str_weak(SHT), - /* K23 */ be_nested_str_weak(format), - /* K24 */ be_nested_str_weak(MTR_X3A_X20_X27_X25s_X27_X20_X3D_X20_X25s), - /* K25 */ be_nested_str_weak(Relay1), - /* K26 */ be_nested_str_weak(Relay2), - /* K27 */ be_nested_str_weak(push), - /* K28 */ be_nested_str_weak(MTR_X3A_X20relay1_X20_X3D_X20_X25s_X2C_X20relay2_X20_X3D_X20_X25s), - /* K29 */ be_nested_str_weak(TiltConfig), - /* K30 */ be_nested_str_weak(shutter_X2Btilt), - /* K31 */ be_nested_str_weak(shutter), - /* K32 */ be_nested_str_weak(get_power), - /* K33 */ be_nested_str_weak(relay), - /* K34 */ be_nested_str_weak(load), - /* K35 */ be_nested_str_weak(read_sensors), - /* K36 */ be_nested_str_weak(k2l), - /* K37 */ be_nested_str_weak(Temperature), - /* K38 */ be_nested_str_weak(_X23Temperature), - /* K39 */ be_nested_str_weak(temperature), - /* K40 */ be_nested_str_weak(filter), - /* K41 */ be_nested_str_weak(stop_iteration), - /* K42 */ be_nested_str_weak(Pressure), - /* K43 */ be_nested_str_weak(_X23Pressure), - /* K44 */ be_nested_str_weak(pressure), - /* K45 */ be_nested_str_weak(Illuminance), - /* K46 */ be_nested_str_weak(_X23Illuminance), - /* K47 */ be_nested_str_weak(illuminance), - /* K48 */ be_nested_str_weak(Humidity), - /* K49 */ be_nested_str_weak(_X23Humidity), - /* K50 */ be_nested_str_weak(humidity), - }), - be_str_weak(autoconf_device_map), - &be_const_str_solidified, - ( &(const binstruction[338]) { /* code */ - 0xA4060000, // 0000 IMPORT R1 K0 - 0xA40A0200, // 0001 IMPORT R2 K1 - 0x600C0013, // 0002 GETGBL R3 G19 - 0x7C0C0000, // 0003 CALL R3 0 - 0x58100002, // 0004 LDCONST R4 K2 - 0x50140000, // 0005 LDBOOL R5 0 0 - 0xA41A0600, // 0006 IMPORT R6 K3 - 0x8C1C0D04, // 0007 GETMET R7 R6 K4 - 0x7C1C0200, // 0008 CALL R7 1 - 0x4C200000, // 0009 LDNIL R8 - 0x20200E08, // 000A NE R8 R7 R8 - 0x78220024, // 000B JMPF R8 #0031 - 0x6020000C, // 000C GETGBL R8 G12 - 0x8C240F05, // 000D GETMET R9 R7 K5 - 0x582C0006, // 000E LDCONST R11 K6 - 0x58300007, // 000F LDCONST R12 K7 - 0x7C240600, // 0010 CALL R9 3 - 0x7C200200, // 0011 CALL R8 1 - 0x24241108, // 0012 GT R9 R8 K8 - 0x7826001C, // 0013 JMPF R9 #0031 - 0x1C241102, // 0014 EQ R9 R8 K2 - 0x78260007, // 0015 JMPF R9 #001E - 0x60240008, // 0016 GETGBL R9 G8 - 0x5C280800, // 0017 MOVE R10 R4 - 0x7C240200, // 0018 CALL R9 1 - 0x60280013, // 0019 GETGBL R10 G19 - 0x7C280000, // 001A CALL R10 0 - 0x982A130A, // 001B SETIDX R10 K9 K10 - 0x980C120A, // 001C SETIDX R3 R9 R10 - 0x70020010, // 001D JMP #002F - 0x1C24110B, // 001E EQ R9 R8 K11 - 0x78260007, // 001F JMPF R9 #0028 - 0x60240008, // 0020 GETGBL R9 G8 - 0x5C280800, // 0021 MOVE R10 R4 - 0x7C240200, // 0022 CALL R9 1 - 0x60280013, // 0023 GETGBL R10 G19 - 0x7C280000, // 0024 CALL R10 0 - 0x982A130C, // 0025 SETIDX R10 K9 K12 - 0x980C120A, // 0026 SETIDX R3 R9 R10 - 0x70020006, // 0027 JMP #002F - 0x60240008, // 0028 GETGBL R9 G8 - 0x5C280800, // 0029 MOVE R10 R4 - 0x7C240200, // 002A CALL R9 1 - 0x60280013, // 002B GETGBL R10 G19 - 0x7C280000, // 002C CALL R10 0 - 0x982A130D, // 002D SETIDX R10 K9 K13 - 0x980C120A, // 002E SETIDX R3 R9 R10 - 0x50140200, // 002F LDBOOL R5 1 0 - 0x00100902, // 0030 ADD R4 R4 K2 - 0xB8221C00, // 0031 GETNGBL R8 K14 - 0x8C20110F, // 0032 GETMET R8 R8 K15 - 0x58280010, // 0033 LDCONST R10 K16 - 0x502C0200, // 0034 LDBOOL R11 1 0 - 0x7C200600, // 0035 CALL R8 3 - 0x60240012, // 0036 GETGBL R9 G18 - 0x7C240000, // 0037 CALL R9 0 - 0xB82A1C00, // 0038 GETNGBL R10 K14 - 0x8C281511, // 0039 GETMET R10 R10 K17 - 0x60300008, // 003A GETGBL R12 G8 - 0x5C341000, // 003B MOVE R13 R8 - 0x7C300200, // 003C CALL R12 1 - 0x0032240C, // 003D ADD R12 K18 R12 - 0x58340013, // 003E LDCONST R13 K19 - 0x7C280600, // 003F CALL R10 3 - 0x4C280000, // 0040 LDNIL R10 - 0x2028100A, // 0041 NE R10 R8 R10 - 0x782A0051, // 0042 JMPF R10 #0095 - 0x8C281114, // 0043 GETMET R10 R8 K20 - 0x58300015, // 0044 LDCONST R12 K21 - 0x7C280400, // 0045 CALL R10 2 - 0x782A004D, // 0046 JMPF R10 #0095 - 0x94201115, // 0047 GETIDX R8 R8 K21 - 0x58280008, // 0048 LDCONST R10 K8 - 0x502C0200, // 0049 LDBOOL R11 1 0 - 0x782E0049, // 004A JMPF R11 #0095 - 0x602C0008, // 004B GETGBL R11 G8 - 0x5C301400, // 004C MOVE R12 R10 - 0x7C2C0200, // 004D CALL R11 1 - 0x002E2C0B, // 004E ADD R11 K22 R11 - 0x8C301114, // 004F GETMET R12 R8 K20 - 0x5C381600, // 0050 MOVE R14 R11 - 0x7C300400, // 0051 CALL R12 2 - 0x74320000, // 0052 JMPT R12 #0054 - 0x70020040, // 0053 JMP #0095 - 0x9430100B, // 0054 GETIDX R12 R8 R11 - 0xB8361C00, // 0055 GETNGBL R13 K14 - 0x8C341B11, // 0056 GETMET R13 R13 K17 - 0x8C3C0317, // 0057 GETMET R15 R1 K23 - 0x58440018, // 0058 LDCONST R17 K24 - 0x5C481600, // 0059 MOVE R18 R11 - 0x604C0008, // 005A GETGBL R19 G8 - 0x5C501800, // 005B MOVE R20 R12 - 0x7C4C0200, // 005C CALL R19 1 - 0x7C3C0800, // 005D CALL R15 4 - 0x58400013, // 005E LDCONST R16 K19 - 0x7C340600, // 005F CALL R13 3 - 0x8C341905, // 0060 GETMET R13 R12 K5 - 0x583C0019, // 0061 LDCONST R15 K25 - 0x58400008, // 0062 LDCONST R16 K8 - 0x7C340600, // 0063 CALL R13 3 - 0x04341B02, // 0064 SUB R13 R13 K2 - 0x8C381905, // 0065 GETMET R14 R12 K5 - 0x5840001A, // 0066 LDCONST R16 K26 - 0x58440008, // 0067 LDCONST R17 K8 - 0x7C380600, // 0068 CALL R14 3 - 0x04381D02, // 0069 SUB R14 R14 K2 - 0x283C1B08, // 006A GE R15 R13 K8 - 0x783E0002, // 006B JMPF R15 #006F - 0x8C3C131B, // 006C GETMET R15 R9 K27 - 0x5C441A00, // 006D MOVE R17 R13 - 0x7C3C0400, // 006E CALL R15 2 - 0x283C1D08, // 006F GE R15 R14 K8 - 0x783E0002, // 0070 JMPF R15 #0074 - 0x8C3C131B, // 0071 GETMET R15 R9 K27 - 0x5C441C00, // 0072 MOVE R17 R14 - 0x7C3C0400, // 0073 CALL R15 2 - 0xB83E1C00, // 0074 GETNGBL R15 K14 - 0x8C3C1F11, // 0075 GETMET R15 R15 K17 - 0x8C440317, // 0076 GETMET R17 R1 K23 - 0x584C001C, // 0077 LDCONST R19 K28 - 0x5C501A00, // 0078 MOVE R20 R13 - 0x5C541C00, // 0079 MOVE R21 R14 - 0x7C440800, // 007A CALL R17 4 - 0x58480013, // 007B LDCONST R18 K19 - 0x7C3C0600, // 007C CALL R15 3 - 0x8C3C1905, // 007D GETMET R15 R12 K5 - 0x5844001D, // 007E LDCONST R17 K29 - 0x7C3C0400, // 007F CALL R15 2 - 0x783E0002, // 0080 JMPF R15 #0084 - 0x94401F0B, // 0081 GETIDX R16 R15 K11 - 0x24402108, // 0082 GT R16 R16 K8 - 0x74420000, // 0083 JMPT R16 #0085 - 0x50400001, // 0084 LDBOOL R16 0 1 - 0x50400200, // 0085 LDBOOL R16 1 0 - 0x60440008, // 0086 GETGBL R17 G8 - 0x5C480800, // 0087 MOVE R18 R4 - 0x7C440200, // 0088 CALL R17 1 - 0x60480013, // 0089 GETGBL R18 G19 - 0x7C480000, // 008A CALL R18 0 - 0x78420001, // 008B JMPF R16 #008E - 0x584C001E, // 008C LDCONST R19 K30 - 0x70020000, // 008D JMP #008F - 0x584C001F, // 008E LDCONST R19 K31 - 0x984A1213, // 008F SETIDX R18 K9 R19 - 0x984A3E0A, // 0090 SETIDX R18 K31 R10 - 0x980C2212, // 0091 SETIDX R3 R17 R18 - 0x00100902, // 0092 ADD R4 R4 K2 - 0x00281502, // 0093 ADD R10 R10 K2 - 0x7001FFB3, // 0094 JMP #0049 - 0x6028000C, // 0095 GETGBL R10 G12 - 0xB82E1C00, // 0096 GETNGBL R11 K14 - 0x8C2C1720, // 0097 GETMET R11 R11 K32 - 0x7C2C0200, // 0098 CALL R11 1 - 0x7C280200, // 0099 CALL R10 1 - 0x582C0008, // 009A LDCONST R11 K8 - 0x78160000, // 009B JMPF R5 #009D - 0x04281502, // 009C SUB R10 R10 K2 - 0x1430160A, // 009D LT R12 R11 R10 - 0x78320010, // 009E JMPF R12 #00B0 - 0x8C301305, // 009F GETMET R12 R9 K5 - 0x5C381600, // 00A0 MOVE R14 R11 - 0x7C300400, // 00A1 CALL R12 2 - 0x4C340000, // 00A2 LDNIL R13 - 0x1C30180D, // 00A3 EQ R12 R12 R13 - 0x78320008, // 00A4 JMPF R12 #00AE - 0x60300008, // 00A5 GETGBL R12 G8 - 0x5C340800, // 00A6 MOVE R13 R4 - 0x7C300200, // 00A7 CALL R12 1 - 0x60340013, // 00A8 GETGBL R13 G19 - 0x7C340000, // 00A9 CALL R13 0 - 0x98361321, // 00AA SETIDX R13 K9 K33 - 0x9836420B, // 00AB SETIDX R13 K33 R11 - 0x980C180D, // 00AC SETIDX R3 R12 R13 - 0x00100902, // 00AD ADD R4 R4 K2 - 0x002C1702, // 00AE ADD R11 R11 K2 - 0x7001FFEC, // 00AF JMP #009D - 0x8C300522, // 00B0 GETMET R12 R2 K34 - 0xB83A1C00, // 00B1 GETNGBL R14 K14 - 0x8C381D23, // 00B2 GETMET R14 R14 K35 - 0x7C380200, // 00B3 CALL R14 1 - 0x7C300400, // 00B4 CALL R12 2 - 0x5412001F, // 00B5 LDINT R4 32 - 0x60340010, // 00B6 GETGBL R13 G16 - 0x8C380124, // 00B7 GETMET R14 R0 K36 - 0x5C401800, // 00B8 MOVE R16 R12 - 0x7C380400, // 00B9 CALL R14 2 - 0x7C340200, // 00BA CALL R13 1 - 0xA802001C, // 00BB EXBLK 0 #00D9 - 0x5C381A00, // 00BC MOVE R14 R13 - 0x7C380000, // 00BD CALL R14 0 - 0x943C180E, // 00BE GETIDX R15 R12 R14 - 0x6040000F, // 00BF GETGBL R16 G15 - 0x5C441E00, // 00C0 MOVE R17 R15 - 0x60480013, // 00C1 GETGBL R18 G19 - 0x7C400400, // 00C2 CALL R16 2 - 0x7842000D, // 00C3 JMPF R16 #00D2 - 0x8C401F14, // 00C4 GETMET R16 R15 K20 - 0x58480025, // 00C5 LDCONST R18 K37 - 0x7C400400, // 00C6 CALL R16 2 - 0x78420009, // 00C7 JMPF R16 #00D2 - 0x00401D26, // 00C8 ADD R16 R14 K38 - 0x60440008, // 00C9 GETGBL R17 G8 - 0x5C480800, // 00CA MOVE R18 R4 - 0x7C440200, // 00CB CALL R17 1 - 0x60480013, // 00CC GETGBL R18 G19 - 0x7C480000, // 00CD CALL R18 0 - 0x984A1327, // 00CE SETIDX R18 K9 K39 - 0x984A5010, // 00CF SETIDX R18 K40 R16 - 0x980C2212, // 00D0 SETIDX R3 R17 R18 - 0x00100902, // 00D1 ADD R4 R4 K2 - 0x54420027, // 00D2 LDINT R16 40 - 0x24400810, // 00D3 GT R16 R4 R16 - 0x78420000, // 00D4 JMPF R16 #00D6 - 0x70020000, // 00D5 JMP #00D7 - 0x7001FFE4, // 00D6 JMP #00BC - 0xA8040001, // 00D7 EXBLK 1 1 - 0x70020002, // 00D8 JMP #00DC - 0x58340029, // 00D9 LDCONST R13 K41 - 0xAC340200, // 00DA CATCH R13 1 0 - 0xB0080000, // 00DB RAISE 2 R0 R0 - 0x54120027, // 00DC LDINT R4 40 - 0x60340010, // 00DD GETGBL R13 G16 - 0x8C380124, // 00DE GETMET R14 R0 K36 - 0x5C401800, // 00DF MOVE R16 R12 - 0x7C380400, // 00E0 CALL R14 2 - 0x7C340200, // 00E1 CALL R13 1 - 0xA802001C, // 00E2 EXBLK 0 #0100 - 0x5C381A00, // 00E3 MOVE R14 R13 - 0x7C380000, // 00E4 CALL R14 0 - 0x943C180E, // 00E5 GETIDX R15 R12 R14 - 0x6040000F, // 00E6 GETGBL R16 G15 - 0x5C441E00, // 00E7 MOVE R17 R15 - 0x60480013, // 00E8 GETGBL R18 G19 - 0x7C400400, // 00E9 CALL R16 2 - 0x7842000D, // 00EA JMPF R16 #00F9 - 0x8C401F14, // 00EB GETMET R16 R15 K20 - 0x5848002A, // 00EC LDCONST R18 K42 - 0x7C400400, // 00ED CALL R16 2 - 0x78420009, // 00EE JMPF R16 #00F9 - 0x00401D2B, // 00EF ADD R16 R14 K43 - 0x60440008, // 00F0 GETGBL R17 G8 - 0x5C480800, // 00F1 MOVE R18 R4 - 0x7C440200, // 00F2 CALL R17 1 - 0x60480013, // 00F3 GETGBL R18 G19 - 0x7C480000, // 00F4 CALL R18 0 - 0x984A132C, // 00F5 SETIDX R18 K9 K44 - 0x984A5010, // 00F6 SETIDX R18 K40 R16 - 0x980C2212, // 00F7 SETIDX R3 R17 R18 - 0x00100902, // 00F8 ADD R4 R4 K2 - 0x5442002E, // 00F9 LDINT R16 47 - 0x24400810, // 00FA GT R16 R4 R16 - 0x78420000, // 00FB JMPF R16 #00FD - 0x70020000, // 00FC JMP #00FE - 0x7001FFE4, // 00FD JMP #00E3 - 0xA8040001, // 00FE EXBLK 1 1 - 0x70020002, // 00FF JMP #0103 - 0x58340029, // 0100 LDCONST R13 K41 - 0xAC340200, // 0101 CATCH R13 1 0 - 0xB0080000, // 0102 RAISE 2 R0 R0 - 0x5412002F, // 0103 LDINT R4 48 - 0x60340010, // 0104 GETGBL R13 G16 - 0x8C380124, // 0105 GETMET R14 R0 K36 - 0x5C401800, // 0106 MOVE R16 R12 - 0x7C380400, // 0107 CALL R14 2 - 0x7C340200, // 0108 CALL R13 1 - 0xA802001C, // 0109 EXBLK 0 #0127 - 0x5C381A00, // 010A MOVE R14 R13 - 0x7C380000, // 010B CALL R14 0 - 0x943C180E, // 010C GETIDX R15 R12 R14 - 0x6040000F, // 010D GETGBL R16 G15 - 0x5C441E00, // 010E MOVE R17 R15 - 0x60480013, // 010F GETGBL R18 G19 - 0x7C400400, // 0110 CALL R16 2 - 0x7842000D, // 0111 JMPF R16 #0120 - 0x8C401F14, // 0112 GETMET R16 R15 K20 - 0x5848002D, // 0113 LDCONST R18 K45 - 0x7C400400, // 0114 CALL R16 2 - 0x78420009, // 0115 JMPF R16 #0120 - 0x00401D2E, // 0116 ADD R16 R14 K46 - 0x60440008, // 0117 GETGBL R17 G8 - 0x5C480800, // 0118 MOVE R18 R4 - 0x7C440200, // 0119 CALL R17 1 - 0x60480013, // 011A GETGBL R18 G19 - 0x7C480000, // 011B CALL R18 0 - 0x984A132F, // 011C SETIDX R18 K9 K47 - 0x984A5010, // 011D SETIDX R18 K40 R16 - 0x980C2212, // 011E SETIDX R3 R17 R18 - 0x00100902, // 011F ADD R4 R4 K2 - 0x54420037, // 0120 LDINT R16 56 - 0x24400810, // 0121 GT R16 R4 R16 - 0x78420000, // 0122 JMPF R16 #0124 - 0x70020000, // 0123 JMP #0125 - 0x7001FFE4, // 0124 JMP #010A - 0xA8040001, // 0125 EXBLK 1 1 - 0x70020002, // 0126 JMP #012A - 0x58340029, // 0127 LDCONST R13 K41 - 0xAC340200, // 0128 CATCH R13 1 0 - 0xB0080000, // 0129 RAISE 2 R0 R0 - 0x54120037, // 012A LDINT R4 56 - 0x60340010, // 012B GETGBL R13 G16 - 0x8C380124, // 012C GETMET R14 R0 K36 - 0x5C401800, // 012D MOVE R16 R12 - 0x7C380400, // 012E CALL R14 2 - 0x7C340200, // 012F CALL R13 1 - 0xA802001C, // 0130 EXBLK 0 #014E - 0x5C381A00, // 0131 MOVE R14 R13 - 0x7C380000, // 0132 CALL R14 0 - 0x943C180E, // 0133 GETIDX R15 R12 R14 - 0x6040000F, // 0134 GETGBL R16 G15 - 0x5C441E00, // 0135 MOVE R17 R15 - 0x60480013, // 0136 GETGBL R18 G19 - 0x7C400400, // 0137 CALL R16 2 - 0x7842000D, // 0138 JMPF R16 #0147 - 0x8C401F14, // 0139 GETMET R16 R15 K20 - 0x58480030, // 013A LDCONST R18 K48 - 0x7C400400, // 013B CALL R16 2 - 0x78420009, // 013C JMPF R16 #0147 - 0x00401D31, // 013D ADD R16 R14 K49 - 0x60440008, // 013E GETGBL R17 G8 - 0x5C480800, // 013F MOVE R18 R4 - 0x7C440200, // 0140 CALL R17 1 - 0x60480013, // 0141 GETGBL R18 G19 - 0x7C480000, // 0142 CALL R18 0 - 0x984A1332, // 0143 SETIDX R18 K9 K50 - 0x984A5010, // 0144 SETIDX R18 K40 R16 - 0x980C2212, // 0145 SETIDX R3 R17 R18 - 0x00100902, // 0146 ADD R4 R4 K2 - 0x5442003F, // 0147 LDINT R16 64 - 0x24400810, // 0148 GT R16 R4 R16 - 0x78420000, // 0149 JMPF R16 #014B - 0x70020000, // 014A JMP #014C - 0x7001FFE4, // 014B JMP #0131 - 0xA8040001, // 014C EXBLK 1 1 - 0x70020002, // 014D JMP #0151 - 0x58340029, // 014E LDCONST R13 K41 - 0xAC340200, // 014F CATCH R13 1 0 - 0xB0080000, // 0150 RAISE 2 R0 R0 - 0x80040600, // 0151 RET 1 R3 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: register_http_remote -********************************************************************/ -be_local_closure(Matter_Device_register_http_remote, /* name */ - be_nested_proto( - 8, /* nstack */ - 3, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 6]) { /* constants */ - /* K0 */ be_nested_str_weak(http_remotes), - /* K1 */ be_nested_str_weak(contains), - /* K2 */ be_nested_str_weak(get_timeout), - /* K3 */ be_nested_str_weak(set_timeout), - /* K4 */ be_nested_str_weak(matter), - /* K5 */ be_nested_str_weak(HTTP_remote), - }), - be_str_weak(register_http_remote), - &be_const_str_solidified, - ( &(const binstruction[32]) { /* code */ - 0x880C0100, // 0000 GETMBR R3 R0 K0 - 0x4C100000, // 0001 LDNIL R4 - 0x1C0C0604, // 0002 EQ R3 R3 R4 - 0x780E0002, // 0003 JMPF R3 #0007 - 0x600C0013, // 0004 GETGBL R3 G19 - 0x7C0C0000, // 0005 CALL R3 0 - 0x90020003, // 0006 SETMBR R0 K0 R3 - 0x4C0C0000, // 0007 LDNIL R3 - 0x88100100, // 0008 GETMBR R4 R0 K0 - 0x8C100901, // 0009 GETMET R4 R4 K1 - 0x5C180200, // 000A MOVE R6 R1 - 0x7C100400, // 000B CALL R4 2 - 0x78120009, // 000C JMPF R4 #0017 - 0x88100100, // 000D GETMBR R4 R0 K0 - 0x940C0801, // 000E GETIDX R3 R4 R1 - 0x8C140702, // 000F GETMET R5 R3 K2 - 0x7C140200, // 0010 CALL R5 1 - 0x14140405, // 0011 LT R5 R2 R5 - 0x78160002, // 0012 JMPF R5 #0016 - 0x8C140703, // 0013 GETMET R5 R3 K3 - 0x5C1C0400, // 0014 MOVE R7 R2 - 0x7C140400, // 0015 CALL R5 2 - 0x70020007, // 0016 JMP #001F - 0xB8120800, // 0017 GETNGBL R4 K4 - 0x8C100905, // 0018 GETMET R4 R4 K5 - 0x5C180200, // 0019 MOVE R6 R1 - 0x5C1C0400, // 001A MOVE R7 R2 - 0x7C100600, // 001B CALL R4 3 - 0x5C0C0800, // 001C MOVE R3 R4 - 0x88100100, // 001D GETMBR R4 R0 K0 - 0x98100203, // 001E SETIDX R4 R1 R3 - 0x80040600, // 001F RET 1 R3 + ( &(const binstruction[24]) { /* code */ + 0x58100000, // 0000 LDCONST R4 K0 + 0x88140701, // 0001 GETMBR R5 R3 K1 + 0x6018000C, // 0002 GETGBL R6 G12 + 0x881C0102, // 0003 GETMBR R7 R0 K2 + 0x7C180200, // 0004 CALL R6 1 + 0x14180806, // 0005 LT R6 R4 R6 + 0x781A000C, // 0006 JMPF R6 #0014 + 0x88180102, // 0007 GETMBR R6 R0 K2 + 0x94180C04, // 0008 GETIDX R6 R6 R4 + 0x881C0D01, // 0009 GETMBR R7 R6 K1 + 0x1C1C0E05, // 000A EQ R7 R7 R5 + 0x781E0005, // 000B JMPF R7 #0012 + 0x8C1C0D03, // 000C GETMET R7 R6 K3 + 0x5C240200, // 000D MOVE R9 R1 + 0x5C280400, // 000E MOVE R10 R2 + 0x5C2C0600, // 000F MOVE R11 R3 + 0x7C1C0800, // 0010 CALL R7 4 + 0x80040E00, // 0011 RET 1 R7 + 0x00100904, // 0012 ADD R4 R4 K4 + 0x7001FFED, // 0013 JMP #0002 + 0xB81A0C00, // 0014 GETNGBL R6 K6 + 0x88180D07, // 0015 GETMBR R6 R6 K7 + 0x900E0A06, // 0016 SETMBR R3 K5 R6 + 0x80000000, // 0017 RET 0 }) ) ); @@ -4890,6 +1705,3034 @@ be_local_closure(Matter_Device_mdns_announce_PASE, /* name */ /*******************************************************************/ +/******************************************************************** +** Solidified function: k2l_num +********************************************************************/ +be_local_closure(Matter_Device_k2l_num, /* name */ + be_nested_proto( + 9, /* nstack */ + 1, /* argc */ + 4, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 6]) { /* constants */ + /* K0 */ be_const_class(be_class_Matter_Device), + /* K1 */ be_nested_str_weak(keys), + /* K2 */ be_nested_str_weak(push), + /* K3 */ be_nested_str_weak(stop_iteration), + /* K4 */ be_const_int(1), + /* K5 */ be_const_int(0), + }), + be_str_weak(k2l_num), + &be_const_str_solidified, + ( &(const binstruction[52]) { /* code */ + 0x58040000, // 0000 LDCONST R1 K0 + 0x60080012, // 0001 GETGBL R2 G18 + 0x7C080000, // 0002 CALL R2 0 + 0x4C0C0000, // 0003 LDNIL R3 + 0x1C0C0003, // 0004 EQ R3 R0 R3 + 0x780E0000, // 0005 JMPF R3 #0007 + 0x80040400, // 0006 RET 1 R2 + 0x600C0010, // 0007 GETGBL R3 G16 + 0x8C100101, // 0008 GETMET R4 R0 K1 + 0x7C100200, // 0009 CALL R4 1 + 0x7C0C0200, // 000A CALL R3 1 + 0xA8020007, // 000B EXBLK 0 #0014 + 0x5C100600, // 000C MOVE R4 R3 + 0x7C100000, // 000D CALL R4 0 + 0x8C140502, // 000E GETMET R5 R2 K2 + 0x601C0009, // 000F GETGBL R7 G9 + 0x5C200800, // 0010 MOVE R8 R4 + 0x7C1C0200, // 0011 CALL R7 1 + 0x7C140400, // 0012 CALL R5 2 + 0x7001FFF7, // 0013 JMP #000C + 0x580C0003, // 0014 LDCONST R3 K3 + 0xAC0C0200, // 0015 CATCH R3 1 0 + 0xB0080000, // 0016 RAISE 2 R0 R0 + 0x600C0010, // 0017 GETGBL R3 G16 + 0x6010000C, // 0018 GETGBL R4 G12 + 0x5C140400, // 0019 MOVE R5 R2 + 0x7C100200, // 001A CALL R4 1 + 0x04100904, // 001B SUB R4 R4 K4 + 0x40120804, // 001C CONNECT R4 K4 R4 + 0x7C0C0200, // 001D CALL R3 1 + 0xA8020010, // 001E EXBLK 0 #0030 + 0x5C100600, // 001F MOVE R4 R3 + 0x7C100000, // 0020 CALL R4 0 + 0x94140404, // 0021 GETIDX R5 R2 R4 + 0x5C180800, // 0022 MOVE R6 R4 + 0x241C0D05, // 0023 GT R7 R6 K5 + 0x781E0008, // 0024 JMPF R7 #002E + 0x041C0D04, // 0025 SUB R7 R6 K4 + 0x941C0407, // 0026 GETIDX R7 R2 R7 + 0x241C0E05, // 0027 GT R7 R7 R5 + 0x781E0004, // 0028 JMPF R7 #002E + 0x041C0D04, // 0029 SUB R7 R6 K4 + 0x941C0407, // 002A GETIDX R7 R2 R7 + 0x98080C07, // 002B SETIDX R2 R6 R7 + 0x04180D04, // 002C SUB R6 R6 K4 + 0x7001FFF4, // 002D JMP #0023 + 0x98080C05, // 002E SETIDX R2 R6 R5 + 0x7001FFEE, // 002F JMP #001F + 0x580C0003, // 0030 LDCONST R3 K3 + 0xAC0C0200, // 0031 CATCH R3 1 0 + 0xB0080000, // 0032 RAISE 2 R0 R0 + 0x80040400, // 0033 RET 1 R2 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: _instantiate_plugins_from_config +********************************************************************/ +be_local_closure(Matter_Device__instantiate_plugins_from_config, /* name */ + be_nested_proto( + 19, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[34]) { /* constants */ + /* K0 */ be_nested_str_weak(string), + /* K1 */ be_nested_str_weak(k2l_num), + /* K2 */ be_nested_str_weak(tasmota), + /* K3 */ be_nested_str_weak(log), + /* K4 */ be_nested_str_weak(MTR_X3A_X20endpoints_X20to_X20be_X20configured_X20), + /* K5 */ be_const_int(3), + /* K6 */ be_nested_str_weak(plugins), + /* K7 */ be_nested_str_weak(push), + /* K8 */ be_nested_str_weak(matter), + /* K9 */ be_nested_str_weak(Plugin_Root), + /* K10 */ be_const_int(0), + /* K11 */ be_nested_str_weak(format), + /* K12 */ be_nested_str_weak(MTR_X3A_X20endpoint_X3A_X25i_X20type_X3A_X25s_X25s), + /* K13 */ be_nested_str_weak(root), + /* K14 */ be_nested_str_weak(), + /* K15 */ be_const_int(2), + /* K16 */ be_nested_str_weak(Plugin_Aggregator), + /* K17 */ be_nested_str_weak(aggregator), + /* K18 */ be_nested_str_weak(MTR_X3A_X20endpoint_X20_X25i_X20config_X20_X25s), + /* K19 */ be_nested_str_weak(find), + /* K20 */ be_nested_str_weak(type), + /* K21 */ be_nested_str_weak(MTR_X3A_X20no_X20class_X20name_X2C_X20skipping), + /* K22 */ be_nested_str_weak(MTR_X3A_X20only_X20one_X20root_X20node_X20allowed), + /* K23 */ be_nested_str_weak(plugins_classes), + /* K24 */ be_nested_str_weak(MTR_X3A_X20unknown_X20class_X20name_X20_X27), + /* K25 */ be_nested_str_weak(_X27_X20skipping), + /* K26 */ be_nested_str_weak(k2l), + /* K27 */ be_nested_str_weak(_X20_X25s_X3A_X25s), + /* K28 */ be_nested_str_weak(stop_iteration), + /* K29 */ be_nested_str_weak(MTR_X3A_X20Exception), + /* K30 */ be_nested_str_weak(_X7C), + /* K31 */ be_nested_str_weak(publish_result), + /* K32 */ be_nested_str_weak(_X7B_X22Matter_X22_X3A_X7B_X22Initialized_X22_X3A1_X7D_X7D), + /* K33 */ be_nested_str_weak(Matter), + }), + be_str_weak(_instantiate_plugins_from_config), + &be_const_str_solidified, + ( &(const binstruction[185]) { /* code */ + 0xA40A0000, // 0000 IMPORT R2 K0 + 0x8C0C0101, // 0001 GETMET R3 R0 K1 + 0x5C140200, // 0002 MOVE R5 R1 + 0x7C0C0400, // 0003 CALL R3 2 + 0xB8120400, // 0004 GETNGBL R4 K2 + 0x8C100903, // 0005 GETMET R4 R4 K3 + 0x60180008, // 0006 GETGBL R6 G8 + 0x5C1C0600, // 0007 MOVE R7 R3 + 0x7C180200, // 0008 CALL R6 1 + 0x001A0806, // 0009 ADD R6 K4 R6 + 0x581C0005, // 000A LDCONST R7 K5 + 0x7C100600, // 000B CALL R4 3 + 0x88100106, // 000C GETMBR R4 R0 K6 + 0x8C100907, // 000D GETMET R4 R4 K7 + 0xB81A1000, // 000E GETNGBL R6 K8 + 0x8C180D09, // 000F GETMET R6 R6 K9 + 0x5C200000, // 0010 MOVE R8 R0 + 0x5824000A, // 0011 LDCONST R9 K10 + 0x60280013, // 0012 GETGBL R10 G19 + 0x7C280000, // 0013 CALL R10 0 + 0x7C180800, // 0014 CALL R6 4 + 0x7C100400, // 0015 CALL R4 2 + 0xB8120400, // 0016 GETNGBL R4 K2 + 0x8C100903, // 0017 GETMET R4 R4 K3 + 0x8C18050B, // 0018 GETMET R6 R2 K11 + 0x5820000C, // 0019 LDCONST R8 K12 + 0x5824000A, // 001A LDCONST R9 K10 + 0x5828000D, // 001B LDCONST R10 K13 + 0x582C000E, // 001C LDCONST R11 K14 + 0x7C180A00, // 001D CALL R6 5 + 0x581C000F, // 001E LDCONST R7 K15 + 0x7C100600, // 001F CALL R4 3 + 0x88100106, // 0020 GETMBR R4 R0 K6 + 0x8C100907, // 0021 GETMET R4 R4 K7 + 0xB81A1000, // 0022 GETNGBL R6 K8 + 0x8C180D10, // 0023 GETMET R6 R6 K16 + 0x5C200000, // 0024 MOVE R8 R0 + 0x5426FEFF, // 0025 LDINT R9 65280 + 0x60280013, // 0026 GETGBL R10 G19 + 0x7C280000, // 0027 CALL R10 0 + 0x7C180800, // 0028 CALL R6 4 + 0x7C100400, // 0029 CALL R4 2 + 0xB8120400, // 002A GETNGBL R4 K2 + 0x8C100903, // 002B GETMET R4 R4 K3 + 0x8C18050B, // 002C GETMET R6 R2 K11 + 0x5820000C, // 002D LDCONST R8 K12 + 0x5426FEFF, // 002E LDINT R9 65280 + 0x58280011, // 002F LDCONST R10 K17 + 0x582C000E, // 0030 LDCONST R11 K14 + 0x7C180A00, // 0031 CALL R6 5 + 0x581C000F, // 0032 LDCONST R7 K15 + 0x7C100600, // 0033 CALL R4 3 + 0x60100010, // 0034 GETGBL R4 G16 + 0x5C140600, // 0035 MOVE R5 R3 + 0x7C100200, // 0036 CALL R4 1 + 0xA8020077, // 0037 EXBLK 0 #00B0 + 0x5C140800, // 0038 MOVE R5 R4 + 0x7C140000, // 0039 CALL R5 0 + 0x1C180B0A, // 003A EQ R6 R5 K10 + 0x781A0000, // 003B JMPF R6 #003D + 0x7001FFFA, // 003C JMP #0038 + 0xA802005F, // 003D EXBLK 0 #009E + 0x60180008, // 003E GETGBL R6 G8 + 0x5C1C0A00, // 003F MOVE R7 R5 + 0x7C180200, // 0040 CALL R6 1 + 0x94180206, // 0041 GETIDX R6 R1 R6 + 0xB81E0400, // 0042 GETNGBL R7 K2 + 0x8C1C0F03, // 0043 GETMET R7 R7 K3 + 0x8C24050B, // 0044 GETMET R9 R2 K11 + 0x582C0012, // 0045 LDCONST R11 K18 + 0x5C300A00, // 0046 MOVE R12 R5 + 0x5C340C00, // 0047 MOVE R13 R6 + 0x7C240800, // 0048 CALL R9 4 + 0x58280005, // 0049 LDCONST R10 K5 + 0x7C1C0600, // 004A CALL R7 3 + 0x8C1C0D13, // 004B GETMET R7 R6 K19 + 0x58240014, // 004C LDCONST R9 K20 + 0x7C1C0400, // 004D CALL R7 2 + 0x4C200000, // 004E LDNIL R8 + 0x1C200E08, // 004F EQ R8 R7 R8 + 0x78220006, // 0050 JMPF R8 #0058 + 0xB8220400, // 0051 GETNGBL R8 K2 + 0x8C201103, // 0052 GETMET R8 R8 K3 + 0x58280015, // 0053 LDCONST R10 K21 + 0x582C0005, // 0054 LDCONST R11 K5 + 0x7C200600, // 0055 CALL R8 3 + 0xA8040001, // 0056 EXBLK 1 1 + 0x7001FFDF, // 0057 JMP #0038 + 0x1C200F0D, // 0058 EQ R8 R7 K13 + 0x78220006, // 0059 JMPF R8 #0061 + 0xB8220400, // 005A GETNGBL R8 K2 + 0x8C201103, // 005B GETMET R8 R8 K3 + 0x58280016, // 005C LDCONST R10 K22 + 0x582C0005, // 005D LDCONST R11 K5 + 0x7C200600, // 005E CALL R8 3 + 0xA8040001, // 005F EXBLK 1 1 + 0x7001FFD6, // 0060 JMP #0038 + 0x88200117, // 0061 GETMBR R8 R0 K23 + 0x8C201113, // 0062 GETMET R8 R8 K19 + 0x5C280E00, // 0063 MOVE R10 R7 + 0x7C200400, // 0064 CALL R8 2 + 0x4C240000, // 0065 LDNIL R9 + 0x1C241009, // 0066 EQ R9 R8 R9 + 0x7826000A, // 0067 JMPF R9 #0073 + 0xB8260400, // 0068 GETNGBL R9 K2 + 0x8C241303, // 0069 GETMET R9 R9 K3 + 0x602C0008, // 006A GETGBL R11 G8 + 0x5C300E00, // 006B MOVE R12 R7 + 0x7C2C0200, // 006C CALL R11 1 + 0x002E300B, // 006D ADD R11 K24 R11 + 0x002C1719, // 006E ADD R11 R11 K25 + 0x5830000F, // 006F LDCONST R12 K15 + 0x7C240600, // 0070 CALL R9 3 + 0xA8040001, // 0071 EXBLK 1 1 + 0x7001FFC4, // 0072 JMP #0038 + 0x5C241000, // 0073 MOVE R9 R8 + 0x5C280000, // 0074 MOVE R10 R0 + 0x5C2C0A00, // 0075 MOVE R11 R5 + 0x5C300C00, // 0076 MOVE R12 R6 + 0x7C240600, // 0077 CALL R9 3 + 0x88280106, // 0078 GETMBR R10 R0 K6 + 0x8C281507, // 0079 GETMET R10 R10 K7 + 0x5C301200, // 007A MOVE R12 R9 + 0x7C280400, // 007B CALL R10 2 + 0x5828000E, // 007C LDCONST R10 K14 + 0x602C0010, // 007D GETGBL R11 G16 + 0x8C30011A, // 007E GETMET R12 R0 K26 + 0x5C380C00, // 007F MOVE R14 R6 + 0x7C300400, // 0080 CALL R12 2 + 0x7C2C0200, // 0081 CALL R11 1 + 0xA802000B, // 0082 EXBLK 0 #008F + 0x5C301600, // 0083 MOVE R12 R11 + 0x7C300000, // 0084 CALL R12 0 + 0x1C341914, // 0085 EQ R13 R12 K20 + 0x78360000, // 0086 JMPF R13 #0088 + 0x7001FFFA, // 0087 JMP #0083 + 0x8C34050B, // 0088 GETMET R13 R2 K11 + 0x583C001B, // 0089 LDCONST R15 K27 + 0x5C401800, // 008A MOVE R16 R12 + 0x94440C0C, // 008B GETIDX R17 R6 R12 + 0x7C340800, // 008C CALL R13 4 + 0x0028140D, // 008D ADD R10 R10 R13 + 0x7001FFF3, // 008E JMP #0083 + 0x582C001C, // 008F LDCONST R11 K28 + 0xAC2C0200, // 0090 CATCH R11 1 0 + 0xB0080000, // 0091 RAISE 2 R0 R0 + 0xB82E0400, // 0092 GETNGBL R11 K2 + 0x8C2C1703, // 0093 GETMET R11 R11 K3 + 0x8C34050B, // 0094 GETMET R13 R2 K11 + 0x583C000C, // 0095 LDCONST R15 K12 + 0x5C400A00, // 0096 MOVE R16 R5 + 0x5C440E00, // 0097 MOVE R17 R7 + 0x5C481400, // 0098 MOVE R18 R10 + 0x7C340A00, // 0099 CALL R13 5 + 0x5838000F, // 009A LDCONST R14 K15 + 0x7C2C0600, // 009B CALL R11 3 + 0xA8040001, // 009C EXBLK 1 1 + 0x70020010, // 009D JMP #00AF + 0xAC180002, // 009E CATCH R6 0 2 + 0x7002000D, // 009F JMP #00AE + 0xB8220400, // 00A0 GETNGBL R8 K2 + 0x8C201103, // 00A1 GETMET R8 R8 K3 + 0x60280008, // 00A2 GETGBL R10 G8 + 0x5C2C0C00, // 00A3 MOVE R11 R6 + 0x7C280200, // 00A4 CALL R10 1 + 0x002A3A0A, // 00A5 ADD R10 K29 R10 + 0x0028151E, // 00A6 ADD R10 R10 K30 + 0x602C0008, // 00A7 GETGBL R11 G8 + 0x5C300E00, // 00A8 MOVE R12 R7 + 0x7C2C0200, // 00A9 CALL R11 1 + 0x0028140B, // 00AA ADD R10 R10 R11 + 0x582C000F, // 00AB LDCONST R11 K15 + 0x7C200600, // 00AC CALL R8 3 + 0x70020000, // 00AD JMP #00AF + 0xB0080000, // 00AE RAISE 2 R0 R0 + 0x7001FF87, // 00AF JMP #0038 + 0x5810001C, // 00B0 LDCONST R4 K28 + 0xAC100200, // 00B1 CATCH R4 1 0 + 0xB0080000, // 00B2 RAISE 2 R0 R0 + 0xB8120400, // 00B3 GETNGBL R4 K2 + 0x8C10091F, // 00B4 GETMET R4 R4 K31 + 0x58180020, // 00B5 LDCONST R6 K32 + 0x581C0021, // 00B6 LDCONST R7 K33 + 0x7C100600, // 00B7 CALL R4 3 + 0x80000000, // 00B8 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: _mdns_announce_hostname +********************************************************************/ +be_local_closure(Matter_Device__mdns_announce_hostname, /* name */ + be_nested_proto( + 16, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[28]) { /* constants */ + /* K0 */ be_nested_str_weak(mdns), + /* K1 */ be_nested_str_weak(string), + /* K2 */ be_nested_str_weak(start), + /* K3 */ be_nested_str_weak(tasmota), + /* K4 */ be_nested_str_weak(eth), + /* K5 */ be_nested_str_weak(hostname_eth), + /* K6 */ be_nested_str_weak(replace), + /* K7 */ be_nested_str_weak(find), + /* K8 */ be_nested_str_weak(mac), + /* K9 */ be_nested_str_weak(_X3A), + /* K10 */ be_nested_str_weak(), + /* K11 */ be_nested_str_weak(ipv4only), + /* K12 */ be_nested_str_weak(log), + /* K13 */ be_nested_str_weak(format), + /* K14 */ be_nested_str_weak(MTR_X3A_X20calling_X20mdns_X2Eadd_hostname_X28_X25s_X2C_X20_X25s_X2C_X20_X25s_X29), + /* K15 */ be_nested_str_weak(ip6local), + /* K16 */ be_nested_str_weak(ip), + /* K17 */ be_const_int(3), + /* K18 */ be_nested_str_weak(add_hostname), + /* K19 */ be_nested_str_weak(ip6), + /* K20 */ be_nested_str_weak(MTR_X3A_X20calling_X20mdns_X2Eadd_hostname_X28_X25s_X2C_X20_X25s_X29), + /* K21 */ be_nested_str_weak(wifi), + /* K22 */ be_nested_str_weak(hostname_wifi), + /* K23 */ be_nested_str_weak(MTR_X3A_X20start_X20mDNS_X20on_X20_X25s_X20host_X20_X27_X25s_X2Elocal_X27), + /* K24 */ be_const_int(2), + /* K25 */ be_nested_str_weak(MTR_X3A_X20Exception), + /* K26 */ be_nested_str_weak(_X7C), + /* K27 */ be_nested_str_weak(mdns_announce_op_discovery_all_fabrics), + }), + be_str_weak(_mdns_announce_hostname), + &be_const_str_solidified, + ( &(const binstruction[172]) { /* code */ + 0xA40A0000, // 0000 IMPORT R2 K0 + 0xA40E0200, // 0001 IMPORT R3 K1 + 0x8C100502, // 0002 GETMET R4 R2 K2 + 0x7C100200, // 0003 CALL R4 1 + 0xA8020092, // 0004 EXBLK 0 #0098 + 0x78060040, // 0005 JMPF R1 #0047 + 0xB8120600, // 0006 GETNGBL R4 K3 + 0x8C100904, // 0007 GETMET R4 R4 K4 + 0x7C100200, // 0008 CALL R4 1 + 0x8C140706, // 0009 GETMET R5 R3 K6 + 0x8C1C0907, // 000A GETMET R7 R4 K7 + 0x58240008, // 000B LDCONST R9 K8 + 0x7C1C0400, // 000C CALL R7 2 + 0x58200009, // 000D LDCONST R8 K9 + 0x5824000A, // 000E LDCONST R9 K10 + 0x7C140800, // 000F CALL R5 4 + 0x90020A05, // 0010 SETMBR R0 K5 R5 + 0x8814010B, // 0011 GETMBR R5 R0 K11 + 0x7416001F, // 0012 JMPT R5 #0033 + 0xB8160600, // 0013 GETNGBL R5 K3 + 0x8C140B0C, // 0014 GETMET R5 R5 K12 + 0x8C1C070D, // 0015 GETMET R7 R3 K13 + 0x5824000E, // 0016 LDCONST R9 K14 + 0x88280105, // 0017 GETMBR R10 R0 K5 + 0x8C2C0907, // 0018 GETMET R11 R4 K7 + 0x5834000F, // 0019 LDCONST R13 K15 + 0x5838000A, // 001A LDCONST R14 K10 + 0x7C2C0600, // 001B CALL R11 3 + 0x8C300907, // 001C GETMET R12 R4 K7 + 0x58380010, // 001D LDCONST R14 K16 + 0x583C000A, // 001E LDCONST R15 K10 + 0x7C300600, // 001F CALL R12 3 + 0x7C1C0A00, // 0020 CALL R7 5 + 0x58200011, // 0021 LDCONST R8 K17 + 0x7C140600, // 0022 CALL R5 3 + 0x8C140512, // 0023 GETMET R5 R2 K18 + 0x881C0105, // 0024 GETMBR R7 R0 K5 + 0x8C200907, // 0025 GETMET R8 R4 K7 + 0x5828000F, // 0026 LDCONST R10 K15 + 0x582C000A, // 0027 LDCONST R11 K10 + 0x7C200600, // 0028 CALL R8 3 + 0x8C240907, // 0029 GETMET R9 R4 K7 + 0x582C0010, // 002A LDCONST R11 K16 + 0x5830000A, // 002B LDCONST R12 K10 + 0x7C240600, // 002C CALL R9 3 + 0x8C280907, // 002D GETMET R10 R4 K7 + 0x58300013, // 002E LDCONST R12 K19 + 0x5834000A, // 002F LDCONST R13 K10 + 0x7C280600, // 0030 CALL R10 3 + 0x7C140A00, // 0031 CALL R5 5 + 0x70020012, // 0032 JMP #0046 + 0xB8160600, // 0033 GETNGBL R5 K3 + 0x8C140B0C, // 0034 GETMET R5 R5 K12 + 0x8C1C070D, // 0035 GETMET R7 R3 K13 + 0x58240014, // 0036 LDCONST R9 K20 + 0x88280105, // 0037 GETMBR R10 R0 K5 + 0x8C2C0907, // 0038 GETMET R11 R4 K7 + 0x58340010, // 0039 LDCONST R13 K16 + 0x5838000A, // 003A LDCONST R14 K10 + 0x7C2C0600, // 003B CALL R11 3 + 0x7C1C0800, // 003C CALL R7 4 + 0x58200011, // 003D LDCONST R8 K17 + 0x7C140600, // 003E CALL R5 3 + 0x8C140512, // 003F GETMET R5 R2 K18 + 0x881C0105, // 0040 GETMBR R7 R0 K5 + 0x8C200907, // 0041 GETMET R8 R4 K7 + 0x58280010, // 0042 LDCONST R10 K16 + 0x582C000A, // 0043 LDCONST R11 K10 + 0x7C200600, // 0044 CALL R8 3 + 0x7C140600, // 0045 CALL R5 3 + 0x7002003F, // 0046 JMP #0087 + 0xB8120600, // 0047 GETNGBL R4 K3 + 0x8C100915, // 0048 GETMET R4 R4 K21 + 0x7C100200, // 0049 CALL R4 1 + 0x8C140706, // 004A GETMET R5 R3 K6 + 0x8C1C0907, // 004B GETMET R7 R4 K7 + 0x58240008, // 004C LDCONST R9 K8 + 0x7C1C0400, // 004D CALL R7 2 + 0x58200009, // 004E LDCONST R8 K9 + 0x5824000A, // 004F LDCONST R9 K10 + 0x7C140800, // 0050 CALL R5 4 + 0x90022C05, // 0051 SETMBR R0 K22 R5 + 0x8814010B, // 0052 GETMBR R5 R0 K11 + 0x7416001F, // 0053 JMPT R5 #0074 + 0xB8160600, // 0054 GETNGBL R5 K3 + 0x8C140B0C, // 0055 GETMET R5 R5 K12 + 0x8C1C070D, // 0056 GETMET R7 R3 K13 + 0x5824000E, // 0057 LDCONST R9 K14 + 0x88280116, // 0058 GETMBR R10 R0 K22 + 0x8C2C0907, // 0059 GETMET R11 R4 K7 + 0x5834000F, // 005A LDCONST R13 K15 + 0x5838000A, // 005B LDCONST R14 K10 + 0x7C2C0600, // 005C CALL R11 3 + 0x8C300907, // 005D GETMET R12 R4 K7 + 0x58380010, // 005E LDCONST R14 K16 + 0x583C000A, // 005F LDCONST R15 K10 + 0x7C300600, // 0060 CALL R12 3 + 0x7C1C0A00, // 0061 CALL R7 5 + 0x58200011, // 0062 LDCONST R8 K17 + 0x7C140600, // 0063 CALL R5 3 + 0x8C140512, // 0064 GETMET R5 R2 K18 + 0x881C0116, // 0065 GETMBR R7 R0 K22 + 0x8C200907, // 0066 GETMET R8 R4 K7 + 0x5828000F, // 0067 LDCONST R10 K15 + 0x582C000A, // 0068 LDCONST R11 K10 + 0x7C200600, // 0069 CALL R8 3 + 0x8C240907, // 006A GETMET R9 R4 K7 + 0x582C0010, // 006B LDCONST R11 K16 + 0x5830000A, // 006C LDCONST R12 K10 + 0x7C240600, // 006D CALL R9 3 + 0x8C280907, // 006E GETMET R10 R4 K7 + 0x58300013, // 006F LDCONST R12 K19 + 0x5834000A, // 0070 LDCONST R13 K10 + 0x7C280600, // 0071 CALL R10 3 + 0x7C140A00, // 0072 CALL R5 5 + 0x70020012, // 0073 JMP #0087 + 0xB8160600, // 0074 GETNGBL R5 K3 + 0x8C140B0C, // 0075 GETMET R5 R5 K12 + 0x8C1C070D, // 0076 GETMET R7 R3 K13 + 0x58240014, // 0077 LDCONST R9 K20 + 0x88280105, // 0078 GETMBR R10 R0 K5 + 0x8C2C0907, // 0079 GETMET R11 R4 K7 + 0x58340010, // 007A LDCONST R13 K16 + 0x5838000A, // 007B LDCONST R14 K10 + 0x7C2C0600, // 007C CALL R11 3 + 0x7C1C0800, // 007D CALL R7 4 + 0x58200011, // 007E LDCONST R8 K17 + 0x7C140600, // 007F CALL R5 3 + 0x8C140512, // 0080 GETMET R5 R2 K18 + 0x881C0116, // 0081 GETMBR R7 R0 K22 + 0x8C200907, // 0082 GETMET R8 R4 K7 + 0x58280010, // 0083 LDCONST R10 K16 + 0x582C000A, // 0084 LDCONST R11 K10 + 0x7C200600, // 0085 CALL R8 3 + 0x7C140600, // 0086 CALL R5 3 + 0xB8120600, // 0087 GETNGBL R4 K3 + 0x8C10090C, // 0088 GETMET R4 R4 K12 + 0x8C18070D, // 0089 GETMET R6 R3 K13 + 0x58200017, // 008A LDCONST R8 K23 + 0x78060001, // 008B JMPF R1 #008E + 0x58240004, // 008C LDCONST R9 K4 + 0x70020000, // 008D JMP #008F + 0x58240015, // 008E LDCONST R9 K21 + 0x78060001, // 008F JMPF R1 #0092 + 0x88280105, // 0090 GETMBR R10 R0 K5 + 0x70020000, // 0091 JMP #0093 + 0x88280116, // 0092 GETMBR R10 R0 K22 + 0x7C180800, // 0093 CALL R6 4 + 0x581C0018, // 0094 LDCONST R7 K24 + 0x7C100600, // 0095 CALL R4 3 + 0xA8040001, // 0096 EXBLK 1 1 + 0x70020010, // 0097 JMP #00A9 + 0xAC100002, // 0098 CATCH R4 0 2 + 0x7002000D, // 0099 JMP #00A8 + 0xB81A0600, // 009A GETNGBL R6 K3 + 0x8C180D0C, // 009B GETMET R6 R6 K12 + 0x60200008, // 009C GETGBL R8 G8 + 0x5C240800, // 009D MOVE R9 R4 + 0x7C200200, // 009E CALL R8 1 + 0x00223208, // 009F ADD R8 K25 R8 + 0x0020111A, // 00A0 ADD R8 R8 K26 + 0x60240008, // 00A1 GETGBL R9 G8 + 0x5C280A00, // 00A2 MOVE R10 R5 + 0x7C240200, // 00A3 CALL R9 1 + 0x00201009, // 00A4 ADD R8 R8 R9 + 0x58240018, // 00A5 LDCONST R9 K24 + 0x7C180600, // 00A6 CALL R6 3 + 0x70020000, // 00A7 JMP #00A9 + 0xB0080000, // 00A8 RAISE 2 R0 R0 + 0x8C10011B, // 00A9 GETMET R4 R0 K27 + 0x7C100200, // 00AA CALL R4 1 + 0x80000000, // 00AB RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: _compute_pbkdf +********************************************************************/ +be_local_closure(Matter_Device__compute_pbkdf, /* name */ + be_nested_proto( + 14, /* nstack */ + 4, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[11]) { /* constants */ + /* K0 */ be_nested_str_weak(crypto), + /* K1 */ be_nested_str_weak(string), + /* K2 */ be_nested_str_weak(add), + /* K3 */ be_nested_str_weak(PBKDF2_HMAC_SHA256), + /* K4 */ be_nested_str_weak(derive), + /* K5 */ be_const_int(0), + /* K6 */ be_nested_str_weak(root_w0), + /* K7 */ be_nested_str_weak(EC_P256), + /* K8 */ be_nested_str_weak(mod), + /* K9 */ be_nested_str_weak(root_L), + /* K10 */ be_nested_str_weak(public_key), + }), + be_str_weak(_compute_pbkdf), + &be_const_str_solidified, + ( &(const binstruction[41]) { /* code */ + 0xA4120000, // 0000 IMPORT R4 K0 + 0xA4160200, // 0001 IMPORT R5 K1 + 0x60180015, // 0002 GETGBL R6 G21 + 0x7C180000, // 0003 CALL R6 0 + 0x8C180D02, // 0004 GETMET R6 R6 K2 + 0x5C200200, // 0005 MOVE R8 R1 + 0x54260003, // 0006 LDINT R9 4 + 0x7C180600, // 0007 CALL R6 3 + 0x8C1C0903, // 0008 GETMET R7 R4 K3 + 0x7C1C0200, // 0009 CALL R7 1 + 0x8C1C0F04, // 000A GETMET R7 R7 K4 + 0x5C240C00, // 000B MOVE R9 R6 + 0x5C280600, // 000C MOVE R10 R3 + 0x5C2C0400, // 000D MOVE R11 R2 + 0x5432004F, // 000E LDINT R12 80 + 0x7C1C0A00, // 000F CALL R7 5 + 0x54220026, // 0010 LDINT R8 39 + 0x40220A08, // 0011 CONNECT R8 K5 R8 + 0x94200E08, // 0012 GETIDX R8 R7 R8 + 0x54260027, // 0013 LDINT R9 40 + 0x542A004E, // 0014 LDINT R10 79 + 0x4024120A, // 0015 CONNECT R9 R9 R10 + 0x94240E09, // 0016 GETIDX R9 R7 R9 + 0x8C280907, // 0017 GETMET R10 R4 K7 + 0x7C280200, // 0018 CALL R10 1 + 0x8C281508, // 0019 GETMET R10 R10 K8 + 0x5C301000, // 001A MOVE R12 R8 + 0x7C280400, // 001B CALL R10 2 + 0x90020C0A, // 001C SETMBR R0 K6 R10 + 0x8C280907, // 001D GETMET R10 R4 K7 + 0x7C280200, // 001E CALL R10 1 + 0x8C281508, // 001F GETMET R10 R10 K8 + 0x5C301200, // 0020 MOVE R12 R9 + 0x7C280400, // 0021 CALL R10 2 + 0x8C2C0907, // 0022 GETMET R11 R4 K7 + 0x7C2C0200, // 0023 CALL R11 1 + 0x8C2C170A, // 0024 GETMET R11 R11 K10 + 0x5C341400, // 0025 MOVE R13 R10 + 0x7C2C0400, // 0026 CALL R11 2 + 0x9002120B, // 0027 SETMBR R0 K9 R11 + 0x80000000, // 0028 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: start_commissioning_complete +********************************************************************/ +be_local_closure(Matter_Device_start_commissioning_complete, /* name */ + be_nested_proto( + 6, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 5]) { /* constants */ + /* K0 */ be_nested_str_weak(tasmota), + /* K1 */ be_nested_str_weak(log), + /* K2 */ be_nested_str_weak(MTR_X3A_X20_X2A_X2A_X2A_X20Commissioning_X20complete_X20_X2A_X2A_X2A), + /* K3 */ be_const_int(2), + /* K4 */ be_nested_str_weak(stop_basic_commissioning), + }), + be_str_weak(start_commissioning_complete), + &be_const_str_solidified, + ( &(const binstruction[ 8]) { /* code */ + 0xB80A0000, // 0000 GETNGBL R2 K0 + 0x8C080501, // 0001 GETMET R2 R2 K1 + 0x58100002, // 0002 LDCONST R4 K2 + 0x58140003, // 0003 LDCONST R5 K3 + 0x7C080600, // 0004 CALL R2 3 + 0x8C080104, // 0005 GETMET R2 R0 K4 + 0x7C080200, // 0006 CALL R2 1 + 0x80000000, // 0007 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: register_native_classes +********************************************************************/ +be_local_closure(Matter_Device_register_native_classes, /* name */ + be_nested_proto( + 12, /* nstack */ + 3, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[17]) { /* constants */ + /* K0 */ be_nested_str_weak(introspect), + /* K1 */ be_nested_str_weak(string), + /* K2 */ be_nested_str_weak(members), + /* K3 */ be_nested_str_weak(matter), + /* K4 */ be_nested_str_weak(get), + /* K5 */ be_nested_str_weak(class), + /* K6 */ be_nested_str_weak(find), + /* K7 */ be_nested_str_weak(Plugin_), + /* K8 */ be_const_int(0), + /* K9 */ be_nested_str_weak(register_plugin_class), + /* K10 */ be_nested_str_weak(stop_iteration), + /* K11 */ be_nested_str_weak(tasmota), + /* K12 */ be_nested_str_weak(log), + /* K13 */ be_nested_str_weak(MTR_X3A_X20registered_X20classes_X20), + /* K14 */ be_nested_str_weak(k2l), + /* K15 */ be_nested_str_weak(plugins_classes), + /* K16 */ be_const_int(3), + }), + be_str_weak(register_native_classes), + &be_const_str_solidified, + ( &(const binstruction[43]) { /* code */ + 0xA40E0000, // 0000 IMPORT R3 K0 + 0xA4120200, // 0001 IMPORT R4 K1 + 0x60140010, // 0002 GETGBL R5 G16 + 0x8C180702, // 0003 GETMET R6 R3 K2 + 0xB8220600, // 0004 GETNGBL R8 K3 + 0x7C180400, // 0005 CALL R6 2 + 0x7C140200, // 0006 CALL R5 1 + 0xA8020014, // 0007 EXBLK 0 #001D + 0x5C180A00, // 0008 MOVE R6 R5 + 0x7C180000, // 0009 CALL R6 0 + 0x8C1C0704, // 000A GETMET R7 R3 K4 + 0xB8260600, // 000B GETNGBL R9 K3 + 0x5C280C00, // 000C MOVE R10 R6 + 0x7C1C0600, // 000D CALL R7 3 + 0x60200004, // 000E GETGBL R8 G4 + 0x5C240E00, // 000F MOVE R9 R7 + 0x7C200200, // 0010 CALL R8 1 + 0x1C201105, // 0011 EQ R8 R8 K5 + 0x78220008, // 0012 JMPF R8 #001C + 0x8C200906, // 0013 GETMET R8 R4 K6 + 0x5C280C00, // 0014 MOVE R10 R6 + 0x582C0007, // 0015 LDCONST R11 K7 + 0x7C200600, // 0016 CALL R8 3 + 0x1C201108, // 0017 EQ R8 R8 K8 + 0x78220002, // 0018 JMPF R8 #001C + 0x8C200109, // 0019 GETMET R8 R0 K9 + 0x5C280E00, // 001A MOVE R10 R7 + 0x7C200400, // 001B CALL R8 2 + 0x7001FFEA, // 001C JMP #0008 + 0x5814000A, // 001D LDCONST R5 K10 + 0xAC140200, // 001E CATCH R5 1 0 + 0xB0080000, // 001F RAISE 2 R0 R0 + 0xB8161600, // 0020 GETNGBL R5 K11 + 0x8C140B0C, // 0021 GETMET R5 R5 K12 + 0x601C0008, // 0022 GETGBL R7 G8 + 0x8C20010E, // 0023 GETMET R8 R0 K14 + 0x8828010F, // 0024 GETMBR R10 R0 K15 + 0x7C200400, // 0025 CALL R8 2 + 0x7C1C0200, // 0026 CALL R7 1 + 0x001E1A07, // 0027 ADD R7 K13 R7 + 0x58200010, // 0028 LDCONST R8 K16 + 0x7C140600, // 0029 CALL R5 3 + 0x80000000, // 002A RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: save_before_restart +********************************************************************/ +be_local_closure(Matter_Device_save_before_restart, /* name */ + be_nested_proto( + 3, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 2]) { /* constants */ + /* K0 */ be_nested_str_weak(stop_basic_commissioning), + /* K1 */ be_nested_str_weak(mdns_remove_op_discovery_all_fabrics), + }), + be_str_weak(save_before_restart), + &be_const_str_solidified, + ( &(const binstruction[ 5]) { /* code */ + 0x8C040100, // 0000 GETMET R1 R0 K0 + 0x7C040200, // 0001 CALL R1 1 + 0x8C040101, // 0002 GETMET R1 R0 K1 + 0x7C040200, // 0003 CALL R1 1 + 0x80000000, // 0004 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: register_http_remote +********************************************************************/ +be_local_closure(Matter_Device_register_http_remote, /* name */ + be_nested_proto( + 8, /* nstack */ + 3, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 6]) { /* constants */ + /* K0 */ be_nested_str_weak(http_remotes), + /* K1 */ be_nested_str_weak(contains), + /* K2 */ be_nested_str_weak(get_timeout), + /* K3 */ be_nested_str_weak(set_timeout), + /* K4 */ be_nested_str_weak(matter), + /* K5 */ be_nested_str_weak(HTTP_remote), + }), + be_str_weak(register_http_remote), + &be_const_str_solidified, + ( &(const binstruction[32]) { /* code */ + 0x880C0100, // 0000 GETMBR R3 R0 K0 + 0x4C100000, // 0001 LDNIL R4 + 0x1C0C0604, // 0002 EQ R3 R3 R4 + 0x780E0002, // 0003 JMPF R3 #0007 + 0x600C0013, // 0004 GETGBL R3 G19 + 0x7C0C0000, // 0005 CALL R3 0 + 0x90020003, // 0006 SETMBR R0 K0 R3 + 0x4C0C0000, // 0007 LDNIL R3 + 0x88100100, // 0008 GETMBR R4 R0 K0 + 0x8C100901, // 0009 GETMET R4 R4 K1 + 0x5C180200, // 000A MOVE R6 R1 + 0x7C100400, // 000B CALL R4 2 + 0x78120009, // 000C JMPF R4 #0017 + 0x88100100, // 000D GETMBR R4 R0 K0 + 0x940C0801, // 000E GETIDX R3 R4 R1 + 0x8C140702, // 000F GETMET R5 R3 K2 + 0x7C140200, // 0010 CALL R5 1 + 0x14140405, // 0011 LT R5 R2 R5 + 0x78160002, // 0012 JMPF R5 #0016 + 0x8C140703, // 0013 GETMET R5 R3 K3 + 0x5C1C0400, // 0014 MOVE R7 R2 + 0x7C140400, // 0015 CALL R5 2 + 0x70020007, // 0016 JMP #001F + 0xB8120800, // 0017 GETNGBL R4 K4 + 0x8C100905, // 0018 GETMET R4 R4 K5 + 0x5C180200, // 0019 MOVE R6 R1 + 0x5C1C0400, // 001A MOVE R7 R2 + 0x7C100600, // 001B CALL R4 3 + 0x5C0C0800, // 001C MOVE R3 R4 + 0x88100100, // 001D GETMBR R4 R0 K0 + 0x98100203, // 001E SETIDX R4 R1 R3 + 0x80040600, // 001F RET 1 R3 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: get_plugin_class_arg +********************************************************************/ +be_local_closure(Matter_Device_get_plugin_class_arg, /* name */ + be_nested_proto( + 5, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 4]) { /* constants */ + /* K0 */ be_nested_str_weak(plugins_classes), + /* K1 */ be_nested_str_weak(find), + /* K2 */ be_nested_str_weak(ARG), + /* K3 */ be_nested_str_weak(), + }), + be_str_weak(get_plugin_class_arg), + &be_const_str_solidified, + ( &(const binstruction[ 9]) { /* code */ + 0x88080100, // 0000 GETMBR R2 R0 K0 + 0x8C080501, // 0001 GETMET R2 R2 K1 + 0x5C100200, // 0002 MOVE R4 R1 + 0x7C080400, // 0003 CALL R2 2 + 0x780A0001, // 0004 JMPF R2 #0007 + 0x880C0502, // 0005 GETMBR R3 R2 K2 + 0x70020000, // 0006 JMP #0008 + 0x580C0003, // 0007 LDCONST R3 K3 + 0x80040600, // 0008 RET 1 R3 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: init +********************************************************************/ +be_local_closure(Matter_Device_init, /* name */ + be_nested_proto( + 8, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 1, /* has sup protos */ + ( &(const struct bproto*[ 2]) { + be_nested_proto( + 4, /* nstack */ + 0, /* argc */ + 0, /* varg */ + 1, /* has upvals */ + ( &(const bupvaldesc[ 1]) { /* upvals */ + be_local_const_upval(1, 0), + }), + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 5]) { /* constants */ + /* K0 */ be_nested_str_weak(start), + /* K1 */ be_nested_str_weak(tasmota), + /* K2 */ be_nested_str_weak(remove_rule), + /* K3 */ be_nested_str_weak(Wifi_X23Connected), + /* K4 */ be_nested_str_weak(matter_start), + }), + be_str_weak(_anonymous_), + &be_const_str_solidified, + ( &(const binstruction[ 9]) { /* code */ + 0x68000000, // 0000 GETUPV R0 U0 + 0x8C000100, // 0001 GETMET R0 R0 K0 + 0x7C000200, // 0002 CALL R0 1 + 0xB8020200, // 0003 GETNGBL R0 K1 + 0x8C000102, // 0004 GETMET R0 R0 K2 + 0x58080003, // 0005 LDCONST R2 K3 + 0x580C0004, // 0006 LDCONST R3 K4 + 0x7C000600, // 0007 CALL R0 3 + 0x80000000, // 0008 RET 0 + }) + ), + be_nested_proto( + 4, /* nstack */ + 0, /* argc */ + 0, /* varg */ + 1, /* has upvals */ + ( &(const bupvaldesc[ 1]) { /* upvals */ + be_local_const_upval(1, 0), + }), + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 5]) { /* constants */ + /* K0 */ be_nested_str_weak(start), + /* K1 */ be_nested_str_weak(tasmota), + /* K2 */ be_nested_str_weak(remove_rule), + /* K3 */ be_nested_str_weak(Eth_X23Connected), + /* K4 */ be_nested_str_weak(matter_start), + }), + be_str_weak(_anonymous_), + &be_const_str_solidified, + ( &(const binstruction[ 9]) { /* code */ + 0x68000000, // 0000 GETUPV R0 U0 + 0x8C000100, // 0001 GETMET R0 R0 K0 + 0x7C000200, // 0002 CALL R0 1 + 0xB8020200, // 0003 GETNGBL R0 K1 + 0x8C000102, // 0004 GETMET R0 R0 K2 + 0x58080003, // 0005 LDCONST R2 K3 + 0x580C0004, // 0006 LDCONST R3 K4 + 0x7C000600, // 0007 CALL R0 3 + 0x80000000, // 0008 RET 0 + }) + ), + }), + 1, /* has constants */ + ( &(const bvalue[42]) { /* constants */ + /* K0 */ be_nested_str_weak(crypto), + /* K1 */ be_nested_str_weak(string), + /* K2 */ be_nested_str_weak(tasmota), + /* K3 */ be_nested_str_weak(get_option), + /* K4 */ be_nested_str_weak(matter), + /* K5 */ be_nested_str_weak(MATTER_OPTION), + /* K6 */ be_nested_str_weak(UI), + /* K7 */ be_nested_str_weak(started), + /* K8 */ be_nested_str_weak(tick), + /* K9 */ be_const_int(0), + /* K10 */ be_nested_str_weak(plugins), + /* K11 */ be_nested_str_weak(plugins_persist), + /* K12 */ be_nested_str_weak(plugins_classes), + /* K13 */ be_nested_str_weak(register_native_classes), + /* K14 */ be_nested_str_weak(vendorid), + /* K15 */ be_nested_str_weak(VENDOR_ID), + /* K16 */ be_nested_str_weak(productid), + /* K17 */ be_nested_str_weak(PRODUCT_ID), + /* K18 */ be_nested_str_weak(root_iterations), + /* K19 */ be_nested_str_weak(PBKDF_ITERATIONS), + /* K20 */ be_nested_str_weak(next_ep), + /* K21 */ be_nested_str_weak(root_salt), + /* K22 */ be_nested_str_weak(random), + /* K23 */ be_nested_str_weak(ipv4only), + /* K24 */ be_nested_str_weak(load_param), + /* K25 */ be_nested_str_weak(sessions), + /* K26 */ be_nested_str_weak(Session_Store), + /* K27 */ be_nested_str_weak(load_fabrics), + /* K28 */ be_nested_str_weak(message_handler), + /* K29 */ be_nested_str_weak(MessageHandler), + /* K30 */ be_nested_str_weak(ui), + /* K31 */ be_nested_str_weak(wifi), + /* K32 */ be_nested_str_weak(up), + /* K33 */ be_nested_str_weak(eth), + /* K34 */ be_nested_str_weak(start), + /* K35 */ be_nested_str_weak(add_rule), + /* K36 */ be_nested_str_weak(Wifi_X23Connected), + /* K37 */ be_nested_str_weak(matter_start), + /* K38 */ be_nested_str_weak(Eth_X23Connected), + /* K39 */ be_nested_str_weak(_init_basic_commissioning), + /* K40 */ be_nested_str_weak(add_driver), + /* K41 */ be_nested_str_weak(register_commands), + }), + be_str_weak(init), + &be_const_str_solidified, + ( &(const binstruction[104]) { /* code */ + 0xA4060000, // 0000 IMPORT R1 K0 + 0xA40A0200, // 0001 IMPORT R2 K1 + 0xB80E0400, // 0002 GETNGBL R3 K2 + 0x8C0C0703, // 0003 GETMET R3 R3 K3 + 0xB8160800, // 0004 GETNGBL R5 K4 + 0x88140B05, // 0005 GETMBR R5 R5 K5 + 0x7C0C0400, // 0006 CALL R3 2 + 0x740E0004, // 0007 JMPT R3 #000D + 0xB80E0800, // 0008 GETNGBL R3 K4 + 0x8C0C0706, // 0009 GETMET R3 R3 K6 + 0x5C140000, // 000A MOVE R5 R0 + 0x7C0C0400, // 000B CALL R3 2 + 0x80000600, // 000C RET 0 + 0x500C0000, // 000D LDBOOL R3 0 0 + 0x90020E03, // 000E SETMBR R0 K7 R3 + 0x90021109, // 000F SETMBR R0 K8 K9 + 0x600C0012, // 0010 GETGBL R3 G18 + 0x7C0C0000, // 0011 CALL R3 0 + 0x90021403, // 0012 SETMBR R0 K10 R3 + 0x500C0000, // 0013 LDBOOL R3 0 0 + 0x90021603, // 0014 SETMBR R0 K11 R3 + 0x600C0013, // 0015 GETGBL R3 G19 + 0x7C0C0000, // 0016 CALL R3 0 + 0x90021803, // 0017 SETMBR R0 K12 R3 + 0x8C0C010D, // 0018 GETMET R3 R0 K13 + 0x7C0C0200, // 0019 CALL R3 1 + 0x880C010F, // 001A GETMBR R3 R0 K15 + 0x90021C03, // 001B SETMBR R0 K14 R3 + 0x880C0111, // 001C GETMBR R3 R0 K17 + 0x90022003, // 001D SETMBR R0 K16 R3 + 0x880C0113, // 001E GETMBR R3 R0 K19 + 0x90022403, // 001F SETMBR R0 K18 R3 + 0x540E0032, // 0020 LDINT R3 51 + 0x90022803, // 0021 SETMBR R0 K20 R3 + 0x8C0C0316, // 0022 GETMET R3 R1 K22 + 0x5416000F, // 0023 LDINT R5 16 + 0x7C0C0400, // 0024 CALL R3 2 + 0x90022A03, // 0025 SETMBR R0 K21 R3 + 0x500C0000, // 0026 LDBOOL R3 0 0 + 0x90022E03, // 0027 SETMBR R0 K23 R3 + 0x8C0C0118, // 0028 GETMET R3 R0 K24 + 0x7C0C0200, // 0029 CALL R3 1 + 0xB80E0800, // 002A GETNGBL R3 K4 + 0x8C0C071A, // 002B GETMET R3 R3 K26 + 0x5C140000, // 002C MOVE R5 R0 + 0x7C0C0400, // 002D CALL R3 2 + 0x90023203, // 002E SETMBR R0 K25 R3 + 0x880C0119, // 002F GETMBR R3 R0 K25 + 0x8C0C071B, // 0030 GETMET R3 R3 K27 + 0x7C0C0200, // 0031 CALL R3 1 + 0xB80E0800, // 0032 GETNGBL R3 K4 + 0x8C0C071D, // 0033 GETMET R3 R3 K29 + 0x5C140000, // 0034 MOVE R5 R0 + 0x7C0C0400, // 0035 CALL R3 2 + 0x90023803, // 0036 SETMBR R0 K28 R3 + 0xB80E0800, // 0037 GETNGBL R3 K4 + 0x8C0C0706, // 0038 GETMET R3 R3 K6 + 0x5C140000, // 0039 MOVE R5 R0 + 0x7C0C0400, // 003A CALL R3 2 + 0x90023C03, // 003B SETMBR R0 K30 R3 + 0xB80E0400, // 003C GETNGBL R3 K2 + 0x8C0C071F, // 003D GETMET R3 R3 K31 + 0x7C0C0200, // 003E CALL R3 1 + 0x940C0720, // 003F GETIDX R3 R3 K32 + 0x740E0004, // 0040 JMPT R3 #0046 + 0xB80E0400, // 0041 GETNGBL R3 K2 + 0x8C0C0721, // 0042 GETMET R3 R3 K33 + 0x7C0C0200, // 0043 CALL R3 1 + 0x940C0720, // 0044 GETIDX R3 R3 K32 + 0x780E0001, // 0045 JMPF R3 #0048 + 0x8C0C0122, // 0046 GETMET R3 R0 K34 + 0x7C0C0200, // 0047 CALL R3 1 + 0xB80E0400, // 0048 GETNGBL R3 K2 + 0x8C0C071F, // 0049 GETMET R3 R3 K31 + 0x7C0C0200, // 004A CALL R3 1 + 0x940C0720, // 004B GETIDX R3 R3 K32 + 0x740E0005, // 004C JMPT R3 #0053 + 0xB80E0400, // 004D GETNGBL R3 K2 + 0x8C0C0723, // 004E GETMET R3 R3 K35 + 0x58140024, // 004F LDCONST R5 K36 + 0x84180000, // 0050 CLOSURE R6 P0 + 0x581C0025, // 0051 LDCONST R7 K37 + 0x7C0C0800, // 0052 CALL R3 4 + 0xB80E0400, // 0053 GETNGBL R3 K2 + 0x8C0C0721, // 0054 GETMET R3 R3 K33 + 0x7C0C0200, // 0055 CALL R3 1 + 0x940C0720, // 0056 GETIDX R3 R3 K32 + 0x740E0005, // 0057 JMPT R3 #005E + 0xB80E0400, // 0058 GETNGBL R3 K2 + 0x8C0C0723, // 0059 GETMET R3 R3 K35 + 0x58140026, // 005A LDCONST R5 K38 + 0x84180001, // 005B CLOSURE R6 P1 + 0x581C0025, // 005C LDCONST R7 K37 + 0x7C0C0800, // 005D CALL R3 4 + 0x8C0C0127, // 005E GETMET R3 R0 K39 + 0x7C0C0200, // 005F CALL R3 1 + 0xB80E0400, // 0060 GETNGBL R3 K2 + 0x8C0C0728, // 0061 GETMET R3 R3 K40 + 0x5C140000, // 0062 MOVE R5 R0 + 0x7C0C0400, // 0063 CALL R3 2 + 0x8C0C0129, // 0064 GETMET R3 R0 K41 + 0x7C0C0200, // 0065 CALL R3 1 + 0xA0000000, // 0066 CLOSE R0 + 0x80000000, // 0067 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: mdns_remove_PASE +********************************************************************/ +be_local_closure(Matter_Device_mdns_remove_PASE, /* name */ + be_nested_proto( + 12, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[22]) { /* constants */ + /* K0 */ be_nested_str_weak(mdns), + /* K1 */ be_nested_str_weak(string), + /* K2 */ be_nested_str_weak(mdns_pase_eth), + /* K3 */ be_nested_str_weak(tasmota), + /* K4 */ be_nested_str_weak(log), + /* K5 */ be_nested_str_weak(format), + /* K6 */ be_nested_str_weak(MTR_X3A_X20calling_X20mdns_X2Eremove_service_X28_X25s_X2C_X20_X25s_X2C_X20_X25s_X2C_X20_X25s_X29), + /* K7 */ be_nested_str_weak(_matterc), + /* K8 */ be_nested_str_weak(_udp), + /* K9 */ be_nested_str_weak(commissioning_instance_eth), + /* K10 */ be_nested_str_weak(hostname_eth), + /* K11 */ be_const_int(3), + /* K12 */ be_nested_str_weak(MTR_X3A_X20remove_X20mDNS_X20on_X20_X25s_X20_X27_X25s_X27), + /* K13 */ be_nested_str_weak(eth), + /* K14 */ be_const_int(2), + /* K15 */ be_nested_str_weak(remove_service), + /* K16 */ be_nested_str_weak(mdns_pase_wifi), + /* K17 */ be_nested_str_weak(commissioning_instance_wifi), + /* K18 */ be_nested_str_weak(hostname_wifi), + /* K19 */ be_nested_str_weak(wifi), + /* K20 */ be_nested_str_weak(MTR_X3A_X20Exception), + /* K21 */ be_nested_str_weak(_X7C), + }), + be_str_weak(mdns_remove_PASE), + &be_const_str_solidified, + ( &(const binstruction[83]) { /* code */ + 0xA4060000, // 0000 IMPORT R1 K0 + 0xA40A0200, // 0001 IMPORT R2 K1 + 0xA802003D, // 0002 EXBLK 0 #0041 + 0x880C0102, // 0003 GETMBR R3 R0 K2 + 0x780E001B, // 0004 JMPF R3 #0021 + 0xB80E0600, // 0005 GETNGBL R3 K3 + 0x8C0C0704, // 0006 GETMET R3 R3 K4 + 0x8C140505, // 0007 GETMET R5 R2 K5 + 0x581C0006, // 0008 LDCONST R7 K6 + 0x58200007, // 0009 LDCONST R8 K7 + 0x58240008, // 000A LDCONST R9 K8 + 0x88280109, // 000B GETMBR R10 R0 K9 + 0x882C010A, // 000C GETMBR R11 R0 K10 + 0x7C140C00, // 000D CALL R5 6 + 0x5818000B, // 000E LDCONST R6 K11 + 0x7C0C0600, // 000F CALL R3 3 + 0xB80E0600, // 0010 GETNGBL R3 K3 + 0x8C0C0704, // 0011 GETMET R3 R3 K4 + 0x8C140505, // 0012 GETMET R5 R2 K5 + 0x581C000C, // 0013 LDCONST R7 K12 + 0x5820000D, // 0014 LDCONST R8 K13 + 0x88240109, // 0015 GETMBR R9 R0 K9 + 0x7C140800, // 0016 CALL R5 4 + 0x5818000E, // 0017 LDCONST R6 K14 + 0x7C0C0600, // 0018 CALL R3 3 + 0x500C0000, // 0019 LDBOOL R3 0 0 + 0x90020403, // 001A SETMBR R0 K2 R3 + 0x8C0C030F, // 001B GETMET R3 R1 K15 + 0x58140007, // 001C LDCONST R5 K7 + 0x58180008, // 001D LDCONST R6 K8 + 0x881C0109, // 001E GETMBR R7 R0 K9 + 0x8820010A, // 001F GETMBR R8 R0 K10 + 0x7C0C0A00, // 0020 CALL R3 5 + 0x880C0110, // 0021 GETMBR R3 R0 K16 + 0x780E001B, // 0022 JMPF R3 #003F + 0xB80E0600, // 0023 GETNGBL R3 K3 + 0x8C0C0704, // 0024 GETMET R3 R3 K4 + 0x8C140505, // 0025 GETMET R5 R2 K5 + 0x581C0006, // 0026 LDCONST R7 K6 + 0x58200007, // 0027 LDCONST R8 K7 + 0x58240008, // 0028 LDCONST R9 K8 + 0x88280111, // 0029 GETMBR R10 R0 K17 + 0x882C0112, // 002A GETMBR R11 R0 K18 + 0x7C140C00, // 002B CALL R5 6 + 0x5818000B, // 002C LDCONST R6 K11 + 0x7C0C0600, // 002D CALL R3 3 + 0xB80E0600, // 002E GETNGBL R3 K3 + 0x8C0C0704, // 002F GETMET R3 R3 K4 + 0x8C140505, // 0030 GETMET R5 R2 K5 + 0x581C000C, // 0031 LDCONST R7 K12 + 0x58200013, // 0032 LDCONST R8 K19 + 0x88240111, // 0033 GETMBR R9 R0 K17 + 0x7C140800, // 0034 CALL R5 4 + 0x5818000E, // 0035 LDCONST R6 K14 + 0x7C0C0600, // 0036 CALL R3 3 + 0x500C0000, // 0037 LDBOOL R3 0 0 + 0x90022003, // 0038 SETMBR R0 K16 R3 + 0x8C0C030F, // 0039 GETMET R3 R1 K15 + 0x58140007, // 003A LDCONST R5 K7 + 0x58180008, // 003B LDCONST R6 K8 + 0x881C0111, // 003C GETMBR R7 R0 K17 + 0x88200112, // 003D GETMBR R8 R0 K18 + 0x7C0C0A00, // 003E CALL R3 5 + 0xA8040001, // 003F EXBLK 1 1 + 0x70020010, // 0040 JMP #0052 + 0xAC0C0002, // 0041 CATCH R3 0 2 + 0x7002000D, // 0042 JMP #0051 + 0xB8160600, // 0043 GETNGBL R5 K3 + 0x8C140B04, // 0044 GETMET R5 R5 K4 + 0x601C0008, // 0045 GETGBL R7 G8 + 0x5C200600, // 0046 MOVE R8 R3 + 0x7C1C0200, // 0047 CALL R7 1 + 0x001E2807, // 0048 ADD R7 K20 R7 + 0x001C0F15, // 0049 ADD R7 R7 K21 + 0x60200008, // 004A GETGBL R8 G8 + 0x5C240800, // 004B MOVE R9 R4 + 0x7C200200, // 004C CALL R8 1 + 0x001C0E08, // 004D ADD R7 R7 R8 + 0x5820000E, // 004E LDCONST R8 K14 + 0x7C140600, // 004F CALL R5 3 + 0x70020000, // 0050 JMP #0052 + 0xB0080000, // 0051 RAISE 2 R0 R0 + 0x80000000, // 0052 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: stop +********************************************************************/ +be_local_closure(Matter_Device_stop, /* name */ + be_nested_proto( + 4, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 4]) { /* constants */ + /* K0 */ be_nested_str_weak(tasmota), + /* K1 */ be_nested_str_weak(remove_driver), + /* K2 */ be_nested_str_weak(udp_server), + /* K3 */ be_nested_str_weak(stop), + }), + be_str_weak(stop), + &be_const_str_solidified, + ( &(const binstruction[10]) { /* code */ + 0xB8060000, // 0000 GETNGBL R1 K0 + 0x8C040301, // 0001 GETMET R1 R1 K1 + 0x5C0C0000, // 0002 MOVE R3 R0 + 0x7C040400, // 0003 CALL R1 2 + 0x88040102, // 0004 GETMBR R1 R0 K2 + 0x78060002, // 0005 JMPF R1 #0009 + 0x88040102, // 0006 GETMBR R1 R0 K2 + 0x8C040303, // 0007 GETMET R1 R1 K3 + 0x7C040200, // 0008 CALL R1 1 + 0x80000000, // 0009 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: stop_basic_commissioning +********************************************************************/ +be_local_closure(Matter_Device_stop_basic_commissioning, /* name */ + be_nested_proto( + 5, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[13]) { /* constants */ + /* K0 */ be_nested_str_weak(is_root_commissioning_open), + /* K1 */ be_nested_str_weak(tasmota), + /* K2 */ be_nested_str_weak(publish_result), + /* K3 */ be_nested_str_weak(_X7B_X22Matter_X22_X3A_X7B_X22Commissioning_X22_X3A0_X7D_X7D), + /* K4 */ be_nested_str_weak(Matter), + /* K5 */ be_nested_str_weak(commissioning_open), + /* K6 */ be_nested_str_weak(mdns_remove_PASE), + /* K7 */ be_nested_str_weak(commissioning_iterations), + /* K8 */ be_nested_str_weak(commissioning_discriminator), + /* K9 */ be_nested_str_weak(commissioning_salt), + /* K10 */ be_nested_str_weak(commissioning_w0), + /* K11 */ be_nested_str_weak(commissioning_L), + /* K12 */ be_nested_str_weak(commissioning_admin_fabric), + }), + be_str_weak(stop_basic_commissioning), + &be_const_str_solidified, + ( &(const binstruction[25]) { /* code */ + 0x8C040100, // 0000 GETMET R1 R0 K0 + 0x7C040200, // 0001 CALL R1 1 + 0x78060004, // 0002 JMPF R1 #0008 + 0xB8060200, // 0003 GETNGBL R1 K1 + 0x8C040302, // 0004 GETMET R1 R1 K2 + 0x580C0003, // 0005 LDCONST R3 K3 + 0x58100004, // 0006 LDCONST R4 K4 + 0x7C040600, // 0007 CALL R1 3 + 0x4C040000, // 0008 LDNIL R1 + 0x90020A01, // 0009 SETMBR R0 K5 R1 + 0x8C040106, // 000A GETMET R1 R0 K6 + 0x7C040200, // 000B CALL R1 1 + 0x4C040000, // 000C LDNIL R1 + 0x90020E01, // 000D SETMBR R0 K7 R1 + 0x4C040000, // 000E LDNIL R1 + 0x90021001, // 000F SETMBR R0 K8 R1 + 0x4C040000, // 0010 LDNIL R1 + 0x90021201, // 0011 SETMBR R0 K9 R1 + 0x4C040000, // 0012 LDNIL R1 + 0x90021401, // 0013 SETMBR R0 K10 R1 + 0x4C040000, // 0014 LDNIL R1 + 0x90021601, // 0015 SETMBR R0 K11 R1 + 0x4C040000, // 0016 LDNIL R1 + 0x90021801, // 0017 SETMBR R0 K12 R1 + 0x80000000, // 0018 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: start_commissioning_complete_deferred +********************************************************************/ +be_local_closure(Matter_Device_start_commissioning_complete_deferred, /* name */ + be_nested_proto( + 6, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 1, /* has sup protos */ + ( &(const struct bproto*[ 1]) { + be_nested_proto( + 3, /* nstack */ + 0, /* argc */ + 0, /* varg */ + 1, /* has upvals */ + ( &(const bupvaldesc[ 2]) { /* upvals */ + be_local_const_upval(1, 0), + be_local_const_upval(1, 1), + }), + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 1]) { /* constants */ + /* K0 */ be_nested_str_weak(start_commissioning_complete), + }), + be_str_weak(_X3Clambda_X3E), + &be_const_str_solidified, + ( &(const binstruction[ 5]) { /* code */ + 0x68000000, // 0000 GETUPV R0 U0 + 0x8C000100, // 0001 GETMET R0 R0 K0 + 0x68080001, // 0002 GETUPV R2 U1 + 0x7C000400, // 0003 CALL R0 2 + 0x80040000, // 0004 RET 1 R0 + }) + ), + }), + 1, /* has constants */ + ( &(const bvalue[ 3]) { /* constants */ + /* K0 */ be_nested_str_weak(tasmota), + /* K1 */ be_nested_str_weak(set_timer), + /* K2 */ be_const_int(0), + }), + be_str_weak(start_commissioning_complete_deferred), + &be_const_str_solidified, + ( &(const binstruction[ 7]) { /* code */ + 0xB80A0000, // 0000 GETNGBL R2 K0 + 0x8C080501, // 0001 GETMET R2 R2 K1 + 0x58100002, // 0002 LDCONST R4 K2 + 0x84140000, // 0003 CLOSURE R5 P0 + 0x7C080600, // 0004 CALL R2 3 + 0xA0000000, // 0005 CLOSE R0 + 0x80000000, // 0006 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: start_operational_discovery_deferred +********************************************************************/ +be_local_closure(Matter_Device_start_operational_discovery_deferred, /* name */ + be_nested_proto( + 6, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 1, /* has sup protos */ + ( &(const struct bproto*[ 1]) { + be_nested_proto( + 3, /* nstack */ + 0, /* argc */ + 0, /* varg */ + 1, /* has upvals */ + ( &(const bupvaldesc[ 2]) { /* upvals */ + be_local_const_upval(1, 0), + be_local_const_upval(1, 1), + }), + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 1]) { /* constants */ + /* K0 */ be_nested_str_weak(start_operational_discovery), + }), + be_str_weak(_X3Clambda_X3E), + &be_const_str_solidified, + ( &(const binstruction[ 5]) { /* code */ + 0x68000000, // 0000 GETUPV R0 U0 + 0x8C000100, // 0001 GETMET R0 R0 K0 + 0x68080001, // 0002 GETUPV R2 U1 + 0x7C000400, // 0003 CALL R0 2 + 0x80040000, // 0004 RET 1 R0 + }) + ), + }), + 1, /* has constants */ + ( &(const bvalue[ 3]) { /* constants */ + /* K0 */ be_nested_str_weak(tasmota), + /* K1 */ be_nested_str_weak(set_timer), + /* K2 */ be_const_int(0), + }), + be_str_weak(start_operational_discovery_deferred), + &be_const_str_solidified, + ( &(const binstruction[ 7]) { /* code */ + 0xB80A0000, // 0000 GETNGBL R2 K0 + 0x8C080501, // 0001 GETMET R2 R2 K1 + 0x58100002, // 0002 LDCONST R4 K2 + 0x84140000, // 0003 CLOSURE R5 P0 + 0x7C080600, // 0004 CALL R2 3 + 0xA0000000, // 0005 CLOSE R0 + 0x80000000, // 0006 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: bridge_add_endpoint +********************************************************************/ +be_local_closure(Matter_Device_bridge_add_endpoint, /* name */ + be_nested_proto( + 11, /* nstack */ + 3, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[18]) { /* constants */ + /* K0 */ be_nested_str_weak(plugins_classes), + /* K1 */ be_nested_str_weak(find), + /* K2 */ be_nested_str_weak(tasmota), + /* K3 */ be_nested_str_weak(log), + /* K4 */ be_nested_str_weak(MTR_X3A_X20unknown_X20class_X20name_X20_X27), + /* K5 */ be_nested_str_weak(_X27_X20skipping), + /* K6 */ be_const_int(2), + /* K7 */ be_nested_str_weak(next_ep), + /* K8 */ be_nested_str_weak(plugins), + /* K9 */ be_nested_str_weak(push), + /* K10 */ be_nested_str_weak(type), + /* K11 */ be_nested_str_weak(keys), + /* K12 */ be_nested_str_weak(stop_iteration), + /* K13 */ be_nested_str_weak(plugins_config), + /* K14 */ be_nested_str_weak(plugins_persist), + /* K15 */ be_const_int(1), + /* K16 */ be_nested_str_weak(save_param), + /* K17 */ be_nested_str_weak(signal_endpoints_changed), + }), + be_str_weak(bridge_add_endpoint), + &be_const_str_solidified, + ( &(const binstruction[58]) { /* code */ + 0x880C0100, // 0000 GETMBR R3 R0 K0 + 0x8C0C0701, // 0001 GETMET R3 R3 K1 + 0x5C140200, // 0002 MOVE R5 R1 + 0x7C0C0400, // 0003 CALL R3 2 + 0x4C100000, // 0004 LDNIL R4 + 0x1C100604, // 0005 EQ R4 R3 R4 + 0x78120009, // 0006 JMPF R4 #0011 + 0xB8120400, // 0007 GETNGBL R4 K2 + 0x8C100903, // 0008 GETMET R4 R4 K3 + 0x60180008, // 0009 GETGBL R6 G8 + 0x5C1C0200, // 000A MOVE R7 R1 + 0x7C180200, // 000B CALL R6 1 + 0x001A0806, // 000C ADD R6 K4 R6 + 0x00180D05, // 000D ADD R6 R6 K5 + 0x581C0006, // 000E LDCONST R7 K6 + 0x7C100600, // 000F CALL R4 3 + 0x80000800, // 0010 RET 0 + 0x88100107, // 0011 GETMBR R4 R0 K7 + 0x60140008, // 0012 GETGBL R5 G8 + 0x5C180800, // 0013 MOVE R6 R4 + 0x7C140200, // 0014 CALL R5 1 + 0x5C180600, // 0015 MOVE R6 R3 + 0x5C1C0000, // 0016 MOVE R7 R0 + 0x5C200800, // 0017 MOVE R8 R4 + 0x5C240400, // 0018 MOVE R9 R2 + 0x7C180600, // 0019 CALL R6 3 + 0x881C0108, // 001A GETMBR R7 R0 K8 + 0x8C1C0F09, // 001B GETMET R7 R7 K9 + 0x5C240C00, // 001C MOVE R9 R6 + 0x7C1C0400, // 001D CALL R7 2 + 0x601C0013, // 001E GETGBL R7 G19 + 0x7C1C0000, // 001F CALL R7 0 + 0x981E1401, // 0020 SETIDX R7 K10 R1 + 0x60200010, // 0021 GETGBL R8 G16 + 0x8C24050B, // 0022 GETMET R9 R2 K11 + 0x7C240200, // 0023 CALL R9 1 + 0x7C200200, // 0024 CALL R8 1 + 0xA8020004, // 0025 EXBLK 0 #002B + 0x5C241000, // 0026 MOVE R9 R8 + 0x7C240000, // 0027 CALL R9 0 + 0x94280409, // 0028 GETIDX R10 R2 R9 + 0x981C120A, // 0029 SETIDX R7 R9 R10 + 0x7001FFFA, // 002A JMP #0026 + 0x5820000C, // 002B LDCONST R8 K12 + 0xAC200200, // 002C CATCH R8 1 0 + 0xB0080000, // 002D RAISE 2 R0 R0 + 0x8820010D, // 002E GETMBR R8 R0 K13 + 0x98200A07, // 002F SETIDX R8 R5 R7 + 0x50200200, // 0030 LDBOOL R8 1 0 + 0x90021C08, // 0031 SETMBR R0 K14 R8 + 0x88200107, // 0032 GETMBR R8 R0 K7 + 0x0020110F, // 0033 ADD R8 R8 K15 + 0x90020E08, // 0034 SETMBR R0 K7 R8 + 0x8C200110, // 0035 GETMET R8 R0 K16 + 0x7C200200, // 0036 CALL R8 1 + 0x8C200111, // 0037 GETMET R8 R0 K17 + 0x7C200200, // 0038 CALL R8 1 + 0x80040800, // 0039 RET 1 R4 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: event_fabrics_saved +********************************************************************/ +be_local_closure(Matter_Device_event_fabrics_saved, /* name */ + be_nested_proto( + 3, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 5]) { /* constants */ + /* K0 */ be_nested_str_weak(sessions), + /* K1 */ be_nested_str_weak(count_active_fabrics), + /* K2 */ be_const_int(0), + /* K3 */ be_nested_str_weak(plugins_persist), + /* K4 */ be_nested_str_weak(save_param), + }), + be_str_weak(event_fabrics_saved), + &be_const_str_solidified, + ( &(const binstruction[12]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x8C040301, // 0001 GETMET R1 R1 K1 + 0x7C040200, // 0002 CALL R1 1 + 0x24040302, // 0003 GT R1 R1 K2 + 0x78060005, // 0004 JMPF R1 #000B + 0x88040103, // 0005 GETMBR R1 R0 K3 + 0x74060003, // 0006 JMPT R1 #000B + 0x50040200, // 0007 LDBOOL R1 1 0 + 0x90020601, // 0008 SETMBR R0 K3 R1 + 0x8C040104, // 0009 GETMET R1 R0 K4 + 0x7C040200, // 000A CALL R1 1 + 0x80000000, // 000B RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: remove_fabric +********************************************************************/ +be_local_closure(Matter_Device_remove_fabric, /* name */ + be_nested_proto( + 9, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[12]) { /* constants */ + /* K0 */ be_nested_str_weak(sessions), + /* K1 */ be_nested_str_weak(find_children_fabrics), + /* K2 */ be_nested_str_weak(get_fabric_index), + /* K3 */ be_nested_str_weak(find_fabric_by_index), + /* K4 */ be_nested_str_weak(message_handler), + /* K5 */ be_nested_str_weak(im), + /* K6 */ be_nested_str_weak(subs_shop), + /* K7 */ be_nested_str_weak(remove_by_fabric), + /* K8 */ be_nested_str_weak(mdns_remove_op_discovery), + /* K9 */ be_nested_str_weak(remove_fabric), + /* K10 */ be_nested_str_weak(stop_iteration), + /* K11 */ be_nested_str_weak(save_fabrics), + }), + be_str_weak(remove_fabric), + &be_const_str_solidified, + ( &(const binstruction[43]) { /* code */ + 0x88080100, // 0000 GETMBR R2 R0 K0 + 0x8C080501, // 0001 GETMET R2 R2 K1 + 0x8C100302, // 0002 GETMET R4 R1 K2 + 0x7C100200, // 0003 CALL R4 1 + 0x7C080400, // 0004 CALL R2 2 + 0x4C0C0000, // 0005 LDNIL R3 + 0x1C0C0403, // 0006 EQ R3 R2 R3 + 0x780E0000, // 0007 JMPF R3 #0009 + 0x80000600, // 0008 RET 0 + 0x600C0010, // 0009 GETGBL R3 G16 + 0x5C100400, // 000A MOVE R4 R2 + 0x7C0C0200, // 000B CALL R3 1 + 0xA8020016, // 000C EXBLK 0 #0024 + 0x5C100600, // 000D MOVE R4 R3 + 0x7C100000, // 000E CALL R4 0 + 0x88140100, // 000F GETMBR R5 R0 K0 + 0x8C140B03, // 0010 GETMET R5 R5 K3 + 0x5C1C0800, // 0011 MOVE R7 R4 + 0x7C140400, // 0012 CALL R5 2 + 0x4C180000, // 0013 LDNIL R6 + 0x20180A06, // 0014 NE R6 R5 R6 + 0x781A000C, // 0015 JMPF R6 #0023 + 0x88180104, // 0016 GETMBR R6 R0 K4 + 0x88180D05, // 0017 GETMBR R6 R6 K5 + 0x88180D06, // 0018 GETMBR R6 R6 K6 + 0x8C180D07, // 0019 GETMET R6 R6 K7 + 0x5C200A00, // 001A MOVE R8 R5 + 0x7C180400, // 001B CALL R6 2 + 0x8C180108, // 001C GETMET R6 R0 K8 + 0x5C200A00, // 001D MOVE R8 R5 + 0x7C180400, // 001E CALL R6 2 + 0x88180100, // 001F GETMBR R6 R0 K0 + 0x8C180D09, // 0020 GETMET R6 R6 K9 + 0x5C200A00, // 0021 MOVE R8 R5 + 0x7C180400, // 0022 CALL R6 2 + 0x7001FFE8, // 0023 JMP #000D + 0x580C000A, // 0024 LDCONST R3 K10 + 0xAC0C0200, // 0025 CATCH R3 1 0 + 0xB0080000, // 0026 RAISE 2 R0 R0 + 0x880C0100, // 0027 GETMBR R3 R0 K0 + 0x8C0C070B, // 0028 GETMET R3 R3 K11 + 0x7C0C0200, // 0029 CALL R3 1 + 0x80000000, // 002A RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: _init_basic_commissioning +********************************************************************/ +be_local_closure(Matter_Device__init_basic_commissioning, /* name */ + be_nested_proto( + 3, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 4]) { /* constants */ + /* K0 */ be_nested_str_weak(sessions), + /* K1 */ be_nested_str_weak(count_active_fabrics), + /* K2 */ be_const_int(0), + /* K3 */ be_nested_str_weak(start_root_basic_commissioning), + }), + be_str_weak(_init_basic_commissioning), + &be_const_str_solidified, + ( &(const binstruction[ 8]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x8C040301, // 0001 GETMET R1 R1 K1 + 0x7C040200, // 0002 CALL R1 1 + 0x1C040302, // 0003 EQ R1 R1 K2 + 0x78060001, // 0004 JMPF R1 #0007 + 0x8C040103, // 0005 GETMET R1 R0 K3 + 0x7C040200, // 0006 CALL R1 1 + 0x80000000, // 0007 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: get_plugin_class_displayname +********************************************************************/ +be_local_closure(Matter_Device_get_plugin_class_displayname, /* name */ + be_nested_proto( + 5, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 4]) { /* constants */ + /* K0 */ be_nested_str_weak(plugins_classes), + /* K1 */ be_nested_str_weak(find), + /* K2 */ be_nested_str_weak(NAME), + /* K3 */ be_nested_str_weak(), + }), + be_str_weak(get_plugin_class_displayname), + &be_const_str_solidified, + ( &(const binstruction[ 9]) { /* code */ + 0x88080100, // 0000 GETMBR R2 R0 K0 + 0x8C080501, // 0001 GETMET R2 R2 K1 + 0x5C100200, // 0002 MOVE R4 R1 + 0x7C080400, // 0003 CALL R2 2 + 0x780A0001, // 0004 JMPF R2 #0007 + 0x880C0502, // 0005 GETMBR R3 R2 K2 + 0x70020000, // 0006 JMP #0008 + 0x580C0003, // 0007 LDCONST R3 K3 + 0x80040600, // 0008 RET 1 R3 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: compute_qrcode_content +********************************************************************/ +be_local_closure(Matter_Device_compute_qrcode_content, /* name */ + be_nested_proto( + 8, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[12]) { /* constants */ + /* K0 */ be_nested_str_weak(resize), + /* K1 */ be_nested_str_weak(setbits), + /* K2 */ be_const_int(3), + /* K3 */ be_nested_str_weak(vendorid), + /* K4 */ be_nested_str_weak(productid), + /* K5 */ be_nested_str_weak(root_discriminator), + /* K6 */ be_nested_str_weak(root_passcode), + /* K7 */ be_const_int(134217727), + /* K8 */ be_nested_str_weak(MT_X3A), + /* K9 */ be_nested_str_weak(matter), + /* K10 */ be_nested_str_weak(Base38), + /* K11 */ be_nested_str_weak(encode), + }), + be_str_weak(compute_qrcode_content), + &be_const_str_solidified, + ( &(const binstruction[40]) { /* code */ + 0x60040015, // 0000 GETGBL R1 G21 + 0x7C040000, // 0001 CALL R1 0 + 0x8C040300, // 0002 GETMET R1 R1 K0 + 0x540E000A, // 0003 LDINT R3 11 + 0x7C040400, // 0004 CALL R1 2 + 0x8C080301, // 0005 GETMET R2 R1 K1 + 0x58100002, // 0006 LDCONST R4 K2 + 0x5416000F, // 0007 LDINT R5 16 + 0x88180103, // 0008 GETMBR R6 R0 K3 + 0x7C080800, // 0009 CALL R2 4 + 0x8C080301, // 000A GETMET R2 R1 K1 + 0x54120012, // 000B LDINT R4 19 + 0x5416000F, // 000C LDINT R5 16 + 0x88180104, // 000D GETMBR R6 R0 K4 + 0x7C080800, // 000E CALL R2 4 + 0x8C080301, // 000F GETMET R2 R1 K1 + 0x54120024, // 0010 LDINT R4 37 + 0x54160007, // 0011 LDINT R5 8 + 0x541A0003, // 0012 LDINT R6 4 + 0x7C080800, // 0013 CALL R2 4 + 0x8C080301, // 0014 GETMET R2 R1 K1 + 0x5412002C, // 0015 LDINT R4 45 + 0x5416000B, // 0016 LDINT R5 12 + 0x88180105, // 0017 GETMBR R6 R0 K5 + 0x541E0FFE, // 0018 LDINT R7 4095 + 0x2C180C07, // 0019 AND R6 R6 R7 + 0x7C080800, // 001A CALL R2 4 + 0x8C080301, // 001B GETMET R2 R1 K1 + 0x54120038, // 001C LDINT R4 57 + 0x5416001A, // 001D LDINT R5 27 + 0x88180106, // 001E GETMBR R6 R0 K6 + 0x2C180D07, // 001F AND R6 R6 K7 + 0x7C080800, // 0020 CALL R2 4 + 0xB80A1200, // 0021 GETNGBL R2 K9 + 0x8808050A, // 0022 GETMBR R2 R2 K10 + 0x8C08050B, // 0023 GETMET R2 R2 K11 + 0x5C100200, // 0024 MOVE R4 R1 + 0x7C080400, // 0025 CALL R2 2 + 0x000A1002, // 0026 ADD R2 K8 R2 + 0x80040400, // 0027 RET 1 R2 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: mdns_announce_op_discovery +********************************************************************/ +be_local_closure(Matter_Device_mdns_announce_op_discovery, /* name */ + be_nested_proto( + 15, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[29]) { /* constants */ + /* K0 */ be_nested_str_weak(mdns), + /* K1 */ be_nested_str_weak(string), + /* K2 */ be_nested_str_weak(get_device_id), + /* K3 */ be_nested_str_weak(copy), + /* K4 */ be_nested_str_weak(reverse), + /* K5 */ be_nested_str_weak(get_fabric_compressed), + /* K6 */ be_nested_str_weak(tohex), + /* K7 */ be_nested_str_weak(_X2D), + /* K8 */ be_nested_str_weak(tasmota), + /* K9 */ be_nested_str_weak(log), + /* K10 */ be_nested_str_weak(MTR_X3A_X20Operational_X20Discovery_X20node_X20_X3D_X20), + /* K11 */ be_const_int(2), + /* K12 */ be_nested_str_weak(eth), + /* K13 */ be_nested_str_weak(find), + /* K14 */ be_nested_str_weak(up), + /* K15 */ be_nested_str_weak(format), + /* K16 */ be_nested_str_weak(MTR_X3A_X20adding_X20mDNS_X20on_X20_X25s_X20_X27_X25s_X27_X20ptr_X20to_X20_X60_X25s_X2Elocal_X60), + /* K17 */ be_nested_str_weak(hostname_eth), + /* K18 */ be_const_int(3), + /* K19 */ be_nested_str_weak(add_service), + /* K20 */ be_nested_str_weak(_matter), + /* K21 */ be_nested_str_weak(_tcp), + /* K22 */ be_nested_str_weak(_I), + /* K23 */ be_nested_str_weak(MTR_X3A_X20adding_X20subtype_X3A_X20), + /* K24 */ be_nested_str_weak(add_subtype), + /* K25 */ be_nested_str_weak(wifi), + /* K26 */ be_nested_str_weak(hostname_wifi), + /* K27 */ be_nested_str_weak(MTR_X3A_X20Exception), + /* K28 */ be_nested_str_weak(_X7C), + }), + be_str_weak(mdns_announce_op_discovery), + &be_const_str_solidified, + ( &(const binstruction[122]) { /* code */ + 0xA40A0000, // 0000 IMPORT R2 K0 + 0xA40E0200, // 0001 IMPORT R3 K1 + 0xA8020064, // 0002 EXBLK 0 #0068 + 0x8C100302, // 0003 GETMET R4 R1 K2 + 0x7C100200, // 0004 CALL R4 1 + 0x8C100903, // 0005 GETMET R4 R4 K3 + 0x7C100200, // 0006 CALL R4 1 + 0x8C100904, // 0007 GETMET R4 R4 K4 + 0x7C100200, // 0008 CALL R4 1 + 0x8C140305, // 0009 GETMET R5 R1 K5 + 0x7C140200, // 000A CALL R5 1 + 0x8C180B06, // 000B GETMET R6 R5 K6 + 0x7C180200, // 000C CALL R6 1 + 0x00180D07, // 000D ADD R6 R6 K7 + 0x8C1C0906, // 000E GETMET R7 R4 K6 + 0x7C1C0200, // 000F CALL R7 1 + 0x00180C07, // 0010 ADD R6 R6 R7 + 0xB81E1000, // 0011 GETNGBL R7 K8 + 0x8C1C0F09, // 0012 GETMET R7 R7 K9 + 0x00261406, // 0013 ADD R9 K10 R6 + 0x5828000B, // 0014 LDCONST R10 K11 + 0x7C1C0600, // 0015 CALL R7 3 + 0xB81E1000, // 0016 GETNGBL R7 K8 + 0x8C1C0F0C, // 0017 GETMET R7 R7 K12 + 0x7C1C0200, // 0018 CALL R7 1 + 0x8C1C0F0D, // 0019 GETMET R7 R7 K13 + 0x5824000E, // 001A LDCONST R9 K14 + 0x7C1C0400, // 001B CALL R7 2 + 0x781E0020, // 001C JMPF R7 #003E + 0xB81E1000, // 001D GETNGBL R7 K8 + 0x8C1C0F09, // 001E GETMET R7 R7 K9 + 0x8C24070F, // 001F GETMET R9 R3 K15 + 0x582C0010, // 0020 LDCONST R11 K16 + 0x5830000C, // 0021 LDCONST R12 K12 + 0x5C340C00, // 0022 MOVE R13 R6 + 0x88380111, // 0023 GETMBR R14 R0 K17 + 0x7C240A00, // 0024 CALL R9 5 + 0x58280012, // 0025 LDCONST R10 K18 + 0x7C1C0600, // 0026 CALL R7 3 + 0x8C1C0513, // 0027 GETMET R7 R2 K19 + 0x58240014, // 0028 LDCONST R9 K20 + 0x58280015, // 0029 LDCONST R10 K21 + 0x542E15A3, // 002A LDINT R11 5540 + 0x4C300000, // 002B LDNIL R12 + 0x5C340C00, // 002C MOVE R13 R6 + 0x88380111, // 002D GETMBR R14 R0 K17 + 0x7C1C0E00, // 002E CALL R7 7 + 0x8C1C0B06, // 002F GETMET R7 R5 K6 + 0x7C1C0200, // 0030 CALL R7 1 + 0x001E2C07, // 0031 ADD R7 K22 R7 + 0xB8221000, // 0032 GETNGBL R8 K8 + 0x8C201109, // 0033 GETMET R8 R8 K9 + 0x002A2E07, // 0034 ADD R10 K23 R7 + 0x582C0012, // 0035 LDCONST R11 K18 + 0x7C200600, // 0036 CALL R8 3 + 0x8C200518, // 0037 GETMET R8 R2 K24 + 0x58280014, // 0038 LDCONST R10 K20 + 0x582C0015, // 0039 LDCONST R11 K21 + 0x5C300C00, // 003A MOVE R12 R6 + 0x88340111, // 003B GETMBR R13 R0 K17 + 0x5C380E00, // 003C MOVE R14 R7 + 0x7C200C00, // 003D CALL R8 6 + 0xB81E1000, // 003E GETNGBL R7 K8 + 0x8C1C0F19, // 003F GETMET R7 R7 K25 + 0x7C1C0200, // 0040 CALL R7 1 + 0x8C1C0F0D, // 0041 GETMET R7 R7 K13 + 0x5824000E, // 0042 LDCONST R9 K14 + 0x7C1C0400, // 0043 CALL R7 2 + 0x781E0020, // 0044 JMPF R7 #0066 + 0xB81E1000, // 0045 GETNGBL R7 K8 + 0x8C1C0F09, // 0046 GETMET R7 R7 K9 + 0x8C24070F, // 0047 GETMET R9 R3 K15 + 0x582C0010, // 0048 LDCONST R11 K16 + 0x58300019, // 0049 LDCONST R12 K25 + 0x5C340C00, // 004A MOVE R13 R6 + 0x8838011A, // 004B GETMBR R14 R0 K26 + 0x7C240A00, // 004C CALL R9 5 + 0x58280012, // 004D LDCONST R10 K18 + 0x7C1C0600, // 004E CALL R7 3 + 0x8C1C0513, // 004F GETMET R7 R2 K19 + 0x58240014, // 0050 LDCONST R9 K20 + 0x58280015, // 0051 LDCONST R10 K21 + 0x542E15A3, // 0052 LDINT R11 5540 + 0x4C300000, // 0053 LDNIL R12 + 0x5C340C00, // 0054 MOVE R13 R6 + 0x8838011A, // 0055 GETMBR R14 R0 K26 + 0x7C1C0E00, // 0056 CALL R7 7 + 0x8C1C0B06, // 0057 GETMET R7 R5 K6 + 0x7C1C0200, // 0058 CALL R7 1 + 0x001E2C07, // 0059 ADD R7 K22 R7 + 0xB8221000, // 005A GETNGBL R8 K8 + 0x8C201109, // 005B GETMET R8 R8 K9 + 0x002A2E07, // 005C ADD R10 K23 R7 + 0x582C0012, // 005D LDCONST R11 K18 + 0x7C200600, // 005E CALL R8 3 + 0x8C200518, // 005F GETMET R8 R2 K24 + 0x58280014, // 0060 LDCONST R10 K20 + 0x582C0015, // 0061 LDCONST R11 K21 + 0x5C300C00, // 0062 MOVE R12 R6 + 0x8834011A, // 0063 GETMBR R13 R0 K26 + 0x5C380E00, // 0064 MOVE R14 R7 + 0x7C200C00, // 0065 CALL R8 6 + 0xA8040001, // 0066 EXBLK 1 1 + 0x70020010, // 0067 JMP #0079 + 0xAC100002, // 0068 CATCH R4 0 2 + 0x7002000D, // 0069 JMP #0078 + 0xB81A1000, // 006A GETNGBL R6 K8 + 0x8C180D09, // 006B GETMET R6 R6 K9 + 0x60200008, // 006C GETGBL R8 G8 + 0x5C240800, // 006D MOVE R9 R4 + 0x7C200200, // 006E CALL R8 1 + 0x00223608, // 006F ADD R8 K27 R8 + 0x0020111C, // 0070 ADD R8 R8 K28 + 0x60240008, // 0071 GETGBL R9 G8 + 0x5C280A00, // 0072 MOVE R10 R5 + 0x7C240200, // 0073 CALL R9 1 + 0x00201009, // 0074 ADD R8 R8 R9 + 0x5824000B, // 0075 LDCONST R9 K11 + 0x7C180600, // 0076 CALL R6 3 + 0x70020000, // 0077 JMP #0079 + 0xB0080000, // 0078 RAISE 2 R0 R0 + 0x80000000, // 0079 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: mdns_remove_op_discovery_all_fabrics +********************************************************************/ +be_local_closure(Matter_Device_mdns_remove_op_discovery_all_fabrics, /* name */ + be_nested_proto( + 6, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 6]) { /* constants */ + /* K0 */ be_nested_str_weak(sessions), + /* K1 */ be_nested_str_weak(active_fabrics), + /* K2 */ be_nested_str_weak(get_device_id), + /* K3 */ be_nested_str_weak(get_fabric_id), + /* K4 */ be_nested_str_weak(mdns_remove_op_discovery), + /* K5 */ be_nested_str_weak(stop_iteration), + }), + be_str_weak(mdns_remove_op_discovery_all_fabrics), + &be_const_str_solidified, + ( &(const binstruction[22]) { /* code */ + 0x60040010, // 0000 GETGBL R1 G16 + 0x88080100, // 0001 GETMBR R2 R0 K0 + 0x8C080501, // 0002 GETMET R2 R2 K1 + 0x7C080200, // 0003 CALL R2 1 + 0x7C040200, // 0004 CALL R1 1 + 0xA802000B, // 0005 EXBLK 0 #0012 + 0x5C080200, // 0006 MOVE R2 R1 + 0x7C080000, // 0007 CALL R2 0 + 0x8C0C0502, // 0008 GETMET R3 R2 K2 + 0x7C0C0200, // 0009 CALL R3 1 + 0x780E0005, // 000A JMPF R3 #0011 + 0x8C0C0503, // 000B GETMET R3 R2 K3 + 0x7C0C0200, // 000C CALL R3 1 + 0x780E0002, // 000D JMPF R3 #0011 + 0x8C0C0104, // 000E GETMET R3 R0 K4 + 0x5C140400, // 000F MOVE R5 R2 + 0x7C0C0400, // 0010 CALL R3 2 + 0x7001FFF3, // 0011 JMP #0006 + 0x58040005, // 0012 LDCONST R1 K5 + 0xAC040200, // 0013 CATCH R1 1 0 + 0xB0080000, // 0014 RAISE 2 R0 R0 + 0x80000000, // 0015 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: msg_send +********************************************************************/ +be_local_closure(Matter_Device_msg_send, /* name */ + be_nested_proto( + 5, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 2]) { /* constants */ + /* K0 */ be_nested_str_weak(udp_server), + /* K1 */ be_nested_str_weak(send_UDP), + }), + be_str_weak(msg_send), + &be_const_str_solidified, + ( &(const binstruction[ 5]) { /* code */ + 0x88080100, // 0000 GETMBR R2 R0 K0 + 0x8C080501, // 0001 GETMET R2 R2 K1 + 0x5C100200, // 0002 MOVE R4 R1 + 0x7C080400, // 0003 CALL R2 2 + 0x80040400, // 0004 RET 1 R2 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: adjust_next_ep +********************************************************************/ +be_local_closure(Matter_Device_adjust_next_ep, /* name */ + be_nested_proto( + 5, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 5]) { /* constants */ + /* K0 */ be_nested_str_weak(plugins_config), + /* K1 */ be_nested_str_weak(keys), + /* K2 */ be_nested_str_weak(next_ep), + /* K3 */ be_const_int(1), + /* K4 */ be_nested_str_weak(stop_iteration), + }), + be_str_weak(adjust_next_ep), + &be_const_str_solidified, + ( &(const binstruction[21]) { /* code */ + 0x60040010, // 0000 GETGBL R1 G16 + 0x88080100, // 0001 GETMBR R2 R0 K0 + 0x8C080501, // 0002 GETMET R2 R2 K1 + 0x7C080200, // 0003 CALL R2 1 + 0x7C040200, // 0004 CALL R1 1 + 0xA802000A, // 0005 EXBLK 0 #0011 + 0x5C080200, // 0006 MOVE R2 R1 + 0x7C080000, // 0007 CALL R2 0 + 0x600C0009, // 0008 GETGBL R3 G9 + 0x5C100400, // 0009 MOVE R4 R2 + 0x7C0C0200, // 000A CALL R3 1 + 0x88100102, // 000B GETMBR R4 R0 K2 + 0x28100604, // 000C GE R4 R3 R4 + 0x78120001, // 000D JMPF R4 #0010 + 0x00100703, // 000E ADD R4 R3 K3 + 0x90020404, // 000F SETMBR R0 K2 R4 + 0x7001FFF4, // 0010 JMP #0006 + 0x58040004, // 0011 LDCONST R1 K4 + 0xAC040200, // 0012 CATCH R1 1 0 + 0xB0080000, // 0013 RAISE 2 R0 R0 + 0x80000000, // 0014 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: attribute_updated +********************************************************************/ +be_local_closure(Matter_Device_attribute_updated, /* name */ + be_nested_proto( + 10, /* nstack */ + 5, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 9]) { /* constants */ + /* K0 */ be_nested_str_weak(matter), + /* K1 */ be_nested_str_weak(Path), + /* K2 */ be_nested_str_weak(endpoint), + /* K3 */ be_nested_str_weak(cluster), + /* K4 */ be_nested_str_weak(attribute), + /* K5 */ be_nested_str_weak(message_handler), + /* K6 */ be_nested_str_weak(im), + /* K7 */ be_nested_str_weak(subs_shop), + /* K8 */ be_nested_str_weak(attribute_updated_ctx), + }), + be_str_weak(attribute_updated), + &be_const_str_solidified, + ( &(const binstruction[18]) { /* code */ + 0x4C140000, // 0000 LDNIL R5 + 0x1C140805, // 0001 EQ R5 R4 R5 + 0x78160000, // 0002 JMPF R5 #0004 + 0x50100000, // 0003 LDBOOL R4 0 0 + 0xB8160000, // 0004 GETNGBL R5 K0 + 0x8C140B01, // 0005 GETMET R5 R5 K1 + 0x7C140200, // 0006 CALL R5 1 + 0x90160401, // 0007 SETMBR R5 K2 R1 + 0x90160602, // 0008 SETMBR R5 K3 R2 + 0x90160803, // 0009 SETMBR R5 K4 R3 + 0x88180105, // 000A GETMBR R6 R0 K5 + 0x88180D06, // 000B GETMBR R6 R6 K6 + 0x88180D07, // 000C GETMBR R6 R6 K7 + 0x8C180D08, // 000D GETMET R6 R6 K8 + 0x5C200A00, // 000E MOVE R8 R5 + 0x5C240800, // 000F MOVE R9 R4 + 0x7C180600, // 0010 CALL R6 3 + 0x80000000, // 0011 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: every_second +********************************************************************/ +be_local_closure(Matter_Device_every_second, /* name */ + be_nested_proto( + 4, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 6]) { /* constants */ + /* K0 */ be_nested_str_weak(sessions), + /* K1 */ be_nested_str_weak(every_second), + /* K2 */ be_nested_str_weak(message_handler), + /* K3 */ be_nested_str_weak(commissioning_open), + /* K4 */ be_nested_str_weak(tasmota), + /* K5 */ be_nested_str_weak(time_reached), + }), + be_str_weak(every_second), + &be_const_str_solidified, + ( &(const binstruction[18]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x8C040301, // 0001 GETMET R1 R1 K1 + 0x7C040200, // 0002 CALL R1 1 + 0x88040102, // 0003 GETMBR R1 R0 K2 + 0x8C040301, // 0004 GETMET R1 R1 K1 + 0x7C040200, // 0005 CALL R1 1 + 0x88040103, // 0006 GETMBR R1 R0 K3 + 0x4C080000, // 0007 LDNIL R2 + 0x20040202, // 0008 NE R1 R1 R2 + 0x78060006, // 0009 JMPF R1 #0011 + 0xB8060800, // 000A GETNGBL R1 K4 + 0x8C040305, // 000B GETMET R1 R1 K5 + 0x880C0103, // 000C GETMBR R3 R0 K3 + 0x7C040400, // 000D CALL R1 2 + 0x78060001, // 000E JMPF R1 #0011 + 0x4C040000, // 000F LDNIL R1 + 0x90020601, // 0010 SETMBR R0 K3 R1 + 0x80000000, // 0011 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: signal_endpoints_changed +********************************************************************/ +be_local_closure(Matter_Device_signal_endpoints_changed, /* name */ + be_nested_proto( + 7, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 3]) { /* constants */ + /* K0 */ be_nested_str_weak(attribute_updated), + /* K1 */ be_const_int(0), + /* K2 */ be_const_int(3), + }), + be_str_weak(signal_endpoints_changed), + &be_const_str_solidified, + ( &(const binstruction[13]) { /* code */ + 0x8C040100, // 0000 GETMET R1 R0 K0 + 0x580C0001, // 0001 LDCONST R3 K1 + 0x5412001C, // 0002 LDINT R4 29 + 0x58140002, // 0003 LDCONST R5 K2 + 0x50180000, // 0004 LDBOOL R6 0 0 + 0x7C040A00, // 0005 CALL R1 5 + 0x8C040100, // 0006 GETMET R1 R0 K0 + 0x540EFEFF, // 0007 LDINT R3 65280 + 0x5412001C, // 0008 LDINT R4 29 + 0x58140002, // 0009 LDCONST R5 K2 + 0x50180000, // 000A LDBOOL R6 0 0 + 0x7C040A00, // 000B CALL R1 5 + 0x80000000, // 000C RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: mdns_announce_op_discovery_all_fabrics +********************************************************************/ +be_local_closure(Matter_Device_mdns_announce_op_discovery_all_fabrics, /* name */ + be_nested_proto( + 6, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 6]) { /* constants */ + /* K0 */ be_nested_str_weak(sessions), + /* K1 */ be_nested_str_weak(active_fabrics), + /* K2 */ be_nested_str_weak(get_device_id), + /* K3 */ be_nested_str_weak(get_fabric_id), + /* K4 */ be_nested_str_weak(mdns_announce_op_discovery), + /* K5 */ be_nested_str_weak(stop_iteration), + }), + be_str_weak(mdns_announce_op_discovery_all_fabrics), + &be_const_str_solidified, + ( &(const binstruction[22]) { /* code */ + 0x60040010, // 0000 GETGBL R1 G16 + 0x88080100, // 0001 GETMBR R2 R0 K0 + 0x8C080501, // 0002 GETMET R2 R2 K1 + 0x7C080200, // 0003 CALL R2 1 + 0x7C040200, // 0004 CALL R1 1 + 0xA802000B, // 0005 EXBLK 0 #0012 + 0x5C080200, // 0006 MOVE R2 R1 + 0x7C080000, // 0007 CALL R2 0 + 0x8C0C0502, // 0008 GETMET R3 R2 K2 + 0x7C0C0200, // 0009 CALL R3 1 + 0x780E0005, // 000A JMPF R3 #0011 + 0x8C0C0503, // 000B GETMET R3 R2 K3 + 0x7C0C0200, // 000C CALL R3 1 + 0x780E0002, // 000D JMPF R3 #0011 + 0x8C0C0104, // 000E GETMET R3 R0 K4 + 0x5C140400, // 000F MOVE R5 R2 + 0x7C0C0400, // 0010 CALL R3 2 + 0x7001FFF3, // 0011 JMP #0006 + 0x58040005, // 0012 LDCONST R1 K5 + 0xAC040200, // 0013 CATCH R1 1 0 + 0xB0080000, // 0014 RAISE 2 R0 R0 + 0x80000000, // 0015 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: autoconf_device_map +********************************************************************/ +be_local_closure(Matter_Device_autoconf_device_map, /* name */ + be_nested_proto( + 22, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[51]) { /* constants */ + /* K0 */ be_nested_str_weak(string), + /* K1 */ be_nested_str_weak(json), + /* K2 */ be_const_int(1), + /* K3 */ be_nested_str_weak(light), + /* K4 */ be_nested_str_weak(get), + /* K5 */ be_nested_str_weak(find), + /* K6 */ be_nested_str_weak(channels), + /* K7 */ be_nested_str_weak(), + /* K8 */ be_const_int(0), + /* K9 */ be_nested_str_weak(type), + /* K10 */ be_nested_str_weak(light1), + /* K11 */ be_const_int(2), + /* K12 */ be_nested_str_weak(light2), + /* K13 */ be_nested_str_weak(light3), + /* K14 */ be_nested_str_weak(tasmota), + /* K15 */ be_nested_str_weak(cmd), + /* K16 */ be_nested_str_weak(Status_X2013), + /* K17 */ be_nested_str_weak(log), + /* K18 */ be_nested_str_weak(MTR_X3A_X20Status_X2013_X20_X3D_X20), + /* K19 */ be_const_int(3), + /* K20 */ be_nested_str_weak(contains), + /* K21 */ be_nested_str_weak(StatusSHT), + /* K22 */ be_nested_str_weak(SHT), + /* K23 */ be_nested_str_weak(format), + /* K24 */ be_nested_str_weak(MTR_X3A_X20_X27_X25s_X27_X20_X3D_X20_X25s), + /* K25 */ be_nested_str_weak(Relay1), + /* K26 */ be_nested_str_weak(Relay2), + /* K27 */ be_nested_str_weak(push), + /* K28 */ be_nested_str_weak(MTR_X3A_X20relay1_X20_X3D_X20_X25s_X2C_X20relay2_X20_X3D_X20_X25s), + /* K29 */ be_nested_str_weak(TiltConfig), + /* K30 */ be_nested_str_weak(shutter_X2Btilt), + /* K31 */ be_nested_str_weak(shutter), + /* K32 */ be_nested_str_weak(get_power), + /* K33 */ be_nested_str_weak(relay), + /* K34 */ be_nested_str_weak(load), + /* K35 */ be_nested_str_weak(read_sensors), + /* K36 */ be_nested_str_weak(k2l), + /* K37 */ be_nested_str_weak(Temperature), + /* K38 */ be_nested_str_weak(_X23Temperature), + /* K39 */ be_nested_str_weak(temperature), + /* K40 */ be_nested_str_weak(filter), + /* K41 */ be_nested_str_weak(stop_iteration), + /* K42 */ be_nested_str_weak(Pressure), + /* K43 */ be_nested_str_weak(_X23Pressure), + /* K44 */ be_nested_str_weak(pressure), + /* K45 */ be_nested_str_weak(Illuminance), + /* K46 */ be_nested_str_weak(_X23Illuminance), + /* K47 */ be_nested_str_weak(illuminance), + /* K48 */ be_nested_str_weak(Humidity), + /* K49 */ be_nested_str_weak(_X23Humidity), + /* K50 */ be_nested_str_weak(humidity), + }), + be_str_weak(autoconf_device_map), + &be_const_str_solidified, + ( &(const binstruction[310]) { /* code */ + 0xA4060000, // 0000 IMPORT R1 K0 + 0xA40A0200, // 0001 IMPORT R2 K1 + 0x600C0013, // 0002 GETGBL R3 G19 + 0x7C0C0000, // 0003 CALL R3 0 + 0x58100002, // 0004 LDCONST R4 K2 + 0x50140000, // 0005 LDBOOL R5 0 0 + 0xA41A0600, // 0006 IMPORT R6 K3 + 0x8C1C0D04, // 0007 GETMET R7 R6 K4 + 0x7C1C0200, // 0008 CALL R7 1 + 0x4C200000, // 0009 LDNIL R8 + 0x20200E08, // 000A NE R8 R7 R8 + 0x78220024, // 000B JMPF R8 #0031 + 0x6020000C, // 000C GETGBL R8 G12 + 0x8C240F05, // 000D GETMET R9 R7 K5 + 0x582C0006, // 000E LDCONST R11 K6 + 0x58300007, // 000F LDCONST R12 K7 + 0x7C240600, // 0010 CALL R9 3 + 0x7C200200, // 0011 CALL R8 1 + 0x24241108, // 0012 GT R9 R8 K8 + 0x7826001C, // 0013 JMPF R9 #0031 + 0x1C241102, // 0014 EQ R9 R8 K2 + 0x78260007, // 0015 JMPF R9 #001E + 0x60240008, // 0016 GETGBL R9 G8 + 0x5C280800, // 0017 MOVE R10 R4 + 0x7C240200, // 0018 CALL R9 1 + 0x60280013, // 0019 GETGBL R10 G19 + 0x7C280000, // 001A CALL R10 0 + 0x982A130A, // 001B SETIDX R10 K9 K10 + 0x980C120A, // 001C SETIDX R3 R9 R10 + 0x70020010, // 001D JMP #002F + 0x1C24110B, // 001E EQ R9 R8 K11 + 0x78260007, // 001F JMPF R9 #0028 + 0x60240008, // 0020 GETGBL R9 G8 + 0x5C280800, // 0021 MOVE R10 R4 + 0x7C240200, // 0022 CALL R9 1 + 0x60280013, // 0023 GETGBL R10 G19 + 0x7C280000, // 0024 CALL R10 0 + 0x982A130C, // 0025 SETIDX R10 K9 K12 + 0x980C120A, // 0026 SETIDX R3 R9 R10 + 0x70020006, // 0027 JMP #002F + 0x60240008, // 0028 GETGBL R9 G8 + 0x5C280800, // 0029 MOVE R10 R4 + 0x7C240200, // 002A CALL R9 1 + 0x60280013, // 002B GETGBL R10 G19 + 0x7C280000, // 002C CALL R10 0 + 0x982A130D, // 002D SETIDX R10 K9 K13 + 0x980C120A, // 002E SETIDX R3 R9 R10 + 0x50140200, // 002F LDBOOL R5 1 0 + 0x00100902, // 0030 ADD R4 R4 K2 + 0xB8221C00, // 0031 GETNGBL R8 K14 + 0x8C20110F, // 0032 GETMET R8 R8 K15 + 0x58280010, // 0033 LDCONST R10 K16 + 0x502C0200, // 0034 LDBOOL R11 1 0 + 0x7C200600, // 0035 CALL R8 3 + 0x60240012, // 0036 GETGBL R9 G18 + 0x7C240000, // 0037 CALL R9 0 + 0xB82A1C00, // 0038 GETNGBL R10 K14 + 0x8C281511, // 0039 GETMET R10 R10 K17 + 0x60300008, // 003A GETGBL R12 G8 + 0x5C341000, // 003B MOVE R13 R8 + 0x7C300200, // 003C CALL R12 1 + 0x0032240C, // 003D ADD R12 K18 R12 + 0x58340013, // 003E LDCONST R13 K19 + 0x7C280600, // 003F CALL R10 3 + 0x4C280000, // 0040 LDNIL R10 + 0x2028100A, // 0041 NE R10 R8 R10 + 0x782A0051, // 0042 JMPF R10 #0095 + 0x8C281114, // 0043 GETMET R10 R8 K20 + 0x58300015, // 0044 LDCONST R12 K21 + 0x7C280400, // 0045 CALL R10 2 + 0x782A004D, // 0046 JMPF R10 #0095 + 0x94201115, // 0047 GETIDX R8 R8 K21 + 0x58280008, // 0048 LDCONST R10 K8 + 0x502C0200, // 0049 LDBOOL R11 1 0 + 0x782E0049, // 004A JMPF R11 #0095 + 0x602C0008, // 004B GETGBL R11 G8 + 0x5C301400, // 004C MOVE R12 R10 + 0x7C2C0200, // 004D CALL R11 1 + 0x002E2C0B, // 004E ADD R11 K22 R11 + 0x8C301114, // 004F GETMET R12 R8 K20 + 0x5C381600, // 0050 MOVE R14 R11 + 0x7C300400, // 0051 CALL R12 2 + 0x74320000, // 0052 JMPT R12 #0054 + 0x70020040, // 0053 JMP #0095 + 0x9430100B, // 0054 GETIDX R12 R8 R11 + 0xB8361C00, // 0055 GETNGBL R13 K14 + 0x8C341B11, // 0056 GETMET R13 R13 K17 + 0x8C3C0317, // 0057 GETMET R15 R1 K23 + 0x58440018, // 0058 LDCONST R17 K24 + 0x5C481600, // 0059 MOVE R18 R11 + 0x604C0008, // 005A GETGBL R19 G8 + 0x5C501800, // 005B MOVE R20 R12 + 0x7C4C0200, // 005C CALL R19 1 + 0x7C3C0800, // 005D CALL R15 4 + 0x58400013, // 005E LDCONST R16 K19 + 0x7C340600, // 005F CALL R13 3 + 0x8C341905, // 0060 GETMET R13 R12 K5 + 0x583C0019, // 0061 LDCONST R15 K25 + 0x58400008, // 0062 LDCONST R16 K8 + 0x7C340600, // 0063 CALL R13 3 + 0x04341B02, // 0064 SUB R13 R13 K2 + 0x8C381905, // 0065 GETMET R14 R12 K5 + 0x5840001A, // 0066 LDCONST R16 K26 + 0x58440008, // 0067 LDCONST R17 K8 + 0x7C380600, // 0068 CALL R14 3 + 0x04381D02, // 0069 SUB R14 R14 K2 + 0x283C1B08, // 006A GE R15 R13 K8 + 0x783E0002, // 006B JMPF R15 #006F + 0x8C3C131B, // 006C GETMET R15 R9 K27 + 0x5C441A00, // 006D MOVE R17 R13 + 0x7C3C0400, // 006E CALL R15 2 + 0x283C1D08, // 006F GE R15 R14 K8 + 0x783E0002, // 0070 JMPF R15 #0074 + 0x8C3C131B, // 0071 GETMET R15 R9 K27 + 0x5C441C00, // 0072 MOVE R17 R14 + 0x7C3C0400, // 0073 CALL R15 2 + 0xB83E1C00, // 0074 GETNGBL R15 K14 + 0x8C3C1F11, // 0075 GETMET R15 R15 K17 + 0x8C440317, // 0076 GETMET R17 R1 K23 + 0x584C001C, // 0077 LDCONST R19 K28 + 0x5C501A00, // 0078 MOVE R20 R13 + 0x5C541C00, // 0079 MOVE R21 R14 + 0x7C440800, // 007A CALL R17 4 + 0x58480013, // 007B LDCONST R18 K19 + 0x7C3C0600, // 007C CALL R15 3 + 0x8C3C1905, // 007D GETMET R15 R12 K5 + 0x5844001D, // 007E LDCONST R17 K29 + 0x7C3C0400, // 007F CALL R15 2 + 0x783E0002, // 0080 JMPF R15 #0084 + 0x94401F0B, // 0081 GETIDX R16 R15 K11 + 0x24402108, // 0082 GT R16 R16 K8 + 0x74420000, // 0083 JMPT R16 #0085 + 0x50400001, // 0084 LDBOOL R16 0 1 + 0x50400200, // 0085 LDBOOL R16 1 0 + 0x60440008, // 0086 GETGBL R17 G8 + 0x5C480800, // 0087 MOVE R18 R4 + 0x7C440200, // 0088 CALL R17 1 + 0x60480013, // 0089 GETGBL R18 G19 + 0x7C480000, // 008A CALL R18 0 + 0x78420001, // 008B JMPF R16 #008E + 0x584C001E, // 008C LDCONST R19 K30 + 0x70020000, // 008D JMP #008F + 0x584C001F, // 008E LDCONST R19 K31 + 0x984A1213, // 008F SETIDX R18 K9 R19 + 0x984A3E0A, // 0090 SETIDX R18 K31 R10 + 0x980C2212, // 0091 SETIDX R3 R17 R18 + 0x00100902, // 0092 ADD R4 R4 K2 + 0x00281502, // 0093 ADD R10 R10 K2 + 0x7001FFB3, // 0094 JMP #0049 + 0x6028000C, // 0095 GETGBL R10 G12 + 0xB82E1C00, // 0096 GETNGBL R11 K14 + 0x8C2C1720, // 0097 GETMET R11 R11 K32 + 0x7C2C0200, // 0098 CALL R11 1 + 0x7C280200, // 0099 CALL R10 1 + 0x582C0008, // 009A LDCONST R11 K8 + 0x78160000, // 009B JMPF R5 #009D + 0x04281502, // 009C SUB R10 R10 K2 + 0x1430160A, // 009D LT R12 R11 R10 + 0x78320010, // 009E JMPF R12 #00B0 + 0x8C301305, // 009F GETMET R12 R9 K5 + 0x5C381600, // 00A0 MOVE R14 R11 + 0x7C300400, // 00A1 CALL R12 2 + 0x4C340000, // 00A2 LDNIL R13 + 0x1C30180D, // 00A3 EQ R12 R12 R13 + 0x78320008, // 00A4 JMPF R12 #00AE + 0x60300008, // 00A5 GETGBL R12 G8 + 0x5C340800, // 00A6 MOVE R13 R4 + 0x7C300200, // 00A7 CALL R12 1 + 0x60340013, // 00A8 GETGBL R13 G19 + 0x7C340000, // 00A9 CALL R13 0 + 0x98361321, // 00AA SETIDX R13 K9 K33 + 0x9836420B, // 00AB SETIDX R13 K33 R11 + 0x980C180D, // 00AC SETIDX R3 R12 R13 + 0x00100902, // 00AD ADD R4 R4 K2 + 0x002C1702, // 00AE ADD R11 R11 K2 + 0x7001FFEC, // 00AF JMP #009D + 0x8C300522, // 00B0 GETMET R12 R2 K34 + 0xB83A1C00, // 00B1 GETNGBL R14 K14 + 0x8C381D23, // 00B2 GETMET R14 R14 K35 + 0x7C380200, // 00B3 CALL R14 1 + 0x7C300400, // 00B4 CALL R12 2 + 0x60340010, // 00B5 GETGBL R13 G16 + 0x8C380124, // 00B6 GETMET R14 R0 K36 + 0x5C401800, // 00B7 MOVE R16 R12 + 0x7C380400, // 00B8 CALL R14 2 + 0x7C340200, // 00B9 CALL R13 1 + 0xA8020016, // 00BA EXBLK 0 #00D2 + 0x5C381A00, // 00BB MOVE R14 R13 + 0x7C380000, // 00BC CALL R14 0 + 0x943C180E, // 00BD GETIDX R15 R12 R14 + 0x6040000F, // 00BE GETGBL R16 G15 + 0x5C441E00, // 00BF MOVE R17 R15 + 0x60480013, // 00C0 GETGBL R18 G19 + 0x7C400400, // 00C1 CALL R16 2 + 0x7842000D, // 00C2 JMPF R16 #00D1 + 0x8C401F14, // 00C3 GETMET R16 R15 K20 + 0x58480025, // 00C4 LDCONST R18 K37 + 0x7C400400, // 00C5 CALL R16 2 + 0x78420009, // 00C6 JMPF R16 #00D1 + 0x00401D26, // 00C7 ADD R16 R14 K38 + 0x60440008, // 00C8 GETGBL R17 G8 + 0x5C480800, // 00C9 MOVE R18 R4 + 0x7C440200, // 00CA CALL R17 1 + 0x60480013, // 00CB GETGBL R18 G19 + 0x7C480000, // 00CC CALL R18 0 + 0x984A1327, // 00CD SETIDX R18 K9 K39 + 0x984A5010, // 00CE SETIDX R18 K40 R16 + 0x980C2212, // 00CF SETIDX R3 R17 R18 + 0x00100902, // 00D0 ADD R4 R4 K2 + 0x7001FFE8, // 00D1 JMP #00BB + 0x58340029, // 00D2 LDCONST R13 K41 + 0xAC340200, // 00D3 CATCH R13 1 0 + 0xB0080000, // 00D4 RAISE 2 R0 R0 + 0x60340010, // 00D5 GETGBL R13 G16 + 0x8C380124, // 00D6 GETMET R14 R0 K36 + 0x5C401800, // 00D7 MOVE R16 R12 + 0x7C380400, // 00D8 CALL R14 2 + 0x7C340200, // 00D9 CALL R13 1 + 0xA8020016, // 00DA EXBLK 0 #00F2 + 0x5C381A00, // 00DB MOVE R14 R13 + 0x7C380000, // 00DC CALL R14 0 + 0x943C180E, // 00DD GETIDX R15 R12 R14 + 0x6040000F, // 00DE GETGBL R16 G15 + 0x5C441E00, // 00DF MOVE R17 R15 + 0x60480013, // 00E0 GETGBL R18 G19 + 0x7C400400, // 00E1 CALL R16 2 + 0x7842000D, // 00E2 JMPF R16 #00F1 + 0x8C401F14, // 00E3 GETMET R16 R15 K20 + 0x5848002A, // 00E4 LDCONST R18 K42 + 0x7C400400, // 00E5 CALL R16 2 + 0x78420009, // 00E6 JMPF R16 #00F1 + 0x00401D2B, // 00E7 ADD R16 R14 K43 + 0x60440008, // 00E8 GETGBL R17 G8 + 0x5C480800, // 00E9 MOVE R18 R4 + 0x7C440200, // 00EA CALL R17 1 + 0x60480013, // 00EB GETGBL R18 G19 + 0x7C480000, // 00EC CALL R18 0 + 0x984A132C, // 00ED SETIDX R18 K9 K44 + 0x984A5010, // 00EE SETIDX R18 K40 R16 + 0x980C2212, // 00EF SETIDX R3 R17 R18 + 0x00100902, // 00F0 ADD R4 R4 K2 + 0x7001FFE8, // 00F1 JMP #00DB + 0x58340029, // 00F2 LDCONST R13 K41 + 0xAC340200, // 00F3 CATCH R13 1 0 + 0xB0080000, // 00F4 RAISE 2 R0 R0 + 0x60340010, // 00F5 GETGBL R13 G16 + 0x8C380124, // 00F6 GETMET R14 R0 K36 + 0x5C401800, // 00F7 MOVE R16 R12 + 0x7C380400, // 00F8 CALL R14 2 + 0x7C340200, // 00F9 CALL R13 1 + 0xA8020016, // 00FA EXBLK 0 #0112 + 0x5C381A00, // 00FB MOVE R14 R13 + 0x7C380000, // 00FC CALL R14 0 + 0x943C180E, // 00FD GETIDX R15 R12 R14 + 0x6040000F, // 00FE GETGBL R16 G15 + 0x5C441E00, // 00FF MOVE R17 R15 + 0x60480013, // 0100 GETGBL R18 G19 + 0x7C400400, // 0101 CALL R16 2 + 0x7842000D, // 0102 JMPF R16 #0111 + 0x8C401F14, // 0103 GETMET R16 R15 K20 + 0x5848002D, // 0104 LDCONST R18 K45 + 0x7C400400, // 0105 CALL R16 2 + 0x78420009, // 0106 JMPF R16 #0111 + 0x00401D2E, // 0107 ADD R16 R14 K46 + 0x60440008, // 0108 GETGBL R17 G8 + 0x5C480800, // 0109 MOVE R18 R4 + 0x7C440200, // 010A CALL R17 1 + 0x60480013, // 010B GETGBL R18 G19 + 0x7C480000, // 010C CALL R18 0 + 0x984A132F, // 010D SETIDX R18 K9 K47 + 0x984A5010, // 010E SETIDX R18 K40 R16 + 0x980C2212, // 010F SETIDX R3 R17 R18 + 0x00100902, // 0110 ADD R4 R4 K2 + 0x7001FFE8, // 0111 JMP #00FB + 0x58340029, // 0112 LDCONST R13 K41 + 0xAC340200, // 0113 CATCH R13 1 0 + 0xB0080000, // 0114 RAISE 2 R0 R0 + 0x60340010, // 0115 GETGBL R13 G16 + 0x8C380124, // 0116 GETMET R14 R0 K36 + 0x5C401800, // 0117 MOVE R16 R12 + 0x7C380400, // 0118 CALL R14 2 + 0x7C340200, // 0119 CALL R13 1 + 0xA8020016, // 011A EXBLK 0 #0132 + 0x5C381A00, // 011B MOVE R14 R13 + 0x7C380000, // 011C CALL R14 0 + 0x943C180E, // 011D GETIDX R15 R12 R14 + 0x6040000F, // 011E GETGBL R16 G15 + 0x5C441E00, // 011F MOVE R17 R15 + 0x60480013, // 0120 GETGBL R18 G19 + 0x7C400400, // 0121 CALL R16 2 + 0x7842000D, // 0122 JMPF R16 #0131 + 0x8C401F14, // 0123 GETMET R16 R15 K20 + 0x58480030, // 0124 LDCONST R18 K48 + 0x7C400400, // 0125 CALL R16 2 + 0x78420009, // 0126 JMPF R16 #0131 + 0x00401D31, // 0127 ADD R16 R14 K49 + 0x60440008, // 0128 GETGBL R17 G8 + 0x5C480800, // 0129 MOVE R18 R4 + 0x7C440200, // 012A CALL R17 1 + 0x60480013, // 012B GETGBL R18 G19 + 0x7C480000, // 012C CALL R18 0 + 0x984A1332, // 012D SETIDX R18 K9 K50 + 0x984A5010, // 012E SETIDX R18 K40 R16 + 0x980C2212, // 012F SETIDX R3 R17 R18 + 0x00100902, // 0130 ADD R4 R4 K2 + 0x7001FFE8, // 0131 JMP #011B + 0x58340029, // 0132 LDCONST R13 K41 + 0xAC340200, // 0133 CATCH R13 1 0 + 0xB0080000, // 0134 RAISE 2 R0 R0 + 0x80040600, // 0135 RET 1 R3 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: get_active_endpoints +********************************************************************/ +be_local_closure(Matter_Device_get_active_endpoints, /* name */ + be_nested_proto( + 9, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 6]) { /* constants */ + /* K0 */ be_nested_str_weak(plugins), + /* K1 */ be_nested_str_weak(get_endpoint), + /* K2 */ be_const_int(0), + /* K3 */ be_nested_str_weak(find), + /* K4 */ be_nested_str_weak(push), + /* K5 */ be_nested_str_weak(stop_iteration), + }), + be_str_weak(get_active_endpoints), + &be_const_str_solidified, + ( &(const binstruction[28]) { /* code */ + 0x60080012, // 0000 GETGBL R2 G18 + 0x7C080000, // 0001 CALL R2 0 + 0x600C0010, // 0002 GETGBL R3 G16 + 0x88100100, // 0003 GETMBR R4 R0 K0 + 0x7C0C0200, // 0004 CALL R3 1 + 0xA8020011, // 0005 EXBLK 0 #0018 + 0x5C100600, // 0006 MOVE R4 R3 + 0x7C100000, // 0007 CALL R4 0 + 0x8C140901, // 0008 GETMET R5 R4 K1 + 0x7C140200, // 0009 CALL R5 1 + 0x78060002, // 000A JMPF R1 #000E + 0x1C180B02, // 000B EQ R6 R5 K2 + 0x781A0000, // 000C JMPF R6 #000E + 0x7001FFF7, // 000D JMP #0006 + 0x8C180503, // 000E GETMET R6 R2 K3 + 0x5C200A00, // 000F MOVE R8 R5 + 0x7C180400, // 0010 CALL R6 2 + 0x4C1C0000, // 0011 LDNIL R7 + 0x1C180C07, // 0012 EQ R6 R6 R7 + 0x781A0002, // 0013 JMPF R6 #0017 + 0x8C180504, // 0014 GETMET R6 R2 K4 + 0x5C200A00, // 0015 MOVE R8 R5 + 0x7C180400, // 0016 CALL R6 2 + 0x7001FFED, // 0017 JMP #0006 + 0x580C0005, // 0018 LDCONST R3 K5 + 0xAC0C0200, // 0019 CATCH R3 1 0 + 0xB0080000, // 001A RAISE 2 R0 R0 + 0x80040400, // 001B RET 1 R2 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: is_root_commissioning_open +********************************************************************/ +be_local_closure(Matter_Device_is_root_commissioning_open, /* name */ + be_nested_proto( + 3, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 2]) { /* constants */ + /* K0 */ be_nested_str_weak(commissioning_open), + /* K1 */ be_nested_str_weak(commissioning_admin_fabric), + }), + be_str_weak(is_root_commissioning_open), + &be_const_str_solidified, + ( &(const binstruction[11]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x4C080000, // 0001 LDNIL R2 + 0x20040202, // 0002 NE R1 R1 R2 + 0x78060003, // 0003 JMPF R1 #0008 + 0x88040101, // 0004 GETMBR R1 R0 K1 + 0x4C080000, // 0005 LDNIL R2 + 0x1C040202, // 0006 EQ R1 R1 R2 + 0x74060000, // 0007 JMPT R1 #0009 + 0x50040001, // 0008 LDBOOL R1 0 1 + 0x50040200, // 0009 LDBOOL R1 1 0 + 0x80040200, // 000A RET 1 R1 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: start_root_basic_commissioning +********************************************************************/ +be_local_closure(Matter_Device_start_root_basic_commissioning, /* name */ + be_nested_proto( + 14, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[23]) { /* constants */ + /* K0 */ be_nested_str_weak(string), + /* K1 */ be_nested_str_weak(PASE_TIMEOUT), + /* K2 */ be_nested_str_weak(compute_manual_pairing_code), + /* K3 */ be_nested_str_weak(tasmota), + /* K4 */ be_nested_str_weak(log), + /* K5 */ be_nested_str_weak(format), + /* K6 */ be_nested_str_weak(MTR_X3A_X20Manual_X20pairing_X20code_X3A_X20_X25s_X2D_X25s_X2D_X25s), + /* K7 */ be_const_int(0), + /* K8 */ be_const_int(3), + /* K9 */ be_const_int(2147483647), + /* K10 */ be_const_int(2), + /* K11 */ be_nested_str_weak(compute_qrcode_content), + /* K12 */ be_nested_str_weak(publish_result), + /* K13 */ be_nested_str_weak(_X7B_X22Matter_X22_X3A_X7B_X22Commissioning_X22_X3A1_X2C_X22PairingCode_X22_X3A_X22_X25s_X22_X2C_X22QRCode_X22_X3A_X22_X25s_X22_X7D_X7D), + /* K14 */ be_nested_str_weak(Matter), + /* K15 */ be_nested_str_weak(_compute_pbkdf), + /* K16 */ be_nested_str_weak(root_passcode), + /* K17 */ be_nested_str_weak(root_iterations), + /* K18 */ be_nested_str_weak(root_salt), + /* K19 */ be_nested_str_weak(start_basic_commissioning), + /* K20 */ be_nested_str_weak(root_discriminator), + /* K21 */ be_nested_str_weak(root_w0), + /* K22 */ be_nested_str_weak(root_L), + }), + be_str_weak(start_root_basic_commissioning), + &be_const_str_solidified, + ( &(const binstruction[49]) { /* code */ + 0xA40A0000, // 0000 IMPORT R2 K0 + 0x4C0C0000, // 0001 LDNIL R3 + 0x1C0C0203, // 0002 EQ R3 R1 R3 + 0x780E0000, // 0003 JMPF R3 #0005 + 0x88040101, // 0004 GETMBR R1 R0 K1 + 0x8C0C0102, // 0005 GETMET R3 R0 K2 + 0x7C0C0200, // 0006 CALL R3 1 + 0xB8120600, // 0007 GETNGBL R4 K3 + 0x8C100904, // 0008 GETMET R4 R4 K4 + 0x8C180505, // 0009 GETMET R6 R2 K5 + 0x58200006, // 000A LDCONST R8 K6 + 0x40260F08, // 000B CONNECT R9 K7 K8 + 0x94240609, // 000C GETIDX R9 R3 R9 + 0x542A0003, // 000D LDINT R10 4 + 0x542E0005, // 000E LDINT R11 6 + 0x4028140B, // 000F CONNECT R10 R10 R11 + 0x9428060A, // 0010 GETIDX R10 R3 R10 + 0x542E0006, // 0011 LDINT R11 7 + 0x402C1709, // 0012 CONNECT R11 R11 K9 + 0x942C060B, // 0013 GETIDX R11 R3 R11 + 0x7C180A00, // 0014 CALL R6 5 + 0x581C000A, // 0015 LDCONST R7 K10 + 0x7C100600, // 0016 CALL R4 3 + 0x8C10010B, // 0017 GETMET R4 R0 K11 + 0x7C100200, // 0018 CALL R4 1 + 0xB8160600, // 0019 GETNGBL R5 K3 + 0x8C140B0C, // 001A GETMET R5 R5 K12 + 0x8C1C0505, // 001B GETMET R7 R2 K5 + 0x5824000D, // 001C LDCONST R9 K13 + 0x5C280600, // 001D MOVE R10 R3 + 0x5C2C0800, // 001E MOVE R11 R4 + 0x7C1C0800, // 001F CALL R7 4 + 0x5820000E, // 0020 LDCONST R8 K14 + 0x7C140600, // 0021 CALL R5 3 + 0x8C14010F, // 0022 GETMET R5 R0 K15 + 0x881C0110, // 0023 GETMBR R7 R0 K16 + 0x88200111, // 0024 GETMBR R8 R0 K17 + 0x88240112, // 0025 GETMBR R9 R0 K18 + 0x7C140800, // 0026 CALL R5 4 + 0x8C140113, // 0027 GETMET R5 R0 K19 + 0x5C1C0200, // 0028 MOVE R7 R1 + 0x88200111, // 0029 GETMBR R8 R0 K17 + 0x88240114, // 002A GETMBR R9 R0 K20 + 0x88280112, // 002B GETMBR R10 R0 K18 + 0x882C0115, // 002C GETMBR R11 R0 K21 + 0x88300116, // 002D GETMBR R12 R0 K22 + 0x4C340000, // 002E LDNIL R13 + 0x7C141000, // 002F CALL R5 8 + 0x80000000, // 0030 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: bridge_remove_endpoint +********************************************************************/ +be_local_closure(Matter_Device_bridge_remove_endpoint, /* name */ + be_nested_proto( + 11, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[16]) { /* constants */ + /* K0 */ be_nested_str_weak(string), + /* K1 */ be_nested_str_weak(json), + /* K2 */ be_nested_str_weak(plugins_config), + /* K3 */ be_nested_str_weak(contains), + /* K4 */ be_nested_str_weak(tasmota), + /* K5 */ be_nested_str_weak(log), + /* K6 */ be_nested_str_weak(MTR_X3A_X20Cannot_X20remove_X20an_X20enpoint_X20not_X20configured_X3A_X20), + /* K7 */ be_const_int(3), + /* K8 */ be_nested_str_weak(remove), + /* K9 */ be_nested_str_weak(plugins_persist), + /* K10 */ be_nested_str_weak(save_param), + /* K11 */ be_nested_str_weak(signal_endpoints_changed), + /* K12 */ be_const_int(0), + /* K13 */ be_nested_str_weak(plugins), + /* K14 */ be_nested_str_weak(get_endpoint), + /* K15 */ be_const_int(1), + }), + be_str_weak(bridge_remove_endpoint), + &be_const_str_solidified, + ( &(const binstruction[51]) { /* code */ + 0xA40A0000, // 0000 IMPORT R2 K0 + 0xA40E0200, // 0001 IMPORT R3 K1 + 0x60100008, // 0002 GETGBL R4 G8 + 0x5C140200, // 0003 MOVE R5 R1 + 0x7C100200, // 0004 CALL R4 1 + 0x4C140000, // 0005 LDNIL R5 + 0x4C180000, // 0006 LDNIL R6 + 0x881C0102, // 0007 GETMBR R7 R0 K2 + 0x8C1C0F03, // 0008 GETMET R7 R7 K3 + 0x5C240800, // 0009 MOVE R9 R4 + 0x7C1C0400, // 000A CALL R7 2 + 0x741E0005, // 000B JMPT R7 #0012 + 0xB81E0800, // 000C GETNGBL R7 K4 + 0x8C1C0F05, // 000D GETMET R7 R7 K5 + 0x00260C04, // 000E ADD R9 K6 R4 + 0x58280007, // 000F LDCONST R10 K7 + 0x7C1C0600, // 0010 CALL R7 3 + 0x80000E00, // 0011 RET 0 + 0x881C0102, // 0012 GETMBR R7 R0 K2 + 0x8C1C0F08, // 0013 GETMET R7 R7 K8 + 0x5C240800, // 0014 MOVE R9 R4 + 0x7C1C0400, // 0015 CALL R7 2 + 0x501C0200, // 0016 LDBOOL R7 1 0 + 0x90021207, // 0017 SETMBR R0 K9 R7 + 0x8C1C010A, // 0018 GETMET R7 R0 K10 + 0x7C1C0200, // 0019 CALL R7 1 + 0x8C1C010B, // 001A GETMET R7 R0 K11 + 0x7C1C0200, // 001B CALL R7 1 + 0x581C000C, // 001C LDCONST R7 K12 + 0x6020000C, // 001D GETGBL R8 G12 + 0x8824010D, // 001E GETMBR R9 R0 K13 + 0x7C200200, // 001F CALL R8 1 + 0x14200E08, // 0020 LT R8 R7 R8 + 0x7822000F, // 0021 JMPF R8 #0032 + 0x8820010D, // 0022 GETMBR R8 R0 K13 + 0x94201007, // 0023 GETIDX R8 R8 R7 + 0x8C20110E, // 0024 GETMET R8 R8 K14 + 0x7C200200, // 0025 CALL R8 1 + 0x1C200208, // 0026 EQ R8 R1 R8 + 0x78220007, // 0027 JMPF R8 #0030 + 0x8820010D, // 0028 GETMBR R8 R0 K13 + 0x8C201108, // 0029 GETMET R8 R8 K8 + 0x5C280E00, // 002A MOVE R10 R7 + 0x7C200400, // 002B CALL R8 2 + 0x8C20010B, // 002C GETMET R8 R0 K11 + 0x7C200200, // 002D CALL R8 1 + 0x70020002, // 002E JMP #0032 + 0x70020000, // 002F JMP #0031 + 0x001C0F0F, // 0030 ADD R7 R7 K15 + 0x7001FFEA, // 0031 JMP #001D + 0x80000000, // 0032 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: msg_received +********************************************************************/ +be_local_closure(Matter_Device_msg_received, /* name */ + be_nested_proto( + 9, /* nstack */ + 4, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 2]) { /* constants */ + /* K0 */ be_nested_str_weak(message_handler), + /* K1 */ be_nested_str_weak(msg_received), + }), + be_str_weak(msg_received), + &be_const_str_solidified, + ( &(const binstruction[ 7]) { /* code */ + 0x88100100, // 0000 GETMBR R4 R0 K0 + 0x8C100901, // 0001 GETMET R4 R4 K1 + 0x5C180200, // 0002 MOVE R6 R1 + 0x5C1C0400, // 0003 MOVE R7 R2 + 0x5C200600, // 0004 MOVE R8 R3 + 0x7C100800, // 0005 CALL R4 4 + 0x80040800, // 0006 RET 1 R4 + }) + ) +); +/*******************************************************************/ + + /******************************************************************** ** Solidified function: start_mdns_announce_hostnames ********************************************************************/ @@ -5023,11 +4866,217 @@ be_local_closure(Matter_Device_start_mdns_announce_hostnames, /* name */ /******************************************************************** -** Solidified function: get_active_endpoints +** Solidified function: _start_udp ********************************************************************/ -be_local_closure(Matter_Device_get_active_endpoints, /* name */ +be_local_closure(Matter_Device__start_udp, /* name */ be_nested_proto( - 9, /* nstack */ + 6, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 1, /* has sup protos */ + ( &(const struct bproto*[ 1]) { + be_nested_proto( + 8, /* nstack */ + 3, /* argc */ + 0, /* varg */ + 1, /* has upvals */ + ( &(const bupvaldesc[ 1]) { /* upvals */ + be_local_const_upval(1, 0), + }), + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 1]) { /* constants */ + /* K0 */ be_nested_str_weak(msg_received), + }), + be_str_weak(_X3Clambda_X3E), + &be_const_str_solidified, + ( &(const binstruction[ 7]) { /* code */ + 0x680C0000, // 0000 GETUPV R3 U0 + 0x8C0C0700, // 0001 GETMET R3 R3 K0 + 0x5C140000, // 0002 MOVE R5 R0 + 0x5C180200, // 0003 MOVE R6 R1 + 0x5C1C0400, // 0004 MOVE R7 R2 + 0x7C0C0800, // 0005 CALL R3 4 + 0x80040600, // 0006 RET 1 R3 + }) + ), + }), + 1, /* has constants */ + ( &(const bvalue[ 9]) { /* constants */ + /* K0 */ be_nested_str_weak(udp_server), + /* K1 */ be_nested_str_weak(tasmota), + /* K2 */ be_nested_str_weak(log), + /* K3 */ be_nested_str_weak(MTR_X3A_X20starting_X20UDP_X20server_X20on_X20port_X3A_X20), + /* K4 */ be_const_int(2), + /* K5 */ be_nested_str_weak(matter), + /* K6 */ be_nested_str_weak(UDPServer), + /* K7 */ be_nested_str_weak(), + /* K8 */ be_nested_str_weak(start), + }), + be_str_weak(_start_udp), + &be_const_str_solidified, + ( &(const binstruction[27]) { /* code */ + 0x88080100, // 0000 GETMBR R2 R0 K0 + 0x780A0000, // 0001 JMPF R2 #0003 + 0x80000400, // 0002 RET 0 + 0x4C080000, // 0003 LDNIL R2 + 0x1C080202, // 0004 EQ R2 R1 R2 + 0x780A0000, // 0005 JMPF R2 #0007 + 0x540615A3, // 0006 LDINT R1 5540 + 0xB80A0200, // 0007 GETNGBL R2 K1 + 0x8C080502, // 0008 GETMET R2 R2 K2 + 0x60100008, // 0009 GETGBL R4 G8 + 0x5C140200, // 000A MOVE R5 R1 + 0x7C100200, // 000B CALL R4 1 + 0x00120604, // 000C ADD R4 K3 R4 + 0x58140004, // 000D LDCONST R5 K4 + 0x7C080600, // 000E CALL R2 3 + 0xB80A0A00, // 000F GETNGBL R2 K5 + 0x8C080506, // 0010 GETMET R2 R2 K6 + 0x58100007, // 0011 LDCONST R4 K7 + 0x5C140200, // 0012 MOVE R5 R1 + 0x7C080600, // 0013 CALL R2 3 + 0x90020002, // 0014 SETMBR R0 K0 R2 + 0x88080100, // 0015 GETMBR R2 R0 K0 + 0x8C080508, // 0016 GETMET R2 R2 K8 + 0x84100000, // 0017 CLOSURE R4 P0 + 0x7C080400, // 0018 CALL R2 2 + 0xA0000000, // 0019 CLOSE R0 + 0x80000000, // 001A RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: autoconf_device +********************************************************************/ +be_local_closure(Matter_Device_autoconf_device, /* name */ + be_nested_proto( + 7, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[16]) { /* constants */ + /* K0 */ be_nested_str_weak(string), + /* K1 */ be_nested_str_weak(json), + /* K2 */ be_nested_str_weak(plugins), + /* K3 */ be_const_int(0), + /* K4 */ be_nested_str_weak(plugins_persist), + /* K5 */ be_nested_str_weak(plugins_config), + /* K6 */ be_nested_str_weak(autoconf_device_map), + /* K7 */ be_nested_str_weak(adjust_next_ep), + /* K8 */ be_nested_str_weak(tasmota), + /* K9 */ be_nested_str_weak(log), + /* K10 */ be_nested_str_weak(MTR_X3A_X20autoconfig_X20_X3D_X20), + /* K11 */ be_const_int(3), + /* K12 */ be_nested_str_weak(_instantiate_plugins_from_config), + /* K13 */ be_nested_str_weak(sessions), + /* K14 */ be_nested_str_weak(count_active_fabrics), + /* K15 */ be_nested_str_weak(save_param), + }), + be_str_weak(autoconf_device), + &be_const_str_solidified, + ( &(const binstruction[38]) { /* code */ + 0xA4060000, // 0000 IMPORT R1 K0 + 0xA40A0200, // 0001 IMPORT R2 K1 + 0x600C000C, // 0002 GETGBL R3 G12 + 0x88100102, // 0003 GETMBR R4 R0 K2 + 0x7C0C0200, // 0004 CALL R3 1 + 0x240C0703, // 0005 GT R3 R3 K3 + 0x780E0000, // 0006 JMPF R3 #0008 + 0x80000600, // 0007 RET 0 + 0x880C0104, // 0008 GETMBR R3 R0 K4 + 0x740E000C, // 0009 JMPT R3 #0017 + 0x8C0C0106, // 000A GETMET R3 R0 K6 + 0x7C0C0200, // 000B CALL R3 1 + 0x90020A03, // 000C SETMBR R0 K5 R3 + 0x8C0C0107, // 000D GETMET R3 R0 K7 + 0x7C0C0200, // 000E CALL R3 1 + 0xB80E1000, // 000F GETNGBL R3 K8 + 0x8C0C0709, // 0010 GETMET R3 R3 K9 + 0x60140008, // 0011 GETGBL R5 G8 + 0x88180105, // 0012 GETMBR R6 R0 K5 + 0x7C140200, // 0013 CALL R5 1 + 0x00161405, // 0014 ADD R5 K10 R5 + 0x5818000B, // 0015 LDCONST R6 K11 + 0x7C0C0600, // 0016 CALL R3 3 + 0x8C0C010C, // 0017 GETMET R3 R0 K12 + 0x88140105, // 0018 GETMBR R5 R0 K5 + 0x7C0C0400, // 0019 CALL R3 2 + 0x880C0104, // 001A GETMBR R3 R0 K4 + 0x740E0008, // 001B JMPT R3 #0025 + 0x880C010D, // 001C GETMBR R3 R0 K13 + 0x8C0C070E, // 001D GETMET R3 R3 K14 + 0x7C0C0200, // 001E CALL R3 1 + 0x240C0703, // 001F GT R3 R3 K3 + 0x780E0003, // 0020 JMPF R3 #0025 + 0x500C0200, // 0021 LDBOOL R3 1 0 + 0x90020803, // 0022 SETMBR R0 K4 R3 + 0x8C0C010F, // 0023 GETMET R3 R0 K15 + 0x7C0C0200, // 0024 CALL R3 1 + 0x80000000, // 0025 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: MtrJoin +********************************************************************/ +be_local_closure(Matter_Device_MtrJoin, /* name */ + be_nested_proto( + 8, /* nstack */ + 5, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 4]) { /* constants */ + /* K0 */ be_nested_str_weak(start_root_basic_commissioning), + /* K1 */ be_nested_str_weak(stop_basic_commissioning), + /* K2 */ be_nested_str_weak(tasmota), + /* K3 */ be_nested_str_weak(resp_cmnd_done), + }), + be_str_weak(MtrJoin), + &be_const_str_solidified, + ( &(const binstruction[13]) { /* code */ + 0x60140009, // 0000 GETGBL R5 G9 + 0x5C180600, // 0001 MOVE R6 R3 + 0x7C140200, // 0002 CALL R5 1 + 0x78160002, // 0003 JMPF R5 #0007 + 0x8C180100, // 0004 GETMET R6 R0 K0 + 0x7C180200, // 0005 CALL R6 1 + 0x70020001, // 0006 JMP #0009 + 0x8C180101, // 0007 GETMET R6 R0 K1 + 0x7C180200, // 0008 CALL R6 1 + 0xB81A0400, // 0009 GETNGBL R6 K2 + 0x8C180D03, // 000A GETMET R6 R6 K3 + 0x7C180200, // 000B CALL R6 1 + 0x80000000, // 000C RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: mdns_remove_op_discovery +********************************************************************/ +be_local_closure(Matter_Device_mdns_remove_op_discovery, /* name */ + be_nested_proto( + 14, /* nstack */ 2, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -5035,45 +5084,277 @@ be_local_closure(Matter_Device_get_active_endpoints, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[ 6]) { /* constants */ - /* K0 */ be_nested_str_weak(plugins), - /* K1 */ be_nested_str_weak(get_endpoint), - /* K2 */ be_const_int(0), - /* K3 */ be_nested_str_weak(find), - /* K4 */ be_nested_str_weak(push), - /* K5 */ be_nested_str_weak(stop_iteration), + ( &(const bvalue[24]) { /* constants */ + /* K0 */ be_nested_str_weak(mdns), + /* K1 */ be_nested_str_weak(string), + /* K2 */ be_nested_str_weak(get_device_id), + /* K3 */ be_nested_str_weak(copy), + /* K4 */ be_nested_str_weak(reverse), + /* K5 */ be_nested_str_weak(get_fabric_compressed), + /* K6 */ be_nested_str_weak(tohex), + /* K7 */ be_nested_str_weak(_X2D), + /* K8 */ be_nested_str_weak(tasmota), + /* K9 */ be_nested_str_weak(eth), + /* K10 */ be_nested_str_weak(find), + /* K11 */ be_nested_str_weak(up), + /* K12 */ be_nested_str_weak(log), + /* K13 */ be_nested_str_weak(format), + /* K14 */ be_nested_str_weak(MTR_X3A_X20remove_X20mDNS_X20on_X20_X25s_X20_X27_X25s_X27), + /* K15 */ be_const_int(2), + /* K16 */ be_nested_str_weak(remove_service), + /* K17 */ be_nested_str_weak(_matter), + /* K18 */ be_nested_str_weak(_tcp), + /* K19 */ be_nested_str_weak(hostname_eth), + /* K20 */ be_nested_str_weak(wifi), + /* K21 */ be_nested_str_weak(hostname_wifi), + /* K22 */ be_nested_str_weak(MTR_X3A_X20Exception), + /* K23 */ be_nested_str_weak(_X7C), }), - be_str_weak(get_active_endpoints), + be_str_weak(mdns_remove_op_discovery), &be_const_str_solidified, - ( &(const binstruction[28]) { /* code */ - 0x60080012, // 0000 GETGBL R2 G18 - 0x7C080000, // 0001 CALL R2 0 - 0x600C0010, // 0002 GETGBL R3 G16 - 0x88100100, // 0003 GETMBR R4 R0 K0 - 0x7C0C0200, // 0004 CALL R3 1 - 0xA8020011, // 0005 EXBLK 0 #0018 - 0x5C100600, // 0006 MOVE R4 R3 - 0x7C100000, // 0007 CALL R4 0 - 0x8C140901, // 0008 GETMET R5 R4 K1 - 0x7C140200, // 0009 CALL R5 1 - 0x78060002, // 000A JMPF R1 #000E - 0x1C180B02, // 000B EQ R6 R5 K2 - 0x781A0000, // 000C JMPF R6 #000E - 0x7001FFF7, // 000D JMP #0006 - 0x8C180503, // 000E GETMET R6 R2 K3 - 0x5C200A00, // 000F MOVE R8 R5 - 0x7C180400, // 0010 CALL R6 2 - 0x4C1C0000, // 0011 LDNIL R7 - 0x1C180C07, // 0012 EQ R6 R6 R7 - 0x781A0002, // 0013 JMPF R6 #0017 - 0x8C180504, // 0014 GETMET R6 R2 K4 - 0x5C200A00, // 0015 MOVE R8 R5 - 0x7C180400, // 0016 CALL R6 2 - 0x7001FFED, // 0017 JMP #0006 - 0x580C0005, // 0018 LDCONST R3 K5 - 0xAC0C0200, // 0019 CATCH R3 1 0 - 0xB0080000, // 001A RAISE 2 R0 R0 - 0x80040400, // 001B RET 1 R2 + ( &(const binstruction[81]) { /* code */ + 0xA40A0000, // 0000 IMPORT R2 K0 + 0xA40E0200, // 0001 IMPORT R3 K1 + 0xA802003B, // 0002 EXBLK 0 #003F + 0x8C100302, // 0003 GETMET R4 R1 K2 + 0x7C100200, // 0004 CALL R4 1 + 0x8C100903, // 0005 GETMET R4 R4 K3 + 0x7C100200, // 0006 CALL R4 1 + 0x8C100904, // 0007 GETMET R4 R4 K4 + 0x7C100200, // 0008 CALL R4 1 + 0x8C140305, // 0009 GETMET R5 R1 K5 + 0x7C140200, // 000A CALL R5 1 + 0x8C180B06, // 000B GETMET R6 R5 K6 + 0x7C180200, // 000C CALL R6 1 + 0x00180D07, // 000D ADD R6 R6 K7 + 0x8C1C0906, // 000E GETMET R7 R4 K6 + 0x7C1C0200, // 000F CALL R7 1 + 0x00180C07, // 0010 ADD R6 R6 R7 + 0xB81E1000, // 0011 GETNGBL R7 K8 + 0x8C1C0F09, // 0012 GETMET R7 R7 K9 + 0x7C1C0200, // 0013 CALL R7 1 + 0x8C1C0F0A, // 0014 GETMET R7 R7 K10 + 0x5824000B, // 0015 LDCONST R9 K11 + 0x7C1C0400, // 0016 CALL R7 2 + 0x781E000E, // 0017 JMPF R7 #0027 + 0xB81E1000, // 0018 GETNGBL R7 K8 + 0x8C1C0F0C, // 0019 GETMET R7 R7 K12 + 0x8C24070D, // 001A GETMET R9 R3 K13 + 0x582C000E, // 001B LDCONST R11 K14 + 0x58300009, // 001C LDCONST R12 K9 + 0x5C340C00, // 001D MOVE R13 R6 + 0x7C240800, // 001E CALL R9 4 + 0x5828000F, // 001F LDCONST R10 K15 + 0x7C1C0600, // 0020 CALL R7 3 + 0x8C1C0510, // 0021 GETMET R7 R2 K16 + 0x58240011, // 0022 LDCONST R9 K17 + 0x58280012, // 0023 LDCONST R10 K18 + 0x5C2C0C00, // 0024 MOVE R11 R6 + 0x88300113, // 0025 GETMBR R12 R0 K19 + 0x7C1C0A00, // 0026 CALL R7 5 + 0xB81E1000, // 0027 GETNGBL R7 K8 + 0x8C1C0F14, // 0028 GETMET R7 R7 K20 + 0x7C1C0200, // 0029 CALL R7 1 + 0x8C1C0F0A, // 002A GETMET R7 R7 K10 + 0x5824000B, // 002B LDCONST R9 K11 + 0x7C1C0400, // 002C CALL R7 2 + 0x781E000E, // 002D JMPF R7 #003D + 0xB81E1000, // 002E GETNGBL R7 K8 + 0x8C1C0F0C, // 002F GETMET R7 R7 K12 + 0x8C24070D, // 0030 GETMET R9 R3 K13 + 0x582C000E, // 0031 LDCONST R11 K14 + 0x58300014, // 0032 LDCONST R12 K20 + 0x5C340C00, // 0033 MOVE R13 R6 + 0x7C240800, // 0034 CALL R9 4 + 0x5828000F, // 0035 LDCONST R10 K15 + 0x7C1C0600, // 0036 CALL R7 3 + 0x8C1C0510, // 0037 GETMET R7 R2 K16 + 0x58240011, // 0038 LDCONST R9 K17 + 0x58280012, // 0039 LDCONST R10 K18 + 0x5C2C0C00, // 003A MOVE R11 R6 + 0x88300115, // 003B GETMBR R12 R0 K21 + 0x7C1C0A00, // 003C CALL R7 5 + 0xA8040001, // 003D EXBLK 1 1 + 0x70020010, // 003E JMP #0050 + 0xAC100002, // 003F CATCH R4 0 2 + 0x7002000D, // 0040 JMP #004F + 0xB81A1000, // 0041 GETNGBL R6 K8 + 0x8C180D0C, // 0042 GETMET R6 R6 K12 + 0x60200008, // 0043 GETGBL R8 G8 + 0x5C240800, // 0044 MOVE R9 R4 + 0x7C200200, // 0045 CALL R8 1 + 0x00222C08, // 0046 ADD R8 K22 R8 + 0x00201117, // 0047 ADD R8 R8 K23 + 0x60240008, // 0048 GETGBL R9 G8 + 0x5C280A00, // 0049 MOVE R10 R5 + 0x7C240200, // 004A CALL R9 1 + 0x00201009, // 004B ADD R8 R8 R9 + 0x5824000F, // 004C LDCONST R9 K15 + 0x7C180600, // 004D CALL R6 3 + 0x70020000, // 004E JMP #0050 + 0xB0080000, // 004F RAISE 2 R0 R0 + 0x80000000, // 0050 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: start_operational_discovery +********************************************************************/ +be_local_closure(Matter_Device_start_operational_discovery, /* name */ + be_nested_proto( + 8, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 7]) { /* constants */ + /* K0 */ be_nested_str_weak(crypto), + /* K1 */ be_nested_str_weak(mdns), + /* K2 */ be_nested_str_weak(string), + /* K3 */ be_nested_str_weak(stop_basic_commissioning), + /* K4 */ be_nested_str_weak(root_w0), + /* K5 */ be_nested_str_weak(root_L), + /* K6 */ be_nested_str_weak(mdns_announce_op_discovery), + }), + be_str_weak(start_operational_discovery), + &be_const_str_solidified, + ( &(const binstruction[13]) { /* code */ + 0xA40A0000, // 0000 IMPORT R2 K0 + 0xA40E0200, // 0001 IMPORT R3 K1 + 0xA4120400, // 0002 IMPORT R4 K2 + 0x8C140103, // 0003 GETMET R5 R0 K3 + 0x7C140200, // 0004 CALL R5 1 + 0x4C140000, // 0005 LDNIL R5 + 0x90020805, // 0006 SETMBR R0 K4 R5 + 0x4C140000, // 0007 LDNIL R5 + 0x90020A05, // 0008 SETMBR R0 K5 R5 + 0x8C140106, // 0009 GETMET R5 R0 K6 + 0x5C1C0200, // 000A MOVE R7 R1 + 0x7C140400, // 000B CALL R5 2 + 0x80000000, // 000C RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: save_param +********************************************************************/ +be_local_closure(Matter_Device_save_param, /* name */ + be_nested_proto( + 11, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[27]) { /* constants */ + /* K0 */ be_nested_str_weak(string), + /* K1 */ be_nested_str_weak(json), + /* K2 */ be_nested_str_weak(format), + /* K3 */ be_nested_str_weak(_X7B_X22distinguish_X22_X3A_X25i_X2C_X22passcode_X22_X3A_X25i_X2C_X22ipv4only_X22_X3A_X25s_X2C_X22nextep_X22_X3A_X25i), + /* K4 */ be_nested_str_weak(root_discriminator), + /* K5 */ be_nested_str_weak(root_passcode), + /* K6 */ be_nested_str_weak(ipv4only), + /* K7 */ be_nested_str_weak(true), + /* K8 */ be_nested_str_weak(false), + /* K9 */ be_nested_str_weak(next_ep), + /* K10 */ be_nested_str_weak(plugins_persist), + /* K11 */ be_nested_str_weak(_X2C_X22config_X22_X3A), + /* K12 */ be_nested_str_weak(dump), + /* K13 */ be_nested_str_weak(plugins_config), + /* K14 */ be_nested_str_weak(_X7D), + /* K15 */ be_nested_str_weak(FILENAME), + /* K16 */ be_nested_str_weak(w), + /* K17 */ be_nested_str_weak(write), + /* K18 */ be_nested_str_weak(close), + /* K19 */ be_nested_str_weak(tasmota), + /* K20 */ be_nested_str_weak(log), + /* K21 */ be_nested_str_weak(MTR_X3A_X20_X3DSaved_X20_X20_X20_X20_X20parameters_X25s), + /* K22 */ be_nested_str_weak(_X20and_X20condiguration), + /* K23 */ be_nested_str_weak(), + /* K24 */ be_const_int(2), + /* K25 */ be_nested_str_weak(MTR_X3A_X20Session_Store_X3A_X3Asave_X20Exception_X3A), + /* K26 */ be_nested_str_weak(_X7C), + }), + be_str_weak(save_param), + &be_const_str_solidified, + ( &(const binstruction[66]) { /* code */ + 0xA4060000, // 0000 IMPORT R1 K0 + 0xA40A0200, // 0001 IMPORT R2 K1 + 0x8C0C0302, // 0002 GETMET R3 R1 K2 + 0x58140003, // 0003 LDCONST R5 K3 + 0x88180104, // 0004 GETMBR R6 R0 K4 + 0x881C0105, // 0005 GETMBR R7 R0 K5 + 0x88200106, // 0006 GETMBR R8 R0 K6 + 0x78220001, // 0007 JMPF R8 #000A + 0x58200007, // 0008 LDCONST R8 K7 + 0x70020000, // 0009 JMP #000B + 0x58200008, // 000A LDCONST R8 K8 + 0x88240109, // 000B GETMBR R9 R0 K9 + 0x7C0C0C00, // 000C CALL R3 6 + 0x8810010A, // 000D GETMBR R4 R0 K10 + 0x78120004, // 000E JMPF R4 #0014 + 0x000C070B, // 000F ADD R3 R3 K11 + 0x8C10050C, // 0010 GETMET R4 R2 K12 + 0x8818010D, // 0011 GETMBR R6 R0 K13 + 0x7C100400, // 0012 CALL R4 2 + 0x000C0604, // 0013 ADD R3 R3 R4 + 0x000C070E, // 0014 ADD R3 R3 K14 + 0xA8020018, // 0015 EXBLK 0 #002F + 0x60100011, // 0016 GETGBL R4 G17 + 0x8814010F, // 0017 GETMBR R5 R0 K15 + 0x58180010, // 0018 LDCONST R6 K16 + 0x7C100400, // 0019 CALL R4 2 + 0x8C140911, // 001A GETMET R5 R4 K17 + 0x5C1C0600, // 001B MOVE R7 R3 + 0x7C140400, // 001C CALL R5 2 + 0x8C140912, // 001D GETMET R5 R4 K18 + 0x7C140200, // 001E CALL R5 1 + 0xB8162600, // 001F GETNGBL R5 K19 + 0x8C140B14, // 0020 GETMET R5 R5 K20 + 0x8C1C0302, // 0021 GETMET R7 R1 K2 + 0x58240015, // 0022 LDCONST R9 K21 + 0x8828010A, // 0023 GETMBR R10 R0 K10 + 0x782A0001, // 0024 JMPF R10 #0027 + 0x58280016, // 0025 LDCONST R10 K22 + 0x70020000, // 0026 JMP #0028 + 0x58280017, // 0027 LDCONST R10 K23 + 0x7C1C0600, // 0028 CALL R7 3 + 0x58200018, // 0029 LDCONST R8 K24 + 0x7C140600, // 002A CALL R5 3 + 0xA8040001, // 002B EXBLK 1 1 + 0x80040600, // 002C RET 1 R3 + 0xA8040001, // 002D EXBLK 1 1 + 0x70020011, // 002E JMP #0041 + 0xAC100002, // 002F CATCH R4 0 2 + 0x7002000E, // 0030 JMP #0040 + 0xB81A2600, // 0031 GETNGBL R6 K19 + 0x8C180D14, // 0032 GETMET R6 R6 K20 + 0x60200008, // 0033 GETGBL R8 G8 + 0x5C240800, // 0034 MOVE R9 R4 + 0x7C200200, // 0035 CALL R8 1 + 0x00223208, // 0036 ADD R8 K25 R8 + 0x0020111A, // 0037 ADD R8 R8 K26 + 0x60240008, // 0038 GETGBL R9 G8 + 0x5C280A00, // 0039 MOVE R10 R5 + 0x7C240200, // 003A CALL R9 1 + 0x00201009, // 003B ADD R8 R8 R9 + 0x58240018, // 003C LDCONST R9 K24 + 0x7C180600, // 003D CALL R6 3 + 0x80040600, // 003E RET 1 R3 + 0x70020000, // 003F JMP #0041 + 0xB0080000, // 0040 RAISE 2 R0 R0 + 0x80000000, // 0041 RET 0 }) ) ); @@ -5084,74 +5365,24 @@ be_local_closure(Matter_Device_get_active_endpoints, /* name */ ** Solidified class: Matter_Device ********************************************************************/ be_local_class(Matter_Device, - 33, + 34, NULL, - be_nested_map(95, + be_nested_map(100, ( (struct bmapnode*) &(const bmapnode[]) { - { be_const_key_weak(plugins_classes, -1), be_const_var(3) }, - { be_const_key_weak(k2l_num, -1), be_const_static_closure(Matter_Device_k2l_num_closure) }, - { be_const_key_weak(register_native_classes, -1), be_const_closure(Matter_Device_register_native_classes_closure) }, - { be_const_key_weak(save_before_restart, -1), be_const_closure(Matter_Device_save_before_restart_closure) }, - { be_const_key_weak(stop_basic_commissioning, -1), be_const_closure(Matter_Device_stop_basic_commissioning_closure) }, - { be_const_key_weak(commissioning_admin_fabric, -1), be_const_var(16) }, - { be_const_key_weak(get_plugin_class_arg, -1), be_const_closure(Matter_Device_get_plugin_class_arg_closure) }, - { be_const_key_weak(commissioning_w0, 93), be_const_var(14) }, - { be_const_key_weak(get_active_endpoints, 10), be_const_closure(Matter_Device_get_active_endpoints_closure) }, - { be_const_key_weak(start_mdns_announce_hostnames, 62), be_const_closure(Matter_Device_start_mdns_announce_hostnames_closure) }, - { be_const_key_weak(mdns_announce_PASE, 18), be_const_closure(Matter_Device_mdns_announce_PASE_closure) }, - { be_const_key_weak(mdns_remove_op_discovery, -1), be_const_closure(Matter_Device_mdns_remove_op_discovery_closure) }, - { be_const_key_weak(root_discriminator, -1), be_const_var(26) }, - { be_const_key_weak(UDP_PORT, -1), be_const_int(5540) }, - { be_const_key_weak(k2l, -1), be_const_static_closure(Matter_Device_k2l_closure) }, - { be_const_key_weak(ipv4only, -1), be_const_var(28) }, - { be_const_key_weak(get_plugin_class_displayname, 31), be_const_closure(Matter_Device_get_plugin_class_displayname_closure) }, - { be_const_key_weak(root_salt, -1), be_const_var(30) }, - { be_const_key_weak(autoconf_device_map, -1), be_const_closure(Matter_Device_autoconf_device_map_closure) }, - { be_const_key_weak(PRODUCT_ID, 20), be_const_int(32768) }, - { be_const_key_weak(PBKDF_ITERATIONS, -1), be_const_int(1000) }, - { be_const_key_weak(stop, -1), be_const_closure(Matter_Device_stop_closure) }, - { be_const_key_weak(autoconf_device, 86), be_const_closure(Matter_Device_autoconf_device_closure) }, - { be_const_key_weak(every_second, -1), be_const_closure(Matter_Device_every_second_closure) }, - { be_const_key_weak(_init_basic_commissioning, -1), be_const_closure(Matter_Device__init_basic_commissioning_closure) }, + { be_const_key_weak(every_250ms, -1), be_const_closure(Matter_Device_every_250ms_closure) }, + { be_const_key_weak(VENDOR_ID, -1), be_const_int(65521) }, + { be_const_key_weak(commissioning_w0, -1), be_const_var(14) }, + { be_const_key_weak(register_commands, -1), be_const_closure(Matter_Device_register_commands_closure) }, + { be_const_key_weak(tick, -1), be_const_var(9) }, + { be_const_key_weak(root_w0, -1), be_const_var(32) }, + { be_const_key_weak(started, -1), be_const_var(0) }, + { be_const_key_weak(_trigger_read_sensors, 92), be_const_closure(Matter_Device__trigger_read_sensors_closure) }, + { be_const_key_weak(every_50ms, -1), be_const_closure(Matter_Device_every_50ms_closure) }, + { be_const_key_weak(save_param, 41), be_const_closure(Matter_Device_save_param_closure) }, { be_const_key_weak(compute_manual_pairing_code, -1), be_const_closure(Matter_Device_compute_manual_pairing_code_closure) }, - { be_const_key_weak(MtrJoin, 35), be_const_closure(Matter_Device_MtrJoin_closure) }, - { be_const_key_weak(vendorid, 14), be_const_var(21) }, - { be_const_key_weak(root_passcode, 79), be_const_var(27) }, - { be_const_key_weak(mdns_announce_op_discovery_all_fabrics, 22), be_const_closure(Matter_Device_mdns_announce_op_discovery_all_fabrics_closure) }, - { be_const_key_weak(register_plugin_class, -1), be_const_closure(Matter_Device_register_plugin_class_closure) }, - { be_const_key_weak(generate_random_passcode, -1), be_const_closure(Matter_Device_generate_random_passcode_closure) }, - { be_const_key_weak(ui, -1), be_const_var(8) }, - { be_const_key_weak(msg_received, -1), be_const_closure(Matter_Device_msg_received_closure) }, - { be_const_key_weak(save_param, 68), be_const_closure(Matter_Device_save_param_closure) }, - { be_const_key_weak(commissioning_L, -1), be_const_var(15) }, - { be_const_key_weak(start_root_basic_commissioning, -1), be_const_closure(Matter_Device_start_root_basic_commissioning_closure) }, - { be_const_key_weak(commissioning_instance_eth, -1), be_const_var(18) }, - { be_const_key_weak(start_basic_commissioning, -1), be_const_closure(Matter_Device_start_basic_commissioning_closure) }, - { be_const_key_weak(message_handler, 9), be_const_var(6) }, - { be_const_key_weak(mdns_remove_op_discovery_all_fabrics, 36), be_const_closure(Matter_Device_mdns_remove_op_discovery_all_fabrics_closure) }, - { be_const_key_weak(start, -1), be_const_closure(Matter_Device_start_closure) }, - { be_const_key_weak(FILENAME, -1), be_nested_str_weak(_matter_device_X2Ejson) }, - { be_const_key_weak(start_operational_discovery, -1), be_const_closure(Matter_Device_start_operational_discovery_closure) }, - { be_const_key_weak(_compute_pbkdf, -1), be_const_closure(Matter_Device__compute_pbkdf_closure) }, - { be_const_key_weak(plugins_persist, -1), be_const_var(2) }, - { be_const_key_weak(root_iterations, 88), be_const_var(29) }, - { be_const_key_weak(start_commissioning_complete_deferred, -1), be_const_closure(Matter_Device_start_commissioning_complete_deferred_closure) }, - { be_const_key_weak(sessions, -1), be_const_var(7) }, - { be_const_key_weak(remove_fabric, -1), be_const_closure(Matter_Device_remove_fabric_closure) }, - { be_const_key_weak(attribute_updated, 23), be_const_closure(Matter_Device_attribute_updated_closure) }, - { be_const_key_weak(plugins_config, -1), be_const_var(4) }, - { be_const_key_weak(plugins, -1), be_const_var(1) }, - { be_const_key_weak(http_remotes, 34), be_const_var(25) }, - { be_const_key_weak(msg_send, -1), be_const_closure(Matter_Device_msg_send_closure) }, - { be_const_key_weak(every_250ms, 71), be_const_closure(Matter_Device_every_250ms_closure) }, - { be_const_key_weak(hostname_wifi, -1), be_const_var(19) }, - { be_const_key_weak(compute_qrcode_content, 49), be_const_closure(Matter_Device_compute_qrcode_content_closure) }, - { be_const_key_weak(_mdns_announce_hostname, 51), be_const_closure(Matter_Device__mdns_announce_hostname_closure) }, - { be_const_key_weak(load_param, -1), be_const_closure(Matter_Device_load_param_closure) }, - { be_const_key_weak(commissioning_discriminator, -1), be_const_var(12) }, - { be_const_key_weak(register_commands, 52), be_const_closure(Matter_Device_register_commands_closure) }, - { be_const_key_weak(received_ack, -1), be_const_closure(Matter_Device_received_ack_closure) }, - { be_const_key_weak(PASSCODE_INVALID, 54), be_const_simple_instance(be_nested_simple_instance(&be_class_list, { + { be_const_key_weak(start, 51), be_const_closure(Matter_Device_start_closure) }, + { be_const_key_weak(k2l, -1), be_const_static_closure(Matter_Device_k2l_closure) }, + { be_const_key_weak(PASSCODE_INVALID, 76), be_const_simple_instance(be_nested_simple_instance(&be_class_list, { be_const_list( * be_nested_list(12, ( (struct bvalue*) &(const bvalue[]) { be_const_int(0), @@ -5167,37 +5398,92 @@ be_local_class(Matter_Device, be_const_int(12345678), be_const_int(87654321), })) ) } )) }, - { be_const_key_weak(commissioning_open, -1), be_const_var(10) }, - { be_const_key_weak(mdns_pase_eth, -1), be_const_var(23) }, - { be_const_key_weak(VENDOR_ID, 69), be_const_int(65521) }, - { be_const_key_weak(invoke_request, -1), be_const_closure(Matter_Device_invoke_request_closure) }, - { be_const_key_weak(commissioning_salt, -1), be_const_var(13) }, - { be_const_key_weak(productid, -1), be_const_var(22) }, - { be_const_key_weak(start_commissioning_complete, 55), be_const_closure(Matter_Device_start_commissioning_complete_closure) }, - { be_const_key_weak(init, 89), be_const_closure(Matter_Device_init_closure) }, - { be_const_key_weak(mdns_announce_op_discovery, -1), be_const_closure(Matter_Device_mdns_announce_op_discovery_closure) }, - { be_const_key_weak(process_attribute_expansion, -1), be_const_closure(Matter_Device_process_attribute_expansion_closure) }, { be_const_key_weak(is_commissioning_open, -1), be_const_closure(Matter_Device_is_commissioning_open_closure) }, - { be_const_key_weak(root_w0, 47), be_const_var(31) }, - { be_const_key_weak(started, 45), be_const_var(0) }, - { be_const_key_weak(start_operational_discovery_deferred, 43), be_const_closure(Matter_Device_start_operational_discovery_deferred_closure) }, - { be_const_key_weak(root_L, -1), be_const_var(32) }, - { be_const_key_weak(_load_plugins_config, 94), be_const_closure(Matter_Device__load_plugins_config_closure) }, - { be_const_key_weak(mdns_pase_wifi, -1), be_const_var(24) }, - { be_const_key_weak(is_root_commissioning_open, -1), be_const_closure(Matter_Device_is_root_commissioning_open_closure) }, - { be_const_key_weak(commissioning_iterations, 30), be_const_var(11) }, - { be_const_key_weak(every_50ms, 28), be_const_closure(Matter_Device_every_50ms_closure) }, - { be_const_key_weak(hostname_eth, 26), be_const_var(20) }, - { be_const_key_weak(udp_server, -1), be_const_var(5) }, - { be_const_key_weak(tick, -1), be_const_var(9) }, - { be_const_key_weak(event_fabrics_saved, 21), be_const_closure(Matter_Device_event_fabrics_saved_closure) }, - { be_const_key_weak(commissioning_instance_wifi, -1), be_const_var(17) }, - { be_const_key_weak(mdns_remove_PASE, 11), be_const_closure(Matter_Device_mdns_remove_PASE_closure) }, - { be_const_key_weak(register_http_remote, -1), be_const_closure(Matter_Device_register_http_remote_closure) }, - { be_const_key_weak(PASE_TIMEOUT, -1), be_const_int(600) }, - { be_const_key_weak(sort_distinct, 8), be_const_static_closure(Matter_Device_sort_distinct_closure) }, - { be_const_key_weak(_trigger_read_sensors, -1), be_const_closure(Matter_Device__trigger_read_sensors_closure) }, + { be_const_key_weak(commissioning_discriminator, -1), be_const_var(12) }, + { be_const_key_weak(next_ep, -1), be_const_var(29) }, + { be_const_key_weak(register_plugin_class, 43), be_const_closure(Matter_Device_register_plugin_class_closure) }, + { be_const_key_weak(start_basic_commissioning, 96), be_const_closure(Matter_Device_start_basic_commissioning_closure) }, + { be_const_key_weak(load_param, -1), be_const_closure(Matter_Device_load_param_closure) }, + { be_const_key_weak(ipv4only, -1), be_const_var(28) }, + { be_const_key_weak(generate_random_passcode, 25), be_const_closure(Matter_Device_generate_random_passcode_closure) }, + { be_const_key_weak(commissioning_instance_eth, 26), be_const_var(18) }, + { be_const_key_weak(process_attribute_expansion, -1), be_const_closure(Matter_Device_process_attribute_expansion_closure) }, + { be_const_key_weak(received_ack, 48), be_const_closure(Matter_Device_received_ack_closure) }, + { be_const_key_weak(_instantiate_plugins_from_config, -1), be_const_closure(Matter_Device__instantiate_plugins_from_config_closure) }, + { be_const_key_weak(vendorid, 68), be_const_var(21) }, + { be_const_key_weak(mdns_announce_PASE, -1), be_const_closure(Matter_Device_mdns_announce_PASE_closure) }, + { be_const_key_weak(sessions, -1), be_const_var(7) }, + { be_const_key_weak(commissioning_open, 81), be_const_var(10) }, + { be_const_key_weak(mdns_remove_op_discovery, -1), be_const_closure(Matter_Device_mdns_remove_op_discovery_closure) }, + { be_const_key_weak(k2l_num, -1), be_const_static_closure(Matter_Device_k2l_num_closure) }, + { be_const_key_weak(get_plugin_class_arg, 3), be_const_closure(Matter_Device_get_plugin_class_arg_closure) }, + { be_const_key_weak(http_remotes, -1), be_const_var(25) }, + { be_const_key_weak(autoconf_device, -1), be_const_closure(Matter_Device_autoconf_device_closure) }, + { be_const_key_weak(start_commissioning_complete, -1), be_const_closure(Matter_Device_start_commissioning_complete_closure) }, + { be_const_key_weak(plugins_persist, -1), be_const_var(2) }, + { be_const_key_weak(register_native_classes, -1), be_const_closure(Matter_Device_register_native_classes_closure) }, + { be_const_key_weak(save_before_restart, -1), be_const_closure(Matter_Device_save_before_restart_closure) }, + { be_const_key_weak(message_handler, -1), be_const_var(6) }, + { be_const_key_weak(commissioning_admin_fabric, -1), be_const_var(16) }, { be_const_key_weak(_start_udp, -1), be_const_closure(Matter_Device__start_udp_closure) }, + { be_const_key_weak(root_passcode, -1), be_const_var(27) }, + { be_const_key_weak(stop, -1), be_const_closure(Matter_Device_stop_closure) }, + { be_const_key_weak(hostname_eth, -1), be_const_var(20) }, + { be_const_key_weak(root_salt, 90), be_const_var(31) }, + { be_const_key_weak(PASE_TIMEOUT, -1), be_const_int(600) }, + { be_const_key_weak(bridge_remove_endpoint, 52), be_const_closure(Matter_Device_bridge_remove_endpoint_closure) }, + { be_const_key_weak(stop_basic_commissioning, 91), be_const_closure(Matter_Device_stop_basic_commissioning_closure) }, + { be_const_key_weak(start_commissioning_complete_deferred, -1), be_const_closure(Matter_Device_start_commissioning_complete_deferred_closure) }, + { be_const_key_weak(mdns_remove_PASE, -1), be_const_closure(Matter_Device_mdns_remove_PASE_closure) }, + { be_const_key_weak(is_root_commissioning_open, 32), be_const_closure(Matter_Device_is_root_commissioning_open_closure) }, + { be_const_key_weak(get_active_endpoints, 53), be_const_closure(Matter_Device_get_active_endpoints_closure) }, + { be_const_key_weak(remove_fabric, -1), be_const_closure(Matter_Device_remove_fabric_closure) }, + { be_const_key_weak(sort_distinct, -1), be_const_static_closure(Matter_Device_sort_distinct_closure) }, + { be_const_key_weak(init, 64), be_const_closure(Matter_Device_init_closure) }, + { be_const_key_weak(hostname_wifi, -1), be_const_var(19) }, + { be_const_key_weak(commissioning_iterations, 84), be_const_var(11) }, + { be_const_key_weak(root_L, -1), be_const_var(33) }, + { be_const_key_weak(commissioning_L, -1), be_const_var(15) }, + { be_const_key_weak(register_http_remote, 83), be_const_closure(Matter_Device_register_http_remote_closure) }, + { be_const_key_weak(productid, -1), be_const_var(22) }, + { be_const_key_weak(event_fabrics_saved, -1), be_const_closure(Matter_Device_event_fabrics_saved_closure) }, + { be_const_key_weak(get_plugin_class_displayname, -1), be_const_closure(Matter_Device_get_plugin_class_displayname_closure) }, + { be_const_key_weak(mdns_pase_eth, 49), be_const_var(23) }, + { be_const_key_weak(mdns_pase_wifi, 73), be_const_var(24) }, + { be_const_key_weak(commissioning_instance_wifi, 63), be_const_var(17) }, + { be_const_key_weak(compute_qrcode_content, -1), be_const_closure(Matter_Device_compute_qrcode_content_closure) }, + { be_const_key_weak(mdns_announce_op_discovery, 45), be_const_closure(Matter_Device_mdns_announce_op_discovery_closure) }, + { be_const_key_weak(_compute_pbkdf, -1), be_const_closure(Matter_Device__compute_pbkdf_closure) }, + { be_const_key_weak(udp_server, 77), be_const_var(5) }, + { be_const_key_weak(plugins, -1), be_const_var(1) }, + { be_const_key_weak(FILENAME, -1), be_nested_str_weak(_matter_device_X2Ejson) }, + { be_const_key_weak(every_second, -1), be_const_closure(Matter_Device_every_second_closure) }, + { be_const_key_weak(adjust_next_ep, -1), be_const_closure(Matter_Device_adjust_next_ep_closure) }, + { be_const_key_weak(attribute_updated, -1), be_const_closure(Matter_Device_attribute_updated_closure) }, + { be_const_key_weak(msg_send, -1), be_const_closure(Matter_Device_msg_send_closure) }, + { be_const_key_weak(mdns_remove_op_discovery_all_fabrics, -1), be_const_closure(Matter_Device_mdns_remove_op_discovery_all_fabrics_closure) }, + { be_const_key_weak(plugins_config, 42), be_const_var(4) }, + { be_const_key_weak(mdns_announce_op_discovery_all_fabrics, 34), be_const_closure(Matter_Device_mdns_announce_op_discovery_all_fabrics_closure) }, + { be_const_key_weak(plugins_classes, -1), be_const_var(3) }, + { be_const_key_weak(_init_basic_commissioning, 69), be_const_closure(Matter_Device__init_basic_commissioning_closure) }, + { be_const_key_weak(autoconf_device_map, -1), be_const_closure(Matter_Device_autoconf_device_map_closure) }, + { be_const_key_weak(bridge_add_endpoint, -1), be_const_closure(Matter_Device_bridge_add_endpoint_closure) }, + { be_const_key_weak(start_operational_discovery_deferred, -1), be_const_closure(Matter_Device_start_operational_discovery_deferred_closure) }, + { be_const_key_weak(start_root_basic_commissioning, -1), be_const_closure(Matter_Device_start_root_basic_commissioning_closure) }, + { be_const_key_weak(root_iterations, -1), be_const_var(30) }, + { be_const_key_weak(invoke_request, 47), be_const_closure(Matter_Device_invoke_request_closure) }, + { be_const_key_weak(msg_received, -1), be_const_closure(Matter_Device_msg_received_closure) }, + { be_const_key_weak(start_mdns_announce_hostnames, -1), be_const_closure(Matter_Device_start_mdns_announce_hostnames_closure) }, + { be_const_key_weak(root_discriminator, 54), be_const_var(26) }, + { be_const_key_weak(PRODUCT_ID, -1), be_const_int(32768) }, + { be_const_key_weak(ui, -1), be_const_var(8) }, + { be_const_key_weak(commissioning_salt, 33), be_const_var(13) }, + { be_const_key_weak(MtrJoin, -1), be_const_closure(Matter_Device_MtrJoin_closure) }, + { be_const_key_weak(signal_endpoints_changed, 30), be_const_closure(Matter_Device_signal_endpoints_changed_closure) }, + { be_const_key_weak(_mdns_announce_hostname, -1), be_const_closure(Matter_Device__mdns_announce_hostname_closure) }, + { be_const_key_weak(start_operational_discovery, -1), be_const_closure(Matter_Device_start_operational_discovery_closure) }, + { be_const_key_weak(UDP_PORT, 9), be_const_int(5540) }, + { be_const_key_weak(PBKDF_ITERATIONS, -1), be_const_int(1000) }, })), be_str_weak(Matter_Device) ); diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Fabric.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Fabric.h index c9485e9b6..35fc747c3 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Fabric.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Fabric.h @@ -307,21 +307,22 @@ be_local_closure(Matter_Fabric_log_new_fabric, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[10]) { /* constants */ + ( &(const bvalue[11]) { /* constants */ /* K0 */ be_nested_str_weak(string), /* K1 */ be_nested_str_weak(tasmota), /* K2 */ be_nested_str_weak(log), /* K3 */ be_nested_str_weak(format), - /* K4 */ be_nested_str_weak(MTR_X3A_X20_X2BFabric_X20_X20_X20_X20fab_X3D_X27_X25s_X27), + /* K4 */ be_nested_str_weak(MTR_X3A_X20_X2BFabric_X20_X20_X20_X20fab_X3D_X27_X25s_X27_X20vendorid_X3D0x_X2504X), /* K5 */ be_nested_str_weak(get_fabric_id), /* K6 */ be_nested_str_weak(copy), /* K7 */ be_nested_str_weak(reverse), /* K8 */ be_nested_str_weak(tohex), - /* K9 */ be_const_int(2), + /* K9 */ be_nested_str_weak(admin_vendor), + /* K10 */ be_const_int(2), }), be_str_weak(log_new_fabric), &be_const_str_solidified, - ( &(const binstruction[17]) { /* code */ + ( &(const binstruction[18]) { /* code */ 0xA4060000, // 0000 IMPORT R1 K0 0xB80A0200, // 0001 GETNGBL R2 K1 0x8C080502, // 0002 GETMET R2 R2 K2 @@ -335,10 +336,11 @@ be_local_closure(Matter_Fabric_log_new_fabric, /* name */ 0x7C1C0200, // 000A CALL R7 1 0x8C1C0F08, // 000B GETMET R7 R7 K8 0x7C1C0200, // 000C CALL R7 1 - 0x7C100600, // 000D CALL R4 3 - 0x58140009, // 000E LDCONST R5 K9 - 0x7C080600, // 000F CALL R2 3 - 0x80000000, // 0010 RET 0 + 0x88200109, // 000D GETMBR R8 R0 K9 + 0x7C100800, // 000E CALL R4 4 + 0x5814000A, // 000F LDCONST R5 K10 + 0x7C080600, // 0010 CALL R2 3 + 0x80000000, // 0011 RET 0 }) ) ); diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Aggregator.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Aggregator.h index 3cc5a0075..40d603f9b 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Aggregator.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Aggregator.h @@ -60,7 +60,7 @@ be_local_closure(Matter_Plugin_Aggregator_read_attribute, /* name */ 0x5C281200, // 0014 MOVE R10 R9 0x7C280000, // 0015 CALL R10 0 0x542EFEFF, // 0016 LDINT R11 65280 - 0x202C140B, // 0017 NE R11 R10 R11 + 0x142C140B, // 0017 LT R11 R10 R11 0x782E0004, // 0018 JMPF R11 #001E 0x8C2C0F09, // 0019 GETMET R11 R7 K9 0x4C340000, // 001A LDNIL R13 diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_UI.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_UI.h index c950220be..8fc759a45 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_UI.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_UI.h @@ -884,7 +884,7 @@ be_local_closure(Matter_UI_show_plugins_configuration, /* name */ /* K3 */ be_nested_str_weak(_X3Cfieldset_X3E_X3Clegend_X3E_X3Cb_X3E_X26nbsp_X3BCurrent_X20Configuration_X26nbsp_X3B_X3C_X2Fb_X3E_X3C_X2Flegend_X3E_X3Cp_X3E_X3C_X2Fp_X3E), /* K4 */ be_nested_str_weak(_X3Cform_X20action_X3D_X27_X2Fmatterc_X27_X20method_X3D_X27post_X27), /* K5 */ be_nested_str_weak(onsubmit_X3D_X27return_X20confirm_X28_X22This_X20will_X20RESET_X20the_X20configuration_X20to_X20the_X20default_X2E_X20You_X20will_X20need_X20to_X20associate_X20again_X2E_X22_X29_X3B_X27_X3E), - /* K6 */ be_nested_str_weak(_X3Cbutton_X20name_X3D_X27auto_X27_X20class_X3D_X27button_X20bred_X27_X3EReset_X20to_X20default_X3C_X2Fbutton_X3E_X3Cp_X3E_X3C_X2Fp_X3E_X3C_X2Fform_X3E), + /* K6 */ be_nested_str_weak(_X3Cbutton_X20name_X3D_X27auto_X27_X20class_X3D_X27button_X20bred_X27_X3EReset_X20and_X20Auto_X2Ddiscover_X3C_X2Fbutton_X3E_X3Cp_X3E_X3C_X2Fp_X3E_X3C_X2Fform_X3E), /* K7 */ be_nested_str_weak(onsubmit_X3D_X27return_X20confirm_X28_X22Changing_X20the_X20configuration_X20requires_X20to_X20associate_X20again_X2E_X22_X29_X3B_X27_X3E), /* K8 */ be_nested_str_weak(_X3Ctable_X20style_X3D_X27width_X3A100_X25_X27_X3E), /* K9 */ be_nested_str_weak(_X3Ctr_X3E_X3Ctd_X20width_X3D_X2735_X27_X3E_X3Cb_X3EEp_X2E_X3C_X2Fb_X3E_X3C_X2Ftd_X3E_X3Ctd_X3E_X3Cb_X3EType_X3C_X2Fb_X3E_X3C_X2Ftd_X3E_X3Ctd_X3E_X3Cb_X3EParam_X3C_X2Fb_X3E_X3C_X2Ftd_X3E_X3C_X2Ftr_X3E), @@ -1488,7 +1488,7 @@ be_local_closure(Matter_UI_show_fabric_info, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[30]) { /* constants */ + ( &(const bvalue[31]) { /* constants */ /* K0 */ be_nested_str_weak(webserver), /* K1 */ be_nested_str_weak(string), /* K2 */ be_nested_str_weak(content_send), @@ -1505,24 +1505,25 @@ be_local_closure(Matter_UI_show_fabric_info, /* name */ /* K13 */ be_nested_str_weak(_X3CNo_X20label_X3E), /* K14 */ be_nested_str_weak(html_escape), /* K15 */ be_nested_str_weak(format), - /* K16 */ be_nested_str_weak(_X3Cfieldset_X3E_X3Clegend_X3E_X3Cb_X3E_X26nbsp_X3B_X23_X25i_X20_X25s_X26nbsp_X3B_X3C_X2Fb_X3E_X3C_X2Flegend_X3E_X3Cp_X3E_X3C_X2Fp_X3E), + /* K16 */ be_nested_str_weak(_X3Cfieldset_X3E_X3Clegend_X3E_X3Cb_X3E_X26nbsp_X3B_X23_X25i_X20_X25s_X3C_X2Fb_X3E_X20_X280x_X2504X_X29_X26nbsp_X3B_X3C_X2Flegend_X3E_X3Cp_X3E_X3C_X2Fp_X3E), /* K17 */ be_nested_str_weak(get_fabric_index), - /* K18 */ be_nested_str_weak(get_fabric_id), - /* K19 */ be_nested_str_weak(copy), - /* K20 */ be_nested_str_weak(reverse), - /* K21 */ be_nested_str_weak(get_device_id), - /* K22 */ be_nested_str_weak(Fabric_X3A_X20_X25s_X3Cbr_X3E), - /* K23 */ be_nested_str_weak(tohex), - /* K24 */ be_nested_str_weak(Device_X3A_X20_X25s_X3Cbr_X3E_X26nbsp_X3B), - /* K25 */ be_nested_str_weak(_X3Cform_X20action_X3D_X27_X2Fmatterc_X27_X20method_X3D_X27post_X27_X20onsubmit_X3D_X27return_X20confirm_X28_X22Are_X20you_X20sure_X3F_X22_X29_X3B_X27_X3E), - /* K26 */ be_nested_str_weak(_X3Cinput_X20name_X3D_X27del_fabric_X27_X20type_X3D_X27hidden_X27_X20value_X3D_X27_X25i_X27_X3E), - /* K27 */ be_nested_str_weak(_X3Cbutton_X20name_X3D_X27del_X27_X20class_X3D_X27button_X20bgrn_X27_X3EDelete_X20Fabric_X3C_X2Fbutton_X3E_X3C_X2Fform_X3E_X3C_X2Fp_X3E), - /* K28 */ be_nested_str_weak(_X3Cp_X3E_X3C_X2Fp_X3E_X3C_X2Ffieldset_X3E_X3Cp_X3E_X3C_X2Fp_X3E), - /* K29 */ be_nested_str_weak(stop_iteration), + /* K18 */ be_nested_str_weak(get_admin_vendor), + /* K19 */ be_nested_str_weak(get_fabric_id), + /* K20 */ be_nested_str_weak(copy), + /* K21 */ be_nested_str_weak(reverse), + /* K22 */ be_nested_str_weak(get_device_id), + /* K23 */ be_nested_str_weak(Fabric_X3A_X20_X25s_X3Cbr_X3E), + /* K24 */ be_nested_str_weak(tohex), + /* K25 */ be_nested_str_weak(Device_X3A_X20_X25s_X3Cbr_X3E_X26nbsp_X3B), + /* K26 */ be_nested_str_weak(_X3Cform_X20action_X3D_X27_X2Fmatterc_X27_X20method_X3D_X27post_X27_X20onsubmit_X3D_X27return_X20confirm_X28_X22Are_X20you_X20sure_X3F_X22_X29_X3B_X27_X3E), + /* K27 */ be_nested_str_weak(_X3Cinput_X20name_X3D_X27del_fabric_X27_X20type_X3D_X27hidden_X27_X20value_X3D_X27_X25i_X27_X3E), + /* K28 */ be_nested_str_weak(_X3Cbutton_X20name_X3D_X27del_X27_X20class_X3D_X27button_X20bgrn_X27_X3EDelete_X20Fabric_X3C_X2Fbutton_X3E_X3C_X2Fform_X3E_X3C_X2Fp_X3E), + /* K29 */ be_nested_str_weak(_X3Cp_X3E_X3C_X2Fp_X3E_X3C_X2Ffieldset_X3E_X3Cp_X3E_X3C_X2Fp_X3E), + /* K30 */ be_nested_str_weak(stop_iteration), }), be_str_weak(show_fabric_info), &be_const_str_solidified, - ( &(const binstruction[102]) { /* code */ + ( &(const binstruction[104]) { /* code */ 0xA4060000, // 0000 IMPORT R1 K0 0xA40A0200, // 0001 IMPORT R2 K1 0x8C0C0302, // 0002 GETMET R3 R1 K2 @@ -1541,7 +1542,7 @@ be_local_closure(Matter_UI_show_fabric_info, /* name */ 0x8C0C0302, // 000F GETMET R3 R1 K2 0x58140008, // 0010 LDCONST R5 K8 0x7C0C0400, // 0011 CALL R3 2 - 0x7002004E, // 0012 JMP #0062 + 0x70020050, // 0012 JMP #0064 0x500C0200, // 0013 LDBOOL R3 1 0 0x60100010, // 0014 GETGBL R4 G16 0x88140105, // 0015 GETMBR R5 R0 K5 @@ -1550,7 +1551,7 @@ be_local_closure(Matter_UI_show_fabric_info, /* name */ 0x8C140B0A, // 0018 GETMET R5 R5 K10 0x7C140200, // 0019 CALL R5 1 0x7C100200, // 001A CALL R4 1 - 0xA8020042, // 001B EXBLK 0 #005F + 0xA8020044, // 001B EXBLK 0 #0061 0x5C140800, // 001C MOVE R5 R4 0x7C140000, // 001D CALL R5 0 0x5C180600, // 001E MOVE R6 R3 @@ -1573,58 +1574,60 @@ be_local_closure(Matter_UI_show_fabric_info, /* name */ 0x8C300B11, // 002F GETMET R12 R5 K17 0x7C300200, // 0030 CALL R12 1 0x5C340C00, // 0031 MOVE R13 R6 - 0x7C240800, // 0032 CALL R9 4 - 0x7C1C0400, // 0033 CALL R7 2 - 0x8C1C0B12, // 0034 GETMET R7 R5 K18 - 0x7C1C0200, // 0035 CALL R7 1 - 0x8C1C0F13, // 0036 GETMET R7 R7 K19 + 0x8C380B12, // 0032 GETMET R14 R5 K18 + 0x7C380200, // 0033 CALL R14 1 + 0x7C240A00, // 0034 CALL R9 5 + 0x7C1C0400, // 0035 CALL R7 2 + 0x8C1C0B13, // 0036 GETMET R7 R5 K19 0x7C1C0200, // 0037 CALL R7 1 0x8C1C0F14, // 0038 GETMET R7 R7 K20 0x7C1C0200, // 0039 CALL R7 1 - 0x8C200B15, // 003A GETMET R8 R5 K21 - 0x7C200200, // 003B CALL R8 1 - 0x8C201113, // 003C GETMET R8 R8 K19 + 0x8C1C0F15, // 003A GETMET R7 R7 K21 + 0x7C1C0200, // 003B CALL R7 1 + 0x8C200B16, // 003C GETMET R8 R5 K22 0x7C200200, // 003D CALL R8 1 0x8C201114, // 003E GETMET R8 R8 K20 0x7C200200, // 003F CALL R8 1 - 0x8C240302, // 0040 GETMET R9 R1 K2 - 0x8C2C050F, // 0041 GETMET R11 R2 K15 - 0x58340016, // 0042 LDCONST R13 K22 - 0x8C380F17, // 0043 GETMET R14 R7 K23 - 0x7C380200, // 0044 CALL R14 1 - 0x7C2C0600, // 0045 CALL R11 3 - 0x7C240400, // 0046 CALL R9 2 - 0x8C240302, // 0047 GETMET R9 R1 K2 - 0x8C2C050F, // 0048 GETMET R11 R2 K15 - 0x58340018, // 0049 LDCONST R13 K24 - 0x8C381117, // 004A GETMET R14 R8 K23 - 0x7C380200, // 004B CALL R14 1 - 0x7C2C0600, // 004C CALL R11 3 - 0x7C240400, // 004D CALL R9 2 - 0x8C240302, // 004E GETMET R9 R1 K2 - 0x582C0019, // 004F LDCONST R11 K25 - 0x7C240400, // 0050 CALL R9 2 - 0x8C240302, // 0051 GETMET R9 R1 K2 - 0x8C2C050F, // 0052 GETMET R11 R2 K15 - 0x5834001A, // 0053 LDCONST R13 K26 - 0x8C380B11, // 0054 GETMET R14 R5 K17 - 0x7C380200, // 0055 CALL R14 1 - 0x7C2C0600, // 0056 CALL R11 3 - 0x7C240400, // 0057 CALL R9 2 - 0x8C240302, // 0058 GETMET R9 R1 K2 - 0x582C001B, // 0059 LDCONST R11 K27 - 0x7C240400, // 005A CALL R9 2 - 0x8C240302, // 005B GETMET R9 R1 K2 - 0x582C001C, // 005C LDCONST R11 K28 - 0x7C240400, // 005D CALL R9 2 - 0x7001FFBC, // 005E JMP #001C - 0x5810001D, // 005F LDCONST R4 K29 - 0xAC100200, // 0060 CATCH R4 1 0 - 0xB0080000, // 0061 RAISE 2 R0 R0 - 0x8C0C0302, // 0062 GETMET R3 R1 K2 - 0x5814001C, // 0063 LDCONST R5 K28 - 0x7C0C0400, // 0064 CALL R3 2 - 0x80000000, // 0065 RET 0 + 0x8C201115, // 0040 GETMET R8 R8 K21 + 0x7C200200, // 0041 CALL R8 1 + 0x8C240302, // 0042 GETMET R9 R1 K2 + 0x8C2C050F, // 0043 GETMET R11 R2 K15 + 0x58340017, // 0044 LDCONST R13 K23 + 0x8C380F18, // 0045 GETMET R14 R7 K24 + 0x7C380200, // 0046 CALL R14 1 + 0x7C2C0600, // 0047 CALL R11 3 + 0x7C240400, // 0048 CALL R9 2 + 0x8C240302, // 0049 GETMET R9 R1 K2 + 0x8C2C050F, // 004A GETMET R11 R2 K15 + 0x58340019, // 004B LDCONST R13 K25 + 0x8C381118, // 004C GETMET R14 R8 K24 + 0x7C380200, // 004D CALL R14 1 + 0x7C2C0600, // 004E CALL R11 3 + 0x7C240400, // 004F CALL R9 2 + 0x8C240302, // 0050 GETMET R9 R1 K2 + 0x582C001A, // 0051 LDCONST R11 K26 + 0x7C240400, // 0052 CALL R9 2 + 0x8C240302, // 0053 GETMET R9 R1 K2 + 0x8C2C050F, // 0054 GETMET R11 R2 K15 + 0x5834001B, // 0055 LDCONST R13 K27 + 0x8C380B11, // 0056 GETMET R14 R5 K17 + 0x7C380200, // 0057 CALL R14 1 + 0x7C2C0600, // 0058 CALL R11 3 + 0x7C240400, // 0059 CALL R9 2 + 0x8C240302, // 005A GETMET R9 R1 K2 + 0x582C001C, // 005B LDCONST R11 K28 + 0x7C240400, // 005C CALL R9 2 + 0x8C240302, // 005D GETMET R9 R1 K2 + 0x582C001D, // 005E LDCONST R11 K29 + 0x7C240400, // 005F CALL R9 2 + 0x7001FFBA, // 0060 JMP #001C + 0x5810001E, // 0061 LDCONST R4 K30 + 0xAC100200, // 0062 CATCH R4 1 0 + 0xB0080000, // 0063 RAISE 2 R0 R0 + 0x8C0C0302, // 0064 GETMET R3 R1 K2 + 0x5814001D, // 0065 LDCONST R5 K29 + 0x7C0C0400, // 0066 CALL R3 2 + 0x80000000, // 0067 RET 0 }) ) ); From 844caf51f9dd9a426b1274ba8300516db932f03e Mon Sep 17 00:00:00 2001 From: s-hadinger <49731213+s-hadinger@users.noreply.github.com> Date: Sun, 4 Jun 2023 20:06:04 +0200 Subject: [PATCH 224/289] Fixed HASPmota event when value is non-integer (fixes #18229) (#18791) --- CHANGELOG.md | 1 + .../berry_tasmota/src/be_lv_haspmota.c | 122 +++++++++--------- .../haspmota_src/haspmota_core/haspmota.be | 4 +- 3 files changed, 65 insertions(+), 62 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index db8ae8e28..fb248461a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -16,6 +16,7 @@ All notable changes to this project will be documented in this file. ### Fixed - Interaction of ``SetOption92``, ``VirtualCT``, and ``RGBWWTable`` (#18768) +- Fixed HASPmota event when value is non-integer (fixes #18229) ### Removed diff --git a/lib/libesp32/berry_tasmota/src/be_lv_haspmota.c b/lib/libesp32/berry_tasmota/src/be_lv_haspmota.c index a95232310..5ed132c19 100644 --- a/lib/libesp32/berry_tasmota/src/be_lv_haspmota.c +++ b/lib/libesp32/berry_tasmota/src/be_lv_haspmota.c @@ -1715,7 +1715,7 @@ be_local_closure(lvh_obj_get_click, /* name */ ********************************************************************/ be_local_closure(lvh_obj_event_cb, /* name */ be_nested_proto( - 14, /* nstack */ + 15, /* nstack */ 2, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -1755,7 +1755,7 @@ be_local_closure(lvh_obj_event_cb, /* name */ 0, /* varg */ 1, /* has upvals */ ( &(const bupvaldesc[ 1]) { /* upvals */ - be_local_const_upval(1, 7), + be_local_const_upval(1, 8), }), 0, /* has sup protos */ NULL, /* no sub protos */ @@ -1790,21 +1790,21 @@ be_local_closure(lvh_obj_event_cb, /* name */ /* K10 */ be_nested_str_weak(_event_map), /* K11 */ be_nested_str_weak(find), /* K12 */ be_nested_str_weak(string), - /* K13 */ be_nested_str_weak(EVENT_VALUE_CHANGED), - /* K14 */ be_nested_str_weak(val), - /* K15 */ be_nested_str_weak(format), - /* K16 */ be_nested_str_weak(_X2C_X22val_X22_X3A_X25i), - /* K17 */ be_nested_str_weak(text), - /* K18 */ be_nested_str_weak(json), - /* K19 */ be_nested_str_weak(_X2C_X22text_X22_X3A), - /* K20 */ be_nested_str_weak(dump), + /* K13 */ be_nested_str_weak(json), + /* K14 */ be_nested_str_weak(EVENT_VALUE_CHANGED), + /* K15 */ be_nested_str_weak(val), + /* K16 */ be_nested_str_weak(format), + /* K17 */ be_nested_str_weak(_X2C_X22val_X22_X3A_X25s), + /* K18 */ be_nested_str_weak(dump), + /* K19 */ be_nested_str_weak(text), + /* K20 */ be_nested_str_weak(_X2C_X22text_X22_X3A), /* K21 */ be_nested_str_weak(_X7B_X22hasp_X22_X3A_X7B_X22p_X25ib_X25i_X22_X3A_X7B_X22event_X22_X3A_X22_X25s_X22_X25s_X7D_X7D_X7D), /* K22 */ be_nested_str_weak(_page_id), /* K23 */ be_nested_str_weak(id), }), be_str_weak(event_cb), &be_const_str_solidified, - ( &(const binstruction[71]) { /* code */ + ( &(const binstruction[73]) { /* code */ 0x88080100, // 0000 GETMBR R2 R0 K0 0x88080501, // 0001 GETMBR R2 R2 K1 0x880C0302, // 0002 GETMBR R3 R1 K2 @@ -1826,56 +1826,58 @@ be_local_closure(lvh_obj_event_cb, /* name */ 0x7C100400, // 0012 CALL R4 2 0x4C140000, // 0013 LDNIL R5 0x20140805, // 0014 NE R5 R4 R5 - 0x7816002E, // 0015 JMPF R5 #0045 + 0x78160030, // 0015 JMPF R5 #0047 0xA4161800, // 0016 IMPORT R5 K12 - 0x58180004, // 0017 LDCONST R6 K4 - 0x881C0302, // 0018 GETMBR R7 R1 K2 - 0xB8220A00, // 0019 GETNGBL R8 K5 - 0x8820110D, // 001A GETMBR R8 R8 K13 - 0x1C1C0E08, // 001B EQ R7 R7 R8 - 0x781E0019, // 001C JMPF R7 #0037 - 0xA8020014, // 001D EXBLK 0 #0033 - 0x881C010E, // 001E GETMBR R7 R0 K14 - 0x4C200000, // 001F LDNIL R8 - 0x20200E08, // 0020 NE R8 R7 R8 - 0x78220004, // 0021 JMPF R8 #0027 - 0x8C200B0F, // 0022 GETMET R8 R5 K15 - 0x58280010, // 0023 LDCONST R10 K16 - 0x5C2C0E00, // 0024 MOVE R11 R7 - 0x7C200600, // 0025 CALL R8 3 - 0x5C181000, // 0026 MOVE R6 R8 - 0x88200111, // 0027 GETMBR R8 R0 K17 - 0x4C240000, // 0028 LDNIL R9 - 0x20241009, // 0029 NE R9 R8 R9 - 0x78260005, // 002A JMPF R9 #0031 - 0xA4262400, // 002B IMPORT R9 K18 - 0x00180D13, // 002C ADD R6 R6 K19 - 0x8C281314, // 002D GETMET R10 R9 K20 - 0x5C301000, // 002E MOVE R12 R8 - 0x7C280400, // 002F CALL R10 2 - 0x00180C0A, // 0030 ADD R6 R6 R10 - 0xA8040001, // 0031 EXBLK 1 1 - 0x70020003, // 0032 JMP #0037 - 0xAC1C0000, // 0033 CATCH R7 0 0 - 0x70020000, // 0034 JMP #0036 - 0x70020000, // 0035 JMP #0037 - 0xB0080000, // 0036 RAISE 2 R0 R0 - 0x8C1C0B0F, // 0037 GETMET R7 R5 K15 - 0x58240015, // 0038 LDCONST R9 K21 - 0x88280100, // 0039 GETMBR R10 R0 K0 - 0x88281516, // 003A GETMBR R10 R10 K22 - 0x882C0117, // 003B GETMBR R11 R0 K23 - 0x5C300800, // 003C MOVE R12 R4 - 0x5C340C00, // 003D MOVE R13 R6 - 0x7C1C0C00, // 003E CALL R7 6 - 0xB8220E00, // 003F GETNGBL R8 K7 - 0x8C201108, // 0040 GETMET R8 R8 K8 - 0x58280009, // 0041 LDCONST R10 K9 - 0x842C0001, // 0042 CLOSURE R11 P1 - 0x7C200600, // 0043 CALL R8 3 - 0xA0140000, // 0044 CLOSE R5 - 0xA0000000, // 0045 CLOSE R0 - 0x80000000, // 0046 RET 0 + 0xA41A1A00, // 0017 IMPORT R6 K13 + 0x581C0004, // 0018 LDCONST R7 K4 + 0x88200302, // 0019 GETMBR R8 R1 K2 + 0xB8260A00, // 001A GETNGBL R9 K5 + 0x8824130E, // 001B GETMBR R9 R9 K14 + 0x1C201009, // 001C EQ R8 R8 R9 + 0x7822001A, // 001D JMPF R8 #0039 + 0xA8020015, // 001E EXBLK 0 #0035 + 0x8820010F, // 001F GETMBR R8 R0 K15 + 0x4C240000, // 0020 LDNIL R9 + 0x20241009, // 0021 NE R9 R8 R9 + 0x78260006, // 0022 JMPF R9 #002A + 0x8C240B10, // 0023 GETMET R9 R5 K16 + 0x582C0011, // 0024 LDCONST R11 K17 + 0x8C300D12, // 0025 GETMET R12 R6 K18 + 0x5C381000, // 0026 MOVE R14 R8 + 0x7C300400, // 0027 CALL R12 2 + 0x7C240600, // 0028 CALL R9 3 + 0x5C1C1200, // 0029 MOVE R7 R9 + 0x88240113, // 002A GETMBR R9 R0 K19 + 0x4C280000, // 002B LDNIL R10 + 0x2028120A, // 002C NE R10 R9 R10 + 0x782A0004, // 002D JMPF R10 #0033 + 0x001C0F14, // 002E ADD R7 R7 K20 + 0x8C280D12, // 002F GETMET R10 R6 K18 + 0x5C301200, // 0030 MOVE R12 R9 + 0x7C280400, // 0031 CALL R10 2 + 0x001C0E0A, // 0032 ADD R7 R7 R10 + 0xA8040001, // 0033 EXBLK 1 1 + 0x70020003, // 0034 JMP #0039 + 0xAC200000, // 0035 CATCH R8 0 0 + 0x70020000, // 0036 JMP #0038 + 0x70020000, // 0037 JMP #0039 + 0xB0080000, // 0038 RAISE 2 R0 R0 + 0x8C200B10, // 0039 GETMET R8 R5 K16 + 0x58280015, // 003A LDCONST R10 K21 + 0x882C0100, // 003B GETMBR R11 R0 K0 + 0x882C1716, // 003C GETMBR R11 R11 K22 + 0x88300117, // 003D GETMBR R12 R0 K23 + 0x5C340800, // 003E MOVE R13 R4 + 0x5C380E00, // 003F MOVE R14 R7 + 0x7C200C00, // 0040 CALL R8 6 + 0xB8260E00, // 0041 GETNGBL R9 K7 + 0x8C241308, // 0042 GETMET R9 R9 K8 + 0x582C0009, // 0043 LDCONST R11 K9 + 0x84300001, // 0044 CLOSURE R12 P1 + 0x7C240600, // 0045 CALL R9 3 + 0xA0140000, // 0046 CLOSE R5 + 0xA0000000, // 0047 CLOSE R0 + 0x80000000, // 0048 RET 0 }) ) ); diff --git a/tasmota/berry/haspmota_src/haspmota_core/haspmota.be b/tasmota/berry/haspmota_src/haspmota_core/haspmota.be index 76e66f29e..ee9a4a169 100644 --- a/tasmota/berry/haspmota_src/haspmota_core/haspmota.be +++ b/tasmota/berry/haspmota_src/haspmota_core/haspmota.be @@ -338,16 +338,16 @@ class lvh_obj var event_hasp = self._event_map.find(code) if event_hasp != nil import string + import json var tas_event_more = "" # complementary data if event.code == lv.EVENT_VALUE_CHANGED try # try to get the new val var val = self.val - if val != nil tas_event_more = string.format(',"val":%i', val) end + if val != nil tas_event_more = string.format(',"val":%s', json.dump(val)) end var text = self.text if text != nil - import json tas_event_more += ',"text":' tas_event_more += json.dump(text) end From 24233924c5f9fa53200bf6c91da1346b83b9f791 Mon Sep 17 00:00:00 2001 From: blakadder Date: Sun, 4 Jun 2023 23:01:46 +0200 Subject: [PATCH 225/289] add I2S LSB flag (#18793) --- tasmota/tasmota_xdrv_driver/xdrv_42_0_i2s_audio.ino | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/tasmota/tasmota_xdrv_driver/xdrv_42_0_i2s_audio.ino b/tasmota/tasmota_xdrv_driver/xdrv_42_0_i2s_audio.ino index 0b2d6301a..e86f92ad1 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_42_0_i2s_audio.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_42_0_i2s_audio.ino @@ -36,6 +36,7 @@ //#define USE_I2S_NO_DAC // Add support for transistor-based output without DAC //#define USE_I2S_WEBRADIO // Add support for web radio //#define USE_I2S_SAY_TIME // Add support for english speaking clock +//#define USE_I2S_RTTTL // Add support for Rtttl playback #include "AudioFileSourcePROGMEM.h" #include "AudioFileSourceID3.h" @@ -251,6 +252,11 @@ int32_t I2S_Init_0(void) { #else audio_i2s.out = new AudioOutputI2S(); #endif + +#ifdef USE_I2S_LSB + audio_i2s.lsbJustified = true; +#endif // Allow supporting LSBJ chips, e.g. TM8211/PT8211 + audio_i2s.bclk = DAC_IIS_BCK; audio_i2s.ws = DAC_IIS_WS; audio_i2s.dout = DAC_IIS_DOUT; From 31b93f8d4820c51431911a97d80bdfc34c334c0e Mon Sep 17 00:00:00 2001 From: s-hadinger <49731213+s-hadinger@users.noreply.github.com> Date: Sun, 4 Jun 2023 23:05:52 +0200 Subject: [PATCH 226/289] Matter add controller's Vendor Name to logs and UI (#18794) --- CHANGELOG.md | 1 + .../berry_matter/generate/be_matter_vendors.h | 92 + .../berry_matter/src/be_matter_module.c | 12 + .../src/embedded/Matter_Fabric.be | 14 +- .../berry_matter/src/embedded/Matter_UI.be | 2 +- .../src/solidify/solidified_Matter_Fabric.h | 1694 +++++++++-------- .../src/solidify/solidified_Matter_UI.h | 4 +- .../berry_matter/tools/vendor_to_c.be | 91 + lib/libesp32/berry_matter/tools/vendors.json | 592 ++++++ 9 files changed, 1678 insertions(+), 824 deletions(-) create mode 100644 lib/libesp32/berry_matter/generate/be_matter_vendors.h create mode 100644 lib/libesp32/berry_matter/tools/vendor_to_c.be create mode 100644 lib/libesp32/berry_matter/tools/vendors.json diff --git a/CHANGELOG.md b/CHANGELOG.md index fb248461a..a008d72ce 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,7 @@ All notable changes to this project will be documented in this file. ### Added - Matter ability to add or remove endpoint in bridge mode (code only) +- Matter add controller's Vendor Name to logs and UI ### Breaking Changed diff --git a/lib/libesp32/berry_matter/generate/be_matter_vendors.h b/lib/libesp32/berry_matter/generate/be_matter_vendors.h new file mode 100644 index 000000000..44b96de6d --- /dev/null +++ b/lib/libesp32/berry_matter/generate/be_matter_vendors.h @@ -0,0 +1,92 @@ +/*********************************************************************************\ +* List of Matter Vendors +* From: https://on.dcl.csa-iot.org/dcl/vendorinfo/vendors +* +* Generated content, do not edit +\*********************************************************************************/ +#include +#include + +typedef struct { + uint16_t id; + const char* name; +} matter_vendor_t; + +const matter_vendor_t matter_Vendors[] = { + + { 0x100B, "Signify"}, + { 0x101D, "Assa Abloy"}, + { 0x1021, "Legrand Group"}, + { 0x1037, "NXP Semiconductors"}, + { 0x105E, "Schneider"}, + { 0x109B, "Leviton"}, + { 0x10D0, "Qorvo"}, + { 0x10EE, "UEI"}, + { 0x10F2, "ubisys"}, + { 0x111D, "Comcast Communications"}, + { 0x115A, "Nanoleaf"}, + { 0x115F, "Aqara"}, + { 0x1160, "Sengled"}, + { 0x1168, "Leedarson"}, + { 0x117E, "Feibit"}, + { 0x1188, "TP-Link"}, + { 0x118C, "Midea Group"}, + { 0x120B, "HEIMAN"}, + { 0x1217, "Amazon Alexa"}, + { 0x1219, "ORVIBO"}, + { 0x125D, "Tuya"}, + { 0x127F, "Nordic Semiconductor ASA"}, + { 0x1280, "Siterwell"}, + { 0x1286, "CoolKit"}, + { 0x128F, "EGLO"}, + { 0x130A, "Eve"}, + { 0x130D, "BouffaloLab"}, + { 0x1312, "Yeelight"}, + { 0x131B, "Espressif Systems"}, + { 0x131E, "CAME S.p.A."}, + { 0x131F, "Longan.link"}, + { 0x1321, "SONOFF"}, + { 0x1333, "Becker Antriebe"}, + { 0x1339, "GE Lighting, a Savant company"}, + { 0x133F, "ASR"}, + { 0x1342, "Beken Corporation"}, + { 0x1344, "Eltako"}, + { 0x1345, "Meross"}, + { 0x1346, "Rafael"}, + { 0x1349, "Apple Home"}, + { 0x134E, "tado"}, + { 0x134F, "mediola"}, + { 0x1351, "HooRii Technology"}, + { 0x135D, "Nuki"}, + { 0x1362, "deveritec GmbH"}, + { 0x1365, "Dooya"}, + { 0x136E, "Ambi Labs Limited"}, + { 0x1371, "Tridonic"}, + { 0x1372, "innovation matters"}, + { 0x137F, "NEO"}, + { 0x1381, "Amazon Prime Video"}, + { 0x1384, "Apple Keychain"}, + { 0x1386, "Skylux"}, + { 0x1387, "Qianyan"}, + { 0x138A, "Nature"}, + { 0x1391, "Kasa"}, + { 0x1392, "Tapo"}, + { 0x1397, "SwitchBot"}, + { 0x139C, "Zemismart Technology Limited"}, + { 0x1400, "Uascent"}, + { 0x1403, "Arlec Australia"}, + { 0x1404, "Phaten"}, + { 0x1407, "ThirdReality"}, + { 0x1410, "Quectel"}, + { 0x1413, "1Home"}, + { 0x1415, "Caveman"}, + { 0x1419, "Lorex"}, + { 0x141B, "Rang Dong VN"}, + { 0x141E, "TUO Accessories LLC"}, + { 0x141F, "Ductech"}, + { 0x142D, "QH"}, + { 0x142F, "QIACHIP"}, + { 0x6006, "Google LLC"}, + + { 0xFFFF, NULL }, +}; diff --git a/lib/libesp32/berry_matter/src/be_matter_module.c b/lib/libesp32/berry_matter/src/be_matter_module.c index bef0a4253..72deac883 100644 --- a/lib/libesp32/berry_matter/src/be_matter_module.c +++ b/lib/libesp32/berry_matter/src/be_matter_module.c @@ -77,6 +77,17 @@ extern const bclass be_class_Matter_QRCode; #include "../generate/be_matter_clusters.h" #include "../generate/be_matter_opcodes.h" +#include "../generate/be_matter_vendors.h" + +const char* matter_get_vendor_name(uint16_t id) { + for (const matter_vendor_t * vnd = matter_Vendors; vnd->id != 0xFFFF; vnd++) { + if (vnd->id == id) { + return vnd->name; + } + } + return NULL; +} +BE_FUNC_CTYPE_DECLARE(matter_get_vendor_name, "s", "i") const char* matter_get_cluster_name(uint16_t cluster) { for (const matter_cluster_t * cl = matterAllClusters; cl->id != 0xFFFF; cl++) { @@ -253,6 +264,7 @@ module matter (scope: global, strings: weak) { member, closure(matter_member_closure) get_ip_bytes, ctype_func(matter_get_ip_bytes) + get_vendor_name, ctype_func(matter_get_vendor_name) get_cluster_name, ctype_func(matter_get_cluster_name) get_attribute_name, ctype_func(matter_get_attribute_name) is_attribute_writable, ctype_func(matter_is_attribute_writable) diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Fabric.be b/lib/libesp32/berry_matter/src/embedded/Matter_Fabric.be index 046201337..14f538e24 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Fabric.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Fabric.be @@ -95,6 +95,18 @@ class Matter_Fabric : Matter_Expirable def get_ca() return self.root_ca_certificate end def get_fabric_index() return self.fabric_index end + def get_admin_vendor_name() + var vnd = self.admin_vendor + if vnd == nil return "" end + var name = matter.get_vendor_name(vnd) + if name != nil + return name + else + import string + return string.format("0x%04X", vnd) + end + end + def set_fabric_index(v) self.fabric_index = v end def set_ca(ca) self.root_ca_certificate = ca @@ -205,7 +217,7 @@ class Matter_Fabric : Matter_Expirable # Called before removal def log_new_fabric() import string - tasmota.log(string.format("MTR: +Fabric fab='%s' vendorid=0x%04X", self.get_fabric_id().copy().reverse().tohex(), self.admin_vendor), 2) + tasmota.log(string.format("MTR: +Fabric fab='%s' vendorid=%s", self.get_fabric_id().copy().reverse().tohex(), self.get_admin_vendor_name()), 2) end ############################################################# diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_UI.be b/lib/libesp32/berry_matter/src/embedded/Matter_UI.be index c856ed102..88249ba97 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_UI.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_UI.be @@ -205,7 +205,7 @@ class Matter_UI if !label label = "" end label = webserver.html_escape(label) # protect against HTML injection - webserver.content_send(string.format("
     #%i %s (0x%04X) 

    ", f.get_fabric_index(), label, f.get_admin_vendor())) + webserver.content_send(string.format("
     #%i %s (%s) 

    ", f.get_fabric_index(), label, f.get_admin_vendor_name())) var fabric_rev = f.get_fabric_id().copy().reverse() var deviceid_rev = f.get_device_id().copy().reverse() diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Fabric.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Fabric.h index 35fc747c3..fc973c915 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Fabric.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Fabric.h @@ -7,11 +7,11 @@ extern const bclass be_class_Matter_Fabric; /******************************************************************** -** Solidified function: get_device_id +** Solidified function: counter_group_data_snd_next ********************************************************************/ -be_local_closure(Matter_Fabric_get_device_id, /* name */ +be_local_closure(Matter_Fabric_counter_group_data_snd_next, /* name */ be_nested_proto( - 2, /* nstack */ + 9, /* nstack */ 1, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -19,156 +19,54 @@ be_local_closure(Matter_Fabric_get_device_id, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[ 1]) { /* constants */ - /* K0 */ be_nested_str_weak(device_id), + ( &(const bvalue[15]) { /* constants */ + /* K0 */ be_nested_str_weak(string), + /* K1 */ be_nested_str_weak(_counter_group_data_snd_impl), + /* K2 */ be_nested_str_weak(next), + /* K3 */ be_nested_str_weak(tasmota), + /* K4 */ be_nested_str_weak(log), + /* K5 */ be_nested_str_weak(format), + /* K6 */ be_nested_str_weak(MTR_X3A_X20_X2E_X20_X20_X20_X20_X20_X20_X20_X20_X20_X20Counter_group_data_snd_X3D_X25i), + /* K7 */ be_const_int(3), + /* K8 */ be_nested_str_weak(matter), + /* K9 */ be_nested_str_weak(Counter), + /* K10 */ be_nested_str_weak(is_greater), + /* K11 */ be_nested_str_weak(counter_group_data_snd), + /* K12 */ be_nested_str_weak(_GROUP_SND_INCR), + /* K13 */ be_nested_str_weak(does_persist), + /* K14 */ be_nested_str_weak(save), }), - be_str_weak(get_device_id), + be_str_weak(counter_group_data_snd_next), &be_const_str_solidified, - ( &(const binstruction[ 2]) { /* code */ - 0x88040100, // 0000 GETMBR R1 R0 K0 - 0x80040200, // 0001 RET 1 R1 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: hydrate_post -********************************************************************/ -be_local_closure(Matter_Fabric_hydrate_post, /* name */ - be_nested_proto( - 4, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 6]) { /* constants */ - /* K0 */ be_nested_str_weak(_counter_group_data_snd_impl), - /* K1 */ be_nested_str_weak(reset), - /* K2 */ be_nested_str_weak(counter_group_data_snd), - /* K3 */ be_nested_str_weak(_counter_group_ctrl_snd_impl), - /* K4 */ be_nested_str_weak(counter_group_ctrl_snd), - /* K5 */ be_nested_str_weak(val), - }), - be_str_weak(hydrate_post), - &be_const_str_solidified, - ( &(const binstruction[17]) { /* code */ - 0x88040100, // 0000 GETMBR R1 R0 K0 - 0x8C040301, // 0001 GETMET R1 R1 K1 - 0x880C0102, // 0002 GETMBR R3 R0 K2 - 0x7C040400, // 0003 CALL R1 2 - 0x88040103, // 0004 GETMBR R1 R0 K3 - 0x8C040301, // 0005 GETMET R1 R1 K1 - 0x880C0104, // 0006 GETMBR R3 R0 K4 - 0x7C040400, // 0007 CALL R1 2 - 0x88040100, // 0008 GETMBR R1 R0 K0 - 0x8C040305, // 0009 GETMET R1 R1 K5 - 0x7C040200, // 000A CALL R1 1 - 0x90020401, // 000B SETMBR R0 K2 R1 - 0x88040103, // 000C GETMBR R1 R0 K3 - 0x8C040305, // 000D GETMET R1 R1 K5 - 0x7C040200, // 000E CALL R1 1 - 0x90020801, // 000F SETMBR R0 K4 R1 - 0x80000000, // 0010 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: set_ca -********************************************************************/ -be_local_closure(Matter_Fabric_set_ca, /* name */ - be_nested_proto( - 2, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 1]) { /* constants */ - /* K0 */ be_nested_str_weak(root_ca_certificate), - }), - be_str_weak(set_ca), - &be_const_str_solidified, - ( &(const binstruction[ 2]) { /* code */ - 0x90020001, // 0000 SETMBR R0 K0 R1 - 0x80000000, // 0001 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: fabric_completed -********************************************************************/ -be_local_closure(Matter_Fabric_fabric_completed, /* name */ - be_nested_proto( - 4, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 5]) { /* constants */ - /* K0 */ be_nested_str_weak(set_no_expiration), - /* K1 */ be_nested_str_weak(set_persist), - /* K2 */ be_nested_str_weak(assign_fabric_index), - /* K3 */ be_nested_str_weak(_store), - /* K4 */ be_nested_str_weak(add_fabric), - }), - be_str_weak(fabric_completed), - &be_const_str_solidified, - ( &(const binstruction[12]) { /* code */ - 0x8C040100, // 0000 GETMET R1 R0 K0 - 0x7C040200, // 0001 CALL R1 1 - 0x8C040101, // 0002 GETMET R1 R0 K1 - 0x500C0200, // 0003 LDBOOL R3 1 0 - 0x7C040400, // 0004 CALL R1 2 - 0x8C040102, // 0005 GETMET R1 R0 K2 - 0x7C040200, // 0006 CALL R1 1 - 0x88040103, // 0007 GETMBR R1 R0 K3 - 0x8C040304, // 0008 GETMET R1 R1 K4 - 0x5C0C0000, // 0009 MOVE R3 R0 - 0x7C040400, // 000A CALL R1 2 - 0x80000000, // 000B RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: get_fabric_compressed -********************************************************************/ -be_local_closure(Matter_Fabric_get_fabric_compressed, /* name */ - be_nested_proto( - 2, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 1]) { /* constants */ - /* K0 */ be_nested_str_weak(fabric_compressed), - }), - be_str_weak(get_fabric_compressed), - &be_const_str_solidified, - ( &(const binstruction[ 2]) { /* code */ - 0x88040100, // 0000 GETMBR R1 R0 K0 - 0x80040200, // 0001 RET 1 R1 + ( &(const binstruction[28]) { /* code */ + 0xA4060000, // 0000 IMPORT R1 K0 + 0x88080101, // 0001 GETMBR R2 R0 K1 + 0x8C080502, // 0002 GETMET R2 R2 K2 + 0x7C080200, // 0003 CALL R2 1 + 0xB80E0600, // 0004 GETNGBL R3 K3 + 0x8C0C0704, // 0005 GETMET R3 R3 K4 + 0x8C140305, // 0006 GETMET R5 R1 K5 + 0x581C0006, // 0007 LDCONST R7 K6 + 0x5C200400, // 0008 MOVE R8 R2 + 0x7C140600, // 0009 CALL R5 3 + 0x58180007, // 000A LDCONST R6 K7 + 0x7C0C0600, // 000B CALL R3 3 + 0xB80E1000, // 000C GETNGBL R3 K8 + 0x880C0709, // 000D GETMBR R3 R3 K9 + 0x8C0C070A, // 000E GETMET R3 R3 K10 + 0x5C140400, // 000F MOVE R5 R2 + 0x8818010B, // 0010 GETMBR R6 R0 K11 + 0x7C0C0600, // 0011 CALL R3 3 + 0x780E0007, // 0012 JMPF R3 #001B + 0x880C010C, // 0013 GETMBR R3 R0 K12 + 0x000C0403, // 0014 ADD R3 R2 R3 + 0x90021603, // 0015 SETMBR R0 K11 R3 + 0x8C0C010D, // 0016 GETMET R3 R0 K13 + 0x7C0C0200, // 0017 CALL R3 1 + 0x780E0001, // 0018 JMPF R3 #001B + 0x8C0C010E, // 0019 GETMET R3 R0 K14 + 0x7C0C0200, // 001A CALL R3 1 + 0x80040400, // 001B RET 1 R2 }) ) ); @@ -217,60 +115,9 @@ be_local_closure(Matter_Fabric_get_ca_pub, /* name */ /******************************************************************** -** Solidified function: before_remove +** Solidified function: get_device_id ********************************************************************/ -be_local_closure(Matter_Fabric_before_remove, /* name */ - be_nested_proto( - 9, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[10]) { /* constants */ - /* K0 */ be_nested_str_weak(string), - /* K1 */ be_nested_str_weak(tasmota), - /* K2 */ be_nested_str_weak(log), - /* K3 */ be_nested_str_weak(format), - /* K4 */ be_nested_str_weak(MTR_X3A_X20_X2DFabric_X20_X20_X20_X20fab_X3D_X27_X25s_X27_X20_X28removed_X29), - /* K5 */ be_nested_str_weak(get_fabric_id), - /* K6 */ be_nested_str_weak(copy), - /* K7 */ be_nested_str_weak(reverse), - /* K8 */ be_nested_str_weak(tohex), - /* K9 */ be_const_int(2), - }), - be_str_weak(before_remove), - &be_const_str_solidified, - ( &(const binstruction[17]) { /* code */ - 0xA4060000, // 0000 IMPORT R1 K0 - 0xB80A0200, // 0001 GETNGBL R2 K1 - 0x8C080502, // 0002 GETMET R2 R2 K2 - 0x8C100303, // 0003 GETMET R4 R1 K3 - 0x58180004, // 0004 LDCONST R6 K4 - 0x8C1C0105, // 0005 GETMET R7 R0 K5 - 0x7C1C0200, // 0006 CALL R7 1 - 0x8C1C0F06, // 0007 GETMET R7 R7 K6 - 0x7C1C0200, // 0008 CALL R7 1 - 0x8C1C0F07, // 0009 GETMET R7 R7 K7 - 0x7C1C0200, // 000A CALL R7 1 - 0x8C1C0F08, // 000B GETMET R7 R7 K8 - 0x7C1C0200, // 000C CALL R7 1 - 0x7C100600, // 000D CALL R4 3 - 0x58140009, // 000E LDCONST R5 K9 - 0x7C080600, // 000F CALL R2 3 - 0x80000000, // 0010 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: get_ca -********************************************************************/ -be_local_closure(Matter_Fabric_get_ca, /* name */ +be_local_closure(Matter_Fabric_get_device_id, /* name */ be_nested_proto( 2, /* nstack */ 1, /* argc */ @@ -281,9 +128,9 @@ be_local_closure(Matter_Fabric_get_ca, /* name */ NULL, /* no sub protos */ 1, /* has constants */ ( &(const bvalue[ 1]) { /* constants */ - /* K0 */ be_nested_str_weak(root_ca_certificate), + /* K0 */ be_nested_str_weak(device_id), }), - be_str_weak(get_ca), + be_str_weak(get_device_id), &be_const_str_solidified, ( &(const binstruction[ 2]) { /* code */ 0x88040100, // 0000 GETMBR R1 R0 K0 @@ -295,11 +142,68 @@ be_local_closure(Matter_Fabric_get_ca, /* name */ /******************************************************************** -** Solidified function: log_new_fabric +** Solidified function: add_session ********************************************************************/ -be_local_closure(Matter_Fabric_log_new_fabric, /* name */ +be_local_closure(Matter_Fabric_add_session, /* name */ be_nested_proto( - 9, /* nstack */ + 8, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 6]) { /* constants */ + /* K0 */ be_nested_str_weak(_sessions), + /* K1 */ be_nested_str_weak(find), + /* K2 */ be_nested_str_weak(_MAX_CASE), + /* K3 */ be_nested_str_weak(remove), + /* K4 */ be_nested_str_weak(get_oldest_session), + /* K5 */ be_nested_str_weak(push), + }), + be_str_weak(add_session), + &be_const_str_solidified, + ( &(const binstruction[27]) { /* code */ + 0x88080100, // 0000 GETMBR R2 R0 K0 + 0x8C080501, // 0001 GETMET R2 R2 K1 + 0x5C100200, // 0002 MOVE R4 R1 + 0x7C080400, // 0003 CALL R2 2 + 0x4C0C0000, // 0004 LDNIL R3 + 0x1C080403, // 0005 EQ R2 R2 R3 + 0x780A0012, // 0006 JMPF R2 #001A + 0x6008000C, // 0007 GETGBL R2 G12 + 0x880C0100, // 0008 GETMBR R3 R0 K0 + 0x7C080200, // 0009 CALL R2 1 + 0x880C0102, // 000A GETMBR R3 R0 K2 + 0x28080403, // 000B GE R2 R2 R3 + 0x780A0008, // 000C JMPF R2 #0016 + 0x88080100, // 000D GETMBR R2 R0 K0 + 0x8C080503, // 000E GETMET R2 R2 K3 + 0x88100100, // 000F GETMBR R4 R0 K0 + 0x8C100901, // 0010 GETMET R4 R4 K1 + 0x8C180104, // 0011 GETMET R6 R0 K4 + 0x7C180200, // 0012 CALL R6 1 + 0x7C100400, // 0013 CALL R4 2 + 0x7C080400, // 0014 CALL R2 2 + 0x7001FFF0, // 0015 JMP #0007 + 0x88080100, // 0016 GETMBR R2 R0 K0 + 0x8C080505, // 0017 GETMET R2 R2 K5 + 0x5C100200, // 0018 MOVE R4 R1 + 0x7C080400, // 0019 CALL R2 2 + 0x80000000, // 001A RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: get_oldest_session +********************************************************************/ +be_local_closure(Matter_Fabric_get_oldest_session, /* name */ + be_nested_proto( + 4, /* nstack */ 1, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -307,40 +211,134 @@ be_local_closure(Matter_Fabric_log_new_fabric, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[11]) { /* constants */ - /* K0 */ be_nested_str_weak(string), - /* K1 */ be_nested_str_weak(tasmota), - /* K2 */ be_nested_str_weak(log), - /* K3 */ be_nested_str_weak(format), - /* K4 */ be_nested_str_weak(MTR_X3A_X20_X2BFabric_X20_X20_X20_X20fab_X3D_X27_X25s_X27_X20vendorid_X3D0x_X2504X), - /* K5 */ be_nested_str_weak(get_fabric_id), - /* K6 */ be_nested_str_weak(copy), - /* K7 */ be_nested_str_weak(reverse), - /* K8 */ be_nested_str_weak(tohex), - /* K9 */ be_nested_str_weak(admin_vendor), - /* K10 */ be_const_int(2), + ( &(const bvalue[ 1]) { /* constants */ + /* K0 */ be_nested_str_weak(get_old_recent_session), }), - be_str_weak(log_new_fabric), + be_str_weak(get_oldest_session), &be_const_str_solidified, - ( &(const binstruction[18]) { /* code */ - 0xA4060000, // 0000 IMPORT R1 K0 - 0xB80A0200, // 0001 GETNGBL R2 K1 - 0x8C080502, // 0002 GETMET R2 R2 K2 - 0x8C100303, // 0003 GETMET R4 R1 K3 - 0x58180004, // 0004 LDCONST R6 K4 - 0x8C1C0105, // 0005 GETMET R7 R0 K5 - 0x7C1C0200, // 0006 CALL R7 1 - 0x8C1C0F06, // 0007 GETMET R7 R7 K6 - 0x7C1C0200, // 0008 CALL R7 1 - 0x8C1C0F07, // 0009 GETMET R7 R7 K7 - 0x7C1C0200, // 000A CALL R7 1 - 0x8C1C0F08, // 000B GETMET R7 R7 K8 - 0x7C1C0200, // 000C CALL R7 1 - 0x88200109, // 000D GETMBR R8 R0 K9 - 0x7C100800, // 000E CALL R4 4 - 0x5814000A, // 000F LDCONST R5 K10 - 0x7C080600, // 0010 CALL R2 3 - 0x80000000, // 0011 RET 0 + ( &(const binstruction[ 4]) { /* code */ + 0x8C040100, // 0000 GETMET R1 R0 K0 + 0x500C0200, // 0001 LDBOOL R3 1 0 + 0x7C040400, // 0002 CALL R1 2 + 0x80040200, // 0003 RET 1 R1 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: fromjson +********************************************************************/ +be_local_closure(Matter_Fabric_fromjson, /* name */ + be_nested_proto( + 16, /* nstack */ + 2, /* argc */ + 4, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[18]) { /* constants */ + /* K0 */ be_const_class(be_class_Matter_Fabric), + /* K1 */ be_nested_str_weak(string), + /* K2 */ be_nested_str_weak(introspect), + /* K3 */ be_nested_str_weak(matter), + /* K4 */ be_nested_str_weak(Fabric), + /* K5 */ be_nested_str_weak(keys), + /* K6 */ be_const_int(0), + /* K7 */ be_nested_str_weak(_), + /* K8 */ be_nested_str_weak(find), + /* K9 */ be_nested_str_weak(0x), + /* K10 */ be_nested_str_weak(set), + /* K11 */ be_nested_str_weak(fromhex), + /* K12 */ be_const_int(2), + /* K13 */ be_const_int(2147483647), + /* K14 */ be_nested_str_weak(_X24_X24), + /* K15 */ be_nested_str_weak(fromb64), + /* K16 */ be_nested_str_weak(stop_iteration), + /* K17 */ be_nested_str_weak(hydrate_post), + }), + be_str_weak(fromjson), + &be_const_str_solidified, + ( &(const binstruction[76]) { /* code */ + 0x58080000, // 0000 LDCONST R2 K0 + 0xA40E0200, // 0001 IMPORT R3 K1 + 0xA4120400, // 0002 IMPORT R4 K2 + 0xB8160600, // 0003 GETNGBL R5 K3 + 0x8C140B04, // 0004 GETMET R5 R5 K4 + 0x5C1C0000, // 0005 MOVE R7 R0 + 0x7C140400, // 0006 CALL R5 2 + 0x60180010, // 0007 GETGBL R6 G16 + 0x8C1C0305, // 0008 GETMET R7 R1 K5 + 0x7C1C0200, // 0009 CALL R7 1 + 0x7C180200, // 000A CALL R6 1 + 0xA8020039, // 000B EXBLK 0 #0046 + 0x5C1C0C00, // 000C MOVE R7 R6 + 0x7C1C0000, // 000D CALL R7 0 + 0x94200F06, // 000E GETIDX R8 R7 K6 + 0x1C201107, // 000F EQ R8 R8 K7 + 0x78220000, // 0010 JMPF R8 #0012 + 0x7001FFF9, // 0011 JMP #000C + 0x94200207, // 0012 GETIDX R8 R1 R7 + 0x60240004, // 0013 GETGBL R9 G4 + 0x5C281000, // 0014 MOVE R10 R8 + 0x7C240200, // 0015 CALL R9 1 + 0x1C241301, // 0016 EQ R9 R9 K1 + 0x78260027, // 0017 JMPF R9 #0040 + 0x8C240708, // 0018 GETMET R9 R3 K8 + 0x5C2C1000, // 0019 MOVE R11 R8 + 0x58300009, // 001A LDCONST R12 K9 + 0x7C240600, // 001B CALL R9 3 + 0x1C241306, // 001C EQ R9 R9 K6 + 0x7826000A, // 001D JMPF R9 #0029 + 0x8C24090A, // 001E GETMET R9 R4 K10 + 0x5C2C0A00, // 001F MOVE R11 R5 + 0x5C300E00, // 0020 MOVE R12 R7 + 0x60340015, // 0021 GETGBL R13 G21 + 0x7C340000, // 0022 CALL R13 0 + 0x8C341B0B, // 0023 GETMET R13 R13 K11 + 0x403E190D, // 0024 CONNECT R15 K12 K13 + 0x943C100F, // 0025 GETIDX R15 R8 R15 + 0x7C340400, // 0026 CALL R13 2 + 0x7C240800, // 0027 CALL R9 4 + 0x70020015, // 0028 JMP #003F + 0x8C240708, // 0029 GETMET R9 R3 K8 + 0x5C2C1000, // 002A MOVE R11 R8 + 0x5830000E, // 002B LDCONST R12 K14 + 0x7C240600, // 002C CALL R9 3 + 0x1C241306, // 002D EQ R9 R9 K6 + 0x7826000A, // 002E JMPF R9 #003A + 0x8C24090A, // 002F GETMET R9 R4 K10 + 0x5C2C0A00, // 0030 MOVE R11 R5 + 0x5C300E00, // 0031 MOVE R12 R7 + 0x60340015, // 0032 GETGBL R13 G21 + 0x7C340000, // 0033 CALL R13 0 + 0x8C341B0F, // 0034 GETMET R13 R13 K15 + 0x403E190D, // 0035 CONNECT R15 K12 K13 + 0x943C100F, // 0036 GETIDX R15 R8 R15 + 0x7C340400, // 0037 CALL R13 2 + 0x7C240800, // 0038 CALL R9 4 + 0x70020004, // 0039 JMP #003F + 0x8C24090A, // 003A GETMET R9 R4 K10 + 0x5C2C0A00, // 003B MOVE R11 R5 + 0x5C300E00, // 003C MOVE R12 R7 + 0x5C341000, // 003D MOVE R13 R8 + 0x7C240800, // 003E CALL R9 4 + 0x70020004, // 003F JMP #0045 + 0x8C24090A, // 0040 GETMET R9 R4 K10 + 0x5C2C0A00, // 0041 MOVE R11 R5 + 0x5C300E00, // 0042 MOVE R12 R7 + 0x5C341000, // 0043 MOVE R13 R8 + 0x7C240800, // 0044 CALL R9 4 + 0x7001FFC5, // 0045 JMP #000C + 0x58180010, // 0046 LDCONST R6 K16 + 0xAC180200, // 0047 CATCH R6 1 0 + 0xB0080000, // 0048 RAISE 2 R0 R0 + 0x8C180B11, // 0049 GETMET R6 R5 K17 + 0x7C180200, // 004A CALL R6 1 + 0x80040A00, // 004B RET 1 R5 }) ) ); @@ -374,278 +372,6 @@ be_local_closure(Matter_Fabric_set_fabric_index, /* name */ /*******************************************************************/ -/******************************************************************** -** Solidified function: assign_fabric_index -********************************************************************/ -be_local_closure(Matter_Fabric_assign_fabric_index, /* name */ - be_nested_proto( - 5, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 4]) { /* constants */ - /* K0 */ be_nested_str_weak(get_fabric_index), - /* K1 */ be_nested_str_weak(set_fabric_index), - /* K2 */ be_nested_str_weak(_store), - /* K3 */ be_nested_str_weak(next_fabric_idx), - }), - be_str_weak(assign_fabric_index), - &be_const_str_solidified, - ( &(const binstruction[11]) { /* code */ - 0x8C040100, // 0000 GETMET R1 R0 K0 - 0x7C040200, // 0001 CALL R1 1 - 0x4C080000, // 0002 LDNIL R2 - 0x1C040202, // 0003 EQ R1 R1 R2 - 0x78060004, // 0004 JMPF R1 #000A - 0x8C040101, // 0005 GETMET R1 R0 K1 - 0x880C0102, // 0006 GETMBR R3 R0 K2 - 0x8C0C0703, // 0007 GETMET R3 R3 K3 - 0x7C0C0200, // 0008 CALL R3 1 - 0x7C040400, // 0009 CALL R1 2 - 0x80000000, // 000A RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: get_ipk_epoch_key -********************************************************************/ -be_local_closure(Matter_Fabric_get_ipk_epoch_key, /* name */ - be_nested_proto( - 2, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 1]) { /* constants */ - /* K0 */ be_nested_str_weak(ipk_epoch_key), - }), - be_str_weak(get_ipk_epoch_key), - &be_const_str_solidified, - ( &(const binstruction[ 2]) { /* code */ - 0x88040100, // 0000 GETMBR R1 R0 K0 - 0x80040200, // 0001 RET 1 R1 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: set_pk -********************************************************************/ -be_local_closure(Matter_Fabric_set_pk, /* name */ - be_nested_proto( - 2, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 1]) { /* constants */ - /* K0 */ be_nested_str_weak(no_private_key), - }), - be_str_weak(set_pk), - &be_const_str_solidified, - ( &(const binstruction[ 2]) { /* code */ - 0x90020001, // 0000 SETMBR R0 K0 R1 - 0x80000000, // 0001 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: set_ipk_epoch_key -********************************************************************/ -be_local_closure(Matter_Fabric_set_ipk_epoch_key, /* name */ - be_nested_proto( - 2, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 1]) { /* constants */ - /* K0 */ be_nested_str_weak(ipk_epoch_key), - }), - be_str_weak(set_ipk_epoch_key), - &be_const_str_solidified, - ( &(const binstruction[ 2]) { /* code */ - 0x90020001, // 0000 SETMBR R0 K0 R1 - 0x80000000, // 0001 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: get_old_recent_session -********************************************************************/ -be_local_closure(Matter_Fabric_get_old_recent_session, /* name */ - be_nested_proto( - 7, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 4]) { /* constants */ - /* K0 */ be_nested_str_weak(_sessions), - /* K1 */ be_const_int(0), - /* K2 */ be_nested_str_weak(last_used), - /* K3 */ be_const_int(1), - }), - be_str_weak(get_old_recent_session), - &be_const_str_solidified, - ( &(const binstruction[30]) { /* code */ - 0x6008000C, // 0000 GETGBL R2 G12 - 0x880C0100, // 0001 GETMBR R3 R0 K0 - 0x7C080200, // 0002 CALL R2 1 - 0x1C080501, // 0003 EQ R2 R2 K1 - 0x780A0001, // 0004 JMPF R2 #0007 - 0x4C080000, // 0005 LDNIL R2 - 0x80040400, // 0006 RET 1 R2 - 0x88080100, // 0007 GETMBR R2 R0 K0 - 0x94080501, // 0008 GETIDX R2 R2 K1 - 0x880C0502, // 0009 GETMBR R3 R2 K2 - 0x58100003, // 000A LDCONST R4 K3 - 0x6014000C, // 000B GETGBL R5 G12 - 0x88180100, // 000C GETMBR R6 R0 K0 - 0x7C140200, // 000D CALL R5 1 - 0x14140805, // 000E LT R5 R4 R5 - 0x7816000C, // 000F JMPF R5 #001D - 0x88140100, // 0010 GETMBR R5 R0 K0 - 0x94140A04, // 0011 GETIDX R5 R5 R4 - 0x88140B02, // 0012 GETMBR R5 R5 K2 - 0x78060001, // 0013 JMPF R1 #0016 - 0x14180A03, // 0014 LT R6 R5 R3 - 0x70020000, // 0015 JMP #0017 - 0x24180A03, // 0016 GT R6 R5 R3 - 0x781A0002, // 0017 JMPF R6 #001B - 0x88180100, // 0018 GETMBR R6 R0 K0 - 0x94080C04, // 0019 GETIDX R2 R6 R4 - 0x5C0C0A00, // 001A MOVE R3 R5 - 0x00100903, // 001B ADD R4 R4 K3 - 0x7001FFED, // 001C JMP #000B - 0x80040400, // 001D RET 1 R2 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: counter_group_ctrl_snd_next -********************************************************************/ -be_local_closure(Matter_Fabric_counter_group_ctrl_snd_next, /* name */ - be_nested_proto( - 9, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[15]) { /* constants */ - /* K0 */ be_nested_str_weak(string), - /* K1 */ be_nested_str_weak(_counter_group_ctrl_snd_impl), - /* K2 */ be_nested_str_weak(next), - /* K3 */ be_nested_str_weak(tasmota), - /* K4 */ be_nested_str_weak(log), - /* K5 */ be_nested_str_weak(format), - /* K6 */ be_nested_str_weak(MTR_X3A_X20_X2E_X20_X20_X20_X20_X20_X20_X20_X20_X20_X20Counter_group_ctrl_snd_X3D_X25i), - /* K7 */ be_const_int(3), - /* K8 */ be_nested_str_weak(matter), - /* K9 */ be_nested_str_weak(Counter), - /* K10 */ be_nested_str_weak(is_greater), - /* K11 */ be_nested_str_weak(counter_group_ctrl_snd), - /* K12 */ be_nested_str_weak(_GROUP_SND_INCR), - /* K13 */ be_nested_str_weak(does_persist), - /* K14 */ be_nested_str_weak(save), - }), - be_str_weak(counter_group_ctrl_snd_next), - &be_const_str_solidified, - ( &(const binstruction[28]) { /* code */ - 0xA4060000, // 0000 IMPORT R1 K0 - 0x88080101, // 0001 GETMBR R2 R0 K1 - 0x8C080502, // 0002 GETMET R2 R2 K2 - 0x7C080200, // 0003 CALL R2 1 - 0xB80E0600, // 0004 GETNGBL R3 K3 - 0x8C0C0704, // 0005 GETMET R3 R3 K4 - 0x8C140305, // 0006 GETMET R5 R1 K5 - 0x581C0006, // 0007 LDCONST R7 K6 - 0x5C200400, // 0008 MOVE R8 R2 - 0x7C140600, // 0009 CALL R5 3 - 0x58180007, // 000A LDCONST R6 K7 - 0x7C0C0600, // 000B CALL R3 3 - 0xB80E1000, // 000C GETNGBL R3 K8 - 0x880C0709, // 000D GETMBR R3 R3 K9 - 0x8C0C070A, // 000E GETMET R3 R3 K10 - 0x5C140400, // 000F MOVE R5 R2 - 0x8818010B, // 0010 GETMBR R6 R0 K11 - 0x7C0C0600, // 0011 CALL R3 3 - 0x780E0007, // 0012 JMPF R3 #001B - 0x880C010C, // 0013 GETMBR R3 R0 K12 - 0x000C0403, // 0014 ADD R3 R2 R3 - 0x90021603, // 0015 SETMBR R0 K11 R3 - 0x8C0C010D, // 0016 GETMET R3 R0 K13 - 0x7C0C0200, // 0017 CALL R3 1 - 0x780E0001, // 0018 JMPF R3 #001B - 0x8C0C010E, // 0019 GETMET R3 R0 K14 - 0x7C0C0200, // 001A CALL R3 1 - 0x80040400, // 001B RET 1 R2 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: get_admin_vendor -********************************************************************/ -be_local_closure(Matter_Fabric_get_admin_vendor, /* name */ - be_nested_proto( - 2, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 1]) { /* constants */ - /* K0 */ be_nested_str_weak(admin_vendor), - }), - be_str_weak(get_admin_vendor), - &be_const_str_solidified, - ( &(const binstruction[ 2]) { /* code */ - 0x88040100, // 0000 GETMBR R1 R0 K0 - 0x80040200, // 0001 RET 1 R1 - }) - ) -); -/*******************************************************************/ - - /******************************************************************** ** Solidified function: init ********************************************************************/ @@ -722,9 +448,9 @@ be_local_closure(Matter_Fabric_init, /* name */ /******************************************************************** -** Solidified function: get_oldest_session +** Solidified function: fabric_completed ********************************************************************/ -be_local_closure(Matter_Fabric_get_oldest_session, /* name */ +be_local_closure(Matter_Fabric_fabric_completed, /* name */ be_nested_proto( 4, /* nstack */ 1, /* argc */ @@ -734,16 +460,28 @@ be_local_closure(Matter_Fabric_get_oldest_session, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[ 1]) { /* constants */ - /* K0 */ be_nested_str_weak(get_old_recent_session), + ( &(const bvalue[ 5]) { /* constants */ + /* K0 */ be_nested_str_weak(set_no_expiration), + /* K1 */ be_nested_str_weak(set_persist), + /* K2 */ be_nested_str_weak(assign_fabric_index), + /* K3 */ be_nested_str_weak(_store), + /* K4 */ be_nested_str_weak(add_fabric), }), - be_str_weak(get_oldest_session), + be_str_weak(fabric_completed), &be_const_str_solidified, - ( &(const binstruction[ 4]) { /* code */ + ( &(const binstruction[12]) { /* code */ 0x8C040100, // 0000 GETMET R1 R0 K0 - 0x500C0200, // 0001 LDBOOL R3 1 0 - 0x7C040400, // 0002 CALL R1 2 - 0x80040200, // 0003 RET 1 R1 + 0x7C040200, // 0001 CALL R1 1 + 0x8C040101, // 0002 GETMET R1 R0 K1 + 0x500C0200, // 0003 LDBOOL R3 1 0 + 0x7C040400, // 0004 CALL R1 2 + 0x8C040102, // 0005 GETMET R1 R0 K2 + 0x7C040200, // 0006 CALL R1 1 + 0x88040103, // 0007 GETMBR R1 R0 K3 + 0x8C040304, // 0008 GETMET R1 R1 K4 + 0x5C0C0000, // 0009 MOVE R3 R0 + 0x7C040400, // 000A CALL R1 2 + 0x80000000, // 000B RET 0 }) ) ); @@ -751,28 +489,66 @@ be_local_closure(Matter_Fabric_get_oldest_session, /* name */ /******************************************************************** -** Solidified function: set_admin_subject_vendor +** Solidified function: counter_group_ctrl_snd_next ********************************************************************/ -be_local_closure(Matter_Fabric_set_admin_subject_vendor, /* name */ +be_local_closure(Matter_Fabric_counter_group_ctrl_snd_next, /* name */ be_nested_proto( - 3, /* nstack */ - 3, /* argc */ + 9, /* nstack */ + 1, /* argc */ 2, /* varg */ 0, /* has upvals */ NULL, /* no upvals */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[ 2]) { /* constants */ - /* K0 */ be_nested_str_weak(admin_subject), - /* K1 */ be_nested_str_weak(admin_vendor), + ( &(const bvalue[15]) { /* constants */ + /* K0 */ be_nested_str_weak(string), + /* K1 */ be_nested_str_weak(_counter_group_ctrl_snd_impl), + /* K2 */ be_nested_str_weak(next), + /* K3 */ be_nested_str_weak(tasmota), + /* K4 */ be_nested_str_weak(log), + /* K5 */ be_nested_str_weak(format), + /* K6 */ be_nested_str_weak(MTR_X3A_X20_X2E_X20_X20_X20_X20_X20_X20_X20_X20_X20_X20Counter_group_ctrl_snd_X3D_X25i), + /* K7 */ be_const_int(3), + /* K8 */ be_nested_str_weak(matter), + /* K9 */ be_nested_str_weak(Counter), + /* K10 */ be_nested_str_weak(is_greater), + /* K11 */ be_nested_str_weak(counter_group_ctrl_snd), + /* K12 */ be_nested_str_weak(_GROUP_SND_INCR), + /* K13 */ be_nested_str_weak(does_persist), + /* K14 */ be_nested_str_weak(save), }), - be_str_weak(set_admin_subject_vendor), + be_str_weak(counter_group_ctrl_snd_next), &be_const_str_solidified, - ( &(const binstruction[ 3]) { /* code */ - 0x90020001, // 0000 SETMBR R0 K0 R1 - 0x90020202, // 0001 SETMBR R0 K1 R2 - 0x80000000, // 0002 RET 0 + ( &(const binstruction[28]) { /* code */ + 0xA4060000, // 0000 IMPORT R1 K0 + 0x88080101, // 0001 GETMBR R2 R0 K1 + 0x8C080502, // 0002 GETMET R2 R2 K2 + 0x7C080200, // 0003 CALL R2 1 + 0xB80E0600, // 0004 GETNGBL R3 K3 + 0x8C0C0704, // 0005 GETMET R3 R3 K4 + 0x8C140305, // 0006 GETMET R5 R1 K5 + 0x581C0006, // 0007 LDCONST R7 K6 + 0x5C200400, // 0008 MOVE R8 R2 + 0x7C140600, // 0009 CALL R5 3 + 0x58180007, // 000A LDCONST R6 K7 + 0x7C0C0600, // 000B CALL R3 3 + 0xB80E1000, // 000C GETNGBL R3 K8 + 0x880C0709, // 000D GETMBR R3 R3 K9 + 0x8C0C070A, // 000E GETMET R3 R3 K10 + 0x5C140400, // 000F MOVE R5 R2 + 0x8818010B, // 0010 GETMBR R6 R0 K11 + 0x7C0C0600, // 0011 CALL R3 3 + 0x780E0007, // 0012 JMPF R3 #001B + 0x880C010C, // 0013 GETMBR R3 R0 K12 + 0x000C0403, // 0014 ADD R3 R2 R3 + 0x90021603, // 0015 SETMBR R0 K11 R3 + 0x8C0C010D, // 0016 GETMET R3 R0 K13 + 0x7C0C0200, // 0017 CALL R3 1 + 0x780E0001, // 0018 JMPF R3 #001B + 0x8C0C010E, // 0019 GETMET R3 R0 K14 + 0x7C0C0200, // 001A CALL R3 1 + 0x80040400, // 001B RET 1 R2 }) ) ); @@ -780,9 +556,9 @@ be_local_closure(Matter_Fabric_set_admin_subject_vendor, /* name */ /******************************************************************** -** Solidified function: get_fabric_label +** Solidified function: get_ipk_epoch_key ********************************************************************/ -be_local_closure(Matter_Fabric_get_fabric_label, /* name */ +be_local_closure(Matter_Fabric_get_ipk_epoch_key, /* name */ be_nested_proto( 2, /* nstack */ 1, /* argc */ @@ -793,9 +569,9 @@ be_local_closure(Matter_Fabric_get_fabric_label, /* name */ NULL, /* no sub protos */ 1, /* has constants */ ( &(const bvalue[ 1]) { /* constants */ - /* K0 */ be_nested_str_weak(fabric_label), + /* K0 */ be_nested_str_weak(ipk_epoch_key), }), - be_str_weak(get_fabric_label), + be_str_weak(get_ipk_epoch_key), &be_const_str_solidified, ( &(const binstruction[ 2]) { /* code */ 0x88040100, // 0000 GETMBR R1 R0 K0 @@ -979,6 +755,45 @@ be_local_closure(Matter_Fabric_tojson, /* name */ /*******************************************************************/ +/******************************************************************** +** Solidified function: assign_fabric_index +********************************************************************/ +be_local_closure(Matter_Fabric_assign_fabric_index, /* name */ + be_nested_proto( + 5, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 4]) { /* constants */ + /* K0 */ be_nested_str_weak(get_fabric_index), + /* K1 */ be_nested_str_weak(set_fabric_index), + /* K2 */ be_nested_str_weak(_store), + /* K3 */ be_nested_str_weak(next_fabric_idx), + }), + be_str_weak(assign_fabric_index), + &be_const_str_solidified, + ( &(const binstruction[11]) { /* code */ + 0x8C040100, // 0000 GETMET R1 R0 K0 + 0x7C040200, // 0001 CALL R1 1 + 0x4C080000, // 0002 LDNIL R2 + 0x1C040202, // 0003 EQ R1 R1 R2 + 0x78060004, // 0004 JMPF R1 #000A + 0x8C040101, // 0005 GETMET R1 R0 K1 + 0x880C0102, // 0006 GETMBR R3 R0 K2 + 0x8C0C0703, // 0007 GETMET R3 R3 K3 + 0x7C0C0200, // 0008 CALL R3 1 + 0x7C040400, // 0009 CALL R1 2 + 0x80000000, // 000A RET 0 + }) + ) +); +/*******************************************************************/ + + /******************************************************************** ** Solidified function: get_admin_subject ********************************************************************/ @@ -1007,56 +822,91 @@ be_local_closure(Matter_Fabric_get_admin_subject, /* name */ /******************************************************************** -** Solidified function: add_session +** Solidified function: get_fabric_compressed ********************************************************************/ -be_local_closure(Matter_Fabric_add_session, /* name */ +be_local_closure(Matter_Fabric_get_fabric_compressed, /* name */ be_nested_proto( - 8, /* nstack */ - 2, /* argc */ + 2, /* nstack */ + 1, /* argc */ 2, /* varg */ 0, /* has upvals */ NULL, /* no upvals */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[ 6]) { /* constants */ - /* K0 */ be_nested_str_weak(_sessions), - /* K1 */ be_nested_str_weak(find), - /* K2 */ be_nested_str_weak(_MAX_CASE), - /* K3 */ be_nested_str_weak(remove), - /* K4 */ be_nested_str_weak(get_oldest_session), - /* K5 */ be_nested_str_weak(push), + ( &(const bvalue[ 1]) { /* constants */ + /* K0 */ be_nested_str_weak(fabric_compressed), }), - be_str_weak(add_session), + be_str_weak(get_fabric_compressed), &be_const_str_solidified, - ( &(const binstruction[27]) { /* code */ - 0x88080100, // 0000 GETMBR R2 R0 K0 - 0x8C080501, // 0001 GETMET R2 R2 K1 - 0x5C100200, // 0002 MOVE R4 R1 - 0x7C080400, // 0003 CALL R2 2 - 0x4C0C0000, // 0004 LDNIL R3 - 0x1C080403, // 0005 EQ R2 R2 R3 - 0x780A0012, // 0006 JMPF R2 #001A - 0x6008000C, // 0007 GETGBL R2 G12 - 0x880C0100, // 0008 GETMBR R3 R0 K0 - 0x7C080200, // 0009 CALL R2 1 - 0x880C0102, // 000A GETMBR R3 R0 K2 - 0x28080403, // 000B GE R2 R2 R3 - 0x780A0008, // 000C JMPF R2 #0016 - 0x88080100, // 000D GETMBR R2 R0 K0 - 0x8C080503, // 000E GETMET R2 R2 K3 - 0x88100100, // 000F GETMBR R4 R0 K0 - 0x8C100901, // 0010 GETMET R4 R4 K1 - 0x8C180104, // 0011 GETMET R6 R0 K4 - 0x7C180200, // 0012 CALL R6 1 - 0x7C100400, // 0013 CALL R4 2 - 0x7C080400, // 0014 CALL R2 2 - 0x7001FFF0, // 0015 JMP #0007 - 0x88080100, // 0016 GETMBR R2 R0 K0 - 0x8C080505, // 0017 GETMET R2 R2 K5 - 0x5C100200, // 0018 MOVE R4 R1 - 0x7C080400, // 0019 CALL R2 2 - 0x80000000, // 001A RET 0 + ( &(const binstruction[ 2]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x80040200, // 0001 RET 1 R1 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: fabric_candidate +********************************************************************/ +be_local_closure(Matter_Fabric_fabric_candidate, /* name */ + be_nested_proto( + 4, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 4]) { /* constants */ + /* K0 */ be_nested_str_weak(set_expire_in_seconds), + /* K1 */ be_nested_str_weak(assign_fabric_index), + /* K2 */ be_nested_str_weak(_store), + /* K3 */ be_nested_str_weak(add_fabric), + }), + be_str_weak(fabric_candidate), + &be_const_str_solidified, + ( &(const binstruction[10]) { /* code */ + 0x8C040100, // 0000 GETMET R1 R0 K0 + 0x540E0077, // 0001 LDINT R3 120 + 0x7C040400, // 0002 CALL R1 2 + 0x8C040101, // 0003 GETMET R1 R0 K1 + 0x7C040200, // 0004 CALL R1 1 + 0x88040102, // 0005 GETMBR R1 R0 K2 + 0x8C040303, // 0006 GETMET R1 R1 K3 + 0x5C0C0000, // 0007 MOVE R3 R0 + 0x7C040400, // 0008 CALL R1 2 + 0x80000000, // 0009 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: get_fabric_label +********************************************************************/ +be_local_closure(Matter_Fabric_get_fabric_label, /* name */ + be_nested_proto( + 2, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 1]) { /* constants */ + /* K0 */ be_nested_str_weak(fabric_label), + }), + be_str_weak(get_fabric_label), + &be_const_str_solidified, + ( &(const binstruction[ 2]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x80040200, // 0001 RET 1 R1 }) ) ); @@ -1122,11 +972,11 @@ be_local_closure(Matter_Fabric_get_newest_session, /* name */ /******************************************************************** -** Solidified function: get_fabric_index +** Solidified function: before_remove ********************************************************************/ -be_local_closure(Matter_Fabric_get_fabric_index, /* name */ +be_local_closure(Matter_Fabric_before_remove, /* name */ be_nested_proto( - 2, /* nstack */ + 9, /* nstack */ 1, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -1134,14 +984,38 @@ be_local_closure(Matter_Fabric_get_fabric_index, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[ 1]) { /* constants */ - /* K0 */ be_nested_str_weak(fabric_index), + ( &(const bvalue[10]) { /* constants */ + /* K0 */ be_nested_str_weak(string), + /* K1 */ be_nested_str_weak(tasmota), + /* K2 */ be_nested_str_weak(log), + /* K3 */ be_nested_str_weak(format), + /* K4 */ be_nested_str_weak(MTR_X3A_X20_X2DFabric_X20_X20_X20_X20fab_X3D_X27_X25s_X27_X20_X28removed_X29), + /* K5 */ be_nested_str_weak(get_fabric_id), + /* K6 */ be_nested_str_weak(copy), + /* K7 */ be_nested_str_weak(reverse), + /* K8 */ be_nested_str_weak(tohex), + /* K9 */ be_const_int(2), }), - be_str_weak(get_fabric_index), + be_str_weak(before_remove), &be_const_str_solidified, - ( &(const binstruction[ 2]) { /* code */ - 0x88040100, // 0000 GETMBR R1 R0 K0 - 0x80040200, // 0001 RET 1 R1 + ( &(const binstruction[17]) { /* code */ + 0xA4060000, // 0000 IMPORT R1 K0 + 0xB80A0200, // 0001 GETNGBL R2 K1 + 0x8C080502, // 0002 GETMET R2 R2 K2 + 0x8C100303, // 0003 GETMET R4 R1 K3 + 0x58180004, // 0004 LDCONST R6 K4 + 0x8C1C0105, // 0005 GETMET R7 R0 K5 + 0x7C1C0200, // 0006 CALL R7 1 + 0x8C1C0F06, // 0007 GETMET R7 R7 K6 + 0x7C1C0200, // 0008 CALL R7 1 + 0x8C1C0F07, // 0009 GETMET R7 R7 K7 + 0x7C1C0200, // 000A CALL R7 1 + 0x8C1C0F08, // 000B GETMET R7 R7 K8 + 0x7C1C0200, // 000C CALL R7 1 + 0x7C100600, // 000D CALL R4 3 + 0x58140009, // 000E LDCONST R5 K9 + 0x7C080600, // 000F CALL R2 3 + 0x80000000, // 0010 RET 0 }) ) ); @@ -1189,6 +1063,33 @@ be_local_closure(Matter_Fabric_set_fabric_device, /* name */ /*******************************************************************/ +/******************************************************************** +** Solidified function: set_ipk_epoch_key +********************************************************************/ +be_local_closure(Matter_Fabric_set_ipk_epoch_key, /* name */ + be_nested_proto( + 2, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 1]) { /* constants */ + /* K0 */ be_nested_str_weak(ipk_epoch_key), + }), + be_str_weak(set_ipk_epoch_key), + &be_const_str_solidified, + ( &(const binstruction[ 2]) { /* code */ + 0x90020001, // 0000 SETMBR R0 K0 R1 + 0x80000000, // 0001 RET 0 + }) + ) +); +/*******************************************************************/ + + /******************************************************************** ** Solidified function: get_ipk_group_key ********************************************************************/ @@ -1246,9 +1147,9 @@ be_local_closure(Matter_Fabric_get_ipk_group_key, /* name */ /******************************************************************** -** Solidified function: fabric_candidate +** Solidified function: hydrate_post ********************************************************************/ -be_local_closure(Matter_Fabric_fabric_candidate, /* name */ +be_local_closure(Matter_Fabric_hydrate_post, /* name */ be_nested_proto( 4, /* nstack */ 1, /* argc */ @@ -1258,25 +1159,34 @@ be_local_closure(Matter_Fabric_fabric_candidate, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[ 4]) { /* constants */ - /* K0 */ be_nested_str_weak(set_expire_in_seconds), - /* K1 */ be_nested_str_weak(assign_fabric_index), - /* K2 */ be_nested_str_weak(_store), - /* K3 */ be_nested_str_weak(add_fabric), + ( &(const bvalue[ 6]) { /* constants */ + /* K0 */ be_nested_str_weak(_counter_group_data_snd_impl), + /* K1 */ be_nested_str_weak(reset), + /* K2 */ be_nested_str_weak(counter_group_data_snd), + /* K3 */ be_nested_str_weak(_counter_group_ctrl_snd_impl), + /* K4 */ be_nested_str_weak(counter_group_ctrl_snd), + /* K5 */ be_nested_str_weak(val), }), - be_str_weak(fabric_candidate), + be_str_weak(hydrate_post), &be_const_str_solidified, - ( &(const binstruction[10]) { /* code */ - 0x8C040100, // 0000 GETMET R1 R0 K0 - 0x540E0077, // 0001 LDINT R3 120 - 0x7C040400, // 0002 CALL R1 2 - 0x8C040101, // 0003 GETMET R1 R0 K1 - 0x7C040200, // 0004 CALL R1 1 - 0x88040102, // 0005 GETMBR R1 R0 K2 - 0x8C040303, // 0006 GETMET R1 R1 K3 - 0x5C0C0000, // 0007 MOVE R3 R0 - 0x7C040400, // 0008 CALL R1 2 - 0x80000000, // 0009 RET 0 + ( &(const binstruction[17]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x8C040301, // 0001 GETMET R1 R1 K1 + 0x880C0102, // 0002 GETMBR R3 R0 K2 + 0x7C040400, // 0003 CALL R1 2 + 0x88040103, // 0004 GETMBR R1 R0 K3 + 0x8C040301, // 0005 GETMET R1 R1 K1 + 0x880C0104, // 0006 GETMBR R3 R0 K4 + 0x7C040400, // 0007 CALL R1 2 + 0x88040100, // 0008 GETMBR R1 R0 K0 + 0x8C040305, // 0009 GETMET R1 R1 K5 + 0x7C040200, // 000A CALL R1 1 + 0x90020401, // 000B SETMBR R0 K2 R1 + 0x88040103, // 000C GETMBR R1 R0 K3 + 0x8C040305, // 000D GETMET R1 R1 K5 + 0x7C040200, // 000E CALL R1 1 + 0x90020801, // 000F SETMBR R0 K4 R1 + 0x80000000, // 0010 RET 0 }) ) ); @@ -1284,11 +1194,11 @@ be_local_closure(Matter_Fabric_fabric_candidate, /* name */ /******************************************************************** -** Solidified function: counter_group_data_snd_next +** Solidified function: get_admin_vendor_name ********************************************************************/ -be_local_closure(Matter_Fabric_counter_group_data_snd_next, /* name */ +be_local_closure(Matter_Fabric_get_admin_vendor_name, /* name */ be_nested_proto( - 9, /* nstack */ + 8, /* nstack */ 1, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -1296,54 +1206,39 @@ be_local_closure(Matter_Fabric_counter_group_data_snd_next, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[15]) { /* constants */ - /* K0 */ be_nested_str_weak(string), - /* K1 */ be_nested_str_weak(_counter_group_data_snd_impl), - /* K2 */ be_nested_str_weak(next), - /* K3 */ be_nested_str_weak(tasmota), - /* K4 */ be_nested_str_weak(log), + ( &(const bvalue[ 7]) { /* constants */ + /* K0 */ be_nested_str_weak(admin_vendor), + /* K1 */ be_nested_str_weak(), + /* K2 */ be_nested_str_weak(matter), + /* K3 */ be_nested_str_weak(get_vendor_name), + /* K4 */ be_nested_str_weak(string), /* K5 */ be_nested_str_weak(format), - /* K6 */ be_nested_str_weak(MTR_X3A_X20_X2E_X20_X20_X20_X20_X20_X20_X20_X20_X20_X20Counter_group_data_snd_X3D_X25i), - /* K7 */ be_const_int(3), - /* K8 */ be_nested_str_weak(matter), - /* K9 */ be_nested_str_weak(Counter), - /* K10 */ be_nested_str_weak(is_greater), - /* K11 */ be_nested_str_weak(counter_group_data_snd), - /* K12 */ be_nested_str_weak(_GROUP_SND_INCR), - /* K13 */ be_nested_str_weak(does_persist), - /* K14 */ be_nested_str_weak(save), + /* K6 */ be_nested_str_weak(0x_X2504X), }), - be_str_weak(counter_group_data_snd_next), + be_str_weak(get_admin_vendor_name), &be_const_str_solidified, - ( &(const binstruction[28]) { /* code */ - 0xA4060000, // 0000 IMPORT R1 K0 - 0x88080101, // 0001 GETMBR R2 R0 K1 - 0x8C080502, // 0002 GETMET R2 R2 K2 - 0x7C080200, // 0003 CALL R2 1 - 0xB80E0600, // 0004 GETNGBL R3 K3 - 0x8C0C0704, // 0005 GETMET R3 R3 K4 - 0x8C140305, // 0006 GETMET R5 R1 K5 - 0x581C0006, // 0007 LDCONST R7 K6 - 0x5C200400, // 0008 MOVE R8 R2 - 0x7C140600, // 0009 CALL R5 3 - 0x58180007, // 000A LDCONST R6 K7 - 0x7C0C0600, // 000B CALL R3 3 - 0xB80E1000, // 000C GETNGBL R3 K8 - 0x880C0709, // 000D GETMBR R3 R3 K9 - 0x8C0C070A, // 000E GETMET R3 R3 K10 - 0x5C140400, // 000F MOVE R5 R2 - 0x8818010B, // 0010 GETMBR R6 R0 K11 - 0x7C0C0600, // 0011 CALL R3 3 - 0x780E0007, // 0012 JMPF R3 #001B - 0x880C010C, // 0013 GETMBR R3 R0 K12 - 0x000C0403, // 0014 ADD R3 R2 R3 - 0x90021603, // 0015 SETMBR R0 K11 R3 - 0x8C0C010D, // 0016 GETMET R3 R0 K13 - 0x7C0C0200, // 0017 CALL R3 1 - 0x780E0001, // 0018 JMPF R3 #001B - 0x8C0C010E, // 0019 GETMET R3 R0 K14 - 0x7C0C0200, // 001A CALL R3 1 - 0x80040400, // 001B RET 1 R2 + ( &(const binstruction[21]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x4C080000, // 0001 LDNIL R2 + 0x1C080202, // 0002 EQ R2 R1 R2 + 0x780A0000, // 0003 JMPF R2 #0005 + 0x80060200, // 0004 RET 1 K1 + 0xB80A0400, // 0005 GETNGBL R2 K2 + 0x8C080503, // 0006 GETMET R2 R2 K3 + 0x5C100200, // 0007 MOVE R4 R1 + 0x7C080400, // 0008 CALL R2 2 + 0x4C0C0000, // 0009 LDNIL R3 + 0x200C0403, // 000A NE R3 R2 R3 + 0x780E0001, // 000B JMPF R3 #000E + 0x80040400, // 000C RET 1 R2 + 0x70020005, // 000D JMP #0014 + 0xA40E0800, // 000E IMPORT R3 K4 + 0x8C100705, // 000F GETMET R4 R3 K5 + 0x58180006, // 0010 LDCONST R6 K6 + 0x5C1C0200, // 0011 MOVE R7 R1 + 0x7C100600, // 0012 CALL R4 3 + 0x80040800, // 0013 RET 1 R4 + 0x80000000, // 0014 RET 0 }) ) ); @@ -1351,9 +1246,36 @@ be_local_closure(Matter_Fabric_counter_group_data_snd_next, /* name */ /******************************************************************** -** Solidified function: get_noc +** Solidified function: set_pk ********************************************************************/ -be_local_closure(Matter_Fabric_get_noc, /* name */ +be_local_closure(Matter_Fabric_set_pk, /* name */ + be_nested_proto( + 2, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 1]) { /* constants */ + /* K0 */ be_nested_str_weak(no_private_key), + }), + be_str_weak(set_pk), + &be_const_str_solidified, + ( &(const binstruction[ 2]) { /* code */ + 0x90020001, // 0000 SETMBR R0 K0 R1 + 0x80000000, // 0001 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: get_icac +********************************************************************/ +be_local_closure(Matter_Fabric_get_icac, /* name */ be_nested_proto( 2, /* nstack */ 1, /* argc */ @@ -1364,9 +1286,9 @@ be_local_closure(Matter_Fabric_get_noc, /* name */ NULL, /* no sub protos */ 1, /* has constants */ ( &(const bvalue[ 1]) { /* constants */ - /* K0 */ be_nested_str_weak(noc), + /* K0 */ be_nested_str_weak(icac), }), - be_str_weak(get_noc), + be_str_weak(get_icac), &be_const_str_solidified, ( &(const binstruction[ 2]) { /* code */ 0x88040100, // 0000 GETMBR R1 R0 K0 @@ -1377,6 +1299,89 @@ be_local_closure(Matter_Fabric_get_noc, /* name */ /*******************************************************************/ +/******************************************************************** +** Solidified function: set_admin_subject_vendor +********************************************************************/ +be_local_closure(Matter_Fabric_set_admin_subject_vendor, /* name */ + be_nested_proto( + 3, /* nstack */ + 3, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 2]) { /* constants */ + /* K0 */ be_nested_str_weak(admin_subject), + /* K1 */ be_nested_str_weak(admin_vendor), + }), + be_str_weak(set_admin_subject_vendor), + &be_const_str_solidified, + ( &(const binstruction[ 3]) { /* code */ + 0x90020001, // 0000 SETMBR R0 K0 R1 + 0x90020202, // 0001 SETMBR R0 K1 R2 + 0x80000000, // 0002 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: log_new_fabric +********************************************************************/ +be_local_closure(Matter_Fabric_log_new_fabric, /* name */ + be_nested_proto( + 10, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[11]) { /* constants */ + /* K0 */ be_nested_str_weak(string), + /* K1 */ be_nested_str_weak(tasmota), + /* K2 */ be_nested_str_weak(log), + /* K3 */ be_nested_str_weak(format), + /* K4 */ be_nested_str_weak(MTR_X3A_X20_X2BFabric_X20_X20_X20_X20fab_X3D_X27_X25s_X27_X20vendorid_X3D_X25s), + /* K5 */ be_nested_str_weak(get_fabric_id), + /* K6 */ be_nested_str_weak(copy), + /* K7 */ be_nested_str_weak(reverse), + /* K8 */ be_nested_str_weak(tohex), + /* K9 */ be_nested_str_weak(get_admin_vendor_name), + /* K10 */ be_const_int(2), + }), + be_str_weak(log_new_fabric), + &be_const_str_solidified, + ( &(const binstruction[19]) { /* code */ + 0xA4060000, // 0000 IMPORT R1 K0 + 0xB80A0200, // 0001 GETNGBL R2 K1 + 0x8C080502, // 0002 GETMET R2 R2 K2 + 0x8C100303, // 0003 GETMET R4 R1 K3 + 0x58180004, // 0004 LDCONST R6 K4 + 0x8C1C0105, // 0005 GETMET R7 R0 K5 + 0x7C1C0200, // 0006 CALL R7 1 + 0x8C1C0F06, // 0007 GETMET R7 R7 K6 + 0x7C1C0200, // 0008 CALL R7 1 + 0x8C1C0F07, // 0009 GETMET R7 R7 K7 + 0x7C1C0200, // 000A CALL R7 1 + 0x8C1C0F08, // 000B GETMET R7 R7 K8 + 0x7C1C0200, // 000C CALL R7 1 + 0x8C200109, // 000D GETMET R8 R0 K9 + 0x7C200200, // 000E CALL R8 1 + 0x7C100800, // 000F CALL R4 4 + 0x5814000A, // 0010 LDCONST R5 K10 + 0x7C080600, // 0011 CALL R2 3 + 0x80000000, // 0012 RET 0 + }) + ) +); +/*******************************************************************/ + + /******************************************************************** ** Solidified function: get_pk ********************************************************************/ @@ -1404,6 +1409,33 @@ be_local_closure(Matter_Fabric_get_pk, /* name */ /*******************************************************************/ +/******************************************************************** +** Solidified function: get_admin_vendor +********************************************************************/ +be_local_closure(Matter_Fabric_get_admin_vendor, /* name */ + be_nested_proto( + 2, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 1]) { /* constants */ + /* K0 */ be_nested_str_weak(admin_vendor), + }), + be_str_weak(get_admin_vendor), + &be_const_str_solidified, + ( &(const binstruction[ 2]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x80040200, // 0001 RET 1 R1 + }) + ) +); +/*******************************************************************/ + + /******************************************************************** ** Solidified function: get_fabric_id ********************************************************************/ @@ -1432,9 +1464,36 @@ be_local_closure(Matter_Fabric_get_fabric_id, /* name */ /******************************************************************** -** Solidified function: get_icac +** Solidified function: set_ca ********************************************************************/ -be_local_closure(Matter_Fabric_get_icac, /* name */ +be_local_closure(Matter_Fabric_set_ca, /* name */ + be_nested_proto( + 2, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 1]) { /* constants */ + /* K0 */ be_nested_str_weak(root_ca_certificate), + }), + be_str_weak(set_ca), + &be_const_str_solidified, + ( &(const binstruction[ 2]) { /* code */ + 0x90020001, // 0000 SETMBR R0 K0 R1 + 0x80000000, // 0001 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: get_noc +********************************************************************/ +be_local_closure(Matter_Fabric_get_noc, /* name */ be_nested_proto( 2, /* nstack */ 1, /* argc */ @@ -1445,9 +1504,9 @@ be_local_closure(Matter_Fabric_get_icac, /* name */ NULL, /* no sub protos */ 1, /* has constants */ ( &(const bvalue[ 1]) { /* constants */ - /* K0 */ be_nested_str_weak(icac), + /* K0 */ be_nested_str_weak(noc), }), - be_str_weak(get_icac), + be_str_weak(get_noc), &be_const_str_solidified, ( &(const binstruction[ 2]) { /* code */ 0x88040100, // 0000 GETMBR R1 R0 K0 @@ -1459,117 +1518,111 @@ be_local_closure(Matter_Fabric_get_icac, /* name */ /******************************************************************** -** Solidified function: fromjson +** Solidified function: get_fabric_index ********************************************************************/ -be_local_closure(Matter_Fabric_fromjson, /* name */ +be_local_closure(Matter_Fabric_get_fabric_index, /* name */ be_nested_proto( - 16, /* nstack */ - 2, /* argc */ - 4, /* varg */ + 2, /* nstack */ + 1, /* argc */ + 2, /* varg */ 0, /* has upvals */ NULL, /* no upvals */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[18]) { /* constants */ - /* K0 */ be_const_class(be_class_Matter_Fabric), - /* K1 */ be_nested_str_weak(string), - /* K2 */ be_nested_str_weak(introspect), - /* K3 */ be_nested_str_weak(matter), - /* K4 */ be_nested_str_weak(Fabric), - /* K5 */ be_nested_str_weak(keys), - /* K6 */ be_const_int(0), - /* K7 */ be_nested_str_weak(_), - /* K8 */ be_nested_str_weak(find), - /* K9 */ be_nested_str_weak(0x), - /* K10 */ be_nested_str_weak(set), - /* K11 */ be_nested_str_weak(fromhex), - /* K12 */ be_const_int(2), - /* K13 */ be_const_int(2147483647), - /* K14 */ be_nested_str_weak(_X24_X24), - /* K15 */ be_nested_str_weak(fromb64), - /* K16 */ be_nested_str_weak(stop_iteration), - /* K17 */ be_nested_str_weak(hydrate_post), + ( &(const bvalue[ 1]) { /* constants */ + /* K0 */ be_nested_str_weak(fabric_index), }), - be_str_weak(fromjson), + be_str_weak(get_fabric_index), &be_const_str_solidified, - ( &(const binstruction[76]) { /* code */ - 0x58080000, // 0000 LDCONST R2 K0 - 0xA40E0200, // 0001 IMPORT R3 K1 - 0xA4120400, // 0002 IMPORT R4 K2 - 0xB8160600, // 0003 GETNGBL R5 K3 - 0x8C140B04, // 0004 GETMET R5 R5 K4 - 0x5C1C0000, // 0005 MOVE R7 R0 - 0x7C140400, // 0006 CALL R5 2 - 0x60180010, // 0007 GETGBL R6 G16 - 0x8C1C0305, // 0008 GETMET R7 R1 K5 - 0x7C1C0200, // 0009 CALL R7 1 - 0x7C180200, // 000A CALL R6 1 - 0xA8020039, // 000B EXBLK 0 #0046 - 0x5C1C0C00, // 000C MOVE R7 R6 - 0x7C1C0000, // 000D CALL R7 0 - 0x94200F06, // 000E GETIDX R8 R7 K6 - 0x1C201107, // 000F EQ R8 R8 K7 - 0x78220000, // 0010 JMPF R8 #0012 - 0x7001FFF9, // 0011 JMP #000C - 0x94200207, // 0012 GETIDX R8 R1 R7 - 0x60240004, // 0013 GETGBL R9 G4 - 0x5C281000, // 0014 MOVE R10 R8 - 0x7C240200, // 0015 CALL R9 1 - 0x1C241301, // 0016 EQ R9 R9 K1 - 0x78260027, // 0017 JMPF R9 #0040 - 0x8C240708, // 0018 GETMET R9 R3 K8 - 0x5C2C1000, // 0019 MOVE R11 R8 - 0x58300009, // 001A LDCONST R12 K9 - 0x7C240600, // 001B CALL R9 3 - 0x1C241306, // 001C EQ R9 R9 K6 - 0x7826000A, // 001D JMPF R9 #0029 - 0x8C24090A, // 001E GETMET R9 R4 K10 - 0x5C2C0A00, // 001F MOVE R11 R5 - 0x5C300E00, // 0020 MOVE R12 R7 - 0x60340015, // 0021 GETGBL R13 G21 - 0x7C340000, // 0022 CALL R13 0 - 0x8C341B0B, // 0023 GETMET R13 R13 K11 - 0x403E190D, // 0024 CONNECT R15 K12 K13 - 0x943C100F, // 0025 GETIDX R15 R8 R15 - 0x7C340400, // 0026 CALL R13 2 - 0x7C240800, // 0027 CALL R9 4 - 0x70020015, // 0028 JMP #003F - 0x8C240708, // 0029 GETMET R9 R3 K8 - 0x5C2C1000, // 002A MOVE R11 R8 - 0x5830000E, // 002B LDCONST R12 K14 - 0x7C240600, // 002C CALL R9 3 - 0x1C241306, // 002D EQ R9 R9 K6 - 0x7826000A, // 002E JMPF R9 #003A - 0x8C24090A, // 002F GETMET R9 R4 K10 - 0x5C2C0A00, // 0030 MOVE R11 R5 - 0x5C300E00, // 0031 MOVE R12 R7 - 0x60340015, // 0032 GETGBL R13 G21 - 0x7C340000, // 0033 CALL R13 0 - 0x8C341B0F, // 0034 GETMET R13 R13 K15 - 0x403E190D, // 0035 CONNECT R15 K12 K13 - 0x943C100F, // 0036 GETIDX R15 R8 R15 - 0x7C340400, // 0037 CALL R13 2 - 0x7C240800, // 0038 CALL R9 4 - 0x70020004, // 0039 JMP #003F - 0x8C24090A, // 003A GETMET R9 R4 K10 - 0x5C2C0A00, // 003B MOVE R11 R5 - 0x5C300E00, // 003C MOVE R12 R7 - 0x5C341000, // 003D MOVE R13 R8 - 0x7C240800, // 003E CALL R9 4 - 0x70020004, // 003F JMP #0045 - 0x8C24090A, // 0040 GETMET R9 R4 K10 - 0x5C2C0A00, // 0041 MOVE R11 R5 - 0x5C300E00, // 0042 MOVE R12 R7 - 0x5C341000, // 0043 MOVE R13 R8 - 0x7C240800, // 0044 CALL R9 4 - 0x7001FFC5, // 0045 JMP #000C - 0x58180010, // 0046 LDCONST R6 K16 - 0xAC180200, // 0047 CATCH R6 1 0 - 0xB0080000, // 0048 RAISE 2 R0 R0 - 0x8C180B11, // 0049 GETMET R6 R5 K17 - 0x7C180200, // 004A CALL R6 1 - 0x80040A00, // 004B RET 1 R5 + ( &(const binstruction[ 2]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x80040200, // 0001 RET 1 R1 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: get_ca +********************************************************************/ +be_local_closure(Matter_Fabric_get_ca, /* name */ + be_nested_proto( + 2, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 1]) { /* constants */ + /* K0 */ be_nested_str_weak(root_ca_certificate), + }), + be_str_weak(get_ca), + &be_const_str_solidified, + ( &(const binstruction[ 2]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x80040200, // 0001 RET 1 R1 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: get_old_recent_session +********************************************************************/ +be_local_closure(Matter_Fabric_get_old_recent_session, /* name */ + be_nested_proto( + 7, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 4]) { /* constants */ + /* K0 */ be_nested_str_weak(_sessions), + /* K1 */ be_const_int(0), + /* K2 */ be_nested_str_weak(last_used), + /* K3 */ be_const_int(1), + }), + be_str_weak(get_old_recent_session), + &be_const_str_solidified, + ( &(const binstruction[30]) { /* code */ + 0x6008000C, // 0000 GETGBL R2 G12 + 0x880C0100, // 0001 GETMBR R3 R0 K0 + 0x7C080200, // 0002 CALL R2 1 + 0x1C080501, // 0003 EQ R2 R2 K1 + 0x780A0001, // 0004 JMPF R2 #0007 + 0x4C080000, // 0005 LDNIL R2 + 0x80040400, // 0006 RET 1 R2 + 0x88080100, // 0007 GETMBR R2 R0 K0 + 0x94080501, // 0008 GETIDX R2 R2 K1 + 0x880C0502, // 0009 GETMBR R3 R2 K2 + 0x58100003, // 000A LDCONST R4 K3 + 0x6014000C, // 000B GETGBL R5 G12 + 0x88180100, // 000C GETMBR R6 R0 K0 + 0x7C140200, // 000D CALL R5 1 + 0x14140805, // 000E LT R5 R4 R5 + 0x7816000C, // 000F JMPF R5 #001D + 0x88140100, // 0010 GETMBR R5 R0 K0 + 0x94140A04, // 0011 GETIDX R5 R5 R4 + 0x88140B02, // 0012 GETMBR R5 R5 K2 + 0x78060001, // 0013 JMPF R1 #0016 + 0x14180A03, // 0014 LT R6 R5 R3 + 0x70020000, // 0015 JMP #0017 + 0x24180A03, // 0016 GT R6 R5 R3 + 0x781A0002, // 0017 JMPF R6 #001B + 0x88180100, // 0018 GETMBR R6 R0 K0 + 0x94080C04, // 0019 GETIDX R2 R6 R4 + 0x5C0C0A00, // 001A MOVE R3 R5 + 0x00100903, // 001B ADD R4 R4 K3 + 0x7001FFED, // 001C JMP #000B + 0x80040400, // 001D RET 1 R2 }) ) ); @@ -1583,67 +1636,68 @@ extern const bclass be_class_Matter_Expirable; be_local_class(Matter_Fabric, 20, &be_class_Matter_Expirable, - be_nested_map(59, + be_nested_map(60, ( (struct bmapnode*) &(const bmapnode[]) { - { be_const_key_weak(icac, -1), be_const_var(8) }, - { be_const_key_weak(hydrate_post, -1), be_const_closure(Matter_Fabric_hydrate_post_closure) }, - { be_const_key_weak(set_ca, 32), be_const_closure(Matter_Fabric_set_ca_closure) }, - { be_const_key_weak(fabric_completed, 4), be_const_closure(Matter_Fabric_fabric_completed_closure) }, - { be_const_key_weak(_counter_group_data_snd_impl, 26), be_const_var(16) }, - { be_const_key_weak(get_oldest_session, -1), be_const_closure(Matter_Fabric_get_oldest_session_closure) }, - { be_const_key_weak(get_ca_pub, -1), be_const_closure(Matter_Fabric_get_ca_pub_closure) }, - { be_const_key_weak(before_remove, -1), be_const_closure(Matter_Fabric_before_remove_closure) }, - { be_const_key_weak(get_ca, -1), be_const_closure(Matter_Fabric_get_ca_closure) }, { be_const_key_weak(fabric_index, -1), be_const_var(2) }, - { be_const_key_weak(fabric_compressed, -1), be_const_var(11) }, - { be_const_key_weak(log_new_fabric, -1), be_const_closure(Matter_Fabric_log_new_fabric_closure) }, - { be_const_key_weak(noc, -1), be_const_var(7) }, - { be_const_key_weak(set_fabric_index, -1), be_const_closure(Matter_Fabric_set_fabric_index_closure) }, - { be_const_key_weak(_MAX_CASE, -1), be_const_int(5) }, - { be_const_key_weak(_store, -1), be_const_var(0) }, - { be_const_key_weak(get_ipk_epoch_key, -1), be_const_closure(Matter_Fabric_get_ipk_epoch_key_closure) }, - { be_const_key_weak(root_ca_certificate, -1), be_const_var(6) }, - { be_const_key_weak(set_pk, -1), be_const_closure(Matter_Fabric_set_pk_closure) }, - { be_const_key_weak(tojson, -1), be_const_closure(Matter_Fabric_tojson_closure) }, - { be_const_key_weak(assign_fabric_index, 57), be_const_closure(Matter_Fabric_assign_fabric_index_closure) }, - { be_const_key_weak(set_noc_icac, -1), be_const_closure(Matter_Fabric_set_noc_icac_closure) }, - { be_const_key_weak(get_icac, -1), be_const_closure(Matter_Fabric_get_icac_closure) }, - { be_const_key_weak(counter_group_ctrl_snd_next, 22), be_const_closure(Matter_Fabric_counter_group_ctrl_snd_next_closure) }, - { be_const_key_weak(get_admin_vendor, -1), be_const_closure(Matter_Fabric_get_admin_vendor_closure) }, - { be_const_key_weak(counter_group_data_snd, -1), be_const_var(14) }, - { be_const_key_weak(get_newest_session, 0), be_const_closure(Matter_Fabric_get_newest_session_closure) }, - { be_const_key_weak(set_admin_subject_vendor, -1), be_const_closure(Matter_Fabric_set_admin_subject_vendor_closure) }, - { be_const_key_weak(device_id, -1), be_const_var(12) }, - { be_const_key_weak(get_fabric_compressed, 19), be_const_closure(Matter_Fabric_get_fabric_compressed_closure) }, - { be_const_key_weak(get_pk, 17), be_const_closure(Matter_Fabric_get_pk_closure) }, - { be_const_key_weak(init, 30), be_const_closure(Matter_Fabric_init_closure) }, - { be_const_key_weak(get_noc, -1), be_const_closure(Matter_Fabric_get_noc_closure) }, - { be_const_key_weak(set_ipk_epoch_key, 21), be_const_closure(Matter_Fabric_set_ipk_epoch_key_closure) }, - { be_const_key_weak(get_old_recent_session, 47), be_const_closure(Matter_Fabric_get_old_recent_session_closure) }, - { be_const_key_weak(fabric_parent, -1), be_const_var(3) }, - { be_const_key_weak(admin_vendor, -1), be_const_var(19) }, - { be_const_key_weak(counter_group_data_snd_next, 42), be_const_closure(Matter_Fabric_counter_group_data_snd_next_closure) }, - { be_const_key_weak(get_fabric_index, -1), be_const_closure(Matter_Fabric_get_fabric_index_closure) }, - { be_const_key_weak(set_fabric_device, -1), be_const_closure(Matter_Fabric_set_fabric_device_closure) }, - { be_const_key_weak(get_fabric_label, 46), be_const_closure(Matter_Fabric_get_fabric_label_closure) }, - { be_const_key_weak(get_device_id, 36), be_const_closure(Matter_Fabric_get_device_id_closure) }, - { be_const_key_weak(_sessions, -1), be_const_var(4) }, - { be_const_key_weak(fabric_candidate, -1), be_const_closure(Matter_Fabric_fabric_candidate_closure) }, - { be_const_key_weak(_GROUP_SND_INCR, 37), be_const_int(32) }, - { be_const_key_weak(_GROUP_KEY, -1), be_nested_str_weak(GroupKey_X20v1_X2E0) }, - { be_const_key_weak(get_ipk_group_key, -1), be_const_closure(Matter_Fabric_get_ipk_group_key_closure) }, - { be_const_key_weak(ipk_epoch_key, 51), be_const_var(9) }, - { be_const_key_weak(get_admin_subject, 28), be_const_closure(Matter_Fabric_get_admin_subject_closure) }, - { be_const_key_weak(get_fabric_id, -1), be_const_closure(Matter_Fabric_get_fabric_id_closure) }, - { be_const_key_weak(no_private_key, 25), be_const_var(5) }, - { be_const_key_weak(counter_group_ctrl_snd, 5), be_const_var(15) }, - { be_const_key_weak(fabric_id, -1), be_const_var(10) }, - { be_const_key_weak(_counter_group_ctrl_snd_impl, -1), be_const_var(17) }, { be_const_key_weak(fromjson, -1), be_const_static_closure(Matter_Fabric_fromjson_closure) }, - { be_const_key_weak(add_session, 14), be_const_closure(Matter_Fabric_add_session_closure) }, + { be_const_key_weak(root_ca_certificate, -1), be_const_var(6) }, + { be_const_key_weak(ipk_epoch_key, -1), be_const_var(9) }, + { be_const_key_weak(get_ca, 34), be_const_closure(Matter_Fabric_get_ca_closure) }, + { be_const_key_weak(noc, -1), be_const_var(7) }, + { be_const_key_weak(get_device_id, -1), be_const_closure(Matter_Fabric_get_device_id_closure) }, + { be_const_key_weak(add_session, -1), be_const_closure(Matter_Fabric_add_session_closure) }, + { be_const_key_weak(get_oldest_session, 50), be_const_closure(Matter_Fabric_get_oldest_session_closure) }, + { be_const_key_weak(fabric_parent, -1), be_const_var(3) }, + { be_const_key_weak(no_private_key, -1), be_const_var(5) }, + { be_const_key_weak(admin_vendor, 1), be_const_var(19) }, + { be_const_key_weak(fabric_id, -1), be_const_var(10) }, + { be_const_key_weak(device_id, -1), be_const_var(12) }, + { be_const_key_weak(set_fabric_index, -1), be_const_closure(Matter_Fabric_set_fabric_index_closure) }, + { be_const_key_weak(init, -1), be_const_closure(Matter_Fabric_init_closure) }, + { be_const_key_weak(counter_group_ctrl_snd, -1), be_const_var(15) }, { be_const_key_weak(fabric_label, -1), be_const_var(13) }, + { be_const_key_weak(fabric_completed, -1), be_const_closure(Matter_Fabric_fabric_completed_closure) }, { be_const_key_weak(created, -1), be_const_var(1) }, - { be_const_key_weak(admin_subject, -1), be_const_var(18) }, + { be_const_key_weak(fabric_compressed, -1), be_const_var(11) }, + { be_const_key_weak(icac, -1), be_const_var(8) }, + { be_const_key_weak(_counter_group_data_snd_impl, 2), be_const_var(16) }, + { be_const_key_weak(_store, 57), be_const_var(0) }, + { be_const_key_weak(get_ca_pub, 32), be_const_closure(Matter_Fabric_get_ca_pub_closure) }, + { be_const_key_weak(_GROUP_KEY, 16), be_nested_str_weak(GroupKey_X20v1_X2E0) }, + { be_const_key_weak(tojson, -1), be_const_closure(Matter_Fabric_tojson_closure) }, + { be_const_key_weak(assign_fabric_index, -1), be_const_closure(Matter_Fabric_assign_fabric_index_closure) }, + { be_const_key_weak(get_admin_subject, -1), be_const_closure(Matter_Fabric_get_admin_subject_closure) }, + { be_const_key_weak(_MAX_CASE, -1), be_const_int(5) }, + { be_const_key_weak(fabric_candidate, -1), be_const_closure(Matter_Fabric_fabric_candidate_closure) }, + { be_const_key_weak(_GROUP_SND_INCR, 36), be_const_int(32) }, + { be_const_key_weak(get_fabric_label, 55), be_const_closure(Matter_Fabric_get_fabric_label_closure) }, + { be_const_key_weak(set_noc_icac, -1), be_const_closure(Matter_Fabric_set_noc_icac_closure) }, + { be_const_key_weak(get_noc, 52), be_const_closure(Matter_Fabric_get_noc_closure) }, + { be_const_key_weak(before_remove, -1), be_const_closure(Matter_Fabric_before_remove_closure) }, + { be_const_key_weak(get_admin_vendor_name, -1), be_const_closure(Matter_Fabric_get_admin_vendor_name_closure) }, + { be_const_key_weak(set_ca, -1), be_const_closure(Matter_Fabric_set_ca_closure) }, + { be_const_key_weak(get_ipk_group_key, -1), be_const_closure(Matter_Fabric_get_ipk_group_key_closure) }, + { be_const_key_weak(hydrate_post, -1), be_const_closure(Matter_Fabric_hydrate_post_closure) }, + { be_const_key_weak(set_ipk_epoch_key, 31), be_const_closure(Matter_Fabric_set_ipk_epoch_key_closure) }, + { be_const_key_weak(set_pk, -1), be_const_closure(Matter_Fabric_set_pk_closure) }, + { be_const_key_weak(set_admin_subject_vendor, -1), be_const_closure(Matter_Fabric_set_admin_subject_vendor_closure) }, + { be_const_key_weak(get_fabric_compressed, 42), be_const_closure(Matter_Fabric_get_fabric_compressed_closure) }, + { be_const_key_weak(log_new_fabric, -1), be_const_closure(Matter_Fabric_log_new_fabric_closure) }, + { be_const_key_weak(get_pk, -1), be_const_closure(Matter_Fabric_get_pk_closure) }, + { be_const_key_weak(get_admin_vendor, -1), be_const_closure(Matter_Fabric_get_admin_vendor_closure) }, + { be_const_key_weak(get_fabric_id, -1), be_const_closure(Matter_Fabric_get_fabric_id_closure) }, + { be_const_key_weak(get_icac, 37), be_const_closure(Matter_Fabric_get_icac_closure) }, + { be_const_key_weak(_counter_group_ctrl_snd_impl, -1), be_const_var(17) }, + { be_const_key_weak(set_fabric_device, -1), be_const_closure(Matter_Fabric_set_fabric_device_closure) }, + { be_const_key_weak(admin_subject, 5), be_const_var(18) }, + { be_const_key_weak(counter_group_data_snd, -1), be_const_var(14) }, + { be_const_key_weak(get_newest_session, 29), be_const_closure(Matter_Fabric_get_newest_session_closure) }, + { be_const_key_weak(get_fabric_index, -1), be_const_closure(Matter_Fabric_get_fabric_index_closure) }, + { be_const_key_weak(get_ipk_epoch_key, -1), be_const_closure(Matter_Fabric_get_ipk_epoch_key_closure) }, + { be_const_key_weak(counter_group_data_snd_next, 4), be_const_closure(Matter_Fabric_counter_group_data_snd_next_closure) }, + { be_const_key_weak(counter_group_ctrl_snd_next, -1), be_const_closure(Matter_Fabric_counter_group_ctrl_snd_next_closure) }, + { be_const_key_weak(get_old_recent_session, -1), be_const_closure(Matter_Fabric_get_old_recent_session_closure) }, + { be_const_key_weak(_sessions, 0), be_const_var(4) }, })), be_str_weak(Matter_Fabric) ); diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_UI.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_UI.h index 8fc759a45..37d664f8c 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_UI.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_UI.h @@ -1505,9 +1505,9 @@ be_local_closure(Matter_UI_show_fabric_info, /* name */ /* K13 */ be_nested_str_weak(_X3CNo_X20label_X3E), /* K14 */ be_nested_str_weak(html_escape), /* K15 */ be_nested_str_weak(format), - /* K16 */ be_nested_str_weak(_X3Cfieldset_X3E_X3Clegend_X3E_X3Cb_X3E_X26nbsp_X3B_X23_X25i_X20_X25s_X3C_X2Fb_X3E_X20_X280x_X2504X_X29_X26nbsp_X3B_X3C_X2Flegend_X3E_X3Cp_X3E_X3C_X2Fp_X3E), + /* K16 */ be_nested_str_weak(_X3Cfieldset_X3E_X3Clegend_X3E_X3Cb_X3E_X26nbsp_X3B_X23_X25i_X20_X25s_X3C_X2Fb_X3E_X20_X28_X25s_X29_X26nbsp_X3B_X3C_X2Flegend_X3E_X3Cp_X3E_X3C_X2Fp_X3E), /* K17 */ be_nested_str_weak(get_fabric_index), - /* K18 */ be_nested_str_weak(get_admin_vendor), + /* K18 */ be_nested_str_weak(get_admin_vendor_name), /* K19 */ be_nested_str_weak(get_fabric_id), /* K20 */ be_nested_str_weak(copy), /* K21 */ be_nested_str_weak(reverse), diff --git a/lib/libesp32/berry_matter/tools/vendor_to_c.be b/lib/libesp32/berry_matter/tools/vendor_to_c.be new file mode 100644 index 000000000..bff47fb42 --- /dev/null +++ b/lib/libesp32/berry_matter/tools/vendor_to_c.be @@ -0,0 +1,91 @@ + +import json +import string + +var f = open("vendors.json") +var j = json.load(f.read()) +f.close() + +for elt: j["vendorInfo"] + + print(string.format(' { 0x%04X, "%s"},', elt['vendorID'], elt['vendorName'])) + +end + +#- + + { 0x100B, "Signify"}, + { 0x101D, "Assa Abloy"}, + { 0x1021, "Legrand Group"}, + { 0x1037, "NXP Semiconductors"}, + { 0x105E, "Schneider"}, + { 0x109B, "Leviton"}, + { 0x10D0, "Qorvo"}, + { 0x10EE, "UEI"}, + { 0x10F2, "ubisys"}, + { 0x111D, "Comcast Communications"}, + { 0x115A, "Nanoleaf"}, + { 0x115F, "Aqara"}, + { 0x1160, "Sengled"}, + { 0x1168, "Leedarson"}, + { 0x117E, "Feibit"}, + { 0x1188, "TP-Link"}, + { 0x118C, "Midea Group"}, + { 0x120B, "HEIMAN"}, + { 0x1217, "Amazon Alexa"}, + { 0x1219, "ORVIBO"}, + { 0x125D, "Tuya"}, + { 0x127F, "Nordic Semiconductor ASA"}, + { 0x1280, "Siterwell"}, + { 0x1286, "CoolKit"}, + { 0x128F, "EGLO"}, + { 0x130A, "Eve"}, + { 0x130D, "BouffaloLab"}, + { 0x1312, "Yeelight"}, + { 0x131B, "Espressif Systems"}, + { 0x131E, "CAME S.p.A."}, + { 0x131F, "Longan.link"}, + { 0x1321, "SONOFF"}, + { 0x1333, "Becker Antriebe"}, + { 0x1339, "GE Lighting, a Savant company"}, + { 0x133F, "ASR"}, + { 0x1342, "Beken Corporation"}, + { 0x1344, "Eltako"}, + { 0x1345, "Meross"}, + { 0x1346, "Rafael"}, + { 0x1349, "Apple Home"}, + { 0x134E, "tado"}, + { 0x134F, "mediola"}, + { 0x1351, "HooRii Technology"}, + { 0x135D, "Nuki"}, + { 0x1362, "deveritec GmbH"}, + { 0x1365, "Dooya"}, + { 0x136E, "Ambi Labs Limited"}, + { 0x1371, "Tridonic"}, + { 0x1372, "innovation matters"}, + { 0x137F, "NEO"}, + { 0x1381, "Amazon Prime Video"}, + { 0x1384, "Apple Keychain"}, + { 0x1386, "Skylux"}, + { 0x1387, "Qianyan"}, + { 0x138A, "Nature"}, + { 0x1391, "Kasa"}, + { 0x1392, "Tapo"}, + { 0x1397, "SwitchBot"}, + { 0x139C, "Zemismart Technology Limited"}, + { 0x1400, "Uascent"}, + { 0x1403, "Arlec Australia"}, + { 0x1404, "Phaten"}, + { 0x1407, "ThirdReality"}, + { 0x1410, "Quectel"}, + { 0x1413, "1Home"}, + { 0x1415, "Caveman"}, + { 0x1419, "Lorex"}, + { 0x141B, "Rang Dong VN"}, + { 0x141E, "TUO Accessories LLC"}, + { 0x141F, "Ductech"}, + { 0x142D, "QH"}, + { 0x142F, "QIACHIP"}, + { 0x6006, "Google LLC"}, + +-# diff --git a/lib/libesp32/berry_matter/tools/vendors.json b/lib/libesp32/berry_matter/tools/vendors.json new file mode 100644 index 000000000..4a47f884e --- /dev/null +++ b/lib/libesp32/berry_matter/tools/vendors.json @@ -0,0 +1,592 @@ +{ + "vendorInfo": [ + { + "vendorID": 4107, + "vendorName": "Signify", + "companyLegalName": "Signify Netherlands B.V.", + "companyPreferredName": "Signify", + "vendorLandingPageURL": "https://www.signify.com/", + "creator": "cosmos1xx8fg5nu4lesn448ytds8yjql47jp8gnfh6hck" + }, + { + "vendorID": 4125, + "vendorName": "Assa Abloy", + "companyLegalName": "Assa Abloy", + "companyPreferredName": "", + "vendorLandingPageURL": "http://www.yalehome.com", + "creator": "cosmos18wrgwrrccn49ejv4hstz9czxgw9dc2s2l9f94k" + }, + { + "vendorID": 4129, + "vendorName": "Legrand Group", + "companyLegalName": "Legrand", + "companyPreferredName": "", + "vendorLandingPageURL": "https://www.legrand.com", + "creator": "cosmos1elm6sf9yd2n7y0l0rve4zru0ukanv76vtrjnt3" + }, + { + "vendorID": 4151, + "vendorName": "NXP Semiconductors", + "companyLegalName": "NXP Semiconductors N.V.", + "companyPreferredName": "", + "vendorLandingPageURL": "https://www.nxp.com", + "creator": "cosmos1ck0arz4kky9l9qtdvqrct7783ffv2yftgmj9ch" + }, + { + "vendorID": 4190, + "vendorName": "Schneider", + "companyLegalName": "Schneider Electric", + "companyPreferredName": "Schneider Electric", + "vendorLandingPageURL": "", + "creator": "cosmos14kre58wpgterp7t9yy0393ecel9hpz9fnul6pc" + }, + { + "vendorID": 4251, + "vendorName": "Leviton", + "companyLegalName": "Leviton Manufacturing Company", + "companyPreferredName": "", + "vendorLandingPageURL": "https://www.leviton.com", + "creator": "cosmos1ypyp8zrqeu64rjmx3u34ghvl64uajr67uams3d" + }, + { + "vendorID": 4304, + "vendorName": "Qorvo", + "companyLegalName": "Qorvo, Inc.", + "companyPreferredName": "", + "vendorLandingPageURL": "https://www.qorvo.com/", + "creator": "cosmos1qrpkuzgm7hfejejfyg20g34tjxlt4k8dsspq52" + }, + { + "vendorID": 4334, + "vendorName": "UEI", + "companyLegalName": "Universal Electronics Inc", + "companyPreferredName": "", + "vendorLandingPageURL": "https://www.uei.com/", + "creator": "cosmos1pvrad6x6ettwgudttqd97r9wvarvnj5davpltg" + }, + { + "vendorID": 4338, + "vendorName": "ubisys", + "companyLegalName": "ubisys technologies GmbH", + "companyPreferredName": "", + "vendorLandingPageURL": "https://www.ubisys.de", + "creator": "cosmos1rxydw26p5k4f9rtwln6r3srvw4qq9pxnxadr3d" + }, + { + "vendorID": 4381, + "vendorName": "Comcast Communications", + "companyLegalName": "Comcast", + "companyPreferredName": "", + "vendorLandingPageURL": "", + "creator": "cosmos1xcv4q8sjvf7nw4qj2yt5kledgwyf3ycxw8c0pe" + }, + { + "vendorID": 4442, + "vendorName": "Nanoleaf", + "companyLegalName": "Nanoleaf Ltd.", + "companyPreferredName": "", + "vendorLandingPageURL": "https://nanoleaf.me", + "creator": "cosmos1sggrrmw05e6alve8umwdaszade5qxyt53kthud" + }, + { + "vendorID": 4447, + "vendorName": "Aqara", + "companyLegalName": "Lumi United Technology Co., Ltd.", + "companyPreferredName": "", + "vendorLandingPageURL": "https://www.aqara.com/", + "creator": "cosmos1qpz3ghnqj6my7gzegkftzav9hpxymkx6zdk73v" + }, + { + "vendorID": 4448, + "vendorName": "Sengled", + "companyLegalName": "Sengled Co., Ltd.", + "companyPreferredName": "", + "vendorLandingPageURL": "", + "creator": "cosmos1arhkv0n34xylxz9suy73dpyk6de32gpym9l3sw" + }, + { + "vendorID": 4456, + "vendorName": "Leedarson", + "companyLegalName": "Leedarson IoT Technology Inc.", + "companyPreferredName": "", + "vendorLandingPageURL": "", + "creator": "cosmos1mzg0v94yg0cmkjqe2jqsys44tvvfk9mt2d889d" + }, + { + "vendorID": 4478, + "vendorName": "Feibit", + "companyLegalName": "Shenzhen Feibit Electronic Technology Co.,Ltd", + "companyPreferredName": "Feibit", + "vendorLandingPageURL": "http://www.feibit.com", + "creator": "cosmos162y3ehrqpuu2xjvmgq6qq7yqtdh6mlwh32wv2h" + }, + { + "vendorID": 4488, + "vendorName": "TP-Link", + "companyLegalName": "TP-Link Corporation Limited", + "companyPreferredName": "", + "vendorLandingPageURL": "https://www.tp-link.com", + "creator": "cosmos1jxpj6rr8vnetz9a2ec08az5fwqpuf4zt4hhygv" + }, + { + "vendorID": 4492, + "vendorName": "Midea Group", + "companyLegalName": "Midea Group", + "companyPreferredName": "Midea", + "vendorLandingPageURL": "", + "creator": "cosmos1a7c8us8jl76f8uue6xf9gzzqklfmfdyh8nedae" + }, + { + "vendorID": 4619, + "vendorName": "HEIMAN", + "companyLegalName": "Shenzhen Heiman Technology Co., Ltd.", + "companyPreferredName": "", + "vendorLandingPageURL": "", + "creator": "cosmos16s4lqhxyqdr5lq6gmfpskjtwjf7dwc0lktn6dt" + }, + { + "vendorID": 4631, + "vendorName": "Amazon Alexa", + "companyLegalName": "Amazon.com, Inc.", + "companyPreferredName": "Amazon Alexa", + "vendorLandingPageURL": "https://www.amazon.com", + "creator": "cosmos152v4ejapsjl222zew0ll4eeltc0h2phh5hzpu3" + }, + { + "vendorID": 4633, + "vendorName": "ORVIBO", + "companyLegalName": "Shenzhen ORVIBO Technology Co., Ltd.", + "companyPreferredName": "", + "vendorLandingPageURL": "https://www.orvibo.com", + "creator": "cosmos1u7um30yf68zugm897tgpq7s6vhkhk4t2ykm0hq" + }, + { + "vendorID": 4701, + "vendorName": "Tuya", + "companyLegalName": "Tuya Global Inc.", + "companyPreferredName": "", + "vendorLandingPageURL": "", + "creator": "cosmos13pwvzq2zk0r3fxuc2a5jhadnx6tda5ar2tcpp9" + }, + { + "vendorID": 4735, + "vendorName": "Nordic Semiconductor ASA", + "companyLegalName": "Nordic Semiconductor ASA", + "companyPreferredName": "", + "vendorLandingPageURL": "https://www.nordicsemi.com", + "creator": "cosmos1eatgwsxtjz0tlchllzasjfcac6m56n30njc3k2" + }, + { + "vendorID": 4736, + "vendorName": "Siterwell", + "companyLegalName": "Siterwell Electronics Co., Limited", + "companyPreferredName": "", + "vendorLandingPageURL": "", + "creator": "cosmos1u3uhlkepx9dz9asrlucuupw2md2frvkwv583nr" + }, + { + "vendorID": 4742, + "vendorName": "CoolKit", + "companyLegalName": "SHENZHEN Coolkit Technology CO.,LTD.", + "companyPreferredName": "CoolKit", + "vendorLandingPageURL": "https://www.coolkit.cn/", + "creator": "cosmos18m8lehnvqx8zytn22fkekelt7xgmrl7cga37tl" + }, + { + "vendorID": 4751, + "vendorName": "EGLO", + "companyLegalName": "EGLO Leuchten GmbH", + "companyPreferredName": "", + "vendorLandingPageURL": "https://www.eglo.com/en/", + "creator": "cosmos1veu2f7mtgvfw8ezjfmhs64cqyt9wp2weas2rga" + }, + { + "vendorID": 4874, + "vendorName": "Eve", + "companyLegalName": "Eve Systems GmbH", + "companyPreferredName": "", + "vendorLandingPageURL": "https://www.evehome.com", + "creator": "cosmos1yh0ld8jl26rgycrtank8slxepmc8xzgyrzv99t" + }, + { + "vendorID": 4877, + "vendorName": "BouffaloLab", + "companyLegalName": "Bouffalo Lab (Nanjing) Co., Ltd.", + "companyPreferredName": "Bouffalo Lab ", + "vendorLandingPageURL": "https://www.bouffalolab.com/", + "creator": "cosmos1l8qwcjgfcnvlmtxrlcjrsmy9068mlck2cw68kx" + }, + { + "vendorID": 4882, + "vendorName": "Yeelight", + "companyLegalName": "Qingdao Yeelink Information Technology Co., Ltd.", + "companyPreferredName": "Yeelink Information Technology", + "vendorLandingPageURL": "https://en.yeelight.com/#", + "creator": "cosmos18fcq3647dkwur0d0zjyenj8sk57jehq4a8epaf" + }, + { + "vendorID": 4891, + "vendorName": "Espressif Systems", + "companyLegalName": "Espressif Systems (Shanghai) Co. Ltd.", + "companyPreferredName": "", + "vendorLandingPageURL": "https://www.espressif.com", + "creator": "cosmos1vncrg6hk30kutk4nr26mvyqc92zkygcc7aemzt" + }, + { + "vendorID": 4894, + "vendorName": "CAME S.p.A.", + "companyLegalName": "CAME S.p.A.", + "companyPreferredName": "CAME S.p.A.", + "vendorLandingPageURL": "https://www.came.com/", + "creator": "cosmos1kxjh94dcvnym6265nmxcjpn9xpkx0y7e3jjeqc" + }, + { + "vendorID": 4895, + "vendorName": "Longan.link", + "companyLegalName": "Longan Link Tech Co.,LTD", + "companyPreferredName": "", + "vendorLandingPageURL": "https://longan.link/", + "creator": "cosmos1qnd2v3n0f0ukja8z0jm4jqsqs5qhxa6ncvcxuv" + }, + { + "vendorID": 4897, + "vendorName": "SONOFF", + "companyLegalName": "Shenzhen Sonoff Technologies Co.,Ltd.", + "companyPreferredName": "SONOFF", + "vendorLandingPageURL": "https://sonoff.tech/", + "creator": "cosmos160c6r8rc2pgpgucasw4ae5gfqtz5vzcc6ay2sz" + }, + { + "vendorID": 4915, + "vendorName": "Becker Antriebe", + "companyLegalName": "Becker Antriebe GmbH", + "companyPreferredName": "Becker Antriebe", + "vendorLandingPageURL": "https://www.becker-antriebe.com/", + "creator": "cosmos1f6knru06kkxm306ckgs93zs9aqyrk9axgqh5wq" + }, + { + "vendorID": 4921, + "vendorName": "GE Lighting, a Savant company", + "companyLegalName": "GE Lighting, a Savant company", + "companyPreferredName": "", + "vendorLandingPageURL": "https://www.gelighting.com/", + "creator": "cosmos130t4m26ynex82jcgkqguxpffpva05e4zugn0xc" + }, + { + "vendorID": 4927, + "vendorName": "ASR", + "companyLegalName": "ASR Microelectronics(ShenZhen)Co., Ltd.", + "companyPreferredName": "", + "vendorLandingPageURL": "", + "creator": "cosmos14a9n65wmumympggqnquu5ptq042ff69nehztk7" + }, + { + "vendorID": 4930, + "vendorName": "Beken Corporation", + "companyLegalName": "beken", + "companyPreferredName": "", + "vendorLandingPageURL": "http://www.bekencorp.com/", + "creator": "cosmos1aru484uj9dqkpnqg768tl6m66fvz9wkqcg79cw" + }, + { + "vendorID": 4932, + "vendorName": "Eltako", + "companyLegalName": "Eltako GmbH", + "companyPreferredName": "Eltako", + "vendorLandingPageURL": "https://www.eltako.com", + "creator": "cosmos1n3kqdwqh33grxcnzdeknercyt3wekc5zl4n3dg" + }, + { + "vendorID": 4933, + "vendorName": "Meross", + "companyLegalName": "Chengdu Meross Technology Co., Ltd.", + "companyPreferredName": "Meross", + "vendorLandingPageURL": "https://www.meross.com", + "creator": "cosmos18qu47pmqwylzm9w2tezyrmvcwmkew5yyvw3d6n" + }, + { + "vendorID": 4934, + "vendorName": "Rafael", + "companyLegalName": "Rafael Microelectronics, Inc.", + "companyPreferredName": "Rafael", + "vendorLandingPageURL": "", + "creator": "cosmos14myns7fehcxm2c896k5syhzr7zsyf7g4jdlk08" + }, + { + "vendorID": 4937, + "vendorName": "Apple Home", + "companyLegalName": "Apple Inc.", + "companyPreferredName": "", + "vendorLandingPageURL": "https://www.apple.com/home-app", + "creator": "cosmos1ysl37yl5nmcg8qr64knpscahq5zel3hjtxmvyt" + }, + { + "vendorID": 4942, + "vendorName": "tado", + "companyLegalName": "tado GmbH", + "companyPreferredName": "tado°", + "vendorLandingPageURL": "https://www.tado.com/", + "creator": "cosmos1sacvh2z4w0f3d657a2tdw2w4ha87743c8qahkv" + }, + { + "vendorID": 4943, + "vendorName": "mediola", + "companyLegalName": "mediola - connected living AG", + "companyPreferredName": "mediola", + "vendorLandingPageURL": "https://www.mediola.com", + "creator": "cosmos1j2w2zq787mkwltsdhzlxpnm50s8nrvg85u20dh" + }, + { + "vendorID": 4945, + "vendorName": "HooRii Technology", + "companyLegalName": "HooRii Technology CO., LTD", + "companyPreferredName": "HooRii Technology", + "vendorLandingPageURL": "https://www.hoorii.io/", + "creator": "cosmos1etk35ufz9z4x56t63tap7ncsvk5k5zw2npmlcu" + }, + { + "vendorID": 4957, + "vendorName": "Nuki", + "companyLegalName": "Nuki Home Solutions GmbH", + "companyPreferredName": "Nuki", + "vendorLandingPageURL": "https://nuki.io", + "creator": "cosmos1tdslga3va6luqzy2x3nlwxfh80f99vly5800ls" + }, + { + "vendorID": 4962, + "vendorName": "deveritec GmbH", + "companyLegalName": "deveritec GmbH", + "companyPreferredName": "", + "vendorLandingPageURL": "https://deveritec.de", + "creator": "cosmos19740ad8368h0h33rcu6gugtxgvyuws7puqg0za" + }, + { + "vendorID": 4965, + "vendorName": "Dooya", + "companyLegalName": "Ningbo Dooya Mechanic \u0026 Electronic Technology Co.,Ltd", + "companyPreferredName": "", + "vendorLandingPageURL": "", + "creator": "cosmos1pqypa94grwkmk2d7e0ncdctfav5wyycu787tmk" + }, + { + "vendorID": 4974, + "vendorName": "Ambi Labs Limited", + "companyLegalName": "Ambi Labs Limited", + "companyPreferredName": "", + "vendorLandingPageURL": "", + "creator": "cosmos12st2nx5elvkyswv7nqw6xh6j67vg472lcv0299" + }, + { + "vendorID": 4977, + "vendorName": "Tridonic", + "companyLegalName": "Tridonic GmbH \u0026 Co KG", + "companyPreferredName": "Tridonic", + "vendorLandingPageURL": "https://www.tridonic.com/matter", + "creator": "cosmos16ad3em3nrqzf854p03audmgdl3pc384467yzav" + }, + { + "vendorID": 4978, + "vendorName": "innovation matters", + "companyLegalName": "innovation matters iot GmbH", + "companyPreferredName": "", + "vendorLandingPageURL": "https://www.innovation-matters.at/", + "creator": "cosmos1v6x4nte50al0jjynvldwqse9n4ceajmja3wvph" + }, + { + "vendorID": 4991, + "vendorName": "NEO", + "companyLegalName": "Shenzhen NEO Electronic CO", + "companyPreferredName": "", + "vendorLandingPageURL": "", + "creator": "cosmos18cvsug5mc7vj9a6kxaj0fwp99vj9ga3xd3lnql" + }, + { + "vendorID": 4993, + "vendorName": "Amazon Prime Video", + "companyLegalName": "Amazon.com, Inc.", + "companyPreferredName": "Amazon Prime Video", + "vendorLandingPageURL": "https://www.amazon.com", + "creator": "cosmos1akrkaxvlfwnnk2phtxewadmel4s567wr8xmfj8" + }, + { + "vendorID": 4996, + "vendorName": "Apple Keychain", + "companyLegalName": "Apple Inc.", + "companyPreferredName": "", + "vendorLandingPageURL": "https://support.apple.com/en-us/HT213441", + "creator": "cosmos1qqgp6p73z0lku4qzeajgtxtzy24xx467j0v0kp" + }, + { + "vendorID": 4998, + "vendorName": "Skylux", + "companyLegalName": "Skylux N.V.", + "companyPreferredName": "Skylux", + "vendorLandingPageURL": "https://www.skylux.eu", + "creator": "cosmos1f9haxa732cy6rmm3nc88q9fxx9zv0m0qn3kzcm" + }, + { + "vendorID": 4999, + "vendorName": "Qianyan", + "companyLegalName": "Shenzhen Qianyan Technology LTD", + "companyPreferredName": "", + "vendorLandingPageURL": "", + "creator": "cosmos10plhr0fh27nred7nra3s6dld26gzcw6etje4gk" + }, + { + "vendorID": 5002, + "vendorName": "Nature", + "companyLegalName": "Nature Inc.", + "companyPreferredName": "", + "vendorLandingPageURL": "https://nature.global/", + "creator": "cosmos1yvwf85sx9mp53kptfwfz49cmmznvj2j0efavzu" + }, + { + "vendorID": 5009, + "vendorName": "Kasa", + "companyLegalName": "TP-Link Corporation Limited", + "companyPreferredName": "", + "vendorLandingPageURL": "https://www.kasasmart.com", + "creator": "cosmos1fjwwzm8zs9yc2hq73tqggdylcmm0ujmuc7x9wn" + }, + { + "vendorID": 5010, + "vendorName": "Tapo", + "companyLegalName": "TP-Link Corporation Limited", + "companyPreferredName": "", + "vendorLandingPageURL": "https://www.tapo.com", + "creator": "cosmos1acw4mmmf26e7jkxqm5epu7g56tcgz0walk3vs8" + }, + { + "vendorID": 5015, + "vendorName": "SwitchBot", + "companyLegalName": "Woan Technology (Shenzhen) Co., Ltd. ", + "companyPreferredName": "", + "vendorLandingPageURL": "", + "creator": "cosmos1dc9patujyr2av2ezggudfalfag7p7scc0t3wnk" + }, + { + "vendorID": 5020, + "vendorName": "Zemismart Technology Limited", + "companyLegalName": "Zemismart Technology Limited", + "companyPreferredName": "Zemismart", + "vendorLandingPageURL": "https://www.zemismart.com", + "creator": "cosmos1mrv5zh6r6kcfln34vju5kfup4mv9lw27u33yj0" + }, + { + "vendorID": 5120, + "vendorName": "Uascent", + "companyLegalName": "Uascent Technology Company Limited", + "companyPreferredName": "", + "vendorLandingPageURL": "", + "creator": "cosmos1ynw4zl6xqnvh5zhzhhpxjc6kt8z8wvxkp8edsw" + }, + { + "vendorID": 5123, + "vendorName": "Arlec Australia", + "companyLegalName": "Arlec Australia Pty. Ltd.", + "companyPreferredName": "Grid Connect", + "vendorLandingPageURL": "https://grid-connect.com.au/", + "creator": "cosmos1d9ut0ysdlw68r0705q8tagf7y9cf3d686fpf73" + }, + { + "vendorID": 5124, + "vendorName": "Phaten", + "companyLegalName": "Shenzhen Phaten Technology Co., Ltd.", + "companyPreferredName": "", + "vendorLandingPageURL": "https://www.phaten.com", + "creator": "cosmos1h4rf0hjzf498s2lu0rf8m52ujst2gl7lpdnexs" + }, + { + "vendorID": 5127, + "vendorName": "ThirdReality", + "companyLegalName": "Jiangsu Shushi Technology Co., Ltd.", + "companyPreferredName": "", + "vendorLandingPageURL": "", + "creator": "cosmos1qwnh6tj4n938g3fmncqna22zmfxx50vnd22yux" + }, + { + "vendorID": 5136, + "vendorName": "Quectel", + "companyLegalName": "Quectel Wireless Solutions Co., Ltd.", + "companyPreferredName": "", + "vendorLandingPageURL": "https://www.quectel.com", + "creator": "cosmos1dqrg6w2jjs7sft59dpqngjzyfdjh4xjn5rjct5" + }, + { + "vendorID": 5139, + "vendorName": "1Home", + "companyLegalName": "1Home Solutions GmbH", + "companyPreferredName": "", + "vendorLandingPageURL": "https://www.1home.io/", + "creator": "cosmos1nzyp28afpumk0djal2w35s2pcl0q3e57euplkq" + }, + { + "vendorID": 5141, + "vendorName": "Caveman", + "companyLegalName": "Nanoleaf Ltd.", + "companyPreferredName": "", + "vendorLandingPageURL": "", + "creator": "cosmos1smgmnl90h9srczk926l5kt7rydjpq7x0smc5e7" + }, + { + "vendorID": 5145, + "vendorName": "Lorex", + "companyLegalName": "Lorex Technology Inc.", + "companyPreferredName": "Lorex", + "vendorLandingPageURL": "https://www.lorex.com/", + "creator": "cosmos1c98nn3uphuya0w4km5uzamjwpkawksf5g6h5m5" + }, + { + "vendorID": 5147, + "vendorName": "Rang Dong VN", + "companyLegalName": "Rang Dong Light Source \u0026 Vacuum Flask JSC", + "companyPreferredName": "Rang Dong Light Source \u0026 Vacuum Flask JSC", + "vendorLandingPageURL": "https://rangdong.com.vn/", + "creator": "cosmos1023z8vredmrn7xlzjlrlv6wdqh0fpzs8jlc9rx" + }, + { + "vendorID": 5150, + "vendorName": "TUO Accessories LLC", + "companyLegalName": "TUO Accessories LLC", + "companyPreferredName": "TUO Accessories", + "vendorLandingPageURL": "http://tuoaccessories.com", + "creator": "cosmos1vn34dnlqvz5e997ws53yfj6a2622duzf3gg80d" + }, + { + "vendorID": 5151, + "vendorName": "Ductech", + "companyLegalName": "DUCTECH Co., Ltd.", + "companyPreferredName": "", + "vendorLandingPageURL": "", + "creator": "cosmos18nqp48ce5k7j8qvuwk7tnzmckwsd8k2tlnj850" + }, + { + "vendorID": 5165, + "vendorName": "QH", + "companyLegalName": "Zhongshan QIHANG Electronic Technology Co.", + "companyPreferredName": "QIHANG", + "vendorLandingPageURL": "https://zsqhkj.1688.com/", + "creator": "cosmos13zzg6t6gaz36p8ctguatrguwuep9wmza6lptet" + }, + { + "vendorID": 5167, + "vendorName": "QIACHIP", + "companyLegalName": "Shenzhen QIACHIP Wireless E-commerce Co.", + "companyPreferredName": "QIACHIP", + "vendorLandingPageURL": "https://qiachip.com", + "creator": "cosmos1rhjya3hdvpyr2a3ur7s5hj48ce2qndyfcz07ht" + }, + { + "vendorID": 24582, + "vendorName": "Google LLC", + "companyLegalName": "Google LLC", + "companyPreferredName": "", + "vendorLandingPageURL": "", + "creator": "cosmos1kelvhh6cy2vmaj5zczxj52k4nys2w4e2u3awvq" + } + ], + "pagination": { + "next_key": null, + "total": "73" + } +} \ No newline at end of file From a19079b2ecc08d53815bd5e393ab473edda49b00 Mon Sep 17 00:00:00 2001 From: Norbert <48217146+Noschvie@users.noreply.github.com> Date: Tue, 6 Jun 2023 10:21:12 +0200 Subject: [PATCH 227/289] Fix spelling. (#18799) --- tasmota/berry/zigbee/cc2652_flasher.be | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tasmota/berry/zigbee/cc2652_flasher.be b/tasmota/berry/zigbee/cc2652_flasher.be index 08cb2bd34..994105340 100644 --- a/tasmota/berry/zigbee/cc2652_flasher.be +++ b/tasmota/berry/zigbee/cc2652_flasher.be @@ -11,7 +11,7 @@ # When starting the flasher, normal zigbee operations are aborterd. Restarting # normal zigbee functions requires a Tasmota restart. # -# Required condiguration: +# Required configuration: # - Zigbee Rx: must be configured as `Zigbee Rx` or `TCP Rx` # - Zigbee Tx: must be configured as `Zigbee Tx` or `TCP Tx` # - Zigbee Reset: must be configured as `Zigbee Rst - 1`` From 8d8870a6ee805f52b76ae4a37c19d351cd913201 Mon Sep 17 00:00:00 2001 From: Norbert <48217146+Noschvie@users.noreply.github.com> Date: Tue, 6 Jun 2023 10:21:34 +0200 Subject: [PATCH 228/289] Fix spelling. (#18800) --- lib/libesp32/berry_matter/src/embedded/Matter_Device.be | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Device.be b/lib/libesp32/berry_matter/src/embedded/Matter_Device.be index 222766a78..0107f345b 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Device.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Device.be @@ -623,7 +623,7 @@ class Matter_Device var f = open(self.FILENAME, "w") f.write(j) f.close() - tasmota.log(string.format("MTR: =Saved parameters%s", self.plugins_persist ? " and condiguration" : ""), 2) + tasmota.log(string.format("MTR: =Saved parameters%s", self.plugins_persist ? " and configuration" : ""), 2) return j except .. as e, m tasmota.log("MTR: Session_Store::save Exception:" + str(e) + "|" + str(m), 2) From a0a1b89dfbe43bae95df0c307d35e994d7bcea1b Mon Sep 17 00:00:00 2001 From: s-hadinger Date: Tue, 6 Jun 2023 08:22:56 +0000 Subject: [PATCH 229/289] Solidified Code updated --- .../berry_matter/src/solidify/solidified_Matter_Device.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Device.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Device.h index 69e3f8350..d8709dbf0 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Device.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Device.h @@ -5280,7 +5280,7 @@ be_local_closure(Matter_Device_save_param, /* name */ /* K19 */ be_nested_str_weak(tasmota), /* K20 */ be_nested_str_weak(log), /* K21 */ be_nested_str_weak(MTR_X3A_X20_X3DSaved_X20_X20_X20_X20_X20parameters_X25s), - /* K22 */ be_nested_str_weak(_X20and_X20condiguration), + /* K22 */ be_nested_str_weak(_X20and_X20configuration), /* K23 */ be_nested_str_weak(), /* K24 */ be_const_int(2), /* K25 */ be_nested_str_weak(MTR_X3A_X20Session_Store_X3A_X3Asave_X20Exception_X3A), From 18c2bc8320e7cdd0e0e8709b15d2ead5ec3c6e42 Mon Sep 17 00:00:00 2001 From: s-hadinger <49731213+s-hadinger@users.noreply.github.com> Date: Tue, 6 Jun 2023 15:13:13 +0200 Subject: [PATCH 230/289] Matter fix unchunked requests for OpenBK (#18803) --- .../src/embedded/Matter_HTTP_async.be | 6 + .../solidify/solidified_Matter_HTTP_async.h | 1292 +++++++++-------- 2 files changed, 670 insertions(+), 628 deletions(-) diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_HTTP_async.be b/lib/libesp32/berry_matter/src/embedded/Matter_HTTP_async.be index b768100cc..bd8d726c0 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_HTTP_async.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_HTTP_async.be @@ -374,6 +374,12 @@ class Matter_HTTP_async : Matter_TCP_async # # Transaction finished sucessfully, result in self.payload def event_http_finished() end + def event_closed() + if self.http_status == 0 + self.http_status = 1 + self.event_http_finished() + end + end ############################################################# # event_http_failed diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_HTTP_async.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_HTTP_async.h index a649c4ef6..6b4bf1ef8 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_HTTP_async.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_HTTP_async.h @@ -6,198 +6,6 @@ extern const bclass be_class_Matter_HTTP_async; -/******************************************************************** -** Solidified function: event_available -********************************************************************/ -be_local_closure(Matter_HTTP_async_event_available, /* name */ - be_nested_proto( - 3, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 1]) { /* constants */ - /* K0 */ be_nested_str_weak(receive), - }), - be_str_weak(event_available), - &be_const_str_solidified, - ( &(const binstruction[ 3]) { /* code */ - 0x8C040100, // 0000 GETMET R1 R0 K0 - 0x7C040200, // 0001 CALL R1 1 - 0x80000000, // 0002 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: event_established -********************************************************************/ -be_local_closure(Matter_HTTP_async_event_established, /* name */ - be_nested_proto( - 3, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 1]) { /* constants */ - /* K0 */ be_nested_str_weak(send_http), - }), - be_str_weak(event_established), - &be_const_str_solidified, - ( &(const binstruction[ 3]) { /* code */ - 0x8C040100, // 0000 GETMET R1 R0 K0 - 0x7C040200, // 0001 CALL R1 1 - 0x80000000, // 0002 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: parse_http_status_line -********************************************************************/ -be_local_closure(Matter_HTTP_async_parse_http_status_line, /* name */ - be_nested_proto( - 5, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[12]) { /* constants */ - /* K0 */ be_nested_str_weak(global), - /* K1 */ be_nested_str_weak(_re_http_status), - /* K2 */ be_nested_str_weak(match2), - /* K3 */ be_nested_str_weak(response), - /* K4 */ be_nested_str_weak(response_offset), - /* K5 */ be_const_int(0), - /* K6 */ be_nested_str_weak(status_code), - /* K7 */ be_const_int(1), - /* K8 */ be_nested_str_weak(phase), - /* K9 */ be_nested_str_weak(parse_http_headers), - /* K10 */ be_nested_str_weak(close), - /* K11 */ be_nested_str_weak(status), - }), - be_str_weak(parse_http_status_line), - &be_const_str_solidified, - ( &(const binstruction[28]) { /* code */ - 0xB8060000, // 0000 GETNGBL R1 K0 - 0x88040301, // 0001 GETMBR R1 R1 K1 - 0x8C040302, // 0002 GETMET R1 R1 K2 - 0x880C0103, // 0003 GETMBR R3 R0 K3 - 0x88100104, // 0004 GETMBR R4 R0 K4 - 0x7C040600, // 0005 CALL R1 3 - 0x78060009, // 0006 JMPF R1 #0011 - 0x94080305, // 0007 GETIDX R2 R1 K5 - 0x90020802, // 0008 SETMBR R0 K4 R2 - 0x60080009, // 0009 GETGBL R2 G9 - 0x940C0307, // 000A GETIDX R3 R1 K7 - 0x7C080200, // 000B CALL R2 1 - 0x90020C02, // 000C SETMBR R0 K6 R2 - 0x90021107, // 000D SETMBR R0 K8 K7 - 0x8C080109, // 000E GETMET R2 R0 K9 - 0x7C080200, // 000F CALL R2 1 - 0x70020009, // 0010 JMP #001B - 0x6008000C, // 0011 GETGBL R2 G12 - 0x880C0103, // 0012 GETMBR R3 R0 K3 - 0x7C080200, // 0013 CALL R2 1 - 0x540E0063, // 0014 LDINT R3 100 - 0x24080403, // 0015 GT R2 R2 R3 - 0x780A0003, // 0016 JMPF R2 #001B - 0x8C08010A, // 0017 GETMET R2 R0 K10 - 0x7C080200, // 0018 CALL R2 1 - 0x5409FFFB, // 0019 LDINT R2 -4 - 0x90021602, // 001A SETMBR R0 K11 R2 - 0x80000000, // 001B RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: event_http_header -********************************************************************/ -be_local_closure(Matter_HTTP_async_event_http_header, /* name */ - be_nested_proto( - 7, /* nstack */ - 3, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 5]) { /* constants */ - /* K0 */ be_nested_str_weak(string), - /* K1 */ be_nested_str_weak(tolower), - /* K2 */ be_nested_str_weak(transfer_X2Dencoding), - /* K3 */ be_nested_str_weak(chunked), - /* K4 */ be_nested_str_weak(is_chunked), - }), - be_str_weak(event_http_header), - &be_const_str_solidified, - ( &(const binstruction[19]) { /* code */ - 0xA40E0000, // 0000 IMPORT R3 K0 - 0x8C100701, // 0001 GETMET R4 R3 K1 - 0x5C180200, // 0002 MOVE R6 R1 - 0x7C100400, // 0003 CALL R4 2 - 0x5C040800, // 0004 MOVE R1 R4 - 0x8C100701, // 0005 GETMET R4 R3 K1 - 0x5C180400, // 0006 MOVE R6 R2 - 0x7C100400, // 0007 CALL R4 2 - 0x5C080800, // 0008 MOVE R2 R4 - 0x1C100302, // 0009 EQ R4 R1 K2 - 0x78120006, // 000A JMPF R4 #0012 - 0x8C100701, // 000B GETMET R4 R3 K1 - 0x5C180400, // 000C MOVE R6 R2 - 0x7C100400, // 000D CALL R4 2 - 0x1C100903, // 000E EQ R4 R4 K3 - 0x78120001, // 000F JMPF R4 #0012 - 0x50100200, // 0010 LDBOOL R4 1 0 - 0x90020804, // 0011 SETMBR R0 K4 R4 - 0x80000000, // 0012 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: event_http_failed -********************************************************************/ -be_local_closure(Matter_HTTP_async_event_http_failed, /* name */ - be_nested_proto( - 1, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 0, /* has constants */ - NULL, /* no const */ - be_str_weak(event_http_failed), - &be_const_str_solidified, - ( &(const binstruction[ 1]) { /* code */ - 0x80000000, // 0000 RET 0 - }) - ) -); -/*******************************************************************/ - - /******************************************************************** ** Solidified function: init ********************************************************************/ @@ -237,66 +45,250 @@ be_local_closure(Matter_HTTP_async_init, /* name */ /******************************************************************** -** Solidified function: begin_sync +** Solidified function: event_http_failed ********************************************************************/ -be_local_closure(Matter_HTTP_async_begin_sync, /* name */ +be_local_closure(Matter_HTTP_async_event_http_failed, /* name */ be_nested_proto( - 10, /* nstack */ - 3, /* argc */ + 1, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 0, /* has constants */ + NULL, /* no const */ + be_str_weak(event_http_failed), + &be_const_str_solidified, + ( &(const binstruction[ 1]) { /* code */ + 0x80000000, // 0000 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: compile_re +********************************************************************/ +be_local_closure(Matter_HTTP_async_compile_re, /* name */ + be_nested_proto( + 6, /* nstack */ + 1, /* argc */ 2, /* varg */ 0, /* has upvals */ NULL, /* no upvals */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[10]) { /* constants */ - /* K0 */ be_nested_str_weak(timeout), - /* K1 */ be_nested_str_weak(set_timeout), - /* K2 */ be_nested_str_weak(SPINLOCK), - /* K3 */ be_nested_str_weak(begin), - /* K4 */ be_nested_str_weak(http_status), - /* K5 */ be_const_int(0), - /* K6 */ be_nested_str_weak(loop), - /* K7 */ be_nested_str_weak(tasmota), - /* K8 */ be_nested_str_weak(delay), - /* K9 */ be_nested_str_weak(payload), + ( &(const bvalue[12]) { /* constants */ + /* K0 */ be_nested_str_weak(re), + /* K1 */ be_nested_str_weak(global), + /* K2 */ be_nested_str_weak(contains), + /* K3 */ be_nested_str_weak(_re_http_status), + /* K4 */ be_nested_str_weak(compile), + /* K5 */ be_nested_str_weak(HTTP_STATUS_REGEX), + /* K6 */ be_nested_str_weak(_re_http_header), + /* K7 */ be_nested_str_weak(HTTP_HEADER_REGEX), + /* K8 */ be_nested_str_weak(_re_http_body), + /* K9 */ be_nested_str_weak(HTTP_BODY_REGEX), + /* K10 */ be_nested_str_weak(_re_http_chunk), + /* K11 */ be_nested_str_weak(HTTP_CHUNK_REGEX), }), - be_str_weak(begin_sync), + be_str_weak(compile_re), &be_const_str_solidified, - ( &(const binstruction[33]) { /* code */ - 0x880C0100, // 0000 GETMBR R3 R0 K0 - 0x4C100000, // 0001 LDNIL R4 - 0x20100404, // 0002 NE R4 R2 R4 - 0x78120002, // 0003 JMPF R4 #0007 - 0x8C100101, // 0004 GETMET R4 R0 K1 - 0x5C180400, // 0005 MOVE R6 R2 - 0x7C100400, // 0006 CALL R4 2 - 0x4C100000, // 0007 LDNIL R4 - 0x88140102, // 0008 GETMBR R5 R0 K2 - 0x8C180103, // 0009 GETMET R6 R0 K3 - 0x5C200200, // 000A MOVE R8 R1 - 0x7C180400, // 000B CALL R6 2 - 0x781A0009, // 000C JMPF R6 #0017 - 0x881C0104, // 000D GETMBR R7 R0 K4 - 0x1C1C0F05, // 000E EQ R7 R7 K5 - 0x781E0006, // 000F JMPF R7 #0017 - 0x8C1C0106, // 0010 GETMET R7 R0 K6 - 0x7C1C0200, // 0011 CALL R7 1 - 0xB81E0E00, // 0012 GETNGBL R7 K7 - 0x8C1C0F08, // 0013 GETMET R7 R7 K8 - 0x5C240A00, // 0014 MOVE R9 R5 - 0x7C1C0400, // 0015 CALL R7 2 - 0x7001FFF5, // 0016 JMP #000D - 0x8C1C0101, // 0017 GETMET R7 R0 K1 - 0x5C240600, // 0018 MOVE R9 R3 - 0x7C1C0400, // 0019 CALL R7 2 - 0x881C0104, // 001A GETMBR R7 R0 K4 - 0x241C0F05, // 001B GT R7 R7 K5 - 0x781E0001, // 001C JMPF R7 #001F - 0x881C0109, // 001D GETMBR R7 R0 K9 - 0x70020000, // 001E JMP #0020 - 0x4C1C0000, // 001F LDNIL R7 - 0x80040E00, // 0020 RET 1 R7 + ( &(const binstruction[27]) { /* code */ + 0xA4060000, // 0000 IMPORT R1 K0 + 0xB80A0200, // 0001 GETNGBL R2 K1 + 0x8C080502, // 0002 GETMET R2 R2 K2 + 0x58100003, // 0003 LDCONST R4 K3 + 0x7C080400, // 0004 CALL R2 2 + 0x740A0013, // 0005 JMPT R2 #001A + 0xB80A0200, // 0006 GETNGBL R2 K1 + 0x8C0C0304, // 0007 GETMET R3 R1 K4 + 0x88140105, // 0008 GETMBR R5 R0 K5 + 0x7C0C0400, // 0009 CALL R3 2 + 0x900A0603, // 000A SETMBR R2 K3 R3 + 0xB80A0200, // 000B GETNGBL R2 K1 + 0x8C0C0304, // 000C GETMET R3 R1 K4 + 0x88140107, // 000D GETMBR R5 R0 K7 + 0x7C0C0400, // 000E CALL R3 2 + 0x900A0C03, // 000F SETMBR R2 K6 R3 + 0xB80A0200, // 0010 GETNGBL R2 K1 + 0x8C0C0304, // 0011 GETMET R3 R1 K4 + 0x88140109, // 0012 GETMBR R5 R0 K9 + 0x7C0C0400, // 0013 CALL R3 2 + 0x900A1003, // 0014 SETMBR R2 K8 R3 + 0xB80A0200, // 0015 GETNGBL R2 K1 + 0x8C0C0304, // 0016 GETMET R3 R1 K4 + 0x8814010B, // 0017 GETMBR R5 R0 K11 + 0x7C0C0400, // 0018 CALL R3 2 + 0x900A1403, // 0019 SETMBR R2 K10 R3 + 0x80000000, // 001A RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: parse_http_response +********************************************************************/ +be_local_closure(Matter_HTTP_async_parse_http_response, /* name */ + be_nested_proto( + 3, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 7]) { /* constants */ + /* K0 */ be_nested_str_weak(phase), + /* K1 */ be_const_int(0), + /* K2 */ be_nested_str_weak(parse_http_status_line), + /* K3 */ be_const_int(1), + /* K4 */ be_nested_str_weak(parse_http_headers), + /* K5 */ be_const_int(2), + /* K6 */ be_nested_str_weak(parse_http_payload), + }), + be_str_weak(parse_http_response), + &be_const_str_solidified, + ( &(const binstruction[18]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x1C040301, // 0001 EQ R1 R1 K1 + 0x78060002, // 0002 JMPF R1 #0006 + 0x8C040102, // 0003 GETMET R1 R0 K2 + 0x7C040200, // 0004 CALL R1 1 + 0x7002000A, // 0005 JMP #0011 + 0x88040100, // 0006 GETMBR R1 R0 K0 + 0x1C040303, // 0007 EQ R1 R1 K3 + 0x78060002, // 0008 JMPF R1 #000C + 0x8C040104, // 0009 GETMET R1 R0 K4 + 0x7C040200, // 000A CALL R1 1 + 0x70020004, // 000B JMP #0011 + 0x88040100, // 000C GETMBR R1 R0 K0 + 0x1C040305, // 000D EQ R1 R1 K5 + 0x78060001, // 000E JMPF R1 #0011 + 0x8C040106, // 000F GETMET R1 R0 K6 + 0x7C040200, // 0010 CALL R1 1 + 0x80000000, // 0011 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: event_available +********************************************************************/ +be_local_closure(Matter_HTTP_async_event_available, /* name */ + be_nested_proto( + 3, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 1]) { /* constants */ + /* K0 */ be_nested_str_weak(receive), + }), + be_str_weak(event_available), + &be_const_str_solidified, + ( &(const binstruction[ 3]) { /* code */ + 0x8C040100, // 0000 GETMET R1 R0 K0 + 0x7C040200, // 0001 CALL R1 1 + 0x80000000, // 0002 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: receive +********************************************************************/ +be_local_closure(Matter_HTTP_async_receive, /* name */ + be_nested_proto( + 6, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[15]) { /* constants */ + /* K0 */ be_nested_str_weak(tcp_connected), + /* K1 */ be_nested_str_weak(tasmota), + /* K2 */ be_nested_str_weak(millis), + /* K3 */ be_nested_str_weak(time_start), + /* K4 */ be_nested_str_weak(timeout), + /* K5 */ be_nested_str_weak(status), + /* K6 */ be_nested_str_weak(close), + /* K7 */ be_nested_str_weak(http_status), + /* K8 */ be_nested_str_weak(event_http_timeout), + /* K9 */ be_nested_str_weak(tcp), + /* K10 */ be_nested_str_weak(available), + /* K11 */ be_const_int(0), + /* K12 */ be_nested_str_weak(read), + /* K13 */ be_nested_str_weak(response), + /* K14 */ be_nested_str_weak(parse_http_response), + }), + be_str_weak(receive), + &be_const_str_solidified, + ( &(const binstruction[48]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x50080200, // 0001 LDBOOL R2 1 0 + 0x20040202, // 0002 NE R1 R1 R2 + 0x78060000, // 0003 JMPF R1 #0005 + 0x80000200, // 0004 RET 0 + 0xB8060200, // 0005 GETNGBL R1 K1 + 0x8C040302, // 0006 GETMET R1 R1 K2 + 0x7C040200, // 0007 CALL R1 1 + 0x88080103, // 0008 GETMBR R2 R0 K3 + 0x04040202, // 0009 SUB R1 R1 R2 + 0x88080104, // 000A GETMBR R2 R0 K4 + 0x24040202, // 000B GT R1 R1 R2 + 0x78060008, // 000C JMPF R1 #0016 + 0x5405FFFC, // 000D LDINT R1 -3 + 0x90020A01, // 000E SETMBR R0 K5 R1 + 0x8C040106, // 000F GETMET R1 R0 K6 + 0x7C040200, // 0010 CALL R1 1 + 0x5405FFFD, // 0011 LDINT R1 -2 + 0x90020E01, // 0012 SETMBR R0 K7 R1 + 0x8C040108, // 0013 GETMET R1 R0 K8 + 0x7C040200, // 0014 CALL R1 1 + 0x70020018, // 0015 JMP #002F + 0x88040109, // 0016 GETMBR R1 R0 K9 + 0x8C04030A, // 0017 GETMET R1 R1 K10 + 0x7C040200, // 0018 CALL R1 1 + 0x5808000B, // 0019 LDCONST R2 K11 + 0x240C030B, // 001A GT R3 R1 K11 + 0x780E000E, // 001B JMPF R3 #002B + 0x880C0109, // 001C GETMBR R3 R0 K9 + 0x8C0C070C, // 001D GETMET R3 R3 K12 + 0x7C0C0200, // 001E CALL R3 1 + 0x8810010D, // 001F GETMBR R4 R0 K13 + 0x00100803, // 0020 ADD R4 R4 R3 + 0x90021A04, // 0021 SETMBR R0 K13 R4 + 0x6010000C, // 0022 GETGBL R4 G12 + 0x5C140600, // 0023 MOVE R5 R3 + 0x7C100200, // 0024 CALL R4 1 + 0x00080404, // 0025 ADD R2 R2 R4 + 0x88100109, // 0026 GETMBR R4 R0 K9 + 0x8C10090A, // 0027 GETMET R4 R4 K10 + 0x7C100200, // 0028 CALL R4 1 + 0x5C040800, // 0029 MOVE R1 R4 + 0x7001FFEE, // 002A JMP #001A + 0x240C050B, // 002B GT R3 R2 K11 + 0x780E0001, // 002C JMPF R3 #002F + 0x8C0C010E, // 002D GETMET R3 R0 K14 + 0x7C0C0200, // 002E CALL R3 1 + 0x80000000, // 002F RET 0 }) ) ); @@ -383,100 +375,6 @@ be_local_closure(Matter_HTTP_async_event_http_status_code, /* name */ /*******************************************************************/ -/******************************************************************** -** Solidified function: event_timeout -********************************************************************/ -be_local_closure(Matter_HTTP_async_event_timeout, /* name */ - be_nested_proto( - 3, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 2]) { /* constants */ - /* K0 */ be_nested_str_weak(http_status), - /* K1 */ be_nested_str_weak(event_http_timeout), - }), - be_str_weak(event_timeout), - &be_const_str_solidified, - ( &(const binstruction[ 5]) { /* code */ - 0x5405FFFD, // 0000 LDINT R1 -2 - 0x90020001, // 0001 SETMBR R0 K0 R1 - 0x8C040101, // 0002 GETMET R1 R0 K1 - 0x7C040200, // 0003 CALL R1 1 - 0x80000000, // 0004 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: compile_re -********************************************************************/ -be_local_closure(Matter_HTTP_async_compile_re, /* name */ - be_nested_proto( - 6, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[12]) { /* constants */ - /* K0 */ be_nested_str_weak(re), - /* K1 */ be_nested_str_weak(global), - /* K2 */ be_nested_str_weak(contains), - /* K3 */ be_nested_str_weak(_re_http_status), - /* K4 */ be_nested_str_weak(compile), - /* K5 */ be_nested_str_weak(HTTP_STATUS_REGEX), - /* K6 */ be_nested_str_weak(_re_http_header), - /* K7 */ be_nested_str_weak(HTTP_HEADER_REGEX), - /* K8 */ be_nested_str_weak(_re_http_body), - /* K9 */ be_nested_str_weak(HTTP_BODY_REGEX), - /* K10 */ be_nested_str_weak(_re_http_chunk), - /* K11 */ be_nested_str_weak(HTTP_CHUNK_REGEX), - }), - be_str_weak(compile_re), - &be_const_str_solidified, - ( &(const binstruction[27]) { /* code */ - 0xA4060000, // 0000 IMPORT R1 K0 - 0xB80A0200, // 0001 GETNGBL R2 K1 - 0x8C080502, // 0002 GETMET R2 R2 K2 - 0x58100003, // 0003 LDCONST R4 K3 - 0x7C080400, // 0004 CALL R2 2 - 0x740A0013, // 0005 JMPT R2 #001A - 0xB80A0200, // 0006 GETNGBL R2 K1 - 0x8C0C0304, // 0007 GETMET R3 R1 K4 - 0x88140105, // 0008 GETMBR R5 R0 K5 - 0x7C0C0400, // 0009 CALL R3 2 - 0x900A0603, // 000A SETMBR R2 K3 R3 - 0xB80A0200, // 000B GETNGBL R2 K1 - 0x8C0C0304, // 000C GETMET R3 R1 K4 - 0x88140107, // 000D GETMBR R5 R0 K7 - 0x7C0C0400, // 000E CALL R3 2 - 0x900A0C03, // 000F SETMBR R2 K6 R3 - 0xB80A0200, // 0010 GETNGBL R2 K1 - 0x8C0C0304, // 0011 GETMET R3 R1 K4 - 0x88140109, // 0012 GETMBR R5 R0 K9 - 0x7C0C0400, // 0013 CALL R3 2 - 0x900A1003, // 0014 SETMBR R2 K8 R3 - 0xB80A0200, // 0015 GETNGBL R2 K1 - 0x8C0C0304, // 0016 GETMET R3 R1 K4 - 0x8814010B, // 0017 GETMBR R5 R0 K11 - 0x7C0C0400, // 0018 CALL R3 2 - 0x900A1403, // 0019 SETMBR R2 K10 R3 - 0x80000000, // 001A RET 0 - }) - ) -); -/*******************************************************************/ - - /******************************************************************** ** Solidified function: parse_http_payload ********************************************************************/ @@ -605,11 +503,11 @@ be_local_closure(Matter_HTTP_async_parse_http_payload, /* name */ /******************************************************************** -** Solidified function: receive +** Solidified function: send_http ********************************************************************/ -be_local_closure(Matter_HTTP_async_receive, /* name */ +be_local_closure(Matter_HTTP_async_send_http, /* name */ be_nested_proto( - 6, /* nstack */ + 9, /* nstack */ 1, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -617,74 +515,131 @@ be_local_closure(Matter_HTTP_async_receive, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[15]) { /* constants */ - /* K0 */ be_nested_str_weak(tcp_connected), - /* K1 */ be_nested_str_weak(tasmota), - /* K2 */ be_nested_str_weak(millis), - /* K3 */ be_nested_str_weak(time_start), - /* K4 */ be_nested_str_weak(timeout), - /* K5 */ be_nested_str_weak(status), - /* K6 */ be_nested_str_weak(close), - /* K7 */ be_nested_str_weak(http_status), - /* K8 */ be_nested_str_weak(event_http_timeout), - /* K9 */ be_nested_str_weak(tcp), - /* K10 */ be_nested_str_weak(available), - /* K11 */ be_const_int(0), - /* K12 */ be_nested_str_weak(read), - /* K13 */ be_nested_str_weak(response), - /* K14 */ be_nested_str_weak(parse_http_response), + ( &(const bvalue[18]) { /* constants */ + /* K0 */ be_nested_str_weak(string), + /* K1 */ be_nested_str_weak(response), + /* K2 */ be_nested_str_weak(), + /* K3 */ be_nested_str_weak(addr), + /* K4 */ be_nested_str_weak(find), + /* K5 */ be_nested_str_weak(_X3A), + /* K6 */ be_const_int(0), + /* K7 */ be_nested_str_weak(_X5B), + /* K8 */ be_nested_str_weak(_X5D), + /* K9 */ be_nested_str_weak(format), + /* K10 */ be_nested_str_weak(HTTP_GET), + /* K11 */ be_nested_str_weak(cmd), + /* K12 */ be_nested_str_weak(port), + /* K13 */ be_nested_str_weak(write), + /* K14 */ be_nested_str_weak(close), + /* K15 */ be_nested_str_weak(status), + /* K16 */ be_nested_str_weak(http_status), + /* K17 */ be_nested_str_weak(event_http_failed), }), - be_str_weak(receive), + be_str_weak(send_http), &be_const_str_solidified, - ( &(const binstruction[48]) { /* code */ - 0x88040100, // 0000 GETMBR R1 R0 K0 - 0x50080200, // 0001 LDBOOL R2 1 0 - 0x20040202, // 0002 NE R1 R1 R2 - 0x78060000, // 0003 JMPF R1 #0005 - 0x80000200, // 0004 RET 0 - 0xB8060200, // 0005 GETNGBL R1 K1 - 0x8C040302, // 0006 GETMET R1 R1 K2 - 0x7C040200, // 0007 CALL R1 1 - 0x88080103, // 0008 GETMBR R2 R0 K3 - 0x04040202, // 0009 SUB R1 R1 R2 - 0x88080104, // 000A GETMBR R2 R0 K4 - 0x24040202, // 000B GT R1 R1 R2 - 0x78060008, // 000C JMPF R1 #0016 - 0x5405FFFC, // 000D LDINT R1 -3 - 0x90020A01, // 000E SETMBR R0 K5 R1 - 0x8C040106, // 000F GETMET R1 R0 K6 - 0x7C040200, // 0010 CALL R1 1 - 0x5405FFFD, // 0011 LDINT R1 -2 - 0x90020E01, // 0012 SETMBR R0 K7 R1 - 0x8C040108, // 0013 GETMET R1 R0 K8 - 0x7C040200, // 0014 CALL R1 1 - 0x70020018, // 0015 JMP #002F - 0x88040109, // 0016 GETMBR R1 R0 K9 - 0x8C04030A, // 0017 GETMET R1 R1 K10 - 0x7C040200, // 0018 CALL R1 1 - 0x5808000B, // 0019 LDCONST R2 K11 - 0x240C030B, // 001A GT R3 R1 K11 - 0x780E000E, // 001B JMPF R3 #002B - 0x880C0109, // 001C GETMBR R3 R0 K9 - 0x8C0C070C, // 001D GETMET R3 R3 K12 - 0x7C0C0200, // 001E CALL R3 1 - 0x8810010D, // 001F GETMBR R4 R0 K13 - 0x00100803, // 0020 ADD R4 R4 R3 - 0x90021A04, // 0021 SETMBR R0 K13 R4 - 0x6010000C, // 0022 GETGBL R4 G12 - 0x5C140600, // 0023 MOVE R5 R3 - 0x7C100200, // 0024 CALL R4 1 - 0x00080404, // 0025 ADD R2 R2 R4 - 0x88100109, // 0026 GETMBR R4 R0 K9 - 0x8C10090A, // 0027 GETMET R4 R4 K10 - 0x7C100200, // 0028 CALL R4 1 - 0x5C040800, // 0029 MOVE R1 R4 - 0x7001FFEE, // 002A JMP #001A - 0x240C050B, // 002B GT R3 R2 K11 - 0x780E0001, // 002C JMPF R3 #002F - 0x8C0C010E, // 002D GETMET R3 R0 K14 - 0x7C0C0200, // 002E CALL R3 1 - 0x80000000, // 002F RET 0 + ( &(const binstruction[35]) { /* code */ + 0xA4060000, // 0000 IMPORT R1 K0 + 0x90020302, // 0001 SETMBR R0 K1 K2 + 0x88080103, // 0002 GETMBR R2 R0 K3 + 0x8C0C0304, // 0003 GETMET R3 R1 K4 + 0x5C140400, // 0004 MOVE R5 R2 + 0x58180005, // 0005 LDCONST R6 K5 + 0x7C0C0600, // 0006 CALL R3 3 + 0x280C0706, // 0007 GE R3 R3 K6 + 0x780E0002, // 0008 JMPF R3 #000C + 0x000E0E02, // 0009 ADD R3 K7 R2 + 0x000C0708, // 000A ADD R3 R3 K8 + 0x5C080600, // 000B MOVE R2 R3 + 0x8C0C0309, // 000C GETMET R3 R1 K9 + 0x8814010A, // 000D GETMBR R5 R0 K10 + 0x8818010B, // 000E GETMBR R6 R0 K11 + 0x5C1C0400, // 000F MOVE R7 R2 + 0x8820010C, // 0010 GETMBR R8 R0 K12 + 0x7C0C0A00, // 0011 CALL R3 5 + 0x8C10010D, // 0012 GETMET R4 R0 K13 + 0x5C180600, // 0013 MOVE R6 R3 + 0x7C100400, // 0014 CALL R4 2 + 0x6014000C, // 0015 GETGBL R5 G12 + 0x5C180600, // 0016 MOVE R6 R3 + 0x7C140200, // 0017 CALL R5 1 + 0x20140805, // 0018 NE R5 R4 R5 + 0x78160007, // 0019 JMPF R5 #0022 + 0x8C14010E, // 001A GETMET R5 R0 K14 + 0x7C140200, // 001B CALL R5 1 + 0x5415FFFB, // 001C LDINT R5 -4 + 0x90021E05, // 001D SETMBR R0 K15 R5 + 0x5415FFFE, // 001E LDINT R5 -1 + 0x90022005, // 001F SETMBR R0 K16 R5 + 0x8C140111, // 0020 GETMET R5 R0 K17 + 0x7C140200, // 0021 CALL R5 1 + 0x80000000, // 0022 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: begin_sync +********************************************************************/ +be_local_closure(Matter_HTTP_async_begin_sync, /* name */ + be_nested_proto( + 10, /* nstack */ + 3, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[10]) { /* constants */ + /* K0 */ be_nested_str_weak(timeout), + /* K1 */ be_nested_str_weak(set_timeout), + /* K2 */ be_nested_str_weak(SPINLOCK), + /* K3 */ be_nested_str_weak(begin), + /* K4 */ be_nested_str_weak(http_status), + /* K5 */ be_const_int(0), + /* K6 */ be_nested_str_weak(loop), + /* K7 */ be_nested_str_weak(tasmota), + /* K8 */ be_nested_str_weak(delay), + /* K9 */ be_nested_str_weak(payload), + }), + be_str_weak(begin_sync), + &be_const_str_solidified, + ( &(const binstruction[33]) { /* code */ + 0x880C0100, // 0000 GETMBR R3 R0 K0 + 0x4C100000, // 0001 LDNIL R4 + 0x20100404, // 0002 NE R4 R2 R4 + 0x78120002, // 0003 JMPF R4 #0007 + 0x8C100101, // 0004 GETMET R4 R0 K1 + 0x5C180400, // 0005 MOVE R6 R2 + 0x7C100400, // 0006 CALL R4 2 + 0x4C100000, // 0007 LDNIL R4 + 0x88140102, // 0008 GETMBR R5 R0 K2 + 0x8C180103, // 0009 GETMET R6 R0 K3 + 0x5C200200, // 000A MOVE R8 R1 + 0x7C180400, // 000B CALL R6 2 + 0x781A0009, // 000C JMPF R6 #0017 + 0x881C0104, // 000D GETMBR R7 R0 K4 + 0x1C1C0F05, // 000E EQ R7 R7 K5 + 0x781E0006, // 000F JMPF R7 #0017 + 0x8C1C0106, // 0010 GETMET R7 R0 K6 + 0x7C1C0200, // 0011 CALL R7 1 + 0xB81E0E00, // 0012 GETNGBL R7 K7 + 0x8C1C0F08, // 0013 GETMET R7 R7 K8 + 0x5C240A00, // 0014 MOVE R9 R5 + 0x7C1C0400, // 0015 CALL R7 2 + 0x7001FFF5, // 0016 JMP #000D + 0x8C1C0101, // 0017 GETMET R7 R0 K1 + 0x5C240600, // 0018 MOVE R9 R3 + 0x7C1C0400, // 0019 CALL R7 2 + 0x881C0104, // 001A GETMBR R7 R0 K4 + 0x241C0F05, // 001B GT R7 R7 K5 + 0x781E0001, // 001C JMPF R7 #001F + 0x881C0109, // 001D GETMBR R7 R0 K9 + 0x70020000, // 001E JMP #0020 + 0x4C1C0000, // 001F LDNIL R7 + 0x80040E00, // 0020 RET 1 R7 }) ) ); @@ -715,6 +670,195 @@ be_local_closure(Matter_HTTP_async_event_http_finished, /* name */ /*******************************************************************/ +/******************************************************************** +** Solidified function: event_timeout +********************************************************************/ +be_local_closure(Matter_HTTP_async_event_timeout, /* name */ + be_nested_proto( + 3, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 2]) { /* constants */ + /* K0 */ be_nested_str_weak(http_status), + /* K1 */ be_nested_str_weak(event_http_timeout), + }), + be_str_weak(event_timeout), + &be_const_str_solidified, + ( &(const binstruction[ 5]) { /* code */ + 0x5405FFFD, // 0000 LDINT R1 -2 + 0x90020001, // 0001 SETMBR R0 K0 R1 + 0x8C040101, // 0002 GETMET R1 R0 K1 + 0x7C040200, // 0003 CALL R1 1 + 0x80000000, // 0004 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: event_established +********************************************************************/ +be_local_closure(Matter_HTTP_async_event_established, /* name */ + be_nested_proto( + 3, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 1]) { /* constants */ + /* K0 */ be_nested_str_weak(send_http), + }), + be_str_weak(event_established), + &be_const_str_solidified, + ( &(const binstruction[ 3]) { /* code */ + 0x8C040100, // 0000 GETMET R1 R0 K0 + 0x7C040200, // 0001 CALL R1 1 + 0x80000000, // 0002 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: event_refused +********************************************************************/ +be_local_closure(Matter_HTTP_async_event_refused, /* name */ + be_nested_proto( + 3, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 2]) { /* constants */ + /* K0 */ be_nested_str_weak(http_status), + /* K1 */ be_nested_str_weak(event_http_failed), + }), + be_str_weak(event_refused), + &be_const_str_solidified, + ( &(const binstruction[ 5]) { /* code */ + 0x5405FFFE, // 0000 LDINT R1 -1 + 0x90020001, // 0001 SETMBR R0 K0 R1 + 0x8C040101, // 0002 GETMET R1 R0 K1 + 0x7C040200, // 0003 CALL R1 1 + 0x80000000, // 0004 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: event_closed +********************************************************************/ +be_local_closure(Matter_HTTP_async_event_closed, /* name */ + be_nested_proto( + 3, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 4]) { /* constants */ + /* K0 */ be_nested_str_weak(http_status), + /* K1 */ be_const_int(0), + /* K2 */ be_const_int(1), + /* K3 */ be_nested_str_weak(event_http_finished), + }), + be_str_weak(event_closed), + &be_const_str_solidified, + ( &(const binstruction[ 7]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x1C040301, // 0001 EQ R1 R1 K1 + 0x78060002, // 0002 JMPF R1 #0006 + 0x90020102, // 0003 SETMBR R0 K0 K2 + 0x8C040103, // 0004 GETMET R1 R0 K3 + 0x7C040200, // 0005 CALL R1 1 + 0x80000000, // 0006 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: parse_http_status_line +********************************************************************/ +be_local_closure(Matter_HTTP_async_parse_http_status_line, /* name */ + be_nested_proto( + 5, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[12]) { /* constants */ + /* K0 */ be_nested_str_weak(global), + /* K1 */ be_nested_str_weak(_re_http_status), + /* K2 */ be_nested_str_weak(match2), + /* K3 */ be_nested_str_weak(response), + /* K4 */ be_nested_str_weak(response_offset), + /* K5 */ be_const_int(0), + /* K6 */ be_nested_str_weak(status_code), + /* K7 */ be_const_int(1), + /* K8 */ be_nested_str_weak(phase), + /* K9 */ be_nested_str_weak(parse_http_headers), + /* K10 */ be_nested_str_weak(close), + /* K11 */ be_nested_str_weak(status), + }), + be_str_weak(parse_http_status_line), + &be_const_str_solidified, + ( &(const binstruction[28]) { /* code */ + 0xB8060000, // 0000 GETNGBL R1 K0 + 0x88040301, // 0001 GETMBR R1 R1 K1 + 0x8C040302, // 0002 GETMET R1 R1 K2 + 0x880C0103, // 0003 GETMBR R3 R0 K3 + 0x88100104, // 0004 GETMBR R4 R0 K4 + 0x7C040600, // 0005 CALL R1 3 + 0x78060009, // 0006 JMPF R1 #0011 + 0x94080305, // 0007 GETIDX R2 R1 K5 + 0x90020802, // 0008 SETMBR R0 K4 R2 + 0x60080009, // 0009 GETGBL R2 G9 + 0x940C0307, // 000A GETIDX R3 R1 K7 + 0x7C080200, // 000B CALL R2 1 + 0x90020C02, // 000C SETMBR R0 K6 R2 + 0x90021107, // 000D SETMBR R0 K8 K7 + 0x8C080109, // 000E GETMET R2 R0 K9 + 0x7C080200, // 000F CALL R2 1 + 0x70020009, // 0010 JMP #001B + 0x6008000C, // 0011 GETGBL R2 G12 + 0x880C0103, // 0012 GETMBR R3 R0 K3 + 0x7C080200, // 0013 CALL R2 1 + 0x540E0063, // 0014 LDINT R3 100 + 0x24080403, // 0015 GT R2 R2 R3 + 0x780A0003, // 0016 JMPF R2 #001B + 0x8C08010A, // 0017 GETMET R2 R0 K10 + 0x7C080200, // 0018 CALL R2 1 + 0x5409FFFB, // 0019 LDINT R2 -4 + 0x90021602, // 001A SETMBR R0 K11 R2 + 0x80000000, // 001B RET 0 + }) + ) +); +/*******************************************************************/ + + /******************************************************************** ** Solidified function: parse_http_headers ********************************************************************/ @@ -803,88 +947,6 @@ be_local_closure(Matter_HTTP_async_parse_http_headers, /* name */ /*******************************************************************/ -/******************************************************************** -** Solidified function: parse_http_response -********************************************************************/ -be_local_closure(Matter_HTTP_async_parse_http_response, /* name */ - be_nested_proto( - 3, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 7]) { /* constants */ - /* K0 */ be_nested_str_weak(phase), - /* K1 */ be_const_int(0), - /* K2 */ be_nested_str_weak(parse_http_status_line), - /* K3 */ be_const_int(1), - /* K4 */ be_nested_str_weak(parse_http_headers), - /* K5 */ be_const_int(2), - /* K6 */ be_nested_str_weak(parse_http_payload), - }), - be_str_weak(parse_http_response), - &be_const_str_solidified, - ( &(const binstruction[18]) { /* code */ - 0x88040100, // 0000 GETMBR R1 R0 K0 - 0x1C040301, // 0001 EQ R1 R1 K1 - 0x78060002, // 0002 JMPF R1 #0006 - 0x8C040102, // 0003 GETMET R1 R0 K2 - 0x7C040200, // 0004 CALL R1 1 - 0x7002000A, // 0005 JMP #0011 - 0x88040100, // 0006 GETMBR R1 R0 K0 - 0x1C040303, // 0007 EQ R1 R1 K3 - 0x78060002, // 0008 JMPF R1 #000C - 0x8C040104, // 0009 GETMET R1 R0 K4 - 0x7C040200, // 000A CALL R1 1 - 0x70020004, // 000B JMP #0011 - 0x88040100, // 000C GETMBR R1 R0 K0 - 0x1C040305, // 000D EQ R1 R1 K5 - 0x78060001, // 000E JMPF R1 #0011 - 0x8C040106, // 000F GETMET R1 R0 K6 - 0x7C040200, // 0010 CALL R1 1 - 0x80000000, // 0011 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: begin -********************************************************************/ -be_local_closure(Matter_HTTP_async_begin, /* name */ - be_nested_proto( - 4, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 2]) { /* constants */ - /* K0 */ be_nested_str_weak(begin), - /* K1 */ be_nested_str_weak(cmd), - }), - be_str_weak(begin), - &be_const_str_solidified, - ( &(const binstruction[ 7]) { /* code */ - 0x60080003, // 0000 GETGBL R2 G3 - 0x5C0C0000, // 0001 MOVE R3 R0 - 0x7C080200, // 0002 CALL R2 1 - 0x8C080500, // 0003 GETMET R2 R2 K0 - 0x7C080200, // 0004 CALL R2 1 - 0x90020201, // 0005 SETMBR R0 K1 R1 - 0x80040400, // 0006 RET 1 R2 - }) - ) -); -/*******************************************************************/ - - /******************************************************************** ** Solidified function: event_http_timeout ********************************************************************/ @@ -909,114 +971,6 @@ be_local_closure(Matter_HTTP_async_event_http_timeout, /* name */ /*******************************************************************/ -/******************************************************************** -** Solidified function: event_refused -********************************************************************/ -be_local_closure(Matter_HTTP_async_event_refused, /* name */ - be_nested_proto( - 3, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 2]) { /* constants */ - /* K0 */ be_nested_str_weak(http_status), - /* K1 */ be_nested_str_weak(event_http_failed), - }), - be_str_weak(event_refused), - &be_const_str_solidified, - ( &(const binstruction[ 5]) { /* code */ - 0x5405FFFE, // 0000 LDINT R1 -1 - 0x90020001, // 0001 SETMBR R0 K0 R1 - 0x8C040101, // 0002 GETMET R1 R0 K1 - 0x7C040200, // 0003 CALL R1 1 - 0x80000000, // 0004 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: send_http -********************************************************************/ -be_local_closure(Matter_HTTP_async_send_http, /* name */ - be_nested_proto( - 9, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[18]) { /* constants */ - /* K0 */ be_nested_str_weak(string), - /* K1 */ be_nested_str_weak(response), - /* K2 */ be_nested_str_weak(), - /* K3 */ be_nested_str_weak(addr), - /* K4 */ be_nested_str_weak(find), - /* K5 */ be_nested_str_weak(_X3A), - /* K6 */ be_const_int(0), - /* K7 */ be_nested_str_weak(_X5B), - /* K8 */ be_nested_str_weak(_X5D), - /* K9 */ be_nested_str_weak(format), - /* K10 */ be_nested_str_weak(HTTP_GET), - /* K11 */ be_nested_str_weak(cmd), - /* K12 */ be_nested_str_weak(port), - /* K13 */ be_nested_str_weak(write), - /* K14 */ be_nested_str_weak(close), - /* K15 */ be_nested_str_weak(status), - /* K16 */ be_nested_str_weak(http_status), - /* K17 */ be_nested_str_weak(event_http_failed), - }), - be_str_weak(send_http), - &be_const_str_solidified, - ( &(const binstruction[35]) { /* code */ - 0xA4060000, // 0000 IMPORT R1 K0 - 0x90020302, // 0001 SETMBR R0 K1 K2 - 0x88080103, // 0002 GETMBR R2 R0 K3 - 0x8C0C0304, // 0003 GETMET R3 R1 K4 - 0x5C140400, // 0004 MOVE R5 R2 - 0x58180005, // 0005 LDCONST R6 K5 - 0x7C0C0600, // 0006 CALL R3 3 - 0x280C0706, // 0007 GE R3 R3 K6 - 0x780E0002, // 0008 JMPF R3 #000C - 0x000E0E02, // 0009 ADD R3 K7 R2 - 0x000C0708, // 000A ADD R3 R3 K8 - 0x5C080600, // 000B MOVE R2 R3 - 0x8C0C0309, // 000C GETMET R3 R1 K9 - 0x8814010A, // 000D GETMBR R5 R0 K10 - 0x8818010B, // 000E GETMBR R6 R0 K11 - 0x5C1C0400, // 000F MOVE R7 R2 - 0x8820010C, // 0010 GETMBR R8 R0 K12 - 0x7C0C0A00, // 0011 CALL R3 5 - 0x8C10010D, // 0012 GETMET R4 R0 K13 - 0x5C180600, // 0013 MOVE R6 R3 - 0x7C100400, // 0014 CALL R4 2 - 0x6014000C, // 0015 GETGBL R5 G12 - 0x5C180600, // 0016 MOVE R6 R3 - 0x7C140200, // 0017 CALL R5 1 - 0x20140805, // 0018 NE R5 R4 R5 - 0x78160007, // 0019 JMPF R5 #0022 - 0x8C14010E, // 001A GETMET R5 R0 K14 - 0x7C140200, // 001B CALL R5 1 - 0x5415FFFB, // 001C LDINT R5 -4 - 0x90021E05, // 001D SETMBR R0 K15 R5 - 0x5415FFFE, // 001E LDINT R5 -1 - 0x90022005, // 001F SETMBR R0 K16 R5 - 0x8C140111, // 0020 GETMET R5 R0 K17 - 0x7C140200, // 0021 CALL R5 1 - 0x80000000, // 0022 RET 0 - }) - ) -); -/*******************************************************************/ - - /******************************************************************** ** Solidified function: event_http_headers_end ********************************************************************/ @@ -1055,6 +1009,87 @@ be_local_closure(Matter_HTTP_async_event_http_headers_end, /* name */ /*******************************************************************/ +/******************************************************************** +** Solidified function: event_http_header +********************************************************************/ +be_local_closure(Matter_HTTP_async_event_http_header, /* name */ + be_nested_proto( + 7, /* nstack */ + 3, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 5]) { /* constants */ + /* K0 */ be_nested_str_weak(string), + /* K1 */ be_nested_str_weak(tolower), + /* K2 */ be_nested_str_weak(transfer_X2Dencoding), + /* K3 */ be_nested_str_weak(chunked), + /* K4 */ be_nested_str_weak(is_chunked), + }), + be_str_weak(event_http_header), + &be_const_str_solidified, + ( &(const binstruction[19]) { /* code */ + 0xA40E0000, // 0000 IMPORT R3 K0 + 0x8C100701, // 0001 GETMET R4 R3 K1 + 0x5C180200, // 0002 MOVE R6 R1 + 0x7C100400, // 0003 CALL R4 2 + 0x5C040800, // 0004 MOVE R1 R4 + 0x8C100701, // 0005 GETMET R4 R3 K1 + 0x5C180400, // 0006 MOVE R6 R2 + 0x7C100400, // 0007 CALL R4 2 + 0x5C080800, // 0008 MOVE R2 R4 + 0x1C100302, // 0009 EQ R4 R1 K2 + 0x78120006, // 000A JMPF R4 #0012 + 0x8C100701, // 000B GETMET R4 R3 K1 + 0x5C180400, // 000C MOVE R6 R2 + 0x7C100400, // 000D CALL R4 2 + 0x1C100903, // 000E EQ R4 R4 K3 + 0x78120001, // 000F JMPF R4 #0012 + 0x50100200, // 0010 LDBOOL R4 1 0 + 0x90020804, // 0011 SETMBR R0 K4 R4 + 0x80000000, // 0012 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: begin +********************************************************************/ +be_local_closure(Matter_HTTP_async_begin, /* name */ + be_nested_proto( + 4, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 2]) { /* constants */ + /* K0 */ be_nested_str_weak(begin), + /* K1 */ be_nested_str_weak(cmd), + }), + be_str_weak(begin), + &be_const_str_solidified, + ( &(const binstruction[ 7]) { /* code */ + 0x60080003, // 0000 GETGBL R2 G3 + 0x5C0C0000, // 0001 MOVE R3 R0 + 0x7C080200, // 0002 CALL R2 1 + 0x8C080500, // 0003 GETMET R2 R2 K0 + 0x7C080200, // 0004 CALL R2 1 + 0x90020201, // 0005 SETMBR R0 K1 R1 + 0x80040400, // 0006 RET 1 R2 + }) + ) +); +/*******************************************************************/ + + /******************************************************************** ** Solidified class: Matter_HTTP_async ********************************************************************/ @@ -1062,44 +1097,45 @@ extern const bclass be_class_Matter_TCP_async; be_local_class(Matter_HTTP_async, 9, &be_class_Matter_TCP_async, - be_nested_map(36, + be_nested_map(37, ( (struct bmapnode*) &(const bmapnode[]) { - { be_const_key_weak(phase, -1), be_const_var(6) }, - { be_const_key_weak(event_http_headers_end, -1), be_const_closure(Matter_HTTP_async_event_http_headers_end_closure) }, - { be_const_key_weak(HTTP_GET, -1), be_nested_str_weak(GET_X20_X25s_X20HTTP_X2F1_X2E1_X0D_X0AHost_X20_X25s_X3A_X25s_X0D_X0AConnection_X3A_X20close_X0D_X0A_X0D_X0A) }, - { be_const_key_weak(send_http, 18), be_const_closure(Matter_HTTP_async_send_http_closure) }, - { be_const_key_weak(event_refused, 17), be_const_closure(Matter_HTTP_async_event_refused_closure) }, - { be_const_key_weak(payload, -1), be_const_var(4) }, - { be_const_key_weak(response, 20), be_const_var(1) }, - { be_const_key_weak(parse_http_status_line, -1), be_const_closure(Matter_HTTP_async_parse_http_status_line_closure) }, + { be_const_key_weak(init, 2), be_const_closure(Matter_HTTP_async_init_closure) }, + { be_const_key_weak(response, 28), be_const_var(1) }, + { be_const_key_weak(http_status, -1), be_const_var(5) }, + { be_const_key_weak(HTTP_STATUS_REGEX, 14), be_nested_str_weak(HTTP_X2F1_X5C_X2E_X5B0_X2D1_X5D_X20_X28_X5Cd_X2B_X29_X20_X2E_X2A_X3F_X0D_X0A) }, + { be_const_key_weak(HTTP_GET, 8), be_nested_str_weak(GET_X20_X25s_X20HTTP_X2F1_X2E1_X0D_X0AHost_X20_X25s_X3A_X25s_X0D_X0AConnection_X3A_X20close_X0D_X0A_X0D_X0A) }, + { be_const_key_weak(response_offset, -1), be_const_var(2) }, + { be_const_key_weak(compile_re, -1), be_const_closure(Matter_HTTP_async_compile_re_closure) }, { be_const_key_weak(event_http_header, -1), be_const_closure(Matter_HTTP_async_event_http_header_closure) }, - { be_const_key_weak(status_code, -1), be_const_var(3) }, - { be_const_key_weak(event_http_timeout, -1), be_const_closure(Matter_HTTP_async_event_http_timeout_closure) }, - { be_const_key_weak(cmd, -1), be_const_var(0) }, - { be_const_key_weak(event_http_failed, 4), be_const_closure(Matter_HTTP_async_event_http_failed_closure) }, - { be_const_key_weak(begin, -1), be_const_closure(Matter_HTTP_async_begin_closure) }, - { be_const_key_weak(chunk_size, 24), be_const_var(8) }, - { be_const_key_weak(init, 25), be_const_closure(Matter_HTTP_async_init_closure) }, - { be_const_key_weak(begin_sync, -1), be_const_closure(Matter_HTTP_async_begin_sync_closure) }, - { be_const_key_weak(reset, 33), be_const_closure(Matter_HTTP_async_reset_closure) }, - { be_const_key_weak(parse_http_headers, 22), be_const_closure(Matter_HTTP_async_parse_http_headers_closure) }, - { be_const_key_weak(event_http_finished, 23), be_const_closure(Matter_HTTP_async_event_http_finished_closure) }, - { be_const_key_weak(HTTP_BODY_REGEX, 34), be_nested_str_weak(_X0D_X0A) }, { be_const_key_weak(event_http_status_code, -1), be_const_closure(Matter_HTTP_async_event_http_status_code_closure) }, + { be_const_key_weak(payload, -1), be_const_var(4) }, + { be_const_key_weak(event_available, -1), be_const_closure(Matter_HTTP_async_event_available_closure) }, + { be_const_key_weak(chunk_size, 16), be_const_var(8) }, + { be_const_key_weak(event_http_timeout, -1), be_const_closure(Matter_HTTP_async_event_http_timeout_closure) }, { be_const_key_weak(parse_http_payload, -1), be_const_closure(Matter_HTTP_async_parse_http_payload_closure) }, - { be_const_key_weak(HTTP_CHUNK_REGEX, -1), be_nested_str_weak(_X0D_X0A_X28_X5BA_X2DFa_X2Df0_X2D9_X5D_X2B_X29_X5B_X20_X09_X5D_X2A_X2E_X2A_X3F_X0D_X0A) }, - { be_const_key_weak(compile_re, 31), be_const_closure(Matter_HTTP_async_compile_re_closure) }, - { be_const_key_weak(event_timeout, 11), be_const_closure(Matter_HTTP_async_event_timeout_closure) }, - { be_const_key_weak(receive, -1), be_const_closure(Matter_HTTP_async_receive_closure) }, - { be_const_key_weak(HTTP_HEADER_REGEX, 19), be_nested_str_weak(_X28_X5BA_X2DZa_X2Dz0_X2D9_X2D_X5D_X2B_X29_X3A_X20_X28_X2E_X2A_X3F_X29_X0D_X0A) }, - { be_const_key_weak(http_status, 3), be_const_var(5) }, - { be_const_key_weak(parse_http_response, -1), be_const_closure(Matter_HTTP_async_parse_http_response_closure) }, - { be_const_key_weak(is_chunked, 13), be_const_var(7) }, + { be_const_key_weak(parse_http_status_line, 29), be_const_closure(Matter_HTTP_async_parse_http_status_line_closure) }, + { be_const_key_weak(begin_sync, -1), be_const_closure(Matter_HTTP_async_begin_sync_closure) }, + { be_const_key_weak(cmd, -1), be_const_var(0) }, + { be_const_key_weak(event_http_failed, 13), be_const_closure(Matter_HTTP_async_event_http_failed_closure) }, { be_const_key_weak(SPINLOCK, -1), be_const_int(5) }, - { be_const_key_weak(response_offset, 10), be_const_var(2) }, - { be_const_key_weak(HTTP_STATUS_REGEX, -1), be_nested_str_weak(HTTP_X2F1_X5C_X2E_X5B0_X2D1_X5D_X20_X28_X5Cd_X2B_X29_X20_X2E_X2A_X3F_X0D_X0A) }, - { be_const_key_weak(event_established, -1), be_const_closure(Matter_HTTP_async_event_established_closure) }, - { be_const_key_weak(event_available, 1), be_const_closure(Matter_HTTP_async_event_available_closure) }, + { be_const_key_weak(reset, 31), be_const_closure(Matter_HTTP_async_reset_closure) }, + { be_const_key_weak(send_http, -1), be_const_closure(Matter_HTTP_async_send_http_closure) }, + { be_const_key_weak(parse_http_response, 15), be_const_closure(Matter_HTTP_async_parse_http_response_closure) }, + { be_const_key_weak(event_http_finished, -1), be_const_closure(Matter_HTTP_async_event_http_finished_closure) }, + { be_const_key_weak(HTTP_BODY_REGEX, -1), be_nested_str_weak(_X0D_X0A) }, + { be_const_key_weak(event_refused, -1), be_const_closure(Matter_HTTP_async_event_refused_closure) }, + { be_const_key_weak(HTTP_HEADER_REGEX, -1), be_nested_str_weak(_X28_X5BA_X2DZa_X2Dz0_X2D9_X2D_X5D_X2B_X29_X3A_X20_X28_X2E_X2A_X3F_X29_X0D_X0A) }, + { be_const_key_weak(is_chunked, 25), be_const_var(7) }, + { be_const_key_weak(event_established, 24), be_const_closure(Matter_HTTP_async_event_established_closure) }, + { be_const_key_weak(HTTP_CHUNK_REGEX, -1), be_nested_str_weak(_X0D_X0A_X28_X5BA_X2DFa_X2Df0_X2D9_X5D_X2B_X29_X5B_X20_X09_X5D_X2A_X2E_X2A_X3F_X0D_X0A) }, + { be_const_key_weak(receive, -1), be_const_closure(Matter_HTTP_async_receive_closure) }, + { be_const_key_weak(event_closed, -1), be_const_closure(Matter_HTTP_async_event_closed_closure) }, + { be_const_key_weak(phase, -1), be_const_var(6) }, + { be_const_key_weak(parse_http_headers, -1), be_const_closure(Matter_HTTP_async_parse_http_headers_closure) }, + { be_const_key_weak(event_timeout, 12), be_const_closure(Matter_HTTP_async_event_timeout_closure) }, + { be_const_key_weak(event_http_headers_end, -1), be_const_closure(Matter_HTTP_async_event_http_headers_end_closure) }, + { be_const_key_weak(status_code, 7), be_const_var(3) }, + { be_const_key_weak(begin, -1), be_const_closure(Matter_HTTP_async_begin_closure) }, })), be_str_weak(Matter_HTTP_async) ); From 5c3a6d9170f56350fa867a2ed2ab8d7633733734 Mon Sep 17 00:00:00 2001 From: s-hadinger <49731213+s-hadinger@users.noreply.github.com> Date: Tue, 6 Jun 2023 18:28:49 +0200 Subject: [PATCH 231/289] Matter fix illuminance (#18806) --- ...Matter_Plugin_Bridge_Sensor_Illuminance.be | 6 +++- .../Matter_Plugin_Sensor_Illuminance.be | 6 +++- ..._Matter_Plugin_Bridge_Sensor_Illuminance.h | 35 ++++++++++++------- ...idified_Matter_Plugin_Sensor_Illuminance.h | 35 ++++++++++++------- 4 files changed, 56 insertions(+), 26 deletions(-) diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Sensor_Illuminance.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Sensor_Illuminance.be index ff92f6fcc..d19d89a8f 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Sensor_Illuminance.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Sensor_Illuminance.be @@ -50,7 +50,11 @@ class Matter_Plugin_Bridge_Sensor_Illuminance : Matter_Plugin_Bridge_Sensor # This must be overriden. # This allows to convert the raw sensor value to the target one, typically int def pre_value(val) - return val != nil ? int(val) : nil # value in lux + if val == nil return nil end + import math + + if val < 1 val = 1 end + return math.log10(val) * 10000 + 1 end ############################################################# diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor_Illuminance.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor_Illuminance.be index 0907b431b..c40b77f44 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor_Illuminance.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor_Illuminance.be @@ -40,7 +40,11 @@ class Matter_Plugin_Sensor_Illuminance : Matter_Plugin_Sensor # This must be overriden. # This allows to convert the raw sensor value to the target one, typically int def pre_value(val) - return val != nil ? int(val) : nil # value in lux + if val == nil return nil end + import math + + if val < 1 val = 1 end + return math.log10(val) * 10000 + 1 end ############################################################# diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Sensor_Illuminance.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Sensor_Illuminance.h index 2db6b0396..56eb9dec2 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Sensor_Illuminance.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Sensor_Illuminance.h @@ -11,27 +11,38 @@ extern const bclass be_class_Matter_Plugin_Bridge_Sensor_Illuminance; ********************************************************************/ be_local_closure(Matter_Plugin_Bridge_Sensor_Illuminance_pre_value, /* name */ be_nested_proto( - 4, /* nstack */ + 6, /* nstack */ 2, /* argc */ 2, /* varg */ 0, /* has upvals */ NULL, /* no upvals */ 0, /* has sup protos */ NULL, /* no sub protos */ - 0, /* has constants */ - NULL, /* no const */ + 1, /* has constants */ + ( &(const bvalue[ 3]) { /* constants */ + /* K0 */ be_nested_str_weak(math), + /* K1 */ be_const_int(1), + /* K2 */ be_nested_str_weak(log10), + }), be_str_weak(pre_value), &be_const_str_solidified, - ( &(const binstruction[ 9]) { /* code */ + ( &(const binstruction[16]) { /* code */ 0x4C080000, // 0000 LDNIL R2 - 0x20080202, // 0001 NE R2 R1 R2 - 0x780A0003, // 0002 JMPF R2 #0007 - 0x60080009, // 0003 GETGBL R2 G9 - 0x5C0C0200, // 0004 MOVE R3 R1 - 0x7C080200, // 0005 CALL R2 1 - 0x70020000, // 0006 JMP #0008 - 0x4C080000, // 0007 LDNIL R2 - 0x80040400, // 0008 RET 1 R2 + 0x1C080202, // 0001 EQ R2 R1 R2 + 0x780A0001, // 0002 JMPF R2 #0005 + 0x4C080000, // 0003 LDNIL R2 + 0x80040400, // 0004 RET 1 R2 + 0xA40A0000, // 0005 IMPORT R2 K0 + 0x140C0301, // 0006 LT R3 R1 K1 + 0x780E0000, // 0007 JMPF R3 #0009 + 0x58040001, // 0008 LDCONST R1 K1 + 0x8C0C0502, // 0009 GETMET R3 R2 K2 + 0x5C140200, // 000A MOVE R5 R1 + 0x7C0C0400, // 000B CALL R3 2 + 0x5412270F, // 000C LDINT R4 10000 + 0x080C0604, // 000D MUL R3 R3 R4 + 0x000C0701, // 000E ADD R3 R3 K1 + 0x80040600, // 000F RET 1 R3 }) ) ); diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor_Illuminance.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor_Illuminance.h index 99cba6068..ff0488cb6 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor_Illuminance.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor_Illuminance.h @@ -121,27 +121,38 @@ be_local_closure(Matter_Plugin_Sensor_Illuminance_read_attribute, /* name */ ********************************************************************/ be_local_closure(Matter_Plugin_Sensor_Illuminance_pre_value, /* name */ be_nested_proto( - 4, /* nstack */ + 6, /* nstack */ 2, /* argc */ 2, /* varg */ 0, /* has upvals */ NULL, /* no upvals */ 0, /* has sup protos */ NULL, /* no sub protos */ - 0, /* has constants */ - NULL, /* no const */ + 1, /* has constants */ + ( &(const bvalue[ 3]) { /* constants */ + /* K0 */ be_nested_str_weak(math), + /* K1 */ be_const_int(1), + /* K2 */ be_nested_str_weak(log10), + }), be_str_weak(pre_value), &be_const_str_solidified, - ( &(const binstruction[ 9]) { /* code */ + ( &(const binstruction[16]) { /* code */ 0x4C080000, // 0000 LDNIL R2 - 0x20080202, // 0001 NE R2 R1 R2 - 0x780A0003, // 0002 JMPF R2 #0007 - 0x60080009, // 0003 GETGBL R2 G9 - 0x5C0C0200, // 0004 MOVE R3 R1 - 0x7C080200, // 0005 CALL R2 1 - 0x70020000, // 0006 JMP #0008 - 0x4C080000, // 0007 LDNIL R2 - 0x80040400, // 0008 RET 1 R2 + 0x1C080202, // 0001 EQ R2 R1 R2 + 0x780A0001, // 0002 JMPF R2 #0005 + 0x4C080000, // 0003 LDNIL R2 + 0x80040400, // 0004 RET 1 R2 + 0xA40A0000, // 0005 IMPORT R2 K0 + 0x140C0301, // 0006 LT R3 R1 K1 + 0x780E0000, // 0007 JMPF R3 #0009 + 0x58040001, // 0008 LDCONST R1 K1 + 0x8C0C0502, // 0009 GETMET R3 R2 K2 + 0x5C140200, // 000A MOVE R5 R1 + 0x7C0C0400, // 000B CALL R3 2 + 0x5412270F, // 000C LDINT R4 10000 + 0x080C0604, // 000D MUL R3 R3 R4 + 0x000C0701, // 000E ADD R3 R3 K1 + 0x80040600, // 000F RET 1 R3 }) ) ); From 73c48ff5f0b3a1c07799196711ad59a60f9cc667 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ludovic=20BOU=C3=89?= Date: Tue, 6 Jun 2023 19:16:03 +0200 Subject: [PATCH 232/289] Update be_matter_vendors.h - Adding Nabu Casa vendor id (#18804) * Update be_matter_vendors.h Adding Nabu Casa vendor id * Update be_matter_vendors.h Move it to the end of the list --- lib/libesp32/berry_matter/generate/be_matter_vendors.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lib/libesp32/berry_matter/generate/be_matter_vendors.h b/lib/libesp32/berry_matter/generate/be_matter_vendors.h index 44b96de6d..3b06fc094 100644 --- a/lib/libesp32/berry_matter/generate/be_matter_vendors.h +++ b/lib/libesp32/berry_matter/generate/be_matter_vendors.h @@ -87,6 +87,8 @@ const matter_vendor_t matter_Vendors[] = { { 0x142D, "QH"}, { 0x142F, "QIACHIP"}, { 0x6006, "Google LLC"}, + + { 0x134B, "Nabu Casa"}, { 0xFFFF, NULL }, }; From 5a8f13d57ffb63efdfdaa01a578f46af63cc321e Mon Sep 17 00:00:00 2001 From: blakadder Date: Wed, 7 Jun 2023 12:34:44 +0200 Subject: [PATCH 233/289] Pdm_mic (#18807) * add I2S LSB flag * add support for PDM microphones --- tasmota/tasmota_xdrv_driver/xdrv_42_1_i2s_mp3mic.ino | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/tasmota/tasmota_xdrv_driver/xdrv_42_1_i2s_mp3mic.ino b/tasmota/tasmota_xdrv_driver/xdrv_42_1_i2s_mp3mic.ino index 01a41f959..8aeb37339 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_42_1_i2s_mp3mic.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_42_1_i2s_mp3mic.ino @@ -79,8 +79,12 @@ esp_err_t err = ESP_OK; #ifdef USE_I2S_MIC // mic select to GND - i2s_config.mode = (i2s_mode_t)(I2S_MODE_MASTER | I2S_MODE_RX | I2S_MODE_TX); - i2s_config.communication_format = I2S_COMM_FORMAT_STAND_I2S; + #ifdef MIC_PDM + i2s_config.mode = (i2s_mode_t)(I2S_MODE_MASTER | I2S_MODE_RX | I2S_MODE_PDM); + #else + i2s_config.mode = (i2s_mode_t)(I2S_MODE_MASTER | I2S_MODE_RX | I2S_MODE_TX); + i2s_config.communication_format = I2S_COMM_FORMAT_STAND_I2S; + #endif #endif #ifdef ESP32S3_BOX From f572d93ac6580f8f45147a2ac1d72cd82948deae Mon Sep 17 00:00:00 2001 From: s-hadinger <49731213+s-hadinger@users.noreply.github.com> Date: Wed, 7 Jun 2023 19:23:28 +0200 Subject: [PATCH 234/289] Matter minor fixes (#18813) --- .../berry_matter/src/be_matter_module.c | 2 + .../src/embedded/Matter_Plugin_Bridge_HTTP.be | 3 +- .../embedded/Matter_Plugin_Bridge_Light0.be | 2 +- .../embedded/Matter_Plugin_Bridge_Light1.be | 2 +- .../embedded/Matter_Plugin_Bridge_Light2.be | 2 +- .../embedded/Matter_Plugin_Bridge_Light3.be | 6 +- .../embedded/Matter_Plugin_Bridge_OnOff.be | 2 +- .../Matter_Plugin_Bridge_Sensor_Humidity.be | 2 +- ...Matter_Plugin_Bridge_Sensor_Illuminance.be | 2 +- .../Matter_Plugin_Bridge_Sensor_Occupancy.be | 10 +- .../Matter_Plugin_Bridge_Sensor_Pressure.be | 2 +- .../Matter_Plugin_Bridge_Sensor_Temp.be | 2 +- .../src/embedded/Matter_Plugin_Device.be | 28 +- .../src/embedded/Matter_Plugin_Light3.be | 2 +- .../embedded/Matter_Plugin_Sensor_OnOff.be | 2 +- .../berry_matter/src/embedded/Matter_TLV.be | 6 + .../berry_matter/src/embedded/Matter_UI.be | 2 +- .../solidified_Matter_Plugin_Bridge_HTTP.h | 17 +- .../solidified_Matter_Plugin_Bridge_Light0.h | 3 +- .../solidified_Matter_Plugin_Bridge_Light1.h | 3 +- .../solidified_Matter_Plugin_Bridge_Light2.h | 3 +- .../solidified_Matter_Plugin_Bridge_Light3.h | 15 +- .../solidified_Matter_Plugin_Bridge_OnOff.h | 3 +- ...ied_Matter_Plugin_Bridge_Sensor_Humidity.h | 3 +- ..._Matter_Plugin_Bridge_Sensor_Illuminance.h | 3 +- ...ed_Matter_Plugin_Bridge_Sensor_Occupancy.h | 3 +- ...ied_Matter_Plugin_Bridge_Sensor_Pressure.h | 3 +- ...idified_Matter_Plugin_Bridge_Sensor_Temp.h | 3 +- .../solidified_Matter_Plugin_Device.h | 382 +++++++++++------- .../solidified_Matter_Plugin_Light3.h | 2 +- .../solidified_Matter_Plugin_Sensor_OnOff.h | 2 +- .../src/solidify/solidified_Matter_UI.h | 2 +- 32 files changed, 320 insertions(+), 204 deletions(-) diff --git a/lib/libesp32/berry_matter/src/be_matter_module.c b/lib/libesp32/berry_matter/src/be_matter_module.c index 72deac883..6f7af2ab0 100644 --- a/lib/libesp32/berry_matter/src/be_matter_module.c +++ b/lib/libesp32/berry_matter/src/be_matter_module.c @@ -227,6 +227,7 @@ extern const bclass be_class_Matter_TLV; // need to declare it upfront because #include "solidify/solidified_Matter_Plugin_Bridge_Sensor_Illuminance.h" #include "solidify/solidified_Matter_Plugin_Bridge_Sensor_Humidity.h" #include "solidify/solidified_Matter_Plugin_Bridge_Sensor_Occupancy.h" +#include "solidify/solidified_Matter_Plugin_Sensor_OnOff.h" /*********************************************************************************************\ * Get a bytes() object of the certificate DAC/PAI_Cert @@ -416,6 +417,7 @@ module matter (scope: global, strings: weak) { Plugin_Sensor_Illuminance, class(be_class_Matter_Plugin_Sensor_Illuminance) // Illuminance Sensor Plugin_Sensor_Humidity, class(be_class_Matter_Plugin_Sensor_Humidity) // Humidity Sensor Plugin_Sensor_Occupancy, class(be_class_Matter_Plugin_Sensor_Occupancy) // Occupancy Sensor + Plugin_Sensor_OnOff, class(be_class_Matter_Plugin_Sensor_OnOff) // Simple OnOff Sensor Plugin_Bridge_HTTP, class(be_class_Matter_Plugin_Bridge_HTTP) // HTTP bridge superclass Plugin_Bridge_OnOff, class(be_class_Matter_Plugin_Bridge_OnOff) // HTTP Relay/Light behavior (OnOff) Plugin_Bridge_Light0, class(be_class_Matter_Plugin_Bridge_Light0) // HTTP OnOff Light diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_HTTP.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_HTTP.be index 12c487449..6a08b3427 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_HTTP.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_HTTP.be @@ -46,7 +46,6 @@ class Matter_Plugin_Bridge_HTTP : Matter_Plugin_Device # 0x0039: [0x11] # Bridged Device Basic Information 9.13 p.485 } - # static var TYPES = { 0x010A: 2 } # On/Off Light var http_remote # instance of Matter_HTTP_remote @@ -179,6 +178,8 @@ class Matter_Plugin_Bridge_HTTP : Matter_Plugin_Device if attribute == 0x0011 # ---------- Reachable / bool ---------- # self.is_reachable_lazy_sync() # Not needed anymore return TLV.create_TLV(TLV.BOOL, self.http_remote.reachable) # TODO find a way to do a ping + else + return super(self).read_attribute(session, ctx) end else diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Light0.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Light0.be index 7c1802264..b58d42de9 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Light0.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Light0.be @@ -40,7 +40,7 @@ class Matter_Plugin_Bridge_Light0 : Matter_Plugin_Bridge_HTTP # 0x0005: inherited # Scenes 1.4 p.30 - no writable 0x0006: [0,0xFFFC,0xFFFD], # On/Off 1.5 p.48 } - static var TYPES = { 0x0100: 2, 0x0013: 1 } # OnOff Light, but not actually used because Relay is managed by OnOff + static var TYPES = { 0x0100: 2 } # OnOff Light, but not actually used because Relay is managed by OnOff var tasmota_relay_index # Relay number in Tasmota (one based) var shadow_onoff # fake status for now # TODO diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Light1.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Light1.be index bd51c6e0e..a8caa761f 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Light1.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Light1.be @@ -39,7 +39,7 @@ class Matter_Plugin_Bridge_Light1 : Matter_Plugin_Bridge_Light0 # 0x0006: inherited # On/Off 1.5 p.48 0x0008: [0,2,3,0x0F,0x11,0xFFFC,0xFFFD], # Level Control 1.6 p.57 } - static var TYPES = { 0x0101: 2, 0x0013: 1 } # Dimmable Light + static var TYPES = { 0x0101: 2 } # Dimmable Light var shadow_bri # var tasmota_relay_index # ingerited diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Light2.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Light2.be index 39abe4beb..4e0217eac 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Light2.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Light2.be @@ -40,7 +40,7 @@ class Matter_Plugin_Bridge_Light2 : Matter_Plugin_Bridge_Light1 # 0x0008: inherited # Level Control 1.6 p.57 0x0300: [7,8,0xF,0x400A,0x400B,0x400C,0xFFFC,0xFFFD], # Color Control 3.2 p.111 } - static var TYPES = { 0x010C: 2, 0x0013: 1 } # Dimmable Light + static var TYPES = { 0x010C: 2 } # Dimmable Light var shadow_ct var ct_min, ct_max diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Light3.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Light3.be index 8bfdc19e4..c9856a318 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Light3.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Light3.be @@ -40,7 +40,7 @@ class Matter_Plugin_Bridge_Light3 : Matter_Plugin_Bridge_Light1 # 0x0008: inherited # Level Control 1.6 p.57 0x0300: [0,1,7,8,0xF,0x4001,0x400A,0xFFFC,0xFFFD],# Color Control 3.2 p.111 } - static var TYPES = { 0x010D: 2, 0x0013: 1 } # Extended Color Light + static var TYPES = { 0x010D: 2 } # Extended Color Light var shadow_hue, shadow_sat # 0..254 @@ -124,13 +124,13 @@ class Matter_Plugin_Bridge_Light3 : Matter_Plugin_Bridge_Light1 return TLV.create_TLV(TLV.U1, 0) elif attribute == 0x4001 # ---------- EnhancedColorMode / u1 ---------- return TLV.create_TLV(TLV.U1, 0) + elif attribute == 0x400A # ---------- ColorCapabilities / map32 ---------- + return TLV.create_TLV(TLV.U4, 0x01) # HS # Defined Primaries Information Attribute Set elif attribute == 0x0010 # ---------- NumberOfPrimaries / u1 ---------- return TLV.create_TLV(TLV.U1, 0) - elif attribute == 0x400A # ---------- ColorCapabilities / map32 ---------- - return TLV.create_TLV(TLV.U4, 0x01) elif attribute == 0xFFFC # ---------- FeatureMap / map32 ---------- return TLV.create_TLV(TLV.U4, 0x01) # HS elif attribute == 0xFFFD # ---------- ClusterRevision / u2 ---------- diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_OnOff.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_OnOff.be index 96ca06eec..1552c0e6e 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_OnOff.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_OnOff.be @@ -29,7 +29,7 @@ class Matter_Plugin_Bridge_Light0 end class Matter_Plugin_Bridge_OnOff : Matter_Plugin_Bridge_Light0 static var TYPE = "http_relay" # name of the plug-in in json static var NAME = "🔗 Relay" # display name of the plug-in - static var TYPES = { 0x010A: 2, 0x0013: 1 } # On/Off Plug-in Unit + static var TYPES = { 0x010A: 2 } # On/Off Plug-in Unit ############################################################# # web_values diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Sensor_Humidity.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Sensor_Humidity.be index 5c10a5283..ab314be2b 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Sensor_Humidity.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Sensor_Humidity.be @@ -33,7 +33,7 @@ class Matter_Plugin_Bridge_Sensor_Humidity : Matter_Plugin_Bridge_Sensor static var CLUSTERS = { 0x0405: [0,1,2,0xFFFC,0xFFFD], # Humidity Measurement p.102 - no writable } - static var TYPES = { 0x0307: 2, 0x0013: 1 } # Humidity Sensor, rev 2 + static var TYPES = { 0x0307: 2 } # Humidity Sensor, rev 2 ############################################################# # Called when the value changed compared to shadow value diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Sensor_Illuminance.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Sensor_Illuminance.be index d19d89a8f..8864e6802 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Sensor_Illuminance.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Sensor_Illuminance.be @@ -33,7 +33,7 @@ class Matter_Plugin_Bridge_Sensor_Illuminance : Matter_Plugin_Bridge_Sensor static var CLUSTERS = { 0x0400: [0,1,2,0xFFFC,0xFFFD], # Illuminance Measurement p.95 - no writable } - static var TYPES = { 0x0106: 2, 0x0013: 1 } # Illuminance Sensor, rev 2 + static var TYPES = { 0x0106: 2 } # Illuminance Sensor, rev 2 ############################################################# # Called when the value changed compared to shadow value diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Sensor_Occupancy.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Sensor_Occupancy.be index 1c9fd8a00..1cf6e56fa 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Sensor_Occupancy.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Sensor_Occupancy.be @@ -27,17 +27,17 @@ class Matter_Plugin_Bridge_HTTP end #@ solidify:Matter_Plugin_Bridge_Sensor_Occupancy,weak class Matter_Plugin_Bridge_Sensor_Occupancy : Matter_Plugin_Bridge_HTTP - static var TYPE = "http_occupancy" # name of the plug-in in json - static var NAME = "🔗 Occupancy" # display name of the plug-in - static var ARG = "switch" # additional argument name (or empty if none) + static var TYPE = "http_occupancy" # name of the plug-in in json + static var NAME = "🔗 Occupancy" # display name of the plug-in + static var ARG = "switch" # additional argument name (or empty if none) static var ARG_TYPE = / x -> int(x) # function to convert argument to the right type static var UPDATE_TIME = 5000 # update every 5s - static var UPDATE_CMD = "Status 8" # command to send for updates + static var UPDATE_CMD = "Status 8" # command to send for updates static var CLUSTERS = { 0x0406: [0,1,2,0xFFFC,0xFFFD], # Occupancy Sensing p.105 - no writable } - static var TYPES = { 0x0107: 2, 0x0013: 1 } # Occupancy Sensor, rev 2 + static var TYPES = { 0x0107: 2 } # Occupancy Sensor, rev 2 var tasmota_switch_index # Switch number in Tasmota (one based) var shadow_occupancy diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Sensor_Pressure.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Sensor_Pressure.be index 74aec0828..3b7930d40 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Sensor_Pressure.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Sensor_Pressure.be @@ -33,7 +33,7 @@ class Matter_Plugin_Bridge_Sensor_Pressure : Matter_Plugin_Bridge_Sensor static var CLUSTERS = { 0x0403: [0,1,2,0xFFFC,0xFFFD], # Pressure Measurement } - static var TYPES = { 0x0305: 2, 0x0013: 1 } # Temperature Sensor, rev 2 + static var TYPES = { 0x0305: 2 } # Temperature Sensor, rev 2 ############################################################# # Called when the value changed compared to shadow value diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Sensor_Temp.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Sensor_Temp.be index 42aa90bc9..8d8d51969 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Sensor_Temp.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Sensor_Temp.be @@ -33,7 +33,7 @@ class Matter_Plugin_Bridge_Sensor_Temp : Matter_Plugin_Bridge_Sensor static var CLUSTERS = { 0x0402: [0,1,2,0xFFFC,0xFFFD], # Temperature Measurement p.97 - no writable } - static var TYPES = { 0x0302: 2, 0x0013: 1 } # Temperature Sensor, rev 2 + static var TYPES = { 0x0302: 2 } # Temperature Sensor, rev 2 ############################################################# # Called when the value changed compared to shadow value diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Device.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Device.be index a69dce90d..c35de9d4a 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Device.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Device.be @@ -27,11 +27,13 @@ class Matter_Plugin end class Matter_Plugin_Device : Matter_Plugin static var CLUSTERS = { # 0x001D: inherited # Descriptor Cluster 9.5 p.453 + 0x0039: [0x11], # Bridged Device Basic Information 9.13 p.485 0x0003: [0,1,0xFFFC,0xFFFD], # Identify 1.2 p.16 0x0004: [0,0xFFFC,0xFFFD], # Groups 1.3 p.21 0x0005: [0,1,2,3,4,5,0xFFFC,0xFFFD], # Scenes 1.4 p.30 - no writable } - static var TYPES = { 0x0000: 0 } # fake type + static var TYPES = { 0x0013: 1 } # fake type + static var NON_BRIDGE_VENDOR = [ 0x1217, 0x1381 ] # Fabric VendorID not supporting Bridge mode ############################################################# # Constructor @@ -78,6 +80,30 @@ class Matter_Plugin_Device : Matter_Plugin return TLV.create_TLV(TLV.U4, 4) # 0 = no Level Control for Lighting end + # ==================================================================================================== + elif cluster == 0x001D # ========== Descriptor Cluster 9.5 p.453 ========== + + if attribute == 0x0000 # ---------- DeviceTypeList / list[DeviceTypeStruct] ---------- + # for device sub-classes, automatically add the Bridge Node type `0x0013: 1` + # unless the fabric doesn't support bridge mode (currently Alexa) + var dtl = TLV.Matter_TLV_array() + var types = self.TYPES + for dt: types.keys() + var d1 = dtl.add_struct() + d1.add_TLV(0, TLV.U2, dt) # DeviceType + d1.add_TLV(1, TLV.U2, types[dt]) # Revision + end + # if fabric is not Alexa + if self.NON_BRIDGE_VENDOR.find(session.get_admin_vendor()) == nil + var d1 = dtl.add_struct() + d1.add_TLV(0, TLV.U2, 0x0013) # DeviceType + d1.add_TLV(1, TLV.U2, 1) # Revision + end + return dtl + else + return super(self).read_attribute(session, ctx) + end + else return super(self).read_attribute(session, ctx) end diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Light3.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Light3.be index acfa4b17f..ad408a6cf 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Light3.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Light3.be @@ -92,7 +92,7 @@ class Matter_Plugin_Light3 : Matter_Plugin_Light1 elif attribute == 0x4001 # ---------- EnhancedColorMode / u1 ---------- return TLV.create_TLV(TLV.U1, 0) elif attribute == 0x400A # ---------- ColorCapabilities / map2 ---------- - return TLV.create_TLV(TLV.U1, 0) + return TLV.create_TLV(TLV.U1, 0x01) # HS # Defined Primaries Information Attribute Set elif attribute == 0x0010 # ---------- NumberOfPrimaries / u1 ---------- diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor_OnOff.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor_OnOff.be index be1184866..7df4da0b6 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor_OnOff.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor_OnOff.be @@ -25,7 +25,7 @@ class Matter_Plugin_Device end #@ solidify:Matter_Plugin_Sensor_OnOff,weak class Matter_Plugin_Sensor_OnOff : Matter_Plugin_Device - static var TYPE = "occupancy" # name of the plug-in in json + static var TYPE = "onoff" # name of the plug-in in json static var NAME = "OnOff" # display name of the plug-in static var ARG = "switch" # additional argument name (or empty if none) static var ARG_TYPE = / x -> int(x) # function to convert argument to the right type diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_TLV.be b/lib/libesp32/berry_matter/src/embedded/Matter_TLV.be index 24c4567e2..563d64f24 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_TLV.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_TLV.be @@ -921,6 +921,12 @@ test_TLV(bytes("0001"), "1") test_TLV(bytes("08"), "false") test_TLV(bytes("09"), "true") +var TLV = matter.TLV +assert(TLV.create_TLV(TLV.BOOL, 1).tlv2raw() == bytes("09")) +assert(TLV.create_TLV(TLV.BOOL, true).tlv2raw() == bytes("09")) +assert(TLV.create_TLV(TLV.BOOL, 0).tlv2raw() == bytes("08")) +assert(TLV.create_TLV(TLV.BOOL, false).tlv2raw() == bytes("08")) + test_TLV(bytes("00FF"), "-1") test_TLV(bytes("05FFFF"), "65535U") diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_UI.be b/lib/libesp32/berry_matter/src/embedded/Matter_UI.be index 88249ba97..2043f1851 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_UI.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_UI.be @@ -33,7 +33,7 @@ import matter ################################################################################# class Matter_UI static var _CLASSES_TYPES = "|relay|light0|light1|light2|light3|shutter|shutter+tilt" - "|temperature|pressure|illuminance|humidity|occupancy" + "|temperature|pressure|illuminance|humidity|occupancy|onoff" static var _CLASSES_TYPES2= "-http|http_relay|http_light0|http_light1|http_light2|http_light3" "|http_temperature|http_pressure|http_illuminance|http_humidity" "|http_occupancy" diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_HTTP.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_HTTP.h index 377e8f6f0..63cd5cde2 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_HTTP.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_HTTP.h @@ -472,17 +472,17 @@ be_local_closure(Matter_Plugin_Bridge_HTTP_read_attribute, /* name */ }), be_str_weak(read_attribute), &be_const_str_solidified, - ( &(const binstruction[26]) { /* code */ + ( &(const binstruction[35]) { /* code */ 0xB80E0000, // 0000 GETNGBL R3 K0 0x880C0701, // 0001 GETMBR R3 R3 K1 0x88100502, // 0002 GETMBR R4 R2 K2 0x88140503, // 0003 GETMBR R5 R2 K3 0x541A0038, // 0004 LDINT R6 57 0x1C180806, // 0005 EQ R6 R4 R6 - 0x781A0009, // 0006 JMPF R6 #0011 + 0x781A0012, // 0006 JMPF R6 #001A 0x541A0010, // 0007 LDINT R6 17 0x1C180A06, // 0008 EQ R6 R5 R6 - 0x781A0005, // 0009 JMPF R6 #0010 + 0x781A0006, // 0009 JMPF R6 #0011 0x8C180704, // 000A GETMET R6 R3 K4 0x88200705, // 000B GETMBR R8 R3 K5 0x88240106, // 000C GETMBR R9 R0 K6 @@ -498,7 +498,16 @@ be_local_closure(Matter_Plugin_Bridge_HTTP_read_attribute, /* name */ 0x5C240400, // 0016 MOVE R9 R2 0x7C180600, // 0017 CALL R6 3 0x80040C00, // 0018 RET 1 R6 - 0x80000000, // 0019 RET 0 + 0x70020007, // 0019 JMP #0022 + 0x60180003, // 001A GETGBL R6 G3 + 0x5C1C0000, // 001B MOVE R7 R0 + 0x7C180200, // 001C CALL R6 1 + 0x8C180D08, // 001D GETMET R6 R6 K8 + 0x5C200200, // 001E MOVE R8 R1 + 0x5C240400, // 001F MOVE R9 R2 + 0x7C180600, // 0020 CALL R6 3 + 0x80040C00, // 0021 RET 1 R6 + 0x80000000, // 0022 RET 0 }) ) ); diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Light0.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Light0.h index 25839355b..e3f26664b 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Light0.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Light0.h @@ -421,10 +421,9 @@ be_local_class(Matter_Plugin_Bridge_Light0, { be_const_key_weak(NAME, -1), be_nested_str_weak(_X26_X23x1F517_X3B_X20Light_X200_X20On) }, { be_const_key_weak(tasmota_relay_index, -1), be_const_var(0) }, { be_const_key_weak(TYPES, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { - be_const_map( * be_nested_map(2, + be_const_map( * be_nested_map(1, ( (struct bmapnode*) &(const bmapnode[]) { { be_const_key_int(256, -1), be_const_int(2) }, - { be_const_key_int(19, -1), be_const_int(1) }, })) ) } )) }, { be_const_key_weak(CLUSTERS, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { be_const_map( * be_nested_map(1, diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Light1.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Light1.h index d82710edf..9662d78a6 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Light1.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Light1.h @@ -503,10 +503,9 @@ be_local_class(Matter_Plugin_Bridge_Light1, { be_const_key_weak(web_value_dimmer, -1), be_const_closure(Matter_Plugin_Bridge_Light1_web_value_dimmer_closure) }, { be_const_key_weak(parse_update, -1), be_const_closure(Matter_Plugin_Bridge_Light1_parse_update_closure) }, { be_const_key_weak(TYPES, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { - be_const_map( * be_nested_map(2, + be_const_map( * be_nested_map(1, ( (struct bmapnode*) &(const bmapnode[]) { { be_const_key_int(257, -1), be_const_int(2) }, - { be_const_key_int(19, 0), be_const_int(1) }, })) ) } )) }, { be_const_key_weak(read_attribute, -1), be_const_closure(Matter_Plugin_Bridge_Light1_read_attribute_closure) }, { be_const_key_weak(TYPE, 2), be_nested_str_weak(http_light1) }, diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Light2.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Light2.h index 637895aae..726a0fbb5 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Light2.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Light2.h @@ -563,10 +563,9 @@ be_local_class(Matter_Plugin_Bridge_Light2, })) ) } )) }, })) ) } )) }, { be_const_key_weak(TYPES, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { - be_const_map( * be_nested_map(2, + be_const_map( * be_nested_map(1, ( (struct bmapnode*) &(const bmapnode[]) { { be_const_key_int(268, -1), be_const_int(2) }, - { be_const_key_int(19, -1), be_const_int(1) }, })) ) } )) }, { be_const_key_weak(web_value_ct, -1), be_const_closure(Matter_Plugin_Bridge_Light2_web_value_ct_closure) }, { be_const_key_weak(set_ct, -1), be_const_closure(Matter_Plugin_Bridge_Light2_set_ct_closure) }, diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Light3.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Light3.h index ddbedf913..ca4edad38 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Light3.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Light3.h @@ -561,21 +561,21 @@ be_local_closure(Matter_Plugin_Bridge_Light3_read_attribute, /* name */ 0x7C1C0600, // 004F CALL R7 3 0x80040E00, // 0050 RET 1 R7 0x70020022, // 0051 JMP #0075 - 0x541E000F, // 0052 LDINT R7 16 + 0x541E4009, // 0052 LDINT R7 16394 0x1C1C0C07, // 0053 EQ R7 R6 R7 0x781E0005, // 0054 JMPF R7 #005B 0x8C1C0908, // 0055 GETMET R7 R4 K8 - 0x88240909, // 0056 GETMBR R9 R4 K9 - 0x58280006, // 0057 LDCONST R10 K6 + 0x8824090D, // 0056 GETMBR R9 R4 K13 + 0x5828000B, // 0057 LDCONST R10 K11 0x7C1C0600, // 0058 CALL R7 3 0x80040E00, // 0059 RET 1 R7 0x70020019, // 005A JMP #0075 - 0x541E4009, // 005B LDINT R7 16394 + 0x541E000F, // 005B LDINT R7 16 0x1C1C0C07, // 005C EQ R7 R6 R7 0x781E0005, // 005D JMPF R7 #0064 0x8C1C0908, // 005E GETMET R7 R4 K8 - 0x8824090D, // 005F GETMBR R9 R4 K13 - 0x5828000B, // 0060 LDCONST R10 K11 + 0x88240909, // 005F GETMBR R9 R4 K9 + 0x58280006, // 0060 LDCONST R10 K6 0x7C1C0600, // 0061 CALL R7 3 0x80040E00, // 0062 RET 1 R7 0x70020010, // 0063 JMP #0075 @@ -715,10 +715,9 @@ be_local_class(Matter_Plugin_Bridge_Light3, { be_const_key_weak(invoke_request, -1), be_const_closure(Matter_Plugin_Bridge_Light3_invoke_request_closure) }, { be_const_key_weak(NAME, -1), be_nested_str_weak(_X26_X23x1F517_X3B_X20Light_X203_X20RGB) }, { be_const_key_weak(TYPES, 11), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { - be_const_map( * be_nested_map(2, + be_const_map( * be_nested_map(1, ( (struct bmapnode*) &(const bmapnode[]) { { be_const_key_int(269, -1), be_const_int(2) }, - { be_const_key_int(19, 0), be_const_int(1) }, })) ) } )) }, { be_const_key_weak(shadow_hue, 6), be_const_var(0) }, { be_const_key_weak(set_hue, -1), be_const_closure(Matter_Plugin_Bridge_Light3_set_hue_closure) }, diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_OnOff.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_OnOff.h index a547e02c6..e8ad2ea11 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_OnOff.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_OnOff.h @@ -63,10 +63,9 @@ be_local_class(Matter_Plugin_Bridge_OnOff, { be_const_key_weak(TYPE, -1), be_nested_str_weak(http_relay) }, { be_const_key_weak(NAME, 3), be_nested_str_weak(_X26_X23x1F517_X3B_X20Relay) }, { be_const_key_weak(TYPES, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { - be_const_map( * be_nested_map(2, + be_const_map( * be_nested_map(1, ( (struct bmapnode*) &(const bmapnode[]) { { be_const_key_int(266, -1), be_const_int(2) }, - { be_const_key_int(19, -1), be_const_int(1) }, })) ) } )) }, })), be_str_weak(Matter_Plugin_Bridge_OnOff) diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Sensor_Humidity.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Sensor_Humidity.h index 1fa58bec6..7b37b1c0e 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Sensor_Humidity.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Sensor_Humidity.h @@ -261,10 +261,9 @@ be_local_class(Matter_Plugin_Bridge_Sensor_Humidity, { be_const_key_weak(TYPE, 4), be_nested_str_weak(http_humidity) }, { be_const_key_weak(NAME, -1), be_nested_str_weak(_X26_X23x1F517_X3B_X20Humidity) }, { be_const_key_weak(TYPES, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { - be_const_map( * be_nested_map(2, + be_const_map( * be_nested_map(1, ( (struct bmapnode*) &(const bmapnode[]) { { be_const_key_int(775, -1), be_const_int(2) }, - { be_const_key_int(19, 0), be_const_int(1) }, })) ) } )) }, })), be_str_weak(Matter_Plugin_Bridge_Sensor_Humidity) diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Sensor_Illuminance.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Sensor_Illuminance.h index 56eb9dec2..e113d191e 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Sensor_Illuminance.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Sensor_Illuminance.h @@ -263,10 +263,9 @@ be_local_class(Matter_Plugin_Bridge_Sensor_Illuminance, { be_const_key_weak(TYPE, 4), be_nested_str_weak(http_illuminance) }, { be_const_key_weak(NAME, -1), be_nested_str_weak(_X26_X23x1F517_X3B_X20Illuminance) }, { be_const_key_weak(TYPES, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { - be_const_map( * be_nested_map(2, + be_const_map( * be_nested_map(1, ( (struct bmapnode*) &(const bmapnode[]) { { be_const_key_int(262, -1), be_const_int(2) }, - { be_const_key_int(19, -1), be_const_int(1) }, })) ) } )) }, })), be_str_weak(Matter_Plugin_Bridge_Sensor_Illuminance) diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Sensor_Occupancy.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Sensor_Occupancy.h index 5edda2ce7..a89bb35fe 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Sensor_Occupancy.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Sensor_Occupancy.h @@ -326,10 +326,9 @@ be_local_class(Matter_Plugin_Bridge_Sensor_Occupancy, { be_const_key_weak(NAME, -1), be_nested_str_weak(_X26_X23x1F517_X3B_X20Occupancy) }, { be_const_key_weak(init, -1), be_const_closure(Matter_Plugin_Bridge_Sensor_Occupancy_init_closure) }, { be_const_key_weak(TYPES, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { - be_const_map( * be_nested_map(2, + be_const_map( * be_nested_map(1, ( (struct bmapnode*) &(const bmapnode[]) { { be_const_key_int(263, -1), be_const_int(2) }, - { be_const_key_int(19, 0), be_const_int(1) }, })) ) } )) }, { be_const_key_weak(ARG_TYPE, 12), be_const_static_closure(Matter_Plugin_Bridge_Sensor_Occupancy__X3Clambda_X3E_closure) }, { be_const_key_weak(parse_update, -1), be_const_closure(Matter_Plugin_Bridge_Sensor_Occupancy_parse_update_closure) }, diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Sensor_Pressure.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Sensor_Pressure.h index 3b36094c4..795ca6577 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Sensor_Pressure.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Sensor_Pressure.h @@ -252,10 +252,9 @@ be_local_class(Matter_Plugin_Bridge_Sensor_Pressure, { be_const_key_weak(TYPE, 4), be_nested_str_weak(http_pressure) }, { be_const_key_weak(NAME, -1), be_nested_str_weak(_X26_X23x1F517_X3B_X20Pressure) }, { be_const_key_weak(TYPES, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { - be_const_map( * be_nested_map(2, + be_const_map( * be_nested_map(1, ( (struct bmapnode*) &(const bmapnode[]) { { be_const_key_int(773, -1), be_const_int(2) }, - { be_const_key_int(19, 0), be_const_int(1) }, })) ) } )) }, })), be_str_weak(Matter_Plugin_Bridge_Sensor_Pressure) diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Sensor_Temp.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Sensor_Temp.h index fb5ab423a..e4e35379a 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Sensor_Temp.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Sensor_Temp.h @@ -258,10 +258,9 @@ be_local_class(Matter_Plugin_Bridge_Sensor_Temp, { be_const_key_weak(TYPE, 4), be_nested_str_weak(http_temperature) }, { be_const_key_weak(NAME, -1), be_nested_str_weak(_X26_X23x1F517_X3B_X20Temperature) }, { be_const_key_weak(TYPES, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { - be_const_map( * be_nested_map(2, + be_const_map( * be_nested_map(1, ( (struct bmapnode*) &(const bmapnode[]) { { be_const_key_int(770, -1), be_const_int(2) }, - { be_const_key_int(19, -1), be_const_int(1) }, })) ) } )) }, })), be_str_weak(Matter_Plugin_Bridge_Sensor_Temp) diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Device.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Device.h index 054d6a0db..dbdfafee4 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Device.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Device.h @@ -6,140 +6,6 @@ extern const bclass be_class_Matter_Plugin_Device; -/******************************************************************** -** Solidified function: read_attribute -********************************************************************/ -be_local_closure(Matter_Plugin_Device_read_attribute, /* name */ - be_nested_proto( - 11, /* nstack */ - 3, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[13]) { /* constants */ - /* K0 */ be_nested_str_weak(string), - /* K1 */ be_nested_str_weak(matter), - /* K2 */ be_nested_str_weak(TLV), - /* K3 */ be_nested_str_weak(cluster), - /* K4 */ be_nested_str_weak(attribute), - /* K5 */ be_const_int(3), - /* K6 */ be_const_int(0), - /* K7 */ be_nested_str_weak(create_TLV), - /* K8 */ be_nested_str_weak(U2), - /* K9 */ be_const_int(1), - /* K10 */ be_nested_str_weak(U1), - /* K11 */ be_nested_str_weak(U4), - /* K12 */ be_nested_str_weak(read_attribute), - }), - be_str_weak(read_attribute), - &be_const_str_solidified, - ( &(const binstruction[97]) { /* code */ - 0xA40E0000, // 0000 IMPORT R3 K0 - 0xB8120200, // 0001 GETNGBL R4 K1 - 0x88100902, // 0002 GETMBR R4 R4 K2 - 0x88140503, // 0003 GETMBR R5 R2 K3 - 0x88180504, // 0004 GETMBR R6 R2 K4 - 0x1C1C0B05, // 0005 EQ R7 R5 K5 - 0x781E0021, // 0006 JMPF R7 #0029 - 0x1C1C0D06, // 0007 EQ R7 R6 K6 - 0x781E0005, // 0008 JMPF R7 #000F - 0x8C1C0907, // 0009 GETMET R7 R4 K7 - 0x88240908, // 000A GETMBR R9 R4 K8 - 0x58280006, // 000B LDCONST R10 K6 - 0x7C1C0600, // 000C CALL R7 3 - 0x80040E00, // 000D RET 1 R7 - 0x70020018, // 000E JMP #0028 - 0x1C1C0D09, // 000F EQ R7 R6 K9 - 0x781E0005, // 0010 JMPF R7 #0017 - 0x8C1C0907, // 0011 GETMET R7 R4 K7 - 0x8824090A, // 0012 GETMBR R9 R4 K10 - 0x58280006, // 0013 LDCONST R10 K6 - 0x7C1C0600, // 0014 CALL R7 3 - 0x80040E00, // 0015 RET 1 R7 - 0x70020010, // 0016 JMP #0028 - 0x541EFFFB, // 0017 LDINT R7 65532 - 0x1C1C0C07, // 0018 EQ R7 R6 R7 - 0x781E0005, // 0019 JMPF R7 #0020 - 0x8C1C0907, // 001A GETMET R7 R4 K7 - 0x8824090B, // 001B GETMBR R9 R4 K11 - 0x58280006, // 001C LDCONST R10 K6 - 0x7C1C0600, // 001D CALL R7 3 - 0x80040E00, // 001E RET 1 R7 - 0x70020007, // 001F JMP #0028 - 0x541EFFFC, // 0020 LDINT R7 65533 - 0x1C1C0C07, // 0021 EQ R7 R6 R7 - 0x781E0004, // 0022 JMPF R7 #0028 - 0x8C1C0907, // 0023 GETMET R7 R4 K7 - 0x8824090B, // 0024 GETMBR R9 R4 K11 - 0x542A0003, // 0025 LDINT R10 4 - 0x7C1C0600, // 0026 CALL R7 3 - 0x80040E00, // 0027 RET 1 R7 - 0x70020036, // 0028 JMP #0060 - 0x541E0003, // 0029 LDINT R7 4 - 0x1C1C0A07, // 002A EQ R7 R5 R7 - 0x781E0016, // 002B JMPF R7 #0043 - 0x1C1C0D06, // 002C EQ R7 R6 K6 - 0x781E0002, // 002D JMPF R7 #0031 - 0x4C1C0000, // 002E LDNIL R7 - 0x80040E00, // 002F RET 1 R7 - 0x70020010, // 0030 JMP #0042 - 0x541EFFFB, // 0031 LDINT R7 65532 - 0x1C1C0C07, // 0032 EQ R7 R6 R7 - 0x781E0005, // 0033 JMPF R7 #003A - 0x8C1C0907, // 0034 GETMET R7 R4 K7 - 0x8824090B, // 0035 GETMBR R9 R4 K11 - 0x58280006, // 0036 LDCONST R10 K6 - 0x7C1C0600, // 0037 CALL R7 3 - 0x80040E00, // 0038 RET 1 R7 - 0x70020007, // 0039 JMP #0042 - 0x541EFFFC, // 003A LDINT R7 65533 - 0x1C1C0C07, // 003B EQ R7 R6 R7 - 0x781E0004, // 003C JMPF R7 #0042 - 0x8C1C0907, // 003D GETMET R7 R4 K7 - 0x8824090B, // 003E GETMBR R9 R4 K11 - 0x542A0003, // 003F LDINT R10 4 - 0x7C1C0600, // 0040 CALL R7 3 - 0x80040E00, // 0041 RET 1 R7 - 0x7002001C, // 0042 JMP #0060 - 0x541E0004, // 0043 LDINT R7 5 - 0x1C1C0A07, // 0044 EQ R7 R5 R7 - 0x781E0011, // 0045 JMPF R7 #0058 - 0x541EFFFB, // 0046 LDINT R7 65532 - 0x1C1C0C07, // 0047 EQ R7 R6 R7 - 0x781E0005, // 0048 JMPF R7 #004F - 0x8C1C0907, // 0049 GETMET R7 R4 K7 - 0x8824090B, // 004A GETMBR R9 R4 K11 - 0x58280006, // 004B LDCONST R10 K6 - 0x7C1C0600, // 004C CALL R7 3 - 0x80040E00, // 004D RET 1 R7 - 0x70020007, // 004E JMP #0057 - 0x541EFFFC, // 004F LDINT R7 65533 - 0x1C1C0C07, // 0050 EQ R7 R6 R7 - 0x781E0004, // 0051 JMPF R7 #0057 - 0x8C1C0907, // 0052 GETMET R7 R4 K7 - 0x8824090B, // 0053 GETMBR R9 R4 K11 - 0x542A0003, // 0054 LDINT R10 4 - 0x7C1C0600, // 0055 CALL R7 3 - 0x80040E00, // 0056 RET 1 R7 - 0x70020007, // 0057 JMP #0060 - 0x601C0003, // 0058 GETGBL R7 G3 - 0x5C200000, // 0059 MOVE R8 R0 - 0x7C1C0200, // 005A CALL R7 1 - 0x8C1C0F0C, // 005B GETMET R7 R7 K12 - 0x5C240200, // 005C MOVE R9 R1 - 0x5C280400, // 005D MOVE R10 R2 - 0x7C1C0600, // 005E CALL R7 3 - 0x80040E00, // 005F RET 1 R7 - 0x80000000, // 0060 RET 0 - }) - ) -); -/*******************************************************************/ - - /******************************************************************** ** Solidified function: invoke_request ********************************************************************/ @@ -226,6 +92,211 @@ be_local_closure(Matter_Plugin_Device_invoke_request, /* name */ /*******************************************************************/ +/******************************************************************** +** Solidified function: read_attribute +********************************************************************/ +be_local_closure(Matter_Plugin_Device_read_attribute, /* name */ + be_nested_proto( + 17, /* nstack */ + 3, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[22]) { /* constants */ + /* K0 */ be_nested_str_weak(string), + /* K1 */ be_nested_str_weak(matter), + /* K2 */ be_nested_str_weak(TLV), + /* K3 */ be_nested_str_weak(cluster), + /* K4 */ be_nested_str_weak(attribute), + /* K5 */ be_const_int(3), + /* K6 */ be_const_int(0), + /* K7 */ be_nested_str_weak(create_TLV), + /* K8 */ be_nested_str_weak(U2), + /* K9 */ be_const_int(1), + /* K10 */ be_nested_str_weak(U1), + /* K11 */ be_nested_str_weak(U4), + /* K12 */ be_nested_str_weak(Matter_TLV_array), + /* K13 */ be_nested_str_weak(TYPES), + /* K14 */ be_nested_str_weak(keys), + /* K15 */ be_nested_str_weak(add_struct), + /* K16 */ be_nested_str_weak(add_TLV), + /* K17 */ be_nested_str_weak(stop_iteration), + /* K18 */ be_nested_str_weak(NON_BRIDGE_VENDOR), + /* K19 */ be_nested_str_weak(find), + /* K20 */ be_nested_str_weak(get_admin_vendor), + /* K21 */ be_nested_str_weak(read_attribute), + }), + be_str_weak(read_attribute), + &be_const_str_solidified, + ( &(const binstruction[159]) { /* code */ + 0xA40E0000, // 0000 IMPORT R3 K0 + 0xB8120200, // 0001 GETNGBL R4 K1 + 0x88100902, // 0002 GETMBR R4 R4 K2 + 0x88140503, // 0003 GETMBR R5 R2 K3 + 0x88180504, // 0004 GETMBR R6 R2 K4 + 0x1C1C0B05, // 0005 EQ R7 R5 K5 + 0x781E0021, // 0006 JMPF R7 #0029 + 0x1C1C0D06, // 0007 EQ R7 R6 K6 + 0x781E0005, // 0008 JMPF R7 #000F + 0x8C1C0907, // 0009 GETMET R7 R4 K7 + 0x88240908, // 000A GETMBR R9 R4 K8 + 0x58280006, // 000B LDCONST R10 K6 + 0x7C1C0600, // 000C CALL R7 3 + 0x80040E00, // 000D RET 1 R7 + 0x70020018, // 000E JMP #0028 + 0x1C1C0D09, // 000F EQ R7 R6 K9 + 0x781E0005, // 0010 JMPF R7 #0017 + 0x8C1C0907, // 0011 GETMET R7 R4 K7 + 0x8824090A, // 0012 GETMBR R9 R4 K10 + 0x58280006, // 0013 LDCONST R10 K6 + 0x7C1C0600, // 0014 CALL R7 3 + 0x80040E00, // 0015 RET 1 R7 + 0x70020010, // 0016 JMP #0028 + 0x541EFFFB, // 0017 LDINT R7 65532 + 0x1C1C0C07, // 0018 EQ R7 R6 R7 + 0x781E0005, // 0019 JMPF R7 #0020 + 0x8C1C0907, // 001A GETMET R7 R4 K7 + 0x8824090B, // 001B GETMBR R9 R4 K11 + 0x58280006, // 001C LDCONST R10 K6 + 0x7C1C0600, // 001D CALL R7 3 + 0x80040E00, // 001E RET 1 R7 + 0x70020007, // 001F JMP #0028 + 0x541EFFFC, // 0020 LDINT R7 65533 + 0x1C1C0C07, // 0021 EQ R7 R6 R7 + 0x781E0004, // 0022 JMPF R7 #0028 + 0x8C1C0907, // 0023 GETMET R7 R4 K7 + 0x8824090B, // 0024 GETMBR R9 R4 K11 + 0x542A0003, // 0025 LDINT R10 4 + 0x7C1C0600, // 0026 CALL R7 3 + 0x80040E00, // 0027 RET 1 R7 + 0x70020074, // 0028 JMP #009E + 0x541E0003, // 0029 LDINT R7 4 + 0x1C1C0A07, // 002A EQ R7 R5 R7 + 0x781E0016, // 002B JMPF R7 #0043 + 0x1C1C0D06, // 002C EQ R7 R6 K6 + 0x781E0002, // 002D JMPF R7 #0031 + 0x4C1C0000, // 002E LDNIL R7 + 0x80040E00, // 002F RET 1 R7 + 0x70020010, // 0030 JMP #0042 + 0x541EFFFB, // 0031 LDINT R7 65532 + 0x1C1C0C07, // 0032 EQ R7 R6 R7 + 0x781E0005, // 0033 JMPF R7 #003A + 0x8C1C0907, // 0034 GETMET R7 R4 K7 + 0x8824090B, // 0035 GETMBR R9 R4 K11 + 0x58280006, // 0036 LDCONST R10 K6 + 0x7C1C0600, // 0037 CALL R7 3 + 0x80040E00, // 0038 RET 1 R7 + 0x70020007, // 0039 JMP #0042 + 0x541EFFFC, // 003A LDINT R7 65533 + 0x1C1C0C07, // 003B EQ R7 R6 R7 + 0x781E0004, // 003C JMPF R7 #0042 + 0x8C1C0907, // 003D GETMET R7 R4 K7 + 0x8824090B, // 003E GETMBR R9 R4 K11 + 0x542A0003, // 003F LDINT R10 4 + 0x7C1C0600, // 0040 CALL R7 3 + 0x80040E00, // 0041 RET 1 R7 + 0x7002005A, // 0042 JMP #009E + 0x541E0004, // 0043 LDINT R7 5 + 0x1C1C0A07, // 0044 EQ R7 R5 R7 + 0x781E0011, // 0045 JMPF R7 #0058 + 0x541EFFFB, // 0046 LDINT R7 65532 + 0x1C1C0C07, // 0047 EQ R7 R6 R7 + 0x781E0005, // 0048 JMPF R7 #004F + 0x8C1C0907, // 0049 GETMET R7 R4 K7 + 0x8824090B, // 004A GETMBR R9 R4 K11 + 0x58280006, // 004B LDCONST R10 K6 + 0x7C1C0600, // 004C CALL R7 3 + 0x80040E00, // 004D RET 1 R7 + 0x70020007, // 004E JMP #0057 + 0x541EFFFC, // 004F LDINT R7 65533 + 0x1C1C0C07, // 0050 EQ R7 R6 R7 + 0x781E0004, // 0051 JMPF R7 #0057 + 0x8C1C0907, // 0052 GETMET R7 R4 K7 + 0x8824090B, // 0053 GETMBR R9 R4 K11 + 0x542A0003, // 0054 LDINT R10 4 + 0x7C1C0600, // 0055 CALL R7 3 + 0x80040E00, // 0056 RET 1 R7 + 0x70020045, // 0057 JMP #009E + 0x541E001C, // 0058 LDINT R7 29 + 0x1C1C0A07, // 0059 EQ R7 R5 R7 + 0x781E003A, // 005A JMPF R7 #0096 + 0x1C1C0D06, // 005B EQ R7 R6 K6 + 0x781E002F, // 005C JMPF R7 #008D + 0x8C1C090C, // 005D GETMET R7 R4 K12 + 0x7C1C0200, // 005E CALL R7 1 + 0x8820010D, // 005F GETMBR R8 R0 K13 + 0x60240010, // 0060 GETGBL R9 G16 + 0x8C28110E, // 0061 GETMET R10 R8 K14 + 0x7C280200, // 0062 CALL R10 1 + 0x7C240200, // 0063 CALL R9 1 + 0xA802000E, // 0064 EXBLK 0 #0074 + 0x5C281200, // 0065 MOVE R10 R9 + 0x7C280000, // 0066 CALL R10 0 + 0x8C2C0F0F, // 0067 GETMET R11 R7 K15 + 0x7C2C0200, // 0068 CALL R11 1 + 0x8C301710, // 0069 GETMET R12 R11 K16 + 0x58380006, // 006A LDCONST R14 K6 + 0x883C0908, // 006B GETMBR R15 R4 K8 + 0x5C401400, // 006C MOVE R16 R10 + 0x7C300800, // 006D CALL R12 4 + 0x8C301710, // 006E GETMET R12 R11 K16 + 0x58380009, // 006F LDCONST R14 K9 + 0x883C0908, // 0070 GETMBR R15 R4 K8 + 0x9440100A, // 0071 GETIDX R16 R8 R10 + 0x7C300800, // 0072 CALL R12 4 + 0x7001FFF0, // 0073 JMP #0065 + 0x58240011, // 0074 LDCONST R9 K17 + 0xAC240200, // 0075 CATCH R9 1 0 + 0xB0080000, // 0076 RAISE 2 R0 R0 + 0x88240112, // 0077 GETMBR R9 R0 K18 + 0x8C241313, // 0078 GETMET R9 R9 K19 + 0x8C2C0314, // 0079 GETMET R11 R1 K20 + 0x7C2C0200, // 007A CALL R11 1 + 0x7C240400, // 007B CALL R9 2 + 0x4C280000, // 007C LDNIL R10 + 0x1C24120A, // 007D EQ R9 R9 R10 + 0x7826000B, // 007E JMPF R9 #008B + 0x8C240F0F, // 007F GETMET R9 R7 K15 + 0x7C240200, // 0080 CALL R9 1 + 0x8C281310, // 0081 GETMET R10 R9 K16 + 0x58300006, // 0082 LDCONST R12 K6 + 0x88340908, // 0083 GETMBR R13 R4 K8 + 0x543A0012, // 0084 LDINT R14 19 + 0x7C280800, // 0085 CALL R10 4 + 0x8C281310, // 0086 GETMET R10 R9 K16 + 0x58300009, // 0087 LDCONST R12 K9 + 0x88340908, // 0088 GETMBR R13 R4 K8 + 0x58380009, // 0089 LDCONST R14 K9 + 0x7C280800, // 008A CALL R10 4 + 0x80040E00, // 008B RET 1 R7 + 0x70020007, // 008C JMP #0095 + 0x601C0003, // 008D GETGBL R7 G3 + 0x5C200000, // 008E MOVE R8 R0 + 0x7C1C0200, // 008F CALL R7 1 + 0x8C1C0F15, // 0090 GETMET R7 R7 K21 + 0x5C240200, // 0091 MOVE R9 R1 + 0x5C280400, // 0092 MOVE R10 R2 + 0x7C1C0600, // 0093 CALL R7 3 + 0x80040E00, // 0094 RET 1 R7 + 0x70020007, // 0095 JMP #009E + 0x601C0003, // 0096 GETGBL R7 G3 + 0x5C200000, // 0097 MOVE R8 R0 + 0x7C1C0200, // 0098 CALL R7 1 + 0x8C1C0F15, // 0099 GETMET R7 R7 K21 + 0x5C240200, // 009A MOVE R9 R1 + 0x5C280400, // 009B MOVE R10 R2 + 0x7C1C0600, // 009C CALL R7 3 + 0x80040E00, // 009D RET 1 R7 + 0x80000000, // 009E RET 0 + }) + ) +); +/*******************************************************************/ + + /******************************************************************** ** Solidified class: Matter_Plugin_Device ********************************************************************/ @@ -233,25 +304,35 @@ extern const bclass be_class_Matter_Plugin; be_local_class(Matter_Plugin_Device, 0, &be_class_Matter_Plugin, - be_nested_map(4, + be_nested_map(5, ( (struct bmapnode*) &(const bmapnode[]) { - { be_const_key_weak(CLUSTERS, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { - be_const_map( * be_nested_map(3, + { be_const_key_weak(TYPES, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { + be_const_map( * be_nested_map(1, ( (struct bmapnode*) &(const bmapnode[]) { - { be_const_key_int(3, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_list, { - be_const_list( * be_nested_list(4, - ( (struct bvalue*) &(const bvalue[]) { - be_const_int(0), - be_const_int(1), - be_const_int(65532), - be_const_int(65533), + { be_const_key_int(19, -1), be_const_int(1) }, })) ) } )) }, + { be_const_key_weak(read_attribute, -1), be_const_closure(Matter_Plugin_Device_read_attribute_closure) }, + { be_const_key_weak(invoke_request, 1), be_const_closure(Matter_Plugin_Device_invoke_request_closure) }, + { be_const_key_weak(NON_BRIDGE_VENDOR, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_list, { + be_const_list( * be_nested_list(2, + ( (struct bvalue*) &(const bvalue[]) { + be_const_int(4631), + be_const_int(4993), + })) ) } )) }, + { be_const_key_weak(CLUSTERS, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { + be_const_map( * be_nested_map(4, + ( (struct bmapnode*) &(const bmapnode[]) { { be_const_key_int(4, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_list, { be_const_list( * be_nested_list(3, ( (struct bvalue*) &(const bvalue[]) { be_const_int(0), be_const_int(65532), be_const_int(65533), + })) ) } )) }, + { be_const_key_int(57, 2), be_const_simple_instance(be_nested_simple_instance(&be_class_list, { + be_const_list( * be_nested_list(1, + ( (struct bvalue*) &(const bvalue[]) { + be_const_int(17), })) ) } )) }, { be_const_key_int(5, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_list, { be_const_list( * be_nested_list(8, @@ -265,14 +346,15 @@ be_local_class(Matter_Plugin_Device, be_const_int(65532), be_const_int(65533), })) ) } )) }, + { be_const_key_int(3, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_list, { + be_const_list( * be_nested_list(4, + ( (struct bvalue*) &(const bvalue[]) { + be_const_int(0), + be_const_int(1), + be_const_int(65532), + be_const_int(65533), })) ) } )) }, - { be_const_key_weak(TYPES, 0), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { - be_const_map( * be_nested_map(1, - ( (struct bmapnode*) &(const bmapnode[]) { - { be_const_key_int(0, -1), be_const_int(0) }, })) ) } )) }, - { be_const_key_weak(read_attribute, 1), be_const_closure(Matter_Plugin_Device_read_attribute_closure) }, - { be_const_key_weak(invoke_request, -1), be_const_closure(Matter_Plugin_Device_invoke_request_closure) }, })), be_str_weak(Matter_Plugin_Device) ); diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Light3.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Light3.h index 025159bc7..462c93f88 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Light3.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Light3.h @@ -206,7 +206,7 @@ be_local_closure(Matter_Plugin_Light3_read_attribute, /* name */ 0x781E0005, // 0040 JMPF R7 #0047 0x8C1C0907, // 0041 GETMET R7 R4 K7 0x88240908, // 0042 GETMBR R9 R4 K8 - 0x58280006, // 0043 LDCONST R10 K6 + 0x5828000A, // 0043 LDCONST R10 K10 0x7C1C0600, // 0044 CALL R7 3 0x80040E00, // 0045 RET 1 R7 0x70020019, // 0046 JMP #0061 diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor_OnOff.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor_OnOff.h index 3e14c2a04..3653ba167 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor_OnOff.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor_OnOff.h @@ -256,7 +256,7 @@ be_local_class(Matter_Plugin_Sensor_OnOff, be_nested_map(12, ( (struct bmapnode*) &(const bmapnode[]) { { be_const_key_weak(UPDATE_TIME, -1), be_const_int(5000) }, - { be_const_key_weak(TYPE, 11), be_nested_str_weak(occupancy) }, + { be_const_key_weak(TYPE, 11), be_nested_str_weak(onoff) }, { be_const_key_weak(TYPES, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { be_const_map( * be_nested_map(1, ( (struct bmapnode*) &(const bmapnode[]) { diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_UI.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_UI.h index 37d664f8c..0e88e8429 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_UI.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_UI.h @@ -2010,7 +2010,7 @@ be_local_class(Matter_UI, { be_const_key_weak(web_get_arg, -1), be_const_closure(Matter_UI_web_get_arg_closure) }, { be_const_key_weak(show_qrcode, 4), be_const_closure(Matter_UI_show_qrcode_closure) }, { be_const_key_weak(show_plugins_configuration, -1), be_const_closure(Matter_UI_show_plugins_configuration_closure) }, - { be_const_key_weak(_CLASSES_TYPES, -1), be_nested_str_weak(_X7Crelay_X7Clight0_X7Clight1_X7Clight2_X7Clight3_X7Cshutter_X7Cshutter_X2Btilt_X7Ctemperature_X7Cpressure_X7Cilluminance_X7Chumidity_X7Coccupancy) }, + { be_const_key_weak(_CLASSES_TYPES, -1), be_nested_str_weak(_X7Crelay_X7Clight0_X7Clight1_X7Clight2_X7Clight3_X7Cshutter_X7Cshutter_X2Btilt_X7Ctemperature_X7Cpressure_X7Cilluminance_X7Chumidity_X7Coccupancy_X7Conoff) }, { be_const_key_weak(web_sensor, -1), be_const_closure(Matter_UI_web_sensor_closure) }, { be_const_key_weak(web_add_config_button, -1), be_const_closure(Matter_UI_web_add_config_button_closure) }, { be_const_key_weak(_CLASSES_TYPES2, 7), be_nested_str_weak(_X2Dhttp_X7Chttp_relay_X7Chttp_light0_X7Chttp_light1_X7Chttp_light2_X7Chttp_light3_X7Chttp_temperature_X7Chttp_pressure_X7Chttp_illuminance_X7Chttp_humidity_X7Chttp_occupancy) }, From 4ce3e5c544cc4577ba998646e7882ad2e71c8089 Mon Sep 17 00:00:00 2001 From: s-hadinger <49731213+s-hadinger@users.noreply.github.com> Date: Wed, 7 Jun 2023 22:32:09 +0200 Subject: [PATCH 235/289] Matter fix Illuminance for 0 lux (#18818) --- ...Matter_Plugin_Bridge_Sensor_Illuminance.be | 7 +++-- .../Matter_Plugin_Sensor_Illuminance.be | 7 +++-- ..._Matter_Plugin_Bridge_Sensor_Illuminance.h | 27 ++++++++++--------- ...idified_Matter_Plugin_Sensor_Illuminance.h | 27 ++++++++++--------- 4 files changed, 40 insertions(+), 28 deletions(-) diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Sensor_Illuminance.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Sensor_Illuminance.be index 8864e6802..31776d0d8 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Sensor_Illuminance.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Sensor_Illuminance.be @@ -53,8 +53,11 @@ class Matter_Plugin_Bridge_Sensor_Illuminance : Matter_Plugin_Bridge_Sensor if val == nil return nil end import math - if val < 1 val = 1 end - return math.log10(val) * 10000 + 1 + if val < 1 + return 0 + else + return math.log10(val) * 10000 + 1 + end end ############################################################# diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor_Illuminance.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor_Illuminance.be index c40b77f44..0488a8e65 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor_Illuminance.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor_Illuminance.be @@ -43,8 +43,11 @@ class Matter_Plugin_Sensor_Illuminance : Matter_Plugin_Sensor if val == nil return nil end import math - if val < 1 val = 1 end - return math.log10(val) * 10000 + 1 + if val < 1 + return 0 + else + return math.log10(val) * 10000 + 1 + end end ############################################################# diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Sensor_Illuminance.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Sensor_Illuminance.h index e113d191e..051a2843e 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Sensor_Illuminance.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Sensor_Illuminance.h @@ -19,14 +19,15 @@ be_local_closure(Matter_Plugin_Bridge_Sensor_Illuminance_pre_value, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[ 3]) { /* constants */ + ( &(const bvalue[ 4]) { /* constants */ /* K0 */ be_nested_str_weak(math), /* K1 */ be_const_int(1), - /* K2 */ be_nested_str_weak(log10), + /* K2 */ be_const_int(0), + /* K3 */ be_nested_str_weak(log10), }), be_str_weak(pre_value), &be_const_str_solidified, - ( &(const binstruction[16]) { /* code */ + ( &(const binstruction[18]) { /* code */ 0x4C080000, // 0000 LDNIL R2 0x1C080202, // 0001 EQ R2 R1 R2 0x780A0001, // 0002 JMPF R2 #0005 @@ -34,15 +35,17 @@ be_local_closure(Matter_Plugin_Bridge_Sensor_Illuminance_pre_value, /* name */ 0x80040400, // 0004 RET 1 R2 0xA40A0000, // 0005 IMPORT R2 K0 0x140C0301, // 0006 LT R3 R1 K1 - 0x780E0000, // 0007 JMPF R3 #0009 - 0x58040001, // 0008 LDCONST R1 K1 - 0x8C0C0502, // 0009 GETMET R3 R2 K2 - 0x5C140200, // 000A MOVE R5 R1 - 0x7C0C0400, // 000B CALL R3 2 - 0x5412270F, // 000C LDINT R4 10000 - 0x080C0604, // 000D MUL R3 R3 R4 - 0x000C0701, // 000E ADD R3 R3 K1 - 0x80040600, // 000F RET 1 R3 + 0x780E0001, // 0007 JMPF R3 #000A + 0x80060400, // 0008 RET 1 K2 + 0x70020006, // 0009 JMP #0011 + 0x8C0C0503, // 000A GETMET R3 R2 K3 + 0x5C140200, // 000B MOVE R5 R1 + 0x7C0C0400, // 000C CALL R3 2 + 0x5412270F, // 000D LDINT R4 10000 + 0x080C0604, // 000E MUL R3 R3 R4 + 0x000C0701, // 000F ADD R3 R3 K1 + 0x80040600, // 0010 RET 1 R3 + 0x80000000, // 0011 RET 0 }) ) ); diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor_Illuminance.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor_Illuminance.h index ff0488cb6..9e1401e82 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor_Illuminance.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor_Illuminance.h @@ -129,14 +129,15 @@ be_local_closure(Matter_Plugin_Sensor_Illuminance_pre_value, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[ 3]) { /* constants */ + ( &(const bvalue[ 4]) { /* constants */ /* K0 */ be_nested_str_weak(math), /* K1 */ be_const_int(1), - /* K2 */ be_nested_str_weak(log10), + /* K2 */ be_const_int(0), + /* K3 */ be_nested_str_weak(log10), }), be_str_weak(pre_value), &be_const_str_solidified, - ( &(const binstruction[16]) { /* code */ + ( &(const binstruction[18]) { /* code */ 0x4C080000, // 0000 LDNIL R2 0x1C080202, // 0001 EQ R2 R1 R2 0x780A0001, // 0002 JMPF R2 #0005 @@ -144,15 +145,17 @@ be_local_closure(Matter_Plugin_Sensor_Illuminance_pre_value, /* name */ 0x80040400, // 0004 RET 1 R2 0xA40A0000, // 0005 IMPORT R2 K0 0x140C0301, // 0006 LT R3 R1 K1 - 0x780E0000, // 0007 JMPF R3 #0009 - 0x58040001, // 0008 LDCONST R1 K1 - 0x8C0C0502, // 0009 GETMET R3 R2 K2 - 0x5C140200, // 000A MOVE R5 R1 - 0x7C0C0400, // 000B CALL R3 2 - 0x5412270F, // 000C LDINT R4 10000 - 0x080C0604, // 000D MUL R3 R3 R4 - 0x000C0701, // 000E ADD R3 R3 K1 - 0x80040600, // 000F RET 1 R3 + 0x780E0001, // 0007 JMPF R3 #000A + 0x80060400, // 0008 RET 1 K2 + 0x70020006, // 0009 JMP #0011 + 0x8C0C0503, // 000A GETMET R3 R2 K3 + 0x5C140200, // 000B MOVE R5 R1 + 0x7C0C0400, // 000C CALL R3 2 + 0x5412270F, // 000D LDINT R4 10000 + 0x080C0604, // 000E MUL R3 R3 R4 + 0x000C0701, // 000F ADD R3 R3 K1 + 0x80040600, // 0010 RET 1 R3 + 0x80000000, // 0011 RET 0 }) ) ); From 2ffd4311c3afc4a3fa30e4c01d43aa8994a0697f Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Thu, 8 Jun 2023 13:01:24 +0200 Subject: [PATCH 236/289] Enable more esp32 libs by default (#18821) --- platformio_override_sample.ini | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/platformio_override_sample.ini b/platformio_override_sample.ini index 30ed067a2..7d9b1d9e8 100644 --- a/platformio_override_sample.ini +++ b/platformio_override_sample.ini @@ -132,9 +132,9 @@ lib_extra_dirs = ${library.lib_extra_dirs} ; *** comment the following line if you dont use LVGL in a Tasmota32 build. Reduces compile time lib/libesp32_lvgl ; *** comment the following line if you dont use ESP32 Audio in a Tasmota32 build. Reduces compile time -; lib/libesp32_audio + lib/libesp32_audio ; *** uncomment the following line if you use Bluetooth or Apple Homekit in a Tasmota32 build. Reduces compile time -; lib/libesp32_div + lib/libesp32_div ; *** uncomment the following line if you use Epaper driver epidy in your Tasmota32 build. Reduces compile time ; lib/libesp32_eink From ae67c6cfa1cb793cb35b4a8d4ac314a27aadc48d Mon Sep 17 00:00:00 2001 From: blakadder Date: Thu, 8 Jun 2023 16:24:44 +0200 Subject: [PATCH 237/289] Add support for INMP441 MEMS microphone (#18823) * Add INMP441 MEMS mic support * add I2S audio defines as preview --- .../xdrv_42_0_i2s_audio.ino | 12 ++++++++++ .../xdrv_42_1_i2s_mp3mic.ino | 24 +++++++++++-------- 2 files changed, 26 insertions(+), 10 deletions(-) diff --git a/tasmota/tasmota_xdrv_driver/xdrv_42_0_i2s_audio.ino b/tasmota/tasmota_xdrv_driver/xdrv_42_0_i2s_audio.ino index e86f92ad1..1b294ddfc 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_42_0_i2s_audio.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_42_0_i2s_audio.ino @@ -37,6 +37,18 @@ //#define USE_I2S_WEBRADIO // Add support for web radio //#define USE_I2S_SAY_TIME // Add support for english speaking clock //#define USE_I2S_RTTTL // Add support for Rtttl playback +//#define USE_LSB // Add support for LSBJ chips, e.g. TM8211/PT8211 +// Microphone support +//#define USE_I2S_MIC // Add support for I2S microphone + //#define MIC_CHANNELS 1 // 1 = mono (I2S_CHANNEL_FMT_ONLY_RIGHT), 2 = stereo (I2S_CHANNEL_FMT_RIGHT_LEFT) + //#define MICSRATE 32000 // Set sample rate + //#define USE_INMP441 // Add support for INMP441 MEMS microphone + //#define MIC_PDM // Set microphone as PDM (only on ESP32) +//#define USE_SHINE // Use MP3 encoding (only on ESP32 with PSRAM) +//#define MP3_MIC_STREAM // Add support for streaming microphone via http (only on ESP32 with PSRAM) + //#define MP3_STREAM_PORT 81 // Choose MP3 stream port (default = 81) +//#define I2S_BRIDGE // Add support for UDP PCM audio bridge + //#define I2S_BRIDGE_PORT 6970 // Set bridge port (default = 6970) #include "AudioFileSourcePROGMEM.h" #include "AudioFileSourceID3.h" diff --git a/tasmota/tasmota_xdrv_driver/xdrv_42_1_i2s_mp3mic.ino b/tasmota/tasmota_xdrv_driver/xdrv_42_1_i2s_mp3mic.ino index 8aeb37339..f7af2479e 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_42_1_i2s_mp3mic.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_42_1_i2s_mp3mic.ino @@ -21,7 +21,6 @@ #ifdef ESP32 #if ( (defined(USE_I2S_AUDIO) && defined(USE_I2S_MIC)) || defined(USE_M5STACK_CORE2) || defined(ESP32S3_BOX) ) - uint32_t SpeakerMic(uint8_t spkr) { esp_err_t err = ESP_OK; @@ -76,17 +75,27 @@ esp_err_t err = ESP_OK; .bits_per_chan = I2S_BITS_PER_CHAN_16BIT }; + if (audio_i2s.mic_channels == 1) { + i2s_config.channel_format = I2S_CHANNEL_FMT_ONLY_RIGHT; + } else { + i2s_config.channel_format = I2S_CHANNEL_FMT_RIGHT_LEFT; + } #ifdef USE_I2S_MIC - // mic select to GND - #ifdef MIC_PDM + // Mic L/R to GND + #ifdef USE_INMP441 + i2s_config.mode = (i2s_mode_t)(I2S_MODE_MASTER | I2S_MODE_RX ); + i2s_config.communication_format = I2S_COMM_FORMAT_I2S; + i2s_config.channel_format = I2S_CHANNEL_FMT_ONLY_LEFT; + #elif MIC_PDM i2s_config.mode = (i2s_mode_t)(I2S_MODE_MASTER | I2S_MODE_RX | I2S_MODE_PDM); - #else + #else i2s_config.mode = (i2s_mode_t)(I2S_MODE_MASTER | I2S_MODE_RX | I2S_MODE_TX); i2s_config.communication_format = I2S_COMM_FORMAT_STAND_I2S; - #endif + #endif #endif + #ifdef ESP32S3_BOX i2s_config.mode = (i2s_mode_t)(I2S_MODE_MASTER | I2S_MODE_RX | I2S_MODE_TX); i2s_config.communication_format = I2S_COMM_FORMAT_STAND_I2S; @@ -96,11 +105,6 @@ esp_err_t err = ESP_OK; i2s_config.mode = (i2s_mode_t)(I2S_MODE_MASTER | I2S_MODE_RX | I2S_MODE_PDM); #endif - if (audio_i2s.mic_channels == 1) { - i2s_config.channel_format = I2S_CHANNEL_FMT_ONLY_RIGHT; - } else { - i2s_config.channel_format = I2S_CHANNEL_FMT_RIGHT_LEFT; - } err += i2s_driver_install(audio_i2s.mic_port, &i2s_config, 0, NULL); From 676165f3f6e5b62201c422ab6ca3c1d216a1c79e Mon Sep 17 00:00:00 2001 From: blakadder Date: Thu, 8 Jun 2023 20:39:02 +0200 Subject: [PATCH 238/289] better way to support LSBJ (#18827) --- tasmota/tasmota_xdrv_driver/xdrv_42_0_i2s_audio.ino | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/tasmota/tasmota_xdrv_driver/xdrv_42_0_i2s_audio.ino b/tasmota/tasmota_xdrv_driver/xdrv_42_0_i2s_audio.ino index 1b294ddfc..c2de4f629 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_42_0_i2s_audio.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_42_0_i2s_audio.ino @@ -265,10 +265,6 @@ int32_t I2S_Init_0(void) { audio_i2s.out = new AudioOutputI2S(); #endif -#ifdef USE_I2S_LSB - audio_i2s.lsbJustified = true; -#endif // Allow supporting LSBJ chips, e.g. TM8211/PT8211 - audio_i2s.bclk = DAC_IIS_BCK; audio_i2s.ws = DAC_IIS_WS; audio_i2s.dout = DAC_IIS_DOUT; @@ -339,6 +335,11 @@ int32_t I2S_Init_0(void) { if (audio_i2s.mic_port != 0) { AddLog(LOG_LEVEL_INFO, PSTR("Init audio I2S mic: port=%d, bclk=%d, ws=%d, din=%d"), audio_i2s.mic_port, audio_i2s.mic_bclk, audio_i2s.mic_ws, audio_i2s.mic_din); } + +#ifdef USE_I2S_LSB + audio_i2s.out->SetLsbJustified(true); +#endif // Allow supporting LSBJ chips, e.g. TM8211/PT8211 + #else #ifdef USE_I2S_NO_DAC From 138b119c6d28b88e21c601806576d0e007e10dee Mon Sep 17 00:00:00 2001 From: s-hadinger <49731213+s-hadinger@users.noreply.github.com> Date: Fri, 9 Jun 2023 08:55:43 +0200 Subject: [PATCH 239/289] Matter fix Illuminance to uint (#18830) --- .../src/embedded/Matter_Plugin_Bridge_Sensor_Illuminance.be | 6 +++--- .../src/embedded/Matter_Plugin_Sensor_Illuminance.be | 6 +++--- .../solidified_Matter_Plugin_Bridge_Sensor_Illuminance.h | 6 +++--- .../solidify/solidified_Matter_Plugin_Sensor_Illuminance.h | 6 +++--- 4 files changed, 12 insertions(+), 12 deletions(-) diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Sensor_Illuminance.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Sensor_Illuminance.be index 31776d0d8..de2c1b0ba 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Sensor_Illuminance.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Sensor_Illuminance.be @@ -73,14 +73,14 @@ class Matter_Plugin_Bridge_Sensor_Illuminance : Matter_Plugin_Bridge_Sensor if cluster == 0x0400 # ========== Illuminance Measurement 2.2 p.95 ========== if attribute == 0x0000 # ---------- MeasuredValue / i16 ---------- if self.shadow_value != nil - return TLV.create_TLV(TLV.I2, int(self.shadow_value)) + return TLV.create_TLV(TLV.U2, int(self.shadow_value)) else return TLV.create_TLV(TLV.NULL, nil) end elif attribute == 0x0001 # ---------- MinMeasuredValue / i16 ---------- - return TLV.create_TLV(TLV.I2, 0) # 0 lux + return TLV.create_TLV(TLV.U2, 1) # 1 lux elif attribute == 0x0002 # ---------- MaxMeasuredValue / i16 ---------- - return TLV.create_TLV(TLV.I2, 10000) # 10000 lux + return TLV.create_TLV(TLV.U2, 0xFFFE) elif attribute == 0xFFFC # ---------- FeatureMap / map32 ---------- return TLV.create_TLV(TLV.U4, 0) elif attribute == 0xFFFD # ---------- ClusterRevision / u2 ---------- diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor_Illuminance.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor_Illuminance.be index 0488a8e65..9aba03c57 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor_Illuminance.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor_Illuminance.be @@ -72,14 +72,14 @@ class Matter_Plugin_Sensor_Illuminance : Matter_Plugin_Sensor if cluster == 0x0400 # ========== Illuminance Measurement 2.2 p.95 ========== if attribute == 0x0000 # ---------- MeasuredValue / i16 ---------- if self.shadow_value != nil - return TLV.create_TLV(TLV.I2, int(self.shadow_value)) + return TLV.create_TLV(TLV.U2, int(self.shadow_value)) else return TLV.create_TLV(TLV.NULL, nil) end elif attribute == 0x0001 # ---------- MinMeasuredValue / i16 ---------- - return TLV.create_TLV(TLV.I2, 0) # 0 lux + return TLV.create_TLV(TLV.U2, 1) # 1 lux elif attribute == 0x0002 # ---------- MaxMeasuredValue / i16 ---------- - return TLV.create_TLV(TLV.I2, 10000) # 10000 lux + return TLV.create_TLV(TLV.U2, 0xFFFE) elif attribute == 0xFFFC # ---------- FeatureMap / map32 ---------- return TLV.create_TLV(TLV.U4, 0) elif attribute == 0xFFFD # ---------- ClusterRevision / u2 ---------- diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Sensor_Illuminance.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Sensor_Illuminance.h index 051a2843e..d79f799b7 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Sensor_Illuminance.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Sensor_Illuminance.h @@ -74,7 +74,7 @@ be_local_closure(Matter_Plugin_Bridge_Sensor_Illuminance_read_attribute, /* na /* K5 */ be_const_int(0), /* K6 */ be_nested_str_weak(shadow_value), /* K7 */ be_nested_str_weak(create_TLV), - /* K8 */ be_nested_str_weak(I2), + /* K8 */ be_nested_str_weak(U2), /* K9 */ be_nested_str_weak(NULL), /* K10 */ be_const_int(1), /* K11 */ be_const_int(2), @@ -117,7 +117,7 @@ be_local_closure(Matter_Plugin_Bridge_Sensor_Illuminance_read_attribute, /* na 0x781E0005, // 001D JMPF R7 #0024 0x8C1C0907, // 001E GETMET R7 R4 K7 0x88240908, // 001F GETMBR R9 R4 K8 - 0x58280005, // 0020 LDCONST R10 K5 + 0x5828000A, // 0020 LDCONST R10 K10 0x7C1C0600, // 0021 CALL R7 3 0x80040E00, // 0022 RET 1 R7 0x70020018, // 0023 JMP #003D @@ -125,7 +125,7 @@ be_local_closure(Matter_Plugin_Bridge_Sensor_Illuminance_read_attribute, /* na 0x781E0005, // 0025 JMPF R7 #002C 0x8C1C0907, // 0026 GETMET R7 R4 K7 0x88240908, // 0027 GETMBR R9 R4 K8 - 0x542A270F, // 0028 LDINT R10 10000 + 0x542AFFFD, // 0028 LDINT R10 65534 0x7C1C0600, // 0029 CALL R7 3 0x80040E00, // 002A RET 1 R7 0x70020010, // 002B JMP #003D diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor_Illuminance.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor_Illuminance.h index 9e1401e82..13bebe68c 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor_Illuminance.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor_Illuminance.h @@ -28,7 +28,7 @@ be_local_closure(Matter_Plugin_Sensor_Illuminance_read_attribute, /* name */ /* K5 */ be_const_int(0), /* K6 */ be_nested_str_weak(shadow_value), /* K7 */ be_nested_str_weak(create_TLV), - /* K8 */ be_nested_str_weak(I2), + /* K8 */ be_nested_str_weak(U2), /* K9 */ be_nested_str_weak(NULL), /* K10 */ be_const_int(1), /* K11 */ be_const_int(2), @@ -71,7 +71,7 @@ be_local_closure(Matter_Plugin_Sensor_Illuminance_read_attribute, /* name */ 0x781E0005, // 001D JMPF R7 #0024 0x8C1C0907, // 001E GETMET R7 R4 K7 0x88240908, // 001F GETMBR R9 R4 K8 - 0x58280005, // 0020 LDCONST R10 K5 + 0x5828000A, // 0020 LDCONST R10 K10 0x7C1C0600, // 0021 CALL R7 3 0x80040E00, // 0022 RET 1 R7 0x70020018, // 0023 JMP #003D @@ -79,7 +79,7 @@ be_local_closure(Matter_Plugin_Sensor_Illuminance_read_attribute, /* name */ 0x781E0005, // 0025 JMPF R7 #002C 0x8C1C0907, // 0026 GETMET R7 R4 K7 0x88240908, // 0027 GETMBR R9 R4 K8 - 0x542A270F, // 0028 LDINT R10 10000 + 0x542AFFFD, // 0028 LDINT R10 65534 0x7C1C0600, // 0029 CALL R7 3 0x80040E00, // 002A RET 1 R7 0x70020010, // 002B JMP #003D From fc92dc0995b9f430725f8d41babf590de4b20975 Mon Sep 17 00:00:00 2001 From: btsimonh Date: Fri, 9 Jun 2023 07:56:05 +0100 Subject: [PATCH 240/289] Add wcclient.get_bytes() to Berry (#18829) (cherry picked from commit 5903b21448a3f088b12bd47a04996ff84e467a3a) --- .../berry_tasmota/src/be_webclient_lib.c | 2 + .../xdrv_52_3_berry_webclient.ino | 52 +++++++++++++++++++ 2 files changed, 54 insertions(+) diff --git a/lib/libesp32/berry_tasmota/src/be_webclient_lib.c b/lib/libesp32/berry_tasmota/src/be_webclient_lib.c index 6458169a5..c49d189ec 100644 --- a/lib/libesp32/berry_tasmota/src/be_webclient_lib.c +++ b/lib/libesp32/berry_tasmota/src/be_webclient_lib.c @@ -30,6 +30,7 @@ extern int wc_getstring(bvm *vm); extern int wc_writefile(bvm *vm); extern int wc_writeflash(bvm *vm); extern int wc_getsize(bvm *vm); +extern int wc_getbytes(bvm *vm); #include "be_fixed_be_class_webclient.h" @@ -68,6 +69,7 @@ class be_class_webclient (scope: global, name: webclient) { write_file, func(wc_writefile) write_flash, func(wc_writeflash) get_size, func(wc_getsize) + get_bytes, func(wc_getbytes) } @const_object_info_end */ diff --git a/tasmota/tasmota_xdrv_driver/xdrv_52_3_berry_webclient.ino b/tasmota/tasmota_xdrv_driver/xdrv_52_3_berry_webclient.ino index f81326570..4902ec3a4 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_52_3_berry_webclient.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_52_3_berry_webclient.ino @@ -654,5 +654,57 @@ extern "C" { } } +class StreamBytes: public Stream +{ +public: + StreamBytes(uint8_t * buf_in, int len_in) : buf(buf_in), offset(0), len(len_in) {}; + + size_t write(const uint8_t *buffer, size_t size) override { + // AddLog(LOG_LEVEL_INFO, "FLASH: addr=%p hex=%*_H size=%i", addr_start + offset, 32, buffer, size); + if (size > 0) { + if (offset + size > len){ + AddLog(LOG_LEVEL_ERROR, "BERRYWC: bufer overrun"); + return size; + } + memcpy(buf+offset, buffer, size); + offset += size; + } + return size; + } + size_t write(uint8_t data) override { + write(&data, 1); + return 1; + } + + int available() override { return 0; } + int read() override { return -1; } + int peek() override { return -1; } + void flush() override { } + +protected: + uint8_t *buf; // start address + uint32_t offset; // how many bytes have already been written + uint32_t len; // allocated len +}; + +extern "C" { + int32_t wc_getbytes(struct bvm *vm); + int32_t wc_getbytes(struct bvm *vm) { + HTTPClientLight * cl = wc_getclient(vm); + int32_t sz = cl->getSize(); + // abort if we exceed 32KB size, things will not go well otherwise + if (sz >= 32767 || sz < 0) { + be_raise(vm, "value_error", "response size -1 or too big (>32KB)"); + } + uint8_t * buf = (uint8_t*) be_pushbuffer(vm, sz); + StreamBytes memory_writer(buf, sz); + int32_t written = cl->writeToStream(&memory_writer); + + be_pushbytes(vm, buf, sz); + cl->end(); // free allocated memory ~16KB + be_return(vm); /* return code */ + } +} + #endif // USE_WEBCLIENT #endif // USE_BERRY From 6aed929e17d6367cf48e046994881d52b17d8be0 Mon Sep 17 00:00:00 2001 From: Barbudor Date: Fri, 9 Jun 2023 09:59:24 +0200 Subject: [PATCH 241/289] fix #18817 http response for status with retain (#18819) * fix http response for status with retain * take 2 * add a failsafe when JSONlen reach zero --- tasmota/tasmota_xdrv_driver/xdrv_01_9_webserver.ino | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tasmota/tasmota_xdrv_driver/xdrv_01_9_webserver.ino b/tasmota/tasmota_xdrv_driver/xdrv_01_9_webserver.ino index 2ab1afa99..1b4b130e2 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_01_9_webserver.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_01_9_webserver.ino @@ -3064,7 +3064,8 @@ void HandleHttpCommand(void) if (JSON) { // Is it a JSON message (and not only [15:26:08 MQT: stat/wemos5/POWER = O]) if (cflg) { WSContentSend_P(PSTR(",")); } uint32_t JSONlen = len - (JSON - line) -3; - WSContentSend(JSON +1, JSONlen); + for( ++JSON ; JSONlen && JSON[JSONlen] != '}' ; JSONlen-- ); + WSContentSend(JSON, JSONlen); cflg = true; } } From 63cc575c8b3a0af4254e3d7592a426a50f78a8fd Mon Sep 17 00:00:00 2001 From: btsimonh Date: Sat, 10 Jun 2023 10:28:31 +0100 Subject: [PATCH 242/289] Berry Webclient: Change StreamBytes to StreamBeBytesWriter, and improve wc_getbytes (#18837) This reduces allocation to a single allocaiton, but also theroetically allows the Bytes object to grow if content-length was unset. (cherry picked from commit 936477f5977dd1a4f899498cc7cc0baf05b34a89) --- .../xdrv_52_3_berry_webclient.ino | 74 ++++++++++++++----- 1 file changed, 57 insertions(+), 17 deletions(-) diff --git a/tasmota/tasmota_xdrv_driver/xdrv_52_3_berry_webclient.ino b/tasmota/tasmota_xdrv_driver/xdrv_52_3_berry_webclient.ino index 4902ec3a4..9dcf44ccb 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_52_3_berry_webclient.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_52_3_berry_webclient.ino @@ -654,21 +654,59 @@ extern "C" { } } -class StreamBytes: public Stream + +// a stream which writes to the Bytes object on the top of the stack +class StreamBeBytesWriter: public Stream { public: - StreamBytes(uint8_t * buf_in, int len_in) : buf(buf_in), offset(0), len(len_in) {}; + StreamBeBytesWriter(bvm *vm_in, int increment = 1024) : vm(vm_in), offset(0), incr(increment) {}; size_t write(const uint8_t *buffer, size_t size) override { - // AddLog(LOG_LEVEL_INFO, "FLASH: addr=%p hex=%*_H size=%i", addr_start + offset, 32, buffer, size); - if (size > 0) { - if (offset + size > len){ - AddLog(LOG_LEVEL_ERROR, "BERRYWC: bufer overrun"); - return size; + // we need size, not len, so can;t just get len with be_tobytes + be_getmember(vm, -1, ".size"); + int32_t signed_size = be_toint(vm, -1); + be_pop(vm, 1); /* bytes() instance is at top */ + + // if it won't fit, make the bytes object bigger + if (offset + size > signed_size){ + int newsize = offset + size + incr; + AddLog(LOG_LEVEL_INFO, "BE: realloc bytes in StreamBeBytesWriter newsize=%i", newsize); + be_getmember(vm, -1, "resize"); + be_pushvalue(vm, -2); + be_pushint(vm, size); + be_call(vm, 2); /* call b.resize(size) */ + be_pop(vm, 3); /* bytes() instance is at top */ + + // checkw e got it, because Berry just maxes out? + be_getmember(vm, -1, ".size"); + signed_size = be_toint(vm, -1); + be_pop(vm, 1); /* bytes() instance is at top */ + if (offset + size > signed_size){ + // what should we raise here??? + be_raise(vm, "alloc_error", "did not get enough extra bytes"); } - memcpy(buf+offset, buffer, size); - offset += size; } + + // AddLog(LOG_LEVEL_INFO, "FLASH: addr=%p hex=%*_H size=%i", addr_start + offset, 32, buffer, size); + if (offset + size > signed_size){ + AddLog(LOG_LEVEL_ERROR, "BERRYWC: buffer overrun"); + return size; + } + + char *bytebuf = (char*) be_tobytes(vm, -1, NULL); /* we get the address of the internam buffer of size 'size' */ + if (!bytebuf){ + AddLog(LOG_LEVEL_ERROR, "BERRYWC: buffer null??"); + return size; + } + + // stream in our chunk + memcpy(bytebuf + offset, buffer, size); + offset += size; + + // set the len + be_pushint(vm, offset); + be_setmember(vm, -2, ".len"); + be_pop(vm, 1); return size; } size_t write(uint8_t data) override { @@ -682,9 +720,9 @@ public: void flush() override { } protected: - uint8_t *buf; // start address + bvm *vm; // the berry VM uint32_t offset; // how many bytes have already been written - uint32_t len; // allocated len + size_t incr; // amount to add to size if it does not fit. }; extern "C" { @@ -693,14 +731,16 @@ extern "C" { HTTPClientLight * cl = wc_getclient(vm); int32_t sz = cl->getSize(); // abort if we exceed 32KB size, things will not go well otherwise - if (sz >= 32767 || sz < 0) { - be_raise(vm, "value_error", "response size -1 or too big (>32KB)"); + if (sz >= 32767) { + be_raise(vm, "value_error", "response size too big (>32KB)"); } - uint8_t * buf = (uint8_t*) be_pushbuffer(vm, sz); - StreamBytes memory_writer(buf, sz); + // default to 1K starter if contetn-length not present + if (sz < 0) sz = 1024; + // create a bytes object at top of stack. + // the streamwriter knows how to get it. + uint8_t * buf = (uint8_t*) be_pushbytes(vm, nullptr, sz); + StreamBeBytesWriter memory_writer(vm); int32_t written = cl->writeToStream(&memory_writer); - - be_pushbytes(vm, buf, sz); cl->end(); // free allocated memory ~16KB be_return(vm); /* return code */ } From 2f616eef2c0b414c7683b69b2218ab76dcad59fc Mon Sep 17 00:00:00 2001 From: Subhash Chandra Date: Sat, 10 Jun 2023 18:23:02 +0530 Subject: [PATCH 243/289] make IRHVAC send incremental changes. (#18310) This change will allow mqtt messages simpler by allowing something like `publish cmnd/ir-bridge/IRHVAC {"Power": "On"}`. The simpler format is required for working with mqtt clients like iotMQTTPanel or similar on android. Limitations: - Requires full message be sent at-least once. I work around this with a `system#boot` rule - Gets messy with multiple devices. I have only one AC per room, and this doesn't doesn't interfere with other IR devices. TODO: - [ ] Change the build flag `INCREMENTAL_IRAC`to a `SetOption` - [ ] Persist `irac_prev_state` across reboots. - [ ] Support multiple devices. --- tasmota/include/i18n.h | 1 + .../xdrv_05_irremote_full.ino | 37 +++++++------------ 2 files changed, 14 insertions(+), 24 deletions(-) diff --git a/tasmota/include/i18n.h b/tasmota/include/i18n.h index 85dd46178..37be387fe 100644 --- a/tasmota/include/i18n.h +++ b/tasmota/include/i18n.h @@ -561,6 +561,7 @@ #define D_JSON_IRHVAC_STATE_MODE_SEND_ONLY "SendOnly" #define D_JSON_IRHVAC_STATE_MODE_STORE_ONLY "StoreOnly" #define D_JSON_IRHVAC_STATE_MODE_SEND_STORE "SendStore" + #define D_JSON_IRHVAC_INCREMENTAL "Incremental" #define D_JSON_IRRECEIVED "IrReceived" // Commands xdrv_06_snfbridge.ino diff --git a/tasmota/tasmota_xdrv_driver/xdrv_05_irremote_full.ino b/tasmota/tasmota_xdrv_driver/xdrv_05_irremote_full.ino index 025ec480c..e0671de1e 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_05_irremote_full.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_05_irremote_full.ino @@ -128,6 +128,8 @@ protected: // some ACs send toggle messages rather than state. we need to help IRremoteESP8266 keep track of the state // have a flag that is a variable, can be later used to convert this functionality to an option (as in SetOptionXX) bool irhvac_stateful = true; +bool irhvac_incremental = true; + stdAc::state_t irac_prev_state; // this implementations only keeps one state so if you use a single tasmota-ir device to command more than one AC it might not work // different modes on how to handle state when sending HVAC commands. needed for ACs with a differential/toggle protocol. @@ -438,6 +440,8 @@ const stdAc::fanspeed_t IrHvacFanSpeed[] PROGMEM = { stdAc::fanspeed_t::kAuto, uint32_t IrRemoteCmndIrHvacJson(void) { + // state is initialized to the IRremoteESP8266's state_t defaults anyway + // https://github.com/crankyoldgit/IRremoteESP8266/blob/v2.8.4/src/IRsend.h#L97-L116 stdAc::state_t state; //AddLog(LOG_LEVEL_DEBUG, PSTR("IRHVAC: Received %s"), XdrvMailbox.data); @@ -445,28 +449,13 @@ uint32_t IrRemoteCmndIrHvacJson(void) JsonParserObject root = parser.getRootObject(); if (!root) { return IE_INVALID_JSON; } - // from: https://github.com/crankyoldgit/IRremoteESP8266/blob/master/examples/CommonAcControl/CommonAcControl.ino - state.protocol = decode_type_t::UNKNOWN; - state.model = 1; // Some A/C's have different models. Let's try using just 1. - state.command = stdAc::ac_command_t::kControlCommand; - state.mode = stdAc::opmode_t::kAuto; // Run in cool mode initially. - state.power = false; // Initially start with the unit off. - state.celsius = true; // Use Celsius for units of temp. False = Fahrenheit - state.degrees = 21.0f; // 21 degrees. - state.fanspeed = stdAc::fanspeed_t::kMedium; // Start with the fan at medium. - state.swingv = stdAc::swingv_t::kOff; // Don't swing the fan up or down. - state.swingh = stdAc::swingh_t::kOff; // Don't swing the fan left or right. - state.light = false; // Turn off any LED/Lights/Display that we can. - state.beep = false; // Turn off any beep from the A/C if we can. - state.econo = false; // Turn off any economy modes if we can. - state.filter = false; // Turn off any Ion/Mold/Health filters if we can. - state.turbo = false; // Don't use any turbo/powerful/etc modes. - state.quiet = false; // Don't use any quiet/silent/etc modes. - state.sleep = -1; // Don't set any sleep time or modes. - state.clean = false; // Turn off any Cleaning options if we can. - state.clock = -1; // Don't set any current time if we can avoid it. - state.iFeel = false; - state.sensorTemperature = kNoTempValue; // Don't set any sensor (ambient) temperature if not provided + bool incremental = strToBool(root[PSTR(D_JSON_IRHVAC_INCREMENTAL)], false); + + // TODO: add support for storing multiple states + if (incremental) + { + state = irac_prev_state; + } JsonParserToken val; if (val = root[PSTR(D_JSON_IRHVAC_VENDOR)]) { state.protocol = strToDecodeType(val.getStr()); } @@ -495,8 +484,8 @@ uint32_t IrRemoteCmndIrHvacJson(void) // AddLog(LOG_LEVEL_DEBUG, PSTR("model %d, mode %d, fanspeed %d, swingv %d, swingh %d"), // state.model, state.mode, state.fanspeed, state.swingv, state.swingh); - // if and how we should handle the state for IRremote - StateModes stateMode = StateModes::SEND_ONLY; // default + StateModes stateMode = incremental ? StateModes::SEND_STORE : StateModes::SEND_ONLY; + if (irhvac_stateful && (val = root[PSTR(D_JSON_IRHVAC_STATE_MODE)])) { stateMode = strToStateMode(val, stateMode); } // decode booleans From 827c14e4bdd8d599abd43e7bc52898188a63ba3f Mon Sep 17 00:00:00 2001 From: s-hadinger <49731213+s-hadinger@users.noreply.github.com> Date: Sat, 10 Jun 2023 18:23:33 +0200 Subject: [PATCH 244/289] Increase solidify buffer (#18843) --- lib/libesp32/berry/src/be_solidifylib.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/libesp32/berry/src/be_solidifylib.c b/lib/libesp32/berry/src/be_solidifylib.c index ed3cea948..b0164ddba 100644 --- a/lib/libesp32/berry/src/be_solidifylib.c +++ b/lib/libesp32/berry/src/be_solidifylib.c @@ -31,7 +31,7 @@ extern const bclass be_class_map; be_vector_count(&(vm)->gbldesc.builtin.vlist) #ifndef INST_BUF_SIZE -#define INST_BUF_SIZE 288 +#define INST_BUF_SIZE 768 #endif #define logfmt(...) \ From 5cb9bae72c1297a7aa415efa96d1e4a3a472503c Mon Sep 17 00:00:00 2001 From: s-hadinger <49731213+s-hadinger@users.noreply.github.com> Date: Sat, 10 Jun 2023 19:40:57 +0200 Subject: [PATCH 245/289] Matter alternate Illuminance calculation (#18847) --- ...Matter_Plugin_Bridge_Sensor_Illuminance.be | 4 ++-- .../Matter_Plugin_Sensor_Illuminance.be | 4 ++-- ..._Matter_Plugin_Bridge_Sensor_Illuminance.h | 21 +++++++++---------- ...idified_Matter_Plugin_Sensor_Illuminance.h | 21 +++++++++---------- 4 files changed, 24 insertions(+), 26 deletions(-) diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Sensor_Illuminance.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Sensor_Illuminance.be index de2c1b0ba..41bcf9c89 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Sensor_Illuminance.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Sensor_Illuminance.be @@ -53,10 +53,10 @@ class Matter_Plugin_Bridge_Sensor_Illuminance : Matter_Plugin_Bridge_Sensor if val == nil return nil end import math - if val < 1 + if val < 0 return 0 else - return math.log10(val) * 10000 + 1 + return math.log10(val + 1) * 10000 end end diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor_Illuminance.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor_Illuminance.be index 9aba03c57..42f91dd9d 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor_Illuminance.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor_Illuminance.be @@ -43,10 +43,10 @@ class Matter_Plugin_Sensor_Illuminance : Matter_Plugin_Sensor if val == nil return nil end import math - if val < 1 + if val < 0 return 0 else - return math.log10(val) * 10000 + 1 + return math.log10(val + 1) * 10000 end end diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Sensor_Illuminance.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Sensor_Illuminance.h index d79f799b7..0dba00e01 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Sensor_Illuminance.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Sensor_Illuminance.h @@ -21,13 +21,13 @@ be_local_closure(Matter_Plugin_Bridge_Sensor_Illuminance_pre_value, /* name */ 1, /* has constants */ ( &(const bvalue[ 4]) { /* constants */ /* K0 */ be_nested_str_weak(math), - /* K1 */ be_const_int(1), - /* K2 */ be_const_int(0), - /* K3 */ be_nested_str_weak(log10), + /* K1 */ be_const_int(0), + /* K2 */ be_nested_str_weak(log10), + /* K3 */ be_const_int(1), }), be_str_weak(pre_value), &be_const_str_solidified, - ( &(const binstruction[18]) { /* code */ + ( &(const binstruction[17]) { /* code */ 0x4C080000, // 0000 LDNIL R2 0x1C080202, // 0001 EQ R2 R1 R2 0x780A0001, // 0002 JMPF R2 #0005 @@ -36,16 +36,15 @@ be_local_closure(Matter_Plugin_Bridge_Sensor_Illuminance_pre_value, /* name */ 0xA40A0000, // 0005 IMPORT R2 K0 0x140C0301, // 0006 LT R3 R1 K1 0x780E0001, // 0007 JMPF R3 #000A - 0x80060400, // 0008 RET 1 K2 - 0x70020006, // 0009 JMP #0011 - 0x8C0C0503, // 000A GETMET R3 R2 K3 - 0x5C140200, // 000B MOVE R5 R1 + 0x80060200, // 0008 RET 1 K1 + 0x70020005, // 0009 JMP #0010 + 0x8C0C0502, // 000A GETMET R3 R2 K2 + 0x00140303, // 000B ADD R5 R1 K3 0x7C0C0400, // 000C CALL R3 2 0x5412270F, // 000D LDINT R4 10000 0x080C0604, // 000E MUL R3 R3 R4 - 0x000C0701, // 000F ADD R3 R3 K1 - 0x80040600, // 0010 RET 1 R3 - 0x80000000, // 0011 RET 0 + 0x80040600, // 000F RET 1 R3 + 0x80000000, // 0010 RET 0 }) ) ); diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor_Illuminance.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor_Illuminance.h index 13bebe68c..9a6a7c240 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor_Illuminance.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor_Illuminance.h @@ -131,13 +131,13 @@ be_local_closure(Matter_Plugin_Sensor_Illuminance_pre_value, /* name */ 1, /* has constants */ ( &(const bvalue[ 4]) { /* constants */ /* K0 */ be_nested_str_weak(math), - /* K1 */ be_const_int(1), - /* K2 */ be_const_int(0), - /* K3 */ be_nested_str_weak(log10), + /* K1 */ be_const_int(0), + /* K2 */ be_nested_str_weak(log10), + /* K3 */ be_const_int(1), }), be_str_weak(pre_value), &be_const_str_solidified, - ( &(const binstruction[18]) { /* code */ + ( &(const binstruction[17]) { /* code */ 0x4C080000, // 0000 LDNIL R2 0x1C080202, // 0001 EQ R2 R1 R2 0x780A0001, // 0002 JMPF R2 #0005 @@ -146,16 +146,15 @@ be_local_closure(Matter_Plugin_Sensor_Illuminance_pre_value, /* name */ 0xA40A0000, // 0005 IMPORT R2 K0 0x140C0301, // 0006 LT R3 R1 K1 0x780E0001, // 0007 JMPF R3 #000A - 0x80060400, // 0008 RET 1 K2 - 0x70020006, // 0009 JMP #0011 - 0x8C0C0503, // 000A GETMET R3 R2 K3 - 0x5C140200, // 000B MOVE R5 R1 + 0x80060200, // 0008 RET 1 K1 + 0x70020005, // 0009 JMP #0010 + 0x8C0C0502, // 000A GETMET R3 R2 K2 + 0x00140303, // 000B ADD R5 R1 K3 0x7C0C0400, // 000C CALL R3 2 0x5412270F, // 000D LDINT R4 10000 0x080C0604, // 000E MUL R3 R3 R4 - 0x000C0701, // 000F ADD R3 R3 K1 - 0x80040600, // 0010 RET 1 R3 - 0x80000000, // 0011 RET 0 + 0x80040600, // 000F RET 1 R3 + 0x80000000, // 0010 RET 0 }) ) ); From 5da84c52ff696203e2bb004b503816cc2547e5d5 Mon Sep 17 00:00:00 2001 From: s-hadinger <49731213+s-hadinger@users.noreply.github.com> Date: Sat, 10 Jun 2023 22:23:43 +0200 Subject: [PATCH 246/289] Berry Allow comments in multi-line strings (#18848) --- lib/libesp32/berry/src/be_lexer.c | 4 +++- lib/libesp32/berry/tests/string.be | 22 ++++++++++++++++++++++ 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/lib/libesp32/berry/src/be_lexer.c b/lib/libesp32/berry/src/be_lexer.c index 7b3f05726..904ab0769 100644 --- a/lib/libesp32/berry/src/be_lexer.c +++ b/lib/libesp32/berry/src/be_lexer.c @@ -394,7 +394,9 @@ static int skip_delimiter(blexer *lexer) { int c = lgetc(lexer); int delimeter_present = 0; while (1) { - if (c == '\r' || c == '\n') { + if (c == '#') { + skip_comment(lexer); + } else if (c == '\r' || c == '\n') { skip_newline(lexer); } else if (c == ' ' || c == '\t' || c == '\f' || c == '\v') { next(lexer); diff --git a/lib/libesp32/berry/tests/string.be b/lib/libesp32/berry/tests/string.be index aeb0d0ad5..e7d91e8dd 100644 --- a/lib/libesp32/berry/tests/string.be +++ b/lib/libesp32/berry/tests/string.be @@ -88,3 +88,25 @@ assert(string.replace("hellollo", "aa", "xx") == "hellollo") assert(string.replace("hello", "ll", "") == "heo") assert(string.replace("hello", "", "xx") == "hello") assert(string.replace("hello", "", "") == "hello") + +# multi-line strings +var s = "a" "b""c" +assert(s == 'abc') + +s = 'a'"b"'''c' +assert(s == 'abc') + +s = "a" +'b' + "" + "c" +assert(s == 'abc') + +s = "a" #- b -# "b" #--# "c" +assert(s == 'abc') + +s = "a"# + # "z" + "b" # zz + "c" +assert(s == 'abc') From a014f5495b406d03243f56cb59c2779af0ec3191 Mon Sep 17 00:00:00 2001 From: s-hadinger <49731213+s-hadinger@users.noreply.github.com> Date: Sun, 11 Jun 2023 19:10:12 +0200 Subject: [PATCH 247/289] Matter redesigned UI (#18855) --- CHANGELOG.md | 1 + .../src/embedded/Matter_Device.be | 99 +- .../src/embedded/Matter_Plugin.be | 20 +- .../src/embedded/Matter_Plugin_Bridge_HTTP.be | 37 +- .../embedded/Matter_Plugin_Bridge_Light0.be | 2 +- .../embedded/Matter_Plugin_Bridge_Light1.be | 2 +- .../embedded/Matter_Plugin_Bridge_Light2.be | 2 +- .../embedded/Matter_Plugin_Bridge_Light3.be | 2 +- .../embedded/Matter_Plugin_Bridge_OnOff.be | 2 +- .../embedded/Matter_Plugin_Bridge_Sensor.be | 9 +- .../Matter_Plugin_Bridge_Sensor_Humidity.be | 2 +- ...Matter_Plugin_Bridge_Sensor_Illuminance.be | 2 +- .../Matter_Plugin_Bridge_Sensor_Occupancy.be | 2 +- .../Matter_Plugin_Bridge_Sensor_Pressure.be | 2 +- .../Matter_Plugin_Bridge_Sensor_Temp.be | 2 +- .../src/embedded/Matter_Plugin_Light0.be | 4 +- .../src/embedded/Matter_Plugin_OnOff.be | 13 +- .../src/embedded/Matter_Plugin_Root.be | 6 +- .../src/embedded/Matter_Plugin_Sensor.be | 9 +- .../Matter_Plugin_Sensor_Occupancy.be | 9 +- .../embedded/Matter_Plugin_Sensor_OnOff.be | 9 +- .../src/embedded/Matter_Plugin_Shutter.be | 9 +- .../berry_matter/src/embedded/Matter_UI.be | 682 +- .../src/solidify/solidified_Matter_Device.h | 6548 +++++++++-------- .../src/solidify/solidified_Matter_Plugin.h | 1215 +-- .../solidified_Matter_Plugin_Bridge_HTTP.h | 627 +- .../solidified_Matter_Plugin_Bridge_Light0.h | 2 +- .../solidified_Matter_Plugin_Bridge_Light1.h | 2 +- .../solidified_Matter_Plugin_Bridge_Light2.h | 2 +- .../solidified_Matter_Plugin_Bridge_Light3.h | 2 +- .../solidified_Matter_Plugin_Bridge_OnOff.h | 2 +- .../solidified_Matter_Plugin_Bridge_Sensor.h | 125 +- ...ied_Matter_Plugin_Bridge_Sensor_Humidity.h | 2 +- ..._Matter_Plugin_Bridge_Sensor_Illuminance.h | 2 +- ...ed_Matter_Plugin_Bridge_Sensor_Occupancy.h | 2 +- ...ied_Matter_Plugin_Bridge_Sensor_Pressure.h | 2 +- ...idified_Matter_Plugin_Bridge_Sensor_Temp.h | 2 +- .../solidify/solidified_Matter_Plugin_OnOff.h | 366 +- .../solidify/solidified_Matter_Plugin_Root.h | 2087 +++--- .../solidified_Matter_Plugin_Sensor.h | 71 +- ...olidified_Matter_Plugin_Sensor_Occupancy.h | 67 +- .../solidified_Matter_Plugin_Sensor_OnOff.h | 99 +- .../solidified_Matter_Plugin_Shutter.h | 75 +- .../src/solidify/solidified_Matter_UI.h | 4296 +++++++---- 44 files changed, 9117 insertions(+), 7406 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a008d72ce..b26a93f6b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,7 @@ All notable changes to this project will be documented in this file. ### Added - Matter ability to add or remove endpoint in bridge mode (code only) - Matter add controller's Vendor Name to logs and UI +- Matter redesigned UI ### Breaking Changed diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Device.be b/lib/libesp32/berry_matter/src/embedded/Matter_Device.be index 0107f345b..f4db53a39 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Device.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Device.be @@ -62,7 +62,7 @@ class Matter_Device var root_discriminator # as `int` var root_passcode # as `int` var ipv4only # advertize only IPv4 addresses (no IPv6) - var next_ep # next endpoint to be allocated for bridge, start at 51 + var next_ep # next endpoint to be allocated for bridge, start at 1 # context for PBKDF var root_iterations # PBKDF number of iterations # PBKDF information used only during PASE (freed afterwards) @@ -88,7 +88,7 @@ class Matter_Device self.vendorid = self.VENDOR_ID self.productid = self.PRODUCT_ID self.root_iterations = self.PBKDF_ITERATIONS - self.next_ep = 51 # start at endpoint 51 for dynamically allocated endpoints + self.next_ep = 1 # start at endpoint 1 for dynamically allocated endpoints self.root_salt = crypto.random(16) self.ipv4only = false self.load_param() @@ -605,6 +605,20 @@ class Matter_Device return ret end + ############################################################# + # Find plugin by endpoint + def find_plugin_by_endpoint(ep) + var idx = 0 + while idx < size(self.plugins) + var pl = self.plugins[idx] + if pl.get_endpoint() == ep + return pl + end + idx += 1 + end + return nil + end + ############################################################# # Persistance of Matter Device parameters # @@ -1090,13 +1104,30 @@ class Matter_Device # auto-detect sensors var sensors = json.load(tasmota.read_sensors()) + var sensors_list = self.autoconf_sensors_list(sensors) + + for s: sensors_list + m[str(endpoint)] = s + endpoint += 1 + end + + # tasmota.publish_result('{"Matter":{"Initialized":1}}', 'Matter') # MQTT is not yet connected + return m + end + + + ############################################################# + # Autoconfigure from sensors + # + # Returns an ordered list + def autoconf_sensors_list(sensors) + var ret = [] # temperature sensors for k1:self.k2l(sensors) var sensor_2 = sensors[k1] if isinstance(sensor_2, map) && sensor_2.contains("Temperature") var temp_rule = k1 + "#Temperature" - m[str(endpoint)] = {'type':'temperature','filter':temp_rule} - endpoint += 1 + ret.push({'type':'temperature','filter':temp_rule}) end end @@ -1105,8 +1136,7 @@ class Matter_Device var sensor_2 = sensors[k1] if isinstance(sensor_2, map) && sensor_2.contains("Pressure") var temp_rule = k1 + "#Pressure" - m[str(endpoint)] = {'type':'pressure','filter':temp_rule} - endpoint += 1 + ret.push({'type':'pressure','filter':temp_rule}) end end @@ -1115,8 +1145,7 @@ class Matter_Device var sensor_2 = sensors[k1] if isinstance(sensor_2, map) && sensor_2.contains("Illuminance") var temp_rule = k1 + "#Illuminance" - m[str(endpoint)] = {'type':'illuminance','filter':temp_rule} - endpoint += 1 + ret.push({'type':'illuminance','filter':temp_rule}) end end @@ -1125,12 +1154,11 @@ class Matter_Device var sensor_2 = sensors[k1] if isinstance(sensor_2, map) && sensor_2.contains("Humidity") var temp_rule = k1 + "#Humidity" - m[str(endpoint)] = {'type':'humidity','filter':temp_rule} - endpoint += 1 + ret.push({'type':'humidity','filter':temp_rule}) end end - # tasmota.publish_result('{"Matter":{"Initialized":1}}', 'Matter') # MQTT is not yet connected - return m + + return ret end # get keys of a map in sorted order @@ -1262,6 +1290,8 @@ class Matter_Device idx += 1 end end + # clean any orphan remote + self.clean_remotes() end ############################################################# @@ -1337,6 +1367,51 @@ class Matter_Device return http_remote end + ##################################################################### + # Remove HTTP remotes that are no longer referenced + def clean_remotes() + import introspect + import string + + var remotes_map = {} # key: remote object, value: count of references + + # init all remotes with count 0 + for http_remote: self.http_remotes + remotes_map[http_remote] = 0 + end + + # scan all endpoints + for pi: self.plugins + var http_remote = introspect.get(pi, "http_remote") + if http_remote != nil + remotes_map[http_remote] = remotes_map.find(http_remote, 0) + 1 + end + end + + tasmota.log("MTR: remotes references: " + str(remotes_map)) + + for remote:remotes_map.keys() + if remotes_map[remote] == 0 + # remove + tasmota.log("MTR: remove unused remote: " + remote.addr, 3) + remote.close() + self.http_remotes.remove(remote) + end + end + + end + + # def get_remotes_list() + ##################################################################### + # Get sorted list of remote endpoints + # def get_remotes_list() + # var ret = [] + # for hr: self.http_remotes + # ret.push(hr.addr) + # end + # return self.sort_distinct(ret) + # end + ##################################################################### # Commands `Mtr___` ##################################################################### diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin.be index dafeb7793..4084b1260 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin.be @@ -55,10 +55,28 @@ class Matter_Plugin # device: contains the root device object so the plugin can "call home" # endpoint: (int) the endpoint number (16 bits) # arguments: (map) the map for all complementary arguments that are plugin specific - def init(device, endpoint, arguments) + def init(device, endpoint, config) self.device = device self.endpoint = endpoint self.clusters = self.consolidate_clusters() + self.parse_configuration(config) + end + + ############################################################# + # parse_configuration + # + # Parse configuration map + # TO BE OVERRIDEN + def parse_configuration(config) + end + + ############################################################# + # is_local_device + # + # Returns true if it's a local device, or false for a + # remotely device controlled via HTTP + def is_local_device() + return true end ############################################################# diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_HTTP.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_HTTP.be index 6a08b3427..2afe4f79f 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_HTTP.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_HTTP.be @@ -60,6 +60,15 @@ class Matter_Plugin_Bridge_HTTP : Matter_Plugin_Device self.register_cmd_cb() end + ############################################################# + # is_local_device + # + # Returns true if it's a local device, or false for a + # remotely device controlled via HTTP + def is_local_device() + return false + end + ############################################################# # register_cmd_cb # @@ -196,34 +205,6 @@ class Matter_Plugin_Bridge_HTTP : Matter_Plugin_Device # avoid calling update_shadow() since it's not applicable for HTTP remote end - ############################################################# - # UI Methods - ############################################################# - # ui_conf_to_string - # - # Convert the current plugin parameters to a single string - static def ui_conf_to_string(cl, conf) - var s = super(_class).ui_conf_to_string(cl, conf) - - var url = str(conf.find(_class.ARG_HTTP, '')) - var arg = s + "," + url - # print("MTR: ui_conf_to_string", conf, cl, arg) - return arg - end - - ############################################################# - # ui_string_to_conf - # - # Convert the string in UI to actual parameters added to the map - static def ui_string_to_conf(cl, conf, arg) - import string - var elts = string.split(arg + ',', ',', 3) # add ',' at the end to be sure to have at least 2 arguments - conf[_class.ARG_HTTP] = elts[1] - super(_class).ui_string_to_conf(cl, conf, elts[0]) - # print("ui_string_to_conf", conf, arg) - return conf - end - ############################################################# # web_values # diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Light0.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Light0.be index b58d42de9..3b692d6b9 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Light0.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Light0.be @@ -28,7 +28,7 @@ class Matter_Plugin_Bridge_HTTP end class Matter_Plugin_Bridge_Light0 : Matter_Plugin_Bridge_HTTP static var TYPE = "http_light0" # name of the plug-in in json - static var NAME = "🔗 Light 0 On" # display name of the plug-in + static var NAME = "Light 0 On" # display name of the plug-in static var ARG = "relay" # additional argument name (or empty if none) static var ARG_TYPE = / x -> int(x) # function to convert argument to the right type # static var UPDATE_TIME = 3000 # update every 3s diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Light1.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Light1.be index a8caa761f..3de4c5a30 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Light1.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Light1.be @@ -28,7 +28,7 @@ class Matter_Plugin_Bridge_Light0 end class Matter_Plugin_Bridge_Light1 : Matter_Plugin_Bridge_Light0 static var TYPE = "http_light1" # name of the plug-in in json - static var NAME = "🔗 Light 1 Dimmer" # display name of the plug-in + static var NAME = "Light 1 Dimmer" # display name of the plug-in # static var ARG = "relay" # additional argument name (or empty if none) # static var ARG_TYPE = / x -> int(x) # function to convert argument to the right type static var CLUSTERS = { diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Light2.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Light2.be index 4e0217eac..d2ee48b6c 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Light2.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Light2.be @@ -28,7 +28,7 @@ class Matter_Plugin_Bridge_Light1 end class Matter_Plugin_Bridge_Light2 : Matter_Plugin_Bridge_Light1 static var TYPE = "http_light2" # name of the plug-in in json - static var NAME = "🔗 Light 2 CT" # display name of the plug-in + static var NAME = "Light 2 CT" # display name of the plug-in # static var ARG = "relay" # additional argument name (or empty if none) # static var ARG_TYPE = / x -> int(x) # function to convert argument to the right type static var CLUSTERS = { diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Light3.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Light3.be index c9856a318..a2e9bcec6 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Light3.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Light3.be @@ -28,7 +28,7 @@ class Matter_Plugin_Bridge_Light1 end class Matter_Plugin_Bridge_Light3 : Matter_Plugin_Bridge_Light1 static var TYPE = "http_light3" # name of the plug-in in json - static var NAME = "🔗 Light 3 RGB" # display name of the plug-in + static var NAME = "Light 3 RGB" # display name of the plug-in # static var ARG = "relay" # additional argument name (or empty if none) # static var ARG_TYPE = / x -> int(x) # function to convert argument to the right type static var CLUSTERS = { diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_OnOff.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_OnOff.be index 1552c0e6e..8d8832bae 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_OnOff.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_OnOff.be @@ -28,7 +28,7 @@ class Matter_Plugin_Bridge_Light0 end class Matter_Plugin_Bridge_OnOff : Matter_Plugin_Bridge_Light0 static var TYPE = "http_relay" # name of the plug-in in json - static var NAME = "🔗 Relay" # display name of the plug-in + static var NAME = "Relay" # display name of the plug-in static var TYPES = { 0x010A: 2 } # On/Off Plug-in Unit ############################################################# diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Sensor.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Sensor.be index a220a7370..e2e0a191a 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Sensor.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Sensor.be @@ -40,10 +40,11 @@ class Matter_Plugin_Bridge_Sensor : Matter_Plugin_Bridge_HTTP var shadow_value # Last known value ############################################################# - # Constructor - def init(device, endpoint, arguments) - super(self).init(device, endpoint, arguments) - self.tasmota_sensor_filter = arguments.find(self.ARG#-'filter'-#) + # parse_configuration + # + # Parse configuration map + def parse_configuration(config) + self.tasmota_sensor_filter = config.find(self.ARG#-'filter'-#) if self.tasmota_sensor_filter self.tasmota_sensor_matcher = tasmota.Rule_Matcher.parse(self.tasmota_sensor_filter) end diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Sensor_Humidity.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Sensor_Humidity.be index ab314be2b..798225be8 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Sensor_Humidity.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Sensor_Humidity.be @@ -28,7 +28,7 @@ class Matter_Plugin_Bridge_Sensor end class Matter_Plugin_Bridge_Sensor_Humidity : Matter_Plugin_Bridge_Sensor static var TYPE = "http_humidity" # name of the plug-in in json - static var NAME = "🔗 Humidity" # display name of the plug-in + static var NAME = "Humidity" # display name of the plug-in static var CLUSTERS = { 0x0405: [0,1,2,0xFFFC,0xFFFD], # Humidity Measurement p.102 - no writable diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Sensor_Illuminance.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Sensor_Illuminance.be index 41bcf9c89..be957a101 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Sensor_Illuminance.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Sensor_Illuminance.be @@ -28,7 +28,7 @@ class Matter_Plugin_Bridge_Sensor end class Matter_Plugin_Bridge_Sensor_Illuminance : Matter_Plugin_Bridge_Sensor static var TYPE = "http_illuminance" # name of the plug-in in json - static var NAME = "🔗 Illuminance" # display name of the plug-in + static var NAME = "Illuminance" # display name of the plug-in static var CLUSTERS = { 0x0400: [0,1,2,0xFFFC,0xFFFD], # Illuminance Measurement p.95 - no writable diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Sensor_Occupancy.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Sensor_Occupancy.be index 1cf6e56fa..1e171b5cd 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Sensor_Occupancy.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Sensor_Occupancy.be @@ -28,7 +28,7 @@ class Matter_Plugin_Bridge_HTTP end class Matter_Plugin_Bridge_Sensor_Occupancy : Matter_Plugin_Bridge_HTTP static var TYPE = "http_occupancy" # name of the plug-in in json - static var NAME = "🔗 Occupancy" # display name of the plug-in + static var NAME = "Occupancy" # display name of the plug-in static var ARG = "switch" # additional argument name (or empty if none) static var ARG_TYPE = / x -> int(x) # function to convert argument to the right type static var UPDATE_TIME = 5000 # update every 5s diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Sensor_Pressure.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Sensor_Pressure.be index 3b7930d40..3e185d512 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Sensor_Pressure.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Sensor_Pressure.be @@ -28,7 +28,7 @@ class Matter_Plugin_Bridge_Sensor end class Matter_Plugin_Bridge_Sensor_Pressure : Matter_Plugin_Bridge_Sensor static var TYPE = "http_pressure" # name of the plug-in in json - static var NAME = "🔗 Pressure" # display name of the plug-in + static var NAME = "Pressure" # display name of the plug-in static var CLUSTERS = { 0x0403: [0,1,2,0xFFFC,0xFFFD], # Pressure Measurement diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Sensor_Temp.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Sensor_Temp.be index 8d8d51969..5948cf5cd 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Sensor_Temp.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Sensor_Temp.be @@ -28,7 +28,7 @@ class Matter_Plugin_Bridge_Sensor end class Matter_Plugin_Bridge_Sensor_Temp : Matter_Plugin_Bridge_Sensor static var TYPE = "http_temperature" # name of the plug-in in json - static var NAME = "🔗 Temperature" # display name of the plug-in + static var NAME = "Temperature" # display name of the plug-in static var CLUSTERS = { 0x0402: [0,1,2,0xFFFC,0xFFFD], # Temperature Measurement p.97 - no writable diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Light0.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Light0.be index 2757cd8de..fff50d670 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Light0.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Light0.be @@ -43,8 +43,8 @@ class Matter_Plugin_Light0 : Matter_Plugin_Device ############################################################# # Constructor - def init(device, endpoint, arguments) - super(self).init(device, endpoint, arguments) + def init(device, endpoint, config) + super(self).init(device, endpoint, config) self.shadow_onoff = false end diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_OnOff.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_OnOff.be index 0dc55cbc7..45a2d0ab7 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_OnOff.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_OnOff.be @@ -46,10 +46,17 @@ class Matter_Plugin_OnOff : Matter_Plugin_Device ############################################################# # Constructor - def init(device, endpoint, arguments) - super(self).init(device, endpoint, arguments) + def init(device, endpoint, config) + super(self).init(device, endpoint, config) self.shadow_onoff = false - self.tasmota_relay_index = int(arguments.find(self.ARG #-'relay'-#, 1)) + end + + ############################################################# + # parse_configuration + # + # Parse configuration map + def parse_configuration(config) + self.tasmota_relay_index = int(config.find(self.ARG #-'relay'-#, 1)) if self.tasmota_relay_index <= 0 self.tasmota_relay_index = 1 end end diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Root.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Root.be index 7d7c1b820..39ab5e064 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Root.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Root.be @@ -50,9 +50,9 @@ class Matter_Plugin_Root : Matter_Plugin ############################################################# # Constructor - def init(device, endpoint, arguments) - super(self).init(device, endpoint, arguments) - end + # def init(device, endpoint, config) + # super(self).init(device, endpoint, config) + # end ############################################################# # read an attribute diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor.be index 86ea86680..5cd808209 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor.be @@ -34,10 +34,11 @@ class Matter_Plugin_Sensor : Matter_Plugin_Device var shadow_value # Last known value ############################################################# - # Constructor - def init(device, endpoint, arguments) - super(self).init(device, endpoint, arguments) - self.tasmota_sensor_filter = arguments.find(self.ARG#-'filter'-#) + # parse_configuration + # + # Parse configuration map + def parse_configuration(config) + self.tasmota_sensor_filter = config.find(self.ARG#-'filter'-#) if self.tasmota_sensor_filter self.tasmota_sensor_matcher = tasmota.Rule_Matcher.parse(self.tasmota_sensor_filter) end diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor_Occupancy.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor_Occupancy.be index 3dacc0925..0203874dd 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor_Occupancy.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor_Occupancy.be @@ -41,10 +41,11 @@ class Matter_Plugin_Sensor_Occupancy : Matter_Plugin_Device var shadow_occupancy ############################################################# - # Constructor - def init(device, endpoint, arguments) - super(self).init(device, endpoint, arguments) - self.tasmota_switch_index = int(arguments.find(self.ARG #-'relay'-#, 1)) + # parse_configuration + # + # Parse configuration map + def parse_configuration(config) + self.tasmota_switch_index = int(config.find(self.ARG #-'relay'-#, 1)) if self.tasmota_switch_index <= 0 self.tasmota_switch_index = 1 end end diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor_OnOff.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor_OnOff.be index 7df4da0b6..c675c1f0f 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor_OnOff.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor_OnOff.be @@ -39,10 +39,11 @@ class Matter_Plugin_Sensor_OnOff : Matter_Plugin_Device var shadow_onoff ############################################################# - # Constructor - def init(device, endpoint, arguments) - super(self).init(device, endpoint, arguments) - self.tasmota_switch_index = int(arguments.find(self.ARG #-'relay'-#, 1)) + # parse_configuration + # + # Parse configuration map + def parse_configuration(config) + self.tasmota_switch_index = int(config.find(self.ARG #-'relay'-#, 1)) if self.tasmota_switch_index <= 0 self.tasmota_switch_index = 1 end end diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Shutter.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Shutter.be index da881d173..fec02219d 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Shutter.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Shutter.be @@ -48,10 +48,11 @@ class Matter_Plugin_Shutter : Matter_Plugin_Device var shadow_shutter_inverted # 1=same as matter 0=matter must invert ############################################################# - # Constructor - def init(device, endpoint, arguments) - super(self).init(device, endpoint, arguments) - self.tasmota_shutter_index = arguments.find(self.ARG #-'relay'-#) + # parse_configuration + # + # Parse configuration map + def parse_configuration(config) + self.tasmota_shutter_index = config.find(self.ARG #-'relay'-#) if self.tasmota_shutter_index == nil self.tasmota_shutter_index = 0 end self.shadow_shutter_inverted = -1 end diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_UI.be b/lib/libesp32/berry_matter/src/embedded/Matter_UI.be index 2043f1851..abf69bb1d 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_UI.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_UI.be @@ -34,11 +34,30 @@ import matter class Matter_UI static var _CLASSES_TYPES = "|relay|light0|light1|light2|light3|shutter|shutter+tilt" "|temperature|pressure|illuminance|humidity|occupancy|onoff" - static var _CLASSES_TYPES2= "-http|http_relay|http_light0|http_light1|http_light2|http_light3" + # static var _CLASSES_HTTP = "-http" + static var _CLASSES_TYPES2= "|http_relay|http_light0|http_light1|http_light2|http_light3" "|http_temperature|http_pressure|http_illuminance|http_humidity" "|http_occupancy" var device + # #################################################################################################### + # Static function to compare two maps (shallow compare) + # return true if equal + static def equal_map(a, b) + # all items of a are in b + for k: a.keys() + if !b.contains(k) return false end + if b[k] != a[k] return false end + end + for k: b.keys() + if !a.contains(k) return false end + if b[k] != a[k] return false end + end + return true + end + + # #################################################################################################### + # Constructor def init(device) self.device = device tasmota.add_driver(self) @@ -56,29 +75,39 @@ class Matter_UI webserver.content_send(" Configure Matter

    ") end + #- ---------------------------------------------------------------------- -# + #- Is Matter enabled? + #- ---------------------------------------------------------------------- -# + def matter_enabled() + return bool(tasmota.get_option(matter.MATTER_OPTION)) + end + #- ---------------------------------------------------------------------- -# #- Show commissioning information and QR Code # # Returns true if Matter is enabled #- ---------------------------------------------------------------------- -# - def show_enable(p) + def show_enable() import webserver import string - var matter_enabled = tasmota.get_option(matter.MATTER_OPTION) + var matter_enabled = self.matter_enabled - webserver.content_send(string.format("
     Matter %s 

    ", - matter_enabled ? "Enabled" : "Disabled")) + webserver.content_send("
     Matter  

    " + "

    Check the Matter documentation.

    " + "
    ") - webserver.content_send("

    Check the Matter documentation.

    ") + # checkbox for Matter enable + webserver.content_send(string.format("

    ", self.matter_enabled() ? "checked" : "")) + webserver.content_send("

    ") - webserver.content_send("") - webserver.content_send(string.format("

    ") + if self.matter_enabled() + # checkbox for Matter commissioning + webserver.content_send(string.format("

    ", self.device.commissioning_open != nil ? "checked" : "")) + webserver.content_send("

    ") + end - webserver.content_send("

    ") - - return matter_enabled + webserver.content_send("

    " + "

    ") end #- ---------------------------------------------------------------------- -# @@ -145,13 +174,11 @@ class Matter_UI var pairing_code = self.device.compute_manual_pairing_code() webserver.content_send(string.format("

    Manual pairing code:
    %s-%s-%s


    ", pairing_code[0..3], pairing_code[4..6], pairing_code[7..])) - webserver.content_send(string.format("
    ")) + webserver.content_send("
    ") var qr_text = self.device.compute_qrcode_content() self.show_qrcode(qr_text) webserver.content_send(string.format("

    %s

    ", qr_text)) - webserver.content_send(string.format("
    ")) - - webserver.content_send("

    ") + webserver.content_send("

    ") end @@ -162,24 +189,16 @@ class Matter_UI import webserver import string - webserver.content_send("
     Matter Passcode 

    ") - # button for open/close commissioning - webserver.content_send("
    ") - if self.device.commissioning_open == nil - webserver.content_send(string.format("

    ", "Open Commissioning")) - else - webserver.content_send(string.format("

    ", "Close Commissioning")) - end - webserver.content_send("

    ") + webserver.content_send("
     Matter Advanced Configuration 

    ") # - webserver.content_send("
    ") - webserver.content_send("

    Passcode:

    ") + webserver.content_send("" + "

    Passcode:

    ") webserver.content_send(string.format("", self.device.root_passcode)) webserver.content_send("

    Distinguish id:

    ") webserver.content_send(string.format("", self.device.root_discriminator)) webserver.content_send(string.format("

    IPv4 only

    ", self.device.ipv4only ? " checked" : "")) - webserver.content_send("

    ") - webserver.content_send("

    ") + webserver.content_send("

    " + "

    ") end @@ -190,8 +209,8 @@ class Matter_UI import webserver import string - webserver.content_send("
     Fabrics 

    ") - webserver.content_send("

    Associated fabrics:

    ") + webserver.content_send("
     Fabrics 

    " + "

    Associated fabrics:

    ") if size(self.device.sessions.sessions) == 0 webserver.content_send("

    None

    ") @@ -230,68 +249,176 @@ class Matter_UI def show_plugins_configuration() import webserver import string + import introspect webserver.content_send("
     Current Configuration 

    ") - webserver.content_send("
    ") - webserver.content_send("

    ") + # webserver.content_send("

    ") + # webserver.content_send("

    ") - webserver.content_send("
    ") - webserver.content_send("") - webserver.content_send("") + webserver.content_send("Local sensors and devices

    " + "
    Ep.TypeParam
    " + "") # display one line per plug-in + self.device.plugins_config.remove("0") # remove any leftover from ancient configuration var endpoints = self.device.k2l_num(self.device.plugins_config) var i = 0 + var found = false - # special case for root node - # display a fake configuration item (disabled) - webserver.content_send("") - webserver.content_send("") - webserver.content_send("") - while i < size(endpoints) var ep = endpoints[i] - if ep == 0 i += 1 continue end # skip endpoint 0 (leftover from previous versions) - var conf = self.device.plugins_config[str(ep)] + var conf = self.device.plugins_config.find(str(ep)) var typ = conf.find('type') if !typ i += 1 continue end + # skip any remote class + if string.find(typ, "http_") == 0 i += 1 continue end + var cl = self.device.plugins_classes.find(typ) var arg = "" if cl != nil arg = cl.ui_conf_to_string(cl, conf) end - # var arg_name = self.device.get_plugin_class_arg(typ) - # var arg = arg_name ? str(conf.find(arg_name, '')) : '' - webserver.content_send(string.format("", i, ep)) + found = true + webserver.content_send(string.format("", ep)) - webserver.content_send(string.format("")) - webserver.content_send(string.format("", - i, webserver.html_escape(arg))) - + webserver.content_send(string.format("", self.plugin_name(conf.find('type', '')))) + webserver.content_send(string.format("", + ep, webserver.html_escape(arg))) + webserver.content_send(string.format("", ep)) i += 1 end + webserver.content_send("
    #TypeParameter
     
    %i%s
    ") + + # if array is empty, still display + if !found + webserver.content_send("

    <none>

    ") + end # add an empty line for adding a configuration - webserver.content_send(string.format("", i)) - webserver.content_send(string.format("")) - webserver.content_send(string.format("", i)) + # webserver.content_send(string.format("", i)) + # webserver.content_send(string.format("")) + # webserver.content_send(string.format("", i)) - webserver.content_send("

    ") - webserver.content_send("") - webserver.content_send("

    ") + # remote devices + webserver.content_send("

    ") + + # iterate on each remote device + + var remotes = [] + for conf: self.device.plugins_config + var url = conf.find("url") + if url != nil + remotes.push(url) + end + end + self.device.sort_distinct(remotes) + tasmota.log("MTR: remotes: "+str(remotes), 3) + + for remote: remotes + + webserver.content_send(string.format("🔗 %s", webserver.html_escape(remote), webserver.html_escape(remote))) + webserver.content_send("") + webserver.content_send("") + + found = false + i = 0 + while i < size(endpoints) + var ep = endpoints[i] + var conf = self.device.plugins_config.find(str(ep)) + var typ = conf.find('type') + if !typ i += 1 continue end + + # skip any non-remote class + if string.find(typ, "http_") != 0 i += 1 continue end + # check if it's the right remote + if conf.find("url") != remote i += 1 continue end + + var cl = self.device.plugins_classes.find(typ) + var arg = "" + if cl != nil + arg = cl.ui_conf_to_string(cl, conf) + end + + found = true + webserver.content_send(string.format("", ep)) + + webserver.content_send(string.format("", self.plugin_name(conf.find('type', '')))) + webserver.content_send(string.format("", + ep, webserver.html_escape(arg))) + webserver.content_send(string.format("", ep)) + i += 1 + end + webserver.content_send("
    %i%s

    ") + + end # for remote: self.device.get_remotes_list() + + + + if !found + webserver.content_send("

    <none>

    ") + end + + webserver.content_send("") + + # Add new endpoint section + webserver.content_send("

    Add local sensor or device

    " + "
    " + "" + "") + + webserver.content_send("") + webserver.content_send("" + "
    TypeParameter
    ") + + webserver.content_send("
    ") + webserver.content_send("
    ") + + # Add remote endpoint + webserver.content_send("

    Add Remote Tasmota

    " + "
    " + "") + webserver.content_send("" + "
    http:///
    ") + + webserver.content_send("
    ") + webserver.content_send("

    ") + + # button "Reset and Auto-discover" + webserver.content_send("
    " + "

    ") + + webserver.content_send("

    ") + + end + + #- ---------------------------------------------------------------------- -# + #- Show pretty name for plugin class + #- ---------------------------------------------------------------------- -# + def plugin_name(cur, *class_list) + if cur == '' return '' end + return self.device.get_plugin_class_displayname(cur) end #- ---------------------------------------------------------------------- -# @@ -320,6 +447,28 @@ class Matter_UI end end + + ####################################################################### + # Display the advanced configuration page + ####################################################################### + def page_part_mgr_adv() + import webserver + import string + + if !webserver.check_privileged_access() return nil end + + webserver.content_start("Matter Advanced Configuration") #- title of the web page -# + webserver.content_send_style() #- send standard Tasmota styles -# + + if self.matter_enabled() + self.show_passcode_form() + self.show_fabric_info() + end + webserver.content_button(webserver.BUTTON_CONFIGURATION) + webserver.content_stop() #- end of web page -# + end + + ####################################################################### # Display the complete page ####################################################################### @@ -332,17 +481,188 @@ class Matter_UI webserver.content_start("Matter") #- title of the web page -# webserver.content_send_style() #- send standard Tasmota styles -# - if self.show_enable() - self.show_passcode_form() + self.show_enable() + if self.matter_enabled() self.show_plugins_configuration() - self.show_fabric_info() + end + + webserver.content_send("
    ") + webserver.content_send("

    ") + + webserver.content_button(webserver.BUTTON_CONFIGURATION) + webserver.content_stop() #- end of web page -# + end + + #---------------------------------------------------------------------- -# + # Generate configuration map from Status 8 and Status 11 + # + # Returns a list of maps: [ {"type":"temperature", "filter":"ESP32#Temperature"} ] + #---------------------------------------------------------------------- -# + def generate_config_from_status(status8, status11) + var config_list = [] + + # count `Power` and `Power` + var power_cnt = 0 + if status11.contains("POWER") + power_cnt = 1 + else + var idx = 1 + while true + if status11.contains("POWER" + str(idx)) + power_cnt = idx + idx += 1 + else + break + end + end + end + # Now `power_cnt` contains the number of Relays including light + + # detect lights + var light1, light2, light3 # contains a relay number of nil + if status11.contains("HSBColor") + light3 = power_cnt + power_cnt -= 1 + elif status11.contains("CT") + light2 = power_cnt + power_cnt -= 1 + elif status11.contains("Dimmer") + light1 = power_cnt + power_cnt -= 1 + end + + # rest is relays + for i: 1..power_cnt + config_list.push({'type': 'light0', 'relay': i}) + end + + # show lights + if light1 != nil + config_list.push({'type': 'light1', 'relay': light1}) + end + if light2 != nil + config_list.push({'type': 'light2', 'relay': light2}) + end + if light3 != nil + config_list.push({'type': 'light3', 'relay': light3}) + end + + + # detect sensors + config_list += self.device.autoconf_sensors_list(status8) + + return config_list + end + + #- ---------------------------------------------------------------------- -# + #- Probe remote device + #- ---------------------------------------------------------------------- -# + def show_remote_autoconf(url) + import webserver + import string + import json + + if url == '' return end + var timeout = matter.Plugin_Bridge_HTTP.PROBE_TIMEOUT + var http_remote = matter.HTTP_remote(url, timeout) + # Status 8 + var status8 = http_remote.call_sync('Status 8', timeout) + if status8 != nil status8 = json.load(status8) end + if status8 != nil status8 = status8.find('StatusSNS') end + # Status 11 + var status11 + if status8 != nil + status11 = http_remote.call_sync('Status 11', timeout) + if status11 != nil status11 = json.load(status11) end + if status11 != nil status11 = status11.find('StatusSTS') end + end + + if status8 != nil && status11 != nil + tasmota.log(string.format("MTR: probed '%s' status8=%s satus11=%s", url, str(status8), str(status11)), 3) + + var config_list = self.generate_config_from_status(status8, status11) + + webserver.content_send("
     Matter Remote Device 

    " + "

    Add Remote sensor or device

    ") + + webserver.content_send(string.format("

    🔗 %s

    ", webserver.html_escape(url), webserver.html_escape(url))) + + # Add new endpoint section + webserver.content_send("
    " + "" + "") + + webserver.content_send(string.format("", webserver.html_escape(url))) + + var i = 0 + while i < size(config_list) + var config = config_list[i] + var typ = config.find('type', '') + if typ != '' typ = "http_" + typ end + + var cl = self.device.plugins_classes.find(typ) + var arg = "" + if cl != nil + arg = cl.ui_conf_to_string(cl, config) + end + + webserver.content_send(string.format("" + "") + i += 1 + end + # empty line for new endpoint + webserver.content_send(string.format("" + "") + + # end of table + webserver.content_send("
    TypeParameter
    ") + webserver.content_send(string.format("", + i, webserver.html_escape(arg))) + webserver.content_send("
    ") + webserver.content_send(string.format("", + i, '')) + webserver.content_send("
    ") + + webserver.content_send("
    ") + webserver.content_send("
    ") + + webserver.content_send("

    ") + + else + webserver.content_send(string.format("

    Unable to connect to '%s'

    ", webserver.html_escape(url))) + end + + + end + + ####################################################################### + # Display the page for adding a new endpoint + ####################################################################### + def page_part_mgr_add() + import webserver + import string + + if !webserver.check_privileged_access() return nil end + + webserver.content_start("Matter Create new endpoint") #- title of the web page -# + webserver.content_send_style() #- send standard Tasmota styles -# + + var url = webserver.arg("url") + if self.matter_enabled() + self.show_remote_autoconf(url) end webserver.content_button(webserver.BUTTON_CONFIGURATION) webserver.content_stop() #- end of web page -# end + ####################################################################### - # Web Controller, called by POST to `/part_wiz` + # Web Controller, called by POST to `/matterc` ####################################################################### def page_part_ctl() import webserver @@ -356,6 +676,11 @@ class Matter_UI try + # debug information about parameters + for i:0..webserver.arg_size()-1 + tasmota.log(string.format("MTR: Arg%i '%s' = '%s'", i, webserver.arg_name(i), webserver.arg(i))) + end + #---------------------------------------------------------------------# # Change Passcode and/or Passcode #---------------------------------------------------------------------# @@ -373,33 +698,32 @@ class Matter_UI #- and force restart -# webserver.redirect("/?rst=") - #---------------------------------------------------------------------# - # Enable or Disable Commissioning - #---------------------------------------------------------------------# - elif webserver.has_arg("open_comm") - self.device.start_root_basic_commissioning() - webserver.redirect("/") - elif webserver.has_arg("clos_comm") - self.device.stop_basic_commissioning() - webserver.redirect("/") + elif webserver.has_arg("save") + var matter_enabled_requested = webserver.has_arg("menable") + var matter_commissioning_requested = webserver.has_arg("comm") - #---------------------------------------------------------------------# - # Enable Matter - #---------------------------------------------------------------------# - elif webserver.has_arg("enable") - tasmota.log(string.format("MTR: /matterc received '%s' command", 'enable'), 3) - tasmota.cmd("SetOption" + str(matter.MATTER_OPTION) + " 1") - #- and force restart -# - webserver.redirect("/?rst=") - - #---------------------------------------------------------------------# - # Disable Matter - #---------------------------------------------------------------------# - elif webserver.has_arg("disable") - tasmota.log(string.format("MTR: /matterc received '%s' command", 'disable'), 3) - tasmota.cmd("SetOption" + str(matter.MATTER_OPTION) + " 0") - #- and force restart -# - webserver.redirect("/?rst=") + if matter_enabled_requested != self.matter_enabled() + if matter_enabled_requested + tasmota.log(string.format("MTR: /matterc received '%s' command", 'enable'), 3) + tasmota.cmd("SetOption" + str(matter.MATTER_OPTION) + " 1") + else + tasmota.log(string.format("MTR: /matterc received '%s' command", 'disable'), 3) + tasmota.cmd("SetOption" + str(matter.MATTER_OPTION) + " 0") + end + #- and force restart -# + webserver.redirect("/?rst=") + elif matter_commissioning_requested != (self.device.commissioning_open != nil) + if matter_commissioning_requested + self.device.start_root_basic_commissioning() + else + self.device.stop_basic_commissioning() + end + + #- and force restart -# + webserver.redirect("/") + else + webserver.redirect("/") + end #---------------------------------------------------------------------# # Delete Fabric @@ -434,56 +758,130 @@ class Matter_UI # Apply new configuration template #---------------------------------------------------------------------# elif webserver.has_arg("config") - var config = {} - tasmota.log(string.format("MTR: /matterc received '%s' command", 'config'), 3) - # iterate by id - var idx = 0 - var idx_str = string.format("%03i", idx) - while webserver.has_arg('ep'+idx_str) + var needs_saving = false + # iterate by endpoint number + for i:0..webserver.arg_size()-1 + var arg_name = webserver.arg_name(i) + if string.find(arg_name, "arg") == 0 + var arg_ep = int(arg_name[3..]) # target endpoint as int + var arg = webserver.arg(i) # text value - var ep = webserver.arg('ep'+idx_str) - var ep_int = int(ep) - var typ = webserver.arg('pi'+idx_str) - var arg = webserver.arg('arg'+idx_str) - tasmota.log(string.format("MTR: ep=%i type=%s arg=%s", ep, typ, arg), 3) + var conf_ep = self.device.plugins_config.find(str(arg_ep)) # find the corresponding configuration map - if ep != '' && typ != '' && ep != '0' - - # check if type exists - var typ_class = self.device.plugins_classes.find(typ) - if typ_class != nil - var elt = {'type':typ} - typ_class.ui_string_to_conf(typ_class, elt, arg) - # var arg_name = typ_class.ARG - # var arg_type = typ_class.ARG_TYPE - # if arg && arg_name - # elt[arg_name] = arg_type(arg) - # end - config[ep] = elt + if conf_ep != nil # found + var typ_class = self.device.plugins_classes.find(conf_ep.find('type', '')) + if typ_class != nil + tasmota.log(string.format("MTR: ep=%i arg=%s", arg_ep, arg), 3) + # compute the actual value + var prev_arg = typ_class.ui_conf_to_string(typ_class, conf_ep) + var changed = (prev_arg != arg) + tasmota.log(string.format("MTR: ep=%i prev_arg='%s' arg='%s' %s", arg_ep, prev_arg, arg, prev_arg != arg ? "changed" : ""), 3) - else - tasmota.log(string.format("MTR: unknown type = %s", typ), 2) + if changed + needs_saving = true + typ_class.ui_string_to_conf(typ_class, conf_ep, arg) + var pl = self.device.find_plugin_by_endpoint(arg_ep) + if pl + tasmota.log(string.format("MTR: apply conf '%s' (%i) to %s", conf_ep, arg_ep, pl), 3) + pl.parse_configuration(conf_ep) + end + end + + end + else + tasmota.log(string.format("MTR: ep=%i not found", arg_ep), 3) end - - else - tasmota.log("MTR: skipping parameter", 2) end - - idx += 1 - idx_str = string.format("%03i", idx) end - tasmota.log(string.format("MTR: config = %s", str(config)), 3) + tasmota.log(string.format("MTR: config = %s", str(self.device.plugins_config)), 3) if error tasmota.log(string.format("MTR: config error = %s", error), 3) else - self.device.plugins_config = config - self.device.plugins_persist = true - self.device.save_param() - #- and force restart -# - webserver.redirect("/?rst=") + if needs_saving || !self.device.plugins_persist + self.device.plugins_persist = true + self.device.save_param() + end + #- and reload -# + webserver.redirect("/cn?") + end + #---------------------------------------------------------------------# + # Add new endpoint for local sensor or device + #---------------------------------------------------------------------# + elif webserver.has_arg("addep") + var typ = webserver.arg('pi') + var arg = webserver.arg('arg') + tasmota.log(string.format("MTR: add endpoint typ='%s' arg='%s'", typ, arg), 3) + + # check if type exists + var typ_class = self.device.plugins_classes.find(typ) + if typ_class != nil + var config = {} + typ_class.ui_string_to_conf(typ_class, config, arg) + self.device.bridge_add_endpoint(typ, config) + end + #- and reload -# + webserver.redirect("/matterc?") + + #---------------------------------------------------------------------# + # Add new endpoint for local sensor or device + #---------------------------------------------------------------------# + elif webserver.has_arg("addrem") + var url = webserver.arg('url') + if url == nil || url == '' raise "value_error", "url shouldn't be null" end + + # iterate by id + var idx = 0 + var idx_str = str(idx) + while webserver.has_arg('pi'+idx_str) + var typ = webserver.arg('pi'+idx_str) + var arg = webserver.arg('arg'+idx_str) + + if typ != '' + # check if type exists + var typ_class = self.device.plugins_classes.find(typ) + if typ_class != nil + var config = {'url': url, 'type': typ} + typ_class.ui_string_to_conf(typ_class, config, arg) + # check if configuration is already present + var duplicate = false + for c: self.device.plugins_config # iterate on values, not on keys() + # tasmota.log(string.format("MTR: map_compare '%s' ?= '%s' -> %s", str(c), str(config), str(self.equal_map(c,config))), 3) + if self.equal_map(c,config) duplicate = true break end + end + # not a duplicate, add it + if !duplicate + tasmota.log(string.format("MTR: remote add url='%s' type='%s' arg='%s'", url, typ, arg), 3) + self.device.bridge_add_endpoint(typ, config) + end + end + end + idx += 1 + idx_str = str(idx) + end + #- and go back to Matter configuration -# + webserver.redirect("/matterc?") + + else + + #---------------------------------------------------------------------# + # Check if an endpoint needs to be deleted + #---------------------------------------------------------------------# + var ep_deleted + for i:0..webserver.arg_size()-1 + var arg_name = webserver.arg_name(i) + if string.find(arg_name, "del") == 0 + ep_deleted = int(arg_name[3..]) + break + end + end + # check if we found an endpoint to be deleted + if ep_deleted != nil + tasmota.log(string.format("MTR: deleting endpoint %i", ep_deleted), 2) + self.device.bridge_remove_endpoint(ep_deleted) + webserver.redirect("/matterc?") end end @@ -561,9 +959,7 @@ class Matter_UI import webserver import string - var matter_enabled = tasmota.get_option(matter.MATTER_OPTION) - - if matter_enabled + if self.matter_enabled() # mtc0 = close, mtc1 = open commissioning var fabrics_count = self.device.sessions.count_active_fabrics() @@ -580,16 +976,6 @@ class Matter_UI self.show_commissioning_info() end - # display the open/close commissioning button only if there is no active session - if fabrics_count == 0 - webserver.content_send(string.format("") - else - webserver.content_send(" Close Commissioning") - end - end end end @@ -611,6 +997,8 @@ class Matter_UI #- we need to register a closure, not just a function, that captures the current instance -# webserver.on("/matterc", / -> self.page_part_mgr(), webserver.HTTP_GET) webserver.on("/matterc", / -> self.page_part_ctl(), webserver.HTTP_POST) + webserver.on("/mattera", / -> self.page_part_mgr_adv(), webserver.HTTP_GET) # advanced + webserver.on("/matteradd", / -> self.page_part_mgr_add(), webserver.HTTP_GET) # add endpoint end end matter.UI = Matter_UI diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Device.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Device.h index d8709dbf0..2844d3a78 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Device.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Device.h @@ -7,44 +7,36 @@ extern const bclass be_class_Matter_Device; /******************************************************************** -** Solidified function: every_250ms +** Solidified function: get_plugin_class_arg ********************************************************************/ -be_local_closure(Matter_Device_every_250ms, /* name */ +be_local_closure(Matter_Device_get_plugin_class_arg, /* name */ be_nested_proto( - 4, /* nstack */ - 1, /* argc */ + 5, /* nstack */ + 2, /* argc */ 2, /* varg */ 0, /* has upvals */ NULL, /* no upvals */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[ 5]) { /* constants */ - /* K0 */ be_nested_str_weak(message_handler), - /* K1 */ be_nested_str_weak(every_250ms), - /* K2 */ be_const_int(0), - /* K3 */ be_nested_str_weak(plugins), - /* K4 */ be_const_int(1), + ( &(const bvalue[ 4]) { /* constants */ + /* K0 */ be_nested_str_weak(plugins_classes), + /* K1 */ be_nested_str_weak(find), + /* K2 */ be_nested_str_weak(ARG), + /* K3 */ be_nested_str_weak(), }), - be_str_weak(every_250ms), + be_str_weak(get_plugin_class_arg), &be_const_str_solidified, - ( &(const binstruction[16]) { /* code */ - 0x88040100, // 0000 GETMBR R1 R0 K0 - 0x8C040301, // 0001 GETMET R1 R1 K1 - 0x7C040200, // 0002 CALL R1 1 - 0x58040002, // 0003 LDCONST R1 K2 - 0x6008000C, // 0004 GETGBL R2 G12 - 0x880C0103, // 0005 GETMBR R3 R0 K3 - 0x7C080200, // 0006 CALL R2 1 - 0x14080202, // 0007 LT R2 R1 R2 - 0x780A0005, // 0008 JMPF R2 #000F - 0x88080103, // 0009 GETMBR R2 R0 K3 - 0x94080401, // 000A GETIDX R2 R2 R1 - 0x8C080501, // 000B GETMET R2 R2 K1 - 0x7C080200, // 000C CALL R2 1 - 0x00040304, // 000D ADD R1 R1 K4 - 0x7001FFF4, // 000E JMP #0004 - 0x80000000, // 000F RET 0 + ( &(const binstruction[ 9]) { /* code */ + 0x88080100, // 0000 GETMBR R2 R0 K0 + 0x8C080501, // 0001 GETMET R2 R2 K1 + 0x5C100200, // 0002 MOVE R4 R1 + 0x7C080400, // 0003 CALL R2 2 + 0x780A0001, // 0004 JMPF R2 #0007 + 0x880C0502, // 0005 GETMBR R3 R2 K2 + 0x70020000, // 0006 JMP #0008 + 0x580C0003, // 0007 LDCONST R3 K3 + 0x80040600, // 0008 RET 1 R3 }) ) ); @@ -52,122 +44,72 @@ be_local_closure(Matter_Device_every_250ms, /* name */ /******************************************************************** -** Solidified function: _trigger_read_sensors +** Solidified function: mdns_remove_op_discovery_all_fabrics ********************************************************************/ -be_local_closure(Matter_Device__trigger_read_sensors, /* name */ - be_nested_proto( - 8, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[11]) { /* constants */ - /* K0 */ be_nested_str_weak(json), - /* K1 */ be_nested_str_weak(tasmota), - /* K2 */ be_nested_str_weak(read_sensors), - /* K3 */ be_nested_str_weak(load), - /* K4 */ be_const_int(0), - /* K5 */ be_nested_str_weak(plugins), - /* K6 */ be_nested_str_weak(parse_sensors), - /* K7 */ be_const_int(1), - /* K8 */ be_nested_str_weak(log), - /* K9 */ be_nested_str_weak(MTR_X3A_X20unable_X20to_X20parse_X20read_sensors_X3A_X20), - /* K10 */ be_const_int(3), - }), - be_str_weak(_trigger_read_sensors), - &be_const_str_solidified, - ( &(const binstruction[37]) { /* code */ - 0xA4060000, // 0000 IMPORT R1 K0 - 0xB80A0200, // 0001 GETNGBL R2 K1 - 0x8C080502, // 0002 GETMET R2 R2 K2 - 0x7C080200, // 0003 CALL R2 1 - 0x4C0C0000, // 0004 LDNIL R3 - 0x1C0C0403, // 0005 EQ R3 R2 R3 - 0x780E0000, // 0006 JMPF R3 #0008 - 0x80000600, // 0007 RET 0 - 0x8C0C0303, // 0008 GETMET R3 R1 K3 - 0x5C140400, // 0009 MOVE R5 R2 - 0x7C0C0400, // 000A CALL R3 2 - 0x4C100000, // 000B LDNIL R4 - 0x20100604, // 000C NE R4 R3 R4 - 0x7812000D, // 000D JMPF R4 #001C - 0x58100004, // 000E LDCONST R4 K4 - 0x6014000C, // 000F GETGBL R5 G12 - 0x88180105, // 0010 GETMBR R6 R0 K5 - 0x7C140200, // 0011 CALL R5 1 - 0x14140805, // 0012 LT R5 R4 R5 - 0x78160006, // 0013 JMPF R5 #001B - 0x88140105, // 0014 GETMBR R5 R0 K5 - 0x94140A04, // 0015 GETIDX R5 R5 R4 - 0x8C140B06, // 0016 GETMET R5 R5 K6 - 0x5C1C0600, // 0017 MOVE R7 R3 - 0x7C140400, // 0018 CALL R5 2 - 0x00100907, // 0019 ADD R4 R4 K7 - 0x7001FFF3, // 001A JMP #000F - 0x70020007, // 001B JMP #0024 - 0xB8120200, // 001C GETNGBL R4 K1 - 0x8C100908, // 001D GETMET R4 R4 K8 - 0x60180008, // 001E GETGBL R6 G8 - 0x5C1C0400, // 001F MOVE R7 R2 - 0x7C180200, // 0020 CALL R6 1 - 0x001A1206, // 0021 ADD R6 K9 R6 - 0x581C000A, // 0022 LDCONST R7 K10 - 0x7C100600, // 0023 CALL R4 3 - 0x80000000, // 0024 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: every_50ms -********************************************************************/ -be_local_closure(Matter_Device_every_50ms, /* name */ - be_nested_proto( - 2, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 2]) { /* constants */ - /* K0 */ be_nested_str_weak(tick), - /* K1 */ be_const_int(1), - }), - be_str_weak(every_50ms), - &be_const_str_solidified, - ( &(const binstruction[ 4]) { /* code */ - 0x88040100, // 0000 GETMBR R1 R0 K0 - 0x00040301, // 0001 ADD R1 R1 K1 - 0x90020001, // 0002 SETMBR R0 K0 R1 - 0x80000000, // 0003 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: start -********************************************************************/ -be_local_closure(Matter_Device_start, /* name */ +be_local_closure(Matter_Device_mdns_remove_op_discovery_all_fabrics, /* name */ be_nested_proto( 6, /* nstack */ 1, /* argc */ 2, /* varg */ 0, /* has upvals */ NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 6]) { /* constants */ + /* K0 */ be_nested_str_weak(sessions), + /* K1 */ be_nested_str_weak(active_fabrics), + /* K2 */ be_nested_str_weak(get_device_id), + /* K3 */ be_nested_str_weak(get_fabric_id), + /* K4 */ be_nested_str_weak(mdns_remove_op_discovery), + /* K5 */ be_nested_str_weak(stop_iteration), + }), + be_str_weak(mdns_remove_op_discovery_all_fabrics), + &be_const_str_solidified, + ( &(const binstruction[22]) { /* code */ + 0x60040010, // 0000 GETGBL R1 G16 + 0x88080100, // 0001 GETMBR R2 R0 K0 + 0x8C080501, // 0002 GETMET R2 R2 K1 + 0x7C080200, // 0003 CALL R2 1 + 0x7C040200, // 0004 CALL R1 1 + 0xA802000B, // 0005 EXBLK 0 #0012 + 0x5C080200, // 0006 MOVE R2 R1 + 0x7C080000, // 0007 CALL R2 0 + 0x8C0C0502, // 0008 GETMET R3 R2 K2 + 0x7C0C0200, // 0009 CALL R3 1 + 0x780E0005, // 000A JMPF R3 #0011 + 0x8C0C0503, // 000B GETMET R3 R2 K3 + 0x7C0C0200, // 000C CALL R3 1 + 0x780E0002, // 000D JMPF R3 #0011 + 0x8C0C0104, // 000E GETMET R3 R0 K4 + 0x5C140400, // 000F MOVE R5 R2 + 0x7C0C0400, // 0010 CALL R3 2 + 0x7001FFF3, // 0011 JMP #0006 + 0x58040005, // 0012 LDCONST R1 K5 + 0xAC040200, // 0013 CATCH R1 1 0 + 0xB0080000, // 0014 RAISE 2 R0 R0 + 0x80000000, // 0015 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: _start_udp +********************************************************************/ +be_local_closure(Matter_Device__start_udp, /* name */ + be_nested_proto( + 6, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ 1, /* has sup protos */ ( &(const struct bproto*[ 1]) { be_nested_proto( - 2, /* nstack */ - 0, /* argc */ + 8, /* nstack */ + 3, /* argc */ 0, /* varg */ 1, /* has upvals */ ( &(const bupvaldesc[ 1]) { /* upvals */ @@ -177,53 +119,63 @@ be_local_closure(Matter_Device_start, /* name */ NULL, /* no sub protos */ 1, /* has constants */ ( &(const bvalue[ 1]) { /* constants */ - /* K0 */ be_nested_str_weak(_trigger_read_sensors), + /* K0 */ be_nested_str_weak(msg_received), }), - be_str_weak(_anonymous_), + be_str_weak(_X3Clambda_X3E), &be_const_str_solidified, - ( &(const binstruction[ 4]) { /* code */ - 0x68000000, // 0000 GETUPV R0 U0 - 0x8C000100, // 0001 GETMET R0 R0 K0 - 0x7C000200, // 0002 CALL R0 1 - 0x80000000, // 0003 RET 0 + ( &(const binstruction[ 7]) { /* code */ + 0x680C0000, // 0000 GETUPV R3 U0 + 0x8C0C0700, // 0001 GETMET R3 R3 K0 + 0x5C140000, // 0002 MOVE R5 R0 + 0x5C180200, // 0003 MOVE R6 R1 + 0x5C1C0400, // 0004 MOVE R7 R2 + 0x7C0C0800, // 0005 CALL R3 4 + 0x80040600, // 0006 RET 1 R3 }) ), }), 1, /* has constants */ ( &(const bvalue[ 9]) { /* constants */ - /* K0 */ be_nested_str_weak(started), - /* K1 */ be_nested_str_weak(autoconf_device), - /* K2 */ be_nested_str_weak(tasmota), - /* K3 */ be_nested_str_weak(add_cron), - /* K4 */ be_nested_str_weak(_X2A_X2F30_X20_X2A_X20_X2A_X20_X2A_X20_X2A_X20_X2A), - /* K5 */ be_nested_str_weak(matter_sensors_30s), - /* K6 */ be_nested_str_weak(_start_udp), - /* K7 */ be_nested_str_weak(UDP_PORT), - /* K8 */ be_nested_str_weak(start_mdns_announce_hostnames), + /* K0 */ be_nested_str_weak(udp_server), + /* K1 */ be_nested_str_weak(tasmota), + /* K2 */ be_nested_str_weak(log), + /* K3 */ be_nested_str_weak(MTR_X3A_X20starting_X20UDP_X20server_X20on_X20port_X3A_X20), + /* K4 */ be_const_int(2), + /* K5 */ be_nested_str_weak(matter), + /* K6 */ be_nested_str_weak(UDPServer), + /* K7 */ be_nested_str_weak(), + /* K8 */ be_nested_str_weak(start), }), - be_str_weak(start), + be_str_weak(_start_udp), &be_const_str_solidified, - ( &(const binstruction[20]) { /* code */ - 0x88040100, // 0000 GETMBR R1 R0 K0 - 0x78060000, // 0001 JMPF R1 #0003 - 0x80000200, // 0002 RET 0 - 0x8C040101, // 0003 GETMET R1 R0 K1 - 0x7C040200, // 0004 CALL R1 1 - 0xB8060400, // 0005 GETNGBL R1 K2 - 0x8C040303, // 0006 GETMET R1 R1 K3 - 0x580C0004, // 0007 LDCONST R3 K4 - 0x84100000, // 0008 CLOSURE R4 P0 - 0x58140005, // 0009 LDCONST R5 K5 - 0x7C040800, // 000A CALL R1 4 - 0x8C040106, // 000B GETMET R1 R0 K6 - 0x880C0107, // 000C GETMBR R3 R0 K7 - 0x7C040400, // 000D CALL R1 2 - 0x8C040108, // 000E GETMET R1 R0 K8 - 0x7C040200, // 000F CALL R1 1 - 0x50040200, // 0010 LDBOOL R1 1 0 - 0x90020001, // 0011 SETMBR R0 K0 R1 - 0xA0000000, // 0012 CLOSE R0 - 0x80000000, // 0013 RET 0 + ( &(const binstruction[27]) { /* code */ + 0x88080100, // 0000 GETMBR R2 R0 K0 + 0x780A0000, // 0001 JMPF R2 #0003 + 0x80000400, // 0002 RET 0 + 0x4C080000, // 0003 LDNIL R2 + 0x1C080202, // 0004 EQ R2 R1 R2 + 0x780A0000, // 0005 JMPF R2 #0007 + 0x540615A3, // 0006 LDINT R1 5540 + 0xB80A0200, // 0007 GETNGBL R2 K1 + 0x8C080502, // 0008 GETMET R2 R2 K2 + 0x60100008, // 0009 GETGBL R4 G8 + 0x5C140200, // 000A MOVE R5 R1 + 0x7C100200, // 000B CALL R4 1 + 0x00120604, // 000C ADD R4 K3 R4 + 0x58140004, // 000D LDCONST R5 K4 + 0x7C080600, // 000E CALL R2 3 + 0xB80A0A00, // 000F GETNGBL R2 K5 + 0x8C080506, // 0010 GETMET R2 R2 K6 + 0x58100007, // 0011 LDCONST R4 K7 + 0x5C140200, // 0012 MOVE R5 R1 + 0x7C080600, // 0013 CALL R2 3 + 0x90020002, // 0014 SETMBR R0 K0 R2 + 0x88080100, // 0015 GETMBR R2 R0 K0 + 0x8C080508, // 0016 GETMET R2 R2 K8 + 0x84100000, // 0017 CLOSURE R4 P0 + 0x7C080400, // 0018 CALL R2 2 + 0xA0000000, // 0019 CLOSE R0 + 0x80000000, // 001A RET 0 }) ) ); @@ -231,11 +183,114 @@ be_local_closure(Matter_Device_start, /* name */ /******************************************************************** -** Solidified function: compute_manual_pairing_code +** Solidified function: find_plugin_by_endpoint ********************************************************************/ -be_local_closure(Matter_Device_compute_manual_pairing_code, /* name */ +be_local_closure(Matter_Device_find_plugin_by_endpoint, /* name */ be_nested_proto( - 11, /* nstack */ + 6, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 4]) { /* constants */ + /* K0 */ be_const_int(0), + /* K1 */ be_nested_str_weak(plugins), + /* K2 */ be_nested_str_weak(get_endpoint), + /* K3 */ be_const_int(1), + }), + be_str_weak(find_plugin_by_endpoint), + &be_const_str_solidified, + ( &(const binstruction[17]) { /* code */ + 0x58080000, // 0000 LDCONST R2 K0 + 0x600C000C, // 0001 GETGBL R3 G12 + 0x88100101, // 0002 GETMBR R4 R0 K1 + 0x7C0C0200, // 0003 CALL R3 1 + 0x140C0403, // 0004 LT R3 R2 R3 + 0x780E0008, // 0005 JMPF R3 #000F + 0x880C0101, // 0006 GETMBR R3 R0 K1 + 0x940C0602, // 0007 GETIDX R3 R3 R2 + 0x8C100702, // 0008 GETMET R4 R3 K2 + 0x7C100200, // 0009 CALL R4 1 + 0x1C100801, // 000A EQ R4 R4 R1 + 0x78120000, // 000B JMPF R4 #000D + 0x80040600, // 000C RET 1 R3 + 0x00080503, // 000D ADD R2 R2 K3 + 0x7001FFF1, // 000E JMP #0001 + 0x4C0C0000, // 000F LDNIL R3 + 0x80040600, // 0010 RET 1 R3 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: get_active_endpoints +********************************************************************/ +be_local_closure(Matter_Device_get_active_endpoints, /* name */ + be_nested_proto( + 9, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 6]) { /* constants */ + /* K0 */ be_nested_str_weak(plugins), + /* K1 */ be_nested_str_weak(get_endpoint), + /* K2 */ be_const_int(0), + /* K3 */ be_nested_str_weak(find), + /* K4 */ be_nested_str_weak(push), + /* K5 */ be_nested_str_weak(stop_iteration), + }), + be_str_weak(get_active_endpoints), + &be_const_str_solidified, + ( &(const binstruction[28]) { /* code */ + 0x60080012, // 0000 GETGBL R2 G18 + 0x7C080000, // 0001 CALL R2 0 + 0x600C0010, // 0002 GETGBL R3 G16 + 0x88100100, // 0003 GETMBR R4 R0 K0 + 0x7C0C0200, // 0004 CALL R3 1 + 0xA8020011, // 0005 EXBLK 0 #0018 + 0x5C100600, // 0006 MOVE R4 R3 + 0x7C100000, // 0007 CALL R4 0 + 0x8C140901, // 0008 GETMET R5 R4 K1 + 0x7C140200, // 0009 CALL R5 1 + 0x78060002, // 000A JMPF R1 #000E + 0x1C180B02, // 000B EQ R6 R5 K2 + 0x781A0000, // 000C JMPF R6 #000E + 0x7001FFF7, // 000D JMP #0006 + 0x8C180503, // 000E GETMET R6 R2 K3 + 0x5C200A00, // 000F MOVE R8 R5 + 0x7C180400, // 0010 CALL R6 2 + 0x4C1C0000, // 0011 LDNIL R7 + 0x1C180C07, // 0012 EQ R6 R6 R7 + 0x781A0002, // 0013 JMPF R6 #0017 + 0x8C180504, // 0014 GETMET R6 R2 K4 + 0x5C200A00, // 0015 MOVE R8 R5 + 0x7C180400, // 0016 CALL R6 2 + 0x7001FFED, // 0017 JMP #0006 + 0x580C0005, // 0018 LDCONST R3 K5 + 0xAC0C0200, // 0019 CATCH R3 1 0 + 0xB0080000, // 001A RAISE 2 R0 R0 + 0x80040400, // 001B RET 1 R2 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: is_root_commissioning_open +********************************************************************/ +be_local_closure(Matter_Device_is_root_commissioning_open, /* name */ + be_nested_proto( + 3, /* nstack */ 1, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -243,50 +298,24 @@ be_local_closure(Matter_Device_compute_manual_pairing_code, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[ 8]) { /* constants */ - /* K0 */ be_nested_str_weak(string), - /* K1 */ be_nested_str_weak(root_discriminator), - /* K2 */ be_nested_str_weak(root_passcode), - /* K3 */ be_nested_str_weak(format), - /* K4 */ be_nested_str_weak(_X251i_X2505i_X2504i), - /* K5 */ be_nested_str_weak(matter), - /* K6 */ be_nested_str_weak(Verhoeff), - /* K7 */ be_nested_str_weak(checksum), + ( &(const bvalue[ 2]) { /* constants */ + /* K0 */ be_nested_str_weak(commissioning_open), + /* K1 */ be_nested_str_weak(commissioning_admin_fabric), }), - be_str_weak(compute_manual_pairing_code), + be_str_weak(is_root_commissioning_open), &be_const_str_solidified, - ( &(const binstruction[31]) { /* code */ - 0xA4060000, // 0000 IMPORT R1 K0 - 0x88080101, // 0001 GETMBR R2 R0 K1 - 0x540E0FFE, // 0002 LDINT R3 4095 - 0x2C080403, // 0003 AND R2 R2 R3 - 0x540E0009, // 0004 LDINT R3 10 - 0x3C080403, // 0005 SHR R2 R2 R3 - 0x880C0101, // 0006 GETMBR R3 R0 K1 - 0x541202FF, // 0007 LDINT R4 768 - 0x2C0C0604, // 0008 AND R3 R3 R4 - 0x54120005, // 0009 LDINT R4 6 - 0x380C0604, // 000A SHL R3 R3 R4 - 0x88100102, // 000B GETMBR R4 R0 K2 - 0x54163FFE, // 000C LDINT R5 16383 - 0x2C100805, // 000D AND R4 R4 R5 - 0x300C0604, // 000E OR R3 R3 R4 - 0x88100102, // 000F GETMBR R4 R0 K2 - 0x5416000D, // 0010 LDINT R5 14 - 0x3C100805, // 0011 SHR R4 R4 R5 - 0x8C140303, // 0012 GETMET R5 R1 K3 - 0x581C0004, // 0013 LDCONST R7 K4 - 0x5C200400, // 0014 MOVE R8 R2 - 0x5C240600, // 0015 MOVE R9 R3 - 0x5C280800, // 0016 MOVE R10 R4 - 0x7C140A00, // 0017 CALL R5 5 - 0xB81A0A00, // 0018 GETNGBL R6 K5 - 0x88180D06, // 0019 GETMBR R6 R6 K6 - 0x8C180D07, // 001A GETMET R6 R6 K7 - 0x5C200A00, // 001B MOVE R8 R5 - 0x7C180400, // 001C CALL R6 2 - 0x00140A06, // 001D ADD R5 R5 R6 - 0x80040A00, // 001E RET 1 R5 + ( &(const binstruction[11]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x4C080000, // 0001 LDNIL R2 + 0x20040202, // 0002 NE R1 R1 R2 + 0x78060003, // 0003 JMPF R1 #0008 + 0x88040101, // 0004 GETMBR R1 R0 K1 + 0x4C080000, // 0005 LDNIL R2 + 0x1C040202, // 0006 EQ R1 R1 R2 + 0x74060000, // 0007 JMPT R1 #0009 + 0x50040001, // 0008 LDBOOL R1 0 1 + 0x50040200, // 0009 LDBOOL R1 1 0 + 0x80040200, // 000A RET 1 R1 }) ) ); @@ -355,6 +384,597 @@ be_local_closure(Matter_Device_register_commands, /* name */ /*******************************************************************/ +/******************************************************************** +** Solidified function: mdns_remove_PASE +********************************************************************/ +be_local_closure(Matter_Device_mdns_remove_PASE, /* name */ + be_nested_proto( + 12, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[22]) { /* constants */ + /* K0 */ be_nested_str_weak(mdns), + /* K1 */ be_nested_str_weak(string), + /* K2 */ be_nested_str_weak(mdns_pase_eth), + /* K3 */ be_nested_str_weak(tasmota), + /* K4 */ be_nested_str_weak(log), + /* K5 */ be_nested_str_weak(format), + /* K6 */ be_nested_str_weak(MTR_X3A_X20calling_X20mdns_X2Eremove_service_X28_X25s_X2C_X20_X25s_X2C_X20_X25s_X2C_X20_X25s_X29), + /* K7 */ be_nested_str_weak(_matterc), + /* K8 */ be_nested_str_weak(_udp), + /* K9 */ be_nested_str_weak(commissioning_instance_eth), + /* K10 */ be_nested_str_weak(hostname_eth), + /* K11 */ be_const_int(3), + /* K12 */ be_nested_str_weak(MTR_X3A_X20remove_X20mDNS_X20on_X20_X25s_X20_X27_X25s_X27), + /* K13 */ be_nested_str_weak(eth), + /* K14 */ be_const_int(2), + /* K15 */ be_nested_str_weak(remove_service), + /* K16 */ be_nested_str_weak(mdns_pase_wifi), + /* K17 */ be_nested_str_weak(commissioning_instance_wifi), + /* K18 */ be_nested_str_weak(hostname_wifi), + /* K19 */ be_nested_str_weak(wifi), + /* K20 */ be_nested_str_weak(MTR_X3A_X20Exception), + /* K21 */ be_nested_str_weak(_X7C), + }), + be_str_weak(mdns_remove_PASE), + &be_const_str_solidified, + ( &(const binstruction[83]) { /* code */ + 0xA4060000, // 0000 IMPORT R1 K0 + 0xA40A0200, // 0001 IMPORT R2 K1 + 0xA802003D, // 0002 EXBLK 0 #0041 + 0x880C0102, // 0003 GETMBR R3 R0 K2 + 0x780E001B, // 0004 JMPF R3 #0021 + 0xB80E0600, // 0005 GETNGBL R3 K3 + 0x8C0C0704, // 0006 GETMET R3 R3 K4 + 0x8C140505, // 0007 GETMET R5 R2 K5 + 0x581C0006, // 0008 LDCONST R7 K6 + 0x58200007, // 0009 LDCONST R8 K7 + 0x58240008, // 000A LDCONST R9 K8 + 0x88280109, // 000B GETMBR R10 R0 K9 + 0x882C010A, // 000C GETMBR R11 R0 K10 + 0x7C140C00, // 000D CALL R5 6 + 0x5818000B, // 000E LDCONST R6 K11 + 0x7C0C0600, // 000F CALL R3 3 + 0xB80E0600, // 0010 GETNGBL R3 K3 + 0x8C0C0704, // 0011 GETMET R3 R3 K4 + 0x8C140505, // 0012 GETMET R5 R2 K5 + 0x581C000C, // 0013 LDCONST R7 K12 + 0x5820000D, // 0014 LDCONST R8 K13 + 0x88240109, // 0015 GETMBR R9 R0 K9 + 0x7C140800, // 0016 CALL R5 4 + 0x5818000E, // 0017 LDCONST R6 K14 + 0x7C0C0600, // 0018 CALL R3 3 + 0x500C0000, // 0019 LDBOOL R3 0 0 + 0x90020403, // 001A SETMBR R0 K2 R3 + 0x8C0C030F, // 001B GETMET R3 R1 K15 + 0x58140007, // 001C LDCONST R5 K7 + 0x58180008, // 001D LDCONST R6 K8 + 0x881C0109, // 001E GETMBR R7 R0 K9 + 0x8820010A, // 001F GETMBR R8 R0 K10 + 0x7C0C0A00, // 0020 CALL R3 5 + 0x880C0110, // 0021 GETMBR R3 R0 K16 + 0x780E001B, // 0022 JMPF R3 #003F + 0xB80E0600, // 0023 GETNGBL R3 K3 + 0x8C0C0704, // 0024 GETMET R3 R3 K4 + 0x8C140505, // 0025 GETMET R5 R2 K5 + 0x581C0006, // 0026 LDCONST R7 K6 + 0x58200007, // 0027 LDCONST R8 K7 + 0x58240008, // 0028 LDCONST R9 K8 + 0x88280111, // 0029 GETMBR R10 R0 K17 + 0x882C0112, // 002A GETMBR R11 R0 K18 + 0x7C140C00, // 002B CALL R5 6 + 0x5818000B, // 002C LDCONST R6 K11 + 0x7C0C0600, // 002D CALL R3 3 + 0xB80E0600, // 002E GETNGBL R3 K3 + 0x8C0C0704, // 002F GETMET R3 R3 K4 + 0x8C140505, // 0030 GETMET R5 R2 K5 + 0x581C000C, // 0031 LDCONST R7 K12 + 0x58200013, // 0032 LDCONST R8 K19 + 0x88240111, // 0033 GETMBR R9 R0 K17 + 0x7C140800, // 0034 CALL R5 4 + 0x5818000E, // 0035 LDCONST R6 K14 + 0x7C0C0600, // 0036 CALL R3 3 + 0x500C0000, // 0037 LDBOOL R3 0 0 + 0x90022003, // 0038 SETMBR R0 K16 R3 + 0x8C0C030F, // 0039 GETMET R3 R1 K15 + 0x58140007, // 003A LDCONST R5 K7 + 0x58180008, // 003B LDCONST R6 K8 + 0x881C0111, // 003C GETMBR R7 R0 K17 + 0x88200112, // 003D GETMBR R8 R0 K18 + 0x7C0C0A00, // 003E CALL R3 5 + 0xA8040001, // 003F EXBLK 1 1 + 0x70020010, // 0040 JMP #0052 + 0xAC0C0002, // 0041 CATCH R3 0 2 + 0x7002000D, // 0042 JMP #0051 + 0xB8160600, // 0043 GETNGBL R5 K3 + 0x8C140B04, // 0044 GETMET R5 R5 K4 + 0x601C0008, // 0045 GETGBL R7 G8 + 0x5C200600, // 0046 MOVE R8 R3 + 0x7C1C0200, // 0047 CALL R7 1 + 0x001E2807, // 0048 ADD R7 K20 R7 + 0x001C0F15, // 0049 ADD R7 R7 K21 + 0x60200008, // 004A GETGBL R8 G8 + 0x5C240800, // 004B MOVE R9 R4 + 0x7C200200, // 004C CALL R8 1 + 0x001C0E08, // 004D ADD R7 R7 R8 + 0x5820000E, // 004E LDCONST R8 K14 + 0x7C140600, // 004F CALL R5 3 + 0x70020000, // 0050 JMP #0052 + 0xB0080000, // 0051 RAISE 2 R0 R0 + 0x80000000, // 0052 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: every_250ms +********************************************************************/ +be_local_closure(Matter_Device_every_250ms, /* name */ + be_nested_proto( + 4, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 5]) { /* constants */ + /* K0 */ be_nested_str_weak(message_handler), + /* K1 */ be_nested_str_weak(every_250ms), + /* K2 */ be_const_int(0), + /* K3 */ be_nested_str_weak(plugins), + /* K4 */ be_const_int(1), + }), + be_str_weak(every_250ms), + &be_const_str_solidified, + ( &(const binstruction[16]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x8C040301, // 0001 GETMET R1 R1 K1 + 0x7C040200, // 0002 CALL R1 1 + 0x58040002, // 0003 LDCONST R1 K2 + 0x6008000C, // 0004 GETGBL R2 G12 + 0x880C0103, // 0005 GETMBR R3 R0 K3 + 0x7C080200, // 0006 CALL R2 1 + 0x14080202, // 0007 LT R2 R1 R2 + 0x780A0005, // 0008 JMPF R2 #000F + 0x88080103, // 0009 GETMBR R2 R0 K3 + 0x94080401, // 000A GETIDX R2 R2 R1 + 0x8C080501, // 000B GETMET R2 R2 K1 + 0x7C080200, // 000C CALL R2 1 + 0x00040304, // 000D ADD R1 R1 K4 + 0x7001FFF4, // 000E JMP #0004 + 0x80000000, // 000F RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: adjust_next_ep +********************************************************************/ +be_local_closure(Matter_Device_adjust_next_ep, /* name */ + be_nested_proto( + 5, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 5]) { /* constants */ + /* K0 */ be_nested_str_weak(plugins_config), + /* K1 */ be_nested_str_weak(keys), + /* K2 */ be_nested_str_weak(next_ep), + /* K3 */ be_const_int(1), + /* K4 */ be_nested_str_weak(stop_iteration), + }), + be_str_weak(adjust_next_ep), + &be_const_str_solidified, + ( &(const binstruction[21]) { /* code */ + 0x60040010, // 0000 GETGBL R1 G16 + 0x88080100, // 0001 GETMBR R2 R0 K0 + 0x8C080501, // 0002 GETMET R2 R2 K1 + 0x7C080200, // 0003 CALL R2 1 + 0x7C040200, // 0004 CALL R1 1 + 0xA802000A, // 0005 EXBLK 0 #0011 + 0x5C080200, // 0006 MOVE R2 R1 + 0x7C080000, // 0007 CALL R2 0 + 0x600C0009, // 0008 GETGBL R3 G9 + 0x5C100400, // 0009 MOVE R4 R2 + 0x7C0C0200, // 000A CALL R3 1 + 0x88100102, // 000B GETMBR R4 R0 K2 + 0x28100604, // 000C GE R4 R3 R4 + 0x78120001, // 000D JMPF R4 #0010 + 0x00100703, // 000E ADD R4 R3 K3 + 0x90020404, // 000F SETMBR R0 K2 R4 + 0x7001FFF4, // 0010 JMP #0006 + 0x58040004, // 0011 LDCONST R1 K4 + 0xAC040200, // 0012 CATCH R1 1 0 + 0xB0080000, // 0013 RAISE 2 R0 R0 + 0x80000000, // 0014 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: save_before_restart +********************************************************************/ +be_local_closure(Matter_Device_save_before_restart, /* name */ + be_nested_proto( + 3, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 2]) { /* constants */ + /* K0 */ be_nested_str_weak(stop_basic_commissioning), + /* K1 */ be_nested_str_weak(mdns_remove_op_discovery_all_fabrics), + }), + be_str_weak(save_before_restart), + &be_const_str_solidified, + ( &(const binstruction[ 5]) { /* code */ + 0x8C040100, // 0000 GETMET R1 R0 K0 + 0x7C040200, // 0001 CALL R1 1 + 0x8C040101, // 0002 GETMET R1 R0 K1 + 0x7C040200, // 0003 CALL R1 1 + 0x80000000, // 0004 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: invoke_request +********************************************************************/ +be_local_closure(Matter_Device_invoke_request, /* name */ + be_nested_proto( + 12, /* nstack */ + 4, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 8]) { /* constants */ + /* K0 */ be_const_int(0), + /* K1 */ be_nested_str_weak(endpoint), + /* K2 */ be_nested_str_weak(plugins), + /* K3 */ be_nested_str_weak(invoke_request), + /* K4 */ be_const_int(1), + /* K5 */ be_nested_str_weak(status), + /* K6 */ be_nested_str_weak(matter), + /* K7 */ be_nested_str_weak(UNSUPPORTED_ENDPOINT), + }), + be_str_weak(invoke_request), + &be_const_str_solidified, + ( &(const binstruction[24]) { /* code */ + 0x58100000, // 0000 LDCONST R4 K0 + 0x88140701, // 0001 GETMBR R5 R3 K1 + 0x6018000C, // 0002 GETGBL R6 G12 + 0x881C0102, // 0003 GETMBR R7 R0 K2 + 0x7C180200, // 0004 CALL R6 1 + 0x14180806, // 0005 LT R6 R4 R6 + 0x781A000C, // 0006 JMPF R6 #0014 + 0x88180102, // 0007 GETMBR R6 R0 K2 + 0x94180C04, // 0008 GETIDX R6 R6 R4 + 0x881C0D01, // 0009 GETMBR R7 R6 K1 + 0x1C1C0E05, // 000A EQ R7 R7 R5 + 0x781E0005, // 000B JMPF R7 #0012 + 0x8C1C0D03, // 000C GETMET R7 R6 K3 + 0x5C240200, // 000D MOVE R9 R1 + 0x5C280400, // 000E MOVE R10 R2 + 0x5C2C0600, // 000F MOVE R11 R3 + 0x7C1C0800, // 0010 CALL R7 4 + 0x80040E00, // 0011 RET 1 R7 + 0x00100904, // 0012 ADD R4 R4 K4 + 0x7001FFED, // 0013 JMP #0002 + 0xB81A0C00, // 0014 GETNGBL R6 K6 + 0x88180D07, // 0015 GETMBR R6 R6 K7 + 0x900E0A06, // 0016 SETMBR R3 K5 R6 + 0x80000000, // 0017 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: _instantiate_plugins_from_config +********************************************************************/ +be_local_closure(Matter_Device__instantiate_plugins_from_config, /* name */ + be_nested_proto( + 19, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[34]) { /* constants */ + /* K0 */ be_nested_str_weak(string), + /* K1 */ be_nested_str_weak(k2l_num), + /* K2 */ be_nested_str_weak(tasmota), + /* K3 */ be_nested_str_weak(log), + /* K4 */ be_nested_str_weak(MTR_X3A_X20endpoints_X20to_X20be_X20configured_X20), + /* K5 */ be_const_int(3), + /* K6 */ be_nested_str_weak(plugins), + /* K7 */ be_nested_str_weak(push), + /* K8 */ be_nested_str_weak(matter), + /* K9 */ be_nested_str_weak(Plugin_Root), + /* K10 */ be_const_int(0), + /* K11 */ be_nested_str_weak(format), + /* K12 */ be_nested_str_weak(MTR_X3A_X20endpoint_X3A_X25i_X20type_X3A_X25s_X25s), + /* K13 */ be_nested_str_weak(root), + /* K14 */ be_nested_str_weak(), + /* K15 */ be_const_int(2), + /* K16 */ be_nested_str_weak(Plugin_Aggregator), + /* K17 */ be_nested_str_weak(aggregator), + /* K18 */ be_nested_str_weak(MTR_X3A_X20endpoint_X20_X25i_X20config_X20_X25s), + /* K19 */ be_nested_str_weak(find), + /* K20 */ be_nested_str_weak(type), + /* K21 */ be_nested_str_weak(MTR_X3A_X20no_X20class_X20name_X2C_X20skipping), + /* K22 */ be_nested_str_weak(MTR_X3A_X20only_X20one_X20root_X20node_X20allowed), + /* K23 */ be_nested_str_weak(plugins_classes), + /* K24 */ be_nested_str_weak(MTR_X3A_X20unknown_X20class_X20name_X20_X27), + /* K25 */ be_nested_str_weak(_X27_X20skipping), + /* K26 */ be_nested_str_weak(k2l), + /* K27 */ be_nested_str_weak(_X20_X25s_X3A_X25s), + /* K28 */ be_nested_str_weak(stop_iteration), + /* K29 */ be_nested_str_weak(MTR_X3A_X20Exception), + /* K30 */ be_nested_str_weak(_X7C), + /* K31 */ be_nested_str_weak(publish_result), + /* K32 */ be_nested_str_weak(_X7B_X22Matter_X22_X3A_X7B_X22Initialized_X22_X3A1_X7D_X7D), + /* K33 */ be_nested_str_weak(Matter), + }), + be_str_weak(_instantiate_plugins_from_config), + &be_const_str_solidified, + ( &(const binstruction[185]) { /* code */ + 0xA40A0000, // 0000 IMPORT R2 K0 + 0x8C0C0101, // 0001 GETMET R3 R0 K1 + 0x5C140200, // 0002 MOVE R5 R1 + 0x7C0C0400, // 0003 CALL R3 2 + 0xB8120400, // 0004 GETNGBL R4 K2 + 0x8C100903, // 0005 GETMET R4 R4 K3 + 0x60180008, // 0006 GETGBL R6 G8 + 0x5C1C0600, // 0007 MOVE R7 R3 + 0x7C180200, // 0008 CALL R6 1 + 0x001A0806, // 0009 ADD R6 K4 R6 + 0x581C0005, // 000A LDCONST R7 K5 + 0x7C100600, // 000B CALL R4 3 + 0x88100106, // 000C GETMBR R4 R0 K6 + 0x8C100907, // 000D GETMET R4 R4 K7 + 0xB81A1000, // 000E GETNGBL R6 K8 + 0x8C180D09, // 000F GETMET R6 R6 K9 + 0x5C200000, // 0010 MOVE R8 R0 + 0x5824000A, // 0011 LDCONST R9 K10 + 0x60280013, // 0012 GETGBL R10 G19 + 0x7C280000, // 0013 CALL R10 0 + 0x7C180800, // 0014 CALL R6 4 + 0x7C100400, // 0015 CALL R4 2 + 0xB8120400, // 0016 GETNGBL R4 K2 + 0x8C100903, // 0017 GETMET R4 R4 K3 + 0x8C18050B, // 0018 GETMET R6 R2 K11 + 0x5820000C, // 0019 LDCONST R8 K12 + 0x5824000A, // 001A LDCONST R9 K10 + 0x5828000D, // 001B LDCONST R10 K13 + 0x582C000E, // 001C LDCONST R11 K14 + 0x7C180A00, // 001D CALL R6 5 + 0x581C000F, // 001E LDCONST R7 K15 + 0x7C100600, // 001F CALL R4 3 + 0x88100106, // 0020 GETMBR R4 R0 K6 + 0x8C100907, // 0021 GETMET R4 R4 K7 + 0xB81A1000, // 0022 GETNGBL R6 K8 + 0x8C180D10, // 0023 GETMET R6 R6 K16 + 0x5C200000, // 0024 MOVE R8 R0 + 0x5426FEFF, // 0025 LDINT R9 65280 + 0x60280013, // 0026 GETGBL R10 G19 + 0x7C280000, // 0027 CALL R10 0 + 0x7C180800, // 0028 CALL R6 4 + 0x7C100400, // 0029 CALL R4 2 + 0xB8120400, // 002A GETNGBL R4 K2 + 0x8C100903, // 002B GETMET R4 R4 K3 + 0x8C18050B, // 002C GETMET R6 R2 K11 + 0x5820000C, // 002D LDCONST R8 K12 + 0x5426FEFF, // 002E LDINT R9 65280 + 0x58280011, // 002F LDCONST R10 K17 + 0x582C000E, // 0030 LDCONST R11 K14 + 0x7C180A00, // 0031 CALL R6 5 + 0x581C000F, // 0032 LDCONST R7 K15 + 0x7C100600, // 0033 CALL R4 3 + 0x60100010, // 0034 GETGBL R4 G16 + 0x5C140600, // 0035 MOVE R5 R3 + 0x7C100200, // 0036 CALL R4 1 + 0xA8020077, // 0037 EXBLK 0 #00B0 + 0x5C140800, // 0038 MOVE R5 R4 + 0x7C140000, // 0039 CALL R5 0 + 0x1C180B0A, // 003A EQ R6 R5 K10 + 0x781A0000, // 003B JMPF R6 #003D + 0x7001FFFA, // 003C JMP #0038 + 0xA802005F, // 003D EXBLK 0 #009E + 0x60180008, // 003E GETGBL R6 G8 + 0x5C1C0A00, // 003F MOVE R7 R5 + 0x7C180200, // 0040 CALL R6 1 + 0x94180206, // 0041 GETIDX R6 R1 R6 + 0xB81E0400, // 0042 GETNGBL R7 K2 + 0x8C1C0F03, // 0043 GETMET R7 R7 K3 + 0x8C24050B, // 0044 GETMET R9 R2 K11 + 0x582C0012, // 0045 LDCONST R11 K18 + 0x5C300A00, // 0046 MOVE R12 R5 + 0x5C340C00, // 0047 MOVE R13 R6 + 0x7C240800, // 0048 CALL R9 4 + 0x58280005, // 0049 LDCONST R10 K5 + 0x7C1C0600, // 004A CALL R7 3 + 0x8C1C0D13, // 004B GETMET R7 R6 K19 + 0x58240014, // 004C LDCONST R9 K20 + 0x7C1C0400, // 004D CALL R7 2 + 0x4C200000, // 004E LDNIL R8 + 0x1C200E08, // 004F EQ R8 R7 R8 + 0x78220006, // 0050 JMPF R8 #0058 + 0xB8220400, // 0051 GETNGBL R8 K2 + 0x8C201103, // 0052 GETMET R8 R8 K3 + 0x58280015, // 0053 LDCONST R10 K21 + 0x582C0005, // 0054 LDCONST R11 K5 + 0x7C200600, // 0055 CALL R8 3 + 0xA8040001, // 0056 EXBLK 1 1 + 0x7001FFDF, // 0057 JMP #0038 + 0x1C200F0D, // 0058 EQ R8 R7 K13 + 0x78220006, // 0059 JMPF R8 #0061 + 0xB8220400, // 005A GETNGBL R8 K2 + 0x8C201103, // 005B GETMET R8 R8 K3 + 0x58280016, // 005C LDCONST R10 K22 + 0x582C0005, // 005D LDCONST R11 K5 + 0x7C200600, // 005E CALL R8 3 + 0xA8040001, // 005F EXBLK 1 1 + 0x7001FFD6, // 0060 JMP #0038 + 0x88200117, // 0061 GETMBR R8 R0 K23 + 0x8C201113, // 0062 GETMET R8 R8 K19 + 0x5C280E00, // 0063 MOVE R10 R7 + 0x7C200400, // 0064 CALL R8 2 + 0x4C240000, // 0065 LDNIL R9 + 0x1C241009, // 0066 EQ R9 R8 R9 + 0x7826000A, // 0067 JMPF R9 #0073 + 0xB8260400, // 0068 GETNGBL R9 K2 + 0x8C241303, // 0069 GETMET R9 R9 K3 + 0x602C0008, // 006A GETGBL R11 G8 + 0x5C300E00, // 006B MOVE R12 R7 + 0x7C2C0200, // 006C CALL R11 1 + 0x002E300B, // 006D ADD R11 K24 R11 + 0x002C1719, // 006E ADD R11 R11 K25 + 0x5830000F, // 006F LDCONST R12 K15 + 0x7C240600, // 0070 CALL R9 3 + 0xA8040001, // 0071 EXBLK 1 1 + 0x7001FFC4, // 0072 JMP #0038 + 0x5C241000, // 0073 MOVE R9 R8 + 0x5C280000, // 0074 MOVE R10 R0 + 0x5C2C0A00, // 0075 MOVE R11 R5 + 0x5C300C00, // 0076 MOVE R12 R6 + 0x7C240600, // 0077 CALL R9 3 + 0x88280106, // 0078 GETMBR R10 R0 K6 + 0x8C281507, // 0079 GETMET R10 R10 K7 + 0x5C301200, // 007A MOVE R12 R9 + 0x7C280400, // 007B CALL R10 2 + 0x5828000E, // 007C LDCONST R10 K14 + 0x602C0010, // 007D GETGBL R11 G16 + 0x8C30011A, // 007E GETMET R12 R0 K26 + 0x5C380C00, // 007F MOVE R14 R6 + 0x7C300400, // 0080 CALL R12 2 + 0x7C2C0200, // 0081 CALL R11 1 + 0xA802000B, // 0082 EXBLK 0 #008F + 0x5C301600, // 0083 MOVE R12 R11 + 0x7C300000, // 0084 CALL R12 0 + 0x1C341914, // 0085 EQ R13 R12 K20 + 0x78360000, // 0086 JMPF R13 #0088 + 0x7001FFFA, // 0087 JMP #0083 + 0x8C34050B, // 0088 GETMET R13 R2 K11 + 0x583C001B, // 0089 LDCONST R15 K27 + 0x5C401800, // 008A MOVE R16 R12 + 0x94440C0C, // 008B GETIDX R17 R6 R12 + 0x7C340800, // 008C CALL R13 4 + 0x0028140D, // 008D ADD R10 R10 R13 + 0x7001FFF3, // 008E JMP #0083 + 0x582C001C, // 008F LDCONST R11 K28 + 0xAC2C0200, // 0090 CATCH R11 1 0 + 0xB0080000, // 0091 RAISE 2 R0 R0 + 0xB82E0400, // 0092 GETNGBL R11 K2 + 0x8C2C1703, // 0093 GETMET R11 R11 K3 + 0x8C34050B, // 0094 GETMET R13 R2 K11 + 0x583C000C, // 0095 LDCONST R15 K12 + 0x5C400A00, // 0096 MOVE R16 R5 + 0x5C440E00, // 0097 MOVE R17 R7 + 0x5C481400, // 0098 MOVE R18 R10 + 0x7C340A00, // 0099 CALL R13 5 + 0x5838000F, // 009A LDCONST R14 K15 + 0x7C2C0600, // 009B CALL R11 3 + 0xA8040001, // 009C EXBLK 1 1 + 0x70020010, // 009D JMP #00AF + 0xAC180002, // 009E CATCH R6 0 2 + 0x7002000D, // 009F JMP #00AE + 0xB8220400, // 00A0 GETNGBL R8 K2 + 0x8C201103, // 00A1 GETMET R8 R8 K3 + 0x60280008, // 00A2 GETGBL R10 G8 + 0x5C2C0C00, // 00A3 MOVE R11 R6 + 0x7C280200, // 00A4 CALL R10 1 + 0x002A3A0A, // 00A5 ADD R10 K29 R10 + 0x0028151E, // 00A6 ADD R10 R10 K30 + 0x602C0008, // 00A7 GETGBL R11 G8 + 0x5C300E00, // 00A8 MOVE R12 R7 + 0x7C2C0200, // 00A9 CALL R11 1 + 0x0028140B, // 00AA ADD R10 R10 R11 + 0x582C000F, // 00AB LDCONST R11 K15 + 0x7C200600, // 00AC CALL R8 3 + 0x70020000, // 00AD JMP #00AF + 0xB0080000, // 00AE RAISE 2 R0 R0 + 0x7001FF87, // 00AF JMP #0038 + 0x5810001C, // 00B0 LDCONST R4 K28 + 0xAC100200, // 00B1 CATCH R4 1 0 + 0xB0080000, // 00B2 RAISE 2 R0 R0 + 0xB8120400, // 00B3 GETNGBL R4 K2 + 0x8C10091F, // 00B4 GETMET R4 R4 K31 + 0x58180020, // 00B5 LDCONST R6 K32 + 0x581C0021, // 00B6 LDCONST R7 K33 + 0x7C100600, // 00B7 CALL R4 3 + 0x80000000, // 00B8 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: start_commissioning_complete +********************************************************************/ +be_local_closure(Matter_Device_start_commissioning_complete, /* name */ + be_nested_proto( + 6, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 5]) { /* constants */ + /* K0 */ be_nested_str_weak(tasmota), + /* K1 */ be_nested_str_weak(log), + /* K2 */ be_nested_str_weak(MTR_X3A_X20_X2A_X2A_X2A_X20Commissioning_X20complete_X20_X2A_X2A_X2A), + /* K3 */ be_const_int(2), + /* K4 */ be_nested_str_weak(stop_basic_commissioning), + }), + be_str_weak(start_commissioning_complete), + &be_const_str_solidified, + ( &(const binstruction[ 8]) { /* code */ + 0xB80A0000, // 0000 GETNGBL R2 K0 + 0x8C080501, // 0001 GETMET R2 R2 K1 + 0x58100002, // 0002 LDCONST R4 K2 + 0x58140003, // 0003 LDCONST R5 K3 + 0x7C080600, // 0004 CALL R2 3 + 0x8C080104, // 0005 GETMET R2 R0 K4 + 0x7C080200, // 0006 CALL R2 1 + 0x80000000, // 0007 RET 0 + }) + ) +); +/*******************************************************************/ + + /******************************************************************** ** Solidified function: k2l ********************************************************************/ @@ -436,11 +1056,71 @@ be_local_closure(Matter_Device_k2l, /* name */ /******************************************************************** -** Solidified function: is_commissioning_open +** Solidified function: start_operational_discovery_deferred ********************************************************************/ -be_local_closure(Matter_Device_is_commissioning_open, /* name */ +be_local_closure(Matter_Device_start_operational_discovery_deferred, /* name */ be_nested_proto( - 3, /* nstack */ + 6, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 1, /* has sup protos */ + ( &(const struct bproto*[ 1]) { + be_nested_proto( + 3, /* nstack */ + 0, /* argc */ + 0, /* varg */ + 1, /* has upvals */ + ( &(const bupvaldesc[ 2]) { /* upvals */ + be_local_const_upval(1, 0), + be_local_const_upval(1, 1), + }), + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 1]) { /* constants */ + /* K0 */ be_nested_str_weak(start_operational_discovery), + }), + be_str_weak(_X3Clambda_X3E), + &be_const_str_solidified, + ( &(const binstruction[ 5]) { /* code */ + 0x68000000, // 0000 GETUPV R0 U0 + 0x8C000100, // 0001 GETMET R0 R0 K0 + 0x68080001, // 0002 GETUPV R2 U1 + 0x7C000400, // 0003 CALL R0 2 + 0x80040000, // 0004 RET 1 R0 + }) + ), + }), + 1, /* has constants */ + ( &(const bvalue[ 3]) { /* constants */ + /* K0 */ be_nested_str_weak(tasmota), + /* K1 */ be_nested_str_weak(set_timer), + /* K2 */ be_const_int(0), + }), + be_str_weak(start_operational_discovery_deferred), + &be_const_str_solidified, + ( &(const binstruction[ 7]) { /* code */ + 0xB80A0000, // 0000 GETNGBL R2 K0 + 0x8C080501, // 0001 GETMET R2 R2 K1 + 0x58100002, // 0002 LDCONST R4 K2 + 0x84140000, // 0003 CLOSURE R5 P0 + 0x7C080600, // 0004 CALL R2 3 + 0xA0000000, // 0005 CLOSE R0 + 0x80000000, // 0006 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: compute_qrcode_content +********************************************************************/ +be_local_closure(Matter_Device_compute_qrcode_content, /* name */ + be_nested_proto( + 8, /* nstack */ 1, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -448,16 +1128,207 @@ be_local_closure(Matter_Device_is_commissioning_open, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[ 1]) { /* constants */ - /* K0 */ be_nested_str_weak(commissioning_open), + ( &(const bvalue[12]) { /* constants */ + /* K0 */ be_nested_str_weak(resize), + /* K1 */ be_nested_str_weak(setbits), + /* K2 */ be_const_int(3), + /* K3 */ be_nested_str_weak(vendorid), + /* K4 */ be_nested_str_weak(productid), + /* K5 */ be_nested_str_weak(root_discriminator), + /* K6 */ be_nested_str_weak(root_passcode), + /* K7 */ be_const_int(134217727), + /* K8 */ be_nested_str_weak(MT_X3A), + /* K9 */ be_nested_str_weak(matter), + /* K10 */ be_nested_str_weak(Base38), + /* K11 */ be_nested_str_weak(encode), }), - be_str_weak(is_commissioning_open), + be_str_weak(compute_qrcode_content), &be_const_str_solidified, - ( &(const binstruction[ 4]) { /* code */ - 0x88040100, // 0000 GETMBR R1 R0 K0 - 0x4C080000, // 0001 LDNIL R2 - 0x20040202, // 0002 NE R1 R1 R2 - 0x80040200, // 0003 RET 1 R1 + ( &(const binstruction[40]) { /* code */ + 0x60040015, // 0000 GETGBL R1 G21 + 0x7C040000, // 0001 CALL R1 0 + 0x8C040300, // 0002 GETMET R1 R1 K0 + 0x540E000A, // 0003 LDINT R3 11 + 0x7C040400, // 0004 CALL R1 2 + 0x8C080301, // 0005 GETMET R2 R1 K1 + 0x58100002, // 0006 LDCONST R4 K2 + 0x5416000F, // 0007 LDINT R5 16 + 0x88180103, // 0008 GETMBR R6 R0 K3 + 0x7C080800, // 0009 CALL R2 4 + 0x8C080301, // 000A GETMET R2 R1 K1 + 0x54120012, // 000B LDINT R4 19 + 0x5416000F, // 000C LDINT R5 16 + 0x88180104, // 000D GETMBR R6 R0 K4 + 0x7C080800, // 000E CALL R2 4 + 0x8C080301, // 000F GETMET R2 R1 K1 + 0x54120024, // 0010 LDINT R4 37 + 0x54160007, // 0011 LDINT R5 8 + 0x541A0003, // 0012 LDINT R6 4 + 0x7C080800, // 0013 CALL R2 4 + 0x8C080301, // 0014 GETMET R2 R1 K1 + 0x5412002C, // 0015 LDINT R4 45 + 0x5416000B, // 0016 LDINT R5 12 + 0x88180105, // 0017 GETMBR R6 R0 K5 + 0x541E0FFE, // 0018 LDINT R7 4095 + 0x2C180C07, // 0019 AND R6 R6 R7 + 0x7C080800, // 001A CALL R2 4 + 0x8C080301, // 001B GETMET R2 R1 K1 + 0x54120038, // 001C LDINT R4 57 + 0x5416001A, // 001D LDINT R5 27 + 0x88180106, // 001E GETMBR R6 R0 K6 + 0x2C180D07, // 001F AND R6 R6 K7 + 0x7C080800, // 0020 CALL R2 4 + 0xB80A1200, // 0021 GETNGBL R2 K9 + 0x8808050A, // 0022 GETMBR R2 R2 K10 + 0x8C08050B, // 0023 GETMET R2 R2 K11 + 0x5C100200, // 0024 MOVE R4 R1 + 0x7C080400, // 0025 CALL R2 2 + 0x000A1002, // 0026 ADD R2 K8 R2 + 0x80040400, // 0027 RET 1 R2 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: sort_distinct +********************************************************************/ +be_local_closure(Matter_Device_sort_distinct, /* name */ + be_nested_proto( + 7, /* nstack */ + 1, /* argc */ + 4, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 5]) { /* constants */ + /* K0 */ be_const_class(be_class_Matter_Device), + /* K1 */ be_const_int(1), + /* K2 */ be_const_int(0), + /* K3 */ be_nested_str_weak(stop_iteration), + /* K4 */ be_nested_str_weak(remove), + }), + be_str_weak(sort_distinct), + &be_const_str_solidified, + ( &(const binstruction[53]) { /* code */ + 0x58040000, // 0000 LDCONST R1 K0 + 0x60080010, // 0001 GETGBL R2 G16 + 0x600C000C, // 0002 GETGBL R3 G12 + 0x5C100000, // 0003 MOVE R4 R0 + 0x7C0C0200, // 0004 CALL R3 1 + 0x040C0701, // 0005 SUB R3 R3 K1 + 0x400E0203, // 0006 CONNECT R3 K1 R3 + 0x7C080200, // 0007 CALL R2 1 + 0xA8020010, // 0008 EXBLK 0 #001A + 0x5C0C0400, // 0009 MOVE R3 R2 + 0x7C0C0000, // 000A CALL R3 0 + 0x94100003, // 000B GETIDX R4 R0 R3 + 0x5C140600, // 000C MOVE R5 R3 + 0x24180B02, // 000D GT R6 R5 K2 + 0x781A0008, // 000E JMPF R6 #0018 + 0x04180B01, // 000F SUB R6 R5 K1 + 0x94180006, // 0010 GETIDX R6 R0 R6 + 0x24180C04, // 0011 GT R6 R6 R4 + 0x781A0004, // 0012 JMPF R6 #0018 + 0x04180B01, // 0013 SUB R6 R5 K1 + 0x94180006, // 0014 GETIDX R6 R0 R6 + 0x98000A06, // 0015 SETIDX R0 R5 R6 + 0x04140B01, // 0016 SUB R5 R5 K1 + 0x7001FFF4, // 0017 JMP #000D + 0x98000A04, // 0018 SETIDX R0 R5 R4 + 0x7001FFEE, // 0019 JMP #0009 + 0x58080003, // 001A LDCONST R2 K3 + 0xAC080200, // 001B CATCH R2 1 0 + 0xB0080000, // 001C RAISE 2 R0 R0 + 0x58080001, // 001D LDCONST R2 K1 + 0x600C000C, // 001E GETGBL R3 G12 + 0x5C100000, // 001F MOVE R4 R0 + 0x7C0C0200, // 0020 CALL R3 1 + 0x180C0701, // 0021 LE R3 R3 K1 + 0x780E0000, // 0022 JMPF R3 #0024 + 0x80040000, // 0023 RET 1 R0 + 0x940C0102, // 0024 GETIDX R3 R0 K2 + 0x6010000C, // 0025 GETGBL R4 G12 + 0x5C140000, // 0026 MOVE R5 R0 + 0x7C100200, // 0027 CALL R4 1 + 0x14100404, // 0028 LT R4 R2 R4 + 0x78120009, // 0029 JMPF R4 #0034 + 0x94100002, // 002A GETIDX R4 R0 R2 + 0x1C100803, // 002B EQ R4 R4 R3 + 0x78120003, // 002C JMPF R4 #0031 + 0x8C100104, // 002D GETMET R4 R0 K4 + 0x5C180400, // 002E MOVE R6 R2 + 0x7C100400, // 002F CALL R4 2 + 0x70020001, // 0030 JMP #0033 + 0x940C0002, // 0031 GETIDX R3 R0 R2 + 0x00080501, // 0032 ADD R2 R2 K1 + 0x7001FFF0, // 0033 JMP #0025 + 0x80040000, // 0034 RET 1 R0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: register_http_remote +********************************************************************/ +be_local_closure(Matter_Device_register_http_remote, /* name */ + be_nested_proto( + 8, /* nstack */ + 3, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 6]) { /* constants */ + /* K0 */ be_nested_str_weak(http_remotes), + /* K1 */ be_nested_str_weak(contains), + /* K2 */ be_nested_str_weak(get_timeout), + /* K3 */ be_nested_str_weak(set_timeout), + /* K4 */ be_nested_str_weak(matter), + /* K5 */ be_nested_str_weak(HTTP_remote), + }), + be_str_weak(register_http_remote), + &be_const_str_solidified, + ( &(const binstruction[32]) { /* code */ + 0x880C0100, // 0000 GETMBR R3 R0 K0 + 0x4C100000, // 0001 LDNIL R4 + 0x1C0C0604, // 0002 EQ R3 R3 R4 + 0x780E0002, // 0003 JMPF R3 #0007 + 0x600C0013, // 0004 GETGBL R3 G19 + 0x7C0C0000, // 0005 CALL R3 0 + 0x90020003, // 0006 SETMBR R0 K0 R3 + 0x4C0C0000, // 0007 LDNIL R3 + 0x88100100, // 0008 GETMBR R4 R0 K0 + 0x8C100901, // 0009 GETMET R4 R4 K1 + 0x5C180200, // 000A MOVE R6 R1 + 0x7C100400, // 000B CALL R4 2 + 0x78120009, // 000C JMPF R4 #0017 + 0x88100100, // 000D GETMBR R4 R0 K0 + 0x940C0801, // 000E GETIDX R3 R4 R1 + 0x8C140702, // 000F GETMET R5 R3 K2 + 0x7C140200, // 0010 CALL R5 1 + 0x14140405, // 0011 LT R5 R2 R5 + 0x78160002, // 0012 JMPF R5 #0016 + 0x8C140703, // 0013 GETMET R5 R3 K3 + 0x5C1C0400, // 0014 MOVE R7 R2 + 0x7C140400, // 0015 CALL R5 2 + 0x70020007, // 0016 JMP #001F + 0xB8120800, // 0017 GETNGBL R4 K4 + 0x8C100905, // 0018 GETMET R4 R4 K5 + 0x5C180200, // 0019 MOVE R6 R1 + 0x5C1C0400, // 001A MOVE R7 R2 + 0x7C100600, // 001B CALL R4 3 + 0x5C0C0800, // 001C MOVE R3 R4 + 0x88100100, // 001D GETMBR R4 R0 K0 + 0x98100203, // 001E SETIDX R4 R1 R3 + 0x80040600, // 001F RET 1 R3 }) ) ); @@ -502,154 +1373,11 @@ be_local_closure(Matter_Device_register_plugin_class, /* name */ /******************************************************************** -** Solidified function: start_basic_commissioning +** Solidified function: clean_remotes ********************************************************************/ -be_local_closure(Matter_Device_start_basic_commissioning, /* name */ +be_local_closure(Matter_Device_clean_remotes, /* name */ be_nested_proto( - 13, /* nstack */ - 8, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 1, /* has sup protos */ - ( &(const struct bproto*[ 2]) { - be_nested_proto( - 4, /* nstack */ - 0, /* argc */ - 0, /* varg */ - 1, /* has upvals */ - ( &(const bupvaldesc[ 1]) { /* upvals */ - be_local_const_upval(1, 0), - }), - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 4]) { /* constants */ - /* K0 */ be_nested_str_weak(mdns_announce_PASE), - /* K1 */ be_nested_str_weak(tasmota), - /* K2 */ be_nested_str_weak(remove_rule), - /* K3 */ be_nested_str_weak(Wifi_X23Connected), - }), - be_str_weak(_anonymous_), - &be_const_str_solidified, - ( &(const binstruction[ 9]) { /* code */ - 0x68000000, // 0000 GETUPV R0 U0 - 0x8C000100, // 0001 GETMET R0 R0 K0 - 0x7C000200, // 0002 CALL R0 1 - 0xB8020200, // 0003 GETNGBL R0 K1 - 0x8C000102, // 0004 GETMET R0 R0 K2 - 0x58080003, // 0005 LDCONST R2 K3 - 0x580C0000, // 0006 LDCONST R3 K0 - 0x7C000600, // 0007 CALL R0 3 - 0x80000000, // 0008 RET 0 - }) - ), - be_nested_proto( - 4, /* nstack */ - 0, /* argc */ - 0, /* varg */ - 1, /* has upvals */ - ( &(const bupvaldesc[ 1]) { /* upvals */ - be_local_const_upval(1, 0), - }), - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 4]) { /* constants */ - /* K0 */ be_nested_str_weak(mdns_announce_PASE), - /* K1 */ be_nested_str_weak(tasmota), - /* K2 */ be_nested_str_weak(remove_rule), - /* K3 */ be_nested_str_weak(Eth_X23Connected), - }), - be_str_weak(_anonymous_), - &be_const_str_solidified, - ( &(const binstruction[ 9]) { /* code */ - 0x68000000, // 0000 GETUPV R0 U0 - 0x8C000100, // 0001 GETMET R0 R0 K0 - 0x7C000200, // 0002 CALL R0 1 - 0xB8020200, // 0003 GETNGBL R0 K1 - 0x8C000102, // 0004 GETMET R0 R0 K2 - 0x58080003, // 0005 LDCONST R2 K3 - 0x580C0000, // 0006 LDCONST R3 K0 - 0x7C000600, // 0007 CALL R0 3 - 0x80000000, // 0008 RET 0 - }) - ), - }), - 1, /* has constants */ - ( &(const bvalue[16]) { /* constants */ - /* K0 */ be_nested_str_weak(commissioning_open), - /* K1 */ be_nested_str_weak(tasmota), - /* K2 */ be_nested_str_weak(millis), - /* K3 */ be_nested_str_weak(commissioning_iterations), - /* K4 */ be_nested_str_weak(commissioning_discriminator), - /* K5 */ be_nested_str_weak(commissioning_salt), - /* K6 */ be_nested_str_weak(commissioning_w0), - /* K7 */ be_nested_str_weak(commissioning_L), - /* K8 */ be_nested_str_weak(commissioning_admin_fabric), - /* K9 */ be_nested_str_weak(wifi), - /* K10 */ be_nested_str_weak(up), - /* K11 */ be_nested_str_weak(eth), - /* K12 */ be_nested_str_weak(mdns_announce_PASE), - /* K13 */ be_nested_str_weak(add_rule), - /* K14 */ be_nested_str_weak(Wifi_X23Connected), - /* K15 */ be_nested_str_weak(Eth_X23Connected), - }), - be_str_weak(start_basic_commissioning), - &be_const_str_solidified, - ( &(const binstruction[40]) { /* code */ - 0xB8220200, // 0000 GETNGBL R8 K1 - 0x8C201102, // 0001 GETMET R8 R8 K2 - 0x7C200200, // 0002 CALL R8 1 - 0x542603E7, // 0003 LDINT R9 1000 - 0x08240209, // 0004 MUL R9 R1 R9 - 0x00201009, // 0005 ADD R8 R8 R9 - 0x90020008, // 0006 SETMBR R0 K0 R8 - 0x90020602, // 0007 SETMBR R0 K3 R2 - 0x90020803, // 0008 SETMBR R0 K4 R3 - 0x90020A04, // 0009 SETMBR R0 K5 R4 - 0x90020C05, // 000A SETMBR R0 K6 R5 - 0x90020E06, // 000B SETMBR R0 K7 R6 - 0x90021007, // 000C SETMBR R0 K8 R7 - 0xB8220200, // 000D GETNGBL R8 K1 - 0x8C201109, // 000E GETMET R8 R8 K9 - 0x7C200200, // 000F CALL R8 1 - 0x9420110A, // 0010 GETIDX R8 R8 K10 - 0x74220004, // 0011 JMPT R8 #0017 - 0xB8220200, // 0012 GETNGBL R8 K1 - 0x8C20110B, // 0013 GETMET R8 R8 K11 - 0x7C200200, // 0014 CALL R8 1 - 0x9420110A, // 0015 GETIDX R8 R8 K10 - 0x78220002, // 0016 JMPF R8 #001A - 0x8C20010C, // 0017 GETMET R8 R0 K12 - 0x7C200200, // 0018 CALL R8 1 - 0x7002000B, // 0019 JMP #0026 - 0xB8220200, // 001A GETNGBL R8 K1 - 0x8C20110D, // 001B GETMET R8 R8 K13 - 0x5828000E, // 001C LDCONST R10 K14 - 0x842C0000, // 001D CLOSURE R11 P0 - 0x5830000C, // 001E LDCONST R12 K12 - 0x7C200800, // 001F CALL R8 4 - 0xB8220200, // 0020 GETNGBL R8 K1 - 0x8C20110D, // 0021 GETMET R8 R8 K13 - 0x5828000F, // 0022 LDCONST R10 K15 - 0x842C0001, // 0023 CLOSURE R11 P1 - 0x5830000C, // 0024 LDCONST R12 K12 - 0x7C200800, // 0025 CALL R8 4 - 0xA0000000, // 0026 CLOSE R0 - 0x80000000, // 0027 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: load_param -********************************************************************/ -be_local_closure(Matter_Device_load_param, /* name */ - be_nested_proto( - 12, /* nstack */ + 11, /* nstack */ 1, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -657,148 +1385,231 @@ be_local_closure(Matter_Device_load_param, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[32]) { /* constants */ - /* K0 */ be_nested_str_weak(string), - /* K1 */ be_nested_str_weak(crypto), - /* K2 */ be_nested_str_weak(FILENAME), - /* K3 */ be_nested_str_weak(read), - /* K4 */ be_nested_str_weak(close), - /* K5 */ be_nested_str_weak(json), - /* K6 */ be_nested_str_weak(load), - /* K7 */ be_nested_str_weak(root_discriminator), + ( &(const bvalue[19]) { /* constants */ + /* K0 */ be_nested_str_weak(introspect), + /* K1 */ be_nested_str_weak(string), + /* K2 */ be_nested_str_weak(http_remotes), + /* K3 */ be_const_int(0), + /* K4 */ be_nested_str_weak(stop_iteration), + /* K5 */ be_nested_str_weak(plugins), + /* K6 */ be_nested_str_weak(get), + /* K7 */ be_nested_str_weak(http_remote), /* K8 */ be_nested_str_weak(find), - /* K9 */ be_nested_str_weak(distinguish), - /* K10 */ be_nested_str_weak(root_passcode), - /* K11 */ be_nested_str_weak(passcode), - /* K12 */ be_nested_str_weak(ipv4only), - /* K13 */ be_nested_str_weak(next_ep), - /* K14 */ be_nested_str_weak(nextep), - /* K15 */ be_nested_str_weak(plugins_config), - /* K16 */ be_nested_str_weak(config), - /* K17 */ be_nested_str_weak(tasmota), - /* K18 */ be_nested_str_weak(log), - /* K19 */ be_nested_str_weak(MTR_X3A_X20load_config_X20_X3D_X20), - /* K20 */ be_const_int(3), - /* K21 */ be_nested_str_weak(adjust_next_ep), - /* K22 */ be_nested_str_weak(plugins_persist), - /* K23 */ be_nested_str_weak(io_error), - /* K24 */ be_nested_str_weak(MTR_X3A_X20Session_Store_X3A_X3Aload_X20Exception_X3A), - /* K25 */ be_nested_str_weak(_X7C), - /* K26 */ be_const_int(2), - /* K27 */ be_nested_str_weak(random), - /* K28 */ be_nested_str_weak(get), - /* K29 */ be_const_int(0), - /* K30 */ be_nested_str_weak(generate_random_passcode), - /* K31 */ be_nested_str_weak(save_param), + /* K9 */ be_const_int(1), + /* K10 */ be_nested_str_weak(tasmota), + /* K11 */ be_nested_str_weak(log), + /* K12 */ be_nested_str_weak(MTR_X3A_X20remotes_X20references_X3A_X20), + /* K13 */ be_nested_str_weak(keys), + /* K14 */ be_nested_str_weak(MTR_X3A_X20remove_X20unused_X20remote_X3A_X20), + /* K15 */ be_nested_str_weak(addr), + /* K16 */ be_const_int(3), + /* K17 */ be_nested_str_weak(close), + /* K18 */ be_nested_str_weak(remove), }), - be_str_weak(load_param), + be_str_weak(clean_remotes), &be_const_str_solidified, - ( &(const binstruction[105]) { /* code */ + ( &(const binstruction[72]) { /* code */ 0xA4060000, // 0000 IMPORT R1 K0 0xA40A0200, // 0001 IMPORT R2 K1 - 0xA8020036, // 0002 EXBLK 0 #003A - 0x600C0011, // 0003 GETGBL R3 G17 - 0x88100102, // 0004 GETMBR R4 R0 K2 - 0x7C0C0200, // 0005 CALL R3 1 - 0x8C100703, // 0006 GETMET R4 R3 K3 - 0x7C100200, // 0007 CALL R4 1 - 0x8C140704, // 0008 GETMET R5 R3 K4 - 0x7C140200, // 0009 CALL R5 1 - 0xA4160A00, // 000A IMPORT R5 K5 - 0x8C180B06, // 000B GETMET R6 R5 K6 - 0x5C200800, // 000C MOVE R8 R4 - 0x7C180400, // 000D CALL R6 2 - 0x8C1C0D08, // 000E GETMET R7 R6 K8 - 0x58240009, // 000F LDCONST R9 K9 - 0x88280107, // 0010 GETMBR R10 R0 K7 - 0x7C1C0600, // 0011 CALL R7 3 - 0x90020E07, // 0012 SETMBR R0 K7 R7 - 0x8C1C0D08, // 0013 GETMET R7 R6 K8 - 0x5824000B, // 0014 LDCONST R9 K11 - 0x8828010A, // 0015 GETMBR R10 R0 K10 - 0x7C1C0600, // 0016 CALL R7 3 - 0x90021407, // 0017 SETMBR R0 K10 R7 - 0x601C0017, // 0018 GETGBL R7 G23 - 0x8C200D08, // 0019 GETMET R8 R6 K8 - 0x5828000C, // 001A LDCONST R10 K12 - 0x502C0000, // 001B LDBOOL R11 0 0 - 0x7C200600, // 001C CALL R8 3 - 0x7C1C0200, // 001D CALL R7 1 - 0x90021807, // 001E SETMBR R0 K12 R7 - 0x8C1C0D08, // 001F GETMET R7 R6 K8 - 0x5824000E, // 0020 LDCONST R9 K14 - 0x8828010D, // 0021 GETMBR R10 R0 K13 - 0x7C1C0600, // 0022 CALL R7 3 - 0x90021A07, // 0023 SETMBR R0 K13 R7 - 0x8C1C0D08, // 0024 GETMET R7 R6 K8 - 0x58240010, // 0025 LDCONST R9 K16 - 0x7C1C0400, // 0026 CALL R7 2 - 0x90021E07, // 0027 SETMBR R0 K15 R7 - 0x881C010F, // 0028 GETMBR R7 R0 K15 - 0x4C200000, // 0029 LDNIL R8 - 0x201C0E08, // 002A NE R7 R7 R8 - 0x781E000B, // 002B JMPF R7 #0038 - 0xB81E2200, // 002C GETNGBL R7 K17 - 0x8C1C0F12, // 002D GETMET R7 R7 K18 - 0x60240008, // 002E GETGBL R9 G8 - 0x8828010F, // 002F GETMBR R10 R0 K15 - 0x7C240200, // 0030 CALL R9 1 - 0x00262609, // 0031 ADD R9 K19 R9 - 0x58280014, // 0032 LDCONST R10 K20 - 0x7C1C0600, // 0033 CALL R7 3 - 0x8C1C0115, // 0034 GETMET R7 R0 K21 - 0x7C1C0200, // 0035 CALL R7 1 - 0x501C0200, // 0036 LDBOOL R7 1 0 - 0x90022C07, // 0037 SETMBR R0 K22 R7 - 0xA8040001, // 0038 EXBLK 1 1 - 0x70020012, // 0039 JMP #004D - 0xAC0C0002, // 003A CATCH R3 0 2 - 0x7002000F, // 003B JMP #004C - 0x20140717, // 003C NE R5 R3 K23 - 0x7816000C, // 003D JMPF R5 #004B - 0xB8162200, // 003E GETNGBL R5 K17 - 0x8C140B12, // 003F GETMET R5 R5 K18 - 0x601C0008, // 0040 GETGBL R7 G8 - 0x5C200600, // 0041 MOVE R8 R3 - 0x7C1C0200, // 0042 CALL R7 1 - 0x001E3007, // 0043 ADD R7 K24 R7 - 0x001C0F19, // 0044 ADD R7 R7 K25 - 0x60200008, // 0045 GETGBL R8 G8 - 0x5C240800, // 0046 MOVE R9 R4 - 0x7C200200, // 0047 CALL R8 1 - 0x001C0E08, // 0048 ADD R7 R7 R8 - 0x5820001A, // 0049 LDCONST R8 K26 - 0x7C140600, // 004A CALL R5 3 - 0x70020000, // 004B JMP #004D - 0xB0080000, // 004C RAISE 2 R0 R0 - 0x500C0000, // 004D LDBOOL R3 0 0 - 0x88100107, // 004E GETMBR R4 R0 K7 - 0x4C140000, // 004F LDNIL R5 - 0x1C100805, // 0050 EQ R4 R4 R5 - 0x7812000A, // 0051 JMPF R4 #005D - 0x8C10051B, // 0052 GETMET R4 R2 K27 - 0x5818001A, // 0053 LDCONST R6 K26 - 0x7C100400, // 0054 CALL R4 2 - 0x8C10091C, // 0055 GETMET R4 R4 K28 - 0x5818001D, // 0056 LDCONST R6 K29 - 0x581C001A, // 0057 LDCONST R7 K26 - 0x7C100600, // 0058 CALL R4 3 - 0x54160FFE, // 0059 LDINT R5 4095 - 0x2C100805, // 005A AND R4 R4 R5 - 0x90020E04, // 005B SETMBR R0 K7 R4 - 0x500C0200, // 005C LDBOOL R3 1 0 - 0x8810010A, // 005D GETMBR R4 R0 K10 - 0x4C140000, // 005E LDNIL R5 - 0x1C100805, // 005F EQ R4 R4 R5 - 0x78120003, // 0060 JMPF R4 #0065 - 0x8C10011E, // 0061 GETMET R4 R0 K30 - 0x7C100200, // 0062 CALL R4 1 - 0x90021404, // 0063 SETMBR R0 K10 R4 - 0x500C0200, // 0064 LDBOOL R3 1 0 - 0x780E0001, // 0065 JMPF R3 #0068 - 0x8C10011F, // 0066 GETMET R4 R0 K31 - 0x7C100200, // 0067 CALL R4 1 - 0x80000000, // 0068 RET 0 + 0x600C0013, // 0002 GETGBL R3 G19 + 0x7C0C0000, // 0003 CALL R3 0 + 0x60100010, // 0004 GETGBL R4 G16 + 0x88140102, // 0005 GETMBR R5 R0 K2 + 0x7C100200, // 0006 CALL R4 1 + 0xA8020003, // 0007 EXBLK 0 #000C + 0x5C140800, // 0008 MOVE R5 R4 + 0x7C140000, // 0009 CALL R5 0 + 0x980C0B03, // 000A SETIDX R3 R5 K3 + 0x7001FFFB, // 000B JMP #0008 + 0x58100004, // 000C LDCONST R4 K4 + 0xAC100200, // 000D CATCH R4 1 0 + 0xB0080000, // 000E RAISE 2 R0 R0 + 0x60100010, // 000F GETGBL R4 G16 + 0x88140105, // 0010 GETMBR R5 R0 K5 + 0x7C100200, // 0011 CALL R4 1 + 0xA802000F, // 0012 EXBLK 0 #0023 + 0x5C140800, // 0013 MOVE R5 R4 + 0x7C140000, // 0014 CALL R5 0 + 0x8C180306, // 0015 GETMET R6 R1 K6 + 0x5C200A00, // 0016 MOVE R8 R5 + 0x58240007, // 0017 LDCONST R9 K7 + 0x7C180600, // 0018 CALL R6 3 + 0x4C1C0000, // 0019 LDNIL R7 + 0x201C0C07, // 001A NE R7 R6 R7 + 0x781E0005, // 001B JMPF R7 #0022 + 0x8C1C0708, // 001C GETMET R7 R3 K8 + 0x5C240C00, // 001D MOVE R9 R6 + 0x58280003, // 001E LDCONST R10 K3 + 0x7C1C0600, // 001F CALL R7 3 + 0x001C0F09, // 0020 ADD R7 R7 K9 + 0x980C0C07, // 0021 SETIDX R3 R6 R7 + 0x7001FFEF, // 0022 JMP #0013 + 0x58100004, // 0023 LDCONST R4 K4 + 0xAC100200, // 0024 CATCH R4 1 0 + 0xB0080000, // 0025 RAISE 2 R0 R0 + 0xB8121400, // 0026 GETNGBL R4 K10 + 0x8C10090B, // 0027 GETMET R4 R4 K11 + 0x60180008, // 0028 GETGBL R6 G8 + 0x5C1C0600, // 0029 MOVE R7 R3 + 0x7C180200, // 002A CALL R6 1 + 0x001A1806, // 002B ADD R6 K12 R6 + 0x7C100400, // 002C CALL R4 2 + 0x60100010, // 002D GETGBL R4 G16 + 0x8C14070D, // 002E GETMET R5 R3 K13 + 0x7C140200, // 002F CALL R5 1 + 0x7C100200, // 0030 CALL R4 1 + 0xA8020011, // 0031 EXBLK 0 #0044 + 0x5C140800, // 0032 MOVE R5 R4 + 0x7C140000, // 0033 CALL R5 0 + 0x94180605, // 0034 GETIDX R6 R3 R5 + 0x1C180D03, // 0035 EQ R6 R6 K3 + 0x781A000B, // 0036 JMPF R6 #0043 + 0xB81A1400, // 0037 GETNGBL R6 K10 + 0x8C180D0B, // 0038 GETMET R6 R6 K11 + 0x88200B0F, // 0039 GETMBR R8 R5 K15 + 0x00221C08, // 003A ADD R8 K14 R8 + 0x58240010, // 003B LDCONST R9 K16 + 0x7C180600, // 003C CALL R6 3 + 0x8C180B11, // 003D GETMET R6 R5 K17 + 0x7C180200, // 003E CALL R6 1 + 0x88180102, // 003F GETMBR R6 R0 K2 + 0x8C180D12, // 0040 GETMET R6 R6 K18 + 0x5C200A00, // 0041 MOVE R8 R5 + 0x7C180400, // 0042 CALL R6 2 + 0x7001FFED, // 0043 JMP #0032 + 0x58100004, // 0044 LDCONST R4 K4 + 0xAC100200, // 0045 CATCH R4 1 0 + 0xB0080000, // 0046 RAISE 2 R0 R0 + 0x80000000, // 0047 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: mdns_announce_op_discovery_all_fabrics +********************************************************************/ +be_local_closure(Matter_Device_mdns_announce_op_discovery_all_fabrics, /* name */ + be_nested_proto( + 6, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 6]) { /* constants */ + /* K0 */ be_nested_str_weak(sessions), + /* K1 */ be_nested_str_weak(active_fabrics), + /* K2 */ be_nested_str_weak(get_device_id), + /* K3 */ be_nested_str_weak(get_fabric_id), + /* K4 */ be_nested_str_weak(mdns_announce_op_discovery), + /* K5 */ be_nested_str_weak(stop_iteration), + }), + be_str_weak(mdns_announce_op_discovery_all_fabrics), + &be_const_str_solidified, + ( &(const binstruction[22]) { /* code */ + 0x60040010, // 0000 GETGBL R1 G16 + 0x88080100, // 0001 GETMBR R2 R0 K0 + 0x8C080501, // 0002 GETMET R2 R2 K1 + 0x7C080200, // 0003 CALL R2 1 + 0x7C040200, // 0004 CALL R1 1 + 0xA802000B, // 0005 EXBLK 0 #0012 + 0x5C080200, // 0006 MOVE R2 R1 + 0x7C080000, // 0007 CALL R2 0 + 0x8C0C0502, // 0008 GETMET R3 R2 K2 + 0x7C0C0200, // 0009 CALL R3 1 + 0x780E0005, // 000A JMPF R3 #0011 + 0x8C0C0503, // 000B GETMET R3 R2 K3 + 0x7C0C0200, // 000C CALL R3 1 + 0x780E0002, // 000D JMPF R3 #0011 + 0x8C0C0104, // 000E GETMET R3 R0 K4 + 0x5C140400, // 000F MOVE R5 R2 + 0x7C0C0400, // 0010 CALL R3 2 + 0x7001FFF3, // 0011 JMP #0006 + 0x58040005, // 0012 LDCONST R1 K5 + 0xAC040200, // 0013 CATCH R1 1 0 + 0xB0080000, // 0014 RAISE 2 R0 R0 + 0x80000000, // 0015 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: signal_endpoints_changed +********************************************************************/ +be_local_closure(Matter_Device_signal_endpoints_changed, /* name */ + be_nested_proto( + 7, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 3]) { /* constants */ + /* K0 */ be_nested_str_weak(attribute_updated), + /* K1 */ be_const_int(0), + /* K2 */ be_const_int(3), + }), + be_str_weak(signal_endpoints_changed), + &be_const_str_solidified, + ( &(const binstruction[13]) { /* code */ + 0x8C040100, // 0000 GETMET R1 R0 K0 + 0x580C0001, // 0001 LDCONST R3 K1 + 0x5412001C, // 0002 LDINT R4 29 + 0x58140002, // 0003 LDCONST R5 K2 + 0x50180000, // 0004 LDBOOL R6 0 0 + 0x7C040A00, // 0005 CALL R1 5 + 0x8C040100, // 0006 GETMET R1 R0 K0 + 0x540EFEFF, // 0007 LDINT R3 65280 + 0x5412001C, // 0008 LDINT R4 29 + 0x58140002, // 0009 LDCONST R5 K2 + 0x50180000, // 000A LDBOOL R6 0 0 + 0x7C040A00, // 000B CALL R1 5 + 0x80000000, // 000C RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: get_plugin_class_displayname +********************************************************************/ +be_local_closure(Matter_Device_get_plugin_class_displayname, /* name */ + be_nested_proto( + 5, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 4]) { /* constants */ + /* K0 */ be_nested_str_weak(plugins_classes), + /* K1 */ be_nested_str_weak(find), + /* K2 */ be_nested_str_weak(NAME), + /* K3 */ be_nested_str_weak(), + }), + be_str_weak(get_plugin_class_displayname), + &be_const_str_solidified, + ( &(const binstruction[ 9]) { /* code */ + 0x88080100, // 0000 GETMBR R2 R0 K0 + 0x8C080501, // 0001 GETMET R2 R2 K1 + 0x5C100200, // 0002 MOVE R4 R1 + 0x7C080400, // 0003 CALL R2 2 + 0x780A0001, // 0004 JMPF R2 #0007 + 0x880C0502, // 0005 GETMBR R3 R2 K2 + 0x70020000, // 0006 JMP #0008 + 0x580C0003, // 0007 LDCONST R3 K3 + 0x80040600, // 0008 RET 1 R3 }) ) ); @@ -872,6 +1683,126 @@ be_local_closure(Matter_Device_generate_random_passcode, /* name */ /*******************************************************************/ +/******************************************************************** +** Solidified function: MtrJoin +********************************************************************/ +be_local_closure(Matter_Device_MtrJoin, /* name */ + be_nested_proto( + 8, /* nstack */ + 5, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 4]) { /* constants */ + /* K0 */ be_nested_str_weak(start_root_basic_commissioning), + /* K1 */ be_nested_str_weak(stop_basic_commissioning), + /* K2 */ be_nested_str_weak(tasmota), + /* K3 */ be_nested_str_weak(resp_cmnd_done), + }), + be_str_weak(MtrJoin), + &be_const_str_solidified, + ( &(const binstruction[13]) { /* code */ + 0x60140009, // 0000 GETGBL R5 G9 + 0x5C180600, // 0001 MOVE R6 R3 + 0x7C140200, // 0002 CALL R5 1 + 0x78160002, // 0003 JMPF R5 #0007 + 0x8C180100, // 0004 GETMET R6 R0 K0 + 0x7C180200, // 0005 CALL R6 1 + 0x70020001, // 0006 JMP #0009 + 0x8C180101, // 0007 GETMET R6 R0 K1 + 0x7C180200, // 0008 CALL R6 1 + 0xB81A0400, // 0009 GETNGBL R6 K2 + 0x8C180D03, // 000A GETMET R6 R6 K3 + 0x7C180200, // 000B CALL R6 1 + 0x80000000, // 000C RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: remove_fabric +********************************************************************/ +be_local_closure(Matter_Device_remove_fabric, /* name */ + be_nested_proto( + 9, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[12]) { /* constants */ + /* K0 */ be_nested_str_weak(sessions), + /* K1 */ be_nested_str_weak(find_children_fabrics), + /* K2 */ be_nested_str_weak(get_fabric_index), + /* K3 */ be_nested_str_weak(find_fabric_by_index), + /* K4 */ be_nested_str_weak(message_handler), + /* K5 */ be_nested_str_weak(im), + /* K6 */ be_nested_str_weak(subs_shop), + /* K7 */ be_nested_str_weak(remove_by_fabric), + /* K8 */ be_nested_str_weak(mdns_remove_op_discovery), + /* K9 */ be_nested_str_weak(remove_fabric), + /* K10 */ be_nested_str_weak(stop_iteration), + /* K11 */ be_nested_str_weak(save_fabrics), + }), + be_str_weak(remove_fabric), + &be_const_str_solidified, + ( &(const binstruction[43]) { /* code */ + 0x88080100, // 0000 GETMBR R2 R0 K0 + 0x8C080501, // 0001 GETMET R2 R2 K1 + 0x8C100302, // 0002 GETMET R4 R1 K2 + 0x7C100200, // 0003 CALL R4 1 + 0x7C080400, // 0004 CALL R2 2 + 0x4C0C0000, // 0005 LDNIL R3 + 0x1C0C0403, // 0006 EQ R3 R2 R3 + 0x780E0000, // 0007 JMPF R3 #0009 + 0x80000600, // 0008 RET 0 + 0x600C0010, // 0009 GETGBL R3 G16 + 0x5C100400, // 000A MOVE R4 R2 + 0x7C0C0200, // 000B CALL R3 1 + 0xA8020016, // 000C EXBLK 0 #0024 + 0x5C100600, // 000D MOVE R4 R3 + 0x7C100000, // 000E CALL R4 0 + 0x88140100, // 000F GETMBR R5 R0 K0 + 0x8C140B03, // 0010 GETMET R5 R5 K3 + 0x5C1C0800, // 0011 MOVE R7 R4 + 0x7C140400, // 0012 CALL R5 2 + 0x4C180000, // 0013 LDNIL R6 + 0x20180A06, // 0014 NE R6 R5 R6 + 0x781A000C, // 0015 JMPF R6 #0023 + 0x88180104, // 0016 GETMBR R6 R0 K4 + 0x88180D05, // 0017 GETMBR R6 R6 K5 + 0x88180D06, // 0018 GETMBR R6 R6 K6 + 0x8C180D07, // 0019 GETMET R6 R6 K7 + 0x5C200A00, // 001A MOVE R8 R5 + 0x7C180400, // 001B CALL R6 2 + 0x8C180108, // 001C GETMET R6 R0 K8 + 0x5C200A00, // 001D MOVE R8 R5 + 0x7C180400, // 001E CALL R6 2 + 0x88180100, // 001F GETMBR R6 R0 K0 + 0x8C180D09, // 0020 GETMET R6 R6 K9 + 0x5C200A00, // 0021 MOVE R8 R5 + 0x7C180400, // 0022 CALL R6 2 + 0x7001FFE8, // 0023 JMP #000D + 0x580C000A, // 0024 LDCONST R3 K10 + 0xAC0C0200, // 0025 CATCH R3 1 0 + 0xB0080000, // 0026 RAISE 2 R0 R0 + 0x880C0100, // 0027 GETMBR R3 R0 K0 + 0x8C0C070B, // 0028 GETMET R3 R3 K11 + 0x7C0C0200, // 0029 CALL R3 1 + 0x80000000, // 002A RET 0 + }) + ) +); +/*******************************************************************/ + + /******************************************************************** ** Solidified function: process_attribute_expansion ********************************************************************/ @@ -1202,11 +2133,11 @@ be_local_closure(Matter_Device_process_attribute_expansion, /* name */ /******************************************************************** -** Solidified function: received_ack +** Solidified function: mdns_remove_op_discovery ********************************************************************/ -be_local_closure(Matter_Device_received_ack, /* name */ +be_local_closure(Matter_Device_mdns_remove_op_discovery, /* name */ be_nested_proto( - 5, /* nstack */ + 14, /* nstack */ 2, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -1214,156 +2145,116 @@ be_local_closure(Matter_Device_received_ack, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[ 2]) { /* constants */ - /* K0 */ be_nested_str_weak(udp_server), - /* K1 */ be_nested_str_weak(received_ack), + ( &(const bvalue[24]) { /* constants */ + /* K0 */ be_nested_str_weak(mdns), + /* K1 */ be_nested_str_weak(string), + /* K2 */ be_nested_str_weak(get_device_id), + /* K3 */ be_nested_str_weak(copy), + /* K4 */ be_nested_str_weak(reverse), + /* K5 */ be_nested_str_weak(get_fabric_compressed), + /* K6 */ be_nested_str_weak(tohex), + /* K7 */ be_nested_str_weak(_X2D), + /* K8 */ be_nested_str_weak(tasmota), + /* K9 */ be_nested_str_weak(eth), + /* K10 */ be_nested_str_weak(find), + /* K11 */ be_nested_str_weak(up), + /* K12 */ be_nested_str_weak(log), + /* K13 */ be_nested_str_weak(format), + /* K14 */ be_nested_str_weak(MTR_X3A_X20remove_X20mDNS_X20on_X20_X25s_X20_X27_X25s_X27), + /* K15 */ be_const_int(2), + /* K16 */ be_nested_str_weak(remove_service), + /* K17 */ be_nested_str_weak(_matter), + /* K18 */ be_nested_str_weak(_tcp), + /* K19 */ be_nested_str_weak(hostname_eth), + /* K20 */ be_nested_str_weak(wifi), + /* K21 */ be_nested_str_weak(hostname_wifi), + /* K22 */ be_nested_str_weak(MTR_X3A_X20Exception), + /* K23 */ be_nested_str_weak(_X7C), }), - be_str_weak(received_ack), + be_str_weak(mdns_remove_op_discovery), &be_const_str_solidified, - ( &(const binstruction[ 5]) { /* code */ - 0x88080100, // 0000 GETMBR R2 R0 K0 - 0x8C080501, // 0001 GETMET R2 R2 K1 - 0x5C100200, // 0002 MOVE R4 R1 - 0x7C080400, // 0003 CALL R2 2 - 0x80040400, // 0004 RET 1 R2 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: sort_distinct -********************************************************************/ -be_local_closure(Matter_Device_sort_distinct, /* name */ - be_nested_proto( - 7, /* nstack */ - 1, /* argc */ - 4, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 5]) { /* constants */ - /* K0 */ be_const_class(be_class_Matter_Device), - /* K1 */ be_const_int(1), - /* K2 */ be_const_int(0), - /* K3 */ be_nested_str_weak(stop_iteration), - /* K4 */ be_nested_str_weak(remove), - }), - be_str_weak(sort_distinct), - &be_const_str_solidified, - ( &(const binstruction[53]) { /* code */ - 0x58040000, // 0000 LDCONST R1 K0 - 0x60080010, // 0001 GETGBL R2 G16 - 0x600C000C, // 0002 GETGBL R3 G12 - 0x5C100000, // 0003 MOVE R4 R0 - 0x7C0C0200, // 0004 CALL R3 1 - 0x040C0701, // 0005 SUB R3 R3 K1 - 0x400E0203, // 0006 CONNECT R3 K1 R3 - 0x7C080200, // 0007 CALL R2 1 - 0xA8020010, // 0008 EXBLK 0 #001A - 0x5C0C0400, // 0009 MOVE R3 R2 - 0x7C0C0000, // 000A CALL R3 0 - 0x94100003, // 000B GETIDX R4 R0 R3 - 0x5C140600, // 000C MOVE R5 R3 - 0x24180B02, // 000D GT R6 R5 K2 - 0x781A0008, // 000E JMPF R6 #0018 - 0x04180B01, // 000F SUB R6 R5 K1 - 0x94180006, // 0010 GETIDX R6 R0 R6 - 0x24180C04, // 0011 GT R6 R6 R4 - 0x781A0004, // 0012 JMPF R6 #0018 - 0x04180B01, // 0013 SUB R6 R5 K1 - 0x94180006, // 0014 GETIDX R6 R0 R6 - 0x98000A06, // 0015 SETIDX R0 R5 R6 - 0x04140B01, // 0016 SUB R5 R5 K1 - 0x7001FFF4, // 0017 JMP #000D - 0x98000A04, // 0018 SETIDX R0 R5 R4 - 0x7001FFEE, // 0019 JMP #0009 - 0x58080003, // 001A LDCONST R2 K3 - 0xAC080200, // 001B CATCH R2 1 0 - 0xB0080000, // 001C RAISE 2 R0 R0 - 0x58080001, // 001D LDCONST R2 K1 - 0x600C000C, // 001E GETGBL R3 G12 - 0x5C100000, // 001F MOVE R4 R0 - 0x7C0C0200, // 0020 CALL R3 1 - 0x180C0701, // 0021 LE R3 R3 K1 - 0x780E0000, // 0022 JMPF R3 #0024 - 0x80040000, // 0023 RET 1 R0 - 0x940C0102, // 0024 GETIDX R3 R0 K2 - 0x6010000C, // 0025 GETGBL R4 G12 - 0x5C140000, // 0026 MOVE R5 R0 - 0x7C100200, // 0027 CALL R4 1 - 0x14100404, // 0028 LT R4 R2 R4 - 0x78120009, // 0029 JMPF R4 #0034 - 0x94100002, // 002A GETIDX R4 R0 R2 - 0x1C100803, // 002B EQ R4 R4 R3 - 0x78120003, // 002C JMPF R4 #0031 - 0x8C100104, // 002D GETMET R4 R0 K4 - 0x5C180400, // 002E MOVE R6 R2 - 0x7C100400, // 002F CALL R4 2 - 0x70020001, // 0030 JMP #0033 - 0x940C0002, // 0031 GETIDX R3 R0 R2 - 0x00080501, // 0032 ADD R2 R2 K1 - 0x7001FFF0, // 0033 JMP #0025 - 0x80040000, // 0034 RET 1 R0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: invoke_request -********************************************************************/ -be_local_closure(Matter_Device_invoke_request, /* name */ - be_nested_proto( - 12, /* nstack */ - 4, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 8]) { /* constants */ - /* K0 */ be_const_int(0), - /* K1 */ be_nested_str_weak(endpoint), - /* K2 */ be_nested_str_weak(plugins), - /* K3 */ be_nested_str_weak(invoke_request), - /* K4 */ be_const_int(1), - /* K5 */ be_nested_str_weak(status), - /* K6 */ be_nested_str_weak(matter), - /* K7 */ be_nested_str_weak(UNSUPPORTED_ENDPOINT), - }), - be_str_weak(invoke_request), - &be_const_str_solidified, - ( &(const binstruction[24]) { /* code */ - 0x58100000, // 0000 LDCONST R4 K0 - 0x88140701, // 0001 GETMBR R5 R3 K1 - 0x6018000C, // 0002 GETGBL R6 G12 - 0x881C0102, // 0003 GETMBR R7 R0 K2 - 0x7C180200, // 0004 CALL R6 1 - 0x14180806, // 0005 LT R6 R4 R6 - 0x781A000C, // 0006 JMPF R6 #0014 - 0x88180102, // 0007 GETMBR R6 R0 K2 - 0x94180C04, // 0008 GETIDX R6 R6 R4 - 0x881C0D01, // 0009 GETMBR R7 R6 K1 - 0x1C1C0E05, // 000A EQ R7 R7 R5 - 0x781E0005, // 000B JMPF R7 #0012 - 0x8C1C0D03, // 000C GETMET R7 R6 K3 - 0x5C240200, // 000D MOVE R9 R1 - 0x5C280400, // 000E MOVE R10 R2 - 0x5C2C0600, // 000F MOVE R11 R3 - 0x7C1C0800, // 0010 CALL R7 4 - 0x80040E00, // 0011 RET 1 R7 - 0x00100904, // 0012 ADD R4 R4 K4 - 0x7001FFED, // 0013 JMP #0002 - 0xB81A0C00, // 0014 GETNGBL R6 K6 - 0x88180D07, // 0015 GETMBR R6 R6 K7 - 0x900E0A06, // 0016 SETMBR R3 K5 R6 - 0x80000000, // 0017 RET 0 + ( &(const binstruction[81]) { /* code */ + 0xA40A0000, // 0000 IMPORT R2 K0 + 0xA40E0200, // 0001 IMPORT R3 K1 + 0xA802003B, // 0002 EXBLK 0 #003F + 0x8C100302, // 0003 GETMET R4 R1 K2 + 0x7C100200, // 0004 CALL R4 1 + 0x8C100903, // 0005 GETMET R4 R4 K3 + 0x7C100200, // 0006 CALL R4 1 + 0x8C100904, // 0007 GETMET R4 R4 K4 + 0x7C100200, // 0008 CALL R4 1 + 0x8C140305, // 0009 GETMET R5 R1 K5 + 0x7C140200, // 000A CALL R5 1 + 0x8C180B06, // 000B GETMET R6 R5 K6 + 0x7C180200, // 000C CALL R6 1 + 0x00180D07, // 000D ADD R6 R6 K7 + 0x8C1C0906, // 000E GETMET R7 R4 K6 + 0x7C1C0200, // 000F CALL R7 1 + 0x00180C07, // 0010 ADD R6 R6 R7 + 0xB81E1000, // 0011 GETNGBL R7 K8 + 0x8C1C0F09, // 0012 GETMET R7 R7 K9 + 0x7C1C0200, // 0013 CALL R7 1 + 0x8C1C0F0A, // 0014 GETMET R7 R7 K10 + 0x5824000B, // 0015 LDCONST R9 K11 + 0x7C1C0400, // 0016 CALL R7 2 + 0x781E000E, // 0017 JMPF R7 #0027 + 0xB81E1000, // 0018 GETNGBL R7 K8 + 0x8C1C0F0C, // 0019 GETMET R7 R7 K12 + 0x8C24070D, // 001A GETMET R9 R3 K13 + 0x582C000E, // 001B LDCONST R11 K14 + 0x58300009, // 001C LDCONST R12 K9 + 0x5C340C00, // 001D MOVE R13 R6 + 0x7C240800, // 001E CALL R9 4 + 0x5828000F, // 001F LDCONST R10 K15 + 0x7C1C0600, // 0020 CALL R7 3 + 0x8C1C0510, // 0021 GETMET R7 R2 K16 + 0x58240011, // 0022 LDCONST R9 K17 + 0x58280012, // 0023 LDCONST R10 K18 + 0x5C2C0C00, // 0024 MOVE R11 R6 + 0x88300113, // 0025 GETMBR R12 R0 K19 + 0x7C1C0A00, // 0026 CALL R7 5 + 0xB81E1000, // 0027 GETNGBL R7 K8 + 0x8C1C0F14, // 0028 GETMET R7 R7 K20 + 0x7C1C0200, // 0029 CALL R7 1 + 0x8C1C0F0A, // 002A GETMET R7 R7 K10 + 0x5824000B, // 002B LDCONST R9 K11 + 0x7C1C0400, // 002C CALL R7 2 + 0x781E000E, // 002D JMPF R7 #003D + 0xB81E1000, // 002E GETNGBL R7 K8 + 0x8C1C0F0C, // 002F GETMET R7 R7 K12 + 0x8C24070D, // 0030 GETMET R9 R3 K13 + 0x582C000E, // 0031 LDCONST R11 K14 + 0x58300014, // 0032 LDCONST R12 K20 + 0x5C340C00, // 0033 MOVE R13 R6 + 0x7C240800, // 0034 CALL R9 4 + 0x5828000F, // 0035 LDCONST R10 K15 + 0x7C1C0600, // 0036 CALL R7 3 + 0x8C1C0510, // 0037 GETMET R7 R2 K16 + 0x58240011, // 0038 LDCONST R9 K17 + 0x58280012, // 0039 LDCONST R10 K18 + 0x5C2C0C00, // 003A MOVE R11 R6 + 0x88300115, // 003B GETMBR R12 R0 K21 + 0x7C1C0A00, // 003C CALL R7 5 + 0xA8040001, // 003D EXBLK 1 1 + 0x70020010, // 003E JMP #0050 + 0xAC100002, // 003F CATCH R4 0 2 + 0x7002000D, // 0040 JMP #004F + 0xB81A1000, // 0041 GETNGBL R6 K8 + 0x8C180D0C, // 0042 GETMET R6 R6 K12 + 0x60200008, // 0043 GETGBL R8 G8 + 0x5C240800, // 0044 MOVE R9 R4 + 0x7C200200, // 0045 CALL R8 1 + 0x00222C08, // 0046 ADD R8 K22 R8 + 0x00201117, // 0047 ADD R8 R8 K23 + 0x60240008, // 0048 GETGBL R9 G8 + 0x5C280A00, // 0049 MOVE R10 R5 + 0x7C240200, // 004A CALL R9 1 + 0x00201009, // 004B ADD R8 R8 R9 + 0x5824000F, // 004C LDCONST R9 K15 + 0x7C180600, // 004D CALL R6 3 + 0x70020000, // 004E JMP #0050 + 0xB0080000, // 004F RAISE 2 R0 R0 + 0x80000000, // 0050 RET 0 }) ) ); @@ -1706,81 +2597,40 @@ be_local_closure(Matter_Device_mdns_announce_PASE, /* name */ /******************************************************************** -** Solidified function: k2l_num +** Solidified function: event_fabrics_saved ********************************************************************/ -be_local_closure(Matter_Device_k2l_num, /* name */ +be_local_closure(Matter_Device_event_fabrics_saved, /* name */ be_nested_proto( - 9, /* nstack */ + 3, /* nstack */ 1, /* argc */ - 4, /* varg */ + 2, /* varg */ 0, /* has upvals */ NULL, /* no upvals */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[ 6]) { /* constants */ - /* K0 */ be_const_class(be_class_Matter_Device), - /* K1 */ be_nested_str_weak(keys), - /* K2 */ be_nested_str_weak(push), - /* K3 */ be_nested_str_weak(stop_iteration), - /* K4 */ be_const_int(1), - /* K5 */ be_const_int(0), + ( &(const bvalue[ 5]) { /* constants */ + /* K0 */ be_nested_str_weak(sessions), + /* K1 */ be_nested_str_weak(count_active_fabrics), + /* K2 */ be_const_int(0), + /* K3 */ be_nested_str_weak(plugins_persist), + /* K4 */ be_nested_str_weak(save_param), }), - be_str_weak(k2l_num), + be_str_weak(event_fabrics_saved), &be_const_str_solidified, - ( &(const binstruction[52]) { /* code */ - 0x58040000, // 0000 LDCONST R1 K0 - 0x60080012, // 0001 GETGBL R2 G18 - 0x7C080000, // 0002 CALL R2 0 - 0x4C0C0000, // 0003 LDNIL R3 - 0x1C0C0003, // 0004 EQ R3 R0 R3 - 0x780E0000, // 0005 JMPF R3 #0007 - 0x80040400, // 0006 RET 1 R2 - 0x600C0010, // 0007 GETGBL R3 G16 - 0x8C100101, // 0008 GETMET R4 R0 K1 - 0x7C100200, // 0009 CALL R4 1 - 0x7C0C0200, // 000A CALL R3 1 - 0xA8020007, // 000B EXBLK 0 #0014 - 0x5C100600, // 000C MOVE R4 R3 - 0x7C100000, // 000D CALL R4 0 - 0x8C140502, // 000E GETMET R5 R2 K2 - 0x601C0009, // 000F GETGBL R7 G9 - 0x5C200800, // 0010 MOVE R8 R4 - 0x7C1C0200, // 0011 CALL R7 1 - 0x7C140400, // 0012 CALL R5 2 - 0x7001FFF7, // 0013 JMP #000C - 0x580C0003, // 0014 LDCONST R3 K3 - 0xAC0C0200, // 0015 CATCH R3 1 0 - 0xB0080000, // 0016 RAISE 2 R0 R0 - 0x600C0010, // 0017 GETGBL R3 G16 - 0x6010000C, // 0018 GETGBL R4 G12 - 0x5C140400, // 0019 MOVE R5 R2 - 0x7C100200, // 001A CALL R4 1 - 0x04100904, // 001B SUB R4 R4 K4 - 0x40120804, // 001C CONNECT R4 K4 R4 - 0x7C0C0200, // 001D CALL R3 1 - 0xA8020010, // 001E EXBLK 0 #0030 - 0x5C100600, // 001F MOVE R4 R3 - 0x7C100000, // 0020 CALL R4 0 - 0x94140404, // 0021 GETIDX R5 R2 R4 - 0x5C180800, // 0022 MOVE R6 R4 - 0x241C0D05, // 0023 GT R7 R6 K5 - 0x781E0008, // 0024 JMPF R7 #002E - 0x041C0D04, // 0025 SUB R7 R6 K4 - 0x941C0407, // 0026 GETIDX R7 R2 R7 - 0x241C0E05, // 0027 GT R7 R7 R5 - 0x781E0004, // 0028 JMPF R7 #002E - 0x041C0D04, // 0029 SUB R7 R6 K4 - 0x941C0407, // 002A GETIDX R7 R2 R7 - 0x98080C07, // 002B SETIDX R2 R6 R7 - 0x04180D04, // 002C SUB R6 R6 K4 - 0x7001FFF4, // 002D JMP #0023 - 0x98080C05, // 002E SETIDX R2 R6 R5 - 0x7001FFEE, // 002F JMP #001F - 0x580C0003, // 0030 LDCONST R3 K3 - 0xAC0C0200, // 0031 CATCH R3 1 0 - 0xB0080000, // 0032 RAISE 2 R0 R0 - 0x80040400, // 0033 RET 1 R2 + ( &(const binstruction[12]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x8C040301, // 0001 GETMET R1 R1 K1 + 0x7C040200, // 0002 CALL R1 1 + 0x24040302, // 0003 GT R1 R1 K2 + 0x78060005, // 0004 JMPF R1 #000B + 0x88040103, // 0005 GETMBR R1 R0 K3 + 0x74060003, // 0006 JMPT R1 #000B + 0x50040200, // 0007 LDBOOL R1 1 0 + 0x90020601, // 0008 SETMBR R0 K3 R1 + 0x8C040104, // 0009 GETMET R1 R0 K4 + 0x7C040200, // 000A CALL R1 1 + 0x80000000, // 000B RET 0 }) ) ); @@ -1788,242 +2638,35 @@ be_local_closure(Matter_Device_k2l_num, /* name */ /******************************************************************** -** Solidified function: _instantiate_plugins_from_config +** Solidified function: _init_basic_commissioning ********************************************************************/ -be_local_closure(Matter_Device__instantiate_plugins_from_config, /* name */ +be_local_closure(Matter_Device__init_basic_commissioning, /* name */ be_nested_proto( - 19, /* nstack */ - 2, /* argc */ + 3, /* nstack */ + 1, /* argc */ 2, /* varg */ 0, /* has upvals */ NULL, /* no upvals */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[34]) { /* constants */ - /* K0 */ be_nested_str_weak(string), - /* K1 */ be_nested_str_weak(k2l_num), - /* K2 */ be_nested_str_weak(tasmota), - /* K3 */ be_nested_str_weak(log), - /* K4 */ be_nested_str_weak(MTR_X3A_X20endpoints_X20to_X20be_X20configured_X20), - /* K5 */ be_const_int(3), - /* K6 */ be_nested_str_weak(plugins), - /* K7 */ be_nested_str_weak(push), - /* K8 */ be_nested_str_weak(matter), - /* K9 */ be_nested_str_weak(Plugin_Root), - /* K10 */ be_const_int(0), - /* K11 */ be_nested_str_weak(format), - /* K12 */ be_nested_str_weak(MTR_X3A_X20endpoint_X3A_X25i_X20type_X3A_X25s_X25s), - /* K13 */ be_nested_str_weak(root), - /* K14 */ be_nested_str_weak(), - /* K15 */ be_const_int(2), - /* K16 */ be_nested_str_weak(Plugin_Aggregator), - /* K17 */ be_nested_str_weak(aggregator), - /* K18 */ be_nested_str_weak(MTR_X3A_X20endpoint_X20_X25i_X20config_X20_X25s), - /* K19 */ be_nested_str_weak(find), - /* K20 */ be_nested_str_weak(type), - /* K21 */ be_nested_str_weak(MTR_X3A_X20no_X20class_X20name_X2C_X20skipping), - /* K22 */ be_nested_str_weak(MTR_X3A_X20only_X20one_X20root_X20node_X20allowed), - /* K23 */ be_nested_str_weak(plugins_classes), - /* K24 */ be_nested_str_weak(MTR_X3A_X20unknown_X20class_X20name_X20_X27), - /* K25 */ be_nested_str_weak(_X27_X20skipping), - /* K26 */ be_nested_str_weak(k2l), - /* K27 */ be_nested_str_weak(_X20_X25s_X3A_X25s), - /* K28 */ be_nested_str_weak(stop_iteration), - /* K29 */ be_nested_str_weak(MTR_X3A_X20Exception), - /* K30 */ be_nested_str_weak(_X7C), - /* K31 */ be_nested_str_weak(publish_result), - /* K32 */ be_nested_str_weak(_X7B_X22Matter_X22_X3A_X7B_X22Initialized_X22_X3A1_X7D_X7D), - /* K33 */ be_nested_str_weak(Matter), + ( &(const bvalue[ 4]) { /* constants */ + /* K0 */ be_nested_str_weak(sessions), + /* K1 */ be_nested_str_weak(count_active_fabrics), + /* K2 */ be_const_int(0), + /* K3 */ be_nested_str_weak(start_root_basic_commissioning), }), - be_str_weak(_instantiate_plugins_from_config), + be_str_weak(_init_basic_commissioning), &be_const_str_solidified, - ( &(const binstruction[185]) { /* code */ - 0xA40A0000, // 0000 IMPORT R2 K0 - 0x8C0C0101, // 0001 GETMET R3 R0 K1 - 0x5C140200, // 0002 MOVE R5 R1 - 0x7C0C0400, // 0003 CALL R3 2 - 0xB8120400, // 0004 GETNGBL R4 K2 - 0x8C100903, // 0005 GETMET R4 R4 K3 - 0x60180008, // 0006 GETGBL R6 G8 - 0x5C1C0600, // 0007 MOVE R7 R3 - 0x7C180200, // 0008 CALL R6 1 - 0x001A0806, // 0009 ADD R6 K4 R6 - 0x581C0005, // 000A LDCONST R7 K5 - 0x7C100600, // 000B CALL R4 3 - 0x88100106, // 000C GETMBR R4 R0 K6 - 0x8C100907, // 000D GETMET R4 R4 K7 - 0xB81A1000, // 000E GETNGBL R6 K8 - 0x8C180D09, // 000F GETMET R6 R6 K9 - 0x5C200000, // 0010 MOVE R8 R0 - 0x5824000A, // 0011 LDCONST R9 K10 - 0x60280013, // 0012 GETGBL R10 G19 - 0x7C280000, // 0013 CALL R10 0 - 0x7C180800, // 0014 CALL R6 4 - 0x7C100400, // 0015 CALL R4 2 - 0xB8120400, // 0016 GETNGBL R4 K2 - 0x8C100903, // 0017 GETMET R4 R4 K3 - 0x8C18050B, // 0018 GETMET R6 R2 K11 - 0x5820000C, // 0019 LDCONST R8 K12 - 0x5824000A, // 001A LDCONST R9 K10 - 0x5828000D, // 001B LDCONST R10 K13 - 0x582C000E, // 001C LDCONST R11 K14 - 0x7C180A00, // 001D CALL R6 5 - 0x581C000F, // 001E LDCONST R7 K15 - 0x7C100600, // 001F CALL R4 3 - 0x88100106, // 0020 GETMBR R4 R0 K6 - 0x8C100907, // 0021 GETMET R4 R4 K7 - 0xB81A1000, // 0022 GETNGBL R6 K8 - 0x8C180D10, // 0023 GETMET R6 R6 K16 - 0x5C200000, // 0024 MOVE R8 R0 - 0x5426FEFF, // 0025 LDINT R9 65280 - 0x60280013, // 0026 GETGBL R10 G19 - 0x7C280000, // 0027 CALL R10 0 - 0x7C180800, // 0028 CALL R6 4 - 0x7C100400, // 0029 CALL R4 2 - 0xB8120400, // 002A GETNGBL R4 K2 - 0x8C100903, // 002B GETMET R4 R4 K3 - 0x8C18050B, // 002C GETMET R6 R2 K11 - 0x5820000C, // 002D LDCONST R8 K12 - 0x5426FEFF, // 002E LDINT R9 65280 - 0x58280011, // 002F LDCONST R10 K17 - 0x582C000E, // 0030 LDCONST R11 K14 - 0x7C180A00, // 0031 CALL R6 5 - 0x581C000F, // 0032 LDCONST R7 K15 - 0x7C100600, // 0033 CALL R4 3 - 0x60100010, // 0034 GETGBL R4 G16 - 0x5C140600, // 0035 MOVE R5 R3 - 0x7C100200, // 0036 CALL R4 1 - 0xA8020077, // 0037 EXBLK 0 #00B0 - 0x5C140800, // 0038 MOVE R5 R4 - 0x7C140000, // 0039 CALL R5 0 - 0x1C180B0A, // 003A EQ R6 R5 K10 - 0x781A0000, // 003B JMPF R6 #003D - 0x7001FFFA, // 003C JMP #0038 - 0xA802005F, // 003D EXBLK 0 #009E - 0x60180008, // 003E GETGBL R6 G8 - 0x5C1C0A00, // 003F MOVE R7 R5 - 0x7C180200, // 0040 CALL R6 1 - 0x94180206, // 0041 GETIDX R6 R1 R6 - 0xB81E0400, // 0042 GETNGBL R7 K2 - 0x8C1C0F03, // 0043 GETMET R7 R7 K3 - 0x8C24050B, // 0044 GETMET R9 R2 K11 - 0x582C0012, // 0045 LDCONST R11 K18 - 0x5C300A00, // 0046 MOVE R12 R5 - 0x5C340C00, // 0047 MOVE R13 R6 - 0x7C240800, // 0048 CALL R9 4 - 0x58280005, // 0049 LDCONST R10 K5 - 0x7C1C0600, // 004A CALL R7 3 - 0x8C1C0D13, // 004B GETMET R7 R6 K19 - 0x58240014, // 004C LDCONST R9 K20 - 0x7C1C0400, // 004D CALL R7 2 - 0x4C200000, // 004E LDNIL R8 - 0x1C200E08, // 004F EQ R8 R7 R8 - 0x78220006, // 0050 JMPF R8 #0058 - 0xB8220400, // 0051 GETNGBL R8 K2 - 0x8C201103, // 0052 GETMET R8 R8 K3 - 0x58280015, // 0053 LDCONST R10 K21 - 0x582C0005, // 0054 LDCONST R11 K5 - 0x7C200600, // 0055 CALL R8 3 - 0xA8040001, // 0056 EXBLK 1 1 - 0x7001FFDF, // 0057 JMP #0038 - 0x1C200F0D, // 0058 EQ R8 R7 K13 - 0x78220006, // 0059 JMPF R8 #0061 - 0xB8220400, // 005A GETNGBL R8 K2 - 0x8C201103, // 005B GETMET R8 R8 K3 - 0x58280016, // 005C LDCONST R10 K22 - 0x582C0005, // 005D LDCONST R11 K5 - 0x7C200600, // 005E CALL R8 3 - 0xA8040001, // 005F EXBLK 1 1 - 0x7001FFD6, // 0060 JMP #0038 - 0x88200117, // 0061 GETMBR R8 R0 K23 - 0x8C201113, // 0062 GETMET R8 R8 K19 - 0x5C280E00, // 0063 MOVE R10 R7 - 0x7C200400, // 0064 CALL R8 2 - 0x4C240000, // 0065 LDNIL R9 - 0x1C241009, // 0066 EQ R9 R8 R9 - 0x7826000A, // 0067 JMPF R9 #0073 - 0xB8260400, // 0068 GETNGBL R9 K2 - 0x8C241303, // 0069 GETMET R9 R9 K3 - 0x602C0008, // 006A GETGBL R11 G8 - 0x5C300E00, // 006B MOVE R12 R7 - 0x7C2C0200, // 006C CALL R11 1 - 0x002E300B, // 006D ADD R11 K24 R11 - 0x002C1719, // 006E ADD R11 R11 K25 - 0x5830000F, // 006F LDCONST R12 K15 - 0x7C240600, // 0070 CALL R9 3 - 0xA8040001, // 0071 EXBLK 1 1 - 0x7001FFC4, // 0072 JMP #0038 - 0x5C241000, // 0073 MOVE R9 R8 - 0x5C280000, // 0074 MOVE R10 R0 - 0x5C2C0A00, // 0075 MOVE R11 R5 - 0x5C300C00, // 0076 MOVE R12 R6 - 0x7C240600, // 0077 CALL R9 3 - 0x88280106, // 0078 GETMBR R10 R0 K6 - 0x8C281507, // 0079 GETMET R10 R10 K7 - 0x5C301200, // 007A MOVE R12 R9 - 0x7C280400, // 007B CALL R10 2 - 0x5828000E, // 007C LDCONST R10 K14 - 0x602C0010, // 007D GETGBL R11 G16 - 0x8C30011A, // 007E GETMET R12 R0 K26 - 0x5C380C00, // 007F MOVE R14 R6 - 0x7C300400, // 0080 CALL R12 2 - 0x7C2C0200, // 0081 CALL R11 1 - 0xA802000B, // 0082 EXBLK 0 #008F - 0x5C301600, // 0083 MOVE R12 R11 - 0x7C300000, // 0084 CALL R12 0 - 0x1C341914, // 0085 EQ R13 R12 K20 - 0x78360000, // 0086 JMPF R13 #0088 - 0x7001FFFA, // 0087 JMP #0083 - 0x8C34050B, // 0088 GETMET R13 R2 K11 - 0x583C001B, // 0089 LDCONST R15 K27 - 0x5C401800, // 008A MOVE R16 R12 - 0x94440C0C, // 008B GETIDX R17 R6 R12 - 0x7C340800, // 008C CALL R13 4 - 0x0028140D, // 008D ADD R10 R10 R13 - 0x7001FFF3, // 008E JMP #0083 - 0x582C001C, // 008F LDCONST R11 K28 - 0xAC2C0200, // 0090 CATCH R11 1 0 - 0xB0080000, // 0091 RAISE 2 R0 R0 - 0xB82E0400, // 0092 GETNGBL R11 K2 - 0x8C2C1703, // 0093 GETMET R11 R11 K3 - 0x8C34050B, // 0094 GETMET R13 R2 K11 - 0x583C000C, // 0095 LDCONST R15 K12 - 0x5C400A00, // 0096 MOVE R16 R5 - 0x5C440E00, // 0097 MOVE R17 R7 - 0x5C481400, // 0098 MOVE R18 R10 - 0x7C340A00, // 0099 CALL R13 5 - 0x5838000F, // 009A LDCONST R14 K15 - 0x7C2C0600, // 009B CALL R11 3 - 0xA8040001, // 009C EXBLK 1 1 - 0x70020010, // 009D JMP #00AF - 0xAC180002, // 009E CATCH R6 0 2 - 0x7002000D, // 009F JMP #00AE - 0xB8220400, // 00A0 GETNGBL R8 K2 - 0x8C201103, // 00A1 GETMET R8 R8 K3 - 0x60280008, // 00A2 GETGBL R10 G8 - 0x5C2C0C00, // 00A3 MOVE R11 R6 - 0x7C280200, // 00A4 CALL R10 1 - 0x002A3A0A, // 00A5 ADD R10 K29 R10 - 0x0028151E, // 00A6 ADD R10 R10 K30 - 0x602C0008, // 00A7 GETGBL R11 G8 - 0x5C300E00, // 00A8 MOVE R12 R7 - 0x7C2C0200, // 00A9 CALL R11 1 - 0x0028140B, // 00AA ADD R10 R10 R11 - 0x582C000F, // 00AB LDCONST R11 K15 - 0x7C200600, // 00AC CALL R8 3 - 0x70020000, // 00AD JMP #00AF - 0xB0080000, // 00AE RAISE 2 R0 R0 - 0x7001FF87, // 00AF JMP #0038 - 0x5810001C, // 00B0 LDCONST R4 K28 - 0xAC100200, // 00B1 CATCH R4 1 0 - 0xB0080000, // 00B2 RAISE 2 R0 R0 - 0xB8120400, // 00B3 GETNGBL R4 K2 - 0x8C10091F, // 00B4 GETMET R4 R4 K31 - 0x58180020, // 00B5 LDCONST R6 K32 - 0x581C0021, // 00B6 LDCONST R7 K33 - 0x7C100600, // 00B7 CALL R4 3 - 0x80000000, // 00B8 RET 0 + ( &(const binstruction[ 8]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x8C040301, // 0001 GETMET R1 R1 K1 + 0x7C040200, // 0002 CALL R1 1 + 0x1C040302, // 0003 EQ R1 R1 K2 + 0x78060001, // 0004 JMPF R1 #0007 + 0x8C040103, // 0005 GETMET R1 R0 K3 + 0x7C040200, // 0006 CALL R1 1 + 0x80000000, // 0007 RET 0 }) ) ); @@ -2254,119 +2897,6 @@ be_local_closure(Matter_Device__mdns_announce_hostname, /* name */ /*******************************************************************/ -/******************************************************************** -** Solidified function: _compute_pbkdf -********************************************************************/ -be_local_closure(Matter_Device__compute_pbkdf, /* name */ - be_nested_proto( - 14, /* nstack */ - 4, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[11]) { /* constants */ - /* K0 */ be_nested_str_weak(crypto), - /* K1 */ be_nested_str_weak(string), - /* K2 */ be_nested_str_weak(add), - /* K3 */ be_nested_str_weak(PBKDF2_HMAC_SHA256), - /* K4 */ be_nested_str_weak(derive), - /* K5 */ be_const_int(0), - /* K6 */ be_nested_str_weak(root_w0), - /* K7 */ be_nested_str_weak(EC_P256), - /* K8 */ be_nested_str_weak(mod), - /* K9 */ be_nested_str_weak(root_L), - /* K10 */ be_nested_str_weak(public_key), - }), - be_str_weak(_compute_pbkdf), - &be_const_str_solidified, - ( &(const binstruction[41]) { /* code */ - 0xA4120000, // 0000 IMPORT R4 K0 - 0xA4160200, // 0001 IMPORT R5 K1 - 0x60180015, // 0002 GETGBL R6 G21 - 0x7C180000, // 0003 CALL R6 0 - 0x8C180D02, // 0004 GETMET R6 R6 K2 - 0x5C200200, // 0005 MOVE R8 R1 - 0x54260003, // 0006 LDINT R9 4 - 0x7C180600, // 0007 CALL R6 3 - 0x8C1C0903, // 0008 GETMET R7 R4 K3 - 0x7C1C0200, // 0009 CALL R7 1 - 0x8C1C0F04, // 000A GETMET R7 R7 K4 - 0x5C240C00, // 000B MOVE R9 R6 - 0x5C280600, // 000C MOVE R10 R3 - 0x5C2C0400, // 000D MOVE R11 R2 - 0x5432004F, // 000E LDINT R12 80 - 0x7C1C0A00, // 000F CALL R7 5 - 0x54220026, // 0010 LDINT R8 39 - 0x40220A08, // 0011 CONNECT R8 K5 R8 - 0x94200E08, // 0012 GETIDX R8 R7 R8 - 0x54260027, // 0013 LDINT R9 40 - 0x542A004E, // 0014 LDINT R10 79 - 0x4024120A, // 0015 CONNECT R9 R9 R10 - 0x94240E09, // 0016 GETIDX R9 R7 R9 - 0x8C280907, // 0017 GETMET R10 R4 K7 - 0x7C280200, // 0018 CALL R10 1 - 0x8C281508, // 0019 GETMET R10 R10 K8 - 0x5C301000, // 001A MOVE R12 R8 - 0x7C280400, // 001B CALL R10 2 - 0x90020C0A, // 001C SETMBR R0 K6 R10 - 0x8C280907, // 001D GETMET R10 R4 K7 - 0x7C280200, // 001E CALL R10 1 - 0x8C281508, // 001F GETMET R10 R10 K8 - 0x5C301200, // 0020 MOVE R12 R9 - 0x7C280400, // 0021 CALL R10 2 - 0x8C2C0907, // 0022 GETMET R11 R4 K7 - 0x7C2C0200, // 0023 CALL R11 1 - 0x8C2C170A, // 0024 GETMET R11 R11 K10 - 0x5C341400, // 0025 MOVE R13 R10 - 0x7C2C0400, // 0026 CALL R11 2 - 0x9002120B, // 0027 SETMBR R0 K9 R11 - 0x80000000, // 0028 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: start_commissioning_complete -********************************************************************/ -be_local_closure(Matter_Device_start_commissioning_complete, /* name */ - be_nested_proto( - 6, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 5]) { /* constants */ - /* K0 */ be_nested_str_weak(tasmota), - /* K1 */ be_nested_str_weak(log), - /* K2 */ be_nested_str_weak(MTR_X3A_X20_X2A_X2A_X2A_X20Commissioning_X20complete_X20_X2A_X2A_X2A), - /* K3 */ be_const_int(2), - /* K4 */ be_nested_str_weak(stop_basic_commissioning), - }), - be_str_weak(start_commissioning_complete), - &be_const_str_solidified, - ( &(const binstruction[ 8]) { /* code */ - 0xB80A0000, // 0000 GETNGBL R2 K0 - 0x8C080501, // 0001 GETMET R2 R2 K1 - 0x58100002, // 0002 LDCONST R4 K2 - 0x58140003, // 0003 LDCONST R5 K3 - 0x7C080600, // 0004 CALL R2 3 - 0x8C080104, // 0005 GETMET R2 R0 K4 - 0x7C080200, // 0006 CALL R2 1 - 0x80000000, // 0007 RET 0 - }) - ) -); -/*******************************************************************/ - - /******************************************************************** ** Solidified function: register_native_classes ********************************************************************/ @@ -2452,11 +2982,11 @@ be_local_closure(Matter_Device_register_native_classes, /* name */ /******************************************************************** -** Solidified function: save_before_restart +** Solidified function: every_50ms ********************************************************************/ -be_local_closure(Matter_Device_save_before_restart, /* name */ +be_local_closure(Matter_Device_every_50ms, /* name */ be_nested_proto( - 3, /* nstack */ + 2, /* nstack */ 1, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -2465,17 +2995,16 @@ be_local_closure(Matter_Device_save_before_restart, /* name */ NULL, /* no sub protos */ 1, /* has constants */ ( &(const bvalue[ 2]) { /* constants */ - /* K0 */ be_nested_str_weak(stop_basic_commissioning), - /* K1 */ be_nested_str_weak(mdns_remove_op_discovery_all_fabrics), + /* K0 */ be_nested_str_weak(tick), + /* K1 */ be_const_int(1), }), - be_str_weak(save_before_restart), + be_str_weak(every_50ms), &be_const_str_solidified, - ( &(const binstruction[ 5]) { /* code */ - 0x8C040100, // 0000 GETMET R1 R0 K0 - 0x7C040200, // 0001 CALL R1 1 - 0x8C040101, // 0002 GETMET R1 R0 K1 - 0x7C040200, // 0003 CALL R1 1 - 0x80000000, // 0004 RET 0 + ( &(const binstruction[ 4]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x00040301, // 0001 ADD R1 R1 K1 + 0x90020001, // 0002 SETMBR R0 K0 R1 + 0x80000000, // 0003 RET 0 }) ) ); @@ -2483,111 +3012,12 @@ be_local_closure(Matter_Device_save_before_restart, /* name */ /******************************************************************** -** Solidified function: register_http_remote +** Solidified function: start_basic_commissioning ********************************************************************/ -be_local_closure(Matter_Device_register_http_remote, /* name */ +be_local_closure(Matter_Device_start_basic_commissioning, /* name */ be_nested_proto( - 8, /* nstack */ - 3, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 6]) { /* constants */ - /* K0 */ be_nested_str_weak(http_remotes), - /* K1 */ be_nested_str_weak(contains), - /* K2 */ be_nested_str_weak(get_timeout), - /* K3 */ be_nested_str_weak(set_timeout), - /* K4 */ be_nested_str_weak(matter), - /* K5 */ be_nested_str_weak(HTTP_remote), - }), - be_str_weak(register_http_remote), - &be_const_str_solidified, - ( &(const binstruction[32]) { /* code */ - 0x880C0100, // 0000 GETMBR R3 R0 K0 - 0x4C100000, // 0001 LDNIL R4 - 0x1C0C0604, // 0002 EQ R3 R3 R4 - 0x780E0002, // 0003 JMPF R3 #0007 - 0x600C0013, // 0004 GETGBL R3 G19 - 0x7C0C0000, // 0005 CALL R3 0 - 0x90020003, // 0006 SETMBR R0 K0 R3 - 0x4C0C0000, // 0007 LDNIL R3 - 0x88100100, // 0008 GETMBR R4 R0 K0 - 0x8C100901, // 0009 GETMET R4 R4 K1 - 0x5C180200, // 000A MOVE R6 R1 - 0x7C100400, // 000B CALL R4 2 - 0x78120009, // 000C JMPF R4 #0017 - 0x88100100, // 000D GETMBR R4 R0 K0 - 0x940C0801, // 000E GETIDX R3 R4 R1 - 0x8C140702, // 000F GETMET R5 R3 K2 - 0x7C140200, // 0010 CALL R5 1 - 0x14140405, // 0011 LT R5 R2 R5 - 0x78160002, // 0012 JMPF R5 #0016 - 0x8C140703, // 0013 GETMET R5 R3 K3 - 0x5C1C0400, // 0014 MOVE R7 R2 - 0x7C140400, // 0015 CALL R5 2 - 0x70020007, // 0016 JMP #001F - 0xB8120800, // 0017 GETNGBL R4 K4 - 0x8C100905, // 0018 GETMET R4 R4 K5 - 0x5C180200, // 0019 MOVE R6 R1 - 0x5C1C0400, // 001A MOVE R7 R2 - 0x7C100600, // 001B CALL R4 3 - 0x5C0C0800, // 001C MOVE R3 R4 - 0x88100100, // 001D GETMBR R4 R0 K0 - 0x98100203, // 001E SETIDX R4 R1 R3 - 0x80040600, // 001F RET 1 R3 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: get_plugin_class_arg -********************************************************************/ -be_local_closure(Matter_Device_get_plugin_class_arg, /* name */ - be_nested_proto( - 5, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 4]) { /* constants */ - /* K0 */ be_nested_str_weak(plugins_classes), - /* K1 */ be_nested_str_weak(find), - /* K2 */ be_nested_str_weak(ARG), - /* K3 */ be_nested_str_weak(), - }), - be_str_weak(get_plugin_class_arg), - &be_const_str_solidified, - ( &(const binstruction[ 9]) { /* code */ - 0x88080100, // 0000 GETMBR R2 R0 K0 - 0x8C080501, // 0001 GETMET R2 R2 K1 - 0x5C100200, // 0002 MOVE R4 R1 - 0x7C080400, // 0003 CALL R2 2 - 0x780A0001, // 0004 JMPF R2 #0007 - 0x880C0502, // 0005 GETMBR R3 R2 K2 - 0x70020000, // 0006 JMP #0008 - 0x580C0003, // 0007 LDCONST R3 K3 - 0x80040600, // 0008 RET 1 R3 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: init -********************************************************************/ -be_local_closure(Matter_Device_init, /* name */ - be_nested_proto( - 8, /* nstack */ - 1, /* argc */ + 13, /* nstack */ + 8, /* argc */ 2, /* varg */ 0, /* has upvals */ NULL, /* no upvals */ @@ -2604,12 +3034,11 @@ be_local_closure(Matter_Device_init, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[ 5]) { /* constants */ - /* K0 */ be_nested_str_weak(start), + ( &(const bvalue[ 4]) { /* constants */ + /* K0 */ be_nested_str_weak(mdns_announce_PASE), /* K1 */ be_nested_str_weak(tasmota), /* K2 */ be_nested_str_weak(remove_rule), /* K3 */ be_nested_str_weak(Wifi_X23Connected), - /* K4 */ be_nested_str_weak(matter_start), }), be_str_weak(_anonymous_), &be_const_str_solidified, @@ -2620,7 +3049,7 @@ be_local_closure(Matter_Device_init, /* name */ 0xB8020200, // 0003 GETNGBL R0 K1 0x8C000102, // 0004 GETMET R0 R0 K2 0x58080003, // 0005 LDCONST R2 K3 - 0x580C0004, // 0006 LDCONST R3 K4 + 0x580C0000, // 0006 LDCONST R3 K0 0x7C000600, // 0007 CALL R0 3 0x80000000, // 0008 RET 0 }) @@ -2636,12 +3065,11 @@ be_local_closure(Matter_Device_init, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[ 5]) { /* constants */ - /* K0 */ be_nested_str_weak(start), + ( &(const bvalue[ 4]) { /* constants */ + /* K0 */ be_nested_str_weak(mdns_announce_PASE), /* K1 */ be_nested_str_weak(tasmota), /* K2 */ be_nested_str_weak(remove_rule), /* K3 */ be_nested_str_weak(Eth_X23Connected), - /* K4 */ be_nested_str_weak(matter_start), }), be_str_weak(_anonymous_), &be_const_str_solidified, @@ -2652,164 +3080,74 @@ be_local_closure(Matter_Device_init, /* name */ 0xB8020200, // 0003 GETNGBL R0 K1 0x8C000102, // 0004 GETMET R0 R0 K2 0x58080003, // 0005 LDCONST R2 K3 - 0x580C0004, // 0006 LDCONST R3 K4 + 0x580C0000, // 0006 LDCONST R3 K0 0x7C000600, // 0007 CALL R0 3 0x80000000, // 0008 RET 0 }) ), }), 1, /* has constants */ - ( &(const bvalue[42]) { /* constants */ - /* K0 */ be_nested_str_weak(crypto), - /* K1 */ be_nested_str_weak(string), - /* K2 */ be_nested_str_weak(tasmota), - /* K3 */ be_nested_str_weak(get_option), - /* K4 */ be_nested_str_weak(matter), - /* K5 */ be_nested_str_weak(MATTER_OPTION), - /* K6 */ be_nested_str_weak(UI), - /* K7 */ be_nested_str_weak(started), - /* K8 */ be_nested_str_weak(tick), - /* K9 */ be_const_int(0), - /* K10 */ be_nested_str_weak(plugins), - /* K11 */ be_nested_str_weak(plugins_persist), - /* K12 */ be_nested_str_weak(plugins_classes), - /* K13 */ be_nested_str_weak(register_native_classes), - /* K14 */ be_nested_str_weak(vendorid), - /* K15 */ be_nested_str_weak(VENDOR_ID), - /* K16 */ be_nested_str_weak(productid), - /* K17 */ be_nested_str_weak(PRODUCT_ID), - /* K18 */ be_nested_str_weak(root_iterations), - /* K19 */ be_nested_str_weak(PBKDF_ITERATIONS), - /* K20 */ be_nested_str_weak(next_ep), - /* K21 */ be_nested_str_weak(root_salt), - /* K22 */ be_nested_str_weak(random), - /* K23 */ be_nested_str_weak(ipv4only), - /* K24 */ be_nested_str_weak(load_param), - /* K25 */ be_nested_str_weak(sessions), - /* K26 */ be_nested_str_weak(Session_Store), - /* K27 */ be_nested_str_weak(load_fabrics), - /* K28 */ be_nested_str_weak(message_handler), - /* K29 */ be_nested_str_weak(MessageHandler), - /* K30 */ be_nested_str_weak(ui), - /* K31 */ be_nested_str_weak(wifi), - /* K32 */ be_nested_str_weak(up), - /* K33 */ be_nested_str_weak(eth), - /* K34 */ be_nested_str_weak(start), - /* K35 */ be_nested_str_weak(add_rule), - /* K36 */ be_nested_str_weak(Wifi_X23Connected), - /* K37 */ be_nested_str_weak(matter_start), - /* K38 */ be_nested_str_weak(Eth_X23Connected), - /* K39 */ be_nested_str_weak(_init_basic_commissioning), - /* K40 */ be_nested_str_weak(add_driver), - /* K41 */ be_nested_str_weak(register_commands), + ( &(const bvalue[16]) { /* constants */ + /* K0 */ be_nested_str_weak(commissioning_open), + /* K1 */ be_nested_str_weak(tasmota), + /* K2 */ be_nested_str_weak(millis), + /* K3 */ be_nested_str_weak(commissioning_iterations), + /* K4 */ be_nested_str_weak(commissioning_discriminator), + /* K5 */ be_nested_str_weak(commissioning_salt), + /* K6 */ be_nested_str_weak(commissioning_w0), + /* K7 */ be_nested_str_weak(commissioning_L), + /* K8 */ be_nested_str_weak(commissioning_admin_fabric), + /* K9 */ be_nested_str_weak(wifi), + /* K10 */ be_nested_str_weak(up), + /* K11 */ be_nested_str_weak(eth), + /* K12 */ be_nested_str_weak(mdns_announce_PASE), + /* K13 */ be_nested_str_weak(add_rule), + /* K14 */ be_nested_str_weak(Wifi_X23Connected), + /* K15 */ be_nested_str_weak(Eth_X23Connected), }), - be_str_weak(init), + be_str_weak(start_basic_commissioning), &be_const_str_solidified, - ( &(const binstruction[104]) { /* code */ - 0xA4060000, // 0000 IMPORT R1 K0 - 0xA40A0200, // 0001 IMPORT R2 K1 - 0xB80E0400, // 0002 GETNGBL R3 K2 - 0x8C0C0703, // 0003 GETMET R3 R3 K3 - 0xB8160800, // 0004 GETNGBL R5 K4 - 0x88140B05, // 0005 GETMBR R5 R5 K5 - 0x7C0C0400, // 0006 CALL R3 2 - 0x740E0004, // 0007 JMPT R3 #000D - 0xB80E0800, // 0008 GETNGBL R3 K4 - 0x8C0C0706, // 0009 GETMET R3 R3 K6 - 0x5C140000, // 000A MOVE R5 R0 - 0x7C0C0400, // 000B CALL R3 2 - 0x80000600, // 000C RET 0 - 0x500C0000, // 000D LDBOOL R3 0 0 - 0x90020E03, // 000E SETMBR R0 K7 R3 - 0x90021109, // 000F SETMBR R0 K8 K9 - 0x600C0012, // 0010 GETGBL R3 G18 - 0x7C0C0000, // 0011 CALL R3 0 - 0x90021403, // 0012 SETMBR R0 K10 R3 - 0x500C0000, // 0013 LDBOOL R3 0 0 - 0x90021603, // 0014 SETMBR R0 K11 R3 - 0x600C0013, // 0015 GETGBL R3 G19 - 0x7C0C0000, // 0016 CALL R3 0 - 0x90021803, // 0017 SETMBR R0 K12 R3 - 0x8C0C010D, // 0018 GETMET R3 R0 K13 - 0x7C0C0200, // 0019 CALL R3 1 - 0x880C010F, // 001A GETMBR R3 R0 K15 - 0x90021C03, // 001B SETMBR R0 K14 R3 - 0x880C0111, // 001C GETMBR R3 R0 K17 - 0x90022003, // 001D SETMBR R0 K16 R3 - 0x880C0113, // 001E GETMBR R3 R0 K19 - 0x90022403, // 001F SETMBR R0 K18 R3 - 0x540E0032, // 0020 LDINT R3 51 - 0x90022803, // 0021 SETMBR R0 K20 R3 - 0x8C0C0316, // 0022 GETMET R3 R1 K22 - 0x5416000F, // 0023 LDINT R5 16 - 0x7C0C0400, // 0024 CALL R3 2 - 0x90022A03, // 0025 SETMBR R0 K21 R3 - 0x500C0000, // 0026 LDBOOL R3 0 0 - 0x90022E03, // 0027 SETMBR R0 K23 R3 - 0x8C0C0118, // 0028 GETMET R3 R0 K24 - 0x7C0C0200, // 0029 CALL R3 1 - 0xB80E0800, // 002A GETNGBL R3 K4 - 0x8C0C071A, // 002B GETMET R3 R3 K26 - 0x5C140000, // 002C MOVE R5 R0 - 0x7C0C0400, // 002D CALL R3 2 - 0x90023203, // 002E SETMBR R0 K25 R3 - 0x880C0119, // 002F GETMBR R3 R0 K25 - 0x8C0C071B, // 0030 GETMET R3 R3 K27 - 0x7C0C0200, // 0031 CALL R3 1 - 0xB80E0800, // 0032 GETNGBL R3 K4 - 0x8C0C071D, // 0033 GETMET R3 R3 K29 - 0x5C140000, // 0034 MOVE R5 R0 - 0x7C0C0400, // 0035 CALL R3 2 - 0x90023803, // 0036 SETMBR R0 K28 R3 - 0xB80E0800, // 0037 GETNGBL R3 K4 - 0x8C0C0706, // 0038 GETMET R3 R3 K6 - 0x5C140000, // 0039 MOVE R5 R0 - 0x7C0C0400, // 003A CALL R3 2 - 0x90023C03, // 003B SETMBR R0 K30 R3 - 0xB80E0400, // 003C GETNGBL R3 K2 - 0x8C0C071F, // 003D GETMET R3 R3 K31 - 0x7C0C0200, // 003E CALL R3 1 - 0x940C0720, // 003F GETIDX R3 R3 K32 - 0x740E0004, // 0040 JMPT R3 #0046 - 0xB80E0400, // 0041 GETNGBL R3 K2 - 0x8C0C0721, // 0042 GETMET R3 R3 K33 - 0x7C0C0200, // 0043 CALL R3 1 - 0x940C0720, // 0044 GETIDX R3 R3 K32 - 0x780E0001, // 0045 JMPF R3 #0048 - 0x8C0C0122, // 0046 GETMET R3 R0 K34 - 0x7C0C0200, // 0047 CALL R3 1 - 0xB80E0400, // 0048 GETNGBL R3 K2 - 0x8C0C071F, // 0049 GETMET R3 R3 K31 - 0x7C0C0200, // 004A CALL R3 1 - 0x940C0720, // 004B GETIDX R3 R3 K32 - 0x740E0005, // 004C JMPT R3 #0053 - 0xB80E0400, // 004D GETNGBL R3 K2 - 0x8C0C0723, // 004E GETMET R3 R3 K35 - 0x58140024, // 004F LDCONST R5 K36 - 0x84180000, // 0050 CLOSURE R6 P0 - 0x581C0025, // 0051 LDCONST R7 K37 - 0x7C0C0800, // 0052 CALL R3 4 - 0xB80E0400, // 0053 GETNGBL R3 K2 - 0x8C0C0721, // 0054 GETMET R3 R3 K33 - 0x7C0C0200, // 0055 CALL R3 1 - 0x940C0720, // 0056 GETIDX R3 R3 K32 - 0x740E0005, // 0057 JMPT R3 #005E - 0xB80E0400, // 0058 GETNGBL R3 K2 - 0x8C0C0723, // 0059 GETMET R3 R3 K35 - 0x58140026, // 005A LDCONST R5 K38 - 0x84180001, // 005B CLOSURE R6 P1 - 0x581C0025, // 005C LDCONST R7 K37 - 0x7C0C0800, // 005D CALL R3 4 - 0x8C0C0127, // 005E GETMET R3 R0 K39 - 0x7C0C0200, // 005F CALL R3 1 - 0xB80E0400, // 0060 GETNGBL R3 K2 - 0x8C0C0728, // 0061 GETMET R3 R3 K40 - 0x5C140000, // 0062 MOVE R5 R0 - 0x7C0C0400, // 0063 CALL R3 2 - 0x8C0C0129, // 0064 GETMET R3 R0 K41 - 0x7C0C0200, // 0065 CALL R3 1 - 0xA0000000, // 0066 CLOSE R0 - 0x80000000, // 0067 RET 0 + ( &(const binstruction[40]) { /* code */ + 0xB8220200, // 0000 GETNGBL R8 K1 + 0x8C201102, // 0001 GETMET R8 R8 K2 + 0x7C200200, // 0002 CALL R8 1 + 0x542603E7, // 0003 LDINT R9 1000 + 0x08240209, // 0004 MUL R9 R1 R9 + 0x00201009, // 0005 ADD R8 R8 R9 + 0x90020008, // 0006 SETMBR R0 K0 R8 + 0x90020602, // 0007 SETMBR R0 K3 R2 + 0x90020803, // 0008 SETMBR R0 K4 R3 + 0x90020A04, // 0009 SETMBR R0 K5 R4 + 0x90020C05, // 000A SETMBR R0 K6 R5 + 0x90020E06, // 000B SETMBR R0 K7 R6 + 0x90021007, // 000C SETMBR R0 K8 R7 + 0xB8220200, // 000D GETNGBL R8 K1 + 0x8C201109, // 000E GETMET R8 R8 K9 + 0x7C200200, // 000F CALL R8 1 + 0x9420110A, // 0010 GETIDX R8 R8 K10 + 0x74220004, // 0011 JMPT R8 #0017 + 0xB8220200, // 0012 GETNGBL R8 K1 + 0x8C20110B, // 0013 GETMET R8 R8 K11 + 0x7C200200, // 0014 CALL R8 1 + 0x9420110A, // 0015 GETIDX R8 R8 K10 + 0x78220002, // 0016 JMPF R8 #001A + 0x8C20010C, // 0017 GETMET R8 R0 K12 + 0x7C200200, // 0018 CALL R8 1 + 0x7002000B, // 0019 JMP #0026 + 0xB8220200, // 001A GETNGBL R8 K1 + 0x8C20110D, // 001B GETMET R8 R8 K13 + 0x5828000E, // 001C LDCONST R10 K14 + 0x842C0000, // 001D CLOSURE R11 P0 + 0x5830000C, // 001E LDCONST R12 K12 + 0x7C200800, // 001F CALL R8 4 + 0xB8220200, // 0020 GETNGBL R8 K1 + 0x8C20110D, // 0021 GETMET R8 R8 K13 + 0x5828000F, // 0022 LDCONST R10 K15 + 0x842C0001, // 0023 CLOSURE R11 P1 + 0x5830000C, // 0024 LDCONST R12 K12 + 0x7C200800, // 0025 CALL R8 4 + 0xA0000000, // 0026 CLOSE R0 + 0x80000000, // 0027 RET 0 }) ) ); @@ -2817,128 +3155,236 @@ be_local_closure(Matter_Device_init, /* name */ /******************************************************************** -** Solidified function: mdns_remove_PASE +** Solidified function: _compute_pbkdf ********************************************************************/ -be_local_closure(Matter_Device_mdns_remove_PASE, /* name */ +be_local_closure(Matter_Device__compute_pbkdf, /* name */ be_nested_proto( - 12, /* nstack */ - 1, /* argc */ + 14, /* nstack */ + 4, /* argc */ 2, /* varg */ 0, /* has upvals */ NULL, /* no upvals */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[22]) { /* constants */ - /* K0 */ be_nested_str_weak(mdns), + ( &(const bvalue[11]) { /* constants */ + /* K0 */ be_nested_str_weak(crypto), /* K1 */ be_nested_str_weak(string), - /* K2 */ be_nested_str_weak(mdns_pase_eth), - /* K3 */ be_nested_str_weak(tasmota), - /* K4 */ be_nested_str_weak(log), - /* K5 */ be_nested_str_weak(format), - /* K6 */ be_nested_str_weak(MTR_X3A_X20calling_X20mdns_X2Eremove_service_X28_X25s_X2C_X20_X25s_X2C_X20_X25s_X2C_X20_X25s_X29), - /* K7 */ be_nested_str_weak(_matterc), - /* K8 */ be_nested_str_weak(_udp), - /* K9 */ be_nested_str_weak(commissioning_instance_eth), - /* K10 */ be_nested_str_weak(hostname_eth), - /* K11 */ be_const_int(3), - /* K12 */ be_nested_str_weak(MTR_X3A_X20remove_X20mDNS_X20on_X20_X25s_X20_X27_X25s_X27), - /* K13 */ be_nested_str_weak(eth), - /* K14 */ be_const_int(2), - /* K15 */ be_nested_str_weak(remove_service), - /* K16 */ be_nested_str_weak(mdns_pase_wifi), - /* K17 */ be_nested_str_weak(commissioning_instance_wifi), - /* K18 */ be_nested_str_weak(hostname_wifi), - /* K19 */ be_nested_str_weak(wifi), - /* K20 */ be_nested_str_weak(MTR_X3A_X20Exception), - /* K21 */ be_nested_str_weak(_X7C), + /* K2 */ be_nested_str_weak(add), + /* K3 */ be_nested_str_weak(PBKDF2_HMAC_SHA256), + /* K4 */ be_nested_str_weak(derive), + /* K5 */ be_const_int(0), + /* K6 */ be_nested_str_weak(root_w0), + /* K7 */ be_nested_str_weak(EC_P256), + /* K8 */ be_nested_str_weak(mod), + /* K9 */ be_nested_str_weak(root_L), + /* K10 */ be_nested_str_weak(public_key), }), - be_str_weak(mdns_remove_PASE), + be_str_weak(_compute_pbkdf), &be_const_str_solidified, - ( &(const binstruction[83]) { /* code */ - 0xA4060000, // 0000 IMPORT R1 K0 - 0xA40A0200, // 0001 IMPORT R2 K1 - 0xA802003D, // 0002 EXBLK 0 #0041 - 0x880C0102, // 0003 GETMBR R3 R0 K2 - 0x780E001B, // 0004 JMPF R3 #0021 - 0xB80E0600, // 0005 GETNGBL R3 K3 - 0x8C0C0704, // 0006 GETMET R3 R3 K4 - 0x8C140505, // 0007 GETMET R5 R2 K5 - 0x581C0006, // 0008 LDCONST R7 K6 - 0x58200007, // 0009 LDCONST R8 K7 - 0x58240008, // 000A LDCONST R9 K8 - 0x88280109, // 000B GETMBR R10 R0 K9 - 0x882C010A, // 000C GETMBR R11 R0 K10 - 0x7C140C00, // 000D CALL R5 6 - 0x5818000B, // 000E LDCONST R6 K11 - 0x7C0C0600, // 000F CALL R3 3 - 0xB80E0600, // 0010 GETNGBL R3 K3 - 0x8C0C0704, // 0011 GETMET R3 R3 K4 - 0x8C140505, // 0012 GETMET R5 R2 K5 - 0x581C000C, // 0013 LDCONST R7 K12 - 0x5820000D, // 0014 LDCONST R8 K13 - 0x88240109, // 0015 GETMBR R9 R0 K9 - 0x7C140800, // 0016 CALL R5 4 - 0x5818000E, // 0017 LDCONST R6 K14 - 0x7C0C0600, // 0018 CALL R3 3 - 0x500C0000, // 0019 LDBOOL R3 0 0 - 0x90020403, // 001A SETMBR R0 K2 R3 - 0x8C0C030F, // 001B GETMET R3 R1 K15 - 0x58140007, // 001C LDCONST R5 K7 - 0x58180008, // 001D LDCONST R6 K8 - 0x881C0109, // 001E GETMBR R7 R0 K9 - 0x8820010A, // 001F GETMBR R8 R0 K10 - 0x7C0C0A00, // 0020 CALL R3 5 - 0x880C0110, // 0021 GETMBR R3 R0 K16 - 0x780E001B, // 0022 JMPF R3 #003F - 0xB80E0600, // 0023 GETNGBL R3 K3 - 0x8C0C0704, // 0024 GETMET R3 R3 K4 - 0x8C140505, // 0025 GETMET R5 R2 K5 - 0x581C0006, // 0026 LDCONST R7 K6 - 0x58200007, // 0027 LDCONST R8 K7 - 0x58240008, // 0028 LDCONST R9 K8 - 0x88280111, // 0029 GETMBR R10 R0 K17 - 0x882C0112, // 002A GETMBR R11 R0 K18 - 0x7C140C00, // 002B CALL R5 6 - 0x5818000B, // 002C LDCONST R6 K11 - 0x7C0C0600, // 002D CALL R3 3 - 0xB80E0600, // 002E GETNGBL R3 K3 - 0x8C0C0704, // 002F GETMET R3 R3 K4 - 0x8C140505, // 0030 GETMET R5 R2 K5 - 0x581C000C, // 0031 LDCONST R7 K12 - 0x58200013, // 0032 LDCONST R8 K19 - 0x88240111, // 0033 GETMBR R9 R0 K17 - 0x7C140800, // 0034 CALL R5 4 - 0x5818000E, // 0035 LDCONST R6 K14 - 0x7C0C0600, // 0036 CALL R3 3 - 0x500C0000, // 0037 LDBOOL R3 0 0 - 0x90022003, // 0038 SETMBR R0 K16 R3 - 0x8C0C030F, // 0039 GETMET R3 R1 K15 - 0x58140007, // 003A LDCONST R5 K7 - 0x58180008, // 003B LDCONST R6 K8 - 0x881C0111, // 003C GETMBR R7 R0 K17 - 0x88200112, // 003D GETMBR R8 R0 K18 - 0x7C0C0A00, // 003E CALL R3 5 - 0xA8040001, // 003F EXBLK 1 1 - 0x70020010, // 0040 JMP #0052 - 0xAC0C0002, // 0041 CATCH R3 0 2 - 0x7002000D, // 0042 JMP #0051 - 0xB8160600, // 0043 GETNGBL R5 K3 - 0x8C140B04, // 0044 GETMET R5 R5 K4 - 0x601C0008, // 0045 GETGBL R7 G8 - 0x5C200600, // 0046 MOVE R8 R3 - 0x7C1C0200, // 0047 CALL R7 1 - 0x001E2807, // 0048 ADD R7 K20 R7 - 0x001C0F15, // 0049 ADD R7 R7 K21 - 0x60200008, // 004A GETGBL R8 G8 - 0x5C240800, // 004B MOVE R9 R4 - 0x7C200200, // 004C CALL R8 1 - 0x001C0E08, // 004D ADD R7 R7 R8 - 0x5820000E, // 004E LDCONST R8 K14 - 0x7C140600, // 004F CALL R5 3 - 0x70020000, // 0050 JMP #0052 - 0xB0080000, // 0051 RAISE 2 R0 R0 - 0x80000000, // 0052 RET 0 + ( &(const binstruction[41]) { /* code */ + 0xA4120000, // 0000 IMPORT R4 K0 + 0xA4160200, // 0001 IMPORT R5 K1 + 0x60180015, // 0002 GETGBL R6 G21 + 0x7C180000, // 0003 CALL R6 0 + 0x8C180D02, // 0004 GETMET R6 R6 K2 + 0x5C200200, // 0005 MOVE R8 R1 + 0x54260003, // 0006 LDINT R9 4 + 0x7C180600, // 0007 CALL R6 3 + 0x8C1C0903, // 0008 GETMET R7 R4 K3 + 0x7C1C0200, // 0009 CALL R7 1 + 0x8C1C0F04, // 000A GETMET R7 R7 K4 + 0x5C240C00, // 000B MOVE R9 R6 + 0x5C280600, // 000C MOVE R10 R3 + 0x5C2C0400, // 000D MOVE R11 R2 + 0x5432004F, // 000E LDINT R12 80 + 0x7C1C0A00, // 000F CALL R7 5 + 0x54220026, // 0010 LDINT R8 39 + 0x40220A08, // 0011 CONNECT R8 K5 R8 + 0x94200E08, // 0012 GETIDX R8 R7 R8 + 0x54260027, // 0013 LDINT R9 40 + 0x542A004E, // 0014 LDINT R10 79 + 0x4024120A, // 0015 CONNECT R9 R9 R10 + 0x94240E09, // 0016 GETIDX R9 R7 R9 + 0x8C280907, // 0017 GETMET R10 R4 K7 + 0x7C280200, // 0018 CALL R10 1 + 0x8C281508, // 0019 GETMET R10 R10 K8 + 0x5C301000, // 001A MOVE R12 R8 + 0x7C280400, // 001B CALL R10 2 + 0x90020C0A, // 001C SETMBR R0 K6 R10 + 0x8C280907, // 001D GETMET R10 R4 K7 + 0x7C280200, // 001E CALL R10 1 + 0x8C281508, // 001F GETMET R10 R10 K8 + 0x5C301200, // 0020 MOVE R12 R9 + 0x7C280400, // 0021 CALL R10 2 + 0x8C2C0907, // 0022 GETMET R11 R4 K7 + 0x7C2C0200, // 0023 CALL R11 1 + 0x8C2C170A, // 0024 GETMET R11 R11 K10 + 0x5C341400, // 0025 MOVE R13 R10 + 0x7C2C0400, // 0026 CALL R11 2 + 0x9002120B, // 0027 SETMBR R0 K9 R11 + 0x80000000, // 0028 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: autoconf_sensors_list +********************************************************************/ +be_local_closure(Matter_Device_autoconf_sensors_list, /* name */ + be_nested_proto( + 10, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[18]) { /* constants */ + /* K0 */ be_nested_str_weak(k2l), + /* K1 */ be_nested_str_weak(contains), + /* K2 */ be_nested_str_weak(Temperature), + /* K3 */ be_nested_str_weak(_X23Temperature), + /* K4 */ be_nested_str_weak(push), + /* K5 */ be_nested_str_weak(type), + /* K6 */ be_nested_str_weak(temperature), + /* K7 */ be_nested_str_weak(filter), + /* K8 */ be_nested_str_weak(stop_iteration), + /* K9 */ be_nested_str_weak(Pressure), + /* K10 */ be_nested_str_weak(_X23Pressure), + /* K11 */ be_nested_str_weak(pressure), + /* K12 */ be_nested_str_weak(Illuminance), + /* K13 */ be_nested_str_weak(_X23Illuminance), + /* K14 */ be_nested_str_weak(illuminance), + /* K15 */ be_nested_str_weak(Humidity), + /* K16 */ be_nested_str_weak(_X23Humidity), + /* K17 */ be_nested_str_weak(humidity), + }), + be_str_weak(autoconf_sensors_list), + &be_const_str_solidified, + ( &(const binstruction[119]) { /* code */ + 0x60080012, // 0000 GETGBL R2 G18 + 0x7C080000, // 0001 CALL R2 0 + 0x600C0010, // 0002 GETGBL R3 G16 + 0x8C100100, // 0003 GETMET R4 R0 K0 + 0x5C180200, // 0004 MOVE R6 R1 + 0x7C100400, // 0005 CALL R4 2 + 0x7C0C0200, // 0006 CALL R3 1 + 0xA8020013, // 0007 EXBLK 0 #001C + 0x5C100600, // 0008 MOVE R4 R3 + 0x7C100000, // 0009 CALL R4 0 + 0x94140204, // 000A GETIDX R5 R1 R4 + 0x6018000F, // 000B GETGBL R6 G15 + 0x5C1C0A00, // 000C MOVE R7 R5 + 0x60200013, // 000D GETGBL R8 G19 + 0x7C180400, // 000E CALL R6 2 + 0x781A000A, // 000F JMPF R6 #001B + 0x8C180B01, // 0010 GETMET R6 R5 K1 + 0x58200002, // 0011 LDCONST R8 K2 + 0x7C180400, // 0012 CALL R6 2 + 0x781A0006, // 0013 JMPF R6 #001B + 0x00180903, // 0014 ADD R6 R4 K3 + 0x8C1C0504, // 0015 GETMET R7 R2 K4 + 0x60240013, // 0016 GETGBL R9 G19 + 0x7C240000, // 0017 CALL R9 0 + 0x98260B06, // 0018 SETIDX R9 K5 K6 + 0x98260E06, // 0019 SETIDX R9 K7 R6 + 0x7C1C0400, // 001A CALL R7 2 + 0x7001FFEB, // 001B JMP #0008 + 0x580C0008, // 001C LDCONST R3 K8 + 0xAC0C0200, // 001D CATCH R3 1 0 + 0xB0080000, // 001E RAISE 2 R0 R0 + 0x600C0010, // 001F GETGBL R3 G16 + 0x8C100100, // 0020 GETMET R4 R0 K0 + 0x5C180200, // 0021 MOVE R6 R1 + 0x7C100400, // 0022 CALL R4 2 + 0x7C0C0200, // 0023 CALL R3 1 + 0xA8020013, // 0024 EXBLK 0 #0039 + 0x5C100600, // 0025 MOVE R4 R3 + 0x7C100000, // 0026 CALL R4 0 + 0x94140204, // 0027 GETIDX R5 R1 R4 + 0x6018000F, // 0028 GETGBL R6 G15 + 0x5C1C0A00, // 0029 MOVE R7 R5 + 0x60200013, // 002A GETGBL R8 G19 + 0x7C180400, // 002B CALL R6 2 + 0x781A000A, // 002C JMPF R6 #0038 + 0x8C180B01, // 002D GETMET R6 R5 K1 + 0x58200009, // 002E LDCONST R8 K9 + 0x7C180400, // 002F CALL R6 2 + 0x781A0006, // 0030 JMPF R6 #0038 + 0x0018090A, // 0031 ADD R6 R4 K10 + 0x8C1C0504, // 0032 GETMET R7 R2 K4 + 0x60240013, // 0033 GETGBL R9 G19 + 0x7C240000, // 0034 CALL R9 0 + 0x98260B0B, // 0035 SETIDX R9 K5 K11 + 0x98260E06, // 0036 SETIDX R9 K7 R6 + 0x7C1C0400, // 0037 CALL R7 2 + 0x7001FFEB, // 0038 JMP #0025 + 0x580C0008, // 0039 LDCONST R3 K8 + 0xAC0C0200, // 003A CATCH R3 1 0 + 0xB0080000, // 003B RAISE 2 R0 R0 + 0x600C0010, // 003C GETGBL R3 G16 + 0x8C100100, // 003D GETMET R4 R0 K0 + 0x5C180200, // 003E MOVE R6 R1 + 0x7C100400, // 003F CALL R4 2 + 0x7C0C0200, // 0040 CALL R3 1 + 0xA8020013, // 0041 EXBLK 0 #0056 + 0x5C100600, // 0042 MOVE R4 R3 + 0x7C100000, // 0043 CALL R4 0 + 0x94140204, // 0044 GETIDX R5 R1 R4 + 0x6018000F, // 0045 GETGBL R6 G15 + 0x5C1C0A00, // 0046 MOVE R7 R5 + 0x60200013, // 0047 GETGBL R8 G19 + 0x7C180400, // 0048 CALL R6 2 + 0x781A000A, // 0049 JMPF R6 #0055 + 0x8C180B01, // 004A GETMET R6 R5 K1 + 0x5820000C, // 004B LDCONST R8 K12 + 0x7C180400, // 004C CALL R6 2 + 0x781A0006, // 004D JMPF R6 #0055 + 0x0018090D, // 004E ADD R6 R4 K13 + 0x8C1C0504, // 004F GETMET R7 R2 K4 + 0x60240013, // 0050 GETGBL R9 G19 + 0x7C240000, // 0051 CALL R9 0 + 0x98260B0E, // 0052 SETIDX R9 K5 K14 + 0x98260E06, // 0053 SETIDX R9 K7 R6 + 0x7C1C0400, // 0054 CALL R7 2 + 0x7001FFEB, // 0055 JMP #0042 + 0x580C0008, // 0056 LDCONST R3 K8 + 0xAC0C0200, // 0057 CATCH R3 1 0 + 0xB0080000, // 0058 RAISE 2 R0 R0 + 0x600C0010, // 0059 GETGBL R3 G16 + 0x8C100100, // 005A GETMET R4 R0 K0 + 0x5C180200, // 005B MOVE R6 R1 + 0x7C100400, // 005C CALL R4 2 + 0x7C0C0200, // 005D CALL R3 1 + 0xA8020013, // 005E EXBLK 0 #0073 + 0x5C100600, // 005F MOVE R4 R3 + 0x7C100000, // 0060 CALL R4 0 + 0x94140204, // 0061 GETIDX R5 R1 R4 + 0x6018000F, // 0062 GETGBL R6 G15 + 0x5C1C0A00, // 0063 MOVE R7 R5 + 0x60200013, // 0064 GETGBL R8 G19 + 0x7C180400, // 0065 CALL R6 2 + 0x781A000A, // 0066 JMPF R6 #0072 + 0x8C180B01, // 0067 GETMET R6 R5 K1 + 0x5820000F, // 0068 LDCONST R8 K15 + 0x7C180400, // 0069 CALL R6 2 + 0x781A0006, // 006A JMPF R6 #0072 + 0x00180910, // 006B ADD R6 R4 K16 + 0x8C1C0504, // 006C GETMET R7 R2 K4 + 0x60240013, // 006D GETGBL R9 G19 + 0x7C240000, // 006E CALL R9 0 + 0x98260B11, // 006F SETIDX R9 K5 K17 + 0x98260E06, // 0070 SETIDX R9 K7 R6 + 0x7C1C0400, // 0071 CALL R7 2 + 0x7001FFEB, // 0072 JMP #005F + 0x580C0008, // 0073 LDCONST R3 K8 + 0xAC0C0200, // 0074 CATCH R3 1 0 + 0xB0080000, // 0075 RAISE 2 R0 R0 + 0x80040400, // 0076 RET 1 R2 }) ) ); @@ -2983,6 +3429,478 @@ be_local_closure(Matter_Device_stop, /* name */ /*******************************************************************/ +/******************************************************************** +** Solidified function: bridge_remove_endpoint +********************************************************************/ +be_local_closure(Matter_Device_bridge_remove_endpoint, /* name */ + be_nested_proto( + 11, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[17]) { /* constants */ + /* K0 */ be_nested_str_weak(string), + /* K1 */ be_nested_str_weak(json), + /* K2 */ be_nested_str_weak(plugins_config), + /* K3 */ be_nested_str_weak(contains), + /* K4 */ be_nested_str_weak(tasmota), + /* K5 */ be_nested_str_weak(log), + /* K6 */ be_nested_str_weak(MTR_X3A_X20Cannot_X20remove_X20an_X20enpoint_X20not_X20configured_X3A_X20), + /* K7 */ be_const_int(3), + /* K8 */ be_nested_str_weak(remove), + /* K9 */ be_nested_str_weak(plugins_persist), + /* K10 */ be_nested_str_weak(save_param), + /* K11 */ be_nested_str_weak(signal_endpoints_changed), + /* K12 */ be_const_int(0), + /* K13 */ be_nested_str_weak(plugins), + /* K14 */ be_nested_str_weak(get_endpoint), + /* K15 */ be_const_int(1), + /* K16 */ be_nested_str_weak(clean_remotes), + }), + be_str_weak(bridge_remove_endpoint), + &be_const_str_solidified, + ( &(const binstruction[53]) { /* code */ + 0xA40A0000, // 0000 IMPORT R2 K0 + 0xA40E0200, // 0001 IMPORT R3 K1 + 0x60100008, // 0002 GETGBL R4 G8 + 0x5C140200, // 0003 MOVE R5 R1 + 0x7C100200, // 0004 CALL R4 1 + 0x4C140000, // 0005 LDNIL R5 + 0x4C180000, // 0006 LDNIL R6 + 0x881C0102, // 0007 GETMBR R7 R0 K2 + 0x8C1C0F03, // 0008 GETMET R7 R7 K3 + 0x5C240800, // 0009 MOVE R9 R4 + 0x7C1C0400, // 000A CALL R7 2 + 0x741E0005, // 000B JMPT R7 #0012 + 0xB81E0800, // 000C GETNGBL R7 K4 + 0x8C1C0F05, // 000D GETMET R7 R7 K5 + 0x00260C04, // 000E ADD R9 K6 R4 + 0x58280007, // 000F LDCONST R10 K7 + 0x7C1C0600, // 0010 CALL R7 3 + 0x80000E00, // 0011 RET 0 + 0x881C0102, // 0012 GETMBR R7 R0 K2 + 0x8C1C0F08, // 0013 GETMET R7 R7 K8 + 0x5C240800, // 0014 MOVE R9 R4 + 0x7C1C0400, // 0015 CALL R7 2 + 0x501C0200, // 0016 LDBOOL R7 1 0 + 0x90021207, // 0017 SETMBR R0 K9 R7 + 0x8C1C010A, // 0018 GETMET R7 R0 K10 + 0x7C1C0200, // 0019 CALL R7 1 + 0x8C1C010B, // 001A GETMET R7 R0 K11 + 0x7C1C0200, // 001B CALL R7 1 + 0x581C000C, // 001C LDCONST R7 K12 + 0x6020000C, // 001D GETGBL R8 G12 + 0x8824010D, // 001E GETMBR R9 R0 K13 + 0x7C200200, // 001F CALL R8 1 + 0x14200E08, // 0020 LT R8 R7 R8 + 0x7822000F, // 0021 JMPF R8 #0032 + 0x8820010D, // 0022 GETMBR R8 R0 K13 + 0x94201007, // 0023 GETIDX R8 R8 R7 + 0x8C20110E, // 0024 GETMET R8 R8 K14 + 0x7C200200, // 0025 CALL R8 1 + 0x1C200208, // 0026 EQ R8 R1 R8 + 0x78220007, // 0027 JMPF R8 #0030 + 0x8820010D, // 0028 GETMBR R8 R0 K13 + 0x8C201108, // 0029 GETMET R8 R8 K8 + 0x5C280E00, // 002A MOVE R10 R7 + 0x7C200400, // 002B CALL R8 2 + 0x8C20010B, // 002C GETMET R8 R0 K11 + 0x7C200200, // 002D CALL R8 1 + 0x70020002, // 002E JMP #0032 + 0x70020000, // 002F JMP #0031 + 0x001C0F0F, // 0030 ADD R7 R7 K15 + 0x7001FFEA, // 0031 JMP #001D + 0x8C200110, // 0032 GETMET R8 R0 K16 + 0x7C200200, // 0033 CALL R8 1 + 0x80000000, // 0034 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: _trigger_read_sensors +********************************************************************/ +be_local_closure(Matter_Device__trigger_read_sensors, /* name */ + be_nested_proto( + 8, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[11]) { /* constants */ + /* K0 */ be_nested_str_weak(json), + /* K1 */ be_nested_str_weak(tasmota), + /* K2 */ be_nested_str_weak(read_sensors), + /* K3 */ be_nested_str_weak(load), + /* K4 */ be_const_int(0), + /* K5 */ be_nested_str_weak(plugins), + /* K6 */ be_nested_str_weak(parse_sensors), + /* K7 */ be_const_int(1), + /* K8 */ be_nested_str_weak(log), + /* K9 */ be_nested_str_weak(MTR_X3A_X20unable_X20to_X20parse_X20read_sensors_X3A_X20), + /* K10 */ be_const_int(3), + }), + be_str_weak(_trigger_read_sensors), + &be_const_str_solidified, + ( &(const binstruction[37]) { /* code */ + 0xA4060000, // 0000 IMPORT R1 K0 + 0xB80A0200, // 0001 GETNGBL R2 K1 + 0x8C080502, // 0002 GETMET R2 R2 K2 + 0x7C080200, // 0003 CALL R2 1 + 0x4C0C0000, // 0004 LDNIL R3 + 0x1C0C0403, // 0005 EQ R3 R2 R3 + 0x780E0000, // 0006 JMPF R3 #0008 + 0x80000600, // 0007 RET 0 + 0x8C0C0303, // 0008 GETMET R3 R1 K3 + 0x5C140400, // 0009 MOVE R5 R2 + 0x7C0C0400, // 000A CALL R3 2 + 0x4C100000, // 000B LDNIL R4 + 0x20100604, // 000C NE R4 R3 R4 + 0x7812000D, // 000D JMPF R4 #001C + 0x58100004, // 000E LDCONST R4 K4 + 0x6014000C, // 000F GETGBL R5 G12 + 0x88180105, // 0010 GETMBR R6 R0 K5 + 0x7C140200, // 0011 CALL R5 1 + 0x14140805, // 0012 LT R5 R4 R5 + 0x78160006, // 0013 JMPF R5 #001B + 0x88140105, // 0014 GETMBR R5 R0 K5 + 0x94140A04, // 0015 GETIDX R5 R5 R4 + 0x8C140B06, // 0016 GETMET R5 R5 K6 + 0x5C1C0600, // 0017 MOVE R7 R3 + 0x7C140400, // 0018 CALL R5 2 + 0x00100907, // 0019 ADD R4 R4 K7 + 0x7001FFF3, // 001A JMP #000F + 0x70020007, // 001B JMP #0024 + 0xB8120200, // 001C GETNGBL R4 K1 + 0x8C100908, // 001D GETMET R4 R4 K8 + 0x60180008, // 001E GETGBL R6 G8 + 0x5C1C0400, // 001F MOVE R7 R2 + 0x7C180200, // 0020 CALL R6 1 + 0x001A1206, // 0021 ADD R6 K9 R6 + 0x581C000A, // 0022 LDCONST R7 K10 + 0x7C100600, // 0023 CALL R4 3 + 0x80000000, // 0024 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: save_param +********************************************************************/ +be_local_closure(Matter_Device_save_param, /* name */ + be_nested_proto( + 11, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[27]) { /* constants */ + /* K0 */ be_nested_str_weak(string), + /* K1 */ be_nested_str_weak(json), + /* K2 */ be_nested_str_weak(format), + /* K3 */ be_nested_str_weak(_X7B_X22distinguish_X22_X3A_X25i_X2C_X22passcode_X22_X3A_X25i_X2C_X22ipv4only_X22_X3A_X25s_X2C_X22nextep_X22_X3A_X25i), + /* K4 */ be_nested_str_weak(root_discriminator), + /* K5 */ be_nested_str_weak(root_passcode), + /* K6 */ be_nested_str_weak(ipv4only), + /* K7 */ be_nested_str_weak(true), + /* K8 */ be_nested_str_weak(false), + /* K9 */ be_nested_str_weak(next_ep), + /* K10 */ be_nested_str_weak(plugins_persist), + /* K11 */ be_nested_str_weak(_X2C_X22config_X22_X3A), + /* K12 */ be_nested_str_weak(dump), + /* K13 */ be_nested_str_weak(plugins_config), + /* K14 */ be_nested_str_weak(_X7D), + /* K15 */ be_nested_str_weak(FILENAME), + /* K16 */ be_nested_str_weak(w), + /* K17 */ be_nested_str_weak(write), + /* K18 */ be_nested_str_weak(close), + /* K19 */ be_nested_str_weak(tasmota), + /* K20 */ be_nested_str_weak(log), + /* K21 */ be_nested_str_weak(MTR_X3A_X20_X3DSaved_X20_X20_X20_X20_X20parameters_X25s), + /* K22 */ be_nested_str_weak(_X20and_X20configuration), + /* K23 */ be_nested_str_weak(), + /* K24 */ be_const_int(2), + /* K25 */ be_nested_str_weak(MTR_X3A_X20Session_Store_X3A_X3Asave_X20Exception_X3A), + /* K26 */ be_nested_str_weak(_X7C), + }), + be_str_weak(save_param), + &be_const_str_solidified, + ( &(const binstruction[66]) { /* code */ + 0xA4060000, // 0000 IMPORT R1 K0 + 0xA40A0200, // 0001 IMPORT R2 K1 + 0x8C0C0302, // 0002 GETMET R3 R1 K2 + 0x58140003, // 0003 LDCONST R5 K3 + 0x88180104, // 0004 GETMBR R6 R0 K4 + 0x881C0105, // 0005 GETMBR R7 R0 K5 + 0x88200106, // 0006 GETMBR R8 R0 K6 + 0x78220001, // 0007 JMPF R8 #000A + 0x58200007, // 0008 LDCONST R8 K7 + 0x70020000, // 0009 JMP #000B + 0x58200008, // 000A LDCONST R8 K8 + 0x88240109, // 000B GETMBR R9 R0 K9 + 0x7C0C0C00, // 000C CALL R3 6 + 0x8810010A, // 000D GETMBR R4 R0 K10 + 0x78120004, // 000E JMPF R4 #0014 + 0x000C070B, // 000F ADD R3 R3 K11 + 0x8C10050C, // 0010 GETMET R4 R2 K12 + 0x8818010D, // 0011 GETMBR R6 R0 K13 + 0x7C100400, // 0012 CALL R4 2 + 0x000C0604, // 0013 ADD R3 R3 R4 + 0x000C070E, // 0014 ADD R3 R3 K14 + 0xA8020018, // 0015 EXBLK 0 #002F + 0x60100011, // 0016 GETGBL R4 G17 + 0x8814010F, // 0017 GETMBR R5 R0 K15 + 0x58180010, // 0018 LDCONST R6 K16 + 0x7C100400, // 0019 CALL R4 2 + 0x8C140911, // 001A GETMET R5 R4 K17 + 0x5C1C0600, // 001B MOVE R7 R3 + 0x7C140400, // 001C CALL R5 2 + 0x8C140912, // 001D GETMET R5 R4 K18 + 0x7C140200, // 001E CALL R5 1 + 0xB8162600, // 001F GETNGBL R5 K19 + 0x8C140B14, // 0020 GETMET R5 R5 K20 + 0x8C1C0302, // 0021 GETMET R7 R1 K2 + 0x58240015, // 0022 LDCONST R9 K21 + 0x8828010A, // 0023 GETMBR R10 R0 K10 + 0x782A0001, // 0024 JMPF R10 #0027 + 0x58280016, // 0025 LDCONST R10 K22 + 0x70020000, // 0026 JMP #0028 + 0x58280017, // 0027 LDCONST R10 K23 + 0x7C1C0600, // 0028 CALL R7 3 + 0x58200018, // 0029 LDCONST R8 K24 + 0x7C140600, // 002A CALL R5 3 + 0xA8040001, // 002B EXBLK 1 1 + 0x80040600, // 002C RET 1 R3 + 0xA8040001, // 002D EXBLK 1 1 + 0x70020011, // 002E JMP #0041 + 0xAC100002, // 002F CATCH R4 0 2 + 0x7002000E, // 0030 JMP #0040 + 0xB81A2600, // 0031 GETNGBL R6 K19 + 0x8C180D14, // 0032 GETMET R6 R6 K20 + 0x60200008, // 0033 GETGBL R8 G8 + 0x5C240800, // 0034 MOVE R9 R4 + 0x7C200200, // 0035 CALL R8 1 + 0x00223208, // 0036 ADD R8 K25 R8 + 0x0020111A, // 0037 ADD R8 R8 K26 + 0x60240008, // 0038 GETGBL R9 G8 + 0x5C280A00, // 0039 MOVE R10 R5 + 0x7C240200, // 003A CALL R9 1 + 0x00201009, // 003B ADD R8 R8 R9 + 0x58240018, // 003C LDCONST R9 K24 + 0x7C180600, // 003D CALL R6 3 + 0x80040600, // 003E RET 1 R3 + 0x70020000, // 003F JMP #0041 + 0xB0080000, // 0040 RAISE 2 R0 R0 + 0x80000000, // 0041 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: k2l_num +********************************************************************/ +be_local_closure(Matter_Device_k2l_num, /* name */ + be_nested_proto( + 9, /* nstack */ + 1, /* argc */ + 4, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 6]) { /* constants */ + /* K0 */ be_const_class(be_class_Matter_Device), + /* K1 */ be_nested_str_weak(keys), + /* K2 */ be_nested_str_weak(push), + /* K3 */ be_nested_str_weak(stop_iteration), + /* K4 */ be_const_int(1), + /* K5 */ be_const_int(0), + }), + be_str_weak(k2l_num), + &be_const_str_solidified, + ( &(const binstruction[52]) { /* code */ + 0x58040000, // 0000 LDCONST R1 K0 + 0x60080012, // 0001 GETGBL R2 G18 + 0x7C080000, // 0002 CALL R2 0 + 0x4C0C0000, // 0003 LDNIL R3 + 0x1C0C0003, // 0004 EQ R3 R0 R3 + 0x780E0000, // 0005 JMPF R3 #0007 + 0x80040400, // 0006 RET 1 R2 + 0x600C0010, // 0007 GETGBL R3 G16 + 0x8C100101, // 0008 GETMET R4 R0 K1 + 0x7C100200, // 0009 CALL R4 1 + 0x7C0C0200, // 000A CALL R3 1 + 0xA8020007, // 000B EXBLK 0 #0014 + 0x5C100600, // 000C MOVE R4 R3 + 0x7C100000, // 000D CALL R4 0 + 0x8C140502, // 000E GETMET R5 R2 K2 + 0x601C0009, // 000F GETGBL R7 G9 + 0x5C200800, // 0010 MOVE R8 R4 + 0x7C1C0200, // 0011 CALL R7 1 + 0x7C140400, // 0012 CALL R5 2 + 0x7001FFF7, // 0013 JMP #000C + 0x580C0003, // 0014 LDCONST R3 K3 + 0xAC0C0200, // 0015 CATCH R3 1 0 + 0xB0080000, // 0016 RAISE 2 R0 R0 + 0x600C0010, // 0017 GETGBL R3 G16 + 0x6010000C, // 0018 GETGBL R4 G12 + 0x5C140400, // 0019 MOVE R5 R2 + 0x7C100200, // 001A CALL R4 1 + 0x04100904, // 001B SUB R4 R4 K4 + 0x40120804, // 001C CONNECT R4 K4 R4 + 0x7C0C0200, // 001D CALL R3 1 + 0xA8020010, // 001E EXBLK 0 #0030 + 0x5C100600, // 001F MOVE R4 R3 + 0x7C100000, // 0020 CALL R4 0 + 0x94140404, // 0021 GETIDX R5 R2 R4 + 0x5C180800, // 0022 MOVE R6 R4 + 0x241C0D05, // 0023 GT R7 R6 K5 + 0x781E0008, // 0024 JMPF R7 #002E + 0x041C0D04, // 0025 SUB R7 R6 K4 + 0x941C0407, // 0026 GETIDX R7 R2 R7 + 0x241C0E05, // 0027 GT R7 R7 R5 + 0x781E0004, // 0028 JMPF R7 #002E + 0x041C0D04, // 0029 SUB R7 R6 K4 + 0x941C0407, // 002A GETIDX R7 R2 R7 + 0x98080C07, // 002B SETIDX R2 R6 R7 + 0x04180D04, // 002C SUB R6 R6 K4 + 0x7001FFF4, // 002D JMP #0023 + 0x98080C05, // 002E SETIDX R2 R6 R5 + 0x7001FFEE, // 002F JMP #001F + 0x580C0003, // 0030 LDCONST R3 K3 + 0xAC0C0200, // 0031 CATCH R3 1 0 + 0xB0080000, // 0032 RAISE 2 R0 R0 + 0x80040400, // 0033 RET 1 R2 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: compute_manual_pairing_code +********************************************************************/ +be_local_closure(Matter_Device_compute_manual_pairing_code, /* name */ + be_nested_proto( + 11, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 8]) { /* constants */ + /* K0 */ be_nested_str_weak(string), + /* K1 */ be_nested_str_weak(root_discriminator), + /* K2 */ be_nested_str_weak(root_passcode), + /* K3 */ be_nested_str_weak(format), + /* K4 */ be_nested_str_weak(_X251i_X2505i_X2504i), + /* K5 */ be_nested_str_weak(matter), + /* K6 */ be_nested_str_weak(Verhoeff), + /* K7 */ be_nested_str_weak(checksum), + }), + be_str_weak(compute_manual_pairing_code), + &be_const_str_solidified, + ( &(const binstruction[31]) { /* code */ + 0xA4060000, // 0000 IMPORT R1 K0 + 0x88080101, // 0001 GETMBR R2 R0 K1 + 0x540E0FFE, // 0002 LDINT R3 4095 + 0x2C080403, // 0003 AND R2 R2 R3 + 0x540E0009, // 0004 LDINT R3 10 + 0x3C080403, // 0005 SHR R2 R2 R3 + 0x880C0101, // 0006 GETMBR R3 R0 K1 + 0x541202FF, // 0007 LDINT R4 768 + 0x2C0C0604, // 0008 AND R3 R3 R4 + 0x54120005, // 0009 LDINT R4 6 + 0x380C0604, // 000A SHL R3 R3 R4 + 0x88100102, // 000B GETMBR R4 R0 K2 + 0x54163FFE, // 000C LDINT R5 16383 + 0x2C100805, // 000D AND R4 R4 R5 + 0x300C0604, // 000E OR R3 R3 R4 + 0x88100102, // 000F GETMBR R4 R0 K2 + 0x5416000D, // 0010 LDINT R5 14 + 0x3C100805, // 0011 SHR R4 R4 R5 + 0x8C140303, // 0012 GETMET R5 R1 K3 + 0x581C0004, // 0013 LDCONST R7 K4 + 0x5C200400, // 0014 MOVE R8 R2 + 0x5C240600, // 0015 MOVE R9 R3 + 0x5C280800, // 0016 MOVE R10 R4 + 0x7C140A00, // 0017 CALL R5 5 + 0xB81A0A00, // 0018 GETNGBL R6 K5 + 0x88180D06, // 0019 GETMBR R6 R6 K6 + 0x8C180D07, // 001A GETMET R6 R6 K7 + 0x5C200A00, // 001B MOVE R8 R5 + 0x7C180400, // 001C CALL R6 2 + 0x00140A06, // 001D ADD R5 R5 R6 + 0x80040A00, // 001E RET 1 R5 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: start_operational_discovery +********************************************************************/ +be_local_closure(Matter_Device_start_operational_discovery, /* name */ + be_nested_proto( + 8, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 7]) { /* constants */ + /* K0 */ be_nested_str_weak(crypto), + /* K1 */ be_nested_str_weak(mdns), + /* K2 */ be_nested_str_weak(string), + /* K3 */ be_nested_str_weak(stop_basic_commissioning), + /* K4 */ be_nested_str_weak(root_w0), + /* K5 */ be_nested_str_weak(root_L), + /* K6 */ be_nested_str_weak(mdns_announce_op_discovery), + }), + be_str_weak(start_operational_discovery), + &be_const_str_solidified, + ( &(const binstruction[13]) { /* code */ + 0xA40A0000, // 0000 IMPORT R2 K0 + 0xA40E0200, // 0001 IMPORT R3 K1 + 0xA4120400, // 0002 IMPORT R4 K2 + 0x8C140103, // 0003 GETMET R5 R0 K3 + 0x7C140200, // 0004 CALL R5 1 + 0x4C140000, // 0005 LDNIL R5 + 0x90020805, // 0006 SETMBR R0 K4 R5 + 0x4C140000, // 0007 LDNIL R5 + 0x90020A05, // 0008 SETMBR R0 K5 R5 + 0x8C140106, // 0009 GETMET R5 R0 K6 + 0x5C1C0200, // 000A MOVE R7 R1 + 0x7C140400, // 000B CALL R5 2 + 0x80000000, // 000C RET 0 + }) + ) +); +/*******************************************************************/ + + /******************************************************************** ** Solidified function: stop_basic_commissioning ********************************************************************/ @@ -3045,126 +3963,6 @@ be_local_closure(Matter_Device_stop_basic_commissioning, /* name */ /*******************************************************************/ -/******************************************************************** -** Solidified function: start_commissioning_complete_deferred -********************************************************************/ -be_local_closure(Matter_Device_start_commissioning_complete_deferred, /* name */ - be_nested_proto( - 6, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 1, /* has sup protos */ - ( &(const struct bproto*[ 1]) { - be_nested_proto( - 3, /* nstack */ - 0, /* argc */ - 0, /* varg */ - 1, /* has upvals */ - ( &(const bupvaldesc[ 2]) { /* upvals */ - be_local_const_upval(1, 0), - be_local_const_upval(1, 1), - }), - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 1]) { /* constants */ - /* K0 */ be_nested_str_weak(start_commissioning_complete), - }), - be_str_weak(_X3Clambda_X3E), - &be_const_str_solidified, - ( &(const binstruction[ 5]) { /* code */ - 0x68000000, // 0000 GETUPV R0 U0 - 0x8C000100, // 0001 GETMET R0 R0 K0 - 0x68080001, // 0002 GETUPV R2 U1 - 0x7C000400, // 0003 CALL R0 2 - 0x80040000, // 0004 RET 1 R0 - }) - ), - }), - 1, /* has constants */ - ( &(const bvalue[ 3]) { /* constants */ - /* K0 */ be_nested_str_weak(tasmota), - /* K1 */ be_nested_str_weak(set_timer), - /* K2 */ be_const_int(0), - }), - be_str_weak(start_commissioning_complete_deferred), - &be_const_str_solidified, - ( &(const binstruction[ 7]) { /* code */ - 0xB80A0000, // 0000 GETNGBL R2 K0 - 0x8C080501, // 0001 GETMET R2 R2 K1 - 0x58100002, // 0002 LDCONST R4 K2 - 0x84140000, // 0003 CLOSURE R5 P0 - 0x7C080600, // 0004 CALL R2 3 - 0xA0000000, // 0005 CLOSE R0 - 0x80000000, // 0006 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: start_operational_discovery_deferred -********************************************************************/ -be_local_closure(Matter_Device_start_operational_discovery_deferred, /* name */ - be_nested_proto( - 6, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 1, /* has sup protos */ - ( &(const struct bproto*[ 1]) { - be_nested_proto( - 3, /* nstack */ - 0, /* argc */ - 0, /* varg */ - 1, /* has upvals */ - ( &(const bupvaldesc[ 2]) { /* upvals */ - be_local_const_upval(1, 0), - be_local_const_upval(1, 1), - }), - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 1]) { /* constants */ - /* K0 */ be_nested_str_weak(start_operational_discovery), - }), - be_str_weak(_X3Clambda_X3E), - &be_const_str_solidified, - ( &(const binstruction[ 5]) { /* code */ - 0x68000000, // 0000 GETUPV R0 U0 - 0x8C000100, // 0001 GETMET R0 R0 K0 - 0x68080001, // 0002 GETUPV R2 U1 - 0x7C000400, // 0003 CALL R0 2 - 0x80040000, // 0004 RET 1 R0 - }) - ), - }), - 1, /* has constants */ - ( &(const bvalue[ 3]) { /* constants */ - /* K0 */ be_nested_str_weak(tasmota), - /* K1 */ be_nested_str_weak(set_timer), - /* K2 */ be_const_int(0), - }), - be_str_weak(start_operational_discovery_deferred), - &be_const_str_solidified, - ( &(const binstruction[ 7]) { /* code */ - 0xB80A0000, // 0000 GETNGBL R2 K0 - 0x8C080501, // 0001 GETMET R2 R2 K1 - 0x58100002, // 0002 LDCONST R4 K2 - 0x84140000, // 0003 CLOSURE R5 P0 - 0x7C080600, // 0004 CALL R2 3 - 0xA0000000, // 0005 CLOSE R0 - 0x80000000, // 0006 RET 0 - }) - ) -); -/*******************************************************************/ - - /******************************************************************** ** Solidified function: bridge_add_endpoint ********************************************************************/ @@ -3265,275 +4063,6 @@ be_local_closure(Matter_Device_bridge_add_endpoint, /* name */ /*******************************************************************/ -/******************************************************************** -** Solidified function: event_fabrics_saved -********************************************************************/ -be_local_closure(Matter_Device_event_fabrics_saved, /* name */ - be_nested_proto( - 3, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 5]) { /* constants */ - /* K0 */ be_nested_str_weak(sessions), - /* K1 */ be_nested_str_weak(count_active_fabrics), - /* K2 */ be_const_int(0), - /* K3 */ be_nested_str_weak(plugins_persist), - /* K4 */ be_nested_str_weak(save_param), - }), - be_str_weak(event_fabrics_saved), - &be_const_str_solidified, - ( &(const binstruction[12]) { /* code */ - 0x88040100, // 0000 GETMBR R1 R0 K0 - 0x8C040301, // 0001 GETMET R1 R1 K1 - 0x7C040200, // 0002 CALL R1 1 - 0x24040302, // 0003 GT R1 R1 K2 - 0x78060005, // 0004 JMPF R1 #000B - 0x88040103, // 0005 GETMBR R1 R0 K3 - 0x74060003, // 0006 JMPT R1 #000B - 0x50040200, // 0007 LDBOOL R1 1 0 - 0x90020601, // 0008 SETMBR R0 K3 R1 - 0x8C040104, // 0009 GETMET R1 R0 K4 - 0x7C040200, // 000A CALL R1 1 - 0x80000000, // 000B RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: remove_fabric -********************************************************************/ -be_local_closure(Matter_Device_remove_fabric, /* name */ - be_nested_proto( - 9, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[12]) { /* constants */ - /* K0 */ be_nested_str_weak(sessions), - /* K1 */ be_nested_str_weak(find_children_fabrics), - /* K2 */ be_nested_str_weak(get_fabric_index), - /* K3 */ be_nested_str_weak(find_fabric_by_index), - /* K4 */ be_nested_str_weak(message_handler), - /* K5 */ be_nested_str_weak(im), - /* K6 */ be_nested_str_weak(subs_shop), - /* K7 */ be_nested_str_weak(remove_by_fabric), - /* K8 */ be_nested_str_weak(mdns_remove_op_discovery), - /* K9 */ be_nested_str_weak(remove_fabric), - /* K10 */ be_nested_str_weak(stop_iteration), - /* K11 */ be_nested_str_weak(save_fabrics), - }), - be_str_weak(remove_fabric), - &be_const_str_solidified, - ( &(const binstruction[43]) { /* code */ - 0x88080100, // 0000 GETMBR R2 R0 K0 - 0x8C080501, // 0001 GETMET R2 R2 K1 - 0x8C100302, // 0002 GETMET R4 R1 K2 - 0x7C100200, // 0003 CALL R4 1 - 0x7C080400, // 0004 CALL R2 2 - 0x4C0C0000, // 0005 LDNIL R3 - 0x1C0C0403, // 0006 EQ R3 R2 R3 - 0x780E0000, // 0007 JMPF R3 #0009 - 0x80000600, // 0008 RET 0 - 0x600C0010, // 0009 GETGBL R3 G16 - 0x5C100400, // 000A MOVE R4 R2 - 0x7C0C0200, // 000B CALL R3 1 - 0xA8020016, // 000C EXBLK 0 #0024 - 0x5C100600, // 000D MOVE R4 R3 - 0x7C100000, // 000E CALL R4 0 - 0x88140100, // 000F GETMBR R5 R0 K0 - 0x8C140B03, // 0010 GETMET R5 R5 K3 - 0x5C1C0800, // 0011 MOVE R7 R4 - 0x7C140400, // 0012 CALL R5 2 - 0x4C180000, // 0013 LDNIL R6 - 0x20180A06, // 0014 NE R6 R5 R6 - 0x781A000C, // 0015 JMPF R6 #0023 - 0x88180104, // 0016 GETMBR R6 R0 K4 - 0x88180D05, // 0017 GETMBR R6 R6 K5 - 0x88180D06, // 0018 GETMBR R6 R6 K6 - 0x8C180D07, // 0019 GETMET R6 R6 K7 - 0x5C200A00, // 001A MOVE R8 R5 - 0x7C180400, // 001B CALL R6 2 - 0x8C180108, // 001C GETMET R6 R0 K8 - 0x5C200A00, // 001D MOVE R8 R5 - 0x7C180400, // 001E CALL R6 2 - 0x88180100, // 001F GETMBR R6 R0 K0 - 0x8C180D09, // 0020 GETMET R6 R6 K9 - 0x5C200A00, // 0021 MOVE R8 R5 - 0x7C180400, // 0022 CALL R6 2 - 0x7001FFE8, // 0023 JMP #000D - 0x580C000A, // 0024 LDCONST R3 K10 - 0xAC0C0200, // 0025 CATCH R3 1 0 - 0xB0080000, // 0026 RAISE 2 R0 R0 - 0x880C0100, // 0027 GETMBR R3 R0 K0 - 0x8C0C070B, // 0028 GETMET R3 R3 K11 - 0x7C0C0200, // 0029 CALL R3 1 - 0x80000000, // 002A RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: _init_basic_commissioning -********************************************************************/ -be_local_closure(Matter_Device__init_basic_commissioning, /* name */ - be_nested_proto( - 3, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 4]) { /* constants */ - /* K0 */ be_nested_str_weak(sessions), - /* K1 */ be_nested_str_weak(count_active_fabrics), - /* K2 */ be_const_int(0), - /* K3 */ be_nested_str_weak(start_root_basic_commissioning), - }), - be_str_weak(_init_basic_commissioning), - &be_const_str_solidified, - ( &(const binstruction[ 8]) { /* code */ - 0x88040100, // 0000 GETMBR R1 R0 K0 - 0x8C040301, // 0001 GETMET R1 R1 K1 - 0x7C040200, // 0002 CALL R1 1 - 0x1C040302, // 0003 EQ R1 R1 K2 - 0x78060001, // 0004 JMPF R1 #0007 - 0x8C040103, // 0005 GETMET R1 R0 K3 - 0x7C040200, // 0006 CALL R1 1 - 0x80000000, // 0007 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: get_plugin_class_displayname -********************************************************************/ -be_local_closure(Matter_Device_get_plugin_class_displayname, /* name */ - be_nested_proto( - 5, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 4]) { /* constants */ - /* K0 */ be_nested_str_weak(plugins_classes), - /* K1 */ be_nested_str_weak(find), - /* K2 */ be_nested_str_weak(NAME), - /* K3 */ be_nested_str_weak(), - }), - be_str_weak(get_plugin_class_displayname), - &be_const_str_solidified, - ( &(const binstruction[ 9]) { /* code */ - 0x88080100, // 0000 GETMBR R2 R0 K0 - 0x8C080501, // 0001 GETMET R2 R2 K1 - 0x5C100200, // 0002 MOVE R4 R1 - 0x7C080400, // 0003 CALL R2 2 - 0x780A0001, // 0004 JMPF R2 #0007 - 0x880C0502, // 0005 GETMBR R3 R2 K2 - 0x70020000, // 0006 JMP #0008 - 0x580C0003, // 0007 LDCONST R3 K3 - 0x80040600, // 0008 RET 1 R3 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: compute_qrcode_content -********************************************************************/ -be_local_closure(Matter_Device_compute_qrcode_content, /* name */ - be_nested_proto( - 8, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[12]) { /* constants */ - /* K0 */ be_nested_str_weak(resize), - /* K1 */ be_nested_str_weak(setbits), - /* K2 */ be_const_int(3), - /* K3 */ be_nested_str_weak(vendorid), - /* K4 */ be_nested_str_weak(productid), - /* K5 */ be_nested_str_weak(root_discriminator), - /* K6 */ be_nested_str_weak(root_passcode), - /* K7 */ be_const_int(134217727), - /* K8 */ be_nested_str_weak(MT_X3A), - /* K9 */ be_nested_str_weak(matter), - /* K10 */ be_nested_str_weak(Base38), - /* K11 */ be_nested_str_weak(encode), - }), - be_str_weak(compute_qrcode_content), - &be_const_str_solidified, - ( &(const binstruction[40]) { /* code */ - 0x60040015, // 0000 GETGBL R1 G21 - 0x7C040000, // 0001 CALL R1 0 - 0x8C040300, // 0002 GETMET R1 R1 K0 - 0x540E000A, // 0003 LDINT R3 11 - 0x7C040400, // 0004 CALL R1 2 - 0x8C080301, // 0005 GETMET R2 R1 K1 - 0x58100002, // 0006 LDCONST R4 K2 - 0x5416000F, // 0007 LDINT R5 16 - 0x88180103, // 0008 GETMBR R6 R0 K3 - 0x7C080800, // 0009 CALL R2 4 - 0x8C080301, // 000A GETMET R2 R1 K1 - 0x54120012, // 000B LDINT R4 19 - 0x5416000F, // 000C LDINT R5 16 - 0x88180104, // 000D GETMBR R6 R0 K4 - 0x7C080800, // 000E CALL R2 4 - 0x8C080301, // 000F GETMET R2 R1 K1 - 0x54120024, // 0010 LDINT R4 37 - 0x54160007, // 0011 LDINT R5 8 - 0x541A0003, // 0012 LDINT R6 4 - 0x7C080800, // 0013 CALL R2 4 - 0x8C080301, // 0014 GETMET R2 R1 K1 - 0x5412002C, // 0015 LDINT R4 45 - 0x5416000B, // 0016 LDINT R5 12 - 0x88180105, // 0017 GETMBR R6 R0 K5 - 0x541E0FFE, // 0018 LDINT R7 4095 - 0x2C180C07, // 0019 AND R6 R6 R7 - 0x7C080800, // 001A CALL R2 4 - 0x8C080301, // 001B GETMET R2 R1 K1 - 0x54120038, // 001C LDINT R4 57 - 0x5416001A, // 001D LDINT R5 27 - 0x88180106, // 001E GETMBR R6 R0 K6 - 0x2C180D07, // 001F AND R6 R6 K7 - 0x7C080800, // 0020 CALL R2 4 - 0xB80A1200, // 0021 GETNGBL R2 K9 - 0x8808050A, // 0022 GETMBR R2 R2 K10 - 0x8C08050B, // 0023 GETMET R2 R2 K11 - 0x5C100200, // 0024 MOVE R4 R1 - 0x7C080400, // 0025 CALL R2 2 - 0x000A1002, // 0026 ADD R2 K8 R2 - 0x80040400, // 0027 RET 1 R2 - }) - ) -); -/*******************************************************************/ - - /******************************************************************** ** Solidified function: mdns_announce_op_discovery ********************************************************************/ @@ -3710,11 +4239,107 @@ be_local_closure(Matter_Device_mdns_announce_op_discovery, /* name */ /******************************************************************** -** Solidified function: mdns_remove_op_discovery_all_fabrics +** Solidified function: start_root_basic_commissioning ********************************************************************/ -be_local_closure(Matter_Device_mdns_remove_op_discovery_all_fabrics, /* name */ +be_local_closure(Matter_Device_start_root_basic_commissioning, /* name */ be_nested_proto( - 6, /* nstack */ + 14, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[23]) { /* constants */ + /* K0 */ be_nested_str_weak(string), + /* K1 */ be_nested_str_weak(PASE_TIMEOUT), + /* K2 */ be_nested_str_weak(compute_manual_pairing_code), + /* K3 */ be_nested_str_weak(tasmota), + /* K4 */ be_nested_str_weak(log), + /* K5 */ be_nested_str_weak(format), + /* K6 */ be_nested_str_weak(MTR_X3A_X20Manual_X20pairing_X20code_X3A_X20_X25s_X2D_X25s_X2D_X25s), + /* K7 */ be_const_int(0), + /* K8 */ be_const_int(3), + /* K9 */ be_const_int(2147483647), + /* K10 */ be_const_int(2), + /* K11 */ be_nested_str_weak(compute_qrcode_content), + /* K12 */ be_nested_str_weak(publish_result), + /* K13 */ be_nested_str_weak(_X7B_X22Matter_X22_X3A_X7B_X22Commissioning_X22_X3A1_X2C_X22PairingCode_X22_X3A_X22_X25s_X22_X2C_X22QRCode_X22_X3A_X22_X25s_X22_X7D_X7D), + /* K14 */ be_nested_str_weak(Matter), + /* K15 */ be_nested_str_weak(_compute_pbkdf), + /* K16 */ be_nested_str_weak(root_passcode), + /* K17 */ be_nested_str_weak(root_iterations), + /* K18 */ be_nested_str_weak(root_salt), + /* K19 */ be_nested_str_weak(start_basic_commissioning), + /* K20 */ be_nested_str_weak(root_discriminator), + /* K21 */ be_nested_str_weak(root_w0), + /* K22 */ be_nested_str_weak(root_L), + }), + be_str_weak(start_root_basic_commissioning), + &be_const_str_solidified, + ( &(const binstruction[49]) { /* code */ + 0xA40A0000, // 0000 IMPORT R2 K0 + 0x4C0C0000, // 0001 LDNIL R3 + 0x1C0C0203, // 0002 EQ R3 R1 R3 + 0x780E0000, // 0003 JMPF R3 #0005 + 0x88040101, // 0004 GETMBR R1 R0 K1 + 0x8C0C0102, // 0005 GETMET R3 R0 K2 + 0x7C0C0200, // 0006 CALL R3 1 + 0xB8120600, // 0007 GETNGBL R4 K3 + 0x8C100904, // 0008 GETMET R4 R4 K4 + 0x8C180505, // 0009 GETMET R6 R2 K5 + 0x58200006, // 000A LDCONST R8 K6 + 0x40260F08, // 000B CONNECT R9 K7 K8 + 0x94240609, // 000C GETIDX R9 R3 R9 + 0x542A0003, // 000D LDINT R10 4 + 0x542E0005, // 000E LDINT R11 6 + 0x4028140B, // 000F CONNECT R10 R10 R11 + 0x9428060A, // 0010 GETIDX R10 R3 R10 + 0x542E0006, // 0011 LDINT R11 7 + 0x402C1709, // 0012 CONNECT R11 R11 K9 + 0x942C060B, // 0013 GETIDX R11 R3 R11 + 0x7C180A00, // 0014 CALL R6 5 + 0x581C000A, // 0015 LDCONST R7 K10 + 0x7C100600, // 0016 CALL R4 3 + 0x8C10010B, // 0017 GETMET R4 R0 K11 + 0x7C100200, // 0018 CALL R4 1 + 0xB8160600, // 0019 GETNGBL R5 K3 + 0x8C140B0C, // 001A GETMET R5 R5 K12 + 0x8C1C0505, // 001B GETMET R7 R2 K5 + 0x5824000D, // 001C LDCONST R9 K13 + 0x5C280600, // 001D MOVE R10 R3 + 0x5C2C0800, // 001E MOVE R11 R4 + 0x7C1C0800, // 001F CALL R7 4 + 0x5820000E, // 0020 LDCONST R8 K14 + 0x7C140600, // 0021 CALL R5 3 + 0x8C14010F, // 0022 GETMET R5 R0 K15 + 0x881C0110, // 0023 GETMBR R7 R0 K16 + 0x88200111, // 0024 GETMBR R8 R0 K17 + 0x88240112, // 0025 GETMBR R9 R0 K18 + 0x7C140800, // 0026 CALL R5 4 + 0x8C140113, // 0027 GETMET R5 R0 K19 + 0x5C1C0200, // 0028 MOVE R7 R1 + 0x88200111, // 0029 GETMBR R8 R0 K17 + 0x88240114, // 002A GETMBR R9 R0 K20 + 0x88280112, // 002B GETMBR R10 R0 K18 + 0x882C0115, // 002C GETMBR R11 R0 K21 + 0x88300116, // 002D GETMBR R12 R0 K22 + 0x4C340000, // 002E LDNIL R13 + 0x7C141000, // 002F CALL R5 8 + 0x80000000, // 0030 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: load_param +********************************************************************/ +be_local_closure(Matter_Device_load_param, /* name */ + be_nested_proto( + 12, /* nstack */ 1, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -3722,39 +4347,148 @@ be_local_closure(Matter_Device_mdns_remove_op_discovery_all_fabrics, /* name * 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[ 6]) { /* constants */ - /* K0 */ be_nested_str_weak(sessions), - /* K1 */ be_nested_str_weak(active_fabrics), - /* K2 */ be_nested_str_weak(get_device_id), - /* K3 */ be_nested_str_weak(get_fabric_id), - /* K4 */ be_nested_str_weak(mdns_remove_op_discovery), - /* K5 */ be_nested_str_weak(stop_iteration), + ( &(const bvalue[32]) { /* constants */ + /* K0 */ be_nested_str_weak(string), + /* K1 */ be_nested_str_weak(crypto), + /* K2 */ be_nested_str_weak(FILENAME), + /* K3 */ be_nested_str_weak(read), + /* K4 */ be_nested_str_weak(close), + /* K5 */ be_nested_str_weak(json), + /* K6 */ be_nested_str_weak(load), + /* K7 */ be_nested_str_weak(root_discriminator), + /* K8 */ be_nested_str_weak(find), + /* K9 */ be_nested_str_weak(distinguish), + /* K10 */ be_nested_str_weak(root_passcode), + /* K11 */ be_nested_str_weak(passcode), + /* K12 */ be_nested_str_weak(ipv4only), + /* K13 */ be_nested_str_weak(next_ep), + /* K14 */ be_nested_str_weak(nextep), + /* K15 */ be_nested_str_weak(plugins_config), + /* K16 */ be_nested_str_weak(config), + /* K17 */ be_nested_str_weak(tasmota), + /* K18 */ be_nested_str_weak(log), + /* K19 */ be_nested_str_weak(MTR_X3A_X20load_config_X20_X3D_X20), + /* K20 */ be_const_int(3), + /* K21 */ be_nested_str_weak(adjust_next_ep), + /* K22 */ be_nested_str_weak(plugins_persist), + /* K23 */ be_nested_str_weak(io_error), + /* K24 */ be_nested_str_weak(MTR_X3A_X20Session_Store_X3A_X3Aload_X20Exception_X3A), + /* K25 */ be_nested_str_weak(_X7C), + /* K26 */ be_const_int(2), + /* K27 */ be_nested_str_weak(random), + /* K28 */ be_nested_str_weak(get), + /* K29 */ be_const_int(0), + /* K30 */ be_nested_str_weak(generate_random_passcode), + /* K31 */ be_nested_str_weak(save_param), }), - be_str_weak(mdns_remove_op_discovery_all_fabrics), + be_str_weak(load_param), &be_const_str_solidified, - ( &(const binstruction[22]) { /* code */ - 0x60040010, // 0000 GETGBL R1 G16 - 0x88080100, // 0001 GETMBR R2 R0 K0 - 0x8C080501, // 0002 GETMET R2 R2 K1 - 0x7C080200, // 0003 CALL R2 1 - 0x7C040200, // 0004 CALL R1 1 - 0xA802000B, // 0005 EXBLK 0 #0012 - 0x5C080200, // 0006 MOVE R2 R1 - 0x7C080000, // 0007 CALL R2 0 - 0x8C0C0502, // 0008 GETMET R3 R2 K2 - 0x7C0C0200, // 0009 CALL R3 1 - 0x780E0005, // 000A JMPF R3 #0011 - 0x8C0C0503, // 000B GETMET R3 R2 K3 - 0x7C0C0200, // 000C CALL R3 1 - 0x780E0002, // 000D JMPF R3 #0011 - 0x8C0C0104, // 000E GETMET R3 R0 K4 - 0x5C140400, // 000F MOVE R5 R2 - 0x7C0C0400, // 0010 CALL R3 2 - 0x7001FFF3, // 0011 JMP #0006 - 0x58040005, // 0012 LDCONST R1 K5 - 0xAC040200, // 0013 CATCH R1 1 0 - 0xB0080000, // 0014 RAISE 2 R0 R0 - 0x80000000, // 0015 RET 0 + ( &(const binstruction[105]) { /* code */ + 0xA4060000, // 0000 IMPORT R1 K0 + 0xA40A0200, // 0001 IMPORT R2 K1 + 0xA8020036, // 0002 EXBLK 0 #003A + 0x600C0011, // 0003 GETGBL R3 G17 + 0x88100102, // 0004 GETMBR R4 R0 K2 + 0x7C0C0200, // 0005 CALL R3 1 + 0x8C100703, // 0006 GETMET R4 R3 K3 + 0x7C100200, // 0007 CALL R4 1 + 0x8C140704, // 0008 GETMET R5 R3 K4 + 0x7C140200, // 0009 CALL R5 1 + 0xA4160A00, // 000A IMPORT R5 K5 + 0x8C180B06, // 000B GETMET R6 R5 K6 + 0x5C200800, // 000C MOVE R8 R4 + 0x7C180400, // 000D CALL R6 2 + 0x8C1C0D08, // 000E GETMET R7 R6 K8 + 0x58240009, // 000F LDCONST R9 K9 + 0x88280107, // 0010 GETMBR R10 R0 K7 + 0x7C1C0600, // 0011 CALL R7 3 + 0x90020E07, // 0012 SETMBR R0 K7 R7 + 0x8C1C0D08, // 0013 GETMET R7 R6 K8 + 0x5824000B, // 0014 LDCONST R9 K11 + 0x8828010A, // 0015 GETMBR R10 R0 K10 + 0x7C1C0600, // 0016 CALL R7 3 + 0x90021407, // 0017 SETMBR R0 K10 R7 + 0x601C0017, // 0018 GETGBL R7 G23 + 0x8C200D08, // 0019 GETMET R8 R6 K8 + 0x5828000C, // 001A LDCONST R10 K12 + 0x502C0000, // 001B LDBOOL R11 0 0 + 0x7C200600, // 001C CALL R8 3 + 0x7C1C0200, // 001D CALL R7 1 + 0x90021807, // 001E SETMBR R0 K12 R7 + 0x8C1C0D08, // 001F GETMET R7 R6 K8 + 0x5824000E, // 0020 LDCONST R9 K14 + 0x8828010D, // 0021 GETMBR R10 R0 K13 + 0x7C1C0600, // 0022 CALL R7 3 + 0x90021A07, // 0023 SETMBR R0 K13 R7 + 0x8C1C0D08, // 0024 GETMET R7 R6 K8 + 0x58240010, // 0025 LDCONST R9 K16 + 0x7C1C0400, // 0026 CALL R7 2 + 0x90021E07, // 0027 SETMBR R0 K15 R7 + 0x881C010F, // 0028 GETMBR R7 R0 K15 + 0x4C200000, // 0029 LDNIL R8 + 0x201C0E08, // 002A NE R7 R7 R8 + 0x781E000B, // 002B JMPF R7 #0038 + 0xB81E2200, // 002C GETNGBL R7 K17 + 0x8C1C0F12, // 002D GETMET R7 R7 K18 + 0x60240008, // 002E GETGBL R9 G8 + 0x8828010F, // 002F GETMBR R10 R0 K15 + 0x7C240200, // 0030 CALL R9 1 + 0x00262609, // 0031 ADD R9 K19 R9 + 0x58280014, // 0032 LDCONST R10 K20 + 0x7C1C0600, // 0033 CALL R7 3 + 0x8C1C0115, // 0034 GETMET R7 R0 K21 + 0x7C1C0200, // 0035 CALL R7 1 + 0x501C0200, // 0036 LDBOOL R7 1 0 + 0x90022C07, // 0037 SETMBR R0 K22 R7 + 0xA8040001, // 0038 EXBLK 1 1 + 0x70020012, // 0039 JMP #004D + 0xAC0C0002, // 003A CATCH R3 0 2 + 0x7002000F, // 003B JMP #004C + 0x20140717, // 003C NE R5 R3 K23 + 0x7816000C, // 003D JMPF R5 #004B + 0xB8162200, // 003E GETNGBL R5 K17 + 0x8C140B12, // 003F GETMET R5 R5 K18 + 0x601C0008, // 0040 GETGBL R7 G8 + 0x5C200600, // 0041 MOVE R8 R3 + 0x7C1C0200, // 0042 CALL R7 1 + 0x001E3007, // 0043 ADD R7 K24 R7 + 0x001C0F19, // 0044 ADD R7 R7 K25 + 0x60200008, // 0045 GETGBL R8 G8 + 0x5C240800, // 0046 MOVE R9 R4 + 0x7C200200, // 0047 CALL R8 1 + 0x001C0E08, // 0048 ADD R7 R7 R8 + 0x5820001A, // 0049 LDCONST R8 K26 + 0x7C140600, // 004A CALL R5 3 + 0x70020000, // 004B JMP #004D + 0xB0080000, // 004C RAISE 2 R0 R0 + 0x500C0000, // 004D LDBOOL R3 0 0 + 0x88100107, // 004E GETMBR R4 R0 K7 + 0x4C140000, // 004F LDNIL R5 + 0x1C100805, // 0050 EQ R4 R4 R5 + 0x7812000A, // 0051 JMPF R4 #005D + 0x8C10051B, // 0052 GETMET R4 R2 K27 + 0x5818001A, // 0053 LDCONST R6 K26 + 0x7C100400, // 0054 CALL R4 2 + 0x8C10091C, // 0055 GETMET R4 R4 K28 + 0x5818001D, // 0056 LDCONST R6 K29 + 0x581C001A, // 0057 LDCONST R7 K26 + 0x7C100600, // 0058 CALL R4 3 + 0x54160FFE, // 0059 LDINT R5 4095 + 0x2C100805, // 005A AND R4 R4 R5 + 0x90020E04, // 005B SETMBR R0 K7 R4 + 0x500C0200, // 005C LDBOOL R3 1 0 + 0x8810010A, // 005D GETMBR R4 R0 K10 + 0x4C140000, // 005E LDNIL R5 + 0x1C100805, // 005F EQ R4 R4 R5 + 0x78120003, // 0060 JMPF R4 #0065 + 0x8C10011E, // 0061 GETMET R4 R0 K30 + 0x7C100200, // 0062 CALL R4 1 + 0x90021404, // 0063 SETMBR R0 K10 R4 + 0x500C0200, // 0064 LDBOOL R3 1 0 + 0x780E0001, // 0065 JMPF R3 #0068 + 0x8C10011F, // 0066 GETMET R4 R0 K31 + 0x7C100200, // 0067 CALL R4 1 + 0x80000000, // 0068 RET 0 }) ) ); @@ -3793,100 +4527,30 @@ be_local_closure(Matter_Device_msg_send, /* name */ /******************************************************************** -** Solidified function: adjust_next_ep +** Solidified function: received_ack ********************************************************************/ -be_local_closure(Matter_Device_adjust_next_ep, /* name */ +be_local_closure(Matter_Device_received_ack, /* name */ be_nested_proto( 5, /* nstack */ - 1, /* argc */ + 2, /* argc */ 2, /* varg */ 0, /* has upvals */ NULL, /* no upvals */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[ 5]) { /* constants */ - /* K0 */ be_nested_str_weak(plugins_config), - /* K1 */ be_nested_str_weak(keys), - /* K2 */ be_nested_str_weak(next_ep), - /* K3 */ be_const_int(1), - /* K4 */ be_nested_str_weak(stop_iteration), + ( &(const bvalue[ 2]) { /* constants */ + /* K0 */ be_nested_str_weak(udp_server), + /* K1 */ be_nested_str_weak(received_ack), }), - be_str_weak(adjust_next_ep), + be_str_weak(received_ack), &be_const_str_solidified, - ( &(const binstruction[21]) { /* code */ - 0x60040010, // 0000 GETGBL R1 G16 - 0x88080100, // 0001 GETMBR R2 R0 K0 - 0x8C080501, // 0002 GETMET R2 R2 K1 - 0x7C080200, // 0003 CALL R2 1 - 0x7C040200, // 0004 CALL R1 1 - 0xA802000A, // 0005 EXBLK 0 #0011 - 0x5C080200, // 0006 MOVE R2 R1 - 0x7C080000, // 0007 CALL R2 0 - 0x600C0009, // 0008 GETGBL R3 G9 - 0x5C100400, // 0009 MOVE R4 R2 - 0x7C0C0200, // 000A CALL R3 1 - 0x88100102, // 000B GETMBR R4 R0 K2 - 0x28100604, // 000C GE R4 R3 R4 - 0x78120001, // 000D JMPF R4 #0010 - 0x00100703, // 000E ADD R4 R3 K3 - 0x90020404, // 000F SETMBR R0 K2 R4 - 0x7001FFF4, // 0010 JMP #0006 - 0x58040004, // 0011 LDCONST R1 K4 - 0xAC040200, // 0012 CATCH R1 1 0 - 0xB0080000, // 0013 RAISE 2 R0 R0 - 0x80000000, // 0014 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: attribute_updated -********************************************************************/ -be_local_closure(Matter_Device_attribute_updated, /* name */ - be_nested_proto( - 10, /* nstack */ - 5, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 9]) { /* constants */ - /* K0 */ be_nested_str_weak(matter), - /* K1 */ be_nested_str_weak(Path), - /* K2 */ be_nested_str_weak(endpoint), - /* K3 */ be_nested_str_weak(cluster), - /* K4 */ be_nested_str_weak(attribute), - /* K5 */ be_nested_str_weak(message_handler), - /* K6 */ be_nested_str_weak(im), - /* K7 */ be_nested_str_weak(subs_shop), - /* K8 */ be_nested_str_weak(attribute_updated_ctx), - }), - be_str_weak(attribute_updated), - &be_const_str_solidified, - ( &(const binstruction[18]) { /* code */ - 0x4C140000, // 0000 LDNIL R5 - 0x1C140805, // 0001 EQ R5 R4 R5 - 0x78160000, // 0002 JMPF R5 #0004 - 0x50100000, // 0003 LDBOOL R4 0 0 - 0xB8160000, // 0004 GETNGBL R5 K0 - 0x8C140B01, // 0005 GETMET R5 R5 K1 - 0x7C140200, // 0006 CALL R5 1 - 0x90160401, // 0007 SETMBR R5 K2 R1 - 0x90160602, // 0008 SETMBR R5 K3 R2 - 0x90160803, // 0009 SETMBR R5 K4 R3 - 0x88180105, // 000A GETMBR R6 R0 K5 - 0x88180D06, // 000B GETMBR R6 R6 K6 - 0x88180D07, // 000C GETMBR R6 R6 K7 - 0x8C180D08, // 000D GETMET R6 R6 K8 - 0x5C200A00, // 000E MOVE R8 R5 - 0x5C240800, // 000F MOVE R9 R4 - 0x7C180600, // 0010 CALL R6 3 - 0x80000000, // 0011 RET 0 + ( &(const binstruction[ 5]) { /* code */ + 0x88080100, // 0000 GETMBR R2 R0 K0 + 0x8C080501, // 0001 GETMET R2 R2 K1 + 0x5C100200, // 0002 MOVE R4 R1 + 0x7C080400, // 0003 CALL R2 2 + 0x80040400, // 0004 RET 1 R2 }) ) ); @@ -3942,9 +4606,546 @@ be_local_closure(Matter_Device_every_second, /* name */ /******************************************************************** -** Solidified function: signal_endpoints_changed +** Solidified function: msg_received ********************************************************************/ -be_local_closure(Matter_Device_signal_endpoints_changed, /* name */ +be_local_closure(Matter_Device_msg_received, /* name */ + be_nested_proto( + 9, /* nstack */ + 4, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 2]) { /* constants */ + /* K0 */ be_nested_str_weak(message_handler), + /* K1 */ be_nested_str_weak(msg_received), + }), + be_str_weak(msg_received), + &be_const_str_solidified, + ( &(const binstruction[ 7]) { /* code */ + 0x88100100, // 0000 GETMBR R4 R0 K0 + 0x8C100901, // 0001 GETMET R4 R4 K1 + 0x5C180200, // 0002 MOVE R6 R1 + 0x5C1C0400, // 0003 MOVE R7 R2 + 0x5C200600, // 0004 MOVE R8 R3 + 0x7C100800, // 0005 CALL R4 4 + 0x80040800, // 0006 RET 1 R4 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: init +********************************************************************/ +be_local_closure(Matter_Device_init, /* name */ + be_nested_proto( + 8, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 1, /* has sup protos */ + ( &(const struct bproto*[ 2]) { + be_nested_proto( + 4, /* nstack */ + 0, /* argc */ + 0, /* varg */ + 1, /* has upvals */ + ( &(const bupvaldesc[ 1]) { /* upvals */ + be_local_const_upval(1, 0), + }), + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 5]) { /* constants */ + /* K0 */ be_nested_str_weak(start), + /* K1 */ be_nested_str_weak(tasmota), + /* K2 */ be_nested_str_weak(remove_rule), + /* K3 */ be_nested_str_weak(Wifi_X23Connected), + /* K4 */ be_nested_str_weak(matter_start), + }), + be_str_weak(_anonymous_), + &be_const_str_solidified, + ( &(const binstruction[ 9]) { /* code */ + 0x68000000, // 0000 GETUPV R0 U0 + 0x8C000100, // 0001 GETMET R0 R0 K0 + 0x7C000200, // 0002 CALL R0 1 + 0xB8020200, // 0003 GETNGBL R0 K1 + 0x8C000102, // 0004 GETMET R0 R0 K2 + 0x58080003, // 0005 LDCONST R2 K3 + 0x580C0004, // 0006 LDCONST R3 K4 + 0x7C000600, // 0007 CALL R0 3 + 0x80000000, // 0008 RET 0 + }) + ), + be_nested_proto( + 4, /* nstack */ + 0, /* argc */ + 0, /* varg */ + 1, /* has upvals */ + ( &(const bupvaldesc[ 1]) { /* upvals */ + be_local_const_upval(1, 0), + }), + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 5]) { /* constants */ + /* K0 */ be_nested_str_weak(start), + /* K1 */ be_nested_str_weak(tasmota), + /* K2 */ be_nested_str_weak(remove_rule), + /* K3 */ be_nested_str_weak(Eth_X23Connected), + /* K4 */ be_nested_str_weak(matter_start), + }), + be_str_weak(_anonymous_), + &be_const_str_solidified, + ( &(const binstruction[ 9]) { /* code */ + 0x68000000, // 0000 GETUPV R0 U0 + 0x8C000100, // 0001 GETMET R0 R0 K0 + 0x7C000200, // 0002 CALL R0 1 + 0xB8020200, // 0003 GETNGBL R0 K1 + 0x8C000102, // 0004 GETMET R0 R0 K2 + 0x58080003, // 0005 LDCONST R2 K3 + 0x580C0004, // 0006 LDCONST R3 K4 + 0x7C000600, // 0007 CALL R0 3 + 0x80000000, // 0008 RET 0 + }) + ), + }), + 1, /* has constants */ + ( &(const bvalue[43]) { /* constants */ + /* K0 */ be_nested_str_weak(crypto), + /* K1 */ be_nested_str_weak(string), + /* K2 */ be_nested_str_weak(tasmota), + /* K3 */ be_nested_str_weak(get_option), + /* K4 */ be_nested_str_weak(matter), + /* K5 */ be_nested_str_weak(MATTER_OPTION), + /* K6 */ be_nested_str_weak(UI), + /* K7 */ be_nested_str_weak(started), + /* K8 */ be_nested_str_weak(tick), + /* K9 */ be_const_int(0), + /* K10 */ be_nested_str_weak(plugins), + /* K11 */ be_nested_str_weak(plugins_persist), + /* K12 */ be_nested_str_weak(plugins_classes), + /* K13 */ be_nested_str_weak(register_native_classes), + /* K14 */ be_nested_str_weak(vendorid), + /* K15 */ be_nested_str_weak(VENDOR_ID), + /* K16 */ be_nested_str_weak(productid), + /* K17 */ be_nested_str_weak(PRODUCT_ID), + /* K18 */ be_nested_str_weak(root_iterations), + /* K19 */ be_nested_str_weak(PBKDF_ITERATIONS), + /* K20 */ be_nested_str_weak(next_ep), + /* K21 */ be_const_int(1), + /* K22 */ be_nested_str_weak(root_salt), + /* K23 */ be_nested_str_weak(random), + /* K24 */ be_nested_str_weak(ipv4only), + /* K25 */ be_nested_str_weak(load_param), + /* K26 */ be_nested_str_weak(sessions), + /* K27 */ be_nested_str_weak(Session_Store), + /* K28 */ be_nested_str_weak(load_fabrics), + /* K29 */ be_nested_str_weak(message_handler), + /* K30 */ be_nested_str_weak(MessageHandler), + /* K31 */ be_nested_str_weak(ui), + /* K32 */ be_nested_str_weak(wifi), + /* K33 */ be_nested_str_weak(up), + /* K34 */ be_nested_str_weak(eth), + /* K35 */ be_nested_str_weak(start), + /* K36 */ be_nested_str_weak(add_rule), + /* K37 */ be_nested_str_weak(Wifi_X23Connected), + /* K38 */ be_nested_str_weak(matter_start), + /* K39 */ be_nested_str_weak(Eth_X23Connected), + /* K40 */ be_nested_str_weak(_init_basic_commissioning), + /* K41 */ be_nested_str_weak(add_driver), + /* K42 */ be_nested_str_weak(register_commands), + }), + be_str_weak(init), + &be_const_str_solidified, + ( &(const binstruction[103]) { /* code */ + 0xA4060000, // 0000 IMPORT R1 K0 + 0xA40A0200, // 0001 IMPORT R2 K1 + 0xB80E0400, // 0002 GETNGBL R3 K2 + 0x8C0C0703, // 0003 GETMET R3 R3 K3 + 0xB8160800, // 0004 GETNGBL R5 K4 + 0x88140B05, // 0005 GETMBR R5 R5 K5 + 0x7C0C0400, // 0006 CALL R3 2 + 0x740E0004, // 0007 JMPT R3 #000D + 0xB80E0800, // 0008 GETNGBL R3 K4 + 0x8C0C0706, // 0009 GETMET R3 R3 K6 + 0x5C140000, // 000A MOVE R5 R0 + 0x7C0C0400, // 000B CALL R3 2 + 0x80000600, // 000C RET 0 + 0x500C0000, // 000D LDBOOL R3 0 0 + 0x90020E03, // 000E SETMBR R0 K7 R3 + 0x90021109, // 000F SETMBR R0 K8 K9 + 0x600C0012, // 0010 GETGBL R3 G18 + 0x7C0C0000, // 0011 CALL R3 0 + 0x90021403, // 0012 SETMBR R0 K10 R3 + 0x500C0000, // 0013 LDBOOL R3 0 0 + 0x90021603, // 0014 SETMBR R0 K11 R3 + 0x600C0013, // 0015 GETGBL R3 G19 + 0x7C0C0000, // 0016 CALL R3 0 + 0x90021803, // 0017 SETMBR R0 K12 R3 + 0x8C0C010D, // 0018 GETMET R3 R0 K13 + 0x7C0C0200, // 0019 CALL R3 1 + 0x880C010F, // 001A GETMBR R3 R0 K15 + 0x90021C03, // 001B SETMBR R0 K14 R3 + 0x880C0111, // 001C GETMBR R3 R0 K17 + 0x90022003, // 001D SETMBR R0 K16 R3 + 0x880C0113, // 001E GETMBR R3 R0 K19 + 0x90022403, // 001F SETMBR R0 K18 R3 + 0x90022915, // 0020 SETMBR R0 K20 K21 + 0x8C0C0317, // 0021 GETMET R3 R1 K23 + 0x5416000F, // 0022 LDINT R5 16 + 0x7C0C0400, // 0023 CALL R3 2 + 0x90022C03, // 0024 SETMBR R0 K22 R3 + 0x500C0000, // 0025 LDBOOL R3 0 0 + 0x90023003, // 0026 SETMBR R0 K24 R3 + 0x8C0C0119, // 0027 GETMET R3 R0 K25 + 0x7C0C0200, // 0028 CALL R3 1 + 0xB80E0800, // 0029 GETNGBL R3 K4 + 0x8C0C071B, // 002A GETMET R3 R3 K27 + 0x5C140000, // 002B MOVE R5 R0 + 0x7C0C0400, // 002C CALL R3 2 + 0x90023403, // 002D SETMBR R0 K26 R3 + 0x880C011A, // 002E GETMBR R3 R0 K26 + 0x8C0C071C, // 002F GETMET R3 R3 K28 + 0x7C0C0200, // 0030 CALL R3 1 + 0xB80E0800, // 0031 GETNGBL R3 K4 + 0x8C0C071E, // 0032 GETMET R3 R3 K30 + 0x5C140000, // 0033 MOVE R5 R0 + 0x7C0C0400, // 0034 CALL R3 2 + 0x90023A03, // 0035 SETMBR R0 K29 R3 + 0xB80E0800, // 0036 GETNGBL R3 K4 + 0x8C0C0706, // 0037 GETMET R3 R3 K6 + 0x5C140000, // 0038 MOVE R5 R0 + 0x7C0C0400, // 0039 CALL R3 2 + 0x90023E03, // 003A SETMBR R0 K31 R3 + 0xB80E0400, // 003B GETNGBL R3 K2 + 0x8C0C0720, // 003C GETMET R3 R3 K32 + 0x7C0C0200, // 003D CALL R3 1 + 0x940C0721, // 003E GETIDX R3 R3 K33 + 0x740E0004, // 003F JMPT R3 #0045 + 0xB80E0400, // 0040 GETNGBL R3 K2 + 0x8C0C0722, // 0041 GETMET R3 R3 K34 + 0x7C0C0200, // 0042 CALL R3 1 + 0x940C0721, // 0043 GETIDX R3 R3 K33 + 0x780E0001, // 0044 JMPF R3 #0047 + 0x8C0C0123, // 0045 GETMET R3 R0 K35 + 0x7C0C0200, // 0046 CALL R3 1 + 0xB80E0400, // 0047 GETNGBL R3 K2 + 0x8C0C0720, // 0048 GETMET R3 R3 K32 + 0x7C0C0200, // 0049 CALL R3 1 + 0x940C0721, // 004A GETIDX R3 R3 K33 + 0x740E0005, // 004B JMPT R3 #0052 + 0xB80E0400, // 004C GETNGBL R3 K2 + 0x8C0C0724, // 004D GETMET R3 R3 K36 + 0x58140025, // 004E LDCONST R5 K37 + 0x84180000, // 004F CLOSURE R6 P0 + 0x581C0026, // 0050 LDCONST R7 K38 + 0x7C0C0800, // 0051 CALL R3 4 + 0xB80E0400, // 0052 GETNGBL R3 K2 + 0x8C0C0722, // 0053 GETMET R3 R3 K34 + 0x7C0C0200, // 0054 CALL R3 1 + 0x940C0721, // 0055 GETIDX R3 R3 K33 + 0x740E0005, // 0056 JMPT R3 #005D + 0xB80E0400, // 0057 GETNGBL R3 K2 + 0x8C0C0724, // 0058 GETMET R3 R3 K36 + 0x58140027, // 0059 LDCONST R5 K39 + 0x84180001, // 005A CLOSURE R6 P1 + 0x581C0026, // 005B LDCONST R7 K38 + 0x7C0C0800, // 005C CALL R3 4 + 0x8C0C0128, // 005D GETMET R3 R0 K40 + 0x7C0C0200, // 005E CALL R3 1 + 0xB80E0400, // 005F GETNGBL R3 K2 + 0x8C0C0729, // 0060 GETMET R3 R3 K41 + 0x5C140000, // 0061 MOVE R5 R0 + 0x7C0C0400, // 0062 CALL R3 2 + 0x8C0C012A, // 0063 GETMET R3 R0 K42 + 0x7C0C0200, // 0064 CALL R3 1 + 0xA0000000, // 0065 CLOSE R0 + 0x80000000, // 0066 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: start +********************************************************************/ +be_local_closure(Matter_Device_start, /* name */ + be_nested_proto( + 6, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 1, /* has sup protos */ + ( &(const struct bproto*[ 1]) { + be_nested_proto( + 2, /* nstack */ + 0, /* argc */ + 0, /* varg */ + 1, /* has upvals */ + ( &(const bupvaldesc[ 1]) { /* upvals */ + be_local_const_upval(1, 0), + }), + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 1]) { /* constants */ + /* K0 */ be_nested_str_weak(_trigger_read_sensors), + }), + be_str_weak(_anonymous_), + &be_const_str_solidified, + ( &(const binstruction[ 4]) { /* code */ + 0x68000000, // 0000 GETUPV R0 U0 + 0x8C000100, // 0001 GETMET R0 R0 K0 + 0x7C000200, // 0002 CALL R0 1 + 0x80000000, // 0003 RET 0 + }) + ), + }), + 1, /* has constants */ + ( &(const bvalue[ 9]) { /* constants */ + /* K0 */ be_nested_str_weak(started), + /* K1 */ be_nested_str_weak(autoconf_device), + /* K2 */ be_nested_str_weak(tasmota), + /* K3 */ be_nested_str_weak(add_cron), + /* K4 */ be_nested_str_weak(_X2A_X2F30_X20_X2A_X20_X2A_X20_X2A_X20_X2A_X20_X2A), + /* K5 */ be_nested_str_weak(matter_sensors_30s), + /* K6 */ be_nested_str_weak(_start_udp), + /* K7 */ be_nested_str_weak(UDP_PORT), + /* K8 */ be_nested_str_weak(start_mdns_announce_hostnames), + }), + be_str_weak(start), + &be_const_str_solidified, + ( &(const binstruction[20]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x78060000, // 0001 JMPF R1 #0003 + 0x80000200, // 0002 RET 0 + 0x8C040101, // 0003 GETMET R1 R0 K1 + 0x7C040200, // 0004 CALL R1 1 + 0xB8060400, // 0005 GETNGBL R1 K2 + 0x8C040303, // 0006 GETMET R1 R1 K3 + 0x580C0004, // 0007 LDCONST R3 K4 + 0x84100000, // 0008 CLOSURE R4 P0 + 0x58140005, // 0009 LDCONST R5 K5 + 0x7C040800, // 000A CALL R1 4 + 0x8C040106, // 000B GETMET R1 R0 K6 + 0x880C0107, // 000C GETMBR R3 R0 K7 + 0x7C040400, // 000D CALL R1 2 + 0x8C040108, // 000E GETMET R1 R0 K8 + 0x7C040200, // 000F CALL R1 1 + 0x50040200, // 0010 LDBOOL R1 1 0 + 0x90020001, // 0011 SETMBR R0 K0 R1 + 0xA0000000, // 0012 CLOSE R0 + 0x80000000, // 0013 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: start_commissioning_complete_deferred +********************************************************************/ +be_local_closure(Matter_Device_start_commissioning_complete_deferred, /* name */ + be_nested_proto( + 6, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 1, /* has sup protos */ + ( &(const struct bproto*[ 1]) { + be_nested_proto( + 3, /* nstack */ + 0, /* argc */ + 0, /* varg */ + 1, /* has upvals */ + ( &(const bupvaldesc[ 2]) { /* upvals */ + be_local_const_upval(1, 0), + be_local_const_upval(1, 1), + }), + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 1]) { /* constants */ + /* K0 */ be_nested_str_weak(start_commissioning_complete), + }), + be_str_weak(_X3Clambda_X3E), + &be_const_str_solidified, + ( &(const binstruction[ 5]) { /* code */ + 0x68000000, // 0000 GETUPV R0 U0 + 0x8C000100, // 0001 GETMET R0 R0 K0 + 0x68080001, // 0002 GETUPV R2 U1 + 0x7C000400, // 0003 CALL R0 2 + 0x80040000, // 0004 RET 1 R0 + }) + ), + }), + 1, /* has constants */ + ( &(const bvalue[ 3]) { /* constants */ + /* K0 */ be_nested_str_weak(tasmota), + /* K1 */ be_nested_str_weak(set_timer), + /* K2 */ be_const_int(0), + }), + be_str_weak(start_commissioning_complete_deferred), + &be_const_str_solidified, + ( &(const binstruction[ 7]) { /* code */ + 0xB80A0000, // 0000 GETNGBL R2 K0 + 0x8C080501, // 0001 GETMET R2 R2 K1 + 0x58100002, // 0002 LDCONST R4 K2 + 0x84140000, // 0003 CLOSURE R5 P0 + 0x7C080600, // 0004 CALL R2 3 + 0xA0000000, // 0005 CLOSE R0 + 0x80000000, // 0006 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: start_mdns_announce_hostnames +********************************************************************/ +be_local_closure(Matter_Device_start_mdns_announce_hostnames, /* name */ + be_nested_proto( + 6, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 1, /* has sup protos */ + ( &(const struct bproto*[ 2]) { + be_nested_proto( + 4, /* nstack */ + 0, /* argc */ + 0, /* varg */ + 1, /* has upvals */ + ( &(const bupvaldesc[ 1]) { /* upvals */ + be_local_const_upval(1, 0), + }), + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 5]) { /* constants */ + /* K0 */ be_nested_str_weak(_mdns_announce_hostname), + /* K1 */ be_nested_str_weak(tasmota), + /* K2 */ be_nested_str_weak(remove_rule), + /* K3 */ be_nested_str_weak(Wifi_X23Connected), + /* K4 */ be_nested_str_weak(matter_mdns_host), + }), + be_str_weak(_anonymous_), + &be_const_str_solidified, + ( &(const binstruction[10]) { /* code */ + 0x68000000, // 0000 GETUPV R0 U0 + 0x8C000100, // 0001 GETMET R0 R0 K0 + 0x50080000, // 0002 LDBOOL R2 0 0 + 0x7C000400, // 0003 CALL R0 2 + 0xB8020200, // 0004 GETNGBL R0 K1 + 0x8C000102, // 0005 GETMET R0 R0 K2 + 0x58080003, // 0006 LDCONST R2 K3 + 0x580C0004, // 0007 LDCONST R3 K4 + 0x7C000600, // 0008 CALL R0 3 + 0x80000000, // 0009 RET 0 + }) + ), + be_nested_proto( + 4, /* nstack */ + 0, /* argc */ + 0, /* varg */ + 1, /* has upvals */ + ( &(const bupvaldesc[ 1]) { /* upvals */ + be_local_const_upval(1, 0), + }), + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 5]) { /* constants */ + /* K0 */ be_nested_str_weak(_mdns_announce_hostname), + /* K1 */ be_nested_str_weak(tasmota), + /* K2 */ be_nested_str_weak(remove_rule), + /* K3 */ be_nested_str_weak(Eth_X23Connected), + /* K4 */ be_nested_str_weak(matter_mdns_host), + }), + be_str_weak(_anonymous_), + &be_const_str_solidified, + ( &(const binstruction[10]) { /* code */ + 0x68000000, // 0000 GETUPV R0 U0 + 0x8C000100, // 0001 GETMET R0 R0 K0 + 0x50080200, // 0002 LDBOOL R2 1 0 + 0x7C000400, // 0003 CALL R0 2 + 0xB8020200, // 0004 GETNGBL R0 K1 + 0x8C000102, // 0005 GETMET R0 R0 K2 + 0x58080003, // 0006 LDCONST R2 K3 + 0x580C0004, // 0007 LDCONST R3 K4 + 0x7C000600, // 0008 CALL R0 3 + 0x80000000, // 0009 RET 0 + }) + ), + }), + 1, /* has constants */ + ( &(const bvalue[ 9]) { /* constants */ + /* K0 */ be_nested_str_weak(tasmota), + /* K1 */ be_nested_str_weak(wifi), + /* K2 */ be_nested_str_weak(up), + /* K3 */ be_nested_str_weak(_mdns_announce_hostname), + /* K4 */ be_nested_str_weak(add_rule), + /* K5 */ be_nested_str_weak(Wifi_X23Connected), + /* K6 */ be_nested_str_weak(matter_mdns_host), + /* K7 */ be_nested_str_weak(eth), + /* K8 */ be_nested_str_weak(Eth_X23Connected), + }), + be_str_weak(start_mdns_announce_hostnames), + &be_const_str_solidified, + ( &(const binstruction[32]) { /* code */ + 0xB8060000, // 0000 GETNGBL R1 K0 + 0x8C040301, // 0001 GETMET R1 R1 K1 + 0x7C040200, // 0002 CALL R1 1 + 0x94040302, // 0003 GETIDX R1 R1 K2 + 0x78060003, // 0004 JMPF R1 #0009 + 0x8C040103, // 0005 GETMET R1 R0 K3 + 0x500C0000, // 0006 LDBOOL R3 0 0 + 0x7C040400, // 0007 CALL R1 2 + 0x70020005, // 0008 JMP #000F + 0xB8060000, // 0009 GETNGBL R1 K0 + 0x8C040304, // 000A GETMET R1 R1 K4 + 0x580C0005, // 000B LDCONST R3 K5 + 0x84100000, // 000C CLOSURE R4 P0 + 0x58140006, // 000D LDCONST R5 K6 + 0x7C040800, // 000E CALL R1 4 + 0xB8060000, // 000F GETNGBL R1 K0 + 0x8C040307, // 0010 GETMET R1 R1 K7 + 0x7C040200, // 0011 CALL R1 1 + 0x94040302, // 0012 GETIDX R1 R1 K2 + 0x78060003, // 0013 JMPF R1 #0018 + 0x8C040103, // 0014 GETMET R1 R0 K3 + 0x500C0200, // 0015 LDBOOL R3 1 0 + 0x7C040400, // 0016 CALL R1 2 + 0x70020005, // 0017 JMP #001E + 0xB8060000, // 0018 GETNGBL R1 K0 + 0x8C040304, // 0019 GETMET R1 R1 K4 + 0x580C0008, // 001A LDCONST R3 K8 + 0x84100001, // 001B CLOSURE R4 P1 + 0x58140006, // 001C LDCONST R5 K6 + 0x7C040800, // 001D CALL R1 4 + 0xA0000000, // 001E CLOSE R0 + 0x80000000, // 001F RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: autoconf_device +********************************************************************/ +be_local_closure(Matter_Device_autoconf_device, /* name */ be_nested_proto( 7, /* nstack */ 1, /* argc */ @@ -3954,79 +5155,65 @@ be_local_closure(Matter_Device_signal_endpoints_changed, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[ 3]) { /* constants */ - /* K0 */ be_nested_str_weak(attribute_updated), - /* K1 */ be_const_int(0), - /* K2 */ be_const_int(3), + ( &(const bvalue[16]) { /* constants */ + /* K0 */ be_nested_str_weak(string), + /* K1 */ be_nested_str_weak(json), + /* K2 */ be_nested_str_weak(plugins), + /* K3 */ be_const_int(0), + /* K4 */ be_nested_str_weak(plugins_persist), + /* K5 */ be_nested_str_weak(plugins_config), + /* K6 */ be_nested_str_weak(autoconf_device_map), + /* K7 */ be_nested_str_weak(adjust_next_ep), + /* K8 */ be_nested_str_weak(tasmota), + /* K9 */ be_nested_str_weak(log), + /* K10 */ be_nested_str_weak(MTR_X3A_X20autoconfig_X20_X3D_X20), + /* K11 */ be_const_int(3), + /* K12 */ be_nested_str_weak(_instantiate_plugins_from_config), + /* K13 */ be_nested_str_weak(sessions), + /* K14 */ be_nested_str_weak(count_active_fabrics), + /* K15 */ be_nested_str_weak(save_param), }), - be_str_weak(signal_endpoints_changed), + be_str_weak(autoconf_device), &be_const_str_solidified, - ( &(const binstruction[13]) { /* code */ - 0x8C040100, // 0000 GETMET R1 R0 K0 - 0x580C0001, // 0001 LDCONST R3 K1 - 0x5412001C, // 0002 LDINT R4 29 - 0x58140002, // 0003 LDCONST R5 K2 - 0x50180000, // 0004 LDBOOL R6 0 0 - 0x7C040A00, // 0005 CALL R1 5 - 0x8C040100, // 0006 GETMET R1 R0 K0 - 0x540EFEFF, // 0007 LDINT R3 65280 - 0x5412001C, // 0008 LDINT R4 29 - 0x58140002, // 0009 LDCONST R5 K2 - 0x50180000, // 000A LDBOOL R6 0 0 - 0x7C040A00, // 000B CALL R1 5 - 0x80000000, // 000C RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: mdns_announce_op_discovery_all_fabrics -********************************************************************/ -be_local_closure(Matter_Device_mdns_announce_op_discovery_all_fabrics, /* name */ - be_nested_proto( - 6, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 6]) { /* constants */ - /* K0 */ be_nested_str_weak(sessions), - /* K1 */ be_nested_str_weak(active_fabrics), - /* K2 */ be_nested_str_weak(get_device_id), - /* K3 */ be_nested_str_weak(get_fabric_id), - /* K4 */ be_nested_str_weak(mdns_announce_op_discovery), - /* K5 */ be_nested_str_weak(stop_iteration), - }), - be_str_weak(mdns_announce_op_discovery_all_fabrics), - &be_const_str_solidified, - ( &(const binstruction[22]) { /* code */ - 0x60040010, // 0000 GETGBL R1 G16 - 0x88080100, // 0001 GETMBR R2 R0 K0 - 0x8C080501, // 0002 GETMET R2 R2 K1 - 0x7C080200, // 0003 CALL R2 1 - 0x7C040200, // 0004 CALL R1 1 - 0xA802000B, // 0005 EXBLK 0 #0012 - 0x5C080200, // 0006 MOVE R2 R1 - 0x7C080000, // 0007 CALL R2 0 - 0x8C0C0502, // 0008 GETMET R3 R2 K2 - 0x7C0C0200, // 0009 CALL R3 1 - 0x780E0005, // 000A JMPF R3 #0011 - 0x8C0C0503, // 000B GETMET R3 R2 K3 - 0x7C0C0200, // 000C CALL R3 1 - 0x780E0002, // 000D JMPF R3 #0011 - 0x8C0C0104, // 000E GETMET R3 R0 K4 - 0x5C140400, // 000F MOVE R5 R2 - 0x7C0C0400, // 0010 CALL R3 2 - 0x7001FFF3, // 0011 JMP #0006 - 0x58040005, // 0012 LDCONST R1 K5 - 0xAC040200, // 0013 CATCH R1 1 0 - 0xB0080000, // 0014 RAISE 2 R0 R0 - 0x80000000, // 0015 RET 0 + ( &(const binstruction[38]) { /* code */ + 0xA4060000, // 0000 IMPORT R1 K0 + 0xA40A0200, // 0001 IMPORT R2 K1 + 0x600C000C, // 0002 GETGBL R3 G12 + 0x88100102, // 0003 GETMBR R4 R0 K2 + 0x7C0C0200, // 0004 CALL R3 1 + 0x240C0703, // 0005 GT R3 R3 K3 + 0x780E0000, // 0006 JMPF R3 #0008 + 0x80000600, // 0007 RET 0 + 0x880C0104, // 0008 GETMBR R3 R0 K4 + 0x740E000C, // 0009 JMPT R3 #0017 + 0x8C0C0106, // 000A GETMET R3 R0 K6 + 0x7C0C0200, // 000B CALL R3 1 + 0x90020A03, // 000C SETMBR R0 K5 R3 + 0x8C0C0107, // 000D GETMET R3 R0 K7 + 0x7C0C0200, // 000E CALL R3 1 + 0xB80E1000, // 000F GETNGBL R3 K8 + 0x8C0C0709, // 0010 GETMET R3 R3 K9 + 0x60140008, // 0011 GETGBL R5 G8 + 0x88180105, // 0012 GETMBR R6 R0 K5 + 0x7C140200, // 0013 CALL R5 1 + 0x00161405, // 0014 ADD R5 K10 R5 + 0x5818000B, // 0015 LDCONST R6 K11 + 0x7C0C0600, // 0016 CALL R3 3 + 0x8C0C010C, // 0017 GETMET R3 R0 K12 + 0x88140105, // 0018 GETMBR R5 R0 K5 + 0x7C0C0400, // 0019 CALL R3 2 + 0x880C0104, // 001A GETMBR R3 R0 K4 + 0x740E0008, // 001B JMPT R3 #0025 + 0x880C010D, // 001C GETMBR R3 R0 K13 + 0x8C0C070E, // 001D GETMET R3 R3 K14 + 0x7C0C0200, // 001E CALL R3 1 + 0x240C0703, // 001F GT R3 R3 K3 + 0x780E0003, // 0020 JMPF R3 #0025 + 0x500C0200, // 0021 LDBOOL R3 1 0 + 0x90020803, // 0022 SETMBR R0 K4 R3 + 0x8C0C010F, // 0023 GETMET R3 R0 K15 + 0x7C0C0200, // 0024 CALL R3 1 + 0x80000000, // 0025 RET 0 }) ) ); @@ -4046,7 +5233,7 @@ be_local_closure(Matter_Device_autoconf_device_map, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[51]) { /* constants */ + ( &(const bvalue[38]) { /* constants */ /* K0 */ be_nested_str_weak(string), /* K1 */ be_nested_str_weak(json), /* K2 */ be_const_int(1), @@ -4083,25 +5270,12 @@ be_local_closure(Matter_Device_autoconf_device_map, /* name */ /* K33 */ be_nested_str_weak(relay), /* K34 */ be_nested_str_weak(load), /* K35 */ be_nested_str_weak(read_sensors), - /* K36 */ be_nested_str_weak(k2l), - /* K37 */ be_nested_str_weak(Temperature), - /* K38 */ be_nested_str_weak(_X23Temperature), - /* K39 */ be_nested_str_weak(temperature), - /* K40 */ be_nested_str_weak(filter), - /* K41 */ be_nested_str_weak(stop_iteration), - /* K42 */ be_nested_str_weak(Pressure), - /* K43 */ be_nested_str_weak(_X23Pressure), - /* K44 */ be_nested_str_weak(pressure), - /* K45 */ be_nested_str_weak(Illuminance), - /* K46 */ be_nested_str_weak(_X23Illuminance), - /* K47 */ be_nested_str_weak(illuminance), - /* K48 */ be_nested_str_weak(Humidity), - /* K49 */ be_nested_str_weak(_X23Humidity), - /* K50 */ be_nested_str_weak(humidity), + /* K36 */ be_nested_str_weak(autoconf_sensors_list), + /* K37 */ be_nested_str_weak(stop_iteration), }), be_str_weak(autoconf_device_map), &be_const_str_solidified, - ( &(const binstruction[310]) { /* code */ + ( &(const binstruction[200]) { /* code */ 0xA4060000, // 0000 IMPORT R1 K0 0xA40A0200, // 0001 IMPORT R2 K1 0x600C0013, // 0002 GETGBL R3 G19 @@ -4283,135 +5457,25 @@ be_local_closure(Matter_Device_autoconf_device_map, /* name */ 0x8C381D23, // 00B2 GETMET R14 R14 K35 0x7C380200, // 00B3 CALL R14 1 0x7C300400, // 00B4 CALL R12 2 - 0x60340010, // 00B5 GETGBL R13 G16 - 0x8C380124, // 00B6 GETMET R14 R0 K36 - 0x5C401800, // 00B7 MOVE R16 R12 - 0x7C380400, // 00B8 CALL R14 2 - 0x7C340200, // 00B9 CALL R13 1 - 0xA8020016, // 00BA EXBLK 0 #00D2 - 0x5C381A00, // 00BB MOVE R14 R13 - 0x7C380000, // 00BC CALL R14 0 - 0x943C180E, // 00BD GETIDX R15 R12 R14 - 0x6040000F, // 00BE GETGBL R16 G15 - 0x5C441E00, // 00BF MOVE R17 R15 - 0x60480013, // 00C0 GETGBL R18 G19 - 0x7C400400, // 00C1 CALL R16 2 - 0x7842000D, // 00C2 JMPF R16 #00D1 - 0x8C401F14, // 00C3 GETMET R16 R15 K20 - 0x58480025, // 00C4 LDCONST R18 K37 - 0x7C400400, // 00C5 CALL R16 2 - 0x78420009, // 00C6 JMPF R16 #00D1 - 0x00401D26, // 00C7 ADD R16 R14 K38 - 0x60440008, // 00C8 GETGBL R17 G8 - 0x5C480800, // 00C9 MOVE R18 R4 - 0x7C440200, // 00CA CALL R17 1 - 0x60480013, // 00CB GETGBL R18 G19 - 0x7C480000, // 00CC CALL R18 0 - 0x984A1327, // 00CD SETIDX R18 K9 K39 - 0x984A5010, // 00CE SETIDX R18 K40 R16 - 0x980C2212, // 00CF SETIDX R3 R17 R18 - 0x00100902, // 00D0 ADD R4 R4 K2 - 0x7001FFE8, // 00D1 JMP #00BB - 0x58340029, // 00D2 LDCONST R13 K41 - 0xAC340200, // 00D3 CATCH R13 1 0 - 0xB0080000, // 00D4 RAISE 2 R0 R0 - 0x60340010, // 00D5 GETGBL R13 G16 - 0x8C380124, // 00D6 GETMET R14 R0 K36 - 0x5C401800, // 00D7 MOVE R16 R12 - 0x7C380400, // 00D8 CALL R14 2 - 0x7C340200, // 00D9 CALL R13 1 - 0xA8020016, // 00DA EXBLK 0 #00F2 - 0x5C381A00, // 00DB MOVE R14 R13 - 0x7C380000, // 00DC CALL R14 0 - 0x943C180E, // 00DD GETIDX R15 R12 R14 - 0x6040000F, // 00DE GETGBL R16 G15 - 0x5C441E00, // 00DF MOVE R17 R15 - 0x60480013, // 00E0 GETGBL R18 G19 - 0x7C400400, // 00E1 CALL R16 2 - 0x7842000D, // 00E2 JMPF R16 #00F1 - 0x8C401F14, // 00E3 GETMET R16 R15 K20 - 0x5848002A, // 00E4 LDCONST R18 K42 - 0x7C400400, // 00E5 CALL R16 2 - 0x78420009, // 00E6 JMPF R16 #00F1 - 0x00401D2B, // 00E7 ADD R16 R14 K43 - 0x60440008, // 00E8 GETGBL R17 G8 - 0x5C480800, // 00E9 MOVE R18 R4 - 0x7C440200, // 00EA CALL R17 1 - 0x60480013, // 00EB GETGBL R18 G19 - 0x7C480000, // 00EC CALL R18 0 - 0x984A132C, // 00ED SETIDX R18 K9 K44 - 0x984A5010, // 00EE SETIDX R18 K40 R16 - 0x980C2212, // 00EF SETIDX R3 R17 R18 - 0x00100902, // 00F0 ADD R4 R4 K2 - 0x7001FFE8, // 00F1 JMP #00DB - 0x58340029, // 00F2 LDCONST R13 K41 - 0xAC340200, // 00F3 CATCH R13 1 0 - 0xB0080000, // 00F4 RAISE 2 R0 R0 - 0x60340010, // 00F5 GETGBL R13 G16 - 0x8C380124, // 00F6 GETMET R14 R0 K36 - 0x5C401800, // 00F7 MOVE R16 R12 - 0x7C380400, // 00F8 CALL R14 2 - 0x7C340200, // 00F9 CALL R13 1 - 0xA8020016, // 00FA EXBLK 0 #0112 - 0x5C381A00, // 00FB MOVE R14 R13 - 0x7C380000, // 00FC CALL R14 0 - 0x943C180E, // 00FD GETIDX R15 R12 R14 - 0x6040000F, // 00FE GETGBL R16 G15 - 0x5C441E00, // 00FF MOVE R17 R15 - 0x60480013, // 0100 GETGBL R18 G19 - 0x7C400400, // 0101 CALL R16 2 - 0x7842000D, // 0102 JMPF R16 #0111 - 0x8C401F14, // 0103 GETMET R16 R15 K20 - 0x5848002D, // 0104 LDCONST R18 K45 - 0x7C400400, // 0105 CALL R16 2 - 0x78420009, // 0106 JMPF R16 #0111 - 0x00401D2E, // 0107 ADD R16 R14 K46 - 0x60440008, // 0108 GETGBL R17 G8 - 0x5C480800, // 0109 MOVE R18 R4 - 0x7C440200, // 010A CALL R17 1 - 0x60480013, // 010B GETGBL R18 G19 - 0x7C480000, // 010C CALL R18 0 - 0x984A132F, // 010D SETIDX R18 K9 K47 - 0x984A5010, // 010E SETIDX R18 K40 R16 - 0x980C2212, // 010F SETIDX R3 R17 R18 - 0x00100902, // 0110 ADD R4 R4 K2 - 0x7001FFE8, // 0111 JMP #00FB - 0x58340029, // 0112 LDCONST R13 K41 - 0xAC340200, // 0113 CATCH R13 1 0 - 0xB0080000, // 0114 RAISE 2 R0 R0 - 0x60340010, // 0115 GETGBL R13 G16 - 0x8C380124, // 0116 GETMET R14 R0 K36 - 0x5C401800, // 0117 MOVE R16 R12 - 0x7C380400, // 0118 CALL R14 2 - 0x7C340200, // 0119 CALL R13 1 - 0xA8020016, // 011A EXBLK 0 #0132 - 0x5C381A00, // 011B MOVE R14 R13 - 0x7C380000, // 011C CALL R14 0 - 0x943C180E, // 011D GETIDX R15 R12 R14 - 0x6040000F, // 011E GETGBL R16 G15 - 0x5C441E00, // 011F MOVE R17 R15 - 0x60480013, // 0120 GETGBL R18 G19 - 0x7C400400, // 0121 CALL R16 2 - 0x7842000D, // 0122 JMPF R16 #0131 - 0x8C401F14, // 0123 GETMET R16 R15 K20 - 0x58480030, // 0124 LDCONST R18 K48 - 0x7C400400, // 0125 CALL R16 2 - 0x78420009, // 0126 JMPF R16 #0131 - 0x00401D31, // 0127 ADD R16 R14 K49 - 0x60440008, // 0128 GETGBL R17 G8 - 0x5C480800, // 0129 MOVE R18 R4 - 0x7C440200, // 012A CALL R17 1 - 0x60480013, // 012B GETGBL R18 G19 - 0x7C480000, // 012C CALL R18 0 - 0x984A1332, // 012D SETIDX R18 K9 K50 - 0x984A5010, // 012E SETIDX R18 K40 R16 - 0x980C2212, // 012F SETIDX R3 R17 R18 - 0x00100902, // 0130 ADD R4 R4 K2 - 0x7001FFE8, // 0131 JMP #011B - 0x58340029, // 0132 LDCONST R13 K41 - 0xAC340200, // 0133 CATCH R13 1 0 - 0xB0080000, // 0134 RAISE 2 R0 R0 - 0x80040600, // 0135 RET 1 R3 + 0x8C340124, // 00B5 GETMET R13 R0 K36 + 0x5C3C1800, // 00B6 MOVE R15 R12 + 0x7C340400, // 00B7 CALL R13 2 + 0x60380010, // 00B8 GETGBL R14 G16 + 0x5C3C1A00, // 00B9 MOVE R15 R13 + 0x7C380200, // 00BA CALL R14 1 + 0xA8020007, // 00BB EXBLK 0 #00C4 + 0x5C3C1C00, // 00BC MOVE R15 R14 + 0x7C3C0000, // 00BD CALL R15 0 + 0x60400008, // 00BE GETGBL R16 G8 + 0x5C440800, // 00BF MOVE R17 R4 + 0x7C400200, // 00C0 CALL R16 1 + 0x980C200F, // 00C1 SETIDX R3 R16 R15 + 0x00100902, // 00C2 ADD R4 R4 K2 + 0x7001FFF7, // 00C3 JMP #00BC + 0x58380025, // 00C4 LDCONST R14 K37 + 0xAC380200, // 00C5 CATCH R14 1 0 + 0xB0080000, // 00C6 RAISE 2 R0 R0 + 0x80040600, // 00C7 RET 1 R3 }) ) ); @@ -4419,57 +5483,50 @@ be_local_closure(Matter_Device_autoconf_device_map, /* name */ /******************************************************************** -** Solidified function: get_active_endpoints +** Solidified function: attribute_updated ********************************************************************/ -be_local_closure(Matter_Device_get_active_endpoints, /* name */ +be_local_closure(Matter_Device_attribute_updated, /* name */ be_nested_proto( - 9, /* nstack */ - 2, /* argc */ + 10, /* nstack */ + 5, /* argc */ 2, /* varg */ 0, /* has upvals */ NULL, /* no upvals */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[ 6]) { /* constants */ - /* K0 */ be_nested_str_weak(plugins), - /* K1 */ be_nested_str_weak(get_endpoint), - /* K2 */ be_const_int(0), - /* K3 */ be_nested_str_weak(find), - /* K4 */ be_nested_str_weak(push), - /* K5 */ be_nested_str_weak(stop_iteration), + ( &(const bvalue[ 9]) { /* constants */ + /* K0 */ be_nested_str_weak(matter), + /* K1 */ be_nested_str_weak(Path), + /* K2 */ be_nested_str_weak(endpoint), + /* K3 */ be_nested_str_weak(cluster), + /* K4 */ be_nested_str_weak(attribute), + /* K5 */ be_nested_str_weak(message_handler), + /* K6 */ be_nested_str_weak(im), + /* K7 */ be_nested_str_weak(subs_shop), + /* K8 */ be_nested_str_weak(attribute_updated_ctx), }), - be_str_weak(get_active_endpoints), + be_str_weak(attribute_updated), &be_const_str_solidified, - ( &(const binstruction[28]) { /* code */ - 0x60080012, // 0000 GETGBL R2 G18 - 0x7C080000, // 0001 CALL R2 0 - 0x600C0010, // 0002 GETGBL R3 G16 - 0x88100100, // 0003 GETMBR R4 R0 K0 - 0x7C0C0200, // 0004 CALL R3 1 - 0xA8020011, // 0005 EXBLK 0 #0018 - 0x5C100600, // 0006 MOVE R4 R3 - 0x7C100000, // 0007 CALL R4 0 - 0x8C140901, // 0008 GETMET R5 R4 K1 - 0x7C140200, // 0009 CALL R5 1 - 0x78060002, // 000A JMPF R1 #000E - 0x1C180B02, // 000B EQ R6 R5 K2 - 0x781A0000, // 000C JMPF R6 #000E - 0x7001FFF7, // 000D JMP #0006 - 0x8C180503, // 000E GETMET R6 R2 K3 - 0x5C200A00, // 000F MOVE R8 R5 - 0x7C180400, // 0010 CALL R6 2 - 0x4C1C0000, // 0011 LDNIL R7 - 0x1C180C07, // 0012 EQ R6 R6 R7 - 0x781A0002, // 0013 JMPF R6 #0017 - 0x8C180504, // 0014 GETMET R6 R2 K4 - 0x5C200A00, // 0015 MOVE R8 R5 - 0x7C180400, // 0016 CALL R6 2 - 0x7001FFED, // 0017 JMP #0006 - 0x580C0005, // 0018 LDCONST R3 K5 - 0xAC0C0200, // 0019 CATCH R3 1 0 - 0xB0080000, // 001A RAISE 2 R0 R0 - 0x80040400, // 001B RET 1 R2 + ( &(const binstruction[18]) { /* code */ + 0x4C140000, // 0000 LDNIL R5 + 0x1C140805, // 0001 EQ R5 R4 R5 + 0x78160000, // 0002 JMPF R5 #0004 + 0x50100000, // 0003 LDBOOL R4 0 0 + 0xB8160000, // 0004 GETNGBL R5 K0 + 0x8C140B01, // 0005 GETMET R5 R5 K1 + 0x7C140200, // 0006 CALL R5 1 + 0x90160401, // 0007 SETMBR R5 K2 R1 + 0x90160602, // 0008 SETMBR R5 K3 R2 + 0x90160803, // 0009 SETMBR R5 K4 R3 + 0x88180105, // 000A GETMBR R6 R0 K5 + 0x88180D06, // 000B GETMBR R6 R6 K6 + 0x88180D07, // 000C GETMBR R6 R6 K7 + 0x8C180D08, // 000D GETMET R6 R6 K8 + 0x5C200A00, // 000E MOVE R8 R5 + 0x5C240800, // 000F MOVE R9 R4 + 0x7C180600, // 0010 CALL R6 3 + 0x80000000, // 0011 RET 0 }) ) ); @@ -4477,9 +5534,9 @@ be_local_closure(Matter_Device_get_active_endpoints, /* name */ /******************************************************************** -** Solidified function: is_root_commissioning_open +** Solidified function: is_commissioning_open ********************************************************************/ -be_local_closure(Matter_Device_is_root_commissioning_open, /* name */ +be_local_closure(Matter_Device_is_commissioning_open, /* name */ be_nested_proto( 3, /* nstack */ 1, /* argc */ @@ -4489,872 +5546,16 @@ be_local_closure(Matter_Device_is_root_commissioning_open, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[ 2]) { /* constants */ + ( &(const bvalue[ 1]) { /* constants */ /* K0 */ be_nested_str_weak(commissioning_open), - /* K1 */ be_nested_str_weak(commissioning_admin_fabric), }), - be_str_weak(is_root_commissioning_open), + be_str_weak(is_commissioning_open), &be_const_str_solidified, - ( &(const binstruction[11]) { /* code */ + ( &(const binstruction[ 4]) { /* code */ 0x88040100, // 0000 GETMBR R1 R0 K0 0x4C080000, // 0001 LDNIL R2 0x20040202, // 0002 NE R1 R1 R2 - 0x78060003, // 0003 JMPF R1 #0008 - 0x88040101, // 0004 GETMBR R1 R0 K1 - 0x4C080000, // 0005 LDNIL R2 - 0x1C040202, // 0006 EQ R1 R1 R2 - 0x74060000, // 0007 JMPT R1 #0009 - 0x50040001, // 0008 LDBOOL R1 0 1 - 0x50040200, // 0009 LDBOOL R1 1 0 - 0x80040200, // 000A RET 1 R1 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: start_root_basic_commissioning -********************************************************************/ -be_local_closure(Matter_Device_start_root_basic_commissioning, /* name */ - be_nested_proto( - 14, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[23]) { /* constants */ - /* K0 */ be_nested_str_weak(string), - /* K1 */ be_nested_str_weak(PASE_TIMEOUT), - /* K2 */ be_nested_str_weak(compute_manual_pairing_code), - /* K3 */ be_nested_str_weak(tasmota), - /* K4 */ be_nested_str_weak(log), - /* K5 */ be_nested_str_weak(format), - /* K6 */ be_nested_str_weak(MTR_X3A_X20Manual_X20pairing_X20code_X3A_X20_X25s_X2D_X25s_X2D_X25s), - /* K7 */ be_const_int(0), - /* K8 */ be_const_int(3), - /* K9 */ be_const_int(2147483647), - /* K10 */ be_const_int(2), - /* K11 */ be_nested_str_weak(compute_qrcode_content), - /* K12 */ be_nested_str_weak(publish_result), - /* K13 */ be_nested_str_weak(_X7B_X22Matter_X22_X3A_X7B_X22Commissioning_X22_X3A1_X2C_X22PairingCode_X22_X3A_X22_X25s_X22_X2C_X22QRCode_X22_X3A_X22_X25s_X22_X7D_X7D), - /* K14 */ be_nested_str_weak(Matter), - /* K15 */ be_nested_str_weak(_compute_pbkdf), - /* K16 */ be_nested_str_weak(root_passcode), - /* K17 */ be_nested_str_weak(root_iterations), - /* K18 */ be_nested_str_weak(root_salt), - /* K19 */ be_nested_str_weak(start_basic_commissioning), - /* K20 */ be_nested_str_weak(root_discriminator), - /* K21 */ be_nested_str_weak(root_w0), - /* K22 */ be_nested_str_weak(root_L), - }), - be_str_weak(start_root_basic_commissioning), - &be_const_str_solidified, - ( &(const binstruction[49]) { /* code */ - 0xA40A0000, // 0000 IMPORT R2 K0 - 0x4C0C0000, // 0001 LDNIL R3 - 0x1C0C0203, // 0002 EQ R3 R1 R3 - 0x780E0000, // 0003 JMPF R3 #0005 - 0x88040101, // 0004 GETMBR R1 R0 K1 - 0x8C0C0102, // 0005 GETMET R3 R0 K2 - 0x7C0C0200, // 0006 CALL R3 1 - 0xB8120600, // 0007 GETNGBL R4 K3 - 0x8C100904, // 0008 GETMET R4 R4 K4 - 0x8C180505, // 0009 GETMET R6 R2 K5 - 0x58200006, // 000A LDCONST R8 K6 - 0x40260F08, // 000B CONNECT R9 K7 K8 - 0x94240609, // 000C GETIDX R9 R3 R9 - 0x542A0003, // 000D LDINT R10 4 - 0x542E0005, // 000E LDINT R11 6 - 0x4028140B, // 000F CONNECT R10 R10 R11 - 0x9428060A, // 0010 GETIDX R10 R3 R10 - 0x542E0006, // 0011 LDINT R11 7 - 0x402C1709, // 0012 CONNECT R11 R11 K9 - 0x942C060B, // 0013 GETIDX R11 R3 R11 - 0x7C180A00, // 0014 CALL R6 5 - 0x581C000A, // 0015 LDCONST R7 K10 - 0x7C100600, // 0016 CALL R4 3 - 0x8C10010B, // 0017 GETMET R4 R0 K11 - 0x7C100200, // 0018 CALL R4 1 - 0xB8160600, // 0019 GETNGBL R5 K3 - 0x8C140B0C, // 001A GETMET R5 R5 K12 - 0x8C1C0505, // 001B GETMET R7 R2 K5 - 0x5824000D, // 001C LDCONST R9 K13 - 0x5C280600, // 001D MOVE R10 R3 - 0x5C2C0800, // 001E MOVE R11 R4 - 0x7C1C0800, // 001F CALL R7 4 - 0x5820000E, // 0020 LDCONST R8 K14 - 0x7C140600, // 0021 CALL R5 3 - 0x8C14010F, // 0022 GETMET R5 R0 K15 - 0x881C0110, // 0023 GETMBR R7 R0 K16 - 0x88200111, // 0024 GETMBR R8 R0 K17 - 0x88240112, // 0025 GETMBR R9 R0 K18 - 0x7C140800, // 0026 CALL R5 4 - 0x8C140113, // 0027 GETMET R5 R0 K19 - 0x5C1C0200, // 0028 MOVE R7 R1 - 0x88200111, // 0029 GETMBR R8 R0 K17 - 0x88240114, // 002A GETMBR R9 R0 K20 - 0x88280112, // 002B GETMBR R10 R0 K18 - 0x882C0115, // 002C GETMBR R11 R0 K21 - 0x88300116, // 002D GETMBR R12 R0 K22 - 0x4C340000, // 002E LDNIL R13 - 0x7C141000, // 002F CALL R5 8 - 0x80000000, // 0030 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: bridge_remove_endpoint -********************************************************************/ -be_local_closure(Matter_Device_bridge_remove_endpoint, /* name */ - be_nested_proto( - 11, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[16]) { /* constants */ - /* K0 */ be_nested_str_weak(string), - /* K1 */ be_nested_str_weak(json), - /* K2 */ be_nested_str_weak(plugins_config), - /* K3 */ be_nested_str_weak(contains), - /* K4 */ be_nested_str_weak(tasmota), - /* K5 */ be_nested_str_weak(log), - /* K6 */ be_nested_str_weak(MTR_X3A_X20Cannot_X20remove_X20an_X20enpoint_X20not_X20configured_X3A_X20), - /* K7 */ be_const_int(3), - /* K8 */ be_nested_str_weak(remove), - /* K9 */ be_nested_str_weak(plugins_persist), - /* K10 */ be_nested_str_weak(save_param), - /* K11 */ be_nested_str_weak(signal_endpoints_changed), - /* K12 */ be_const_int(0), - /* K13 */ be_nested_str_weak(plugins), - /* K14 */ be_nested_str_weak(get_endpoint), - /* K15 */ be_const_int(1), - }), - be_str_weak(bridge_remove_endpoint), - &be_const_str_solidified, - ( &(const binstruction[51]) { /* code */ - 0xA40A0000, // 0000 IMPORT R2 K0 - 0xA40E0200, // 0001 IMPORT R3 K1 - 0x60100008, // 0002 GETGBL R4 G8 - 0x5C140200, // 0003 MOVE R5 R1 - 0x7C100200, // 0004 CALL R4 1 - 0x4C140000, // 0005 LDNIL R5 - 0x4C180000, // 0006 LDNIL R6 - 0x881C0102, // 0007 GETMBR R7 R0 K2 - 0x8C1C0F03, // 0008 GETMET R7 R7 K3 - 0x5C240800, // 0009 MOVE R9 R4 - 0x7C1C0400, // 000A CALL R7 2 - 0x741E0005, // 000B JMPT R7 #0012 - 0xB81E0800, // 000C GETNGBL R7 K4 - 0x8C1C0F05, // 000D GETMET R7 R7 K5 - 0x00260C04, // 000E ADD R9 K6 R4 - 0x58280007, // 000F LDCONST R10 K7 - 0x7C1C0600, // 0010 CALL R7 3 - 0x80000E00, // 0011 RET 0 - 0x881C0102, // 0012 GETMBR R7 R0 K2 - 0x8C1C0F08, // 0013 GETMET R7 R7 K8 - 0x5C240800, // 0014 MOVE R9 R4 - 0x7C1C0400, // 0015 CALL R7 2 - 0x501C0200, // 0016 LDBOOL R7 1 0 - 0x90021207, // 0017 SETMBR R0 K9 R7 - 0x8C1C010A, // 0018 GETMET R7 R0 K10 - 0x7C1C0200, // 0019 CALL R7 1 - 0x8C1C010B, // 001A GETMET R7 R0 K11 - 0x7C1C0200, // 001B CALL R7 1 - 0x581C000C, // 001C LDCONST R7 K12 - 0x6020000C, // 001D GETGBL R8 G12 - 0x8824010D, // 001E GETMBR R9 R0 K13 - 0x7C200200, // 001F CALL R8 1 - 0x14200E08, // 0020 LT R8 R7 R8 - 0x7822000F, // 0021 JMPF R8 #0032 - 0x8820010D, // 0022 GETMBR R8 R0 K13 - 0x94201007, // 0023 GETIDX R8 R8 R7 - 0x8C20110E, // 0024 GETMET R8 R8 K14 - 0x7C200200, // 0025 CALL R8 1 - 0x1C200208, // 0026 EQ R8 R1 R8 - 0x78220007, // 0027 JMPF R8 #0030 - 0x8820010D, // 0028 GETMBR R8 R0 K13 - 0x8C201108, // 0029 GETMET R8 R8 K8 - 0x5C280E00, // 002A MOVE R10 R7 - 0x7C200400, // 002B CALL R8 2 - 0x8C20010B, // 002C GETMET R8 R0 K11 - 0x7C200200, // 002D CALL R8 1 - 0x70020002, // 002E JMP #0032 - 0x70020000, // 002F JMP #0031 - 0x001C0F0F, // 0030 ADD R7 R7 K15 - 0x7001FFEA, // 0031 JMP #001D - 0x80000000, // 0032 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: msg_received -********************************************************************/ -be_local_closure(Matter_Device_msg_received, /* name */ - be_nested_proto( - 9, /* nstack */ - 4, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 2]) { /* constants */ - /* K0 */ be_nested_str_weak(message_handler), - /* K1 */ be_nested_str_weak(msg_received), - }), - be_str_weak(msg_received), - &be_const_str_solidified, - ( &(const binstruction[ 7]) { /* code */ - 0x88100100, // 0000 GETMBR R4 R0 K0 - 0x8C100901, // 0001 GETMET R4 R4 K1 - 0x5C180200, // 0002 MOVE R6 R1 - 0x5C1C0400, // 0003 MOVE R7 R2 - 0x5C200600, // 0004 MOVE R8 R3 - 0x7C100800, // 0005 CALL R4 4 - 0x80040800, // 0006 RET 1 R4 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: start_mdns_announce_hostnames -********************************************************************/ -be_local_closure(Matter_Device_start_mdns_announce_hostnames, /* name */ - be_nested_proto( - 6, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 1, /* has sup protos */ - ( &(const struct bproto*[ 2]) { - be_nested_proto( - 4, /* nstack */ - 0, /* argc */ - 0, /* varg */ - 1, /* has upvals */ - ( &(const bupvaldesc[ 1]) { /* upvals */ - be_local_const_upval(1, 0), - }), - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 5]) { /* constants */ - /* K0 */ be_nested_str_weak(_mdns_announce_hostname), - /* K1 */ be_nested_str_weak(tasmota), - /* K2 */ be_nested_str_weak(remove_rule), - /* K3 */ be_nested_str_weak(Wifi_X23Connected), - /* K4 */ be_nested_str_weak(matter_mdns_host), - }), - be_str_weak(_anonymous_), - &be_const_str_solidified, - ( &(const binstruction[10]) { /* code */ - 0x68000000, // 0000 GETUPV R0 U0 - 0x8C000100, // 0001 GETMET R0 R0 K0 - 0x50080000, // 0002 LDBOOL R2 0 0 - 0x7C000400, // 0003 CALL R0 2 - 0xB8020200, // 0004 GETNGBL R0 K1 - 0x8C000102, // 0005 GETMET R0 R0 K2 - 0x58080003, // 0006 LDCONST R2 K3 - 0x580C0004, // 0007 LDCONST R3 K4 - 0x7C000600, // 0008 CALL R0 3 - 0x80000000, // 0009 RET 0 - }) - ), - be_nested_proto( - 4, /* nstack */ - 0, /* argc */ - 0, /* varg */ - 1, /* has upvals */ - ( &(const bupvaldesc[ 1]) { /* upvals */ - be_local_const_upval(1, 0), - }), - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 5]) { /* constants */ - /* K0 */ be_nested_str_weak(_mdns_announce_hostname), - /* K1 */ be_nested_str_weak(tasmota), - /* K2 */ be_nested_str_weak(remove_rule), - /* K3 */ be_nested_str_weak(Eth_X23Connected), - /* K4 */ be_nested_str_weak(matter_mdns_host), - }), - be_str_weak(_anonymous_), - &be_const_str_solidified, - ( &(const binstruction[10]) { /* code */ - 0x68000000, // 0000 GETUPV R0 U0 - 0x8C000100, // 0001 GETMET R0 R0 K0 - 0x50080200, // 0002 LDBOOL R2 1 0 - 0x7C000400, // 0003 CALL R0 2 - 0xB8020200, // 0004 GETNGBL R0 K1 - 0x8C000102, // 0005 GETMET R0 R0 K2 - 0x58080003, // 0006 LDCONST R2 K3 - 0x580C0004, // 0007 LDCONST R3 K4 - 0x7C000600, // 0008 CALL R0 3 - 0x80000000, // 0009 RET 0 - }) - ), - }), - 1, /* has constants */ - ( &(const bvalue[ 9]) { /* constants */ - /* K0 */ be_nested_str_weak(tasmota), - /* K1 */ be_nested_str_weak(wifi), - /* K2 */ be_nested_str_weak(up), - /* K3 */ be_nested_str_weak(_mdns_announce_hostname), - /* K4 */ be_nested_str_weak(add_rule), - /* K5 */ be_nested_str_weak(Wifi_X23Connected), - /* K6 */ be_nested_str_weak(matter_mdns_host), - /* K7 */ be_nested_str_weak(eth), - /* K8 */ be_nested_str_weak(Eth_X23Connected), - }), - be_str_weak(start_mdns_announce_hostnames), - &be_const_str_solidified, - ( &(const binstruction[32]) { /* code */ - 0xB8060000, // 0000 GETNGBL R1 K0 - 0x8C040301, // 0001 GETMET R1 R1 K1 - 0x7C040200, // 0002 CALL R1 1 - 0x94040302, // 0003 GETIDX R1 R1 K2 - 0x78060003, // 0004 JMPF R1 #0009 - 0x8C040103, // 0005 GETMET R1 R0 K3 - 0x500C0000, // 0006 LDBOOL R3 0 0 - 0x7C040400, // 0007 CALL R1 2 - 0x70020005, // 0008 JMP #000F - 0xB8060000, // 0009 GETNGBL R1 K0 - 0x8C040304, // 000A GETMET R1 R1 K4 - 0x580C0005, // 000B LDCONST R3 K5 - 0x84100000, // 000C CLOSURE R4 P0 - 0x58140006, // 000D LDCONST R5 K6 - 0x7C040800, // 000E CALL R1 4 - 0xB8060000, // 000F GETNGBL R1 K0 - 0x8C040307, // 0010 GETMET R1 R1 K7 - 0x7C040200, // 0011 CALL R1 1 - 0x94040302, // 0012 GETIDX R1 R1 K2 - 0x78060003, // 0013 JMPF R1 #0018 - 0x8C040103, // 0014 GETMET R1 R0 K3 - 0x500C0200, // 0015 LDBOOL R3 1 0 - 0x7C040400, // 0016 CALL R1 2 - 0x70020005, // 0017 JMP #001E - 0xB8060000, // 0018 GETNGBL R1 K0 - 0x8C040304, // 0019 GETMET R1 R1 K4 - 0x580C0008, // 001A LDCONST R3 K8 - 0x84100001, // 001B CLOSURE R4 P1 - 0x58140006, // 001C LDCONST R5 K6 - 0x7C040800, // 001D CALL R1 4 - 0xA0000000, // 001E CLOSE R0 - 0x80000000, // 001F RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: _start_udp -********************************************************************/ -be_local_closure(Matter_Device__start_udp, /* name */ - be_nested_proto( - 6, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 1, /* has sup protos */ - ( &(const struct bproto*[ 1]) { - be_nested_proto( - 8, /* nstack */ - 3, /* argc */ - 0, /* varg */ - 1, /* has upvals */ - ( &(const bupvaldesc[ 1]) { /* upvals */ - be_local_const_upval(1, 0), - }), - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 1]) { /* constants */ - /* K0 */ be_nested_str_weak(msg_received), - }), - be_str_weak(_X3Clambda_X3E), - &be_const_str_solidified, - ( &(const binstruction[ 7]) { /* code */ - 0x680C0000, // 0000 GETUPV R3 U0 - 0x8C0C0700, // 0001 GETMET R3 R3 K0 - 0x5C140000, // 0002 MOVE R5 R0 - 0x5C180200, // 0003 MOVE R6 R1 - 0x5C1C0400, // 0004 MOVE R7 R2 - 0x7C0C0800, // 0005 CALL R3 4 - 0x80040600, // 0006 RET 1 R3 - }) - ), - }), - 1, /* has constants */ - ( &(const bvalue[ 9]) { /* constants */ - /* K0 */ be_nested_str_weak(udp_server), - /* K1 */ be_nested_str_weak(tasmota), - /* K2 */ be_nested_str_weak(log), - /* K3 */ be_nested_str_weak(MTR_X3A_X20starting_X20UDP_X20server_X20on_X20port_X3A_X20), - /* K4 */ be_const_int(2), - /* K5 */ be_nested_str_weak(matter), - /* K6 */ be_nested_str_weak(UDPServer), - /* K7 */ be_nested_str_weak(), - /* K8 */ be_nested_str_weak(start), - }), - be_str_weak(_start_udp), - &be_const_str_solidified, - ( &(const binstruction[27]) { /* code */ - 0x88080100, // 0000 GETMBR R2 R0 K0 - 0x780A0000, // 0001 JMPF R2 #0003 - 0x80000400, // 0002 RET 0 - 0x4C080000, // 0003 LDNIL R2 - 0x1C080202, // 0004 EQ R2 R1 R2 - 0x780A0000, // 0005 JMPF R2 #0007 - 0x540615A3, // 0006 LDINT R1 5540 - 0xB80A0200, // 0007 GETNGBL R2 K1 - 0x8C080502, // 0008 GETMET R2 R2 K2 - 0x60100008, // 0009 GETGBL R4 G8 - 0x5C140200, // 000A MOVE R5 R1 - 0x7C100200, // 000B CALL R4 1 - 0x00120604, // 000C ADD R4 K3 R4 - 0x58140004, // 000D LDCONST R5 K4 - 0x7C080600, // 000E CALL R2 3 - 0xB80A0A00, // 000F GETNGBL R2 K5 - 0x8C080506, // 0010 GETMET R2 R2 K6 - 0x58100007, // 0011 LDCONST R4 K7 - 0x5C140200, // 0012 MOVE R5 R1 - 0x7C080600, // 0013 CALL R2 3 - 0x90020002, // 0014 SETMBR R0 K0 R2 - 0x88080100, // 0015 GETMBR R2 R0 K0 - 0x8C080508, // 0016 GETMET R2 R2 K8 - 0x84100000, // 0017 CLOSURE R4 P0 - 0x7C080400, // 0018 CALL R2 2 - 0xA0000000, // 0019 CLOSE R0 - 0x80000000, // 001A RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: autoconf_device -********************************************************************/ -be_local_closure(Matter_Device_autoconf_device, /* name */ - be_nested_proto( - 7, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[16]) { /* constants */ - /* K0 */ be_nested_str_weak(string), - /* K1 */ be_nested_str_weak(json), - /* K2 */ be_nested_str_weak(plugins), - /* K3 */ be_const_int(0), - /* K4 */ be_nested_str_weak(plugins_persist), - /* K5 */ be_nested_str_weak(plugins_config), - /* K6 */ be_nested_str_weak(autoconf_device_map), - /* K7 */ be_nested_str_weak(adjust_next_ep), - /* K8 */ be_nested_str_weak(tasmota), - /* K9 */ be_nested_str_weak(log), - /* K10 */ be_nested_str_weak(MTR_X3A_X20autoconfig_X20_X3D_X20), - /* K11 */ be_const_int(3), - /* K12 */ be_nested_str_weak(_instantiate_plugins_from_config), - /* K13 */ be_nested_str_weak(sessions), - /* K14 */ be_nested_str_weak(count_active_fabrics), - /* K15 */ be_nested_str_weak(save_param), - }), - be_str_weak(autoconf_device), - &be_const_str_solidified, - ( &(const binstruction[38]) { /* code */ - 0xA4060000, // 0000 IMPORT R1 K0 - 0xA40A0200, // 0001 IMPORT R2 K1 - 0x600C000C, // 0002 GETGBL R3 G12 - 0x88100102, // 0003 GETMBR R4 R0 K2 - 0x7C0C0200, // 0004 CALL R3 1 - 0x240C0703, // 0005 GT R3 R3 K3 - 0x780E0000, // 0006 JMPF R3 #0008 - 0x80000600, // 0007 RET 0 - 0x880C0104, // 0008 GETMBR R3 R0 K4 - 0x740E000C, // 0009 JMPT R3 #0017 - 0x8C0C0106, // 000A GETMET R3 R0 K6 - 0x7C0C0200, // 000B CALL R3 1 - 0x90020A03, // 000C SETMBR R0 K5 R3 - 0x8C0C0107, // 000D GETMET R3 R0 K7 - 0x7C0C0200, // 000E CALL R3 1 - 0xB80E1000, // 000F GETNGBL R3 K8 - 0x8C0C0709, // 0010 GETMET R3 R3 K9 - 0x60140008, // 0011 GETGBL R5 G8 - 0x88180105, // 0012 GETMBR R6 R0 K5 - 0x7C140200, // 0013 CALL R5 1 - 0x00161405, // 0014 ADD R5 K10 R5 - 0x5818000B, // 0015 LDCONST R6 K11 - 0x7C0C0600, // 0016 CALL R3 3 - 0x8C0C010C, // 0017 GETMET R3 R0 K12 - 0x88140105, // 0018 GETMBR R5 R0 K5 - 0x7C0C0400, // 0019 CALL R3 2 - 0x880C0104, // 001A GETMBR R3 R0 K4 - 0x740E0008, // 001B JMPT R3 #0025 - 0x880C010D, // 001C GETMBR R3 R0 K13 - 0x8C0C070E, // 001D GETMET R3 R3 K14 - 0x7C0C0200, // 001E CALL R3 1 - 0x240C0703, // 001F GT R3 R3 K3 - 0x780E0003, // 0020 JMPF R3 #0025 - 0x500C0200, // 0021 LDBOOL R3 1 0 - 0x90020803, // 0022 SETMBR R0 K4 R3 - 0x8C0C010F, // 0023 GETMET R3 R0 K15 - 0x7C0C0200, // 0024 CALL R3 1 - 0x80000000, // 0025 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: MtrJoin -********************************************************************/ -be_local_closure(Matter_Device_MtrJoin, /* name */ - be_nested_proto( - 8, /* nstack */ - 5, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 4]) { /* constants */ - /* K0 */ be_nested_str_weak(start_root_basic_commissioning), - /* K1 */ be_nested_str_weak(stop_basic_commissioning), - /* K2 */ be_nested_str_weak(tasmota), - /* K3 */ be_nested_str_weak(resp_cmnd_done), - }), - be_str_weak(MtrJoin), - &be_const_str_solidified, - ( &(const binstruction[13]) { /* code */ - 0x60140009, // 0000 GETGBL R5 G9 - 0x5C180600, // 0001 MOVE R6 R3 - 0x7C140200, // 0002 CALL R5 1 - 0x78160002, // 0003 JMPF R5 #0007 - 0x8C180100, // 0004 GETMET R6 R0 K0 - 0x7C180200, // 0005 CALL R6 1 - 0x70020001, // 0006 JMP #0009 - 0x8C180101, // 0007 GETMET R6 R0 K1 - 0x7C180200, // 0008 CALL R6 1 - 0xB81A0400, // 0009 GETNGBL R6 K2 - 0x8C180D03, // 000A GETMET R6 R6 K3 - 0x7C180200, // 000B CALL R6 1 - 0x80000000, // 000C RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: mdns_remove_op_discovery -********************************************************************/ -be_local_closure(Matter_Device_mdns_remove_op_discovery, /* name */ - be_nested_proto( - 14, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[24]) { /* constants */ - /* K0 */ be_nested_str_weak(mdns), - /* K1 */ be_nested_str_weak(string), - /* K2 */ be_nested_str_weak(get_device_id), - /* K3 */ be_nested_str_weak(copy), - /* K4 */ be_nested_str_weak(reverse), - /* K5 */ be_nested_str_weak(get_fabric_compressed), - /* K6 */ be_nested_str_weak(tohex), - /* K7 */ be_nested_str_weak(_X2D), - /* K8 */ be_nested_str_weak(tasmota), - /* K9 */ be_nested_str_weak(eth), - /* K10 */ be_nested_str_weak(find), - /* K11 */ be_nested_str_weak(up), - /* K12 */ be_nested_str_weak(log), - /* K13 */ be_nested_str_weak(format), - /* K14 */ be_nested_str_weak(MTR_X3A_X20remove_X20mDNS_X20on_X20_X25s_X20_X27_X25s_X27), - /* K15 */ be_const_int(2), - /* K16 */ be_nested_str_weak(remove_service), - /* K17 */ be_nested_str_weak(_matter), - /* K18 */ be_nested_str_weak(_tcp), - /* K19 */ be_nested_str_weak(hostname_eth), - /* K20 */ be_nested_str_weak(wifi), - /* K21 */ be_nested_str_weak(hostname_wifi), - /* K22 */ be_nested_str_weak(MTR_X3A_X20Exception), - /* K23 */ be_nested_str_weak(_X7C), - }), - be_str_weak(mdns_remove_op_discovery), - &be_const_str_solidified, - ( &(const binstruction[81]) { /* code */ - 0xA40A0000, // 0000 IMPORT R2 K0 - 0xA40E0200, // 0001 IMPORT R3 K1 - 0xA802003B, // 0002 EXBLK 0 #003F - 0x8C100302, // 0003 GETMET R4 R1 K2 - 0x7C100200, // 0004 CALL R4 1 - 0x8C100903, // 0005 GETMET R4 R4 K3 - 0x7C100200, // 0006 CALL R4 1 - 0x8C100904, // 0007 GETMET R4 R4 K4 - 0x7C100200, // 0008 CALL R4 1 - 0x8C140305, // 0009 GETMET R5 R1 K5 - 0x7C140200, // 000A CALL R5 1 - 0x8C180B06, // 000B GETMET R6 R5 K6 - 0x7C180200, // 000C CALL R6 1 - 0x00180D07, // 000D ADD R6 R6 K7 - 0x8C1C0906, // 000E GETMET R7 R4 K6 - 0x7C1C0200, // 000F CALL R7 1 - 0x00180C07, // 0010 ADD R6 R6 R7 - 0xB81E1000, // 0011 GETNGBL R7 K8 - 0x8C1C0F09, // 0012 GETMET R7 R7 K9 - 0x7C1C0200, // 0013 CALL R7 1 - 0x8C1C0F0A, // 0014 GETMET R7 R7 K10 - 0x5824000B, // 0015 LDCONST R9 K11 - 0x7C1C0400, // 0016 CALL R7 2 - 0x781E000E, // 0017 JMPF R7 #0027 - 0xB81E1000, // 0018 GETNGBL R7 K8 - 0x8C1C0F0C, // 0019 GETMET R7 R7 K12 - 0x8C24070D, // 001A GETMET R9 R3 K13 - 0x582C000E, // 001B LDCONST R11 K14 - 0x58300009, // 001C LDCONST R12 K9 - 0x5C340C00, // 001D MOVE R13 R6 - 0x7C240800, // 001E CALL R9 4 - 0x5828000F, // 001F LDCONST R10 K15 - 0x7C1C0600, // 0020 CALL R7 3 - 0x8C1C0510, // 0021 GETMET R7 R2 K16 - 0x58240011, // 0022 LDCONST R9 K17 - 0x58280012, // 0023 LDCONST R10 K18 - 0x5C2C0C00, // 0024 MOVE R11 R6 - 0x88300113, // 0025 GETMBR R12 R0 K19 - 0x7C1C0A00, // 0026 CALL R7 5 - 0xB81E1000, // 0027 GETNGBL R7 K8 - 0x8C1C0F14, // 0028 GETMET R7 R7 K20 - 0x7C1C0200, // 0029 CALL R7 1 - 0x8C1C0F0A, // 002A GETMET R7 R7 K10 - 0x5824000B, // 002B LDCONST R9 K11 - 0x7C1C0400, // 002C CALL R7 2 - 0x781E000E, // 002D JMPF R7 #003D - 0xB81E1000, // 002E GETNGBL R7 K8 - 0x8C1C0F0C, // 002F GETMET R7 R7 K12 - 0x8C24070D, // 0030 GETMET R9 R3 K13 - 0x582C000E, // 0031 LDCONST R11 K14 - 0x58300014, // 0032 LDCONST R12 K20 - 0x5C340C00, // 0033 MOVE R13 R6 - 0x7C240800, // 0034 CALL R9 4 - 0x5828000F, // 0035 LDCONST R10 K15 - 0x7C1C0600, // 0036 CALL R7 3 - 0x8C1C0510, // 0037 GETMET R7 R2 K16 - 0x58240011, // 0038 LDCONST R9 K17 - 0x58280012, // 0039 LDCONST R10 K18 - 0x5C2C0C00, // 003A MOVE R11 R6 - 0x88300115, // 003B GETMBR R12 R0 K21 - 0x7C1C0A00, // 003C CALL R7 5 - 0xA8040001, // 003D EXBLK 1 1 - 0x70020010, // 003E JMP #0050 - 0xAC100002, // 003F CATCH R4 0 2 - 0x7002000D, // 0040 JMP #004F - 0xB81A1000, // 0041 GETNGBL R6 K8 - 0x8C180D0C, // 0042 GETMET R6 R6 K12 - 0x60200008, // 0043 GETGBL R8 G8 - 0x5C240800, // 0044 MOVE R9 R4 - 0x7C200200, // 0045 CALL R8 1 - 0x00222C08, // 0046 ADD R8 K22 R8 - 0x00201117, // 0047 ADD R8 R8 K23 - 0x60240008, // 0048 GETGBL R9 G8 - 0x5C280A00, // 0049 MOVE R10 R5 - 0x7C240200, // 004A CALL R9 1 - 0x00201009, // 004B ADD R8 R8 R9 - 0x5824000F, // 004C LDCONST R9 K15 - 0x7C180600, // 004D CALL R6 3 - 0x70020000, // 004E JMP #0050 - 0xB0080000, // 004F RAISE 2 R0 R0 - 0x80000000, // 0050 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: start_operational_discovery -********************************************************************/ -be_local_closure(Matter_Device_start_operational_discovery, /* name */ - be_nested_proto( - 8, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 7]) { /* constants */ - /* K0 */ be_nested_str_weak(crypto), - /* K1 */ be_nested_str_weak(mdns), - /* K2 */ be_nested_str_weak(string), - /* K3 */ be_nested_str_weak(stop_basic_commissioning), - /* K4 */ be_nested_str_weak(root_w0), - /* K5 */ be_nested_str_weak(root_L), - /* K6 */ be_nested_str_weak(mdns_announce_op_discovery), - }), - be_str_weak(start_operational_discovery), - &be_const_str_solidified, - ( &(const binstruction[13]) { /* code */ - 0xA40A0000, // 0000 IMPORT R2 K0 - 0xA40E0200, // 0001 IMPORT R3 K1 - 0xA4120400, // 0002 IMPORT R4 K2 - 0x8C140103, // 0003 GETMET R5 R0 K3 - 0x7C140200, // 0004 CALL R5 1 - 0x4C140000, // 0005 LDNIL R5 - 0x90020805, // 0006 SETMBR R0 K4 R5 - 0x4C140000, // 0007 LDNIL R5 - 0x90020A05, // 0008 SETMBR R0 K5 R5 - 0x8C140106, // 0009 GETMET R5 R0 K6 - 0x5C1C0200, // 000A MOVE R7 R1 - 0x7C140400, // 000B CALL R5 2 - 0x80000000, // 000C RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: save_param -********************************************************************/ -be_local_closure(Matter_Device_save_param, /* name */ - be_nested_proto( - 11, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[27]) { /* constants */ - /* K0 */ be_nested_str_weak(string), - /* K1 */ be_nested_str_weak(json), - /* K2 */ be_nested_str_weak(format), - /* K3 */ be_nested_str_weak(_X7B_X22distinguish_X22_X3A_X25i_X2C_X22passcode_X22_X3A_X25i_X2C_X22ipv4only_X22_X3A_X25s_X2C_X22nextep_X22_X3A_X25i), - /* K4 */ be_nested_str_weak(root_discriminator), - /* K5 */ be_nested_str_weak(root_passcode), - /* K6 */ be_nested_str_weak(ipv4only), - /* K7 */ be_nested_str_weak(true), - /* K8 */ be_nested_str_weak(false), - /* K9 */ be_nested_str_weak(next_ep), - /* K10 */ be_nested_str_weak(plugins_persist), - /* K11 */ be_nested_str_weak(_X2C_X22config_X22_X3A), - /* K12 */ be_nested_str_weak(dump), - /* K13 */ be_nested_str_weak(plugins_config), - /* K14 */ be_nested_str_weak(_X7D), - /* K15 */ be_nested_str_weak(FILENAME), - /* K16 */ be_nested_str_weak(w), - /* K17 */ be_nested_str_weak(write), - /* K18 */ be_nested_str_weak(close), - /* K19 */ be_nested_str_weak(tasmota), - /* K20 */ be_nested_str_weak(log), - /* K21 */ be_nested_str_weak(MTR_X3A_X20_X3DSaved_X20_X20_X20_X20_X20parameters_X25s), - /* K22 */ be_nested_str_weak(_X20and_X20configuration), - /* K23 */ be_nested_str_weak(), - /* K24 */ be_const_int(2), - /* K25 */ be_nested_str_weak(MTR_X3A_X20Session_Store_X3A_X3Asave_X20Exception_X3A), - /* K26 */ be_nested_str_weak(_X7C), - }), - be_str_weak(save_param), - &be_const_str_solidified, - ( &(const binstruction[66]) { /* code */ - 0xA4060000, // 0000 IMPORT R1 K0 - 0xA40A0200, // 0001 IMPORT R2 K1 - 0x8C0C0302, // 0002 GETMET R3 R1 K2 - 0x58140003, // 0003 LDCONST R5 K3 - 0x88180104, // 0004 GETMBR R6 R0 K4 - 0x881C0105, // 0005 GETMBR R7 R0 K5 - 0x88200106, // 0006 GETMBR R8 R0 K6 - 0x78220001, // 0007 JMPF R8 #000A - 0x58200007, // 0008 LDCONST R8 K7 - 0x70020000, // 0009 JMP #000B - 0x58200008, // 000A LDCONST R8 K8 - 0x88240109, // 000B GETMBR R9 R0 K9 - 0x7C0C0C00, // 000C CALL R3 6 - 0x8810010A, // 000D GETMBR R4 R0 K10 - 0x78120004, // 000E JMPF R4 #0014 - 0x000C070B, // 000F ADD R3 R3 K11 - 0x8C10050C, // 0010 GETMET R4 R2 K12 - 0x8818010D, // 0011 GETMBR R6 R0 K13 - 0x7C100400, // 0012 CALL R4 2 - 0x000C0604, // 0013 ADD R3 R3 R4 - 0x000C070E, // 0014 ADD R3 R3 K14 - 0xA8020018, // 0015 EXBLK 0 #002F - 0x60100011, // 0016 GETGBL R4 G17 - 0x8814010F, // 0017 GETMBR R5 R0 K15 - 0x58180010, // 0018 LDCONST R6 K16 - 0x7C100400, // 0019 CALL R4 2 - 0x8C140911, // 001A GETMET R5 R4 K17 - 0x5C1C0600, // 001B MOVE R7 R3 - 0x7C140400, // 001C CALL R5 2 - 0x8C140912, // 001D GETMET R5 R4 K18 - 0x7C140200, // 001E CALL R5 1 - 0xB8162600, // 001F GETNGBL R5 K19 - 0x8C140B14, // 0020 GETMET R5 R5 K20 - 0x8C1C0302, // 0021 GETMET R7 R1 K2 - 0x58240015, // 0022 LDCONST R9 K21 - 0x8828010A, // 0023 GETMBR R10 R0 K10 - 0x782A0001, // 0024 JMPF R10 #0027 - 0x58280016, // 0025 LDCONST R10 K22 - 0x70020000, // 0026 JMP #0028 - 0x58280017, // 0027 LDCONST R10 K23 - 0x7C1C0600, // 0028 CALL R7 3 - 0x58200018, // 0029 LDCONST R8 K24 - 0x7C140600, // 002A CALL R5 3 - 0xA8040001, // 002B EXBLK 1 1 - 0x80040600, // 002C RET 1 R3 - 0xA8040001, // 002D EXBLK 1 1 - 0x70020011, // 002E JMP #0041 - 0xAC100002, // 002F CATCH R4 0 2 - 0x7002000E, // 0030 JMP #0040 - 0xB81A2600, // 0031 GETNGBL R6 K19 - 0x8C180D14, // 0032 GETMET R6 R6 K20 - 0x60200008, // 0033 GETGBL R8 G8 - 0x5C240800, // 0034 MOVE R9 R4 - 0x7C200200, // 0035 CALL R8 1 - 0x00223208, // 0036 ADD R8 K25 R8 - 0x0020111A, // 0037 ADD R8 R8 K26 - 0x60240008, // 0038 GETGBL R9 G8 - 0x5C280A00, // 0039 MOVE R10 R5 - 0x7C240200, // 003A CALL R9 1 - 0x00201009, // 003B ADD R8 R8 R9 - 0x58240018, // 003C LDCONST R9 K24 - 0x7C180600, // 003D CALL R6 3 - 0x80040600, // 003E RET 1 R3 - 0x70020000, // 003F JMP #0041 - 0xB0080000, // 0040 RAISE 2 R0 R0 - 0x80000000, // 0041 RET 0 + 0x80040200, // 0003 RET 1 R1 }) ) ); @@ -5367,22 +5568,103 @@ be_local_closure(Matter_Device_save_param, /* name */ be_local_class(Matter_Device, 34, NULL, - be_nested_map(100, + be_nested_map(103, ( (struct bmapnode*) &(const bmapnode[]) { - { be_const_key_weak(every_250ms, -1), be_const_closure(Matter_Device_every_250ms_closure) }, + { be_const_key_weak(get_plugin_class_arg, -1), be_const_closure(Matter_Device_get_plugin_class_arg_closure) }, + { be_const_key_weak(mdns_remove_op_discovery_all_fabrics, -1), be_const_closure(Matter_Device_mdns_remove_op_discovery_all_fabrics_closure) }, + { be_const_key_weak(_start_udp, -1), be_const_closure(Matter_Device__start_udp_closure) }, + { be_const_key_weak(find_plugin_by_endpoint, -1), be_const_closure(Matter_Device_find_plugin_by_endpoint_closure) }, + { be_const_key_weak(get_active_endpoints, 97), be_const_closure(Matter_Device_get_active_endpoints_closure) }, + { be_const_key_weak(is_root_commissioning_open, 102), be_const_closure(Matter_Device_is_root_commissioning_open_closure) }, + { be_const_key_weak(hostname_wifi, 95), be_const_var(19) }, + { be_const_key_weak(register_commands, 9), be_const_closure(Matter_Device_register_commands_closure) }, + { be_const_key_weak(commissioning_open, 70), be_const_var(10) }, + { be_const_key_weak(vendorid, 57), be_const_var(21) }, + { be_const_key_weak(mdns_remove_PASE, -1), be_const_closure(Matter_Device_mdns_remove_PASE_closure) }, + { be_const_key_weak(is_commissioning_open, -1), be_const_closure(Matter_Device_is_commissioning_open_closure) }, + { be_const_key_weak(adjust_next_ep, 98), be_const_closure(Matter_Device_adjust_next_ep_closure) }, + { be_const_key_weak(root_L, -1), be_const_var(33) }, + { be_const_key_weak(autoconf_device_map, -1), be_const_closure(Matter_Device_autoconf_device_map_closure) }, + { be_const_key_weak(autoconf_device, 18), be_const_closure(Matter_Device_autoconf_device_closure) }, + { be_const_key_weak(commissioning_discriminator, -1), be_const_var(12) }, + { be_const_key_weak(tick, 45), be_const_var(9) }, + { be_const_key_weak(productid, 26), be_const_var(22) }, + { be_const_key_weak(start_commissioning_complete, 88), be_const_closure(Matter_Device_start_commissioning_complete_closure) }, + { be_const_key_weak(start_mdns_announce_hostnames, -1), be_const_closure(Matter_Device_start_mdns_announce_hostnames_closure) }, + { be_const_key_weak(commissioning_iterations, -1), be_const_var(11) }, + { be_const_key_weak(save_before_restart, 58), be_const_closure(Matter_Device_save_before_restart_closure) }, + { be_const_key_weak(plugins_persist, 40), be_const_var(2) }, + { be_const_key_weak(start_operational_discovery_deferred, -1), be_const_closure(Matter_Device_start_operational_discovery_deferred_closure) }, + { be_const_key_weak(start_commissioning_complete_deferred, -1), be_const_closure(Matter_Device_start_commissioning_complete_deferred_closure) }, + { be_const_key_weak(plugins_classes, 55), be_const_var(3) }, + { be_const_key_weak(start, -1), be_const_closure(Matter_Device_start_closure) }, + { be_const_key_weak(init, -1), be_const_closure(Matter_Device_init_closure) }, + { be_const_key_weak(register_native_classes, -1), be_const_closure(Matter_Device_register_native_classes_closure) }, + { be_const_key_weak(root_salt, -1), be_const_var(31) }, + { be_const_key_weak(FILENAME, -1), be_nested_str_weak(_matter_device_X2Ejson) }, + { be_const_key_weak(clean_remotes, -1), be_const_closure(Matter_Device_clean_remotes_closure) }, + { be_const_key_weak(mdns_announce_op_discovery_all_fabrics, -1), be_const_closure(Matter_Device_mdns_announce_op_discovery_all_fabrics_closure) }, + { be_const_key_weak(signal_endpoints_changed, -1), be_const_closure(Matter_Device_signal_endpoints_changed_closure) }, + { be_const_key_weak(get_plugin_class_displayname, -1), be_const_closure(Matter_Device_get_plugin_class_displayname_closure) }, + { be_const_key_weak(msg_received, 53), be_const_closure(Matter_Device_msg_received_closure) }, + { be_const_key_weak(generate_random_passcode, -1), be_const_closure(Matter_Device_generate_random_passcode_closure) }, + { be_const_key_weak(MtrJoin, 30), be_const_closure(Matter_Device_MtrJoin_closure) }, + { be_const_key_weak(remove_fabric, 25), be_const_closure(Matter_Device_remove_fabric_closure) }, + { be_const_key_weak(every_second, -1), be_const_closure(Matter_Device_every_second_closure) }, + { be_const_key_weak(PASE_TIMEOUT, 85), be_const_int(600) }, + { be_const_key_weak(process_attribute_expansion, -1), be_const_closure(Matter_Device_process_attribute_expansion_closure) }, + { be_const_key_weak(http_remotes, 36), be_const_var(25) }, + { be_const_key_weak(hostname_eth, -1), be_const_var(20) }, + { be_const_key_weak(root_discriminator, 89), be_const_var(26) }, + { be_const_key_weak(register_http_remote, 93), be_const_closure(Matter_Device_register_http_remote_closure) }, + { be_const_key_weak(mdns_announce_PASE, -1), be_const_closure(Matter_Device_mdns_announce_PASE_closure) }, + { be_const_key_weak(commissioning_admin_fabric, -1), be_const_var(16) }, + { be_const_key_weak(event_fabrics_saved, -1), be_const_closure(Matter_Device_event_fabrics_saved_closure) }, + { be_const_key_weak(_init_basic_commissioning, 61), be_const_closure(Matter_Device__init_basic_commissioning_closure) }, + { be_const_key_weak(invoke_request, 92), be_const_closure(Matter_Device_invoke_request_closure) }, + { be_const_key_weak(_compute_pbkdf, -1), be_const_closure(Matter_Device__compute_pbkdf_closure) }, + { be_const_key_weak(sessions, -1), be_const_var(7) }, + { be_const_key_weak(root_iterations, -1), be_const_var(30) }, + { be_const_key_weak(load_param, -1), be_const_closure(Matter_Device_load_param_closure) }, + { be_const_key_weak(start_basic_commissioning, -1), be_const_closure(Matter_Device_start_basic_commissioning_closure) }, + { be_const_key_weak(start_root_basic_commissioning, -1), be_const_closure(Matter_Device_start_root_basic_commissioning_closure) }, + { be_const_key_weak(plugins, 13), be_const_var(1) }, + { be_const_key_weak(k2l, 52), be_const_static_closure(Matter_Device_k2l_closure) }, + { be_const_key_weak(autoconf_sensors_list, -1), be_const_closure(Matter_Device_autoconf_sensors_list_closure) }, + { be_const_key_weak(mdns_announce_op_discovery, -1), be_const_closure(Matter_Device_mdns_announce_op_discovery_closure) }, + { be_const_key_weak(next_ep, -1), be_const_var(29) }, + { be_const_key_weak(plugins_config, 27), be_const_var(4) }, + { be_const_key_weak(sort_distinct, 84), be_const_static_closure(Matter_Device_sort_distinct_closure) }, + { be_const_key_weak(PRODUCT_ID, 83), be_const_int(32768) }, + { be_const_key_weak(save_param, 67), be_const_closure(Matter_Device_save_param_closure) }, + { be_const_key_weak(PBKDF_ITERATIONS, -1), be_const_int(1000) }, + { be_const_key_weak(k2l_num, -1), be_const_static_closure(Matter_Device_k2l_num_closure) }, + { be_const_key_weak(_instantiate_plugins_from_config, 81), be_const_closure(Matter_Device__instantiate_plugins_from_config_closure) }, { be_const_key_weak(VENDOR_ID, -1), be_const_int(65521) }, - { be_const_key_weak(commissioning_w0, -1), be_const_var(14) }, - { be_const_key_weak(register_commands, -1), be_const_closure(Matter_Device_register_commands_closure) }, - { be_const_key_weak(tick, -1), be_const_var(9) }, + { be_const_key_weak(start_operational_discovery, 28), be_const_closure(Matter_Device_start_operational_discovery_closure) }, { be_const_key_weak(root_w0, -1), be_const_var(32) }, { be_const_key_weak(started, -1), be_const_var(0) }, - { be_const_key_weak(_trigger_read_sensors, 92), be_const_closure(Matter_Device__trigger_read_sensors_closure) }, - { be_const_key_weak(every_50ms, -1), be_const_closure(Matter_Device_every_50ms_closure) }, - { be_const_key_weak(save_param, 41), be_const_closure(Matter_Device_save_param_closure) }, + { be_const_key_weak(stop_basic_commissioning, -1), be_const_closure(Matter_Device_stop_basic_commissioning_closure) }, + { be_const_key_weak(commissioning_L, -1), be_const_var(15) }, + { be_const_key_weak(bridge_add_endpoint, -1), be_const_closure(Matter_Device_bridge_add_endpoint_closure) }, + { be_const_key_weak(compute_qrcode_content, 72), be_const_closure(Matter_Device_compute_qrcode_content_closure) }, + { be_const_key_weak(UDP_PORT, -1), be_const_int(5540) }, + { be_const_key_weak(udp_server, -1), be_const_var(5) }, + { be_const_key_weak(root_passcode, -1), be_const_var(27) }, { be_const_key_weak(compute_manual_pairing_code, -1), be_const_closure(Matter_Device_compute_manual_pairing_code_closure) }, - { be_const_key_weak(start, 51), be_const_closure(Matter_Device_start_closure) }, - { be_const_key_weak(k2l, -1), be_const_static_closure(Matter_Device_k2l_closure) }, - { be_const_key_weak(PASSCODE_INVALID, 76), be_const_simple_instance(be_nested_simple_instance(&be_class_list, { + { be_const_key_weak(commissioning_instance_eth, -1), be_const_var(18) }, + { be_const_key_weak(_trigger_read_sensors, 29), be_const_closure(Matter_Device__trigger_read_sensors_closure) }, + { be_const_key_weak(bridge_remove_endpoint, -1), be_const_closure(Matter_Device_bridge_remove_endpoint_closure) }, + { be_const_key_weak(stop, -1), be_const_closure(Matter_Device_stop_closure) }, + { be_const_key_weak(msg_send, -1), be_const_closure(Matter_Device_msg_send_closure) }, + { be_const_key_weak(received_ack, -1), be_const_closure(Matter_Device_received_ack_closure) }, + { be_const_key_weak(commissioning_salt, -1), be_const_var(13) }, + { be_const_key_weak(ui, -1), be_const_var(8) }, + { be_const_key_weak(message_handler, -1), be_const_var(6) }, + { be_const_key_weak(mdns_pase_wifi, -1), be_const_var(24) }, + { be_const_key_weak(_mdns_announce_hostname, -1), be_const_closure(Matter_Device__mdns_announce_hostname_closure) }, + { be_const_key_weak(mdns_pase_eth, -1), be_const_var(23) }, + { be_const_key_weak(PASSCODE_INVALID, 15), be_const_simple_instance(be_nested_simple_instance(&be_class_list, { be_const_list( * be_nested_list(12, ( (struct bvalue*) &(const bvalue[]) { be_const_int(0), @@ -5398,92 +5680,14 @@ be_local_class(Matter_Device, be_const_int(12345678), be_const_int(87654321), })) ) } )) }, - { be_const_key_weak(is_commissioning_open, -1), be_const_closure(Matter_Device_is_commissioning_open_closure) }, - { be_const_key_weak(commissioning_discriminator, -1), be_const_var(12) }, - { be_const_key_weak(next_ep, -1), be_const_var(29) }, - { be_const_key_weak(register_plugin_class, 43), be_const_closure(Matter_Device_register_plugin_class_closure) }, - { be_const_key_weak(start_basic_commissioning, 96), be_const_closure(Matter_Device_start_basic_commissioning_closure) }, - { be_const_key_weak(load_param, -1), be_const_closure(Matter_Device_load_param_closure) }, - { be_const_key_weak(ipv4only, -1), be_const_var(28) }, - { be_const_key_weak(generate_random_passcode, 25), be_const_closure(Matter_Device_generate_random_passcode_closure) }, - { be_const_key_weak(commissioning_instance_eth, 26), be_const_var(18) }, - { be_const_key_weak(process_attribute_expansion, -1), be_const_closure(Matter_Device_process_attribute_expansion_closure) }, - { be_const_key_weak(received_ack, 48), be_const_closure(Matter_Device_received_ack_closure) }, - { be_const_key_weak(_instantiate_plugins_from_config, -1), be_const_closure(Matter_Device__instantiate_plugins_from_config_closure) }, - { be_const_key_weak(vendorid, 68), be_const_var(21) }, - { be_const_key_weak(mdns_announce_PASE, -1), be_const_closure(Matter_Device_mdns_announce_PASE_closure) }, - { be_const_key_weak(sessions, -1), be_const_var(7) }, - { be_const_key_weak(commissioning_open, 81), be_const_var(10) }, { be_const_key_weak(mdns_remove_op_discovery, -1), be_const_closure(Matter_Device_mdns_remove_op_discovery_closure) }, - { be_const_key_weak(k2l_num, -1), be_const_static_closure(Matter_Device_k2l_num_closure) }, - { be_const_key_weak(get_plugin_class_arg, 3), be_const_closure(Matter_Device_get_plugin_class_arg_closure) }, - { be_const_key_weak(http_remotes, -1), be_const_var(25) }, - { be_const_key_weak(autoconf_device, -1), be_const_closure(Matter_Device_autoconf_device_closure) }, - { be_const_key_weak(start_commissioning_complete, -1), be_const_closure(Matter_Device_start_commissioning_complete_closure) }, - { be_const_key_weak(plugins_persist, -1), be_const_var(2) }, - { be_const_key_weak(register_native_classes, -1), be_const_closure(Matter_Device_register_native_classes_closure) }, - { be_const_key_weak(save_before_restart, -1), be_const_closure(Matter_Device_save_before_restart_closure) }, - { be_const_key_weak(message_handler, -1), be_const_var(6) }, - { be_const_key_weak(commissioning_admin_fabric, -1), be_const_var(16) }, - { be_const_key_weak(_start_udp, -1), be_const_closure(Matter_Device__start_udp_closure) }, - { be_const_key_weak(root_passcode, -1), be_const_var(27) }, - { be_const_key_weak(stop, -1), be_const_closure(Matter_Device_stop_closure) }, - { be_const_key_weak(hostname_eth, -1), be_const_var(20) }, - { be_const_key_weak(root_salt, 90), be_const_var(31) }, - { be_const_key_weak(PASE_TIMEOUT, -1), be_const_int(600) }, - { be_const_key_weak(bridge_remove_endpoint, 52), be_const_closure(Matter_Device_bridge_remove_endpoint_closure) }, - { be_const_key_weak(stop_basic_commissioning, 91), be_const_closure(Matter_Device_stop_basic_commissioning_closure) }, - { be_const_key_weak(start_commissioning_complete_deferred, -1), be_const_closure(Matter_Device_start_commissioning_complete_deferred_closure) }, - { be_const_key_weak(mdns_remove_PASE, -1), be_const_closure(Matter_Device_mdns_remove_PASE_closure) }, - { be_const_key_weak(is_root_commissioning_open, 32), be_const_closure(Matter_Device_is_root_commissioning_open_closure) }, - { be_const_key_weak(get_active_endpoints, 53), be_const_closure(Matter_Device_get_active_endpoints_closure) }, - { be_const_key_weak(remove_fabric, -1), be_const_closure(Matter_Device_remove_fabric_closure) }, - { be_const_key_weak(sort_distinct, -1), be_const_static_closure(Matter_Device_sort_distinct_closure) }, - { be_const_key_weak(init, 64), be_const_closure(Matter_Device_init_closure) }, - { be_const_key_weak(hostname_wifi, -1), be_const_var(19) }, - { be_const_key_weak(commissioning_iterations, 84), be_const_var(11) }, - { be_const_key_weak(root_L, -1), be_const_var(33) }, - { be_const_key_weak(commissioning_L, -1), be_const_var(15) }, - { be_const_key_weak(register_http_remote, 83), be_const_closure(Matter_Device_register_http_remote_closure) }, - { be_const_key_weak(productid, -1), be_const_var(22) }, - { be_const_key_weak(event_fabrics_saved, -1), be_const_closure(Matter_Device_event_fabrics_saved_closure) }, - { be_const_key_weak(get_plugin_class_displayname, -1), be_const_closure(Matter_Device_get_plugin_class_displayname_closure) }, - { be_const_key_weak(mdns_pase_eth, 49), be_const_var(23) }, - { be_const_key_weak(mdns_pase_wifi, 73), be_const_var(24) }, - { be_const_key_weak(commissioning_instance_wifi, 63), be_const_var(17) }, - { be_const_key_weak(compute_qrcode_content, -1), be_const_closure(Matter_Device_compute_qrcode_content_closure) }, - { be_const_key_weak(mdns_announce_op_discovery, 45), be_const_closure(Matter_Device_mdns_announce_op_discovery_closure) }, - { be_const_key_weak(_compute_pbkdf, -1), be_const_closure(Matter_Device__compute_pbkdf_closure) }, - { be_const_key_weak(udp_server, 77), be_const_var(5) }, - { be_const_key_weak(plugins, -1), be_const_var(1) }, - { be_const_key_weak(FILENAME, -1), be_nested_str_weak(_matter_device_X2Ejson) }, - { be_const_key_weak(every_second, -1), be_const_closure(Matter_Device_every_second_closure) }, - { be_const_key_weak(adjust_next_ep, -1), be_const_closure(Matter_Device_adjust_next_ep_closure) }, + { be_const_key_weak(every_50ms, 20), be_const_closure(Matter_Device_every_50ms_closure) }, + { be_const_key_weak(register_plugin_class, -1), be_const_closure(Matter_Device_register_plugin_class_closure) }, + { be_const_key_weak(commissioning_w0, -1), be_const_var(14) }, + { be_const_key_weak(commissioning_instance_wifi, 14), be_const_var(17) }, { be_const_key_weak(attribute_updated, -1), be_const_closure(Matter_Device_attribute_updated_closure) }, - { be_const_key_weak(msg_send, -1), be_const_closure(Matter_Device_msg_send_closure) }, - { be_const_key_weak(mdns_remove_op_discovery_all_fabrics, -1), be_const_closure(Matter_Device_mdns_remove_op_discovery_all_fabrics_closure) }, - { be_const_key_weak(plugins_config, 42), be_const_var(4) }, - { be_const_key_weak(mdns_announce_op_discovery_all_fabrics, 34), be_const_closure(Matter_Device_mdns_announce_op_discovery_all_fabrics_closure) }, - { be_const_key_weak(plugins_classes, -1), be_const_var(3) }, - { be_const_key_weak(_init_basic_commissioning, 69), be_const_closure(Matter_Device__init_basic_commissioning_closure) }, - { be_const_key_weak(autoconf_device_map, -1), be_const_closure(Matter_Device_autoconf_device_map_closure) }, - { be_const_key_weak(bridge_add_endpoint, -1), be_const_closure(Matter_Device_bridge_add_endpoint_closure) }, - { be_const_key_weak(start_operational_discovery_deferred, -1), be_const_closure(Matter_Device_start_operational_discovery_deferred_closure) }, - { be_const_key_weak(start_root_basic_commissioning, -1), be_const_closure(Matter_Device_start_root_basic_commissioning_closure) }, - { be_const_key_weak(root_iterations, -1), be_const_var(30) }, - { be_const_key_weak(invoke_request, 47), be_const_closure(Matter_Device_invoke_request_closure) }, - { be_const_key_weak(msg_received, -1), be_const_closure(Matter_Device_msg_received_closure) }, - { be_const_key_weak(start_mdns_announce_hostnames, -1), be_const_closure(Matter_Device_start_mdns_announce_hostnames_closure) }, - { be_const_key_weak(root_discriminator, 54), be_const_var(26) }, - { be_const_key_weak(PRODUCT_ID, -1), be_const_int(32768) }, - { be_const_key_weak(ui, -1), be_const_var(8) }, - { be_const_key_weak(commissioning_salt, 33), be_const_var(13) }, - { be_const_key_weak(MtrJoin, -1), be_const_closure(Matter_Device_MtrJoin_closure) }, - { be_const_key_weak(signal_endpoints_changed, 30), be_const_closure(Matter_Device_signal_endpoints_changed_closure) }, - { be_const_key_weak(_mdns_announce_hostname, -1), be_const_closure(Matter_Device__mdns_announce_hostname_closure) }, - { be_const_key_weak(start_operational_discovery, -1), be_const_closure(Matter_Device_start_operational_discovery_closure) }, - { be_const_key_weak(UDP_PORT, 9), be_const_int(5540) }, - { be_const_key_weak(PBKDF_ITERATIONS, -1), be_const_int(1000) }, + { be_const_key_weak(ipv4only, 11), be_const_var(28) }, + { be_const_key_weak(every_250ms, -1), be_const_closure(Matter_Device_every_250ms_closure) }, })), be_str_weak(Matter_Device) ); diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin.h index 505b03178..135f1d210 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin.h @@ -6,77 +6,6 @@ extern const bclass be_class_Matter_Plugin; -/******************************************************************** -** Solidified function: read_event -********************************************************************/ -be_local_closure(Matter_Plugin_read_event, /* name */ - be_nested_proto( - 6, /* nstack */ - 5, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 0, /* has constants */ - NULL, /* no const */ - be_str_weak(read_event), - &be_const_str_solidified, - ( &(const binstruction[ 2]) { /* code */ - 0x4C140000, // 0000 LDNIL R5 - 0x80040A00, // 0001 RET 1 R5 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: get_cluster_list -********************************************************************/ -be_local_closure(Matter_Plugin_get_cluster_list, /* name */ - be_nested_proto( - 8, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 4]) { /* constants */ - /* K0 */ be_nested_str_weak(clusters), - /* K1 */ be_nested_str_weak(keys), - /* K2 */ be_nested_str_weak(push), - /* K3 */ be_nested_str_weak(stop_iteration), - }), - be_str_weak(get_cluster_list), - &be_const_str_solidified, - ( &(const binstruction[18]) { /* code */ - 0x60080012, // 0000 GETGBL R2 G18 - 0x7C080000, // 0001 CALL R2 0 - 0x600C0010, // 0002 GETGBL R3 G16 - 0x88100100, // 0003 GETMBR R4 R0 K0 - 0x8C100901, // 0004 GETMET R4 R4 K1 - 0x7C100200, // 0005 CALL R4 1 - 0x7C0C0200, // 0006 CALL R3 1 - 0xA8020005, // 0007 EXBLK 0 #000E - 0x5C100600, // 0008 MOVE R4 R3 - 0x7C100000, // 0009 CALL R4 0 - 0x8C140502, // 000A GETMET R5 R2 K2 - 0x5C1C0800, // 000B MOVE R7 R4 - 0x7C140400, // 000C CALL R5 2 - 0x7001FFF9, // 000D JMP #0008 - 0x580C0003, // 000E LDCONST R3 K3 - 0xAC0C0200, // 000F CATCH R3 1 0 - 0xB0080000, // 0010 RAISE 2 R0 R0 - 0x80040400, // 0011 RET 1 R2 - }) - ) -); -/*******************************************************************/ - - /******************************************************************** ** Solidified function: get_endpoint ********************************************************************/ @@ -104,375 +33,6 @@ be_local_closure(Matter_Plugin_get_endpoint, /* name */ /*******************************************************************/ -/******************************************************************** -** Solidified function: parse_sensors -********************************************************************/ -be_local_closure(Matter_Plugin_parse_sensors, /* name */ - be_nested_proto( - 2, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 0, /* has constants */ - NULL, /* no const */ - be_str_weak(parse_sensors), - &be_const_str_solidified, - ( &(const binstruction[ 1]) { /* code */ - 0x80000000, // 0000 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: -********************************************************************/ -be_local_closure(Matter_Plugin__X3Clambda_X3E, /* name */ - be_nested_proto( - 3, /* nstack */ - 1, /* argc */ - 0, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 0, /* has constants */ - NULL, /* no const */ - be_str_weak(_X3Clambda_X3E), - &be_const_str_solidified, - ( &(const binstruction[ 4]) { /* code */ - 0x60040008, // 0000 GETGBL R1 G8 - 0x5C080000, // 0001 MOVE R2 R0 - 0x7C040200, // 0002 CALL R1 1 - 0x80040200, // 0003 RET 1 R1 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: update_shadow_lazy -********************************************************************/ -be_local_closure(Matter_Plugin_update_shadow_lazy, /* name */ - be_nested_proto( - 3, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 3]) { /* constants */ - /* K0 */ be_nested_str_weak(tick), - /* K1 */ be_nested_str_weak(device), - /* K2 */ be_nested_str_weak(update_shadow), - }), - be_str_weak(update_shadow_lazy), - &be_const_str_solidified, - ( &(const binstruction[11]) { /* code */ - 0x88040100, // 0000 GETMBR R1 R0 K0 - 0x88080101, // 0001 GETMBR R2 R0 K1 - 0x88080500, // 0002 GETMBR R2 R2 K0 - 0x20040202, // 0003 NE R1 R1 R2 - 0x78060004, // 0004 JMPF R1 #000A - 0x8C040102, // 0005 GETMET R1 R0 K2 - 0x7C040200, // 0006 CALL R1 1 - 0x88040101, // 0007 GETMBR R1 R0 K1 - 0x88040300, // 0008 GETMBR R1 R1 K0 - 0x90020001, // 0009 SETMBR R0 K0 R1 - 0x80000000, // 000A RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: subscribe_event -********************************************************************/ -be_local_closure(Matter_Plugin_subscribe_event, /* name */ - be_nested_proto( - 6, /* nstack */ - 5, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 0, /* has constants */ - NULL, /* no const */ - be_str_weak(subscribe_event), - &be_const_str_solidified, - ( &(const binstruction[ 2]) { /* code */ - 0x4C140000, // 0000 LDNIL R5 - 0x80040A00, // 0001 RET 1 R5 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: every_250ms -********************************************************************/ -be_local_closure(Matter_Plugin_every_250ms, /* name */ - be_nested_proto( - 4, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[10]) { /* constants */ - /* K0 */ be_nested_str_weak(update_next), - /* K1 */ be_nested_str_weak(matter), - /* K2 */ be_nested_str_weak(jitter), - /* K3 */ be_nested_str_weak(UPDATE_TIME), - /* K4 */ be_nested_str_weak(tasmota), - /* K5 */ be_nested_str_weak(time_reached), - /* K6 */ be_nested_str_weak(tick), - /* K7 */ be_nested_str_weak(device), - /* K8 */ be_nested_str_weak(update_shadow), - /* K9 */ be_nested_str_weak(millis), - }), - be_str_weak(every_250ms), - &be_const_str_solidified, - ( &(const binstruction[28]) { /* code */ - 0x88040100, // 0000 GETMBR R1 R0 K0 - 0x4C080000, // 0001 LDNIL R2 - 0x1C040202, // 0002 EQ R1 R1 R2 - 0x78060005, // 0003 JMPF R1 #000A - 0xB8060200, // 0004 GETNGBL R1 K1 - 0x8C040302, // 0005 GETMET R1 R1 K2 - 0x880C0103, // 0006 GETMBR R3 R0 K3 - 0x7C040400, // 0007 CALL R1 2 - 0x90020001, // 0008 SETMBR R0 K0 R1 - 0x70020010, // 0009 JMP #001B - 0xB8060800, // 000A GETNGBL R1 K4 - 0x8C040305, // 000B GETMET R1 R1 K5 - 0x880C0100, // 000C GETMBR R3 R0 K0 - 0x7C040400, // 000D CALL R1 2 - 0x7806000B, // 000E JMPF R1 #001B - 0x88040106, // 000F GETMBR R1 R0 K6 - 0x88080107, // 0010 GETMBR R2 R0 K7 - 0x88080506, // 0011 GETMBR R2 R2 K6 - 0x20040202, // 0012 NE R1 R1 R2 - 0x78060001, // 0013 JMPF R1 #0016 - 0x8C040108, // 0014 GETMET R1 R0 K8 - 0x7C040200, // 0015 CALL R1 1 - 0xB8060800, // 0016 GETNGBL R1 K4 - 0x8C040309, // 0017 GETMET R1 R1 K9 - 0x880C0103, // 0018 GETMBR R3 R0 K3 - 0x7C040400, // 0019 CALL R1 2 - 0x90020001, // 001A SETMBR R0 K0 R1 - 0x80000000, // 001B RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: ui_conf_to_string -********************************************************************/ -be_local_closure(Matter_Plugin_ui_conf_to_string, /* name */ - be_nested_proto( - 9, /* nstack */ - 2, /* argc */ - 4, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 4]) { /* constants */ - /* K0 */ be_const_class(be_class_Matter_Plugin), - /* K1 */ be_nested_str_weak(ARG), - /* K2 */ be_nested_str_weak(find), - /* K3 */ be_nested_str_weak(), - }), - be_str_weak(ui_conf_to_string), - &be_const_str_solidified, - ( &(const binstruction[12]) { /* code */ - 0x58080000, // 0000 LDCONST R2 K0 - 0x880C0101, // 0001 GETMBR R3 R0 K1 - 0x780E0006, // 0002 JMPF R3 #000A - 0x60100008, // 0003 GETGBL R4 G8 - 0x8C140302, // 0004 GETMET R5 R1 K2 - 0x5C1C0600, // 0005 MOVE R7 R3 - 0x58200003, // 0006 LDCONST R8 K3 - 0x7C140600, // 0007 CALL R5 3 - 0x7C100200, // 0008 CALL R4 1 - 0x70020000, // 0009 JMP #000B - 0x58100003, // 000A LDCONST R4 K3 - 0x80040800, // 000B RET 1 R4 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: write_attribute -********************************************************************/ -be_local_closure(Matter_Plugin_write_attribute, /* name */ - be_nested_proto( - 5, /* nstack */ - 4, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 0, /* has constants */ - NULL, /* no const */ - be_str_weak(write_attribute), - &be_const_str_solidified, - ( &(const binstruction[ 2]) { /* code */ - 0x4C100000, // 0000 LDNIL R4 - 0x80040800, // 0001 RET 1 R4 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: subscribe_attribute -********************************************************************/ -be_local_closure(Matter_Plugin_subscribe_attribute, /* name */ - be_nested_proto( - 6, /* nstack */ - 5, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 0, /* has constants */ - NULL, /* no const */ - be_str_weak(subscribe_attribute), - &be_const_str_solidified, - ( &(const binstruction[ 2]) { /* code */ - 0x4C140000, // 0000 LDNIL R5 - 0x80040A00, // 0001 RET 1 R5 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: consolidate_clusters -********************************************************************/ -be_local_closure(Matter_Plugin_consolidate_clusters, /* name */ - be_nested_proto( - 12, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 1, /* has sup protos */ - ( &(const struct bproto*[ 1]) { - be_nested_proto( - 3, /* nstack */ - 1, /* argc */ - 0, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 0, /* has constants */ - NULL, /* no const */ - be_str_weak(real_super), - &be_const_str_solidified, - ( &(const binstruction[ 4]) { /* code */ - 0x60040003, // 0000 GETGBL R1 G3 - 0x5C080000, // 0001 MOVE R2 R0 - 0x7C040200, // 0002 CALL R1 1 - 0x80040200, // 0003 RET 1 R1 - }) - ), - }), - 1, /* has constants */ - ( &(const bvalue[ 6]) { /* constants */ - /* K0 */ be_nested_str_weak(CLUSTERS), - /* K1 */ be_nested_str_weak(keys), - /* K2 */ be_nested_str_weak(contains), - /* K3 */ be_nested_str_weak(find), - /* K4 */ be_nested_str_weak(push), - /* K5 */ be_nested_str_weak(stop_iteration), - }), - be_str_weak(consolidate_clusters), - &be_const_str_solidified, - ( &(const binstruction[53]) { /* code */ - 0x84040000, // 0000 CLOSURE R1 P0 - 0x60080013, // 0001 GETGBL R2 G19 - 0x7C080000, // 0002 CALL R2 0 - 0x5C0C0000, // 0003 MOVE R3 R0 - 0x4C100000, // 0004 LDNIL R4 - 0x20100604, // 0005 NE R4 R3 R4 - 0x7812002C, // 0006 JMPF R4 #0034 - 0x88100700, // 0007 GETMBR R4 R3 K0 - 0x60140010, // 0008 GETGBL R5 G16 - 0x8C180901, // 0009 GETMET R6 R4 K1 - 0x7C180200, // 000A CALL R6 1 - 0x7C140200, // 000B CALL R5 1 - 0xA802001E, // 000C EXBLK 0 #002C - 0x5C180A00, // 000D MOVE R6 R5 - 0x7C180000, // 000E CALL R6 0 - 0x8C1C0502, // 000F GETMET R7 R2 K2 - 0x5C240C00, // 0010 MOVE R9 R6 - 0x7C1C0400, // 0011 CALL R7 2 - 0x741E0002, // 0012 JMPT R7 #0016 - 0x601C0012, // 0013 GETGBL R7 G18 - 0x7C1C0000, // 0014 CALL R7 0 - 0x98080C07, // 0015 SETIDX R2 R6 R7 - 0x601C0010, // 0016 GETGBL R7 G16 - 0x94200806, // 0017 GETIDX R8 R4 R6 - 0x7C1C0200, // 0018 CALL R7 1 - 0xA802000D, // 0019 EXBLK 0 #0028 - 0x5C200E00, // 001A MOVE R8 R7 - 0x7C200000, // 001B CALL R8 0 - 0x94240406, // 001C GETIDX R9 R2 R6 - 0x8C241303, // 001D GETMET R9 R9 K3 - 0x5C2C1000, // 001E MOVE R11 R8 - 0x7C240400, // 001F CALL R9 2 - 0x4C280000, // 0020 LDNIL R10 - 0x1C24120A, // 0021 EQ R9 R9 R10 - 0x78260003, // 0022 JMPF R9 #0027 - 0x94240406, // 0023 GETIDX R9 R2 R6 - 0x8C241304, // 0024 GETMET R9 R9 K4 - 0x5C2C1000, // 0025 MOVE R11 R8 - 0x7C240400, // 0026 CALL R9 2 - 0x7001FFF1, // 0027 JMP #001A - 0x581C0005, // 0028 LDCONST R7 K5 - 0xAC1C0200, // 0029 CATCH R7 1 0 - 0xB0080000, // 002A RAISE 2 R0 R0 - 0x7001FFE0, // 002B JMP #000D - 0x58140005, // 002C LDCONST R5 K5 - 0xAC140200, // 002D CATCH R5 1 0 - 0xB0080000, // 002E RAISE 2 R0 R0 - 0x5C140200, // 002F MOVE R5 R1 - 0x5C180600, // 0030 MOVE R6 R3 - 0x7C140200, // 0031 CALL R5 1 - 0x5C0C0A00, // 0032 MOVE R3 R5 - 0x7001FFCF, // 0033 JMP #0004 - 0x80040400, // 0034 RET 1 R2 - }) - ) -); -/*******************************************************************/ - - /******************************************************************** ** Solidified function: read_attribute ********************************************************************/ @@ -621,24 +181,39 @@ be_local_closure(Matter_Plugin_read_attribute, /* name */ /******************************************************************** -** Solidified function: invoke_request +** Solidified function: ui_conf_to_string ********************************************************************/ -be_local_closure(Matter_Plugin_invoke_request, /* name */ +be_local_closure(Matter_Plugin_ui_conf_to_string, /* name */ be_nested_proto( - 5, /* nstack */ - 4, /* argc */ - 2, /* varg */ + 9, /* nstack */ + 2, /* argc */ + 4, /* varg */ 0, /* has upvals */ NULL, /* no upvals */ 0, /* has sup protos */ NULL, /* no sub protos */ - 0, /* has constants */ - NULL, /* no const */ - be_str_weak(invoke_request), + 1, /* has constants */ + ( &(const bvalue[ 4]) { /* constants */ + /* K0 */ be_const_class(be_class_Matter_Plugin), + /* K1 */ be_nested_str_weak(ARG), + /* K2 */ be_nested_str_weak(find), + /* K3 */ be_nested_str_weak(), + }), + be_str_weak(ui_conf_to_string), &be_const_str_solidified, - ( &(const binstruction[ 2]) { /* code */ - 0x4C100000, // 0000 LDNIL R4 - 0x80040800, // 0001 RET 1 R4 + ( &(const binstruction[12]) { /* code */ + 0x58080000, // 0000 LDCONST R2 K0 + 0x880C0101, // 0001 GETMBR R3 R0 K1 + 0x780E0006, // 0002 JMPF R3 #000A + 0x60100008, // 0003 GETGBL R4 G8 + 0x8C140302, // 0004 GETMET R5 R1 K2 + 0x5C1C0600, // 0005 MOVE R7 R3 + 0x58200003, // 0006 LDCONST R8 K3 + 0x7C140600, // 0007 CALL R5 3 + 0x7C100200, // 0008 CALL R4 1 + 0x70020000, // 0009 JMP #000B + 0x58100003, // 000A LDCONST R4 K3 + 0x80040800, // 000B RET 1 R4 }) ) ); @@ -646,34 +221,9 @@ be_local_closure(Matter_Plugin_invoke_request, /* name */ /******************************************************************** -** Solidified function: timed_request +** Solidified function: is_local_device ********************************************************************/ -be_local_closure(Matter_Plugin_timed_request, /* name */ - be_nested_proto( - 5, /* nstack */ - 4, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 0, /* has constants */ - NULL, /* no const */ - be_str_weak(timed_request), - &be_const_str_solidified, - ( &(const binstruction[ 2]) { /* code */ - 0x4C100000, // 0000 LDNIL R4 - 0x80040800, // 0001 RET 1 R4 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: update_shadow -********************************************************************/ -be_local_closure(Matter_Plugin_update_shadow, /* name */ +be_local_closure(Matter_Plugin_is_local_device, /* name */ be_nested_proto( 2, /* nstack */ 1, /* argc */ @@ -682,18 +232,13 @@ be_local_closure(Matter_Plugin_update_shadow, /* name */ NULL, /* no upvals */ 0, /* has sup protos */ NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 2]) { /* constants */ - /* K0 */ be_nested_str_weak(tick), - /* K1 */ be_nested_str_weak(device), - }), - be_str_weak(update_shadow), + 0, /* has constants */ + NULL, /* no const */ + be_str_weak(is_local_device), &be_const_str_solidified, - ( &(const binstruction[ 4]) { /* code */ - 0x88040101, // 0000 GETMBR R1 R0 K1 - 0x88040300, // 0001 GETMBR R1 R1 K0 - 0x90020001, // 0002 SETMBR R0 K0 R1 - 0x80000000, // 0003 RET 0 + ( &(const binstruction[ 2]) { /* code */ + 0x50040200, // 0000 LDBOOL R1 1 0 + 0x80040200, // 0001 RET 1 R1 }) ) ); @@ -701,71 +246,23 @@ be_local_closure(Matter_Plugin_update_shadow, /* name */ /******************************************************************** -** Solidified function: ui_string_to_conf +** Solidified function: parse_configuration ********************************************************************/ -be_local_closure(Matter_Plugin_ui_string_to_conf, /* name */ +be_local_closure(Matter_Plugin_parse_configuration, /* name */ be_nested_proto( - 8, /* nstack */ - 3, /* argc */ - 4, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 3]) { /* constants */ - /* K0 */ be_const_class(be_class_Matter_Plugin), - /* K1 */ be_nested_str_weak(ARG), - /* K2 */ be_nested_str_weak(ARG_TYPE), - }), - be_str_weak(ui_string_to_conf), - &be_const_str_solidified, - ( &(const binstruction[10]) { /* code */ - 0x580C0000, // 0000 LDCONST R3 K0 - 0x88100101, // 0001 GETMBR R4 R0 K1 - 0x88140102, // 0002 GETMBR R5 R0 K2 - 0x780A0004, // 0003 JMPF R2 #0009 - 0x78120003, // 0004 JMPF R4 #0009 - 0x5C180A00, // 0005 MOVE R6 R5 - 0x5C1C0400, // 0006 MOVE R7 R2 - 0x7C180200, // 0007 CALL R6 1 - 0x98040806, // 0008 SETIDX R1 R4 R6 - 0x80040200, // 0009 RET 1 R1 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: attribute_updated -********************************************************************/ -be_local_closure(Matter_Plugin_attribute_updated, /* name */ - be_nested_proto( - 10, /* nstack */ - 4, /* argc */ + 2, /* nstack */ + 2, /* argc */ 2, /* varg */ 0, /* has upvals */ NULL, /* no upvals */ 0, /* has sup protos */ NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 3]) { /* constants */ - /* K0 */ be_nested_str_weak(device), - /* K1 */ be_nested_str_weak(attribute_updated), - /* K2 */ be_nested_str_weak(endpoint), - }), - be_str_weak(attribute_updated), + 0, /* has constants */ + NULL, /* no const */ + be_str_weak(parse_configuration), &be_const_str_solidified, - ( &(const binstruction[ 8]) { /* code */ - 0x88100100, // 0000 GETMBR R4 R0 K0 - 0x8C100901, // 0001 GETMET R4 R4 K1 - 0x88180102, // 0002 GETMBR R6 R0 K2 - 0x5C1C0200, // 0003 MOVE R7 R1 - 0x5C200400, // 0004 MOVE R8 R2 - 0x5C240600, // 0005 MOVE R9 R3 - 0x7C100A00, // 0006 CALL R4 5 - 0x80000000, // 0007 RET 0 + ( &(const binstruction[ 1]) { /* code */ + 0x80000000, // 0000 RET 0 }) ) ); @@ -815,6 +312,109 @@ be_local_closure(Matter_Plugin_has, /* name */ /*******************************************************************/ +/******************************************************************** +** Solidified function: consolidate_clusters +********************************************************************/ +be_local_closure(Matter_Plugin_consolidate_clusters, /* name */ + be_nested_proto( + 12, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 1, /* has sup protos */ + ( &(const struct bproto*[ 1]) { + be_nested_proto( + 3, /* nstack */ + 1, /* argc */ + 0, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 0, /* has constants */ + NULL, /* no const */ + be_str_weak(real_super), + &be_const_str_solidified, + ( &(const binstruction[ 4]) { /* code */ + 0x60040003, // 0000 GETGBL R1 G3 + 0x5C080000, // 0001 MOVE R2 R0 + 0x7C040200, // 0002 CALL R1 1 + 0x80040200, // 0003 RET 1 R1 + }) + ), + }), + 1, /* has constants */ + ( &(const bvalue[ 6]) { /* constants */ + /* K0 */ be_nested_str_weak(CLUSTERS), + /* K1 */ be_nested_str_weak(keys), + /* K2 */ be_nested_str_weak(contains), + /* K3 */ be_nested_str_weak(find), + /* K4 */ be_nested_str_weak(push), + /* K5 */ be_nested_str_weak(stop_iteration), + }), + be_str_weak(consolidate_clusters), + &be_const_str_solidified, + ( &(const binstruction[53]) { /* code */ + 0x84040000, // 0000 CLOSURE R1 P0 + 0x60080013, // 0001 GETGBL R2 G19 + 0x7C080000, // 0002 CALL R2 0 + 0x5C0C0000, // 0003 MOVE R3 R0 + 0x4C100000, // 0004 LDNIL R4 + 0x20100604, // 0005 NE R4 R3 R4 + 0x7812002C, // 0006 JMPF R4 #0034 + 0x88100700, // 0007 GETMBR R4 R3 K0 + 0x60140010, // 0008 GETGBL R5 G16 + 0x8C180901, // 0009 GETMET R6 R4 K1 + 0x7C180200, // 000A CALL R6 1 + 0x7C140200, // 000B CALL R5 1 + 0xA802001E, // 000C EXBLK 0 #002C + 0x5C180A00, // 000D MOVE R6 R5 + 0x7C180000, // 000E CALL R6 0 + 0x8C1C0502, // 000F GETMET R7 R2 K2 + 0x5C240C00, // 0010 MOVE R9 R6 + 0x7C1C0400, // 0011 CALL R7 2 + 0x741E0002, // 0012 JMPT R7 #0016 + 0x601C0012, // 0013 GETGBL R7 G18 + 0x7C1C0000, // 0014 CALL R7 0 + 0x98080C07, // 0015 SETIDX R2 R6 R7 + 0x601C0010, // 0016 GETGBL R7 G16 + 0x94200806, // 0017 GETIDX R8 R4 R6 + 0x7C1C0200, // 0018 CALL R7 1 + 0xA802000D, // 0019 EXBLK 0 #0028 + 0x5C200E00, // 001A MOVE R8 R7 + 0x7C200000, // 001B CALL R8 0 + 0x94240406, // 001C GETIDX R9 R2 R6 + 0x8C241303, // 001D GETMET R9 R9 K3 + 0x5C2C1000, // 001E MOVE R11 R8 + 0x7C240400, // 001F CALL R9 2 + 0x4C280000, // 0020 LDNIL R10 + 0x1C24120A, // 0021 EQ R9 R9 R10 + 0x78260003, // 0022 JMPF R9 #0027 + 0x94240406, // 0023 GETIDX R9 R2 R6 + 0x8C241304, // 0024 GETMET R9 R9 K4 + 0x5C2C1000, // 0025 MOVE R11 R8 + 0x7C240400, // 0026 CALL R9 2 + 0x7001FFF1, // 0027 JMP #001A + 0x581C0005, // 0028 LDCONST R7 K5 + 0xAC1C0200, // 0029 CATCH R7 1 0 + 0xB0080000, // 002A RAISE 2 R0 R0 + 0x7001FFE0, // 002B JMP #000D + 0x58140005, // 002C LDCONST R5 K5 + 0xAC140200, // 002D CATCH R5 1 0 + 0xB0080000, // 002E RAISE 2 R0 R0 + 0x5C140200, // 002F MOVE R5 R1 + 0x5C180600, // 0030 MOVE R6 R3 + 0x7C140200, // 0031 CALL R5 1 + 0x5C0C0A00, // 0032 MOVE R3 R5 + 0x7001FFCF, // 0033 JMP #0004 + 0x80040400, // 0034 RET 1 R2 + }) + ) +); +/*******************************************************************/ + + /******************************************************************** ** Solidified function: get_attribute_list ********************************************************************/ @@ -849,11 +449,100 @@ be_local_closure(Matter_Plugin_get_attribute_list, /* name */ /******************************************************************** -** Solidified function: init +** Solidified function: ********************************************************************/ -be_local_closure(Matter_Plugin_init, /* name */ +be_local_closure(Matter_Plugin__X3Clambda_X3E, /* name */ be_nested_proto( - 6, /* nstack */ + 3, /* nstack */ + 1, /* argc */ + 0, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 0, /* has constants */ + NULL, /* no const */ + be_str_weak(_X3Clambda_X3E), + &be_const_str_solidified, + ( &(const binstruction[ 4]) { /* code */ + 0x60040008, // 0000 GETGBL R1 G8 + 0x5C080000, // 0001 MOVE R2 R0 + 0x7C040200, // 0002 CALL R1 1 + 0x80040200, // 0003 RET 1 R1 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: update_shadow_lazy +********************************************************************/ +be_local_closure(Matter_Plugin_update_shadow_lazy, /* name */ + be_nested_proto( + 3, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 3]) { /* constants */ + /* K0 */ be_nested_str_weak(tick), + /* K1 */ be_nested_str_weak(device), + /* K2 */ be_nested_str_weak(update_shadow), + }), + be_str_weak(update_shadow_lazy), + &be_const_str_solidified, + ( &(const binstruction[11]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x88080101, // 0001 GETMBR R2 R0 K1 + 0x88080500, // 0002 GETMBR R2 R2 K0 + 0x20040202, // 0003 NE R1 R1 R2 + 0x78060004, // 0004 JMPF R1 #000A + 0x8C040102, // 0005 GETMET R1 R0 K2 + 0x7C040200, // 0006 CALL R1 1 + 0x88040101, // 0007 GETMBR R1 R0 K1 + 0x88040300, // 0008 GETMBR R1 R1 K0 + 0x90020001, // 0009 SETMBR R0 K0 R1 + 0x80000000, // 000A RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: parse_sensors +********************************************************************/ +be_local_closure(Matter_Plugin_parse_sensors, /* name */ + be_nested_proto( + 2, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 0, /* has constants */ + NULL, /* no const */ + be_str_weak(parse_sensors), + &be_const_str_solidified, + ( &(const binstruction[ 1]) { /* code */ + 0x80000000, // 0000 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: attribute_updated +********************************************************************/ +be_local_closure(Matter_Plugin_attribute_updated, /* name */ + be_nested_proto( + 10, /* nstack */ 4, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -861,21 +550,385 @@ be_local_closure(Matter_Plugin_init, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ + ( &(const bvalue[ 3]) { /* constants */ + /* K0 */ be_nested_str_weak(device), + /* K1 */ be_nested_str_weak(attribute_updated), + /* K2 */ be_nested_str_weak(endpoint), + }), + be_str_weak(attribute_updated), + &be_const_str_solidified, + ( &(const binstruction[ 8]) { /* code */ + 0x88100100, // 0000 GETMBR R4 R0 K0 + 0x8C100901, // 0001 GETMET R4 R4 K1 + 0x88180102, // 0002 GETMBR R6 R0 K2 + 0x5C1C0200, // 0003 MOVE R7 R1 + 0x5C200400, // 0004 MOVE R8 R2 + 0x5C240600, // 0005 MOVE R9 R3 + 0x7C100A00, // 0006 CALL R4 5 + 0x80000000, // 0007 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: subscribe_event +********************************************************************/ +be_local_closure(Matter_Plugin_subscribe_event, /* name */ + be_nested_proto( + 6, /* nstack */ + 5, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 0, /* has constants */ + NULL, /* no const */ + be_str_weak(subscribe_event), + &be_const_str_solidified, + ( &(const binstruction[ 2]) { /* code */ + 0x4C140000, // 0000 LDNIL R5 + 0x80040A00, // 0001 RET 1 R5 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: write_attribute +********************************************************************/ +be_local_closure(Matter_Plugin_write_attribute, /* name */ + be_nested_proto( + 5, /* nstack */ + 4, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 0, /* has constants */ + NULL, /* no const */ + be_str_weak(write_attribute), + &be_const_str_solidified, + ( &(const binstruction[ 2]) { /* code */ + 0x4C100000, // 0000 LDNIL R4 + 0x80040800, // 0001 RET 1 R4 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: get_cluster_list +********************************************************************/ +be_local_closure(Matter_Plugin_get_cluster_list, /* name */ + be_nested_proto( + 8, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ ( &(const bvalue[ 4]) { /* constants */ + /* K0 */ be_nested_str_weak(clusters), + /* K1 */ be_nested_str_weak(keys), + /* K2 */ be_nested_str_weak(push), + /* K3 */ be_nested_str_weak(stop_iteration), + }), + be_str_weak(get_cluster_list), + &be_const_str_solidified, + ( &(const binstruction[18]) { /* code */ + 0x60080012, // 0000 GETGBL R2 G18 + 0x7C080000, // 0001 CALL R2 0 + 0x600C0010, // 0002 GETGBL R3 G16 + 0x88100100, // 0003 GETMBR R4 R0 K0 + 0x8C100901, // 0004 GETMET R4 R4 K1 + 0x7C100200, // 0005 CALL R4 1 + 0x7C0C0200, // 0006 CALL R3 1 + 0xA8020005, // 0007 EXBLK 0 #000E + 0x5C100600, // 0008 MOVE R4 R3 + 0x7C100000, // 0009 CALL R4 0 + 0x8C140502, // 000A GETMET R5 R2 K2 + 0x5C1C0800, // 000B MOVE R7 R4 + 0x7C140400, // 000C CALL R5 2 + 0x7001FFF9, // 000D JMP #0008 + 0x580C0003, // 000E LDCONST R3 K3 + 0xAC0C0200, // 000F CATCH R3 1 0 + 0xB0080000, // 0010 RAISE 2 R0 R0 + 0x80040400, // 0011 RET 1 R2 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: subscribe_attribute +********************************************************************/ +be_local_closure(Matter_Plugin_subscribe_attribute, /* name */ + be_nested_proto( + 6, /* nstack */ + 5, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 0, /* has constants */ + NULL, /* no const */ + be_str_weak(subscribe_attribute), + &be_const_str_solidified, + ( &(const binstruction[ 2]) { /* code */ + 0x4C140000, // 0000 LDNIL R5 + 0x80040A00, // 0001 RET 1 R5 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: ui_string_to_conf +********************************************************************/ +be_local_closure(Matter_Plugin_ui_string_to_conf, /* name */ + be_nested_proto( + 8, /* nstack */ + 3, /* argc */ + 4, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 3]) { /* constants */ + /* K0 */ be_const_class(be_class_Matter_Plugin), + /* K1 */ be_nested_str_weak(ARG), + /* K2 */ be_nested_str_weak(ARG_TYPE), + }), + be_str_weak(ui_string_to_conf), + &be_const_str_solidified, + ( &(const binstruction[10]) { /* code */ + 0x580C0000, // 0000 LDCONST R3 K0 + 0x88100101, // 0001 GETMBR R4 R0 K1 + 0x88140102, // 0002 GETMBR R5 R0 K2 + 0x780A0004, // 0003 JMPF R2 #0009 + 0x78120003, // 0004 JMPF R4 #0009 + 0x5C180A00, // 0005 MOVE R6 R5 + 0x5C1C0400, // 0006 MOVE R7 R2 + 0x7C180200, // 0007 CALL R6 1 + 0x98040806, // 0008 SETIDX R1 R4 R6 + 0x80040200, // 0009 RET 1 R1 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: read_event +********************************************************************/ +be_local_closure(Matter_Plugin_read_event, /* name */ + be_nested_proto( + 6, /* nstack */ + 5, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 0, /* has constants */ + NULL, /* no const */ + be_str_weak(read_event), + &be_const_str_solidified, + ( &(const binstruction[ 2]) { /* code */ + 0x4C140000, // 0000 LDNIL R5 + 0x80040A00, // 0001 RET 1 R5 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: update_shadow +********************************************************************/ +be_local_closure(Matter_Plugin_update_shadow, /* name */ + be_nested_proto( + 2, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 2]) { /* constants */ + /* K0 */ be_nested_str_weak(tick), + /* K1 */ be_nested_str_weak(device), + }), + be_str_weak(update_shadow), + &be_const_str_solidified, + ( &(const binstruction[ 4]) { /* code */ + 0x88040101, // 0000 GETMBR R1 R0 K1 + 0x88040300, // 0001 GETMBR R1 R1 K0 + 0x90020001, // 0002 SETMBR R0 K0 R1 + 0x80000000, // 0003 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: every_250ms +********************************************************************/ +be_local_closure(Matter_Plugin_every_250ms, /* name */ + be_nested_proto( + 4, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[10]) { /* constants */ + /* K0 */ be_nested_str_weak(update_next), + /* K1 */ be_nested_str_weak(matter), + /* K2 */ be_nested_str_weak(jitter), + /* K3 */ be_nested_str_weak(UPDATE_TIME), + /* K4 */ be_nested_str_weak(tasmota), + /* K5 */ be_nested_str_weak(time_reached), + /* K6 */ be_nested_str_weak(tick), + /* K7 */ be_nested_str_weak(device), + /* K8 */ be_nested_str_weak(update_shadow), + /* K9 */ be_nested_str_weak(millis), + }), + be_str_weak(every_250ms), + &be_const_str_solidified, + ( &(const binstruction[28]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x4C080000, // 0001 LDNIL R2 + 0x1C040202, // 0002 EQ R1 R1 R2 + 0x78060005, // 0003 JMPF R1 #000A + 0xB8060200, // 0004 GETNGBL R1 K1 + 0x8C040302, // 0005 GETMET R1 R1 K2 + 0x880C0103, // 0006 GETMBR R3 R0 K3 + 0x7C040400, // 0007 CALL R1 2 + 0x90020001, // 0008 SETMBR R0 K0 R1 + 0x70020010, // 0009 JMP #001B + 0xB8060800, // 000A GETNGBL R1 K4 + 0x8C040305, // 000B GETMET R1 R1 K5 + 0x880C0100, // 000C GETMBR R3 R0 K0 + 0x7C040400, // 000D CALL R1 2 + 0x7806000B, // 000E JMPF R1 #001B + 0x88040106, // 000F GETMBR R1 R0 K6 + 0x88080107, // 0010 GETMBR R2 R0 K7 + 0x88080506, // 0011 GETMBR R2 R2 K6 + 0x20040202, // 0012 NE R1 R1 R2 + 0x78060001, // 0013 JMPF R1 #0016 + 0x8C040108, // 0014 GETMET R1 R0 K8 + 0x7C040200, // 0015 CALL R1 1 + 0xB8060800, // 0016 GETNGBL R1 K4 + 0x8C040309, // 0017 GETMET R1 R1 K9 + 0x880C0103, // 0018 GETMBR R3 R0 K3 + 0x7C040400, // 0019 CALL R1 2 + 0x90020001, // 001A SETMBR R0 K0 R1 + 0x80000000, // 001B RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: timed_request +********************************************************************/ +be_local_closure(Matter_Plugin_timed_request, /* name */ + be_nested_proto( + 5, /* nstack */ + 4, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 0, /* has constants */ + NULL, /* no const */ + be_str_weak(timed_request), + &be_const_str_solidified, + ( &(const binstruction[ 2]) { /* code */ + 0x4C100000, // 0000 LDNIL R4 + 0x80040800, // 0001 RET 1 R4 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: init +********************************************************************/ +be_local_closure(Matter_Plugin_init, /* name */ + be_nested_proto( + 7, /* nstack */ + 4, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 5]) { /* constants */ /* K0 */ be_nested_str_weak(device), /* K1 */ be_nested_str_weak(endpoint), /* K2 */ be_nested_str_weak(clusters), /* K3 */ be_nested_str_weak(consolidate_clusters), + /* K4 */ be_nested_str_weak(parse_configuration), }), be_str_weak(init), &be_const_str_solidified, - ( &(const binstruction[ 6]) { /* code */ + ( &(const binstruction[ 9]) { /* code */ 0x90020001, // 0000 SETMBR R0 K0 R1 0x90020202, // 0001 SETMBR R0 K1 R2 0x8C100103, // 0002 GETMET R4 R0 K3 0x7C100200, // 0003 CALL R4 1 0x90020404, // 0004 SETMBR R0 K2 R4 - 0x80000000, // 0005 RET 0 + 0x8C100104, // 0005 GETMET R4 R0 K4 + 0x5C180600, // 0006 MOVE R6 R3 + 0x7C100400, // 0007 CALL R4 2 + 0x80000000, // 0008 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: invoke_request +********************************************************************/ +be_local_closure(Matter_Plugin_invoke_request, /* name */ + be_nested_proto( + 5, /* nstack */ + 4, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 0, /* has constants */ + NULL, /* no const */ + be_str_weak(invoke_request), + &be_const_str_solidified, + ( &(const binstruction[ 2]) { /* code */ + 0x4C100000, // 0000 LDNIL R4 + 0x80040800, // 0001 RET 1 R4 }) ) ); @@ -888,17 +941,37 @@ be_local_closure(Matter_Plugin_init, /* name */ be_local_class(Matter_Plugin, 5, NULL, - be_nested_map(31, + be_nested_map(33, ( (struct bmapnode*) &(const bmapnode[]) { - { be_const_key_weak(read_event, -1), be_const_closure(Matter_Plugin_read_event_closure) }, - { be_const_key_weak(clusters, 21), be_const_var(3) }, - { be_const_key_weak(get_cluster_list, 14), be_const_closure(Matter_Plugin_get_cluster_list_closure) }, - { be_const_key_weak(get_endpoint, -1), be_const_closure(Matter_Plugin_get_endpoint_closure) }, - { be_const_key_weak(tick, 23), be_const_var(4) }, + { be_const_key_weak(clusters, -1), be_const_var(3) }, + { be_const_key_weak(get_endpoint, 25), be_const_closure(Matter_Plugin_get_endpoint_closure) }, + { be_const_key_weak(update_next, -1), be_const_var(0) }, + { be_const_key_weak(read_attribute, -1), be_const_closure(Matter_Plugin_read_attribute_closure) }, + { be_const_key_weak(ui_conf_to_string, 23), be_const_static_closure(Matter_Plugin_ui_conf_to_string_closure) }, + { be_const_key_weak(init, -1), be_const_closure(Matter_Plugin_init_closure) }, { be_const_key_weak(NAME, -1), be_nested_str_weak() }, - { be_const_key_weak(ARG_TYPE, 4), be_const_static_closure(Matter_Plugin__X3Clambda_X3E_closure) }, - { be_const_key_weak(update_shadow_lazy, 28), be_const_closure(Matter_Plugin_update_shadow_lazy_closure) }, - { be_const_key_weak(CLUSTERS, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { + { be_const_key_weak(endpoint, -1), be_const_var(2) }, + { be_const_key_weak(tick, -1), be_const_var(4) }, + { be_const_key_weak(UPDATE_TIME, 5), be_const_int(5000) }, + { be_const_key_weak(parse_configuration, 21), be_const_closure(Matter_Plugin_parse_configuration_closure) }, + { be_const_key_weak(timed_request, -1), be_const_closure(Matter_Plugin_timed_request_closure) }, + { be_const_key_weak(attribute_updated, -1), be_const_closure(Matter_Plugin_attribute_updated_closure) }, + { be_const_key_weak(update_shadow, 26), be_const_closure(Matter_Plugin_update_shadow_closure) }, + { be_const_key_weak(consolidate_clusters, -1), be_const_closure(Matter_Plugin_consolidate_clusters_closure) }, + { be_const_key_weak(get_attribute_list, 24), be_const_closure(Matter_Plugin_get_attribute_list_closure) }, + { be_const_key_weak(is_local_device, 31), be_const_closure(Matter_Plugin_is_local_device_closure) }, + { be_const_key_weak(update_shadow_lazy, -1), be_const_closure(Matter_Plugin_update_shadow_lazy_closure) }, + { be_const_key_weak(ARG, 30), be_nested_str_weak() }, + { be_const_key_weak(has, 12), be_const_closure(Matter_Plugin_has_closure) }, + { be_const_key_weak(subscribe_event, 11), be_const_closure(Matter_Plugin_subscribe_event_closure) }, + { be_const_key_weak(write_attribute, -1), be_const_closure(Matter_Plugin_write_attribute_closure) }, + { be_const_key_weak(get_cluster_list, -1), be_const_closure(Matter_Plugin_get_cluster_list_closure) }, + { be_const_key_weak(TYPE, -1), be_nested_str_weak() }, + { be_const_key_weak(read_event, -1), be_const_closure(Matter_Plugin_read_event_closure) }, + { be_const_key_weak(ui_string_to_conf, -1), be_const_static_closure(Matter_Plugin_ui_string_to_conf_closure) }, + { be_const_key_weak(subscribe_attribute, -1), be_const_closure(Matter_Plugin_subscribe_attribute_closure) }, + { be_const_key_weak(device, -1), be_const_var(1) }, + { be_const_key_weak(CLUSTERS, 13), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { be_const_map( * be_nested_map(2, ( (struct bmapnode*) &(const bmapnode[]) { { be_const_key_int(29, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_list, { @@ -917,28 +990,10 @@ be_local_class(Matter_Plugin, be_const_int(17), })) ) } )) }, })) ) } )) }, - { be_const_key_weak(subscribe_event, -1), be_const_closure(Matter_Plugin_subscribe_event_closure) }, { be_const_key_weak(every_250ms, -1), be_const_closure(Matter_Plugin_every_250ms_closure) }, - { be_const_key_weak(ui_conf_to_string, -1), be_const_static_closure(Matter_Plugin_ui_conf_to_string_closure) }, - { be_const_key_weak(write_attribute, -1), be_const_closure(Matter_Plugin_write_attribute_closure) }, - { be_const_key_weak(parse_sensors, 25), be_const_closure(Matter_Plugin_parse_sensors_closure) }, - { be_const_key_weak(consolidate_clusters, -1), be_const_closure(Matter_Plugin_consolidate_clusters_closure) }, - { be_const_key_weak(UPDATE_TIME, 18), be_const_int(5000) }, - { be_const_key_weak(TYPE, -1), be_nested_str_weak() }, - { be_const_key_weak(read_attribute, -1), be_const_closure(Matter_Plugin_read_attribute_closure) }, - { be_const_key_weak(get_attribute_list, -1), be_const_closure(Matter_Plugin_get_attribute_list_closure) }, - { be_const_key_weak(timed_request, -1), be_const_closure(Matter_Plugin_timed_request_closure) }, - { be_const_key_weak(ARG, -1), be_nested_str_weak() }, + { be_const_key_weak(parse_sensors, -1), be_const_closure(Matter_Plugin_parse_sensors_closure) }, + { be_const_key_weak(ARG_TYPE, 0), be_const_static_closure(Matter_Plugin__X3Clambda_X3E_closure) }, { be_const_key_weak(invoke_request, -1), be_const_closure(Matter_Plugin_invoke_request_closure) }, - { be_const_key_weak(ui_string_to_conf, -1), be_const_static_closure(Matter_Plugin_ui_string_to_conf_closure) }, - { be_const_key_weak(update_next, 20), be_const_var(0) }, - { be_const_key_weak(attribute_updated, -1), be_const_closure(Matter_Plugin_attribute_updated_closure) }, - { be_const_key_weak(update_shadow, 30), be_const_closure(Matter_Plugin_update_shadow_closure) }, - { be_const_key_weak(has, -1), be_const_closure(Matter_Plugin_has_closure) }, - { be_const_key_weak(device, 15), be_const_var(1) }, - { be_const_key_weak(endpoint, -1), be_const_var(2) }, - { be_const_key_weak(init, -1), be_const_closure(Matter_Plugin_init_closure) }, - { be_const_key_weak(subscribe_attribute, -1), be_const_closure(Matter_Plugin_subscribe_attribute_closure) }, })), be_str_weak(Matter_Plugin) ); diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_HTTP.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_HTTP.h index 63cd5cde2..037f1108a 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_HTTP.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_HTTP.h @@ -6,6 +6,111 @@ extern const bclass be_class_Matter_Plugin_Bridge_HTTP; +/******************************************************************** +** Solidified function: read_attribute +********************************************************************/ +be_local_closure(Matter_Plugin_Bridge_HTTP_read_attribute, /* name */ + be_nested_proto( + 10, /* nstack */ + 3, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 9]) { /* constants */ + /* K0 */ be_nested_str_weak(matter), + /* K1 */ be_nested_str_weak(TLV), + /* K2 */ be_nested_str_weak(cluster), + /* K3 */ be_nested_str_weak(attribute), + /* K4 */ be_nested_str_weak(create_TLV), + /* K5 */ be_nested_str_weak(BOOL), + /* K6 */ be_nested_str_weak(http_remote), + /* K7 */ be_nested_str_weak(reachable), + /* K8 */ be_nested_str_weak(read_attribute), + }), + be_str_weak(read_attribute), + &be_const_str_solidified, + ( &(const binstruction[35]) { /* code */ + 0xB80E0000, // 0000 GETNGBL R3 K0 + 0x880C0701, // 0001 GETMBR R3 R3 K1 + 0x88100502, // 0002 GETMBR R4 R2 K2 + 0x88140503, // 0003 GETMBR R5 R2 K3 + 0x541A0038, // 0004 LDINT R6 57 + 0x1C180806, // 0005 EQ R6 R4 R6 + 0x781A0012, // 0006 JMPF R6 #001A + 0x541A0010, // 0007 LDINT R6 17 + 0x1C180A06, // 0008 EQ R6 R5 R6 + 0x781A0006, // 0009 JMPF R6 #0011 + 0x8C180704, // 000A GETMET R6 R3 K4 + 0x88200705, // 000B GETMBR R8 R3 K5 + 0x88240106, // 000C GETMBR R9 R0 K6 + 0x88241307, // 000D GETMBR R9 R9 K7 + 0x7C180600, // 000E CALL R6 3 + 0x80040C00, // 000F RET 1 R6 + 0x70020007, // 0010 JMP #0019 + 0x60180003, // 0011 GETGBL R6 G3 + 0x5C1C0000, // 0012 MOVE R7 R0 + 0x7C180200, // 0013 CALL R6 1 + 0x8C180D08, // 0014 GETMET R6 R6 K8 + 0x5C200200, // 0015 MOVE R8 R1 + 0x5C240400, // 0016 MOVE R9 R2 + 0x7C180600, // 0017 CALL R6 3 + 0x80040C00, // 0018 RET 1 R6 + 0x70020007, // 0019 JMP #0022 + 0x60180003, // 001A GETGBL R6 G3 + 0x5C1C0000, // 001B MOVE R7 R0 + 0x7C180200, // 001C CALL R6 1 + 0x8C180D08, // 001D GETMET R6 R6 K8 + 0x5C200200, // 001E MOVE R8 R1 + 0x5C240400, // 001F MOVE R9 R2 + 0x7C180600, // 0020 CALL R6 3 + 0x80040C00, // 0021 RET 1 R6 + 0x80000000, // 0022 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: web_value_onoff +********************************************************************/ +be_local_closure(Matter_Plugin_Bridge_HTTP_web_value_onoff, /* name */ + be_nested_proto( + 3, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 3]) { /* constants */ + /* K0 */ be_nested_str_weak(_X3Cb_X3EOn_X3C_X2Fb_X3E), + /* K1 */ be_nested_str_weak(Off), + /* K2 */ be_nested_str_weak(), + }), + be_str_weak(web_value_onoff), + &be_const_str_solidified, + ( &(const binstruction[10]) { /* code */ + 0x4C080000, // 0000 LDNIL R2 + 0x20080202, // 0001 NE R2 R1 R2 + 0x780A0004, // 0002 JMPF R2 #0008 + 0x78060001, // 0003 JMPF R1 #0006 + 0x58080000, // 0004 LDCONST R2 K0 + 0x70020000, // 0005 JMP #0007 + 0x58080001, // 0006 LDCONST R2 K1 + 0x70020000, // 0007 JMP #0009 + 0x58080002, // 0008 LDCONST R2 K2 + 0x80040400, // 0009 RET 1 R2 + }) + ) +); +/*******************************************************************/ + + /******************************************************************** ** Solidified function: update_shadow ********************************************************************/ @@ -49,116 +154,6 @@ be_local_closure(Matter_Plugin_Bridge_HTTP_update_shadow, /* name */ /*******************************************************************/ -/******************************************************************** -** Solidified function: register_cmd_cb -********************************************************************/ -be_local_closure(Matter_Plugin_Bridge_HTTP_register_cmd_cb, /* name */ - be_nested_proto( - 6, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 1, /* has sup protos */ - ( &(const struct bproto*[ 1]) { - be_nested_proto( - 8, /* nstack */ - 3, /* argc */ - 0, /* varg */ - 1, /* has upvals */ - ( &(const bupvaldesc[ 1]) { /* upvals */ - be_local_const_upval(1, 0), - }), - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 1]) { /* constants */ - /* K0 */ be_nested_str_weak(parse_http_response), - }), - be_str_weak(_X3Clambda_X3E), - &be_const_str_solidified, - ( &(const binstruction[ 7]) { /* code */ - 0x680C0000, // 0000 GETUPV R3 U0 - 0x8C0C0700, // 0001 GETMET R3 R3 K0 - 0x5C140000, // 0002 MOVE R5 R0 - 0x5C180200, // 0003 MOVE R6 R1 - 0x5C1C0400, // 0004 MOVE R7 R2 - 0x7C0C0800, // 0005 CALL R3 4 - 0x80040600, // 0006 RET 1 R3 - }) - ), - }), - 1, /* has constants */ - ( &(const bvalue[ 4]) { /* constants */ - /* K0 */ be_nested_str_weak(http_remote), - /* K1 */ be_nested_str_weak(add_schedule), - /* K2 */ be_nested_str_weak(UPDATE_CMD), - /* K3 */ be_nested_str_weak(UPDATE_TIME), - }), - be_str_weak(register_cmd_cb), - &be_const_str_solidified, - ( &(const binstruction[ 8]) { /* code */ - 0x88040100, // 0000 GETMBR R1 R0 K0 - 0x8C040301, // 0001 GETMET R1 R1 K1 - 0x880C0102, // 0002 GETMBR R3 R0 K2 - 0x88100103, // 0003 GETMBR R4 R0 K3 - 0x84140000, // 0004 CLOSURE R5 P0 - 0x7C040800, // 0005 CALL R1 4 - 0xA0000000, // 0006 CLOSE R0 - 0x80000000, // 0007 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: ui_conf_to_string -********************************************************************/ -be_local_closure(Matter_Plugin_Bridge_HTTP_ui_conf_to_string, /* name */ - be_nested_proto( - 9, /* nstack */ - 2, /* argc */ - 4, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 6]) { /* constants */ - /* K0 */ be_const_class(be_class_Matter_Plugin_Bridge_HTTP), - /* K1 */ be_nested_str_weak(ui_conf_to_string), - /* K2 */ be_nested_str_weak(find), - /* K3 */ be_nested_str_weak(ARG_HTTP), - /* K4 */ be_nested_str_weak(), - /* K5 */ be_nested_str_weak(_X2C), - }), - be_str_weak(ui_conf_to_string), - &be_const_str_solidified, - ( &(const binstruction[17]) { /* code */ - 0x58080000, // 0000 LDCONST R2 K0 - 0x600C0003, // 0001 GETGBL R3 G3 - 0x5C100400, // 0002 MOVE R4 R2 - 0x7C0C0200, // 0003 CALL R3 1 - 0x8C0C0701, // 0004 GETMET R3 R3 K1 - 0x5C140000, // 0005 MOVE R5 R0 - 0x5C180200, // 0006 MOVE R6 R1 - 0x7C0C0600, // 0007 CALL R3 3 - 0x60100008, // 0008 GETGBL R4 G8 - 0x8C140302, // 0009 GETMET R5 R1 K2 - 0x881C0503, // 000A GETMBR R7 R2 K3 - 0x58200004, // 000B LDCONST R8 K4 - 0x7C140600, // 000C CALL R5 3 - 0x7C100200, // 000D CALL R4 1 - 0x00140705, // 000E ADD R5 R3 K5 - 0x00140A04, // 000F ADD R5 R5 R4 - 0x80040A00, // 0010 RET 1 R5 - }) - ) -); -/*******************************************************************/ - - /******************************************************************** ** Solidified function: parse_http_response ********************************************************************/ @@ -234,60 +229,6 @@ be_local_closure(Matter_Plugin_Bridge_HTTP_parse_http_response, /* name */ /*******************************************************************/ -/******************************************************************** -** Solidified function: init -********************************************************************/ -be_local_closure(Matter_Plugin_Bridge_HTTP_init, /* name */ - be_nested_proto( - 10, /* nstack */ - 4, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 9]) { /* constants */ - /* K0 */ be_nested_str_weak(string), - /* K1 */ be_nested_str_weak(init), - /* K2 */ be_nested_str_weak(find), - /* K3 */ be_nested_str_weak(ARG_HTTP), - /* K4 */ be_nested_str_weak(http_remote), - /* K5 */ be_nested_str_weak(device), - /* K6 */ be_nested_str_weak(register_http_remote), - /* K7 */ be_nested_str_weak(PROBE_TIMEOUT), - /* K8 */ be_nested_str_weak(register_cmd_cb), - }), - be_str_weak(init), - &be_const_str_solidified, - ( &(const binstruction[21]) { /* code */ - 0xA4120000, // 0000 IMPORT R4 K0 - 0x60140003, // 0001 GETGBL R5 G3 - 0x5C180000, // 0002 MOVE R6 R0 - 0x7C140200, // 0003 CALL R5 1 - 0x8C140B01, // 0004 GETMET R5 R5 K1 - 0x5C1C0200, // 0005 MOVE R7 R1 - 0x5C200400, // 0006 MOVE R8 R2 - 0x5C240600, // 0007 MOVE R9 R3 - 0x7C140800, // 0008 CALL R5 4 - 0x8C140702, // 0009 GETMET R5 R3 K2 - 0x881C0103, // 000A GETMBR R7 R0 K3 - 0x7C140400, // 000B CALL R5 2 - 0x88180105, // 000C GETMBR R6 R0 K5 - 0x8C180D06, // 000D GETMET R6 R6 K6 - 0x5C200A00, // 000E MOVE R8 R5 - 0x88240107, // 000F GETMBR R9 R0 K7 - 0x7C180600, // 0010 CALL R6 3 - 0x90020806, // 0011 SETMBR R0 K4 R6 - 0x8C180108, // 0012 GETMET R6 R0 K8 - 0x7C180200, // 0013 CALL R6 1 - 0x80000000, // 0014 RET 0 - }) - ) -); -/*******************************************************************/ - - /******************************************************************** ** Solidified function: call_remote_sync ********************************************************************/ @@ -370,150 +311,6 @@ be_local_closure(Matter_Plugin_Bridge_HTTP_call_remote_sync, /* name */ /*******************************************************************/ -/******************************************************************** -** Solidified function: parse_update -********************************************************************/ -be_local_closure(Matter_Plugin_Bridge_HTTP_parse_update, /* name */ - be_nested_proto( - 3, /* nstack */ - 3, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 0, /* has constants */ - NULL, /* no const */ - be_str_weak(parse_update), - &be_const_str_solidified, - ( &(const binstruction[ 1]) { /* code */ - 0x80000000, // 0000 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: ui_string_to_conf -********************************************************************/ -be_local_closure(Matter_Plugin_Bridge_HTTP_ui_string_to_conf, /* name */ - be_nested_proto( - 11, /* nstack */ - 3, /* argc */ - 4, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 9]) { /* constants */ - /* K0 */ be_const_class(be_class_Matter_Plugin_Bridge_HTTP), - /* K1 */ be_nested_str_weak(string), - /* K2 */ be_nested_str_weak(split), - /* K3 */ be_nested_str_weak(_X2C), - /* K4 */ be_const_int(3), - /* K5 */ be_nested_str_weak(ARG_HTTP), - /* K6 */ be_const_int(1), - /* K7 */ be_nested_str_weak(ui_string_to_conf), - /* K8 */ be_const_int(0), - }), - be_str_weak(ui_string_to_conf), - &be_const_str_solidified, - ( &(const binstruction[19]) { /* code */ - 0x580C0000, // 0000 LDCONST R3 K0 - 0xA4120200, // 0001 IMPORT R4 K1 - 0x8C140902, // 0002 GETMET R5 R4 K2 - 0x001C0503, // 0003 ADD R7 R2 K3 - 0x58200003, // 0004 LDCONST R8 K3 - 0x58240004, // 0005 LDCONST R9 K4 - 0x7C140800, // 0006 CALL R5 4 - 0x88180705, // 0007 GETMBR R6 R3 K5 - 0x941C0B06, // 0008 GETIDX R7 R5 K6 - 0x98040C07, // 0009 SETIDX R1 R6 R7 - 0x60180003, // 000A GETGBL R6 G3 - 0x5C1C0600, // 000B MOVE R7 R3 - 0x7C180200, // 000C CALL R6 1 - 0x8C180D07, // 000D GETMET R6 R6 K7 - 0x5C200000, // 000E MOVE R8 R0 - 0x5C240200, // 000F MOVE R9 R1 - 0x94280B08, // 0010 GETIDX R10 R5 K8 - 0x7C180800, // 0011 CALL R6 4 - 0x80040200, // 0012 RET 1 R1 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: read_attribute -********************************************************************/ -be_local_closure(Matter_Plugin_Bridge_HTTP_read_attribute, /* name */ - be_nested_proto( - 10, /* nstack */ - 3, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 9]) { /* constants */ - /* K0 */ be_nested_str_weak(matter), - /* K1 */ be_nested_str_weak(TLV), - /* K2 */ be_nested_str_weak(cluster), - /* K3 */ be_nested_str_weak(attribute), - /* K4 */ be_nested_str_weak(create_TLV), - /* K5 */ be_nested_str_weak(BOOL), - /* K6 */ be_nested_str_weak(http_remote), - /* K7 */ be_nested_str_weak(reachable), - /* K8 */ be_nested_str_weak(read_attribute), - }), - be_str_weak(read_attribute), - &be_const_str_solidified, - ( &(const binstruction[35]) { /* code */ - 0xB80E0000, // 0000 GETNGBL R3 K0 - 0x880C0701, // 0001 GETMBR R3 R3 K1 - 0x88100502, // 0002 GETMBR R4 R2 K2 - 0x88140503, // 0003 GETMBR R5 R2 K3 - 0x541A0038, // 0004 LDINT R6 57 - 0x1C180806, // 0005 EQ R6 R4 R6 - 0x781A0012, // 0006 JMPF R6 #001A - 0x541A0010, // 0007 LDINT R6 17 - 0x1C180A06, // 0008 EQ R6 R5 R6 - 0x781A0006, // 0009 JMPF R6 #0011 - 0x8C180704, // 000A GETMET R6 R3 K4 - 0x88200705, // 000B GETMBR R8 R3 K5 - 0x88240106, // 000C GETMBR R9 R0 K6 - 0x88241307, // 000D GETMBR R9 R9 K7 - 0x7C180600, // 000E CALL R6 3 - 0x80040C00, // 000F RET 1 R6 - 0x70020007, // 0010 JMP #0019 - 0x60180003, // 0011 GETGBL R6 G3 - 0x5C1C0000, // 0012 MOVE R7 R0 - 0x7C180200, // 0013 CALL R6 1 - 0x8C180D08, // 0014 GETMET R6 R6 K8 - 0x5C200200, // 0015 MOVE R8 R1 - 0x5C240400, // 0016 MOVE R9 R2 - 0x7C180600, // 0017 CALL R6 3 - 0x80040C00, // 0018 RET 1 R6 - 0x70020007, // 0019 JMP #0022 - 0x60180003, // 001A GETGBL R6 G3 - 0x5C1C0000, // 001B MOVE R7 R0 - 0x7C180200, // 001C CALL R6 1 - 0x8C180D08, // 001D GETMET R6 R6 K8 - 0x5C200200, // 001E MOVE R8 R1 - 0x5C240400, // 001F MOVE R9 R2 - 0x7C180600, // 0020 CALL R6 3 - 0x80040C00, // 0021 RET 1 R6 - 0x80000000, // 0022 RET 0 - }) - ) -); -/*******************************************************************/ - - /******************************************************************** ** Solidified function: every_250ms ********************************************************************/ @@ -545,36 +342,24 @@ be_local_closure(Matter_Plugin_Bridge_HTTP_every_250ms, /* name */ /******************************************************************** -** Solidified function: web_value_onoff +** Solidified function: is_local_device ********************************************************************/ -be_local_closure(Matter_Plugin_Bridge_HTTP_web_value_onoff, /* name */ +be_local_closure(Matter_Plugin_Bridge_HTTP_is_local_device, /* name */ be_nested_proto( - 3, /* nstack */ - 2, /* argc */ + 2, /* nstack */ + 1, /* argc */ 2, /* varg */ 0, /* has upvals */ NULL, /* no upvals */ 0, /* has sup protos */ NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 3]) { /* constants */ - /* K0 */ be_nested_str_weak(_X3Cb_X3EOn_X3C_X2Fb_X3E), - /* K1 */ be_nested_str_weak(Off), - /* K2 */ be_nested_str_weak(), - }), - be_str_weak(web_value_onoff), + 0, /* has constants */ + NULL, /* no const */ + be_str_weak(is_local_device), &be_const_str_solidified, - ( &(const binstruction[10]) { /* code */ - 0x4C080000, // 0000 LDNIL R2 - 0x20080202, // 0001 NE R2 R1 R2 - 0x780A0004, // 0002 JMPF R2 #0008 - 0x78060001, // 0003 JMPF R1 #0006 - 0x58080000, // 0004 LDCONST R2 K0 - 0x70020000, // 0005 JMP #0007 - 0x58080001, // 0006 LDCONST R2 K1 - 0x70020000, // 0007 JMP #0009 - 0x58080002, // 0008 LDCONST R2 K2 - 0x80040400, // 0009 RET 1 R2 + ( &(const binstruction[ 2]) { /* code */ + 0x50040000, // 0000 LDBOOL R1 0 0 + 0x80040200, // 0001 RET 1 R1 }) ) ); @@ -617,6 +402,147 @@ be_local_closure(Matter_Plugin_Bridge_HTTP_web_values, /* name */ /*******************************************************************/ +/******************************************************************** +** Solidified function: parse_update +********************************************************************/ +be_local_closure(Matter_Plugin_Bridge_HTTP_parse_update, /* name */ + be_nested_proto( + 3, /* nstack */ + 3, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 0, /* has constants */ + NULL, /* no const */ + be_str_weak(parse_update), + &be_const_str_solidified, + ( &(const binstruction[ 1]) { /* code */ + 0x80000000, // 0000 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: init +********************************************************************/ +be_local_closure(Matter_Plugin_Bridge_HTTP_init, /* name */ + be_nested_proto( + 10, /* nstack */ + 4, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 9]) { /* constants */ + /* K0 */ be_nested_str_weak(string), + /* K1 */ be_nested_str_weak(init), + /* K2 */ be_nested_str_weak(find), + /* K3 */ be_nested_str_weak(ARG_HTTP), + /* K4 */ be_nested_str_weak(http_remote), + /* K5 */ be_nested_str_weak(device), + /* K6 */ be_nested_str_weak(register_http_remote), + /* K7 */ be_nested_str_weak(PROBE_TIMEOUT), + /* K8 */ be_nested_str_weak(register_cmd_cb), + }), + be_str_weak(init), + &be_const_str_solidified, + ( &(const binstruction[21]) { /* code */ + 0xA4120000, // 0000 IMPORT R4 K0 + 0x60140003, // 0001 GETGBL R5 G3 + 0x5C180000, // 0002 MOVE R6 R0 + 0x7C140200, // 0003 CALL R5 1 + 0x8C140B01, // 0004 GETMET R5 R5 K1 + 0x5C1C0200, // 0005 MOVE R7 R1 + 0x5C200400, // 0006 MOVE R8 R2 + 0x5C240600, // 0007 MOVE R9 R3 + 0x7C140800, // 0008 CALL R5 4 + 0x8C140702, // 0009 GETMET R5 R3 K2 + 0x881C0103, // 000A GETMBR R7 R0 K3 + 0x7C140400, // 000B CALL R5 2 + 0x88180105, // 000C GETMBR R6 R0 K5 + 0x8C180D06, // 000D GETMET R6 R6 K6 + 0x5C200A00, // 000E MOVE R8 R5 + 0x88240107, // 000F GETMBR R9 R0 K7 + 0x7C180600, // 0010 CALL R6 3 + 0x90020806, // 0011 SETMBR R0 K4 R6 + 0x8C180108, // 0012 GETMET R6 R0 K8 + 0x7C180200, // 0013 CALL R6 1 + 0x80000000, // 0014 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: register_cmd_cb +********************************************************************/ +be_local_closure(Matter_Plugin_Bridge_HTTP_register_cmd_cb, /* name */ + be_nested_proto( + 6, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 1, /* has sup protos */ + ( &(const struct bproto*[ 1]) { + be_nested_proto( + 8, /* nstack */ + 3, /* argc */ + 0, /* varg */ + 1, /* has upvals */ + ( &(const bupvaldesc[ 1]) { /* upvals */ + be_local_const_upval(1, 0), + }), + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 1]) { /* constants */ + /* K0 */ be_nested_str_weak(parse_http_response), + }), + be_str_weak(_X3Clambda_X3E), + &be_const_str_solidified, + ( &(const binstruction[ 7]) { /* code */ + 0x680C0000, // 0000 GETUPV R3 U0 + 0x8C0C0700, // 0001 GETMET R3 R3 K0 + 0x5C140000, // 0002 MOVE R5 R0 + 0x5C180200, // 0003 MOVE R6 R1 + 0x5C1C0400, // 0004 MOVE R7 R2 + 0x7C0C0800, // 0005 CALL R3 4 + 0x80040600, // 0006 RET 1 R3 + }) + ), + }), + 1, /* has constants */ + ( &(const bvalue[ 4]) { /* constants */ + /* K0 */ be_nested_str_weak(http_remote), + /* K1 */ be_nested_str_weak(add_schedule), + /* K2 */ be_nested_str_weak(UPDATE_CMD), + /* K3 */ be_nested_str_weak(UPDATE_TIME), + }), + be_str_weak(register_cmd_cb), + &be_const_str_solidified, + ( &(const binstruction[ 8]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x8C040301, // 0001 GETMET R1 R1 K1 + 0x880C0102, // 0002 GETMBR R3 R0 K2 + 0x88100103, // 0003 GETMBR R4 R0 K3 + 0x84140000, // 0004 CLOSURE R5 P0 + 0x7C040800, // 0005 CALL R1 4 + 0xA0000000, // 0006 CLOSE R0 + 0x80000000, // 0007 RET 0 + }) + ) +); +/*******************************************************************/ + + /******************************************************************** ** Solidified class: Matter_Plugin_Bridge_HTTP ********************************************************************/ @@ -624,33 +550,32 @@ extern const bclass be_class_Matter_Plugin_Device; be_local_class(Matter_Plugin_Bridge_HTTP, 1, &be_class_Matter_Plugin_Device, - be_nested_map(22, + be_nested_map(21, ( (struct bmapnode*) &(const bmapnode[]) { - { be_const_key_weak(NAME, 2), be_nested_str_weak() }, - { be_const_key_weak(web_values, 11), be_const_closure(Matter_Plugin_Bridge_HTTP_web_values_closure) }, - { be_const_key_weak(web_value_onoff, 21), be_const_closure(Matter_Plugin_Bridge_HTTP_web_value_onoff_closure) }, - { be_const_key_weak(register_cmd_cb, -1), be_const_closure(Matter_Plugin_Bridge_HTTP_register_cmd_cb_closure) }, - { be_const_key_weak(ui_conf_to_string, -1), be_const_static_closure(Matter_Plugin_Bridge_HTTP_ui_conf_to_string_closure) }, - { be_const_key_weak(http_remote, -1), be_const_var(0) }, - { be_const_key_weak(CLUSTERS, 0), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { + { be_const_key_weak(read_attribute, -1), be_const_closure(Matter_Plugin_Bridge_HTTP_read_attribute_closure) }, + { be_const_key_weak(web_value_onoff, -1), be_const_closure(Matter_Plugin_Bridge_HTTP_web_value_onoff_closure) }, + { be_const_key_weak(SYNC_TIMEOUT, -1), be_const_int(500) }, + { be_const_key_weak(CLUSTERS, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { be_const_map( * be_nested_map(0, ( (struct bmapnode*) &(const bmapnode[]) { })) ) } )) }, + { be_const_key_weak(is_local_device, -1), be_const_closure(Matter_Plugin_Bridge_HTTP_is_local_device_closure) }, + { be_const_key_weak(parse_http_response, -1), be_const_closure(Matter_Plugin_Bridge_HTTP_parse_http_response_closure) }, + { be_const_key_weak(init, 18), be_const_closure(Matter_Plugin_Bridge_HTTP_init_closure) }, + { be_const_key_weak(update_shadow, 3), be_const_closure(Matter_Plugin_Bridge_HTTP_update_shadow_closure) }, + { be_const_key_weak(every_250ms, -1), be_const_closure(Matter_Plugin_Bridge_HTTP_every_250ms_closure) }, + { be_const_key_weak(UPDATE_TIME, -1), be_const_int(3000) }, + { be_const_key_weak(TYPE, 4), be_nested_str_weak() }, + { be_const_key_weak(web_values, -1), be_const_closure(Matter_Plugin_Bridge_HTTP_web_values_closure) }, + { be_const_key_weak(ARG_HTTP, 6), be_nested_str_weak(url) }, + { be_const_key_weak(PROBE_TIMEOUT, -1), be_const_int(1700) }, { be_const_key_weak(ARG, -1), be_nested_str_weak() }, - { be_const_key_weak(UPDATE_CMD, -1), be_nested_str_weak(Status_X2011) }, - { be_const_key_weak(parse_http_response, 19), be_const_closure(Matter_Plugin_Bridge_HTTP_parse_http_response_closure) }, - { be_const_key_weak(call_remote_sync, -1), be_const_closure(Matter_Plugin_Bridge_HTTP_call_remote_sync_closure) }, + { be_const_key_weak(NAME, 14), be_nested_str_weak() }, + { be_const_key_weak(call_remote_sync, 17), be_const_closure(Matter_Plugin_Bridge_HTTP_call_remote_sync_closure) }, { be_const_key_weak(parse_update, -1), be_const_closure(Matter_Plugin_Bridge_HTTP_parse_update_closure) }, - { be_const_key_weak(ARG_HTTP, 16), be_nested_str_weak(url) }, - { be_const_key_weak(TYPE, -1), be_nested_str_weak() }, - { be_const_key_weak(read_attribute, -1), be_const_closure(Matter_Plugin_Bridge_HTTP_read_attribute_closure) }, - { be_const_key_weak(PROBE_TIMEOUT, 13), be_const_int(1700) }, - { be_const_key_weak(ui_string_to_conf, -1), be_const_static_closure(Matter_Plugin_Bridge_HTTP_ui_string_to_conf_closure) }, - { be_const_key_weak(update_shadow, 8), be_const_closure(Matter_Plugin_Bridge_HTTP_update_shadow_closure) }, - { be_const_key_weak(every_250ms, 5), be_const_closure(Matter_Plugin_Bridge_HTTP_every_250ms_closure) }, - { be_const_key_weak(init, -1), be_const_closure(Matter_Plugin_Bridge_HTTP_init_closure) }, - { be_const_key_weak(UPDATE_TIME, 1), be_const_int(3000) }, - { be_const_key_weak(SYNC_TIMEOUT, -1), be_const_int(500) }, + { be_const_key_weak(UPDATE_CMD, -1), be_nested_str_weak(Status_X2011) }, + { be_const_key_weak(http_remote, -1), be_const_var(0) }, + { be_const_key_weak(register_cmd_cb, -1), be_const_closure(Matter_Plugin_Bridge_HTTP_register_cmd_cb_closure) }, })), be_str_weak(Matter_Plugin_Bridge_HTTP) ); diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Light0.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Light0.h index e3f26664b..3db488780 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Light0.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Light0.h @@ -418,7 +418,7 @@ be_local_class(Matter_Plugin_Bridge_Light0, { be_const_key_weak(init, -1), be_const_closure(Matter_Plugin_Bridge_Light0_init_closure) }, { be_const_key_weak(set_onoff, 13), be_const_closure(Matter_Plugin_Bridge_Light0_set_onoff_closure) }, { be_const_key_weak(invoke_request, -1), be_const_closure(Matter_Plugin_Bridge_Light0_invoke_request_closure) }, - { be_const_key_weak(NAME, -1), be_nested_str_weak(_X26_X23x1F517_X3B_X20Light_X200_X20On) }, + { be_const_key_weak(NAME, -1), be_nested_str_weak(Light_X200_X20On) }, { be_const_key_weak(tasmota_relay_index, -1), be_const_var(0) }, { be_const_key_weak(TYPES, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { be_const_map( * be_nested_map(1, diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Light1.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Light1.h index 9662d78a6..8db24acd6 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Light1.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Light1.h @@ -526,7 +526,7 @@ be_local_class(Matter_Plugin_Bridge_Light1, })) ) } )) }, })) ) } )) }, { be_const_key_weak(set_bri, -1), be_const_closure(Matter_Plugin_Bridge_Light1_set_bri_closure) }, - { be_const_key_weak(NAME, -1), be_nested_str_weak(_X26_X23x1F517_X3B_X20Light_X201_X20Dimmer) }, + { be_const_key_weak(NAME, -1), be_nested_str_weak(Light_X201_X20Dimmer) }, { be_const_key_weak(web_values, 1), be_const_closure(Matter_Plugin_Bridge_Light1_web_values_closure) }, { be_const_key_weak(invoke_request, 0), be_const_closure(Matter_Plugin_Bridge_Light1_invoke_request_closure) }, })), diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Light2.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Light2.h index 726a0fbb5..14ccf465a 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Light2.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Light2.h @@ -570,7 +570,7 @@ be_local_class(Matter_Plugin_Bridge_Light2, { be_const_key_weak(web_value_ct, -1), be_const_closure(Matter_Plugin_Bridge_Light2_web_value_ct_closure) }, { be_const_key_weak(set_ct, -1), be_const_closure(Matter_Plugin_Bridge_Light2_set_ct_closure) }, { be_const_key_weak(read_attribute, -1), be_const_closure(Matter_Plugin_Bridge_Light2_read_attribute_closure) }, - { be_const_key_weak(NAME, -1), be_nested_str_weak(_X26_X23x1F517_X3B_X20Light_X202_X20CT) }, + { be_const_key_weak(NAME, -1), be_nested_str_weak(Light_X202_X20CT) }, { be_const_key_weak(shadow_ct, -1), be_const_var(0) }, { be_const_key_weak(invoke_request, -1), be_const_closure(Matter_Plugin_Bridge_Light2_invoke_request_closure) }, { be_const_key_weak(update_ct_minmax, 8), be_const_closure(Matter_Plugin_Bridge_Light2_update_ct_minmax_closure) }, diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Light3.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Light3.h index ca4edad38..190fbe542 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Light3.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Light3.h @@ -713,7 +713,7 @@ be_local_class(Matter_Plugin_Bridge_Light3, { be_const_key_weak(web_value_RGB, 1), be_const_closure(Matter_Plugin_Bridge_Light3_web_value_RGB_closure) }, { be_const_key_weak(shadow_sat, 9), be_const_var(1) }, { be_const_key_weak(invoke_request, -1), be_const_closure(Matter_Plugin_Bridge_Light3_invoke_request_closure) }, - { be_const_key_weak(NAME, -1), be_nested_str_weak(_X26_X23x1F517_X3B_X20Light_X203_X20RGB) }, + { be_const_key_weak(NAME, -1), be_nested_str_weak(Light_X203_X20RGB) }, { be_const_key_weak(TYPES, 11), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { be_const_map( * be_nested_map(1, ( (struct bmapnode*) &(const bmapnode[]) { diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_OnOff.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_OnOff.h index e8ad2ea11..c9b570e5b 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_OnOff.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_OnOff.h @@ -61,7 +61,7 @@ be_local_class(Matter_Plugin_Bridge_OnOff, ( (struct bmapnode*) &(const bmapnode[]) { { be_const_key_weak(web_values, -1), be_const_closure(Matter_Plugin_Bridge_OnOff_web_values_closure) }, { be_const_key_weak(TYPE, -1), be_nested_str_weak(http_relay) }, - { be_const_key_weak(NAME, 3), be_nested_str_weak(_X26_X23x1F517_X3B_X20Relay) }, + { be_const_key_weak(NAME, 3), be_nested_str_weak(Relay) }, { be_const_key_weak(TYPES, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { be_const_map( * be_nested_map(1, ( (struct bmapnode*) &(const bmapnode[]) { diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Sensor.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Sensor.h index 5569b9ba6..c8e26217a 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Sensor.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Sensor.h @@ -6,6 +6,30 @@ extern const bclass be_class_Matter_Plugin_Bridge_Sensor; +/******************************************************************** +** Solidified function: pre_value +********************************************************************/ +be_local_closure(Matter_Plugin_Bridge_Sensor_pre_value, /* name */ + be_nested_proto( + 2, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 0, /* has constants */ + NULL, /* no const */ + be_str_weak(pre_value), + &be_const_str_solidified, + ( &(const binstruction[ 1]) { /* code */ + 0x80040200, // 0000 RET 1 R1 + }) + ) +); +/*******************************************************************/ + + /******************************************************************** ** Solidified function: filter_name_html ********************************************************************/ @@ -52,76 +76,43 @@ be_local_closure(Matter_Plugin_Bridge_Sensor_filter_name_html, /* name */ /******************************************************************** -** Solidified function: init +** Solidified function: parse_configuration ********************************************************************/ -be_local_closure(Matter_Plugin_Bridge_Sensor_init, /* name */ +be_local_closure(Matter_Plugin_Bridge_Sensor_parse_configuration, /* name */ be_nested_proto( - 9, /* nstack */ - 4, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 8]) { /* constants */ - /* K0 */ be_nested_str_weak(init), - /* K1 */ be_nested_str_weak(tasmota_sensor_filter), - /* K2 */ be_nested_str_weak(find), - /* K3 */ be_nested_str_weak(ARG), - /* K4 */ be_nested_str_weak(tasmota_sensor_matcher), - /* K5 */ be_nested_str_weak(tasmota), - /* K6 */ be_nested_str_weak(Rule_Matcher), - /* K7 */ be_nested_str_weak(parse), - }), - be_str_weak(init), - &be_const_str_solidified, - ( &(const binstruction[21]) { /* code */ - 0x60100003, // 0000 GETGBL R4 G3 - 0x5C140000, // 0001 MOVE R5 R0 - 0x7C100200, // 0002 CALL R4 1 - 0x8C100900, // 0003 GETMET R4 R4 K0 - 0x5C180200, // 0004 MOVE R6 R1 - 0x5C1C0400, // 0005 MOVE R7 R2 - 0x5C200600, // 0006 MOVE R8 R3 - 0x7C100800, // 0007 CALL R4 4 - 0x8C100702, // 0008 GETMET R4 R3 K2 - 0x88180103, // 0009 GETMBR R6 R0 K3 - 0x7C100400, // 000A CALL R4 2 - 0x90020204, // 000B SETMBR R0 K1 R4 - 0x88100101, // 000C GETMBR R4 R0 K1 - 0x78120005, // 000D JMPF R4 #0014 - 0xB8120A00, // 000E GETNGBL R4 K5 - 0x88100906, // 000F GETMBR R4 R4 K6 - 0x8C100907, // 0010 GETMET R4 R4 K7 - 0x88180101, // 0011 GETMBR R6 R0 K1 - 0x7C100400, // 0012 CALL R4 2 - 0x90020804, // 0013 SETMBR R0 K4 R4 - 0x80000000, // 0014 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: pre_value -********************************************************************/ -be_local_closure(Matter_Plugin_Bridge_Sensor_pre_value, /* name */ - be_nested_proto( - 2, /* nstack */ + 5, /* nstack */ 2, /* argc */ 2, /* varg */ 0, /* has upvals */ NULL, /* no upvals */ 0, /* has sup protos */ NULL, /* no sub protos */ - 0, /* has constants */ - NULL, /* no const */ - be_str_weak(pre_value), + 1, /* has constants */ + ( &(const bvalue[ 7]) { /* constants */ + /* K0 */ be_nested_str_weak(tasmota_sensor_filter), + /* K1 */ be_nested_str_weak(find), + /* K2 */ be_nested_str_weak(ARG), + /* K3 */ be_nested_str_weak(tasmota_sensor_matcher), + /* K4 */ be_nested_str_weak(tasmota), + /* K5 */ be_nested_str_weak(Rule_Matcher), + /* K6 */ be_nested_str_weak(parse), + }), + be_str_weak(parse_configuration), &be_const_str_solidified, - ( &(const binstruction[ 1]) { /* code */ - 0x80040200, // 0000 RET 1 R1 + ( &(const binstruction[13]) { /* code */ + 0x8C080301, // 0000 GETMET R2 R1 K1 + 0x88100102, // 0001 GETMBR R4 R0 K2 + 0x7C080400, // 0002 CALL R2 2 + 0x90020002, // 0003 SETMBR R0 K0 R2 + 0x88080100, // 0004 GETMBR R2 R0 K0 + 0x780A0005, // 0005 JMPF R2 #000C + 0xB80A0800, // 0006 GETNGBL R2 K4 + 0x88080505, // 0007 GETMBR R2 R2 K5 + 0x8C080506, // 0008 GETMET R2 R2 K6 + 0x88100100, // 0009 GETMBR R4 R0 K0 + 0x7C080400, // 000A CALL R2 2 + 0x90020602, // 000B SETMBR R0 K3 R2 + 0x80000000, // 000C RET 0 }) ) ); @@ -217,16 +208,16 @@ be_local_class(Matter_Plugin_Bridge_Sensor, { be_const_key_weak(ARG, 1), be_nested_str_weak(filter) }, { be_const_key_weak(value_changed, -1), be_const_closure(Matter_Plugin_Bridge_Sensor_value_changed_closure) }, { be_const_key_weak(UPDATE_TIME, -1), be_const_int(5000) }, - { be_const_key_weak(tasmota_sensor_filter, 8), be_const_var(0) }, + { be_const_key_weak(pre_value, 12), be_const_closure(Matter_Plugin_Bridge_Sensor_pre_value_closure) }, { be_const_key_weak(tasmota_sensor_matcher, -1), be_const_var(1) }, { be_const_key_weak(PROBE_TIMEOUT, -1), be_const_int(1700) }, - { be_const_key_weak(filter_name_html, 12), be_const_closure(Matter_Plugin_Bridge_Sensor_filter_name_html_closure) }, - { be_const_key_weak(UPDATE_CMD, -1), be_nested_str_weak(Status_X208) }, - { be_const_key_weak(pre_value, -1), be_const_closure(Matter_Plugin_Bridge_Sensor_pre_value_closure) }, + { be_const_key_weak(filter_name_html, -1), be_const_closure(Matter_Plugin_Bridge_Sensor_filter_name_html_closure) }, + { be_const_key_weak(parse_configuration, -1), be_const_closure(Matter_Plugin_Bridge_Sensor_parse_configuration_closure) }, + { be_const_key_weak(shadow_value, -1), be_const_var(2) }, { be_const_key_weak(parse_update, -1), be_const_closure(Matter_Plugin_Bridge_Sensor_parse_update_closure) }, - { be_const_key_weak(shadow_value, 7), be_const_var(2) }, + { be_const_key_weak(UPDATE_CMD, 8), be_nested_str_weak(Status_X208) }, { be_const_key_weak(ARG_HTTP, 2), be_nested_str_weak(url) }, - { be_const_key_weak(init, -1), be_const_closure(Matter_Plugin_Bridge_Sensor_init_closure) }, + { be_const_key_weak(tasmota_sensor_filter, -1), be_const_var(0) }, })), be_str_weak(Matter_Plugin_Bridge_Sensor) ); diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Sensor_Humidity.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Sensor_Humidity.h index 7b37b1c0e..d8744e6e8 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Sensor_Humidity.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Sensor_Humidity.h @@ -259,7 +259,7 @@ be_local_class(Matter_Plugin_Bridge_Sensor_Humidity, { be_const_key_weak(read_attribute, 7), be_const_closure(Matter_Plugin_Bridge_Sensor_Humidity_read_attribute_closure) }, { be_const_key_weak(value_changed, -1), be_const_closure(Matter_Plugin_Bridge_Sensor_Humidity_value_changed_closure) }, { be_const_key_weak(TYPE, 4), be_nested_str_weak(http_humidity) }, - { be_const_key_weak(NAME, -1), be_nested_str_weak(_X26_X23x1F517_X3B_X20Humidity) }, + { be_const_key_weak(NAME, -1), be_nested_str_weak(Humidity) }, { be_const_key_weak(TYPES, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { be_const_map( * be_nested_map(1, ( (struct bmapnode*) &(const bmapnode[]) { diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Sensor_Illuminance.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Sensor_Illuminance.h index 0dba00e01..0b4d37dc5 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Sensor_Illuminance.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Sensor_Illuminance.h @@ -263,7 +263,7 @@ be_local_class(Matter_Plugin_Bridge_Sensor_Illuminance, { be_const_key_weak(read_attribute, 7), be_const_closure(Matter_Plugin_Bridge_Sensor_Illuminance_read_attribute_closure) }, { be_const_key_weak(value_changed, -1), be_const_closure(Matter_Plugin_Bridge_Sensor_Illuminance_value_changed_closure) }, { be_const_key_weak(TYPE, 4), be_nested_str_weak(http_illuminance) }, - { be_const_key_weak(NAME, -1), be_nested_str_weak(_X26_X23x1F517_X3B_X20Illuminance) }, + { be_const_key_weak(NAME, -1), be_nested_str_weak(Illuminance) }, { be_const_key_weak(TYPES, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { be_const_map( * be_nested_map(1, ( (struct bmapnode*) &(const bmapnode[]) { diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Sensor_Occupancy.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Sensor_Occupancy.h index a89bb35fe..56978494b 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Sensor_Occupancy.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Sensor_Occupancy.h @@ -323,7 +323,7 @@ be_local_class(Matter_Plugin_Bridge_Sensor_Occupancy, { be_const_key_weak(UPDATE_CMD, 9), be_nested_str_weak(Status_X208) }, { be_const_key_weak(read_attribute, -1), be_const_closure(Matter_Plugin_Bridge_Sensor_Occupancy_read_attribute_closure) }, { be_const_key_weak(tasmota_switch_index, 11), be_const_var(0) }, - { be_const_key_weak(NAME, -1), be_nested_str_weak(_X26_X23x1F517_X3B_X20Occupancy) }, + { be_const_key_weak(NAME, -1), be_nested_str_weak(Occupancy) }, { be_const_key_weak(init, -1), be_const_closure(Matter_Plugin_Bridge_Sensor_Occupancy_init_closure) }, { be_const_key_weak(TYPES, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { be_const_map( * be_nested_map(1, diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Sensor_Pressure.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Sensor_Pressure.h index 795ca6577..6e9288e6e 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Sensor_Pressure.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Sensor_Pressure.h @@ -250,7 +250,7 @@ be_local_class(Matter_Plugin_Bridge_Sensor_Pressure, { be_const_key_weak(read_attribute, 7), be_const_closure(Matter_Plugin_Bridge_Sensor_Pressure_read_attribute_closure) }, { be_const_key_weak(value_changed, -1), be_const_closure(Matter_Plugin_Bridge_Sensor_Pressure_value_changed_closure) }, { be_const_key_weak(TYPE, 4), be_nested_str_weak(http_pressure) }, - { be_const_key_weak(NAME, -1), be_nested_str_weak(_X26_X23x1F517_X3B_X20Pressure) }, + { be_const_key_weak(NAME, -1), be_nested_str_weak(Pressure) }, { be_const_key_weak(TYPES, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { be_const_map( * be_nested_map(1, ( (struct bmapnode*) &(const bmapnode[]) { diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Sensor_Temp.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Sensor_Temp.h index e4e35379a..194e59e58 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Sensor_Temp.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Sensor_Temp.h @@ -256,7 +256,7 @@ be_local_class(Matter_Plugin_Bridge_Sensor_Temp, { be_const_key_weak(read_attribute, 7), be_const_closure(Matter_Plugin_Bridge_Sensor_Temp_read_attribute_closure) }, { be_const_key_weak(value_changed, -1), be_const_closure(Matter_Plugin_Bridge_Sensor_Temp_value_changed_closure) }, { be_const_key_weak(TYPE, 4), be_nested_str_weak(http_temperature) }, - { be_const_key_weak(NAME, -1), be_nested_str_weak(_X26_X23x1F517_X3B_X20Temperature) }, + { be_const_key_weak(NAME, -1), be_nested_str_weak(Temperature) }, { be_const_key_weak(TYPES, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { be_const_map( * be_nested_map(1, ( (struct bmapnode*) &(const bmapnode[]) { diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_OnOff.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_OnOff.h index 0c816dfe8..693f354e5 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_OnOff.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_OnOff.h @@ -6,6 +6,43 @@ extern const bclass be_class_Matter_Plugin_OnOff; +/******************************************************************** +** Solidified function: init +********************************************************************/ +be_local_closure(Matter_Plugin_OnOff_init, /* name */ + be_nested_proto( + 9, /* nstack */ + 4, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 2]) { /* constants */ + /* K0 */ be_nested_str_weak(init), + /* K1 */ be_nested_str_weak(shadow_onoff), + }), + be_str_weak(init), + &be_const_str_solidified, + ( &(const binstruction[11]) { /* code */ + 0x60100003, // 0000 GETGBL R4 G3 + 0x5C140000, // 0001 MOVE R5 R0 + 0x7C100200, // 0002 CALL R4 1 + 0x8C100900, // 0003 GETMET R4 R4 K0 + 0x5C180200, // 0004 MOVE R6 R1 + 0x5C1C0400, // 0005 MOVE R7 R2 + 0x5C200600, // 0006 MOVE R8 R3 + 0x7C100800, // 0007 CALL R4 4 + 0x50100000, // 0008 LDBOOL R4 0 0 + 0x90020204, // 0009 SETMBR R0 K1 R4 + 0x80000000, // 000A RET 0 + }) + ) +); +/*******************************************************************/ + + /******************************************************************** ** Solidified function: ********************************************************************/ @@ -33,99 +70,6 @@ be_local_closure(Matter_Plugin_OnOff__X3Clambda_X3E, /* name */ /*******************************************************************/ -/******************************************************************** -** Solidified function: init -********************************************************************/ -be_local_closure(Matter_Plugin_OnOff_init, /* name */ - be_nested_proto( - 9, /* nstack */ - 4, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 7]) { /* constants */ - /* K0 */ be_nested_str_weak(init), - /* K1 */ be_nested_str_weak(shadow_onoff), - /* K2 */ be_nested_str_weak(tasmota_relay_index), - /* K3 */ be_nested_str_weak(find), - /* K4 */ be_nested_str_weak(ARG), - /* K5 */ be_const_int(1), - /* K6 */ be_const_int(0), - }), - be_str_weak(init), - &be_const_str_solidified, - ( &(const binstruction[22]) { /* code */ - 0x60100003, // 0000 GETGBL R4 G3 - 0x5C140000, // 0001 MOVE R5 R0 - 0x7C100200, // 0002 CALL R4 1 - 0x8C100900, // 0003 GETMET R4 R4 K0 - 0x5C180200, // 0004 MOVE R6 R1 - 0x5C1C0400, // 0005 MOVE R7 R2 - 0x5C200600, // 0006 MOVE R8 R3 - 0x7C100800, // 0007 CALL R4 4 - 0x50100000, // 0008 LDBOOL R4 0 0 - 0x90020204, // 0009 SETMBR R0 K1 R4 - 0x60100009, // 000A GETGBL R4 G9 - 0x8C140703, // 000B GETMET R5 R3 K3 - 0x881C0104, // 000C GETMBR R7 R0 K4 - 0x58200005, // 000D LDCONST R8 K5 - 0x7C140600, // 000E CALL R5 3 - 0x7C100200, // 000F CALL R4 1 - 0x90020404, // 0010 SETMBR R0 K2 R4 - 0x88100102, // 0011 GETMBR R4 R0 K2 - 0x18100906, // 0012 LE R4 R4 K6 - 0x78120000, // 0013 JMPF R4 #0015 - 0x90020505, // 0014 SETMBR R0 K2 K5 - 0x80000000, // 0015 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: set_onoff -********************************************************************/ -be_local_closure(Matter_Plugin_OnOff_set_onoff, /* name */ - be_nested_proto( - 7, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 5]) { /* constants */ - /* K0 */ be_nested_str_weak(tasmota), - /* K1 */ be_nested_str_weak(set_power), - /* K2 */ be_nested_str_weak(tasmota_relay_index), - /* K3 */ be_const_int(1), - /* K4 */ be_nested_str_weak(update_shadow), - }), - be_str_weak(set_onoff), - &be_const_str_solidified, - ( &(const binstruction[11]) { /* code */ - 0xB80A0000, // 0000 GETNGBL R2 K0 - 0x8C080501, // 0001 GETMET R2 R2 K1 - 0x88100102, // 0002 GETMBR R4 R0 K2 - 0x04100903, // 0003 SUB R4 R4 K3 - 0x60140017, // 0004 GETGBL R5 G23 - 0x5C180200, // 0005 MOVE R6 R1 - 0x7C140200, // 0006 CALL R5 1 - 0x7C080600, // 0007 CALL R2 3 - 0x8C080104, // 0008 GETMET R2 R0 K4 - 0x7C080200, // 0009 CALL R2 1 - 0x80000000, // 000A RET 0 - }) - ) -); -/*******************************************************************/ - - /******************************************************************** ** Solidified function: invoke_request ********************************************************************/ @@ -203,6 +147,148 @@ be_local_closure(Matter_Plugin_OnOff_invoke_request, /* name */ /*******************************************************************/ +/******************************************************************** +** Solidified function: set_onoff +********************************************************************/ +be_local_closure(Matter_Plugin_OnOff_set_onoff, /* name */ + be_nested_proto( + 7, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 5]) { /* constants */ + /* K0 */ be_nested_str_weak(tasmota), + /* K1 */ be_nested_str_weak(set_power), + /* K2 */ be_nested_str_weak(tasmota_relay_index), + /* K3 */ be_const_int(1), + /* K4 */ be_nested_str_weak(update_shadow), + }), + be_str_weak(set_onoff), + &be_const_str_solidified, + ( &(const binstruction[11]) { /* code */ + 0xB80A0000, // 0000 GETNGBL R2 K0 + 0x8C080501, // 0001 GETMET R2 R2 K1 + 0x88100102, // 0002 GETMBR R4 R0 K2 + 0x04100903, // 0003 SUB R4 R4 K3 + 0x60140017, // 0004 GETGBL R5 G23 + 0x5C180200, // 0005 MOVE R6 R1 + 0x7C140200, // 0006 CALL R5 1 + 0x7C080600, // 0007 CALL R2 3 + 0x8C080104, // 0008 GETMET R2 R0 K4 + 0x7C080200, // 0009 CALL R2 1 + 0x80000000, // 000A RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: update_shadow +********************************************************************/ +be_local_closure(Matter_Plugin_OnOff_update_shadow, /* name */ + be_nested_proto( + 6, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 8]) { /* constants */ + /* K0 */ be_nested_str_weak(tasmota), + /* K1 */ be_nested_str_weak(get_power), + /* K2 */ be_nested_str_weak(tasmota_relay_index), + /* K3 */ be_const_int(1), + /* K4 */ be_nested_str_weak(shadow_onoff), + /* K5 */ be_nested_str_weak(attribute_updated), + /* K6 */ be_const_int(0), + /* K7 */ be_nested_str_weak(update_shadow), + }), + be_str_weak(update_shadow), + &be_const_str_solidified, + ( &(const binstruction[29]) { /* code */ + 0xB8060000, // 0000 GETNGBL R1 K0 + 0x8C040301, // 0001 GETMET R1 R1 K1 + 0x880C0102, // 0002 GETMBR R3 R0 K2 + 0x040C0703, // 0003 SUB R3 R3 K3 + 0x7C040400, // 0004 CALL R1 2 + 0x4C080000, // 0005 LDNIL R2 + 0x20080202, // 0006 NE R2 R1 R2 + 0x780A000E, // 0007 JMPF R2 #0017 + 0x88080104, // 0008 GETMBR R2 R0 K4 + 0x4C0C0000, // 0009 LDNIL R3 + 0x20080403, // 000A NE R2 R2 R3 + 0x780A0009, // 000B JMPF R2 #0016 + 0x88080104, // 000C GETMBR R2 R0 K4 + 0x600C0017, // 000D GETGBL R3 G23 + 0x5C100200, // 000E MOVE R4 R1 + 0x7C0C0200, // 000F CALL R3 1 + 0x20080403, // 0010 NE R2 R2 R3 + 0x780A0003, // 0011 JMPF R2 #0016 + 0x8C080105, // 0012 GETMET R2 R0 K5 + 0x54120005, // 0013 LDINT R4 6 + 0x58140006, // 0014 LDCONST R5 K6 + 0x7C080600, // 0015 CALL R2 3 + 0x90020801, // 0016 SETMBR R0 K4 R1 + 0x60080003, // 0017 GETGBL R2 G3 + 0x5C0C0000, // 0018 MOVE R3 R0 + 0x7C080200, // 0019 CALL R2 1 + 0x8C080507, // 001A GETMET R2 R2 K7 + 0x7C080200, // 001B CALL R2 1 + 0x80000000, // 001C RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: parse_configuration +********************************************************************/ +be_local_closure(Matter_Plugin_OnOff_parse_configuration, /* name */ + be_nested_proto( + 7, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 5]) { /* constants */ + /* K0 */ be_nested_str_weak(tasmota_relay_index), + /* K1 */ be_nested_str_weak(find), + /* K2 */ be_nested_str_weak(ARG), + /* K3 */ be_const_int(1), + /* K4 */ be_const_int(0), + }), + be_str_weak(parse_configuration), + &be_const_str_solidified, + ( &(const binstruction[12]) { /* code */ + 0x60080009, // 0000 GETGBL R2 G9 + 0x8C0C0301, // 0001 GETMET R3 R1 K1 + 0x88140102, // 0002 GETMBR R5 R0 K2 + 0x58180003, // 0003 LDCONST R6 K3 + 0x7C0C0600, // 0004 CALL R3 3 + 0x7C080200, // 0005 CALL R2 1 + 0x90020002, // 0006 SETMBR R0 K0 R2 + 0x88080100, // 0007 GETMBR R2 R0 K0 + 0x18080504, // 0008 LE R2 R2 K4 + 0x780A0000, // 0009 JMPF R2 #000B + 0x90020103, // 000A SETMBR R0 K0 K3 + 0x80000000, // 000B RET 0 + }) + ) +); +/*******************************************************************/ + + /******************************************************************** ** Solidified function: read_attribute ********************************************************************/ @@ -284,67 +370,6 @@ be_local_closure(Matter_Plugin_OnOff_read_attribute, /* name */ /*******************************************************************/ -/******************************************************************** -** Solidified function: update_shadow -********************************************************************/ -be_local_closure(Matter_Plugin_OnOff_update_shadow, /* name */ - be_nested_proto( - 6, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 8]) { /* constants */ - /* K0 */ be_nested_str_weak(tasmota), - /* K1 */ be_nested_str_weak(get_power), - /* K2 */ be_nested_str_weak(tasmota_relay_index), - /* K3 */ be_const_int(1), - /* K4 */ be_nested_str_weak(shadow_onoff), - /* K5 */ be_nested_str_weak(attribute_updated), - /* K6 */ be_const_int(0), - /* K7 */ be_nested_str_weak(update_shadow), - }), - be_str_weak(update_shadow), - &be_const_str_solidified, - ( &(const binstruction[29]) { /* code */ - 0xB8060000, // 0000 GETNGBL R1 K0 - 0x8C040301, // 0001 GETMET R1 R1 K1 - 0x880C0102, // 0002 GETMBR R3 R0 K2 - 0x040C0703, // 0003 SUB R3 R3 K3 - 0x7C040400, // 0004 CALL R1 2 - 0x4C080000, // 0005 LDNIL R2 - 0x20080202, // 0006 NE R2 R1 R2 - 0x780A000E, // 0007 JMPF R2 #0017 - 0x88080104, // 0008 GETMBR R2 R0 K4 - 0x4C0C0000, // 0009 LDNIL R3 - 0x20080403, // 000A NE R2 R2 R3 - 0x780A0009, // 000B JMPF R2 #0016 - 0x88080104, // 000C GETMBR R2 R0 K4 - 0x600C0017, // 000D GETGBL R3 G23 - 0x5C100200, // 000E MOVE R4 R1 - 0x7C0C0200, // 000F CALL R3 1 - 0x20080403, // 0010 NE R2 R2 R3 - 0x780A0003, // 0011 JMPF R2 #0016 - 0x8C080105, // 0012 GETMET R2 R0 K5 - 0x54120005, // 0013 LDINT R4 6 - 0x58140006, // 0014 LDCONST R5 K6 - 0x7C080600, // 0015 CALL R2 3 - 0x90020801, // 0016 SETMBR R0 K4 R1 - 0x60080003, // 0017 GETGBL R2 G3 - 0x5C0C0000, // 0018 MOVE R3 R0 - 0x7C080200, // 0019 CALL R2 1 - 0x8C080507, // 001A GETMET R2 R2 K7 - 0x7C080200, // 001B CALL R2 1 - 0x80000000, // 001C RET 0 - }) - ) -); -/*******************************************************************/ - - /******************************************************************** ** Solidified class: Matter_Plugin_OnOff ********************************************************************/ @@ -352,8 +377,22 @@ extern const bclass be_class_Matter_Plugin_Device; be_local_class(Matter_Plugin_OnOff, 2, &be_class_Matter_Plugin_Device, - be_nested_map(14, + be_nested_map(15, ( (struct bmapnode*) &(const bmapnode[]) { + { be_const_key_weak(init, -1), be_const_closure(Matter_Plugin_OnOff_init_closure) }, + { be_const_key_weak(ARG, -1), be_nested_str_weak(relay) }, + { be_const_key_weak(invoke_request, -1), be_const_closure(Matter_Plugin_OnOff_invoke_request_closure) }, + { be_const_key_weak(set_onoff, -1), be_const_closure(Matter_Plugin_OnOff_set_onoff_closure) }, + { be_const_key_weak(ARG_TYPE, 10), be_const_static_closure(Matter_Plugin_OnOff__X3Clambda_X3E_closure) }, + { be_const_key_weak(tasmota_relay_index, 7), be_const_var(0) }, + { be_const_key_weak(UPDATE_TIME, -1), be_const_int(250) }, + { be_const_key_weak(TYPES, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { + be_const_map( * be_nested_map(1, + ( (struct bmapnode*) &(const bmapnode[]) { + { be_const_key_int(266, -1), be_const_int(2) }, + })) ) } )) }, + { be_const_key_weak(TYPE, 14), be_nested_str_weak(relay) }, + { be_const_key_weak(NAME, 1), be_nested_str_weak(Relay) }, { be_const_key_weak(CLUSTERS, 11), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { be_const_map( * be_nested_map(1, ( (struct bmapnode*) &(const bmapnode[]) { @@ -365,23 +404,10 @@ be_local_class(Matter_Plugin_OnOff, be_const_int(65533), })) ) } )) }, })) ) } )) }, - { be_const_key_weak(ARG, -1), be_nested_str_weak(relay) }, - { be_const_key_weak(UPDATE_TIME, 13), be_const_int(250) }, - { be_const_key_weak(TYPE, -1), be_nested_str_weak(relay) }, - { be_const_key_weak(update_shadow, -1), be_const_closure(Matter_Plugin_OnOff_update_shadow_closure) }, - { be_const_key_weak(init, -1), be_const_closure(Matter_Plugin_OnOff_init_closure) }, - { be_const_key_weak(set_onoff, 12), be_const_closure(Matter_Plugin_OnOff_set_onoff_closure) }, - { be_const_key_weak(invoke_request, 4), be_const_closure(Matter_Plugin_OnOff_invoke_request_closure) }, - { be_const_key_weak(NAME, -1), be_nested_str_weak(Relay) }, - { be_const_key_weak(tasmota_relay_index, -1), be_const_var(0) }, - { be_const_key_weak(TYPES, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { - be_const_map( * be_nested_map(1, - ( (struct bmapnode*) &(const bmapnode[]) { - { be_const_key_int(266, -1), be_const_int(2) }, - })) ) } )) }, + { be_const_key_weak(parse_configuration, 8), be_const_closure(Matter_Plugin_OnOff_parse_configuration_closure) }, { be_const_key_weak(read_attribute, -1), be_const_closure(Matter_Plugin_OnOff_read_attribute_closure) }, { be_const_key_weak(shadow_onoff, -1), be_const_var(1) }, - { be_const_key_weak(ARG_TYPE, -1), be_const_static_closure(Matter_Plugin_OnOff__X3Clambda_X3E_closure) }, + { be_const_key_weak(update_shadow, -1), be_const_closure(Matter_Plugin_OnOff_update_shadow_closure) }, })), be_str_weak(Matter_Plugin_OnOff) ); diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Root.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Root.h index 54565ec7f..a4fc4a4ec 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Root.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Root.h @@ -7,172 +7,913 @@ extern const bclass be_class_Matter_Plugin_Root; /******************************************************************** -** Solidified function: init +** Solidified function: invoke_request ********************************************************************/ -be_local_closure(Matter_Plugin_Root_init, /* name */ +be_local_closure(Matter_Plugin_Root_invoke_request, /* name */ be_nested_proto( - 9, /* nstack */ + 31, /* nstack */ 4, /* argc */ 2, /* varg */ 0, /* has upvals */ NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 1]) { /* constants */ - /* K0 */ be_nested_str_weak(init), + 1, /* has sup protos */ + ( &(const struct bproto*[ 1]) { + be_nested_proto( + 3, /* nstack */ + 0, /* argc */ + 0, /* varg */ + 1, /* has upvals */ + ( &(const bupvaldesc[ 2]) { /* upvals */ + be_local_const_upval(1, 0), + be_local_const_upval(1, 11), + }), + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 2]) { /* constants */ + /* K0 */ be_nested_str_weak(device), + /* K1 */ be_nested_str_weak(remove_fabric), + }), + be_str_weak(_anonymous_), + &be_const_str_solidified, + ( &(const binstruction[ 6]) { /* code */ + 0x68000000, // 0000 GETUPV R0 U0 + 0x88000100, // 0001 GETMBR R0 R0 K0 + 0x8C000101, // 0002 GETMET R0 R0 K1 + 0x68080001, // 0003 GETUPV R2 U1 + 0x7C000400, // 0004 CALL R0 2 + 0x80000000, // 0005 RET 0 + }) + ), }), - be_str_weak(init), - &be_const_str_solidified, - ( &(const binstruction[ 9]) { /* code */ - 0x60100003, // 0000 GETGBL R4 G3 - 0x5C140000, // 0001 MOVE R5 R0 - 0x7C100200, // 0002 CALL R4 1 - 0x8C100900, // 0003 GETMET R4 R4 K0 - 0x5C180200, // 0004 MOVE R6 R1 - 0x5C1C0400, // 0005 MOVE R7 R2 - 0x5C200600, // 0006 MOVE R8 R3 - 0x7C100800, // 0007 CALL R4 4 - 0x80000000, // 0008 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: write_attribute -********************************************************************/ -be_local_closure(Matter_Plugin_Root_write_attribute, /* name */ - be_nested_proto( - 12, /* nstack */ - 4, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[14]) { /* constants */ - /* K0 */ be_nested_str_weak(string), - /* K1 */ be_nested_str_weak(matter), - /* K2 */ be_nested_str_weak(TLV), - /* K3 */ be_nested_str_weak(cluster), - /* K4 */ be_nested_str_weak(attribute), - /* K5 */ be_const_int(0), - /* K6 */ be_nested_str_weak(int), - /* K7 */ be_nested_str_weak(int64), - /* K8 */ be_nested_str_weak(_breadcrumb), - /* K9 */ be_nested_str_weak(attribute_updated), - /* K10 */ be_nested_str_weak(status), - /* K11 */ be_nested_str_weak(CONSTRAINT_ERROR), - /* K12 */ be_const_int(1), - /* K13 */ be_nested_str_weak(INVALID_ACTION), + ( &(const bvalue[107]) { /* constants */ + /* K0 */ be_nested_str_weak(crypto), + /* K1 */ be_nested_str_weak(string), + /* K2 */ be_nested_str_weak(matter), + /* K3 */ be_nested_str_weak(TLV), + /* K4 */ be_nested_str_weak(cluster), + /* K5 */ be_nested_str_weak(command), + /* K6 */ be_const_int(0), + /* K7 */ be_nested_str_weak(findsubval), + /* K8 */ be_const_int(1), + /* K9 */ be_nested_str_weak(_breadcrumb), + /* K10 */ be_nested_str_weak(Matter_TLV_struct), + /* K11 */ be_nested_str_weak(add_TLV), + /* K12 */ be_nested_str_weak(U1), + /* K13 */ be_nested_str_weak(UTF1), + /* K14 */ be_nested_str_weak(), + /* K15 */ be_const_int(2), + /* K16 */ be_nested_str_weak(XX), + /* K17 */ be_const_int(3), + /* K18 */ be_nested_str_weak(_fabric), + /* K19 */ be_nested_str_weak(fabric_completed), + /* K20 */ be_nested_str_weak(set_no_expiration), + /* K21 */ be_nested_str_weak(save), + /* K22 */ be_nested_str_weak(device), + /* K23 */ be_nested_str_weak(start_commissioning_complete_deferred), + /* K24 */ be_nested_str_weak(context_error), + /* K25 */ be_nested_str_weak(CommissioningComplete_X3A_X20no_X20fabric_X20attached), + /* K26 */ be_nested_str_weak(status), + /* K27 */ be_nested_str_weak(UNSUPPORTED_COMMAND), + /* K28 */ be_nested_str_weak(B2), + /* K29 */ be_nested_str_weak(DAC_Cert_FFF1_8000), + /* K30 */ be_nested_str_weak(PAI_Cert_FFF1), + /* K31 */ be_nested_str_weak(CD_FFF1_8000), + /* K32 */ be_nested_str_weak(B1), + /* K33 */ be_nested_str_weak(U4), + /* K34 */ be_nested_str_weak(tasmota), + /* K35 */ be_nested_str_weak(rtc), + /* K36 */ be_nested_str_weak(utc), + /* K37 */ be_nested_str_weak(tlv2raw), + /* K38 */ be_nested_str_weak(get_ac), + /* K39 */ be_nested_str_weak(log), + /* K40 */ be_nested_str_weak(MTR_X3A_X20attestation_tbs_X3D), + /* K41 */ be_nested_str_weak(tohex), + /* K42 */ be_nested_str_weak(EC_P256), + /* K43 */ be_nested_str_weak(ecdsa_sign_sha256), + /* K44 */ be_nested_str_weak(DAC_Priv_FFF1_8000), + /* K45 */ be_nested_str_weak(format), + /* K46 */ be_nested_str_weak(MTR_X3A_X20CSRRequest_X20CSRNonce_X3D_X25s_X20IsForUpdateNOC_X3D_X25s), + /* K47 */ be_nested_str_weak(gen_CSR), + /* K48 */ be_nested_str_weak(MTR_X3A_X20nocsr_tbs_X3D), + /* K49 */ be_nested_str_weak(set_temp_ca), + /* K50 */ be_nested_str_weak(MTR_X3A_X20received_X20ca_root_X3D), + /* K51 */ be_nested_str_weak(SUCCESS), + /* K52 */ be_nested_str_weak(MTR_X3A_X20AddNoc_X20Args_X3D), + /* K53 */ be_nested_str_weak(get_temp_ca), + /* K54 */ be_nested_str_weak(MTR_X3A_X20Error_X3A_X20AdNOC_X20without_X20CA), + /* K55 */ be_nested_str_weak(sessions), + /* K56 */ be_nested_str_weak(create_fabric), + /* K57 */ be_nested_str_weak(set_ca), + /* K58 */ be_nested_str_weak(set_noc_icac), + /* K59 */ be_nested_str_weak(set_ipk_epoch_key), + /* K60 */ be_nested_str_weak(set_admin_subject_vendor), + /* K61 */ be_nested_str_weak(set_pk), + /* K62 */ be_nested_str_weak(get_pk), + /* K63 */ be_nested_str_weak(parse), + /* K64 */ be_nested_str_weak(findsub), + /* K65 */ be_nested_str_weak(MTR_X3A_X20Error_X3A_X20no_X20fabricid_X20nor_X20deviceid_X20in_X20NOC_X20certificate), + /* K66 */ be_nested_str_weak(int), + /* K67 */ be_nested_str_weak(int64), + /* K68 */ be_nested_str_weak(fromu32), + /* K69 */ be_nested_str_weak(tobytes), + /* K70 */ be_nested_str_weak(get_temp_ca_pub), + /* K71 */ be_const_int(2147483647), + /* K72 */ be_nested_str_weak(fromstring), + /* K73 */ be_nested_str_weak(CompressedFabric), + /* K74 */ be_nested_str_weak(HKDF_SHA256), + /* K75 */ be_nested_str_weak(copy), + /* K76 */ be_nested_str_weak(reverse), + /* K77 */ be_nested_str_weak(derive), + /* K78 */ be_nested_str_weak(commissioning_admin_fabric), + /* K79 */ be_nested_str_weak(set_fabric_device), + /* K80 */ be_nested_str_weak(fabric_candidate), + /* K81 */ be_nested_str_weak(start_operational_discovery_deferred), + /* K82 */ be_nested_str_weak(is_PASE), + /* K83 */ be_nested_str_weak(set_expire_in_seconds), + /* K84 */ be_nested_str_weak(log_new_fabric), + /* K85 */ be_nested_str_weak(set_fabric_label), + /* K86 */ be_nested_str_weak(MTR_X3A_X20_X2E_X20_X20_X20_X20_X20_X20_X20_X20_X20_X20Update_X20fabric_X20_X27_X25s_X27_X20label_X3D_X27_X25s_X27), + /* K87 */ be_nested_str_weak(get_fabric_id), + /* K88 */ be_nested_str_weak(fabric_index_X3A), + /* K89 */ be_nested_str_weak(active_fabrics), + /* K90 */ be_nested_str_weak(get_fabric_index), + /* K91 */ be_nested_str_weak(MTR_X3A_X20removing_X20fabric_X20), + /* K92 */ be_nested_str_weak(set_timer), + /* K93 */ be_nested_str_weak(stop_iteration), + /* K94 */ be_nested_str_weak(MTR_X3A_X20RemoveFabric_X20fabric_X28), + /* K95 */ be_nested_str_weak(_X29_X20not_X20found), + /* K96 */ be_nested_str_weak(INVALID_ACTION), + /* K97 */ be_nested_str_weak(MTR_X3A_X20OpenCommissioningWindow_X28timeout_X3D_X25i_X2C_X20passcode_X3D_X25s_X2C_X20discriminator_X3D_X25i_X2C_X20iterations_X3D_X25i_X2C_X20salt_X3D_X25s_X29), + /* K98 */ be_nested_str_weak(INVALID_DATA_TYPE), + /* K99 */ be_nested_str_weak(MTR_X3A_X20wrong_X20size_X20for_X20PAKE_X20parameters), + /* K100 */ be_nested_str_weak(CONSTRAINT_ERROR), + /* K101 */ be_nested_str_weak(start_basic_commissioning), + /* K102 */ be_nested_str_weak(get_fabric), + /* K103 */ be_nested_str_weak(MTR_X3A_X20OpenBasicCommissioningWindow_X20commissioning_timeout_X3D), + /* K104 */ be_nested_str_weak(start_root_basic_commissioning), + /* K105 */ be_nested_str_weak(stop_basic_commissioning), + /* K106 */ be_nested_str_weak(invoke_request), }), - be_str_weak(write_attribute), + be_str_weak(invoke_request), &be_const_str_solidified, - ( &(const binstruction[101]) { /* code */ + ( &(const binstruction[755]) { /* code */ 0xA4120000, // 0000 IMPORT R4 K0 - 0xB8160200, // 0001 GETNGBL R5 K1 - 0x88140B02, // 0002 GETMBR R5 R5 K2 - 0x88180503, // 0003 GETMBR R6 R2 K3 - 0x881C0504, // 0004 GETMBR R7 R2 K4 - 0x5422002F, // 0005 LDINT R8 48 - 0x1C200C08, // 0006 EQ R8 R6 R8 - 0x78220019, // 0007 JMPF R8 #0022 - 0x1C200F05, // 0008 EQ R8 R7 K5 - 0x78220016, // 0009 JMPF R8 #0021 - 0x60200004, // 000A GETGBL R8 G4 - 0x5C240600, // 000B MOVE R9 R3 - 0x7C200200, // 000C CALL R8 1 - 0x1C201106, // 000D EQ R8 R8 K6 - 0x74220004, // 000E JMPT R8 #0014 - 0x6020000F, // 000F GETGBL R8 G15 - 0x5C240600, // 0010 MOVE R9 R3 - 0xB82A0E00, // 0011 GETNGBL R10 K7 - 0x7C200400, // 0012 CALL R8 2 - 0x78220007, // 0013 JMPF R8 #001C - 0x90061003, // 0014 SETMBR R1 K8 R3 - 0x8C200109, // 0015 GETMET R8 R0 K9 - 0x88280503, // 0016 GETMBR R10 R2 K3 - 0x882C0504, // 0017 GETMBR R11 R2 K4 - 0x7C200600, // 0018 CALL R8 3 - 0x50200200, // 0019 LDBOOL R8 1 0 - 0x80041000, // 001A RET 1 R8 - 0x70020004, // 001B JMP #0021 - 0xB8220200, // 001C GETNGBL R8 K1 - 0x8820110B, // 001D GETMBR R8 R8 K11 - 0x900A1408, // 001E SETMBR R2 K10 R8 - 0x50200000, // 001F LDBOOL R8 0 0 - 0x80041000, // 0020 RET 1 R8 - 0x70020041, // 0021 JMP #0064 - 0x5422001E, // 0022 LDINT R8 31 - 0x1C200C08, // 0023 EQ R8 R6 R8 - 0x78220004, // 0024 JMPF R8 #002A - 0x1C200F05, // 0025 EQ R8 R7 K5 - 0x78220001, // 0026 JMPF R8 #0029 - 0x50200200, // 0027 LDBOOL R8 1 0 - 0x80041000, // 0028 RET 1 R8 - 0x70020039, // 0029 JMP #0064 - 0x54220027, // 002A LDINT R8 40 - 0x1C200C08, // 002B EQ R8 R6 R8 - 0x7822000B, // 002C JMPF R8 #0039 - 0x54220004, // 002D LDINT R8 5 - 0x1C200E08, // 002E EQ R8 R7 R8 - 0x78220002, // 002F JMPF R8 #0033 - 0x50200200, // 0030 LDBOOL R8 1 0 - 0x80041000, // 0031 RET 1 R8 - 0x70020004, // 0032 JMP #0038 - 0x54220005, // 0033 LDINT R8 6 - 0x1C200E08, // 0034 EQ R8 R7 R8 - 0x78220001, // 0035 JMPF R8 #0038 - 0x50200200, // 0036 LDBOOL R8 1 0 - 0x80041000, // 0037 RET 1 R8 - 0x7002002A, // 0038 JMP #0064 - 0x54220029, // 0039 LDINT R8 42 - 0x1C200C08, // 003A EQ R8 R6 R8 - 0x78220004, // 003B JMPF R8 #0041 - 0x1C200F05, // 003C EQ R8 R7 K5 - 0x78220001, // 003D JMPF R8 #0040 - 0x50200200, // 003E LDBOOL R8 1 0 - 0x80041000, // 003F RET 1 R8 - 0x70020022, // 0040 JMP #0064 - 0x5422002A, // 0041 LDINT R8 43 - 0x1C200C08, // 0042 EQ R8 R6 R8 - 0x78220007, // 0043 JMPF R8 #004C - 0x1C200F05, // 0044 EQ R8 R7 K5 - 0x78220004, // 0045 JMPF R8 #004B - 0xB8220200, // 0046 GETNGBL R8 K1 - 0x8820110B, // 0047 GETMBR R8 R8 K11 - 0x900A1408, // 0048 SETMBR R2 K10 R8 - 0x50200000, // 0049 LDBOOL R8 0 0 - 0x80041000, // 004A RET 1 R8 - 0x70020017, // 004B JMP #0064 - 0x5422002B, // 004C LDINT R8 44 - 0x1C200C08, // 004D EQ R8 R6 R8 - 0x78220009, // 004E JMPF R8 #0059 - 0x1C200F05, // 004F EQ R8 R7 K5 - 0x78220002, // 0050 JMPF R8 #0054 - 0x50200200, // 0051 LDBOOL R8 1 0 - 0x80041000, // 0052 RET 1 R8 - 0x70020003, // 0053 JMP #0058 - 0x1C200F0C, // 0054 EQ R8 R7 K12 - 0x78220001, // 0055 JMPF R8 #0058 - 0x50200200, // 0056 LDBOOL R8 1 0 - 0x80041000, // 0057 RET 1 R8 - 0x7002000A, // 0058 JMP #0064 - 0x54220030, // 0059 LDINT R8 49 - 0x1C200C08, // 005A EQ R8 R6 R8 - 0x78220007, // 005B JMPF R8 #0064 - 0x54220003, // 005C LDINT R8 4 - 0x1C200E08, // 005D EQ R8 R7 R8 - 0x78220004, // 005E JMPF R8 #0064 - 0xB8220200, // 005F GETNGBL R8 K1 - 0x8820110D, // 0060 GETMBR R8 R8 K13 - 0x900A1408, // 0061 SETMBR R2 K10 R8 - 0x50200000, // 0062 LDBOOL R8 0 0 - 0x80041000, // 0063 RET 1 R8 - 0x80000000, // 0064 RET 0 + 0xA4160200, // 0001 IMPORT R5 K1 + 0xB81A0400, // 0002 GETNGBL R6 K2 + 0x88180D03, // 0003 GETMBR R6 R6 K3 + 0x881C0704, // 0004 GETMBR R7 R3 K4 + 0x88200705, // 0005 GETMBR R8 R3 K5 + 0x5426002F, // 0006 LDINT R9 48 + 0x1C240E09, // 0007 EQ R9 R7 R9 + 0x78260059, // 0008 JMPF R9 #0063 + 0x1C241106, // 0009 EQ R9 R8 K6 + 0x78260017, // 000A JMPF R9 #0023 + 0x8C240507, // 000B GETMET R9 R2 K7 + 0x582C0006, // 000C LDCONST R11 K6 + 0x54320383, // 000D LDINT R12 900 + 0x7C240600, // 000E CALL R9 3 + 0x8C280507, // 000F GETMET R10 R2 K7 + 0x58300008, // 0010 LDCONST R12 K8 + 0x58340006, // 0011 LDCONST R13 K6 + 0x7C280600, // 0012 CALL R10 3 + 0x9006120A, // 0013 SETMBR R1 K9 R10 + 0x8C2C0D0A, // 0014 GETMET R11 R6 K10 + 0x7C2C0200, // 0015 CALL R11 1 + 0x8C30170B, // 0016 GETMET R12 R11 K11 + 0x58380006, // 0017 LDCONST R14 K6 + 0x883C0D0C, // 0018 GETMBR R15 R6 K12 + 0x58400006, // 0019 LDCONST R16 K6 + 0x7C300800, // 001A CALL R12 4 + 0x8C30170B, // 001B GETMET R12 R11 K11 + 0x58380008, // 001C LDCONST R14 K8 + 0x883C0D0D, // 001D GETMBR R15 R6 K13 + 0x5840000E, // 001E LDCONST R16 K14 + 0x7C300800, // 001F CALL R12 4 + 0x900E0B08, // 0020 SETMBR R3 K5 K8 + 0x80041600, // 0021 RET 1 R11 + 0x7002003E, // 0022 JMP #0062 + 0x1C24110F, // 0023 EQ R9 R8 K15 + 0x7826001A, // 0024 JMPF R9 #0040 + 0x8C240507, // 0025 GETMET R9 R2 K7 + 0x582C0006, // 0026 LDCONST R11 K6 + 0x7C240400, // 0027 CALL R9 2 + 0x8C280507, // 0028 GETMET R10 R2 K7 + 0x58300008, // 0029 LDCONST R12 K8 + 0x58340010, // 002A LDCONST R13 K16 + 0x7C280600, // 002B CALL R10 3 + 0x8C2C0507, // 002C GETMET R11 R2 K7 + 0x5834000F, // 002D LDCONST R13 K15 + 0x58380006, // 002E LDCONST R14 K6 + 0x7C2C0600, // 002F CALL R11 3 + 0x9006120B, // 0030 SETMBR R1 K9 R11 + 0x8C300D0A, // 0031 GETMET R12 R6 K10 + 0x7C300200, // 0032 CALL R12 1 + 0x8C34190B, // 0033 GETMET R13 R12 K11 + 0x583C0006, // 0034 LDCONST R15 K6 + 0x88400D0C, // 0035 GETMBR R16 R6 K12 + 0x58440006, // 0036 LDCONST R17 K6 + 0x7C340800, // 0037 CALL R13 4 + 0x8C34190B, // 0038 GETMET R13 R12 K11 + 0x583C0008, // 0039 LDCONST R15 K8 + 0x88400D0D, // 003A GETMBR R16 R6 K13 + 0x5844000E, // 003B LDCONST R17 K14 + 0x7C340800, // 003C CALL R13 4 + 0x900E0B11, // 003D SETMBR R3 K5 K17 + 0x80041800, // 003E RET 1 R12 + 0x70020021, // 003F JMP #0062 + 0x54260003, // 0040 LDINT R9 4 + 0x1C241009, // 0041 EQ R9 R8 R9 + 0x7826001E, // 0042 JMPF R9 #0062 + 0x88240312, // 0043 GETMBR R9 R1 K18 + 0x7826001B, // 0044 JMPF R9 #0061 + 0x90061306, // 0045 SETMBR R1 K9 K6 + 0x88240312, // 0046 GETMBR R9 R1 K18 + 0x8C241313, // 0047 GETMET R9 R9 K19 + 0x7C240200, // 0048 CALL R9 1 + 0x8C240314, // 0049 GETMET R9 R1 K20 + 0x7C240200, // 004A CALL R9 1 + 0x8C240315, // 004B GETMET R9 R1 K21 + 0x7C240200, // 004C CALL R9 1 + 0x8C240D0A, // 004D GETMET R9 R6 K10 + 0x7C240200, // 004E CALL R9 1 + 0x8C28130B, // 004F GETMET R10 R9 K11 + 0x58300006, // 0050 LDCONST R12 K6 + 0x88340D0C, // 0051 GETMBR R13 R6 K12 + 0x58380006, // 0052 LDCONST R14 K6 + 0x7C280800, // 0053 CALL R10 4 + 0x8C28130B, // 0054 GETMET R10 R9 K11 + 0x58300008, // 0055 LDCONST R12 K8 + 0x88340D0D, // 0056 GETMBR R13 R6 K13 + 0x5838000E, // 0057 LDCONST R14 K14 + 0x7C280800, // 0058 CALL R10 4 + 0x542A0004, // 0059 LDINT R10 5 + 0x900E0A0A, // 005A SETMBR R3 K5 R10 + 0x88280116, // 005B GETMBR R10 R0 K22 + 0x8C281517, // 005C GETMET R10 R10 K23 + 0x5C300200, // 005D MOVE R12 R1 + 0x7C280400, // 005E CALL R10 2 + 0x80041200, // 005F RET 1 R9 + 0x70020000, // 0060 JMP #0062 + 0xB0063119, // 0061 RAISE 1 K24 K25 + 0x7002028D, // 0062 JMP #02F1 + 0x5426003D, // 0063 LDINT R9 62 + 0x1C240E09, // 0064 EQ R9 R7 R9 + 0x782601EF, // 0065 JMPF R9 #0256 + 0x1C24110F, // 0066 EQ R9 R8 K15 + 0x7826001D, // 0067 JMPF R9 #0086 + 0x8C240507, // 0068 GETMET R9 R2 K7 + 0x582C0006, // 0069 LDCONST R11 K6 + 0x7C240400, // 006A CALL R9 2 + 0x20281308, // 006B NE R10 R9 K8 + 0x782A0006, // 006C JMPF R10 #0074 + 0x2028130F, // 006D NE R10 R9 K15 + 0x782A0004, // 006E JMPF R10 #0074 + 0xB82A0400, // 006F GETNGBL R10 K2 + 0x8828151B, // 0070 GETMBR R10 R10 K27 + 0x900E340A, // 0071 SETMBR R3 K26 R10 + 0x4C280000, // 0072 LDNIL R10 + 0x80041400, // 0073 RET 1 R10 + 0x8C280D0A, // 0074 GETMET R10 R6 K10 + 0x7C280200, // 0075 CALL R10 1 + 0x8C2C150B, // 0076 GETMET R11 R10 K11 + 0x58340006, // 0077 LDCONST R13 K6 + 0x88380D1C, // 0078 GETMBR R14 R6 K28 + 0x1C3C1308, // 0079 EQ R15 R9 K8 + 0x783E0003, // 007A JMPF R15 #007F + 0xB83E0400, // 007B GETNGBL R15 K2 + 0x8C3C1F1D, // 007C GETMET R15 R15 K29 + 0x7C3C0200, // 007D CALL R15 1 + 0x70020002, // 007E JMP #0082 + 0xB83E0400, // 007F GETNGBL R15 K2 + 0x8C3C1F1E, // 0080 GETMET R15 R15 K30 + 0x7C3C0200, // 0081 CALL R15 1 + 0x7C2C0800, // 0082 CALL R11 4 + 0x900E0B11, // 0083 SETMBR R3 K5 K17 + 0x80041400, // 0084 RET 1 R10 + 0x700201CE, // 0085 JMP #0255 + 0x1C241106, // 0086 EQ R9 R8 K6 + 0x78260044, // 0087 JMPF R9 #00CD + 0x8C240507, // 0088 GETMET R9 R2 K7 + 0x582C0006, // 0089 LDCONST R11 K6 + 0x7C240400, // 008A CALL R9 2 + 0x6028000C, // 008B GETGBL R10 G12 + 0x5C2C1200, // 008C MOVE R11 R9 + 0x7C280200, // 008D CALL R10 1 + 0x542E001F, // 008E LDINT R11 32 + 0x2028140B, // 008F NE R10 R10 R11 + 0x782A0001, // 0090 JMPF R10 #0093 + 0x4C280000, // 0091 LDNIL R10 + 0x80041400, // 0092 RET 1 R10 + 0x900E0B08, // 0093 SETMBR R3 K5 K8 + 0x8C280D0A, // 0094 GETMET R10 R6 K10 + 0x7C280200, // 0095 CALL R10 1 + 0x8C2C150B, // 0096 GETMET R11 R10 K11 + 0x58340008, // 0097 LDCONST R13 K8 + 0x88380D1C, // 0098 GETMBR R14 R6 K28 + 0xB83E0400, // 0099 GETNGBL R15 K2 + 0x8C3C1F1F, // 009A GETMET R15 R15 K31 + 0x7C3C0200, // 009B CALL R15 1 + 0x7C2C0800, // 009C CALL R11 4 + 0x8C2C150B, // 009D GETMET R11 R10 K11 + 0x5834000F, // 009E LDCONST R13 K15 + 0x88380D20, // 009F GETMBR R14 R6 K32 + 0x5C3C1200, // 00A0 MOVE R15 R9 + 0x7C2C0800, // 00A1 CALL R11 4 + 0x8C2C150B, // 00A2 GETMET R11 R10 K11 + 0x58340011, // 00A3 LDCONST R13 K17 + 0x88380D21, // 00A4 GETMBR R14 R6 K33 + 0xB83E4400, // 00A5 GETNGBL R15 K34 + 0x8C3C1F23, // 00A6 GETMET R15 R15 K35 + 0x7C3C0200, // 00A7 CALL R15 1 + 0x943C1F24, // 00A8 GETIDX R15 R15 K36 + 0x7C2C0800, // 00A9 CALL R11 4 + 0x8C2C1525, // 00AA GETMET R11 R10 K37 + 0x7C2C0200, // 00AB CALL R11 1 + 0x8C300326, // 00AC GETMET R12 R1 K38 + 0x7C300200, // 00AD CALL R12 1 + 0x0034160C, // 00AE ADD R13 R11 R12 + 0xB83A4400, // 00AF GETNGBL R14 K34 + 0x8C381D27, // 00B0 GETMET R14 R14 K39 + 0x8C401B29, // 00B1 GETMET R16 R13 K41 + 0x7C400200, // 00B2 CALL R16 1 + 0x00425010, // 00B3 ADD R16 K40 R16 + 0x58440011, // 00B4 LDCONST R17 K17 + 0x7C380600, // 00B5 CALL R14 3 + 0x8C38092A, // 00B6 GETMET R14 R4 K42 + 0x7C380200, // 00B7 CALL R14 1 + 0x8C381D2B, // 00B8 GETMET R14 R14 K43 + 0xB8420400, // 00B9 GETNGBL R16 K2 + 0x8C40212C, // 00BA GETMET R16 R16 K44 + 0x7C400200, // 00BB CALL R16 1 + 0x5C441A00, // 00BC MOVE R17 R13 + 0x7C380600, // 00BD CALL R14 3 + 0x8C3C0D0A, // 00BE GETMET R15 R6 K10 + 0x7C3C0200, // 00BF CALL R15 1 + 0x8C401F0B, // 00C0 GETMET R16 R15 K11 + 0x58480006, // 00C1 LDCONST R18 K6 + 0x884C0D1C, // 00C2 GETMBR R19 R6 K28 + 0x5C501600, // 00C3 MOVE R20 R11 + 0x7C400800, // 00C4 CALL R16 4 + 0x8C401F0B, // 00C5 GETMET R16 R15 K11 + 0x58480008, // 00C6 LDCONST R18 K8 + 0x884C0D20, // 00C7 GETMBR R19 R6 K32 + 0x5C501C00, // 00C8 MOVE R20 R14 + 0x7C400800, // 00C9 CALL R16 4 + 0x900E0B08, // 00CA SETMBR R3 K5 K8 + 0x80041E00, // 00CB RET 1 R15 + 0x70020187, // 00CC JMP #0255 + 0x54260003, // 00CD LDINT R9 4 + 0x1C241009, // 00CE EQ R9 R8 R9 + 0x7826004D, // 00CF JMPF R9 #011E + 0x8C240507, // 00D0 GETMET R9 R2 K7 + 0x582C0006, // 00D1 LDCONST R11 K6 + 0x7C240400, // 00D2 CALL R9 2 + 0x6028000C, // 00D3 GETGBL R10 G12 + 0x5C2C1200, // 00D4 MOVE R11 R9 + 0x7C280200, // 00D5 CALL R10 1 + 0x542E001F, // 00D6 LDINT R11 32 + 0x2028140B, // 00D7 NE R10 R10 R11 + 0x782A0001, // 00D8 JMPF R10 #00DB + 0x4C280000, // 00D9 LDNIL R10 + 0x80041400, // 00DA RET 1 R10 + 0x8C280507, // 00DB GETMET R10 R2 K7 + 0x58300008, // 00DC LDCONST R12 K8 + 0x50340000, // 00DD LDBOOL R13 0 0 + 0x7C280600, // 00DE CALL R10 3 + 0xB82E4400, // 00DF GETNGBL R11 K34 + 0x8C2C1727, // 00E0 GETMET R11 R11 K39 + 0x8C340B2D, // 00E1 GETMET R13 R5 K45 + 0x583C002E, // 00E2 LDCONST R15 K46 + 0x60400008, // 00E3 GETGBL R16 G8 + 0x5C441200, // 00E4 MOVE R17 R9 + 0x7C400200, // 00E5 CALL R16 1 + 0x60440008, // 00E6 GETGBL R17 G8 + 0x5C481400, // 00E7 MOVE R18 R10 + 0x7C440200, // 00E8 CALL R17 1 + 0x7C340800, // 00E9 CALL R13 4 + 0x58380011, // 00EA LDCONST R14 K17 + 0x7C2C0600, // 00EB CALL R11 3 + 0x8C2C032F, // 00EC GETMET R11 R1 K47 + 0x7C2C0200, // 00ED CALL R11 1 + 0x8C300D0A, // 00EE GETMET R12 R6 K10 + 0x7C300200, // 00EF CALL R12 1 + 0x8C34190B, // 00F0 GETMET R13 R12 K11 + 0x583C0008, // 00F1 LDCONST R15 K8 + 0x88400D1C, // 00F2 GETMBR R16 R6 K28 + 0x5C441600, // 00F3 MOVE R17 R11 + 0x7C340800, // 00F4 CALL R13 4 + 0x8C34190B, // 00F5 GETMET R13 R12 K11 + 0x583C000F, // 00F6 LDCONST R15 K15 + 0x88400D20, // 00F7 GETMBR R16 R6 K32 + 0x5C441200, // 00F8 MOVE R17 R9 + 0x7C340800, // 00F9 CALL R13 4 + 0x8C341925, // 00FA GETMET R13 R12 K37 + 0x7C340200, // 00FB CALL R13 1 + 0x8C380326, // 00FC GETMET R14 R1 K38 + 0x7C380200, // 00FD CALL R14 1 + 0x00381A0E, // 00FE ADD R14 R13 R14 + 0xB83E4400, // 00FF GETNGBL R15 K34 + 0x8C3C1F27, // 0100 GETMET R15 R15 K39 + 0x8C441D29, // 0101 GETMET R17 R14 K41 + 0x7C440200, // 0102 CALL R17 1 + 0x00466011, // 0103 ADD R17 K48 R17 + 0x58480011, // 0104 LDCONST R18 K17 + 0x7C3C0600, // 0105 CALL R15 3 + 0x8C3C092A, // 0106 GETMET R15 R4 K42 + 0x7C3C0200, // 0107 CALL R15 1 + 0x8C3C1F2B, // 0108 GETMET R15 R15 K43 + 0xB8460400, // 0109 GETNGBL R17 K2 + 0x8C44232C, // 010A GETMET R17 R17 K44 + 0x7C440200, // 010B CALL R17 1 + 0x5C481C00, // 010C MOVE R18 R14 + 0x7C3C0600, // 010D CALL R15 3 + 0x8C400D0A, // 010E GETMET R16 R6 K10 + 0x7C400200, // 010F CALL R16 1 + 0x8C44210B, // 0110 GETMET R17 R16 K11 + 0x584C0006, // 0111 LDCONST R19 K6 + 0x88500D1C, // 0112 GETMBR R20 R6 K28 + 0x5C541A00, // 0113 MOVE R21 R13 + 0x7C440800, // 0114 CALL R17 4 + 0x8C44210B, // 0115 GETMET R17 R16 K11 + 0x584C0008, // 0116 LDCONST R19 K8 + 0x88500D20, // 0117 GETMBR R20 R6 K32 + 0x5C541E00, // 0118 MOVE R21 R15 + 0x7C440800, // 0119 CALL R17 4 + 0x54460004, // 011A LDINT R17 5 + 0x900E0A11, // 011B SETMBR R3 K5 R17 + 0x80042000, // 011C RET 1 R16 + 0x70020136, // 011D JMP #0255 + 0x5426000A, // 011E LDINT R9 11 + 0x1C241009, // 011F EQ R9 R8 R9 + 0x78260012, // 0120 JMPF R9 #0134 + 0x8C240507, // 0121 GETMET R9 R2 K7 + 0x582C0006, // 0122 LDCONST R11 K6 + 0x7C240400, // 0123 CALL R9 2 + 0x8C280331, // 0124 GETMET R10 R1 K49 + 0x5C301200, // 0125 MOVE R12 R9 + 0x7C280400, // 0126 CALL R10 2 + 0xB82A4400, // 0127 GETNGBL R10 K34 + 0x8C281527, // 0128 GETMET R10 R10 K39 + 0x8C301329, // 0129 GETMET R12 R9 K41 + 0x7C300200, // 012A CALL R12 1 + 0x0032640C, // 012B ADD R12 K50 R12 + 0x58340011, // 012C LDCONST R13 K17 + 0x7C280600, // 012D CALL R10 3 + 0xB82A0400, // 012E GETNGBL R10 K2 + 0x88281533, // 012F GETMBR R10 R10 K51 + 0x900E340A, // 0130 SETMBR R3 K26 R10 + 0x4C280000, // 0131 LDNIL R10 + 0x80041400, // 0132 RET 1 R10 + 0x70020120, // 0133 JMP #0255 + 0x54260005, // 0134 LDINT R9 6 + 0x1C241009, // 0135 EQ R9 R8 R9 + 0x782600B9, // 0136 JMPF R9 #01F1 + 0xB8264400, // 0137 GETNGBL R9 K34 + 0x8C241327, // 0138 GETMET R9 R9 K39 + 0x602C0008, // 0139 GETGBL R11 G8 + 0x5C300400, // 013A MOVE R12 R2 + 0x7C2C0200, // 013B CALL R11 1 + 0x002E680B, // 013C ADD R11 K52 R11 + 0x58300011, // 013D LDCONST R12 K17 + 0x7C240600, // 013E CALL R9 3 + 0x8C240507, // 013F GETMET R9 R2 K7 + 0x582C0006, // 0140 LDCONST R11 K6 + 0x7C240400, // 0141 CALL R9 2 + 0x8C280507, // 0142 GETMET R10 R2 K7 + 0x58300008, // 0143 LDCONST R12 K8 + 0x7C280400, // 0144 CALL R10 2 + 0x602C000C, // 0145 GETGBL R11 G12 + 0x5C301400, // 0146 MOVE R12 R10 + 0x7C2C0200, // 0147 CALL R11 1 + 0x1C2C1706, // 0148 EQ R11 R11 K6 + 0x782E0000, // 0149 JMPF R11 #014B + 0x4C280000, // 014A LDNIL R10 + 0x8C2C0507, // 014B GETMET R11 R2 K7 + 0x5834000F, // 014C LDCONST R13 K15 + 0x7C2C0400, // 014D CALL R11 2 + 0x8C300507, // 014E GETMET R12 R2 K7 + 0x58380011, // 014F LDCONST R14 K17 + 0x7C300400, // 0150 CALL R12 2 + 0x8C340507, // 0151 GETMET R13 R2 K7 + 0x543E0003, // 0152 LDINT R15 4 + 0x7C340400, // 0153 CALL R13 2 + 0x8C380335, // 0154 GETMET R14 R1 K53 + 0x7C380200, // 0155 CALL R14 1 + 0x4C3C0000, // 0156 LDNIL R15 + 0x1C381C0F, // 0157 EQ R14 R14 R15 + 0x783A0006, // 0158 JMPF R14 #0160 + 0xB83A4400, // 0159 GETNGBL R14 K34 + 0x8C381D27, // 015A GETMET R14 R14 K39 + 0x58400036, // 015B LDCONST R16 K54 + 0x5844000F, // 015C LDCONST R17 K15 + 0x7C380600, // 015D CALL R14 3 + 0x4C380000, // 015E LDNIL R14 + 0x80041C00, // 015F RET 1 R14 + 0x88380116, // 0160 GETMBR R14 R0 K22 + 0x88381D37, // 0161 GETMBR R14 R14 K55 + 0x8C381D38, // 0162 GETMET R14 R14 K56 + 0x7C380200, // 0163 CALL R14 1 + 0x8C3C1D39, // 0164 GETMET R15 R14 K57 + 0x8C440335, // 0165 GETMET R17 R1 K53 + 0x7C440200, // 0166 CALL R17 1 + 0x7C3C0400, // 0167 CALL R15 2 + 0x8C3C1D3A, // 0168 GETMET R15 R14 K58 + 0x5C441200, // 0169 MOVE R17 R9 + 0x5C481400, // 016A MOVE R18 R10 + 0x7C3C0600, // 016B CALL R15 3 + 0x8C3C1D3B, // 016C GETMET R15 R14 K59 + 0x5C441600, // 016D MOVE R17 R11 + 0x7C3C0400, // 016E CALL R15 2 + 0x8C3C1D3C, // 016F GETMET R15 R14 K60 + 0x5C441800, // 0170 MOVE R17 R12 + 0x5C481A00, // 0171 MOVE R18 R13 + 0x7C3C0600, // 0172 CALL R15 3 + 0x8C3C1D3D, // 0173 GETMET R15 R14 K61 + 0x8C44033E, // 0174 GETMET R17 R1 K62 + 0x7C440200, // 0175 CALL R17 1 + 0x7C3C0400, // 0176 CALL R15 2 + 0xB83E0400, // 0177 GETNGBL R15 K2 + 0x883C1F03, // 0178 GETMBR R15 R15 K3 + 0x8C3C1F3F, // 0179 GETMET R15 R15 K63 + 0x5C441200, // 017A MOVE R17 R9 + 0x7C3C0400, // 017B CALL R15 2 + 0x8C401F40, // 017C GETMET R16 R15 K64 + 0x544A0005, // 017D LDINT R18 6 + 0x7C400400, // 017E CALL R16 2 + 0x8C442107, // 017F GETMET R17 R16 K7 + 0x544E0014, // 0180 LDINT R19 21 + 0x7C440400, // 0181 CALL R17 2 + 0x8C482107, // 0182 GETMET R18 R16 K7 + 0x54520010, // 0183 LDINT R20 17 + 0x7C480400, // 0184 CALL R18 2 + 0x5C4C2200, // 0185 MOVE R19 R17 + 0x784E0001, // 0186 JMPF R19 #0189 + 0x5C4C2400, // 0187 MOVE R19 R18 + 0x744E0006, // 0188 JMPT R19 #0190 + 0xB84E4400, // 0189 GETNGBL R19 K34 + 0x8C4C2727, // 018A GETMET R19 R19 K39 + 0x58540041, // 018B LDCONST R21 K65 + 0x5858000F, // 018C LDCONST R22 K15 + 0x7C4C0600, // 018D CALL R19 3 + 0x504C0000, // 018E LDBOOL R19 0 0 + 0x80042600, // 018F RET 1 R19 + 0x604C0004, // 0190 GETGBL R19 G4 + 0x5C502200, // 0191 MOVE R20 R17 + 0x7C4C0200, // 0192 CALL R19 1 + 0x1C4C2742, // 0193 EQ R19 R19 K66 + 0x784E0007, // 0194 JMPF R19 #019D + 0xB84E8600, // 0195 GETNGBL R19 K67 + 0x8C4C2744, // 0196 GETMET R19 R19 K68 + 0x5C542200, // 0197 MOVE R21 R17 + 0x7C4C0400, // 0198 CALL R19 2 + 0x8C4C2745, // 0199 GETMET R19 R19 K69 + 0x7C4C0200, // 019A CALL R19 1 + 0x5C442600, // 019B MOVE R17 R19 + 0x70020002, // 019C JMP #01A0 + 0x8C4C2345, // 019D GETMET R19 R17 K69 + 0x7C4C0200, // 019E CALL R19 1 + 0x5C442600, // 019F MOVE R17 R19 + 0x604C0004, // 01A0 GETGBL R19 G4 + 0x5C502400, // 01A1 MOVE R20 R18 + 0x7C4C0200, // 01A2 CALL R19 1 + 0x1C4C2742, // 01A3 EQ R19 R19 K66 + 0x784E0007, // 01A4 JMPF R19 #01AD + 0xB84E8600, // 01A5 GETNGBL R19 K67 + 0x8C4C2744, // 01A6 GETMET R19 R19 K68 + 0x5C542400, // 01A7 MOVE R21 R18 + 0x7C4C0400, // 01A8 CALL R19 2 + 0x8C4C2745, // 01A9 GETMET R19 R19 K69 + 0x7C4C0200, // 01AA CALL R19 1 + 0x5C482600, // 01AB MOVE R18 R19 + 0x70020002, // 01AC JMP #01B0 + 0x8C4C2545, // 01AD GETMET R19 R18 K69 + 0x7C4C0200, // 01AE CALL R19 1 + 0x5C482600, // 01AF MOVE R18 R19 + 0x8C4C0346, // 01B0 GETMET R19 R1 K70 + 0x7C4C0200, // 01B1 CALL R19 1 + 0x40521147, // 01B2 CONNECT R20 K8 K71 + 0x944C2614, // 01B3 GETIDX R19 R19 R20 + 0x60540015, // 01B4 GETGBL R21 G21 + 0x7C540000, // 01B5 CALL R21 0 + 0x8C542B48, // 01B6 GETMET R21 R21 K72 + 0x585C0049, // 01B7 LDCONST R23 K73 + 0x7C540400, // 01B8 CALL R21 2 + 0x5C502A00, // 01B9 MOVE R20 R21 + 0x8C54094A, // 01BA GETMET R21 R4 K74 + 0x7C540200, // 01BB CALL R21 1 + 0x8C58234B, // 01BC GETMET R22 R17 K75 + 0x7C580200, // 01BD CALL R22 1 + 0x8C582D4C, // 01BE GETMET R22 R22 K76 + 0x7C580200, // 01BF CALL R22 1 + 0x8C5C2B4D, // 01C0 GETMET R23 R21 K77 + 0x5C642600, // 01C1 MOVE R25 R19 + 0x5C682C00, // 01C2 MOVE R26 R22 + 0x5C6C2800, // 01C3 MOVE R27 R20 + 0x54720007, // 01C4 LDINT R28 8 + 0x7C5C0A00, // 01C5 CALL R23 5 + 0x88600312, // 01C6 GETMBR R24 R1 K18 + 0x78620001, // 01C7 JMPF R24 #01CA + 0x88600312, // 01C8 GETMBR R24 R1 K18 + 0x70020001, // 01C9 JMP #01CC + 0x88600116, // 01CA GETMBR R24 R0 K22 + 0x8860314E, // 01CB GETMBR R24 R24 K78 + 0x8C641D4F, // 01CC GETMET R25 R14 K79 + 0x5C6C2200, // 01CD MOVE R27 R17 + 0x5C702400, // 01CE MOVE R28 R18 + 0x5C742E00, // 01CF MOVE R29 R23 + 0x5C783000, // 01D0 MOVE R30 R24 + 0x7C640A00, // 01D1 CALL R25 5 + 0x8C641D50, // 01D2 GETMET R25 R14 K80 + 0x7C640200, // 01D3 CALL R25 1 + 0x88640116, // 01D4 GETMBR R25 R0 K22 + 0x8C643351, // 01D5 GETMET R25 R25 K81 + 0x5C6C1C00, // 01D6 MOVE R27 R14 + 0x7C640400, // 01D7 CALL R25 2 + 0x8C640352, // 01D8 GETMET R25 R1 K82 + 0x7C640200, // 01D9 CALL R25 1 + 0x78660002, // 01DA JMPF R25 #01DE + 0x8C640353, // 01DB GETMET R25 R1 K83 + 0x546E003B, // 01DC LDINT R27 60 + 0x7C640400, // 01DD CALL R25 2 + 0x8C641D54, // 01DE GETMET R25 R14 K84 + 0x7C640200, // 01DF CALL R25 1 + 0x8C640D0A, // 01E0 GETMET R25 R6 K10 + 0x7C640200, // 01E1 CALL R25 1 + 0x8C68330B, // 01E2 GETMET R26 R25 K11 + 0x58700006, // 01E3 LDCONST R28 K6 + 0x88740D0C, // 01E4 GETMBR R29 R6 K12 + 0xB87A0400, // 01E5 GETNGBL R30 K2 + 0x88783D33, // 01E6 GETMBR R30 R30 K51 + 0x7C680800, // 01E7 CALL R26 4 + 0x8C68330B, // 01E8 GETMET R26 R25 K11 + 0x58700008, // 01E9 LDCONST R28 K8 + 0x88740D0C, // 01EA GETMBR R29 R6 K12 + 0x58780008, // 01EB LDCONST R30 K8 + 0x7C680800, // 01EC CALL R26 4 + 0x546A0007, // 01ED LDINT R26 8 + 0x900E0A1A, // 01EE SETMBR R3 K5 R26 + 0x80043200, // 01EF RET 1 R25 + 0x70020063, // 01F0 JMP #0255 + 0x54260008, // 01F1 LDINT R9 9 + 0x1C241009, // 01F2 EQ R9 R8 R9 + 0x7826001E, // 01F3 JMPF R9 #0213 + 0x8C240507, // 01F4 GETMET R9 R2 K7 + 0x582C0006, // 01F5 LDCONST R11 K6 + 0x7C240400, // 01F6 CALL R9 2 + 0x8C280355, // 01F7 GETMET R10 R1 K85 + 0x5C301200, // 01F8 MOVE R12 R9 + 0x7C280400, // 01F9 CALL R10 2 + 0xB82A4400, // 01FA GETNGBL R10 K34 + 0x8C281527, // 01FB GETMET R10 R10 K39 + 0x8C300B2D, // 01FC GETMET R12 R5 K45 + 0x58380056, // 01FD LDCONST R14 K86 + 0x883C0312, // 01FE GETMBR R15 R1 K18 + 0x8C3C1F57, // 01FF GETMET R15 R15 K87 + 0x7C3C0200, // 0200 CALL R15 1 + 0x8C3C1F4B, // 0201 GETMET R15 R15 K75 + 0x7C3C0200, // 0202 CALL R15 1 + 0x8C3C1F4C, // 0203 GETMET R15 R15 K76 + 0x7C3C0200, // 0204 CALL R15 1 + 0x8C3C1F29, // 0205 GETMET R15 R15 K41 + 0x7C3C0200, // 0206 CALL R15 1 + 0x60400008, // 0207 GETGBL R16 G8 + 0x5C441200, // 0208 MOVE R17 R9 + 0x7C400200, // 0209 CALL R16 1 + 0x7C300800, // 020A CALL R12 4 + 0x5834000F, // 020B LDCONST R13 K15 + 0x7C280600, // 020C CALL R10 3 + 0xB82A0400, // 020D GETNGBL R10 K2 + 0x88281533, // 020E GETMBR R10 R10 K51 + 0x900E340A, // 020F SETMBR R3 K26 R10 + 0x4C280000, // 0210 LDNIL R10 + 0x80041400, // 0211 RET 1 R10 + 0x70020041, // 0212 JMP #0255 + 0x54260009, // 0213 LDINT R9 10 + 0x1C241009, // 0214 EQ R9 R8 R9 + 0x7826003E, // 0215 JMPF R9 #0255 + 0x8C240507, // 0216 GETMET R9 R2 K7 + 0x582C0006, // 0217 LDCONST R11 K6 + 0x7C240400, // 0218 CALL R9 2 + 0x60280008, // 0219 GETGBL R10 G8 + 0x5C2C1200, // 021A MOVE R11 R9 + 0x7C280200, // 021B CALL R10 1 + 0x002AB00A, // 021C ADD R10 K88 R10 + 0x900E4E0A, // 021D SETMBR R3 K39 R10 + 0x60280010, // 021E GETGBL R10 G16 + 0x882C0116, // 021F GETMBR R11 R0 K22 + 0x882C1737, // 0220 GETMBR R11 R11 K55 + 0x8C2C1759, // 0221 GETMET R11 R11 K89 + 0x7C2C0200, // 0222 CALL R11 1 + 0x7C280200, // 0223 CALL R10 1 + 0xA802001D, // 0224 EXBLK 0 #0243 + 0x5C2C1400, // 0225 MOVE R11 R10 + 0x7C2C0000, // 0226 CALL R11 0 + 0x8C30175A, // 0227 GETMET R12 R11 K90 + 0x7C300200, // 0228 CALL R12 1 + 0x1C301809, // 0229 EQ R12 R12 R9 + 0x78320015, // 022A JMPF R12 #0241 + 0xB8324400, // 022B GETNGBL R12 K34 + 0x8C301927, // 022C GETMET R12 R12 K39 + 0x8C381757, // 022D GETMET R14 R11 K87 + 0x7C380200, // 022E CALL R14 1 + 0x8C381D4B, // 022F GETMET R14 R14 K75 + 0x7C380200, // 0230 CALL R14 1 + 0x8C381D4C, // 0231 GETMET R14 R14 K76 + 0x7C380200, // 0232 CALL R14 1 + 0x8C381D29, // 0233 GETMET R14 R14 K41 + 0x7C380200, // 0234 CALL R14 1 + 0x003AB60E, // 0235 ADD R14 K91 R14 + 0x583C000F, // 0236 LDCONST R15 K15 + 0x7C300600, // 0237 CALL R12 3 + 0xB8324400, // 0238 GETNGBL R12 K34 + 0x8C30195C, // 0239 GETMET R12 R12 K92 + 0x543A07CF, // 023A LDINT R14 2000 + 0x843C0000, // 023B CLOSURE R15 P0 + 0x7C300600, // 023C CALL R12 3 + 0x50300200, // 023D LDBOOL R12 1 0 + 0xA0000000, // 023E CLOSE R0 + 0xA8040001, // 023F EXBLK 1 1 + 0x80041800, // 0240 RET 1 R12 + 0xA0280000, // 0241 CLOSE R10 + 0x7001FFE1, // 0242 JMP #0225 + 0x5828005D, // 0243 LDCONST R10 K93 + 0xAC280200, // 0244 CATCH R10 1 0 + 0xB0080000, // 0245 RAISE 2 R0 R0 + 0xB82A4400, // 0246 GETNGBL R10 K34 + 0x8C281527, // 0247 GETMET R10 R10 K39 + 0x60300008, // 0248 GETGBL R12 G8 + 0x5C341200, // 0249 MOVE R13 R9 + 0x7C300200, // 024A CALL R12 1 + 0x0032BC0C, // 024B ADD R12 K94 R12 + 0x0030195F, // 024C ADD R12 R12 K95 + 0x5834000F, // 024D LDCONST R13 K15 + 0x7C280600, // 024E CALL R10 3 + 0xB82A0400, // 024F GETNGBL R10 K2 + 0x88281560, // 0250 GETMBR R10 R10 K96 + 0x900E340A, // 0251 SETMBR R3 K26 R10 + 0x4C280000, // 0252 LDNIL R10 + 0xA0000000, // 0253 CLOSE R0 + 0x80041400, // 0254 RET 1 R10 + 0x7002009A, // 0255 JMP #02F1 + 0x5426003B, // 0256 LDINT R9 60 + 0x1C240E09, // 0257 EQ R9 R7 R9 + 0x78260084, // 0258 JMPF R9 #02DE + 0x1C241106, // 0259 EQ R9 R8 K6 + 0x78260064, // 025A JMPF R9 #02C0 + 0x8C240507, // 025B GETMET R9 R2 K7 + 0x582C0006, // 025C LDCONST R11 K6 + 0x7C240400, // 025D CALL R9 2 + 0x8C280507, // 025E GETMET R10 R2 K7 + 0x58300008, // 025F LDCONST R12 K8 + 0x7C280400, // 0260 CALL R10 2 + 0x8C2C0507, // 0261 GETMET R11 R2 K7 + 0x5834000F, // 0262 LDCONST R13 K15 + 0x7C2C0400, // 0263 CALL R11 2 + 0x8C300507, // 0264 GETMET R12 R2 K7 + 0x58380011, // 0265 LDCONST R14 K17 + 0x7C300400, // 0266 CALL R12 2 + 0x8C340507, // 0267 GETMET R13 R2 K7 + 0x543E0003, // 0268 LDINT R15 4 + 0x7C340400, // 0269 CALL R13 2 + 0xB83A4400, // 026A GETNGBL R14 K34 + 0x8C381D27, // 026B GETMET R14 R14 K39 + 0x8C400B2D, // 026C GETMET R16 R5 K45 + 0x58480061, // 026D LDCONST R18 K97 + 0x5C4C1200, // 026E MOVE R19 R9 + 0x8C501529, // 026F GETMET R20 R10 K41 + 0x7C500200, // 0270 CALL R20 1 + 0x5C541600, // 0271 MOVE R21 R11 + 0x5C581800, // 0272 MOVE R22 R12 + 0x8C5C1B29, // 0273 GETMET R23 R13 K41 + 0x7C5C0200, // 0274 CALL R23 1 + 0x7C400E00, // 0275 CALL R16 7 + 0x5844000F, // 0276 LDCONST R17 K15 + 0x7C380600, // 0277 CALL R14 3 + 0x4C380000, // 0278 LDNIL R14 + 0x1C38120E, // 0279 EQ R14 R9 R14 + 0x743A000B, // 027A JMPT R14 #0287 + 0x4C380000, // 027B LDNIL R14 + 0x1C38140E, // 027C EQ R14 R10 R14 + 0x743A0008, // 027D JMPT R14 #0287 + 0x4C380000, // 027E LDNIL R14 + 0x1C38160E, // 027F EQ R14 R11 R14 + 0x743A0005, // 0280 JMPT R14 #0287 + 0x4C380000, // 0281 LDNIL R14 + 0x1C38180E, // 0282 EQ R14 R12 R14 + 0x743A0002, // 0283 JMPT R14 #0287 + 0x4C380000, // 0284 LDNIL R14 + 0x1C381A0E, // 0285 EQ R14 R13 R14 + 0x783A0005, // 0286 JMPF R14 #028D + 0xB83A0400, // 0287 GETNGBL R14 K2 + 0x88381D62, // 0288 GETMBR R14 R14 K98 + 0x900E340E, // 0289 SETMBR R3 K26 R14 + 0x4C380000, // 028A LDNIL R14 + 0xA0000000, // 028B CLOSE R0 + 0x80041C00, // 028C RET 1 R14 + 0x6038000C, // 028D GETGBL R14 G12 + 0x5C3C1400, // 028E MOVE R15 R10 + 0x7C380200, // 028F CALL R14 1 + 0x543E001F, // 0290 LDINT R15 32 + 0x54420040, // 0291 LDINT R16 65 + 0x003C1E10, // 0292 ADD R15 R15 R16 + 0x20381C0F, // 0293 NE R14 R14 R15 + 0x743A000B, // 0294 JMPT R14 #02A1 + 0x6038000C, // 0295 GETGBL R14 G12 + 0x5C3C1A00, // 0296 MOVE R15 R13 + 0x7C380200, // 0297 CALL R14 1 + 0x543E000F, // 0298 LDINT R15 16 + 0x14381C0F, // 0299 LT R14 R14 R15 + 0x743A0005, // 029A JMPT R14 #02A1 + 0x6038000C, // 029B GETGBL R14 G12 + 0x5C3C1A00, // 029C MOVE R15 R13 + 0x7C380200, // 029D CALL R14 1 + 0x543E001F, // 029E LDINT R15 32 + 0x24381C0F, // 029F GT R14 R14 R15 + 0x783A0009, // 02A0 JMPF R14 #02AB + 0xB83A4400, // 02A1 GETNGBL R14 K34 + 0x8C381D27, // 02A2 GETMET R14 R14 K39 + 0x58400063, // 02A3 LDCONST R16 K99 + 0x7C380400, // 02A4 CALL R14 2 + 0xB83A0400, // 02A5 GETNGBL R14 K2 + 0x88381D64, // 02A6 GETMBR R14 R14 K100 + 0x900E340E, // 02A7 SETMBR R3 K26 R14 + 0x4C380000, // 02A8 LDNIL R14 + 0xA0000000, // 02A9 CLOSE R0 + 0x80041C00, // 02AA RET 1 R14 + 0x543A001E, // 02AB LDINT R14 31 + 0x403A0C0E, // 02AC CONNECT R14 K6 R14 + 0x9438140E, // 02AD GETIDX R14 R10 R14 + 0x543E001F, // 02AE LDINT R15 32 + 0x403C1F47, // 02AF CONNECT R15 R15 K71 + 0x943C140F, // 02B0 GETIDX R15 R10 R15 + 0x88400116, // 02B1 GETMBR R16 R0 K22 + 0x8C402165, // 02B2 GETMET R16 R16 K101 + 0x5C481200, // 02B3 MOVE R18 R9 + 0x5C4C1800, // 02B4 MOVE R19 R12 + 0x5C501600, // 02B5 MOVE R20 R11 + 0x5C541A00, // 02B6 MOVE R21 R13 + 0x5C581C00, // 02B7 MOVE R22 R14 + 0x5C5C1E00, // 02B8 MOVE R23 R15 + 0x8C600366, // 02B9 GETMET R24 R1 K102 + 0x7C600200, // 02BA CALL R24 1 + 0x7C401000, // 02BB CALL R16 8 + 0x50400200, // 02BC LDBOOL R16 1 0 + 0xA0000000, // 02BD CLOSE R0 + 0x80042000, // 02BE RET 1 R16 + 0x7002001C, // 02BF JMP #02DD + 0x1C241108, // 02C0 EQ R9 R8 K8 + 0x78260012, // 02C1 JMPF R9 #02D5 + 0x8C240507, // 02C2 GETMET R9 R2 K7 + 0x582C0006, // 02C3 LDCONST R11 K6 + 0x7C240400, // 02C4 CALL R9 2 + 0xB82A4400, // 02C5 GETNGBL R10 K34 + 0x8C281527, // 02C6 GETMET R10 R10 K39 + 0x60300008, // 02C7 GETGBL R12 G8 + 0x5C341200, // 02C8 MOVE R13 R9 + 0x7C300200, // 02C9 CALL R12 1 + 0x0032CE0C, // 02CA ADD R12 K103 R12 + 0x5834000F, // 02CB LDCONST R13 K15 + 0x7C280600, // 02CC CALL R10 3 + 0x88280116, // 02CD GETMBR R10 R0 K22 + 0x8C281568, // 02CE GETMET R10 R10 K104 + 0x5C301200, // 02CF MOVE R12 R9 + 0x7C280400, // 02D0 CALL R10 2 + 0x50280200, // 02D1 LDBOOL R10 1 0 + 0xA0000000, // 02D2 CLOSE R0 + 0x80041400, // 02D3 RET 1 R10 + 0x70020007, // 02D4 JMP #02DD + 0x1C24110F, // 02D5 EQ R9 R8 K15 + 0x78260005, // 02D6 JMPF R9 #02DD + 0x88240116, // 02D7 GETMBR R9 R0 K22 + 0x8C241369, // 02D8 GETMET R9 R9 K105 + 0x7C240200, // 02D9 CALL R9 1 + 0x50240200, // 02DA LDBOOL R9 1 0 + 0xA0000000, // 02DB CLOSE R0 + 0x80041200, // 02DC RET 1 R9 + 0x70020012, // 02DD JMP #02F1 + 0x54260029, // 02DE LDINT R9 42 + 0x1C240E09, // 02DF EQ R9 R7 R9 + 0x78260005, // 02E0 JMPF R9 #02E7 + 0x1C241106, // 02E1 EQ R9 R8 K6 + 0x78260002, // 02E2 JMPF R9 #02E6 + 0x50240200, // 02E3 LDBOOL R9 1 0 + 0xA0000000, // 02E4 CLOSE R0 + 0x80041200, // 02E5 RET 1 R9 + 0x70020009, // 02E6 JMP #02F1 + 0x60240003, // 02E7 GETGBL R9 G3 + 0x5C280000, // 02E8 MOVE R10 R0 + 0x7C240200, // 02E9 CALL R9 1 + 0x8C24136A, // 02EA GETMET R9 R9 K106 + 0x5C2C0200, // 02EB MOVE R11 R1 + 0x5C300400, // 02EC MOVE R12 R2 + 0x5C340600, // 02ED MOVE R13 R3 + 0x7C240800, // 02EE CALL R9 4 + 0xA0000000, // 02EF CLOSE R0 + 0x80041200, // 02F0 RET 1 R9 + 0xA0000000, // 02F1 CLOSE R0 + 0x80000000, // 02F2 RET 0 }) ) ); @@ -1179,913 +1920,138 @@ be_local_closure(Matter_Plugin_Root_read_attribute, /* name */ /******************************************************************** -** Solidified function: invoke_request +** Solidified function: write_attribute ********************************************************************/ -be_local_closure(Matter_Plugin_Root_invoke_request, /* name */ +be_local_closure(Matter_Plugin_Root_write_attribute, /* name */ be_nested_proto( - 31, /* nstack */ + 12, /* nstack */ 4, /* argc */ 2, /* varg */ 0, /* has upvals */ NULL, /* no upvals */ - 1, /* has sup protos */ - ( &(const struct bproto*[ 1]) { - be_nested_proto( - 3, /* nstack */ - 0, /* argc */ - 0, /* varg */ - 1, /* has upvals */ - ( &(const bupvaldesc[ 2]) { /* upvals */ - be_local_const_upval(1, 0), - be_local_const_upval(1, 11), - }), - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 2]) { /* constants */ - /* K0 */ be_nested_str_weak(device), - /* K1 */ be_nested_str_weak(remove_fabric), - }), - be_str_weak(_anonymous_), - &be_const_str_solidified, - ( &(const binstruction[ 6]) { /* code */ - 0x68000000, // 0000 GETUPV R0 U0 - 0x88000100, // 0001 GETMBR R0 R0 K0 - 0x8C000101, // 0002 GETMET R0 R0 K1 - 0x68080001, // 0003 GETUPV R2 U1 - 0x7C000400, // 0004 CALL R0 2 - 0x80000000, // 0005 RET 0 - }) - ), - }), + 0, /* has sup protos */ + NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[107]) { /* constants */ - /* K0 */ be_nested_str_weak(crypto), - /* K1 */ be_nested_str_weak(string), - /* K2 */ be_nested_str_weak(matter), - /* K3 */ be_nested_str_weak(TLV), - /* K4 */ be_nested_str_weak(cluster), - /* K5 */ be_nested_str_weak(command), - /* K6 */ be_const_int(0), - /* K7 */ be_nested_str_weak(findsubval), - /* K8 */ be_const_int(1), - /* K9 */ be_nested_str_weak(_breadcrumb), - /* K10 */ be_nested_str_weak(Matter_TLV_struct), - /* K11 */ be_nested_str_weak(add_TLV), - /* K12 */ be_nested_str_weak(U1), - /* K13 */ be_nested_str_weak(UTF1), - /* K14 */ be_nested_str_weak(), - /* K15 */ be_const_int(2), - /* K16 */ be_nested_str_weak(XX), - /* K17 */ be_const_int(3), - /* K18 */ be_nested_str_weak(_fabric), - /* K19 */ be_nested_str_weak(fabric_completed), - /* K20 */ be_nested_str_weak(set_no_expiration), - /* K21 */ be_nested_str_weak(save), - /* K22 */ be_nested_str_weak(device), - /* K23 */ be_nested_str_weak(start_commissioning_complete_deferred), - /* K24 */ be_nested_str_weak(context_error), - /* K25 */ be_nested_str_weak(CommissioningComplete_X3A_X20no_X20fabric_X20attached), - /* K26 */ be_nested_str_weak(status), - /* K27 */ be_nested_str_weak(UNSUPPORTED_COMMAND), - /* K28 */ be_nested_str_weak(B2), - /* K29 */ be_nested_str_weak(DAC_Cert_FFF1_8000), - /* K30 */ be_nested_str_weak(PAI_Cert_FFF1), - /* K31 */ be_nested_str_weak(CD_FFF1_8000), - /* K32 */ be_nested_str_weak(B1), - /* K33 */ be_nested_str_weak(U4), - /* K34 */ be_nested_str_weak(tasmota), - /* K35 */ be_nested_str_weak(rtc), - /* K36 */ be_nested_str_weak(utc), - /* K37 */ be_nested_str_weak(tlv2raw), - /* K38 */ be_nested_str_weak(get_ac), - /* K39 */ be_nested_str_weak(log), - /* K40 */ be_nested_str_weak(MTR_X3A_X20attestation_tbs_X3D), - /* K41 */ be_nested_str_weak(tohex), - /* K42 */ be_nested_str_weak(EC_P256), - /* K43 */ be_nested_str_weak(ecdsa_sign_sha256), - /* K44 */ be_nested_str_weak(DAC_Priv_FFF1_8000), - /* K45 */ be_nested_str_weak(format), - /* K46 */ be_nested_str_weak(MTR_X3A_X20CSRRequest_X20CSRNonce_X3D_X25s_X20IsForUpdateNOC_X3D_X25s), - /* K47 */ be_nested_str_weak(gen_CSR), - /* K48 */ be_nested_str_weak(MTR_X3A_X20nocsr_tbs_X3D), - /* K49 */ be_nested_str_weak(set_temp_ca), - /* K50 */ be_nested_str_weak(MTR_X3A_X20received_X20ca_root_X3D), - /* K51 */ be_nested_str_weak(SUCCESS), - /* K52 */ be_nested_str_weak(MTR_X3A_X20AddNoc_X20Args_X3D), - /* K53 */ be_nested_str_weak(get_temp_ca), - /* K54 */ be_nested_str_weak(MTR_X3A_X20Error_X3A_X20AdNOC_X20without_X20CA), - /* K55 */ be_nested_str_weak(sessions), - /* K56 */ be_nested_str_weak(create_fabric), - /* K57 */ be_nested_str_weak(set_ca), - /* K58 */ be_nested_str_weak(set_noc_icac), - /* K59 */ be_nested_str_weak(set_ipk_epoch_key), - /* K60 */ be_nested_str_weak(set_admin_subject_vendor), - /* K61 */ be_nested_str_weak(set_pk), - /* K62 */ be_nested_str_weak(get_pk), - /* K63 */ be_nested_str_weak(parse), - /* K64 */ be_nested_str_weak(findsub), - /* K65 */ be_nested_str_weak(MTR_X3A_X20Error_X3A_X20no_X20fabricid_X20nor_X20deviceid_X20in_X20NOC_X20certificate), - /* K66 */ be_nested_str_weak(int), - /* K67 */ be_nested_str_weak(int64), - /* K68 */ be_nested_str_weak(fromu32), - /* K69 */ be_nested_str_weak(tobytes), - /* K70 */ be_nested_str_weak(get_temp_ca_pub), - /* K71 */ be_const_int(2147483647), - /* K72 */ be_nested_str_weak(fromstring), - /* K73 */ be_nested_str_weak(CompressedFabric), - /* K74 */ be_nested_str_weak(HKDF_SHA256), - /* K75 */ be_nested_str_weak(copy), - /* K76 */ be_nested_str_weak(reverse), - /* K77 */ be_nested_str_weak(derive), - /* K78 */ be_nested_str_weak(commissioning_admin_fabric), - /* K79 */ be_nested_str_weak(set_fabric_device), - /* K80 */ be_nested_str_weak(fabric_candidate), - /* K81 */ be_nested_str_weak(start_operational_discovery_deferred), - /* K82 */ be_nested_str_weak(is_PASE), - /* K83 */ be_nested_str_weak(set_expire_in_seconds), - /* K84 */ be_nested_str_weak(log_new_fabric), - /* K85 */ be_nested_str_weak(set_fabric_label), - /* K86 */ be_nested_str_weak(MTR_X3A_X20_X2E_X20_X20_X20_X20_X20_X20_X20_X20_X20_X20Update_X20fabric_X20_X27_X25s_X27_X20label_X3D_X27_X25s_X27), - /* K87 */ be_nested_str_weak(get_fabric_id), - /* K88 */ be_nested_str_weak(fabric_index_X3A), - /* K89 */ be_nested_str_weak(active_fabrics), - /* K90 */ be_nested_str_weak(get_fabric_index), - /* K91 */ be_nested_str_weak(MTR_X3A_X20removing_X20fabric_X20), - /* K92 */ be_nested_str_weak(set_timer), - /* K93 */ be_nested_str_weak(stop_iteration), - /* K94 */ be_nested_str_weak(MTR_X3A_X20RemoveFabric_X20fabric_X28), - /* K95 */ be_nested_str_weak(_X29_X20not_X20found), - /* K96 */ be_nested_str_weak(INVALID_ACTION), - /* K97 */ be_nested_str_weak(MTR_X3A_X20OpenCommissioningWindow_X28timeout_X3D_X25i_X2C_X20passcode_X3D_X25s_X2C_X20discriminator_X3D_X25i_X2C_X20iterations_X3D_X25i_X2C_X20salt_X3D_X25s_X29), - /* K98 */ be_nested_str_weak(INVALID_DATA_TYPE), - /* K99 */ be_nested_str_weak(MTR_X3A_X20wrong_X20size_X20for_X20PAKE_X20parameters), - /* K100 */ be_nested_str_weak(CONSTRAINT_ERROR), - /* K101 */ be_nested_str_weak(start_basic_commissioning), - /* K102 */ be_nested_str_weak(get_fabric), - /* K103 */ be_nested_str_weak(MTR_X3A_X20OpenBasicCommissioningWindow_X20commissioning_timeout_X3D), - /* K104 */ be_nested_str_weak(start_root_basic_commissioning), - /* K105 */ be_nested_str_weak(stop_basic_commissioning), - /* K106 */ be_nested_str_weak(invoke_request), + ( &(const bvalue[14]) { /* constants */ + /* K0 */ be_nested_str_weak(string), + /* K1 */ be_nested_str_weak(matter), + /* K2 */ be_nested_str_weak(TLV), + /* K3 */ be_nested_str_weak(cluster), + /* K4 */ be_nested_str_weak(attribute), + /* K5 */ be_const_int(0), + /* K6 */ be_nested_str_weak(int), + /* K7 */ be_nested_str_weak(int64), + /* K8 */ be_nested_str_weak(_breadcrumb), + /* K9 */ be_nested_str_weak(attribute_updated), + /* K10 */ be_nested_str_weak(status), + /* K11 */ be_nested_str_weak(CONSTRAINT_ERROR), + /* K12 */ be_const_int(1), + /* K13 */ be_nested_str_weak(INVALID_ACTION), }), - be_str_weak(invoke_request), + be_str_weak(write_attribute), &be_const_str_solidified, - ( &(const binstruction[755]) { /* code */ + ( &(const binstruction[101]) { /* code */ 0xA4120000, // 0000 IMPORT R4 K0 - 0xA4160200, // 0001 IMPORT R5 K1 - 0xB81A0400, // 0002 GETNGBL R6 K2 - 0x88180D03, // 0003 GETMBR R6 R6 K3 - 0x881C0704, // 0004 GETMBR R7 R3 K4 - 0x88200705, // 0005 GETMBR R8 R3 K5 - 0x5426002F, // 0006 LDINT R9 48 - 0x1C240E09, // 0007 EQ R9 R7 R9 - 0x78260059, // 0008 JMPF R9 #0063 - 0x1C241106, // 0009 EQ R9 R8 K6 - 0x78260017, // 000A JMPF R9 #0023 - 0x8C240507, // 000B GETMET R9 R2 K7 - 0x582C0006, // 000C LDCONST R11 K6 - 0x54320383, // 000D LDINT R12 900 - 0x7C240600, // 000E CALL R9 3 - 0x8C280507, // 000F GETMET R10 R2 K7 - 0x58300008, // 0010 LDCONST R12 K8 - 0x58340006, // 0011 LDCONST R13 K6 - 0x7C280600, // 0012 CALL R10 3 - 0x9006120A, // 0013 SETMBR R1 K9 R10 - 0x8C2C0D0A, // 0014 GETMET R11 R6 K10 - 0x7C2C0200, // 0015 CALL R11 1 - 0x8C30170B, // 0016 GETMET R12 R11 K11 - 0x58380006, // 0017 LDCONST R14 K6 - 0x883C0D0C, // 0018 GETMBR R15 R6 K12 - 0x58400006, // 0019 LDCONST R16 K6 - 0x7C300800, // 001A CALL R12 4 - 0x8C30170B, // 001B GETMET R12 R11 K11 - 0x58380008, // 001C LDCONST R14 K8 - 0x883C0D0D, // 001D GETMBR R15 R6 K13 - 0x5840000E, // 001E LDCONST R16 K14 - 0x7C300800, // 001F CALL R12 4 - 0x900E0B08, // 0020 SETMBR R3 K5 K8 - 0x80041600, // 0021 RET 1 R11 - 0x7002003E, // 0022 JMP #0062 - 0x1C24110F, // 0023 EQ R9 R8 K15 - 0x7826001A, // 0024 JMPF R9 #0040 - 0x8C240507, // 0025 GETMET R9 R2 K7 - 0x582C0006, // 0026 LDCONST R11 K6 - 0x7C240400, // 0027 CALL R9 2 - 0x8C280507, // 0028 GETMET R10 R2 K7 - 0x58300008, // 0029 LDCONST R12 K8 - 0x58340010, // 002A LDCONST R13 K16 - 0x7C280600, // 002B CALL R10 3 - 0x8C2C0507, // 002C GETMET R11 R2 K7 - 0x5834000F, // 002D LDCONST R13 K15 - 0x58380006, // 002E LDCONST R14 K6 - 0x7C2C0600, // 002F CALL R11 3 - 0x9006120B, // 0030 SETMBR R1 K9 R11 - 0x8C300D0A, // 0031 GETMET R12 R6 K10 - 0x7C300200, // 0032 CALL R12 1 - 0x8C34190B, // 0033 GETMET R13 R12 K11 - 0x583C0006, // 0034 LDCONST R15 K6 - 0x88400D0C, // 0035 GETMBR R16 R6 K12 - 0x58440006, // 0036 LDCONST R17 K6 - 0x7C340800, // 0037 CALL R13 4 - 0x8C34190B, // 0038 GETMET R13 R12 K11 - 0x583C0008, // 0039 LDCONST R15 K8 - 0x88400D0D, // 003A GETMBR R16 R6 K13 - 0x5844000E, // 003B LDCONST R17 K14 - 0x7C340800, // 003C CALL R13 4 - 0x900E0B11, // 003D SETMBR R3 K5 K17 - 0x80041800, // 003E RET 1 R12 - 0x70020021, // 003F JMP #0062 - 0x54260003, // 0040 LDINT R9 4 - 0x1C241009, // 0041 EQ R9 R8 R9 - 0x7826001E, // 0042 JMPF R9 #0062 - 0x88240312, // 0043 GETMBR R9 R1 K18 - 0x7826001B, // 0044 JMPF R9 #0061 - 0x90061306, // 0045 SETMBR R1 K9 K6 - 0x88240312, // 0046 GETMBR R9 R1 K18 - 0x8C241313, // 0047 GETMET R9 R9 K19 - 0x7C240200, // 0048 CALL R9 1 - 0x8C240314, // 0049 GETMET R9 R1 K20 - 0x7C240200, // 004A CALL R9 1 - 0x8C240315, // 004B GETMET R9 R1 K21 - 0x7C240200, // 004C CALL R9 1 - 0x8C240D0A, // 004D GETMET R9 R6 K10 - 0x7C240200, // 004E CALL R9 1 - 0x8C28130B, // 004F GETMET R10 R9 K11 - 0x58300006, // 0050 LDCONST R12 K6 - 0x88340D0C, // 0051 GETMBR R13 R6 K12 - 0x58380006, // 0052 LDCONST R14 K6 - 0x7C280800, // 0053 CALL R10 4 - 0x8C28130B, // 0054 GETMET R10 R9 K11 - 0x58300008, // 0055 LDCONST R12 K8 - 0x88340D0D, // 0056 GETMBR R13 R6 K13 - 0x5838000E, // 0057 LDCONST R14 K14 - 0x7C280800, // 0058 CALL R10 4 - 0x542A0004, // 0059 LDINT R10 5 - 0x900E0A0A, // 005A SETMBR R3 K5 R10 - 0x88280116, // 005B GETMBR R10 R0 K22 - 0x8C281517, // 005C GETMET R10 R10 K23 - 0x5C300200, // 005D MOVE R12 R1 - 0x7C280400, // 005E CALL R10 2 - 0x80041200, // 005F RET 1 R9 - 0x70020000, // 0060 JMP #0062 - 0xB0063119, // 0061 RAISE 1 K24 K25 - 0x7002028D, // 0062 JMP #02F1 - 0x5426003D, // 0063 LDINT R9 62 - 0x1C240E09, // 0064 EQ R9 R7 R9 - 0x782601EF, // 0065 JMPF R9 #0256 - 0x1C24110F, // 0066 EQ R9 R8 K15 - 0x7826001D, // 0067 JMPF R9 #0086 - 0x8C240507, // 0068 GETMET R9 R2 K7 - 0x582C0006, // 0069 LDCONST R11 K6 - 0x7C240400, // 006A CALL R9 2 - 0x20281308, // 006B NE R10 R9 K8 - 0x782A0006, // 006C JMPF R10 #0074 - 0x2028130F, // 006D NE R10 R9 K15 - 0x782A0004, // 006E JMPF R10 #0074 - 0xB82A0400, // 006F GETNGBL R10 K2 - 0x8828151B, // 0070 GETMBR R10 R10 K27 - 0x900E340A, // 0071 SETMBR R3 K26 R10 - 0x4C280000, // 0072 LDNIL R10 - 0x80041400, // 0073 RET 1 R10 - 0x8C280D0A, // 0074 GETMET R10 R6 K10 - 0x7C280200, // 0075 CALL R10 1 - 0x8C2C150B, // 0076 GETMET R11 R10 K11 - 0x58340006, // 0077 LDCONST R13 K6 - 0x88380D1C, // 0078 GETMBR R14 R6 K28 - 0x1C3C1308, // 0079 EQ R15 R9 K8 - 0x783E0003, // 007A JMPF R15 #007F - 0xB83E0400, // 007B GETNGBL R15 K2 - 0x8C3C1F1D, // 007C GETMET R15 R15 K29 - 0x7C3C0200, // 007D CALL R15 1 - 0x70020002, // 007E JMP #0082 - 0xB83E0400, // 007F GETNGBL R15 K2 - 0x8C3C1F1E, // 0080 GETMET R15 R15 K30 - 0x7C3C0200, // 0081 CALL R15 1 - 0x7C2C0800, // 0082 CALL R11 4 - 0x900E0B11, // 0083 SETMBR R3 K5 K17 - 0x80041400, // 0084 RET 1 R10 - 0x700201CE, // 0085 JMP #0255 - 0x1C241106, // 0086 EQ R9 R8 K6 - 0x78260044, // 0087 JMPF R9 #00CD - 0x8C240507, // 0088 GETMET R9 R2 K7 - 0x582C0006, // 0089 LDCONST R11 K6 - 0x7C240400, // 008A CALL R9 2 - 0x6028000C, // 008B GETGBL R10 G12 - 0x5C2C1200, // 008C MOVE R11 R9 - 0x7C280200, // 008D CALL R10 1 - 0x542E001F, // 008E LDINT R11 32 - 0x2028140B, // 008F NE R10 R10 R11 - 0x782A0001, // 0090 JMPF R10 #0093 - 0x4C280000, // 0091 LDNIL R10 - 0x80041400, // 0092 RET 1 R10 - 0x900E0B08, // 0093 SETMBR R3 K5 K8 - 0x8C280D0A, // 0094 GETMET R10 R6 K10 - 0x7C280200, // 0095 CALL R10 1 - 0x8C2C150B, // 0096 GETMET R11 R10 K11 - 0x58340008, // 0097 LDCONST R13 K8 - 0x88380D1C, // 0098 GETMBR R14 R6 K28 - 0xB83E0400, // 0099 GETNGBL R15 K2 - 0x8C3C1F1F, // 009A GETMET R15 R15 K31 - 0x7C3C0200, // 009B CALL R15 1 - 0x7C2C0800, // 009C CALL R11 4 - 0x8C2C150B, // 009D GETMET R11 R10 K11 - 0x5834000F, // 009E LDCONST R13 K15 - 0x88380D20, // 009F GETMBR R14 R6 K32 - 0x5C3C1200, // 00A0 MOVE R15 R9 - 0x7C2C0800, // 00A1 CALL R11 4 - 0x8C2C150B, // 00A2 GETMET R11 R10 K11 - 0x58340011, // 00A3 LDCONST R13 K17 - 0x88380D21, // 00A4 GETMBR R14 R6 K33 - 0xB83E4400, // 00A5 GETNGBL R15 K34 - 0x8C3C1F23, // 00A6 GETMET R15 R15 K35 - 0x7C3C0200, // 00A7 CALL R15 1 - 0x943C1F24, // 00A8 GETIDX R15 R15 K36 - 0x7C2C0800, // 00A9 CALL R11 4 - 0x8C2C1525, // 00AA GETMET R11 R10 K37 - 0x7C2C0200, // 00AB CALL R11 1 - 0x8C300326, // 00AC GETMET R12 R1 K38 - 0x7C300200, // 00AD CALL R12 1 - 0x0034160C, // 00AE ADD R13 R11 R12 - 0xB83A4400, // 00AF GETNGBL R14 K34 - 0x8C381D27, // 00B0 GETMET R14 R14 K39 - 0x8C401B29, // 00B1 GETMET R16 R13 K41 - 0x7C400200, // 00B2 CALL R16 1 - 0x00425010, // 00B3 ADD R16 K40 R16 - 0x58440011, // 00B4 LDCONST R17 K17 - 0x7C380600, // 00B5 CALL R14 3 - 0x8C38092A, // 00B6 GETMET R14 R4 K42 - 0x7C380200, // 00B7 CALL R14 1 - 0x8C381D2B, // 00B8 GETMET R14 R14 K43 - 0xB8420400, // 00B9 GETNGBL R16 K2 - 0x8C40212C, // 00BA GETMET R16 R16 K44 - 0x7C400200, // 00BB CALL R16 1 - 0x5C441A00, // 00BC MOVE R17 R13 - 0x7C380600, // 00BD CALL R14 3 - 0x8C3C0D0A, // 00BE GETMET R15 R6 K10 - 0x7C3C0200, // 00BF CALL R15 1 - 0x8C401F0B, // 00C0 GETMET R16 R15 K11 - 0x58480006, // 00C1 LDCONST R18 K6 - 0x884C0D1C, // 00C2 GETMBR R19 R6 K28 - 0x5C501600, // 00C3 MOVE R20 R11 - 0x7C400800, // 00C4 CALL R16 4 - 0x8C401F0B, // 00C5 GETMET R16 R15 K11 - 0x58480008, // 00C6 LDCONST R18 K8 - 0x884C0D20, // 00C7 GETMBR R19 R6 K32 - 0x5C501C00, // 00C8 MOVE R20 R14 - 0x7C400800, // 00C9 CALL R16 4 - 0x900E0B08, // 00CA SETMBR R3 K5 K8 - 0x80041E00, // 00CB RET 1 R15 - 0x70020187, // 00CC JMP #0255 - 0x54260003, // 00CD LDINT R9 4 - 0x1C241009, // 00CE EQ R9 R8 R9 - 0x7826004D, // 00CF JMPF R9 #011E - 0x8C240507, // 00D0 GETMET R9 R2 K7 - 0x582C0006, // 00D1 LDCONST R11 K6 - 0x7C240400, // 00D2 CALL R9 2 - 0x6028000C, // 00D3 GETGBL R10 G12 - 0x5C2C1200, // 00D4 MOVE R11 R9 - 0x7C280200, // 00D5 CALL R10 1 - 0x542E001F, // 00D6 LDINT R11 32 - 0x2028140B, // 00D7 NE R10 R10 R11 - 0x782A0001, // 00D8 JMPF R10 #00DB - 0x4C280000, // 00D9 LDNIL R10 - 0x80041400, // 00DA RET 1 R10 - 0x8C280507, // 00DB GETMET R10 R2 K7 - 0x58300008, // 00DC LDCONST R12 K8 - 0x50340000, // 00DD LDBOOL R13 0 0 - 0x7C280600, // 00DE CALL R10 3 - 0xB82E4400, // 00DF GETNGBL R11 K34 - 0x8C2C1727, // 00E0 GETMET R11 R11 K39 - 0x8C340B2D, // 00E1 GETMET R13 R5 K45 - 0x583C002E, // 00E2 LDCONST R15 K46 - 0x60400008, // 00E3 GETGBL R16 G8 - 0x5C441200, // 00E4 MOVE R17 R9 - 0x7C400200, // 00E5 CALL R16 1 - 0x60440008, // 00E6 GETGBL R17 G8 - 0x5C481400, // 00E7 MOVE R18 R10 - 0x7C440200, // 00E8 CALL R17 1 - 0x7C340800, // 00E9 CALL R13 4 - 0x58380011, // 00EA LDCONST R14 K17 - 0x7C2C0600, // 00EB CALL R11 3 - 0x8C2C032F, // 00EC GETMET R11 R1 K47 - 0x7C2C0200, // 00ED CALL R11 1 - 0x8C300D0A, // 00EE GETMET R12 R6 K10 - 0x7C300200, // 00EF CALL R12 1 - 0x8C34190B, // 00F0 GETMET R13 R12 K11 - 0x583C0008, // 00F1 LDCONST R15 K8 - 0x88400D1C, // 00F2 GETMBR R16 R6 K28 - 0x5C441600, // 00F3 MOVE R17 R11 - 0x7C340800, // 00F4 CALL R13 4 - 0x8C34190B, // 00F5 GETMET R13 R12 K11 - 0x583C000F, // 00F6 LDCONST R15 K15 - 0x88400D20, // 00F7 GETMBR R16 R6 K32 - 0x5C441200, // 00F8 MOVE R17 R9 - 0x7C340800, // 00F9 CALL R13 4 - 0x8C341925, // 00FA GETMET R13 R12 K37 - 0x7C340200, // 00FB CALL R13 1 - 0x8C380326, // 00FC GETMET R14 R1 K38 - 0x7C380200, // 00FD CALL R14 1 - 0x00381A0E, // 00FE ADD R14 R13 R14 - 0xB83E4400, // 00FF GETNGBL R15 K34 - 0x8C3C1F27, // 0100 GETMET R15 R15 K39 - 0x8C441D29, // 0101 GETMET R17 R14 K41 - 0x7C440200, // 0102 CALL R17 1 - 0x00466011, // 0103 ADD R17 K48 R17 - 0x58480011, // 0104 LDCONST R18 K17 - 0x7C3C0600, // 0105 CALL R15 3 - 0x8C3C092A, // 0106 GETMET R15 R4 K42 - 0x7C3C0200, // 0107 CALL R15 1 - 0x8C3C1F2B, // 0108 GETMET R15 R15 K43 - 0xB8460400, // 0109 GETNGBL R17 K2 - 0x8C44232C, // 010A GETMET R17 R17 K44 - 0x7C440200, // 010B CALL R17 1 - 0x5C481C00, // 010C MOVE R18 R14 - 0x7C3C0600, // 010D CALL R15 3 - 0x8C400D0A, // 010E GETMET R16 R6 K10 - 0x7C400200, // 010F CALL R16 1 - 0x8C44210B, // 0110 GETMET R17 R16 K11 - 0x584C0006, // 0111 LDCONST R19 K6 - 0x88500D1C, // 0112 GETMBR R20 R6 K28 - 0x5C541A00, // 0113 MOVE R21 R13 - 0x7C440800, // 0114 CALL R17 4 - 0x8C44210B, // 0115 GETMET R17 R16 K11 - 0x584C0008, // 0116 LDCONST R19 K8 - 0x88500D20, // 0117 GETMBR R20 R6 K32 - 0x5C541E00, // 0118 MOVE R21 R15 - 0x7C440800, // 0119 CALL R17 4 - 0x54460004, // 011A LDINT R17 5 - 0x900E0A11, // 011B SETMBR R3 K5 R17 - 0x80042000, // 011C RET 1 R16 - 0x70020136, // 011D JMP #0255 - 0x5426000A, // 011E LDINT R9 11 - 0x1C241009, // 011F EQ R9 R8 R9 - 0x78260012, // 0120 JMPF R9 #0134 - 0x8C240507, // 0121 GETMET R9 R2 K7 - 0x582C0006, // 0122 LDCONST R11 K6 - 0x7C240400, // 0123 CALL R9 2 - 0x8C280331, // 0124 GETMET R10 R1 K49 - 0x5C301200, // 0125 MOVE R12 R9 - 0x7C280400, // 0126 CALL R10 2 - 0xB82A4400, // 0127 GETNGBL R10 K34 - 0x8C281527, // 0128 GETMET R10 R10 K39 - 0x8C301329, // 0129 GETMET R12 R9 K41 - 0x7C300200, // 012A CALL R12 1 - 0x0032640C, // 012B ADD R12 K50 R12 - 0x58340011, // 012C LDCONST R13 K17 - 0x7C280600, // 012D CALL R10 3 - 0xB82A0400, // 012E GETNGBL R10 K2 - 0x88281533, // 012F GETMBR R10 R10 K51 - 0x900E340A, // 0130 SETMBR R3 K26 R10 - 0x4C280000, // 0131 LDNIL R10 - 0x80041400, // 0132 RET 1 R10 - 0x70020120, // 0133 JMP #0255 - 0x54260005, // 0134 LDINT R9 6 - 0x1C241009, // 0135 EQ R9 R8 R9 - 0x782600B9, // 0136 JMPF R9 #01F1 - 0xB8264400, // 0137 GETNGBL R9 K34 - 0x8C241327, // 0138 GETMET R9 R9 K39 - 0x602C0008, // 0139 GETGBL R11 G8 - 0x5C300400, // 013A MOVE R12 R2 - 0x7C2C0200, // 013B CALL R11 1 - 0x002E680B, // 013C ADD R11 K52 R11 - 0x58300011, // 013D LDCONST R12 K17 - 0x7C240600, // 013E CALL R9 3 - 0x8C240507, // 013F GETMET R9 R2 K7 - 0x582C0006, // 0140 LDCONST R11 K6 - 0x7C240400, // 0141 CALL R9 2 - 0x8C280507, // 0142 GETMET R10 R2 K7 - 0x58300008, // 0143 LDCONST R12 K8 - 0x7C280400, // 0144 CALL R10 2 - 0x602C000C, // 0145 GETGBL R11 G12 - 0x5C301400, // 0146 MOVE R12 R10 - 0x7C2C0200, // 0147 CALL R11 1 - 0x1C2C1706, // 0148 EQ R11 R11 K6 - 0x782E0000, // 0149 JMPF R11 #014B - 0x4C280000, // 014A LDNIL R10 - 0x8C2C0507, // 014B GETMET R11 R2 K7 - 0x5834000F, // 014C LDCONST R13 K15 - 0x7C2C0400, // 014D CALL R11 2 - 0x8C300507, // 014E GETMET R12 R2 K7 - 0x58380011, // 014F LDCONST R14 K17 - 0x7C300400, // 0150 CALL R12 2 - 0x8C340507, // 0151 GETMET R13 R2 K7 - 0x543E0003, // 0152 LDINT R15 4 - 0x7C340400, // 0153 CALL R13 2 - 0x8C380335, // 0154 GETMET R14 R1 K53 - 0x7C380200, // 0155 CALL R14 1 - 0x4C3C0000, // 0156 LDNIL R15 - 0x1C381C0F, // 0157 EQ R14 R14 R15 - 0x783A0006, // 0158 JMPF R14 #0160 - 0xB83A4400, // 0159 GETNGBL R14 K34 - 0x8C381D27, // 015A GETMET R14 R14 K39 - 0x58400036, // 015B LDCONST R16 K54 - 0x5844000F, // 015C LDCONST R17 K15 - 0x7C380600, // 015D CALL R14 3 - 0x4C380000, // 015E LDNIL R14 - 0x80041C00, // 015F RET 1 R14 - 0x88380116, // 0160 GETMBR R14 R0 K22 - 0x88381D37, // 0161 GETMBR R14 R14 K55 - 0x8C381D38, // 0162 GETMET R14 R14 K56 - 0x7C380200, // 0163 CALL R14 1 - 0x8C3C1D39, // 0164 GETMET R15 R14 K57 - 0x8C440335, // 0165 GETMET R17 R1 K53 - 0x7C440200, // 0166 CALL R17 1 - 0x7C3C0400, // 0167 CALL R15 2 - 0x8C3C1D3A, // 0168 GETMET R15 R14 K58 - 0x5C441200, // 0169 MOVE R17 R9 - 0x5C481400, // 016A MOVE R18 R10 - 0x7C3C0600, // 016B CALL R15 3 - 0x8C3C1D3B, // 016C GETMET R15 R14 K59 - 0x5C441600, // 016D MOVE R17 R11 - 0x7C3C0400, // 016E CALL R15 2 - 0x8C3C1D3C, // 016F GETMET R15 R14 K60 - 0x5C441800, // 0170 MOVE R17 R12 - 0x5C481A00, // 0171 MOVE R18 R13 - 0x7C3C0600, // 0172 CALL R15 3 - 0x8C3C1D3D, // 0173 GETMET R15 R14 K61 - 0x8C44033E, // 0174 GETMET R17 R1 K62 - 0x7C440200, // 0175 CALL R17 1 - 0x7C3C0400, // 0176 CALL R15 2 - 0xB83E0400, // 0177 GETNGBL R15 K2 - 0x883C1F03, // 0178 GETMBR R15 R15 K3 - 0x8C3C1F3F, // 0179 GETMET R15 R15 K63 - 0x5C441200, // 017A MOVE R17 R9 - 0x7C3C0400, // 017B CALL R15 2 - 0x8C401F40, // 017C GETMET R16 R15 K64 - 0x544A0005, // 017D LDINT R18 6 - 0x7C400400, // 017E CALL R16 2 - 0x8C442107, // 017F GETMET R17 R16 K7 - 0x544E0014, // 0180 LDINT R19 21 - 0x7C440400, // 0181 CALL R17 2 - 0x8C482107, // 0182 GETMET R18 R16 K7 - 0x54520010, // 0183 LDINT R20 17 - 0x7C480400, // 0184 CALL R18 2 - 0x5C4C2200, // 0185 MOVE R19 R17 - 0x784E0001, // 0186 JMPF R19 #0189 - 0x5C4C2400, // 0187 MOVE R19 R18 - 0x744E0006, // 0188 JMPT R19 #0190 - 0xB84E4400, // 0189 GETNGBL R19 K34 - 0x8C4C2727, // 018A GETMET R19 R19 K39 - 0x58540041, // 018B LDCONST R21 K65 - 0x5858000F, // 018C LDCONST R22 K15 - 0x7C4C0600, // 018D CALL R19 3 - 0x504C0000, // 018E LDBOOL R19 0 0 - 0x80042600, // 018F RET 1 R19 - 0x604C0004, // 0190 GETGBL R19 G4 - 0x5C502200, // 0191 MOVE R20 R17 - 0x7C4C0200, // 0192 CALL R19 1 - 0x1C4C2742, // 0193 EQ R19 R19 K66 - 0x784E0007, // 0194 JMPF R19 #019D - 0xB84E8600, // 0195 GETNGBL R19 K67 - 0x8C4C2744, // 0196 GETMET R19 R19 K68 - 0x5C542200, // 0197 MOVE R21 R17 - 0x7C4C0400, // 0198 CALL R19 2 - 0x8C4C2745, // 0199 GETMET R19 R19 K69 - 0x7C4C0200, // 019A CALL R19 1 - 0x5C442600, // 019B MOVE R17 R19 - 0x70020002, // 019C JMP #01A0 - 0x8C4C2345, // 019D GETMET R19 R17 K69 - 0x7C4C0200, // 019E CALL R19 1 - 0x5C442600, // 019F MOVE R17 R19 - 0x604C0004, // 01A0 GETGBL R19 G4 - 0x5C502400, // 01A1 MOVE R20 R18 - 0x7C4C0200, // 01A2 CALL R19 1 - 0x1C4C2742, // 01A3 EQ R19 R19 K66 - 0x784E0007, // 01A4 JMPF R19 #01AD - 0xB84E8600, // 01A5 GETNGBL R19 K67 - 0x8C4C2744, // 01A6 GETMET R19 R19 K68 - 0x5C542400, // 01A7 MOVE R21 R18 - 0x7C4C0400, // 01A8 CALL R19 2 - 0x8C4C2745, // 01A9 GETMET R19 R19 K69 - 0x7C4C0200, // 01AA CALL R19 1 - 0x5C482600, // 01AB MOVE R18 R19 - 0x70020002, // 01AC JMP #01B0 - 0x8C4C2545, // 01AD GETMET R19 R18 K69 - 0x7C4C0200, // 01AE CALL R19 1 - 0x5C482600, // 01AF MOVE R18 R19 - 0x8C4C0346, // 01B0 GETMET R19 R1 K70 - 0x7C4C0200, // 01B1 CALL R19 1 - 0x40521147, // 01B2 CONNECT R20 K8 K71 - 0x944C2614, // 01B3 GETIDX R19 R19 R20 - 0x60540015, // 01B4 GETGBL R21 G21 - 0x7C540000, // 01B5 CALL R21 0 - 0x8C542B48, // 01B6 GETMET R21 R21 K72 - 0x585C0049, // 01B7 LDCONST R23 K73 - 0x7C540400, // 01B8 CALL R21 2 - 0x5C502A00, // 01B9 MOVE R20 R21 - 0x8C54094A, // 01BA GETMET R21 R4 K74 - 0x7C540200, // 01BB CALL R21 1 - 0x8C58234B, // 01BC GETMET R22 R17 K75 - 0x7C580200, // 01BD CALL R22 1 - 0x8C582D4C, // 01BE GETMET R22 R22 K76 - 0x7C580200, // 01BF CALL R22 1 - 0x8C5C2B4D, // 01C0 GETMET R23 R21 K77 - 0x5C642600, // 01C1 MOVE R25 R19 - 0x5C682C00, // 01C2 MOVE R26 R22 - 0x5C6C2800, // 01C3 MOVE R27 R20 - 0x54720007, // 01C4 LDINT R28 8 - 0x7C5C0A00, // 01C5 CALL R23 5 - 0x88600312, // 01C6 GETMBR R24 R1 K18 - 0x78620001, // 01C7 JMPF R24 #01CA - 0x88600312, // 01C8 GETMBR R24 R1 K18 - 0x70020001, // 01C9 JMP #01CC - 0x88600116, // 01CA GETMBR R24 R0 K22 - 0x8860314E, // 01CB GETMBR R24 R24 K78 - 0x8C641D4F, // 01CC GETMET R25 R14 K79 - 0x5C6C2200, // 01CD MOVE R27 R17 - 0x5C702400, // 01CE MOVE R28 R18 - 0x5C742E00, // 01CF MOVE R29 R23 - 0x5C783000, // 01D0 MOVE R30 R24 - 0x7C640A00, // 01D1 CALL R25 5 - 0x8C641D50, // 01D2 GETMET R25 R14 K80 - 0x7C640200, // 01D3 CALL R25 1 - 0x88640116, // 01D4 GETMBR R25 R0 K22 - 0x8C643351, // 01D5 GETMET R25 R25 K81 - 0x5C6C1C00, // 01D6 MOVE R27 R14 - 0x7C640400, // 01D7 CALL R25 2 - 0x8C640352, // 01D8 GETMET R25 R1 K82 - 0x7C640200, // 01D9 CALL R25 1 - 0x78660002, // 01DA JMPF R25 #01DE - 0x8C640353, // 01DB GETMET R25 R1 K83 - 0x546E003B, // 01DC LDINT R27 60 - 0x7C640400, // 01DD CALL R25 2 - 0x8C641D54, // 01DE GETMET R25 R14 K84 - 0x7C640200, // 01DF CALL R25 1 - 0x8C640D0A, // 01E0 GETMET R25 R6 K10 - 0x7C640200, // 01E1 CALL R25 1 - 0x8C68330B, // 01E2 GETMET R26 R25 K11 - 0x58700006, // 01E3 LDCONST R28 K6 - 0x88740D0C, // 01E4 GETMBR R29 R6 K12 - 0xB87A0400, // 01E5 GETNGBL R30 K2 - 0x88783D33, // 01E6 GETMBR R30 R30 K51 - 0x7C680800, // 01E7 CALL R26 4 - 0x8C68330B, // 01E8 GETMET R26 R25 K11 - 0x58700008, // 01E9 LDCONST R28 K8 - 0x88740D0C, // 01EA GETMBR R29 R6 K12 - 0x58780008, // 01EB LDCONST R30 K8 - 0x7C680800, // 01EC CALL R26 4 - 0x546A0007, // 01ED LDINT R26 8 - 0x900E0A1A, // 01EE SETMBR R3 K5 R26 - 0x80043200, // 01EF RET 1 R25 - 0x70020063, // 01F0 JMP #0255 - 0x54260008, // 01F1 LDINT R9 9 - 0x1C241009, // 01F2 EQ R9 R8 R9 - 0x7826001E, // 01F3 JMPF R9 #0213 - 0x8C240507, // 01F4 GETMET R9 R2 K7 - 0x582C0006, // 01F5 LDCONST R11 K6 - 0x7C240400, // 01F6 CALL R9 2 - 0x8C280355, // 01F7 GETMET R10 R1 K85 - 0x5C301200, // 01F8 MOVE R12 R9 - 0x7C280400, // 01F9 CALL R10 2 - 0xB82A4400, // 01FA GETNGBL R10 K34 - 0x8C281527, // 01FB GETMET R10 R10 K39 - 0x8C300B2D, // 01FC GETMET R12 R5 K45 - 0x58380056, // 01FD LDCONST R14 K86 - 0x883C0312, // 01FE GETMBR R15 R1 K18 - 0x8C3C1F57, // 01FF GETMET R15 R15 K87 - 0x7C3C0200, // 0200 CALL R15 1 - 0x8C3C1F4B, // 0201 GETMET R15 R15 K75 - 0x7C3C0200, // 0202 CALL R15 1 - 0x8C3C1F4C, // 0203 GETMET R15 R15 K76 - 0x7C3C0200, // 0204 CALL R15 1 - 0x8C3C1F29, // 0205 GETMET R15 R15 K41 - 0x7C3C0200, // 0206 CALL R15 1 - 0x60400008, // 0207 GETGBL R16 G8 - 0x5C441200, // 0208 MOVE R17 R9 - 0x7C400200, // 0209 CALL R16 1 - 0x7C300800, // 020A CALL R12 4 - 0x5834000F, // 020B LDCONST R13 K15 - 0x7C280600, // 020C CALL R10 3 - 0xB82A0400, // 020D GETNGBL R10 K2 - 0x88281533, // 020E GETMBR R10 R10 K51 - 0x900E340A, // 020F SETMBR R3 K26 R10 - 0x4C280000, // 0210 LDNIL R10 - 0x80041400, // 0211 RET 1 R10 - 0x70020041, // 0212 JMP #0255 - 0x54260009, // 0213 LDINT R9 10 - 0x1C241009, // 0214 EQ R9 R8 R9 - 0x7826003E, // 0215 JMPF R9 #0255 - 0x8C240507, // 0216 GETMET R9 R2 K7 - 0x582C0006, // 0217 LDCONST R11 K6 - 0x7C240400, // 0218 CALL R9 2 - 0x60280008, // 0219 GETGBL R10 G8 - 0x5C2C1200, // 021A MOVE R11 R9 - 0x7C280200, // 021B CALL R10 1 - 0x002AB00A, // 021C ADD R10 K88 R10 - 0x900E4E0A, // 021D SETMBR R3 K39 R10 - 0x60280010, // 021E GETGBL R10 G16 - 0x882C0116, // 021F GETMBR R11 R0 K22 - 0x882C1737, // 0220 GETMBR R11 R11 K55 - 0x8C2C1759, // 0221 GETMET R11 R11 K89 - 0x7C2C0200, // 0222 CALL R11 1 - 0x7C280200, // 0223 CALL R10 1 - 0xA802001D, // 0224 EXBLK 0 #0243 - 0x5C2C1400, // 0225 MOVE R11 R10 - 0x7C2C0000, // 0226 CALL R11 0 - 0x8C30175A, // 0227 GETMET R12 R11 K90 - 0x7C300200, // 0228 CALL R12 1 - 0x1C301809, // 0229 EQ R12 R12 R9 - 0x78320015, // 022A JMPF R12 #0241 - 0xB8324400, // 022B GETNGBL R12 K34 - 0x8C301927, // 022C GETMET R12 R12 K39 - 0x8C381757, // 022D GETMET R14 R11 K87 - 0x7C380200, // 022E CALL R14 1 - 0x8C381D4B, // 022F GETMET R14 R14 K75 - 0x7C380200, // 0230 CALL R14 1 - 0x8C381D4C, // 0231 GETMET R14 R14 K76 - 0x7C380200, // 0232 CALL R14 1 - 0x8C381D29, // 0233 GETMET R14 R14 K41 - 0x7C380200, // 0234 CALL R14 1 - 0x003AB60E, // 0235 ADD R14 K91 R14 - 0x583C000F, // 0236 LDCONST R15 K15 - 0x7C300600, // 0237 CALL R12 3 - 0xB8324400, // 0238 GETNGBL R12 K34 - 0x8C30195C, // 0239 GETMET R12 R12 K92 - 0x543A07CF, // 023A LDINT R14 2000 - 0x843C0000, // 023B CLOSURE R15 P0 - 0x7C300600, // 023C CALL R12 3 - 0x50300200, // 023D LDBOOL R12 1 0 - 0xA0000000, // 023E CLOSE R0 - 0xA8040001, // 023F EXBLK 1 1 - 0x80041800, // 0240 RET 1 R12 - 0xA0280000, // 0241 CLOSE R10 - 0x7001FFE1, // 0242 JMP #0225 - 0x5828005D, // 0243 LDCONST R10 K93 - 0xAC280200, // 0244 CATCH R10 1 0 - 0xB0080000, // 0245 RAISE 2 R0 R0 - 0xB82A4400, // 0246 GETNGBL R10 K34 - 0x8C281527, // 0247 GETMET R10 R10 K39 - 0x60300008, // 0248 GETGBL R12 G8 - 0x5C341200, // 0249 MOVE R13 R9 - 0x7C300200, // 024A CALL R12 1 - 0x0032BC0C, // 024B ADD R12 K94 R12 - 0x0030195F, // 024C ADD R12 R12 K95 - 0x5834000F, // 024D LDCONST R13 K15 - 0x7C280600, // 024E CALL R10 3 - 0xB82A0400, // 024F GETNGBL R10 K2 - 0x88281560, // 0250 GETMBR R10 R10 K96 - 0x900E340A, // 0251 SETMBR R3 K26 R10 - 0x4C280000, // 0252 LDNIL R10 - 0xA0000000, // 0253 CLOSE R0 - 0x80041400, // 0254 RET 1 R10 - 0x7002009A, // 0255 JMP #02F1 - 0x5426003B, // 0256 LDINT R9 60 - 0x1C240E09, // 0257 EQ R9 R7 R9 - 0x78260084, // 0258 JMPF R9 #02DE - 0x1C241106, // 0259 EQ R9 R8 K6 - 0x78260064, // 025A JMPF R9 #02C0 - 0x8C240507, // 025B GETMET R9 R2 K7 - 0x582C0006, // 025C LDCONST R11 K6 - 0x7C240400, // 025D CALL R9 2 - 0x8C280507, // 025E GETMET R10 R2 K7 - 0x58300008, // 025F LDCONST R12 K8 - 0x7C280400, // 0260 CALL R10 2 - 0x8C2C0507, // 0261 GETMET R11 R2 K7 - 0x5834000F, // 0262 LDCONST R13 K15 - 0x7C2C0400, // 0263 CALL R11 2 - 0x8C300507, // 0264 GETMET R12 R2 K7 - 0x58380011, // 0265 LDCONST R14 K17 - 0x7C300400, // 0266 CALL R12 2 - 0x8C340507, // 0267 GETMET R13 R2 K7 - 0x543E0003, // 0268 LDINT R15 4 - 0x7C340400, // 0269 CALL R13 2 - 0xB83A4400, // 026A GETNGBL R14 K34 - 0x8C381D27, // 026B GETMET R14 R14 K39 - 0x8C400B2D, // 026C GETMET R16 R5 K45 - 0x58480061, // 026D LDCONST R18 K97 - 0x5C4C1200, // 026E MOVE R19 R9 - 0x8C501529, // 026F GETMET R20 R10 K41 - 0x7C500200, // 0270 CALL R20 1 - 0x5C541600, // 0271 MOVE R21 R11 - 0x5C581800, // 0272 MOVE R22 R12 - 0x8C5C1B29, // 0273 GETMET R23 R13 K41 - 0x7C5C0200, // 0274 CALL R23 1 - 0x7C400E00, // 0275 CALL R16 7 - 0x5844000F, // 0276 LDCONST R17 K15 - 0x7C380600, // 0277 CALL R14 3 - 0x4C380000, // 0278 LDNIL R14 - 0x1C38120E, // 0279 EQ R14 R9 R14 - 0x743A000B, // 027A JMPT R14 #0287 - 0x4C380000, // 027B LDNIL R14 - 0x1C38140E, // 027C EQ R14 R10 R14 - 0x743A0008, // 027D JMPT R14 #0287 - 0x4C380000, // 027E LDNIL R14 - 0x1C38160E, // 027F EQ R14 R11 R14 - 0x743A0005, // 0280 JMPT R14 #0287 - 0x4C380000, // 0281 LDNIL R14 - 0x1C38180E, // 0282 EQ R14 R12 R14 - 0x743A0002, // 0283 JMPT R14 #0287 - 0x4C380000, // 0284 LDNIL R14 - 0x1C381A0E, // 0285 EQ R14 R13 R14 - 0x783A0005, // 0286 JMPF R14 #028D - 0xB83A0400, // 0287 GETNGBL R14 K2 - 0x88381D62, // 0288 GETMBR R14 R14 K98 - 0x900E340E, // 0289 SETMBR R3 K26 R14 - 0x4C380000, // 028A LDNIL R14 - 0xA0000000, // 028B CLOSE R0 - 0x80041C00, // 028C RET 1 R14 - 0x6038000C, // 028D GETGBL R14 G12 - 0x5C3C1400, // 028E MOVE R15 R10 - 0x7C380200, // 028F CALL R14 1 - 0x543E001F, // 0290 LDINT R15 32 - 0x54420040, // 0291 LDINT R16 65 - 0x003C1E10, // 0292 ADD R15 R15 R16 - 0x20381C0F, // 0293 NE R14 R14 R15 - 0x743A000B, // 0294 JMPT R14 #02A1 - 0x6038000C, // 0295 GETGBL R14 G12 - 0x5C3C1A00, // 0296 MOVE R15 R13 - 0x7C380200, // 0297 CALL R14 1 - 0x543E000F, // 0298 LDINT R15 16 - 0x14381C0F, // 0299 LT R14 R14 R15 - 0x743A0005, // 029A JMPT R14 #02A1 - 0x6038000C, // 029B GETGBL R14 G12 - 0x5C3C1A00, // 029C MOVE R15 R13 - 0x7C380200, // 029D CALL R14 1 - 0x543E001F, // 029E LDINT R15 32 - 0x24381C0F, // 029F GT R14 R14 R15 - 0x783A0009, // 02A0 JMPF R14 #02AB - 0xB83A4400, // 02A1 GETNGBL R14 K34 - 0x8C381D27, // 02A2 GETMET R14 R14 K39 - 0x58400063, // 02A3 LDCONST R16 K99 - 0x7C380400, // 02A4 CALL R14 2 - 0xB83A0400, // 02A5 GETNGBL R14 K2 - 0x88381D64, // 02A6 GETMBR R14 R14 K100 - 0x900E340E, // 02A7 SETMBR R3 K26 R14 - 0x4C380000, // 02A8 LDNIL R14 - 0xA0000000, // 02A9 CLOSE R0 - 0x80041C00, // 02AA RET 1 R14 - 0x543A001E, // 02AB LDINT R14 31 - 0x403A0C0E, // 02AC CONNECT R14 K6 R14 - 0x9438140E, // 02AD GETIDX R14 R10 R14 - 0x543E001F, // 02AE LDINT R15 32 - 0x403C1F47, // 02AF CONNECT R15 R15 K71 - 0x943C140F, // 02B0 GETIDX R15 R10 R15 - 0x88400116, // 02B1 GETMBR R16 R0 K22 - 0x8C402165, // 02B2 GETMET R16 R16 K101 - 0x5C481200, // 02B3 MOVE R18 R9 - 0x5C4C1800, // 02B4 MOVE R19 R12 - 0x5C501600, // 02B5 MOVE R20 R11 - 0x5C541A00, // 02B6 MOVE R21 R13 - 0x5C581C00, // 02B7 MOVE R22 R14 - 0x5C5C1E00, // 02B8 MOVE R23 R15 - 0x8C600366, // 02B9 GETMET R24 R1 K102 - 0x7C600200, // 02BA CALL R24 1 - 0x7C401000, // 02BB CALL R16 8 - 0x50400200, // 02BC LDBOOL R16 1 0 - 0xA0000000, // 02BD CLOSE R0 - 0x80042000, // 02BE RET 1 R16 - 0x7002001C, // 02BF JMP #02DD - 0x1C241108, // 02C0 EQ R9 R8 K8 - 0x78260012, // 02C1 JMPF R9 #02D5 - 0x8C240507, // 02C2 GETMET R9 R2 K7 - 0x582C0006, // 02C3 LDCONST R11 K6 - 0x7C240400, // 02C4 CALL R9 2 - 0xB82A4400, // 02C5 GETNGBL R10 K34 - 0x8C281527, // 02C6 GETMET R10 R10 K39 - 0x60300008, // 02C7 GETGBL R12 G8 - 0x5C341200, // 02C8 MOVE R13 R9 - 0x7C300200, // 02C9 CALL R12 1 - 0x0032CE0C, // 02CA ADD R12 K103 R12 - 0x5834000F, // 02CB LDCONST R13 K15 - 0x7C280600, // 02CC CALL R10 3 - 0x88280116, // 02CD GETMBR R10 R0 K22 - 0x8C281568, // 02CE GETMET R10 R10 K104 - 0x5C301200, // 02CF MOVE R12 R9 - 0x7C280400, // 02D0 CALL R10 2 - 0x50280200, // 02D1 LDBOOL R10 1 0 - 0xA0000000, // 02D2 CLOSE R0 - 0x80041400, // 02D3 RET 1 R10 - 0x70020007, // 02D4 JMP #02DD - 0x1C24110F, // 02D5 EQ R9 R8 K15 - 0x78260005, // 02D6 JMPF R9 #02DD - 0x88240116, // 02D7 GETMBR R9 R0 K22 - 0x8C241369, // 02D8 GETMET R9 R9 K105 - 0x7C240200, // 02D9 CALL R9 1 - 0x50240200, // 02DA LDBOOL R9 1 0 - 0xA0000000, // 02DB CLOSE R0 - 0x80041200, // 02DC RET 1 R9 - 0x70020012, // 02DD JMP #02F1 - 0x54260029, // 02DE LDINT R9 42 - 0x1C240E09, // 02DF EQ R9 R7 R9 - 0x78260005, // 02E0 JMPF R9 #02E7 - 0x1C241106, // 02E1 EQ R9 R8 K6 - 0x78260002, // 02E2 JMPF R9 #02E6 - 0x50240200, // 02E3 LDBOOL R9 1 0 - 0xA0000000, // 02E4 CLOSE R0 - 0x80041200, // 02E5 RET 1 R9 - 0x70020009, // 02E6 JMP #02F1 - 0x60240003, // 02E7 GETGBL R9 G3 - 0x5C280000, // 02E8 MOVE R10 R0 - 0x7C240200, // 02E9 CALL R9 1 - 0x8C24136A, // 02EA GETMET R9 R9 K106 - 0x5C2C0200, // 02EB MOVE R11 R1 - 0x5C300400, // 02EC MOVE R12 R2 - 0x5C340600, // 02ED MOVE R13 R3 - 0x7C240800, // 02EE CALL R9 4 - 0xA0000000, // 02EF CLOSE R0 - 0x80041200, // 02F0 RET 1 R9 - 0xA0000000, // 02F1 CLOSE R0 - 0x80000000, // 02F2 RET 0 + 0xB8160200, // 0001 GETNGBL R5 K1 + 0x88140B02, // 0002 GETMBR R5 R5 K2 + 0x88180503, // 0003 GETMBR R6 R2 K3 + 0x881C0504, // 0004 GETMBR R7 R2 K4 + 0x5422002F, // 0005 LDINT R8 48 + 0x1C200C08, // 0006 EQ R8 R6 R8 + 0x78220019, // 0007 JMPF R8 #0022 + 0x1C200F05, // 0008 EQ R8 R7 K5 + 0x78220016, // 0009 JMPF R8 #0021 + 0x60200004, // 000A GETGBL R8 G4 + 0x5C240600, // 000B MOVE R9 R3 + 0x7C200200, // 000C CALL R8 1 + 0x1C201106, // 000D EQ R8 R8 K6 + 0x74220004, // 000E JMPT R8 #0014 + 0x6020000F, // 000F GETGBL R8 G15 + 0x5C240600, // 0010 MOVE R9 R3 + 0xB82A0E00, // 0011 GETNGBL R10 K7 + 0x7C200400, // 0012 CALL R8 2 + 0x78220007, // 0013 JMPF R8 #001C + 0x90061003, // 0014 SETMBR R1 K8 R3 + 0x8C200109, // 0015 GETMET R8 R0 K9 + 0x88280503, // 0016 GETMBR R10 R2 K3 + 0x882C0504, // 0017 GETMBR R11 R2 K4 + 0x7C200600, // 0018 CALL R8 3 + 0x50200200, // 0019 LDBOOL R8 1 0 + 0x80041000, // 001A RET 1 R8 + 0x70020004, // 001B JMP #0021 + 0xB8220200, // 001C GETNGBL R8 K1 + 0x8820110B, // 001D GETMBR R8 R8 K11 + 0x900A1408, // 001E SETMBR R2 K10 R8 + 0x50200000, // 001F LDBOOL R8 0 0 + 0x80041000, // 0020 RET 1 R8 + 0x70020041, // 0021 JMP #0064 + 0x5422001E, // 0022 LDINT R8 31 + 0x1C200C08, // 0023 EQ R8 R6 R8 + 0x78220004, // 0024 JMPF R8 #002A + 0x1C200F05, // 0025 EQ R8 R7 K5 + 0x78220001, // 0026 JMPF R8 #0029 + 0x50200200, // 0027 LDBOOL R8 1 0 + 0x80041000, // 0028 RET 1 R8 + 0x70020039, // 0029 JMP #0064 + 0x54220027, // 002A LDINT R8 40 + 0x1C200C08, // 002B EQ R8 R6 R8 + 0x7822000B, // 002C JMPF R8 #0039 + 0x54220004, // 002D LDINT R8 5 + 0x1C200E08, // 002E EQ R8 R7 R8 + 0x78220002, // 002F JMPF R8 #0033 + 0x50200200, // 0030 LDBOOL R8 1 0 + 0x80041000, // 0031 RET 1 R8 + 0x70020004, // 0032 JMP #0038 + 0x54220005, // 0033 LDINT R8 6 + 0x1C200E08, // 0034 EQ R8 R7 R8 + 0x78220001, // 0035 JMPF R8 #0038 + 0x50200200, // 0036 LDBOOL R8 1 0 + 0x80041000, // 0037 RET 1 R8 + 0x7002002A, // 0038 JMP #0064 + 0x54220029, // 0039 LDINT R8 42 + 0x1C200C08, // 003A EQ R8 R6 R8 + 0x78220004, // 003B JMPF R8 #0041 + 0x1C200F05, // 003C EQ R8 R7 K5 + 0x78220001, // 003D JMPF R8 #0040 + 0x50200200, // 003E LDBOOL R8 1 0 + 0x80041000, // 003F RET 1 R8 + 0x70020022, // 0040 JMP #0064 + 0x5422002A, // 0041 LDINT R8 43 + 0x1C200C08, // 0042 EQ R8 R6 R8 + 0x78220007, // 0043 JMPF R8 #004C + 0x1C200F05, // 0044 EQ R8 R7 K5 + 0x78220004, // 0045 JMPF R8 #004B + 0xB8220200, // 0046 GETNGBL R8 K1 + 0x8820110B, // 0047 GETMBR R8 R8 K11 + 0x900A1408, // 0048 SETMBR R2 K10 R8 + 0x50200000, // 0049 LDBOOL R8 0 0 + 0x80041000, // 004A RET 1 R8 + 0x70020017, // 004B JMP #0064 + 0x5422002B, // 004C LDINT R8 44 + 0x1C200C08, // 004D EQ R8 R6 R8 + 0x78220009, // 004E JMPF R8 #0059 + 0x1C200F05, // 004F EQ R8 R7 K5 + 0x78220002, // 0050 JMPF R8 #0054 + 0x50200200, // 0051 LDBOOL R8 1 0 + 0x80041000, // 0052 RET 1 R8 + 0x70020003, // 0053 JMP #0058 + 0x1C200F0C, // 0054 EQ R8 R7 K12 + 0x78220001, // 0055 JMPF R8 #0058 + 0x50200200, // 0056 LDBOOL R8 1 0 + 0x80041000, // 0057 RET 1 R8 + 0x7002000A, // 0058 JMP #0064 + 0x54220030, // 0059 LDINT R8 49 + 0x1C200C08, // 005A EQ R8 R6 R8 + 0x78220007, // 005B JMPF R8 #0064 + 0x54220003, // 005C LDINT R8 4 + 0x1C200E08, // 005D EQ R8 R7 R8 + 0x78220004, // 005E JMPF R8 #0064 + 0xB8220200, // 005F GETNGBL R8 K1 + 0x8820110D, // 0060 GETMBR R8 R8 K13 + 0x900A1408, // 0061 SETMBR R2 K10 R8 + 0x50200000, // 0062 LDBOOL R8 0 0 + 0x80041000, // 0063 RET 1 R8 + 0x80000000, // 0064 RET 0 }) ) ); @@ -2099,11 +2065,11 @@ extern const bclass be_class_Matter_Plugin; be_local_class(Matter_Plugin_Root, 0, &be_class_Matter_Plugin, - be_nested_map(8, + be_nested_map(7, ( (struct bmapnode*) &(const bmapnode[]) { - { be_const_key_weak(invoke_request, 1), be_const_closure(Matter_Plugin_Root_invoke_request_closure) }, - { be_const_key_weak(write_attribute, -1), be_const_closure(Matter_Plugin_Root_write_attribute_closure) }, - { be_const_key_weak(CLUSTERS, 4), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { + { be_const_key_weak(invoke_request, 2), be_const_closure(Matter_Plugin_Root_invoke_request_closure) }, + { be_const_key_weak(NAME, -1), be_nested_str_weak(Root_X20node) }, + { be_const_key_weak(CLUSTERS, 6), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { be_const_map( * be_nested_map(13, ( (struct bmapnode*) &(const bmapnode[]) { { be_const_key_int(52, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_list, { @@ -2206,15 +2172,14 @@ be_local_class(Matter_Plugin_Root, be_const_int(8), })) ) } )) }, })) ) } )) }, - { be_const_key_weak(init, 0), be_const_closure(Matter_Plugin_Root_init_closure) }, - { be_const_key_weak(read_attribute, 7), be_const_closure(Matter_Plugin_Root_read_attribute_closure) }, - { be_const_key_weak(TYPE, -1), be_nested_str_weak(root) }, - { be_const_key_weak(NAME, -1), be_nested_str_weak(Root_X20node) }, - { be_const_key_weak(TYPES, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { + { be_const_key_weak(TYPES, 5), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { be_const_map( * be_nested_map(1, ( (struct bmapnode*) &(const bmapnode[]) { { be_const_key_int(22, -1), be_const_int(1) }, })) ) } )) }, + { be_const_key_weak(write_attribute, -1), be_const_closure(Matter_Plugin_Root_write_attribute_closure) }, + { be_const_key_weak(TYPE, -1), be_nested_str_weak(root) }, + { be_const_key_weak(read_attribute, -1), be_const_closure(Matter_Plugin_Root_read_attribute_closure) }, })), be_str_weak(Matter_Plugin_Root) ); diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor.h index 788358b91..79cafd8f4 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor.h @@ -105,52 +105,43 @@ be_local_closure(Matter_Plugin_Sensor_parse_sensors, /* name */ /******************************************************************** -** Solidified function: init +** Solidified function: parse_configuration ********************************************************************/ -be_local_closure(Matter_Plugin_Sensor_init, /* name */ +be_local_closure(Matter_Plugin_Sensor_parse_configuration, /* name */ be_nested_proto( - 9, /* nstack */ - 4, /* argc */ + 5, /* nstack */ + 2, /* argc */ 2, /* varg */ 0, /* has upvals */ NULL, /* no upvals */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[ 8]) { /* constants */ - /* K0 */ be_nested_str_weak(init), - /* K1 */ be_nested_str_weak(tasmota_sensor_filter), - /* K2 */ be_nested_str_weak(find), - /* K3 */ be_nested_str_weak(ARG), - /* K4 */ be_nested_str_weak(tasmota_sensor_matcher), - /* K5 */ be_nested_str_weak(tasmota), - /* K6 */ be_nested_str_weak(Rule_Matcher), - /* K7 */ be_nested_str_weak(parse), + ( &(const bvalue[ 7]) { /* constants */ + /* K0 */ be_nested_str_weak(tasmota_sensor_filter), + /* K1 */ be_nested_str_weak(find), + /* K2 */ be_nested_str_weak(ARG), + /* K3 */ be_nested_str_weak(tasmota_sensor_matcher), + /* K4 */ be_nested_str_weak(tasmota), + /* K5 */ be_nested_str_weak(Rule_Matcher), + /* K6 */ be_nested_str_weak(parse), }), - be_str_weak(init), + be_str_weak(parse_configuration), &be_const_str_solidified, - ( &(const binstruction[21]) { /* code */ - 0x60100003, // 0000 GETGBL R4 G3 - 0x5C140000, // 0001 MOVE R5 R0 - 0x7C100200, // 0002 CALL R4 1 - 0x8C100900, // 0003 GETMET R4 R4 K0 - 0x5C180200, // 0004 MOVE R6 R1 - 0x5C1C0400, // 0005 MOVE R7 R2 - 0x5C200600, // 0006 MOVE R8 R3 - 0x7C100800, // 0007 CALL R4 4 - 0x8C100702, // 0008 GETMET R4 R3 K2 - 0x88180103, // 0009 GETMBR R6 R0 K3 - 0x7C100400, // 000A CALL R4 2 - 0x90020204, // 000B SETMBR R0 K1 R4 - 0x88100101, // 000C GETMBR R4 R0 K1 - 0x78120005, // 000D JMPF R4 #0014 - 0xB8120A00, // 000E GETNGBL R4 K5 - 0x88100906, // 000F GETMBR R4 R4 K6 - 0x8C100907, // 0010 GETMET R4 R4 K7 - 0x88180101, // 0011 GETMBR R6 R0 K1 - 0x7C100400, // 0012 CALL R4 2 - 0x90020804, // 0013 SETMBR R0 K4 R4 - 0x80000000, // 0014 RET 0 + ( &(const binstruction[13]) { /* code */ + 0x8C080301, // 0000 GETMET R2 R1 K1 + 0x88100102, // 0001 GETMBR R4 R0 K2 + 0x7C080400, // 0002 CALL R2 2 + 0x90020002, // 0003 SETMBR R0 K0 R2 + 0x88080100, // 0004 GETMBR R2 R0 K0 + 0x780A0005, // 0005 JMPF R2 #000C + 0xB80A0800, // 0006 GETNGBL R2 K4 + 0x88080505, // 0007 GETMBR R2 R2 K5 + 0x8C080506, // 0008 GETMET R2 R2 K6 + 0x88100100, // 0009 GETMBR R4 R0 K0 + 0x7C080400, // 000A CALL R2 2 + 0x90020602, // 000B SETMBR R0 K3 R2 + 0x80000000, // 000C RET 0 }) ) ); @@ -166,14 +157,14 @@ be_local_class(Matter_Plugin_Sensor, &be_class_Matter_Plugin_Device, be_nested_map(9, ( (struct bmapnode*) &(const bmapnode[]) { - { be_const_key_weak(UPDATE_TIME, 3), be_const_int(5000) }, + { be_const_key_weak(ARG, 3), be_nested_str_weak(filter) }, { be_const_key_weak(tasmota_sensor_filter, -1), be_const_var(0) }, { be_const_key_weak(pre_value, -1), be_const_closure(Matter_Plugin_Sensor_pre_value_closure) }, - { be_const_key_weak(ARG, -1), be_nested_str_weak(filter) }, + { be_const_key_weak(UPDATE_TIME, -1), be_const_int(5000) }, { be_const_key_weak(value_changed, -1), be_const_closure(Matter_Plugin_Sensor_value_changed_closure) }, - { be_const_key_weak(init, 7), be_const_closure(Matter_Plugin_Sensor_init_closure) }, - { be_const_key_weak(parse_sensors, 5), be_const_closure(Matter_Plugin_Sensor_parse_sensors_closure) }, { be_const_key_weak(shadow_value, -1), be_const_var(2) }, + { be_const_key_weak(parse_sensors, 5), be_const_closure(Matter_Plugin_Sensor_parse_sensors_closure) }, + { be_const_key_weak(parse_configuration, -1), be_const_closure(Matter_Plugin_Sensor_parse_configuration_closure) }, { be_const_key_weak(tasmota_sensor_matcher, -1), be_const_var(1) }, })), be_str_weak(Matter_Plugin_Sensor) diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor_Occupancy.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor_Occupancy.h index 5ce78e2dd..0c35bd94c 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor_Occupancy.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor_Occupancy.h @@ -7,49 +7,40 @@ extern const bclass be_class_Matter_Plugin_Sensor_Occupancy; /******************************************************************** -** Solidified function: init +** Solidified function: parse_configuration ********************************************************************/ -be_local_closure(Matter_Plugin_Sensor_Occupancy_init, /* name */ +be_local_closure(Matter_Plugin_Sensor_Occupancy_parse_configuration, /* name */ be_nested_proto( - 9, /* nstack */ - 4, /* argc */ + 7, /* nstack */ + 2, /* argc */ 2, /* varg */ 0, /* has upvals */ NULL, /* no upvals */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[ 6]) { /* constants */ - /* K0 */ be_nested_str_weak(init), - /* K1 */ be_nested_str_weak(tasmota_switch_index), - /* K2 */ be_nested_str_weak(find), - /* K3 */ be_nested_str_weak(ARG), - /* K4 */ be_const_int(1), - /* K5 */ be_const_int(0), + ( &(const bvalue[ 5]) { /* constants */ + /* K0 */ be_nested_str_weak(tasmota_switch_index), + /* K1 */ be_nested_str_weak(find), + /* K2 */ be_nested_str_weak(ARG), + /* K3 */ be_const_int(1), + /* K4 */ be_const_int(0), }), - be_str_weak(init), + be_str_weak(parse_configuration), &be_const_str_solidified, - ( &(const binstruction[20]) { /* code */ - 0x60100003, // 0000 GETGBL R4 G3 - 0x5C140000, // 0001 MOVE R5 R0 - 0x7C100200, // 0002 CALL R4 1 - 0x8C100900, // 0003 GETMET R4 R4 K0 - 0x5C180200, // 0004 MOVE R6 R1 - 0x5C1C0400, // 0005 MOVE R7 R2 - 0x5C200600, // 0006 MOVE R8 R3 - 0x7C100800, // 0007 CALL R4 4 - 0x60100009, // 0008 GETGBL R4 G9 - 0x8C140702, // 0009 GETMET R5 R3 K2 - 0x881C0103, // 000A GETMBR R7 R0 K3 - 0x58200004, // 000B LDCONST R8 K4 - 0x7C140600, // 000C CALL R5 3 - 0x7C100200, // 000D CALL R4 1 - 0x90020204, // 000E SETMBR R0 K1 R4 - 0x88100101, // 000F GETMBR R4 R0 K1 - 0x18100905, // 0010 LE R4 R4 K5 - 0x78120000, // 0011 JMPF R4 #0013 - 0x90020304, // 0012 SETMBR R0 K1 K4 - 0x80000000, // 0013 RET 0 + ( &(const binstruction[12]) { /* code */ + 0x60080009, // 0000 GETGBL R2 G9 + 0x8C0C0301, // 0001 GETMET R3 R1 K1 + 0x88140102, // 0002 GETMBR R5 R0 K2 + 0x58180003, // 0003 LDCONST R6 K3 + 0x7C0C0600, // 0004 CALL R3 3 + 0x7C080200, // 0005 CALL R2 1 + 0x90020002, // 0006 SETMBR R0 K0 R2 + 0x88080100, // 0007 GETMBR R2 R0 K0 + 0x18080504, // 0008 LE R2 R2 K4 + 0x780A0000, // 0009 JMPF R2 #000B + 0x90020103, // 000A SETMBR R0 K0 K3 + 0x80000000, // 000B RET 0 }) ) ); @@ -283,18 +274,20 @@ be_local_class(Matter_Plugin_Sensor_Occupancy, be_nested_map(12, ( (struct bmapnode*) &(const bmapnode[]) { { be_const_key_weak(UPDATE_TIME, -1), be_const_int(5000) }, - { be_const_key_weak(TYPE, 9), be_nested_str_weak(occupancy) }, + { be_const_key_weak(parse_configuration, 9), be_const_closure(Matter_Plugin_Sensor_Occupancy_parse_configuration_closure) }, { be_const_key_weak(TYPES, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { be_const_map( * be_nested_map(1, ( (struct bmapnode*) &(const bmapnode[]) { { be_const_key_int(263, -1), be_const_int(2) }, })) ) } )) }, - { be_const_key_weak(init, 11), be_const_closure(Matter_Plugin_Sensor_Occupancy_init_closure) }, + { be_const_key_weak(ARG, -1), be_nested_str_weak(switch) }, { be_const_key_weak(ARG_TYPE, -1), be_const_static_closure(Matter_Plugin_Sensor_Occupancy__X3Clambda_X3E_closure) }, { be_const_key_weak(NAME, -1), be_nested_str_weak(Occupancy) }, { be_const_key_weak(read_attribute, 5), be_const_closure(Matter_Plugin_Sensor_Occupancy_read_attribute_closure) }, { be_const_key_weak(shadow_occupancy, -1), be_const_var(1) }, - { be_const_key_weak(CLUSTERS, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { + { be_const_key_weak(tasmota_switch_index, -1), be_const_var(0) }, + { be_const_key_weak(TYPE, 11), be_nested_str_weak(occupancy) }, + { be_const_key_weak(CLUSTERS, 8), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { be_const_map( * be_nested_map(1, ( (struct bmapnode*) &(const bmapnode[]) { { be_const_key_int(1030, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_list, { @@ -308,8 +301,6 @@ be_local_class(Matter_Plugin_Sensor_Occupancy, })) ) } )) }, })) ) } )) }, { be_const_key_weak(update_shadow, -1), be_const_closure(Matter_Plugin_Sensor_Occupancy_update_shadow_closure) }, - { be_const_key_weak(tasmota_switch_index, 8), be_const_var(0) }, - { be_const_key_weak(ARG, -1), be_nested_str_weak(switch) }, })), be_str_weak(Matter_Plugin_Sensor_Occupancy) ); diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor_OnOff.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor_OnOff.h index 3653ba167..b061f2b05 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor_OnOff.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor_OnOff.h @@ -6,6 +6,47 @@ extern const bclass be_class_Matter_Plugin_Sensor_OnOff; +/******************************************************************** +** Solidified function: parse_configuration +********************************************************************/ +be_local_closure(Matter_Plugin_Sensor_OnOff_parse_configuration, /* name */ + be_nested_proto( + 7, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 5]) { /* constants */ + /* K0 */ be_nested_str_weak(tasmota_switch_index), + /* K1 */ be_nested_str_weak(find), + /* K2 */ be_nested_str_weak(ARG), + /* K3 */ be_const_int(1), + /* K4 */ be_const_int(0), + }), + be_str_weak(parse_configuration), + &be_const_str_solidified, + ( &(const binstruction[12]) { /* code */ + 0x60080009, // 0000 GETGBL R2 G9 + 0x8C0C0301, // 0001 GETMET R3 R1 K1 + 0x88140102, // 0002 GETMBR R5 R0 K2 + 0x58180003, // 0003 LDCONST R6 K3 + 0x7C0C0600, // 0004 CALL R3 3 + 0x7C080200, // 0005 CALL R2 1 + 0x90020002, // 0006 SETMBR R0 K0 R2 + 0x88080100, // 0007 GETMBR R2 R0 K0 + 0x18080504, // 0008 LE R2 R2 K4 + 0x780A0000, // 0009 JMPF R2 #000B + 0x90020103, // 000A SETMBR R0 K0 K3 + 0x80000000, // 000B RET 0 + }) + ) +); +/*******************************************************************/ + + /******************************************************************** ** Solidified function: ********************************************************************/ @@ -196,56 +237,6 @@ be_local_closure(Matter_Plugin_Sensor_OnOff_update_shadow, /* name */ /*******************************************************************/ -/******************************************************************** -** Solidified function: init -********************************************************************/ -be_local_closure(Matter_Plugin_Sensor_OnOff_init, /* name */ - be_nested_proto( - 9, /* nstack */ - 4, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 6]) { /* constants */ - /* K0 */ be_nested_str_weak(init), - /* K1 */ be_nested_str_weak(tasmota_switch_index), - /* K2 */ be_nested_str_weak(find), - /* K3 */ be_nested_str_weak(ARG), - /* K4 */ be_const_int(1), - /* K5 */ be_const_int(0), - }), - be_str_weak(init), - &be_const_str_solidified, - ( &(const binstruction[20]) { /* code */ - 0x60100003, // 0000 GETGBL R4 G3 - 0x5C140000, // 0001 MOVE R5 R0 - 0x7C100200, // 0002 CALL R4 1 - 0x8C100900, // 0003 GETMET R4 R4 K0 - 0x5C180200, // 0004 MOVE R6 R1 - 0x5C1C0400, // 0005 MOVE R7 R2 - 0x5C200600, // 0006 MOVE R8 R3 - 0x7C100800, // 0007 CALL R4 4 - 0x60100009, // 0008 GETGBL R4 G9 - 0x8C140702, // 0009 GETMET R5 R3 K2 - 0x881C0103, // 000A GETMBR R7 R0 K3 - 0x58200004, // 000B LDCONST R8 K4 - 0x7C140600, // 000C CALL R5 3 - 0x7C100200, // 000D CALL R4 1 - 0x90020204, // 000E SETMBR R0 K1 R4 - 0x88100101, // 000F GETMBR R4 R0 K1 - 0x18100905, // 0010 LE R4 R4 K5 - 0x78120000, // 0011 JMPF R4 #0013 - 0x90020304, // 0012 SETMBR R0 K1 K4 - 0x80000000, // 0013 RET 0 - }) - ) -); -/*******************************************************************/ - - /******************************************************************** ** Solidified class: Matter_Plugin_Sensor_OnOff ********************************************************************/ @@ -256,19 +247,19 @@ be_local_class(Matter_Plugin_Sensor_OnOff, be_nested_map(12, ( (struct bmapnode*) &(const bmapnode[]) { { be_const_key_weak(UPDATE_TIME, -1), be_const_int(5000) }, - { be_const_key_weak(TYPE, 11), be_nested_str_weak(onoff) }, + { be_const_key_weak(parse_configuration, 8), be_const_closure(Matter_Plugin_Sensor_OnOff_parse_configuration_closure) }, { be_const_key_weak(TYPES, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { be_const_map( * be_nested_map(1, ( (struct bmapnode*) &(const bmapnode[]) { { be_const_key_int(2128, -1), be_const_int(2) }, })) ) } )) }, - { be_const_key_weak(ARG, 9), be_nested_str_weak(switch) }, - { be_const_key_weak(ARG_TYPE, 8), be_const_static_closure(Matter_Plugin_Sensor_OnOff__X3Clambda_X3E_closure) }, + { be_const_key_weak(ARG, -1), be_nested_str_weak(switch) }, + { be_const_key_weak(ARG_TYPE, 9), be_const_static_closure(Matter_Plugin_Sensor_OnOff__X3Clambda_X3E_closure) }, { be_const_key_weak(NAME, -1), be_nested_str_weak(OnOff) }, { be_const_key_weak(read_attribute, 5), be_const_closure(Matter_Plugin_Sensor_OnOff_read_attribute_closure) }, { be_const_key_weak(tasmota_switch_index, -1), be_const_var(0) }, + { be_const_key_weak(TYPE, 11), be_nested_str_weak(onoff) }, { be_const_key_weak(shadow_onoff, -1), be_const_var(1) }, - { be_const_key_weak(init, -1), be_const_closure(Matter_Plugin_Sensor_OnOff_init_closure) }, { be_const_key_weak(CLUSTERS, 7), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { be_const_map( * be_nested_map(1, ( (struct bmapnode*) &(const bmapnode[]) { diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Shutter.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Shutter.h index 2fd38c7da..93d6e592c 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Shutter.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Shutter.h @@ -573,49 +573,40 @@ be_local_closure(Matter_Plugin_Shutter_parse_sensors, /* name */ /******************************************************************** -** Solidified function: init +** Solidified function: parse_configuration ********************************************************************/ -be_local_closure(Matter_Plugin_Shutter_init, /* name */ +be_local_closure(Matter_Plugin_Shutter_parse_configuration, /* name */ be_nested_proto( - 9, /* nstack */ - 4, /* argc */ + 5, /* nstack */ + 2, /* argc */ 2, /* varg */ 0, /* has upvals */ NULL, /* no upvals */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[ 6]) { /* constants */ - /* K0 */ be_nested_str_weak(init), - /* K1 */ be_nested_str_weak(tasmota_shutter_index), - /* K2 */ be_nested_str_weak(find), - /* K3 */ be_nested_str_weak(ARG), - /* K4 */ be_const_int(0), - /* K5 */ be_nested_str_weak(shadow_shutter_inverted), + ( &(const bvalue[ 5]) { /* constants */ + /* K0 */ be_nested_str_weak(tasmota_shutter_index), + /* K1 */ be_nested_str_weak(find), + /* K2 */ be_nested_str_weak(ARG), + /* K3 */ be_const_int(0), + /* K4 */ be_nested_str_weak(shadow_shutter_inverted), }), - be_str_weak(init), + be_str_weak(parse_configuration), &be_const_str_solidified, - ( &(const binstruction[20]) { /* code */ - 0x60100003, // 0000 GETGBL R4 G3 - 0x5C140000, // 0001 MOVE R5 R0 - 0x7C100200, // 0002 CALL R4 1 - 0x8C100900, // 0003 GETMET R4 R4 K0 - 0x5C180200, // 0004 MOVE R6 R1 - 0x5C1C0400, // 0005 MOVE R7 R2 - 0x5C200600, // 0006 MOVE R8 R3 - 0x7C100800, // 0007 CALL R4 4 - 0x8C100702, // 0008 GETMET R4 R3 K2 - 0x88180103, // 0009 GETMBR R6 R0 K3 - 0x7C100400, // 000A CALL R4 2 - 0x90020204, // 000B SETMBR R0 K1 R4 - 0x88100101, // 000C GETMBR R4 R0 K1 - 0x4C140000, // 000D LDNIL R5 - 0x1C100805, // 000E EQ R4 R4 R5 - 0x78120000, // 000F JMPF R4 #0011 - 0x90020304, // 0010 SETMBR R0 K1 K4 - 0x5411FFFE, // 0011 LDINT R4 -1 - 0x90020A04, // 0012 SETMBR R0 K5 R4 - 0x80000000, // 0013 RET 0 + ( &(const binstruction[12]) { /* code */ + 0x8C080301, // 0000 GETMET R2 R1 K1 + 0x88100102, // 0001 GETMBR R4 R0 K2 + 0x7C080400, // 0002 CALL R2 2 + 0x90020002, // 0003 SETMBR R0 K0 R2 + 0x88080100, // 0004 GETMBR R2 R0 K0 + 0x4C0C0000, // 0005 LDNIL R3 + 0x1C080403, // 0006 EQ R2 R2 R3 + 0x780A0000, // 0007 JMPF R2 #0009 + 0x90020103, // 0008 SETMBR R0 K0 K3 + 0x5409FFFE, // 0009 LDINT R2 -1 + 0x90020802, // 000A SETMBR R0 K4 R2 + 0x80000000, // 000B RET 0 }) ) ); @@ -684,14 +675,14 @@ be_local_class(Matter_Plugin_Shutter, &be_class_Matter_Plugin_Device, be_nested_map(18, ( (struct bmapnode*) &(const bmapnode[]) { - { be_const_key_weak(shadow_shutter_direction, -1), be_const_var(4) }, + { be_const_key_weak(shadow_shutter_tilt, -1), be_const_var(3) }, { be_const_key_weak(TYPE, -1), be_nested_str_weak(shutter) }, { be_const_key_weak(TYPES, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { be_const_map( * be_nested_map(1, ( (struct bmapnode*) &(const bmapnode[]) { { be_const_key_int(514, -1), be_const_int(2) }, })) ) } )) }, - { be_const_key_weak(update_shadow, -1), be_const_closure(Matter_Plugin_Shutter_update_shadow_closure) }, + { be_const_key_weak(update_shadow, 13), be_const_closure(Matter_Plugin_Shutter_update_shadow_closure) }, { be_const_key_weak(CLUSTERS, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { be_const_map( * be_nested_map(1, ( (struct bmapnode*) &(const bmapnode[]) { @@ -711,18 +702,18 @@ be_local_class(Matter_Plugin_Shutter, })) ) } )) }, })) ) } )) }, { be_const_key_weak(invoke_request, 14), be_const_closure(Matter_Plugin_Shutter_invoke_request_closure) }, - { be_const_key_weak(read_attribute, 13), be_const_closure(Matter_Plugin_Shutter_read_attribute_closure) }, + { be_const_key_weak(read_attribute, 16), be_const_closure(Matter_Plugin_Shutter_read_attribute_closure) }, { be_const_key_weak(shadow_shutter_inverted, 3), be_const_var(5) }, { be_const_key_weak(shadow_shutter_pos, -1), be_const_var(1) }, { be_const_key_weak(ARG, -1), be_nested_str_weak(shutter) }, { be_const_key_weak(ARG_TYPE, -1), be_const_static_closure(Matter_Plugin_Shutter__X3Clambda_X3E_closure) }, - { be_const_key_weak(init, -1), be_const_closure(Matter_Plugin_Shutter_init_closure) }, - { be_const_key_weak(update_inverted, 16), be_const_closure(Matter_Plugin_Shutter_update_inverted_closure) }, - { be_const_key_weak(parse_sensors, -1), be_const_closure(Matter_Plugin_Shutter_parse_sensors_closure) }, - { be_const_key_weak(shadow_shutter_target, -1), be_const_var(2) }, - { be_const_key_weak(tasmota_shutter_index, 11), be_const_var(0) }, { be_const_key_weak(NAME, -1), be_nested_str_weak(Shutter) }, - { be_const_key_weak(shadow_shutter_tilt, 0), be_const_var(3) }, + { be_const_key_weak(update_inverted, 11), be_const_closure(Matter_Plugin_Shutter_update_inverted_closure) }, + { be_const_key_weak(parse_configuration, -1), be_const_closure(Matter_Plugin_Shutter_parse_configuration_closure) }, + { be_const_key_weak(shadow_shutter_target, -1), be_const_var(2) }, + { be_const_key_weak(tasmota_shutter_index, -1), be_const_var(0) }, + { be_const_key_weak(parse_sensors, -1), be_const_closure(Matter_Plugin_Shutter_parse_sensors_closure) }, + { be_const_key_weak(shadow_shutter_direction, 0), be_const_var(4) }, })), be_str_weak(Matter_Plugin_Shutter) ); diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_UI.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_UI.h index 0e88e8429..2f5170eee 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_UI.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_UI.h @@ -7,9 +7,132 @@ extern const bclass be_class_Matter_UI; /******************************************************************** -** Solidified function: page_part_mgr +** Solidified function: web_add_config_button ********************************************************************/ -be_local_closure(Matter_UI_page_part_mgr, /* name */ +be_local_closure(Matter_UI_web_add_config_button, /* name */ + be_nested_proto( + 5, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 6]) { /* constants */ + /* K0 */ be_nested_str_weak(webserver), + /* K1 */ be_nested_str_weak(content_send), + /* K2 */ be_nested_str_weak(_X3Cp_X3E_X3Cform_X20id_X3Dac_X20action_X3D_X27matterc_X27_X20style_X3D_X27display_X3A_X20block_X3B_X27_X20method_X3D_X27get_X27_X3E_X3Cbutton_X3E), + /* K3 */ be_nested_str_weak(matter), + /* K4 */ be_nested_str_weak(_LOGO), + /* K5 */ be_nested_str_weak(_X20Configure_X20Matter_X3C_X2Fbutton_X3E_X3C_X2Fform_X3E_X3C_X2Fp_X3E), + }), + be_str_weak(web_add_config_button), + &be_const_str_solidified, + ( &(const binstruction[12]) { /* code */ + 0xA4060000, // 0000 IMPORT R1 K0 + 0x8C080301, // 0001 GETMET R2 R1 K1 + 0x58100002, // 0002 LDCONST R4 K2 + 0x7C080400, // 0003 CALL R2 2 + 0x8C080301, // 0004 GETMET R2 R1 K1 + 0xB8120600, // 0005 GETNGBL R4 K3 + 0x88100904, // 0006 GETMBR R4 R4 K4 + 0x7C080400, // 0007 CALL R2 2 + 0x8C080301, // 0008 GETMET R2 R1 K1 + 0x58100005, // 0009 LDCONST R4 K5 + 0x7C080400, // 000A CALL R2 2 + 0x80000000, // 000B RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: show_passcode_form +********************************************************************/ +be_local_closure(Matter_UI_show_passcode_form, /* name */ + be_nested_proto( + 9, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[17]) { /* constants */ + /* K0 */ be_nested_str_weak(webserver), + /* K1 */ be_nested_str_weak(string), + /* K2 */ be_nested_str_weak(content_send), + /* K3 */ be_nested_str_weak(_X3Cfieldset_X3E_X3Clegend_X3E_X3Cb_X3E_X26nbsp_X3BMatter_X20Advanced_X20Configuration_X26nbsp_X3B_X3C_X2Fb_X3E_X3C_X2Flegend_X3E_X3Cp_X3E_X3C_X2Fp_X3E), + /* K4 */ be_nested_str_weak(_X3Cform_X20action_X3D_X27_X2Fmatterc_X27_X20method_X3D_X27post_X27_X20onsubmit_X3D_X27return_X20confirm_X28_X22This_X20will_X20cause_X20a_X20restart_X2E_X22_X29_X3B_X27_X3E_X3Cp_X3EPasscode_X3A_X3C_X2Fp_X3E), + /* K5 */ be_nested_str_weak(format), + /* K6 */ be_nested_str_weak(_X3Cinput_X20type_X3D_X27number_X27_X20min_X3D_X271_X27_X20max_X3D_X2799999998_X27_X20name_X3D_X27passcode_X27_X20value_X3D_X27_X25i_X27_X3E), + /* K7 */ be_nested_str_weak(device), + /* K8 */ be_nested_str_weak(root_passcode), + /* K9 */ be_nested_str_weak(_X3Cp_X3EDistinguish_X20id_X3A_X3C_X2Fp_X3E), + /* K10 */ be_nested_str_weak(_X3Cinput_X20type_X3D_X27number_X27_X20min_X3D_X270_X27_X20max_X3D_X274095_X27_X20name_X3D_X27discriminator_X27_X20value_X3D_X27_X25i_X27_X3E), + /* K11 */ be_nested_str_weak(root_discriminator), + /* K12 */ be_nested_str_weak(_X3Cp_X3E_X3Cinput_X20type_X3D_X27checkbox_X27_X20name_X3D_X27ipv4_X27_X25s_X3EIPv4_X20only_X3C_X2Fp_X3E), + /* K13 */ be_nested_str_weak(ipv4only), + /* K14 */ be_nested_str_weak(_X20checked), + /* K15 */ be_nested_str_weak(), + /* K16 */ be_nested_str_weak(_X3Cp_X3E_X3C_X2Fp_X3E_X3Cbutton_X20name_X3D_X27passcode_X27_X20class_X3D_X27button_X20bgrn_X27_X3EChange_X3C_X2Fbutton_X3E_X3C_X2Fform_X3E_X3C_X2Fp_X3E_X3Cp_X3E_X3C_X2Fp_X3E_X3C_X2Ffieldset_X3E_X3Cp_X3E_X3C_X2Fp_X3E), + }), + be_str_weak(show_passcode_form), + &be_const_str_solidified, + ( &(const binstruction[40]) { /* code */ + 0xA4060000, // 0000 IMPORT R1 K0 + 0xA40A0200, // 0001 IMPORT R2 K1 + 0x8C0C0302, // 0002 GETMET R3 R1 K2 + 0x58140003, // 0003 LDCONST R5 K3 + 0x7C0C0400, // 0004 CALL R3 2 + 0x8C0C0302, // 0005 GETMET R3 R1 K2 + 0x58140004, // 0006 LDCONST R5 K4 + 0x7C0C0400, // 0007 CALL R3 2 + 0x8C0C0302, // 0008 GETMET R3 R1 K2 + 0x8C140505, // 0009 GETMET R5 R2 K5 + 0x581C0006, // 000A LDCONST R7 K6 + 0x88200107, // 000B GETMBR R8 R0 K7 + 0x88201108, // 000C GETMBR R8 R8 K8 + 0x7C140600, // 000D CALL R5 3 + 0x7C0C0400, // 000E CALL R3 2 + 0x8C0C0302, // 000F GETMET R3 R1 K2 + 0x58140009, // 0010 LDCONST R5 K9 + 0x7C0C0400, // 0011 CALL R3 2 + 0x8C0C0302, // 0012 GETMET R3 R1 K2 + 0x8C140505, // 0013 GETMET R5 R2 K5 + 0x581C000A, // 0014 LDCONST R7 K10 + 0x88200107, // 0015 GETMBR R8 R0 K7 + 0x8820110B, // 0016 GETMBR R8 R8 K11 + 0x7C140600, // 0017 CALL R5 3 + 0x7C0C0400, // 0018 CALL R3 2 + 0x8C0C0302, // 0019 GETMET R3 R1 K2 + 0x8C140505, // 001A GETMET R5 R2 K5 + 0x581C000C, // 001B LDCONST R7 K12 + 0x88200107, // 001C GETMBR R8 R0 K7 + 0x8820110D, // 001D GETMBR R8 R8 K13 + 0x78220001, // 001E JMPF R8 #0021 + 0x5820000E, // 001F LDCONST R8 K14 + 0x70020000, // 0020 JMP #0022 + 0x5820000F, // 0021 LDCONST R8 K15 + 0x7C140600, // 0022 CALL R5 3 + 0x7C0C0400, // 0023 CALL R3 2 + 0x8C0C0302, // 0024 GETMET R3 R1 K2 + 0x58140010, // 0025 LDCONST R5 K16 + 0x7C0C0400, // 0026 CALL R3 2 + 0x80000000, // 0027 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: page_part_mgr_adv +********************************************************************/ +be_local_closure(Matter_UI_page_part_mgr_adv, /* name */ be_nested_proto( 6, /* nstack */ 1, /* argc */ @@ -19,24 +142,23 @@ be_local_closure(Matter_UI_page_part_mgr, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[13]) { /* constants */ + ( &(const bvalue[12]) { /* constants */ /* K0 */ be_nested_str_weak(webserver), /* K1 */ be_nested_str_weak(string), /* K2 */ be_nested_str_weak(check_privileged_access), /* K3 */ be_nested_str_weak(content_start), - /* K4 */ be_nested_str_weak(Matter), + /* K4 */ be_nested_str_weak(Matter_X20Advanced_X20Configuration), /* K5 */ be_nested_str_weak(content_send_style), - /* K6 */ be_nested_str_weak(show_enable), + /* K6 */ be_nested_str_weak(matter_enabled), /* K7 */ be_nested_str_weak(show_passcode_form), - /* K8 */ be_nested_str_weak(show_plugins_configuration), - /* K9 */ be_nested_str_weak(show_fabric_info), - /* K10 */ be_nested_str_weak(content_button), - /* K11 */ be_nested_str_weak(BUTTON_CONFIGURATION), - /* K12 */ be_nested_str_weak(content_stop), + /* K8 */ be_nested_str_weak(show_fabric_info), + /* K9 */ be_nested_str_weak(content_button), + /* K10 */ be_nested_str_weak(BUTTON_CONFIGURATION), + /* K11 */ be_nested_str_weak(content_stop), }), - be_str_weak(page_part_mgr), + be_str_weak(page_part_mgr_adv), &be_const_str_solidified, - ( &(const binstruction[27]) { /* code */ + ( &(const binstruction[25]) { /* code */ 0xA4060000, // 0000 IMPORT R1 K0 0xA40A0200, // 0001 IMPORT R2 K1 0x8C0C0302, // 0002 GETMET R3 R1 K2 @@ -51,19 +173,17 @@ be_local_closure(Matter_UI_page_part_mgr, /* name */ 0x7C0C0200, // 000B CALL R3 1 0x8C0C0106, // 000C GETMET R3 R0 K6 0x7C0C0200, // 000D CALL R3 1 - 0x780E0005, // 000E JMPF R3 #0015 + 0x780E0003, // 000E JMPF R3 #0013 0x8C0C0107, // 000F GETMET R3 R0 K7 0x7C0C0200, // 0010 CALL R3 1 0x8C0C0108, // 0011 GETMET R3 R0 K8 0x7C0C0200, // 0012 CALL R3 1 - 0x8C0C0109, // 0013 GETMET R3 R0 K9 - 0x7C0C0200, // 0014 CALL R3 1 - 0x8C0C030A, // 0015 GETMET R3 R1 K10 - 0x8814030B, // 0016 GETMBR R5 R1 K11 - 0x7C0C0400, // 0017 CALL R3 2 - 0x8C0C030C, // 0018 GETMET R3 R1 K12 - 0x7C0C0200, // 0019 CALL R3 1 - 0x80000000, // 001A RET 0 + 0x8C0C0309, // 0013 GETMET R3 R1 K9 + 0x8814030A, // 0014 GETMBR R5 R1 K10 + 0x7C0C0400, // 0015 CALL R3 2 + 0x8C0C030B, // 0016 GETMET R3 R1 K11 + 0x7C0C0200, // 0017 CALL R3 1 + 0x80000000, // 0018 RET 0 }) ) ); @@ -71,11 +191,11 @@ be_local_closure(Matter_UI_page_part_mgr, /* name */ /******************************************************************** -** Solidified function: show_commissioning_info +** Solidified function: show_bridge_status ********************************************************************/ -be_local_closure(Matter_UI_show_commissioning_info, /* name */ +be_local_closure(Matter_UI_show_bridge_status, /* name */ be_nested_proto( - 14, /* nstack */ + 15, /* nstack */ 1, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -83,97 +203,1067 @@ be_local_closure(Matter_UI_show_commissioning_info, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[20]) { /* constants */ + ( &(const bvalue[26]) { /* constants */ /* K0 */ be_nested_str_weak(webserver), /* K1 */ be_nested_str_weak(string), - /* K2 */ be_nested_str_weak(device), - /* K3 */ be_nested_str_weak(commissioning_open), - /* K4 */ be_nested_str_weak(tasmota), - /* K5 */ be_nested_str_weak(millis), - /* K6 */ be_const_int(0), - /* K7 */ be_nested_str_weak(content_send), - /* K8 */ be_nested_str_weak(format), - /* K9 */ be_nested_str_weak(_X3Cfieldset_X3E_X3Clegend_X3E_X3Cb_X3E_X26nbsp_X3BCommissioning_X20open_X20for_X20_X25i_X20min_X26nbsp_X3B_X3C_X2Fb_X3E_X3C_X2Flegend_X3E_X3Cp_X3E_X3C_X2Fp_X3E), - /* K10 */ be_nested_str_weak(compute_manual_pairing_code), - /* K11 */ be_nested_str_weak(_X3Cp_X3EManual_X20pairing_X20code_X3A_X3Cbr_X3E_X3Cb_X3E_X25s_X2D_X25s_X2D_X25s_X3C_X2Fb_X3E_X3C_X2Fp_X3E_X3Chr_X3E), - /* K12 */ be_const_int(3), - /* K13 */ be_const_int(2147483647), - /* K14 */ be_nested_str_weak(_X3Cdiv_X3E_X3Ccenter_X3E), - /* K15 */ be_nested_str_weak(compute_qrcode_content), - /* K16 */ be_nested_str_weak(show_qrcode), - /* K17 */ be_nested_str_weak(_X3Cp_X3E_X20_X25s_X3C_X2Fp_X3E), - /* K18 */ be_nested_str_weak(_X3C_X2Fdiv_X3E), - /* K19 */ be_nested_str_weak(_X3Cp_X3E_X3C_X2Fp_X3E_X3C_X2Ffieldset_X3E_X3Cp_X3E_X3C_X2Fp_X3E), + /* K2 */ be_const_int(0), + /* K3 */ be_nested_str_weak(device), + /* K4 */ be_nested_str_weak(plugins), + /* K5 */ be_nested_str_weak(matter), + /* K6 */ be_nested_str_weak(Plugin_Bridge_HTTP), + /* K7 */ be_nested_str_weak(http_remote), + /* K8 */ be_nested_str_weak(addr), + /* K9 */ be_nested_str_weak(contains), + /* K10 */ be_nested_str_weak(push), + /* K11 */ be_const_int(1), + /* K12 */ be_nested_str_weak(content_send), + /* K13 */ be_nested_str_weak(_X3Chr_X3E), + /* K14 */ be_nested_str_weak(_X3Ctable_X20style_X3D_X27width_X3A100_X25_X27_X3E), + /* K15 */ be_nested_str_weak(_STYLESHEET), + /* K16 */ be_nested_str_weak(keys), + /* K17 */ be_nested_str_weak(format), + /* K18 */ be_nested_str_weak(_X3Ctr_X20class_X3D_X27ztdm_X20htrm_X27_X3E_X3Ctd_X3E_X3Cb_X3E_X25s_X3C_X2Fb_X3E_X3C_X2Ftd_X3E), + /* K19 */ be_nested_str_weak(html_escape), + /* K20 */ be_nested_str_weak(web_last_seen), + /* K21 */ be_nested_str_weak(_X3Ctr_X20class_X3D_X27htrm_X27_X3E_X3Ctd_X20colspan_X3D_X272_X27_X3E), + /* K22 */ be_nested_str_weak(web_values), + /* K23 */ be_nested_str_weak(_X3C_X2Ftd_X3E_X3C_X2Ftr_X3E), + /* K24 */ be_nested_str_weak(stop_iteration), + /* K25 */ be_nested_str_weak(_X3C_X2Ftable_X3E_X3Chr_X3E), }), - be_str_weak(show_commissioning_info), + be_str_weak(show_bridge_status), &be_const_str_solidified, - ( &(const binstruction[66]) { /* code */ + ( &(const binstruction[102]) { /* code */ 0xA4060000, // 0000 IMPORT R1 K0 0xA40A0200, // 0001 IMPORT R2 K1 - 0x880C0102, // 0002 GETMBR R3 R0 K2 - 0x880C0703, // 0003 GETMBR R3 R3 K3 - 0xB8120800, // 0004 GETNGBL R4 K4 - 0x8C100905, // 0005 GETMET R4 R4 K5 - 0x7C100200, // 0006 CALL R4 1 - 0x040C0604, // 0007 SUB R3 R3 R4 - 0x541203E7, // 0008 LDINT R4 1000 - 0x0C0C0604, // 0009 DIV R3 R3 R4 - 0x14100706, // 000A LT R4 R3 K6 - 0x78120000, // 000B JMPF R4 #000D - 0x580C0006, // 000C LDCONST R3 K6 - 0x5412001D, // 000D LDINT R4 30 - 0x00100604, // 000E ADD R4 R3 R4 - 0x5416003B, // 000F LDINT R5 60 - 0x0C100805, // 0010 DIV R4 R4 R5 - 0x8C140307, // 0011 GETMET R5 R1 K7 - 0x8C1C0508, // 0012 GETMET R7 R2 K8 - 0x58240009, // 0013 LDCONST R9 K9 - 0x5C280800, // 0014 MOVE R10 R4 - 0x7C1C0600, // 0015 CALL R7 3 - 0x7C140400, // 0016 CALL R5 2 - 0x88140102, // 0017 GETMBR R5 R0 K2 - 0x8C140B0A, // 0018 GETMET R5 R5 K10 - 0x7C140200, // 0019 CALL R5 1 - 0x8C180307, // 001A GETMET R6 R1 K7 - 0x8C200508, // 001B GETMET R8 R2 K8 - 0x5828000B, // 001C LDCONST R10 K11 - 0x402E0D0C, // 001D CONNECT R11 K6 K12 - 0x942C0A0B, // 001E GETIDX R11 R5 R11 - 0x54320003, // 001F LDINT R12 4 - 0x54360005, // 0020 LDINT R13 6 - 0x4030180D, // 0021 CONNECT R12 R12 R13 - 0x94300A0C, // 0022 GETIDX R12 R5 R12 - 0x54360006, // 0023 LDINT R13 7 - 0x40341B0D, // 0024 CONNECT R13 R13 K13 - 0x94340A0D, // 0025 GETIDX R13 R5 R13 - 0x7C200A00, // 0026 CALL R8 5 + 0x4C0C0000, // 0002 LDNIL R3 + 0x58100002, // 0003 LDCONST R4 K2 + 0x6014000C, // 0004 GETGBL R5 G12 + 0x88180103, // 0005 GETMBR R6 R0 K3 + 0x88180D04, // 0006 GETMBR R6 R6 K4 + 0x7C140200, // 0007 CALL R5 1 + 0x14140805, // 0008 LT R5 R4 R5 + 0x7816001D, // 0009 JMPF R5 #0028 + 0x88140103, // 000A GETMBR R5 R0 K3 + 0x88140B04, // 000B GETMBR R5 R5 K4 + 0x94140A04, // 000C GETIDX R5 R5 R4 + 0x6018000F, // 000D GETGBL R6 G15 + 0x5C1C0A00, // 000E MOVE R7 R5 + 0xB8220A00, // 000F GETNGBL R8 K5 + 0x88201106, // 0010 GETMBR R8 R8 K6 + 0x7C180400, // 0011 CALL R6 2 + 0x781A0012, // 0012 JMPF R6 #0026 + 0x4C180000, // 0013 LDNIL R6 + 0x1C180606, // 0014 EQ R6 R3 R6 + 0x781A0002, // 0015 JMPF R6 #0019 + 0x60180013, // 0016 GETGBL R6 G19 + 0x7C180000, // 0017 CALL R6 0 + 0x5C0C0C00, // 0018 MOVE R3 R6 + 0x88180B07, // 0019 GETMBR R6 R5 K7 + 0x88180D08, // 001A GETMBR R6 R6 K8 + 0x8C1C0709, // 001B GETMET R7 R3 K9 + 0x5C240C00, // 001C MOVE R9 R6 + 0x7C1C0400, // 001D CALL R7 2 + 0x741E0002, // 001E JMPT R7 #0022 + 0x601C0012, // 001F GETGBL R7 G18 + 0x7C1C0000, // 0020 CALL R7 0 + 0x980C0C07, // 0021 SETIDX R3 R6 R7 + 0x941C0606, // 0022 GETIDX R7 R3 R6 + 0x8C1C0F0A, // 0023 GETMET R7 R7 K10 + 0x5C240A00, // 0024 MOVE R9 R5 + 0x7C1C0400, // 0025 CALL R7 2 + 0x0010090B, // 0026 ADD R4 R4 K11 + 0x7001FFDB, // 0027 JMP #0004 + 0x4C140000, // 0028 LDNIL R5 + 0x1C140605, // 0029 EQ R5 R3 R5 + 0x78160000, // 002A JMPF R5 #002C + 0x80000A00, // 002B RET 0 + 0x8C14030C, // 002C GETMET R5 R1 K12 + 0x581C000D, // 002D LDCONST R7 K13 + 0x7C140400, // 002E CALL R5 2 + 0x8C14030C, // 002F GETMET R5 R1 K12 + 0x581C000E, // 0030 LDCONST R7 K14 + 0x7C140400, // 0031 CALL R5 2 + 0x8C14030C, // 0032 GETMET R5 R1 K12 + 0xB81E0A00, // 0033 GETNGBL R7 K5 + 0x881C0F0F, // 0034 GETMBR R7 R7 K15 + 0x7C140400, // 0035 CALL R5 2 + 0x60140010, // 0036 GETGBL R5 G16 + 0x8C180710, // 0037 GETMET R6 R3 K16 + 0x7C180200, // 0038 CALL R6 1 + 0x7C140200, // 0039 CALL R5 1 + 0xA8020023, // 003A EXBLK 0 #005F + 0x5C180A00, // 003B MOVE R6 R5 + 0x7C180000, // 003C CALL R6 0 + 0x8C1C030C, // 003D GETMET R7 R1 K12 + 0x8C240511, // 003E GETMET R9 R2 K17 + 0x582C0012, // 003F LDCONST R11 K18 + 0x8C300313, // 0040 GETMET R12 R1 K19 + 0x5C380C00, // 0041 MOVE R14 R6 + 0x7C300400, // 0042 CALL R12 2 + 0x7C240600, // 0043 CALL R9 3 + 0x7C1C0400, // 0044 CALL R7 2 + 0x941C0606, // 0045 GETIDX R7 R3 R6 + 0x941C0F02, // 0046 GETIDX R7 R7 K2 + 0x881C0F07, // 0047 GETMBR R7 R7 K7 + 0x8C20030C, // 0048 GETMET R8 R1 K12 + 0x8C280F14, // 0049 GETMET R10 R7 K20 + 0x7C280200, // 004A CALL R10 1 + 0x7C200400, // 004B CALL R8 2 + 0x60200010, // 004C GETGBL R8 G16 + 0x94240606, // 004D GETIDX R9 R3 R6 + 0x7C200200, // 004E CALL R8 1 + 0xA802000A, // 004F EXBLK 0 #005B + 0x5C241000, // 0050 MOVE R9 R8 + 0x7C240000, // 0051 CALL R9 0 + 0x8C28030C, // 0052 GETMET R10 R1 K12 + 0x58300015, // 0053 LDCONST R12 K21 + 0x7C280400, // 0054 CALL R10 2 + 0x8C281316, // 0055 GETMET R10 R9 K22 + 0x7C280200, // 0056 CALL R10 1 + 0x8C28030C, // 0057 GETMET R10 R1 K12 + 0x58300017, // 0058 LDCONST R12 K23 + 0x7C280400, // 0059 CALL R10 2 + 0x7001FFF4, // 005A JMP #0050 + 0x58200018, // 005B LDCONST R8 K24 + 0xAC200200, // 005C CATCH R8 1 0 + 0xB0080000, // 005D RAISE 2 R0 R0 + 0x7001FFDB, // 005E JMP #003B + 0x58140018, // 005F LDCONST R5 K24 + 0xAC140200, // 0060 CATCH R5 1 0 + 0xB0080000, // 0061 RAISE 2 R0 R0 + 0x8C14030C, // 0062 GETMET R5 R1 K12 + 0x581C0019, // 0063 LDCONST R7 K25 + 0x7C140400, // 0064 CALL R5 2 + 0x80000000, // 0065 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: plugin_option +********************************************************************/ +be_local_closure(Matter_UI_plugin_option, /* name */ + be_nested_proto( + 17, /* nstack */ + 3, /* argc */ + 3, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[17]) { /* constants */ + /* K0 */ be_nested_str_weak(webserver), + /* K1 */ be_nested_str_weak(string), + /* K2 */ be_nested_str_weak(split), + /* K3 */ be_nested_str_weak(_X7C), + /* K4 */ be_nested_str_weak(stop_iteration), + /* K5 */ be_const_int(0), + /* K6 */ be_nested_str_weak(), + /* K7 */ be_nested_str_weak(content_send), + /* K8 */ be_nested_str_weak(_X3Coption_X20value_X3D_X27_X27_X3E_X3C_X2Foption_X3E), + /* K9 */ be_nested_str_weak(_X2Dhttp), + /* K10 */ be_nested_str_weak(_X3Coption_X20value_X3D_X27_X27_X20disabled_X3E_X2D_X2D_X2D_X20Tasmota_X20Remote_X20_X2D_X2D_X2D_X3C_X2Foption_X3E), + /* K11 */ be_nested_str_weak(device), + /* K12 */ be_nested_str_weak(get_plugin_class_displayname), + /* K13 */ be_nested_str_weak(format), + /* K14 */ be_nested_str_weak(_X3Coption_X20value_X3D_X27_X25s_X27_X25s_X3E_X25s_X3C_X2Foption_X3E), + /* K15 */ be_nested_str_weak(_X20selected), + /* K16 */ be_const_int(1), + }), + be_str_weak(plugin_option), + &be_const_str_solidified, + ( &(const binstruction[57]) { /* code */ + 0xA40E0000, // 0000 IMPORT R3 K0 + 0xA4120200, // 0001 IMPORT R4 K1 + 0x60140012, // 0002 GETGBL R5 G18 + 0x7C140000, // 0003 CALL R5 0 + 0x60180010, // 0004 GETGBL R6 G16 + 0x5C1C0400, // 0005 MOVE R7 R2 + 0x7C180200, // 0006 CALL R6 1 + 0xA8020007, // 0007 EXBLK 0 #0010 + 0x5C1C0C00, // 0008 MOVE R7 R6 + 0x7C1C0000, // 0009 CALL R7 0 + 0x8C200902, // 000A GETMET R8 R4 K2 + 0x5C280E00, // 000B MOVE R10 R7 + 0x582C0003, // 000C LDCONST R11 K3 + 0x7C200600, // 000D CALL R8 3 + 0x00140A08, // 000E ADD R5 R5 R8 + 0x7001FFF7, // 000F JMP #0008 + 0x58180004, // 0010 LDCONST R6 K4 + 0xAC180200, // 0011 CATCH R6 1 0 + 0xB0080000, // 0012 RAISE 2 R0 R0 + 0x58180005, // 0013 LDCONST R6 K5 + 0x601C000C, // 0014 GETGBL R7 G12 + 0x5C200A00, // 0015 MOVE R8 R5 + 0x7C1C0200, // 0016 CALL R7 1 + 0x141C0C07, // 0017 LT R7 R6 R7 + 0x781E001E, // 0018 JMPF R7 #0038 + 0x941C0A06, // 0019 GETIDX R7 R5 R6 + 0x1C200F06, // 001A EQ R8 R7 K6 + 0x78220003, // 001B JMPF R8 #0020 + 0x8C200707, // 001C GETMET R8 R3 K7 + 0x58280008, // 001D LDCONST R10 K8 + 0x7C200400, // 001E CALL R8 2 + 0x70020015, // 001F JMP #0036 + 0x1C200F09, // 0020 EQ R8 R7 K9 + 0x78220003, // 0021 JMPF R8 #0026 + 0x8C200707, // 0022 GETMET R8 R3 K7 + 0x5828000A, // 0023 LDCONST R10 K10 + 0x7C200400, // 0024 CALL R8 2 + 0x7002000F, // 0025 JMP #0036 + 0x8820010B, // 0026 GETMBR R8 R0 K11 + 0x8C20110C, // 0027 GETMET R8 R8 K12 + 0x5C280E00, // 0028 MOVE R10 R7 + 0x7C200400, // 0029 CALL R8 2 + 0x8C240707, // 002A GETMET R9 R3 K7 + 0x8C2C090D, // 002B GETMET R11 R4 K13 + 0x5834000E, // 002C LDCONST R13 K14 + 0x5C380E00, // 002D MOVE R14 R7 + 0x1C3C0E01, // 002E EQ R15 R7 R1 + 0x783E0001, // 002F JMPF R15 #0032 + 0x583C000F, // 0030 LDCONST R15 K15 + 0x70020000, // 0031 JMP #0033 + 0x583C0006, // 0032 LDCONST R15 K6 + 0x5C401000, // 0033 MOVE R16 R8 + 0x7C2C0A00, // 0034 CALL R11 5 + 0x7C240400, // 0035 CALL R9 2 + 0x00180D10, // 0036 ADD R6 R6 K16 + 0x7001FFDB, // 0037 JMP #0014 + 0x80000000, // 0038 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: init +********************************************************************/ +be_local_closure(Matter_UI_init, /* name */ + be_nested_proto( + 5, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 3]) { /* constants */ + /* K0 */ be_nested_str_weak(device), + /* K1 */ be_nested_str_weak(tasmota), + /* K2 */ be_nested_str_weak(add_driver), + }), + be_str_weak(init), + &be_const_str_solidified, + ( &(const binstruction[ 6]) { /* code */ + 0x90020001, // 0000 SETMBR R0 K0 R1 + 0xB80A0200, // 0001 GETNGBL R2 K1 + 0x8C080502, // 0002 GETMET R2 R2 K2 + 0x5C100000, // 0003 MOVE R4 R0 + 0x7C080400, // 0004 CALL R2 2 + 0x80000000, // 0005 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: page_part_ctl +********************************************************************/ +be_local_closure(Matter_UI_page_part_ctl, /* name */ + be_nested_proto( + 25, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[97]) { /* constants */ + /* K0 */ be_nested_str_weak(webserver), + /* K1 */ be_nested_str_weak(check_privileged_access), + /* K2 */ be_nested_str_weak(string), + /* K3 */ be_nested_str_weak(partition_core), + /* K4 */ be_nested_str_weak(persist), + /* K5 */ be_const_int(0), + /* K6 */ be_nested_str_weak(arg_size), + /* K7 */ be_const_int(1), + /* K8 */ be_nested_str_weak(tasmota), + /* K9 */ be_nested_str_weak(log), + /* K10 */ be_nested_str_weak(format), + /* K11 */ be_nested_str_weak(MTR_X3A_X20Arg_X25i_X20_X27_X25s_X27_X20_X3D_X20_X27_X25s_X27), + /* K12 */ be_nested_str_weak(arg_name), + /* K13 */ be_nested_str_weak(arg), + /* K14 */ be_nested_str_weak(stop_iteration), + /* K15 */ be_nested_str_weak(has_arg), + /* K16 */ be_nested_str_weak(passcode), + /* K17 */ be_nested_str_weak(discriminator), + /* K18 */ be_nested_str_weak(MTR_X3A_X20_X2Fmatterc_X20received_X20_X27_X25s_X27_X20command), + /* K19 */ be_const_int(3), + /* K20 */ be_nested_str_weak(device), + /* K21 */ be_nested_str_weak(root_passcode), + /* K22 */ be_nested_str_weak(root_discriminator), + /* K23 */ be_nested_str_weak(ipv4only), + /* K24 */ be_nested_str_weak(ipv4), + /* K25 */ be_nested_str_weak(on), + /* K26 */ be_nested_str_weak(save_param), + /* K27 */ be_nested_str_weak(redirect), + /* K28 */ be_nested_str_weak(_X2F_X3Frst_X3D), + /* K29 */ be_nested_str_weak(save), + /* K30 */ be_nested_str_weak(menable), + /* K31 */ be_nested_str_weak(comm), + /* K32 */ be_nested_str_weak(matter_enabled), + /* K33 */ be_nested_str_weak(enable), + /* K34 */ be_nested_str_weak(cmd), + /* K35 */ be_nested_str_weak(SetOption), + /* K36 */ be_nested_str_weak(matter), + /* K37 */ be_nested_str_weak(MATTER_OPTION), + /* K38 */ be_nested_str_weak(_X201), + /* K39 */ be_nested_str_weak(disable), + /* K40 */ be_nested_str_weak(_X200), + /* K41 */ be_nested_str_weak(commissioning_open), + /* K42 */ be_nested_str_weak(start_root_basic_commissioning), + /* K43 */ be_nested_str_weak(stop_basic_commissioning), + /* K44 */ be_nested_str_weak(_X2F), + /* K45 */ be_nested_str_weak(del_fabric), + /* K46 */ be_nested_str_weak(sessions), + /* K47 */ be_nested_str_weak(fabrics), + /* K48 */ be_nested_str_weak(get_fabric_index), + /* K49 */ be_nested_str_weak(remove_fabric), + /* K50 */ be_nested_str_weak(_X2Fmatterc_X3F), + /* K51 */ be_nested_str_weak(auto), + /* K52 */ be_nested_str_weak(plugins_persist), + /* K53 */ be_nested_str_weak(config), + /* K54 */ be_nested_str_weak(find), + /* K55 */ be_const_int(2147483647), + /* K56 */ be_nested_str_weak(plugins_config), + /* K57 */ be_nested_str_weak(plugins_classes), + /* K58 */ be_nested_str_weak(type), + /* K59 */ be_nested_str_weak(), + /* K60 */ be_nested_str_weak(MTR_X3A_X20ep_X3D_X25i_X20arg_X3D_X25s), + /* K61 */ be_nested_str_weak(ui_conf_to_string), + /* K62 */ be_nested_str_weak(MTR_X3A_X20ep_X3D_X25i_X20prev_arg_X3D_X27_X25s_X27_X20arg_X3D_X27_X25s_X27_X20_X25s), + /* K63 */ be_nested_str_weak(changed), + /* K64 */ be_nested_str_weak(ui_string_to_conf), + /* K65 */ be_nested_str_weak(find_plugin_by_endpoint), + /* K66 */ be_nested_str_weak(MTR_X3A_X20apply_X20conf_X20_X27_X25s_X27_X20_X28_X25i_X29_X20to_X20_X25s), + /* K67 */ be_nested_str_weak(parse_configuration), + /* K68 */ be_nested_str_weak(MTR_X3A_X20ep_X3D_X25i_X20not_X20found), + /* K69 */ be_nested_str_weak(MTR_X3A_X20config_X20_X3D_X20_X25s), + /* K70 */ be_nested_str_weak(MTR_X3A_X20config_X20error_X20_X3D_X20_X25s), + /* K71 */ be_nested_str_weak(_X2Fcn_X3F), + /* K72 */ be_nested_str_weak(addep), + /* K73 */ be_nested_str_weak(pi), + /* K74 */ be_nested_str_weak(MTR_X3A_X20add_X20endpoint_X20typ_X3D_X27_X25s_X27_X20arg_X3D_X27_X25s_X27), + /* K75 */ be_nested_str_weak(bridge_add_endpoint), + /* K76 */ be_nested_str_weak(addrem), + /* K77 */ be_nested_str_weak(url), + /* K78 */ be_nested_str_weak(value_error), + /* K79 */ be_nested_str_weak(url_X20shouldn_X27t_X20be_X20null), + /* K80 */ be_nested_str_weak(equal_map), + /* K81 */ be_nested_str_weak(MTR_X3A_X20remote_X20add_X20url_X3D_X27_X25s_X27_X20type_X3D_X27_X25s_X27_X20arg_X3D_X27_X25s_X27), + /* K82 */ be_nested_str_weak(del), + /* K83 */ be_nested_str_weak(MTR_X3A_X20deleting_X20endpoint_X20_X25i), + /* K84 */ be_const_int(2), + /* K85 */ be_nested_str_weak(bridge_remove_endpoint), + /* K86 */ be_nested_str_weak(content_start), + /* K87 */ be_nested_str_weak(Parameter_X20error), + /* K88 */ be_nested_str_weak(content_send_style), + /* K89 */ be_nested_str_weak(content_send), + /* K90 */ be_nested_str_weak(_X3Cp_X20style_X3D_X27width_X3A340px_X3B_X27_X3E_X3Cb_X3EError_X3A_X3C_X2Fb_X3E_X25s_X3C_X2Fp_X3E), + /* K91 */ be_nested_str_weak(html_escape), + /* K92 */ be_nested_str_weak(content_button), + /* K93 */ be_nested_str_weak(BUTTON_CONFIGURATION), + /* K94 */ be_nested_str_weak(content_stop), + /* K95 */ be_nested_str_weak(BRY_X3A_X20Exception_X3E_X20_X27_X25s_X27_X20_X2D_X20_X25s), + /* K96 */ be_nested_str_weak(_X3Cp_X20style_X3D_X27width_X3A340px_X3B_X27_X3E_X3Cb_X3EException_X3A_X3C_X2Fb_X3E_X3Cbr_X3E_X27_X25s_X27_X3Cbr_X3E_X25s_X3C_X2Fp_X3E), + }), + be_str_weak(page_part_ctl), + &be_const_str_solidified, + ( &(const binstruction[628]) { /* code */ + 0xA4060000, // 0000 IMPORT R1 K0 + 0x8C080301, // 0001 GETMET R2 R1 K1 + 0x7C080200, // 0002 CALL R2 1 + 0x740A0001, // 0003 JMPT R2 #0006 + 0x4C080000, // 0004 LDNIL R2 + 0x80040400, // 0005 RET 1 R2 + 0xA40A0400, // 0006 IMPORT R2 K2 + 0xA40E0600, // 0007 IMPORT R3 K3 + 0xA4120800, // 0008 IMPORT R4 K4 + 0x4C140000, // 0009 LDNIL R5 + 0xA8020249, // 000A EXBLK 0 #0255 + 0x60180010, // 000B GETGBL R6 G16 + 0x8C1C0306, // 000C GETMET R7 R1 K6 + 0x7C1C0200, // 000D CALL R7 1 + 0x041C0F07, // 000E SUB R7 R7 K7 + 0x401E0A07, // 000F CONNECT R7 K5 R7 + 0x7C180200, // 0010 CALL R6 1 + 0xA802000F, // 0011 EXBLK 0 #0022 + 0x5C1C0C00, // 0012 MOVE R7 R6 + 0x7C1C0000, // 0013 CALL R7 0 + 0xB8221000, // 0014 GETNGBL R8 K8 + 0x8C201109, // 0015 GETMET R8 R8 K9 + 0x8C28050A, // 0016 GETMET R10 R2 K10 + 0x5830000B, // 0017 LDCONST R12 K11 + 0x5C340E00, // 0018 MOVE R13 R7 + 0x8C38030C, // 0019 GETMET R14 R1 K12 + 0x5C400E00, // 001A MOVE R16 R7 + 0x7C380400, // 001B CALL R14 2 + 0x8C3C030D, // 001C GETMET R15 R1 K13 + 0x5C440E00, // 001D MOVE R17 R7 + 0x7C3C0400, // 001E CALL R15 2 + 0x7C280A00, // 001F CALL R10 5 + 0x7C200400, // 0020 CALL R8 2 + 0x7001FFEF, // 0021 JMP #0012 + 0x5818000E, // 0022 LDCONST R6 K14 + 0xAC180200, // 0023 CATCH R6 1 0 + 0xB0080000, // 0024 RAISE 2 R0 R0 + 0x8C18030F, // 0025 GETMET R6 R1 K15 + 0x58200010, // 0026 LDCONST R8 K16 0x7C180400, // 0027 CALL R6 2 - 0x8C180307, // 0028 GETMET R6 R1 K7 - 0x8C200508, // 0029 GETMET R8 R2 K8 - 0x5828000E, // 002A LDCONST R10 K14 - 0x7C200400, // 002B CALL R8 2 - 0x7C180400, // 002C CALL R6 2 - 0x88180102, // 002D GETMBR R6 R0 K2 - 0x8C180D0F, // 002E GETMET R6 R6 K15 - 0x7C180200, // 002F CALL R6 1 - 0x8C1C0110, // 0030 GETMET R7 R0 K16 - 0x5C240C00, // 0031 MOVE R9 R6 - 0x7C1C0400, // 0032 CALL R7 2 - 0x8C1C0307, // 0033 GETMET R7 R1 K7 - 0x8C240508, // 0034 GETMET R9 R2 K8 - 0x582C0011, // 0035 LDCONST R11 K17 - 0x5C300C00, // 0036 MOVE R12 R6 - 0x7C240600, // 0037 CALL R9 3 - 0x7C1C0400, // 0038 CALL R7 2 - 0x8C1C0307, // 0039 GETMET R7 R1 K7 - 0x8C240508, // 003A GETMET R9 R2 K8 - 0x582C0012, // 003B LDCONST R11 K18 - 0x7C240400, // 003C CALL R9 2 - 0x7C1C0400, // 003D CALL R7 2 - 0x8C1C0307, // 003E GETMET R7 R1 K7 - 0x58240013, // 003F LDCONST R9 K19 - 0x7C1C0400, // 0040 CALL R7 2 - 0x80000000, // 0041 RET 0 + 0x741A0003, // 0028 JMPT R6 #002D + 0x8C18030F, // 0029 GETMET R6 R1 K15 + 0x58200011, // 002A LDCONST R8 K17 + 0x7C180400, // 002B CALL R6 2 + 0x781A002A, // 002C JMPF R6 #0058 + 0xB81A1000, // 002D GETNGBL R6 K8 + 0x8C180D09, // 002E GETMET R6 R6 K9 + 0x8C20050A, // 002F GETMET R8 R2 K10 + 0x58280012, // 0030 LDCONST R10 K18 + 0x582C0010, // 0031 LDCONST R11 K16 + 0x7C200600, // 0032 CALL R8 3 + 0x58240013, // 0033 LDCONST R9 K19 + 0x7C180600, // 0034 CALL R6 3 + 0x8C18030F, // 0035 GETMET R6 R1 K15 + 0x58200010, // 0036 LDCONST R8 K16 + 0x7C180400, // 0037 CALL R6 2 + 0x781A0006, // 0038 JMPF R6 #0040 + 0x88180114, // 0039 GETMBR R6 R0 K20 + 0x601C0009, // 003A GETGBL R7 G9 + 0x8C20030D, // 003B GETMET R8 R1 K13 + 0x58280010, // 003C LDCONST R10 K16 + 0x7C200400, // 003D CALL R8 2 + 0x7C1C0200, // 003E CALL R7 1 + 0x901A2A07, // 003F SETMBR R6 K21 R7 + 0x8C18030F, // 0040 GETMET R6 R1 K15 + 0x58200011, // 0041 LDCONST R8 K17 + 0x7C180400, // 0042 CALL R6 2 + 0x781A0006, // 0043 JMPF R6 #004B + 0x88180114, // 0044 GETMBR R6 R0 K20 + 0x601C0009, // 0045 GETGBL R7 G9 + 0x8C20030D, // 0046 GETMET R8 R1 K13 + 0x58280011, // 0047 LDCONST R10 K17 + 0x7C200400, // 0048 CALL R8 2 + 0x7C1C0200, // 0049 CALL R7 1 + 0x901A2C07, // 004A SETMBR R6 K22 R7 + 0x88180114, // 004B GETMBR R6 R0 K20 + 0x8C1C030D, // 004C GETMET R7 R1 K13 + 0x58240018, // 004D LDCONST R9 K24 + 0x7C1C0400, // 004E CALL R7 2 + 0x1C1C0F19, // 004F EQ R7 R7 K25 + 0x901A2E07, // 0050 SETMBR R6 K23 R7 + 0x88180114, // 0051 GETMBR R6 R0 K20 + 0x8C180D1A, // 0052 GETMET R6 R6 K26 + 0x7C180200, // 0053 CALL R6 1 + 0x8C18031B, // 0054 GETMET R6 R1 K27 + 0x5820001C, // 0055 LDCONST R8 K28 + 0x7C180400, // 0056 CALL R6 2 + 0x700201E7, // 0057 JMP #0240 + 0x8C18030F, // 0058 GETMET R6 R1 K15 + 0x5820001D, // 0059 LDCONST R8 K29 + 0x7C180400, // 005A CALL R6 2 + 0x781A0047, // 005B JMPF R6 #00A4 + 0x8C18030F, // 005C GETMET R6 R1 K15 + 0x5820001E, // 005D LDCONST R8 K30 + 0x7C180400, // 005E CALL R6 2 + 0x8C1C030F, // 005F GETMET R7 R1 K15 + 0x5824001F, // 0060 LDCONST R9 K31 + 0x7C1C0400, // 0061 CALL R7 2 + 0x8C200120, // 0062 GETMET R8 R0 K32 + 0x7C200200, // 0063 CALL R8 1 + 0x20200C08, // 0064 NE R8 R6 R8 + 0x78220027, // 0065 JMPF R8 #008E + 0x781A0011, // 0066 JMPF R6 #0079 + 0xB8221000, // 0067 GETNGBL R8 K8 + 0x8C201109, // 0068 GETMET R8 R8 K9 + 0x8C28050A, // 0069 GETMET R10 R2 K10 + 0x58300012, // 006A LDCONST R12 K18 + 0x58340021, // 006B LDCONST R13 K33 + 0x7C280600, // 006C CALL R10 3 + 0x582C0013, // 006D LDCONST R11 K19 + 0x7C200600, // 006E CALL R8 3 + 0xB8221000, // 006F GETNGBL R8 K8 + 0x8C201122, // 0070 GETMET R8 R8 K34 + 0x60280008, // 0071 GETGBL R10 G8 + 0xB82E4800, // 0072 GETNGBL R11 K36 + 0x882C1725, // 0073 GETMBR R11 R11 K37 + 0x7C280200, // 0074 CALL R10 1 + 0x002A460A, // 0075 ADD R10 K35 R10 + 0x00281526, // 0076 ADD R10 R10 K38 + 0x7C200400, // 0077 CALL R8 2 + 0x70020010, // 0078 JMP #008A + 0xB8221000, // 0079 GETNGBL R8 K8 + 0x8C201109, // 007A GETMET R8 R8 K9 + 0x8C28050A, // 007B GETMET R10 R2 K10 + 0x58300012, // 007C LDCONST R12 K18 + 0x58340027, // 007D LDCONST R13 K39 + 0x7C280600, // 007E CALL R10 3 + 0x582C0013, // 007F LDCONST R11 K19 + 0x7C200600, // 0080 CALL R8 3 + 0xB8221000, // 0081 GETNGBL R8 K8 + 0x8C201122, // 0082 GETMET R8 R8 K34 + 0x60280008, // 0083 GETGBL R10 G8 + 0xB82E4800, // 0084 GETNGBL R11 K36 + 0x882C1725, // 0085 GETMBR R11 R11 K37 + 0x7C280200, // 0086 CALL R10 1 + 0x002A460A, // 0087 ADD R10 K35 R10 + 0x00281528, // 0088 ADD R10 R10 K40 + 0x7C200400, // 0089 CALL R8 2 + 0x8C20031B, // 008A GETMET R8 R1 K27 + 0x5828001C, // 008B LDCONST R10 K28 + 0x7C200400, // 008C CALL R8 2 + 0x70020014, // 008D JMP #00A3 + 0x88200114, // 008E GETMBR R8 R0 K20 + 0x88201129, // 008F GETMBR R8 R8 K41 + 0x4C240000, // 0090 LDNIL R9 + 0x20201009, // 0091 NE R8 R8 R9 + 0x20200E08, // 0092 NE R8 R7 R8 + 0x7822000B, // 0093 JMPF R8 #00A0 + 0x781E0003, // 0094 JMPF R7 #0099 + 0x88200114, // 0095 GETMBR R8 R0 K20 + 0x8C20112A, // 0096 GETMET R8 R8 K42 + 0x7C200200, // 0097 CALL R8 1 + 0x70020002, // 0098 JMP #009C + 0x88200114, // 0099 GETMBR R8 R0 K20 + 0x8C20112B, // 009A GETMET R8 R8 K43 + 0x7C200200, // 009B CALL R8 1 + 0x8C20031B, // 009C GETMET R8 R1 K27 + 0x5828002C, // 009D LDCONST R10 K44 + 0x7C200400, // 009E CALL R8 2 + 0x70020002, // 009F JMP #00A3 + 0x8C20031B, // 00A0 GETMET R8 R1 K27 + 0x5828002C, // 00A1 LDCONST R10 K44 + 0x7C200400, // 00A2 CALL R8 2 + 0x7002019B, // 00A3 JMP #0240 + 0x8C18030F, // 00A4 GETMET R6 R1 K15 + 0x5820002D, // 00A5 LDCONST R8 K45 + 0x7C180400, // 00A6 CALL R6 2 + 0x781A0026, // 00A7 JMPF R6 #00CF + 0xB81A1000, // 00A8 GETNGBL R6 K8 + 0x8C180D09, // 00A9 GETMET R6 R6 K9 + 0x8C20050A, // 00AA GETMET R8 R2 K10 + 0x58280012, // 00AB LDCONST R10 K18 + 0x582C002D, // 00AC LDCONST R11 K45 + 0x7C200600, // 00AD CALL R8 3 + 0x58240013, // 00AE LDCONST R9 K19 + 0x7C180600, // 00AF CALL R6 3 + 0x60180009, // 00B0 GETGBL R6 G9 + 0x8C1C030D, // 00B1 GETMET R7 R1 K13 + 0x5824002D, // 00B2 LDCONST R9 K45 + 0x7C1C0400, // 00B3 CALL R7 2 + 0x7C180200, // 00B4 CALL R6 1 + 0x581C0005, // 00B5 LDCONST R7 K5 + 0x88200114, // 00B6 GETMBR R8 R0 K20 + 0x8820112E, // 00B7 GETMBR R8 R8 K46 + 0x8820112F, // 00B8 GETMBR R8 R8 K47 + 0x6024000C, // 00B9 GETGBL R9 G12 + 0x5C281000, // 00BA MOVE R10 R8 + 0x7C240200, // 00BB CALL R9 1 + 0x14240E09, // 00BC LT R9 R7 R9 + 0x7826000C, // 00BD JMPF R9 #00CB + 0x94241007, // 00BE GETIDX R9 R8 R7 + 0x8C241330, // 00BF GETMET R9 R9 K48 + 0x7C240200, // 00C0 CALL R9 1 + 0x1C241206, // 00C1 EQ R9 R9 R6 + 0x78260005, // 00C2 JMPF R9 #00C9 + 0x88240114, // 00C3 GETMBR R9 R0 K20 + 0x8C241331, // 00C4 GETMET R9 R9 K49 + 0x942C1007, // 00C5 GETIDX R11 R8 R7 + 0x7C240400, // 00C6 CALL R9 2 + 0x70020002, // 00C7 JMP #00CB + 0x70020000, // 00C8 JMP #00CA + 0x001C0F07, // 00C9 ADD R7 R7 K7 + 0x7001FFED, // 00CA JMP #00B9 + 0x8C24031B, // 00CB GETMET R9 R1 K27 + 0x582C0032, // 00CC LDCONST R11 K50 + 0x7C240400, // 00CD CALL R9 2 + 0x70020170, // 00CE JMP #0240 + 0x8C18030F, // 00CF GETMET R6 R1 K15 + 0x58200033, // 00D0 LDCONST R8 K51 + 0x7C180400, // 00D1 CALL R6 2 + 0x781A0011, // 00D2 JMPF R6 #00E5 + 0xB81A1000, // 00D3 GETNGBL R6 K8 + 0x8C180D09, // 00D4 GETMET R6 R6 K9 + 0x8C20050A, // 00D5 GETMET R8 R2 K10 + 0x58280012, // 00D6 LDCONST R10 K18 + 0x582C0033, // 00D7 LDCONST R11 K51 + 0x7C200600, // 00D8 CALL R8 3 + 0x58240013, // 00D9 LDCONST R9 K19 + 0x7C180600, // 00DA CALL R6 3 + 0x88180114, // 00DB GETMBR R6 R0 K20 + 0x501C0000, // 00DC LDBOOL R7 0 0 + 0x901A6807, // 00DD SETMBR R6 K52 R7 + 0x88180114, // 00DE GETMBR R6 R0 K20 + 0x8C180D1A, // 00DF GETMET R6 R6 K26 + 0x7C180200, // 00E0 CALL R6 1 + 0x8C18031B, // 00E1 GETMET R6 R1 K27 + 0x5820001C, // 00E2 LDCONST R8 K28 + 0x7C180400, // 00E3 CALL R6 2 + 0x7002015A, // 00E4 JMP #0240 + 0x8C18030F, // 00E5 GETMET R6 R1 K15 + 0x58200035, // 00E6 LDCONST R8 K53 + 0x7C180400, // 00E7 CALL R6 2 + 0x781A009C, // 00E8 JMPF R6 #0186 + 0xB81A1000, // 00E9 GETNGBL R6 K8 + 0x8C180D09, // 00EA GETMET R6 R6 K9 + 0x8C20050A, // 00EB GETMET R8 R2 K10 + 0x58280012, // 00EC LDCONST R10 K18 + 0x582C0035, // 00ED LDCONST R11 K53 + 0x7C200600, // 00EE CALL R8 3 + 0x58240013, // 00EF LDCONST R9 K19 + 0x7C180600, // 00F0 CALL R6 3 + 0x50180000, // 00F1 LDBOOL R6 0 0 + 0x601C0010, // 00F2 GETGBL R7 G16 + 0x8C200306, // 00F3 GETMET R8 R1 K6 + 0x7C200200, // 00F4 CALL R8 1 + 0x04201107, // 00F5 SUB R8 R8 K7 + 0x40220A08, // 00F6 CONNECT R8 K5 R8 + 0x7C1C0200, // 00F7 CALL R7 1 + 0xA8020066, // 00F8 EXBLK 0 #0160 + 0x5C200E00, // 00F9 MOVE R8 R7 + 0x7C200000, // 00FA CALL R8 0 + 0x8C24030C, // 00FB GETMET R9 R1 K12 + 0x5C2C1000, // 00FC MOVE R11 R8 + 0x7C240400, // 00FD CALL R9 2 + 0x8C280536, // 00FE GETMET R10 R2 K54 + 0x5C301200, // 00FF MOVE R12 R9 + 0x5834000D, // 0100 LDCONST R13 K13 + 0x7C280600, // 0101 CALL R10 3 + 0x1C281505, // 0102 EQ R10 R10 K5 + 0x782A005A, // 0103 JMPF R10 #015F + 0x60280009, // 0104 GETGBL R10 G9 + 0x402E2737, // 0105 CONNECT R11 K19 K55 + 0x942C120B, // 0106 GETIDX R11 R9 R11 + 0x7C280200, // 0107 CALL R10 1 + 0x8C2C030D, // 0108 GETMET R11 R1 K13 + 0x5C341000, // 0109 MOVE R13 R8 + 0x7C2C0400, // 010A CALL R11 2 + 0x88300114, // 010B GETMBR R12 R0 K20 + 0x88301938, // 010C GETMBR R12 R12 K56 + 0x8C301936, // 010D GETMET R12 R12 K54 + 0x60380008, // 010E GETGBL R14 G8 + 0x5C3C1400, // 010F MOVE R15 R10 + 0x7C380200, // 0110 CALL R14 1 + 0x7C300400, // 0111 CALL R12 2 + 0x4C340000, // 0112 LDNIL R13 + 0x2034180D, // 0113 NE R13 R12 R13 + 0x78360041, // 0114 JMPF R13 #0157 + 0x88340114, // 0115 GETMBR R13 R0 K20 + 0x88341B39, // 0116 GETMBR R13 R13 K57 + 0x8C341B36, // 0117 GETMET R13 R13 K54 + 0x8C3C1936, // 0118 GETMET R15 R12 K54 + 0x5844003A, // 0119 LDCONST R17 K58 + 0x5848003B, // 011A LDCONST R18 K59 + 0x7C3C0600, // 011B CALL R15 3 + 0x7C340400, // 011C CALL R13 2 + 0x4C380000, // 011D LDNIL R14 + 0x20381A0E, // 011E NE R14 R13 R14 + 0x783A0035, // 011F JMPF R14 #0156 + 0xB83A1000, // 0120 GETNGBL R14 K8 + 0x8C381D09, // 0121 GETMET R14 R14 K9 + 0x8C40050A, // 0122 GETMET R16 R2 K10 + 0x5848003C, // 0123 LDCONST R18 K60 + 0x5C4C1400, // 0124 MOVE R19 R10 + 0x5C501600, // 0125 MOVE R20 R11 + 0x7C400800, // 0126 CALL R16 4 + 0x58440013, // 0127 LDCONST R17 K19 + 0x7C380600, // 0128 CALL R14 3 + 0x8C381B3D, // 0129 GETMET R14 R13 K61 + 0x5C401A00, // 012A MOVE R16 R13 + 0x5C441800, // 012B MOVE R17 R12 + 0x7C380600, // 012C CALL R14 3 + 0x203C1C0B, // 012D NE R15 R14 R11 + 0xB8421000, // 012E GETNGBL R16 K8 + 0x8C402109, // 012F GETMET R16 R16 K9 + 0x8C48050A, // 0130 GETMET R18 R2 K10 + 0x5850003E, // 0131 LDCONST R20 K62 + 0x5C541400, // 0132 MOVE R21 R10 + 0x5C581C00, // 0133 MOVE R22 R14 + 0x5C5C1600, // 0134 MOVE R23 R11 + 0x20601C0B, // 0135 NE R24 R14 R11 + 0x78620001, // 0136 JMPF R24 #0139 + 0x5860003F, // 0137 LDCONST R24 K63 + 0x70020000, // 0138 JMP #013A + 0x5860003B, // 0139 LDCONST R24 K59 + 0x7C480C00, // 013A CALL R18 6 + 0x584C0013, // 013B LDCONST R19 K19 + 0x7C400600, // 013C CALL R16 3 + 0x783E0017, // 013D JMPF R15 #0156 + 0x50180200, // 013E LDBOOL R6 1 0 + 0x8C401B40, // 013F GETMET R16 R13 K64 + 0x5C481A00, // 0140 MOVE R18 R13 + 0x5C4C1800, // 0141 MOVE R19 R12 + 0x5C501600, // 0142 MOVE R20 R11 + 0x7C400800, // 0143 CALL R16 4 + 0x88400114, // 0144 GETMBR R16 R0 K20 + 0x8C402141, // 0145 GETMET R16 R16 K65 + 0x5C481400, // 0146 MOVE R18 R10 + 0x7C400400, // 0147 CALL R16 2 + 0x7842000C, // 0148 JMPF R16 #0156 + 0xB8461000, // 0149 GETNGBL R17 K8 + 0x8C442309, // 014A GETMET R17 R17 K9 + 0x8C4C050A, // 014B GETMET R19 R2 K10 + 0x58540042, // 014C LDCONST R21 K66 + 0x5C581800, // 014D MOVE R22 R12 + 0x5C5C1400, // 014E MOVE R23 R10 + 0x5C602000, // 014F MOVE R24 R16 + 0x7C4C0A00, // 0150 CALL R19 5 + 0x58500013, // 0151 LDCONST R20 K19 + 0x7C440600, // 0152 CALL R17 3 + 0x8C442143, // 0153 GETMET R17 R16 K67 + 0x5C4C1800, // 0154 MOVE R19 R12 + 0x7C440400, // 0155 CALL R17 2 + 0x70020007, // 0156 JMP #015F + 0xB8361000, // 0157 GETNGBL R13 K8 + 0x8C341B09, // 0158 GETMET R13 R13 K9 + 0x8C3C050A, // 0159 GETMET R15 R2 K10 + 0x58440044, // 015A LDCONST R17 K68 + 0x5C481400, // 015B MOVE R18 R10 + 0x7C3C0600, // 015C CALL R15 3 + 0x58400013, // 015D LDCONST R16 K19 + 0x7C340600, // 015E CALL R13 3 + 0x7001FF98, // 015F JMP #00F9 + 0x581C000E, // 0160 LDCONST R7 K14 + 0xAC1C0200, // 0161 CATCH R7 1 0 + 0xB0080000, // 0162 RAISE 2 R0 R0 + 0xB81E1000, // 0163 GETNGBL R7 K8 + 0x8C1C0F09, // 0164 GETMET R7 R7 K9 + 0x8C24050A, // 0165 GETMET R9 R2 K10 + 0x582C0045, // 0166 LDCONST R11 K69 + 0x60300008, // 0167 GETGBL R12 G8 + 0x88340114, // 0168 GETMBR R13 R0 K20 + 0x88341B38, // 0169 GETMBR R13 R13 K56 + 0x7C300200, // 016A CALL R12 1 + 0x7C240600, // 016B CALL R9 3 + 0x58280013, // 016C LDCONST R10 K19 + 0x7C1C0600, // 016D CALL R7 3 + 0x78160008, // 016E JMPF R5 #0178 + 0xB81E1000, // 016F GETNGBL R7 K8 + 0x8C1C0F09, // 0170 GETMET R7 R7 K9 + 0x8C24050A, // 0171 GETMET R9 R2 K10 + 0x582C0046, // 0172 LDCONST R11 K70 + 0x5C300A00, // 0173 MOVE R12 R5 + 0x7C240600, // 0174 CALL R9 3 + 0x58280013, // 0175 LDCONST R10 K19 + 0x7C1C0600, // 0176 CALL R7 3 + 0x7002000C, // 0177 JMP #0185 + 0x741A0002, // 0178 JMPT R6 #017C + 0x881C0114, // 0179 GETMBR R7 R0 K20 + 0x881C0F34, // 017A GETMBR R7 R7 K52 + 0x741E0005, // 017B JMPT R7 #0182 + 0x881C0114, // 017C GETMBR R7 R0 K20 + 0x50200200, // 017D LDBOOL R8 1 0 + 0x901E6808, // 017E SETMBR R7 K52 R8 + 0x881C0114, // 017F GETMBR R7 R0 K20 + 0x8C1C0F1A, // 0180 GETMET R7 R7 K26 + 0x7C1C0200, // 0181 CALL R7 1 + 0x8C1C031B, // 0182 GETMET R7 R1 K27 + 0x58240047, // 0183 LDCONST R9 K71 + 0x7C1C0400, // 0184 CALL R7 2 + 0x700200B9, // 0185 JMP #0240 + 0x8C18030F, // 0186 GETMET R6 R1 K15 + 0x58200048, // 0187 LDCONST R8 K72 + 0x7C180400, // 0188 CALL R6 2 + 0x781A0026, // 0189 JMPF R6 #01B1 + 0x8C18030D, // 018A GETMET R6 R1 K13 + 0x58200049, // 018B LDCONST R8 K73 + 0x7C180400, // 018C CALL R6 2 + 0x8C1C030D, // 018D GETMET R7 R1 K13 + 0x5824000D, // 018E LDCONST R9 K13 + 0x7C1C0400, // 018F CALL R7 2 + 0xB8221000, // 0190 GETNGBL R8 K8 + 0x8C201109, // 0191 GETMET R8 R8 K9 + 0x8C28050A, // 0192 GETMET R10 R2 K10 + 0x5830004A, // 0193 LDCONST R12 K74 + 0x5C340C00, // 0194 MOVE R13 R6 + 0x5C380E00, // 0195 MOVE R14 R7 + 0x7C280800, // 0196 CALL R10 4 + 0x582C0013, // 0197 LDCONST R11 K19 + 0x7C200600, // 0198 CALL R8 3 + 0x88200114, // 0199 GETMBR R8 R0 K20 + 0x88201139, // 019A GETMBR R8 R8 K57 + 0x8C201136, // 019B GETMET R8 R8 K54 + 0x5C280C00, // 019C MOVE R10 R6 + 0x7C200400, // 019D CALL R8 2 + 0x4C240000, // 019E LDNIL R9 + 0x20241009, // 019F NE R9 R8 R9 + 0x7826000B, // 01A0 JMPF R9 #01AD + 0x60240013, // 01A1 GETGBL R9 G19 + 0x7C240000, // 01A2 CALL R9 0 + 0x8C281140, // 01A3 GETMET R10 R8 K64 + 0x5C301000, // 01A4 MOVE R12 R8 + 0x5C341200, // 01A5 MOVE R13 R9 + 0x5C380E00, // 01A6 MOVE R14 R7 + 0x7C280800, // 01A7 CALL R10 4 + 0x88280114, // 01A8 GETMBR R10 R0 K20 + 0x8C28154B, // 01A9 GETMET R10 R10 K75 + 0x5C300C00, // 01AA MOVE R12 R6 + 0x5C341200, // 01AB MOVE R13 R9 + 0x7C280600, // 01AC CALL R10 3 + 0x8C24031B, // 01AD GETMET R9 R1 K27 + 0x582C0032, // 01AE LDCONST R11 K50 + 0x7C240400, // 01AF CALL R9 2 + 0x7002008E, // 01B0 JMP #0240 + 0x8C18030F, // 01B1 GETMET R6 R1 K15 + 0x5820004C, // 01B2 LDCONST R8 K76 + 0x7C180400, // 01B3 CALL R6 2 + 0x781A0059, // 01B4 JMPF R6 #020F + 0x8C18030D, // 01B5 GETMET R6 R1 K13 + 0x5820004D, // 01B6 LDCONST R8 K77 + 0x7C180400, // 01B7 CALL R6 2 + 0x4C1C0000, // 01B8 LDNIL R7 + 0x1C1C0C07, // 01B9 EQ R7 R6 R7 + 0x741E0001, // 01BA JMPT R7 #01BD + 0x1C1C0D3B, // 01BB EQ R7 R6 K59 + 0x781E0000, // 01BC JMPF R7 #01BE + 0xB0069D4F, // 01BD RAISE 1 K78 K79 + 0x581C0005, // 01BE LDCONST R7 K5 + 0x60200008, // 01BF GETGBL R8 G8 + 0x5C240E00, // 01C0 MOVE R9 R7 + 0x7C200200, // 01C1 CALL R8 1 + 0x8C24030F, // 01C2 GETMET R9 R1 K15 + 0x002E9208, // 01C3 ADD R11 K73 R8 + 0x7C240400, // 01C4 CALL R9 2 + 0x78260044, // 01C5 JMPF R9 #020B + 0x8C24030D, // 01C6 GETMET R9 R1 K13 + 0x002E9208, // 01C7 ADD R11 K73 R8 + 0x7C240400, // 01C8 CALL R9 2 + 0x8C28030D, // 01C9 GETMET R10 R1 K13 + 0x00321A08, // 01CA ADD R12 K13 R8 + 0x7C280400, // 01CB CALL R10 2 + 0x202C133B, // 01CC NE R11 R9 K59 + 0x782E0036, // 01CD JMPF R11 #0205 + 0x882C0114, // 01CE GETMBR R11 R0 K20 + 0x882C1739, // 01CF GETMBR R11 R11 K57 + 0x8C2C1736, // 01D0 GETMET R11 R11 K54 + 0x5C341200, // 01D1 MOVE R13 R9 + 0x7C2C0400, // 01D2 CALL R11 2 + 0x4C300000, // 01D3 LDNIL R12 + 0x2030160C, // 01D4 NE R12 R11 R12 + 0x7832002E, // 01D5 JMPF R12 #0205 + 0x60300013, // 01D6 GETGBL R12 G19 + 0x7C300000, // 01D7 CALL R12 0 + 0x98329A06, // 01D8 SETIDX R12 K77 R6 + 0x98327409, // 01D9 SETIDX R12 K58 R9 + 0x8C341740, // 01DA GETMET R13 R11 K64 + 0x5C3C1600, // 01DB MOVE R15 R11 + 0x5C401800, // 01DC MOVE R16 R12 + 0x5C441400, // 01DD MOVE R17 R10 + 0x7C340800, // 01DE CALL R13 4 + 0x50340000, // 01DF LDBOOL R13 0 0 + 0x60380010, // 01E0 GETGBL R14 G16 + 0x883C0114, // 01E1 GETMBR R15 R0 K20 + 0x883C1F38, // 01E2 GETMBR R15 R15 K56 + 0x7C380200, // 01E3 CALL R14 1 + 0xA802000B, // 01E4 EXBLK 0 #01F1 + 0x5C3C1C00, // 01E5 MOVE R15 R14 + 0x7C3C0000, // 01E6 CALL R15 0 + 0x8C400150, // 01E7 GETMET R16 R0 K80 + 0x5C481E00, // 01E8 MOVE R18 R15 + 0x5C4C1800, // 01E9 MOVE R19 R12 + 0x7C400600, // 01EA CALL R16 3 + 0x78420001, // 01EB JMPF R16 #01EE + 0x50340200, // 01EC LDBOOL R13 1 0 + 0x70020000, // 01ED JMP #01EF + 0x7001FFF5, // 01EE JMP #01E5 + 0xA8040001, // 01EF EXBLK 1 1 + 0x70020002, // 01F0 JMP #01F4 + 0x5838000E, // 01F1 LDCONST R14 K14 + 0xAC380200, // 01F2 CATCH R14 1 0 + 0xB0080000, // 01F3 RAISE 2 R0 R0 + 0x5C381A00, // 01F4 MOVE R14 R13 + 0x743A000E, // 01F5 JMPT R14 #0205 + 0xB83A1000, // 01F6 GETNGBL R14 K8 + 0x8C381D09, // 01F7 GETMET R14 R14 K9 + 0x8C40050A, // 01F8 GETMET R16 R2 K10 + 0x58480051, // 01F9 LDCONST R18 K81 + 0x5C4C0C00, // 01FA MOVE R19 R6 + 0x5C501200, // 01FB MOVE R20 R9 + 0x5C541400, // 01FC MOVE R21 R10 + 0x7C400A00, // 01FD CALL R16 5 + 0x58440013, // 01FE LDCONST R17 K19 + 0x7C380600, // 01FF CALL R14 3 + 0x88380114, // 0200 GETMBR R14 R0 K20 + 0x8C381D4B, // 0201 GETMET R14 R14 K75 + 0x5C401200, // 0202 MOVE R16 R9 + 0x5C441800, // 0203 MOVE R17 R12 + 0x7C380600, // 0204 CALL R14 3 + 0x001C0F07, // 0205 ADD R7 R7 K7 + 0x602C0008, // 0206 GETGBL R11 G8 + 0x5C300E00, // 0207 MOVE R12 R7 + 0x7C2C0200, // 0208 CALL R11 1 + 0x5C201600, // 0209 MOVE R8 R11 + 0x7001FFB6, // 020A JMP #01C2 + 0x8C24031B, // 020B GETMET R9 R1 K27 + 0x582C0032, // 020C LDCONST R11 K50 + 0x7C240400, // 020D CALL R9 2 + 0x70020030, // 020E JMP #0240 + 0x4C180000, // 020F LDNIL R6 + 0x601C0010, // 0210 GETGBL R7 G16 + 0x8C200306, // 0211 GETMET R8 R1 K6 + 0x7C200200, // 0212 CALL R8 1 + 0x04201107, // 0213 SUB R8 R8 K7 + 0x40220A08, // 0214 CONNECT R8 K5 R8 + 0x7C1C0200, // 0215 CALL R7 1 + 0xA8020013, // 0216 EXBLK 0 #022B + 0x5C200E00, // 0217 MOVE R8 R7 + 0x7C200000, // 0218 CALL R8 0 + 0x8C24030C, // 0219 GETMET R9 R1 K12 + 0x5C2C1000, // 021A MOVE R11 R8 + 0x7C240400, // 021B CALL R9 2 + 0x8C280536, // 021C GETMET R10 R2 K54 + 0x5C301200, // 021D MOVE R12 R9 + 0x58340052, // 021E LDCONST R13 K82 + 0x7C280600, // 021F CALL R10 3 + 0x1C281505, // 0220 EQ R10 R10 K5 + 0x782A0005, // 0221 JMPF R10 #0228 + 0x60280009, // 0222 GETGBL R10 G9 + 0x402E2737, // 0223 CONNECT R11 K19 K55 + 0x942C120B, // 0224 GETIDX R11 R9 R11 + 0x7C280200, // 0225 CALL R10 1 + 0x5C181400, // 0226 MOVE R6 R10 + 0x70020000, // 0227 JMP #0229 + 0x7001FFED, // 0228 JMP #0217 + 0xA8040001, // 0229 EXBLK 1 1 + 0x70020002, // 022A JMP #022E + 0x581C000E, // 022B LDCONST R7 K14 + 0xAC1C0200, // 022C CATCH R7 1 0 + 0xB0080000, // 022D RAISE 2 R0 R0 + 0x4C1C0000, // 022E LDNIL R7 + 0x201C0C07, // 022F NE R7 R6 R7 + 0x781E000E, // 0230 JMPF R7 #0240 + 0xB81E1000, // 0231 GETNGBL R7 K8 + 0x8C1C0F09, // 0232 GETMET R7 R7 K9 + 0x8C24050A, // 0233 GETMET R9 R2 K10 + 0x582C0053, // 0234 LDCONST R11 K83 + 0x5C300C00, // 0235 MOVE R12 R6 + 0x7C240600, // 0236 CALL R9 3 + 0x58280054, // 0237 LDCONST R10 K84 + 0x7C1C0600, // 0238 CALL R7 3 + 0x881C0114, // 0239 GETMBR R7 R0 K20 + 0x8C1C0F55, // 023A GETMET R7 R7 K85 + 0x5C240C00, // 023B MOVE R9 R6 + 0x7C1C0400, // 023C CALL R7 2 + 0x8C1C031B, // 023D GETMET R7 R1 K27 + 0x58240032, // 023E LDCONST R9 K50 + 0x7C1C0400, // 023F CALL R7 2 + 0x78160011, // 0240 JMPF R5 #0253 + 0x8C180356, // 0241 GETMET R6 R1 K86 + 0x58200057, // 0242 LDCONST R8 K87 + 0x7C180400, // 0243 CALL R6 2 + 0x8C180358, // 0244 GETMET R6 R1 K88 + 0x7C180200, // 0245 CALL R6 1 + 0x8C180359, // 0246 GETMET R6 R1 K89 + 0x8C20050A, // 0247 GETMET R8 R2 K10 + 0x5828005A, // 0248 LDCONST R10 K90 + 0x8C2C035B, // 0249 GETMET R11 R1 K91 + 0x5C340A00, // 024A MOVE R13 R5 + 0x7C2C0400, // 024B CALL R11 2 + 0x7C200600, // 024C CALL R8 3 + 0x7C180400, // 024D CALL R6 2 + 0x8C18035C, // 024E GETMET R6 R1 K92 + 0x8820035D, // 024F GETMBR R8 R1 K93 + 0x7C180400, // 0250 CALL R6 2 + 0x8C18035E, // 0251 GETMET R6 R1 K94 + 0x7C180200, // 0252 CALL R6 1 + 0xA8040001, // 0253 EXBLK 1 1 + 0x7002001D, // 0254 JMP #0273 + 0xAC180002, // 0255 CATCH R6 0 2 + 0x7002001A, // 0256 JMP #0272 + 0xB8221000, // 0257 GETNGBL R8 K8 + 0x8C201109, // 0258 GETMET R8 R8 K9 + 0x8C28050A, // 0259 GETMET R10 R2 K10 + 0x5830005F, // 025A LDCONST R12 K95 + 0x5C340C00, // 025B MOVE R13 R6 + 0x5C380E00, // 025C MOVE R14 R7 + 0x7C280800, // 025D CALL R10 4 + 0x582C0054, // 025E LDCONST R11 K84 + 0x7C200600, // 025F CALL R8 3 + 0x8C200356, // 0260 GETMET R8 R1 K86 + 0x58280057, // 0261 LDCONST R10 K87 + 0x7C200400, // 0262 CALL R8 2 + 0x8C200358, // 0263 GETMET R8 R1 K88 + 0x7C200200, // 0264 CALL R8 1 + 0x8C200359, // 0265 GETMET R8 R1 K89 + 0x8C28050A, // 0266 GETMET R10 R2 K10 + 0x58300060, // 0267 LDCONST R12 K96 + 0x5C340C00, // 0268 MOVE R13 R6 + 0x5C380E00, // 0269 MOVE R14 R7 + 0x7C280800, // 026A CALL R10 4 + 0x7C200400, // 026B CALL R8 2 + 0x8C20035C, // 026C GETMET R8 R1 K92 + 0x8828035D, // 026D GETMBR R10 R1 K93 + 0x7C200400, // 026E CALL R8 2 + 0x8C20035E, // 026F GETMET R8 R1 K94 + 0x7C200200, // 0270 CALL R8 1 + 0x70020000, // 0271 JMP #0273 + 0xB0080000, // 0272 RAISE 2 R0 R0 + 0x80000000, // 0273 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: web_get_arg +********************************************************************/ +be_local_closure(Matter_UI_web_get_arg, /* name */ + be_nested_proto( + 5, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 7]) { /* constants */ + /* K0 */ be_nested_str_weak(webserver), + /* K1 */ be_nested_str_weak(has_arg), + /* K2 */ be_nested_str_weak(mtc0), + /* K3 */ be_nested_str_weak(device), + /* K4 */ be_nested_str_weak(stop_basic_commissioning), + /* K5 */ be_nested_str_weak(mtc1), + /* K6 */ be_nested_str_weak(start_root_basic_commissioning), + }), + be_str_weak(web_get_arg), + &be_const_str_solidified, + ( &(const binstruction[17]) { /* code */ + 0xA4060000, // 0000 IMPORT R1 K0 + 0x8C080301, // 0001 GETMET R2 R1 K1 + 0x58100002, // 0002 LDCONST R4 K2 + 0x7C080400, // 0003 CALL R2 2 + 0x780A0003, // 0004 JMPF R2 #0009 + 0x88080103, // 0005 GETMBR R2 R0 K3 + 0x8C080504, // 0006 GETMET R2 R2 K4 + 0x7C080200, // 0007 CALL R2 1 + 0x70020006, // 0008 JMP #0010 + 0x8C080301, // 0009 GETMET R2 R1 K1 + 0x58100005, // 000A LDCONST R4 K5 + 0x7C080400, // 000B CALL R2 2 + 0x780A0002, // 000C JMPF R2 #0010 + 0x88080103, // 000D GETMBR R2 R0 K3 + 0x8C080506, // 000E GETMET R2 R2 K6 + 0x7C080200, // 000F CALL R2 1 + 0x80000000, // 0010 RET 0 }) ) ); @@ -347,751 +1437,11 @@ be_local_closure(Matter_UI_show_qrcode, /* name */ /******************************************************************** -** Solidified function: page_part_ctl +** Solidified function: show_remote_autoconf ********************************************************************/ -be_local_closure(Matter_UI_page_part_ctl, /* name */ +be_local_closure(Matter_UI_show_remote_autoconf, /* name */ be_nested_proto( - 21, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[74]) { /* constants */ - /* K0 */ be_nested_str_weak(webserver), - /* K1 */ be_nested_str_weak(check_privileged_access), - /* K2 */ be_nested_str_weak(string), - /* K3 */ be_nested_str_weak(partition_core), - /* K4 */ be_nested_str_weak(persist), - /* K5 */ be_nested_str_weak(has_arg), - /* K6 */ be_nested_str_weak(passcode), - /* K7 */ be_nested_str_weak(discriminator), - /* K8 */ be_nested_str_weak(tasmota), - /* K9 */ be_nested_str_weak(log), - /* K10 */ be_nested_str_weak(format), - /* K11 */ be_nested_str_weak(MTR_X3A_X20_X2Fmatterc_X20received_X20_X27_X25s_X27_X20command), - /* K12 */ be_const_int(3), - /* K13 */ be_nested_str_weak(device), - /* K14 */ be_nested_str_weak(root_passcode), - /* K15 */ be_nested_str_weak(arg), - /* K16 */ be_nested_str_weak(root_discriminator), - /* K17 */ be_nested_str_weak(ipv4only), - /* K18 */ be_nested_str_weak(ipv4), - /* K19 */ be_nested_str_weak(on), - /* K20 */ be_nested_str_weak(save_param), - /* K21 */ be_nested_str_weak(redirect), - /* K22 */ be_nested_str_weak(_X2F_X3Frst_X3D), - /* K23 */ be_nested_str_weak(open_comm), - /* K24 */ be_nested_str_weak(start_root_basic_commissioning), - /* K25 */ be_nested_str_weak(_X2F), - /* K26 */ be_nested_str_weak(clos_comm), - /* K27 */ be_nested_str_weak(stop_basic_commissioning), - /* K28 */ be_nested_str_weak(enable), - /* K29 */ be_nested_str_weak(cmd), - /* K30 */ be_nested_str_weak(SetOption), - /* K31 */ be_nested_str_weak(matter), - /* K32 */ be_nested_str_weak(MATTER_OPTION), - /* K33 */ be_nested_str_weak(_X201), - /* K34 */ be_nested_str_weak(disable), - /* K35 */ be_nested_str_weak(_X200), - /* K36 */ be_nested_str_weak(del_fabric), - /* K37 */ be_const_int(0), - /* K38 */ be_nested_str_weak(sessions), - /* K39 */ be_nested_str_weak(fabrics), - /* K40 */ be_nested_str_weak(get_fabric_index), - /* K41 */ be_nested_str_weak(remove_fabric), - /* K42 */ be_const_int(1), - /* K43 */ be_nested_str_weak(_X2Fmatterc_X3F), - /* K44 */ be_nested_str_weak(auto), - /* K45 */ be_nested_str_weak(plugins_persist), - /* K46 */ be_nested_str_weak(config), - /* K47 */ be_nested_str_weak(_X2503i), - /* K48 */ be_nested_str_weak(ep), - /* K49 */ be_nested_str_weak(pi), - /* K50 */ be_nested_str_weak(MTR_X3A_X20ep_X3D_X25i_X20type_X3D_X25s_X20arg_X3D_X25s), - /* K51 */ be_nested_str_weak(), - /* K52 */ be_nested_str_weak(0), - /* K53 */ be_nested_str_weak(plugins_classes), - /* K54 */ be_nested_str_weak(find), - /* K55 */ be_nested_str_weak(type), - /* K56 */ be_nested_str_weak(ui_string_to_conf), - /* K57 */ be_nested_str_weak(MTR_X3A_X20unknown_X20type_X20_X3D_X20_X25s), - /* K58 */ be_const_int(2), - /* K59 */ be_nested_str_weak(MTR_X3A_X20skipping_X20parameter), - /* K60 */ be_nested_str_weak(MTR_X3A_X20config_X20_X3D_X20_X25s), - /* K61 */ be_nested_str_weak(MTR_X3A_X20config_X20error_X20_X3D_X20_X25s), - /* K62 */ be_nested_str_weak(plugins_config), - /* K63 */ be_nested_str_weak(content_start), - /* K64 */ be_nested_str_weak(Parameter_X20error), - /* K65 */ be_nested_str_weak(content_send_style), - /* K66 */ be_nested_str_weak(content_send), - /* K67 */ be_nested_str_weak(_X3Cp_X20style_X3D_X27width_X3A340px_X3B_X27_X3E_X3Cb_X3EError_X3A_X3C_X2Fb_X3E_X25s_X3C_X2Fp_X3E), - /* K68 */ be_nested_str_weak(html_escape), - /* K69 */ be_nested_str_weak(content_button), - /* K70 */ be_nested_str_weak(BUTTON_CONFIGURATION), - /* K71 */ be_nested_str_weak(content_stop), - /* K72 */ be_nested_str_weak(BRY_X3A_X20Exception_X3E_X20_X27_X25s_X27_X20_X2D_X20_X25s), - /* K73 */ be_nested_str_weak(_X3Cp_X20style_X3D_X27width_X3A340px_X3B_X27_X3E_X3Cb_X3EException_X3A_X3C_X2Fb_X3E_X3Cbr_X3E_X27_X25s_X27_X3Cbr_X3E_X25s_X3C_X2Fp_X3E), - }), - be_str_weak(page_part_ctl), - &be_const_str_solidified, - ( &(const binstruction[372]) { /* code */ - 0xA4060000, // 0000 IMPORT R1 K0 - 0x8C080301, // 0001 GETMET R2 R1 K1 - 0x7C080200, // 0002 CALL R2 1 - 0x740A0001, // 0003 JMPT R2 #0006 - 0x4C080000, // 0004 LDNIL R2 - 0x80040400, // 0005 RET 1 R2 - 0xA40A0400, // 0006 IMPORT R2 K2 - 0xA40E0600, // 0007 IMPORT R3 K3 - 0xA4120800, // 0008 IMPORT R4 K4 - 0x4C140000, // 0009 LDNIL R5 - 0xA8020149, // 000A EXBLK 0 #0155 - 0x8C180305, // 000B GETMET R6 R1 K5 - 0x58200006, // 000C LDCONST R8 K6 - 0x7C180400, // 000D CALL R6 2 - 0x741A0003, // 000E JMPT R6 #0013 - 0x8C180305, // 000F GETMET R6 R1 K5 - 0x58200007, // 0010 LDCONST R8 K7 - 0x7C180400, // 0011 CALL R6 2 - 0x781A002A, // 0012 JMPF R6 #003E - 0xB81A1000, // 0013 GETNGBL R6 K8 - 0x8C180D09, // 0014 GETMET R6 R6 K9 - 0x8C20050A, // 0015 GETMET R8 R2 K10 - 0x5828000B, // 0016 LDCONST R10 K11 - 0x582C0006, // 0017 LDCONST R11 K6 - 0x7C200600, // 0018 CALL R8 3 - 0x5824000C, // 0019 LDCONST R9 K12 - 0x7C180600, // 001A CALL R6 3 - 0x8C180305, // 001B GETMET R6 R1 K5 - 0x58200006, // 001C LDCONST R8 K6 - 0x7C180400, // 001D CALL R6 2 - 0x781A0006, // 001E JMPF R6 #0026 - 0x8818010D, // 001F GETMBR R6 R0 K13 - 0x601C0009, // 0020 GETGBL R7 G9 - 0x8C20030F, // 0021 GETMET R8 R1 K15 - 0x58280006, // 0022 LDCONST R10 K6 - 0x7C200400, // 0023 CALL R8 2 - 0x7C1C0200, // 0024 CALL R7 1 - 0x901A1C07, // 0025 SETMBR R6 K14 R7 - 0x8C180305, // 0026 GETMET R6 R1 K5 - 0x58200007, // 0027 LDCONST R8 K7 - 0x7C180400, // 0028 CALL R6 2 - 0x781A0006, // 0029 JMPF R6 #0031 - 0x8818010D, // 002A GETMBR R6 R0 K13 - 0x601C0009, // 002B GETGBL R7 G9 - 0x8C20030F, // 002C GETMET R8 R1 K15 - 0x58280007, // 002D LDCONST R10 K7 - 0x7C200400, // 002E CALL R8 2 - 0x7C1C0200, // 002F CALL R7 1 - 0x901A2007, // 0030 SETMBR R6 K16 R7 - 0x8818010D, // 0031 GETMBR R6 R0 K13 - 0x8C1C030F, // 0032 GETMET R7 R1 K15 - 0x58240012, // 0033 LDCONST R9 K18 - 0x7C1C0400, // 0034 CALL R7 2 - 0x1C1C0F13, // 0035 EQ R7 R7 K19 - 0x901A2207, // 0036 SETMBR R6 K17 R7 - 0x8818010D, // 0037 GETMBR R6 R0 K13 - 0x8C180D14, // 0038 GETMET R6 R6 K20 - 0x7C180200, // 0039 CALL R6 1 - 0x8C180315, // 003A GETMET R6 R1 K21 - 0x58200016, // 003B LDCONST R8 K22 - 0x7C180400, // 003C CALL R6 2 - 0x70020101, // 003D JMP #0140 - 0x8C180305, // 003E GETMET R6 R1 K5 - 0x58200017, // 003F LDCONST R8 K23 - 0x7C180400, // 0040 CALL R6 2 - 0x781A0006, // 0041 JMPF R6 #0049 - 0x8818010D, // 0042 GETMBR R6 R0 K13 - 0x8C180D18, // 0043 GETMET R6 R6 K24 - 0x7C180200, // 0044 CALL R6 1 - 0x8C180315, // 0045 GETMET R6 R1 K21 - 0x58200019, // 0046 LDCONST R8 K25 - 0x7C180400, // 0047 CALL R6 2 - 0x700200F6, // 0048 JMP #0140 - 0x8C180305, // 0049 GETMET R6 R1 K5 - 0x5820001A, // 004A LDCONST R8 K26 - 0x7C180400, // 004B CALL R6 2 - 0x781A0006, // 004C JMPF R6 #0054 - 0x8818010D, // 004D GETMBR R6 R0 K13 - 0x8C180D1B, // 004E GETMET R6 R6 K27 - 0x7C180200, // 004F CALL R6 1 - 0x8C180315, // 0050 GETMET R6 R1 K21 - 0x58200019, // 0051 LDCONST R8 K25 - 0x7C180400, // 0052 CALL R6 2 - 0x700200EB, // 0053 JMP #0140 - 0x8C180305, // 0054 GETMET R6 R1 K5 - 0x5820001C, // 0055 LDCONST R8 K28 - 0x7C180400, // 0056 CALL R6 2 - 0x781A0014, // 0057 JMPF R6 #006D - 0xB81A1000, // 0058 GETNGBL R6 K8 - 0x8C180D09, // 0059 GETMET R6 R6 K9 - 0x8C20050A, // 005A GETMET R8 R2 K10 - 0x5828000B, // 005B LDCONST R10 K11 - 0x582C001C, // 005C LDCONST R11 K28 - 0x7C200600, // 005D CALL R8 3 - 0x5824000C, // 005E LDCONST R9 K12 - 0x7C180600, // 005F CALL R6 3 - 0xB81A1000, // 0060 GETNGBL R6 K8 - 0x8C180D1D, // 0061 GETMET R6 R6 K29 - 0x60200008, // 0062 GETGBL R8 G8 - 0xB8263E00, // 0063 GETNGBL R9 K31 - 0x88241320, // 0064 GETMBR R9 R9 K32 - 0x7C200200, // 0065 CALL R8 1 - 0x00223C08, // 0066 ADD R8 K30 R8 - 0x00201121, // 0067 ADD R8 R8 K33 - 0x7C180400, // 0068 CALL R6 2 - 0x8C180315, // 0069 GETMET R6 R1 K21 - 0x58200016, // 006A LDCONST R8 K22 - 0x7C180400, // 006B CALL R6 2 - 0x700200D2, // 006C JMP #0140 - 0x8C180305, // 006D GETMET R6 R1 K5 - 0x58200022, // 006E LDCONST R8 K34 - 0x7C180400, // 006F CALL R6 2 - 0x781A0014, // 0070 JMPF R6 #0086 - 0xB81A1000, // 0071 GETNGBL R6 K8 - 0x8C180D09, // 0072 GETMET R6 R6 K9 - 0x8C20050A, // 0073 GETMET R8 R2 K10 - 0x5828000B, // 0074 LDCONST R10 K11 - 0x582C0022, // 0075 LDCONST R11 K34 - 0x7C200600, // 0076 CALL R8 3 - 0x5824000C, // 0077 LDCONST R9 K12 - 0x7C180600, // 0078 CALL R6 3 - 0xB81A1000, // 0079 GETNGBL R6 K8 - 0x8C180D1D, // 007A GETMET R6 R6 K29 - 0x60200008, // 007B GETGBL R8 G8 - 0xB8263E00, // 007C GETNGBL R9 K31 - 0x88241320, // 007D GETMBR R9 R9 K32 - 0x7C200200, // 007E CALL R8 1 - 0x00223C08, // 007F ADD R8 K30 R8 - 0x00201123, // 0080 ADD R8 R8 K35 - 0x7C180400, // 0081 CALL R6 2 - 0x8C180315, // 0082 GETMET R6 R1 K21 - 0x58200016, // 0083 LDCONST R8 K22 - 0x7C180400, // 0084 CALL R6 2 - 0x700200B9, // 0085 JMP #0140 - 0x8C180305, // 0086 GETMET R6 R1 K5 - 0x58200024, // 0087 LDCONST R8 K36 - 0x7C180400, // 0088 CALL R6 2 - 0x781A0026, // 0089 JMPF R6 #00B1 - 0xB81A1000, // 008A GETNGBL R6 K8 - 0x8C180D09, // 008B GETMET R6 R6 K9 - 0x8C20050A, // 008C GETMET R8 R2 K10 - 0x5828000B, // 008D LDCONST R10 K11 - 0x582C0024, // 008E LDCONST R11 K36 - 0x7C200600, // 008F CALL R8 3 - 0x5824000C, // 0090 LDCONST R9 K12 - 0x7C180600, // 0091 CALL R6 3 - 0x60180009, // 0092 GETGBL R6 G9 - 0x8C1C030F, // 0093 GETMET R7 R1 K15 - 0x58240024, // 0094 LDCONST R9 K36 - 0x7C1C0400, // 0095 CALL R7 2 - 0x7C180200, // 0096 CALL R6 1 - 0x581C0025, // 0097 LDCONST R7 K37 - 0x8820010D, // 0098 GETMBR R8 R0 K13 - 0x88201126, // 0099 GETMBR R8 R8 K38 - 0x88201127, // 009A GETMBR R8 R8 K39 - 0x6024000C, // 009B GETGBL R9 G12 - 0x5C281000, // 009C MOVE R10 R8 - 0x7C240200, // 009D CALL R9 1 - 0x14240E09, // 009E LT R9 R7 R9 - 0x7826000C, // 009F JMPF R9 #00AD - 0x94241007, // 00A0 GETIDX R9 R8 R7 - 0x8C241328, // 00A1 GETMET R9 R9 K40 - 0x7C240200, // 00A2 CALL R9 1 - 0x1C241206, // 00A3 EQ R9 R9 R6 - 0x78260005, // 00A4 JMPF R9 #00AB - 0x8824010D, // 00A5 GETMBR R9 R0 K13 - 0x8C241329, // 00A6 GETMET R9 R9 K41 - 0x942C1007, // 00A7 GETIDX R11 R8 R7 - 0x7C240400, // 00A8 CALL R9 2 - 0x70020002, // 00A9 JMP #00AD - 0x70020000, // 00AA JMP #00AC - 0x001C0F2A, // 00AB ADD R7 R7 K42 - 0x7001FFED, // 00AC JMP #009B - 0x8C240315, // 00AD GETMET R9 R1 K21 - 0x582C002B, // 00AE LDCONST R11 K43 - 0x7C240400, // 00AF CALL R9 2 - 0x7002008E, // 00B0 JMP #0140 - 0x8C180305, // 00B1 GETMET R6 R1 K5 - 0x5820002C, // 00B2 LDCONST R8 K44 - 0x7C180400, // 00B3 CALL R6 2 - 0x781A0011, // 00B4 JMPF R6 #00C7 - 0xB81A1000, // 00B5 GETNGBL R6 K8 - 0x8C180D09, // 00B6 GETMET R6 R6 K9 - 0x8C20050A, // 00B7 GETMET R8 R2 K10 - 0x5828000B, // 00B8 LDCONST R10 K11 - 0x582C002C, // 00B9 LDCONST R11 K44 - 0x7C200600, // 00BA CALL R8 3 - 0x5824000C, // 00BB LDCONST R9 K12 - 0x7C180600, // 00BC CALL R6 3 - 0x8818010D, // 00BD GETMBR R6 R0 K13 - 0x501C0000, // 00BE LDBOOL R7 0 0 - 0x901A5A07, // 00BF SETMBR R6 K45 R7 - 0x8818010D, // 00C0 GETMBR R6 R0 K13 - 0x8C180D14, // 00C1 GETMET R6 R6 K20 - 0x7C180200, // 00C2 CALL R6 1 - 0x8C180315, // 00C3 GETMET R6 R1 K21 - 0x58200016, // 00C4 LDCONST R8 K22 - 0x7C180400, // 00C5 CALL R6 2 - 0x70020078, // 00C6 JMP #0140 - 0x8C180305, // 00C7 GETMET R6 R1 K5 - 0x5820002E, // 00C8 LDCONST R8 K46 - 0x7C180400, // 00C9 CALL R6 2 - 0x781A0074, // 00CA JMPF R6 #0140 - 0x60180013, // 00CB GETGBL R6 G19 - 0x7C180000, // 00CC CALL R6 0 - 0xB81E1000, // 00CD GETNGBL R7 K8 - 0x8C1C0F09, // 00CE GETMET R7 R7 K9 - 0x8C24050A, // 00CF GETMET R9 R2 K10 - 0x582C000B, // 00D0 LDCONST R11 K11 - 0x5830002E, // 00D1 LDCONST R12 K46 - 0x7C240600, // 00D2 CALL R9 3 - 0x5828000C, // 00D3 LDCONST R10 K12 - 0x7C1C0600, // 00D4 CALL R7 3 - 0x581C0025, // 00D5 LDCONST R7 K37 - 0x8C20050A, // 00D6 GETMET R8 R2 K10 - 0x5828002F, // 00D7 LDCONST R10 K47 - 0x5C2C0E00, // 00D8 MOVE R11 R7 - 0x7C200600, // 00D9 CALL R8 3 - 0x8C240305, // 00DA GETMET R9 R1 K5 - 0x002E6008, // 00DB ADD R11 K48 R8 - 0x7C240400, // 00DC CALL R9 2 - 0x78260042, // 00DD JMPF R9 #0121 - 0x8C24030F, // 00DE GETMET R9 R1 K15 - 0x002E6008, // 00DF ADD R11 K48 R8 - 0x7C240400, // 00E0 CALL R9 2 - 0x60280009, // 00E1 GETGBL R10 G9 - 0x5C2C1200, // 00E2 MOVE R11 R9 - 0x7C280200, // 00E3 CALL R10 1 - 0x8C2C030F, // 00E4 GETMET R11 R1 K15 - 0x00366208, // 00E5 ADD R13 K49 R8 - 0x7C2C0400, // 00E6 CALL R11 2 - 0x8C30030F, // 00E7 GETMET R12 R1 K15 - 0x003A1E08, // 00E8 ADD R14 K15 R8 - 0x7C300400, // 00E9 CALL R12 2 - 0xB8361000, // 00EA GETNGBL R13 K8 - 0x8C341B09, // 00EB GETMET R13 R13 K9 - 0x8C3C050A, // 00EC GETMET R15 R2 K10 - 0x58440032, // 00ED LDCONST R17 K50 - 0x5C481200, // 00EE MOVE R18 R9 - 0x5C4C1600, // 00EF MOVE R19 R11 - 0x5C501800, // 00F0 MOVE R20 R12 - 0x7C3C0A00, // 00F1 CALL R15 5 - 0x5840000C, // 00F2 LDCONST R16 K12 - 0x7C340600, // 00F3 CALL R13 3 - 0x20341333, // 00F4 NE R13 R9 K51 - 0x7836001E, // 00F5 JMPF R13 #0115 - 0x20341733, // 00F6 NE R13 R11 K51 - 0x7836001C, // 00F7 JMPF R13 #0115 - 0x20341334, // 00F8 NE R13 R9 K52 - 0x7836001A, // 00F9 JMPF R13 #0115 - 0x8834010D, // 00FA GETMBR R13 R0 K13 - 0x88341B35, // 00FB GETMBR R13 R13 K53 - 0x8C341B36, // 00FC GETMET R13 R13 K54 - 0x5C3C1600, // 00FD MOVE R15 R11 - 0x7C340400, // 00FE CALL R13 2 - 0x4C380000, // 00FF LDNIL R14 - 0x20381A0E, // 0100 NE R14 R13 R14 - 0x783A0009, // 0101 JMPF R14 #010C - 0x60380013, // 0102 GETGBL R14 G19 - 0x7C380000, // 0103 CALL R14 0 - 0x983A6E0B, // 0104 SETIDX R14 K55 R11 - 0x8C3C1B38, // 0105 GETMET R15 R13 K56 - 0x5C441A00, // 0106 MOVE R17 R13 - 0x5C481C00, // 0107 MOVE R18 R14 - 0x5C4C1800, // 0108 MOVE R19 R12 - 0x7C3C0800, // 0109 CALL R15 4 - 0x9818120E, // 010A SETIDX R6 R9 R14 - 0x70020007, // 010B JMP #0114 - 0xB83A1000, // 010C GETNGBL R14 K8 - 0x8C381D09, // 010D GETMET R14 R14 K9 - 0x8C40050A, // 010E GETMET R16 R2 K10 - 0x58480039, // 010F LDCONST R18 K57 - 0x5C4C1600, // 0110 MOVE R19 R11 - 0x7C400600, // 0111 CALL R16 3 - 0x5844003A, // 0112 LDCONST R17 K58 - 0x7C380600, // 0113 CALL R14 3 - 0x70020004, // 0114 JMP #011A - 0xB8361000, // 0115 GETNGBL R13 K8 - 0x8C341B09, // 0116 GETMET R13 R13 K9 - 0x583C003B, // 0117 LDCONST R15 K59 - 0x5840003A, // 0118 LDCONST R16 K58 - 0x7C340600, // 0119 CALL R13 3 - 0x001C0F2A, // 011A ADD R7 R7 K42 - 0x8C34050A, // 011B GETMET R13 R2 K10 - 0x583C002F, // 011C LDCONST R15 K47 - 0x5C400E00, // 011D MOVE R16 R7 - 0x7C340600, // 011E CALL R13 3 - 0x5C201A00, // 011F MOVE R8 R13 - 0x7001FFB8, // 0120 JMP #00DA - 0xB8261000, // 0121 GETNGBL R9 K8 - 0x8C241309, // 0122 GETMET R9 R9 K9 - 0x8C2C050A, // 0123 GETMET R11 R2 K10 - 0x5834003C, // 0124 LDCONST R13 K60 - 0x60380008, // 0125 GETGBL R14 G8 - 0x5C3C0C00, // 0126 MOVE R15 R6 - 0x7C380200, // 0127 CALL R14 1 - 0x7C2C0600, // 0128 CALL R11 3 - 0x5830000C, // 0129 LDCONST R12 K12 - 0x7C240600, // 012A CALL R9 3 - 0x78160008, // 012B JMPF R5 #0135 - 0xB8261000, // 012C GETNGBL R9 K8 - 0x8C241309, // 012D GETMET R9 R9 K9 - 0x8C2C050A, // 012E GETMET R11 R2 K10 - 0x5834003D, // 012F LDCONST R13 K61 - 0x5C380A00, // 0130 MOVE R14 R5 - 0x7C2C0600, // 0131 CALL R11 3 - 0x5830000C, // 0132 LDCONST R12 K12 - 0x7C240600, // 0133 CALL R9 3 - 0x7002000A, // 0134 JMP #0140 - 0x8824010D, // 0135 GETMBR R9 R0 K13 - 0x90267C06, // 0136 SETMBR R9 K62 R6 - 0x8824010D, // 0137 GETMBR R9 R0 K13 - 0x50280200, // 0138 LDBOOL R10 1 0 - 0x90265A0A, // 0139 SETMBR R9 K45 R10 - 0x8824010D, // 013A GETMBR R9 R0 K13 - 0x8C241314, // 013B GETMET R9 R9 K20 - 0x7C240200, // 013C CALL R9 1 - 0x8C240315, // 013D GETMET R9 R1 K21 - 0x582C0016, // 013E LDCONST R11 K22 - 0x7C240400, // 013F CALL R9 2 - 0x78160011, // 0140 JMPF R5 #0153 - 0x8C18033F, // 0141 GETMET R6 R1 K63 - 0x58200040, // 0142 LDCONST R8 K64 - 0x7C180400, // 0143 CALL R6 2 - 0x8C180341, // 0144 GETMET R6 R1 K65 - 0x7C180200, // 0145 CALL R6 1 - 0x8C180342, // 0146 GETMET R6 R1 K66 - 0x8C20050A, // 0147 GETMET R8 R2 K10 - 0x58280043, // 0148 LDCONST R10 K67 - 0x8C2C0344, // 0149 GETMET R11 R1 K68 - 0x5C340A00, // 014A MOVE R13 R5 - 0x7C2C0400, // 014B CALL R11 2 - 0x7C200600, // 014C CALL R8 3 - 0x7C180400, // 014D CALL R6 2 - 0x8C180345, // 014E GETMET R6 R1 K69 - 0x88200346, // 014F GETMBR R8 R1 K70 - 0x7C180400, // 0150 CALL R6 2 - 0x8C180347, // 0151 GETMET R6 R1 K71 - 0x7C180200, // 0152 CALL R6 1 - 0xA8040001, // 0153 EXBLK 1 1 - 0x7002001D, // 0154 JMP #0173 - 0xAC180002, // 0155 CATCH R6 0 2 - 0x7002001A, // 0156 JMP #0172 - 0xB8221000, // 0157 GETNGBL R8 K8 - 0x8C201109, // 0158 GETMET R8 R8 K9 - 0x8C28050A, // 0159 GETMET R10 R2 K10 - 0x58300048, // 015A LDCONST R12 K72 - 0x5C340C00, // 015B MOVE R13 R6 - 0x5C380E00, // 015C MOVE R14 R7 - 0x7C280800, // 015D CALL R10 4 - 0x582C003A, // 015E LDCONST R11 K58 - 0x7C200600, // 015F CALL R8 3 - 0x8C20033F, // 0160 GETMET R8 R1 K63 - 0x58280040, // 0161 LDCONST R10 K64 - 0x7C200400, // 0162 CALL R8 2 - 0x8C200341, // 0163 GETMET R8 R1 K65 - 0x7C200200, // 0164 CALL R8 1 - 0x8C200342, // 0165 GETMET R8 R1 K66 - 0x8C28050A, // 0166 GETMET R10 R2 K10 - 0x58300049, // 0167 LDCONST R12 K73 - 0x5C340C00, // 0168 MOVE R13 R6 - 0x5C380E00, // 0169 MOVE R14 R7 - 0x7C280800, // 016A CALL R10 4 - 0x7C200400, // 016B CALL R8 2 - 0x8C200345, // 016C GETMET R8 R1 K69 - 0x88280346, // 016D GETMBR R10 R1 K70 - 0x7C200400, // 016E CALL R8 2 - 0x8C200347, // 016F GETMET R8 R1 K71 - 0x7C200200, // 0170 CALL R8 1 - 0x70020000, // 0171 JMP #0173 - 0xB0080000, // 0172 RAISE 2 R0 R0 - 0x80000000, // 0173 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: web_get_arg -********************************************************************/ -be_local_closure(Matter_UI_web_get_arg, /* name */ - be_nested_proto( - 5, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 7]) { /* constants */ - /* K0 */ be_nested_str_weak(webserver), - /* K1 */ be_nested_str_weak(has_arg), - /* K2 */ be_nested_str_weak(mtc0), - /* K3 */ be_nested_str_weak(device), - /* K4 */ be_nested_str_weak(stop_basic_commissioning), - /* K5 */ be_nested_str_weak(mtc1), - /* K6 */ be_nested_str_weak(start_root_basic_commissioning), - }), - be_str_weak(web_get_arg), - &be_const_str_solidified, - ( &(const binstruction[17]) { /* code */ - 0xA4060000, // 0000 IMPORT R1 K0 - 0x8C080301, // 0001 GETMET R2 R1 K1 - 0x58100002, // 0002 LDCONST R4 K2 - 0x7C080400, // 0003 CALL R2 2 - 0x780A0003, // 0004 JMPF R2 #0009 - 0x88080103, // 0005 GETMBR R2 R0 K3 - 0x8C080504, // 0006 GETMET R2 R2 K4 - 0x7C080200, // 0007 CALL R2 1 - 0x70020006, // 0008 JMP #0010 - 0x8C080301, // 0009 GETMET R2 R1 K1 - 0x58100005, // 000A LDCONST R4 K5 - 0x7C080400, // 000B CALL R2 2 - 0x780A0002, // 000C JMPF R2 #0010 - 0x88080103, // 000D GETMBR R2 R0 K3 - 0x8C080506, // 000E GETMET R2 R2 K6 - 0x7C080200, // 000F CALL R2 1 - 0x80000000, // 0010 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: show_plugins_configuration -********************************************************************/ -be_local_closure(Matter_UI_show_plugins_configuration, /* name */ - be_nested_proto( - 19, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[38]) { /* constants */ - /* K0 */ be_nested_str_weak(webserver), - /* K1 */ be_nested_str_weak(string), - /* K2 */ be_nested_str_weak(content_send), - /* K3 */ be_nested_str_weak(_X3Cfieldset_X3E_X3Clegend_X3E_X3Cb_X3E_X26nbsp_X3BCurrent_X20Configuration_X26nbsp_X3B_X3C_X2Fb_X3E_X3C_X2Flegend_X3E_X3Cp_X3E_X3C_X2Fp_X3E), - /* K4 */ be_nested_str_weak(_X3Cform_X20action_X3D_X27_X2Fmatterc_X27_X20method_X3D_X27post_X27), - /* K5 */ be_nested_str_weak(onsubmit_X3D_X27return_X20confirm_X28_X22This_X20will_X20RESET_X20the_X20configuration_X20to_X20the_X20default_X2E_X20You_X20will_X20need_X20to_X20associate_X20again_X2E_X22_X29_X3B_X27_X3E), - /* K6 */ be_nested_str_weak(_X3Cbutton_X20name_X3D_X27auto_X27_X20class_X3D_X27button_X20bred_X27_X3EReset_X20and_X20Auto_X2Ddiscover_X3C_X2Fbutton_X3E_X3Cp_X3E_X3C_X2Fp_X3E_X3C_X2Fform_X3E), - /* K7 */ be_nested_str_weak(onsubmit_X3D_X27return_X20confirm_X28_X22Changing_X20the_X20configuration_X20requires_X20to_X20associate_X20again_X2E_X22_X29_X3B_X27_X3E), - /* K8 */ be_nested_str_weak(_X3Ctable_X20style_X3D_X27width_X3A100_X25_X27_X3E), - /* K9 */ be_nested_str_weak(_X3Ctr_X3E_X3Ctd_X20width_X3D_X2735_X27_X3E_X3Cb_X3EEp_X2E_X3C_X2Fb_X3E_X3C_X2Ftd_X3E_X3Ctd_X3E_X3Cb_X3EType_X3C_X2Fb_X3E_X3C_X2Ftd_X3E_X3Ctd_X3E_X3Cb_X3EParam_X3C_X2Fb_X3E_X3C_X2Ftd_X3E_X3C_X2Ftr_X3E), - /* K10 */ be_nested_str_weak(device), - /* K11 */ be_nested_str_weak(k2l_num), - /* K12 */ be_nested_str_weak(plugins_config), - /* K13 */ be_const_int(0), - /* K14 */ be_nested_str_weak(_X3Ctr_X3E_X3Ctd_X3E_X3Cinput_X20type_X3D_X27text_X27_X20name_X3D_X27epnone_X27_X20maxlength_X3D_X274_X27_X20size_X3D_X273_X27_X20value_X3D_X270_X27_X20readonly_X20disabled_X3E_X3C_X2Ftd_X3E), - /* K15 */ be_nested_str_weak(_X3Ctd_X3E_X3Cselect_X20name_X3D_X27pinone_X27_X3E), - /* K16 */ be_nested_str_weak(_X3Coption_X20value_X3D_X27_X27_X20selected_X20disabled_X3ERoot_X20node_X3C_X2Foption_X3E), - /* K17 */ be_nested_str_weak(_X3C_X2Fselect_X3E_X3C_X2Ftd_X3E), - /* K18 */ be_nested_str_weak(_X3Ctd_X3E_X3Cfont_X20size_X3D_X27_X2D1_X27_X3E_X26nbsp_X3B_X3C_X2Ffont_X3E_X3C_X2Ftd_X3E), - /* K19 */ be_const_int(1), - /* K20 */ be_nested_str_weak(find), - /* K21 */ be_nested_str_weak(type), - /* K22 */ be_nested_str_weak(plugins_classes), - /* K23 */ be_nested_str_weak(), - /* K24 */ be_nested_str_weak(ui_conf_to_string), - /* K25 */ be_nested_str_weak(format), - /* K26 */ be_nested_str_weak(_X3Ctr_X3E_X3Ctd_X3E_X3Cinput_X20type_X3D_X27text_X27_X20name_X3D_X27ep_X2503i_X27_X20maxlength_X3D_X274_X27_X20size_X3D_X273_X27_X20pattern_X3D_X27_X5B0_X2D9_X5D_X7B1_X2C4_X7D_X27_X20value_X3D_X27_X25i_X27_X3E_X3C_X2Ftd_X3E), - /* K27 */ be_nested_str_weak(_X3Ctd_X3E_X3Cselect_X20name_X3D_X27pi_X2503i_X27_X3E), - /* K28 */ be_nested_str_weak(plugin_option), - /* K29 */ be_nested_str_weak(_CLASSES_TYPES), - /* K30 */ be_nested_str_weak(_CLASSES_TYPES2), - /* K31 */ be_nested_str_weak(_X3Ctd_X3E_X3Cfont_X20size_X3D_X27_X2D1_X27_X3E_X3Cinput_X20type_X3D_X27text_X27_X20name_X3D_X27arg_X2503i_X27_X20minlength_X3D_X270_X27_X20size_X3D_X278_X27_X20value_X3D_X27_X25s_X27_X3E_X3C_X2Ffont_X3E_X3C_X2Ftd_X3E), - /* K32 */ be_nested_str_weak(html_escape), - /* K33 */ be_nested_str_weak(_X3Ctr_X3E_X3Ctd_X3E_X3Cinput_X20type_X3D_X27text_X27_X20name_X3D_X27ep_X2503i_X27_X20maxlength_X3D_X274_X27_X20size_X3D_X273_X27_X20pattern_X3D_X27_X5B0_X2D9_X5D_X7B1_X2C4_X7D_X27_X20value_X3D_X27_X27_X3E_X3C_X2Ftd_X3E), - /* K34 */ be_nested_str_weak(_X3Ctd_X3E_X3Cfont_X20size_X3D_X27_X2D1_X27_X3E_X3Cinput_X20type_X3D_X27text_X27_X20name_X3D_X27arg_X2503i_X27_X20minlength_X3D_X270_X27_X20size_X3D_X278_X27_X20value_X3D_X27_X27_X3E_X3C_X2Ffont_X3E_X3C_X2Ftd_X3E), - /* K35 */ be_nested_str_weak(_X3C_X2Ftable_X3E_X3Cp_X3E_X3C_X2Fp_X3E), - /* K36 */ be_nested_str_weak(_X3Cbutton_X20name_X3D_X27config_X27_X20class_X3D_X27button_X20bgrn_X27_X3EChange_X20configuration_X3C_X2Fbutton_X3E_X3C_X2Fform_X3E), - /* K37 */ be_nested_str_weak(_X3Cp_X3E_X3C_X2Fp_X3E_X3C_X2Ffieldset_X3E_X3Cp_X3E_X3C_X2Fp_X3E), - }), - be_str_weak(show_plugins_configuration), - &be_const_str_solidified, - ( &(const binstruction[160]) { /* code */ - 0xA4060000, // 0000 IMPORT R1 K0 - 0xA40A0200, // 0001 IMPORT R2 K1 - 0x8C0C0302, // 0002 GETMET R3 R1 K2 - 0x58140003, // 0003 LDCONST R5 K3 - 0x7C0C0400, // 0004 CALL R3 2 - 0x8C0C0302, // 0005 GETMET R3 R1 K2 - 0x58140004, // 0006 LDCONST R5 K4 - 0x7C0C0400, // 0007 CALL R3 2 - 0x8C0C0302, // 0008 GETMET R3 R1 K2 - 0x58140005, // 0009 LDCONST R5 K5 - 0x7C0C0400, // 000A CALL R3 2 - 0x8C0C0302, // 000B GETMET R3 R1 K2 - 0x58140006, // 000C LDCONST R5 K6 - 0x7C0C0400, // 000D CALL R3 2 - 0x8C0C0302, // 000E GETMET R3 R1 K2 - 0x58140004, // 000F LDCONST R5 K4 - 0x7C0C0400, // 0010 CALL R3 2 - 0x8C0C0302, // 0011 GETMET R3 R1 K2 - 0x58140007, // 0012 LDCONST R5 K7 - 0x7C0C0400, // 0013 CALL R3 2 - 0x8C0C0302, // 0014 GETMET R3 R1 K2 - 0x58140008, // 0015 LDCONST R5 K8 - 0x7C0C0400, // 0016 CALL R3 2 - 0x8C0C0302, // 0017 GETMET R3 R1 K2 - 0x58140009, // 0018 LDCONST R5 K9 - 0x7C0C0400, // 0019 CALL R3 2 - 0x880C010A, // 001A GETMBR R3 R0 K10 - 0x8C0C070B, // 001B GETMET R3 R3 K11 - 0x8814010A, // 001C GETMBR R5 R0 K10 - 0x88140B0C, // 001D GETMBR R5 R5 K12 - 0x7C0C0400, // 001E CALL R3 2 - 0x5810000D, // 001F LDCONST R4 K13 - 0x8C140302, // 0020 GETMET R5 R1 K2 - 0x581C000E, // 0021 LDCONST R7 K14 - 0x7C140400, // 0022 CALL R5 2 - 0x8C140302, // 0023 GETMET R5 R1 K2 - 0x581C000F, // 0024 LDCONST R7 K15 - 0x7C140400, // 0025 CALL R5 2 - 0x8C140302, // 0026 GETMET R5 R1 K2 - 0x581C0010, // 0027 LDCONST R7 K16 - 0x7C140400, // 0028 CALL R5 2 - 0x8C140302, // 0029 GETMET R5 R1 K2 - 0x581C0011, // 002A LDCONST R7 K17 - 0x7C140400, // 002B CALL R5 2 - 0x8C140302, // 002C GETMET R5 R1 K2 - 0x581C0012, // 002D LDCONST R7 K18 - 0x7C140400, // 002E CALL R5 2 - 0x6014000C, // 002F GETGBL R5 G12 - 0x5C180600, // 0030 MOVE R6 R3 - 0x7C140200, // 0031 CALL R5 1 - 0x14140805, // 0032 LT R5 R4 R5 - 0x78160045, // 0033 JMPF R5 #007A - 0x94140604, // 0034 GETIDX R5 R3 R4 - 0x1C180B0D, // 0035 EQ R6 R5 K13 - 0x781A0001, // 0036 JMPF R6 #0039 - 0x00100913, // 0037 ADD R4 R4 K19 - 0x7001FFF5, // 0038 JMP #002F - 0x8818010A, // 0039 GETMBR R6 R0 K10 - 0x601C0008, // 003A GETGBL R7 G8 - 0x5C200A00, // 003B MOVE R8 R5 - 0x7C1C0200, // 003C CALL R7 1 - 0x88180D0C, // 003D GETMBR R6 R6 K12 - 0x94180C07, // 003E GETIDX R6 R6 R7 - 0x8C200D14, // 003F GETMET R8 R6 K20 - 0x58280015, // 0040 LDCONST R10 K21 - 0x7C200400, // 0041 CALL R8 2 - 0x5C1C1000, // 0042 MOVE R7 R8 - 0x5C200E00, // 0043 MOVE R8 R7 - 0x74220001, // 0044 JMPT R8 #0047 - 0x00100913, // 0045 ADD R4 R4 K19 - 0x7001FFE7, // 0046 JMP #002F - 0x8820010A, // 0047 GETMBR R8 R0 K10 - 0x88201116, // 0048 GETMBR R8 R8 K22 - 0x8C201114, // 0049 GETMET R8 R8 K20 - 0x5C280E00, // 004A MOVE R10 R7 - 0x7C200400, // 004B CALL R8 2 - 0x58240017, // 004C LDCONST R9 K23 - 0x4C280000, // 004D LDNIL R10 - 0x2028100A, // 004E NE R10 R8 R10 - 0x782A0004, // 004F JMPF R10 #0055 - 0x8C281118, // 0050 GETMET R10 R8 K24 - 0x5C301000, // 0051 MOVE R12 R8 - 0x5C340C00, // 0052 MOVE R13 R6 - 0x7C280600, // 0053 CALL R10 3 - 0x5C241400, // 0054 MOVE R9 R10 - 0x8C280302, // 0055 GETMET R10 R1 K2 - 0x8C300519, // 0056 GETMET R12 R2 K25 - 0x5838001A, // 0057 LDCONST R14 K26 - 0x5C3C0800, // 0058 MOVE R15 R4 - 0x5C400A00, // 0059 MOVE R16 R5 - 0x7C300800, // 005A CALL R12 4 - 0x7C280400, // 005B CALL R10 2 - 0x8C280302, // 005C GETMET R10 R1 K2 - 0x8C300519, // 005D GETMET R12 R2 K25 - 0x5838001B, // 005E LDCONST R14 K27 - 0x5C3C0800, // 005F MOVE R15 R4 - 0x7C300600, // 0060 CALL R12 3 - 0x7C280400, // 0061 CALL R10 2 - 0x8C28011C, // 0062 GETMET R10 R0 K28 - 0x8C300D14, // 0063 GETMET R12 R6 K20 - 0x58380015, // 0064 LDCONST R14 K21 - 0x583C0017, // 0065 LDCONST R15 K23 - 0x7C300600, // 0066 CALL R12 3 - 0x8834011D, // 0067 GETMBR R13 R0 K29 - 0x8838011E, // 0068 GETMBR R14 R0 K30 - 0x7C280800, // 0069 CALL R10 4 - 0x8C280302, // 006A GETMET R10 R1 K2 - 0x8C300519, // 006B GETMET R12 R2 K25 - 0x58380011, // 006C LDCONST R14 K17 - 0x7C300400, // 006D CALL R12 2 - 0x7C280400, // 006E CALL R10 2 - 0x8C280302, // 006F GETMET R10 R1 K2 - 0x8C300519, // 0070 GETMET R12 R2 K25 - 0x5838001F, // 0071 LDCONST R14 K31 - 0x5C3C0800, // 0072 MOVE R15 R4 - 0x8C400320, // 0073 GETMET R16 R1 K32 - 0x5C481200, // 0074 MOVE R18 R9 - 0x7C400400, // 0075 CALL R16 2 - 0x7C300800, // 0076 CALL R12 4 - 0x7C280400, // 0077 CALL R10 2 - 0x00100913, // 0078 ADD R4 R4 K19 - 0x7001FFB4, // 0079 JMP #002F - 0x8C140302, // 007A GETMET R5 R1 K2 - 0x8C1C0519, // 007B GETMET R7 R2 K25 - 0x58240021, // 007C LDCONST R9 K33 - 0x5C280800, // 007D MOVE R10 R4 - 0x7C1C0600, // 007E CALL R7 3 - 0x7C140400, // 007F CALL R5 2 - 0x8C140302, // 0080 GETMET R5 R1 K2 - 0x8C1C0519, // 0081 GETMET R7 R2 K25 - 0x5824001B, // 0082 LDCONST R9 K27 - 0x5C280800, // 0083 MOVE R10 R4 - 0x7C1C0600, // 0084 CALL R7 3 - 0x7C140400, // 0085 CALL R5 2 - 0x8C14011C, // 0086 GETMET R5 R0 K28 - 0x581C0017, // 0087 LDCONST R7 K23 - 0x8820011D, // 0088 GETMBR R8 R0 K29 - 0x8824011E, // 0089 GETMBR R9 R0 K30 - 0x7C140800, // 008A CALL R5 4 - 0x8C140302, // 008B GETMET R5 R1 K2 - 0x8C1C0519, // 008C GETMET R7 R2 K25 - 0x58240011, // 008D LDCONST R9 K17 - 0x7C1C0400, // 008E CALL R7 2 - 0x7C140400, // 008F CALL R5 2 - 0x8C140302, // 0090 GETMET R5 R1 K2 - 0x8C1C0519, // 0091 GETMET R7 R2 K25 - 0x58240022, // 0092 LDCONST R9 K34 - 0x5C280800, // 0093 MOVE R10 R4 - 0x7C1C0600, // 0094 CALL R7 3 - 0x7C140400, // 0095 CALL R5 2 - 0x8C140302, // 0096 GETMET R5 R1 K2 - 0x581C0023, // 0097 LDCONST R7 K35 - 0x7C140400, // 0098 CALL R5 2 - 0x8C140302, // 0099 GETMET R5 R1 K2 - 0x581C0024, // 009A LDCONST R7 K36 - 0x7C140400, // 009B CALL R5 2 - 0x8C140302, // 009C GETMET R5 R1 K2 - 0x581C0025, // 009D LDCONST R7 K37 - 0x7C140400, // 009E CALL R5 2 - 0x80000000, // 009F RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: init -********************************************************************/ -be_local_closure(Matter_UI_init, /* name */ - be_nested_proto( - 5, /* nstack */ + 24, /* nstack */ 2, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -1099,376 +1449,260 @@ be_local_closure(Matter_UI_init, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[ 3]) { /* constants */ - /* K0 */ be_nested_str_weak(device), - /* K1 */ be_nested_str_weak(tasmota), - /* K2 */ be_nested_str_weak(add_driver), - }), - be_str_weak(init), - &be_const_str_solidified, - ( &(const binstruction[ 6]) { /* code */ - 0x90020001, // 0000 SETMBR R0 K0 R1 - 0xB80A0200, // 0001 GETNGBL R2 K1 - 0x8C080502, // 0002 GETMET R2 R2 K2 - 0x5C100000, // 0003 MOVE R4 R0 - 0x7C080400, // 0004 CALL R2 2 - 0x80000000, // 0005 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: web_sensor -********************************************************************/ -be_local_closure(Matter_UI_web_sensor, /* name */ - be_nested_proto( - 13, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[27]) { /* constants */ + ( &(const bvalue[45]) { /* constants */ /* K0 */ be_nested_str_weak(webserver), /* K1 */ be_nested_str_weak(string), - /* K2 */ be_nested_str_weak(tasmota), - /* K3 */ be_nested_str_weak(get_option), + /* K2 */ be_nested_str_weak(json), + /* K3 */ be_nested_str_weak(), /* K4 */ be_nested_str_weak(matter), - /* K5 */ be_nested_str_weak(MATTER_OPTION), - /* K6 */ be_nested_str_weak(device), - /* K7 */ be_nested_str_weak(sessions), - /* K8 */ be_nested_str_weak(count_active_fabrics), - /* K9 */ be_const_int(0), - /* K10 */ be_nested_str_weak(content_send), - /* K11 */ be_nested_str_weak(format), - /* K12 */ be_nested_str_weak(_X3Cdiv_X20style_X3D_X27text_X2Dalign_X3Aright_X3Bfont_X2Dsize_X3A11px_X3Bcolor_X3A_X23aaa_X3Bpadding_X3A0px_X3B_X27_X3E_X25s_X3C_X2Fdiv_X3E), - /* K13 */ be_nested_str_weak(Matter_X3A_X20No_X20active_X20association), - /* K14 */ be_const_int(1), - /* K15 */ be_nested_str_weak(Matter_X3A_X20), - /* K16 */ be_nested_str_weak(_X20active_X20association), - /* K17 */ be_nested_str_weak(s), - /* K18 */ be_nested_str_weak(), - /* K19 */ be_nested_str_weak(show_bridge_status), - /* K20 */ be_nested_str_weak(is_root_commissioning_open), - /* K21 */ be_nested_str_weak(show_commissioning_info), - /* K22 */ be_nested_str_weak(_X3Cbutton_X20onclick_X3D_X27la_X28_X22_X26mtc_X25i_X3D1_X22_X29_X3B_X27_X3E), - /* K23 */ be_nested_str_weak(commissioning_open), - /* K24 */ be_nested_str_weak(_LOGO), - /* K25 */ be_nested_str_weak(_X20Open_X20Commissioning_X3C_X2Fbutton_X3E), - /* K26 */ be_nested_str_weak(_X20Close_X20Commissioning_X3C_X2Fbutton_X3E), + /* K5 */ be_nested_str_weak(Plugin_Bridge_HTTP), + /* K6 */ be_nested_str_weak(PROBE_TIMEOUT), + /* K7 */ be_nested_str_weak(HTTP_remote), + /* K8 */ be_nested_str_weak(call_sync), + /* K9 */ be_nested_str_weak(Status_X208), + /* K10 */ be_nested_str_weak(load), + /* K11 */ be_nested_str_weak(find), + /* K12 */ be_nested_str_weak(StatusSNS), + /* K13 */ be_nested_str_weak(Status_X2011), + /* K14 */ be_nested_str_weak(StatusSTS), + /* K15 */ be_nested_str_weak(tasmota), + /* K16 */ be_nested_str_weak(log), + /* K17 */ be_nested_str_weak(format), + /* K18 */ be_nested_str_weak(MTR_X3A_X20probed_X20_X27_X25s_X27_X20status8_X3D_X25s_X20satus11_X3D_X25s), + /* K19 */ be_const_int(3), + /* K20 */ be_nested_str_weak(generate_config_from_status), + /* K21 */ be_nested_str_weak(content_send), + /* K22 */ be_nested_str_weak(_X3Cfieldset_X3E_X3Clegend_X3E_X3Cb_X3E_X26nbsp_X3BMatter_X20Remote_X20Device_X26nbsp_X3B_X3C_X2Fb_X3E_X3C_X2Flegend_X3E_X3Cp_X3E_X3C_X2Fp_X3E_X3Cp_X3E_X3Cb_X3EAdd_X20Remote_X20sensor_X20or_X20device_X3C_X2Fb_X3E_X3C_X2Fp_X3E), + /* K23 */ be_nested_str_weak(_X3Cp_X3E_X26_X23x1F517_X3B_X20_X3Ca_X20target_X3D_X27_blank_X27_X20href_X3D_X22http_X3A_X2F_X2F_X25s_X2F_X22_X3E_X25s_X3C_X2Fa_X3E_X3C_X2Fp_X3E), + /* K24 */ be_nested_str_weak(html_escape), + /* K25 */ be_nested_str_weak(_X3Cform_X20action_X3D_X27_X2Fmatterc_X27_X20method_X3D_X27post_X27_X3E_X3Ctable_X20style_X3D_X27width_X3A100_X25_X27_X3E_X3Ctr_X3E_X3Ctd_X20width_X3D_X27145_X27_X3EType_X3C_X2Ftd_X3E_X3Ctd_X3EParameter_X3C_X2Ftd_X3E_X3C_X2Ftr_X3E), + /* K26 */ be_nested_str_weak(_X3Cinput_X20name_X3D_X27url_X27_X20type_X3D_X27hidden_X27_X20value_X3D_X27_X25s_X27_X3E), + /* K27 */ be_const_int(0), + /* K28 */ be_nested_str_weak(type), + /* K29 */ be_nested_str_weak(http_), + /* K30 */ be_nested_str_weak(device), + /* K31 */ be_nested_str_weak(plugins_classes), + /* K32 */ be_nested_str_weak(ui_conf_to_string), + /* K33 */ be_nested_str_weak(_X3Ctr_X3E_X3Ctd_X3E_X3Cfont_X20size_X3D_X27_X2D1_X27_X3E_X3Cselect_X20name_X3D_X27pi_X25i_X27_X3E), + /* K34 */ be_nested_str_weak(plugin_option), + /* K35 */ be_nested_str_weak(_CLASSES_TYPES2), + /* K36 */ be_nested_str_weak(_X3C_X2Fselect_X3E_X3C_X2Ffont_X3E_X3C_X2Ftd_X3E_X3Ctd_X3E_X3Cfont_X20size_X3D_X27_X2D1_X27_X3E), + /* K37 */ be_nested_str_weak(_X3Cinput_X20type_X3D_X27text_X27_X20name_X3D_X27arg_X25i_X27_X20minlength_X3D_X270_X27_X20size_X3D_X278_X27_X20value_X3D_X27_X25s_X27_X3E), + /* K38 */ be_nested_str_weak(_X3C_X2Ffont_X3E_X3C_X2Ftd_X3E_X3C_X2Ftr_X3E), + /* K39 */ be_const_int(1), + /* K40 */ be_nested_str_weak(_X3C_X2Ftable_X3E), + /* K41 */ be_nested_str_weak(_X3Cdiv_X20style_X3D_X27display_X3A_X20block_X3B_X27_X3E_X3C_X2Fdiv_X3E), + /* K42 */ be_nested_str_weak(_X3Cbutton_X20name_X3D_X27addrem_X27_X20class_X3D_X27button_X20bgrn_X27_X3EAdd_X20endpoints_X3C_X2Fbutton_X3E_X3C_X2Fform_X3E), + /* K43 */ be_nested_str_weak(_X3C_X2Fform_X3E_X3C_X2Ffieldset_X3E_X3Cp_X3E_X3C_X2Fp_X3E), + /* K44 */ be_nested_str_weak(_X3Cp_X3E_X3Cb_X3EUnable_X20to_X20connect_X20to_X20_X27_X25s_X27_X3C_X2Fb_X3E_X3C_X2Fp_X3E), }), - be_str_weak(web_sensor), + be_str_weak(show_remote_autoconf), &be_const_str_solidified, - ( &(const binstruction[77]) { /* code */ - 0xA4060000, // 0000 IMPORT R1 K0 - 0xA40A0200, // 0001 IMPORT R2 K1 - 0xB80E0400, // 0002 GETNGBL R3 K2 - 0x8C0C0703, // 0003 GETMET R3 R3 K3 - 0xB8160800, // 0004 GETNGBL R5 K4 - 0x88140B05, // 0005 GETMBR R5 R5 K5 - 0x7C0C0400, // 0006 CALL R3 2 - 0x780E0043, // 0007 JMPF R3 #004C - 0x88100106, // 0008 GETMBR R4 R0 K6 - 0x88100907, // 0009 GETMBR R4 R4 K7 - 0x8C100908, // 000A GETMET R4 R4 K8 - 0x7C100200, // 000B CALL R4 1 - 0x1C140909, // 000C EQ R5 R4 K9 - 0x78160006, // 000D JMPF R5 #0015 - 0x8C14030A, // 000E GETMET R5 R1 K10 - 0x8C1C050B, // 000F GETMET R7 R2 K11 - 0x5824000C, // 0010 LDCONST R9 K12 - 0x5828000D, // 0011 LDCONST R10 K13 - 0x7C1C0600, // 0012 CALL R7 3 - 0x7C140400, // 0013 CALL R5 2 - 0x7002000F, // 0014 JMP #0025 - 0x2414090E, // 0015 GT R5 R4 K14 - 0x8C18030A, // 0016 GETMET R6 R1 K10 - 0x8C20050B, // 0017 GETMET R8 R2 K11 - 0x5828000C, // 0018 LDCONST R10 K12 - 0x602C0008, // 0019 GETGBL R11 G8 - 0x5C300800, // 001A MOVE R12 R4 - 0x7C2C0200, // 001B CALL R11 1 - 0x002E1E0B, // 001C ADD R11 K15 R11 - 0x002C1710, // 001D ADD R11 R11 K16 - 0x78160001, // 001E JMPF R5 #0021 - 0x58300011, // 001F LDCONST R12 K17 - 0x70020000, // 0020 JMP #0022 - 0x58300012, // 0021 LDCONST R12 K18 - 0x002C160C, // 0022 ADD R11 R11 R12 - 0x7C200600, // 0023 CALL R8 3 - 0x7C180400, // 0024 CALL R6 2 - 0x8C140113, // 0025 GETMET R5 R0 K19 - 0x7C140200, // 0026 CALL R5 1 - 0x88140106, // 0027 GETMBR R5 R0 K6 - 0x8C140B14, // 0028 GETMET R5 R5 K20 - 0x7C140200, // 0029 CALL R5 1 - 0x78160001, // 002A JMPF R5 #002D - 0x8C140115, // 002B GETMET R5 R0 K21 - 0x7C140200, // 002C CALL R5 1 - 0x1C140909, // 002D EQ R5 R4 K9 - 0x7816001C, // 002E JMPF R5 #004C - 0x8C14030A, // 002F GETMET R5 R1 K10 - 0x8C1C050B, // 0030 GETMET R7 R2 K11 - 0x58240016, // 0031 LDCONST R9 K22 - 0x88280106, // 0032 GETMBR R10 R0 K6 - 0x88281517, // 0033 GETMBR R10 R10 K23 - 0x4C2C0000, // 0034 LDNIL R11 - 0x1C28140B, // 0035 EQ R10 R10 R11 - 0x782A0001, // 0036 JMPF R10 #0039 - 0x5828000E, // 0037 LDCONST R10 K14 - 0x70020000, // 0038 JMP #003A - 0x58280009, // 0039 LDCONST R10 K9 - 0x7C1C0600, // 003A CALL R7 3 - 0x7C140400, // 003B CALL R5 2 - 0x8C14030A, // 003C GETMET R5 R1 K10 - 0xB81E0800, // 003D GETNGBL R7 K4 - 0x881C0F18, // 003E GETMBR R7 R7 K24 - 0x7C140400, // 003F CALL R5 2 - 0x88140106, // 0040 GETMBR R5 R0 K6 - 0x88140B17, // 0041 GETMBR R5 R5 K23 - 0x4C180000, // 0042 LDNIL R6 - 0x1C140A06, // 0043 EQ R5 R5 R6 - 0x78160003, // 0044 JMPF R5 #0049 - 0x8C14030A, // 0045 GETMET R5 R1 K10 - 0x581C0019, // 0046 LDCONST R7 K25 - 0x7C140400, // 0047 CALL R5 2 - 0x70020002, // 0048 JMP #004C - 0x8C14030A, // 0049 GETMET R5 R1 K10 - 0x581C001A, // 004A LDCONST R7 K26 - 0x7C140400, // 004B CALL R5 2 - 0x80000000, // 004C RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: web_add_config_button -********************************************************************/ -be_local_closure(Matter_UI_web_add_config_button, /* name */ - be_nested_proto( - 5, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 6]) { /* constants */ - /* K0 */ be_nested_str_weak(webserver), - /* K1 */ be_nested_str_weak(content_send), - /* K2 */ be_nested_str_weak(_X3Cp_X3E_X3Cform_X20id_X3Dac_X20action_X3D_X27matterc_X27_X20style_X3D_X27display_X3A_X20block_X3B_X27_X20method_X3D_X27get_X27_X3E_X3Cbutton_X3E), - /* K3 */ be_nested_str_weak(matter), - /* K4 */ be_nested_str_weak(_LOGO), - /* K5 */ be_nested_str_weak(_X20Configure_X20Matter_X3C_X2Fbutton_X3E_X3C_X2Fform_X3E_X3C_X2Fp_X3E), - }), - be_str_weak(web_add_config_button), - &be_const_str_solidified, - ( &(const binstruction[12]) { /* code */ - 0xA4060000, // 0000 IMPORT R1 K0 - 0x8C080301, // 0001 GETMET R2 R1 K1 - 0x58100002, // 0002 LDCONST R4 K2 - 0x7C080400, // 0003 CALL R2 2 - 0x8C080301, // 0004 GETMET R2 R1 K1 - 0xB8120600, // 0005 GETNGBL R4 K3 - 0x88100904, // 0006 GETMBR R4 R4 K4 - 0x7C080400, // 0007 CALL R2 2 - 0x8C080301, // 0008 GETMET R2 R1 K1 - 0x58100005, // 0009 LDCONST R4 K5 - 0x7C080400, // 000A CALL R2 2 - 0x80000000, // 000B RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: plugin_option -********************************************************************/ -be_local_closure(Matter_UI_plugin_option, /* name */ - be_nested_proto( - 17, /* nstack */ - 3, /* argc */ - 3, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[17]) { /* constants */ - /* K0 */ be_nested_str_weak(webserver), - /* K1 */ be_nested_str_weak(string), - /* K2 */ be_nested_str_weak(split), - /* K3 */ be_nested_str_weak(_X7C), - /* K4 */ be_nested_str_weak(stop_iteration), - /* K5 */ be_const_int(0), - /* K6 */ be_nested_str_weak(), - /* K7 */ be_nested_str_weak(content_send), - /* K8 */ be_nested_str_weak(_X3Coption_X20value_X3D_X27_X27_X3E_X3C_X2Foption_X3E), - /* K9 */ be_nested_str_weak(_X2Dhttp), - /* K10 */ be_nested_str_weak(_X3Coption_X20value_X3D_X27_X27_X20disabled_X3E_X2D_X2D_X2D_X20Tasmota_X20Remote_X20_X2D_X2D_X2D_X3C_X2Foption_X3E), - /* K11 */ be_nested_str_weak(device), - /* K12 */ be_nested_str_weak(get_plugin_class_displayname), - /* K13 */ be_nested_str_weak(format), - /* K14 */ be_nested_str_weak(_X3Coption_X20value_X3D_X27_X25s_X27_X25s_X3E_X25s_X3C_X2Foption_X3E), - /* K15 */ be_nested_str_weak(_X20selected), - /* K16 */ be_const_int(1), - }), - be_str_weak(plugin_option), - &be_const_str_solidified, - ( &(const binstruction[57]) { /* code */ - 0xA40E0000, // 0000 IMPORT R3 K0 - 0xA4120200, // 0001 IMPORT R4 K1 - 0x60140012, // 0002 GETGBL R5 G18 - 0x7C140000, // 0003 CALL R5 0 - 0x60180010, // 0004 GETGBL R6 G16 - 0x5C1C0400, // 0005 MOVE R7 R2 - 0x7C180200, // 0006 CALL R6 1 - 0xA8020007, // 0007 EXBLK 0 #0010 - 0x5C1C0C00, // 0008 MOVE R7 R6 - 0x7C1C0000, // 0009 CALL R7 0 - 0x8C200902, // 000A GETMET R8 R4 K2 - 0x5C280E00, // 000B MOVE R10 R7 - 0x582C0003, // 000C LDCONST R11 K3 - 0x7C200600, // 000D CALL R8 3 - 0x00140A08, // 000E ADD R5 R5 R8 - 0x7001FFF7, // 000F JMP #0008 - 0x58180004, // 0010 LDCONST R6 K4 - 0xAC180200, // 0011 CATCH R6 1 0 - 0xB0080000, // 0012 RAISE 2 R0 R0 - 0x58180005, // 0013 LDCONST R6 K5 - 0x601C000C, // 0014 GETGBL R7 G12 - 0x5C200A00, // 0015 MOVE R8 R5 - 0x7C1C0200, // 0016 CALL R7 1 - 0x141C0C07, // 0017 LT R7 R6 R7 - 0x781E001E, // 0018 JMPF R7 #0038 - 0x941C0A06, // 0019 GETIDX R7 R5 R6 - 0x1C200F06, // 001A EQ R8 R7 K6 - 0x78220003, // 001B JMPF R8 #0020 - 0x8C200707, // 001C GETMET R8 R3 K7 - 0x58280008, // 001D LDCONST R10 K8 - 0x7C200400, // 001E CALL R8 2 - 0x70020015, // 001F JMP #0036 - 0x1C200F09, // 0020 EQ R8 R7 K9 - 0x78220003, // 0021 JMPF R8 #0026 - 0x8C200707, // 0022 GETMET R8 R3 K7 - 0x5828000A, // 0023 LDCONST R10 K10 - 0x7C200400, // 0024 CALL R8 2 - 0x7002000F, // 0025 JMP #0036 - 0x8820010B, // 0026 GETMBR R8 R0 K11 - 0x8C20110C, // 0027 GETMET R8 R8 K12 - 0x5C280E00, // 0028 MOVE R10 R7 - 0x7C200400, // 0029 CALL R8 2 - 0x8C240707, // 002A GETMET R9 R3 K7 - 0x8C2C090D, // 002B GETMET R11 R4 K13 - 0x5834000E, // 002C LDCONST R13 K14 - 0x5C380E00, // 002D MOVE R14 R7 - 0x1C3C0E01, // 002E EQ R15 R7 R1 - 0x783E0001, // 002F JMPF R15 #0032 - 0x583C000F, // 0030 LDCONST R15 K15 - 0x70020000, // 0031 JMP #0033 - 0x583C0006, // 0032 LDCONST R15 K6 - 0x5C401000, // 0033 MOVE R16 R8 - 0x7C2C0A00, // 0034 CALL R11 5 - 0x7C240400, // 0035 CALL R9 2 - 0x00180D10, // 0036 ADD R6 R6 K16 - 0x7001FFDB, // 0037 JMP #0014 - 0x80000000, // 0038 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: show_enable -********************************************************************/ -be_local_closure(Matter_UI_show_enable, /* name */ - be_nested_proto( - 11, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[20]) { /* constants */ - /* K0 */ be_nested_str_weak(webserver), - /* K1 */ be_nested_str_weak(string), - /* K2 */ be_nested_str_weak(tasmota), - /* K3 */ be_nested_str_weak(get_option), - /* K4 */ be_nested_str_weak(matter), - /* K5 */ be_nested_str_weak(MATTER_OPTION), - /* K6 */ be_nested_str_weak(content_send), - /* K7 */ be_nested_str_weak(format), - /* K8 */ be_nested_str_weak(_X3Cfieldset_X3E_X3Clegend_X3E_X3Cb_X3E_X26nbsp_X3BMatter_X20_X25s_X26nbsp_X3B_X3C_X2Fb_X3E_X3C_X2Flegend_X3E_X3Cp_X3E_X3C_X2Fp_X3E), - /* K9 */ be_nested_str_weak(Enabled), - /* K10 */ be_nested_str_weak(Disabled), - /* K11 */ be_nested_str_weak(_X3Cp_X20style_X3D_X27width_X3A320px_X3B_X27_X3ECheck_X20the_X20_X3Ca_X20href_X3D_X27https_X3A_X2F_X2Ftasmota_X2Egithub_X2Eio_X2Fdocs_X2FMatter_X2F_X27_X20target_X3D_X27_blank_X27_X3EMatter_X20documentation_X3C_X2Fa_X3E_X2E_X3C_X2Fp_X3E), - /* K12 */ be_nested_str_weak(_X3Cform_X20action_X3D_X27_X2Fmatterc_X27_X20method_X3D_X27post_X27_X20onsubmit_X3D_X27return_X20confirm_X28_X22This_X20will_X20cause_X20a_X20restart_X2E_X22_X29_X3B_X27_X3E), - /* K13 */ be_nested_str_weak(_X3Cp_X3E_X3C_X2Fp_X3E_X3Cbutton_X20name_X3D_X27_X25s_X27_X20class_X3D_X27button_X20bgrn_X27_X3E), - /* K14 */ be_nested_str_weak(disable), - /* K15 */ be_nested_str_weak(enable), - /* K16 */ be_nested_str_weak(Disable), - /* K17 */ be_nested_str_weak(Enable), - /* K18 */ be_nested_str_weak(_X20Matter_X3C_X2Fbutton_X3E_X3C_X2Fform_X3E_X3C_X2Fp_X3E), - /* K19 */ be_nested_str_weak(_X3Cp_X3E_X3C_X2Fp_X3E_X3C_X2Ffieldset_X3E_X3Cp_X3E_X3C_X2Fp_X3E), - }), - be_str_weak(show_enable), - &be_const_str_solidified, - ( &(const binstruction[44]) { /* code */ + ( &(const binstruction[204]) { /* code */ 0xA40A0000, // 0000 IMPORT R2 K0 0xA40E0200, // 0001 IMPORT R3 K1 - 0xB8120400, // 0002 GETNGBL R4 K2 - 0x8C100903, // 0003 GETMET R4 R4 K3 - 0xB81A0800, // 0004 GETNGBL R6 K4 - 0x88180D05, // 0005 GETMBR R6 R6 K5 - 0x7C100400, // 0006 CALL R4 2 - 0x8C140506, // 0007 GETMET R5 R2 K6 - 0x8C1C0707, // 0008 GETMET R7 R3 K7 - 0x58240008, // 0009 LDCONST R9 K8 - 0x78120001, // 000A JMPF R4 #000D - 0x58280009, // 000B LDCONST R10 K9 - 0x70020000, // 000C JMP #000E - 0x5828000A, // 000D LDCONST R10 K10 - 0x7C1C0600, // 000E CALL R7 3 - 0x7C140400, // 000F CALL R5 2 - 0x8C140506, // 0010 GETMET R5 R2 K6 - 0x581C000B, // 0011 LDCONST R7 K11 - 0x7C140400, // 0012 CALL R5 2 - 0x8C140506, // 0013 GETMET R5 R2 K6 - 0x581C000C, // 0014 LDCONST R7 K12 - 0x7C140400, // 0015 CALL R5 2 - 0x8C140506, // 0016 GETMET R5 R2 K6 - 0x8C1C0707, // 0017 GETMET R7 R3 K7 - 0x5824000D, // 0018 LDCONST R9 K13 - 0x78120001, // 0019 JMPF R4 #001C - 0x5828000E, // 001A LDCONST R10 K14 - 0x70020000, // 001B JMP #001D - 0x5828000F, // 001C LDCONST R10 K15 - 0x7C1C0600, // 001D CALL R7 3 - 0x7C140400, // 001E CALL R5 2 - 0x8C140506, // 001F GETMET R5 R2 K6 - 0x78120001, // 0020 JMPF R4 #0023 - 0x581C0010, // 0021 LDCONST R7 K16 - 0x70020000, // 0022 JMP #0024 - 0x581C0011, // 0023 LDCONST R7 K17 - 0x7C140400, // 0024 CALL R5 2 - 0x8C140506, // 0025 GETMET R5 R2 K6 - 0x581C0012, // 0026 LDCONST R7 K18 - 0x7C140400, // 0027 CALL R5 2 - 0x8C140506, // 0028 GETMET R5 R2 K6 - 0x581C0013, // 0029 LDCONST R7 K19 - 0x7C140400, // 002A CALL R5 2 - 0x80040800, // 002B RET 1 R4 + 0xA4120400, // 0002 IMPORT R4 K2 + 0x1C140303, // 0003 EQ R5 R1 K3 + 0x78160000, // 0004 JMPF R5 #0006 + 0x80000A00, // 0005 RET 0 + 0xB8160800, // 0006 GETNGBL R5 K4 + 0x88140B05, // 0007 GETMBR R5 R5 K5 + 0x88140B06, // 0008 GETMBR R5 R5 K6 + 0xB81A0800, // 0009 GETNGBL R6 K4 + 0x8C180D07, // 000A GETMET R6 R6 K7 + 0x5C200200, // 000B MOVE R8 R1 + 0x5C240A00, // 000C MOVE R9 R5 + 0x7C180600, // 000D CALL R6 3 + 0x8C1C0D08, // 000E GETMET R7 R6 K8 + 0x58240009, // 000F LDCONST R9 K9 + 0x5C280A00, // 0010 MOVE R10 R5 + 0x7C1C0600, // 0011 CALL R7 3 + 0x4C200000, // 0012 LDNIL R8 + 0x20200E08, // 0013 NE R8 R7 R8 + 0x78220003, // 0014 JMPF R8 #0019 + 0x8C20090A, // 0015 GETMET R8 R4 K10 + 0x5C280E00, // 0016 MOVE R10 R7 + 0x7C200400, // 0017 CALL R8 2 + 0x5C1C1000, // 0018 MOVE R7 R8 + 0x4C200000, // 0019 LDNIL R8 + 0x20200E08, // 001A NE R8 R7 R8 + 0x78220003, // 001B JMPF R8 #0020 + 0x8C200F0B, // 001C GETMET R8 R7 K11 + 0x5828000C, // 001D LDCONST R10 K12 + 0x7C200400, // 001E CALL R8 2 + 0x5C1C1000, // 001F MOVE R7 R8 + 0x4C200000, // 0020 LDNIL R8 + 0x4C240000, // 0021 LDNIL R9 + 0x20240E09, // 0022 NE R9 R7 R9 + 0x78260012, // 0023 JMPF R9 #0037 + 0x8C240D08, // 0024 GETMET R9 R6 K8 + 0x582C000D, // 0025 LDCONST R11 K13 + 0x5C300A00, // 0026 MOVE R12 R5 + 0x7C240600, // 0027 CALL R9 3 + 0x5C201200, // 0028 MOVE R8 R9 + 0x4C240000, // 0029 LDNIL R9 + 0x20241009, // 002A NE R9 R8 R9 + 0x78260003, // 002B JMPF R9 #0030 + 0x8C24090A, // 002C GETMET R9 R4 K10 + 0x5C2C1000, // 002D MOVE R11 R8 + 0x7C240400, // 002E CALL R9 2 + 0x5C201200, // 002F MOVE R8 R9 + 0x4C240000, // 0030 LDNIL R9 + 0x20241009, // 0031 NE R9 R8 R9 + 0x78260003, // 0032 JMPF R9 #0037 + 0x8C24110B, // 0033 GETMET R9 R8 K11 + 0x582C000E, // 0034 LDCONST R11 K14 + 0x7C240400, // 0035 CALL R9 2 + 0x5C201200, // 0036 MOVE R8 R9 + 0x4C240000, // 0037 LDNIL R9 + 0x20240E09, // 0038 NE R9 R7 R9 + 0x78260088, // 0039 JMPF R9 #00C3 + 0x4C240000, // 003A LDNIL R9 + 0x20241009, // 003B NE R9 R8 R9 + 0x78260085, // 003C JMPF R9 #00C3 + 0xB8261E00, // 003D GETNGBL R9 K15 + 0x8C241310, // 003E GETMET R9 R9 K16 + 0x8C2C0711, // 003F GETMET R11 R3 K17 + 0x58340012, // 0040 LDCONST R13 K18 + 0x5C380200, // 0041 MOVE R14 R1 + 0x603C0008, // 0042 GETGBL R15 G8 + 0x5C400E00, // 0043 MOVE R16 R7 + 0x7C3C0200, // 0044 CALL R15 1 + 0x60400008, // 0045 GETGBL R16 G8 + 0x5C441000, // 0046 MOVE R17 R8 + 0x7C400200, // 0047 CALL R16 1 + 0x7C2C0A00, // 0048 CALL R11 5 + 0x58300013, // 0049 LDCONST R12 K19 + 0x7C240600, // 004A CALL R9 3 + 0x8C240114, // 004B GETMET R9 R0 K20 + 0x5C2C0E00, // 004C MOVE R11 R7 + 0x5C301000, // 004D MOVE R12 R8 + 0x7C240600, // 004E CALL R9 3 + 0x8C280515, // 004F GETMET R10 R2 K21 + 0x58300016, // 0050 LDCONST R12 K22 + 0x7C280400, // 0051 CALL R10 2 + 0x8C280515, // 0052 GETMET R10 R2 K21 + 0x8C300711, // 0053 GETMET R12 R3 K17 + 0x58380017, // 0054 LDCONST R14 K23 + 0x8C3C0518, // 0055 GETMET R15 R2 K24 + 0x5C440200, // 0056 MOVE R17 R1 + 0x7C3C0400, // 0057 CALL R15 2 + 0x8C400518, // 0058 GETMET R16 R2 K24 + 0x5C480200, // 0059 MOVE R18 R1 + 0x7C400400, // 005A CALL R16 2 + 0x7C300800, // 005B CALL R12 4 + 0x7C280400, // 005C CALL R10 2 + 0x8C280515, // 005D GETMET R10 R2 K21 + 0x58300019, // 005E LDCONST R12 K25 + 0x7C280400, // 005F CALL R10 2 + 0x8C280515, // 0060 GETMET R10 R2 K21 + 0x8C300711, // 0061 GETMET R12 R3 K17 + 0x5838001A, // 0062 LDCONST R14 K26 + 0x8C3C0518, // 0063 GETMET R15 R2 K24 + 0x5C440200, // 0064 MOVE R17 R1 + 0x7C3C0400, // 0065 CALL R15 2 + 0x7C300600, // 0066 CALL R12 3 + 0x7C280400, // 0067 CALL R10 2 + 0x5828001B, // 0068 LDCONST R10 K27 + 0x602C000C, // 0069 GETGBL R11 G12 + 0x5C301200, // 006A MOVE R12 R9 + 0x7C2C0200, // 006B CALL R11 1 + 0x142C140B, // 006C LT R11 R10 R11 + 0x782E0030, // 006D JMPF R11 #009F + 0x942C120A, // 006E GETIDX R11 R9 R10 + 0x8C30170B, // 006F GETMET R12 R11 K11 + 0x5838001C, // 0070 LDCONST R14 K28 + 0x583C0003, // 0071 LDCONST R15 K3 + 0x7C300600, // 0072 CALL R12 3 + 0x20341903, // 0073 NE R13 R12 K3 + 0x78360000, // 0074 JMPF R13 #0076 + 0x00323A0C, // 0075 ADD R12 K29 R12 + 0x8834011E, // 0076 GETMBR R13 R0 K30 + 0x88341B1F, // 0077 GETMBR R13 R13 K31 + 0x8C341B0B, // 0078 GETMET R13 R13 K11 + 0x5C3C1800, // 0079 MOVE R15 R12 + 0x7C340400, // 007A CALL R13 2 + 0x58380003, // 007B LDCONST R14 K3 + 0x4C3C0000, // 007C LDNIL R15 + 0x203C1A0F, // 007D NE R15 R13 R15 + 0x783E0004, // 007E JMPF R15 #0084 + 0x8C3C1B20, // 007F GETMET R15 R13 K32 + 0x5C441A00, // 0080 MOVE R17 R13 + 0x5C481600, // 0081 MOVE R18 R11 + 0x7C3C0600, // 0082 CALL R15 3 + 0x5C381E00, // 0083 MOVE R14 R15 + 0x8C3C0515, // 0084 GETMET R15 R2 K21 + 0x8C440711, // 0085 GETMET R17 R3 K17 + 0x584C0021, // 0086 LDCONST R19 K33 + 0x5C501400, // 0087 MOVE R20 R10 + 0x7C440600, // 0088 CALL R17 3 + 0x7C3C0400, // 0089 CALL R15 2 + 0x8C3C0122, // 008A GETMET R15 R0 K34 + 0x5C441800, // 008B MOVE R17 R12 + 0x88480123, // 008C GETMBR R18 R0 K35 + 0x7C3C0600, // 008D CALL R15 3 + 0x8C3C0515, // 008E GETMET R15 R2 K21 + 0x58440024, // 008F LDCONST R17 K36 + 0x7C3C0400, // 0090 CALL R15 2 + 0x8C3C0515, // 0091 GETMET R15 R2 K21 + 0x8C440711, // 0092 GETMET R17 R3 K17 + 0x584C0025, // 0093 LDCONST R19 K37 + 0x5C501400, // 0094 MOVE R20 R10 + 0x8C540518, // 0095 GETMET R21 R2 K24 + 0x5C5C1C00, // 0096 MOVE R23 R14 + 0x7C540400, // 0097 CALL R21 2 + 0x7C440800, // 0098 CALL R17 4 + 0x7C3C0400, // 0099 CALL R15 2 + 0x8C3C0515, // 009A GETMET R15 R2 K21 + 0x58440026, // 009B LDCONST R17 K38 + 0x7C3C0400, // 009C CALL R15 2 + 0x00281527, // 009D ADD R10 R10 K39 + 0x7001FFC9, // 009E JMP #0069 + 0x8C2C0515, // 009F GETMET R11 R2 K21 + 0x8C340711, // 00A0 GETMET R13 R3 K17 + 0x583C0021, // 00A1 LDCONST R15 K33 + 0x5C401400, // 00A2 MOVE R16 R10 + 0x7C340600, // 00A3 CALL R13 3 + 0x7C2C0400, // 00A4 CALL R11 2 + 0x8C2C0122, // 00A5 GETMET R11 R0 K34 + 0x58340003, // 00A6 LDCONST R13 K3 + 0x88380123, // 00A7 GETMBR R14 R0 K35 + 0x7C2C0600, // 00A8 CALL R11 3 + 0x8C2C0515, // 00A9 GETMET R11 R2 K21 + 0x58340024, // 00AA LDCONST R13 K36 + 0x7C2C0400, // 00AB CALL R11 2 + 0x8C2C0515, // 00AC GETMET R11 R2 K21 + 0x8C340711, // 00AD GETMET R13 R3 K17 + 0x583C0025, // 00AE LDCONST R15 K37 + 0x5C401400, // 00AF MOVE R16 R10 + 0x58440003, // 00B0 LDCONST R17 K3 + 0x7C340800, // 00B1 CALL R13 4 + 0x7C2C0400, // 00B2 CALL R11 2 + 0x8C2C0515, // 00B3 GETMET R11 R2 K21 + 0x58340026, // 00B4 LDCONST R13 K38 + 0x7C2C0400, // 00B5 CALL R11 2 + 0x8C2C0515, // 00B6 GETMET R11 R2 K21 + 0x58340028, // 00B7 LDCONST R13 K40 + 0x7C2C0400, // 00B8 CALL R11 2 + 0x8C2C0515, // 00B9 GETMET R11 R2 K21 + 0x58340029, // 00BA LDCONST R13 K41 + 0x7C2C0400, // 00BB CALL R11 2 + 0x8C2C0515, // 00BC GETMET R11 R2 K21 + 0x5834002A, // 00BD LDCONST R13 K42 + 0x7C2C0400, // 00BE CALL R11 2 + 0x8C2C0515, // 00BF GETMET R11 R2 K21 + 0x5834002B, // 00C0 LDCONST R13 K43 + 0x7C2C0400, // 00C1 CALL R11 2 + 0x70020007, // 00C2 JMP #00CB + 0x8C240515, // 00C3 GETMET R9 R2 K21 + 0x8C2C0711, // 00C4 GETMET R11 R3 K17 + 0x5834002C, // 00C5 LDCONST R13 K44 + 0x8C380518, // 00C6 GETMET R14 R2 K24 + 0x5C400200, // 00C7 MOVE R16 R1 + 0x7C380400, // 00C8 CALL R14 2 + 0x7C2C0600, // 00C9 CALL R11 3 + 0x7C240400, // 00CA CALL R9 2 + 0x80000000, // 00CB RET 0 }) ) ); @@ -1476,11 +1710,11 @@ be_local_closure(Matter_UI_show_enable, /* name */ /******************************************************************** -** Solidified function: show_fabric_info +** Solidified function: page_part_mgr_add ********************************************************************/ -be_local_closure(Matter_UI_show_fabric_info, /* name */ +be_local_closure(Matter_UI_page_part_mgr_add, /* name */ be_nested_proto( - 16, /* nstack */ + 7, /* nstack */ 1, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -1488,146 +1722,51 @@ be_local_closure(Matter_UI_show_fabric_info, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[31]) { /* constants */ + ( &(const bvalue[13]) { /* constants */ /* K0 */ be_nested_str_weak(webserver), /* K1 */ be_nested_str_weak(string), - /* K2 */ be_nested_str_weak(content_send), - /* K3 */ be_nested_str_weak(_X3Cfieldset_X3E_X3Clegend_X3E_X3Cb_X3E_X26nbsp_X3BFabrics_X26nbsp_X3B_X3C_X2Fb_X3E_X3C_X2Flegend_X3E_X3Cp_X3E_X3C_X2Fp_X3E), - /* K4 */ be_nested_str_weak(_X3Cp_X3EAssociated_X20fabrics_X3A_X3C_X2Fp_X3E), - /* K5 */ be_nested_str_weak(device), - /* K6 */ be_nested_str_weak(sessions), - /* K7 */ be_const_int(0), - /* K8 */ be_nested_str_weak(_X3Cp_X3E_X3Cb_X3ENone_X3C_X2Fb_X3E_X3C_X2Fp_X3E), - /* K9 */ be_nested_str_weak(fabrics), - /* K10 */ be_nested_str_weak(persistables), - /* K11 */ be_nested_str_weak(_X3Chr_X3E), - /* K12 */ be_nested_str_weak(fabric_label), - /* K13 */ be_nested_str_weak(_X3CNo_X20label_X3E), - /* K14 */ be_nested_str_weak(html_escape), - /* K15 */ be_nested_str_weak(format), - /* K16 */ be_nested_str_weak(_X3Cfieldset_X3E_X3Clegend_X3E_X3Cb_X3E_X26nbsp_X3B_X23_X25i_X20_X25s_X3C_X2Fb_X3E_X20_X28_X25s_X29_X26nbsp_X3B_X3C_X2Flegend_X3E_X3Cp_X3E_X3C_X2Fp_X3E), - /* K17 */ be_nested_str_weak(get_fabric_index), - /* K18 */ be_nested_str_weak(get_admin_vendor_name), - /* K19 */ be_nested_str_weak(get_fabric_id), - /* K20 */ be_nested_str_weak(copy), - /* K21 */ be_nested_str_weak(reverse), - /* K22 */ be_nested_str_weak(get_device_id), - /* K23 */ be_nested_str_weak(Fabric_X3A_X20_X25s_X3Cbr_X3E), - /* K24 */ be_nested_str_weak(tohex), - /* K25 */ be_nested_str_weak(Device_X3A_X20_X25s_X3Cbr_X3E_X26nbsp_X3B), - /* K26 */ be_nested_str_weak(_X3Cform_X20action_X3D_X27_X2Fmatterc_X27_X20method_X3D_X27post_X27_X20onsubmit_X3D_X27return_X20confirm_X28_X22Are_X20you_X20sure_X3F_X22_X29_X3B_X27_X3E), - /* K27 */ be_nested_str_weak(_X3Cinput_X20name_X3D_X27del_fabric_X27_X20type_X3D_X27hidden_X27_X20value_X3D_X27_X25i_X27_X3E), - /* K28 */ be_nested_str_weak(_X3Cbutton_X20name_X3D_X27del_X27_X20class_X3D_X27button_X20bgrn_X27_X3EDelete_X20Fabric_X3C_X2Fbutton_X3E_X3C_X2Fform_X3E_X3C_X2Fp_X3E), - /* K29 */ be_nested_str_weak(_X3Cp_X3E_X3C_X2Fp_X3E_X3C_X2Ffieldset_X3E_X3Cp_X3E_X3C_X2Fp_X3E), - /* K30 */ be_nested_str_weak(stop_iteration), + /* K2 */ be_nested_str_weak(check_privileged_access), + /* K3 */ be_nested_str_weak(content_start), + /* K4 */ be_nested_str_weak(Matter_X20Create_X20new_X20endpoint), + /* K5 */ be_nested_str_weak(content_send_style), + /* K6 */ be_nested_str_weak(arg), + /* K7 */ be_nested_str_weak(url), + /* K8 */ be_nested_str_weak(matter_enabled), + /* K9 */ be_nested_str_weak(show_remote_autoconf), + /* K10 */ be_nested_str_weak(content_button), + /* K11 */ be_nested_str_weak(BUTTON_CONFIGURATION), + /* K12 */ be_nested_str_weak(content_stop), }), - be_str_weak(show_fabric_info), + be_str_weak(page_part_mgr_add), &be_const_str_solidified, - ( &(const binstruction[104]) { /* code */ + ( &(const binstruction[27]) { /* code */ 0xA4060000, // 0000 IMPORT R1 K0 0xA40A0200, // 0001 IMPORT R2 K1 0x8C0C0302, // 0002 GETMET R3 R1 K2 - 0x58140003, // 0003 LDCONST R5 K3 - 0x7C0C0400, // 0004 CALL R3 2 - 0x8C0C0302, // 0005 GETMET R3 R1 K2 - 0x58140004, // 0006 LDCONST R5 K4 - 0x7C0C0400, // 0007 CALL R3 2 - 0x600C000C, // 0008 GETGBL R3 G12 - 0x88100105, // 0009 GETMBR R4 R0 K5 - 0x88100906, // 000A GETMBR R4 R4 K6 - 0x88100906, // 000B GETMBR R4 R4 K6 - 0x7C0C0200, // 000C CALL R3 1 - 0x1C0C0707, // 000D EQ R3 R3 K7 - 0x780E0003, // 000E JMPF R3 #0013 - 0x8C0C0302, // 000F GETMET R3 R1 K2 - 0x58140008, // 0010 LDCONST R5 K8 - 0x7C0C0400, // 0011 CALL R3 2 - 0x70020050, // 0012 JMP #0064 - 0x500C0200, // 0013 LDBOOL R3 1 0 - 0x60100010, // 0014 GETGBL R4 G16 - 0x88140105, // 0015 GETMBR R5 R0 K5 - 0x88140B06, // 0016 GETMBR R5 R5 K6 - 0x88140B09, // 0017 GETMBR R5 R5 K9 - 0x8C140B0A, // 0018 GETMET R5 R5 K10 - 0x7C140200, // 0019 CALL R5 1 - 0x7C100200, // 001A CALL R4 1 - 0xA8020044, // 001B EXBLK 0 #0061 - 0x5C140800, // 001C MOVE R5 R4 - 0x7C140000, // 001D CALL R5 0 - 0x5C180600, // 001E MOVE R6 R3 - 0x741A0002, // 001F JMPT R6 #0023 - 0x8C180302, // 0020 GETMET R6 R1 K2 - 0x5820000B, // 0021 LDCONST R8 K11 - 0x7C180400, // 0022 CALL R6 2 - 0x500C0000, // 0023 LDBOOL R3 0 0 - 0x88180B0C, // 0024 GETMBR R6 R5 K12 - 0x5C1C0C00, // 0025 MOVE R7 R6 - 0x741E0000, // 0026 JMPT R7 #0028 - 0x5818000D, // 0027 LDCONST R6 K13 - 0x8C1C030E, // 0028 GETMET R7 R1 K14 - 0x5C240C00, // 0029 MOVE R9 R6 - 0x7C1C0400, // 002A CALL R7 2 - 0x5C180E00, // 002B MOVE R6 R7 - 0x8C1C0302, // 002C GETMET R7 R1 K2 - 0x8C24050F, // 002D GETMET R9 R2 K15 - 0x582C0010, // 002E LDCONST R11 K16 - 0x8C300B11, // 002F GETMET R12 R5 K17 - 0x7C300200, // 0030 CALL R12 1 - 0x5C340C00, // 0031 MOVE R13 R6 - 0x8C380B12, // 0032 GETMET R14 R5 K18 - 0x7C380200, // 0033 CALL R14 1 - 0x7C240A00, // 0034 CALL R9 5 - 0x7C1C0400, // 0035 CALL R7 2 - 0x8C1C0B13, // 0036 GETMET R7 R5 K19 - 0x7C1C0200, // 0037 CALL R7 1 - 0x8C1C0F14, // 0038 GETMET R7 R7 K20 - 0x7C1C0200, // 0039 CALL R7 1 - 0x8C1C0F15, // 003A GETMET R7 R7 K21 - 0x7C1C0200, // 003B CALL R7 1 - 0x8C200B16, // 003C GETMET R8 R5 K22 - 0x7C200200, // 003D CALL R8 1 - 0x8C201114, // 003E GETMET R8 R8 K20 - 0x7C200200, // 003F CALL R8 1 - 0x8C201115, // 0040 GETMET R8 R8 K21 - 0x7C200200, // 0041 CALL R8 1 - 0x8C240302, // 0042 GETMET R9 R1 K2 - 0x8C2C050F, // 0043 GETMET R11 R2 K15 - 0x58340017, // 0044 LDCONST R13 K23 - 0x8C380F18, // 0045 GETMET R14 R7 K24 - 0x7C380200, // 0046 CALL R14 1 - 0x7C2C0600, // 0047 CALL R11 3 - 0x7C240400, // 0048 CALL R9 2 - 0x8C240302, // 0049 GETMET R9 R1 K2 - 0x8C2C050F, // 004A GETMET R11 R2 K15 - 0x58340019, // 004B LDCONST R13 K25 - 0x8C381118, // 004C GETMET R14 R8 K24 - 0x7C380200, // 004D CALL R14 1 - 0x7C2C0600, // 004E CALL R11 3 - 0x7C240400, // 004F CALL R9 2 - 0x8C240302, // 0050 GETMET R9 R1 K2 - 0x582C001A, // 0051 LDCONST R11 K26 - 0x7C240400, // 0052 CALL R9 2 - 0x8C240302, // 0053 GETMET R9 R1 K2 - 0x8C2C050F, // 0054 GETMET R11 R2 K15 - 0x5834001B, // 0055 LDCONST R13 K27 - 0x8C380B11, // 0056 GETMET R14 R5 K17 - 0x7C380200, // 0057 CALL R14 1 - 0x7C2C0600, // 0058 CALL R11 3 - 0x7C240400, // 0059 CALL R9 2 - 0x8C240302, // 005A GETMET R9 R1 K2 - 0x582C001C, // 005B LDCONST R11 K28 - 0x7C240400, // 005C CALL R9 2 - 0x8C240302, // 005D GETMET R9 R1 K2 - 0x582C001D, // 005E LDCONST R11 K29 - 0x7C240400, // 005F CALL R9 2 - 0x7001FFBA, // 0060 JMP #001C - 0x5810001E, // 0061 LDCONST R4 K30 - 0xAC100200, // 0062 CATCH R4 1 0 - 0xB0080000, // 0063 RAISE 2 R0 R0 - 0x8C0C0302, // 0064 GETMET R3 R1 K2 - 0x5814001D, // 0065 LDCONST R5 K29 - 0x7C0C0400, // 0066 CALL R3 2 - 0x80000000, // 0067 RET 0 + 0x7C0C0200, // 0003 CALL R3 1 + 0x740E0001, // 0004 JMPT R3 #0007 + 0x4C0C0000, // 0005 LDNIL R3 + 0x80040600, // 0006 RET 1 R3 + 0x8C0C0303, // 0007 GETMET R3 R1 K3 + 0x58140004, // 0008 LDCONST R5 K4 + 0x7C0C0400, // 0009 CALL R3 2 + 0x8C0C0305, // 000A GETMET R3 R1 K5 + 0x7C0C0200, // 000B CALL R3 1 + 0x8C0C0306, // 000C GETMET R3 R1 K6 + 0x58140007, // 000D LDCONST R5 K7 + 0x7C0C0400, // 000E CALL R3 2 + 0x8C100108, // 000F GETMET R4 R0 K8 + 0x7C100200, // 0010 CALL R4 1 + 0x78120002, // 0011 JMPF R4 #0015 + 0x8C100109, // 0012 GETMET R4 R0 K9 + 0x5C180600, // 0013 MOVE R6 R3 + 0x7C100400, // 0014 CALL R4 2 + 0x8C10030A, // 0015 GETMET R4 R1 K10 + 0x8818030B, // 0016 GETMBR R6 R1 K11 + 0x7C100400, // 0017 CALL R4 2 + 0x8C10030C, // 0018 GETMET R4 R1 K12 + 0x7C100200, // 0019 CALL R4 1 + 0x80000000, // 001A RET 0 }) ) ); @@ -1645,7 +1784,7 @@ be_local_closure(Matter_UI_web_add_handler, /* name */ 0, /* has upvals */ NULL, /* no upvals */ 1, /* has sup protos */ - ( &(const struct bproto*[ 2]) { + ( &(const struct bproto*[ 4]) { be_nested_proto( 2, /* nstack */ 0, /* argc */ @@ -1692,18 +1831,66 @@ be_local_closure(Matter_UI_web_add_handler, /* name */ 0x80040000, // 0003 RET 1 R0 }) ), + be_nested_proto( + 2, /* nstack */ + 0, /* argc */ + 0, /* varg */ + 1, /* has upvals */ + ( &(const bupvaldesc[ 1]) { /* upvals */ + be_local_const_upval(1, 0), + }), + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 1]) { /* constants */ + /* K0 */ be_nested_str_weak(page_part_mgr_adv), + }), + be_str_weak(_X3Clambda_X3E), + &be_const_str_solidified, + ( &(const binstruction[ 4]) { /* code */ + 0x68000000, // 0000 GETUPV R0 U0 + 0x8C000100, // 0001 GETMET R0 R0 K0 + 0x7C000200, // 0002 CALL R0 1 + 0x80040000, // 0003 RET 1 R0 + }) + ), + be_nested_proto( + 2, /* nstack */ + 0, /* argc */ + 0, /* varg */ + 1, /* has upvals */ + ( &(const bupvaldesc[ 1]) { /* upvals */ + be_local_const_upval(1, 0), + }), + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 1]) { /* constants */ + /* K0 */ be_nested_str_weak(page_part_mgr_add), + }), + be_str_weak(_X3Clambda_X3E), + &be_const_str_solidified, + ( &(const binstruction[ 4]) { /* code */ + 0x68000000, // 0000 GETUPV R0 U0 + 0x8C000100, // 0001 GETMET R0 R0 K0 + 0x7C000200, // 0002 CALL R0 1 + 0x80040000, // 0003 RET 1 R0 + }) + ), }), 1, /* has constants */ - ( &(const bvalue[ 5]) { /* constants */ + ( &(const bvalue[ 7]) { /* constants */ /* K0 */ be_nested_str_weak(webserver), /* K1 */ be_nested_str_weak(on), /* K2 */ be_nested_str_weak(_X2Fmatterc), /* K3 */ be_nested_str_weak(HTTP_GET), /* K4 */ be_nested_str_weak(HTTP_POST), + /* K5 */ be_nested_str_weak(_X2Fmattera), + /* K6 */ be_nested_str_weak(_X2Fmatteradd), }), be_str_weak(web_add_handler), &be_const_str_solidified, - ( &(const binstruction[13]) { /* code */ + ( &(const binstruction[23]) { /* code */ 0xA4060000, // 0000 IMPORT R1 K0 0x8C080301, // 0001 GETMET R2 R1 K1 0x58100002, // 0002 LDCONST R4 K2 @@ -1715,8 +1902,18 @@ be_local_closure(Matter_UI_web_add_handler, /* name */ 0x84140001, // 0008 CLOSURE R5 P1 0x88180304, // 0009 GETMBR R6 R1 K4 0x7C080800, // 000A CALL R2 4 - 0xA0000000, // 000B CLOSE R0 - 0x80000000, // 000C RET 0 + 0x8C080301, // 000B GETMET R2 R1 K1 + 0x58100005, // 000C LDCONST R4 K5 + 0x84140002, // 000D CLOSURE R5 P2 + 0x88180303, // 000E GETMBR R6 R1 K3 + 0x7C080800, // 000F CALL R2 4 + 0x8C080301, // 0010 GETMET R2 R1 K1 + 0x58100006, // 0011 LDCONST R4 K6 + 0x84140003, // 0012 CLOSURE R5 P3 + 0x88180303, // 0013 GETMBR R6 R1 K3 + 0x7C080800, // 0014 CALL R2 4 + 0xA0000000, // 0015 CLOSE R0 + 0x80000000, // 0016 RET 0 }) ) ); @@ -1724,11 +1921,148 @@ be_local_closure(Matter_UI_web_add_handler, /* name */ /******************************************************************** -** Solidified function: show_passcode_form +** Solidified function: generate_config_from_status ********************************************************************/ -be_local_closure(Matter_UI_show_passcode_form, /* name */ +be_local_closure(Matter_UI_generate_config_from_status, /* name */ be_nested_proto( - 9, /* nstack */ + 13, /* nstack */ + 3, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[17]) { /* constants */ + /* K0 */ be_const_int(0), + /* K1 */ be_nested_str_weak(contains), + /* K2 */ be_nested_str_weak(POWER), + /* K3 */ be_const_int(1), + /* K4 */ be_nested_str_weak(HSBColor), + /* K5 */ be_nested_str_weak(CT), + /* K6 */ be_nested_str_weak(Dimmer), + /* K7 */ be_nested_str_weak(push), + /* K8 */ be_nested_str_weak(type), + /* K9 */ be_nested_str_weak(light0), + /* K10 */ be_nested_str_weak(relay), + /* K11 */ be_nested_str_weak(stop_iteration), + /* K12 */ be_nested_str_weak(light1), + /* K13 */ be_nested_str_weak(light2), + /* K14 */ be_nested_str_weak(light3), + /* K15 */ be_nested_str_weak(device), + /* K16 */ be_nested_str_weak(autoconf_sensors_list), + }), + be_str_weak(generate_config_from_status), + &be_const_str_solidified, + ( &(const binstruction[96]) { /* code */ + 0x600C0012, // 0000 GETGBL R3 G18 + 0x7C0C0000, // 0001 CALL R3 0 + 0x58100000, // 0002 LDCONST R4 K0 + 0x8C140501, // 0003 GETMET R5 R2 K1 + 0x581C0002, // 0004 LDCONST R7 K2 + 0x7C140400, // 0005 CALL R5 2 + 0x78160001, // 0006 JMPF R5 #0009 + 0x58100003, // 0007 LDCONST R4 K3 + 0x7002000E, // 0008 JMP #0018 + 0x58140003, // 0009 LDCONST R5 K3 + 0x50180200, // 000A LDBOOL R6 1 0 + 0x781A000B, // 000B JMPF R6 #0018 + 0x8C180501, // 000C GETMET R6 R2 K1 + 0x60200008, // 000D GETGBL R8 G8 + 0x5C240A00, // 000E MOVE R9 R5 + 0x7C200200, // 000F CALL R8 1 + 0x00220408, // 0010 ADD R8 K2 R8 + 0x7C180400, // 0011 CALL R6 2 + 0x781A0002, // 0012 JMPF R6 #0016 + 0x5C100A00, // 0013 MOVE R4 R5 + 0x00140B03, // 0014 ADD R5 R5 K3 + 0x70020000, // 0015 JMP #0017 + 0x70020000, // 0016 JMP #0018 + 0x7001FFF1, // 0017 JMP #000A + 0x4C140000, // 0018 LDNIL R5 + 0x4C180000, // 0019 LDNIL R6 + 0x4C1C0000, // 001A LDNIL R7 + 0x8C200501, // 001B GETMET R8 R2 K1 + 0x58280004, // 001C LDCONST R10 K4 + 0x7C200400, // 001D CALL R8 2 + 0x78220002, // 001E JMPF R8 #0022 + 0x5C1C0800, // 001F MOVE R7 R4 + 0x04100903, // 0020 SUB R4 R4 K3 + 0x7002000C, // 0021 JMP #002F + 0x8C200501, // 0022 GETMET R8 R2 K1 + 0x58280005, // 0023 LDCONST R10 K5 + 0x7C200400, // 0024 CALL R8 2 + 0x78220002, // 0025 JMPF R8 #0029 + 0x5C180800, // 0026 MOVE R6 R4 + 0x04100903, // 0027 SUB R4 R4 K3 + 0x70020005, // 0028 JMP #002F + 0x8C200501, // 0029 GETMET R8 R2 K1 + 0x58280006, // 002A LDCONST R10 K6 + 0x7C200400, // 002B CALL R8 2 + 0x78220001, // 002C JMPF R8 #002F + 0x5C140800, // 002D MOVE R5 R4 + 0x04100903, // 002E SUB R4 R4 K3 + 0x60200010, // 002F GETGBL R8 G16 + 0x40260604, // 0030 CONNECT R9 K3 R4 + 0x7C200200, // 0031 CALL R8 1 + 0xA8020008, // 0032 EXBLK 0 #003C + 0x5C241000, // 0033 MOVE R9 R8 + 0x7C240000, // 0034 CALL R9 0 + 0x8C280707, // 0035 GETMET R10 R3 K7 + 0x60300013, // 0036 GETGBL R12 G19 + 0x7C300000, // 0037 CALL R12 0 + 0x98321109, // 0038 SETIDX R12 K8 K9 + 0x98321409, // 0039 SETIDX R12 K10 R9 + 0x7C280400, // 003A CALL R10 2 + 0x7001FFF6, // 003B JMP #0033 + 0x5820000B, // 003C LDCONST R8 K11 + 0xAC200200, // 003D CATCH R8 1 0 + 0xB0080000, // 003E RAISE 2 R0 R0 + 0x4C200000, // 003F LDNIL R8 + 0x20200A08, // 0040 NE R8 R5 R8 + 0x78220005, // 0041 JMPF R8 #0048 + 0x8C200707, // 0042 GETMET R8 R3 K7 + 0x60280013, // 0043 GETGBL R10 G19 + 0x7C280000, // 0044 CALL R10 0 + 0x982A110C, // 0045 SETIDX R10 K8 K12 + 0x982A1405, // 0046 SETIDX R10 K10 R5 + 0x7C200400, // 0047 CALL R8 2 + 0x4C200000, // 0048 LDNIL R8 + 0x20200C08, // 0049 NE R8 R6 R8 + 0x78220005, // 004A JMPF R8 #0051 + 0x8C200707, // 004B GETMET R8 R3 K7 + 0x60280013, // 004C GETGBL R10 G19 + 0x7C280000, // 004D CALL R10 0 + 0x982A110D, // 004E SETIDX R10 K8 K13 + 0x982A1406, // 004F SETIDX R10 K10 R6 + 0x7C200400, // 0050 CALL R8 2 + 0x4C200000, // 0051 LDNIL R8 + 0x20200E08, // 0052 NE R8 R7 R8 + 0x78220005, // 0053 JMPF R8 #005A + 0x8C200707, // 0054 GETMET R8 R3 K7 + 0x60280013, // 0055 GETGBL R10 G19 + 0x7C280000, // 0056 CALL R10 0 + 0x982A110E, // 0057 SETIDX R10 K8 K14 + 0x982A1407, // 0058 SETIDX R10 K10 R7 + 0x7C200400, // 0059 CALL R8 2 + 0x8820010F, // 005A GETMBR R8 R0 K15 + 0x8C201110, // 005B GETMET R8 R8 K16 + 0x5C280200, // 005C MOVE R10 R1 + 0x7C200400, // 005D CALL R8 2 + 0x000C0608, // 005E ADD R3 R3 R8 + 0x80040600, // 005F RET 1 R3 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: show_enable +********************************************************************/ +be_local_closure(Matter_UI_show_enable, /* name */ + be_nested_proto( + 11, /* nstack */ 1, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -1736,107 +2070,954 @@ be_local_closure(Matter_UI_show_passcode_form, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[26]) { /* constants */ + ( &(const bvalue[15]) { /* constants */ + /* K0 */ be_nested_str_weak(webserver), + /* K1 */ be_nested_str_weak(string), + /* K2 */ be_nested_str_weak(matter_enabled), + /* K3 */ be_nested_str_weak(content_send), + /* K4 */ be_nested_str_weak(_X3Cfieldset_X3E_X3Clegend_X3E_X3Cb_X3E_X26nbsp_X3BMatter_X20_X26nbsp_X3B_X3C_X2Fb_X3E_X3C_X2Flegend_X3E_X3Cp_X3E_X3C_X2Fp_X3E_X3Cp_X20style_X3D_X27width_X3A320px_X3B_X27_X3ECheck_X20the_X20_X3Ca_X20href_X3D_X27https_X3A_X2F_X2Ftasmota_X2Egithub_X2Eio_X2Fdocs_X2FMatter_X2F_X27_X20target_X3D_X27_blank_X27_X3EMatter_X20documentation_X3C_X2Fa_X3E_X2E_X3C_X2Fp_X3E_X3Cform_X20action_X3D_X27_X2Fmatterc_X27_X20method_X3D_X27post_X27_X3E), + /* K5 */ be_nested_str_weak(format), + /* K6 */ be_nested_str_weak(_X3Cp_X3E_X3Cinput_X20id_X3D_X27menable_X27_X20type_X3D_X27checkbox_X27_X20name_X3D_X27menable_X27_X20_X25s_X3E), + /* K7 */ be_nested_str_weak(checked), + /* K8 */ be_nested_str_weak(), + /* K9 */ be_nested_str_weak(_X3Clabel_X20for_X3D_X27menable_X27_X3E_X3Cb_X3EMatter_X20enable_X3C_X2Fb_X3E_X3C_X2Flabel_X3E_X3C_X2Fp_X3E), + /* K10 */ be_nested_str_weak(_X3Cp_X3E_X3Cinput_X20id_X3D_X27comm_X27_X20type_X3D_X27checkbox_X27_X20name_X3D_X27comm_X27_X20_X25s_X3E), + /* K11 */ be_nested_str_weak(device), + /* K12 */ be_nested_str_weak(commissioning_open), + /* K13 */ be_nested_str_weak(_X3Clabel_X20for_X3D_X27comm_X27_X3E_X3Cb_X3ECommissioning_X20open_X3C_X2Fb_X3E_X3C_X2Flabel_X3E_X3C_X2Fp_X3E), + /* K14 */ be_nested_str_weak(_X3Cp_X3E_X3C_X2Fp_X3E_X3Cbutton_X20name_X3D_X27save_X27_X20class_X3D_X27button_X20bgrn_X27_X3ESave_X3C_X2Fbutton_X3E_X3C_X2Fform_X3E_X3C_X2Fp_X3E_X3Cp_X3E_X3C_X2Fp_X3E_X3C_X2Ffieldset_X3E_X3Cp_X3E_X3C_X2Fp_X3E), + }), + be_str_weak(show_enable), + &be_const_str_solidified, + ( &(const binstruction[43]) { /* code */ + 0xA4060000, // 0000 IMPORT R1 K0 + 0xA40A0200, // 0001 IMPORT R2 K1 + 0x880C0102, // 0002 GETMBR R3 R0 K2 + 0x8C100303, // 0003 GETMET R4 R1 K3 + 0x58180004, // 0004 LDCONST R6 K4 + 0x7C100400, // 0005 CALL R4 2 + 0x8C100303, // 0006 GETMET R4 R1 K3 + 0x8C180505, // 0007 GETMET R6 R2 K5 + 0x58200006, // 0008 LDCONST R8 K6 + 0x8C240102, // 0009 GETMET R9 R0 K2 + 0x7C240200, // 000A CALL R9 1 + 0x78260001, // 000B JMPF R9 #000E + 0x58240007, // 000C LDCONST R9 K7 + 0x70020000, // 000D JMP #000F + 0x58240008, // 000E LDCONST R9 K8 + 0x7C180600, // 000F CALL R6 3 + 0x7C100400, // 0010 CALL R4 2 + 0x8C100303, // 0011 GETMET R4 R1 K3 + 0x58180009, // 0012 LDCONST R6 K9 + 0x7C100400, // 0013 CALL R4 2 + 0x8C100102, // 0014 GETMET R4 R0 K2 + 0x7C100200, // 0015 CALL R4 1 + 0x7812000F, // 0016 JMPF R4 #0027 + 0x8C100303, // 0017 GETMET R4 R1 K3 + 0x8C180505, // 0018 GETMET R6 R2 K5 + 0x5820000A, // 0019 LDCONST R8 K10 + 0x8824010B, // 001A GETMBR R9 R0 K11 + 0x8824130C, // 001B GETMBR R9 R9 K12 + 0x4C280000, // 001C LDNIL R10 + 0x2024120A, // 001D NE R9 R9 R10 + 0x78260001, // 001E JMPF R9 #0021 + 0x58240007, // 001F LDCONST R9 K7 + 0x70020000, // 0020 JMP #0022 + 0x58240008, // 0021 LDCONST R9 K8 + 0x7C180600, // 0022 CALL R6 3 + 0x7C100400, // 0023 CALL R4 2 + 0x8C100303, // 0024 GETMET R4 R1 K3 + 0x5818000D, // 0025 LDCONST R6 K13 + 0x7C100400, // 0026 CALL R4 2 + 0x8C100303, // 0027 GETMET R4 R1 K3 + 0x5818000E, // 0028 LDCONST R6 K14 + 0x7C100400, // 0029 CALL R4 2 + 0x80000000, // 002A RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: show_commissioning_info +********************************************************************/ +be_local_closure(Matter_UI_show_commissioning_info, /* name */ + be_nested_proto( + 14, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[19]) { /* constants */ + /* K0 */ be_nested_str_weak(webserver), + /* K1 */ be_nested_str_weak(string), + /* K2 */ be_nested_str_weak(device), + /* K3 */ be_nested_str_weak(commissioning_open), + /* K4 */ be_nested_str_weak(tasmota), + /* K5 */ be_nested_str_weak(millis), + /* K6 */ be_const_int(0), + /* K7 */ be_nested_str_weak(content_send), + /* K8 */ be_nested_str_weak(format), + /* K9 */ be_nested_str_weak(_X3Cfieldset_X3E_X3Clegend_X3E_X3Cb_X3E_X26nbsp_X3BCommissioning_X20open_X20for_X20_X25i_X20min_X26nbsp_X3B_X3C_X2Fb_X3E_X3C_X2Flegend_X3E_X3Cp_X3E_X3C_X2Fp_X3E), + /* K10 */ be_nested_str_weak(compute_manual_pairing_code), + /* K11 */ be_nested_str_weak(_X3Cp_X3EManual_X20pairing_X20code_X3A_X3Cbr_X3E_X3Cb_X3E_X25s_X2D_X25s_X2D_X25s_X3C_X2Fb_X3E_X3C_X2Fp_X3E_X3Chr_X3E), + /* K12 */ be_const_int(3), + /* K13 */ be_const_int(2147483647), + /* K14 */ be_nested_str_weak(_X3Cdiv_X3E_X3Ccenter_X3E), + /* K15 */ be_nested_str_weak(compute_qrcode_content), + /* K16 */ be_nested_str_weak(show_qrcode), + /* K17 */ be_nested_str_weak(_X3Cp_X3E_X20_X25s_X3C_X2Fp_X3E), + /* K18 */ be_nested_str_weak(_X3C_X2Fdiv_X3E_X3Cp_X3E_X3C_X2Fp_X3E_X3C_X2Ffieldset_X3E_X3Cp_X3E_X3C_X2Fp_X3E), + }), + be_str_weak(show_commissioning_info), + &be_const_str_solidified, + ( &(const binstruction[59]) { /* code */ + 0xA4060000, // 0000 IMPORT R1 K0 + 0xA40A0200, // 0001 IMPORT R2 K1 + 0x880C0102, // 0002 GETMBR R3 R0 K2 + 0x880C0703, // 0003 GETMBR R3 R3 K3 + 0xB8120800, // 0004 GETNGBL R4 K4 + 0x8C100905, // 0005 GETMET R4 R4 K5 + 0x7C100200, // 0006 CALL R4 1 + 0x040C0604, // 0007 SUB R3 R3 R4 + 0x541203E7, // 0008 LDINT R4 1000 + 0x0C0C0604, // 0009 DIV R3 R3 R4 + 0x14100706, // 000A LT R4 R3 K6 + 0x78120000, // 000B JMPF R4 #000D + 0x580C0006, // 000C LDCONST R3 K6 + 0x5412001D, // 000D LDINT R4 30 + 0x00100604, // 000E ADD R4 R3 R4 + 0x5416003B, // 000F LDINT R5 60 + 0x0C100805, // 0010 DIV R4 R4 R5 + 0x8C140307, // 0011 GETMET R5 R1 K7 + 0x8C1C0508, // 0012 GETMET R7 R2 K8 + 0x58240009, // 0013 LDCONST R9 K9 + 0x5C280800, // 0014 MOVE R10 R4 + 0x7C1C0600, // 0015 CALL R7 3 + 0x7C140400, // 0016 CALL R5 2 + 0x88140102, // 0017 GETMBR R5 R0 K2 + 0x8C140B0A, // 0018 GETMET R5 R5 K10 + 0x7C140200, // 0019 CALL R5 1 + 0x8C180307, // 001A GETMET R6 R1 K7 + 0x8C200508, // 001B GETMET R8 R2 K8 + 0x5828000B, // 001C LDCONST R10 K11 + 0x402E0D0C, // 001D CONNECT R11 K6 K12 + 0x942C0A0B, // 001E GETIDX R11 R5 R11 + 0x54320003, // 001F LDINT R12 4 + 0x54360005, // 0020 LDINT R13 6 + 0x4030180D, // 0021 CONNECT R12 R12 R13 + 0x94300A0C, // 0022 GETIDX R12 R5 R12 + 0x54360006, // 0023 LDINT R13 7 + 0x40341B0D, // 0024 CONNECT R13 R13 K13 + 0x94340A0D, // 0025 GETIDX R13 R5 R13 + 0x7C200A00, // 0026 CALL R8 5 + 0x7C180400, // 0027 CALL R6 2 + 0x8C180307, // 0028 GETMET R6 R1 K7 + 0x5820000E, // 0029 LDCONST R8 K14 + 0x7C180400, // 002A CALL R6 2 + 0x88180102, // 002B GETMBR R6 R0 K2 + 0x8C180D0F, // 002C GETMET R6 R6 K15 + 0x7C180200, // 002D CALL R6 1 + 0x8C1C0110, // 002E GETMET R7 R0 K16 + 0x5C240C00, // 002F MOVE R9 R6 + 0x7C1C0400, // 0030 CALL R7 2 + 0x8C1C0307, // 0031 GETMET R7 R1 K7 + 0x8C240508, // 0032 GETMET R9 R2 K8 + 0x582C0011, // 0033 LDCONST R11 K17 + 0x5C300C00, // 0034 MOVE R12 R6 + 0x7C240600, // 0035 CALL R9 3 + 0x7C1C0400, // 0036 CALL R7 2 + 0x8C1C0307, // 0037 GETMET R7 R1 K7 + 0x58240012, // 0038 LDCONST R9 K18 + 0x7C1C0400, // 0039 CALL R7 2 + 0x80000000, // 003A RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: plugin_name +********************************************************************/ +be_local_closure(Matter_UI_plugin_name, /* name */ + be_nested_proto( + 6, /* nstack */ + 3, /* argc */ + 3, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 3]) { /* constants */ + /* K0 */ be_nested_str_weak(), + /* K1 */ be_nested_str_weak(device), + /* K2 */ be_nested_str_weak(get_plugin_class_displayname), + }), + be_str_weak(plugin_name), + &be_const_str_solidified, + ( &(const binstruction[ 8]) { /* code */ + 0x1C0C0300, // 0000 EQ R3 R1 K0 + 0x780E0000, // 0001 JMPF R3 #0003 + 0x80060000, // 0002 RET 1 K0 + 0x880C0101, // 0003 GETMBR R3 R0 K1 + 0x8C0C0702, // 0004 GETMET R3 R3 K2 + 0x5C140200, // 0005 MOVE R5 R1 + 0x7C0C0400, // 0006 CALL R3 2 + 0x80040600, // 0007 RET 1 R3 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: matter_enabled +********************************************************************/ +be_local_closure(Matter_UI_matter_enabled, /* name */ + be_nested_proto( + 5, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 4]) { /* constants */ + /* K0 */ be_nested_str_weak(tasmota), + /* K1 */ be_nested_str_weak(get_option), + /* K2 */ be_nested_str_weak(matter), + /* K3 */ be_nested_str_weak(MATTER_OPTION), + }), + be_str_weak(matter_enabled), + &be_const_str_solidified, + ( &(const binstruction[ 8]) { /* code */ + 0x60040017, // 0000 GETGBL R1 G23 + 0xB80A0000, // 0001 GETNGBL R2 K0 + 0x8C080501, // 0002 GETMET R2 R2 K1 + 0xB8120400, // 0003 GETNGBL R4 K2 + 0x88100903, // 0004 GETMBR R4 R4 K3 + 0x7C080400, // 0005 CALL R2 2 + 0x7C040200, // 0006 CALL R1 1 + 0x80040200, // 0007 RET 1 R1 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: show_plugins_configuration +********************************************************************/ +be_local_closure(Matter_UI_show_plugins_configuration, /* name */ + be_nested_proto( + 26, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[58]) { /* constants */ + /* K0 */ be_nested_str_weak(webserver), + /* K1 */ be_nested_str_weak(string), + /* K2 */ be_nested_str_weak(introspect), + /* K3 */ be_nested_str_weak(content_send), + /* K4 */ be_nested_str_weak(_X3Cfieldset_X3E_X3Clegend_X3E_X3Cb_X3E_X26nbsp_X3BCurrent_X20Configuration_X26nbsp_X3B_X3C_X2Fb_X3E_X3C_X2Flegend_X3E_X3Cp_X3E_X3C_X2Fp_X3E), + /* K5 */ be_nested_str_weak(_X3Cform_X20action_X3D_X27_X2Fmatterc_X27_X20method_X3D_X27post_X27_X3Cp_X3E_X3Cb_X3ELocal_X20sensors_X20and_X20devices_X3C_X2Fb_X3E_X3C_X2Fp_X3E_X3Ctable_X20style_X3D_X27width_X3A100_X25_X27_X3E_X3Ctr_X3E_X3Ctd_X20width_X3D_X2725_X27_X3E_X23_X3C_X2Ftd_X3E_X3Ctd_X20width_X3D_X27115_X27_X3EType_X3C_X2Ftd_X3E_X3Ctd_X3EParameter_X3C_X2Ftd_X3E_X3Ctd_X20width_X3D_X2715_X27_X3E_X3C_X2Ftd_X3E_X3C_X2Ftr_X3E), + /* K6 */ be_nested_str_weak(device), + /* K7 */ be_nested_str_weak(plugins_config), + /* K8 */ be_nested_str_weak(remove), + /* K9 */ be_nested_str_weak(0), + /* K10 */ be_nested_str_weak(k2l_num), + /* K11 */ be_const_int(0), + /* K12 */ be_nested_str_weak(find), + /* K13 */ be_nested_str_weak(type), + /* K14 */ be_const_int(1), + /* K15 */ be_nested_str_weak(http_), + /* K16 */ be_nested_str_weak(plugins_classes), + /* K17 */ be_nested_str_weak(), + /* K18 */ be_nested_str_weak(ui_conf_to_string), + /* K19 */ be_nested_str_weak(format), + /* K20 */ be_nested_str_weak(_X3Ctr_X3E_X3Ctd_X3E_X3Cfont_X20size_X3D_X27_X2D1_X27_X3E_X3Cb_X3E_X25i_X3C_X2Fb_X3E_X3C_X2Ffont_X3E_X3C_X2Ftd_X3E), + /* K21 */ be_nested_str_weak(_X3Ctd_X3E_X3Cfont_X20size_X3D_X27_X2D1_X27_X3E_X3Cb_X3E_X25s_X3C_X2Fb_X3E_X3C_X2Ffont_X3E_X3C_X2Ftd_X3E), + /* K22 */ be_nested_str_weak(plugin_name), + /* K23 */ be_nested_str_weak(_X3Ctd_X3E_X3Cfont_X20size_X3D_X27_X2D1_X27_X3E_X3Cinput_X20type_X3D_X27text_X27_X20name_X3D_X27arg_X25i_X27_X20minlength_X3D_X270_X27_X20size_X3D_X278_X27_X20value_X3D_X27_X25s_X27_X3E_X3C_X2Ffont_X3E_X3C_X2Ftd_X3E), + /* K24 */ be_nested_str_weak(html_escape), + /* K25 */ be_nested_str_weak(_X3Ctd_X20style_X3D_X27text_X2Dalign_X3Acenter_X3B_X27_X3E_X3Cbutton_X20name_X3D_X27del_X25i_X27_X20style_X3D_X27background_X3Anone_X3Bborder_X3Anone_X3Bline_X2Dheight_X3A1_X3B_X27_X20onclick_X3D_X22return_X20confirm_X28_X27Confirm_X20removing_X20endpoint_X27_X29_X22_X3E_X26_X23128293_X3B_X3C_X2Fbutton_X3E_X3C_X2Ftd_X3E_X3C_X2Ftr_X3E), + /* K26 */ be_nested_str_weak(_X3C_X2Ftable_X3E), + /* K27 */ be_nested_str_weak(_X3Cp_X3E_X26lt_X3Bnone_X26gt_X3B_X3C_X2Fp_X3E), + /* K28 */ be_nested_str_weak(_X3Cp_X3E_X3C_X2Fp_X3E), + /* K29 */ be_nested_str_weak(url), + /* K30 */ be_nested_str_weak(push), + /* K31 */ be_nested_str_weak(stop_iteration), + /* K32 */ be_nested_str_weak(sort_distinct), + /* K33 */ be_nested_str_weak(tasmota), + /* K34 */ be_nested_str_weak(log), + /* K35 */ be_nested_str_weak(MTR_X3A_X20remotes_X3A_X20), + /* K36 */ be_const_int(3), + /* K37 */ be_nested_str_weak(_X26_X23x1F517_X3B_X20_X3Ca_X20target_X3D_X27_blank_X27_X20href_X3D_X22http_X3A_X2F_X2F_X25s_X2F_X22_X3E_X25s_X3C_X2Fa_X3E), + /* K38 */ be_nested_str_weak(_X3Ctable_X20style_X3D_X27width_X3A100_X25_X27_X3E), + /* K39 */ be_nested_str_weak(_X3Ctr_X3E_X3Ctd_X20width_X3D_X2725_X27_X3E_X3C_X2Ftd_X3E_X3Ctd_X20width_X3D_X27115_X27_X3E_X3C_X2Ftd_X3E_X3Ctd_X3E_X3C_X2Ftd_X3E_X3Ctd_X20width_X3D_X2715_X27_X3E_X3C_X2Ftd_X3E_X3C_X2Ftr_X3E), + /* K40 */ be_nested_str_weak(_X3Ctr_X3E_X3Ctd_X20width_X3D_X2722_X27_X3E_X3Cfont_X20size_X3D_X27_X2D1_X27_X3E_X3Cb_X3E_X25i_X3C_X2Fb_X3E_X3C_X2Ffont_X3E_X3C_X2Ftd_X3E), + /* K41 */ be_nested_str_weak(_X3Ctd_X20width_X3D_X27115_X27_X3E_X3Cfont_X20size_X3D_X27_X2D1_X27_X3E_X3Cb_X3E_X25s_X3C_X2Fb_X3E_X3C_X2Fselect_X3E_X3C_X2Ffont_X3E_X3C_X2Ftd_X3E), + /* K42 */ be_nested_str_weak(_X3Ctd_X20width_X3D_X2715_X27_X20style_X3D_X27text_X2Dalign_X3Acenter_X3B_X27_X3E_X3Cbutton_X20name_X3D_X27del_X25i_X27_X20style_X3D_X27background_X3Anone_X3Bborder_X3Anone_X3Bline_X2Dheight_X3A1_X3B_X27_X20onclick_X3D_X22return_X20confirm_X28_X27Confirm_X20removing_X20endpoint_X27_X29_X22_X3E_X26_X23128293_X3B_X3C_X2Fbutton_X3E_X3C_X2Ftd_X3E_X3C_X2Ftr_X3E), + /* K43 */ be_nested_str_weak(_X3C_X2Ftable_X3E_X3Cp_X3E_X3C_X2Fp_X3E), + /* K44 */ be_nested_str_weak(_X3Cbutton_X20name_X3D_X27config_X27_X20class_X3D_X27button_X20bgrn_X27_X3EChange_X20configuration_X3C_X2Fbutton_X3E_X3C_X2Fform_X3E), + /* K45 */ be_nested_str_weak(_X3Chr_X3E_X3Cp_X3E_X3Cb_X3EAdd_X20local_X20sensor_X20or_X20device_X3C_X2Fb_X3E_X3C_X2Fp_X3E_X3Cform_X20action_X3D_X27_X2Fmatterc_X27_X20method_X3D_X27post_X27_X3E_X3Ctable_X20style_X3D_X27width_X3A100_X25_X27_X3E_X3Ctr_X3E_X3Ctd_X20width_X3D_X27145_X27_X3EType_X3C_X2Ftd_X3E_X3Ctd_X3EParameter_X3C_X2Ftd_X3E_X3C_X2Ftr_X3E), + /* K46 */ be_nested_str_weak(_X3Ctr_X3E_X3Ctd_X3E_X3Cfont_X20size_X3D_X27_X2D1_X27_X3E_X3Cselect_X20name_X3D_X27pi_X27_X3E), + /* K47 */ be_nested_str_weak(plugin_option), + /* K48 */ be_nested_str_weak(_CLASSES_TYPES), + /* K49 */ be_nested_str_weak(_X3C_X2Fselect_X3E_X3C_X2Ffont_X3E_X3C_X2Ftd_X3E), + /* K50 */ be_nested_str_weak(_X3Ctd_X3E_X3Cfont_X20size_X3D_X27_X2D1_X27_X3E_X3Cinput_X20type_X3D_X27text_X27_X20name_X3D_X27arg_X27_X20minlength_X3D_X270_X27_X20size_X3D_X278_X27_X20value_X3D_X27_X27_X3E_X3C_X2Ffont_X3E_X3C_X2Ftd_X3E_X3C_X2Ftr_X3E_X3C_X2Ftable_X3E), + /* K51 */ be_nested_str_weak(_X3Cdiv_X20style_X3D_X27display_X3A_X20block_X3B_X27_X3E_X3C_X2Fdiv_X3E), + /* K52 */ be_nested_str_weak(_X3Cbutton_X20name_X3D_X27addep_X27_X20class_X3D_X27button_X20bgrn_X27_X3ECreate_X20new_X20endpoint_X3C_X2Fbutton_X3E_X3C_X2Fform_X3E), + /* K53 */ be_nested_str_weak(_X3Chr_X3E_X3Cp_X3E_X3Cb_X3EAdd_X20Remote_X20Tasmota_X3C_X2Fb_X3E_X3C_X2Fp_X3E_X3Cform_X20action_X3D_X27_X2Fmatteradd_X27_X20method_X3D_X27get_X27_X3E_X3Ctable_X20style_X3D_X27width_X3A100_X25_X27_X3E), + /* K54 */ be_nested_str_weak(_X3Ctr_X3E_X3Ctd_X20width_X3D_X2730_X27_X3E_X3Cfont_X20size_X3D_X27_X2D1_X27_X3E_X3Cb_X3Ehttp_X3A_X2F_X2F_X3C_X2Fb_X3E_X3C_X2Ffont_X3E_X3C_X2Ftd_X3E_X3Ctd_X3E_X3Cinput_X20type_X3D_X27text_X27_X20name_X3D_X27url_X27_X20minlength_X3D_X270_X27_X20size_X3D_X278_X27_X20value_X3D_X27_X27_X20required_X20placeholder_X3D_X27IP_X20or_X20domain_X27_X3E_X3C_X2Ftd_X3E_X3Ctd_X20width_X3D_X2710_X27_X3E_X3Cfont_X20size_X3D_X27_X2D1_X27_X3E_X3Cb_X3E_X2F_X3C_X2Fb_X3E_X3C_X2Ffont_X3E_X3C_X2Ftd_X3E_X3C_X2Ftr_X3E_X3C_X2Ftr_X3E_X3C_X2Ftable_X3E), + /* K55 */ be_nested_str_weak(_X3Cbutton_X20class_X3D_X27button_X20bgrn_X27_X3EAuto_X2Dconfigure_X20remote_X20Tasmota_X3C_X2Fbutton_X3E_X3C_X2Fform_X3E_X3Chr_X3E), + /* K56 */ be_nested_str_weak(_X3Cform_X20action_X3D_X27_X2Fmatterc_X27_X20method_X3D_X27post_X27onsubmit_X3D_X27return_X20confirm_X28_X22This_X20will_X20RESET_X20the_X20configuration_X20to_X20the_X20default_X2E_X20You_X20will_X20need_X20to_X20associate_X20again_X2E_X22_X29_X3B_X27_X3E_X3Cbutton_X20name_X3D_X27auto_X27_X20class_X3D_X27button_X20bred_X27_X3EReset_X20and_X20Auto_X2Ddiscover_X3C_X2Fbutton_X3E_X3Cp_X3E_X3C_X2Fp_X3E_X3C_X2Fform_X3E), + /* K57 */ be_nested_str_weak(_X3Cp_X3E_X3C_X2Fp_X3E_X3C_X2Ffieldset_X3E), + }), + be_str_weak(show_plugins_configuration), + &be_const_str_solidified, + ( &(const binstruction[308]) { /* code */ + 0xA4060000, // 0000 IMPORT R1 K0 + 0xA40A0200, // 0001 IMPORT R2 K1 + 0xA40E0400, // 0002 IMPORT R3 K2 + 0x8C100303, // 0003 GETMET R4 R1 K3 + 0x58180004, // 0004 LDCONST R6 K4 + 0x7C100400, // 0005 CALL R4 2 + 0x8C100303, // 0006 GETMET R4 R1 K3 + 0x58180005, // 0007 LDCONST R6 K5 + 0x7C100400, // 0008 CALL R4 2 + 0x88100106, // 0009 GETMBR R4 R0 K6 + 0x88100907, // 000A GETMBR R4 R4 K7 + 0x8C100908, // 000B GETMET R4 R4 K8 + 0x58180009, // 000C LDCONST R6 K9 + 0x7C100400, // 000D CALL R4 2 + 0x88100106, // 000E GETMBR R4 R0 K6 + 0x8C10090A, // 000F GETMET R4 R4 K10 + 0x88180106, // 0010 GETMBR R6 R0 K6 + 0x88180D07, // 0011 GETMBR R6 R6 K7 + 0x7C100400, // 0012 CALL R4 2 + 0x5814000B, // 0013 LDCONST R5 K11 + 0x50180000, // 0014 LDBOOL R6 0 0 + 0x601C000C, // 0015 GETGBL R7 G12 + 0x5C200800, // 0016 MOVE R8 R4 + 0x7C1C0200, // 0017 CALL R7 1 + 0x141C0A07, // 0018 LT R7 R5 R7 + 0x781E0047, // 0019 JMPF R7 #0062 + 0x941C0805, // 001A GETIDX R7 R4 R5 + 0x88200106, // 001B GETMBR R8 R0 K6 + 0x88201107, // 001C GETMBR R8 R8 K7 + 0x8C20110C, // 001D GETMET R8 R8 K12 + 0x60280008, // 001E GETGBL R10 G8 + 0x5C2C0E00, // 001F MOVE R11 R7 + 0x7C280200, // 0020 CALL R10 1 + 0x7C200400, // 0021 CALL R8 2 + 0x8C24110C, // 0022 GETMET R9 R8 K12 + 0x582C000D, // 0023 LDCONST R11 K13 + 0x7C240400, // 0024 CALL R9 2 + 0x5C281200, // 0025 MOVE R10 R9 + 0x742A0001, // 0026 JMPT R10 #0029 + 0x00140B0E, // 0027 ADD R5 R5 K14 + 0x7001FFEB, // 0028 JMP #0015 + 0x8C28050C, // 0029 GETMET R10 R2 K12 + 0x5C301200, // 002A MOVE R12 R9 + 0x5834000F, // 002B LDCONST R13 K15 + 0x7C280600, // 002C CALL R10 3 + 0x1C28150B, // 002D EQ R10 R10 K11 + 0x782A0001, // 002E JMPF R10 #0031 + 0x00140B0E, // 002F ADD R5 R5 K14 + 0x7001FFE3, // 0030 JMP #0015 + 0x88280106, // 0031 GETMBR R10 R0 K6 + 0x88281510, // 0032 GETMBR R10 R10 K16 + 0x8C28150C, // 0033 GETMET R10 R10 K12 + 0x5C301200, // 0034 MOVE R12 R9 + 0x7C280400, // 0035 CALL R10 2 + 0x582C0011, // 0036 LDCONST R11 K17 + 0x4C300000, // 0037 LDNIL R12 + 0x2030140C, // 0038 NE R12 R10 R12 + 0x78320004, // 0039 JMPF R12 #003F + 0x8C301512, // 003A GETMET R12 R10 K18 + 0x5C381400, // 003B MOVE R14 R10 + 0x5C3C1000, // 003C MOVE R15 R8 + 0x7C300600, // 003D CALL R12 3 + 0x5C2C1800, // 003E MOVE R11 R12 + 0x50180200, // 003F LDBOOL R6 1 0 + 0x8C300303, // 0040 GETMET R12 R1 K3 + 0x8C380513, // 0041 GETMET R14 R2 K19 + 0x58400014, // 0042 LDCONST R16 K20 + 0x5C440E00, // 0043 MOVE R17 R7 + 0x7C380600, // 0044 CALL R14 3 + 0x7C300400, // 0045 CALL R12 2 + 0x8C300303, // 0046 GETMET R12 R1 K3 + 0x8C380513, // 0047 GETMET R14 R2 K19 + 0x58400015, // 0048 LDCONST R16 K21 + 0x8C440116, // 0049 GETMET R17 R0 K22 + 0x8C4C110C, // 004A GETMET R19 R8 K12 + 0x5854000D, // 004B LDCONST R21 K13 + 0x58580011, // 004C LDCONST R22 K17 + 0x7C4C0600, // 004D CALL R19 3 + 0x7C440400, // 004E CALL R17 2 + 0x7C380600, // 004F CALL R14 3 + 0x7C300400, // 0050 CALL R12 2 + 0x8C300303, // 0051 GETMET R12 R1 K3 + 0x8C380513, // 0052 GETMET R14 R2 K19 + 0x58400017, // 0053 LDCONST R16 K23 + 0x5C440E00, // 0054 MOVE R17 R7 + 0x8C480318, // 0055 GETMET R18 R1 K24 + 0x5C501600, // 0056 MOVE R20 R11 + 0x7C480400, // 0057 CALL R18 2 + 0x7C380800, // 0058 CALL R14 4 + 0x7C300400, // 0059 CALL R12 2 + 0x8C300303, // 005A GETMET R12 R1 K3 + 0x8C380513, // 005B GETMET R14 R2 K19 + 0x58400019, // 005C LDCONST R16 K25 + 0x5C440E00, // 005D MOVE R17 R7 + 0x7C380600, // 005E CALL R14 3 + 0x7C300400, // 005F CALL R12 2 + 0x00140B0E, // 0060 ADD R5 R5 K14 + 0x7001FFB2, // 0061 JMP #0015 + 0x8C1C0303, // 0062 GETMET R7 R1 K3 + 0x5824001A, // 0063 LDCONST R9 K26 + 0x7C1C0400, // 0064 CALL R7 2 + 0x5C1C0C00, // 0065 MOVE R7 R6 + 0x741E0002, // 0066 JMPT R7 #006A + 0x8C1C0303, // 0067 GETMET R7 R1 K3 + 0x5824001B, // 0068 LDCONST R9 K27 + 0x7C1C0400, // 0069 CALL R7 2 + 0x8C1C0303, // 006A GETMET R7 R1 K3 + 0x5824001C, // 006B LDCONST R9 K28 + 0x7C1C0400, // 006C CALL R7 2 + 0x601C0012, // 006D GETGBL R7 G18 + 0x7C1C0000, // 006E CALL R7 0 + 0x60200010, // 006F GETGBL R8 G16 + 0x88240106, // 0070 GETMBR R9 R0 K6 + 0x88241307, // 0071 GETMBR R9 R9 K7 + 0x7C200200, // 0072 CALL R8 1 + 0xA802000B, // 0073 EXBLK 0 #0080 + 0x5C241000, // 0074 MOVE R9 R8 + 0x7C240000, // 0075 CALL R9 0 + 0x8C28130C, // 0076 GETMET R10 R9 K12 + 0x5830001D, // 0077 LDCONST R12 K29 + 0x7C280400, // 0078 CALL R10 2 + 0x4C2C0000, // 0079 LDNIL R11 + 0x202C140B, // 007A NE R11 R10 R11 + 0x782E0002, // 007B JMPF R11 #007F + 0x8C2C0F1E, // 007C GETMET R11 R7 K30 + 0x5C341400, // 007D MOVE R13 R10 + 0x7C2C0400, // 007E CALL R11 2 + 0x7001FFF3, // 007F JMP #0074 + 0x5820001F, // 0080 LDCONST R8 K31 + 0xAC200200, // 0081 CATCH R8 1 0 + 0xB0080000, // 0082 RAISE 2 R0 R0 + 0x88200106, // 0083 GETMBR R8 R0 K6 + 0x8C201120, // 0084 GETMET R8 R8 K32 + 0x5C280E00, // 0085 MOVE R10 R7 + 0x7C200400, // 0086 CALL R8 2 + 0xB8224200, // 0087 GETNGBL R8 K33 + 0x8C201122, // 0088 GETMET R8 R8 K34 + 0x60280008, // 0089 GETGBL R10 G8 + 0x5C2C0E00, // 008A MOVE R11 R7 + 0x7C280200, // 008B CALL R10 1 + 0x002A460A, // 008C ADD R10 K35 R10 + 0x582C0024, // 008D LDCONST R11 K36 + 0x7C200600, // 008E CALL R8 3 + 0x60200010, // 008F GETGBL R8 G16 + 0x5C240E00, // 0090 MOVE R9 R7 + 0x7C200200, // 0091 CALL R8 1 + 0xA802006C, // 0092 EXBLK 0 #0100 + 0x5C241000, // 0093 MOVE R9 R8 + 0x7C240000, // 0094 CALL R9 0 + 0x8C280303, // 0095 GETMET R10 R1 K3 + 0x8C300513, // 0096 GETMET R12 R2 K19 + 0x58380025, // 0097 LDCONST R14 K37 + 0x8C3C0318, // 0098 GETMET R15 R1 K24 + 0x5C441200, // 0099 MOVE R17 R9 + 0x7C3C0400, // 009A CALL R15 2 + 0x8C400318, // 009B GETMET R16 R1 K24 + 0x5C481200, // 009C MOVE R18 R9 + 0x7C400400, // 009D CALL R16 2 + 0x7C300800, // 009E CALL R12 4 + 0x7C280400, // 009F CALL R10 2 + 0x8C280303, // 00A0 GETMET R10 R1 K3 + 0x58300026, // 00A1 LDCONST R12 K38 + 0x7C280400, // 00A2 CALL R10 2 + 0x8C280303, // 00A3 GETMET R10 R1 K3 + 0x58300027, // 00A4 LDCONST R12 K39 + 0x7C280400, // 00A5 CALL R10 2 + 0x50180000, // 00A6 LDBOOL R6 0 0 + 0x5814000B, // 00A7 LDCONST R5 K11 + 0x6028000C, // 00A8 GETGBL R10 G12 + 0x5C2C0800, // 00A9 MOVE R11 R4 + 0x7C280200, // 00AA CALL R10 1 + 0x14280A0A, // 00AB LT R10 R5 R10 + 0x782A004E, // 00AC JMPF R10 #00FC + 0x94280805, // 00AD GETIDX R10 R4 R5 + 0x882C0106, // 00AE GETMBR R11 R0 K6 + 0x882C1707, // 00AF GETMBR R11 R11 K7 + 0x8C2C170C, // 00B0 GETMET R11 R11 K12 + 0x60340008, // 00B1 GETGBL R13 G8 + 0x5C381400, // 00B2 MOVE R14 R10 + 0x7C340200, // 00B3 CALL R13 1 + 0x7C2C0400, // 00B4 CALL R11 2 + 0x8C30170C, // 00B5 GETMET R12 R11 K12 + 0x5838000D, // 00B6 LDCONST R14 K13 + 0x7C300400, // 00B7 CALL R12 2 + 0x5C341800, // 00B8 MOVE R13 R12 + 0x74360001, // 00B9 JMPT R13 #00BC + 0x00140B0E, // 00BA ADD R5 R5 K14 + 0x7001FFEB, // 00BB JMP #00A8 + 0x8C34050C, // 00BC GETMET R13 R2 K12 + 0x5C3C1800, // 00BD MOVE R15 R12 + 0x5840000F, // 00BE LDCONST R16 K15 + 0x7C340600, // 00BF CALL R13 3 + 0x20341B0B, // 00C0 NE R13 R13 K11 + 0x78360001, // 00C1 JMPF R13 #00C4 + 0x00140B0E, // 00C2 ADD R5 R5 K14 + 0x7001FFE3, // 00C3 JMP #00A8 + 0x8C34170C, // 00C4 GETMET R13 R11 K12 + 0x583C001D, // 00C5 LDCONST R15 K29 + 0x7C340400, // 00C6 CALL R13 2 + 0x20341A09, // 00C7 NE R13 R13 R9 + 0x78360001, // 00C8 JMPF R13 #00CB + 0x00140B0E, // 00C9 ADD R5 R5 K14 + 0x7001FFDC, // 00CA JMP #00A8 + 0x88340106, // 00CB GETMBR R13 R0 K6 + 0x88341B10, // 00CC GETMBR R13 R13 K16 + 0x8C341B0C, // 00CD GETMET R13 R13 K12 + 0x5C3C1800, // 00CE MOVE R15 R12 + 0x7C340400, // 00CF CALL R13 2 + 0x58380011, // 00D0 LDCONST R14 K17 + 0x4C3C0000, // 00D1 LDNIL R15 + 0x203C1A0F, // 00D2 NE R15 R13 R15 + 0x783E0004, // 00D3 JMPF R15 #00D9 + 0x8C3C1B12, // 00D4 GETMET R15 R13 K18 + 0x5C441A00, // 00D5 MOVE R17 R13 + 0x5C481600, // 00D6 MOVE R18 R11 + 0x7C3C0600, // 00D7 CALL R15 3 + 0x5C381E00, // 00D8 MOVE R14 R15 + 0x50180200, // 00D9 LDBOOL R6 1 0 + 0x8C3C0303, // 00DA GETMET R15 R1 K3 + 0x8C440513, // 00DB GETMET R17 R2 K19 + 0x584C0028, // 00DC LDCONST R19 K40 + 0x5C501400, // 00DD MOVE R20 R10 + 0x7C440600, // 00DE CALL R17 3 + 0x7C3C0400, // 00DF CALL R15 2 + 0x8C3C0303, // 00E0 GETMET R15 R1 K3 + 0x8C440513, // 00E1 GETMET R17 R2 K19 + 0x584C0029, // 00E2 LDCONST R19 K41 + 0x8C500116, // 00E3 GETMET R20 R0 K22 + 0x8C58170C, // 00E4 GETMET R22 R11 K12 + 0x5860000D, // 00E5 LDCONST R24 K13 + 0x58640011, // 00E6 LDCONST R25 K17 + 0x7C580600, // 00E7 CALL R22 3 + 0x7C500400, // 00E8 CALL R20 2 + 0x7C440600, // 00E9 CALL R17 3 + 0x7C3C0400, // 00EA CALL R15 2 + 0x8C3C0303, // 00EB GETMET R15 R1 K3 + 0x8C440513, // 00EC GETMET R17 R2 K19 + 0x584C0017, // 00ED LDCONST R19 K23 + 0x5C501400, // 00EE MOVE R20 R10 + 0x8C540318, // 00EF GETMET R21 R1 K24 + 0x5C5C1C00, // 00F0 MOVE R23 R14 + 0x7C540400, // 00F1 CALL R21 2 + 0x7C440800, // 00F2 CALL R17 4 + 0x7C3C0400, // 00F3 CALL R15 2 + 0x8C3C0303, // 00F4 GETMET R15 R1 K3 + 0x8C440513, // 00F5 GETMET R17 R2 K19 + 0x584C002A, // 00F6 LDCONST R19 K42 + 0x5C501400, // 00F7 MOVE R20 R10 + 0x7C440600, // 00F8 CALL R17 3 + 0x7C3C0400, // 00F9 CALL R15 2 + 0x00140B0E, // 00FA ADD R5 R5 K14 + 0x7001FFAB, // 00FB JMP #00A8 + 0x8C280303, // 00FC GETMET R10 R1 K3 + 0x5830002B, // 00FD LDCONST R12 K43 + 0x7C280400, // 00FE CALL R10 2 + 0x7001FF92, // 00FF JMP #0093 + 0x5820001F, // 0100 LDCONST R8 K31 + 0xAC200200, // 0101 CATCH R8 1 0 + 0xB0080000, // 0102 RAISE 2 R0 R0 + 0x5C200C00, // 0103 MOVE R8 R6 + 0x74220002, // 0104 JMPT R8 #0108 + 0x8C200303, // 0105 GETMET R8 R1 K3 + 0x5828001B, // 0106 LDCONST R10 K27 + 0x7C200400, // 0107 CALL R8 2 + 0x8C200303, // 0108 GETMET R8 R1 K3 + 0x5828002C, // 0109 LDCONST R10 K44 + 0x7C200400, // 010A CALL R8 2 + 0x8C200303, // 010B GETMET R8 R1 K3 + 0x5828002D, // 010C LDCONST R10 K45 + 0x7C200400, // 010D CALL R8 2 + 0x8C200303, // 010E GETMET R8 R1 K3 + 0x5828002E, // 010F LDCONST R10 K46 + 0x7C200400, // 0110 CALL R8 2 + 0x8C20012F, // 0111 GETMET R8 R0 K47 + 0x58280011, // 0112 LDCONST R10 K17 + 0x882C0130, // 0113 GETMBR R11 R0 K48 + 0x7C200600, // 0114 CALL R8 3 + 0x8C200303, // 0115 GETMET R8 R1 K3 + 0x58280031, // 0116 LDCONST R10 K49 + 0x7C200400, // 0117 CALL R8 2 + 0x8C200303, // 0118 GETMET R8 R1 K3 + 0x58280032, // 0119 LDCONST R10 K50 + 0x7C200400, // 011A CALL R8 2 + 0x8C200303, // 011B GETMET R8 R1 K3 + 0x58280033, // 011C LDCONST R10 K51 + 0x7C200400, // 011D CALL R8 2 + 0x8C200303, // 011E GETMET R8 R1 K3 + 0x58280034, // 011F LDCONST R10 K52 + 0x7C200400, // 0120 CALL R8 2 + 0x8C200303, // 0121 GETMET R8 R1 K3 + 0x58280035, // 0122 LDCONST R10 K53 + 0x7C200400, // 0123 CALL R8 2 + 0x8C200303, // 0124 GETMET R8 R1 K3 + 0x58280036, // 0125 LDCONST R10 K54 + 0x7C200400, // 0126 CALL R8 2 + 0x8C200303, // 0127 GETMET R8 R1 K3 + 0x58280033, // 0128 LDCONST R10 K51 + 0x7C200400, // 0129 CALL R8 2 + 0x8C200303, // 012A GETMET R8 R1 K3 + 0x58280037, // 012B LDCONST R10 K55 + 0x7C200400, // 012C CALL R8 2 + 0x8C200303, // 012D GETMET R8 R1 K3 + 0x58280038, // 012E LDCONST R10 K56 + 0x7C200400, // 012F CALL R8 2 + 0x8C200303, // 0130 GETMET R8 R1 K3 + 0x58280039, // 0131 LDCONST R10 K57 + 0x7C200400, // 0132 CALL R8 2 + 0x80000000, // 0133 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: equal_map +********************************************************************/ +be_local_closure(Matter_UI_equal_map, /* name */ + be_nested_proto( + 8, /* nstack */ + 2, /* argc */ + 4, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 4]) { /* constants */ + /* K0 */ be_const_class(be_class_Matter_UI), + /* K1 */ be_nested_str_weak(keys), + /* K2 */ be_nested_str_weak(contains), + /* K3 */ be_nested_str_weak(stop_iteration), + }), + be_str_weak(equal_map), + &be_const_str_solidified, + ( &(const binstruction[53]) { /* code */ + 0x58080000, // 0000 LDCONST R2 K0 + 0x600C0010, // 0001 GETGBL R3 G16 + 0x8C100101, // 0002 GETMET R4 R0 K1 + 0x7C100200, // 0003 CALL R4 1 + 0x7C0C0200, // 0004 CALL R3 1 + 0xA8020010, // 0005 EXBLK 0 #0017 + 0x5C100600, // 0006 MOVE R4 R3 + 0x7C100000, // 0007 CALL R4 0 + 0x8C140302, // 0008 GETMET R5 R1 K2 + 0x5C1C0800, // 0009 MOVE R7 R4 + 0x7C140400, // 000A CALL R5 2 + 0x74160002, // 000B JMPT R5 #000F + 0x50140000, // 000C LDBOOL R5 0 0 + 0xA8040001, // 000D EXBLK 1 1 + 0x80040A00, // 000E RET 1 R5 + 0x94140204, // 000F GETIDX R5 R1 R4 + 0x94180004, // 0010 GETIDX R6 R0 R4 + 0x20140A06, // 0011 NE R5 R5 R6 + 0x78160002, // 0012 JMPF R5 #0016 + 0x50140000, // 0013 LDBOOL R5 0 0 + 0xA8040001, // 0014 EXBLK 1 1 + 0x80040A00, // 0015 RET 1 R5 + 0x7001FFEE, // 0016 JMP #0006 + 0x580C0003, // 0017 LDCONST R3 K3 + 0xAC0C0200, // 0018 CATCH R3 1 0 + 0xB0080000, // 0019 RAISE 2 R0 R0 + 0x600C0010, // 001A GETGBL R3 G16 + 0x8C100301, // 001B GETMET R4 R1 K1 + 0x7C100200, // 001C CALL R4 1 + 0x7C0C0200, // 001D CALL R3 1 + 0xA8020010, // 001E EXBLK 0 #0030 + 0x5C100600, // 001F MOVE R4 R3 + 0x7C100000, // 0020 CALL R4 0 + 0x8C140102, // 0021 GETMET R5 R0 K2 + 0x5C1C0800, // 0022 MOVE R7 R4 + 0x7C140400, // 0023 CALL R5 2 + 0x74160002, // 0024 JMPT R5 #0028 + 0x50140000, // 0025 LDBOOL R5 0 0 + 0xA8040001, // 0026 EXBLK 1 1 + 0x80040A00, // 0027 RET 1 R5 + 0x94140204, // 0028 GETIDX R5 R1 R4 + 0x94180004, // 0029 GETIDX R6 R0 R4 + 0x20140A06, // 002A NE R5 R5 R6 + 0x78160002, // 002B JMPF R5 #002F + 0x50140000, // 002C LDBOOL R5 0 0 + 0xA8040001, // 002D EXBLK 1 1 + 0x80040A00, // 002E RET 1 R5 + 0x7001FFEE, // 002F JMP #001F + 0x580C0003, // 0030 LDCONST R3 K3 + 0xAC0C0200, // 0031 CATCH R3 1 0 + 0xB0080000, // 0032 RAISE 2 R0 R0 + 0x500C0200, // 0033 LDBOOL R3 1 0 + 0x80040600, // 0034 RET 1 R3 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: web_sensor +********************************************************************/ +be_local_closure(Matter_UI_web_sensor, /* name */ + be_nested_proto( + 12, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[19]) { /* constants */ + /* K0 */ be_nested_str_weak(webserver), + /* K1 */ be_nested_str_weak(string), + /* K2 */ be_nested_str_weak(matter_enabled), + /* K3 */ be_nested_str_weak(device), + /* K4 */ be_nested_str_weak(sessions), + /* K5 */ be_nested_str_weak(count_active_fabrics), + /* K6 */ be_const_int(0), + /* K7 */ be_nested_str_weak(content_send), + /* K8 */ be_nested_str_weak(format), + /* K9 */ be_nested_str_weak(_X3Cdiv_X20style_X3D_X27text_X2Dalign_X3Aright_X3Bfont_X2Dsize_X3A11px_X3Bcolor_X3A_X23aaa_X3Bpadding_X3A0px_X3B_X27_X3E_X25s_X3C_X2Fdiv_X3E), + /* K10 */ be_nested_str_weak(Matter_X3A_X20No_X20active_X20association), + /* K11 */ be_const_int(1), + /* K12 */ be_nested_str_weak(Matter_X3A_X20), + /* K13 */ be_nested_str_weak(_X20active_X20association), + /* K14 */ be_nested_str_weak(s), + /* K15 */ be_nested_str_weak(), + /* K16 */ be_nested_str_weak(show_bridge_status), + /* K17 */ be_nested_str_weak(is_root_commissioning_open), + /* K18 */ be_nested_str_weak(show_commissioning_info), + }), + be_str_weak(web_sensor), + &be_const_str_solidified, + ( &(const binstruction[43]) { /* code */ + 0xA4060000, // 0000 IMPORT R1 K0 + 0xA40A0200, // 0001 IMPORT R2 K1 + 0x8C0C0102, // 0002 GETMET R3 R0 K2 + 0x7C0C0200, // 0003 CALL R3 1 + 0x780E0024, // 0004 JMPF R3 #002A + 0x880C0103, // 0005 GETMBR R3 R0 K3 + 0x880C0704, // 0006 GETMBR R3 R3 K4 + 0x8C0C0705, // 0007 GETMET R3 R3 K5 + 0x7C0C0200, // 0008 CALL R3 1 + 0x1C100706, // 0009 EQ R4 R3 K6 + 0x78120006, // 000A JMPF R4 #0012 + 0x8C100307, // 000B GETMET R4 R1 K7 + 0x8C180508, // 000C GETMET R6 R2 K8 + 0x58200009, // 000D LDCONST R8 K9 + 0x5824000A, // 000E LDCONST R9 K10 + 0x7C180600, // 000F CALL R6 3 + 0x7C100400, // 0010 CALL R4 2 + 0x7002000F, // 0011 JMP #0022 + 0x2410070B, // 0012 GT R4 R3 K11 + 0x8C140307, // 0013 GETMET R5 R1 K7 + 0x8C1C0508, // 0014 GETMET R7 R2 K8 + 0x58240009, // 0015 LDCONST R9 K9 + 0x60280008, // 0016 GETGBL R10 G8 + 0x5C2C0600, // 0017 MOVE R11 R3 + 0x7C280200, // 0018 CALL R10 1 + 0x002A180A, // 0019 ADD R10 K12 R10 + 0x0028150D, // 001A ADD R10 R10 K13 + 0x78120001, // 001B JMPF R4 #001E + 0x582C000E, // 001C LDCONST R11 K14 + 0x70020000, // 001D JMP #001F + 0x582C000F, // 001E LDCONST R11 K15 + 0x0028140B, // 001F ADD R10 R10 R11 + 0x7C1C0600, // 0020 CALL R7 3 + 0x7C140400, // 0021 CALL R5 2 + 0x8C100110, // 0022 GETMET R4 R0 K16 + 0x7C100200, // 0023 CALL R4 1 + 0x88100103, // 0024 GETMBR R4 R0 K3 + 0x8C100911, // 0025 GETMET R4 R4 K17 + 0x7C100200, // 0026 CALL R4 1 + 0x78120001, // 0027 JMPF R4 #002A + 0x8C100112, // 0028 GETMET R4 R0 K18 + 0x7C100200, // 0029 CALL R4 1 + 0x80000000, // 002A RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: show_fabric_info +********************************************************************/ +be_local_closure(Matter_UI_show_fabric_info, /* name */ + be_nested_proto( + 16, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[30]) { /* constants */ /* K0 */ be_nested_str_weak(webserver), /* K1 */ be_nested_str_weak(string), /* K2 */ be_nested_str_weak(content_send), - /* K3 */ be_nested_str_weak(_X3Cfieldset_X3E_X3Clegend_X3E_X3Cb_X3E_X26nbsp_X3BMatter_X20Passcode_X26nbsp_X3B_X3C_X2Fb_X3E_X3C_X2Flegend_X3E_X3Cp_X3E_X3C_X2Fp_X3E), - /* K4 */ be_nested_str_weak(_X3Cform_X20action_X3D_X27_X2Fmatterc_X27_X20method_X3D_X27post_X27_X3E), - /* K5 */ be_nested_str_weak(device), - /* K6 */ be_nested_str_weak(commissioning_open), - /* K7 */ be_nested_str_weak(format), - /* K8 */ be_nested_str_weak(_X3Cp_X3E_X3C_X2Fp_X3E_X3Cbutton_X20name_X3D_X27open_comm_X27_X20class_X3D_X27button_X20bgrn_X27_X3E_X25s_X3C_X2Fbutton_X3E), - /* K9 */ be_nested_str_weak(Open_X20Commissioning), - /* K10 */ be_nested_str_weak(_X3Cp_X3E_X3C_X2Fp_X3E_X3Cbutton_X20name_X3D_X27clos_comm_X27_X20class_X3D_X27button_X20bgrn_X27_X3E_X25s_X3C_X2Fbutton_X3E), - /* K11 */ be_nested_str_weak(Close_X20Commissioning), - /* K12 */ be_nested_str_weak(_X3C_X2Fform_X3E_X3C_X2Fp_X3E), - /* K13 */ be_nested_str_weak(_X3Cform_X20action_X3D_X27_X2Fmatterc_X27_X20method_X3D_X27post_X27_X20onsubmit_X3D_X27return_X20confirm_X28_X22This_X20will_X20cause_X20a_X20restart_X2E_X22_X29_X3B_X27_X3E), - /* K14 */ be_nested_str_weak(_X3Cp_X3EPasscode_X3A_X3C_X2Fp_X3E), - /* K15 */ be_nested_str_weak(_X3Cinput_X20type_X3D_X27number_X27_X20min_X3D_X271_X27_X20max_X3D_X2799999998_X27_X20name_X3D_X27passcode_X27_X20value_X3D_X27_X25i_X27_X3E), - /* K16 */ be_nested_str_weak(root_passcode), - /* K17 */ be_nested_str_weak(_X3Cp_X3EDistinguish_X20id_X3A_X3C_X2Fp_X3E), - /* K18 */ be_nested_str_weak(_X3Cinput_X20type_X3D_X27number_X27_X20min_X3D_X270_X27_X20max_X3D_X274095_X27_X20name_X3D_X27discriminator_X27_X20value_X3D_X27_X25i_X27_X3E), - /* K19 */ be_nested_str_weak(root_discriminator), - /* K20 */ be_nested_str_weak(_X3Cp_X3E_X3Cinput_X20type_X3D_X27checkbox_X27_X20name_X3D_X27ipv4_X27_X25s_X3EIPv4_X20only_X3C_X2Fp_X3E), - /* K21 */ be_nested_str_weak(ipv4only), - /* K22 */ be_nested_str_weak(_X20checked), - /* K23 */ be_nested_str_weak(), - /* K24 */ be_nested_str_weak(_X3Cp_X3E_X3C_X2Fp_X3E_X3Cbutton_X20name_X3D_X27passcode_X27_X20class_X3D_X27button_X20bgrn_X27_X3EChange_X3C_X2Fbutton_X3E_X3C_X2Fform_X3E_X3C_X2Fp_X3E), - /* K25 */ be_nested_str_weak(_X3Cp_X3E_X3C_X2Fp_X3E_X3C_X2Ffieldset_X3E_X3Cp_X3E_X3C_X2Fp_X3E), + /* K3 */ be_nested_str_weak(_X3Cfieldset_X3E_X3Clegend_X3E_X3Cb_X3E_X26nbsp_X3BFabrics_X26nbsp_X3B_X3C_X2Fb_X3E_X3C_X2Flegend_X3E_X3Cp_X3E_X3C_X2Fp_X3E_X3Cp_X3EAssociated_X20fabrics_X3A_X3C_X2Fp_X3E), + /* K4 */ be_nested_str_weak(device), + /* K5 */ be_nested_str_weak(sessions), + /* K6 */ be_const_int(0), + /* K7 */ be_nested_str_weak(_X3Cp_X3E_X3Cb_X3ENone_X3C_X2Fb_X3E_X3C_X2Fp_X3E), + /* K8 */ be_nested_str_weak(fabrics), + /* K9 */ be_nested_str_weak(persistables), + /* K10 */ be_nested_str_weak(_X3Chr_X3E), + /* K11 */ be_nested_str_weak(fabric_label), + /* K12 */ be_nested_str_weak(_X3CNo_X20label_X3E), + /* K13 */ be_nested_str_weak(html_escape), + /* K14 */ be_nested_str_weak(format), + /* K15 */ be_nested_str_weak(_X3Cfieldset_X3E_X3Clegend_X3E_X3Cb_X3E_X26nbsp_X3B_X23_X25i_X20_X25s_X3C_X2Fb_X3E_X20_X28_X25s_X29_X26nbsp_X3B_X3C_X2Flegend_X3E_X3Cp_X3E_X3C_X2Fp_X3E), + /* K16 */ be_nested_str_weak(get_fabric_index), + /* K17 */ be_nested_str_weak(get_admin_vendor_name), + /* K18 */ be_nested_str_weak(get_fabric_id), + /* K19 */ be_nested_str_weak(copy), + /* K20 */ be_nested_str_weak(reverse), + /* K21 */ be_nested_str_weak(get_device_id), + /* K22 */ be_nested_str_weak(Fabric_X3A_X20_X25s_X3Cbr_X3E), + /* K23 */ be_nested_str_weak(tohex), + /* K24 */ be_nested_str_weak(Device_X3A_X20_X25s_X3Cbr_X3E_X26nbsp_X3B), + /* K25 */ be_nested_str_weak(_X3Cform_X20action_X3D_X27_X2Fmatterc_X27_X20method_X3D_X27post_X27_X20onsubmit_X3D_X27return_X20confirm_X28_X22Are_X20you_X20sure_X3F_X22_X29_X3B_X27_X3E), + /* K26 */ be_nested_str_weak(_X3Cinput_X20name_X3D_X27del_fabric_X27_X20type_X3D_X27hidden_X27_X20value_X3D_X27_X25i_X27_X3E), + /* K27 */ be_nested_str_weak(_X3Cbutton_X20name_X3D_X27del_X27_X20class_X3D_X27button_X20bgrn_X27_X3EDelete_X20Fabric_X3C_X2Fbutton_X3E_X3C_X2Fform_X3E_X3C_X2Fp_X3E), + /* K28 */ be_nested_str_weak(_X3Cp_X3E_X3C_X2Fp_X3E_X3C_X2Ffieldset_X3E_X3Cp_X3E_X3C_X2Fp_X3E), + /* K29 */ be_nested_str_weak(stop_iteration), }), - be_str_weak(show_passcode_form), + be_str_weak(show_fabric_info), &be_const_str_solidified, - ( &(const binstruction[70]) { /* code */ + ( &(const binstruction[101]) { /* code */ 0xA4060000, // 0000 IMPORT R1 K0 0xA40A0200, // 0001 IMPORT R2 K1 0x8C0C0302, // 0002 GETMET R3 R1 K2 0x58140003, // 0003 LDCONST R5 K3 0x7C0C0400, // 0004 CALL R3 2 - 0x8C0C0302, // 0005 GETMET R3 R1 K2 - 0x58140004, // 0006 LDCONST R5 K4 - 0x7C0C0400, // 0007 CALL R3 2 - 0x880C0105, // 0008 GETMBR R3 R0 K5 - 0x880C0706, // 0009 GETMBR R3 R3 K6 - 0x4C100000, // 000A LDNIL R4 - 0x1C0C0604, // 000B EQ R3 R3 R4 - 0x780E0006, // 000C JMPF R3 #0014 - 0x8C0C0302, // 000D GETMET R3 R1 K2 - 0x8C140507, // 000E GETMET R5 R2 K7 - 0x581C0008, // 000F LDCONST R7 K8 - 0x58200009, // 0010 LDCONST R8 K9 - 0x7C140600, // 0011 CALL R5 3 - 0x7C0C0400, // 0012 CALL R3 2 - 0x70020005, // 0013 JMP #001A - 0x8C0C0302, // 0014 GETMET R3 R1 K2 - 0x8C140507, // 0015 GETMET R5 R2 K7 - 0x581C000A, // 0016 LDCONST R7 K10 - 0x5820000B, // 0017 LDCONST R8 K11 - 0x7C140600, // 0018 CALL R5 3 - 0x7C0C0400, // 0019 CALL R3 2 - 0x8C0C0302, // 001A GETMET R3 R1 K2 - 0x5814000C, // 001B LDCONST R5 K12 - 0x7C0C0400, // 001C CALL R3 2 - 0x8C0C0302, // 001D GETMET R3 R1 K2 - 0x5814000D, // 001E LDCONST R5 K13 - 0x7C0C0400, // 001F CALL R3 2 - 0x8C0C0302, // 0020 GETMET R3 R1 K2 - 0x5814000E, // 0021 LDCONST R5 K14 - 0x7C0C0400, // 0022 CALL R3 2 - 0x8C0C0302, // 0023 GETMET R3 R1 K2 - 0x8C140507, // 0024 GETMET R5 R2 K7 - 0x581C000F, // 0025 LDCONST R7 K15 - 0x88200105, // 0026 GETMBR R8 R0 K5 - 0x88201110, // 0027 GETMBR R8 R8 K16 - 0x7C140600, // 0028 CALL R5 3 - 0x7C0C0400, // 0029 CALL R3 2 - 0x8C0C0302, // 002A GETMET R3 R1 K2 - 0x58140011, // 002B LDCONST R5 K17 - 0x7C0C0400, // 002C CALL R3 2 - 0x8C0C0302, // 002D GETMET R3 R1 K2 - 0x8C140507, // 002E GETMET R5 R2 K7 - 0x581C0012, // 002F LDCONST R7 K18 - 0x88200105, // 0030 GETMBR R8 R0 K5 - 0x88201113, // 0031 GETMBR R8 R8 K19 - 0x7C140600, // 0032 CALL R5 3 - 0x7C0C0400, // 0033 CALL R3 2 - 0x8C0C0302, // 0034 GETMET R3 R1 K2 - 0x8C140507, // 0035 GETMET R5 R2 K7 - 0x581C0014, // 0036 LDCONST R7 K20 - 0x88200105, // 0037 GETMBR R8 R0 K5 - 0x88201115, // 0038 GETMBR R8 R8 K21 - 0x78220001, // 0039 JMPF R8 #003C - 0x58200016, // 003A LDCONST R8 K22 - 0x70020000, // 003B JMP #003D - 0x58200017, // 003C LDCONST R8 K23 - 0x7C140600, // 003D CALL R5 3 - 0x7C0C0400, // 003E CALL R3 2 - 0x8C0C0302, // 003F GETMET R3 R1 K2 - 0x58140018, // 0040 LDCONST R5 K24 - 0x7C0C0400, // 0041 CALL R3 2 - 0x8C0C0302, // 0042 GETMET R3 R1 K2 - 0x58140019, // 0043 LDCONST R5 K25 - 0x7C0C0400, // 0044 CALL R3 2 - 0x80000000, // 0045 RET 0 + 0x600C000C, // 0005 GETGBL R3 G12 + 0x88100104, // 0006 GETMBR R4 R0 K4 + 0x88100905, // 0007 GETMBR R4 R4 K5 + 0x88100905, // 0008 GETMBR R4 R4 K5 + 0x7C0C0200, // 0009 CALL R3 1 + 0x1C0C0706, // 000A EQ R3 R3 K6 + 0x780E0003, // 000B JMPF R3 #0010 + 0x8C0C0302, // 000C GETMET R3 R1 K2 + 0x58140007, // 000D LDCONST R5 K7 + 0x7C0C0400, // 000E CALL R3 2 + 0x70020050, // 000F JMP #0061 + 0x500C0200, // 0010 LDBOOL R3 1 0 + 0x60100010, // 0011 GETGBL R4 G16 + 0x88140104, // 0012 GETMBR R5 R0 K4 + 0x88140B05, // 0013 GETMBR R5 R5 K5 + 0x88140B08, // 0014 GETMBR R5 R5 K8 + 0x8C140B09, // 0015 GETMET R5 R5 K9 + 0x7C140200, // 0016 CALL R5 1 + 0x7C100200, // 0017 CALL R4 1 + 0xA8020044, // 0018 EXBLK 0 #005E + 0x5C140800, // 0019 MOVE R5 R4 + 0x7C140000, // 001A CALL R5 0 + 0x5C180600, // 001B MOVE R6 R3 + 0x741A0002, // 001C JMPT R6 #0020 + 0x8C180302, // 001D GETMET R6 R1 K2 + 0x5820000A, // 001E LDCONST R8 K10 + 0x7C180400, // 001F CALL R6 2 + 0x500C0000, // 0020 LDBOOL R3 0 0 + 0x88180B0B, // 0021 GETMBR R6 R5 K11 + 0x5C1C0C00, // 0022 MOVE R7 R6 + 0x741E0000, // 0023 JMPT R7 #0025 + 0x5818000C, // 0024 LDCONST R6 K12 + 0x8C1C030D, // 0025 GETMET R7 R1 K13 + 0x5C240C00, // 0026 MOVE R9 R6 + 0x7C1C0400, // 0027 CALL R7 2 + 0x5C180E00, // 0028 MOVE R6 R7 + 0x8C1C0302, // 0029 GETMET R7 R1 K2 + 0x8C24050E, // 002A GETMET R9 R2 K14 + 0x582C000F, // 002B LDCONST R11 K15 + 0x8C300B10, // 002C GETMET R12 R5 K16 + 0x7C300200, // 002D CALL R12 1 + 0x5C340C00, // 002E MOVE R13 R6 + 0x8C380B11, // 002F GETMET R14 R5 K17 + 0x7C380200, // 0030 CALL R14 1 + 0x7C240A00, // 0031 CALL R9 5 + 0x7C1C0400, // 0032 CALL R7 2 + 0x8C1C0B12, // 0033 GETMET R7 R5 K18 + 0x7C1C0200, // 0034 CALL R7 1 + 0x8C1C0F13, // 0035 GETMET R7 R7 K19 + 0x7C1C0200, // 0036 CALL R7 1 + 0x8C1C0F14, // 0037 GETMET R7 R7 K20 + 0x7C1C0200, // 0038 CALL R7 1 + 0x8C200B15, // 0039 GETMET R8 R5 K21 + 0x7C200200, // 003A CALL R8 1 + 0x8C201113, // 003B GETMET R8 R8 K19 + 0x7C200200, // 003C CALL R8 1 + 0x8C201114, // 003D GETMET R8 R8 K20 + 0x7C200200, // 003E CALL R8 1 + 0x8C240302, // 003F GETMET R9 R1 K2 + 0x8C2C050E, // 0040 GETMET R11 R2 K14 + 0x58340016, // 0041 LDCONST R13 K22 + 0x8C380F17, // 0042 GETMET R14 R7 K23 + 0x7C380200, // 0043 CALL R14 1 + 0x7C2C0600, // 0044 CALL R11 3 + 0x7C240400, // 0045 CALL R9 2 + 0x8C240302, // 0046 GETMET R9 R1 K2 + 0x8C2C050E, // 0047 GETMET R11 R2 K14 + 0x58340018, // 0048 LDCONST R13 K24 + 0x8C381117, // 0049 GETMET R14 R8 K23 + 0x7C380200, // 004A CALL R14 1 + 0x7C2C0600, // 004B CALL R11 3 + 0x7C240400, // 004C CALL R9 2 + 0x8C240302, // 004D GETMET R9 R1 K2 + 0x582C0019, // 004E LDCONST R11 K25 + 0x7C240400, // 004F CALL R9 2 + 0x8C240302, // 0050 GETMET R9 R1 K2 + 0x8C2C050E, // 0051 GETMET R11 R2 K14 + 0x5834001A, // 0052 LDCONST R13 K26 + 0x8C380B10, // 0053 GETMET R14 R5 K16 + 0x7C380200, // 0054 CALL R14 1 + 0x7C2C0600, // 0055 CALL R11 3 + 0x7C240400, // 0056 CALL R9 2 + 0x8C240302, // 0057 GETMET R9 R1 K2 + 0x582C001B, // 0058 LDCONST R11 K27 + 0x7C240400, // 0059 CALL R9 2 + 0x8C240302, // 005A GETMET R9 R1 K2 + 0x582C001C, // 005B LDCONST R11 K28 + 0x7C240400, // 005C CALL R9 2 + 0x7001FFBA, // 005D JMP #0019 + 0x5810001D, // 005E LDCONST R4 K29 + 0xAC100200, // 005F CATCH R4 1 0 + 0xB0080000, // 0060 RAISE 2 R0 R0 + 0x8C0C0302, // 0061 GETMET R3 R1 K2 + 0x5814001C, // 0062 LDCONST R5 K28 + 0x7C0C0400, // 0063 CALL R3 2 + 0x80000000, // 0064 RET 0 }) ) ); @@ -1844,11 +3025,11 @@ be_local_closure(Matter_UI_show_passcode_form, /* name */ /******************************************************************** -** Solidified function: show_bridge_status +** Solidified function: page_part_mgr ********************************************************************/ -be_local_closure(Matter_UI_show_bridge_status, /* name */ +be_local_closure(Matter_UI_page_part_mgr, /* name */ be_nested_proto( - 15, /* nstack */ + 6, /* nstack */ 1, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -1856,139 +3037,57 @@ be_local_closure(Matter_UI_show_bridge_status, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[26]) { /* constants */ + ( &(const bvalue[15]) { /* constants */ /* K0 */ be_nested_str_weak(webserver), /* K1 */ be_nested_str_weak(string), - /* K2 */ be_const_int(0), - /* K3 */ be_nested_str_weak(device), - /* K4 */ be_nested_str_weak(plugins), - /* K5 */ be_nested_str_weak(matter), - /* K6 */ be_nested_str_weak(Plugin_Bridge_HTTP), - /* K7 */ be_nested_str_weak(http_remote), - /* K8 */ be_nested_str_weak(addr), - /* K9 */ be_nested_str_weak(contains), - /* K10 */ be_nested_str_weak(push), - /* K11 */ be_const_int(1), - /* K12 */ be_nested_str_weak(content_send), - /* K13 */ be_nested_str_weak(_X3Chr_X3E), - /* K14 */ be_nested_str_weak(_X3Ctable_X20style_X3D_X27width_X3A100_X25_X27_X3E), - /* K15 */ be_nested_str_weak(_STYLESHEET), - /* K16 */ be_nested_str_weak(keys), - /* K17 */ be_nested_str_weak(format), - /* K18 */ be_nested_str_weak(_X3Ctr_X20class_X3D_X27ztdm_X20htrm_X27_X3E_X3Ctd_X3E_X3Cb_X3E_X25s_X3C_X2Fb_X3E_X3C_X2Ftd_X3E), - /* K19 */ be_nested_str_weak(html_escape), - /* K20 */ be_nested_str_weak(web_last_seen), - /* K21 */ be_nested_str_weak(_X3Ctr_X20class_X3D_X27htrm_X27_X3E_X3Ctd_X20colspan_X3D_X272_X27_X3E), - /* K22 */ be_nested_str_weak(web_values), - /* K23 */ be_nested_str_weak(_X3C_X2Ftd_X3E_X3C_X2Ftr_X3E), - /* K24 */ be_nested_str_weak(stop_iteration), - /* K25 */ be_nested_str_weak(_X3C_X2Ftable_X3E_X3Chr_X3E), + /* K2 */ be_nested_str_weak(check_privileged_access), + /* K3 */ be_nested_str_weak(content_start), + /* K4 */ be_nested_str_weak(Matter), + /* K5 */ be_nested_str_weak(content_send_style), + /* K6 */ be_nested_str_weak(show_enable), + /* K7 */ be_nested_str_weak(matter_enabled), + /* K8 */ be_nested_str_weak(show_plugins_configuration), + /* K9 */ be_nested_str_weak(content_send), + /* K10 */ be_nested_str_weak(_X3Cdiv_X20style_X3D_X27display_X3A_X20block_X3B_X27_X3E_X3C_X2Fdiv_X3E), + /* K11 */ be_nested_str_weak(_X3Cp_X3E_X3C_X2Fp_X3E_X3Cform_X20id_X3D_X27butmat_X27_X20style_X3D_X27display_X3A_X20block_X3B_X27_X20action_X3D_X27mattera_X27_X20method_X3D_X27get_X27_X3E_X3Cbutton_X20name_X3D_X27_X27_X3EAdvanced_X20Configuration_X3C_X2Fbutton_X3E_X3C_X2Fform_X3E), + /* K12 */ be_nested_str_weak(content_button), + /* K13 */ be_nested_str_weak(BUTTON_CONFIGURATION), + /* K14 */ be_nested_str_weak(content_stop), }), - be_str_weak(show_bridge_status), + be_str_weak(page_part_mgr), &be_const_str_solidified, - ( &(const binstruction[102]) { /* code */ + ( &(const binstruction[31]) { /* code */ 0xA4060000, // 0000 IMPORT R1 K0 0xA40A0200, // 0001 IMPORT R2 K1 - 0x4C0C0000, // 0002 LDNIL R3 - 0x58100002, // 0003 LDCONST R4 K2 - 0x6014000C, // 0004 GETGBL R5 G12 - 0x88180103, // 0005 GETMBR R6 R0 K3 - 0x88180D04, // 0006 GETMBR R6 R6 K4 - 0x7C140200, // 0007 CALL R5 1 - 0x14140805, // 0008 LT R5 R4 R5 - 0x7816001D, // 0009 JMPF R5 #0028 - 0x88140103, // 000A GETMBR R5 R0 K3 - 0x88140B04, // 000B GETMBR R5 R5 K4 - 0x94140A04, // 000C GETIDX R5 R5 R4 - 0x6018000F, // 000D GETGBL R6 G15 - 0x5C1C0A00, // 000E MOVE R7 R5 - 0xB8220A00, // 000F GETNGBL R8 K5 - 0x88201106, // 0010 GETMBR R8 R8 K6 - 0x7C180400, // 0011 CALL R6 2 - 0x781A0012, // 0012 JMPF R6 #0026 - 0x4C180000, // 0013 LDNIL R6 - 0x1C180606, // 0014 EQ R6 R3 R6 - 0x781A0002, // 0015 JMPF R6 #0019 - 0x60180013, // 0016 GETGBL R6 G19 - 0x7C180000, // 0017 CALL R6 0 - 0x5C0C0C00, // 0018 MOVE R3 R6 - 0x88180B07, // 0019 GETMBR R6 R5 K7 - 0x88180D08, // 001A GETMBR R6 R6 K8 - 0x8C1C0709, // 001B GETMET R7 R3 K9 - 0x5C240C00, // 001C MOVE R9 R6 - 0x7C1C0400, // 001D CALL R7 2 - 0x741E0002, // 001E JMPT R7 #0022 - 0x601C0012, // 001F GETGBL R7 G18 - 0x7C1C0000, // 0020 CALL R7 0 - 0x980C0C07, // 0021 SETIDX R3 R6 R7 - 0x941C0606, // 0022 GETIDX R7 R3 R6 - 0x8C1C0F0A, // 0023 GETMET R7 R7 K10 - 0x5C240A00, // 0024 MOVE R9 R5 - 0x7C1C0400, // 0025 CALL R7 2 - 0x0010090B, // 0026 ADD R4 R4 K11 - 0x7001FFDB, // 0027 JMP #0004 - 0x4C140000, // 0028 LDNIL R5 - 0x1C140605, // 0029 EQ R5 R3 R5 - 0x78160000, // 002A JMPF R5 #002C - 0x80000A00, // 002B RET 0 - 0x8C14030C, // 002C GETMET R5 R1 K12 - 0x581C000D, // 002D LDCONST R7 K13 - 0x7C140400, // 002E CALL R5 2 - 0x8C14030C, // 002F GETMET R5 R1 K12 - 0x581C000E, // 0030 LDCONST R7 K14 - 0x7C140400, // 0031 CALL R5 2 - 0x8C14030C, // 0032 GETMET R5 R1 K12 - 0xB81E0A00, // 0033 GETNGBL R7 K5 - 0x881C0F0F, // 0034 GETMBR R7 R7 K15 - 0x7C140400, // 0035 CALL R5 2 - 0x60140010, // 0036 GETGBL R5 G16 - 0x8C180710, // 0037 GETMET R6 R3 K16 - 0x7C180200, // 0038 CALL R6 1 - 0x7C140200, // 0039 CALL R5 1 - 0xA8020023, // 003A EXBLK 0 #005F - 0x5C180A00, // 003B MOVE R6 R5 - 0x7C180000, // 003C CALL R6 0 - 0x8C1C030C, // 003D GETMET R7 R1 K12 - 0x8C240511, // 003E GETMET R9 R2 K17 - 0x582C0012, // 003F LDCONST R11 K18 - 0x8C300313, // 0040 GETMET R12 R1 K19 - 0x5C380C00, // 0041 MOVE R14 R6 - 0x7C300400, // 0042 CALL R12 2 - 0x7C240600, // 0043 CALL R9 3 - 0x7C1C0400, // 0044 CALL R7 2 - 0x941C0606, // 0045 GETIDX R7 R3 R6 - 0x941C0F02, // 0046 GETIDX R7 R7 K2 - 0x881C0F07, // 0047 GETMBR R7 R7 K7 - 0x8C20030C, // 0048 GETMET R8 R1 K12 - 0x8C280F14, // 0049 GETMET R10 R7 K20 - 0x7C280200, // 004A CALL R10 1 - 0x7C200400, // 004B CALL R8 2 - 0x60200010, // 004C GETGBL R8 G16 - 0x94240606, // 004D GETIDX R9 R3 R6 - 0x7C200200, // 004E CALL R8 1 - 0xA802000A, // 004F EXBLK 0 #005B - 0x5C241000, // 0050 MOVE R9 R8 - 0x7C240000, // 0051 CALL R9 0 - 0x8C28030C, // 0052 GETMET R10 R1 K12 - 0x58300015, // 0053 LDCONST R12 K21 - 0x7C280400, // 0054 CALL R10 2 - 0x8C281316, // 0055 GETMET R10 R9 K22 - 0x7C280200, // 0056 CALL R10 1 - 0x8C28030C, // 0057 GETMET R10 R1 K12 - 0x58300017, // 0058 LDCONST R12 K23 - 0x7C280400, // 0059 CALL R10 2 - 0x7001FFF4, // 005A JMP #0050 - 0x58200018, // 005B LDCONST R8 K24 - 0xAC200200, // 005C CATCH R8 1 0 - 0xB0080000, // 005D RAISE 2 R0 R0 - 0x7001FFDB, // 005E JMP #003B - 0x58140018, // 005F LDCONST R5 K24 - 0xAC140200, // 0060 CATCH R5 1 0 - 0xB0080000, // 0061 RAISE 2 R0 R0 - 0x8C14030C, // 0062 GETMET R5 R1 K12 - 0x581C0019, // 0063 LDCONST R7 K25 - 0x7C140400, // 0064 CALL R5 2 - 0x80000000, // 0065 RET 0 + 0x8C0C0302, // 0002 GETMET R3 R1 K2 + 0x7C0C0200, // 0003 CALL R3 1 + 0x740E0001, // 0004 JMPT R3 #0007 + 0x4C0C0000, // 0005 LDNIL R3 + 0x80040600, // 0006 RET 1 R3 + 0x8C0C0303, // 0007 GETMET R3 R1 K3 + 0x58140004, // 0008 LDCONST R5 K4 + 0x7C0C0400, // 0009 CALL R3 2 + 0x8C0C0305, // 000A GETMET R3 R1 K5 + 0x7C0C0200, // 000B CALL R3 1 + 0x8C0C0106, // 000C GETMET R3 R0 K6 + 0x7C0C0200, // 000D CALL R3 1 + 0x8C0C0107, // 000E GETMET R3 R0 K7 + 0x7C0C0200, // 000F CALL R3 1 + 0x780E0001, // 0010 JMPF R3 #0013 + 0x8C0C0108, // 0011 GETMET R3 R0 K8 + 0x7C0C0200, // 0012 CALL R3 1 + 0x8C0C0309, // 0013 GETMET R3 R1 K9 + 0x5814000A, // 0014 LDCONST R5 K10 + 0x7C0C0400, // 0015 CALL R3 2 + 0x8C0C0309, // 0016 GETMET R3 R1 K9 + 0x5814000B, // 0017 LDCONST R5 K11 + 0x7C0C0400, // 0018 CALL R3 2 + 0x8C0C030C, // 0019 GETMET R3 R1 K12 + 0x8814030D, // 001A GETMBR R5 R1 K13 + 0x7C0C0400, // 001B CALL R3 2 + 0x8C0C030E, // 001C GETMET R3 R1 K14 + 0x7C0C0200, // 001D CALL R3 1 + 0x80000000, // 001E RET 0 }) ) ); @@ -2001,26 +3100,33 @@ be_local_closure(Matter_UI_show_bridge_status, /* name */ be_local_class(Matter_UI, 1, NULL, - be_nested_map(18, + be_nested_map(25, ( (struct bmapnode*) &(const bmapnode[]) { - { be_const_key_weak(show_bridge_status, -1), be_const_closure(Matter_UI_show_bridge_status_closure) }, - { be_const_key_weak(show_commissioning_info, -1), be_const_closure(Matter_UI_show_commissioning_info_closure) }, - { be_const_key_weak(show_passcode_form, 11), be_const_closure(Matter_UI_show_passcode_form_closure) }, - { be_const_key_weak(device, -1), be_const_var(0) }, - { be_const_key_weak(web_get_arg, -1), be_const_closure(Matter_UI_web_get_arg_closure) }, - { be_const_key_weak(show_qrcode, 4), be_const_closure(Matter_UI_show_qrcode_closure) }, - { be_const_key_weak(show_plugins_configuration, -1), be_const_closure(Matter_UI_show_plugins_configuration_closure) }, - { be_const_key_weak(_CLASSES_TYPES, -1), be_nested_str_weak(_X7Crelay_X7Clight0_X7Clight1_X7Clight2_X7Clight3_X7Cshutter_X7Cshutter_X2Btilt_X7Ctemperature_X7Cpressure_X7Cilluminance_X7Chumidity_X7Coccupancy_X7Conoff) }, - { be_const_key_weak(web_sensor, -1), be_const_closure(Matter_UI_web_sensor_closure) }, { be_const_key_weak(web_add_config_button, -1), be_const_closure(Matter_UI_web_add_config_button_closure) }, - { be_const_key_weak(_CLASSES_TYPES2, 7), be_nested_str_weak(_X2Dhttp_X7Chttp_relay_X7Chttp_light0_X7Chttp_light1_X7Chttp_light2_X7Chttp_light3_X7Chttp_temperature_X7Chttp_pressure_X7Chttp_illuminance_X7Chttp_humidity_X7Chttp_occupancy) }, + { be_const_key_weak(page_part_mgr, -1), be_const_closure(Matter_UI_page_part_mgr_closure) }, + { be_const_key_weak(page_part_mgr_adv, -1), be_const_closure(Matter_UI_page_part_mgr_adv_closure) }, + { be_const_key_weak(show_bridge_status, -1), be_const_closure(Matter_UI_show_bridge_status_closure) }, { be_const_key_weak(plugin_option, -1), be_const_closure(Matter_UI_plugin_option_closure) }, + { be_const_key_weak(init, 8), be_const_closure(Matter_UI_init_closure) }, + { be_const_key_weak(page_part_ctl, 7), be_const_closure(Matter_UI_page_part_ctl_closure) }, + { be_const_key_weak(show_fabric_info, 9), be_const_closure(Matter_UI_show_fabric_info_closure) }, + { be_const_key_weak(web_get_arg, -1), be_const_closure(Matter_UI_web_get_arg_closure) }, + { be_const_key_weak(equal_map, -1), be_const_static_closure(Matter_UI_equal_map_closure) }, + { be_const_key_weak(page_part_mgr_add, -1), be_const_closure(Matter_UI_page_part_mgr_add_closure) }, + { be_const_key_weak(device, -1), be_const_var(0) }, + { be_const_key_weak(web_add_handler, 21), be_const_closure(Matter_UI_web_add_handler_closure) }, + { be_const_key_weak(matter_enabled, -1), be_const_closure(Matter_UI_matter_enabled_closure) }, { be_const_key_weak(show_enable, -1), be_const_closure(Matter_UI_show_enable_closure) }, - { be_const_key_weak(show_fabric_info, -1), be_const_closure(Matter_UI_show_fabric_info_closure) }, - { be_const_key_weak(web_add_handler, -1), be_const_closure(Matter_UI_web_add_handler_closure) }, - { be_const_key_weak(init, 3), be_const_closure(Matter_UI_init_closure) }, - { be_const_key_weak(page_part_ctl, 2), be_const_closure(Matter_UI_page_part_ctl_closure) }, - { be_const_key_weak(page_part_mgr, 0), be_const_closure(Matter_UI_page_part_mgr_closure) }, + { be_const_key_weak(show_commissioning_info, -1), be_const_closure(Matter_UI_show_commissioning_info_closure) }, + { be_const_key_weak(_CLASSES_TYPES2, 18), be_nested_str_weak(_X7Chttp_relay_X7Chttp_light0_X7Chttp_light1_X7Chttp_light2_X7Chttp_light3_X7Chttp_temperature_X7Chttp_pressure_X7Chttp_illuminance_X7Chttp_humidity_X7Chttp_occupancy) }, + { be_const_key_weak(show_remote_autoconf, 13), be_const_closure(Matter_UI_show_remote_autoconf_closure) }, + { be_const_key_weak(show_plugins_configuration, 23), be_const_closure(Matter_UI_show_plugins_configuration_closure) }, + { be_const_key_weak(show_passcode_form, 16), be_const_closure(Matter_UI_show_passcode_form_closure) }, + { be_const_key_weak(_CLASSES_TYPES, -1), be_nested_str_weak(_X7Crelay_X7Clight0_X7Clight1_X7Clight2_X7Clight3_X7Cshutter_X7Cshutter_X2Btilt_X7Ctemperature_X7Cpressure_X7Cilluminance_X7Chumidity_X7Coccupancy_X7Conoff) }, + { be_const_key_weak(plugin_name, -1), be_const_closure(Matter_UI_plugin_name_closure) }, + { be_const_key_weak(web_sensor, -1), be_const_closure(Matter_UI_web_sensor_closure) }, + { be_const_key_weak(show_qrcode, -1), be_const_closure(Matter_UI_show_qrcode_closure) }, + { be_const_key_weak(generate_config_from_status, 1), be_const_closure(Matter_UI_generate_config_from_status_closure) }, })), be_str_weak(Matter_UI) ); From c88bff5a4698813ce37435af6a00d07435835c02 Mon Sep 17 00:00:00 2001 From: btsimonh Date: Sun, 11 Jun 2023 19:40:28 +0100 Subject: [PATCH 248/289] Berry: add path.rmdir(path), path.mkdir(path) (#18853) (cherry picked from commit 7ce04b8624c88279c57d4a7556aabbe5f3317773) --- .../berry_tasmota/src/be_path_tasmota_lib.c | 5 +++ lib/libesp32/berry_tasmota/src/be_port.cpp | 31 +++++++++++++++++++ 2 files changed, 36 insertions(+) diff --git a/lib/libesp32/berry_tasmota/src/be_path_tasmota_lib.c b/lib/libesp32/berry_tasmota/src/be_path_tasmota_lib.c index cfa7e829b..4c327b0ca 100644 --- a/lib/libesp32/berry_tasmota/src/be_path_tasmota_lib.c +++ b/lib/libesp32/berry_tasmota/src/be_path_tasmota_lib.c @@ -18,7 +18,10 @@ #include "be_sys.h" #include +// from be_port.c extern int m_path_listdir(bvm *vm); +extern int m_path_mkdir(bvm *vm); +extern int m_path_rmdir(bvm *vm); static int m_path_exists(bvm *vm) { @@ -79,6 +82,8 @@ module path (scope: global, file: tasmota_path) { listdir, func(m_path_listdir) remove, func(m_path_remove) format, func(m_path_format) + mkdir, func(m_path_mkdir) + rmdir, func(m_path_rmdir) } @const_object_info_end */ #include "be_fixed_tasmota_path.h" diff --git a/lib/libesp32/berry_tasmota/src/be_port.cpp b/lib/libesp32/berry_tasmota/src/be_port.cpp index 871885252..4eef6d044 100644 --- a/lib/libesp32/berry_tasmota/src/be_port.cpp +++ b/lib/libesp32/berry_tasmota/src/be_port.cpp @@ -131,6 +131,36 @@ extern "C" { #endif // USE_UFILESYS be_return_nil(vm); } + + static int _m_path_mkdir_rmdir(bvm *vm, int remove) { +#ifdef USE_UFILESYS + const char *path = NULL; + if (be_top(vm) >= 1 && be_isstring(vm, 1)) { + path = be_tostring(vm, 1); + int res = 0; + if (path != nullptr) { + if (remove) + res = zip_ufsp.rmdir(path); + else + res = zip_ufsp.mkdir(path); + } + be_pushbool(vm, res); + } else { + be_pushbool(vm, bfalse); + } + be_return(vm); +#else // USE_UFILESYS + be_return_nil(vm); +#endif // USE_UFILESYS + } + + int m_path_mkdir(bvm *vm) { + return _m_path_mkdir_rmdir(vm, 0); + } + int m_path_rmdir(bvm *vm) { + return _m_path_mkdir_rmdir(vm, 1); + } + } BERRY_API char* be_readstring(char *buffer, size_t size) @@ -161,6 +191,7 @@ void* be_fopen(const char *filename, const char *modes) return nullptr; // return fopen(filename, modes); } + #endif // USE_UFILESYS From badf064ab4f490742f379d4fdd604d9fdef16404 Mon Sep 17 00:00:00 2001 From: s-hadinger <49731213+s-hadinger@users.noreply.github.com> Date: Sun, 11 Jun 2023 23:10:26 +0200 Subject: [PATCH 249/289] Matter fix local Occupancy sensor (#18857) * Matter fix local Occupancy sensor * Fix also OnOff --- CHANGELOG.md | 1 + .../Matter_Plugin_Sensor_Occupancy.be | 19 ++-- .../embedded/Matter_Plugin_Sensor_OnOff.be | 19 ++-- ...olidified_Matter_Plugin_Sensor_Occupancy.h | 94 +++++++++---------- .../solidified_Matter_Plugin_Sensor_OnOff.h | 94 +++++++++---------- 5 files changed, 107 insertions(+), 120 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b26a93f6b..173cbb92d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -19,6 +19,7 @@ All notable changes to this project will be documented in this file. ### Fixed - Interaction of ``SetOption92``, ``VirtualCT``, and ``RGBWWTable`` (#18768) - Fixed HASPmota event when value is non-integer (fixes #18229) +- Matter fix local Occupancy sensor ### Removed diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor_Occupancy.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor_Occupancy.be index 0203874dd..e036bada5 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor_Occupancy.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor_Occupancy.be @@ -54,20 +54,17 @@ class Matter_Plugin_Sensor_Occupancy : Matter_Plugin_Device # def update_shadow() super(self).update_shadow() + var switch_str = "Switch" + str(self.tasmota_switch_index) - import json - var ret = tasmota.cmd("Status 8", true) - if ret != nil - var j = json.load(ret) - if j != nil - var state = false - state = (j.find("Switch" + str(self.tasmota_switch_index)) == "ON") + var j = tasmota.cmd("Status 8", true) + if j != nil j = j.find("StatusSNS") end + if j != nil && j.contains(switch_str) + var state = (j.find(switch_str) == "ON") - if self.shadow_occupancy != nil && self.shadow_occupancy != bool(state) - self.attribute_updated(0x0406, 0x0000) - end - self.shadow_occupancy = state + if (self.shadow_occupancy != state) + self.attribute_updated(0x0406, 0x0000) end + self.shadow_occupancy = state end end diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor_OnOff.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor_OnOff.be index c675c1f0f..e754c4466 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor_OnOff.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor_OnOff.be @@ -52,20 +52,17 @@ class Matter_Plugin_Sensor_OnOff : Matter_Plugin_Device # def update_shadow() super(self).update_shadow() + var switch_str = "Switch" + str(self.tasmota_switch_index) - import json - var ret = tasmota.cmd("Status 8", true) - if ret != nil - var j = json.load(ret) - if j != nil - var state = false - state = (j.find("Switch" + str(self.tasmota_switch_index)) == "ON") + var j = tasmota.cmd("Status 8", true) + if j != nil j = j.find("StatusSNS") end + if j != nil && j.contains(switch_str) + var state = (j.find(switch_str) == "ON") - if self.shadow_onoff != nil && self.shadow_onoff != bool(state) - self.attribute_updated(0x0406, 0x0000) - end - self.shadow_onoff = state + if (self.shadow_onoff != state) + self.attribute_updated(0x0006, 0x0000) end + self.shadow_onoff = state end end diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor_Occupancy.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor_Occupancy.h index 0c35bd94c..d114a216d 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor_Occupancy.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor_Occupancy.h @@ -187,7 +187,7 @@ be_local_closure(Matter_Plugin_Sensor_Occupancy_read_attribute, /* name */ ********************************************************************/ be_local_closure(Matter_Plugin_Sensor_Occupancy_update_shadow, /* name */ be_nested_proto( - 9, /* nstack */ + 8, /* nstack */ 1, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -197,14 +197,14 @@ be_local_closure(Matter_Plugin_Sensor_Occupancy_update_shadow, /* name */ 1, /* has constants */ ( &(const bvalue[13]) { /* constants */ /* K0 */ be_nested_str_weak(update_shadow), - /* K1 */ be_nested_str_weak(json), - /* K2 */ be_nested_str_weak(tasmota), - /* K3 */ be_nested_str_weak(cmd), - /* K4 */ be_nested_str_weak(Status_X208), - /* K5 */ be_nested_str_weak(load), + /* K1 */ be_nested_str_weak(Switch), + /* K2 */ be_nested_str_weak(tasmota_switch_index), + /* K3 */ be_nested_str_weak(tasmota), + /* K4 */ be_nested_str_weak(cmd), + /* K5 */ be_nested_str_weak(Status_X208), /* K6 */ be_nested_str_weak(find), - /* K7 */ be_nested_str_weak(Switch), - /* K8 */ be_nested_str_weak(tasmota_switch_index), + /* K7 */ be_nested_str_weak(StatusSNS), + /* K8 */ be_nested_str_weak(contains), /* K9 */ be_nested_str_weak(ON), /* K10 */ be_nested_str_weak(shadow_occupancy), /* K11 */ be_nested_str_weak(attribute_updated), @@ -212,52 +212,48 @@ be_local_closure(Matter_Plugin_Sensor_Occupancy_update_shadow, /* name */ }), be_str_weak(update_shadow), &be_const_str_solidified, - ( &(const binstruction[45]) { /* code */ + ( &(const binstruction[41]) { /* code */ 0x60040003, // 0000 GETGBL R1 G3 0x5C080000, // 0001 MOVE R2 R0 0x7C040200, // 0002 CALL R1 1 0x8C040300, // 0003 GETMET R1 R1 K0 0x7C040200, // 0004 CALL R1 1 - 0xA4060200, // 0005 IMPORT R1 K1 - 0xB80A0400, // 0006 GETNGBL R2 K2 - 0x8C080503, // 0007 GETMET R2 R2 K3 - 0x58100004, // 0008 LDCONST R4 K4 - 0x50140200, // 0009 LDBOOL R5 1 0 - 0x7C080600, // 000A CALL R2 3 - 0x4C0C0000, // 000B LDNIL R3 - 0x200C0403, // 000C NE R3 R2 R3 - 0x780E001D, // 000D JMPF R3 #002C - 0x8C0C0305, // 000E GETMET R3 R1 K5 - 0x5C140400, // 000F MOVE R5 R2 - 0x7C0C0400, // 0010 CALL R3 2 - 0x4C100000, // 0011 LDNIL R4 - 0x20100604, // 0012 NE R4 R3 R4 - 0x78120017, // 0013 JMPF R4 #002C - 0x50100000, // 0014 LDBOOL R4 0 0 - 0x8C140706, // 0015 GETMET R5 R3 K6 - 0x601C0008, // 0016 GETGBL R7 G8 - 0x88200108, // 0017 GETMBR R8 R0 K8 - 0x7C1C0200, // 0018 CALL R7 1 - 0x001E0E07, // 0019 ADD R7 K7 R7 - 0x7C140400, // 001A CALL R5 2 - 0x1C140B09, // 001B EQ R5 R5 K9 - 0x5C100A00, // 001C MOVE R4 R5 - 0x8814010A, // 001D GETMBR R5 R0 K10 - 0x4C180000, // 001E LDNIL R6 - 0x20140A06, // 001F NE R5 R5 R6 - 0x78160009, // 0020 JMPF R5 #002B - 0x8814010A, // 0021 GETMBR R5 R0 K10 - 0x60180017, // 0022 GETGBL R6 G23 - 0x5C1C0800, // 0023 MOVE R7 R4 - 0x7C180200, // 0024 CALL R6 1 - 0x20140A06, // 0025 NE R5 R5 R6 - 0x78160003, // 0026 JMPF R5 #002B - 0x8C14010B, // 0027 GETMET R5 R0 K11 - 0x541E0405, // 0028 LDINT R7 1030 - 0x5820000C, // 0029 LDCONST R8 K12 - 0x7C140600, // 002A CALL R5 3 - 0x90021404, // 002B SETMBR R0 K10 R4 - 0x80000000, // 002C RET 0 + 0x60040008, // 0005 GETGBL R1 G8 + 0x88080102, // 0006 GETMBR R2 R0 K2 + 0x7C040200, // 0007 CALL R1 1 + 0x00060201, // 0008 ADD R1 K1 R1 + 0xB80A0600, // 0009 GETNGBL R2 K3 + 0x8C080504, // 000A GETMET R2 R2 K4 + 0x58100005, // 000B LDCONST R4 K5 + 0x50140200, // 000C LDBOOL R5 1 0 + 0x7C080600, // 000D CALL R2 3 + 0x4C0C0000, // 000E LDNIL R3 + 0x200C0403, // 000F NE R3 R2 R3 + 0x780E0003, // 0010 JMPF R3 #0015 + 0x8C0C0506, // 0011 GETMET R3 R2 K6 + 0x58140007, // 0012 LDCONST R5 K7 + 0x7C0C0400, // 0013 CALL R3 2 + 0x5C080600, // 0014 MOVE R2 R3 + 0x4C0C0000, // 0015 LDNIL R3 + 0x200C0403, // 0016 NE R3 R2 R3 + 0x780E000F, // 0017 JMPF R3 #0028 + 0x8C0C0508, // 0018 GETMET R3 R2 K8 + 0x5C140200, // 0019 MOVE R5 R1 + 0x7C0C0400, // 001A CALL R3 2 + 0x780E000B, // 001B JMPF R3 #0028 + 0x8C0C0506, // 001C GETMET R3 R2 K6 + 0x5C140200, // 001D MOVE R5 R1 + 0x7C0C0400, // 001E CALL R3 2 + 0x1C0C0709, // 001F EQ R3 R3 K9 + 0x8810010A, // 0020 GETMBR R4 R0 K10 + 0x20100803, // 0021 NE R4 R4 R3 + 0x78120003, // 0022 JMPF R4 #0027 + 0x8C10010B, // 0023 GETMET R4 R0 K11 + 0x541A0405, // 0024 LDINT R6 1030 + 0x581C000C, // 0025 LDCONST R7 K12 + 0x7C100600, // 0026 CALL R4 3 + 0x90021403, // 0027 SETMBR R0 K10 R3 + 0x80000000, // 0028 RET 0 }) ) ); diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor_OnOff.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor_OnOff.h index b061f2b05..7e701f289 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor_OnOff.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor_OnOff.h @@ -160,7 +160,7 @@ be_local_closure(Matter_Plugin_Sensor_OnOff_read_attribute, /* name */ ********************************************************************/ be_local_closure(Matter_Plugin_Sensor_OnOff_update_shadow, /* name */ be_nested_proto( - 9, /* nstack */ + 8, /* nstack */ 1, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -170,14 +170,14 @@ be_local_closure(Matter_Plugin_Sensor_OnOff_update_shadow, /* name */ 1, /* has constants */ ( &(const bvalue[13]) { /* constants */ /* K0 */ be_nested_str_weak(update_shadow), - /* K1 */ be_nested_str_weak(json), - /* K2 */ be_nested_str_weak(tasmota), - /* K3 */ be_nested_str_weak(cmd), - /* K4 */ be_nested_str_weak(Status_X208), - /* K5 */ be_nested_str_weak(load), + /* K1 */ be_nested_str_weak(Switch), + /* K2 */ be_nested_str_weak(tasmota_switch_index), + /* K3 */ be_nested_str_weak(tasmota), + /* K4 */ be_nested_str_weak(cmd), + /* K5 */ be_nested_str_weak(Status_X208), /* K6 */ be_nested_str_weak(find), - /* K7 */ be_nested_str_weak(Switch), - /* K8 */ be_nested_str_weak(tasmota_switch_index), + /* K7 */ be_nested_str_weak(StatusSNS), + /* K8 */ be_nested_str_weak(contains), /* K9 */ be_nested_str_weak(ON), /* K10 */ be_nested_str_weak(shadow_onoff), /* K11 */ be_nested_str_weak(attribute_updated), @@ -185,52 +185,48 @@ be_local_closure(Matter_Plugin_Sensor_OnOff_update_shadow, /* name */ }), be_str_weak(update_shadow), &be_const_str_solidified, - ( &(const binstruction[45]) { /* code */ + ( &(const binstruction[41]) { /* code */ 0x60040003, // 0000 GETGBL R1 G3 0x5C080000, // 0001 MOVE R2 R0 0x7C040200, // 0002 CALL R1 1 0x8C040300, // 0003 GETMET R1 R1 K0 0x7C040200, // 0004 CALL R1 1 - 0xA4060200, // 0005 IMPORT R1 K1 - 0xB80A0400, // 0006 GETNGBL R2 K2 - 0x8C080503, // 0007 GETMET R2 R2 K3 - 0x58100004, // 0008 LDCONST R4 K4 - 0x50140200, // 0009 LDBOOL R5 1 0 - 0x7C080600, // 000A CALL R2 3 - 0x4C0C0000, // 000B LDNIL R3 - 0x200C0403, // 000C NE R3 R2 R3 - 0x780E001D, // 000D JMPF R3 #002C - 0x8C0C0305, // 000E GETMET R3 R1 K5 - 0x5C140400, // 000F MOVE R5 R2 - 0x7C0C0400, // 0010 CALL R3 2 - 0x4C100000, // 0011 LDNIL R4 - 0x20100604, // 0012 NE R4 R3 R4 - 0x78120017, // 0013 JMPF R4 #002C - 0x50100000, // 0014 LDBOOL R4 0 0 - 0x8C140706, // 0015 GETMET R5 R3 K6 - 0x601C0008, // 0016 GETGBL R7 G8 - 0x88200108, // 0017 GETMBR R8 R0 K8 - 0x7C1C0200, // 0018 CALL R7 1 - 0x001E0E07, // 0019 ADD R7 K7 R7 - 0x7C140400, // 001A CALL R5 2 - 0x1C140B09, // 001B EQ R5 R5 K9 - 0x5C100A00, // 001C MOVE R4 R5 - 0x8814010A, // 001D GETMBR R5 R0 K10 - 0x4C180000, // 001E LDNIL R6 - 0x20140A06, // 001F NE R5 R5 R6 - 0x78160009, // 0020 JMPF R5 #002B - 0x8814010A, // 0021 GETMBR R5 R0 K10 - 0x60180017, // 0022 GETGBL R6 G23 - 0x5C1C0800, // 0023 MOVE R7 R4 - 0x7C180200, // 0024 CALL R6 1 - 0x20140A06, // 0025 NE R5 R5 R6 - 0x78160003, // 0026 JMPF R5 #002B - 0x8C14010B, // 0027 GETMET R5 R0 K11 - 0x541E0405, // 0028 LDINT R7 1030 - 0x5820000C, // 0029 LDCONST R8 K12 - 0x7C140600, // 002A CALL R5 3 - 0x90021404, // 002B SETMBR R0 K10 R4 - 0x80000000, // 002C RET 0 + 0x60040008, // 0005 GETGBL R1 G8 + 0x88080102, // 0006 GETMBR R2 R0 K2 + 0x7C040200, // 0007 CALL R1 1 + 0x00060201, // 0008 ADD R1 K1 R1 + 0xB80A0600, // 0009 GETNGBL R2 K3 + 0x8C080504, // 000A GETMET R2 R2 K4 + 0x58100005, // 000B LDCONST R4 K5 + 0x50140200, // 000C LDBOOL R5 1 0 + 0x7C080600, // 000D CALL R2 3 + 0x4C0C0000, // 000E LDNIL R3 + 0x200C0403, // 000F NE R3 R2 R3 + 0x780E0003, // 0010 JMPF R3 #0015 + 0x8C0C0506, // 0011 GETMET R3 R2 K6 + 0x58140007, // 0012 LDCONST R5 K7 + 0x7C0C0400, // 0013 CALL R3 2 + 0x5C080600, // 0014 MOVE R2 R3 + 0x4C0C0000, // 0015 LDNIL R3 + 0x200C0403, // 0016 NE R3 R2 R3 + 0x780E000F, // 0017 JMPF R3 #0028 + 0x8C0C0508, // 0018 GETMET R3 R2 K8 + 0x5C140200, // 0019 MOVE R5 R1 + 0x7C0C0400, // 001A CALL R3 2 + 0x780E000B, // 001B JMPF R3 #0028 + 0x8C0C0506, // 001C GETMET R3 R2 K6 + 0x5C140200, // 001D MOVE R5 R1 + 0x7C0C0400, // 001E CALL R3 2 + 0x1C0C0709, // 001F EQ R3 R3 K9 + 0x8810010A, // 0020 GETMBR R4 R0 K10 + 0x20100803, // 0021 NE R4 R4 R3 + 0x78120003, // 0022 JMPF R4 #0027 + 0x8C10010B, // 0023 GETMET R4 R0 K11 + 0x541A0005, // 0024 LDINT R6 6 + 0x581C000C, // 0025 LDCONST R7 K12 + 0x7C100600, // 0026 CALL R4 3 + 0x90021403, // 0027 SETMBR R0 K10 R3 + 0x80000000, // 0028 RET 0 }) ) ); From ae773895f83083dede1c180e5941cc517ab9d920 Mon Sep 17 00:00:00 2001 From: s-hadinger <49731213+s-hadinger@users.noreply.github.com> Date: Mon, 12 Jun 2023 08:40:59 +0200 Subject: [PATCH 250/289] Minor change to Matter UI (#18858) --- .../berry_matter/src/embedded/Matter_UI.be | 8 ++- .../src/solidify/solidified_Matter_UI.h | 56 ++++++++++--------- 2 files changed, 35 insertions(+), 29 deletions(-) diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_UI.be b/lib/libesp32/berry_matter/src/embedded/Matter_UI.be index abf69bb1d..2f1ff5b0a 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_UI.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_UI.be @@ -375,10 +375,12 @@ class Matter_UI end webserver.content_send("") + "Change configuration

    ") + # Add new endpoint section - webserver.content_send("

    Add local sensor or device

    " + webserver.content_send("

     Add to Configuration 

    ") + webserver.content_send("

    Add local sensor or device

    " "
    " "" "") @@ -407,7 +409,7 @@ class Matter_UI # button "Reset and Auto-discover" webserver.content_send("" - "

    ") + "

    ") webserver.content_send("

    ") diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_UI.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_UI.h index 2f5170eee..ba1b39dd0 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_UI.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_UI.h @@ -2325,7 +2325,7 @@ be_local_closure(Matter_UI_show_plugins_configuration, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[58]) { /* constants */ + ( &(const bvalue[59]) { /* constants */ /* K0 */ be_nested_str_weak(webserver), /* K1 */ be_nested_str_weak(string), /* K2 */ be_nested_str_weak(introspect), @@ -2370,24 +2370,25 @@ be_local_closure(Matter_UI_show_plugins_configuration, /* name */ /* K41 */ be_nested_str_weak(_X3Ctd_X20width_X3D_X27115_X27_X3E_X3Cfont_X20size_X3D_X27_X2D1_X27_X3E_X3Cb_X3E_X25s_X3C_X2Fb_X3E_X3C_X2Fselect_X3E_X3C_X2Ffont_X3E_X3C_X2Ftd_X3E), /* K42 */ be_nested_str_weak(_X3Ctd_X20width_X3D_X2715_X27_X20style_X3D_X27text_X2Dalign_X3Acenter_X3B_X27_X3E_X3Cbutton_X20name_X3D_X27del_X25i_X27_X20style_X3D_X27background_X3Anone_X3Bborder_X3Anone_X3Bline_X2Dheight_X3A1_X3B_X27_X20onclick_X3D_X22return_X20confirm_X28_X27Confirm_X20removing_X20endpoint_X27_X29_X22_X3E_X26_X23128293_X3B_X3C_X2Fbutton_X3E_X3C_X2Ftd_X3E_X3C_X2Ftr_X3E), /* K43 */ be_nested_str_weak(_X3C_X2Ftable_X3E_X3Cp_X3E_X3C_X2Fp_X3E), - /* K44 */ be_nested_str_weak(_X3Cbutton_X20name_X3D_X27config_X27_X20class_X3D_X27button_X20bgrn_X27_X3EChange_X20configuration_X3C_X2Fbutton_X3E_X3C_X2Fform_X3E), - /* K45 */ be_nested_str_weak(_X3Chr_X3E_X3Cp_X3E_X3Cb_X3EAdd_X20local_X20sensor_X20or_X20device_X3C_X2Fb_X3E_X3C_X2Fp_X3E_X3Cform_X20action_X3D_X27_X2Fmatterc_X27_X20method_X3D_X27post_X27_X3E_X3Ctable_X20style_X3D_X27width_X3A100_X25_X27_X3E_X3Ctr_X3E_X3Ctd_X20width_X3D_X27145_X27_X3EType_X3C_X2Ftd_X3E_X3Ctd_X3EParameter_X3C_X2Ftd_X3E_X3C_X2Ftr_X3E), - /* K46 */ be_nested_str_weak(_X3Ctr_X3E_X3Ctd_X3E_X3Cfont_X20size_X3D_X27_X2D1_X27_X3E_X3Cselect_X20name_X3D_X27pi_X27_X3E), - /* K47 */ be_nested_str_weak(plugin_option), - /* K48 */ be_nested_str_weak(_CLASSES_TYPES), - /* K49 */ be_nested_str_weak(_X3C_X2Fselect_X3E_X3C_X2Ffont_X3E_X3C_X2Ftd_X3E), - /* K50 */ be_nested_str_weak(_X3Ctd_X3E_X3Cfont_X20size_X3D_X27_X2D1_X27_X3E_X3Cinput_X20type_X3D_X27text_X27_X20name_X3D_X27arg_X27_X20minlength_X3D_X270_X27_X20size_X3D_X278_X27_X20value_X3D_X27_X27_X3E_X3C_X2Ffont_X3E_X3C_X2Ftd_X3E_X3C_X2Ftr_X3E_X3C_X2Ftable_X3E), - /* K51 */ be_nested_str_weak(_X3Cdiv_X20style_X3D_X27display_X3A_X20block_X3B_X27_X3E_X3C_X2Fdiv_X3E), - /* K52 */ be_nested_str_weak(_X3Cbutton_X20name_X3D_X27addep_X27_X20class_X3D_X27button_X20bgrn_X27_X3ECreate_X20new_X20endpoint_X3C_X2Fbutton_X3E_X3C_X2Fform_X3E), - /* K53 */ be_nested_str_weak(_X3Chr_X3E_X3Cp_X3E_X3Cb_X3EAdd_X20Remote_X20Tasmota_X3C_X2Fb_X3E_X3C_X2Fp_X3E_X3Cform_X20action_X3D_X27_X2Fmatteradd_X27_X20method_X3D_X27get_X27_X3E_X3Ctable_X20style_X3D_X27width_X3A100_X25_X27_X3E), - /* K54 */ be_nested_str_weak(_X3Ctr_X3E_X3Ctd_X20width_X3D_X2730_X27_X3E_X3Cfont_X20size_X3D_X27_X2D1_X27_X3E_X3Cb_X3Ehttp_X3A_X2F_X2F_X3C_X2Fb_X3E_X3C_X2Ffont_X3E_X3C_X2Ftd_X3E_X3Ctd_X3E_X3Cinput_X20type_X3D_X27text_X27_X20name_X3D_X27url_X27_X20minlength_X3D_X270_X27_X20size_X3D_X278_X27_X20value_X3D_X27_X27_X20required_X20placeholder_X3D_X27IP_X20or_X20domain_X27_X3E_X3C_X2Ftd_X3E_X3Ctd_X20width_X3D_X2710_X27_X3E_X3Cfont_X20size_X3D_X27_X2D1_X27_X3E_X3Cb_X3E_X2F_X3C_X2Fb_X3E_X3C_X2Ffont_X3E_X3C_X2Ftd_X3E_X3C_X2Ftr_X3E_X3C_X2Ftr_X3E_X3C_X2Ftable_X3E), - /* K55 */ be_nested_str_weak(_X3Cbutton_X20class_X3D_X27button_X20bgrn_X27_X3EAuto_X2Dconfigure_X20remote_X20Tasmota_X3C_X2Fbutton_X3E_X3C_X2Fform_X3E_X3Chr_X3E), - /* K56 */ be_nested_str_weak(_X3Cform_X20action_X3D_X27_X2Fmatterc_X27_X20method_X3D_X27post_X27onsubmit_X3D_X27return_X20confirm_X28_X22This_X20will_X20RESET_X20the_X20configuration_X20to_X20the_X20default_X2E_X20You_X20will_X20need_X20to_X20associate_X20again_X2E_X22_X29_X3B_X27_X3E_X3Cbutton_X20name_X3D_X27auto_X27_X20class_X3D_X27button_X20bred_X27_X3EReset_X20and_X20Auto_X2Ddiscover_X3C_X2Fbutton_X3E_X3Cp_X3E_X3C_X2Fp_X3E_X3C_X2Fform_X3E), - /* K57 */ be_nested_str_weak(_X3Cp_X3E_X3C_X2Fp_X3E_X3C_X2Ffieldset_X3E), + /* K44 */ be_nested_str_weak(_X3Cbutton_X20name_X3D_X27config_X27_X20class_X3D_X27button_X20bgrn_X27_X3EChange_X20configuration_X3C_X2Fbutton_X3E_X3C_X2Fform_X3E_X3Cp_X3E_X3C_X2Fp_X3E_X3C_X2Ffieldset_X3E), + /* K45 */ be_nested_str_weak(_X3Cp_X3E_X3C_X2Fp_X3E_X3Cfieldset_X3E_X3Clegend_X3E_X3Cb_X3E_X26nbsp_X3BAdd_X20to_X20Configuration_X26nbsp_X3B_X3C_X2Fb_X3E_X3C_X2Flegend_X3E_X3Cp_X3E_X3C_X2Fp_X3E), + /* K46 */ be_nested_str_weak(_X3Cp_X3E_X3Cb_X3EAdd_X20local_X20sensor_X20or_X20device_X3C_X2Fb_X3E_X3C_X2Fp_X3E_X3Cform_X20action_X3D_X27_X2Fmatterc_X27_X20method_X3D_X27post_X27_X3E_X3Ctable_X20style_X3D_X27width_X3A100_X25_X27_X3E_X3Ctr_X3E_X3Ctd_X20width_X3D_X27145_X27_X3EType_X3C_X2Ftd_X3E_X3Ctd_X3EParameter_X3C_X2Ftd_X3E_X3C_X2Ftr_X3E), + /* K47 */ be_nested_str_weak(_X3Ctr_X3E_X3Ctd_X3E_X3Cfont_X20size_X3D_X27_X2D1_X27_X3E_X3Cselect_X20name_X3D_X27pi_X27_X3E), + /* K48 */ be_nested_str_weak(plugin_option), + /* K49 */ be_nested_str_weak(_CLASSES_TYPES), + /* K50 */ be_nested_str_weak(_X3C_X2Fselect_X3E_X3C_X2Ffont_X3E_X3C_X2Ftd_X3E), + /* K51 */ be_nested_str_weak(_X3Ctd_X3E_X3Cfont_X20size_X3D_X27_X2D1_X27_X3E_X3Cinput_X20type_X3D_X27text_X27_X20name_X3D_X27arg_X27_X20minlength_X3D_X270_X27_X20size_X3D_X278_X27_X20value_X3D_X27_X27_X3E_X3C_X2Ffont_X3E_X3C_X2Ftd_X3E_X3C_X2Ftr_X3E_X3C_X2Ftable_X3E), + /* K52 */ be_nested_str_weak(_X3Cdiv_X20style_X3D_X27display_X3A_X20block_X3B_X27_X3E_X3C_X2Fdiv_X3E), + /* K53 */ be_nested_str_weak(_X3Cbutton_X20name_X3D_X27addep_X27_X20class_X3D_X27button_X20bgrn_X27_X3ECreate_X20new_X20endpoint_X3C_X2Fbutton_X3E_X3C_X2Fform_X3E), + /* K54 */ be_nested_str_weak(_X3Chr_X3E_X3Cp_X3E_X3Cb_X3EAdd_X20Remote_X20Tasmota_X3C_X2Fb_X3E_X3C_X2Fp_X3E_X3Cform_X20action_X3D_X27_X2Fmatteradd_X27_X20method_X3D_X27get_X27_X3E_X3Ctable_X20style_X3D_X27width_X3A100_X25_X27_X3E), + /* K55 */ be_nested_str_weak(_X3Ctr_X3E_X3Ctd_X20width_X3D_X2730_X27_X3E_X3Cfont_X20size_X3D_X27_X2D1_X27_X3E_X3Cb_X3Ehttp_X3A_X2F_X2F_X3C_X2Fb_X3E_X3C_X2Ffont_X3E_X3C_X2Ftd_X3E_X3Ctd_X3E_X3Cinput_X20type_X3D_X27text_X27_X20name_X3D_X27url_X27_X20minlength_X3D_X270_X27_X20size_X3D_X278_X27_X20value_X3D_X27_X27_X20required_X20placeholder_X3D_X27IP_X20or_X20domain_X27_X3E_X3C_X2Ftd_X3E_X3Ctd_X20width_X3D_X2710_X27_X3E_X3Cfont_X20size_X3D_X27_X2D1_X27_X3E_X3Cb_X3E_X2F_X3C_X2Fb_X3E_X3C_X2Ffont_X3E_X3C_X2Ftd_X3E_X3C_X2Ftr_X3E_X3C_X2Ftr_X3E_X3C_X2Ftable_X3E), + /* K56 */ be_nested_str_weak(_X3Cbutton_X20class_X3D_X27button_X20bgrn_X27_X3EAuto_X2Dconfigure_X20remote_X20Tasmota_X3C_X2Fbutton_X3E_X3C_X2Fform_X3E_X3Chr_X3E), + /* K57 */ be_nested_str_weak(_X3Cform_X20action_X3D_X27_X2Fmatterc_X27_X20method_X3D_X27post_X27onsubmit_X3D_X27return_X20confirm_X28_X22This_X20will_X20RESET_X20the_X20configuration_X20to_X20the_X20default_X2E_X20You_X20will_X20need_X20to_X20associate_X20again_X2E_X22_X29_X3B_X27_X3E_X3Cbutton_X20name_X3D_X27auto_X27_X20class_X3D_X27button_X20bred_X27_X3EReset_X20all_X20and_X20Auto_X2Ddiscover_X3C_X2Fbutton_X3E_X3Cp_X3E_X3C_X2Fp_X3E_X3C_X2Fform_X3E), + /* K58 */ be_nested_str_weak(_X3Cp_X3E_X3C_X2Fp_X3E_X3C_X2Ffieldset_X3E), }), be_str_weak(show_plugins_configuration), &be_const_str_solidified, - ( &(const binstruction[308]) { /* code */ + ( &(const binstruction[311]) { /* code */ 0xA4060000, // 0000 IMPORT R1 K0 0xA40A0200, // 0001 IMPORT R2 K1 0xA40E0400, // 0002 IMPORT R3 K2 @@ -2661,13 +2662,13 @@ be_local_closure(Matter_UI_show_plugins_configuration, /* name */ 0x8C200303, // 010E GETMET R8 R1 K3 0x5828002E, // 010F LDCONST R10 K46 0x7C200400, // 0110 CALL R8 2 - 0x8C20012F, // 0111 GETMET R8 R0 K47 - 0x58280011, // 0112 LDCONST R10 K17 - 0x882C0130, // 0113 GETMBR R11 R0 K48 - 0x7C200600, // 0114 CALL R8 3 - 0x8C200303, // 0115 GETMET R8 R1 K3 - 0x58280031, // 0116 LDCONST R10 K49 - 0x7C200400, // 0117 CALL R8 2 + 0x8C200303, // 0111 GETMET R8 R1 K3 + 0x5828002F, // 0112 LDCONST R10 K47 + 0x7C200400, // 0113 CALL R8 2 + 0x8C200130, // 0114 GETMET R8 R0 K48 + 0x58280011, // 0115 LDCONST R10 K17 + 0x882C0131, // 0116 GETMBR R11 R0 K49 + 0x7C200600, // 0117 CALL R8 3 0x8C200303, // 0118 GETMET R8 R1 K3 0x58280032, // 0119 LDCONST R10 K50 0x7C200400, // 011A CALL R8 2 @@ -2684,10 +2685,10 @@ be_local_closure(Matter_UI_show_plugins_configuration, /* name */ 0x58280036, // 0125 LDCONST R10 K54 0x7C200400, // 0126 CALL R8 2 0x8C200303, // 0127 GETMET R8 R1 K3 - 0x58280033, // 0128 LDCONST R10 K51 + 0x58280037, // 0128 LDCONST R10 K55 0x7C200400, // 0129 CALL R8 2 0x8C200303, // 012A GETMET R8 R1 K3 - 0x58280037, // 012B LDCONST R10 K55 + 0x58280034, // 012B LDCONST R10 K52 0x7C200400, // 012C CALL R8 2 0x8C200303, // 012D GETMET R8 R1 K3 0x58280038, // 012E LDCONST R10 K56 @@ -2695,7 +2696,10 @@ be_local_closure(Matter_UI_show_plugins_configuration, /* name */ 0x8C200303, // 0130 GETMET R8 R1 K3 0x58280039, // 0131 LDCONST R10 K57 0x7C200400, // 0132 CALL R8 2 - 0x80000000, // 0133 RET 0 + 0x8C200303, // 0133 GETMET R8 R1 K3 + 0x5828003A, // 0134 LDCONST R10 K58 + 0x7C200400, // 0135 CALL R8 2 + 0x80000000, // 0136 RET 0 }) ) ); From bc213289cdd24c26f801cab10b6f1a0c26cd835f Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Mon, 12 Jun 2023 16:20:03 +0200 Subject: [PATCH 251/289] Update platformio_tasmota32.ini (#18863) --- platformio_tasmota32.ini | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platformio_tasmota32.ini b/platformio_tasmota32.ini index b628b94ad..b8be97bdd 100644 --- a/platformio_tasmota32.ini +++ b/platformio_tasmota32.ini @@ -42,7 +42,7 @@ extra_scripts = pre:pio-tools/add_c_flags.py ${esp_defaults.extra_scripts} [core32] -platform = https://github.com/tasmota/platform-espressif32/releases/download/2023.06.01/platform-espressif32.zip +platform = https://github.com/tasmota/platform-espressif32/releases/download/2023.06.02/platform-espressif32.zip platform_packages = build_unflags = ${esp32_defaults.build_unflags} build_flags = ${esp32_defaults.build_flags} From 0e3b32e8481ee161cbbaef6ef8bac4b1b896fbf4 Mon Sep 17 00:00:00 2001 From: stefanbode Date: Mon, 12 Jun 2023 19:09:19 +0200 Subject: [PATCH 252/289] Readded up/down/open/close commands (#18864) * Update xdrv_27_shutter.ino * fix shutterposition with up/down/open/close --- tasmota/tasmota_xdrv_driver/xdrv_27_esp32_shutter.ino | 4 ++-- tasmota/tasmota_xdrv_driver/xdrv_27_shutter.ino | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/tasmota/tasmota_xdrv_driver/xdrv_27_esp32_shutter.ino b/tasmota/tasmota_xdrv_driver/xdrv_27_esp32_shutter.ino index a4739135e..1108b3671 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_27_esp32_shutter.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_27_esp32_shutter.ino @@ -1486,11 +1486,11 @@ void CmndShutterPosition(void) if ((XdrvMailbox.data_len > 3) && (XdrvMailbox.payload <= 0)) { // set len to 0 to avoid loop on close where payload is 0 XdrvMailbox.data_len = 0; - if ( ((Shutter[index].direction==0) && !strcasecmp(XdrvMailbox.data,D_CMND_SHUTTER_STOPOPEN))) { + if (!strcasecmp(XdrvMailbox.data,D_CMND_SHUTTER_UP) || !strcasecmp(XdrvMailbox.data,D_CMND_SHUTTER_OPEN) || ((Shutter[index].direction==0) && !strcasecmp(XdrvMailbox.data,D_CMND_SHUTTER_STOPOPEN))) { CmndShutterOpen(); return; } - if ( ((Shutter[index].direction==0) && !strcasecmp(XdrvMailbox.data,D_CMND_SHUTTER_STOPCLOSE))) { + if (!strcasecmp(XdrvMailbox.data,D_CMND_SHUTTER_DOWN) || !strcasecmp(XdrvMailbox.data,D_CMND_SHUTTER_CLOSE) || ((Shutter[index].direction==0) && !strcasecmp(XdrvMailbox.data,D_CMND_SHUTTER_STOPCLOSE))) { CmndShutterClose(); return; } diff --git a/tasmota/tasmota_xdrv_driver/xdrv_27_shutter.ino b/tasmota/tasmota_xdrv_driver/xdrv_27_shutter.ino index c9dbb9545..5fb4ae327 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_27_shutter.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_27_shutter.ino @@ -1318,11 +1318,11 @@ void CmndShutterPosition(void) if ((XdrvMailbox.data_len > 3) && (XdrvMailbox.payload <= 0)) { // set len to 0 to avoid loop on close where payload is 0 XdrvMailbox.data_len = 0; - if ( ((Shutter[index].direction==0) && !strcasecmp(XdrvMailbox.data,D_CMND_SHUTTER_STOPOPEN))) { + if (!strcasecmp(XdrvMailbox.data,D_CMND_SHUTTER_UP) || !strcasecmp(XdrvMailbox.data,D_CMND_SHUTTER_OPEN) || ((Shutter[index].direction==0) && !strcasecmp(XdrvMailbox.data,D_CMND_SHUTTER_STOPOPEN))) { CmndShutterOpen(); return; } - if ( ((Shutter[index].direction==0) && !strcasecmp(XdrvMailbox.data,D_CMND_SHUTTER_STOPCLOSE))) { + if (!strcasecmp(XdrvMailbox.data,D_CMND_SHUTTER_DOWN) || !strcasecmp(XdrvMailbox.data,D_CMND_SHUTTER_CLOSE) || ((Shutter[index].direction==0) && !strcasecmp(XdrvMailbox.data,D_CMND_SHUTTER_STOPCLOSE))) { CmndShutterClose(); return; } From 69b2b93d611b3f1a64cd039d7dea1313318445da Mon Sep 17 00:00:00 2001 From: s-hadinger <49731213+s-hadinger@users.noreply.github.com> Date: Mon, 12 Jun 2023 19:45:18 +0200 Subject: [PATCH 253/289] Matter UI and logs polishing (#18866) --- .../berry_matter/src/be_matter_module.c | 23 +- .../src/embedded/Matter_Commissioning.be | 116 +- .../src/embedded/Matter_Control_Message.be | 2 +- .../src/embedded/Matter_Device.be | 126 +- .../src/embedded/Matter_Fabric.be | 4 +- .../src/embedded/Matter_HTTP_remote.be | 8 +- .../berry_matter/src/embedded/Matter_IM.be | 48 +- .../src/embedded/Matter_IM_Message.be | 14 +- .../src/embedded/Matter_IM_Subscription.be | 4 +- .../src/embedded/Matter_Message.be | 6 +- .../src/embedded/Matter_MessageHandler.be | 30 +- .../src/embedded/Matter_Plugin.be | 1 + .../embedded/Matter_Plugin_Bridge_Light0.be | 1 + .../embedded/Matter_Plugin_Bridge_OnOff.be | 1 + .../embedded/Matter_Plugin_Bridge_Sensor.be | 1 + .../Matter_Plugin_Bridge_Sensor_Occupancy.be | 1 + .../src/embedded/Matter_Plugin_OnOff.be | 1 + .../src/embedded/Matter_Plugin_Root.be | 20 +- .../src/embedded/Matter_Plugin_Sensor.be | 1 + .../Matter_Plugin_Sensor_Occupancy.be | 1 + .../embedded/Matter_Plugin_Sensor_OnOff.be | 3 +- .../src/embedded/Matter_Plugin_Shutter.be | 5 +- .../src/embedded/Matter_Session.be | 3 +- .../src/embedded/Matter_Session_Store.be | 6 +- .../src/embedded/Matter_UDPServer.be | 12 +- .../berry_matter/src/embedded/Matter_UI.be | 134 +- .../solidified_Matter_Commissioning.h | 2700 +++-- .../solidified_Matter_Control_Message.h | 7 +- .../src/solidify/solidified_Matter_Device.h | 8847 +++++++++-------- .../src/solidify/solidified_Matter_Fabric.h | 4 +- .../solidify/solidified_Matter_HTTP_remote.h | 6 +- .../src/solidify/solidified_Matter_IM.h | 644 +- .../solidify/solidified_Matter_IM_Message.h | 186 +- .../solidified_Matter_IM_Subscription.h | 4 +- .../src/solidify/solidified_Matter_Message.h | 23 +- .../solidified_Matter_MessageHandler.h | 838 +- .../src/solidify/solidified_Matter_Plugin.h | 1493 +-- .../solidified_Matter_Plugin_Bridge_Light0.h | 653 +- .../solidified_Matter_Plugin_Bridge_OnOff.h | 11 +- .../solidified_Matter_Plugin_Bridge_Sensor.h | 251 +- ...ed_Matter_Plugin_Bridge_Sensor_Occupancy.h | 207 +- .../solidify/solidified_Matter_Plugin_OnOff.h | 317 +- .../solidify/solidified_Matter_Plugin_Root.h | 1247 ++- .../solidified_Matter_Plugin_Sensor.h | 123 +- ...olidified_Matter_Plugin_Sensor_Occupancy.h | 83 +- .../solidified_Matter_Plugin_Sensor_OnOff.h | 85 +- .../solidified_Matter_Plugin_Shutter.h | 668 +- .../src/solidify/solidified_Matter_Session.h | 63 +- .../solidified_Matter_Session_Store.h | 51 +- .../solidify/solidified_Matter_UDPServer.h | 168 +- .../src/solidify/solidified_Matter_UI.h | 5221 +++++----- tasmota/tasmota_support/support_wifi.ino | 2 +- 52 files changed, 12055 insertions(+), 12419 deletions(-) diff --git a/lib/libesp32/berry_matter/src/be_matter_module.c b/lib/libesp32/berry_matter/src/be_matter_module.c index 6f7af2ab0..edd3923c2 100644 --- a/lib/libesp32/berry_matter/src/be_matter_module.c +++ b/lib/libesp32/berry_matter/src/be_matter_module.c @@ -39,13 +39,21 @@ static const uint8_t MATTER_LOGO[] = // Matter stylesheet static const uint8_t MATTER_STYLESHEET[] = - ""; + ""; + +static const uint8_t MATTER_ADD_ENDPOINT_HINTS_JS[] = + ""; extern uint32_t matter_convert_seconds_to_dhm(uint32_t seconds, char *unit, uint32_t *color, bbool days); @@ -256,6 +264,7 @@ static int matter_CD_FFF1_8000(bvm *vm) { return matter_return_static_bytes(vm, module matter (scope: global, strings: weak) { _LOGO, comptr(MATTER_LOGO) _STYLESHEET, comptr(MATTER_STYLESHEET) + _ADD_ENDPOINT_JS, comptr(MATTER_ADD_ENDPOINT_HINTS_JS) MATTER_OPTION, int(151) // SetOption151 enables Matter seconds_to_dhm, ctype_func(matter_seconds_to_dhm) diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Commissioning.be b/lib/libesp32/berry_matter/src/embedded/Matter_Commissioning.be index 2231d7960..0251076ba 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Commissioning.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Commissioning.be @@ -46,7 +46,7 @@ class Matter_Commisioning_Context def add_session(local_session_id, initiator_session_id, i2r, r2i, ac) import string # create session object - tasmota.log(string.format("MTR: add_session local_session_id=%i initiator_session_id=%i", local_session_id, initiator_session_id), 3) + tasmota.log(string.format("MTR: add_session local_session_id=%i initiator_session_id=%i", local_session_id, initiator_session_id), 4) var session = self.device.sessions.create_session(local_session_id, initiator_session_id) session.set_keys(i2r, r2i, ac) @@ -59,7 +59,7 @@ class Matter_Commisioning_Context return false end - tasmota.log("MTR: received message " + matter.inspect(msg), 4) + # tasmota.log("MTR: received message " + matter.inspect(msg), 4) if msg.opcode == 0x10 # don't need to do anything, the message is acked already before this call elif msg.opcode == 0x20 @@ -113,7 +113,7 @@ class Matter_Commisioning_Context # sanity checks if msg.opcode != 0x20 || msg.local_session_id != 0 || msg.protocol_id != 0 tasmota.log("MTR: invalid PBKDFParamRequest message", 2) - tasmota.log("MTR: StatusReport(General Code: FAILURE, ProtocolId: SECURE_CHANNEL, ProtocolCode: INVALID_PARAMETER)", 2) + tasmota.log("MTR: StatusReport(General Code: FAILURE, ProtocolId: SECURE_CHANNEL, ProtocolCode: INVALID_PARAMETER)", 3) self.send_status_report(msg, 0x01, 0x0000, 0x0002, false) return false end @@ -125,7 +125,7 @@ class Matter_Commisioning_Context # sanity check for PBKDFParamRequest if pbkdfparamreq.passcodeId != 0 tasmota.log("MTR: non-zero passcode id", 2) - tasmota.log("MTR: StatusReport(General Code: FAILURE, ProtocolId: SECURE_CHANNEL, ProtocolCode: INVALID_PARAMETER)", 2) + tasmota.log("MTR: StatusReport(General Code: FAILURE, ProtocolId: SECURE_CHANNEL, ProtocolCode: INVALID_PARAMETER)", 3) self.send_status_report(msg, 0x01, 0x0000, 0x0002, false) return false end @@ -133,7 +133,7 @@ class Matter_Commisioning_Context # record the initiator_session_id session.__future_initiator_session_id = pbkdfparamreq.initiator_session_id session.__future_local_session_id = self.device.sessions.gen_local_session_id() - tasmota.log(string.format("MTR: +Session (%6i) from '[%s]:%i'", session.__future_local_session_id, msg.remote_ip, msg.remote_port), 2) + tasmota.log(string.format("MTR: New_Session(%6i) from '[%s]:%i'", session.__future_local_session_id, msg.remote_ip, msg.remote_port), 3) # prepare response var pbkdfparamresp = matter.PBKDFParamResponse() @@ -159,11 +159,13 @@ class Matter_Commisioning_Context def parse_Pake1(msg) import crypto + import string + var session = msg.session # sanity checks if msg.opcode != 0x22 || msg.local_session_id != 0 || msg.protocol_id != 0 - tasmota.log("MTR: invalid Pake1 message", 2) - tasmota.log("MTR: StatusReport(General Code: FAILURE, ProtocolId: SECURE_CHANNEL, ProtocolCode: INVALID_PARAMETER)", 2) + tasmota.log("MTR: invalid Pake1 message", 3) + tasmota.log("MTR: StatusReport(General Code: FAILURE, ProtocolId: SECURE_CHANNEL, ProtocolCode: INVALID_PARAMETER)", 3) self.send_status_report(msg, 0x01, 0x0000, 0x0002, false) return false end @@ -236,6 +238,9 @@ class Matter_Commisioning_Context var resp = msg.build_response(0x23 #-pake-2-#, true) # no reliable flag var raw = resp.encode_frame(pake2_raw) + # log the fact that a new commissioning is starting + tasmota.log(string.format("MTR: New Commissioning (PASE id=%i) from [%s]:%i", session.__future_local_session_id, session._ip, session._port)) + self.responder.send_response_frame(resp) return true end @@ -245,8 +250,8 @@ class Matter_Commisioning_Context var session = msg.session # sanity checks if msg.opcode != 0x24 || msg.local_session_id != 0 || msg.protocol_id != 0 - tasmota.log("MTR: invalid Pake3 message", 2) - tasmota.log("MTR: StatusReport(General Code: FAILURE, ProtocolId: SECURE_CHANNEL, ProtocolCode: INVALID_PARAMETER)", 2) + tasmota.log("MTR: invalid Pake3 message", 3) + tasmota.log("MTR: StatusReport(General Code: FAILURE, ProtocolId: SECURE_CHANNEL, ProtocolCode: INVALID_PARAMETER)", 3) self.send_status_report(msg, 0x01, 0x0000, 0x0002, false) return false end @@ -257,8 +262,8 @@ class Matter_Commisioning_Context # check the value against computed if cA != session.__spake_cA - tasmota.log("MTR: invalid cA received", 2) - tasmota.log("MTR: StatusReport(General Code: FAILURE, ProtocolId: SECURE_CHANNEL, ProtocolCode: INVALID_PARAMETER)", 2) + tasmota.log("MTR: invalid cA received", 3) + tasmota.log("MTR: StatusReport(General Code: FAILURE, ProtocolId: SECURE_CHANNEL, ProtocolCode: INVALID_PARAMETER)", 3) self.send_status_report(msg, 0x01, 0x0000, 0x0002, false) return false end @@ -288,18 +293,18 @@ class Matter_Commisioning_Context import crypto # Validate Sigma1 Destination ID, p.162 # traverse all existing fabrics - tasmota.log("MTR: SEARCHING: destinationId=" + destinationId.tohex(), 3) + tasmota.log("MTR: SEARCHING: destinationId=" + destinationId.tohex(), 4) for fabric : self.device.sessions.fabrics if fabric.noc == nil || fabric.fabric_id == nil || fabric.device_id == nil continue end # compute candidateDestinationId, Section 4.13.2.4.1, “Destination Identifier” var destinationMessage = initiatorRandom + fabric.get_ca_pub() + fabric.fabric_id + fabric.device_id var key = fabric.get_ipk_group_key() - tasmota.log("MTR: SIGMA1: destinationMessage=" + destinationMessage.tohex(), 3) - tasmota.log("MTR: SIGMA1: key_ipk=" + key.tohex(), 4) + tasmota.log("MTR: SIGMA1: destinationMessage=" + destinationMessage.tohex(), 4) + # tasmota.log("MTR: SIGMA1: key_ipk=" + key.tohex(), 4) var h = crypto.HMAC_SHA256(key) h.update(destinationMessage) var candidateDestinationId = h.out() - tasmota.log("MTR: SIGMA1: candidateDestinationId=" + candidateDestinationId.tohex(), 3) + tasmota.log("MTR: SIGMA1: candidateDestinationId=" + candidateDestinationId.tohex(), 4) if candidateDestinationId == destinationId return fabric end @@ -318,19 +323,19 @@ class Matter_Commisioning_Context var session = msg.session # sanity checks if msg.opcode != 0x30 || msg.local_session_id != 0 || msg.protocol_id != 0 - # tasmota.log("MTR: invalid Sigma1 message", 2) - tasmota.log("MTR: StatusReport(General Code: FAILURE, ProtocolId: SECURE_CHANNEL, ProtocolCode: INVALID_PARAMETER)", 2) + # tasmota.log("MTR: invalid Sigma1 message", 3) + tasmota.log("MTR: StatusReport(General Code: FAILURE, ProtocolId: SECURE_CHANNEL, ProtocolCode: INVALID_PARAMETER)", 3) self.send_status_report(msg, 0x01, 0x0000, 0x0002, false) return false end var sigma1 = matter.Sigma1().parse(msg.raw, msg.app_payload_idx) - tasmota.log(string.format("MTR: sigma1=%s", matter.inspect(sigma1)), 4) + # tasmota.log(string.format("MTR: sigma1=%s", matter.inspect(sigma1)), 4) session.__initiator_pub = sigma1.initiatorEphPubKey # find session var is_resumption = (sigma1.resumptionID != nil && sigma1.initiatorResumeMIC != nil) - tasmota.log(string.format("MTR: is_resumption=%i", is_resumption ? 1 : 0), 4) + # tasmota.log(string.format("MTR: is_resumption=%i", is_resumption ? 1 : 0), 4) # TODO disable resumption until fixed is_resumption = false @@ -338,7 +343,7 @@ class Matter_Commisioning_Context var session_resumption if is_resumption session_resumption = self.device.sessions.find_session_by_resumption_id(sigma1.resumptionID) - tasmota.log(string.format("MTR: session_resumption found session=%s session_resumption=%s", matter.inspect(session), matter.inspect(session_resumption)), 4) + # tasmota.log(string.format("MTR: session_resumption found session=%s session_resumption=%s", matter.inspect(session), matter.inspect(session_resumption)), 4) if session_resumption == nil || session_resumption._fabric == nil is_resumption = false end @@ -370,7 +375,7 @@ class Matter_Commisioning_Context session.set_mode_CASE() session.__future_initiator_session_id = sigma1.initiator_session_id # update initiator_session_id session.__future_local_session_id = self.device.sessions.gen_local_session_id() - tasmota.log(string.format("MTR: +Session (%6i) from '[%s]:%i'", session.__future_local_session_id, msg.remote_ip, msg.remote_port), 2) + tasmota.log(string.format("MTR: New_Session(%6i) from '[%s]:%i'", session.__future_local_session_id, msg.remote_ip, msg.remote_port), 3) # Generate and Send Sigma2_Resume session.shared_secret = session_resumption.shared_secret @@ -449,7 +454,7 @@ class Matter_Commisioning_Context session._fabric = fabric if session == nil || session._fabric == nil - tasmota.log("MTR: StatusReport(GeneralCode: FAILURE, ProtocolId: SECURE_CHANNEL, ProtocolCode: NO_SHARED_TRUST_ROOTS)", 2) + tasmota.log("MTR: StatusReport(GeneralCode: FAILURE, ProtocolId: SECURE_CHANNEL, ProtocolCode: NO_SHARED_TRUST_ROOTS)", 3) self.send_status_report(msg, 0x01, 0x0000, 0x0001, false) return false end @@ -458,26 +463,26 @@ class Matter_Commisioning_Context session.__future_initiator_session_id = sigma1.initiator_session_id # update initiator_session_id session.__future_local_session_id = self.device.sessions.gen_local_session_id() - tasmota.log(string.format("MTR: +Session (%6i) from '[%s]:%i'", session.__future_local_session_id, msg.remote_ip, msg.remote_port), 2) + tasmota.log(string.format("MTR: New_Session(%6i) from '[%s]:%i'", session.__future_local_session_id, msg.remote_ip, msg.remote_port), 3) - tasmota.log("MTR: fabric="+matter.inspect(session._fabric), 4) - tasmota.log("MTR: no_private_key="+session.get_pk().tohex(), 4) - tasmota.log("MTR: noc ="+session.get_noc().tohex(), 4) - if fabric.get_icac() - tasmota.log("MTR: icac ="+fabric.get_icac().tohex(), 4) - end - tasmota.log("MTR: root_ca_cert ="+fabric.get_ca().tohex(), 4) + # tasmota.log("MTR: fabric="+matter.inspect(session._fabric), 4) + # tasmota.log("MTR: no_private_key="+session.get_pk().tohex(), 4) + # tasmota.log("MTR: noc ="+session.get_noc().tohex(), 4) + # if fabric.get_icac() + # tasmota.log("MTR: icac ="+fabric.get_icac().tohex(), 4) + # end + # tasmota.log("MTR: root_ca_cert ="+fabric.get_ca().tohex(), 4) # Compute Sigma2, p.162 session.resumption_id = crypto.random(16) # generate a new resumption id session.__responder_priv = crypto.random(32) session.__responder_pub = crypto.EC_P256().public_key(session.__responder_priv) - tasmota.log("MTR: ResponderEph_priv ="+session.__responder_priv.tohex(), 4) - tasmota.log("MTR: ResponderEph_pub ="+session.__responder_pub.tohex(), 4) + # tasmota.log("MTR: ResponderEph_priv ="+session.__responder_priv.tohex(), 4) + # tasmota.log("MTR: ResponderEph_pub ="+session.__responder_pub.tohex(), 4) var responderRandom = crypto.random(32) session.shared_secret = crypto.EC_P256().shared_key(session.__responder_priv, sigma1.initiatorEphPubKey) - tasmota.log("MTR: * shared_secret = " + session.shared_secret.tohex(), 4) + # tasmota.log("MTR: * shared_secret = " + session.shared_secret.tohex(), 4) var sigma2_tbsdata = matter.TLV.Matter_TLV_struct() sigma2_tbsdata.add_TLV(1, matter.TLV.B2, fabric.get_noc()) @@ -486,10 +491,10 @@ class Matter_Commisioning_Context sigma2_tbsdata.add_TLV(4, matter.TLV.B2, sigma1.initiatorEphPubKey) var TBSData2Signature = crypto.EC_P256().ecdsa_sign_sha256(fabric.get_pk(), sigma2_tbsdata.tlv2raw()) - tasmota.log("****************************************", 4) - tasmota.log("MTR: * fabric.get_pk = " + str(fabric.get_pk()), 4) - tasmota.log("MTR: * sigma2_tbsdata = " + str(sigma2_tbsdata), 4) - tasmota.log("MTR: * TBSData2Signature = " + TBSData2Signature.tohex(), 4) + # tasmota.log("****************************************", 4) + # tasmota.log("MTR: * fabric.get_pk = " + str(fabric.get_pk()), 4) + # tasmota.log("MTR: * sigma2_tbsdata = " + str(sigma2_tbsdata), 4) + # tasmota.log("MTR: * TBSData2Signature = " + TBSData2Signature.tohex(), 4) var sigma2_tbedata = matter.TLV.Matter_TLV_struct() sigma2_tbedata.add_TLV(1, matter.TLV.B2, fabric.get_noc()) @@ -498,37 +503,37 @@ class Matter_Commisioning_Context sigma2_tbedata.add_TLV(4, matter.TLV.B2, session.resumption_id) # compute TranscriptHash = Crypto_Hash(message = Msg1) - tasmota.log("****************************************", 4) + # tasmota.log("****************************************", 4) session.__Msg1 = sigma1.Msg1 - tasmota.log("MTR: * resumptionid = " + session.resumption_id.tohex(), 4) - tasmota.log("MTR: * MSG1 = " + session.__Msg1.tohex(), 4) + # tasmota.log("MTR: * resumptionid = " + session.resumption_id.tohex(), 4) + # tasmota.log("MTR: * MSG1 = " + session.__Msg1.tohex(), 4) var TranscriptHash = crypto.SHA256().update(session.__Msg1).out() - tasmota.log("MTR: TranscriptHash =" + TranscriptHash.tohex(), 4) + # tasmota.log("MTR: TranscriptHash =" + TranscriptHash.tohex(), 4) # Compute S2K, p.175 var s2k_info = bytes().fromstring(self.S2K_Info) var s2k_salt = fabric.get_ipk_group_key() + responderRandom + session.__responder_pub + TranscriptHash var s2k = crypto.HKDF_SHA256().derive(session.shared_secret, s2k_salt, s2k_info, 16) - tasmota.log("MTR: * SharedSecret = " + session.shared_secret.tohex(), 4) - tasmota.log("MTR: * s2k_salt = " + s2k_salt.tohex(), 4) - tasmota.log("MTR: * s2k = " + s2k.tohex(), 4) + # tasmota.log("MTR: * SharedSecret = " + session.shared_secret.tohex(), 4) + # tasmota.log("MTR: * s2k_salt = " + s2k_salt.tohex(), 4) + # tasmota.log("MTR: * s2k = " + s2k.tohex(), 4) var sigma2_tbedata_raw = sigma2_tbedata.tlv2raw() - tasmota.log("MTR: * TBEData2Raw = " + sigma2_tbedata_raw.tohex(), 4) + # tasmota.log("MTR: * TBEData2Raw = " + sigma2_tbedata_raw.tohex(), 4) # // `AES_CCM.init(secret_key:bytes(16 or 32), iv:bytes(7..13), aad:bytes(), data_len:int, tag_len:int) -> instance` var aes = crypto.AES_CCM(s2k, bytes().fromstring(self.TBEData2_Nonce), bytes(), size(sigma2_tbedata_raw), 16) var TBEData2Encrypted = aes.encrypt(sigma2_tbedata_raw) + aes.tag() - tasmota.log("MTR: * TBEData2Enc = " + TBEData2Encrypted.tohex(), 4) - tasmota.log("****************************************", 4) + # tasmota.log("MTR: * TBEData2Enc = " + TBEData2Encrypted.tohex(), 4) + # tasmota.log("****************************************", 4) var sigma2 = matter.Sigma2() sigma2.responderRandom = responderRandom sigma2.responderSessionId = session.__future_local_session_id sigma2.responderEphPubKey = session.__responder_pub sigma2.encrypted2 = TBEData2Encrypted - tasmota.log("MTR: sigma2: " + matter.inspect(sigma2), 4) + # tasmota.log("MTR: sigma2: " + matter.inspect(sigma2), 4) var sigma2_raw = sigma2.tlv2raw() session.__Msg2 = sigma2_raw # tasmota.log("MTR: sigma2_raw: " + sigma2_raw.tohex(), 4) @@ -537,6 +542,9 @@ class Matter_Commisioning_Context var resp = msg.build_response(0x31 #-sigma-2-#, true) # no reliable flag var raw = resp.encode_frame(sigma2_raw) + # log the fact that a new connection is starting + tasmota.log(string.format("MTR: New Connection (CASE id=%i) from [%s]:%i", session.__future_local_session_id, session._ip, session._port)) + self.responder.send_response_frame(resp) return true end @@ -548,7 +556,7 @@ class Matter_Commisioning_Context import crypto # sanity checks if msg.opcode != 0x32 || msg.local_session_id != 0 || msg.protocol_id != 0 - tasmota.log("MTR: StatusReport(General Code: FAILURE, ProtocolId: SECURE_CHANNEL, ProtocolCode: INVALID_PARAMETER)", 2) + tasmota.log("MTR: StatusReport(General Code: FAILURE, ProtocolId: SECURE_CHANNEL, ProtocolCode: INVALID_PARAMETER)", 3) self.send_status_report(msg, 0x01, 0x0000, 0x0002, false) return false end @@ -584,8 +592,8 @@ class Matter_Commisioning_Context # tasmota.log("****************************************", 4) if TBETag3 != tag - tasmota.log("MTR: Tag don't match", 2) - tasmota.log("MTR: StatusReport(General Code: FAILURE, ProtocolId: SECURE_CHANNEL, ProtocolCode: INVALID_PARAMETER)", 2) + tasmota.log("MTR: Tag don't match", 3) + tasmota.log("MTR: StatusReport(General Code: FAILURE, ProtocolId: SECURE_CHANNEL, ProtocolCode: INVALID_PARAMETER)", 3) self.send_status_report(msg, 0x01, 0x0000, 0x0002, false) return false end @@ -601,12 +609,12 @@ class Matter_Commisioning_Context # Success = Crypto_VerifyChain(certificates = [TBEData3.initiatorNOC, TBEData3.initiatorICAC, TrustedRCAC]), when TBEData3.initiatorICAC is present # TODO var initiatorNOCTLV = matter.TLV.parse(initiatorNOC) - tasmota.log("MTR: initiatorNOCTLV = " + str(initiatorNOCTLV), 3) + # tasmota.log("MTR: initiatorNOCTLV = " + str(initiatorNOCTLV), 4) var initiatorNOCPubKey = initiatorNOCTLV.findsubval(9) var initiatorNOCListDN = initiatorNOCTLV.findsub(6) var initiatorFabricId = initiatorNOCListDN.findsubval(17) if type(initiatorFabricId) == 'int' session.peer_node_id = int64.fromu32(initiatorFabricId).tobytes() else session.peer_node_id = initiatorFabricId.tobytes() end - tasmota.log("MTR: initiatorFabricId="+str(session.peer_node_id), 3) + # tasmota.log("MTR: initiatorFabricId="+str(session.peer_node_id), 4) var sigma3_tbs = matter.TLV.Matter_TLV_struct() sigma3_tbs.add_TLV(1, matter.TLV.B1, initiatorNOC) @@ -684,7 +692,7 @@ class Matter_Commisioning_Context # placeholder, nothing to run for now def parse_StatusReport(msg) var session = msg.session - tasmota.log("MTR: >Status "+msg.raw[msg.app_payload_idx..].tohex(), 2) + tasmota.log("MTR: >Status "+msg.raw[msg.app_payload_idx..].tohex(), 3) return false # we don't explicitly ack the message end diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Control_Message.be b/lib/libesp32/berry_matter/src/embedded/Matter_Control_Message.be index d2d3192ba..df9edf361 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Control_Message.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Control_Message.be @@ -39,7 +39,7 @@ class Matter_Control_Message def process_incoming_control_message(msg) - tasmota.log("MTR: received control message " + matter.inspect(msg), 2) + tasmota.log("MTR: received control message " + matter.inspect(msg), 3) if msg.opcode == 0x00 return self.parse_MsgCounterSyncReq(msg) elif msg.opcode == 0x01 diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Device.be b/lib/libesp32/berry_matter/src/embedded/Matter_Device.be index f4db53a39..26c889135 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Device.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Device.be @@ -159,7 +159,7 @@ class Matter_Device # show Manual pairing code in logs var pairing_code = self.compute_manual_pairing_code() - tasmota.log(string.format("MTR: Manual pairing code: %s-%s-%s", pairing_code[0..3], pairing_code[4..6], pairing_code[7..]), 2) + tasmota.log(string.format("MTR: Manual pairing code: %s", pairing_code), 2) # output MQTT var qr_code = self.compute_qrcode_content() @@ -178,6 +178,7 @@ class Matter_Device for fabric_index : sub_fabrics var fabric = self.sessions.find_fabric_by_index(fabric_index) if fabric != nil + tasmota.log("MTR: removing fabric " + fabric.get_fabric_id().copy().reverse().tohex(), 2) self.message_handler.im.subs_shop.remove_by_fabric(fabric) self.mdns_remove_op_discovery(fabric) self.sessions.remove_fabric(fabric) @@ -379,7 +380,7 @@ class Matter_Device def _start_udp(port) if self.udp_server return end # already started if port == nil port = 5540 end - tasmota.log("MTR: starting UDP server on port: " + str(port), 2) + tasmota.log("MTR: Starting UDP server on port: " + str(port), 2) self.udp_server = matter.UDPServer("", port) self.udp_server.start(/ raw, addr, port -> self.msg_received(raw, addr, port)) end @@ -426,7 +427,11 @@ class Matter_Device # # Stop basic commissioning. def start_commissioning_complete(session) - tasmota.log("MTR: *** Commissioning complete ***", 2) + import string + var fabric = session.get_fabric() + var fabric_id = fabric.get_fabric_id().copy().reverse().tohex() + var vendor_name = fabric.get_admin_vendor_name() + tasmota.log(string.format("MTR: --- Commissioning complete for Fabric '%s' (Vendor %s) ---", fabric_id, vendor_name), 2) self.stop_basic_commissioning() # by default close commissioning when it's complete end @@ -567,7 +572,7 @@ class Matter_Device for cl: keys_sorted(all[ep]) for at: keys_sorted(all[ep][cl]) for pi: all[ep][cl][at] - tasmota.log(string.format("MTR: expansion [%02X]%04X/%04X", ep, cl, at), 3) + # tasmota.log(string.format("MTR: expansion [%02X]%04X/%04X", ep, cl, at), 3) ctx.endpoint = ep ctx.cluster = cl ctx.attribute = at @@ -637,7 +642,7 @@ class Matter_Device var f = open(self.FILENAME, "w") f.write(j) f.close() - tasmota.log(string.format("MTR: =Saved parameters%s", self.plugins_persist ? " and configuration" : ""), 2) + tasmota.log(string.format("MTR: =Saved parameters%s", self.plugins_persist ? " and configuration" : ""), 3) return j except .. as e, m tasmota.log("MTR: Session_Store::save Exception:" + str(e) + "|" + str(m), 2) @@ -686,6 +691,18 @@ class Matter_Device if dirty self.save_param() end end + ############################################################# + # Convert a configuration to a log string + static def conf_to_log(plugin_conf) + import string + var param_log = '' + for k:_class.k2l(plugin_conf) + if k == 'type' continue end + param_log += string.format(" %s = %s", k, plugin_conf[k]) + end + return param_log + end + ############################################################# # Load plugins configuration from json # @@ -696,21 +713,21 @@ class Matter_Device import string var endpoints = self.k2l_num(config) - tasmota.log("MTR: endpoints to be configured "+str(endpoints), 3) + # tasmota.log("MTR: endpoints to be configured "+str(endpoints), 4) + tasmota.log("MTR: Configuring endpoints", 2) # start with mandatory endpoint 0 for root node self.plugins.push(matter.Plugin_Root(self, 0, {})) - tasmota.log(string.format("MTR: endpoint:%i type:%s%s", 0, 'root', ''), 2) + tasmota.log(string.format("MTR: endpoint = %5i type = %s%s", 0, 'root', ''), 2) # always include an aggregator for dynamic endpoints self.plugins.push(matter.Plugin_Aggregator(self, 0xFF00, {})) - tasmota.log(string.format("MTR: endpoint:%i type:%s%s", 0xFF00, 'aggregator', ''), 2) for ep: endpoints if ep == 0 continue end # skip endpoint 0 try var plugin_conf = config[str(ep)] - tasmota.log(string.format("MTR: endpoint %i config %s", ep, plugin_conf), 3) + # tasmota.log(string.format("MTR: endpoint %i config %s", ep, plugin_conf), 3) var pi_class_name = plugin_conf.find('type') if pi_class_name == nil tasmota.log("MTR: no class name, skipping", 3) continue end @@ -721,16 +738,12 @@ class Matter_Device var pi = pi_class(self, ep, plugin_conf) self.plugins.push(pi) - var param_log = '' - for k:self.k2l(plugin_conf) - if k == 'type' continue end - param_log += string.format(" %s:%s", k, plugin_conf[k]) - end - tasmota.log(string.format("MTR: endpoint:%i type:%s%s", ep, pi_class_name, param_log), 2) + tasmota.log(string.format("MTR: endpoint = %5i type = %s%s", ep, pi_class_name, self.conf_to_log(plugin_conf)), 2) except .. as e, m tasmota.log("MTR: Exception" + str(e) + "|" + str(m), 2) end end + tasmota.log(string.format("MTR: endpoint = %5i type = %s%s", 0xFF00, 'aggregator', ''), 2) tasmota.publish_result('{"Matter":{"Initialized":1}}', 'Matter') end @@ -800,7 +813,7 @@ class Matter_Device var eth = tasmota.eth() self.hostname_eth = string.replace(eth.find("mac"), ':', '') if !self.ipv4only - tasmota.log(string.format("MTR: calling mdns.add_hostname(%s, %s, %s)", self.hostname_eth, eth.find('ip6local',''), eth.find('ip','')), 3) + # tasmota.log(string.format("MTR: calling mdns.add_hostname(%s, %s, %s)", self.hostname_eth, eth.find('ip6local',''), eth.find('ip','')), 4) mdns.add_hostname(self.hostname_eth, eth.find('ip6local',''), eth.find('ip',''), eth.find('ip6','')) else tasmota.log(string.format("MTR: calling mdns.add_hostname(%s, %s)", self.hostname_eth, eth.find('ip','')), 3) @@ -810,14 +823,14 @@ class Matter_Device var wifi = tasmota.wifi() self.hostname_wifi = string.replace(wifi.find("mac"), ':', '') if !self.ipv4only - tasmota.log(string.format("MTR: calling mdns.add_hostname(%s, %s, %s)", self.hostname_wifi, wifi.find('ip6local',''), wifi.find('ip','')), 3) + # tasmota.log(string.format("MTR: calling mdns.add_hostname(%s, %s, %s)", self.hostname_wifi, wifi.find('ip6local',''), wifi.find('ip','')), 4) mdns.add_hostname(self.hostname_wifi, wifi.find('ip6local',''), wifi.find('ip',''), wifi.find('ip6','')) else tasmota.log(string.format("MTR: calling mdns.add_hostname(%s, %s)", self.hostname_eth, wifi.find('ip','')), 3) mdns.add_hostname(self.hostname_wifi, wifi.find('ip','')) end end - tasmota.log(string.format("MTR: start mDNS on %s host '%s.local'", is_eth ? "eth" : "wifi", is_eth ? self.hostname_eth : self.hostname_wifi), 2) + tasmota.log(string.format("MTR: start mDNS on %s host '%s.local'", is_eth ? "eth" : "wifi", is_eth ? self.hostname_eth : self.hostname_wifi), 3) except .. as e, m tasmota.log("MTR: Exception" + str(e) + "|" + str(m), 2) end @@ -846,7 +859,7 @@ class Matter_Device try if self.hostname_eth # Add Matter `_matterc._udp` service - tasmota.log(string.format("MTR: calling mdns.add_service(%s, %s, %i, %s, %s, %s)", "_matterc", "_udp", 5540, str(services), self.commissioning_instance_eth, self.hostname_eth), 3) + # tasmota.log(string.format("MTR: calling mdns.add_service(%s, %s, %i, %s, %s, %s)", "_matterc", "_udp", 5540, str(services), self.commissioning_instance_eth, self.hostname_eth), 4) mdns.add_service("_matterc", "_udp", 5540, services, self.commissioning_instance_eth, self.hostname_eth) self.mdns_pase_eth = true @@ -854,38 +867,38 @@ class Matter_Device # `mdns.add_subtype(service:string, proto:string, instance:string, hostname:string, subtype:string) -> nil` var subtype = "_L" + str(self.commissioning_discriminator & 0xFFF) - tasmota.log("MTR: adding subtype: "+subtype, 2) + tasmota.log("MTR: adding subtype: "+subtype, 3) mdns.add_subtype("_matterc", "_udp", self.commissioning_instance_eth, self.hostname_eth, subtype) subtype = "_S" + str((self.commissioning_discriminator & 0xF00) >> 8) - tasmota.log("MTR: adding subtype: "+subtype, 2) + tasmota.log("MTR: adding subtype: "+subtype, 3) mdns.add_subtype("_matterc", "_udp", self.commissioning_instance_eth, self.hostname_eth, subtype) subtype = "_V" + str(self.vendorid) - tasmota.log("MTR: adding subtype: "+subtype, 2) + tasmota.log("MTR: adding subtype: "+subtype, 3) mdns.add_subtype("_matterc", "_udp", self.commissioning_instance_eth, self.hostname_eth, subtype) subtype = "_CM1" - tasmota.log("MTR: adding subtype: "+subtype, 2) + tasmota.log("MTR: adding subtype: "+subtype, 3) mdns.add_subtype("_matterc", "_udp", self.commissioning_instance_eth, self.hostname_eth, subtype) end if self.hostname_wifi - tasmota.log(string.format("MTR: calling mdns.add_service(%s, %s, %i, %s, %s, %s)", "_matterc", "_udp", 5540, str(services), self.commissioning_instance_wifi, self.hostname_wifi), 3) + # tasmota.log(string.format("MTR: calling mdns.add_service(%s, %s, %i, %s, %s, %s)", "_matterc", "_udp", 5540, str(services), self.commissioning_instance_wifi, self.hostname_wifi), 4) mdns.add_service("_matterc", "_udp", 5540, services, self.commissioning_instance_wifi, self.hostname_wifi) self.mdns_pase_wifi = true - tasmota.log(string.format("MTR: starting mDNS on %s '%s' ptr to `%s.local`", "wifi", self.commissioning_instance_wifi, self.hostname_wifi), 2) + tasmota.log(string.format("MTR: starting mDNS on %s '%s' ptr to `%s.local`", "wifi", self.commissioning_instance_wifi, self.hostname_wifi), 3) # `mdns.add_subtype(service:string, proto:string, instance:string, hostname:string, subtype:string) -> nil` var subtype = "_L" + str(self.commissioning_discriminator & 0xFFF) - tasmota.log("MTR: adding subtype: "+subtype, 2) + tasmota.log("MTR: adding subtype: "+subtype, 3) mdns.add_subtype("_matterc", "_udp", self.commissioning_instance_wifi, self.hostname_wifi, subtype) subtype = "_S" + str((self.commissioning_discriminator & 0xF00) >> 8) - tasmota.log("MTR: adding subtype: "+subtype, 2) + tasmota.log("MTR: adding subtype: "+subtype, 3) mdns.add_subtype("_matterc", "_udp", self.commissioning_instance_wifi, self.hostname_wifi, subtype) subtype = "_V" + str(self.vendorid) - tasmota.log("MTR: adding subtype: "+subtype, 2) + tasmota.log("MTR: adding subtype: "+subtype, 3) mdns.add_subtype("_matterc", "_udp", self.commissioning_instance_wifi, self.hostname_wifi, subtype) subtype = "_CM1" - tasmota.log("MTR: adding subtype: "+subtype, 2) + tasmota.log("MTR: adding subtype: "+subtype, 3) mdns.add_subtype("_matterc", "_udp", self.commissioning_instance_wifi, self.hostname_wifi, subtype) end except .. as e, m @@ -903,13 +916,13 @@ class Matter_Device try if self.mdns_pase_eth tasmota.log(string.format("MTR: calling mdns.remove_service(%s, %s, %s, %s)", "_matterc", "_udp", self.commissioning_instance_eth, self.hostname_eth), 3) - tasmota.log(string.format("MTR: remove mDNS on %s '%s'", "eth", self.commissioning_instance_eth), 2) + tasmota.log(string.format("MTR: remove mDNS on %s '%s'", "eth", self.commissioning_instance_eth), 3) self.mdns_pase_eth = false mdns.remove_service("_matterc", "_udp", self.commissioning_instance_eth, self.hostname_eth) end if self.mdns_pase_wifi tasmota.log(string.format("MTR: calling mdns.remove_service(%s, %s, %s, %s)", "_matterc", "_udp", self.commissioning_instance_wifi, self.hostname_wifi), 3) - tasmota.log(string.format("MTR: remove mDNS on %s '%s'", "wifi", self.commissioning_instance_wifi), 2) + tasmota.log(string.format("MTR: remove mDNS on %s '%s'", "wifi", self.commissioning_instance_wifi), 3) self.mdns_pase_wifi = false mdns.remove_service("_matterc", "_udp", self.commissioning_instance_wifi, self.hostname_wifi) end @@ -937,7 +950,7 @@ class Matter_Device var device_id = fabric.get_device_id().copy().reverse() var k_fabric = fabric.get_fabric_compressed() var op_node = k_fabric.tohex() + "-" + device_id.tohex() - tasmota.log("MTR: Operational Discovery node = " + op_node, 2) + tasmota.log("MTR: Operational Discovery node = " + op_node, 3) # mdns if (tasmota.eth().find("up")) @@ -981,11 +994,11 @@ class Matter_Device # mdns if (tasmota.eth().find("up")) - tasmota.log(string.format("MTR: remove mDNS on %s '%s'", "eth", op_node), 2) + tasmota.log(string.format("MTR: remove mDNS on %s '%s'", "eth", op_node), 3) mdns.remove_service("_matter", "_tcp", op_node, self.hostname_eth) end if (tasmota.wifi().find("up")) - tasmota.log(string.format("MTR: remove mDNS on %s '%s'", "wifi", op_node), 2) + tasmota.log(string.format("MTR: remove mDNS on %s '%s'", "wifi", op_node), 3) mdns.remove_service("_matter", "_tcp", op_node, self.hostname_wifi) end except .. as e, m @@ -1228,8 +1241,9 @@ class Matter_Device # `plugin_conf`: map of configuration as native Berry map # returns endpoint number newly allocated, or `nil` if failed def bridge_add_endpoint(pi_class_name, plugin_conf) + import string var pi_class = self.plugins_classes.find(pi_class_name) - if pi_class == nil tasmota.log("MTR: unknown class name '"+str(pi_class_name)+"' skipping", 2) return end + if pi_class == nil tasmota.log("MTR: unknown class name '"+str(pi_class_name)+"' skipping", 3) return end # get the next allocated endpoint number var ep = self.next_ep @@ -1246,6 +1260,7 @@ class Matter_Device pi_conf[k] = plugin_conf[k] end # add to main + tasmota.log(string.format("MTR: adding endpoint = %i type = %s%s", ep, pi_class_name, self.conf_to_log(plugin_conf)), 2) self.plugins_config[ep_str] = pi_conf self.plugins_persist = true self.next_ep += 1 # increment next allocated endpoint before saving @@ -1272,6 +1287,7 @@ class Matter_Device tasmota.log("MTR: Cannot remove an enpoint not configured: " + ep_str, 3) return end + tasmota.log(string.format("MTR: deleting endpoint = %i", ep), 2) self.plugins_config.remove(ep_str) self.plugins_persist = true @@ -1373,29 +1389,31 @@ class Matter_Device import introspect import string - var remotes_map = {} # key: remote object, value: count of references - # init all remotes with count 0 - for http_remote: self.http_remotes - remotes_map[http_remote] = 0 - end - - # scan all endpoints - for pi: self.plugins - var http_remote = introspect.get(pi, "http_remote") - if http_remote != nil - remotes_map[http_remote] = remotes_map.find(http_remote, 0) + 1 + if self.http_remotes + var remotes_map = {} # key: remote object, value: count of references + + for http_remote: self.http_remotes + remotes_map[http_remote] = 0 end - end - tasmota.log("MTR: remotes references: " + str(remotes_map)) + # scan all endpoints + for pi: self.plugins + var http_remote = introspect.get(pi, "http_remote") + if http_remote != nil + remotes_map[http_remote] = remotes_map.find(http_remote, 0) + 1 + end + end - for remote:remotes_map.keys() - if remotes_map[remote] == 0 - # remove - tasmota.log("MTR: remove unused remote: " + remote.addr, 3) - remote.close() - self.http_remotes.remove(remote) + # tasmota.log("MTR: remotes references: " + str(remotes_map), 3) + + for remote:remotes_map.keys() + if remotes_map[remote] == 0 + # remove + tasmota.log("MTR: remove unused remote: " + remote.addr, 3) + remote.close() + self.http_remotes.remove(remote) + end end end diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Fabric.be b/lib/libesp32/berry_matter/src/embedded/Matter_Fabric.be index 14f538e24..c37ed7459 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Fabric.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Fabric.be @@ -217,14 +217,14 @@ class Matter_Fabric : Matter_Expirable # Called before removal def log_new_fabric() import string - tasmota.log(string.format("MTR: +Fabric fab='%s' vendorid=%s", self.get_fabric_id().copy().reverse().tohex(), self.get_admin_vendor_name()), 2) + tasmota.log(string.format("MTR: +Fabric fab='%s' vendorid=%s", self.get_fabric_id().copy().reverse().tohex(), self.get_admin_vendor_name()), 3) end ############################################################# # Called before removal def before_remove() import string - tasmota.log(string.format("MTR: -Fabric fab='%s' (removed)", self.get_fabric_id().copy().reverse().tohex()), 2) + tasmota.log(string.format("MTR: -Fabric fab='%s' (removed)", self.get_fabric_id().copy().reverse().tohex()), 3) end ############################################################# diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_HTTP_remote.be b/lib/libesp32/berry_matter/src/embedded/Matter_HTTP_remote.be index 05b16d9b7..5e1d919d0 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_HTTP_remote.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_HTTP_remote.be @@ -142,11 +142,11 @@ class Matter_HTTP_remote : Matter_HTTP_async self.current_cmd = nil var cmd_url = "/cm?cmnd=" + string.tr(cmd, ' ', '+') - tasmota.log(string.format("MTR: HTTP sync request 'http://%s:%i%s'", self.addr, self.port, cmd_url), 2) + tasmota.log(string.format("MTR: HTTP sync request 'http://%s:%i%s'", self.addr, self.port, cmd_url), 3) var ret = super(self).begin_sync(cmd_url, timeout) var payload_short = (ret) ? ret : 'nil' if size(payload_short) > 30 payload_short = payload_short[0..29] + '...' end - tasmota.log(string.format("MTR: HTTP sync-resp in %i ms from %s: [%i] '%s'", tasmota.millis() - self.time_start, self.addr, size(self.payload), payload_short), 2) + tasmota.log(string.format("MTR: HTTP sync-resp in %i ms from %s: [%i] '%s'", tasmota.millis() - self.time_start, self.addr, size(self.payload), payload_short), 3) return ret end @@ -155,7 +155,7 @@ class Matter_HTTP_remote : Matter_HTTP_async import string var payload_short = (self.payload != nil) ? self.payload : 'nil' if size(payload_short) > 30 payload_short = payload_short[0..29] + '...' end - tasmota.log(string.format("MTR: HTTP async-resp in %i ms from %s: [%i] '%s'", tasmota.millis() - self.time_start, self.addr, size(self.payload), payload_short), 2) + tasmota.log(string.format("MTR: HTTP async-resp in %i ms from %s: [%i] '%s'", tasmota.millis() - self.time_start, self.addr, size(self.payload), payload_short), 3) self.dispatch_cb(self.http_status, self.payload) end def event_http_failed() @@ -166,7 +166,7 @@ class Matter_HTTP_remote : Matter_HTTP_async def event_http_timeout() import string if self.current_cmd == nil return end # do nothing if sync request - tasmota.log(string.format("MTR: HTTP timeout http_status=%i phase=%i tcp_status=%i size_payload=%i", self.http_status, self.phase, self.status, size(self.payload)), 2) + tasmota.log(string.format("MTR: HTTP timeout http_status=%i phase=%i tcp_status=%i size_payload=%i", self.http_status, self.phase, self.status, size(self.payload)), 3) self.dispatch_cb(self.http_status, nil) end diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_IM.be b/lib/libesp32/berry_matter/src/embedded/Matter_IM.be index b10be36bd..f6e470d53 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_IM.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_IM.be @@ -86,7 +86,7 @@ class Matter_IM import string # check if there is an exchange_id interested in receiving this var message = self.find_sendqueue_by_exchangeid(msg.exchange_id) - tasmota.log(string.format("MTR: process_incoming_ack exch=%i message=%i", msg.exchange_id, message != nil ? 1 : 0), 3) + # tasmota.log(string.format("MTR: process_incoming_ack exch=%i message=%i", msg.exchange_id, message != nil ? 1 : 0), 4) if message return message.ack_received(msg) # dispatch to IM_Message end @@ -116,7 +116,7 @@ class Matter_IM end if message.finish - tasmota.log("MTR: remove IM message exch="+str(message.resp.exchange_id), 3) + tasmota.log("MTR: remove IM message exch="+str(message.resp.exchange_id), 4) self.send_queue.remove(idx) else idx += 1 @@ -190,7 +190,7 @@ class Matter_IM end else # error - tasmota.log(string.format("MTR: >Status ERROR = 0x%02X", status), 2) + tasmota.log(string.format("MTR: >Status ERROR = 0x%02X", status), 3) if message message.status_error_received(msg) self.remove_sendqueue_by_exchangeid(msg.exchange_id) @@ -242,7 +242,7 @@ class Matter_IM # tasmota.log(string.format("MTR: guessed len=%i actual=%i '%s'", a1_len, size(a1_raw), a1_raw.tohex()), 2) if !no_log - tasmota.log(string.format("MTR: >Read_Attr (%6i) %s%s - %s", session.local_session_id, str(ctx), attr_name, res_str), 2) + tasmota.log(string.format("MTR: >Read_Attr (%6i) %s%s - %s", session.local_session_id, str(ctx), attr_name, res_str), 3) end elif ctx.status != nil if direct # we report an error only if a concrete direct read, not with wildcards @@ -260,10 +260,10 @@ class Matter_IM var a1_bytes = bytes(a1_len) # pre-size bytes() to the actual size a1_raw = a1_tlv.tlv2raw(a1_bytes) - tasmota.log(string.format("MTR: >Read_Attr (%6i) %s%s - STATUS: 0x%02X %s", session.local_session_id, str(ctx), attr_name, ctx.status, ctx.status == matter.UNSUPPORTED_ATTRIBUTE ? "UNSUPPORTED_ATTRIBUTE" : ""), 2) + tasmota.log(string.format("MTR: >Read_Attr (%6i) %s%s - STATUS: 0x%02X %s", session.local_session_id, str(ctx), attr_name, ctx.status, ctx.status == matter.UNSUPPORTED_ATTRIBUTE ? "UNSUPPORTED_ATTRIBUTE" : ""), 3) end else - tasmota.log(string.format("MTR: >Read_Attr (%6i) %s%s - IGNORED", session.local_session_id, str(ctx), attr_name), 2) + tasmota.log(string.format("MTR: >Read_Attr (%6i) %s%s - IGNORED", session.local_session_id, str(ctx), attr_name), 3) # ignore if content is nil and status is undefined found = false end @@ -307,9 +307,9 @@ class Matter_IM # we need expansion, log first if ctx.cluster != nil && ctx.attribute != nil var attr_name = matter.get_attribute_name(ctx.cluster, ctx.attribute) - tasmota.log(string.format("MTR: >Read_Attr (%6i) %s", session.local_session_id, str(ctx) + (attr_name ? " (" + attr_name + ")" : "")), 2) + tasmota.log(string.format("MTR: >Read_Attr (%6i) %s", session.local_session_id, str(ctx) + (attr_name ? " (" + attr_name + ")" : "")), 3) else - tasmota.log(string.format("MTR: >Read_Attr (%6i) %s", session.local_session_id, str(ctx)), 2) + tasmota.log(string.format("MTR: >Read_Attr (%6i) %s", session.local_session_id, str(ctx)), 3) end end @@ -367,7 +367,7 @@ class Matter_IM attr_req.push(str(ctx)) end tasmota.log(string.format("MTR: >Subscribe (%6i) %s (min=%i, max=%i, keep=%i) sub=%i", - msg.session.local_session_id, attr_req.concat(" "), sub.min_interval, sub.max_interval, query.keep_subscriptions ? 1 : 0, sub.subscription_id), 2) + msg.session.local_session_id, attr_req.concat(" "), sub.min_interval, sub.max_interval, query.keep_subscriptions ? 1 : 0, sub.subscription_id), 3) var ret = self._inner_process_read_request(msg.session, query, true #-no_log-#) # ret is of type `Matter_ReportDataMessage` @@ -405,7 +405,7 @@ class Matter_IM var ctx_str = str(ctx) # keep string before invoking, it is modified by response var res = self.device.invoke_request(msg.session, q.command_fields, ctx) var params_log = (ctx.log != nil) ? "(" + str(ctx.log) + ") " : "" - tasmota.log(string.format("MTR: >Command (%6i) %s %s %s", msg.session.local_session_id, ctx_str, cmd_name ? cmd_name : "", params_log), 2) + tasmota.log(string.format("MTR: >Command (%6i) %s %s %s", msg.session.local_session_id, ctx_str, cmd_name ? cmd_name : "", params_log), ctx.endpoint != 0 ? 2 : 3 #- don't log for endpoint 0 -# ) ctx.log = nil var a1 = matter.InvokeResponseIB() if res == true || ctx.status == matter.SUCCESS # special case, just respond ok @@ -417,7 +417,7 @@ class Matter_IM a1.status.status = matter.StatusIB() a1.status.status.status = matter.SUCCESS ret.invoke_responses.push(a1) - tasmota.log(string.format("MTR: Command (%6i) TimedRequest=%i", msg.session.local_session_id, query.timeout), 2) + tasmota.log(string.format("MTR: >Command (%6i) TimedRequest=%i", msg.session.local_session_id, query.timeout), 3) # Send success status report self.send_status(msg, matter.SUCCESS) @@ -637,7 +637,7 @@ class Matter_IM fake_read.attributes_requests.push(p1) end - tasmota.log(string.format("MTR: >>>> send elements after encode") resp.encrypt() # print(">>>>> send elements after encrypt") - tasmota.log(string.format("MTR: 0 data.attribute_reports = next_elemnts - tasmota.log(string.format("MTR: to_be_sent_later size=%i exch=%i", size(data.attribute_reports), resp.exchange_id), 3) + # tasmota.log(string.format("MTR: to_be_sent_later size=%i exch=%i", size(data.attribute_reports), resp.exchange_id), 4) self.ready = false # wait for Status Report before continuing sending # keep alive else @@ -302,7 +302,7 @@ class Matter_IM_ReportDataSubscribed : Matter_IM_ReportData var resp = self.resp.build_standalone_ack(false) resp.encode_frame() resp.encrypt() - tasmota.log(string.format("MTR: Sub_OK (%6i) sub=%i", msg.session.local_session_id, self.sub.subscription_id), 2) + tasmota.log(string.format("MTR: >Sub_OK (%6i) sub=%i", msg.session.local_session_id, self.sub.subscription_id), 3) return super(self).status_ok_received(msg) end diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_IM_Subscription.be b/lib/libesp32/berry_matter/src/embedded/Matter_IM_Subscription.be index 0f526d987..967817c7c 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_IM_Subscription.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_IM_Subscription.be @@ -86,7 +86,7 @@ class Matter_IM_Subscription # remove self from subs_shop list def remove_self() - tasmota.log("MTR: -Sub_Del ( ) sub=" + str(self.subscription_id), 2) + tasmota.log("MTR: -Sub_Del ( ) sub=" + str(self.subscription_id), 3) self.subs_shop.remove_sub(self) end @@ -104,7 +104,7 @@ class Matter_IM_Subscription self.expiration = now + (self.max_interval - self.MAX_INTERVAL_MARGIN) * 1000 self.not_before = now + self.min_interval * 1000 - 1 if !self.is_keep_alive - tasmota.log(string.format("MTR: .Sub_Done ( ) sub=%i", self.subscription_id), 2) + tasmota.log(string.format("MTR: .Sub_Done ( ) sub=%i", self.subscription_id), 3) end end diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Message.be b/lib/libesp32/berry_matter/src/embedded/Matter_Message.be index 39cf74e30..6a83702aa 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Message.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Message.be @@ -302,7 +302,7 @@ class Matter_Frame if resp.local_session_id == 0 var op_name = matter.get_opcode_name(resp.opcode) if !op_name op_name = string.format("0x%02X", resp.opcode) end - tasmota.log(string.format("MTR: Received (%6i) %s rid=%i exch=%i from [%s]:%i", session.local_session_id, op_name, frame.message_counter, frame.exchange_id, addr, port), 2) + tasmota.log(string.format("MTR: >Received (%6i) %s rid=%i exch=%i from [%s]:%i", session.local_session_id, op_name, frame.message_counter, frame.exchange_id, addr, port), 3) else - tasmota.log(string.format("MTR: >rcv Ack (%6i) rid=%i exch=%i ack=%s %sfrom [%s]:%i", session.local_session_id, frame.message_counter, frame.x_flag_r ? "{reliable} " : "", frame.exchange_id, str(frame.ack_message_counter), addr, port), 3) + tasmota.log(string.format("MTR: >rcv Ack (%6i) rid=%i exch=%i ack=%s %sfrom [%s]:%i", session.local_session_id, frame.message_counter, frame.x_flag_r ? "{reliable} " : "", frame.exchange_id, str(frame.ack_message_counter), addr, port), 4) end ret = self.commissioning.process_incoming(frame) # if ret is false, the implicit Ack was not sent @@ -126,11 +126,11 @@ class Matter_MessageHandler else ############################################################# # encrypted message - tasmota.log(string.format("MTR: decode header: local_session_id=%i message_counter=%i", frame.local_session_id, frame.message_counter), 3) + tasmota.log(string.format("MTR: decode header: local_session_id=%i message_counter=%i", frame.local_session_id, frame.message_counter), 4) var session = self.device.sessions.get_session_by_local_session_id(frame.local_session_id) if session == nil - tasmota.log("MTR: unknown local_session_id="+str(frame.local_session_id), 2) + tasmota.log("MTR: unknown local_session_id="+str(frame.local_session_id), 3) # tasmota.log("MTR: frame="+matter.inspect(frame), 3) return false end @@ -141,7 +141,7 @@ class Matter_MessageHandler # check if it's a duplicate if !session.counter_rcv_validate(frame.message_counter, true) - tasmota.log("MTR: . Duplicate encrypted message = " + str(frame.message_counter) + " counter=" + str(session.counter_rcv), 3) + tasmota.log("MTR: . Duplicate encrypted message = " + str(frame.message_counter) + " counter=" + str(session.counter_rcv), 4) self.send_encrypted_ack(frame, false #-not reliable-#) return false end @@ -154,11 +154,11 @@ class Matter_MessageHandler frame.raw .. cleartext # add cleartext # continue decoding - tasmota.log(string.format("MTR: idx=%i clear=%s", frame.payload_idx, frame.raw.tohex()), 4) + # tasmota.log(string.format("MTR: idx=%i clear=%s", frame.payload_idx, frame.raw.tohex()), 4) frame.decode_payload() - tasmota.log("MTR: > Decrypted message: protocol_id:"+str(frame.protocol_id)+" opcode="+str(frame.opcode)+" exchange_id="+str(frame.exchange_id & 0xFFFF), 3) + tasmota.log("MTR: > Decrypted message: protocol_id:"+str(frame.protocol_id)+" opcode="+str(frame.opcode)+" exchange_id="+str(frame.exchange_id & 0xFFFF), 4) - tasmota.log(string.format("MTR: >rcv (%6i) [%02X/%02X] rid=%i exch=%i ack=%s %sfrom [%s]:%i", session.local_session_id, frame.protocol_id, frame.opcode, frame.message_counter, frame.exchange_id, str(frame.ack_message_counter), frame.x_flag_r ? "{reliable} " : "", addr, port), 3) + # tasmota.log(string.format("MTR: >rcv (%6i) [%02X/%02X] rid=%i exch=%i ack=%s %sfrom [%s]:%i", session.local_session_id, frame.protocol_id, frame.opcode, frame.message_counter, frame.exchange_id, str(frame.ack_message_counter), frame.x_flag_r ? "{reliable} " : "", addr, port), 3) self.device.received_ack(frame) # remove acknowledge packet from sending list @@ -202,7 +202,7 @@ class Matter_MessageHandler return ret except .. as e, m - tasmota.log("MTR: MessageHandler::msg_received exception: "+str(e)+";"+str(m)) + tasmota.log("MTR: MessageHandler::msg_received exception: "+str(e)+";"+str(m), 2) if tasmota._debug_present import debug debug.traceback() diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin.be index 4084b1260..92023ec0a 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin.be @@ -30,6 +30,7 @@ class Matter_Plugin static var NAME = "" # display name of the plug-in static var ARG = "" # additional argument name (or empty if none) static var ARG_TYPE = / x -> str(x) # function to convert argument to the right type + static var ARG_HINT = "_Not used_" # Hint for entering the Argument (inside 'placeholder') # Behavior of the plugin, frequency at which `update_shadow()` is called static var UPDATE_TIME = 5000 # default is every 5 seconds var update_next # next timestamp for update diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Light0.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Light0.be index 3b692d6b9..dde2e8435 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Light0.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Light0.be @@ -30,6 +30,7 @@ class Matter_Plugin_Bridge_Light0 : Matter_Plugin_Bridge_HTTP static var TYPE = "http_light0" # name of the plug-in in json static var NAME = "Light 0 On" # display name of the plug-in static var ARG = "relay" # additional argument name (or empty if none) + static var ARG_HINT = "Enter Power number" static var ARG_TYPE = / x -> int(x) # function to convert argument to the right type # static var UPDATE_TIME = 3000 # update every 3s # static var UPDATE_CMD = "Status 11" # command to send for updates diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_OnOff.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_OnOff.be index 8d8832bae..3baaada45 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_OnOff.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_OnOff.be @@ -29,6 +29,7 @@ class Matter_Plugin_Bridge_Light0 end class Matter_Plugin_Bridge_OnOff : Matter_Plugin_Bridge_Light0 static var TYPE = "http_relay" # name of the plug-in in json static var NAME = "Relay" # display name of the plug-in + static var ARG_HINT = "Enter Relay number" static var TYPES = { 0x010A: 2 } # On/Off Plug-in Unit ############################################################# diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Sensor.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Sensor.be index e2e0a191a..efb70b964 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Sensor.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Sensor.be @@ -31,6 +31,7 @@ class Matter_Plugin_Bridge_Sensor : Matter_Plugin_Bridge_HTTP # static var NAME = "" # display name of the plug-in static var ARG = "filter" # additional argument name (or empty if none) static var ARG_HTTP = "url" # domain name + static var ARG_HINT = "Enter Filter pattern" static var UPDATE_TIME = 5000 # update every 5s static var UPDATE_CMD = "Status 8" # command to send for updates static var PROBE_TIMEOUT = 1700 # timeout of 1700 ms for probing, which gives at least 1s for TCP recovery diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Sensor_Occupancy.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Sensor_Occupancy.be index 1e171b5cd..33bc9763f 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Sensor_Occupancy.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Sensor_Occupancy.be @@ -30,6 +30,7 @@ class Matter_Plugin_Bridge_Sensor_Occupancy : Matter_Plugin_Bridge_HTTP static var TYPE = "http_occupancy" # name of the plug-in in json static var NAME = "Occupancy" # display name of the plug-in static var ARG = "switch" # additional argument name (or empty if none) + static var ARG_HINT = "Enter Switch number" static var ARG_TYPE = / x -> int(x) # function to convert argument to the right type static var UPDATE_TIME = 5000 # update every 5s static var UPDATE_CMD = "Status 8" # command to send for updates diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_OnOff.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_OnOff.be index 45a2d0ab7..4a511a9cd 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_OnOff.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_OnOff.be @@ -31,6 +31,7 @@ class Matter_Plugin_OnOff : Matter_Plugin_Device static var NAME = "Relay" # display name of the plug-in static var ARG = "relay" # additional argument name (or empty if none) static var ARG_TYPE = / x -> int(x) # function to convert argument to the right type + static var ARG_HINT = "Enter Relay number" static var UPDATE_TIME = 250 # update every 250ms static var CLUSTERS = { # 0x001D: inherited # Descriptor Cluster 9.5 p.453 diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Root.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Root.be index 39ab5e064..58a3b54b6 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Root.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Root.be @@ -416,7 +416,7 @@ class Matter_Plugin_Root : Matter_Plugin var ac = session.get_ac() var attestation_tbs = attestation_message + ac - tasmota.log("MTR: attestation_tbs=" + attestation_tbs.tohex(), 3) + # tasmota.log("MTR: attestation_tbs=" + attestation_tbs.tohex(), 4) var attestation_signature = crypto.EC_P256().ecdsa_sign_sha256(matter.DAC_Priv_FFF1_8000(), attestation_tbs) @@ -433,7 +433,7 @@ class Matter_Plugin_Root : Matter_Plugin var CSRNonce = val.findsubval(0) # octstr 32 if size(CSRNonce) != 32 return nil end # check size on nonce var IsForUpdateNOC = val.findsubval(1, false) # bool - tasmota.log(string.format("MTR: CSRRequest CSRNonce=%s IsForUpdateNOC=%s", str(CSRNonce), str(IsForUpdateNOC)), 3) + # tasmota.log(string.format("MTR: CSRRequest CSRNonce=%s IsForUpdateNOC=%s", str(CSRNonce), str(IsForUpdateNOC)), 4) var csr = session.gen_CSR() @@ -443,7 +443,7 @@ class Matter_Plugin_Root : Matter_Plugin var nocsr_elements_message = nocsr_elements.tlv2raw() # sign with attestation challenge var nocsr_tbs = nocsr_elements_message + session.get_ac() - tasmota.log("MTR: nocsr_tbs=" + nocsr_tbs.tohex(), 3) + # tasmota.log("MTR: nocsr_tbs=" + nocsr_tbs.tohex(), 4) var attestation_signature = crypto.EC_P256().ecdsa_sign_sha256(matter.DAC_Priv_FFF1_8000(), nocsr_tbs) # create CSRResponse @@ -459,12 +459,12 @@ class Matter_Plugin_Root : Matter_Plugin var RootCACertificate = val.findsubval(0) # octstr 400 max # TODO - additional tests are expected according to 11.17.7.13. AddTrustedRootCertificate Command session.set_temp_ca(RootCACertificate) - tasmota.log("MTR: received ca_root="+RootCACertificate.tohex(), 3) + # tasmota.log("MTR: received ca_root="+RootCACertificate.tohex(), 4) ctx.status = matter.SUCCESS # OK return nil # trigger a standalone ack elif command == 0x0006 # ---------- AddNOC ---------- - tasmota.log("MTR: AddNoc Args=" + str(val), 3) + tasmota.log("MTR: AddNoc Args=" + str(val), 4) var NOCValue = val.findsubval(0) # octstr max 400 var ICACValue = val.findsubval(1) # octstr max 400 # Apple sends an empty ICAC instead of a missing attribute, fix this @@ -550,7 +550,7 @@ class Matter_Plugin_Root : Matter_Plugin elif command == 0x0009 # ---------- UpdateFabricLabel ---------- var label = val.findsubval(0) # Label string max 32 session.set_fabric_label(label) - tasmota.log(string.format("MTR: . Update fabric '%s' label='%s'", session._fabric.get_fabric_id().copy().reverse().tohex(), str(label)), 2) + tasmota.log(string.format("MTR: . Update fabric '%s' label='%s'", session._fabric.get_fabric_id().copy().reverse().tohex(), str(label)), 3) ctx.status = matter.SUCCESS # OK return nil # trigger a standalone ack @@ -560,7 +560,7 @@ class Matter_Plugin_Root : Matter_Plugin for fab: self.device.sessions.active_fabrics() if fab.get_fabric_index() == index - tasmota.log("MTR: removing fabric " + fab.get_fabric_id().copy().reverse().tohex(), 2) + # tasmota.log("MTR: removing fabric " + fab.get_fabric_id().copy().reverse().tohex(), 2) # defer actual removal to send a response tasmota.set_timer(2000, def () self.device.remove_fabric(fab) end) return true # Ok @@ -583,7 +583,7 @@ class Matter_Plugin_Root : Matter_Plugin var salt = val.findsubval(4) # Salt octstr tasmota.log(string.format("MTR: OpenCommissioningWindow(timeout=%i, passcode=%s, discriminator=%i, iterations=%i, salt=%s)", - timeout, passcode_verifier.tohex(), discriminator, iterations, salt.tohex()), 2) + timeout, passcode_verifier.tohex(), discriminator, iterations, salt.tohex()), 4) # check values if timeout == nil || passcode_verifier == nil || discriminator == nil || iterations == nil || salt == nil @@ -591,7 +591,7 @@ class Matter_Plugin_Root : Matter_Plugin return nil # trigger a standalone ack end if size(passcode_verifier) != 32+65 || size(salt) < 16 || size(salt) > 32 - tasmota.log("MTR: wrong size for PAKE parameters") + tasmota.log("MTR: wrong size for PAKE parameters", 2) ctx.status = matter.CONSTRAINT_ERROR return nil # trigger a standalone ack end @@ -604,7 +604,7 @@ class Matter_Plugin_Root : Matter_Plugin return true # OK elif command == 0x0001 # ---------- OpenBasicCommissioningWindow ---------- var commissioning_timeout = val.findsubval(0) # CommissioningTimeout - tasmota.log("MTR: OpenBasicCommissioningWindow commissioning_timeout="+str(commissioning_timeout), 2) + tasmota.log("MTR: OpenBasicCommissioningWindow commissioning_timeout="+str(commissioning_timeout), 3) self.device.start_root_basic_commissioning(commissioning_timeout) return true elif command == 0x0002 # ---------- RevokeCommissioning ---------- diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor.be index 5cd808209..c335a75ed 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor.be @@ -28,6 +28,7 @@ class Matter_Plugin_Device end class Matter_Plugin_Sensor : Matter_Plugin_Device static var ARG = "filter" # additional argument name (or empty if none) + static var ARG_HINT = "Enter Filter pattern" static var UPDATE_TIME = 5000 # update sensor every 5s var tasmota_sensor_filter # Rule-type filter to the value, like "ESP32#Temperature" var tasmota_sensor_matcher # Actual matcher object diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor_Occupancy.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor_Occupancy.be index e036bada5..7184beaf1 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor_Occupancy.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor_Occupancy.be @@ -30,6 +30,7 @@ class Matter_Plugin_Sensor_Occupancy : Matter_Plugin_Device static var TYPE = "occupancy" # name of the plug-in in json static var NAME = "Occupancy" # display name of the plug-in static var ARG = "switch" # additional argument name (or empty if none) + static var ARG_HINT = "Enter Switch number" static var ARG_TYPE = / x -> int(x) # function to convert argument to the right type static var UPDATE_TIME = 5000 # update every 250ms static var CLUSTERS = { diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor_OnOff.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor_OnOff.be index e754c4466..f70caeb61 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor_OnOff.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor_OnOff.be @@ -26,8 +26,9 @@ class Matter_Plugin_Device end class Matter_Plugin_Sensor_OnOff : Matter_Plugin_Device static var TYPE = "onoff" # name of the plug-in in json - static var NAME = "OnOff" # display name of the plug-in + static var NAME = "OnOff Sensor" # display name of the plug-in static var ARG = "switch" # additional argument name (or empty if none) + static var ARG_HINT = "Enter Switch number" static var ARG_TYPE = / x -> int(x) # function to convert argument to the right type static var UPDATE_TIME = 5000 # update every 250ms static var CLUSTERS = { diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Shutter.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Shutter.be index fec02219d..e3b1bb4f5 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Shutter.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Shutter.be @@ -31,6 +31,7 @@ class Matter_Plugin_Shutter : Matter_Plugin_Device static var NAME = "Shutter" # display name of the plug-in static var ARG = "shutter" # additional argument name (or empty if none) static var ARG_TYPE = / x -> int(x) # function to convert argument to the right type + static var ARG_HINT = "Enter Relay number" static var CLUSTERS = { # 0x001D: inherited # Descriptor Cluster 9.5 p.453 # 0x0003: inherited # Identify 1.2 p.16 @@ -68,10 +69,10 @@ class Matter_Plugin_Shutter : Matter_Plugin_Device if r_st13.contains('StatusSHT') r_st13 = r_st13['StatusSHT'] # skip root var d = r_st13.find("SHT"+str(self.tasmota_shutter_index), {}).find('Opt') - tasmota.log("MTR: opt: "+str(d)) + # tasmota.log("MTR: opt: "+str(d)) if d != nil self.shadow_shutter_inverted = int(d[size(d)-1]) # inverted is at the most right character - tasmota.log("MTR: Inverted flag: "+str(self.shadow_shutter_inverted)) + # tasmota.log("MTR: Inverted flag: "+str(self.shadow_shutter_inverted)) end end end diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Session.be b/lib/libesp32/berry_matter/src/embedded/Matter_Session.be index 5066c3199..57aec2765 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Session.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Session.be @@ -130,8 +130,7 @@ class Matter_Session : Matter_Expirable def counter_snd_next() import string var next = self._counter_snd_impl.next() - tasmota.log(string.format("MTR: . Counter_snd=%i", next), 3) - # print(">>> NEXT counter_snd=", self.counter_snd, "_impl=", self._counter_snd_impl.val(), 4) + # tasmota.log(string.format("MTR: . Counter_snd=%i", next), 4) if matter.Counter.is_greater(next, self.counter_snd) self.counter_snd = next + self._COUNTER_SND_INCR if self.does_persist() diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Session_Store.be b/lib/libesp32/berry_matter/src/embedded/Matter_Session_Store.be index 27dfdd520..25122e01e 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Session_Store.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Session_Store.be @@ -281,9 +281,9 @@ class Matter_Session_Store var sessions = self.sessions while i < size(sessions) var session = sessions[i] - tasmota.log(string.format("MTR: session.resumption_id=%s vs %s", str(session.resumption_id), str(resumption_id)), 3) + tasmota.log(string.format("MTR: session.resumption_id=%s vs %s", str(session.resumption_id), str(resumption_id)), 4) if session.resumption_id == resumption_id && session.shared_secret != nil - tasmota.log(string.format("MTR: session.shared_secret=%s", str(session.shared_secret)), 3) + # tasmota.log(string.format("MTR: session.shared_secret=%s", str(session.shared_secret)), 4) session.update() return session end @@ -328,7 +328,7 @@ class Matter_Session_Store var f = open(self._FABRICS, "w") f.write(fabs) f.close() - tasmota.log(string.format("MTR: =Saved %i fabric(s) and %i session(s)", fabs_size, sessions_saved), 2) + tasmota.log(string.format("MTR: =Saved %i fabric(s) and %i session(s)", fabs_size, sessions_saved), 3) self.device.event_fabrics_saved() # signal event except .. as e, m tasmota.log("MTR: Session_Store::save Exception:" + str(e) + "|" + str(m), 2) diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_UDPServer.be b/lib/libesp32/berry_matter/src/embedded/Matter_UDPServer.be index 3578b7155..079b83e2a 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_UDPServer.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_UDPServer.be @@ -125,7 +125,7 @@ class Matter_UDPServer packet_read += 1 var from_addr = self.udp_socket.remote_ip var from_port = self.udp_socket.remote_port - tasmota.log(string.format("MTR: UDP received from [%s]:%i", from_addr, from_port), 3) + tasmota.log(string.format("MTR: UDP received from [%s]:%i", from_addr, from_port), 4) if self.dispatch_cb self.dispatch_cb(packet, from_addr, from_port) end @@ -149,7 +149,7 @@ class Matter_UDPServer if ok tasmota.log(string.format("MTR: sending packet to '[%s]:%i'", packet.addr, packet.port), 4) else - tasmota.log(string.format("MTR: error sending packet to '[%s]:%i'", packet.addr, packet.port), 2) + tasmota.log(string.format("MTR: error sending packet to '[%s]:%i'", packet.addr, packet.port), 3) end return ok end @@ -169,7 +169,7 @@ class Matter_UDPServer var packet = self.packets_sent[idx] if tasmota.time_reached(packet.next_try) if packet.retries <= self.RETRIES - tasmota.log("MTR: . Resending packet id=" + str(packet.msg_id), 3) + tasmota.log("MTR: . Resending packet id=" + str(packet.msg_id), 4) self.send(packet) packet.next_try = tasmota.millis() + self._backoff_time(packet.retries) packet.retries += 1 @@ -177,7 +177,7 @@ class Matter_UDPServer else import string self.packets_sent.remove(idx) - tasmota.log(string.format("MTR: . (%6i) Unacked packet '[%s]:%i' msg_id=%i", packet.session_id, packet.addr, packet.port, packet.msg_id), 2) + tasmota.log(string.format("MTR: . (%6i) Unacked packet '[%s]:%i' msg_id=%i", packet.session_id, packet.addr, packet.port, packet.msg_id), 3) end else idx += 1 @@ -191,13 +191,13 @@ class Matter_UDPServer var id = msg.ack_message_counter var exch = msg.exchange_id if id == nil return end - tasmota.log("MTR: receveived ACK id="+str(id), 3) + # tasmota.log("MTR: receveived ACK id="+str(id), 4) var idx = 0 while idx < size(self.packets_sent) var packet = self.packets_sent[idx] if packet.msg_id == id && packet.exchange_id == exch self.packets_sent.remove(idx) - tasmota.log("MTR: . Removed packet from sending list id=" + str(id), 3) + tasmota.log("MTR: . Removed packet from sending list id=" + str(id), 4) else idx += 1 end diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_UI.be b/lib/libesp32/berry_matter/src/embedded/Matter_UI.be index 2f1ff5b0a..0053b7dd8 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_UI.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_UI.be @@ -92,7 +92,7 @@ class Matter_UI import string var matter_enabled = self.matter_enabled - webserver.content_send("
     Matter  

    " + webserver.content_send("
     Matter  " "

    Check the Matter documentation.

    " "
    ") @@ -107,7 +107,7 @@ class Matter_UI end webserver.content_send("

    " - "

    ") + "

    ") end #- ---------------------------------------------------------------------- -# @@ -243,9 +243,55 @@ class Matter_UI end - #- ---------------------------------------------------------------------- -# + #----------------------------------------------------------------------- -# + #- Show Javasrcript hints for classes arguments + #----------------------------------------------------------------------- -# + # + # Exmaple: + # var hm = {"relay":0,"shutter+tilt":0,"light2":1,"illuminance":2,"onoff":1,"pressure":2,"light1":1,"humidity":2,"shutter":0,"occupancy":3,"temperature":2,"light3":1,"light0":1}; + # var hl = ["Enter Relay number","Not used","Enter Filter pattern","Enter Switch number"]; + def show_plugins_hints_js(*class_list) + import webserver + import string + import json + + var class_types = [] + for cl: class_list + class_types += string.split(cl, '|') + end + + var hm = {} + var hl = [] + + for typ: class_types + if typ == '' continue end + var cl = self.device.plugins_classes.find(typ) + if cl != nil + var hint = cl.ARG_HINT + if hint != nil + var idx = hl.find(hint) + if idx == nil # not already in list, add it + idx = size(hl) # save index for assignment + hl.push(hint) + end + hm[typ] = idx + end + end + end + + webserver.content_send(string.format( + "", json.dump(hm), json.dump(hl))) + + webserver.content_send(matter._ADD_ENDPOINT_JS) + + end + + #----------------------------------------------------------------------- -# #- Show plugins configuration - #- ---------------------------------------------------------------------- -# + #----------------------------------------------------------------------- -# def show_plugins_configuration() import webserver import string @@ -253,10 +299,7 @@ class Matter_UI webserver.content_send("
     Current Configuration 

    ") - # webserver.content_send("

    ") - # webserver.content_send("

    ") - - webserver.content_send("
    " "

    Local sensors and devices

    " "
    TypeParameter
    " "") @@ -283,11 +326,11 @@ class Matter_UI end found = true - webserver.content_send(string.format("", ep)) + webserver.content_send(string.format("", ep)) - webserver.content_send(string.format("", self.plugin_name(conf.find('type', '')))) - webserver.content_send(string.format("", - ep, webserver.html_escape(arg))) + webserver.content_send(string.format("", self.plugin_name(conf.find('type', '')))) + webserver.content_send(string.format("", + ep, webserver.html_escape(arg), cl ? webserver.html_escape(cl.ARG_HINT) : '')) webserver.content_send(string.format("", i)) - # webserver.content_send(string.format("")) - # webserver.content_send(string.format("", i)) - - - # remote devices - webserver.content_send("

    ") # iterate on each remote device - var remotes = [] for conf: self.device.plugins_config var url = conf.find("url") @@ -324,7 +355,7 @@ class Matter_UI end end self.device.sort_distinct(remotes) - tasmota.log("MTR: remotes: "+str(remotes), 3) + # tasmota.log("MTR: remotes: "+str(remotes), 4) for remote: remotes @@ -352,10 +383,10 @@ class Matter_UI end found = true - webserver.content_send(string.format("", ep)) + webserver.content_send(string.format("", ep)) - webserver.content_send(string.format("", self.plugin_name(conf.find('type', '')))) - webserver.content_send(string.format("", + webserver.content_send(string.format("", self.plugin_name(conf.find('type', '')))) + webserver.content_send(string.format("", ep, webserver.html_escape(arg))) webserver.content_send(string.format("" - "") + webserver.content_send("" + "") i += 1 end # empty line for new endpoint - webserver.content_send(string.format("" - "") + webserver.content_send("" + "") # end of table webserver.content_send("
    #TypeParameter
    %i
    %i%s%s
    %i
    %i%s%s
    ") - webserver.content_send(string.format("", - i, webserver.html_escape(arg))) - webserver.content_send("
    ") + webserver.content_send(string.format("", + i, i, webserver.html_escape(arg), cl ? webserver.html_escape(cl.ARG_HINT) : '')) + webserver.content_send("
    ") - webserver.content_send(string.format("", - i, '')) - webserver.content_send("
    ") + webserver.content_send(string.format("", + i, i, '')) + webserver.content_send("
    ") @@ -633,7 +668,7 @@ class Matter_UI webserver.content_send("") - webserver.content_send("

    ") + webserver.content_send("
    ") else webserver.content_send(string.format("

    Unable to connect to '%s'

    ", webserver.html_escape(url))) @@ -679,9 +714,9 @@ class Matter_UI try # debug information about parameters - for i:0..webserver.arg_size()-1 - tasmota.log(string.format("MTR: Arg%i '%s' = '%s'", i, webserver.arg_name(i), webserver.arg(i))) - end + # for i:0..webserver.arg_size()-1 + # tasmota.log(string.format("MTR: Arg%i '%s' = '%s'", i, webserver.arg_name(i), webserver.arg(i))) + # end #---------------------------------------------------------------------# # Change Passcode and/or Passcode @@ -807,7 +842,7 @@ class Matter_UI self.device.save_param() end #- and reload -# - webserver.redirect("/cn?") + webserver.redirect("/matterc?") end #---------------------------------------------------------------------# # Add new endpoint for local sensor or device @@ -881,7 +916,6 @@ class Matter_UI end # check if we found an endpoint to be deleted if ep_deleted != nil - tasmota.log(string.format("MTR: deleting endpoint %i", ep_deleted), 2) self.device.bridge_remove_endpoint(ep_deleted) webserver.redirect("/matterc?") end diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Commissioning.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Commissioning.h index 1123b4a22..fc766de36 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Commissioning.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Commissioning.h @@ -28,7 +28,7 @@ be_local_closure(Matter_Commisioning_Context_parse_StatusReport, /* name */ /* K5 */ be_nested_str_weak(app_payload_idx), /* K6 */ be_const_int(2147483647), /* K7 */ be_nested_str_weak(tohex), - /* K8 */ be_const_int(2), + /* K8 */ be_const_int(3), }), be_str_weak(parse_StatusReport), &be_const_str_solidified, @@ -66,109 +66,100 @@ be_local_closure(Matter_Commisioning_Context_find_fabric_by_destination_id, /* 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[21]) { /* constants */ + ( &(const bvalue[19]) { /* constants */ /* K0 */ be_nested_str_weak(crypto), /* K1 */ be_nested_str_weak(tasmota), /* K2 */ be_nested_str_weak(log), /* K3 */ be_nested_str_weak(MTR_X3A_X20SEARCHING_X3A_X20destinationId_X3D), /* K4 */ be_nested_str_weak(tohex), - /* K5 */ be_const_int(3), - /* K6 */ be_nested_str_weak(device), - /* K7 */ be_nested_str_weak(sessions), - /* K8 */ be_nested_str_weak(fabrics), - /* K9 */ be_nested_str_weak(noc), - /* K10 */ be_nested_str_weak(fabric_id), - /* K11 */ be_nested_str_weak(device_id), - /* K12 */ be_nested_str_weak(get_ca_pub), - /* K13 */ be_nested_str_weak(get_ipk_group_key), - /* K14 */ be_nested_str_weak(MTR_X3A_X20SIGMA1_X3A_X20destinationMessage_X3D), - /* K15 */ be_nested_str_weak(MTR_X3A_X20SIGMA1_X3A_X20key_ipk_X3D), - /* K16 */ be_nested_str_weak(HMAC_SHA256), - /* K17 */ be_nested_str_weak(update), - /* K18 */ be_nested_str_weak(out), - /* K19 */ be_nested_str_weak(MTR_X3A_X20SIGMA1_X3A_X20candidateDestinationId_X3D), - /* K20 */ be_nested_str_weak(stop_iteration), + /* K5 */ be_nested_str_weak(device), + /* K6 */ be_nested_str_weak(sessions), + /* K7 */ be_nested_str_weak(fabrics), + /* K8 */ be_nested_str_weak(noc), + /* K9 */ be_nested_str_weak(fabric_id), + /* K10 */ be_nested_str_weak(device_id), + /* K11 */ be_nested_str_weak(get_ca_pub), + /* K12 */ be_nested_str_weak(get_ipk_group_key), + /* K13 */ be_nested_str_weak(MTR_X3A_X20SIGMA1_X3A_X20destinationMessage_X3D), + /* K14 */ be_nested_str_weak(HMAC_SHA256), + /* K15 */ be_nested_str_weak(update), + /* K16 */ be_nested_str_weak(out), + /* K17 */ be_nested_str_weak(MTR_X3A_X20SIGMA1_X3A_X20candidateDestinationId_X3D), + /* K18 */ be_nested_str_weak(stop_iteration), }), be_str_weak(find_fabric_by_destination_id), &be_const_str_solidified, - ( &(const binstruction[77]) { /* code */ + ( &(const binstruction[70]) { /* code */ 0xA40E0000, // 0000 IMPORT R3 K0 0xB8120200, // 0001 GETNGBL R4 K1 0x8C100902, // 0002 GETMET R4 R4 K2 0x8C180304, // 0003 GETMET R6 R1 K4 0x7C180200, // 0004 CALL R6 1 0x001A0606, // 0005 ADD R6 K3 R6 - 0x581C0005, // 0006 LDCONST R7 K5 + 0x541E0003, // 0006 LDINT R7 4 0x7C100600, // 0007 CALL R4 3 0x60100010, // 0008 GETGBL R4 G16 - 0x88140106, // 0009 GETMBR R5 R0 K6 - 0x88140B07, // 000A GETMBR R5 R5 K7 - 0x88140B08, // 000B GETMBR R5 R5 K8 + 0x88140105, // 0009 GETMBR R5 R0 K5 + 0x88140B06, // 000A GETMBR R5 R5 K6 + 0x88140B07, // 000B GETMBR R5 R5 K7 0x7C100200, // 000C CALL R4 1 - 0xA8020039, // 000D EXBLK 0 #0048 + 0xA8020032, // 000D EXBLK 0 #0041 0x5C140800, // 000E MOVE R5 R4 0x7C140000, // 000F CALL R5 0 - 0x88180B09, // 0010 GETMBR R6 R5 K9 + 0x88180B08, // 0010 GETMBR R6 R5 K8 0x4C1C0000, // 0011 LDNIL R7 0x1C180C07, // 0012 EQ R6 R6 R7 0x741A0007, // 0013 JMPT R6 #001C - 0x88180B0A, // 0014 GETMBR R6 R5 K10 + 0x88180B09, // 0014 GETMBR R6 R5 K9 0x4C1C0000, // 0015 LDNIL R7 0x1C180C07, // 0016 EQ R6 R6 R7 0x741A0003, // 0017 JMPT R6 #001C - 0x88180B0B, // 0018 GETMBR R6 R5 K11 + 0x88180B0A, // 0018 GETMBR R6 R5 K10 0x4C1C0000, // 0019 LDNIL R7 0x1C180C07, // 001A EQ R6 R6 R7 0x781A0000, // 001B JMPF R6 #001D 0x7001FFF0, // 001C JMP #000E - 0x8C180B0C, // 001D GETMET R6 R5 K12 + 0x8C180B0B, // 001D GETMET R6 R5 K11 0x7C180200, // 001E CALL R6 1 0x00180406, // 001F ADD R6 R2 R6 - 0x881C0B0A, // 0020 GETMBR R7 R5 K10 + 0x881C0B09, // 0020 GETMBR R7 R5 K9 0x00180C07, // 0021 ADD R6 R6 R7 - 0x881C0B0B, // 0022 GETMBR R7 R5 K11 + 0x881C0B0A, // 0022 GETMBR R7 R5 K10 0x00180C07, // 0023 ADD R6 R6 R7 - 0x8C1C0B0D, // 0024 GETMET R7 R5 K13 + 0x8C1C0B0C, // 0024 GETMET R7 R5 K12 0x7C1C0200, // 0025 CALL R7 1 0xB8220200, // 0026 GETNGBL R8 K1 0x8C201102, // 0027 GETMET R8 R8 K2 0x8C280D04, // 0028 GETMET R10 R6 K4 0x7C280200, // 0029 CALL R10 1 - 0x002A1C0A, // 002A ADD R10 K14 R10 - 0x582C0005, // 002B LDCONST R11 K5 + 0x002A1A0A, // 002A ADD R10 K13 R10 + 0x542E0003, // 002B LDINT R11 4 0x7C200600, // 002C CALL R8 3 - 0xB8220200, // 002D GETNGBL R8 K1 - 0x8C201102, // 002E GETMET R8 R8 K2 - 0x8C280F04, // 002F GETMET R10 R7 K4 - 0x7C280200, // 0030 CALL R10 1 - 0x002A1E0A, // 0031 ADD R10 K15 R10 - 0x542E0003, // 0032 LDINT R11 4 - 0x7C200600, // 0033 CALL R8 3 - 0x8C200710, // 0034 GETMET R8 R3 K16 - 0x5C280E00, // 0035 MOVE R10 R7 - 0x7C200400, // 0036 CALL R8 2 - 0x8C241111, // 0037 GETMET R9 R8 K17 - 0x5C2C0C00, // 0038 MOVE R11 R6 - 0x7C240400, // 0039 CALL R9 2 - 0x8C241112, // 003A GETMET R9 R8 K18 - 0x7C240200, // 003B CALL R9 1 - 0xB82A0200, // 003C GETNGBL R10 K1 - 0x8C281502, // 003D GETMET R10 R10 K2 - 0x8C301304, // 003E GETMET R12 R9 K4 - 0x7C300200, // 003F CALL R12 1 - 0x0032260C, // 0040 ADD R12 K19 R12 - 0x58340005, // 0041 LDCONST R13 K5 - 0x7C280600, // 0042 CALL R10 3 - 0x1C281201, // 0043 EQ R10 R9 R1 - 0x782A0001, // 0044 JMPF R10 #0047 - 0xA8040001, // 0045 EXBLK 1 1 - 0x80040A00, // 0046 RET 1 R5 - 0x7001FFC5, // 0047 JMP #000E - 0x58100014, // 0048 LDCONST R4 K20 - 0xAC100200, // 0049 CATCH R4 1 0 - 0xB0080000, // 004A RAISE 2 R0 R0 - 0x4C100000, // 004B LDNIL R4 - 0x80040800, // 004C RET 1 R4 + 0x8C20070E, // 002D GETMET R8 R3 K14 + 0x5C280E00, // 002E MOVE R10 R7 + 0x7C200400, // 002F CALL R8 2 + 0x8C24110F, // 0030 GETMET R9 R8 K15 + 0x5C2C0C00, // 0031 MOVE R11 R6 + 0x7C240400, // 0032 CALL R9 2 + 0x8C241110, // 0033 GETMET R9 R8 K16 + 0x7C240200, // 0034 CALL R9 1 + 0xB82A0200, // 0035 GETNGBL R10 K1 + 0x8C281502, // 0036 GETMET R10 R10 K2 + 0x8C301304, // 0037 GETMET R12 R9 K4 + 0x7C300200, // 0038 CALL R12 1 + 0x0032220C, // 0039 ADD R12 K17 R12 + 0x54360003, // 003A LDINT R13 4 + 0x7C280600, // 003B CALL R10 3 + 0x1C281201, // 003C EQ R10 R9 R1 + 0x782A0001, // 003D JMPF R10 #0040 + 0xA8040001, // 003E EXBLK 1 1 + 0x80040A00, // 003F RET 1 R5 + 0x7001FFCC, // 0040 JMP #000E + 0x58100012, // 0041 LDCONST R4 K18 + 0xAC100200, // 0042 CATCH R4 1 0 + 0xB0080000, // 0043 RAISE 2 R0 R0 + 0x4C100000, // 0044 LDNIL R4 + 0x80040800, // 0045 RET 1 R4 }) ) ); @@ -212,17 +203,16 @@ be_local_closure(Matter_Commisioning_Context_add_session, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[10]) { /* constants */ + ( &(const bvalue[ 9]) { /* constants */ /* K0 */ be_nested_str_weak(string), /* K1 */ be_nested_str_weak(tasmota), /* K2 */ be_nested_str_weak(log), /* K3 */ be_nested_str_weak(format), /* K4 */ be_nested_str_weak(MTR_X3A_X20add_session_X20local_session_id_X3D_X25i_X20initiator_session_id_X3D_X25i), - /* K5 */ be_const_int(3), - /* K6 */ be_nested_str_weak(device), - /* K7 */ be_nested_str_weak(sessions), - /* K8 */ be_nested_str_weak(create_session), - /* K9 */ be_nested_str_weak(set_keys), + /* K5 */ be_nested_str_weak(device), + /* K6 */ be_nested_str_weak(sessions), + /* K7 */ be_nested_str_weak(create_session), + /* K8 */ be_nested_str_weak(set_keys), }), be_str_weak(add_session), &be_const_str_solidified, @@ -235,15 +225,15 @@ be_local_closure(Matter_Commisioning_Context_add_session, /* name */ 0x5C300200, // 0005 MOVE R12 R1 0x5C340400, // 0006 MOVE R13 R2 0x7C240800, // 0007 CALL R9 4 - 0x58280005, // 0008 LDCONST R10 K5 + 0x542A0003, // 0008 LDINT R10 4 0x7C1C0600, // 0009 CALL R7 3 - 0x881C0106, // 000A GETMBR R7 R0 K6 - 0x881C0F07, // 000B GETMBR R7 R7 K7 - 0x8C1C0F08, // 000C GETMET R7 R7 K8 + 0x881C0105, // 000A GETMBR R7 R0 K5 + 0x881C0F06, // 000B GETMBR R7 R7 K6 + 0x8C1C0F07, // 000C GETMET R7 R7 K7 0x5C240200, // 000D MOVE R9 R1 0x5C280400, // 000E MOVE R10 R2 0x7C1C0600, // 000F CALL R7 3 - 0x8C200F09, // 0010 GETMET R8 R7 K9 + 0x8C200F08, // 0010 GETMET R8 R7 K8 0x5C280600, // 0011 MOVE R10 R3 0x5C2C0800, // 0012 MOVE R11 R4 0x5C300A00, // 0013 MOVE R12 R5 @@ -268,7 +258,7 @@ be_local_closure(Matter_Commisioning_Context_parse_PBKDFParamRequest, /* name 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[49]) { /* constants */ + ( &(const bvalue[50]) { /* constants */ /* K0 */ be_nested_str_weak(crypto), /* K1 */ be_nested_str_weak(string), /* K2 */ be_nested_str_weak(session), @@ -281,43 +271,44 @@ be_local_closure(Matter_Commisioning_Context_parse_PBKDFParamRequest, /* name /* K9 */ be_nested_str_weak(MTR_X3A_X20invalid_X20PBKDFParamRequest_X20message), /* K10 */ be_const_int(2), /* K11 */ be_nested_str_weak(MTR_X3A_X20StatusReport_X28General_X20Code_X3A_X20FAILURE_X2C_X20ProtocolId_X3A_X20SECURE_CHANNEL_X2C_X20ProtocolCode_X3A_X20INVALID_PARAMETER_X29), - /* K12 */ be_nested_str_weak(send_status_report), - /* K13 */ be_const_int(1), - /* K14 */ be_nested_str_weak(matter), - /* K15 */ be_nested_str_weak(PBKDFParamRequest), - /* K16 */ be_nested_str_weak(parse), - /* K17 */ be_nested_str_weak(raw), - /* K18 */ be_nested_str_weak(app_payload_idx), - /* K19 */ be_nested_str_weak(set_mode_PASE), - /* K20 */ be_nested_str_weak(__Msg1), - /* K21 */ be_const_int(2147483647), - /* K22 */ be_nested_str_weak(passcodeId), - /* K23 */ be_nested_str_weak(MTR_X3A_X20non_X2Dzero_X20passcode_X20id), - /* K24 */ be_nested_str_weak(__future_initiator_session_id), - /* K25 */ be_nested_str_weak(initiator_session_id), - /* K26 */ be_nested_str_weak(__future_local_session_id), - /* K27 */ be_nested_str_weak(device), - /* K28 */ be_nested_str_weak(sessions), - /* K29 */ be_nested_str_weak(gen_local_session_id), - /* K30 */ be_nested_str_weak(format), - /* K31 */ be_nested_str_weak(MTR_X3A_X20_X2BSession_X20_X20_X20_X28_X256i_X29_X20from_X20_X27_X5B_X25s_X5D_X3A_X25i_X27), - /* K32 */ be_nested_str_weak(remote_ip), - /* K33 */ be_nested_str_weak(remote_port), - /* K34 */ be_nested_str_weak(PBKDFParamResponse), - /* K35 */ be_nested_str_weak(initiatorRandom), - /* K36 */ be_nested_str_weak(responderRandom), - /* K37 */ be_nested_str_weak(random), - /* K38 */ be_nested_str_weak(responderSessionId), - /* K39 */ be_nested_str_weak(pbkdf_parameters_salt), - /* K40 */ be_nested_str_weak(commissioning_salt), - /* K41 */ be_nested_str_weak(pbkdf_parameters_iterations), - /* K42 */ be_nested_str_weak(commissioning_iterations), - /* K43 */ be_nested_str_weak(tlv2raw), - /* K44 */ be_nested_str_weak(__Msg2), - /* K45 */ be_nested_str_weak(build_response), - /* K46 */ be_nested_str_weak(encode_frame), - /* K47 */ be_nested_str_weak(responder), - /* K48 */ be_nested_str_weak(send_response_frame), + /* K12 */ be_const_int(3), + /* K13 */ be_nested_str_weak(send_status_report), + /* K14 */ be_const_int(1), + /* K15 */ be_nested_str_weak(matter), + /* K16 */ be_nested_str_weak(PBKDFParamRequest), + /* K17 */ be_nested_str_weak(parse), + /* K18 */ be_nested_str_weak(raw), + /* K19 */ be_nested_str_weak(app_payload_idx), + /* K20 */ be_nested_str_weak(set_mode_PASE), + /* K21 */ be_nested_str_weak(__Msg1), + /* K22 */ be_const_int(2147483647), + /* K23 */ be_nested_str_weak(passcodeId), + /* K24 */ be_nested_str_weak(MTR_X3A_X20non_X2Dzero_X20passcode_X20id), + /* K25 */ be_nested_str_weak(__future_initiator_session_id), + /* K26 */ be_nested_str_weak(initiator_session_id), + /* K27 */ be_nested_str_weak(__future_local_session_id), + /* K28 */ be_nested_str_weak(device), + /* K29 */ be_nested_str_weak(sessions), + /* K30 */ be_nested_str_weak(gen_local_session_id), + /* K31 */ be_nested_str_weak(format), + /* K32 */ be_nested_str_weak(MTR_X3A_X20New_Session_X28_X256i_X29_X20from_X20_X27_X5B_X25s_X5D_X3A_X25i_X27), + /* K33 */ be_nested_str_weak(remote_ip), + /* K34 */ be_nested_str_weak(remote_port), + /* K35 */ be_nested_str_weak(PBKDFParamResponse), + /* K36 */ be_nested_str_weak(initiatorRandom), + /* K37 */ be_nested_str_weak(responderRandom), + /* K38 */ be_nested_str_weak(random), + /* K39 */ be_nested_str_weak(responderSessionId), + /* K40 */ be_nested_str_weak(pbkdf_parameters_salt), + /* K41 */ be_nested_str_weak(commissioning_salt), + /* K42 */ be_nested_str_weak(pbkdf_parameters_iterations), + /* K43 */ be_nested_str_weak(commissioning_iterations), + /* K44 */ be_nested_str_weak(tlv2raw), + /* K45 */ be_nested_str_weak(__Msg2), + /* K46 */ be_nested_str_weak(build_response), + /* K47 */ be_nested_str_weak(encode_frame), + /* K48 */ be_nested_str_weak(responder), + /* K49 */ be_nested_str_weak(send_response_frame), }), be_str_weak(parse_PBKDFParamRequest), &be_const_str_solidified, @@ -343,100 +334,100 @@ be_local_closure(Matter_Commisioning_Context_parse_PBKDFParamRequest, /* name 0xB8160E00, // 0012 GETNGBL R5 K7 0x8C140B08, // 0013 GETMET R5 R5 K8 0x581C000B, // 0014 LDCONST R7 K11 - 0x5820000A, // 0015 LDCONST R8 K10 + 0x5820000C, // 0015 LDCONST R8 K12 0x7C140600, // 0016 CALL R5 3 - 0x8C14010C, // 0017 GETMET R5 R0 K12 + 0x8C14010D, // 0017 GETMET R5 R0 K13 0x5C1C0200, // 0018 MOVE R7 R1 - 0x5820000D, // 0019 LDCONST R8 K13 + 0x5820000E, // 0019 LDCONST R8 K14 0x58240005, // 001A LDCONST R9 K5 0x5828000A, // 001B LDCONST R10 K10 0x502C0000, // 001C LDBOOL R11 0 0 0x7C140C00, // 001D CALL R5 6 0x50140000, // 001E LDBOOL R5 0 0 0x80040A00, // 001F RET 1 R5 - 0xB8161C00, // 0020 GETNGBL R5 K14 - 0x8C140B0F, // 0021 GETMET R5 R5 K15 + 0xB8161E00, // 0020 GETNGBL R5 K15 + 0x8C140B10, // 0021 GETMET R5 R5 K16 0x7C140200, // 0022 CALL R5 1 - 0x8C140B10, // 0023 GETMET R5 R5 K16 - 0x881C0311, // 0024 GETMBR R7 R1 K17 - 0x88200312, // 0025 GETMBR R8 R1 K18 + 0x8C140B11, // 0023 GETMET R5 R5 K17 + 0x881C0312, // 0024 GETMBR R7 R1 K18 + 0x88200313, // 0025 GETMBR R8 R1 K19 0x7C140600, // 0026 CALL R5 3 0x88180302, // 0027 GETMBR R6 R1 K2 - 0x8C180D13, // 0028 GETMET R6 R6 K19 + 0x8C180D14, // 0028 GETMET R6 R6 K20 0x7C180200, // 0029 CALL R6 1 - 0x88180312, // 002A GETMBR R6 R1 K18 - 0x40180D15, // 002B CONNECT R6 R6 K21 - 0x881C0311, // 002C GETMBR R7 R1 K17 + 0x88180313, // 002A GETMBR R6 R1 K19 + 0x40180D16, // 002B CONNECT R6 R6 K22 + 0x881C0312, // 002C GETMBR R7 R1 K18 0x94180E06, // 002D GETIDX R6 R7 R6 - 0x90122806, // 002E SETMBR R4 K20 R6 - 0x88180B16, // 002F GETMBR R6 R5 K22 + 0x90122A06, // 002E SETMBR R4 K21 R6 + 0x88180B17, // 002F GETMBR R6 R5 K23 0x20180D05, // 0030 NE R6 R6 K5 0x781A0012, // 0031 JMPF R6 #0045 0xB81A0E00, // 0032 GETNGBL R6 K7 0x8C180D08, // 0033 GETMET R6 R6 K8 - 0x58200017, // 0034 LDCONST R8 K23 + 0x58200018, // 0034 LDCONST R8 K24 0x5824000A, // 0035 LDCONST R9 K10 0x7C180600, // 0036 CALL R6 3 0xB81A0E00, // 0037 GETNGBL R6 K7 0x8C180D08, // 0038 GETMET R6 R6 K8 0x5820000B, // 0039 LDCONST R8 K11 - 0x5824000A, // 003A LDCONST R9 K10 + 0x5824000C, // 003A LDCONST R9 K12 0x7C180600, // 003B CALL R6 3 - 0x8C18010C, // 003C GETMET R6 R0 K12 + 0x8C18010D, // 003C GETMET R6 R0 K13 0x5C200200, // 003D MOVE R8 R1 - 0x5824000D, // 003E LDCONST R9 K13 + 0x5824000E, // 003E LDCONST R9 K14 0x58280005, // 003F LDCONST R10 K5 0x582C000A, // 0040 LDCONST R11 K10 0x50300000, // 0041 LDBOOL R12 0 0 0x7C180C00, // 0042 CALL R6 6 0x50180000, // 0043 LDBOOL R6 0 0 0x80040C00, // 0044 RET 1 R6 - 0x88180B19, // 0045 GETMBR R6 R5 K25 - 0x90123006, // 0046 SETMBR R4 K24 R6 - 0x8818011B, // 0047 GETMBR R6 R0 K27 - 0x88180D1C, // 0048 GETMBR R6 R6 K28 - 0x8C180D1D, // 0049 GETMET R6 R6 K29 + 0x88180B1A, // 0045 GETMBR R6 R5 K26 + 0x90123206, // 0046 SETMBR R4 K25 R6 + 0x8818011C, // 0047 GETMBR R6 R0 K28 + 0x88180D1D, // 0048 GETMBR R6 R6 K29 + 0x8C180D1E, // 0049 GETMET R6 R6 K30 0x7C180200, // 004A CALL R6 1 - 0x90123406, // 004B SETMBR R4 K26 R6 + 0x90123606, // 004B SETMBR R4 K27 R6 0xB81A0E00, // 004C GETNGBL R6 K7 0x8C180D08, // 004D GETMET R6 R6 K8 - 0x8C20071E, // 004E GETMET R8 R3 K30 - 0x5828001F, // 004F LDCONST R10 K31 - 0x882C091A, // 0050 GETMBR R11 R4 K26 - 0x88300320, // 0051 GETMBR R12 R1 K32 - 0x88340321, // 0052 GETMBR R13 R1 K33 + 0x8C20071F, // 004E GETMET R8 R3 K31 + 0x58280020, // 004F LDCONST R10 K32 + 0x882C091B, // 0050 GETMBR R11 R4 K27 + 0x88300321, // 0051 GETMBR R12 R1 K33 + 0x88340322, // 0052 GETMBR R13 R1 K34 0x7C200A00, // 0053 CALL R8 5 - 0x5824000A, // 0054 LDCONST R9 K10 + 0x5824000C, // 0054 LDCONST R9 K12 0x7C180600, // 0055 CALL R6 3 - 0xB81A1C00, // 0056 GETNGBL R6 K14 - 0x8C180D22, // 0057 GETMET R6 R6 K34 + 0xB81A1E00, // 0056 GETNGBL R6 K15 + 0x8C180D23, // 0057 GETMET R6 R6 K35 0x7C180200, // 0058 CALL R6 1 - 0x881C0B23, // 0059 GETMBR R7 R5 K35 - 0x901A4607, // 005A SETMBR R6 K35 R7 - 0x8C1C0525, // 005B GETMET R7 R2 K37 + 0x881C0B24, // 0059 GETMBR R7 R5 K36 + 0x901A4807, // 005A SETMBR R6 K36 R7 + 0x8C1C0526, // 005B GETMET R7 R2 K38 0x5426001F, // 005C LDINT R9 32 0x7C1C0400, // 005D CALL R7 2 - 0x901A4807, // 005E SETMBR R6 K36 R7 - 0x881C091A, // 005F GETMBR R7 R4 K26 - 0x901A4C07, // 0060 SETMBR R6 K38 R7 - 0x881C011B, // 0061 GETMBR R7 R0 K27 - 0x881C0F28, // 0062 GETMBR R7 R7 K40 - 0x901A4E07, // 0063 SETMBR R6 K39 R7 - 0x881C011B, // 0064 GETMBR R7 R0 K27 - 0x881C0F2A, // 0065 GETMBR R7 R7 K42 - 0x901A5207, // 0066 SETMBR R6 K41 R7 - 0x8C1C0D2B, // 0067 GETMET R7 R6 K43 + 0x901A4A07, // 005E SETMBR R6 K37 R7 + 0x881C091B, // 005F GETMBR R7 R4 K27 + 0x901A4E07, // 0060 SETMBR R6 K39 R7 + 0x881C011C, // 0061 GETMBR R7 R0 K28 + 0x881C0F29, // 0062 GETMBR R7 R7 K41 + 0x901A5007, // 0063 SETMBR R6 K40 R7 + 0x881C011C, // 0064 GETMBR R7 R0 K28 + 0x881C0F2B, // 0065 GETMBR R7 R7 K43 + 0x901A5407, // 0066 SETMBR R6 K42 R7 + 0x8C1C0D2C, // 0067 GETMET R7 R6 K44 0x7C1C0200, // 0068 CALL R7 1 - 0x90125807, // 0069 SETMBR R4 K44 R7 - 0x8C20032D, // 006A GETMET R8 R1 K45 + 0x90125A07, // 0069 SETMBR R4 K45 R7 + 0x8C20032E, // 006A GETMET R8 R1 K46 0x542A0020, // 006B LDINT R10 33 0x502C0200, // 006C LDBOOL R11 1 0 0x7C200600, // 006D CALL R8 3 - 0x8C24112E, // 006E GETMET R9 R8 K46 + 0x8C24112F, // 006E GETMET R9 R8 K47 0x5C2C0E00, // 006F MOVE R11 R7 0x7C240400, // 0070 CALL R9 2 - 0x8828012F, // 0071 GETMBR R10 R0 K47 - 0x8C281530, // 0072 GETMET R10 R10 K48 + 0x88280130, // 0071 GETMBR R10 R0 K48 + 0x8C281531, // 0072 GETMET R10 R10 K49 0x5C301000, // 0073 MOVE R12 R8 0x7C280400, // 0074 CALL R10 2 0x50280200, // 0075 LDBOOL R10 1 0 @@ -508,7 +499,7 @@ be_local_closure(Matter_Commisioning_Context_send_status_report, /* name */ ********************************************************************/ be_local_closure(Matter_Commisioning_Context_parse_Pake1, /* name */ be_nested_proto( - 17, /* nstack */ + 23, /* nstack */ 2, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -516,163 +507,180 @@ be_local_closure(Matter_Commisioning_Context_parse_Pake1, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[47]) { /* constants */ + ( &(const bvalue[54]) { /* constants */ /* K0 */ be_nested_str_weak(crypto), - /* K1 */ be_nested_str_weak(session), - /* K2 */ be_nested_str_weak(opcode), - /* K3 */ be_nested_str_weak(local_session_id), - /* K4 */ be_const_int(0), - /* K5 */ be_nested_str_weak(protocol_id), - /* K6 */ be_nested_str_weak(tasmota), - /* K7 */ be_nested_str_weak(log), - /* K8 */ be_nested_str_weak(MTR_X3A_X20invalid_X20Pake1_X20message), - /* K9 */ be_const_int(2), - /* K10 */ be_nested_str_weak(MTR_X3A_X20StatusReport_X28General_X20Code_X3A_X20FAILURE_X2C_X20ProtocolId_X3A_X20SECURE_CHANNEL_X2C_X20ProtocolCode_X3A_X20INVALID_PARAMETER_X29), - /* K11 */ be_nested_str_weak(send_status_report), - /* K12 */ be_const_int(1), - /* K13 */ be_nested_str_weak(matter), - /* K14 */ be_nested_str_weak(Pake1), - /* K15 */ be_nested_str_weak(parse), - /* K16 */ be_nested_str_weak(raw), - /* K17 */ be_nested_str_weak(app_payload_idx), - /* K18 */ be_nested_str_weak(pA), - /* K19 */ be_nested_str_weak(SPAKE2P_Matter), - /* K20 */ be_nested_str_weak(device), - /* K21 */ be_nested_str_weak(commissioning_w0), - /* K22 */ be_nested_str_weak(commissioning_L), - /* K23 */ be_nested_str_weak(random), - /* K24 */ be_nested_str_weak(compute_pB), - /* K25 */ be_nested_str_weak(compute_ZV_verifier), - /* K26 */ be_nested_str_weak(SHA256), - /* K27 */ be_nested_str_weak(update), - /* K28 */ be_nested_str_weak(fromstring), - /* K29 */ be_nested_str_weak(Matter_Context_Prefix), - /* K30 */ be_nested_str_weak(__Msg1), - /* K31 */ be_nested_str_weak(__Msg2), - /* K32 */ be_nested_str_weak(out), - /* K33 */ be_nested_str_weak(set_context), - /* K34 */ be_nested_str_weak(compute_TT_hash), - /* K35 */ be_nested_str_weak(Pake2), - /* K36 */ be_nested_str_weak(pB), - /* K37 */ be_nested_str_weak(cB), - /* K38 */ be_nested_str_weak(tlv2raw), - /* K39 */ be_nested_str_weak(__spake_cA), - /* K40 */ be_nested_str_weak(cA), - /* K41 */ be_nested_str_weak(__spake_Ke), - /* K42 */ be_nested_str_weak(Ke), - /* K43 */ be_nested_str_weak(build_response), - /* K44 */ be_nested_str_weak(encode_frame), - /* K45 */ be_nested_str_weak(responder), - /* K46 */ be_nested_str_weak(send_response_frame), + /* K1 */ be_nested_str_weak(string), + /* K2 */ be_nested_str_weak(session), + /* K3 */ be_nested_str_weak(opcode), + /* K4 */ be_nested_str_weak(local_session_id), + /* K5 */ be_const_int(0), + /* K6 */ be_nested_str_weak(protocol_id), + /* K7 */ be_nested_str_weak(tasmota), + /* K8 */ be_nested_str_weak(log), + /* K9 */ be_nested_str_weak(MTR_X3A_X20invalid_X20Pake1_X20message), + /* K10 */ be_const_int(3), + /* K11 */ be_nested_str_weak(MTR_X3A_X20StatusReport_X28General_X20Code_X3A_X20FAILURE_X2C_X20ProtocolId_X3A_X20SECURE_CHANNEL_X2C_X20ProtocolCode_X3A_X20INVALID_PARAMETER_X29), + /* K12 */ be_nested_str_weak(send_status_report), + /* K13 */ be_const_int(1), + /* K14 */ be_const_int(2), + /* K15 */ be_nested_str_weak(matter), + /* K16 */ be_nested_str_weak(Pake1), + /* K17 */ be_nested_str_weak(parse), + /* K18 */ be_nested_str_weak(raw), + /* K19 */ be_nested_str_weak(app_payload_idx), + /* K20 */ be_nested_str_weak(pA), + /* K21 */ be_nested_str_weak(SPAKE2P_Matter), + /* K22 */ be_nested_str_weak(device), + /* K23 */ be_nested_str_weak(commissioning_w0), + /* K24 */ be_nested_str_weak(commissioning_L), + /* K25 */ be_nested_str_weak(random), + /* K26 */ be_nested_str_weak(compute_pB), + /* K27 */ be_nested_str_weak(compute_ZV_verifier), + /* K28 */ be_nested_str_weak(SHA256), + /* K29 */ be_nested_str_weak(update), + /* K30 */ be_nested_str_weak(fromstring), + /* K31 */ be_nested_str_weak(Matter_Context_Prefix), + /* K32 */ be_nested_str_weak(__Msg1), + /* K33 */ be_nested_str_weak(__Msg2), + /* K34 */ be_nested_str_weak(out), + /* K35 */ be_nested_str_weak(set_context), + /* K36 */ be_nested_str_weak(compute_TT_hash), + /* K37 */ be_nested_str_weak(Pake2), + /* K38 */ be_nested_str_weak(pB), + /* K39 */ be_nested_str_weak(cB), + /* K40 */ be_nested_str_weak(tlv2raw), + /* K41 */ be_nested_str_weak(__spake_cA), + /* K42 */ be_nested_str_weak(cA), + /* K43 */ be_nested_str_weak(__spake_Ke), + /* K44 */ be_nested_str_weak(Ke), + /* K45 */ be_nested_str_weak(build_response), + /* K46 */ be_nested_str_weak(encode_frame), + /* K47 */ be_nested_str_weak(format), + /* K48 */ be_nested_str_weak(MTR_X3A_X20New_X20Commissioning_X20_X28PASE_X20id_X3D_X25i_X29_X20from_X20_X5B_X25s_X5D_X3A_X25i), + /* K49 */ be_nested_str_weak(__future_local_session_id), + /* K50 */ be_nested_str_weak(_ip), + /* K51 */ be_nested_str_weak(_port), + /* K52 */ be_nested_str_weak(responder), + /* K53 */ be_nested_str_weak(send_response_frame), }), be_str_weak(parse_Pake1), &be_const_str_solidified, - ( &(const binstruction[105]) { /* code */ + ( &(const binstruction[115]) { /* code */ 0xA40A0000, // 0000 IMPORT R2 K0 - 0x880C0301, // 0001 GETMBR R3 R1 K1 + 0xA40E0200, // 0001 IMPORT R3 K1 0x88100302, // 0002 GETMBR R4 R1 K2 - 0x54160021, // 0003 LDINT R5 34 - 0x20100805, // 0004 NE R4 R4 R5 - 0x74120005, // 0005 JMPT R4 #000C - 0x88100303, // 0006 GETMBR R4 R1 K3 - 0x20100904, // 0007 NE R4 R4 K4 - 0x74120002, // 0008 JMPT R4 #000C - 0x88100305, // 0009 GETMBR R4 R1 K5 - 0x20100904, // 000A NE R4 R4 K4 - 0x78120012, // 000B JMPF R4 #001F - 0xB8120C00, // 000C GETNGBL R4 K6 - 0x8C100907, // 000D GETMET R4 R4 K7 - 0x58180008, // 000E LDCONST R6 K8 + 0x88140303, // 0003 GETMBR R5 R1 K3 + 0x541A0021, // 0004 LDINT R6 34 + 0x20140A06, // 0005 NE R5 R5 R6 + 0x74160005, // 0006 JMPT R5 #000D + 0x88140304, // 0007 GETMBR R5 R1 K4 + 0x20140B05, // 0008 NE R5 R5 K5 + 0x74160002, // 0009 JMPT R5 #000D + 0x88140306, // 000A GETMBR R5 R1 K6 + 0x20140B05, // 000B NE R5 R5 K5 + 0x78160012, // 000C JMPF R5 #0020 + 0xB8160E00, // 000D GETNGBL R5 K7 + 0x8C140B08, // 000E GETMET R5 R5 K8 0x581C0009, // 000F LDCONST R7 K9 - 0x7C100600, // 0010 CALL R4 3 - 0xB8120C00, // 0011 GETNGBL R4 K6 - 0x8C100907, // 0012 GETMET R4 R4 K7 - 0x5818000A, // 0013 LDCONST R6 K10 - 0x581C0009, // 0014 LDCONST R7 K9 - 0x7C100600, // 0015 CALL R4 3 - 0x8C10010B, // 0016 GETMET R4 R0 K11 - 0x5C180200, // 0017 MOVE R6 R1 - 0x581C000C, // 0018 LDCONST R7 K12 - 0x58200004, // 0019 LDCONST R8 K4 - 0x58240009, // 001A LDCONST R9 K9 - 0x50280000, // 001B LDBOOL R10 0 0 - 0x7C100C00, // 001C CALL R4 6 - 0x50100000, // 001D LDBOOL R4 0 0 - 0x80040800, // 001E RET 1 R4 - 0xB8121A00, // 001F GETNGBL R4 K13 - 0x8C10090E, // 0020 GETMET R4 R4 K14 - 0x7C100200, // 0021 CALL R4 1 - 0x8C10090F, // 0022 GETMET R4 R4 K15 - 0x88180310, // 0023 GETMBR R6 R1 K16 - 0x881C0311, // 0024 GETMBR R7 R1 K17 - 0x7C100600, // 0025 CALL R4 3 - 0x88140912, // 0026 GETMBR R5 R4 K18 - 0x8C180513, // 0027 GETMET R6 R2 K19 - 0x88200114, // 0028 GETMBR R8 R0 K20 - 0x88201115, // 0029 GETMBR R8 R8 K21 - 0x4C240000, // 002A LDNIL R9 - 0x88280114, // 002B GETMBR R10 R0 K20 - 0x88281516, // 002C GETMBR R10 R10 K22 - 0x7C180800, // 002D CALL R6 4 - 0x8C1C0517, // 002E GETMET R7 R2 K23 - 0x5426001F, // 002F LDINT R9 32 - 0x7C1C0400, // 0030 CALL R7 2 - 0x8C200D18, // 0031 GETMET R8 R6 K24 - 0x5C280E00, // 0032 MOVE R10 R7 - 0x7C200400, // 0033 CALL R8 2 - 0x8C200D19, // 0034 GETMET R8 R6 K25 - 0x5C280A00, // 0035 MOVE R10 R5 - 0x7C200400, // 0036 CALL R8 2 - 0x8C20051A, // 0037 GETMET R8 R2 K26 - 0x7C200200, // 0038 CALL R8 1 - 0x8C24111B, // 0039 GETMET R9 R8 K27 - 0x602C0015, // 003A GETGBL R11 G21 - 0x7C2C0000, // 003B CALL R11 0 - 0x8C2C171C, // 003C GETMET R11 R11 K28 - 0x8834011D, // 003D GETMBR R13 R0 K29 - 0x7C2C0400, // 003E CALL R11 2 - 0x7C240400, // 003F CALL R9 2 - 0x8C24111B, // 0040 GETMET R9 R8 K27 - 0x882C071E, // 0041 GETMBR R11 R3 K30 - 0x7C240400, // 0042 CALL R9 2 - 0x8C24111B, // 0043 GETMET R9 R8 K27 - 0x882C071F, // 0044 GETMBR R11 R3 K31 - 0x7C240400, // 0045 CALL R9 2 - 0x8C241120, // 0046 GETMET R9 R8 K32 - 0x7C240200, // 0047 CALL R9 1 - 0x901A2405, // 0048 SETMBR R6 K18 R5 - 0x8C280D21, // 0049 GETMET R10 R6 K33 - 0x5C301200, // 004A MOVE R12 R9 - 0x7C280400, // 004B CALL R10 2 - 0x8C280D22, // 004C GETMET R10 R6 K34 - 0x50300200, // 004D LDBOOL R12 1 0 - 0x7C280400, // 004E CALL R10 2 - 0xB82A1A00, // 004F GETNGBL R10 K13 - 0x8C281523, // 0050 GETMET R10 R10 K35 - 0x7C280200, // 0051 CALL R10 1 - 0x882C0D24, // 0052 GETMBR R11 R6 K36 - 0x902A480B, // 0053 SETMBR R10 K36 R11 - 0x882C0D25, // 0054 GETMBR R11 R6 K37 - 0x902A4A0B, // 0055 SETMBR R10 K37 R11 - 0x8C2C1526, // 0056 GETMET R11 R10 K38 - 0x7C2C0200, // 0057 CALL R11 1 - 0x88300D28, // 0058 GETMBR R12 R6 K40 - 0x900E4E0C, // 0059 SETMBR R3 K39 R12 - 0x88300D2A, // 005A GETMBR R12 R6 K42 - 0x900E520C, // 005B SETMBR R3 K41 R12 - 0x8C30032B, // 005C GETMET R12 R1 K43 - 0x543A0022, // 005D LDINT R14 35 - 0x503C0200, // 005E LDBOOL R15 1 0 - 0x7C300600, // 005F CALL R12 3 - 0x8C34192C, // 0060 GETMET R13 R12 K44 - 0x5C3C1600, // 0061 MOVE R15 R11 - 0x7C340400, // 0062 CALL R13 2 - 0x8838012D, // 0063 GETMBR R14 R0 K45 - 0x8C381D2E, // 0064 GETMET R14 R14 K46 - 0x5C401800, // 0065 MOVE R16 R12 - 0x7C380400, // 0066 CALL R14 2 - 0x50380200, // 0067 LDBOOL R14 1 0 - 0x80041C00, // 0068 RET 1 R14 + 0x5820000A, // 0010 LDCONST R8 K10 + 0x7C140600, // 0011 CALL R5 3 + 0xB8160E00, // 0012 GETNGBL R5 K7 + 0x8C140B08, // 0013 GETMET R5 R5 K8 + 0x581C000B, // 0014 LDCONST R7 K11 + 0x5820000A, // 0015 LDCONST R8 K10 + 0x7C140600, // 0016 CALL R5 3 + 0x8C14010C, // 0017 GETMET R5 R0 K12 + 0x5C1C0200, // 0018 MOVE R7 R1 + 0x5820000D, // 0019 LDCONST R8 K13 + 0x58240005, // 001A LDCONST R9 K5 + 0x5828000E, // 001B LDCONST R10 K14 + 0x502C0000, // 001C LDBOOL R11 0 0 + 0x7C140C00, // 001D CALL R5 6 + 0x50140000, // 001E LDBOOL R5 0 0 + 0x80040A00, // 001F RET 1 R5 + 0xB8161E00, // 0020 GETNGBL R5 K15 + 0x8C140B10, // 0021 GETMET R5 R5 K16 + 0x7C140200, // 0022 CALL R5 1 + 0x8C140B11, // 0023 GETMET R5 R5 K17 + 0x881C0312, // 0024 GETMBR R7 R1 K18 + 0x88200313, // 0025 GETMBR R8 R1 K19 + 0x7C140600, // 0026 CALL R5 3 + 0x88180B14, // 0027 GETMBR R6 R5 K20 + 0x8C1C0515, // 0028 GETMET R7 R2 K21 + 0x88240116, // 0029 GETMBR R9 R0 K22 + 0x88241317, // 002A GETMBR R9 R9 K23 + 0x4C280000, // 002B LDNIL R10 + 0x882C0116, // 002C GETMBR R11 R0 K22 + 0x882C1718, // 002D GETMBR R11 R11 K24 + 0x7C1C0800, // 002E CALL R7 4 + 0x8C200519, // 002F GETMET R8 R2 K25 + 0x542A001F, // 0030 LDINT R10 32 + 0x7C200400, // 0031 CALL R8 2 + 0x8C240F1A, // 0032 GETMET R9 R7 K26 + 0x5C2C1000, // 0033 MOVE R11 R8 + 0x7C240400, // 0034 CALL R9 2 + 0x8C240F1B, // 0035 GETMET R9 R7 K27 + 0x5C2C0C00, // 0036 MOVE R11 R6 + 0x7C240400, // 0037 CALL R9 2 + 0x8C24051C, // 0038 GETMET R9 R2 K28 + 0x7C240200, // 0039 CALL R9 1 + 0x8C28131D, // 003A GETMET R10 R9 K29 + 0x60300015, // 003B GETGBL R12 G21 + 0x7C300000, // 003C CALL R12 0 + 0x8C30191E, // 003D GETMET R12 R12 K30 + 0x8838011F, // 003E GETMBR R14 R0 K31 + 0x7C300400, // 003F CALL R12 2 + 0x7C280400, // 0040 CALL R10 2 + 0x8C28131D, // 0041 GETMET R10 R9 K29 + 0x88300920, // 0042 GETMBR R12 R4 K32 + 0x7C280400, // 0043 CALL R10 2 + 0x8C28131D, // 0044 GETMET R10 R9 K29 + 0x88300921, // 0045 GETMBR R12 R4 K33 + 0x7C280400, // 0046 CALL R10 2 + 0x8C281322, // 0047 GETMET R10 R9 K34 + 0x7C280200, // 0048 CALL R10 1 + 0x901E2806, // 0049 SETMBR R7 K20 R6 + 0x8C2C0F23, // 004A GETMET R11 R7 K35 + 0x5C341400, // 004B MOVE R13 R10 + 0x7C2C0400, // 004C CALL R11 2 + 0x8C2C0F24, // 004D GETMET R11 R7 K36 + 0x50340200, // 004E LDBOOL R13 1 0 + 0x7C2C0400, // 004F CALL R11 2 + 0xB82E1E00, // 0050 GETNGBL R11 K15 + 0x8C2C1725, // 0051 GETMET R11 R11 K37 + 0x7C2C0200, // 0052 CALL R11 1 + 0x88300F26, // 0053 GETMBR R12 R7 K38 + 0x902E4C0C, // 0054 SETMBR R11 K38 R12 + 0x88300F27, // 0055 GETMBR R12 R7 K39 + 0x902E4E0C, // 0056 SETMBR R11 K39 R12 + 0x8C301728, // 0057 GETMET R12 R11 K40 + 0x7C300200, // 0058 CALL R12 1 + 0x88340F2A, // 0059 GETMBR R13 R7 K42 + 0x9012520D, // 005A SETMBR R4 K41 R13 + 0x88340F2C, // 005B GETMBR R13 R7 K44 + 0x9012560D, // 005C SETMBR R4 K43 R13 + 0x8C34032D, // 005D GETMET R13 R1 K45 + 0x543E0022, // 005E LDINT R15 35 + 0x50400200, // 005F LDBOOL R16 1 0 + 0x7C340600, // 0060 CALL R13 3 + 0x8C381B2E, // 0061 GETMET R14 R13 K46 + 0x5C401800, // 0062 MOVE R16 R12 + 0x7C380400, // 0063 CALL R14 2 + 0xB83E0E00, // 0064 GETNGBL R15 K7 + 0x8C3C1F08, // 0065 GETMET R15 R15 K8 + 0x8C44072F, // 0066 GETMET R17 R3 K47 + 0x584C0030, // 0067 LDCONST R19 K48 + 0x88500931, // 0068 GETMBR R20 R4 K49 + 0x88540932, // 0069 GETMBR R21 R4 K50 + 0x88580933, // 006A GETMBR R22 R4 K51 + 0x7C440A00, // 006B CALL R17 5 + 0x7C3C0400, // 006C CALL R15 2 + 0x883C0134, // 006D GETMBR R15 R0 K52 + 0x8C3C1F35, // 006E GETMET R15 R15 K53 + 0x5C441A00, // 006F MOVE R17 R13 + 0x7C3C0400, // 0070 CALL R15 2 + 0x503C0200, // 0071 LDBOOL R15 1 0 + 0x80041E00, // 0072 RET 1 R15 }) ) ); @@ -724,7 +732,7 @@ be_local_closure(Matter_Commisioning_Context_parse_Pake3, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[31]) { /* constants */ + ( &(const bvalue[32]) { /* constants */ /* K0 */ be_nested_str_weak(crypto), /* K1 */ be_nested_str_weak(session), /* K2 */ be_nested_str_weak(opcode), @@ -734,28 +742,29 @@ be_local_closure(Matter_Commisioning_Context_parse_Pake3, /* name */ /* K6 */ be_nested_str_weak(tasmota), /* K7 */ be_nested_str_weak(log), /* K8 */ be_nested_str_weak(MTR_X3A_X20invalid_X20Pake3_X20message), - /* K9 */ be_const_int(2), + /* K9 */ be_const_int(3), /* K10 */ be_nested_str_weak(MTR_X3A_X20StatusReport_X28General_X20Code_X3A_X20FAILURE_X2C_X20ProtocolId_X3A_X20SECURE_CHANNEL_X2C_X20ProtocolCode_X3A_X20INVALID_PARAMETER_X29), /* K11 */ be_nested_str_weak(send_status_report), /* K12 */ be_const_int(1), - /* K13 */ be_nested_str_weak(matter), - /* K14 */ be_nested_str_weak(Pake3), - /* K15 */ be_nested_str_weak(parse), - /* K16 */ be_nested_str_weak(raw), - /* K17 */ be_nested_str_weak(app_payload_idx), - /* K18 */ be_nested_str_weak(cA), - /* K19 */ be_nested_str_weak(__spake_cA), - /* K20 */ be_nested_str_weak(MTR_X3A_X20invalid_X20cA_X20received), - /* K21 */ be_nested_str_weak(rtc), - /* K22 */ be_nested_str_weak(utc), - /* K23 */ be_nested_str_weak(HKDF_SHA256), - /* K24 */ be_nested_str_weak(derive), - /* K25 */ be_nested_str_weak(__spake_Ke), - /* K26 */ be_nested_str_weak(fromstring), - /* K27 */ be_nested_str_weak(SEKeys_Info), - /* K28 */ be_nested_str_weak(add_session), - /* K29 */ be_nested_str_weak(__future_local_session_id), - /* K30 */ be_nested_str_weak(__future_initiator_session_id), + /* K13 */ be_const_int(2), + /* K14 */ be_nested_str_weak(matter), + /* K15 */ be_nested_str_weak(Pake3), + /* K16 */ be_nested_str_weak(parse), + /* K17 */ be_nested_str_weak(raw), + /* K18 */ be_nested_str_weak(app_payload_idx), + /* K19 */ be_nested_str_weak(cA), + /* K20 */ be_nested_str_weak(__spake_cA), + /* K21 */ be_nested_str_weak(MTR_X3A_X20invalid_X20cA_X20received), + /* K22 */ be_nested_str_weak(rtc), + /* K23 */ be_nested_str_weak(utc), + /* K24 */ be_nested_str_weak(HKDF_SHA256), + /* K25 */ be_nested_str_weak(derive), + /* K26 */ be_nested_str_weak(__spake_Ke), + /* K27 */ be_nested_str_weak(fromstring), + /* K28 */ be_nested_str_weak(SEKeys_Info), + /* K29 */ be_nested_str_weak(add_session), + /* K30 */ be_nested_str_weak(__future_local_session_id), + /* K31 */ be_nested_str_weak(__future_initiator_session_id), }), be_str_weak(parse_Pake3), &be_const_str_solidified, @@ -786,25 +795,25 @@ be_local_closure(Matter_Commisioning_Context_parse_Pake3, /* name */ 0x5C180200, // 0017 MOVE R6 R1 0x581C000C, // 0018 LDCONST R7 K12 0x58200004, // 0019 LDCONST R8 K4 - 0x58240009, // 001A LDCONST R9 K9 + 0x5824000D, // 001A LDCONST R9 K13 0x50280000, // 001B LDBOOL R10 0 0 0x7C100C00, // 001C CALL R4 6 0x50100000, // 001D LDBOOL R4 0 0 0x80040800, // 001E RET 1 R4 - 0xB8121A00, // 001F GETNGBL R4 K13 - 0x8C10090E, // 0020 GETMET R4 R4 K14 + 0xB8121C00, // 001F GETNGBL R4 K14 + 0x8C10090F, // 0020 GETMET R4 R4 K15 0x7C100200, // 0021 CALL R4 1 - 0x8C10090F, // 0022 GETMET R4 R4 K15 - 0x88180310, // 0023 GETMBR R6 R1 K16 - 0x881C0311, // 0024 GETMBR R7 R1 K17 + 0x8C100910, // 0022 GETMET R4 R4 K16 + 0x88180311, // 0023 GETMBR R6 R1 K17 + 0x881C0312, // 0024 GETMBR R7 R1 K18 0x7C100600, // 0025 CALL R4 3 - 0x88140912, // 0026 GETMBR R5 R4 K18 - 0x88180713, // 0027 GETMBR R6 R3 K19 + 0x88140913, // 0026 GETMBR R5 R4 K19 + 0x88180714, // 0027 GETMBR R6 R3 K20 0x20180A06, // 0028 NE R6 R5 R6 0x781A0012, // 0029 JMPF R6 #003D 0xB81A0C00, // 002A GETNGBL R6 K6 0x8C180D07, // 002B GETMET R6 R6 K7 - 0x58200014, // 002C LDCONST R8 K20 + 0x58200015, // 002C LDCONST R8 K21 0x58240009, // 002D LDCONST R9 K9 0x7C180600, // 002E CALL R6 3 0xB81A0C00, // 002F GETNGBL R6 K6 @@ -816,25 +825,25 @@ be_local_closure(Matter_Commisioning_Context_parse_Pake3, /* name */ 0x5C200200, // 0035 MOVE R8 R1 0x5824000C, // 0036 LDCONST R9 K12 0x58280004, // 0037 LDCONST R10 K4 - 0x582C0009, // 0038 LDCONST R11 K9 + 0x582C000D, // 0038 LDCONST R11 K13 0x50300000, // 0039 LDBOOL R12 0 0 0x7C180C00, // 003A CALL R6 6 0x50180000, // 003B LDBOOL R6 0 0 0x80040C00, // 003C RET 1 R6 0xB81A0C00, // 003D GETNGBL R6 K6 - 0x8C180D15, // 003E GETMET R6 R6 K21 + 0x8C180D16, // 003E GETMET R6 R6 K22 0x7C180200, // 003F CALL R6 1 - 0x94180D16, // 0040 GETIDX R6 R6 K22 - 0x8C1C0517, // 0041 GETMET R7 R2 K23 + 0x94180D17, // 0040 GETIDX R6 R6 K23 + 0x8C1C0518, // 0041 GETMET R7 R2 K24 0x7C1C0200, // 0042 CALL R7 1 - 0x8C1C0F18, // 0043 GETMET R7 R7 K24 - 0x88240719, // 0044 GETMBR R9 R3 K25 + 0x8C1C0F19, // 0043 GETMET R7 R7 K25 + 0x8824071A, // 0044 GETMBR R9 R3 K26 0x60280015, // 0045 GETGBL R10 G21 0x7C280000, // 0046 CALL R10 0 0x602C0015, // 0047 GETGBL R11 G21 0x7C2C0000, // 0048 CALL R11 0 - 0x8C2C171A, // 0049 GETMET R11 R11 K26 - 0x8834011B, // 004A GETMBR R13 R0 K27 + 0x8C2C171B, // 0049 GETMET R11 R11 K27 + 0x8834011C, // 004A GETMBR R13 R0 K28 0x7C2C0400, // 004B CALL R11 2 0x5432002F, // 004C LDINT R12 48 0x7C1C0A00, // 004D CALL R7 5 @@ -856,9 +865,9 @@ be_local_closure(Matter_Commisioning_Context_parse_Pake3, /* name */ 0x58400004, // 005D LDCONST R16 K4 0x50440000, // 005E LDBOOL R17 0 0 0x7C2C0C00, // 005F CALL R11 6 - 0x8C2C011C, // 0060 GETMET R11 R0 K28 - 0x8834071D, // 0061 GETMBR R13 R3 K29 - 0x8838071E, // 0062 GETMBR R14 R3 K30 + 0x8C2C011D, // 0060 GETMET R11 R0 K29 + 0x8834071E, // 0061 GETMBR R13 R3 K30 + 0x8838071F, // 0062 GETMBR R14 R3 K31 0x5C3C1000, // 0063 MOVE R15 R8 0x5C401200, // 0064 MOVE R16 R9 0x5C441400, // 0065 MOVE R17 R10 @@ -885,7 +894,7 @@ be_local_closure(Matter_Commisioning_Context_parse_Sigma3, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[69]) { /* constants */ + ( &(const bvalue[67]) { /* constants */ /* K0 */ be_nested_str_weak(crypto), /* K1 */ be_nested_str_weak(opcode), /* K2 */ be_nested_str_weak(local_session_id), @@ -894,71 +903,69 @@ be_local_closure(Matter_Commisioning_Context_parse_Sigma3, /* name */ /* K5 */ be_nested_str_weak(tasmota), /* K6 */ be_nested_str_weak(log), /* K7 */ be_nested_str_weak(MTR_X3A_X20StatusReport_X28General_X20Code_X3A_X20FAILURE_X2C_X20ProtocolId_X3A_X20SECURE_CHANNEL_X2C_X20ProtocolCode_X3A_X20INVALID_PARAMETER_X29), - /* K8 */ be_const_int(2), + /* K8 */ be_const_int(3), /* K9 */ be_nested_str_weak(send_status_report), /* K10 */ be_const_int(1), - /* K11 */ be_nested_str_weak(session), - /* K12 */ be_nested_str_weak(matter), - /* K13 */ be_nested_str_weak(Sigma3), - /* K14 */ be_nested_str_weak(parse), - /* K15 */ be_nested_str_weak(raw), - /* K16 */ be_nested_str_weak(app_payload_idx), - /* K17 */ be_nested_str_weak(SHA256), - /* K18 */ be_nested_str_weak(update), - /* K19 */ be_nested_str_weak(__Msg1), - /* K20 */ be_nested_str_weak(__Msg2), - /* K21 */ be_nested_str_weak(out), - /* K22 */ be_nested_str_weak(fromstring), - /* K23 */ be_nested_str_weak(S3K_Info), - /* K24 */ be_nested_str_weak(HKDF_SHA256), - /* K25 */ be_nested_str_weak(derive), - /* K26 */ be_nested_str_weak(shared_secret), - /* K27 */ be_nested_str_weak(get_ipk_group_key), - /* K28 */ be_nested_str_weak(TBEData3Encrypted), - /* K29 */ be_const_int(2147483647), - /* K30 */ be_nested_str_weak(AES_CCM), - /* K31 */ be_nested_str_weak(TBEData3_Nonce), - /* K32 */ be_nested_str_weak(decrypt), - /* K33 */ be_nested_str_weak(tag), - /* K34 */ be_nested_str_weak(MTR_X3A_X20Tag_X20don_X27t_X20match), - /* K35 */ be_nested_str_weak(TLV), - /* K36 */ be_nested_str_weak(findsubval), - /* K37 */ be_const_int(3), - /* K38 */ be_nested_str_weak(MTR_X3A_X20initiatorNOCTLV_X20_X3D_X20), - /* K39 */ be_nested_str_weak(findsub), - /* K40 */ be_nested_str_weak(int), - /* K41 */ be_nested_str_weak(peer_node_id), - /* K42 */ be_nested_str_weak(int64), - /* K43 */ be_nested_str_weak(fromu32), - /* K44 */ be_nested_str_weak(tobytes), - /* K45 */ be_nested_str_weak(MTR_X3A_X20initiatorFabricId_X3D), - /* K46 */ be_nested_str_weak(Matter_TLV_struct), - /* K47 */ be_nested_str_weak(add_TLV), - /* K48 */ be_nested_str_weak(B1), - /* K49 */ be_nested_str_weak(__initiator_pub), - /* K50 */ be_nested_str_weak(__responder_pub), - /* K51 */ be_nested_str_weak(tlv2raw), - /* K52 */ be_nested_str_weak(EC_P256), - /* K53 */ be_nested_str_weak(ecdsa_verify_sha256), - /* K54 */ be_nested_str_weak(MTR_X3A_X20sigma3_tbs_X20does_X20not_X20have_X20a_X20valid_X20signature), - /* K55 */ be_nested_str_weak(MTR_X3A_X20_X2A_X2A_X2A_X2A_X2A_X2A_X2A_X2A_X2A_X2A_X2A_X2A_X2A_X2A_X2A_X2A_X2A_X2A_X2A_X20Invalid_X20signature_X2C_X20trying_X20anyways), - /* K56 */ be_nested_str_weak(MTR_X3A_X20Sigma3_X20verified_X2C_X20computing_X20new_X20keys), - /* K57 */ be_nested_str_weak(Msg3), - /* K58 */ be_nested_str_weak(SEKeys_Info), - /* K59 */ be_nested_str_weak(rtc), - /* K60 */ be_nested_str_weak(utc), - /* K61 */ be_nested_str_weak(close), - /* K62 */ be_nested_str_weak(set_keys), - /* K63 */ be_nested_str_weak(_breadcrumb), - /* K64 */ be_nested_str_weak(counter_snd_next), - /* K65 */ be_nested_str_weak(set_persist), - /* K66 */ be_nested_str_weak(set_no_expiration), - /* K67 */ be_nested_str_weak(persist_to_fabric), - /* K68 */ be_nested_str_weak(save), + /* K11 */ be_const_int(2), + /* K12 */ be_nested_str_weak(session), + /* K13 */ be_nested_str_weak(matter), + /* K14 */ be_nested_str_weak(Sigma3), + /* K15 */ be_nested_str_weak(parse), + /* K16 */ be_nested_str_weak(raw), + /* K17 */ be_nested_str_weak(app_payload_idx), + /* K18 */ be_nested_str_weak(SHA256), + /* K19 */ be_nested_str_weak(update), + /* K20 */ be_nested_str_weak(__Msg1), + /* K21 */ be_nested_str_weak(__Msg2), + /* K22 */ be_nested_str_weak(out), + /* K23 */ be_nested_str_weak(fromstring), + /* K24 */ be_nested_str_weak(S3K_Info), + /* K25 */ be_nested_str_weak(HKDF_SHA256), + /* K26 */ be_nested_str_weak(derive), + /* K27 */ be_nested_str_weak(shared_secret), + /* K28 */ be_nested_str_weak(get_ipk_group_key), + /* K29 */ be_nested_str_weak(TBEData3Encrypted), + /* K30 */ be_const_int(2147483647), + /* K31 */ be_nested_str_weak(AES_CCM), + /* K32 */ be_nested_str_weak(TBEData3_Nonce), + /* K33 */ be_nested_str_weak(decrypt), + /* K34 */ be_nested_str_weak(tag), + /* K35 */ be_nested_str_weak(MTR_X3A_X20Tag_X20don_X27t_X20match), + /* K36 */ be_nested_str_weak(TLV), + /* K37 */ be_nested_str_weak(findsubval), + /* K38 */ be_nested_str_weak(findsub), + /* K39 */ be_nested_str_weak(int), + /* K40 */ be_nested_str_weak(peer_node_id), + /* K41 */ be_nested_str_weak(int64), + /* K42 */ be_nested_str_weak(fromu32), + /* K43 */ be_nested_str_weak(tobytes), + /* K44 */ be_nested_str_weak(Matter_TLV_struct), + /* K45 */ be_nested_str_weak(add_TLV), + /* K46 */ be_nested_str_weak(B1), + /* K47 */ be_nested_str_weak(__initiator_pub), + /* K48 */ be_nested_str_weak(__responder_pub), + /* K49 */ be_nested_str_weak(tlv2raw), + /* K50 */ be_nested_str_weak(EC_P256), + /* K51 */ be_nested_str_weak(ecdsa_verify_sha256), + /* K52 */ be_nested_str_weak(MTR_X3A_X20sigma3_tbs_X20does_X20not_X20have_X20a_X20valid_X20signature), + /* K53 */ be_nested_str_weak(MTR_X3A_X20_X2A_X2A_X2A_X2A_X2A_X2A_X2A_X2A_X2A_X2A_X2A_X2A_X2A_X2A_X2A_X2A_X2A_X2A_X2A_X20Invalid_X20signature_X2C_X20trying_X20anyways), + /* K54 */ be_nested_str_weak(MTR_X3A_X20Sigma3_X20verified_X2C_X20computing_X20new_X20keys), + /* K55 */ be_nested_str_weak(Msg3), + /* K56 */ be_nested_str_weak(SEKeys_Info), + /* K57 */ be_nested_str_weak(rtc), + /* K58 */ be_nested_str_weak(utc), + /* K59 */ be_nested_str_weak(close), + /* K60 */ be_nested_str_weak(set_keys), + /* K61 */ be_nested_str_weak(_breadcrumb), + /* K62 */ be_nested_str_weak(counter_snd_next), + /* K63 */ be_nested_str_weak(set_persist), + /* K64 */ be_nested_str_weak(set_no_expiration), + /* K65 */ be_nested_str_weak(persist_to_fabric), + /* K66 */ be_nested_str_weak(save), }), be_str_weak(parse_Sigma3), &be_const_str_solidified, - ( &(const binstruction[303]) { /* code */ + ( &(const binstruction[287]) { /* code */ 0xA40A0000, // 0000 IMPORT R2 K0 0x880C0301, // 0001 GETMBR R3 R1 K1 0x54120031, // 0002 LDINT R4 50 @@ -979,39 +986,39 @@ be_local_closure(Matter_Commisioning_Context_parse_Sigma3, /* name */ 0x5C140200, // 0011 MOVE R5 R1 0x5818000A, // 0012 LDCONST R6 K10 0x581C0003, // 0013 LDCONST R7 K3 - 0x58200008, // 0014 LDCONST R8 K8 + 0x5820000B, // 0014 LDCONST R8 K11 0x50240000, // 0015 LDBOOL R9 0 0 0x7C0C0C00, // 0016 CALL R3 6 0x500C0000, // 0017 LDBOOL R3 0 0 0x80040600, // 0018 RET 1 R3 - 0x880C030B, // 0019 GETMBR R3 R1 K11 - 0xB8121800, // 001A GETNGBL R4 K12 - 0x8C10090D, // 001B GETMET R4 R4 K13 + 0x880C030C, // 0019 GETMBR R3 R1 K12 + 0xB8121A00, // 001A GETNGBL R4 K13 + 0x8C10090E, // 001B GETMET R4 R4 K14 0x7C100200, // 001C CALL R4 1 - 0x8C10090E, // 001D GETMET R4 R4 K14 - 0x8818030F, // 001E GETMBR R6 R1 K15 - 0x881C0310, // 001F GETMBR R7 R1 K16 + 0x8C10090F, // 001D GETMET R4 R4 K15 + 0x88180310, // 001E GETMBR R6 R1 K16 + 0x881C0311, // 001F GETMBR R7 R1 K17 0x7C100600, // 0020 CALL R4 3 - 0x8C140511, // 0021 GETMET R5 R2 K17 + 0x8C140512, // 0021 GETMET R5 R2 K18 0x7C140200, // 0022 CALL R5 1 - 0x8C140B12, // 0023 GETMET R5 R5 K18 - 0x881C0713, // 0024 GETMBR R7 R3 K19 + 0x8C140B13, // 0023 GETMET R5 R5 K19 + 0x881C0714, // 0024 GETMBR R7 R3 K20 0x7C140400, // 0025 CALL R5 2 - 0x8C140B12, // 0026 GETMET R5 R5 K18 - 0x881C0714, // 0027 GETMBR R7 R3 K20 + 0x8C140B13, // 0026 GETMET R5 R5 K19 + 0x881C0715, // 0027 GETMBR R7 R3 K21 0x7C140400, // 0028 CALL R5 2 - 0x8C140B15, // 0029 GETMET R5 R5 K21 + 0x8C140B16, // 0029 GETMET R5 R5 K22 0x7C140200, // 002A CALL R5 1 0x60180015, // 002B GETGBL R6 G21 0x7C180000, // 002C CALL R6 0 - 0x8C180D16, // 002D GETMET R6 R6 K22 - 0x88200117, // 002E GETMBR R8 R0 K23 + 0x8C180D17, // 002D GETMET R6 R6 K23 + 0x88200118, // 002E GETMBR R8 R0 K24 0x7C180400, // 002F CALL R6 2 - 0x8C1C0518, // 0030 GETMET R7 R2 K24 + 0x8C1C0519, // 0030 GETMET R7 R2 K25 0x7C1C0200, // 0031 CALL R7 1 - 0x8C1C0F19, // 0032 GETMET R7 R7 K25 - 0x8824071A, // 0033 GETMBR R9 R3 K26 - 0x8C28071B, // 0034 GETMET R10 R3 K27 + 0x8C1C0F1A, // 0032 GETMET R7 R7 K26 + 0x8824071B, // 0033 GETMBR R9 R3 K27 + 0x8C28071C, // 0034 GETMET R10 R3 K28 0x7C280200, // 0035 CALL R10 1 0x00281405, // 0036 ADD R10 R10 R5 0x5C2C0C00, // 0037 MOVE R11 R6 @@ -1019,18 +1026,18 @@ be_local_closure(Matter_Commisioning_Context_parse_Sigma3, /* name */ 0x7C1C0A00, // 0039 CALL R7 5 0x5421FFEE, // 003A LDINT R8 -17 0x40220608, // 003B CONNECT R8 K3 R8 - 0x8824091C, // 003C GETMBR R9 R4 K28 + 0x8824091D, // 003C GETMBR R9 R4 K29 0x94201208, // 003D GETIDX R8 R9 R8 0x5429FFEF, // 003E LDINT R10 -16 - 0x4028151D, // 003F CONNECT R10 R10 K29 - 0x882C091C, // 0040 GETMBR R11 R4 K28 + 0x4028151E, // 003F CONNECT R10 R10 K30 + 0x882C091D, // 0040 GETMBR R11 R4 K29 0x9424160A, // 0041 GETIDX R9 R11 R10 - 0x8C30051E, // 0042 GETMET R12 R2 K30 + 0x8C30051F, // 0042 GETMET R12 R2 K31 0x5C380E00, // 0043 MOVE R14 R7 0x603C0015, // 0044 GETGBL R15 G21 0x7C3C0000, // 0045 CALL R15 0 - 0x8C3C1F16, // 0046 GETMET R15 R15 K22 - 0x8844011F, // 0047 GETMBR R17 R0 K31 + 0x8C3C1F17, // 0046 GETMET R15 R15 K23 + 0x88440120, // 0047 GETMBR R17 R0 K32 0x7C3C0400, // 0048 CALL R15 2 0x60400015, // 0049 GETGBL R16 G21 0x7C400000, // 004A CALL R16 0 @@ -1040,17 +1047,17 @@ be_local_closure(Matter_Commisioning_Context_parse_Sigma3, /* name */ 0x544A000F, // 004E LDINT R18 16 0x7C300C00, // 004F CALL R12 6 0x5C281800, // 0050 MOVE R10 R12 - 0x8C301520, // 0051 GETMET R12 R10 K32 + 0x8C301521, // 0051 GETMET R12 R10 K33 0x5C381000, // 0052 MOVE R14 R8 0x7C300400, // 0053 CALL R12 2 0x5C2C1800, // 0054 MOVE R11 R12 - 0x8C301521, // 0055 GETMET R12 R10 K33 + 0x8C301522, // 0055 GETMET R12 R10 K34 0x7C300200, // 0056 CALL R12 1 0x20341809, // 0057 NE R13 R12 R9 0x78360012, // 0058 JMPF R13 #006C 0xB8360A00, // 0059 GETNGBL R13 K5 0x8C341B06, // 005A GETMET R13 R13 K6 - 0x583C0022, // 005B LDCONST R15 K34 + 0x583C0023, // 005B LDCONST R15 K35 0x58400008, // 005C LDCONST R16 K8 0x7C340600, // 005D CALL R13 3 0xB8360A00, // 005E GETNGBL R13 K5 @@ -1062,206 +1069,190 @@ be_local_closure(Matter_Commisioning_Context_parse_Sigma3, /* name */ 0x5C3C0200, // 0064 MOVE R15 R1 0x5840000A, // 0065 LDCONST R16 K10 0x58440003, // 0066 LDCONST R17 K3 - 0x58480008, // 0067 LDCONST R18 K8 + 0x5848000B, // 0067 LDCONST R18 K11 0x504C0000, // 0068 LDBOOL R19 0 0 0x7C340C00, // 0069 CALL R13 6 0x50340000, // 006A LDBOOL R13 0 0 0x80041A00, // 006B RET 1 R13 - 0xB8361800, // 006C GETNGBL R13 K12 - 0x88341B23, // 006D GETMBR R13 R13 K35 - 0x8C341B0E, // 006E GETMET R13 R13 K14 + 0xB8361A00, // 006C GETNGBL R13 K13 + 0x88341B24, // 006D GETMBR R13 R13 K36 + 0x8C341B0F, // 006E GETMET R13 R13 K15 0x5C3C1600, // 006F MOVE R15 R11 0x7C340400, // 0070 CALL R13 2 - 0x8C381B24, // 0071 GETMET R14 R13 K36 + 0x8C381B25, // 0071 GETMET R14 R13 K37 0x5840000A, // 0072 LDCONST R16 K10 0x7C380400, // 0073 CALL R14 2 - 0x8C3C1B24, // 0074 GETMET R15 R13 K36 - 0x58440008, // 0075 LDCONST R17 K8 + 0x8C3C1B25, // 0074 GETMET R15 R13 K37 + 0x5844000B, // 0075 LDCONST R17 K11 0x7C3C0400, // 0076 CALL R15 2 - 0x8C401B24, // 0077 GETMET R16 R13 K36 - 0x58480025, // 0078 LDCONST R18 K37 + 0x8C401B25, // 0077 GETMET R16 R13 K37 + 0x58480008, // 0078 LDCONST R18 K8 0x7C400400, // 0079 CALL R16 2 - 0xB8461800, // 007A GETNGBL R17 K12 - 0x88442323, // 007B GETMBR R17 R17 K35 - 0x8C44230E, // 007C GETMET R17 R17 K14 + 0xB8461A00, // 007A GETNGBL R17 K13 + 0x88442324, // 007B GETMBR R17 R17 K36 + 0x8C44230F, // 007C GETMET R17 R17 K15 0x5C4C1C00, // 007D MOVE R19 R14 0x7C440400, // 007E CALL R17 2 - 0xB84A0A00, // 007F GETNGBL R18 K5 - 0x8C482506, // 0080 GETMET R18 R18 K6 - 0x60500008, // 0081 GETGBL R20 G8 - 0x5C542200, // 0082 MOVE R21 R17 - 0x7C500200, // 0083 CALL R20 1 - 0x00524C14, // 0084 ADD R20 K38 R20 - 0x58540025, // 0085 LDCONST R21 K37 - 0x7C480600, // 0086 CALL R18 3 - 0x8C482324, // 0087 GETMET R18 R17 K36 - 0x54520008, // 0088 LDINT R20 9 - 0x7C480400, // 0089 CALL R18 2 - 0x8C4C2327, // 008A GETMET R19 R17 K39 - 0x54560005, // 008B LDINT R21 6 - 0x7C4C0400, // 008C CALL R19 2 - 0x8C502724, // 008D GETMET R20 R19 K36 - 0x545A0010, // 008E LDINT R22 17 - 0x7C500400, // 008F CALL R20 2 - 0x60540004, // 0090 GETGBL R21 G4 - 0x5C582800, // 0091 MOVE R22 R20 + 0x8C482325, // 007F GETMET R18 R17 K37 + 0x54520008, // 0080 LDINT R20 9 + 0x7C480400, // 0081 CALL R18 2 + 0x8C4C2326, // 0082 GETMET R19 R17 K38 + 0x54560005, // 0083 LDINT R21 6 + 0x7C4C0400, // 0084 CALL R19 2 + 0x8C502725, // 0085 GETMET R20 R19 K37 + 0x545A0010, // 0086 LDINT R22 17 + 0x7C500400, // 0087 CALL R20 2 + 0x60540004, // 0088 GETGBL R21 G4 + 0x5C582800, // 0089 MOVE R22 R20 + 0x7C540200, // 008A CALL R21 1 + 0x1C542B27, // 008B EQ R21 R21 K39 + 0x78560007, // 008C JMPF R21 #0095 + 0xB8565200, // 008D GETNGBL R21 K41 + 0x8C542B2A, // 008E GETMET R21 R21 K42 + 0x5C5C2800, // 008F MOVE R23 R20 + 0x7C540400, // 0090 CALL R21 2 + 0x8C542B2B, // 0091 GETMET R21 R21 K43 0x7C540200, // 0092 CALL R21 1 - 0x1C542B28, // 0093 EQ R21 R21 K40 - 0x78560007, // 0094 JMPF R21 #009D - 0xB8565400, // 0095 GETNGBL R21 K42 - 0x8C542B2B, // 0096 GETMET R21 R21 K43 - 0x5C5C2800, // 0097 MOVE R23 R20 - 0x7C540400, // 0098 CALL R21 2 - 0x8C542B2C, // 0099 GETMET R21 R21 K44 - 0x7C540200, // 009A CALL R21 1 - 0x900E5215, // 009B SETMBR R3 K41 R21 - 0x70020002, // 009C JMP #00A0 - 0x8C54292C, // 009D GETMET R21 R20 K44 - 0x7C540200, // 009E CALL R21 1 - 0x900E5215, // 009F SETMBR R3 K41 R21 - 0xB8560A00, // 00A0 GETNGBL R21 K5 - 0x8C542B06, // 00A1 GETMET R21 R21 K6 - 0x605C0008, // 00A2 GETGBL R23 G8 - 0x88600729, // 00A3 GETMBR R24 R3 K41 - 0x7C5C0200, // 00A4 CALL R23 1 - 0x005E5A17, // 00A5 ADD R23 K45 R23 - 0x58600025, // 00A6 LDCONST R24 K37 - 0x7C540600, // 00A7 CALL R21 3 - 0xB8561800, // 00A8 GETNGBL R21 K12 - 0x88542B23, // 00A9 GETMBR R21 R21 K35 - 0x8C542B2E, // 00AA GETMET R21 R21 K46 - 0x7C540200, // 00AB CALL R21 1 - 0x8C582B2F, // 00AC GETMET R22 R21 K47 - 0x5860000A, // 00AD LDCONST R24 K10 - 0xB8661800, // 00AE GETNGBL R25 K12 - 0x88643323, // 00AF GETMBR R25 R25 K35 - 0x88643330, // 00B0 GETMBR R25 R25 K48 - 0x5C681C00, // 00B1 MOVE R26 R14 - 0x7C580800, // 00B2 CALL R22 4 - 0x8C582B2F, // 00B3 GETMET R22 R21 K47 - 0x58600008, // 00B4 LDCONST R24 K8 - 0xB8661800, // 00B5 GETNGBL R25 K12 - 0x88643323, // 00B6 GETMBR R25 R25 K35 - 0x88643330, // 00B7 GETMBR R25 R25 K48 - 0x5C681E00, // 00B8 MOVE R26 R15 - 0x7C580800, // 00B9 CALL R22 4 - 0x8C582B2F, // 00BA GETMET R22 R21 K47 - 0x58600025, // 00BB LDCONST R24 K37 - 0xB8661800, // 00BC GETNGBL R25 K12 - 0x88643323, // 00BD GETMBR R25 R25 K35 - 0x88643330, // 00BE GETMBR R25 R25 K48 - 0x88680731, // 00BF GETMBR R26 R3 K49 - 0x7C580800, // 00C0 CALL R22 4 - 0x8C582B2F, // 00C1 GETMET R22 R21 K47 - 0x54620003, // 00C2 LDINT R24 4 - 0xB8661800, // 00C3 GETNGBL R25 K12 - 0x88643323, // 00C4 GETMBR R25 R25 K35 - 0x88643330, // 00C5 GETMBR R25 R25 K48 - 0x88680732, // 00C6 GETMBR R26 R3 K50 - 0x7C580800, // 00C7 CALL R22 4 - 0x8C582B33, // 00C8 GETMET R22 R21 K51 - 0x7C580200, // 00C9 CALL R22 1 - 0x8C5C0534, // 00CA GETMET R23 R2 K52 - 0x7C5C0200, // 00CB CALL R23 1 - 0x8C5C2F35, // 00CC GETMET R23 R23 K53 - 0x5C642400, // 00CD MOVE R25 R18 - 0x5C682C00, // 00CE MOVE R26 R22 - 0x5C6C2000, // 00CF MOVE R27 R16 - 0x7C5C0800, // 00D0 CALL R23 4 - 0x5C602E00, // 00D1 MOVE R24 R23 - 0x7462000A, // 00D2 JMPT R24 #00DE - 0xB8620A00, // 00D3 GETNGBL R24 K5 - 0x8C603106, // 00D4 GETMET R24 R24 K6 - 0x58680036, // 00D5 LDCONST R26 K54 - 0x586C0008, // 00D6 LDCONST R27 K8 - 0x7C600600, // 00D7 CALL R24 3 - 0xB8620A00, // 00D8 GETNGBL R24 K5 - 0x8C603106, // 00D9 GETMET R24 R24 K6 - 0x58680037, // 00DA LDCONST R26 K55 - 0x586C0008, // 00DB LDCONST R27 K8 - 0x7C600600, // 00DC CALL R24 3 - 0x70020004, // 00DD JMP #00E3 - 0xB8620A00, // 00DE GETNGBL R24 K5 - 0x8C603106, // 00DF GETMET R24 R24 K6 - 0x58680038, // 00E0 LDCONST R26 K56 - 0x586C0025, // 00E1 LDCONST R27 K37 - 0x7C600600, // 00E2 CALL R24 3 - 0x8C600511, // 00E3 GETMET R24 R2 K17 - 0x7C600200, // 00E4 CALL R24 1 - 0x8C603112, // 00E5 GETMET R24 R24 K18 - 0x88680713, // 00E6 GETMBR R26 R3 K19 - 0x7C600400, // 00E7 CALL R24 2 - 0x8C603112, // 00E8 GETMET R24 R24 K18 - 0x88680714, // 00E9 GETMBR R26 R3 K20 - 0x7C600400, // 00EA CALL R24 2 - 0x8C603112, // 00EB GETMET R24 R24 K18 - 0x88680939, // 00EC GETMBR R26 R4 K57 - 0x7C600400, // 00ED CALL R24 2 - 0x8C603115, // 00EE GETMET R24 R24 K21 - 0x7C600200, // 00EF CALL R24 1 - 0x5C143000, // 00F0 MOVE R5 R24 - 0x4C600000, // 00F1 LDNIL R24 - 0x900E2618, // 00F2 SETMBR R3 K19 R24 - 0x4C600000, // 00F3 LDNIL R24 - 0x900E2818, // 00F4 SETMBR R3 K20 R24 - 0x8C600518, // 00F5 GETMET R24 R2 K24 - 0x7C600200, // 00F6 CALL R24 1 - 0x8C603119, // 00F7 GETMET R24 R24 K25 - 0x8868071A, // 00F8 GETMBR R26 R3 K26 - 0x8C6C071B, // 00F9 GETMET R27 R3 K27 - 0x7C6C0200, // 00FA CALL R27 1 - 0x006C3605, // 00FB ADD R27 R27 R5 - 0x60700015, // 00FC GETGBL R28 G21 - 0x7C700000, // 00FD CALL R28 0 - 0x8C703916, // 00FE GETMET R28 R28 K22 - 0x8878013A, // 00FF GETMBR R30 R0 K58 - 0x7C700400, // 0100 CALL R28 2 - 0x5476002F, // 0101 LDINT R29 48 - 0x7C600A00, // 0102 CALL R24 5 - 0x5466000E, // 0103 LDINT R25 15 - 0x40660619, // 0104 CONNECT R25 K3 R25 - 0x94643019, // 0105 GETIDX R25 R24 R25 - 0x546A000F, // 0106 LDINT R26 16 - 0x546E001E, // 0107 LDINT R27 31 - 0x4068341B, // 0108 CONNECT R26 R26 R27 - 0x9468301A, // 0109 GETIDX R26 R24 R26 - 0x546E001F, // 010A LDINT R27 32 - 0x5472002E, // 010B LDINT R28 47 - 0x406C361C, // 010C CONNECT R27 R27 R28 - 0x946C301B, // 010D GETIDX R27 R24 R27 - 0xB8720A00, // 010E GETNGBL R28 K5 - 0x8C70393B, // 010F GETMET R28 R28 K59 - 0x7C700200, // 0110 CALL R28 1 - 0x9470393C, // 0111 GETIDX R28 R28 K60 - 0x8C740109, // 0112 GETMET R29 R0 K9 - 0x5C7C0200, // 0113 MOVE R31 R1 - 0x58800003, // 0114 LDCONST R32 K3 - 0x58840003, // 0115 LDCONST R33 K3 - 0x58880003, // 0116 LDCONST R34 K3 - 0x508C0200, // 0117 LDBOOL R35 1 0 - 0x7C740C00, // 0118 CALL R29 6 - 0x8C74073D, // 0119 GETMET R29 R3 K61 + 0x900E5015, // 0093 SETMBR R3 K40 R21 + 0x70020002, // 0094 JMP #0098 + 0x8C54292B, // 0095 GETMET R21 R20 K43 + 0x7C540200, // 0096 CALL R21 1 + 0x900E5015, // 0097 SETMBR R3 K40 R21 + 0xB8561A00, // 0098 GETNGBL R21 K13 + 0x88542B24, // 0099 GETMBR R21 R21 K36 + 0x8C542B2C, // 009A GETMET R21 R21 K44 + 0x7C540200, // 009B CALL R21 1 + 0x8C582B2D, // 009C GETMET R22 R21 K45 + 0x5860000A, // 009D LDCONST R24 K10 + 0xB8661A00, // 009E GETNGBL R25 K13 + 0x88643324, // 009F GETMBR R25 R25 K36 + 0x8864332E, // 00A0 GETMBR R25 R25 K46 + 0x5C681C00, // 00A1 MOVE R26 R14 + 0x7C580800, // 00A2 CALL R22 4 + 0x8C582B2D, // 00A3 GETMET R22 R21 K45 + 0x5860000B, // 00A4 LDCONST R24 K11 + 0xB8661A00, // 00A5 GETNGBL R25 K13 + 0x88643324, // 00A6 GETMBR R25 R25 K36 + 0x8864332E, // 00A7 GETMBR R25 R25 K46 + 0x5C681E00, // 00A8 MOVE R26 R15 + 0x7C580800, // 00A9 CALL R22 4 + 0x8C582B2D, // 00AA GETMET R22 R21 K45 + 0x58600008, // 00AB LDCONST R24 K8 + 0xB8661A00, // 00AC GETNGBL R25 K13 + 0x88643324, // 00AD GETMBR R25 R25 K36 + 0x8864332E, // 00AE GETMBR R25 R25 K46 + 0x8868072F, // 00AF GETMBR R26 R3 K47 + 0x7C580800, // 00B0 CALL R22 4 + 0x8C582B2D, // 00B1 GETMET R22 R21 K45 + 0x54620003, // 00B2 LDINT R24 4 + 0xB8661A00, // 00B3 GETNGBL R25 K13 + 0x88643324, // 00B4 GETMBR R25 R25 K36 + 0x8864332E, // 00B5 GETMBR R25 R25 K46 + 0x88680730, // 00B6 GETMBR R26 R3 K48 + 0x7C580800, // 00B7 CALL R22 4 + 0x8C582B31, // 00B8 GETMET R22 R21 K49 + 0x7C580200, // 00B9 CALL R22 1 + 0x8C5C0532, // 00BA GETMET R23 R2 K50 + 0x7C5C0200, // 00BB CALL R23 1 + 0x8C5C2F33, // 00BC GETMET R23 R23 K51 + 0x5C642400, // 00BD MOVE R25 R18 + 0x5C682C00, // 00BE MOVE R26 R22 + 0x5C6C2000, // 00BF MOVE R27 R16 + 0x7C5C0800, // 00C0 CALL R23 4 + 0x5C602E00, // 00C1 MOVE R24 R23 + 0x7462000A, // 00C2 JMPT R24 #00CE + 0xB8620A00, // 00C3 GETNGBL R24 K5 + 0x8C603106, // 00C4 GETMET R24 R24 K6 + 0x58680034, // 00C5 LDCONST R26 K52 + 0x586C000B, // 00C6 LDCONST R27 K11 + 0x7C600600, // 00C7 CALL R24 3 + 0xB8620A00, // 00C8 GETNGBL R24 K5 + 0x8C603106, // 00C9 GETMET R24 R24 K6 + 0x58680035, // 00CA LDCONST R26 K53 + 0x586C000B, // 00CB LDCONST R27 K11 + 0x7C600600, // 00CC CALL R24 3 + 0x70020004, // 00CD JMP #00D3 + 0xB8620A00, // 00CE GETNGBL R24 K5 + 0x8C603106, // 00CF GETMET R24 R24 K6 + 0x58680036, // 00D0 LDCONST R26 K54 + 0x586C0008, // 00D1 LDCONST R27 K8 + 0x7C600600, // 00D2 CALL R24 3 + 0x8C600512, // 00D3 GETMET R24 R2 K18 + 0x7C600200, // 00D4 CALL R24 1 + 0x8C603113, // 00D5 GETMET R24 R24 K19 + 0x88680714, // 00D6 GETMBR R26 R3 K20 + 0x7C600400, // 00D7 CALL R24 2 + 0x8C603113, // 00D8 GETMET R24 R24 K19 + 0x88680715, // 00D9 GETMBR R26 R3 K21 + 0x7C600400, // 00DA CALL R24 2 + 0x8C603113, // 00DB GETMET R24 R24 K19 + 0x88680937, // 00DC GETMBR R26 R4 K55 + 0x7C600400, // 00DD CALL R24 2 + 0x8C603116, // 00DE GETMET R24 R24 K22 + 0x7C600200, // 00DF CALL R24 1 + 0x5C143000, // 00E0 MOVE R5 R24 + 0x4C600000, // 00E1 LDNIL R24 + 0x900E2818, // 00E2 SETMBR R3 K20 R24 + 0x4C600000, // 00E3 LDNIL R24 + 0x900E2A18, // 00E4 SETMBR R3 K21 R24 + 0x8C600519, // 00E5 GETMET R24 R2 K25 + 0x7C600200, // 00E6 CALL R24 1 + 0x8C60311A, // 00E7 GETMET R24 R24 K26 + 0x8868071B, // 00E8 GETMBR R26 R3 K27 + 0x8C6C071C, // 00E9 GETMET R27 R3 K28 + 0x7C6C0200, // 00EA CALL R27 1 + 0x006C3605, // 00EB ADD R27 R27 R5 + 0x60700015, // 00EC GETGBL R28 G21 + 0x7C700000, // 00ED CALL R28 0 + 0x8C703917, // 00EE GETMET R28 R28 K23 + 0x88780138, // 00EF GETMBR R30 R0 K56 + 0x7C700400, // 00F0 CALL R28 2 + 0x5476002F, // 00F1 LDINT R29 48 + 0x7C600A00, // 00F2 CALL R24 5 + 0x5466000E, // 00F3 LDINT R25 15 + 0x40660619, // 00F4 CONNECT R25 K3 R25 + 0x94643019, // 00F5 GETIDX R25 R24 R25 + 0x546A000F, // 00F6 LDINT R26 16 + 0x546E001E, // 00F7 LDINT R27 31 + 0x4068341B, // 00F8 CONNECT R26 R26 R27 + 0x9468301A, // 00F9 GETIDX R26 R24 R26 + 0x546E001F, // 00FA LDINT R27 32 + 0x5472002E, // 00FB LDINT R28 47 + 0x406C361C, // 00FC CONNECT R27 R27 R28 + 0x946C301B, // 00FD GETIDX R27 R24 R27 + 0xB8720A00, // 00FE GETNGBL R28 K5 + 0x8C703939, // 00FF GETMET R28 R28 K57 + 0x7C700200, // 0100 CALL R28 1 + 0x9470393A, // 0101 GETIDX R28 R28 K58 + 0x8C740109, // 0102 GETMET R29 R0 K9 + 0x5C7C0200, // 0103 MOVE R31 R1 + 0x58800003, // 0104 LDCONST R32 K3 + 0x58840003, // 0105 LDCONST R33 K3 + 0x58880003, // 0106 LDCONST R34 K3 + 0x508C0200, // 0107 LDBOOL R35 1 0 + 0x7C740C00, // 0108 CALL R29 6 + 0x8C74073B, // 0109 GETMET R29 R3 K59 + 0x7C740200, // 010A CALL R29 1 + 0x8C74073C, // 010B GETMET R29 R3 K60 + 0x5C7C3200, // 010C MOVE R31 R25 + 0x5C803400, // 010D MOVE R32 R26 + 0x5C843600, // 010E MOVE R33 R27 + 0x5C883800, // 010F MOVE R34 R28 + 0x7C740A00, // 0110 CALL R29 5 + 0x900E7B03, // 0111 SETMBR R3 K61 K3 + 0x8C74073E, // 0112 GETMET R29 R3 K62 + 0x7C740200, // 0113 CALL R29 1 + 0x8C74073F, // 0114 GETMET R29 R3 K63 + 0x507C0200, // 0115 LDBOOL R31 1 0 + 0x7C740400, // 0116 CALL R29 2 + 0x8C740740, // 0117 GETMET R29 R3 K64 + 0x7C740200, // 0118 CALL R29 1 + 0x8C740741, // 0119 GETMET R29 R3 K65 0x7C740200, // 011A CALL R29 1 - 0x8C74073E, // 011B GETMET R29 R3 K62 - 0x5C7C3200, // 011C MOVE R31 R25 - 0x5C803400, // 011D MOVE R32 R26 - 0x5C843600, // 011E MOVE R33 R27 - 0x5C883800, // 011F MOVE R34 R28 - 0x7C740A00, // 0120 CALL R29 5 - 0x900E7F03, // 0121 SETMBR R3 K63 K3 - 0x8C740740, // 0122 GETMET R29 R3 K64 - 0x7C740200, // 0123 CALL R29 1 - 0x8C740741, // 0124 GETMET R29 R3 K65 - 0x507C0200, // 0125 LDBOOL R31 1 0 - 0x7C740400, // 0126 CALL R29 2 - 0x8C740742, // 0127 GETMET R29 R3 K66 - 0x7C740200, // 0128 CALL R29 1 - 0x8C740743, // 0129 GETMET R29 R3 K67 - 0x7C740200, // 012A CALL R29 1 - 0x8C740744, // 012B GETMET R29 R3 K68 - 0x7C740200, // 012C CALL R29 1 - 0x50740200, // 012D LDBOOL R29 1 0 - 0x80043A00, // 012E RET 1 R29 + 0x8C740742, // 011B GETMET R29 R3 K66 + 0x7C740200, // 011C CALL R29 1 + 0x50740200, // 011D LDBOOL R29 1 0 + 0x80043A00, // 011E RET 1 R29 }) ) ); @@ -1281,7 +1272,7 @@ be_local_closure(Matter_Commisioning_Context_process_incoming, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[19]) { /* constants */ + ( &(const bvalue[16]) { /* constants */ /* K0 */ be_nested_str_weak(device), /* K1 */ be_nested_str_weak(is_commissioning_open), /* K2 */ be_nested_str_weak(opcode), @@ -1289,22 +1280,19 @@ be_local_closure(Matter_Commisioning_Context_process_incoming, /* name */ /* K4 */ be_nested_str_weak(log), /* K5 */ be_nested_str_weak(MTR_X3A_X20commissioning_X20not_X20open), /* K6 */ be_const_int(2), - /* K7 */ be_nested_str_weak(MTR_X3A_X20received_X20message_X20), - /* K8 */ be_nested_str_weak(matter), - /* K9 */ be_nested_str_weak(inspect), - /* K10 */ be_nested_str_weak(parse_PBKDFParamRequest), - /* K11 */ be_nested_str_weak(parse_Pake1), - /* K12 */ be_nested_str_weak(parse_Pake3), - /* K13 */ be_nested_str_weak(parse_Sigma1), - /* K14 */ be_nested_str_weak(parse_Sigma3), - /* K15 */ be_nested_str_weak(parse_StatusReport), - /* K16 */ be_nested_str_weak(string), - /* K17 */ be_nested_str_weak(format), - /* K18 */ be_nested_str_weak(MTR_X3A_X20_X3E_X3F_X3F_X3F_X3F_X3F_X3F_X3F_X3F_X3F_X20Unknown_X20OpCode_X20_X28secure_X20channel_X29_X20_X2502X), + /* K7 */ be_nested_str_weak(parse_PBKDFParamRequest), + /* K8 */ be_nested_str_weak(parse_Pake1), + /* K9 */ be_nested_str_weak(parse_Pake3), + /* K10 */ be_nested_str_weak(parse_Sigma1), + /* K11 */ be_nested_str_weak(parse_Sigma3), + /* K12 */ be_nested_str_weak(parse_StatusReport), + /* K13 */ be_nested_str_weak(string), + /* K14 */ be_nested_str_weak(format), + /* K15 */ be_nested_str_weak(MTR_X3A_X20_X3E_X3F_X3F_X3F_X3F_X3F_X3F_X3F_X3F_X3F_X20Unknown_X20OpCode_X20_X28secure_X20channel_X29_X20_X2502X), }), be_str_weak(process_incoming), &be_const_str_solidified, - ( &(const binstruction[100]) { /* code */ + ( &(const binstruction[91]) { /* code */ 0x88080100, // 0000 GETMBR R2 R0 K0 0x8C080501, // 0001 GETMET R2 R2 K1 0x7C080200, // 0002 CALL R2 1 @@ -1324,87 +1312,78 @@ be_local_closure(Matter_Commisioning_Context_process_incoming, /* name */ 0x7C080600, // 0010 CALL R2 3 0x50080000, // 0011 LDBOOL R2 0 0 0x80040400, // 0012 RET 1 R2 - 0xB80A0600, // 0013 GETNGBL R2 K3 - 0x8C080504, // 0014 GETMET R2 R2 K4 - 0xB8121000, // 0015 GETNGBL R4 K8 - 0x8C100909, // 0016 GETMET R4 R4 K9 - 0x5C180200, // 0017 MOVE R6 R1 - 0x7C100400, // 0018 CALL R4 2 - 0x00120E04, // 0019 ADD R4 K7 R4 - 0x54160003, // 001A LDINT R5 4 - 0x7C080600, // 001B CALL R2 3 - 0x88080302, // 001C GETMBR R2 R1 K2 - 0x540E000F, // 001D LDINT R3 16 - 0x1C080403, // 001E EQ R2 R2 R3 - 0x780A0000, // 001F JMPF R2 #0021 - 0x70020040, // 0020 JMP #0062 + 0x88080302, // 0013 GETMBR R2 R1 K2 + 0x540E000F, // 0014 LDINT R3 16 + 0x1C080403, // 0015 EQ R2 R2 R3 + 0x780A0000, // 0016 JMPF R2 #0018 + 0x70020040, // 0017 JMP #0059 + 0x88080302, // 0018 GETMBR R2 R1 K2 + 0x540E001F, // 0019 LDINT R3 32 + 0x1C080403, // 001A EQ R2 R2 R3 + 0x780A0004, // 001B JMPF R2 #0021 + 0x8C080107, // 001C GETMET R2 R0 K7 + 0x5C100200, // 001D MOVE R4 R1 + 0x7C080400, // 001E CALL R2 2 + 0x80040400, // 001F RET 1 R2 + 0x70020037, // 0020 JMP #0059 0x88080302, // 0021 GETMBR R2 R1 K2 - 0x540E001F, // 0022 LDINT R3 32 + 0x540E0021, // 0022 LDINT R3 34 0x1C080403, // 0023 EQ R2 R2 R3 0x780A0004, // 0024 JMPF R2 #002A - 0x8C08010A, // 0025 GETMET R2 R0 K10 + 0x8C080108, // 0025 GETMET R2 R0 K8 0x5C100200, // 0026 MOVE R4 R1 0x7C080400, // 0027 CALL R2 2 0x80040400, // 0028 RET 1 R2 - 0x70020037, // 0029 JMP #0062 + 0x7002002E, // 0029 JMP #0059 0x88080302, // 002A GETMBR R2 R1 K2 - 0x540E0021, // 002B LDINT R3 34 + 0x540E0023, // 002B LDINT R3 36 0x1C080403, // 002C EQ R2 R2 R3 0x780A0004, // 002D JMPF R2 #0033 - 0x8C08010B, // 002E GETMET R2 R0 K11 + 0x8C080109, // 002E GETMET R2 R0 K9 0x5C100200, // 002F MOVE R4 R1 0x7C080400, // 0030 CALL R2 2 0x80040400, // 0031 RET 1 R2 - 0x7002002E, // 0032 JMP #0062 + 0x70020025, // 0032 JMP #0059 0x88080302, // 0033 GETMBR R2 R1 K2 - 0x540E0023, // 0034 LDINT R3 36 + 0x540E002F, // 0034 LDINT R3 48 0x1C080403, // 0035 EQ R2 R2 R3 0x780A0004, // 0036 JMPF R2 #003C - 0x8C08010C, // 0037 GETMET R2 R0 K12 + 0x8C08010A, // 0037 GETMET R2 R0 K10 0x5C100200, // 0038 MOVE R4 R1 0x7C080400, // 0039 CALL R2 2 0x80040400, // 003A RET 1 R2 - 0x70020025, // 003B JMP #0062 + 0x7002001C, // 003B JMP #0059 0x88080302, // 003C GETMBR R2 R1 K2 - 0x540E002F, // 003D LDINT R3 48 + 0x540E0031, // 003D LDINT R3 50 0x1C080403, // 003E EQ R2 R2 R3 0x780A0004, // 003F JMPF R2 #0045 - 0x8C08010D, // 0040 GETMET R2 R0 K13 + 0x8C08010B, // 0040 GETMET R2 R0 K11 0x5C100200, // 0041 MOVE R4 R1 0x7C080400, // 0042 CALL R2 2 0x80040400, // 0043 RET 1 R2 - 0x7002001C, // 0044 JMP #0062 + 0x70020013, // 0044 JMP #0059 0x88080302, // 0045 GETMBR R2 R1 K2 - 0x540E0031, // 0046 LDINT R3 50 + 0x540E003F, // 0046 LDINT R3 64 0x1C080403, // 0047 EQ R2 R2 R3 0x780A0004, // 0048 JMPF R2 #004E - 0x8C08010E, // 0049 GETMET R2 R0 K14 + 0x8C08010C, // 0049 GETMET R2 R0 K12 0x5C100200, // 004A MOVE R4 R1 0x7C080400, // 004B CALL R2 2 0x80040400, // 004C RET 1 R2 - 0x70020013, // 004D JMP #0062 - 0x88080302, // 004E GETMBR R2 R1 K2 - 0x540E003F, // 004F LDINT R3 64 - 0x1C080403, // 0050 EQ R2 R2 R3 - 0x780A0004, // 0051 JMPF R2 #0057 - 0x8C08010F, // 0052 GETMET R2 R0 K15 - 0x5C100200, // 0053 MOVE R4 R1 - 0x7C080400, // 0054 CALL R2 2 - 0x80040400, // 0055 RET 1 R2 - 0x7002000A, // 0056 JMP #0062 - 0xA40A2000, // 0057 IMPORT R2 K16 - 0xB80E0600, // 0058 GETNGBL R3 K3 - 0x8C0C0704, // 0059 GETMET R3 R3 K4 - 0x8C140511, // 005A GETMET R5 R2 K17 - 0x581C0012, // 005B LDCONST R7 K18 - 0x88200302, // 005C GETMBR R8 R1 K2 - 0x7C140600, // 005D CALL R5 3 - 0x58180006, // 005E LDCONST R6 K6 - 0x7C0C0600, // 005F CALL R3 3 - 0x500C0000, // 0060 LDBOOL R3 0 0 - 0x80040600, // 0061 RET 1 R3 - 0x50080000, // 0062 LDBOOL R2 0 0 - 0x80040400, // 0063 RET 1 R2 + 0x7002000A, // 004D JMP #0059 + 0xA40A1A00, // 004E IMPORT R2 K13 + 0xB80E0600, // 004F GETNGBL R3 K3 + 0x8C0C0704, // 0050 GETMET R3 R3 K4 + 0x8C14050E, // 0051 GETMET R5 R2 K14 + 0x581C000F, // 0052 LDCONST R7 K15 + 0x88200302, // 0053 GETMBR R8 R1 K2 + 0x7C140600, // 0054 CALL R5 3 + 0x58180006, // 0055 LDCONST R6 K6 + 0x7C0C0600, // 0056 CALL R3 3 + 0x500C0000, // 0057 LDBOOL R3 0 0 + 0x80040600, // 0058 RET 1 R3 + 0x50080000, // 0059 LDBOOL R2 0 0 + 0x80040400, // 005A RET 1 R2 }) ) ); @@ -1424,7 +1403,7 @@ be_local_closure(Matter_Commisioning_Context_parse_Sigma1, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[130]) { /* constants */ + ( &(const bvalue[106]) { /* constants */ /* K0 */ be_nested_str_weak(crypto), /* K1 */ be_nested_str_weak(string), /* K2 */ be_nested_str_weak(session), @@ -1435,130 +1414,106 @@ be_local_closure(Matter_Commisioning_Context_parse_Sigma1, /* name */ /* K7 */ be_nested_str_weak(tasmota), /* K8 */ be_nested_str_weak(log), /* K9 */ be_nested_str_weak(MTR_X3A_X20StatusReport_X28General_X20Code_X3A_X20FAILURE_X2C_X20ProtocolId_X3A_X20SECURE_CHANNEL_X2C_X20ProtocolCode_X3A_X20INVALID_PARAMETER_X29), - /* K10 */ be_const_int(2), + /* K10 */ be_const_int(3), /* K11 */ be_nested_str_weak(send_status_report), /* K12 */ be_const_int(1), - /* K13 */ be_nested_str_weak(matter), - /* K14 */ be_nested_str_weak(Sigma1), - /* K15 */ be_nested_str_weak(parse), - /* K16 */ be_nested_str_weak(raw), - /* K17 */ be_nested_str_weak(app_payload_idx), - /* K18 */ be_nested_str_weak(format), - /* K19 */ be_nested_str_weak(MTR_X3A_X20sigma1_X3D_X25s), - /* K20 */ be_nested_str_weak(inspect), - /* K21 */ be_nested_str_weak(__initiator_pub), - /* K22 */ be_nested_str_weak(initiatorEphPubKey), - /* K23 */ be_nested_str_weak(resumptionID), - /* K24 */ be_nested_str_weak(initiatorResumeMIC), - /* K25 */ be_nested_str_weak(MTR_X3A_X20is_resumption_X3D_X25i), - /* K26 */ be_nested_str_weak(device), - /* K27 */ be_nested_str_weak(sessions), - /* K28 */ be_nested_str_weak(find_session_by_resumption_id), - /* K29 */ be_nested_str_weak(MTR_X3A_X20session_resumption_X20found_X20session_X3D_X25s_X20session_resumption_X3D_X25s), - /* K30 */ be_nested_str_weak(_fabric), - /* K31 */ be_nested_str_weak(initiatorRandom), - /* K32 */ be_nested_str_weak(fromstring), - /* K33 */ be_nested_str_weak(Sigma1_Resume), - /* K34 */ be_nested_str_weak(HKDF_SHA256), - /* K35 */ be_nested_str_weak(derive), - /* K36 */ be_nested_str_weak(shared_secret), - /* K37 */ be_nested_str_weak(NCASE_SigmaS1), - /* K38 */ be_const_int(2147483647), - /* K39 */ be_nested_str_weak(AES_CCM), - /* K40 */ be_nested_str_weak(decrypt), - /* K41 */ be_nested_str_weak(tag), - /* K42 */ be_nested_str_weak(_source_node_id), - /* K43 */ be_nested_str_weak(source_node_id), - /* K44 */ be_nested_str_weak(set_mode_CASE), - /* K45 */ be_nested_str_weak(__future_initiator_session_id), - /* K46 */ be_nested_str_weak(initiator_session_id), - /* K47 */ be_nested_str_weak(__future_local_session_id), - /* K48 */ be_nested_str_weak(gen_local_session_id), - /* K49 */ be_nested_str_weak(MTR_X3A_X20_X2BSession_X20_X20_X20_X28_X256i_X29_X20from_X20_X27_X5B_X25s_X5D_X3A_X25i_X27), - /* K50 */ be_nested_str_weak(remote_ip), - /* K51 */ be_nested_str_weak(remote_port), - /* K52 */ be_nested_str_weak(resumption_id), - /* K53 */ be_nested_str_weak(random), - /* K54 */ be_nested_str_weak(Sigma2_Resume), - /* K55 */ be_nested_str_weak(NCASE_SigmaS2), - /* K56 */ be_nested_str_weak(Sigma2Resume), - /* K57 */ be_nested_str_weak(responderSessionID), - /* K58 */ be_nested_str_weak(sigma2ResumeMIC), - /* K59 */ be_nested_str_weak(SessionResumptionKeys), - /* K60 */ be_nested_str_weak(rtc), - /* K61 */ be_nested_str_weak(utc), - /* K62 */ be_nested_str_weak(tlv2raw), - /* K63 */ be_nested_str_weak(__Msg1), - /* K64 */ be_nested_str_weak(build_response), - /* K65 */ be_nested_str_weak(encode_frame), - /* K66 */ be_nested_str_weak(responder), - /* K67 */ be_nested_str_weak(send_response_frame), - /* K68 */ be_nested_str_weak(close), - /* K69 */ be_nested_str_weak(set_keys), - /* K70 */ be_nested_str_weak(_breadcrumb), - /* K71 */ be_nested_str_weak(counter_snd_next), - /* K72 */ be_nested_str_weak(set_persist), - /* K73 */ be_nested_str_weak(set_no_expiration), - /* K74 */ be_nested_str_weak(persist_to_fabric), - /* K75 */ be_nested_str_weak(save), - /* K76 */ be_nested_str_weak(find_fabric_by_destination_id), - /* K77 */ be_nested_str_weak(destinationId), - /* K78 */ be_nested_str_weak(MTR_X3A_X20StatusReport_X28GeneralCode_X3A_X20FAILURE_X2C_X20ProtocolId_X3A_X20SECURE_CHANNEL_X2C_X20ProtocolCode_X3A_X20NO_SHARED_TRUST_ROOTS_X29), - /* K79 */ be_nested_str_weak(MTR_X3A_X20fabric_X3D), - /* K80 */ be_nested_str_weak(MTR_X3A_X20no_private_key_X3D), - /* K81 */ be_nested_str_weak(get_pk), - /* K82 */ be_nested_str_weak(tohex), - /* K83 */ be_nested_str_weak(MTR_X3A_X20noc_X20_X20_X20_X20_X20_X20_X20_X20_X20_X20_X20_X3D), - /* K84 */ be_nested_str_weak(get_noc), - /* K85 */ be_nested_str_weak(get_icac), - /* K86 */ be_nested_str_weak(MTR_X3A_X20icac_X20_X20_X20_X20_X20_X20_X20_X20_X20_X20_X3D), - /* K87 */ be_nested_str_weak(MTR_X3A_X20root_ca_cert_X20_X20_X3D), - /* K88 */ be_nested_str_weak(get_ca), - /* K89 */ be_nested_str_weak(__responder_priv), - /* K90 */ be_nested_str_weak(__responder_pub), - /* K91 */ be_nested_str_weak(EC_P256), - /* K92 */ be_nested_str_weak(public_key), - /* K93 */ be_nested_str_weak(MTR_X3A_X20ResponderEph_priv_X20_X20_X3D), - /* K94 */ be_nested_str_weak(MTR_X3A_X20ResponderEph_pub_X20_X20_X3D), - /* K95 */ be_nested_str_weak(shared_key), - /* K96 */ be_nested_str_weak(MTR_X3A_X20_X2A_X20shared_secret_X20_X20_X3D_X20), - /* K97 */ be_nested_str_weak(TLV), - /* K98 */ be_nested_str_weak(Matter_TLV_struct), - /* K99 */ be_nested_str_weak(add_TLV), - /* K100 */ be_nested_str_weak(B2), - /* K101 */ be_const_int(3), - /* K102 */ be_nested_str_weak(ecdsa_sign_sha256), - /* K103 */ be_nested_str_weak(_X2A_X2A_X2A_X2A_X2A_X2A_X2A_X2A_X2A_X2A_X2A_X2A_X2A_X2A_X2A_X2A_X2A_X2A_X2A_X2A_X2A_X2A_X2A_X2A_X2A_X2A_X2A_X2A_X2A_X2A_X2A_X2A_X2A_X2A_X2A_X2A_X2A_X2A_X2A_X2A), - /* K104 */ be_nested_str_weak(MTR_X3A_X20_X2A_X20fabric_X2Eget_pk_X20_X20_X3D_X20), - /* K105 */ be_nested_str_weak(MTR_X3A_X20_X2A_X20sigma2_tbsdata_X20_X20_X3D_X20), - /* K106 */ be_nested_str_weak(MTR_X3A_X20_X2A_X20TBSData2Signature_X20_X20_X3D_X20), - /* K107 */ be_nested_str_weak(Msg1), - /* K108 */ be_nested_str_weak(MTR_X3A_X20_X2A_X20resumptionid_X20_X20_X3D_X20), - /* K109 */ be_nested_str_weak(MTR_X3A_X20_X2A_X20MSG1_X20_X20_X20_X20_X20_X20_X20_X20_X20_X20_X3D_X20), - /* K110 */ be_nested_str_weak(SHA256), - /* K111 */ be_nested_str_weak(update), - /* K112 */ be_nested_str_weak(out), - /* K113 */ be_nested_str_weak(MTR_X3A_X20TranscriptHash_X20_X3D), - /* K114 */ be_nested_str_weak(S2K_Info), - /* K115 */ be_nested_str_weak(get_ipk_group_key), - /* K116 */ be_nested_str_weak(MTR_X3A_X20_X2A_X20SharedSecret_X20_X20_X3D_X20), - /* K117 */ be_nested_str_weak(MTR_X3A_X20_X2A_X20s2k_salt_X20_X20_X20_X20_X20_X20_X3D_X20), - /* K118 */ be_nested_str_weak(MTR_X3A_X20_X2A_X20s2k_X20_X20_X20_X20_X20_X20_X20_X20_X20_X20_X20_X3D_X20), - /* K119 */ be_nested_str_weak(MTR_X3A_X20_X2A_X20TBEData2Raw_X20_X20_X20_X3D_X20), - /* K120 */ be_nested_str_weak(TBEData2_Nonce), - /* K121 */ be_nested_str_weak(encrypt), - /* K122 */ be_nested_str_weak(MTR_X3A_X20_X2A_X20TBEData2Enc_X20_X20_X20_X3D_X20), - /* K123 */ be_nested_str_weak(Sigma2), - /* K124 */ be_nested_str_weak(responderRandom), - /* K125 */ be_nested_str_weak(responderSessionId), - /* K126 */ be_nested_str_weak(responderEphPubKey), - /* K127 */ be_nested_str_weak(encrypted2), - /* K128 */ be_nested_str_weak(MTR_X3A_X20sigma2_X3A_X20), - /* K129 */ be_nested_str_weak(__Msg2), + /* K13 */ be_const_int(2), + /* K14 */ be_nested_str_weak(matter), + /* K15 */ be_nested_str_weak(Sigma1), + /* K16 */ be_nested_str_weak(parse), + /* K17 */ be_nested_str_weak(raw), + /* K18 */ be_nested_str_weak(app_payload_idx), + /* K19 */ be_nested_str_weak(__initiator_pub), + /* K20 */ be_nested_str_weak(initiatorEphPubKey), + /* K21 */ be_nested_str_weak(resumptionID), + /* K22 */ be_nested_str_weak(initiatorResumeMIC), + /* K23 */ be_nested_str_weak(device), + /* K24 */ be_nested_str_weak(sessions), + /* K25 */ be_nested_str_weak(find_session_by_resumption_id), + /* K26 */ be_nested_str_weak(_fabric), + /* K27 */ be_nested_str_weak(initiatorRandom), + /* K28 */ be_nested_str_weak(fromstring), + /* K29 */ be_nested_str_weak(Sigma1_Resume), + /* K30 */ be_nested_str_weak(HKDF_SHA256), + /* K31 */ be_nested_str_weak(derive), + /* K32 */ be_nested_str_weak(shared_secret), + /* K33 */ be_nested_str_weak(NCASE_SigmaS1), + /* K34 */ be_const_int(2147483647), + /* K35 */ be_nested_str_weak(AES_CCM), + /* K36 */ be_nested_str_weak(decrypt), + /* K37 */ be_nested_str_weak(tag), + /* K38 */ be_nested_str_weak(_source_node_id), + /* K39 */ be_nested_str_weak(source_node_id), + /* K40 */ be_nested_str_weak(set_mode_CASE), + /* K41 */ be_nested_str_weak(__future_initiator_session_id), + /* K42 */ be_nested_str_weak(initiator_session_id), + /* K43 */ be_nested_str_weak(__future_local_session_id), + /* K44 */ be_nested_str_weak(gen_local_session_id), + /* K45 */ be_nested_str_weak(format), + /* K46 */ be_nested_str_weak(MTR_X3A_X20New_Session_X28_X256i_X29_X20from_X20_X27_X5B_X25s_X5D_X3A_X25i_X27), + /* K47 */ be_nested_str_weak(remote_ip), + /* K48 */ be_nested_str_weak(remote_port), + /* K49 */ be_nested_str_weak(resumption_id), + /* K50 */ be_nested_str_weak(random), + /* K51 */ be_nested_str_weak(Sigma2_Resume), + /* K52 */ be_nested_str_weak(NCASE_SigmaS2), + /* K53 */ be_nested_str_weak(Sigma2Resume), + /* K54 */ be_nested_str_weak(responderSessionID), + /* K55 */ be_nested_str_weak(sigma2ResumeMIC), + /* K56 */ be_nested_str_weak(SessionResumptionKeys), + /* K57 */ be_nested_str_weak(rtc), + /* K58 */ be_nested_str_weak(utc), + /* K59 */ be_nested_str_weak(tlv2raw), + /* K60 */ be_nested_str_weak(__Msg1), + /* K61 */ be_nested_str_weak(build_response), + /* K62 */ be_nested_str_weak(encode_frame), + /* K63 */ be_nested_str_weak(responder), + /* K64 */ be_nested_str_weak(send_response_frame), + /* K65 */ be_nested_str_weak(close), + /* K66 */ be_nested_str_weak(set_keys), + /* K67 */ be_nested_str_weak(_breadcrumb), + /* K68 */ be_nested_str_weak(counter_snd_next), + /* K69 */ be_nested_str_weak(set_persist), + /* K70 */ be_nested_str_weak(set_no_expiration), + /* K71 */ be_nested_str_weak(persist_to_fabric), + /* K72 */ be_nested_str_weak(save), + /* K73 */ be_nested_str_weak(find_fabric_by_destination_id), + /* K74 */ be_nested_str_weak(destinationId), + /* K75 */ be_nested_str_weak(MTR_X3A_X20StatusReport_X28GeneralCode_X3A_X20FAILURE_X2C_X20ProtocolId_X3A_X20SECURE_CHANNEL_X2C_X20ProtocolCode_X3A_X20NO_SHARED_TRUST_ROOTS_X29), + /* K76 */ be_nested_str_weak(__responder_priv), + /* K77 */ be_nested_str_weak(__responder_pub), + /* K78 */ be_nested_str_weak(EC_P256), + /* K79 */ be_nested_str_weak(public_key), + /* K80 */ be_nested_str_weak(shared_key), + /* K81 */ be_nested_str_weak(TLV), + /* K82 */ be_nested_str_weak(Matter_TLV_struct), + /* K83 */ be_nested_str_weak(add_TLV), + /* K84 */ be_nested_str_weak(B2), + /* K85 */ be_nested_str_weak(get_noc), + /* K86 */ be_nested_str_weak(get_icac), + /* K87 */ be_nested_str_weak(ecdsa_sign_sha256), + /* K88 */ be_nested_str_weak(get_pk), + /* K89 */ be_nested_str_weak(Msg1), + /* K90 */ be_nested_str_weak(SHA256), + /* K91 */ be_nested_str_weak(update), + /* K92 */ be_nested_str_weak(out), + /* K93 */ be_nested_str_weak(S2K_Info), + /* K94 */ be_nested_str_weak(get_ipk_group_key), + /* K95 */ be_nested_str_weak(TBEData2_Nonce), + /* K96 */ be_nested_str_weak(encrypt), + /* K97 */ be_nested_str_weak(Sigma2), + /* K98 */ be_nested_str_weak(responderRandom), + /* K99 */ be_nested_str_weak(responderSessionId), + /* K100 */ be_nested_str_weak(responderEphPubKey), + /* K101 */ be_nested_str_weak(encrypted2), + /* K102 */ be_nested_str_weak(__Msg2), + /* K103 */ be_nested_str_weak(MTR_X3A_X20New_X20Connection_X20_X28CASE_X20id_X3D_X25i_X29_X20from_X20_X5B_X25s_X5D_X3A_X25i), + /* K104 */ be_nested_str_weak(_ip), + /* K105 */ be_nested_str_weak(_port), }), be_str_weak(parse_Sigma1), &be_const_str_solidified, - ( &(const binstruction[689]) { /* code */ + ( &(const binstruction[482]) { /* code */ 0xA40A0000, // 0000 IMPORT R2 K0 0xA40E0200, // 0001 IMPORT R3 K1 0x88100302, // 0002 GETMBR R4 R1 K2 @@ -1581,673 +1536,466 @@ be_local_closure(Matter_Commisioning_Context_parse_Sigma1, /* name */ 0x5C1C0200, // 0013 MOVE R7 R1 0x5820000C, // 0014 LDCONST R8 K12 0x58240005, // 0015 LDCONST R9 K5 - 0x5828000A, // 0016 LDCONST R10 K10 + 0x5828000D, // 0016 LDCONST R10 K13 0x502C0000, // 0017 LDBOOL R11 0 0 0x7C140C00, // 0018 CALL R5 6 0x50140000, // 0019 LDBOOL R5 0 0 0x80040A00, // 001A RET 1 R5 - 0xB8161A00, // 001B GETNGBL R5 K13 - 0x8C140B0E, // 001C GETMET R5 R5 K14 + 0xB8161C00, // 001B GETNGBL R5 K14 + 0x8C140B0F, // 001C GETMET R5 R5 K15 0x7C140200, // 001D CALL R5 1 - 0x8C140B0F, // 001E GETMET R5 R5 K15 - 0x881C0310, // 001F GETMBR R7 R1 K16 - 0x88200311, // 0020 GETMBR R8 R1 K17 + 0x8C140B10, // 001E GETMET R5 R5 K16 + 0x881C0311, // 001F GETMBR R7 R1 K17 + 0x88200312, // 0020 GETMBR R8 R1 K18 0x7C140600, // 0021 CALL R5 3 - 0xB81A0E00, // 0022 GETNGBL R6 K7 - 0x8C180D08, // 0023 GETMET R6 R6 K8 - 0x8C200712, // 0024 GETMET R8 R3 K18 - 0x58280013, // 0025 LDCONST R10 K19 - 0xB82E1A00, // 0026 GETNGBL R11 K13 - 0x8C2C1714, // 0027 GETMET R11 R11 K20 - 0x5C340A00, // 0028 MOVE R13 R5 - 0x7C2C0400, // 0029 CALL R11 2 - 0x7C200600, // 002A CALL R8 3 - 0x54260003, // 002B LDINT R9 4 - 0x7C180600, // 002C CALL R6 3 - 0x88180B16, // 002D GETMBR R6 R5 K22 - 0x90122A06, // 002E SETMBR R4 K21 R6 - 0x88180B17, // 002F GETMBR R6 R5 K23 - 0x4C1C0000, // 0030 LDNIL R7 - 0x20180C07, // 0031 NE R6 R6 R7 - 0x781A0003, // 0032 JMPF R6 #0037 - 0x88180B18, // 0033 GETMBR R6 R5 K24 - 0x4C1C0000, // 0034 LDNIL R7 - 0x20180C07, // 0035 NE R6 R6 R7 - 0x741A0000, // 0036 JMPT R6 #0038 - 0x50180001, // 0037 LDBOOL R6 0 1 - 0x50180200, // 0038 LDBOOL R6 1 0 - 0xB81E0E00, // 0039 GETNGBL R7 K7 - 0x8C1C0F08, // 003A GETMET R7 R7 K8 - 0x8C240712, // 003B GETMET R9 R3 K18 - 0x582C0019, // 003C LDCONST R11 K25 - 0x781A0001, // 003D JMPF R6 #0040 - 0x5830000C, // 003E LDCONST R12 K12 - 0x70020000, // 003F JMP #0041 - 0x58300005, // 0040 LDCONST R12 K5 - 0x7C240600, // 0041 CALL R9 3 - 0x542A0003, // 0042 LDINT R10 4 - 0x7C1C0600, // 0043 CALL R7 3 - 0x50180000, // 0044 LDBOOL R6 0 0 - 0x4C1C0000, // 0045 LDNIL R7 - 0x781A001C, // 0046 JMPF R6 #0064 - 0x8820011A, // 0047 GETMBR R8 R0 K26 - 0x8820111B, // 0048 GETMBR R8 R8 K27 - 0x8C20111C, // 0049 GETMET R8 R8 K28 - 0x88280B17, // 004A GETMBR R10 R5 K23 - 0x7C200400, // 004B CALL R8 2 - 0x5C1C1000, // 004C MOVE R7 R8 - 0xB8220E00, // 004D GETNGBL R8 K7 - 0x8C201108, // 004E GETMET R8 R8 K8 - 0x8C280712, // 004F GETMET R10 R3 K18 - 0x5830001D, // 0050 LDCONST R12 K29 - 0xB8361A00, // 0051 GETNGBL R13 K13 - 0x8C341B14, // 0052 GETMET R13 R13 K20 - 0x5C3C0800, // 0053 MOVE R15 R4 - 0x7C340400, // 0054 CALL R13 2 - 0xB83A1A00, // 0055 GETNGBL R14 K13 - 0x8C381D14, // 0056 GETMET R14 R14 K20 - 0x5C400E00, // 0057 MOVE R16 R7 - 0x7C380400, // 0058 CALL R14 2 - 0x7C280800, // 0059 CALL R10 4 - 0x542E0003, // 005A LDINT R11 4 - 0x7C200600, // 005B CALL R8 3 - 0x4C200000, // 005C LDNIL R8 - 0x1C200E08, // 005D EQ R8 R7 R8 - 0x74220003, // 005E JMPT R8 #0063 - 0x88200F1E, // 005F GETMBR R8 R7 K30 - 0x4C240000, // 0060 LDNIL R9 - 0x1C201009, // 0061 EQ R8 R8 R9 - 0x78220000, // 0062 JMPF R8 #0064 - 0x50180000, // 0063 LDBOOL R6 0 0 - 0x781A00B6, // 0064 JMPF R6 #011C - 0x88200B1F, // 0065 GETMBR R8 R5 K31 - 0x88240B17, // 0066 GETMBR R9 R5 K23 - 0x00201009, // 0067 ADD R8 R8 R9 - 0x60240015, // 0068 GETGBL R9 G21 - 0x7C240000, // 0069 CALL R9 0 - 0x8C241320, // 006A GETMET R9 R9 K32 - 0x582C0021, // 006B LDCONST R11 K33 - 0x7C240400, // 006C CALL R9 2 - 0x8C280522, // 006D GETMET R10 R2 K34 - 0x7C280200, // 006E CALL R10 1 - 0x8C281523, // 006F GETMET R10 R10 K35 - 0x88300F24, // 0070 GETMBR R12 R7 K36 - 0x5C341000, // 0071 MOVE R13 R8 - 0x5C381200, // 0072 MOVE R14 R9 - 0x543E000F, // 0073 LDINT R15 16 - 0x7C280A00, // 0074 CALL R10 5 - 0x602C0015, // 0075 GETGBL R11 G21 - 0x7C2C0000, // 0076 CALL R11 0 - 0x8C2C1720, // 0077 GETMET R11 R11 K32 - 0x58340025, // 0078 LDCONST R13 K37 - 0x7C2C0400, // 0079 CALL R11 2 - 0x5431FFEE, // 007A LDINT R12 -17 - 0x40320A0C, // 007B CONNECT R12 K5 R12 - 0x88340B18, // 007C GETMBR R13 R5 K24 - 0x94301A0C, // 007D GETIDX R12 R13 R12 - 0x5439FFEF, // 007E LDINT R14 -16 - 0x40381D26, // 007F CONNECT R14 R14 K38 - 0x883C0B18, // 0080 GETMBR R15 R5 K24 - 0x94341E0E, // 0081 GETIDX R13 R15 R14 - 0x8C400527, // 0082 GETMET R16 R2 K39 - 0x5C481400, // 0083 MOVE R18 R10 - 0x5C4C1600, // 0084 MOVE R19 R11 - 0x60500015, // 0085 GETGBL R20 G21 - 0x7C500000, // 0086 CALL R20 0 - 0x6054000C, // 0087 GETGBL R21 G12 - 0x5C581800, // 0088 MOVE R22 R12 - 0x7C540200, // 0089 CALL R21 1 - 0x545A000F, // 008A LDINT R22 16 - 0x7C400C00, // 008B CALL R16 6 - 0x5C382000, // 008C MOVE R14 R16 - 0x8C401D28, // 008D GETMET R16 R14 K40 - 0x5C481800, // 008E MOVE R18 R12 - 0x7C400400, // 008F CALL R16 2 - 0x5C3C2000, // 0090 MOVE R15 R16 - 0x8C401D29, // 0091 GETMET R16 R14 K41 - 0x7C400200, // 0092 CALL R16 1 - 0x1C441A10, // 0093 EQ R17 R13 R16 - 0x78460085, // 0094 JMPF R17 #011B - 0x88440F1E, // 0095 GETMBR R17 R7 K30 - 0x90123C11, // 0096 SETMBR R4 K30 R17 - 0x8844032B, // 0097 GETMBR R17 R1 K43 - 0x90125411, // 0098 SETMBR R4 K42 R17 - 0x8C44092C, // 0099 GETMET R17 R4 K44 - 0x7C440200, // 009A CALL R17 1 - 0x88440B2E, // 009B GETMBR R17 R5 K46 - 0x90125A11, // 009C SETMBR R4 K45 R17 - 0x8844011A, // 009D GETMBR R17 R0 K26 - 0x8844231B, // 009E GETMBR R17 R17 K27 - 0x8C442330, // 009F GETMET R17 R17 K48 - 0x7C440200, // 00A0 CALL R17 1 - 0x90125E11, // 00A1 SETMBR R4 K47 R17 - 0xB8460E00, // 00A2 GETNGBL R17 K7 - 0x8C442308, // 00A3 GETMET R17 R17 K8 - 0x8C4C0712, // 00A4 GETMET R19 R3 K18 - 0x58540031, // 00A5 LDCONST R21 K49 - 0x8858092F, // 00A6 GETMBR R22 R4 K47 - 0x885C0332, // 00A7 GETMBR R23 R1 K50 - 0x88600333, // 00A8 GETMBR R24 R1 K51 - 0x7C4C0A00, // 00A9 CALL R19 5 - 0x5850000A, // 00AA LDCONST R20 K10 - 0x7C440600, // 00AB CALL R17 3 - 0x88440F24, // 00AC GETMBR R17 R7 K36 - 0x90124811, // 00AD SETMBR R4 K36 R17 - 0x8C440535, // 00AE GETMET R17 R2 K53 - 0x544E000F, // 00AF LDINT R19 16 - 0x7C440400, // 00B0 CALL R17 2 - 0x90126811, // 00B1 SETMBR R4 K52 R17 - 0x60440015, // 00B2 GETGBL R17 G21 - 0x7C440000, // 00B3 CALL R17 0 - 0x8C442320, // 00B4 GETMET R17 R17 K32 - 0x584C0036, // 00B5 LDCONST R19 K54 - 0x7C440400, // 00B6 CALL R17 2 - 0x88480B1F, // 00B7 GETMBR R18 R5 K31 - 0x884C0934, // 00B8 GETMBR R19 R4 K52 - 0x00482413, // 00B9 ADD R18 R18 R19 - 0x8C4C0522, // 00BA GETMET R19 R2 K34 - 0x7C4C0200, // 00BB CALL R19 1 - 0x8C4C2723, // 00BC GETMET R19 R19 K35 - 0x88540924, // 00BD GETMBR R21 R4 K36 - 0x5C582400, // 00BE MOVE R22 R18 - 0x5C5C2200, // 00BF MOVE R23 R17 - 0x5462000F, // 00C0 LDINT R24 16 - 0x7C4C0A00, // 00C1 CALL R19 5 - 0x8C500527, // 00C2 GETMET R20 R2 K39 - 0x5C582600, // 00C3 MOVE R22 R19 - 0x605C0015, // 00C4 GETGBL R23 G21 - 0x7C5C0000, // 00C5 CALL R23 0 - 0x8C5C2F20, // 00C6 GETMET R23 R23 K32 - 0x58640037, // 00C7 LDCONST R25 K55 - 0x7C5C0400, // 00C8 CALL R23 2 - 0x60600015, // 00C9 GETGBL R24 G21 - 0x7C600000, // 00CA CALL R24 0 - 0x58640005, // 00CB LDCONST R25 K5 - 0x546A000F, // 00CC LDINT R26 16 - 0x7C500C00, // 00CD CALL R20 6 - 0x8C542929, // 00CE GETMET R21 R20 K41 - 0x7C540200, // 00CF CALL R21 1 - 0xB85A1A00, // 00D0 GETNGBL R22 K13 - 0x8C582D38, // 00D1 GETMET R22 R22 K56 - 0x7C580200, // 00D2 CALL R22 1 - 0x885C0934, // 00D3 GETMBR R23 R4 K52 - 0x905A2E17, // 00D4 SETMBR R22 K23 R23 - 0x885C092F, // 00D5 GETMBR R23 R4 K47 - 0x905A7217, // 00D6 SETMBR R22 K57 R23 - 0x905A7415, // 00D7 SETMBR R22 K58 R21 - 0x8C5C0522, // 00D8 GETMET R23 R2 K34 - 0x7C5C0200, // 00D9 CALL R23 1 - 0x8C5C2F23, // 00DA GETMET R23 R23 K35 - 0x88640924, // 00DB GETMBR R25 R4 K36 - 0x88680B1F, // 00DC GETMBR R26 R5 K31 - 0x886C0934, // 00DD GETMBR R27 R4 K52 - 0x0068341B, // 00DE ADD R26 R26 R27 - 0x606C0015, // 00DF GETGBL R27 G21 - 0x7C6C0000, // 00E0 CALL R27 0 - 0x8C6C3720, // 00E1 GETMET R27 R27 K32 - 0x5874003B, // 00E2 LDCONST R29 K59 - 0x7C6C0400, // 00E3 CALL R27 2 - 0x5472002F, // 00E4 LDINT R28 48 - 0x7C5C0A00, // 00E5 CALL R23 5 - 0x5462000E, // 00E6 LDINT R24 15 - 0x40620A18, // 00E7 CONNECT R24 K5 R24 - 0x94602E18, // 00E8 GETIDX R24 R23 R24 - 0x5466000F, // 00E9 LDINT R25 16 - 0x546A001E, // 00EA LDINT R26 31 - 0x4064321A, // 00EB CONNECT R25 R25 R26 - 0x94642E19, // 00EC GETIDX R25 R23 R25 - 0x546A001F, // 00ED LDINT R26 32 - 0x546E002E, // 00EE LDINT R27 47 - 0x4068341B, // 00EF CONNECT R26 R26 R27 - 0x94682E1A, // 00F0 GETIDX R26 R23 R26 - 0xB86E0E00, // 00F1 GETNGBL R27 K7 - 0x8C6C373C, // 00F2 GETMET R27 R27 K60 - 0x7C6C0200, // 00F3 CALL R27 1 - 0x946C373D, // 00F4 GETIDX R27 R27 K61 - 0x8C702D3E, // 00F5 GETMET R28 R22 K62 - 0x7C700200, // 00F6 CALL R28 1 - 0x4C740000, // 00F7 LDNIL R29 - 0x90127E1D, // 00F8 SETMBR R4 K63 R29 - 0x8C740340, // 00F9 GETMET R29 R1 K64 - 0x547E0032, // 00FA LDINT R31 51 - 0x50800200, // 00FB LDBOOL R32 1 0 - 0x7C740600, // 00FC CALL R29 3 - 0x8C783B41, // 00FD GETMET R30 R29 K65 - 0x5C803800, // 00FE MOVE R32 R28 - 0x7C780400, // 00FF CALL R30 2 - 0x887C0142, // 0100 GETMBR R31 R0 K66 - 0x8C7C3F43, // 0101 GETMET R31 R31 K67 - 0x5C843A00, // 0102 MOVE R33 R29 - 0x7C7C0400, // 0103 CALL R31 2 - 0x8C7C0944, // 0104 GETMET R31 R4 K68 - 0x7C7C0200, // 0105 CALL R31 1 - 0x8C7C0945, // 0106 GETMET R31 R4 K69 - 0x5C843000, // 0107 MOVE R33 R24 - 0x5C883200, // 0108 MOVE R34 R25 - 0x5C8C3400, // 0109 MOVE R35 R26 - 0x5C903600, // 010A MOVE R36 R27 - 0x7C7C0A00, // 010B CALL R31 5 - 0x90128D05, // 010C SETMBR R4 K70 K5 - 0x8C7C0947, // 010D GETMET R31 R4 K71 - 0x7C7C0200, // 010E CALL R31 1 - 0x8C7C0948, // 010F GETMET R31 R4 K72 - 0x50840200, // 0110 LDBOOL R33 1 0 - 0x7C7C0400, // 0111 CALL R31 2 - 0x8C7C0949, // 0112 GETMET R31 R4 K73 - 0x7C7C0200, // 0113 CALL R31 1 - 0x8C7C094A, // 0114 GETMET R31 R4 K74 - 0x7C7C0200, // 0115 CALL R31 1 - 0x8C7C094B, // 0116 GETMET R31 R4 K75 - 0x7C7C0200, // 0117 CALL R31 1 - 0x507C0200, // 0118 LDBOOL R31 1 0 - 0x80043E00, // 0119 RET 1 R31 - 0x70020000, // 011A JMP #011C - 0x50180000, // 011B LDBOOL R6 0 0 - 0x5C200C00, // 011C MOVE R8 R6 - 0x74220190, // 011D JMPT R8 #02AF - 0x8C20014C, // 011E GETMET R8 R0 K76 - 0x88280B4D, // 011F GETMBR R10 R5 K77 - 0x882C0B1F, // 0120 GETMBR R11 R5 K31 - 0x7C200600, // 0121 CALL R8 3 - 0x90123C08, // 0122 SETMBR R4 K30 R8 - 0x4C240000, // 0123 LDNIL R9 - 0x1C240809, // 0124 EQ R9 R4 R9 - 0x74260003, // 0125 JMPT R9 #012A - 0x8824091E, // 0126 GETMBR R9 R4 K30 - 0x4C280000, // 0127 LDNIL R10 - 0x1C24120A, // 0128 EQ R9 R9 R10 - 0x7826000D, // 0129 JMPF R9 #0138 - 0xB8260E00, // 012A GETNGBL R9 K7 - 0x8C241308, // 012B GETMET R9 R9 K8 - 0x582C004E, // 012C LDCONST R11 K78 - 0x5830000A, // 012D LDCONST R12 K10 - 0x7C240600, // 012E CALL R9 3 - 0x8C24010B, // 012F GETMET R9 R0 K11 - 0x5C2C0200, // 0130 MOVE R11 R1 - 0x5830000C, // 0131 LDCONST R12 K12 - 0x58340005, // 0132 LDCONST R13 K5 - 0x5838000C, // 0133 LDCONST R14 K12 - 0x503C0000, // 0134 LDBOOL R15 0 0 - 0x7C240C00, // 0135 CALL R9 6 - 0x50240000, // 0136 LDBOOL R9 0 0 - 0x80041200, // 0137 RET 1 R9 - 0x8824032B, // 0138 GETMBR R9 R1 K43 - 0x90125409, // 0139 SETMBR R4 K42 R9 - 0x8C24092C, // 013A GETMET R9 R4 K44 - 0x7C240200, // 013B CALL R9 1 - 0x88240B2E, // 013C GETMBR R9 R5 K46 - 0x90125A09, // 013D SETMBR R4 K45 R9 - 0x8824011A, // 013E GETMBR R9 R0 K26 - 0x8824131B, // 013F GETMBR R9 R9 K27 - 0x8C241330, // 0140 GETMET R9 R9 K48 - 0x7C240200, // 0141 CALL R9 1 - 0x90125E09, // 0142 SETMBR R4 K47 R9 - 0xB8260E00, // 0143 GETNGBL R9 K7 - 0x8C241308, // 0144 GETMET R9 R9 K8 - 0x8C2C0712, // 0145 GETMET R11 R3 K18 - 0x58340031, // 0146 LDCONST R13 K49 - 0x8838092F, // 0147 GETMBR R14 R4 K47 - 0x883C0332, // 0148 GETMBR R15 R1 K50 - 0x88400333, // 0149 GETMBR R16 R1 K51 - 0x7C2C0A00, // 014A CALL R11 5 - 0x5830000A, // 014B LDCONST R12 K10 - 0x7C240600, // 014C CALL R9 3 - 0xB8260E00, // 014D GETNGBL R9 K7 - 0x8C241308, // 014E GETMET R9 R9 K8 - 0xB82E1A00, // 014F GETNGBL R11 K13 - 0x8C2C1714, // 0150 GETMET R11 R11 K20 - 0x8834091E, // 0151 GETMBR R13 R4 K30 - 0x7C2C0400, // 0152 CALL R11 2 - 0x002E9E0B, // 0153 ADD R11 K79 R11 - 0x54320003, // 0154 LDINT R12 4 - 0x7C240600, // 0155 CALL R9 3 - 0xB8260E00, // 0156 GETNGBL R9 K7 - 0x8C241308, // 0157 GETMET R9 R9 K8 - 0x8C2C0951, // 0158 GETMET R11 R4 K81 - 0x7C2C0200, // 0159 CALL R11 1 - 0x8C2C1752, // 015A GETMET R11 R11 K82 - 0x7C2C0200, // 015B CALL R11 1 - 0x002EA00B, // 015C ADD R11 K80 R11 - 0x54320003, // 015D LDINT R12 4 - 0x7C240600, // 015E CALL R9 3 - 0xB8260E00, // 015F GETNGBL R9 K7 - 0x8C241308, // 0160 GETMET R9 R9 K8 - 0x8C2C0954, // 0161 GETMET R11 R4 K84 - 0x7C2C0200, // 0162 CALL R11 1 - 0x8C2C1752, // 0163 GETMET R11 R11 K82 - 0x7C2C0200, // 0164 CALL R11 1 - 0x002EA60B, // 0165 ADD R11 K83 R11 - 0x54320003, // 0166 LDINT R12 4 - 0x7C240600, // 0167 CALL R9 3 - 0x8C241155, // 0168 GETMET R9 R8 K85 - 0x7C240200, // 0169 CALL R9 1 - 0x78260008, // 016A JMPF R9 #0174 - 0xB8260E00, // 016B GETNGBL R9 K7 - 0x8C241308, // 016C GETMET R9 R9 K8 - 0x8C2C1155, // 016D GETMET R11 R8 K85 - 0x7C2C0200, // 016E CALL R11 1 - 0x8C2C1752, // 016F GETMET R11 R11 K82 - 0x7C2C0200, // 0170 CALL R11 1 - 0x002EAC0B, // 0171 ADD R11 K86 R11 - 0x54320003, // 0172 LDINT R12 4 - 0x7C240600, // 0173 CALL R9 3 - 0xB8260E00, // 0174 GETNGBL R9 K7 - 0x8C241308, // 0175 GETMET R9 R9 K8 - 0x8C2C1158, // 0176 GETMET R11 R8 K88 - 0x7C2C0200, // 0177 CALL R11 1 - 0x8C2C1752, // 0178 GETMET R11 R11 K82 - 0x7C2C0200, // 0179 CALL R11 1 - 0x002EAE0B, // 017A ADD R11 K87 R11 - 0x54320003, // 017B LDINT R12 4 - 0x7C240600, // 017C CALL R9 3 - 0x8C240535, // 017D GETMET R9 R2 K53 - 0x542E000F, // 017E LDINT R11 16 - 0x7C240400, // 017F CALL R9 2 - 0x90126809, // 0180 SETMBR R4 K52 R9 - 0x8C240535, // 0181 GETMET R9 R2 K53 - 0x542E001F, // 0182 LDINT R11 32 - 0x7C240400, // 0183 CALL R9 2 - 0x9012B209, // 0184 SETMBR R4 K89 R9 - 0x8C24055B, // 0185 GETMET R9 R2 K91 - 0x7C240200, // 0186 CALL R9 1 - 0x8C24135C, // 0187 GETMET R9 R9 K92 - 0x882C0959, // 0188 GETMBR R11 R4 K89 - 0x7C240400, // 0189 CALL R9 2 - 0x9012B409, // 018A SETMBR R4 K90 R9 - 0xB8260E00, // 018B GETNGBL R9 K7 - 0x8C241308, // 018C GETMET R9 R9 K8 - 0x882C0959, // 018D GETMBR R11 R4 K89 - 0x8C2C1752, // 018E GETMET R11 R11 K82 - 0x7C2C0200, // 018F CALL R11 1 - 0x002EBA0B, // 0190 ADD R11 K93 R11 - 0x54320003, // 0191 LDINT R12 4 - 0x7C240600, // 0192 CALL R9 3 - 0xB8260E00, // 0193 GETNGBL R9 K7 - 0x8C241308, // 0194 GETMET R9 R9 K8 - 0x882C095A, // 0195 GETMBR R11 R4 K90 - 0x8C2C1752, // 0196 GETMET R11 R11 K82 - 0x7C2C0200, // 0197 CALL R11 1 - 0x002EBC0B, // 0198 ADD R11 K94 R11 - 0x54320003, // 0199 LDINT R12 4 - 0x7C240600, // 019A CALL R9 3 - 0x8C240535, // 019B GETMET R9 R2 K53 - 0x542E001F, // 019C LDINT R11 32 - 0x7C240400, // 019D CALL R9 2 - 0x8C28055B, // 019E GETMET R10 R2 K91 - 0x7C280200, // 019F CALL R10 1 - 0x8C28155F, // 01A0 GETMET R10 R10 K95 - 0x88300959, // 01A1 GETMBR R12 R4 K89 - 0x88340B16, // 01A2 GETMBR R13 R5 K22 - 0x7C280600, // 01A3 CALL R10 3 - 0x9012480A, // 01A4 SETMBR R4 K36 R10 - 0xB82A0E00, // 01A5 GETNGBL R10 K7 - 0x8C281508, // 01A6 GETMET R10 R10 K8 - 0x88300924, // 01A7 GETMBR R12 R4 K36 - 0x8C301952, // 01A8 GETMET R12 R12 K82 - 0x7C300200, // 01A9 CALL R12 1 - 0x0032C00C, // 01AA ADD R12 K96 R12 - 0x54360003, // 01AB LDINT R13 4 - 0x7C280600, // 01AC CALL R10 3 - 0xB82A1A00, // 01AD GETNGBL R10 K13 - 0x88281561, // 01AE GETMBR R10 R10 K97 - 0x8C281562, // 01AF GETMET R10 R10 K98 - 0x7C280200, // 01B0 CALL R10 1 - 0x8C2C1563, // 01B1 GETMET R11 R10 K99 - 0x5834000C, // 01B2 LDCONST R13 K12 - 0xB83A1A00, // 01B3 GETNGBL R14 K13 - 0x88381D61, // 01B4 GETMBR R14 R14 K97 - 0x88381D64, // 01B5 GETMBR R14 R14 K100 - 0x8C3C1154, // 01B6 GETMET R15 R8 K84 - 0x7C3C0200, // 01B7 CALL R15 1 - 0x7C2C0800, // 01B8 CALL R11 4 - 0x8C2C1563, // 01B9 GETMET R11 R10 K99 - 0x5834000A, // 01BA LDCONST R13 K10 - 0xB83A1A00, // 01BB GETNGBL R14 K13 - 0x88381D61, // 01BC GETMBR R14 R14 K97 - 0x88381D64, // 01BD GETMBR R14 R14 K100 - 0x8C3C1155, // 01BE GETMET R15 R8 K85 - 0x7C3C0200, // 01BF CALL R15 1 - 0x7C2C0800, // 01C0 CALL R11 4 - 0x8C2C1563, // 01C1 GETMET R11 R10 K99 - 0x58340065, // 01C2 LDCONST R13 K101 - 0xB83A1A00, // 01C3 GETNGBL R14 K13 - 0x88381D61, // 01C4 GETMBR R14 R14 K97 - 0x88381D64, // 01C5 GETMBR R14 R14 K100 - 0x883C095A, // 01C6 GETMBR R15 R4 K90 - 0x7C2C0800, // 01C7 CALL R11 4 - 0x8C2C1563, // 01C8 GETMET R11 R10 K99 - 0x54360003, // 01C9 LDINT R13 4 - 0xB83A1A00, // 01CA GETNGBL R14 K13 - 0x88381D61, // 01CB GETMBR R14 R14 K97 - 0x88381D64, // 01CC GETMBR R14 R14 K100 - 0x883C0B16, // 01CD GETMBR R15 R5 K22 - 0x7C2C0800, // 01CE CALL R11 4 - 0x8C2C055B, // 01CF GETMET R11 R2 K91 - 0x7C2C0200, // 01D0 CALL R11 1 - 0x8C2C1766, // 01D1 GETMET R11 R11 K102 - 0x8C341151, // 01D2 GETMET R13 R8 K81 - 0x7C340200, // 01D3 CALL R13 1 - 0x8C38153E, // 01D4 GETMET R14 R10 K62 - 0x7C380200, // 01D5 CALL R14 1 - 0x7C2C0600, // 01D6 CALL R11 3 - 0xB8320E00, // 01D7 GETNGBL R12 K7 - 0x8C301908, // 01D8 GETMET R12 R12 K8 - 0x58380067, // 01D9 LDCONST R14 K103 - 0x543E0003, // 01DA LDINT R15 4 - 0x7C300600, // 01DB CALL R12 3 - 0xB8320E00, // 01DC GETNGBL R12 K7 - 0x8C301908, // 01DD GETMET R12 R12 K8 - 0x60380008, // 01DE GETGBL R14 G8 - 0x8C3C1151, // 01DF GETMET R15 R8 K81 - 0x7C3C0200, // 01E0 CALL R15 1 - 0x7C380200, // 01E1 CALL R14 1 - 0x003AD00E, // 01E2 ADD R14 K104 R14 - 0x543E0003, // 01E3 LDINT R15 4 - 0x7C300600, // 01E4 CALL R12 3 - 0xB8320E00, // 01E5 GETNGBL R12 K7 - 0x8C301908, // 01E6 GETMET R12 R12 K8 - 0x60380008, // 01E7 GETGBL R14 G8 - 0x5C3C1400, // 01E8 MOVE R15 R10 - 0x7C380200, // 01E9 CALL R14 1 - 0x003AD20E, // 01EA ADD R14 K105 R14 - 0x543E0003, // 01EB LDINT R15 4 - 0x7C300600, // 01EC CALL R12 3 - 0xB8320E00, // 01ED GETNGBL R12 K7 - 0x8C301908, // 01EE GETMET R12 R12 K8 - 0x8C381752, // 01EF GETMET R14 R11 K82 - 0x7C380200, // 01F0 CALL R14 1 - 0x003AD40E, // 01F1 ADD R14 K106 R14 - 0x543E0003, // 01F2 LDINT R15 4 - 0x7C300600, // 01F3 CALL R12 3 - 0xB8321A00, // 01F4 GETNGBL R12 K13 - 0x88301961, // 01F5 GETMBR R12 R12 K97 - 0x8C301962, // 01F6 GETMET R12 R12 K98 - 0x7C300200, // 01F7 CALL R12 1 - 0x8C341963, // 01F8 GETMET R13 R12 K99 - 0x583C000C, // 01F9 LDCONST R15 K12 - 0xB8421A00, // 01FA GETNGBL R16 K13 - 0x88402161, // 01FB GETMBR R16 R16 K97 - 0x88402164, // 01FC GETMBR R16 R16 K100 - 0x8C441154, // 01FD GETMET R17 R8 K84 - 0x7C440200, // 01FE CALL R17 1 - 0x7C340800, // 01FF CALL R13 4 - 0x8C341963, // 0200 GETMET R13 R12 K99 - 0x583C000A, // 0201 LDCONST R15 K10 - 0xB8421A00, // 0202 GETNGBL R16 K13 - 0x88402161, // 0203 GETMBR R16 R16 K97 - 0x88402164, // 0204 GETMBR R16 R16 K100 - 0x8C441155, // 0205 GETMET R17 R8 K85 - 0x7C440200, // 0206 CALL R17 1 - 0x7C340800, // 0207 CALL R13 4 - 0x8C341963, // 0208 GETMET R13 R12 K99 - 0x583C0065, // 0209 LDCONST R15 K101 - 0xB8421A00, // 020A GETNGBL R16 K13 - 0x88402161, // 020B GETMBR R16 R16 K97 - 0x88402164, // 020C GETMBR R16 R16 K100 - 0x5C441600, // 020D MOVE R17 R11 - 0x7C340800, // 020E CALL R13 4 - 0x8C341963, // 020F GETMET R13 R12 K99 - 0x543E0003, // 0210 LDINT R15 4 - 0xB8421A00, // 0211 GETNGBL R16 K13 - 0x88402161, // 0212 GETMBR R16 R16 K97 - 0x88402164, // 0213 GETMBR R16 R16 K100 - 0x88440934, // 0214 GETMBR R17 R4 K52 - 0x7C340800, // 0215 CALL R13 4 - 0xB8360E00, // 0216 GETNGBL R13 K7 - 0x8C341B08, // 0217 GETMET R13 R13 K8 - 0x583C0067, // 0218 LDCONST R15 K103 - 0x54420003, // 0219 LDINT R16 4 - 0x7C340600, // 021A CALL R13 3 - 0x88340B6B, // 021B GETMBR R13 R5 K107 - 0x90127E0D, // 021C SETMBR R4 K63 R13 - 0xB8360E00, // 021D GETNGBL R13 K7 - 0x8C341B08, // 021E GETMET R13 R13 K8 - 0x883C0934, // 021F GETMBR R15 R4 K52 - 0x8C3C1F52, // 0220 GETMET R15 R15 K82 - 0x7C3C0200, // 0221 CALL R15 1 - 0x003ED80F, // 0222 ADD R15 K108 R15 - 0x54420003, // 0223 LDINT R16 4 - 0x7C340600, // 0224 CALL R13 3 - 0xB8360E00, // 0225 GETNGBL R13 K7 - 0x8C341B08, // 0226 GETMET R13 R13 K8 - 0x883C093F, // 0227 GETMBR R15 R4 K63 - 0x8C3C1F52, // 0228 GETMET R15 R15 K82 - 0x7C3C0200, // 0229 CALL R15 1 - 0x003EDA0F, // 022A ADD R15 K109 R15 - 0x54420003, // 022B LDINT R16 4 - 0x7C340600, // 022C CALL R13 3 - 0x8C34056E, // 022D GETMET R13 R2 K110 - 0x7C340200, // 022E CALL R13 1 - 0x8C341B6F, // 022F GETMET R13 R13 K111 - 0x883C093F, // 0230 GETMBR R15 R4 K63 - 0x7C340400, // 0231 CALL R13 2 - 0x8C341B70, // 0232 GETMET R13 R13 K112 - 0x7C340200, // 0233 CALL R13 1 - 0xB83A0E00, // 0234 GETNGBL R14 K7 - 0x8C381D08, // 0235 GETMET R14 R14 K8 - 0x8C401B52, // 0236 GETMET R16 R13 K82 - 0x7C400200, // 0237 CALL R16 1 - 0x0042E210, // 0238 ADD R16 K113 R16 - 0x54460003, // 0239 LDINT R17 4 - 0x7C380600, // 023A CALL R14 3 - 0x60380015, // 023B GETGBL R14 G21 - 0x7C380000, // 023C CALL R14 0 - 0x8C381D20, // 023D GETMET R14 R14 K32 - 0x88400172, // 023E GETMBR R16 R0 K114 - 0x7C380400, // 023F CALL R14 2 - 0x8C3C1173, // 0240 GETMET R15 R8 K115 - 0x7C3C0200, // 0241 CALL R15 1 - 0x003C1E09, // 0242 ADD R15 R15 R9 - 0x8840095A, // 0243 GETMBR R16 R4 K90 - 0x003C1E10, // 0244 ADD R15 R15 R16 - 0x003C1E0D, // 0245 ADD R15 R15 R13 - 0x8C400522, // 0246 GETMET R16 R2 K34 - 0x7C400200, // 0247 CALL R16 1 - 0x8C402123, // 0248 GETMET R16 R16 K35 - 0x88480924, // 0249 GETMBR R18 R4 K36 - 0x5C4C1E00, // 024A MOVE R19 R15 - 0x5C501C00, // 024B MOVE R20 R14 - 0x5456000F, // 024C LDINT R21 16 - 0x7C400A00, // 024D CALL R16 5 - 0xB8460E00, // 024E GETNGBL R17 K7 - 0x8C442308, // 024F GETMET R17 R17 K8 - 0x884C0924, // 0250 GETMBR R19 R4 K36 - 0x8C4C2752, // 0251 GETMET R19 R19 K82 - 0x7C4C0200, // 0252 CALL R19 1 - 0x004EE813, // 0253 ADD R19 K116 R19 - 0x54520003, // 0254 LDINT R20 4 - 0x7C440600, // 0255 CALL R17 3 - 0xB8460E00, // 0256 GETNGBL R17 K7 - 0x8C442308, // 0257 GETMET R17 R17 K8 - 0x8C4C1F52, // 0258 GETMET R19 R15 K82 - 0x7C4C0200, // 0259 CALL R19 1 - 0x004EEA13, // 025A ADD R19 K117 R19 - 0x54520003, // 025B LDINT R20 4 - 0x7C440600, // 025C CALL R17 3 - 0xB8460E00, // 025D GETNGBL R17 K7 - 0x8C442308, // 025E GETMET R17 R17 K8 - 0x8C4C2152, // 025F GETMET R19 R16 K82 - 0x7C4C0200, // 0260 CALL R19 1 - 0x004EEC13, // 0261 ADD R19 K118 R19 - 0x54520003, // 0262 LDINT R20 4 - 0x7C440600, // 0263 CALL R17 3 - 0x8C44193E, // 0264 GETMET R17 R12 K62 - 0x7C440200, // 0265 CALL R17 1 - 0xB84A0E00, // 0266 GETNGBL R18 K7 - 0x8C482508, // 0267 GETMET R18 R18 K8 - 0x8C502352, // 0268 GETMET R20 R17 K82 - 0x7C500200, // 0269 CALL R20 1 - 0x0052EE14, // 026A ADD R20 K119 R20 - 0x54560003, // 026B LDINT R21 4 - 0x7C480600, // 026C CALL R18 3 - 0x8C480527, // 026D GETMET R18 R2 K39 - 0x5C502000, // 026E MOVE R20 R16 - 0x60540015, // 026F GETGBL R21 G21 - 0x7C540000, // 0270 CALL R21 0 - 0x8C542B20, // 0271 GETMET R21 R21 K32 - 0x885C0178, // 0272 GETMBR R23 R0 K120 - 0x7C540400, // 0273 CALL R21 2 - 0x60580015, // 0274 GETGBL R22 G21 - 0x7C580000, // 0275 CALL R22 0 - 0x605C000C, // 0276 GETGBL R23 G12 - 0x5C602200, // 0277 MOVE R24 R17 - 0x7C5C0200, // 0278 CALL R23 1 - 0x5462000F, // 0279 LDINT R24 16 - 0x7C480C00, // 027A CALL R18 6 - 0x8C4C2579, // 027B GETMET R19 R18 K121 - 0x5C542200, // 027C MOVE R21 R17 - 0x7C4C0400, // 027D CALL R19 2 - 0x8C502529, // 027E GETMET R20 R18 K41 - 0x7C500200, // 027F CALL R20 1 - 0x004C2614, // 0280 ADD R19 R19 R20 - 0xB8520E00, // 0281 GETNGBL R20 K7 - 0x8C502908, // 0282 GETMET R20 R20 K8 - 0x8C582752, // 0283 GETMET R22 R19 K82 - 0x7C580200, // 0284 CALL R22 1 - 0x005AF416, // 0285 ADD R22 K122 R22 - 0x545E0003, // 0286 LDINT R23 4 - 0x7C500600, // 0287 CALL R20 3 - 0xB8520E00, // 0288 GETNGBL R20 K7 - 0x8C502908, // 0289 GETMET R20 R20 K8 - 0x58580067, // 028A LDCONST R22 K103 - 0x545E0003, // 028B LDINT R23 4 - 0x7C500600, // 028C CALL R20 3 - 0xB8521A00, // 028D GETNGBL R20 K13 - 0x8C50297B, // 028E GETMET R20 R20 K123 - 0x7C500200, // 028F CALL R20 1 - 0x9052F809, // 0290 SETMBR R20 K124 R9 - 0x8854092F, // 0291 GETMBR R21 R4 K47 - 0x9052FA15, // 0292 SETMBR R20 K125 R21 - 0x8854095A, // 0293 GETMBR R21 R4 K90 - 0x9052FC15, // 0294 SETMBR R20 K126 R21 - 0x9052FE13, // 0295 SETMBR R20 K127 R19 - 0xB8560E00, // 0296 GETNGBL R21 K7 - 0x8C542B08, // 0297 GETMET R21 R21 K8 - 0xB85E1A00, // 0298 GETNGBL R23 K13 - 0x8C5C2F14, // 0299 GETMET R23 R23 K20 - 0x5C642800, // 029A MOVE R25 R20 - 0x7C5C0400, // 029B CALL R23 2 - 0x005F0017, // 029C ADD R23 K128 R23 - 0x54620003, // 029D LDINT R24 4 - 0x7C540600, // 029E CALL R21 3 - 0x8C54293E, // 029F GETMET R21 R20 K62 - 0x7C540200, // 02A0 CALL R21 1 - 0x90130215, // 02A1 SETMBR R4 K129 R21 - 0x8C580340, // 02A2 GETMET R22 R1 K64 - 0x54620030, // 02A3 LDINT R24 49 - 0x50640200, // 02A4 LDBOOL R25 1 0 - 0x7C580600, // 02A5 CALL R22 3 - 0x8C5C2D41, // 02A6 GETMET R23 R22 K65 - 0x5C642A00, // 02A7 MOVE R25 R21 - 0x7C5C0400, // 02A8 CALL R23 2 - 0x88600142, // 02A9 GETMBR R24 R0 K66 - 0x8C603143, // 02AA GETMET R24 R24 K67 - 0x5C682C00, // 02AB MOVE R26 R22 - 0x7C600400, // 02AC CALL R24 2 - 0x50600200, // 02AD LDBOOL R24 1 0 - 0x80043000, // 02AE RET 1 R24 - 0x50200200, // 02AF LDBOOL R8 1 0 - 0x80041000, // 02B0 RET 1 R8 + 0x88180B14, // 0022 GETMBR R6 R5 K20 + 0x90122606, // 0023 SETMBR R4 K19 R6 + 0x88180B15, // 0024 GETMBR R6 R5 K21 + 0x4C1C0000, // 0025 LDNIL R7 + 0x20180C07, // 0026 NE R6 R6 R7 + 0x781A0003, // 0027 JMPF R6 #002C + 0x88180B16, // 0028 GETMBR R6 R5 K22 + 0x4C1C0000, // 0029 LDNIL R7 + 0x20180C07, // 002A NE R6 R6 R7 + 0x741A0000, // 002B JMPT R6 #002D + 0x50180001, // 002C LDBOOL R6 0 1 + 0x50180200, // 002D LDBOOL R6 1 0 + 0x50180000, // 002E LDBOOL R6 0 0 + 0x4C1C0000, // 002F LDNIL R7 + 0x781A000D, // 0030 JMPF R6 #003F + 0x88200117, // 0031 GETMBR R8 R0 K23 + 0x88201118, // 0032 GETMBR R8 R8 K24 + 0x8C201119, // 0033 GETMET R8 R8 K25 + 0x88280B15, // 0034 GETMBR R10 R5 K21 + 0x7C200400, // 0035 CALL R8 2 + 0x5C1C1000, // 0036 MOVE R7 R8 + 0x4C200000, // 0037 LDNIL R8 + 0x1C200E08, // 0038 EQ R8 R7 R8 + 0x74220003, // 0039 JMPT R8 #003E + 0x88200F1A, // 003A GETMBR R8 R7 K26 + 0x4C240000, // 003B LDNIL R9 + 0x1C201009, // 003C EQ R8 R8 R9 + 0x78220000, // 003D JMPF R8 #003F + 0x50180000, // 003E LDBOOL R6 0 0 + 0x781A00B6, // 003F JMPF R6 #00F7 + 0x88200B1B, // 0040 GETMBR R8 R5 K27 + 0x88240B15, // 0041 GETMBR R9 R5 K21 + 0x00201009, // 0042 ADD R8 R8 R9 + 0x60240015, // 0043 GETGBL R9 G21 + 0x7C240000, // 0044 CALL R9 0 + 0x8C24131C, // 0045 GETMET R9 R9 K28 + 0x582C001D, // 0046 LDCONST R11 K29 + 0x7C240400, // 0047 CALL R9 2 + 0x8C28051E, // 0048 GETMET R10 R2 K30 + 0x7C280200, // 0049 CALL R10 1 + 0x8C28151F, // 004A GETMET R10 R10 K31 + 0x88300F20, // 004B GETMBR R12 R7 K32 + 0x5C341000, // 004C MOVE R13 R8 + 0x5C381200, // 004D MOVE R14 R9 + 0x543E000F, // 004E LDINT R15 16 + 0x7C280A00, // 004F CALL R10 5 + 0x602C0015, // 0050 GETGBL R11 G21 + 0x7C2C0000, // 0051 CALL R11 0 + 0x8C2C171C, // 0052 GETMET R11 R11 K28 + 0x58340021, // 0053 LDCONST R13 K33 + 0x7C2C0400, // 0054 CALL R11 2 + 0x5431FFEE, // 0055 LDINT R12 -17 + 0x40320A0C, // 0056 CONNECT R12 K5 R12 + 0x88340B16, // 0057 GETMBR R13 R5 K22 + 0x94301A0C, // 0058 GETIDX R12 R13 R12 + 0x5439FFEF, // 0059 LDINT R14 -16 + 0x40381D22, // 005A CONNECT R14 R14 K34 + 0x883C0B16, // 005B GETMBR R15 R5 K22 + 0x94341E0E, // 005C GETIDX R13 R15 R14 + 0x8C400523, // 005D GETMET R16 R2 K35 + 0x5C481400, // 005E MOVE R18 R10 + 0x5C4C1600, // 005F MOVE R19 R11 + 0x60500015, // 0060 GETGBL R20 G21 + 0x7C500000, // 0061 CALL R20 0 + 0x6054000C, // 0062 GETGBL R21 G12 + 0x5C581800, // 0063 MOVE R22 R12 + 0x7C540200, // 0064 CALL R21 1 + 0x545A000F, // 0065 LDINT R22 16 + 0x7C400C00, // 0066 CALL R16 6 + 0x5C382000, // 0067 MOVE R14 R16 + 0x8C401D24, // 0068 GETMET R16 R14 K36 + 0x5C481800, // 0069 MOVE R18 R12 + 0x7C400400, // 006A CALL R16 2 + 0x5C3C2000, // 006B MOVE R15 R16 + 0x8C401D25, // 006C GETMET R16 R14 K37 + 0x7C400200, // 006D CALL R16 1 + 0x1C441A10, // 006E EQ R17 R13 R16 + 0x78460085, // 006F JMPF R17 #00F6 + 0x88440F1A, // 0070 GETMBR R17 R7 K26 + 0x90123411, // 0071 SETMBR R4 K26 R17 + 0x88440327, // 0072 GETMBR R17 R1 K39 + 0x90124C11, // 0073 SETMBR R4 K38 R17 + 0x8C440928, // 0074 GETMET R17 R4 K40 + 0x7C440200, // 0075 CALL R17 1 + 0x88440B2A, // 0076 GETMBR R17 R5 K42 + 0x90125211, // 0077 SETMBR R4 K41 R17 + 0x88440117, // 0078 GETMBR R17 R0 K23 + 0x88442318, // 0079 GETMBR R17 R17 K24 + 0x8C44232C, // 007A GETMET R17 R17 K44 + 0x7C440200, // 007B CALL R17 1 + 0x90125611, // 007C SETMBR R4 K43 R17 + 0xB8460E00, // 007D GETNGBL R17 K7 + 0x8C442308, // 007E GETMET R17 R17 K8 + 0x8C4C072D, // 007F GETMET R19 R3 K45 + 0x5854002E, // 0080 LDCONST R21 K46 + 0x8858092B, // 0081 GETMBR R22 R4 K43 + 0x885C032F, // 0082 GETMBR R23 R1 K47 + 0x88600330, // 0083 GETMBR R24 R1 K48 + 0x7C4C0A00, // 0084 CALL R19 5 + 0x5850000A, // 0085 LDCONST R20 K10 + 0x7C440600, // 0086 CALL R17 3 + 0x88440F20, // 0087 GETMBR R17 R7 K32 + 0x90124011, // 0088 SETMBR R4 K32 R17 + 0x8C440532, // 0089 GETMET R17 R2 K50 + 0x544E000F, // 008A LDINT R19 16 + 0x7C440400, // 008B CALL R17 2 + 0x90126211, // 008C SETMBR R4 K49 R17 + 0x60440015, // 008D GETGBL R17 G21 + 0x7C440000, // 008E CALL R17 0 + 0x8C44231C, // 008F GETMET R17 R17 K28 + 0x584C0033, // 0090 LDCONST R19 K51 + 0x7C440400, // 0091 CALL R17 2 + 0x88480B1B, // 0092 GETMBR R18 R5 K27 + 0x884C0931, // 0093 GETMBR R19 R4 K49 + 0x00482413, // 0094 ADD R18 R18 R19 + 0x8C4C051E, // 0095 GETMET R19 R2 K30 + 0x7C4C0200, // 0096 CALL R19 1 + 0x8C4C271F, // 0097 GETMET R19 R19 K31 + 0x88540920, // 0098 GETMBR R21 R4 K32 + 0x5C582400, // 0099 MOVE R22 R18 + 0x5C5C2200, // 009A MOVE R23 R17 + 0x5462000F, // 009B LDINT R24 16 + 0x7C4C0A00, // 009C CALL R19 5 + 0x8C500523, // 009D GETMET R20 R2 K35 + 0x5C582600, // 009E MOVE R22 R19 + 0x605C0015, // 009F GETGBL R23 G21 + 0x7C5C0000, // 00A0 CALL R23 0 + 0x8C5C2F1C, // 00A1 GETMET R23 R23 K28 + 0x58640034, // 00A2 LDCONST R25 K52 + 0x7C5C0400, // 00A3 CALL R23 2 + 0x60600015, // 00A4 GETGBL R24 G21 + 0x7C600000, // 00A5 CALL R24 0 + 0x58640005, // 00A6 LDCONST R25 K5 + 0x546A000F, // 00A7 LDINT R26 16 + 0x7C500C00, // 00A8 CALL R20 6 + 0x8C542925, // 00A9 GETMET R21 R20 K37 + 0x7C540200, // 00AA CALL R21 1 + 0xB85A1C00, // 00AB GETNGBL R22 K14 + 0x8C582D35, // 00AC GETMET R22 R22 K53 + 0x7C580200, // 00AD CALL R22 1 + 0x885C0931, // 00AE GETMBR R23 R4 K49 + 0x905A2A17, // 00AF SETMBR R22 K21 R23 + 0x885C092B, // 00B0 GETMBR R23 R4 K43 + 0x905A6C17, // 00B1 SETMBR R22 K54 R23 + 0x905A6E15, // 00B2 SETMBR R22 K55 R21 + 0x8C5C051E, // 00B3 GETMET R23 R2 K30 + 0x7C5C0200, // 00B4 CALL R23 1 + 0x8C5C2F1F, // 00B5 GETMET R23 R23 K31 + 0x88640920, // 00B6 GETMBR R25 R4 K32 + 0x88680B1B, // 00B7 GETMBR R26 R5 K27 + 0x886C0931, // 00B8 GETMBR R27 R4 K49 + 0x0068341B, // 00B9 ADD R26 R26 R27 + 0x606C0015, // 00BA GETGBL R27 G21 + 0x7C6C0000, // 00BB CALL R27 0 + 0x8C6C371C, // 00BC GETMET R27 R27 K28 + 0x58740038, // 00BD LDCONST R29 K56 + 0x7C6C0400, // 00BE CALL R27 2 + 0x5472002F, // 00BF LDINT R28 48 + 0x7C5C0A00, // 00C0 CALL R23 5 + 0x5462000E, // 00C1 LDINT R24 15 + 0x40620A18, // 00C2 CONNECT R24 K5 R24 + 0x94602E18, // 00C3 GETIDX R24 R23 R24 + 0x5466000F, // 00C4 LDINT R25 16 + 0x546A001E, // 00C5 LDINT R26 31 + 0x4064321A, // 00C6 CONNECT R25 R25 R26 + 0x94642E19, // 00C7 GETIDX R25 R23 R25 + 0x546A001F, // 00C8 LDINT R26 32 + 0x546E002E, // 00C9 LDINT R27 47 + 0x4068341B, // 00CA CONNECT R26 R26 R27 + 0x94682E1A, // 00CB GETIDX R26 R23 R26 + 0xB86E0E00, // 00CC GETNGBL R27 K7 + 0x8C6C3739, // 00CD GETMET R27 R27 K57 + 0x7C6C0200, // 00CE CALL R27 1 + 0x946C373A, // 00CF GETIDX R27 R27 K58 + 0x8C702D3B, // 00D0 GETMET R28 R22 K59 + 0x7C700200, // 00D1 CALL R28 1 + 0x4C740000, // 00D2 LDNIL R29 + 0x9012781D, // 00D3 SETMBR R4 K60 R29 + 0x8C74033D, // 00D4 GETMET R29 R1 K61 + 0x547E0032, // 00D5 LDINT R31 51 + 0x50800200, // 00D6 LDBOOL R32 1 0 + 0x7C740600, // 00D7 CALL R29 3 + 0x8C783B3E, // 00D8 GETMET R30 R29 K62 + 0x5C803800, // 00D9 MOVE R32 R28 + 0x7C780400, // 00DA CALL R30 2 + 0x887C013F, // 00DB GETMBR R31 R0 K63 + 0x8C7C3F40, // 00DC GETMET R31 R31 K64 + 0x5C843A00, // 00DD MOVE R33 R29 + 0x7C7C0400, // 00DE CALL R31 2 + 0x8C7C0941, // 00DF GETMET R31 R4 K65 + 0x7C7C0200, // 00E0 CALL R31 1 + 0x8C7C0942, // 00E1 GETMET R31 R4 K66 + 0x5C843000, // 00E2 MOVE R33 R24 + 0x5C883200, // 00E3 MOVE R34 R25 + 0x5C8C3400, // 00E4 MOVE R35 R26 + 0x5C903600, // 00E5 MOVE R36 R27 + 0x7C7C0A00, // 00E6 CALL R31 5 + 0x90128705, // 00E7 SETMBR R4 K67 K5 + 0x8C7C0944, // 00E8 GETMET R31 R4 K68 + 0x7C7C0200, // 00E9 CALL R31 1 + 0x8C7C0945, // 00EA GETMET R31 R4 K69 + 0x50840200, // 00EB LDBOOL R33 1 0 + 0x7C7C0400, // 00EC CALL R31 2 + 0x8C7C0946, // 00ED GETMET R31 R4 K70 + 0x7C7C0200, // 00EE CALL R31 1 + 0x8C7C0947, // 00EF GETMET R31 R4 K71 + 0x7C7C0200, // 00F0 CALL R31 1 + 0x8C7C0948, // 00F1 GETMET R31 R4 K72 + 0x7C7C0200, // 00F2 CALL R31 1 + 0x507C0200, // 00F3 LDBOOL R31 1 0 + 0x80043E00, // 00F4 RET 1 R31 + 0x70020000, // 00F5 JMP #00F7 + 0x50180000, // 00F6 LDBOOL R6 0 0 + 0x5C200C00, // 00F7 MOVE R8 R6 + 0x742200E6, // 00F8 JMPT R8 #01E0 + 0x8C200149, // 00F9 GETMET R8 R0 K73 + 0x88280B4A, // 00FA GETMBR R10 R5 K74 + 0x882C0B1B, // 00FB GETMBR R11 R5 K27 + 0x7C200600, // 00FC CALL R8 3 + 0x90123408, // 00FD SETMBR R4 K26 R8 + 0x4C240000, // 00FE LDNIL R9 + 0x1C240809, // 00FF EQ R9 R4 R9 + 0x74260003, // 0100 JMPT R9 #0105 + 0x8824091A, // 0101 GETMBR R9 R4 K26 + 0x4C280000, // 0102 LDNIL R10 + 0x1C24120A, // 0103 EQ R9 R9 R10 + 0x7826000D, // 0104 JMPF R9 #0113 + 0xB8260E00, // 0105 GETNGBL R9 K7 + 0x8C241308, // 0106 GETMET R9 R9 K8 + 0x582C004B, // 0107 LDCONST R11 K75 + 0x5830000A, // 0108 LDCONST R12 K10 + 0x7C240600, // 0109 CALL R9 3 + 0x8C24010B, // 010A GETMET R9 R0 K11 + 0x5C2C0200, // 010B MOVE R11 R1 + 0x5830000C, // 010C LDCONST R12 K12 + 0x58340005, // 010D LDCONST R13 K5 + 0x5838000C, // 010E LDCONST R14 K12 + 0x503C0000, // 010F LDBOOL R15 0 0 + 0x7C240C00, // 0110 CALL R9 6 + 0x50240000, // 0111 LDBOOL R9 0 0 + 0x80041200, // 0112 RET 1 R9 + 0x88240327, // 0113 GETMBR R9 R1 K39 + 0x90124C09, // 0114 SETMBR R4 K38 R9 + 0x8C240928, // 0115 GETMET R9 R4 K40 + 0x7C240200, // 0116 CALL R9 1 + 0x88240B2A, // 0117 GETMBR R9 R5 K42 + 0x90125209, // 0118 SETMBR R4 K41 R9 + 0x88240117, // 0119 GETMBR R9 R0 K23 + 0x88241318, // 011A GETMBR R9 R9 K24 + 0x8C24132C, // 011B GETMET R9 R9 K44 + 0x7C240200, // 011C CALL R9 1 + 0x90125609, // 011D SETMBR R4 K43 R9 + 0xB8260E00, // 011E GETNGBL R9 K7 + 0x8C241308, // 011F GETMET R9 R9 K8 + 0x8C2C072D, // 0120 GETMET R11 R3 K45 + 0x5834002E, // 0121 LDCONST R13 K46 + 0x8838092B, // 0122 GETMBR R14 R4 K43 + 0x883C032F, // 0123 GETMBR R15 R1 K47 + 0x88400330, // 0124 GETMBR R16 R1 K48 + 0x7C2C0A00, // 0125 CALL R11 5 + 0x5830000A, // 0126 LDCONST R12 K10 + 0x7C240600, // 0127 CALL R9 3 + 0x8C240532, // 0128 GETMET R9 R2 K50 + 0x542E000F, // 0129 LDINT R11 16 + 0x7C240400, // 012A CALL R9 2 + 0x90126209, // 012B SETMBR R4 K49 R9 + 0x8C240532, // 012C GETMET R9 R2 K50 + 0x542E001F, // 012D LDINT R11 32 + 0x7C240400, // 012E CALL R9 2 + 0x90129809, // 012F SETMBR R4 K76 R9 + 0x8C24054E, // 0130 GETMET R9 R2 K78 + 0x7C240200, // 0131 CALL R9 1 + 0x8C24134F, // 0132 GETMET R9 R9 K79 + 0x882C094C, // 0133 GETMBR R11 R4 K76 + 0x7C240400, // 0134 CALL R9 2 + 0x90129A09, // 0135 SETMBR R4 K77 R9 + 0x8C240532, // 0136 GETMET R9 R2 K50 + 0x542E001F, // 0137 LDINT R11 32 + 0x7C240400, // 0138 CALL R9 2 + 0x8C28054E, // 0139 GETMET R10 R2 K78 + 0x7C280200, // 013A CALL R10 1 + 0x8C281550, // 013B GETMET R10 R10 K80 + 0x8830094C, // 013C GETMBR R12 R4 K76 + 0x88340B14, // 013D GETMBR R13 R5 K20 + 0x7C280600, // 013E CALL R10 3 + 0x9012400A, // 013F SETMBR R4 K32 R10 + 0xB82A1C00, // 0140 GETNGBL R10 K14 + 0x88281551, // 0141 GETMBR R10 R10 K81 + 0x8C281552, // 0142 GETMET R10 R10 K82 + 0x7C280200, // 0143 CALL R10 1 + 0x8C2C1553, // 0144 GETMET R11 R10 K83 + 0x5834000C, // 0145 LDCONST R13 K12 + 0xB83A1C00, // 0146 GETNGBL R14 K14 + 0x88381D51, // 0147 GETMBR R14 R14 K81 + 0x88381D54, // 0148 GETMBR R14 R14 K84 + 0x8C3C1155, // 0149 GETMET R15 R8 K85 + 0x7C3C0200, // 014A CALL R15 1 + 0x7C2C0800, // 014B CALL R11 4 + 0x8C2C1553, // 014C GETMET R11 R10 K83 + 0x5834000D, // 014D LDCONST R13 K13 + 0xB83A1C00, // 014E GETNGBL R14 K14 + 0x88381D51, // 014F GETMBR R14 R14 K81 + 0x88381D54, // 0150 GETMBR R14 R14 K84 + 0x8C3C1156, // 0151 GETMET R15 R8 K86 + 0x7C3C0200, // 0152 CALL R15 1 + 0x7C2C0800, // 0153 CALL R11 4 + 0x8C2C1553, // 0154 GETMET R11 R10 K83 + 0x5834000A, // 0155 LDCONST R13 K10 + 0xB83A1C00, // 0156 GETNGBL R14 K14 + 0x88381D51, // 0157 GETMBR R14 R14 K81 + 0x88381D54, // 0158 GETMBR R14 R14 K84 + 0x883C094D, // 0159 GETMBR R15 R4 K77 + 0x7C2C0800, // 015A CALL R11 4 + 0x8C2C1553, // 015B GETMET R11 R10 K83 + 0x54360003, // 015C LDINT R13 4 + 0xB83A1C00, // 015D GETNGBL R14 K14 + 0x88381D51, // 015E GETMBR R14 R14 K81 + 0x88381D54, // 015F GETMBR R14 R14 K84 + 0x883C0B14, // 0160 GETMBR R15 R5 K20 + 0x7C2C0800, // 0161 CALL R11 4 + 0x8C2C054E, // 0162 GETMET R11 R2 K78 + 0x7C2C0200, // 0163 CALL R11 1 + 0x8C2C1757, // 0164 GETMET R11 R11 K87 + 0x8C341158, // 0165 GETMET R13 R8 K88 + 0x7C340200, // 0166 CALL R13 1 + 0x8C38153B, // 0167 GETMET R14 R10 K59 + 0x7C380200, // 0168 CALL R14 1 + 0x7C2C0600, // 0169 CALL R11 3 + 0xB8321C00, // 016A GETNGBL R12 K14 + 0x88301951, // 016B GETMBR R12 R12 K81 + 0x8C301952, // 016C GETMET R12 R12 K82 + 0x7C300200, // 016D CALL R12 1 + 0x8C341953, // 016E GETMET R13 R12 K83 + 0x583C000C, // 016F LDCONST R15 K12 + 0xB8421C00, // 0170 GETNGBL R16 K14 + 0x88402151, // 0171 GETMBR R16 R16 K81 + 0x88402154, // 0172 GETMBR R16 R16 K84 + 0x8C441155, // 0173 GETMET R17 R8 K85 + 0x7C440200, // 0174 CALL R17 1 + 0x7C340800, // 0175 CALL R13 4 + 0x8C341953, // 0176 GETMET R13 R12 K83 + 0x583C000D, // 0177 LDCONST R15 K13 + 0xB8421C00, // 0178 GETNGBL R16 K14 + 0x88402151, // 0179 GETMBR R16 R16 K81 + 0x88402154, // 017A GETMBR R16 R16 K84 + 0x8C441156, // 017B GETMET R17 R8 K86 + 0x7C440200, // 017C CALL R17 1 + 0x7C340800, // 017D CALL R13 4 + 0x8C341953, // 017E GETMET R13 R12 K83 + 0x583C000A, // 017F LDCONST R15 K10 + 0xB8421C00, // 0180 GETNGBL R16 K14 + 0x88402151, // 0181 GETMBR R16 R16 K81 + 0x88402154, // 0182 GETMBR R16 R16 K84 + 0x5C441600, // 0183 MOVE R17 R11 + 0x7C340800, // 0184 CALL R13 4 + 0x8C341953, // 0185 GETMET R13 R12 K83 + 0x543E0003, // 0186 LDINT R15 4 + 0xB8421C00, // 0187 GETNGBL R16 K14 + 0x88402151, // 0188 GETMBR R16 R16 K81 + 0x88402154, // 0189 GETMBR R16 R16 K84 + 0x88440931, // 018A GETMBR R17 R4 K49 + 0x7C340800, // 018B CALL R13 4 + 0x88340B59, // 018C GETMBR R13 R5 K89 + 0x9012780D, // 018D SETMBR R4 K60 R13 + 0x8C34055A, // 018E GETMET R13 R2 K90 + 0x7C340200, // 018F CALL R13 1 + 0x8C341B5B, // 0190 GETMET R13 R13 K91 + 0x883C093C, // 0191 GETMBR R15 R4 K60 + 0x7C340400, // 0192 CALL R13 2 + 0x8C341B5C, // 0193 GETMET R13 R13 K92 + 0x7C340200, // 0194 CALL R13 1 + 0x60380015, // 0195 GETGBL R14 G21 + 0x7C380000, // 0196 CALL R14 0 + 0x8C381D1C, // 0197 GETMET R14 R14 K28 + 0x8840015D, // 0198 GETMBR R16 R0 K93 + 0x7C380400, // 0199 CALL R14 2 + 0x8C3C115E, // 019A GETMET R15 R8 K94 + 0x7C3C0200, // 019B CALL R15 1 + 0x003C1E09, // 019C ADD R15 R15 R9 + 0x8840094D, // 019D GETMBR R16 R4 K77 + 0x003C1E10, // 019E ADD R15 R15 R16 + 0x003C1E0D, // 019F ADD R15 R15 R13 + 0x8C40051E, // 01A0 GETMET R16 R2 K30 + 0x7C400200, // 01A1 CALL R16 1 + 0x8C40211F, // 01A2 GETMET R16 R16 K31 + 0x88480920, // 01A3 GETMBR R18 R4 K32 + 0x5C4C1E00, // 01A4 MOVE R19 R15 + 0x5C501C00, // 01A5 MOVE R20 R14 + 0x5456000F, // 01A6 LDINT R21 16 + 0x7C400A00, // 01A7 CALL R16 5 + 0x8C44193B, // 01A8 GETMET R17 R12 K59 + 0x7C440200, // 01A9 CALL R17 1 + 0x8C480523, // 01AA GETMET R18 R2 K35 + 0x5C502000, // 01AB MOVE R20 R16 + 0x60540015, // 01AC GETGBL R21 G21 + 0x7C540000, // 01AD CALL R21 0 + 0x8C542B1C, // 01AE GETMET R21 R21 K28 + 0x885C015F, // 01AF GETMBR R23 R0 K95 + 0x7C540400, // 01B0 CALL R21 2 + 0x60580015, // 01B1 GETGBL R22 G21 + 0x7C580000, // 01B2 CALL R22 0 + 0x605C000C, // 01B3 GETGBL R23 G12 + 0x5C602200, // 01B4 MOVE R24 R17 + 0x7C5C0200, // 01B5 CALL R23 1 + 0x5462000F, // 01B6 LDINT R24 16 + 0x7C480C00, // 01B7 CALL R18 6 + 0x8C4C2560, // 01B8 GETMET R19 R18 K96 + 0x5C542200, // 01B9 MOVE R21 R17 + 0x7C4C0400, // 01BA CALL R19 2 + 0x8C502525, // 01BB GETMET R20 R18 K37 + 0x7C500200, // 01BC CALL R20 1 + 0x004C2614, // 01BD ADD R19 R19 R20 + 0xB8521C00, // 01BE GETNGBL R20 K14 + 0x8C502961, // 01BF GETMET R20 R20 K97 + 0x7C500200, // 01C0 CALL R20 1 + 0x9052C409, // 01C1 SETMBR R20 K98 R9 + 0x8854092B, // 01C2 GETMBR R21 R4 K43 + 0x9052C615, // 01C3 SETMBR R20 K99 R21 + 0x8854094D, // 01C4 GETMBR R21 R4 K77 + 0x9052C815, // 01C5 SETMBR R20 K100 R21 + 0x9052CA13, // 01C6 SETMBR R20 K101 R19 + 0x8C54293B, // 01C7 GETMET R21 R20 K59 + 0x7C540200, // 01C8 CALL R21 1 + 0x9012CC15, // 01C9 SETMBR R4 K102 R21 + 0x8C58033D, // 01CA GETMET R22 R1 K61 + 0x54620030, // 01CB LDINT R24 49 + 0x50640200, // 01CC LDBOOL R25 1 0 + 0x7C580600, // 01CD CALL R22 3 + 0x8C5C2D3E, // 01CE GETMET R23 R22 K62 + 0x5C642A00, // 01CF MOVE R25 R21 + 0x7C5C0400, // 01D0 CALL R23 2 + 0xB8620E00, // 01D1 GETNGBL R24 K7 + 0x8C603108, // 01D2 GETMET R24 R24 K8 + 0x8C68072D, // 01D3 GETMET R26 R3 K45 + 0x58700067, // 01D4 LDCONST R28 K103 + 0x8874092B, // 01D5 GETMBR R29 R4 K43 + 0x88780968, // 01D6 GETMBR R30 R4 K104 + 0x887C0969, // 01D7 GETMBR R31 R4 K105 + 0x7C680A00, // 01D8 CALL R26 5 + 0x7C600400, // 01D9 CALL R24 2 + 0x8860013F, // 01DA GETMBR R24 R0 K63 + 0x8C603140, // 01DB GETMET R24 R24 K64 + 0x5C682C00, // 01DC MOVE R26 R22 + 0x7C600400, // 01DD CALL R24 2 + 0x50600200, // 01DE LDBOOL R24 1 0 + 0x80043000, // 01DF RET 1 R24 + 0x50200200, // 01E0 LDBOOL R8 1 0 + 0x80041000, // 01E1 RET 1 R8 }) ) ); diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Control_Message.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Control_Message.h index 967c09a27..a7d268200 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Control_Message.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Control_Message.h @@ -155,13 +155,13 @@ be_local_closure(Matter_Control_Message_process_incoming_control_message, /* n 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[14]) { /* constants */ + ( &(const bvalue[15]) { /* constants */ /* K0 */ be_nested_str_weak(tasmota), /* K1 */ be_nested_str_weak(log), /* K2 */ be_nested_str_weak(MTR_X3A_X20received_X20control_X20message_X20), /* K3 */ be_nested_str_weak(matter), /* K4 */ be_nested_str_weak(inspect), - /* K5 */ be_const_int(2), + /* K5 */ be_const_int(3), /* K6 */ be_nested_str_weak(opcode), /* K7 */ be_const_int(0), /* K8 */ be_nested_str_weak(parse_MsgCounterSyncReq), @@ -170,6 +170,7 @@ be_local_closure(Matter_Control_Message_process_incoming_control_message, /* n /* K11 */ be_nested_str_weak(string), /* K12 */ be_nested_str_weak(format), /* K13 */ be_nested_str_weak(MTR_X3A_X20_X3E_X3F_X3F_X3F_X3F_X3F_X3F_X3F_X3F_X3F_X20Unknown_X20OpCode_X20_X28control_X20message_X29_X20_X2502X), + /* K14 */ be_const_int(2), }), be_str_weak(process_incoming_control_message), &be_const_str_solidified, @@ -206,7 +207,7 @@ be_local_closure(Matter_Control_Message_process_incoming_control_message, /* n 0x581C000D, // 001D LDCONST R7 K13 0x88200306, // 001E GETMBR R8 R1 K6 0x7C140600, // 001F CALL R5 3 - 0x58180005, // 0020 LDCONST R6 K5 + 0x5818000E, // 0020 LDCONST R6 K14 0x7C0C0600, // 0021 CALL R3 3 0x500C0000, // 0022 LDBOOL R3 0 0 0x80040600, // 0023 RET 1 R3 diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Device.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Device.h index 2844d3a78..3425d547a 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Device.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Device.h @@ -7,288 +7,9 @@ extern const bclass be_class_Matter_Device; /******************************************************************** -** Solidified function: get_plugin_class_arg +** Solidified function: is_commissioning_open ********************************************************************/ -be_local_closure(Matter_Device_get_plugin_class_arg, /* name */ - be_nested_proto( - 5, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 4]) { /* constants */ - /* K0 */ be_nested_str_weak(plugins_classes), - /* K1 */ be_nested_str_weak(find), - /* K2 */ be_nested_str_weak(ARG), - /* K3 */ be_nested_str_weak(), - }), - be_str_weak(get_plugin_class_arg), - &be_const_str_solidified, - ( &(const binstruction[ 9]) { /* code */ - 0x88080100, // 0000 GETMBR R2 R0 K0 - 0x8C080501, // 0001 GETMET R2 R2 K1 - 0x5C100200, // 0002 MOVE R4 R1 - 0x7C080400, // 0003 CALL R2 2 - 0x780A0001, // 0004 JMPF R2 #0007 - 0x880C0502, // 0005 GETMBR R3 R2 K2 - 0x70020000, // 0006 JMP #0008 - 0x580C0003, // 0007 LDCONST R3 K3 - 0x80040600, // 0008 RET 1 R3 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: mdns_remove_op_discovery_all_fabrics -********************************************************************/ -be_local_closure(Matter_Device_mdns_remove_op_discovery_all_fabrics, /* name */ - be_nested_proto( - 6, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 6]) { /* constants */ - /* K0 */ be_nested_str_weak(sessions), - /* K1 */ be_nested_str_weak(active_fabrics), - /* K2 */ be_nested_str_weak(get_device_id), - /* K3 */ be_nested_str_weak(get_fabric_id), - /* K4 */ be_nested_str_weak(mdns_remove_op_discovery), - /* K5 */ be_nested_str_weak(stop_iteration), - }), - be_str_weak(mdns_remove_op_discovery_all_fabrics), - &be_const_str_solidified, - ( &(const binstruction[22]) { /* code */ - 0x60040010, // 0000 GETGBL R1 G16 - 0x88080100, // 0001 GETMBR R2 R0 K0 - 0x8C080501, // 0002 GETMET R2 R2 K1 - 0x7C080200, // 0003 CALL R2 1 - 0x7C040200, // 0004 CALL R1 1 - 0xA802000B, // 0005 EXBLK 0 #0012 - 0x5C080200, // 0006 MOVE R2 R1 - 0x7C080000, // 0007 CALL R2 0 - 0x8C0C0502, // 0008 GETMET R3 R2 K2 - 0x7C0C0200, // 0009 CALL R3 1 - 0x780E0005, // 000A JMPF R3 #0011 - 0x8C0C0503, // 000B GETMET R3 R2 K3 - 0x7C0C0200, // 000C CALL R3 1 - 0x780E0002, // 000D JMPF R3 #0011 - 0x8C0C0104, // 000E GETMET R3 R0 K4 - 0x5C140400, // 000F MOVE R5 R2 - 0x7C0C0400, // 0010 CALL R3 2 - 0x7001FFF3, // 0011 JMP #0006 - 0x58040005, // 0012 LDCONST R1 K5 - 0xAC040200, // 0013 CATCH R1 1 0 - 0xB0080000, // 0014 RAISE 2 R0 R0 - 0x80000000, // 0015 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: _start_udp -********************************************************************/ -be_local_closure(Matter_Device__start_udp, /* name */ - be_nested_proto( - 6, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 1, /* has sup protos */ - ( &(const struct bproto*[ 1]) { - be_nested_proto( - 8, /* nstack */ - 3, /* argc */ - 0, /* varg */ - 1, /* has upvals */ - ( &(const bupvaldesc[ 1]) { /* upvals */ - be_local_const_upval(1, 0), - }), - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 1]) { /* constants */ - /* K0 */ be_nested_str_weak(msg_received), - }), - be_str_weak(_X3Clambda_X3E), - &be_const_str_solidified, - ( &(const binstruction[ 7]) { /* code */ - 0x680C0000, // 0000 GETUPV R3 U0 - 0x8C0C0700, // 0001 GETMET R3 R3 K0 - 0x5C140000, // 0002 MOVE R5 R0 - 0x5C180200, // 0003 MOVE R6 R1 - 0x5C1C0400, // 0004 MOVE R7 R2 - 0x7C0C0800, // 0005 CALL R3 4 - 0x80040600, // 0006 RET 1 R3 - }) - ), - }), - 1, /* has constants */ - ( &(const bvalue[ 9]) { /* constants */ - /* K0 */ be_nested_str_weak(udp_server), - /* K1 */ be_nested_str_weak(tasmota), - /* K2 */ be_nested_str_weak(log), - /* K3 */ be_nested_str_weak(MTR_X3A_X20starting_X20UDP_X20server_X20on_X20port_X3A_X20), - /* K4 */ be_const_int(2), - /* K5 */ be_nested_str_weak(matter), - /* K6 */ be_nested_str_weak(UDPServer), - /* K7 */ be_nested_str_weak(), - /* K8 */ be_nested_str_weak(start), - }), - be_str_weak(_start_udp), - &be_const_str_solidified, - ( &(const binstruction[27]) { /* code */ - 0x88080100, // 0000 GETMBR R2 R0 K0 - 0x780A0000, // 0001 JMPF R2 #0003 - 0x80000400, // 0002 RET 0 - 0x4C080000, // 0003 LDNIL R2 - 0x1C080202, // 0004 EQ R2 R1 R2 - 0x780A0000, // 0005 JMPF R2 #0007 - 0x540615A3, // 0006 LDINT R1 5540 - 0xB80A0200, // 0007 GETNGBL R2 K1 - 0x8C080502, // 0008 GETMET R2 R2 K2 - 0x60100008, // 0009 GETGBL R4 G8 - 0x5C140200, // 000A MOVE R5 R1 - 0x7C100200, // 000B CALL R4 1 - 0x00120604, // 000C ADD R4 K3 R4 - 0x58140004, // 000D LDCONST R5 K4 - 0x7C080600, // 000E CALL R2 3 - 0xB80A0A00, // 000F GETNGBL R2 K5 - 0x8C080506, // 0010 GETMET R2 R2 K6 - 0x58100007, // 0011 LDCONST R4 K7 - 0x5C140200, // 0012 MOVE R5 R1 - 0x7C080600, // 0013 CALL R2 3 - 0x90020002, // 0014 SETMBR R0 K0 R2 - 0x88080100, // 0015 GETMBR R2 R0 K0 - 0x8C080508, // 0016 GETMET R2 R2 K8 - 0x84100000, // 0017 CLOSURE R4 P0 - 0x7C080400, // 0018 CALL R2 2 - 0xA0000000, // 0019 CLOSE R0 - 0x80000000, // 001A RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: find_plugin_by_endpoint -********************************************************************/ -be_local_closure(Matter_Device_find_plugin_by_endpoint, /* name */ - be_nested_proto( - 6, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 4]) { /* constants */ - /* K0 */ be_const_int(0), - /* K1 */ be_nested_str_weak(plugins), - /* K2 */ be_nested_str_weak(get_endpoint), - /* K3 */ be_const_int(1), - }), - be_str_weak(find_plugin_by_endpoint), - &be_const_str_solidified, - ( &(const binstruction[17]) { /* code */ - 0x58080000, // 0000 LDCONST R2 K0 - 0x600C000C, // 0001 GETGBL R3 G12 - 0x88100101, // 0002 GETMBR R4 R0 K1 - 0x7C0C0200, // 0003 CALL R3 1 - 0x140C0403, // 0004 LT R3 R2 R3 - 0x780E0008, // 0005 JMPF R3 #000F - 0x880C0101, // 0006 GETMBR R3 R0 K1 - 0x940C0602, // 0007 GETIDX R3 R3 R2 - 0x8C100702, // 0008 GETMET R4 R3 K2 - 0x7C100200, // 0009 CALL R4 1 - 0x1C100801, // 000A EQ R4 R4 R1 - 0x78120000, // 000B JMPF R4 #000D - 0x80040600, // 000C RET 1 R3 - 0x00080503, // 000D ADD R2 R2 K3 - 0x7001FFF1, // 000E JMP #0001 - 0x4C0C0000, // 000F LDNIL R3 - 0x80040600, // 0010 RET 1 R3 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: get_active_endpoints -********************************************************************/ -be_local_closure(Matter_Device_get_active_endpoints, /* name */ - be_nested_proto( - 9, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 6]) { /* constants */ - /* K0 */ be_nested_str_weak(plugins), - /* K1 */ be_nested_str_weak(get_endpoint), - /* K2 */ be_const_int(0), - /* K3 */ be_nested_str_weak(find), - /* K4 */ be_nested_str_weak(push), - /* K5 */ be_nested_str_weak(stop_iteration), - }), - be_str_weak(get_active_endpoints), - &be_const_str_solidified, - ( &(const binstruction[28]) { /* code */ - 0x60080012, // 0000 GETGBL R2 G18 - 0x7C080000, // 0001 CALL R2 0 - 0x600C0010, // 0002 GETGBL R3 G16 - 0x88100100, // 0003 GETMBR R4 R0 K0 - 0x7C0C0200, // 0004 CALL R3 1 - 0xA8020011, // 0005 EXBLK 0 #0018 - 0x5C100600, // 0006 MOVE R4 R3 - 0x7C100000, // 0007 CALL R4 0 - 0x8C140901, // 0008 GETMET R5 R4 K1 - 0x7C140200, // 0009 CALL R5 1 - 0x78060002, // 000A JMPF R1 #000E - 0x1C180B02, // 000B EQ R6 R5 K2 - 0x781A0000, // 000C JMPF R6 #000E - 0x7001FFF7, // 000D JMP #0006 - 0x8C180503, // 000E GETMET R6 R2 K3 - 0x5C200A00, // 000F MOVE R8 R5 - 0x7C180400, // 0010 CALL R6 2 - 0x4C1C0000, // 0011 LDNIL R7 - 0x1C180C07, // 0012 EQ R6 R6 R7 - 0x781A0002, // 0013 JMPF R6 #0017 - 0x8C180504, // 0014 GETMET R6 R2 K4 - 0x5C200A00, // 0015 MOVE R8 R5 - 0x7C180400, // 0016 CALL R6 2 - 0x7001FFED, // 0017 JMP #0006 - 0x580C0005, // 0018 LDCONST R3 K5 - 0xAC0C0200, // 0019 CATCH R3 1 0 - 0xB0080000, // 001A RAISE 2 R0 R0 - 0x80040400, // 001B RET 1 R2 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: is_root_commissioning_open -********************************************************************/ -be_local_closure(Matter_Device_is_root_commissioning_open, /* name */ +be_local_closure(Matter_Device_is_commissioning_open, /* name */ be_nested_proto( 3, /* nstack */ 1, /* argc */ @@ -298,24 +19,16 @@ be_local_closure(Matter_Device_is_root_commissioning_open, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[ 2]) { /* constants */ + ( &(const bvalue[ 1]) { /* constants */ /* K0 */ be_nested_str_weak(commissioning_open), - /* K1 */ be_nested_str_weak(commissioning_admin_fabric), }), - be_str_weak(is_root_commissioning_open), + be_str_weak(is_commissioning_open), &be_const_str_solidified, - ( &(const binstruction[11]) { /* code */ + ( &(const binstruction[ 4]) { /* code */ 0x88040100, // 0000 GETMBR R1 R0 K0 0x4C080000, // 0001 LDNIL R2 0x20040202, // 0002 NE R1 R1 R2 - 0x78060003, // 0003 JMPF R1 #0008 - 0x88040101, // 0004 GETMBR R1 R0 K1 - 0x4C080000, // 0005 LDNIL R2 - 0x1C040202, // 0006 EQ R1 R1 R2 - 0x74060000, // 0007 JMPT R1 #0009 - 0x50040001, // 0008 LDBOOL R1 0 1 - 0x50040200, // 0009 LDBOOL R1 1 0 - 0x80040200, // 000A RET 1 R1 + 0x80040200, // 0003 RET 1 R1 }) ) ); @@ -323,285 +36,190 @@ be_local_closure(Matter_Device_is_root_commissioning_open, /* name */ /******************************************************************** -** Solidified function: register_commands +** Solidified function: _mdns_announce_hostname ********************************************************************/ -be_local_closure(Matter_Device_register_commands, /* name */ +be_local_closure(Matter_Device__mdns_announce_hostname, /* name */ be_nested_proto( - 5, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 1, /* has sup protos */ - ( &(const struct bproto*[ 1]) { - be_nested_proto( - 10, /* nstack */ - 4, /* argc */ - 0, /* varg */ - 1, /* has upvals */ - ( &(const bupvaldesc[ 1]) { /* upvals */ - be_local_const_upval(1, 0), - }), - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 1]) { /* constants */ - /* K0 */ be_nested_str_weak(MtrJoin), - }), - be_str_weak(_X3Clambda_X3E), - &be_const_str_solidified, - ( &(const binstruction[ 8]) { /* code */ - 0x68100000, // 0000 GETUPV R4 U0 - 0x8C100900, // 0001 GETMET R4 R4 K0 - 0x5C180000, // 0002 MOVE R6 R0 - 0x5C1C0200, // 0003 MOVE R7 R1 - 0x5C200400, // 0004 MOVE R8 R2 - 0x5C240600, // 0005 MOVE R9 R3 - 0x7C100A00, // 0006 CALL R4 5 - 0x80040800, // 0007 RET 1 R4 - }) - ), - }), - 1, /* has constants */ - ( &(const bvalue[ 3]) { /* constants */ - /* K0 */ be_nested_str_weak(tasmota), - /* K1 */ be_nested_str_weak(add_cmd), - /* K2 */ be_nested_str_weak(MtrJoin), - }), - be_str_weak(register_commands), - &be_const_str_solidified, - ( &(const binstruction[ 7]) { /* code */ - 0xB8060000, // 0000 GETNGBL R1 K0 - 0x8C040301, // 0001 GETMET R1 R1 K1 - 0x580C0002, // 0002 LDCONST R3 K2 - 0x84100000, // 0003 CLOSURE R4 P0 - 0x7C040600, // 0004 CALL R1 3 - 0xA0000000, // 0005 CLOSE R0 - 0x80000000, // 0006 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: mdns_remove_PASE -********************************************************************/ -be_local_closure(Matter_Device_mdns_remove_PASE, /* name */ - be_nested_proto( - 12, /* nstack */ - 1, /* argc */ + 15, /* nstack */ + 2, /* argc */ 2, /* varg */ 0, /* has upvals */ NULL, /* no upvals */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[22]) { /* constants */ + ( &(const bvalue[27]) { /* constants */ /* K0 */ be_nested_str_weak(mdns), /* K1 */ be_nested_str_weak(string), - /* K2 */ be_nested_str_weak(mdns_pase_eth), + /* K2 */ be_nested_str_weak(start), /* K3 */ be_nested_str_weak(tasmota), - /* K4 */ be_nested_str_weak(log), - /* K5 */ be_nested_str_weak(format), - /* K6 */ be_nested_str_weak(MTR_X3A_X20calling_X20mdns_X2Eremove_service_X28_X25s_X2C_X20_X25s_X2C_X20_X25s_X2C_X20_X25s_X29), - /* K7 */ be_nested_str_weak(_matterc), - /* K8 */ be_nested_str_weak(_udp), - /* K9 */ be_nested_str_weak(commissioning_instance_eth), - /* K10 */ be_nested_str_weak(hostname_eth), - /* K11 */ be_const_int(3), - /* K12 */ be_nested_str_weak(MTR_X3A_X20remove_X20mDNS_X20on_X20_X25s_X20_X27_X25s_X27), - /* K13 */ be_nested_str_weak(eth), - /* K14 */ be_const_int(2), - /* K15 */ be_nested_str_weak(remove_service), - /* K16 */ be_nested_str_weak(mdns_pase_wifi), - /* K17 */ be_nested_str_weak(commissioning_instance_wifi), - /* K18 */ be_nested_str_weak(hostname_wifi), - /* K19 */ be_nested_str_weak(wifi), - /* K20 */ be_nested_str_weak(MTR_X3A_X20Exception), - /* K21 */ be_nested_str_weak(_X7C), + /* K4 */ be_nested_str_weak(eth), + /* K5 */ be_nested_str_weak(hostname_eth), + /* K6 */ be_nested_str_weak(replace), + /* K7 */ be_nested_str_weak(find), + /* K8 */ be_nested_str_weak(mac), + /* K9 */ be_nested_str_weak(_X3A), + /* K10 */ be_nested_str_weak(), + /* K11 */ be_nested_str_weak(ipv4only), + /* K12 */ be_nested_str_weak(add_hostname), + /* K13 */ be_nested_str_weak(ip6local), + /* K14 */ be_nested_str_weak(ip), + /* K15 */ be_nested_str_weak(ip6), + /* K16 */ be_nested_str_weak(log), + /* K17 */ be_nested_str_weak(format), + /* K18 */ be_nested_str_weak(MTR_X3A_X20calling_X20mdns_X2Eadd_hostname_X28_X25s_X2C_X20_X25s_X29), + /* K19 */ be_const_int(3), + /* K20 */ be_nested_str_weak(wifi), + /* K21 */ be_nested_str_weak(hostname_wifi), + /* K22 */ be_nested_str_weak(MTR_X3A_X20start_X20mDNS_X20on_X20_X25s_X20host_X20_X27_X25s_X2Elocal_X27), + /* K23 */ be_nested_str_weak(MTR_X3A_X20Exception), + /* K24 */ be_nested_str_weak(_X7C), + /* K25 */ be_const_int(2), + /* K26 */ be_nested_str_weak(mdns_announce_op_discovery_all_fabrics), }), - be_str_weak(mdns_remove_PASE), + be_str_weak(_mdns_announce_hostname), &be_const_str_solidified, - ( &(const binstruction[83]) { /* code */ - 0xA4060000, // 0000 IMPORT R1 K0 - 0xA40A0200, // 0001 IMPORT R2 K1 - 0xA802003D, // 0002 EXBLK 0 #0041 - 0x880C0102, // 0003 GETMBR R3 R0 K2 - 0x780E001B, // 0004 JMPF R3 #0021 - 0xB80E0600, // 0005 GETNGBL R3 K3 - 0x8C0C0704, // 0006 GETMET R3 R3 K4 - 0x8C140505, // 0007 GETMET R5 R2 K5 - 0x581C0006, // 0008 LDCONST R7 K6 - 0x58200007, // 0009 LDCONST R8 K7 - 0x58240008, // 000A LDCONST R9 K8 - 0x88280109, // 000B GETMBR R10 R0 K9 - 0x882C010A, // 000C GETMBR R11 R0 K10 - 0x7C140C00, // 000D CALL R5 6 - 0x5818000B, // 000E LDCONST R6 K11 - 0x7C0C0600, // 000F CALL R3 3 - 0xB80E0600, // 0010 GETNGBL R3 K3 - 0x8C0C0704, // 0011 GETMET R3 R3 K4 - 0x8C140505, // 0012 GETMET R5 R2 K5 - 0x581C000C, // 0013 LDCONST R7 K12 - 0x5820000D, // 0014 LDCONST R8 K13 - 0x88240109, // 0015 GETMBR R9 R0 K9 - 0x7C140800, // 0016 CALL R5 4 - 0x5818000E, // 0017 LDCONST R6 K14 - 0x7C0C0600, // 0018 CALL R3 3 - 0x500C0000, // 0019 LDBOOL R3 0 0 - 0x90020403, // 001A SETMBR R0 K2 R3 - 0x8C0C030F, // 001B GETMET R3 R1 K15 - 0x58140007, // 001C LDCONST R5 K7 - 0x58180008, // 001D LDCONST R6 K8 - 0x881C0109, // 001E GETMBR R7 R0 K9 - 0x8820010A, // 001F GETMBR R8 R0 K10 - 0x7C0C0A00, // 0020 CALL R3 5 - 0x880C0110, // 0021 GETMBR R3 R0 K16 - 0x780E001B, // 0022 JMPF R3 #003F - 0xB80E0600, // 0023 GETNGBL R3 K3 - 0x8C0C0704, // 0024 GETMET R3 R3 K4 - 0x8C140505, // 0025 GETMET R5 R2 K5 - 0x581C0006, // 0026 LDCONST R7 K6 - 0x58200007, // 0027 LDCONST R8 K7 - 0x58240008, // 0028 LDCONST R9 K8 - 0x88280111, // 0029 GETMBR R10 R0 K17 - 0x882C0112, // 002A GETMBR R11 R0 K18 - 0x7C140C00, // 002B CALL R5 6 - 0x5818000B, // 002C LDCONST R6 K11 - 0x7C0C0600, // 002D CALL R3 3 - 0xB80E0600, // 002E GETNGBL R3 K3 - 0x8C0C0704, // 002F GETMET R3 R3 K4 - 0x8C140505, // 0030 GETMET R5 R2 K5 - 0x581C000C, // 0031 LDCONST R7 K12 - 0x58200013, // 0032 LDCONST R8 K19 - 0x88240111, // 0033 GETMBR R9 R0 K17 - 0x7C140800, // 0034 CALL R5 4 - 0x5818000E, // 0035 LDCONST R6 K14 - 0x7C0C0600, // 0036 CALL R3 3 - 0x500C0000, // 0037 LDBOOL R3 0 0 - 0x90022003, // 0038 SETMBR R0 K16 R3 - 0x8C0C030F, // 0039 GETMET R3 R1 K15 - 0x58140007, // 003A LDCONST R5 K7 - 0x58180008, // 003B LDCONST R6 K8 - 0x881C0111, // 003C GETMBR R7 R0 K17 - 0x88200112, // 003D GETMBR R8 R0 K18 - 0x7C0C0A00, // 003E CALL R3 5 - 0xA8040001, // 003F EXBLK 1 1 - 0x70020010, // 0040 JMP #0052 - 0xAC0C0002, // 0041 CATCH R3 0 2 - 0x7002000D, // 0042 JMP #0051 - 0xB8160600, // 0043 GETNGBL R5 K3 - 0x8C140B04, // 0044 GETMET R5 R5 K4 - 0x601C0008, // 0045 GETGBL R7 G8 - 0x5C200600, // 0046 MOVE R8 R3 - 0x7C1C0200, // 0047 CALL R7 1 - 0x001E2807, // 0048 ADD R7 K20 R7 - 0x001C0F15, // 0049 ADD R7 R7 K21 - 0x60200008, // 004A GETGBL R8 G8 - 0x5C240800, // 004B MOVE R9 R4 - 0x7C200200, // 004C CALL R8 1 - 0x001C0E08, // 004D ADD R7 R7 R8 - 0x5820000E, // 004E LDCONST R8 K14 - 0x7C140600, // 004F CALL R5 3 - 0x70020000, // 0050 JMP #0052 - 0xB0080000, // 0051 RAISE 2 R0 R0 - 0x80000000, // 0052 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: every_250ms -********************************************************************/ -be_local_closure(Matter_Device_every_250ms, /* name */ - be_nested_proto( - 4, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 5]) { /* constants */ - /* K0 */ be_nested_str_weak(message_handler), - /* K1 */ be_nested_str_weak(every_250ms), - /* K2 */ be_const_int(0), - /* K3 */ be_nested_str_weak(plugins), - /* K4 */ be_const_int(1), - }), - be_str_weak(every_250ms), - &be_const_str_solidified, - ( &(const binstruction[16]) { /* code */ - 0x88040100, // 0000 GETMBR R1 R0 K0 - 0x8C040301, // 0001 GETMET R1 R1 K1 - 0x7C040200, // 0002 CALL R1 1 - 0x58040002, // 0003 LDCONST R1 K2 - 0x6008000C, // 0004 GETGBL R2 G12 - 0x880C0103, // 0005 GETMBR R3 R0 K3 - 0x7C080200, // 0006 CALL R2 1 - 0x14080202, // 0007 LT R2 R1 R2 - 0x780A0005, // 0008 JMPF R2 #000F - 0x88080103, // 0009 GETMBR R2 R0 K3 - 0x94080401, // 000A GETIDX R2 R2 R1 - 0x8C080501, // 000B GETMET R2 R2 K1 - 0x7C080200, // 000C CALL R2 1 - 0x00040304, // 000D ADD R1 R1 K4 - 0x7001FFF4, // 000E JMP #0004 - 0x80000000, // 000F RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: adjust_next_ep -********************************************************************/ -be_local_closure(Matter_Device_adjust_next_ep, /* name */ - be_nested_proto( - 5, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 5]) { /* constants */ - /* K0 */ be_nested_str_weak(plugins_config), - /* K1 */ be_nested_str_weak(keys), - /* K2 */ be_nested_str_weak(next_ep), - /* K3 */ be_const_int(1), - /* K4 */ be_nested_str_weak(stop_iteration), - }), - be_str_weak(adjust_next_ep), - &be_const_str_solidified, - ( &(const binstruction[21]) { /* code */ - 0x60040010, // 0000 GETGBL R1 G16 - 0x88080100, // 0001 GETMBR R2 R0 K0 - 0x8C080501, // 0002 GETMET R2 R2 K1 - 0x7C080200, // 0003 CALL R2 1 - 0x7C040200, // 0004 CALL R1 1 - 0xA802000A, // 0005 EXBLK 0 #0011 - 0x5C080200, // 0006 MOVE R2 R1 - 0x7C080000, // 0007 CALL R2 0 - 0x600C0009, // 0008 GETGBL R3 G9 - 0x5C100400, // 0009 MOVE R4 R2 - 0x7C0C0200, // 000A CALL R3 1 - 0x88100102, // 000B GETMBR R4 R0 K2 - 0x28100604, // 000C GE R4 R3 R4 - 0x78120001, // 000D JMPF R4 #0010 - 0x00100703, // 000E ADD R4 R3 K3 - 0x90020404, // 000F SETMBR R0 K2 R4 - 0x7001FFF4, // 0010 JMP #0006 - 0x58040004, // 0011 LDCONST R1 K4 - 0xAC040200, // 0012 CATCH R1 1 0 - 0xB0080000, // 0013 RAISE 2 R0 R0 - 0x80000000, // 0014 RET 0 + ( &(const binstruction[140]) { /* code */ + 0xA40A0000, // 0000 IMPORT R2 K0 + 0xA40E0200, // 0001 IMPORT R3 K1 + 0x8C100502, // 0002 GETMET R4 R2 K2 + 0x7C100200, // 0003 CALL R4 1 + 0xA8020072, // 0004 EXBLK 0 #0078 + 0x78060030, // 0005 JMPF R1 #0037 + 0xB8120600, // 0006 GETNGBL R4 K3 + 0x8C100904, // 0007 GETMET R4 R4 K4 + 0x7C100200, // 0008 CALL R4 1 + 0x8C140706, // 0009 GETMET R5 R3 K6 + 0x8C1C0907, // 000A GETMET R7 R4 K7 + 0x58240008, // 000B LDCONST R9 K8 + 0x7C1C0400, // 000C CALL R7 2 + 0x58200009, // 000D LDCONST R8 K9 + 0x5824000A, // 000E LDCONST R9 K10 + 0x7C140800, // 000F CALL R5 4 + 0x90020A05, // 0010 SETMBR R0 K5 R5 + 0x8814010B, // 0011 GETMBR R5 R0 K11 + 0x7416000F, // 0012 JMPT R5 #0023 + 0x8C14050C, // 0013 GETMET R5 R2 K12 + 0x881C0105, // 0014 GETMBR R7 R0 K5 + 0x8C200907, // 0015 GETMET R8 R4 K7 + 0x5828000D, // 0016 LDCONST R10 K13 + 0x582C000A, // 0017 LDCONST R11 K10 + 0x7C200600, // 0018 CALL R8 3 + 0x8C240907, // 0019 GETMET R9 R4 K7 + 0x582C000E, // 001A LDCONST R11 K14 + 0x5830000A, // 001B LDCONST R12 K10 + 0x7C240600, // 001C CALL R9 3 + 0x8C280907, // 001D GETMET R10 R4 K7 + 0x5830000F, // 001E LDCONST R12 K15 + 0x5834000A, // 001F LDCONST R13 K10 + 0x7C280600, // 0020 CALL R10 3 + 0x7C140A00, // 0021 CALL R5 5 + 0x70020012, // 0022 JMP #0036 + 0xB8160600, // 0023 GETNGBL R5 K3 + 0x8C140B10, // 0024 GETMET R5 R5 K16 + 0x8C1C0711, // 0025 GETMET R7 R3 K17 + 0x58240012, // 0026 LDCONST R9 K18 + 0x88280105, // 0027 GETMBR R10 R0 K5 + 0x8C2C0907, // 0028 GETMET R11 R4 K7 + 0x5834000E, // 0029 LDCONST R13 K14 + 0x5838000A, // 002A LDCONST R14 K10 + 0x7C2C0600, // 002B CALL R11 3 + 0x7C1C0800, // 002C CALL R7 4 + 0x58200013, // 002D LDCONST R8 K19 + 0x7C140600, // 002E CALL R5 3 + 0x8C14050C, // 002F GETMET R5 R2 K12 + 0x881C0105, // 0030 GETMBR R7 R0 K5 + 0x8C200907, // 0031 GETMET R8 R4 K7 + 0x5828000E, // 0032 LDCONST R10 K14 + 0x582C000A, // 0033 LDCONST R11 K10 + 0x7C200600, // 0034 CALL R8 3 + 0x7C140600, // 0035 CALL R5 3 + 0x7002002F, // 0036 JMP #0067 + 0xB8120600, // 0037 GETNGBL R4 K3 + 0x8C100914, // 0038 GETMET R4 R4 K20 + 0x7C100200, // 0039 CALL R4 1 + 0x8C140706, // 003A GETMET R5 R3 K6 + 0x8C1C0907, // 003B GETMET R7 R4 K7 + 0x58240008, // 003C LDCONST R9 K8 + 0x7C1C0400, // 003D CALL R7 2 + 0x58200009, // 003E LDCONST R8 K9 + 0x5824000A, // 003F LDCONST R9 K10 + 0x7C140800, // 0040 CALL R5 4 + 0x90022A05, // 0041 SETMBR R0 K21 R5 + 0x8814010B, // 0042 GETMBR R5 R0 K11 + 0x7416000F, // 0043 JMPT R5 #0054 + 0x8C14050C, // 0044 GETMET R5 R2 K12 + 0x881C0115, // 0045 GETMBR R7 R0 K21 + 0x8C200907, // 0046 GETMET R8 R4 K7 + 0x5828000D, // 0047 LDCONST R10 K13 + 0x582C000A, // 0048 LDCONST R11 K10 + 0x7C200600, // 0049 CALL R8 3 + 0x8C240907, // 004A GETMET R9 R4 K7 + 0x582C000E, // 004B LDCONST R11 K14 + 0x5830000A, // 004C LDCONST R12 K10 + 0x7C240600, // 004D CALL R9 3 + 0x8C280907, // 004E GETMET R10 R4 K7 + 0x5830000F, // 004F LDCONST R12 K15 + 0x5834000A, // 0050 LDCONST R13 K10 + 0x7C280600, // 0051 CALL R10 3 + 0x7C140A00, // 0052 CALL R5 5 + 0x70020012, // 0053 JMP #0067 + 0xB8160600, // 0054 GETNGBL R5 K3 + 0x8C140B10, // 0055 GETMET R5 R5 K16 + 0x8C1C0711, // 0056 GETMET R7 R3 K17 + 0x58240012, // 0057 LDCONST R9 K18 + 0x88280105, // 0058 GETMBR R10 R0 K5 + 0x8C2C0907, // 0059 GETMET R11 R4 K7 + 0x5834000E, // 005A LDCONST R13 K14 + 0x5838000A, // 005B LDCONST R14 K10 + 0x7C2C0600, // 005C CALL R11 3 + 0x7C1C0800, // 005D CALL R7 4 + 0x58200013, // 005E LDCONST R8 K19 + 0x7C140600, // 005F CALL R5 3 + 0x8C14050C, // 0060 GETMET R5 R2 K12 + 0x881C0115, // 0061 GETMBR R7 R0 K21 + 0x8C200907, // 0062 GETMET R8 R4 K7 + 0x5828000E, // 0063 LDCONST R10 K14 + 0x582C000A, // 0064 LDCONST R11 K10 + 0x7C200600, // 0065 CALL R8 3 + 0x7C140600, // 0066 CALL R5 3 + 0xB8120600, // 0067 GETNGBL R4 K3 + 0x8C100910, // 0068 GETMET R4 R4 K16 + 0x8C180711, // 0069 GETMET R6 R3 K17 + 0x58200016, // 006A LDCONST R8 K22 + 0x78060001, // 006B JMPF R1 #006E + 0x58240004, // 006C LDCONST R9 K4 + 0x70020000, // 006D JMP #006F + 0x58240014, // 006E LDCONST R9 K20 + 0x78060001, // 006F JMPF R1 #0072 + 0x88280105, // 0070 GETMBR R10 R0 K5 + 0x70020000, // 0071 JMP #0073 + 0x88280115, // 0072 GETMBR R10 R0 K21 + 0x7C180800, // 0073 CALL R6 4 + 0x581C0013, // 0074 LDCONST R7 K19 + 0x7C100600, // 0075 CALL R4 3 + 0xA8040001, // 0076 EXBLK 1 1 + 0x70020010, // 0077 JMP #0089 + 0xAC100002, // 0078 CATCH R4 0 2 + 0x7002000D, // 0079 JMP #0088 + 0xB81A0600, // 007A GETNGBL R6 K3 + 0x8C180D10, // 007B GETMET R6 R6 K16 + 0x60200008, // 007C GETGBL R8 G8 + 0x5C240800, // 007D MOVE R9 R4 + 0x7C200200, // 007E CALL R8 1 + 0x00222E08, // 007F ADD R8 K23 R8 + 0x00201118, // 0080 ADD R8 R8 K24 + 0x60240008, // 0081 GETGBL R9 G8 + 0x5C280A00, // 0082 MOVE R10 R5 + 0x7C240200, // 0083 CALL R9 1 + 0x00201009, // 0084 ADD R8 R8 R9 + 0x58240019, // 0085 LDCONST R9 K25 + 0x7C180600, // 0086 CALL R6 3 + 0x70020000, // 0087 JMP #0089 + 0xB0080000, // 0088 RAISE 2 R0 R0 + 0x8C10011A, // 0089 GETMET R4 R0 K26 + 0x7C100200, // 008A CALL R4 1 + 0x80000000, // 008B RET 0 }) ) ); @@ -639,1499 +257,6 @@ be_local_closure(Matter_Device_save_before_restart, /* name */ /*******************************************************************/ -/******************************************************************** -** Solidified function: invoke_request -********************************************************************/ -be_local_closure(Matter_Device_invoke_request, /* name */ - be_nested_proto( - 12, /* nstack */ - 4, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 8]) { /* constants */ - /* K0 */ be_const_int(0), - /* K1 */ be_nested_str_weak(endpoint), - /* K2 */ be_nested_str_weak(plugins), - /* K3 */ be_nested_str_weak(invoke_request), - /* K4 */ be_const_int(1), - /* K5 */ be_nested_str_weak(status), - /* K6 */ be_nested_str_weak(matter), - /* K7 */ be_nested_str_weak(UNSUPPORTED_ENDPOINT), - }), - be_str_weak(invoke_request), - &be_const_str_solidified, - ( &(const binstruction[24]) { /* code */ - 0x58100000, // 0000 LDCONST R4 K0 - 0x88140701, // 0001 GETMBR R5 R3 K1 - 0x6018000C, // 0002 GETGBL R6 G12 - 0x881C0102, // 0003 GETMBR R7 R0 K2 - 0x7C180200, // 0004 CALL R6 1 - 0x14180806, // 0005 LT R6 R4 R6 - 0x781A000C, // 0006 JMPF R6 #0014 - 0x88180102, // 0007 GETMBR R6 R0 K2 - 0x94180C04, // 0008 GETIDX R6 R6 R4 - 0x881C0D01, // 0009 GETMBR R7 R6 K1 - 0x1C1C0E05, // 000A EQ R7 R7 R5 - 0x781E0005, // 000B JMPF R7 #0012 - 0x8C1C0D03, // 000C GETMET R7 R6 K3 - 0x5C240200, // 000D MOVE R9 R1 - 0x5C280400, // 000E MOVE R10 R2 - 0x5C2C0600, // 000F MOVE R11 R3 - 0x7C1C0800, // 0010 CALL R7 4 - 0x80040E00, // 0011 RET 1 R7 - 0x00100904, // 0012 ADD R4 R4 K4 - 0x7001FFED, // 0013 JMP #0002 - 0xB81A0C00, // 0014 GETNGBL R6 K6 - 0x88180D07, // 0015 GETMBR R6 R6 K7 - 0x900E0A06, // 0016 SETMBR R3 K5 R6 - 0x80000000, // 0017 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: _instantiate_plugins_from_config -********************************************************************/ -be_local_closure(Matter_Device__instantiate_plugins_from_config, /* name */ - be_nested_proto( - 19, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[34]) { /* constants */ - /* K0 */ be_nested_str_weak(string), - /* K1 */ be_nested_str_weak(k2l_num), - /* K2 */ be_nested_str_weak(tasmota), - /* K3 */ be_nested_str_weak(log), - /* K4 */ be_nested_str_weak(MTR_X3A_X20endpoints_X20to_X20be_X20configured_X20), - /* K5 */ be_const_int(3), - /* K6 */ be_nested_str_weak(plugins), - /* K7 */ be_nested_str_weak(push), - /* K8 */ be_nested_str_weak(matter), - /* K9 */ be_nested_str_weak(Plugin_Root), - /* K10 */ be_const_int(0), - /* K11 */ be_nested_str_weak(format), - /* K12 */ be_nested_str_weak(MTR_X3A_X20endpoint_X3A_X25i_X20type_X3A_X25s_X25s), - /* K13 */ be_nested_str_weak(root), - /* K14 */ be_nested_str_weak(), - /* K15 */ be_const_int(2), - /* K16 */ be_nested_str_weak(Plugin_Aggregator), - /* K17 */ be_nested_str_weak(aggregator), - /* K18 */ be_nested_str_weak(MTR_X3A_X20endpoint_X20_X25i_X20config_X20_X25s), - /* K19 */ be_nested_str_weak(find), - /* K20 */ be_nested_str_weak(type), - /* K21 */ be_nested_str_weak(MTR_X3A_X20no_X20class_X20name_X2C_X20skipping), - /* K22 */ be_nested_str_weak(MTR_X3A_X20only_X20one_X20root_X20node_X20allowed), - /* K23 */ be_nested_str_weak(plugins_classes), - /* K24 */ be_nested_str_weak(MTR_X3A_X20unknown_X20class_X20name_X20_X27), - /* K25 */ be_nested_str_weak(_X27_X20skipping), - /* K26 */ be_nested_str_weak(k2l), - /* K27 */ be_nested_str_weak(_X20_X25s_X3A_X25s), - /* K28 */ be_nested_str_weak(stop_iteration), - /* K29 */ be_nested_str_weak(MTR_X3A_X20Exception), - /* K30 */ be_nested_str_weak(_X7C), - /* K31 */ be_nested_str_weak(publish_result), - /* K32 */ be_nested_str_weak(_X7B_X22Matter_X22_X3A_X7B_X22Initialized_X22_X3A1_X7D_X7D), - /* K33 */ be_nested_str_weak(Matter), - }), - be_str_weak(_instantiate_plugins_from_config), - &be_const_str_solidified, - ( &(const binstruction[185]) { /* code */ - 0xA40A0000, // 0000 IMPORT R2 K0 - 0x8C0C0101, // 0001 GETMET R3 R0 K1 - 0x5C140200, // 0002 MOVE R5 R1 - 0x7C0C0400, // 0003 CALL R3 2 - 0xB8120400, // 0004 GETNGBL R4 K2 - 0x8C100903, // 0005 GETMET R4 R4 K3 - 0x60180008, // 0006 GETGBL R6 G8 - 0x5C1C0600, // 0007 MOVE R7 R3 - 0x7C180200, // 0008 CALL R6 1 - 0x001A0806, // 0009 ADD R6 K4 R6 - 0x581C0005, // 000A LDCONST R7 K5 - 0x7C100600, // 000B CALL R4 3 - 0x88100106, // 000C GETMBR R4 R0 K6 - 0x8C100907, // 000D GETMET R4 R4 K7 - 0xB81A1000, // 000E GETNGBL R6 K8 - 0x8C180D09, // 000F GETMET R6 R6 K9 - 0x5C200000, // 0010 MOVE R8 R0 - 0x5824000A, // 0011 LDCONST R9 K10 - 0x60280013, // 0012 GETGBL R10 G19 - 0x7C280000, // 0013 CALL R10 0 - 0x7C180800, // 0014 CALL R6 4 - 0x7C100400, // 0015 CALL R4 2 - 0xB8120400, // 0016 GETNGBL R4 K2 - 0x8C100903, // 0017 GETMET R4 R4 K3 - 0x8C18050B, // 0018 GETMET R6 R2 K11 - 0x5820000C, // 0019 LDCONST R8 K12 - 0x5824000A, // 001A LDCONST R9 K10 - 0x5828000D, // 001B LDCONST R10 K13 - 0x582C000E, // 001C LDCONST R11 K14 - 0x7C180A00, // 001D CALL R6 5 - 0x581C000F, // 001E LDCONST R7 K15 - 0x7C100600, // 001F CALL R4 3 - 0x88100106, // 0020 GETMBR R4 R0 K6 - 0x8C100907, // 0021 GETMET R4 R4 K7 - 0xB81A1000, // 0022 GETNGBL R6 K8 - 0x8C180D10, // 0023 GETMET R6 R6 K16 - 0x5C200000, // 0024 MOVE R8 R0 - 0x5426FEFF, // 0025 LDINT R9 65280 - 0x60280013, // 0026 GETGBL R10 G19 - 0x7C280000, // 0027 CALL R10 0 - 0x7C180800, // 0028 CALL R6 4 - 0x7C100400, // 0029 CALL R4 2 - 0xB8120400, // 002A GETNGBL R4 K2 - 0x8C100903, // 002B GETMET R4 R4 K3 - 0x8C18050B, // 002C GETMET R6 R2 K11 - 0x5820000C, // 002D LDCONST R8 K12 - 0x5426FEFF, // 002E LDINT R9 65280 - 0x58280011, // 002F LDCONST R10 K17 - 0x582C000E, // 0030 LDCONST R11 K14 - 0x7C180A00, // 0031 CALL R6 5 - 0x581C000F, // 0032 LDCONST R7 K15 - 0x7C100600, // 0033 CALL R4 3 - 0x60100010, // 0034 GETGBL R4 G16 - 0x5C140600, // 0035 MOVE R5 R3 - 0x7C100200, // 0036 CALL R4 1 - 0xA8020077, // 0037 EXBLK 0 #00B0 - 0x5C140800, // 0038 MOVE R5 R4 - 0x7C140000, // 0039 CALL R5 0 - 0x1C180B0A, // 003A EQ R6 R5 K10 - 0x781A0000, // 003B JMPF R6 #003D - 0x7001FFFA, // 003C JMP #0038 - 0xA802005F, // 003D EXBLK 0 #009E - 0x60180008, // 003E GETGBL R6 G8 - 0x5C1C0A00, // 003F MOVE R7 R5 - 0x7C180200, // 0040 CALL R6 1 - 0x94180206, // 0041 GETIDX R6 R1 R6 - 0xB81E0400, // 0042 GETNGBL R7 K2 - 0x8C1C0F03, // 0043 GETMET R7 R7 K3 - 0x8C24050B, // 0044 GETMET R9 R2 K11 - 0x582C0012, // 0045 LDCONST R11 K18 - 0x5C300A00, // 0046 MOVE R12 R5 - 0x5C340C00, // 0047 MOVE R13 R6 - 0x7C240800, // 0048 CALL R9 4 - 0x58280005, // 0049 LDCONST R10 K5 - 0x7C1C0600, // 004A CALL R7 3 - 0x8C1C0D13, // 004B GETMET R7 R6 K19 - 0x58240014, // 004C LDCONST R9 K20 - 0x7C1C0400, // 004D CALL R7 2 - 0x4C200000, // 004E LDNIL R8 - 0x1C200E08, // 004F EQ R8 R7 R8 - 0x78220006, // 0050 JMPF R8 #0058 - 0xB8220400, // 0051 GETNGBL R8 K2 - 0x8C201103, // 0052 GETMET R8 R8 K3 - 0x58280015, // 0053 LDCONST R10 K21 - 0x582C0005, // 0054 LDCONST R11 K5 - 0x7C200600, // 0055 CALL R8 3 - 0xA8040001, // 0056 EXBLK 1 1 - 0x7001FFDF, // 0057 JMP #0038 - 0x1C200F0D, // 0058 EQ R8 R7 K13 - 0x78220006, // 0059 JMPF R8 #0061 - 0xB8220400, // 005A GETNGBL R8 K2 - 0x8C201103, // 005B GETMET R8 R8 K3 - 0x58280016, // 005C LDCONST R10 K22 - 0x582C0005, // 005D LDCONST R11 K5 - 0x7C200600, // 005E CALL R8 3 - 0xA8040001, // 005F EXBLK 1 1 - 0x7001FFD6, // 0060 JMP #0038 - 0x88200117, // 0061 GETMBR R8 R0 K23 - 0x8C201113, // 0062 GETMET R8 R8 K19 - 0x5C280E00, // 0063 MOVE R10 R7 - 0x7C200400, // 0064 CALL R8 2 - 0x4C240000, // 0065 LDNIL R9 - 0x1C241009, // 0066 EQ R9 R8 R9 - 0x7826000A, // 0067 JMPF R9 #0073 - 0xB8260400, // 0068 GETNGBL R9 K2 - 0x8C241303, // 0069 GETMET R9 R9 K3 - 0x602C0008, // 006A GETGBL R11 G8 - 0x5C300E00, // 006B MOVE R12 R7 - 0x7C2C0200, // 006C CALL R11 1 - 0x002E300B, // 006D ADD R11 K24 R11 - 0x002C1719, // 006E ADD R11 R11 K25 - 0x5830000F, // 006F LDCONST R12 K15 - 0x7C240600, // 0070 CALL R9 3 - 0xA8040001, // 0071 EXBLK 1 1 - 0x7001FFC4, // 0072 JMP #0038 - 0x5C241000, // 0073 MOVE R9 R8 - 0x5C280000, // 0074 MOVE R10 R0 - 0x5C2C0A00, // 0075 MOVE R11 R5 - 0x5C300C00, // 0076 MOVE R12 R6 - 0x7C240600, // 0077 CALL R9 3 - 0x88280106, // 0078 GETMBR R10 R0 K6 - 0x8C281507, // 0079 GETMET R10 R10 K7 - 0x5C301200, // 007A MOVE R12 R9 - 0x7C280400, // 007B CALL R10 2 - 0x5828000E, // 007C LDCONST R10 K14 - 0x602C0010, // 007D GETGBL R11 G16 - 0x8C30011A, // 007E GETMET R12 R0 K26 - 0x5C380C00, // 007F MOVE R14 R6 - 0x7C300400, // 0080 CALL R12 2 - 0x7C2C0200, // 0081 CALL R11 1 - 0xA802000B, // 0082 EXBLK 0 #008F - 0x5C301600, // 0083 MOVE R12 R11 - 0x7C300000, // 0084 CALL R12 0 - 0x1C341914, // 0085 EQ R13 R12 K20 - 0x78360000, // 0086 JMPF R13 #0088 - 0x7001FFFA, // 0087 JMP #0083 - 0x8C34050B, // 0088 GETMET R13 R2 K11 - 0x583C001B, // 0089 LDCONST R15 K27 - 0x5C401800, // 008A MOVE R16 R12 - 0x94440C0C, // 008B GETIDX R17 R6 R12 - 0x7C340800, // 008C CALL R13 4 - 0x0028140D, // 008D ADD R10 R10 R13 - 0x7001FFF3, // 008E JMP #0083 - 0x582C001C, // 008F LDCONST R11 K28 - 0xAC2C0200, // 0090 CATCH R11 1 0 - 0xB0080000, // 0091 RAISE 2 R0 R0 - 0xB82E0400, // 0092 GETNGBL R11 K2 - 0x8C2C1703, // 0093 GETMET R11 R11 K3 - 0x8C34050B, // 0094 GETMET R13 R2 K11 - 0x583C000C, // 0095 LDCONST R15 K12 - 0x5C400A00, // 0096 MOVE R16 R5 - 0x5C440E00, // 0097 MOVE R17 R7 - 0x5C481400, // 0098 MOVE R18 R10 - 0x7C340A00, // 0099 CALL R13 5 - 0x5838000F, // 009A LDCONST R14 K15 - 0x7C2C0600, // 009B CALL R11 3 - 0xA8040001, // 009C EXBLK 1 1 - 0x70020010, // 009D JMP #00AF - 0xAC180002, // 009E CATCH R6 0 2 - 0x7002000D, // 009F JMP #00AE - 0xB8220400, // 00A0 GETNGBL R8 K2 - 0x8C201103, // 00A1 GETMET R8 R8 K3 - 0x60280008, // 00A2 GETGBL R10 G8 - 0x5C2C0C00, // 00A3 MOVE R11 R6 - 0x7C280200, // 00A4 CALL R10 1 - 0x002A3A0A, // 00A5 ADD R10 K29 R10 - 0x0028151E, // 00A6 ADD R10 R10 K30 - 0x602C0008, // 00A7 GETGBL R11 G8 - 0x5C300E00, // 00A8 MOVE R12 R7 - 0x7C2C0200, // 00A9 CALL R11 1 - 0x0028140B, // 00AA ADD R10 R10 R11 - 0x582C000F, // 00AB LDCONST R11 K15 - 0x7C200600, // 00AC CALL R8 3 - 0x70020000, // 00AD JMP #00AF - 0xB0080000, // 00AE RAISE 2 R0 R0 - 0x7001FF87, // 00AF JMP #0038 - 0x5810001C, // 00B0 LDCONST R4 K28 - 0xAC100200, // 00B1 CATCH R4 1 0 - 0xB0080000, // 00B2 RAISE 2 R0 R0 - 0xB8120400, // 00B3 GETNGBL R4 K2 - 0x8C10091F, // 00B4 GETMET R4 R4 K31 - 0x58180020, // 00B5 LDCONST R6 K32 - 0x581C0021, // 00B6 LDCONST R7 K33 - 0x7C100600, // 00B7 CALL R4 3 - 0x80000000, // 00B8 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: start_commissioning_complete -********************************************************************/ -be_local_closure(Matter_Device_start_commissioning_complete, /* name */ - be_nested_proto( - 6, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 5]) { /* constants */ - /* K0 */ be_nested_str_weak(tasmota), - /* K1 */ be_nested_str_weak(log), - /* K2 */ be_nested_str_weak(MTR_X3A_X20_X2A_X2A_X2A_X20Commissioning_X20complete_X20_X2A_X2A_X2A), - /* K3 */ be_const_int(2), - /* K4 */ be_nested_str_weak(stop_basic_commissioning), - }), - be_str_weak(start_commissioning_complete), - &be_const_str_solidified, - ( &(const binstruction[ 8]) { /* code */ - 0xB80A0000, // 0000 GETNGBL R2 K0 - 0x8C080501, // 0001 GETMET R2 R2 K1 - 0x58100002, // 0002 LDCONST R4 K2 - 0x58140003, // 0003 LDCONST R5 K3 - 0x7C080600, // 0004 CALL R2 3 - 0x8C080104, // 0005 GETMET R2 R0 K4 - 0x7C080200, // 0006 CALL R2 1 - 0x80000000, // 0007 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: k2l -********************************************************************/ -be_local_closure(Matter_Device_k2l, /* name */ - be_nested_proto( - 8, /* nstack */ - 1, /* argc */ - 4, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 6]) { /* constants */ - /* K0 */ be_const_class(be_class_Matter_Device), - /* K1 */ be_nested_str_weak(keys), - /* K2 */ be_nested_str_weak(push), - /* K3 */ be_nested_str_weak(stop_iteration), - /* K4 */ be_const_int(1), - /* K5 */ be_const_int(0), - }), - be_str_weak(k2l), - &be_const_str_solidified, - ( &(const binstruction[50]) { /* code */ - 0x58040000, // 0000 LDCONST R1 K0 - 0x60080012, // 0001 GETGBL R2 G18 - 0x7C080000, // 0002 CALL R2 0 - 0x4C0C0000, // 0003 LDNIL R3 - 0x1C0C0003, // 0004 EQ R3 R0 R3 - 0x780E0000, // 0005 JMPF R3 #0007 - 0x80040400, // 0006 RET 1 R2 - 0x600C0010, // 0007 GETGBL R3 G16 - 0x8C100101, // 0008 GETMET R4 R0 K1 - 0x7C100200, // 0009 CALL R4 1 - 0x7C0C0200, // 000A CALL R3 1 - 0xA8020005, // 000B EXBLK 0 #0012 - 0x5C100600, // 000C MOVE R4 R3 - 0x7C100000, // 000D CALL R4 0 - 0x8C140502, // 000E GETMET R5 R2 K2 - 0x5C1C0800, // 000F MOVE R7 R4 - 0x7C140400, // 0010 CALL R5 2 - 0x7001FFF9, // 0011 JMP #000C - 0x580C0003, // 0012 LDCONST R3 K3 - 0xAC0C0200, // 0013 CATCH R3 1 0 - 0xB0080000, // 0014 RAISE 2 R0 R0 - 0x600C0010, // 0015 GETGBL R3 G16 - 0x6010000C, // 0016 GETGBL R4 G12 - 0x5C140400, // 0017 MOVE R5 R2 - 0x7C100200, // 0018 CALL R4 1 - 0x04100904, // 0019 SUB R4 R4 K4 - 0x40120804, // 001A CONNECT R4 K4 R4 - 0x7C0C0200, // 001B CALL R3 1 - 0xA8020010, // 001C EXBLK 0 #002E - 0x5C100600, // 001D MOVE R4 R3 - 0x7C100000, // 001E CALL R4 0 - 0x94140404, // 001F GETIDX R5 R2 R4 - 0x5C180800, // 0020 MOVE R6 R4 - 0x241C0D05, // 0021 GT R7 R6 K5 - 0x781E0008, // 0022 JMPF R7 #002C - 0x041C0D04, // 0023 SUB R7 R6 K4 - 0x941C0407, // 0024 GETIDX R7 R2 R7 - 0x241C0E05, // 0025 GT R7 R7 R5 - 0x781E0004, // 0026 JMPF R7 #002C - 0x041C0D04, // 0027 SUB R7 R6 K4 - 0x941C0407, // 0028 GETIDX R7 R2 R7 - 0x98080C07, // 0029 SETIDX R2 R6 R7 - 0x04180D04, // 002A SUB R6 R6 K4 - 0x7001FFF4, // 002B JMP #0021 - 0x98080C05, // 002C SETIDX R2 R6 R5 - 0x7001FFEE, // 002D JMP #001D - 0x580C0003, // 002E LDCONST R3 K3 - 0xAC0C0200, // 002F CATCH R3 1 0 - 0xB0080000, // 0030 RAISE 2 R0 R0 - 0x80040400, // 0031 RET 1 R2 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: start_operational_discovery_deferred -********************************************************************/ -be_local_closure(Matter_Device_start_operational_discovery_deferred, /* name */ - be_nested_proto( - 6, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 1, /* has sup protos */ - ( &(const struct bproto*[ 1]) { - be_nested_proto( - 3, /* nstack */ - 0, /* argc */ - 0, /* varg */ - 1, /* has upvals */ - ( &(const bupvaldesc[ 2]) { /* upvals */ - be_local_const_upval(1, 0), - be_local_const_upval(1, 1), - }), - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 1]) { /* constants */ - /* K0 */ be_nested_str_weak(start_operational_discovery), - }), - be_str_weak(_X3Clambda_X3E), - &be_const_str_solidified, - ( &(const binstruction[ 5]) { /* code */ - 0x68000000, // 0000 GETUPV R0 U0 - 0x8C000100, // 0001 GETMET R0 R0 K0 - 0x68080001, // 0002 GETUPV R2 U1 - 0x7C000400, // 0003 CALL R0 2 - 0x80040000, // 0004 RET 1 R0 - }) - ), - }), - 1, /* has constants */ - ( &(const bvalue[ 3]) { /* constants */ - /* K0 */ be_nested_str_weak(tasmota), - /* K1 */ be_nested_str_weak(set_timer), - /* K2 */ be_const_int(0), - }), - be_str_weak(start_operational_discovery_deferred), - &be_const_str_solidified, - ( &(const binstruction[ 7]) { /* code */ - 0xB80A0000, // 0000 GETNGBL R2 K0 - 0x8C080501, // 0001 GETMET R2 R2 K1 - 0x58100002, // 0002 LDCONST R4 K2 - 0x84140000, // 0003 CLOSURE R5 P0 - 0x7C080600, // 0004 CALL R2 3 - 0xA0000000, // 0005 CLOSE R0 - 0x80000000, // 0006 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: compute_qrcode_content -********************************************************************/ -be_local_closure(Matter_Device_compute_qrcode_content, /* name */ - be_nested_proto( - 8, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[12]) { /* constants */ - /* K0 */ be_nested_str_weak(resize), - /* K1 */ be_nested_str_weak(setbits), - /* K2 */ be_const_int(3), - /* K3 */ be_nested_str_weak(vendorid), - /* K4 */ be_nested_str_weak(productid), - /* K5 */ be_nested_str_weak(root_discriminator), - /* K6 */ be_nested_str_weak(root_passcode), - /* K7 */ be_const_int(134217727), - /* K8 */ be_nested_str_weak(MT_X3A), - /* K9 */ be_nested_str_weak(matter), - /* K10 */ be_nested_str_weak(Base38), - /* K11 */ be_nested_str_weak(encode), - }), - be_str_weak(compute_qrcode_content), - &be_const_str_solidified, - ( &(const binstruction[40]) { /* code */ - 0x60040015, // 0000 GETGBL R1 G21 - 0x7C040000, // 0001 CALL R1 0 - 0x8C040300, // 0002 GETMET R1 R1 K0 - 0x540E000A, // 0003 LDINT R3 11 - 0x7C040400, // 0004 CALL R1 2 - 0x8C080301, // 0005 GETMET R2 R1 K1 - 0x58100002, // 0006 LDCONST R4 K2 - 0x5416000F, // 0007 LDINT R5 16 - 0x88180103, // 0008 GETMBR R6 R0 K3 - 0x7C080800, // 0009 CALL R2 4 - 0x8C080301, // 000A GETMET R2 R1 K1 - 0x54120012, // 000B LDINT R4 19 - 0x5416000F, // 000C LDINT R5 16 - 0x88180104, // 000D GETMBR R6 R0 K4 - 0x7C080800, // 000E CALL R2 4 - 0x8C080301, // 000F GETMET R2 R1 K1 - 0x54120024, // 0010 LDINT R4 37 - 0x54160007, // 0011 LDINT R5 8 - 0x541A0003, // 0012 LDINT R6 4 - 0x7C080800, // 0013 CALL R2 4 - 0x8C080301, // 0014 GETMET R2 R1 K1 - 0x5412002C, // 0015 LDINT R4 45 - 0x5416000B, // 0016 LDINT R5 12 - 0x88180105, // 0017 GETMBR R6 R0 K5 - 0x541E0FFE, // 0018 LDINT R7 4095 - 0x2C180C07, // 0019 AND R6 R6 R7 - 0x7C080800, // 001A CALL R2 4 - 0x8C080301, // 001B GETMET R2 R1 K1 - 0x54120038, // 001C LDINT R4 57 - 0x5416001A, // 001D LDINT R5 27 - 0x88180106, // 001E GETMBR R6 R0 K6 - 0x2C180D07, // 001F AND R6 R6 K7 - 0x7C080800, // 0020 CALL R2 4 - 0xB80A1200, // 0021 GETNGBL R2 K9 - 0x8808050A, // 0022 GETMBR R2 R2 K10 - 0x8C08050B, // 0023 GETMET R2 R2 K11 - 0x5C100200, // 0024 MOVE R4 R1 - 0x7C080400, // 0025 CALL R2 2 - 0x000A1002, // 0026 ADD R2 K8 R2 - 0x80040400, // 0027 RET 1 R2 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: sort_distinct -********************************************************************/ -be_local_closure(Matter_Device_sort_distinct, /* name */ - be_nested_proto( - 7, /* nstack */ - 1, /* argc */ - 4, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 5]) { /* constants */ - /* K0 */ be_const_class(be_class_Matter_Device), - /* K1 */ be_const_int(1), - /* K2 */ be_const_int(0), - /* K3 */ be_nested_str_weak(stop_iteration), - /* K4 */ be_nested_str_weak(remove), - }), - be_str_weak(sort_distinct), - &be_const_str_solidified, - ( &(const binstruction[53]) { /* code */ - 0x58040000, // 0000 LDCONST R1 K0 - 0x60080010, // 0001 GETGBL R2 G16 - 0x600C000C, // 0002 GETGBL R3 G12 - 0x5C100000, // 0003 MOVE R4 R0 - 0x7C0C0200, // 0004 CALL R3 1 - 0x040C0701, // 0005 SUB R3 R3 K1 - 0x400E0203, // 0006 CONNECT R3 K1 R3 - 0x7C080200, // 0007 CALL R2 1 - 0xA8020010, // 0008 EXBLK 0 #001A - 0x5C0C0400, // 0009 MOVE R3 R2 - 0x7C0C0000, // 000A CALL R3 0 - 0x94100003, // 000B GETIDX R4 R0 R3 - 0x5C140600, // 000C MOVE R5 R3 - 0x24180B02, // 000D GT R6 R5 K2 - 0x781A0008, // 000E JMPF R6 #0018 - 0x04180B01, // 000F SUB R6 R5 K1 - 0x94180006, // 0010 GETIDX R6 R0 R6 - 0x24180C04, // 0011 GT R6 R6 R4 - 0x781A0004, // 0012 JMPF R6 #0018 - 0x04180B01, // 0013 SUB R6 R5 K1 - 0x94180006, // 0014 GETIDX R6 R0 R6 - 0x98000A06, // 0015 SETIDX R0 R5 R6 - 0x04140B01, // 0016 SUB R5 R5 K1 - 0x7001FFF4, // 0017 JMP #000D - 0x98000A04, // 0018 SETIDX R0 R5 R4 - 0x7001FFEE, // 0019 JMP #0009 - 0x58080003, // 001A LDCONST R2 K3 - 0xAC080200, // 001B CATCH R2 1 0 - 0xB0080000, // 001C RAISE 2 R0 R0 - 0x58080001, // 001D LDCONST R2 K1 - 0x600C000C, // 001E GETGBL R3 G12 - 0x5C100000, // 001F MOVE R4 R0 - 0x7C0C0200, // 0020 CALL R3 1 - 0x180C0701, // 0021 LE R3 R3 K1 - 0x780E0000, // 0022 JMPF R3 #0024 - 0x80040000, // 0023 RET 1 R0 - 0x940C0102, // 0024 GETIDX R3 R0 K2 - 0x6010000C, // 0025 GETGBL R4 G12 - 0x5C140000, // 0026 MOVE R5 R0 - 0x7C100200, // 0027 CALL R4 1 - 0x14100404, // 0028 LT R4 R2 R4 - 0x78120009, // 0029 JMPF R4 #0034 - 0x94100002, // 002A GETIDX R4 R0 R2 - 0x1C100803, // 002B EQ R4 R4 R3 - 0x78120003, // 002C JMPF R4 #0031 - 0x8C100104, // 002D GETMET R4 R0 K4 - 0x5C180400, // 002E MOVE R6 R2 - 0x7C100400, // 002F CALL R4 2 - 0x70020001, // 0030 JMP #0033 - 0x940C0002, // 0031 GETIDX R3 R0 R2 - 0x00080501, // 0032 ADD R2 R2 K1 - 0x7001FFF0, // 0033 JMP #0025 - 0x80040000, // 0034 RET 1 R0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: register_http_remote -********************************************************************/ -be_local_closure(Matter_Device_register_http_remote, /* name */ - be_nested_proto( - 8, /* nstack */ - 3, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 6]) { /* constants */ - /* K0 */ be_nested_str_weak(http_remotes), - /* K1 */ be_nested_str_weak(contains), - /* K2 */ be_nested_str_weak(get_timeout), - /* K3 */ be_nested_str_weak(set_timeout), - /* K4 */ be_nested_str_weak(matter), - /* K5 */ be_nested_str_weak(HTTP_remote), - }), - be_str_weak(register_http_remote), - &be_const_str_solidified, - ( &(const binstruction[32]) { /* code */ - 0x880C0100, // 0000 GETMBR R3 R0 K0 - 0x4C100000, // 0001 LDNIL R4 - 0x1C0C0604, // 0002 EQ R3 R3 R4 - 0x780E0002, // 0003 JMPF R3 #0007 - 0x600C0013, // 0004 GETGBL R3 G19 - 0x7C0C0000, // 0005 CALL R3 0 - 0x90020003, // 0006 SETMBR R0 K0 R3 - 0x4C0C0000, // 0007 LDNIL R3 - 0x88100100, // 0008 GETMBR R4 R0 K0 - 0x8C100901, // 0009 GETMET R4 R4 K1 - 0x5C180200, // 000A MOVE R6 R1 - 0x7C100400, // 000B CALL R4 2 - 0x78120009, // 000C JMPF R4 #0017 - 0x88100100, // 000D GETMBR R4 R0 K0 - 0x940C0801, // 000E GETIDX R3 R4 R1 - 0x8C140702, // 000F GETMET R5 R3 K2 - 0x7C140200, // 0010 CALL R5 1 - 0x14140405, // 0011 LT R5 R2 R5 - 0x78160002, // 0012 JMPF R5 #0016 - 0x8C140703, // 0013 GETMET R5 R3 K3 - 0x5C1C0400, // 0014 MOVE R7 R2 - 0x7C140400, // 0015 CALL R5 2 - 0x70020007, // 0016 JMP #001F - 0xB8120800, // 0017 GETNGBL R4 K4 - 0x8C100905, // 0018 GETMET R4 R4 K5 - 0x5C180200, // 0019 MOVE R6 R1 - 0x5C1C0400, // 001A MOVE R7 R2 - 0x7C100600, // 001B CALL R4 3 - 0x5C0C0800, // 001C MOVE R3 R4 - 0x88100100, // 001D GETMBR R4 R0 K0 - 0x98100203, // 001E SETIDX R4 R1 R3 - 0x80040600, // 001F RET 1 R3 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: register_plugin_class -********************************************************************/ -be_local_closure(Matter_Device_register_plugin_class, /* name */ - be_nested_proto( - 7, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 4]) { /* constants */ - /* K0 */ be_nested_str_weak(introspect), - /* K1 */ be_nested_str_weak(get), - /* K2 */ be_nested_str_weak(TYPE), - /* K3 */ be_nested_str_weak(plugins_classes), - }), - be_str_weak(register_plugin_class), - &be_const_str_solidified, - ( &(const binstruction[ 9]) { /* code */ - 0xA40A0000, // 0000 IMPORT R2 K0 - 0x8C0C0501, // 0001 GETMET R3 R2 K1 - 0x5C140200, // 0002 MOVE R5 R1 - 0x58180002, // 0003 LDCONST R6 K2 - 0x7C0C0600, // 0004 CALL R3 3 - 0x780E0001, // 0005 JMPF R3 #0008 - 0x88100103, // 0006 GETMBR R4 R0 K3 - 0x98100601, // 0007 SETIDX R4 R3 R1 - 0x80000000, // 0008 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: clean_remotes -********************************************************************/ -be_local_closure(Matter_Device_clean_remotes, /* name */ - be_nested_proto( - 11, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[19]) { /* constants */ - /* K0 */ be_nested_str_weak(introspect), - /* K1 */ be_nested_str_weak(string), - /* K2 */ be_nested_str_weak(http_remotes), - /* K3 */ be_const_int(0), - /* K4 */ be_nested_str_weak(stop_iteration), - /* K5 */ be_nested_str_weak(plugins), - /* K6 */ be_nested_str_weak(get), - /* K7 */ be_nested_str_weak(http_remote), - /* K8 */ be_nested_str_weak(find), - /* K9 */ be_const_int(1), - /* K10 */ be_nested_str_weak(tasmota), - /* K11 */ be_nested_str_weak(log), - /* K12 */ be_nested_str_weak(MTR_X3A_X20remotes_X20references_X3A_X20), - /* K13 */ be_nested_str_weak(keys), - /* K14 */ be_nested_str_weak(MTR_X3A_X20remove_X20unused_X20remote_X3A_X20), - /* K15 */ be_nested_str_weak(addr), - /* K16 */ be_const_int(3), - /* K17 */ be_nested_str_weak(close), - /* K18 */ be_nested_str_weak(remove), - }), - be_str_weak(clean_remotes), - &be_const_str_solidified, - ( &(const binstruction[72]) { /* code */ - 0xA4060000, // 0000 IMPORT R1 K0 - 0xA40A0200, // 0001 IMPORT R2 K1 - 0x600C0013, // 0002 GETGBL R3 G19 - 0x7C0C0000, // 0003 CALL R3 0 - 0x60100010, // 0004 GETGBL R4 G16 - 0x88140102, // 0005 GETMBR R5 R0 K2 - 0x7C100200, // 0006 CALL R4 1 - 0xA8020003, // 0007 EXBLK 0 #000C - 0x5C140800, // 0008 MOVE R5 R4 - 0x7C140000, // 0009 CALL R5 0 - 0x980C0B03, // 000A SETIDX R3 R5 K3 - 0x7001FFFB, // 000B JMP #0008 - 0x58100004, // 000C LDCONST R4 K4 - 0xAC100200, // 000D CATCH R4 1 0 - 0xB0080000, // 000E RAISE 2 R0 R0 - 0x60100010, // 000F GETGBL R4 G16 - 0x88140105, // 0010 GETMBR R5 R0 K5 - 0x7C100200, // 0011 CALL R4 1 - 0xA802000F, // 0012 EXBLK 0 #0023 - 0x5C140800, // 0013 MOVE R5 R4 - 0x7C140000, // 0014 CALL R5 0 - 0x8C180306, // 0015 GETMET R6 R1 K6 - 0x5C200A00, // 0016 MOVE R8 R5 - 0x58240007, // 0017 LDCONST R9 K7 - 0x7C180600, // 0018 CALL R6 3 - 0x4C1C0000, // 0019 LDNIL R7 - 0x201C0C07, // 001A NE R7 R6 R7 - 0x781E0005, // 001B JMPF R7 #0022 - 0x8C1C0708, // 001C GETMET R7 R3 K8 - 0x5C240C00, // 001D MOVE R9 R6 - 0x58280003, // 001E LDCONST R10 K3 - 0x7C1C0600, // 001F CALL R7 3 - 0x001C0F09, // 0020 ADD R7 R7 K9 - 0x980C0C07, // 0021 SETIDX R3 R6 R7 - 0x7001FFEF, // 0022 JMP #0013 - 0x58100004, // 0023 LDCONST R4 K4 - 0xAC100200, // 0024 CATCH R4 1 0 - 0xB0080000, // 0025 RAISE 2 R0 R0 - 0xB8121400, // 0026 GETNGBL R4 K10 - 0x8C10090B, // 0027 GETMET R4 R4 K11 - 0x60180008, // 0028 GETGBL R6 G8 - 0x5C1C0600, // 0029 MOVE R7 R3 - 0x7C180200, // 002A CALL R6 1 - 0x001A1806, // 002B ADD R6 K12 R6 - 0x7C100400, // 002C CALL R4 2 - 0x60100010, // 002D GETGBL R4 G16 - 0x8C14070D, // 002E GETMET R5 R3 K13 - 0x7C140200, // 002F CALL R5 1 - 0x7C100200, // 0030 CALL R4 1 - 0xA8020011, // 0031 EXBLK 0 #0044 - 0x5C140800, // 0032 MOVE R5 R4 - 0x7C140000, // 0033 CALL R5 0 - 0x94180605, // 0034 GETIDX R6 R3 R5 - 0x1C180D03, // 0035 EQ R6 R6 K3 - 0x781A000B, // 0036 JMPF R6 #0043 - 0xB81A1400, // 0037 GETNGBL R6 K10 - 0x8C180D0B, // 0038 GETMET R6 R6 K11 - 0x88200B0F, // 0039 GETMBR R8 R5 K15 - 0x00221C08, // 003A ADD R8 K14 R8 - 0x58240010, // 003B LDCONST R9 K16 - 0x7C180600, // 003C CALL R6 3 - 0x8C180B11, // 003D GETMET R6 R5 K17 - 0x7C180200, // 003E CALL R6 1 - 0x88180102, // 003F GETMBR R6 R0 K2 - 0x8C180D12, // 0040 GETMET R6 R6 K18 - 0x5C200A00, // 0041 MOVE R8 R5 - 0x7C180400, // 0042 CALL R6 2 - 0x7001FFED, // 0043 JMP #0032 - 0x58100004, // 0044 LDCONST R4 K4 - 0xAC100200, // 0045 CATCH R4 1 0 - 0xB0080000, // 0046 RAISE 2 R0 R0 - 0x80000000, // 0047 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: mdns_announce_op_discovery_all_fabrics -********************************************************************/ -be_local_closure(Matter_Device_mdns_announce_op_discovery_all_fabrics, /* name */ - be_nested_proto( - 6, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 6]) { /* constants */ - /* K0 */ be_nested_str_weak(sessions), - /* K1 */ be_nested_str_weak(active_fabrics), - /* K2 */ be_nested_str_weak(get_device_id), - /* K3 */ be_nested_str_weak(get_fabric_id), - /* K4 */ be_nested_str_weak(mdns_announce_op_discovery), - /* K5 */ be_nested_str_weak(stop_iteration), - }), - be_str_weak(mdns_announce_op_discovery_all_fabrics), - &be_const_str_solidified, - ( &(const binstruction[22]) { /* code */ - 0x60040010, // 0000 GETGBL R1 G16 - 0x88080100, // 0001 GETMBR R2 R0 K0 - 0x8C080501, // 0002 GETMET R2 R2 K1 - 0x7C080200, // 0003 CALL R2 1 - 0x7C040200, // 0004 CALL R1 1 - 0xA802000B, // 0005 EXBLK 0 #0012 - 0x5C080200, // 0006 MOVE R2 R1 - 0x7C080000, // 0007 CALL R2 0 - 0x8C0C0502, // 0008 GETMET R3 R2 K2 - 0x7C0C0200, // 0009 CALL R3 1 - 0x780E0005, // 000A JMPF R3 #0011 - 0x8C0C0503, // 000B GETMET R3 R2 K3 - 0x7C0C0200, // 000C CALL R3 1 - 0x780E0002, // 000D JMPF R3 #0011 - 0x8C0C0104, // 000E GETMET R3 R0 K4 - 0x5C140400, // 000F MOVE R5 R2 - 0x7C0C0400, // 0010 CALL R3 2 - 0x7001FFF3, // 0011 JMP #0006 - 0x58040005, // 0012 LDCONST R1 K5 - 0xAC040200, // 0013 CATCH R1 1 0 - 0xB0080000, // 0014 RAISE 2 R0 R0 - 0x80000000, // 0015 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: signal_endpoints_changed -********************************************************************/ -be_local_closure(Matter_Device_signal_endpoints_changed, /* name */ - be_nested_proto( - 7, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 3]) { /* constants */ - /* K0 */ be_nested_str_weak(attribute_updated), - /* K1 */ be_const_int(0), - /* K2 */ be_const_int(3), - }), - be_str_weak(signal_endpoints_changed), - &be_const_str_solidified, - ( &(const binstruction[13]) { /* code */ - 0x8C040100, // 0000 GETMET R1 R0 K0 - 0x580C0001, // 0001 LDCONST R3 K1 - 0x5412001C, // 0002 LDINT R4 29 - 0x58140002, // 0003 LDCONST R5 K2 - 0x50180000, // 0004 LDBOOL R6 0 0 - 0x7C040A00, // 0005 CALL R1 5 - 0x8C040100, // 0006 GETMET R1 R0 K0 - 0x540EFEFF, // 0007 LDINT R3 65280 - 0x5412001C, // 0008 LDINT R4 29 - 0x58140002, // 0009 LDCONST R5 K2 - 0x50180000, // 000A LDBOOL R6 0 0 - 0x7C040A00, // 000B CALL R1 5 - 0x80000000, // 000C RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: get_plugin_class_displayname -********************************************************************/ -be_local_closure(Matter_Device_get_plugin_class_displayname, /* name */ - be_nested_proto( - 5, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 4]) { /* constants */ - /* K0 */ be_nested_str_weak(plugins_classes), - /* K1 */ be_nested_str_weak(find), - /* K2 */ be_nested_str_weak(NAME), - /* K3 */ be_nested_str_weak(), - }), - be_str_weak(get_plugin_class_displayname), - &be_const_str_solidified, - ( &(const binstruction[ 9]) { /* code */ - 0x88080100, // 0000 GETMBR R2 R0 K0 - 0x8C080501, // 0001 GETMET R2 R2 K1 - 0x5C100200, // 0002 MOVE R4 R1 - 0x7C080400, // 0003 CALL R2 2 - 0x780A0001, // 0004 JMPF R2 #0007 - 0x880C0502, // 0005 GETMBR R3 R2 K2 - 0x70020000, // 0006 JMP #0008 - 0x580C0003, // 0007 LDCONST R3 K3 - 0x80040600, // 0008 RET 1 R3 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: generate_random_passcode -********************************************************************/ -be_local_closure(Matter_Device_generate_random_passcode, /* name */ - be_nested_proto( - 7, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 8]) { /* constants */ - /* K0 */ be_nested_str_weak(crypto), - /* K1 */ be_nested_str_weak(random), - /* K2 */ be_nested_str_weak(get), - /* K3 */ be_const_int(0), - /* K4 */ be_const_int(134217727), - /* K5 */ be_const_int(99999998), - /* K6 */ be_nested_str_weak(PASSCODE_INVALID), - /* K7 */ be_nested_str_weak(stop_iteration), - }), - be_str_weak(generate_random_passcode), - &be_const_str_solidified, - ( &(const binstruction[35]) { /* code */ - 0xA4060000, // 0000 IMPORT R1 K0 - 0x4C080000, // 0001 LDNIL R2 - 0x500C0200, // 0002 LDBOOL R3 1 0 - 0x780E001D, // 0003 JMPF R3 #0022 - 0x8C0C0301, // 0004 GETMET R3 R1 K1 - 0x54160003, // 0005 LDINT R5 4 - 0x7C0C0400, // 0006 CALL R3 2 - 0x8C0C0702, // 0007 GETMET R3 R3 K2 - 0x58140003, // 0008 LDCONST R5 K3 - 0x541A0003, // 0009 LDINT R6 4 - 0x7C0C0600, // 000A CALL R3 3 - 0x2C0C0704, // 000B AND R3 R3 K4 - 0x5C080600, // 000C MOVE R2 R3 - 0x240C0505, // 000D GT R3 R2 K5 - 0x780E0000, // 000E JMPF R3 #0010 - 0x7001FFF1, // 000F JMP #0002 - 0x600C0010, // 0010 GETGBL R3 G16 - 0x88100106, // 0011 GETMBR R4 R0 K6 - 0x7C0C0200, // 0012 CALL R3 1 - 0xA8020005, // 0013 EXBLK 0 #001A - 0x5C100600, // 0014 MOVE R4 R3 - 0x7C100000, // 0015 CALL R4 0 - 0x1C140404, // 0016 EQ R5 R2 R4 - 0x78160000, // 0017 JMPF R5 #0019 - 0x4C080000, // 0018 LDNIL R2 - 0x7001FFF9, // 0019 JMP #0014 - 0x580C0007, // 001A LDCONST R3 K7 - 0xAC0C0200, // 001B CATCH R3 1 0 - 0xB0080000, // 001C RAISE 2 R0 R0 - 0x4C0C0000, // 001D LDNIL R3 - 0x200C0403, // 001E NE R3 R2 R3 - 0x780E0000, // 001F JMPF R3 #0021 - 0x80040400, // 0020 RET 1 R2 - 0x7001FFDF, // 0021 JMP #0002 - 0x80000000, // 0022 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: MtrJoin -********************************************************************/ -be_local_closure(Matter_Device_MtrJoin, /* name */ - be_nested_proto( - 8, /* nstack */ - 5, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 4]) { /* constants */ - /* K0 */ be_nested_str_weak(start_root_basic_commissioning), - /* K1 */ be_nested_str_weak(stop_basic_commissioning), - /* K2 */ be_nested_str_weak(tasmota), - /* K3 */ be_nested_str_weak(resp_cmnd_done), - }), - be_str_weak(MtrJoin), - &be_const_str_solidified, - ( &(const binstruction[13]) { /* code */ - 0x60140009, // 0000 GETGBL R5 G9 - 0x5C180600, // 0001 MOVE R6 R3 - 0x7C140200, // 0002 CALL R5 1 - 0x78160002, // 0003 JMPF R5 #0007 - 0x8C180100, // 0004 GETMET R6 R0 K0 - 0x7C180200, // 0005 CALL R6 1 - 0x70020001, // 0006 JMP #0009 - 0x8C180101, // 0007 GETMET R6 R0 K1 - 0x7C180200, // 0008 CALL R6 1 - 0xB81A0400, // 0009 GETNGBL R6 K2 - 0x8C180D03, // 000A GETMET R6 R6 K3 - 0x7C180200, // 000B CALL R6 1 - 0x80000000, // 000C RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: remove_fabric -********************************************************************/ -be_local_closure(Matter_Device_remove_fabric, /* name */ - be_nested_proto( - 9, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[12]) { /* constants */ - /* K0 */ be_nested_str_weak(sessions), - /* K1 */ be_nested_str_weak(find_children_fabrics), - /* K2 */ be_nested_str_weak(get_fabric_index), - /* K3 */ be_nested_str_weak(find_fabric_by_index), - /* K4 */ be_nested_str_weak(message_handler), - /* K5 */ be_nested_str_weak(im), - /* K6 */ be_nested_str_weak(subs_shop), - /* K7 */ be_nested_str_weak(remove_by_fabric), - /* K8 */ be_nested_str_weak(mdns_remove_op_discovery), - /* K9 */ be_nested_str_weak(remove_fabric), - /* K10 */ be_nested_str_weak(stop_iteration), - /* K11 */ be_nested_str_weak(save_fabrics), - }), - be_str_weak(remove_fabric), - &be_const_str_solidified, - ( &(const binstruction[43]) { /* code */ - 0x88080100, // 0000 GETMBR R2 R0 K0 - 0x8C080501, // 0001 GETMET R2 R2 K1 - 0x8C100302, // 0002 GETMET R4 R1 K2 - 0x7C100200, // 0003 CALL R4 1 - 0x7C080400, // 0004 CALL R2 2 - 0x4C0C0000, // 0005 LDNIL R3 - 0x1C0C0403, // 0006 EQ R3 R2 R3 - 0x780E0000, // 0007 JMPF R3 #0009 - 0x80000600, // 0008 RET 0 - 0x600C0010, // 0009 GETGBL R3 G16 - 0x5C100400, // 000A MOVE R4 R2 - 0x7C0C0200, // 000B CALL R3 1 - 0xA8020016, // 000C EXBLK 0 #0024 - 0x5C100600, // 000D MOVE R4 R3 - 0x7C100000, // 000E CALL R4 0 - 0x88140100, // 000F GETMBR R5 R0 K0 - 0x8C140B03, // 0010 GETMET R5 R5 K3 - 0x5C1C0800, // 0011 MOVE R7 R4 - 0x7C140400, // 0012 CALL R5 2 - 0x4C180000, // 0013 LDNIL R6 - 0x20180A06, // 0014 NE R6 R5 R6 - 0x781A000C, // 0015 JMPF R6 #0023 - 0x88180104, // 0016 GETMBR R6 R0 K4 - 0x88180D05, // 0017 GETMBR R6 R6 K5 - 0x88180D06, // 0018 GETMBR R6 R6 K6 - 0x8C180D07, // 0019 GETMET R6 R6 K7 - 0x5C200A00, // 001A MOVE R8 R5 - 0x7C180400, // 001B CALL R6 2 - 0x8C180108, // 001C GETMET R6 R0 K8 - 0x5C200A00, // 001D MOVE R8 R5 - 0x7C180400, // 001E CALL R6 2 - 0x88180100, // 001F GETMBR R6 R0 K0 - 0x8C180D09, // 0020 GETMET R6 R6 K9 - 0x5C200A00, // 0021 MOVE R8 R5 - 0x7C180400, // 0022 CALL R6 2 - 0x7001FFE8, // 0023 JMP #000D - 0x580C000A, // 0024 LDCONST R3 K10 - 0xAC0C0200, // 0025 CATCH R3 1 0 - 0xB0080000, // 0026 RAISE 2 R0 R0 - 0x880C0100, // 0027 GETMBR R3 R0 K0 - 0x8C0C070B, // 0028 GETMET R3 R3 K11 - 0x7C0C0200, // 0029 CALL R3 1 - 0x80000000, // 002A RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: process_attribute_expansion -********************************************************************/ -be_local_closure(Matter_Device_process_attribute_expansion, /* name */ - be_nested_proto( - 29, /* nstack */ - 3, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 1, /* has sup protos */ - ( &(const struct bproto*[ 1]) { - be_nested_proto( - 7, /* nstack */ - 1, /* argc */ - 0, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 5]) { /* constants */ - /* K0 */ be_nested_str_weak(keys), - /* K1 */ be_nested_str_weak(push), - /* K2 */ be_nested_str_weak(stop_iteration), - /* K3 */ be_const_int(1), - /* K4 */ be_const_int(0), - }), - be_str_weak(keys_sorted), - &be_const_str_solidified, - ( &(const binstruction[45]) { /* code */ - 0x60040012, // 0000 GETGBL R1 G18 - 0x7C040000, // 0001 CALL R1 0 - 0x60080010, // 0002 GETGBL R2 G16 - 0x8C0C0100, // 0003 GETMET R3 R0 K0 - 0x7C0C0200, // 0004 CALL R3 1 - 0x7C080200, // 0005 CALL R2 1 - 0xA8020005, // 0006 EXBLK 0 #000D - 0x5C0C0400, // 0007 MOVE R3 R2 - 0x7C0C0000, // 0008 CALL R3 0 - 0x8C100301, // 0009 GETMET R4 R1 K1 - 0x5C180600, // 000A MOVE R6 R3 - 0x7C100400, // 000B CALL R4 2 - 0x7001FFF9, // 000C JMP #0007 - 0x58080002, // 000D LDCONST R2 K2 - 0xAC080200, // 000E CATCH R2 1 0 - 0xB0080000, // 000F RAISE 2 R0 R0 - 0x60080010, // 0010 GETGBL R2 G16 - 0x600C000C, // 0011 GETGBL R3 G12 - 0x5C100200, // 0012 MOVE R4 R1 - 0x7C0C0200, // 0013 CALL R3 1 - 0x040C0703, // 0014 SUB R3 R3 K3 - 0x400E0603, // 0015 CONNECT R3 K3 R3 - 0x7C080200, // 0016 CALL R2 1 - 0xA8020010, // 0017 EXBLK 0 #0029 - 0x5C0C0400, // 0018 MOVE R3 R2 - 0x7C0C0000, // 0019 CALL R3 0 - 0x94100203, // 001A GETIDX R4 R1 R3 - 0x5C140600, // 001B MOVE R5 R3 - 0x24180B04, // 001C GT R6 R5 K4 - 0x781A0008, // 001D JMPF R6 #0027 - 0x04180B03, // 001E SUB R6 R5 K3 - 0x94180206, // 001F GETIDX R6 R1 R6 - 0x24180C04, // 0020 GT R6 R6 R4 - 0x781A0004, // 0021 JMPF R6 #0027 - 0x04180B03, // 0022 SUB R6 R5 K3 - 0x94180206, // 0023 GETIDX R6 R1 R6 - 0x98040A06, // 0024 SETIDX R1 R5 R6 - 0x04140B03, // 0025 SUB R5 R5 K3 - 0x7001FFF4, // 0026 JMP #001C - 0x98040A04, // 0027 SETIDX R1 R5 R4 - 0x7001FFEE, // 0028 JMP #0018 - 0x58080002, // 0029 LDCONST R2 K2 - 0xAC080200, // 002A CATCH R2 1 0 - 0xB0080000, // 002B RAISE 2 R0 R0 - 0x80040200, // 002C RET 1 R1 - }) - ), - }), - 1, /* has constants */ - ( &(const bvalue[22]) { /* constants */ - /* K0 */ be_nested_str_weak(string), - /* K1 */ be_nested_str_weak(endpoint), - /* K2 */ be_nested_str_weak(cluster), - /* K3 */ be_nested_str_weak(attribute), - /* K4 */ be_nested_str_weak(plugins), - /* K5 */ be_nested_str_weak(get_endpoint), - /* K6 */ be_nested_str_weak(contains), - /* K7 */ be_nested_str_weak(get_cluster_list), - /* K8 */ be_nested_str_weak(get_attribute_list), - /* K9 */ be_nested_str_weak(push), - /* K10 */ be_nested_str_weak(stop_iteration), - /* K11 */ be_nested_str_weak(tasmota), - /* K12 */ be_nested_str_weak(log), - /* K13 */ be_nested_str_weak(format), - /* K14 */ be_nested_str_weak(MTR_X3A_X20expansion_X20_X5B_X2502X_X5D_X2504X_X2F_X2504X), - /* K15 */ be_const_int(3), - /* K16 */ be_nested_str_weak(status), - /* K17 */ be_nested_str_weak(matter), - /* K18 */ be_nested_str_weak(UNSUPPORTED_ENDPOINT), - /* K19 */ be_nested_str_weak(UNSUPPORTED_CLUSTER), - /* K20 */ be_nested_str_weak(UNSUPPORTED_ATTRIBUTE), - /* K21 */ be_nested_str_weak(UNREPORTABLE_ATTRIBUTE), - }), - be_str_weak(process_attribute_expansion), - &be_const_str_solidified, - ( &(const binstruction[216]) { /* code */ - 0x840C0000, // 0000 CLOSURE R3 P0 - 0xA4120000, // 0001 IMPORT R4 K0 - 0x88140301, // 0002 GETMBR R5 R1 K1 - 0x50180000, // 0003 LDBOOL R6 0 0 - 0x881C0302, // 0004 GETMBR R7 R1 K2 - 0x50200000, // 0005 LDBOOL R8 0 0 - 0x88240303, // 0006 GETMBR R9 R1 K3 - 0x50280000, // 0007 LDBOOL R10 0 0 - 0x882C0301, // 0008 GETMBR R11 R1 K1 - 0x4C300000, // 0009 LDNIL R12 - 0x202C160C, // 000A NE R11 R11 R12 - 0x782E0007, // 000B JMPF R11 #0014 - 0x882C0302, // 000C GETMBR R11 R1 K2 - 0x4C300000, // 000D LDNIL R12 - 0x202C160C, // 000E NE R11 R11 R12 - 0x782E0003, // 000F JMPF R11 #0014 - 0x882C0303, // 0010 GETMBR R11 R1 K3 - 0x4C300000, // 0011 LDNIL R12 - 0x202C160C, // 0012 NE R11 R11 R12 - 0x742E0000, // 0013 JMPT R11 #0015 - 0x502C0001, // 0014 LDBOOL R11 0 1 - 0x502C0200, // 0015 LDBOOL R11 1 0 - 0x60300013, // 0016 GETGBL R12 G19 - 0x7C300000, // 0017 CALL R12 0 - 0x60340010, // 0018 GETGBL R13 G16 - 0x88380104, // 0019 GETMBR R14 R0 K4 - 0x7C340200, // 001A CALL R13 1 - 0xA8020055, // 001B EXBLK 0 #0072 - 0x5C381A00, // 001C MOVE R14 R13 - 0x7C380000, // 001D CALL R14 0 - 0x8C3C1D05, // 001E GETMET R15 R14 K5 - 0x7C3C0200, // 001F CALL R15 1 - 0x4C400000, // 0020 LDNIL R16 - 0x20400A10, // 0021 NE R16 R5 R16 - 0x78420002, // 0022 JMPF R16 #0026 - 0x20401E05, // 0023 NE R16 R15 R5 - 0x78420000, // 0024 JMPF R16 #0026 - 0x7001FFF5, // 0025 JMP #001C - 0x8C401906, // 0026 GETMET R16 R12 K6 - 0x5C481E00, // 0027 MOVE R18 R15 - 0x7C400400, // 0028 CALL R16 2 - 0x74420002, // 0029 JMPT R16 #002D - 0x60400013, // 002A GETGBL R16 G19 - 0x7C400000, // 002B CALL R16 0 - 0x98301E10, // 002C SETIDX R12 R15 R16 - 0x50180200, // 002D LDBOOL R6 1 0 - 0x8C401D07, // 002E GETMET R16 R14 K7 - 0x5C481E00, // 002F MOVE R18 R15 - 0x7C400400, // 0030 CALL R16 2 - 0x60440010, // 0031 GETGBL R17 G16 - 0x5C482000, // 0032 MOVE R18 R16 - 0x7C440200, // 0033 CALL R17 1 - 0xA8020038, // 0034 EXBLK 0 #006E - 0x5C482200, // 0035 MOVE R18 R17 - 0x7C480000, // 0036 CALL R18 0 - 0x4C4C0000, // 0037 LDNIL R19 - 0x204C0E13, // 0038 NE R19 R7 R19 - 0x784E0002, // 0039 JMPF R19 #003D - 0x204C2407, // 003A NE R19 R18 R7 - 0x784E0000, // 003B JMPF R19 #003D - 0x7001FFF7, // 003C JMP #0035 - 0x944C180F, // 003D GETIDX R19 R12 R15 - 0x8C4C2706, // 003E GETMET R19 R19 K6 - 0x5C542400, // 003F MOVE R21 R18 - 0x7C4C0400, // 0040 CALL R19 2 - 0x744E0003, // 0041 JMPT R19 #0046 - 0x944C180F, // 0042 GETIDX R19 R12 R15 - 0x60500013, // 0043 GETGBL R20 G19 - 0x7C500000, // 0044 CALL R20 0 - 0x984C2414, // 0045 SETIDX R19 R18 R20 - 0x50200200, // 0046 LDBOOL R8 1 0 - 0x8C4C1D08, // 0047 GETMET R19 R14 K8 - 0x5C541E00, // 0048 MOVE R21 R15 - 0x5C582400, // 0049 MOVE R22 R18 - 0x7C4C0600, // 004A CALL R19 3 - 0x60500010, // 004B GETGBL R20 G16 - 0x5C542600, // 004C MOVE R21 R19 - 0x7C500200, // 004D CALL R20 1 - 0xA802001A, // 004E EXBLK 0 #006A - 0x5C542800, // 004F MOVE R21 R20 - 0x7C540000, // 0050 CALL R21 0 - 0x4C580000, // 0051 LDNIL R22 - 0x20581216, // 0052 NE R22 R9 R22 - 0x785A0002, // 0053 JMPF R22 #0057 - 0x20582A09, // 0054 NE R22 R21 R9 - 0x785A0000, // 0055 JMPF R22 #0057 - 0x7001FFF7, // 0056 JMP #004F - 0x9458180F, // 0057 GETIDX R22 R12 R15 - 0x94582C12, // 0058 GETIDX R22 R22 R18 - 0x8C582D06, // 0059 GETMET R22 R22 K6 - 0x5C602A00, // 005A MOVE R24 R21 - 0x7C580400, // 005B CALL R22 2 - 0x745A0004, // 005C JMPT R22 #0062 - 0x9458180F, // 005D GETIDX R22 R12 R15 - 0x94582C12, // 005E GETIDX R22 R22 R18 - 0x605C0012, // 005F GETGBL R23 G18 - 0x7C5C0000, // 0060 CALL R23 0 - 0x98582A17, // 0061 SETIDX R22 R21 R23 - 0x50280200, // 0062 LDBOOL R10 1 0 - 0x9458180F, // 0063 GETIDX R22 R12 R15 - 0x94582C12, // 0064 GETIDX R22 R22 R18 - 0x94582C15, // 0065 GETIDX R22 R22 R21 - 0x8C582D09, // 0066 GETMET R22 R22 K9 - 0x5C601C00, // 0067 MOVE R24 R14 - 0x7C580400, // 0068 CALL R22 2 - 0x7001FFE4, // 0069 JMP #004F - 0x5850000A, // 006A LDCONST R20 K10 - 0xAC500200, // 006B CATCH R20 1 0 - 0xB0080000, // 006C RAISE 2 R0 R0 - 0x7001FFC6, // 006D JMP #0035 - 0x5844000A, // 006E LDCONST R17 K10 - 0xAC440200, // 006F CATCH R17 1 0 - 0xB0080000, // 0070 RAISE 2 R0 R0 - 0x7001FFA9, // 0071 JMP #001C - 0x5834000A, // 0072 LDCONST R13 K10 - 0xAC340200, // 0073 CATCH R13 1 0 - 0xB0080000, // 0074 RAISE 2 R0 R0 - 0x60340010, // 0075 GETGBL R13 G16 - 0x5C380600, // 0076 MOVE R14 R3 - 0x5C3C1800, // 0077 MOVE R15 R12 - 0x7C380200, // 0078 CALL R14 1 - 0x7C340200, // 0079 CALL R13 1 - 0xA802003D, // 007A EXBLK 0 #00B9 - 0x5C381A00, // 007B MOVE R14 R13 - 0x7C380000, // 007C CALL R14 0 - 0x603C0010, // 007D GETGBL R15 G16 - 0x5C400600, // 007E MOVE R16 R3 - 0x9444180E, // 007F GETIDX R17 R12 R14 - 0x7C400200, // 0080 CALL R16 1 - 0x7C3C0200, // 0081 CALL R15 1 - 0xA8020031, // 0082 EXBLK 0 #00B5 - 0x5C401E00, // 0083 MOVE R16 R15 - 0x7C400000, // 0084 CALL R16 0 - 0x60440010, // 0085 GETGBL R17 G16 - 0x5C480600, // 0086 MOVE R18 R3 - 0x944C180E, // 0087 GETIDX R19 R12 R14 - 0x944C2610, // 0088 GETIDX R19 R19 R16 - 0x7C480200, // 0089 CALL R18 1 - 0x7C440200, // 008A CALL R17 1 - 0xA8020024, // 008B EXBLK 0 #00B1 - 0x5C482200, // 008C MOVE R18 R17 - 0x7C480000, // 008D CALL R18 0 - 0x604C0010, // 008E GETGBL R19 G16 - 0x9450180E, // 008F GETIDX R20 R12 R14 - 0x94502810, // 0090 GETIDX R20 R20 R16 - 0x94502812, // 0091 GETIDX R20 R20 R18 - 0x7C4C0200, // 0092 CALL R19 1 - 0xA8020018, // 0093 EXBLK 0 #00AD - 0x5C502600, // 0094 MOVE R20 R19 - 0x7C500000, // 0095 CALL R20 0 - 0xB8561600, // 0096 GETNGBL R21 K11 - 0x8C542B0C, // 0097 GETMET R21 R21 K12 - 0x8C5C090D, // 0098 GETMET R23 R4 K13 - 0x5864000E, // 0099 LDCONST R25 K14 - 0x5C681C00, // 009A MOVE R26 R14 - 0x5C6C2000, // 009B MOVE R27 R16 - 0x5C702400, // 009C MOVE R28 R18 - 0x7C5C0A00, // 009D CALL R23 5 - 0x5860000F, // 009E LDCONST R24 K15 - 0x7C540600, // 009F CALL R21 3 - 0x9006020E, // 00A0 SETMBR R1 K1 R14 - 0x90060410, // 00A1 SETMBR R1 K2 R16 - 0x90060612, // 00A2 SETMBR R1 K3 R18 - 0x5C540400, // 00A3 MOVE R21 R2 - 0x5C582800, // 00A4 MOVE R22 R20 - 0x5C5C0200, // 00A5 MOVE R23 R1 - 0x5C601600, // 00A6 MOVE R24 R11 - 0x7C540600, // 00A7 CALL R21 3 - 0x782E0002, // 00A8 JMPF R11 #00AC - 0x78560001, // 00A9 JMPF R21 #00AC - 0xA8040004, // 00AA EXBLK 1 4 - 0x80002C00, // 00AB RET 0 - 0x7001FFE6, // 00AC JMP #0094 - 0x584C000A, // 00AD LDCONST R19 K10 - 0xAC4C0200, // 00AE CATCH R19 1 0 - 0xB0080000, // 00AF RAISE 2 R0 R0 - 0x7001FFDA, // 00B0 JMP #008C - 0x5844000A, // 00B1 LDCONST R17 K10 - 0xAC440200, // 00B2 CATCH R17 1 0 - 0xB0080000, // 00B3 RAISE 2 R0 R0 - 0x7001FFCD, // 00B4 JMP #0083 - 0x583C000A, // 00B5 LDCONST R15 K10 - 0xAC3C0200, // 00B6 CATCH R15 1 0 - 0xB0080000, // 00B7 RAISE 2 R0 R0 - 0x7001FFC1, // 00B8 JMP #007B - 0x5834000A, // 00B9 LDCONST R13 K10 - 0xAC340200, // 00BA CATCH R13 1 0 - 0xB0080000, // 00BB RAISE 2 R0 R0 - 0x782E0019, // 00BC JMPF R11 #00D7 - 0x5C340C00, // 00BD MOVE R13 R6 - 0x74360003, // 00BE JMPT R13 #00C3 - 0xB8362200, // 00BF GETNGBL R13 K17 - 0x88341B12, // 00C0 GETMBR R13 R13 K18 - 0x9006200D, // 00C1 SETMBR R1 K16 R13 - 0x7002000E, // 00C2 JMP #00D2 - 0x5C341000, // 00C3 MOVE R13 R8 - 0x74360003, // 00C4 JMPT R13 #00C9 - 0xB8362200, // 00C5 GETNGBL R13 K17 - 0x88341B13, // 00C6 GETMBR R13 R13 K19 - 0x9006200D, // 00C7 SETMBR R1 K16 R13 - 0x70020008, // 00C8 JMP #00D2 - 0x5C341400, // 00C9 MOVE R13 R10 - 0x74360003, // 00CA JMPT R13 #00CF - 0xB8362200, // 00CB GETNGBL R13 K17 - 0x88341B14, // 00CC GETMBR R13 R13 K20 - 0x9006200D, // 00CD SETMBR R1 K16 R13 - 0x70020002, // 00CE JMP #00D2 - 0xB8362200, // 00CF GETNGBL R13 K17 - 0x88341B15, // 00D0 GETMBR R13 R13 K21 - 0x9006200D, // 00D1 SETMBR R1 K16 R13 - 0x5C340400, // 00D2 MOVE R13 R2 - 0x4C380000, // 00D3 LDNIL R14 - 0x5C3C0200, // 00D4 MOVE R15 R1 - 0x50400200, // 00D5 LDBOOL R16 1 0 - 0x7C340600, // 00D6 CALL R13 3 - 0x80000000, // 00D7 RET 0 - }) - ) -); -/*******************************************************************/ - - /******************************************************************** ** Solidified function: mdns_remove_op_discovery ********************************************************************/ @@ -2145,7 +270,7 @@ be_local_closure(Matter_Device_mdns_remove_op_discovery, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[24]) { /* constants */ + ( &(const bvalue[25]) { /* constants */ /* K0 */ be_nested_str_weak(mdns), /* K1 */ be_nested_str_weak(string), /* K2 */ be_nested_str_weak(get_device_id), @@ -2161,7 +286,7 @@ be_local_closure(Matter_Device_mdns_remove_op_discovery, /* name */ /* K12 */ be_nested_str_weak(log), /* K13 */ be_nested_str_weak(format), /* K14 */ be_nested_str_weak(MTR_X3A_X20remove_X20mDNS_X20on_X20_X25s_X20_X27_X25s_X27), - /* K15 */ be_const_int(2), + /* K15 */ be_const_int(3), /* K16 */ be_nested_str_weak(remove_service), /* K17 */ be_nested_str_weak(_matter), /* K18 */ be_nested_str_weak(_tcp), @@ -2170,6 +295,7 @@ be_local_closure(Matter_Device_mdns_remove_op_discovery, /* name */ /* K21 */ be_nested_str_weak(hostname_wifi), /* K22 */ be_nested_str_weak(MTR_X3A_X20Exception), /* K23 */ be_nested_str_weak(_X7C), + /* K24 */ be_const_int(2), }), be_str_weak(mdns_remove_op_discovery), &be_const_str_solidified, @@ -2250,7 +376,7 @@ be_local_closure(Matter_Device_mdns_remove_op_discovery, /* name */ 0x5C280A00, // 0049 MOVE R10 R5 0x7C240200, // 004A CALL R9 1 0x00201009, // 004B ADD R8 R8 R9 - 0x5824000F, // 004C LDCONST R9 K15 + 0x58240018, // 004C LDCONST R9 K24 0x7C180600, // 004D CALL R6 3 0x70020000, // 004E JMP #0050 0xB0080000, // 004F RAISE 2 R0 R0 @@ -2262,11 +388,11 @@ be_local_closure(Matter_Device_mdns_remove_op_discovery, /* name */ /******************************************************************** -** Solidified function: mdns_announce_PASE +** Solidified function: every_second ********************************************************************/ -be_local_closure(Matter_Device_mdns_announce_PASE, /* name */ +be_local_closure(Matter_Device_every_second, /* name */ be_nested_proto( - 16, /* nstack */ + 4, /* nstack */ 1, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -2274,363 +400,35 @@ be_local_closure(Matter_Device_mdns_announce_PASE, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[44]) { /* constants */ - /* K0 */ be_nested_str_weak(mdns), - /* K1 */ be_nested_str_weak(string), - /* K2 */ be_nested_str_weak(crypto), - /* K3 */ be_nested_str_weak(VP), - /* K4 */ be_nested_str_weak(vendorid), - /* K5 */ be_nested_str_weak(_X2B), - /* K6 */ be_nested_str_weak(productid), - /* K7 */ be_nested_str_weak(D), - /* K8 */ be_nested_str_weak(commissioning_discriminator), - /* K9 */ be_nested_str_weak(CM), - /* K10 */ be_const_int(1), - /* K11 */ be_nested_str_weak(T), - /* K12 */ be_const_int(0), - /* K13 */ be_nested_str_weak(SII), - /* K14 */ be_nested_str_weak(SAI), - /* K15 */ be_nested_str_weak(commissioning_instance_wifi), - /* K16 */ be_nested_str_weak(random), - /* K17 */ be_nested_str_weak(tohex), - /* K18 */ be_nested_str_weak(commissioning_instance_eth), - /* K19 */ be_nested_str_weak(hostname_eth), - /* K20 */ be_nested_str_weak(tasmota), - /* K21 */ be_nested_str_weak(log), - /* K22 */ be_nested_str_weak(format), - /* K23 */ be_nested_str_weak(MTR_X3A_X20calling_X20mdns_X2Eadd_service_X28_X25s_X2C_X20_X25s_X2C_X20_X25i_X2C_X20_X25s_X2C_X20_X25s_X2C_X20_X25s_X29), - /* K24 */ be_nested_str_weak(_matterc), - /* K25 */ be_nested_str_weak(_udp), - /* K26 */ be_const_int(3), - /* K27 */ be_nested_str_weak(add_service), - /* K28 */ be_nested_str_weak(mdns_pase_eth), - /* K29 */ be_nested_str_weak(MTR_X3A_X20announce_X20mDNS_X20on_X20_X25s_X20_X27_X25s_X27_X20ptr_X20to_X20_X60_X25s_X2Elocal_X60), - /* K30 */ be_nested_str_weak(eth), - /* K31 */ be_const_int(2), - /* K32 */ be_nested_str_weak(_L), - /* K33 */ be_nested_str_weak(MTR_X3A_X20adding_X20subtype_X3A_X20), - /* K34 */ be_nested_str_weak(add_subtype), - /* K35 */ be_nested_str_weak(_S), - /* K36 */ be_nested_str_weak(_V), - /* K37 */ be_nested_str_weak(_CM1), - /* K38 */ be_nested_str_weak(hostname_wifi), - /* K39 */ be_nested_str_weak(mdns_pase_wifi), - /* K40 */ be_nested_str_weak(MTR_X3A_X20starting_X20mDNS_X20on_X20_X25s_X20_X27_X25s_X27_X20ptr_X20to_X20_X60_X25s_X2Elocal_X60), - /* K41 */ be_nested_str_weak(wifi), - /* K42 */ be_nested_str_weak(MTR_X3A_X20Exception), - /* K43 */ be_nested_str_weak(_X7C), - }), - be_str_weak(mdns_announce_PASE), - &be_const_str_solidified, - ( &(const binstruction[267]) { /* code */ - 0xA4060000, // 0000 IMPORT R1 K0 - 0xA40A0200, // 0001 IMPORT R2 K1 - 0xA40E0400, // 0002 IMPORT R3 K2 - 0x60100013, // 0003 GETGBL R4 G19 - 0x7C100000, // 0004 CALL R4 0 - 0x60140008, // 0005 GETGBL R5 G8 - 0x88180104, // 0006 GETMBR R6 R0 K4 - 0x7C140200, // 0007 CALL R5 1 - 0x00140B05, // 0008 ADD R5 R5 K5 - 0x60180008, // 0009 GETGBL R6 G8 - 0x881C0106, // 000A GETMBR R7 R0 K6 - 0x7C180200, // 000B CALL R6 1 - 0x00140A06, // 000C ADD R5 R5 R6 - 0x98120605, // 000D SETIDX R4 K3 R5 - 0x88140108, // 000E GETMBR R5 R0 K8 - 0x98120E05, // 000F SETIDX R4 K7 R5 - 0x9812130A, // 0010 SETIDX R4 K9 K10 - 0x9812170C, // 0011 SETIDX R4 K11 K12 - 0x54161387, // 0012 LDINT R5 5000 - 0x98121A05, // 0013 SETIDX R4 K13 R5 - 0x5416012B, // 0014 LDINT R5 300 - 0x98121C05, // 0015 SETIDX R4 K14 R5 - 0x8C140710, // 0016 GETMET R5 R3 K16 - 0x541E0007, // 0017 LDINT R7 8 - 0x7C140400, // 0018 CALL R5 2 - 0x8C140B11, // 0019 GETMET R5 R5 K17 - 0x7C140200, // 001A CALL R5 1 - 0x90021E05, // 001B SETMBR R0 K15 R5 - 0x8C140710, // 001C GETMET R5 R3 K16 - 0x541E0007, // 001D LDINT R7 8 - 0x7C140400, // 001E CALL R5 2 - 0x8C140B11, // 001F GETMET R5 R5 K17 - 0x7C140200, // 0020 CALL R5 1 - 0x90022405, // 0021 SETMBR R0 K18 R5 - 0xA80200D5, // 0022 EXBLK 0 #00F9 - 0x88140113, // 0023 GETMBR R5 R0 K19 - 0x78160067, // 0024 JMPF R5 #008D - 0xB8162800, // 0025 GETNGBL R5 K20 - 0x8C140B15, // 0026 GETMET R5 R5 K21 - 0x8C1C0516, // 0027 GETMET R7 R2 K22 - 0x58240017, // 0028 LDCONST R9 K23 - 0x58280018, // 0029 LDCONST R10 K24 - 0x582C0019, // 002A LDCONST R11 K25 - 0x543215A3, // 002B LDINT R12 5540 - 0x60340008, // 002C GETGBL R13 G8 - 0x5C380800, // 002D MOVE R14 R4 - 0x7C340200, // 002E CALL R13 1 - 0x88380112, // 002F GETMBR R14 R0 K18 - 0x883C0113, // 0030 GETMBR R15 R0 K19 - 0x7C1C1000, // 0031 CALL R7 8 - 0x5820001A, // 0032 LDCONST R8 K26 - 0x7C140600, // 0033 CALL R5 3 - 0x8C14031B, // 0034 GETMET R5 R1 K27 - 0x581C0018, // 0035 LDCONST R7 K24 - 0x58200019, // 0036 LDCONST R8 K25 - 0x542615A3, // 0037 LDINT R9 5540 - 0x5C280800, // 0038 MOVE R10 R4 - 0x882C0112, // 0039 GETMBR R11 R0 K18 - 0x88300113, // 003A GETMBR R12 R0 K19 - 0x7C140E00, // 003B CALL R5 7 - 0x50140200, // 003C LDBOOL R5 1 0 - 0x90023805, // 003D SETMBR R0 K28 R5 - 0xB8162800, // 003E GETNGBL R5 K20 - 0x8C140B15, // 003F GETMET R5 R5 K21 - 0x8C1C0516, // 0040 GETMET R7 R2 K22 - 0x5824001D, // 0041 LDCONST R9 K29 - 0x5828001E, // 0042 LDCONST R10 K30 - 0x882C0112, // 0043 GETMBR R11 R0 K18 - 0x88300113, // 0044 GETMBR R12 R0 K19 - 0x7C1C0A00, // 0045 CALL R7 5 - 0x5820001F, // 0046 LDCONST R8 K31 - 0x7C140600, // 0047 CALL R5 3 - 0x60140008, // 0048 GETGBL R5 G8 - 0x88180108, // 0049 GETMBR R6 R0 K8 - 0x541E0FFE, // 004A LDINT R7 4095 - 0x2C180C07, // 004B AND R6 R6 R7 - 0x7C140200, // 004C CALL R5 1 - 0x00164005, // 004D ADD R5 K32 R5 - 0xB81A2800, // 004E GETNGBL R6 K20 - 0x8C180D15, // 004F GETMET R6 R6 K21 - 0x00224205, // 0050 ADD R8 K33 R5 - 0x5824001F, // 0051 LDCONST R9 K31 - 0x7C180600, // 0052 CALL R6 3 - 0x8C180322, // 0053 GETMET R6 R1 K34 - 0x58200018, // 0054 LDCONST R8 K24 - 0x58240019, // 0055 LDCONST R9 K25 - 0x88280112, // 0056 GETMBR R10 R0 K18 - 0x882C0113, // 0057 GETMBR R11 R0 K19 - 0x5C300A00, // 0058 MOVE R12 R5 - 0x7C180C00, // 0059 CALL R6 6 - 0x60180008, // 005A GETGBL R6 G8 - 0x881C0108, // 005B GETMBR R7 R0 K8 - 0x54220EFF, // 005C LDINT R8 3840 - 0x2C1C0E08, // 005D AND R7 R7 R8 - 0x54220007, // 005E LDINT R8 8 - 0x3C1C0E08, // 005F SHR R7 R7 R8 - 0x7C180200, // 0060 CALL R6 1 - 0x001A4606, // 0061 ADD R6 K35 R6 - 0x5C140C00, // 0062 MOVE R5 R6 - 0xB81A2800, // 0063 GETNGBL R6 K20 - 0x8C180D15, // 0064 GETMET R6 R6 K21 - 0x00224205, // 0065 ADD R8 K33 R5 - 0x5824001F, // 0066 LDCONST R9 K31 - 0x7C180600, // 0067 CALL R6 3 - 0x8C180322, // 0068 GETMET R6 R1 K34 - 0x58200018, // 0069 LDCONST R8 K24 - 0x58240019, // 006A LDCONST R9 K25 - 0x88280112, // 006B GETMBR R10 R0 K18 - 0x882C0113, // 006C GETMBR R11 R0 K19 - 0x5C300A00, // 006D MOVE R12 R5 - 0x7C180C00, // 006E CALL R6 6 - 0x60180008, // 006F GETGBL R6 G8 - 0x881C0104, // 0070 GETMBR R7 R0 K4 - 0x7C180200, // 0071 CALL R6 1 - 0x001A4806, // 0072 ADD R6 K36 R6 - 0x5C140C00, // 0073 MOVE R5 R6 - 0xB81A2800, // 0074 GETNGBL R6 K20 - 0x8C180D15, // 0075 GETMET R6 R6 K21 - 0x00224205, // 0076 ADD R8 K33 R5 - 0x5824001F, // 0077 LDCONST R9 K31 - 0x7C180600, // 0078 CALL R6 3 - 0x8C180322, // 0079 GETMET R6 R1 K34 - 0x58200018, // 007A LDCONST R8 K24 - 0x58240019, // 007B LDCONST R9 K25 - 0x88280112, // 007C GETMBR R10 R0 K18 - 0x882C0113, // 007D GETMBR R11 R0 K19 - 0x5C300A00, // 007E MOVE R12 R5 - 0x7C180C00, // 007F CALL R6 6 - 0x58140025, // 0080 LDCONST R5 K37 - 0xB81A2800, // 0081 GETNGBL R6 K20 - 0x8C180D15, // 0082 GETMET R6 R6 K21 - 0x00224205, // 0083 ADD R8 K33 R5 - 0x5824001F, // 0084 LDCONST R9 K31 - 0x7C180600, // 0085 CALL R6 3 - 0x8C180322, // 0086 GETMET R6 R1 K34 - 0x58200018, // 0087 LDCONST R8 K24 - 0x58240019, // 0088 LDCONST R9 K25 - 0x88280112, // 0089 GETMBR R10 R0 K18 - 0x882C0113, // 008A GETMBR R11 R0 K19 - 0x5C300A00, // 008B MOVE R12 R5 - 0x7C180C00, // 008C CALL R6 6 - 0x88140126, // 008D GETMBR R5 R0 K38 - 0x78160067, // 008E JMPF R5 #00F7 - 0xB8162800, // 008F GETNGBL R5 K20 - 0x8C140B15, // 0090 GETMET R5 R5 K21 - 0x8C1C0516, // 0091 GETMET R7 R2 K22 - 0x58240017, // 0092 LDCONST R9 K23 - 0x58280018, // 0093 LDCONST R10 K24 - 0x582C0019, // 0094 LDCONST R11 K25 - 0x543215A3, // 0095 LDINT R12 5540 - 0x60340008, // 0096 GETGBL R13 G8 - 0x5C380800, // 0097 MOVE R14 R4 - 0x7C340200, // 0098 CALL R13 1 - 0x8838010F, // 0099 GETMBR R14 R0 K15 - 0x883C0126, // 009A GETMBR R15 R0 K38 - 0x7C1C1000, // 009B CALL R7 8 - 0x5820001A, // 009C LDCONST R8 K26 - 0x7C140600, // 009D CALL R5 3 - 0x8C14031B, // 009E GETMET R5 R1 K27 - 0x581C0018, // 009F LDCONST R7 K24 - 0x58200019, // 00A0 LDCONST R8 K25 - 0x542615A3, // 00A1 LDINT R9 5540 - 0x5C280800, // 00A2 MOVE R10 R4 - 0x882C010F, // 00A3 GETMBR R11 R0 K15 - 0x88300126, // 00A4 GETMBR R12 R0 K38 - 0x7C140E00, // 00A5 CALL R5 7 - 0x50140200, // 00A6 LDBOOL R5 1 0 - 0x90024E05, // 00A7 SETMBR R0 K39 R5 - 0xB8162800, // 00A8 GETNGBL R5 K20 - 0x8C140B15, // 00A9 GETMET R5 R5 K21 - 0x8C1C0516, // 00AA GETMET R7 R2 K22 - 0x58240028, // 00AB LDCONST R9 K40 - 0x58280029, // 00AC LDCONST R10 K41 - 0x882C010F, // 00AD GETMBR R11 R0 K15 - 0x88300126, // 00AE GETMBR R12 R0 K38 - 0x7C1C0A00, // 00AF CALL R7 5 - 0x5820001F, // 00B0 LDCONST R8 K31 - 0x7C140600, // 00B1 CALL R5 3 - 0x60140008, // 00B2 GETGBL R5 G8 - 0x88180108, // 00B3 GETMBR R6 R0 K8 - 0x541E0FFE, // 00B4 LDINT R7 4095 - 0x2C180C07, // 00B5 AND R6 R6 R7 - 0x7C140200, // 00B6 CALL R5 1 - 0x00164005, // 00B7 ADD R5 K32 R5 - 0xB81A2800, // 00B8 GETNGBL R6 K20 - 0x8C180D15, // 00B9 GETMET R6 R6 K21 - 0x00224205, // 00BA ADD R8 K33 R5 - 0x5824001F, // 00BB LDCONST R9 K31 - 0x7C180600, // 00BC CALL R6 3 - 0x8C180322, // 00BD GETMET R6 R1 K34 - 0x58200018, // 00BE LDCONST R8 K24 - 0x58240019, // 00BF LDCONST R9 K25 - 0x8828010F, // 00C0 GETMBR R10 R0 K15 - 0x882C0126, // 00C1 GETMBR R11 R0 K38 - 0x5C300A00, // 00C2 MOVE R12 R5 - 0x7C180C00, // 00C3 CALL R6 6 - 0x60180008, // 00C4 GETGBL R6 G8 - 0x881C0108, // 00C5 GETMBR R7 R0 K8 - 0x54220EFF, // 00C6 LDINT R8 3840 - 0x2C1C0E08, // 00C7 AND R7 R7 R8 - 0x54220007, // 00C8 LDINT R8 8 - 0x3C1C0E08, // 00C9 SHR R7 R7 R8 - 0x7C180200, // 00CA CALL R6 1 - 0x001A4606, // 00CB ADD R6 K35 R6 - 0x5C140C00, // 00CC MOVE R5 R6 - 0xB81A2800, // 00CD GETNGBL R6 K20 - 0x8C180D15, // 00CE GETMET R6 R6 K21 - 0x00224205, // 00CF ADD R8 K33 R5 - 0x5824001F, // 00D0 LDCONST R9 K31 - 0x7C180600, // 00D1 CALL R6 3 - 0x8C180322, // 00D2 GETMET R6 R1 K34 - 0x58200018, // 00D3 LDCONST R8 K24 - 0x58240019, // 00D4 LDCONST R9 K25 - 0x8828010F, // 00D5 GETMBR R10 R0 K15 - 0x882C0126, // 00D6 GETMBR R11 R0 K38 - 0x5C300A00, // 00D7 MOVE R12 R5 - 0x7C180C00, // 00D8 CALL R6 6 - 0x60180008, // 00D9 GETGBL R6 G8 - 0x881C0104, // 00DA GETMBR R7 R0 K4 - 0x7C180200, // 00DB CALL R6 1 - 0x001A4806, // 00DC ADD R6 K36 R6 - 0x5C140C00, // 00DD MOVE R5 R6 - 0xB81A2800, // 00DE GETNGBL R6 K20 - 0x8C180D15, // 00DF GETMET R6 R6 K21 - 0x00224205, // 00E0 ADD R8 K33 R5 - 0x5824001F, // 00E1 LDCONST R9 K31 - 0x7C180600, // 00E2 CALL R6 3 - 0x8C180322, // 00E3 GETMET R6 R1 K34 - 0x58200018, // 00E4 LDCONST R8 K24 - 0x58240019, // 00E5 LDCONST R9 K25 - 0x8828010F, // 00E6 GETMBR R10 R0 K15 - 0x882C0126, // 00E7 GETMBR R11 R0 K38 - 0x5C300A00, // 00E8 MOVE R12 R5 - 0x7C180C00, // 00E9 CALL R6 6 - 0x58140025, // 00EA LDCONST R5 K37 - 0xB81A2800, // 00EB GETNGBL R6 K20 - 0x8C180D15, // 00EC GETMET R6 R6 K21 - 0x00224205, // 00ED ADD R8 K33 R5 - 0x5824001F, // 00EE LDCONST R9 K31 - 0x7C180600, // 00EF CALL R6 3 - 0x8C180322, // 00F0 GETMET R6 R1 K34 - 0x58200018, // 00F1 LDCONST R8 K24 - 0x58240019, // 00F2 LDCONST R9 K25 - 0x8828010F, // 00F3 GETMBR R10 R0 K15 - 0x882C0126, // 00F4 GETMBR R11 R0 K38 - 0x5C300A00, // 00F5 MOVE R12 R5 - 0x7C180C00, // 00F6 CALL R6 6 - 0xA8040001, // 00F7 EXBLK 1 1 - 0x70020010, // 00F8 JMP #010A - 0xAC140002, // 00F9 CATCH R5 0 2 - 0x7002000D, // 00FA JMP #0109 - 0xB81E2800, // 00FB GETNGBL R7 K20 - 0x8C1C0F15, // 00FC GETMET R7 R7 K21 - 0x60240008, // 00FD GETGBL R9 G8 - 0x5C280A00, // 00FE MOVE R10 R5 - 0x7C240200, // 00FF CALL R9 1 - 0x00265409, // 0100 ADD R9 K42 R9 - 0x0024132B, // 0101 ADD R9 R9 K43 - 0x60280008, // 0102 GETGBL R10 G8 - 0x5C2C0C00, // 0103 MOVE R11 R6 - 0x7C280200, // 0104 CALL R10 1 - 0x0024120A, // 0105 ADD R9 R9 R10 - 0x5828001F, // 0106 LDCONST R10 K31 - 0x7C1C0600, // 0107 CALL R7 3 - 0x70020000, // 0108 JMP #010A - 0xB0080000, // 0109 RAISE 2 R0 R0 - 0x80000000, // 010A RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: event_fabrics_saved -********************************************************************/ -be_local_closure(Matter_Device_event_fabrics_saved, /* name */ - be_nested_proto( - 3, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 5]) { /* constants */ + ( &(const bvalue[ 6]) { /* constants */ /* K0 */ be_nested_str_weak(sessions), - /* K1 */ be_nested_str_weak(count_active_fabrics), - /* K2 */ be_const_int(0), - /* K3 */ be_nested_str_weak(plugins_persist), - /* K4 */ be_nested_str_weak(save_param), + /* K1 */ be_nested_str_weak(every_second), + /* K2 */ be_nested_str_weak(message_handler), + /* K3 */ be_nested_str_weak(commissioning_open), + /* K4 */ be_nested_str_weak(tasmota), + /* K5 */ be_nested_str_weak(time_reached), }), - be_str_weak(event_fabrics_saved), + be_str_weak(every_second), &be_const_str_solidified, - ( &(const binstruction[12]) { /* code */ + ( &(const binstruction[18]) { /* code */ 0x88040100, // 0000 GETMBR R1 R0 K0 0x8C040301, // 0001 GETMET R1 R1 K1 0x7C040200, // 0002 CALL R1 1 - 0x24040302, // 0003 GT R1 R1 K2 - 0x78060005, // 0004 JMPF R1 #000B - 0x88040103, // 0005 GETMBR R1 R0 K3 - 0x74060003, // 0006 JMPT R1 #000B - 0x50040200, // 0007 LDBOOL R1 1 0 - 0x90020601, // 0008 SETMBR R0 K3 R1 - 0x8C040104, // 0009 GETMET R1 R0 K4 - 0x7C040200, // 000A CALL R1 1 - 0x80000000, // 000B RET 0 + 0x88040102, // 0003 GETMBR R1 R0 K2 + 0x8C040301, // 0004 GETMET R1 R1 K1 + 0x7C040200, // 0005 CALL R1 1 + 0x88040103, // 0006 GETMBR R1 R0 K3 + 0x4C080000, // 0007 LDNIL R2 + 0x20040202, // 0008 NE R1 R1 R2 + 0x78060006, // 0009 JMPF R1 #0011 + 0xB8060800, // 000A GETNGBL R1 K4 + 0x8C040305, // 000B GETMET R1 R1 K5 + 0x880C0103, // 000C GETMBR R3 R0 K3 + 0x7C040400, // 000D CALL R1 2 + 0x78060001, // 000E JMPF R1 #0011 + 0x4C040000, // 000F LDNIL R1 + 0x90020601, // 0010 SETMBR R0 K3 R1 + 0x80000000, // 0011 RET 0 }) ) ); @@ -2638,11 +436,11 @@ be_local_closure(Matter_Device_event_fabrics_saved, /* name */ /******************************************************************** -** Solidified function: _init_basic_commissioning +** Solidified function: mdns_announce_op_discovery_all_fabrics ********************************************************************/ -be_local_closure(Matter_Device__init_basic_commissioning, /* name */ +be_local_closure(Matter_Device_mdns_announce_op_discovery_all_fabrics, /* name */ be_nested_proto( - 3, /* nstack */ + 6, /* nstack */ 1, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -2650,580 +448,39 @@ be_local_closure(Matter_Device__init_basic_commissioning, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[ 4]) { /* constants */ + ( &(const bvalue[ 6]) { /* constants */ /* K0 */ be_nested_str_weak(sessions), - /* K1 */ be_nested_str_weak(count_active_fabrics), - /* K2 */ be_const_int(0), - /* K3 */ be_nested_str_weak(start_root_basic_commissioning), + /* K1 */ be_nested_str_weak(active_fabrics), + /* K2 */ be_nested_str_weak(get_device_id), + /* K3 */ be_nested_str_weak(get_fabric_id), + /* K4 */ be_nested_str_weak(mdns_announce_op_discovery), + /* K5 */ be_nested_str_weak(stop_iteration), }), - be_str_weak(_init_basic_commissioning), + be_str_weak(mdns_announce_op_discovery_all_fabrics), &be_const_str_solidified, - ( &(const binstruction[ 8]) { /* code */ - 0x88040100, // 0000 GETMBR R1 R0 K0 - 0x8C040301, // 0001 GETMET R1 R1 K1 - 0x7C040200, // 0002 CALL R1 1 - 0x1C040302, // 0003 EQ R1 R1 K2 - 0x78060001, // 0004 JMPF R1 #0007 - 0x8C040103, // 0005 GETMET R1 R0 K3 - 0x7C040200, // 0006 CALL R1 1 - 0x80000000, // 0007 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: _mdns_announce_hostname -********************************************************************/ -be_local_closure(Matter_Device__mdns_announce_hostname, /* name */ - be_nested_proto( - 16, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[28]) { /* constants */ - /* K0 */ be_nested_str_weak(mdns), - /* K1 */ be_nested_str_weak(string), - /* K2 */ be_nested_str_weak(start), - /* K3 */ be_nested_str_weak(tasmota), - /* K4 */ be_nested_str_weak(eth), - /* K5 */ be_nested_str_weak(hostname_eth), - /* K6 */ be_nested_str_weak(replace), - /* K7 */ be_nested_str_weak(find), - /* K8 */ be_nested_str_weak(mac), - /* K9 */ be_nested_str_weak(_X3A), - /* K10 */ be_nested_str_weak(), - /* K11 */ be_nested_str_weak(ipv4only), - /* K12 */ be_nested_str_weak(log), - /* K13 */ be_nested_str_weak(format), - /* K14 */ be_nested_str_weak(MTR_X3A_X20calling_X20mdns_X2Eadd_hostname_X28_X25s_X2C_X20_X25s_X2C_X20_X25s_X29), - /* K15 */ be_nested_str_weak(ip6local), - /* K16 */ be_nested_str_weak(ip), - /* K17 */ be_const_int(3), - /* K18 */ be_nested_str_weak(add_hostname), - /* K19 */ be_nested_str_weak(ip6), - /* K20 */ be_nested_str_weak(MTR_X3A_X20calling_X20mdns_X2Eadd_hostname_X28_X25s_X2C_X20_X25s_X29), - /* K21 */ be_nested_str_weak(wifi), - /* K22 */ be_nested_str_weak(hostname_wifi), - /* K23 */ be_nested_str_weak(MTR_X3A_X20start_X20mDNS_X20on_X20_X25s_X20host_X20_X27_X25s_X2Elocal_X27), - /* K24 */ be_const_int(2), - /* K25 */ be_nested_str_weak(MTR_X3A_X20Exception), - /* K26 */ be_nested_str_weak(_X7C), - /* K27 */ be_nested_str_weak(mdns_announce_op_discovery_all_fabrics), - }), - be_str_weak(_mdns_announce_hostname), - &be_const_str_solidified, - ( &(const binstruction[172]) { /* code */ - 0xA40A0000, // 0000 IMPORT R2 K0 - 0xA40E0200, // 0001 IMPORT R3 K1 - 0x8C100502, // 0002 GETMET R4 R2 K2 - 0x7C100200, // 0003 CALL R4 1 - 0xA8020092, // 0004 EXBLK 0 #0098 - 0x78060040, // 0005 JMPF R1 #0047 - 0xB8120600, // 0006 GETNGBL R4 K3 - 0x8C100904, // 0007 GETMET R4 R4 K4 - 0x7C100200, // 0008 CALL R4 1 - 0x8C140706, // 0009 GETMET R5 R3 K6 - 0x8C1C0907, // 000A GETMET R7 R4 K7 - 0x58240008, // 000B LDCONST R9 K8 - 0x7C1C0400, // 000C CALL R7 2 - 0x58200009, // 000D LDCONST R8 K9 - 0x5824000A, // 000E LDCONST R9 K10 - 0x7C140800, // 000F CALL R5 4 - 0x90020A05, // 0010 SETMBR R0 K5 R5 - 0x8814010B, // 0011 GETMBR R5 R0 K11 - 0x7416001F, // 0012 JMPT R5 #0033 - 0xB8160600, // 0013 GETNGBL R5 K3 - 0x8C140B0C, // 0014 GETMET R5 R5 K12 - 0x8C1C070D, // 0015 GETMET R7 R3 K13 - 0x5824000E, // 0016 LDCONST R9 K14 - 0x88280105, // 0017 GETMBR R10 R0 K5 - 0x8C2C0907, // 0018 GETMET R11 R4 K7 - 0x5834000F, // 0019 LDCONST R13 K15 - 0x5838000A, // 001A LDCONST R14 K10 - 0x7C2C0600, // 001B CALL R11 3 - 0x8C300907, // 001C GETMET R12 R4 K7 - 0x58380010, // 001D LDCONST R14 K16 - 0x583C000A, // 001E LDCONST R15 K10 - 0x7C300600, // 001F CALL R12 3 - 0x7C1C0A00, // 0020 CALL R7 5 - 0x58200011, // 0021 LDCONST R8 K17 - 0x7C140600, // 0022 CALL R5 3 - 0x8C140512, // 0023 GETMET R5 R2 K18 - 0x881C0105, // 0024 GETMBR R7 R0 K5 - 0x8C200907, // 0025 GETMET R8 R4 K7 - 0x5828000F, // 0026 LDCONST R10 K15 - 0x582C000A, // 0027 LDCONST R11 K10 - 0x7C200600, // 0028 CALL R8 3 - 0x8C240907, // 0029 GETMET R9 R4 K7 - 0x582C0010, // 002A LDCONST R11 K16 - 0x5830000A, // 002B LDCONST R12 K10 - 0x7C240600, // 002C CALL R9 3 - 0x8C280907, // 002D GETMET R10 R4 K7 - 0x58300013, // 002E LDCONST R12 K19 - 0x5834000A, // 002F LDCONST R13 K10 - 0x7C280600, // 0030 CALL R10 3 - 0x7C140A00, // 0031 CALL R5 5 - 0x70020012, // 0032 JMP #0046 - 0xB8160600, // 0033 GETNGBL R5 K3 - 0x8C140B0C, // 0034 GETMET R5 R5 K12 - 0x8C1C070D, // 0035 GETMET R7 R3 K13 - 0x58240014, // 0036 LDCONST R9 K20 - 0x88280105, // 0037 GETMBR R10 R0 K5 - 0x8C2C0907, // 0038 GETMET R11 R4 K7 - 0x58340010, // 0039 LDCONST R13 K16 - 0x5838000A, // 003A LDCONST R14 K10 - 0x7C2C0600, // 003B CALL R11 3 - 0x7C1C0800, // 003C CALL R7 4 - 0x58200011, // 003D LDCONST R8 K17 - 0x7C140600, // 003E CALL R5 3 - 0x8C140512, // 003F GETMET R5 R2 K18 - 0x881C0105, // 0040 GETMBR R7 R0 K5 - 0x8C200907, // 0041 GETMET R8 R4 K7 - 0x58280010, // 0042 LDCONST R10 K16 - 0x582C000A, // 0043 LDCONST R11 K10 - 0x7C200600, // 0044 CALL R8 3 - 0x7C140600, // 0045 CALL R5 3 - 0x7002003F, // 0046 JMP #0087 - 0xB8120600, // 0047 GETNGBL R4 K3 - 0x8C100915, // 0048 GETMET R4 R4 K21 - 0x7C100200, // 0049 CALL R4 1 - 0x8C140706, // 004A GETMET R5 R3 K6 - 0x8C1C0907, // 004B GETMET R7 R4 K7 - 0x58240008, // 004C LDCONST R9 K8 - 0x7C1C0400, // 004D CALL R7 2 - 0x58200009, // 004E LDCONST R8 K9 - 0x5824000A, // 004F LDCONST R9 K10 - 0x7C140800, // 0050 CALL R5 4 - 0x90022C05, // 0051 SETMBR R0 K22 R5 - 0x8814010B, // 0052 GETMBR R5 R0 K11 - 0x7416001F, // 0053 JMPT R5 #0074 - 0xB8160600, // 0054 GETNGBL R5 K3 - 0x8C140B0C, // 0055 GETMET R5 R5 K12 - 0x8C1C070D, // 0056 GETMET R7 R3 K13 - 0x5824000E, // 0057 LDCONST R9 K14 - 0x88280116, // 0058 GETMBR R10 R0 K22 - 0x8C2C0907, // 0059 GETMET R11 R4 K7 - 0x5834000F, // 005A LDCONST R13 K15 - 0x5838000A, // 005B LDCONST R14 K10 - 0x7C2C0600, // 005C CALL R11 3 - 0x8C300907, // 005D GETMET R12 R4 K7 - 0x58380010, // 005E LDCONST R14 K16 - 0x583C000A, // 005F LDCONST R15 K10 - 0x7C300600, // 0060 CALL R12 3 - 0x7C1C0A00, // 0061 CALL R7 5 - 0x58200011, // 0062 LDCONST R8 K17 - 0x7C140600, // 0063 CALL R5 3 - 0x8C140512, // 0064 GETMET R5 R2 K18 - 0x881C0116, // 0065 GETMBR R7 R0 K22 - 0x8C200907, // 0066 GETMET R8 R4 K7 - 0x5828000F, // 0067 LDCONST R10 K15 - 0x582C000A, // 0068 LDCONST R11 K10 - 0x7C200600, // 0069 CALL R8 3 - 0x8C240907, // 006A GETMET R9 R4 K7 - 0x582C0010, // 006B LDCONST R11 K16 - 0x5830000A, // 006C LDCONST R12 K10 - 0x7C240600, // 006D CALL R9 3 - 0x8C280907, // 006E GETMET R10 R4 K7 - 0x58300013, // 006F LDCONST R12 K19 - 0x5834000A, // 0070 LDCONST R13 K10 - 0x7C280600, // 0071 CALL R10 3 - 0x7C140A00, // 0072 CALL R5 5 - 0x70020012, // 0073 JMP #0087 - 0xB8160600, // 0074 GETNGBL R5 K3 - 0x8C140B0C, // 0075 GETMET R5 R5 K12 - 0x8C1C070D, // 0076 GETMET R7 R3 K13 - 0x58240014, // 0077 LDCONST R9 K20 - 0x88280105, // 0078 GETMBR R10 R0 K5 - 0x8C2C0907, // 0079 GETMET R11 R4 K7 - 0x58340010, // 007A LDCONST R13 K16 - 0x5838000A, // 007B LDCONST R14 K10 - 0x7C2C0600, // 007C CALL R11 3 - 0x7C1C0800, // 007D CALL R7 4 - 0x58200011, // 007E LDCONST R8 K17 - 0x7C140600, // 007F CALL R5 3 - 0x8C140512, // 0080 GETMET R5 R2 K18 - 0x881C0116, // 0081 GETMBR R7 R0 K22 - 0x8C200907, // 0082 GETMET R8 R4 K7 - 0x58280010, // 0083 LDCONST R10 K16 - 0x582C000A, // 0084 LDCONST R11 K10 - 0x7C200600, // 0085 CALL R8 3 - 0x7C140600, // 0086 CALL R5 3 - 0xB8120600, // 0087 GETNGBL R4 K3 - 0x8C10090C, // 0088 GETMET R4 R4 K12 - 0x8C18070D, // 0089 GETMET R6 R3 K13 - 0x58200017, // 008A LDCONST R8 K23 - 0x78060001, // 008B JMPF R1 #008E - 0x58240004, // 008C LDCONST R9 K4 - 0x70020000, // 008D JMP #008F - 0x58240015, // 008E LDCONST R9 K21 - 0x78060001, // 008F JMPF R1 #0092 - 0x88280105, // 0090 GETMBR R10 R0 K5 - 0x70020000, // 0091 JMP #0093 - 0x88280116, // 0092 GETMBR R10 R0 K22 - 0x7C180800, // 0093 CALL R6 4 - 0x581C0018, // 0094 LDCONST R7 K24 - 0x7C100600, // 0095 CALL R4 3 - 0xA8040001, // 0096 EXBLK 1 1 - 0x70020010, // 0097 JMP #00A9 - 0xAC100002, // 0098 CATCH R4 0 2 - 0x7002000D, // 0099 JMP #00A8 - 0xB81A0600, // 009A GETNGBL R6 K3 - 0x8C180D0C, // 009B GETMET R6 R6 K12 - 0x60200008, // 009C GETGBL R8 G8 - 0x5C240800, // 009D MOVE R9 R4 - 0x7C200200, // 009E CALL R8 1 - 0x00223208, // 009F ADD R8 K25 R8 - 0x0020111A, // 00A0 ADD R8 R8 K26 - 0x60240008, // 00A1 GETGBL R9 G8 - 0x5C280A00, // 00A2 MOVE R10 R5 - 0x7C240200, // 00A3 CALL R9 1 - 0x00201009, // 00A4 ADD R8 R8 R9 - 0x58240018, // 00A5 LDCONST R9 K24 - 0x7C180600, // 00A6 CALL R6 3 - 0x70020000, // 00A7 JMP #00A9 - 0xB0080000, // 00A8 RAISE 2 R0 R0 - 0x8C10011B, // 00A9 GETMET R4 R0 K27 - 0x7C100200, // 00AA CALL R4 1 - 0x80000000, // 00AB RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: register_native_classes -********************************************************************/ -be_local_closure(Matter_Device_register_native_classes, /* name */ - be_nested_proto( - 12, /* nstack */ - 3, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[17]) { /* constants */ - /* K0 */ be_nested_str_weak(introspect), - /* K1 */ be_nested_str_weak(string), - /* K2 */ be_nested_str_weak(members), - /* K3 */ be_nested_str_weak(matter), - /* K4 */ be_nested_str_weak(get), - /* K5 */ be_nested_str_weak(class), - /* K6 */ be_nested_str_weak(find), - /* K7 */ be_nested_str_weak(Plugin_), - /* K8 */ be_const_int(0), - /* K9 */ be_nested_str_weak(register_plugin_class), - /* K10 */ be_nested_str_weak(stop_iteration), - /* K11 */ be_nested_str_weak(tasmota), - /* K12 */ be_nested_str_weak(log), - /* K13 */ be_nested_str_weak(MTR_X3A_X20registered_X20classes_X20), - /* K14 */ be_nested_str_weak(k2l), - /* K15 */ be_nested_str_weak(plugins_classes), - /* K16 */ be_const_int(3), - }), - be_str_weak(register_native_classes), - &be_const_str_solidified, - ( &(const binstruction[43]) { /* code */ - 0xA40E0000, // 0000 IMPORT R3 K0 - 0xA4120200, // 0001 IMPORT R4 K1 - 0x60140010, // 0002 GETGBL R5 G16 - 0x8C180702, // 0003 GETMET R6 R3 K2 - 0xB8220600, // 0004 GETNGBL R8 K3 - 0x7C180400, // 0005 CALL R6 2 - 0x7C140200, // 0006 CALL R5 1 - 0xA8020014, // 0007 EXBLK 0 #001D - 0x5C180A00, // 0008 MOVE R6 R5 - 0x7C180000, // 0009 CALL R6 0 - 0x8C1C0704, // 000A GETMET R7 R3 K4 - 0xB8260600, // 000B GETNGBL R9 K3 - 0x5C280C00, // 000C MOVE R10 R6 - 0x7C1C0600, // 000D CALL R7 3 - 0x60200004, // 000E GETGBL R8 G4 - 0x5C240E00, // 000F MOVE R9 R7 - 0x7C200200, // 0010 CALL R8 1 - 0x1C201105, // 0011 EQ R8 R8 K5 - 0x78220008, // 0012 JMPF R8 #001C - 0x8C200906, // 0013 GETMET R8 R4 K6 - 0x5C280C00, // 0014 MOVE R10 R6 - 0x582C0007, // 0015 LDCONST R11 K7 - 0x7C200600, // 0016 CALL R8 3 - 0x1C201108, // 0017 EQ R8 R8 K8 - 0x78220002, // 0018 JMPF R8 #001C - 0x8C200109, // 0019 GETMET R8 R0 K9 - 0x5C280E00, // 001A MOVE R10 R7 - 0x7C200400, // 001B CALL R8 2 - 0x7001FFEA, // 001C JMP #0008 - 0x5814000A, // 001D LDCONST R5 K10 - 0xAC140200, // 001E CATCH R5 1 0 - 0xB0080000, // 001F RAISE 2 R0 R0 - 0xB8161600, // 0020 GETNGBL R5 K11 - 0x8C140B0C, // 0021 GETMET R5 R5 K12 - 0x601C0008, // 0022 GETGBL R7 G8 - 0x8C20010E, // 0023 GETMET R8 R0 K14 - 0x8828010F, // 0024 GETMBR R10 R0 K15 - 0x7C200400, // 0025 CALL R8 2 - 0x7C1C0200, // 0026 CALL R7 1 - 0x001E1A07, // 0027 ADD R7 K13 R7 - 0x58200010, // 0028 LDCONST R8 K16 - 0x7C140600, // 0029 CALL R5 3 - 0x80000000, // 002A RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: every_50ms -********************************************************************/ -be_local_closure(Matter_Device_every_50ms, /* name */ - be_nested_proto( - 2, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 2]) { /* constants */ - /* K0 */ be_nested_str_weak(tick), - /* K1 */ be_const_int(1), - }), - be_str_weak(every_50ms), - &be_const_str_solidified, - ( &(const binstruction[ 4]) { /* code */ - 0x88040100, // 0000 GETMBR R1 R0 K0 - 0x00040301, // 0001 ADD R1 R1 K1 - 0x90020001, // 0002 SETMBR R0 K0 R1 - 0x80000000, // 0003 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: start_basic_commissioning -********************************************************************/ -be_local_closure(Matter_Device_start_basic_commissioning, /* name */ - be_nested_proto( - 13, /* nstack */ - 8, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 1, /* has sup protos */ - ( &(const struct bproto*[ 2]) { - be_nested_proto( - 4, /* nstack */ - 0, /* argc */ - 0, /* varg */ - 1, /* has upvals */ - ( &(const bupvaldesc[ 1]) { /* upvals */ - be_local_const_upval(1, 0), - }), - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 4]) { /* constants */ - /* K0 */ be_nested_str_weak(mdns_announce_PASE), - /* K1 */ be_nested_str_weak(tasmota), - /* K2 */ be_nested_str_weak(remove_rule), - /* K3 */ be_nested_str_weak(Wifi_X23Connected), - }), - be_str_weak(_anonymous_), - &be_const_str_solidified, - ( &(const binstruction[ 9]) { /* code */ - 0x68000000, // 0000 GETUPV R0 U0 - 0x8C000100, // 0001 GETMET R0 R0 K0 - 0x7C000200, // 0002 CALL R0 1 - 0xB8020200, // 0003 GETNGBL R0 K1 - 0x8C000102, // 0004 GETMET R0 R0 K2 - 0x58080003, // 0005 LDCONST R2 K3 - 0x580C0000, // 0006 LDCONST R3 K0 - 0x7C000600, // 0007 CALL R0 3 - 0x80000000, // 0008 RET 0 - }) - ), - be_nested_proto( - 4, /* nstack */ - 0, /* argc */ - 0, /* varg */ - 1, /* has upvals */ - ( &(const bupvaldesc[ 1]) { /* upvals */ - be_local_const_upval(1, 0), - }), - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 4]) { /* constants */ - /* K0 */ be_nested_str_weak(mdns_announce_PASE), - /* K1 */ be_nested_str_weak(tasmota), - /* K2 */ be_nested_str_weak(remove_rule), - /* K3 */ be_nested_str_weak(Eth_X23Connected), - }), - be_str_weak(_anonymous_), - &be_const_str_solidified, - ( &(const binstruction[ 9]) { /* code */ - 0x68000000, // 0000 GETUPV R0 U0 - 0x8C000100, // 0001 GETMET R0 R0 K0 - 0x7C000200, // 0002 CALL R0 1 - 0xB8020200, // 0003 GETNGBL R0 K1 - 0x8C000102, // 0004 GETMET R0 R0 K2 - 0x58080003, // 0005 LDCONST R2 K3 - 0x580C0000, // 0006 LDCONST R3 K0 - 0x7C000600, // 0007 CALL R0 3 - 0x80000000, // 0008 RET 0 - }) - ), - }), - 1, /* has constants */ - ( &(const bvalue[16]) { /* constants */ - /* K0 */ be_nested_str_weak(commissioning_open), - /* K1 */ be_nested_str_weak(tasmota), - /* K2 */ be_nested_str_weak(millis), - /* K3 */ be_nested_str_weak(commissioning_iterations), - /* K4 */ be_nested_str_weak(commissioning_discriminator), - /* K5 */ be_nested_str_weak(commissioning_salt), - /* K6 */ be_nested_str_weak(commissioning_w0), - /* K7 */ be_nested_str_weak(commissioning_L), - /* K8 */ be_nested_str_weak(commissioning_admin_fabric), - /* K9 */ be_nested_str_weak(wifi), - /* K10 */ be_nested_str_weak(up), - /* K11 */ be_nested_str_weak(eth), - /* K12 */ be_nested_str_weak(mdns_announce_PASE), - /* K13 */ be_nested_str_weak(add_rule), - /* K14 */ be_nested_str_weak(Wifi_X23Connected), - /* K15 */ be_nested_str_weak(Eth_X23Connected), - }), - be_str_weak(start_basic_commissioning), - &be_const_str_solidified, - ( &(const binstruction[40]) { /* code */ - 0xB8220200, // 0000 GETNGBL R8 K1 - 0x8C201102, // 0001 GETMET R8 R8 K2 - 0x7C200200, // 0002 CALL R8 1 - 0x542603E7, // 0003 LDINT R9 1000 - 0x08240209, // 0004 MUL R9 R1 R9 - 0x00201009, // 0005 ADD R8 R8 R9 - 0x90020008, // 0006 SETMBR R0 K0 R8 - 0x90020602, // 0007 SETMBR R0 K3 R2 - 0x90020803, // 0008 SETMBR R0 K4 R3 - 0x90020A04, // 0009 SETMBR R0 K5 R4 - 0x90020C05, // 000A SETMBR R0 K6 R5 - 0x90020E06, // 000B SETMBR R0 K7 R6 - 0x90021007, // 000C SETMBR R0 K8 R7 - 0xB8220200, // 000D GETNGBL R8 K1 - 0x8C201109, // 000E GETMET R8 R8 K9 - 0x7C200200, // 000F CALL R8 1 - 0x9420110A, // 0010 GETIDX R8 R8 K10 - 0x74220004, // 0011 JMPT R8 #0017 - 0xB8220200, // 0012 GETNGBL R8 K1 - 0x8C20110B, // 0013 GETMET R8 R8 K11 - 0x7C200200, // 0014 CALL R8 1 - 0x9420110A, // 0015 GETIDX R8 R8 K10 - 0x78220002, // 0016 JMPF R8 #001A - 0x8C20010C, // 0017 GETMET R8 R0 K12 - 0x7C200200, // 0018 CALL R8 1 - 0x7002000B, // 0019 JMP #0026 - 0xB8220200, // 001A GETNGBL R8 K1 - 0x8C20110D, // 001B GETMET R8 R8 K13 - 0x5828000E, // 001C LDCONST R10 K14 - 0x842C0000, // 001D CLOSURE R11 P0 - 0x5830000C, // 001E LDCONST R12 K12 - 0x7C200800, // 001F CALL R8 4 - 0xB8220200, // 0020 GETNGBL R8 K1 - 0x8C20110D, // 0021 GETMET R8 R8 K13 - 0x5828000F, // 0022 LDCONST R10 K15 - 0x842C0001, // 0023 CLOSURE R11 P1 - 0x5830000C, // 0024 LDCONST R12 K12 - 0x7C200800, // 0025 CALL R8 4 - 0xA0000000, // 0026 CLOSE R0 - 0x80000000, // 0027 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: _compute_pbkdf -********************************************************************/ -be_local_closure(Matter_Device__compute_pbkdf, /* name */ - be_nested_proto( - 14, /* nstack */ - 4, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[11]) { /* constants */ - /* K0 */ be_nested_str_weak(crypto), - /* K1 */ be_nested_str_weak(string), - /* K2 */ be_nested_str_weak(add), - /* K3 */ be_nested_str_weak(PBKDF2_HMAC_SHA256), - /* K4 */ be_nested_str_weak(derive), - /* K5 */ be_const_int(0), - /* K6 */ be_nested_str_weak(root_w0), - /* K7 */ be_nested_str_weak(EC_P256), - /* K8 */ be_nested_str_weak(mod), - /* K9 */ be_nested_str_weak(root_L), - /* K10 */ be_nested_str_weak(public_key), - }), - be_str_weak(_compute_pbkdf), - &be_const_str_solidified, - ( &(const binstruction[41]) { /* code */ - 0xA4120000, // 0000 IMPORT R4 K0 - 0xA4160200, // 0001 IMPORT R5 K1 - 0x60180015, // 0002 GETGBL R6 G21 - 0x7C180000, // 0003 CALL R6 0 - 0x8C180D02, // 0004 GETMET R6 R6 K2 - 0x5C200200, // 0005 MOVE R8 R1 - 0x54260003, // 0006 LDINT R9 4 - 0x7C180600, // 0007 CALL R6 3 - 0x8C1C0903, // 0008 GETMET R7 R4 K3 - 0x7C1C0200, // 0009 CALL R7 1 - 0x8C1C0F04, // 000A GETMET R7 R7 K4 - 0x5C240C00, // 000B MOVE R9 R6 - 0x5C280600, // 000C MOVE R10 R3 - 0x5C2C0400, // 000D MOVE R11 R2 - 0x5432004F, // 000E LDINT R12 80 - 0x7C1C0A00, // 000F CALL R7 5 - 0x54220026, // 0010 LDINT R8 39 - 0x40220A08, // 0011 CONNECT R8 K5 R8 - 0x94200E08, // 0012 GETIDX R8 R7 R8 - 0x54260027, // 0013 LDINT R9 40 - 0x542A004E, // 0014 LDINT R10 79 - 0x4024120A, // 0015 CONNECT R9 R9 R10 - 0x94240E09, // 0016 GETIDX R9 R7 R9 - 0x8C280907, // 0017 GETMET R10 R4 K7 - 0x7C280200, // 0018 CALL R10 1 - 0x8C281508, // 0019 GETMET R10 R10 K8 - 0x5C301000, // 001A MOVE R12 R8 - 0x7C280400, // 001B CALL R10 2 - 0x90020C0A, // 001C SETMBR R0 K6 R10 - 0x8C280907, // 001D GETMET R10 R4 K7 - 0x7C280200, // 001E CALL R10 1 - 0x8C281508, // 001F GETMET R10 R10 K8 - 0x5C301200, // 0020 MOVE R12 R9 - 0x7C280400, // 0021 CALL R10 2 - 0x8C2C0907, // 0022 GETMET R11 R4 K7 - 0x7C2C0200, // 0023 CALL R11 1 - 0x8C2C170A, // 0024 GETMET R11 R11 K10 - 0x5C341400, // 0025 MOVE R13 R10 - 0x7C2C0400, // 0026 CALL R11 2 - 0x9002120B, // 0027 SETMBR R0 K9 R11 - 0x80000000, // 0028 RET 0 + ( &(const binstruction[22]) { /* code */ + 0x60040010, // 0000 GETGBL R1 G16 + 0x88080100, // 0001 GETMBR R2 R0 K0 + 0x8C080501, // 0002 GETMET R2 R2 K1 + 0x7C080200, // 0003 CALL R2 1 + 0x7C040200, // 0004 CALL R1 1 + 0xA802000B, // 0005 EXBLK 0 #0012 + 0x5C080200, // 0006 MOVE R2 R1 + 0x7C080000, // 0007 CALL R2 0 + 0x8C0C0502, // 0008 GETMET R3 R2 K2 + 0x7C0C0200, // 0009 CALL R3 1 + 0x780E0005, // 000A JMPF R3 #0011 + 0x8C0C0503, // 000B GETMET R3 R2 K3 + 0x7C0C0200, // 000C CALL R3 1 + 0x780E0002, // 000D JMPF R3 #0011 + 0x8C0C0104, // 000E GETMET R3 R0 K4 + 0x5C140400, // 000F MOVE R5 R2 + 0x7C0C0400, // 0010 CALL R3 2 + 0x7001FFF3, // 0011 JMP #0006 + 0x58040005, // 0012 LDCONST R1 K5 + 0xAC040200, // 0013 CATCH R1 1 0 + 0xB0080000, // 0014 RAISE 2 R0 R0 + 0x80000000, // 0015 RET 0 }) ) ); @@ -3392,9 +649,9 @@ be_local_closure(Matter_Device_autoconf_sensors_list, /* name */ /******************************************************************** -** Solidified function: stop +** Solidified function: every_250ms ********************************************************************/ -be_local_closure(Matter_Device_stop, /* name */ +be_local_closure(Matter_Device_every_250ms, /* name */ be_nested_proto( 4, /* nstack */ 1, /* argc */ @@ -3404,25 +661,422 @@ be_local_closure(Matter_Device_stop, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[ 4]) { /* constants */ - /* K0 */ be_nested_str_weak(tasmota), - /* K1 */ be_nested_str_weak(remove_driver), - /* K2 */ be_nested_str_weak(udp_server), - /* K3 */ be_nested_str_weak(stop), + ( &(const bvalue[ 5]) { /* constants */ + /* K0 */ be_nested_str_weak(message_handler), + /* K1 */ be_nested_str_weak(every_250ms), + /* K2 */ be_const_int(0), + /* K3 */ be_nested_str_weak(plugins), + /* K4 */ be_const_int(1), }), - be_str_weak(stop), + be_str_weak(every_250ms), &be_const_str_solidified, - ( &(const binstruction[10]) { /* code */ - 0xB8060000, // 0000 GETNGBL R1 K0 + ( &(const binstruction[16]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 0x8C040301, // 0001 GETMET R1 R1 K1 - 0x5C0C0000, // 0002 MOVE R3 R0 - 0x7C040400, // 0003 CALL R1 2 - 0x88040102, // 0004 GETMBR R1 R0 K2 - 0x78060002, // 0005 JMPF R1 #0009 - 0x88040102, // 0006 GETMBR R1 R0 K2 - 0x8C040303, // 0007 GETMET R1 R1 K3 - 0x7C040200, // 0008 CALL R1 1 - 0x80000000, // 0009 RET 0 + 0x7C040200, // 0002 CALL R1 1 + 0x58040002, // 0003 LDCONST R1 K2 + 0x6008000C, // 0004 GETGBL R2 G12 + 0x880C0103, // 0005 GETMBR R3 R0 K3 + 0x7C080200, // 0006 CALL R2 1 + 0x14080202, // 0007 LT R2 R1 R2 + 0x780A0005, // 0008 JMPF R2 #000F + 0x88080103, // 0009 GETMBR R2 R0 K3 + 0x94080401, // 000A GETIDX R2 R2 R1 + 0x8C080501, // 000B GETMET R2 R2 K1 + 0x7C080200, // 000C CALL R2 1 + 0x00040304, // 000D ADD R1 R1 K4 + 0x7001FFF4, // 000E JMP #0004 + 0x80000000, // 000F RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: process_attribute_expansion +********************************************************************/ +be_local_closure(Matter_Device_process_attribute_expansion, /* name */ + be_nested_proto( + 25, /* nstack */ + 3, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 1, /* has sup protos */ + ( &(const struct bproto*[ 1]) { + be_nested_proto( + 7, /* nstack */ + 1, /* argc */ + 0, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 5]) { /* constants */ + /* K0 */ be_nested_str_weak(keys), + /* K1 */ be_nested_str_weak(push), + /* K2 */ be_nested_str_weak(stop_iteration), + /* K3 */ be_const_int(1), + /* K4 */ be_const_int(0), + }), + be_str_weak(keys_sorted), + &be_const_str_solidified, + ( &(const binstruction[45]) { /* code */ + 0x60040012, // 0000 GETGBL R1 G18 + 0x7C040000, // 0001 CALL R1 0 + 0x60080010, // 0002 GETGBL R2 G16 + 0x8C0C0100, // 0003 GETMET R3 R0 K0 + 0x7C0C0200, // 0004 CALL R3 1 + 0x7C080200, // 0005 CALL R2 1 + 0xA8020005, // 0006 EXBLK 0 #000D + 0x5C0C0400, // 0007 MOVE R3 R2 + 0x7C0C0000, // 0008 CALL R3 0 + 0x8C100301, // 0009 GETMET R4 R1 K1 + 0x5C180600, // 000A MOVE R6 R3 + 0x7C100400, // 000B CALL R4 2 + 0x7001FFF9, // 000C JMP #0007 + 0x58080002, // 000D LDCONST R2 K2 + 0xAC080200, // 000E CATCH R2 1 0 + 0xB0080000, // 000F RAISE 2 R0 R0 + 0x60080010, // 0010 GETGBL R2 G16 + 0x600C000C, // 0011 GETGBL R3 G12 + 0x5C100200, // 0012 MOVE R4 R1 + 0x7C0C0200, // 0013 CALL R3 1 + 0x040C0703, // 0014 SUB R3 R3 K3 + 0x400E0603, // 0015 CONNECT R3 K3 R3 + 0x7C080200, // 0016 CALL R2 1 + 0xA8020010, // 0017 EXBLK 0 #0029 + 0x5C0C0400, // 0018 MOVE R3 R2 + 0x7C0C0000, // 0019 CALL R3 0 + 0x94100203, // 001A GETIDX R4 R1 R3 + 0x5C140600, // 001B MOVE R5 R3 + 0x24180B04, // 001C GT R6 R5 K4 + 0x781A0008, // 001D JMPF R6 #0027 + 0x04180B03, // 001E SUB R6 R5 K3 + 0x94180206, // 001F GETIDX R6 R1 R6 + 0x24180C04, // 0020 GT R6 R6 R4 + 0x781A0004, // 0021 JMPF R6 #0027 + 0x04180B03, // 0022 SUB R6 R5 K3 + 0x94180206, // 0023 GETIDX R6 R1 R6 + 0x98040A06, // 0024 SETIDX R1 R5 R6 + 0x04140B03, // 0025 SUB R5 R5 K3 + 0x7001FFF4, // 0026 JMP #001C + 0x98040A04, // 0027 SETIDX R1 R5 R4 + 0x7001FFEE, // 0028 JMP #0018 + 0x58080002, // 0029 LDCONST R2 K2 + 0xAC080200, // 002A CATCH R2 1 0 + 0xB0080000, // 002B RAISE 2 R0 R0 + 0x80040200, // 002C RET 1 R1 + }) + ), + }), + 1, /* has constants */ + ( &(const bvalue[17]) { /* constants */ + /* K0 */ be_nested_str_weak(string), + /* K1 */ be_nested_str_weak(endpoint), + /* K2 */ be_nested_str_weak(cluster), + /* K3 */ be_nested_str_weak(attribute), + /* K4 */ be_nested_str_weak(plugins), + /* K5 */ be_nested_str_weak(get_endpoint), + /* K6 */ be_nested_str_weak(contains), + /* K7 */ be_nested_str_weak(get_cluster_list), + /* K8 */ be_nested_str_weak(get_attribute_list), + /* K9 */ be_nested_str_weak(push), + /* K10 */ be_nested_str_weak(stop_iteration), + /* K11 */ be_nested_str_weak(status), + /* K12 */ be_nested_str_weak(matter), + /* K13 */ be_nested_str_weak(UNSUPPORTED_ENDPOINT), + /* K14 */ be_nested_str_weak(UNSUPPORTED_CLUSTER), + /* K15 */ be_nested_str_weak(UNSUPPORTED_ATTRIBUTE), + /* K16 */ be_nested_str_weak(UNREPORTABLE_ATTRIBUTE), + }), + be_str_weak(process_attribute_expansion), + &be_const_str_solidified, + ( &(const binstruction[206]) { /* code */ + 0x840C0000, // 0000 CLOSURE R3 P0 + 0xA4120000, // 0001 IMPORT R4 K0 + 0x88140301, // 0002 GETMBR R5 R1 K1 + 0x50180000, // 0003 LDBOOL R6 0 0 + 0x881C0302, // 0004 GETMBR R7 R1 K2 + 0x50200000, // 0005 LDBOOL R8 0 0 + 0x88240303, // 0006 GETMBR R9 R1 K3 + 0x50280000, // 0007 LDBOOL R10 0 0 + 0x882C0301, // 0008 GETMBR R11 R1 K1 + 0x4C300000, // 0009 LDNIL R12 + 0x202C160C, // 000A NE R11 R11 R12 + 0x782E0007, // 000B JMPF R11 #0014 + 0x882C0302, // 000C GETMBR R11 R1 K2 + 0x4C300000, // 000D LDNIL R12 + 0x202C160C, // 000E NE R11 R11 R12 + 0x782E0003, // 000F JMPF R11 #0014 + 0x882C0303, // 0010 GETMBR R11 R1 K3 + 0x4C300000, // 0011 LDNIL R12 + 0x202C160C, // 0012 NE R11 R11 R12 + 0x742E0000, // 0013 JMPT R11 #0015 + 0x502C0001, // 0014 LDBOOL R11 0 1 + 0x502C0200, // 0015 LDBOOL R11 1 0 + 0x60300013, // 0016 GETGBL R12 G19 + 0x7C300000, // 0017 CALL R12 0 + 0x60340010, // 0018 GETGBL R13 G16 + 0x88380104, // 0019 GETMBR R14 R0 K4 + 0x7C340200, // 001A CALL R13 1 + 0xA8020055, // 001B EXBLK 0 #0072 + 0x5C381A00, // 001C MOVE R14 R13 + 0x7C380000, // 001D CALL R14 0 + 0x8C3C1D05, // 001E GETMET R15 R14 K5 + 0x7C3C0200, // 001F CALL R15 1 + 0x4C400000, // 0020 LDNIL R16 + 0x20400A10, // 0021 NE R16 R5 R16 + 0x78420002, // 0022 JMPF R16 #0026 + 0x20401E05, // 0023 NE R16 R15 R5 + 0x78420000, // 0024 JMPF R16 #0026 + 0x7001FFF5, // 0025 JMP #001C + 0x8C401906, // 0026 GETMET R16 R12 K6 + 0x5C481E00, // 0027 MOVE R18 R15 + 0x7C400400, // 0028 CALL R16 2 + 0x74420002, // 0029 JMPT R16 #002D + 0x60400013, // 002A GETGBL R16 G19 + 0x7C400000, // 002B CALL R16 0 + 0x98301E10, // 002C SETIDX R12 R15 R16 + 0x50180200, // 002D LDBOOL R6 1 0 + 0x8C401D07, // 002E GETMET R16 R14 K7 + 0x5C481E00, // 002F MOVE R18 R15 + 0x7C400400, // 0030 CALL R16 2 + 0x60440010, // 0031 GETGBL R17 G16 + 0x5C482000, // 0032 MOVE R18 R16 + 0x7C440200, // 0033 CALL R17 1 + 0xA8020038, // 0034 EXBLK 0 #006E + 0x5C482200, // 0035 MOVE R18 R17 + 0x7C480000, // 0036 CALL R18 0 + 0x4C4C0000, // 0037 LDNIL R19 + 0x204C0E13, // 0038 NE R19 R7 R19 + 0x784E0002, // 0039 JMPF R19 #003D + 0x204C2407, // 003A NE R19 R18 R7 + 0x784E0000, // 003B JMPF R19 #003D + 0x7001FFF7, // 003C JMP #0035 + 0x944C180F, // 003D GETIDX R19 R12 R15 + 0x8C4C2706, // 003E GETMET R19 R19 K6 + 0x5C542400, // 003F MOVE R21 R18 + 0x7C4C0400, // 0040 CALL R19 2 + 0x744E0003, // 0041 JMPT R19 #0046 + 0x944C180F, // 0042 GETIDX R19 R12 R15 + 0x60500013, // 0043 GETGBL R20 G19 + 0x7C500000, // 0044 CALL R20 0 + 0x984C2414, // 0045 SETIDX R19 R18 R20 + 0x50200200, // 0046 LDBOOL R8 1 0 + 0x8C4C1D08, // 0047 GETMET R19 R14 K8 + 0x5C541E00, // 0048 MOVE R21 R15 + 0x5C582400, // 0049 MOVE R22 R18 + 0x7C4C0600, // 004A CALL R19 3 + 0x60500010, // 004B GETGBL R20 G16 + 0x5C542600, // 004C MOVE R21 R19 + 0x7C500200, // 004D CALL R20 1 + 0xA802001A, // 004E EXBLK 0 #006A + 0x5C542800, // 004F MOVE R21 R20 + 0x7C540000, // 0050 CALL R21 0 + 0x4C580000, // 0051 LDNIL R22 + 0x20581216, // 0052 NE R22 R9 R22 + 0x785A0002, // 0053 JMPF R22 #0057 + 0x20582A09, // 0054 NE R22 R21 R9 + 0x785A0000, // 0055 JMPF R22 #0057 + 0x7001FFF7, // 0056 JMP #004F + 0x9458180F, // 0057 GETIDX R22 R12 R15 + 0x94582C12, // 0058 GETIDX R22 R22 R18 + 0x8C582D06, // 0059 GETMET R22 R22 K6 + 0x5C602A00, // 005A MOVE R24 R21 + 0x7C580400, // 005B CALL R22 2 + 0x745A0004, // 005C JMPT R22 #0062 + 0x9458180F, // 005D GETIDX R22 R12 R15 + 0x94582C12, // 005E GETIDX R22 R22 R18 + 0x605C0012, // 005F GETGBL R23 G18 + 0x7C5C0000, // 0060 CALL R23 0 + 0x98582A17, // 0061 SETIDX R22 R21 R23 + 0x50280200, // 0062 LDBOOL R10 1 0 + 0x9458180F, // 0063 GETIDX R22 R12 R15 + 0x94582C12, // 0064 GETIDX R22 R22 R18 + 0x94582C15, // 0065 GETIDX R22 R22 R21 + 0x8C582D09, // 0066 GETMET R22 R22 K9 + 0x5C601C00, // 0067 MOVE R24 R14 + 0x7C580400, // 0068 CALL R22 2 + 0x7001FFE4, // 0069 JMP #004F + 0x5850000A, // 006A LDCONST R20 K10 + 0xAC500200, // 006B CATCH R20 1 0 + 0xB0080000, // 006C RAISE 2 R0 R0 + 0x7001FFC6, // 006D JMP #0035 + 0x5844000A, // 006E LDCONST R17 K10 + 0xAC440200, // 006F CATCH R17 1 0 + 0xB0080000, // 0070 RAISE 2 R0 R0 + 0x7001FFA9, // 0071 JMP #001C + 0x5834000A, // 0072 LDCONST R13 K10 + 0xAC340200, // 0073 CATCH R13 1 0 + 0xB0080000, // 0074 RAISE 2 R0 R0 + 0x60340010, // 0075 GETGBL R13 G16 + 0x5C380600, // 0076 MOVE R14 R3 + 0x5C3C1800, // 0077 MOVE R15 R12 + 0x7C380200, // 0078 CALL R14 1 + 0x7C340200, // 0079 CALL R13 1 + 0xA8020033, // 007A EXBLK 0 #00AF + 0x5C381A00, // 007B MOVE R14 R13 + 0x7C380000, // 007C CALL R14 0 + 0x603C0010, // 007D GETGBL R15 G16 + 0x5C400600, // 007E MOVE R16 R3 + 0x9444180E, // 007F GETIDX R17 R12 R14 + 0x7C400200, // 0080 CALL R16 1 + 0x7C3C0200, // 0081 CALL R15 1 + 0xA8020027, // 0082 EXBLK 0 #00AB + 0x5C401E00, // 0083 MOVE R16 R15 + 0x7C400000, // 0084 CALL R16 0 + 0x60440010, // 0085 GETGBL R17 G16 + 0x5C480600, // 0086 MOVE R18 R3 + 0x944C180E, // 0087 GETIDX R19 R12 R14 + 0x944C2610, // 0088 GETIDX R19 R19 R16 + 0x7C480200, // 0089 CALL R18 1 + 0x7C440200, // 008A CALL R17 1 + 0xA802001A, // 008B EXBLK 0 #00A7 + 0x5C482200, // 008C MOVE R18 R17 + 0x7C480000, // 008D CALL R18 0 + 0x604C0010, // 008E GETGBL R19 G16 + 0x9450180E, // 008F GETIDX R20 R12 R14 + 0x94502810, // 0090 GETIDX R20 R20 R16 + 0x94502812, // 0091 GETIDX R20 R20 R18 + 0x7C4C0200, // 0092 CALL R19 1 + 0xA802000E, // 0093 EXBLK 0 #00A3 + 0x5C502600, // 0094 MOVE R20 R19 + 0x7C500000, // 0095 CALL R20 0 + 0x9006020E, // 0096 SETMBR R1 K1 R14 + 0x90060410, // 0097 SETMBR R1 K2 R16 + 0x90060612, // 0098 SETMBR R1 K3 R18 + 0x5C540400, // 0099 MOVE R21 R2 + 0x5C582800, // 009A MOVE R22 R20 + 0x5C5C0200, // 009B MOVE R23 R1 + 0x5C601600, // 009C MOVE R24 R11 + 0x7C540600, // 009D CALL R21 3 + 0x782E0002, // 009E JMPF R11 #00A2 + 0x78560001, // 009F JMPF R21 #00A2 + 0xA8040004, // 00A0 EXBLK 1 4 + 0x80002C00, // 00A1 RET 0 + 0x7001FFF0, // 00A2 JMP #0094 + 0x584C000A, // 00A3 LDCONST R19 K10 + 0xAC4C0200, // 00A4 CATCH R19 1 0 + 0xB0080000, // 00A5 RAISE 2 R0 R0 + 0x7001FFE4, // 00A6 JMP #008C + 0x5844000A, // 00A7 LDCONST R17 K10 + 0xAC440200, // 00A8 CATCH R17 1 0 + 0xB0080000, // 00A9 RAISE 2 R0 R0 + 0x7001FFD7, // 00AA JMP #0083 + 0x583C000A, // 00AB LDCONST R15 K10 + 0xAC3C0200, // 00AC CATCH R15 1 0 + 0xB0080000, // 00AD RAISE 2 R0 R0 + 0x7001FFCB, // 00AE JMP #007B + 0x5834000A, // 00AF LDCONST R13 K10 + 0xAC340200, // 00B0 CATCH R13 1 0 + 0xB0080000, // 00B1 RAISE 2 R0 R0 + 0x782E0019, // 00B2 JMPF R11 #00CD + 0x5C340C00, // 00B3 MOVE R13 R6 + 0x74360003, // 00B4 JMPT R13 #00B9 + 0xB8361800, // 00B5 GETNGBL R13 K12 + 0x88341B0D, // 00B6 GETMBR R13 R13 K13 + 0x9006160D, // 00B7 SETMBR R1 K11 R13 + 0x7002000E, // 00B8 JMP #00C8 + 0x5C341000, // 00B9 MOVE R13 R8 + 0x74360003, // 00BA JMPT R13 #00BF + 0xB8361800, // 00BB GETNGBL R13 K12 + 0x88341B0E, // 00BC GETMBR R13 R13 K14 + 0x9006160D, // 00BD SETMBR R1 K11 R13 + 0x70020008, // 00BE JMP #00C8 + 0x5C341400, // 00BF MOVE R13 R10 + 0x74360003, // 00C0 JMPT R13 #00C5 + 0xB8361800, // 00C1 GETNGBL R13 K12 + 0x88341B0F, // 00C2 GETMBR R13 R13 K15 + 0x9006160D, // 00C3 SETMBR R1 K11 R13 + 0x70020002, // 00C4 JMP #00C8 + 0xB8361800, // 00C5 GETNGBL R13 K12 + 0x88341B10, // 00C6 GETMBR R13 R13 K16 + 0x9006160D, // 00C7 SETMBR R1 K11 R13 + 0x5C340400, // 00C8 MOVE R13 R2 + 0x4C380000, // 00C9 LDNIL R14 + 0x5C3C0200, // 00CA MOVE R15 R1 + 0x50400200, // 00CB LDBOOL R16 1 0 + 0x7C340600, // 00CC CALL R13 3 + 0x80000000, // 00CD RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: _compute_pbkdf +********************************************************************/ +be_local_closure(Matter_Device__compute_pbkdf, /* name */ + be_nested_proto( + 14, /* nstack */ + 4, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[11]) { /* constants */ + /* K0 */ be_nested_str_weak(crypto), + /* K1 */ be_nested_str_weak(string), + /* K2 */ be_nested_str_weak(add), + /* K3 */ be_nested_str_weak(PBKDF2_HMAC_SHA256), + /* K4 */ be_nested_str_weak(derive), + /* K5 */ be_const_int(0), + /* K6 */ be_nested_str_weak(root_w0), + /* K7 */ be_nested_str_weak(EC_P256), + /* K8 */ be_nested_str_weak(mod), + /* K9 */ be_nested_str_weak(root_L), + /* K10 */ be_nested_str_weak(public_key), + }), + be_str_weak(_compute_pbkdf), + &be_const_str_solidified, + ( &(const binstruction[41]) { /* code */ + 0xA4120000, // 0000 IMPORT R4 K0 + 0xA4160200, // 0001 IMPORT R5 K1 + 0x60180015, // 0002 GETGBL R6 G21 + 0x7C180000, // 0003 CALL R6 0 + 0x8C180D02, // 0004 GETMET R6 R6 K2 + 0x5C200200, // 0005 MOVE R8 R1 + 0x54260003, // 0006 LDINT R9 4 + 0x7C180600, // 0007 CALL R6 3 + 0x8C1C0903, // 0008 GETMET R7 R4 K3 + 0x7C1C0200, // 0009 CALL R7 1 + 0x8C1C0F04, // 000A GETMET R7 R7 K4 + 0x5C240C00, // 000B MOVE R9 R6 + 0x5C280600, // 000C MOVE R10 R3 + 0x5C2C0400, // 000D MOVE R11 R2 + 0x5432004F, // 000E LDINT R12 80 + 0x7C1C0A00, // 000F CALL R7 5 + 0x54220026, // 0010 LDINT R8 39 + 0x40220A08, // 0011 CONNECT R8 K5 R8 + 0x94200E08, // 0012 GETIDX R8 R7 R8 + 0x54260027, // 0013 LDINT R9 40 + 0x542A004E, // 0014 LDINT R10 79 + 0x4024120A, // 0015 CONNECT R9 R9 R10 + 0x94240E09, // 0016 GETIDX R9 R7 R9 + 0x8C280907, // 0017 GETMET R10 R4 K7 + 0x7C280200, // 0018 CALL R10 1 + 0x8C281508, // 0019 GETMET R10 R10 K8 + 0x5C301000, // 001A MOVE R12 R8 + 0x7C280400, // 001B CALL R10 2 + 0x90020C0A, // 001C SETMBR R0 K6 R10 + 0x8C280907, // 001D GETMET R10 R4 K7 + 0x7C280200, // 001E CALL R10 1 + 0x8C281508, // 001F GETMET R10 R10 K8 + 0x5C301200, // 0020 MOVE R12 R9 + 0x7C280400, // 0021 CALL R10 2 + 0x8C2C0907, // 0022 GETMET R11 R4 K7 + 0x7C2C0200, // 0023 CALL R11 1 + 0x8C2C170A, // 0024 GETMET R11 R11 K10 + 0x5C341400, // 0025 MOVE R13 R10 + 0x7C2C0400, // 0026 CALL R11 2 + 0x9002120B, // 0027 SETMBR R0 K9 R11 + 0x80000000, // 0028 RET 0 }) ) ); @@ -3434,7 +1088,7 @@ be_local_closure(Matter_Device_stop, /* name */ ********************************************************************/ be_local_closure(Matter_Device_bridge_remove_endpoint, /* name */ be_nested_proto( - 11, /* nstack */ + 13, /* nstack */ 2, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -3442,7 +1096,7 @@ be_local_closure(Matter_Device_bridge_remove_endpoint, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[17]) { /* constants */ + ( &(const bvalue[20]) { /* constants */ /* K0 */ be_nested_str_weak(string), /* K1 */ be_nested_str_weak(json), /* K2 */ be_nested_str_weak(plugins_config), @@ -3451,19 +1105,22 @@ be_local_closure(Matter_Device_bridge_remove_endpoint, /* name */ /* K5 */ be_nested_str_weak(log), /* K6 */ be_nested_str_weak(MTR_X3A_X20Cannot_X20remove_X20an_X20enpoint_X20not_X20configured_X3A_X20), /* K7 */ be_const_int(3), - /* K8 */ be_nested_str_weak(remove), - /* K9 */ be_nested_str_weak(plugins_persist), - /* K10 */ be_nested_str_weak(save_param), - /* K11 */ be_nested_str_weak(signal_endpoints_changed), - /* K12 */ be_const_int(0), - /* K13 */ be_nested_str_weak(plugins), - /* K14 */ be_nested_str_weak(get_endpoint), - /* K15 */ be_const_int(1), - /* K16 */ be_nested_str_weak(clean_remotes), + /* K8 */ be_nested_str_weak(format), + /* K9 */ be_nested_str_weak(MTR_X3A_X20deleting_X20endpoint_X20_X3D_X20_X25i), + /* K10 */ be_const_int(2), + /* K11 */ be_nested_str_weak(remove), + /* K12 */ be_nested_str_weak(plugins_persist), + /* K13 */ be_nested_str_weak(save_param), + /* K14 */ be_nested_str_weak(signal_endpoints_changed), + /* K15 */ be_const_int(0), + /* K16 */ be_nested_str_weak(plugins), + /* K17 */ be_nested_str_weak(get_endpoint), + /* K18 */ be_const_int(1), + /* K19 */ be_nested_str_weak(clean_remotes), }), be_str_weak(bridge_remove_endpoint), &be_const_str_solidified, - ( &(const binstruction[53]) { /* code */ + ( &(const binstruction[61]) { /* code */ 0xA40A0000, // 0000 IMPORT R2 K0 0xA40E0200, // 0001 IMPORT R3 K1 0x60100008, // 0002 GETGBL R4 G8 @@ -3482,419 +1139,49 @@ be_local_closure(Matter_Device_bridge_remove_endpoint, /* name */ 0x58280007, // 000F LDCONST R10 K7 0x7C1C0600, // 0010 CALL R7 3 0x80000E00, // 0011 RET 0 - 0x881C0102, // 0012 GETMBR R7 R0 K2 - 0x8C1C0F08, // 0013 GETMET R7 R7 K8 - 0x5C240800, // 0014 MOVE R9 R4 - 0x7C1C0400, // 0015 CALL R7 2 - 0x501C0200, // 0016 LDBOOL R7 1 0 - 0x90021207, // 0017 SETMBR R0 K9 R7 - 0x8C1C010A, // 0018 GETMET R7 R0 K10 - 0x7C1C0200, // 0019 CALL R7 1 - 0x8C1C010B, // 001A GETMET R7 R0 K11 - 0x7C1C0200, // 001B CALL R7 1 - 0x581C000C, // 001C LDCONST R7 K12 - 0x6020000C, // 001D GETGBL R8 G12 - 0x8824010D, // 001E GETMBR R9 R0 K13 - 0x7C200200, // 001F CALL R8 1 - 0x14200E08, // 0020 LT R8 R7 R8 - 0x7822000F, // 0021 JMPF R8 #0032 - 0x8820010D, // 0022 GETMBR R8 R0 K13 - 0x94201007, // 0023 GETIDX R8 R8 R7 - 0x8C20110E, // 0024 GETMET R8 R8 K14 - 0x7C200200, // 0025 CALL R8 1 - 0x1C200208, // 0026 EQ R8 R1 R8 - 0x78220007, // 0027 JMPF R8 #0030 - 0x8820010D, // 0028 GETMBR R8 R0 K13 - 0x8C201108, // 0029 GETMET R8 R8 K8 - 0x5C280E00, // 002A MOVE R10 R7 - 0x7C200400, // 002B CALL R8 2 - 0x8C20010B, // 002C GETMET R8 R0 K11 + 0xB81E0800, // 0012 GETNGBL R7 K4 + 0x8C1C0F05, // 0013 GETMET R7 R7 K5 + 0x8C240508, // 0014 GETMET R9 R2 K8 + 0x582C0009, // 0015 LDCONST R11 K9 + 0x5C300200, // 0016 MOVE R12 R1 + 0x7C240600, // 0017 CALL R9 3 + 0x5828000A, // 0018 LDCONST R10 K10 + 0x7C1C0600, // 0019 CALL R7 3 + 0x881C0102, // 001A GETMBR R7 R0 K2 + 0x8C1C0F0B, // 001B GETMET R7 R7 K11 + 0x5C240800, // 001C MOVE R9 R4 + 0x7C1C0400, // 001D CALL R7 2 + 0x501C0200, // 001E LDBOOL R7 1 0 + 0x90021807, // 001F SETMBR R0 K12 R7 + 0x8C1C010D, // 0020 GETMET R7 R0 K13 + 0x7C1C0200, // 0021 CALL R7 1 + 0x8C1C010E, // 0022 GETMET R7 R0 K14 + 0x7C1C0200, // 0023 CALL R7 1 + 0x581C000F, // 0024 LDCONST R7 K15 + 0x6020000C, // 0025 GETGBL R8 G12 + 0x88240110, // 0026 GETMBR R9 R0 K16 + 0x7C200200, // 0027 CALL R8 1 + 0x14200E08, // 0028 LT R8 R7 R8 + 0x7822000F, // 0029 JMPF R8 #003A + 0x88200110, // 002A GETMBR R8 R0 K16 + 0x94201007, // 002B GETIDX R8 R8 R7 + 0x8C201111, // 002C GETMET R8 R8 K17 0x7C200200, // 002D CALL R8 1 - 0x70020002, // 002E JMP #0032 - 0x70020000, // 002F JMP #0031 - 0x001C0F0F, // 0030 ADD R7 R7 K15 - 0x7001FFEA, // 0031 JMP #001D - 0x8C200110, // 0032 GETMET R8 R0 K16 - 0x7C200200, // 0033 CALL R8 1 - 0x80000000, // 0034 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: _trigger_read_sensors -********************************************************************/ -be_local_closure(Matter_Device__trigger_read_sensors, /* name */ - be_nested_proto( - 8, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[11]) { /* constants */ - /* K0 */ be_nested_str_weak(json), - /* K1 */ be_nested_str_weak(tasmota), - /* K2 */ be_nested_str_weak(read_sensors), - /* K3 */ be_nested_str_weak(load), - /* K4 */ be_const_int(0), - /* K5 */ be_nested_str_weak(plugins), - /* K6 */ be_nested_str_weak(parse_sensors), - /* K7 */ be_const_int(1), - /* K8 */ be_nested_str_weak(log), - /* K9 */ be_nested_str_weak(MTR_X3A_X20unable_X20to_X20parse_X20read_sensors_X3A_X20), - /* K10 */ be_const_int(3), - }), - be_str_weak(_trigger_read_sensors), - &be_const_str_solidified, - ( &(const binstruction[37]) { /* code */ - 0xA4060000, // 0000 IMPORT R1 K0 - 0xB80A0200, // 0001 GETNGBL R2 K1 - 0x8C080502, // 0002 GETMET R2 R2 K2 - 0x7C080200, // 0003 CALL R2 1 - 0x4C0C0000, // 0004 LDNIL R3 - 0x1C0C0403, // 0005 EQ R3 R2 R3 - 0x780E0000, // 0006 JMPF R3 #0008 - 0x80000600, // 0007 RET 0 - 0x8C0C0303, // 0008 GETMET R3 R1 K3 - 0x5C140400, // 0009 MOVE R5 R2 - 0x7C0C0400, // 000A CALL R3 2 - 0x4C100000, // 000B LDNIL R4 - 0x20100604, // 000C NE R4 R3 R4 - 0x7812000D, // 000D JMPF R4 #001C - 0x58100004, // 000E LDCONST R4 K4 - 0x6014000C, // 000F GETGBL R5 G12 - 0x88180105, // 0010 GETMBR R6 R0 K5 - 0x7C140200, // 0011 CALL R5 1 - 0x14140805, // 0012 LT R5 R4 R5 - 0x78160006, // 0013 JMPF R5 #001B - 0x88140105, // 0014 GETMBR R5 R0 K5 - 0x94140A04, // 0015 GETIDX R5 R5 R4 - 0x8C140B06, // 0016 GETMET R5 R5 K6 - 0x5C1C0600, // 0017 MOVE R7 R3 - 0x7C140400, // 0018 CALL R5 2 - 0x00100907, // 0019 ADD R4 R4 K7 - 0x7001FFF3, // 001A JMP #000F - 0x70020007, // 001B JMP #0024 - 0xB8120200, // 001C GETNGBL R4 K1 - 0x8C100908, // 001D GETMET R4 R4 K8 - 0x60180008, // 001E GETGBL R6 G8 - 0x5C1C0400, // 001F MOVE R7 R2 - 0x7C180200, // 0020 CALL R6 1 - 0x001A1206, // 0021 ADD R6 K9 R6 - 0x581C000A, // 0022 LDCONST R7 K10 - 0x7C100600, // 0023 CALL R4 3 - 0x80000000, // 0024 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: save_param -********************************************************************/ -be_local_closure(Matter_Device_save_param, /* name */ - be_nested_proto( - 11, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[27]) { /* constants */ - /* K0 */ be_nested_str_weak(string), - /* K1 */ be_nested_str_weak(json), - /* K2 */ be_nested_str_weak(format), - /* K3 */ be_nested_str_weak(_X7B_X22distinguish_X22_X3A_X25i_X2C_X22passcode_X22_X3A_X25i_X2C_X22ipv4only_X22_X3A_X25s_X2C_X22nextep_X22_X3A_X25i), - /* K4 */ be_nested_str_weak(root_discriminator), - /* K5 */ be_nested_str_weak(root_passcode), - /* K6 */ be_nested_str_weak(ipv4only), - /* K7 */ be_nested_str_weak(true), - /* K8 */ be_nested_str_weak(false), - /* K9 */ be_nested_str_weak(next_ep), - /* K10 */ be_nested_str_weak(plugins_persist), - /* K11 */ be_nested_str_weak(_X2C_X22config_X22_X3A), - /* K12 */ be_nested_str_weak(dump), - /* K13 */ be_nested_str_weak(plugins_config), - /* K14 */ be_nested_str_weak(_X7D), - /* K15 */ be_nested_str_weak(FILENAME), - /* K16 */ be_nested_str_weak(w), - /* K17 */ be_nested_str_weak(write), - /* K18 */ be_nested_str_weak(close), - /* K19 */ be_nested_str_weak(tasmota), - /* K20 */ be_nested_str_weak(log), - /* K21 */ be_nested_str_weak(MTR_X3A_X20_X3DSaved_X20_X20_X20_X20_X20parameters_X25s), - /* K22 */ be_nested_str_weak(_X20and_X20configuration), - /* K23 */ be_nested_str_weak(), - /* K24 */ be_const_int(2), - /* K25 */ be_nested_str_weak(MTR_X3A_X20Session_Store_X3A_X3Asave_X20Exception_X3A), - /* K26 */ be_nested_str_weak(_X7C), - }), - be_str_weak(save_param), - &be_const_str_solidified, - ( &(const binstruction[66]) { /* code */ - 0xA4060000, // 0000 IMPORT R1 K0 - 0xA40A0200, // 0001 IMPORT R2 K1 - 0x8C0C0302, // 0002 GETMET R3 R1 K2 - 0x58140003, // 0003 LDCONST R5 K3 - 0x88180104, // 0004 GETMBR R6 R0 K4 - 0x881C0105, // 0005 GETMBR R7 R0 K5 - 0x88200106, // 0006 GETMBR R8 R0 K6 - 0x78220001, // 0007 JMPF R8 #000A - 0x58200007, // 0008 LDCONST R8 K7 - 0x70020000, // 0009 JMP #000B - 0x58200008, // 000A LDCONST R8 K8 - 0x88240109, // 000B GETMBR R9 R0 K9 - 0x7C0C0C00, // 000C CALL R3 6 - 0x8810010A, // 000D GETMBR R4 R0 K10 - 0x78120004, // 000E JMPF R4 #0014 - 0x000C070B, // 000F ADD R3 R3 K11 - 0x8C10050C, // 0010 GETMET R4 R2 K12 - 0x8818010D, // 0011 GETMBR R6 R0 K13 - 0x7C100400, // 0012 CALL R4 2 - 0x000C0604, // 0013 ADD R3 R3 R4 - 0x000C070E, // 0014 ADD R3 R3 K14 - 0xA8020018, // 0015 EXBLK 0 #002F - 0x60100011, // 0016 GETGBL R4 G17 - 0x8814010F, // 0017 GETMBR R5 R0 K15 - 0x58180010, // 0018 LDCONST R6 K16 - 0x7C100400, // 0019 CALL R4 2 - 0x8C140911, // 001A GETMET R5 R4 K17 - 0x5C1C0600, // 001B MOVE R7 R3 - 0x7C140400, // 001C CALL R5 2 - 0x8C140912, // 001D GETMET R5 R4 K18 - 0x7C140200, // 001E CALL R5 1 - 0xB8162600, // 001F GETNGBL R5 K19 - 0x8C140B14, // 0020 GETMET R5 R5 K20 - 0x8C1C0302, // 0021 GETMET R7 R1 K2 - 0x58240015, // 0022 LDCONST R9 K21 - 0x8828010A, // 0023 GETMBR R10 R0 K10 - 0x782A0001, // 0024 JMPF R10 #0027 - 0x58280016, // 0025 LDCONST R10 K22 - 0x70020000, // 0026 JMP #0028 - 0x58280017, // 0027 LDCONST R10 K23 - 0x7C1C0600, // 0028 CALL R7 3 - 0x58200018, // 0029 LDCONST R8 K24 - 0x7C140600, // 002A CALL R5 3 - 0xA8040001, // 002B EXBLK 1 1 - 0x80040600, // 002C RET 1 R3 - 0xA8040001, // 002D EXBLK 1 1 - 0x70020011, // 002E JMP #0041 - 0xAC100002, // 002F CATCH R4 0 2 - 0x7002000E, // 0030 JMP #0040 - 0xB81A2600, // 0031 GETNGBL R6 K19 - 0x8C180D14, // 0032 GETMET R6 R6 K20 - 0x60200008, // 0033 GETGBL R8 G8 - 0x5C240800, // 0034 MOVE R9 R4 + 0x1C200208, // 002E EQ R8 R1 R8 + 0x78220007, // 002F JMPF R8 #0038 + 0x88200110, // 0030 GETMBR R8 R0 K16 + 0x8C20110B, // 0031 GETMET R8 R8 K11 + 0x5C280E00, // 0032 MOVE R10 R7 + 0x7C200400, // 0033 CALL R8 2 + 0x8C20010E, // 0034 GETMET R8 R0 K14 0x7C200200, // 0035 CALL R8 1 - 0x00223208, // 0036 ADD R8 K25 R8 - 0x0020111A, // 0037 ADD R8 R8 K26 - 0x60240008, // 0038 GETGBL R9 G8 - 0x5C280A00, // 0039 MOVE R10 R5 - 0x7C240200, // 003A CALL R9 1 - 0x00201009, // 003B ADD R8 R8 R9 - 0x58240018, // 003C LDCONST R9 K24 - 0x7C180600, // 003D CALL R6 3 - 0x80040600, // 003E RET 1 R3 - 0x70020000, // 003F JMP #0041 - 0xB0080000, // 0040 RAISE 2 R0 R0 - 0x80000000, // 0041 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: k2l_num -********************************************************************/ -be_local_closure(Matter_Device_k2l_num, /* name */ - be_nested_proto( - 9, /* nstack */ - 1, /* argc */ - 4, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 6]) { /* constants */ - /* K0 */ be_const_class(be_class_Matter_Device), - /* K1 */ be_nested_str_weak(keys), - /* K2 */ be_nested_str_weak(push), - /* K3 */ be_nested_str_weak(stop_iteration), - /* K4 */ be_const_int(1), - /* K5 */ be_const_int(0), - }), - be_str_weak(k2l_num), - &be_const_str_solidified, - ( &(const binstruction[52]) { /* code */ - 0x58040000, // 0000 LDCONST R1 K0 - 0x60080012, // 0001 GETGBL R2 G18 - 0x7C080000, // 0002 CALL R2 0 - 0x4C0C0000, // 0003 LDNIL R3 - 0x1C0C0003, // 0004 EQ R3 R0 R3 - 0x780E0000, // 0005 JMPF R3 #0007 - 0x80040400, // 0006 RET 1 R2 - 0x600C0010, // 0007 GETGBL R3 G16 - 0x8C100101, // 0008 GETMET R4 R0 K1 - 0x7C100200, // 0009 CALL R4 1 - 0x7C0C0200, // 000A CALL R3 1 - 0xA8020007, // 000B EXBLK 0 #0014 - 0x5C100600, // 000C MOVE R4 R3 - 0x7C100000, // 000D CALL R4 0 - 0x8C140502, // 000E GETMET R5 R2 K2 - 0x601C0009, // 000F GETGBL R7 G9 - 0x5C200800, // 0010 MOVE R8 R4 - 0x7C1C0200, // 0011 CALL R7 1 - 0x7C140400, // 0012 CALL R5 2 - 0x7001FFF7, // 0013 JMP #000C - 0x580C0003, // 0014 LDCONST R3 K3 - 0xAC0C0200, // 0015 CATCH R3 1 0 - 0xB0080000, // 0016 RAISE 2 R0 R0 - 0x600C0010, // 0017 GETGBL R3 G16 - 0x6010000C, // 0018 GETGBL R4 G12 - 0x5C140400, // 0019 MOVE R5 R2 - 0x7C100200, // 001A CALL R4 1 - 0x04100904, // 001B SUB R4 R4 K4 - 0x40120804, // 001C CONNECT R4 K4 R4 - 0x7C0C0200, // 001D CALL R3 1 - 0xA8020010, // 001E EXBLK 0 #0030 - 0x5C100600, // 001F MOVE R4 R3 - 0x7C100000, // 0020 CALL R4 0 - 0x94140404, // 0021 GETIDX R5 R2 R4 - 0x5C180800, // 0022 MOVE R6 R4 - 0x241C0D05, // 0023 GT R7 R6 K5 - 0x781E0008, // 0024 JMPF R7 #002E - 0x041C0D04, // 0025 SUB R7 R6 K4 - 0x941C0407, // 0026 GETIDX R7 R2 R7 - 0x241C0E05, // 0027 GT R7 R7 R5 - 0x781E0004, // 0028 JMPF R7 #002E - 0x041C0D04, // 0029 SUB R7 R6 K4 - 0x941C0407, // 002A GETIDX R7 R2 R7 - 0x98080C07, // 002B SETIDX R2 R6 R7 - 0x04180D04, // 002C SUB R6 R6 K4 - 0x7001FFF4, // 002D JMP #0023 - 0x98080C05, // 002E SETIDX R2 R6 R5 - 0x7001FFEE, // 002F JMP #001F - 0x580C0003, // 0030 LDCONST R3 K3 - 0xAC0C0200, // 0031 CATCH R3 1 0 - 0xB0080000, // 0032 RAISE 2 R0 R0 - 0x80040400, // 0033 RET 1 R2 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: compute_manual_pairing_code -********************************************************************/ -be_local_closure(Matter_Device_compute_manual_pairing_code, /* name */ - be_nested_proto( - 11, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 8]) { /* constants */ - /* K0 */ be_nested_str_weak(string), - /* K1 */ be_nested_str_weak(root_discriminator), - /* K2 */ be_nested_str_weak(root_passcode), - /* K3 */ be_nested_str_weak(format), - /* K4 */ be_nested_str_weak(_X251i_X2505i_X2504i), - /* K5 */ be_nested_str_weak(matter), - /* K6 */ be_nested_str_weak(Verhoeff), - /* K7 */ be_nested_str_weak(checksum), - }), - be_str_weak(compute_manual_pairing_code), - &be_const_str_solidified, - ( &(const binstruction[31]) { /* code */ - 0xA4060000, // 0000 IMPORT R1 K0 - 0x88080101, // 0001 GETMBR R2 R0 K1 - 0x540E0FFE, // 0002 LDINT R3 4095 - 0x2C080403, // 0003 AND R2 R2 R3 - 0x540E0009, // 0004 LDINT R3 10 - 0x3C080403, // 0005 SHR R2 R2 R3 - 0x880C0101, // 0006 GETMBR R3 R0 K1 - 0x541202FF, // 0007 LDINT R4 768 - 0x2C0C0604, // 0008 AND R3 R3 R4 - 0x54120005, // 0009 LDINT R4 6 - 0x380C0604, // 000A SHL R3 R3 R4 - 0x88100102, // 000B GETMBR R4 R0 K2 - 0x54163FFE, // 000C LDINT R5 16383 - 0x2C100805, // 000D AND R4 R4 R5 - 0x300C0604, // 000E OR R3 R3 R4 - 0x88100102, // 000F GETMBR R4 R0 K2 - 0x5416000D, // 0010 LDINT R5 14 - 0x3C100805, // 0011 SHR R4 R4 R5 - 0x8C140303, // 0012 GETMET R5 R1 K3 - 0x581C0004, // 0013 LDCONST R7 K4 - 0x5C200400, // 0014 MOVE R8 R2 - 0x5C240600, // 0015 MOVE R9 R3 - 0x5C280800, // 0016 MOVE R10 R4 - 0x7C140A00, // 0017 CALL R5 5 - 0xB81A0A00, // 0018 GETNGBL R6 K5 - 0x88180D06, // 0019 GETMBR R6 R6 K6 - 0x8C180D07, // 001A GETMET R6 R6 K7 - 0x5C200A00, // 001B MOVE R8 R5 - 0x7C180400, // 001C CALL R6 2 - 0x00140A06, // 001D ADD R5 R5 R6 - 0x80040A00, // 001E RET 1 R5 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: start_operational_discovery -********************************************************************/ -be_local_closure(Matter_Device_start_operational_discovery, /* name */ - be_nested_proto( - 8, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 7]) { /* constants */ - /* K0 */ be_nested_str_weak(crypto), - /* K1 */ be_nested_str_weak(mdns), - /* K2 */ be_nested_str_weak(string), - /* K3 */ be_nested_str_weak(stop_basic_commissioning), - /* K4 */ be_nested_str_weak(root_w0), - /* K5 */ be_nested_str_weak(root_L), - /* K6 */ be_nested_str_weak(mdns_announce_op_discovery), - }), - be_str_weak(start_operational_discovery), - &be_const_str_solidified, - ( &(const binstruction[13]) { /* code */ - 0xA40A0000, // 0000 IMPORT R2 K0 - 0xA40E0200, // 0001 IMPORT R3 K1 - 0xA4120400, // 0002 IMPORT R4 K2 - 0x8C140103, // 0003 GETMET R5 R0 K3 - 0x7C140200, // 0004 CALL R5 1 - 0x4C140000, // 0005 LDNIL R5 - 0x90020805, // 0006 SETMBR R0 K4 R5 - 0x4C140000, // 0007 LDNIL R5 - 0x90020A05, // 0008 SETMBR R0 K5 R5 - 0x8C140106, // 0009 GETMET R5 R0 K6 - 0x5C1C0200, // 000A MOVE R7 R1 - 0x7C140400, // 000B CALL R5 2 - 0x80000000, // 000C RET 0 + 0x70020002, // 0036 JMP #003A + 0x70020000, // 0037 JMP #0039 + 0x001C0F12, // 0038 ADD R7 R7 K18 + 0x7001FFEA, // 0039 JMP #0025 + 0x8C200113, // 003A GETMET R8 R0 K19 + 0x7C200200, // 003B CALL R8 1 + 0x80000000, // 003C RET 0 }) ) ); @@ -3964,99 +1251,254 @@ be_local_closure(Matter_Device_stop_basic_commissioning, /* name */ /******************************************************************** -** Solidified function: bridge_add_endpoint +** Solidified function: remove_fabric ********************************************************************/ -be_local_closure(Matter_Device_bridge_add_endpoint, /* name */ +be_local_closure(Matter_Device_remove_fabric, /* name */ + be_nested_proto( + 10, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[20]) { /* constants */ + /* K0 */ be_nested_str_weak(sessions), + /* K1 */ be_nested_str_weak(find_children_fabrics), + /* K2 */ be_nested_str_weak(get_fabric_index), + /* K3 */ be_nested_str_weak(find_fabric_by_index), + /* K4 */ be_nested_str_weak(tasmota), + /* K5 */ be_nested_str_weak(log), + /* K6 */ be_nested_str_weak(MTR_X3A_X20removing_X20fabric_X20), + /* K7 */ be_nested_str_weak(get_fabric_id), + /* K8 */ be_nested_str_weak(copy), + /* K9 */ be_nested_str_weak(reverse), + /* K10 */ be_nested_str_weak(tohex), + /* K11 */ be_const_int(2), + /* K12 */ be_nested_str_weak(message_handler), + /* K13 */ be_nested_str_weak(im), + /* K14 */ be_nested_str_weak(subs_shop), + /* K15 */ be_nested_str_weak(remove_by_fabric), + /* K16 */ be_nested_str_weak(mdns_remove_op_discovery), + /* K17 */ be_nested_str_weak(remove_fabric), + /* K18 */ be_nested_str_weak(stop_iteration), + /* K19 */ be_nested_str_weak(save_fabrics), + }), + be_str_weak(remove_fabric), + &be_const_str_solidified, + ( &(const binstruction[56]) { /* code */ + 0x88080100, // 0000 GETMBR R2 R0 K0 + 0x8C080501, // 0001 GETMET R2 R2 K1 + 0x8C100302, // 0002 GETMET R4 R1 K2 + 0x7C100200, // 0003 CALL R4 1 + 0x7C080400, // 0004 CALL R2 2 + 0x4C0C0000, // 0005 LDNIL R3 + 0x1C0C0403, // 0006 EQ R3 R2 R3 + 0x780E0000, // 0007 JMPF R3 #0009 + 0x80000600, // 0008 RET 0 + 0x600C0010, // 0009 GETGBL R3 G16 + 0x5C100400, // 000A MOVE R4 R2 + 0x7C0C0200, // 000B CALL R3 1 + 0xA8020023, // 000C EXBLK 0 #0031 + 0x5C100600, // 000D MOVE R4 R3 + 0x7C100000, // 000E CALL R4 0 + 0x88140100, // 000F GETMBR R5 R0 K0 + 0x8C140B03, // 0010 GETMET R5 R5 K3 + 0x5C1C0800, // 0011 MOVE R7 R4 + 0x7C140400, // 0012 CALL R5 2 + 0x4C180000, // 0013 LDNIL R6 + 0x20180A06, // 0014 NE R6 R5 R6 + 0x781A0019, // 0015 JMPF R6 #0030 + 0xB81A0800, // 0016 GETNGBL R6 K4 + 0x8C180D05, // 0017 GETMET R6 R6 K5 + 0x8C200B07, // 0018 GETMET R8 R5 K7 + 0x7C200200, // 0019 CALL R8 1 + 0x8C201108, // 001A GETMET R8 R8 K8 + 0x7C200200, // 001B CALL R8 1 + 0x8C201109, // 001C GETMET R8 R8 K9 + 0x7C200200, // 001D CALL R8 1 + 0x8C20110A, // 001E GETMET R8 R8 K10 + 0x7C200200, // 001F CALL R8 1 + 0x00220C08, // 0020 ADD R8 K6 R8 + 0x5824000B, // 0021 LDCONST R9 K11 + 0x7C180600, // 0022 CALL R6 3 + 0x8818010C, // 0023 GETMBR R6 R0 K12 + 0x88180D0D, // 0024 GETMBR R6 R6 K13 + 0x88180D0E, // 0025 GETMBR R6 R6 K14 + 0x8C180D0F, // 0026 GETMET R6 R6 K15 + 0x5C200A00, // 0027 MOVE R8 R5 + 0x7C180400, // 0028 CALL R6 2 + 0x8C180110, // 0029 GETMET R6 R0 K16 + 0x5C200A00, // 002A MOVE R8 R5 + 0x7C180400, // 002B CALL R6 2 + 0x88180100, // 002C GETMBR R6 R0 K0 + 0x8C180D11, // 002D GETMET R6 R6 K17 + 0x5C200A00, // 002E MOVE R8 R5 + 0x7C180400, // 002F CALL R6 2 + 0x7001FFDB, // 0030 JMP #000D + 0x580C0012, // 0031 LDCONST R3 K18 + 0xAC0C0200, // 0032 CATCH R3 1 0 + 0xB0080000, // 0033 RAISE 2 R0 R0 + 0x880C0100, // 0034 GETMBR R3 R0 K0 + 0x8C0C0713, // 0035 GETMET R3 R3 K19 + 0x7C0C0200, // 0036 CALL R3 1 + 0x80000000, // 0037 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: save_param +********************************************************************/ +be_local_closure(Matter_Device_save_param, /* name */ be_nested_proto( 11, /* nstack */ - 3, /* argc */ + 1, /* argc */ 2, /* varg */ 0, /* has upvals */ NULL, /* no upvals */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[18]) { /* constants */ + ( &(const bvalue[28]) { /* constants */ + /* K0 */ be_nested_str_weak(string), + /* K1 */ be_nested_str_weak(json), + /* K2 */ be_nested_str_weak(format), + /* K3 */ be_nested_str_weak(_X7B_X22distinguish_X22_X3A_X25i_X2C_X22passcode_X22_X3A_X25i_X2C_X22ipv4only_X22_X3A_X25s_X2C_X22nextep_X22_X3A_X25i), + /* K4 */ be_nested_str_weak(root_discriminator), + /* K5 */ be_nested_str_weak(root_passcode), + /* K6 */ be_nested_str_weak(ipv4only), + /* K7 */ be_nested_str_weak(true), + /* K8 */ be_nested_str_weak(false), + /* K9 */ be_nested_str_weak(next_ep), + /* K10 */ be_nested_str_weak(plugins_persist), + /* K11 */ be_nested_str_weak(_X2C_X22config_X22_X3A), + /* K12 */ be_nested_str_weak(dump), + /* K13 */ be_nested_str_weak(plugins_config), + /* K14 */ be_nested_str_weak(_X7D), + /* K15 */ be_nested_str_weak(FILENAME), + /* K16 */ be_nested_str_weak(w), + /* K17 */ be_nested_str_weak(write), + /* K18 */ be_nested_str_weak(close), + /* K19 */ be_nested_str_weak(tasmota), + /* K20 */ be_nested_str_weak(log), + /* K21 */ be_nested_str_weak(MTR_X3A_X20_X3DSaved_X20_X20_X20_X20_X20parameters_X25s), + /* K22 */ be_nested_str_weak(_X20and_X20configuration), + /* K23 */ be_nested_str_weak(), + /* K24 */ be_const_int(3), + /* K25 */ be_nested_str_weak(MTR_X3A_X20Session_Store_X3A_X3Asave_X20Exception_X3A), + /* K26 */ be_nested_str_weak(_X7C), + /* K27 */ be_const_int(2), + }), + be_str_weak(save_param), + &be_const_str_solidified, + ( &(const binstruction[66]) { /* code */ + 0xA4060000, // 0000 IMPORT R1 K0 + 0xA40A0200, // 0001 IMPORT R2 K1 + 0x8C0C0302, // 0002 GETMET R3 R1 K2 + 0x58140003, // 0003 LDCONST R5 K3 + 0x88180104, // 0004 GETMBR R6 R0 K4 + 0x881C0105, // 0005 GETMBR R7 R0 K5 + 0x88200106, // 0006 GETMBR R8 R0 K6 + 0x78220001, // 0007 JMPF R8 #000A + 0x58200007, // 0008 LDCONST R8 K7 + 0x70020000, // 0009 JMP #000B + 0x58200008, // 000A LDCONST R8 K8 + 0x88240109, // 000B GETMBR R9 R0 K9 + 0x7C0C0C00, // 000C CALL R3 6 + 0x8810010A, // 000D GETMBR R4 R0 K10 + 0x78120004, // 000E JMPF R4 #0014 + 0x000C070B, // 000F ADD R3 R3 K11 + 0x8C10050C, // 0010 GETMET R4 R2 K12 + 0x8818010D, // 0011 GETMBR R6 R0 K13 + 0x7C100400, // 0012 CALL R4 2 + 0x000C0604, // 0013 ADD R3 R3 R4 + 0x000C070E, // 0014 ADD R3 R3 K14 + 0xA8020018, // 0015 EXBLK 0 #002F + 0x60100011, // 0016 GETGBL R4 G17 + 0x8814010F, // 0017 GETMBR R5 R0 K15 + 0x58180010, // 0018 LDCONST R6 K16 + 0x7C100400, // 0019 CALL R4 2 + 0x8C140911, // 001A GETMET R5 R4 K17 + 0x5C1C0600, // 001B MOVE R7 R3 + 0x7C140400, // 001C CALL R5 2 + 0x8C140912, // 001D GETMET R5 R4 K18 + 0x7C140200, // 001E CALL R5 1 + 0xB8162600, // 001F GETNGBL R5 K19 + 0x8C140B14, // 0020 GETMET R5 R5 K20 + 0x8C1C0302, // 0021 GETMET R7 R1 K2 + 0x58240015, // 0022 LDCONST R9 K21 + 0x8828010A, // 0023 GETMBR R10 R0 K10 + 0x782A0001, // 0024 JMPF R10 #0027 + 0x58280016, // 0025 LDCONST R10 K22 + 0x70020000, // 0026 JMP #0028 + 0x58280017, // 0027 LDCONST R10 K23 + 0x7C1C0600, // 0028 CALL R7 3 + 0x58200018, // 0029 LDCONST R8 K24 + 0x7C140600, // 002A CALL R5 3 + 0xA8040001, // 002B EXBLK 1 1 + 0x80040600, // 002C RET 1 R3 + 0xA8040001, // 002D EXBLK 1 1 + 0x70020011, // 002E JMP #0041 + 0xAC100002, // 002F CATCH R4 0 2 + 0x7002000E, // 0030 JMP #0040 + 0xB81A2600, // 0031 GETNGBL R6 K19 + 0x8C180D14, // 0032 GETMET R6 R6 K20 + 0x60200008, // 0033 GETGBL R8 G8 + 0x5C240800, // 0034 MOVE R9 R4 + 0x7C200200, // 0035 CALL R8 1 + 0x00223208, // 0036 ADD R8 K25 R8 + 0x0020111A, // 0037 ADD R8 R8 K26 + 0x60240008, // 0038 GETGBL R9 G8 + 0x5C280A00, // 0039 MOVE R10 R5 + 0x7C240200, // 003A CALL R9 1 + 0x00201009, // 003B ADD R8 R8 R9 + 0x5824001B, // 003C LDCONST R9 K27 + 0x7C180600, // 003D CALL R6 3 + 0x80040600, // 003E RET 1 R3 + 0x70020000, // 003F JMP #0041 + 0xB0080000, // 0040 RAISE 2 R0 R0 + 0x80000000, // 0041 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: get_plugin_class_arg +********************************************************************/ +be_local_closure(Matter_Device_get_plugin_class_arg, /* name */ + be_nested_proto( + 5, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 4]) { /* constants */ /* K0 */ be_nested_str_weak(plugins_classes), /* K1 */ be_nested_str_weak(find), - /* K2 */ be_nested_str_weak(tasmota), - /* K3 */ be_nested_str_weak(log), - /* K4 */ be_nested_str_weak(MTR_X3A_X20unknown_X20class_X20name_X20_X27), - /* K5 */ be_nested_str_weak(_X27_X20skipping), - /* K6 */ be_const_int(2), - /* K7 */ be_nested_str_weak(next_ep), - /* K8 */ be_nested_str_weak(plugins), - /* K9 */ be_nested_str_weak(push), - /* K10 */ be_nested_str_weak(type), - /* K11 */ be_nested_str_weak(keys), - /* K12 */ be_nested_str_weak(stop_iteration), - /* K13 */ be_nested_str_weak(plugins_config), - /* K14 */ be_nested_str_weak(plugins_persist), - /* K15 */ be_const_int(1), - /* K16 */ be_nested_str_weak(save_param), - /* K17 */ be_nested_str_weak(signal_endpoints_changed), + /* K2 */ be_nested_str_weak(ARG), + /* K3 */ be_nested_str_weak(), }), - be_str_weak(bridge_add_endpoint), + be_str_weak(get_plugin_class_arg), &be_const_str_solidified, - ( &(const binstruction[58]) { /* code */ - 0x880C0100, // 0000 GETMBR R3 R0 K0 - 0x8C0C0701, // 0001 GETMET R3 R3 K1 - 0x5C140200, // 0002 MOVE R5 R1 - 0x7C0C0400, // 0003 CALL R3 2 - 0x4C100000, // 0004 LDNIL R4 - 0x1C100604, // 0005 EQ R4 R3 R4 - 0x78120009, // 0006 JMPF R4 #0011 - 0xB8120400, // 0007 GETNGBL R4 K2 - 0x8C100903, // 0008 GETMET R4 R4 K3 - 0x60180008, // 0009 GETGBL R6 G8 - 0x5C1C0200, // 000A MOVE R7 R1 - 0x7C180200, // 000B CALL R6 1 - 0x001A0806, // 000C ADD R6 K4 R6 - 0x00180D05, // 000D ADD R6 R6 K5 - 0x581C0006, // 000E LDCONST R7 K6 - 0x7C100600, // 000F CALL R4 3 - 0x80000800, // 0010 RET 0 - 0x88100107, // 0011 GETMBR R4 R0 K7 - 0x60140008, // 0012 GETGBL R5 G8 - 0x5C180800, // 0013 MOVE R6 R4 - 0x7C140200, // 0014 CALL R5 1 - 0x5C180600, // 0015 MOVE R6 R3 - 0x5C1C0000, // 0016 MOVE R7 R0 - 0x5C200800, // 0017 MOVE R8 R4 - 0x5C240400, // 0018 MOVE R9 R2 - 0x7C180600, // 0019 CALL R6 3 - 0x881C0108, // 001A GETMBR R7 R0 K8 - 0x8C1C0F09, // 001B GETMET R7 R7 K9 - 0x5C240C00, // 001C MOVE R9 R6 - 0x7C1C0400, // 001D CALL R7 2 - 0x601C0013, // 001E GETGBL R7 G19 - 0x7C1C0000, // 001F CALL R7 0 - 0x981E1401, // 0020 SETIDX R7 K10 R1 - 0x60200010, // 0021 GETGBL R8 G16 - 0x8C24050B, // 0022 GETMET R9 R2 K11 - 0x7C240200, // 0023 CALL R9 1 - 0x7C200200, // 0024 CALL R8 1 - 0xA8020004, // 0025 EXBLK 0 #002B - 0x5C241000, // 0026 MOVE R9 R8 - 0x7C240000, // 0027 CALL R9 0 - 0x94280409, // 0028 GETIDX R10 R2 R9 - 0x981C120A, // 0029 SETIDX R7 R9 R10 - 0x7001FFFA, // 002A JMP #0026 - 0x5820000C, // 002B LDCONST R8 K12 - 0xAC200200, // 002C CATCH R8 1 0 - 0xB0080000, // 002D RAISE 2 R0 R0 - 0x8820010D, // 002E GETMBR R8 R0 K13 - 0x98200A07, // 002F SETIDX R8 R5 R7 - 0x50200200, // 0030 LDBOOL R8 1 0 - 0x90021C08, // 0031 SETMBR R0 K14 R8 - 0x88200107, // 0032 GETMBR R8 R0 K7 - 0x0020110F, // 0033 ADD R8 R8 K15 - 0x90020E08, // 0034 SETMBR R0 K7 R8 - 0x8C200110, // 0035 GETMET R8 R0 K16 - 0x7C200200, // 0036 CALL R8 1 - 0x8C200111, // 0037 GETMET R8 R0 K17 - 0x7C200200, // 0038 CALL R8 1 - 0x80040800, // 0039 RET 1 R4 + ( &(const binstruction[ 9]) { /* code */ + 0x88080100, // 0000 GETMBR R2 R0 K0 + 0x8C080501, // 0001 GETMET R2 R2 K1 + 0x5C100200, // 0002 MOVE R4 R1 + 0x7C080400, // 0003 CALL R2 2 + 0x780A0001, // 0004 JMPF R2 #0007 + 0x880C0502, // 0005 GETMBR R3 R2 K2 + 0x70020000, // 0006 JMP #0008 + 0x580C0003, // 0007 LDCONST R3 K3 + 0x80040600, // 0008 RET 1 R3 }) ) ); @@ -4064,280 +1506,9 @@ be_local_closure(Matter_Device_bridge_add_endpoint, /* name */ /******************************************************************** -** Solidified function: mdns_announce_op_discovery +** Solidified function: mdns_remove_PASE ********************************************************************/ -be_local_closure(Matter_Device_mdns_announce_op_discovery, /* name */ - be_nested_proto( - 15, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[29]) { /* constants */ - /* K0 */ be_nested_str_weak(mdns), - /* K1 */ be_nested_str_weak(string), - /* K2 */ be_nested_str_weak(get_device_id), - /* K3 */ be_nested_str_weak(copy), - /* K4 */ be_nested_str_weak(reverse), - /* K5 */ be_nested_str_weak(get_fabric_compressed), - /* K6 */ be_nested_str_weak(tohex), - /* K7 */ be_nested_str_weak(_X2D), - /* K8 */ be_nested_str_weak(tasmota), - /* K9 */ be_nested_str_weak(log), - /* K10 */ be_nested_str_weak(MTR_X3A_X20Operational_X20Discovery_X20node_X20_X3D_X20), - /* K11 */ be_const_int(2), - /* K12 */ be_nested_str_weak(eth), - /* K13 */ be_nested_str_weak(find), - /* K14 */ be_nested_str_weak(up), - /* K15 */ be_nested_str_weak(format), - /* K16 */ be_nested_str_weak(MTR_X3A_X20adding_X20mDNS_X20on_X20_X25s_X20_X27_X25s_X27_X20ptr_X20to_X20_X60_X25s_X2Elocal_X60), - /* K17 */ be_nested_str_weak(hostname_eth), - /* K18 */ be_const_int(3), - /* K19 */ be_nested_str_weak(add_service), - /* K20 */ be_nested_str_weak(_matter), - /* K21 */ be_nested_str_weak(_tcp), - /* K22 */ be_nested_str_weak(_I), - /* K23 */ be_nested_str_weak(MTR_X3A_X20adding_X20subtype_X3A_X20), - /* K24 */ be_nested_str_weak(add_subtype), - /* K25 */ be_nested_str_weak(wifi), - /* K26 */ be_nested_str_weak(hostname_wifi), - /* K27 */ be_nested_str_weak(MTR_X3A_X20Exception), - /* K28 */ be_nested_str_weak(_X7C), - }), - be_str_weak(mdns_announce_op_discovery), - &be_const_str_solidified, - ( &(const binstruction[122]) { /* code */ - 0xA40A0000, // 0000 IMPORT R2 K0 - 0xA40E0200, // 0001 IMPORT R3 K1 - 0xA8020064, // 0002 EXBLK 0 #0068 - 0x8C100302, // 0003 GETMET R4 R1 K2 - 0x7C100200, // 0004 CALL R4 1 - 0x8C100903, // 0005 GETMET R4 R4 K3 - 0x7C100200, // 0006 CALL R4 1 - 0x8C100904, // 0007 GETMET R4 R4 K4 - 0x7C100200, // 0008 CALL R4 1 - 0x8C140305, // 0009 GETMET R5 R1 K5 - 0x7C140200, // 000A CALL R5 1 - 0x8C180B06, // 000B GETMET R6 R5 K6 - 0x7C180200, // 000C CALL R6 1 - 0x00180D07, // 000D ADD R6 R6 K7 - 0x8C1C0906, // 000E GETMET R7 R4 K6 - 0x7C1C0200, // 000F CALL R7 1 - 0x00180C07, // 0010 ADD R6 R6 R7 - 0xB81E1000, // 0011 GETNGBL R7 K8 - 0x8C1C0F09, // 0012 GETMET R7 R7 K9 - 0x00261406, // 0013 ADD R9 K10 R6 - 0x5828000B, // 0014 LDCONST R10 K11 - 0x7C1C0600, // 0015 CALL R7 3 - 0xB81E1000, // 0016 GETNGBL R7 K8 - 0x8C1C0F0C, // 0017 GETMET R7 R7 K12 - 0x7C1C0200, // 0018 CALL R7 1 - 0x8C1C0F0D, // 0019 GETMET R7 R7 K13 - 0x5824000E, // 001A LDCONST R9 K14 - 0x7C1C0400, // 001B CALL R7 2 - 0x781E0020, // 001C JMPF R7 #003E - 0xB81E1000, // 001D GETNGBL R7 K8 - 0x8C1C0F09, // 001E GETMET R7 R7 K9 - 0x8C24070F, // 001F GETMET R9 R3 K15 - 0x582C0010, // 0020 LDCONST R11 K16 - 0x5830000C, // 0021 LDCONST R12 K12 - 0x5C340C00, // 0022 MOVE R13 R6 - 0x88380111, // 0023 GETMBR R14 R0 K17 - 0x7C240A00, // 0024 CALL R9 5 - 0x58280012, // 0025 LDCONST R10 K18 - 0x7C1C0600, // 0026 CALL R7 3 - 0x8C1C0513, // 0027 GETMET R7 R2 K19 - 0x58240014, // 0028 LDCONST R9 K20 - 0x58280015, // 0029 LDCONST R10 K21 - 0x542E15A3, // 002A LDINT R11 5540 - 0x4C300000, // 002B LDNIL R12 - 0x5C340C00, // 002C MOVE R13 R6 - 0x88380111, // 002D GETMBR R14 R0 K17 - 0x7C1C0E00, // 002E CALL R7 7 - 0x8C1C0B06, // 002F GETMET R7 R5 K6 - 0x7C1C0200, // 0030 CALL R7 1 - 0x001E2C07, // 0031 ADD R7 K22 R7 - 0xB8221000, // 0032 GETNGBL R8 K8 - 0x8C201109, // 0033 GETMET R8 R8 K9 - 0x002A2E07, // 0034 ADD R10 K23 R7 - 0x582C0012, // 0035 LDCONST R11 K18 - 0x7C200600, // 0036 CALL R8 3 - 0x8C200518, // 0037 GETMET R8 R2 K24 - 0x58280014, // 0038 LDCONST R10 K20 - 0x582C0015, // 0039 LDCONST R11 K21 - 0x5C300C00, // 003A MOVE R12 R6 - 0x88340111, // 003B GETMBR R13 R0 K17 - 0x5C380E00, // 003C MOVE R14 R7 - 0x7C200C00, // 003D CALL R8 6 - 0xB81E1000, // 003E GETNGBL R7 K8 - 0x8C1C0F19, // 003F GETMET R7 R7 K25 - 0x7C1C0200, // 0040 CALL R7 1 - 0x8C1C0F0D, // 0041 GETMET R7 R7 K13 - 0x5824000E, // 0042 LDCONST R9 K14 - 0x7C1C0400, // 0043 CALL R7 2 - 0x781E0020, // 0044 JMPF R7 #0066 - 0xB81E1000, // 0045 GETNGBL R7 K8 - 0x8C1C0F09, // 0046 GETMET R7 R7 K9 - 0x8C24070F, // 0047 GETMET R9 R3 K15 - 0x582C0010, // 0048 LDCONST R11 K16 - 0x58300019, // 0049 LDCONST R12 K25 - 0x5C340C00, // 004A MOVE R13 R6 - 0x8838011A, // 004B GETMBR R14 R0 K26 - 0x7C240A00, // 004C CALL R9 5 - 0x58280012, // 004D LDCONST R10 K18 - 0x7C1C0600, // 004E CALL R7 3 - 0x8C1C0513, // 004F GETMET R7 R2 K19 - 0x58240014, // 0050 LDCONST R9 K20 - 0x58280015, // 0051 LDCONST R10 K21 - 0x542E15A3, // 0052 LDINT R11 5540 - 0x4C300000, // 0053 LDNIL R12 - 0x5C340C00, // 0054 MOVE R13 R6 - 0x8838011A, // 0055 GETMBR R14 R0 K26 - 0x7C1C0E00, // 0056 CALL R7 7 - 0x8C1C0B06, // 0057 GETMET R7 R5 K6 - 0x7C1C0200, // 0058 CALL R7 1 - 0x001E2C07, // 0059 ADD R7 K22 R7 - 0xB8221000, // 005A GETNGBL R8 K8 - 0x8C201109, // 005B GETMET R8 R8 K9 - 0x002A2E07, // 005C ADD R10 K23 R7 - 0x582C0012, // 005D LDCONST R11 K18 - 0x7C200600, // 005E CALL R8 3 - 0x8C200518, // 005F GETMET R8 R2 K24 - 0x58280014, // 0060 LDCONST R10 K20 - 0x582C0015, // 0061 LDCONST R11 K21 - 0x5C300C00, // 0062 MOVE R12 R6 - 0x8834011A, // 0063 GETMBR R13 R0 K26 - 0x5C380E00, // 0064 MOVE R14 R7 - 0x7C200C00, // 0065 CALL R8 6 - 0xA8040001, // 0066 EXBLK 1 1 - 0x70020010, // 0067 JMP #0079 - 0xAC100002, // 0068 CATCH R4 0 2 - 0x7002000D, // 0069 JMP #0078 - 0xB81A1000, // 006A GETNGBL R6 K8 - 0x8C180D09, // 006B GETMET R6 R6 K9 - 0x60200008, // 006C GETGBL R8 G8 - 0x5C240800, // 006D MOVE R9 R4 - 0x7C200200, // 006E CALL R8 1 - 0x00223608, // 006F ADD R8 K27 R8 - 0x0020111C, // 0070 ADD R8 R8 K28 - 0x60240008, // 0071 GETGBL R9 G8 - 0x5C280A00, // 0072 MOVE R10 R5 - 0x7C240200, // 0073 CALL R9 1 - 0x00201009, // 0074 ADD R8 R8 R9 - 0x5824000B, // 0075 LDCONST R9 K11 - 0x7C180600, // 0076 CALL R6 3 - 0x70020000, // 0077 JMP #0079 - 0xB0080000, // 0078 RAISE 2 R0 R0 - 0x80000000, // 0079 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: start_root_basic_commissioning -********************************************************************/ -be_local_closure(Matter_Device_start_root_basic_commissioning, /* name */ - be_nested_proto( - 14, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[23]) { /* constants */ - /* K0 */ be_nested_str_weak(string), - /* K1 */ be_nested_str_weak(PASE_TIMEOUT), - /* K2 */ be_nested_str_weak(compute_manual_pairing_code), - /* K3 */ be_nested_str_weak(tasmota), - /* K4 */ be_nested_str_weak(log), - /* K5 */ be_nested_str_weak(format), - /* K6 */ be_nested_str_weak(MTR_X3A_X20Manual_X20pairing_X20code_X3A_X20_X25s_X2D_X25s_X2D_X25s), - /* K7 */ be_const_int(0), - /* K8 */ be_const_int(3), - /* K9 */ be_const_int(2147483647), - /* K10 */ be_const_int(2), - /* K11 */ be_nested_str_weak(compute_qrcode_content), - /* K12 */ be_nested_str_weak(publish_result), - /* K13 */ be_nested_str_weak(_X7B_X22Matter_X22_X3A_X7B_X22Commissioning_X22_X3A1_X2C_X22PairingCode_X22_X3A_X22_X25s_X22_X2C_X22QRCode_X22_X3A_X22_X25s_X22_X7D_X7D), - /* K14 */ be_nested_str_weak(Matter), - /* K15 */ be_nested_str_weak(_compute_pbkdf), - /* K16 */ be_nested_str_weak(root_passcode), - /* K17 */ be_nested_str_weak(root_iterations), - /* K18 */ be_nested_str_weak(root_salt), - /* K19 */ be_nested_str_weak(start_basic_commissioning), - /* K20 */ be_nested_str_weak(root_discriminator), - /* K21 */ be_nested_str_weak(root_w0), - /* K22 */ be_nested_str_weak(root_L), - }), - be_str_weak(start_root_basic_commissioning), - &be_const_str_solidified, - ( &(const binstruction[49]) { /* code */ - 0xA40A0000, // 0000 IMPORT R2 K0 - 0x4C0C0000, // 0001 LDNIL R3 - 0x1C0C0203, // 0002 EQ R3 R1 R3 - 0x780E0000, // 0003 JMPF R3 #0005 - 0x88040101, // 0004 GETMBR R1 R0 K1 - 0x8C0C0102, // 0005 GETMET R3 R0 K2 - 0x7C0C0200, // 0006 CALL R3 1 - 0xB8120600, // 0007 GETNGBL R4 K3 - 0x8C100904, // 0008 GETMET R4 R4 K4 - 0x8C180505, // 0009 GETMET R6 R2 K5 - 0x58200006, // 000A LDCONST R8 K6 - 0x40260F08, // 000B CONNECT R9 K7 K8 - 0x94240609, // 000C GETIDX R9 R3 R9 - 0x542A0003, // 000D LDINT R10 4 - 0x542E0005, // 000E LDINT R11 6 - 0x4028140B, // 000F CONNECT R10 R10 R11 - 0x9428060A, // 0010 GETIDX R10 R3 R10 - 0x542E0006, // 0011 LDINT R11 7 - 0x402C1709, // 0012 CONNECT R11 R11 K9 - 0x942C060B, // 0013 GETIDX R11 R3 R11 - 0x7C180A00, // 0014 CALL R6 5 - 0x581C000A, // 0015 LDCONST R7 K10 - 0x7C100600, // 0016 CALL R4 3 - 0x8C10010B, // 0017 GETMET R4 R0 K11 - 0x7C100200, // 0018 CALL R4 1 - 0xB8160600, // 0019 GETNGBL R5 K3 - 0x8C140B0C, // 001A GETMET R5 R5 K12 - 0x8C1C0505, // 001B GETMET R7 R2 K5 - 0x5824000D, // 001C LDCONST R9 K13 - 0x5C280600, // 001D MOVE R10 R3 - 0x5C2C0800, // 001E MOVE R11 R4 - 0x7C1C0800, // 001F CALL R7 4 - 0x5820000E, // 0020 LDCONST R8 K14 - 0x7C140600, // 0021 CALL R5 3 - 0x8C14010F, // 0022 GETMET R5 R0 K15 - 0x881C0110, // 0023 GETMBR R7 R0 K16 - 0x88200111, // 0024 GETMBR R8 R0 K17 - 0x88240112, // 0025 GETMBR R9 R0 K18 - 0x7C140800, // 0026 CALL R5 4 - 0x8C140113, // 0027 GETMET R5 R0 K19 - 0x5C1C0200, // 0028 MOVE R7 R1 - 0x88200111, // 0029 GETMBR R8 R0 K17 - 0x88240114, // 002A GETMBR R9 R0 K20 - 0x88280112, // 002B GETMBR R10 R0 K18 - 0x882C0115, // 002C GETMBR R11 R0 K21 - 0x88300116, // 002D GETMBR R12 R0 K22 - 0x4C340000, // 002E LDNIL R13 - 0x7C141000, // 002F CALL R5 8 - 0x80000000, // 0030 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: load_param -********************************************************************/ -be_local_closure(Matter_Device_load_param, /* name */ +be_local_closure(Matter_Device_mdns_remove_PASE, /* name */ be_nested_proto( 12, /* nstack */ 1, /* argc */ @@ -4347,148 +1518,116 @@ be_local_closure(Matter_Device_load_param, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[32]) { /* constants */ - /* K0 */ be_nested_str_weak(string), - /* K1 */ be_nested_str_weak(crypto), - /* K2 */ be_nested_str_weak(FILENAME), - /* K3 */ be_nested_str_weak(read), - /* K4 */ be_nested_str_weak(close), - /* K5 */ be_nested_str_weak(json), - /* K6 */ be_nested_str_weak(load), - /* K7 */ be_nested_str_weak(root_discriminator), - /* K8 */ be_nested_str_weak(find), - /* K9 */ be_nested_str_weak(distinguish), - /* K10 */ be_nested_str_weak(root_passcode), - /* K11 */ be_nested_str_weak(passcode), - /* K12 */ be_nested_str_weak(ipv4only), - /* K13 */ be_nested_str_weak(next_ep), - /* K14 */ be_nested_str_weak(nextep), - /* K15 */ be_nested_str_weak(plugins_config), - /* K16 */ be_nested_str_weak(config), - /* K17 */ be_nested_str_weak(tasmota), - /* K18 */ be_nested_str_weak(log), - /* K19 */ be_nested_str_weak(MTR_X3A_X20load_config_X20_X3D_X20), - /* K20 */ be_const_int(3), - /* K21 */ be_nested_str_weak(adjust_next_ep), - /* K22 */ be_nested_str_weak(plugins_persist), - /* K23 */ be_nested_str_weak(io_error), - /* K24 */ be_nested_str_weak(MTR_X3A_X20Session_Store_X3A_X3Aload_X20Exception_X3A), - /* K25 */ be_nested_str_weak(_X7C), - /* K26 */ be_const_int(2), - /* K27 */ be_nested_str_weak(random), - /* K28 */ be_nested_str_weak(get), - /* K29 */ be_const_int(0), - /* K30 */ be_nested_str_weak(generate_random_passcode), - /* K31 */ be_nested_str_weak(save_param), + ( &(const bvalue[22]) { /* constants */ + /* K0 */ be_nested_str_weak(mdns), + /* K1 */ be_nested_str_weak(string), + /* K2 */ be_nested_str_weak(mdns_pase_eth), + /* K3 */ be_nested_str_weak(tasmota), + /* K4 */ be_nested_str_weak(log), + /* K5 */ be_nested_str_weak(format), + /* K6 */ be_nested_str_weak(MTR_X3A_X20calling_X20mdns_X2Eremove_service_X28_X25s_X2C_X20_X25s_X2C_X20_X25s_X2C_X20_X25s_X29), + /* K7 */ be_nested_str_weak(_matterc), + /* K8 */ be_nested_str_weak(_udp), + /* K9 */ be_nested_str_weak(commissioning_instance_eth), + /* K10 */ be_nested_str_weak(hostname_eth), + /* K11 */ be_const_int(3), + /* K12 */ be_nested_str_weak(MTR_X3A_X20remove_X20mDNS_X20on_X20_X25s_X20_X27_X25s_X27), + /* K13 */ be_nested_str_weak(eth), + /* K14 */ be_nested_str_weak(remove_service), + /* K15 */ be_nested_str_weak(mdns_pase_wifi), + /* K16 */ be_nested_str_weak(commissioning_instance_wifi), + /* K17 */ be_nested_str_weak(hostname_wifi), + /* K18 */ be_nested_str_weak(wifi), + /* K19 */ be_nested_str_weak(MTR_X3A_X20Exception), + /* K20 */ be_nested_str_weak(_X7C), + /* K21 */ be_const_int(2), }), - be_str_weak(load_param), + be_str_weak(mdns_remove_PASE), &be_const_str_solidified, - ( &(const binstruction[105]) { /* code */ + ( &(const binstruction[83]) { /* code */ 0xA4060000, // 0000 IMPORT R1 K0 0xA40A0200, // 0001 IMPORT R2 K1 - 0xA8020036, // 0002 EXBLK 0 #003A - 0x600C0011, // 0003 GETGBL R3 G17 - 0x88100102, // 0004 GETMBR R4 R0 K2 - 0x7C0C0200, // 0005 CALL R3 1 - 0x8C100703, // 0006 GETMET R4 R3 K3 - 0x7C100200, // 0007 CALL R4 1 - 0x8C140704, // 0008 GETMET R5 R3 K4 - 0x7C140200, // 0009 CALL R5 1 - 0xA4160A00, // 000A IMPORT R5 K5 - 0x8C180B06, // 000B GETMET R6 R5 K6 - 0x5C200800, // 000C MOVE R8 R4 - 0x7C180400, // 000D CALL R6 2 - 0x8C1C0D08, // 000E GETMET R7 R6 K8 - 0x58240009, // 000F LDCONST R9 K9 - 0x88280107, // 0010 GETMBR R10 R0 K7 - 0x7C1C0600, // 0011 CALL R7 3 - 0x90020E07, // 0012 SETMBR R0 K7 R7 - 0x8C1C0D08, // 0013 GETMET R7 R6 K8 - 0x5824000B, // 0014 LDCONST R9 K11 - 0x8828010A, // 0015 GETMBR R10 R0 K10 - 0x7C1C0600, // 0016 CALL R7 3 - 0x90021407, // 0017 SETMBR R0 K10 R7 - 0x601C0017, // 0018 GETGBL R7 G23 - 0x8C200D08, // 0019 GETMET R8 R6 K8 - 0x5828000C, // 001A LDCONST R10 K12 - 0x502C0000, // 001B LDBOOL R11 0 0 - 0x7C200600, // 001C CALL R8 3 - 0x7C1C0200, // 001D CALL R7 1 - 0x90021807, // 001E SETMBR R0 K12 R7 - 0x8C1C0D08, // 001F GETMET R7 R6 K8 - 0x5824000E, // 0020 LDCONST R9 K14 - 0x8828010D, // 0021 GETMBR R10 R0 K13 - 0x7C1C0600, // 0022 CALL R7 3 - 0x90021A07, // 0023 SETMBR R0 K13 R7 - 0x8C1C0D08, // 0024 GETMET R7 R6 K8 - 0x58240010, // 0025 LDCONST R9 K16 - 0x7C1C0400, // 0026 CALL R7 2 - 0x90021E07, // 0027 SETMBR R0 K15 R7 - 0x881C010F, // 0028 GETMBR R7 R0 K15 - 0x4C200000, // 0029 LDNIL R8 - 0x201C0E08, // 002A NE R7 R7 R8 - 0x781E000B, // 002B JMPF R7 #0038 - 0xB81E2200, // 002C GETNGBL R7 K17 - 0x8C1C0F12, // 002D GETMET R7 R7 K18 - 0x60240008, // 002E GETGBL R9 G8 - 0x8828010F, // 002F GETMBR R10 R0 K15 - 0x7C240200, // 0030 CALL R9 1 - 0x00262609, // 0031 ADD R9 K19 R9 - 0x58280014, // 0032 LDCONST R10 K20 - 0x7C1C0600, // 0033 CALL R7 3 - 0x8C1C0115, // 0034 GETMET R7 R0 K21 - 0x7C1C0200, // 0035 CALL R7 1 - 0x501C0200, // 0036 LDBOOL R7 1 0 - 0x90022C07, // 0037 SETMBR R0 K22 R7 - 0xA8040001, // 0038 EXBLK 1 1 - 0x70020012, // 0039 JMP #004D - 0xAC0C0002, // 003A CATCH R3 0 2 - 0x7002000F, // 003B JMP #004C - 0x20140717, // 003C NE R5 R3 K23 - 0x7816000C, // 003D JMPF R5 #004B - 0xB8162200, // 003E GETNGBL R5 K17 - 0x8C140B12, // 003F GETMET R5 R5 K18 - 0x601C0008, // 0040 GETGBL R7 G8 - 0x5C200600, // 0041 MOVE R8 R3 - 0x7C1C0200, // 0042 CALL R7 1 - 0x001E3007, // 0043 ADD R7 K24 R7 - 0x001C0F19, // 0044 ADD R7 R7 K25 - 0x60200008, // 0045 GETGBL R8 G8 - 0x5C240800, // 0046 MOVE R9 R4 - 0x7C200200, // 0047 CALL R8 1 - 0x001C0E08, // 0048 ADD R7 R7 R8 - 0x5820001A, // 0049 LDCONST R8 K26 - 0x7C140600, // 004A CALL R5 3 - 0x70020000, // 004B JMP #004D - 0xB0080000, // 004C RAISE 2 R0 R0 - 0x500C0000, // 004D LDBOOL R3 0 0 - 0x88100107, // 004E GETMBR R4 R0 K7 - 0x4C140000, // 004F LDNIL R5 - 0x1C100805, // 0050 EQ R4 R4 R5 - 0x7812000A, // 0051 JMPF R4 #005D - 0x8C10051B, // 0052 GETMET R4 R2 K27 - 0x5818001A, // 0053 LDCONST R6 K26 - 0x7C100400, // 0054 CALL R4 2 - 0x8C10091C, // 0055 GETMET R4 R4 K28 - 0x5818001D, // 0056 LDCONST R6 K29 - 0x581C001A, // 0057 LDCONST R7 K26 - 0x7C100600, // 0058 CALL R4 3 - 0x54160FFE, // 0059 LDINT R5 4095 - 0x2C100805, // 005A AND R4 R4 R5 - 0x90020E04, // 005B SETMBR R0 K7 R4 - 0x500C0200, // 005C LDBOOL R3 1 0 - 0x8810010A, // 005D GETMBR R4 R0 K10 - 0x4C140000, // 005E LDNIL R5 - 0x1C100805, // 005F EQ R4 R4 R5 - 0x78120003, // 0060 JMPF R4 #0065 - 0x8C10011E, // 0061 GETMET R4 R0 K30 - 0x7C100200, // 0062 CALL R4 1 - 0x90021404, // 0063 SETMBR R0 K10 R4 - 0x500C0200, // 0064 LDBOOL R3 1 0 - 0x780E0001, // 0065 JMPF R3 #0068 - 0x8C10011F, // 0066 GETMET R4 R0 K31 - 0x7C100200, // 0067 CALL R4 1 - 0x80000000, // 0068 RET 0 + 0xA802003D, // 0002 EXBLK 0 #0041 + 0x880C0102, // 0003 GETMBR R3 R0 K2 + 0x780E001B, // 0004 JMPF R3 #0021 + 0xB80E0600, // 0005 GETNGBL R3 K3 + 0x8C0C0704, // 0006 GETMET R3 R3 K4 + 0x8C140505, // 0007 GETMET R5 R2 K5 + 0x581C0006, // 0008 LDCONST R7 K6 + 0x58200007, // 0009 LDCONST R8 K7 + 0x58240008, // 000A LDCONST R9 K8 + 0x88280109, // 000B GETMBR R10 R0 K9 + 0x882C010A, // 000C GETMBR R11 R0 K10 + 0x7C140C00, // 000D CALL R5 6 + 0x5818000B, // 000E LDCONST R6 K11 + 0x7C0C0600, // 000F CALL R3 3 + 0xB80E0600, // 0010 GETNGBL R3 K3 + 0x8C0C0704, // 0011 GETMET R3 R3 K4 + 0x8C140505, // 0012 GETMET R5 R2 K5 + 0x581C000C, // 0013 LDCONST R7 K12 + 0x5820000D, // 0014 LDCONST R8 K13 + 0x88240109, // 0015 GETMBR R9 R0 K9 + 0x7C140800, // 0016 CALL R5 4 + 0x5818000B, // 0017 LDCONST R6 K11 + 0x7C0C0600, // 0018 CALL R3 3 + 0x500C0000, // 0019 LDBOOL R3 0 0 + 0x90020403, // 001A SETMBR R0 K2 R3 + 0x8C0C030E, // 001B GETMET R3 R1 K14 + 0x58140007, // 001C LDCONST R5 K7 + 0x58180008, // 001D LDCONST R6 K8 + 0x881C0109, // 001E GETMBR R7 R0 K9 + 0x8820010A, // 001F GETMBR R8 R0 K10 + 0x7C0C0A00, // 0020 CALL R3 5 + 0x880C010F, // 0021 GETMBR R3 R0 K15 + 0x780E001B, // 0022 JMPF R3 #003F + 0xB80E0600, // 0023 GETNGBL R3 K3 + 0x8C0C0704, // 0024 GETMET R3 R3 K4 + 0x8C140505, // 0025 GETMET R5 R2 K5 + 0x581C0006, // 0026 LDCONST R7 K6 + 0x58200007, // 0027 LDCONST R8 K7 + 0x58240008, // 0028 LDCONST R9 K8 + 0x88280110, // 0029 GETMBR R10 R0 K16 + 0x882C0111, // 002A GETMBR R11 R0 K17 + 0x7C140C00, // 002B CALL R5 6 + 0x5818000B, // 002C LDCONST R6 K11 + 0x7C0C0600, // 002D CALL R3 3 + 0xB80E0600, // 002E GETNGBL R3 K3 + 0x8C0C0704, // 002F GETMET R3 R3 K4 + 0x8C140505, // 0030 GETMET R5 R2 K5 + 0x581C000C, // 0031 LDCONST R7 K12 + 0x58200012, // 0032 LDCONST R8 K18 + 0x88240110, // 0033 GETMBR R9 R0 K16 + 0x7C140800, // 0034 CALL R5 4 + 0x5818000B, // 0035 LDCONST R6 K11 + 0x7C0C0600, // 0036 CALL R3 3 + 0x500C0000, // 0037 LDBOOL R3 0 0 + 0x90021E03, // 0038 SETMBR R0 K15 R3 + 0x8C0C030E, // 0039 GETMET R3 R1 K14 + 0x58140007, // 003A LDCONST R5 K7 + 0x58180008, // 003B LDCONST R6 K8 + 0x881C0110, // 003C GETMBR R7 R0 K16 + 0x88200111, // 003D GETMBR R8 R0 K17 + 0x7C0C0A00, // 003E CALL R3 5 + 0xA8040001, // 003F EXBLK 1 1 + 0x70020010, // 0040 JMP #0052 + 0xAC0C0002, // 0041 CATCH R3 0 2 + 0x7002000D, // 0042 JMP #0051 + 0xB8160600, // 0043 GETNGBL R5 K3 + 0x8C140B04, // 0044 GETMET R5 R5 K4 + 0x601C0008, // 0045 GETGBL R7 G8 + 0x5C200600, // 0046 MOVE R8 R3 + 0x7C1C0200, // 0047 CALL R7 1 + 0x001E2607, // 0048 ADD R7 K19 R7 + 0x001C0F14, // 0049 ADD R7 R7 K20 + 0x60200008, // 004A GETGBL R8 G8 + 0x5C240800, // 004B MOVE R9 R4 + 0x7C200200, // 004C CALL R8 1 + 0x001C0E08, // 004D ADD R7 R7 R8 + 0x58200015, // 004E LDCONST R8 K21 + 0x7C140600, // 004F CALL R5 3 + 0x70020000, // 0050 JMP #0052 + 0xB0080000, // 0051 RAISE 2 R0 R0 + 0x80000000, // 0052 RET 0 }) ) ); @@ -4496,73 +1635,11 @@ be_local_closure(Matter_Device_load_param, /* name */ /******************************************************************** -** Solidified function: msg_send +** Solidified function: event_fabrics_saved ********************************************************************/ -be_local_closure(Matter_Device_msg_send, /* name */ +be_local_closure(Matter_Device_event_fabrics_saved, /* name */ be_nested_proto( - 5, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 2]) { /* constants */ - /* K0 */ be_nested_str_weak(udp_server), - /* K1 */ be_nested_str_weak(send_UDP), - }), - be_str_weak(msg_send), - &be_const_str_solidified, - ( &(const binstruction[ 5]) { /* code */ - 0x88080100, // 0000 GETMBR R2 R0 K0 - 0x8C080501, // 0001 GETMET R2 R2 K1 - 0x5C100200, // 0002 MOVE R4 R1 - 0x7C080400, // 0003 CALL R2 2 - 0x80040400, // 0004 RET 1 R2 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: received_ack -********************************************************************/ -be_local_closure(Matter_Device_received_ack, /* name */ - be_nested_proto( - 5, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 2]) { /* constants */ - /* K0 */ be_nested_str_weak(udp_server), - /* K1 */ be_nested_str_weak(received_ack), - }), - be_str_weak(received_ack), - &be_const_str_solidified, - ( &(const binstruction[ 5]) { /* code */ - 0x88080100, // 0000 GETMBR R2 R0 K0 - 0x8C080501, // 0001 GETMET R2 R2 K1 - 0x5C100200, // 0002 MOVE R4 R1 - 0x7C080400, // 0003 CALL R2 2 - 0x80040400, // 0004 RET 1 R2 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: every_second -********************************************************************/ -be_local_closure(Matter_Device_every_second, /* name */ - be_nested_proto( - 4, /* nstack */ + 3, /* nstack */ 1, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -4570,35 +1647,90 @@ be_local_closure(Matter_Device_every_second, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[ 6]) { /* constants */ + ( &(const bvalue[ 5]) { /* constants */ /* K0 */ be_nested_str_weak(sessions), - /* K1 */ be_nested_str_weak(every_second), - /* K2 */ be_nested_str_weak(message_handler), - /* K3 */ be_nested_str_weak(commissioning_open), - /* K4 */ be_nested_str_weak(tasmota), - /* K5 */ be_nested_str_weak(time_reached), + /* K1 */ be_nested_str_weak(count_active_fabrics), + /* K2 */ be_const_int(0), + /* K3 */ be_nested_str_weak(plugins_persist), + /* K4 */ be_nested_str_weak(save_param), }), - be_str_weak(every_second), + be_str_weak(event_fabrics_saved), &be_const_str_solidified, - ( &(const binstruction[18]) { /* code */ + ( &(const binstruction[12]) { /* code */ 0x88040100, // 0000 GETMBR R1 R0 K0 0x8C040301, // 0001 GETMET R1 R1 K1 0x7C040200, // 0002 CALL R1 1 - 0x88040102, // 0003 GETMBR R1 R0 K2 - 0x8C040301, // 0004 GETMET R1 R1 K1 - 0x7C040200, // 0005 CALL R1 1 - 0x88040103, // 0006 GETMBR R1 R0 K3 - 0x4C080000, // 0007 LDNIL R2 - 0x20040202, // 0008 NE R1 R1 R2 - 0x78060006, // 0009 JMPF R1 #0011 - 0xB8060800, // 000A GETNGBL R1 K4 - 0x8C040305, // 000B GETMET R1 R1 K5 - 0x880C0103, // 000C GETMBR R3 R0 K3 - 0x7C040400, // 000D CALL R1 2 - 0x78060001, // 000E JMPF R1 #0011 - 0x4C040000, // 000F LDNIL R1 - 0x90020601, // 0010 SETMBR R0 K3 R1 - 0x80000000, // 0011 RET 0 + 0x24040302, // 0003 GT R1 R1 K2 + 0x78060005, // 0004 JMPF R1 #000B + 0x88040103, // 0005 GETMBR R1 R0 K3 + 0x74060003, // 0006 JMPT R1 #000B + 0x50040200, // 0007 LDBOOL R1 1 0 + 0x90020601, // 0008 SETMBR R0 K3 R1 + 0x8C040104, // 0009 GETMET R1 R0 K4 + 0x7C040200, // 000A CALL R1 1 + 0x80000000, // 000B RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: start_commissioning_complete +********************************************************************/ +be_local_closure(Matter_Device_start_commissioning_complete, /* name */ + be_nested_proto( + 13, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[13]) { /* constants */ + /* K0 */ be_nested_str_weak(string), + /* K1 */ be_nested_str_weak(get_fabric), + /* K2 */ be_nested_str_weak(get_fabric_id), + /* K3 */ be_nested_str_weak(copy), + /* K4 */ be_nested_str_weak(reverse), + /* K5 */ be_nested_str_weak(tohex), + /* K6 */ be_nested_str_weak(get_admin_vendor_name), + /* K7 */ be_nested_str_weak(tasmota), + /* K8 */ be_nested_str_weak(log), + /* K9 */ be_nested_str_weak(format), + /* K10 */ be_nested_str_weak(MTR_X3A_X20_X2D_X2D_X2D_X20Commissioning_X20complete_X20for_X20Fabric_X20_X27_X25s_X27_X20_X28Vendor_X20_X25s_X29_X20_X2D_X2D_X2D), + /* K11 */ be_const_int(2), + /* K12 */ be_nested_str_weak(stop_basic_commissioning), + }), + be_str_weak(start_commissioning_complete), + &be_const_str_solidified, + ( &(const binstruction[25]) { /* code */ + 0xA40A0000, // 0000 IMPORT R2 K0 + 0x8C0C0301, // 0001 GETMET R3 R1 K1 + 0x7C0C0200, // 0002 CALL R3 1 + 0x8C100702, // 0003 GETMET R4 R3 K2 + 0x7C100200, // 0004 CALL R4 1 + 0x8C100903, // 0005 GETMET R4 R4 K3 + 0x7C100200, // 0006 CALL R4 1 + 0x8C100904, // 0007 GETMET R4 R4 K4 + 0x7C100200, // 0008 CALL R4 1 + 0x8C100905, // 0009 GETMET R4 R4 K5 + 0x7C100200, // 000A CALL R4 1 + 0x8C140706, // 000B GETMET R5 R3 K6 + 0x7C140200, // 000C CALL R5 1 + 0xB81A0E00, // 000D GETNGBL R6 K7 + 0x8C180D08, // 000E GETMET R6 R6 K8 + 0x8C200509, // 000F GETMET R8 R2 K9 + 0x5828000A, // 0010 LDCONST R10 K10 + 0x5C2C0800, // 0011 MOVE R11 R4 + 0x5C300A00, // 0012 MOVE R12 R5 + 0x7C200800, // 0013 CALL R8 4 + 0x5824000B, // 0014 LDCONST R9 K11 + 0x7C180600, // 0015 CALL R6 3 + 0x8C18010C, // 0016 GETMET R6 R0 K12 + 0x7C180200, // 0017 CALL R6 1 + 0x80000000, // 0018 RET 0 }) ) ); @@ -4638,6 +1770,804 @@ be_local_closure(Matter_Device_msg_received, /* name */ /*******************************************************************/ +/******************************************************************** +** Solidified function: _instantiate_plugins_from_config +********************************************************************/ +be_local_closure(Matter_Device__instantiate_plugins_from_config, /* name */ + be_nested_proto( + 20, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[32]) { /* constants */ + /* K0 */ be_nested_str_weak(string), + /* K1 */ be_nested_str_weak(k2l_num), + /* K2 */ be_nested_str_weak(tasmota), + /* K3 */ be_nested_str_weak(log), + /* K4 */ be_nested_str_weak(MTR_X3A_X20Configuring_X20endpoints), + /* K5 */ be_const_int(2), + /* K6 */ be_nested_str_weak(plugins), + /* K7 */ be_nested_str_weak(push), + /* K8 */ be_nested_str_weak(matter), + /* K9 */ be_nested_str_weak(Plugin_Root), + /* K10 */ be_const_int(0), + /* K11 */ be_nested_str_weak(format), + /* K12 */ be_nested_str_weak(MTR_X3A_X20_X20_X20endpoint_X20_X3D_X20_X255i_X20type_X20_X3D_X20_X25s_X25s), + /* K13 */ be_nested_str_weak(root), + /* K14 */ be_nested_str_weak(), + /* K15 */ be_nested_str_weak(Plugin_Aggregator), + /* K16 */ be_nested_str_weak(find), + /* K17 */ be_nested_str_weak(type), + /* K18 */ be_nested_str_weak(MTR_X3A_X20no_X20class_X20name_X2C_X20skipping), + /* K19 */ be_const_int(3), + /* K20 */ be_nested_str_weak(MTR_X3A_X20only_X20one_X20root_X20node_X20allowed), + /* K21 */ be_nested_str_weak(plugins_classes), + /* K22 */ be_nested_str_weak(MTR_X3A_X20unknown_X20class_X20name_X20_X27), + /* K23 */ be_nested_str_weak(_X27_X20skipping), + /* K24 */ be_nested_str_weak(conf_to_log), + /* K25 */ be_nested_str_weak(MTR_X3A_X20Exception), + /* K26 */ be_nested_str_weak(_X7C), + /* K27 */ be_nested_str_weak(stop_iteration), + /* K28 */ be_nested_str_weak(aggregator), + /* K29 */ be_nested_str_weak(publish_result), + /* K30 */ be_nested_str_weak(_X7B_X22Matter_X22_X3A_X7B_X22Initialized_X22_X3A1_X7D_X7D), + /* K31 */ be_nested_str_weak(Matter), + }), + be_str_weak(_instantiate_plugins_from_config), + &be_const_str_solidified, + ( &(const binstruction[153]) { /* code */ + 0xA40A0000, // 0000 IMPORT R2 K0 + 0x8C0C0101, // 0001 GETMET R3 R0 K1 + 0x5C140200, // 0002 MOVE R5 R1 + 0x7C0C0400, // 0003 CALL R3 2 + 0xB8120400, // 0004 GETNGBL R4 K2 + 0x8C100903, // 0005 GETMET R4 R4 K3 + 0x58180004, // 0006 LDCONST R6 K4 + 0x581C0005, // 0007 LDCONST R7 K5 + 0x7C100600, // 0008 CALL R4 3 + 0x88100106, // 0009 GETMBR R4 R0 K6 + 0x8C100907, // 000A GETMET R4 R4 K7 + 0xB81A1000, // 000B GETNGBL R6 K8 + 0x8C180D09, // 000C GETMET R6 R6 K9 + 0x5C200000, // 000D MOVE R8 R0 + 0x5824000A, // 000E LDCONST R9 K10 + 0x60280013, // 000F GETGBL R10 G19 + 0x7C280000, // 0010 CALL R10 0 + 0x7C180800, // 0011 CALL R6 4 + 0x7C100400, // 0012 CALL R4 2 + 0xB8120400, // 0013 GETNGBL R4 K2 + 0x8C100903, // 0014 GETMET R4 R4 K3 + 0x8C18050B, // 0015 GETMET R6 R2 K11 + 0x5820000C, // 0016 LDCONST R8 K12 + 0x5824000A, // 0017 LDCONST R9 K10 + 0x5828000D, // 0018 LDCONST R10 K13 + 0x582C000E, // 0019 LDCONST R11 K14 + 0x7C180A00, // 001A CALL R6 5 + 0x581C0005, // 001B LDCONST R7 K5 + 0x7C100600, // 001C CALL R4 3 + 0x88100106, // 001D GETMBR R4 R0 K6 + 0x8C100907, // 001E GETMET R4 R4 K7 + 0xB81A1000, // 001F GETNGBL R6 K8 + 0x8C180D0F, // 0020 GETMET R6 R6 K15 + 0x5C200000, // 0021 MOVE R8 R0 + 0x5426FEFF, // 0022 LDINT R9 65280 + 0x60280013, // 0023 GETGBL R10 G19 + 0x7C280000, // 0024 CALL R10 0 + 0x7C180800, // 0025 CALL R6 4 + 0x7C100400, // 0026 CALL R4 2 + 0x60100010, // 0027 GETGBL R4 G16 + 0x5C140600, // 0028 MOVE R5 R3 + 0x7C100200, // 0029 CALL R4 1 + 0xA802005A, // 002A EXBLK 0 #0086 + 0x5C140800, // 002B MOVE R5 R4 + 0x7C140000, // 002C CALL R5 0 + 0x1C180B0A, // 002D EQ R6 R5 K10 + 0x781A0000, // 002E JMPF R6 #0030 + 0x7001FFFA, // 002F JMP #002B + 0xA8020042, // 0030 EXBLK 0 #0074 + 0x60180008, // 0031 GETGBL R6 G8 + 0x5C1C0A00, // 0032 MOVE R7 R5 + 0x7C180200, // 0033 CALL R6 1 + 0x94180206, // 0034 GETIDX R6 R1 R6 + 0x8C1C0D10, // 0035 GETMET R7 R6 K16 + 0x58240011, // 0036 LDCONST R9 K17 + 0x7C1C0400, // 0037 CALL R7 2 + 0x4C200000, // 0038 LDNIL R8 + 0x1C200E08, // 0039 EQ R8 R7 R8 + 0x78220006, // 003A JMPF R8 #0042 + 0xB8220400, // 003B GETNGBL R8 K2 + 0x8C201103, // 003C GETMET R8 R8 K3 + 0x58280012, // 003D LDCONST R10 K18 + 0x582C0013, // 003E LDCONST R11 K19 + 0x7C200600, // 003F CALL R8 3 + 0xA8040001, // 0040 EXBLK 1 1 + 0x7001FFE8, // 0041 JMP #002B + 0x1C200F0D, // 0042 EQ R8 R7 K13 + 0x78220006, // 0043 JMPF R8 #004B + 0xB8220400, // 0044 GETNGBL R8 K2 + 0x8C201103, // 0045 GETMET R8 R8 K3 + 0x58280014, // 0046 LDCONST R10 K20 + 0x582C0013, // 0047 LDCONST R11 K19 + 0x7C200600, // 0048 CALL R8 3 + 0xA8040001, // 0049 EXBLK 1 1 + 0x7001FFDF, // 004A JMP #002B + 0x88200115, // 004B GETMBR R8 R0 K21 + 0x8C201110, // 004C GETMET R8 R8 K16 + 0x5C280E00, // 004D MOVE R10 R7 + 0x7C200400, // 004E CALL R8 2 + 0x4C240000, // 004F LDNIL R9 + 0x1C241009, // 0050 EQ R9 R8 R9 + 0x7826000A, // 0051 JMPF R9 #005D + 0xB8260400, // 0052 GETNGBL R9 K2 + 0x8C241303, // 0053 GETMET R9 R9 K3 + 0x602C0008, // 0054 GETGBL R11 G8 + 0x5C300E00, // 0055 MOVE R12 R7 + 0x7C2C0200, // 0056 CALL R11 1 + 0x002E2C0B, // 0057 ADD R11 K22 R11 + 0x002C1717, // 0058 ADD R11 R11 K23 + 0x58300005, // 0059 LDCONST R12 K5 + 0x7C240600, // 005A CALL R9 3 + 0xA8040001, // 005B EXBLK 1 1 + 0x7001FFCD, // 005C JMP #002B + 0x5C241000, // 005D MOVE R9 R8 + 0x5C280000, // 005E MOVE R10 R0 + 0x5C2C0A00, // 005F MOVE R11 R5 + 0x5C300C00, // 0060 MOVE R12 R6 + 0x7C240600, // 0061 CALL R9 3 + 0x88280106, // 0062 GETMBR R10 R0 K6 + 0x8C281507, // 0063 GETMET R10 R10 K7 + 0x5C301200, // 0064 MOVE R12 R9 + 0x7C280400, // 0065 CALL R10 2 + 0xB82A0400, // 0066 GETNGBL R10 K2 + 0x8C281503, // 0067 GETMET R10 R10 K3 + 0x8C30050B, // 0068 GETMET R12 R2 K11 + 0x5838000C, // 0069 LDCONST R14 K12 + 0x5C3C0A00, // 006A MOVE R15 R5 + 0x5C400E00, // 006B MOVE R16 R7 + 0x8C440118, // 006C GETMET R17 R0 K24 + 0x5C4C0C00, // 006D MOVE R19 R6 + 0x7C440400, // 006E CALL R17 2 + 0x7C300A00, // 006F CALL R12 5 + 0x58340005, // 0070 LDCONST R13 K5 + 0x7C280600, // 0071 CALL R10 3 + 0xA8040001, // 0072 EXBLK 1 1 + 0x70020010, // 0073 JMP #0085 + 0xAC180002, // 0074 CATCH R6 0 2 + 0x7002000D, // 0075 JMP #0084 + 0xB8220400, // 0076 GETNGBL R8 K2 + 0x8C201103, // 0077 GETMET R8 R8 K3 + 0x60280008, // 0078 GETGBL R10 G8 + 0x5C2C0C00, // 0079 MOVE R11 R6 + 0x7C280200, // 007A CALL R10 1 + 0x002A320A, // 007B ADD R10 K25 R10 + 0x0028151A, // 007C ADD R10 R10 K26 + 0x602C0008, // 007D GETGBL R11 G8 + 0x5C300E00, // 007E MOVE R12 R7 + 0x7C2C0200, // 007F CALL R11 1 + 0x0028140B, // 0080 ADD R10 R10 R11 + 0x582C0005, // 0081 LDCONST R11 K5 + 0x7C200600, // 0082 CALL R8 3 + 0x70020000, // 0083 JMP #0085 + 0xB0080000, // 0084 RAISE 2 R0 R0 + 0x7001FFA4, // 0085 JMP #002B + 0x5810001B, // 0086 LDCONST R4 K27 + 0xAC100200, // 0087 CATCH R4 1 0 + 0xB0080000, // 0088 RAISE 2 R0 R0 + 0xB8120400, // 0089 GETNGBL R4 K2 + 0x8C100903, // 008A GETMET R4 R4 K3 + 0x8C18050B, // 008B GETMET R6 R2 K11 + 0x5820000C, // 008C LDCONST R8 K12 + 0x5426FEFF, // 008D LDINT R9 65280 + 0x5828001C, // 008E LDCONST R10 K28 + 0x582C000E, // 008F LDCONST R11 K14 + 0x7C180A00, // 0090 CALL R6 5 + 0x581C0005, // 0091 LDCONST R7 K5 + 0x7C100600, // 0092 CALL R4 3 + 0xB8120400, // 0093 GETNGBL R4 K2 + 0x8C10091D, // 0094 GETMET R4 R4 K29 + 0x5818001E, // 0095 LDCONST R6 K30 + 0x581C001F, // 0096 LDCONST R7 K31 + 0x7C100600, // 0097 CALL R4 3 + 0x80000000, // 0098 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: get_active_endpoints +********************************************************************/ +be_local_closure(Matter_Device_get_active_endpoints, /* name */ + be_nested_proto( + 9, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 6]) { /* constants */ + /* K0 */ be_nested_str_weak(plugins), + /* K1 */ be_nested_str_weak(get_endpoint), + /* K2 */ be_const_int(0), + /* K3 */ be_nested_str_weak(find), + /* K4 */ be_nested_str_weak(push), + /* K5 */ be_nested_str_weak(stop_iteration), + }), + be_str_weak(get_active_endpoints), + &be_const_str_solidified, + ( &(const binstruction[28]) { /* code */ + 0x60080012, // 0000 GETGBL R2 G18 + 0x7C080000, // 0001 CALL R2 0 + 0x600C0010, // 0002 GETGBL R3 G16 + 0x88100100, // 0003 GETMBR R4 R0 K0 + 0x7C0C0200, // 0004 CALL R3 1 + 0xA8020011, // 0005 EXBLK 0 #0018 + 0x5C100600, // 0006 MOVE R4 R3 + 0x7C100000, // 0007 CALL R4 0 + 0x8C140901, // 0008 GETMET R5 R4 K1 + 0x7C140200, // 0009 CALL R5 1 + 0x78060002, // 000A JMPF R1 #000E + 0x1C180B02, // 000B EQ R6 R5 K2 + 0x781A0000, // 000C JMPF R6 #000E + 0x7001FFF7, // 000D JMP #0006 + 0x8C180503, // 000E GETMET R6 R2 K3 + 0x5C200A00, // 000F MOVE R8 R5 + 0x7C180400, // 0010 CALL R6 2 + 0x4C1C0000, // 0011 LDNIL R7 + 0x1C180C07, // 0012 EQ R6 R6 R7 + 0x781A0002, // 0013 JMPF R6 #0017 + 0x8C180504, // 0014 GETMET R6 R2 K4 + 0x5C200A00, // 0015 MOVE R8 R5 + 0x7C180400, // 0016 CALL R6 2 + 0x7001FFED, // 0017 JMP #0006 + 0x580C0005, // 0018 LDCONST R3 K5 + 0xAC0C0200, // 0019 CATCH R3 1 0 + 0xB0080000, // 001A RAISE 2 R0 R0 + 0x80040400, // 001B RET 1 R2 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: _start_udp +********************************************************************/ +be_local_closure(Matter_Device__start_udp, /* name */ + be_nested_proto( + 6, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 1, /* has sup protos */ + ( &(const struct bproto*[ 1]) { + be_nested_proto( + 8, /* nstack */ + 3, /* argc */ + 0, /* varg */ + 1, /* has upvals */ + ( &(const bupvaldesc[ 1]) { /* upvals */ + be_local_const_upval(1, 0), + }), + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 1]) { /* constants */ + /* K0 */ be_nested_str_weak(msg_received), + }), + be_str_weak(_X3Clambda_X3E), + &be_const_str_solidified, + ( &(const binstruction[ 7]) { /* code */ + 0x680C0000, // 0000 GETUPV R3 U0 + 0x8C0C0700, // 0001 GETMET R3 R3 K0 + 0x5C140000, // 0002 MOVE R5 R0 + 0x5C180200, // 0003 MOVE R6 R1 + 0x5C1C0400, // 0004 MOVE R7 R2 + 0x7C0C0800, // 0005 CALL R3 4 + 0x80040600, // 0006 RET 1 R3 + }) + ), + }), + 1, /* has constants */ + ( &(const bvalue[ 9]) { /* constants */ + /* K0 */ be_nested_str_weak(udp_server), + /* K1 */ be_nested_str_weak(tasmota), + /* K2 */ be_nested_str_weak(log), + /* K3 */ be_nested_str_weak(MTR_X3A_X20Starting_X20UDP_X20server_X20on_X20port_X3A_X20), + /* K4 */ be_const_int(2), + /* K5 */ be_nested_str_weak(matter), + /* K6 */ be_nested_str_weak(UDPServer), + /* K7 */ be_nested_str_weak(), + /* K8 */ be_nested_str_weak(start), + }), + be_str_weak(_start_udp), + &be_const_str_solidified, + ( &(const binstruction[27]) { /* code */ + 0x88080100, // 0000 GETMBR R2 R0 K0 + 0x780A0000, // 0001 JMPF R2 #0003 + 0x80000400, // 0002 RET 0 + 0x4C080000, // 0003 LDNIL R2 + 0x1C080202, // 0004 EQ R2 R1 R2 + 0x780A0000, // 0005 JMPF R2 #0007 + 0x540615A3, // 0006 LDINT R1 5540 + 0xB80A0200, // 0007 GETNGBL R2 K1 + 0x8C080502, // 0008 GETMET R2 R2 K2 + 0x60100008, // 0009 GETGBL R4 G8 + 0x5C140200, // 000A MOVE R5 R1 + 0x7C100200, // 000B CALL R4 1 + 0x00120604, // 000C ADD R4 K3 R4 + 0x58140004, // 000D LDCONST R5 K4 + 0x7C080600, // 000E CALL R2 3 + 0xB80A0A00, // 000F GETNGBL R2 K5 + 0x8C080506, // 0010 GETMET R2 R2 K6 + 0x58100007, // 0011 LDCONST R4 K7 + 0x5C140200, // 0012 MOVE R5 R1 + 0x7C080600, // 0013 CALL R2 3 + 0x90020002, // 0014 SETMBR R0 K0 R2 + 0x88080100, // 0015 GETMBR R2 R0 K0 + 0x8C080508, // 0016 GETMET R2 R2 K8 + 0x84100000, // 0017 CLOSURE R4 P0 + 0x7C080400, // 0018 CALL R2 2 + 0xA0000000, // 0019 CLOSE R0 + 0x80000000, // 001A RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: is_root_commissioning_open +********************************************************************/ +be_local_closure(Matter_Device_is_root_commissioning_open, /* name */ + be_nested_proto( + 3, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 2]) { /* constants */ + /* K0 */ be_nested_str_weak(commissioning_open), + /* K1 */ be_nested_str_weak(commissioning_admin_fabric), + }), + be_str_weak(is_root_commissioning_open), + &be_const_str_solidified, + ( &(const binstruction[11]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x4C080000, // 0001 LDNIL R2 + 0x20040202, // 0002 NE R1 R1 R2 + 0x78060003, // 0003 JMPF R1 #0008 + 0x88040101, // 0004 GETMBR R1 R0 K1 + 0x4C080000, // 0005 LDNIL R2 + 0x1C040202, // 0006 EQ R1 R1 R2 + 0x74060000, // 0007 JMPT R1 #0009 + 0x50040001, // 0008 LDBOOL R1 0 1 + 0x50040200, // 0009 LDBOOL R1 1 0 + 0x80040200, // 000A RET 1 R1 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: start_root_basic_commissioning +********************************************************************/ +be_local_closure(Matter_Device_start_root_basic_commissioning, /* name */ + be_nested_proto( + 14, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[20]) { /* constants */ + /* K0 */ be_nested_str_weak(string), + /* K1 */ be_nested_str_weak(PASE_TIMEOUT), + /* K2 */ be_nested_str_weak(compute_manual_pairing_code), + /* K3 */ be_nested_str_weak(tasmota), + /* K4 */ be_nested_str_weak(log), + /* K5 */ be_nested_str_weak(format), + /* K6 */ be_nested_str_weak(MTR_X3A_X20Manual_X20pairing_X20code_X3A_X20_X25s), + /* K7 */ be_const_int(2), + /* K8 */ be_nested_str_weak(compute_qrcode_content), + /* K9 */ be_nested_str_weak(publish_result), + /* K10 */ be_nested_str_weak(_X7B_X22Matter_X22_X3A_X7B_X22Commissioning_X22_X3A1_X2C_X22PairingCode_X22_X3A_X22_X25s_X22_X2C_X22QRCode_X22_X3A_X22_X25s_X22_X7D_X7D), + /* K11 */ be_nested_str_weak(Matter), + /* K12 */ be_nested_str_weak(_compute_pbkdf), + /* K13 */ be_nested_str_weak(root_passcode), + /* K14 */ be_nested_str_weak(root_iterations), + /* K15 */ be_nested_str_weak(root_salt), + /* K16 */ be_nested_str_weak(start_basic_commissioning), + /* K17 */ be_nested_str_weak(root_discriminator), + /* K18 */ be_nested_str_weak(root_w0), + /* K19 */ be_nested_str_weak(root_L), + }), + be_str_weak(start_root_basic_commissioning), + &be_const_str_solidified, + ( &(const binstruction[41]) { /* code */ + 0xA40A0000, // 0000 IMPORT R2 K0 + 0x4C0C0000, // 0001 LDNIL R3 + 0x1C0C0203, // 0002 EQ R3 R1 R3 + 0x780E0000, // 0003 JMPF R3 #0005 + 0x88040101, // 0004 GETMBR R1 R0 K1 + 0x8C0C0102, // 0005 GETMET R3 R0 K2 + 0x7C0C0200, // 0006 CALL R3 1 + 0xB8120600, // 0007 GETNGBL R4 K3 + 0x8C100904, // 0008 GETMET R4 R4 K4 + 0x8C180505, // 0009 GETMET R6 R2 K5 + 0x58200006, // 000A LDCONST R8 K6 + 0x5C240600, // 000B MOVE R9 R3 + 0x7C180600, // 000C CALL R6 3 + 0x581C0007, // 000D LDCONST R7 K7 + 0x7C100600, // 000E CALL R4 3 + 0x8C100108, // 000F GETMET R4 R0 K8 + 0x7C100200, // 0010 CALL R4 1 + 0xB8160600, // 0011 GETNGBL R5 K3 + 0x8C140B09, // 0012 GETMET R5 R5 K9 + 0x8C1C0505, // 0013 GETMET R7 R2 K5 + 0x5824000A, // 0014 LDCONST R9 K10 + 0x5C280600, // 0015 MOVE R10 R3 + 0x5C2C0800, // 0016 MOVE R11 R4 + 0x7C1C0800, // 0017 CALL R7 4 + 0x5820000B, // 0018 LDCONST R8 K11 + 0x7C140600, // 0019 CALL R5 3 + 0x8C14010C, // 001A GETMET R5 R0 K12 + 0x881C010D, // 001B GETMBR R7 R0 K13 + 0x8820010E, // 001C GETMBR R8 R0 K14 + 0x8824010F, // 001D GETMBR R9 R0 K15 + 0x7C140800, // 001E CALL R5 4 + 0x8C140110, // 001F GETMET R5 R0 K16 + 0x5C1C0200, // 0020 MOVE R7 R1 + 0x8820010E, // 0021 GETMBR R8 R0 K14 + 0x88240111, // 0022 GETMBR R9 R0 K17 + 0x8828010F, // 0023 GETMBR R10 R0 K15 + 0x882C0112, // 0024 GETMBR R11 R0 K18 + 0x88300113, // 0025 GETMBR R12 R0 K19 + 0x4C340000, // 0026 LDNIL R13 + 0x7C141000, // 0027 CALL R5 8 + 0x80000000, // 0028 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: start_commissioning_complete_deferred +********************************************************************/ +be_local_closure(Matter_Device_start_commissioning_complete_deferred, /* name */ + be_nested_proto( + 6, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 1, /* has sup protos */ + ( &(const struct bproto*[ 1]) { + be_nested_proto( + 3, /* nstack */ + 0, /* argc */ + 0, /* varg */ + 1, /* has upvals */ + ( &(const bupvaldesc[ 2]) { /* upvals */ + be_local_const_upval(1, 0), + be_local_const_upval(1, 1), + }), + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 1]) { /* constants */ + /* K0 */ be_nested_str_weak(start_commissioning_complete), + }), + be_str_weak(_X3Clambda_X3E), + &be_const_str_solidified, + ( &(const binstruction[ 5]) { /* code */ + 0x68000000, // 0000 GETUPV R0 U0 + 0x8C000100, // 0001 GETMET R0 R0 K0 + 0x68080001, // 0002 GETUPV R2 U1 + 0x7C000400, // 0003 CALL R0 2 + 0x80040000, // 0004 RET 1 R0 + }) + ), + }), + 1, /* has constants */ + ( &(const bvalue[ 3]) { /* constants */ + /* K0 */ be_nested_str_weak(tasmota), + /* K1 */ be_nested_str_weak(set_timer), + /* K2 */ be_const_int(0), + }), + be_str_weak(start_commissioning_complete_deferred), + &be_const_str_solidified, + ( &(const binstruction[ 7]) { /* code */ + 0xB80A0000, // 0000 GETNGBL R2 K0 + 0x8C080501, // 0001 GETMET R2 R2 K1 + 0x58100002, // 0002 LDCONST R4 K2 + 0x84140000, // 0003 CLOSURE R5 P0 + 0x7C080600, // 0004 CALL R2 3 + 0xA0000000, // 0005 CLOSE R0 + 0x80000000, // 0006 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: MtrJoin +********************************************************************/ +be_local_closure(Matter_Device_MtrJoin, /* name */ + be_nested_proto( + 8, /* nstack */ + 5, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 4]) { /* constants */ + /* K0 */ be_nested_str_weak(start_root_basic_commissioning), + /* K1 */ be_nested_str_weak(stop_basic_commissioning), + /* K2 */ be_nested_str_weak(tasmota), + /* K3 */ be_nested_str_weak(resp_cmnd_done), + }), + be_str_weak(MtrJoin), + &be_const_str_solidified, + ( &(const binstruction[13]) { /* code */ + 0x60140009, // 0000 GETGBL R5 G9 + 0x5C180600, // 0001 MOVE R6 R3 + 0x7C140200, // 0002 CALL R5 1 + 0x78160002, // 0003 JMPF R5 #0007 + 0x8C180100, // 0004 GETMET R6 R0 K0 + 0x7C180200, // 0005 CALL R6 1 + 0x70020001, // 0006 JMP #0009 + 0x8C180101, // 0007 GETMET R6 R0 K1 + 0x7C180200, // 0008 CALL R6 1 + 0xB81A0400, // 0009 GETNGBL R6 K2 + 0x8C180D03, // 000A GETMET R6 R6 K3 + 0x7C180200, // 000B CALL R6 1 + 0x80000000, // 000C RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: start +********************************************************************/ +be_local_closure(Matter_Device_start, /* name */ + be_nested_proto( + 6, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 1, /* has sup protos */ + ( &(const struct bproto*[ 1]) { + be_nested_proto( + 2, /* nstack */ + 0, /* argc */ + 0, /* varg */ + 1, /* has upvals */ + ( &(const bupvaldesc[ 1]) { /* upvals */ + be_local_const_upval(1, 0), + }), + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 1]) { /* constants */ + /* K0 */ be_nested_str_weak(_trigger_read_sensors), + }), + be_str_weak(_anonymous_), + &be_const_str_solidified, + ( &(const binstruction[ 4]) { /* code */ + 0x68000000, // 0000 GETUPV R0 U0 + 0x8C000100, // 0001 GETMET R0 R0 K0 + 0x7C000200, // 0002 CALL R0 1 + 0x80000000, // 0003 RET 0 + }) + ), + }), + 1, /* has constants */ + ( &(const bvalue[ 9]) { /* constants */ + /* K0 */ be_nested_str_weak(started), + /* K1 */ be_nested_str_weak(autoconf_device), + /* K2 */ be_nested_str_weak(tasmota), + /* K3 */ be_nested_str_weak(add_cron), + /* K4 */ be_nested_str_weak(_X2A_X2F30_X20_X2A_X20_X2A_X20_X2A_X20_X2A_X20_X2A), + /* K5 */ be_nested_str_weak(matter_sensors_30s), + /* K6 */ be_nested_str_weak(_start_udp), + /* K7 */ be_nested_str_weak(UDP_PORT), + /* K8 */ be_nested_str_weak(start_mdns_announce_hostnames), + }), + be_str_weak(start), + &be_const_str_solidified, + ( &(const binstruction[20]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x78060000, // 0001 JMPF R1 #0003 + 0x80000200, // 0002 RET 0 + 0x8C040101, // 0003 GETMET R1 R0 K1 + 0x7C040200, // 0004 CALL R1 1 + 0xB8060400, // 0005 GETNGBL R1 K2 + 0x8C040303, // 0006 GETMET R1 R1 K3 + 0x580C0004, // 0007 LDCONST R3 K4 + 0x84100000, // 0008 CLOSURE R4 P0 + 0x58140005, // 0009 LDCONST R5 K5 + 0x7C040800, // 000A CALL R1 4 + 0x8C040106, // 000B GETMET R1 R0 K6 + 0x880C0107, // 000C GETMBR R3 R0 K7 + 0x7C040400, // 000D CALL R1 2 + 0x8C040108, // 000E GETMET R1 R0 K8 + 0x7C040200, // 000F CALL R1 1 + 0x50040200, // 0010 LDBOOL R1 1 0 + 0x90020001, // 0011 SETMBR R0 K0 R1 + 0xA0000000, // 0012 CLOSE R0 + 0x80000000, // 0013 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: conf_to_log +********************************************************************/ +be_local_closure(Matter_Device_conf_to_log, /* name */ + be_nested_proto( + 11, /* nstack */ + 1, /* argc */ + 4, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 8]) { /* constants */ + /* K0 */ be_const_class(be_class_Matter_Device), + /* K1 */ be_nested_str_weak(string), + /* K2 */ be_nested_str_weak(), + /* K3 */ be_nested_str_weak(k2l), + /* K4 */ be_nested_str_weak(type), + /* K5 */ be_nested_str_weak(format), + /* K6 */ be_nested_str_weak(_X20_X25s_X20_X3D_X20_X25s), + /* K7 */ be_nested_str_weak(stop_iteration), + }), + be_str_weak(conf_to_log), + &be_const_str_solidified, + ( &(const binstruction[25]) { /* code */ + 0x58040000, // 0000 LDCONST R1 K0 + 0xA40A0200, // 0001 IMPORT R2 K1 + 0x580C0002, // 0002 LDCONST R3 K2 + 0x60100010, // 0003 GETGBL R4 G16 + 0x8C140303, // 0004 GETMET R5 R1 K3 + 0x5C1C0000, // 0005 MOVE R7 R0 + 0x7C140400, // 0006 CALL R5 2 + 0x7C100200, // 0007 CALL R4 1 + 0xA802000B, // 0008 EXBLK 0 #0015 + 0x5C140800, // 0009 MOVE R5 R4 + 0x7C140000, // 000A CALL R5 0 + 0x1C180B04, // 000B EQ R6 R5 K4 + 0x781A0000, // 000C JMPF R6 #000E + 0x7001FFFA, // 000D JMP #0009 + 0x8C180505, // 000E GETMET R6 R2 K5 + 0x58200006, // 000F LDCONST R8 K6 + 0x5C240A00, // 0010 MOVE R9 R5 + 0x94280005, // 0011 GETIDX R10 R0 R5 + 0x7C180800, // 0012 CALL R6 4 + 0x000C0606, // 0013 ADD R3 R3 R6 + 0x7001FFF3, // 0014 JMP #0009 + 0x58100007, // 0015 LDCONST R4 K7 + 0xAC100200, // 0016 CATCH R4 1 0 + 0xB0080000, // 0017 RAISE 2 R0 R0 + 0x80040600, // 0018 RET 1 R3 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: attribute_updated +********************************************************************/ +be_local_closure(Matter_Device_attribute_updated, /* name */ + be_nested_proto( + 10, /* nstack */ + 5, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 9]) { /* constants */ + /* K0 */ be_nested_str_weak(matter), + /* K1 */ be_nested_str_weak(Path), + /* K2 */ be_nested_str_weak(endpoint), + /* K3 */ be_nested_str_weak(cluster), + /* K4 */ be_nested_str_weak(attribute), + /* K5 */ be_nested_str_weak(message_handler), + /* K6 */ be_nested_str_weak(im), + /* K7 */ be_nested_str_weak(subs_shop), + /* K8 */ be_nested_str_weak(attribute_updated_ctx), + }), + be_str_weak(attribute_updated), + &be_const_str_solidified, + ( &(const binstruction[18]) { /* code */ + 0x4C140000, // 0000 LDNIL R5 + 0x1C140805, // 0001 EQ R5 R4 R5 + 0x78160000, // 0002 JMPF R5 #0004 + 0x50100000, // 0003 LDBOOL R4 0 0 + 0xB8160000, // 0004 GETNGBL R5 K0 + 0x8C140B01, // 0005 GETMET R5 R5 K1 + 0x7C140200, // 0006 CALL R5 1 + 0x90160401, // 0007 SETMBR R5 K2 R1 + 0x90160602, // 0008 SETMBR R5 K3 R2 + 0x90160803, // 0009 SETMBR R5 K4 R3 + 0x88180105, // 000A GETMBR R6 R0 K5 + 0x88180D06, // 000B GETMBR R6 R6 K6 + 0x88180D07, // 000C GETMBR R6 R6 K7 + 0x8C180D08, // 000D GETMET R6 R6 K8 + 0x5C200A00, // 000E MOVE R8 R5 + 0x5C240800, // 000F MOVE R9 R4 + 0x7C180600, // 0010 CALL R6 3 + 0x80000000, // 0011 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: _init_basic_commissioning +********************************************************************/ +be_local_closure(Matter_Device__init_basic_commissioning, /* name */ + be_nested_proto( + 3, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 4]) { /* constants */ + /* K0 */ be_nested_str_weak(sessions), + /* K1 */ be_nested_str_weak(count_active_fabrics), + /* K2 */ be_const_int(0), + /* K3 */ be_nested_str_weak(start_root_basic_commissioning), + }), + be_str_weak(_init_basic_commissioning), + &be_const_str_solidified, + ( &(const binstruction[ 8]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x8C040301, // 0001 GETMET R1 R1 K1 + 0x7C040200, // 0002 CALL R1 1 + 0x1C040302, // 0003 EQ R1 R1 K2 + 0x78060001, // 0004 JMPF R1 #0007 + 0x8C040103, // 0005 GETMET R1 R0 K3 + 0x7C040200, // 0006 CALL R1 1 + 0x80000000, // 0007 RET 0 + }) + ) +); +/*******************************************************************/ + + /******************************************************************** ** Solidified function: init ********************************************************************/ @@ -4874,20 +2804,673 @@ be_local_closure(Matter_Device_init, /* name */ /******************************************************************** -** Solidified function: start +** Solidified function: k2l ********************************************************************/ -be_local_closure(Matter_Device_start, /* name */ +be_local_closure(Matter_Device_k2l, /* name */ + be_nested_proto( + 8, /* nstack */ + 1, /* argc */ + 4, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 6]) { /* constants */ + /* K0 */ be_const_class(be_class_Matter_Device), + /* K1 */ be_nested_str_weak(keys), + /* K2 */ be_nested_str_weak(push), + /* K3 */ be_nested_str_weak(stop_iteration), + /* K4 */ be_const_int(1), + /* K5 */ be_const_int(0), + }), + be_str_weak(k2l), + &be_const_str_solidified, + ( &(const binstruction[50]) { /* code */ + 0x58040000, // 0000 LDCONST R1 K0 + 0x60080012, // 0001 GETGBL R2 G18 + 0x7C080000, // 0002 CALL R2 0 + 0x4C0C0000, // 0003 LDNIL R3 + 0x1C0C0003, // 0004 EQ R3 R0 R3 + 0x780E0000, // 0005 JMPF R3 #0007 + 0x80040400, // 0006 RET 1 R2 + 0x600C0010, // 0007 GETGBL R3 G16 + 0x8C100101, // 0008 GETMET R4 R0 K1 + 0x7C100200, // 0009 CALL R4 1 + 0x7C0C0200, // 000A CALL R3 1 + 0xA8020005, // 000B EXBLK 0 #0012 + 0x5C100600, // 000C MOVE R4 R3 + 0x7C100000, // 000D CALL R4 0 + 0x8C140502, // 000E GETMET R5 R2 K2 + 0x5C1C0800, // 000F MOVE R7 R4 + 0x7C140400, // 0010 CALL R5 2 + 0x7001FFF9, // 0011 JMP #000C + 0x580C0003, // 0012 LDCONST R3 K3 + 0xAC0C0200, // 0013 CATCH R3 1 0 + 0xB0080000, // 0014 RAISE 2 R0 R0 + 0x600C0010, // 0015 GETGBL R3 G16 + 0x6010000C, // 0016 GETGBL R4 G12 + 0x5C140400, // 0017 MOVE R5 R2 + 0x7C100200, // 0018 CALL R4 1 + 0x04100904, // 0019 SUB R4 R4 K4 + 0x40120804, // 001A CONNECT R4 K4 R4 + 0x7C0C0200, // 001B CALL R3 1 + 0xA8020010, // 001C EXBLK 0 #002E + 0x5C100600, // 001D MOVE R4 R3 + 0x7C100000, // 001E CALL R4 0 + 0x94140404, // 001F GETIDX R5 R2 R4 + 0x5C180800, // 0020 MOVE R6 R4 + 0x241C0D05, // 0021 GT R7 R6 K5 + 0x781E0008, // 0022 JMPF R7 #002C + 0x041C0D04, // 0023 SUB R7 R6 K4 + 0x941C0407, // 0024 GETIDX R7 R2 R7 + 0x241C0E05, // 0025 GT R7 R7 R5 + 0x781E0004, // 0026 JMPF R7 #002C + 0x041C0D04, // 0027 SUB R7 R6 K4 + 0x941C0407, // 0028 GETIDX R7 R2 R7 + 0x98080C07, // 0029 SETIDX R2 R6 R7 + 0x04180D04, // 002A SUB R6 R6 K4 + 0x7001FFF4, // 002B JMP #0021 + 0x98080C05, // 002C SETIDX R2 R6 R5 + 0x7001FFEE, // 002D JMP #001D + 0x580C0003, // 002E LDCONST R3 K3 + 0xAC0C0200, // 002F CATCH R3 1 0 + 0xB0080000, // 0030 RAISE 2 R0 R0 + 0x80040400, // 0031 RET 1 R2 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: adjust_next_ep +********************************************************************/ +be_local_closure(Matter_Device_adjust_next_ep, /* name */ + be_nested_proto( + 5, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 5]) { /* constants */ + /* K0 */ be_nested_str_weak(plugins_config), + /* K1 */ be_nested_str_weak(keys), + /* K2 */ be_nested_str_weak(next_ep), + /* K3 */ be_const_int(1), + /* K4 */ be_nested_str_weak(stop_iteration), + }), + be_str_weak(adjust_next_ep), + &be_const_str_solidified, + ( &(const binstruction[21]) { /* code */ + 0x60040010, // 0000 GETGBL R1 G16 + 0x88080100, // 0001 GETMBR R2 R0 K0 + 0x8C080501, // 0002 GETMET R2 R2 K1 + 0x7C080200, // 0003 CALL R2 1 + 0x7C040200, // 0004 CALL R1 1 + 0xA802000A, // 0005 EXBLK 0 #0011 + 0x5C080200, // 0006 MOVE R2 R1 + 0x7C080000, // 0007 CALL R2 0 + 0x600C0009, // 0008 GETGBL R3 G9 + 0x5C100400, // 0009 MOVE R4 R2 + 0x7C0C0200, // 000A CALL R3 1 + 0x88100102, // 000B GETMBR R4 R0 K2 + 0x28100604, // 000C GE R4 R3 R4 + 0x78120001, // 000D JMPF R4 #0010 + 0x00100703, // 000E ADD R4 R3 K3 + 0x90020404, // 000F SETMBR R0 K2 R4 + 0x7001FFF4, // 0010 JMP #0006 + 0x58040004, // 0011 LDCONST R1 K4 + 0xAC040200, // 0012 CATCH R1 1 0 + 0xB0080000, // 0013 RAISE 2 R0 R0 + 0x80000000, // 0014 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: get_plugin_class_displayname +********************************************************************/ +be_local_closure(Matter_Device_get_plugin_class_displayname, /* name */ + be_nested_proto( + 5, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 4]) { /* constants */ + /* K0 */ be_nested_str_weak(plugins_classes), + /* K1 */ be_nested_str_weak(find), + /* K2 */ be_nested_str_weak(NAME), + /* K3 */ be_nested_str_weak(), + }), + be_str_weak(get_plugin_class_displayname), + &be_const_str_solidified, + ( &(const binstruction[ 9]) { /* code */ + 0x88080100, // 0000 GETMBR R2 R0 K0 + 0x8C080501, // 0001 GETMET R2 R2 K1 + 0x5C100200, // 0002 MOVE R4 R1 + 0x7C080400, // 0003 CALL R2 2 + 0x780A0001, // 0004 JMPF R2 #0007 + 0x880C0502, // 0005 GETMBR R3 R2 K2 + 0x70020000, // 0006 JMP #0008 + 0x580C0003, // 0007 LDCONST R3 K3 + 0x80040600, // 0008 RET 1 R3 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: mdns_announce_op_discovery +********************************************************************/ +be_local_closure(Matter_Device_mdns_announce_op_discovery, /* name */ + be_nested_proto( + 15, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[29]) { /* constants */ + /* K0 */ be_nested_str_weak(mdns), + /* K1 */ be_nested_str_weak(string), + /* K2 */ be_nested_str_weak(get_device_id), + /* K3 */ be_nested_str_weak(copy), + /* K4 */ be_nested_str_weak(reverse), + /* K5 */ be_nested_str_weak(get_fabric_compressed), + /* K6 */ be_nested_str_weak(tohex), + /* K7 */ be_nested_str_weak(_X2D), + /* K8 */ be_nested_str_weak(tasmota), + /* K9 */ be_nested_str_weak(log), + /* K10 */ be_nested_str_weak(MTR_X3A_X20Operational_X20Discovery_X20node_X20_X3D_X20), + /* K11 */ be_const_int(3), + /* K12 */ be_nested_str_weak(eth), + /* K13 */ be_nested_str_weak(find), + /* K14 */ be_nested_str_weak(up), + /* K15 */ be_nested_str_weak(format), + /* K16 */ be_nested_str_weak(MTR_X3A_X20adding_X20mDNS_X20on_X20_X25s_X20_X27_X25s_X27_X20ptr_X20to_X20_X60_X25s_X2Elocal_X60), + /* K17 */ be_nested_str_weak(hostname_eth), + /* K18 */ be_nested_str_weak(add_service), + /* K19 */ be_nested_str_weak(_matter), + /* K20 */ be_nested_str_weak(_tcp), + /* K21 */ be_nested_str_weak(_I), + /* K22 */ be_nested_str_weak(MTR_X3A_X20adding_X20subtype_X3A_X20), + /* K23 */ be_nested_str_weak(add_subtype), + /* K24 */ be_nested_str_weak(wifi), + /* K25 */ be_nested_str_weak(hostname_wifi), + /* K26 */ be_nested_str_weak(MTR_X3A_X20Exception), + /* K27 */ be_nested_str_weak(_X7C), + /* K28 */ be_const_int(2), + }), + be_str_weak(mdns_announce_op_discovery), + &be_const_str_solidified, + ( &(const binstruction[122]) { /* code */ + 0xA40A0000, // 0000 IMPORT R2 K0 + 0xA40E0200, // 0001 IMPORT R3 K1 + 0xA8020064, // 0002 EXBLK 0 #0068 + 0x8C100302, // 0003 GETMET R4 R1 K2 + 0x7C100200, // 0004 CALL R4 1 + 0x8C100903, // 0005 GETMET R4 R4 K3 + 0x7C100200, // 0006 CALL R4 1 + 0x8C100904, // 0007 GETMET R4 R4 K4 + 0x7C100200, // 0008 CALL R4 1 + 0x8C140305, // 0009 GETMET R5 R1 K5 + 0x7C140200, // 000A CALL R5 1 + 0x8C180B06, // 000B GETMET R6 R5 K6 + 0x7C180200, // 000C CALL R6 1 + 0x00180D07, // 000D ADD R6 R6 K7 + 0x8C1C0906, // 000E GETMET R7 R4 K6 + 0x7C1C0200, // 000F CALL R7 1 + 0x00180C07, // 0010 ADD R6 R6 R7 + 0xB81E1000, // 0011 GETNGBL R7 K8 + 0x8C1C0F09, // 0012 GETMET R7 R7 K9 + 0x00261406, // 0013 ADD R9 K10 R6 + 0x5828000B, // 0014 LDCONST R10 K11 + 0x7C1C0600, // 0015 CALL R7 3 + 0xB81E1000, // 0016 GETNGBL R7 K8 + 0x8C1C0F0C, // 0017 GETMET R7 R7 K12 + 0x7C1C0200, // 0018 CALL R7 1 + 0x8C1C0F0D, // 0019 GETMET R7 R7 K13 + 0x5824000E, // 001A LDCONST R9 K14 + 0x7C1C0400, // 001B CALL R7 2 + 0x781E0020, // 001C JMPF R7 #003E + 0xB81E1000, // 001D GETNGBL R7 K8 + 0x8C1C0F09, // 001E GETMET R7 R7 K9 + 0x8C24070F, // 001F GETMET R9 R3 K15 + 0x582C0010, // 0020 LDCONST R11 K16 + 0x5830000C, // 0021 LDCONST R12 K12 + 0x5C340C00, // 0022 MOVE R13 R6 + 0x88380111, // 0023 GETMBR R14 R0 K17 + 0x7C240A00, // 0024 CALL R9 5 + 0x5828000B, // 0025 LDCONST R10 K11 + 0x7C1C0600, // 0026 CALL R7 3 + 0x8C1C0512, // 0027 GETMET R7 R2 K18 + 0x58240013, // 0028 LDCONST R9 K19 + 0x58280014, // 0029 LDCONST R10 K20 + 0x542E15A3, // 002A LDINT R11 5540 + 0x4C300000, // 002B LDNIL R12 + 0x5C340C00, // 002C MOVE R13 R6 + 0x88380111, // 002D GETMBR R14 R0 K17 + 0x7C1C0E00, // 002E CALL R7 7 + 0x8C1C0B06, // 002F GETMET R7 R5 K6 + 0x7C1C0200, // 0030 CALL R7 1 + 0x001E2A07, // 0031 ADD R7 K21 R7 + 0xB8221000, // 0032 GETNGBL R8 K8 + 0x8C201109, // 0033 GETMET R8 R8 K9 + 0x002A2C07, // 0034 ADD R10 K22 R7 + 0x582C000B, // 0035 LDCONST R11 K11 + 0x7C200600, // 0036 CALL R8 3 + 0x8C200517, // 0037 GETMET R8 R2 K23 + 0x58280013, // 0038 LDCONST R10 K19 + 0x582C0014, // 0039 LDCONST R11 K20 + 0x5C300C00, // 003A MOVE R12 R6 + 0x88340111, // 003B GETMBR R13 R0 K17 + 0x5C380E00, // 003C MOVE R14 R7 + 0x7C200C00, // 003D CALL R8 6 + 0xB81E1000, // 003E GETNGBL R7 K8 + 0x8C1C0F18, // 003F GETMET R7 R7 K24 + 0x7C1C0200, // 0040 CALL R7 1 + 0x8C1C0F0D, // 0041 GETMET R7 R7 K13 + 0x5824000E, // 0042 LDCONST R9 K14 + 0x7C1C0400, // 0043 CALL R7 2 + 0x781E0020, // 0044 JMPF R7 #0066 + 0xB81E1000, // 0045 GETNGBL R7 K8 + 0x8C1C0F09, // 0046 GETMET R7 R7 K9 + 0x8C24070F, // 0047 GETMET R9 R3 K15 + 0x582C0010, // 0048 LDCONST R11 K16 + 0x58300018, // 0049 LDCONST R12 K24 + 0x5C340C00, // 004A MOVE R13 R6 + 0x88380119, // 004B GETMBR R14 R0 K25 + 0x7C240A00, // 004C CALL R9 5 + 0x5828000B, // 004D LDCONST R10 K11 + 0x7C1C0600, // 004E CALL R7 3 + 0x8C1C0512, // 004F GETMET R7 R2 K18 + 0x58240013, // 0050 LDCONST R9 K19 + 0x58280014, // 0051 LDCONST R10 K20 + 0x542E15A3, // 0052 LDINT R11 5540 + 0x4C300000, // 0053 LDNIL R12 + 0x5C340C00, // 0054 MOVE R13 R6 + 0x88380119, // 0055 GETMBR R14 R0 K25 + 0x7C1C0E00, // 0056 CALL R7 7 + 0x8C1C0B06, // 0057 GETMET R7 R5 K6 + 0x7C1C0200, // 0058 CALL R7 1 + 0x001E2A07, // 0059 ADD R7 K21 R7 + 0xB8221000, // 005A GETNGBL R8 K8 + 0x8C201109, // 005B GETMET R8 R8 K9 + 0x002A2C07, // 005C ADD R10 K22 R7 + 0x582C000B, // 005D LDCONST R11 K11 + 0x7C200600, // 005E CALL R8 3 + 0x8C200517, // 005F GETMET R8 R2 K23 + 0x58280013, // 0060 LDCONST R10 K19 + 0x582C0014, // 0061 LDCONST R11 K20 + 0x5C300C00, // 0062 MOVE R12 R6 + 0x88340119, // 0063 GETMBR R13 R0 K25 + 0x5C380E00, // 0064 MOVE R14 R7 + 0x7C200C00, // 0065 CALL R8 6 + 0xA8040001, // 0066 EXBLK 1 1 + 0x70020010, // 0067 JMP #0079 + 0xAC100002, // 0068 CATCH R4 0 2 + 0x7002000D, // 0069 JMP #0078 + 0xB81A1000, // 006A GETNGBL R6 K8 + 0x8C180D09, // 006B GETMET R6 R6 K9 + 0x60200008, // 006C GETGBL R8 G8 + 0x5C240800, // 006D MOVE R9 R4 + 0x7C200200, // 006E CALL R8 1 + 0x00223408, // 006F ADD R8 K26 R8 + 0x0020111B, // 0070 ADD R8 R8 K27 + 0x60240008, // 0071 GETGBL R9 G8 + 0x5C280A00, // 0072 MOVE R10 R5 + 0x7C240200, // 0073 CALL R9 1 + 0x00201009, // 0074 ADD R8 R8 R9 + 0x5824001C, // 0075 LDCONST R9 K28 + 0x7C180600, // 0076 CALL R6 3 + 0x70020000, // 0077 JMP #0079 + 0xB0080000, // 0078 RAISE 2 R0 R0 + 0x80000000, // 0079 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: clean_remotes +********************************************************************/ +be_local_closure(Matter_Device_clean_remotes, /* name */ + be_nested_proto( + 11, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[18]) { /* constants */ + /* K0 */ be_nested_str_weak(introspect), + /* K1 */ be_nested_str_weak(string), + /* K2 */ be_nested_str_weak(http_remotes), + /* K3 */ be_const_int(0), + /* K4 */ be_nested_str_weak(stop_iteration), + /* K5 */ be_nested_str_weak(plugins), + /* K6 */ be_nested_str_weak(get), + /* K7 */ be_nested_str_weak(http_remote), + /* K8 */ be_nested_str_weak(find), + /* K9 */ be_const_int(1), + /* K10 */ be_nested_str_weak(keys), + /* K11 */ be_nested_str_weak(tasmota), + /* K12 */ be_nested_str_weak(log), + /* K13 */ be_nested_str_weak(MTR_X3A_X20remove_X20unused_X20remote_X3A_X20), + /* K14 */ be_nested_str_weak(addr), + /* K15 */ be_const_int(3), + /* K16 */ be_nested_str_weak(close), + /* K17 */ be_nested_str_weak(remove), + }), + be_str_weak(clean_remotes), + &be_const_str_solidified, + ( &(const binstruction[67]) { /* code */ + 0xA4060000, // 0000 IMPORT R1 K0 + 0xA40A0200, // 0001 IMPORT R2 K1 + 0x880C0102, // 0002 GETMBR R3 R0 K2 + 0x780E003D, // 0003 JMPF R3 #0042 + 0x600C0013, // 0004 GETGBL R3 G19 + 0x7C0C0000, // 0005 CALL R3 0 + 0x60100010, // 0006 GETGBL R4 G16 + 0x88140102, // 0007 GETMBR R5 R0 K2 + 0x7C100200, // 0008 CALL R4 1 + 0xA8020003, // 0009 EXBLK 0 #000E + 0x5C140800, // 000A MOVE R5 R4 + 0x7C140000, // 000B CALL R5 0 + 0x980C0B03, // 000C SETIDX R3 R5 K3 + 0x7001FFFB, // 000D JMP #000A + 0x58100004, // 000E LDCONST R4 K4 + 0xAC100200, // 000F CATCH R4 1 0 + 0xB0080000, // 0010 RAISE 2 R0 R0 + 0x60100010, // 0011 GETGBL R4 G16 + 0x88140105, // 0012 GETMBR R5 R0 K5 + 0x7C100200, // 0013 CALL R4 1 + 0xA802000F, // 0014 EXBLK 0 #0025 + 0x5C140800, // 0015 MOVE R5 R4 + 0x7C140000, // 0016 CALL R5 0 + 0x8C180306, // 0017 GETMET R6 R1 K6 + 0x5C200A00, // 0018 MOVE R8 R5 + 0x58240007, // 0019 LDCONST R9 K7 + 0x7C180600, // 001A CALL R6 3 + 0x4C1C0000, // 001B LDNIL R7 + 0x201C0C07, // 001C NE R7 R6 R7 + 0x781E0005, // 001D JMPF R7 #0024 + 0x8C1C0708, // 001E GETMET R7 R3 K8 + 0x5C240C00, // 001F MOVE R9 R6 + 0x58280003, // 0020 LDCONST R10 K3 + 0x7C1C0600, // 0021 CALL R7 3 + 0x001C0F09, // 0022 ADD R7 R7 K9 + 0x980C0C07, // 0023 SETIDX R3 R6 R7 + 0x7001FFEF, // 0024 JMP #0015 + 0x58100004, // 0025 LDCONST R4 K4 + 0xAC100200, // 0026 CATCH R4 1 0 + 0xB0080000, // 0027 RAISE 2 R0 R0 + 0x60100010, // 0028 GETGBL R4 G16 + 0x8C14070A, // 0029 GETMET R5 R3 K10 + 0x7C140200, // 002A CALL R5 1 + 0x7C100200, // 002B CALL R4 1 + 0xA8020011, // 002C EXBLK 0 #003F + 0x5C140800, // 002D MOVE R5 R4 + 0x7C140000, // 002E CALL R5 0 + 0x94180605, // 002F GETIDX R6 R3 R5 + 0x1C180D03, // 0030 EQ R6 R6 K3 + 0x781A000B, // 0031 JMPF R6 #003E + 0xB81A1600, // 0032 GETNGBL R6 K11 + 0x8C180D0C, // 0033 GETMET R6 R6 K12 + 0x88200B0E, // 0034 GETMBR R8 R5 K14 + 0x00221A08, // 0035 ADD R8 K13 R8 + 0x5824000F, // 0036 LDCONST R9 K15 + 0x7C180600, // 0037 CALL R6 3 + 0x8C180B10, // 0038 GETMET R6 R5 K16 + 0x7C180200, // 0039 CALL R6 1 + 0x88180102, // 003A GETMBR R6 R0 K2 + 0x8C180D11, // 003B GETMET R6 R6 K17 + 0x5C200A00, // 003C MOVE R8 R5 + 0x7C180400, // 003D CALL R6 2 + 0x7001FFED, // 003E JMP #002D + 0x58100004, // 003F LDCONST R4 K4 + 0xAC100200, // 0040 CATCH R4 1 0 + 0xB0080000, // 0041 RAISE 2 R0 R0 + 0x80000000, // 0042 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: k2l_num +********************************************************************/ +be_local_closure(Matter_Device_k2l_num, /* name */ + be_nested_proto( + 9, /* nstack */ + 1, /* argc */ + 4, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 6]) { /* constants */ + /* K0 */ be_const_class(be_class_Matter_Device), + /* K1 */ be_nested_str_weak(keys), + /* K2 */ be_nested_str_weak(push), + /* K3 */ be_nested_str_weak(stop_iteration), + /* K4 */ be_const_int(1), + /* K5 */ be_const_int(0), + }), + be_str_weak(k2l_num), + &be_const_str_solidified, + ( &(const binstruction[52]) { /* code */ + 0x58040000, // 0000 LDCONST R1 K0 + 0x60080012, // 0001 GETGBL R2 G18 + 0x7C080000, // 0002 CALL R2 0 + 0x4C0C0000, // 0003 LDNIL R3 + 0x1C0C0003, // 0004 EQ R3 R0 R3 + 0x780E0000, // 0005 JMPF R3 #0007 + 0x80040400, // 0006 RET 1 R2 + 0x600C0010, // 0007 GETGBL R3 G16 + 0x8C100101, // 0008 GETMET R4 R0 K1 + 0x7C100200, // 0009 CALL R4 1 + 0x7C0C0200, // 000A CALL R3 1 + 0xA8020007, // 000B EXBLK 0 #0014 + 0x5C100600, // 000C MOVE R4 R3 + 0x7C100000, // 000D CALL R4 0 + 0x8C140502, // 000E GETMET R5 R2 K2 + 0x601C0009, // 000F GETGBL R7 G9 + 0x5C200800, // 0010 MOVE R8 R4 + 0x7C1C0200, // 0011 CALL R7 1 + 0x7C140400, // 0012 CALL R5 2 + 0x7001FFF7, // 0013 JMP #000C + 0x580C0003, // 0014 LDCONST R3 K3 + 0xAC0C0200, // 0015 CATCH R3 1 0 + 0xB0080000, // 0016 RAISE 2 R0 R0 + 0x600C0010, // 0017 GETGBL R3 G16 + 0x6010000C, // 0018 GETGBL R4 G12 + 0x5C140400, // 0019 MOVE R5 R2 + 0x7C100200, // 001A CALL R4 1 + 0x04100904, // 001B SUB R4 R4 K4 + 0x40120804, // 001C CONNECT R4 K4 R4 + 0x7C0C0200, // 001D CALL R3 1 + 0xA8020010, // 001E EXBLK 0 #0030 + 0x5C100600, // 001F MOVE R4 R3 + 0x7C100000, // 0020 CALL R4 0 + 0x94140404, // 0021 GETIDX R5 R2 R4 + 0x5C180800, // 0022 MOVE R6 R4 + 0x241C0D05, // 0023 GT R7 R6 K5 + 0x781E0008, // 0024 JMPF R7 #002E + 0x041C0D04, // 0025 SUB R7 R6 K4 + 0x941C0407, // 0026 GETIDX R7 R2 R7 + 0x241C0E05, // 0027 GT R7 R7 R5 + 0x781E0004, // 0028 JMPF R7 #002E + 0x041C0D04, // 0029 SUB R7 R6 K4 + 0x941C0407, // 002A GETIDX R7 R2 R7 + 0x98080C07, // 002B SETIDX R2 R6 R7 + 0x04180D04, // 002C SUB R6 R6 K4 + 0x7001FFF4, // 002D JMP #0023 + 0x98080C05, // 002E SETIDX R2 R6 R5 + 0x7001FFEE, // 002F JMP #001F + 0x580C0003, // 0030 LDCONST R3 K3 + 0xAC0C0200, // 0031 CATCH R3 1 0 + 0xB0080000, // 0032 RAISE 2 R0 R0 + 0x80040400, // 0033 RET 1 R2 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: every_50ms +********************************************************************/ +be_local_closure(Matter_Device_every_50ms, /* name */ + be_nested_proto( + 2, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 2]) { /* constants */ + /* K0 */ be_nested_str_weak(tick), + /* K1 */ be_const_int(1), + }), + be_str_weak(every_50ms), + &be_const_str_solidified, + ( &(const binstruction[ 4]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x00040301, // 0001 ADD R1 R1 K1 + 0x90020001, // 0002 SETMBR R0 K0 R1 + 0x80000000, // 0003 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: stop +********************************************************************/ +be_local_closure(Matter_Device_stop, /* name */ + be_nested_proto( + 4, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 4]) { /* constants */ + /* K0 */ be_nested_str_weak(tasmota), + /* K1 */ be_nested_str_weak(remove_driver), + /* K2 */ be_nested_str_weak(udp_server), + /* K3 */ be_nested_str_weak(stop), + }), + be_str_weak(stop), + &be_const_str_solidified, + ( &(const binstruction[10]) { /* code */ + 0xB8060000, // 0000 GETNGBL R1 K0 + 0x8C040301, // 0001 GETMET R1 R1 K1 + 0x5C0C0000, // 0002 MOVE R3 R0 + 0x7C040400, // 0003 CALL R1 2 + 0x88040102, // 0004 GETMBR R1 R0 K2 + 0x78060002, // 0005 JMPF R1 #0009 + 0x88040102, // 0006 GETMBR R1 R0 K2 + 0x8C040303, // 0007 GETMET R1 R1 K3 + 0x7C040200, // 0008 CALL R1 1 + 0x80000000, // 0009 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: mdns_remove_op_discovery_all_fabrics +********************************************************************/ +be_local_closure(Matter_Device_mdns_remove_op_discovery_all_fabrics, /* name */ be_nested_proto( 6, /* nstack */ 1, /* argc */ 2, /* varg */ 0, /* has upvals */ NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 6]) { /* constants */ + /* K0 */ be_nested_str_weak(sessions), + /* K1 */ be_nested_str_weak(active_fabrics), + /* K2 */ be_nested_str_weak(get_device_id), + /* K3 */ be_nested_str_weak(get_fabric_id), + /* K4 */ be_nested_str_weak(mdns_remove_op_discovery), + /* K5 */ be_nested_str_weak(stop_iteration), + }), + be_str_weak(mdns_remove_op_discovery_all_fabrics), + &be_const_str_solidified, + ( &(const binstruction[22]) { /* code */ + 0x60040010, // 0000 GETGBL R1 G16 + 0x88080100, // 0001 GETMBR R2 R0 K0 + 0x8C080501, // 0002 GETMET R2 R2 K1 + 0x7C080200, // 0003 CALL R2 1 + 0x7C040200, // 0004 CALL R1 1 + 0xA802000B, // 0005 EXBLK 0 #0012 + 0x5C080200, // 0006 MOVE R2 R1 + 0x7C080000, // 0007 CALL R2 0 + 0x8C0C0502, // 0008 GETMET R3 R2 K2 + 0x7C0C0200, // 0009 CALL R3 1 + 0x780E0005, // 000A JMPF R3 #0011 + 0x8C0C0503, // 000B GETMET R3 R2 K3 + 0x7C0C0200, // 000C CALL R3 1 + 0x780E0002, // 000D JMPF R3 #0011 + 0x8C0C0104, // 000E GETMET R3 R0 K4 + 0x5C140400, // 000F MOVE R5 R2 + 0x7C0C0400, // 0010 CALL R3 2 + 0x7001FFF3, // 0011 JMP #0006 + 0x58040005, // 0012 LDCONST R1 K5 + 0xAC040200, // 0013 CATCH R1 1 0 + 0xB0080000, // 0014 RAISE 2 R0 R0 + 0x80000000, // 0015 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: register_commands +********************************************************************/ +be_local_closure(Matter_Device_register_commands, /* name */ + be_nested_proto( + 5, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ 1, /* has sup protos */ ( &(const struct bproto*[ 1]) { be_nested_proto( - 2, /* nstack */ - 0, /* argc */ + 10, /* nstack */ + 4, /* argc */ 0, /* varg */ 1, /* has upvals */ ( &(const bupvaldesc[ 1]) { /* upvals */ @@ -4897,53 +3480,38 @@ be_local_closure(Matter_Device_start, /* name */ NULL, /* no sub protos */ 1, /* has constants */ ( &(const bvalue[ 1]) { /* constants */ - /* K0 */ be_nested_str_weak(_trigger_read_sensors), + /* K0 */ be_nested_str_weak(MtrJoin), }), - be_str_weak(_anonymous_), + be_str_weak(_X3Clambda_X3E), &be_const_str_solidified, - ( &(const binstruction[ 4]) { /* code */ - 0x68000000, // 0000 GETUPV R0 U0 - 0x8C000100, // 0001 GETMET R0 R0 K0 - 0x7C000200, // 0002 CALL R0 1 - 0x80000000, // 0003 RET 0 + ( &(const binstruction[ 8]) { /* code */ + 0x68100000, // 0000 GETUPV R4 U0 + 0x8C100900, // 0001 GETMET R4 R4 K0 + 0x5C180000, // 0002 MOVE R6 R0 + 0x5C1C0200, // 0003 MOVE R7 R1 + 0x5C200400, // 0004 MOVE R8 R2 + 0x5C240600, // 0005 MOVE R9 R3 + 0x7C100A00, // 0006 CALL R4 5 + 0x80040800, // 0007 RET 1 R4 }) ), }), 1, /* has constants */ - ( &(const bvalue[ 9]) { /* constants */ - /* K0 */ be_nested_str_weak(started), - /* K1 */ be_nested_str_weak(autoconf_device), - /* K2 */ be_nested_str_weak(tasmota), - /* K3 */ be_nested_str_weak(add_cron), - /* K4 */ be_nested_str_weak(_X2A_X2F30_X20_X2A_X20_X2A_X20_X2A_X20_X2A_X20_X2A), - /* K5 */ be_nested_str_weak(matter_sensors_30s), - /* K6 */ be_nested_str_weak(_start_udp), - /* K7 */ be_nested_str_weak(UDP_PORT), - /* K8 */ be_nested_str_weak(start_mdns_announce_hostnames), + ( &(const bvalue[ 3]) { /* constants */ + /* K0 */ be_nested_str_weak(tasmota), + /* K1 */ be_nested_str_weak(add_cmd), + /* K2 */ be_nested_str_weak(MtrJoin), }), - be_str_weak(start), + be_str_weak(register_commands), &be_const_str_solidified, - ( &(const binstruction[20]) { /* code */ - 0x88040100, // 0000 GETMBR R1 R0 K0 - 0x78060000, // 0001 JMPF R1 #0003 - 0x80000200, // 0002 RET 0 - 0x8C040101, // 0003 GETMET R1 R0 K1 - 0x7C040200, // 0004 CALL R1 1 - 0xB8060400, // 0005 GETNGBL R1 K2 - 0x8C040303, // 0006 GETMET R1 R1 K3 - 0x580C0004, // 0007 LDCONST R3 K4 - 0x84100000, // 0008 CLOSURE R4 P0 - 0x58140005, // 0009 LDCONST R5 K5 - 0x7C040800, // 000A CALL R1 4 - 0x8C040106, // 000B GETMET R1 R0 K6 - 0x880C0107, // 000C GETMBR R3 R0 K7 - 0x7C040400, // 000D CALL R1 2 - 0x8C040108, // 000E GETMET R1 R0 K8 - 0x7C040200, // 000F CALL R1 1 - 0x50040200, // 0010 LDBOOL R1 1 0 - 0x90020001, // 0011 SETMBR R0 K0 R1 - 0xA0000000, // 0012 CLOSE R0 - 0x80000000, // 0013 RET 0 + ( &(const binstruction[ 7]) { /* code */ + 0xB8060000, // 0000 GETNGBL R1 K0 + 0x8C040301, // 0001 GETMET R1 R1 K1 + 0x580C0002, // 0002 LDCONST R3 K2 + 0x84100000, // 0003 CLOSURE R4 P0 + 0x7C040600, // 0004 CALL R1 3 + 0xA0000000, // 0005 CLOSE R0 + 0x80000000, // 0006 RET 0 }) ) ); @@ -4951,9 +3519,698 @@ be_local_closure(Matter_Device_start, /* name */ /******************************************************************** -** Solidified function: start_commissioning_complete_deferred +** Solidified function: register_http_remote ********************************************************************/ -be_local_closure(Matter_Device_start_commissioning_complete_deferred, /* name */ +be_local_closure(Matter_Device_register_http_remote, /* name */ + be_nested_proto( + 8, /* nstack */ + 3, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 6]) { /* constants */ + /* K0 */ be_nested_str_weak(http_remotes), + /* K1 */ be_nested_str_weak(contains), + /* K2 */ be_nested_str_weak(get_timeout), + /* K3 */ be_nested_str_weak(set_timeout), + /* K4 */ be_nested_str_weak(matter), + /* K5 */ be_nested_str_weak(HTTP_remote), + }), + be_str_weak(register_http_remote), + &be_const_str_solidified, + ( &(const binstruction[32]) { /* code */ + 0x880C0100, // 0000 GETMBR R3 R0 K0 + 0x4C100000, // 0001 LDNIL R4 + 0x1C0C0604, // 0002 EQ R3 R3 R4 + 0x780E0002, // 0003 JMPF R3 #0007 + 0x600C0013, // 0004 GETGBL R3 G19 + 0x7C0C0000, // 0005 CALL R3 0 + 0x90020003, // 0006 SETMBR R0 K0 R3 + 0x4C0C0000, // 0007 LDNIL R3 + 0x88100100, // 0008 GETMBR R4 R0 K0 + 0x8C100901, // 0009 GETMET R4 R4 K1 + 0x5C180200, // 000A MOVE R6 R1 + 0x7C100400, // 000B CALL R4 2 + 0x78120009, // 000C JMPF R4 #0017 + 0x88100100, // 000D GETMBR R4 R0 K0 + 0x940C0801, // 000E GETIDX R3 R4 R1 + 0x8C140702, // 000F GETMET R5 R3 K2 + 0x7C140200, // 0010 CALL R5 1 + 0x14140405, // 0011 LT R5 R2 R5 + 0x78160002, // 0012 JMPF R5 #0016 + 0x8C140703, // 0013 GETMET R5 R3 K3 + 0x5C1C0400, // 0014 MOVE R7 R2 + 0x7C140400, // 0015 CALL R5 2 + 0x70020007, // 0016 JMP #001F + 0xB8120800, // 0017 GETNGBL R4 K4 + 0x8C100905, // 0018 GETMET R4 R4 K5 + 0x5C180200, // 0019 MOVE R6 R1 + 0x5C1C0400, // 001A MOVE R7 R2 + 0x7C100600, // 001B CALL R4 3 + 0x5C0C0800, // 001C MOVE R3 R4 + 0x88100100, // 001D GETMBR R4 R0 K0 + 0x98100203, // 001E SETIDX R4 R1 R3 + 0x80040600, // 001F RET 1 R3 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: compute_qrcode_content +********************************************************************/ +be_local_closure(Matter_Device_compute_qrcode_content, /* name */ + be_nested_proto( + 8, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[12]) { /* constants */ + /* K0 */ be_nested_str_weak(resize), + /* K1 */ be_nested_str_weak(setbits), + /* K2 */ be_const_int(3), + /* K3 */ be_nested_str_weak(vendorid), + /* K4 */ be_nested_str_weak(productid), + /* K5 */ be_nested_str_weak(root_discriminator), + /* K6 */ be_nested_str_weak(root_passcode), + /* K7 */ be_const_int(134217727), + /* K8 */ be_nested_str_weak(MT_X3A), + /* K9 */ be_nested_str_weak(matter), + /* K10 */ be_nested_str_weak(Base38), + /* K11 */ be_nested_str_weak(encode), + }), + be_str_weak(compute_qrcode_content), + &be_const_str_solidified, + ( &(const binstruction[40]) { /* code */ + 0x60040015, // 0000 GETGBL R1 G21 + 0x7C040000, // 0001 CALL R1 0 + 0x8C040300, // 0002 GETMET R1 R1 K0 + 0x540E000A, // 0003 LDINT R3 11 + 0x7C040400, // 0004 CALL R1 2 + 0x8C080301, // 0005 GETMET R2 R1 K1 + 0x58100002, // 0006 LDCONST R4 K2 + 0x5416000F, // 0007 LDINT R5 16 + 0x88180103, // 0008 GETMBR R6 R0 K3 + 0x7C080800, // 0009 CALL R2 4 + 0x8C080301, // 000A GETMET R2 R1 K1 + 0x54120012, // 000B LDINT R4 19 + 0x5416000F, // 000C LDINT R5 16 + 0x88180104, // 000D GETMBR R6 R0 K4 + 0x7C080800, // 000E CALL R2 4 + 0x8C080301, // 000F GETMET R2 R1 K1 + 0x54120024, // 0010 LDINT R4 37 + 0x54160007, // 0011 LDINT R5 8 + 0x541A0003, // 0012 LDINT R6 4 + 0x7C080800, // 0013 CALL R2 4 + 0x8C080301, // 0014 GETMET R2 R1 K1 + 0x5412002C, // 0015 LDINT R4 45 + 0x5416000B, // 0016 LDINT R5 12 + 0x88180105, // 0017 GETMBR R6 R0 K5 + 0x541E0FFE, // 0018 LDINT R7 4095 + 0x2C180C07, // 0019 AND R6 R6 R7 + 0x7C080800, // 001A CALL R2 4 + 0x8C080301, // 001B GETMET R2 R1 K1 + 0x54120038, // 001C LDINT R4 57 + 0x5416001A, // 001D LDINT R5 27 + 0x88180106, // 001E GETMBR R6 R0 K6 + 0x2C180D07, // 001F AND R6 R6 K7 + 0x7C080800, // 0020 CALL R2 4 + 0xB80A1200, // 0021 GETNGBL R2 K9 + 0x8808050A, // 0022 GETMBR R2 R2 K10 + 0x8C08050B, // 0023 GETMET R2 R2 K11 + 0x5C100200, // 0024 MOVE R4 R1 + 0x7C080400, // 0025 CALL R2 2 + 0x000A1002, // 0026 ADD R2 K8 R2 + 0x80040400, // 0027 RET 1 R2 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: start_operational_discovery +********************************************************************/ +be_local_closure(Matter_Device_start_operational_discovery, /* name */ + be_nested_proto( + 8, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 7]) { /* constants */ + /* K0 */ be_nested_str_weak(crypto), + /* K1 */ be_nested_str_weak(mdns), + /* K2 */ be_nested_str_weak(string), + /* K3 */ be_nested_str_weak(stop_basic_commissioning), + /* K4 */ be_nested_str_weak(root_w0), + /* K5 */ be_nested_str_weak(root_L), + /* K6 */ be_nested_str_weak(mdns_announce_op_discovery), + }), + be_str_weak(start_operational_discovery), + &be_const_str_solidified, + ( &(const binstruction[13]) { /* code */ + 0xA40A0000, // 0000 IMPORT R2 K0 + 0xA40E0200, // 0001 IMPORT R3 K1 + 0xA4120400, // 0002 IMPORT R4 K2 + 0x8C140103, // 0003 GETMET R5 R0 K3 + 0x7C140200, // 0004 CALL R5 1 + 0x4C140000, // 0005 LDNIL R5 + 0x90020805, // 0006 SETMBR R0 K4 R5 + 0x4C140000, // 0007 LDNIL R5 + 0x90020A05, // 0008 SETMBR R0 K5 R5 + 0x8C140106, // 0009 GETMET R5 R0 K6 + 0x5C1C0200, // 000A MOVE R7 R1 + 0x7C140400, // 000B CALL R5 2 + 0x80000000, // 000C RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: register_plugin_class +********************************************************************/ +be_local_closure(Matter_Device_register_plugin_class, /* name */ + be_nested_proto( + 7, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 4]) { /* constants */ + /* K0 */ be_nested_str_weak(introspect), + /* K1 */ be_nested_str_weak(get), + /* K2 */ be_nested_str_weak(TYPE), + /* K3 */ be_nested_str_weak(plugins_classes), + }), + be_str_weak(register_plugin_class), + &be_const_str_solidified, + ( &(const binstruction[ 9]) { /* code */ + 0xA40A0000, // 0000 IMPORT R2 K0 + 0x8C0C0501, // 0001 GETMET R3 R2 K1 + 0x5C140200, // 0002 MOVE R5 R1 + 0x58180002, // 0003 LDCONST R6 K2 + 0x7C0C0600, // 0004 CALL R3 3 + 0x780E0001, // 0005 JMPF R3 #0008 + 0x88100103, // 0006 GETMBR R4 R0 K3 + 0x98100601, // 0007 SETIDX R4 R3 R1 + 0x80000000, // 0008 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: _trigger_read_sensors +********************************************************************/ +be_local_closure(Matter_Device__trigger_read_sensors, /* name */ + be_nested_proto( + 8, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[11]) { /* constants */ + /* K0 */ be_nested_str_weak(json), + /* K1 */ be_nested_str_weak(tasmota), + /* K2 */ be_nested_str_weak(read_sensors), + /* K3 */ be_nested_str_weak(load), + /* K4 */ be_const_int(0), + /* K5 */ be_nested_str_weak(plugins), + /* K6 */ be_nested_str_weak(parse_sensors), + /* K7 */ be_const_int(1), + /* K8 */ be_nested_str_weak(log), + /* K9 */ be_nested_str_weak(MTR_X3A_X20unable_X20to_X20parse_X20read_sensors_X3A_X20), + /* K10 */ be_const_int(3), + }), + be_str_weak(_trigger_read_sensors), + &be_const_str_solidified, + ( &(const binstruction[37]) { /* code */ + 0xA4060000, // 0000 IMPORT R1 K0 + 0xB80A0200, // 0001 GETNGBL R2 K1 + 0x8C080502, // 0002 GETMET R2 R2 K2 + 0x7C080200, // 0003 CALL R2 1 + 0x4C0C0000, // 0004 LDNIL R3 + 0x1C0C0403, // 0005 EQ R3 R2 R3 + 0x780E0000, // 0006 JMPF R3 #0008 + 0x80000600, // 0007 RET 0 + 0x8C0C0303, // 0008 GETMET R3 R1 K3 + 0x5C140400, // 0009 MOVE R5 R2 + 0x7C0C0400, // 000A CALL R3 2 + 0x4C100000, // 000B LDNIL R4 + 0x20100604, // 000C NE R4 R3 R4 + 0x7812000D, // 000D JMPF R4 #001C + 0x58100004, // 000E LDCONST R4 K4 + 0x6014000C, // 000F GETGBL R5 G12 + 0x88180105, // 0010 GETMBR R6 R0 K5 + 0x7C140200, // 0011 CALL R5 1 + 0x14140805, // 0012 LT R5 R4 R5 + 0x78160006, // 0013 JMPF R5 #001B + 0x88140105, // 0014 GETMBR R5 R0 K5 + 0x94140A04, // 0015 GETIDX R5 R5 R4 + 0x8C140B06, // 0016 GETMET R5 R5 K6 + 0x5C1C0600, // 0017 MOVE R7 R3 + 0x7C140400, // 0018 CALL R5 2 + 0x00100907, // 0019 ADD R4 R4 K7 + 0x7001FFF3, // 001A JMP #000F + 0x70020007, // 001B JMP #0024 + 0xB8120200, // 001C GETNGBL R4 K1 + 0x8C100908, // 001D GETMET R4 R4 K8 + 0x60180008, // 001E GETGBL R6 G8 + 0x5C1C0400, // 001F MOVE R7 R2 + 0x7C180200, // 0020 CALL R6 1 + 0x001A1206, // 0021 ADD R6 K9 R6 + 0x581C000A, // 0022 LDCONST R7 K10 + 0x7C100600, // 0023 CALL R4 3 + 0x80000000, // 0024 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: bridge_add_endpoint +********************************************************************/ +be_local_closure(Matter_Device_bridge_add_endpoint, /* name */ + be_nested_proto( + 19, /* nstack */ + 3, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[23]) { /* constants */ + /* K0 */ be_nested_str_weak(string), + /* K1 */ be_nested_str_weak(plugins_classes), + /* K2 */ be_nested_str_weak(find), + /* K3 */ be_nested_str_weak(tasmota), + /* K4 */ be_nested_str_weak(log), + /* K5 */ be_nested_str_weak(MTR_X3A_X20unknown_X20class_X20name_X20_X27), + /* K6 */ be_nested_str_weak(_X27_X20skipping), + /* K7 */ be_const_int(3), + /* K8 */ be_nested_str_weak(next_ep), + /* K9 */ be_nested_str_weak(plugins), + /* K10 */ be_nested_str_weak(push), + /* K11 */ be_nested_str_weak(type), + /* K12 */ be_nested_str_weak(keys), + /* K13 */ be_nested_str_weak(stop_iteration), + /* K14 */ be_nested_str_weak(format), + /* K15 */ be_nested_str_weak(MTR_X3A_X20adding_X20endpoint_X20_X3D_X20_X25i_X20type_X20_X3D_X20_X25s_X25s), + /* K16 */ be_nested_str_weak(conf_to_log), + /* K17 */ be_const_int(2), + /* K18 */ be_nested_str_weak(plugins_config), + /* K19 */ be_nested_str_weak(plugins_persist), + /* K20 */ be_const_int(1), + /* K21 */ be_nested_str_weak(save_param), + /* K22 */ be_nested_str_weak(signal_endpoints_changed), + }), + be_str_weak(bridge_add_endpoint), + &be_const_str_solidified, + ( &(const binstruction[71]) { /* code */ + 0xA40E0000, // 0000 IMPORT R3 K0 + 0x88100101, // 0001 GETMBR R4 R0 K1 + 0x8C100902, // 0002 GETMET R4 R4 K2 + 0x5C180200, // 0003 MOVE R6 R1 + 0x7C100400, // 0004 CALL R4 2 + 0x4C140000, // 0005 LDNIL R5 + 0x1C140805, // 0006 EQ R5 R4 R5 + 0x78160009, // 0007 JMPF R5 #0012 + 0xB8160600, // 0008 GETNGBL R5 K3 + 0x8C140B04, // 0009 GETMET R5 R5 K4 + 0x601C0008, // 000A GETGBL R7 G8 + 0x5C200200, // 000B MOVE R8 R1 + 0x7C1C0200, // 000C CALL R7 1 + 0x001E0A07, // 000D ADD R7 K5 R7 + 0x001C0F06, // 000E ADD R7 R7 K6 + 0x58200007, // 000F LDCONST R8 K7 + 0x7C140600, // 0010 CALL R5 3 + 0x80000A00, // 0011 RET 0 + 0x88140108, // 0012 GETMBR R5 R0 K8 + 0x60180008, // 0013 GETGBL R6 G8 + 0x5C1C0A00, // 0014 MOVE R7 R5 + 0x7C180200, // 0015 CALL R6 1 + 0x5C1C0800, // 0016 MOVE R7 R4 + 0x5C200000, // 0017 MOVE R8 R0 + 0x5C240A00, // 0018 MOVE R9 R5 + 0x5C280400, // 0019 MOVE R10 R2 + 0x7C1C0600, // 001A CALL R7 3 + 0x88200109, // 001B GETMBR R8 R0 K9 + 0x8C20110A, // 001C GETMET R8 R8 K10 + 0x5C280E00, // 001D MOVE R10 R7 + 0x7C200400, // 001E CALL R8 2 + 0x60200013, // 001F GETGBL R8 G19 + 0x7C200000, // 0020 CALL R8 0 + 0x98221601, // 0021 SETIDX R8 K11 R1 + 0x60240010, // 0022 GETGBL R9 G16 + 0x8C28050C, // 0023 GETMET R10 R2 K12 + 0x7C280200, // 0024 CALL R10 1 + 0x7C240200, // 0025 CALL R9 1 + 0xA8020004, // 0026 EXBLK 0 #002C + 0x5C281200, // 0027 MOVE R10 R9 + 0x7C280000, // 0028 CALL R10 0 + 0x942C040A, // 0029 GETIDX R11 R2 R10 + 0x9820140B, // 002A SETIDX R8 R10 R11 + 0x7001FFFA, // 002B JMP #0027 + 0x5824000D, // 002C LDCONST R9 K13 + 0xAC240200, // 002D CATCH R9 1 0 + 0xB0080000, // 002E RAISE 2 R0 R0 + 0xB8260600, // 002F GETNGBL R9 K3 + 0x8C241304, // 0030 GETMET R9 R9 K4 + 0x8C2C070E, // 0031 GETMET R11 R3 K14 + 0x5834000F, // 0032 LDCONST R13 K15 + 0x5C380A00, // 0033 MOVE R14 R5 + 0x5C3C0200, // 0034 MOVE R15 R1 + 0x8C400110, // 0035 GETMET R16 R0 K16 + 0x5C480400, // 0036 MOVE R18 R2 + 0x7C400400, // 0037 CALL R16 2 + 0x7C2C0A00, // 0038 CALL R11 5 + 0x58300011, // 0039 LDCONST R12 K17 + 0x7C240600, // 003A CALL R9 3 + 0x88240112, // 003B GETMBR R9 R0 K18 + 0x98240C08, // 003C SETIDX R9 R6 R8 + 0x50240200, // 003D LDBOOL R9 1 0 + 0x90022609, // 003E SETMBR R0 K19 R9 + 0x88240108, // 003F GETMBR R9 R0 K8 + 0x00241314, // 0040 ADD R9 R9 K20 + 0x90021009, // 0041 SETMBR R0 K8 R9 + 0x8C240115, // 0042 GETMET R9 R0 K21 + 0x7C240200, // 0043 CALL R9 1 + 0x8C240116, // 0044 GETMET R9 R0 K22 + 0x7C240200, // 0045 CALL R9 1 + 0x80040A00, // 0046 RET 1 R5 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: load_param +********************************************************************/ +be_local_closure(Matter_Device_load_param, /* name */ + be_nested_proto( + 12, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[32]) { /* constants */ + /* K0 */ be_nested_str_weak(string), + /* K1 */ be_nested_str_weak(crypto), + /* K2 */ be_nested_str_weak(FILENAME), + /* K3 */ be_nested_str_weak(read), + /* K4 */ be_nested_str_weak(close), + /* K5 */ be_nested_str_weak(json), + /* K6 */ be_nested_str_weak(load), + /* K7 */ be_nested_str_weak(root_discriminator), + /* K8 */ be_nested_str_weak(find), + /* K9 */ be_nested_str_weak(distinguish), + /* K10 */ be_nested_str_weak(root_passcode), + /* K11 */ be_nested_str_weak(passcode), + /* K12 */ be_nested_str_weak(ipv4only), + /* K13 */ be_nested_str_weak(next_ep), + /* K14 */ be_nested_str_weak(nextep), + /* K15 */ be_nested_str_weak(plugins_config), + /* K16 */ be_nested_str_weak(config), + /* K17 */ be_nested_str_weak(tasmota), + /* K18 */ be_nested_str_weak(log), + /* K19 */ be_nested_str_weak(MTR_X3A_X20load_config_X20_X3D_X20), + /* K20 */ be_const_int(3), + /* K21 */ be_nested_str_weak(adjust_next_ep), + /* K22 */ be_nested_str_weak(plugins_persist), + /* K23 */ be_nested_str_weak(io_error), + /* K24 */ be_nested_str_weak(MTR_X3A_X20Session_Store_X3A_X3Aload_X20Exception_X3A), + /* K25 */ be_nested_str_weak(_X7C), + /* K26 */ be_const_int(2), + /* K27 */ be_nested_str_weak(random), + /* K28 */ be_nested_str_weak(get), + /* K29 */ be_const_int(0), + /* K30 */ be_nested_str_weak(generate_random_passcode), + /* K31 */ be_nested_str_weak(save_param), + }), + be_str_weak(load_param), + &be_const_str_solidified, + ( &(const binstruction[105]) { /* code */ + 0xA4060000, // 0000 IMPORT R1 K0 + 0xA40A0200, // 0001 IMPORT R2 K1 + 0xA8020036, // 0002 EXBLK 0 #003A + 0x600C0011, // 0003 GETGBL R3 G17 + 0x88100102, // 0004 GETMBR R4 R0 K2 + 0x7C0C0200, // 0005 CALL R3 1 + 0x8C100703, // 0006 GETMET R4 R3 K3 + 0x7C100200, // 0007 CALL R4 1 + 0x8C140704, // 0008 GETMET R5 R3 K4 + 0x7C140200, // 0009 CALL R5 1 + 0xA4160A00, // 000A IMPORT R5 K5 + 0x8C180B06, // 000B GETMET R6 R5 K6 + 0x5C200800, // 000C MOVE R8 R4 + 0x7C180400, // 000D CALL R6 2 + 0x8C1C0D08, // 000E GETMET R7 R6 K8 + 0x58240009, // 000F LDCONST R9 K9 + 0x88280107, // 0010 GETMBR R10 R0 K7 + 0x7C1C0600, // 0011 CALL R7 3 + 0x90020E07, // 0012 SETMBR R0 K7 R7 + 0x8C1C0D08, // 0013 GETMET R7 R6 K8 + 0x5824000B, // 0014 LDCONST R9 K11 + 0x8828010A, // 0015 GETMBR R10 R0 K10 + 0x7C1C0600, // 0016 CALL R7 3 + 0x90021407, // 0017 SETMBR R0 K10 R7 + 0x601C0017, // 0018 GETGBL R7 G23 + 0x8C200D08, // 0019 GETMET R8 R6 K8 + 0x5828000C, // 001A LDCONST R10 K12 + 0x502C0000, // 001B LDBOOL R11 0 0 + 0x7C200600, // 001C CALL R8 3 + 0x7C1C0200, // 001D CALL R7 1 + 0x90021807, // 001E SETMBR R0 K12 R7 + 0x8C1C0D08, // 001F GETMET R7 R6 K8 + 0x5824000E, // 0020 LDCONST R9 K14 + 0x8828010D, // 0021 GETMBR R10 R0 K13 + 0x7C1C0600, // 0022 CALL R7 3 + 0x90021A07, // 0023 SETMBR R0 K13 R7 + 0x8C1C0D08, // 0024 GETMET R7 R6 K8 + 0x58240010, // 0025 LDCONST R9 K16 + 0x7C1C0400, // 0026 CALL R7 2 + 0x90021E07, // 0027 SETMBR R0 K15 R7 + 0x881C010F, // 0028 GETMBR R7 R0 K15 + 0x4C200000, // 0029 LDNIL R8 + 0x201C0E08, // 002A NE R7 R7 R8 + 0x781E000B, // 002B JMPF R7 #0038 + 0xB81E2200, // 002C GETNGBL R7 K17 + 0x8C1C0F12, // 002D GETMET R7 R7 K18 + 0x60240008, // 002E GETGBL R9 G8 + 0x8828010F, // 002F GETMBR R10 R0 K15 + 0x7C240200, // 0030 CALL R9 1 + 0x00262609, // 0031 ADD R9 K19 R9 + 0x58280014, // 0032 LDCONST R10 K20 + 0x7C1C0600, // 0033 CALL R7 3 + 0x8C1C0115, // 0034 GETMET R7 R0 K21 + 0x7C1C0200, // 0035 CALL R7 1 + 0x501C0200, // 0036 LDBOOL R7 1 0 + 0x90022C07, // 0037 SETMBR R0 K22 R7 + 0xA8040001, // 0038 EXBLK 1 1 + 0x70020012, // 0039 JMP #004D + 0xAC0C0002, // 003A CATCH R3 0 2 + 0x7002000F, // 003B JMP #004C + 0x20140717, // 003C NE R5 R3 K23 + 0x7816000C, // 003D JMPF R5 #004B + 0xB8162200, // 003E GETNGBL R5 K17 + 0x8C140B12, // 003F GETMET R5 R5 K18 + 0x601C0008, // 0040 GETGBL R7 G8 + 0x5C200600, // 0041 MOVE R8 R3 + 0x7C1C0200, // 0042 CALL R7 1 + 0x001E3007, // 0043 ADD R7 K24 R7 + 0x001C0F19, // 0044 ADD R7 R7 K25 + 0x60200008, // 0045 GETGBL R8 G8 + 0x5C240800, // 0046 MOVE R9 R4 + 0x7C200200, // 0047 CALL R8 1 + 0x001C0E08, // 0048 ADD R7 R7 R8 + 0x5820001A, // 0049 LDCONST R8 K26 + 0x7C140600, // 004A CALL R5 3 + 0x70020000, // 004B JMP #004D + 0xB0080000, // 004C RAISE 2 R0 R0 + 0x500C0000, // 004D LDBOOL R3 0 0 + 0x88100107, // 004E GETMBR R4 R0 K7 + 0x4C140000, // 004F LDNIL R5 + 0x1C100805, // 0050 EQ R4 R4 R5 + 0x7812000A, // 0051 JMPF R4 #005D + 0x8C10051B, // 0052 GETMET R4 R2 K27 + 0x5818001A, // 0053 LDCONST R6 K26 + 0x7C100400, // 0054 CALL R4 2 + 0x8C10091C, // 0055 GETMET R4 R4 K28 + 0x5818001D, // 0056 LDCONST R6 K29 + 0x581C001A, // 0057 LDCONST R7 K26 + 0x7C100600, // 0058 CALL R4 3 + 0x54160FFE, // 0059 LDINT R5 4095 + 0x2C100805, // 005A AND R4 R4 R5 + 0x90020E04, // 005B SETMBR R0 K7 R4 + 0x500C0200, // 005C LDBOOL R3 1 0 + 0x8810010A, // 005D GETMBR R4 R0 K10 + 0x4C140000, // 005E LDNIL R5 + 0x1C100805, // 005F EQ R4 R4 R5 + 0x78120003, // 0060 JMPF R4 #0065 + 0x8C10011E, // 0061 GETMET R4 R0 K30 + 0x7C100200, // 0062 CALL R4 1 + 0x90021404, // 0063 SETMBR R0 K10 R4 + 0x500C0200, // 0064 LDBOOL R3 1 0 + 0x780E0001, // 0065 JMPF R3 #0068 + 0x8C10011F, // 0066 GETMET R4 R0 K31 + 0x7C100200, // 0067 CALL R4 1 + 0x80000000, // 0068 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: compute_manual_pairing_code +********************************************************************/ +be_local_closure(Matter_Device_compute_manual_pairing_code, /* name */ + be_nested_proto( + 11, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 8]) { /* constants */ + /* K0 */ be_nested_str_weak(string), + /* K1 */ be_nested_str_weak(root_discriminator), + /* K2 */ be_nested_str_weak(root_passcode), + /* K3 */ be_nested_str_weak(format), + /* K4 */ be_nested_str_weak(_X251i_X2505i_X2504i), + /* K5 */ be_nested_str_weak(matter), + /* K6 */ be_nested_str_weak(Verhoeff), + /* K7 */ be_nested_str_weak(checksum), + }), + be_str_weak(compute_manual_pairing_code), + &be_const_str_solidified, + ( &(const binstruction[31]) { /* code */ + 0xA4060000, // 0000 IMPORT R1 K0 + 0x88080101, // 0001 GETMBR R2 R0 K1 + 0x540E0FFE, // 0002 LDINT R3 4095 + 0x2C080403, // 0003 AND R2 R2 R3 + 0x540E0009, // 0004 LDINT R3 10 + 0x3C080403, // 0005 SHR R2 R2 R3 + 0x880C0101, // 0006 GETMBR R3 R0 K1 + 0x541202FF, // 0007 LDINT R4 768 + 0x2C0C0604, // 0008 AND R3 R3 R4 + 0x54120005, // 0009 LDINT R4 6 + 0x380C0604, // 000A SHL R3 R3 R4 + 0x88100102, // 000B GETMBR R4 R0 K2 + 0x54163FFE, // 000C LDINT R5 16383 + 0x2C100805, // 000D AND R4 R4 R5 + 0x300C0604, // 000E OR R3 R3 R4 + 0x88100102, // 000F GETMBR R4 R0 K2 + 0x5416000D, // 0010 LDINT R5 14 + 0x3C100805, // 0011 SHR R4 R4 R5 + 0x8C140303, // 0012 GETMET R5 R1 K3 + 0x581C0004, // 0013 LDCONST R7 K4 + 0x5C200400, // 0014 MOVE R8 R2 + 0x5C240600, // 0015 MOVE R9 R3 + 0x5C280800, // 0016 MOVE R10 R4 + 0x7C140A00, // 0017 CALL R5 5 + 0xB81A0A00, // 0018 GETNGBL R6 K5 + 0x88180D06, // 0019 GETMBR R6 R6 K6 + 0x8C180D07, // 001A GETMET R6 R6 K7 + 0x5C200A00, // 001B MOVE R8 R5 + 0x7C180400, // 001C CALL R6 2 + 0x00140A06, // 001D ADD R5 R5 R6 + 0x80040A00, // 001E RET 1 R5 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: invoke_request +********************************************************************/ +be_local_closure(Matter_Device_invoke_request, /* name */ + be_nested_proto( + 12, /* nstack */ + 4, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 8]) { /* constants */ + /* K0 */ be_const_int(0), + /* K1 */ be_nested_str_weak(endpoint), + /* K2 */ be_nested_str_weak(plugins), + /* K3 */ be_nested_str_weak(invoke_request), + /* K4 */ be_const_int(1), + /* K5 */ be_nested_str_weak(status), + /* K6 */ be_nested_str_weak(matter), + /* K7 */ be_nested_str_weak(UNSUPPORTED_ENDPOINT), + }), + be_str_weak(invoke_request), + &be_const_str_solidified, + ( &(const binstruction[24]) { /* code */ + 0x58100000, // 0000 LDCONST R4 K0 + 0x88140701, // 0001 GETMBR R5 R3 K1 + 0x6018000C, // 0002 GETGBL R6 G12 + 0x881C0102, // 0003 GETMBR R7 R0 K2 + 0x7C180200, // 0004 CALL R6 1 + 0x14180806, // 0005 LT R6 R4 R6 + 0x781A000C, // 0006 JMPF R6 #0014 + 0x88180102, // 0007 GETMBR R6 R0 K2 + 0x94180C04, // 0008 GETIDX R6 R6 R4 + 0x881C0D01, // 0009 GETMBR R7 R6 K1 + 0x1C1C0E05, // 000A EQ R7 R7 R5 + 0x781E0005, // 000B JMPF R7 #0012 + 0x8C1C0D03, // 000C GETMET R7 R6 K3 + 0x5C240200, // 000D MOVE R9 R1 + 0x5C280400, // 000E MOVE R10 R2 + 0x5C2C0600, // 000F MOVE R11 R3 + 0x7C1C0800, // 0010 CALL R7 4 + 0x80040E00, // 0011 RET 1 R7 + 0x00100904, // 0012 ADD R4 R4 K4 + 0x7001FFED, // 0013 JMP #0002 + 0xB81A0C00, // 0014 GETNGBL R6 K6 + 0x88180D07, // 0015 GETMBR R6 R6 K7 + 0x900E0A06, // 0016 SETMBR R3 K5 R6 + 0x80000000, // 0017 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: start_operational_discovery_deferred +********************************************************************/ +be_local_closure(Matter_Device_start_operational_discovery_deferred, /* name */ be_nested_proto( 6, /* nstack */ 2, /* argc */ @@ -4975,7 +4232,7 @@ be_local_closure(Matter_Device_start_commissioning_complete_deferred, /* name NULL, /* no sub protos */ 1, /* has constants */ ( &(const bvalue[ 1]) { /* constants */ - /* K0 */ be_nested_str_weak(start_commissioning_complete), + /* K0 */ be_nested_str_weak(start_operational_discovery), }), be_str_weak(_X3Clambda_X3E), &be_const_str_solidified, @@ -4994,7 +4251,7 @@ be_local_closure(Matter_Device_start_commissioning_complete_deferred, /* name /* K1 */ be_nested_str_weak(set_timer), /* K2 */ be_const_int(0), }), - be_str_weak(start_commissioning_complete_deferred), + be_str_weak(start_operational_discovery_deferred), &be_const_str_solidified, ( &(const binstruction[ 7]) { /* code */ 0xB80A0000, // 0000 GETNGBL R2 K0 @@ -5010,216 +4267,6 @@ be_local_closure(Matter_Device_start_commissioning_complete_deferred, /* name /*******************************************************************/ -/******************************************************************** -** Solidified function: start_mdns_announce_hostnames -********************************************************************/ -be_local_closure(Matter_Device_start_mdns_announce_hostnames, /* name */ - be_nested_proto( - 6, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 1, /* has sup protos */ - ( &(const struct bproto*[ 2]) { - be_nested_proto( - 4, /* nstack */ - 0, /* argc */ - 0, /* varg */ - 1, /* has upvals */ - ( &(const bupvaldesc[ 1]) { /* upvals */ - be_local_const_upval(1, 0), - }), - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 5]) { /* constants */ - /* K0 */ be_nested_str_weak(_mdns_announce_hostname), - /* K1 */ be_nested_str_weak(tasmota), - /* K2 */ be_nested_str_weak(remove_rule), - /* K3 */ be_nested_str_weak(Wifi_X23Connected), - /* K4 */ be_nested_str_weak(matter_mdns_host), - }), - be_str_weak(_anonymous_), - &be_const_str_solidified, - ( &(const binstruction[10]) { /* code */ - 0x68000000, // 0000 GETUPV R0 U0 - 0x8C000100, // 0001 GETMET R0 R0 K0 - 0x50080000, // 0002 LDBOOL R2 0 0 - 0x7C000400, // 0003 CALL R0 2 - 0xB8020200, // 0004 GETNGBL R0 K1 - 0x8C000102, // 0005 GETMET R0 R0 K2 - 0x58080003, // 0006 LDCONST R2 K3 - 0x580C0004, // 0007 LDCONST R3 K4 - 0x7C000600, // 0008 CALL R0 3 - 0x80000000, // 0009 RET 0 - }) - ), - be_nested_proto( - 4, /* nstack */ - 0, /* argc */ - 0, /* varg */ - 1, /* has upvals */ - ( &(const bupvaldesc[ 1]) { /* upvals */ - be_local_const_upval(1, 0), - }), - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 5]) { /* constants */ - /* K0 */ be_nested_str_weak(_mdns_announce_hostname), - /* K1 */ be_nested_str_weak(tasmota), - /* K2 */ be_nested_str_weak(remove_rule), - /* K3 */ be_nested_str_weak(Eth_X23Connected), - /* K4 */ be_nested_str_weak(matter_mdns_host), - }), - be_str_weak(_anonymous_), - &be_const_str_solidified, - ( &(const binstruction[10]) { /* code */ - 0x68000000, // 0000 GETUPV R0 U0 - 0x8C000100, // 0001 GETMET R0 R0 K0 - 0x50080200, // 0002 LDBOOL R2 1 0 - 0x7C000400, // 0003 CALL R0 2 - 0xB8020200, // 0004 GETNGBL R0 K1 - 0x8C000102, // 0005 GETMET R0 R0 K2 - 0x58080003, // 0006 LDCONST R2 K3 - 0x580C0004, // 0007 LDCONST R3 K4 - 0x7C000600, // 0008 CALL R0 3 - 0x80000000, // 0009 RET 0 - }) - ), - }), - 1, /* has constants */ - ( &(const bvalue[ 9]) { /* constants */ - /* K0 */ be_nested_str_weak(tasmota), - /* K1 */ be_nested_str_weak(wifi), - /* K2 */ be_nested_str_weak(up), - /* K3 */ be_nested_str_weak(_mdns_announce_hostname), - /* K4 */ be_nested_str_weak(add_rule), - /* K5 */ be_nested_str_weak(Wifi_X23Connected), - /* K6 */ be_nested_str_weak(matter_mdns_host), - /* K7 */ be_nested_str_weak(eth), - /* K8 */ be_nested_str_weak(Eth_X23Connected), - }), - be_str_weak(start_mdns_announce_hostnames), - &be_const_str_solidified, - ( &(const binstruction[32]) { /* code */ - 0xB8060000, // 0000 GETNGBL R1 K0 - 0x8C040301, // 0001 GETMET R1 R1 K1 - 0x7C040200, // 0002 CALL R1 1 - 0x94040302, // 0003 GETIDX R1 R1 K2 - 0x78060003, // 0004 JMPF R1 #0009 - 0x8C040103, // 0005 GETMET R1 R0 K3 - 0x500C0000, // 0006 LDBOOL R3 0 0 - 0x7C040400, // 0007 CALL R1 2 - 0x70020005, // 0008 JMP #000F - 0xB8060000, // 0009 GETNGBL R1 K0 - 0x8C040304, // 000A GETMET R1 R1 K4 - 0x580C0005, // 000B LDCONST R3 K5 - 0x84100000, // 000C CLOSURE R4 P0 - 0x58140006, // 000D LDCONST R5 K6 - 0x7C040800, // 000E CALL R1 4 - 0xB8060000, // 000F GETNGBL R1 K0 - 0x8C040307, // 0010 GETMET R1 R1 K7 - 0x7C040200, // 0011 CALL R1 1 - 0x94040302, // 0012 GETIDX R1 R1 K2 - 0x78060003, // 0013 JMPF R1 #0018 - 0x8C040103, // 0014 GETMET R1 R0 K3 - 0x500C0200, // 0015 LDBOOL R3 1 0 - 0x7C040400, // 0016 CALL R1 2 - 0x70020005, // 0017 JMP #001E - 0xB8060000, // 0018 GETNGBL R1 K0 - 0x8C040304, // 0019 GETMET R1 R1 K4 - 0x580C0008, // 001A LDCONST R3 K8 - 0x84100001, // 001B CLOSURE R4 P1 - 0x58140006, // 001C LDCONST R5 K6 - 0x7C040800, // 001D CALL R1 4 - 0xA0000000, // 001E CLOSE R0 - 0x80000000, // 001F RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: autoconf_device -********************************************************************/ -be_local_closure(Matter_Device_autoconf_device, /* name */ - be_nested_proto( - 7, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[16]) { /* constants */ - /* K0 */ be_nested_str_weak(string), - /* K1 */ be_nested_str_weak(json), - /* K2 */ be_nested_str_weak(plugins), - /* K3 */ be_const_int(0), - /* K4 */ be_nested_str_weak(plugins_persist), - /* K5 */ be_nested_str_weak(plugins_config), - /* K6 */ be_nested_str_weak(autoconf_device_map), - /* K7 */ be_nested_str_weak(adjust_next_ep), - /* K8 */ be_nested_str_weak(tasmota), - /* K9 */ be_nested_str_weak(log), - /* K10 */ be_nested_str_weak(MTR_X3A_X20autoconfig_X20_X3D_X20), - /* K11 */ be_const_int(3), - /* K12 */ be_nested_str_weak(_instantiate_plugins_from_config), - /* K13 */ be_nested_str_weak(sessions), - /* K14 */ be_nested_str_weak(count_active_fabrics), - /* K15 */ be_nested_str_weak(save_param), - }), - be_str_weak(autoconf_device), - &be_const_str_solidified, - ( &(const binstruction[38]) { /* code */ - 0xA4060000, // 0000 IMPORT R1 K0 - 0xA40A0200, // 0001 IMPORT R2 K1 - 0x600C000C, // 0002 GETGBL R3 G12 - 0x88100102, // 0003 GETMBR R4 R0 K2 - 0x7C0C0200, // 0004 CALL R3 1 - 0x240C0703, // 0005 GT R3 R3 K3 - 0x780E0000, // 0006 JMPF R3 #0008 - 0x80000600, // 0007 RET 0 - 0x880C0104, // 0008 GETMBR R3 R0 K4 - 0x740E000C, // 0009 JMPT R3 #0017 - 0x8C0C0106, // 000A GETMET R3 R0 K6 - 0x7C0C0200, // 000B CALL R3 1 - 0x90020A03, // 000C SETMBR R0 K5 R3 - 0x8C0C0107, // 000D GETMET R3 R0 K7 - 0x7C0C0200, // 000E CALL R3 1 - 0xB80E1000, // 000F GETNGBL R3 K8 - 0x8C0C0709, // 0010 GETMET R3 R3 K9 - 0x60140008, // 0011 GETGBL R5 G8 - 0x88180105, // 0012 GETMBR R6 R0 K5 - 0x7C140200, // 0013 CALL R5 1 - 0x00161405, // 0014 ADD R5 K10 R5 - 0x5818000B, // 0015 LDCONST R6 K11 - 0x7C0C0600, // 0016 CALL R3 3 - 0x8C0C010C, // 0017 GETMET R3 R0 K12 - 0x88140105, // 0018 GETMBR R5 R0 K5 - 0x7C0C0400, // 0019 CALL R3 2 - 0x880C0104, // 001A GETMBR R3 R0 K4 - 0x740E0008, // 001B JMPT R3 #0025 - 0x880C010D, // 001C GETMBR R3 R0 K13 - 0x8C0C070E, // 001D GETMET R3 R3 K14 - 0x7C0C0200, // 001E CALL R3 1 - 0x240C0703, // 001F GT R3 R3 K3 - 0x780E0003, // 0020 JMPF R3 #0025 - 0x500C0200, // 0021 LDBOOL R3 1 0 - 0x90020803, // 0022 SETMBR R0 K4 R3 - 0x8C0C010F, // 0023 GETMET R3 R0 K15 - 0x7C0C0200, // 0024 CALL R3 1 - 0x80000000, // 0025 RET 0 - }) - ) -); -/*******************************************************************/ - - /******************************************************************** ** Solidified function: autoconf_device_map ********************************************************************/ @@ -5483,62 +4530,11 @@ be_local_closure(Matter_Device_autoconf_device_map, /* name */ /******************************************************************** -** Solidified function: attribute_updated +** Solidified function: autoconf_device ********************************************************************/ -be_local_closure(Matter_Device_attribute_updated, /* name */ +be_local_closure(Matter_Device_autoconf_device, /* name */ be_nested_proto( - 10, /* nstack */ - 5, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 9]) { /* constants */ - /* K0 */ be_nested_str_weak(matter), - /* K1 */ be_nested_str_weak(Path), - /* K2 */ be_nested_str_weak(endpoint), - /* K3 */ be_nested_str_weak(cluster), - /* K4 */ be_nested_str_weak(attribute), - /* K5 */ be_nested_str_weak(message_handler), - /* K6 */ be_nested_str_weak(im), - /* K7 */ be_nested_str_weak(subs_shop), - /* K8 */ be_nested_str_weak(attribute_updated_ctx), - }), - be_str_weak(attribute_updated), - &be_const_str_solidified, - ( &(const binstruction[18]) { /* code */ - 0x4C140000, // 0000 LDNIL R5 - 0x1C140805, // 0001 EQ R5 R4 R5 - 0x78160000, // 0002 JMPF R5 #0004 - 0x50100000, // 0003 LDBOOL R4 0 0 - 0xB8160000, // 0004 GETNGBL R5 K0 - 0x8C140B01, // 0005 GETMET R5 R5 K1 - 0x7C140200, // 0006 CALL R5 1 - 0x90160401, // 0007 SETMBR R5 K2 R1 - 0x90160602, // 0008 SETMBR R5 K3 R2 - 0x90160803, // 0009 SETMBR R5 K4 R3 - 0x88180105, // 000A GETMBR R6 R0 K5 - 0x88180D06, // 000B GETMBR R6 R6 K6 - 0x88180D07, // 000C GETMBR R6 R6 K7 - 0x8C180D08, // 000D GETMET R6 R6 K8 - 0x5C200A00, // 000E MOVE R8 R5 - 0x5C240800, // 000F MOVE R9 R4 - 0x7C180600, // 0010 CALL R6 3 - 0x80000000, // 0011 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: is_commissioning_open -********************************************************************/ -be_local_closure(Matter_Device_is_commissioning_open, /* name */ - be_nested_proto( - 3, /* nstack */ + 7, /* nstack */ 1, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -5546,16 +4542,1024 @@ be_local_closure(Matter_Device_is_commissioning_open, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[ 1]) { /* constants */ - /* K0 */ be_nested_str_weak(commissioning_open), + ( &(const bvalue[16]) { /* constants */ + /* K0 */ be_nested_str_weak(string), + /* K1 */ be_nested_str_weak(json), + /* K2 */ be_nested_str_weak(plugins), + /* K3 */ be_const_int(0), + /* K4 */ be_nested_str_weak(plugins_persist), + /* K5 */ be_nested_str_weak(plugins_config), + /* K6 */ be_nested_str_weak(autoconf_device_map), + /* K7 */ be_nested_str_weak(adjust_next_ep), + /* K8 */ be_nested_str_weak(tasmota), + /* K9 */ be_nested_str_weak(log), + /* K10 */ be_nested_str_weak(MTR_X3A_X20autoconfig_X20_X3D_X20), + /* K11 */ be_const_int(3), + /* K12 */ be_nested_str_weak(_instantiate_plugins_from_config), + /* K13 */ be_nested_str_weak(sessions), + /* K14 */ be_nested_str_weak(count_active_fabrics), + /* K15 */ be_nested_str_weak(save_param), }), - be_str_weak(is_commissioning_open), + be_str_weak(autoconf_device), &be_const_str_solidified, - ( &(const binstruction[ 4]) { /* code */ - 0x88040100, // 0000 GETMBR R1 R0 K0 + ( &(const binstruction[38]) { /* code */ + 0xA4060000, // 0000 IMPORT R1 K0 + 0xA40A0200, // 0001 IMPORT R2 K1 + 0x600C000C, // 0002 GETGBL R3 G12 + 0x88100102, // 0003 GETMBR R4 R0 K2 + 0x7C0C0200, // 0004 CALL R3 1 + 0x240C0703, // 0005 GT R3 R3 K3 + 0x780E0000, // 0006 JMPF R3 #0008 + 0x80000600, // 0007 RET 0 + 0x880C0104, // 0008 GETMBR R3 R0 K4 + 0x740E000C, // 0009 JMPT R3 #0017 + 0x8C0C0106, // 000A GETMET R3 R0 K6 + 0x7C0C0200, // 000B CALL R3 1 + 0x90020A03, // 000C SETMBR R0 K5 R3 + 0x8C0C0107, // 000D GETMET R3 R0 K7 + 0x7C0C0200, // 000E CALL R3 1 + 0xB80E1000, // 000F GETNGBL R3 K8 + 0x8C0C0709, // 0010 GETMET R3 R3 K9 + 0x60140008, // 0011 GETGBL R5 G8 + 0x88180105, // 0012 GETMBR R6 R0 K5 + 0x7C140200, // 0013 CALL R5 1 + 0x00161405, // 0014 ADD R5 K10 R5 + 0x5818000B, // 0015 LDCONST R6 K11 + 0x7C0C0600, // 0016 CALL R3 3 + 0x8C0C010C, // 0017 GETMET R3 R0 K12 + 0x88140105, // 0018 GETMBR R5 R0 K5 + 0x7C0C0400, // 0019 CALL R3 2 + 0x880C0104, // 001A GETMBR R3 R0 K4 + 0x740E0008, // 001B JMPT R3 #0025 + 0x880C010D, // 001C GETMBR R3 R0 K13 + 0x8C0C070E, // 001D GETMET R3 R3 K14 + 0x7C0C0200, // 001E CALL R3 1 + 0x240C0703, // 001F GT R3 R3 K3 + 0x780E0003, // 0020 JMPF R3 #0025 + 0x500C0200, // 0021 LDBOOL R3 1 0 + 0x90020803, // 0022 SETMBR R0 K4 R3 + 0x8C0C010F, // 0023 GETMET R3 R0 K15 + 0x7C0C0200, // 0024 CALL R3 1 + 0x80000000, // 0025 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: received_ack +********************************************************************/ +be_local_closure(Matter_Device_received_ack, /* name */ + be_nested_proto( + 5, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 2]) { /* constants */ + /* K0 */ be_nested_str_weak(udp_server), + /* K1 */ be_nested_str_weak(received_ack), + }), + be_str_weak(received_ack), + &be_const_str_solidified, + ( &(const binstruction[ 5]) { /* code */ + 0x88080100, // 0000 GETMBR R2 R0 K0 + 0x8C080501, // 0001 GETMET R2 R2 K1 + 0x5C100200, // 0002 MOVE R4 R1 + 0x7C080400, // 0003 CALL R2 2 + 0x80040400, // 0004 RET 1 R2 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: msg_send +********************************************************************/ +be_local_closure(Matter_Device_msg_send, /* name */ + be_nested_proto( + 5, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 2]) { /* constants */ + /* K0 */ be_nested_str_weak(udp_server), + /* K1 */ be_nested_str_weak(send_UDP), + }), + be_str_weak(msg_send), + &be_const_str_solidified, + ( &(const binstruction[ 5]) { /* code */ + 0x88080100, // 0000 GETMBR R2 R0 K0 + 0x8C080501, // 0001 GETMET R2 R2 K1 + 0x5C100200, // 0002 MOVE R4 R1 + 0x7C080400, // 0003 CALL R2 2 + 0x80040400, // 0004 RET 1 R2 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: start_basic_commissioning +********************************************************************/ +be_local_closure(Matter_Device_start_basic_commissioning, /* name */ + be_nested_proto( + 13, /* nstack */ + 8, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 1, /* has sup protos */ + ( &(const struct bproto*[ 2]) { + be_nested_proto( + 4, /* nstack */ + 0, /* argc */ + 0, /* varg */ + 1, /* has upvals */ + ( &(const bupvaldesc[ 1]) { /* upvals */ + be_local_const_upval(1, 0), + }), + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 4]) { /* constants */ + /* K0 */ be_nested_str_weak(mdns_announce_PASE), + /* K1 */ be_nested_str_weak(tasmota), + /* K2 */ be_nested_str_weak(remove_rule), + /* K3 */ be_nested_str_weak(Wifi_X23Connected), + }), + be_str_weak(_anonymous_), + &be_const_str_solidified, + ( &(const binstruction[ 9]) { /* code */ + 0x68000000, // 0000 GETUPV R0 U0 + 0x8C000100, // 0001 GETMET R0 R0 K0 + 0x7C000200, // 0002 CALL R0 1 + 0xB8020200, // 0003 GETNGBL R0 K1 + 0x8C000102, // 0004 GETMET R0 R0 K2 + 0x58080003, // 0005 LDCONST R2 K3 + 0x580C0000, // 0006 LDCONST R3 K0 + 0x7C000600, // 0007 CALL R0 3 + 0x80000000, // 0008 RET 0 + }) + ), + be_nested_proto( + 4, /* nstack */ + 0, /* argc */ + 0, /* varg */ + 1, /* has upvals */ + ( &(const bupvaldesc[ 1]) { /* upvals */ + be_local_const_upval(1, 0), + }), + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 4]) { /* constants */ + /* K0 */ be_nested_str_weak(mdns_announce_PASE), + /* K1 */ be_nested_str_weak(tasmota), + /* K2 */ be_nested_str_weak(remove_rule), + /* K3 */ be_nested_str_weak(Eth_X23Connected), + }), + be_str_weak(_anonymous_), + &be_const_str_solidified, + ( &(const binstruction[ 9]) { /* code */ + 0x68000000, // 0000 GETUPV R0 U0 + 0x8C000100, // 0001 GETMET R0 R0 K0 + 0x7C000200, // 0002 CALL R0 1 + 0xB8020200, // 0003 GETNGBL R0 K1 + 0x8C000102, // 0004 GETMET R0 R0 K2 + 0x58080003, // 0005 LDCONST R2 K3 + 0x580C0000, // 0006 LDCONST R3 K0 + 0x7C000600, // 0007 CALL R0 3 + 0x80000000, // 0008 RET 0 + }) + ), + }), + 1, /* has constants */ + ( &(const bvalue[16]) { /* constants */ + /* K0 */ be_nested_str_weak(commissioning_open), + /* K1 */ be_nested_str_weak(tasmota), + /* K2 */ be_nested_str_weak(millis), + /* K3 */ be_nested_str_weak(commissioning_iterations), + /* K4 */ be_nested_str_weak(commissioning_discriminator), + /* K5 */ be_nested_str_weak(commissioning_salt), + /* K6 */ be_nested_str_weak(commissioning_w0), + /* K7 */ be_nested_str_weak(commissioning_L), + /* K8 */ be_nested_str_weak(commissioning_admin_fabric), + /* K9 */ be_nested_str_weak(wifi), + /* K10 */ be_nested_str_weak(up), + /* K11 */ be_nested_str_weak(eth), + /* K12 */ be_nested_str_weak(mdns_announce_PASE), + /* K13 */ be_nested_str_weak(add_rule), + /* K14 */ be_nested_str_weak(Wifi_X23Connected), + /* K15 */ be_nested_str_weak(Eth_X23Connected), + }), + be_str_weak(start_basic_commissioning), + &be_const_str_solidified, + ( &(const binstruction[40]) { /* code */ + 0xB8220200, // 0000 GETNGBL R8 K1 + 0x8C201102, // 0001 GETMET R8 R8 K2 + 0x7C200200, // 0002 CALL R8 1 + 0x542603E7, // 0003 LDINT R9 1000 + 0x08240209, // 0004 MUL R9 R1 R9 + 0x00201009, // 0005 ADD R8 R8 R9 + 0x90020008, // 0006 SETMBR R0 K0 R8 + 0x90020602, // 0007 SETMBR R0 K3 R2 + 0x90020803, // 0008 SETMBR R0 K4 R3 + 0x90020A04, // 0009 SETMBR R0 K5 R4 + 0x90020C05, // 000A SETMBR R0 K6 R5 + 0x90020E06, // 000B SETMBR R0 K7 R6 + 0x90021007, // 000C SETMBR R0 K8 R7 + 0xB8220200, // 000D GETNGBL R8 K1 + 0x8C201109, // 000E GETMET R8 R8 K9 + 0x7C200200, // 000F CALL R8 1 + 0x9420110A, // 0010 GETIDX R8 R8 K10 + 0x74220004, // 0011 JMPT R8 #0017 + 0xB8220200, // 0012 GETNGBL R8 K1 + 0x8C20110B, // 0013 GETMET R8 R8 K11 + 0x7C200200, // 0014 CALL R8 1 + 0x9420110A, // 0015 GETIDX R8 R8 K10 + 0x78220002, // 0016 JMPF R8 #001A + 0x8C20010C, // 0017 GETMET R8 R0 K12 + 0x7C200200, // 0018 CALL R8 1 + 0x7002000B, // 0019 JMP #0026 + 0xB8220200, // 001A GETNGBL R8 K1 + 0x8C20110D, // 001B GETMET R8 R8 K13 + 0x5828000E, // 001C LDCONST R10 K14 + 0x842C0000, // 001D CLOSURE R11 P0 + 0x5830000C, // 001E LDCONST R12 K12 + 0x7C200800, // 001F CALL R8 4 + 0xB8220200, // 0020 GETNGBL R8 K1 + 0x8C20110D, // 0021 GETMET R8 R8 K13 + 0x5828000F, // 0022 LDCONST R10 K15 + 0x842C0001, // 0023 CLOSURE R11 P1 + 0x5830000C, // 0024 LDCONST R12 K12 + 0x7C200800, // 0025 CALL R8 4 + 0xA0000000, // 0026 CLOSE R0 + 0x80000000, // 0027 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: find_plugin_by_endpoint +********************************************************************/ +be_local_closure(Matter_Device_find_plugin_by_endpoint, /* name */ + be_nested_proto( + 6, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 4]) { /* constants */ + /* K0 */ be_const_int(0), + /* K1 */ be_nested_str_weak(plugins), + /* K2 */ be_nested_str_weak(get_endpoint), + /* K3 */ be_const_int(1), + }), + be_str_weak(find_plugin_by_endpoint), + &be_const_str_solidified, + ( &(const binstruction[17]) { /* code */ + 0x58080000, // 0000 LDCONST R2 K0 + 0x600C000C, // 0001 GETGBL R3 G12 + 0x88100101, // 0002 GETMBR R4 R0 K1 + 0x7C0C0200, // 0003 CALL R3 1 + 0x140C0403, // 0004 LT R3 R2 R3 + 0x780E0008, // 0005 JMPF R3 #000F + 0x880C0101, // 0006 GETMBR R3 R0 K1 + 0x940C0602, // 0007 GETIDX R3 R3 R2 + 0x8C100702, // 0008 GETMET R4 R3 K2 + 0x7C100200, // 0009 CALL R4 1 + 0x1C100801, // 000A EQ R4 R4 R1 + 0x78120000, // 000B JMPF R4 #000D + 0x80040600, // 000C RET 1 R3 + 0x00080503, // 000D ADD R2 R2 K3 + 0x7001FFF1, // 000E JMP #0001 + 0x4C0C0000, // 000F LDNIL R3 + 0x80040600, // 0010 RET 1 R3 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: start_mdns_announce_hostnames +********************************************************************/ +be_local_closure(Matter_Device_start_mdns_announce_hostnames, /* name */ + be_nested_proto( + 6, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 1, /* has sup protos */ + ( &(const struct bproto*[ 2]) { + be_nested_proto( + 4, /* nstack */ + 0, /* argc */ + 0, /* varg */ + 1, /* has upvals */ + ( &(const bupvaldesc[ 1]) { /* upvals */ + be_local_const_upval(1, 0), + }), + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 5]) { /* constants */ + /* K0 */ be_nested_str_weak(_mdns_announce_hostname), + /* K1 */ be_nested_str_weak(tasmota), + /* K2 */ be_nested_str_weak(remove_rule), + /* K3 */ be_nested_str_weak(Wifi_X23Connected), + /* K4 */ be_nested_str_weak(matter_mdns_host), + }), + be_str_weak(_anonymous_), + &be_const_str_solidified, + ( &(const binstruction[10]) { /* code */ + 0x68000000, // 0000 GETUPV R0 U0 + 0x8C000100, // 0001 GETMET R0 R0 K0 + 0x50080000, // 0002 LDBOOL R2 0 0 + 0x7C000400, // 0003 CALL R0 2 + 0xB8020200, // 0004 GETNGBL R0 K1 + 0x8C000102, // 0005 GETMET R0 R0 K2 + 0x58080003, // 0006 LDCONST R2 K3 + 0x580C0004, // 0007 LDCONST R3 K4 + 0x7C000600, // 0008 CALL R0 3 + 0x80000000, // 0009 RET 0 + }) + ), + be_nested_proto( + 4, /* nstack */ + 0, /* argc */ + 0, /* varg */ + 1, /* has upvals */ + ( &(const bupvaldesc[ 1]) { /* upvals */ + be_local_const_upval(1, 0), + }), + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 5]) { /* constants */ + /* K0 */ be_nested_str_weak(_mdns_announce_hostname), + /* K1 */ be_nested_str_weak(tasmota), + /* K2 */ be_nested_str_weak(remove_rule), + /* K3 */ be_nested_str_weak(Eth_X23Connected), + /* K4 */ be_nested_str_weak(matter_mdns_host), + }), + be_str_weak(_anonymous_), + &be_const_str_solidified, + ( &(const binstruction[10]) { /* code */ + 0x68000000, // 0000 GETUPV R0 U0 + 0x8C000100, // 0001 GETMET R0 R0 K0 + 0x50080200, // 0002 LDBOOL R2 1 0 + 0x7C000400, // 0003 CALL R0 2 + 0xB8020200, // 0004 GETNGBL R0 K1 + 0x8C000102, // 0005 GETMET R0 R0 K2 + 0x58080003, // 0006 LDCONST R2 K3 + 0x580C0004, // 0007 LDCONST R3 K4 + 0x7C000600, // 0008 CALL R0 3 + 0x80000000, // 0009 RET 0 + }) + ), + }), + 1, /* has constants */ + ( &(const bvalue[ 9]) { /* constants */ + /* K0 */ be_nested_str_weak(tasmota), + /* K1 */ be_nested_str_weak(wifi), + /* K2 */ be_nested_str_weak(up), + /* K3 */ be_nested_str_weak(_mdns_announce_hostname), + /* K4 */ be_nested_str_weak(add_rule), + /* K5 */ be_nested_str_weak(Wifi_X23Connected), + /* K6 */ be_nested_str_weak(matter_mdns_host), + /* K7 */ be_nested_str_weak(eth), + /* K8 */ be_nested_str_weak(Eth_X23Connected), + }), + be_str_weak(start_mdns_announce_hostnames), + &be_const_str_solidified, + ( &(const binstruction[32]) { /* code */ + 0xB8060000, // 0000 GETNGBL R1 K0 + 0x8C040301, // 0001 GETMET R1 R1 K1 + 0x7C040200, // 0002 CALL R1 1 + 0x94040302, // 0003 GETIDX R1 R1 K2 + 0x78060003, // 0004 JMPF R1 #0009 + 0x8C040103, // 0005 GETMET R1 R0 K3 + 0x500C0000, // 0006 LDBOOL R3 0 0 + 0x7C040400, // 0007 CALL R1 2 + 0x70020005, // 0008 JMP #000F + 0xB8060000, // 0009 GETNGBL R1 K0 + 0x8C040304, // 000A GETMET R1 R1 K4 + 0x580C0005, // 000B LDCONST R3 K5 + 0x84100000, // 000C CLOSURE R4 P0 + 0x58140006, // 000D LDCONST R5 K6 + 0x7C040800, // 000E CALL R1 4 + 0xB8060000, // 000F GETNGBL R1 K0 + 0x8C040307, // 0010 GETMET R1 R1 K7 + 0x7C040200, // 0011 CALL R1 1 + 0x94040302, // 0012 GETIDX R1 R1 K2 + 0x78060003, // 0013 JMPF R1 #0018 + 0x8C040103, // 0014 GETMET R1 R0 K3 + 0x500C0200, // 0015 LDBOOL R3 1 0 + 0x7C040400, // 0016 CALL R1 2 + 0x70020005, // 0017 JMP #001E + 0xB8060000, // 0018 GETNGBL R1 K0 + 0x8C040304, // 0019 GETMET R1 R1 K4 + 0x580C0008, // 001A LDCONST R3 K8 + 0x84100001, // 001B CLOSURE R4 P1 + 0x58140006, // 001C LDCONST R5 K6 + 0x7C040800, // 001D CALL R1 4 + 0xA0000000, // 001E CLOSE R0 + 0x80000000, // 001F RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: mdns_announce_PASE +********************************************************************/ +be_local_closure(Matter_Device_mdns_announce_PASE, /* name */ + be_nested_proto( + 13, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[43]) { /* constants */ + /* K0 */ be_nested_str_weak(mdns), + /* K1 */ be_nested_str_weak(string), + /* K2 */ be_nested_str_weak(crypto), + /* K3 */ be_nested_str_weak(VP), + /* K4 */ be_nested_str_weak(vendorid), + /* K5 */ be_nested_str_weak(_X2B), + /* K6 */ be_nested_str_weak(productid), + /* K7 */ be_nested_str_weak(D), + /* K8 */ be_nested_str_weak(commissioning_discriminator), + /* K9 */ be_nested_str_weak(CM), + /* K10 */ be_const_int(1), + /* K11 */ be_nested_str_weak(T), + /* K12 */ be_const_int(0), + /* K13 */ be_nested_str_weak(SII), + /* K14 */ be_nested_str_weak(SAI), + /* K15 */ be_nested_str_weak(commissioning_instance_wifi), + /* K16 */ be_nested_str_weak(random), + /* K17 */ be_nested_str_weak(tohex), + /* K18 */ be_nested_str_weak(commissioning_instance_eth), + /* K19 */ be_nested_str_weak(hostname_eth), + /* K20 */ be_nested_str_weak(add_service), + /* K21 */ be_nested_str_weak(_matterc), + /* K22 */ be_nested_str_weak(_udp), + /* K23 */ be_nested_str_weak(mdns_pase_eth), + /* K24 */ be_nested_str_weak(tasmota), + /* K25 */ be_nested_str_weak(log), + /* K26 */ be_nested_str_weak(format), + /* K27 */ be_nested_str_weak(MTR_X3A_X20announce_X20mDNS_X20on_X20_X25s_X20_X27_X25s_X27_X20ptr_X20to_X20_X60_X25s_X2Elocal_X60), + /* K28 */ be_nested_str_weak(eth), + /* K29 */ be_const_int(2), + /* K30 */ be_nested_str_weak(_L), + /* K31 */ be_nested_str_weak(MTR_X3A_X20adding_X20subtype_X3A_X20), + /* K32 */ be_const_int(3), + /* K33 */ be_nested_str_weak(add_subtype), + /* K34 */ be_nested_str_weak(_S), + /* K35 */ be_nested_str_weak(_V), + /* K36 */ be_nested_str_weak(_CM1), + /* K37 */ be_nested_str_weak(hostname_wifi), + /* K38 */ be_nested_str_weak(mdns_pase_wifi), + /* K39 */ be_nested_str_weak(MTR_X3A_X20starting_X20mDNS_X20on_X20_X25s_X20_X27_X25s_X27_X20ptr_X20to_X20_X60_X25s_X2Elocal_X60), + /* K40 */ be_nested_str_weak(wifi), + /* K41 */ be_nested_str_weak(MTR_X3A_X20Exception), + /* K42 */ be_nested_str_weak(_X7C), + }), + be_str_weak(mdns_announce_PASE), + &be_const_str_solidified, + ( &(const binstruction[237]) { /* code */ + 0xA4060000, // 0000 IMPORT R1 K0 + 0xA40A0200, // 0001 IMPORT R2 K1 + 0xA40E0400, // 0002 IMPORT R3 K2 + 0x60100013, // 0003 GETGBL R4 G19 + 0x7C100000, // 0004 CALL R4 0 + 0x60140008, // 0005 GETGBL R5 G8 + 0x88180104, // 0006 GETMBR R6 R0 K4 + 0x7C140200, // 0007 CALL R5 1 + 0x00140B05, // 0008 ADD R5 R5 K5 + 0x60180008, // 0009 GETGBL R6 G8 + 0x881C0106, // 000A GETMBR R7 R0 K6 + 0x7C180200, // 000B CALL R6 1 + 0x00140A06, // 000C ADD R5 R5 R6 + 0x98120605, // 000D SETIDX R4 K3 R5 + 0x88140108, // 000E GETMBR R5 R0 K8 + 0x98120E05, // 000F SETIDX R4 K7 R5 + 0x9812130A, // 0010 SETIDX R4 K9 K10 + 0x9812170C, // 0011 SETIDX R4 K11 K12 + 0x54161387, // 0012 LDINT R5 5000 + 0x98121A05, // 0013 SETIDX R4 K13 R5 + 0x5416012B, // 0014 LDINT R5 300 + 0x98121C05, // 0015 SETIDX R4 K14 R5 + 0x8C140710, // 0016 GETMET R5 R3 K16 + 0x541E0007, // 0017 LDINT R7 8 + 0x7C140400, // 0018 CALL R5 2 + 0x8C140B11, // 0019 GETMET R5 R5 K17 + 0x7C140200, // 001A CALL R5 1 + 0x90021E05, // 001B SETMBR R0 K15 R5 + 0x8C140710, // 001C GETMET R5 R3 K16 + 0x541E0007, // 001D LDINT R7 8 + 0x7C140400, // 001E CALL R5 2 + 0x8C140B11, // 001F GETMET R5 R5 K17 + 0x7C140200, // 0020 CALL R5 1 + 0x90022405, // 0021 SETMBR R0 K18 R5 + 0xA80200B7, // 0022 EXBLK 0 #00DB + 0x88140113, // 0023 GETMBR R5 R0 K19 + 0x78160058, // 0024 JMPF R5 #007E + 0x8C140314, // 0025 GETMET R5 R1 K20 + 0x581C0015, // 0026 LDCONST R7 K21 + 0x58200016, // 0027 LDCONST R8 K22 + 0x542615A3, // 0028 LDINT R9 5540 + 0x5C280800, // 0029 MOVE R10 R4 + 0x882C0112, // 002A GETMBR R11 R0 K18 + 0x88300113, // 002B GETMBR R12 R0 K19 + 0x7C140E00, // 002C CALL R5 7 + 0x50140200, // 002D LDBOOL R5 1 0 + 0x90022E05, // 002E SETMBR R0 K23 R5 + 0xB8163000, // 002F GETNGBL R5 K24 + 0x8C140B19, // 0030 GETMET R5 R5 K25 + 0x8C1C051A, // 0031 GETMET R7 R2 K26 + 0x5824001B, // 0032 LDCONST R9 K27 + 0x5828001C, // 0033 LDCONST R10 K28 + 0x882C0112, // 0034 GETMBR R11 R0 K18 + 0x88300113, // 0035 GETMBR R12 R0 K19 + 0x7C1C0A00, // 0036 CALL R7 5 + 0x5820001D, // 0037 LDCONST R8 K29 + 0x7C140600, // 0038 CALL R5 3 + 0x60140008, // 0039 GETGBL R5 G8 + 0x88180108, // 003A GETMBR R6 R0 K8 + 0x541E0FFE, // 003B LDINT R7 4095 + 0x2C180C07, // 003C AND R6 R6 R7 + 0x7C140200, // 003D CALL R5 1 + 0x00163C05, // 003E ADD R5 K30 R5 + 0xB81A3000, // 003F GETNGBL R6 K24 + 0x8C180D19, // 0040 GETMET R6 R6 K25 + 0x00223E05, // 0041 ADD R8 K31 R5 + 0x58240020, // 0042 LDCONST R9 K32 + 0x7C180600, // 0043 CALL R6 3 + 0x8C180321, // 0044 GETMET R6 R1 K33 + 0x58200015, // 0045 LDCONST R8 K21 + 0x58240016, // 0046 LDCONST R9 K22 + 0x88280112, // 0047 GETMBR R10 R0 K18 + 0x882C0113, // 0048 GETMBR R11 R0 K19 + 0x5C300A00, // 0049 MOVE R12 R5 + 0x7C180C00, // 004A CALL R6 6 + 0x60180008, // 004B GETGBL R6 G8 + 0x881C0108, // 004C GETMBR R7 R0 K8 + 0x54220EFF, // 004D LDINT R8 3840 + 0x2C1C0E08, // 004E AND R7 R7 R8 + 0x54220007, // 004F LDINT R8 8 + 0x3C1C0E08, // 0050 SHR R7 R7 R8 + 0x7C180200, // 0051 CALL R6 1 + 0x001A4406, // 0052 ADD R6 K34 R6 + 0x5C140C00, // 0053 MOVE R5 R6 + 0xB81A3000, // 0054 GETNGBL R6 K24 + 0x8C180D19, // 0055 GETMET R6 R6 K25 + 0x00223E05, // 0056 ADD R8 K31 R5 + 0x58240020, // 0057 LDCONST R9 K32 + 0x7C180600, // 0058 CALL R6 3 + 0x8C180321, // 0059 GETMET R6 R1 K33 + 0x58200015, // 005A LDCONST R8 K21 + 0x58240016, // 005B LDCONST R9 K22 + 0x88280112, // 005C GETMBR R10 R0 K18 + 0x882C0113, // 005D GETMBR R11 R0 K19 + 0x5C300A00, // 005E MOVE R12 R5 + 0x7C180C00, // 005F CALL R6 6 + 0x60180008, // 0060 GETGBL R6 G8 + 0x881C0104, // 0061 GETMBR R7 R0 K4 + 0x7C180200, // 0062 CALL R6 1 + 0x001A4606, // 0063 ADD R6 K35 R6 + 0x5C140C00, // 0064 MOVE R5 R6 + 0xB81A3000, // 0065 GETNGBL R6 K24 + 0x8C180D19, // 0066 GETMET R6 R6 K25 + 0x00223E05, // 0067 ADD R8 K31 R5 + 0x58240020, // 0068 LDCONST R9 K32 + 0x7C180600, // 0069 CALL R6 3 + 0x8C180321, // 006A GETMET R6 R1 K33 + 0x58200015, // 006B LDCONST R8 K21 + 0x58240016, // 006C LDCONST R9 K22 + 0x88280112, // 006D GETMBR R10 R0 K18 + 0x882C0113, // 006E GETMBR R11 R0 K19 + 0x5C300A00, // 006F MOVE R12 R5 + 0x7C180C00, // 0070 CALL R6 6 + 0x58140024, // 0071 LDCONST R5 K36 + 0xB81A3000, // 0072 GETNGBL R6 K24 + 0x8C180D19, // 0073 GETMET R6 R6 K25 + 0x00223E05, // 0074 ADD R8 K31 R5 + 0x58240020, // 0075 LDCONST R9 K32 + 0x7C180600, // 0076 CALL R6 3 + 0x8C180321, // 0077 GETMET R6 R1 K33 + 0x58200015, // 0078 LDCONST R8 K21 + 0x58240016, // 0079 LDCONST R9 K22 + 0x88280112, // 007A GETMBR R10 R0 K18 + 0x882C0113, // 007B GETMBR R11 R0 K19 + 0x5C300A00, // 007C MOVE R12 R5 + 0x7C180C00, // 007D CALL R6 6 + 0x88140125, // 007E GETMBR R5 R0 K37 + 0x78160058, // 007F JMPF R5 #00D9 + 0x8C140314, // 0080 GETMET R5 R1 K20 + 0x581C0015, // 0081 LDCONST R7 K21 + 0x58200016, // 0082 LDCONST R8 K22 + 0x542615A3, // 0083 LDINT R9 5540 + 0x5C280800, // 0084 MOVE R10 R4 + 0x882C010F, // 0085 GETMBR R11 R0 K15 + 0x88300125, // 0086 GETMBR R12 R0 K37 + 0x7C140E00, // 0087 CALL R5 7 + 0x50140200, // 0088 LDBOOL R5 1 0 + 0x90024C05, // 0089 SETMBR R0 K38 R5 + 0xB8163000, // 008A GETNGBL R5 K24 + 0x8C140B19, // 008B GETMET R5 R5 K25 + 0x8C1C051A, // 008C GETMET R7 R2 K26 + 0x58240027, // 008D LDCONST R9 K39 + 0x58280028, // 008E LDCONST R10 K40 + 0x882C010F, // 008F GETMBR R11 R0 K15 + 0x88300125, // 0090 GETMBR R12 R0 K37 + 0x7C1C0A00, // 0091 CALL R7 5 + 0x58200020, // 0092 LDCONST R8 K32 + 0x7C140600, // 0093 CALL R5 3 + 0x60140008, // 0094 GETGBL R5 G8 + 0x88180108, // 0095 GETMBR R6 R0 K8 + 0x541E0FFE, // 0096 LDINT R7 4095 + 0x2C180C07, // 0097 AND R6 R6 R7 + 0x7C140200, // 0098 CALL R5 1 + 0x00163C05, // 0099 ADD R5 K30 R5 + 0xB81A3000, // 009A GETNGBL R6 K24 + 0x8C180D19, // 009B GETMET R6 R6 K25 + 0x00223E05, // 009C ADD R8 K31 R5 + 0x58240020, // 009D LDCONST R9 K32 + 0x7C180600, // 009E CALL R6 3 + 0x8C180321, // 009F GETMET R6 R1 K33 + 0x58200015, // 00A0 LDCONST R8 K21 + 0x58240016, // 00A1 LDCONST R9 K22 + 0x8828010F, // 00A2 GETMBR R10 R0 K15 + 0x882C0125, // 00A3 GETMBR R11 R0 K37 + 0x5C300A00, // 00A4 MOVE R12 R5 + 0x7C180C00, // 00A5 CALL R6 6 + 0x60180008, // 00A6 GETGBL R6 G8 + 0x881C0108, // 00A7 GETMBR R7 R0 K8 + 0x54220EFF, // 00A8 LDINT R8 3840 + 0x2C1C0E08, // 00A9 AND R7 R7 R8 + 0x54220007, // 00AA LDINT R8 8 + 0x3C1C0E08, // 00AB SHR R7 R7 R8 + 0x7C180200, // 00AC CALL R6 1 + 0x001A4406, // 00AD ADD R6 K34 R6 + 0x5C140C00, // 00AE MOVE R5 R6 + 0xB81A3000, // 00AF GETNGBL R6 K24 + 0x8C180D19, // 00B0 GETMET R6 R6 K25 + 0x00223E05, // 00B1 ADD R8 K31 R5 + 0x58240020, // 00B2 LDCONST R9 K32 + 0x7C180600, // 00B3 CALL R6 3 + 0x8C180321, // 00B4 GETMET R6 R1 K33 + 0x58200015, // 00B5 LDCONST R8 K21 + 0x58240016, // 00B6 LDCONST R9 K22 + 0x8828010F, // 00B7 GETMBR R10 R0 K15 + 0x882C0125, // 00B8 GETMBR R11 R0 K37 + 0x5C300A00, // 00B9 MOVE R12 R5 + 0x7C180C00, // 00BA CALL R6 6 + 0x60180008, // 00BB GETGBL R6 G8 + 0x881C0104, // 00BC GETMBR R7 R0 K4 + 0x7C180200, // 00BD CALL R6 1 + 0x001A4606, // 00BE ADD R6 K35 R6 + 0x5C140C00, // 00BF MOVE R5 R6 + 0xB81A3000, // 00C0 GETNGBL R6 K24 + 0x8C180D19, // 00C1 GETMET R6 R6 K25 + 0x00223E05, // 00C2 ADD R8 K31 R5 + 0x58240020, // 00C3 LDCONST R9 K32 + 0x7C180600, // 00C4 CALL R6 3 + 0x8C180321, // 00C5 GETMET R6 R1 K33 + 0x58200015, // 00C6 LDCONST R8 K21 + 0x58240016, // 00C7 LDCONST R9 K22 + 0x8828010F, // 00C8 GETMBR R10 R0 K15 + 0x882C0125, // 00C9 GETMBR R11 R0 K37 + 0x5C300A00, // 00CA MOVE R12 R5 + 0x7C180C00, // 00CB CALL R6 6 + 0x58140024, // 00CC LDCONST R5 K36 + 0xB81A3000, // 00CD GETNGBL R6 K24 + 0x8C180D19, // 00CE GETMET R6 R6 K25 + 0x00223E05, // 00CF ADD R8 K31 R5 + 0x58240020, // 00D0 LDCONST R9 K32 + 0x7C180600, // 00D1 CALL R6 3 + 0x8C180321, // 00D2 GETMET R6 R1 K33 + 0x58200015, // 00D3 LDCONST R8 K21 + 0x58240016, // 00D4 LDCONST R9 K22 + 0x8828010F, // 00D5 GETMBR R10 R0 K15 + 0x882C0125, // 00D6 GETMBR R11 R0 K37 + 0x5C300A00, // 00D7 MOVE R12 R5 + 0x7C180C00, // 00D8 CALL R6 6 + 0xA8040001, // 00D9 EXBLK 1 1 + 0x70020010, // 00DA JMP #00EC + 0xAC140002, // 00DB CATCH R5 0 2 + 0x7002000D, // 00DC JMP #00EB + 0xB81E3000, // 00DD GETNGBL R7 K24 + 0x8C1C0F19, // 00DE GETMET R7 R7 K25 + 0x60240008, // 00DF GETGBL R9 G8 + 0x5C280A00, // 00E0 MOVE R10 R5 + 0x7C240200, // 00E1 CALL R9 1 + 0x00265209, // 00E2 ADD R9 K41 R9 + 0x0024132A, // 00E3 ADD R9 R9 K42 + 0x60280008, // 00E4 GETGBL R10 G8 + 0x5C2C0C00, // 00E5 MOVE R11 R6 + 0x7C280200, // 00E6 CALL R10 1 + 0x0024120A, // 00E7 ADD R9 R9 R10 + 0x5828001D, // 00E8 LDCONST R10 K29 + 0x7C1C0600, // 00E9 CALL R7 3 + 0x70020000, // 00EA JMP #00EC + 0xB0080000, // 00EB RAISE 2 R0 R0 + 0x80000000, // 00EC RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: generate_random_passcode +********************************************************************/ +be_local_closure(Matter_Device_generate_random_passcode, /* name */ + be_nested_proto( + 7, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 8]) { /* constants */ + /* K0 */ be_nested_str_weak(crypto), + /* K1 */ be_nested_str_weak(random), + /* K2 */ be_nested_str_weak(get), + /* K3 */ be_const_int(0), + /* K4 */ be_const_int(134217727), + /* K5 */ be_const_int(99999998), + /* K6 */ be_nested_str_weak(PASSCODE_INVALID), + /* K7 */ be_nested_str_weak(stop_iteration), + }), + be_str_weak(generate_random_passcode), + &be_const_str_solidified, + ( &(const binstruction[35]) { /* code */ + 0xA4060000, // 0000 IMPORT R1 K0 0x4C080000, // 0001 LDNIL R2 - 0x20040202, // 0002 NE R1 R1 R2 - 0x80040200, // 0003 RET 1 R1 + 0x500C0200, // 0002 LDBOOL R3 1 0 + 0x780E001D, // 0003 JMPF R3 #0022 + 0x8C0C0301, // 0004 GETMET R3 R1 K1 + 0x54160003, // 0005 LDINT R5 4 + 0x7C0C0400, // 0006 CALL R3 2 + 0x8C0C0702, // 0007 GETMET R3 R3 K2 + 0x58140003, // 0008 LDCONST R5 K3 + 0x541A0003, // 0009 LDINT R6 4 + 0x7C0C0600, // 000A CALL R3 3 + 0x2C0C0704, // 000B AND R3 R3 K4 + 0x5C080600, // 000C MOVE R2 R3 + 0x240C0505, // 000D GT R3 R2 K5 + 0x780E0000, // 000E JMPF R3 #0010 + 0x7001FFF1, // 000F JMP #0002 + 0x600C0010, // 0010 GETGBL R3 G16 + 0x88100106, // 0011 GETMBR R4 R0 K6 + 0x7C0C0200, // 0012 CALL R3 1 + 0xA8020005, // 0013 EXBLK 0 #001A + 0x5C100600, // 0014 MOVE R4 R3 + 0x7C100000, // 0015 CALL R4 0 + 0x1C140404, // 0016 EQ R5 R2 R4 + 0x78160000, // 0017 JMPF R5 #0019 + 0x4C080000, // 0018 LDNIL R2 + 0x7001FFF9, // 0019 JMP #0014 + 0x580C0007, // 001A LDCONST R3 K7 + 0xAC0C0200, // 001B CATCH R3 1 0 + 0xB0080000, // 001C RAISE 2 R0 R0 + 0x4C0C0000, // 001D LDNIL R3 + 0x200C0403, // 001E NE R3 R2 R3 + 0x780E0000, // 001F JMPF R3 #0021 + 0x80040400, // 0020 RET 1 R2 + 0x7001FFDF, // 0021 JMP #0002 + 0x80000000, // 0022 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: register_native_classes +********************************************************************/ +be_local_closure(Matter_Device_register_native_classes, /* name */ + be_nested_proto( + 12, /* nstack */ + 3, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[17]) { /* constants */ + /* K0 */ be_nested_str_weak(introspect), + /* K1 */ be_nested_str_weak(string), + /* K2 */ be_nested_str_weak(members), + /* K3 */ be_nested_str_weak(matter), + /* K4 */ be_nested_str_weak(get), + /* K5 */ be_nested_str_weak(class), + /* K6 */ be_nested_str_weak(find), + /* K7 */ be_nested_str_weak(Plugin_), + /* K8 */ be_const_int(0), + /* K9 */ be_nested_str_weak(register_plugin_class), + /* K10 */ be_nested_str_weak(stop_iteration), + /* K11 */ be_nested_str_weak(tasmota), + /* K12 */ be_nested_str_weak(log), + /* K13 */ be_nested_str_weak(MTR_X3A_X20registered_X20classes_X20), + /* K14 */ be_nested_str_weak(k2l), + /* K15 */ be_nested_str_weak(plugins_classes), + /* K16 */ be_const_int(3), + }), + be_str_weak(register_native_classes), + &be_const_str_solidified, + ( &(const binstruction[43]) { /* code */ + 0xA40E0000, // 0000 IMPORT R3 K0 + 0xA4120200, // 0001 IMPORT R4 K1 + 0x60140010, // 0002 GETGBL R5 G16 + 0x8C180702, // 0003 GETMET R6 R3 K2 + 0xB8220600, // 0004 GETNGBL R8 K3 + 0x7C180400, // 0005 CALL R6 2 + 0x7C140200, // 0006 CALL R5 1 + 0xA8020014, // 0007 EXBLK 0 #001D + 0x5C180A00, // 0008 MOVE R6 R5 + 0x7C180000, // 0009 CALL R6 0 + 0x8C1C0704, // 000A GETMET R7 R3 K4 + 0xB8260600, // 000B GETNGBL R9 K3 + 0x5C280C00, // 000C MOVE R10 R6 + 0x7C1C0600, // 000D CALL R7 3 + 0x60200004, // 000E GETGBL R8 G4 + 0x5C240E00, // 000F MOVE R9 R7 + 0x7C200200, // 0010 CALL R8 1 + 0x1C201105, // 0011 EQ R8 R8 K5 + 0x78220008, // 0012 JMPF R8 #001C + 0x8C200906, // 0013 GETMET R8 R4 K6 + 0x5C280C00, // 0014 MOVE R10 R6 + 0x582C0007, // 0015 LDCONST R11 K7 + 0x7C200600, // 0016 CALL R8 3 + 0x1C201108, // 0017 EQ R8 R8 K8 + 0x78220002, // 0018 JMPF R8 #001C + 0x8C200109, // 0019 GETMET R8 R0 K9 + 0x5C280E00, // 001A MOVE R10 R7 + 0x7C200400, // 001B CALL R8 2 + 0x7001FFEA, // 001C JMP #0008 + 0x5814000A, // 001D LDCONST R5 K10 + 0xAC140200, // 001E CATCH R5 1 0 + 0xB0080000, // 001F RAISE 2 R0 R0 + 0xB8161600, // 0020 GETNGBL R5 K11 + 0x8C140B0C, // 0021 GETMET R5 R5 K12 + 0x601C0008, // 0022 GETGBL R7 G8 + 0x8C20010E, // 0023 GETMET R8 R0 K14 + 0x8828010F, // 0024 GETMBR R10 R0 K15 + 0x7C200400, // 0025 CALL R8 2 + 0x7C1C0200, // 0026 CALL R7 1 + 0x001E1A07, // 0027 ADD R7 K13 R7 + 0x58200010, // 0028 LDCONST R8 K16 + 0x7C140600, // 0029 CALL R5 3 + 0x80000000, // 002A RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: sort_distinct +********************************************************************/ +be_local_closure(Matter_Device_sort_distinct, /* name */ + be_nested_proto( + 7, /* nstack */ + 1, /* argc */ + 4, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 5]) { /* constants */ + /* K0 */ be_const_class(be_class_Matter_Device), + /* K1 */ be_const_int(1), + /* K2 */ be_const_int(0), + /* K3 */ be_nested_str_weak(stop_iteration), + /* K4 */ be_nested_str_weak(remove), + }), + be_str_weak(sort_distinct), + &be_const_str_solidified, + ( &(const binstruction[53]) { /* code */ + 0x58040000, // 0000 LDCONST R1 K0 + 0x60080010, // 0001 GETGBL R2 G16 + 0x600C000C, // 0002 GETGBL R3 G12 + 0x5C100000, // 0003 MOVE R4 R0 + 0x7C0C0200, // 0004 CALL R3 1 + 0x040C0701, // 0005 SUB R3 R3 K1 + 0x400E0203, // 0006 CONNECT R3 K1 R3 + 0x7C080200, // 0007 CALL R2 1 + 0xA8020010, // 0008 EXBLK 0 #001A + 0x5C0C0400, // 0009 MOVE R3 R2 + 0x7C0C0000, // 000A CALL R3 0 + 0x94100003, // 000B GETIDX R4 R0 R3 + 0x5C140600, // 000C MOVE R5 R3 + 0x24180B02, // 000D GT R6 R5 K2 + 0x781A0008, // 000E JMPF R6 #0018 + 0x04180B01, // 000F SUB R6 R5 K1 + 0x94180006, // 0010 GETIDX R6 R0 R6 + 0x24180C04, // 0011 GT R6 R6 R4 + 0x781A0004, // 0012 JMPF R6 #0018 + 0x04180B01, // 0013 SUB R6 R5 K1 + 0x94180006, // 0014 GETIDX R6 R0 R6 + 0x98000A06, // 0015 SETIDX R0 R5 R6 + 0x04140B01, // 0016 SUB R5 R5 K1 + 0x7001FFF4, // 0017 JMP #000D + 0x98000A04, // 0018 SETIDX R0 R5 R4 + 0x7001FFEE, // 0019 JMP #0009 + 0x58080003, // 001A LDCONST R2 K3 + 0xAC080200, // 001B CATCH R2 1 0 + 0xB0080000, // 001C RAISE 2 R0 R0 + 0x58080001, // 001D LDCONST R2 K1 + 0x600C000C, // 001E GETGBL R3 G12 + 0x5C100000, // 001F MOVE R4 R0 + 0x7C0C0200, // 0020 CALL R3 1 + 0x180C0701, // 0021 LE R3 R3 K1 + 0x780E0000, // 0022 JMPF R3 #0024 + 0x80040000, // 0023 RET 1 R0 + 0x940C0102, // 0024 GETIDX R3 R0 K2 + 0x6010000C, // 0025 GETGBL R4 G12 + 0x5C140000, // 0026 MOVE R5 R0 + 0x7C100200, // 0027 CALL R4 1 + 0x14100404, // 0028 LT R4 R2 R4 + 0x78120009, // 0029 JMPF R4 #0034 + 0x94100002, // 002A GETIDX R4 R0 R2 + 0x1C100803, // 002B EQ R4 R4 R3 + 0x78120003, // 002C JMPF R4 #0031 + 0x8C100104, // 002D GETMET R4 R0 K4 + 0x5C180400, // 002E MOVE R6 R2 + 0x7C100400, // 002F CALL R4 2 + 0x70020001, // 0030 JMP #0033 + 0x940C0002, // 0031 GETIDX R3 R0 R2 + 0x00080501, // 0032 ADD R2 R2 K1 + 0x7001FFF0, // 0033 JMP #0025 + 0x80040000, // 0034 RET 1 R0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: signal_endpoints_changed +********************************************************************/ +be_local_closure(Matter_Device_signal_endpoints_changed, /* name */ + be_nested_proto( + 7, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 3]) { /* constants */ + /* K0 */ be_nested_str_weak(attribute_updated), + /* K1 */ be_const_int(0), + /* K2 */ be_const_int(3), + }), + be_str_weak(signal_endpoints_changed), + &be_const_str_solidified, + ( &(const binstruction[13]) { /* code */ + 0x8C040100, // 0000 GETMET R1 R0 K0 + 0x580C0001, // 0001 LDCONST R3 K1 + 0x5412001C, // 0002 LDINT R4 29 + 0x58140002, // 0003 LDCONST R5 K2 + 0x50180000, // 0004 LDBOOL R6 0 0 + 0x7C040A00, // 0005 CALL R1 5 + 0x8C040100, // 0006 GETMET R1 R0 K0 + 0x540EFEFF, // 0007 LDINT R3 65280 + 0x5412001C, // 0008 LDINT R4 29 + 0x58140002, // 0009 LDCONST R5 K2 + 0x50180000, // 000A LDBOOL R6 0 0 + 0x7C040A00, // 000B CALL R1 5 + 0x80000000, // 000C RET 0 }) ) ); @@ -5568,103 +5572,54 @@ be_local_closure(Matter_Device_is_commissioning_open, /* name */ be_local_class(Matter_Device, 34, NULL, - be_nested_map(103, + be_nested_map(104, ( (struct bmapnode*) &(const bmapnode[]) { - { be_const_key_weak(get_plugin_class_arg, -1), be_const_closure(Matter_Device_get_plugin_class_arg_closure) }, - { be_const_key_weak(mdns_remove_op_discovery_all_fabrics, -1), be_const_closure(Matter_Device_mdns_remove_op_discovery_all_fabrics_closure) }, - { be_const_key_weak(_start_udp, -1), be_const_closure(Matter_Device__start_udp_closure) }, - { be_const_key_weak(find_plugin_by_endpoint, -1), be_const_closure(Matter_Device_find_plugin_by_endpoint_closure) }, - { be_const_key_weak(get_active_endpoints, 97), be_const_closure(Matter_Device_get_active_endpoints_closure) }, - { be_const_key_weak(is_root_commissioning_open, 102), be_const_closure(Matter_Device_is_root_commissioning_open_closure) }, - { be_const_key_weak(hostname_wifi, 95), be_const_var(19) }, - { be_const_key_weak(register_commands, 9), be_const_closure(Matter_Device_register_commands_closure) }, - { be_const_key_weak(commissioning_open, 70), be_const_var(10) }, - { be_const_key_weak(vendorid, 57), be_const_var(21) }, - { be_const_key_weak(mdns_remove_PASE, -1), be_const_closure(Matter_Device_mdns_remove_PASE_closure) }, - { be_const_key_weak(is_commissioning_open, -1), be_const_closure(Matter_Device_is_commissioning_open_closure) }, - { be_const_key_weak(adjust_next_ep, 98), be_const_closure(Matter_Device_adjust_next_ep_closure) }, - { be_const_key_weak(root_L, -1), be_const_var(33) }, - { be_const_key_weak(autoconf_device_map, -1), be_const_closure(Matter_Device_autoconf_device_map_closure) }, - { be_const_key_weak(autoconf_device, 18), be_const_closure(Matter_Device_autoconf_device_closure) }, - { be_const_key_weak(commissioning_discriminator, -1), be_const_var(12) }, - { be_const_key_weak(tick, 45), be_const_var(9) }, - { be_const_key_weak(productid, 26), be_const_var(22) }, - { be_const_key_weak(start_commissioning_complete, 88), be_const_closure(Matter_Device_start_commissioning_complete_closure) }, - { be_const_key_weak(start_mdns_announce_hostnames, -1), be_const_closure(Matter_Device_start_mdns_announce_hostnames_closure) }, - { be_const_key_weak(commissioning_iterations, -1), be_const_var(11) }, - { be_const_key_weak(save_before_restart, 58), be_const_closure(Matter_Device_save_before_restart_closure) }, - { be_const_key_weak(plugins_persist, 40), be_const_var(2) }, - { be_const_key_weak(start_operational_discovery_deferred, -1), be_const_closure(Matter_Device_start_operational_discovery_deferred_closure) }, - { be_const_key_weak(start_commissioning_complete_deferred, -1), be_const_closure(Matter_Device_start_commissioning_complete_deferred_closure) }, - { be_const_key_weak(plugins_classes, 55), be_const_var(3) }, - { be_const_key_weak(start, -1), be_const_closure(Matter_Device_start_closure) }, - { be_const_key_weak(init, -1), be_const_closure(Matter_Device_init_closure) }, - { be_const_key_weak(register_native_classes, -1), be_const_closure(Matter_Device_register_native_classes_closure) }, - { be_const_key_weak(root_salt, -1), be_const_var(31) }, - { be_const_key_weak(FILENAME, -1), be_nested_str_weak(_matter_device_X2Ejson) }, - { be_const_key_weak(clean_remotes, -1), be_const_closure(Matter_Device_clean_remotes_closure) }, - { be_const_key_weak(mdns_announce_op_discovery_all_fabrics, -1), be_const_closure(Matter_Device_mdns_announce_op_discovery_all_fabrics_closure) }, - { be_const_key_weak(signal_endpoints_changed, -1), be_const_closure(Matter_Device_signal_endpoints_changed_closure) }, - { be_const_key_weak(get_plugin_class_displayname, -1), be_const_closure(Matter_Device_get_plugin_class_displayname_closure) }, - { be_const_key_weak(msg_received, 53), be_const_closure(Matter_Device_msg_received_closure) }, - { be_const_key_weak(generate_random_passcode, -1), be_const_closure(Matter_Device_generate_random_passcode_closure) }, - { be_const_key_weak(MtrJoin, 30), be_const_closure(Matter_Device_MtrJoin_closure) }, - { be_const_key_weak(remove_fabric, 25), be_const_closure(Matter_Device_remove_fabric_closure) }, - { be_const_key_weak(every_second, -1), be_const_closure(Matter_Device_every_second_closure) }, - { be_const_key_weak(PASE_TIMEOUT, 85), be_const_int(600) }, - { be_const_key_weak(process_attribute_expansion, -1), be_const_closure(Matter_Device_process_attribute_expansion_closure) }, - { be_const_key_weak(http_remotes, 36), be_const_var(25) }, { be_const_key_weak(hostname_eth, -1), be_const_var(20) }, - { be_const_key_weak(root_discriminator, 89), be_const_var(26) }, - { be_const_key_weak(register_http_remote, 93), be_const_closure(Matter_Device_register_http_remote_closure) }, - { be_const_key_weak(mdns_announce_PASE, -1), be_const_closure(Matter_Device_mdns_announce_PASE_closure) }, - { be_const_key_weak(commissioning_admin_fabric, -1), be_const_var(16) }, - { be_const_key_weak(event_fabrics_saved, -1), be_const_closure(Matter_Device_event_fabrics_saved_closure) }, - { be_const_key_weak(_init_basic_commissioning, 61), be_const_closure(Matter_Device__init_basic_commissioning_closure) }, - { be_const_key_weak(invoke_request, 92), be_const_closure(Matter_Device_invoke_request_closure) }, - { be_const_key_weak(_compute_pbkdf, -1), be_const_closure(Matter_Device__compute_pbkdf_closure) }, + { be_const_key_weak(save_before_restart, -1), be_const_closure(Matter_Device_save_before_restart_closure) }, + { be_const_key_weak(is_commissioning_open, 65), be_const_closure(Matter_Device_is_commissioning_open_closure) }, + { be_const_key_weak(plugins, 94), be_const_var(1) }, + { be_const_key_weak(plugins_config, 1), be_const_var(4) }, + { be_const_key_weak(save_param, 4), be_const_closure(Matter_Device_save_param_closure) }, + { be_const_key_weak(root_L, 24), be_const_var(33) }, + { be_const_key_weak(mdns_remove_op_discovery, 86), be_const_closure(Matter_Device_mdns_remove_op_discovery_closure) }, + { be_const_key_weak(plugins_classes, 36), be_const_var(3) }, + { be_const_key_weak(every_second, -1), be_const_closure(Matter_Device_every_second_closure) }, + { be_const_key_weak(root_salt, -1), be_const_var(31) }, + { be_const_key_weak(mdns_announce_op_discovery_all_fabrics, -1), be_const_closure(Matter_Device_mdns_announce_op_discovery_all_fabrics_closure) }, { be_const_key_weak(sessions, -1), be_const_var(7) }, - { be_const_key_weak(root_iterations, -1), be_const_var(30) }, - { be_const_key_weak(load_param, -1), be_const_closure(Matter_Device_load_param_closure) }, - { be_const_key_weak(start_basic_commissioning, -1), be_const_closure(Matter_Device_start_basic_commissioning_closure) }, - { be_const_key_weak(start_root_basic_commissioning, -1), be_const_closure(Matter_Device_start_root_basic_commissioning_closure) }, - { be_const_key_weak(plugins, 13), be_const_var(1) }, - { be_const_key_weak(k2l, 52), be_const_static_closure(Matter_Device_k2l_closure) }, - { be_const_key_weak(autoconf_sensors_list, -1), be_const_closure(Matter_Device_autoconf_sensors_list_closure) }, - { be_const_key_weak(mdns_announce_op_discovery, -1), be_const_closure(Matter_Device_mdns_announce_op_discovery_closure) }, - { be_const_key_weak(next_ep, -1), be_const_var(29) }, - { be_const_key_weak(plugins_config, 27), be_const_var(4) }, - { be_const_key_weak(sort_distinct, 84), be_const_static_closure(Matter_Device_sort_distinct_closure) }, - { be_const_key_weak(PRODUCT_ID, 83), be_const_int(32768) }, - { be_const_key_weak(save_param, 67), be_const_closure(Matter_Device_save_param_closure) }, - { be_const_key_weak(PBKDF_ITERATIONS, -1), be_const_int(1000) }, - { be_const_key_weak(k2l_num, -1), be_const_static_closure(Matter_Device_k2l_num_closure) }, - { be_const_key_weak(_instantiate_plugins_from_config, 81), be_const_closure(Matter_Device__instantiate_plugins_from_config_closure) }, - { be_const_key_weak(VENDOR_ID, -1), be_const_int(65521) }, - { be_const_key_weak(start_operational_discovery, 28), be_const_closure(Matter_Device_start_operational_discovery_closure) }, - { be_const_key_weak(root_w0, -1), be_const_var(32) }, - { be_const_key_weak(started, -1), be_const_var(0) }, - { be_const_key_weak(stop_basic_commissioning, -1), be_const_closure(Matter_Device_stop_basic_commissioning_closure) }, - { be_const_key_weak(commissioning_L, -1), be_const_var(15) }, - { be_const_key_weak(bridge_add_endpoint, -1), be_const_closure(Matter_Device_bridge_add_endpoint_closure) }, - { be_const_key_weak(compute_qrcode_content, 72), be_const_closure(Matter_Device_compute_qrcode_content_closure) }, - { be_const_key_weak(UDP_PORT, -1), be_const_int(5540) }, - { be_const_key_weak(udp_server, -1), be_const_var(5) }, - { be_const_key_weak(root_passcode, -1), be_const_var(27) }, - { be_const_key_weak(compute_manual_pairing_code, -1), be_const_closure(Matter_Device_compute_manual_pairing_code_closure) }, - { be_const_key_weak(commissioning_instance_eth, -1), be_const_var(18) }, - { be_const_key_weak(_trigger_read_sensors, 29), be_const_closure(Matter_Device__trigger_read_sensors_closure) }, - { be_const_key_weak(bridge_remove_endpoint, -1), be_const_closure(Matter_Device_bridge_remove_endpoint_closure) }, - { be_const_key_weak(stop, -1), be_const_closure(Matter_Device_stop_closure) }, - { be_const_key_weak(msg_send, -1), be_const_closure(Matter_Device_msg_send_closure) }, - { be_const_key_weak(received_ack, -1), be_const_closure(Matter_Device_received_ack_closure) }, - { be_const_key_weak(commissioning_salt, -1), be_const_var(13) }, - { be_const_key_weak(ui, -1), be_const_var(8) }, - { be_const_key_weak(message_handler, -1), be_const_var(6) }, - { be_const_key_weak(mdns_pase_wifi, -1), be_const_var(24) }, - { be_const_key_weak(_mdns_announce_hostname, -1), be_const_closure(Matter_Device__mdns_announce_hostname_closure) }, + { be_const_key_weak(autoconf_sensors_list, 29), be_const_closure(Matter_Device_autoconf_sensors_list_closure) }, + { be_const_key_weak(mdns_remove_PASE, -1), be_const_closure(Matter_Device_mdns_remove_PASE_closure) }, + { be_const_key_weak(process_attribute_expansion, 60), be_const_closure(Matter_Device_process_attribute_expansion_closure) }, { be_const_key_weak(mdns_pase_eth, -1), be_const_var(23) }, - { be_const_key_weak(PASSCODE_INVALID, 15), be_const_simple_instance(be_nested_simple_instance(&be_class_list, { + { be_const_key_weak(_compute_pbkdf, 76), be_const_closure(Matter_Device__compute_pbkdf_closure) }, + { be_const_key_weak(commissioning_w0, -1), be_const_var(14) }, + { be_const_key_weak(bridge_remove_endpoint, 48), be_const_closure(Matter_Device_bridge_remove_endpoint_closure) }, + { be_const_key_weak(stop_basic_commissioning, -1), be_const_closure(Matter_Device_stop_basic_commissioning_closure) }, + { be_const_key_weak(http_remotes, -1), be_const_var(25) }, + { be_const_key_weak(vendorid, 56), be_const_var(21) }, + { be_const_key_weak(remove_fabric, -1), be_const_closure(Matter_Device_remove_fabric_closure) }, + { be_const_key_weak(_start_udp, -1), be_const_closure(Matter_Device__start_udp_closure) }, + { be_const_key_weak(productid, -1), be_const_var(22) }, + { be_const_key_weak(_mdns_announce_hostname, 5), be_const_closure(Matter_Device__mdns_announce_hostname_closure) }, + { be_const_key_weak(get_plugin_class_arg, -1), be_const_closure(Matter_Device_get_plugin_class_arg_closure) }, + { be_const_key_weak(plugins_persist, -1), be_const_var(2) }, + { be_const_key_weak(generate_random_passcode, -1), be_const_closure(Matter_Device_generate_random_passcode_closure) }, + { be_const_key_weak(event_fabrics_saved, -1), be_const_closure(Matter_Device_event_fabrics_saved_closure) }, + { be_const_key_weak(start_commissioning_complete, 82), be_const_closure(Matter_Device_start_commissioning_complete_closure) }, + { be_const_key_weak(msg_received, 54), be_const_closure(Matter_Device_msg_received_closure) }, + { be_const_key_weak(_instantiate_plugins_from_config, -1), be_const_closure(Matter_Device__instantiate_plugins_from_config_closure) }, + { be_const_key_weak(commissioning_instance_wifi, 74), be_const_var(17) }, + { be_const_key_weak(get_active_endpoints, 69), be_const_closure(Matter_Device_get_active_endpoints_closure) }, + { be_const_key_weak(commissioning_admin_fabric, -1), be_const_var(16) }, + { be_const_key_weak(mdns_announce_PASE, -1), be_const_closure(Matter_Device_mdns_announce_PASE_closure) }, + { be_const_key_weak(root_passcode, 88), be_const_var(27) }, + { be_const_key_weak(message_handler, -1), be_const_var(6) }, + { be_const_key_weak(FILENAME, 95), be_nested_str_weak(_matter_device_X2Ejson) }, + { be_const_key_weak(VENDOR_ID, 42), be_const_int(65521) }, + { be_const_key_weak(root_w0, 96), be_const_var(32) }, + { be_const_key_weak(MtrJoin, -1), be_const_closure(Matter_Device_MtrJoin_closure) }, + { be_const_key_weak(attribute_updated, -1), be_const_closure(Matter_Device_attribute_updated_closure) }, + { be_const_key_weak(PASSCODE_INVALID, 62), be_const_simple_instance(be_nested_simple_instance(&be_class_list, { be_const_list( * be_nested_list(12, ( (struct bvalue*) &(const bvalue[]) { be_const_int(0), @@ -5680,14 +5635,64 @@ be_local_class(Matter_Device, be_const_int(12345678), be_const_int(87654321), })) ) } )) }, - { be_const_key_weak(mdns_remove_op_discovery, -1), be_const_closure(Matter_Device_mdns_remove_op_discovery_closure) }, - { be_const_key_weak(every_50ms, 20), be_const_closure(Matter_Device_every_50ms_closure) }, + { be_const_key_weak(started, 55), be_const_var(0) }, + { be_const_key_weak(start, -1), be_const_closure(Matter_Device_start_closure) }, + { be_const_key_weak(init, -1), be_const_closure(Matter_Device_init_closure) }, + { be_const_key_weak(commissioning_salt, -1), be_const_var(13) }, + { be_const_key_weak(commissioning_instance_eth, 75), be_const_var(18) }, + { be_const_key_weak(k2l, -1), be_const_static_closure(Matter_Device_k2l_closure) }, + { be_const_key_weak(hostname_wifi, 51), be_const_var(19) }, + { be_const_key_weak(_init_basic_commissioning, -1), be_const_closure(Matter_Device__init_basic_commissioning_closure) }, + { be_const_key_weak(received_ack, -1), be_const_closure(Matter_Device_received_ack_closure) }, + { be_const_key_weak(clean_remotes, 43), be_const_closure(Matter_Device_clean_remotes_closure) }, + { be_const_key_weak(autoconf_device_map, -1), be_const_closure(Matter_Device_autoconf_device_map_closure) }, + { be_const_key_weak(commissioning_open, -1), be_const_var(10) }, + { be_const_key_weak(get_plugin_class_displayname, -1), be_const_closure(Matter_Device_get_plugin_class_displayname_closure) }, + { be_const_key_weak(commissioning_discriminator, 37), be_const_var(12) }, + { be_const_key_weak(is_root_commissioning_open, -1), be_const_closure(Matter_Device_is_root_commissioning_open_closure) }, + { be_const_key_weak(mdns_pase_wifi, -1), be_const_var(24) }, + { be_const_key_weak(stop, -1), be_const_closure(Matter_Device_stop_closure) }, + { be_const_key_weak(mdns_remove_op_discovery_all_fabrics, -1), be_const_closure(Matter_Device_mdns_remove_op_discovery_all_fabrics_closure) }, + { be_const_key_weak(every_250ms, 85), be_const_closure(Matter_Device_every_250ms_closure) }, + { be_const_key_weak(compute_manual_pairing_code, -1), be_const_closure(Matter_Device_compute_manual_pairing_code_closure) }, + { be_const_key_weak(adjust_next_ep, 63), be_const_closure(Matter_Device_adjust_next_ep_closure) }, + { be_const_key_weak(register_commands, -1), be_const_closure(Matter_Device_register_commands_closure) }, + { be_const_key_weak(register_http_remote, -1), be_const_closure(Matter_Device_register_http_remote_closure) }, + { be_const_key_weak(load_param, -1), be_const_closure(Matter_Device_load_param_closure) }, + { be_const_key_weak(root_discriminator, -1), be_const_var(26) }, + { be_const_key_weak(compute_qrcode_content, -1), be_const_closure(Matter_Device_compute_qrcode_content_closure) }, + { be_const_key_weak(conf_to_log, 81), be_const_static_closure(Matter_Device_conf_to_log_closure) }, + { be_const_key_weak(start_operational_discovery, -1), be_const_closure(Matter_Device_start_operational_discovery_closure) }, + { be_const_key_weak(UDP_PORT, 14), be_const_int(5540) }, + { be_const_key_weak(root_iterations, -1), be_const_var(30) }, { be_const_key_weak(register_plugin_class, -1), be_const_closure(Matter_Device_register_plugin_class_closure) }, - { be_const_key_weak(commissioning_w0, -1), be_const_var(14) }, - { be_const_key_weak(commissioning_instance_wifi, 14), be_const_var(17) }, - { be_const_key_weak(attribute_updated, -1), be_const_closure(Matter_Device_attribute_updated_closure) }, - { be_const_key_weak(ipv4only, 11), be_const_var(28) }, - { be_const_key_weak(every_250ms, -1), be_const_closure(Matter_Device_every_250ms_closure) }, + { be_const_key_weak(commissioning_iterations, -1), be_const_var(11) }, + { be_const_key_weak(udp_server, -1), be_const_var(5) }, + { be_const_key_weak(_trigger_read_sensors, -1), be_const_closure(Matter_Device__trigger_read_sensors_closure) }, + { be_const_key_weak(bridge_add_endpoint, -1), be_const_closure(Matter_Device_bridge_add_endpoint_closure) }, + { be_const_key_weak(ipv4only, -1), be_const_var(28) }, + { be_const_key_weak(PBKDF_ITERATIONS, 44), be_const_int(1000) }, + { be_const_key_weak(invoke_request, -1), be_const_closure(Matter_Device_invoke_request_closure) }, + { be_const_key_weak(PRODUCT_ID, -1), be_const_int(32768) }, + { be_const_key_weak(every_50ms, -1), be_const_closure(Matter_Device_every_50ms_closure) }, + { be_const_key_weak(k2l_num, -1), be_const_static_closure(Matter_Device_k2l_num_closure) }, + { be_const_key_weak(autoconf_device, -1), be_const_closure(Matter_Device_autoconf_device_closure) }, + { be_const_key_weak(mdns_announce_op_discovery, -1), be_const_closure(Matter_Device_mdns_announce_op_discovery_closure) }, + { be_const_key_weak(msg_send, -1), be_const_closure(Matter_Device_msg_send_closure) }, + { be_const_key_weak(start_basic_commissioning, -1), be_const_closure(Matter_Device_start_basic_commissioning_closure) }, + { be_const_key_weak(commissioning_L, -1), be_const_var(15) }, + { be_const_key_weak(find_plugin_by_endpoint, -1), be_const_closure(Matter_Device_find_plugin_by_endpoint_closure) }, + { be_const_key_weak(start_mdns_announce_hostnames, -1), be_const_closure(Matter_Device_start_mdns_announce_hostnames_closure) }, + { be_const_key_weak(start_commissioning_complete_deferred, -1), be_const_closure(Matter_Device_start_commissioning_complete_deferred_closure) }, + { be_const_key_weak(next_ep, -1), be_const_var(29) }, + { be_const_key_weak(start_root_basic_commissioning, -1), be_const_closure(Matter_Device_start_root_basic_commissioning_closure) }, + { be_const_key_weak(start_operational_discovery_deferred, 25), be_const_closure(Matter_Device_start_operational_discovery_deferred_closure) }, + { be_const_key_weak(PASE_TIMEOUT, -1), be_const_int(600) }, + { be_const_key_weak(ui, 16), be_const_var(8) }, + { be_const_key_weak(tick, -1), be_const_var(9) }, + { be_const_key_weak(register_native_classes, -1), be_const_closure(Matter_Device_register_native_classes_closure) }, + { be_const_key_weak(sort_distinct, -1), be_const_static_closure(Matter_Device_sort_distinct_closure) }, + { be_const_key_weak(signal_endpoints_changed, -1), be_const_closure(Matter_Device_signal_endpoints_changed_closure) }, })), be_str_weak(Matter_Device) ); diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Fabric.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Fabric.h index fc973c915..7e77814f7 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Fabric.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Fabric.h @@ -994,7 +994,7 @@ be_local_closure(Matter_Fabric_before_remove, /* name */ /* K6 */ be_nested_str_weak(copy), /* K7 */ be_nested_str_weak(reverse), /* K8 */ be_nested_str_weak(tohex), - /* K9 */ be_const_int(2), + /* K9 */ be_const_int(3), }), be_str_weak(before_remove), &be_const_str_solidified, @@ -1352,7 +1352,7 @@ be_local_closure(Matter_Fabric_log_new_fabric, /* name */ /* K7 */ be_nested_str_weak(reverse), /* K8 */ be_nested_str_weak(tohex), /* K9 */ be_nested_str_weak(get_admin_vendor_name), - /* K10 */ be_const_int(2), + /* K10 */ be_const_int(3), }), be_str_weak(log_new_fabric), &be_const_str_solidified, diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_HTTP_remote.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_HTTP_remote.h index 7f0bad2b8..58b2b1bcf 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_HTTP_remote.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_HTTP_remote.h @@ -77,7 +77,7 @@ be_local_closure(Matter_HTTP_remote_call_sync, /* name */ /* K13 */ be_nested_str_weak(MTR_X3A_X20HTTP_X20sync_X20request_X20_X27http_X3A_X2F_X2F_X25s_X3A_X25i_X25s_X27), /* K14 */ be_nested_str_weak(addr), /* K15 */ be_nested_str_weak(port), - /* K16 */ be_const_int(2), + /* K16 */ be_const_int(3), /* K17 */ be_nested_str_weak(begin_sync), /* K18 */ be_nested_str_weak(nil), /* K19 */ be_const_int(0), @@ -402,7 +402,7 @@ be_local_closure(Matter_HTTP_remote_event_http_finished, /* name */ /* K10 */ be_nested_str_weak(millis), /* K11 */ be_nested_str_weak(time_start), /* K12 */ be_nested_str_weak(addr), - /* K13 */ be_const_int(2), + /* K13 */ be_const_int(3), /* K14 */ be_nested_str_weak(dispatch_cb), /* K15 */ be_nested_str_weak(http_status), }), @@ -661,7 +661,7 @@ be_local_closure(Matter_HTTP_remote_event_http_timeout, /* name */ /* K7 */ be_nested_str_weak(phase), /* K8 */ be_nested_str_weak(status), /* K9 */ be_nested_str_weak(payload), - /* K10 */ be_const_int(2), + /* K10 */ be_const_int(3), /* K11 */ be_nested_str_weak(dispatch_cb), }), be_str_weak(event_http_timeout), diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_IM.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_IM.h index 86017e501..85fde88ab 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_IM.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_IM.h @@ -75,7 +75,7 @@ be_local_closure(Matter_IM_process_invoke_request, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[44]) { /* constants */ + ( &(const bvalue[45]) { /* constants */ /* K0 */ be_nested_str_weak(string), /* K1 */ be_nested_str_weak(matter), /* K2 */ be_nested_str_weak(Path), @@ -104,26 +104,27 @@ be_local_closure(Matter_IM_process_invoke_request, /* name */ /* K25 */ be_nested_str_weak(format), /* K26 */ be_nested_str_weak(MTR_X3A_X20_X3ECommand_X20_X20_X20_X28_X256i_X29_X20_X25s_X20_X25s_X20_X25s), /* K27 */ be_nested_str_weak(local_session_id), - /* K28 */ be_const_int(2), - /* K29 */ be_nested_str_weak(InvokeResponseIB), - /* K30 */ be_nested_str_weak(SUCCESS), - /* K31 */ be_nested_str_weak(CommandStatusIB), - /* K32 */ be_nested_str_weak(CommandPathIB), - /* K33 */ be_nested_str_weak(StatusIB), - /* K34 */ be_nested_str_weak(push), - /* K35 */ be_nested_str_weak(MTR_X3A_X20_X3CReplied_X20_X20_X20_X28_X256i_X29_X20OK_X20exch_X3D_X25i), - /* K36 */ be_nested_str_weak(exchange_id), - /* K37 */ be_nested_str_weak(CommandDataIB), - /* K38 */ be_nested_str_weak(MTR_X3A_X20_X3CReplied_X20_X20_X20_X28_X256i_X29_X20_X25s_X20_X25s), - /* K39 */ be_nested_str_weak(MTR_X3A_X20_X3CReplied_X20_X20_X20_X28_X256i_X29_X20Status_X3D0x_X2502X_X20exch_X3D_X25i), - /* K40 */ be_nested_str_weak(MTR_X3A_X20_Ignore_X20_X20_X20_X20_X28_X256i_X29_X20exch_X3D_X25i), - /* K41 */ be_nested_str_weak(stop_iteration), - /* K42 */ be_const_int(0), - /* K43 */ be_nested_str_weak(send_invoke_response), + /* K28 */ be_const_int(0), + /* K29 */ be_const_int(2), + /* K30 */ be_const_int(3), + /* K31 */ be_nested_str_weak(InvokeResponseIB), + /* K32 */ be_nested_str_weak(SUCCESS), + /* K33 */ be_nested_str_weak(CommandStatusIB), + /* K34 */ be_nested_str_weak(CommandPathIB), + /* K35 */ be_nested_str_weak(StatusIB), + /* K36 */ be_nested_str_weak(push), + /* K37 */ be_nested_str_weak(MTR_X3A_X20_X3CReplied_X20_X20_X20_X28_X256i_X29_X20OK_X20exch_X3D_X25i), + /* K38 */ be_nested_str_weak(exchange_id), + /* K39 */ be_nested_str_weak(CommandDataIB), + /* K40 */ be_nested_str_weak(MTR_X3A_X20_X3CReplied_X20_X20_X20_X28_X256i_X29_X20_X25s_X20_X25s), + /* K41 */ be_nested_str_weak(MTR_X3A_X20_X3CReplied_X20_X20_X20_X28_X256i_X29_X20Status_X3D0x_X2502X_X20exch_X3D_X25i), + /* K42 */ be_nested_str_weak(MTR_X3A_X20_Ignore_X20_X20_X20_X20_X28_X256i_X29_X20exch_X3D_X25i), + /* K43 */ be_nested_str_weak(stop_iteration), + /* K44 */ be_nested_str_weak(send_invoke_response), }), be_str_weak(process_invoke_request), &be_const_str_solidified, - ( &(const binstruction[271]) { /* code */ + ( &(const binstruction[276]) { /* code */ 0xA40E0000, // 0000 IMPORT R3 K0 0xB8120200, // 0001 GETNGBL R4 K1 0x8C100902, // 0002 GETMET R4 R4 K2 @@ -137,7 +138,7 @@ be_local_closure(Matter_IM_process_invoke_request, /* name */ 0x88180B05, // 000A GETMBR R6 R5 K5 0x4C1C0000, // 000B LDNIL R7 0x20180C07, // 000C NE R6 R6 R7 - 0x781A00FF, // 000D JMPF R6 #010E + 0x781A0104, // 000D JMPF R6 #0113 0xB81A0200, // 000E GETNGBL R6 K1 0x8C180D06, // 000F GETMET R6 R6 K6 0x7C180200, // 0010 CALL R6 1 @@ -149,7 +150,7 @@ be_local_closure(Matter_IM_process_invoke_request, /* name */ 0x601C0010, // 0016 GETGBL R7 G16 0x88200B05, // 0017 GETMBR R8 R5 K5 0x7C1C0200, // 0018 CALL R7 1 - 0xA80200E2, // 0019 EXBLK 0 #00FD + 0xA80200E7, // 0019 EXBLK 0 #0102 0x5C200E00, // 001A MOVE R8 R7 0x7C200000, // 001B CALL R8 0 0x8824110A, // 001C GETMBR R9 R8 K10 @@ -202,199 +203,204 @@ be_local_closure(Matter_IM_process_invoke_request, /* name */ 0x58500017, // 004B LDCONST R20 K23 0x5C541800, // 004C MOVE R21 R12 0x7C3C0C00, // 004D CALL R15 6 - 0x5840001C, // 004E LDCONST R16 K28 - 0x7C340600, // 004F CALL R13 3 - 0x4C340000, // 0050 LDNIL R13 - 0x9012280D, // 0051 SETMBR R4 K20 R13 - 0xB8360200, // 0052 GETNGBL R13 K1 - 0x8C341B1D, // 0053 GETMET R13 R13 K29 - 0x7C340200, // 0054 CALL R13 1 - 0x50380200, // 0055 LDBOOL R14 1 0 - 0x1C38160E, // 0056 EQ R14 R11 R14 - 0x743A0004, // 0057 JMPT R14 #005D - 0x8838090D, // 0058 GETMBR R14 R4 K13 - 0xB83E0200, // 0059 GETNGBL R15 K1 - 0x883C1F1E, // 005A GETMBR R15 R15 K30 - 0x1C381C0F, // 005B EQ R14 R14 R15 - 0x783A002D, // 005C JMPF R14 #008B - 0xB83A0200, // 005D GETNGBL R14 K1 - 0x8C381D1F, // 005E GETMET R14 R14 K31 - 0x7C380200, // 005F CALL R14 1 - 0x90361A0E, // 0060 SETMBR R13 K13 R14 - 0x88381B0D, // 0061 GETMBR R14 R13 K13 - 0xB83E0200, // 0062 GETNGBL R15 K1 - 0x8C3C1F20, // 0063 GETMET R15 R15 K32 - 0x7C3C0200, // 0064 CALL R15 1 - 0x903A140F, // 0065 SETMBR R14 K10 R15 + 0x88400909, // 004E GETMBR R16 R4 K9 + 0x2040211C, // 004F NE R16 R16 K28 + 0x78420001, // 0050 JMPF R16 #0053 + 0x5840001D, // 0051 LDCONST R16 K29 + 0x70020000, // 0052 JMP #0054 + 0x5840001E, // 0053 LDCONST R16 K30 + 0x7C340600, // 0054 CALL R13 3 + 0x4C340000, // 0055 LDNIL R13 + 0x9012280D, // 0056 SETMBR R4 K20 R13 + 0xB8360200, // 0057 GETNGBL R13 K1 + 0x8C341B1F, // 0058 GETMET R13 R13 K31 + 0x7C340200, // 0059 CALL R13 1 + 0x50380200, // 005A LDBOOL R14 1 0 + 0x1C38160E, // 005B EQ R14 R11 R14 + 0x743A0004, // 005C JMPT R14 #0062 + 0x8838090D, // 005D GETMBR R14 R4 K13 + 0xB83E0200, // 005E GETNGBL R15 K1 + 0x883C1F20, // 005F GETMBR R15 R15 K32 + 0x1C381C0F, // 0060 EQ R14 R14 R15 + 0x783A002D, // 0061 JMPF R14 #0090 + 0xB83A0200, // 0062 GETNGBL R14 K1 + 0x8C381D21, // 0063 GETMET R14 R14 K33 + 0x7C380200, // 0064 CALL R14 1 + 0x90361A0E, // 0065 SETMBR R13 K13 R14 0x88381B0D, // 0066 GETMBR R14 R13 K13 - 0x88381D0A, // 0067 GETMBR R14 R14 K10 - 0x883C0909, // 0068 GETMBR R15 R4 K9 - 0x903A120F, // 0069 SETMBR R14 K9 R15 - 0x88381B0D, // 006A GETMBR R14 R13 K13 - 0x88381D0A, // 006B GETMBR R14 R14 K10 - 0x883C090B, // 006C GETMBR R15 R4 K11 - 0x903A160F, // 006D SETMBR R14 K11 R15 - 0x88381B0D, // 006E GETMBR R14 R13 K13 - 0x88381D0A, // 006F GETMBR R14 R14 K10 - 0x883C090C, // 0070 GETMBR R15 R4 K12 - 0x903A180F, // 0071 SETMBR R14 K12 R15 - 0x88381B0D, // 0072 GETMBR R14 R13 K13 - 0xB83E0200, // 0073 GETNGBL R15 K1 - 0x8C3C1F21, // 0074 GETMET R15 R15 K33 - 0x7C3C0200, // 0075 CALL R15 1 - 0x903A1A0F, // 0076 SETMBR R14 K13 R15 + 0xB83E0200, // 0067 GETNGBL R15 K1 + 0x8C3C1F22, // 0068 GETMET R15 R15 K34 + 0x7C3C0200, // 0069 CALL R15 1 + 0x903A140F, // 006A SETMBR R14 K10 R15 + 0x88381B0D, // 006B GETMBR R14 R13 K13 + 0x88381D0A, // 006C GETMBR R14 R14 K10 + 0x883C0909, // 006D GETMBR R15 R4 K9 + 0x903A120F, // 006E SETMBR R14 K9 R15 + 0x88381B0D, // 006F GETMBR R14 R13 K13 + 0x88381D0A, // 0070 GETMBR R14 R14 K10 + 0x883C090B, // 0071 GETMBR R15 R4 K11 + 0x903A160F, // 0072 SETMBR R14 K11 R15 + 0x88381B0D, // 0073 GETMBR R14 R13 K13 + 0x88381D0A, // 0074 GETMBR R14 R14 K10 + 0x883C090C, // 0075 GETMBR R15 R4 K12 + 0x903A180F, // 0076 SETMBR R14 K12 R15 0x88381B0D, // 0077 GETMBR R14 R13 K13 - 0x88381D0D, // 0078 GETMBR R14 R14 K13 - 0xB83E0200, // 0079 GETNGBL R15 K1 - 0x883C1F1E, // 007A GETMBR R15 R15 K30 + 0xB83E0200, // 0078 GETNGBL R15 K1 + 0x8C3C1F23, // 0079 GETMET R15 R15 K35 + 0x7C3C0200, // 007A CALL R15 1 0x903A1A0F, // 007B SETMBR R14 K13 R15 - 0x88380D08, // 007C GETMBR R14 R6 K8 - 0x8C381D22, // 007D GETMET R14 R14 K34 - 0x5C401A00, // 007E MOVE R16 R13 - 0x7C380400, // 007F CALL R14 2 - 0xB83A3000, // 0080 GETNGBL R14 K24 - 0x8C381D14, // 0081 GETMET R14 R14 K20 - 0x8C400719, // 0082 GETMET R16 R3 K25 - 0x58480023, // 0083 LDCONST R18 K35 - 0x884C0312, // 0084 GETMBR R19 R1 K18 - 0x884C271B, // 0085 GETMBR R19 R19 K27 - 0x88500324, // 0086 GETMBR R20 R1 K36 - 0x7C400800, // 0087 CALL R16 4 - 0x5844001C, // 0088 LDCONST R17 K28 - 0x7C380600, // 0089 CALL R14 3 - 0x70020070, // 008A JMP #00FC - 0x4C380000, // 008B LDNIL R14 - 0x2038160E, // 008C NE R14 R11 R14 - 0x783A0031, // 008D JMPF R14 #00C0 - 0xB83A0200, // 008E GETNGBL R14 K1 - 0x8C381D25, // 008F GETMET R14 R14 K37 - 0x7C380200, // 0090 CALL R14 1 - 0x9036180E, // 0091 SETMBR R13 K12 R14 - 0x88381B0C, // 0092 GETMBR R14 R13 K12 - 0xB83E0200, // 0093 GETNGBL R15 K1 - 0x8C3C1F20, // 0094 GETMET R15 R15 K32 - 0x7C3C0200, // 0095 CALL R15 1 - 0x903A140F, // 0096 SETMBR R14 K10 R15 + 0x88381B0D, // 007C GETMBR R14 R13 K13 + 0x88381D0D, // 007D GETMBR R14 R14 K13 + 0xB83E0200, // 007E GETNGBL R15 K1 + 0x883C1F20, // 007F GETMBR R15 R15 K32 + 0x903A1A0F, // 0080 SETMBR R14 K13 R15 + 0x88380D08, // 0081 GETMBR R14 R6 K8 + 0x8C381D24, // 0082 GETMET R14 R14 K36 + 0x5C401A00, // 0083 MOVE R16 R13 + 0x7C380400, // 0084 CALL R14 2 + 0xB83A3000, // 0085 GETNGBL R14 K24 + 0x8C381D14, // 0086 GETMET R14 R14 K20 + 0x8C400719, // 0087 GETMET R16 R3 K25 + 0x58480025, // 0088 LDCONST R18 K37 + 0x884C0312, // 0089 GETMBR R19 R1 K18 + 0x884C271B, // 008A GETMBR R19 R19 K27 + 0x88500326, // 008B GETMBR R20 R1 K38 + 0x7C400800, // 008C CALL R16 4 + 0x5844001E, // 008D LDCONST R17 K30 + 0x7C380600, // 008E CALL R14 3 + 0x70020070, // 008F JMP #0101 + 0x4C380000, // 0090 LDNIL R14 + 0x2038160E, // 0091 NE R14 R11 R14 + 0x783A0031, // 0092 JMPF R14 #00C5 + 0xB83A0200, // 0093 GETNGBL R14 K1 + 0x8C381D27, // 0094 GETMET R14 R14 K39 + 0x7C380200, // 0095 CALL R14 1 + 0x9036180E, // 0096 SETMBR R13 K12 R14 0x88381B0C, // 0097 GETMBR R14 R13 K12 - 0x88381D0A, // 0098 GETMBR R14 R14 K10 - 0x883C0909, // 0099 GETMBR R15 R4 K9 - 0x903A120F, // 009A SETMBR R14 K9 R15 - 0x88381B0C, // 009B GETMBR R14 R13 K12 - 0x88381D0A, // 009C GETMBR R14 R14 K10 - 0x883C090B, // 009D GETMBR R15 R4 K11 - 0x903A160F, // 009E SETMBR R14 K11 R15 - 0x88381B0C, // 009F GETMBR R14 R13 K12 - 0x88381D0A, // 00A0 GETMBR R14 R14 K10 - 0x883C090C, // 00A1 GETMBR R15 R4 K12 - 0x903A180F, // 00A2 SETMBR R14 K12 R15 - 0x88381B0C, // 00A3 GETMBR R14 R13 K12 - 0x903A260B, // 00A4 SETMBR R14 K19 R11 - 0x88380D08, // 00A5 GETMBR R14 R6 K8 - 0x8C381D22, // 00A6 GETMET R14 R14 K34 - 0x5C401A00, // 00A7 MOVE R16 R13 - 0x7C380400, // 00A8 CALL R14 2 - 0xB83A0200, // 00A9 GETNGBL R14 K1 - 0x8C381D0F, // 00AA GETMET R14 R14 K15 - 0x8840090B, // 00AB GETMBR R16 R4 K11 - 0x8844090C, // 00AC GETMBR R17 R4 K12 - 0x7C380600, // 00AD CALL R14 3 - 0x5C241C00, // 00AE MOVE R9 R14 - 0xB83A3000, // 00AF GETNGBL R14 K24 - 0x8C381D14, // 00B0 GETMET R14 R14 K20 - 0x8C400719, // 00B1 GETMET R16 R3 K25 - 0x58480026, // 00B2 LDCONST R18 K38 - 0x884C0312, // 00B3 GETMBR R19 R1 K18 - 0x884C271B, // 00B4 GETMBR R19 R19 K27 - 0x60500008, // 00B5 GETGBL R20 G8 - 0x5C540800, // 00B6 MOVE R21 R4 - 0x7C500200, // 00B7 CALL R20 1 - 0x78260001, // 00B8 JMPF R9 #00BB - 0x5C541200, // 00B9 MOVE R21 R9 - 0x70020000, // 00BA JMP #00BC - 0x58540017, // 00BB LDCONST R21 K23 - 0x7C400A00, // 00BC CALL R16 5 - 0x5844001C, // 00BD LDCONST R17 K28 - 0x7C380600, // 00BE CALL R14 3 - 0x7002003B, // 00BF JMP #00FC - 0x8838090D, // 00C0 GETMBR R14 R4 K13 - 0x4C3C0000, // 00C1 LDNIL R15 - 0x20381C0F, // 00C2 NE R14 R14 R15 - 0x783A002D, // 00C3 JMPF R14 #00F2 - 0xB83A0200, // 00C4 GETNGBL R14 K1 - 0x8C381D1F, // 00C5 GETMET R14 R14 K31 - 0x7C380200, // 00C6 CALL R14 1 - 0x90361A0E, // 00C7 SETMBR R13 K13 R14 - 0x88381B0D, // 00C8 GETMBR R14 R13 K13 - 0xB83E0200, // 00C9 GETNGBL R15 K1 - 0x8C3C1F20, // 00CA GETMET R15 R15 K32 - 0x7C3C0200, // 00CB CALL R15 1 - 0x903A140F, // 00CC SETMBR R14 K10 R15 + 0xB83E0200, // 0098 GETNGBL R15 K1 + 0x8C3C1F22, // 0099 GETMET R15 R15 K34 + 0x7C3C0200, // 009A CALL R15 1 + 0x903A140F, // 009B SETMBR R14 K10 R15 + 0x88381B0C, // 009C GETMBR R14 R13 K12 + 0x88381D0A, // 009D GETMBR R14 R14 K10 + 0x883C0909, // 009E GETMBR R15 R4 K9 + 0x903A120F, // 009F SETMBR R14 K9 R15 + 0x88381B0C, // 00A0 GETMBR R14 R13 K12 + 0x88381D0A, // 00A1 GETMBR R14 R14 K10 + 0x883C090B, // 00A2 GETMBR R15 R4 K11 + 0x903A160F, // 00A3 SETMBR R14 K11 R15 + 0x88381B0C, // 00A4 GETMBR R14 R13 K12 + 0x88381D0A, // 00A5 GETMBR R14 R14 K10 + 0x883C090C, // 00A6 GETMBR R15 R4 K12 + 0x903A180F, // 00A7 SETMBR R14 K12 R15 + 0x88381B0C, // 00A8 GETMBR R14 R13 K12 + 0x903A260B, // 00A9 SETMBR R14 K19 R11 + 0x88380D08, // 00AA GETMBR R14 R6 K8 + 0x8C381D24, // 00AB GETMET R14 R14 K36 + 0x5C401A00, // 00AC MOVE R16 R13 + 0x7C380400, // 00AD CALL R14 2 + 0xB83A0200, // 00AE GETNGBL R14 K1 + 0x8C381D0F, // 00AF GETMET R14 R14 K15 + 0x8840090B, // 00B0 GETMBR R16 R4 K11 + 0x8844090C, // 00B1 GETMBR R17 R4 K12 + 0x7C380600, // 00B2 CALL R14 3 + 0x5C241C00, // 00B3 MOVE R9 R14 + 0xB83A3000, // 00B4 GETNGBL R14 K24 + 0x8C381D14, // 00B5 GETMET R14 R14 K20 + 0x8C400719, // 00B6 GETMET R16 R3 K25 + 0x58480028, // 00B7 LDCONST R18 K40 + 0x884C0312, // 00B8 GETMBR R19 R1 K18 + 0x884C271B, // 00B9 GETMBR R19 R19 K27 + 0x60500008, // 00BA GETGBL R20 G8 + 0x5C540800, // 00BB MOVE R21 R4 + 0x7C500200, // 00BC CALL R20 1 + 0x78260001, // 00BD JMPF R9 #00C0 + 0x5C541200, // 00BE MOVE R21 R9 + 0x70020000, // 00BF JMP #00C1 + 0x58540017, // 00C0 LDCONST R21 K23 + 0x7C400A00, // 00C1 CALL R16 5 + 0x5844001E, // 00C2 LDCONST R17 K30 + 0x7C380600, // 00C3 CALL R14 3 + 0x7002003B, // 00C4 JMP #0101 + 0x8838090D, // 00C5 GETMBR R14 R4 K13 + 0x4C3C0000, // 00C6 LDNIL R15 + 0x20381C0F, // 00C7 NE R14 R14 R15 + 0x783A002D, // 00C8 JMPF R14 #00F7 + 0xB83A0200, // 00C9 GETNGBL R14 K1 + 0x8C381D21, // 00CA GETMET R14 R14 K33 + 0x7C380200, // 00CB CALL R14 1 + 0x90361A0E, // 00CC SETMBR R13 K13 R14 0x88381B0D, // 00CD GETMBR R14 R13 K13 - 0x88381D0A, // 00CE GETMBR R14 R14 K10 - 0x883C0909, // 00CF GETMBR R15 R4 K9 - 0x903A120F, // 00D0 SETMBR R14 K9 R15 - 0x88381B0D, // 00D1 GETMBR R14 R13 K13 - 0x88381D0A, // 00D2 GETMBR R14 R14 K10 - 0x883C090B, // 00D3 GETMBR R15 R4 K11 - 0x903A160F, // 00D4 SETMBR R14 K11 R15 - 0x88381B0D, // 00D5 GETMBR R14 R13 K13 - 0x88381D0A, // 00D6 GETMBR R14 R14 K10 - 0x883C090C, // 00D7 GETMBR R15 R4 K12 - 0x903A180F, // 00D8 SETMBR R14 K12 R15 - 0x88381B0D, // 00D9 GETMBR R14 R13 K13 - 0xB83E0200, // 00DA GETNGBL R15 K1 - 0x8C3C1F21, // 00DB GETMET R15 R15 K33 - 0x7C3C0200, // 00DC CALL R15 1 - 0x903A1A0F, // 00DD SETMBR R14 K13 R15 + 0xB83E0200, // 00CE GETNGBL R15 K1 + 0x8C3C1F22, // 00CF GETMET R15 R15 K34 + 0x7C3C0200, // 00D0 CALL R15 1 + 0x903A140F, // 00D1 SETMBR R14 K10 R15 + 0x88381B0D, // 00D2 GETMBR R14 R13 K13 + 0x88381D0A, // 00D3 GETMBR R14 R14 K10 + 0x883C0909, // 00D4 GETMBR R15 R4 K9 + 0x903A120F, // 00D5 SETMBR R14 K9 R15 + 0x88381B0D, // 00D6 GETMBR R14 R13 K13 + 0x88381D0A, // 00D7 GETMBR R14 R14 K10 + 0x883C090B, // 00D8 GETMBR R15 R4 K11 + 0x903A160F, // 00D9 SETMBR R14 K11 R15 + 0x88381B0D, // 00DA GETMBR R14 R13 K13 + 0x88381D0A, // 00DB GETMBR R14 R14 K10 + 0x883C090C, // 00DC GETMBR R15 R4 K12 + 0x903A180F, // 00DD SETMBR R14 K12 R15 0x88381B0D, // 00DE GETMBR R14 R13 K13 - 0x88381D0D, // 00DF GETMBR R14 R14 K13 - 0x883C090D, // 00E0 GETMBR R15 R4 K13 - 0x903A1A0F, // 00E1 SETMBR R14 K13 R15 - 0x88380D08, // 00E2 GETMBR R14 R6 K8 - 0x8C381D22, // 00E3 GETMET R14 R14 K34 - 0x5C401A00, // 00E4 MOVE R16 R13 - 0x7C380400, // 00E5 CALL R14 2 - 0xB83A3000, // 00E6 GETNGBL R14 K24 - 0x8C381D14, // 00E7 GETMET R14 R14 K20 - 0x8C400719, // 00E8 GETMET R16 R3 K25 - 0x58480027, // 00E9 LDCONST R18 K39 - 0x884C0312, // 00EA GETMBR R19 R1 K18 - 0x884C271B, // 00EB GETMBR R19 R19 K27 - 0x8850090D, // 00EC GETMBR R20 R4 K13 - 0x88540324, // 00ED GETMBR R21 R1 K36 - 0x7C400A00, // 00EE CALL R16 5 - 0x5844001C, // 00EF LDCONST R17 K28 - 0x7C380600, // 00F0 CALL R14 3 - 0x70020009, // 00F1 JMP #00FC - 0xB83A3000, // 00F2 GETNGBL R14 K24 - 0x8C381D14, // 00F3 GETMET R14 R14 K20 - 0x8C400719, // 00F4 GETMET R16 R3 K25 - 0x58480028, // 00F5 LDCONST R18 K40 - 0x884C0312, // 00F6 GETMBR R19 R1 K18 - 0x884C271B, // 00F7 GETMBR R19 R19 K27 - 0x88500324, // 00F8 GETMBR R20 R1 K36 - 0x7C400800, // 00F9 CALL R16 4 - 0x5844001C, // 00FA LDCONST R17 K28 - 0x7C380600, // 00FB CALL R14 3 - 0x7001FF1C, // 00FC JMP #001A - 0x581C0029, // 00FD LDCONST R7 K41 - 0xAC1C0200, // 00FE CATCH R7 1 0 - 0xB0080000, // 00FF RAISE 2 R0 R0 - 0x601C000C, // 0100 GETGBL R7 G12 - 0x88200D08, // 0101 GETMBR R8 R6 K8 - 0x7C1C0200, // 0102 CALL R7 1 - 0x241C0F2A, // 0103 GT R7 R7 K42 - 0x781E0004, // 0104 JMPF R7 #010A - 0x8C1C012B, // 0105 GETMET R7 R0 K43 - 0x5C240200, // 0106 MOVE R9 R1 - 0x5C280C00, // 0107 MOVE R10 R6 - 0x7C1C0600, // 0108 CALL R7 3 - 0x70020001, // 0109 JMP #010C - 0x501C0000, // 010A LDBOOL R7 0 0 - 0x80040E00, // 010B RET 1 R7 - 0x501C0200, // 010C LDBOOL R7 1 0 - 0x80040E00, // 010D RET 1 R7 - 0x80000000, // 010E RET 0 + 0xB83E0200, // 00DF GETNGBL R15 K1 + 0x8C3C1F23, // 00E0 GETMET R15 R15 K35 + 0x7C3C0200, // 00E1 CALL R15 1 + 0x903A1A0F, // 00E2 SETMBR R14 K13 R15 + 0x88381B0D, // 00E3 GETMBR R14 R13 K13 + 0x88381D0D, // 00E4 GETMBR R14 R14 K13 + 0x883C090D, // 00E5 GETMBR R15 R4 K13 + 0x903A1A0F, // 00E6 SETMBR R14 K13 R15 + 0x88380D08, // 00E7 GETMBR R14 R6 K8 + 0x8C381D24, // 00E8 GETMET R14 R14 K36 + 0x5C401A00, // 00E9 MOVE R16 R13 + 0x7C380400, // 00EA CALL R14 2 + 0xB83A3000, // 00EB GETNGBL R14 K24 + 0x8C381D14, // 00EC GETMET R14 R14 K20 + 0x8C400719, // 00ED GETMET R16 R3 K25 + 0x58480029, // 00EE LDCONST R18 K41 + 0x884C0312, // 00EF GETMBR R19 R1 K18 + 0x884C271B, // 00F0 GETMBR R19 R19 K27 + 0x8850090D, // 00F1 GETMBR R20 R4 K13 + 0x88540326, // 00F2 GETMBR R21 R1 K38 + 0x7C400A00, // 00F3 CALL R16 5 + 0x5844001E, // 00F4 LDCONST R17 K30 + 0x7C380600, // 00F5 CALL R14 3 + 0x70020009, // 00F6 JMP #0101 + 0xB83A3000, // 00F7 GETNGBL R14 K24 + 0x8C381D14, // 00F8 GETMET R14 R14 K20 + 0x8C400719, // 00F9 GETMET R16 R3 K25 + 0x5848002A, // 00FA LDCONST R18 K42 + 0x884C0312, // 00FB GETMBR R19 R1 K18 + 0x884C271B, // 00FC GETMBR R19 R19 K27 + 0x88500326, // 00FD GETMBR R20 R1 K38 + 0x7C400800, // 00FE CALL R16 4 + 0x5844001E, // 00FF LDCONST R17 K30 + 0x7C380600, // 0100 CALL R14 3 + 0x7001FF17, // 0101 JMP #001A + 0x581C002B, // 0102 LDCONST R7 K43 + 0xAC1C0200, // 0103 CATCH R7 1 0 + 0xB0080000, // 0104 RAISE 2 R0 R0 + 0x601C000C, // 0105 GETGBL R7 G12 + 0x88200D08, // 0106 GETMBR R8 R6 K8 + 0x7C1C0200, // 0107 CALL R7 1 + 0x241C0F1C, // 0108 GT R7 R7 K28 + 0x781E0004, // 0109 JMPF R7 #010F + 0x8C1C012C, // 010A GETMET R7 R0 K44 + 0x5C240200, // 010B MOVE R9 R1 + 0x5C280C00, // 010C MOVE R10 R6 + 0x7C1C0600, // 010D CALL R7 3 + 0x70020001, // 010E JMP #0111 + 0x501C0000, // 010F LDBOOL R7 0 0 + 0x80040E00, // 0110 RET 1 R7 + 0x501C0200, // 0111 LDBOOL R7 1 0 + 0x80040E00, // 0112 RET 1 R7 + 0x80000000, // 0113 RET 0 }) ) ); @@ -443,7 +449,7 @@ be_local_closure(Matter_IM_subscribe_request, /* name */ /* K25 */ be_const_int(1), /* K26 */ be_const_int(0), /* K27 */ be_nested_str_weak(subscription_id), - /* K28 */ be_const_int(2), + /* K28 */ be_const_int(3), /* K29 */ be_nested_str_weak(_inner_process_read_request), /* K30 */ be_nested_str_weak(send_subscribe_response), }), @@ -557,7 +563,7 @@ be_local_closure(Matter_IM_process_write_request, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[26]) { /* constants */ + ( &(const bvalue[28]) { /* constants */ /* K0 */ be_nested_str_weak(string), /* K1 */ be_nested_str_weak(matter), /* K2 */ be_nested_str_weak(get_attribute_name), @@ -582,12 +588,14 @@ be_local_closure(Matter_IM_process_write_request, /* name */ /* K21 */ be_nested_str_weak(log), /* K22 */ be_nested_str_weak(format), /* K23 */ be_nested_str_weak(MTR_X3A_X20Write_Attr_X20_X25s_X25s_X20_X2D_X20STATUS_X3A_X200x_X2502X_X20_X25s), - /* K24 */ be_const_int(2), - /* K25 */ be_nested_str_weak(MTR_X3A_X20Write_Attr_X20_X25s_X25s_X20_X2D_X20IGNORED), + /* K24 */ be_const_int(0), + /* K25 */ be_const_int(2), + /* K26 */ be_const_int(3), + /* K27 */ be_nested_str_weak(MTR_X3A_X20Write_Attr_X20_X25s_X25s_X20_X2D_X20IGNORED), }), be_str_weak(write_single_attribute), &be_const_str_solidified, - ( &(const binstruction[97]) { /* code */ + ( &(const binstruction[102]) { /* code */ 0xA4160000, // 0000 IMPORT R5 K0 0xB81A0200, // 0001 GETNGBL R6 K1 0x8C180D02, // 0002 GETMET R6 R6 K2 @@ -621,8 +629,8 @@ be_local_closure(Matter_IM_process_write_request, /* name */ 0x88200508, // 001E GETMBR R8 R2 K8 0x4C240000, // 001F LDNIL R9 0x20201009, // 0020 NE R8 R8 R9 - 0x78220032, // 0021 JMPF R8 #0055 - 0x78120030, // 0022 JMPF R4 #0054 + 0x78220037, // 0021 JMPF R8 #005A + 0x78120035, // 0022 JMPF R4 #0059 0xB8220200, // 0023 GETNGBL R8 K1 0x8C20110D, // 0024 GETMET R8 R8 K13 0x7C200200, // 0025 CALL R8 1 @@ -668,23 +676,28 @@ be_local_closure(Matter_IM_process_write_request, /* name */ 0x70020000, // 004D JMP #004F 0x58440007, // 004E LDCONST R17 K7 0x7C2C0C00, // 004F CALL R11 6 - 0x58300018, // 0050 LDCONST R12 K24 - 0x7C240600, // 0051 CALL R9 3 - 0x50240200, // 0052 LDBOOL R9 1 0 - 0x80041200, // 0053 RET 1 R9 - 0x7002000A, // 0054 JMP #0060 - 0xB8222800, // 0055 GETNGBL R8 K20 - 0x8C201115, // 0056 GETMET R8 R8 K21 - 0x8C280B16, // 0057 GETMET R10 R5 K22 - 0x58300019, // 0058 LDCONST R12 K25 - 0x60340008, // 0059 GETGBL R13 G8 - 0x5C380400, // 005A MOVE R14 R2 - 0x7C340200, // 005B CALL R13 1 - 0x5C380C00, // 005C MOVE R14 R6 - 0x7C280800, // 005D CALL R10 4 - 0x582C0018, // 005E LDCONST R11 K24 - 0x7C200600, // 005F CALL R8 3 - 0x80000000, // 0060 RET 0 + 0x88300511, // 0050 GETMBR R12 R2 K17 + 0x20301918, // 0051 NE R12 R12 K24 + 0x78320001, // 0052 JMPF R12 #0055 + 0x58300019, // 0053 LDCONST R12 K25 + 0x70020000, // 0054 JMP #0056 + 0x5830001A, // 0055 LDCONST R12 K26 + 0x7C240600, // 0056 CALL R9 3 + 0x50240200, // 0057 LDBOOL R9 1 0 + 0x80041200, // 0058 RET 1 R9 + 0x7002000A, // 0059 JMP #0065 + 0xB8222800, // 005A GETNGBL R8 K20 + 0x8C201115, // 005B GETMET R8 R8 K21 + 0x8C280B16, // 005C GETMET R10 R5 K22 + 0x5830001B, // 005D LDCONST R12 K27 + 0x60340008, // 005E GETGBL R13 G8 + 0x5C380400, // 005F MOVE R14 R2 + 0x7C340200, // 0060 CALL R13 1 + 0x5C380C00, // 0061 MOVE R14 R6 + 0x7C280800, // 0062 CALL R10 4 + 0x582C001A, // 0063 LDCONST R11 K26 + 0x7C200600, // 0064 CALL R8 3 + 0x80000000, // 0065 RET 0 }) ), be_nested_proto( @@ -743,7 +756,7 @@ be_local_closure(Matter_IM_process_write_request, /* name */ /* K23 */ be_nested_str_weak(_X20_X28), /* K24 */ be_nested_str_weak(_X29), /* K25 */ be_nested_str_weak(), - /* K26 */ be_const_int(2), + /* K26 */ be_const_int(3), /* K27 */ be_nested_str_weak(process_attribute_expansion), /* K28 */ be_nested_str_weak(stop_iteration), /* K29 */ be_nested_str_weak(send_write_response), @@ -1160,7 +1173,7 @@ be_local_closure(Matter_IM_send_status, /* name */ ********************************************************************/ be_local_closure(Matter_IM_subscribe_response, /* name */ be_nested_proto( - 9, /* nstack */ + 7, /* nstack */ 3, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -1168,19 +1181,15 @@ be_local_closure(Matter_IM_subscribe_response, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[ 8]) { /* constants */ + ( &(const bvalue[ 4]) { /* constants */ /* K0 */ be_nested_str_weak(string), /* K1 */ be_nested_str_weak(matter), /* K2 */ be_nested_str_weak(SubscribeResponseMessage), /* K3 */ be_nested_str_weak(from_TLV), - /* K4 */ be_nested_str_weak(tasmota), - /* K5 */ be_nested_str_weak(log), - /* K6 */ be_nested_str_weak(MTR_X3A_X20received_X20SubscribeResponsetMessage_X3D), - /* K7 */ be_const_int(2), }), be_str_weak(subscribe_response), &be_const_str_solidified, - ( &(const binstruction[17]) { /* code */ + ( &(const binstruction[ 9]) { /* code */ 0xA40E0000, // 0000 IMPORT R3 K0 0xB8120200, // 0001 GETNGBL R4 K1 0x8C100902, // 0002 GETMET R4 R4 K2 @@ -1188,16 +1197,8 @@ be_local_closure(Matter_IM_subscribe_response, /* name */ 0x8C100903, // 0004 GETMET R4 R4 K3 0x5C180400, // 0005 MOVE R6 R2 0x7C100400, // 0006 CALL R4 2 - 0xB8160800, // 0007 GETNGBL R5 K4 - 0x8C140B05, // 0008 GETMET R5 R5 K5 - 0x601C0008, // 0009 GETGBL R7 G8 - 0x5C200800, // 000A MOVE R8 R4 - 0x7C1C0200, // 000B CALL R7 1 - 0x001E0C07, // 000C ADD R7 K6 R7 - 0x58200007, // 000D LDCONST R8 K7 - 0x7C140600, // 000E CALL R5 3 - 0x50140000, // 000F LDBOOL R5 0 0 - 0x80040A00, // 0010 RET 1 R5 + 0x50140000, // 0007 LDBOOL R5 0 0 + 0x80040A00, // 0008 RET 1 R5 }) ) ); @@ -1411,7 +1412,7 @@ be_local_closure(Matter_IM__inner_process_read_request, /* name */ /* K24 */ be_nested_str_weak(format), /* K25 */ be_nested_str_weak(MTR_X3A_X20_X3ERead_Attr_X20_X28_X256i_X29_X20_X25s_X25s_X20_X2D_X20_X25s), /* K26 */ be_nested_str_weak(local_session_id), - /* K27 */ be_const_int(2), + /* K27 */ be_const_int(3), /* K28 */ be_nested_str_weak(status), /* K29 */ be_nested_str_weak(attribute_status), /* K30 */ be_nested_str_weak(AttributeStatusIB), @@ -1686,7 +1687,7 @@ be_local_closure(Matter_IM__inner_process_read_request, /* name */ /* K19 */ be_nested_str_weak(_X20_X28), /* K20 */ be_nested_str_weak(_X29), /* K21 */ be_nested_str_weak(), - /* K22 */ be_const_int(2), + /* K22 */ be_const_int(3), /* K23 */ be_nested_str_weak(process_attribute_expansion), /* K24 */ be_nested_str_weak(stop_iteration), }), @@ -1848,7 +1849,7 @@ be_local_closure(Matter_IM_find_sendqueue_by_exchangeid, /* name */ ********************************************************************/ be_local_closure(Matter_IM_process_incoming_ack, /* name */ be_nested_proto( - 11, /* nstack */ + 7, /* nstack */ 2, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -1856,47 +1857,26 @@ be_local_closure(Matter_IM_process_incoming_ack, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[11]) { /* constants */ + ( &(const bvalue[ 4]) { /* constants */ /* K0 */ be_nested_str_weak(string), /* K1 */ be_nested_str_weak(find_sendqueue_by_exchangeid), /* K2 */ be_nested_str_weak(exchange_id), - /* K3 */ be_nested_str_weak(tasmota), - /* K4 */ be_nested_str_weak(log), - /* K5 */ be_nested_str_weak(format), - /* K6 */ be_nested_str_weak(MTR_X3A_X20process_incoming_ack_X20exch_X3D_X25i_X20message_X3D_X25i), - /* K7 */ be_const_int(1), - /* K8 */ be_const_int(0), - /* K9 */ be_const_int(3), - /* K10 */ be_nested_str_weak(ack_received), + /* K3 */ be_nested_str_weak(ack_received), }), be_str_weak(process_incoming_ack), &be_const_str_solidified, - ( &(const binstruction[25]) { /* code */ + ( &(const binstruction[11]) { /* code */ 0xA40A0000, // 0000 IMPORT R2 K0 0x8C0C0101, // 0001 GETMET R3 R0 K1 0x88140302, // 0002 GETMBR R5 R1 K2 0x7C0C0400, // 0003 CALL R3 2 - 0xB8120600, // 0004 GETNGBL R4 K3 - 0x8C100904, // 0005 GETMET R4 R4 K4 - 0x8C180505, // 0006 GETMET R6 R2 K5 - 0x58200006, // 0007 LDCONST R8 K6 - 0x88240302, // 0008 GETMBR R9 R1 K2 - 0x4C280000, // 0009 LDNIL R10 - 0x2028060A, // 000A NE R10 R3 R10 - 0x782A0001, // 000B JMPF R10 #000E - 0x58280007, // 000C LDCONST R10 K7 - 0x70020000, // 000D JMP #000F - 0x58280008, // 000E LDCONST R10 K8 - 0x7C180800, // 000F CALL R6 4 - 0x581C0009, // 0010 LDCONST R7 K9 - 0x7C100600, // 0011 CALL R4 3 - 0x780E0003, // 0012 JMPF R3 #0017 - 0x8C10070A, // 0013 GETMET R4 R3 K10 - 0x5C180200, // 0014 MOVE R6 R1 - 0x7C100400, // 0015 CALL R4 2 - 0x80040800, // 0016 RET 1 R4 - 0x50100000, // 0017 LDBOOL R4 0 0 - 0x80040800, // 0018 RET 1 R4 + 0x780E0003, // 0004 JMPF R3 #0009 + 0x8C100703, // 0005 GETMET R4 R3 K3 + 0x5C180200, // 0006 MOVE R6 R1 + 0x7C100400, // 0007 CALL R4 2 + 0x80040800, // 0008 RET 1 R4 + 0x50100000, // 0009 LDBOOL R4 0 0 + 0x80040800, // 000A RET 1 R4 }) ) ); @@ -2004,7 +1984,7 @@ be_local_closure(Matter_IM_process_status_response, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[19]) { /* constants */ + ( &(const bvalue[18]) { /* constants */ /* K0 */ be_nested_str_weak(string), /* K1 */ be_nested_str_weak(findsubval), /* K2 */ be_const_int(0), @@ -2021,9 +2001,8 @@ be_local_closure(Matter_IM_process_status_response, /* name */ /* K13 */ be_nested_str_weak(local_session_id), /* K14 */ be_const_int(3), /* K15 */ be_nested_str_weak(MTR_X3A_X20_X3EStatus_X20_X20_X20_X20ERROR_X20_X3D_X200x_X2502X), - /* K16 */ be_const_int(2), - /* K17 */ be_nested_str_weak(status_error_received), - /* K18 */ be_nested_str_weak(remove_sendqueue_by_exchangeid), + /* K16 */ be_nested_str_weak(status_error_received), + /* K17 */ be_nested_str_weak(remove_sendqueue_by_exchangeid), }), be_str_weak(process_status_response), &be_const_str_solidified, @@ -2063,13 +2042,13 @@ be_local_closure(Matter_IM_process_status_response, /* name */ 0x5828000F, // 0020 LDCONST R10 K15 0x5C2C0800, // 0021 MOVE R11 R4 0x7C200600, // 0022 CALL R8 3 - 0x58240010, // 0023 LDCONST R9 K16 + 0x5824000E, // 0023 LDCONST R9 K14 0x7C180600, // 0024 CALL R6 3 0x78160005, // 0025 JMPF R5 #002C - 0x8C180B11, // 0026 GETMET R6 R5 K17 + 0x8C180B10, // 0026 GETMET R6 R5 K16 0x5C200200, // 0027 MOVE R8 R1 0x7C180400, // 0028 CALL R6 2 - 0x8C180112, // 0029 GETMET R6 R0 K18 + 0x8C180111, // 0029 GETMET R6 R0 K17 0x88200304, // 002A GETMBR R8 R1 K4 0x7C180400, // 002B CALL R6 2 0x50180000, // 002C LDBOOL R6 0 0 @@ -2085,7 +2064,7 @@ be_local_closure(Matter_IM_process_status_response, /* name */ ********************************************************************/ be_local_closure(Matter_IM_process_write_response, /* name */ be_nested_proto( - 9, /* nstack */ + 7, /* nstack */ 3, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -2093,19 +2072,15 @@ be_local_closure(Matter_IM_process_write_response, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[ 8]) { /* constants */ + ( &(const bvalue[ 4]) { /* constants */ /* K0 */ be_nested_str_weak(string), /* K1 */ be_nested_str_weak(matter), /* K2 */ be_nested_str_weak(WriteResponseMessage), /* K3 */ be_nested_str_weak(from_TLV), - /* K4 */ be_nested_str_weak(tasmota), - /* K5 */ be_nested_str_weak(log), - /* K6 */ be_nested_str_weak(MTR_X3A_X20received_X20WriteResponseMessage_X3D), - /* K7 */ be_const_int(2), }), be_str_weak(process_write_response), &be_const_str_solidified, - ( &(const binstruction[17]) { /* code */ + ( &(const binstruction[ 9]) { /* code */ 0xA40E0000, // 0000 IMPORT R3 K0 0xB8120200, // 0001 GETNGBL R4 K1 0x8C100902, // 0002 GETMET R4 R4 K2 @@ -2113,16 +2088,8 @@ be_local_closure(Matter_IM_process_write_response, /* name */ 0x8C100903, // 0004 GETMET R4 R4 K3 0x5C180400, // 0005 MOVE R6 R2 0x7C100400, // 0006 CALL R4 2 - 0xB8160800, // 0007 GETNGBL R5 K4 - 0x8C140B05, // 0008 GETMET R5 R5 K5 - 0x601C0008, // 0009 GETGBL R7 G8 - 0x5C200800, // 000A MOVE R8 R4 - 0x7C1C0200, // 000B CALL R7 1 - 0x001E0C07, // 000C ADD R7 K6 R7 - 0x58200007, // 000D LDCONST R8 K7 - 0x7C140600, // 000E CALL R5 3 - 0x50140000, // 000F LDBOOL R5 0 0 - 0x80040A00, // 0010 RET 1 R5 + 0x50140000, // 0007 LDBOOL R5 0 0 + 0x80040A00, // 0008 RET 1 R5 }) ) ); @@ -2162,7 +2129,7 @@ be_local_closure(Matter_IM_send_subscribe_update, /* name */ /* K16 */ be_nested_str_weak(MTR_X3A_X20_X3CSub_Data_X20_X20_X28_X256i_X29_X20sub_X3D_X25i), /* K17 */ be_nested_str_weak(local_session_id), /* K18 */ be_nested_str_weak(subscription_id), - /* K19 */ be_const_int(2), + /* K19 */ be_const_int(3), /* K20 */ be_nested_str_weak(is_keep_alive), /* K21 */ be_nested_str_weak(_inner_process_read_request), /* K22 */ be_nested_str_weak(suppress_response), @@ -2260,7 +2227,7 @@ be_local_closure(Matter_IM_send_enqueued, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[13]) { /* constants */ + ( &(const bvalue[12]) { /* constants */ /* K0 */ be_const_int(0), /* K1 */ be_nested_str_weak(send_queue), /* K2 */ be_nested_str_weak(finish), @@ -2271,9 +2238,8 @@ be_local_closure(Matter_IM_send_enqueued, /* name */ /* K7 */ be_nested_str_weak(MTR_X3A_X20remove_X20IM_X20message_X20exch_X3D), /* K8 */ be_nested_str_weak(resp), /* K9 */ be_nested_str_weak(exchange_id), - /* K10 */ be_const_int(3), - /* K11 */ be_nested_str_weak(remove), - /* K12 */ be_const_int(1), + /* K10 */ be_nested_str_weak(remove), + /* K11 */ be_const_int(1), }), be_str_weak(send_enqueued), &be_const_str_solidified, @@ -2302,14 +2268,14 @@ be_local_closure(Matter_IM_send_enqueued, /* name */ 0x881C0F09, // 0015 GETMBR R7 R7 K9 0x7C180200, // 0016 CALL R6 1 0x001A0E06, // 0017 ADD R6 K7 R6 - 0x581C000A, // 0018 LDCONST R7 K10 + 0x541E0003, // 0018 LDINT R7 4 0x7C100600, // 0019 CALL R4 3 0x88100101, // 001A GETMBR R4 R0 K1 - 0x8C10090B, // 001B GETMET R4 R4 K11 + 0x8C10090A, // 001B GETMET R4 R4 K10 0x5C180400, // 001C MOVE R6 R2 0x7C100400, // 001D CALL R4 2 0x70020000, // 001E JMP #0020 - 0x0008050C, // 001F ADD R2 R2 K12 + 0x0008050B, // 001F ADD R2 R2 K11 0x7001FFDF, // 0020 JMP #0001 0x80000000, // 0021 RET 0 }) @@ -2343,7 +2309,7 @@ be_local_closure(Matter_IM_process_timed_request, /* name */ /* K8 */ be_nested_str_weak(session), /* K9 */ be_nested_str_weak(local_session_id), /* K10 */ be_nested_str_weak(timeout), - /* K11 */ be_const_int(2), + /* K11 */ be_const_int(3), /* K12 */ be_nested_str_weak(send_status), /* K13 */ be_nested_str_weak(SUCCESS), }), @@ -2385,7 +2351,7 @@ be_local_closure(Matter_IM_process_timed_request, /* name */ ********************************************************************/ be_local_closure(Matter_IM_report_data, /* name */ be_nested_proto( - 9, /* nstack */ + 7, /* nstack */ 3, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -2393,19 +2359,15 @@ be_local_closure(Matter_IM_report_data, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[ 8]) { /* constants */ + ( &(const bvalue[ 4]) { /* constants */ /* K0 */ be_nested_str_weak(string), /* K1 */ be_nested_str_weak(matter), /* K2 */ be_nested_str_weak(ReportDataMessage), /* K3 */ be_nested_str_weak(from_TLV), - /* K4 */ be_nested_str_weak(tasmota), - /* K5 */ be_nested_str_weak(log), - /* K6 */ be_nested_str_weak(MTR_X3A_X20received_X20ReportDataMessage_X3D), - /* K7 */ be_const_int(2), }), be_str_weak(report_data), &be_const_str_solidified, - ( &(const binstruction[17]) { /* code */ + ( &(const binstruction[ 9]) { /* code */ 0xA40E0000, // 0000 IMPORT R3 K0 0xB8120200, // 0001 GETNGBL R4 K1 0x8C100902, // 0002 GETMET R4 R4 K2 @@ -2413,16 +2375,8 @@ be_local_closure(Matter_IM_report_data, /* name */ 0x8C100903, // 0004 GETMET R4 R4 K3 0x5C180400, // 0005 MOVE R6 R2 0x7C100400, // 0006 CALL R4 2 - 0xB8160800, // 0007 GETNGBL R5 K4 - 0x8C140B05, // 0008 GETMET R5 R5 K5 - 0x601C0008, // 0009 GETGBL R7 G8 - 0x5C200800, // 000A MOVE R8 R4 - 0x7C1C0200, // 000B CALL R7 1 - 0x001E0C07, // 000C ADD R7 K6 R7 - 0x58200007, // 000D LDCONST R8 K7 - 0x7C140600, // 000E CALL R5 3 - 0x50140000, // 000F LDBOOL R5 0 0 - 0x80040A00, // 0010 RET 1 R5 + 0x50140000, // 0007 LDBOOL R5 0 0 + 0x80040A00, // 0008 RET 1 R5 }) ) ); @@ -2434,7 +2388,7 @@ be_local_closure(Matter_IM_report_data, /* name */ ********************************************************************/ be_local_closure(Matter_IM_process_invoke_response, /* name */ be_nested_proto( - 9, /* nstack */ + 7, /* nstack */ 3, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -2442,19 +2396,15 @@ be_local_closure(Matter_IM_process_invoke_response, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[ 8]) { /* constants */ + ( &(const bvalue[ 4]) { /* constants */ /* K0 */ be_nested_str_weak(string), /* K1 */ be_nested_str_weak(matter), /* K2 */ be_nested_str_weak(InvokeResponseMessage), /* K3 */ be_nested_str_weak(from_TLV), - /* K4 */ be_nested_str_weak(tasmota), - /* K5 */ be_nested_str_weak(log), - /* K6 */ be_nested_str_weak(MTR_X3A_X20received_X20InvokeResponseMessage_X3D), - /* K7 */ be_const_int(2), }), be_str_weak(process_invoke_response), &be_const_str_solidified, - ( &(const binstruction[17]) { /* code */ + ( &(const binstruction[ 9]) { /* code */ 0xA40E0000, // 0000 IMPORT R3 K0 0xB8120200, // 0001 GETNGBL R4 K1 0x8C100902, // 0002 GETMET R4 R4 K2 @@ -2462,16 +2412,8 @@ be_local_closure(Matter_IM_process_invoke_response, /* name */ 0x8C100903, // 0004 GETMET R4 R4 K3 0x5C180400, // 0005 MOVE R6 R2 0x7C100400, // 0006 CALL R4 2 - 0xB8160800, // 0007 GETNGBL R5 K4 - 0x8C140B05, // 0008 GETMET R5 R5 K5 - 0x601C0008, // 0009 GETGBL R7 G8 - 0x5C200800, // 000A MOVE R8 R4 - 0x7C1C0200, // 000B CALL R7 1 - 0x001E0C07, // 000C ADD R7 K6 R7 - 0x58200007, // 000D LDCONST R8 K7 - 0x7C140600, // 000E CALL R5 3 - 0x50140000, // 000F LDBOOL R5 0 0 - 0x80040A00, // 0010 RET 1 R5 + 0x50140000, // 0007 LDBOOL R5 0 0 + 0x80040A00, // 0008 RET 1 R5 }) ) ); @@ -2539,7 +2481,7 @@ be_local_closure(Matter_IM_send_subscribe_heartbeat, /* name */ /* K5 */ be_nested_str_weak(MTR_X3A_X20_X3CSub_Alive_X20_X28_X256i_X29_X20sub_X3D_X25i), /* K6 */ be_nested_str_weak(local_session_id), /* K7 */ be_nested_str_weak(subscription_id), - /* K8 */ be_const_int(2), + /* K8 */ be_const_int(3), /* K9 */ be_nested_str_weak(is_keep_alive), /* K10 */ be_nested_str_weak(matter), /* K11 */ be_nested_str_weak(ReportDataMessage), diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_IM_Message.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_IM_Message.h index b1b6f21da..cbf37c1b9 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_IM_Message.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_IM_Message.h @@ -43,7 +43,7 @@ be_local_closure(Matter_IM_Message_send_im, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[21]) { /* constants */ + ( &(const bvalue[20]) { /* constants */ /* K0 */ be_nested_str_weak(string), /* K1 */ be_nested_str_weak(ready), /* K2 */ be_nested_str_weak(resp), @@ -61,10 +61,9 @@ be_local_closure(Matter_IM_Message_send_im, /* name */ /* K14 */ be_nested_str_weak(message_counter), /* K15 */ be_nested_str_weak(exchange_id), /* K16 */ be_nested_str_weak(ack_message_counter), - /* K17 */ be_const_int(3), - /* K18 */ be_nested_str_weak(send_response_frame), - /* K19 */ be_nested_str_weak(last_counter), - /* K20 */ be_nested_str_weak(finish), + /* K17 */ be_nested_str_weak(send_response_frame), + /* K18 */ be_nested_str_weak(last_counter), + /* K19 */ be_nested_str_weak(finish), }), be_str_weak(send_im), &be_const_str_solidified, @@ -94,15 +93,15 @@ be_local_closure(Matter_IM_Message_send_im, /* name */ 0x882C070F, // 0016 GETMBR R11 R3 K15 0x88300710, // 0017 GETMBR R12 R3 K16 0x7C180C00, // 0018 CALL R6 6 - 0x581C0011, // 0019 LDCONST R7 K17 + 0x541E0003, // 0019 LDINT R7 4 0x7C100600, // 001A CALL R4 3 - 0x8C100312, // 001B GETMET R4 R1 K18 + 0x8C100311, // 001B GETMET R4 R1 K17 0x5C180600, // 001C MOVE R6 R3 0x7C100400, // 001D CALL R4 2 0x8810070E, // 001E GETMBR R4 R3 K14 - 0x90022604, // 001F SETMBR R0 K19 R4 + 0x90022404, // 001F SETMBR R0 K18 R4 0x50100200, // 0020 LDBOOL R4 1 0 - 0x90022804, // 0021 SETMBR R0 K20 R4 + 0x90022604, // 0021 SETMBR R0 K19 R4 0x80000000, // 0022 RET 0 }) ) @@ -529,7 +528,7 @@ extern const bclass be_class_Matter_IM_ReportData; ********************************************************************/ be_local_closure(Matter_IM_ReportData_send_im, /* name */ be_nested_proto( - 19, /* nstack */ + 13, /* nstack */ 2, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -537,7 +536,7 @@ be_local_closure(Matter_IM_ReportData_send_im, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[31]) { /* constants */ + ( &(const bvalue[18]) { /* constants */ /* K0 */ be_nested_str_weak(string), /* K1 */ be_nested_str_weak(ready), /* K2 */ be_nested_str_weak(resp), @@ -547,32 +546,19 @@ be_local_closure(Matter_IM_ReportData_send_im, /* name */ /* K6 */ be_nested_str_weak(attribute_reports), /* K7 */ be_const_int(2147483647), /* K8 */ be_const_int(0), - /* K9 */ be_nested_str_weak(tasmota), - /* K10 */ be_nested_str_weak(log), - /* K11 */ be_nested_str_weak(format), - /* K12 */ be_nested_str_weak(MTR_X3A_X20_X2ERead_Attr_X20next_chunk_X20exch_X3D_X25i), - /* K13 */ be_nested_str_weak(get_exchangeid), - /* K14 */ be_const_int(3), - /* K15 */ be_nested_str_weak(MTR_X3A_X20_X2ERead_Attr_X20first_chunk_X20exch_X3D_X25i), - /* K16 */ be_nested_str_weak(to_TLV), - /* K17 */ be_nested_str_weak(tlv2raw), - /* K18 */ be_nested_str_weak(MAX_MESSAGE), - /* K19 */ be_nested_str_weak(encode_frame), - /* K20 */ be_nested_str_weak(encrypt), - /* K21 */ be_nested_str_weak(MTR_X3A_X20_X3Csnd_X20_X20_X20_X20_X20_X20_X20_X28_X256i_X29_X20id_X3D_X25i_X20exch_X3D_X25i_X20rack_X3D_X25s), - /* K22 */ be_nested_str_weak(session), - /* K23 */ be_nested_str_weak(local_session_id), - /* K24 */ be_nested_str_weak(message_counter), - /* K25 */ be_nested_str_weak(exchange_id), - /* K26 */ be_nested_str_weak(ack_message_counter), - /* K27 */ be_nested_str_weak(send_response_frame), - /* K28 */ be_nested_str_weak(last_counter), - /* K29 */ be_nested_str_weak(MTR_X3A_X20to_be_sent_later_X20size_X3D_X25i_X20exch_X3D_X25i), - /* K30 */ be_nested_str_weak(finish), + /* K9 */ be_nested_str_weak(to_TLV), + /* K10 */ be_nested_str_weak(tlv2raw), + /* K11 */ be_nested_str_weak(MAX_MESSAGE), + /* K12 */ be_nested_str_weak(encode_frame), + /* K13 */ be_nested_str_weak(encrypt), + /* K14 */ be_nested_str_weak(send_response_frame), + /* K15 */ be_nested_str_weak(last_counter), + /* K16 */ be_nested_str_weak(message_counter), + /* K17 */ be_nested_str_weak(finish), }), be_str_weak(send_im), &be_const_str_solidified, - ( &(const binstruction[109]) { /* code */ + ( &(const binstruction[68]) { /* code */ 0xA40A0000, // 0000 IMPORT R2 K0 0x880C0101, // 0001 GETMBR R3 R0 K1 0x740E0001, // 0002 JMPT R3 #0005 @@ -603,85 +589,44 @@ be_local_closure(Matter_IM_ReportData_send_im, /* name */ 0x70020001, // 001B JMP #001E 0x50200000, // 001C LDBOOL R8 0 0 0x90120808, // 001D SETMBR R4 K4 R8 - 0x78160008, // 001E JMPF R5 #0028 - 0xB8221200, // 001F GETNGBL R8 K9 - 0x8C20110A, // 0020 GETMET R8 R8 K10 - 0x8C28050B, // 0021 GETMET R10 R2 K11 - 0x5830000C, // 0022 LDCONST R12 K12 - 0x8C34010D, // 0023 GETMET R13 R0 K13 - 0x7C340200, // 0024 CALL R13 1 - 0x7C280600, // 0025 CALL R10 3 - 0x582C000E, // 0026 LDCONST R11 K14 - 0x7C200600, // 0027 CALL R8 3 - 0x88200904, // 0028 GETMBR R8 R4 K4 - 0x7822000A, // 0029 JMPF R8 #0035 - 0x5C200A00, // 002A MOVE R8 R5 - 0x74220008, // 002B JMPT R8 #0035 - 0xB8221200, // 002C GETNGBL R8 K9 - 0x8C20110A, // 002D GETMET R8 R8 K10 - 0x8C28050B, // 002E GETMET R10 R2 K11 - 0x5830000F, // 002F LDCONST R12 K15 - 0x8C34010D, // 0030 GETMET R13 R0 K13 - 0x7C340200, // 0031 CALL R13 1 - 0x7C280600, // 0032 CALL R10 3 - 0x582C000E, // 0033 LDCONST R11 K14 - 0x7C200600, // 0034 CALL R8 3 - 0x88200103, // 0035 GETMBR R8 R0 K3 - 0x8C201110, // 0036 GETMET R8 R8 K16 - 0x7C200200, // 0037 CALL R8 1 - 0x8C241111, // 0038 GETMET R9 R8 K17 - 0x602C0015, // 0039 GETGBL R11 G21 - 0x88300112, // 003A GETMBR R12 R0 K18 - 0x7C2C0200, // 003B CALL R11 1 - 0x7C240400, // 003C CALL R9 2 - 0x8C280713, // 003D GETMET R10 R3 K19 - 0x5C301200, // 003E MOVE R12 R9 - 0x7C280400, // 003F CALL R10 2 - 0x8C280714, // 0040 GETMET R10 R3 K20 - 0x7C280200, // 0041 CALL R10 1 - 0xB82A1200, // 0042 GETNGBL R10 K9 - 0x8C28150A, // 0043 GETMET R10 R10 K10 - 0x8C30050B, // 0044 GETMET R12 R2 K11 - 0x58380015, // 0045 LDCONST R14 K21 - 0x883C0716, // 0046 GETMBR R15 R3 K22 - 0x883C1F17, // 0047 GETMBR R15 R15 K23 - 0x88400718, // 0048 GETMBR R16 R3 K24 - 0x88440719, // 0049 GETMBR R17 R3 K25 - 0x8848071A, // 004A GETMBR R18 R3 K26 - 0x7C300C00, // 004B CALL R12 6 - 0x5834000E, // 004C LDCONST R13 K14 - 0x7C280600, // 004D CALL R10 3 - 0x8C28031B, // 004E GETMET R10 R1 K27 - 0x5C300600, // 004F MOVE R12 R3 - 0x7C280400, // 0050 CALL R10 2 - 0x88280718, // 0051 GETMBR R10 R3 K24 - 0x9002380A, // 0052 SETMBR R0 K28 R10 - 0x4C280000, // 0053 LDNIL R10 - 0x20280E0A, // 0054 NE R10 R7 R10 - 0x782A0013, // 0055 JMPF R10 #006A - 0x6028000C, // 0056 GETGBL R10 G12 - 0x5C2C0E00, // 0057 MOVE R11 R7 - 0x7C280200, // 0058 CALL R10 1 - 0x24281508, // 0059 GT R10 R10 K8 - 0x782A000E, // 005A JMPF R10 #006A - 0x90120C07, // 005B SETMBR R4 K6 R7 - 0xB82A1200, // 005C GETNGBL R10 K9 - 0x8C28150A, // 005D GETMET R10 R10 K10 - 0x8C30050B, // 005E GETMET R12 R2 K11 - 0x5838001D, // 005F LDCONST R14 K29 - 0x603C000C, // 0060 GETGBL R15 G12 - 0x88400906, // 0061 GETMBR R16 R4 K6 - 0x7C3C0200, // 0062 CALL R15 1 - 0x88400719, // 0063 GETMBR R16 R3 K25 - 0x7C300800, // 0064 CALL R12 4 - 0x5834000E, // 0065 LDCONST R13 K14 - 0x7C280600, // 0066 CALL R10 3 - 0x50280000, // 0067 LDBOOL R10 0 0 - 0x9002020A, // 0068 SETMBR R0 K1 R10 - 0x70020001, // 0069 JMP #006C - 0x50280200, // 006A LDBOOL R10 1 0 - 0x90023C0A, // 006B SETMBR R0 K30 R10 - 0x80000000, // 006C RET 0 + 0x7815FFFF, // 001E JMPF R5 #001F + 0x88200904, // 001F GETMBR R8 R4 K4 + 0x78220001, // 0020 JMPF R8 #0023 + 0x5C200A00, // 0021 MOVE R8 R5 + 0x7421FFFF, // 0022 JMPT R8 #0023 + 0x88200103, // 0023 GETMBR R8 R0 K3 + 0x8C201109, // 0024 GETMET R8 R8 K9 + 0x7C200200, // 0025 CALL R8 1 + 0x8C24110A, // 0026 GETMET R9 R8 K10 + 0x602C0015, // 0027 GETGBL R11 G21 + 0x8830010B, // 0028 GETMBR R12 R0 K11 + 0x7C2C0200, // 0029 CALL R11 1 + 0x7C240400, // 002A CALL R9 2 + 0x8C28070C, // 002B GETMET R10 R3 K12 + 0x5C301200, // 002C MOVE R12 R9 + 0x7C280400, // 002D CALL R10 2 + 0x8C28070D, // 002E GETMET R10 R3 K13 + 0x7C280200, // 002F CALL R10 1 + 0x8C28030E, // 0030 GETMET R10 R1 K14 + 0x5C300600, // 0031 MOVE R12 R3 + 0x7C280400, // 0032 CALL R10 2 + 0x88280710, // 0033 GETMBR R10 R3 K16 + 0x90021E0A, // 0034 SETMBR R0 K15 R10 + 0x4C280000, // 0035 LDNIL R10 + 0x20280E0A, // 0036 NE R10 R7 R10 + 0x782A0008, // 0037 JMPF R10 #0041 + 0x6028000C, // 0038 GETGBL R10 G12 + 0x5C2C0E00, // 0039 MOVE R11 R7 + 0x7C280200, // 003A CALL R10 1 + 0x24281508, // 003B GT R10 R10 K8 + 0x782A0003, // 003C JMPF R10 #0041 + 0x90120C07, // 003D SETMBR R4 K6 R7 + 0x50280000, // 003E LDBOOL R10 0 0 + 0x9002020A, // 003F SETMBR R0 K1 R10 + 0x70020001, // 0040 JMP #0043 + 0x50280200, // 0041 LDBOOL R10 1 0 + 0x9002220A, // 0042 SETMBR R0 K17 R10 + 0x80000000, // 0043 RET 0 }) ) ); @@ -811,7 +756,7 @@ be_local_closure(Matter_IM_ReportDataSubscribed_send_im, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[23]) { /* constants */ + ( &(const bvalue[22]) { /* constants */ /* K0 */ be_nested_str_weak(string), /* K1 */ be_nested_str_weak(ready), /* K2 */ be_nested_str_weak(data), @@ -832,9 +777,8 @@ be_local_closure(Matter_IM_ReportDataSubscribed_send_im, /* name */ /* K17 */ be_nested_str_weak(local_session_id), /* K18 */ be_nested_str_weak(ack_message_counter), /* K19 */ be_nested_str_weak(message_counter), - /* K20 */ be_const_int(3), - /* K21 */ be_nested_str_weak(send_response_frame), - /* K22 */ be_nested_str_weak(last_counter), + /* K20 */ be_nested_str_weak(send_response_frame), + /* K21 */ be_nested_str_weak(last_counter), }), be_str_weak(send_im), &be_const_str_solidified, @@ -885,13 +829,13 @@ be_local_closure(Matter_IM_ReportDataSubscribed_send_im, /* name */ 0x88280712, // 002B GETMBR R10 R3 K18 0x882C0713, // 002C GETMBR R11 R3 K19 0x7C180A00, // 002D CALL R6 5 - 0x581C0014, // 002E LDCONST R7 K20 + 0x541E0003, // 002E LDINT R7 4 0x7C100600, // 002F CALL R4 3 - 0x8C100315, // 0030 GETMET R4 R1 K21 + 0x8C100314, // 0030 GETMET R4 R1 K20 0x5C180600, // 0031 MOVE R6 R3 0x7C100400, // 0032 CALL R4 2 0x88100713, // 0033 GETMBR R4 R3 K19 - 0x90022C04, // 0034 SETMBR R0 K22 R4 + 0x90022A04, // 0034 SETMBR R0 K21 R4 0x50100200, // 0035 LDBOOL R4 1 0 0x90020E04, // 0036 SETMBR R0 K7 R4 0x7002000C, // 0037 JMP #0045 @@ -1419,7 +1363,7 @@ be_local_closure(Matter_IM_SubscribeResponse_status_ok_received, /* name */ /* K6 */ be_nested_str_weak(local_session_id), /* K7 */ be_nested_str_weak(sub), /* K8 */ be_nested_str_weak(subscription_id), - /* K9 */ be_const_int(2), + /* K9 */ be_const_int(3), /* K10 */ be_nested_str_weak(status_ok_received), }), be_str_weak(status_ok_received), diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_IM_Subscription.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_IM_Subscription.h index e2f48b099..bfaf77df8 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_IM_Subscription.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_IM_Subscription.h @@ -190,7 +190,7 @@ be_local_closure(Matter_IM_Subscription_remove_self, /* name */ /* K1 */ be_nested_str_weak(log), /* K2 */ be_nested_str_weak(MTR_X3A_X20_X2DSub_Del_X20_X20_X20_X28_X20_X20_X20_X20_X20_X20_X29_X20sub_X3D), /* K3 */ be_nested_str_weak(subscription_id), - /* K4 */ be_const_int(2), + /* K4 */ be_const_int(3), /* K5 */ be_nested_str_weak(subs_shop), /* K6 */ be_nested_str_weak(remove_sub), }), @@ -347,7 +347,7 @@ be_local_closure(Matter_IM_Subscription_re_arm, /* name */ /* K12 */ be_nested_str_weak(format), /* K13 */ be_nested_str_weak(MTR_X3A_X20_X2ESub_Done_X20_X20_X28_X20_X20_X20_X20_X20_X20_X29_X20sub_X3D_X25i), /* K14 */ be_nested_str_weak(subscription_id), - /* K15 */ be_const_int(2), + /* K15 */ be_const_int(3), }), be_str_weak(re_arm), &be_const_str_solidified, diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Message.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Message.h index 5bfbc0bee..1b67e8236 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Message.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Message.h @@ -309,7 +309,7 @@ be_local_closure(Matter_Frame_encrypt, /* name */ ********************************************************************/ be_local_closure(Matter_Frame_debug, /* name */ be_nested_proto( - 8, /* nstack */ + 6, /* nstack */ 2, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -317,20 +317,16 @@ be_local_closure(Matter_Frame_debug, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[ 9]) { /* constants */ + ( &(const bvalue[ 5]) { /* constants */ /* K0 */ be_nested_str_weak(matter), /* K1 */ be_nested_str_weak(Frame), /* K2 */ be_nested_str_weak(message_handler), /* K3 */ be_nested_str_weak(decode_header), /* K4 */ be_nested_str_weak(decode_payload), - /* K5 */ be_nested_str_weak(tasmota), - /* K6 */ be_nested_str_weak(log), - /* K7 */ be_nested_str_weak(MTR_X3A_X20sending_X20decode_X3A_X20), - /* K8 */ be_nested_str_weak(inspect), }), be_str_weak(debug), &be_const_str_solidified, - ( &(const binstruction[19]) { /* code */ + ( &(const binstruction[10]) { /* code */ 0x80000400, // 0000 RET 0 0xB80A0000, // 0001 GETNGBL R2 K0 0x8C080501, // 0002 GETMET R2 R2 K1 @@ -341,15 +337,6 @@ be_local_closure(Matter_Frame_debug, /* name */ 0x7C0C0200, // 0007 CALL R3 1 0x8C0C0504, // 0008 GETMET R3 R2 K4 0x7C0C0200, // 0009 CALL R3 1 - 0xB80E0A00, // 000A GETNGBL R3 K5 - 0x8C0C0706, // 000B GETMET R3 R3 K6 - 0xB8160000, // 000C GETNGBL R5 K0 - 0x8C140B08, // 000D GETMET R5 R5 K8 - 0x5C1C0400, // 000E MOVE R7 R2 - 0x7C140400, // 000F CALL R5 2 - 0x00160E05, // 0010 ADD R5 K7 R5 - 0x541A0003, // 0011 LDINT R6 4 - 0x7C0C0600, // 0012 CALL R3 3 }) ) ); @@ -493,7 +480,7 @@ be_local_closure(Matter_Frame_build_response, /* name */ /* K28 */ be_nested_str_weak(tasmota), /* K29 */ be_nested_str_weak(log), /* K30 */ be_nested_str_weak(MTR_X3A_X20_X3CReplied_X20_X20_X20_X28_X256i_X29_X20_X25s), - /* K31 */ be_const_int(2), + /* K31 */ be_const_int(3), }), be_str_weak(build_response), &be_const_str_solidified, @@ -1171,7 +1158,7 @@ be_local_closure(Matter_Frame_decrypt, /* name */ 0xB8320C00, // 0061 GETNGBL R12 K6 0x8C301907, // 0062 GETMET R12 R12 K7 0x5838001A, // 0063 LDCONST R14 K26 - 0x583C0009, // 0064 LDCONST R15 K9 + 0x583C0012, // 0064 LDCONST R15 K18 0x7C300600, // 0065 CALL R12 3 0x4C300000, // 0066 LDNIL R12 0x80041800, // 0067 RET 1 R12 diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_MessageHandler.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_MessageHandler.h index a94a7c160..21f9a31e8 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_MessageHandler.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_MessageHandler.h @@ -50,7 +50,7 @@ be_local_closure(Matter_MessageHandler_send_encrypted_ack, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[17]) { /* constants */ + ( &(const bvalue[16]) { /* constants */ /* K0 */ be_nested_str_weak(string), /* K1 */ be_nested_str_weak(x_flag_r), /* K2 */ be_nested_str_weak(build_standalone_ack), @@ -66,8 +66,7 @@ be_local_closure(Matter_MessageHandler_send_encrypted_ack, /* name */ /* K12 */ be_nested_str_weak(message_counter), /* K13 */ be_nested_str_weak(_X7Breliable_X7D), /* K14 */ be_nested_str_weak(), - /* K15 */ be_const_int(3), - /* K16 */ be_nested_str_weak(send_response_frame), + /* K15 */ be_nested_str_weak(send_response_frame), }), be_str_weak(send_encrypted_ack), &be_const_str_solidified, @@ -95,9 +94,9 @@ be_local_closure(Matter_MessageHandler_send_encrypted_ack, /* name */ 0x70020000, // 0014 JMP #0016 0x5834000E, // 0015 LDCONST R13 K14 0x7C1C0C00, // 0016 CALL R7 6 - 0x5820000F, // 0017 LDCONST R8 K15 + 0x54220003, // 0017 LDINT R8 4 0x7C140600, // 0018 CALL R5 3 - 0x8C140110, // 0019 GETMET R5 R0 K16 + 0x8C14010F, // 0019 GETMET R5 R0 K15 0x5C1C0800, // 001A MOVE R7 R4 0x7C140400, // 001B CALL R5 2 0x80000000, // 001C RET 0 @@ -154,7 +153,7 @@ be_local_closure(Matter_MessageHandler_send_simple_ack, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[16]) { /* constants */ + ( &(const bvalue[15]) { /* constants */ /* K0 */ be_nested_str_weak(string), /* K1 */ be_nested_str_weak(x_flag_r), /* K2 */ be_nested_str_weak(build_standalone_ack), @@ -169,8 +168,7 @@ be_local_closure(Matter_MessageHandler_send_simple_ack, /* name */ /* K11 */ be_nested_str_weak(message_counter), /* K12 */ be_nested_str_weak(_X7Breliable_X7D), /* K13 */ be_nested_str_weak(), - /* K14 */ be_const_int(3), - /* K15 */ be_nested_str_weak(send_response_frame), + /* K14 */ be_nested_str_weak(send_response_frame), }), be_str_weak(send_simple_ack), &be_const_str_solidified, @@ -196,9 +194,9 @@ be_local_closure(Matter_MessageHandler_send_simple_ack, /* name */ 0x70020000, // 0012 JMP #0014 0x5834000D, // 0013 LDCONST R13 K13 0x7C1C0C00, // 0014 CALL R7 6 - 0x5820000E, // 0015 LDCONST R8 K14 + 0x54220003, // 0015 LDINT R8 4 0x7C140600, // 0016 CALL R5 3 - 0x8C14010F, // 0017 GETMET R5 R0 K15 + 0x8C14010E, // 0017 GETMET R5 R0 K14 0x5C1C0800, // 0018 MOVE R7 R4 0x7C140400, // 0019 CALL R5 2 0x80000000, // 001A RET 0 @@ -213,7 +211,7 @@ be_local_closure(Matter_MessageHandler_send_simple_ack, /* name */ ********************************************************************/ be_local_closure(Matter_MessageHandler_msg_received, /* name */ be_nested_proto( - 24, /* nstack */ + 21, /* nstack */ 4, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -221,89 +219,82 @@ be_local_closure(Matter_MessageHandler_msg_received, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[75]) { /* constants */ + ( &(const bvalue[68]) { /* constants */ /* K0 */ be_nested_str_weak(string), /* K1 */ be_nested_str_weak(matter), /* K2 */ be_nested_str_weak(Frame), /* K3 */ be_nested_str_weak(decode_header), /* K4 */ be_nested_str_weak(sec_p), - /* K5 */ be_nested_str_weak(tasmota), - /* K6 */ be_nested_str_weak(log), - /* K7 */ be_nested_str_weak(MTR_X3A_X20CONTROL_X20MESSAGE_X3D), - /* K8 */ be_nested_str_weak(inspect), - /* K9 */ be_nested_str_weak(device), - /* K10 */ be_nested_str_weak(sessions), - /* K11 */ be_nested_str_weak(find_session_source_id_unsecure), - /* K12 */ be_nested_str_weak(source_node_id), - /* K13 */ be_nested_str_weak(MTR_X3A_X20find_X20session_X20by_X20source_node_id_X20_X3D_X20), - /* K14 */ be_nested_str_weak(_X20session_id_X20_X3D_X20), - /* K15 */ be_nested_str_weak(local_session_id), - /* K16 */ be_nested_str_weak(control_message), - /* K17 */ be_nested_str_weak(process_incoming_control_message), - /* K18 */ be_const_int(0), - /* K19 */ be_nested_str_weak(sec_sesstype), - /* K20 */ be_nested_str_weak(_ip), - /* K21 */ be_nested_str_weak(_port), - /* K22 */ be_nested_str_weak(_message_handler), - /* K23 */ be_nested_str_weak(session), - /* K24 */ be_nested_str_weak(_counter_insecure_rcv), - /* K25 */ be_nested_str_weak(validate), - /* K26 */ be_nested_str_weak(message_counter), - /* K27 */ be_nested_str_weak(format), - /* K28 */ be_nested_str_weak(MTR_X3A_X20_X2E_X20_X20_X20_X20_X20_X20_X20_X20_X20_X20Duplicate_X20unencrypted_X20message_X20_X3D_X20_X25i_X20ref_X20_X3D_X20_X25i), - /* K29 */ be_nested_str_weak(val), - /* K30 */ be_const_int(3), - /* K31 */ be_nested_str_weak(send_simple_ack), - /* K32 */ be_nested_str_weak(decode_payload), - /* K33 */ be_nested_str_weak(received_ack), - /* K34 */ be_nested_str_weak(opcode), - /* K35 */ be_nested_str_weak(get_opcode_name), - /* K36 */ be_nested_str_weak(0x_X2502X), - /* K37 */ be_nested_str_weak(MTR_X3A_X20_X3EReceived_X20_X20_X28_X256i_X29_X20_X25s_X20rid_X3D_X25i_X20exch_X3D_X25i_X20from_X20_X5B_X25s_X5D_X3A_X25i), - /* K38 */ be_nested_str_weak(exchange_id), - /* K39 */ be_const_int(2), - /* K40 */ be_nested_str_weak(MTR_X3A_X20_X3Ercv_X20Ack_X20_X20_X20_X28_X256i_X29_X20rid_X3D_X25i_X20exch_X3D_X25i_X20ack_X3D_X25s_X20_X25sfrom_X20_X5B_X25s_X5D_X3A_X25i), - /* K41 */ be_nested_str_weak(x_flag_r), - /* K42 */ be_nested_str_weak(_X7Breliable_X7D_X20), - /* K43 */ be_nested_str_weak(), - /* K44 */ be_nested_str_weak(ack_message_counter), - /* K45 */ be_nested_str_weak(commissioning), - /* K46 */ be_nested_str_weak(process_incoming), - /* K47 */ be_nested_str_weak(MTR_X3A_X20decode_X20header_X3A_X20local_session_id_X3D_X25i_X20message_counter_X3D_X25i), - /* K48 */ be_nested_str_weak(get_session_by_local_session_id), - /* K49 */ be_nested_str_weak(MTR_X3A_X20unknown_X20local_session_id_X3D), - /* K50 */ be_nested_str_weak(counter_rcv_validate), - /* K51 */ be_nested_str_weak(MTR_X3A_X20_X2E_X20_X20_X20_X20_X20_X20_X20_X20_X20_X20Duplicate_X20encrypted_X20message_X20_X3D_X20), - /* K52 */ be_nested_str_weak(_X20counter_X3D), - /* K53 */ be_nested_str_weak(counter_rcv), - /* K54 */ be_nested_str_weak(send_encrypted_ack), - /* K55 */ be_nested_str_weak(decrypt), - /* K56 */ be_nested_str_weak(raw), - /* K57 */ be_nested_str_weak(payload_idx), - /* K58 */ be_const_int(1), - /* K59 */ be_nested_str_weak(MTR_X3A_X20idx_X3D_X25i_X20clear_X3D_X25s), - /* K60 */ be_nested_str_weak(tohex), - /* K61 */ be_nested_str_weak(MTR_X3A_X20_X3E_X20_X20_X20_X20_X20_X20_X20_X20_X20_X20Decrypted_X20message_X3A_X20protocol_id_X3A), - /* K62 */ be_nested_str_weak(protocol_id), - /* K63 */ be_nested_str_weak(_X20opcode_X3D), - /* K64 */ be_nested_str_weak(_X20exchange_id_X3D), - /* K65 */ be_nested_str_weak(MTR_X3A_X20_X3Ercv_X20_X20_X20_X20_X20_X20_X20_X28_X256i_X29_X20_X5B_X2502X_X2F_X2502X_X5D_X20rid_X3D_X25i_X20exch_X3D_X25i_X20ack_X3D_X25s_X20_X25sfrom_X20_X5B_X25s_X5D_X3A_X25i), - /* K66 */ be_nested_str_weak(im), - /* K67 */ be_nested_str_weak(process_incoming_ack), - /* K68 */ be_nested_str_weak(send_enqueued), - /* K69 */ be_nested_str_weak(MTR_X3A_X20ignoring_X20unhandled_X20protocol_id_X3A), - /* K70 */ be_nested_str_weak(MTR_X3A_X20MessageHandler_X3A_X3Amsg_received_X20exception_X3A_X20), - /* K71 */ be_nested_str_weak(_X3B), - /* K72 */ be_nested_str_weak(_debug_present), - /* K73 */ be_nested_str_weak(debug), - /* K74 */ be_nested_str_weak(traceback), + /* K5 */ be_nested_str_weak(device), + /* K6 */ be_nested_str_weak(sessions), + /* K7 */ be_nested_str_weak(find_session_source_id_unsecure), + /* K8 */ be_nested_str_weak(source_node_id), + /* K9 */ be_nested_str_weak(control_message), + /* K10 */ be_nested_str_weak(process_incoming_control_message), + /* K11 */ be_nested_str_weak(local_session_id), + /* K12 */ be_const_int(0), + /* K13 */ be_nested_str_weak(sec_sesstype), + /* K14 */ be_nested_str_weak(_ip), + /* K15 */ be_nested_str_weak(_port), + /* K16 */ be_nested_str_weak(_message_handler), + /* K17 */ be_nested_str_weak(session), + /* K18 */ be_nested_str_weak(_counter_insecure_rcv), + /* K19 */ be_nested_str_weak(validate), + /* K20 */ be_nested_str_weak(message_counter), + /* K21 */ be_nested_str_weak(tasmota), + /* K22 */ be_nested_str_weak(log), + /* K23 */ be_nested_str_weak(format), + /* K24 */ be_nested_str_weak(MTR_X3A_X20_X2E_X20_X20_X20_X20_X20_X20_X20_X20_X20_X20Duplicate_X20unencrypted_X20message_X20_X3D_X20_X25i_X20ref_X20_X3D_X20_X25i), + /* K25 */ be_nested_str_weak(val), + /* K26 */ be_nested_str_weak(send_simple_ack), + /* K27 */ be_nested_str_weak(decode_payload), + /* K28 */ be_nested_str_weak(received_ack), + /* K29 */ be_nested_str_weak(opcode), + /* K30 */ be_nested_str_weak(get_opcode_name), + /* K31 */ be_nested_str_weak(0x_X2502X), + /* K32 */ be_nested_str_weak(MTR_X3A_X20_X3EReceived_X20_X20_X28_X256i_X29_X20_X25s_X20rid_X3D_X25i_X20exch_X3D_X25i_X20from_X20_X5B_X25s_X5D_X3A_X25i), + /* K33 */ be_nested_str_weak(exchange_id), + /* K34 */ be_const_int(3), + /* K35 */ be_nested_str_weak(MTR_X3A_X20_X3Ercv_X20Ack_X20_X20_X20_X28_X256i_X29_X20rid_X3D_X25i_X20exch_X3D_X25i_X20ack_X3D_X25s_X20_X25sfrom_X20_X5B_X25s_X5D_X3A_X25i), + /* K36 */ be_nested_str_weak(x_flag_r), + /* K37 */ be_nested_str_weak(_X7Breliable_X7D_X20), + /* K38 */ be_nested_str_weak(), + /* K39 */ be_nested_str_weak(ack_message_counter), + /* K40 */ be_nested_str_weak(commissioning), + /* K41 */ be_nested_str_weak(process_incoming), + /* K42 */ be_nested_str_weak(MTR_X3A_X20decode_X20header_X3A_X20local_session_id_X3D_X25i_X20message_counter_X3D_X25i), + /* K43 */ be_nested_str_weak(get_session_by_local_session_id), + /* K44 */ be_nested_str_weak(MTR_X3A_X20unknown_X20local_session_id_X3D), + /* K45 */ be_nested_str_weak(counter_rcv_validate), + /* K46 */ be_nested_str_weak(MTR_X3A_X20_X2E_X20_X20_X20_X20_X20_X20_X20_X20_X20_X20Duplicate_X20encrypted_X20message_X20_X3D_X20), + /* K47 */ be_nested_str_weak(_X20counter_X3D), + /* K48 */ be_nested_str_weak(counter_rcv), + /* K49 */ be_nested_str_weak(send_encrypted_ack), + /* K50 */ be_nested_str_weak(decrypt), + /* K51 */ be_nested_str_weak(raw), + /* K52 */ be_nested_str_weak(payload_idx), + /* K53 */ be_const_int(1), + /* K54 */ be_nested_str_weak(MTR_X3A_X20_X3E_X20_X20_X20_X20_X20_X20_X20_X20_X20_X20Decrypted_X20message_X3A_X20protocol_id_X3A), + /* K55 */ be_nested_str_weak(protocol_id), + /* K56 */ be_nested_str_weak(_X20opcode_X3D), + /* K57 */ be_nested_str_weak(_X20exchange_id_X3D), + /* K58 */ be_nested_str_weak(im), + /* K59 */ be_nested_str_weak(process_incoming_ack), + /* K60 */ be_nested_str_weak(send_enqueued), + /* K61 */ be_nested_str_weak(MTR_X3A_X20ignoring_X20unhandled_X20protocol_id_X3A), + /* K62 */ be_nested_str_weak(MTR_X3A_X20MessageHandler_X3A_X3Amsg_received_X20exception_X3A_X20), + /* K63 */ be_nested_str_weak(_X3B), + /* K64 */ be_const_int(2), + /* K65 */ be_nested_str_weak(_debug_present), + /* K66 */ be_nested_str_weak(debug), + /* K67 */ be_nested_str_weak(traceback), }), be_str_weak(msg_received), &be_const_str_solidified, - ( &(const binstruction[391]) { /* code */ + ( &(const binstruction[324]) { /* code */ 0xA4120000, // 0000 IMPORT R4 K0 0x50140000, // 0001 LDBOOL R5 0 0 - 0xA802016A, // 0002 EXBLK 0 #016E + 0xA8020126, // 0002 EXBLK 0 #012A 0xB81A0200, // 0003 GETNGBL R6 K1 0x8C180D02, // 0004 GETMET R6 R6 K2 0x5C200000, // 0005 MOVE R8 R0 @@ -319,379 +310,312 @@ be_local_closure(Matter_MessageHandler_msg_received, /* name */ 0xA8040001, // 000F EXBLK 1 1 0x80041000, // 0010 RET 1 R8 0x88200D04, // 0011 GETMBR R8 R6 K4 - 0x78220022, // 0012 JMPF R8 #0036 - 0xB8220A00, // 0013 GETNGBL R8 K5 - 0x8C201106, // 0014 GETMET R8 R8 K6 - 0xB82A0200, // 0015 GETNGBL R10 K1 - 0x8C281508, // 0016 GETMET R10 R10 K8 - 0x5C300C00, // 0017 MOVE R12 R6 - 0x7C280400, // 0018 CALL R10 2 - 0x002A0E0A, // 0019 ADD R10 K7 R10 - 0x542E0003, // 001A LDINT R11 4 - 0x7C200600, // 001B CALL R8 3 - 0x88200109, // 001C GETMBR R8 R0 K9 - 0x8820110A, // 001D GETMBR R8 R8 K10 - 0x8C20110B, // 001E GETMET R8 R8 K11 - 0x88280D0C, // 001F GETMBR R10 R6 K12 - 0x542E0059, // 0020 LDINT R11 90 - 0x7C200600, // 0021 CALL R8 3 - 0xB8260A00, // 0022 GETNGBL R9 K5 - 0x8C241306, // 0023 GETMET R9 R9 K6 - 0x602C0008, // 0024 GETGBL R11 G8 - 0x88300D0C, // 0025 GETMBR R12 R6 K12 - 0x7C2C0200, // 0026 CALL R11 1 - 0x002E1A0B, // 0027 ADD R11 K13 R11 - 0x002C170E, // 0028 ADD R11 R11 K14 - 0x60300008, // 0029 GETGBL R12 G8 - 0x8834110F, // 002A GETMBR R13 R8 K15 - 0x7C300200, // 002B CALL R12 1 - 0x002C160C, // 002C ADD R11 R11 R12 - 0x54320003, // 002D LDINT R12 4 - 0x7C240600, // 002E CALL R9 3 - 0x88240110, // 002F GETMBR R9 R0 K16 - 0x8C241311, // 0030 GETMET R9 R9 K17 - 0x5C2C0C00, // 0031 MOVE R11 R6 - 0x7C240400, // 0032 CALL R9 2 - 0xA8040001, // 0033 EXBLK 1 1 - 0x80041200, // 0034 RET 1 R9 - 0x70020133, // 0035 JMP #016A - 0x88200D0F, // 0036 GETMBR R8 R6 K15 - 0x1C201112, // 0037 EQ R8 R8 K18 - 0x7822007D, // 0038 JMPF R8 #00B7 - 0x88200D13, // 0039 GETMBR R8 R6 K19 - 0x1C201112, // 003A EQ R8 R8 K18 - 0x7822007A, // 003B JMPF R8 #00B7 - 0x88200109, // 003C GETMBR R8 R0 K9 - 0x8820110A, // 003D GETMBR R8 R8 K10 - 0x8C20110B, // 003E GETMET R8 R8 K11 - 0x88280D0C, // 003F GETMBR R10 R6 K12 - 0x542E0059, // 0040 LDINT R11 90 - 0x7C200600, // 0041 CALL R8 3 - 0xB8260A00, // 0042 GETNGBL R9 K5 - 0x8C241306, // 0043 GETMET R9 R9 K6 - 0x602C0008, // 0044 GETGBL R11 G8 - 0x88300D0C, // 0045 GETMBR R12 R6 K12 - 0x7C2C0200, // 0046 CALL R11 1 - 0x002E1A0B, // 0047 ADD R11 K13 R11 - 0x002C170E, // 0048 ADD R11 R11 K14 - 0x60300008, // 0049 GETGBL R12 G8 - 0x8834110F, // 004A GETMBR R13 R8 K15 - 0x7C300200, // 004B CALL R12 1 - 0x002C160C, // 004C ADD R11 R11 R12 - 0x54320003, // 004D LDINT R12 4 - 0x7C240600, // 004E CALL R9 3 - 0x780A0000, // 004F JMPF R2 #0051 - 0x90222802, // 0050 SETMBR R8 K20 R2 - 0x780E0000, // 0051 JMPF R3 #0053 - 0x90222A03, // 0052 SETMBR R8 K21 R3 - 0x90222C00, // 0053 SETMBR R8 K22 R0 - 0x901A2E08, // 0054 SETMBR R6 K23 R8 - 0x88241118, // 0055 GETMBR R9 R8 K24 - 0x8C241319, // 0056 GETMET R9 R9 K25 - 0x882C0D1A, // 0057 GETMBR R11 R6 K26 - 0x50300000, // 0058 LDBOOL R12 0 0 - 0x7C240600, // 0059 CALL R9 3 - 0x74260011, // 005A JMPT R9 #006D - 0xB8260A00, // 005B GETNGBL R9 K5 - 0x8C241306, // 005C GETMET R9 R9 K6 - 0x8C2C091B, // 005D GETMET R11 R4 K27 - 0x5834001C, // 005E LDCONST R13 K28 - 0x88380D1A, // 005F GETMBR R14 R6 K26 - 0x883C1118, // 0060 GETMBR R15 R8 K24 - 0x8C3C1F1D, // 0061 GETMET R15 R15 K29 - 0x7C3C0200, // 0062 CALL R15 1 - 0x7C2C0800, // 0063 CALL R11 4 - 0x5830001E, // 0064 LDCONST R12 K30 - 0x7C240600, // 0065 CALL R9 3 - 0x8C24011F, // 0066 GETMET R9 R0 K31 - 0x5C2C0C00, // 0067 MOVE R11 R6 - 0x50300000, // 0068 LDBOOL R12 0 0 - 0x7C240600, // 0069 CALL R9 3 - 0x50240000, // 006A LDBOOL R9 0 0 - 0xA8040001, // 006B EXBLK 1 1 - 0x80041200, // 006C RET 1 R9 - 0x8C240D20, // 006D GETMET R9 R6 K32 - 0x7C240200, // 006E CALL R9 1 - 0x74260002, // 006F JMPT R9 #0073 - 0x50240000, // 0070 LDBOOL R9 0 0 - 0xA8040001, // 0071 EXBLK 1 1 - 0x80041200, // 0072 RET 1 R9 - 0x88240109, // 0073 GETMBR R9 R0 K9 - 0x8C241321, // 0074 GETMET R9 R9 K33 - 0x5C2C0C00, // 0075 MOVE R11 R6 - 0x7C240400, // 0076 CALL R9 2 - 0x88240D22, // 0077 GETMBR R9 R6 K34 - 0x542A000F, // 0078 LDINT R10 16 - 0x2024120A, // 0079 NE R9 R9 R10 - 0x78260018, // 007A JMPF R9 #0094 - 0xB8260200, // 007B GETNGBL R9 K1 - 0x8C241323, // 007C GETMET R9 R9 K35 - 0x882C0D22, // 007D GETMBR R11 R6 K34 - 0x7C240400, // 007E CALL R9 2 - 0x5C281200, // 007F MOVE R10 R9 - 0x742A0004, // 0080 JMPT R10 #0086 - 0x8C28091B, // 0081 GETMET R10 R4 K27 - 0x58300024, // 0082 LDCONST R12 K36 - 0x88340D22, // 0083 GETMBR R13 R6 K34 - 0x7C280600, // 0084 CALL R10 3 - 0x5C241400, // 0085 MOVE R9 R10 - 0xB82A0A00, // 0086 GETNGBL R10 K5 - 0x8C281506, // 0087 GETMET R10 R10 K6 - 0x8C30091B, // 0088 GETMET R12 R4 K27 - 0x58380025, // 0089 LDCONST R14 K37 - 0x883C110F, // 008A GETMBR R15 R8 K15 - 0x5C401200, // 008B MOVE R16 R9 - 0x88440D1A, // 008C GETMBR R17 R6 K26 - 0x88480D26, // 008D GETMBR R18 R6 K38 - 0x5C4C0400, // 008E MOVE R19 R2 - 0x5C500600, // 008F MOVE R20 R3 - 0x7C301000, // 0090 CALL R12 8 - 0x58340027, // 0091 LDCONST R13 K39 - 0x7C280600, // 0092 CALL R10 3 - 0x70020013, // 0093 JMP #00A8 - 0xB8260A00, // 0094 GETNGBL R9 K5 - 0x8C241306, // 0095 GETMET R9 R9 K6 - 0x8C2C091B, // 0096 GETMET R11 R4 K27 - 0x58340028, // 0097 LDCONST R13 K40 - 0x8838110F, // 0098 GETMBR R14 R8 K15 - 0x883C0D1A, // 0099 GETMBR R15 R6 K26 - 0x88400D29, // 009A GETMBR R16 R6 K41 - 0x78420001, // 009B JMPF R16 #009E - 0x5840002A, // 009C LDCONST R16 K42 - 0x70020000, // 009D JMP #009F - 0x5840002B, // 009E LDCONST R16 K43 - 0x88440D26, // 009F GETMBR R17 R6 K38 - 0x60480008, // 00A0 GETGBL R18 G8 - 0x884C0D2C, // 00A1 GETMBR R19 R6 K44 - 0x7C480200, // 00A2 CALL R18 1 - 0x5C4C0400, // 00A3 MOVE R19 R2 - 0x5C500600, // 00A4 MOVE R20 R3 - 0x7C2C1200, // 00A5 CALL R11 9 - 0x5830001E, // 00A6 LDCONST R12 K30 - 0x7C240600, // 00A7 CALL R9 3 - 0x8824012D, // 00A8 GETMBR R9 R0 K45 - 0x8C24132E, // 00A9 GETMET R9 R9 K46 - 0x5C2C0C00, // 00AA MOVE R11 R6 - 0x7C240400, // 00AB CALL R9 2 - 0x5C141200, // 00AC MOVE R5 R9 - 0x5C240A00, // 00AD MOVE R9 R5 - 0x74260003, // 00AE JMPT R9 #00B3 - 0x8C24011F, // 00AF GETMET R9 R0 K31 - 0x5C2C0C00, // 00B0 MOVE R11 R6 - 0x50300000, // 00B1 LDBOOL R12 0 0 - 0x7C240600, // 00B2 CALL R9 3 - 0x50240200, // 00B3 LDBOOL R9 1 0 - 0xA8040001, // 00B4 EXBLK 1 1 - 0x80041200, // 00B5 RET 1 R9 - 0x700200B2, // 00B6 JMP #016A - 0xB8220A00, // 00B7 GETNGBL R8 K5 - 0x8C201106, // 00B8 GETMET R8 R8 K6 - 0x8C28091B, // 00B9 GETMET R10 R4 K27 - 0x5830002F, // 00BA LDCONST R12 K47 - 0x88340D0F, // 00BB GETMBR R13 R6 K15 - 0x88380D1A, // 00BC GETMBR R14 R6 K26 - 0x7C280800, // 00BD CALL R10 4 - 0x582C001E, // 00BE LDCONST R11 K30 - 0x7C200600, // 00BF CALL R8 3 - 0x88200109, // 00C0 GETMBR R8 R0 K9 - 0x8820110A, // 00C1 GETMBR R8 R8 K10 - 0x8C201130, // 00C2 GETMET R8 R8 K48 - 0x88280D0F, // 00C3 GETMBR R10 R6 K15 - 0x7C200400, // 00C4 CALL R8 2 - 0x4C240000, // 00C5 LDNIL R9 - 0x1C241009, // 00C6 EQ R9 R8 R9 - 0x7826000A, // 00C7 JMPF R9 #00D3 - 0xB8260A00, // 00C8 GETNGBL R9 K5 - 0x8C241306, // 00C9 GETMET R9 R9 K6 - 0x602C0008, // 00CA GETGBL R11 G8 - 0x88300D0F, // 00CB GETMBR R12 R6 K15 - 0x7C2C0200, // 00CC CALL R11 1 - 0x002E620B, // 00CD ADD R11 K49 R11 - 0x58300027, // 00CE LDCONST R12 K39 - 0x7C240600, // 00CF CALL R9 3 - 0x50240000, // 00D0 LDBOOL R9 0 0 - 0xA8040001, // 00D1 EXBLK 1 1 - 0x80041200, // 00D2 RET 1 R9 - 0x780A0000, // 00D3 JMPF R2 #00D5 - 0x90222802, // 00D4 SETMBR R8 K20 R2 - 0x780E0000, // 00D5 JMPF R3 #00D7 - 0x90222A03, // 00D6 SETMBR R8 K21 R3 - 0x90222C00, // 00D7 SETMBR R8 K22 R0 - 0x901A2E08, // 00D8 SETMBR R6 K23 R8 - 0x8C241132, // 00D9 GETMET R9 R8 K50 - 0x882C0D1A, // 00DA GETMBR R11 R6 K26 - 0x50300200, // 00DB LDBOOL R12 1 0 - 0x7C240600, // 00DC CALL R9 3 - 0x74260013, // 00DD JMPT R9 #00F2 - 0xB8260A00, // 00DE GETNGBL R9 K5 - 0x8C241306, // 00DF GETMET R9 R9 K6 - 0x602C0008, // 00E0 GETGBL R11 G8 - 0x88300D1A, // 00E1 GETMBR R12 R6 K26 - 0x7C2C0200, // 00E2 CALL R11 1 - 0x002E660B, // 00E3 ADD R11 K51 R11 - 0x002C1734, // 00E4 ADD R11 R11 K52 - 0x60300008, // 00E5 GETGBL R12 G8 - 0x88341135, // 00E6 GETMBR R13 R8 K53 - 0x7C300200, // 00E7 CALL R12 1 - 0x002C160C, // 00E8 ADD R11 R11 R12 - 0x5830001E, // 00E9 LDCONST R12 K30 - 0x7C240600, // 00EA CALL R9 3 - 0x8C240136, // 00EB GETMET R9 R0 K54 - 0x5C2C0C00, // 00EC MOVE R11 R6 - 0x50300000, // 00ED LDBOOL R12 0 0 - 0x7C240600, // 00EE CALL R9 3 - 0x50240000, // 00EF LDBOOL R9 0 0 - 0xA8040001, // 00F0 EXBLK 1 1 - 0x80041200, // 00F1 RET 1 R9 - 0x8C240D37, // 00F2 GETMET R9 R6 K55 - 0x7C240200, // 00F3 CALL R9 1 - 0x5C281200, // 00F4 MOVE R10 R9 - 0x742A0002, // 00F5 JMPT R10 #00F9 - 0x50280000, // 00F6 LDBOOL R10 0 0 - 0xA8040001, // 00F7 EXBLK 1 1 - 0x80041400, // 00F8 RET 1 R10 - 0x88280D39, // 00F9 GETMBR R10 R6 K57 - 0x0428153A, // 00FA SUB R10 R10 K58 - 0x402A240A, // 00FB CONNECT R10 K18 R10 - 0x882C0D38, // 00FC GETMBR R11 R6 K56 - 0x9428160A, // 00FD GETIDX R10 R11 R10 - 0x901A700A, // 00FE SETMBR R6 K56 R10 - 0x88280D38, // 00FF GETMBR R10 R6 K56 - 0x40281409, // 0100 CONNECT R10 R10 R9 - 0xB82A0A00, // 0101 GETNGBL R10 K5 - 0x8C281506, // 0102 GETMET R10 R10 K6 - 0x8C30091B, // 0103 GETMET R12 R4 K27 - 0x5838003B, // 0104 LDCONST R14 K59 - 0x883C0D39, // 0105 GETMBR R15 R6 K57 - 0x88400D38, // 0106 GETMBR R16 R6 K56 - 0x8C40213C, // 0107 GETMET R16 R16 K60 - 0x7C400200, // 0108 CALL R16 1 - 0x7C300800, // 0109 CALL R12 4 - 0x54360003, // 010A LDINT R13 4 - 0x7C280600, // 010B CALL R10 3 - 0x8C280D20, // 010C GETMET R10 R6 K32 - 0x7C280200, // 010D CALL R10 1 - 0xB82A0A00, // 010E GETNGBL R10 K5 - 0x8C281506, // 010F GETMET R10 R10 K6 - 0x60300008, // 0110 GETGBL R12 G8 - 0x88340D3E, // 0111 GETMBR R13 R6 K62 - 0x7C300200, // 0112 CALL R12 1 - 0x00327A0C, // 0113 ADD R12 K61 R12 - 0x0030193F, // 0114 ADD R12 R12 K63 - 0x60340008, // 0115 GETGBL R13 G8 - 0x88380D22, // 0116 GETMBR R14 R6 K34 - 0x7C340200, // 0117 CALL R13 1 - 0x0030180D, // 0118 ADD R12 R12 R13 - 0x00301940, // 0119 ADD R12 R12 K64 - 0x60340008, // 011A GETGBL R13 G8 - 0x88380D26, // 011B GETMBR R14 R6 K38 - 0x543EFFFE, // 011C LDINT R15 65535 - 0x2C381C0F, // 011D AND R14 R14 R15 - 0x7C340200, // 011E CALL R13 1 - 0x0030180D, // 011F ADD R12 R12 R13 - 0x5834001E, // 0120 LDCONST R13 K30 - 0x7C280600, // 0121 CALL R10 3 - 0xB82A0A00, // 0122 GETNGBL R10 K5 - 0x8C281506, // 0123 GETMET R10 R10 K6 - 0x8C30091B, // 0124 GETMET R12 R4 K27 - 0x58380041, // 0125 LDCONST R14 K65 - 0x883C110F, // 0126 GETMBR R15 R8 K15 - 0x88400D3E, // 0127 GETMBR R16 R6 K62 - 0x88440D22, // 0128 GETMBR R17 R6 K34 - 0x88480D1A, // 0129 GETMBR R18 R6 K26 - 0x884C0D26, // 012A GETMBR R19 R6 K38 - 0x60500008, // 012B GETGBL R20 G8 - 0x88540D2C, // 012C GETMBR R21 R6 K44 - 0x7C500200, // 012D CALL R20 1 - 0x88540D29, // 012E GETMBR R21 R6 K41 - 0x78560001, // 012F JMPF R21 #0132 - 0x5854002A, // 0130 LDCONST R21 K42 - 0x70020000, // 0131 JMP #0133 - 0x5854002B, // 0132 LDCONST R21 K43 - 0x5C580400, // 0133 MOVE R22 R2 - 0x5C5C0600, // 0134 MOVE R23 R3 - 0x7C301600, // 0135 CALL R12 11 - 0x5834001E, // 0136 LDCONST R13 K30 - 0x7C280600, // 0137 CALL R10 3 - 0x88280109, // 0138 GETMBR R10 R0 K9 - 0x8C281521, // 0139 GETMET R10 R10 K33 - 0x5C300C00, // 013A MOVE R12 R6 - 0x7C280400, // 013B CALL R10 2 - 0x88280D3E, // 013C GETMBR R10 R6 K62 - 0x1C2C1512, // 013D EQ R11 R10 K18 - 0x782E000F, // 013E JMPF R11 #014F - 0x882C0D22, // 013F GETMBR R11 R6 K34 - 0x5432000F, // 0140 LDINT R12 16 - 0x1C2C160C, // 0141 EQ R11 R11 R12 - 0x782E0009, // 0142 JMPF R11 #014D - 0x882C0142, // 0143 GETMBR R11 R0 K66 - 0x8C2C1743, // 0144 GETMET R11 R11 K67 - 0x5C340C00, // 0145 MOVE R13 R6 - 0x7C2C0400, // 0146 CALL R11 2 - 0x5C141600, // 0147 MOVE R5 R11 - 0x78160003, // 0148 JMPF R5 #014D - 0x882C0142, // 0149 GETMBR R11 R0 K66 - 0x8C2C1744, // 014A GETMET R11 R11 K68 - 0x5C340000, // 014B MOVE R13 R0 - 0x7C2C0400, // 014C CALL R11 2 - 0x50140200, // 014D LDBOOL R5 1 0 - 0x7002001A, // 014E JMP #016A - 0x1C2C153A, // 014F EQ R11 R10 K58 - 0x782E0010, // 0150 JMPF R11 #0162 - 0x882C0142, // 0151 GETMBR R11 R0 K66 - 0x8C2C172E, // 0152 GETMET R11 R11 K46 - 0x5C340C00, // 0153 MOVE R13 R6 - 0x7C2C0400, // 0154 CALL R11 2 - 0x5C141600, // 0155 MOVE R5 R11 - 0x78160004, // 0156 JMPF R5 #015C - 0x882C0142, // 0157 GETMBR R11 R0 K66 - 0x8C2C1744, // 0158 GETMET R11 R11 K68 - 0x5C340000, // 0159 MOVE R13 R0 - 0x7C2C0400, // 015A CALL R11 2 - 0x70020003, // 015B JMP #0160 - 0x8C2C0136, // 015C GETMET R11 R0 K54 - 0x5C340C00, // 015D MOVE R13 R6 - 0x50380200, // 015E LDBOOL R14 1 0 - 0x7C2C0600, // 015F CALL R11 3 - 0x50140200, // 0160 LDBOOL R5 1 0 - 0x70020007, // 0161 JMP #016A - 0xB82E0A00, // 0162 GETNGBL R11 K5 - 0x8C2C1706, // 0163 GETMET R11 R11 K6 - 0x60340008, // 0164 GETGBL R13 G8 - 0x5C381400, // 0165 MOVE R14 R10 - 0x7C340200, // 0166 CALL R13 1 - 0x00368A0D, // 0167 ADD R13 K69 R13 - 0x5838001E, // 0168 LDCONST R14 K30 - 0x7C2C0600, // 0169 CALL R11 3 - 0xA8040001, // 016A EXBLK 1 1 - 0x80040A00, // 016B RET 1 R5 - 0xA8040001, // 016C EXBLK 1 1 - 0x70020017, // 016D JMP #0186 - 0xAC180002, // 016E CATCH R6 0 2 - 0x70020014, // 016F JMP #0185 - 0xB8220A00, // 0170 GETNGBL R8 K5 - 0x8C201106, // 0171 GETMET R8 R8 K6 - 0x60280008, // 0172 GETGBL R10 G8 - 0x5C2C0C00, // 0173 MOVE R11 R6 - 0x7C280200, // 0174 CALL R10 1 - 0x002A8C0A, // 0175 ADD R10 K70 R10 - 0x00281547, // 0176 ADD R10 R10 K71 - 0x602C0008, // 0177 GETGBL R11 G8 - 0x5C300E00, // 0178 MOVE R12 R7 - 0x7C2C0200, // 0179 CALL R11 1 - 0x0028140B, // 017A ADD R10 R10 R11 - 0x7C200400, // 017B CALL R8 2 - 0xB8220A00, // 017C GETNGBL R8 K5 - 0x88201148, // 017D GETMBR R8 R8 K72 - 0x78220002, // 017E JMPF R8 #0182 - 0xA4229200, // 017F IMPORT R8 K73 - 0x8C24114A, // 0180 GETMET R9 R8 K74 - 0x7C240200, // 0181 CALL R9 1 - 0x50200000, // 0182 LDBOOL R8 0 0 - 0x80041000, // 0183 RET 1 R8 - 0x70020000, // 0184 JMP #0186 - 0xB0080000, // 0185 RAISE 2 R0 R0 - 0x80000000, // 0186 RET 0 + 0x7822000C, // 0012 JMPF R8 #0020 + 0x88200105, // 0013 GETMBR R8 R0 K5 + 0x88201106, // 0014 GETMBR R8 R8 K6 + 0x8C201107, // 0015 GETMET R8 R8 K7 + 0x88280D08, // 0016 GETMBR R10 R6 K8 + 0x542E0059, // 0017 LDINT R11 90 + 0x7C200600, // 0018 CALL R8 3 + 0x88240109, // 0019 GETMBR R9 R0 K9 + 0x8C24130A, // 001A GETMET R9 R9 K10 + 0x5C2C0C00, // 001B MOVE R11 R6 + 0x7C240400, // 001C CALL R9 2 + 0xA8040001, // 001D EXBLK 1 1 + 0x80041200, // 001E RET 1 R9 + 0x70020105, // 001F JMP #0126 + 0x88200D0B, // 0020 GETMBR R8 R6 K11 + 0x1C20110C, // 0021 EQ R8 R8 K12 + 0x78220070, // 0022 JMPF R8 #0094 + 0x88200D0D, // 0023 GETMBR R8 R6 K13 + 0x1C20110C, // 0024 EQ R8 R8 K12 + 0x7822006D, // 0025 JMPF R8 #0094 + 0x88200105, // 0026 GETMBR R8 R0 K5 + 0x88201106, // 0027 GETMBR R8 R8 K6 + 0x8C201107, // 0028 GETMET R8 R8 K7 + 0x88280D08, // 0029 GETMBR R10 R6 K8 + 0x542E0059, // 002A LDINT R11 90 + 0x7C200600, // 002B CALL R8 3 + 0x780A0000, // 002C JMPF R2 #002E + 0x90221C02, // 002D SETMBR R8 K14 R2 + 0x780E0000, // 002E JMPF R3 #0030 + 0x90221E03, // 002F SETMBR R8 K15 R3 + 0x90222000, // 0030 SETMBR R8 K16 R0 + 0x901A2208, // 0031 SETMBR R6 K17 R8 + 0x88241112, // 0032 GETMBR R9 R8 K18 + 0x8C241313, // 0033 GETMET R9 R9 K19 + 0x882C0D14, // 0034 GETMBR R11 R6 K20 + 0x50300000, // 0035 LDBOOL R12 0 0 + 0x7C240600, // 0036 CALL R9 3 + 0x74260011, // 0037 JMPT R9 #004A + 0xB8262A00, // 0038 GETNGBL R9 K21 + 0x8C241316, // 0039 GETMET R9 R9 K22 + 0x8C2C0917, // 003A GETMET R11 R4 K23 + 0x58340018, // 003B LDCONST R13 K24 + 0x88380D14, // 003C GETMBR R14 R6 K20 + 0x883C1112, // 003D GETMBR R15 R8 K18 + 0x8C3C1F19, // 003E GETMET R15 R15 K25 + 0x7C3C0200, // 003F CALL R15 1 + 0x7C2C0800, // 0040 CALL R11 4 + 0x54320003, // 0041 LDINT R12 4 + 0x7C240600, // 0042 CALL R9 3 + 0x8C24011A, // 0043 GETMET R9 R0 K26 + 0x5C2C0C00, // 0044 MOVE R11 R6 + 0x50300000, // 0045 LDBOOL R12 0 0 + 0x7C240600, // 0046 CALL R9 3 + 0x50240000, // 0047 LDBOOL R9 0 0 + 0xA8040001, // 0048 EXBLK 1 1 + 0x80041200, // 0049 RET 1 R9 + 0x8C240D1B, // 004A GETMET R9 R6 K27 + 0x7C240200, // 004B CALL R9 1 + 0x74260002, // 004C JMPT R9 #0050 + 0x50240000, // 004D LDBOOL R9 0 0 + 0xA8040001, // 004E EXBLK 1 1 + 0x80041200, // 004F RET 1 R9 + 0x88240105, // 0050 GETMBR R9 R0 K5 + 0x8C24131C, // 0051 GETMET R9 R9 K28 + 0x5C2C0C00, // 0052 MOVE R11 R6 + 0x7C240400, // 0053 CALL R9 2 + 0x88240D1D, // 0054 GETMBR R9 R6 K29 + 0x542A000F, // 0055 LDINT R10 16 + 0x2024120A, // 0056 NE R9 R9 R10 + 0x78260018, // 0057 JMPF R9 #0071 + 0xB8260200, // 0058 GETNGBL R9 K1 + 0x8C24131E, // 0059 GETMET R9 R9 K30 + 0x882C0D1D, // 005A GETMBR R11 R6 K29 + 0x7C240400, // 005B CALL R9 2 + 0x5C281200, // 005C MOVE R10 R9 + 0x742A0004, // 005D JMPT R10 #0063 + 0x8C280917, // 005E GETMET R10 R4 K23 + 0x5830001F, // 005F LDCONST R12 K31 + 0x88340D1D, // 0060 GETMBR R13 R6 K29 + 0x7C280600, // 0061 CALL R10 3 + 0x5C241400, // 0062 MOVE R9 R10 + 0xB82A2A00, // 0063 GETNGBL R10 K21 + 0x8C281516, // 0064 GETMET R10 R10 K22 + 0x8C300917, // 0065 GETMET R12 R4 K23 + 0x58380020, // 0066 LDCONST R14 K32 + 0x883C110B, // 0067 GETMBR R15 R8 K11 + 0x5C401200, // 0068 MOVE R16 R9 + 0x88440D14, // 0069 GETMBR R17 R6 K20 + 0x88480D21, // 006A GETMBR R18 R6 K33 + 0x5C4C0400, // 006B MOVE R19 R2 + 0x5C500600, // 006C MOVE R20 R3 + 0x7C301000, // 006D CALL R12 8 + 0x58340022, // 006E LDCONST R13 K34 + 0x7C280600, // 006F CALL R10 3 + 0x70020013, // 0070 JMP #0085 + 0xB8262A00, // 0071 GETNGBL R9 K21 + 0x8C241316, // 0072 GETMET R9 R9 K22 + 0x8C2C0917, // 0073 GETMET R11 R4 K23 + 0x58340023, // 0074 LDCONST R13 K35 + 0x8838110B, // 0075 GETMBR R14 R8 K11 + 0x883C0D14, // 0076 GETMBR R15 R6 K20 + 0x88400D24, // 0077 GETMBR R16 R6 K36 + 0x78420001, // 0078 JMPF R16 #007B + 0x58400025, // 0079 LDCONST R16 K37 + 0x70020000, // 007A JMP #007C + 0x58400026, // 007B LDCONST R16 K38 + 0x88440D21, // 007C GETMBR R17 R6 K33 + 0x60480008, // 007D GETGBL R18 G8 + 0x884C0D27, // 007E GETMBR R19 R6 K39 + 0x7C480200, // 007F CALL R18 1 + 0x5C4C0400, // 0080 MOVE R19 R2 + 0x5C500600, // 0081 MOVE R20 R3 + 0x7C2C1200, // 0082 CALL R11 9 + 0x54320003, // 0083 LDINT R12 4 + 0x7C240600, // 0084 CALL R9 3 + 0x88240128, // 0085 GETMBR R9 R0 K40 + 0x8C241329, // 0086 GETMET R9 R9 K41 + 0x5C2C0C00, // 0087 MOVE R11 R6 + 0x7C240400, // 0088 CALL R9 2 + 0x5C141200, // 0089 MOVE R5 R9 + 0x5C240A00, // 008A MOVE R9 R5 + 0x74260003, // 008B JMPT R9 #0090 + 0x8C24011A, // 008C GETMET R9 R0 K26 + 0x5C2C0C00, // 008D MOVE R11 R6 + 0x50300000, // 008E LDBOOL R12 0 0 + 0x7C240600, // 008F CALL R9 3 + 0x50240200, // 0090 LDBOOL R9 1 0 + 0xA8040001, // 0091 EXBLK 1 1 + 0x80041200, // 0092 RET 1 R9 + 0x70020091, // 0093 JMP #0126 + 0xB8222A00, // 0094 GETNGBL R8 K21 + 0x8C201116, // 0095 GETMET R8 R8 K22 + 0x8C280917, // 0096 GETMET R10 R4 K23 + 0x5830002A, // 0097 LDCONST R12 K42 + 0x88340D0B, // 0098 GETMBR R13 R6 K11 + 0x88380D14, // 0099 GETMBR R14 R6 K20 + 0x7C280800, // 009A CALL R10 4 + 0x542E0003, // 009B LDINT R11 4 + 0x7C200600, // 009C CALL R8 3 + 0x88200105, // 009D GETMBR R8 R0 K5 + 0x88201106, // 009E GETMBR R8 R8 K6 + 0x8C20112B, // 009F GETMET R8 R8 K43 + 0x88280D0B, // 00A0 GETMBR R10 R6 K11 + 0x7C200400, // 00A1 CALL R8 2 + 0x4C240000, // 00A2 LDNIL R9 + 0x1C241009, // 00A3 EQ R9 R8 R9 + 0x7826000A, // 00A4 JMPF R9 #00B0 + 0xB8262A00, // 00A5 GETNGBL R9 K21 + 0x8C241316, // 00A6 GETMET R9 R9 K22 + 0x602C0008, // 00A7 GETGBL R11 G8 + 0x88300D0B, // 00A8 GETMBR R12 R6 K11 + 0x7C2C0200, // 00A9 CALL R11 1 + 0x002E580B, // 00AA ADD R11 K44 R11 + 0x58300022, // 00AB LDCONST R12 K34 + 0x7C240600, // 00AC CALL R9 3 + 0x50240000, // 00AD LDBOOL R9 0 0 + 0xA8040001, // 00AE EXBLK 1 1 + 0x80041200, // 00AF RET 1 R9 + 0x780A0000, // 00B0 JMPF R2 #00B2 + 0x90221C02, // 00B1 SETMBR R8 K14 R2 + 0x780E0000, // 00B2 JMPF R3 #00B4 + 0x90221E03, // 00B3 SETMBR R8 K15 R3 + 0x90222000, // 00B4 SETMBR R8 K16 R0 + 0x901A2208, // 00B5 SETMBR R6 K17 R8 + 0x8C24112D, // 00B6 GETMET R9 R8 K45 + 0x882C0D14, // 00B7 GETMBR R11 R6 K20 + 0x50300200, // 00B8 LDBOOL R12 1 0 + 0x7C240600, // 00B9 CALL R9 3 + 0x74260013, // 00BA JMPT R9 #00CF + 0xB8262A00, // 00BB GETNGBL R9 K21 + 0x8C241316, // 00BC GETMET R9 R9 K22 + 0x602C0008, // 00BD GETGBL R11 G8 + 0x88300D14, // 00BE GETMBR R12 R6 K20 + 0x7C2C0200, // 00BF CALL R11 1 + 0x002E5C0B, // 00C0 ADD R11 K46 R11 + 0x002C172F, // 00C1 ADD R11 R11 K47 + 0x60300008, // 00C2 GETGBL R12 G8 + 0x88341130, // 00C3 GETMBR R13 R8 K48 + 0x7C300200, // 00C4 CALL R12 1 + 0x002C160C, // 00C5 ADD R11 R11 R12 + 0x54320003, // 00C6 LDINT R12 4 + 0x7C240600, // 00C7 CALL R9 3 + 0x8C240131, // 00C8 GETMET R9 R0 K49 + 0x5C2C0C00, // 00C9 MOVE R11 R6 + 0x50300000, // 00CA LDBOOL R12 0 0 + 0x7C240600, // 00CB CALL R9 3 + 0x50240000, // 00CC LDBOOL R9 0 0 + 0xA8040001, // 00CD EXBLK 1 1 + 0x80041200, // 00CE RET 1 R9 + 0x8C240D32, // 00CF GETMET R9 R6 K50 + 0x7C240200, // 00D0 CALL R9 1 + 0x5C281200, // 00D1 MOVE R10 R9 + 0x742A0002, // 00D2 JMPT R10 #00D6 + 0x50280000, // 00D3 LDBOOL R10 0 0 + 0xA8040001, // 00D4 EXBLK 1 1 + 0x80041400, // 00D5 RET 1 R10 + 0x88280D34, // 00D6 GETMBR R10 R6 K52 + 0x04281535, // 00D7 SUB R10 R10 K53 + 0x402A180A, // 00D8 CONNECT R10 K12 R10 + 0x882C0D33, // 00D9 GETMBR R11 R6 K51 + 0x9428160A, // 00DA GETIDX R10 R11 R10 + 0x901A660A, // 00DB SETMBR R6 K51 R10 + 0x88280D33, // 00DC GETMBR R10 R6 K51 + 0x40281409, // 00DD CONNECT R10 R10 R9 + 0x8C280D1B, // 00DE GETMET R10 R6 K27 + 0x7C280200, // 00DF CALL R10 1 + 0xB82A2A00, // 00E0 GETNGBL R10 K21 + 0x8C281516, // 00E1 GETMET R10 R10 K22 + 0x60300008, // 00E2 GETGBL R12 G8 + 0x88340D37, // 00E3 GETMBR R13 R6 K55 + 0x7C300200, // 00E4 CALL R12 1 + 0x00326C0C, // 00E5 ADD R12 K54 R12 + 0x00301938, // 00E6 ADD R12 R12 K56 + 0x60340008, // 00E7 GETGBL R13 G8 + 0x88380D1D, // 00E8 GETMBR R14 R6 K29 + 0x7C340200, // 00E9 CALL R13 1 + 0x0030180D, // 00EA ADD R12 R12 R13 + 0x00301939, // 00EB ADD R12 R12 K57 + 0x60340008, // 00EC GETGBL R13 G8 + 0x88380D21, // 00ED GETMBR R14 R6 K33 + 0x543EFFFE, // 00EE LDINT R15 65535 + 0x2C381C0F, // 00EF AND R14 R14 R15 + 0x7C340200, // 00F0 CALL R13 1 + 0x0030180D, // 00F1 ADD R12 R12 R13 + 0x54360003, // 00F2 LDINT R13 4 + 0x7C280600, // 00F3 CALL R10 3 + 0x88280105, // 00F4 GETMBR R10 R0 K5 + 0x8C28151C, // 00F5 GETMET R10 R10 K28 + 0x5C300C00, // 00F6 MOVE R12 R6 + 0x7C280400, // 00F7 CALL R10 2 + 0x88280D37, // 00F8 GETMBR R10 R6 K55 + 0x1C2C150C, // 00F9 EQ R11 R10 K12 + 0x782E000F, // 00FA JMPF R11 #010B + 0x882C0D1D, // 00FB GETMBR R11 R6 K29 + 0x5432000F, // 00FC LDINT R12 16 + 0x1C2C160C, // 00FD EQ R11 R11 R12 + 0x782E0009, // 00FE JMPF R11 #0109 + 0x882C013A, // 00FF GETMBR R11 R0 K58 + 0x8C2C173B, // 0100 GETMET R11 R11 K59 + 0x5C340C00, // 0101 MOVE R13 R6 + 0x7C2C0400, // 0102 CALL R11 2 + 0x5C141600, // 0103 MOVE R5 R11 + 0x78160003, // 0104 JMPF R5 #0109 + 0x882C013A, // 0105 GETMBR R11 R0 K58 + 0x8C2C173C, // 0106 GETMET R11 R11 K60 + 0x5C340000, // 0107 MOVE R13 R0 + 0x7C2C0400, // 0108 CALL R11 2 + 0x50140200, // 0109 LDBOOL R5 1 0 + 0x7002001A, // 010A JMP #0126 + 0x1C2C1535, // 010B EQ R11 R10 K53 + 0x782E0010, // 010C JMPF R11 #011E + 0x882C013A, // 010D GETMBR R11 R0 K58 + 0x8C2C1729, // 010E GETMET R11 R11 K41 + 0x5C340C00, // 010F MOVE R13 R6 + 0x7C2C0400, // 0110 CALL R11 2 + 0x5C141600, // 0111 MOVE R5 R11 + 0x78160004, // 0112 JMPF R5 #0118 + 0x882C013A, // 0113 GETMBR R11 R0 K58 + 0x8C2C173C, // 0114 GETMET R11 R11 K60 + 0x5C340000, // 0115 MOVE R13 R0 + 0x7C2C0400, // 0116 CALL R11 2 + 0x70020003, // 0117 JMP #011C + 0x8C2C0131, // 0118 GETMET R11 R0 K49 + 0x5C340C00, // 0119 MOVE R13 R6 + 0x50380200, // 011A LDBOOL R14 1 0 + 0x7C2C0600, // 011B CALL R11 3 + 0x50140200, // 011C LDBOOL R5 1 0 + 0x70020007, // 011D JMP #0126 + 0xB82E2A00, // 011E GETNGBL R11 K21 + 0x8C2C1716, // 011F GETMET R11 R11 K22 + 0x60340008, // 0120 GETGBL R13 G8 + 0x5C381400, // 0121 MOVE R14 R10 + 0x7C340200, // 0122 CALL R13 1 + 0x00367A0D, // 0123 ADD R13 K61 R13 + 0x58380022, // 0124 LDCONST R14 K34 + 0x7C2C0600, // 0125 CALL R11 3 + 0xA8040001, // 0126 EXBLK 1 1 + 0x80040A00, // 0127 RET 1 R5 + 0xA8040001, // 0128 EXBLK 1 1 + 0x70020018, // 0129 JMP #0143 + 0xAC180002, // 012A CATCH R6 0 2 + 0x70020015, // 012B JMP #0142 + 0xB8222A00, // 012C GETNGBL R8 K21 + 0x8C201116, // 012D GETMET R8 R8 K22 + 0x60280008, // 012E GETGBL R10 G8 + 0x5C2C0C00, // 012F MOVE R11 R6 + 0x7C280200, // 0130 CALL R10 1 + 0x002A7C0A, // 0131 ADD R10 K62 R10 + 0x0028153F, // 0132 ADD R10 R10 K63 + 0x602C0008, // 0133 GETGBL R11 G8 + 0x5C300E00, // 0134 MOVE R12 R7 + 0x7C2C0200, // 0135 CALL R11 1 + 0x0028140B, // 0136 ADD R10 R10 R11 + 0x582C0040, // 0137 LDCONST R11 K64 + 0x7C200600, // 0138 CALL R8 3 + 0xB8222A00, // 0139 GETNGBL R8 K21 + 0x88201141, // 013A GETMBR R8 R8 K65 + 0x78220002, // 013B JMPF R8 #013F + 0xA4228400, // 013C IMPORT R8 K66 + 0x8C241143, // 013D GETMET R9 R8 K67 + 0x7C240200, // 013E CALL R9 1 + 0x50200000, // 013F LDBOOL R8 0 0 + 0x80041000, // 0140 RET 1 R8 + 0x70020000, // 0141 JMP #0143 + 0xB0080000, // 0142 RAISE 2 R0 R0 + 0x80000000, // 0143 RET 0 }) ) ); diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin.h index 135f1d210..63f6c88a8 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin.h @@ -6,6 +6,459 @@ extern const bclass be_class_Matter_Plugin; +/******************************************************************** +** Solidified function: every_250ms +********************************************************************/ +be_local_closure(Matter_Plugin_every_250ms, /* name */ + be_nested_proto( + 4, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[10]) { /* constants */ + /* K0 */ be_nested_str_weak(update_next), + /* K1 */ be_nested_str_weak(matter), + /* K2 */ be_nested_str_weak(jitter), + /* K3 */ be_nested_str_weak(UPDATE_TIME), + /* K4 */ be_nested_str_weak(tasmota), + /* K5 */ be_nested_str_weak(time_reached), + /* K6 */ be_nested_str_weak(tick), + /* K7 */ be_nested_str_weak(device), + /* K8 */ be_nested_str_weak(update_shadow), + /* K9 */ be_nested_str_weak(millis), + }), + be_str_weak(every_250ms), + &be_const_str_solidified, + ( &(const binstruction[28]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x4C080000, // 0001 LDNIL R2 + 0x1C040202, // 0002 EQ R1 R1 R2 + 0x78060005, // 0003 JMPF R1 #000A + 0xB8060200, // 0004 GETNGBL R1 K1 + 0x8C040302, // 0005 GETMET R1 R1 K2 + 0x880C0103, // 0006 GETMBR R3 R0 K3 + 0x7C040400, // 0007 CALL R1 2 + 0x90020001, // 0008 SETMBR R0 K0 R1 + 0x70020010, // 0009 JMP #001B + 0xB8060800, // 000A GETNGBL R1 K4 + 0x8C040305, // 000B GETMET R1 R1 K5 + 0x880C0100, // 000C GETMBR R3 R0 K0 + 0x7C040400, // 000D CALL R1 2 + 0x7806000B, // 000E JMPF R1 #001B + 0x88040106, // 000F GETMBR R1 R0 K6 + 0x88080107, // 0010 GETMBR R2 R0 K7 + 0x88080506, // 0011 GETMBR R2 R2 K6 + 0x20040202, // 0012 NE R1 R1 R2 + 0x78060001, // 0013 JMPF R1 #0016 + 0x8C040108, // 0014 GETMET R1 R0 K8 + 0x7C040200, // 0015 CALL R1 1 + 0xB8060800, // 0016 GETNGBL R1 K4 + 0x8C040309, // 0017 GETMET R1 R1 K9 + 0x880C0103, // 0018 GETMBR R3 R0 K3 + 0x7C040400, // 0019 CALL R1 2 + 0x90020001, // 001A SETMBR R0 K0 R1 + 0x80000000, // 001B RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: get_cluster_list +********************************************************************/ +be_local_closure(Matter_Plugin_get_cluster_list, /* name */ + be_nested_proto( + 8, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 4]) { /* constants */ + /* K0 */ be_nested_str_weak(clusters), + /* K1 */ be_nested_str_weak(keys), + /* K2 */ be_nested_str_weak(push), + /* K3 */ be_nested_str_weak(stop_iteration), + }), + be_str_weak(get_cluster_list), + &be_const_str_solidified, + ( &(const binstruction[18]) { /* code */ + 0x60080012, // 0000 GETGBL R2 G18 + 0x7C080000, // 0001 CALL R2 0 + 0x600C0010, // 0002 GETGBL R3 G16 + 0x88100100, // 0003 GETMBR R4 R0 K0 + 0x8C100901, // 0004 GETMET R4 R4 K1 + 0x7C100200, // 0005 CALL R4 1 + 0x7C0C0200, // 0006 CALL R3 1 + 0xA8020005, // 0007 EXBLK 0 #000E + 0x5C100600, // 0008 MOVE R4 R3 + 0x7C100000, // 0009 CALL R4 0 + 0x8C140502, // 000A GETMET R5 R2 K2 + 0x5C1C0800, // 000B MOVE R7 R4 + 0x7C140400, // 000C CALL R5 2 + 0x7001FFF9, // 000D JMP #0008 + 0x580C0003, // 000E LDCONST R3 K3 + 0xAC0C0200, // 000F CATCH R3 1 0 + 0xB0080000, // 0010 RAISE 2 R0 R0 + 0x80040400, // 0011 RET 1 R2 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: +********************************************************************/ +be_local_closure(Matter_Plugin__X3Clambda_X3E, /* name */ + be_nested_proto( + 3, /* nstack */ + 1, /* argc */ + 0, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 0, /* has constants */ + NULL, /* no const */ + be_str_weak(_X3Clambda_X3E), + &be_const_str_solidified, + ( &(const binstruction[ 4]) { /* code */ + 0x60040008, // 0000 GETGBL R1 G8 + 0x5C080000, // 0001 MOVE R2 R0 + 0x7C040200, // 0002 CALL R1 1 + 0x80040200, // 0003 RET 1 R1 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: is_local_device +********************************************************************/ +be_local_closure(Matter_Plugin_is_local_device, /* name */ + be_nested_proto( + 2, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 0, /* has constants */ + NULL, /* no const */ + be_str_weak(is_local_device), + &be_const_str_solidified, + ( &(const binstruction[ 2]) { /* code */ + 0x50040200, // 0000 LDBOOL R1 1 0 + 0x80040200, // 0001 RET 1 R1 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: write_attribute +********************************************************************/ +be_local_closure(Matter_Plugin_write_attribute, /* name */ + be_nested_proto( + 5, /* nstack */ + 4, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 0, /* has constants */ + NULL, /* no const */ + be_str_weak(write_attribute), + &be_const_str_solidified, + ( &(const binstruction[ 2]) { /* code */ + 0x4C100000, // 0000 LDNIL R4 + 0x80040800, // 0001 RET 1 R4 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: invoke_request +********************************************************************/ +be_local_closure(Matter_Plugin_invoke_request, /* name */ + be_nested_proto( + 5, /* nstack */ + 4, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 0, /* has constants */ + NULL, /* no const */ + be_str_weak(invoke_request), + &be_const_str_solidified, + ( &(const binstruction[ 2]) { /* code */ + 0x4C100000, // 0000 LDNIL R4 + 0x80040800, // 0001 RET 1 R4 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: consolidate_clusters +********************************************************************/ +be_local_closure(Matter_Plugin_consolidate_clusters, /* name */ + be_nested_proto( + 12, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 1, /* has sup protos */ + ( &(const struct bproto*[ 1]) { + be_nested_proto( + 3, /* nstack */ + 1, /* argc */ + 0, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 0, /* has constants */ + NULL, /* no const */ + be_str_weak(real_super), + &be_const_str_solidified, + ( &(const binstruction[ 4]) { /* code */ + 0x60040003, // 0000 GETGBL R1 G3 + 0x5C080000, // 0001 MOVE R2 R0 + 0x7C040200, // 0002 CALL R1 1 + 0x80040200, // 0003 RET 1 R1 + }) + ), + }), + 1, /* has constants */ + ( &(const bvalue[ 6]) { /* constants */ + /* K0 */ be_nested_str_weak(CLUSTERS), + /* K1 */ be_nested_str_weak(keys), + /* K2 */ be_nested_str_weak(contains), + /* K3 */ be_nested_str_weak(find), + /* K4 */ be_nested_str_weak(push), + /* K5 */ be_nested_str_weak(stop_iteration), + }), + be_str_weak(consolidate_clusters), + &be_const_str_solidified, + ( &(const binstruction[53]) { /* code */ + 0x84040000, // 0000 CLOSURE R1 P0 + 0x60080013, // 0001 GETGBL R2 G19 + 0x7C080000, // 0002 CALL R2 0 + 0x5C0C0000, // 0003 MOVE R3 R0 + 0x4C100000, // 0004 LDNIL R4 + 0x20100604, // 0005 NE R4 R3 R4 + 0x7812002C, // 0006 JMPF R4 #0034 + 0x88100700, // 0007 GETMBR R4 R3 K0 + 0x60140010, // 0008 GETGBL R5 G16 + 0x8C180901, // 0009 GETMET R6 R4 K1 + 0x7C180200, // 000A CALL R6 1 + 0x7C140200, // 000B CALL R5 1 + 0xA802001E, // 000C EXBLK 0 #002C + 0x5C180A00, // 000D MOVE R6 R5 + 0x7C180000, // 000E CALL R6 0 + 0x8C1C0502, // 000F GETMET R7 R2 K2 + 0x5C240C00, // 0010 MOVE R9 R6 + 0x7C1C0400, // 0011 CALL R7 2 + 0x741E0002, // 0012 JMPT R7 #0016 + 0x601C0012, // 0013 GETGBL R7 G18 + 0x7C1C0000, // 0014 CALL R7 0 + 0x98080C07, // 0015 SETIDX R2 R6 R7 + 0x601C0010, // 0016 GETGBL R7 G16 + 0x94200806, // 0017 GETIDX R8 R4 R6 + 0x7C1C0200, // 0018 CALL R7 1 + 0xA802000D, // 0019 EXBLK 0 #0028 + 0x5C200E00, // 001A MOVE R8 R7 + 0x7C200000, // 001B CALL R8 0 + 0x94240406, // 001C GETIDX R9 R2 R6 + 0x8C241303, // 001D GETMET R9 R9 K3 + 0x5C2C1000, // 001E MOVE R11 R8 + 0x7C240400, // 001F CALL R9 2 + 0x4C280000, // 0020 LDNIL R10 + 0x1C24120A, // 0021 EQ R9 R9 R10 + 0x78260003, // 0022 JMPF R9 #0027 + 0x94240406, // 0023 GETIDX R9 R2 R6 + 0x8C241304, // 0024 GETMET R9 R9 K4 + 0x5C2C1000, // 0025 MOVE R11 R8 + 0x7C240400, // 0026 CALL R9 2 + 0x7001FFF1, // 0027 JMP #001A + 0x581C0005, // 0028 LDCONST R7 K5 + 0xAC1C0200, // 0029 CATCH R7 1 0 + 0xB0080000, // 002A RAISE 2 R0 R0 + 0x7001FFE0, // 002B JMP #000D + 0x58140005, // 002C LDCONST R5 K5 + 0xAC140200, // 002D CATCH R5 1 0 + 0xB0080000, // 002E RAISE 2 R0 R0 + 0x5C140200, // 002F MOVE R5 R1 + 0x5C180600, // 0030 MOVE R6 R3 + 0x7C140200, // 0031 CALL R5 1 + 0x5C0C0A00, // 0032 MOVE R3 R5 + 0x7001FFCF, // 0033 JMP #0004 + 0x80040400, // 0034 RET 1 R2 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: attribute_updated +********************************************************************/ +be_local_closure(Matter_Plugin_attribute_updated, /* name */ + be_nested_proto( + 10, /* nstack */ + 4, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 3]) { /* constants */ + /* K0 */ be_nested_str_weak(device), + /* K1 */ be_nested_str_weak(attribute_updated), + /* K2 */ be_nested_str_weak(endpoint), + }), + be_str_weak(attribute_updated), + &be_const_str_solidified, + ( &(const binstruction[ 8]) { /* code */ + 0x88100100, // 0000 GETMBR R4 R0 K0 + 0x8C100901, // 0001 GETMET R4 R4 K1 + 0x88180102, // 0002 GETMBR R6 R0 K2 + 0x5C1C0200, // 0003 MOVE R7 R1 + 0x5C200400, // 0004 MOVE R8 R2 + 0x5C240600, // 0005 MOVE R9 R3 + 0x7C100A00, // 0006 CALL R4 5 + 0x80000000, // 0007 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: parse_sensors +********************************************************************/ +be_local_closure(Matter_Plugin_parse_sensors, /* name */ + be_nested_proto( + 2, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 0, /* has constants */ + NULL, /* no const */ + be_str_weak(parse_sensors), + &be_const_str_solidified, + ( &(const binstruction[ 1]) { /* code */ + 0x80000000, // 0000 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: has +********************************************************************/ +be_local_closure(Matter_Plugin_has, /* name */ + be_nested_proto( + 6, /* nstack */ + 3, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 4]) { /* constants */ + /* K0 */ be_nested_str_weak(clusters), + /* K1 */ be_nested_str_weak(contains), + /* K2 */ be_nested_str_weak(endpoints), + /* K3 */ be_nested_str_weak(find), + }), + be_str_weak(has), + &be_const_str_solidified, + ( &(const binstruction[15]) { /* code */ + 0x880C0100, // 0000 GETMBR R3 R0 K0 + 0x8C0C0701, // 0001 GETMET R3 R3 K1 + 0x5C140200, // 0002 MOVE R5 R1 + 0x7C0C0400, // 0003 CALL R3 2 + 0x780E0006, // 0004 JMPF R3 #000C + 0x880C0102, // 0005 GETMBR R3 R0 K2 + 0x8C0C0703, // 0006 GETMET R3 R3 K3 + 0x5C140400, // 0007 MOVE R5 R2 + 0x7C0C0400, // 0008 CALL R3 2 + 0x4C100000, // 0009 LDNIL R4 + 0x200C0604, // 000A NE R3 R3 R4 + 0x740E0000, // 000B JMPT R3 #000D + 0x500C0001, // 000C LDBOOL R3 0 1 + 0x500C0200, // 000D LDBOOL R3 1 0 + 0x80040600, // 000E RET 1 R3 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: update_shadow_lazy +********************************************************************/ +be_local_closure(Matter_Plugin_update_shadow_lazy, /* name */ + be_nested_proto( + 3, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 3]) { /* constants */ + /* K0 */ be_nested_str_weak(tick), + /* K1 */ be_nested_str_weak(device), + /* K2 */ be_nested_str_weak(update_shadow), + }), + be_str_weak(update_shadow_lazy), + &be_const_str_solidified, + ( &(const binstruction[11]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x88080101, // 0001 GETMBR R2 R0 K1 + 0x88080500, // 0002 GETMBR R2 R2 K0 + 0x20040202, // 0003 NE R1 R1 R2 + 0x78060004, // 0004 JMPF R1 #000A + 0x8C040102, // 0005 GETMET R1 R0 K2 + 0x7C040200, // 0006 CALL R1 1 + 0x88040101, // 0007 GETMBR R1 R0 K1 + 0x88040300, // 0008 GETMBR R1 R1 K0 + 0x90020001, // 0009 SETMBR R0 K0 R1 + 0x80000000, // 000A RET 0 + }) + ) +); +/*******************************************************************/ + + /******************************************************************** ** Solidified function: get_endpoint ********************************************************************/ @@ -33,6 +486,231 @@ be_local_closure(Matter_Plugin_get_endpoint, /* name */ /*******************************************************************/ +/******************************************************************** +** Solidified function: init +********************************************************************/ +be_local_closure(Matter_Plugin_init, /* name */ + be_nested_proto( + 7, /* nstack */ + 4, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 5]) { /* constants */ + /* K0 */ be_nested_str_weak(device), + /* K1 */ be_nested_str_weak(endpoint), + /* K2 */ be_nested_str_weak(clusters), + /* K3 */ be_nested_str_weak(consolidate_clusters), + /* K4 */ be_nested_str_weak(parse_configuration), + }), + be_str_weak(init), + &be_const_str_solidified, + ( &(const binstruction[ 9]) { /* code */ + 0x90020001, // 0000 SETMBR R0 K0 R1 + 0x90020202, // 0001 SETMBR R0 K1 R2 + 0x8C100103, // 0002 GETMET R4 R0 K3 + 0x7C100200, // 0003 CALL R4 1 + 0x90020404, // 0004 SETMBR R0 K2 R4 + 0x8C100104, // 0005 GETMET R4 R0 K4 + 0x5C180600, // 0006 MOVE R6 R3 + 0x7C100400, // 0007 CALL R4 2 + 0x80000000, // 0008 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: read_event +********************************************************************/ +be_local_closure(Matter_Plugin_read_event, /* name */ + be_nested_proto( + 6, /* nstack */ + 5, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 0, /* has constants */ + NULL, /* no const */ + be_str_weak(read_event), + &be_const_str_solidified, + ( &(const binstruction[ 2]) { /* code */ + 0x4C140000, // 0000 LDNIL R5 + 0x80040A00, // 0001 RET 1 R5 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: subscribe_attribute +********************************************************************/ +be_local_closure(Matter_Plugin_subscribe_attribute, /* name */ + be_nested_proto( + 6, /* nstack */ + 5, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 0, /* has constants */ + NULL, /* no const */ + be_str_weak(subscribe_attribute), + &be_const_str_solidified, + ( &(const binstruction[ 2]) { /* code */ + 0x4C140000, // 0000 LDNIL R5 + 0x80040A00, // 0001 RET 1 R5 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: parse_configuration +********************************************************************/ +be_local_closure(Matter_Plugin_parse_configuration, /* name */ + be_nested_proto( + 2, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 0, /* has constants */ + NULL, /* no const */ + be_str_weak(parse_configuration), + &be_const_str_solidified, + ( &(const binstruction[ 1]) { /* code */ + 0x80000000, // 0000 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: subscribe_event +********************************************************************/ +be_local_closure(Matter_Plugin_subscribe_event, /* name */ + be_nested_proto( + 6, /* nstack */ + 5, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 0, /* has constants */ + NULL, /* no const */ + be_str_weak(subscribe_event), + &be_const_str_solidified, + ( &(const binstruction[ 2]) { /* code */ + 0x4C140000, // 0000 LDNIL R5 + 0x80040A00, // 0001 RET 1 R5 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: get_attribute_list +********************************************************************/ +be_local_closure(Matter_Plugin_get_attribute_list, /* name */ + be_nested_proto( + 7, /* nstack */ + 3, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 2]) { /* constants */ + /* K0 */ be_nested_str_weak(clusters), + /* K1 */ be_nested_str_weak(find), + }), + be_str_weak(get_attribute_list), + &be_const_str_solidified, + ( &(const binstruction[ 7]) { /* code */ + 0x880C0100, // 0000 GETMBR R3 R0 K0 + 0x8C0C0701, // 0001 GETMET R3 R3 K1 + 0x5C140400, // 0002 MOVE R5 R2 + 0x60180012, // 0003 GETGBL R6 G18 + 0x7C180000, // 0004 CALL R6 0 + 0x7C0C0600, // 0005 CALL R3 3 + 0x80040600, // 0006 RET 1 R3 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: timed_request +********************************************************************/ +be_local_closure(Matter_Plugin_timed_request, /* name */ + be_nested_proto( + 5, /* nstack */ + 4, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 0, /* has constants */ + NULL, /* no const */ + be_str_weak(timed_request), + &be_const_str_solidified, + ( &(const binstruction[ 2]) { /* code */ + 0x4C100000, // 0000 LDNIL R4 + 0x80040800, // 0001 RET 1 R4 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: update_shadow +********************************************************************/ +be_local_closure(Matter_Plugin_update_shadow, /* name */ + be_nested_proto( + 2, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 2]) { /* constants */ + /* K0 */ be_nested_str_weak(tick), + /* K1 */ be_nested_str_weak(device), + }), + be_str_weak(update_shadow), + &be_const_str_solidified, + ( &(const binstruction[ 4]) { /* code */ + 0x88040101, // 0000 GETMBR R1 R0 K1 + 0x88040300, // 0001 GETMBR R1 R1 K0 + 0x90020001, // 0002 SETMBR R0 K0 R1 + 0x80000000, // 0003 RET 0 + }) + ) +); +/*******************************************************************/ + + /******************************************************************** ** Solidified function: read_attribute ********************************************************************/ @@ -180,6 +858,43 @@ be_local_closure(Matter_Plugin_read_attribute, /* name */ /*******************************************************************/ +/******************************************************************** +** Solidified function: ui_string_to_conf +********************************************************************/ +be_local_closure(Matter_Plugin_ui_string_to_conf, /* name */ + be_nested_proto( + 8, /* nstack */ + 3, /* argc */ + 4, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 3]) { /* constants */ + /* K0 */ be_const_class(be_class_Matter_Plugin), + /* K1 */ be_nested_str_weak(ARG), + /* K2 */ be_nested_str_weak(ARG_TYPE), + }), + be_str_weak(ui_string_to_conf), + &be_const_str_solidified, + ( &(const binstruction[10]) { /* code */ + 0x580C0000, // 0000 LDCONST R3 K0 + 0x88100101, // 0001 GETMBR R4 R0 K1 + 0x88140102, // 0002 GETMBR R5 R0 K2 + 0x780A0004, // 0003 JMPF R2 #0009 + 0x78120003, // 0004 JMPF R4 #0009 + 0x5C180A00, // 0005 MOVE R6 R5 + 0x5C1C0400, // 0006 MOVE R7 R2 + 0x7C180200, // 0007 CALL R6 1 + 0x98040806, // 0008 SETIDX R1 R4 R6 + 0x80040200, // 0009 RET 1 R1 + }) + ) +); +/*******************************************************************/ + + /******************************************************************** ** Solidified function: ui_conf_to_string ********************************************************************/ @@ -220,758 +935,41 @@ be_local_closure(Matter_Plugin_ui_conf_to_string, /* name */ /*******************************************************************/ -/******************************************************************** -** Solidified function: is_local_device -********************************************************************/ -be_local_closure(Matter_Plugin_is_local_device, /* name */ - be_nested_proto( - 2, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 0, /* has constants */ - NULL, /* no const */ - be_str_weak(is_local_device), - &be_const_str_solidified, - ( &(const binstruction[ 2]) { /* code */ - 0x50040200, // 0000 LDBOOL R1 1 0 - 0x80040200, // 0001 RET 1 R1 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: parse_configuration -********************************************************************/ -be_local_closure(Matter_Plugin_parse_configuration, /* name */ - be_nested_proto( - 2, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 0, /* has constants */ - NULL, /* no const */ - be_str_weak(parse_configuration), - &be_const_str_solidified, - ( &(const binstruction[ 1]) { /* code */ - 0x80000000, // 0000 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: has -********************************************************************/ -be_local_closure(Matter_Plugin_has, /* name */ - be_nested_proto( - 6, /* nstack */ - 3, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 4]) { /* constants */ - /* K0 */ be_nested_str_weak(clusters), - /* K1 */ be_nested_str_weak(contains), - /* K2 */ be_nested_str_weak(endpoints), - /* K3 */ be_nested_str_weak(find), - }), - be_str_weak(has), - &be_const_str_solidified, - ( &(const binstruction[15]) { /* code */ - 0x880C0100, // 0000 GETMBR R3 R0 K0 - 0x8C0C0701, // 0001 GETMET R3 R3 K1 - 0x5C140200, // 0002 MOVE R5 R1 - 0x7C0C0400, // 0003 CALL R3 2 - 0x780E0006, // 0004 JMPF R3 #000C - 0x880C0102, // 0005 GETMBR R3 R0 K2 - 0x8C0C0703, // 0006 GETMET R3 R3 K3 - 0x5C140400, // 0007 MOVE R5 R2 - 0x7C0C0400, // 0008 CALL R3 2 - 0x4C100000, // 0009 LDNIL R4 - 0x200C0604, // 000A NE R3 R3 R4 - 0x740E0000, // 000B JMPT R3 #000D - 0x500C0001, // 000C LDBOOL R3 0 1 - 0x500C0200, // 000D LDBOOL R3 1 0 - 0x80040600, // 000E RET 1 R3 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: consolidate_clusters -********************************************************************/ -be_local_closure(Matter_Plugin_consolidate_clusters, /* name */ - be_nested_proto( - 12, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 1, /* has sup protos */ - ( &(const struct bproto*[ 1]) { - be_nested_proto( - 3, /* nstack */ - 1, /* argc */ - 0, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 0, /* has constants */ - NULL, /* no const */ - be_str_weak(real_super), - &be_const_str_solidified, - ( &(const binstruction[ 4]) { /* code */ - 0x60040003, // 0000 GETGBL R1 G3 - 0x5C080000, // 0001 MOVE R2 R0 - 0x7C040200, // 0002 CALL R1 1 - 0x80040200, // 0003 RET 1 R1 - }) - ), - }), - 1, /* has constants */ - ( &(const bvalue[ 6]) { /* constants */ - /* K0 */ be_nested_str_weak(CLUSTERS), - /* K1 */ be_nested_str_weak(keys), - /* K2 */ be_nested_str_weak(contains), - /* K3 */ be_nested_str_weak(find), - /* K4 */ be_nested_str_weak(push), - /* K5 */ be_nested_str_weak(stop_iteration), - }), - be_str_weak(consolidate_clusters), - &be_const_str_solidified, - ( &(const binstruction[53]) { /* code */ - 0x84040000, // 0000 CLOSURE R1 P0 - 0x60080013, // 0001 GETGBL R2 G19 - 0x7C080000, // 0002 CALL R2 0 - 0x5C0C0000, // 0003 MOVE R3 R0 - 0x4C100000, // 0004 LDNIL R4 - 0x20100604, // 0005 NE R4 R3 R4 - 0x7812002C, // 0006 JMPF R4 #0034 - 0x88100700, // 0007 GETMBR R4 R3 K0 - 0x60140010, // 0008 GETGBL R5 G16 - 0x8C180901, // 0009 GETMET R6 R4 K1 - 0x7C180200, // 000A CALL R6 1 - 0x7C140200, // 000B CALL R5 1 - 0xA802001E, // 000C EXBLK 0 #002C - 0x5C180A00, // 000D MOVE R6 R5 - 0x7C180000, // 000E CALL R6 0 - 0x8C1C0502, // 000F GETMET R7 R2 K2 - 0x5C240C00, // 0010 MOVE R9 R6 - 0x7C1C0400, // 0011 CALL R7 2 - 0x741E0002, // 0012 JMPT R7 #0016 - 0x601C0012, // 0013 GETGBL R7 G18 - 0x7C1C0000, // 0014 CALL R7 0 - 0x98080C07, // 0015 SETIDX R2 R6 R7 - 0x601C0010, // 0016 GETGBL R7 G16 - 0x94200806, // 0017 GETIDX R8 R4 R6 - 0x7C1C0200, // 0018 CALL R7 1 - 0xA802000D, // 0019 EXBLK 0 #0028 - 0x5C200E00, // 001A MOVE R8 R7 - 0x7C200000, // 001B CALL R8 0 - 0x94240406, // 001C GETIDX R9 R2 R6 - 0x8C241303, // 001D GETMET R9 R9 K3 - 0x5C2C1000, // 001E MOVE R11 R8 - 0x7C240400, // 001F CALL R9 2 - 0x4C280000, // 0020 LDNIL R10 - 0x1C24120A, // 0021 EQ R9 R9 R10 - 0x78260003, // 0022 JMPF R9 #0027 - 0x94240406, // 0023 GETIDX R9 R2 R6 - 0x8C241304, // 0024 GETMET R9 R9 K4 - 0x5C2C1000, // 0025 MOVE R11 R8 - 0x7C240400, // 0026 CALL R9 2 - 0x7001FFF1, // 0027 JMP #001A - 0x581C0005, // 0028 LDCONST R7 K5 - 0xAC1C0200, // 0029 CATCH R7 1 0 - 0xB0080000, // 002A RAISE 2 R0 R0 - 0x7001FFE0, // 002B JMP #000D - 0x58140005, // 002C LDCONST R5 K5 - 0xAC140200, // 002D CATCH R5 1 0 - 0xB0080000, // 002E RAISE 2 R0 R0 - 0x5C140200, // 002F MOVE R5 R1 - 0x5C180600, // 0030 MOVE R6 R3 - 0x7C140200, // 0031 CALL R5 1 - 0x5C0C0A00, // 0032 MOVE R3 R5 - 0x7001FFCF, // 0033 JMP #0004 - 0x80040400, // 0034 RET 1 R2 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: get_attribute_list -********************************************************************/ -be_local_closure(Matter_Plugin_get_attribute_list, /* name */ - be_nested_proto( - 7, /* nstack */ - 3, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 2]) { /* constants */ - /* K0 */ be_nested_str_weak(clusters), - /* K1 */ be_nested_str_weak(find), - }), - be_str_weak(get_attribute_list), - &be_const_str_solidified, - ( &(const binstruction[ 7]) { /* code */ - 0x880C0100, // 0000 GETMBR R3 R0 K0 - 0x8C0C0701, // 0001 GETMET R3 R3 K1 - 0x5C140400, // 0002 MOVE R5 R2 - 0x60180012, // 0003 GETGBL R6 G18 - 0x7C180000, // 0004 CALL R6 0 - 0x7C0C0600, // 0005 CALL R3 3 - 0x80040600, // 0006 RET 1 R3 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: -********************************************************************/ -be_local_closure(Matter_Plugin__X3Clambda_X3E, /* name */ - be_nested_proto( - 3, /* nstack */ - 1, /* argc */ - 0, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 0, /* has constants */ - NULL, /* no const */ - be_str_weak(_X3Clambda_X3E), - &be_const_str_solidified, - ( &(const binstruction[ 4]) { /* code */ - 0x60040008, // 0000 GETGBL R1 G8 - 0x5C080000, // 0001 MOVE R2 R0 - 0x7C040200, // 0002 CALL R1 1 - 0x80040200, // 0003 RET 1 R1 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: update_shadow_lazy -********************************************************************/ -be_local_closure(Matter_Plugin_update_shadow_lazy, /* name */ - be_nested_proto( - 3, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 3]) { /* constants */ - /* K0 */ be_nested_str_weak(tick), - /* K1 */ be_nested_str_weak(device), - /* K2 */ be_nested_str_weak(update_shadow), - }), - be_str_weak(update_shadow_lazy), - &be_const_str_solidified, - ( &(const binstruction[11]) { /* code */ - 0x88040100, // 0000 GETMBR R1 R0 K0 - 0x88080101, // 0001 GETMBR R2 R0 K1 - 0x88080500, // 0002 GETMBR R2 R2 K0 - 0x20040202, // 0003 NE R1 R1 R2 - 0x78060004, // 0004 JMPF R1 #000A - 0x8C040102, // 0005 GETMET R1 R0 K2 - 0x7C040200, // 0006 CALL R1 1 - 0x88040101, // 0007 GETMBR R1 R0 K1 - 0x88040300, // 0008 GETMBR R1 R1 K0 - 0x90020001, // 0009 SETMBR R0 K0 R1 - 0x80000000, // 000A RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: parse_sensors -********************************************************************/ -be_local_closure(Matter_Plugin_parse_sensors, /* name */ - be_nested_proto( - 2, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 0, /* has constants */ - NULL, /* no const */ - be_str_weak(parse_sensors), - &be_const_str_solidified, - ( &(const binstruction[ 1]) { /* code */ - 0x80000000, // 0000 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: attribute_updated -********************************************************************/ -be_local_closure(Matter_Plugin_attribute_updated, /* name */ - be_nested_proto( - 10, /* nstack */ - 4, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 3]) { /* constants */ - /* K0 */ be_nested_str_weak(device), - /* K1 */ be_nested_str_weak(attribute_updated), - /* K2 */ be_nested_str_weak(endpoint), - }), - be_str_weak(attribute_updated), - &be_const_str_solidified, - ( &(const binstruction[ 8]) { /* code */ - 0x88100100, // 0000 GETMBR R4 R0 K0 - 0x8C100901, // 0001 GETMET R4 R4 K1 - 0x88180102, // 0002 GETMBR R6 R0 K2 - 0x5C1C0200, // 0003 MOVE R7 R1 - 0x5C200400, // 0004 MOVE R8 R2 - 0x5C240600, // 0005 MOVE R9 R3 - 0x7C100A00, // 0006 CALL R4 5 - 0x80000000, // 0007 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: subscribe_event -********************************************************************/ -be_local_closure(Matter_Plugin_subscribe_event, /* name */ - be_nested_proto( - 6, /* nstack */ - 5, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 0, /* has constants */ - NULL, /* no const */ - be_str_weak(subscribe_event), - &be_const_str_solidified, - ( &(const binstruction[ 2]) { /* code */ - 0x4C140000, // 0000 LDNIL R5 - 0x80040A00, // 0001 RET 1 R5 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: write_attribute -********************************************************************/ -be_local_closure(Matter_Plugin_write_attribute, /* name */ - be_nested_proto( - 5, /* nstack */ - 4, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 0, /* has constants */ - NULL, /* no const */ - be_str_weak(write_attribute), - &be_const_str_solidified, - ( &(const binstruction[ 2]) { /* code */ - 0x4C100000, // 0000 LDNIL R4 - 0x80040800, // 0001 RET 1 R4 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: get_cluster_list -********************************************************************/ -be_local_closure(Matter_Plugin_get_cluster_list, /* name */ - be_nested_proto( - 8, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 4]) { /* constants */ - /* K0 */ be_nested_str_weak(clusters), - /* K1 */ be_nested_str_weak(keys), - /* K2 */ be_nested_str_weak(push), - /* K3 */ be_nested_str_weak(stop_iteration), - }), - be_str_weak(get_cluster_list), - &be_const_str_solidified, - ( &(const binstruction[18]) { /* code */ - 0x60080012, // 0000 GETGBL R2 G18 - 0x7C080000, // 0001 CALL R2 0 - 0x600C0010, // 0002 GETGBL R3 G16 - 0x88100100, // 0003 GETMBR R4 R0 K0 - 0x8C100901, // 0004 GETMET R4 R4 K1 - 0x7C100200, // 0005 CALL R4 1 - 0x7C0C0200, // 0006 CALL R3 1 - 0xA8020005, // 0007 EXBLK 0 #000E - 0x5C100600, // 0008 MOVE R4 R3 - 0x7C100000, // 0009 CALL R4 0 - 0x8C140502, // 000A GETMET R5 R2 K2 - 0x5C1C0800, // 000B MOVE R7 R4 - 0x7C140400, // 000C CALL R5 2 - 0x7001FFF9, // 000D JMP #0008 - 0x580C0003, // 000E LDCONST R3 K3 - 0xAC0C0200, // 000F CATCH R3 1 0 - 0xB0080000, // 0010 RAISE 2 R0 R0 - 0x80040400, // 0011 RET 1 R2 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: subscribe_attribute -********************************************************************/ -be_local_closure(Matter_Plugin_subscribe_attribute, /* name */ - be_nested_proto( - 6, /* nstack */ - 5, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 0, /* has constants */ - NULL, /* no const */ - be_str_weak(subscribe_attribute), - &be_const_str_solidified, - ( &(const binstruction[ 2]) { /* code */ - 0x4C140000, // 0000 LDNIL R5 - 0x80040A00, // 0001 RET 1 R5 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: ui_string_to_conf -********************************************************************/ -be_local_closure(Matter_Plugin_ui_string_to_conf, /* name */ - be_nested_proto( - 8, /* nstack */ - 3, /* argc */ - 4, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 3]) { /* constants */ - /* K0 */ be_const_class(be_class_Matter_Plugin), - /* K1 */ be_nested_str_weak(ARG), - /* K2 */ be_nested_str_weak(ARG_TYPE), - }), - be_str_weak(ui_string_to_conf), - &be_const_str_solidified, - ( &(const binstruction[10]) { /* code */ - 0x580C0000, // 0000 LDCONST R3 K0 - 0x88100101, // 0001 GETMBR R4 R0 K1 - 0x88140102, // 0002 GETMBR R5 R0 K2 - 0x780A0004, // 0003 JMPF R2 #0009 - 0x78120003, // 0004 JMPF R4 #0009 - 0x5C180A00, // 0005 MOVE R6 R5 - 0x5C1C0400, // 0006 MOVE R7 R2 - 0x7C180200, // 0007 CALL R6 1 - 0x98040806, // 0008 SETIDX R1 R4 R6 - 0x80040200, // 0009 RET 1 R1 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: read_event -********************************************************************/ -be_local_closure(Matter_Plugin_read_event, /* name */ - be_nested_proto( - 6, /* nstack */ - 5, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 0, /* has constants */ - NULL, /* no const */ - be_str_weak(read_event), - &be_const_str_solidified, - ( &(const binstruction[ 2]) { /* code */ - 0x4C140000, // 0000 LDNIL R5 - 0x80040A00, // 0001 RET 1 R5 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: update_shadow -********************************************************************/ -be_local_closure(Matter_Plugin_update_shadow, /* name */ - be_nested_proto( - 2, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 2]) { /* constants */ - /* K0 */ be_nested_str_weak(tick), - /* K1 */ be_nested_str_weak(device), - }), - be_str_weak(update_shadow), - &be_const_str_solidified, - ( &(const binstruction[ 4]) { /* code */ - 0x88040101, // 0000 GETMBR R1 R0 K1 - 0x88040300, // 0001 GETMBR R1 R1 K0 - 0x90020001, // 0002 SETMBR R0 K0 R1 - 0x80000000, // 0003 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: every_250ms -********************************************************************/ -be_local_closure(Matter_Plugin_every_250ms, /* name */ - be_nested_proto( - 4, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[10]) { /* constants */ - /* K0 */ be_nested_str_weak(update_next), - /* K1 */ be_nested_str_weak(matter), - /* K2 */ be_nested_str_weak(jitter), - /* K3 */ be_nested_str_weak(UPDATE_TIME), - /* K4 */ be_nested_str_weak(tasmota), - /* K5 */ be_nested_str_weak(time_reached), - /* K6 */ be_nested_str_weak(tick), - /* K7 */ be_nested_str_weak(device), - /* K8 */ be_nested_str_weak(update_shadow), - /* K9 */ be_nested_str_weak(millis), - }), - be_str_weak(every_250ms), - &be_const_str_solidified, - ( &(const binstruction[28]) { /* code */ - 0x88040100, // 0000 GETMBR R1 R0 K0 - 0x4C080000, // 0001 LDNIL R2 - 0x1C040202, // 0002 EQ R1 R1 R2 - 0x78060005, // 0003 JMPF R1 #000A - 0xB8060200, // 0004 GETNGBL R1 K1 - 0x8C040302, // 0005 GETMET R1 R1 K2 - 0x880C0103, // 0006 GETMBR R3 R0 K3 - 0x7C040400, // 0007 CALL R1 2 - 0x90020001, // 0008 SETMBR R0 K0 R1 - 0x70020010, // 0009 JMP #001B - 0xB8060800, // 000A GETNGBL R1 K4 - 0x8C040305, // 000B GETMET R1 R1 K5 - 0x880C0100, // 000C GETMBR R3 R0 K0 - 0x7C040400, // 000D CALL R1 2 - 0x7806000B, // 000E JMPF R1 #001B - 0x88040106, // 000F GETMBR R1 R0 K6 - 0x88080107, // 0010 GETMBR R2 R0 K7 - 0x88080506, // 0011 GETMBR R2 R2 K6 - 0x20040202, // 0012 NE R1 R1 R2 - 0x78060001, // 0013 JMPF R1 #0016 - 0x8C040108, // 0014 GETMET R1 R0 K8 - 0x7C040200, // 0015 CALL R1 1 - 0xB8060800, // 0016 GETNGBL R1 K4 - 0x8C040309, // 0017 GETMET R1 R1 K9 - 0x880C0103, // 0018 GETMBR R3 R0 K3 - 0x7C040400, // 0019 CALL R1 2 - 0x90020001, // 001A SETMBR R0 K0 R1 - 0x80000000, // 001B RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: timed_request -********************************************************************/ -be_local_closure(Matter_Plugin_timed_request, /* name */ - be_nested_proto( - 5, /* nstack */ - 4, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 0, /* has constants */ - NULL, /* no const */ - be_str_weak(timed_request), - &be_const_str_solidified, - ( &(const binstruction[ 2]) { /* code */ - 0x4C100000, // 0000 LDNIL R4 - 0x80040800, // 0001 RET 1 R4 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: init -********************************************************************/ -be_local_closure(Matter_Plugin_init, /* name */ - be_nested_proto( - 7, /* nstack */ - 4, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 5]) { /* constants */ - /* K0 */ be_nested_str_weak(device), - /* K1 */ be_nested_str_weak(endpoint), - /* K2 */ be_nested_str_weak(clusters), - /* K3 */ be_nested_str_weak(consolidate_clusters), - /* K4 */ be_nested_str_weak(parse_configuration), - }), - be_str_weak(init), - &be_const_str_solidified, - ( &(const binstruction[ 9]) { /* code */ - 0x90020001, // 0000 SETMBR R0 K0 R1 - 0x90020202, // 0001 SETMBR R0 K1 R2 - 0x8C100103, // 0002 GETMET R4 R0 K3 - 0x7C100200, // 0003 CALL R4 1 - 0x90020404, // 0004 SETMBR R0 K2 R4 - 0x8C100104, // 0005 GETMET R4 R0 K4 - 0x5C180600, // 0006 MOVE R6 R3 - 0x7C100400, // 0007 CALL R4 2 - 0x80000000, // 0008 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: invoke_request -********************************************************************/ -be_local_closure(Matter_Plugin_invoke_request, /* name */ - be_nested_proto( - 5, /* nstack */ - 4, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 0, /* has constants */ - NULL, /* no const */ - be_str_weak(invoke_request), - &be_const_str_solidified, - ( &(const binstruction[ 2]) { /* code */ - 0x4C100000, // 0000 LDNIL R4 - 0x80040800, // 0001 RET 1 R4 - }) - ) -); -/*******************************************************************/ - - /******************************************************************** ** Solidified class: Matter_Plugin ********************************************************************/ be_local_class(Matter_Plugin, 5, NULL, - be_nested_map(33, + be_nested_map(34, ( (struct bmapnode*) &(const bmapnode[]) { - { be_const_key_weak(clusters, -1), be_const_var(3) }, - { be_const_key_weak(get_endpoint, 25), be_const_closure(Matter_Plugin_get_endpoint_closure) }, - { be_const_key_weak(update_next, -1), be_const_var(0) }, - { be_const_key_weak(read_attribute, -1), be_const_closure(Matter_Plugin_read_attribute_closure) }, - { be_const_key_weak(ui_conf_to_string, 23), be_const_static_closure(Matter_Plugin_ui_conf_to_string_closure) }, - { be_const_key_weak(init, -1), be_const_closure(Matter_Plugin_init_closure) }, + { be_const_key_weak(every_250ms, 18), be_const_closure(Matter_Plugin_every_250ms_closure) }, + { be_const_key_weak(get_cluster_list, 3), be_const_closure(Matter_Plugin_get_cluster_list_closure) }, { be_const_key_weak(NAME, -1), be_nested_str_weak() }, - { be_const_key_weak(endpoint, -1), be_const_var(2) }, - { be_const_key_weak(tick, -1), be_const_var(4) }, - { be_const_key_weak(UPDATE_TIME, 5), be_const_int(5000) }, - { be_const_key_weak(parse_configuration, 21), be_const_closure(Matter_Plugin_parse_configuration_closure) }, - { be_const_key_weak(timed_request, -1), be_const_closure(Matter_Plugin_timed_request_closure) }, - { be_const_key_weak(attribute_updated, -1), be_const_closure(Matter_Plugin_attribute_updated_closure) }, - { be_const_key_weak(update_shadow, 26), be_const_closure(Matter_Plugin_update_shadow_closure) }, - { be_const_key_weak(consolidate_clusters, -1), be_const_closure(Matter_Plugin_consolidate_clusters_closure) }, - { be_const_key_weak(get_attribute_list, 24), be_const_closure(Matter_Plugin_get_attribute_list_closure) }, - { be_const_key_weak(is_local_device, 31), be_const_closure(Matter_Plugin_is_local_device_closure) }, - { be_const_key_weak(update_shadow_lazy, -1), be_const_closure(Matter_Plugin_update_shadow_lazy_closure) }, - { be_const_key_weak(ARG, 30), be_nested_str_weak() }, - { be_const_key_weak(has, 12), be_const_closure(Matter_Plugin_has_closure) }, - { be_const_key_weak(subscribe_event, 11), be_const_closure(Matter_Plugin_subscribe_event_closure) }, - { be_const_key_weak(write_attribute, -1), be_const_closure(Matter_Plugin_write_attribute_closure) }, - { be_const_key_weak(get_cluster_list, -1), be_const_closure(Matter_Plugin_get_cluster_list_closure) }, - { be_const_key_weak(TYPE, -1), be_nested_str_weak() }, - { be_const_key_weak(read_event, -1), be_const_closure(Matter_Plugin_read_event_closure) }, - { be_const_key_weak(ui_string_to_conf, -1), be_const_static_closure(Matter_Plugin_ui_string_to_conf_closure) }, - { be_const_key_weak(subscribe_attribute, -1), be_const_closure(Matter_Plugin_subscribe_attribute_closure) }, { be_const_key_weak(device, -1), be_const_var(1) }, - { be_const_key_weak(CLUSTERS, 13), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { + { be_const_key_weak(tick, -1), be_const_var(4) }, + { be_const_key_weak(write_attribute, 27), be_const_closure(Matter_Plugin_write_attribute_closure) }, + { be_const_key_weak(has, -1), be_const_closure(Matter_Plugin_has_closure) }, + { be_const_key_weak(invoke_request, 6), be_const_closure(Matter_Plugin_invoke_request_closure) }, + { be_const_key_weak(consolidate_clusters, 29), be_const_closure(Matter_Plugin_consolidate_clusters_closure) }, + { be_const_key_weak(attribute_updated, -1), be_const_closure(Matter_Plugin_attribute_updated_closure) }, + { be_const_key_weak(update_shadow_lazy, -1), be_const_closure(Matter_Plugin_update_shadow_lazy_closure) }, + { be_const_key_weak(ui_string_to_conf, -1), be_const_static_closure(Matter_Plugin_ui_string_to_conf_closure) }, + { be_const_key_weak(is_local_device, 10), be_const_closure(Matter_Plugin_is_local_device_closure) }, + { be_const_key_weak(get_endpoint, -1), be_const_closure(Matter_Plugin_get_endpoint_closure) }, + { be_const_key_weak(clusters, -1), be_const_var(3) }, + { be_const_key_weak(init, -1), be_const_closure(Matter_Plugin_init_closure) }, + { be_const_key_weak(read_event, 11), be_const_closure(Matter_Plugin_read_event_closure) }, + { be_const_key_weak(read_attribute, 24), be_const_closure(Matter_Plugin_read_attribute_closure) }, + { be_const_key_weak(update_next, -1), be_const_var(0) }, + { be_const_key_weak(ARG_HINT, -1), be_nested_str_weak(_Not_X20used_) }, + { be_const_key_weak(subscribe_event, -1), be_const_closure(Matter_Plugin_subscribe_event_closure) }, + { be_const_key_weak(get_attribute_list, -1), be_const_closure(Matter_Plugin_get_attribute_list_closure) }, + { be_const_key_weak(timed_request, -1), be_const_closure(Matter_Plugin_timed_request_closure) }, + { be_const_key_weak(update_shadow, -1), be_const_closure(Matter_Plugin_update_shadow_closure) }, + { be_const_key_weak(UPDATE_TIME, -1), be_const_int(5000) }, + { be_const_key_weak(ARG, -1), be_nested_str_weak() }, + { be_const_key_weak(CLUSTERS, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { be_const_map( * be_nested_map(2, ( (struct bmapnode*) &(const bmapnode[]) { { be_const_key_int(29, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_list, { @@ -990,10 +988,13 @@ be_local_class(Matter_Plugin, be_const_int(17), })) ) } )) }, })) ) } )) }, - { be_const_key_weak(every_250ms, -1), be_const_closure(Matter_Plugin_every_250ms_closure) }, + { be_const_key_weak(parse_configuration, -1), be_const_closure(Matter_Plugin_parse_configuration_closure) }, + { be_const_key_weak(ARG_TYPE, 17), be_const_static_closure(Matter_Plugin__X3Clambda_X3E_closure) }, + { be_const_key_weak(subscribe_attribute, 33), be_const_closure(Matter_Plugin_subscribe_attribute_closure) }, + { be_const_key_weak(ui_conf_to_string, -1), be_const_static_closure(Matter_Plugin_ui_conf_to_string_closure) }, + { be_const_key_weak(TYPE, -1), be_nested_str_weak() }, + { be_const_key_weak(endpoint, 4), be_const_var(2) }, { be_const_key_weak(parse_sensors, -1), be_const_closure(Matter_Plugin_parse_sensors_closure) }, - { be_const_key_weak(ARG_TYPE, 0), be_const_static_closure(Matter_Plugin__X3Clambda_X3E_closure) }, - { be_const_key_weak(invoke_request, -1), be_const_closure(Matter_Plugin_invoke_request_closure) }, })), be_str_weak(Matter_Plugin) ); diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Light0.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Light0.h index 3db488780..26f213ca9 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Light0.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Light0.h @@ -6,6 +6,320 @@ extern const bclass be_class_Matter_Plugin_Bridge_Light0; +/******************************************************************** +** Solidified function: init +********************************************************************/ +be_local_closure(Matter_Plugin_Bridge_Light0_init, /* name */ + be_nested_proto( + 9, /* nstack */ + 4, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 7]) { /* constants */ + /* K0 */ be_nested_str_weak(init), + /* K1 */ be_nested_str_weak(shadow_onoff), + /* K2 */ be_nested_str_weak(tasmota_relay_index), + /* K3 */ be_nested_str_weak(find), + /* K4 */ be_nested_str_weak(ARG), + /* K5 */ be_const_int(1), + /* K6 */ be_const_int(0), + }), + be_str_weak(init), + &be_const_str_solidified, + ( &(const binstruction[22]) { /* code */ + 0x60100003, // 0000 GETGBL R4 G3 + 0x5C140000, // 0001 MOVE R5 R0 + 0x7C100200, // 0002 CALL R4 1 + 0x8C100900, // 0003 GETMET R4 R4 K0 + 0x5C180200, // 0004 MOVE R6 R1 + 0x5C1C0400, // 0005 MOVE R7 R2 + 0x5C200600, // 0006 MOVE R8 R3 + 0x7C100800, // 0007 CALL R4 4 + 0x50100000, // 0008 LDBOOL R4 0 0 + 0x90020204, // 0009 SETMBR R0 K1 R4 + 0x60100009, // 000A GETGBL R4 G9 + 0x8C140703, // 000B GETMET R5 R3 K3 + 0x881C0104, // 000C GETMBR R7 R0 K4 + 0x58200005, // 000D LDCONST R8 K5 + 0x7C140600, // 000E CALL R5 3 + 0x7C100200, // 000F CALL R4 1 + 0x90020404, // 0010 SETMBR R0 K2 R4 + 0x88100102, // 0011 GETMBR R4 R0 K2 + 0x18100906, // 0012 LE R4 R4 K6 + 0x78120000, // 0013 JMPF R4 #0015 + 0x90020505, // 0014 SETMBR R0 K2 K5 + 0x80000000, // 0015 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: parse_update +********************************************************************/ +be_local_closure(Matter_Plugin_Bridge_Light0_parse_update, /* name */ + be_nested_proto( + 8, /* nstack */ + 3, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 9]) { /* constants */ + /* K0 */ be_nested_str_weak(tasmota_relay_index), + /* K1 */ be_const_int(1), + /* K2 */ be_nested_str_weak(contains), + /* K3 */ be_nested_str_weak(POWER), + /* K4 */ be_nested_str_weak(find), + /* K5 */ be_nested_str_weak(ON), + /* K6 */ be_nested_str_weak(shadow_onoff), + /* K7 */ be_nested_str_weak(attribute_updated), + /* K8 */ be_const_int(0), + }), + be_str_weak(parse_update), + &be_const_str_solidified, + ( &(const binstruction[41]) { /* code */ + 0x540E000A, // 0000 LDINT R3 11 + 0x1C0C0403, // 0001 EQ R3 R2 R3 + 0x780E0024, // 0002 JMPF R3 #0028 + 0x500C0000, // 0003 LDBOOL R3 0 0 + 0x88100100, // 0004 GETMBR R4 R0 K0 + 0x1C100901, // 0005 EQ R4 R4 K1 + 0x78120009, // 0006 JMPF R4 #0011 + 0x8C100302, // 0007 GETMET R4 R1 K2 + 0x58180003, // 0008 LDCONST R6 K3 + 0x7C100400, // 0009 CALL R4 2 + 0x78120005, // 000A JMPF R4 #0011 + 0x8C100304, // 000B GETMET R4 R1 K4 + 0x58180003, // 000C LDCONST R6 K3 + 0x7C100400, // 000D CALL R4 2 + 0x1C100905, // 000E EQ R4 R4 K5 + 0x5C0C0800, // 000F MOVE R3 R4 + 0x70020007, // 0010 JMP #0019 + 0x8C100304, // 0011 GETMET R4 R1 K4 + 0x60180008, // 0012 GETGBL R6 G8 + 0x881C0100, // 0013 GETMBR R7 R0 K0 + 0x7C180200, // 0014 CALL R6 1 + 0x001A0606, // 0015 ADD R6 K3 R6 + 0x7C100400, // 0016 CALL R4 2 + 0x1C100905, // 0017 EQ R4 R4 K5 + 0x5C0C0800, // 0018 MOVE R3 R4 + 0x88100106, // 0019 GETMBR R4 R0 K6 + 0x4C140000, // 001A LDNIL R5 + 0x20100805, // 001B NE R4 R4 R5 + 0x78120009, // 001C JMPF R4 #0027 + 0x88100106, // 001D GETMBR R4 R0 K6 + 0x60140017, // 001E GETGBL R5 G23 + 0x5C180600, // 001F MOVE R6 R3 + 0x7C140200, // 0020 CALL R5 1 + 0x20100805, // 0021 NE R4 R4 R5 + 0x78120003, // 0022 JMPF R4 #0027 + 0x8C100107, // 0023 GETMET R4 R0 K7 + 0x541A0005, // 0024 LDINT R6 6 + 0x581C0008, // 0025 LDCONST R7 K8 + 0x7C100600, // 0026 CALL R4 3 + 0x90020C03, // 0027 SETMBR R0 K6 R3 + 0x80000000, // 0028 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: web_values +********************************************************************/ +be_local_closure(Matter_Plugin_Bridge_Light0_web_values, /* name */ + be_nested_proto( + 11, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 7]) { /* constants */ + /* K0 */ be_nested_str_weak(webserver), + /* K1 */ be_nested_str_weak(string), + /* K2 */ be_nested_str_weak(content_send), + /* K3 */ be_nested_str_weak(format), + /* K4 */ be_nested_str_weak(_X7C_X20Light_X20_X25s), + /* K5 */ be_nested_str_weak(web_value_onoff), + /* K6 */ be_nested_str_weak(shadow_onoff), + }), + be_str_weak(web_values), + &be_const_str_solidified, + ( &(const binstruction[11]) { /* code */ + 0xA4060000, // 0000 IMPORT R1 K0 + 0xA40A0200, // 0001 IMPORT R2 K1 + 0x8C0C0302, // 0002 GETMET R3 R1 K2 + 0x8C140503, // 0003 GETMET R5 R2 K3 + 0x581C0004, // 0004 LDCONST R7 K4 + 0x8C200105, // 0005 GETMET R8 R0 K5 + 0x88280106, // 0006 GETMBR R10 R0 K6 + 0x7C200400, // 0007 CALL R8 2 + 0x7C140600, // 0008 CALL R5 3 + 0x7C0C0400, // 0009 CALL R3 2 + 0x80000000, // 000A RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: set_onoff +********************************************************************/ +be_local_closure(Matter_Plugin_Bridge_Light0_set_onoff, /* name */ + be_nested_proto( + 7, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 6]) { /* constants */ + /* K0 */ be_nested_str_weak(call_remote_sync), + /* K1 */ be_nested_str_weak(Power), + /* K2 */ be_nested_str_weak(tasmota_relay_index), + /* K3 */ be_nested_str_weak(1), + /* K4 */ be_nested_str_weak(0), + /* K5 */ be_nested_str_weak(parse_update), + }), + be_str_weak(set_onoff), + &be_const_str_solidified, + ( &(const binstruction[18]) { /* code */ + 0x8C080100, // 0000 GETMET R2 R0 K0 + 0x60100008, // 0001 GETGBL R4 G8 + 0x88140102, // 0002 GETMBR R5 R0 K2 + 0x7C100200, // 0003 CALL R4 1 + 0x00120204, // 0004 ADD R4 K1 R4 + 0x78060001, // 0005 JMPF R1 #0008 + 0x58140003, // 0006 LDCONST R5 K3 + 0x70020000, // 0007 JMP #0009 + 0x58140004, // 0008 LDCONST R5 K4 + 0x7C080600, // 0009 CALL R2 3 + 0x4C0C0000, // 000A LDNIL R3 + 0x200C0403, // 000B NE R3 R2 R3 + 0x780E0003, // 000C JMPF R3 #0011 + 0x8C0C0105, // 000D GETMET R3 R0 K5 + 0x5C140400, // 000E MOVE R5 R2 + 0x541A000A, // 000F LDINT R6 11 + 0x7C0C0600, // 0010 CALL R3 3 + 0x80000000, // 0011 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: +********************************************************************/ +be_local_closure(Matter_Plugin_Bridge_Light0__X3Clambda_X3E, /* name */ + be_nested_proto( + 3, /* nstack */ + 1, /* argc */ + 0, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 0, /* has constants */ + NULL, /* no const */ + be_str_weak(_X3Clambda_X3E), + &be_const_str_solidified, + ( &(const binstruction[ 4]) { /* code */ + 0x60040009, // 0000 GETGBL R1 G9 + 0x5C080000, // 0001 MOVE R2 R0 + 0x7C040200, // 0002 CALL R1 1 + 0x80040200, // 0003 RET 1 R1 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: invoke_request +********************************************************************/ +be_local_closure(Matter_Plugin_Bridge_Light0_invoke_request, /* name */ + be_nested_proto( + 10, /* nstack */ + 4, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[10]) { /* constants */ + /* K0 */ be_nested_str_weak(matter), + /* K1 */ be_nested_str_weak(TLV), + /* K2 */ be_nested_str_weak(cluster), + /* K3 */ be_nested_str_weak(command), + /* K4 */ be_nested_str_weak(update_shadow_lazy), + /* K5 */ be_const_int(0), + /* K6 */ be_nested_str_weak(set_onoff), + /* K7 */ be_const_int(1), + /* K8 */ be_const_int(2), + /* K9 */ be_nested_str_weak(shadow_onoff), + }), + be_str_weak(invoke_request), + &be_const_str_solidified, + ( &(const binstruction[36]) { /* code */ + 0xB8120000, // 0000 GETNGBL R4 K0 + 0x88100901, // 0001 GETMBR R4 R4 K1 + 0x88140702, // 0002 GETMBR R5 R3 K2 + 0x88180703, // 0003 GETMBR R6 R3 K3 + 0x541E0005, // 0004 LDINT R7 6 + 0x1C1C0A07, // 0005 EQ R7 R5 R7 + 0x781E001B, // 0006 JMPF R7 #0023 + 0x8C1C0104, // 0007 GETMET R7 R0 K4 + 0x7C1C0200, // 0008 CALL R7 1 + 0x1C1C0D05, // 0009 EQ R7 R6 K5 + 0x781E0005, // 000A JMPF R7 #0011 + 0x8C1C0106, // 000B GETMET R7 R0 K6 + 0x50240000, // 000C LDBOOL R9 0 0 + 0x7C1C0400, // 000D CALL R7 2 + 0x501C0200, // 000E LDBOOL R7 1 0 + 0x80040E00, // 000F RET 1 R7 + 0x70020011, // 0010 JMP #0023 + 0x1C1C0D07, // 0011 EQ R7 R6 K7 + 0x781E0005, // 0012 JMPF R7 #0019 + 0x8C1C0106, // 0013 GETMET R7 R0 K6 + 0x50240200, // 0014 LDBOOL R9 1 0 + 0x7C1C0400, // 0015 CALL R7 2 + 0x501C0200, // 0016 LDBOOL R7 1 0 + 0x80040E00, // 0017 RET 1 R7 + 0x70020009, // 0018 JMP #0023 + 0x1C1C0D08, // 0019 EQ R7 R6 K8 + 0x781E0007, // 001A JMPF R7 #0023 + 0x8C1C0106, // 001B GETMET R7 R0 K6 + 0x88240109, // 001C GETMBR R9 R0 K9 + 0x78260000, // 001D JMPF R9 #001F + 0x50240001, // 001E LDBOOL R9 0 1 + 0x50240200, // 001F LDBOOL R9 1 0 + 0x7C1C0400, // 0020 CALL R7 2 + 0x501C0200, // 0021 LDBOOL R7 1 0 + 0x80040E00, // 0022 RET 1 R7 + 0x80000000, // 0023 RET 0 + }) + ) +); +/*******************************************************************/ + + /******************************************************************** ** Solidified function: read_attribute ********************************************************************/ @@ -87,320 +401,6 @@ be_local_closure(Matter_Plugin_Bridge_Light0_read_attribute, /* name */ /*******************************************************************/ -/******************************************************************** -** Solidified function: -********************************************************************/ -be_local_closure(Matter_Plugin_Bridge_Light0__X3Clambda_X3E, /* name */ - be_nested_proto( - 3, /* nstack */ - 1, /* argc */ - 0, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 0, /* has constants */ - NULL, /* no const */ - be_str_weak(_X3Clambda_X3E), - &be_const_str_solidified, - ( &(const binstruction[ 4]) { /* code */ - 0x60040009, // 0000 GETGBL R1 G9 - 0x5C080000, // 0001 MOVE R2 R0 - 0x7C040200, // 0002 CALL R1 1 - 0x80040200, // 0003 RET 1 R1 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: web_values -********************************************************************/ -be_local_closure(Matter_Plugin_Bridge_Light0_web_values, /* name */ - be_nested_proto( - 11, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 7]) { /* constants */ - /* K0 */ be_nested_str_weak(webserver), - /* K1 */ be_nested_str_weak(string), - /* K2 */ be_nested_str_weak(content_send), - /* K3 */ be_nested_str_weak(format), - /* K4 */ be_nested_str_weak(_X7C_X20Light_X20_X25s), - /* K5 */ be_nested_str_weak(web_value_onoff), - /* K6 */ be_nested_str_weak(shadow_onoff), - }), - be_str_weak(web_values), - &be_const_str_solidified, - ( &(const binstruction[11]) { /* code */ - 0xA4060000, // 0000 IMPORT R1 K0 - 0xA40A0200, // 0001 IMPORT R2 K1 - 0x8C0C0302, // 0002 GETMET R3 R1 K2 - 0x8C140503, // 0003 GETMET R5 R2 K3 - 0x581C0004, // 0004 LDCONST R7 K4 - 0x8C200105, // 0005 GETMET R8 R0 K5 - 0x88280106, // 0006 GETMBR R10 R0 K6 - 0x7C200400, // 0007 CALL R8 2 - 0x7C140600, // 0008 CALL R5 3 - 0x7C0C0400, // 0009 CALL R3 2 - 0x80000000, // 000A RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: init -********************************************************************/ -be_local_closure(Matter_Plugin_Bridge_Light0_init, /* name */ - be_nested_proto( - 9, /* nstack */ - 4, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 7]) { /* constants */ - /* K0 */ be_nested_str_weak(init), - /* K1 */ be_nested_str_weak(shadow_onoff), - /* K2 */ be_nested_str_weak(tasmota_relay_index), - /* K3 */ be_nested_str_weak(find), - /* K4 */ be_nested_str_weak(ARG), - /* K5 */ be_const_int(1), - /* K6 */ be_const_int(0), - }), - be_str_weak(init), - &be_const_str_solidified, - ( &(const binstruction[22]) { /* code */ - 0x60100003, // 0000 GETGBL R4 G3 - 0x5C140000, // 0001 MOVE R5 R0 - 0x7C100200, // 0002 CALL R4 1 - 0x8C100900, // 0003 GETMET R4 R4 K0 - 0x5C180200, // 0004 MOVE R6 R1 - 0x5C1C0400, // 0005 MOVE R7 R2 - 0x5C200600, // 0006 MOVE R8 R3 - 0x7C100800, // 0007 CALL R4 4 - 0x50100000, // 0008 LDBOOL R4 0 0 - 0x90020204, // 0009 SETMBR R0 K1 R4 - 0x60100009, // 000A GETGBL R4 G9 - 0x8C140703, // 000B GETMET R5 R3 K3 - 0x881C0104, // 000C GETMBR R7 R0 K4 - 0x58200005, // 000D LDCONST R8 K5 - 0x7C140600, // 000E CALL R5 3 - 0x7C100200, // 000F CALL R4 1 - 0x90020404, // 0010 SETMBR R0 K2 R4 - 0x88100102, // 0011 GETMBR R4 R0 K2 - 0x18100906, // 0012 LE R4 R4 K6 - 0x78120000, // 0013 JMPF R4 #0015 - 0x90020505, // 0014 SETMBR R0 K2 K5 - 0x80000000, // 0015 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: set_onoff -********************************************************************/ -be_local_closure(Matter_Plugin_Bridge_Light0_set_onoff, /* name */ - be_nested_proto( - 7, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 6]) { /* constants */ - /* K0 */ be_nested_str_weak(call_remote_sync), - /* K1 */ be_nested_str_weak(Power), - /* K2 */ be_nested_str_weak(tasmota_relay_index), - /* K3 */ be_nested_str_weak(1), - /* K4 */ be_nested_str_weak(0), - /* K5 */ be_nested_str_weak(parse_update), - }), - be_str_weak(set_onoff), - &be_const_str_solidified, - ( &(const binstruction[18]) { /* code */ - 0x8C080100, // 0000 GETMET R2 R0 K0 - 0x60100008, // 0001 GETGBL R4 G8 - 0x88140102, // 0002 GETMBR R5 R0 K2 - 0x7C100200, // 0003 CALL R4 1 - 0x00120204, // 0004 ADD R4 K1 R4 - 0x78060001, // 0005 JMPF R1 #0008 - 0x58140003, // 0006 LDCONST R5 K3 - 0x70020000, // 0007 JMP #0009 - 0x58140004, // 0008 LDCONST R5 K4 - 0x7C080600, // 0009 CALL R2 3 - 0x4C0C0000, // 000A LDNIL R3 - 0x200C0403, // 000B NE R3 R2 R3 - 0x780E0003, // 000C JMPF R3 #0011 - 0x8C0C0105, // 000D GETMET R3 R0 K5 - 0x5C140400, // 000E MOVE R5 R2 - 0x541A000A, // 000F LDINT R6 11 - 0x7C0C0600, // 0010 CALL R3 3 - 0x80000000, // 0011 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: invoke_request -********************************************************************/ -be_local_closure(Matter_Plugin_Bridge_Light0_invoke_request, /* name */ - be_nested_proto( - 10, /* nstack */ - 4, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[10]) { /* constants */ - /* K0 */ be_nested_str_weak(matter), - /* K1 */ be_nested_str_weak(TLV), - /* K2 */ be_nested_str_weak(cluster), - /* K3 */ be_nested_str_weak(command), - /* K4 */ be_nested_str_weak(update_shadow_lazy), - /* K5 */ be_const_int(0), - /* K6 */ be_nested_str_weak(set_onoff), - /* K7 */ be_const_int(1), - /* K8 */ be_const_int(2), - /* K9 */ be_nested_str_weak(shadow_onoff), - }), - be_str_weak(invoke_request), - &be_const_str_solidified, - ( &(const binstruction[36]) { /* code */ - 0xB8120000, // 0000 GETNGBL R4 K0 - 0x88100901, // 0001 GETMBR R4 R4 K1 - 0x88140702, // 0002 GETMBR R5 R3 K2 - 0x88180703, // 0003 GETMBR R6 R3 K3 - 0x541E0005, // 0004 LDINT R7 6 - 0x1C1C0A07, // 0005 EQ R7 R5 R7 - 0x781E001B, // 0006 JMPF R7 #0023 - 0x8C1C0104, // 0007 GETMET R7 R0 K4 - 0x7C1C0200, // 0008 CALL R7 1 - 0x1C1C0D05, // 0009 EQ R7 R6 K5 - 0x781E0005, // 000A JMPF R7 #0011 - 0x8C1C0106, // 000B GETMET R7 R0 K6 - 0x50240000, // 000C LDBOOL R9 0 0 - 0x7C1C0400, // 000D CALL R7 2 - 0x501C0200, // 000E LDBOOL R7 1 0 - 0x80040E00, // 000F RET 1 R7 - 0x70020011, // 0010 JMP #0023 - 0x1C1C0D07, // 0011 EQ R7 R6 K7 - 0x781E0005, // 0012 JMPF R7 #0019 - 0x8C1C0106, // 0013 GETMET R7 R0 K6 - 0x50240200, // 0014 LDBOOL R9 1 0 - 0x7C1C0400, // 0015 CALL R7 2 - 0x501C0200, // 0016 LDBOOL R7 1 0 - 0x80040E00, // 0017 RET 1 R7 - 0x70020009, // 0018 JMP #0023 - 0x1C1C0D08, // 0019 EQ R7 R6 K8 - 0x781E0007, // 001A JMPF R7 #0023 - 0x8C1C0106, // 001B GETMET R7 R0 K6 - 0x88240109, // 001C GETMBR R9 R0 K9 - 0x78260000, // 001D JMPF R9 #001F - 0x50240001, // 001E LDBOOL R9 0 1 - 0x50240200, // 001F LDBOOL R9 1 0 - 0x7C1C0400, // 0020 CALL R7 2 - 0x501C0200, // 0021 LDBOOL R7 1 0 - 0x80040E00, // 0022 RET 1 R7 - 0x80000000, // 0023 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: parse_update -********************************************************************/ -be_local_closure(Matter_Plugin_Bridge_Light0_parse_update, /* name */ - be_nested_proto( - 8, /* nstack */ - 3, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 9]) { /* constants */ - /* K0 */ be_nested_str_weak(tasmota_relay_index), - /* K1 */ be_const_int(1), - /* K2 */ be_nested_str_weak(contains), - /* K3 */ be_nested_str_weak(POWER), - /* K4 */ be_nested_str_weak(find), - /* K5 */ be_nested_str_weak(ON), - /* K6 */ be_nested_str_weak(shadow_onoff), - /* K7 */ be_nested_str_weak(attribute_updated), - /* K8 */ be_const_int(0), - }), - be_str_weak(parse_update), - &be_const_str_solidified, - ( &(const binstruction[41]) { /* code */ - 0x540E000A, // 0000 LDINT R3 11 - 0x1C0C0403, // 0001 EQ R3 R2 R3 - 0x780E0024, // 0002 JMPF R3 #0028 - 0x500C0000, // 0003 LDBOOL R3 0 0 - 0x88100100, // 0004 GETMBR R4 R0 K0 - 0x1C100901, // 0005 EQ R4 R4 K1 - 0x78120009, // 0006 JMPF R4 #0011 - 0x8C100302, // 0007 GETMET R4 R1 K2 - 0x58180003, // 0008 LDCONST R6 K3 - 0x7C100400, // 0009 CALL R4 2 - 0x78120005, // 000A JMPF R4 #0011 - 0x8C100304, // 000B GETMET R4 R1 K4 - 0x58180003, // 000C LDCONST R6 K3 - 0x7C100400, // 000D CALL R4 2 - 0x1C100905, // 000E EQ R4 R4 K5 - 0x5C0C0800, // 000F MOVE R3 R4 - 0x70020007, // 0010 JMP #0019 - 0x8C100304, // 0011 GETMET R4 R1 K4 - 0x60180008, // 0012 GETGBL R6 G8 - 0x881C0100, // 0013 GETMBR R7 R0 K0 - 0x7C180200, // 0014 CALL R6 1 - 0x001A0606, // 0015 ADD R6 K3 R6 - 0x7C100400, // 0016 CALL R4 2 - 0x1C100905, // 0017 EQ R4 R4 K5 - 0x5C0C0800, // 0018 MOVE R3 R4 - 0x88100106, // 0019 GETMBR R4 R0 K6 - 0x4C140000, // 001A LDNIL R5 - 0x20100805, // 001B NE R4 R4 R5 - 0x78120009, // 001C JMPF R4 #0027 - 0x88100106, // 001D GETMBR R4 R0 K6 - 0x60140017, // 001E GETGBL R5 G23 - 0x5C180600, // 001F MOVE R6 R3 - 0x7C140200, // 0020 CALL R5 1 - 0x20100805, // 0021 NE R4 R4 R5 - 0x78120003, // 0022 JMPF R4 #0027 - 0x8C100107, // 0023 GETMET R4 R0 K7 - 0x541A0005, // 0024 LDINT R6 6 - 0x581C0008, // 0025 LDCONST R7 K8 - 0x7C100600, // 0026 CALL R4 3 - 0x90020C03, // 0027 SETMBR R0 K6 R3 - 0x80000000, // 0028 RET 0 - }) - ) -); -/*******************************************************************/ - - /******************************************************************** ** Solidified class: Matter_Plugin_Bridge_Light0 ********************************************************************/ @@ -408,23 +408,26 @@ extern const bclass be_class_Matter_Plugin_Bridge_HTTP; be_local_class(Matter_Plugin_Bridge_Light0, 2, &be_class_Matter_Plugin_Bridge_HTTP, - be_nested_map(14, + be_nested_map(15, ( (struct bmapnode*) &(const bmapnode[]) { - { be_const_key_weak(read_attribute, 11), be_const_closure(Matter_Plugin_Bridge_Light0_read_attribute_closure) }, + { be_const_key_weak(init, 11), be_const_closure(Matter_Plugin_Bridge_Light0_init_closure) }, + { be_const_key_weak(parse_update, -1), be_const_closure(Matter_Plugin_Bridge_Light0_parse_update_closure) }, + { be_const_key_weak(web_values, 10), be_const_closure(Matter_Plugin_Bridge_Light0_web_values_closure) }, + { be_const_key_weak(set_onoff, -1), be_const_closure(Matter_Plugin_Bridge_Light0_set_onoff_closure) }, + { be_const_key_weak(ARG_TYPE, 8), be_const_static_closure(Matter_Plugin_Bridge_Light0__X3Clambda_X3E_closure) }, + { be_const_key_weak(tasmota_relay_index, 7), be_const_var(0) }, { be_const_key_weak(ARG, -1), be_nested_str_weak(relay) }, - { be_const_key_weak(ARG_TYPE, 12), be_const_static_closure(Matter_Plugin_Bridge_Light0__X3Clambda_X3E_closure) }, - { be_const_key_weak(TYPE, -1), be_nested_str_weak(http_light0) }, - { be_const_key_weak(web_values, -1), be_const_closure(Matter_Plugin_Bridge_Light0_web_values_closure) }, - { be_const_key_weak(init, -1), be_const_closure(Matter_Plugin_Bridge_Light0_init_closure) }, - { be_const_key_weak(set_onoff, 13), be_const_closure(Matter_Plugin_Bridge_Light0_set_onoff_closure) }, - { be_const_key_weak(invoke_request, -1), be_const_closure(Matter_Plugin_Bridge_Light0_invoke_request_closure) }, - { be_const_key_weak(NAME, -1), be_nested_str_weak(Light_X200_X20On) }, - { be_const_key_weak(tasmota_relay_index, -1), be_const_var(0) }, { be_const_key_weak(TYPES, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { be_const_map( * be_nested_map(1, ( (struct bmapnode*) &(const bmapnode[]) { { be_const_key_int(256, -1), be_const_int(2) }, })) ) } )) }, + { be_const_key_weak(TYPE, 14), be_nested_str_weak(http_light0) }, + { be_const_key_weak(NAME, 6), be_nested_str_weak(Light_X200_X20On) }, + { be_const_key_weak(invoke_request, -1), be_const_closure(Matter_Plugin_Bridge_Light0_invoke_request_closure) }, + { be_const_key_weak(ARG_HINT, -1), be_nested_str_weak(Enter_X20Power_X3Cx_X3E_X20number) }, + { be_const_key_weak(read_attribute, -1), be_const_closure(Matter_Plugin_Bridge_Light0_read_attribute_closure) }, + { be_const_key_weak(shadow_onoff, -1), be_const_var(1) }, { be_const_key_weak(CLUSTERS, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { be_const_map( * be_nested_map(1, ( (struct bmapnode*) &(const bmapnode[]) { @@ -436,8 +439,6 @@ be_local_class(Matter_Plugin_Bridge_Light0, be_const_int(65533), })) ) } )) }, })) ) } )) }, - { be_const_key_weak(parse_update, -1), be_const_closure(Matter_Plugin_Bridge_Light0_parse_update_closure) }, - { be_const_key_weak(shadow_onoff, -1), be_const_var(1) }, })), be_str_weak(Matter_Plugin_Bridge_Light0) ); diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_OnOff.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_OnOff.h index c9b570e5b..4599435a9 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_OnOff.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_OnOff.h @@ -57,16 +57,17 @@ extern const bclass be_class_Matter_Plugin_Bridge_Light0; be_local_class(Matter_Plugin_Bridge_OnOff, 0, &be_class_Matter_Plugin_Bridge_Light0, - be_nested_map(4, + be_nested_map(5, ( (struct bmapnode*) &(const bmapnode[]) { - { be_const_key_weak(web_values, -1), be_const_closure(Matter_Plugin_Bridge_OnOff_web_values_closure) }, - { be_const_key_weak(TYPE, -1), be_nested_str_weak(http_relay) }, - { be_const_key_weak(NAME, 3), be_nested_str_weak(Relay) }, - { be_const_key_weak(TYPES, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { + { be_const_key_weak(TYPES, 3), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { be_const_map( * be_nested_map(1, ( (struct bmapnode*) &(const bmapnode[]) { { be_const_key_int(266, -1), be_const_int(2) }, })) ) } )) }, + { be_const_key_weak(NAME, -1), be_nested_str_weak(Relay) }, + { be_const_key_weak(web_values, -1), be_const_closure(Matter_Plugin_Bridge_OnOff_web_values_closure) }, + { be_const_key_weak(ARG_HINT, -1), be_nested_str_weak(Enter_X20Relay_X3Cx_X3E_X20number) }, + { be_const_key_weak(TYPE, 1), be_nested_str_weak(http_relay) }, })), be_str_weak(Matter_Plugin_Bridge_OnOff) ); diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Sensor.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Sensor.h index c8e26217a..039eb69ed 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Sensor.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Sensor.h @@ -6,119 +6,6 @@ extern const bclass be_class_Matter_Plugin_Bridge_Sensor; -/******************************************************************** -** Solidified function: pre_value -********************************************************************/ -be_local_closure(Matter_Plugin_Bridge_Sensor_pre_value, /* name */ - be_nested_proto( - 2, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 0, /* has constants */ - NULL, /* no const */ - be_str_weak(pre_value), - &be_const_str_solidified, - ( &(const binstruction[ 1]) { /* code */ - 0x80040200, // 0000 RET 1 R1 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: filter_name_html -********************************************************************/ -be_local_closure(Matter_Plugin_Bridge_Sensor_filter_name_html, /* name */ - be_nested_proto( - 9, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 8]) { /* constants */ - /* K0 */ be_nested_str_weak(tasmota_sensor_filter), - /* K1 */ be_nested_str_weak(string), - /* K2 */ be_nested_str_weak(webserver), - /* K3 */ be_nested_str_weak(html_escape), - /* K4 */ be_nested_str_weak(split), - /* K5 */ be_nested_str_weak(_X23), - /* K6 */ be_const_int(0), - /* K7 */ be_nested_str_weak(), - }), - be_str_weak(filter_name_html), - &be_const_str_solidified, - ( &(const binstruction[13]) { /* code */ - 0x88040100, // 0000 GETMBR R1 R0 K0 - 0x78060009, // 0001 JMPF R1 #000C - 0xA4060200, // 0002 IMPORT R1 K1 - 0xA40A0400, // 0003 IMPORT R2 K2 - 0x8C0C0503, // 0004 GETMET R3 R2 K3 - 0x8C140304, // 0005 GETMET R5 R1 K4 - 0x881C0100, // 0006 GETMBR R7 R0 K0 - 0x58200005, // 0007 LDCONST R8 K5 - 0x7C140600, // 0008 CALL R5 3 - 0x94140B06, // 0009 GETIDX R5 R5 K6 - 0x7C0C0400, // 000A CALL R3 2 - 0x80040600, // 000B RET 1 R3 - 0x80060E00, // 000C RET 1 K7 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: parse_configuration -********************************************************************/ -be_local_closure(Matter_Plugin_Bridge_Sensor_parse_configuration, /* name */ - be_nested_proto( - 5, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 7]) { /* constants */ - /* K0 */ be_nested_str_weak(tasmota_sensor_filter), - /* K1 */ be_nested_str_weak(find), - /* K2 */ be_nested_str_weak(ARG), - /* K3 */ be_nested_str_weak(tasmota_sensor_matcher), - /* K4 */ be_nested_str_weak(tasmota), - /* K5 */ be_nested_str_weak(Rule_Matcher), - /* K6 */ be_nested_str_weak(parse), - }), - be_str_weak(parse_configuration), - &be_const_str_solidified, - ( &(const binstruction[13]) { /* code */ - 0x8C080301, // 0000 GETMET R2 R1 K1 - 0x88100102, // 0001 GETMBR R4 R0 K2 - 0x7C080400, // 0002 CALL R2 2 - 0x90020002, // 0003 SETMBR R0 K0 R2 - 0x88080100, // 0004 GETMBR R2 R0 K0 - 0x780A0005, // 0005 JMPF R2 #000C - 0xB80A0800, // 0006 GETNGBL R2 K4 - 0x88080505, // 0007 GETMBR R2 R2 K5 - 0x8C080506, // 0008 GETMET R2 R2 K6 - 0x88100100, // 0009 GETMBR R4 R0 K0 - 0x7C080400, // 000A CALL R2 2 - 0x90020602, // 000B SETMBR R0 K3 R2 - 0x80000000, // 000C RET 0 - }) - ) -); -/*******************************************************************/ - - /******************************************************************** ** Solidified function: parse_update ********************************************************************/ @@ -172,6 +59,51 @@ be_local_closure(Matter_Plugin_Bridge_Sensor_parse_update, /* name */ /*******************************************************************/ +/******************************************************************** +** Solidified function: filter_name_html +********************************************************************/ +be_local_closure(Matter_Plugin_Bridge_Sensor_filter_name_html, /* name */ + be_nested_proto( + 9, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 8]) { /* constants */ + /* K0 */ be_nested_str_weak(tasmota_sensor_filter), + /* K1 */ be_nested_str_weak(string), + /* K2 */ be_nested_str_weak(webserver), + /* K3 */ be_nested_str_weak(html_escape), + /* K4 */ be_nested_str_weak(split), + /* K5 */ be_nested_str_weak(_X23), + /* K6 */ be_const_int(0), + /* K7 */ be_nested_str_weak(), + }), + be_str_weak(filter_name_html), + &be_const_str_solidified, + ( &(const binstruction[13]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x78060009, // 0001 JMPF R1 #000C + 0xA4060200, // 0002 IMPORT R1 K1 + 0xA40A0400, // 0003 IMPORT R2 K2 + 0x8C0C0503, // 0004 GETMET R3 R2 K3 + 0x8C140304, // 0005 GETMET R5 R1 K4 + 0x881C0100, // 0006 GETMBR R7 R0 K0 + 0x58200005, // 0007 LDCONST R8 K5 + 0x7C140600, // 0008 CALL R5 3 + 0x94140B06, // 0009 GETIDX R5 R5 K6 + 0x7C0C0400, // 000A CALL R3 2 + 0x80040600, // 000B RET 1 R3 + 0x80060E00, // 000C RET 1 K7 + }) + ) +); +/*******************************************************************/ + + /******************************************************************** ** Solidified function: value_changed ********************************************************************/ @@ -196,6 +128,74 @@ be_local_closure(Matter_Plugin_Bridge_Sensor_value_changed, /* name */ /*******************************************************************/ +/******************************************************************** +** Solidified function: pre_value +********************************************************************/ +be_local_closure(Matter_Plugin_Bridge_Sensor_pre_value, /* name */ + be_nested_proto( + 2, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 0, /* has constants */ + NULL, /* no const */ + be_str_weak(pre_value), + &be_const_str_solidified, + ( &(const binstruction[ 1]) { /* code */ + 0x80040200, // 0000 RET 1 R1 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: parse_configuration +********************************************************************/ +be_local_closure(Matter_Plugin_Bridge_Sensor_parse_configuration, /* name */ + be_nested_proto( + 5, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 7]) { /* constants */ + /* K0 */ be_nested_str_weak(tasmota_sensor_filter), + /* K1 */ be_nested_str_weak(find), + /* K2 */ be_nested_str_weak(ARG), + /* K3 */ be_nested_str_weak(tasmota_sensor_matcher), + /* K4 */ be_nested_str_weak(tasmota), + /* K5 */ be_nested_str_weak(Rule_Matcher), + /* K6 */ be_nested_str_weak(parse), + }), + be_str_weak(parse_configuration), + &be_const_str_solidified, + ( &(const binstruction[13]) { /* code */ + 0x8C080301, // 0000 GETMET R2 R1 K1 + 0x88100102, // 0001 GETMBR R4 R0 K2 + 0x7C080400, // 0002 CALL R2 2 + 0x90020002, // 0003 SETMBR R0 K0 R2 + 0x88080100, // 0004 GETMBR R2 R0 K0 + 0x780A0005, // 0005 JMPF R2 #000C + 0xB80A0800, // 0006 GETNGBL R2 K4 + 0x88080505, // 0007 GETMBR R2 R2 K5 + 0x8C080506, // 0008 GETMET R2 R2 K6 + 0x88100100, // 0009 GETMBR R4 R0 K0 + 0x7C080400, // 000A CALL R2 2 + 0x90020602, // 000B SETMBR R0 K3 R2 + 0x80000000, // 000C RET 0 + }) + ) +); +/*******************************************************************/ + + /******************************************************************** ** Solidified class: Matter_Plugin_Bridge_Sensor ********************************************************************/ @@ -203,21 +203,22 @@ extern const bclass be_class_Matter_Plugin_Bridge_HTTP; be_local_class(Matter_Plugin_Bridge_Sensor, 3, &be_class_Matter_Plugin_Bridge_HTTP, - be_nested_map(13, + be_nested_map(14, ( (struct bmapnode*) &(const bmapnode[]) { - { be_const_key_weak(ARG, 1), be_nested_str_weak(filter) }, - { be_const_key_weak(value_changed, -1), be_const_closure(Matter_Plugin_Bridge_Sensor_value_changed_closure) }, - { be_const_key_weak(UPDATE_TIME, -1), be_const_int(5000) }, - { be_const_key_weak(pre_value, 12), be_const_closure(Matter_Plugin_Bridge_Sensor_pre_value_closure) }, - { be_const_key_weak(tasmota_sensor_matcher, -1), be_const_var(1) }, - { be_const_key_weak(PROBE_TIMEOUT, -1), be_const_int(1700) }, + { be_const_key_weak(UPDATE_CMD, -1), be_nested_str_weak(Status_X208) }, + { be_const_key_weak(ARG, -1), be_nested_str_weak(filter) }, + { be_const_key_weak(parse_update, 10), be_const_closure(Matter_Plugin_Bridge_Sensor_parse_update_closure) }, { be_const_key_weak(filter_name_html, -1), be_const_closure(Matter_Plugin_Bridge_Sensor_filter_name_html_closure) }, - { be_const_key_weak(parse_configuration, -1), be_const_closure(Matter_Plugin_Bridge_Sensor_parse_configuration_closure) }, - { be_const_key_weak(shadow_value, -1), be_const_var(2) }, - { be_const_key_weak(parse_update, -1), be_const_closure(Matter_Plugin_Bridge_Sensor_parse_update_closure) }, - { be_const_key_weak(UPDATE_CMD, 8), be_nested_str_weak(Status_X208) }, - { be_const_key_weak(ARG_HTTP, 2), be_nested_str_weak(url) }, { be_const_key_weak(tasmota_sensor_filter, -1), be_const_var(0) }, + { be_const_key_weak(value_changed, 0), be_const_closure(Matter_Plugin_Bridge_Sensor_value_changed_closure) }, + { be_const_key_weak(tasmota_sensor_matcher, -1), be_const_var(1) }, + { be_const_key_weak(parse_configuration, -1), be_const_closure(Matter_Plugin_Bridge_Sensor_parse_configuration_closure) }, + { be_const_key_weak(pre_value, -1), be_const_closure(Matter_Plugin_Bridge_Sensor_pre_value_closure) }, + { be_const_key_weak(ARG_HINT, 7), be_nested_str_weak(Enter_X20Filter_X20pattern) }, + { be_const_key_weak(UPDATE_TIME, -1), be_const_int(5000) }, + { be_const_key_weak(shadow_value, 9), be_const_var(2) }, + { be_const_key_weak(ARG_HTTP, -1), be_nested_str_weak(url) }, + { be_const_key_weak(PROBE_TIMEOUT, -1), be_const_int(1700) }, })), be_str_weak(Matter_Plugin_Bridge_Sensor) ); diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Sensor_Occupancy.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Sensor_Occupancy.h index 56978494b..79b92713a 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Sensor_Occupancy.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Sensor_Occupancy.h @@ -6,6 +6,65 @@ extern const bclass be_class_Matter_Plugin_Bridge_Sensor_Occupancy; +/******************************************************************** +** Solidified function: parse_update +********************************************************************/ +be_local_closure(Matter_Plugin_Bridge_Sensor_Occupancy_parse_update, /* name */ + be_nested_proto( + 8, /* nstack */ + 3, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 7]) { /* constants */ + /* K0 */ be_nested_str_weak(find), + /* K1 */ be_nested_str_weak(Switch), + /* K2 */ be_nested_str_weak(tasmota_switch_index), + /* K3 */ be_nested_str_weak(ON), + /* K4 */ be_nested_str_weak(shadow_occupancy), + /* K5 */ be_nested_str_weak(attribute_updated), + /* K6 */ be_const_int(0), + }), + be_str_weak(parse_update), + &be_const_str_solidified, + ( &(const binstruction[28]) { /* code */ + 0x540E0007, // 0000 LDINT R3 8 + 0x1C0C0403, // 0001 EQ R3 R2 R3 + 0x780E0017, // 0002 JMPF R3 #001B + 0x500C0000, // 0003 LDBOOL R3 0 0 + 0x8C100300, // 0004 GETMET R4 R1 K0 + 0x60180008, // 0005 GETGBL R6 G8 + 0x881C0102, // 0006 GETMBR R7 R0 K2 + 0x7C180200, // 0007 CALL R6 1 + 0x001A0206, // 0008 ADD R6 K1 R6 + 0x7C100400, // 0009 CALL R4 2 + 0x1C100903, // 000A EQ R4 R4 K3 + 0x5C0C0800, // 000B MOVE R3 R4 + 0x88100104, // 000C GETMBR R4 R0 K4 + 0x4C140000, // 000D LDNIL R5 + 0x20100805, // 000E NE R4 R4 R5 + 0x78120009, // 000F JMPF R4 #001A + 0x88100104, // 0010 GETMBR R4 R0 K4 + 0x60140017, // 0011 GETGBL R5 G23 + 0x5C180600, // 0012 MOVE R6 R3 + 0x7C140200, // 0013 CALL R5 1 + 0x20100805, // 0014 NE R4 R4 R5 + 0x78120003, // 0015 JMPF R4 #001A + 0x8C100105, // 0016 GETMET R4 R0 K5 + 0x541A0405, // 0017 LDINT R6 1030 + 0x581C0006, // 0018 LDCONST R7 K6 + 0x7C100600, // 0019 CALL R4 3 + 0x90020803, // 001A SETMBR R0 K4 R3 + 0x80000000, // 001B RET 0 + }) + ) +); +/*******************************************************************/ + + /******************************************************************** ** Solidified function: web_values ********************************************************************/ @@ -50,6 +109,33 @@ be_local_closure(Matter_Plugin_Bridge_Sensor_Occupancy_web_values, /* name */ /*******************************************************************/ +/******************************************************************** +** Solidified function: +********************************************************************/ +be_local_closure(Matter_Plugin_Bridge_Sensor_Occupancy__X3Clambda_X3E, /* name */ + be_nested_proto( + 3, /* nstack */ + 1, /* argc */ + 0, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 0, /* has constants */ + NULL, /* no const */ + be_str_weak(_X3Clambda_X3E), + &be_const_str_solidified, + ( &(const binstruction[ 4]) { /* code */ + 0x60040009, // 0000 GETGBL R1 G9 + 0x5C080000, // 0001 MOVE R2 R0 + 0x7C040200, // 0002 CALL R1 1 + 0x80040200, // 0003 RET 1 R1 + }) + ) +); +/*******************************************************************/ + + /******************************************************************** ** Solidified function: read_attribute ********************************************************************/ @@ -158,92 +244,6 @@ be_local_closure(Matter_Plugin_Bridge_Sensor_Occupancy_read_attribute, /* name /*******************************************************************/ -/******************************************************************** -** Solidified function: parse_update -********************************************************************/ -be_local_closure(Matter_Plugin_Bridge_Sensor_Occupancy_parse_update, /* name */ - be_nested_proto( - 8, /* nstack */ - 3, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 7]) { /* constants */ - /* K0 */ be_nested_str_weak(find), - /* K1 */ be_nested_str_weak(Switch), - /* K2 */ be_nested_str_weak(tasmota_switch_index), - /* K3 */ be_nested_str_weak(ON), - /* K4 */ be_nested_str_weak(shadow_occupancy), - /* K5 */ be_nested_str_weak(attribute_updated), - /* K6 */ be_const_int(0), - }), - be_str_weak(parse_update), - &be_const_str_solidified, - ( &(const binstruction[28]) { /* code */ - 0x540E0007, // 0000 LDINT R3 8 - 0x1C0C0403, // 0001 EQ R3 R2 R3 - 0x780E0017, // 0002 JMPF R3 #001B - 0x500C0000, // 0003 LDBOOL R3 0 0 - 0x8C100300, // 0004 GETMET R4 R1 K0 - 0x60180008, // 0005 GETGBL R6 G8 - 0x881C0102, // 0006 GETMBR R7 R0 K2 - 0x7C180200, // 0007 CALL R6 1 - 0x001A0206, // 0008 ADD R6 K1 R6 - 0x7C100400, // 0009 CALL R4 2 - 0x1C100903, // 000A EQ R4 R4 K3 - 0x5C0C0800, // 000B MOVE R3 R4 - 0x88100104, // 000C GETMBR R4 R0 K4 - 0x4C140000, // 000D LDNIL R5 - 0x20100805, // 000E NE R4 R4 R5 - 0x78120009, // 000F JMPF R4 #001A - 0x88100104, // 0010 GETMBR R4 R0 K4 - 0x60140017, // 0011 GETGBL R5 G23 - 0x5C180600, // 0012 MOVE R6 R3 - 0x7C140200, // 0013 CALL R5 1 - 0x20100805, // 0014 NE R4 R4 R5 - 0x78120003, // 0015 JMPF R4 #001A - 0x8C100105, // 0016 GETMET R4 R0 K5 - 0x541A0405, // 0017 LDINT R6 1030 - 0x581C0006, // 0018 LDCONST R7 K6 - 0x7C100600, // 0019 CALL R4 3 - 0x90020803, // 001A SETMBR R0 K4 R3 - 0x80000000, // 001B RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: -********************************************************************/ -be_local_closure(Matter_Plugin_Bridge_Sensor_Occupancy__X3Clambda_X3E, /* name */ - be_nested_proto( - 3, /* nstack */ - 1, /* argc */ - 0, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 0, /* has constants */ - NULL, /* no const */ - be_str_weak(_X3Clambda_X3E), - &be_const_str_solidified, - ( &(const binstruction[ 4]) { /* code */ - 0x60040009, // 0000 GETGBL R1 G9 - 0x5C080000, // 0001 MOVE R2 R0 - 0x7C040200, // 0002 CALL R1 1 - 0x80040200, // 0003 RET 1 R1 - }) - ) -); -/*******************************************************************/ - - /******************************************************************** ** Solidified function: init ********************************************************************/ @@ -301,9 +301,24 @@ extern const bclass be_class_Matter_Plugin_Bridge_HTTP; be_local_class(Matter_Plugin_Bridge_Sensor_Occupancy, 2, &be_class_Matter_Plugin_Bridge_HTTP, - be_nested_map(14, + be_nested_map(15, ( (struct bmapnode*) &(const bmapnode[]) { - { be_const_key_weak(CLUSTERS, 6), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { + { be_const_key_weak(ARG_HINT, 3), be_nested_str_weak(Enter_X20Switch_X3Cx_X3E_X20number) }, + { be_const_key_weak(parse_update, -1), be_const_closure(Matter_Plugin_Bridge_Sensor_Occupancy_parse_update_closure) }, + { be_const_key_weak(web_values, -1), be_const_closure(Matter_Plugin_Bridge_Sensor_Occupancy_web_values_closure) }, + { be_const_key_weak(init, -1), be_const_closure(Matter_Plugin_Bridge_Sensor_Occupancy_init_closure) }, + { be_const_key_weak(ARG_TYPE, 11), be_const_static_closure(Matter_Plugin_Bridge_Sensor_Occupancy__X3Clambda_X3E_closure) }, + { be_const_key_weak(TYPES, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { + be_const_map( * be_nested_map(1, + ( (struct bmapnode*) &(const bmapnode[]) { + { be_const_key_int(263, -1), be_const_int(2) }, + })) ) } )) }, + { be_const_key_weak(UPDATE_TIME, -1), be_const_int(5000) }, + { be_const_key_weak(tasmota_switch_index, -1), be_const_var(0) }, + { be_const_key_weak(ARG, 13), be_nested_str_weak(switch) }, + { be_const_key_weak(UPDATE_CMD, 8), be_nested_str_weak(Status_X208) }, + { be_const_key_weak(shadow_occupancy, -1), be_const_var(1) }, + { be_const_key_weak(CLUSTERS, 14), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { be_const_map( * be_nested_map(1, ( (struct bmapnode*) &(const bmapnode[]) { { be_const_key_int(1030, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_list, { @@ -316,23 +331,9 @@ be_local_class(Matter_Plugin_Bridge_Sensor_Occupancy, be_const_int(65533), })) ) } )) }, })) ) } )) }, - { be_const_key_weak(ARG, -1), be_nested_str_weak(switch) }, - { be_const_key_weak(UPDATE_TIME, 7), be_const_int(5000) }, - { be_const_key_weak(TYPE, -1), be_nested_str_weak(http_occupancy) }, - { be_const_key_weak(web_values, -1), be_const_closure(Matter_Plugin_Bridge_Sensor_Occupancy_web_values_closure) }, - { be_const_key_weak(UPDATE_CMD, 9), be_nested_str_weak(Status_X208) }, { be_const_key_weak(read_attribute, -1), be_const_closure(Matter_Plugin_Bridge_Sensor_Occupancy_read_attribute_closure) }, - { be_const_key_weak(tasmota_switch_index, 11), be_const_var(0) }, { be_const_key_weak(NAME, -1), be_nested_str_weak(Occupancy) }, - { be_const_key_weak(init, -1), be_const_closure(Matter_Plugin_Bridge_Sensor_Occupancy_init_closure) }, - { be_const_key_weak(TYPES, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { - be_const_map( * be_nested_map(1, - ( (struct bmapnode*) &(const bmapnode[]) { - { be_const_key_int(263, -1), be_const_int(2) }, - })) ) } )) }, - { be_const_key_weak(ARG_TYPE, 12), be_const_static_closure(Matter_Plugin_Bridge_Sensor_Occupancy__X3Clambda_X3E_closure) }, - { be_const_key_weak(parse_update, -1), be_const_closure(Matter_Plugin_Bridge_Sensor_Occupancy_parse_update_closure) }, - { be_const_key_weak(shadow_occupancy, -1), be_const_var(1) }, + { be_const_key_weak(TYPE, -1), be_nested_str_weak(http_occupancy) }, })), be_str_weak(Matter_Plugin_Bridge_Sensor_Occupancy) ); diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_OnOff.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_OnOff.h index 693f354e5..7d4ac79ea 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_OnOff.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_OnOff.h @@ -6,147 +6,6 @@ extern const bclass be_class_Matter_Plugin_OnOff; -/******************************************************************** -** Solidified function: init -********************************************************************/ -be_local_closure(Matter_Plugin_OnOff_init, /* name */ - be_nested_proto( - 9, /* nstack */ - 4, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 2]) { /* constants */ - /* K0 */ be_nested_str_weak(init), - /* K1 */ be_nested_str_weak(shadow_onoff), - }), - be_str_weak(init), - &be_const_str_solidified, - ( &(const binstruction[11]) { /* code */ - 0x60100003, // 0000 GETGBL R4 G3 - 0x5C140000, // 0001 MOVE R5 R0 - 0x7C100200, // 0002 CALL R4 1 - 0x8C100900, // 0003 GETMET R4 R4 K0 - 0x5C180200, // 0004 MOVE R6 R1 - 0x5C1C0400, // 0005 MOVE R7 R2 - 0x5C200600, // 0006 MOVE R8 R3 - 0x7C100800, // 0007 CALL R4 4 - 0x50100000, // 0008 LDBOOL R4 0 0 - 0x90020204, // 0009 SETMBR R0 K1 R4 - 0x80000000, // 000A RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: -********************************************************************/ -be_local_closure(Matter_Plugin_OnOff__X3Clambda_X3E, /* name */ - be_nested_proto( - 3, /* nstack */ - 1, /* argc */ - 0, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 0, /* has constants */ - NULL, /* no const */ - be_str_weak(_X3Clambda_X3E), - &be_const_str_solidified, - ( &(const binstruction[ 4]) { /* code */ - 0x60040009, // 0000 GETGBL R1 G9 - 0x5C080000, // 0001 MOVE R2 R0 - 0x7C040200, // 0002 CALL R1 1 - 0x80040200, // 0003 RET 1 R1 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: invoke_request -********************************************************************/ -be_local_closure(Matter_Plugin_OnOff_invoke_request, /* name */ - be_nested_proto( - 10, /* nstack */ - 4, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[11]) { /* constants */ - /* K0 */ be_nested_str_weak(matter), - /* K1 */ be_nested_str_weak(TLV), - /* K2 */ be_nested_str_weak(cluster), - /* K3 */ be_nested_str_weak(command), - /* K4 */ be_nested_str_weak(update_shadow_lazy), - /* K5 */ be_const_int(0), - /* K6 */ be_nested_str_weak(set_onoff), - /* K7 */ be_nested_str_weak(update_shadow), - /* K8 */ be_const_int(1), - /* K9 */ be_const_int(2), - /* K10 */ be_nested_str_weak(shadow_onoff), - }), - be_str_weak(invoke_request), - &be_const_str_solidified, - ( &(const binstruction[42]) { /* code */ - 0xB8120000, // 0000 GETNGBL R4 K0 - 0x88100901, // 0001 GETMBR R4 R4 K1 - 0x88140702, // 0002 GETMBR R5 R3 K2 - 0x88180703, // 0003 GETMBR R6 R3 K3 - 0x541E0005, // 0004 LDINT R7 6 - 0x1C1C0A07, // 0005 EQ R7 R5 R7 - 0x781E0021, // 0006 JMPF R7 #0029 - 0x8C1C0104, // 0007 GETMET R7 R0 K4 - 0x7C1C0200, // 0008 CALL R7 1 - 0x1C1C0D05, // 0009 EQ R7 R6 K5 - 0x781E0007, // 000A JMPF R7 #0013 - 0x8C1C0106, // 000B GETMET R7 R0 K6 - 0x50240000, // 000C LDBOOL R9 0 0 - 0x7C1C0400, // 000D CALL R7 2 - 0x8C1C0107, // 000E GETMET R7 R0 K7 - 0x7C1C0200, // 000F CALL R7 1 - 0x501C0200, // 0010 LDBOOL R7 1 0 - 0x80040E00, // 0011 RET 1 R7 - 0x70020015, // 0012 JMP #0029 - 0x1C1C0D08, // 0013 EQ R7 R6 K8 - 0x781E0007, // 0014 JMPF R7 #001D - 0x8C1C0106, // 0015 GETMET R7 R0 K6 - 0x50240200, // 0016 LDBOOL R9 1 0 - 0x7C1C0400, // 0017 CALL R7 2 - 0x8C1C0107, // 0018 GETMET R7 R0 K7 - 0x7C1C0200, // 0019 CALL R7 1 - 0x501C0200, // 001A LDBOOL R7 1 0 - 0x80040E00, // 001B RET 1 R7 - 0x7002000B, // 001C JMP #0029 - 0x1C1C0D09, // 001D EQ R7 R6 K9 - 0x781E0009, // 001E JMPF R7 #0029 - 0x8C1C0106, // 001F GETMET R7 R0 K6 - 0x8824010A, // 0020 GETMBR R9 R0 K10 - 0x78260000, // 0021 JMPF R9 #0023 - 0x50240001, // 0022 LDBOOL R9 0 1 - 0x50240200, // 0023 LDBOOL R9 1 0 - 0x7C1C0400, // 0024 CALL R7 2 - 0x8C1C0107, // 0025 GETMET R7 R0 K7 - 0x7C1C0200, // 0026 CALL R7 1 - 0x501C0200, // 0027 LDBOOL R7 1 0 - 0x80040E00, // 0028 RET 1 R7 - 0x80000000, // 0029 RET 0 - }) - ) -); -/*******************************************************************/ - - /******************************************************************** ** Solidified function: set_onoff ********************************************************************/ @@ -187,6 +46,43 @@ be_local_closure(Matter_Plugin_OnOff_set_onoff, /* name */ /*******************************************************************/ +/******************************************************************** +** Solidified function: init +********************************************************************/ +be_local_closure(Matter_Plugin_OnOff_init, /* name */ + be_nested_proto( + 9, /* nstack */ + 4, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 2]) { /* constants */ + /* K0 */ be_nested_str_weak(init), + /* K1 */ be_nested_str_weak(shadow_onoff), + }), + be_str_weak(init), + &be_const_str_solidified, + ( &(const binstruction[11]) { /* code */ + 0x60100003, // 0000 GETGBL R4 G3 + 0x5C140000, // 0001 MOVE R5 R0 + 0x7C100200, // 0002 CALL R4 1 + 0x8C100900, // 0003 GETMET R4 R4 K0 + 0x5C180200, // 0004 MOVE R6 R1 + 0x5C1C0400, // 0005 MOVE R7 R2 + 0x5C200600, // 0006 MOVE R8 R3 + 0x7C100800, // 0007 CALL R4 4 + 0x50100000, // 0008 LDBOOL R4 0 0 + 0x90020204, // 0009 SETMBR R0 K1 R4 + 0x80000000, // 000A RET 0 + }) + ) +); +/*******************************************************************/ + + /******************************************************************** ** Solidified function: update_shadow ********************************************************************/ @@ -370,6 +266,110 @@ be_local_closure(Matter_Plugin_OnOff_read_attribute, /* name */ /*******************************************************************/ +/******************************************************************** +** Solidified function: invoke_request +********************************************************************/ +be_local_closure(Matter_Plugin_OnOff_invoke_request, /* name */ + be_nested_proto( + 10, /* nstack */ + 4, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[11]) { /* constants */ + /* K0 */ be_nested_str_weak(matter), + /* K1 */ be_nested_str_weak(TLV), + /* K2 */ be_nested_str_weak(cluster), + /* K3 */ be_nested_str_weak(command), + /* K4 */ be_nested_str_weak(update_shadow_lazy), + /* K5 */ be_const_int(0), + /* K6 */ be_nested_str_weak(set_onoff), + /* K7 */ be_nested_str_weak(update_shadow), + /* K8 */ be_const_int(1), + /* K9 */ be_const_int(2), + /* K10 */ be_nested_str_weak(shadow_onoff), + }), + be_str_weak(invoke_request), + &be_const_str_solidified, + ( &(const binstruction[42]) { /* code */ + 0xB8120000, // 0000 GETNGBL R4 K0 + 0x88100901, // 0001 GETMBR R4 R4 K1 + 0x88140702, // 0002 GETMBR R5 R3 K2 + 0x88180703, // 0003 GETMBR R6 R3 K3 + 0x541E0005, // 0004 LDINT R7 6 + 0x1C1C0A07, // 0005 EQ R7 R5 R7 + 0x781E0021, // 0006 JMPF R7 #0029 + 0x8C1C0104, // 0007 GETMET R7 R0 K4 + 0x7C1C0200, // 0008 CALL R7 1 + 0x1C1C0D05, // 0009 EQ R7 R6 K5 + 0x781E0007, // 000A JMPF R7 #0013 + 0x8C1C0106, // 000B GETMET R7 R0 K6 + 0x50240000, // 000C LDBOOL R9 0 0 + 0x7C1C0400, // 000D CALL R7 2 + 0x8C1C0107, // 000E GETMET R7 R0 K7 + 0x7C1C0200, // 000F CALL R7 1 + 0x501C0200, // 0010 LDBOOL R7 1 0 + 0x80040E00, // 0011 RET 1 R7 + 0x70020015, // 0012 JMP #0029 + 0x1C1C0D08, // 0013 EQ R7 R6 K8 + 0x781E0007, // 0014 JMPF R7 #001D + 0x8C1C0106, // 0015 GETMET R7 R0 K6 + 0x50240200, // 0016 LDBOOL R9 1 0 + 0x7C1C0400, // 0017 CALL R7 2 + 0x8C1C0107, // 0018 GETMET R7 R0 K7 + 0x7C1C0200, // 0019 CALL R7 1 + 0x501C0200, // 001A LDBOOL R7 1 0 + 0x80040E00, // 001B RET 1 R7 + 0x7002000B, // 001C JMP #0029 + 0x1C1C0D09, // 001D EQ R7 R6 K9 + 0x781E0009, // 001E JMPF R7 #0029 + 0x8C1C0106, // 001F GETMET R7 R0 K6 + 0x8824010A, // 0020 GETMBR R9 R0 K10 + 0x78260000, // 0021 JMPF R9 #0023 + 0x50240001, // 0022 LDBOOL R9 0 1 + 0x50240200, // 0023 LDBOOL R9 1 0 + 0x7C1C0400, // 0024 CALL R7 2 + 0x8C1C0107, // 0025 GETMET R7 R0 K7 + 0x7C1C0200, // 0026 CALL R7 1 + 0x501C0200, // 0027 LDBOOL R7 1 0 + 0x80040E00, // 0028 RET 1 R7 + 0x80000000, // 0029 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: +********************************************************************/ +be_local_closure(Matter_Plugin_OnOff__X3Clambda_X3E, /* name */ + be_nested_proto( + 3, /* nstack */ + 1, /* argc */ + 0, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 0, /* has constants */ + NULL, /* no const */ + be_str_weak(_X3Clambda_X3E), + &be_const_str_solidified, + ( &(const binstruction[ 4]) { /* code */ + 0x60040009, // 0000 GETGBL R1 G9 + 0x5C080000, // 0001 MOVE R2 R0 + 0x7C040200, // 0002 CALL R1 1 + 0x80040200, // 0003 RET 1 R1 + }) + ) +); +/*******************************************************************/ + + /******************************************************************** ** Solidified class: Matter_Plugin_OnOff ********************************************************************/ @@ -377,23 +377,18 @@ extern const bclass be_class_Matter_Plugin_Device; be_local_class(Matter_Plugin_OnOff, 2, &be_class_Matter_Plugin_Device, - be_nested_map(15, + be_nested_map(16, ( (struct bmapnode*) &(const bmapnode[]) { - { be_const_key_weak(init, -1), be_const_closure(Matter_Plugin_OnOff_init_closure) }, - { be_const_key_weak(ARG, -1), be_nested_str_weak(relay) }, - { be_const_key_weak(invoke_request, -1), be_const_closure(Matter_Plugin_OnOff_invoke_request_closure) }, + { be_const_key_weak(shadow_onoff, 4), be_const_var(1) }, + { be_const_key_weak(tasmota_relay_index, 12), be_const_var(0) }, { be_const_key_weak(set_onoff, -1), be_const_closure(Matter_Plugin_OnOff_set_onoff_closure) }, - { be_const_key_weak(ARG_TYPE, 10), be_const_static_closure(Matter_Plugin_OnOff__X3Clambda_X3E_closure) }, - { be_const_key_weak(tasmota_relay_index, 7), be_const_var(0) }, + { be_const_key_weak(init, -1), be_const_closure(Matter_Plugin_OnOff_init_closure) }, + { be_const_key_weak(ARG_TYPE, -1), be_const_static_closure(Matter_Plugin_OnOff__X3Clambda_X3E_closure) }, + { be_const_key_weak(update_shadow, 15), be_const_closure(Matter_Plugin_OnOff_update_shadow_closure) }, + { be_const_key_weak(NAME, -1), be_nested_str_weak(Relay) }, + { be_const_key_weak(ARG, -1), be_nested_str_weak(relay) }, { be_const_key_weak(UPDATE_TIME, -1), be_const_int(250) }, - { be_const_key_weak(TYPES, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { - be_const_map( * be_nested_map(1, - ( (struct bmapnode*) &(const bmapnode[]) { - { be_const_key_int(266, -1), be_const_int(2) }, - })) ) } )) }, - { be_const_key_weak(TYPE, 14), be_nested_str_weak(relay) }, - { be_const_key_weak(NAME, 1), be_nested_str_weak(Relay) }, - { be_const_key_weak(CLUSTERS, 11), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { + { be_const_key_weak(CLUSTERS, 14), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { be_const_map( * be_nested_map(1, ( (struct bmapnode*) &(const bmapnode[]) { { be_const_key_int(6, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_list, { @@ -404,10 +399,16 @@ be_local_class(Matter_Plugin_OnOff, be_const_int(65533), })) ) } )) }, })) ) } )) }, - { be_const_key_weak(parse_configuration, 8), be_const_closure(Matter_Plugin_OnOff_parse_configuration_closure) }, + { be_const_key_weak(TYPES, 9), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { + be_const_map( * be_nested_map(1, + ( (struct bmapnode*) &(const bmapnode[]) { + { be_const_key_int(266, -1), be_const_int(2) }, + })) ) } )) }, + { be_const_key_weak(invoke_request, -1), be_const_closure(Matter_Plugin_OnOff_invoke_request_closure) }, + { be_const_key_weak(ARG_HINT, -1), be_nested_str_weak(Enter_X20Relay_X3Cx_X3E_X20number) }, + { be_const_key_weak(TYPE, -1), be_nested_str_weak(relay) }, { be_const_key_weak(read_attribute, -1), be_const_closure(Matter_Plugin_OnOff_read_attribute_closure) }, - { be_const_key_weak(shadow_onoff, -1), be_const_var(1) }, - { be_const_key_weak(update_shadow, -1), be_const_closure(Matter_Plugin_OnOff_update_shadow_closure) }, + { be_const_key_weak(parse_configuration, -1), be_const_closure(Matter_Plugin_OnOff_parse_configuration_closure) }, })), be_str_weak(Matter_Plugin_OnOff) ); diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Root.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Root.h index a4fc4a4ec..a695431fd 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Root.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Root.h @@ -47,7 +47,7 @@ be_local_closure(Matter_Plugin_Root_invoke_request, /* name */ ), }), 1, /* has constants */ - ( &(const bvalue[107]) { /* constants */ + ( &(const bvalue[102]) { /* constants */ /* K0 */ be_nested_str_weak(crypto), /* K1 */ be_nested_str_weak(string), /* K2 */ be_nested_str_weak(matter), @@ -87,78 +87,73 @@ be_local_closure(Matter_Plugin_Root_invoke_request, /* name */ /* K36 */ be_nested_str_weak(utc), /* K37 */ be_nested_str_weak(tlv2raw), /* K38 */ be_nested_str_weak(get_ac), - /* K39 */ be_nested_str_weak(log), - /* K40 */ be_nested_str_weak(MTR_X3A_X20attestation_tbs_X3D), - /* K41 */ be_nested_str_weak(tohex), - /* K42 */ be_nested_str_weak(EC_P256), - /* K43 */ be_nested_str_weak(ecdsa_sign_sha256), - /* K44 */ be_nested_str_weak(DAC_Priv_FFF1_8000), - /* K45 */ be_nested_str_weak(format), - /* K46 */ be_nested_str_weak(MTR_X3A_X20CSRRequest_X20CSRNonce_X3D_X25s_X20IsForUpdateNOC_X3D_X25s), - /* K47 */ be_nested_str_weak(gen_CSR), - /* K48 */ be_nested_str_weak(MTR_X3A_X20nocsr_tbs_X3D), - /* K49 */ be_nested_str_weak(set_temp_ca), - /* K50 */ be_nested_str_weak(MTR_X3A_X20received_X20ca_root_X3D), - /* K51 */ be_nested_str_weak(SUCCESS), - /* K52 */ be_nested_str_weak(MTR_X3A_X20AddNoc_X20Args_X3D), - /* K53 */ be_nested_str_weak(get_temp_ca), - /* K54 */ be_nested_str_weak(MTR_X3A_X20Error_X3A_X20AdNOC_X20without_X20CA), - /* K55 */ be_nested_str_weak(sessions), - /* K56 */ be_nested_str_weak(create_fabric), - /* K57 */ be_nested_str_weak(set_ca), - /* K58 */ be_nested_str_weak(set_noc_icac), - /* K59 */ be_nested_str_weak(set_ipk_epoch_key), - /* K60 */ be_nested_str_weak(set_admin_subject_vendor), - /* K61 */ be_nested_str_weak(set_pk), - /* K62 */ be_nested_str_weak(get_pk), - /* K63 */ be_nested_str_weak(parse), - /* K64 */ be_nested_str_weak(findsub), - /* K65 */ be_nested_str_weak(MTR_X3A_X20Error_X3A_X20no_X20fabricid_X20nor_X20deviceid_X20in_X20NOC_X20certificate), - /* K66 */ be_nested_str_weak(int), - /* K67 */ be_nested_str_weak(int64), - /* K68 */ be_nested_str_weak(fromu32), - /* K69 */ be_nested_str_weak(tobytes), - /* K70 */ be_nested_str_weak(get_temp_ca_pub), - /* K71 */ be_const_int(2147483647), - /* K72 */ be_nested_str_weak(fromstring), - /* K73 */ be_nested_str_weak(CompressedFabric), - /* K74 */ be_nested_str_weak(HKDF_SHA256), - /* K75 */ be_nested_str_weak(copy), - /* K76 */ be_nested_str_weak(reverse), - /* K77 */ be_nested_str_weak(derive), - /* K78 */ be_nested_str_weak(commissioning_admin_fabric), - /* K79 */ be_nested_str_weak(set_fabric_device), - /* K80 */ be_nested_str_weak(fabric_candidate), - /* K81 */ be_nested_str_weak(start_operational_discovery_deferred), - /* K82 */ be_nested_str_weak(is_PASE), - /* K83 */ be_nested_str_weak(set_expire_in_seconds), - /* K84 */ be_nested_str_weak(log_new_fabric), - /* K85 */ be_nested_str_weak(set_fabric_label), - /* K86 */ be_nested_str_weak(MTR_X3A_X20_X2E_X20_X20_X20_X20_X20_X20_X20_X20_X20_X20Update_X20fabric_X20_X27_X25s_X27_X20label_X3D_X27_X25s_X27), - /* K87 */ be_nested_str_weak(get_fabric_id), - /* K88 */ be_nested_str_weak(fabric_index_X3A), - /* K89 */ be_nested_str_weak(active_fabrics), - /* K90 */ be_nested_str_weak(get_fabric_index), - /* K91 */ be_nested_str_weak(MTR_X3A_X20removing_X20fabric_X20), - /* K92 */ be_nested_str_weak(set_timer), - /* K93 */ be_nested_str_weak(stop_iteration), - /* K94 */ be_nested_str_weak(MTR_X3A_X20RemoveFabric_X20fabric_X28), - /* K95 */ be_nested_str_weak(_X29_X20not_X20found), - /* K96 */ be_nested_str_weak(INVALID_ACTION), - /* K97 */ be_nested_str_weak(MTR_X3A_X20OpenCommissioningWindow_X28timeout_X3D_X25i_X2C_X20passcode_X3D_X25s_X2C_X20discriminator_X3D_X25i_X2C_X20iterations_X3D_X25i_X2C_X20salt_X3D_X25s_X29), - /* K98 */ be_nested_str_weak(INVALID_DATA_TYPE), - /* K99 */ be_nested_str_weak(MTR_X3A_X20wrong_X20size_X20for_X20PAKE_X20parameters), - /* K100 */ be_nested_str_weak(CONSTRAINT_ERROR), - /* K101 */ be_nested_str_weak(start_basic_commissioning), - /* K102 */ be_nested_str_weak(get_fabric), - /* K103 */ be_nested_str_weak(MTR_X3A_X20OpenBasicCommissioningWindow_X20commissioning_timeout_X3D), - /* K104 */ be_nested_str_weak(start_root_basic_commissioning), - /* K105 */ be_nested_str_weak(stop_basic_commissioning), - /* K106 */ be_nested_str_weak(invoke_request), + /* K39 */ be_nested_str_weak(EC_P256), + /* K40 */ be_nested_str_weak(ecdsa_sign_sha256), + /* K41 */ be_nested_str_weak(DAC_Priv_FFF1_8000), + /* K42 */ be_nested_str_weak(gen_CSR), + /* K43 */ be_nested_str_weak(set_temp_ca), + /* K44 */ be_nested_str_weak(SUCCESS), + /* K45 */ be_nested_str_weak(log), + /* K46 */ be_nested_str_weak(MTR_X3A_X20AddNoc_X20Args_X3D), + /* K47 */ be_nested_str_weak(get_temp_ca), + /* K48 */ be_nested_str_weak(MTR_X3A_X20Error_X3A_X20AdNOC_X20without_X20CA), + /* K49 */ be_nested_str_weak(sessions), + /* K50 */ be_nested_str_weak(create_fabric), + /* K51 */ be_nested_str_weak(set_ca), + /* K52 */ be_nested_str_weak(set_noc_icac), + /* K53 */ be_nested_str_weak(set_ipk_epoch_key), + /* K54 */ be_nested_str_weak(set_admin_subject_vendor), + /* K55 */ be_nested_str_weak(set_pk), + /* K56 */ be_nested_str_weak(get_pk), + /* K57 */ be_nested_str_weak(parse), + /* K58 */ be_nested_str_weak(findsub), + /* K59 */ be_nested_str_weak(MTR_X3A_X20Error_X3A_X20no_X20fabricid_X20nor_X20deviceid_X20in_X20NOC_X20certificate), + /* K60 */ be_nested_str_weak(int), + /* K61 */ be_nested_str_weak(int64), + /* K62 */ be_nested_str_weak(fromu32), + /* K63 */ be_nested_str_weak(tobytes), + /* K64 */ be_nested_str_weak(get_temp_ca_pub), + /* K65 */ be_const_int(2147483647), + /* K66 */ be_nested_str_weak(fromstring), + /* K67 */ be_nested_str_weak(CompressedFabric), + /* K68 */ be_nested_str_weak(HKDF_SHA256), + /* K69 */ be_nested_str_weak(copy), + /* K70 */ be_nested_str_weak(reverse), + /* K71 */ be_nested_str_weak(derive), + /* K72 */ be_nested_str_weak(commissioning_admin_fabric), + /* K73 */ be_nested_str_weak(set_fabric_device), + /* K74 */ be_nested_str_weak(fabric_candidate), + /* K75 */ be_nested_str_weak(start_operational_discovery_deferred), + /* K76 */ be_nested_str_weak(is_PASE), + /* K77 */ be_nested_str_weak(set_expire_in_seconds), + /* K78 */ be_nested_str_weak(log_new_fabric), + /* K79 */ be_nested_str_weak(set_fabric_label), + /* K80 */ be_nested_str_weak(format), + /* K81 */ be_nested_str_weak(MTR_X3A_X20_X2E_X20_X20_X20_X20_X20_X20_X20_X20_X20_X20Update_X20fabric_X20_X27_X25s_X27_X20label_X3D_X27_X25s_X27), + /* K82 */ be_nested_str_weak(get_fabric_id), + /* K83 */ be_nested_str_weak(tohex), + /* K84 */ be_nested_str_weak(fabric_index_X3A), + /* K85 */ be_nested_str_weak(active_fabrics), + /* K86 */ be_nested_str_weak(get_fabric_index), + /* K87 */ be_nested_str_weak(set_timer), + /* K88 */ be_nested_str_weak(stop_iteration), + /* K89 */ be_nested_str_weak(MTR_X3A_X20RemoveFabric_X20fabric_X28), + /* K90 */ be_nested_str_weak(_X29_X20not_X20found), + /* K91 */ be_nested_str_weak(INVALID_ACTION), + /* K92 */ be_nested_str_weak(MTR_X3A_X20OpenCommissioningWindow_X28timeout_X3D_X25i_X2C_X20passcode_X3D_X25s_X2C_X20discriminator_X3D_X25i_X2C_X20iterations_X3D_X25i_X2C_X20salt_X3D_X25s_X29), + /* K93 */ be_nested_str_weak(INVALID_DATA_TYPE), + /* K94 */ be_nested_str_weak(MTR_X3A_X20wrong_X20size_X20for_X20PAKE_X20parameters), + /* K95 */ be_nested_str_weak(CONSTRAINT_ERROR), + /* K96 */ be_nested_str_weak(start_basic_commissioning), + /* K97 */ be_nested_str_weak(get_fabric), + /* K98 */ be_nested_str_weak(MTR_X3A_X20OpenBasicCommissioningWindow_X20commissioning_timeout_X3D), + /* K99 */ be_nested_str_weak(start_root_basic_commissioning), + /* K100 */ be_nested_str_weak(stop_basic_commissioning), + /* K101 */ be_nested_str_weak(invoke_request), }), be_str_weak(invoke_request), &be_const_str_solidified, - ( &(const binstruction[755]) { /* code */ + ( &(const binstruction[709]) { /* code */ 0xA4120000, // 0000 IMPORT R4 K0 0xA4160200, // 0001 IMPORT R5 K1 0xB81A0400, // 0002 GETNGBL R6 K2 @@ -257,10 +252,10 @@ be_local_closure(Matter_Plugin_Root_invoke_request, /* name */ 0x80041200, // 005F RET 1 R9 0x70020000, // 0060 JMP #0062 0xB0063119, // 0061 RAISE 1 K24 K25 - 0x7002028D, // 0062 JMP #02F1 + 0x7002025F, // 0062 JMP #02C3 0x5426003D, // 0063 LDINT R9 62 0x1C240E09, // 0064 EQ R9 R7 R9 - 0x782601EF, // 0065 JMPF R9 #0256 + 0x782601C0, // 0065 JMPF R9 #0227 0x1C24110F, // 0066 EQ R9 R8 K15 0x7826001D, // 0067 JMPF R9 #0086 0x8C240507, // 0068 GETMET R9 R2 K7 @@ -292,9 +287,9 @@ be_local_closure(Matter_Plugin_Root_invoke_request, /* name */ 0x7C2C0800, // 0082 CALL R11 4 0x900E0B11, // 0083 SETMBR R3 K5 K17 0x80041400, // 0084 RET 1 R10 - 0x700201CE, // 0085 JMP #0255 + 0x7002019F, // 0085 JMP #0226 0x1C241106, // 0086 EQ R9 R8 K6 - 0x78260044, // 0087 JMPF R9 #00CD + 0x7826003D, // 0087 JMPF R9 #00C6 0x8C240507, // 0088 GETMET R9 R2 K7 0x582C0006, // 0089 LDCONST R11 K6 0x7C240400, // 008A CALL R9 2 @@ -334,586 +329,540 @@ be_local_closure(Matter_Plugin_Root_invoke_request, /* name */ 0x8C300326, // 00AC GETMET R12 R1 K38 0x7C300200, // 00AD CALL R12 1 0x0034160C, // 00AE ADD R13 R11 R12 - 0xB83A4400, // 00AF GETNGBL R14 K34 - 0x8C381D27, // 00B0 GETMET R14 R14 K39 - 0x8C401B29, // 00B1 GETMET R16 R13 K41 - 0x7C400200, // 00B2 CALL R16 1 - 0x00425010, // 00B3 ADD R16 K40 R16 - 0x58440011, // 00B4 LDCONST R17 K17 - 0x7C380600, // 00B5 CALL R14 3 - 0x8C38092A, // 00B6 GETMET R14 R4 K42 - 0x7C380200, // 00B7 CALL R14 1 - 0x8C381D2B, // 00B8 GETMET R14 R14 K43 - 0xB8420400, // 00B9 GETNGBL R16 K2 - 0x8C40212C, // 00BA GETMET R16 R16 K44 - 0x7C400200, // 00BB CALL R16 1 - 0x5C441A00, // 00BC MOVE R17 R13 - 0x7C380600, // 00BD CALL R14 3 - 0x8C3C0D0A, // 00BE GETMET R15 R6 K10 - 0x7C3C0200, // 00BF CALL R15 1 - 0x8C401F0B, // 00C0 GETMET R16 R15 K11 - 0x58480006, // 00C1 LDCONST R18 K6 - 0x884C0D1C, // 00C2 GETMBR R19 R6 K28 - 0x5C501600, // 00C3 MOVE R20 R11 - 0x7C400800, // 00C4 CALL R16 4 - 0x8C401F0B, // 00C5 GETMET R16 R15 K11 - 0x58480008, // 00C6 LDCONST R18 K8 - 0x884C0D20, // 00C7 GETMBR R19 R6 K32 - 0x5C501C00, // 00C8 MOVE R20 R14 - 0x7C400800, // 00C9 CALL R16 4 - 0x900E0B08, // 00CA SETMBR R3 K5 K8 - 0x80041E00, // 00CB RET 1 R15 - 0x70020187, // 00CC JMP #0255 - 0x54260003, // 00CD LDINT R9 4 - 0x1C241009, // 00CE EQ R9 R8 R9 - 0x7826004D, // 00CF JMPF R9 #011E - 0x8C240507, // 00D0 GETMET R9 R2 K7 - 0x582C0006, // 00D1 LDCONST R11 K6 - 0x7C240400, // 00D2 CALL R9 2 - 0x6028000C, // 00D3 GETGBL R10 G12 - 0x5C2C1200, // 00D4 MOVE R11 R9 - 0x7C280200, // 00D5 CALL R10 1 - 0x542E001F, // 00D6 LDINT R11 32 - 0x2028140B, // 00D7 NE R10 R10 R11 - 0x782A0001, // 00D8 JMPF R10 #00DB - 0x4C280000, // 00D9 LDNIL R10 - 0x80041400, // 00DA RET 1 R10 - 0x8C280507, // 00DB GETMET R10 R2 K7 - 0x58300008, // 00DC LDCONST R12 K8 - 0x50340000, // 00DD LDBOOL R13 0 0 - 0x7C280600, // 00DE CALL R10 3 - 0xB82E4400, // 00DF GETNGBL R11 K34 - 0x8C2C1727, // 00E0 GETMET R11 R11 K39 - 0x8C340B2D, // 00E1 GETMET R13 R5 K45 - 0x583C002E, // 00E2 LDCONST R15 K46 - 0x60400008, // 00E3 GETGBL R16 G8 + 0x8C380927, // 00AF GETMET R14 R4 K39 + 0x7C380200, // 00B0 CALL R14 1 + 0x8C381D28, // 00B1 GETMET R14 R14 K40 + 0xB8420400, // 00B2 GETNGBL R16 K2 + 0x8C402129, // 00B3 GETMET R16 R16 K41 + 0x7C400200, // 00B4 CALL R16 1 + 0x5C441A00, // 00B5 MOVE R17 R13 + 0x7C380600, // 00B6 CALL R14 3 + 0x8C3C0D0A, // 00B7 GETMET R15 R6 K10 + 0x7C3C0200, // 00B8 CALL R15 1 + 0x8C401F0B, // 00B9 GETMET R16 R15 K11 + 0x58480006, // 00BA LDCONST R18 K6 + 0x884C0D1C, // 00BB GETMBR R19 R6 K28 + 0x5C501600, // 00BC MOVE R20 R11 + 0x7C400800, // 00BD CALL R16 4 + 0x8C401F0B, // 00BE GETMET R16 R15 K11 + 0x58480008, // 00BF LDCONST R18 K8 + 0x884C0D20, // 00C0 GETMBR R19 R6 K32 + 0x5C501C00, // 00C1 MOVE R20 R14 + 0x7C400800, // 00C2 CALL R16 4 + 0x900E0B08, // 00C3 SETMBR R3 K5 K8 + 0x80041E00, // 00C4 RET 1 R15 + 0x7002015F, // 00C5 JMP #0226 + 0x54260003, // 00C6 LDINT R9 4 + 0x1C241009, // 00C7 EQ R9 R8 R9 + 0x78260039, // 00C8 JMPF R9 #0103 + 0x8C240507, // 00C9 GETMET R9 R2 K7 + 0x582C0006, // 00CA LDCONST R11 K6 + 0x7C240400, // 00CB CALL R9 2 + 0x6028000C, // 00CC GETGBL R10 G12 + 0x5C2C1200, // 00CD MOVE R11 R9 + 0x7C280200, // 00CE CALL R10 1 + 0x542E001F, // 00CF LDINT R11 32 + 0x2028140B, // 00D0 NE R10 R10 R11 + 0x782A0001, // 00D1 JMPF R10 #00D4 + 0x4C280000, // 00D2 LDNIL R10 + 0x80041400, // 00D3 RET 1 R10 + 0x8C280507, // 00D4 GETMET R10 R2 K7 + 0x58300008, // 00D5 LDCONST R12 K8 + 0x50340000, // 00D6 LDBOOL R13 0 0 + 0x7C280600, // 00D7 CALL R10 3 + 0x8C2C032A, // 00D8 GETMET R11 R1 K42 + 0x7C2C0200, // 00D9 CALL R11 1 + 0x8C300D0A, // 00DA GETMET R12 R6 K10 + 0x7C300200, // 00DB CALL R12 1 + 0x8C34190B, // 00DC GETMET R13 R12 K11 + 0x583C0008, // 00DD LDCONST R15 K8 + 0x88400D1C, // 00DE GETMBR R16 R6 K28 + 0x5C441600, // 00DF MOVE R17 R11 + 0x7C340800, // 00E0 CALL R13 4 + 0x8C34190B, // 00E1 GETMET R13 R12 K11 + 0x583C000F, // 00E2 LDCONST R15 K15 + 0x88400D20, // 00E3 GETMBR R16 R6 K32 0x5C441200, // 00E4 MOVE R17 R9 - 0x7C400200, // 00E5 CALL R16 1 - 0x60440008, // 00E6 GETGBL R17 G8 - 0x5C481400, // 00E7 MOVE R18 R10 - 0x7C440200, // 00E8 CALL R17 1 - 0x7C340800, // 00E9 CALL R13 4 - 0x58380011, // 00EA LDCONST R14 K17 - 0x7C2C0600, // 00EB CALL R11 3 - 0x8C2C032F, // 00EC GETMET R11 R1 K47 - 0x7C2C0200, // 00ED CALL R11 1 - 0x8C300D0A, // 00EE GETMET R12 R6 K10 - 0x7C300200, // 00EF CALL R12 1 - 0x8C34190B, // 00F0 GETMET R13 R12 K11 - 0x583C0008, // 00F1 LDCONST R15 K8 - 0x88400D1C, // 00F2 GETMBR R16 R6 K28 - 0x5C441600, // 00F3 MOVE R17 R11 - 0x7C340800, // 00F4 CALL R13 4 - 0x8C34190B, // 00F5 GETMET R13 R12 K11 - 0x583C000F, // 00F6 LDCONST R15 K15 - 0x88400D20, // 00F7 GETMBR R16 R6 K32 - 0x5C441200, // 00F8 MOVE R17 R9 - 0x7C340800, // 00F9 CALL R13 4 - 0x8C341925, // 00FA GETMET R13 R12 K37 - 0x7C340200, // 00FB CALL R13 1 - 0x8C380326, // 00FC GETMET R14 R1 K38 - 0x7C380200, // 00FD CALL R14 1 - 0x00381A0E, // 00FE ADD R14 R13 R14 - 0xB83E4400, // 00FF GETNGBL R15 K34 - 0x8C3C1F27, // 0100 GETMET R15 R15 K39 - 0x8C441D29, // 0101 GETMET R17 R14 K41 - 0x7C440200, // 0102 CALL R17 1 - 0x00466011, // 0103 ADD R17 K48 R17 - 0x58480011, // 0104 LDCONST R18 K17 - 0x7C3C0600, // 0105 CALL R15 3 - 0x8C3C092A, // 0106 GETMET R15 R4 K42 - 0x7C3C0200, // 0107 CALL R15 1 - 0x8C3C1F2B, // 0108 GETMET R15 R15 K43 - 0xB8460400, // 0109 GETNGBL R17 K2 - 0x8C44232C, // 010A GETMET R17 R17 K44 - 0x7C440200, // 010B CALL R17 1 - 0x5C481C00, // 010C MOVE R18 R14 - 0x7C3C0600, // 010D CALL R15 3 - 0x8C400D0A, // 010E GETMET R16 R6 K10 - 0x7C400200, // 010F CALL R16 1 - 0x8C44210B, // 0110 GETMET R17 R16 K11 - 0x584C0006, // 0111 LDCONST R19 K6 - 0x88500D1C, // 0112 GETMBR R20 R6 K28 - 0x5C541A00, // 0113 MOVE R21 R13 - 0x7C440800, // 0114 CALL R17 4 - 0x8C44210B, // 0115 GETMET R17 R16 K11 - 0x584C0008, // 0116 LDCONST R19 K8 - 0x88500D20, // 0117 GETMBR R20 R6 K32 - 0x5C541E00, // 0118 MOVE R21 R15 - 0x7C440800, // 0119 CALL R17 4 - 0x54460004, // 011A LDINT R17 5 - 0x900E0A11, // 011B SETMBR R3 K5 R17 - 0x80042000, // 011C RET 1 R16 - 0x70020136, // 011D JMP #0255 - 0x5426000A, // 011E LDINT R9 11 - 0x1C241009, // 011F EQ R9 R8 R9 - 0x78260012, // 0120 JMPF R9 #0134 - 0x8C240507, // 0121 GETMET R9 R2 K7 - 0x582C0006, // 0122 LDCONST R11 K6 - 0x7C240400, // 0123 CALL R9 2 - 0x8C280331, // 0124 GETMET R10 R1 K49 - 0x5C301200, // 0125 MOVE R12 R9 - 0x7C280400, // 0126 CALL R10 2 - 0xB82A4400, // 0127 GETNGBL R10 K34 - 0x8C281527, // 0128 GETMET R10 R10 K39 - 0x8C301329, // 0129 GETMET R12 R9 K41 - 0x7C300200, // 012A CALL R12 1 - 0x0032640C, // 012B ADD R12 K50 R12 - 0x58340011, // 012C LDCONST R13 K17 - 0x7C280600, // 012D CALL R10 3 - 0xB82A0400, // 012E GETNGBL R10 K2 - 0x88281533, // 012F GETMBR R10 R10 K51 - 0x900E340A, // 0130 SETMBR R3 K26 R10 - 0x4C280000, // 0131 LDNIL R10 - 0x80041400, // 0132 RET 1 R10 - 0x70020120, // 0133 JMP #0255 - 0x54260005, // 0134 LDINT R9 6 - 0x1C241009, // 0135 EQ R9 R8 R9 - 0x782600B9, // 0136 JMPF R9 #01F1 - 0xB8264400, // 0137 GETNGBL R9 K34 - 0x8C241327, // 0138 GETMET R9 R9 K39 - 0x602C0008, // 0139 GETGBL R11 G8 - 0x5C300400, // 013A MOVE R12 R2 - 0x7C2C0200, // 013B CALL R11 1 - 0x002E680B, // 013C ADD R11 K52 R11 - 0x58300011, // 013D LDCONST R12 K17 - 0x7C240600, // 013E CALL R9 3 - 0x8C240507, // 013F GETMET R9 R2 K7 - 0x582C0006, // 0140 LDCONST R11 K6 - 0x7C240400, // 0141 CALL R9 2 - 0x8C280507, // 0142 GETMET R10 R2 K7 - 0x58300008, // 0143 LDCONST R12 K8 - 0x7C280400, // 0144 CALL R10 2 - 0x602C000C, // 0145 GETGBL R11 G12 - 0x5C301400, // 0146 MOVE R12 R10 - 0x7C2C0200, // 0147 CALL R11 1 - 0x1C2C1706, // 0148 EQ R11 R11 K6 - 0x782E0000, // 0149 JMPF R11 #014B - 0x4C280000, // 014A LDNIL R10 - 0x8C2C0507, // 014B GETMET R11 R2 K7 - 0x5834000F, // 014C LDCONST R13 K15 - 0x7C2C0400, // 014D CALL R11 2 - 0x8C300507, // 014E GETMET R12 R2 K7 - 0x58380011, // 014F LDCONST R14 K17 - 0x7C300400, // 0150 CALL R12 2 - 0x8C340507, // 0151 GETMET R13 R2 K7 - 0x543E0003, // 0152 LDINT R15 4 - 0x7C340400, // 0153 CALL R13 2 - 0x8C380335, // 0154 GETMET R14 R1 K53 - 0x7C380200, // 0155 CALL R14 1 - 0x4C3C0000, // 0156 LDNIL R15 - 0x1C381C0F, // 0157 EQ R14 R14 R15 - 0x783A0006, // 0158 JMPF R14 #0160 - 0xB83A4400, // 0159 GETNGBL R14 K34 - 0x8C381D27, // 015A GETMET R14 R14 K39 - 0x58400036, // 015B LDCONST R16 K54 - 0x5844000F, // 015C LDCONST R17 K15 - 0x7C380600, // 015D CALL R14 3 - 0x4C380000, // 015E LDNIL R14 - 0x80041C00, // 015F RET 1 R14 - 0x88380116, // 0160 GETMBR R14 R0 K22 - 0x88381D37, // 0161 GETMBR R14 R14 K55 - 0x8C381D38, // 0162 GETMET R14 R14 K56 - 0x7C380200, // 0163 CALL R14 1 - 0x8C3C1D39, // 0164 GETMET R15 R14 K57 - 0x8C440335, // 0165 GETMET R17 R1 K53 - 0x7C440200, // 0166 CALL R17 1 - 0x7C3C0400, // 0167 CALL R15 2 - 0x8C3C1D3A, // 0168 GETMET R15 R14 K58 - 0x5C441200, // 0169 MOVE R17 R9 - 0x5C481400, // 016A MOVE R18 R10 - 0x7C3C0600, // 016B CALL R15 3 - 0x8C3C1D3B, // 016C GETMET R15 R14 K59 - 0x5C441600, // 016D MOVE R17 R11 - 0x7C3C0400, // 016E CALL R15 2 - 0x8C3C1D3C, // 016F GETMET R15 R14 K60 - 0x5C441800, // 0170 MOVE R17 R12 - 0x5C481A00, // 0171 MOVE R18 R13 - 0x7C3C0600, // 0172 CALL R15 3 - 0x8C3C1D3D, // 0173 GETMET R15 R14 K61 - 0x8C44033E, // 0174 GETMET R17 R1 K62 - 0x7C440200, // 0175 CALL R17 1 - 0x7C3C0400, // 0176 CALL R15 2 - 0xB83E0400, // 0177 GETNGBL R15 K2 - 0x883C1F03, // 0178 GETMBR R15 R15 K3 - 0x8C3C1F3F, // 0179 GETMET R15 R15 K63 - 0x5C441200, // 017A MOVE R17 R9 - 0x7C3C0400, // 017B CALL R15 2 - 0x8C401F40, // 017C GETMET R16 R15 K64 - 0x544A0005, // 017D LDINT R18 6 - 0x7C400400, // 017E CALL R16 2 - 0x8C442107, // 017F GETMET R17 R16 K7 - 0x544E0014, // 0180 LDINT R19 21 - 0x7C440400, // 0181 CALL R17 2 - 0x8C482107, // 0182 GETMET R18 R16 K7 - 0x54520010, // 0183 LDINT R20 17 - 0x7C480400, // 0184 CALL R18 2 - 0x5C4C2200, // 0185 MOVE R19 R17 - 0x784E0001, // 0186 JMPF R19 #0189 - 0x5C4C2400, // 0187 MOVE R19 R18 - 0x744E0006, // 0188 JMPT R19 #0190 - 0xB84E4400, // 0189 GETNGBL R19 K34 - 0x8C4C2727, // 018A GETMET R19 R19 K39 - 0x58540041, // 018B LDCONST R21 K65 - 0x5858000F, // 018C LDCONST R22 K15 - 0x7C4C0600, // 018D CALL R19 3 - 0x504C0000, // 018E LDBOOL R19 0 0 - 0x80042600, // 018F RET 1 R19 - 0x604C0004, // 0190 GETGBL R19 G4 - 0x5C502200, // 0191 MOVE R20 R17 - 0x7C4C0200, // 0192 CALL R19 1 - 0x1C4C2742, // 0193 EQ R19 R19 K66 - 0x784E0007, // 0194 JMPF R19 #019D - 0xB84E8600, // 0195 GETNGBL R19 K67 - 0x8C4C2744, // 0196 GETMET R19 R19 K68 - 0x5C542200, // 0197 MOVE R21 R17 - 0x7C4C0400, // 0198 CALL R19 2 - 0x8C4C2745, // 0199 GETMET R19 R19 K69 - 0x7C4C0200, // 019A CALL R19 1 - 0x5C442600, // 019B MOVE R17 R19 - 0x70020002, // 019C JMP #01A0 - 0x8C4C2345, // 019D GETMET R19 R17 K69 - 0x7C4C0200, // 019E CALL R19 1 - 0x5C442600, // 019F MOVE R17 R19 - 0x604C0004, // 01A0 GETGBL R19 G4 - 0x5C502400, // 01A1 MOVE R20 R18 - 0x7C4C0200, // 01A2 CALL R19 1 - 0x1C4C2742, // 01A3 EQ R19 R19 K66 - 0x784E0007, // 01A4 JMPF R19 #01AD - 0xB84E8600, // 01A5 GETNGBL R19 K67 - 0x8C4C2744, // 01A6 GETMET R19 R19 K68 - 0x5C542400, // 01A7 MOVE R21 R18 - 0x7C4C0400, // 01A8 CALL R19 2 - 0x8C4C2745, // 01A9 GETMET R19 R19 K69 - 0x7C4C0200, // 01AA CALL R19 1 - 0x5C482600, // 01AB MOVE R18 R19 - 0x70020002, // 01AC JMP #01B0 - 0x8C4C2545, // 01AD GETMET R19 R18 K69 - 0x7C4C0200, // 01AE CALL R19 1 - 0x5C482600, // 01AF MOVE R18 R19 - 0x8C4C0346, // 01B0 GETMET R19 R1 K70 - 0x7C4C0200, // 01B1 CALL R19 1 - 0x40521147, // 01B2 CONNECT R20 K8 K71 - 0x944C2614, // 01B3 GETIDX R19 R19 R20 - 0x60540015, // 01B4 GETGBL R21 G21 - 0x7C540000, // 01B5 CALL R21 0 - 0x8C542B48, // 01B6 GETMET R21 R21 K72 - 0x585C0049, // 01B7 LDCONST R23 K73 - 0x7C540400, // 01B8 CALL R21 2 - 0x5C502A00, // 01B9 MOVE R20 R21 - 0x8C54094A, // 01BA GETMET R21 R4 K74 - 0x7C540200, // 01BB CALL R21 1 - 0x8C58234B, // 01BC GETMET R22 R17 K75 - 0x7C580200, // 01BD CALL R22 1 - 0x8C582D4C, // 01BE GETMET R22 R22 K76 - 0x7C580200, // 01BF CALL R22 1 - 0x8C5C2B4D, // 01C0 GETMET R23 R21 K77 - 0x5C642600, // 01C1 MOVE R25 R19 - 0x5C682C00, // 01C2 MOVE R26 R22 - 0x5C6C2800, // 01C3 MOVE R27 R20 - 0x54720007, // 01C4 LDINT R28 8 - 0x7C5C0A00, // 01C5 CALL R23 5 - 0x88600312, // 01C6 GETMBR R24 R1 K18 - 0x78620001, // 01C7 JMPF R24 #01CA - 0x88600312, // 01C8 GETMBR R24 R1 K18 - 0x70020001, // 01C9 JMP #01CC - 0x88600116, // 01CA GETMBR R24 R0 K22 - 0x8860314E, // 01CB GETMBR R24 R24 K78 - 0x8C641D4F, // 01CC GETMET R25 R14 K79 - 0x5C6C2200, // 01CD MOVE R27 R17 - 0x5C702400, // 01CE MOVE R28 R18 - 0x5C742E00, // 01CF MOVE R29 R23 - 0x5C783000, // 01D0 MOVE R30 R24 - 0x7C640A00, // 01D1 CALL R25 5 - 0x8C641D50, // 01D2 GETMET R25 R14 K80 - 0x7C640200, // 01D3 CALL R25 1 - 0x88640116, // 01D4 GETMBR R25 R0 K22 - 0x8C643351, // 01D5 GETMET R25 R25 K81 - 0x5C6C1C00, // 01D6 MOVE R27 R14 - 0x7C640400, // 01D7 CALL R25 2 - 0x8C640352, // 01D8 GETMET R25 R1 K82 - 0x7C640200, // 01D9 CALL R25 1 - 0x78660002, // 01DA JMPF R25 #01DE - 0x8C640353, // 01DB GETMET R25 R1 K83 - 0x546E003B, // 01DC LDINT R27 60 - 0x7C640400, // 01DD CALL R25 2 - 0x8C641D54, // 01DE GETMET R25 R14 K84 - 0x7C640200, // 01DF CALL R25 1 - 0x8C640D0A, // 01E0 GETMET R25 R6 K10 - 0x7C640200, // 01E1 CALL R25 1 - 0x8C68330B, // 01E2 GETMET R26 R25 K11 - 0x58700006, // 01E3 LDCONST R28 K6 - 0x88740D0C, // 01E4 GETMBR R29 R6 K12 - 0xB87A0400, // 01E5 GETNGBL R30 K2 - 0x88783D33, // 01E6 GETMBR R30 R30 K51 - 0x7C680800, // 01E7 CALL R26 4 - 0x8C68330B, // 01E8 GETMET R26 R25 K11 - 0x58700008, // 01E9 LDCONST R28 K8 - 0x88740D0C, // 01EA GETMBR R29 R6 K12 - 0x58780008, // 01EB LDCONST R30 K8 - 0x7C680800, // 01EC CALL R26 4 - 0x546A0007, // 01ED LDINT R26 8 - 0x900E0A1A, // 01EE SETMBR R3 K5 R26 - 0x80043200, // 01EF RET 1 R25 - 0x70020063, // 01F0 JMP #0255 - 0x54260008, // 01F1 LDINT R9 9 + 0x7C340800, // 00E5 CALL R13 4 + 0x8C341925, // 00E6 GETMET R13 R12 K37 + 0x7C340200, // 00E7 CALL R13 1 + 0x8C380326, // 00E8 GETMET R14 R1 K38 + 0x7C380200, // 00E9 CALL R14 1 + 0x00381A0E, // 00EA ADD R14 R13 R14 + 0x8C3C0927, // 00EB GETMET R15 R4 K39 + 0x7C3C0200, // 00EC CALL R15 1 + 0x8C3C1F28, // 00ED GETMET R15 R15 K40 + 0xB8460400, // 00EE GETNGBL R17 K2 + 0x8C442329, // 00EF GETMET R17 R17 K41 + 0x7C440200, // 00F0 CALL R17 1 + 0x5C481C00, // 00F1 MOVE R18 R14 + 0x7C3C0600, // 00F2 CALL R15 3 + 0x8C400D0A, // 00F3 GETMET R16 R6 K10 + 0x7C400200, // 00F4 CALL R16 1 + 0x8C44210B, // 00F5 GETMET R17 R16 K11 + 0x584C0006, // 00F6 LDCONST R19 K6 + 0x88500D1C, // 00F7 GETMBR R20 R6 K28 + 0x5C541A00, // 00F8 MOVE R21 R13 + 0x7C440800, // 00F9 CALL R17 4 + 0x8C44210B, // 00FA GETMET R17 R16 K11 + 0x584C0008, // 00FB LDCONST R19 K8 + 0x88500D20, // 00FC GETMBR R20 R6 K32 + 0x5C541E00, // 00FD MOVE R21 R15 + 0x7C440800, // 00FE CALL R17 4 + 0x54460004, // 00FF LDINT R17 5 + 0x900E0A11, // 0100 SETMBR R3 K5 R17 + 0x80042000, // 0101 RET 1 R16 + 0x70020122, // 0102 JMP #0226 + 0x5426000A, // 0103 LDINT R9 11 + 0x1C241009, // 0104 EQ R9 R8 R9 + 0x7826000B, // 0105 JMPF R9 #0112 + 0x8C240507, // 0106 GETMET R9 R2 K7 + 0x582C0006, // 0107 LDCONST R11 K6 + 0x7C240400, // 0108 CALL R9 2 + 0x8C28032B, // 0109 GETMET R10 R1 K43 + 0x5C301200, // 010A MOVE R12 R9 + 0x7C280400, // 010B CALL R10 2 + 0xB82A0400, // 010C GETNGBL R10 K2 + 0x8828152C, // 010D GETMBR R10 R10 K44 + 0x900E340A, // 010E SETMBR R3 K26 R10 + 0x4C280000, // 010F LDNIL R10 + 0x80041400, // 0110 RET 1 R10 + 0x70020113, // 0111 JMP #0226 + 0x54260005, // 0112 LDINT R9 6 + 0x1C241009, // 0113 EQ R9 R8 R9 + 0x782600B9, // 0114 JMPF R9 #01CF + 0xB8264400, // 0115 GETNGBL R9 K34 + 0x8C24132D, // 0116 GETMET R9 R9 K45 + 0x602C0008, // 0117 GETGBL R11 G8 + 0x5C300400, // 0118 MOVE R12 R2 + 0x7C2C0200, // 0119 CALL R11 1 + 0x002E5C0B, // 011A ADD R11 K46 R11 + 0x54320003, // 011B LDINT R12 4 + 0x7C240600, // 011C CALL R9 3 + 0x8C240507, // 011D GETMET R9 R2 K7 + 0x582C0006, // 011E LDCONST R11 K6 + 0x7C240400, // 011F CALL R9 2 + 0x8C280507, // 0120 GETMET R10 R2 K7 + 0x58300008, // 0121 LDCONST R12 K8 + 0x7C280400, // 0122 CALL R10 2 + 0x602C000C, // 0123 GETGBL R11 G12 + 0x5C301400, // 0124 MOVE R12 R10 + 0x7C2C0200, // 0125 CALL R11 1 + 0x1C2C1706, // 0126 EQ R11 R11 K6 + 0x782E0000, // 0127 JMPF R11 #0129 + 0x4C280000, // 0128 LDNIL R10 + 0x8C2C0507, // 0129 GETMET R11 R2 K7 + 0x5834000F, // 012A LDCONST R13 K15 + 0x7C2C0400, // 012B CALL R11 2 + 0x8C300507, // 012C GETMET R12 R2 K7 + 0x58380011, // 012D LDCONST R14 K17 + 0x7C300400, // 012E CALL R12 2 + 0x8C340507, // 012F GETMET R13 R2 K7 + 0x543E0003, // 0130 LDINT R15 4 + 0x7C340400, // 0131 CALL R13 2 + 0x8C38032F, // 0132 GETMET R14 R1 K47 + 0x7C380200, // 0133 CALL R14 1 + 0x4C3C0000, // 0134 LDNIL R15 + 0x1C381C0F, // 0135 EQ R14 R14 R15 + 0x783A0006, // 0136 JMPF R14 #013E + 0xB83A4400, // 0137 GETNGBL R14 K34 + 0x8C381D2D, // 0138 GETMET R14 R14 K45 + 0x58400030, // 0139 LDCONST R16 K48 + 0x5844000F, // 013A LDCONST R17 K15 + 0x7C380600, // 013B CALL R14 3 + 0x4C380000, // 013C LDNIL R14 + 0x80041C00, // 013D RET 1 R14 + 0x88380116, // 013E GETMBR R14 R0 K22 + 0x88381D31, // 013F GETMBR R14 R14 K49 + 0x8C381D32, // 0140 GETMET R14 R14 K50 + 0x7C380200, // 0141 CALL R14 1 + 0x8C3C1D33, // 0142 GETMET R15 R14 K51 + 0x8C44032F, // 0143 GETMET R17 R1 K47 + 0x7C440200, // 0144 CALL R17 1 + 0x7C3C0400, // 0145 CALL R15 2 + 0x8C3C1D34, // 0146 GETMET R15 R14 K52 + 0x5C441200, // 0147 MOVE R17 R9 + 0x5C481400, // 0148 MOVE R18 R10 + 0x7C3C0600, // 0149 CALL R15 3 + 0x8C3C1D35, // 014A GETMET R15 R14 K53 + 0x5C441600, // 014B MOVE R17 R11 + 0x7C3C0400, // 014C CALL R15 2 + 0x8C3C1D36, // 014D GETMET R15 R14 K54 + 0x5C441800, // 014E MOVE R17 R12 + 0x5C481A00, // 014F MOVE R18 R13 + 0x7C3C0600, // 0150 CALL R15 3 + 0x8C3C1D37, // 0151 GETMET R15 R14 K55 + 0x8C440338, // 0152 GETMET R17 R1 K56 + 0x7C440200, // 0153 CALL R17 1 + 0x7C3C0400, // 0154 CALL R15 2 + 0xB83E0400, // 0155 GETNGBL R15 K2 + 0x883C1F03, // 0156 GETMBR R15 R15 K3 + 0x8C3C1F39, // 0157 GETMET R15 R15 K57 + 0x5C441200, // 0158 MOVE R17 R9 + 0x7C3C0400, // 0159 CALL R15 2 + 0x8C401F3A, // 015A GETMET R16 R15 K58 + 0x544A0005, // 015B LDINT R18 6 + 0x7C400400, // 015C CALL R16 2 + 0x8C442107, // 015D GETMET R17 R16 K7 + 0x544E0014, // 015E LDINT R19 21 + 0x7C440400, // 015F CALL R17 2 + 0x8C482107, // 0160 GETMET R18 R16 K7 + 0x54520010, // 0161 LDINT R20 17 + 0x7C480400, // 0162 CALL R18 2 + 0x5C4C2200, // 0163 MOVE R19 R17 + 0x784E0001, // 0164 JMPF R19 #0167 + 0x5C4C2400, // 0165 MOVE R19 R18 + 0x744E0006, // 0166 JMPT R19 #016E + 0xB84E4400, // 0167 GETNGBL R19 K34 + 0x8C4C272D, // 0168 GETMET R19 R19 K45 + 0x5854003B, // 0169 LDCONST R21 K59 + 0x5858000F, // 016A LDCONST R22 K15 + 0x7C4C0600, // 016B CALL R19 3 + 0x504C0000, // 016C LDBOOL R19 0 0 + 0x80042600, // 016D RET 1 R19 + 0x604C0004, // 016E GETGBL R19 G4 + 0x5C502200, // 016F MOVE R20 R17 + 0x7C4C0200, // 0170 CALL R19 1 + 0x1C4C273C, // 0171 EQ R19 R19 K60 + 0x784E0007, // 0172 JMPF R19 #017B + 0xB84E7A00, // 0173 GETNGBL R19 K61 + 0x8C4C273E, // 0174 GETMET R19 R19 K62 + 0x5C542200, // 0175 MOVE R21 R17 + 0x7C4C0400, // 0176 CALL R19 2 + 0x8C4C273F, // 0177 GETMET R19 R19 K63 + 0x7C4C0200, // 0178 CALL R19 1 + 0x5C442600, // 0179 MOVE R17 R19 + 0x70020002, // 017A JMP #017E + 0x8C4C233F, // 017B GETMET R19 R17 K63 + 0x7C4C0200, // 017C CALL R19 1 + 0x5C442600, // 017D MOVE R17 R19 + 0x604C0004, // 017E GETGBL R19 G4 + 0x5C502400, // 017F MOVE R20 R18 + 0x7C4C0200, // 0180 CALL R19 1 + 0x1C4C273C, // 0181 EQ R19 R19 K60 + 0x784E0007, // 0182 JMPF R19 #018B + 0xB84E7A00, // 0183 GETNGBL R19 K61 + 0x8C4C273E, // 0184 GETMET R19 R19 K62 + 0x5C542400, // 0185 MOVE R21 R18 + 0x7C4C0400, // 0186 CALL R19 2 + 0x8C4C273F, // 0187 GETMET R19 R19 K63 + 0x7C4C0200, // 0188 CALL R19 1 + 0x5C482600, // 0189 MOVE R18 R19 + 0x70020002, // 018A JMP #018E + 0x8C4C253F, // 018B GETMET R19 R18 K63 + 0x7C4C0200, // 018C CALL R19 1 + 0x5C482600, // 018D MOVE R18 R19 + 0x8C4C0340, // 018E GETMET R19 R1 K64 + 0x7C4C0200, // 018F CALL R19 1 + 0x40521141, // 0190 CONNECT R20 K8 K65 + 0x944C2614, // 0191 GETIDX R19 R19 R20 + 0x60540015, // 0192 GETGBL R21 G21 + 0x7C540000, // 0193 CALL R21 0 + 0x8C542B42, // 0194 GETMET R21 R21 K66 + 0x585C0043, // 0195 LDCONST R23 K67 + 0x7C540400, // 0196 CALL R21 2 + 0x5C502A00, // 0197 MOVE R20 R21 + 0x8C540944, // 0198 GETMET R21 R4 K68 + 0x7C540200, // 0199 CALL R21 1 + 0x8C582345, // 019A GETMET R22 R17 K69 + 0x7C580200, // 019B CALL R22 1 + 0x8C582D46, // 019C GETMET R22 R22 K70 + 0x7C580200, // 019D CALL R22 1 + 0x8C5C2B47, // 019E GETMET R23 R21 K71 + 0x5C642600, // 019F MOVE R25 R19 + 0x5C682C00, // 01A0 MOVE R26 R22 + 0x5C6C2800, // 01A1 MOVE R27 R20 + 0x54720007, // 01A2 LDINT R28 8 + 0x7C5C0A00, // 01A3 CALL R23 5 + 0x88600312, // 01A4 GETMBR R24 R1 K18 + 0x78620001, // 01A5 JMPF R24 #01A8 + 0x88600312, // 01A6 GETMBR R24 R1 K18 + 0x70020001, // 01A7 JMP #01AA + 0x88600116, // 01A8 GETMBR R24 R0 K22 + 0x88603148, // 01A9 GETMBR R24 R24 K72 + 0x8C641D49, // 01AA GETMET R25 R14 K73 + 0x5C6C2200, // 01AB MOVE R27 R17 + 0x5C702400, // 01AC MOVE R28 R18 + 0x5C742E00, // 01AD MOVE R29 R23 + 0x5C783000, // 01AE MOVE R30 R24 + 0x7C640A00, // 01AF CALL R25 5 + 0x8C641D4A, // 01B0 GETMET R25 R14 K74 + 0x7C640200, // 01B1 CALL R25 1 + 0x88640116, // 01B2 GETMBR R25 R0 K22 + 0x8C64334B, // 01B3 GETMET R25 R25 K75 + 0x5C6C1C00, // 01B4 MOVE R27 R14 + 0x7C640400, // 01B5 CALL R25 2 + 0x8C64034C, // 01B6 GETMET R25 R1 K76 + 0x7C640200, // 01B7 CALL R25 1 + 0x78660002, // 01B8 JMPF R25 #01BC + 0x8C64034D, // 01B9 GETMET R25 R1 K77 + 0x546E003B, // 01BA LDINT R27 60 + 0x7C640400, // 01BB CALL R25 2 + 0x8C641D4E, // 01BC GETMET R25 R14 K78 + 0x7C640200, // 01BD CALL R25 1 + 0x8C640D0A, // 01BE GETMET R25 R6 K10 + 0x7C640200, // 01BF CALL R25 1 + 0x8C68330B, // 01C0 GETMET R26 R25 K11 + 0x58700006, // 01C1 LDCONST R28 K6 + 0x88740D0C, // 01C2 GETMBR R29 R6 K12 + 0xB87A0400, // 01C3 GETNGBL R30 K2 + 0x88783D2C, // 01C4 GETMBR R30 R30 K44 + 0x7C680800, // 01C5 CALL R26 4 + 0x8C68330B, // 01C6 GETMET R26 R25 K11 + 0x58700008, // 01C7 LDCONST R28 K8 + 0x88740D0C, // 01C8 GETMBR R29 R6 K12 + 0x58780008, // 01C9 LDCONST R30 K8 + 0x7C680800, // 01CA CALL R26 4 + 0x546A0007, // 01CB LDINT R26 8 + 0x900E0A1A, // 01CC SETMBR R3 K5 R26 + 0x80043200, // 01CD RET 1 R25 + 0x70020056, // 01CE JMP #0226 + 0x54260008, // 01CF LDINT R9 9 + 0x1C241009, // 01D0 EQ R9 R8 R9 + 0x7826001E, // 01D1 JMPF R9 #01F1 + 0x8C240507, // 01D2 GETMET R9 R2 K7 + 0x582C0006, // 01D3 LDCONST R11 K6 + 0x7C240400, // 01D4 CALL R9 2 + 0x8C28034F, // 01D5 GETMET R10 R1 K79 + 0x5C301200, // 01D6 MOVE R12 R9 + 0x7C280400, // 01D7 CALL R10 2 + 0xB82A4400, // 01D8 GETNGBL R10 K34 + 0x8C28152D, // 01D9 GETMET R10 R10 K45 + 0x8C300B50, // 01DA GETMET R12 R5 K80 + 0x58380051, // 01DB LDCONST R14 K81 + 0x883C0312, // 01DC GETMBR R15 R1 K18 + 0x8C3C1F52, // 01DD GETMET R15 R15 K82 + 0x7C3C0200, // 01DE CALL R15 1 + 0x8C3C1F45, // 01DF GETMET R15 R15 K69 + 0x7C3C0200, // 01E0 CALL R15 1 + 0x8C3C1F46, // 01E1 GETMET R15 R15 K70 + 0x7C3C0200, // 01E2 CALL R15 1 + 0x8C3C1F53, // 01E3 GETMET R15 R15 K83 + 0x7C3C0200, // 01E4 CALL R15 1 + 0x60400008, // 01E5 GETGBL R16 G8 + 0x5C441200, // 01E6 MOVE R17 R9 + 0x7C400200, // 01E7 CALL R16 1 + 0x7C300800, // 01E8 CALL R12 4 + 0x58340011, // 01E9 LDCONST R13 K17 + 0x7C280600, // 01EA CALL R10 3 + 0xB82A0400, // 01EB GETNGBL R10 K2 + 0x8828152C, // 01EC GETMBR R10 R10 K44 + 0x900E340A, // 01ED SETMBR R3 K26 R10 + 0x4C280000, // 01EE LDNIL R10 + 0x80041400, // 01EF RET 1 R10 + 0x70020034, // 01F0 JMP #0226 + 0x54260009, // 01F1 LDINT R9 10 0x1C241009, // 01F2 EQ R9 R8 R9 - 0x7826001E, // 01F3 JMPF R9 #0213 + 0x78260031, // 01F3 JMPF R9 #0226 0x8C240507, // 01F4 GETMET R9 R2 K7 0x582C0006, // 01F5 LDCONST R11 K6 0x7C240400, // 01F6 CALL R9 2 - 0x8C280355, // 01F7 GETMET R10 R1 K85 - 0x5C301200, // 01F8 MOVE R12 R9 - 0x7C280400, // 01F9 CALL R10 2 - 0xB82A4400, // 01FA GETNGBL R10 K34 - 0x8C281527, // 01FB GETMET R10 R10 K39 - 0x8C300B2D, // 01FC GETMET R12 R5 K45 - 0x58380056, // 01FD LDCONST R14 K86 - 0x883C0312, // 01FE GETMBR R15 R1 K18 - 0x8C3C1F57, // 01FF GETMET R15 R15 K87 - 0x7C3C0200, // 0200 CALL R15 1 - 0x8C3C1F4B, // 0201 GETMET R15 R15 K75 - 0x7C3C0200, // 0202 CALL R15 1 - 0x8C3C1F4C, // 0203 GETMET R15 R15 K76 - 0x7C3C0200, // 0204 CALL R15 1 - 0x8C3C1F29, // 0205 GETMET R15 R15 K41 - 0x7C3C0200, // 0206 CALL R15 1 - 0x60400008, // 0207 GETGBL R16 G8 - 0x5C441200, // 0208 MOVE R17 R9 - 0x7C400200, // 0209 CALL R16 1 - 0x7C300800, // 020A CALL R12 4 - 0x5834000F, // 020B LDCONST R13 K15 - 0x7C280600, // 020C CALL R10 3 - 0xB82A0400, // 020D GETNGBL R10 K2 - 0x88281533, // 020E GETMBR R10 R10 K51 - 0x900E340A, // 020F SETMBR R3 K26 R10 - 0x4C280000, // 0210 LDNIL R10 - 0x80041400, // 0211 RET 1 R10 - 0x70020041, // 0212 JMP #0255 - 0x54260009, // 0213 LDINT R9 10 - 0x1C241009, // 0214 EQ R9 R8 R9 - 0x7826003E, // 0215 JMPF R9 #0255 - 0x8C240507, // 0216 GETMET R9 R2 K7 - 0x582C0006, // 0217 LDCONST R11 K6 - 0x7C240400, // 0218 CALL R9 2 - 0x60280008, // 0219 GETGBL R10 G8 - 0x5C2C1200, // 021A MOVE R11 R9 - 0x7C280200, // 021B CALL R10 1 - 0x002AB00A, // 021C ADD R10 K88 R10 - 0x900E4E0A, // 021D SETMBR R3 K39 R10 - 0x60280010, // 021E GETGBL R10 G16 - 0x882C0116, // 021F GETMBR R11 R0 K22 - 0x882C1737, // 0220 GETMBR R11 R11 K55 - 0x8C2C1759, // 0221 GETMET R11 R11 K89 - 0x7C2C0200, // 0222 CALL R11 1 - 0x7C280200, // 0223 CALL R10 1 - 0xA802001D, // 0224 EXBLK 0 #0243 - 0x5C2C1400, // 0225 MOVE R11 R10 - 0x7C2C0000, // 0226 CALL R11 0 - 0x8C30175A, // 0227 GETMET R12 R11 K90 - 0x7C300200, // 0228 CALL R12 1 - 0x1C301809, // 0229 EQ R12 R12 R9 - 0x78320015, // 022A JMPF R12 #0241 - 0xB8324400, // 022B GETNGBL R12 K34 - 0x8C301927, // 022C GETMET R12 R12 K39 - 0x8C381757, // 022D GETMET R14 R11 K87 - 0x7C380200, // 022E CALL R14 1 - 0x8C381D4B, // 022F GETMET R14 R14 K75 - 0x7C380200, // 0230 CALL R14 1 - 0x8C381D4C, // 0231 GETMET R14 R14 K76 - 0x7C380200, // 0232 CALL R14 1 - 0x8C381D29, // 0233 GETMET R14 R14 K41 - 0x7C380200, // 0234 CALL R14 1 - 0x003AB60E, // 0235 ADD R14 K91 R14 - 0x583C000F, // 0236 LDCONST R15 K15 - 0x7C300600, // 0237 CALL R12 3 - 0xB8324400, // 0238 GETNGBL R12 K34 - 0x8C30195C, // 0239 GETMET R12 R12 K92 - 0x543A07CF, // 023A LDINT R14 2000 - 0x843C0000, // 023B CLOSURE R15 P0 - 0x7C300600, // 023C CALL R12 3 - 0x50300200, // 023D LDBOOL R12 1 0 - 0xA0000000, // 023E CLOSE R0 - 0xA8040001, // 023F EXBLK 1 1 - 0x80041800, // 0240 RET 1 R12 - 0xA0280000, // 0241 CLOSE R10 - 0x7001FFE1, // 0242 JMP #0225 - 0x5828005D, // 0243 LDCONST R10 K93 - 0xAC280200, // 0244 CATCH R10 1 0 - 0xB0080000, // 0245 RAISE 2 R0 R0 - 0xB82A4400, // 0246 GETNGBL R10 K34 - 0x8C281527, // 0247 GETMET R10 R10 K39 - 0x60300008, // 0248 GETGBL R12 G8 - 0x5C341200, // 0249 MOVE R13 R9 - 0x7C300200, // 024A CALL R12 1 - 0x0032BC0C, // 024B ADD R12 K94 R12 - 0x0030195F, // 024C ADD R12 R12 K95 - 0x5834000F, // 024D LDCONST R13 K15 - 0x7C280600, // 024E CALL R10 3 - 0xB82A0400, // 024F GETNGBL R10 K2 - 0x88281560, // 0250 GETMBR R10 R10 K96 - 0x900E340A, // 0251 SETMBR R3 K26 R10 - 0x4C280000, // 0252 LDNIL R10 - 0xA0000000, // 0253 CLOSE R0 - 0x80041400, // 0254 RET 1 R10 - 0x7002009A, // 0255 JMP #02F1 - 0x5426003B, // 0256 LDINT R9 60 - 0x1C240E09, // 0257 EQ R9 R7 R9 - 0x78260084, // 0258 JMPF R9 #02DE - 0x1C241106, // 0259 EQ R9 R8 K6 - 0x78260064, // 025A JMPF R9 #02C0 - 0x8C240507, // 025B GETMET R9 R2 K7 - 0x582C0006, // 025C LDCONST R11 K6 - 0x7C240400, // 025D CALL R9 2 - 0x8C280507, // 025E GETMET R10 R2 K7 - 0x58300008, // 025F LDCONST R12 K8 - 0x7C280400, // 0260 CALL R10 2 - 0x8C2C0507, // 0261 GETMET R11 R2 K7 - 0x5834000F, // 0262 LDCONST R13 K15 - 0x7C2C0400, // 0263 CALL R11 2 - 0x8C300507, // 0264 GETMET R12 R2 K7 - 0x58380011, // 0265 LDCONST R14 K17 - 0x7C300400, // 0266 CALL R12 2 - 0x8C340507, // 0267 GETMET R13 R2 K7 - 0x543E0003, // 0268 LDINT R15 4 - 0x7C340400, // 0269 CALL R13 2 - 0xB83A4400, // 026A GETNGBL R14 K34 - 0x8C381D27, // 026B GETMET R14 R14 K39 - 0x8C400B2D, // 026C GETMET R16 R5 K45 - 0x58480061, // 026D LDCONST R18 K97 - 0x5C4C1200, // 026E MOVE R19 R9 - 0x8C501529, // 026F GETMET R20 R10 K41 - 0x7C500200, // 0270 CALL R20 1 - 0x5C541600, // 0271 MOVE R21 R11 - 0x5C581800, // 0272 MOVE R22 R12 - 0x8C5C1B29, // 0273 GETMET R23 R13 K41 - 0x7C5C0200, // 0274 CALL R23 1 - 0x7C400E00, // 0275 CALL R16 7 - 0x5844000F, // 0276 LDCONST R17 K15 - 0x7C380600, // 0277 CALL R14 3 - 0x4C380000, // 0278 LDNIL R14 - 0x1C38120E, // 0279 EQ R14 R9 R14 - 0x743A000B, // 027A JMPT R14 #0287 - 0x4C380000, // 027B LDNIL R14 - 0x1C38140E, // 027C EQ R14 R10 R14 - 0x743A0008, // 027D JMPT R14 #0287 - 0x4C380000, // 027E LDNIL R14 - 0x1C38160E, // 027F EQ R14 R11 R14 - 0x743A0005, // 0280 JMPT R14 #0287 - 0x4C380000, // 0281 LDNIL R14 - 0x1C38180E, // 0282 EQ R14 R12 R14 - 0x743A0002, // 0283 JMPT R14 #0287 - 0x4C380000, // 0284 LDNIL R14 - 0x1C381A0E, // 0285 EQ R14 R13 R14 - 0x783A0005, // 0286 JMPF R14 #028D - 0xB83A0400, // 0287 GETNGBL R14 K2 - 0x88381D62, // 0288 GETMBR R14 R14 K98 - 0x900E340E, // 0289 SETMBR R3 K26 R14 - 0x4C380000, // 028A LDNIL R14 - 0xA0000000, // 028B CLOSE R0 - 0x80041C00, // 028C RET 1 R14 - 0x6038000C, // 028D GETGBL R14 G12 - 0x5C3C1400, // 028E MOVE R15 R10 - 0x7C380200, // 028F CALL R14 1 - 0x543E001F, // 0290 LDINT R15 32 - 0x54420040, // 0291 LDINT R16 65 - 0x003C1E10, // 0292 ADD R15 R15 R16 - 0x20381C0F, // 0293 NE R14 R14 R15 - 0x743A000B, // 0294 JMPT R14 #02A1 - 0x6038000C, // 0295 GETGBL R14 G12 - 0x5C3C1A00, // 0296 MOVE R15 R13 - 0x7C380200, // 0297 CALL R14 1 - 0x543E000F, // 0298 LDINT R15 16 - 0x14381C0F, // 0299 LT R14 R14 R15 - 0x743A0005, // 029A JMPT R14 #02A1 - 0x6038000C, // 029B GETGBL R14 G12 - 0x5C3C1A00, // 029C MOVE R15 R13 - 0x7C380200, // 029D CALL R14 1 - 0x543E001F, // 029E LDINT R15 32 - 0x24381C0F, // 029F GT R14 R14 R15 - 0x783A0009, // 02A0 JMPF R14 #02AB - 0xB83A4400, // 02A1 GETNGBL R14 K34 - 0x8C381D27, // 02A2 GETMET R14 R14 K39 - 0x58400063, // 02A3 LDCONST R16 K99 - 0x7C380400, // 02A4 CALL R14 2 - 0xB83A0400, // 02A5 GETNGBL R14 K2 - 0x88381D64, // 02A6 GETMBR R14 R14 K100 - 0x900E340E, // 02A7 SETMBR R3 K26 R14 - 0x4C380000, // 02A8 LDNIL R14 - 0xA0000000, // 02A9 CLOSE R0 - 0x80041C00, // 02AA RET 1 R14 - 0x543A001E, // 02AB LDINT R14 31 - 0x403A0C0E, // 02AC CONNECT R14 K6 R14 - 0x9438140E, // 02AD GETIDX R14 R10 R14 - 0x543E001F, // 02AE LDINT R15 32 - 0x403C1F47, // 02AF CONNECT R15 R15 K71 - 0x943C140F, // 02B0 GETIDX R15 R10 R15 - 0x88400116, // 02B1 GETMBR R16 R0 K22 - 0x8C402165, // 02B2 GETMET R16 R16 K101 - 0x5C481200, // 02B3 MOVE R18 R9 - 0x5C4C1800, // 02B4 MOVE R19 R12 - 0x5C501600, // 02B5 MOVE R20 R11 - 0x5C541A00, // 02B6 MOVE R21 R13 - 0x5C581C00, // 02B7 MOVE R22 R14 - 0x5C5C1E00, // 02B8 MOVE R23 R15 - 0x8C600366, // 02B9 GETMET R24 R1 K102 - 0x7C600200, // 02BA CALL R24 1 - 0x7C401000, // 02BB CALL R16 8 - 0x50400200, // 02BC LDBOOL R16 1 0 - 0xA0000000, // 02BD CLOSE R0 - 0x80042000, // 02BE RET 1 R16 - 0x7002001C, // 02BF JMP #02DD - 0x1C241108, // 02C0 EQ R9 R8 K8 - 0x78260012, // 02C1 JMPF R9 #02D5 - 0x8C240507, // 02C2 GETMET R9 R2 K7 - 0x582C0006, // 02C3 LDCONST R11 K6 - 0x7C240400, // 02C4 CALL R9 2 - 0xB82A4400, // 02C5 GETNGBL R10 K34 - 0x8C281527, // 02C6 GETMET R10 R10 K39 - 0x60300008, // 02C7 GETGBL R12 G8 - 0x5C341200, // 02C8 MOVE R13 R9 - 0x7C300200, // 02C9 CALL R12 1 - 0x0032CE0C, // 02CA ADD R12 K103 R12 - 0x5834000F, // 02CB LDCONST R13 K15 - 0x7C280600, // 02CC CALL R10 3 - 0x88280116, // 02CD GETMBR R10 R0 K22 - 0x8C281568, // 02CE GETMET R10 R10 K104 - 0x5C301200, // 02CF MOVE R12 R9 - 0x7C280400, // 02D0 CALL R10 2 - 0x50280200, // 02D1 LDBOOL R10 1 0 - 0xA0000000, // 02D2 CLOSE R0 - 0x80041400, // 02D3 RET 1 R10 - 0x70020007, // 02D4 JMP #02DD - 0x1C24110F, // 02D5 EQ R9 R8 K15 - 0x78260005, // 02D6 JMPF R9 #02DD - 0x88240116, // 02D7 GETMBR R9 R0 K22 - 0x8C241369, // 02D8 GETMET R9 R9 K105 - 0x7C240200, // 02D9 CALL R9 1 - 0x50240200, // 02DA LDBOOL R9 1 0 - 0xA0000000, // 02DB CLOSE R0 - 0x80041200, // 02DC RET 1 R9 - 0x70020012, // 02DD JMP #02F1 - 0x54260029, // 02DE LDINT R9 42 - 0x1C240E09, // 02DF EQ R9 R7 R9 - 0x78260005, // 02E0 JMPF R9 #02E7 - 0x1C241106, // 02E1 EQ R9 R8 K6 - 0x78260002, // 02E2 JMPF R9 #02E6 - 0x50240200, // 02E3 LDBOOL R9 1 0 - 0xA0000000, // 02E4 CLOSE R0 - 0x80041200, // 02E5 RET 1 R9 - 0x70020009, // 02E6 JMP #02F1 - 0x60240003, // 02E7 GETGBL R9 G3 - 0x5C280000, // 02E8 MOVE R10 R0 - 0x7C240200, // 02E9 CALL R9 1 - 0x8C24136A, // 02EA GETMET R9 R9 K106 - 0x5C2C0200, // 02EB MOVE R11 R1 - 0x5C300400, // 02EC MOVE R12 R2 - 0x5C340600, // 02ED MOVE R13 R3 - 0x7C240800, // 02EE CALL R9 4 - 0xA0000000, // 02EF CLOSE R0 - 0x80041200, // 02F0 RET 1 R9 - 0xA0000000, // 02F1 CLOSE R0 - 0x80000000, // 02F2 RET 0 + 0x60280008, // 01F7 GETGBL R10 G8 + 0x5C2C1200, // 01F8 MOVE R11 R9 + 0x7C280200, // 01F9 CALL R10 1 + 0x002AA80A, // 01FA ADD R10 K84 R10 + 0x900E5A0A, // 01FB SETMBR R3 K45 R10 + 0x60280010, // 01FC GETGBL R10 G16 + 0x882C0116, // 01FD GETMBR R11 R0 K22 + 0x882C1731, // 01FE GETMBR R11 R11 K49 + 0x8C2C1755, // 01FF GETMET R11 R11 K85 + 0x7C2C0200, // 0200 CALL R11 1 + 0x7C280200, // 0201 CALL R10 1 + 0xA8020010, // 0202 EXBLK 0 #0214 + 0x5C2C1400, // 0203 MOVE R11 R10 + 0x7C2C0000, // 0204 CALL R11 0 + 0x8C301756, // 0205 GETMET R12 R11 K86 + 0x7C300200, // 0206 CALL R12 1 + 0x1C301809, // 0207 EQ R12 R12 R9 + 0x78320008, // 0208 JMPF R12 #0212 + 0xB8324400, // 0209 GETNGBL R12 K34 + 0x8C301957, // 020A GETMET R12 R12 K87 + 0x543A07CF, // 020B LDINT R14 2000 + 0x843C0000, // 020C CLOSURE R15 P0 + 0x7C300600, // 020D CALL R12 3 + 0x50300200, // 020E LDBOOL R12 1 0 + 0xA0000000, // 020F CLOSE R0 + 0xA8040001, // 0210 EXBLK 1 1 + 0x80041800, // 0211 RET 1 R12 + 0xA0280000, // 0212 CLOSE R10 + 0x7001FFEE, // 0213 JMP #0203 + 0x58280058, // 0214 LDCONST R10 K88 + 0xAC280200, // 0215 CATCH R10 1 0 + 0xB0080000, // 0216 RAISE 2 R0 R0 + 0xB82A4400, // 0217 GETNGBL R10 K34 + 0x8C28152D, // 0218 GETMET R10 R10 K45 + 0x60300008, // 0219 GETGBL R12 G8 + 0x5C341200, // 021A MOVE R13 R9 + 0x7C300200, // 021B CALL R12 1 + 0x0032B20C, // 021C ADD R12 K89 R12 + 0x0030195A, // 021D ADD R12 R12 K90 + 0x5834000F, // 021E LDCONST R13 K15 + 0x7C280600, // 021F CALL R10 3 + 0xB82A0400, // 0220 GETNGBL R10 K2 + 0x8828155B, // 0221 GETMBR R10 R10 K91 + 0x900E340A, // 0222 SETMBR R3 K26 R10 + 0x4C280000, // 0223 LDNIL R10 + 0xA0000000, // 0224 CLOSE R0 + 0x80041400, // 0225 RET 1 R10 + 0x7002009B, // 0226 JMP #02C3 + 0x5426003B, // 0227 LDINT R9 60 + 0x1C240E09, // 0228 EQ R9 R7 R9 + 0x78260085, // 0229 JMPF R9 #02B0 + 0x1C241106, // 022A EQ R9 R8 K6 + 0x78260065, // 022B JMPF R9 #0292 + 0x8C240507, // 022C GETMET R9 R2 K7 + 0x582C0006, // 022D LDCONST R11 K6 + 0x7C240400, // 022E CALL R9 2 + 0x8C280507, // 022F GETMET R10 R2 K7 + 0x58300008, // 0230 LDCONST R12 K8 + 0x7C280400, // 0231 CALL R10 2 + 0x8C2C0507, // 0232 GETMET R11 R2 K7 + 0x5834000F, // 0233 LDCONST R13 K15 + 0x7C2C0400, // 0234 CALL R11 2 + 0x8C300507, // 0235 GETMET R12 R2 K7 + 0x58380011, // 0236 LDCONST R14 K17 + 0x7C300400, // 0237 CALL R12 2 + 0x8C340507, // 0238 GETMET R13 R2 K7 + 0x543E0003, // 0239 LDINT R15 4 + 0x7C340400, // 023A CALL R13 2 + 0xB83A4400, // 023B GETNGBL R14 K34 + 0x8C381D2D, // 023C GETMET R14 R14 K45 + 0x8C400B50, // 023D GETMET R16 R5 K80 + 0x5848005C, // 023E LDCONST R18 K92 + 0x5C4C1200, // 023F MOVE R19 R9 + 0x8C501553, // 0240 GETMET R20 R10 K83 + 0x7C500200, // 0241 CALL R20 1 + 0x5C541600, // 0242 MOVE R21 R11 + 0x5C581800, // 0243 MOVE R22 R12 + 0x8C5C1B53, // 0244 GETMET R23 R13 K83 + 0x7C5C0200, // 0245 CALL R23 1 + 0x7C400E00, // 0246 CALL R16 7 + 0x54460003, // 0247 LDINT R17 4 + 0x7C380600, // 0248 CALL R14 3 + 0x4C380000, // 0249 LDNIL R14 + 0x1C38120E, // 024A EQ R14 R9 R14 + 0x743A000B, // 024B JMPT R14 #0258 + 0x4C380000, // 024C LDNIL R14 + 0x1C38140E, // 024D EQ R14 R10 R14 + 0x743A0008, // 024E JMPT R14 #0258 + 0x4C380000, // 024F LDNIL R14 + 0x1C38160E, // 0250 EQ R14 R11 R14 + 0x743A0005, // 0251 JMPT R14 #0258 + 0x4C380000, // 0252 LDNIL R14 + 0x1C38180E, // 0253 EQ R14 R12 R14 + 0x743A0002, // 0254 JMPT R14 #0258 + 0x4C380000, // 0255 LDNIL R14 + 0x1C381A0E, // 0256 EQ R14 R13 R14 + 0x783A0005, // 0257 JMPF R14 #025E + 0xB83A0400, // 0258 GETNGBL R14 K2 + 0x88381D5D, // 0259 GETMBR R14 R14 K93 + 0x900E340E, // 025A SETMBR R3 K26 R14 + 0x4C380000, // 025B LDNIL R14 + 0xA0000000, // 025C CLOSE R0 + 0x80041C00, // 025D RET 1 R14 + 0x6038000C, // 025E GETGBL R14 G12 + 0x5C3C1400, // 025F MOVE R15 R10 + 0x7C380200, // 0260 CALL R14 1 + 0x543E001F, // 0261 LDINT R15 32 + 0x54420040, // 0262 LDINT R16 65 + 0x003C1E10, // 0263 ADD R15 R15 R16 + 0x20381C0F, // 0264 NE R14 R14 R15 + 0x743A000B, // 0265 JMPT R14 #0272 + 0x6038000C, // 0266 GETGBL R14 G12 + 0x5C3C1A00, // 0267 MOVE R15 R13 + 0x7C380200, // 0268 CALL R14 1 + 0x543E000F, // 0269 LDINT R15 16 + 0x14381C0F, // 026A LT R14 R14 R15 + 0x743A0005, // 026B JMPT R14 #0272 + 0x6038000C, // 026C GETGBL R14 G12 + 0x5C3C1A00, // 026D MOVE R15 R13 + 0x7C380200, // 026E CALL R14 1 + 0x543E001F, // 026F LDINT R15 32 + 0x24381C0F, // 0270 GT R14 R14 R15 + 0x783A000A, // 0271 JMPF R14 #027D + 0xB83A4400, // 0272 GETNGBL R14 K34 + 0x8C381D2D, // 0273 GETMET R14 R14 K45 + 0x5840005E, // 0274 LDCONST R16 K94 + 0x5844000F, // 0275 LDCONST R17 K15 + 0x7C380600, // 0276 CALL R14 3 + 0xB83A0400, // 0277 GETNGBL R14 K2 + 0x88381D5F, // 0278 GETMBR R14 R14 K95 + 0x900E340E, // 0279 SETMBR R3 K26 R14 + 0x4C380000, // 027A LDNIL R14 + 0xA0000000, // 027B CLOSE R0 + 0x80041C00, // 027C RET 1 R14 + 0x543A001E, // 027D LDINT R14 31 + 0x403A0C0E, // 027E CONNECT R14 K6 R14 + 0x9438140E, // 027F GETIDX R14 R10 R14 + 0x543E001F, // 0280 LDINT R15 32 + 0x403C1F41, // 0281 CONNECT R15 R15 K65 + 0x943C140F, // 0282 GETIDX R15 R10 R15 + 0x88400116, // 0283 GETMBR R16 R0 K22 + 0x8C402160, // 0284 GETMET R16 R16 K96 + 0x5C481200, // 0285 MOVE R18 R9 + 0x5C4C1800, // 0286 MOVE R19 R12 + 0x5C501600, // 0287 MOVE R20 R11 + 0x5C541A00, // 0288 MOVE R21 R13 + 0x5C581C00, // 0289 MOVE R22 R14 + 0x5C5C1E00, // 028A MOVE R23 R15 + 0x8C600361, // 028B GETMET R24 R1 K97 + 0x7C600200, // 028C CALL R24 1 + 0x7C401000, // 028D CALL R16 8 + 0x50400200, // 028E LDBOOL R16 1 0 + 0xA0000000, // 028F CLOSE R0 + 0x80042000, // 0290 RET 1 R16 + 0x7002001C, // 0291 JMP #02AF + 0x1C241108, // 0292 EQ R9 R8 K8 + 0x78260012, // 0293 JMPF R9 #02A7 + 0x8C240507, // 0294 GETMET R9 R2 K7 + 0x582C0006, // 0295 LDCONST R11 K6 + 0x7C240400, // 0296 CALL R9 2 + 0xB82A4400, // 0297 GETNGBL R10 K34 + 0x8C28152D, // 0298 GETMET R10 R10 K45 + 0x60300008, // 0299 GETGBL R12 G8 + 0x5C341200, // 029A MOVE R13 R9 + 0x7C300200, // 029B CALL R12 1 + 0x0032C40C, // 029C ADD R12 K98 R12 + 0x58340011, // 029D LDCONST R13 K17 + 0x7C280600, // 029E CALL R10 3 + 0x88280116, // 029F GETMBR R10 R0 K22 + 0x8C281563, // 02A0 GETMET R10 R10 K99 + 0x5C301200, // 02A1 MOVE R12 R9 + 0x7C280400, // 02A2 CALL R10 2 + 0x50280200, // 02A3 LDBOOL R10 1 0 + 0xA0000000, // 02A4 CLOSE R0 + 0x80041400, // 02A5 RET 1 R10 + 0x70020007, // 02A6 JMP #02AF + 0x1C24110F, // 02A7 EQ R9 R8 K15 + 0x78260005, // 02A8 JMPF R9 #02AF + 0x88240116, // 02A9 GETMBR R9 R0 K22 + 0x8C241364, // 02AA GETMET R9 R9 K100 + 0x7C240200, // 02AB CALL R9 1 + 0x50240200, // 02AC LDBOOL R9 1 0 + 0xA0000000, // 02AD CLOSE R0 + 0x80041200, // 02AE RET 1 R9 + 0x70020012, // 02AF JMP #02C3 + 0x54260029, // 02B0 LDINT R9 42 + 0x1C240E09, // 02B1 EQ R9 R7 R9 + 0x78260005, // 02B2 JMPF R9 #02B9 + 0x1C241106, // 02B3 EQ R9 R8 K6 + 0x78260002, // 02B4 JMPF R9 #02B8 + 0x50240200, // 02B5 LDBOOL R9 1 0 + 0xA0000000, // 02B6 CLOSE R0 + 0x80041200, // 02B7 RET 1 R9 + 0x70020009, // 02B8 JMP #02C3 + 0x60240003, // 02B9 GETGBL R9 G3 + 0x5C280000, // 02BA MOVE R10 R0 + 0x7C240200, // 02BB CALL R9 1 + 0x8C241365, // 02BC GETMET R9 R9 K101 + 0x5C2C0200, // 02BD MOVE R11 R1 + 0x5C300400, // 02BE MOVE R12 R2 + 0x5C340600, // 02BF MOVE R13 R3 + 0x7C240800, // 02C0 CALL R9 4 + 0xA0000000, // 02C1 CLOSE R0 + 0x80041200, // 02C2 RET 1 R9 + 0xA0000000, // 02C3 CLOSE R0 + 0x80000000, // 02C4 RET 0 }) ) ); diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor.h index 79cafd8f4..afd5ed3a8 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor.h @@ -6,30 +6,6 @@ extern const bclass be_class_Matter_Plugin_Sensor; -/******************************************************************** -** Solidified function: pre_value -********************************************************************/ -be_local_closure(Matter_Plugin_Sensor_pre_value, /* name */ - be_nested_proto( - 2, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 0, /* has constants */ - NULL, /* no const */ - be_str_weak(pre_value), - &be_const_str_solidified, - ( &(const binstruction[ 1]) { /* code */ - 0x80040200, // 0000 RET 1 R1 - }) - ) -); -/*******************************************************************/ - - /******************************************************************** ** Solidified function: value_changed ********************************************************************/ @@ -54,6 +30,50 @@ be_local_closure(Matter_Plugin_Sensor_value_changed, /* name */ /*******************************************************************/ +/******************************************************************** +** Solidified function: parse_configuration +********************************************************************/ +be_local_closure(Matter_Plugin_Sensor_parse_configuration, /* name */ + be_nested_proto( + 5, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 7]) { /* constants */ + /* K0 */ be_nested_str_weak(tasmota_sensor_filter), + /* K1 */ be_nested_str_weak(find), + /* K2 */ be_nested_str_weak(ARG), + /* K3 */ be_nested_str_weak(tasmota_sensor_matcher), + /* K4 */ be_nested_str_weak(tasmota), + /* K5 */ be_nested_str_weak(Rule_Matcher), + /* K6 */ be_nested_str_weak(parse), + }), + be_str_weak(parse_configuration), + &be_const_str_solidified, + ( &(const binstruction[13]) { /* code */ + 0x8C080301, // 0000 GETMET R2 R1 K1 + 0x88100102, // 0001 GETMBR R4 R0 K2 + 0x7C080400, // 0002 CALL R2 2 + 0x90020002, // 0003 SETMBR R0 K0 R2 + 0x88080100, // 0004 GETMBR R2 R0 K0 + 0x780A0005, // 0005 JMPF R2 #000C + 0xB80A0800, // 0006 GETNGBL R2 K4 + 0x88080505, // 0007 GETMBR R2 R2 K5 + 0x8C080506, // 0008 GETMET R2 R2 K6 + 0x88100100, // 0009 GETMBR R4 R0 K0 + 0x7C080400, // 000A CALL R2 2 + 0x90020602, // 000B SETMBR R0 K3 R2 + 0x80000000, // 000C RET 0 + }) + ) +); +/*******************************************************************/ + + /******************************************************************** ** Solidified function: parse_sensors ********************************************************************/ @@ -105,43 +125,23 @@ be_local_closure(Matter_Plugin_Sensor_parse_sensors, /* name */ /******************************************************************** -** Solidified function: parse_configuration +** Solidified function: pre_value ********************************************************************/ -be_local_closure(Matter_Plugin_Sensor_parse_configuration, /* name */ +be_local_closure(Matter_Plugin_Sensor_pre_value, /* name */ be_nested_proto( - 5, /* nstack */ + 2, /* nstack */ 2, /* argc */ 2, /* varg */ 0, /* has upvals */ NULL, /* no upvals */ 0, /* has sup protos */ NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 7]) { /* constants */ - /* K0 */ be_nested_str_weak(tasmota_sensor_filter), - /* K1 */ be_nested_str_weak(find), - /* K2 */ be_nested_str_weak(ARG), - /* K3 */ be_nested_str_weak(tasmota_sensor_matcher), - /* K4 */ be_nested_str_weak(tasmota), - /* K5 */ be_nested_str_weak(Rule_Matcher), - /* K6 */ be_nested_str_weak(parse), - }), - be_str_weak(parse_configuration), + 0, /* has constants */ + NULL, /* no const */ + be_str_weak(pre_value), &be_const_str_solidified, - ( &(const binstruction[13]) { /* code */ - 0x8C080301, // 0000 GETMET R2 R1 K1 - 0x88100102, // 0001 GETMBR R4 R0 K2 - 0x7C080400, // 0002 CALL R2 2 - 0x90020002, // 0003 SETMBR R0 K0 R2 - 0x88080100, // 0004 GETMBR R2 R0 K0 - 0x780A0005, // 0005 JMPF R2 #000C - 0xB80A0800, // 0006 GETNGBL R2 K4 - 0x88080505, // 0007 GETMBR R2 R2 K5 - 0x8C080506, // 0008 GETMET R2 R2 K6 - 0x88100100, // 0009 GETMBR R4 R0 K0 - 0x7C080400, // 000A CALL R2 2 - 0x90020602, // 000B SETMBR R0 K3 R2 - 0x80000000, // 000C RET 0 + ( &(const binstruction[ 1]) { /* code */ + 0x80040200, // 0000 RET 1 R1 }) ) ); @@ -155,17 +155,18 @@ extern const bclass be_class_Matter_Plugin_Device; be_local_class(Matter_Plugin_Sensor, 3, &be_class_Matter_Plugin_Device, - be_nested_map(9, + be_nested_map(10, ( (struct bmapnode*) &(const bmapnode[]) { - { be_const_key_weak(ARG, 3), be_nested_str_weak(filter) }, - { be_const_key_weak(tasmota_sensor_filter, -1), be_const_var(0) }, - { be_const_key_weak(pre_value, -1), be_const_closure(Matter_Plugin_Sensor_pre_value_closure) }, - { be_const_key_weak(UPDATE_TIME, -1), be_const_int(5000) }, - { be_const_key_weak(value_changed, -1), be_const_closure(Matter_Plugin_Sensor_value_changed_closure) }, - { be_const_key_weak(shadow_value, -1), be_const_var(2) }, - { be_const_key_weak(parse_sensors, 5), be_const_closure(Matter_Plugin_Sensor_parse_sensors_closure) }, - { be_const_key_weak(parse_configuration, -1), be_const_closure(Matter_Plugin_Sensor_parse_configuration_closure) }, { be_const_key_weak(tasmota_sensor_matcher, -1), be_const_var(1) }, + { be_const_key_weak(value_changed, -1), be_const_closure(Matter_Plugin_Sensor_value_changed_closure) }, + { be_const_key_weak(ARG, -1), be_nested_str_weak(filter) }, + { be_const_key_weak(shadow_value, -1), be_const_var(2) }, + { be_const_key_weak(UPDATE_TIME, 7), be_const_int(5000) }, + { be_const_key_weak(ARG_HINT, -1), be_nested_str_weak(Enter_X20Filter_X20pattern) }, + { be_const_key_weak(parse_sensors, 4), be_const_closure(Matter_Plugin_Sensor_parse_sensors_closure) }, + { be_const_key_weak(tasmota_sensor_filter, 8), be_const_var(0) }, + { be_const_key_weak(pre_value, -1), be_const_closure(Matter_Plugin_Sensor_pre_value_closure) }, + { be_const_key_weak(parse_configuration, 2), be_const_closure(Matter_Plugin_Sensor_parse_configuration_closure) }, })), be_str_weak(Matter_Plugin_Sensor) ); diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor_Occupancy.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor_Occupancy.h index d114a216d..6cdac12e9 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor_Occupancy.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor_Occupancy.h @@ -6,6 +6,33 @@ extern const bclass be_class_Matter_Plugin_Sensor_Occupancy; +/******************************************************************** +** Solidified function: +********************************************************************/ +be_local_closure(Matter_Plugin_Sensor_Occupancy__X3Clambda_X3E, /* name */ + be_nested_proto( + 3, /* nstack */ + 1, /* argc */ + 0, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 0, /* has constants */ + NULL, /* no const */ + be_str_weak(_X3Clambda_X3E), + &be_const_str_solidified, + ( &(const binstruction[ 4]) { /* code */ + 0x60040009, // 0000 GETGBL R1 G9 + 0x5C080000, // 0001 MOVE R2 R0 + 0x7C040200, // 0002 CALL R1 1 + 0x80040200, // 0003 RET 1 R1 + }) + ) +); +/*******************************************************************/ + + /******************************************************************** ** Solidified function: parse_configuration ********************************************************************/ @@ -47,33 +74,6 @@ be_local_closure(Matter_Plugin_Sensor_Occupancy_parse_configuration, /* name * /*******************************************************************/ -/******************************************************************** -** Solidified function: -********************************************************************/ -be_local_closure(Matter_Plugin_Sensor_Occupancy__X3Clambda_X3E, /* name */ - be_nested_proto( - 3, /* nstack */ - 1, /* argc */ - 0, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 0, /* has constants */ - NULL, /* no const */ - be_str_weak(_X3Clambda_X3E), - &be_const_str_solidified, - ( &(const binstruction[ 4]) { /* code */ - 0x60040009, // 0000 GETGBL R1 G9 - 0x5C080000, // 0001 MOVE R2 R0 - 0x7C040200, // 0002 CALL R1 1 - 0x80040200, // 0003 RET 1 R1 - }) - ) -); -/*******************************************************************/ - - /******************************************************************** ** Solidified function: read_attribute ********************************************************************/ @@ -267,23 +267,19 @@ extern const bclass be_class_Matter_Plugin_Device; be_local_class(Matter_Plugin_Sensor_Occupancy, 2, &be_class_Matter_Plugin_Device, - be_nested_map(12, + be_nested_map(13, ( (struct bmapnode*) &(const bmapnode[]) { - { be_const_key_weak(UPDATE_TIME, -1), be_const_int(5000) }, - { be_const_key_weak(parse_configuration, 9), be_const_closure(Matter_Plugin_Sensor_Occupancy_parse_configuration_closure) }, - { be_const_key_weak(TYPES, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { - be_const_map( * be_nested_map(1, - ( (struct bmapnode*) &(const bmapnode[]) { - { be_const_key_int(263, -1), be_const_int(2) }, - })) ) } )) }, { be_const_key_weak(ARG, -1), be_nested_str_weak(switch) }, { be_const_key_weak(ARG_TYPE, -1), be_const_static_closure(Matter_Plugin_Sensor_Occupancy__X3Clambda_X3E_closure) }, - { be_const_key_weak(NAME, -1), be_nested_str_weak(Occupancy) }, - { be_const_key_weak(read_attribute, 5), be_const_closure(Matter_Plugin_Sensor_Occupancy_read_attribute_closure) }, - { be_const_key_weak(shadow_occupancy, -1), be_const_var(1) }, + { be_const_key_weak(TYPE, -1), be_nested_str_weak(occupancy) }, + { be_const_key_weak(ARG_HINT, 1), be_nested_str_weak(Enter_X20Switch_X3Cx_X3E_X20number) }, + { be_const_key_weak(UPDATE_TIME, -1), be_const_int(5000) }, + { be_const_key_weak(parse_configuration, -1), be_const_closure(Matter_Plugin_Sensor_Occupancy_parse_configuration_closure) }, { be_const_key_weak(tasmota_switch_index, -1), be_const_var(0) }, - { be_const_key_weak(TYPE, 11), be_nested_str_weak(occupancy) }, - { be_const_key_weak(CLUSTERS, 8), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { + { be_const_key_weak(shadow_occupancy, 8), be_const_var(1) }, + { be_const_key_weak(update_shadow, 5), be_const_closure(Matter_Plugin_Sensor_Occupancy_update_shadow_closure) }, + { be_const_key_weak(NAME, 6), be_nested_str_weak(Occupancy) }, + { be_const_key_weak(CLUSTERS, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { be_const_map( * be_nested_map(1, ( (struct bmapnode*) &(const bmapnode[]) { { be_const_key_int(1030, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_list, { @@ -296,7 +292,12 @@ be_local_class(Matter_Plugin_Sensor_Occupancy, be_const_int(65533), })) ) } )) }, })) ) } )) }, - { be_const_key_weak(update_shadow, -1), be_const_closure(Matter_Plugin_Sensor_Occupancy_update_shadow_closure) }, + { be_const_key_weak(read_attribute, 4), be_const_closure(Matter_Plugin_Sensor_Occupancy_read_attribute_closure) }, + { be_const_key_weak(TYPES, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { + be_const_map( * be_nested_map(1, + ( (struct bmapnode*) &(const bmapnode[]) { + { be_const_key_int(263, -1), be_const_int(2) }, + })) ) } )) }, })), be_str_weak(Matter_Plugin_Sensor_Occupancy) ); diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor_OnOff.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor_OnOff.h index 7e701f289..864e3fc3e 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor_OnOff.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor_OnOff.h @@ -6,6 +6,33 @@ extern const bclass be_class_Matter_Plugin_Sensor_OnOff; +/******************************************************************** +** Solidified function: +********************************************************************/ +be_local_closure(Matter_Plugin_Sensor_OnOff__X3Clambda_X3E, /* name */ + be_nested_proto( + 3, /* nstack */ + 1, /* argc */ + 0, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 0, /* has constants */ + NULL, /* no const */ + be_str_weak(_X3Clambda_X3E), + &be_const_str_solidified, + ( &(const binstruction[ 4]) { /* code */ + 0x60040009, // 0000 GETGBL R1 G9 + 0x5C080000, // 0001 MOVE R2 R0 + 0x7C040200, // 0002 CALL R1 1 + 0x80040200, // 0003 RET 1 R1 + }) + ) +); +/*******************************************************************/ + + /******************************************************************** ** Solidified function: parse_configuration ********************************************************************/ @@ -47,33 +74,6 @@ be_local_closure(Matter_Plugin_Sensor_OnOff_parse_configuration, /* name */ /*******************************************************************/ -/******************************************************************** -** Solidified function: -********************************************************************/ -be_local_closure(Matter_Plugin_Sensor_OnOff__X3Clambda_X3E, /* name */ - be_nested_proto( - 3, /* nstack */ - 1, /* argc */ - 0, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 0, /* has constants */ - NULL, /* no const */ - be_str_weak(_X3Clambda_X3E), - &be_const_str_solidified, - ( &(const binstruction[ 4]) { /* code */ - 0x60040009, // 0000 GETGBL R1 G9 - 0x5C080000, // 0001 MOVE R2 R0 - 0x7C040200, // 0002 CALL R1 1 - 0x80040200, // 0003 RET 1 R1 - }) - ) -); -/*******************************************************************/ - - /******************************************************************** ** Solidified function: read_attribute ********************************************************************/ @@ -240,23 +240,19 @@ extern const bclass be_class_Matter_Plugin_Device; be_local_class(Matter_Plugin_Sensor_OnOff, 2, &be_class_Matter_Plugin_Device, - be_nested_map(12, + be_nested_map(13, ( (struct bmapnode*) &(const bmapnode[]) { + { be_const_key_weak(ARG, 8), be_nested_str_weak(switch) }, + { be_const_key_weak(ARG_HINT, -1), be_nested_str_weak(Enter_X20Switch_X3Cx_X3E_X20number) }, + { be_const_key_weak(TYPE, -1), be_nested_str_weak(onoff) }, + { be_const_key_weak(ARG_TYPE, 1), be_const_static_closure(Matter_Plugin_Sensor_OnOff__X3Clambda_X3E_closure) }, { be_const_key_weak(UPDATE_TIME, -1), be_const_int(5000) }, - { be_const_key_weak(parse_configuration, 8), be_const_closure(Matter_Plugin_Sensor_OnOff_parse_configuration_closure) }, - { be_const_key_weak(TYPES, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { - be_const_map( * be_nested_map(1, - ( (struct bmapnode*) &(const bmapnode[]) { - { be_const_key_int(2128, -1), be_const_int(2) }, - })) ) } )) }, - { be_const_key_weak(ARG, -1), be_nested_str_weak(switch) }, - { be_const_key_weak(ARG_TYPE, 9), be_const_static_closure(Matter_Plugin_Sensor_OnOff__X3Clambda_X3E_closure) }, - { be_const_key_weak(NAME, -1), be_nested_str_weak(OnOff) }, - { be_const_key_weak(read_attribute, 5), be_const_closure(Matter_Plugin_Sensor_OnOff_read_attribute_closure) }, - { be_const_key_weak(tasmota_switch_index, -1), be_const_var(0) }, - { be_const_key_weak(TYPE, 11), be_nested_str_weak(onoff) }, + { be_const_key_weak(update_shadow, -1), be_const_closure(Matter_Plugin_Sensor_OnOff_update_shadow_closure) }, + { be_const_key_weak(NAME, -1), be_nested_str_weak(OnOff_X20Sensor) }, + { be_const_key_weak(parse_configuration, 5), be_const_closure(Matter_Plugin_Sensor_OnOff_parse_configuration_closure) }, { be_const_key_weak(shadow_onoff, -1), be_const_var(1) }, - { be_const_key_weak(CLUSTERS, 7), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { + { be_const_key_weak(tasmota_switch_index, 6), be_const_var(0) }, + { be_const_key_weak(CLUSTERS, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { be_const_map( * be_nested_map(1, ( (struct bmapnode*) &(const bmapnode[]) { { be_const_key_int(6, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_list, { @@ -267,7 +263,12 @@ be_local_class(Matter_Plugin_Sensor_OnOff, be_const_int(65533), })) ) } )) }, })) ) } )) }, - { be_const_key_weak(update_shadow, -1), be_const_closure(Matter_Plugin_Sensor_OnOff_update_shadow_closure) }, + { be_const_key_weak(read_attribute, 4), be_const_closure(Matter_Plugin_Sensor_OnOff_read_attribute_closure) }, + { be_const_key_weak(TYPES, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { + be_const_map( * be_nested_map(1, + ( (struct bmapnode*) &(const bmapnode[]) { + { be_const_key_int(2128, -1), be_const_int(2) }, + })) ) } )) }, })), be_str_weak(Matter_Plugin_Sensor_OnOff) ); diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Shutter.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Shutter.h index 93d6e592c..982d994c8 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Shutter.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Shutter.h @@ -6,259 +6,6 @@ extern const bclass be_class_Matter_Plugin_Shutter; -/******************************************************************** -** Solidified function: update_inverted -********************************************************************/ -be_local_closure(Matter_Plugin_Shutter_update_inverted, /* name */ - be_nested_proto( - 7, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[14]) { /* constants */ - /* K0 */ be_nested_str_weak(shadow_shutter_inverted), - /* K1 */ be_nested_str_weak(tasmota), - /* K2 */ be_nested_str_weak(cmd), - /* K3 */ be_nested_str_weak(Status_X2013), - /* K4 */ be_nested_str_weak(contains), - /* K5 */ be_nested_str_weak(StatusSHT), - /* K6 */ be_nested_str_weak(find), - /* K7 */ be_nested_str_weak(SHT), - /* K8 */ be_nested_str_weak(tasmota_shutter_index), - /* K9 */ be_nested_str_weak(Opt), - /* K10 */ be_nested_str_weak(log), - /* K11 */ be_nested_str_weak(MTR_X3A_X20opt_X3A_X20), - /* K12 */ be_const_int(1), - /* K13 */ be_nested_str_weak(MTR_X3A_X20Inverted_X20flag_X3A_X20), - }), - be_str_weak(update_inverted), - &be_const_str_solidified, - ( &(const binstruction[51]) { /* code */ - 0x88040100, // 0000 GETMBR R1 R0 K0 - 0x5409FFFE, // 0001 LDINT R2 -1 - 0x1C040202, // 0002 EQ R1 R1 R2 - 0x7806002D, // 0003 JMPF R1 #0032 - 0xB8060200, // 0004 GETNGBL R1 K1 - 0x8C040302, // 0005 GETMET R1 R1 K2 - 0x580C0003, // 0006 LDCONST R3 K3 - 0x50100200, // 0007 LDBOOL R4 1 0 - 0x7C040600, // 0008 CALL R1 3 - 0x8C080304, // 0009 GETMET R2 R1 K4 - 0x58100005, // 000A LDCONST R4 K5 - 0x7C080400, // 000B CALL R2 2 - 0x780A0024, // 000C JMPF R2 #0032 - 0x94040305, // 000D GETIDX R1 R1 K5 - 0x8C080306, // 000E GETMET R2 R1 K6 - 0x60100008, // 000F GETGBL R4 G8 - 0x88140108, // 0010 GETMBR R5 R0 K8 - 0x7C100200, // 0011 CALL R4 1 - 0x00120E04, // 0012 ADD R4 K7 R4 - 0x60140013, // 0013 GETGBL R5 G19 - 0x7C140000, // 0014 CALL R5 0 - 0x7C080600, // 0015 CALL R2 3 - 0x8C080506, // 0016 GETMET R2 R2 K6 - 0x58100009, // 0017 LDCONST R4 K9 - 0x7C080400, // 0018 CALL R2 2 - 0xB80E0200, // 0019 GETNGBL R3 K1 - 0x8C0C070A, // 001A GETMET R3 R3 K10 - 0x60140008, // 001B GETGBL R5 G8 - 0x5C180400, // 001C MOVE R6 R2 - 0x7C140200, // 001D CALL R5 1 - 0x00161605, // 001E ADD R5 K11 R5 - 0x7C0C0400, // 001F CALL R3 2 - 0x4C0C0000, // 0020 LDNIL R3 - 0x200C0403, // 0021 NE R3 R2 R3 - 0x780E000E, // 0022 JMPF R3 #0032 - 0x600C0009, // 0023 GETGBL R3 G9 - 0x6010000C, // 0024 GETGBL R4 G12 - 0x5C140400, // 0025 MOVE R5 R2 - 0x7C100200, // 0026 CALL R4 1 - 0x0410090C, // 0027 SUB R4 R4 K12 - 0x94100404, // 0028 GETIDX R4 R2 R4 - 0x7C0C0200, // 0029 CALL R3 1 - 0x90020003, // 002A SETMBR R0 K0 R3 - 0xB80E0200, // 002B GETNGBL R3 K1 - 0x8C0C070A, // 002C GETMET R3 R3 K10 - 0x60140008, // 002D GETGBL R5 G8 - 0x88180100, // 002E GETMBR R6 R0 K0 - 0x7C140200, // 002F CALL R5 1 - 0x00161A05, // 0030 ADD R5 K13 R5 - 0x7C0C0400, // 0031 CALL R3 2 - 0x80000000, // 0032 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: invoke_request -********************************************************************/ -be_local_closure(Matter_Plugin_Shutter_invoke_request, /* name */ - be_nested_proto( - 14, /* nstack */ - 4, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[24]) { /* constants */ - /* K0 */ be_nested_str_weak(light), - /* K1 */ be_nested_str_weak(matter), - /* K2 */ be_nested_str_weak(TLV), - /* K3 */ be_nested_str_weak(cluster), - /* K4 */ be_nested_str_weak(command), - /* K5 */ be_nested_str_weak(update_shadow_lazy), - /* K6 */ be_const_int(0), - /* K7 */ be_nested_str_weak(tasmota), - /* K8 */ be_nested_str_weak(cmd), - /* K9 */ be_nested_str_weak(ShutterStopOpen), - /* K10 */ be_nested_str_weak(tasmota_shutter_index), - /* K11 */ be_const_int(1), - /* K12 */ be_nested_str_weak(update_shadow), - /* K13 */ be_nested_str_weak(ShutterStopClose), - /* K14 */ be_const_int(2), - /* K15 */ be_nested_str_weak(ShutterStop), - /* K16 */ be_nested_str_weak(log), - /* K17 */ be_nested_str_weak(MTR_X3A_X20Tilt_X20_X3D_X20), - /* K18 */ be_nested_str_weak(findsubval), - /* K19 */ be_nested_str_weak(shadow_shutter_inverted), - /* K20 */ be_nested_str_weak(ShutterPosition), - /* K21 */ be_nested_str_weak(_X20), - /* K22 */ be_nested_str_weak(pos_X25_X3A), - /* K23 */ be_nested_str_weak(invoke_request), - }), - be_str_weak(invoke_request), - &be_const_str_solidified, - ( &(const binstruction[116]) { /* code */ - 0xA4120000, // 0000 IMPORT R4 K0 - 0xB8160200, // 0001 GETNGBL R5 K1 - 0x88140B02, // 0002 GETMBR R5 R5 K2 - 0x88180703, // 0003 GETMBR R6 R3 K3 - 0x881C0704, // 0004 GETMBR R7 R3 K4 - 0x54220101, // 0005 LDINT R8 258 - 0x1C200C08, // 0006 EQ R8 R6 R8 - 0x78220061, // 0007 JMPF R8 #006A - 0x8C200105, // 0008 GETMET R8 R0 K5 - 0x7C200200, // 0009 CALL R8 1 - 0x1C200F06, // 000A EQ R8 R7 K6 - 0x7822000D, // 000B JMPF R8 #001A - 0xB8220E00, // 000C GETNGBL R8 K7 - 0x8C201108, // 000D GETMET R8 R8 K8 - 0x60280008, // 000E GETGBL R10 G8 - 0x882C010A, // 000F GETMBR R11 R0 K10 - 0x002C170B, // 0010 ADD R11 R11 K11 - 0x7C280200, // 0011 CALL R10 1 - 0x002A120A, // 0012 ADD R10 K9 R10 - 0x502C0200, // 0013 LDBOOL R11 1 0 - 0x7C200600, // 0014 CALL R8 3 - 0x8C20010C, // 0015 GETMET R8 R0 K12 - 0x7C200200, // 0016 CALL R8 1 - 0x50200200, // 0017 LDBOOL R8 1 0 - 0x80041000, // 0018 RET 1 R8 - 0x7002004E, // 0019 JMP #0069 - 0x1C200F0B, // 001A EQ R8 R7 K11 - 0x7822000D, // 001B JMPF R8 #002A - 0xB8220E00, // 001C GETNGBL R8 K7 - 0x8C201108, // 001D GETMET R8 R8 K8 - 0x60280008, // 001E GETGBL R10 G8 - 0x882C010A, // 001F GETMBR R11 R0 K10 - 0x002C170B, // 0020 ADD R11 R11 K11 - 0x7C280200, // 0021 CALL R10 1 - 0x002A1A0A, // 0022 ADD R10 K13 R10 - 0x502C0200, // 0023 LDBOOL R11 1 0 - 0x7C200600, // 0024 CALL R8 3 - 0x8C20010C, // 0025 GETMET R8 R0 K12 - 0x7C200200, // 0026 CALL R8 1 - 0x50200200, // 0027 LDBOOL R8 1 0 - 0x80041000, // 0028 RET 1 R8 - 0x7002003E, // 0029 JMP #0069 - 0x1C200F0E, // 002A EQ R8 R7 K14 - 0x7822000D, // 002B JMPF R8 #003A - 0xB8220E00, // 002C GETNGBL R8 K7 - 0x8C201108, // 002D GETMET R8 R8 K8 - 0x60280008, // 002E GETGBL R10 G8 - 0x882C010A, // 002F GETMBR R11 R0 K10 - 0x002C170B, // 0030 ADD R11 R11 K11 - 0x7C280200, // 0031 CALL R10 1 - 0x002A1E0A, // 0032 ADD R10 K15 R10 - 0x502C0200, // 0033 LDBOOL R11 1 0 - 0x7C200600, // 0034 CALL R8 3 - 0x8C20010C, // 0035 GETMET R8 R0 K12 - 0x7C200200, // 0036 CALL R8 1 - 0x50200200, // 0037 LDBOOL R8 1 0 - 0x80041000, // 0038 RET 1 R8 - 0x7002002E, // 0039 JMP #0069 - 0x54220004, // 003A LDINT R8 5 - 0x1C200E08, // 003B EQ R8 R7 R8 - 0x7822002B, // 003C JMPF R8 #0069 - 0xB8220E00, // 003D GETNGBL R8 K7 - 0x8C201110, // 003E GETMET R8 R8 K16 - 0x60280008, // 003F GETGBL R10 G8 - 0x5C2C0400, // 0040 MOVE R11 R2 - 0x7C280200, // 0041 CALL R10 1 - 0x002A220A, // 0042 ADD R10 K17 R10 - 0x582C000E, // 0043 LDCONST R11 K14 - 0x7C200600, // 0044 CALL R8 3 - 0x8C200512, // 0045 GETMET R8 R2 K18 - 0x58280006, // 0046 LDCONST R10 K6 - 0x7C200400, // 0047 CALL R8 2 - 0x4C240000, // 0048 LDNIL R9 - 0x20241009, // 0049 NE R9 R8 R9 - 0x7826001B, // 004A JMPF R9 #0067 - 0x54260063, // 004B LDINT R9 100 - 0x0C201009, // 004C DIV R8 R8 R9 - 0x88240113, // 004D GETMBR R9 R0 K19 - 0x1C241306, // 004E EQ R9 R9 K6 - 0x78260001, // 004F JMPF R9 #0052 - 0x54260063, // 0050 LDINT R9 100 - 0x04201208, // 0051 SUB R8 R9 R8 - 0xB8260E00, // 0052 GETNGBL R9 K7 - 0x8C241308, // 0053 GETMET R9 R9 K8 - 0x602C0008, // 0054 GETGBL R11 G8 - 0x8830010A, // 0055 GETMBR R12 R0 K10 - 0x0030190B, // 0056 ADD R12 R12 K11 - 0x7C2C0200, // 0057 CALL R11 1 - 0x002E280B, // 0058 ADD R11 K20 R11 - 0x002C1715, // 0059 ADD R11 R11 K21 - 0x60300008, // 005A GETGBL R12 G8 - 0x5C341000, // 005B MOVE R13 R8 - 0x7C300200, // 005C CALL R12 1 - 0x002C160C, // 005D ADD R11 R11 R12 - 0x50300200, // 005E LDBOOL R12 1 0 - 0x7C240600, // 005F CALL R9 3 - 0x60240008, // 0060 GETGBL R9 G8 - 0x5C281000, // 0061 MOVE R10 R8 - 0x7C240200, // 0062 CALL R9 1 - 0x00262C09, // 0063 ADD R9 K22 R9 - 0x900E2009, // 0064 SETMBR R3 K16 R9 - 0x8C24010C, // 0065 GETMET R9 R0 K12 - 0x7C240200, // 0066 CALL R9 1 - 0x50240200, // 0067 LDBOOL R9 1 0 - 0x80041200, // 0068 RET 1 R9 - 0x70020008, // 0069 JMP #0073 - 0x60200003, // 006A GETGBL R8 G3 - 0x5C240000, // 006B MOVE R9 R0 - 0x7C200200, // 006C CALL R8 1 - 0x8C201117, // 006D GETMET R8 R8 K23 - 0x5C280200, // 006E MOVE R10 R1 - 0x5C2C0400, // 006F MOVE R11 R2 - 0x5C300600, // 0070 MOVE R12 R3 - 0x7C200800, // 0071 CALL R8 4 - 0x80041000, // 0072 RET 1 R8 - 0x80000000, // 0073 RET 0 - }) - ) -); -/*******************************************************************/ - - /******************************************************************** ** Solidified function: read_attribute ********************************************************************/ @@ -454,33 +201,6 @@ be_local_closure(Matter_Plugin_Shutter_read_attribute, /* name */ /*******************************************************************/ -/******************************************************************** -** Solidified function: -********************************************************************/ -be_local_closure(Matter_Plugin_Shutter__X3Clambda_X3E, /* name */ - be_nested_proto( - 3, /* nstack */ - 1, /* argc */ - 0, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 0, /* has constants */ - NULL, /* no const */ - be_str_weak(_X3Clambda_X3E), - &be_const_str_solidified, - ( &(const binstruction[ 4]) { /* code */ - 0x60040009, // 0000 GETGBL R1 G9 - 0x5C080000, // 0001 MOVE R2 R0 - 0x7C040200, // 0002 CALL R1 1 - 0x80040200, // 0003 RET 1 R1 - }) - ) -); -/*******************************************************************/ - - /******************************************************************** ** Solidified function: parse_sensors ********************************************************************/ @@ -572,47 +292,6 @@ be_local_closure(Matter_Plugin_Shutter_parse_sensors, /* name */ /*******************************************************************/ -/******************************************************************** -** Solidified function: parse_configuration -********************************************************************/ -be_local_closure(Matter_Plugin_Shutter_parse_configuration, /* name */ - be_nested_proto( - 5, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 5]) { /* constants */ - /* K0 */ be_nested_str_weak(tasmota_shutter_index), - /* K1 */ be_nested_str_weak(find), - /* K2 */ be_nested_str_weak(ARG), - /* K3 */ be_const_int(0), - /* K4 */ be_nested_str_weak(shadow_shutter_inverted), - }), - be_str_weak(parse_configuration), - &be_const_str_solidified, - ( &(const binstruction[12]) { /* code */ - 0x8C080301, // 0000 GETMET R2 R1 K1 - 0x88100102, // 0001 GETMBR R4 R0 K2 - 0x7C080400, // 0002 CALL R2 2 - 0x90020002, // 0003 SETMBR R0 K0 R2 - 0x88080100, // 0004 GETMBR R2 R0 K0 - 0x4C0C0000, // 0005 LDNIL R3 - 0x1C080403, // 0006 EQ R2 R2 R3 - 0x780A0000, // 0007 JMPF R2 #0009 - 0x90020103, // 0008 SETMBR R0 K0 K3 - 0x5409FFFE, // 0009 LDINT R2 -1 - 0x90020802, // 000A SETMBR R0 K4 R2 - 0x80000000, // 000B RET 0 - }) - ) -); -/*******************************************************************/ - - /******************************************************************** ** Solidified function: update_shadow ********************************************************************/ @@ -666,6 +345,310 @@ be_local_closure(Matter_Plugin_Shutter_update_shadow, /* name */ /*******************************************************************/ +/******************************************************************** +** Solidified function: invoke_request +********************************************************************/ +be_local_closure(Matter_Plugin_Shutter_invoke_request, /* name */ + be_nested_proto( + 14, /* nstack */ + 4, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[24]) { /* constants */ + /* K0 */ be_nested_str_weak(light), + /* K1 */ be_nested_str_weak(matter), + /* K2 */ be_nested_str_weak(TLV), + /* K3 */ be_nested_str_weak(cluster), + /* K4 */ be_nested_str_weak(command), + /* K5 */ be_nested_str_weak(update_shadow_lazy), + /* K6 */ be_const_int(0), + /* K7 */ be_nested_str_weak(tasmota), + /* K8 */ be_nested_str_weak(cmd), + /* K9 */ be_nested_str_weak(ShutterStopOpen), + /* K10 */ be_nested_str_weak(tasmota_shutter_index), + /* K11 */ be_const_int(1), + /* K12 */ be_nested_str_weak(update_shadow), + /* K13 */ be_nested_str_weak(ShutterStopClose), + /* K14 */ be_const_int(2), + /* K15 */ be_nested_str_weak(ShutterStop), + /* K16 */ be_nested_str_weak(log), + /* K17 */ be_nested_str_weak(MTR_X3A_X20Tilt_X20_X3D_X20), + /* K18 */ be_nested_str_weak(findsubval), + /* K19 */ be_nested_str_weak(shadow_shutter_inverted), + /* K20 */ be_nested_str_weak(ShutterPosition), + /* K21 */ be_nested_str_weak(_X20), + /* K22 */ be_nested_str_weak(pos_X25_X3A), + /* K23 */ be_nested_str_weak(invoke_request), + }), + be_str_weak(invoke_request), + &be_const_str_solidified, + ( &(const binstruction[116]) { /* code */ + 0xA4120000, // 0000 IMPORT R4 K0 + 0xB8160200, // 0001 GETNGBL R5 K1 + 0x88140B02, // 0002 GETMBR R5 R5 K2 + 0x88180703, // 0003 GETMBR R6 R3 K3 + 0x881C0704, // 0004 GETMBR R7 R3 K4 + 0x54220101, // 0005 LDINT R8 258 + 0x1C200C08, // 0006 EQ R8 R6 R8 + 0x78220061, // 0007 JMPF R8 #006A + 0x8C200105, // 0008 GETMET R8 R0 K5 + 0x7C200200, // 0009 CALL R8 1 + 0x1C200F06, // 000A EQ R8 R7 K6 + 0x7822000D, // 000B JMPF R8 #001A + 0xB8220E00, // 000C GETNGBL R8 K7 + 0x8C201108, // 000D GETMET R8 R8 K8 + 0x60280008, // 000E GETGBL R10 G8 + 0x882C010A, // 000F GETMBR R11 R0 K10 + 0x002C170B, // 0010 ADD R11 R11 K11 + 0x7C280200, // 0011 CALL R10 1 + 0x002A120A, // 0012 ADD R10 K9 R10 + 0x502C0200, // 0013 LDBOOL R11 1 0 + 0x7C200600, // 0014 CALL R8 3 + 0x8C20010C, // 0015 GETMET R8 R0 K12 + 0x7C200200, // 0016 CALL R8 1 + 0x50200200, // 0017 LDBOOL R8 1 0 + 0x80041000, // 0018 RET 1 R8 + 0x7002004E, // 0019 JMP #0069 + 0x1C200F0B, // 001A EQ R8 R7 K11 + 0x7822000D, // 001B JMPF R8 #002A + 0xB8220E00, // 001C GETNGBL R8 K7 + 0x8C201108, // 001D GETMET R8 R8 K8 + 0x60280008, // 001E GETGBL R10 G8 + 0x882C010A, // 001F GETMBR R11 R0 K10 + 0x002C170B, // 0020 ADD R11 R11 K11 + 0x7C280200, // 0021 CALL R10 1 + 0x002A1A0A, // 0022 ADD R10 K13 R10 + 0x502C0200, // 0023 LDBOOL R11 1 0 + 0x7C200600, // 0024 CALL R8 3 + 0x8C20010C, // 0025 GETMET R8 R0 K12 + 0x7C200200, // 0026 CALL R8 1 + 0x50200200, // 0027 LDBOOL R8 1 0 + 0x80041000, // 0028 RET 1 R8 + 0x7002003E, // 0029 JMP #0069 + 0x1C200F0E, // 002A EQ R8 R7 K14 + 0x7822000D, // 002B JMPF R8 #003A + 0xB8220E00, // 002C GETNGBL R8 K7 + 0x8C201108, // 002D GETMET R8 R8 K8 + 0x60280008, // 002E GETGBL R10 G8 + 0x882C010A, // 002F GETMBR R11 R0 K10 + 0x002C170B, // 0030 ADD R11 R11 K11 + 0x7C280200, // 0031 CALL R10 1 + 0x002A1E0A, // 0032 ADD R10 K15 R10 + 0x502C0200, // 0033 LDBOOL R11 1 0 + 0x7C200600, // 0034 CALL R8 3 + 0x8C20010C, // 0035 GETMET R8 R0 K12 + 0x7C200200, // 0036 CALL R8 1 + 0x50200200, // 0037 LDBOOL R8 1 0 + 0x80041000, // 0038 RET 1 R8 + 0x7002002E, // 0039 JMP #0069 + 0x54220004, // 003A LDINT R8 5 + 0x1C200E08, // 003B EQ R8 R7 R8 + 0x7822002B, // 003C JMPF R8 #0069 + 0xB8220E00, // 003D GETNGBL R8 K7 + 0x8C201110, // 003E GETMET R8 R8 K16 + 0x60280008, // 003F GETGBL R10 G8 + 0x5C2C0400, // 0040 MOVE R11 R2 + 0x7C280200, // 0041 CALL R10 1 + 0x002A220A, // 0042 ADD R10 K17 R10 + 0x582C000E, // 0043 LDCONST R11 K14 + 0x7C200600, // 0044 CALL R8 3 + 0x8C200512, // 0045 GETMET R8 R2 K18 + 0x58280006, // 0046 LDCONST R10 K6 + 0x7C200400, // 0047 CALL R8 2 + 0x4C240000, // 0048 LDNIL R9 + 0x20241009, // 0049 NE R9 R8 R9 + 0x7826001B, // 004A JMPF R9 #0067 + 0x54260063, // 004B LDINT R9 100 + 0x0C201009, // 004C DIV R8 R8 R9 + 0x88240113, // 004D GETMBR R9 R0 K19 + 0x1C241306, // 004E EQ R9 R9 K6 + 0x78260001, // 004F JMPF R9 #0052 + 0x54260063, // 0050 LDINT R9 100 + 0x04201208, // 0051 SUB R8 R9 R8 + 0xB8260E00, // 0052 GETNGBL R9 K7 + 0x8C241308, // 0053 GETMET R9 R9 K8 + 0x602C0008, // 0054 GETGBL R11 G8 + 0x8830010A, // 0055 GETMBR R12 R0 K10 + 0x0030190B, // 0056 ADD R12 R12 K11 + 0x7C2C0200, // 0057 CALL R11 1 + 0x002E280B, // 0058 ADD R11 K20 R11 + 0x002C1715, // 0059 ADD R11 R11 K21 + 0x60300008, // 005A GETGBL R12 G8 + 0x5C341000, // 005B MOVE R13 R8 + 0x7C300200, // 005C CALL R12 1 + 0x002C160C, // 005D ADD R11 R11 R12 + 0x50300200, // 005E LDBOOL R12 1 0 + 0x7C240600, // 005F CALL R9 3 + 0x60240008, // 0060 GETGBL R9 G8 + 0x5C281000, // 0061 MOVE R10 R8 + 0x7C240200, // 0062 CALL R9 1 + 0x00262C09, // 0063 ADD R9 K22 R9 + 0x900E2009, // 0064 SETMBR R3 K16 R9 + 0x8C24010C, // 0065 GETMET R9 R0 K12 + 0x7C240200, // 0066 CALL R9 1 + 0x50240200, // 0067 LDBOOL R9 1 0 + 0x80041200, // 0068 RET 1 R9 + 0x70020008, // 0069 JMP #0073 + 0x60200003, // 006A GETGBL R8 G3 + 0x5C240000, // 006B MOVE R9 R0 + 0x7C200200, // 006C CALL R8 1 + 0x8C201117, // 006D GETMET R8 R8 K23 + 0x5C280200, // 006E MOVE R10 R1 + 0x5C2C0400, // 006F MOVE R11 R2 + 0x5C300600, // 0070 MOVE R12 R3 + 0x7C200800, // 0071 CALL R8 4 + 0x80041000, // 0072 RET 1 R8 + 0x80000000, // 0073 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: parse_configuration +********************************************************************/ +be_local_closure(Matter_Plugin_Shutter_parse_configuration, /* name */ + be_nested_proto( + 5, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 5]) { /* constants */ + /* K0 */ be_nested_str_weak(tasmota_shutter_index), + /* K1 */ be_nested_str_weak(find), + /* K2 */ be_nested_str_weak(ARG), + /* K3 */ be_const_int(0), + /* K4 */ be_nested_str_weak(shadow_shutter_inverted), + }), + be_str_weak(parse_configuration), + &be_const_str_solidified, + ( &(const binstruction[12]) { /* code */ + 0x8C080301, // 0000 GETMET R2 R1 K1 + 0x88100102, // 0001 GETMBR R4 R0 K2 + 0x7C080400, // 0002 CALL R2 2 + 0x90020002, // 0003 SETMBR R0 K0 R2 + 0x88080100, // 0004 GETMBR R2 R0 K0 + 0x4C0C0000, // 0005 LDNIL R3 + 0x1C080403, // 0006 EQ R2 R2 R3 + 0x780A0000, // 0007 JMPF R2 #0009 + 0x90020103, // 0008 SETMBR R0 K0 K3 + 0x5409FFFE, // 0009 LDINT R2 -1 + 0x90020802, // 000A SETMBR R0 K4 R2 + 0x80000000, // 000B RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: update_inverted +********************************************************************/ +be_local_closure(Matter_Plugin_Shutter_update_inverted, /* name */ + be_nested_proto( + 6, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[11]) { /* constants */ + /* K0 */ be_nested_str_weak(shadow_shutter_inverted), + /* K1 */ be_nested_str_weak(tasmota), + /* K2 */ be_nested_str_weak(cmd), + /* K3 */ be_nested_str_weak(Status_X2013), + /* K4 */ be_nested_str_weak(contains), + /* K5 */ be_nested_str_weak(StatusSHT), + /* K6 */ be_nested_str_weak(find), + /* K7 */ be_nested_str_weak(SHT), + /* K8 */ be_nested_str_weak(tasmota_shutter_index), + /* K9 */ be_nested_str_weak(Opt), + /* K10 */ be_const_int(1), + }), + be_str_weak(update_inverted), + &be_const_str_solidified, + ( &(const binstruction[37]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x5409FFFE, // 0001 LDINT R2 -1 + 0x1C040202, // 0002 EQ R1 R1 R2 + 0x7806001F, // 0003 JMPF R1 #0024 + 0xB8060200, // 0004 GETNGBL R1 K1 + 0x8C040302, // 0005 GETMET R1 R1 K2 + 0x580C0003, // 0006 LDCONST R3 K3 + 0x50100200, // 0007 LDBOOL R4 1 0 + 0x7C040600, // 0008 CALL R1 3 + 0x8C080304, // 0009 GETMET R2 R1 K4 + 0x58100005, // 000A LDCONST R4 K5 + 0x7C080400, // 000B CALL R2 2 + 0x780A0016, // 000C JMPF R2 #0024 + 0x94040305, // 000D GETIDX R1 R1 K5 + 0x8C080306, // 000E GETMET R2 R1 K6 + 0x60100008, // 000F GETGBL R4 G8 + 0x88140108, // 0010 GETMBR R5 R0 K8 + 0x7C100200, // 0011 CALL R4 1 + 0x00120E04, // 0012 ADD R4 K7 R4 + 0x60140013, // 0013 GETGBL R5 G19 + 0x7C140000, // 0014 CALL R5 0 + 0x7C080600, // 0015 CALL R2 3 + 0x8C080506, // 0016 GETMET R2 R2 K6 + 0x58100009, // 0017 LDCONST R4 K9 + 0x7C080400, // 0018 CALL R2 2 + 0x4C0C0000, // 0019 LDNIL R3 + 0x200C0403, // 001A NE R3 R2 R3 + 0x780E0007, // 001B JMPF R3 #0024 + 0x600C0009, // 001C GETGBL R3 G9 + 0x6010000C, // 001D GETGBL R4 G12 + 0x5C140400, // 001E MOVE R5 R2 + 0x7C100200, // 001F CALL R4 1 + 0x0410090A, // 0020 SUB R4 R4 K10 + 0x94100404, // 0021 GETIDX R4 R2 R4 + 0x7C0C0200, // 0022 CALL R3 1 + 0x90020003, // 0023 SETMBR R0 K0 R3 + 0x80000000, // 0024 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: +********************************************************************/ +be_local_closure(Matter_Plugin_Shutter__X3Clambda_X3E, /* name */ + be_nested_proto( + 3, /* nstack */ + 1, /* argc */ + 0, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 0, /* has constants */ + NULL, /* no const */ + be_str_weak(_X3Clambda_X3E), + &be_const_str_solidified, + ( &(const binstruction[ 4]) { /* code */ + 0x60040009, // 0000 GETGBL R1 G9 + 0x5C080000, // 0001 MOVE R2 R0 + 0x7C040200, // 0002 CALL R1 1 + 0x80040200, // 0003 RET 1 R1 + }) + ) +); +/*******************************************************************/ + + /******************************************************************** ** Solidified class: Matter_Plugin_Shutter ********************************************************************/ @@ -673,16 +656,16 @@ extern const bclass be_class_Matter_Plugin_Device; be_local_class(Matter_Plugin_Shutter, 6, &be_class_Matter_Plugin_Device, - be_nested_map(18, + be_nested_map(19, ( (struct bmapnode*) &(const bmapnode[]) { - { be_const_key_weak(shadow_shutter_tilt, -1), be_const_var(3) }, - { be_const_key_weak(TYPE, -1), be_nested_str_weak(shutter) }, - { be_const_key_weak(TYPES, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { - be_const_map( * be_nested_map(1, - ( (struct bmapnode*) &(const bmapnode[]) { - { be_const_key_int(514, -1), be_const_int(2) }, - })) ) } )) }, - { be_const_key_weak(update_shadow, 13), be_const_closure(Matter_Plugin_Shutter_update_shadow_closure) }, + { be_const_key_weak(read_attribute, 4), be_const_closure(Matter_Plugin_Shutter_read_attribute_closure) }, + { be_const_key_weak(shadow_shutter_pos, 18), be_const_var(1) }, + { be_const_key_weak(tasmota_shutter_index, -1), be_const_var(0) }, + { be_const_key_weak(parse_sensors, -1), be_const_closure(Matter_Plugin_Shutter_parse_sensors_closure) }, + { be_const_key_weak(shadow_shutter_direction, -1), be_const_var(4) }, + { be_const_key_weak(shadow_shutter_target, -1), be_const_var(2) }, + { be_const_key_weak(invoke_request, -1), be_const_closure(Matter_Plugin_Shutter_invoke_request_closure) }, + { be_const_key_weak(ARG_HINT, -1), be_nested_str_weak(Enter_X20Relay_X3Cx_X3E_X20number) }, { be_const_key_weak(CLUSTERS, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { be_const_map( * be_nested_map(1, ( (struct bmapnode*) &(const bmapnode[]) { @@ -701,19 +684,20 @@ be_local_class(Matter_Plugin_Shutter, be_const_int(65533), })) ) } )) }, })) ) } )) }, - { be_const_key_weak(invoke_request, 14), be_const_closure(Matter_Plugin_Shutter_invoke_request_closure) }, - { be_const_key_weak(read_attribute, 16), be_const_closure(Matter_Plugin_Shutter_read_attribute_closure) }, - { be_const_key_weak(shadow_shutter_inverted, 3), be_const_var(5) }, - { be_const_key_weak(shadow_shutter_pos, -1), be_const_var(1) }, - { be_const_key_weak(ARG, -1), be_nested_str_weak(shutter) }, - { be_const_key_weak(ARG_TYPE, -1), be_const_static_closure(Matter_Plugin_Shutter__X3Clambda_X3E_closure) }, - { be_const_key_weak(NAME, -1), be_nested_str_weak(Shutter) }, - { be_const_key_weak(update_inverted, 11), be_const_closure(Matter_Plugin_Shutter_update_inverted_closure) }, + { be_const_key_weak(update_shadow, 5), be_const_closure(Matter_Plugin_Shutter_update_shadow_closure) }, + { be_const_key_weak(NAME, 6), be_nested_str_weak(Shutter) }, + { be_const_key_weak(TYPE, -1), be_nested_str_weak(shutter) }, + { be_const_key_weak(shadow_shutter_inverted, -1), be_const_var(5) }, + { be_const_key_weak(ARG, 7), be_nested_str_weak(shutter) }, + { be_const_key_weak(shadow_shutter_tilt, 8), be_const_var(3) }, { be_const_key_weak(parse_configuration, -1), be_const_closure(Matter_Plugin_Shutter_parse_configuration_closure) }, - { be_const_key_weak(shadow_shutter_target, -1), be_const_var(2) }, - { be_const_key_weak(tasmota_shutter_index, -1), be_const_var(0) }, - { be_const_key_weak(parse_sensors, -1), be_const_closure(Matter_Plugin_Shutter_parse_sensors_closure) }, - { be_const_key_weak(shadow_shutter_direction, 0), be_const_var(4) }, + { be_const_key_weak(update_inverted, -1), be_const_closure(Matter_Plugin_Shutter_update_inverted_closure) }, + { be_const_key_weak(ARG_TYPE, -1), be_const_static_closure(Matter_Plugin_Shutter__X3Clambda_X3E_closure) }, + { be_const_key_weak(TYPES, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { + be_const_map( * be_nested_map(1, + ( (struct bmapnode*) &(const bmapnode[]) { + { be_const_key_int(514, -1), be_const_int(2) }, + })) ) } )) }, })), be_str_weak(Matter_Plugin_Shutter) ); diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Session.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Session.h index 91b961a2c..c44344ce3 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Session.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Session.h @@ -1535,7 +1535,7 @@ be_local_closure(Matter_Session_get_ac, /* name */ ********************************************************************/ be_local_closure(Matter_Session_counter_snd_next, /* name */ be_nested_proto( - 9, /* nstack */ + 7, /* nstack */ 1, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -1543,54 +1543,41 @@ be_local_closure(Matter_Session_counter_snd_next, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[15]) { /* constants */ + ( &(const bvalue[10]) { /* constants */ /* K0 */ be_nested_str_weak(string), /* K1 */ be_nested_str_weak(_counter_snd_impl), /* K2 */ be_nested_str_weak(next), - /* K3 */ be_nested_str_weak(tasmota), - /* K4 */ be_nested_str_weak(log), - /* K5 */ be_nested_str_weak(format), - /* K6 */ be_nested_str_weak(MTR_X3A_X20_X2E_X20_X20_X20_X20_X20_X20_X20_X20_X20_X20Counter_snd_X3D_X25i), - /* K7 */ be_const_int(3), - /* K8 */ be_nested_str_weak(matter), - /* K9 */ be_nested_str_weak(Counter), - /* K10 */ be_nested_str_weak(is_greater), - /* K11 */ be_nested_str_weak(counter_snd), - /* K12 */ be_nested_str_weak(_COUNTER_SND_INCR), - /* K13 */ be_nested_str_weak(does_persist), - /* K14 */ be_nested_str_weak(save), + /* K3 */ be_nested_str_weak(matter), + /* K4 */ be_nested_str_weak(Counter), + /* K5 */ be_nested_str_weak(is_greater), + /* K6 */ be_nested_str_weak(counter_snd), + /* K7 */ be_nested_str_weak(_COUNTER_SND_INCR), + /* K8 */ be_nested_str_weak(does_persist), + /* K9 */ be_nested_str_weak(save), }), be_str_weak(counter_snd_next), &be_const_str_solidified, - ( &(const binstruction[28]) { /* code */ + ( &(const binstruction[20]) { /* code */ 0xA4060000, // 0000 IMPORT R1 K0 0x88080101, // 0001 GETMBR R2 R0 K1 0x8C080502, // 0002 GETMET R2 R2 K2 0x7C080200, // 0003 CALL R2 1 0xB80E0600, // 0004 GETNGBL R3 K3 - 0x8C0C0704, // 0005 GETMET R3 R3 K4 - 0x8C140305, // 0006 GETMET R5 R1 K5 - 0x581C0006, // 0007 LDCONST R7 K6 - 0x5C200400, // 0008 MOVE R8 R2 - 0x7C140600, // 0009 CALL R5 3 - 0x58180007, // 000A LDCONST R6 K7 - 0x7C0C0600, // 000B CALL R3 3 - 0xB80E1000, // 000C GETNGBL R3 K8 - 0x880C0709, // 000D GETMBR R3 R3 K9 - 0x8C0C070A, // 000E GETMET R3 R3 K10 - 0x5C140400, // 000F MOVE R5 R2 - 0x8818010B, // 0010 GETMBR R6 R0 K11 - 0x7C0C0600, // 0011 CALL R3 3 - 0x780E0007, // 0012 JMPF R3 #001B - 0x880C010C, // 0013 GETMBR R3 R0 K12 - 0x000C0403, // 0014 ADD R3 R2 R3 - 0x90021603, // 0015 SETMBR R0 K11 R3 - 0x8C0C010D, // 0016 GETMET R3 R0 K13 - 0x7C0C0200, // 0017 CALL R3 1 - 0x780E0001, // 0018 JMPF R3 #001B - 0x8C0C010E, // 0019 GETMET R3 R0 K14 - 0x7C0C0200, // 001A CALL R3 1 - 0x80040400, // 001B RET 1 R2 + 0x880C0704, // 0005 GETMBR R3 R3 K4 + 0x8C0C0705, // 0006 GETMET R3 R3 K5 + 0x5C140400, // 0007 MOVE R5 R2 + 0x88180106, // 0008 GETMBR R6 R0 K6 + 0x7C0C0600, // 0009 CALL R3 3 + 0x780E0007, // 000A JMPF R3 #0013 + 0x880C0107, // 000B GETMBR R3 R0 K7 + 0x000C0403, // 000C ADD R3 R2 R3 + 0x90020C03, // 000D SETMBR R0 K6 R3 + 0x8C0C0108, // 000E GETMET R3 R0 K8 + 0x7C0C0200, // 000F CALL R3 1 + 0x780E0001, // 0010 JMPF R3 #0013 + 0x8C0C0109, // 0011 GETMET R3 R0 K9 + 0x7C0C0200, // 0012 CALL R3 1 + 0x80040400, // 0013 RET 1 R2 }) ) ); diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Session_Store.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Session_Store.h index 2417ab096..8cf3022f2 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Session_Store.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Session_Store.h @@ -1096,7 +1096,7 @@ be_local_closure(Matter_Session_Store_find_session_by_resumption_id, /* name * 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[13]) { /* constants */ + ( &(const bvalue[11]) { /* constants */ /* K0 */ be_nested_str_weak(string), /* K1 */ be_const_int(0), /* K2 */ be_nested_str_weak(sessions), @@ -1105,15 +1105,13 @@ be_local_closure(Matter_Session_Store_find_session_by_resumption_id, /* name * /* K5 */ be_nested_str_weak(format), /* K6 */ be_nested_str_weak(MTR_X3A_X20session_X2Eresumption_id_X3D_X25s_X20vs_X20_X25s), /* K7 */ be_nested_str_weak(resumption_id), - /* K8 */ be_const_int(3), - /* K9 */ be_nested_str_weak(shared_secret), - /* K10 */ be_nested_str_weak(MTR_X3A_X20session_X2Eshared_secret_X3D_X25s), - /* K11 */ be_nested_str_weak(update), - /* K12 */ be_const_int(1), + /* K8 */ be_nested_str_weak(shared_secret), + /* K9 */ be_nested_str_weak(update), + /* K10 */ be_const_int(1), }), be_str_weak(find_session_by_resumption_id), &be_const_str_solidified, - ( &(const binstruction[49]) { /* code */ + ( &(const binstruction[39]) { /* code */ 0xA40A0000, // 0000 IMPORT R2 K0 0x5C0C0200, // 0001 MOVE R3 R1 0x740E0001, // 0002 JMPT R3 #0005 @@ -1125,7 +1123,7 @@ be_local_closure(Matter_Session_Store_find_session_by_resumption_id, /* name * 0x5C180800, // 0008 MOVE R6 R4 0x7C140200, // 0009 CALL R5 1 0x14140605, // 000A LT R5 R3 R5 - 0x78160023, // 000B JMPF R5 #0030 + 0x78160019, // 000B JMPF R5 #0026 0x94140803, // 000C GETIDX R5 R4 R3 0xB81A0600, // 000D GETNGBL R6 K3 0x8C180D04, // 000E GETMET R6 R6 K4 @@ -1138,31 +1136,21 @@ be_local_closure(Matter_Session_Store_find_session_by_resumption_id, /* name * 0x5C340200, // 0015 MOVE R13 R1 0x7C300200, // 0016 CALL R12 1 0x7C200800, // 0017 CALL R8 4 - 0x58240008, // 0018 LDCONST R9 K8 + 0x54260003, // 0018 LDINT R9 4 0x7C180600, // 0019 CALL R6 3 0x88180B07, // 001A GETMBR R6 R5 K7 0x1C180C01, // 001B EQ R6 R6 R1 - 0x781A0010, // 001C JMPF R6 #002E - 0x88180B09, // 001D GETMBR R6 R5 K9 + 0x781A0006, // 001C JMPF R6 #0024 + 0x88180B08, // 001D GETMBR R6 R5 K8 0x4C1C0000, // 001E LDNIL R7 0x20180C07, // 001F NE R6 R6 R7 - 0x781A000C, // 0020 JMPF R6 #002E - 0xB81A0600, // 0021 GETNGBL R6 K3 - 0x8C180D04, // 0022 GETMET R6 R6 K4 - 0x8C200505, // 0023 GETMET R8 R2 K5 - 0x5828000A, // 0024 LDCONST R10 K10 - 0x602C0008, // 0025 GETGBL R11 G8 - 0x88300B09, // 0026 GETMBR R12 R5 K9 - 0x7C2C0200, // 0027 CALL R11 1 - 0x7C200600, // 0028 CALL R8 3 - 0x58240008, // 0029 LDCONST R9 K8 - 0x7C180600, // 002A CALL R6 3 - 0x8C180B0B, // 002B GETMET R6 R5 K11 - 0x7C180200, // 002C CALL R6 1 - 0x80040A00, // 002D RET 1 R5 - 0x000C070C, // 002E ADD R3 R3 K12 - 0x7001FFD6, // 002F JMP #0007 - 0x80000000, // 0030 RET 0 + 0x781A0002, // 0020 JMPF R6 #0024 + 0x8C180B09, // 0021 GETMET R6 R5 K9 + 0x7C180200, // 0022 CALL R6 1 + 0x80040A00, // 0023 RET 1 R5 + 0x000C070A, // 0024 ADD R3 R3 K10 + 0x7001FFE0, // 0025 JMP #0007 + 0x80000000, // 0026 RET 0 }) ) ); @@ -1182,7 +1170,7 @@ be_local_closure(Matter_Session_Store_save_fabrics, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[28]) { /* constants */ + ( &(const bvalue[29]) { /* constants */ /* K0 */ be_nested_str_weak(json), /* K1 */ be_nested_str_weak(remove_expired), /* K2 */ be_const_int(0), @@ -1206,11 +1194,12 @@ be_local_closure(Matter_Session_Store_save_fabrics, /* name */ /* K20 */ be_nested_str_weak(log), /* K21 */ be_nested_str_weak(format), /* K22 */ be_nested_str_weak(MTR_X3A_X20_X3DSaved_X20_X20_X20_X20_X20_X25i_X20fabric_X28s_X29_X20and_X20_X25i_X20session_X28s_X29), - /* K23 */ be_const_int(2), + /* K23 */ be_const_int(3), /* K24 */ be_nested_str_weak(device), /* K25 */ be_nested_str_weak(event_fabrics_saved), /* K26 */ be_nested_str_weak(MTR_X3A_X20Session_Store_X3A_X3Asave_X20Exception_X3A), /* K27 */ be_nested_str_weak(_X7C), + /* K28 */ be_const_int(2), }), be_str_weak(save_fabrics), &be_const_str_solidified, @@ -1297,7 +1286,7 @@ be_local_closure(Matter_Session_Store_save_fabrics, /* name */ 0x5C2C0C00, // 004F MOVE R11 R6 0x7C280200, // 0050 CALL R10 1 0x0024120A, // 0051 ADD R9 R9 R10 - 0x58280017, // 0052 LDCONST R10 K23 + 0x5828001C, // 0052 LDCONST R10 K28 0x7C1C0600, // 0053 CALL R7 3 0x70020000, // 0054 JMP #0056 0xB0080000, // 0055 RAISE 2 R0 R0 diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_UDPServer.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_UDPServer.h index a95cc8253..d9e482693 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_UDPServer.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_UDPServer.h @@ -219,7 +219,7 @@ be_local_closure(Matter_UDPServer__resend_packets, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[23]) { /* constants */ + ( &(const bvalue[22]) { /* constants */ /* K0 */ be_const_int(0), /* K1 */ be_nested_str_weak(packets_sent), /* K2 */ be_nested_str_weak(tasmota), @@ -230,19 +230,18 @@ be_local_closure(Matter_UDPServer__resend_packets, /* name */ /* K7 */ be_nested_str_weak(log), /* K8 */ be_nested_str_weak(MTR_X3A_X20_X2E_X20_X20_X20_X20_X20_X20_X20_X20_X20_X20Resending_X20packet_X20id_X3D), /* K9 */ be_nested_str_weak(msg_id), - /* K10 */ be_const_int(3), - /* K11 */ be_nested_str_weak(send), - /* K12 */ be_nested_str_weak(millis), - /* K13 */ be_nested_str_weak(_backoff_time), - /* K14 */ be_const_int(1), - /* K15 */ be_nested_str_weak(string), - /* K16 */ be_nested_str_weak(remove), - /* K17 */ be_nested_str_weak(format), - /* K18 */ be_nested_str_weak(MTR_X3A_X20_X2E_X20_X20_X20_X20_X20_X20_X20_X20_X20_X20_X28_X256i_X29_X20Unacked_X20packet_X20_X27_X5B_X25s_X5D_X3A_X25i_X27_X20msg_id_X3D_X25i), - /* K19 */ be_nested_str_weak(session_id), - /* K20 */ be_nested_str_weak(addr), - /* K21 */ be_nested_str_weak(port), - /* K22 */ be_const_int(2), + /* K10 */ be_nested_str_weak(send), + /* K11 */ be_nested_str_weak(millis), + /* K12 */ be_nested_str_weak(_backoff_time), + /* K13 */ be_const_int(1), + /* K14 */ be_nested_str_weak(string), + /* K15 */ be_nested_str_weak(remove), + /* K16 */ be_nested_str_weak(format), + /* K17 */ be_nested_str_weak(MTR_X3A_X20_X2E_X20_X20_X20_X20_X20_X20_X20_X20_X20_X20_X28_X256i_X29_X20Unacked_X20packet_X20_X27_X5B_X25s_X5D_X3A_X25i_X27_X20msg_id_X3D_X25i), + /* K18 */ be_nested_str_weak(session_id), + /* K19 */ be_nested_str_weak(addr), + /* K20 */ be_nested_str_weak(port), + /* K21 */ be_const_int(3), }), be_str_weak(_resend_packets), &be_const_str_solidified, @@ -270,42 +269,42 @@ be_local_closure(Matter_UDPServer__resend_packets, /* name */ 0x88180509, // 0014 GETMBR R6 R2 K9 0x7C140200, // 0015 CALL R5 1 0x00161005, // 0016 ADD R5 K8 R5 - 0x5818000A, // 0017 LDCONST R6 K10 + 0x541A0003, // 0017 LDINT R6 4 0x7C0C0600, // 0018 CALL R3 3 - 0x8C0C010B, // 0019 GETMET R3 R0 K11 + 0x8C0C010A, // 0019 GETMET R3 R0 K10 0x5C140400, // 001A MOVE R5 R2 0x7C0C0400, // 001B CALL R3 2 0xB80E0400, // 001C GETNGBL R3 K2 - 0x8C0C070C, // 001D GETMET R3 R3 K12 + 0x8C0C070B, // 001D GETMET R3 R3 K11 0x7C0C0200, // 001E CALL R3 1 - 0x8C10010D, // 001F GETMET R4 R0 K13 + 0x8C10010C, // 001F GETMET R4 R0 K12 0x88180505, // 0020 GETMBR R6 R2 K5 0x7C100400, // 0021 CALL R4 2 0x000C0604, // 0022 ADD R3 R3 R4 0x900A0803, // 0023 SETMBR R2 K4 R3 0x880C0505, // 0024 GETMBR R3 R2 K5 - 0x000C070E, // 0025 ADD R3 R3 K14 + 0x000C070D, // 0025 ADD R3 R3 K13 0x900A0A03, // 0026 SETMBR R2 K5 R3 - 0x0004030E, // 0027 ADD R1 R1 K14 + 0x0004030D, // 0027 ADD R1 R1 K13 0x7002000F, // 0028 JMP #0039 - 0xA40E1E00, // 0029 IMPORT R3 K15 + 0xA40E1C00, // 0029 IMPORT R3 K14 0x88100101, // 002A GETMBR R4 R0 K1 - 0x8C100910, // 002B GETMET R4 R4 K16 + 0x8C10090F, // 002B GETMET R4 R4 K15 0x5C180200, // 002C MOVE R6 R1 0x7C100400, // 002D CALL R4 2 0xB8120400, // 002E GETNGBL R4 K2 0x8C100907, // 002F GETMET R4 R4 K7 - 0x8C180711, // 0030 GETMET R6 R3 K17 - 0x58200012, // 0031 LDCONST R8 K18 - 0x88240513, // 0032 GETMBR R9 R2 K19 - 0x88280514, // 0033 GETMBR R10 R2 K20 - 0x882C0515, // 0034 GETMBR R11 R2 K21 + 0x8C180710, // 0030 GETMET R6 R3 K16 + 0x58200011, // 0031 LDCONST R8 K17 + 0x88240512, // 0032 GETMBR R9 R2 K18 + 0x88280513, // 0033 GETMBR R10 R2 K19 + 0x882C0514, // 0034 GETMBR R11 R2 K20 0x88300509, // 0035 GETMBR R12 R2 K9 0x7C180C00, // 0036 CALL R6 6 - 0x581C0016, // 0037 LDCONST R7 K22 + 0x581C0015, // 0037 LDCONST R7 K21 0x7C100600, // 0038 CALL R4 3 0x70020000, // 0039 JMP #003B - 0x0004030E, // 003A ADD R1 R1 K14 + 0x0004030D, // 003A ADD R1 R1 K13 0x7001FFC4, // 003B JMP #0001 0x80000000, // 003C RET 0 }) @@ -395,7 +394,7 @@ be_local_closure(Matter_UDPServer_every_50ms, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[15]) { /* constants */ + ( &(const bvalue[14]) { /* constants */ /* K0 */ be_nested_str_weak(string), /* K1 */ be_const_int(0), /* K2 */ be_nested_str_weak(udp_socket), @@ -407,10 +406,9 @@ be_local_closure(Matter_UDPServer_every_50ms, /* name */ /* K8 */ be_nested_str_weak(log), /* K9 */ be_nested_str_weak(format), /* K10 */ be_nested_str_weak(MTR_X3A_X20UDP_X20received_X20from_X20_X5B_X25s_X5D_X3A_X25i), - /* K11 */ be_const_int(3), - /* K12 */ be_nested_str_weak(dispatch_cb), - /* K13 */ be_nested_str_weak(MAX_PACKETS_READ), - /* K14 */ be_nested_str_weak(_resend_packets), + /* K11 */ be_nested_str_weak(dispatch_cb), + /* K12 */ be_nested_str_weak(MAX_PACKETS_READ), + /* K13 */ be_nested_str_weak(_resend_packets), }), be_str_weak(every_50ms), &be_const_str_solidified, @@ -440,16 +438,16 @@ be_local_closure(Matter_UDPServer_every_50ms, /* name */ 0x5C2C0800, // 0016 MOVE R11 R4 0x5C300A00, // 0017 MOVE R12 R5 0x7C200800, // 0018 CALL R8 4 - 0x5824000B, // 0019 LDCONST R9 K11 + 0x54260003, // 0019 LDINT R9 4 0x7C180600, // 001A CALL R6 3 - 0x8818010C, // 001B GETMBR R6 R0 K12 + 0x8818010B, // 001B GETMBR R6 R0 K11 0x781A0004, // 001C JMPF R6 #0022 - 0x8C18010C, // 001D GETMET R6 R0 K12 + 0x8C18010B, // 001D GETMET R6 R0 K11 0x5C200600, // 001E MOVE R8 R3 0x5C240800, // 001F MOVE R9 R4 0x5C280A00, // 0020 MOVE R10 R5 0x7C180800, // 0021 CALL R6 4 - 0x8818010D, // 0022 GETMBR R6 R0 K13 + 0x8818010C, // 0022 GETMBR R6 R0 K12 0x14180406, // 0023 LT R6 R2 R6 0x781A0004, // 0024 JMPF R6 #002A 0x88180102, // 0025 GETMBR R6 R0 K2 @@ -459,7 +457,7 @@ be_local_closure(Matter_UDPServer_every_50ms, /* name */ 0x70020000, // 0029 JMP #002B 0x4C0C0000, // 002A LDNIL R3 0x7001FFDD, // 002B JMP #000A - 0x8C10010E, // 002C GETMET R4 R0 K14 + 0x8C10010D, // 002C GETMET R4 R0 K13 0x7C100200, // 002D CALL R4 1 0x80000000, // 002E RET 0 }) @@ -578,67 +576,57 @@ be_local_closure(Matter_UDPServer_received_ack, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[12]) { /* constants */ + ( &(const bvalue[10]) { /* constants */ /* K0 */ be_nested_str_weak(ack_message_counter), /* K1 */ be_nested_str_weak(exchange_id), - /* K2 */ be_nested_str_weak(tasmota), - /* K3 */ be_nested_str_weak(log), - /* K4 */ be_nested_str_weak(MTR_X3A_X20receveived_X20ACK_X20id_X3D), - /* K5 */ be_const_int(3), - /* K6 */ be_const_int(0), - /* K7 */ be_nested_str_weak(packets_sent), - /* K8 */ be_nested_str_weak(msg_id), - /* K9 */ be_nested_str_weak(remove), - /* K10 */ be_nested_str_weak(MTR_X3A_X20_X2E_X20_X20_X20_X20_X20_X20_X20_X20_X20_X20Removed_X20packet_X20from_X20sending_X20list_X20id_X3D), - /* K11 */ be_const_int(1), + /* K2 */ be_const_int(0), + /* K3 */ be_nested_str_weak(packets_sent), + /* K4 */ be_nested_str_weak(msg_id), + /* K5 */ be_nested_str_weak(remove), + /* K6 */ be_nested_str_weak(tasmota), + /* K7 */ be_nested_str_weak(log), + /* K8 */ be_nested_str_weak(MTR_X3A_X20_X2E_X20_X20_X20_X20_X20_X20_X20_X20_X20_X20Removed_X20packet_X20from_X20sending_X20list_X20id_X3D), + /* K9 */ be_const_int(1), }), be_str_weak(received_ack), &be_const_str_solidified, - ( &(const binstruction[44]) { /* code */ + ( &(const binstruction[36]) { /* code */ 0x88080300, // 0000 GETMBR R2 R1 K0 0x880C0301, // 0001 GETMBR R3 R1 K1 0x4C100000, // 0002 LDNIL R4 0x1C100404, // 0003 EQ R4 R2 R4 0x78120000, // 0004 JMPF R4 #0006 0x80000800, // 0005 RET 0 - 0xB8120400, // 0006 GETNGBL R4 K2 - 0x8C100903, // 0007 GETMET R4 R4 K3 - 0x60180008, // 0008 GETGBL R6 G8 - 0x5C1C0400, // 0009 MOVE R7 R2 - 0x7C180200, // 000A CALL R6 1 - 0x001A0806, // 000B ADD R6 K4 R6 - 0x581C0005, // 000C LDCONST R7 K5 - 0x7C100600, // 000D CALL R4 3 - 0x58100006, // 000E LDCONST R4 K6 - 0x6014000C, // 000F GETGBL R5 G12 - 0x88180107, // 0010 GETMBR R6 R0 K7 - 0x7C140200, // 0011 CALL R5 1 - 0x14140805, // 0012 LT R5 R4 R5 - 0x78160016, // 0013 JMPF R5 #002B - 0x88140107, // 0014 GETMBR R5 R0 K7 - 0x94140A04, // 0015 GETIDX R5 R5 R4 - 0x88180B08, // 0016 GETMBR R6 R5 K8 - 0x1C180C02, // 0017 EQ R6 R6 R2 - 0x781A000F, // 0018 JMPF R6 #0029 - 0x88180B01, // 0019 GETMBR R6 R5 K1 - 0x1C180C03, // 001A EQ R6 R6 R3 - 0x781A000C, // 001B JMPF R6 #0029 - 0x88180107, // 001C GETMBR R6 R0 K7 - 0x8C180D09, // 001D GETMET R6 R6 K9 - 0x5C200800, // 001E MOVE R8 R4 - 0x7C180400, // 001F CALL R6 2 - 0xB81A0400, // 0020 GETNGBL R6 K2 - 0x8C180D03, // 0021 GETMET R6 R6 K3 - 0x60200008, // 0022 GETGBL R8 G8 - 0x5C240400, // 0023 MOVE R9 R2 - 0x7C200200, // 0024 CALL R8 1 - 0x00221408, // 0025 ADD R8 K10 R8 - 0x58240005, // 0026 LDCONST R9 K5 - 0x7C180600, // 0027 CALL R6 3 - 0x70020000, // 0028 JMP #002A - 0x0010090B, // 0029 ADD R4 R4 K11 - 0x7001FFE3, // 002A JMP #000F - 0x80000000, // 002B RET 0 + 0x58100002, // 0006 LDCONST R4 K2 + 0x6014000C, // 0007 GETGBL R5 G12 + 0x88180103, // 0008 GETMBR R6 R0 K3 + 0x7C140200, // 0009 CALL R5 1 + 0x14140805, // 000A LT R5 R4 R5 + 0x78160016, // 000B JMPF R5 #0023 + 0x88140103, // 000C GETMBR R5 R0 K3 + 0x94140A04, // 000D GETIDX R5 R5 R4 + 0x88180B04, // 000E GETMBR R6 R5 K4 + 0x1C180C02, // 000F EQ R6 R6 R2 + 0x781A000F, // 0010 JMPF R6 #0021 + 0x88180B01, // 0011 GETMBR R6 R5 K1 + 0x1C180C03, // 0012 EQ R6 R6 R3 + 0x781A000C, // 0013 JMPF R6 #0021 + 0x88180103, // 0014 GETMBR R6 R0 K3 + 0x8C180D05, // 0015 GETMET R6 R6 K5 + 0x5C200800, // 0016 MOVE R8 R4 + 0x7C180400, // 0017 CALL R6 2 + 0xB81A0C00, // 0018 GETNGBL R6 K6 + 0x8C180D07, // 0019 GETMET R6 R6 K7 + 0x60200008, // 001A GETGBL R8 G8 + 0x5C240400, // 001B MOVE R9 R2 + 0x7C200200, // 001C CALL R8 1 + 0x00221008, // 001D ADD R8 K8 R8 + 0x54260003, // 001E LDINT R9 4 + 0x7C180600, // 001F CALL R6 3 + 0x70020000, // 0020 JMP #0022 + 0x00100909, // 0021 ADD R4 R4 K9 + 0x7001FFE3, // 0022 JMP #0007 + 0x80000000, // 0023 RET 0 }) ) ); @@ -717,7 +705,7 @@ be_local_closure(Matter_UDPServer_send, /* name */ /* K10 */ be_nested_str_weak(format), /* K11 */ be_nested_str_weak(MTR_X3A_X20sending_X20packet_X20to_X20_X27_X5B_X25s_X5D_X3A_X25i_X27), /* K12 */ be_nested_str_weak(MTR_X3A_X20error_X20sending_X20packet_X20to_X20_X27_X5B_X25s_X5D_X3A_X25i_X27), - /* K13 */ be_const_int(2), + /* K13 */ be_const_int(3), }), be_str_weak(send), &be_const_str_solidified, diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_UI.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_UI.h index ba1b39dd0..bd60b72be 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_UI.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_UI.h @@ -7,122 +7,80 @@ extern const bclass be_class_Matter_UI; /******************************************************************** -** Solidified function: web_add_config_button +** Solidified function: equal_map ********************************************************************/ -be_local_closure(Matter_UI_web_add_config_button, /* name */ +be_local_closure(Matter_UI_equal_map, /* name */ be_nested_proto( - 5, /* nstack */ - 1, /* argc */ - 2, /* varg */ + 8, /* nstack */ + 2, /* argc */ + 4, /* varg */ 0, /* has upvals */ NULL, /* no upvals */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[ 6]) { /* constants */ - /* K0 */ be_nested_str_weak(webserver), - /* K1 */ be_nested_str_weak(content_send), - /* K2 */ be_nested_str_weak(_X3Cp_X3E_X3Cform_X20id_X3Dac_X20action_X3D_X27matterc_X27_X20style_X3D_X27display_X3A_X20block_X3B_X27_X20method_X3D_X27get_X27_X3E_X3Cbutton_X3E), - /* K3 */ be_nested_str_weak(matter), - /* K4 */ be_nested_str_weak(_LOGO), - /* K5 */ be_nested_str_weak(_X20Configure_X20Matter_X3C_X2Fbutton_X3E_X3C_X2Fform_X3E_X3C_X2Fp_X3E), + ( &(const bvalue[ 4]) { /* constants */ + /* K0 */ be_const_class(be_class_Matter_UI), + /* K1 */ be_nested_str_weak(keys), + /* K2 */ be_nested_str_weak(contains), + /* K3 */ be_nested_str_weak(stop_iteration), }), - be_str_weak(web_add_config_button), + be_str_weak(equal_map), &be_const_str_solidified, - ( &(const binstruction[12]) { /* code */ - 0xA4060000, // 0000 IMPORT R1 K0 - 0x8C080301, // 0001 GETMET R2 R1 K1 - 0x58100002, // 0002 LDCONST R4 K2 - 0x7C080400, // 0003 CALL R2 2 - 0x8C080301, // 0004 GETMET R2 R1 K1 - 0xB8120600, // 0005 GETNGBL R4 K3 - 0x88100904, // 0006 GETMBR R4 R4 K4 - 0x7C080400, // 0007 CALL R2 2 - 0x8C080301, // 0008 GETMET R2 R1 K1 - 0x58100005, // 0009 LDCONST R4 K5 - 0x7C080400, // 000A CALL R2 2 - 0x80000000, // 000B RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: show_passcode_form -********************************************************************/ -be_local_closure(Matter_UI_show_passcode_form, /* name */ - be_nested_proto( - 9, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[17]) { /* constants */ - /* K0 */ be_nested_str_weak(webserver), - /* K1 */ be_nested_str_weak(string), - /* K2 */ be_nested_str_weak(content_send), - /* K3 */ be_nested_str_weak(_X3Cfieldset_X3E_X3Clegend_X3E_X3Cb_X3E_X26nbsp_X3BMatter_X20Advanced_X20Configuration_X26nbsp_X3B_X3C_X2Fb_X3E_X3C_X2Flegend_X3E_X3Cp_X3E_X3C_X2Fp_X3E), - /* K4 */ be_nested_str_weak(_X3Cform_X20action_X3D_X27_X2Fmatterc_X27_X20method_X3D_X27post_X27_X20onsubmit_X3D_X27return_X20confirm_X28_X22This_X20will_X20cause_X20a_X20restart_X2E_X22_X29_X3B_X27_X3E_X3Cp_X3EPasscode_X3A_X3C_X2Fp_X3E), - /* K5 */ be_nested_str_weak(format), - /* K6 */ be_nested_str_weak(_X3Cinput_X20type_X3D_X27number_X27_X20min_X3D_X271_X27_X20max_X3D_X2799999998_X27_X20name_X3D_X27passcode_X27_X20value_X3D_X27_X25i_X27_X3E), - /* K7 */ be_nested_str_weak(device), - /* K8 */ be_nested_str_weak(root_passcode), - /* K9 */ be_nested_str_weak(_X3Cp_X3EDistinguish_X20id_X3A_X3C_X2Fp_X3E), - /* K10 */ be_nested_str_weak(_X3Cinput_X20type_X3D_X27number_X27_X20min_X3D_X270_X27_X20max_X3D_X274095_X27_X20name_X3D_X27discriminator_X27_X20value_X3D_X27_X25i_X27_X3E), - /* K11 */ be_nested_str_weak(root_discriminator), - /* K12 */ be_nested_str_weak(_X3Cp_X3E_X3Cinput_X20type_X3D_X27checkbox_X27_X20name_X3D_X27ipv4_X27_X25s_X3EIPv4_X20only_X3C_X2Fp_X3E), - /* K13 */ be_nested_str_weak(ipv4only), - /* K14 */ be_nested_str_weak(_X20checked), - /* K15 */ be_nested_str_weak(), - /* K16 */ be_nested_str_weak(_X3Cp_X3E_X3C_X2Fp_X3E_X3Cbutton_X20name_X3D_X27passcode_X27_X20class_X3D_X27button_X20bgrn_X27_X3EChange_X3C_X2Fbutton_X3E_X3C_X2Fform_X3E_X3C_X2Fp_X3E_X3Cp_X3E_X3C_X2Fp_X3E_X3C_X2Ffieldset_X3E_X3Cp_X3E_X3C_X2Fp_X3E), - }), - be_str_weak(show_passcode_form), - &be_const_str_solidified, - ( &(const binstruction[40]) { /* code */ - 0xA4060000, // 0000 IMPORT R1 K0 - 0xA40A0200, // 0001 IMPORT R2 K1 - 0x8C0C0302, // 0002 GETMET R3 R1 K2 - 0x58140003, // 0003 LDCONST R5 K3 - 0x7C0C0400, // 0004 CALL R3 2 - 0x8C0C0302, // 0005 GETMET R3 R1 K2 - 0x58140004, // 0006 LDCONST R5 K4 - 0x7C0C0400, // 0007 CALL R3 2 - 0x8C0C0302, // 0008 GETMET R3 R1 K2 - 0x8C140505, // 0009 GETMET R5 R2 K5 - 0x581C0006, // 000A LDCONST R7 K6 - 0x88200107, // 000B GETMBR R8 R0 K7 - 0x88201108, // 000C GETMBR R8 R8 K8 - 0x7C140600, // 000D CALL R5 3 - 0x7C0C0400, // 000E CALL R3 2 - 0x8C0C0302, // 000F GETMET R3 R1 K2 - 0x58140009, // 0010 LDCONST R5 K9 - 0x7C0C0400, // 0011 CALL R3 2 - 0x8C0C0302, // 0012 GETMET R3 R1 K2 - 0x8C140505, // 0013 GETMET R5 R2 K5 - 0x581C000A, // 0014 LDCONST R7 K10 - 0x88200107, // 0015 GETMBR R8 R0 K7 - 0x8820110B, // 0016 GETMBR R8 R8 K11 - 0x7C140600, // 0017 CALL R5 3 - 0x7C0C0400, // 0018 CALL R3 2 - 0x8C0C0302, // 0019 GETMET R3 R1 K2 - 0x8C140505, // 001A GETMET R5 R2 K5 - 0x581C000C, // 001B LDCONST R7 K12 - 0x88200107, // 001C GETMBR R8 R0 K7 - 0x8820110D, // 001D GETMBR R8 R8 K13 - 0x78220001, // 001E JMPF R8 #0021 - 0x5820000E, // 001F LDCONST R8 K14 - 0x70020000, // 0020 JMP #0022 - 0x5820000F, // 0021 LDCONST R8 K15 - 0x7C140600, // 0022 CALL R5 3 - 0x7C0C0400, // 0023 CALL R3 2 - 0x8C0C0302, // 0024 GETMET R3 R1 K2 - 0x58140010, // 0025 LDCONST R5 K16 - 0x7C0C0400, // 0026 CALL R3 2 - 0x80000000, // 0027 RET 0 + ( &(const binstruction[53]) { /* code */ + 0x58080000, // 0000 LDCONST R2 K0 + 0x600C0010, // 0001 GETGBL R3 G16 + 0x8C100101, // 0002 GETMET R4 R0 K1 + 0x7C100200, // 0003 CALL R4 1 + 0x7C0C0200, // 0004 CALL R3 1 + 0xA8020010, // 0005 EXBLK 0 #0017 + 0x5C100600, // 0006 MOVE R4 R3 + 0x7C100000, // 0007 CALL R4 0 + 0x8C140302, // 0008 GETMET R5 R1 K2 + 0x5C1C0800, // 0009 MOVE R7 R4 + 0x7C140400, // 000A CALL R5 2 + 0x74160002, // 000B JMPT R5 #000F + 0x50140000, // 000C LDBOOL R5 0 0 + 0xA8040001, // 000D EXBLK 1 1 + 0x80040A00, // 000E RET 1 R5 + 0x94140204, // 000F GETIDX R5 R1 R4 + 0x94180004, // 0010 GETIDX R6 R0 R4 + 0x20140A06, // 0011 NE R5 R5 R6 + 0x78160002, // 0012 JMPF R5 #0016 + 0x50140000, // 0013 LDBOOL R5 0 0 + 0xA8040001, // 0014 EXBLK 1 1 + 0x80040A00, // 0015 RET 1 R5 + 0x7001FFEE, // 0016 JMP #0006 + 0x580C0003, // 0017 LDCONST R3 K3 + 0xAC0C0200, // 0018 CATCH R3 1 0 + 0xB0080000, // 0019 RAISE 2 R0 R0 + 0x600C0010, // 001A GETGBL R3 G16 + 0x8C100301, // 001B GETMET R4 R1 K1 + 0x7C100200, // 001C CALL R4 1 + 0x7C0C0200, // 001D CALL R3 1 + 0xA8020010, // 001E EXBLK 0 #0030 + 0x5C100600, // 001F MOVE R4 R3 + 0x7C100000, // 0020 CALL R4 0 + 0x8C140102, // 0021 GETMET R5 R0 K2 + 0x5C1C0800, // 0022 MOVE R7 R4 + 0x7C140400, // 0023 CALL R5 2 + 0x74160002, // 0024 JMPT R5 #0028 + 0x50140000, // 0025 LDBOOL R5 0 0 + 0xA8040001, // 0026 EXBLK 1 1 + 0x80040A00, // 0027 RET 1 R5 + 0x94140204, // 0028 GETIDX R5 R1 R4 + 0x94180004, // 0029 GETIDX R6 R0 R4 + 0x20140A06, // 002A NE R5 R5 R6 + 0x78160002, // 002B JMPF R5 #002F + 0x50140000, // 002C LDBOOL R5 0 0 + 0xA8040001, // 002D EXBLK 1 1 + 0x80040A00, // 002E RET 1 R5 + 0x7001FFEE, // 002F JMP #001F + 0x580C0003, // 0030 LDCONST R3 K3 + 0xAC0C0200, // 0031 CATCH R3 1 0 + 0xB0080000, // 0032 RAISE 2 R0 R0 + 0x500C0200, // 0033 LDBOOL R3 1 0 + 0x80040600, // 0034 RET 1 R3 }) ) ); @@ -190,6 +148,1595 @@ be_local_closure(Matter_UI_page_part_mgr_adv, /* name */ /*******************************************************************/ +/******************************************************************** +** Solidified function: page_part_mgr +********************************************************************/ +be_local_closure(Matter_UI_page_part_mgr, /* name */ + be_nested_proto( + 6, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[15]) { /* constants */ + /* K0 */ be_nested_str_weak(webserver), + /* K1 */ be_nested_str_weak(string), + /* K2 */ be_nested_str_weak(check_privileged_access), + /* K3 */ be_nested_str_weak(content_start), + /* K4 */ be_nested_str_weak(Matter), + /* K5 */ be_nested_str_weak(content_send_style), + /* K6 */ be_nested_str_weak(show_enable), + /* K7 */ be_nested_str_weak(matter_enabled), + /* K8 */ be_nested_str_weak(show_plugins_configuration), + /* K9 */ be_nested_str_weak(content_send), + /* K10 */ be_nested_str_weak(_X3Cdiv_X20style_X3D_X27display_X3A_X20block_X3B_X27_X3E_X3C_X2Fdiv_X3E), + /* K11 */ be_nested_str_weak(_X3Cp_X3E_X3C_X2Fp_X3E_X3Cform_X20id_X3D_X27butmat_X27_X20style_X3D_X27display_X3A_X20block_X3B_X27_X20action_X3D_X27mattera_X27_X20method_X3D_X27get_X27_X3E_X3Cbutton_X20name_X3D_X27_X27_X3EAdvanced_X20Configuration_X3C_X2Fbutton_X3E_X3C_X2Fform_X3E), + /* K12 */ be_nested_str_weak(content_button), + /* K13 */ be_nested_str_weak(BUTTON_CONFIGURATION), + /* K14 */ be_nested_str_weak(content_stop), + }), + be_str_weak(page_part_mgr), + &be_const_str_solidified, + ( &(const binstruction[31]) { /* code */ + 0xA4060000, // 0000 IMPORT R1 K0 + 0xA40A0200, // 0001 IMPORT R2 K1 + 0x8C0C0302, // 0002 GETMET R3 R1 K2 + 0x7C0C0200, // 0003 CALL R3 1 + 0x740E0001, // 0004 JMPT R3 #0007 + 0x4C0C0000, // 0005 LDNIL R3 + 0x80040600, // 0006 RET 1 R3 + 0x8C0C0303, // 0007 GETMET R3 R1 K3 + 0x58140004, // 0008 LDCONST R5 K4 + 0x7C0C0400, // 0009 CALL R3 2 + 0x8C0C0305, // 000A GETMET R3 R1 K5 + 0x7C0C0200, // 000B CALL R3 1 + 0x8C0C0106, // 000C GETMET R3 R0 K6 + 0x7C0C0200, // 000D CALL R3 1 + 0x8C0C0107, // 000E GETMET R3 R0 K7 + 0x7C0C0200, // 000F CALL R3 1 + 0x780E0001, // 0010 JMPF R3 #0013 + 0x8C0C0108, // 0011 GETMET R3 R0 K8 + 0x7C0C0200, // 0012 CALL R3 1 + 0x8C0C0309, // 0013 GETMET R3 R1 K9 + 0x5814000A, // 0014 LDCONST R5 K10 + 0x7C0C0400, // 0015 CALL R3 2 + 0x8C0C0309, // 0016 GETMET R3 R1 K9 + 0x5814000B, // 0017 LDCONST R5 K11 + 0x7C0C0400, // 0018 CALL R3 2 + 0x8C0C030C, // 0019 GETMET R3 R1 K12 + 0x8814030D, // 001A GETMBR R5 R1 K13 + 0x7C0C0400, // 001B CALL R3 2 + 0x8C0C030E, // 001C GETMET R3 R1 K14 + 0x7C0C0200, // 001D CALL R3 1 + 0x80000000, // 001E RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: plugin_name +********************************************************************/ +be_local_closure(Matter_UI_plugin_name, /* name */ + be_nested_proto( + 6, /* nstack */ + 3, /* argc */ + 3, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 3]) { /* constants */ + /* K0 */ be_nested_str_weak(), + /* K1 */ be_nested_str_weak(device), + /* K2 */ be_nested_str_weak(get_plugin_class_displayname), + }), + be_str_weak(plugin_name), + &be_const_str_solidified, + ( &(const binstruction[ 8]) { /* code */ + 0x1C0C0300, // 0000 EQ R3 R1 K0 + 0x780E0000, // 0001 JMPF R3 #0003 + 0x80060000, // 0002 RET 1 K0 + 0x880C0101, // 0003 GETMBR R3 R0 K1 + 0x8C0C0702, // 0004 GETMET R3 R3 K2 + 0x5C140200, // 0005 MOVE R5 R1 + 0x7C0C0400, // 0006 CALL R3 2 + 0x80040600, // 0007 RET 1 R3 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: matter_enabled +********************************************************************/ +be_local_closure(Matter_UI_matter_enabled, /* name */ + be_nested_proto( + 5, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 4]) { /* constants */ + /* K0 */ be_nested_str_weak(tasmota), + /* K1 */ be_nested_str_weak(get_option), + /* K2 */ be_nested_str_weak(matter), + /* K3 */ be_nested_str_weak(MATTER_OPTION), + }), + be_str_weak(matter_enabled), + &be_const_str_solidified, + ( &(const binstruction[ 8]) { /* code */ + 0x60040017, // 0000 GETGBL R1 G23 + 0xB80A0000, // 0001 GETNGBL R2 K0 + 0x8C080501, // 0002 GETMET R2 R2 K1 + 0xB8120400, // 0003 GETNGBL R4 K2 + 0x88100903, // 0004 GETMBR R4 R4 K3 + 0x7C080400, // 0005 CALL R2 2 + 0x7C040200, // 0006 CALL R1 1 + 0x80040200, // 0007 RET 1 R1 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: generate_config_from_status +********************************************************************/ +be_local_closure(Matter_UI_generate_config_from_status, /* name */ + be_nested_proto( + 13, /* nstack */ + 3, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[17]) { /* constants */ + /* K0 */ be_const_int(0), + /* K1 */ be_nested_str_weak(contains), + /* K2 */ be_nested_str_weak(POWER), + /* K3 */ be_const_int(1), + /* K4 */ be_nested_str_weak(HSBColor), + /* K5 */ be_nested_str_weak(CT), + /* K6 */ be_nested_str_weak(Dimmer), + /* K7 */ be_nested_str_weak(push), + /* K8 */ be_nested_str_weak(type), + /* K9 */ be_nested_str_weak(light0), + /* K10 */ be_nested_str_weak(relay), + /* K11 */ be_nested_str_weak(stop_iteration), + /* K12 */ be_nested_str_weak(light1), + /* K13 */ be_nested_str_weak(light2), + /* K14 */ be_nested_str_weak(light3), + /* K15 */ be_nested_str_weak(device), + /* K16 */ be_nested_str_weak(autoconf_sensors_list), + }), + be_str_weak(generate_config_from_status), + &be_const_str_solidified, + ( &(const binstruction[96]) { /* code */ + 0x600C0012, // 0000 GETGBL R3 G18 + 0x7C0C0000, // 0001 CALL R3 0 + 0x58100000, // 0002 LDCONST R4 K0 + 0x8C140501, // 0003 GETMET R5 R2 K1 + 0x581C0002, // 0004 LDCONST R7 K2 + 0x7C140400, // 0005 CALL R5 2 + 0x78160001, // 0006 JMPF R5 #0009 + 0x58100003, // 0007 LDCONST R4 K3 + 0x7002000E, // 0008 JMP #0018 + 0x58140003, // 0009 LDCONST R5 K3 + 0x50180200, // 000A LDBOOL R6 1 0 + 0x781A000B, // 000B JMPF R6 #0018 + 0x8C180501, // 000C GETMET R6 R2 K1 + 0x60200008, // 000D GETGBL R8 G8 + 0x5C240A00, // 000E MOVE R9 R5 + 0x7C200200, // 000F CALL R8 1 + 0x00220408, // 0010 ADD R8 K2 R8 + 0x7C180400, // 0011 CALL R6 2 + 0x781A0002, // 0012 JMPF R6 #0016 + 0x5C100A00, // 0013 MOVE R4 R5 + 0x00140B03, // 0014 ADD R5 R5 K3 + 0x70020000, // 0015 JMP #0017 + 0x70020000, // 0016 JMP #0018 + 0x7001FFF1, // 0017 JMP #000A + 0x4C140000, // 0018 LDNIL R5 + 0x4C180000, // 0019 LDNIL R6 + 0x4C1C0000, // 001A LDNIL R7 + 0x8C200501, // 001B GETMET R8 R2 K1 + 0x58280004, // 001C LDCONST R10 K4 + 0x7C200400, // 001D CALL R8 2 + 0x78220002, // 001E JMPF R8 #0022 + 0x5C1C0800, // 001F MOVE R7 R4 + 0x04100903, // 0020 SUB R4 R4 K3 + 0x7002000C, // 0021 JMP #002F + 0x8C200501, // 0022 GETMET R8 R2 K1 + 0x58280005, // 0023 LDCONST R10 K5 + 0x7C200400, // 0024 CALL R8 2 + 0x78220002, // 0025 JMPF R8 #0029 + 0x5C180800, // 0026 MOVE R6 R4 + 0x04100903, // 0027 SUB R4 R4 K3 + 0x70020005, // 0028 JMP #002F + 0x8C200501, // 0029 GETMET R8 R2 K1 + 0x58280006, // 002A LDCONST R10 K6 + 0x7C200400, // 002B CALL R8 2 + 0x78220001, // 002C JMPF R8 #002F + 0x5C140800, // 002D MOVE R5 R4 + 0x04100903, // 002E SUB R4 R4 K3 + 0x60200010, // 002F GETGBL R8 G16 + 0x40260604, // 0030 CONNECT R9 K3 R4 + 0x7C200200, // 0031 CALL R8 1 + 0xA8020008, // 0032 EXBLK 0 #003C + 0x5C241000, // 0033 MOVE R9 R8 + 0x7C240000, // 0034 CALL R9 0 + 0x8C280707, // 0035 GETMET R10 R3 K7 + 0x60300013, // 0036 GETGBL R12 G19 + 0x7C300000, // 0037 CALL R12 0 + 0x98321109, // 0038 SETIDX R12 K8 K9 + 0x98321409, // 0039 SETIDX R12 K10 R9 + 0x7C280400, // 003A CALL R10 2 + 0x7001FFF6, // 003B JMP #0033 + 0x5820000B, // 003C LDCONST R8 K11 + 0xAC200200, // 003D CATCH R8 1 0 + 0xB0080000, // 003E RAISE 2 R0 R0 + 0x4C200000, // 003F LDNIL R8 + 0x20200A08, // 0040 NE R8 R5 R8 + 0x78220005, // 0041 JMPF R8 #0048 + 0x8C200707, // 0042 GETMET R8 R3 K7 + 0x60280013, // 0043 GETGBL R10 G19 + 0x7C280000, // 0044 CALL R10 0 + 0x982A110C, // 0045 SETIDX R10 K8 K12 + 0x982A1405, // 0046 SETIDX R10 K10 R5 + 0x7C200400, // 0047 CALL R8 2 + 0x4C200000, // 0048 LDNIL R8 + 0x20200C08, // 0049 NE R8 R6 R8 + 0x78220005, // 004A JMPF R8 #0051 + 0x8C200707, // 004B GETMET R8 R3 K7 + 0x60280013, // 004C GETGBL R10 G19 + 0x7C280000, // 004D CALL R10 0 + 0x982A110D, // 004E SETIDX R10 K8 K13 + 0x982A1406, // 004F SETIDX R10 K10 R6 + 0x7C200400, // 0050 CALL R8 2 + 0x4C200000, // 0051 LDNIL R8 + 0x20200E08, // 0052 NE R8 R7 R8 + 0x78220005, // 0053 JMPF R8 #005A + 0x8C200707, // 0054 GETMET R8 R3 K7 + 0x60280013, // 0055 GETGBL R10 G19 + 0x7C280000, // 0056 CALL R10 0 + 0x982A110E, // 0057 SETIDX R10 K8 K14 + 0x982A1407, // 0058 SETIDX R10 K10 R7 + 0x7C200400, // 0059 CALL R8 2 + 0x8820010F, // 005A GETMBR R8 R0 K15 + 0x8C201110, // 005B GETMET R8 R8 K16 + 0x5C280200, // 005C MOVE R10 R1 + 0x7C200400, // 005D CALL R8 2 + 0x000C0608, // 005E ADD R3 R3 R8 + 0x80040600, // 005F RET 1 R3 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: web_sensor +********************************************************************/ +be_local_closure(Matter_UI_web_sensor, /* name */ + be_nested_proto( + 12, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[19]) { /* constants */ + /* K0 */ be_nested_str_weak(webserver), + /* K1 */ be_nested_str_weak(string), + /* K2 */ be_nested_str_weak(matter_enabled), + /* K3 */ be_nested_str_weak(device), + /* K4 */ be_nested_str_weak(sessions), + /* K5 */ be_nested_str_weak(count_active_fabrics), + /* K6 */ be_const_int(0), + /* K7 */ be_nested_str_weak(content_send), + /* K8 */ be_nested_str_weak(format), + /* K9 */ be_nested_str_weak(_X3Cdiv_X20style_X3D_X27text_X2Dalign_X3Aright_X3Bfont_X2Dsize_X3A11px_X3Bcolor_X3A_X23aaa_X3Bpadding_X3A0px_X3B_X27_X3E_X25s_X3C_X2Fdiv_X3E), + /* K10 */ be_nested_str_weak(Matter_X3A_X20No_X20active_X20association), + /* K11 */ be_const_int(1), + /* K12 */ be_nested_str_weak(Matter_X3A_X20), + /* K13 */ be_nested_str_weak(_X20active_X20association), + /* K14 */ be_nested_str_weak(s), + /* K15 */ be_nested_str_weak(), + /* K16 */ be_nested_str_weak(show_bridge_status), + /* K17 */ be_nested_str_weak(is_root_commissioning_open), + /* K18 */ be_nested_str_weak(show_commissioning_info), + }), + be_str_weak(web_sensor), + &be_const_str_solidified, + ( &(const binstruction[43]) { /* code */ + 0xA4060000, // 0000 IMPORT R1 K0 + 0xA40A0200, // 0001 IMPORT R2 K1 + 0x8C0C0102, // 0002 GETMET R3 R0 K2 + 0x7C0C0200, // 0003 CALL R3 1 + 0x780E0024, // 0004 JMPF R3 #002A + 0x880C0103, // 0005 GETMBR R3 R0 K3 + 0x880C0704, // 0006 GETMBR R3 R3 K4 + 0x8C0C0705, // 0007 GETMET R3 R3 K5 + 0x7C0C0200, // 0008 CALL R3 1 + 0x1C100706, // 0009 EQ R4 R3 K6 + 0x78120006, // 000A JMPF R4 #0012 + 0x8C100307, // 000B GETMET R4 R1 K7 + 0x8C180508, // 000C GETMET R6 R2 K8 + 0x58200009, // 000D LDCONST R8 K9 + 0x5824000A, // 000E LDCONST R9 K10 + 0x7C180600, // 000F CALL R6 3 + 0x7C100400, // 0010 CALL R4 2 + 0x7002000F, // 0011 JMP #0022 + 0x2410070B, // 0012 GT R4 R3 K11 + 0x8C140307, // 0013 GETMET R5 R1 K7 + 0x8C1C0508, // 0014 GETMET R7 R2 K8 + 0x58240009, // 0015 LDCONST R9 K9 + 0x60280008, // 0016 GETGBL R10 G8 + 0x5C2C0600, // 0017 MOVE R11 R3 + 0x7C280200, // 0018 CALL R10 1 + 0x002A180A, // 0019 ADD R10 K12 R10 + 0x0028150D, // 001A ADD R10 R10 K13 + 0x78120001, // 001B JMPF R4 #001E + 0x582C000E, // 001C LDCONST R11 K14 + 0x70020000, // 001D JMP #001F + 0x582C000F, // 001E LDCONST R11 K15 + 0x0028140B, // 001F ADD R10 R10 R11 + 0x7C1C0600, // 0020 CALL R7 3 + 0x7C140400, // 0021 CALL R5 2 + 0x8C100110, // 0022 GETMET R4 R0 K16 + 0x7C100200, // 0023 CALL R4 1 + 0x88100103, // 0024 GETMBR R4 R0 K3 + 0x8C100911, // 0025 GETMET R4 R4 K17 + 0x7C100200, // 0026 CALL R4 1 + 0x78120001, // 0027 JMPF R4 #002A + 0x8C100112, // 0028 GETMET R4 R0 K18 + 0x7C100200, // 0029 CALL R4 1 + 0x80000000, // 002A RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: page_part_mgr_add +********************************************************************/ +be_local_closure(Matter_UI_page_part_mgr_add, /* name */ + be_nested_proto( + 7, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[13]) { /* constants */ + /* K0 */ be_nested_str_weak(webserver), + /* K1 */ be_nested_str_weak(string), + /* K2 */ be_nested_str_weak(check_privileged_access), + /* K3 */ be_nested_str_weak(content_start), + /* K4 */ be_nested_str_weak(Matter_X20Create_X20new_X20endpoint), + /* K5 */ be_nested_str_weak(content_send_style), + /* K6 */ be_nested_str_weak(arg), + /* K7 */ be_nested_str_weak(url), + /* K8 */ be_nested_str_weak(matter_enabled), + /* K9 */ be_nested_str_weak(show_remote_autoconf), + /* K10 */ be_nested_str_weak(content_button), + /* K11 */ be_nested_str_weak(BUTTON_CONFIGURATION), + /* K12 */ be_nested_str_weak(content_stop), + }), + be_str_weak(page_part_mgr_add), + &be_const_str_solidified, + ( &(const binstruction[27]) { /* code */ + 0xA4060000, // 0000 IMPORT R1 K0 + 0xA40A0200, // 0001 IMPORT R2 K1 + 0x8C0C0302, // 0002 GETMET R3 R1 K2 + 0x7C0C0200, // 0003 CALL R3 1 + 0x740E0001, // 0004 JMPT R3 #0007 + 0x4C0C0000, // 0005 LDNIL R3 + 0x80040600, // 0006 RET 1 R3 + 0x8C0C0303, // 0007 GETMET R3 R1 K3 + 0x58140004, // 0008 LDCONST R5 K4 + 0x7C0C0400, // 0009 CALL R3 2 + 0x8C0C0305, // 000A GETMET R3 R1 K5 + 0x7C0C0200, // 000B CALL R3 1 + 0x8C0C0306, // 000C GETMET R3 R1 K6 + 0x58140007, // 000D LDCONST R5 K7 + 0x7C0C0400, // 000E CALL R3 2 + 0x8C100108, // 000F GETMET R4 R0 K8 + 0x7C100200, // 0010 CALL R4 1 + 0x78120002, // 0011 JMPF R4 #0015 + 0x8C100109, // 0012 GETMET R4 R0 K9 + 0x5C180600, // 0013 MOVE R6 R3 + 0x7C100400, // 0014 CALL R4 2 + 0x8C10030A, // 0015 GETMET R4 R1 K10 + 0x8818030B, // 0016 GETMBR R6 R1 K11 + 0x7C100400, // 0017 CALL R4 2 + 0x8C10030C, // 0018 GETMET R4 R1 K12 + 0x7C100200, // 0019 CALL R4 1 + 0x80000000, // 001A RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: show_plugins_configuration +********************************************************************/ +be_local_closure(Matter_UI_show_plugins_configuration, /* name */ + be_nested_proto( + 26, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[58]) { /* constants */ + /* K0 */ be_nested_str_weak(webserver), + /* K1 */ be_nested_str_weak(string), + /* K2 */ be_nested_str_weak(introspect), + /* K3 */ be_nested_str_weak(content_send), + /* K4 */ be_nested_str_weak(_X3Cfieldset_X3E_X3Clegend_X3E_X3Cb_X3E_X26nbsp_X3BCurrent_X20Configuration_X26nbsp_X3B_X3C_X2Fb_X3E_X3C_X2Flegend_X3E_X3Cp_X3E_X3C_X2Fp_X3E), + /* K5 */ be_nested_str_weak(_X3Cform_X20action_X3D_X27_X2Fmatterc_X27_X20method_X3D_X27post_X27_X3E_X3Cp_X3E_X3Cb_X3ELocal_X20sensors_X20and_X20devices_X3C_X2Fb_X3E_X3C_X2Fp_X3E_X3Ctable_X20style_X3D_X27width_X3A100_X25_X27_X3E_X3Ctr_X3E_X3Ctd_X20width_X3D_X2725_X27_X3E_X23_X3C_X2Ftd_X3E_X3Ctd_X20width_X3D_X27115_X27_X3EType_X3C_X2Ftd_X3E_X3Ctd_X3EParameter_X3C_X2Ftd_X3E_X3Ctd_X20width_X3D_X2715_X27_X3E_X3C_X2Ftd_X3E_X3C_X2Ftr_X3E), + /* K6 */ be_nested_str_weak(device), + /* K7 */ be_nested_str_weak(plugins_config), + /* K8 */ be_nested_str_weak(remove), + /* K9 */ be_nested_str_weak(0), + /* K10 */ be_nested_str_weak(k2l_num), + /* K11 */ be_const_int(0), + /* K12 */ be_nested_str_weak(find), + /* K13 */ be_nested_str_weak(type), + /* K14 */ be_const_int(1), + /* K15 */ be_nested_str_weak(http_), + /* K16 */ be_nested_str_weak(plugins_classes), + /* K17 */ be_nested_str_weak(), + /* K18 */ be_nested_str_weak(ui_conf_to_string), + /* K19 */ be_nested_str_weak(format), + /* K20 */ be_nested_str_weak(_X3Ctr_X3E_X3Ctd_X20style_X3D_X27font_X2Dsize_X3Asmaller_X3B_X27_X3E_X3Cb_X3E_X25i_X3C_X2Fb_X3E_X3C_X2Ftd_X3E), + /* K21 */ be_nested_str_weak(_X3Ctd_X20style_X3D_X27font_X2Dsize_X3Asmaller_X3B_X27_X3E_X3Cb_X3E_X25s_X3C_X2Fb_X3E_X3C_X2Ftd_X3E), + /* K22 */ be_nested_str_weak(plugin_name), + /* K23 */ be_nested_str_weak(_X3Ctd_X20style_X3D_X27font_X2Dsize_X3Asmaller_X3B_X27_X3E_X3Cinput_X20type_X3D_X27text_X27_X20name_X3D_X27arg_X25i_X27_X20size_X3D_X278_X27_X20value_X3D_X27_X25s_X27_X20placeholder_X3D_X27_X25s_X27_X3E_X3C_X2Ftd_X3E), + /* K24 */ be_nested_str_weak(html_escape), + /* K25 */ be_nested_str_weak(ARG_HINT), + /* K26 */ be_nested_str_weak(_X3Ctd_X20style_X3D_X27text_X2Dalign_X3Acenter_X3B_X27_X3E_X3Cbutton_X20name_X3D_X27del_X25i_X27_X20style_X3D_X27background_X3Anone_X3Bborder_X3Anone_X3Bline_X2Dheight_X3A1_X3B_X27_X20onclick_X3D_X22return_X20confirm_X28_X27Confirm_X20removing_X20endpoint_X27_X29_X22_X3E_X26_X23128293_X3B_X3C_X2Fbutton_X3E_X3C_X2Ftd_X3E_X3C_X2Ftr_X3E), + /* K27 */ be_nested_str_weak(_X3C_X2Ftable_X3E), + /* K28 */ be_nested_str_weak(_X3Cp_X3E_X26lt_X3Bnone_X26gt_X3B_X3C_X2Fp_X3E), + /* K29 */ be_nested_str_weak(_X3Cp_X3E_X3C_X2Fp_X3E), + /* K30 */ be_nested_str_weak(url), + /* K31 */ be_nested_str_weak(push), + /* K32 */ be_nested_str_weak(stop_iteration), + /* K33 */ be_nested_str_weak(sort_distinct), + /* K34 */ be_nested_str_weak(_X26_X23x1F517_X3B_X20_X3Ca_X20target_X3D_X27_blank_X27_X20href_X3D_X22http_X3A_X2F_X2F_X25s_X2F_X22_X3E_X25s_X3C_X2Fa_X3E), + /* K35 */ be_nested_str_weak(_X3Ctable_X20style_X3D_X27width_X3A100_X25_X27_X3E), + /* K36 */ be_nested_str_weak(_X3Ctr_X3E_X3Ctd_X20width_X3D_X2725_X27_X3E_X3C_X2Ftd_X3E_X3Ctd_X20width_X3D_X27115_X27_X3E_X3C_X2Ftd_X3E_X3Ctd_X3E_X3C_X2Ftd_X3E_X3Ctd_X20width_X3D_X2715_X27_X3E_X3C_X2Ftd_X3E_X3C_X2Ftr_X3E), + /* K37 */ be_nested_str_weak(_X3Ctr_X3E_X3Ctd_X20width_X3D_X2722_X27_X20style_X3D_X27font_X2Dsize_X3Asmaller_X3B_X27_X3E_X3Cb_X3E_X25i_X3C_X2Fb_X3E_X3C_X2Ftd_X3E), + /* K38 */ be_nested_str_weak(_X3Ctd_X20width_X3D_X27115_X27_X20style_X3D_X27font_X2Dsize_X3Asmaller_X3B_X27_X3E_X3Cb_X3E_X25s_X3C_X2Fb_X3E_X3C_X2Fselect_X3E_X3C_X2Ftd_X3E), + /* K39 */ be_nested_str_weak(_X3Ctd_X20style_X3D_X27font_X2Dsize_X3Asmaller_X3B_X27_X3E_X3Cinput_X20type_X3D_X27text_X27_X20name_X3D_X27arg_X25i_X27_X20size_X3D_X278_X27_X20value_X3D_X27_X25s_X27_X3E_X3C_X2Ftd_X3E), + /* K40 */ be_nested_str_weak(_X3Ctd_X20width_X3D_X2715_X27_X20style_X3D_X27text_X2Dalign_X3Acenter_X3B_X27_X3E_X3Cbutton_X20name_X3D_X27del_X25i_X27_X20style_X3D_X27background_X3Anone_X3Bborder_X3Anone_X3Bline_X2Dheight_X3A1_X3B_X27_X20onclick_X3D_X22return_X20confirm_X28_X27Confirm_X20removing_X20endpoint_X27_X29_X22_X3E_X26_X23128293_X3B_X3C_X2Fbutton_X3E_X3C_X2Ftd_X3E_X3C_X2Ftr_X3E), + /* K41 */ be_nested_str_weak(_X3C_X2Ftable_X3E_X3Cp_X3E_X3C_X2Fp_X3E), + /* K42 */ be_nested_str_weak(_X3Cbutton_X20name_X3D_X27config_X27_X20class_X3D_X27button_X20bgrn_X27_X3EChange_X20configuration_X3C_X2Fbutton_X3E_X3C_X2Fform_X3E_X3Cp_X3E_X3C_X2Fp_X3E_X3C_X2Ffieldset_X3E), + /* K43 */ be_nested_str_weak(show_plugins_hints_js), + /* K44 */ be_nested_str_weak(_CLASSES_TYPES), + /* K45 */ be_nested_str_weak(_X3Cp_X3E_X3C_X2Fp_X3E_X3Cfieldset_X3E_X3Clegend_X3E_X3Cb_X3E_X26nbsp_X3BAdd_X20to_X20Configuration_X26nbsp_X3B_X3C_X2Fb_X3E_X3C_X2Flegend_X3E_X3Cp_X3E_X3C_X2Fp_X3E), + /* K46 */ be_nested_str_weak(_X3Cp_X3E_X3Cb_X3EAdd_X20local_X20sensor_X20or_X20device_X3C_X2Fb_X3E_X3C_X2Fp_X3E_X3Cform_X20action_X3D_X27_X2Fmatterc_X27_X20method_X3D_X27post_X27_X3E_X3Ctable_X20style_X3D_X27width_X3A100_X25_X27_X3E_X3Ctr_X3E_X3Ctd_X20width_X3D_X27145_X27_X3EType_X3C_X2Ftd_X3E_X3Ctd_X3EParameter_X3C_X2Ftd_X3E_X3C_X2Ftr_X3E), + /* K47 */ be_nested_str_weak(_X3Ctr_X3E_X3Ctd_X20style_X3D_X27font_X2Dsize_X3Asmaller_X3B_X27_X3E_X3Cselect_X20id_X3D_X27pi_X27_X20name_X3D_X27pi_X27_X20onchange_X3D_X27otm_X28_X22arg_X22_X2Cthis_X2Evalue_X29_X27_X3E), + /* K48 */ be_nested_str_weak(plugin_option), + /* K49 */ be_nested_str_weak(_X3C_X2Fselect_X3E_X3C_X2Ftd_X3E), + /* K50 */ be_nested_str_weak(_X3Ctd_X20style_X3D_X27font_X2Dsize_X3Asmaller_X3B_X27_X3E_X3Cinput_X20type_X3D_X27text_X27_X20id_X3D_X27arg_X27_X20name_X3D_X27arg_X27_X20size_X3D_X278_X27_X20value_X3D_X27_X27_X3E_X3C_X2Ftd_X3E_X3C_X2Ftr_X3E_X3C_X2Ftable_X3E), + /* K51 */ be_nested_str_weak(_X3Cdiv_X20style_X3D_X27display_X3A_X20block_X3B_X27_X3E_X3C_X2Fdiv_X3E), + /* K52 */ be_nested_str_weak(_X3Cbutton_X20name_X3D_X27addep_X27_X20class_X3D_X27button_X20bgrn_X27_X3ECreate_X20new_X20endpoint_X3C_X2Fbutton_X3E_X3C_X2Fform_X3E), + /* K53 */ be_nested_str_weak(_X3Chr_X3E_X3Cp_X3E_X3Cb_X3EAdd_X20Remote_X20Tasmota_X3C_X2Fb_X3E_X3C_X2Fp_X3E_X3Cform_X20action_X3D_X27_X2Fmatteradd_X27_X20method_X3D_X27get_X27_X3E_X3Ctable_X20style_X3D_X27width_X3A100_X25_X27_X3E), + /* K54 */ be_nested_str_weak(_X3Ctr_X3E_X3Ctd_X20width_X3D_X2730_X27_X20style_X3D_X27font_X2Dsize_X3Asmaller_X3B_X27_X3E_X3Cb_X3Ehttp_X3A_X2F_X2F_X3C_X2Fb_X3E_X3C_X2Ftd_X3E_X3Ctd_X3E_X3Cinput_X20type_X3D_X27text_X27_X20name_X3D_X27url_X27_X20size_X3D_X278_X27_X20value_X3D_X27_X27_X20required_X20placeholder_X3D_X27IP_X20or_X20domain_X27_X3E_X3C_X2Ftd_X3E_X3Ctd_X20width_X3D_X2710_X27_X20style_X3D_X27font_X2Dsize_X3Asmaller_X3B_X27_X3E_X3Cb_X3E_X2F_X3C_X2Fb_X3E_X3C_X2Ftd_X3E_X3C_X2Ftr_X3E_X3C_X2Ftr_X3E_X3C_X2Ftable_X3E), + /* K55 */ be_nested_str_weak(_X3Cbutton_X20class_X3D_X27button_X20bgrn_X27_X3EAuto_X2Dconfigure_X20remote_X20Tasmota_X3C_X2Fbutton_X3E_X3C_X2Fform_X3E_X3Chr_X3E), + /* K56 */ be_nested_str_weak(_X3Cform_X20action_X3D_X27_X2Fmatterc_X27_X20method_X3D_X27post_X27onsubmit_X3D_X27return_X20confirm_X28_X22This_X20will_X20RESET_X20the_X20configuration_X20to_X20the_X20default_X2E_X20You_X20will_X20need_X20to_X20associate_X20again_X2E_X22_X29_X3B_X27_X3E_X3Cbutton_X20name_X3D_X27auto_X27_X20class_X3D_X27button_X20bred_X27_X3EReset_X20all_X20and_X20Auto_X2Ddiscover_X3C_X2Fbutton_X3E_X3Cp_X3E_X3C_X2Fp_X3E_X3C_X2Fform_X3E), + /* K57 */ be_nested_str_weak(_X3Cp_X3E_X3C_X2Fp_X3E_X3C_X2Ffieldset_X3E), + }), + be_str_weak(show_plugins_configuration), + &be_const_str_solidified, + ( &(const binstruction[312]) { /* code */ + 0xA4060000, // 0000 IMPORT R1 K0 + 0xA40A0200, // 0001 IMPORT R2 K1 + 0xA40E0400, // 0002 IMPORT R3 K2 + 0x8C100303, // 0003 GETMET R4 R1 K3 + 0x58180004, // 0004 LDCONST R6 K4 + 0x7C100400, // 0005 CALL R4 2 + 0x8C100303, // 0006 GETMET R4 R1 K3 + 0x58180005, // 0007 LDCONST R6 K5 + 0x7C100400, // 0008 CALL R4 2 + 0x88100106, // 0009 GETMBR R4 R0 K6 + 0x88100907, // 000A GETMBR R4 R4 K7 + 0x8C100908, // 000B GETMET R4 R4 K8 + 0x58180009, // 000C LDCONST R6 K9 + 0x7C100400, // 000D CALL R4 2 + 0x88100106, // 000E GETMBR R4 R0 K6 + 0x8C10090A, // 000F GETMET R4 R4 K10 + 0x88180106, // 0010 GETMBR R6 R0 K6 + 0x88180D07, // 0011 GETMBR R6 R6 K7 + 0x7C100400, // 0012 CALL R4 2 + 0x5814000B, // 0013 LDCONST R5 K11 + 0x50180000, // 0014 LDBOOL R6 0 0 + 0x601C000C, // 0015 GETGBL R7 G12 + 0x5C200800, // 0016 MOVE R8 R4 + 0x7C1C0200, // 0017 CALL R7 1 + 0x141C0A07, // 0018 LT R7 R5 R7 + 0x781E004D, // 0019 JMPF R7 #0068 + 0x941C0805, // 001A GETIDX R7 R4 R5 + 0x88200106, // 001B GETMBR R8 R0 K6 + 0x88201107, // 001C GETMBR R8 R8 K7 + 0x8C20110C, // 001D GETMET R8 R8 K12 + 0x60280008, // 001E GETGBL R10 G8 + 0x5C2C0E00, // 001F MOVE R11 R7 + 0x7C280200, // 0020 CALL R10 1 + 0x7C200400, // 0021 CALL R8 2 + 0x8C24110C, // 0022 GETMET R9 R8 K12 + 0x582C000D, // 0023 LDCONST R11 K13 + 0x7C240400, // 0024 CALL R9 2 + 0x5C281200, // 0025 MOVE R10 R9 + 0x742A0001, // 0026 JMPT R10 #0029 + 0x00140B0E, // 0027 ADD R5 R5 K14 + 0x7001FFEB, // 0028 JMP #0015 + 0x8C28050C, // 0029 GETMET R10 R2 K12 + 0x5C301200, // 002A MOVE R12 R9 + 0x5834000F, // 002B LDCONST R13 K15 + 0x7C280600, // 002C CALL R10 3 + 0x1C28150B, // 002D EQ R10 R10 K11 + 0x782A0001, // 002E JMPF R10 #0031 + 0x00140B0E, // 002F ADD R5 R5 K14 + 0x7001FFE3, // 0030 JMP #0015 + 0x88280106, // 0031 GETMBR R10 R0 K6 + 0x88281510, // 0032 GETMBR R10 R10 K16 + 0x8C28150C, // 0033 GETMET R10 R10 K12 + 0x5C301200, // 0034 MOVE R12 R9 + 0x7C280400, // 0035 CALL R10 2 + 0x582C0011, // 0036 LDCONST R11 K17 + 0x4C300000, // 0037 LDNIL R12 + 0x2030140C, // 0038 NE R12 R10 R12 + 0x78320004, // 0039 JMPF R12 #003F + 0x8C301512, // 003A GETMET R12 R10 K18 + 0x5C381400, // 003B MOVE R14 R10 + 0x5C3C1000, // 003C MOVE R15 R8 + 0x7C300600, // 003D CALL R12 3 + 0x5C2C1800, // 003E MOVE R11 R12 + 0x50180200, // 003F LDBOOL R6 1 0 + 0x8C300303, // 0040 GETMET R12 R1 K3 + 0x8C380513, // 0041 GETMET R14 R2 K19 + 0x58400014, // 0042 LDCONST R16 K20 + 0x5C440E00, // 0043 MOVE R17 R7 + 0x7C380600, // 0044 CALL R14 3 + 0x7C300400, // 0045 CALL R12 2 + 0x8C300303, // 0046 GETMET R12 R1 K3 + 0x8C380513, // 0047 GETMET R14 R2 K19 + 0x58400015, // 0048 LDCONST R16 K21 + 0x8C440116, // 0049 GETMET R17 R0 K22 + 0x8C4C110C, // 004A GETMET R19 R8 K12 + 0x5854000D, // 004B LDCONST R21 K13 + 0x58580011, // 004C LDCONST R22 K17 + 0x7C4C0600, // 004D CALL R19 3 + 0x7C440400, // 004E CALL R17 2 + 0x7C380600, // 004F CALL R14 3 + 0x7C300400, // 0050 CALL R12 2 + 0x8C300303, // 0051 GETMET R12 R1 K3 + 0x8C380513, // 0052 GETMET R14 R2 K19 + 0x58400017, // 0053 LDCONST R16 K23 + 0x5C440E00, // 0054 MOVE R17 R7 + 0x8C480318, // 0055 GETMET R18 R1 K24 + 0x5C501600, // 0056 MOVE R20 R11 + 0x7C480400, // 0057 CALL R18 2 + 0x782A0003, // 0058 JMPF R10 #005D + 0x8C4C0318, // 0059 GETMET R19 R1 K24 + 0x88541519, // 005A GETMBR R21 R10 K25 + 0x7C4C0400, // 005B CALL R19 2 + 0x70020000, // 005C JMP #005E + 0x584C0011, // 005D LDCONST R19 K17 + 0x7C380A00, // 005E CALL R14 5 + 0x7C300400, // 005F CALL R12 2 + 0x8C300303, // 0060 GETMET R12 R1 K3 + 0x8C380513, // 0061 GETMET R14 R2 K19 + 0x5840001A, // 0062 LDCONST R16 K26 + 0x5C440E00, // 0063 MOVE R17 R7 + 0x7C380600, // 0064 CALL R14 3 + 0x7C300400, // 0065 CALL R12 2 + 0x00140B0E, // 0066 ADD R5 R5 K14 + 0x7001FFAC, // 0067 JMP #0015 + 0x8C1C0303, // 0068 GETMET R7 R1 K3 + 0x5824001B, // 0069 LDCONST R9 K27 + 0x7C1C0400, // 006A CALL R7 2 + 0x5C1C0C00, // 006B MOVE R7 R6 + 0x741E0002, // 006C JMPT R7 #0070 + 0x8C1C0303, // 006D GETMET R7 R1 K3 + 0x5824001C, // 006E LDCONST R9 K28 + 0x7C1C0400, // 006F CALL R7 2 + 0x8C1C0303, // 0070 GETMET R7 R1 K3 + 0x5824001D, // 0071 LDCONST R9 K29 + 0x7C1C0400, // 0072 CALL R7 2 + 0x601C0012, // 0073 GETGBL R7 G18 + 0x7C1C0000, // 0074 CALL R7 0 + 0x60200010, // 0075 GETGBL R8 G16 + 0x88240106, // 0076 GETMBR R9 R0 K6 + 0x88241307, // 0077 GETMBR R9 R9 K7 + 0x7C200200, // 0078 CALL R8 1 + 0xA802000B, // 0079 EXBLK 0 #0086 + 0x5C241000, // 007A MOVE R9 R8 + 0x7C240000, // 007B CALL R9 0 + 0x8C28130C, // 007C GETMET R10 R9 K12 + 0x5830001E, // 007D LDCONST R12 K30 + 0x7C280400, // 007E CALL R10 2 + 0x4C2C0000, // 007F LDNIL R11 + 0x202C140B, // 0080 NE R11 R10 R11 + 0x782E0002, // 0081 JMPF R11 #0085 + 0x8C2C0F1F, // 0082 GETMET R11 R7 K31 + 0x5C341400, // 0083 MOVE R13 R10 + 0x7C2C0400, // 0084 CALL R11 2 + 0x7001FFF3, // 0085 JMP #007A + 0x58200020, // 0086 LDCONST R8 K32 + 0xAC200200, // 0087 CATCH R8 1 0 + 0xB0080000, // 0088 RAISE 2 R0 R0 + 0x88200106, // 0089 GETMBR R8 R0 K6 + 0x8C201121, // 008A GETMET R8 R8 K33 + 0x5C280E00, // 008B MOVE R10 R7 + 0x7C200400, // 008C CALL R8 2 + 0x60200010, // 008D GETGBL R8 G16 + 0x5C240E00, // 008E MOVE R9 R7 + 0x7C200200, // 008F CALL R8 1 + 0xA802006C, // 0090 EXBLK 0 #00FE + 0x5C241000, // 0091 MOVE R9 R8 + 0x7C240000, // 0092 CALL R9 0 + 0x8C280303, // 0093 GETMET R10 R1 K3 + 0x8C300513, // 0094 GETMET R12 R2 K19 + 0x58380022, // 0095 LDCONST R14 K34 + 0x8C3C0318, // 0096 GETMET R15 R1 K24 + 0x5C441200, // 0097 MOVE R17 R9 + 0x7C3C0400, // 0098 CALL R15 2 + 0x8C400318, // 0099 GETMET R16 R1 K24 + 0x5C481200, // 009A MOVE R18 R9 + 0x7C400400, // 009B CALL R16 2 + 0x7C300800, // 009C CALL R12 4 + 0x7C280400, // 009D CALL R10 2 + 0x8C280303, // 009E GETMET R10 R1 K3 + 0x58300023, // 009F LDCONST R12 K35 + 0x7C280400, // 00A0 CALL R10 2 + 0x8C280303, // 00A1 GETMET R10 R1 K3 + 0x58300024, // 00A2 LDCONST R12 K36 + 0x7C280400, // 00A3 CALL R10 2 + 0x50180000, // 00A4 LDBOOL R6 0 0 + 0x5814000B, // 00A5 LDCONST R5 K11 + 0x6028000C, // 00A6 GETGBL R10 G12 + 0x5C2C0800, // 00A7 MOVE R11 R4 + 0x7C280200, // 00A8 CALL R10 1 + 0x14280A0A, // 00A9 LT R10 R5 R10 + 0x782A004E, // 00AA JMPF R10 #00FA + 0x94280805, // 00AB GETIDX R10 R4 R5 + 0x882C0106, // 00AC GETMBR R11 R0 K6 + 0x882C1707, // 00AD GETMBR R11 R11 K7 + 0x8C2C170C, // 00AE GETMET R11 R11 K12 + 0x60340008, // 00AF GETGBL R13 G8 + 0x5C381400, // 00B0 MOVE R14 R10 + 0x7C340200, // 00B1 CALL R13 1 + 0x7C2C0400, // 00B2 CALL R11 2 + 0x8C30170C, // 00B3 GETMET R12 R11 K12 + 0x5838000D, // 00B4 LDCONST R14 K13 + 0x7C300400, // 00B5 CALL R12 2 + 0x5C341800, // 00B6 MOVE R13 R12 + 0x74360001, // 00B7 JMPT R13 #00BA + 0x00140B0E, // 00B8 ADD R5 R5 K14 + 0x7001FFEB, // 00B9 JMP #00A6 + 0x8C34050C, // 00BA GETMET R13 R2 K12 + 0x5C3C1800, // 00BB MOVE R15 R12 + 0x5840000F, // 00BC LDCONST R16 K15 + 0x7C340600, // 00BD CALL R13 3 + 0x20341B0B, // 00BE NE R13 R13 K11 + 0x78360001, // 00BF JMPF R13 #00C2 + 0x00140B0E, // 00C0 ADD R5 R5 K14 + 0x7001FFE3, // 00C1 JMP #00A6 + 0x8C34170C, // 00C2 GETMET R13 R11 K12 + 0x583C001E, // 00C3 LDCONST R15 K30 + 0x7C340400, // 00C4 CALL R13 2 + 0x20341A09, // 00C5 NE R13 R13 R9 + 0x78360001, // 00C6 JMPF R13 #00C9 + 0x00140B0E, // 00C7 ADD R5 R5 K14 + 0x7001FFDC, // 00C8 JMP #00A6 + 0x88340106, // 00C9 GETMBR R13 R0 K6 + 0x88341B10, // 00CA GETMBR R13 R13 K16 + 0x8C341B0C, // 00CB GETMET R13 R13 K12 + 0x5C3C1800, // 00CC MOVE R15 R12 + 0x7C340400, // 00CD CALL R13 2 + 0x58380011, // 00CE LDCONST R14 K17 + 0x4C3C0000, // 00CF LDNIL R15 + 0x203C1A0F, // 00D0 NE R15 R13 R15 + 0x783E0004, // 00D1 JMPF R15 #00D7 + 0x8C3C1B12, // 00D2 GETMET R15 R13 K18 + 0x5C441A00, // 00D3 MOVE R17 R13 + 0x5C481600, // 00D4 MOVE R18 R11 + 0x7C3C0600, // 00D5 CALL R15 3 + 0x5C381E00, // 00D6 MOVE R14 R15 + 0x50180200, // 00D7 LDBOOL R6 1 0 + 0x8C3C0303, // 00D8 GETMET R15 R1 K3 + 0x8C440513, // 00D9 GETMET R17 R2 K19 + 0x584C0025, // 00DA LDCONST R19 K37 + 0x5C501400, // 00DB MOVE R20 R10 + 0x7C440600, // 00DC CALL R17 3 + 0x7C3C0400, // 00DD CALL R15 2 + 0x8C3C0303, // 00DE GETMET R15 R1 K3 + 0x8C440513, // 00DF GETMET R17 R2 K19 + 0x584C0026, // 00E0 LDCONST R19 K38 + 0x8C500116, // 00E1 GETMET R20 R0 K22 + 0x8C58170C, // 00E2 GETMET R22 R11 K12 + 0x5860000D, // 00E3 LDCONST R24 K13 + 0x58640011, // 00E4 LDCONST R25 K17 + 0x7C580600, // 00E5 CALL R22 3 + 0x7C500400, // 00E6 CALL R20 2 + 0x7C440600, // 00E7 CALL R17 3 + 0x7C3C0400, // 00E8 CALL R15 2 + 0x8C3C0303, // 00E9 GETMET R15 R1 K3 + 0x8C440513, // 00EA GETMET R17 R2 K19 + 0x584C0027, // 00EB LDCONST R19 K39 + 0x5C501400, // 00EC MOVE R20 R10 + 0x8C540318, // 00ED GETMET R21 R1 K24 + 0x5C5C1C00, // 00EE MOVE R23 R14 + 0x7C540400, // 00EF CALL R21 2 + 0x7C440800, // 00F0 CALL R17 4 + 0x7C3C0400, // 00F1 CALL R15 2 + 0x8C3C0303, // 00F2 GETMET R15 R1 K3 + 0x8C440513, // 00F3 GETMET R17 R2 K19 + 0x584C0028, // 00F4 LDCONST R19 K40 + 0x5C501400, // 00F5 MOVE R20 R10 + 0x7C440600, // 00F6 CALL R17 3 + 0x7C3C0400, // 00F7 CALL R15 2 + 0x00140B0E, // 00F8 ADD R5 R5 K14 + 0x7001FFAB, // 00F9 JMP #00A6 + 0x8C280303, // 00FA GETMET R10 R1 K3 + 0x58300029, // 00FB LDCONST R12 K41 + 0x7C280400, // 00FC CALL R10 2 + 0x7001FF92, // 00FD JMP #0091 + 0x58200020, // 00FE LDCONST R8 K32 + 0xAC200200, // 00FF CATCH R8 1 0 + 0xB0080000, // 0100 RAISE 2 R0 R0 + 0x5C200C00, // 0101 MOVE R8 R6 + 0x74220002, // 0102 JMPT R8 #0106 + 0x8C200303, // 0103 GETMET R8 R1 K3 + 0x5828001C, // 0104 LDCONST R10 K28 + 0x7C200400, // 0105 CALL R8 2 + 0x8C200303, // 0106 GETMET R8 R1 K3 + 0x5828002A, // 0107 LDCONST R10 K42 + 0x7C200400, // 0108 CALL R8 2 + 0x8C20012B, // 0109 GETMET R8 R0 K43 + 0x8828012C, // 010A GETMBR R10 R0 K44 + 0x7C200400, // 010B CALL R8 2 + 0x8C200303, // 010C GETMET R8 R1 K3 + 0x5828002D, // 010D LDCONST R10 K45 + 0x7C200400, // 010E CALL R8 2 + 0x8C200303, // 010F GETMET R8 R1 K3 + 0x5828002E, // 0110 LDCONST R10 K46 + 0x7C200400, // 0111 CALL R8 2 + 0x8C200303, // 0112 GETMET R8 R1 K3 + 0x5828002F, // 0113 LDCONST R10 K47 + 0x7C200400, // 0114 CALL R8 2 + 0x8C200130, // 0115 GETMET R8 R0 K48 + 0x58280011, // 0116 LDCONST R10 K17 + 0x882C012C, // 0117 GETMBR R11 R0 K44 + 0x7C200600, // 0118 CALL R8 3 + 0x8C200303, // 0119 GETMET R8 R1 K3 + 0x58280031, // 011A LDCONST R10 K49 + 0x7C200400, // 011B CALL R8 2 + 0x8C200303, // 011C GETMET R8 R1 K3 + 0x58280032, // 011D LDCONST R10 K50 + 0x7C200400, // 011E CALL R8 2 + 0x8C200303, // 011F GETMET R8 R1 K3 + 0x58280033, // 0120 LDCONST R10 K51 + 0x7C200400, // 0121 CALL R8 2 + 0x8C200303, // 0122 GETMET R8 R1 K3 + 0x58280034, // 0123 LDCONST R10 K52 + 0x7C200400, // 0124 CALL R8 2 + 0x8C200303, // 0125 GETMET R8 R1 K3 + 0x58280035, // 0126 LDCONST R10 K53 + 0x7C200400, // 0127 CALL R8 2 + 0x8C200303, // 0128 GETMET R8 R1 K3 + 0x58280036, // 0129 LDCONST R10 K54 + 0x7C200400, // 012A CALL R8 2 + 0x8C200303, // 012B GETMET R8 R1 K3 + 0x58280033, // 012C LDCONST R10 K51 + 0x7C200400, // 012D CALL R8 2 + 0x8C200303, // 012E GETMET R8 R1 K3 + 0x58280037, // 012F LDCONST R10 K55 + 0x7C200400, // 0130 CALL R8 2 + 0x8C200303, // 0131 GETMET R8 R1 K3 + 0x58280038, // 0132 LDCONST R10 K56 + 0x7C200400, // 0133 CALL R8 2 + 0x8C200303, // 0134 GETMET R8 R1 K3 + 0x58280039, // 0135 LDCONST R10 K57 + 0x7C200400, // 0136 CALL R8 2 + 0x80000000, // 0137 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: show_commissioning_info +********************************************************************/ +be_local_closure(Matter_UI_show_commissioning_info, /* name */ + be_nested_proto( + 14, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[19]) { /* constants */ + /* K0 */ be_nested_str_weak(webserver), + /* K1 */ be_nested_str_weak(string), + /* K2 */ be_nested_str_weak(device), + /* K3 */ be_nested_str_weak(commissioning_open), + /* K4 */ be_nested_str_weak(tasmota), + /* K5 */ be_nested_str_weak(millis), + /* K6 */ be_const_int(0), + /* K7 */ be_nested_str_weak(content_send), + /* K8 */ be_nested_str_weak(format), + /* K9 */ be_nested_str_weak(_X3Cfieldset_X3E_X3Clegend_X3E_X3Cb_X3E_X26nbsp_X3BCommissioning_X20open_X20for_X20_X25i_X20min_X26nbsp_X3B_X3C_X2Fb_X3E_X3C_X2Flegend_X3E_X3Cp_X3E_X3C_X2Fp_X3E), + /* K10 */ be_nested_str_weak(compute_manual_pairing_code), + /* K11 */ be_nested_str_weak(_X3Cp_X3EManual_X20pairing_X20code_X3A_X3Cbr_X3E_X3Cb_X3E_X25s_X2D_X25s_X2D_X25s_X3C_X2Fb_X3E_X3C_X2Fp_X3E_X3Chr_X3E), + /* K12 */ be_const_int(3), + /* K13 */ be_const_int(2147483647), + /* K14 */ be_nested_str_weak(_X3Cdiv_X3E_X3Ccenter_X3E), + /* K15 */ be_nested_str_weak(compute_qrcode_content), + /* K16 */ be_nested_str_weak(show_qrcode), + /* K17 */ be_nested_str_weak(_X3Cp_X3E_X20_X25s_X3C_X2Fp_X3E), + /* K18 */ be_nested_str_weak(_X3C_X2Fdiv_X3E_X3Cp_X3E_X3C_X2Fp_X3E_X3C_X2Ffieldset_X3E_X3Cp_X3E_X3C_X2Fp_X3E), + }), + be_str_weak(show_commissioning_info), + &be_const_str_solidified, + ( &(const binstruction[59]) { /* code */ + 0xA4060000, // 0000 IMPORT R1 K0 + 0xA40A0200, // 0001 IMPORT R2 K1 + 0x880C0102, // 0002 GETMBR R3 R0 K2 + 0x880C0703, // 0003 GETMBR R3 R3 K3 + 0xB8120800, // 0004 GETNGBL R4 K4 + 0x8C100905, // 0005 GETMET R4 R4 K5 + 0x7C100200, // 0006 CALL R4 1 + 0x040C0604, // 0007 SUB R3 R3 R4 + 0x541203E7, // 0008 LDINT R4 1000 + 0x0C0C0604, // 0009 DIV R3 R3 R4 + 0x14100706, // 000A LT R4 R3 K6 + 0x78120000, // 000B JMPF R4 #000D + 0x580C0006, // 000C LDCONST R3 K6 + 0x5412001D, // 000D LDINT R4 30 + 0x00100604, // 000E ADD R4 R3 R4 + 0x5416003B, // 000F LDINT R5 60 + 0x0C100805, // 0010 DIV R4 R4 R5 + 0x8C140307, // 0011 GETMET R5 R1 K7 + 0x8C1C0508, // 0012 GETMET R7 R2 K8 + 0x58240009, // 0013 LDCONST R9 K9 + 0x5C280800, // 0014 MOVE R10 R4 + 0x7C1C0600, // 0015 CALL R7 3 + 0x7C140400, // 0016 CALL R5 2 + 0x88140102, // 0017 GETMBR R5 R0 K2 + 0x8C140B0A, // 0018 GETMET R5 R5 K10 + 0x7C140200, // 0019 CALL R5 1 + 0x8C180307, // 001A GETMET R6 R1 K7 + 0x8C200508, // 001B GETMET R8 R2 K8 + 0x5828000B, // 001C LDCONST R10 K11 + 0x402E0D0C, // 001D CONNECT R11 K6 K12 + 0x942C0A0B, // 001E GETIDX R11 R5 R11 + 0x54320003, // 001F LDINT R12 4 + 0x54360005, // 0020 LDINT R13 6 + 0x4030180D, // 0021 CONNECT R12 R12 R13 + 0x94300A0C, // 0022 GETIDX R12 R5 R12 + 0x54360006, // 0023 LDINT R13 7 + 0x40341B0D, // 0024 CONNECT R13 R13 K13 + 0x94340A0D, // 0025 GETIDX R13 R5 R13 + 0x7C200A00, // 0026 CALL R8 5 + 0x7C180400, // 0027 CALL R6 2 + 0x8C180307, // 0028 GETMET R6 R1 K7 + 0x5820000E, // 0029 LDCONST R8 K14 + 0x7C180400, // 002A CALL R6 2 + 0x88180102, // 002B GETMBR R6 R0 K2 + 0x8C180D0F, // 002C GETMET R6 R6 K15 + 0x7C180200, // 002D CALL R6 1 + 0x8C1C0110, // 002E GETMET R7 R0 K16 + 0x5C240C00, // 002F MOVE R9 R6 + 0x7C1C0400, // 0030 CALL R7 2 + 0x8C1C0307, // 0031 GETMET R7 R1 K7 + 0x8C240508, // 0032 GETMET R9 R2 K8 + 0x582C0011, // 0033 LDCONST R11 K17 + 0x5C300C00, // 0034 MOVE R12 R6 + 0x7C240600, // 0035 CALL R9 3 + 0x7C1C0400, // 0036 CALL R7 2 + 0x8C1C0307, // 0037 GETMET R7 R1 K7 + 0x58240012, // 0038 LDCONST R9 K18 + 0x7C1C0400, // 0039 CALL R7 2 + 0x80000000, // 003A RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: show_remote_autoconf +********************************************************************/ +be_local_closure(Matter_UI_show_remote_autoconf, /* name */ + be_nested_proto( + 26, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[48]) { /* constants */ + /* K0 */ be_nested_str_weak(webserver), + /* K1 */ be_nested_str_weak(string), + /* K2 */ be_nested_str_weak(json), + /* K3 */ be_nested_str_weak(), + /* K4 */ be_nested_str_weak(matter), + /* K5 */ be_nested_str_weak(Plugin_Bridge_HTTP), + /* K6 */ be_nested_str_weak(PROBE_TIMEOUT), + /* K7 */ be_nested_str_weak(HTTP_remote), + /* K8 */ be_nested_str_weak(call_sync), + /* K9 */ be_nested_str_weak(Status_X208), + /* K10 */ be_nested_str_weak(load), + /* K11 */ be_nested_str_weak(find), + /* K12 */ be_nested_str_weak(StatusSNS), + /* K13 */ be_nested_str_weak(Status_X2011), + /* K14 */ be_nested_str_weak(StatusSTS), + /* K15 */ be_nested_str_weak(tasmota), + /* K16 */ be_nested_str_weak(log), + /* K17 */ be_nested_str_weak(format), + /* K18 */ be_nested_str_weak(MTR_X3A_X20probed_X20_X27_X25s_X27_X20status8_X3D_X25s_X20satus11_X3D_X25s), + /* K19 */ be_const_int(3), + /* K20 */ be_nested_str_weak(generate_config_from_status), + /* K21 */ be_nested_str_weak(show_plugins_hints_js), + /* K22 */ be_nested_str_weak(_CLASSES_TYPES2), + /* K23 */ be_nested_str_weak(content_send), + /* K24 */ be_nested_str_weak(_X3Cfieldset_X3E_X3Clegend_X3E_X3Cb_X3E_X26nbsp_X3BMatter_X20Remote_X20Device_X26nbsp_X3B_X3C_X2Fb_X3E_X3C_X2Flegend_X3E_X3Cp_X3E_X3C_X2Fp_X3E_X3Cp_X3E_X3Cb_X3EAdd_X20Remote_X20sensor_X20or_X20device_X3C_X2Fb_X3E_X3C_X2Fp_X3E), + /* K25 */ be_nested_str_weak(_X3Cp_X3E_X26_X23x1F517_X3B_X20_X3Ca_X20target_X3D_X27_blank_X27_X20href_X3D_X22http_X3A_X2F_X2F_X25s_X2F_X22_X3E_X25s_X3C_X2Fa_X3E_X3C_X2Fp_X3E), + /* K26 */ be_nested_str_weak(html_escape), + /* K27 */ be_nested_str_weak(_X3Cform_X20action_X3D_X27_X2Fmatterc_X27_X20method_X3D_X27post_X27_X3E_X3Ctable_X20style_X3D_X27width_X3A100_X25_X27_X3E_X3Ctr_X3E_X3Ctd_X20width_X3D_X27145_X27_X3EType_X3C_X2Ftd_X3E_X3Ctd_X3EParameter_X3C_X2Ftd_X3E_X3C_X2Ftr_X3E), + /* K28 */ be_nested_str_weak(_X3Cinput_X20name_X3D_X27url_X27_X20type_X3D_X27hidden_X27_X20value_X3D_X27_X25s_X27_X3E), + /* K29 */ be_const_int(0), + /* K30 */ be_nested_str_weak(type), + /* K31 */ be_nested_str_weak(http_), + /* K32 */ be_nested_str_weak(device), + /* K33 */ be_nested_str_weak(plugins_classes), + /* K34 */ be_nested_str_weak(ui_conf_to_string), + /* K35 */ be_nested_str_weak(_X3Ctr_X3E_X3Ctd_X20style_X3D_X27font_X2Dsize_X3Asmaller_X3B_X27_X3E_X3Cselect_X20name_X3D_X27pi_X25i_X27_X20onchange_X3D_X27otm_X28_X22arg_X25i_X22_X2Cthis_X2Evalue_X29_X27_X3E), + /* K36 */ be_nested_str_weak(plugin_option), + /* K37 */ be_nested_str_weak(_X3C_X2Fselect_X3E_X3C_X2Ftd_X3E_X3Ctd_X20style_X3D_X27font_X2Dsize_X3Asmaller_X3B_X27_X3E), + /* K38 */ be_nested_str_weak(_X3Cinput_X20type_X3D_X27text_X27_X20id_X3D_X27arg_X25i_X27_X20name_X3D_X27arg_X25i_X27_X20size_X3D_X278_X27_X20value_X3D_X27_X25s_X27_X20placeholder_X3D_X27_X25s_X27_X3E), + /* K39 */ be_nested_str_weak(ARG_HINT), + /* K40 */ be_nested_str_weak(_X3C_X2Ftd_X3E_X3C_X2Ftr_X3E), + /* K41 */ be_const_int(1), + /* K42 */ be_nested_str_weak(_X3Cinput_X20type_X3D_X27text_X27_X20id_X3D_X27arg_X25i_X27_X20name_X3D_X27arg_X25i_X27_X20size_X3D_X278_X27_X20value_X3D_X27_X25s_X27_X3E), + /* K43 */ be_nested_str_weak(_X3C_X2Ftable_X3E), + /* K44 */ be_nested_str_weak(_X3Cdiv_X20style_X3D_X27display_X3A_X20block_X3B_X27_X3E_X3C_X2Fdiv_X3E), + /* K45 */ be_nested_str_weak(_X3Cbutton_X20name_X3D_X27addrem_X27_X20class_X3D_X27button_X20bgrn_X27_X3EAdd_X20endpoints_X3C_X2Fbutton_X3E_X3C_X2Fform_X3E), + /* K46 */ be_nested_str_weak(_X3C_X2Fform_X3E_X3C_X2Ffieldset_X3E), + /* K47 */ be_nested_str_weak(_X3Cp_X3E_X3Cb_X3EUnable_X20to_X20connect_X20to_X20_X27_X25s_X27_X3C_X2Fb_X3E_X3C_X2Fp_X3E), + }), + be_str_weak(show_remote_autoconf), + &be_const_str_solidified, + ( &(const binstruction[217]) { /* code */ + 0xA40A0000, // 0000 IMPORT R2 K0 + 0xA40E0200, // 0001 IMPORT R3 K1 + 0xA4120400, // 0002 IMPORT R4 K2 + 0x1C140303, // 0003 EQ R5 R1 K3 + 0x78160000, // 0004 JMPF R5 #0006 + 0x80000A00, // 0005 RET 0 + 0xB8160800, // 0006 GETNGBL R5 K4 + 0x88140B05, // 0007 GETMBR R5 R5 K5 + 0x88140B06, // 0008 GETMBR R5 R5 K6 + 0xB81A0800, // 0009 GETNGBL R6 K4 + 0x8C180D07, // 000A GETMET R6 R6 K7 + 0x5C200200, // 000B MOVE R8 R1 + 0x5C240A00, // 000C MOVE R9 R5 + 0x7C180600, // 000D CALL R6 3 + 0x8C1C0D08, // 000E GETMET R7 R6 K8 + 0x58240009, // 000F LDCONST R9 K9 + 0x5C280A00, // 0010 MOVE R10 R5 + 0x7C1C0600, // 0011 CALL R7 3 + 0x4C200000, // 0012 LDNIL R8 + 0x20200E08, // 0013 NE R8 R7 R8 + 0x78220003, // 0014 JMPF R8 #0019 + 0x8C20090A, // 0015 GETMET R8 R4 K10 + 0x5C280E00, // 0016 MOVE R10 R7 + 0x7C200400, // 0017 CALL R8 2 + 0x5C1C1000, // 0018 MOVE R7 R8 + 0x4C200000, // 0019 LDNIL R8 + 0x20200E08, // 001A NE R8 R7 R8 + 0x78220003, // 001B JMPF R8 #0020 + 0x8C200F0B, // 001C GETMET R8 R7 K11 + 0x5828000C, // 001D LDCONST R10 K12 + 0x7C200400, // 001E CALL R8 2 + 0x5C1C1000, // 001F MOVE R7 R8 + 0x4C200000, // 0020 LDNIL R8 + 0x4C240000, // 0021 LDNIL R9 + 0x20240E09, // 0022 NE R9 R7 R9 + 0x78260012, // 0023 JMPF R9 #0037 + 0x8C240D08, // 0024 GETMET R9 R6 K8 + 0x582C000D, // 0025 LDCONST R11 K13 + 0x5C300A00, // 0026 MOVE R12 R5 + 0x7C240600, // 0027 CALL R9 3 + 0x5C201200, // 0028 MOVE R8 R9 + 0x4C240000, // 0029 LDNIL R9 + 0x20241009, // 002A NE R9 R8 R9 + 0x78260003, // 002B JMPF R9 #0030 + 0x8C24090A, // 002C GETMET R9 R4 K10 + 0x5C2C1000, // 002D MOVE R11 R8 + 0x7C240400, // 002E CALL R9 2 + 0x5C201200, // 002F MOVE R8 R9 + 0x4C240000, // 0030 LDNIL R9 + 0x20241009, // 0031 NE R9 R8 R9 + 0x78260003, // 0032 JMPF R9 #0037 + 0x8C24110B, // 0033 GETMET R9 R8 K11 + 0x582C000E, // 0034 LDCONST R11 K14 + 0x7C240400, // 0035 CALL R9 2 + 0x5C201200, // 0036 MOVE R8 R9 + 0x4C240000, // 0037 LDNIL R9 + 0x20240E09, // 0038 NE R9 R7 R9 + 0x78260095, // 0039 JMPF R9 #00D0 + 0x4C240000, // 003A LDNIL R9 + 0x20241009, // 003B NE R9 R8 R9 + 0x78260092, // 003C JMPF R9 #00D0 + 0xB8261E00, // 003D GETNGBL R9 K15 + 0x8C241310, // 003E GETMET R9 R9 K16 + 0x8C2C0711, // 003F GETMET R11 R3 K17 + 0x58340012, // 0040 LDCONST R13 K18 + 0x5C380200, // 0041 MOVE R14 R1 + 0x603C0008, // 0042 GETGBL R15 G8 + 0x5C400E00, // 0043 MOVE R16 R7 + 0x7C3C0200, // 0044 CALL R15 1 + 0x60400008, // 0045 GETGBL R16 G8 + 0x5C441000, // 0046 MOVE R17 R8 + 0x7C400200, // 0047 CALL R16 1 + 0x7C2C0A00, // 0048 CALL R11 5 + 0x58300013, // 0049 LDCONST R12 K19 + 0x7C240600, // 004A CALL R9 3 + 0x8C240114, // 004B GETMET R9 R0 K20 + 0x5C2C0E00, // 004C MOVE R11 R7 + 0x5C301000, // 004D MOVE R12 R8 + 0x7C240600, // 004E CALL R9 3 + 0x8C280115, // 004F GETMET R10 R0 K21 + 0x88300116, // 0050 GETMBR R12 R0 K22 + 0x7C280400, // 0051 CALL R10 2 + 0x8C280517, // 0052 GETMET R10 R2 K23 + 0x58300018, // 0053 LDCONST R12 K24 + 0x7C280400, // 0054 CALL R10 2 + 0x8C280517, // 0055 GETMET R10 R2 K23 + 0x8C300711, // 0056 GETMET R12 R3 K17 + 0x58380019, // 0057 LDCONST R14 K25 + 0x8C3C051A, // 0058 GETMET R15 R2 K26 + 0x5C440200, // 0059 MOVE R17 R1 + 0x7C3C0400, // 005A CALL R15 2 + 0x8C40051A, // 005B GETMET R16 R2 K26 + 0x5C480200, // 005C MOVE R18 R1 + 0x7C400400, // 005D CALL R16 2 + 0x7C300800, // 005E CALL R12 4 + 0x7C280400, // 005F CALL R10 2 + 0x8C280517, // 0060 GETMET R10 R2 K23 + 0x5830001B, // 0061 LDCONST R12 K27 + 0x7C280400, // 0062 CALL R10 2 + 0x8C280517, // 0063 GETMET R10 R2 K23 + 0x8C300711, // 0064 GETMET R12 R3 K17 + 0x5838001C, // 0065 LDCONST R14 K28 + 0x8C3C051A, // 0066 GETMET R15 R2 K26 + 0x5C440200, // 0067 MOVE R17 R1 + 0x7C3C0400, // 0068 CALL R15 2 + 0x7C300600, // 0069 CALL R12 3 + 0x7C280400, // 006A CALL R10 2 + 0x5828001D, // 006B LDCONST R10 K29 + 0x602C000C, // 006C GETGBL R11 G12 + 0x5C301200, // 006D MOVE R12 R9 + 0x7C2C0200, // 006E CALL R11 1 + 0x142C140B, // 006F LT R11 R10 R11 + 0x782E0038, // 0070 JMPF R11 #00AA + 0x942C120A, // 0071 GETIDX R11 R9 R10 + 0x8C30170B, // 0072 GETMET R12 R11 K11 + 0x5838001E, // 0073 LDCONST R14 K30 + 0x583C0003, // 0074 LDCONST R15 K3 + 0x7C300600, // 0075 CALL R12 3 + 0x20341903, // 0076 NE R13 R12 K3 + 0x78360000, // 0077 JMPF R13 #0079 + 0x00323E0C, // 0078 ADD R12 K31 R12 + 0x88340120, // 0079 GETMBR R13 R0 K32 + 0x88341B21, // 007A GETMBR R13 R13 K33 + 0x8C341B0B, // 007B GETMET R13 R13 K11 + 0x5C3C1800, // 007C MOVE R15 R12 + 0x7C340400, // 007D CALL R13 2 + 0x58380003, // 007E LDCONST R14 K3 + 0x4C3C0000, // 007F LDNIL R15 + 0x203C1A0F, // 0080 NE R15 R13 R15 + 0x783E0004, // 0081 JMPF R15 #0087 + 0x8C3C1B22, // 0082 GETMET R15 R13 K34 + 0x5C441A00, // 0083 MOVE R17 R13 + 0x5C481600, // 0084 MOVE R18 R11 + 0x7C3C0600, // 0085 CALL R15 3 + 0x5C381E00, // 0086 MOVE R14 R15 + 0x8C3C0517, // 0087 GETMET R15 R2 K23 + 0x8C440711, // 0088 GETMET R17 R3 K17 + 0x584C0023, // 0089 LDCONST R19 K35 + 0x5C501400, // 008A MOVE R20 R10 + 0x5C541400, // 008B MOVE R21 R10 + 0x7C440800, // 008C CALL R17 4 + 0x7C3C0400, // 008D CALL R15 2 + 0x8C3C0124, // 008E GETMET R15 R0 K36 + 0x5C441800, // 008F MOVE R17 R12 + 0x88480116, // 0090 GETMBR R18 R0 K22 + 0x7C3C0600, // 0091 CALL R15 3 + 0x8C3C0517, // 0092 GETMET R15 R2 K23 + 0x58440025, // 0093 LDCONST R17 K37 + 0x7C3C0400, // 0094 CALL R15 2 + 0x8C3C0517, // 0095 GETMET R15 R2 K23 + 0x8C440711, // 0096 GETMET R17 R3 K17 + 0x584C0026, // 0097 LDCONST R19 K38 + 0x5C501400, // 0098 MOVE R20 R10 + 0x5C541400, // 0099 MOVE R21 R10 + 0x8C58051A, // 009A GETMET R22 R2 K26 + 0x5C601C00, // 009B MOVE R24 R14 + 0x7C580400, // 009C CALL R22 2 + 0x78360003, // 009D JMPF R13 #00A2 + 0x8C5C051A, // 009E GETMET R23 R2 K26 + 0x88641B27, // 009F GETMBR R25 R13 K39 + 0x7C5C0400, // 00A0 CALL R23 2 + 0x70020000, // 00A1 JMP #00A3 + 0x585C0003, // 00A2 LDCONST R23 K3 + 0x7C440C00, // 00A3 CALL R17 6 + 0x7C3C0400, // 00A4 CALL R15 2 + 0x8C3C0517, // 00A5 GETMET R15 R2 K23 + 0x58440028, // 00A6 LDCONST R17 K40 + 0x7C3C0400, // 00A7 CALL R15 2 + 0x00281529, // 00A8 ADD R10 R10 K41 + 0x7001FFC1, // 00A9 JMP #006C + 0x8C2C0517, // 00AA GETMET R11 R2 K23 + 0x8C340711, // 00AB GETMET R13 R3 K17 + 0x583C0023, // 00AC LDCONST R15 K35 + 0x5C401400, // 00AD MOVE R16 R10 + 0x5C441400, // 00AE MOVE R17 R10 + 0x7C340800, // 00AF CALL R13 4 + 0x7C2C0400, // 00B0 CALL R11 2 + 0x8C2C0124, // 00B1 GETMET R11 R0 K36 + 0x58340003, // 00B2 LDCONST R13 K3 + 0x88380116, // 00B3 GETMBR R14 R0 K22 + 0x7C2C0600, // 00B4 CALL R11 3 + 0x8C2C0517, // 00B5 GETMET R11 R2 K23 + 0x58340025, // 00B6 LDCONST R13 K37 + 0x7C2C0400, // 00B7 CALL R11 2 + 0x8C2C0517, // 00B8 GETMET R11 R2 K23 + 0x8C340711, // 00B9 GETMET R13 R3 K17 + 0x583C002A, // 00BA LDCONST R15 K42 + 0x5C401400, // 00BB MOVE R16 R10 + 0x5C441400, // 00BC MOVE R17 R10 + 0x58480003, // 00BD LDCONST R18 K3 + 0x7C340A00, // 00BE CALL R13 5 + 0x7C2C0400, // 00BF CALL R11 2 + 0x8C2C0517, // 00C0 GETMET R11 R2 K23 + 0x58340028, // 00C1 LDCONST R13 K40 + 0x7C2C0400, // 00C2 CALL R11 2 + 0x8C2C0517, // 00C3 GETMET R11 R2 K23 + 0x5834002B, // 00C4 LDCONST R13 K43 + 0x7C2C0400, // 00C5 CALL R11 2 + 0x8C2C0517, // 00C6 GETMET R11 R2 K23 + 0x5834002C, // 00C7 LDCONST R13 K44 + 0x7C2C0400, // 00C8 CALL R11 2 + 0x8C2C0517, // 00C9 GETMET R11 R2 K23 + 0x5834002D, // 00CA LDCONST R13 K45 + 0x7C2C0400, // 00CB CALL R11 2 + 0x8C2C0517, // 00CC GETMET R11 R2 K23 + 0x5834002E, // 00CD LDCONST R13 K46 + 0x7C2C0400, // 00CE CALL R11 2 + 0x70020007, // 00CF JMP #00D8 + 0x8C240517, // 00D0 GETMET R9 R2 K23 + 0x8C2C0711, // 00D1 GETMET R11 R3 K17 + 0x5834002F, // 00D2 LDCONST R13 K47 + 0x8C38051A, // 00D3 GETMET R14 R2 K26 + 0x5C400200, // 00D4 MOVE R16 R1 + 0x7C380400, // 00D5 CALL R14 2 + 0x7C2C0600, // 00D6 CALL R11 3 + 0x7C240400, // 00D7 CALL R9 2 + 0x80000000, // 00D8 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: show_fabric_info +********************************************************************/ +be_local_closure(Matter_UI_show_fabric_info, /* name */ + be_nested_proto( + 16, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[30]) { /* constants */ + /* K0 */ be_nested_str_weak(webserver), + /* K1 */ be_nested_str_weak(string), + /* K2 */ be_nested_str_weak(content_send), + /* K3 */ be_nested_str_weak(_X3Cfieldset_X3E_X3Clegend_X3E_X3Cb_X3E_X26nbsp_X3BFabrics_X26nbsp_X3B_X3C_X2Fb_X3E_X3C_X2Flegend_X3E_X3Cp_X3E_X3C_X2Fp_X3E_X3Cp_X3EAssociated_X20fabrics_X3A_X3C_X2Fp_X3E), + /* K4 */ be_nested_str_weak(device), + /* K5 */ be_nested_str_weak(sessions), + /* K6 */ be_const_int(0), + /* K7 */ be_nested_str_weak(_X3Cp_X3E_X3Cb_X3ENone_X3C_X2Fb_X3E_X3C_X2Fp_X3E), + /* K8 */ be_nested_str_weak(fabrics), + /* K9 */ be_nested_str_weak(persistables), + /* K10 */ be_nested_str_weak(_X3Chr_X3E), + /* K11 */ be_nested_str_weak(fabric_label), + /* K12 */ be_nested_str_weak(_X3CNo_X20label_X3E), + /* K13 */ be_nested_str_weak(html_escape), + /* K14 */ be_nested_str_weak(format), + /* K15 */ be_nested_str_weak(_X3Cfieldset_X3E_X3Clegend_X3E_X3Cb_X3E_X26nbsp_X3B_X23_X25i_X20_X25s_X3C_X2Fb_X3E_X20_X28_X25s_X29_X26nbsp_X3B_X3C_X2Flegend_X3E_X3Cp_X3E_X3C_X2Fp_X3E), + /* K16 */ be_nested_str_weak(get_fabric_index), + /* K17 */ be_nested_str_weak(get_admin_vendor_name), + /* K18 */ be_nested_str_weak(get_fabric_id), + /* K19 */ be_nested_str_weak(copy), + /* K20 */ be_nested_str_weak(reverse), + /* K21 */ be_nested_str_weak(get_device_id), + /* K22 */ be_nested_str_weak(Fabric_X3A_X20_X25s_X3Cbr_X3E), + /* K23 */ be_nested_str_weak(tohex), + /* K24 */ be_nested_str_weak(Device_X3A_X20_X25s_X3Cbr_X3E_X26nbsp_X3B), + /* K25 */ be_nested_str_weak(_X3Cform_X20action_X3D_X27_X2Fmatterc_X27_X20method_X3D_X27post_X27_X20onsubmit_X3D_X27return_X20confirm_X28_X22Are_X20you_X20sure_X3F_X22_X29_X3B_X27_X3E), + /* K26 */ be_nested_str_weak(_X3Cinput_X20name_X3D_X27del_fabric_X27_X20type_X3D_X27hidden_X27_X20value_X3D_X27_X25i_X27_X3E), + /* K27 */ be_nested_str_weak(_X3Cbutton_X20name_X3D_X27del_X27_X20class_X3D_X27button_X20bgrn_X27_X3EDelete_X20Fabric_X3C_X2Fbutton_X3E_X3C_X2Fform_X3E_X3C_X2Fp_X3E), + /* K28 */ be_nested_str_weak(_X3Cp_X3E_X3C_X2Fp_X3E_X3C_X2Ffieldset_X3E_X3Cp_X3E_X3C_X2Fp_X3E), + /* K29 */ be_nested_str_weak(stop_iteration), + }), + be_str_weak(show_fabric_info), + &be_const_str_solidified, + ( &(const binstruction[101]) { /* code */ + 0xA4060000, // 0000 IMPORT R1 K0 + 0xA40A0200, // 0001 IMPORT R2 K1 + 0x8C0C0302, // 0002 GETMET R3 R1 K2 + 0x58140003, // 0003 LDCONST R5 K3 + 0x7C0C0400, // 0004 CALL R3 2 + 0x600C000C, // 0005 GETGBL R3 G12 + 0x88100104, // 0006 GETMBR R4 R0 K4 + 0x88100905, // 0007 GETMBR R4 R4 K5 + 0x88100905, // 0008 GETMBR R4 R4 K5 + 0x7C0C0200, // 0009 CALL R3 1 + 0x1C0C0706, // 000A EQ R3 R3 K6 + 0x780E0003, // 000B JMPF R3 #0010 + 0x8C0C0302, // 000C GETMET R3 R1 K2 + 0x58140007, // 000D LDCONST R5 K7 + 0x7C0C0400, // 000E CALL R3 2 + 0x70020050, // 000F JMP #0061 + 0x500C0200, // 0010 LDBOOL R3 1 0 + 0x60100010, // 0011 GETGBL R4 G16 + 0x88140104, // 0012 GETMBR R5 R0 K4 + 0x88140B05, // 0013 GETMBR R5 R5 K5 + 0x88140B08, // 0014 GETMBR R5 R5 K8 + 0x8C140B09, // 0015 GETMET R5 R5 K9 + 0x7C140200, // 0016 CALL R5 1 + 0x7C100200, // 0017 CALL R4 1 + 0xA8020044, // 0018 EXBLK 0 #005E + 0x5C140800, // 0019 MOVE R5 R4 + 0x7C140000, // 001A CALL R5 0 + 0x5C180600, // 001B MOVE R6 R3 + 0x741A0002, // 001C JMPT R6 #0020 + 0x8C180302, // 001D GETMET R6 R1 K2 + 0x5820000A, // 001E LDCONST R8 K10 + 0x7C180400, // 001F CALL R6 2 + 0x500C0000, // 0020 LDBOOL R3 0 0 + 0x88180B0B, // 0021 GETMBR R6 R5 K11 + 0x5C1C0C00, // 0022 MOVE R7 R6 + 0x741E0000, // 0023 JMPT R7 #0025 + 0x5818000C, // 0024 LDCONST R6 K12 + 0x8C1C030D, // 0025 GETMET R7 R1 K13 + 0x5C240C00, // 0026 MOVE R9 R6 + 0x7C1C0400, // 0027 CALL R7 2 + 0x5C180E00, // 0028 MOVE R6 R7 + 0x8C1C0302, // 0029 GETMET R7 R1 K2 + 0x8C24050E, // 002A GETMET R9 R2 K14 + 0x582C000F, // 002B LDCONST R11 K15 + 0x8C300B10, // 002C GETMET R12 R5 K16 + 0x7C300200, // 002D CALL R12 1 + 0x5C340C00, // 002E MOVE R13 R6 + 0x8C380B11, // 002F GETMET R14 R5 K17 + 0x7C380200, // 0030 CALL R14 1 + 0x7C240A00, // 0031 CALL R9 5 + 0x7C1C0400, // 0032 CALL R7 2 + 0x8C1C0B12, // 0033 GETMET R7 R5 K18 + 0x7C1C0200, // 0034 CALL R7 1 + 0x8C1C0F13, // 0035 GETMET R7 R7 K19 + 0x7C1C0200, // 0036 CALL R7 1 + 0x8C1C0F14, // 0037 GETMET R7 R7 K20 + 0x7C1C0200, // 0038 CALL R7 1 + 0x8C200B15, // 0039 GETMET R8 R5 K21 + 0x7C200200, // 003A CALL R8 1 + 0x8C201113, // 003B GETMET R8 R8 K19 + 0x7C200200, // 003C CALL R8 1 + 0x8C201114, // 003D GETMET R8 R8 K20 + 0x7C200200, // 003E CALL R8 1 + 0x8C240302, // 003F GETMET R9 R1 K2 + 0x8C2C050E, // 0040 GETMET R11 R2 K14 + 0x58340016, // 0041 LDCONST R13 K22 + 0x8C380F17, // 0042 GETMET R14 R7 K23 + 0x7C380200, // 0043 CALL R14 1 + 0x7C2C0600, // 0044 CALL R11 3 + 0x7C240400, // 0045 CALL R9 2 + 0x8C240302, // 0046 GETMET R9 R1 K2 + 0x8C2C050E, // 0047 GETMET R11 R2 K14 + 0x58340018, // 0048 LDCONST R13 K24 + 0x8C381117, // 0049 GETMET R14 R8 K23 + 0x7C380200, // 004A CALL R14 1 + 0x7C2C0600, // 004B CALL R11 3 + 0x7C240400, // 004C CALL R9 2 + 0x8C240302, // 004D GETMET R9 R1 K2 + 0x582C0019, // 004E LDCONST R11 K25 + 0x7C240400, // 004F CALL R9 2 + 0x8C240302, // 0050 GETMET R9 R1 K2 + 0x8C2C050E, // 0051 GETMET R11 R2 K14 + 0x5834001A, // 0052 LDCONST R13 K26 + 0x8C380B10, // 0053 GETMET R14 R5 K16 + 0x7C380200, // 0054 CALL R14 1 + 0x7C2C0600, // 0055 CALL R11 3 + 0x7C240400, // 0056 CALL R9 2 + 0x8C240302, // 0057 GETMET R9 R1 K2 + 0x582C001B, // 0058 LDCONST R11 K27 + 0x7C240400, // 0059 CALL R9 2 + 0x8C240302, // 005A GETMET R9 R1 K2 + 0x582C001C, // 005B LDCONST R11 K28 + 0x7C240400, // 005C CALL R9 2 + 0x7001FFBA, // 005D JMP #0019 + 0x5810001D, // 005E LDCONST R4 K29 + 0xAC100200, // 005F CATCH R4 1 0 + 0xB0080000, // 0060 RAISE 2 R0 R0 + 0x8C0C0302, // 0061 GETMET R3 R1 K2 + 0x5814001C, // 0062 LDCONST R5 K28 + 0x7C0C0400, // 0063 CALL R3 2 + 0x80000000, // 0064 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: web_get_arg +********************************************************************/ +be_local_closure(Matter_UI_web_get_arg, /* name */ + be_nested_proto( + 5, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 7]) { /* constants */ + /* K0 */ be_nested_str_weak(webserver), + /* K1 */ be_nested_str_weak(has_arg), + /* K2 */ be_nested_str_weak(mtc0), + /* K3 */ be_nested_str_weak(device), + /* K4 */ be_nested_str_weak(stop_basic_commissioning), + /* K5 */ be_nested_str_weak(mtc1), + /* K6 */ be_nested_str_weak(start_root_basic_commissioning), + }), + be_str_weak(web_get_arg), + &be_const_str_solidified, + ( &(const binstruction[17]) { /* code */ + 0xA4060000, // 0000 IMPORT R1 K0 + 0x8C080301, // 0001 GETMET R2 R1 K1 + 0x58100002, // 0002 LDCONST R4 K2 + 0x7C080400, // 0003 CALL R2 2 + 0x780A0003, // 0004 JMPF R2 #0009 + 0x88080103, // 0005 GETMBR R2 R0 K3 + 0x8C080504, // 0006 GETMET R2 R2 K4 + 0x7C080200, // 0007 CALL R2 1 + 0x70020006, // 0008 JMP #0010 + 0x8C080301, // 0009 GETMET R2 R1 K1 + 0x58100005, // 000A LDCONST R4 K5 + 0x7C080400, // 000B CALL R2 2 + 0x780A0002, // 000C JMPF R2 #0010 + 0x88080103, // 000D GETMBR R2 R0 K3 + 0x8C080506, // 000E GETMET R2 R2 K6 + 0x7C080200, // 000F CALL R2 1 + 0x80000000, // 0010 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: plugin_option +********************************************************************/ +be_local_closure(Matter_UI_plugin_option, /* name */ + be_nested_proto( + 17, /* nstack */ + 3, /* argc */ + 3, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[17]) { /* constants */ + /* K0 */ be_nested_str_weak(webserver), + /* K1 */ be_nested_str_weak(string), + /* K2 */ be_nested_str_weak(split), + /* K3 */ be_nested_str_weak(_X7C), + /* K4 */ be_nested_str_weak(stop_iteration), + /* K5 */ be_const_int(0), + /* K6 */ be_nested_str_weak(), + /* K7 */ be_nested_str_weak(content_send), + /* K8 */ be_nested_str_weak(_X3Coption_X20value_X3D_X27_X27_X3E_X3C_X2Foption_X3E), + /* K9 */ be_nested_str_weak(_X2Dhttp), + /* K10 */ be_nested_str_weak(_X3Coption_X20value_X3D_X27_X27_X20disabled_X3E_X2D_X2D_X2D_X20Tasmota_X20Remote_X20_X2D_X2D_X2D_X3C_X2Foption_X3E), + /* K11 */ be_nested_str_weak(device), + /* K12 */ be_nested_str_weak(get_plugin_class_displayname), + /* K13 */ be_nested_str_weak(format), + /* K14 */ be_nested_str_weak(_X3Coption_X20value_X3D_X27_X25s_X27_X25s_X3E_X25s_X3C_X2Foption_X3E), + /* K15 */ be_nested_str_weak(_X20selected), + /* K16 */ be_const_int(1), + }), + be_str_weak(plugin_option), + &be_const_str_solidified, + ( &(const binstruction[57]) { /* code */ + 0xA40E0000, // 0000 IMPORT R3 K0 + 0xA4120200, // 0001 IMPORT R4 K1 + 0x60140012, // 0002 GETGBL R5 G18 + 0x7C140000, // 0003 CALL R5 0 + 0x60180010, // 0004 GETGBL R6 G16 + 0x5C1C0400, // 0005 MOVE R7 R2 + 0x7C180200, // 0006 CALL R6 1 + 0xA8020007, // 0007 EXBLK 0 #0010 + 0x5C1C0C00, // 0008 MOVE R7 R6 + 0x7C1C0000, // 0009 CALL R7 0 + 0x8C200902, // 000A GETMET R8 R4 K2 + 0x5C280E00, // 000B MOVE R10 R7 + 0x582C0003, // 000C LDCONST R11 K3 + 0x7C200600, // 000D CALL R8 3 + 0x00140A08, // 000E ADD R5 R5 R8 + 0x7001FFF7, // 000F JMP #0008 + 0x58180004, // 0010 LDCONST R6 K4 + 0xAC180200, // 0011 CATCH R6 1 0 + 0xB0080000, // 0012 RAISE 2 R0 R0 + 0x58180005, // 0013 LDCONST R6 K5 + 0x601C000C, // 0014 GETGBL R7 G12 + 0x5C200A00, // 0015 MOVE R8 R5 + 0x7C1C0200, // 0016 CALL R7 1 + 0x141C0C07, // 0017 LT R7 R6 R7 + 0x781E001E, // 0018 JMPF R7 #0038 + 0x941C0A06, // 0019 GETIDX R7 R5 R6 + 0x1C200F06, // 001A EQ R8 R7 K6 + 0x78220003, // 001B JMPF R8 #0020 + 0x8C200707, // 001C GETMET R8 R3 K7 + 0x58280008, // 001D LDCONST R10 K8 + 0x7C200400, // 001E CALL R8 2 + 0x70020015, // 001F JMP #0036 + 0x1C200F09, // 0020 EQ R8 R7 K9 + 0x78220003, // 0021 JMPF R8 #0026 + 0x8C200707, // 0022 GETMET R8 R3 K7 + 0x5828000A, // 0023 LDCONST R10 K10 + 0x7C200400, // 0024 CALL R8 2 + 0x7002000F, // 0025 JMP #0036 + 0x8820010B, // 0026 GETMBR R8 R0 K11 + 0x8C20110C, // 0027 GETMET R8 R8 K12 + 0x5C280E00, // 0028 MOVE R10 R7 + 0x7C200400, // 0029 CALL R8 2 + 0x8C240707, // 002A GETMET R9 R3 K7 + 0x8C2C090D, // 002B GETMET R11 R4 K13 + 0x5834000E, // 002C LDCONST R13 K14 + 0x5C380E00, // 002D MOVE R14 R7 + 0x1C3C0E01, // 002E EQ R15 R7 R1 + 0x783E0001, // 002F JMPF R15 #0032 + 0x583C000F, // 0030 LDCONST R15 K15 + 0x70020000, // 0031 JMP #0033 + 0x583C0006, // 0032 LDCONST R15 K6 + 0x5C401000, // 0033 MOVE R16 R8 + 0x7C2C0A00, // 0034 CALL R11 5 + 0x7C240400, // 0035 CALL R9 2 + 0x00180D10, // 0036 ADD R6 R6 K16 + 0x7001FFDB, // 0037 JMP #0014 + 0x80000000, // 0038 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: web_add_config_button +********************************************************************/ +be_local_closure(Matter_UI_web_add_config_button, /* name */ + be_nested_proto( + 5, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 6]) { /* constants */ + /* K0 */ be_nested_str_weak(webserver), + /* K1 */ be_nested_str_weak(content_send), + /* K2 */ be_nested_str_weak(_X3Cp_X3E_X3Cform_X20id_X3Dac_X20action_X3D_X27matterc_X27_X20style_X3D_X27display_X3A_X20block_X3B_X27_X20method_X3D_X27get_X27_X3E_X3Cbutton_X3E), + /* K3 */ be_nested_str_weak(matter), + /* K4 */ be_nested_str_weak(_LOGO), + /* K5 */ be_nested_str_weak(_X20Configure_X20Matter_X3C_X2Fbutton_X3E_X3C_X2Fform_X3E_X3C_X2Fp_X3E), + }), + be_str_weak(web_add_config_button), + &be_const_str_solidified, + ( &(const binstruction[12]) { /* code */ + 0xA4060000, // 0000 IMPORT R1 K0 + 0x8C080301, // 0001 GETMET R2 R1 K1 + 0x58100002, // 0002 LDCONST R4 K2 + 0x7C080400, // 0003 CALL R2 2 + 0x8C080301, // 0004 GETMET R2 R1 K1 + 0xB8120600, // 0005 GETNGBL R4 K3 + 0x88100904, // 0006 GETMBR R4 R4 K4 + 0x7C080400, // 0007 CALL R2 2 + 0x8C080301, // 0008 GETMET R2 R1 K1 + 0x58100005, // 0009 LDCONST R4 K5 + 0x7C080400, // 000A CALL R2 2 + 0x80000000, // 000B RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: init +********************************************************************/ +be_local_closure(Matter_UI_init, /* name */ + be_nested_proto( + 5, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 3]) { /* constants */ + /* K0 */ be_nested_str_weak(device), + /* K1 */ be_nested_str_weak(tasmota), + /* K2 */ be_nested_str_weak(add_driver), + }), + be_str_weak(init), + &be_const_str_solidified, + ( &(const binstruction[ 6]) { /* code */ + 0x90020001, // 0000 SETMBR R0 K0 R1 + 0xB80A0200, // 0001 GETNGBL R2 K1 + 0x8C080502, // 0002 GETMET R2 R2 K2 + 0x5C100000, // 0003 MOVE R4 R0 + 0x7C080400, // 0004 CALL R2 2 + 0x80000000, // 0005 RET 0 + }) + ) +); +/*******************************************************************/ + + /******************************************************************** ** Solidified function: show_bridge_status ********************************************************************/ @@ -343,13 +1890,160 @@ be_local_closure(Matter_UI_show_bridge_status, /* name */ /******************************************************************** -** Solidified function: plugin_option +** Solidified function: web_add_handler ********************************************************************/ -be_local_closure(Matter_UI_plugin_option, /* name */ +be_local_closure(Matter_UI_web_add_handler, /* name */ be_nested_proto( - 17, /* nstack */ - 3, /* argc */ - 3, /* varg */ + 7, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 1, /* has sup protos */ + ( &(const struct bproto*[ 4]) { + be_nested_proto( + 2, /* nstack */ + 0, /* argc */ + 0, /* varg */ + 1, /* has upvals */ + ( &(const bupvaldesc[ 1]) { /* upvals */ + be_local_const_upval(1, 0), + }), + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 1]) { /* constants */ + /* K0 */ be_nested_str_weak(page_part_mgr), + }), + be_str_weak(_X3Clambda_X3E), + &be_const_str_solidified, + ( &(const binstruction[ 4]) { /* code */ + 0x68000000, // 0000 GETUPV R0 U0 + 0x8C000100, // 0001 GETMET R0 R0 K0 + 0x7C000200, // 0002 CALL R0 1 + 0x80040000, // 0003 RET 1 R0 + }) + ), + be_nested_proto( + 2, /* nstack */ + 0, /* argc */ + 0, /* varg */ + 1, /* has upvals */ + ( &(const bupvaldesc[ 1]) { /* upvals */ + be_local_const_upval(1, 0), + }), + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 1]) { /* constants */ + /* K0 */ be_nested_str_weak(page_part_ctl), + }), + be_str_weak(_X3Clambda_X3E), + &be_const_str_solidified, + ( &(const binstruction[ 4]) { /* code */ + 0x68000000, // 0000 GETUPV R0 U0 + 0x8C000100, // 0001 GETMET R0 R0 K0 + 0x7C000200, // 0002 CALL R0 1 + 0x80040000, // 0003 RET 1 R0 + }) + ), + be_nested_proto( + 2, /* nstack */ + 0, /* argc */ + 0, /* varg */ + 1, /* has upvals */ + ( &(const bupvaldesc[ 1]) { /* upvals */ + be_local_const_upval(1, 0), + }), + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 1]) { /* constants */ + /* K0 */ be_nested_str_weak(page_part_mgr_adv), + }), + be_str_weak(_X3Clambda_X3E), + &be_const_str_solidified, + ( &(const binstruction[ 4]) { /* code */ + 0x68000000, // 0000 GETUPV R0 U0 + 0x8C000100, // 0001 GETMET R0 R0 K0 + 0x7C000200, // 0002 CALL R0 1 + 0x80040000, // 0003 RET 1 R0 + }) + ), + be_nested_proto( + 2, /* nstack */ + 0, /* argc */ + 0, /* varg */ + 1, /* has upvals */ + ( &(const bupvaldesc[ 1]) { /* upvals */ + be_local_const_upval(1, 0), + }), + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 1]) { /* constants */ + /* K0 */ be_nested_str_weak(page_part_mgr_add), + }), + be_str_weak(_X3Clambda_X3E), + &be_const_str_solidified, + ( &(const binstruction[ 4]) { /* code */ + 0x68000000, // 0000 GETUPV R0 U0 + 0x8C000100, // 0001 GETMET R0 R0 K0 + 0x7C000200, // 0002 CALL R0 1 + 0x80040000, // 0003 RET 1 R0 + }) + ), + }), + 1, /* has constants */ + ( &(const bvalue[ 7]) { /* constants */ + /* K0 */ be_nested_str_weak(webserver), + /* K1 */ be_nested_str_weak(on), + /* K2 */ be_nested_str_weak(_X2Fmatterc), + /* K3 */ be_nested_str_weak(HTTP_GET), + /* K4 */ be_nested_str_weak(HTTP_POST), + /* K5 */ be_nested_str_weak(_X2Fmattera), + /* K6 */ be_nested_str_weak(_X2Fmatteradd), + }), + be_str_weak(web_add_handler), + &be_const_str_solidified, + ( &(const binstruction[23]) { /* code */ + 0xA4060000, // 0000 IMPORT R1 K0 + 0x8C080301, // 0001 GETMET R2 R1 K1 + 0x58100002, // 0002 LDCONST R4 K2 + 0x84140000, // 0003 CLOSURE R5 P0 + 0x88180303, // 0004 GETMBR R6 R1 K3 + 0x7C080800, // 0005 CALL R2 4 + 0x8C080301, // 0006 GETMET R2 R1 K1 + 0x58100002, // 0007 LDCONST R4 K2 + 0x84140001, // 0008 CLOSURE R5 P1 + 0x88180304, // 0009 GETMBR R6 R1 K4 + 0x7C080800, // 000A CALL R2 4 + 0x8C080301, // 000B GETMET R2 R1 K1 + 0x58100005, // 000C LDCONST R4 K5 + 0x84140002, // 000D CLOSURE R5 P2 + 0x88180303, // 000E GETMBR R6 R1 K3 + 0x7C080800, // 000F CALL R2 4 + 0x8C080301, // 0010 GETMET R2 R1 K1 + 0x58100006, // 0011 LDCONST R4 K6 + 0x84140003, // 0012 CLOSURE R5 P3 + 0x88180303, // 0013 GETMBR R6 R1 K3 + 0x7C080800, // 0014 CALL R2 4 + 0xA0000000, // 0015 CLOSE R0 + 0x80000000, // 0016 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: show_passcode_form +********************************************************************/ +be_local_closure(Matter_UI_show_passcode_form, /* name */ + be_nested_proto( + 9, /* nstack */ + 1, /* argc */ + 2, /* varg */ 0, /* has upvals */ NULL, /* no upvals */ 0, /* has sup protos */ @@ -358,115 +2052,65 @@ be_local_closure(Matter_UI_plugin_option, /* name */ ( &(const bvalue[17]) { /* constants */ /* K0 */ be_nested_str_weak(webserver), /* K1 */ be_nested_str_weak(string), - /* K2 */ be_nested_str_weak(split), - /* K3 */ be_nested_str_weak(_X7C), - /* K4 */ be_nested_str_weak(stop_iteration), - /* K5 */ be_const_int(0), - /* K6 */ be_nested_str_weak(), - /* K7 */ be_nested_str_weak(content_send), - /* K8 */ be_nested_str_weak(_X3Coption_X20value_X3D_X27_X27_X3E_X3C_X2Foption_X3E), - /* K9 */ be_nested_str_weak(_X2Dhttp), - /* K10 */ be_nested_str_weak(_X3Coption_X20value_X3D_X27_X27_X20disabled_X3E_X2D_X2D_X2D_X20Tasmota_X20Remote_X20_X2D_X2D_X2D_X3C_X2Foption_X3E), - /* K11 */ be_nested_str_weak(device), - /* K12 */ be_nested_str_weak(get_plugin_class_displayname), - /* K13 */ be_nested_str_weak(format), - /* K14 */ be_nested_str_weak(_X3Coption_X20value_X3D_X27_X25s_X27_X25s_X3E_X25s_X3C_X2Foption_X3E), - /* K15 */ be_nested_str_weak(_X20selected), - /* K16 */ be_const_int(1), + /* K2 */ be_nested_str_weak(content_send), + /* K3 */ be_nested_str_weak(_X3Cfieldset_X3E_X3Clegend_X3E_X3Cb_X3E_X26nbsp_X3BMatter_X20Advanced_X20Configuration_X26nbsp_X3B_X3C_X2Fb_X3E_X3C_X2Flegend_X3E_X3Cp_X3E_X3C_X2Fp_X3E), + /* K4 */ be_nested_str_weak(_X3Cform_X20action_X3D_X27_X2Fmatterc_X27_X20method_X3D_X27post_X27_X20onsubmit_X3D_X27return_X20confirm_X28_X22This_X20will_X20cause_X20a_X20restart_X2E_X22_X29_X3B_X27_X3E_X3Cp_X3EPasscode_X3A_X3C_X2Fp_X3E), + /* K5 */ be_nested_str_weak(format), + /* K6 */ be_nested_str_weak(_X3Cinput_X20type_X3D_X27number_X27_X20min_X3D_X271_X27_X20max_X3D_X2799999998_X27_X20name_X3D_X27passcode_X27_X20value_X3D_X27_X25i_X27_X3E), + /* K7 */ be_nested_str_weak(device), + /* K8 */ be_nested_str_weak(root_passcode), + /* K9 */ be_nested_str_weak(_X3Cp_X3EDistinguish_X20id_X3A_X3C_X2Fp_X3E), + /* K10 */ be_nested_str_weak(_X3Cinput_X20type_X3D_X27number_X27_X20min_X3D_X270_X27_X20max_X3D_X274095_X27_X20name_X3D_X27discriminator_X27_X20value_X3D_X27_X25i_X27_X3E), + /* K11 */ be_nested_str_weak(root_discriminator), + /* K12 */ be_nested_str_weak(_X3Cp_X3E_X3Cinput_X20type_X3D_X27checkbox_X27_X20name_X3D_X27ipv4_X27_X25s_X3EIPv4_X20only_X3C_X2Fp_X3E), + /* K13 */ be_nested_str_weak(ipv4only), + /* K14 */ be_nested_str_weak(_X20checked), + /* K15 */ be_nested_str_weak(), + /* K16 */ be_nested_str_weak(_X3Cp_X3E_X3C_X2Fp_X3E_X3Cbutton_X20name_X3D_X27passcode_X27_X20class_X3D_X27button_X20bgrn_X27_X3EChange_X3C_X2Fbutton_X3E_X3C_X2Fform_X3E_X3C_X2Fp_X3E_X3Cp_X3E_X3C_X2Fp_X3E_X3C_X2Ffieldset_X3E_X3Cp_X3E_X3C_X2Fp_X3E), }), - be_str_weak(plugin_option), + be_str_weak(show_passcode_form), &be_const_str_solidified, - ( &(const binstruction[57]) { /* code */ - 0xA40E0000, // 0000 IMPORT R3 K0 - 0xA4120200, // 0001 IMPORT R4 K1 - 0x60140012, // 0002 GETGBL R5 G18 - 0x7C140000, // 0003 CALL R5 0 - 0x60180010, // 0004 GETGBL R6 G16 - 0x5C1C0400, // 0005 MOVE R7 R2 - 0x7C180200, // 0006 CALL R6 1 - 0xA8020007, // 0007 EXBLK 0 #0010 - 0x5C1C0C00, // 0008 MOVE R7 R6 - 0x7C1C0000, // 0009 CALL R7 0 - 0x8C200902, // 000A GETMET R8 R4 K2 - 0x5C280E00, // 000B MOVE R10 R7 - 0x582C0003, // 000C LDCONST R11 K3 - 0x7C200600, // 000D CALL R8 3 - 0x00140A08, // 000E ADD R5 R5 R8 - 0x7001FFF7, // 000F JMP #0008 - 0x58180004, // 0010 LDCONST R6 K4 - 0xAC180200, // 0011 CATCH R6 1 0 - 0xB0080000, // 0012 RAISE 2 R0 R0 - 0x58180005, // 0013 LDCONST R6 K5 - 0x601C000C, // 0014 GETGBL R7 G12 - 0x5C200A00, // 0015 MOVE R8 R5 - 0x7C1C0200, // 0016 CALL R7 1 - 0x141C0C07, // 0017 LT R7 R6 R7 - 0x781E001E, // 0018 JMPF R7 #0038 - 0x941C0A06, // 0019 GETIDX R7 R5 R6 - 0x1C200F06, // 001A EQ R8 R7 K6 - 0x78220003, // 001B JMPF R8 #0020 - 0x8C200707, // 001C GETMET R8 R3 K7 - 0x58280008, // 001D LDCONST R10 K8 - 0x7C200400, // 001E CALL R8 2 - 0x70020015, // 001F JMP #0036 - 0x1C200F09, // 0020 EQ R8 R7 K9 - 0x78220003, // 0021 JMPF R8 #0026 - 0x8C200707, // 0022 GETMET R8 R3 K7 - 0x5828000A, // 0023 LDCONST R10 K10 - 0x7C200400, // 0024 CALL R8 2 - 0x7002000F, // 0025 JMP #0036 - 0x8820010B, // 0026 GETMBR R8 R0 K11 - 0x8C20110C, // 0027 GETMET R8 R8 K12 - 0x5C280E00, // 0028 MOVE R10 R7 - 0x7C200400, // 0029 CALL R8 2 - 0x8C240707, // 002A GETMET R9 R3 K7 - 0x8C2C090D, // 002B GETMET R11 R4 K13 - 0x5834000E, // 002C LDCONST R13 K14 - 0x5C380E00, // 002D MOVE R14 R7 - 0x1C3C0E01, // 002E EQ R15 R7 R1 - 0x783E0001, // 002F JMPF R15 #0032 - 0x583C000F, // 0030 LDCONST R15 K15 - 0x70020000, // 0031 JMP #0033 - 0x583C0006, // 0032 LDCONST R15 K6 - 0x5C401000, // 0033 MOVE R16 R8 - 0x7C2C0A00, // 0034 CALL R11 5 - 0x7C240400, // 0035 CALL R9 2 - 0x00180D10, // 0036 ADD R6 R6 K16 - 0x7001FFDB, // 0037 JMP #0014 - 0x80000000, // 0038 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: init -********************************************************************/ -be_local_closure(Matter_UI_init, /* name */ - be_nested_proto( - 5, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 3]) { /* constants */ - /* K0 */ be_nested_str_weak(device), - /* K1 */ be_nested_str_weak(tasmota), - /* K2 */ be_nested_str_weak(add_driver), - }), - be_str_weak(init), - &be_const_str_solidified, - ( &(const binstruction[ 6]) { /* code */ - 0x90020001, // 0000 SETMBR R0 K0 R1 - 0xB80A0200, // 0001 GETNGBL R2 K1 - 0x8C080502, // 0002 GETMET R2 R2 K2 - 0x5C100000, // 0003 MOVE R4 R0 - 0x7C080400, // 0004 CALL R2 2 - 0x80000000, // 0005 RET 0 + ( &(const binstruction[40]) { /* code */ + 0xA4060000, // 0000 IMPORT R1 K0 + 0xA40A0200, // 0001 IMPORT R2 K1 + 0x8C0C0302, // 0002 GETMET R3 R1 K2 + 0x58140003, // 0003 LDCONST R5 K3 + 0x7C0C0400, // 0004 CALL R3 2 + 0x8C0C0302, // 0005 GETMET R3 R1 K2 + 0x58140004, // 0006 LDCONST R5 K4 + 0x7C0C0400, // 0007 CALL R3 2 + 0x8C0C0302, // 0008 GETMET R3 R1 K2 + 0x8C140505, // 0009 GETMET R5 R2 K5 + 0x581C0006, // 000A LDCONST R7 K6 + 0x88200107, // 000B GETMBR R8 R0 K7 + 0x88201108, // 000C GETMBR R8 R8 K8 + 0x7C140600, // 000D CALL R5 3 + 0x7C0C0400, // 000E CALL R3 2 + 0x8C0C0302, // 000F GETMET R3 R1 K2 + 0x58140009, // 0010 LDCONST R5 K9 + 0x7C0C0400, // 0011 CALL R3 2 + 0x8C0C0302, // 0012 GETMET R3 R1 K2 + 0x8C140505, // 0013 GETMET R5 R2 K5 + 0x581C000A, // 0014 LDCONST R7 K10 + 0x88200107, // 0015 GETMBR R8 R0 K7 + 0x8820110B, // 0016 GETMBR R8 R8 K11 + 0x7C140600, // 0017 CALL R5 3 + 0x7C0C0400, // 0018 CALL R3 2 + 0x8C0C0302, // 0019 GETMET R3 R1 K2 + 0x8C140505, // 001A GETMET R5 R2 K5 + 0x581C000C, // 001B LDCONST R7 K12 + 0x88200107, // 001C GETMBR R8 R0 K7 + 0x8820110D, // 001D GETMBR R8 R8 K13 + 0x78220001, // 001E JMPF R8 #0021 + 0x5820000E, // 001F LDCONST R8 K14 + 0x70020000, // 0020 JMP #0022 + 0x5820000F, // 0021 LDCONST R8 K15 + 0x7C140600, // 0022 CALL R5 3 + 0x7C0C0400, // 0023 CALL R3 2 + 0x8C0C0302, // 0024 GETMET R3 R1 K2 + 0x58140010, // 0025 LDCONST R5 K16 + 0x7C0C0400, // 0026 CALL R3 2 + 0x80000000, // 0027 RET 0 }) ) ); @@ -486,108 +2130,105 @@ be_local_closure(Matter_UI_page_part_ctl, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[97]) { /* constants */ + ( &(const bvalue[94]) { /* constants */ /* K0 */ be_nested_str_weak(webserver), /* K1 */ be_nested_str_weak(check_privileged_access), /* K2 */ be_nested_str_weak(string), /* K3 */ be_nested_str_weak(partition_core), /* K4 */ be_nested_str_weak(persist), - /* K5 */ be_const_int(0), - /* K6 */ be_nested_str_weak(arg_size), - /* K7 */ be_const_int(1), + /* K5 */ be_nested_str_weak(has_arg), + /* K6 */ be_nested_str_weak(passcode), + /* K7 */ be_nested_str_weak(discriminator), /* K8 */ be_nested_str_weak(tasmota), /* K9 */ be_nested_str_weak(log), /* K10 */ be_nested_str_weak(format), - /* K11 */ be_nested_str_weak(MTR_X3A_X20Arg_X25i_X20_X27_X25s_X27_X20_X3D_X20_X27_X25s_X27), - /* K12 */ be_nested_str_weak(arg_name), - /* K13 */ be_nested_str_weak(arg), - /* K14 */ be_nested_str_weak(stop_iteration), - /* K15 */ be_nested_str_weak(has_arg), - /* K16 */ be_nested_str_weak(passcode), - /* K17 */ be_nested_str_weak(discriminator), - /* K18 */ be_nested_str_weak(MTR_X3A_X20_X2Fmatterc_X20received_X20_X27_X25s_X27_X20command), - /* K19 */ be_const_int(3), - /* K20 */ be_nested_str_weak(device), - /* K21 */ be_nested_str_weak(root_passcode), - /* K22 */ be_nested_str_weak(root_discriminator), - /* K23 */ be_nested_str_weak(ipv4only), - /* K24 */ be_nested_str_weak(ipv4), - /* K25 */ be_nested_str_weak(on), - /* K26 */ be_nested_str_weak(save_param), - /* K27 */ be_nested_str_weak(redirect), - /* K28 */ be_nested_str_weak(_X2F_X3Frst_X3D), - /* K29 */ be_nested_str_weak(save), - /* K30 */ be_nested_str_weak(menable), - /* K31 */ be_nested_str_weak(comm), - /* K32 */ be_nested_str_weak(matter_enabled), - /* K33 */ be_nested_str_weak(enable), - /* K34 */ be_nested_str_weak(cmd), - /* K35 */ be_nested_str_weak(SetOption), - /* K36 */ be_nested_str_weak(matter), - /* K37 */ be_nested_str_weak(MATTER_OPTION), - /* K38 */ be_nested_str_weak(_X201), - /* K39 */ be_nested_str_weak(disable), - /* K40 */ be_nested_str_weak(_X200), - /* K41 */ be_nested_str_weak(commissioning_open), - /* K42 */ be_nested_str_weak(start_root_basic_commissioning), - /* K43 */ be_nested_str_weak(stop_basic_commissioning), - /* K44 */ be_nested_str_weak(_X2F), - /* K45 */ be_nested_str_weak(del_fabric), - /* K46 */ be_nested_str_weak(sessions), - /* K47 */ be_nested_str_weak(fabrics), - /* K48 */ be_nested_str_weak(get_fabric_index), - /* K49 */ be_nested_str_weak(remove_fabric), - /* K50 */ be_nested_str_weak(_X2Fmatterc_X3F), - /* K51 */ be_nested_str_weak(auto), - /* K52 */ be_nested_str_weak(plugins_persist), - /* K53 */ be_nested_str_weak(config), - /* K54 */ be_nested_str_weak(find), - /* K55 */ be_const_int(2147483647), - /* K56 */ be_nested_str_weak(plugins_config), - /* K57 */ be_nested_str_weak(plugins_classes), - /* K58 */ be_nested_str_weak(type), - /* K59 */ be_nested_str_weak(), - /* K60 */ be_nested_str_weak(MTR_X3A_X20ep_X3D_X25i_X20arg_X3D_X25s), - /* K61 */ be_nested_str_weak(ui_conf_to_string), - /* K62 */ be_nested_str_weak(MTR_X3A_X20ep_X3D_X25i_X20prev_arg_X3D_X27_X25s_X27_X20arg_X3D_X27_X25s_X27_X20_X25s), - /* K63 */ be_nested_str_weak(changed), - /* K64 */ be_nested_str_weak(ui_string_to_conf), - /* K65 */ be_nested_str_weak(find_plugin_by_endpoint), - /* K66 */ be_nested_str_weak(MTR_X3A_X20apply_X20conf_X20_X27_X25s_X27_X20_X28_X25i_X29_X20to_X20_X25s), - /* K67 */ be_nested_str_weak(parse_configuration), - /* K68 */ be_nested_str_weak(MTR_X3A_X20ep_X3D_X25i_X20not_X20found), - /* K69 */ be_nested_str_weak(MTR_X3A_X20config_X20_X3D_X20_X25s), - /* K70 */ be_nested_str_weak(MTR_X3A_X20config_X20error_X20_X3D_X20_X25s), - /* K71 */ be_nested_str_weak(_X2Fcn_X3F), - /* K72 */ be_nested_str_weak(addep), - /* K73 */ be_nested_str_weak(pi), - /* K74 */ be_nested_str_weak(MTR_X3A_X20add_X20endpoint_X20typ_X3D_X27_X25s_X27_X20arg_X3D_X27_X25s_X27), - /* K75 */ be_nested_str_weak(bridge_add_endpoint), - /* K76 */ be_nested_str_weak(addrem), - /* K77 */ be_nested_str_weak(url), - /* K78 */ be_nested_str_weak(value_error), - /* K79 */ be_nested_str_weak(url_X20shouldn_X27t_X20be_X20null), - /* K80 */ be_nested_str_weak(equal_map), - /* K81 */ be_nested_str_weak(MTR_X3A_X20remote_X20add_X20url_X3D_X27_X25s_X27_X20type_X3D_X27_X25s_X27_X20arg_X3D_X27_X25s_X27), - /* K82 */ be_nested_str_weak(del), - /* K83 */ be_nested_str_weak(MTR_X3A_X20deleting_X20endpoint_X20_X25i), - /* K84 */ be_const_int(2), - /* K85 */ be_nested_str_weak(bridge_remove_endpoint), - /* K86 */ be_nested_str_weak(content_start), - /* K87 */ be_nested_str_weak(Parameter_X20error), - /* K88 */ be_nested_str_weak(content_send_style), - /* K89 */ be_nested_str_weak(content_send), - /* K90 */ be_nested_str_weak(_X3Cp_X20style_X3D_X27width_X3A340px_X3B_X27_X3E_X3Cb_X3EError_X3A_X3C_X2Fb_X3E_X25s_X3C_X2Fp_X3E), - /* K91 */ be_nested_str_weak(html_escape), - /* K92 */ be_nested_str_weak(content_button), - /* K93 */ be_nested_str_weak(BUTTON_CONFIGURATION), - /* K94 */ be_nested_str_weak(content_stop), - /* K95 */ be_nested_str_weak(BRY_X3A_X20Exception_X3E_X20_X27_X25s_X27_X20_X2D_X20_X25s), - /* K96 */ be_nested_str_weak(_X3Cp_X20style_X3D_X27width_X3A340px_X3B_X27_X3E_X3Cb_X3EException_X3A_X3C_X2Fb_X3E_X3Cbr_X3E_X27_X25s_X27_X3Cbr_X3E_X25s_X3C_X2Fp_X3E), + /* K11 */ be_nested_str_weak(MTR_X3A_X20_X2Fmatterc_X20received_X20_X27_X25s_X27_X20command), + /* K12 */ be_const_int(3), + /* K13 */ be_nested_str_weak(device), + /* K14 */ be_nested_str_weak(root_passcode), + /* K15 */ be_nested_str_weak(arg), + /* K16 */ be_nested_str_weak(root_discriminator), + /* K17 */ be_nested_str_weak(ipv4only), + /* K18 */ be_nested_str_weak(ipv4), + /* K19 */ be_nested_str_weak(on), + /* K20 */ be_nested_str_weak(save_param), + /* K21 */ be_nested_str_weak(redirect), + /* K22 */ be_nested_str_weak(_X2F_X3Frst_X3D), + /* K23 */ be_nested_str_weak(save), + /* K24 */ be_nested_str_weak(menable), + /* K25 */ be_nested_str_weak(comm), + /* K26 */ be_nested_str_weak(matter_enabled), + /* K27 */ be_nested_str_weak(enable), + /* K28 */ be_nested_str_weak(cmd), + /* K29 */ be_nested_str_weak(SetOption), + /* K30 */ be_nested_str_weak(matter), + /* K31 */ be_nested_str_weak(MATTER_OPTION), + /* K32 */ be_nested_str_weak(_X201), + /* K33 */ be_nested_str_weak(disable), + /* K34 */ be_nested_str_weak(_X200), + /* K35 */ be_nested_str_weak(commissioning_open), + /* K36 */ be_nested_str_weak(start_root_basic_commissioning), + /* K37 */ be_nested_str_weak(stop_basic_commissioning), + /* K38 */ be_nested_str_weak(_X2F), + /* K39 */ be_nested_str_weak(del_fabric), + /* K40 */ be_const_int(0), + /* K41 */ be_nested_str_weak(sessions), + /* K42 */ be_nested_str_weak(fabrics), + /* K43 */ be_nested_str_weak(get_fabric_index), + /* K44 */ be_nested_str_weak(remove_fabric), + /* K45 */ be_const_int(1), + /* K46 */ be_nested_str_weak(_X2Fmatterc_X3F), + /* K47 */ be_nested_str_weak(auto), + /* K48 */ be_nested_str_weak(plugins_persist), + /* K49 */ be_nested_str_weak(config), + /* K50 */ be_nested_str_weak(arg_size), + /* K51 */ be_nested_str_weak(arg_name), + /* K52 */ be_nested_str_weak(find), + /* K53 */ be_const_int(2147483647), + /* K54 */ be_nested_str_weak(plugins_config), + /* K55 */ be_nested_str_weak(plugins_classes), + /* K56 */ be_nested_str_weak(type), + /* K57 */ be_nested_str_weak(), + /* K58 */ be_nested_str_weak(MTR_X3A_X20ep_X3D_X25i_X20arg_X3D_X25s), + /* K59 */ be_nested_str_weak(ui_conf_to_string), + /* K60 */ be_nested_str_weak(MTR_X3A_X20ep_X3D_X25i_X20prev_arg_X3D_X27_X25s_X27_X20arg_X3D_X27_X25s_X27_X20_X25s), + /* K61 */ be_nested_str_weak(changed), + /* K62 */ be_nested_str_weak(ui_string_to_conf), + /* K63 */ be_nested_str_weak(find_plugin_by_endpoint), + /* K64 */ be_nested_str_weak(MTR_X3A_X20apply_X20conf_X20_X27_X25s_X27_X20_X28_X25i_X29_X20to_X20_X25s), + /* K65 */ be_nested_str_weak(parse_configuration), + /* K66 */ be_nested_str_weak(MTR_X3A_X20ep_X3D_X25i_X20not_X20found), + /* K67 */ be_nested_str_weak(stop_iteration), + /* K68 */ be_nested_str_weak(MTR_X3A_X20config_X20_X3D_X20_X25s), + /* K69 */ be_nested_str_weak(MTR_X3A_X20config_X20error_X20_X3D_X20_X25s), + /* K70 */ be_nested_str_weak(addep), + /* K71 */ be_nested_str_weak(pi), + /* K72 */ be_nested_str_weak(MTR_X3A_X20add_X20endpoint_X20typ_X3D_X27_X25s_X27_X20arg_X3D_X27_X25s_X27), + /* K73 */ be_nested_str_weak(bridge_add_endpoint), + /* K74 */ be_nested_str_weak(addrem), + /* K75 */ be_nested_str_weak(url), + /* K76 */ be_nested_str_weak(value_error), + /* K77 */ be_nested_str_weak(url_X20shouldn_X27t_X20be_X20null), + /* K78 */ be_nested_str_weak(equal_map), + /* K79 */ be_nested_str_weak(MTR_X3A_X20remote_X20add_X20url_X3D_X27_X25s_X27_X20type_X3D_X27_X25s_X27_X20arg_X3D_X27_X25s_X27), + /* K80 */ be_nested_str_weak(del), + /* K81 */ be_nested_str_weak(bridge_remove_endpoint), + /* K82 */ be_nested_str_weak(content_start), + /* K83 */ be_nested_str_weak(Parameter_X20error), + /* K84 */ be_nested_str_weak(content_send_style), + /* K85 */ be_nested_str_weak(content_send), + /* K86 */ be_nested_str_weak(_X3Cp_X20style_X3D_X27width_X3A340px_X3B_X27_X3E_X3Cb_X3EError_X3A_X3C_X2Fb_X3E_X25s_X3C_X2Fp_X3E), + /* K87 */ be_nested_str_weak(html_escape), + /* K88 */ be_nested_str_weak(content_button), + /* K89 */ be_nested_str_weak(BUTTON_CONFIGURATION), + /* K90 */ be_nested_str_weak(content_stop), + /* K91 */ be_nested_str_weak(BRY_X3A_X20Exception_X3E_X20_X27_X25s_X27_X20_X2D_X20_X25s), + /* K92 */ be_const_int(2), + /* K93 */ be_nested_str_weak(_X3Cp_X20style_X3D_X27width_X3A340px_X3B_X27_X3E_X3Cb_X3EException_X3A_X3C_X2Fb_X3E_X3Cbr_X3E_X27_X25s_X27_X3Cbr_X3E_X25s_X3C_X2Fp_X3E), }), be_str_weak(page_part_ctl), &be_const_str_solidified, - ( &(const binstruction[628]) { /* code */ + ( &(const binstruction[594]) { /* code */ 0xA4060000, // 0000 IMPORT R1 K0 0x8C080301, // 0001 GETMET R2 R1 K1 0x7C080200, // 0002 CALL R2 1 @@ -598,672 +2239,590 @@ be_local_closure(Matter_UI_page_part_ctl, /* name */ 0xA40E0600, // 0007 IMPORT R3 K3 0xA4120800, // 0008 IMPORT R4 K4 0x4C140000, // 0009 LDNIL R5 - 0xA8020249, // 000A EXBLK 0 #0255 - 0x60180010, // 000B GETGBL R6 G16 - 0x8C1C0306, // 000C GETMET R7 R1 K6 - 0x7C1C0200, // 000D CALL R7 1 - 0x041C0F07, // 000E SUB R7 R7 K7 - 0x401E0A07, // 000F CONNECT R7 K5 R7 - 0x7C180200, // 0010 CALL R6 1 - 0xA802000F, // 0011 EXBLK 0 #0022 - 0x5C1C0C00, // 0012 MOVE R7 R6 - 0x7C1C0000, // 0013 CALL R7 0 - 0xB8221000, // 0014 GETNGBL R8 K8 - 0x8C201109, // 0015 GETMET R8 R8 K9 - 0x8C28050A, // 0016 GETMET R10 R2 K10 - 0x5830000B, // 0017 LDCONST R12 K11 - 0x5C340E00, // 0018 MOVE R13 R7 - 0x8C38030C, // 0019 GETMET R14 R1 K12 - 0x5C400E00, // 001A MOVE R16 R7 - 0x7C380400, // 001B CALL R14 2 - 0x8C3C030D, // 001C GETMET R15 R1 K13 - 0x5C440E00, // 001D MOVE R17 R7 - 0x7C3C0400, // 001E CALL R15 2 - 0x7C280A00, // 001F CALL R10 5 - 0x7C200400, // 0020 CALL R8 2 - 0x7001FFEF, // 0021 JMP #0012 - 0x5818000E, // 0022 LDCONST R6 K14 - 0xAC180200, // 0023 CATCH R6 1 0 - 0xB0080000, // 0024 RAISE 2 R0 R0 - 0x8C18030F, // 0025 GETMET R6 R1 K15 - 0x58200010, // 0026 LDCONST R8 K16 - 0x7C180400, // 0027 CALL R6 2 - 0x741A0003, // 0028 JMPT R6 #002D - 0x8C18030F, // 0029 GETMET R6 R1 K15 - 0x58200011, // 002A LDCONST R8 K17 - 0x7C180400, // 002B CALL R6 2 - 0x781A002A, // 002C JMPF R6 #0058 - 0xB81A1000, // 002D GETNGBL R6 K8 - 0x8C180D09, // 002E GETMET R6 R6 K9 - 0x8C20050A, // 002F GETMET R8 R2 K10 - 0x58280012, // 0030 LDCONST R10 K18 - 0x582C0010, // 0031 LDCONST R11 K16 - 0x7C200600, // 0032 CALL R8 3 - 0x58240013, // 0033 LDCONST R9 K19 - 0x7C180600, // 0034 CALL R6 3 - 0x8C18030F, // 0035 GETMET R6 R1 K15 - 0x58200010, // 0036 LDCONST R8 K16 - 0x7C180400, // 0037 CALL R6 2 - 0x781A0006, // 0038 JMPF R6 #0040 - 0x88180114, // 0039 GETMBR R6 R0 K20 - 0x601C0009, // 003A GETGBL R7 G9 - 0x8C20030D, // 003B GETMET R8 R1 K13 - 0x58280010, // 003C LDCONST R10 K16 - 0x7C200400, // 003D CALL R8 2 - 0x7C1C0200, // 003E CALL R7 1 - 0x901A2A07, // 003F SETMBR R6 K21 R7 - 0x8C18030F, // 0040 GETMET R6 R1 K15 - 0x58200011, // 0041 LDCONST R8 K17 - 0x7C180400, // 0042 CALL R6 2 - 0x781A0006, // 0043 JMPF R6 #004B - 0x88180114, // 0044 GETMBR R6 R0 K20 - 0x601C0009, // 0045 GETGBL R7 G9 - 0x8C20030D, // 0046 GETMET R8 R1 K13 - 0x58280011, // 0047 LDCONST R10 K17 - 0x7C200400, // 0048 CALL R8 2 - 0x7C1C0200, // 0049 CALL R7 1 - 0x901A2C07, // 004A SETMBR R6 K22 R7 - 0x88180114, // 004B GETMBR R6 R0 K20 - 0x8C1C030D, // 004C GETMET R7 R1 K13 - 0x58240018, // 004D LDCONST R9 K24 - 0x7C1C0400, // 004E CALL R7 2 - 0x1C1C0F19, // 004F EQ R7 R7 K25 - 0x901A2E07, // 0050 SETMBR R6 K23 R7 - 0x88180114, // 0051 GETMBR R6 R0 K20 - 0x8C180D1A, // 0052 GETMET R6 R6 K26 - 0x7C180200, // 0053 CALL R6 1 - 0x8C18031B, // 0054 GETMET R6 R1 K27 - 0x5820001C, // 0055 LDCONST R8 K28 - 0x7C180400, // 0056 CALL R6 2 - 0x700201E7, // 0057 JMP #0240 - 0x8C18030F, // 0058 GETMET R6 R1 K15 - 0x5820001D, // 0059 LDCONST R8 K29 - 0x7C180400, // 005A CALL R6 2 - 0x781A0047, // 005B JMPF R6 #00A4 - 0x8C18030F, // 005C GETMET R6 R1 K15 - 0x5820001E, // 005D LDCONST R8 K30 - 0x7C180400, // 005E CALL R6 2 - 0x8C1C030F, // 005F GETMET R7 R1 K15 - 0x5824001F, // 0060 LDCONST R9 K31 - 0x7C1C0400, // 0061 CALL R7 2 - 0x8C200120, // 0062 GETMET R8 R0 K32 - 0x7C200200, // 0063 CALL R8 1 - 0x20200C08, // 0064 NE R8 R6 R8 - 0x78220027, // 0065 JMPF R8 #008E - 0x781A0011, // 0066 JMPF R6 #0079 + 0xA8020227, // 000A EXBLK 0 #0233 + 0x8C180305, // 000B GETMET R6 R1 K5 + 0x58200006, // 000C LDCONST R8 K6 + 0x7C180400, // 000D CALL R6 2 + 0x741A0003, // 000E JMPT R6 #0013 + 0x8C180305, // 000F GETMET R6 R1 K5 + 0x58200007, // 0010 LDCONST R8 K7 + 0x7C180400, // 0011 CALL R6 2 + 0x781A002A, // 0012 JMPF R6 #003E + 0xB81A1000, // 0013 GETNGBL R6 K8 + 0x8C180D09, // 0014 GETMET R6 R6 K9 + 0x8C20050A, // 0015 GETMET R8 R2 K10 + 0x5828000B, // 0016 LDCONST R10 K11 + 0x582C0006, // 0017 LDCONST R11 K6 + 0x7C200600, // 0018 CALL R8 3 + 0x5824000C, // 0019 LDCONST R9 K12 + 0x7C180600, // 001A CALL R6 3 + 0x8C180305, // 001B GETMET R6 R1 K5 + 0x58200006, // 001C LDCONST R8 K6 + 0x7C180400, // 001D CALL R6 2 + 0x781A0006, // 001E JMPF R6 #0026 + 0x8818010D, // 001F GETMBR R6 R0 K13 + 0x601C0009, // 0020 GETGBL R7 G9 + 0x8C20030F, // 0021 GETMET R8 R1 K15 + 0x58280006, // 0022 LDCONST R10 K6 + 0x7C200400, // 0023 CALL R8 2 + 0x7C1C0200, // 0024 CALL R7 1 + 0x901A1C07, // 0025 SETMBR R6 K14 R7 + 0x8C180305, // 0026 GETMET R6 R1 K5 + 0x58200007, // 0027 LDCONST R8 K7 + 0x7C180400, // 0028 CALL R6 2 + 0x781A0006, // 0029 JMPF R6 #0031 + 0x8818010D, // 002A GETMBR R6 R0 K13 + 0x601C0009, // 002B GETGBL R7 G9 + 0x8C20030F, // 002C GETMET R8 R1 K15 + 0x58280007, // 002D LDCONST R10 K7 + 0x7C200400, // 002E CALL R8 2 + 0x7C1C0200, // 002F CALL R7 1 + 0x901A2007, // 0030 SETMBR R6 K16 R7 + 0x8818010D, // 0031 GETMBR R6 R0 K13 + 0x8C1C030F, // 0032 GETMET R7 R1 K15 + 0x58240012, // 0033 LDCONST R9 K18 + 0x7C1C0400, // 0034 CALL R7 2 + 0x1C1C0F13, // 0035 EQ R7 R7 K19 + 0x901A2207, // 0036 SETMBR R6 K17 R7 + 0x8818010D, // 0037 GETMBR R6 R0 K13 + 0x8C180D14, // 0038 GETMET R6 R6 K20 + 0x7C180200, // 0039 CALL R6 1 + 0x8C180315, // 003A GETMET R6 R1 K21 + 0x58200016, // 003B LDCONST R8 K22 + 0x7C180400, // 003C CALL R6 2 + 0x700201DF, // 003D JMP #021E + 0x8C180305, // 003E GETMET R6 R1 K5 + 0x58200017, // 003F LDCONST R8 K23 + 0x7C180400, // 0040 CALL R6 2 + 0x781A0047, // 0041 JMPF R6 #008A + 0x8C180305, // 0042 GETMET R6 R1 K5 + 0x58200018, // 0043 LDCONST R8 K24 + 0x7C180400, // 0044 CALL R6 2 + 0x8C1C0305, // 0045 GETMET R7 R1 K5 + 0x58240019, // 0046 LDCONST R9 K25 + 0x7C1C0400, // 0047 CALL R7 2 + 0x8C20011A, // 0048 GETMET R8 R0 K26 + 0x7C200200, // 0049 CALL R8 1 + 0x20200C08, // 004A NE R8 R6 R8 + 0x78220027, // 004B JMPF R8 #0074 + 0x781A0011, // 004C JMPF R6 #005F + 0xB8221000, // 004D GETNGBL R8 K8 + 0x8C201109, // 004E GETMET R8 R8 K9 + 0x8C28050A, // 004F GETMET R10 R2 K10 + 0x5830000B, // 0050 LDCONST R12 K11 + 0x5834001B, // 0051 LDCONST R13 K27 + 0x7C280600, // 0052 CALL R10 3 + 0x582C000C, // 0053 LDCONST R11 K12 + 0x7C200600, // 0054 CALL R8 3 + 0xB8221000, // 0055 GETNGBL R8 K8 + 0x8C20111C, // 0056 GETMET R8 R8 K28 + 0x60280008, // 0057 GETGBL R10 G8 + 0xB82E3C00, // 0058 GETNGBL R11 K30 + 0x882C171F, // 0059 GETMBR R11 R11 K31 + 0x7C280200, // 005A CALL R10 1 + 0x002A3A0A, // 005B ADD R10 K29 R10 + 0x00281520, // 005C ADD R10 R10 K32 + 0x7C200400, // 005D CALL R8 2 + 0x70020010, // 005E JMP #0070 + 0xB8221000, // 005F GETNGBL R8 K8 + 0x8C201109, // 0060 GETMET R8 R8 K9 + 0x8C28050A, // 0061 GETMET R10 R2 K10 + 0x5830000B, // 0062 LDCONST R12 K11 + 0x58340021, // 0063 LDCONST R13 K33 + 0x7C280600, // 0064 CALL R10 3 + 0x582C000C, // 0065 LDCONST R11 K12 + 0x7C200600, // 0066 CALL R8 3 0xB8221000, // 0067 GETNGBL R8 K8 - 0x8C201109, // 0068 GETMET R8 R8 K9 - 0x8C28050A, // 0069 GETMET R10 R2 K10 - 0x58300012, // 006A LDCONST R12 K18 - 0x58340021, // 006B LDCONST R13 K33 - 0x7C280600, // 006C CALL R10 3 - 0x582C0013, // 006D LDCONST R11 K19 - 0x7C200600, // 006E CALL R8 3 - 0xB8221000, // 006F GETNGBL R8 K8 - 0x8C201122, // 0070 GETMET R8 R8 K34 - 0x60280008, // 0071 GETGBL R10 G8 - 0xB82E4800, // 0072 GETNGBL R11 K36 - 0x882C1725, // 0073 GETMBR R11 R11 K37 - 0x7C280200, // 0074 CALL R10 1 - 0x002A460A, // 0075 ADD R10 K35 R10 - 0x00281526, // 0076 ADD R10 R10 K38 - 0x7C200400, // 0077 CALL R8 2 - 0x70020010, // 0078 JMP #008A - 0xB8221000, // 0079 GETNGBL R8 K8 - 0x8C201109, // 007A GETMET R8 R8 K9 - 0x8C28050A, // 007B GETMET R10 R2 K10 - 0x58300012, // 007C LDCONST R12 K18 - 0x58340027, // 007D LDCONST R13 K39 - 0x7C280600, // 007E CALL R10 3 - 0x582C0013, // 007F LDCONST R11 K19 - 0x7C200600, // 0080 CALL R8 3 - 0xB8221000, // 0081 GETNGBL R8 K8 - 0x8C201122, // 0082 GETMET R8 R8 K34 - 0x60280008, // 0083 GETGBL R10 G8 - 0xB82E4800, // 0084 GETNGBL R11 K36 - 0x882C1725, // 0085 GETMBR R11 R11 K37 - 0x7C280200, // 0086 CALL R10 1 - 0x002A460A, // 0087 ADD R10 K35 R10 - 0x00281528, // 0088 ADD R10 R10 K40 - 0x7C200400, // 0089 CALL R8 2 - 0x8C20031B, // 008A GETMET R8 R1 K27 - 0x5828001C, // 008B LDCONST R10 K28 - 0x7C200400, // 008C CALL R8 2 - 0x70020014, // 008D JMP #00A3 - 0x88200114, // 008E GETMBR R8 R0 K20 - 0x88201129, // 008F GETMBR R8 R8 K41 - 0x4C240000, // 0090 LDNIL R9 - 0x20201009, // 0091 NE R8 R8 R9 - 0x20200E08, // 0092 NE R8 R7 R8 - 0x7822000B, // 0093 JMPF R8 #00A0 - 0x781E0003, // 0094 JMPF R7 #0099 - 0x88200114, // 0095 GETMBR R8 R0 K20 - 0x8C20112A, // 0096 GETMET R8 R8 K42 - 0x7C200200, // 0097 CALL R8 1 - 0x70020002, // 0098 JMP #009C - 0x88200114, // 0099 GETMBR R8 R0 K20 - 0x8C20112B, // 009A GETMET R8 R8 K43 - 0x7C200200, // 009B CALL R8 1 - 0x8C20031B, // 009C GETMET R8 R1 K27 - 0x5828002C, // 009D LDCONST R10 K44 - 0x7C200400, // 009E CALL R8 2 - 0x70020002, // 009F JMP #00A3 - 0x8C20031B, // 00A0 GETMET R8 R1 K27 - 0x5828002C, // 00A1 LDCONST R10 K44 - 0x7C200400, // 00A2 CALL R8 2 - 0x7002019B, // 00A3 JMP #0240 - 0x8C18030F, // 00A4 GETMET R6 R1 K15 - 0x5820002D, // 00A5 LDCONST R8 K45 - 0x7C180400, // 00A6 CALL R6 2 - 0x781A0026, // 00A7 JMPF R6 #00CF - 0xB81A1000, // 00A8 GETNGBL R6 K8 - 0x8C180D09, // 00A9 GETMET R6 R6 K9 - 0x8C20050A, // 00AA GETMET R8 R2 K10 - 0x58280012, // 00AB LDCONST R10 K18 - 0x582C002D, // 00AC LDCONST R11 K45 - 0x7C200600, // 00AD CALL R8 3 - 0x58240013, // 00AE LDCONST R9 K19 - 0x7C180600, // 00AF CALL R6 3 - 0x60180009, // 00B0 GETGBL R6 G9 - 0x8C1C030D, // 00B1 GETMET R7 R1 K13 - 0x5824002D, // 00B2 LDCONST R9 K45 - 0x7C1C0400, // 00B3 CALL R7 2 - 0x7C180200, // 00B4 CALL R6 1 - 0x581C0005, // 00B5 LDCONST R7 K5 - 0x88200114, // 00B6 GETMBR R8 R0 K20 - 0x8820112E, // 00B7 GETMBR R8 R8 K46 - 0x8820112F, // 00B8 GETMBR R8 R8 K47 - 0x6024000C, // 00B9 GETGBL R9 G12 - 0x5C281000, // 00BA MOVE R10 R8 - 0x7C240200, // 00BB CALL R9 1 - 0x14240E09, // 00BC LT R9 R7 R9 - 0x7826000C, // 00BD JMPF R9 #00CB - 0x94241007, // 00BE GETIDX R9 R8 R7 - 0x8C241330, // 00BF GETMET R9 R9 K48 - 0x7C240200, // 00C0 CALL R9 1 - 0x1C241206, // 00C1 EQ R9 R9 R6 - 0x78260005, // 00C2 JMPF R9 #00C9 - 0x88240114, // 00C3 GETMBR R9 R0 K20 - 0x8C241331, // 00C4 GETMET R9 R9 K49 - 0x942C1007, // 00C5 GETIDX R11 R8 R7 - 0x7C240400, // 00C6 CALL R9 2 - 0x70020002, // 00C7 JMP #00CB - 0x70020000, // 00C8 JMP #00CA - 0x001C0F07, // 00C9 ADD R7 R7 K7 - 0x7001FFED, // 00CA JMP #00B9 - 0x8C24031B, // 00CB GETMET R9 R1 K27 - 0x582C0032, // 00CC LDCONST R11 K50 - 0x7C240400, // 00CD CALL R9 2 - 0x70020170, // 00CE JMP #0240 - 0x8C18030F, // 00CF GETMET R6 R1 K15 - 0x58200033, // 00D0 LDCONST R8 K51 - 0x7C180400, // 00D1 CALL R6 2 - 0x781A0011, // 00D2 JMPF R6 #00E5 - 0xB81A1000, // 00D3 GETNGBL R6 K8 - 0x8C180D09, // 00D4 GETMET R6 R6 K9 - 0x8C20050A, // 00D5 GETMET R8 R2 K10 - 0x58280012, // 00D6 LDCONST R10 K18 - 0x582C0033, // 00D7 LDCONST R11 K51 - 0x7C200600, // 00D8 CALL R8 3 - 0x58240013, // 00D9 LDCONST R9 K19 - 0x7C180600, // 00DA CALL R6 3 - 0x88180114, // 00DB GETMBR R6 R0 K20 - 0x501C0000, // 00DC LDBOOL R7 0 0 - 0x901A6807, // 00DD SETMBR R6 K52 R7 - 0x88180114, // 00DE GETMBR R6 R0 K20 - 0x8C180D1A, // 00DF GETMET R6 R6 K26 - 0x7C180200, // 00E0 CALL R6 1 - 0x8C18031B, // 00E1 GETMET R6 R1 K27 - 0x5820001C, // 00E2 LDCONST R8 K28 - 0x7C180400, // 00E3 CALL R6 2 - 0x7002015A, // 00E4 JMP #0240 - 0x8C18030F, // 00E5 GETMET R6 R1 K15 - 0x58200035, // 00E6 LDCONST R8 K53 - 0x7C180400, // 00E7 CALL R6 2 - 0x781A009C, // 00E8 JMPF R6 #0186 - 0xB81A1000, // 00E9 GETNGBL R6 K8 - 0x8C180D09, // 00EA GETMET R6 R6 K9 - 0x8C20050A, // 00EB GETMET R8 R2 K10 - 0x58280012, // 00EC LDCONST R10 K18 - 0x582C0035, // 00ED LDCONST R11 K53 - 0x7C200600, // 00EE CALL R8 3 - 0x58240013, // 00EF LDCONST R9 K19 - 0x7C180600, // 00F0 CALL R6 3 - 0x50180000, // 00F1 LDBOOL R6 0 0 - 0x601C0010, // 00F2 GETGBL R7 G16 - 0x8C200306, // 00F3 GETMET R8 R1 K6 - 0x7C200200, // 00F4 CALL R8 1 - 0x04201107, // 00F5 SUB R8 R8 K7 - 0x40220A08, // 00F6 CONNECT R8 K5 R8 - 0x7C1C0200, // 00F7 CALL R7 1 - 0xA8020066, // 00F8 EXBLK 0 #0160 - 0x5C200E00, // 00F9 MOVE R8 R7 - 0x7C200000, // 00FA CALL R8 0 - 0x8C24030C, // 00FB GETMET R9 R1 K12 - 0x5C2C1000, // 00FC MOVE R11 R8 - 0x7C240400, // 00FD CALL R9 2 - 0x8C280536, // 00FE GETMET R10 R2 K54 - 0x5C301200, // 00FF MOVE R12 R9 - 0x5834000D, // 0100 LDCONST R13 K13 - 0x7C280600, // 0101 CALL R10 3 - 0x1C281505, // 0102 EQ R10 R10 K5 - 0x782A005A, // 0103 JMPF R10 #015F - 0x60280009, // 0104 GETGBL R10 G9 - 0x402E2737, // 0105 CONNECT R11 K19 K55 - 0x942C120B, // 0106 GETIDX R11 R9 R11 - 0x7C280200, // 0107 CALL R10 1 - 0x8C2C030D, // 0108 GETMET R11 R1 K13 - 0x5C341000, // 0109 MOVE R13 R8 - 0x7C2C0400, // 010A CALL R11 2 - 0x88300114, // 010B GETMBR R12 R0 K20 - 0x88301938, // 010C GETMBR R12 R12 K56 - 0x8C301936, // 010D GETMET R12 R12 K54 - 0x60380008, // 010E GETGBL R14 G8 - 0x5C3C1400, // 010F MOVE R15 R10 - 0x7C380200, // 0110 CALL R14 1 - 0x7C300400, // 0111 CALL R12 2 - 0x4C340000, // 0112 LDNIL R13 - 0x2034180D, // 0113 NE R13 R12 R13 - 0x78360041, // 0114 JMPF R13 #0157 - 0x88340114, // 0115 GETMBR R13 R0 K20 - 0x88341B39, // 0116 GETMBR R13 R13 K57 - 0x8C341B36, // 0117 GETMET R13 R13 K54 - 0x8C3C1936, // 0118 GETMET R15 R12 K54 - 0x5844003A, // 0119 LDCONST R17 K58 - 0x5848003B, // 011A LDCONST R18 K59 - 0x7C3C0600, // 011B CALL R15 3 - 0x7C340400, // 011C CALL R13 2 - 0x4C380000, // 011D LDNIL R14 - 0x20381A0E, // 011E NE R14 R13 R14 - 0x783A0035, // 011F JMPF R14 #0156 - 0xB83A1000, // 0120 GETNGBL R14 K8 - 0x8C381D09, // 0121 GETMET R14 R14 K9 - 0x8C40050A, // 0122 GETMET R16 R2 K10 - 0x5848003C, // 0123 LDCONST R18 K60 - 0x5C4C1400, // 0124 MOVE R19 R10 - 0x5C501600, // 0125 MOVE R20 R11 - 0x7C400800, // 0126 CALL R16 4 - 0x58440013, // 0127 LDCONST R17 K19 - 0x7C380600, // 0128 CALL R14 3 - 0x8C381B3D, // 0129 GETMET R14 R13 K61 - 0x5C401A00, // 012A MOVE R16 R13 - 0x5C441800, // 012B MOVE R17 R12 - 0x7C380600, // 012C CALL R14 3 - 0x203C1C0B, // 012D NE R15 R14 R11 - 0xB8421000, // 012E GETNGBL R16 K8 - 0x8C402109, // 012F GETMET R16 R16 K9 - 0x8C48050A, // 0130 GETMET R18 R2 K10 - 0x5850003E, // 0131 LDCONST R20 K62 - 0x5C541400, // 0132 MOVE R21 R10 - 0x5C581C00, // 0133 MOVE R22 R14 - 0x5C5C1600, // 0134 MOVE R23 R11 - 0x20601C0B, // 0135 NE R24 R14 R11 - 0x78620001, // 0136 JMPF R24 #0139 - 0x5860003F, // 0137 LDCONST R24 K63 - 0x70020000, // 0138 JMP #013A - 0x5860003B, // 0139 LDCONST R24 K59 - 0x7C480C00, // 013A CALL R18 6 - 0x584C0013, // 013B LDCONST R19 K19 - 0x7C400600, // 013C CALL R16 3 - 0x783E0017, // 013D JMPF R15 #0156 - 0x50180200, // 013E LDBOOL R6 1 0 - 0x8C401B40, // 013F GETMET R16 R13 K64 - 0x5C481A00, // 0140 MOVE R18 R13 - 0x5C4C1800, // 0141 MOVE R19 R12 - 0x5C501600, // 0142 MOVE R20 R11 - 0x7C400800, // 0143 CALL R16 4 - 0x88400114, // 0144 GETMBR R16 R0 K20 - 0x8C402141, // 0145 GETMET R16 R16 K65 - 0x5C481400, // 0146 MOVE R18 R10 - 0x7C400400, // 0147 CALL R16 2 - 0x7842000C, // 0148 JMPF R16 #0156 - 0xB8461000, // 0149 GETNGBL R17 K8 - 0x8C442309, // 014A GETMET R17 R17 K9 - 0x8C4C050A, // 014B GETMET R19 R2 K10 - 0x58540042, // 014C LDCONST R21 K66 - 0x5C581800, // 014D MOVE R22 R12 - 0x5C5C1400, // 014E MOVE R23 R10 - 0x5C602000, // 014F MOVE R24 R16 - 0x7C4C0A00, // 0150 CALL R19 5 - 0x58500013, // 0151 LDCONST R20 K19 - 0x7C440600, // 0152 CALL R17 3 - 0x8C442143, // 0153 GETMET R17 R16 K67 - 0x5C4C1800, // 0154 MOVE R19 R12 - 0x7C440400, // 0155 CALL R17 2 - 0x70020007, // 0156 JMP #015F - 0xB8361000, // 0157 GETNGBL R13 K8 - 0x8C341B09, // 0158 GETMET R13 R13 K9 - 0x8C3C050A, // 0159 GETMET R15 R2 K10 - 0x58440044, // 015A LDCONST R17 K68 - 0x5C481400, // 015B MOVE R18 R10 - 0x7C3C0600, // 015C CALL R15 3 - 0x58400013, // 015D LDCONST R16 K19 - 0x7C340600, // 015E CALL R13 3 - 0x7001FF98, // 015F JMP #00F9 - 0x581C000E, // 0160 LDCONST R7 K14 - 0xAC1C0200, // 0161 CATCH R7 1 0 - 0xB0080000, // 0162 RAISE 2 R0 R0 - 0xB81E1000, // 0163 GETNGBL R7 K8 - 0x8C1C0F09, // 0164 GETMET R7 R7 K9 - 0x8C24050A, // 0165 GETMET R9 R2 K10 - 0x582C0045, // 0166 LDCONST R11 K69 - 0x60300008, // 0167 GETGBL R12 G8 - 0x88340114, // 0168 GETMBR R13 R0 K20 - 0x88341B38, // 0169 GETMBR R13 R13 K56 - 0x7C300200, // 016A CALL R12 1 - 0x7C240600, // 016B CALL R9 3 - 0x58280013, // 016C LDCONST R10 K19 - 0x7C1C0600, // 016D CALL R7 3 - 0x78160008, // 016E JMPF R5 #0178 - 0xB81E1000, // 016F GETNGBL R7 K8 - 0x8C1C0F09, // 0170 GETMET R7 R7 K9 - 0x8C24050A, // 0171 GETMET R9 R2 K10 - 0x582C0046, // 0172 LDCONST R11 K70 - 0x5C300A00, // 0173 MOVE R12 R5 - 0x7C240600, // 0174 CALL R9 3 - 0x58280013, // 0175 LDCONST R10 K19 - 0x7C1C0600, // 0176 CALL R7 3 - 0x7002000C, // 0177 JMP #0185 - 0x741A0002, // 0178 JMPT R6 #017C - 0x881C0114, // 0179 GETMBR R7 R0 K20 - 0x881C0F34, // 017A GETMBR R7 R7 K52 - 0x741E0005, // 017B JMPT R7 #0182 - 0x881C0114, // 017C GETMBR R7 R0 K20 - 0x50200200, // 017D LDBOOL R8 1 0 - 0x901E6808, // 017E SETMBR R7 K52 R8 - 0x881C0114, // 017F GETMBR R7 R0 K20 - 0x8C1C0F1A, // 0180 GETMET R7 R7 K26 - 0x7C1C0200, // 0181 CALL R7 1 - 0x8C1C031B, // 0182 GETMET R7 R1 K27 - 0x58240047, // 0183 LDCONST R9 K71 - 0x7C1C0400, // 0184 CALL R7 2 - 0x700200B9, // 0185 JMP #0240 - 0x8C18030F, // 0186 GETMET R6 R1 K15 - 0x58200048, // 0187 LDCONST R8 K72 - 0x7C180400, // 0188 CALL R6 2 - 0x781A0026, // 0189 JMPF R6 #01B1 - 0x8C18030D, // 018A GETMET R6 R1 K13 - 0x58200049, // 018B LDCONST R8 K73 - 0x7C180400, // 018C CALL R6 2 - 0x8C1C030D, // 018D GETMET R7 R1 K13 - 0x5824000D, // 018E LDCONST R9 K13 - 0x7C1C0400, // 018F CALL R7 2 - 0xB8221000, // 0190 GETNGBL R8 K8 - 0x8C201109, // 0191 GETMET R8 R8 K9 - 0x8C28050A, // 0192 GETMET R10 R2 K10 - 0x5830004A, // 0193 LDCONST R12 K74 - 0x5C340C00, // 0194 MOVE R13 R6 - 0x5C380E00, // 0195 MOVE R14 R7 - 0x7C280800, // 0196 CALL R10 4 - 0x582C0013, // 0197 LDCONST R11 K19 - 0x7C200600, // 0198 CALL R8 3 - 0x88200114, // 0199 GETMBR R8 R0 K20 - 0x88201139, // 019A GETMBR R8 R8 K57 - 0x8C201136, // 019B GETMET R8 R8 K54 - 0x5C280C00, // 019C MOVE R10 R6 - 0x7C200400, // 019D CALL R8 2 - 0x4C240000, // 019E LDNIL R9 - 0x20241009, // 019F NE R9 R8 R9 - 0x7826000B, // 01A0 JMPF R9 #01AD - 0x60240013, // 01A1 GETGBL R9 G19 - 0x7C240000, // 01A2 CALL R9 0 - 0x8C281140, // 01A3 GETMET R10 R8 K64 - 0x5C301000, // 01A4 MOVE R12 R8 - 0x5C341200, // 01A5 MOVE R13 R9 - 0x5C380E00, // 01A6 MOVE R14 R7 - 0x7C280800, // 01A7 CALL R10 4 - 0x88280114, // 01A8 GETMBR R10 R0 K20 - 0x8C28154B, // 01A9 GETMET R10 R10 K75 - 0x5C300C00, // 01AA MOVE R12 R6 - 0x5C341200, // 01AB MOVE R13 R9 - 0x7C280600, // 01AC CALL R10 3 - 0x8C24031B, // 01AD GETMET R9 R1 K27 - 0x582C0032, // 01AE LDCONST R11 K50 - 0x7C240400, // 01AF CALL R9 2 - 0x7002008E, // 01B0 JMP #0240 - 0x8C18030F, // 01B1 GETMET R6 R1 K15 - 0x5820004C, // 01B2 LDCONST R8 K76 - 0x7C180400, // 01B3 CALL R6 2 - 0x781A0059, // 01B4 JMPF R6 #020F - 0x8C18030D, // 01B5 GETMET R6 R1 K13 - 0x5820004D, // 01B6 LDCONST R8 K77 - 0x7C180400, // 01B7 CALL R6 2 - 0x4C1C0000, // 01B8 LDNIL R7 - 0x1C1C0C07, // 01B9 EQ R7 R6 R7 - 0x741E0001, // 01BA JMPT R7 #01BD - 0x1C1C0D3B, // 01BB EQ R7 R6 K59 - 0x781E0000, // 01BC JMPF R7 #01BE - 0xB0069D4F, // 01BD RAISE 1 K78 K79 - 0x581C0005, // 01BE LDCONST R7 K5 - 0x60200008, // 01BF GETGBL R8 G8 - 0x5C240E00, // 01C0 MOVE R9 R7 - 0x7C200200, // 01C1 CALL R8 1 - 0x8C24030F, // 01C2 GETMET R9 R1 K15 - 0x002E9208, // 01C3 ADD R11 K73 R8 - 0x7C240400, // 01C4 CALL R9 2 - 0x78260044, // 01C5 JMPF R9 #020B - 0x8C24030D, // 01C6 GETMET R9 R1 K13 - 0x002E9208, // 01C7 ADD R11 K73 R8 - 0x7C240400, // 01C8 CALL R9 2 - 0x8C28030D, // 01C9 GETMET R10 R1 K13 - 0x00321A08, // 01CA ADD R12 K13 R8 - 0x7C280400, // 01CB CALL R10 2 - 0x202C133B, // 01CC NE R11 R9 K59 - 0x782E0036, // 01CD JMPF R11 #0205 - 0x882C0114, // 01CE GETMBR R11 R0 K20 - 0x882C1739, // 01CF GETMBR R11 R11 K57 - 0x8C2C1736, // 01D0 GETMET R11 R11 K54 - 0x5C341200, // 01D1 MOVE R13 R9 - 0x7C2C0400, // 01D2 CALL R11 2 - 0x4C300000, // 01D3 LDNIL R12 - 0x2030160C, // 01D4 NE R12 R11 R12 - 0x7832002E, // 01D5 JMPF R12 #0205 - 0x60300013, // 01D6 GETGBL R12 G19 - 0x7C300000, // 01D7 CALL R12 0 - 0x98329A06, // 01D8 SETIDX R12 K77 R6 - 0x98327409, // 01D9 SETIDX R12 K58 R9 - 0x8C341740, // 01DA GETMET R13 R11 K64 - 0x5C3C1600, // 01DB MOVE R15 R11 - 0x5C401800, // 01DC MOVE R16 R12 - 0x5C441400, // 01DD MOVE R17 R10 - 0x7C340800, // 01DE CALL R13 4 - 0x50340000, // 01DF LDBOOL R13 0 0 - 0x60380010, // 01E0 GETGBL R14 G16 - 0x883C0114, // 01E1 GETMBR R15 R0 K20 - 0x883C1F38, // 01E2 GETMBR R15 R15 K56 - 0x7C380200, // 01E3 CALL R14 1 - 0xA802000B, // 01E4 EXBLK 0 #01F1 - 0x5C3C1C00, // 01E5 MOVE R15 R14 - 0x7C3C0000, // 01E6 CALL R15 0 - 0x8C400150, // 01E7 GETMET R16 R0 K80 - 0x5C481E00, // 01E8 MOVE R18 R15 - 0x5C4C1800, // 01E9 MOVE R19 R12 - 0x7C400600, // 01EA CALL R16 3 - 0x78420001, // 01EB JMPF R16 #01EE - 0x50340200, // 01EC LDBOOL R13 1 0 - 0x70020000, // 01ED JMP #01EF - 0x7001FFF5, // 01EE JMP #01E5 - 0xA8040001, // 01EF EXBLK 1 1 - 0x70020002, // 01F0 JMP #01F4 - 0x5838000E, // 01F1 LDCONST R14 K14 - 0xAC380200, // 01F2 CATCH R14 1 0 - 0xB0080000, // 01F3 RAISE 2 R0 R0 - 0x5C381A00, // 01F4 MOVE R14 R13 - 0x743A000E, // 01F5 JMPT R14 #0205 - 0xB83A1000, // 01F6 GETNGBL R14 K8 - 0x8C381D09, // 01F7 GETMET R14 R14 K9 - 0x8C40050A, // 01F8 GETMET R16 R2 K10 - 0x58480051, // 01F9 LDCONST R18 K81 - 0x5C4C0C00, // 01FA MOVE R19 R6 - 0x5C501200, // 01FB MOVE R20 R9 - 0x5C541400, // 01FC MOVE R21 R10 - 0x7C400A00, // 01FD CALL R16 5 - 0x58440013, // 01FE LDCONST R17 K19 - 0x7C380600, // 01FF CALL R14 3 - 0x88380114, // 0200 GETMBR R14 R0 K20 - 0x8C381D4B, // 0201 GETMET R14 R14 K75 - 0x5C401200, // 0202 MOVE R16 R9 - 0x5C441800, // 0203 MOVE R17 R12 - 0x7C380600, // 0204 CALL R14 3 - 0x001C0F07, // 0205 ADD R7 R7 K7 - 0x602C0008, // 0206 GETGBL R11 G8 - 0x5C300E00, // 0207 MOVE R12 R7 - 0x7C2C0200, // 0208 CALL R11 1 - 0x5C201600, // 0209 MOVE R8 R11 - 0x7001FFB6, // 020A JMP #01C2 - 0x8C24031B, // 020B GETMET R9 R1 K27 - 0x582C0032, // 020C LDCONST R11 K50 - 0x7C240400, // 020D CALL R9 2 - 0x70020030, // 020E JMP #0240 - 0x4C180000, // 020F LDNIL R6 - 0x601C0010, // 0210 GETGBL R7 G16 - 0x8C200306, // 0211 GETMET R8 R1 K6 - 0x7C200200, // 0212 CALL R8 1 - 0x04201107, // 0213 SUB R8 R8 K7 - 0x40220A08, // 0214 CONNECT R8 K5 R8 - 0x7C1C0200, // 0215 CALL R7 1 - 0xA8020013, // 0216 EXBLK 0 #022B - 0x5C200E00, // 0217 MOVE R8 R7 - 0x7C200000, // 0218 CALL R8 0 - 0x8C24030C, // 0219 GETMET R9 R1 K12 - 0x5C2C1000, // 021A MOVE R11 R8 - 0x7C240400, // 021B CALL R9 2 - 0x8C280536, // 021C GETMET R10 R2 K54 - 0x5C301200, // 021D MOVE R12 R9 - 0x58340052, // 021E LDCONST R13 K82 - 0x7C280600, // 021F CALL R10 3 - 0x1C281505, // 0220 EQ R10 R10 K5 - 0x782A0005, // 0221 JMPF R10 #0228 - 0x60280009, // 0222 GETGBL R10 G9 - 0x402E2737, // 0223 CONNECT R11 K19 K55 - 0x942C120B, // 0224 GETIDX R11 R9 R11 - 0x7C280200, // 0225 CALL R10 1 - 0x5C181400, // 0226 MOVE R6 R10 - 0x70020000, // 0227 JMP #0229 - 0x7001FFED, // 0228 JMP #0217 - 0xA8040001, // 0229 EXBLK 1 1 - 0x70020002, // 022A JMP #022E - 0x581C000E, // 022B LDCONST R7 K14 - 0xAC1C0200, // 022C CATCH R7 1 0 - 0xB0080000, // 022D RAISE 2 R0 R0 - 0x4C1C0000, // 022E LDNIL R7 - 0x201C0C07, // 022F NE R7 R6 R7 - 0x781E000E, // 0230 JMPF R7 #0240 - 0xB81E1000, // 0231 GETNGBL R7 K8 - 0x8C1C0F09, // 0232 GETMET R7 R7 K9 - 0x8C24050A, // 0233 GETMET R9 R2 K10 - 0x582C0053, // 0234 LDCONST R11 K83 - 0x5C300C00, // 0235 MOVE R12 R6 - 0x7C240600, // 0236 CALL R9 3 - 0x58280054, // 0237 LDCONST R10 K84 - 0x7C1C0600, // 0238 CALL R7 3 - 0x881C0114, // 0239 GETMBR R7 R0 K20 - 0x8C1C0F55, // 023A GETMET R7 R7 K85 - 0x5C240C00, // 023B MOVE R9 R6 - 0x7C1C0400, // 023C CALL R7 2 - 0x8C1C031B, // 023D GETMET R7 R1 K27 - 0x58240032, // 023E LDCONST R9 K50 - 0x7C1C0400, // 023F CALL R7 2 - 0x78160011, // 0240 JMPF R5 #0253 - 0x8C180356, // 0241 GETMET R6 R1 K86 - 0x58200057, // 0242 LDCONST R8 K87 - 0x7C180400, // 0243 CALL R6 2 - 0x8C180358, // 0244 GETMET R6 R1 K88 - 0x7C180200, // 0245 CALL R6 1 - 0x8C180359, // 0246 GETMET R6 R1 K89 - 0x8C20050A, // 0247 GETMET R8 R2 K10 - 0x5828005A, // 0248 LDCONST R10 K90 - 0x8C2C035B, // 0249 GETMET R11 R1 K91 - 0x5C340A00, // 024A MOVE R13 R5 - 0x7C2C0400, // 024B CALL R11 2 - 0x7C200600, // 024C CALL R8 3 - 0x7C180400, // 024D CALL R6 2 - 0x8C18035C, // 024E GETMET R6 R1 K92 - 0x8820035D, // 024F GETMBR R8 R1 K93 - 0x7C180400, // 0250 CALL R6 2 - 0x8C18035E, // 0251 GETMET R6 R1 K94 - 0x7C180200, // 0252 CALL R6 1 - 0xA8040001, // 0253 EXBLK 1 1 - 0x7002001D, // 0254 JMP #0273 - 0xAC180002, // 0255 CATCH R6 0 2 - 0x7002001A, // 0256 JMP #0272 - 0xB8221000, // 0257 GETNGBL R8 K8 - 0x8C201109, // 0258 GETMET R8 R8 K9 - 0x8C28050A, // 0259 GETMET R10 R2 K10 - 0x5830005F, // 025A LDCONST R12 K95 - 0x5C340C00, // 025B MOVE R13 R6 - 0x5C380E00, // 025C MOVE R14 R7 - 0x7C280800, // 025D CALL R10 4 - 0x582C0054, // 025E LDCONST R11 K84 - 0x7C200600, // 025F CALL R8 3 - 0x8C200356, // 0260 GETMET R8 R1 K86 - 0x58280057, // 0261 LDCONST R10 K87 - 0x7C200400, // 0262 CALL R8 2 - 0x8C200358, // 0263 GETMET R8 R1 K88 - 0x7C200200, // 0264 CALL R8 1 - 0x8C200359, // 0265 GETMET R8 R1 K89 - 0x8C28050A, // 0266 GETMET R10 R2 K10 - 0x58300060, // 0267 LDCONST R12 K96 - 0x5C340C00, // 0268 MOVE R13 R6 - 0x5C380E00, // 0269 MOVE R14 R7 - 0x7C280800, // 026A CALL R10 4 - 0x7C200400, // 026B CALL R8 2 - 0x8C20035C, // 026C GETMET R8 R1 K92 - 0x8828035D, // 026D GETMBR R10 R1 K93 - 0x7C200400, // 026E CALL R8 2 - 0x8C20035E, // 026F GETMET R8 R1 K94 - 0x7C200200, // 0270 CALL R8 1 - 0x70020000, // 0271 JMP #0273 - 0xB0080000, // 0272 RAISE 2 R0 R0 - 0x80000000, // 0273 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: web_get_arg -********************************************************************/ -be_local_closure(Matter_UI_web_get_arg, /* name */ - be_nested_proto( - 5, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 7]) { /* constants */ - /* K0 */ be_nested_str_weak(webserver), - /* K1 */ be_nested_str_weak(has_arg), - /* K2 */ be_nested_str_weak(mtc0), - /* K3 */ be_nested_str_weak(device), - /* K4 */ be_nested_str_weak(stop_basic_commissioning), - /* K5 */ be_nested_str_weak(mtc1), - /* K6 */ be_nested_str_weak(start_root_basic_commissioning), - }), - be_str_weak(web_get_arg), - &be_const_str_solidified, - ( &(const binstruction[17]) { /* code */ - 0xA4060000, // 0000 IMPORT R1 K0 - 0x8C080301, // 0001 GETMET R2 R1 K1 - 0x58100002, // 0002 LDCONST R4 K2 - 0x7C080400, // 0003 CALL R2 2 - 0x780A0003, // 0004 JMPF R2 #0009 - 0x88080103, // 0005 GETMBR R2 R0 K3 - 0x8C080504, // 0006 GETMET R2 R2 K4 - 0x7C080200, // 0007 CALL R2 1 - 0x70020006, // 0008 JMP #0010 - 0x8C080301, // 0009 GETMET R2 R1 K1 - 0x58100005, // 000A LDCONST R4 K5 - 0x7C080400, // 000B CALL R2 2 - 0x780A0002, // 000C JMPF R2 #0010 - 0x88080103, // 000D GETMBR R2 R0 K3 - 0x8C080506, // 000E GETMET R2 R2 K6 - 0x7C080200, // 000F CALL R2 1 - 0x80000000, // 0010 RET 0 + 0x8C20111C, // 0068 GETMET R8 R8 K28 + 0x60280008, // 0069 GETGBL R10 G8 + 0xB82E3C00, // 006A GETNGBL R11 K30 + 0x882C171F, // 006B GETMBR R11 R11 K31 + 0x7C280200, // 006C CALL R10 1 + 0x002A3A0A, // 006D ADD R10 K29 R10 + 0x00281522, // 006E ADD R10 R10 K34 + 0x7C200400, // 006F CALL R8 2 + 0x8C200315, // 0070 GETMET R8 R1 K21 + 0x58280016, // 0071 LDCONST R10 K22 + 0x7C200400, // 0072 CALL R8 2 + 0x70020014, // 0073 JMP #0089 + 0x8820010D, // 0074 GETMBR R8 R0 K13 + 0x88201123, // 0075 GETMBR R8 R8 K35 + 0x4C240000, // 0076 LDNIL R9 + 0x20201009, // 0077 NE R8 R8 R9 + 0x20200E08, // 0078 NE R8 R7 R8 + 0x7822000B, // 0079 JMPF R8 #0086 + 0x781E0003, // 007A JMPF R7 #007F + 0x8820010D, // 007B GETMBR R8 R0 K13 + 0x8C201124, // 007C GETMET R8 R8 K36 + 0x7C200200, // 007D CALL R8 1 + 0x70020002, // 007E JMP #0082 + 0x8820010D, // 007F GETMBR R8 R0 K13 + 0x8C201125, // 0080 GETMET R8 R8 K37 + 0x7C200200, // 0081 CALL R8 1 + 0x8C200315, // 0082 GETMET R8 R1 K21 + 0x58280026, // 0083 LDCONST R10 K38 + 0x7C200400, // 0084 CALL R8 2 + 0x70020002, // 0085 JMP #0089 + 0x8C200315, // 0086 GETMET R8 R1 K21 + 0x58280026, // 0087 LDCONST R10 K38 + 0x7C200400, // 0088 CALL R8 2 + 0x70020193, // 0089 JMP #021E + 0x8C180305, // 008A GETMET R6 R1 K5 + 0x58200027, // 008B LDCONST R8 K39 + 0x7C180400, // 008C CALL R6 2 + 0x781A0026, // 008D JMPF R6 #00B5 + 0xB81A1000, // 008E GETNGBL R6 K8 + 0x8C180D09, // 008F GETMET R6 R6 K9 + 0x8C20050A, // 0090 GETMET R8 R2 K10 + 0x5828000B, // 0091 LDCONST R10 K11 + 0x582C0027, // 0092 LDCONST R11 K39 + 0x7C200600, // 0093 CALL R8 3 + 0x5824000C, // 0094 LDCONST R9 K12 + 0x7C180600, // 0095 CALL R6 3 + 0x60180009, // 0096 GETGBL R6 G9 + 0x8C1C030F, // 0097 GETMET R7 R1 K15 + 0x58240027, // 0098 LDCONST R9 K39 + 0x7C1C0400, // 0099 CALL R7 2 + 0x7C180200, // 009A CALL R6 1 + 0x581C0028, // 009B LDCONST R7 K40 + 0x8820010D, // 009C GETMBR R8 R0 K13 + 0x88201129, // 009D GETMBR R8 R8 K41 + 0x8820112A, // 009E GETMBR R8 R8 K42 + 0x6024000C, // 009F GETGBL R9 G12 + 0x5C281000, // 00A0 MOVE R10 R8 + 0x7C240200, // 00A1 CALL R9 1 + 0x14240E09, // 00A2 LT R9 R7 R9 + 0x7826000C, // 00A3 JMPF R9 #00B1 + 0x94241007, // 00A4 GETIDX R9 R8 R7 + 0x8C24132B, // 00A5 GETMET R9 R9 K43 + 0x7C240200, // 00A6 CALL R9 1 + 0x1C241206, // 00A7 EQ R9 R9 R6 + 0x78260005, // 00A8 JMPF R9 #00AF + 0x8824010D, // 00A9 GETMBR R9 R0 K13 + 0x8C24132C, // 00AA GETMET R9 R9 K44 + 0x942C1007, // 00AB GETIDX R11 R8 R7 + 0x7C240400, // 00AC CALL R9 2 + 0x70020002, // 00AD JMP #00B1 + 0x70020000, // 00AE JMP #00B0 + 0x001C0F2D, // 00AF ADD R7 R7 K45 + 0x7001FFED, // 00B0 JMP #009F + 0x8C240315, // 00B1 GETMET R9 R1 K21 + 0x582C002E, // 00B2 LDCONST R11 K46 + 0x7C240400, // 00B3 CALL R9 2 + 0x70020168, // 00B4 JMP #021E + 0x8C180305, // 00B5 GETMET R6 R1 K5 + 0x5820002F, // 00B6 LDCONST R8 K47 + 0x7C180400, // 00B7 CALL R6 2 + 0x781A0011, // 00B8 JMPF R6 #00CB + 0xB81A1000, // 00B9 GETNGBL R6 K8 + 0x8C180D09, // 00BA GETMET R6 R6 K9 + 0x8C20050A, // 00BB GETMET R8 R2 K10 + 0x5828000B, // 00BC LDCONST R10 K11 + 0x582C002F, // 00BD LDCONST R11 K47 + 0x7C200600, // 00BE CALL R8 3 + 0x5824000C, // 00BF LDCONST R9 K12 + 0x7C180600, // 00C0 CALL R6 3 + 0x8818010D, // 00C1 GETMBR R6 R0 K13 + 0x501C0000, // 00C2 LDBOOL R7 0 0 + 0x901A6007, // 00C3 SETMBR R6 K48 R7 + 0x8818010D, // 00C4 GETMBR R6 R0 K13 + 0x8C180D14, // 00C5 GETMET R6 R6 K20 + 0x7C180200, // 00C6 CALL R6 1 + 0x8C180315, // 00C7 GETMET R6 R1 K21 + 0x58200016, // 00C8 LDCONST R8 K22 + 0x7C180400, // 00C9 CALL R6 2 + 0x70020152, // 00CA JMP #021E + 0x8C180305, // 00CB GETMET R6 R1 K5 + 0x58200031, // 00CC LDCONST R8 K49 + 0x7C180400, // 00CD CALL R6 2 + 0x781A009C, // 00CE JMPF R6 #016C + 0xB81A1000, // 00CF GETNGBL R6 K8 + 0x8C180D09, // 00D0 GETMET R6 R6 K9 + 0x8C20050A, // 00D1 GETMET R8 R2 K10 + 0x5828000B, // 00D2 LDCONST R10 K11 + 0x582C0031, // 00D3 LDCONST R11 K49 + 0x7C200600, // 00D4 CALL R8 3 + 0x5824000C, // 00D5 LDCONST R9 K12 + 0x7C180600, // 00D6 CALL R6 3 + 0x50180000, // 00D7 LDBOOL R6 0 0 + 0x601C0010, // 00D8 GETGBL R7 G16 + 0x8C200332, // 00D9 GETMET R8 R1 K50 + 0x7C200200, // 00DA CALL R8 1 + 0x0420112D, // 00DB SUB R8 R8 K45 + 0x40225008, // 00DC CONNECT R8 K40 R8 + 0x7C1C0200, // 00DD CALL R7 1 + 0xA8020066, // 00DE EXBLK 0 #0146 + 0x5C200E00, // 00DF MOVE R8 R7 + 0x7C200000, // 00E0 CALL R8 0 + 0x8C240333, // 00E1 GETMET R9 R1 K51 + 0x5C2C1000, // 00E2 MOVE R11 R8 + 0x7C240400, // 00E3 CALL R9 2 + 0x8C280534, // 00E4 GETMET R10 R2 K52 + 0x5C301200, // 00E5 MOVE R12 R9 + 0x5834000F, // 00E6 LDCONST R13 K15 + 0x7C280600, // 00E7 CALL R10 3 + 0x1C281528, // 00E8 EQ R10 R10 K40 + 0x782A005A, // 00E9 JMPF R10 #0145 + 0x60280009, // 00EA GETGBL R10 G9 + 0x402E1935, // 00EB CONNECT R11 K12 K53 + 0x942C120B, // 00EC GETIDX R11 R9 R11 + 0x7C280200, // 00ED CALL R10 1 + 0x8C2C030F, // 00EE GETMET R11 R1 K15 + 0x5C341000, // 00EF MOVE R13 R8 + 0x7C2C0400, // 00F0 CALL R11 2 + 0x8830010D, // 00F1 GETMBR R12 R0 K13 + 0x88301936, // 00F2 GETMBR R12 R12 K54 + 0x8C301934, // 00F3 GETMET R12 R12 K52 + 0x60380008, // 00F4 GETGBL R14 G8 + 0x5C3C1400, // 00F5 MOVE R15 R10 + 0x7C380200, // 00F6 CALL R14 1 + 0x7C300400, // 00F7 CALL R12 2 + 0x4C340000, // 00F8 LDNIL R13 + 0x2034180D, // 00F9 NE R13 R12 R13 + 0x78360041, // 00FA JMPF R13 #013D + 0x8834010D, // 00FB GETMBR R13 R0 K13 + 0x88341B37, // 00FC GETMBR R13 R13 K55 + 0x8C341B34, // 00FD GETMET R13 R13 K52 + 0x8C3C1934, // 00FE GETMET R15 R12 K52 + 0x58440038, // 00FF LDCONST R17 K56 + 0x58480039, // 0100 LDCONST R18 K57 + 0x7C3C0600, // 0101 CALL R15 3 + 0x7C340400, // 0102 CALL R13 2 + 0x4C380000, // 0103 LDNIL R14 + 0x20381A0E, // 0104 NE R14 R13 R14 + 0x783A0035, // 0105 JMPF R14 #013C + 0xB83A1000, // 0106 GETNGBL R14 K8 + 0x8C381D09, // 0107 GETMET R14 R14 K9 + 0x8C40050A, // 0108 GETMET R16 R2 K10 + 0x5848003A, // 0109 LDCONST R18 K58 + 0x5C4C1400, // 010A MOVE R19 R10 + 0x5C501600, // 010B MOVE R20 R11 + 0x7C400800, // 010C CALL R16 4 + 0x5844000C, // 010D LDCONST R17 K12 + 0x7C380600, // 010E CALL R14 3 + 0x8C381B3B, // 010F GETMET R14 R13 K59 + 0x5C401A00, // 0110 MOVE R16 R13 + 0x5C441800, // 0111 MOVE R17 R12 + 0x7C380600, // 0112 CALL R14 3 + 0x203C1C0B, // 0113 NE R15 R14 R11 + 0xB8421000, // 0114 GETNGBL R16 K8 + 0x8C402109, // 0115 GETMET R16 R16 K9 + 0x8C48050A, // 0116 GETMET R18 R2 K10 + 0x5850003C, // 0117 LDCONST R20 K60 + 0x5C541400, // 0118 MOVE R21 R10 + 0x5C581C00, // 0119 MOVE R22 R14 + 0x5C5C1600, // 011A MOVE R23 R11 + 0x20601C0B, // 011B NE R24 R14 R11 + 0x78620001, // 011C JMPF R24 #011F + 0x5860003D, // 011D LDCONST R24 K61 + 0x70020000, // 011E JMP #0120 + 0x58600039, // 011F LDCONST R24 K57 + 0x7C480C00, // 0120 CALL R18 6 + 0x584C000C, // 0121 LDCONST R19 K12 + 0x7C400600, // 0122 CALL R16 3 + 0x783E0017, // 0123 JMPF R15 #013C + 0x50180200, // 0124 LDBOOL R6 1 0 + 0x8C401B3E, // 0125 GETMET R16 R13 K62 + 0x5C481A00, // 0126 MOVE R18 R13 + 0x5C4C1800, // 0127 MOVE R19 R12 + 0x5C501600, // 0128 MOVE R20 R11 + 0x7C400800, // 0129 CALL R16 4 + 0x8840010D, // 012A GETMBR R16 R0 K13 + 0x8C40213F, // 012B GETMET R16 R16 K63 + 0x5C481400, // 012C MOVE R18 R10 + 0x7C400400, // 012D CALL R16 2 + 0x7842000C, // 012E JMPF R16 #013C + 0xB8461000, // 012F GETNGBL R17 K8 + 0x8C442309, // 0130 GETMET R17 R17 K9 + 0x8C4C050A, // 0131 GETMET R19 R2 K10 + 0x58540040, // 0132 LDCONST R21 K64 + 0x5C581800, // 0133 MOVE R22 R12 + 0x5C5C1400, // 0134 MOVE R23 R10 + 0x5C602000, // 0135 MOVE R24 R16 + 0x7C4C0A00, // 0136 CALL R19 5 + 0x5850000C, // 0137 LDCONST R20 K12 + 0x7C440600, // 0138 CALL R17 3 + 0x8C442141, // 0139 GETMET R17 R16 K65 + 0x5C4C1800, // 013A MOVE R19 R12 + 0x7C440400, // 013B CALL R17 2 + 0x70020007, // 013C JMP #0145 + 0xB8361000, // 013D GETNGBL R13 K8 + 0x8C341B09, // 013E GETMET R13 R13 K9 + 0x8C3C050A, // 013F GETMET R15 R2 K10 + 0x58440042, // 0140 LDCONST R17 K66 + 0x5C481400, // 0141 MOVE R18 R10 + 0x7C3C0600, // 0142 CALL R15 3 + 0x5840000C, // 0143 LDCONST R16 K12 + 0x7C340600, // 0144 CALL R13 3 + 0x7001FF98, // 0145 JMP #00DF + 0x581C0043, // 0146 LDCONST R7 K67 + 0xAC1C0200, // 0147 CATCH R7 1 0 + 0xB0080000, // 0148 RAISE 2 R0 R0 + 0xB81E1000, // 0149 GETNGBL R7 K8 + 0x8C1C0F09, // 014A GETMET R7 R7 K9 + 0x8C24050A, // 014B GETMET R9 R2 K10 + 0x582C0044, // 014C LDCONST R11 K68 + 0x60300008, // 014D GETGBL R12 G8 + 0x8834010D, // 014E GETMBR R13 R0 K13 + 0x88341B36, // 014F GETMBR R13 R13 K54 + 0x7C300200, // 0150 CALL R12 1 + 0x7C240600, // 0151 CALL R9 3 + 0x5828000C, // 0152 LDCONST R10 K12 + 0x7C1C0600, // 0153 CALL R7 3 + 0x78160008, // 0154 JMPF R5 #015E + 0xB81E1000, // 0155 GETNGBL R7 K8 + 0x8C1C0F09, // 0156 GETMET R7 R7 K9 + 0x8C24050A, // 0157 GETMET R9 R2 K10 + 0x582C0045, // 0158 LDCONST R11 K69 + 0x5C300A00, // 0159 MOVE R12 R5 + 0x7C240600, // 015A CALL R9 3 + 0x5828000C, // 015B LDCONST R10 K12 + 0x7C1C0600, // 015C CALL R7 3 + 0x7002000C, // 015D JMP #016B + 0x741A0002, // 015E JMPT R6 #0162 + 0x881C010D, // 015F GETMBR R7 R0 K13 + 0x881C0F30, // 0160 GETMBR R7 R7 K48 + 0x741E0005, // 0161 JMPT R7 #0168 + 0x881C010D, // 0162 GETMBR R7 R0 K13 + 0x50200200, // 0163 LDBOOL R8 1 0 + 0x901E6008, // 0164 SETMBR R7 K48 R8 + 0x881C010D, // 0165 GETMBR R7 R0 K13 + 0x8C1C0F14, // 0166 GETMET R7 R7 K20 + 0x7C1C0200, // 0167 CALL R7 1 + 0x8C1C0315, // 0168 GETMET R7 R1 K21 + 0x5824002E, // 0169 LDCONST R9 K46 + 0x7C1C0400, // 016A CALL R7 2 + 0x700200B1, // 016B JMP #021E + 0x8C180305, // 016C GETMET R6 R1 K5 + 0x58200046, // 016D LDCONST R8 K70 + 0x7C180400, // 016E CALL R6 2 + 0x781A0026, // 016F JMPF R6 #0197 + 0x8C18030F, // 0170 GETMET R6 R1 K15 + 0x58200047, // 0171 LDCONST R8 K71 + 0x7C180400, // 0172 CALL R6 2 + 0x8C1C030F, // 0173 GETMET R7 R1 K15 + 0x5824000F, // 0174 LDCONST R9 K15 + 0x7C1C0400, // 0175 CALL R7 2 + 0xB8221000, // 0176 GETNGBL R8 K8 + 0x8C201109, // 0177 GETMET R8 R8 K9 + 0x8C28050A, // 0178 GETMET R10 R2 K10 + 0x58300048, // 0179 LDCONST R12 K72 + 0x5C340C00, // 017A MOVE R13 R6 + 0x5C380E00, // 017B MOVE R14 R7 + 0x7C280800, // 017C CALL R10 4 + 0x582C000C, // 017D LDCONST R11 K12 + 0x7C200600, // 017E CALL R8 3 + 0x8820010D, // 017F GETMBR R8 R0 K13 + 0x88201137, // 0180 GETMBR R8 R8 K55 + 0x8C201134, // 0181 GETMET R8 R8 K52 + 0x5C280C00, // 0182 MOVE R10 R6 + 0x7C200400, // 0183 CALL R8 2 + 0x4C240000, // 0184 LDNIL R9 + 0x20241009, // 0185 NE R9 R8 R9 + 0x7826000B, // 0186 JMPF R9 #0193 + 0x60240013, // 0187 GETGBL R9 G19 + 0x7C240000, // 0188 CALL R9 0 + 0x8C28113E, // 0189 GETMET R10 R8 K62 + 0x5C301000, // 018A MOVE R12 R8 + 0x5C341200, // 018B MOVE R13 R9 + 0x5C380E00, // 018C MOVE R14 R7 + 0x7C280800, // 018D CALL R10 4 + 0x8828010D, // 018E GETMBR R10 R0 K13 + 0x8C281549, // 018F GETMET R10 R10 K73 + 0x5C300C00, // 0190 MOVE R12 R6 + 0x5C341200, // 0191 MOVE R13 R9 + 0x7C280600, // 0192 CALL R10 3 + 0x8C240315, // 0193 GETMET R9 R1 K21 + 0x582C002E, // 0194 LDCONST R11 K46 + 0x7C240400, // 0195 CALL R9 2 + 0x70020086, // 0196 JMP #021E + 0x8C180305, // 0197 GETMET R6 R1 K5 + 0x5820004A, // 0198 LDCONST R8 K74 + 0x7C180400, // 0199 CALL R6 2 + 0x781A0059, // 019A JMPF R6 #01F5 + 0x8C18030F, // 019B GETMET R6 R1 K15 + 0x5820004B, // 019C LDCONST R8 K75 + 0x7C180400, // 019D CALL R6 2 + 0x4C1C0000, // 019E LDNIL R7 + 0x1C1C0C07, // 019F EQ R7 R6 R7 + 0x741E0001, // 01A0 JMPT R7 #01A3 + 0x1C1C0D39, // 01A1 EQ R7 R6 K57 + 0x781E0000, // 01A2 JMPF R7 #01A4 + 0xB006994D, // 01A3 RAISE 1 K76 K77 + 0x581C0028, // 01A4 LDCONST R7 K40 + 0x60200008, // 01A5 GETGBL R8 G8 + 0x5C240E00, // 01A6 MOVE R9 R7 + 0x7C200200, // 01A7 CALL R8 1 + 0x8C240305, // 01A8 GETMET R9 R1 K5 + 0x002E8E08, // 01A9 ADD R11 K71 R8 + 0x7C240400, // 01AA CALL R9 2 + 0x78260044, // 01AB JMPF R9 #01F1 + 0x8C24030F, // 01AC GETMET R9 R1 K15 + 0x002E8E08, // 01AD ADD R11 K71 R8 + 0x7C240400, // 01AE CALL R9 2 + 0x8C28030F, // 01AF GETMET R10 R1 K15 + 0x00321E08, // 01B0 ADD R12 K15 R8 + 0x7C280400, // 01B1 CALL R10 2 + 0x202C1339, // 01B2 NE R11 R9 K57 + 0x782E0036, // 01B3 JMPF R11 #01EB + 0x882C010D, // 01B4 GETMBR R11 R0 K13 + 0x882C1737, // 01B5 GETMBR R11 R11 K55 + 0x8C2C1734, // 01B6 GETMET R11 R11 K52 + 0x5C341200, // 01B7 MOVE R13 R9 + 0x7C2C0400, // 01B8 CALL R11 2 + 0x4C300000, // 01B9 LDNIL R12 + 0x2030160C, // 01BA NE R12 R11 R12 + 0x7832002E, // 01BB JMPF R12 #01EB + 0x60300013, // 01BC GETGBL R12 G19 + 0x7C300000, // 01BD CALL R12 0 + 0x98329606, // 01BE SETIDX R12 K75 R6 + 0x98327009, // 01BF SETIDX R12 K56 R9 + 0x8C34173E, // 01C0 GETMET R13 R11 K62 + 0x5C3C1600, // 01C1 MOVE R15 R11 + 0x5C401800, // 01C2 MOVE R16 R12 + 0x5C441400, // 01C3 MOVE R17 R10 + 0x7C340800, // 01C4 CALL R13 4 + 0x50340000, // 01C5 LDBOOL R13 0 0 + 0x60380010, // 01C6 GETGBL R14 G16 + 0x883C010D, // 01C7 GETMBR R15 R0 K13 + 0x883C1F36, // 01C8 GETMBR R15 R15 K54 + 0x7C380200, // 01C9 CALL R14 1 + 0xA802000B, // 01CA EXBLK 0 #01D7 + 0x5C3C1C00, // 01CB MOVE R15 R14 + 0x7C3C0000, // 01CC CALL R15 0 + 0x8C40014E, // 01CD GETMET R16 R0 K78 + 0x5C481E00, // 01CE MOVE R18 R15 + 0x5C4C1800, // 01CF MOVE R19 R12 + 0x7C400600, // 01D0 CALL R16 3 + 0x78420001, // 01D1 JMPF R16 #01D4 + 0x50340200, // 01D2 LDBOOL R13 1 0 + 0x70020000, // 01D3 JMP #01D5 + 0x7001FFF5, // 01D4 JMP #01CB + 0xA8040001, // 01D5 EXBLK 1 1 + 0x70020002, // 01D6 JMP #01DA + 0x58380043, // 01D7 LDCONST R14 K67 + 0xAC380200, // 01D8 CATCH R14 1 0 + 0xB0080000, // 01D9 RAISE 2 R0 R0 + 0x5C381A00, // 01DA MOVE R14 R13 + 0x743A000E, // 01DB JMPT R14 #01EB + 0xB83A1000, // 01DC GETNGBL R14 K8 + 0x8C381D09, // 01DD GETMET R14 R14 K9 + 0x8C40050A, // 01DE GETMET R16 R2 K10 + 0x5848004F, // 01DF LDCONST R18 K79 + 0x5C4C0C00, // 01E0 MOVE R19 R6 + 0x5C501200, // 01E1 MOVE R20 R9 + 0x5C541400, // 01E2 MOVE R21 R10 + 0x7C400A00, // 01E3 CALL R16 5 + 0x5844000C, // 01E4 LDCONST R17 K12 + 0x7C380600, // 01E5 CALL R14 3 + 0x8838010D, // 01E6 GETMBR R14 R0 K13 + 0x8C381D49, // 01E7 GETMET R14 R14 K73 + 0x5C401200, // 01E8 MOVE R16 R9 + 0x5C441800, // 01E9 MOVE R17 R12 + 0x7C380600, // 01EA CALL R14 3 + 0x001C0F2D, // 01EB ADD R7 R7 K45 + 0x602C0008, // 01EC GETGBL R11 G8 + 0x5C300E00, // 01ED MOVE R12 R7 + 0x7C2C0200, // 01EE CALL R11 1 + 0x5C201600, // 01EF MOVE R8 R11 + 0x7001FFB6, // 01F0 JMP #01A8 + 0x8C240315, // 01F1 GETMET R9 R1 K21 + 0x582C002E, // 01F2 LDCONST R11 K46 + 0x7C240400, // 01F3 CALL R9 2 + 0x70020028, // 01F4 JMP #021E + 0x4C180000, // 01F5 LDNIL R6 + 0x601C0010, // 01F6 GETGBL R7 G16 + 0x8C200332, // 01F7 GETMET R8 R1 K50 + 0x7C200200, // 01F8 CALL R8 1 + 0x0420112D, // 01F9 SUB R8 R8 K45 + 0x40225008, // 01FA CONNECT R8 K40 R8 + 0x7C1C0200, // 01FB CALL R7 1 + 0xA8020013, // 01FC EXBLK 0 #0211 + 0x5C200E00, // 01FD MOVE R8 R7 + 0x7C200000, // 01FE CALL R8 0 + 0x8C240333, // 01FF GETMET R9 R1 K51 + 0x5C2C1000, // 0200 MOVE R11 R8 + 0x7C240400, // 0201 CALL R9 2 + 0x8C280534, // 0202 GETMET R10 R2 K52 + 0x5C301200, // 0203 MOVE R12 R9 + 0x58340050, // 0204 LDCONST R13 K80 + 0x7C280600, // 0205 CALL R10 3 + 0x1C281528, // 0206 EQ R10 R10 K40 + 0x782A0005, // 0207 JMPF R10 #020E + 0x60280009, // 0208 GETGBL R10 G9 + 0x402E1935, // 0209 CONNECT R11 K12 K53 + 0x942C120B, // 020A GETIDX R11 R9 R11 + 0x7C280200, // 020B CALL R10 1 + 0x5C181400, // 020C MOVE R6 R10 + 0x70020000, // 020D JMP #020F + 0x7001FFED, // 020E JMP #01FD + 0xA8040001, // 020F EXBLK 1 1 + 0x70020002, // 0210 JMP #0214 + 0x581C0043, // 0211 LDCONST R7 K67 + 0xAC1C0200, // 0212 CATCH R7 1 0 + 0xB0080000, // 0213 RAISE 2 R0 R0 + 0x4C1C0000, // 0214 LDNIL R7 + 0x201C0C07, // 0215 NE R7 R6 R7 + 0x781E0006, // 0216 JMPF R7 #021E + 0x881C010D, // 0217 GETMBR R7 R0 K13 + 0x8C1C0F51, // 0218 GETMET R7 R7 K81 + 0x5C240C00, // 0219 MOVE R9 R6 + 0x7C1C0400, // 021A CALL R7 2 + 0x8C1C0315, // 021B GETMET R7 R1 K21 + 0x5824002E, // 021C LDCONST R9 K46 + 0x7C1C0400, // 021D CALL R7 2 + 0x78160011, // 021E JMPF R5 #0231 + 0x8C180352, // 021F GETMET R6 R1 K82 + 0x58200053, // 0220 LDCONST R8 K83 + 0x7C180400, // 0221 CALL R6 2 + 0x8C180354, // 0222 GETMET R6 R1 K84 + 0x7C180200, // 0223 CALL R6 1 + 0x8C180355, // 0224 GETMET R6 R1 K85 + 0x8C20050A, // 0225 GETMET R8 R2 K10 + 0x58280056, // 0226 LDCONST R10 K86 + 0x8C2C0357, // 0227 GETMET R11 R1 K87 + 0x5C340A00, // 0228 MOVE R13 R5 + 0x7C2C0400, // 0229 CALL R11 2 + 0x7C200600, // 022A CALL R8 3 + 0x7C180400, // 022B CALL R6 2 + 0x8C180358, // 022C GETMET R6 R1 K88 + 0x88200359, // 022D GETMBR R8 R1 K89 + 0x7C180400, // 022E CALL R6 2 + 0x8C18035A, // 022F GETMET R6 R1 K90 + 0x7C180200, // 0230 CALL R6 1 + 0xA8040001, // 0231 EXBLK 1 1 + 0x7002001D, // 0232 JMP #0251 + 0xAC180002, // 0233 CATCH R6 0 2 + 0x7002001A, // 0234 JMP #0250 + 0xB8221000, // 0235 GETNGBL R8 K8 + 0x8C201109, // 0236 GETMET R8 R8 K9 + 0x8C28050A, // 0237 GETMET R10 R2 K10 + 0x5830005B, // 0238 LDCONST R12 K91 + 0x5C340C00, // 0239 MOVE R13 R6 + 0x5C380E00, // 023A MOVE R14 R7 + 0x7C280800, // 023B CALL R10 4 + 0x582C005C, // 023C LDCONST R11 K92 + 0x7C200600, // 023D CALL R8 3 + 0x8C200352, // 023E GETMET R8 R1 K82 + 0x58280053, // 023F LDCONST R10 K83 + 0x7C200400, // 0240 CALL R8 2 + 0x8C200354, // 0241 GETMET R8 R1 K84 + 0x7C200200, // 0242 CALL R8 1 + 0x8C200355, // 0243 GETMET R8 R1 K85 + 0x8C28050A, // 0244 GETMET R10 R2 K10 + 0x5830005D, // 0245 LDCONST R12 K93 + 0x5C340C00, // 0246 MOVE R13 R6 + 0x5C380E00, // 0247 MOVE R14 R7 + 0x7C280800, // 0248 CALL R10 4 + 0x7C200400, // 0249 CALL R8 2 + 0x8C200358, // 024A GETMET R8 R1 K88 + 0x88280359, // 024B GETMBR R10 R1 K89 + 0x7C200400, // 024C CALL R8 2 + 0x8C20035A, // 024D GETMET R8 R1 K90 + 0x7C200200, // 024E CALL R8 1 + 0x70020000, // 024F JMP #0251 + 0xB0080000, // 0250 RAISE 2 R0 R0 + 0x80000000, // 0251 RET 0 }) ) ); @@ -1436,627 +2995,6 @@ be_local_closure(Matter_UI_show_qrcode, /* name */ /*******************************************************************/ -/******************************************************************** -** Solidified function: show_remote_autoconf -********************************************************************/ -be_local_closure(Matter_UI_show_remote_autoconf, /* name */ - be_nested_proto( - 24, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[45]) { /* constants */ - /* K0 */ be_nested_str_weak(webserver), - /* K1 */ be_nested_str_weak(string), - /* K2 */ be_nested_str_weak(json), - /* K3 */ be_nested_str_weak(), - /* K4 */ be_nested_str_weak(matter), - /* K5 */ be_nested_str_weak(Plugin_Bridge_HTTP), - /* K6 */ be_nested_str_weak(PROBE_TIMEOUT), - /* K7 */ be_nested_str_weak(HTTP_remote), - /* K8 */ be_nested_str_weak(call_sync), - /* K9 */ be_nested_str_weak(Status_X208), - /* K10 */ be_nested_str_weak(load), - /* K11 */ be_nested_str_weak(find), - /* K12 */ be_nested_str_weak(StatusSNS), - /* K13 */ be_nested_str_weak(Status_X2011), - /* K14 */ be_nested_str_weak(StatusSTS), - /* K15 */ be_nested_str_weak(tasmota), - /* K16 */ be_nested_str_weak(log), - /* K17 */ be_nested_str_weak(format), - /* K18 */ be_nested_str_weak(MTR_X3A_X20probed_X20_X27_X25s_X27_X20status8_X3D_X25s_X20satus11_X3D_X25s), - /* K19 */ be_const_int(3), - /* K20 */ be_nested_str_weak(generate_config_from_status), - /* K21 */ be_nested_str_weak(content_send), - /* K22 */ be_nested_str_weak(_X3Cfieldset_X3E_X3Clegend_X3E_X3Cb_X3E_X26nbsp_X3BMatter_X20Remote_X20Device_X26nbsp_X3B_X3C_X2Fb_X3E_X3C_X2Flegend_X3E_X3Cp_X3E_X3C_X2Fp_X3E_X3Cp_X3E_X3Cb_X3EAdd_X20Remote_X20sensor_X20or_X20device_X3C_X2Fb_X3E_X3C_X2Fp_X3E), - /* K23 */ be_nested_str_weak(_X3Cp_X3E_X26_X23x1F517_X3B_X20_X3Ca_X20target_X3D_X27_blank_X27_X20href_X3D_X22http_X3A_X2F_X2F_X25s_X2F_X22_X3E_X25s_X3C_X2Fa_X3E_X3C_X2Fp_X3E), - /* K24 */ be_nested_str_weak(html_escape), - /* K25 */ be_nested_str_weak(_X3Cform_X20action_X3D_X27_X2Fmatterc_X27_X20method_X3D_X27post_X27_X3E_X3Ctable_X20style_X3D_X27width_X3A100_X25_X27_X3E_X3Ctr_X3E_X3Ctd_X20width_X3D_X27145_X27_X3EType_X3C_X2Ftd_X3E_X3Ctd_X3EParameter_X3C_X2Ftd_X3E_X3C_X2Ftr_X3E), - /* K26 */ be_nested_str_weak(_X3Cinput_X20name_X3D_X27url_X27_X20type_X3D_X27hidden_X27_X20value_X3D_X27_X25s_X27_X3E), - /* K27 */ be_const_int(0), - /* K28 */ be_nested_str_weak(type), - /* K29 */ be_nested_str_weak(http_), - /* K30 */ be_nested_str_weak(device), - /* K31 */ be_nested_str_weak(plugins_classes), - /* K32 */ be_nested_str_weak(ui_conf_to_string), - /* K33 */ be_nested_str_weak(_X3Ctr_X3E_X3Ctd_X3E_X3Cfont_X20size_X3D_X27_X2D1_X27_X3E_X3Cselect_X20name_X3D_X27pi_X25i_X27_X3E), - /* K34 */ be_nested_str_weak(plugin_option), - /* K35 */ be_nested_str_weak(_CLASSES_TYPES2), - /* K36 */ be_nested_str_weak(_X3C_X2Fselect_X3E_X3C_X2Ffont_X3E_X3C_X2Ftd_X3E_X3Ctd_X3E_X3Cfont_X20size_X3D_X27_X2D1_X27_X3E), - /* K37 */ be_nested_str_weak(_X3Cinput_X20type_X3D_X27text_X27_X20name_X3D_X27arg_X25i_X27_X20minlength_X3D_X270_X27_X20size_X3D_X278_X27_X20value_X3D_X27_X25s_X27_X3E), - /* K38 */ be_nested_str_weak(_X3C_X2Ffont_X3E_X3C_X2Ftd_X3E_X3C_X2Ftr_X3E), - /* K39 */ be_const_int(1), - /* K40 */ be_nested_str_weak(_X3C_X2Ftable_X3E), - /* K41 */ be_nested_str_weak(_X3Cdiv_X20style_X3D_X27display_X3A_X20block_X3B_X27_X3E_X3C_X2Fdiv_X3E), - /* K42 */ be_nested_str_weak(_X3Cbutton_X20name_X3D_X27addrem_X27_X20class_X3D_X27button_X20bgrn_X27_X3EAdd_X20endpoints_X3C_X2Fbutton_X3E_X3C_X2Fform_X3E), - /* K43 */ be_nested_str_weak(_X3C_X2Fform_X3E_X3C_X2Ffieldset_X3E_X3Cp_X3E_X3C_X2Fp_X3E), - /* K44 */ be_nested_str_weak(_X3Cp_X3E_X3Cb_X3EUnable_X20to_X20connect_X20to_X20_X27_X25s_X27_X3C_X2Fb_X3E_X3C_X2Fp_X3E), - }), - be_str_weak(show_remote_autoconf), - &be_const_str_solidified, - ( &(const binstruction[204]) { /* code */ - 0xA40A0000, // 0000 IMPORT R2 K0 - 0xA40E0200, // 0001 IMPORT R3 K1 - 0xA4120400, // 0002 IMPORT R4 K2 - 0x1C140303, // 0003 EQ R5 R1 K3 - 0x78160000, // 0004 JMPF R5 #0006 - 0x80000A00, // 0005 RET 0 - 0xB8160800, // 0006 GETNGBL R5 K4 - 0x88140B05, // 0007 GETMBR R5 R5 K5 - 0x88140B06, // 0008 GETMBR R5 R5 K6 - 0xB81A0800, // 0009 GETNGBL R6 K4 - 0x8C180D07, // 000A GETMET R6 R6 K7 - 0x5C200200, // 000B MOVE R8 R1 - 0x5C240A00, // 000C MOVE R9 R5 - 0x7C180600, // 000D CALL R6 3 - 0x8C1C0D08, // 000E GETMET R7 R6 K8 - 0x58240009, // 000F LDCONST R9 K9 - 0x5C280A00, // 0010 MOVE R10 R5 - 0x7C1C0600, // 0011 CALL R7 3 - 0x4C200000, // 0012 LDNIL R8 - 0x20200E08, // 0013 NE R8 R7 R8 - 0x78220003, // 0014 JMPF R8 #0019 - 0x8C20090A, // 0015 GETMET R8 R4 K10 - 0x5C280E00, // 0016 MOVE R10 R7 - 0x7C200400, // 0017 CALL R8 2 - 0x5C1C1000, // 0018 MOVE R7 R8 - 0x4C200000, // 0019 LDNIL R8 - 0x20200E08, // 001A NE R8 R7 R8 - 0x78220003, // 001B JMPF R8 #0020 - 0x8C200F0B, // 001C GETMET R8 R7 K11 - 0x5828000C, // 001D LDCONST R10 K12 - 0x7C200400, // 001E CALL R8 2 - 0x5C1C1000, // 001F MOVE R7 R8 - 0x4C200000, // 0020 LDNIL R8 - 0x4C240000, // 0021 LDNIL R9 - 0x20240E09, // 0022 NE R9 R7 R9 - 0x78260012, // 0023 JMPF R9 #0037 - 0x8C240D08, // 0024 GETMET R9 R6 K8 - 0x582C000D, // 0025 LDCONST R11 K13 - 0x5C300A00, // 0026 MOVE R12 R5 - 0x7C240600, // 0027 CALL R9 3 - 0x5C201200, // 0028 MOVE R8 R9 - 0x4C240000, // 0029 LDNIL R9 - 0x20241009, // 002A NE R9 R8 R9 - 0x78260003, // 002B JMPF R9 #0030 - 0x8C24090A, // 002C GETMET R9 R4 K10 - 0x5C2C1000, // 002D MOVE R11 R8 - 0x7C240400, // 002E CALL R9 2 - 0x5C201200, // 002F MOVE R8 R9 - 0x4C240000, // 0030 LDNIL R9 - 0x20241009, // 0031 NE R9 R8 R9 - 0x78260003, // 0032 JMPF R9 #0037 - 0x8C24110B, // 0033 GETMET R9 R8 K11 - 0x582C000E, // 0034 LDCONST R11 K14 - 0x7C240400, // 0035 CALL R9 2 - 0x5C201200, // 0036 MOVE R8 R9 - 0x4C240000, // 0037 LDNIL R9 - 0x20240E09, // 0038 NE R9 R7 R9 - 0x78260088, // 0039 JMPF R9 #00C3 - 0x4C240000, // 003A LDNIL R9 - 0x20241009, // 003B NE R9 R8 R9 - 0x78260085, // 003C JMPF R9 #00C3 - 0xB8261E00, // 003D GETNGBL R9 K15 - 0x8C241310, // 003E GETMET R9 R9 K16 - 0x8C2C0711, // 003F GETMET R11 R3 K17 - 0x58340012, // 0040 LDCONST R13 K18 - 0x5C380200, // 0041 MOVE R14 R1 - 0x603C0008, // 0042 GETGBL R15 G8 - 0x5C400E00, // 0043 MOVE R16 R7 - 0x7C3C0200, // 0044 CALL R15 1 - 0x60400008, // 0045 GETGBL R16 G8 - 0x5C441000, // 0046 MOVE R17 R8 - 0x7C400200, // 0047 CALL R16 1 - 0x7C2C0A00, // 0048 CALL R11 5 - 0x58300013, // 0049 LDCONST R12 K19 - 0x7C240600, // 004A CALL R9 3 - 0x8C240114, // 004B GETMET R9 R0 K20 - 0x5C2C0E00, // 004C MOVE R11 R7 - 0x5C301000, // 004D MOVE R12 R8 - 0x7C240600, // 004E CALL R9 3 - 0x8C280515, // 004F GETMET R10 R2 K21 - 0x58300016, // 0050 LDCONST R12 K22 - 0x7C280400, // 0051 CALL R10 2 - 0x8C280515, // 0052 GETMET R10 R2 K21 - 0x8C300711, // 0053 GETMET R12 R3 K17 - 0x58380017, // 0054 LDCONST R14 K23 - 0x8C3C0518, // 0055 GETMET R15 R2 K24 - 0x5C440200, // 0056 MOVE R17 R1 - 0x7C3C0400, // 0057 CALL R15 2 - 0x8C400518, // 0058 GETMET R16 R2 K24 - 0x5C480200, // 0059 MOVE R18 R1 - 0x7C400400, // 005A CALL R16 2 - 0x7C300800, // 005B CALL R12 4 - 0x7C280400, // 005C CALL R10 2 - 0x8C280515, // 005D GETMET R10 R2 K21 - 0x58300019, // 005E LDCONST R12 K25 - 0x7C280400, // 005F CALL R10 2 - 0x8C280515, // 0060 GETMET R10 R2 K21 - 0x8C300711, // 0061 GETMET R12 R3 K17 - 0x5838001A, // 0062 LDCONST R14 K26 - 0x8C3C0518, // 0063 GETMET R15 R2 K24 - 0x5C440200, // 0064 MOVE R17 R1 - 0x7C3C0400, // 0065 CALL R15 2 - 0x7C300600, // 0066 CALL R12 3 - 0x7C280400, // 0067 CALL R10 2 - 0x5828001B, // 0068 LDCONST R10 K27 - 0x602C000C, // 0069 GETGBL R11 G12 - 0x5C301200, // 006A MOVE R12 R9 - 0x7C2C0200, // 006B CALL R11 1 - 0x142C140B, // 006C LT R11 R10 R11 - 0x782E0030, // 006D JMPF R11 #009F - 0x942C120A, // 006E GETIDX R11 R9 R10 - 0x8C30170B, // 006F GETMET R12 R11 K11 - 0x5838001C, // 0070 LDCONST R14 K28 - 0x583C0003, // 0071 LDCONST R15 K3 - 0x7C300600, // 0072 CALL R12 3 - 0x20341903, // 0073 NE R13 R12 K3 - 0x78360000, // 0074 JMPF R13 #0076 - 0x00323A0C, // 0075 ADD R12 K29 R12 - 0x8834011E, // 0076 GETMBR R13 R0 K30 - 0x88341B1F, // 0077 GETMBR R13 R13 K31 - 0x8C341B0B, // 0078 GETMET R13 R13 K11 - 0x5C3C1800, // 0079 MOVE R15 R12 - 0x7C340400, // 007A CALL R13 2 - 0x58380003, // 007B LDCONST R14 K3 - 0x4C3C0000, // 007C LDNIL R15 - 0x203C1A0F, // 007D NE R15 R13 R15 - 0x783E0004, // 007E JMPF R15 #0084 - 0x8C3C1B20, // 007F GETMET R15 R13 K32 - 0x5C441A00, // 0080 MOVE R17 R13 - 0x5C481600, // 0081 MOVE R18 R11 - 0x7C3C0600, // 0082 CALL R15 3 - 0x5C381E00, // 0083 MOVE R14 R15 - 0x8C3C0515, // 0084 GETMET R15 R2 K21 - 0x8C440711, // 0085 GETMET R17 R3 K17 - 0x584C0021, // 0086 LDCONST R19 K33 - 0x5C501400, // 0087 MOVE R20 R10 - 0x7C440600, // 0088 CALL R17 3 - 0x7C3C0400, // 0089 CALL R15 2 - 0x8C3C0122, // 008A GETMET R15 R0 K34 - 0x5C441800, // 008B MOVE R17 R12 - 0x88480123, // 008C GETMBR R18 R0 K35 - 0x7C3C0600, // 008D CALL R15 3 - 0x8C3C0515, // 008E GETMET R15 R2 K21 - 0x58440024, // 008F LDCONST R17 K36 - 0x7C3C0400, // 0090 CALL R15 2 - 0x8C3C0515, // 0091 GETMET R15 R2 K21 - 0x8C440711, // 0092 GETMET R17 R3 K17 - 0x584C0025, // 0093 LDCONST R19 K37 - 0x5C501400, // 0094 MOVE R20 R10 - 0x8C540518, // 0095 GETMET R21 R2 K24 - 0x5C5C1C00, // 0096 MOVE R23 R14 - 0x7C540400, // 0097 CALL R21 2 - 0x7C440800, // 0098 CALL R17 4 - 0x7C3C0400, // 0099 CALL R15 2 - 0x8C3C0515, // 009A GETMET R15 R2 K21 - 0x58440026, // 009B LDCONST R17 K38 - 0x7C3C0400, // 009C CALL R15 2 - 0x00281527, // 009D ADD R10 R10 K39 - 0x7001FFC9, // 009E JMP #0069 - 0x8C2C0515, // 009F GETMET R11 R2 K21 - 0x8C340711, // 00A0 GETMET R13 R3 K17 - 0x583C0021, // 00A1 LDCONST R15 K33 - 0x5C401400, // 00A2 MOVE R16 R10 - 0x7C340600, // 00A3 CALL R13 3 - 0x7C2C0400, // 00A4 CALL R11 2 - 0x8C2C0122, // 00A5 GETMET R11 R0 K34 - 0x58340003, // 00A6 LDCONST R13 K3 - 0x88380123, // 00A7 GETMBR R14 R0 K35 - 0x7C2C0600, // 00A8 CALL R11 3 - 0x8C2C0515, // 00A9 GETMET R11 R2 K21 - 0x58340024, // 00AA LDCONST R13 K36 - 0x7C2C0400, // 00AB CALL R11 2 - 0x8C2C0515, // 00AC GETMET R11 R2 K21 - 0x8C340711, // 00AD GETMET R13 R3 K17 - 0x583C0025, // 00AE LDCONST R15 K37 - 0x5C401400, // 00AF MOVE R16 R10 - 0x58440003, // 00B0 LDCONST R17 K3 - 0x7C340800, // 00B1 CALL R13 4 - 0x7C2C0400, // 00B2 CALL R11 2 - 0x8C2C0515, // 00B3 GETMET R11 R2 K21 - 0x58340026, // 00B4 LDCONST R13 K38 - 0x7C2C0400, // 00B5 CALL R11 2 - 0x8C2C0515, // 00B6 GETMET R11 R2 K21 - 0x58340028, // 00B7 LDCONST R13 K40 - 0x7C2C0400, // 00B8 CALL R11 2 - 0x8C2C0515, // 00B9 GETMET R11 R2 K21 - 0x58340029, // 00BA LDCONST R13 K41 - 0x7C2C0400, // 00BB CALL R11 2 - 0x8C2C0515, // 00BC GETMET R11 R2 K21 - 0x5834002A, // 00BD LDCONST R13 K42 - 0x7C2C0400, // 00BE CALL R11 2 - 0x8C2C0515, // 00BF GETMET R11 R2 K21 - 0x5834002B, // 00C0 LDCONST R13 K43 - 0x7C2C0400, // 00C1 CALL R11 2 - 0x70020007, // 00C2 JMP #00CB - 0x8C240515, // 00C3 GETMET R9 R2 K21 - 0x8C2C0711, // 00C4 GETMET R11 R3 K17 - 0x5834002C, // 00C5 LDCONST R13 K44 - 0x8C380518, // 00C6 GETMET R14 R2 K24 - 0x5C400200, // 00C7 MOVE R16 R1 - 0x7C380400, // 00C8 CALL R14 2 - 0x7C2C0600, // 00C9 CALL R11 3 - 0x7C240400, // 00CA CALL R9 2 - 0x80000000, // 00CB RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: page_part_mgr_add -********************************************************************/ -be_local_closure(Matter_UI_page_part_mgr_add, /* name */ - be_nested_proto( - 7, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[13]) { /* constants */ - /* K0 */ be_nested_str_weak(webserver), - /* K1 */ be_nested_str_weak(string), - /* K2 */ be_nested_str_weak(check_privileged_access), - /* K3 */ be_nested_str_weak(content_start), - /* K4 */ be_nested_str_weak(Matter_X20Create_X20new_X20endpoint), - /* K5 */ be_nested_str_weak(content_send_style), - /* K6 */ be_nested_str_weak(arg), - /* K7 */ be_nested_str_weak(url), - /* K8 */ be_nested_str_weak(matter_enabled), - /* K9 */ be_nested_str_weak(show_remote_autoconf), - /* K10 */ be_nested_str_weak(content_button), - /* K11 */ be_nested_str_weak(BUTTON_CONFIGURATION), - /* K12 */ be_nested_str_weak(content_stop), - }), - be_str_weak(page_part_mgr_add), - &be_const_str_solidified, - ( &(const binstruction[27]) { /* code */ - 0xA4060000, // 0000 IMPORT R1 K0 - 0xA40A0200, // 0001 IMPORT R2 K1 - 0x8C0C0302, // 0002 GETMET R3 R1 K2 - 0x7C0C0200, // 0003 CALL R3 1 - 0x740E0001, // 0004 JMPT R3 #0007 - 0x4C0C0000, // 0005 LDNIL R3 - 0x80040600, // 0006 RET 1 R3 - 0x8C0C0303, // 0007 GETMET R3 R1 K3 - 0x58140004, // 0008 LDCONST R5 K4 - 0x7C0C0400, // 0009 CALL R3 2 - 0x8C0C0305, // 000A GETMET R3 R1 K5 - 0x7C0C0200, // 000B CALL R3 1 - 0x8C0C0306, // 000C GETMET R3 R1 K6 - 0x58140007, // 000D LDCONST R5 K7 - 0x7C0C0400, // 000E CALL R3 2 - 0x8C100108, // 000F GETMET R4 R0 K8 - 0x7C100200, // 0010 CALL R4 1 - 0x78120002, // 0011 JMPF R4 #0015 - 0x8C100109, // 0012 GETMET R4 R0 K9 - 0x5C180600, // 0013 MOVE R6 R3 - 0x7C100400, // 0014 CALL R4 2 - 0x8C10030A, // 0015 GETMET R4 R1 K10 - 0x8818030B, // 0016 GETMBR R6 R1 K11 - 0x7C100400, // 0017 CALL R4 2 - 0x8C10030C, // 0018 GETMET R4 R1 K12 - 0x7C100200, // 0019 CALL R4 1 - 0x80000000, // 001A RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: web_add_handler -********************************************************************/ -be_local_closure(Matter_UI_web_add_handler, /* name */ - be_nested_proto( - 7, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 1, /* has sup protos */ - ( &(const struct bproto*[ 4]) { - be_nested_proto( - 2, /* nstack */ - 0, /* argc */ - 0, /* varg */ - 1, /* has upvals */ - ( &(const bupvaldesc[ 1]) { /* upvals */ - be_local_const_upval(1, 0), - }), - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 1]) { /* constants */ - /* K0 */ be_nested_str_weak(page_part_mgr), - }), - be_str_weak(_X3Clambda_X3E), - &be_const_str_solidified, - ( &(const binstruction[ 4]) { /* code */ - 0x68000000, // 0000 GETUPV R0 U0 - 0x8C000100, // 0001 GETMET R0 R0 K0 - 0x7C000200, // 0002 CALL R0 1 - 0x80040000, // 0003 RET 1 R0 - }) - ), - be_nested_proto( - 2, /* nstack */ - 0, /* argc */ - 0, /* varg */ - 1, /* has upvals */ - ( &(const bupvaldesc[ 1]) { /* upvals */ - be_local_const_upval(1, 0), - }), - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 1]) { /* constants */ - /* K0 */ be_nested_str_weak(page_part_ctl), - }), - be_str_weak(_X3Clambda_X3E), - &be_const_str_solidified, - ( &(const binstruction[ 4]) { /* code */ - 0x68000000, // 0000 GETUPV R0 U0 - 0x8C000100, // 0001 GETMET R0 R0 K0 - 0x7C000200, // 0002 CALL R0 1 - 0x80040000, // 0003 RET 1 R0 - }) - ), - be_nested_proto( - 2, /* nstack */ - 0, /* argc */ - 0, /* varg */ - 1, /* has upvals */ - ( &(const bupvaldesc[ 1]) { /* upvals */ - be_local_const_upval(1, 0), - }), - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 1]) { /* constants */ - /* K0 */ be_nested_str_weak(page_part_mgr_adv), - }), - be_str_weak(_X3Clambda_X3E), - &be_const_str_solidified, - ( &(const binstruction[ 4]) { /* code */ - 0x68000000, // 0000 GETUPV R0 U0 - 0x8C000100, // 0001 GETMET R0 R0 K0 - 0x7C000200, // 0002 CALL R0 1 - 0x80040000, // 0003 RET 1 R0 - }) - ), - be_nested_proto( - 2, /* nstack */ - 0, /* argc */ - 0, /* varg */ - 1, /* has upvals */ - ( &(const bupvaldesc[ 1]) { /* upvals */ - be_local_const_upval(1, 0), - }), - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 1]) { /* constants */ - /* K0 */ be_nested_str_weak(page_part_mgr_add), - }), - be_str_weak(_X3Clambda_X3E), - &be_const_str_solidified, - ( &(const binstruction[ 4]) { /* code */ - 0x68000000, // 0000 GETUPV R0 U0 - 0x8C000100, // 0001 GETMET R0 R0 K0 - 0x7C000200, // 0002 CALL R0 1 - 0x80040000, // 0003 RET 1 R0 - }) - ), - }), - 1, /* has constants */ - ( &(const bvalue[ 7]) { /* constants */ - /* K0 */ be_nested_str_weak(webserver), - /* K1 */ be_nested_str_weak(on), - /* K2 */ be_nested_str_weak(_X2Fmatterc), - /* K3 */ be_nested_str_weak(HTTP_GET), - /* K4 */ be_nested_str_weak(HTTP_POST), - /* K5 */ be_nested_str_weak(_X2Fmattera), - /* K6 */ be_nested_str_weak(_X2Fmatteradd), - }), - be_str_weak(web_add_handler), - &be_const_str_solidified, - ( &(const binstruction[23]) { /* code */ - 0xA4060000, // 0000 IMPORT R1 K0 - 0x8C080301, // 0001 GETMET R2 R1 K1 - 0x58100002, // 0002 LDCONST R4 K2 - 0x84140000, // 0003 CLOSURE R5 P0 - 0x88180303, // 0004 GETMBR R6 R1 K3 - 0x7C080800, // 0005 CALL R2 4 - 0x8C080301, // 0006 GETMET R2 R1 K1 - 0x58100002, // 0007 LDCONST R4 K2 - 0x84140001, // 0008 CLOSURE R5 P1 - 0x88180304, // 0009 GETMBR R6 R1 K4 - 0x7C080800, // 000A CALL R2 4 - 0x8C080301, // 000B GETMET R2 R1 K1 - 0x58100005, // 000C LDCONST R4 K5 - 0x84140002, // 000D CLOSURE R5 P2 - 0x88180303, // 000E GETMBR R6 R1 K3 - 0x7C080800, // 000F CALL R2 4 - 0x8C080301, // 0010 GETMET R2 R1 K1 - 0x58100006, // 0011 LDCONST R4 K6 - 0x84140003, // 0012 CLOSURE R5 P3 - 0x88180303, // 0013 GETMBR R6 R1 K3 - 0x7C080800, // 0014 CALL R2 4 - 0xA0000000, // 0015 CLOSE R0 - 0x80000000, // 0016 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: generate_config_from_status -********************************************************************/ -be_local_closure(Matter_UI_generate_config_from_status, /* name */ - be_nested_proto( - 13, /* nstack */ - 3, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[17]) { /* constants */ - /* K0 */ be_const_int(0), - /* K1 */ be_nested_str_weak(contains), - /* K2 */ be_nested_str_weak(POWER), - /* K3 */ be_const_int(1), - /* K4 */ be_nested_str_weak(HSBColor), - /* K5 */ be_nested_str_weak(CT), - /* K6 */ be_nested_str_weak(Dimmer), - /* K7 */ be_nested_str_weak(push), - /* K8 */ be_nested_str_weak(type), - /* K9 */ be_nested_str_weak(light0), - /* K10 */ be_nested_str_weak(relay), - /* K11 */ be_nested_str_weak(stop_iteration), - /* K12 */ be_nested_str_weak(light1), - /* K13 */ be_nested_str_weak(light2), - /* K14 */ be_nested_str_weak(light3), - /* K15 */ be_nested_str_weak(device), - /* K16 */ be_nested_str_weak(autoconf_sensors_list), - }), - be_str_weak(generate_config_from_status), - &be_const_str_solidified, - ( &(const binstruction[96]) { /* code */ - 0x600C0012, // 0000 GETGBL R3 G18 - 0x7C0C0000, // 0001 CALL R3 0 - 0x58100000, // 0002 LDCONST R4 K0 - 0x8C140501, // 0003 GETMET R5 R2 K1 - 0x581C0002, // 0004 LDCONST R7 K2 - 0x7C140400, // 0005 CALL R5 2 - 0x78160001, // 0006 JMPF R5 #0009 - 0x58100003, // 0007 LDCONST R4 K3 - 0x7002000E, // 0008 JMP #0018 - 0x58140003, // 0009 LDCONST R5 K3 - 0x50180200, // 000A LDBOOL R6 1 0 - 0x781A000B, // 000B JMPF R6 #0018 - 0x8C180501, // 000C GETMET R6 R2 K1 - 0x60200008, // 000D GETGBL R8 G8 - 0x5C240A00, // 000E MOVE R9 R5 - 0x7C200200, // 000F CALL R8 1 - 0x00220408, // 0010 ADD R8 K2 R8 - 0x7C180400, // 0011 CALL R6 2 - 0x781A0002, // 0012 JMPF R6 #0016 - 0x5C100A00, // 0013 MOVE R4 R5 - 0x00140B03, // 0014 ADD R5 R5 K3 - 0x70020000, // 0015 JMP #0017 - 0x70020000, // 0016 JMP #0018 - 0x7001FFF1, // 0017 JMP #000A - 0x4C140000, // 0018 LDNIL R5 - 0x4C180000, // 0019 LDNIL R6 - 0x4C1C0000, // 001A LDNIL R7 - 0x8C200501, // 001B GETMET R8 R2 K1 - 0x58280004, // 001C LDCONST R10 K4 - 0x7C200400, // 001D CALL R8 2 - 0x78220002, // 001E JMPF R8 #0022 - 0x5C1C0800, // 001F MOVE R7 R4 - 0x04100903, // 0020 SUB R4 R4 K3 - 0x7002000C, // 0021 JMP #002F - 0x8C200501, // 0022 GETMET R8 R2 K1 - 0x58280005, // 0023 LDCONST R10 K5 - 0x7C200400, // 0024 CALL R8 2 - 0x78220002, // 0025 JMPF R8 #0029 - 0x5C180800, // 0026 MOVE R6 R4 - 0x04100903, // 0027 SUB R4 R4 K3 - 0x70020005, // 0028 JMP #002F - 0x8C200501, // 0029 GETMET R8 R2 K1 - 0x58280006, // 002A LDCONST R10 K6 - 0x7C200400, // 002B CALL R8 2 - 0x78220001, // 002C JMPF R8 #002F - 0x5C140800, // 002D MOVE R5 R4 - 0x04100903, // 002E SUB R4 R4 K3 - 0x60200010, // 002F GETGBL R8 G16 - 0x40260604, // 0030 CONNECT R9 K3 R4 - 0x7C200200, // 0031 CALL R8 1 - 0xA8020008, // 0032 EXBLK 0 #003C - 0x5C241000, // 0033 MOVE R9 R8 - 0x7C240000, // 0034 CALL R9 0 - 0x8C280707, // 0035 GETMET R10 R3 K7 - 0x60300013, // 0036 GETGBL R12 G19 - 0x7C300000, // 0037 CALL R12 0 - 0x98321109, // 0038 SETIDX R12 K8 K9 - 0x98321409, // 0039 SETIDX R12 K10 R9 - 0x7C280400, // 003A CALL R10 2 - 0x7001FFF6, // 003B JMP #0033 - 0x5820000B, // 003C LDCONST R8 K11 - 0xAC200200, // 003D CATCH R8 1 0 - 0xB0080000, // 003E RAISE 2 R0 R0 - 0x4C200000, // 003F LDNIL R8 - 0x20200A08, // 0040 NE R8 R5 R8 - 0x78220005, // 0041 JMPF R8 #0048 - 0x8C200707, // 0042 GETMET R8 R3 K7 - 0x60280013, // 0043 GETGBL R10 G19 - 0x7C280000, // 0044 CALL R10 0 - 0x982A110C, // 0045 SETIDX R10 K8 K12 - 0x982A1405, // 0046 SETIDX R10 K10 R5 - 0x7C200400, // 0047 CALL R8 2 - 0x4C200000, // 0048 LDNIL R8 - 0x20200C08, // 0049 NE R8 R6 R8 - 0x78220005, // 004A JMPF R8 #0051 - 0x8C200707, // 004B GETMET R8 R3 K7 - 0x60280013, // 004C GETGBL R10 G19 - 0x7C280000, // 004D CALL R10 0 - 0x982A110D, // 004E SETIDX R10 K8 K13 - 0x982A1406, // 004F SETIDX R10 K10 R6 - 0x7C200400, // 0050 CALL R8 2 - 0x4C200000, // 0051 LDNIL R8 - 0x20200E08, // 0052 NE R8 R7 R8 - 0x78220005, // 0053 JMPF R8 #005A - 0x8C200707, // 0054 GETMET R8 R3 K7 - 0x60280013, // 0055 GETGBL R10 G19 - 0x7C280000, // 0056 CALL R10 0 - 0x982A110E, // 0057 SETIDX R10 K8 K14 - 0x982A1407, // 0058 SETIDX R10 K10 R7 - 0x7C200400, // 0059 CALL R8 2 - 0x8820010F, // 005A GETMBR R8 R0 K15 - 0x8C201110, // 005B GETMET R8 R8 K16 - 0x5C280200, // 005C MOVE R10 R1 - 0x7C200400, // 005D CALL R8 2 - 0x000C0608, // 005E ADD R3 R3 R8 - 0x80040600, // 005F RET 1 R3 - }) - ) -); -/*******************************************************************/ - - /******************************************************************** ** Solidified function: show_enable ********************************************************************/ @@ -2075,7 +3013,7 @@ be_local_closure(Matter_UI_show_enable, /* name */ /* K1 */ be_nested_str_weak(string), /* K2 */ be_nested_str_weak(matter_enabled), /* K3 */ be_nested_str_weak(content_send), - /* K4 */ be_nested_str_weak(_X3Cfieldset_X3E_X3Clegend_X3E_X3Cb_X3E_X26nbsp_X3BMatter_X20_X26nbsp_X3B_X3C_X2Fb_X3E_X3C_X2Flegend_X3E_X3Cp_X3E_X3C_X2Fp_X3E_X3Cp_X20style_X3D_X27width_X3A320px_X3B_X27_X3ECheck_X20the_X20_X3Ca_X20href_X3D_X27https_X3A_X2F_X2Ftasmota_X2Egithub_X2Eio_X2Fdocs_X2FMatter_X2F_X27_X20target_X3D_X27_blank_X27_X3EMatter_X20documentation_X3C_X2Fa_X3E_X2E_X3C_X2Fp_X3E_X3Cform_X20action_X3D_X27_X2Fmatterc_X27_X20method_X3D_X27post_X27_X3E), + /* K4 */ be_nested_str_weak(_X3Cfieldset_X3E_X3Clegend_X3E_X3Cb_X3E_X26nbsp_X3BMatter_X20_X26nbsp_X3B_X3C_X2Fb_X3E_X3C_X2Flegend_X3E_X3Cp_X20style_X3D_X27width_X3A320px_X3B_X27_X3ECheck_X20the_X20_X3Ca_X20href_X3D_X27https_X3A_X2F_X2Ftasmota_X2Egithub_X2Eio_X2Fdocs_X2FMatter_X2F_X27_X20target_X3D_X27_blank_X27_X3EMatter_X20documentation_X3C_X2Fa_X3E_X2E_X3C_X2Fp_X3E_X3Cform_X20action_X3D_X27_X2Fmatterc_X27_X20method_X3D_X27post_X27_X3E), /* K5 */ be_nested_str_weak(format), /* K6 */ be_nested_str_weak(_X3Cp_X3E_X3Cinput_X20id_X3D_X27menable_X27_X20type_X3D_X27checkbox_X27_X20name_X3D_X27menable_X27_X20_X25s_X3E), /* K7 */ be_nested_str_weak(checked), @@ -2085,7 +3023,7 @@ be_local_closure(Matter_UI_show_enable, /* name */ /* K11 */ be_nested_str_weak(device), /* K12 */ be_nested_str_weak(commissioning_open), /* K13 */ be_nested_str_weak(_X3Clabel_X20for_X3D_X27comm_X27_X3E_X3Cb_X3ECommissioning_X20open_X3C_X2Fb_X3E_X3C_X2Flabel_X3E_X3C_X2Fp_X3E), - /* K14 */ be_nested_str_weak(_X3Cp_X3E_X3C_X2Fp_X3E_X3Cbutton_X20name_X3D_X27save_X27_X20class_X3D_X27button_X20bgrn_X27_X3ESave_X3C_X2Fbutton_X3E_X3C_X2Fform_X3E_X3C_X2Fp_X3E_X3Cp_X3E_X3C_X2Fp_X3E_X3C_X2Ffieldset_X3E_X3Cp_X3E_X3C_X2Fp_X3E), + /* K14 */ be_nested_str_weak(_X3Cp_X3E_X3C_X2Fp_X3E_X3Cbutton_X20name_X3D_X27save_X27_X20class_X3D_X27button_X20bgrn_X27_X3ESave_X3C_X2Fbutton_X3E_X3C_X2Fform_X3E_X3C_X2Fp_X3E_X3C_X2Ffieldset_X3E_X3Cp_X3E_X3C_X2Fp_X3E), }), be_str_weak(show_enable), &be_const_str_solidified, @@ -2140,958 +3078,120 @@ be_local_closure(Matter_UI_show_enable, /* name */ /******************************************************************** -** Solidified function: show_commissioning_info +** Solidified function: show_plugins_hints_js ********************************************************************/ -be_local_closure(Matter_UI_show_commissioning_info, /* name */ +be_local_closure(Matter_UI_show_plugins_hints_js, /* name */ be_nested_proto( - 14, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[19]) { /* constants */ - /* K0 */ be_nested_str_weak(webserver), - /* K1 */ be_nested_str_weak(string), - /* K2 */ be_nested_str_weak(device), - /* K3 */ be_nested_str_weak(commissioning_open), - /* K4 */ be_nested_str_weak(tasmota), - /* K5 */ be_nested_str_weak(millis), - /* K6 */ be_const_int(0), - /* K7 */ be_nested_str_weak(content_send), - /* K8 */ be_nested_str_weak(format), - /* K9 */ be_nested_str_weak(_X3Cfieldset_X3E_X3Clegend_X3E_X3Cb_X3E_X26nbsp_X3BCommissioning_X20open_X20for_X20_X25i_X20min_X26nbsp_X3B_X3C_X2Fb_X3E_X3C_X2Flegend_X3E_X3Cp_X3E_X3C_X2Fp_X3E), - /* K10 */ be_nested_str_weak(compute_manual_pairing_code), - /* K11 */ be_nested_str_weak(_X3Cp_X3EManual_X20pairing_X20code_X3A_X3Cbr_X3E_X3Cb_X3E_X25s_X2D_X25s_X2D_X25s_X3C_X2Fb_X3E_X3C_X2Fp_X3E_X3Chr_X3E), - /* K12 */ be_const_int(3), - /* K13 */ be_const_int(2147483647), - /* K14 */ be_nested_str_weak(_X3Cdiv_X3E_X3Ccenter_X3E), - /* K15 */ be_nested_str_weak(compute_qrcode_content), - /* K16 */ be_nested_str_weak(show_qrcode), - /* K17 */ be_nested_str_weak(_X3Cp_X3E_X20_X25s_X3C_X2Fp_X3E), - /* K18 */ be_nested_str_weak(_X3C_X2Fdiv_X3E_X3Cp_X3E_X3C_X2Fp_X3E_X3C_X2Ffieldset_X3E_X3Cp_X3E_X3C_X2Fp_X3E), - }), - be_str_weak(show_commissioning_info), - &be_const_str_solidified, - ( &(const binstruction[59]) { /* code */ - 0xA4060000, // 0000 IMPORT R1 K0 - 0xA40A0200, // 0001 IMPORT R2 K1 - 0x880C0102, // 0002 GETMBR R3 R0 K2 - 0x880C0703, // 0003 GETMBR R3 R3 K3 - 0xB8120800, // 0004 GETNGBL R4 K4 - 0x8C100905, // 0005 GETMET R4 R4 K5 - 0x7C100200, // 0006 CALL R4 1 - 0x040C0604, // 0007 SUB R3 R3 R4 - 0x541203E7, // 0008 LDINT R4 1000 - 0x0C0C0604, // 0009 DIV R3 R3 R4 - 0x14100706, // 000A LT R4 R3 K6 - 0x78120000, // 000B JMPF R4 #000D - 0x580C0006, // 000C LDCONST R3 K6 - 0x5412001D, // 000D LDINT R4 30 - 0x00100604, // 000E ADD R4 R3 R4 - 0x5416003B, // 000F LDINT R5 60 - 0x0C100805, // 0010 DIV R4 R4 R5 - 0x8C140307, // 0011 GETMET R5 R1 K7 - 0x8C1C0508, // 0012 GETMET R7 R2 K8 - 0x58240009, // 0013 LDCONST R9 K9 - 0x5C280800, // 0014 MOVE R10 R4 - 0x7C1C0600, // 0015 CALL R7 3 - 0x7C140400, // 0016 CALL R5 2 - 0x88140102, // 0017 GETMBR R5 R0 K2 - 0x8C140B0A, // 0018 GETMET R5 R5 K10 - 0x7C140200, // 0019 CALL R5 1 - 0x8C180307, // 001A GETMET R6 R1 K7 - 0x8C200508, // 001B GETMET R8 R2 K8 - 0x5828000B, // 001C LDCONST R10 K11 - 0x402E0D0C, // 001D CONNECT R11 K6 K12 - 0x942C0A0B, // 001E GETIDX R11 R5 R11 - 0x54320003, // 001F LDINT R12 4 - 0x54360005, // 0020 LDINT R13 6 - 0x4030180D, // 0021 CONNECT R12 R12 R13 - 0x94300A0C, // 0022 GETIDX R12 R5 R12 - 0x54360006, // 0023 LDINT R13 7 - 0x40341B0D, // 0024 CONNECT R13 R13 K13 - 0x94340A0D, // 0025 GETIDX R13 R5 R13 - 0x7C200A00, // 0026 CALL R8 5 - 0x7C180400, // 0027 CALL R6 2 - 0x8C180307, // 0028 GETMET R6 R1 K7 - 0x5820000E, // 0029 LDCONST R8 K14 - 0x7C180400, // 002A CALL R6 2 - 0x88180102, // 002B GETMBR R6 R0 K2 - 0x8C180D0F, // 002C GETMET R6 R6 K15 - 0x7C180200, // 002D CALL R6 1 - 0x8C1C0110, // 002E GETMET R7 R0 K16 - 0x5C240C00, // 002F MOVE R9 R6 - 0x7C1C0400, // 0030 CALL R7 2 - 0x8C1C0307, // 0031 GETMET R7 R1 K7 - 0x8C240508, // 0032 GETMET R9 R2 K8 - 0x582C0011, // 0033 LDCONST R11 K17 - 0x5C300C00, // 0034 MOVE R12 R6 - 0x7C240600, // 0035 CALL R9 3 - 0x7C1C0400, // 0036 CALL R7 2 - 0x8C1C0307, // 0037 GETMET R7 R1 K7 - 0x58240012, // 0038 LDCONST R9 K18 - 0x7C1C0400, // 0039 CALL R7 2 - 0x80000000, // 003A RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: plugin_name -********************************************************************/ -be_local_closure(Matter_UI_plugin_name, /* name */ - be_nested_proto( - 6, /* nstack */ - 3, /* argc */ + 17, /* nstack */ + 2, /* argc */ 3, /* varg */ 0, /* has upvals */ NULL, /* no upvals */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[ 3]) { /* constants */ - /* K0 */ be_nested_str_weak(), - /* K1 */ be_nested_str_weak(device), - /* K2 */ be_nested_str_weak(get_plugin_class_displayname), - }), - be_str_weak(plugin_name), - &be_const_str_solidified, - ( &(const binstruction[ 8]) { /* code */ - 0x1C0C0300, // 0000 EQ R3 R1 K0 - 0x780E0000, // 0001 JMPF R3 #0003 - 0x80060000, // 0002 RET 1 K0 - 0x880C0101, // 0003 GETMBR R3 R0 K1 - 0x8C0C0702, // 0004 GETMET R3 R3 K2 - 0x5C140200, // 0005 MOVE R5 R1 - 0x7C0C0400, // 0006 CALL R3 2 - 0x80040600, // 0007 RET 1 R3 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: matter_enabled -********************************************************************/ -be_local_closure(Matter_UI_matter_enabled, /* name */ - be_nested_proto( - 5, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 4]) { /* constants */ - /* K0 */ be_nested_str_weak(tasmota), - /* K1 */ be_nested_str_weak(get_option), - /* K2 */ be_nested_str_weak(matter), - /* K3 */ be_nested_str_weak(MATTER_OPTION), - }), - be_str_weak(matter_enabled), - &be_const_str_solidified, - ( &(const binstruction[ 8]) { /* code */ - 0x60040017, // 0000 GETGBL R1 G23 - 0xB80A0000, // 0001 GETNGBL R2 K0 - 0x8C080501, // 0002 GETMET R2 R2 K1 - 0xB8120400, // 0003 GETNGBL R4 K2 - 0x88100903, // 0004 GETMBR R4 R4 K3 - 0x7C080400, // 0005 CALL R2 2 - 0x7C040200, // 0006 CALL R1 1 - 0x80040200, // 0007 RET 1 R1 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: show_plugins_configuration -********************************************************************/ -be_local_closure(Matter_UI_show_plugins_configuration, /* name */ - be_nested_proto( - 26, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[59]) { /* constants */ + ( &(const bvalue[18]) { /* constants */ /* K0 */ be_nested_str_weak(webserver), /* K1 */ be_nested_str_weak(string), - /* K2 */ be_nested_str_weak(introspect), - /* K3 */ be_nested_str_weak(content_send), - /* K4 */ be_nested_str_weak(_X3Cfieldset_X3E_X3Clegend_X3E_X3Cb_X3E_X26nbsp_X3BCurrent_X20Configuration_X26nbsp_X3B_X3C_X2Fb_X3E_X3C_X2Flegend_X3E_X3Cp_X3E_X3C_X2Fp_X3E), - /* K5 */ be_nested_str_weak(_X3Cform_X20action_X3D_X27_X2Fmatterc_X27_X20method_X3D_X27post_X27_X3Cp_X3E_X3Cb_X3ELocal_X20sensors_X20and_X20devices_X3C_X2Fb_X3E_X3C_X2Fp_X3E_X3Ctable_X20style_X3D_X27width_X3A100_X25_X27_X3E_X3Ctr_X3E_X3Ctd_X20width_X3D_X2725_X27_X3E_X23_X3C_X2Ftd_X3E_X3Ctd_X20width_X3D_X27115_X27_X3EType_X3C_X2Ftd_X3E_X3Ctd_X3EParameter_X3C_X2Ftd_X3E_X3Ctd_X20width_X3D_X2715_X27_X3E_X3C_X2Ftd_X3E_X3C_X2Ftr_X3E), - /* K6 */ be_nested_str_weak(device), - /* K7 */ be_nested_str_weak(plugins_config), - /* K8 */ be_nested_str_weak(remove), - /* K9 */ be_nested_str_weak(0), - /* K10 */ be_nested_str_weak(k2l_num), - /* K11 */ be_const_int(0), - /* K12 */ be_nested_str_weak(find), - /* K13 */ be_nested_str_weak(type), - /* K14 */ be_const_int(1), - /* K15 */ be_nested_str_weak(http_), - /* K16 */ be_nested_str_weak(plugins_classes), - /* K17 */ be_nested_str_weak(), - /* K18 */ be_nested_str_weak(ui_conf_to_string), - /* K19 */ be_nested_str_weak(format), - /* K20 */ be_nested_str_weak(_X3Ctr_X3E_X3Ctd_X3E_X3Cfont_X20size_X3D_X27_X2D1_X27_X3E_X3Cb_X3E_X25i_X3C_X2Fb_X3E_X3C_X2Ffont_X3E_X3C_X2Ftd_X3E), - /* K21 */ be_nested_str_weak(_X3Ctd_X3E_X3Cfont_X20size_X3D_X27_X2D1_X27_X3E_X3Cb_X3E_X25s_X3C_X2Fb_X3E_X3C_X2Ffont_X3E_X3C_X2Ftd_X3E), - /* K22 */ be_nested_str_weak(plugin_name), - /* K23 */ be_nested_str_weak(_X3Ctd_X3E_X3Cfont_X20size_X3D_X27_X2D1_X27_X3E_X3Cinput_X20type_X3D_X27text_X27_X20name_X3D_X27arg_X25i_X27_X20minlength_X3D_X270_X27_X20size_X3D_X278_X27_X20value_X3D_X27_X25s_X27_X3E_X3C_X2Ffont_X3E_X3C_X2Ftd_X3E), - /* K24 */ be_nested_str_weak(html_escape), - /* K25 */ be_nested_str_weak(_X3Ctd_X20style_X3D_X27text_X2Dalign_X3Acenter_X3B_X27_X3E_X3Cbutton_X20name_X3D_X27del_X25i_X27_X20style_X3D_X27background_X3Anone_X3Bborder_X3Anone_X3Bline_X2Dheight_X3A1_X3B_X27_X20onclick_X3D_X22return_X20confirm_X28_X27Confirm_X20removing_X20endpoint_X27_X29_X22_X3E_X26_X23128293_X3B_X3C_X2Fbutton_X3E_X3C_X2Ftd_X3E_X3C_X2Ftr_X3E), - /* K26 */ be_nested_str_weak(_X3C_X2Ftable_X3E), - /* K27 */ be_nested_str_weak(_X3Cp_X3E_X26lt_X3Bnone_X26gt_X3B_X3C_X2Fp_X3E), - /* K28 */ be_nested_str_weak(_X3Cp_X3E_X3C_X2Fp_X3E), - /* K29 */ be_nested_str_weak(url), - /* K30 */ be_nested_str_weak(push), - /* K31 */ be_nested_str_weak(stop_iteration), - /* K32 */ be_nested_str_weak(sort_distinct), - /* K33 */ be_nested_str_weak(tasmota), - /* K34 */ be_nested_str_weak(log), - /* K35 */ be_nested_str_weak(MTR_X3A_X20remotes_X3A_X20), - /* K36 */ be_const_int(3), - /* K37 */ be_nested_str_weak(_X26_X23x1F517_X3B_X20_X3Ca_X20target_X3D_X27_blank_X27_X20href_X3D_X22http_X3A_X2F_X2F_X25s_X2F_X22_X3E_X25s_X3C_X2Fa_X3E), - /* K38 */ be_nested_str_weak(_X3Ctable_X20style_X3D_X27width_X3A100_X25_X27_X3E), - /* K39 */ be_nested_str_weak(_X3Ctr_X3E_X3Ctd_X20width_X3D_X2725_X27_X3E_X3C_X2Ftd_X3E_X3Ctd_X20width_X3D_X27115_X27_X3E_X3C_X2Ftd_X3E_X3Ctd_X3E_X3C_X2Ftd_X3E_X3Ctd_X20width_X3D_X2715_X27_X3E_X3C_X2Ftd_X3E_X3C_X2Ftr_X3E), - /* K40 */ be_nested_str_weak(_X3Ctr_X3E_X3Ctd_X20width_X3D_X2722_X27_X3E_X3Cfont_X20size_X3D_X27_X2D1_X27_X3E_X3Cb_X3E_X25i_X3C_X2Fb_X3E_X3C_X2Ffont_X3E_X3C_X2Ftd_X3E), - /* K41 */ be_nested_str_weak(_X3Ctd_X20width_X3D_X27115_X27_X3E_X3Cfont_X20size_X3D_X27_X2D1_X27_X3E_X3Cb_X3E_X25s_X3C_X2Fb_X3E_X3C_X2Fselect_X3E_X3C_X2Ffont_X3E_X3C_X2Ftd_X3E), - /* K42 */ be_nested_str_weak(_X3Ctd_X20width_X3D_X2715_X27_X20style_X3D_X27text_X2Dalign_X3Acenter_X3B_X27_X3E_X3Cbutton_X20name_X3D_X27del_X25i_X27_X20style_X3D_X27background_X3Anone_X3Bborder_X3Anone_X3Bline_X2Dheight_X3A1_X3B_X27_X20onclick_X3D_X22return_X20confirm_X28_X27Confirm_X20removing_X20endpoint_X27_X29_X22_X3E_X26_X23128293_X3B_X3C_X2Fbutton_X3E_X3C_X2Ftd_X3E_X3C_X2Ftr_X3E), - /* K43 */ be_nested_str_weak(_X3C_X2Ftable_X3E_X3Cp_X3E_X3C_X2Fp_X3E), - /* K44 */ be_nested_str_weak(_X3Cbutton_X20name_X3D_X27config_X27_X20class_X3D_X27button_X20bgrn_X27_X3EChange_X20configuration_X3C_X2Fbutton_X3E_X3C_X2Fform_X3E_X3Cp_X3E_X3C_X2Fp_X3E_X3C_X2Ffieldset_X3E), - /* K45 */ be_nested_str_weak(_X3Cp_X3E_X3C_X2Fp_X3E_X3Cfieldset_X3E_X3Clegend_X3E_X3Cb_X3E_X26nbsp_X3BAdd_X20to_X20Configuration_X26nbsp_X3B_X3C_X2Fb_X3E_X3C_X2Flegend_X3E_X3Cp_X3E_X3C_X2Fp_X3E), - /* K46 */ be_nested_str_weak(_X3Cp_X3E_X3Cb_X3EAdd_X20local_X20sensor_X20or_X20device_X3C_X2Fb_X3E_X3C_X2Fp_X3E_X3Cform_X20action_X3D_X27_X2Fmatterc_X27_X20method_X3D_X27post_X27_X3E_X3Ctable_X20style_X3D_X27width_X3A100_X25_X27_X3E_X3Ctr_X3E_X3Ctd_X20width_X3D_X27145_X27_X3EType_X3C_X2Ftd_X3E_X3Ctd_X3EParameter_X3C_X2Ftd_X3E_X3C_X2Ftr_X3E), - /* K47 */ be_nested_str_weak(_X3Ctr_X3E_X3Ctd_X3E_X3Cfont_X20size_X3D_X27_X2D1_X27_X3E_X3Cselect_X20name_X3D_X27pi_X27_X3E), - /* K48 */ be_nested_str_weak(plugin_option), - /* K49 */ be_nested_str_weak(_CLASSES_TYPES), - /* K50 */ be_nested_str_weak(_X3C_X2Fselect_X3E_X3C_X2Ffont_X3E_X3C_X2Ftd_X3E), - /* K51 */ be_nested_str_weak(_X3Ctd_X3E_X3Cfont_X20size_X3D_X27_X2D1_X27_X3E_X3Cinput_X20type_X3D_X27text_X27_X20name_X3D_X27arg_X27_X20minlength_X3D_X270_X27_X20size_X3D_X278_X27_X20value_X3D_X27_X27_X3E_X3C_X2Ffont_X3E_X3C_X2Ftd_X3E_X3C_X2Ftr_X3E_X3C_X2Ftable_X3E), - /* K52 */ be_nested_str_weak(_X3Cdiv_X20style_X3D_X27display_X3A_X20block_X3B_X27_X3E_X3C_X2Fdiv_X3E), - /* K53 */ be_nested_str_weak(_X3Cbutton_X20name_X3D_X27addep_X27_X20class_X3D_X27button_X20bgrn_X27_X3ECreate_X20new_X20endpoint_X3C_X2Fbutton_X3E_X3C_X2Fform_X3E), - /* K54 */ be_nested_str_weak(_X3Chr_X3E_X3Cp_X3E_X3Cb_X3EAdd_X20Remote_X20Tasmota_X3C_X2Fb_X3E_X3C_X2Fp_X3E_X3Cform_X20action_X3D_X27_X2Fmatteradd_X27_X20method_X3D_X27get_X27_X3E_X3Ctable_X20style_X3D_X27width_X3A100_X25_X27_X3E), - /* K55 */ be_nested_str_weak(_X3Ctr_X3E_X3Ctd_X20width_X3D_X2730_X27_X3E_X3Cfont_X20size_X3D_X27_X2D1_X27_X3E_X3Cb_X3Ehttp_X3A_X2F_X2F_X3C_X2Fb_X3E_X3C_X2Ffont_X3E_X3C_X2Ftd_X3E_X3Ctd_X3E_X3Cinput_X20type_X3D_X27text_X27_X20name_X3D_X27url_X27_X20minlength_X3D_X270_X27_X20size_X3D_X278_X27_X20value_X3D_X27_X27_X20required_X20placeholder_X3D_X27IP_X20or_X20domain_X27_X3E_X3C_X2Ftd_X3E_X3Ctd_X20width_X3D_X2710_X27_X3E_X3Cfont_X20size_X3D_X27_X2D1_X27_X3E_X3Cb_X3E_X2F_X3C_X2Fb_X3E_X3C_X2Ffont_X3E_X3C_X2Ftd_X3E_X3C_X2Ftr_X3E_X3C_X2Ftr_X3E_X3C_X2Ftable_X3E), - /* K56 */ be_nested_str_weak(_X3Cbutton_X20class_X3D_X27button_X20bgrn_X27_X3EAuto_X2Dconfigure_X20remote_X20Tasmota_X3C_X2Fbutton_X3E_X3C_X2Fform_X3E_X3Chr_X3E), - /* K57 */ be_nested_str_weak(_X3Cform_X20action_X3D_X27_X2Fmatterc_X27_X20method_X3D_X27post_X27onsubmit_X3D_X27return_X20confirm_X28_X22This_X20will_X20RESET_X20the_X20configuration_X20to_X20the_X20default_X2E_X20You_X20will_X20need_X20to_X20associate_X20again_X2E_X22_X29_X3B_X27_X3E_X3Cbutton_X20name_X3D_X27auto_X27_X20class_X3D_X27button_X20bred_X27_X3EReset_X20all_X20and_X20Auto_X2Ddiscover_X3C_X2Fbutton_X3E_X3Cp_X3E_X3C_X2Fp_X3E_X3C_X2Fform_X3E), - /* K58 */ be_nested_str_weak(_X3Cp_X3E_X3C_X2Fp_X3E_X3C_X2Ffieldset_X3E), + /* K2 */ be_nested_str_weak(json), + /* K3 */ be_nested_str_weak(split), + /* K4 */ be_nested_str_weak(_X7C), + /* K5 */ be_nested_str_weak(stop_iteration), + /* K6 */ be_nested_str_weak(), + /* K7 */ be_nested_str_weak(device), + /* K8 */ be_nested_str_weak(plugins_classes), + /* K9 */ be_nested_str_weak(find), + /* K10 */ be_nested_str_weak(ARG_HINT), + /* K11 */ be_nested_str_weak(push), + /* K12 */ be_nested_str_weak(content_send), + /* K13 */ be_nested_str_weak(format), + /* K14 */ be_nested_str_weak(_X3Cscript_X20type_X3D_X27text_X2Fjavascript_X27_X3Evar_X20hm_X3D_X25s_X3Bvar_X20hl_X3D_X25s_X3B_X3C_X2Fscript_X3E), + /* K15 */ be_nested_str_weak(dump), + /* K16 */ be_nested_str_weak(matter), + /* K17 */ be_nested_str_weak(_ADD_ENDPOINT_JS), }), - be_str_weak(show_plugins_configuration), + be_str_weak(show_plugins_hints_js), &be_const_str_solidified, - ( &(const binstruction[311]) { /* code */ - 0xA4060000, // 0000 IMPORT R1 K0 - 0xA40A0200, // 0001 IMPORT R2 K1 - 0xA40E0400, // 0002 IMPORT R3 K2 - 0x8C100303, // 0003 GETMET R4 R1 K3 - 0x58180004, // 0004 LDCONST R6 K4 - 0x7C100400, // 0005 CALL R4 2 - 0x8C100303, // 0006 GETMET R4 R1 K3 - 0x58180005, // 0007 LDCONST R6 K5 - 0x7C100400, // 0008 CALL R4 2 - 0x88100106, // 0009 GETMBR R4 R0 K6 - 0x88100907, // 000A GETMBR R4 R4 K7 - 0x8C100908, // 000B GETMET R4 R4 K8 - 0x58180009, // 000C LDCONST R6 K9 - 0x7C100400, // 000D CALL R4 2 - 0x88100106, // 000E GETMBR R4 R0 K6 - 0x8C10090A, // 000F GETMET R4 R4 K10 - 0x88180106, // 0010 GETMBR R6 R0 K6 - 0x88180D07, // 0011 GETMBR R6 R6 K7 - 0x7C100400, // 0012 CALL R4 2 - 0x5814000B, // 0013 LDCONST R5 K11 - 0x50180000, // 0014 LDBOOL R6 0 0 - 0x601C000C, // 0015 GETGBL R7 G12 - 0x5C200800, // 0016 MOVE R8 R4 - 0x7C1C0200, // 0017 CALL R7 1 - 0x141C0A07, // 0018 LT R7 R5 R7 - 0x781E0047, // 0019 JMPF R7 #0062 - 0x941C0805, // 001A GETIDX R7 R4 R5 - 0x88200106, // 001B GETMBR R8 R0 K6 - 0x88201107, // 001C GETMBR R8 R8 K7 - 0x8C20110C, // 001D GETMET R8 R8 K12 - 0x60280008, // 001E GETGBL R10 G8 - 0x5C2C0E00, // 001F MOVE R11 R7 - 0x7C280200, // 0020 CALL R10 1 - 0x7C200400, // 0021 CALL R8 2 - 0x8C24110C, // 0022 GETMET R9 R8 K12 - 0x582C000D, // 0023 LDCONST R11 K13 - 0x7C240400, // 0024 CALL R9 2 - 0x5C281200, // 0025 MOVE R10 R9 - 0x742A0001, // 0026 JMPT R10 #0029 - 0x00140B0E, // 0027 ADD R5 R5 K14 - 0x7001FFEB, // 0028 JMP #0015 - 0x8C28050C, // 0029 GETMET R10 R2 K12 - 0x5C301200, // 002A MOVE R12 R9 - 0x5834000F, // 002B LDCONST R13 K15 - 0x7C280600, // 002C CALL R10 3 - 0x1C28150B, // 002D EQ R10 R10 K11 - 0x782A0001, // 002E JMPF R10 #0031 - 0x00140B0E, // 002F ADD R5 R5 K14 - 0x7001FFE3, // 0030 JMP #0015 - 0x88280106, // 0031 GETMBR R10 R0 K6 - 0x88281510, // 0032 GETMBR R10 R10 K16 - 0x8C28150C, // 0033 GETMET R10 R10 K12 - 0x5C301200, // 0034 MOVE R12 R9 - 0x7C280400, // 0035 CALL R10 2 - 0x582C0011, // 0036 LDCONST R11 K17 - 0x4C300000, // 0037 LDNIL R12 - 0x2030140C, // 0038 NE R12 R10 R12 - 0x78320004, // 0039 JMPF R12 #003F - 0x8C301512, // 003A GETMET R12 R10 K18 - 0x5C381400, // 003B MOVE R14 R10 - 0x5C3C1000, // 003C MOVE R15 R8 - 0x7C300600, // 003D CALL R12 3 - 0x5C2C1800, // 003E MOVE R11 R12 - 0x50180200, // 003F LDBOOL R6 1 0 - 0x8C300303, // 0040 GETMET R12 R1 K3 - 0x8C380513, // 0041 GETMET R14 R2 K19 - 0x58400014, // 0042 LDCONST R16 K20 - 0x5C440E00, // 0043 MOVE R17 R7 - 0x7C380600, // 0044 CALL R14 3 - 0x7C300400, // 0045 CALL R12 2 - 0x8C300303, // 0046 GETMET R12 R1 K3 - 0x8C380513, // 0047 GETMET R14 R2 K19 - 0x58400015, // 0048 LDCONST R16 K21 - 0x8C440116, // 0049 GETMET R17 R0 K22 - 0x8C4C110C, // 004A GETMET R19 R8 K12 - 0x5854000D, // 004B LDCONST R21 K13 - 0x58580011, // 004C LDCONST R22 K17 - 0x7C4C0600, // 004D CALL R19 3 - 0x7C440400, // 004E CALL R17 2 - 0x7C380600, // 004F CALL R14 3 - 0x7C300400, // 0050 CALL R12 2 - 0x8C300303, // 0051 GETMET R12 R1 K3 - 0x8C380513, // 0052 GETMET R14 R2 K19 - 0x58400017, // 0053 LDCONST R16 K23 - 0x5C440E00, // 0054 MOVE R17 R7 - 0x8C480318, // 0055 GETMET R18 R1 K24 - 0x5C501600, // 0056 MOVE R20 R11 - 0x7C480400, // 0057 CALL R18 2 - 0x7C380800, // 0058 CALL R14 4 - 0x7C300400, // 0059 CALL R12 2 - 0x8C300303, // 005A GETMET R12 R1 K3 - 0x8C380513, // 005B GETMET R14 R2 K19 - 0x58400019, // 005C LDCONST R16 K25 - 0x5C440E00, // 005D MOVE R17 R7 - 0x7C380600, // 005E CALL R14 3 - 0x7C300400, // 005F CALL R12 2 - 0x00140B0E, // 0060 ADD R5 R5 K14 - 0x7001FFB2, // 0061 JMP #0015 - 0x8C1C0303, // 0062 GETMET R7 R1 K3 - 0x5824001A, // 0063 LDCONST R9 K26 - 0x7C1C0400, // 0064 CALL R7 2 - 0x5C1C0C00, // 0065 MOVE R7 R6 - 0x741E0002, // 0066 JMPT R7 #006A - 0x8C1C0303, // 0067 GETMET R7 R1 K3 - 0x5824001B, // 0068 LDCONST R9 K27 - 0x7C1C0400, // 0069 CALL R7 2 - 0x8C1C0303, // 006A GETMET R7 R1 K3 - 0x5824001C, // 006B LDCONST R9 K28 - 0x7C1C0400, // 006C CALL R7 2 - 0x601C0012, // 006D GETGBL R7 G18 - 0x7C1C0000, // 006E CALL R7 0 - 0x60200010, // 006F GETGBL R8 G16 - 0x88240106, // 0070 GETMBR R9 R0 K6 - 0x88241307, // 0071 GETMBR R9 R9 K7 - 0x7C200200, // 0072 CALL R8 1 - 0xA802000B, // 0073 EXBLK 0 #0080 - 0x5C241000, // 0074 MOVE R9 R8 - 0x7C240000, // 0075 CALL R9 0 - 0x8C28130C, // 0076 GETMET R10 R9 K12 - 0x5830001D, // 0077 LDCONST R12 K29 - 0x7C280400, // 0078 CALL R10 2 - 0x4C2C0000, // 0079 LDNIL R11 - 0x202C140B, // 007A NE R11 R10 R11 - 0x782E0002, // 007B JMPF R11 #007F - 0x8C2C0F1E, // 007C GETMET R11 R7 K30 - 0x5C341400, // 007D MOVE R13 R10 - 0x7C2C0400, // 007E CALL R11 2 - 0x7001FFF3, // 007F JMP #0074 - 0x5820001F, // 0080 LDCONST R8 K31 - 0xAC200200, // 0081 CATCH R8 1 0 - 0xB0080000, // 0082 RAISE 2 R0 R0 - 0x88200106, // 0083 GETMBR R8 R0 K6 - 0x8C201120, // 0084 GETMET R8 R8 K32 - 0x5C280E00, // 0085 MOVE R10 R7 - 0x7C200400, // 0086 CALL R8 2 - 0xB8224200, // 0087 GETNGBL R8 K33 - 0x8C201122, // 0088 GETMET R8 R8 K34 - 0x60280008, // 0089 GETGBL R10 G8 - 0x5C2C0E00, // 008A MOVE R11 R7 - 0x7C280200, // 008B CALL R10 1 - 0x002A460A, // 008C ADD R10 K35 R10 - 0x582C0024, // 008D LDCONST R11 K36 - 0x7C200600, // 008E CALL R8 3 - 0x60200010, // 008F GETGBL R8 G16 - 0x5C240E00, // 0090 MOVE R9 R7 - 0x7C200200, // 0091 CALL R8 1 - 0xA802006C, // 0092 EXBLK 0 #0100 - 0x5C241000, // 0093 MOVE R9 R8 - 0x7C240000, // 0094 CALL R9 0 - 0x8C280303, // 0095 GETMET R10 R1 K3 - 0x8C300513, // 0096 GETMET R12 R2 K19 - 0x58380025, // 0097 LDCONST R14 K37 - 0x8C3C0318, // 0098 GETMET R15 R1 K24 - 0x5C441200, // 0099 MOVE R17 R9 - 0x7C3C0400, // 009A CALL R15 2 - 0x8C400318, // 009B GETMET R16 R1 K24 - 0x5C481200, // 009C MOVE R18 R9 - 0x7C400400, // 009D CALL R16 2 - 0x7C300800, // 009E CALL R12 4 - 0x7C280400, // 009F CALL R10 2 - 0x8C280303, // 00A0 GETMET R10 R1 K3 - 0x58300026, // 00A1 LDCONST R12 K38 - 0x7C280400, // 00A2 CALL R10 2 - 0x8C280303, // 00A3 GETMET R10 R1 K3 - 0x58300027, // 00A4 LDCONST R12 K39 - 0x7C280400, // 00A5 CALL R10 2 - 0x50180000, // 00A6 LDBOOL R6 0 0 - 0x5814000B, // 00A7 LDCONST R5 K11 - 0x6028000C, // 00A8 GETGBL R10 G12 - 0x5C2C0800, // 00A9 MOVE R11 R4 - 0x7C280200, // 00AA CALL R10 1 - 0x14280A0A, // 00AB LT R10 R5 R10 - 0x782A004E, // 00AC JMPF R10 #00FC - 0x94280805, // 00AD GETIDX R10 R4 R5 - 0x882C0106, // 00AE GETMBR R11 R0 K6 - 0x882C1707, // 00AF GETMBR R11 R11 K7 - 0x8C2C170C, // 00B0 GETMET R11 R11 K12 - 0x60340008, // 00B1 GETGBL R13 G8 - 0x5C381400, // 00B2 MOVE R14 R10 - 0x7C340200, // 00B3 CALL R13 1 - 0x7C2C0400, // 00B4 CALL R11 2 - 0x8C30170C, // 00B5 GETMET R12 R11 K12 - 0x5838000D, // 00B6 LDCONST R14 K13 - 0x7C300400, // 00B7 CALL R12 2 - 0x5C341800, // 00B8 MOVE R13 R12 - 0x74360001, // 00B9 JMPT R13 #00BC - 0x00140B0E, // 00BA ADD R5 R5 K14 - 0x7001FFEB, // 00BB JMP #00A8 - 0x8C34050C, // 00BC GETMET R13 R2 K12 - 0x5C3C1800, // 00BD MOVE R15 R12 - 0x5840000F, // 00BE LDCONST R16 K15 - 0x7C340600, // 00BF CALL R13 3 - 0x20341B0B, // 00C0 NE R13 R13 K11 - 0x78360001, // 00C1 JMPF R13 #00C4 - 0x00140B0E, // 00C2 ADD R5 R5 K14 - 0x7001FFE3, // 00C3 JMP #00A8 - 0x8C34170C, // 00C4 GETMET R13 R11 K12 - 0x583C001D, // 00C5 LDCONST R15 K29 - 0x7C340400, // 00C6 CALL R13 2 - 0x20341A09, // 00C7 NE R13 R13 R9 - 0x78360001, // 00C8 JMPF R13 #00CB - 0x00140B0E, // 00C9 ADD R5 R5 K14 - 0x7001FFDC, // 00CA JMP #00A8 - 0x88340106, // 00CB GETMBR R13 R0 K6 - 0x88341B10, // 00CC GETMBR R13 R13 K16 - 0x8C341B0C, // 00CD GETMET R13 R13 K12 - 0x5C3C1800, // 00CE MOVE R15 R12 - 0x7C340400, // 00CF CALL R13 2 - 0x58380011, // 00D0 LDCONST R14 K17 - 0x4C3C0000, // 00D1 LDNIL R15 - 0x203C1A0F, // 00D2 NE R15 R13 R15 - 0x783E0004, // 00D3 JMPF R15 #00D9 - 0x8C3C1B12, // 00D4 GETMET R15 R13 K18 - 0x5C441A00, // 00D5 MOVE R17 R13 - 0x5C481600, // 00D6 MOVE R18 R11 - 0x7C3C0600, // 00D7 CALL R15 3 - 0x5C381E00, // 00D8 MOVE R14 R15 - 0x50180200, // 00D9 LDBOOL R6 1 0 - 0x8C3C0303, // 00DA GETMET R15 R1 K3 - 0x8C440513, // 00DB GETMET R17 R2 K19 - 0x584C0028, // 00DC LDCONST R19 K40 - 0x5C501400, // 00DD MOVE R20 R10 - 0x7C440600, // 00DE CALL R17 3 - 0x7C3C0400, // 00DF CALL R15 2 - 0x8C3C0303, // 00E0 GETMET R15 R1 K3 - 0x8C440513, // 00E1 GETMET R17 R2 K19 - 0x584C0029, // 00E2 LDCONST R19 K41 - 0x8C500116, // 00E3 GETMET R20 R0 K22 - 0x8C58170C, // 00E4 GETMET R22 R11 K12 - 0x5860000D, // 00E5 LDCONST R24 K13 - 0x58640011, // 00E6 LDCONST R25 K17 - 0x7C580600, // 00E7 CALL R22 3 - 0x7C500400, // 00E8 CALL R20 2 - 0x7C440600, // 00E9 CALL R17 3 - 0x7C3C0400, // 00EA CALL R15 2 - 0x8C3C0303, // 00EB GETMET R15 R1 K3 - 0x8C440513, // 00EC GETMET R17 R2 K19 - 0x584C0017, // 00ED LDCONST R19 K23 - 0x5C501400, // 00EE MOVE R20 R10 - 0x8C540318, // 00EF GETMET R21 R1 K24 - 0x5C5C1C00, // 00F0 MOVE R23 R14 - 0x7C540400, // 00F1 CALL R21 2 - 0x7C440800, // 00F2 CALL R17 4 - 0x7C3C0400, // 00F3 CALL R15 2 - 0x8C3C0303, // 00F4 GETMET R15 R1 K3 - 0x8C440513, // 00F5 GETMET R17 R2 K19 - 0x584C002A, // 00F6 LDCONST R19 K42 - 0x5C501400, // 00F7 MOVE R20 R10 - 0x7C440600, // 00F8 CALL R17 3 - 0x7C3C0400, // 00F9 CALL R15 2 - 0x00140B0E, // 00FA ADD R5 R5 K14 - 0x7001FFAB, // 00FB JMP #00A8 - 0x8C280303, // 00FC GETMET R10 R1 K3 - 0x5830002B, // 00FD LDCONST R12 K43 - 0x7C280400, // 00FE CALL R10 2 - 0x7001FF92, // 00FF JMP #0093 - 0x5820001F, // 0100 LDCONST R8 K31 - 0xAC200200, // 0101 CATCH R8 1 0 - 0xB0080000, // 0102 RAISE 2 R0 R0 - 0x5C200C00, // 0103 MOVE R8 R6 - 0x74220002, // 0104 JMPT R8 #0108 - 0x8C200303, // 0105 GETMET R8 R1 K3 - 0x5828001B, // 0106 LDCONST R10 K27 - 0x7C200400, // 0107 CALL R8 2 - 0x8C200303, // 0108 GETMET R8 R1 K3 - 0x5828002C, // 0109 LDCONST R10 K44 - 0x7C200400, // 010A CALL R8 2 - 0x8C200303, // 010B GETMET R8 R1 K3 - 0x5828002D, // 010C LDCONST R10 K45 - 0x7C200400, // 010D CALL R8 2 - 0x8C200303, // 010E GETMET R8 R1 K3 - 0x5828002E, // 010F LDCONST R10 K46 - 0x7C200400, // 0110 CALL R8 2 - 0x8C200303, // 0111 GETMET R8 R1 K3 - 0x5828002F, // 0112 LDCONST R10 K47 - 0x7C200400, // 0113 CALL R8 2 - 0x8C200130, // 0114 GETMET R8 R0 K48 - 0x58280011, // 0115 LDCONST R10 K17 - 0x882C0131, // 0116 GETMBR R11 R0 K49 - 0x7C200600, // 0117 CALL R8 3 - 0x8C200303, // 0118 GETMET R8 R1 K3 - 0x58280032, // 0119 LDCONST R10 K50 - 0x7C200400, // 011A CALL R8 2 - 0x8C200303, // 011B GETMET R8 R1 K3 - 0x58280033, // 011C LDCONST R10 K51 - 0x7C200400, // 011D CALL R8 2 - 0x8C200303, // 011E GETMET R8 R1 K3 - 0x58280034, // 011F LDCONST R10 K52 - 0x7C200400, // 0120 CALL R8 2 - 0x8C200303, // 0121 GETMET R8 R1 K3 - 0x58280035, // 0122 LDCONST R10 K53 - 0x7C200400, // 0123 CALL R8 2 - 0x8C200303, // 0124 GETMET R8 R1 K3 - 0x58280036, // 0125 LDCONST R10 K54 - 0x7C200400, // 0126 CALL R8 2 - 0x8C200303, // 0127 GETMET R8 R1 K3 - 0x58280037, // 0128 LDCONST R10 K55 - 0x7C200400, // 0129 CALL R8 2 - 0x8C200303, // 012A GETMET R8 R1 K3 - 0x58280034, // 012B LDCONST R10 K52 - 0x7C200400, // 012C CALL R8 2 - 0x8C200303, // 012D GETMET R8 R1 K3 - 0x58280038, // 012E LDCONST R10 K56 - 0x7C200400, // 012F CALL R8 2 - 0x8C200303, // 0130 GETMET R8 R1 K3 - 0x58280039, // 0131 LDCONST R10 K57 - 0x7C200400, // 0132 CALL R8 2 - 0x8C200303, // 0133 GETMET R8 R1 K3 - 0x5828003A, // 0134 LDCONST R10 K58 - 0x7C200400, // 0135 CALL R8 2 - 0x80000000, // 0136 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: equal_map -********************************************************************/ -be_local_closure(Matter_UI_equal_map, /* name */ - be_nested_proto( - 8, /* nstack */ - 2, /* argc */ - 4, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 4]) { /* constants */ - /* K0 */ be_const_class(be_class_Matter_UI), - /* K1 */ be_nested_str_weak(keys), - /* K2 */ be_nested_str_weak(contains), - /* K3 */ be_nested_str_weak(stop_iteration), - }), - be_str_weak(equal_map), - &be_const_str_solidified, - ( &(const binstruction[53]) { /* code */ - 0x58080000, // 0000 LDCONST R2 K0 - 0x600C0010, // 0001 GETGBL R3 G16 - 0x8C100101, // 0002 GETMET R4 R0 K1 - 0x7C100200, // 0003 CALL R4 1 - 0x7C0C0200, // 0004 CALL R3 1 - 0xA8020010, // 0005 EXBLK 0 #0017 - 0x5C100600, // 0006 MOVE R4 R3 - 0x7C100000, // 0007 CALL R4 0 - 0x8C140302, // 0008 GETMET R5 R1 K2 - 0x5C1C0800, // 0009 MOVE R7 R4 - 0x7C140400, // 000A CALL R5 2 - 0x74160002, // 000B JMPT R5 #000F - 0x50140000, // 000C LDBOOL R5 0 0 - 0xA8040001, // 000D EXBLK 1 1 - 0x80040A00, // 000E RET 1 R5 - 0x94140204, // 000F GETIDX R5 R1 R4 - 0x94180004, // 0010 GETIDX R6 R0 R4 - 0x20140A06, // 0011 NE R5 R5 R6 - 0x78160002, // 0012 JMPF R5 #0016 - 0x50140000, // 0013 LDBOOL R5 0 0 - 0xA8040001, // 0014 EXBLK 1 1 - 0x80040A00, // 0015 RET 1 R5 - 0x7001FFEE, // 0016 JMP #0006 - 0x580C0003, // 0017 LDCONST R3 K3 - 0xAC0C0200, // 0018 CATCH R3 1 0 - 0xB0080000, // 0019 RAISE 2 R0 R0 - 0x600C0010, // 001A GETGBL R3 G16 - 0x8C100301, // 001B GETMET R4 R1 K1 - 0x7C100200, // 001C CALL R4 1 - 0x7C0C0200, // 001D CALL R3 1 - 0xA8020010, // 001E EXBLK 0 #0030 - 0x5C100600, // 001F MOVE R4 R3 - 0x7C100000, // 0020 CALL R4 0 - 0x8C140102, // 0021 GETMET R5 R0 K2 - 0x5C1C0800, // 0022 MOVE R7 R4 - 0x7C140400, // 0023 CALL R5 2 - 0x74160002, // 0024 JMPT R5 #0028 - 0x50140000, // 0025 LDBOOL R5 0 0 - 0xA8040001, // 0026 EXBLK 1 1 - 0x80040A00, // 0027 RET 1 R5 - 0x94140204, // 0028 GETIDX R5 R1 R4 - 0x94180004, // 0029 GETIDX R6 R0 R4 - 0x20140A06, // 002A NE R5 R5 R6 - 0x78160002, // 002B JMPF R5 #002F - 0x50140000, // 002C LDBOOL R5 0 0 - 0xA8040001, // 002D EXBLK 1 1 - 0x80040A00, // 002E RET 1 R5 - 0x7001FFEE, // 002F JMP #001F - 0x580C0003, // 0030 LDCONST R3 K3 - 0xAC0C0200, // 0031 CATCH R3 1 0 - 0xB0080000, // 0032 RAISE 2 R0 R0 - 0x500C0200, // 0033 LDBOOL R3 1 0 - 0x80040600, // 0034 RET 1 R3 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: web_sensor -********************************************************************/ -be_local_closure(Matter_UI_web_sensor, /* name */ - be_nested_proto( - 12, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[19]) { /* constants */ - /* K0 */ be_nested_str_weak(webserver), - /* K1 */ be_nested_str_weak(string), - /* K2 */ be_nested_str_weak(matter_enabled), - /* K3 */ be_nested_str_weak(device), - /* K4 */ be_nested_str_weak(sessions), - /* K5 */ be_nested_str_weak(count_active_fabrics), - /* K6 */ be_const_int(0), - /* K7 */ be_nested_str_weak(content_send), - /* K8 */ be_nested_str_weak(format), - /* K9 */ be_nested_str_weak(_X3Cdiv_X20style_X3D_X27text_X2Dalign_X3Aright_X3Bfont_X2Dsize_X3A11px_X3Bcolor_X3A_X23aaa_X3Bpadding_X3A0px_X3B_X27_X3E_X25s_X3C_X2Fdiv_X3E), - /* K10 */ be_nested_str_weak(Matter_X3A_X20No_X20active_X20association), - /* K11 */ be_const_int(1), - /* K12 */ be_nested_str_weak(Matter_X3A_X20), - /* K13 */ be_nested_str_weak(_X20active_X20association), - /* K14 */ be_nested_str_weak(s), - /* K15 */ be_nested_str_weak(), - /* K16 */ be_nested_str_weak(show_bridge_status), - /* K17 */ be_nested_str_weak(is_root_commissioning_open), - /* K18 */ be_nested_str_weak(show_commissioning_info), - }), - be_str_weak(web_sensor), - &be_const_str_solidified, - ( &(const binstruction[43]) { /* code */ - 0xA4060000, // 0000 IMPORT R1 K0 - 0xA40A0200, // 0001 IMPORT R2 K1 - 0x8C0C0102, // 0002 GETMET R3 R0 K2 - 0x7C0C0200, // 0003 CALL R3 1 - 0x780E0024, // 0004 JMPF R3 #002A - 0x880C0103, // 0005 GETMBR R3 R0 K3 - 0x880C0704, // 0006 GETMBR R3 R3 K4 - 0x8C0C0705, // 0007 GETMET R3 R3 K5 - 0x7C0C0200, // 0008 CALL R3 1 - 0x1C100706, // 0009 EQ R4 R3 K6 - 0x78120006, // 000A JMPF R4 #0012 - 0x8C100307, // 000B GETMET R4 R1 K7 - 0x8C180508, // 000C GETMET R6 R2 K8 - 0x58200009, // 000D LDCONST R8 K9 - 0x5824000A, // 000E LDCONST R9 K10 - 0x7C180600, // 000F CALL R6 3 - 0x7C100400, // 0010 CALL R4 2 - 0x7002000F, // 0011 JMP #0022 - 0x2410070B, // 0012 GT R4 R3 K11 - 0x8C140307, // 0013 GETMET R5 R1 K7 - 0x8C1C0508, // 0014 GETMET R7 R2 K8 - 0x58240009, // 0015 LDCONST R9 K9 - 0x60280008, // 0016 GETGBL R10 G8 - 0x5C2C0600, // 0017 MOVE R11 R3 - 0x7C280200, // 0018 CALL R10 1 - 0x002A180A, // 0019 ADD R10 K12 R10 - 0x0028150D, // 001A ADD R10 R10 K13 - 0x78120001, // 001B JMPF R4 #001E - 0x582C000E, // 001C LDCONST R11 K14 - 0x70020000, // 001D JMP #001F - 0x582C000F, // 001E LDCONST R11 K15 - 0x0028140B, // 001F ADD R10 R10 R11 - 0x7C1C0600, // 0020 CALL R7 3 - 0x7C140400, // 0021 CALL R5 2 - 0x8C100110, // 0022 GETMET R4 R0 K16 - 0x7C100200, // 0023 CALL R4 1 - 0x88100103, // 0024 GETMBR R4 R0 K3 - 0x8C100911, // 0025 GETMET R4 R4 K17 - 0x7C100200, // 0026 CALL R4 1 - 0x78120001, // 0027 JMPF R4 #002A - 0x8C100112, // 0028 GETMET R4 R0 K18 - 0x7C100200, // 0029 CALL R4 1 - 0x80000000, // 002A RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: show_fabric_info -********************************************************************/ -be_local_closure(Matter_UI_show_fabric_info, /* name */ - be_nested_proto( - 16, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[30]) { /* constants */ - /* K0 */ be_nested_str_weak(webserver), - /* K1 */ be_nested_str_weak(string), - /* K2 */ be_nested_str_weak(content_send), - /* K3 */ be_nested_str_weak(_X3Cfieldset_X3E_X3Clegend_X3E_X3Cb_X3E_X26nbsp_X3BFabrics_X26nbsp_X3B_X3C_X2Fb_X3E_X3C_X2Flegend_X3E_X3Cp_X3E_X3C_X2Fp_X3E_X3Cp_X3EAssociated_X20fabrics_X3A_X3C_X2Fp_X3E), - /* K4 */ be_nested_str_weak(device), - /* K5 */ be_nested_str_weak(sessions), - /* K6 */ be_const_int(0), - /* K7 */ be_nested_str_weak(_X3Cp_X3E_X3Cb_X3ENone_X3C_X2Fb_X3E_X3C_X2Fp_X3E), - /* K8 */ be_nested_str_weak(fabrics), - /* K9 */ be_nested_str_weak(persistables), - /* K10 */ be_nested_str_weak(_X3Chr_X3E), - /* K11 */ be_nested_str_weak(fabric_label), - /* K12 */ be_nested_str_weak(_X3CNo_X20label_X3E), - /* K13 */ be_nested_str_weak(html_escape), - /* K14 */ be_nested_str_weak(format), - /* K15 */ be_nested_str_weak(_X3Cfieldset_X3E_X3Clegend_X3E_X3Cb_X3E_X26nbsp_X3B_X23_X25i_X20_X25s_X3C_X2Fb_X3E_X20_X28_X25s_X29_X26nbsp_X3B_X3C_X2Flegend_X3E_X3Cp_X3E_X3C_X2Fp_X3E), - /* K16 */ be_nested_str_weak(get_fabric_index), - /* K17 */ be_nested_str_weak(get_admin_vendor_name), - /* K18 */ be_nested_str_weak(get_fabric_id), - /* K19 */ be_nested_str_weak(copy), - /* K20 */ be_nested_str_weak(reverse), - /* K21 */ be_nested_str_weak(get_device_id), - /* K22 */ be_nested_str_weak(Fabric_X3A_X20_X25s_X3Cbr_X3E), - /* K23 */ be_nested_str_weak(tohex), - /* K24 */ be_nested_str_weak(Device_X3A_X20_X25s_X3Cbr_X3E_X26nbsp_X3B), - /* K25 */ be_nested_str_weak(_X3Cform_X20action_X3D_X27_X2Fmatterc_X27_X20method_X3D_X27post_X27_X20onsubmit_X3D_X27return_X20confirm_X28_X22Are_X20you_X20sure_X3F_X22_X29_X3B_X27_X3E), - /* K26 */ be_nested_str_weak(_X3Cinput_X20name_X3D_X27del_fabric_X27_X20type_X3D_X27hidden_X27_X20value_X3D_X27_X25i_X27_X3E), - /* K27 */ be_nested_str_weak(_X3Cbutton_X20name_X3D_X27del_X27_X20class_X3D_X27button_X20bgrn_X27_X3EDelete_X20Fabric_X3C_X2Fbutton_X3E_X3C_X2Fform_X3E_X3C_X2Fp_X3E), - /* K28 */ be_nested_str_weak(_X3Cp_X3E_X3C_X2Fp_X3E_X3C_X2Ffieldset_X3E_X3Cp_X3E_X3C_X2Fp_X3E), - /* K29 */ be_nested_str_weak(stop_iteration), - }), - be_str_weak(show_fabric_info), - &be_const_str_solidified, - ( &(const binstruction[101]) { /* code */ - 0xA4060000, // 0000 IMPORT R1 K0 - 0xA40A0200, // 0001 IMPORT R2 K1 - 0x8C0C0302, // 0002 GETMET R3 R1 K2 - 0x58140003, // 0003 LDCONST R5 K3 - 0x7C0C0400, // 0004 CALL R3 2 - 0x600C000C, // 0005 GETGBL R3 G12 - 0x88100104, // 0006 GETMBR R4 R0 K4 - 0x88100905, // 0007 GETMBR R4 R4 K5 - 0x88100905, // 0008 GETMBR R4 R4 K5 - 0x7C0C0200, // 0009 CALL R3 1 - 0x1C0C0706, // 000A EQ R3 R3 K6 - 0x780E0003, // 000B JMPF R3 #0010 - 0x8C0C0302, // 000C GETMET R3 R1 K2 - 0x58140007, // 000D LDCONST R5 K7 - 0x7C0C0400, // 000E CALL R3 2 - 0x70020050, // 000F JMP #0061 - 0x500C0200, // 0010 LDBOOL R3 1 0 - 0x60100010, // 0011 GETGBL R4 G16 - 0x88140104, // 0012 GETMBR R5 R0 K4 - 0x88140B05, // 0013 GETMBR R5 R5 K5 - 0x88140B08, // 0014 GETMBR R5 R5 K8 - 0x8C140B09, // 0015 GETMET R5 R5 K9 - 0x7C140200, // 0016 CALL R5 1 - 0x7C100200, // 0017 CALL R4 1 - 0xA8020044, // 0018 EXBLK 0 #005E - 0x5C140800, // 0019 MOVE R5 R4 - 0x7C140000, // 001A CALL R5 0 - 0x5C180600, // 001B MOVE R6 R3 - 0x741A0002, // 001C JMPT R6 #0020 - 0x8C180302, // 001D GETMET R6 R1 K2 - 0x5820000A, // 001E LDCONST R8 K10 - 0x7C180400, // 001F CALL R6 2 - 0x500C0000, // 0020 LDBOOL R3 0 0 - 0x88180B0B, // 0021 GETMBR R6 R5 K11 - 0x5C1C0C00, // 0022 MOVE R7 R6 - 0x741E0000, // 0023 JMPT R7 #0025 - 0x5818000C, // 0024 LDCONST R6 K12 - 0x8C1C030D, // 0025 GETMET R7 R1 K13 - 0x5C240C00, // 0026 MOVE R9 R6 - 0x7C1C0400, // 0027 CALL R7 2 - 0x5C180E00, // 0028 MOVE R6 R7 - 0x8C1C0302, // 0029 GETMET R7 R1 K2 - 0x8C24050E, // 002A GETMET R9 R2 K14 - 0x582C000F, // 002B LDCONST R11 K15 - 0x8C300B10, // 002C GETMET R12 R5 K16 - 0x7C300200, // 002D CALL R12 1 - 0x5C340C00, // 002E MOVE R13 R6 - 0x8C380B11, // 002F GETMET R14 R5 K17 - 0x7C380200, // 0030 CALL R14 1 - 0x7C240A00, // 0031 CALL R9 5 - 0x7C1C0400, // 0032 CALL R7 2 - 0x8C1C0B12, // 0033 GETMET R7 R5 K18 - 0x7C1C0200, // 0034 CALL R7 1 - 0x8C1C0F13, // 0035 GETMET R7 R7 K19 - 0x7C1C0200, // 0036 CALL R7 1 - 0x8C1C0F14, // 0037 GETMET R7 R7 K20 - 0x7C1C0200, // 0038 CALL R7 1 - 0x8C200B15, // 0039 GETMET R8 R5 K21 - 0x7C200200, // 003A CALL R8 1 - 0x8C201113, // 003B GETMET R8 R8 K19 - 0x7C200200, // 003C CALL R8 1 - 0x8C201114, // 003D GETMET R8 R8 K20 - 0x7C200200, // 003E CALL R8 1 - 0x8C240302, // 003F GETMET R9 R1 K2 - 0x8C2C050E, // 0040 GETMET R11 R2 K14 - 0x58340016, // 0041 LDCONST R13 K22 - 0x8C380F17, // 0042 GETMET R14 R7 K23 - 0x7C380200, // 0043 CALL R14 1 - 0x7C2C0600, // 0044 CALL R11 3 - 0x7C240400, // 0045 CALL R9 2 - 0x8C240302, // 0046 GETMET R9 R1 K2 - 0x8C2C050E, // 0047 GETMET R11 R2 K14 - 0x58340018, // 0048 LDCONST R13 K24 - 0x8C381117, // 0049 GETMET R14 R8 K23 - 0x7C380200, // 004A CALL R14 1 - 0x7C2C0600, // 004B CALL R11 3 - 0x7C240400, // 004C CALL R9 2 - 0x8C240302, // 004D GETMET R9 R1 K2 - 0x582C0019, // 004E LDCONST R11 K25 - 0x7C240400, // 004F CALL R9 2 - 0x8C240302, // 0050 GETMET R9 R1 K2 - 0x8C2C050E, // 0051 GETMET R11 R2 K14 - 0x5834001A, // 0052 LDCONST R13 K26 - 0x8C380B10, // 0053 GETMET R14 R5 K16 - 0x7C380200, // 0054 CALL R14 1 - 0x7C2C0600, // 0055 CALL R11 3 - 0x7C240400, // 0056 CALL R9 2 - 0x8C240302, // 0057 GETMET R9 R1 K2 - 0x582C001B, // 0058 LDCONST R11 K27 - 0x7C240400, // 0059 CALL R9 2 - 0x8C240302, // 005A GETMET R9 R1 K2 - 0x582C001C, // 005B LDCONST R11 K28 - 0x7C240400, // 005C CALL R9 2 - 0x7001FFBA, // 005D JMP #0019 - 0x5810001D, // 005E LDCONST R4 K29 - 0xAC100200, // 005F CATCH R4 1 0 - 0xB0080000, // 0060 RAISE 2 R0 R0 - 0x8C0C0302, // 0061 GETMET R3 R1 K2 - 0x5814001C, // 0062 LDCONST R5 K28 - 0x7C0C0400, // 0063 CALL R3 2 - 0x80000000, // 0064 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: page_part_mgr -********************************************************************/ -be_local_closure(Matter_UI_page_part_mgr, /* name */ - be_nested_proto( - 6, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[15]) { /* constants */ - /* K0 */ be_nested_str_weak(webserver), - /* K1 */ be_nested_str_weak(string), - /* K2 */ be_nested_str_weak(check_privileged_access), - /* K3 */ be_nested_str_weak(content_start), - /* K4 */ be_nested_str_weak(Matter), - /* K5 */ be_nested_str_weak(content_send_style), - /* K6 */ be_nested_str_weak(show_enable), - /* K7 */ be_nested_str_weak(matter_enabled), - /* K8 */ be_nested_str_weak(show_plugins_configuration), - /* K9 */ be_nested_str_weak(content_send), - /* K10 */ be_nested_str_weak(_X3Cdiv_X20style_X3D_X27display_X3A_X20block_X3B_X27_X3E_X3C_X2Fdiv_X3E), - /* K11 */ be_nested_str_weak(_X3Cp_X3E_X3C_X2Fp_X3E_X3Cform_X20id_X3D_X27butmat_X27_X20style_X3D_X27display_X3A_X20block_X3B_X27_X20action_X3D_X27mattera_X27_X20method_X3D_X27get_X27_X3E_X3Cbutton_X20name_X3D_X27_X27_X3EAdvanced_X20Configuration_X3C_X2Fbutton_X3E_X3C_X2Fform_X3E), - /* K12 */ be_nested_str_weak(content_button), - /* K13 */ be_nested_str_weak(BUTTON_CONFIGURATION), - /* K14 */ be_nested_str_weak(content_stop), - }), - be_str_weak(page_part_mgr), - &be_const_str_solidified, - ( &(const binstruction[31]) { /* code */ - 0xA4060000, // 0000 IMPORT R1 K0 - 0xA40A0200, // 0001 IMPORT R2 K1 - 0x8C0C0302, // 0002 GETMET R3 R1 K2 - 0x7C0C0200, // 0003 CALL R3 1 - 0x740E0001, // 0004 JMPT R3 #0007 - 0x4C0C0000, // 0005 LDNIL R3 - 0x80040600, // 0006 RET 1 R3 - 0x8C0C0303, // 0007 GETMET R3 R1 K3 - 0x58140004, // 0008 LDCONST R5 K4 - 0x7C0C0400, // 0009 CALL R3 2 - 0x8C0C0305, // 000A GETMET R3 R1 K5 - 0x7C0C0200, // 000B CALL R3 1 - 0x8C0C0106, // 000C GETMET R3 R0 K6 - 0x7C0C0200, // 000D CALL R3 1 - 0x8C0C0107, // 000E GETMET R3 R0 K7 - 0x7C0C0200, // 000F CALL R3 1 - 0x780E0001, // 0010 JMPF R3 #0013 - 0x8C0C0108, // 0011 GETMET R3 R0 K8 - 0x7C0C0200, // 0012 CALL R3 1 - 0x8C0C0309, // 0013 GETMET R3 R1 K9 - 0x5814000A, // 0014 LDCONST R5 K10 - 0x7C0C0400, // 0015 CALL R3 2 - 0x8C0C0309, // 0016 GETMET R3 R1 K9 - 0x5814000B, // 0017 LDCONST R5 K11 - 0x7C0C0400, // 0018 CALL R3 2 - 0x8C0C030C, // 0019 GETMET R3 R1 K12 - 0x8814030D, // 001A GETMBR R5 R1 K13 - 0x7C0C0400, // 001B CALL R3 2 - 0x8C0C030E, // 001C GETMET R3 R1 K14 - 0x7C0C0200, // 001D CALL R3 1 - 0x80000000, // 001E RET 0 + ( &(const binstruction[79]) { /* code */ + 0xA40A0000, // 0000 IMPORT R2 K0 + 0xA40E0200, // 0001 IMPORT R3 K1 + 0xA4120400, // 0002 IMPORT R4 K2 + 0x60140012, // 0003 GETGBL R5 G18 + 0x7C140000, // 0004 CALL R5 0 + 0x60180010, // 0005 GETGBL R6 G16 + 0x5C1C0200, // 0006 MOVE R7 R1 + 0x7C180200, // 0007 CALL R6 1 + 0xA8020007, // 0008 EXBLK 0 #0011 + 0x5C1C0C00, // 0009 MOVE R7 R6 + 0x7C1C0000, // 000A CALL R7 0 + 0x8C200703, // 000B GETMET R8 R3 K3 + 0x5C280E00, // 000C MOVE R10 R7 + 0x582C0004, // 000D LDCONST R11 K4 + 0x7C200600, // 000E CALL R8 3 + 0x00140A08, // 000F ADD R5 R5 R8 + 0x7001FFF7, // 0010 JMP #0009 + 0x58180005, // 0011 LDCONST R6 K5 + 0xAC180200, // 0012 CATCH R6 1 0 + 0xB0080000, // 0013 RAISE 2 R0 R0 + 0x60180013, // 0014 GETGBL R6 G19 + 0x7C180000, // 0015 CALL R6 0 + 0x601C0012, // 0016 GETGBL R7 G18 + 0x7C1C0000, // 0017 CALL R7 0 + 0x60200010, // 0018 GETGBL R8 G16 + 0x5C240A00, // 0019 MOVE R9 R5 + 0x7C200200, // 001A CALL R8 1 + 0xA802001F, // 001B EXBLK 0 #003C + 0x5C241000, // 001C MOVE R9 R8 + 0x7C240000, // 001D CALL R9 0 + 0x1C281306, // 001E EQ R10 R9 K6 + 0x782A0000, // 001F JMPF R10 #0021 + 0x7001FFFA, // 0020 JMP #001C + 0x88280107, // 0021 GETMBR R10 R0 K7 + 0x88281508, // 0022 GETMBR R10 R10 K8 + 0x8C281509, // 0023 GETMET R10 R10 K9 + 0x5C301200, // 0024 MOVE R12 R9 + 0x7C280400, // 0025 CALL R10 2 + 0x4C2C0000, // 0026 LDNIL R11 + 0x202C140B, // 0027 NE R11 R10 R11 + 0x782E0011, // 0028 JMPF R11 #003B + 0x882C150A, // 0029 GETMBR R11 R10 K10 + 0x4C300000, // 002A LDNIL R12 + 0x2030160C, // 002B NE R12 R11 R12 + 0x7832000D, // 002C JMPF R12 #003B + 0x8C300F09, // 002D GETMET R12 R7 K9 + 0x5C381600, // 002E MOVE R14 R11 + 0x7C300400, // 002F CALL R12 2 + 0x4C340000, // 0030 LDNIL R13 + 0x1C34180D, // 0031 EQ R13 R12 R13 + 0x78360006, // 0032 JMPF R13 #003A + 0x6034000C, // 0033 GETGBL R13 G12 + 0x5C380E00, // 0034 MOVE R14 R7 + 0x7C340200, // 0035 CALL R13 1 + 0x5C301A00, // 0036 MOVE R12 R13 + 0x8C340F0B, // 0037 GETMET R13 R7 K11 + 0x5C3C1600, // 0038 MOVE R15 R11 + 0x7C340400, // 0039 CALL R13 2 + 0x9818120C, // 003A SETIDX R6 R9 R12 + 0x7001FFDF, // 003B JMP #001C + 0x58200005, // 003C LDCONST R8 K5 + 0xAC200200, // 003D CATCH R8 1 0 + 0xB0080000, // 003E RAISE 2 R0 R0 + 0x8C20050C, // 003F GETMET R8 R2 K12 + 0x8C28070D, // 0040 GETMET R10 R3 K13 + 0x5830000E, // 0041 LDCONST R12 K14 + 0x8C34090F, // 0042 GETMET R13 R4 K15 + 0x5C3C0C00, // 0043 MOVE R15 R6 + 0x7C340400, // 0044 CALL R13 2 + 0x8C38090F, // 0045 GETMET R14 R4 K15 + 0x5C400E00, // 0046 MOVE R16 R7 + 0x7C380400, // 0047 CALL R14 2 + 0x7C280800, // 0048 CALL R10 4 + 0x7C200400, // 0049 CALL R8 2 + 0x8C20050C, // 004A GETMET R8 R2 K12 + 0xB82A2000, // 004B GETNGBL R10 K16 + 0x88281511, // 004C GETMBR R10 R10 K17 + 0x7C200400, // 004D CALL R8 2 + 0x80000000, // 004E RET 0 }) ) ); @@ -3104,33 +3204,34 @@ be_local_closure(Matter_UI_page_part_mgr, /* name */ be_local_class(Matter_UI, 1, NULL, - be_nested_map(25, + be_nested_map(26, ( (struct bmapnode*) &(const bmapnode[]) { - { be_const_key_weak(web_add_config_button, -1), be_const_closure(Matter_UI_web_add_config_button_closure) }, - { be_const_key_weak(page_part_mgr, -1), be_const_closure(Matter_UI_page_part_mgr_closure) }, - { be_const_key_weak(page_part_mgr_adv, -1), be_const_closure(Matter_UI_page_part_mgr_adv_closure) }, - { be_const_key_weak(show_bridge_status, -1), be_const_closure(Matter_UI_show_bridge_status_closure) }, - { be_const_key_weak(plugin_option, -1), be_const_closure(Matter_UI_plugin_option_closure) }, - { be_const_key_weak(init, 8), be_const_closure(Matter_UI_init_closure) }, - { be_const_key_weak(page_part_ctl, 7), be_const_closure(Matter_UI_page_part_ctl_closure) }, - { be_const_key_weak(show_fabric_info, 9), be_const_closure(Matter_UI_show_fabric_info_closure) }, - { be_const_key_weak(web_get_arg, -1), be_const_closure(Matter_UI_web_get_arg_closure) }, { be_const_key_weak(equal_map, -1), be_const_static_closure(Matter_UI_equal_map_closure) }, - { be_const_key_weak(page_part_mgr_add, -1), be_const_closure(Matter_UI_page_part_mgr_add_closure) }, - { be_const_key_weak(device, -1), be_const_var(0) }, - { be_const_key_weak(web_add_handler, 21), be_const_closure(Matter_UI_web_add_handler_closure) }, - { be_const_key_weak(matter_enabled, -1), be_const_closure(Matter_UI_matter_enabled_closure) }, + { be_const_key_weak(page_part_mgr_adv, -1), be_const_closure(Matter_UI_page_part_mgr_adv_closure) }, + { be_const_key_weak(_CLASSES_TYPES2, -1), be_nested_str_weak(_X7Chttp_relay_X7Chttp_light0_X7Chttp_light1_X7Chttp_light2_X7Chttp_light3_X7Chttp_temperature_X7Chttp_pressure_X7Chttp_illuminance_X7Chttp_humidity_X7Chttp_occupancy) }, + { be_const_key_weak(page_part_mgr, 25), be_const_closure(Matter_UI_page_part_mgr_closure) }, + { be_const_key_weak(show_plugins_hints_js, -1), be_const_closure(Matter_UI_show_plugins_hints_js_closure) }, { be_const_key_weak(show_enable, -1), be_const_closure(Matter_UI_show_enable_closure) }, + { be_const_key_weak(matter_enabled, 24), be_const_closure(Matter_UI_matter_enabled_closure) }, + { be_const_key_weak(generate_config_from_status, -1), be_const_closure(Matter_UI_generate_config_from_status_closure) }, + { be_const_key_weak(show_qrcode, 21), be_const_closure(Matter_UI_show_qrcode_closure) }, + { be_const_key_weak(page_part_mgr_add, -1), be_const_closure(Matter_UI_page_part_mgr_add_closure) }, + { be_const_key_weak(show_plugins_configuration, -1), be_const_closure(Matter_UI_show_plugins_configuration_closure) }, { be_const_key_weak(show_commissioning_info, -1), be_const_closure(Matter_UI_show_commissioning_info_closure) }, - { be_const_key_weak(_CLASSES_TYPES2, 18), be_nested_str_weak(_X7Chttp_relay_X7Chttp_light0_X7Chttp_light1_X7Chttp_light2_X7Chttp_light3_X7Chttp_temperature_X7Chttp_pressure_X7Chttp_illuminance_X7Chttp_humidity_X7Chttp_occupancy) }, - { be_const_key_weak(show_remote_autoconf, 13), be_const_closure(Matter_UI_show_remote_autoconf_closure) }, - { be_const_key_weak(show_plugins_configuration, 23), be_const_closure(Matter_UI_show_plugins_configuration_closure) }, - { be_const_key_weak(show_passcode_form, 16), be_const_closure(Matter_UI_show_passcode_form_closure) }, - { be_const_key_weak(_CLASSES_TYPES, -1), be_nested_str_weak(_X7Crelay_X7Clight0_X7Clight1_X7Clight2_X7Clight3_X7Cshutter_X7Cshutter_X2Btilt_X7Ctemperature_X7Cpressure_X7Cilluminance_X7Chumidity_X7Coccupancy_X7Conoff) }, - { be_const_key_weak(plugin_name, -1), be_const_closure(Matter_UI_plugin_name_closure) }, + { be_const_key_weak(page_part_ctl, 18), be_const_closure(Matter_UI_page_part_ctl_closure) }, + { be_const_key_weak(show_fabric_info, -1), be_const_closure(Matter_UI_show_fabric_info_closure) }, + { be_const_key_weak(_CLASSES_TYPES, 4), be_nested_str_weak(_X7Crelay_X7Clight0_X7Clight1_X7Clight2_X7Clight3_X7Cshutter_X7Cshutter_X2Btilt_X7Ctemperature_X7Cpressure_X7Cilluminance_X7Chumidity_X7Coccupancy_X7Conoff) }, + { be_const_key_weak(web_get_arg, -1), be_const_closure(Matter_UI_web_get_arg_closure) }, + { be_const_key_weak(plugin_option, 5), be_const_closure(Matter_UI_plugin_option_closure) }, + { be_const_key_weak(web_add_config_button, -1), be_const_closure(Matter_UI_web_add_config_button_closure) }, + { be_const_key_weak(show_passcode_form, -1), be_const_closure(Matter_UI_show_passcode_form_closure) }, + { be_const_key_weak(show_remote_autoconf, 8), be_const_closure(Matter_UI_show_remote_autoconf_closure) }, + { be_const_key_weak(web_add_handler, -1), be_const_closure(Matter_UI_web_add_handler_closure) }, + { be_const_key_weak(show_bridge_status, 23), be_const_closure(Matter_UI_show_bridge_status_closure) }, + { be_const_key_weak(plugin_name, 12), be_const_closure(Matter_UI_plugin_name_closure) }, + { be_const_key_weak(init, -1), be_const_closure(Matter_UI_init_closure) }, { be_const_key_weak(web_sensor, -1), be_const_closure(Matter_UI_web_sensor_closure) }, - { be_const_key_weak(show_qrcode, -1), be_const_closure(Matter_UI_show_qrcode_closure) }, - { be_const_key_weak(generate_config_from_status, 1), be_const_closure(Matter_UI_generate_config_from_status_closure) }, + { be_const_key_weak(device, -1), be_const_var(0) }, })), be_str_weak(Matter_UI) ); diff --git a/tasmota/tasmota_support/support_wifi.ino b/tasmota/tasmota_support/support_wifi.ino index cb701a304..c5189c344 100644 --- a/tasmota/tasmota_support/support_wifi.ino +++ b/tasmota/tasmota_support/support_wifi.ino @@ -1265,7 +1265,7 @@ bool WifiHostByName(const char* aHostname, IPAddress& aResult) { if (success) { // Host name resolved if (0xFFFFFFFF != (uint32_t)aResult) { - AddLog(LOG_LEVEL_DEBUG, PSTR(D_LOG_WIFI "DNS resolved '%s' (%s) in %i ms"), aHostname, aResult.toString().c_str(), dns_end - dns_start); + AddLog(LOG_LEVEL_DEBUG_MORE, PSTR(D_LOG_WIFI "DNS resolved '%s' (%s) in %i ms"), aHostname, aResult.toString().c_str(), dns_end - dns_start); return true; } } From 558819c7488e4d67c2f2ecb05ab46601024af070 Mon Sep 17 00:00:00 2001 From: s-hadinger <49731213+s-hadinger@users.noreply.github.com> Date: Tue, 13 Jun 2023 23:09:29 +0200 Subject: [PATCH 254/289] Add mention to OpenBK in UI (#18874) --- lib/libesp32/berry_matter/src/embedded/Matter_UI.be | 2 +- lib/libesp32/berry_matter/src/solidify/solidified_Matter_UI.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_UI.be b/lib/libesp32/berry_matter/src/embedded/Matter_UI.be index 0053b7dd8..0f2833c6d 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_UI.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_UI.be @@ -429,7 +429,7 @@ class Matter_UI ">Create new endpoint") # Add remote endpoint - webserver.content_send("

    Add Remote Tasmota

    " + webserver.content_send("

    Add Remote Tasmota or OpenBK

    " "
    " "") webserver.content_send("" diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_UI.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_UI.h index bd60b72be..360070491 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_UI.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_UI.h @@ -643,7 +643,7 @@ be_local_closure(Matter_UI_show_plugins_configuration, /* name */ /* K50 */ be_nested_str_weak(_X3Ctd_X20style_X3D_X27font_X2Dsize_X3Asmaller_X3B_X27_X3E_X3Cinput_X20type_X3D_X27text_X27_X20id_X3D_X27arg_X27_X20name_X3D_X27arg_X27_X20size_X3D_X278_X27_X20value_X3D_X27_X27_X3E_X3C_X2Ftd_X3E_X3C_X2Ftr_X3E_X3C_X2Ftable_X3E), /* K51 */ be_nested_str_weak(_X3Cdiv_X20style_X3D_X27display_X3A_X20block_X3B_X27_X3E_X3C_X2Fdiv_X3E), /* K52 */ be_nested_str_weak(_X3Cbutton_X20name_X3D_X27addep_X27_X20class_X3D_X27button_X20bgrn_X27_X3ECreate_X20new_X20endpoint_X3C_X2Fbutton_X3E_X3C_X2Fform_X3E), - /* K53 */ be_nested_str_weak(_X3Chr_X3E_X3Cp_X3E_X3Cb_X3EAdd_X20Remote_X20Tasmota_X3C_X2Fb_X3E_X3C_X2Fp_X3E_X3Cform_X20action_X3D_X27_X2Fmatteradd_X27_X20method_X3D_X27get_X27_X3E_X3Ctable_X20style_X3D_X27width_X3A100_X25_X27_X3E), + /* K53 */ be_nested_str_weak(_X3Chr_X3E_X3Cp_X3E_X3Cb_X3EAdd_X20Remote_X20Tasmota_X20or_X20OpenBK_X3C_X2Fb_X3E_X3C_X2Fp_X3E_X3Cform_X20action_X3D_X27_X2Fmatteradd_X27_X20method_X3D_X27get_X27_X3E_X3Ctable_X20style_X3D_X27width_X3A100_X25_X27_X3E), /* K54 */ be_nested_str_weak(_X3Ctr_X3E_X3Ctd_X20width_X3D_X2730_X27_X20style_X3D_X27font_X2Dsize_X3Asmaller_X3B_X27_X3E_X3Cb_X3Ehttp_X3A_X2F_X2F_X3C_X2Fb_X3E_X3C_X2Ftd_X3E_X3Ctd_X3E_X3Cinput_X20type_X3D_X27text_X27_X20name_X3D_X27url_X27_X20size_X3D_X278_X27_X20value_X3D_X27_X27_X20required_X20placeholder_X3D_X27IP_X20or_X20domain_X27_X3E_X3C_X2Ftd_X3E_X3Ctd_X20width_X3D_X2710_X27_X20style_X3D_X27font_X2Dsize_X3Asmaller_X3B_X27_X3E_X3Cb_X3E_X2F_X3C_X2Fb_X3E_X3C_X2Ftd_X3E_X3C_X2Ftr_X3E_X3C_X2Ftr_X3E_X3C_X2Ftable_X3E), /* K55 */ be_nested_str_weak(_X3Cbutton_X20class_X3D_X27button_X20bgrn_X27_X3EAuto_X2Dconfigure_X20remote_X20Tasmota_X3C_X2Fbutton_X3E_X3C_X2Fform_X3E_X3Chr_X3E), /* K56 */ be_nested_str_weak(_X3Cform_X20action_X3D_X27_X2Fmatterc_X27_X20method_X3D_X27post_X27onsubmit_X3D_X27return_X20confirm_X28_X22This_X20will_X20RESET_X20the_X20configuration_X20to_X20the_X20default_X2E_X20You_X20will_X20need_X20to_X20associate_X20again_X2E_X22_X29_X3B_X27_X3E_X3Cbutton_X20name_X3D_X27auto_X27_X20class_X3D_X27button_X20bred_X27_X3EReset_X20all_X20and_X20Auto_X2Ddiscover_X3C_X2Fbutton_X3E_X3Cp_X3E_X3C_X2Fp_X3E_X3C_X2Fform_X3E), From bec7d63847f2d075f6dc2c2e036bd694a5d9f24b Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Wed, 14 Jun 2023 14:43:35 +0200 Subject: [PATCH 255/289] core 2.0.10 (IDF 4.4.5.20230614) (#18878) --- .github/PULL_REQUEST_TEMPLATE.md | 2 +- platformio_tasmota32.ini | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index 9678c65c3..215b7dd29 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -7,7 +7,7 @@ - [ ] Only relevant files were touched - [ ] Only one feature/fix was added per PR and the code change compiles without warnings - [ ] The code change is tested and works with Tasmota core ESP8266 V.2.7.4.9 - - [ ] The code change is tested and works with Tasmota core ESP32 V.2.0.9 + - [ ] The code change is tested and works with Tasmota core ESP32 V.2.0.10 - [ ] I accept the [CLA](https://github.com/arendst/Tasmota/blob/development/CONTRIBUTING.md#contributor-license-agreement-cla). _NOTE: The code change must pass CI tests. **Your PR cannot be merged unless tests pass**_ diff --git a/platformio_tasmota32.ini b/platformio_tasmota32.ini index b8be97bdd..f6a4ec000 100644 --- a/platformio_tasmota32.ini +++ b/platformio_tasmota32.ini @@ -42,7 +42,7 @@ extra_scripts = pre:pio-tools/add_c_flags.py ${esp_defaults.extra_scripts} [core32] -platform = https://github.com/tasmota/platform-espressif32/releases/download/2023.06.02/platform-espressif32.zip +platform = https://github.com/tasmota/platform-espressif32/releases/download/2023.06.04/platform-espressif32.zip platform_packages = build_unflags = ${esp32_defaults.build_unflags} build_flags = ${esp32_defaults.build_flags} From bbd6fa7202f74aac61dcecfac602cecbdc4dac2c Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Wed, 14 Jun 2023 14:45:54 +0200 Subject: [PATCH 256/289] core 2.0.10 --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 173cbb92d..392842cac 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,6 +15,7 @@ All notable changes to this project will be documented in this file. ### Changed - Berry `webclient.url_encode()` is now a static class method, no change required to existing code (#18775) - Matter Bridge mode always on +- ESP32 Framework (Core) from v2.0.9 to v2.0.10 ### Fixed - Interaction of ``SetOption92``, ``VirtualCT``, and ``RGBWWTable`` (#18768) From 156a3551b0f663158c5723f12ddd51c5ece6d00c Mon Sep 17 00:00:00 2001 From: stefanbode Date: Wed, 14 Jun 2023 16:14:10 +0200 Subject: [PATCH 257/289] Repair SHUTTER Shelly 2.5 with manual relay change on switches (#18877) * Repair manual relay change * Repair manual relay change --- tasmota/tasmota_xdrv_driver/xdrv_27_esp32_shutter.ino | 4 ++-- tasmota/tasmota_xdrv_driver/xdrv_27_shutter.ino | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/tasmota/tasmota_xdrv_driver/xdrv_27_esp32_shutter.ino b/tasmota/tasmota_xdrv_driver/xdrv_27_esp32_shutter.ino index 1108b3671..e056ce629 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_27_esp32_shutter.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_27_esp32_shutter.ino @@ -1128,14 +1128,14 @@ void ShutterRelayChanged(void) case SHT_COUNTER: case SHT_PWM_VALUE: case SHT_PWM_TIME: + ShutterPowerOff(i); case SHT_TIME: { - ShutterPowerOff(i); // powerstate_local == 0 => direction=0, stop // powerstate_local == 1 => direction=1, target=Shutter[i].open_max // powerstate_local == 2 => direction=-1, target=0 // only happen on SHT_TIME // powerstate_local == 3 => direction=-1, target=0 // only happen if NOT SHT_TIME int8_t direction = (powerstate_local == 0) ? 0 : (powerstate_local == 1) ? 1 : -1; - int8_t target = (powerstate_local == 1) ? Shutter[i].open_max : 0; + int32_t target = (powerstate_local == 1) ? Shutter[i].open_max : 0; if (direction != 0) { ShutterStartInit(i, direction, target); diff --git a/tasmota/tasmota_xdrv_driver/xdrv_27_shutter.ino b/tasmota/tasmota_xdrv_driver/xdrv_27_shutter.ino index 5fb4ae327..76a03da9b 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_27_shutter.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_27_shutter.ino @@ -893,14 +893,14 @@ void ShutterRelayChanged(void) case SHT_COUNTER: case SHT_PWM_VALUE: case SHT_PWM_TIME: + ShutterPowerOff(i); case SHT_TIME: { - ShutterPowerOff(i); // powerstate_local == 0 => direction=0, stop // powerstate_local == 1 => direction=1, target=Shutter[i].open_max // powerstate_local == 2 => direction=-1, target=0 // only happen on SHT_TIME // powerstate_local == 3 => direction=-1, target=0 // only happen if NOT SHT_TIME int8_t direction = (powerstate_local == 0) ? 0 : (powerstate_local == 1) ? 1 : -1; - int8_t target = (powerstate_local == 1) ? Shutter[i].open_max : 0; + int32_t target = (powerstate_local == 1) ? Shutter[i].open_max : 0; if (direction != 0) { ShutterStartInit(i, direction, target); From bd6aff77f7536edca6e9532c7d4be796ee246389 Mon Sep 17 00:00:00 2001 From: s-hadinger <49731213+s-hadinger@users.noreply.github.com> Date: Wed, 14 Jun 2023 20:36:17 +0200 Subject: [PATCH 258/289] Matter add support for Contact Sensor (#18882) --- CHANGELOG.md | 1 + .../berry_matter/src/be_matter_module.c | 2 + .../embedded/Matter_Plugin_Sensor_Contact.be | 104 ++++++ .../berry_matter/src/embedded/Matter_UI.be | 2 +- .../solidified_Matter_Plugin_Sensor_Contact.h | 296 ++++++++++++++++++ .../src/solidify/solidified_Matter_UI.h | 2 +- 6 files changed, 405 insertions(+), 2 deletions(-) create mode 100644 lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor_Contact.be create mode 100644 lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor_Contact.h diff --git a/CHANGELOG.md b/CHANGELOG.md index 392842cac..f1f0d57bd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,7 @@ All notable changes to this project will be documented in this file. - Matter ability to add or remove endpoint in bridge mode (code only) - Matter add controller's Vendor Name to logs and UI - Matter redesigned UI +- Matter add support for Contact Sensor ### Breaking Changed diff --git a/lib/libesp32/berry_matter/src/be_matter_module.c b/lib/libesp32/berry_matter/src/be_matter_module.c index edd3923c2..26f04f251 100644 --- a/lib/libesp32/berry_matter/src/be_matter_module.c +++ b/lib/libesp32/berry_matter/src/be_matter_module.c @@ -236,6 +236,7 @@ extern const bclass be_class_Matter_TLV; // need to declare it upfront because #include "solidify/solidified_Matter_Plugin_Bridge_Sensor_Humidity.h" #include "solidify/solidified_Matter_Plugin_Bridge_Sensor_Occupancy.h" #include "solidify/solidified_Matter_Plugin_Sensor_OnOff.h" +#include "solidify/solidified_Matter_Plugin_Sensor_Contact.h" /*********************************************************************************************\ * Get a bytes() object of the certificate DAC/PAI_Cert @@ -427,6 +428,7 @@ module matter (scope: global, strings: weak) { Plugin_Sensor_Humidity, class(be_class_Matter_Plugin_Sensor_Humidity) // Humidity Sensor Plugin_Sensor_Occupancy, class(be_class_Matter_Plugin_Sensor_Occupancy) // Occupancy Sensor Plugin_Sensor_OnOff, class(be_class_Matter_Plugin_Sensor_OnOff) // Simple OnOff Sensor + Plugin_Sensor_Contact, class(be_class_Matter_Plugin_Sensor_Contact) // Contact Sensor Plugin_Bridge_HTTP, class(be_class_Matter_Plugin_Bridge_HTTP) // HTTP bridge superclass Plugin_Bridge_OnOff, class(be_class_Matter_Plugin_Bridge_OnOff) // HTTP Relay/Light behavior (OnOff) Plugin_Bridge_Light0, class(be_class_Matter_Plugin_Bridge_Light0) // HTTP OnOff Light diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor_Contact.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor_Contact.be new file mode 100644 index 000000000..c66f80490 --- /dev/null +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor_Contact.be @@ -0,0 +1,104 @@ +# +# Matter_Plugin_Sensor_Contact.be - implements the behavior for a Contact Sensor +# +# Copyright (C) 2023 Stephan Hadinger & Theo Arends +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +# + +import matter + +# Matter plug-in for core behavior + +# dummy declaration for solidification +class Matter_Plugin_Device end + +#@ solidify:Matter_Plugin_Sensor_Contact,weak + +class Matter_Plugin_Sensor_Contact : Matter_Plugin_Device + static var TYPE = "contact" # name of the plug-in in json + static var NAME = "Contact" # display name of the plug-in + static var ARG = "switch" # additional argument name (or empty if none) + static var ARG_HINT = "Enter Switch number" + static var ARG_TYPE = / x -> int(x) # function to convert argument to the right type + static var UPDATE_TIME = 5000 # update every 250ms + static var CLUSTERS = { + 0x0045: [0,0xFFFC,0xFFFD], # Boolean State p.70 - no writable + } + static var TYPES = { 0x0015: 1 } # Contact Sensor, rev 1 + + var tasmota_switch_index # Switch number in Tasmota (one based) + var shadow_contact + + ############################################################# + # parse_configuration + # + # Parse configuration map + def parse_configuration(config) + self.tasmota_switch_index = int(config.find(self.ARG #-'relay'-#, 1)) + if self.tasmota_switch_index <= 0 self.tasmota_switch_index = 1 end + end + + ############################################################# + # Update shadow + # + def update_shadow() + super(self).update_shadow() + + import json + var ret = tasmota.cmd("Status 8", true) + if ret != nil + var j = json.load(ret) + if j != nil + var state = false + state = (j.find("Switch" + str(self.tasmota_switch_index)) == "ON") + + if self.shadow_contact != nil && self.shadow_contact != bool(state) + self.attribute_updated(0x0045, 0x0000) + end + self.shadow_contact = state + end + end + end + + ############################################################# + # read an attribute + # + def read_attribute(session, ctx) + import string + var TLV = matter.TLV + var cluster = ctx.cluster + var attribute = ctx.attribute + + # ==================================================================================================== + if cluster == 0x0045 # ========== Boolean State ========== + if attribute == 0x0000 # ---------- StateValue / bool ---------- + if self.shadow_contact != nil + return TLV.create_TLV(TLV.BOOL, self.shadow_contact) + else + return TLV.create_TLV(TLV.NULL, nil) + end + elif attribute == 0xFFFC # ---------- FeatureMap / map32 ---------- + return TLV.create_TLV(TLV.U4, 0) + elif attribute == 0xFFFD # ---------- ClusterRevision / u2 ---------- + return TLV.create_TLV(TLV.U4, 1) # 1 = Initial release + end + + else + return super(self).read_attribute(session, ctx) + end + end + +end +matter.Plugin_Sensor_Contact = Matter_Plugin_Sensor_Contact diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_UI.be b/lib/libesp32/berry_matter/src/embedded/Matter_UI.be index 0f2833c6d..387a68099 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_UI.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_UI.be @@ -33,7 +33,7 @@ import matter ################################################################################# class Matter_UI static var _CLASSES_TYPES = "|relay|light0|light1|light2|light3|shutter|shutter+tilt" - "|temperature|pressure|illuminance|humidity|occupancy|onoff" + "|temperature|pressure|illuminance|humidity|occupancy|onoff|contact" # static var _CLASSES_HTTP = "-http" static var _CLASSES_TYPES2= "|http_relay|http_light0|http_light1|http_light2|http_light3" "|http_temperature|http_pressure|http_illuminance|http_humidity" diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor_Contact.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor_Contact.h new file mode 100644 index 000000000..7ef3173cd --- /dev/null +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor_Contact.h @@ -0,0 +1,296 @@ +/* Solidification of Matter_Plugin_Sensor_Contact.h */ +/********************************************************************\ +* Generated code, don't edit * +\********************************************************************/ +#include "be_constobj.h" + +extern const bclass be_class_Matter_Plugin_Sensor_Contact; + +/******************************************************************** +** Solidified function: +********************************************************************/ +be_local_closure(Matter_Plugin_Sensor_Contact__X3Clambda_X3E, /* name */ + be_nested_proto( + 3, /* nstack */ + 1, /* argc */ + 0, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 0, /* has constants */ + NULL, /* no const */ + be_str_weak(_X3Clambda_X3E), + &be_const_str_solidified, + ( &(const binstruction[ 4]) { /* code */ + 0x60040009, // 0000 GETGBL R1 G9 + 0x5C080000, // 0001 MOVE R2 R0 + 0x7C040200, // 0002 CALL R1 1 + 0x80040200, // 0003 RET 1 R1 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: parse_configuration +********************************************************************/ +be_local_closure(Matter_Plugin_Sensor_Contact_parse_configuration, /* name */ + be_nested_proto( + 7, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 5]) { /* constants */ + /* K0 */ be_nested_str_weak(tasmota_switch_index), + /* K1 */ be_nested_str_weak(find), + /* K2 */ be_nested_str_weak(ARG), + /* K3 */ be_const_int(1), + /* K4 */ be_const_int(0), + }), + be_str_weak(parse_configuration), + &be_const_str_solidified, + ( &(const binstruction[12]) { /* code */ + 0x60080009, // 0000 GETGBL R2 G9 + 0x8C0C0301, // 0001 GETMET R3 R1 K1 + 0x88140102, // 0002 GETMBR R5 R0 K2 + 0x58180003, // 0003 LDCONST R6 K3 + 0x7C0C0600, // 0004 CALL R3 3 + 0x7C080200, // 0005 CALL R2 1 + 0x90020002, // 0006 SETMBR R0 K0 R2 + 0x88080100, // 0007 GETMBR R2 R0 K0 + 0x18080504, // 0008 LE R2 R2 K4 + 0x780A0000, // 0009 JMPF R2 #000B + 0x90020103, // 000A SETMBR R0 K0 K3 + 0x80000000, // 000B RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: read_attribute +********************************************************************/ +be_local_closure(Matter_Plugin_Sensor_Contact_read_attribute, /* name */ + be_nested_proto( + 11, /* nstack */ + 3, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[13]) { /* constants */ + /* K0 */ be_nested_str_weak(string), + /* K1 */ be_nested_str_weak(matter), + /* K2 */ be_nested_str_weak(TLV), + /* K3 */ be_nested_str_weak(cluster), + /* K4 */ be_nested_str_weak(attribute), + /* K5 */ be_const_int(0), + /* K6 */ be_nested_str_weak(shadow_contact), + /* K7 */ be_nested_str_weak(create_TLV), + /* K8 */ be_nested_str_weak(BOOL), + /* K9 */ be_nested_str_weak(NULL), + /* K10 */ be_nested_str_weak(U4), + /* K11 */ be_const_int(1), + /* K12 */ be_nested_str_weak(read_attribute), + }), + be_str_weak(read_attribute), + &be_const_str_solidified, + ( &(const binstruction[53]) { /* code */ + 0xA40E0000, // 0000 IMPORT R3 K0 + 0xB8120200, // 0001 GETNGBL R4 K1 + 0x88100902, // 0002 GETMBR R4 R4 K2 + 0x88140503, // 0003 GETMBR R5 R2 K3 + 0x88180504, // 0004 GETMBR R6 R2 K4 + 0x541E0044, // 0005 LDINT R7 69 + 0x1C1C0A07, // 0006 EQ R7 R5 R7 + 0x781E0023, // 0007 JMPF R7 #002C + 0x1C1C0D05, // 0008 EQ R7 R6 K5 + 0x781E000F, // 0009 JMPF R7 #001A + 0x881C0106, // 000A GETMBR R7 R0 K6 + 0x4C200000, // 000B LDNIL R8 + 0x201C0E08, // 000C NE R7 R7 R8 + 0x781E0005, // 000D JMPF R7 #0014 + 0x8C1C0907, // 000E GETMET R7 R4 K7 + 0x88240908, // 000F GETMBR R9 R4 K8 + 0x88280106, // 0010 GETMBR R10 R0 K6 + 0x7C1C0600, // 0011 CALL R7 3 + 0x80040E00, // 0012 RET 1 R7 + 0x70020004, // 0013 JMP #0019 + 0x8C1C0907, // 0014 GETMET R7 R4 K7 + 0x88240909, // 0015 GETMBR R9 R4 K9 + 0x4C280000, // 0016 LDNIL R10 + 0x7C1C0600, // 0017 CALL R7 3 + 0x80040E00, // 0018 RET 1 R7 + 0x70020010, // 0019 JMP #002B + 0x541EFFFB, // 001A LDINT R7 65532 + 0x1C1C0C07, // 001B EQ R7 R6 R7 + 0x781E0005, // 001C JMPF R7 #0023 + 0x8C1C0907, // 001D GETMET R7 R4 K7 + 0x8824090A, // 001E GETMBR R9 R4 K10 + 0x58280005, // 001F LDCONST R10 K5 + 0x7C1C0600, // 0020 CALL R7 3 + 0x80040E00, // 0021 RET 1 R7 + 0x70020007, // 0022 JMP #002B + 0x541EFFFC, // 0023 LDINT R7 65533 + 0x1C1C0C07, // 0024 EQ R7 R6 R7 + 0x781E0004, // 0025 JMPF R7 #002B + 0x8C1C0907, // 0026 GETMET R7 R4 K7 + 0x8824090A, // 0027 GETMBR R9 R4 K10 + 0x5828000B, // 0028 LDCONST R10 K11 + 0x7C1C0600, // 0029 CALL R7 3 + 0x80040E00, // 002A RET 1 R7 + 0x70020007, // 002B JMP #0034 + 0x601C0003, // 002C GETGBL R7 G3 + 0x5C200000, // 002D MOVE R8 R0 + 0x7C1C0200, // 002E CALL R7 1 + 0x8C1C0F0C, // 002F GETMET R7 R7 K12 + 0x5C240200, // 0030 MOVE R9 R1 + 0x5C280400, // 0031 MOVE R10 R2 + 0x7C1C0600, // 0032 CALL R7 3 + 0x80040E00, // 0033 RET 1 R7 + 0x80000000, // 0034 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: update_shadow +********************************************************************/ +be_local_closure(Matter_Plugin_Sensor_Contact_update_shadow, /* name */ + be_nested_proto( + 9, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[13]) { /* constants */ + /* K0 */ be_nested_str_weak(update_shadow), + /* K1 */ be_nested_str_weak(json), + /* K2 */ be_nested_str_weak(tasmota), + /* K3 */ be_nested_str_weak(cmd), + /* K4 */ be_nested_str_weak(Status_X208), + /* K5 */ be_nested_str_weak(load), + /* K6 */ be_nested_str_weak(find), + /* K7 */ be_nested_str_weak(Switch), + /* K8 */ be_nested_str_weak(tasmota_switch_index), + /* K9 */ be_nested_str_weak(ON), + /* K10 */ be_nested_str_weak(shadow_contact), + /* K11 */ be_nested_str_weak(attribute_updated), + /* K12 */ be_const_int(0), + }), + be_str_weak(update_shadow), + &be_const_str_solidified, + ( &(const binstruction[45]) { /* code */ + 0x60040003, // 0000 GETGBL R1 G3 + 0x5C080000, // 0001 MOVE R2 R0 + 0x7C040200, // 0002 CALL R1 1 + 0x8C040300, // 0003 GETMET R1 R1 K0 + 0x7C040200, // 0004 CALL R1 1 + 0xA4060200, // 0005 IMPORT R1 K1 + 0xB80A0400, // 0006 GETNGBL R2 K2 + 0x8C080503, // 0007 GETMET R2 R2 K3 + 0x58100004, // 0008 LDCONST R4 K4 + 0x50140200, // 0009 LDBOOL R5 1 0 + 0x7C080600, // 000A CALL R2 3 + 0x4C0C0000, // 000B LDNIL R3 + 0x200C0403, // 000C NE R3 R2 R3 + 0x780E001D, // 000D JMPF R3 #002C + 0x8C0C0305, // 000E GETMET R3 R1 K5 + 0x5C140400, // 000F MOVE R5 R2 + 0x7C0C0400, // 0010 CALL R3 2 + 0x4C100000, // 0011 LDNIL R4 + 0x20100604, // 0012 NE R4 R3 R4 + 0x78120017, // 0013 JMPF R4 #002C + 0x50100000, // 0014 LDBOOL R4 0 0 + 0x8C140706, // 0015 GETMET R5 R3 K6 + 0x601C0008, // 0016 GETGBL R7 G8 + 0x88200108, // 0017 GETMBR R8 R0 K8 + 0x7C1C0200, // 0018 CALL R7 1 + 0x001E0E07, // 0019 ADD R7 K7 R7 + 0x7C140400, // 001A CALL R5 2 + 0x1C140B09, // 001B EQ R5 R5 K9 + 0x5C100A00, // 001C MOVE R4 R5 + 0x8814010A, // 001D GETMBR R5 R0 K10 + 0x4C180000, // 001E LDNIL R6 + 0x20140A06, // 001F NE R5 R5 R6 + 0x78160009, // 0020 JMPF R5 #002B + 0x8814010A, // 0021 GETMBR R5 R0 K10 + 0x60180017, // 0022 GETGBL R6 G23 + 0x5C1C0800, // 0023 MOVE R7 R4 + 0x7C180200, // 0024 CALL R6 1 + 0x20140A06, // 0025 NE R5 R5 R6 + 0x78160003, // 0026 JMPF R5 #002B + 0x8C14010B, // 0027 GETMET R5 R0 K11 + 0x541E0044, // 0028 LDINT R7 69 + 0x5820000C, // 0029 LDCONST R8 K12 + 0x7C140600, // 002A CALL R5 3 + 0x90021404, // 002B SETMBR R0 K10 R4 + 0x80000000, // 002C RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified class: Matter_Plugin_Sensor_Contact +********************************************************************/ +extern const bclass be_class_Matter_Plugin_Device; +be_local_class(Matter_Plugin_Sensor_Contact, + 2, + &be_class_Matter_Plugin_Device, + be_nested_map(13, + ( (struct bmapnode*) &(const bmapnode[]) { + { be_const_key_weak(ARG, -1), be_nested_str_weak(switch) }, + { be_const_key_weak(shadow_contact, -1), be_const_var(1) }, + { be_const_key_weak(TYPE, -1), be_nested_str_weak(contact) }, + { be_const_key_weak(ARG_TYPE, 5), be_const_static_closure(Matter_Plugin_Sensor_Contact__X3Clambda_X3E_closure) }, + { be_const_key_weak(UPDATE_TIME, -1), be_const_int(5000) }, + { be_const_key_weak(ARG_HINT, 1), be_nested_str_weak(Enter_X20Switch_X3Cx_X3E_X20number) }, + { be_const_key_weak(NAME, -1), be_nested_str_weak(Contact) }, + { be_const_key_weak(parse_configuration, 8), be_const_closure(Matter_Plugin_Sensor_Contact_parse_configuration_closure) }, + { be_const_key_weak(update_shadow, -1), be_const_closure(Matter_Plugin_Sensor_Contact_update_shadow_closure) }, + { be_const_key_weak(tasmota_switch_index, 6), be_const_var(0) }, + { be_const_key_weak(CLUSTERS, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { + be_const_map( * be_nested_map(1, + ( (struct bmapnode*) &(const bmapnode[]) { + { be_const_key_int(69, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_list, { + be_const_list( * be_nested_list(3, + ( (struct bvalue*) &(const bvalue[]) { + be_const_int(0), + be_const_int(65532), + be_const_int(65533), + })) ) } )) }, + })) ) } )) }, + { be_const_key_weak(read_attribute, 4), be_const_closure(Matter_Plugin_Sensor_Contact_read_attribute_closure) }, + { be_const_key_weak(TYPES, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { + be_const_map( * be_nested_map(1, + ( (struct bmapnode*) &(const bmapnode[]) { + { be_const_key_int(21, -1), be_const_int(1) }, + })) ) } )) }, + })), + be_str_weak(Matter_Plugin_Sensor_Contact) +); +/*******************************************************************/ + +void be_load_Matter_Plugin_Sensor_Contact_class(bvm *vm) { + be_pushntvclass(vm, &be_class_Matter_Plugin_Sensor_Contact); + be_setglobal(vm, "Matter_Plugin_Sensor_Contact"); + be_pop(vm, 1); +} +/********************************************************************/ +/* End of solidification */ diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_UI.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_UI.h index 360070491..15ab6f8a6 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_UI.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_UI.h @@ -3220,7 +3220,7 @@ be_local_class(Matter_UI, { be_const_key_weak(show_commissioning_info, -1), be_const_closure(Matter_UI_show_commissioning_info_closure) }, { be_const_key_weak(page_part_ctl, 18), be_const_closure(Matter_UI_page_part_ctl_closure) }, { be_const_key_weak(show_fabric_info, -1), be_const_closure(Matter_UI_show_fabric_info_closure) }, - { be_const_key_weak(_CLASSES_TYPES, 4), be_nested_str_weak(_X7Crelay_X7Clight0_X7Clight1_X7Clight2_X7Clight3_X7Cshutter_X7Cshutter_X2Btilt_X7Ctemperature_X7Cpressure_X7Cilluminance_X7Chumidity_X7Coccupancy_X7Conoff) }, + { be_const_key_weak(_CLASSES_TYPES, 4), be_nested_str_weak(_X7Crelay_X7Clight0_X7Clight1_X7Clight2_X7Clight3_X7Cshutter_X7Cshutter_X2Btilt_X7Ctemperature_X7Cpressure_X7Cilluminance_X7Chumidity_X7Coccupancy_X7Conoff_X7Ccontact) }, { be_const_key_weak(web_get_arg, -1), be_const_closure(Matter_UI_web_get_arg_closure) }, { be_const_key_weak(plugin_option, 5), be_const_closure(Matter_UI_plugin_option_closure) }, { be_const_key_weak(web_add_config_button, -1), be_const_closure(Matter_UI_web_add_config_button_closure) }, From 3a00dde3af56580d47111313da264ac10c7a13ee Mon Sep 17 00:00:00 2001 From: s-hadinger <49731213+s-hadinger@users.noreply.github.com> Date: Wed, 14 Jun 2023 22:32:54 +0200 Subject: [PATCH 259/289] Matter add remote contact (#18883) --- .../berry_matter/src/be_matter_module.c | 6 +- .../Matter_Plugin_Bridge_Sensor_Contact.be | 110 ++++++ .../embedded/Matter_Plugin_Sensor_Contact.be | 6 +- .../berry_matter/src/embedded/Matter_UI.be | 2 +- ...fied_Matter_Plugin_Bridge_Sensor_Contact.h | 328 ++++++++++++++++++ .../src/solidify/solidified_Matter_UI.h | 2 +- 6 files changed, 447 insertions(+), 7 deletions(-) create mode 100644 lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Sensor_Contact.be create mode 100644 lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Sensor_Contact.h diff --git a/lib/libesp32/berry_matter/src/be_matter_module.c b/lib/libesp32/berry_matter/src/be_matter_module.c index 26f04f251..8fa29d934 100644 --- a/lib/libesp32/berry_matter/src/be_matter_module.c +++ b/lib/libesp32/berry_matter/src/be_matter_module.c @@ -223,6 +223,8 @@ extern const bclass be_class_Matter_TLV; // need to declare it upfront because #include "solidify/solidified_Matter_Plugin_Sensor_Illuminance.h" #include "solidify/solidified_Matter_Plugin_Sensor_Humidity.h" #include "solidify/solidified_Matter_Plugin_Sensor_Occupancy.h" +#include "solidify/solidified_Matter_Plugin_Sensor_OnOff.h" +#include "solidify/solidified_Matter_Plugin_Sensor_Contact.h" #include "solidify/solidified_Matter_Plugin_Bridge_HTTP.h" #include "solidify/solidified_Matter_Plugin_Bridge_OnOff.h" #include "solidify/solidified_Matter_Plugin_Bridge_Light0.h" @@ -235,8 +237,7 @@ extern const bclass be_class_Matter_TLV; // need to declare it upfront because #include "solidify/solidified_Matter_Plugin_Bridge_Sensor_Illuminance.h" #include "solidify/solidified_Matter_Plugin_Bridge_Sensor_Humidity.h" #include "solidify/solidified_Matter_Plugin_Bridge_Sensor_Occupancy.h" -#include "solidify/solidified_Matter_Plugin_Sensor_OnOff.h" -#include "solidify/solidified_Matter_Plugin_Sensor_Contact.h" +#include "solidify/solidified_Matter_Plugin_Bridge_Sensor_Contact.h" /*********************************************************************************************\ * Get a bytes() object of the certificate DAC/PAI_Cert @@ -441,6 +442,7 @@ module matter (scope: global, strings: weak) { Plugin_Bridge_Sensor_Illuminance, class(be_class_Matter_Plugin_Bridge_Sensor_Illuminance) // HTTP Illuminance sensor Plugin_Bridge_Sensor_Humidity, class(be_class_Matter_Plugin_Bridge_Sensor_Humidity) // HTTP Humidity sensor Plugin_Bridge_Sensor_Occupancy, class(be_class_Matter_Plugin_Bridge_Sensor_Occupancy) // HTTP Occupancy sensor + Plugin_Bridge_Sensor_Contact, class(be_class_Matter_Plugin_Bridge_Sensor_Contact) // HTTP Contact sensor } @const_object_info_end */ diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Sensor_Contact.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Sensor_Contact.be new file mode 100644 index 000000000..694fefe60 --- /dev/null +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Sensor_Contact.be @@ -0,0 +1,110 @@ +# +# Matter_Plugin_Bridge_Sensor_Contact.be - implements Contact Sensor via HTTP to Tasmota +# +# Copyright (C) 2023 Stephan Hadinger & Theo Arends +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +# + +import matter + +# Matter plug-in for core behavior + +# dummy declaration for solidification +class Matter_Plugin_Bridge_HTTP end + +#@ solidify:Matter_Plugin_Bridge_Sensor_Contact,weak + +class Matter_Plugin_Bridge_Sensor_Contact : Matter_Plugin_Bridge_HTTP + static var TYPE = "http_contact" # name of the plug-in in json + static var NAME = "Contact" # display name of the plug-in + static var ARG = "switch" # additional argument name (or empty if none) + static var ARG_HINT = "Enter Switch number" + static var ARG_TYPE = / x -> int(x) # function to convert argument to the right type + static var UPDATE_TIME = 5000 # update every 5s + static var UPDATE_CMD = "Status 8" # command to send for updates + + static var CLUSTERS = { + 0x0045: [0,0xFFFC,0xFFFD], # Boolean State p.70 - no writable + } + static var TYPES = { 0x0015: 1 } # Contact Sensor, rev 1 + + var tasmota_switch_index # Switch number in Tasmota (one based) + var shadow_contact + + ############################################################# + # Constructor + def init(device, endpoint, arguments) + super(self).init(device, endpoint, arguments) + self.tasmota_switch_index = int(arguments.find(self.ARG #-'switch'-#, 1)) + if self.tasmota_switch_index <= 0 self.tasmota_switch_index = 1 end + end + + ############################################################# + # Stub for updating shadow values (local copies of what we published to the Matter gateway) + # + # This call is synnchronous and blocking. + def parse_update(data, index) + if index == 8 # Status 8 + var state = false + + state = (data.find("Switch" + str(self.tasmota_switch_index)) == "ON") + + if self.shadow_contact != nil && self.shadow_contact != bool(state) + self.attribute_updated(0x0045, 0x0000) + end + self.shadow_contact = state + end + end + + ############################################################# + # read an attribute + # + def read_attribute(session, ctx) + import string + var TLV = matter.TLV + var cluster = ctx.cluster + var attribute = ctx.attribute + + # ==================================================================================================== + if cluster == 0x0045 # ========== Boolean State ========== + if attribute == 0x0000 # ---------- StateValue / bool ---------- + if self.shadow_contact != nil + return TLV.create_TLV(TLV.BOOL, self.shadow_contact) + else + return TLV.create_TLV(TLV.NULL, nil) + end + elif attribute == 0xFFFC # ---------- FeatureMap / map32 ---------- + return TLV.create_TLV(TLV.U4, 0) + elif attribute == 0xFFFD # ---------- ClusterRevision / u2 ---------- + return TLV.create_TLV(TLV.U4, 1) # 1 = Initial release + end + + else + return super(self).read_attribute(session, ctx) + end + end + + ############################################################# + # web_values + # + # Show values of the remote device as HTML + def web_values() + import webserver + import string + webserver.content_send(string.format("| Contact%i %s", self.tasmota_switch_index, self.web_value_onoff(self.shadow_contact))) + end + +end +matter.Plugin_Bridge_Sensor_Contact = Matter_Plugin_Bridge_Sensor_Contact diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor_Contact.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor_Contact.be index c66f80490..2a5194b49 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor_Contact.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor_Contact.be @@ -27,8 +27,8 @@ class Matter_Plugin_Device end #@ solidify:Matter_Plugin_Sensor_Contact,weak class Matter_Plugin_Sensor_Contact : Matter_Plugin_Device - static var TYPE = "contact" # name of the plug-in in json - static var NAME = "Contact" # display name of the plug-in + static var TYPE = "contact" # name of the plug-in in json + static var NAME = "Contact" # display name of the plug-in static var ARG = "switch" # additional argument name (or empty if none) static var ARG_HINT = "Enter Switch number" static var ARG_TYPE = / x -> int(x) # function to convert argument to the right type @@ -46,7 +46,7 @@ class Matter_Plugin_Sensor_Contact : Matter_Plugin_Device # # Parse configuration map def parse_configuration(config) - self.tasmota_switch_index = int(config.find(self.ARG #-'relay'-#, 1)) + self.tasmota_switch_index = int(config.find(self.ARG #-'switch'-#, 1)) if self.tasmota_switch_index <= 0 self.tasmota_switch_index = 1 end end diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_UI.be b/lib/libesp32/berry_matter/src/embedded/Matter_UI.be index 387a68099..398a3161a 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_UI.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_UI.be @@ -37,7 +37,7 @@ class Matter_UI # static var _CLASSES_HTTP = "-http" static var _CLASSES_TYPES2= "|http_relay|http_light0|http_light1|http_light2|http_light3" "|http_temperature|http_pressure|http_illuminance|http_humidity" - "|http_occupancy" + "|http_occupancy|http_contact" var device # #################################################################################################### diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Sensor_Contact.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Sensor_Contact.h new file mode 100644 index 000000000..60e67f396 --- /dev/null +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Sensor_Contact.h @@ -0,0 +1,328 @@ +/* Solidification of Matter_Plugin_Bridge_Sensor_Contact.h */ +/********************************************************************\ +* Generated code, don't edit * +\********************************************************************/ +#include "be_constobj.h" + +extern const bclass be_class_Matter_Plugin_Bridge_Sensor_Contact; + +/******************************************************************** +** Solidified function: parse_update +********************************************************************/ +be_local_closure(Matter_Plugin_Bridge_Sensor_Contact_parse_update, /* name */ + be_nested_proto( + 8, /* nstack */ + 3, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 7]) { /* constants */ + /* K0 */ be_nested_str_weak(find), + /* K1 */ be_nested_str_weak(Switch), + /* K2 */ be_nested_str_weak(tasmota_switch_index), + /* K3 */ be_nested_str_weak(ON), + /* K4 */ be_nested_str_weak(shadow_contact), + /* K5 */ be_nested_str_weak(attribute_updated), + /* K6 */ be_const_int(0), + }), + be_str_weak(parse_update), + &be_const_str_solidified, + ( &(const binstruction[28]) { /* code */ + 0x540E0007, // 0000 LDINT R3 8 + 0x1C0C0403, // 0001 EQ R3 R2 R3 + 0x780E0017, // 0002 JMPF R3 #001B + 0x500C0000, // 0003 LDBOOL R3 0 0 + 0x8C100300, // 0004 GETMET R4 R1 K0 + 0x60180008, // 0005 GETGBL R6 G8 + 0x881C0102, // 0006 GETMBR R7 R0 K2 + 0x7C180200, // 0007 CALL R6 1 + 0x001A0206, // 0008 ADD R6 K1 R6 + 0x7C100400, // 0009 CALL R4 2 + 0x1C100903, // 000A EQ R4 R4 K3 + 0x5C0C0800, // 000B MOVE R3 R4 + 0x88100104, // 000C GETMBR R4 R0 K4 + 0x4C140000, // 000D LDNIL R5 + 0x20100805, // 000E NE R4 R4 R5 + 0x78120009, // 000F JMPF R4 #001A + 0x88100104, // 0010 GETMBR R4 R0 K4 + 0x60140017, // 0011 GETGBL R5 G23 + 0x5C180600, // 0012 MOVE R6 R3 + 0x7C140200, // 0013 CALL R5 1 + 0x20100805, // 0014 NE R4 R4 R5 + 0x78120003, // 0015 JMPF R4 #001A + 0x8C100105, // 0016 GETMET R4 R0 K5 + 0x541A0044, // 0017 LDINT R6 69 + 0x581C0006, // 0018 LDCONST R7 K6 + 0x7C100600, // 0019 CALL R4 3 + 0x90020803, // 001A SETMBR R0 K4 R3 + 0x80000000, // 001B RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: web_values +********************************************************************/ +be_local_closure(Matter_Plugin_Bridge_Sensor_Contact_web_values, /* name */ + be_nested_proto( + 12, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 8]) { /* constants */ + /* K0 */ be_nested_str_weak(webserver), + /* K1 */ be_nested_str_weak(string), + /* K2 */ be_nested_str_weak(content_send), + /* K3 */ be_nested_str_weak(format), + /* K4 */ be_nested_str_weak(_X7C_X20Contact_X25i_X20_X25s), + /* K5 */ be_nested_str_weak(tasmota_switch_index), + /* K6 */ be_nested_str_weak(web_value_onoff), + /* K7 */ be_nested_str_weak(shadow_contact), + }), + be_str_weak(web_values), + &be_const_str_solidified, + ( &(const binstruction[12]) { /* code */ + 0xA4060000, // 0000 IMPORT R1 K0 + 0xA40A0200, // 0001 IMPORT R2 K1 + 0x8C0C0302, // 0002 GETMET R3 R1 K2 + 0x8C140503, // 0003 GETMET R5 R2 K3 + 0x581C0004, // 0004 LDCONST R7 K4 + 0x88200105, // 0005 GETMBR R8 R0 K5 + 0x8C240106, // 0006 GETMET R9 R0 K6 + 0x882C0107, // 0007 GETMBR R11 R0 K7 + 0x7C240400, // 0008 CALL R9 2 + 0x7C140800, // 0009 CALL R5 4 + 0x7C0C0400, // 000A CALL R3 2 + 0x80000000, // 000B RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: +********************************************************************/ +be_local_closure(Matter_Plugin_Bridge_Sensor_Contact__X3Clambda_X3E, /* name */ + be_nested_proto( + 3, /* nstack */ + 1, /* argc */ + 0, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 0, /* has constants */ + NULL, /* no const */ + be_str_weak(_X3Clambda_X3E), + &be_const_str_solidified, + ( &(const binstruction[ 4]) { /* code */ + 0x60040009, // 0000 GETGBL R1 G9 + 0x5C080000, // 0001 MOVE R2 R0 + 0x7C040200, // 0002 CALL R1 1 + 0x80040200, // 0003 RET 1 R1 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: read_attribute +********************************************************************/ +be_local_closure(Matter_Plugin_Bridge_Sensor_Contact_read_attribute, /* name */ + be_nested_proto( + 11, /* nstack */ + 3, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[13]) { /* constants */ + /* K0 */ be_nested_str_weak(string), + /* K1 */ be_nested_str_weak(matter), + /* K2 */ be_nested_str_weak(TLV), + /* K3 */ be_nested_str_weak(cluster), + /* K4 */ be_nested_str_weak(attribute), + /* K5 */ be_const_int(0), + /* K6 */ be_nested_str_weak(shadow_contact), + /* K7 */ be_nested_str_weak(create_TLV), + /* K8 */ be_nested_str_weak(BOOL), + /* K9 */ be_nested_str_weak(NULL), + /* K10 */ be_nested_str_weak(U4), + /* K11 */ be_const_int(1), + /* K12 */ be_nested_str_weak(read_attribute), + }), + be_str_weak(read_attribute), + &be_const_str_solidified, + ( &(const binstruction[53]) { /* code */ + 0xA40E0000, // 0000 IMPORT R3 K0 + 0xB8120200, // 0001 GETNGBL R4 K1 + 0x88100902, // 0002 GETMBR R4 R4 K2 + 0x88140503, // 0003 GETMBR R5 R2 K3 + 0x88180504, // 0004 GETMBR R6 R2 K4 + 0x541E0044, // 0005 LDINT R7 69 + 0x1C1C0A07, // 0006 EQ R7 R5 R7 + 0x781E0023, // 0007 JMPF R7 #002C + 0x1C1C0D05, // 0008 EQ R7 R6 K5 + 0x781E000F, // 0009 JMPF R7 #001A + 0x881C0106, // 000A GETMBR R7 R0 K6 + 0x4C200000, // 000B LDNIL R8 + 0x201C0E08, // 000C NE R7 R7 R8 + 0x781E0005, // 000D JMPF R7 #0014 + 0x8C1C0907, // 000E GETMET R7 R4 K7 + 0x88240908, // 000F GETMBR R9 R4 K8 + 0x88280106, // 0010 GETMBR R10 R0 K6 + 0x7C1C0600, // 0011 CALL R7 3 + 0x80040E00, // 0012 RET 1 R7 + 0x70020004, // 0013 JMP #0019 + 0x8C1C0907, // 0014 GETMET R7 R4 K7 + 0x88240909, // 0015 GETMBR R9 R4 K9 + 0x4C280000, // 0016 LDNIL R10 + 0x7C1C0600, // 0017 CALL R7 3 + 0x80040E00, // 0018 RET 1 R7 + 0x70020010, // 0019 JMP #002B + 0x541EFFFB, // 001A LDINT R7 65532 + 0x1C1C0C07, // 001B EQ R7 R6 R7 + 0x781E0005, // 001C JMPF R7 #0023 + 0x8C1C0907, // 001D GETMET R7 R4 K7 + 0x8824090A, // 001E GETMBR R9 R4 K10 + 0x58280005, // 001F LDCONST R10 K5 + 0x7C1C0600, // 0020 CALL R7 3 + 0x80040E00, // 0021 RET 1 R7 + 0x70020007, // 0022 JMP #002B + 0x541EFFFC, // 0023 LDINT R7 65533 + 0x1C1C0C07, // 0024 EQ R7 R6 R7 + 0x781E0004, // 0025 JMPF R7 #002B + 0x8C1C0907, // 0026 GETMET R7 R4 K7 + 0x8824090A, // 0027 GETMBR R9 R4 K10 + 0x5828000B, // 0028 LDCONST R10 K11 + 0x7C1C0600, // 0029 CALL R7 3 + 0x80040E00, // 002A RET 1 R7 + 0x70020007, // 002B JMP #0034 + 0x601C0003, // 002C GETGBL R7 G3 + 0x5C200000, // 002D MOVE R8 R0 + 0x7C1C0200, // 002E CALL R7 1 + 0x8C1C0F0C, // 002F GETMET R7 R7 K12 + 0x5C240200, // 0030 MOVE R9 R1 + 0x5C280400, // 0031 MOVE R10 R2 + 0x7C1C0600, // 0032 CALL R7 3 + 0x80040E00, // 0033 RET 1 R7 + 0x80000000, // 0034 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: init +********************************************************************/ +be_local_closure(Matter_Plugin_Bridge_Sensor_Contact_init, /* name */ + be_nested_proto( + 9, /* nstack */ + 4, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 6]) { /* constants */ + /* K0 */ be_nested_str_weak(init), + /* K1 */ be_nested_str_weak(tasmota_switch_index), + /* K2 */ be_nested_str_weak(find), + /* K3 */ be_nested_str_weak(ARG), + /* K4 */ be_const_int(1), + /* K5 */ be_const_int(0), + }), + be_str_weak(init), + &be_const_str_solidified, + ( &(const binstruction[20]) { /* code */ + 0x60100003, // 0000 GETGBL R4 G3 + 0x5C140000, // 0001 MOVE R5 R0 + 0x7C100200, // 0002 CALL R4 1 + 0x8C100900, // 0003 GETMET R4 R4 K0 + 0x5C180200, // 0004 MOVE R6 R1 + 0x5C1C0400, // 0005 MOVE R7 R2 + 0x5C200600, // 0006 MOVE R8 R3 + 0x7C100800, // 0007 CALL R4 4 + 0x60100009, // 0008 GETGBL R4 G9 + 0x8C140702, // 0009 GETMET R5 R3 K2 + 0x881C0103, // 000A GETMBR R7 R0 K3 + 0x58200004, // 000B LDCONST R8 K4 + 0x7C140600, // 000C CALL R5 3 + 0x7C100200, // 000D CALL R4 1 + 0x90020204, // 000E SETMBR R0 K1 R4 + 0x88100101, // 000F GETMBR R4 R0 K1 + 0x18100905, // 0010 LE R4 R4 K5 + 0x78120000, // 0011 JMPF R4 #0013 + 0x90020304, // 0012 SETMBR R0 K1 K4 + 0x80000000, // 0013 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified class: Matter_Plugin_Bridge_Sensor_Contact +********************************************************************/ +extern const bclass be_class_Matter_Plugin_Bridge_HTTP; +be_local_class(Matter_Plugin_Bridge_Sensor_Contact, + 2, + &be_class_Matter_Plugin_Bridge_HTTP, + be_nested_map(15, + ( (struct bmapnode*) &(const bmapnode[]) { + { be_const_key_weak(ARG_HINT, 3), be_nested_str_weak(Enter_X20Switch_X3Cx_X3E_X20number) }, + { be_const_key_weak(parse_update, -1), be_const_closure(Matter_Plugin_Bridge_Sensor_Contact_parse_update_closure) }, + { be_const_key_weak(web_values, -1), be_const_closure(Matter_Plugin_Bridge_Sensor_Contact_web_values_closure) }, + { be_const_key_weak(init, -1), be_const_closure(Matter_Plugin_Bridge_Sensor_Contact_init_closure) }, + { be_const_key_weak(ARG_TYPE, 10), be_const_static_closure(Matter_Plugin_Bridge_Sensor_Contact__X3Clambda_X3E_closure) }, + { be_const_key_weak(TYPES, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { + be_const_map( * be_nested_map(1, + ( (struct bmapnode*) &(const bmapnode[]) { + { be_const_key_int(21, -1), be_const_int(1) }, + })) ) } )) }, + { be_const_key_weak(UPDATE_TIME, -1), be_const_int(5000) }, + { be_const_key_weak(tasmota_switch_index, -1), be_const_var(0) }, + { be_const_key_weak(NAME, -1), be_nested_str_weak(Contact) }, + { be_const_key_weak(UPDATE_CMD, 11), be_nested_str_weak(Status_X208) }, + { be_const_key_weak(TYPE, 14), be_nested_str_weak(http_contact) }, + { be_const_key_weak(ARG, 8), be_nested_str_weak(switch) }, + { be_const_key_weak(read_attribute, -1), be_const_closure(Matter_Plugin_Bridge_Sensor_Contact_read_attribute_closure) }, + { be_const_key_weak(shadow_contact, -1), be_const_var(1) }, + { be_const_key_weak(CLUSTERS, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { + be_const_map( * be_nested_map(1, + ( (struct bmapnode*) &(const bmapnode[]) { + { be_const_key_int(69, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_list, { + be_const_list( * be_nested_list(3, + ( (struct bvalue*) &(const bvalue[]) { + be_const_int(0), + be_const_int(65532), + be_const_int(65533), + })) ) } )) }, + })) ) } )) }, + })), + be_str_weak(Matter_Plugin_Bridge_Sensor_Contact) +); +/*******************************************************************/ + +void be_load_Matter_Plugin_Bridge_Sensor_Contact_class(bvm *vm) { + be_pushntvclass(vm, &be_class_Matter_Plugin_Bridge_Sensor_Contact); + be_setglobal(vm, "Matter_Plugin_Bridge_Sensor_Contact"); + be_pop(vm, 1); +} +/********************************************************************/ +/* End of solidification */ diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_UI.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_UI.h index 15ab6f8a6..425b86080 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_UI.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_UI.h @@ -3208,7 +3208,7 @@ be_local_class(Matter_UI, ( (struct bmapnode*) &(const bmapnode[]) { { be_const_key_weak(equal_map, -1), be_const_static_closure(Matter_UI_equal_map_closure) }, { be_const_key_weak(page_part_mgr_adv, -1), be_const_closure(Matter_UI_page_part_mgr_adv_closure) }, - { be_const_key_weak(_CLASSES_TYPES2, -1), be_nested_str_weak(_X7Chttp_relay_X7Chttp_light0_X7Chttp_light1_X7Chttp_light2_X7Chttp_light3_X7Chttp_temperature_X7Chttp_pressure_X7Chttp_illuminance_X7Chttp_humidity_X7Chttp_occupancy) }, + { be_const_key_weak(_CLASSES_TYPES2, -1), be_nested_str_weak(_X7Chttp_relay_X7Chttp_light0_X7Chttp_light1_X7Chttp_light2_X7Chttp_light3_X7Chttp_temperature_X7Chttp_pressure_X7Chttp_illuminance_X7Chttp_humidity_X7Chttp_occupancy_X7Chttp_contact) }, { be_const_key_weak(page_part_mgr, 25), be_const_closure(Matter_UI_page_part_mgr_closure) }, { be_const_key_weak(show_plugins_hints_js, -1), be_const_closure(Matter_UI_show_plugins_hints_js_closure) }, { be_const_key_weak(show_enable, -1), be_const_closure(Matter_UI_show_enable_closure) }, From 28861821a684886637470b0f7a7603ce902843b8 Mon Sep 17 00:00:00 2001 From: s-hadinger <49731213+s-hadinger@users.noreply.github.com> Date: Wed, 14 Jun 2023 22:46:18 +0200 Subject: [PATCH 260/289] Zigbee fixed regression with SetOption101 (#18884) --- CHANGELOG.md | 1 + .../xdrv_23_zigbee_6_0_commands.ino | 14 +++----------- 2 files changed, 4 insertions(+), 11 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f1f0d57bd..89398a06c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -22,6 +22,7 @@ All notable changes to this project will be documented in this file. - Interaction of ``SetOption92``, ``VirtualCT``, and ``RGBWWTable`` (#18768) - Fixed HASPmota event when value is non-integer (fixes #18229) - Matter fix local Occupancy sensor +- Zigbee fixed regression with SetOption101 ### Removed diff --git a/tasmota/tasmota_xdrv_driver/xdrv_23_zigbee_6_0_commands.ino b/tasmota/tasmota_xdrv_driver/xdrv_23_zigbee_6_0_commands.ino index 3183db08a..aa30eb15d 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_23_zigbee_6_0_commands.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_23_zigbee_6_0_commands.ino @@ -509,18 +509,10 @@ void convertClusterSpecific(class Z_attribute_list &attr_list, uint16_t cluster, break; } } else { // general case - // do we send command with endpoint suffix - char command_suffix[4] = { 0x00 }; // empty string by default - // if SO101 and multiple endpoints, append endpoint number - if (Settings->flag4.zb_index_ep) { - if (zigbee_devices.getShortAddr(shortaddr).countEndpoints() > 0) { - snprintf_P(command_suffix, sizeof(command_suffix), PSTR("%d"), srcendpoint); - } - } if (0 == xyz.x_type) { - attr_list.addAttribute(command_name, command_suffix).setBool(true); + attr_list.addAttribute(command_name).setBool(true); } else if (0 == xyz.y_type) { - attr_list.addAttribute(command_name, command_suffix).setUInt(xyz.x); + attr_list.addAttribute(command_name).setUInt(xyz.x); } else { // multiple answers, create an array JsonGeneratorArray arr; @@ -529,7 +521,7 @@ void convertClusterSpecific(class Z_attribute_list &attr_list, uint16_t cluster, if (xyz.z_type) { arr.add(xyz.z); } - attr_list.addAttribute(command_name, command_suffix).setStrRaw(arr.toString().c_str()); + attr_list.addAttribute(command_name).setStrRaw(arr.toString().c_str()); } } } From 3fc932d38aa56cf58bb348d6623facf8e75e2a62 Mon Sep 17 00:00:00 2001 From: s-hadinger <49731213+s-hadinger@users.noreply.github.com> Date: Fri, 16 Jun 2023 20:38:53 +0200 Subject: [PATCH 261/289] Berry `string.format()` now automatically converts type according to format (#18890) --- CHANGELOG.md | 1 + lib/libesp32/berry/src/be_baselib.c | 102 ++++++++++++++-------------- lib/libesp32/berry/src/be_baselib.h | 31 +++++++++ lib/libesp32/berry/src/be_strlib.c | 64 +++++++++++++++-- lib/libesp32/berry/tests/string.be | 37 ++++++++++ 5 files changed, 178 insertions(+), 57 deletions(-) create mode 100644 lib/libesp32/berry/src/be_baselib.h diff --git a/CHANGELOG.md b/CHANGELOG.md index 89398a06c..03c019944 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,7 @@ All notable changes to this project will be documented in this file. - Matter add controller's Vendor Name to logs and UI - Matter redesigned UI - Matter add support for Contact Sensor +- Berry `string.format()` now automatically converts type according to format ### Breaking Changed diff --git a/lib/libesp32/berry/src/be_baselib.c b/lib/libesp32/berry/src/be_baselib.c index 592d74a53..ba366c12b 100644 --- a/lib/libesp32/berry/src/be_baselib.c +++ b/lib/libesp32/berry/src/be_baselib.c @@ -18,7 +18,7 @@ #define READLINE_STEP 100 -static int l_assert(bvm *vm) +int be_baselib_assert(bvm *vm) { int argc = be_top(vm); /* assertion fails when there is no argument @@ -33,7 +33,7 @@ static int l_assert(bvm *vm) be_return_nil(vm); } -static int l_print(bvm *vm) +int be_baselib_print(bvm *vm) { int i, argc = be_top(vm); for (i = 1; i <= argc; ++i) { @@ -68,7 +68,7 @@ static int m_readline(bvm *vm) be_return(vm); } -static int l_input(bvm *vm) +int be_baselib_input(bvm *vm) { if (be_top(vm) && be_isstring(vm, 1)) { /* echo prompt */ be_writestring(be_tostring(vm, 1)); @@ -118,7 +118,7 @@ static bbool obj2int(bvm *vm, bvalue *var, bint *val) return bfalse; } -static int l_super(bvm *vm) +int be_baselib_super(bvm *vm) { int argc = be_top(vm); @@ -197,7 +197,7 @@ static int l_super(bvm *vm) be_return_nil(vm); } -static int l_type(bvm *vm) +int be_baselib_type(bvm *vm) { if (be_top(vm)) { be_pushstring(vm, be_typename(vm, 1)); @@ -206,7 +206,7 @@ static int l_type(bvm *vm) be_return_nil(vm); } -static int l_classname(bvm *vm) +int be_baselib_classname(bvm *vm) { if (be_top(vm)) { const char *t = be_classname(vm, 1); @@ -218,7 +218,7 @@ static int l_classname(bvm *vm) be_return_nil(vm); } -static int l_classof(bvm *vm) +int be_baselib_classof(bvm *vm) { if (be_top(vm) && be_classof(vm, 1)) { be_return(vm); @@ -226,7 +226,7 @@ static int l_classof(bvm *vm) be_return_nil(vm); } -static int l_number(bvm *vm) +int be_baselib_number(bvm *vm) { if (be_top(vm)) { if (be_isstring(vm, 1)) { @@ -240,7 +240,7 @@ static int l_number(bvm *vm) be_return_nil(vm); } -static int l_int(bvm *vm) +int be_baselib_int(bvm *vm) { if (be_top(vm)) { if (be_isstring(vm, 1)) { @@ -272,7 +272,7 @@ static int l_int(bvm *vm) be_return_nil(vm); } -static int l_real(bvm *vm) +int be_baselib_real(bvm *vm) { if (be_top(vm)) { if (be_isstring(vm, 1)) { @@ -296,7 +296,7 @@ static int check_method(bvm *vm, const char *attr) be_isinstance(vm, 1) && be_getmethod(vm, 1, attr); } -static int l_iterator(bvm *vm) +int be_baselib_iterator(bvm *vm) { if (be_top(vm) && be_isfunction(vm, 1)) { be_return(vm); /* return the argument[0]::function */ @@ -357,7 +357,7 @@ static int l_call(bvm *vm) be_return_nil(vm); } -static int l_str(bvm *vm) +int be_baselib_str(bvm *vm) { if (be_top(vm)) { be_tostring(vm, 1); @@ -378,7 +378,7 @@ static int l_bool(bvm *vm) } -static int l_size(bvm *vm) +int be_baselib_size(bvm *vm) { if (be_top(vm) && be_isstring(vm, 1)) { be_pushint(vm, be_strlen(vm, 1)); @@ -393,7 +393,7 @@ static int l_size(bvm *vm) be_return_nil(vm); } -static int l_module(bvm *vm) +int be_baselib_module(bvm *vm) { int argc = be_top(vm); be_newmodule(vm); @@ -436,7 +436,7 @@ static int m_compile_file(bvm *vm) } #endif -static int l_compile(bvm *vm) +int be_baselib_compile(bvm *vm) { #if BE_USE_SCRIPT_COMPILER if (be_top(vm) && be_isstring(vm, 1)) { @@ -467,12 +467,12 @@ static int _issubv(bvm *vm, bbool (*filter)(bvm*, int)) be_return(vm); } -static int l_issubclass(bvm *vm) +int be_baselib_issubclass(bvm *vm) { return _issubv(vm, be_isclass); } -static int l_isinstance(bvm *vm) +int be_baselib_isinstance(bvm *vm) { return _issubv(vm, be_isinstance); } @@ -480,23 +480,23 @@ static int l_isinstance(bvm *vm) #if !BE_USE_PRECOMPILED_OBJECT void be_load_baselib(bvm *vm) { - be_regfunc(vm, "assert", l_assert); - be_regfunc(vm, "print", l_print); - be_regfunc(vm, "input", l_input); - be_regfunc(vm, "super", l_super); - be_regfunc(vm, "type", l_type); - be_regfunc(vm, "classname", l_classname); - be_regfunc(vm, "classof", l_classof); - be_regfunc(vm, "number", l_number); - be_regfunc(vm, "str", l_str); - be_regfunc(vm, "int", l_int); - be_regfunc(vm, "real", l_real); - be_regfunc(vm, "module", l_module); - be_regfunc(vm, "size", l_size); - be_regfunc(vm, "compile", l_compile); - be_regfunc(vm, "issubclass", l_issubclass); - be_regfunc(vm, "isinstance", l_isinstance); - be_regfunc(vm, "__iterator__", l_iterator); + be_regfunc(vm, "assert", be_baselib_assert); + be_regfunc(vm, "print", be_baselib_print); + be_regfunc(vm, "input", be_baselib_input); + be_regfunc(vm, "super", be_baselib_super); + be_regfunc(vm, "type", be_baselib_type); + be_regfunc(vm, "classname", be_baselib_classname); + be_regfunc(vm, "classof", be_baselib_classof); + be_regfunc(vm, "number", be_baselib_number); + be_regfunc(vm, "str", be_baselib_str); + be_regfunc(vm, "int", be_baselib_int); + be_regfunc(vm, "real", be_baselib_real); + be_regfunc(vm, "module", be_baselib_module); + be_regfunc(vm, "size", be_baselib_size); + be_regfunc(vm, "compile", be_baselib_compile); + be_regfunc(vm, "issubclass", be_baselib_issubclass); + be_regfunc(vm, "isinstance", be_baselib_isinstance); + be_regfunc(vm, "__iterator__", be_baselib_iterator); } /* call must be added later to respect order of builtins */ @@ -513,23 +513,23 @@ extern const bclass be_class_bytes; extern int be_nfunc_open(bvm *vm); /* @const_object_info_begin vartab m_builtin (scope: local) { - assert, func(l_assert) - print, func(l_print) - input, func(l_input) - super, func(l_super) - type, func(l_type) - classname, func(l_classname) - classof, func(l_classof) - number, func(l_number) - str, func(l_str) - int, func(l_int) - real, func(l_real) - module, func(l_module) - size, func(l_size) - compile, func(l_compile) - issubclass, func(l_issubclass) - isinstance, func(l_isinstance) - __iterator__, func(l_iterator) + assert, func(be_baselib_assert) + print, func(be_baselib_print) + input, func(be_baselib_input) + super, func(be_baselib_super) + type, func(be_baselib_type) + classname, func(be_baselib_classname) + classof, func(be_baselib_classof) + number, func(be_baselib_number) + str, func(be_baselib_str) + int, func(be_baselib_int) + real, func(be_baselib_real) + module, func(be_baselib_module) + size, func(be_baselib_size) + compile, func(be_baselib_compile) + issubclass, func(be_baselib_issubclass) + isinstance, func(be_baselib_isinstance) + __iterator__, func(be_baselib_iterator) open, func(be_nfunc_open) list, class(be_class_list) map, class(be_class_map) diff --git a/lib/libesp32/berry/src/be_baselib.h b/lib/libesp32/berry/src/be_baselib.h new file mode 100644 index 000000000..582b0871b --- /dev/null +++ b/lib/libesp32/berry/src/be_baselib.h @@ -0,0 +1,31 @@ +/******************************************************************** +** Copyright (c) 2018-2020 Guan Wenliang +** This file is part of the Berry default interpreter. +** skiars@qq.com, https://github.com/Skiars/berry +** See Copyright Notice in the LICENSE file or at +** https://github.com/Skiars/berry/blob/master/LICENSE +********************************************************************/ +#ifndef __BE_BASELIB_H +#define __BE_BASELIB_H + +#include "be_object.h" + +int be_baselib_assert(bvm *vm); +int be_baselib_print(bvm *vm); +int be_baselib_input(bvm *vm); +int be_baselib_super(bvm *vm); +int be_baselib_type(bvm *vm); +int be_baselib_classname(bvm *vm); +int be_baselib_classof(bvm *vm); +int be_baselib_number(bvm *vm); +int be_baselib_str(bvm *vm); +int be_baselib_int(bvm *vm); +int be_baselib_real(bvm *vm); +int be_baselib_module(bvm *vm); +int be_baselib_size(bvm *vm); +int be_baselib_compile(bvm *vm); +int be_baselib_issubclass(bvm *vm); +int be_baselib_isinstance(bvm *vm); +int be_baselib_iterator(bvm *vm); + +#endif diff --git a/lib/libesp32/berry/src/be_strlib.c b/lib/libesp32/berry/src/be_strlib.c index 2c5424634..4172876e6 100644 --- a/lib/libesp32/berry/src/be_strlib.c +++ b/lib/libesp32/berry/src/be_strlib.c @@ -12,6 +12,7 @@ #include "be_module.h" #include "be_exec.h" #include "be_mem.h" +#include "be_baselib.h" #include #include #include @@ -556,6 +557,48 @@ static void mode_fixlen(char *mode, const char *lenmode) mode[l + lm] = '\0'; } +static bbool convert_to_int(bvm *vm, int index, bint *val) +{ + bbool converted = bfalse; + if (val == NULL) { return bfalse; } + if (be_isint(vm, index)) { + *val = be_toint(vm, index); + converted = btrue; + } else { + be_pushntvfunction(vm, be_baselib_int); + be_pushvalue(vm, index); + be_call(vm, 1); + be_pop(vm, 1); + if (be_isint(vm, -1)) { + *val = be_toint(vm, -1); + converted = btrue; + } + be_pop(vm, 1); + } + return converted; +} + +static bbool convert_to_real(bvm *vm, int index, breal *val) +{ + bbool converted = bfalse; + if (val == NULL) { return bfalse; } + if (be_isnumber(vm, index)) { + *val = be_toreal(vm, index); + converted = btrue; + } else { + be_pushntvfunction(vm, be_baselib_real); + be_pushvalue(vm, index); + be_call(vm, 1); + be_pop(vm, 1); + if (be_isnumber(vm, -1)) { + *val = be_toreal(vm, -1); + converted = btrue; + } + be_pop(vm, 1); + } + return converted; +} + static int str_format(bvm *vm) { int top = be_top(vm); @@ -585,25 +628,34 @@ static int str_format(bvm *vm) break; case 'd': case 'i': case 'o': case 'u': case 'x': case 'X': - if (be_isint(vm, index)) { + { + bint val; + if (convert_to_int(vm, index, &val)) { mode_fixlen(mode, BE_INT_FMTLEN); - sprintf(buf, mode, be_toint(vm, index)); + sprintf(buf, mode, val); } be_pushstring(vm, buf); break; + } case 'e': case 'E': case 'f': case 'g': case 'G': - if (be_isnumber(vm, index)) { - sprintf(buf, mode, be_toreal(vm, index)); + { + breal val; + if (convert_to_real(vm, index, &val)) { + sprintf(buf, mode, val); } be_pushstring(vm, buf); break; + } case 'c': - if (be_isint(vm, index)) { - sprintf(buf, "%c", (int)be_toint(vm, index)); + { + bint val; + if (convert_to_int(vm, index, &val)) { + sprintf(buf, "%c", (int)val); } be_pushstring(vm, buf); break; + } case 's': { const char *s = be_tostring(vm, index); int len = be_strlen(vm, index); diff --git a/lib/libesp32/berry/tests/string.be b/lib/libesp32/berry/tests/string.be index e7d91e8dd..072e5faa7 100644 --- a/lib/libesp32/berry/tests/string.be +++ b/lib/libesp32/berry/tests/string.be @@ -110,3 +110,40 @@ s = "a"# "b" # zz "c" assert(s == 'abc') + +# string.format with automatic conversion +import string + +assert(string.format("%i", 3) == '3') +assert(string.format("%i", "3") == '3') +assert(string.format("%i", "03") == '3') +assert(string.format("%i", nil) == '') + +class A def toint() return 42 end end +a=A() +class B end +b=B() + +assert(string.format("%i", a) == '42') +assert(string.format("%i", b) == '') + +assert(string.format("%i", nil) == '') +assert(string.format("%i", true) == '1') +assert(string.format("%i", false) == '0') + +assert(string.format("%c", a) == '*') + +assert(string.format("%f", 3.5) == '3.500000') +assert(string.format("%f", 3) == '3.000000') +assert(string.format("%.1f", 3) == '3.0') +assert(string.format("%.1f", nil) == '') +assert(string.format("%.1f", true) == '') +assert(string.format("%.1f", false) == '') +assert(string.format("%.1f", a) == '') + +assert(string.format("%s", a) == '') +assert(string.format("%s", 0) == '0') +assert(string.format("%s", nil) == 'nil') +assert(string.format("%s", true) == 'true') +assert(string.format("%s", false) == 'false') + From 4452228dca2c5ed3d023587fb112d4e6eed33460 Mon Sep 17 00:00:00 2001 From: btsimonh Date: Sun, 18 Jun 2023 17:42:07 +0100 Subject: [PATCH 262/289] add path.isdir for berry, plus save ~87 bytes of flash ikn the process. (#18895) --- lib/libesp32/berry_tasmota/include/be_port.h | 10 ++ .../berry_tasmota/src/be_path_tasmota_lib.c | 63 +++----- lib/libesp32/berry_tasmota/src/be_port.cpp | 150 +++++++++++------- 3 files changed, 130 insertions(+), 93 deletions(-) create mode 100644 lib/libesp32/berry_tasmota/include/be_port.h diff --git a/lib/libesp32/berry_tasmota/include/be_port.h b/lib/libesp32/berry_tasmota/include/be_port.h new file mode 100644 index 000000000..91e7fe8fa --- /dev/null +++ b/lib/libesp32/berry_tasmota/include/be_port.h @@ -0,0 +1,10 @@ +/******************************************************************** + * Tasmota - constants used in be_port and be_path_tasmota.lib.c + *******************************************************************/ +#define MPATH_MKDIR 0 +#define MPATH_RMDIR 1 +#define MPATH_LISTDIR 2 +#define MPATH_ISDIR 3 +#define MPATH_EXISTS 4 +#define MPATH_MODIFIED 5 +#define MPATH_REMOVE 6 diff --git a/lib/libesp32/berry_tasmota/src/be_path_tasmota_lib.c b/lib/libesp32/berry_tasmota/src/be_path_tasmota_lib.c index 4c327b0ca..1822abcc1 100644 --- a/lib/libesp32/berry_tasmota/src/be_path_tasmota_lib.c +++ b/lib/libesp32/berry_tasmota/src/be_path_tasmota_lib.c @@ -18,48 +18,32 @@ #include "be_sys.h" #include -// from be_port.c -extern int m_path_listdir(bvm *vm); -extern int m_path_mkdir(bvm *vm); -extern int m_path_rmdir(bvm *vm); +// provides MPATH_ constants +#include "be_port.h" -static int m_path_exists(bvm *vm) -{ - const char *path = NULL; - if (be_top(vm) >= 1 && be_isstring(vm, 1)) { - path = be_tostring(vm, 1); - be_pushbool(vm, be_isexist(path)); - } else { - be_pushbool(vm, bfalse); - } - be_return(vm); +// from be_port.cpp, becasue it uses c++ +extern int _m_path_action(bvm *vm, int8_t action); + +static int m_path_listdir(bvm *vm){ + return _m_path_action(vm, MPATH_LISTDIR); } -extern time_t be_last_modified(void *hfile); - -static int m_path_last_modified(bvm *vm) -{ - if (be_top(vm) >= 1 && be_isstring(vm, 1)) { - const char *path = be_tostring(vm, 1); - void * f = be_fopen(path, "r"); - if (f) { - be_pushint(vm, be_last_modified(f)); - be_fclose(f); - be_return(vm); - } - } - be_return_nil(vm); +static int m_path_isdir(bvm *vm){ + return _m_path_action(vm, MPATH_ISDIR); } - -static int m_path_remove(bvm *vm) -{ - const char *path = NULL; - if (be_top(vm) >= 1 && be_isstring(vm, 1)) { - path = be_tostring(vm, 1); - be_pushbool(vm, be_unlink(path)); - } else { - be_pushbool(vm, bfalse); - } - be_return(vm); +static int m_path_mkdir(bvm *vm) { + return _m_path_action(vm, MPATH_MKDIR); +} +static int m_path_rmdir(bvm *vm) { + return _m_path_action(vm, MPATH_RMDIR); +} +static int m_path_exists(bvm *vm) { + return _m_path_action(vm, MPATH_EXISTS); +} +static int m_path_last_modified(bvm *vm){ + return _m_path_action(vm, MPATH_MODIFIED); +} +static int m_path_remove(bvm *vm){ + return _m_path_action(vm, MPATH_REMOVE); } extern int be_format_fs(void); @@ -80,6 +64,7 @@ module path (scope: global, file: tasmota_path) { exists, func(m_path_exists) last_modified, func(m_path_last_modified) listdir, func(m_path_listdir) + isdir, func(m_path_isdir) remove, func(m_path_remove) format, func(m_path_format) mkdir, func(m_path_mkdir) diff --git a/lib/libesp32/berry_tasmota/src/be_port.cpp b/lib/libesp32/berry_tasmota/src/be_port.cpp index 4eef6d044..0cfac3573 100644 --- a/lib/libesp32/berry_tasmota/src/be_port.cpp +++ b/lib/libesp32/berry_tasmota/src/be_port.cpp @@ -98,69 +98,111 @@ BERRY_API void be_writebuffer(const char *buffer, size_t length) // be_fwrite(stdout, buffer, length); } - +// provides MPATH_ constants +#include "be_port.h" extern "C" { - int m_path_listdir(bvm *vm) - { + // this combined action is called from be_path_tasmota_lib.c + // by using a single function, we save >200 bytes of flash + // by reducing code repetition. + int _m_path_action(bvm *vm, int8_t action){ #ifdef USE_UFILESYS + // if this changes to not -1, we push it as a bool + int res = -1; + // this tells us to return the vm, not nil + int returnit = 0; + + // comment out if nil return is OK to save some flash + switch (action){ + case MPATH_EXISTS: + case MPATH_REMOVE: + res = 0; + break; + } + if (be_top(vm) >= 1 && be_isstring(vm, 1)) { const char *path = be_tostring(vm, 1); - be_newobject(vm, "list"); - - File dir = ffsp->open(path, "r"); - if (dir) { - dir.rewindDirectory(); - while (1) { - File entry = dir.openNextFile(); - if (!entry) { - break; - } - const char * fn = entry.name(); - if (strcmp(fn, ".") && strcmp(fn, "..")) { - be_pushstring(vm, fn); - be_data_push(vm, -2); - be_pop(vm, 1); - } - - } - } - be_pop(vm, 1); - be_return(vm); - - } -#endif // USE_UFILESYS - be_return_nil(vm); - } - - static int _m_path_mkdir_rmdir(bvm *vm, int remove) { -#ifdef USE_UFILESYS - const char *path = NULL; - if (be_top(vm) >= 1 && be_isstring(vm, 1)) { - path = be_tostring(vm, 1); - int res = 0; if (path != nullptr) { - if (remove) - res = zip_ufsp.rmdir(path); - else - res = zip_ufsp.mkdir(path); - } + switch (action){ + case MPATH_EXISTS: + res = be_isexist(path); + break; + case MPATH_REMOVE: + res = be_unlink(path); + break; + case MPATH_RMDIR: + res = zip_ufsp.rmdir(path); + break; + case MPATH_MKDIR: + res = zip_ufsp.mkdir(path); + break; + case MPATH_LISTDIR: + be_newobject(vm, "list"); // add our list object and fall through + returnit = 1; + case MPATH_ISDIR: + case MPATH_MODIFIED: { + // listdir and isdir both need to open the file. + + // we use be_fopen because it pre-pends with '/'. + // without this TAS fails to find stuff at boot... + File *dir = (File *)be_fopen(path, "r"); + if (dir) { + switch (action){ + case MPATH_LISTDIR: + // fill out the list object + dir->rewindDirectory(); + while (1) { + File entry = dir->openNextFile(); + if (!entry) { + break; + } + const char * fn = entry.name(); + if (strcmp(fn, ".") && strcmp(fn, "..")) { + be_pushstring(vm, fn); + be_data_push(vm, -2); + be_pop(vm, 1); + } + } + break; + case MPATH_ISDIR: + // push bool belowthe only one to push an int, so do it here. + res = dir->isDirectory(); + break; + case MPATH_MODIFIED: + // the only one to push an int, so do it here. + be_pushint(vm, dir->getLastWrite()); + returnit = 1; + break; + } + be_fclose(dir); + } + } break; + } + + // these + switch (action){ + case MPATH_LISTDIR: + // if it was list, pop always + be_pop(vm, 1); + break; + } + } // invalid filename -> nil return + } // not a string, or no arg -> nil return unless see below + + // if we get here, and it was exists or remove, return false always + // i.e. it's false for no filename or null filename. + + // if it was a boolean result + if (res != -1){ be_pushbool(vm, res); - } else { - be_pushbool(vm, bfalse); + returnit = 1; } - be_return(vm); -#else // USE_UFILESYS - be_return_nil(vm); + if (returnit){ + be_return(vm); + } + #endif // USE_UFILESYS + be_return_nil(vm); } - - int m_path_mkdir(bvm *vm) { - return _m_path_mkdir_rmdir(vm, 0); - } - int m_path_rmdir(bvm *vm) { - return _m_path_mkdir_rmdir(vm, 1); - } - } BERRY_API char* be_readstring(char *buffer, size_t size) From b2fd3111865db2e65354986b7caf8491bd8dc50c Mon Sep 17 00:00:00 2001 From: btsimonh Date: Sun, 18 Jun 2023 17:42:39 +0100 Subject: [PATCH 263/289] Bugfix accessing zip paths with no characters after the hash (#18894) Add passthrough of openNextFile, so that folders can be opened and read via the ZipFS proxied filesystems. --- lib/libesp32/Zip-readonly-FS/src/ZipReadFS.cpp | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/lib/libesp32/Zip-readonly-FS/src/ZipReadFS.cpp b/lib/libesp32/Zip-readonly-FS/src/ZipReadFS.cpp index 5e642105b..5d5590f36 100644 --- a/lib/libesp32/Zip-readonly-FS/src/ZipReadFS.cpp +++ b/lib/libesp32/Zip-readonly-FS/src/ZipReadFS.cpp @@ -125,6 +125,8 @@ protected: class ZipReadFileImpl; typedef std::shared_ptr ZipReadFileImplPtr; + +// this is the proxy FileImpl - used for passing through real files. class ZipReadFileImpl : public FileImpl { public: ZipReadFileImpl(File f) { _f = f; } @@ -163,7 +165,9 @@ public: return _f.isDirectory(); } FileImplPtr openNextFile(const char* mode) { - return nullptr; // TODO + File f = _f.openNextFile(mode); + return ZipReadFileImplPtr(new ZipReadFileImpl(f)); + //return nullptr; // TODO } void rewindDirectory(void) { return _f.rewindDirectory(); @@ -469,6 +473,9 @@ FileImplPtr ZipReadFSImpl::open(const char* path, const char* mode, const bool c char *tok; char *prefix = strtok_r(sub_path, "#", &tok); char *suffix = strtok_r(NULL, "", &tok); + if (!suffix || *suffix == 0){ // bad filename - nothing after # + return ZipReadFileImplPtr(); // return an error + } // if suffix starts with '/', skip the first char if (*suffix == '/') { suffix++; } // AddLog(LOG_LEVEL_DEBUG, "ZIP: prefix=%s suffix=%s", prefix, suffix); From 4a3b6457ca4c21f587f2e6de7fca2ab4a9130e07 Mon Sep 17 00:00:00 2001 From: s-hadinger <49731213+s-hadinger@users.noreply.github.com> Date: Sun, 18 Jun 2023 18:45:47 +0200 Subject: [PATCH 264/289] Matter add friendly-name (NodeLabel) to each endpoint (#18897) --- CHANGELOG.md | 1 + .../src/embedded/Matter_Device.be | 10 +- .../src/embedded/Matter_Plugin_Bridge_HTTP.be | 61 +- .../embedded/Matter_Plugin_Bridge_Light0.be | 14 +- .../embedded/Matter_Plugin_Bridge_Light1.be | 3 +- .../embedded/Matter_Plugin_Bridge_Light2.be | 3 +- .../embedded/Matter_Plugin_Bridge_Light3.be | 3 +- .../embedded/Matter_Plugin_Bridge_OnOff.be | 3 +- .../embedded/Matter_Plugin_Bridge_Sensor.be | 9 + .../Matter_Plugin_Bridge_Sensor_Contact.be | 13 +- .../Matter_Plugin_Bridge_Sensor_Humidity.be | 4 +- ...Matter_Plugin_Bridge_Sensor_Illuminance.be | 4 +- .../Matter_Plugin_Bridge_Sensor_Occupancy.be | 13 +- .../Matter_Plugin_Bridge_Sensor_Pressure.be | 4 +- .../Matter_Plugin_Bridge_Sensor_Temp.be | 4 +- .../src/embedded/Matter_Plugin_Device.be | 30 +- .../berry_matter/src/embedded/Matter_UI.be | 96 +- .../src/solidify/solidified_Matter_Device.h | 6 +- .../solidified_Matter_Plugin_Bridge_HTTP.h | 812 ++++-- .../solidified_Matter_Plugin_Bridge_Light0.h | 563 ++-- .../solidified_Matter_Plugin_Bridge_Light1.h | 41 +- .../solidified_Matter_Plugin_Bridge_Light2.h | 47 +- .../solidified_Matter_Plugin_Bridge_Light3.h | 47 +- .../solidified_Matter_Plugin_Bridge_OnOff.h | 39 +- .../solidified_Matter_Plugin_Bridge_Sensor.h | 261 +- ...fied_Matter_Plugin_Bridge_Sensor_Contact.h | 307 ++- ...ied_Matter_Plugin_Bridge_Sensor_Humidity.h | 42 +- ..._Matter_Plugin_Bridge_Sensor_Illuminance.h | 28 +- ...ed_Matter_Plugin_Bridge_Sensor_Occupancy.h | 259 +- ...ied_Matter_Plugin_Bridge_Sensor_Pressure.h | 28 +- ...idified_Matter_Plugin_Bridge_Sensor_Temp.h | 42 +- .../solidified_Matter_Plugin_Device.h | 183 +- .../src/solidify/solidified_Matter_UI.h | 2390 +++++++++-------- 33 files changed, 3181 insertions(+), 2189 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 03c019944..a0c9b7641 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,7 @@ All notable changes to this project will be documented in this file. - Matter redesigned UI - Matter add support for Contact Sensor - Berry `string.format()` now automatically converts type according to format +- Matter add friendly-name (NodeLabel) to each endpoint ### Breaking Changed diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Device.be b/lib/libesp32/berry_matter/src/embedded/Matter_Device.be index 26c889135..c62776068 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Device.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Device.be @@ -698,7 +698,7 @@ class Matter_Device var param_log = '' for k:_class.k2l(plugin_conf) if k == 'type' continue end - param_log += string.format(" %s = %s", k, plugin_conf[k]) + param_log += string.format(" %s:%s", k, plugin_conf[k]) end return param_log end @@ -718,7 +718,7 @@ class Matter_Device # start with mandatory endpoint 0 for root node self.plugins.push(matter.Plugin_Root(self, 0, {})) - tasmota.log(string.format("MTR: endpoint = %5i type = %s%s", 0, 'root', ''), 2) + tasmota.log(string.format("MTR: endpoint = %5i type:%s%s", 0, 'root', ''), 2) # always include an aggregator for dynamic endpoints self.plugins.push(matter.Plugin_Aggregator(self, 0xFF00, {})) @@ -738,12 +738,12 @@ class Matter_Device var pi = pi_class(self, ep, plugin_conf) self.plugins.push(pi) - tasmota.log(string.format("MTR: endpoint = %5i type = %s%s", ep, pi_class_name, self.conf_to_log(plugin_conf)), 2) + tasmota.log(string.format("MTR: endpoint = %5i type:%s%s", ep, pi_class_name, self.conf_to_log(plugin_conf)), 2) except .. as e, m tasmota.log("MTR: Exception" + str(e) + "|" + str(m), 2) end end - tasmota.log(string.format("MTR: endpoint = %5i type = %s%s", 0xFF00, 'aggregator', ''), 2) + tasmota.log(string.format("MTR: endpoint = %5i type:%s%s", 0xFF00, 'aggregator', ''), 2) tasmota.publish_result('{"Matter":{"Initialized":1}}', 'Matter') end @@ -1260,7 +1260,7 @@ class Matter_Device pi_conf[k] = plugin_conf[k] end # add to main - tasmota.log(string.format("MTR: adding endpoint = %i type = %s%s", ep, pi_class_name, self.conf_to_log(plugin_conf)), 2) + tasmota.log(string.format("MTR: adding endpoint = %i type:%s%s", ep, pi_class_name, self.conf_to_log(plugin_conf)), 2) self.plugins_config[ep_str] = pi_conf self.plugins_persist = true self.next_ep += 1 # increment next allocated endpoint before saving diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_HTTP.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_HTTP.be index 2afe4f79f..cfb7ff393 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_HTTP.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_HTTP.be @@ -24,6 +24,7 @@ import matter # dummy declaration for solidification class Matter_Plugin_Device end +#@ solidify:Matter_Plugin_Bridge_HTTP.GetOptionReader,weak #@ solidify:Matter_Plugin_Bridge_HTTP,weak class Matter_Plugin_Bridge_HTTP : Matter_Plugin_Device @@ -209,9 +210,20 @@ class Matter_Plugin_Bridge_HTTP : Matter_Plugin_Device # web_values # # Show values of the remote device as HTML + static var PREFIX = "| %s " def web_values() import webserver - webserver.content_send("| <-- (" + self.NAME + ") -->") + import string + self.web_values_prefix() + webserver.content_send("<-- (" + self.NAME + ") -->") + end + + # Show prefix before web value + def web_values_prefix() + import webserver + import string + var name = self.get_name() + webserver.content_send(string.format(self.PREFIX, name ? webserver.html_escape(name) : "")) end # Show on/off value as html @@ -219,5 +231,52 @@ class Matter_Plugin_Bridge_HTTP : Matter_Plugin_Device var onoff_html = (onoff != nil ? (onoff ? "On" : "Off") : "") return onoff_html end + + ############################################################# + # GetOption reader to decode `SetOption` values from `Status 3` + static class GetOptionReader + var flag, flag2, flag3, flag4, flag5, flag6 + + def init(j) + if j == nil raise "value_error", "invalid json" end + var so = j['SetOption'] + self.flag = bytes().fromhex(so[0]).reverse() + self.flag2 = bytes().fromhex(so[1]) + self.flag3 = bytes().fromhex(so[2]).reverse() + self.flag4 = bytes().fromhex(so[3]).reverse() + self.flag5 = bytes().fromhex(so[4]).reverse() + self.flag6 = bytes().fromhex(so[5]).reverse() + end + def getoption(x) + if x < 32 # SetOption0 .. 31 = Settings->flag + return self.flag.getbits(x, 1) + elif x < 50 # SetOption32 .. 49 = Settings->param + return self.flag2.get(x - 32, 1) + elif x < 82 # SetOption50 .. 81 = Settings->flag3 + return self.flag3.getbits(x - 50, 1) + elif x < 114 # SetOption82 .. 113 = Settings->flag4 + return self.flag4.getbits(x - 82, 1) + elif x < 146 # SetOption114 .. 145 = Settings->flag5 + return self.flag5.getbits(x - 114, 1) + elif x < 178 # SetOption146 .. 177 = Settings->flag6 + return self.flag6.getbits(x - 146, 1) + end + end + end + + #- Examples + + import json + + var p = '{"SerialLog":2,"WebLog":3,"MqttLog":0,"SysLog":0,"LogHost":"","LogPort":514,"SSId":["Livebox-781A",""],"TelePeriod":300,"Resolution":"558180C0","SetOption":["00008009","2805C80001800600003C5A0A192800000000","00000080","00006000","00006000","00000020"]}' + var j = json.load(p) + + var gor = matter.Plugin_Bridge_HTTP.GetOptionReader(j) + assert(gor.getoption(151) == 1) + assert(gor.getoption(150) == 0) + assert(gor.getoption(32) == 40) + assert(gor.getoption(37) == 128) + + -# end matter.Plugin_Bridge_HTTP = Matter_Plugin_Bridge_HTTP diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Light0.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Light0.be index dde2e8435..36f01dc4f 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Light0.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Light0.be @@ -145,7 +145,19 @@ class Matter_Plugin_Bridge_Light0 : Matter_Plugin_Bridge_HTTP def web_values() import webserver import string - webserver.content_send(string.format("| Light %s", self.web_value_onoff(self.shadow_onoff))) + self.web_values_prefix() # display '| ' and name if present + webserver.content_send(string.format("%s", self.web_value_onoff(self.shadow_onoff))) + end + + # Show prefix before web value + def web_values_prefix() + import webserver + import string + var name = self.get_name() + if !name + name = "Power" + str(self.tasmota_relay_index) + end + webserver.content_send(string.format(self.PREFIX, name ? webserver.html_escape(name) : "")) end end diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Light1.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Light1.be index 3de4c5a30..14d568608 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Light1.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Light1.be @@ -173,7 +173,8 @@ class Matter_Plugin_Bridge_Light1 : Matter_Plugin_Bridge_Light0 def web_values() import webserver import string - webserver.content_send(string.format("| Light %s %s", self.web_value_onoff(self.shadow_onoff), self.web_value_dimmer())) + self.web_values_prefix() # display '| ' and name if present + webserver.content_send(string.format("%s %s", self.web_value_onoff(self.shadow_onoff), self.web_value_dimmer())) end # Show on/off value as html diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Light2.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Light2.be index d2ee48b6c..e3e8a46d5 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Light2.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Light2.be @@ -175,7 +175,8 @@ class Matter_Plugin_Bridge_Light2 : Matter_Plugin_Bridge_Light1 def web_values() import webserver import string - webserver.content_send(string.format("| Light %s %s %s", + self.web_values_prefix() # display '| ' and name if present + webserver.content_send(string.format("%s %s %s", self.web_value_onoff(self.shadow_onoff), self.web_value_dimmer(), self.web_value_ct())) end diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Light3.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Light3.be index a2e9bcec6..42a8e1a78 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Light3.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Light3.be @@ -201,7 +201,8 @@ class Matter_Plugin_Bridge_Light3 : Matter_Plugin_Bridge_Light1 def web_values() import webserver import string - webserver.content_send(string.format("| Light %s %s %s", + self.web_values_prefix() # display '| ' and name if present + webserver.content_send(string.format("%s %s %s", self.web_value_onoff(self.shadow_onoff), self.web_value_dimmer(), self.web_value_RGB())) end diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_OnOff.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_OnOff.be index 3baaada45..b055579d6 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_OnOff.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_OnOff.be @@ -39,7 +39,8 @@ class Matter_Plugin_Bridge_OnOff : Matter_Plugin_Bridge_Light0 def web_values() import webserver import string - webserver.content_send(string.format("| Relay %i %s", self.tasmota_relay_index, self.web_value_onoff(self.shadow_onoff))) + self.web_values_prefix() # display '| ' and name if present + webserver.content_send(string.format("Relay %i %s", self.tasmota_relay_index, self.web_value_onoff(self.shadow_onoff))) end end diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Sensor.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Sensor.be index efb70b964..aa4cea70e 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Sensor.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Sensor.be @@ -98,5 +98,14 @@ class Matter_Plugin_Bridge_Sensor : Matter_Plugin_Bridge_HTTP return "" end + # Show prefix before web value + def web_values_prefix() + import webserver + import string + var name = self.get_name() + if (!name) name = self.filter_name_html() end + webserver.content_send(string.format(self.PREFIX, name ? webserver.html_escape(name) : "")) + end + end matter.Plugin_Bridge_Sensor = Matter_Plugin_Bridge_Sensor diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Sensor_Contact.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Sensor_Contact.be index 694fefe60..32a826a11 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Sensor_Contact.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Sensor_Contact.be @@ -103,8 +103,19 @@ class Matter_Plugin_Bridge_Sensor_Contact : Matter_Plugin_Bridge_HTTP def web_values() import webserver import string - webserver.content_send(string.format("| Contact%i %s", self.tasmota_switch_index, self.web_value_onoff(self.shadow_contact))) + self.web_values_prefix() # display '| ' and name if present + webserver.content_send(string.format("Contact%i %s", self.tasmota_switch_index, self.web_value_onoff(self.shadow_contact))) end + # Show prefix before web value + def web_values_prefix() + import webserver + import string + var name = self.get_name() + if !name + name = "Switch" + str(self.tasmota_switch_index) + end + webserver.content_send(string.format(self.PREFIX, name ? webserver.html_escape(name) : "")) + end end matter.Plugin_Bridge_Sensor_Contact = Matter_Plugin_Bridge_Sensor_Contact diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Sensor_Humidity.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Sensor_Humidity.be index 798225be8..832a289d0 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Sensor_Humidity.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Sensor_Humidity.be @@ -92,8 +92,8 @@ class Matter_Plugin_Bridge_Sensor_Humidity : Matter_Plugin_Bridge_Sensor def web_values() import webserver import string - webserver.content_send(string.format("| %s 💧 %2.0f%%", - self.filter_name_html(), + self.web_values_prefix() # display '| ' and name if present + webserver.content_send(string.format("💧 %2.0f%%", self.shadow_value != nil ? real(self.shadow_value) / 100 : nil)) end diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Sensor_Illuminance.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Sensor_Illuminance.be index be957a101..0358dd9b5 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Sensor_Illuminance.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Sensor_Illuminance.be @@ -99,8 +99,8 @@ class Matter_Plugin_Bridge_Sensor_Illuminance : Matter_Plugin_Bridge_Sensor def web_values() import webserver import string - webserver.content_send(string.format("| %s 🔅 %ilux", - self.filter_name_html(), + self.web_values_prefix() # display '| ' and name if present + webserver.content_send(string.format("🔅 %ilux", int(self.shadow_value))) end diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Sensor_Occupancy.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Sensor_Occupancy.be index 33bc9763f..ec244cf40 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Sensor_Occupancy.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Sensor_Occupancy.be @@ -107,8 +107,19 @@ class Matter_Plugin_Bridge_Sensor_Occupancy : Matter_Plugin_Bridge_HTTP def web_values() import webserver import string - webserver.content_send(string.format("| Occupancy%i %s", self.tasmota_switch_index, self.web_value_onoff(self.shadow_occupancy))) + self.web_values_prefix() # display '| ' and name if present + webserver.content_send(string.format("Occupancy%i %s", self.tasmota_switch_index, self.web_value_onoff(self.shadow_occupancy))) end + # Show prefix before web value + def web_values_prefix() + import webserver + import string + var name = self.get_name() + if !name + name = "Switch" + str(self.tasmota_switch_index) + end + webserver.content_send(string.format(self.PREFIX, name ? webserver.html_escape(name) : "")) + end end matter.Plugin_Bridge_Sensor_Occupancy = Matter_Plugin_Bridge_Sensor_Occupancy diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Sensor_Pressure.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Sensor_Pressure.be index 3e185d512..6aaa09d78 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Sensor_Pressure.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Sensor_Pressure.be @@ -92,8 +92,8 @@ class Matter_Plugin_Bridge_Sensor_Pressure : Matter_Plugin_Bridge_Sensor def web_values() import webserver import string - webserver.content_send(string.format("| %s ⛅ %i hPa", - self.filter_name_html(), + self.web_values_prefix() # display '| ' and name if present + webserver.content_send(string.format("⛅ %i hPa", int(self.shadow_value))) end diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Sensor_Temp.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Sensor_Temp.be index 5948cf5cd..e2817e6a6 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Sensor_Temp.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Sensor_Temp.be @@ -92,8 +92,8 @@ class Matter_Plugin_Bridge_Sensor_Temp : Matter_Plugin_Bridge_Sensor def web_values() import webserver import string - webserver.content_send(string.format("| %s ☀️ %.1f °C", - self.filter_name_html(), + self.web_values_prefix() # display '| ' and name if present + webserver.content_send(string.format("☀️ %.1f °C", self.shadow_value != nil ? real(self.shadow_value) / 100 : nil)) end diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Device.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Device.be index c35de9d4a..6a99e37a5 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Device.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Device.be @@ -27,7 +27,7 @@ class Matter_Plugin end class Matter_Plugin_Device : Matter_Plugin static var CLUSTERS = { # 0x001D: inherited # Descriptor Cluster 9.5 p.453 - 0x0039: [0x11], # Bridged Device Basic Information 9.13 p.485 + 0x0039: [5], # Bridged Device Basic Information 9.13 p.485 0x0003: [0,1,0xFFFC,0xFFFD], # Identify 1.2 p.16 0x0004: [0,0xFFFC,0xFFFD], # Groups 1.3 p.21 0x0005: [0,1,2,3,4,5,0xFFFC,0xFFFD], # Scenes 1.4 p.30 - no writable @@ -35,11 +35,22 @@ class Matter_Plugin_Device : Matter_Plugin static var TYPES = { 0x0013: 1 } # fake type static var NON_BRIDGE_VENDOR = [ 0x1217, 0x1381 ] # Fabric VendorID not supporting Bridge mode + var node_label # name of the endpoint, used only in bridge mode, "" if none + + def set_name(n) + if n != self.node_label + self.attribute_updated(0x0039, 0x0005) + end + self.node_label = n + end + def get_name() return self.node_label end + ############################################################# # Constructor - # def init(device, endpoint, arguments) - # super(self).init(device, endpoint, arguments) - # end + def init(device, endpoint, config) + self.node_label = config.find("name", "") + super(self).init(device, endpoint, config) + end ############################################################# # read an attribute @@ -103,7 +114,16 @@ class Matter_Plugin_Device : Matter_Plugin else return super(self).read_attribute(session, ctx) end - + + # ==================================================================================================== + elif cluster == 0x0039 # ========== Bridged Device Basic Information 9.13 p.485 ========== + + if attribute == 0x0005 # ---------- NodeLabel / string ---------- + return TLV.create_TLV(TLV.UTF1, self.get_name()) + else + return super(self).read_attribute(session, ctx) + end + else return super(self).read_attribute(session, ctx) end diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_UI.be b/lib/libesp32/berry_matter/src/embedded/Matter_UI.be index 398a3161a..21c1fafd2 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_UI.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_UI.be @@ -301,8 +301,14 @@ class Matter_UI webserver.content_send("" "

    Local sensors and devices

    " - "
    http:///
    " - "") + "
    #TypeParameter
    ") + webserver.content_send("" + "" + "" + "" + "" + "" + "") # display one line per plug-in self.device.plugins_config.remove("0") # remove any leftover from ancient configuration @@ -327,9 +333,10 @@ class Matter_UI found = true webserver.content_send(string.format("", ep)) - + webserver.content_send(string.format("", + ep, webserver.html_escape(conf.find('name', '')))) webserver.content_send(string.format("", self.plugin_name(conf.find('type', '')))) - webserver.content_send(string.format("", + webserver.content_send(string.format("", ep, webserver.html_escape(arg), cl ? webserver.html_escape(cl.ARG_HINT) : '')) webserver.content_send(string.format("" "") - webserver.content_send(string.format("", webserver.html_escape(url))) + webserver.content_send(format("", webserver.html_escape(url))) var i = 0 while i < size(config_list) @@ -669,23 +665,23 @@ class Matter_UI arg = cl.ui_conf_to_string(cl, config) end - webserver.content_send(string.format("", i)) - webserver.content_send(string.format("", i)) + webserver.content_send(format("" "") i += 1 end # empty line for new endpoint - webserver.content_send(string.format("", i)) - webserver.content_send(string.format("", i)) + webserver.content_send(format("" "") @@ -699,7 +695,7 @@ class Matter_UI webserver.content_send("") else - webserver.content_send(string.format("

    Unable to connect to '%s'

    ", webserver.html_escape(url))) + webserver.content_send(format("

    Unable to connect to '%s'

    ", webserver.html_escape(url))) end @@ -710,7 +706,6 @@ class Matter_UI ####################################################################### def page_part_mgr_add() import webserver - import string if !webserver.check_privileged_access() return nil end @@ -743,14 +738,14 @@ class Matter_UI # debug information about parameters for i:0..webserver.arg_size()-1 - tasmota.log(string.format("MTR: Arg%i '%s' = '%s'", i, webserver.arg_name(i), webserver.arg(i))) + tasmota.log(format("MTR: Arg%i '%s' = '%s'", i, webserver.arg_name(i), webserver.arg(i))) end #---------------------------------------------------------------------# # Change Passcode and/or Passcode #---------------------------------------------------------------------# if webserver.has_arg("passcode") || webserver.has_arg("discriminator") - tasmota.log(string.format("MTR: /matterc received '%s' command", 'passcode'), 3) + tasmota.log(format("MTR: /matterc received '%s' command", 'passcode'), 3) if webserver.has_arg("passcode") self.device.root_passcode = int(webserver.arg("passcode")) end @@ -769,10 +764,10 @@ class Matter_UI if matter_enabled_requested != self.matter_enabled() if matter_enabled_requested - tasmota.log(string.format("MTR: /matterc received '%s' command", 'enable'), 3) + tasmota.log(format("MTR: /matterc received '%s' command", 'enable'), 3) tasmota.cmd("SetOption" + str(matter.MATTER_OPTION) + " 1") else - tasmota.log(string.format("MTR: /matterc received '%s' command", 'disable'), 3) + tasmota.log(format("MTR: /matterc received '%s' command", 'disable'), 3) tasmota.cmd("SetOption" + str(matter.MATTER_OPTION) + " 0") end #- and force restart -# @@ -794,7 +789,7 @@ class Matter_UI # Delete Fabric #---------------------------------------------------------------------# elif webserver.has_arg("del_fabric") - tasmota.log(string.format("MTR: /matterc received '%s' command", 'del_fabric'), 3) + tasmota.log(format("MTR: /matterc received '%s' command", 'del_fabric'), 3) var del_fabric = int(webserver.arg("del_fabric")) var idx = 0 var fabrics = self.device.sessions.fabrics @@ -813,7 +808,7 @@ class Matter_UI # Reset to default auto-configuration #---------------------------------------------------------------------# elif webserver.has_arg("auto") - tasmota.log(string.format("MTR: /matterc received '%s' command", 'auto'), 3) + tasmota.log(format("MTR: /matterc received '%s' command", 'auto'), 3) self.device.plugins_persist = false self.device.save_param() #- and force restart -# @@ -823,7 +818,7 @@ class Matter_UI # Apply new configuration template #---------------------------------------------------------------------# elif webserver.has_arg("config") - tasmota.log(string.format("MTR: /matterc received '%s' command", 'config'), 3) + tasmota.log(format("MTR: /matterc received '%s' command", 'config'), 3) var needs_saving = false # iterate by endpoint number for i:0..webserver.arg_size()-1 @@ -837,25 +832,25 @@ class Matter_UI if conf_ep != nil # found var typ_class = self.device.plugins_classes.find(conf_ep.find('type', '')) if typ_class != nil - tasmota.log(string.format("MTR: ep=%i arg=%s", arg_ep, arg), 3) + tasmota.log(format("MTR: ep=%i arg=%s", arg_ep, arg), 3) # compute the actual value var prev_arg = typ_class.ui_conf_to_string(typ_class, conf_ep) var changed = (prev_arg != arg) - tasmota.log(string.format("MTR: ep=%i prev_arg='%s' arg='%s' %s", arg_ep, prev_arg, arg, prev_arg != arg ? "changed" : ""), 3) + tasmota.log(format("MTR: ep=%i prev_arg='%s' arg='%s' %s", arg_ep, prev_arg, arg, prev_arg != arg ? "changed" : ""), 3) if changed needs_saving = true typ_class.ui_string_to_conf(typ_class, conf_ep, arg) var pl = self.device.find_plugin_by_endpoint(arg_ep) if pl - tasmota.log(string.format("MTR: apply conf '%s' (%i) to %s", conf_ep, arg_ep, pl), 3) + tasmota.log(format("MTR: apply conf '%s' (%i) to %s", conf_ep, arg_ep, pl), 3) pl.parse_configuration(conf_ep) end end end else - tasmota.log(string.format("MTR: ep=%i not found", arg_ep), 3) + tasmota.log(format("MTR: ep=%i not found", arg_ep), 3) end elif string.find(arg_name, "nam") == 0 # 'nam' with i being the endpoint var nam_ep = int(arg_name[3..]) # target endpoint as int @@ -877,7 +872,7 @@ class Matter_UI else conf_ep.remove('name') end - tasmota.log(string.format("MTR: apply name '%s' (%i) to %s", conf_ep, nam_ep, pl), 3) + tasmota.log(format("MTR: apply name '%s' (%i) to %s", conf_ep, nam_ep, pl), 3) pl.parse_configuration(conf_ep) end end @@ -885,10 +880,10 @@ class Matter_UI end end - tasmota.log(string.format("MTR: config = %s", str(self.device.plugins_config)), 3) + tasmota.log(format("MTR: config = %s", str(self.device.plugins_config)), 3) if error - tasmota.log(string.format("MTR: config error = %s", error), 3) + tasmota.log(format("MTR: config error = %s", error), 3) else if needs_saving || !self.device.plugins_persist self.device.plugins_persist = true @@ -904,7 +899,7 @@ class Matter_UI var typ = webserver.arg('pi') var arg = webserver.arg('arg') var nam = webserver.arg('nam') - tasmota.log(string.format("MTR: add endpoint typ='%s' arg='%s'", typ, arg), 3) + tasmota.log(format("MTR: add endpoint typ='%s' arg='%s'", typ, arg), 3) # check if type exists var typ_class = self.device.plugins_classes.find(typ) @@ -944,12 +939,12 @@ class Matter_UI # check if configuration is already present var duplicate = false for c: self.device.plugins_config # iterate on values, not on keys() - # tasmota.log(string.format("MTR: map_compare '%s' ?= '%s' -> %s", str(c), str(config), str(self.equal_map(c,config))), 3) + # tasmota.log(format("MTR: map_compare '%s' ?= '%s' -> %s", str(c), str(config), str(self.equal_map(c,config))), 3) if self.equal_map(c,config) duplicate = true break end end # not a duplicate, add it if !duplicate - tasmota.log(string.format("MTR: remote add url='%s' type='%s' arg='%s'", url, typ, arg), 3) + tasmota.log(format("MTR: remote add url='%s' type='%s' arg='%s'", url, typ, arg), 3) self.device.bridge_add_endpoint(typ, config) end end @@ -984,18 +979,18 @@ class Matter_UI if error webserver.content_start("Parameter error") #- title of the web page -# webserver.content_send_style() #- send standard Tasmota styles -# - webserver.content_send(string.format("

    Error:%s

    ", webserver.html_escape(error))) + webserver.content_send(format("

    Error:%s

    ", webserver.html_escape(error))) webserver.content_button(webserver.BUTTON_CONFIGURATION) #- button back to configuration page -# webserver.content_stop() #- end of web page -# end except .. as e, m - tasmota.log(string.format("BRY: Exception> '%s' - %s", e, m), 2) + tasmota.log(format("BRY: Exception> '%s' - %s", e, m), 2) #- display error page -# webserver.content_start("Parameter error") #- title of the web page -# webserver.content_send_style() #- send standard Tasmota styles -# - webserver.content_send(string.format("

    Exception:
    '%s'
    %s

    ", e, m)) + webserver.content_send(format("

    Exception:
    '%s'
    %s

    ", e, m)) webserver.content_button(webserver.BUTTON_CONFIGURATION) #- button back to configuration page -# webserver.content_stop() #- end of web page -# @@ -1007,7 +1002,6 @@ class Matter_UI ####################################################################### def show_bridge_status() import webserver - import string var bridge_plugin_by_host var idx = 0 @@ -1034,7 +1028,7 @@ class Matter_UI for host: self.device.k2l(bridge_plugin_by_host) var host_html = webserver.html_escape(host) - webserver.content_send(string.format("
    ", host_html, host_html, host_html)) + webserver.content_send(format("", host_html, host_html, host_html)) var http_remote = bridge_plugin_by_host[host][0].http_remote # get the http_remote object from the first in list webserver.content_send(http_remote.web_last_seen()) @@ -1053,17 +1047,16 @@ class Matter_UI #- display sensor value in the web UI -# def web_sensor() import webserver - import string if self.matter_enabled() # mtc0 = close, mtc1 = open commissioning var fabrics_count = self.device.sessions.count_active_fabrics() if fabrics_count == 0 - webserver.content_send(string.format("
    %s
    ", "Matter: No active association")) + webserver.content_send(format("
    %s
    ", "Matter: No active association")) else var plural = fabrics_count > 1 - webserver.content_send(string.format("
    %s
    ", "Matter: " + str(fabrics_count) + " active association" + (plural ? "s" : ""))) + webserver.content_send(format("
    %s
    ", "Matter: " + str(fabrics_count) + " active association" + (plural ? "s" : ""))) end self.show_bridge_status() diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_inspect.be b/lib/libesp32/berry_matter/src/embedded/Matter_inspect.be index c5dfe0be4..832046b0a 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_inspect.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_inspect.be @@ -52,7 +52,6 @@ matter.jitter = jitter # debug function def inspect(p) try - import string import introspect var keys = [] @@ -66,7 +65,7 @@ def inspect(p) for k : keys var v = introspect.get(p, k) # if type(v) == 'string' v = string.escape(v, true) end - r.push(string.format("'%s': %s", str(k), str(v))) + r.push(format("'%s': %s", str(k), str(v))) end return "{" + r.concat(", ") + "}" diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Base38.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Base38.h index 2bef18e6f..7ef45645a 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Base38.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Base38.h @@ -19,7 +19,7 @@ be_local_closure(Matter_Base38_encode, /* name */ 1, /* has sup protos */ ( &(const struct bproto*[ 1]) { be_nested_proto( - 7, /* nstack */ + 6, /* nstack */ 2, /* argc */ 0, /* varg */ 0, /* has upvals */ @@ -27,31 +27,29 @@ be_local_closure(Matter_Base38_encode, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[ 5]) { /* constants */ - /* K0 */ be_nested_str_weak(string), - /* K1 */ be_nested_str_weak(0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_X2D_X2E), - /* K2 */ be_const_int(0), - /* K3 */ be_nested_str_weak(), - /* K4 */ be_const_int(1), + ( &(const bvalue[ 4]) { /* constants */ + /* K0 */ be_nested_str_weak(0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_X2D_X2E), + /* K1 */ be_const_int(0), + /* K2 */ be_nested_str_weak(), + /* K3 */ be_const_int(1), }), be_str_weak(b38_enc), &be_const_str_solidified, - ( &(const binstruction[15]) { /* code */ - 0xA40A0000, // 0000 IMPORT R2 K0 + ( &(const binstruction[14]) { /* code */ + 0x58080000, // 0000 LDCONST R2 K0 0x580C0001, // 0001 LDCONST R3 K1 0x58100002, // 0002 LDCONST R4 K2 - 0x58140003, // 0003 LDCONST R5 K3 - 0x14180801, // 0004 LT R6 R4 R1 - 0x781A0007, // 0005 JMPF R6 #000E - 0x541A0025, // 0006 LDINT R6 38 - 0x10180006, // 0007 MOD R6 R0 R6 - 0x94180606, // 0008 GETIDX R6 R3 R6 - 0x00140A06, // 0009 ADD R5 R5 R6 - 0x541A0025, // 000A LDINT R6 38 - 0x0C000006, // 000B DIV R0 R0 R6 - 0x00100904, // 000C ADD R4 R4 K4 - 0x7001FFF5, // 000D JMP #0004 - 0x80040A00, // 000E RET 1 R5 + 0x14140601, // 0003 LT R5 R3 R1 + 0x78160007, // 0004 JMPF R5 #000D + 0x54160025, // 0005 LDINT R5 38 + 0x10140005, // 0006 MOD R5 R0 R5 + 0x94140405, // 0007 GETIDX R5 R2 R5 + 0x00100805, // 0008 ADD R4 R4 R5 + 0x54160025, // 0009 LDINT R5 38 + 0x0C000005, // 000A DIV R0 R0 R5 + 0x000C0703, // 000B ADD R3 R3 K3 + 0x7001FFF5, // 000C JMP #0003 + 0x80040800, // 000D RET 1 R4 }) ), }), diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Commissioning.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Commissioning.h index fc766de36..da660771d 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Commissioning.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Commissioning.h @@ -195,7 +195,7 @@ be_local_closure(Matter_Commisioning_Context_every_second, /* name */ ********************************************************************/ be_local_closure(Matter_Commisioning_Context_add_session, /* name */ be_nested_proto( - 14, /* nstack */ + 12, /* nstack */ 6, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -203,42 +203,39 @@ be_local_closure(Matter_Commisioning_Context_add_session, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[ 9]) { /* constants */ - /* K0 */ be_nested_str_weak(string), - /* K1 */ be_nested_str_weak(tasmota), - /* K2 */ be_nested_str_weak(log), - /* K3 */ be_nested_str_weak(format), - /* K4 */ be_nested_str_weak(MTR_X3A_X20add_session_X20local_session_id_X3D_X25i_X20initiator_session_id_X3D_X25i), - /* K5 */ be_nested_str_weak(device), - /* K6 */ be_nested_str_weak(sessions), - /* K7 */ be_nested_str_weak(create_session), - /* K8 */ be_nested_str_weak(set_keys), + ( &(const bvalue[ 7]) { /* constants */ + /* K0 */ be_nested_str_weak(tasmota), + /* K1 */ be_nested_str_weak(log), + /* K2 */ be_nested_str_weak(MTR_X3A_X20add_session_X20local_session_id_X3D_X25i_X20initiator_session_id_X3D_X25i), + /* K3 */ be_nested_str_weak(device), + /* K4 */ be_nested_str_weak(sessions), + /* K5 */ be_nested_str_weak(create_session), + /* K6 */ be_nested_str_weak(set_keys), }), be_str_weak(add_session), &be_const_str_solidified, - ( &(const binstruction[22]) { /* code */ - 0xA41A0000, // 0000 IMPORT R6 K0 - 0xB81E0200, // 0001 GETNGBL R7 K1 - 0x8C1C0F02, // 0002 GETMET R7 R7 K2 - 0x8C240D03, // 0003 GETMET R9 R6 K3 - 0x582C0004, // 0004 LDCONST R11 K4 - 0x5C300200, // 0005 MOVE R12 R1 - 0x5C340400, // 0006 MOVE R13 R2 - 0x7C240800, // 0007 CALL R9 4 - 0x542A0003, // 0008 LDINT R10 4 - 0x7C1C0600, // 0009 CALL R7 3 - 0x881C0105, // 000A GETMBR R7 R0 K5 - 0x881C0F06, // 000B GETMBR R7 R7 K6 - 0x8C1C0F07, // 000C GETMET R7 R7 K7 - 0x5C240200, // 000D MOVE R9 R1 - 0x5C280400, // 000E MOVE R10 R2 - 0x7C1C0600, // 000F CALL R7 3 - 0x8C200F08, // 0010 GETMET R8 R7 K8 - 0x5C280600, // 0011 MOVE R10 R3 - 0x5C2C0800, // 0012 MOVE R11 R4 - 0x5C300A00, // 0013 MOVE R12 R5 - 0x7C200800, // 0014 CALL R8 4 - 0x80000000, // 0015 RET 0 + ( &(const binstruction[21]) { /* code */ + 0xB81A0000, // 0000 GETNGBL R6 K0 + 0x8C180D01, // 0001 GETMET R6 R6 K1 + 0x60200018, // 0002 GETGBL R8 G24 + 0x58240002, // 0003 LDCONST R9 K2 + 0x5C280200, // 0004 MOVE R10 R1 + 0x5C2C0400, // 0005 MOVE R11 R2 + 0x7C200600, // 0006 CALL R8 3 + 0x54260003, // 0007 LDINT R9 4 + 0x7C180600, // 0008 CALL R6 3 + 0x88180103, // 0009 GETMBR R6 R0 K3 + 0x88180D04, // 000A GETMBR R6 R6 K4 + 0x8C180D05, // 000B GETMET R6 R6 K5 + 0x5C200200, // 000C MOVE R8 R1 + 0x5C240400, // 000D MOVE R9 R2 + 0x7C180600, // 000E CALL R6 3 + 0x8C1C0D06, // 000F GETMET R7 R6 K6 + 0x5C240600, // 0010 MOVE R9 R3 + 0x5C280800, // 0011 MOVE R10 R4 + 0x5C2C0A00, // 0012 MOVE R11 R5 + 0x7C1C0800, // 0013 CALL R7 4 + 0x80000000, // 0014 RET 0 }) ) ); @@ -250,7 +247,7 @@ be_local_closure(Matter_Commisioning_Context_add_session, /* name */ ********************************************************************/ be_local_closure(Matter_Commisioning_Context_parse_PBKDFParamRequest, /* name */ be_nested_proto( - 14, /* nstack */ + 12, /* nstack */ 2, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -258,180 +255,177 @@ be_local_closure(Matter_Commisioning_Context_parse_PBKDFParamRequest, /* name 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[50]) { /* constants */ + ( &(const bvalue[48]) { /* constants */ /* K0 */ be_nested_str_weak(crypto), - /* K1 */ be_nested_str_weak(string), - /* K2 */ be_nested_str_weak(session), - /* K3 */ be_nested_str_weak(opcode), - /* K4 */ be_nested_str_weak(local_session_id), - /* K5 */ be_const_int(0), - /* K6 */ be_nested_str_weak(protocol_id), - /* K7 */ be_nested_str_weak(tasmota), - /* K8 */ be_nested_str_weak(log), - /* K9 */ be_nested_str_weak(MTR_X3A_X20invalid_X20PBKDFParamRequest_X20message), - /* K10 */ be_const_int(2), - /* K11 */ be_nested_str_weak(MTR_X3A_X20StatusReport_X28General_X20Code_X3A_X20FAILURE_X2C_X20ProtocolId_X3A_X20SECURE_CHANNEL_X2C_X20ProtocolCode_X3A_X20INVALID_PARAMETER_X29), - /* K12 */ be_const_int(3), - /* K13 */ be_nested_str_weak(send_status_report), - /* K14 */ be_const_int(1), - /* K15 */ be_nested_str_weak(matter), - /* K16 */ be_nested_str_weak(PBKDFParamRequest), - /* K17 */ be_nested_str_weak(parse), - /* K18 */ be_nested_str_weak(raw), - /* K19 */ be_nested_str_weak(app_payload_idx), - /* K20 */ be_nested_str_weak(set_mode_PASE), - /* K21 */ be_nested_str_weak(__Msg1), - /* K22 */ be_const_int(2147483647), - /* K23 */ be_nested_str_weak(passcodeId), - /* K24 */ be_nested_str_weak(MTR_X3A_X20non_X2Dzero_X20passcode_X20id), - /* K25 */ be_nested_str_weak(__future_initiator_session_id), - /* K26 */ be_nested_str_weak(initiator_session_id), - /* K27 */ be_nested_str_weak(__future_local_session_id), - /* K28 */ be_nested_str_weak(device), - /* K29 */ be_nested_str_weak(sessions), - /* K30 */ be_nested_str_weak(gen_local_session_id), - /* K31 */ be_nested_str_weak(format), - /* K32 */ be_nested_str_weak(MTR_X3A_X20New_Session_X28_X256i_X29_X20from_X20_X27_X5B_X25s_X5D_X3A_X25i_X27), - /* K33 */ be_nested_str_weak(remote_ip), - /* K34 */ be_nested_str_weak(remote_port), - /* K35 */ be_nested_str_weak(PBKDFParamResponse), - /* K36 */ be_nested_str_weak(initiatorRandom), - /* K37 */ be_nested_str_weak(responderRandom), - /* K38 */ be_nested_str_weak(random), - /* K39 */ be_nested_str_weak(responderSessionId), - /* K40 */ be_nested_str_weak(pbkdf_parameters_salt), - /* K41 */ be_nested_str_weak(commissioning_salt), - /* K42 */ be_nested_str_weak(pbkdf_parameters_iterations), - /* K43 */ be_nested_str_weak(commissioning_iterations), - /* K44 */ be_nested_str_weak(tlv2raw), - /* K45 */ be_nested_str_weak(__Msg2), - /* K46 */ be_nested_str_weak(build_response), - /* K47 */ be_nested_str_weak(encode_frame), - /* K48 */ be_nested_str_weak(responder), - /* K49 */ be_nested_str_weak(send_response_frame), + /* K1 */ be_nested_str_weak(session), + /* K2 */ be_nested_str_weak(opcode), + /* K3 */ be_nested_str_weak(local_session_id), + /* K4 */ be_const_int(0), + /* K5 */ be_nested_str_weak(protocol_id), + /* K6 */ be_nested_str_weak(tasmota), + /* K7 */ be_nested_str_weak(log), + /* K8 */ be_nested_str_weak(MTR_X3A_X20invalid_X20PBKDFParamRequest_X20message), + /* K9 */ be_const_int(2), + /* K10 */ be_nested_str_weak(MTR_X3A_X20StatusReport_X28General_X20Code_X3A_X20FAILURE_X2C_X20ProtocolId_X3A_X20SECURE_CHANNEL_X2C_X20ProtocolCode_X3A_X20INVALID_PARAMETER_X29), + /* K11 */ be_const_int(3), + /* K12 */ be_nested_str_weak(send_status_report), + /* K13 */ be_const_int(1), + /* K14 */ be_nested_str_weak(matter), + /* K15 */ be_nested_str_weak(PBKDFParamRequest), + /* K16 */ be_nested_str_weak(parse), + /* K17 */ be_nested_str_weak(raw), + /* K18 */ be_nested_str_weak(app_payload_idx), + /* K19 */ be_nested_str_weak(set_mode_PASE), + /* K20 */ be_nested_str_weak(__Msg1), + /* K21 */ be_const_int(2147483647), + /* K22 */ be_nested_str_weak(passcodeId), + /* K23 */ be_nested_str_weak(MTR_X3A_X20non_X2Dzero_X20passcode_X20id), + /* K24 */ be_nested_str_weak(__future_initiator_session_id), + /* K25 */ be_nested_str_weak(initiator_session_id), + /* K26 */ be_nested_str_weak(__future_local_session_id), + /* K27 */ be_nested_str_weak(device), + /* K28 */ be_nested_str_weak(sessions), + /* K29 */ be_nested_str_weak(gen_local_session_id), + /* K30 */ be_nested_str_weak(MTR_X3A_X20New_Session_X28_X256i_X29_X20from_X20_X27_X5B_X25s_X5D_X3A_X25i_X27), + /* K31 */ be_nested_str_weak(remote_ip), + /* K32 */ be_nested_str_weak(remote_port), + /* K33 */ be_nested_str_weak(PBKDFParamResponse), + /* K34 */ be_nested_str_weak(initiatorRandom), + /* K35 */ be_nested_str_weak(responderRandom), + /* K36 */ be_nested_str_weak(random), + /* K37 */ be_nested_str_weak(responderSessionId), + /* K38 */ be_nested_str_weak(pbkdf_parameters_salt), + /* K39 */ be_nested_str_weak(commissioning_salt), + /* K40 */ be_nested_str_weak(pbkdf_parameters_iterations), + /* K41 */ be_nested_str_weak(commissioning_iterations), + /* K42 */ be_nested_str_weak(tlv2raw), + /* K43 */ be_nested_str_weak(__Msg2), + /* K44 */ be_nested_str_weak(build_response), + /* K45 */ be_nested_str_weak(encode_frame), + /* K46 */ be_nested_str_weak(responder), + /* K47 */ be_nested_str_weak(send_response_frame), }), be_str_weak(parse_PBKDFParamRequest), &be_const_str_solidified, - ( &(const binstruction[119]) { /* code */ + ( &(const binstruction[118]) { /* code */ 0xA40A0000, // 0000 IMPORT R2 K0 - 0xA40E0200, // 0001 IMPORT R3 K1 + 0x880C0301, // 0001 GETMBR R3 R1 K1 0x88100302, // 0002 GETMBR R4 R1 K2 - 0x88140303, // 0003 GETMBR R5 R1 K3 - 0x541A001F, // 0004 LDINT R6 32 - 0x20140A06, // 0005 NE R5 R5 R6 - 0x74160005, // 0006 JMPT R5 #000D - 0x88140304, // 0007 GETMBR R5 R1 K4 - 0x20140B05, // 0008 NE R5 R5 K5 - 0x74160002, // 0009 JMPT R5 #000D - 0x88140306, // 000A GETMBR R5 R1 K6 - 0x20140B05, // 000B NE R5 R5 K5 - 0x78160012, // 000C JMPF R5 #0020 - 0xB8160E00, // 000D GETNGBL R5 K7 - 0x8C140B08, // 000E GETMET R5 R5 K8 + 0x5416001F, // 0003 LDINT R5 32 + 0x20100805, // 0004 NE R4 R4 R5 + 0x74120005, // 0005 JMPT R4 #000C + 0x88100303, // 0006 GETMBR R4 R1 K3 + 0x20100904, // 0007 NE R4 R4 K4 + 0x74120002, // 0008 JMPT R4 #000C + 0x88100305, // 0009 GETMBR R4 R1 K5 + 0x20100904, // 000A NE R4 R4 K4 + 0x78120012, // 000B JMPF R4 #001F + 0xB8120C00, // 000C GETNGBL R4 K6 + 0x8C100907, // 000D GETMET R4 R4 K7 + 0x58180008, // 000E LDCONST R6 K8 0x581C0009, // 000F LDCONST R7 K9 - 0x5820000A, // 0010 LDCONST R8 K10 - 0x7C140600, // 0011 CALL R5 3 - 0xB8160E00, // 0012 GETNGBL R5 K7 - 0x8C140B08, // 0013 GETMET R5 R5 K8 + 0x7C100600, // 0010 CALL R4 3 + 0xB8120C00, // 0011 GETNGBL R4 K6 + 0x8C100907, // 0012 GETMET R4 R4 K7 + 0x5818000A, // 0013 LDCONST R6 K10 0x581C000B, // 0014 LDCONST R7 K11 - 0x5820000C, // 0015 LDCONST R8 K12 - 0x7C140600, // 0016 CALL R5 3 - 0x8C14010D, // 0017 GETMET R5 R0 K13 - 0x5C1C0200, // 0018 MOVE R7 R1 - 0x5820000E, // 0019 LDCONST R8 K14 - 0x58240005, // 001A LDCONST R9 K5 - 0x5828000A, // 001B LDCONST R10 K10 - 0x502C0000, // 001C LDBOOL R11 0 0 - 0x7C140C00, // 001D CALL R5 6 - 0x50140000, // 001E LDBOOL R5 0 0 - 0x80040A00, // 001F RET 1 R5 - 0xB8161E00, // 0020 GETNGBL R5 K15 - 0x8C140B10, // 0021 GETMET R5 R5 K16 - 0x7C140200, // 0022 CALL R5 1 - 0x8C140B11, // 0023 GETMET R5 R5 K17 + 0x7C100600, // 0015 CALL R4 3 + 0x8C10010C, // 0016 GETMET R4 R0 K12 + 0x5C180200, // 0017 MOVE R6 R1 + 0x581C000D, // 0018 LDCONST R7 K13 + 0x58200004, // 0019 LDCONST R8 K4 + 0x58240009, // 001A LDCONST R9 K9 + 0x50280000, // 001B LDBOOL R10 0 0 + 0x7C100C00, // 001C CALL R4 6 + 0x50100000, // 001D LDBOOL R4 0 0 + 0x80040800, // 001E RET 1 R4 + 0xB8121C00, // 001F GETNGBL R4 K14 + 0x8C10090F, // 0020 GETMET R4 R4 K15 + 0x7C100200, // 0021 CALL R4 1 + 0x8C100910, // 0022 GETMET R4 R4 K16 + 0x88180311, // 0023 GETMBR R6 R1 K17 0x881C0312, // 0024 GETMBR R7 R1 K18 - 0x88200313, // 0025 GETMBR R8 R1 K19 - 0x7C140600, // 0026 CALL R5 3 - 0x88180302, // 0027 GETMBR R6 R1 K2 - 0x8C180D14, // 0028 GETMET R6 R6 K20 - 0x7C180200, // 0029 CALL R6 1 - 0x88180313, // 002A GETMBR R6 R1 K19 - 0x40180D16, // 002B CONNECT R6 R6 K22 - 0x881C0312, // 002C GETMBR R7 R1 K18 - 0x94180E06, // 002D GETIDX R6 R7 R6 - 0x90122A06, // 002E SETMBR R4 K21 R6 - 0x88180B17, // 002F GETMBR R6 R5 K23 - 0x20180D05, // 0030 NE R6 R6 K5 - 0x781A0012, // 0031 JMPF R6 #0045 - 0xB81A0E00, // 0032 GETNGBL R6 K7 - 0x8C180D08, // 0033 GETMET R6 R6 K8 - 0x58200018, // 0034 LDCONST R8 K24 - 0x5824000A, // 0035 LDCONST R9 K10 - 0x7C180600, // 0036 CALL R6 3 - 0xB81A0E00, // 0037 GETNGBL R6 K7 - 0x8C180D08, // 0038 GETMET R6 R6 K8 + 0x7C100600, // 0025 CALL R4 3 + 0x88140301, // 0026 GETMBR R5 R1 K1 + 0x8C140B13, // 0027 GETMET R5 R5 K19 + 0x7C140200, // 0028 CALL R5 1 + 0x88140312, // 0029 GETMBR R5 R1 K18 + 0x40140B15, // 002A CONNECT R5 R5 K21 + 0x88180311, // 002B GETMBR R6 R1 K17 + 0x94140C05, // 002C GETIDX R5 R6 R5 + 0x900E2805, // 002D SETMBR R3 K20 R5 + 0x88140916, // 002E GETMBR R5 R4 K22 + 0x20140B04, // 002F NE R5 R5 K4 + 0x78160012, // 0030 JMPF R5 #0044 + 0xB8160C00, // 0031 GETNGBL R5 K6 + 0x8C140B07, // 0032 GETMET R5 R5 K7 + 0x581C0017, // 0033 LDCONST R7 K23 + 0x58200009, // 0034 LDCONST R8 K9 + 0x7C140600, // 0035 CALL R5 3 + 0xB8160C00, // 0036 GETNGBL R5 K6 + 0x8C140B07, // 0037 GETMET R5 R5 K7 + 0x581C000A, // 0038 LDCONST R7 K10 0x5820000B, // 0039 LDCONST R8 K11 - 0x5824000C, // 003A LDCONST R9 K12 - 0x7C180600, // 003B CALL R6 3 - 0x8C18010D, // 003C GETMET R6 R0 K13 - 0x5C200200, // 003D MOVE R8 R1 - 0x5824000E, // 003E LDCONST R9 K14 - 0x58280005, // 003F LDCONST R10 K5 - 0x582C000A, // 0040 LDCONST R11 K10 - 0x50300000, // 0041 LDBOOL R12 0 0 - 0x7C180C00, // 0042 CALL R6 6 - 0x50180000, // 0043 LDBOOL R6 0 0 - 0x80040C00, // 0044 RET 1 R6 - 0x88180B1A, // 0045 GETMBR R6 R5 K26 - 0x90123206, // 0046 SETMBR R4 K25 R6 - 0x8818011C, // 0047 GETMBR R6 R0 K28 - 0x88180D1D, // 0048 GETMBR R6 R6 K29 - 0x8C180D1E, // 0049 GETMET R6 R6 K30 - 0x7C180200, // 004A CALL R6 1 - 0x90123606, // 004B SETMBR R4 K27 R6 - 0xB81A0E00, // 004C GETNGBL R6 K7 - 0x8C180D08, // 004D GETMET R6 R6 K8 - 0x8C20071F, // 004E GETMET R8 R3 K31 - 0x58280020, // 004F LDCONST R10 K32 - 0x882C091B, // 0050 GETMBR R11 R4 K27 - 0x88300321, // 0051 GETMBR R12 R1 K33 - 0x88340322, // 0052 GETMBR R13 R1 K34 - 0x7C200A00, // 0053 CALL R8 5 - 0x5824000C, // 0054 LDCONST R9 K12 - 0x7C180600, // 0055 CALL R6 3 - 0xB81A1E00, // 0056 GETNGBL R6 K15 - 0x8C180D23, // 0057 GETMET R6 R6 K35 - 0x7C180200, // 0058 CALL R6 1 - 0x881C0B24, // 0059 GETMBR R7 R5 K36 - 0x901A4807, // 005A SETMBR R6 K36 R7 - 0x8C1C0526, // 005B GETMET R7 R2 K38 - 0x5426001F, // 005C LDINT R9 32 - 0x7C1C0400, // 005D CALL R7 2 - 0x901A4A07, // 005E SETMBR R6 K37 R7 - 0x881C091B, // 005F GETMBR R7 R4 K27 - 0x901A4E07, // 0060 SETMBR R6 K39 R7 - 0x881C011C, // 0061 GETMBR R7 R0 K28 - 0x881C0F29, // 0062 GETMBR R7 R7 K41 - 0x901A5007, // 0063 SETMBR R6 K40 R7 - 0x881C011C, // 0064 GETMBR R7 R0 K28 - 0x881C0F2B, // 0065 GETMBR R7 R7 K43 - 0x901A5407, // 0066 SETMBR R6 K42 R7 - 0x8C1C0D2C, // 0067 GETMET R7 R6 K44 - 0x7C1C0200, // 0068 CALL R7 1 - 0x90125A07, // 0069 SETMBR R4 K45 R7 - 0x8C20032E, // 006A GETMET R8 R1 K46 - 0x542A0020, // 006B LDINT R10 33 - 0x502C0200, // 006C LDBOOL R11 1 0 - 0x7C200600, // 006D CALL R8 3 - 0x8C24112F, // 006E GETMET R9 R8 K47 - 0x5C2C0E00, // 006F MOVE R11 R7 - 0x7C240400, // 0070 CALL R9 2 - 0x88280130, // 0071 GETMBR R10 R0 K48 - 0x8C281531, // 0072 GETMET R10 R10 K49 - 0x5C301000, // 0073 MOVE R12 R8 - 0x7C280400, // 0074 CALL R10 2 - 0x50280200, // 0075 LDBOOL R10 1 0 - 0x80041400, // 0076 RET 1 R10 + 0x7C140600, // 003A CALL R5 3 + 0x8C14010C, // 003B GETMET R5 R0 K12 + 0x5C1C0200, // 003C MOVE R7 R1 + 0x5820000D, // 003D LDCONST R8 K13 + 0x58240004, // 003E LDCONST R9 K4 + 0x58280009, // 003F LDCONST R10 K9 + 0x502C0000, // 0040 LDBOOL R11 0 0 + 0x7C140C00, // 0041 CALL R5 6 + 0x50140000, // 0042 LDBOOL R5 0 0 + 0x80040A00, // 0043 RET 1 R5 + 0x88140919, // 0044 GETMBR R5 R4 K25 + 0x900E3005, // 0045 SETMBR R3 K24 R5 + 0x8814011B, // 0046 GETMBR R5 R0 K27 + 0x88140B1C, // 0047 GETMBR R5 R5 K28 + 0x8C140B1D, // 0048 GETMET R5 R5 K29 + 0x7C140200, // 0049 CALL R5 1 + 0x900E3405, // 004A SETMBR R3 K26 R5 + 0xB8160C00, // 004B GETNGBL R5 K6 + 0x8C140B07, // 004C GETMET R5 R5 K7 + 0x601C0018, // 004D GETGBL R7 G24 + 0x5820001E, // 004E LDCONST R8 K30 + 0x8824071A, // 004F GETMBR R9 R3 K26 + 0x8828031F, // 0050 GETMBR R10 R1 K31 + 0x882C0320, // 0051 GETMBR R11 R1 K32 + 0x7C1C0800, // 0052 CALL R7 4 + 0x5820000B, // 0053 LDCONST R8 K11 + 0x7C140600, // 0054 CALL R5 3 + 0xB8161C00, // 0055 GETNGBL R5 K14 + 0x8C140B21, // 0056 GETMET R5 R5 K33 + 0x7C140200, // 0057 CALL R5 1 + 0x88180922, // 0058 GETMBR R6 R4 K34 + 0x90164406, // 0059 SETMBR R5 K34 R6 + 0x8C180524, // 005A GETMET R6 R2 K36 + 0x5422001F, // 005B LDINT R8 32 + 0x7C180400, // 005C CALL R6 2 + 0x90164606, // 005D SETMBR R5 K35 R6 + 0x8818071A, // 005E GETMBR R6 R3 K26 + 0x90164A06, // 005F SETMBR R5 K37 R6 + 0x8818011B, // 0060 GETMBR R6 R0 K27 + 0x88180D27, // 0061 GETMBR R6 R6 K39 + 0x90164C06, // 0062 SETMBR R5 K38 R6 + 0x8818011B, // 0063 GETMBR R6 R0 K27 + 0x88180D29, // 0064 GETMBR R6 R6 K41 + 0x90165006, // 0065 SETMBR R5 K40 R6 + 0x8C180B2A, // 0066 GETMET R6 R5 K42 + 0x7C180200, // 0067 CALL R6 1 + 0x900E5606, // 0068 SETMBR R3 K43 R6 + 0x8C1C032C, // 0069 GETMET R7 R1 K44 + 0x54260020, // 006A LDINT R9 33 + 0x50280200, // 006B LDBOOL R10 1 0 + 0x7C1C0600, // 006C CALL R7 3 + 0x8C200F2D, // 006D GETMET R8 R7 K45 + 0x5C280C00, // 006E MOVE R10 R6 + 0x7C200400, // 006F CALL R8 2 + 0x8824012E, // 0070 GETMBR R9 R0 K46 + 0x8C24132F, // 0071 GETMET R9 R9 K47 + 0x5C2C0E00, // 0072 MOVE R11 R7 + 0x7C240400, // 0073 CALL R9 2 + 0x50240200, // 0074 LDBOOL R9 1 0 + 0x80041200, // 0075 RET 1 R9 }) ) ); @@ -499,7 +493,7 @@ be_local_closure(Matter_Commisioning_Context_send_status_report, /* name */ ********************************************************************/ be_local_closure(Matter_Commisioning_Context_parse_Pake1, /* name */ be_nested_proto( - 23, /* nstack */ + 21, /* nstack */ 2, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -507,180 +501,177 @@ be_local_closure(Matter_Commisioning_Context_parse_Pake1, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[54]) { /* constants */ + ( &(const bvalue[52]) { /* constants */ /* K0 */ be_nested_str_weak(crypto), - /* K1 */ be_nested_str_weak(string), - /* K2 */ be_nested_str_weak(session), - /* K3 */ be_nested_str_weak(opcode), - /* K4 */ be_nested_str_weak(local_session_id), - /* K5 */ be_const_int(0), - /* K6 */ be_nested_str_weak(protocol_id), - /* K7 */ be_nested_str_weak(tasmota), - /* K8 */ be_nested_str_weak(log), - /* K9 */ be_nested_str_weak(MTR_X3A_X20invalid_X20Pake1_X20message), - /* K10 */ be_const_int(3), - /* K11 */ be_nested_str_weak(MTR_X3A_X20StatusReport_X28General_X20Code_X3A_X20FAILURE_X2C_X20ProtocolId_X3A_X20SECURE_CHANNEL_X2C_X20ProtocolCode_X3A_X20INVALID_PARAMETER_X29), - /* K12 */ be_nested_str_weak(send_status_report), - /* K13 */ be_const_int(1), - /* K14 */ be_const_int(2), - /* K15 */ be_nested_str_weak(matter), - /* K16 */ be_nested_str_weak(Pake1), - /* K17 */ be_nested_str_weak(parse), - /* K18 */ be_nested_str_weak(raw), - /* K19 */ be_nested_str_weak(app_payload_idx), - /* K20 */ be_nested_str_weak(pA), - /* K21 */ be_nested_str_weak(SPAKE2P_Matter), - /* K22 */ be_nested_str_weak(device), - /* K23 */ be_nested_str_weak(commissioning_w0), - /* K24 */ be_nested_str_weak(commissioning_L), - /* K25 */ be_nested_str_weak(random), - /* K26 */ be_nested_str_weak(compute_pB), - /* K27 */ be_nested_str_weak(compute_ZV_verifier), - /* K28 */ be_nested_str_weak(SHA256), - /* K29 */ be_nested_str_weak(update), - /* K30 */ be_nested_str_weak(fromstring), - /* K31 */ be_nested_str_weak(Matter_Context_Prefix), - /* K32 */ be_nested_str_weak(__Msg1), - /* K33 */ be_nested_str_weak(__Msg2), - /* K34 */ be_nested_str_weak(out), - /* K35 */ be_nested_str_weak(set_context), - /* K36 */ be_nested_str_weak(compute_TT_hash), - /* K37 */ be_nested_str_weak(Pake2), - /* K38 */ be_nested_str_weak(pB), - /* K39 */ be_nested_str_weak(cB), - /* K40 */ be_nested_str_weak(tlv2raw), - /* K41 */ be_nested_str_weak(__spake_cA), - /* K42 */ be_nested_str_weak(cA), - /* K43 */ be_nested_str_weak(__spake_Ke), - /* K44 */ be_nested_str_weak(Ke), - /* K45 */ be_nested_str_weak(build_response), - /* K46 */ be_nested_str_weak(encode_frame), - /* K47 */ be_nested_str_weak(format), - /* K48 */ be_nested_str_weak(MTR_X3A_X20New_X20Commissioning_X20_X28PASE_X20id_X3D_X25i_X29_X20from_X20_X5B_X25s_X5D_X3A_X25i), - /* K49 */ be_nested_str_weak(__future_local_session_id), - /* K50 */ be_nested_str_weak(_ip), - /* K51 */ be_nested_str_weak(_port), - /* K52 */ be_nested_str_weak(responder), - /* K53 */ be_nested_str_weak(send_response_frame), + /* K1 */ be_nested_str_weak(session), + /* K2 */ be_nested_str_weak(opcode), + /* K3 */ be_nested_str_weak(local_session_id), + /* K4 */ be_const_int(0), + /* K5 */ be_nested_str_weak(protocol_id), + /* K6 */ be_nested_str_weak(tasmota), + /* K7 */ be_nested_str_weak(log), + /* K8 */ be_nested_str_weak(MTR_X3A_X20invalid_X20Pake1_X20message), + /* K9 */ be_const_int(3), + /* K10 */ be_nested_str_weak(MTR_X3A_X20StatusReport_X28General_X20Code_X3A_X20FAILURE_X2C_X20ProtocolId_X3A_X20SECURE_CHANNEL_X2C_X20ProtocolCode_X3A_X20INVALID_PARAMETER_X29), + /* K11 */ be_nested_str_weak(send_status_report), + /* K12 */ be_const_int(1), + /* K13 */ be_const_int(2), + /* K14 */ be_nested_str_weak(matter), + /* K15 */ be_nested_str_weak(Pake1), + /* K16 */ be_nested_str_weak(parse), + /* K17 */ be_nested_str_weak(raw), + /* K18 */ be_nested_str_weak(app_payload_idx), + /* K19 */ be_nested_str_weak(pA), + /* K20 */ be_nested_str_weak(SPAKE2P_Matter), + /* K21 */ be_nested_str_weak(device), + /* K22 */ be_nested_str_weak(commissioning_w0), + /* K23 */ be_nested_str_weak(commissioning_L), + /* K24 */ be_nested_str_weak(random), + /* K25 */ be_nested_str_weak(compute_pB), + /* K26 */ be_nested_str_weak(compute_ZV_verifier), + /* K27 */ be_nested_str_weak(SHA256), + /* K28 */ be_nested_str_weak(update), + /* K29 */ be_nested_str_weak(fromstring), + /* K30 */ be_nested_str_weak(Matter_Context_Prefix), + /* K31 */ be_nested_str_weak(__Msg1), + /* K32 */ be_nested_str_weak(__Msg2), + /* K33 */ be_nested_str_weak(out), + /* K34 */ be_nested_str_weak(set_context), + /* K35 */ be_nested_str_weak(compute_TT_hash), + /* K36 */ be_nested_str_weak(Pake2), + /* K37 */ be_nested_str_weak(pB), + /* K38 */ be_nested_str_weak(cB), + /* K39 */ be_nested_str_weak(tlv2raw), + /* K40 */ be_nested_str_weak(__spake_cA), + /* K41 */ be_nested_str_weak(cA), + /* K42 */ be_nested_str_weak(__spake_Ke), + /* K43 */ be_nested_str_weak(Ke), + /* K44 */ be_nested_str_weak(build_response), + /* K45 */ be_nested_str_weak(encode_frame), + /* K46 */ be_nested_str_weak(MTR_X3A_X20New_X20Commissioning_X20_X28PASE_X20id_X3D_X25i_X29_X20from_X20_X5B_X25s_X5D_X3A_X25i), + /* K47 */ be_nested_str_weak(__future_local_session_id), + /* K48 */ be_nested_str_weak(_ip), + /* K49 */ be_nested_str_weak(_port), + /* K50 */ be_nested_str_weak(responder), + /* K51 */ be_nested_str_weak(send_response_frame), }), be_str_weak(parse_Pake1), &be_const_str_solidified, - ( &(const binstruction[115]) { /* code */ + ( &(const binstruction[114]) { /* code */ 0xA40A0000, // 0000 IMPORT R2 K0 - 0xA40E0200, // 0001 IMPORT R3 K1 + 0x880C0301, // 0001 GETMBR R3 R1 K1 0x88100302, // 0002 GETMBR R4 R1 K2 - 0x88140303, // 0003 GETMBR R5 R1 K3 - 0x541A0021, // 0004 LDINT R6 34 - 0x20140A06, // 0005 NE R5 R5 R6 - 0x74160005, // 0006 JMPT R5 #000D - 0x88140304, // 0007 GETMBR R5 R1 K4 - 0x20140B05, // 0008 NE R5 R5 K5 - 0x74160002, // 0009 JMPT R5 #000D - 0x88140306, // 000A GETMBR R5 R1 K6 - 0x20140B05, // 000B NE R5 R5 K5 - 0x78160012, // 000C JMPF R5 #0020 - 0xB8160E00, // 000D GETNGBL R5 K7 - 0x8C140B08, // 000E GETMET R5 R5 K8 + 0x54160021, // 0003 LDINT R5 34 + 0x20100805, // 0004 NE R4 R4 R5 + 0x74120005, // 0005 JMPT R4 #000C + 0x88100303, // 0006 GETMBR R4 R1 K3 + 0x20100904, // 0007 NE R4 R4 K4 + 0x74120002, // 0008 JMPT R4 #000C + 0x88100305, // 0009 GETMBR R4 R1 K5 + 0x20100904, // 000A NE R4 R4 K4 + 0x78120012, // 000B JMPF R4 #001F + 0xB8120C00, // 000C GETNGBL R4 K6 + 0x8C100907, // 000D GETMET R4 R4 K7 + 0x58180008, // 000E LDCONST R6 K8 0x581C0009, // 000F LDCONST R7 K9 - 0x5820000A, // 0010 LDCONST R8 K10 - 0x7C140600, // 0011 CALL R5 3 - 0xB8160E00, // 0012 GETNGBL R5 K7 - 0x8C140B08, // 0013 GETMET R5 R5 K8 - 0x581C000B, // 0014 LDCONST R7 K11 - 0x5820000A, // 0015 LDCONST R8 K10 - 0x7C140600, // 0016 CALL R5 3 - 0x8C14010C, // 0017 GETMET R5 R0 K12 - 0x5C1C0200, // 0018 MOVE R7 R1 - 0x5820000D, // 0019 LDCONST R8 K13 - 0x58240005, // 001A LDCONST R9 K5 - 0x5828000E, // 001B LDCONST R10 K14 - 0x502C0000, // 001C LDBOOL R11 0 0 - 0x7C140C00, // 001D CALL R5 6 - 0x50140000, // 001E LDBOOL R5 0 0 - 0x80040A00, // 001F RET 1 R5 - 0xB8161E00, // 0020 GETNGBL R5 K15 - 0x8C140B10, // 0021 GETMET R5 R5 K16 - 0x7C140200, // 0022 CALL R5 1 - 0x8C140B11, // 0023 GETMET R5 R5 K17 + 0x7C100600, // 0010 CALL R4 3 + 0xB8120C00, // 0011 GETNGBL R4 K6 + 0x8C100907, // 0012 GETMET R4 R4 K7 + 0x5818000A, // 0013 LDCONST R6 K10 + 0x581C0009, // 0014 LDCONST R7 K9 + 0x7C100600, // 0015 CALL R4 3 + 0x8C10010B, // 0016 GETMET R4 R0 K11 + 0x5C180200, // 0017 MOVE R6 R1 + 0x581C000C, // 0018 LDCONST R7 K12 + 0x58200004, // 0019 LDCONST R8 K4 + 0x5824000D, // 001A LDCONST R9 K13 + 0x50280000, // 001B LDBOOL R10 0 0 + 0x7C100C00, // 001C CALL R4 6 + 0x50100000, // 001D LDBOOL R4 0 0 + 0x80040800, // 001E RET 1 R4 + 0xB8121C00, // 001F GETNGBL R4 K14 + 0x8C10090F, // 0020 GETMET R4 R4 K15 + 0x7C100200, // 0021 CALL R4 1 + 0x8C100910, // 0022 GETMET R4 R4 K16 + 0x88180311, // 0023 GETMBR R6 R1 K17 0x881C0312, // 0024 GETMBR R7 R1 K18 - 0x88200313, // 0025 GETMBR R8 R1 K19 - 0x7C140600, // 0026 CALL R5 3 - 0x88180B14, // 0027 GETMBR R6 R5 K20 - 0x8C1C0515, // 0028 GETMET R7 R2 K21 - 0x88240116, // 0029 GETMBR R9 R0 K22 - 0x88241317, // 002A GETMBR R9 R9 K23 - 0x4C280000, // 002B LDNIL R10 - 0x882C0116, // 002C GETMBR R11 R0 K22 - 0x882C1718, // 002D GETMBR R11 R11 K24 - 0x7C1C0800, // 002E CALL R7 4 - 0x8C200519, // 002F GETMET R8 R2 K25 - 0x542A001F, // 0030 LDINT R10 32 - 0x7C200400, // 0031 CALL R8 2 - 0x8C240F1A, // 0032 GETMET R9 R7 K26 - 0x5C2C1000, // 0033 MOVE R11 R8 - 0x7C240400, // 0034 CALL R9 2 - 0x8C240F1B, // 0035 GETMET R9 R7 K27 - 0x5C2C0C00, // 0036 MOVE R11 R6 - 0x7C240400, // 0037 CALL R9 2 - 0x8C24051C, // 0038 GETMET R9 R2 K28 - 0x7C240200, // 0039 CALL R9 1 - 0x8C28131D, // 003A GETMET R10 R9 K29 - 0x60300015, // 003B GETGBL R12 G21 - 0x7C300000, // 003C CALL R12 0 - 0x8C30191E, // 003D GETMET R12 R12 K30 - 0x8838011F, // 003E GETMBR R14 R0 K31 - 0x7C300400, // 003F CALL R12 2 - 0x7C280400, // 0040 CALL R10 2 - 0x8C28131D, // 0041 GETMET R10 R9 K29 - 0x88300920, // 0042 GETMBR R12 R4 K32 - 0x7C280400, // 0043 CALL R10 2 - 0x8C28131D, // 0044 GETMET R10 R9 K29 - 0x88300921, // 0045 GETMBR R12 R4 K33 - 0x7C280400, // 0046 CALL R10 2 - 0x8C281322, // 0047 GETMET R10 R9 K34 - 0x7C280200, // 0048 CALL R10 1 - 0x901E2806, // 0049 SETMBR R7 K20 R6 - 0x8C2C0F23, // 004A GETMET R11 R7 K35 - 0x5C341400, // 004B MOVE R13 R10 - 0x7C2C0400, // 004C CALL R11 2 - 0x8C2C0F24, // 004D GETMET R11 R7 K36 - 0x50340200, // 004E LDBOOL R13 1 0 - 0x7C2C0400, // 004F CALL R11 2 - 0xB82E1E00, // 0050 GETNGBL R11 K15 - 0x8C2C1725, // 0051 GETMET R11 R11 K37 - 0x7C2C0200, // 0052 CALL R11 1 - 0x88300F26, // 0053 GETMBR R12 R7 K38 - 0x902E4C0C, // 0054 SETMBR R11 K38 R12 - 0x88300F27, // 0055 GETMBR R12 R7 K39 - 0x902E4E0C, // 0056 SETMBR R11 K39 R12 - 0x8C301728, // 0057 GETMET R12 R11 K40 - 0x7C300200, // 0058 CALL R12 1 - 0x88340F2A, // 0059 GETMBR R13 R7 K42 - 0x9012520D, // 005A SETMBR R4 K41 R13 - 0x88340F2C, // 005B GETMBR R13 R7 K44 - 0x9012560D, // 005C SETMBR R4 K43 R13 - 0x8C34032D, // 005D GETMET R13 R1 K45 - 0x543E0022, // 005E LDINT R15 35 - 0x50400200, // 005F LDBOOL R16 1 0 - 0x7C340600, // 0060 CALL R13 3 - 0x8C381B2E, // 0061 GETMET R14 R13 K46 - 0x5C401800, // 0062 MOVE R16 R12 - 0x7C380400, // 0063 CALL R14 2 - 0xB83E0E00, // 0064 GETNGBL R15 K7 - 0x8C3C1F08, // 0065 GETMET R15 R15 K8 - 0x8C44072F, // 0066 GETMET R17 R3 K47 - 0x584C0030, // 0067 LDCONST R19 K48 - 0x88500931, // 0068 GETMBR R20 R4 K49 - 0x88540932, // 0069 GETMBR R21 R4 K50 - 0x88580933, // 006A GETMBR R22 R4 K51 - 0x7C440A00, // 006B CALL R17 5 - 0x7C3C0400, // 006C CALL R15 2 - 0x883C0134, // 006D GETMBR R15 R0 K52 - 0x8C3C1F35, // 006E GETMET R15 R15 K53 - 0x5C441A00, // 006F MOVE R17 R13 - 0x7C3C0400, // 0070 CALL R15 2 - 0x503C0200, // 0071 LDBOOL R15 1 0 - 0x80041E00, // 0072 RET 1 R15 + 0x7C100600, // 0025 CALL R4 3 + 0x88140913, // 0026 GETMBR R5 R4 K19 + 0x8C180514, // 0027 GETMET R6 R2 K20 + 0x88200115, // 0028 GETMBR R8 R0 K21 + 0x88201116, // 0029 GETMBR R8 R8 K22 + 0x4C240000, // 002A LDNIL R9 + 0x88280115, // 002B GETMBR R10 R0 K21 + 0x88281517, // 002C GETMBR R10 R10 K23 + 0x7C180800, // 002D CALL R6 4 + 0x8C1C0518, // 002E GETMET R7 R2 K24 + 0x5426001F, // 002F LDINT R9 32 + 0x7C1C0400, // 0030 CALL R7 2 + 0x8C200D19, // 0031 GETMET R8 R6 K25 + 0x5C280E00, // 0032 MOVE R10 R7 + 0x7C200400, // 0033 CALL R8 2 + 0x8C200D1A, // 0034 GETMET R8 R6 K26 + 0x5C280A00, // 0035 MOVE R10 R5 + 0x7C200400, // 0036 CALL R8 2 + 0x8C20051B, // 0037 GETMET R8 R2 K27 + 0x7C200200, // 0038 CALL R8 1 + 0x8C24111C, // 0039 GETMET R9 R8 K28 + 0x602C0015, // 003A GETGBL R11 G21 + 0x7C2C0000, // 003B CALL R11 0 + 0x8C2C171D, // 003C GETMET R11 R11 K29 + 0x8834011E, // 003D GETMBR R13 R0 K30 + 0x7C2C0400, // 003E CALL R11 2 + 0x7C240400, // 003F CALL R9 2 + 0x8C24111C, // 0040 GETMET R9 R8 K28 + 0x882C071F, // 0041 GETMBR R11 R3 K31 + 0x7C240400, // 0042 CALL R9 2 + 0x8C24111C, // 0043 GETMET R9 R8 K28 + 0x882C0720, // 0044 GETMBR R11 R3 K32 + 0x7C240400, // 0045 CALL R9 2 + 0x8C241121, // 0046 GETMET R9 R8 K33 + 0x7C240200, // 0047 CALL R9 1 + 0x901A2605, // 0048 SETMBR R6 K19 R5 + 0x8C280D22, // 0049 GETMET R10 R6 K34 + 0x5C301200, // 004A MOVE R12 R9 + 0x7C280400, // 004B CALL R10 2 + 0x8C280D23, // 004C GETMET R10 R6 K35 + 0x50300200, // 004D LDBOOL R12 1 0 + 0x7C280400, // 004E CALL R10 2 + 0xB82A1C00, // 004F GETNGBL R10 K14 + 0x8C281524, // 0050 GETMET R10 R10 K36 + 0x7C280200, // 0051 CALL R10 1 + 0x882C0D25, // 0052 GETMBR R11 R6 K37 + 0x902A4A0B, // 0053 SETMBR R10 K37 R11 + 0x882C0D26, // 0054 GETMBR R11 R6 K38 + 0x902A4C0B, // 0055 SETMBR R10 K38 R11 + 0x8C2C1527, // 0056 GETMET R11 R10 K39 + 0x7C2C0200, // 0057 CALL R11 1 + 0x88300D29, // 0058 GETMBR R12 R6 K41 + 0x900E500C, // 0059 SETMBR R3 K40 R12 + 0x88300D2B, // 005A GETMBR R12 R6 K43 + 0x900E540C, // 005B SETMBR R3 K42 R12 + 0x8C30032C, // 005C GETMET R12 R1 K44 + 0x543A0022, // 005D LDINT R14 35 + 0x503C0200, // 005E LDBOOL R15 1 0 + 0x7C300600, // 005F CALL R12 3 + 0x8C34192D, // 0060 GETMET R13 R12 K45 + 0x5C3C1600, // 0061 MOVE R15 R11 + 0x7C340400, // 0062 CALL R13 2 + 0xB83A0C00, // 0063 GETNGBL R14 K6 + 0x8C381D07, // 0064 GETMET R14 R14 K7 + 0x60400018, // 0065 GETGBL R16 G24 + 0x5844002E, // 0066 LDCONST R17 K46 + 0x8848072F, // 0067 GETMBR R18 R3 K47 + 0x884C0730, // 0068 GETMBR R19 R3 K48 + 0x88500731, // 0069 GETMBR R20 R3 K49 + 0x7C400800, // 006A CALL R16 4 + 0x7C380400, // 006B CALL R14 2 + 0x88380132, // 006C GETMBR R14 R0 K50 + 0x8C381D33, // 006D GETMET R14 R14 K51 + 0x5C401800, // 006E MOVE R16 R12 + 0x7C380400, // 006F CALL R14 2 + 0x50380200, // 0070 LDBOOL R14 1 0 + 0x80041C00, // 0071 RET 1 R14 }) ) ); @@ -1264,7 +1255,7 @@ be_local_closure(Matter_Commisioning_Context_parse_Sigma3, /* name */ ********************************************************************/ be_local_closure(Matter_Commisioning_Context_process_incoming, /* name */ be_nested_proto( - 9, /* nstack */ + 7, /* nstack */ 2, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -1272,7 +1263,7 @@ be_local_closure(Matter_Commisioning_Context_process_incoming, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[16]) { /* constants */ + ( &(const bvalue[14]) { /* constants */ /* K0 */ be_nested_str_weak(device), /* K1 */ be_nested_str_weak(is_commissioning_open), /* K2 */ be_nested_str_weak(opcode), @@ -1286,13 +1277,11 @@ be_local_closure(Matter_Commisioning_Context_process_incoming, /* name */ /* K10 */ be_nested_str_weak(parse_Sigma1), /* K11 */ be_nested_str_weak(parse_Sigma3), /* K12 */ be_nested_str_weak(parse_StatusReport), - /* K13 */ be_nested_str_weak(string), - /* K14 */ be_nested_str_weak(format), - /* K15 */ be_nested_str_weak(MTR_X3A_X20_X3E_X3F_X3F_X3F_X3F_X3F_X3F_X3F_X3F_X3F_X20Unknown_X20OpCode_X20_X28secure_X20channel_X29_X20_X2502X), + /* K13 */ be_nested_str_weak(MTR_X3A_X20_X3E_X3F_X3F_X3F_X3F_X3F_X3F_X3F_X3F_X3F_X20Unknown_X20OpCode_X20_X28secure_X20channel_X29_X20_X2502X), }), be_str_weak(process_incoming), &be_const_str_solidified, - ( &(const binstruction[91]) { /* code */ + ( &(const binstruction[90]) { /* code */ 0x88080100, // 0000 GETMBR R2 R0 K0 0x8C080501, // 0001 GETMET R2 R2 K1 0x7C080200, // 0002 CALL R2 1 @@ -1316,7 +1305,7 @@ be_local_closure(Matter_Commisioning_Context_process_incoming, /* name */ 0x540E000F, // 0014 LDINT R3 16 0x1C080403, // 0015 EQ R2 R2 R3 0x780A0000, // 0016 JMPF R2 #0018 - 0x70020040, // 0017 JMP #0059 + 0x7002003F, // 0017 JMP #0058 0x88080302, // 0018 GETMBR R2 R1 K2 0x540E001F, // 0019 LDINT R3 32 0x1C080403, // 001A EQ R2 R2 R3 @@ -1325,7 +1314,7 @@ be_local_closure(Matter_Commisioning_Context_process_incoming, /* name */ 0x5C100200, // 001D MOVE R4 R1 0x7C080400, // 001E CALL R2 2 0x80040400, // 001F RET 1 R2 - 0x70020037, // 0020 JMP #0059 + 0x70020036, // 0020 JMP #0058 0x88080302, // 0021 GETMBR R2 R1 K2 0x540E0021, // 0022 LDINT R3 34 0x1C080403, // 0023 EQ R2 R2 R3 @@ -1334,7 +1323,7 @@ be_local_closure(Matter_Commisioning_Context_process_incoming, /* name */ 0x5C100200, // 0026 MOVE R4 R1 0x7C080400, // 0027 CALL R2 2 0x80040400, // 0028 RET 1 R2 - 0x7002002E, // 0029 JMP #0059 + 0x7002002D, // 0029 JMP #0058 0x88080302, // 002A GETMBR R2 R1 K2 0x540E0023, // 002B LDINT R3 36 0x1C080403, // 002C EQ R2 R2 R3 @@ -1343,7 +1332,7 @@ be_local_closure(Matter_Commisioning_Context_process_incoming, /* name */ 0x5C100200, // 002F MOVE R4 R1 0x7C080400, // 0030 CALL R2 2 0x80040400, // 0031 RET 1 R2 - 0x70020025, // 0032 JMP #0059 + 0x70020024, // 0032 JMP #0058 0x88080302, // 0033 GETMBR R2 R1 K2 0x540E002F, // 0034 LDINT R3 48 0x1C080403, // 0035 EQ R2 R2 R3 @@ -1352,7 +1341,7 @@ be_local_closure(Matter_Commisioning_Context_process_incoming, /* name */ 0x5C100200, // 0038 MOVE R4 R1 0x7C080400, // 0039 CALL R2 2 0x80040400, // 003A RET 1 R2 - 0x7002001C, // 003B JMP #0059 + 0x7002001B, // 003B JMP #0058 0x88080302, // 003C GETMBR R2 R1 K2 0x540E0031, // 003D LDINT R3 50 0x1C080403, // 003E EQ R2 R2 R3 @@ -1361,7 +1350,7 @@ be_local_closure(Matter_Commisioning_Context_process_incoming, /* name */ 0x5C100200, // 0041 MOVE R4 R1 0x7C080400, // 0042 CALL R2 2 0x80040400, // 0043 RET 1 R2 - 0x70020013, // 0044 JMP #0059 + 0x70020012, // 0044 JMP #0058 0x88080302, // 0045 GETMBR R2 R1 K2 0x540E003F, // 0046 LDINT R3 64 0x1C080403, // 0047 EQ R2 R2 R3 @@ -1370,20 +1359,19 @@ be_local_closure(Matter_Commisioning_Context_process_incoming, /* name */ 0x5C100200, // 004A MOVE R4 R1 0x7C080400, // 004B CALL R2 2 0x80040400, // 004C RET 1 R2 - 0x7002000A, // 004D JMP #0059 - 0xA40A1A00, // 004E IMPORT R2 K13 - 0xB80E0600, // 004F GETNGBL R3 K3 - 0x8C0C0704, // 0050 GETMET R3 R3 K4 - 0x8C14050E, // 0051 GETMET R5 R2 K14 - 0x581C000F, // 0052 LDCONST R7 K15 - 0x88200302, // 0053 GETMBR R8 R1 K2 - 0x7C140600, // 0054 CALL R5 3 - 0x58180006, // 0055 LDCONST R6 K6 - 0x7C0C0600, // 0056 CALL R3 3 - 0x500C0000, // 0057 LDBOOL R3 0 0 - 0x80040600, // 0058 RET 1 R3 - 0x50080000, // 0059 LDBOOL R2 0 0 - 0x80040400, // 005A RET 1 R2 + 0x70020009, // 004D JMP #0058 + 0xB80A0600, // 004E GETNGBL R2 K3 + 0x8C080504, // 004F GETMET R2 R2 K4 + 0x60100018, // 0050 GETGBL R4 G24 + 0x5814000D, // 0051 LDCONST R5 K13 + 0x88180302, // 0052 GETMBR R6 R1 K2 + 0x7C100400, // 0053 CALL R4 2 + 0x58140006, // 0054 LDCONST R5 K6 + 0x7C080600, // 0055 CALL R2 3 + 0x50080000, // 0056 LDBOOL R2 0 0 + 0x80040400, // 0057 RET 1 R2 + 0x50080000, // 0058 LDBOOL R2 0 0 + 0x80040400, // 0059 RET 1 R2 }) ) ); @@ -1395,7 +1383,7 @@ be_local_closure(Matter_Commisioning_Context_process_incoming, /* name */ ********************************************************************/ be_local_closure(Matter_Commisioning_Context_parse_Sigma1, /* name */ be_nested_proto( - 37, /* nstack */ + 36, /* nstack */ 2, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -1403,599 +1391,596 @@ be_local_closure(Matter_Commisioning_Context_parse_Sigma1, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[106]) { /* constants */ + ( &(const bvalue[104]) { /* constants */ /* K0 */ be_nested_str_weak(crypto), - /* K1 */ be_nested_str_weak(string), - /* K2 */ be_nested_str_weak(session), - /* K3 */ be_nested_str_weak(opcode), - /* K4 */ be_nested_str_weak(local_session_id), - /* K5 */ be_const_int(0), - /* K6 */ be_nested_str_weak(protocol_id), - /* K7 */ be_nested_str_weak(tasmota), - /* K8 */ be_nested_str_weak(log), - /* K9 */ be_nested_str_weak(MTR_X3A_X20StatusReport_X28General_X20Code_X3A_X20FAILURE_X2C_X20ProtocolId_X3A_X20SECURE_CHANNEL_X2C_X20ProtocolCode_X3A_X20INVALID_PARAMETER_X29), - /* K10 */ be_const_int(3), - /* K11 */ be_nested_str_weak(send_status_report), - /* K12 */ be_const_int(1), - /* K13 */ be_const_int(2), - /* K14 */ be_nested_str_weak(matter), - /* K15 */ be_nested_str_weak(Sigma1), - /* K16 */ be_nested_str_weak(parse), - /* K17 */ be_nested_str_weak(raw), - /* K18 */ be_nested_str_weak(app_payload_idx), - /* K19 */ be_nested_str_weak(__initiator_pub), - /* K20 */ be_nested_str_weak(initiatorEphPubKey), - /* K21 */ be_nested_str_weak(resumptionID), - /* K22 */ be_nested_str_weak(initiatorResumeMIC), - /* K23 */ be_nested_str_weak(device), - /* K24 */ be_nested_str_weak(sessions), - /* K25 */ be_nested_str_weak(find_session_by_resumption_id), - /* K26 */ be_nested_str_weak(_fabric), - /* K27 */ be_nested_str_weak(initiatorRandom), - /* K28 */ be_nested_str_weak(fromstring), - /* K29 */ be_nested_str_weak(Sigma1_Resume), - /* K30 */ be_nested_str_weak(HKDF_SHA256), - /* K31 */ be_nested_str_weak(derive), - /* K32 */ be_nested_str_weak(shared_secret), - /* K33 */ be_nested_str_weak(NCASE_SigmaS1), - /* K34 */ be_const_int(2147483647), - /* K35 */ be_nested_str_weak(AES_CCM), - /* K36 */ be_nested_str_weak(decrypt), - /* K37 */ be_nested_str_weak(tag), - /* K38 */ be_nested_str_weak(_source_node_id), - /* K39 */ be_nested_str_weak(source_node_id), - /* K40 */ be_nested_str_weak(set_mode_CASE), - /* K41 */ be_nested_str_weak(__future_initiator_session_id), - /* K42 */ be_nested_str_weak(initiator_session_id), - /* K43 */ be_nested_str_weak(__future_local_session_id), - /* K44 */ be_nested_str_weak(gen_local_session_id), - /* K45 */ be_nested_str_weak(format), - /* K46 */ be_nested_str_weak(MTR_X3A_X20New_Session_X28_X256i_X29_X20from_X20_X27_X5B_X25s_X5D_X3A_X25i_X27), - /* K47 */ be_nested_str_weak(remote_ip), - /* K48 */ be_nested_str_weak(remote_port), - /* K49 */ be_nested_str_weak(resumption_id), - /* K50 */ be_nested_str_weak(random), - /* K51 */ be_nested_str_weak(Sigma2_Resume), - /* K52 */ be_nested_str_weak(NCASE_SigmaS2), - /* K53 */ be_nested_str_weak(Sigma2Resume), - /* K54 */ be_nested_str_weak(responderSessionID), - /* K55 */ be_nested_str_weak(sigma2ResumeMIC), - /* K56 */ be_nested_str_weak(SessionResumptionKeys), - /* K57 */ be_nested_str_weak(rtc), - /* K58 */ be_nested_str_weak(utc), - /* K59 */ be_nested_str_weak(tlv2raw), - /* K60 */ be_nested_str_weak(__Msg1), - /* K61 */ be_nested_str_weak(build_response), - /* K62 */ be_nested_str_weak(encode_frame), - /* K63 */ be_nested_str_weak(responder), - /* K64 */ be_nested_str_weak(send_response_frame), - /* K65 */ be_nested_str_weak(close), - /* K66 */ be_nested_str_weak(set_keys), - /* K67 */ be_nested_str_weak(_breadcrumb), - /* K68 */ be_nested_str_weak(counter_snd_next), - /* K69 */ be_nested_str_weak(set_persist), - /* K70 */ be_nested_str_weak(set_no_expiration), - /* K71 */ be_nested_str_weak(persist_to_fabric), - /* K72 */ be_nested_str_weak(save), - /* K73 */ be_nested_str_weak(find_fabric_by_destination_id), - /* K74 */ be_nested_str_weak(destinationId), - /* K75 */ be_nested_str_weak(MTR_X3A_X20StatusReport_X28GeneralCode_X3A_X20FAILURE_X2C_X20ProtocolId_X3A_X20SECURE_CHANNEL_X2C_X20ProtocolCode_X3A_X20NO_SHARED_TRUST_ROOTS_X29), - /* K76 */ be_nested_str_weak(__responder_priv), - /* K77 */ be_nested_str_weak(__responder_pub), - /* K78 */ be_nested_str_weak(EC_P256), - /* K79 */ be_nested_str_weak(public_key), - /* K80 */ be_nested_str_weak(shared_key), - /* K81 */ be_nested_str_weak(TLV), - /* K82 */ be_nested_str_weak(Matter_TLV_struct), - /* K83 */ be_nested_str_weak(add_TLV), - /* K84 */ be_nested_str_weak(B2), - /* K85 */ be_nested_str_weak(get_noc), - /* K86 */ be_nested_str_weak(get_icac), - /* K87 */ be_nested_str_weak(ecdsa_sign_sha256), - /* K88 */ be_nested_str_weak(get_pk), - /* K89 */ be_nested_str_weak(Msg1), - /* K90 */ be_nested_str_weak(SHA256), - /* K91 */ be_nested_str_weak(update), - /* K92 */ be_nested_str_weak(out), - /* K93 */ be_nested_str_weak(S2K_Info), - /* K94 */ be_nested_str_weak(get_ipk_group_key), - /* K95 */ be_nested_str_weak(TBEData2_Nonce), - /* K96 */ be_nested_str_weak(encrypt), - /* K97 */ be_nested_str_weak(Sigma2), - /* K98 */ be_nested_str_weak(responderRandom), - /* K99 */ be_nested_str_weak(responderSessionId), - /* K100 */ be_nested_str_weak(responderEphPubKey), - /* K101 */ be_nested_str_weak(encrypted2), - /* K102 */ be_nested_str_weak(__Msg2), - /* K103 */ be_nested_str_weak(MTR_X3A_X20New_X20Connection_X20_X28CASE_X20id_X3D_X25i_X29_X20from_X20_X5B_X25s_X5D_X3A_X25i), - /* K104 */ be_nested_str_weak(_ip), - /* K105 */ be_nested_str_weak(_port), + /* K1 */ be_nested_str_weak(session), + /* K2 */ be_nested_str_weak(opcode), + /* K3 */ be_nested_str_weak(local_session_id), + /* K4 */ be_const_int(0), + /* K5 */ be_nested_str_weak(protocol_id), + /* K6 */ be_nested_str_weak(tasmota), + /* K7 */ be_nested_str_weak(log), + /* K8 */ be_nested_str_weak(MTR_X3A_X20StatusReport_X28General_X20Code_X3A_X20FAILURE_X2C_X20ProtocolId_X3A_X20SECURE_CHANNEL_X2C_X20ProtocolCode_X3A_X20INVALID_PARAMETER_X29), + /* K9 */ be_const_int(3), + /* K10 */ be_nested_str_weak(send_status_report), + /* K11 */ be_const_int(1), + /* K12 */ be_const_int(2), + /* K13 */ be_nested_str_weak(matter), + /* K14 */ be_nested_str_weak(Sigma1), + /* K15 */ be_nested_str_weak(parse), + /* K16 */ be_nested_str_weak(raw), + /* K17 */ be_nested_str_weak(app_payload_idx), + /* K18 */ be_nested_str_weak(__initiator_pub), + /* K19 */ be_nested_str_weak(initiatorEphPubKey), + /* K20 */ be_nested_str_weak(resumptionID), + /* K21 */ be_nested_str_weak(initiatorResumeMIC), + /* K22 */ be_nested_str_weak(device), + /* K23 */ be_nested_str_weak(sessions), + /* K24 */ be_nested_str_weak(find_session_by_resumption_id), + /* K25 */ be_nested_str_weak(_fabric), + /* K26 */ be_nested_str_weak(initiatorRandom), + /* K27 */ be_nested_str_weak(fromstring), + /* K28 */ be_nested_str_weak(Sigma1_Resume), + /* K29 */ be_nested_str_weak(HKDF_SHA256), + /* K30 */ be_nested_str_weak(derive), + /* K31 */ be_nested_str_weak(shared_secret), + /* K32 */ be_nested_str_weak(NCASE_SigmaS1), + /* K33 */ be_const_int(2147483647), + /* K34 */ be_nested_str_weak(AES_CCM), + /* K35 */ be_nested_str_weak(decrypt), + /* K36 */ be_nested_str_weak(tag), + /* K37 */ be_nested_str_weak(_source_node_id), + /* K38 */ be_nested_str_weak(source_node_id), + /* K39 */ be_nested_str_weak(set_mode_CASE), + /* K40 */ be_nested_str_weak(__future_initiator_session_id), + /* K41 */ be_nested_str_weak(initiator_session_id), + /* K42 */ be_nested_str_weak(__future_local_session_id), + /* K43 */ be_nested_str_weak(gen_local_session_id), + /* K44 */ be_nested_str_weak(MTR_X3A_X20New_Session_X28_X256i_X29_X20from_X20_X27_X5B_X25s_X5D_X3A_X25i_X27), + /* K45 */ be_nested_str_weak(remote_ip), + /* K46 */ be_nested_str_weak(remote_port), + /* K47 */ be_nested_str_weak(resumption_id), + /* K48 */ be_nested_str_weak(random), + /* K49 */ be_nested_str_weak(Sigma2_Resume), + /* K50 */ be_nested_str_weak(NCASE_SigmaS2), + /* K51 */ be_nested_str_weak(Sigma2Resume), + /* K52 */ be_nested_str_weak(responderSessionID), + /* K53 */ be_nested_str_weak(sigma2ResumeMIC), + /* K54 */ be_nested_str_weak(SessionResumptionKeys), + /* K55 */ be_nested_str_weak(rtc), + /* K56 */ be_nested_str_weak(utc), + /* K57 */ be_nested_str_weak(tlv2raw), + /* K58 */ be_nested_str_weak(__Msg1), + /* K59 */ be_nested_str_weak(build_response), + /* K60 */ be_nested_str_weak(encode_frame), + /* K61 */ be_nested_str_weak(responder), + /* K62 */ be_nested_str_weak(send_response_frame), + /* K63 */ be_nested_str_weak(close), + /* K64 */ be_nested_str_weak(set_keys), + /* K65 */ be_nested_str_weak(_breadcrumb), + /* K66 */ be_nested_str_weak(counter_snd_next), + /* K67 */ be_nested_str_weak(set_persist), + /* K68 */ be_nested_str_weak(set_no_expiration), + /* K69 */ be_nested_str_weak(persist_to_fabric), + /* K70 */ be_nested_str_weak(save), + /* K71 */ be_nested_str_weak(find_fabric_by_destination_id), + /* K72 */ be_nested_str_weak(destinationId), + /* K73 */ be_nested_str_weak(MTR_X3A_X20StatusReport_X28GeneralCode_X3A_X20FAILURE_X2C_X20ProtocolId_X3A_X20SECURE_CHANNEL_X2C_X20ProtocolCode_X3A_X20NO_SHARED_TRUST_ROOTS_X29), + /* K74 */ be_nested_str_weak(__responder_priv), + /* K75 */ be_nested_str_weak(__responder_pub), + /* K76 */ be_nested_str_weak(EC_P256), + /* K77 */ be_nested_str_weak(public_key), + /* K78 */ be_nested_str_weak(shared_key), + /* K79 */ be_nested_str_weak(TLV), + /* K80 */ be_nested_str_weak(Matter_TLV_struct), + /* K81 */ be_nested_str_weak(add_TLV), + /* K82 */ be_nested_str_weak(B2), + /* K83 */ be_nested_str_weak(get_noc), + /* K84 */ be_nested_str_weak(get_icac), + /* K85 */ be_nested_str_weak(ecdsa_sign_sha256), + /* K86 */ be_nested_str_weak(get_pk), + /* K87 */ be_nested_str_weak(Msg1), + /* K88 */ be_nested_str_weak(SHA256), + /* K89 */ be_nested_str_weak(update), + /* K90 */ be_nested_str_weak(out), + /* K91 */ be_nested_str_weak(S2K_Info), + /* K92 */ be_nested_str_weak(get_ipk_group_key), + /* K93 */ be_nested_str_weak(TBEData2_Nonce), + /* K94 */ be_nested_str_weak(encrypt), + /* K95 */ be_nested_str_weak(Sigma2), + /* K96 */ be_nested_str_weak(responderRandom), + /* K97 */ be_nested_str_weak(responderSessionId), + /* K98 */ be_nested_str_weak(responderEphPubKey), + /* K99 */ be_nested_str_weak(encrypted2), + /* K100 */ be_nested_str_weak(__Msg2), + /* K101 */ be_nested_str_weak(MTR_X3A_X20New_X20Connection_X20_X28CASE_X20id_X3D_X25i_X29_X20from_X20_X5B_X25s_X5D_X3A_X25i), + /* K102 */ be_nested_str_weak(_ip), + /* K103 */ be_nested_str_weak(_port), }), be_str_weak(parse_Sigma1), &be_const_str_solidified, - ( &(const binstruction[482]) { /* code */ + ( &(const binstruction[481]) { /* code */ 0xA40A0000, // 0000 IMPORT R2 K0 - 0xA40E0200, // 0001 IMPORT R3 K1 + 0x880C0301, // 0001 GETMBR R3 R1 K1 0x88100302, // 0002 GETMBR R4 R1 K2 - 0x88140303, // 0003 GETMBR R5 R1 K3 - 0x541A002F, // 0004 LDINT R6 48 - 0x20140A06, // 0005 NE R5 R5 R6 - 0x74160005, // 0006 JMPT R5 #000D - 0x88140304, // 0007 GETMBR R5 R1 K4 - 0x20140B05, // 0008 NE R5 R5 K5 - 0x74160002, // 0009 JMPT R5 #000D - 0x88140306, // 000A GETMBR R5 R1 K6 - 0x20140B05, // 000B NE R5 R5 K5 - 0x7816000D, // 000C JMPF R5 #001B - 0xB8160E00, // 000D GETNGBL R5 K7 - 0x8C140B08, // 000E GETMET R5 R5 K8 + 0x5416002F, // 0003 LDINT R5 48 + 0x20100805, // 0004 NE R4 R4 R5 + 0x74120005, // 0005 JMPT R4 #000C + 0x88100303, // 0006 GETMBR R4 R1 K3 + 0x20100904, // 0007 NE R4 R4 K4 + 0x74120002, // 0008 JMPT R4 #000C + 0x88100305, // 0009 GETMBR R4 R1 K5 + 0x20100904, // 000A NE R4 R4 K4 + 0x7812000D, // 000B JMPF R4 #001A + 0xB8120C00, // 000C GETNGBL R4 K6 + 0x8C100907, // 000D GETMET R4 R4 K7 + 0x58180008, // 000E LDCONST R6 K8 0x581C0009, // 000F LDCONST R7 K9 - 0x5820000A, // 0010 LDCONST R8 K10 - 0x7C140600, // 0011 CALL R5 3 - 0x8C14010B, // 0012 GETMET R5 R0 K11 - 0x5C1C0200, // 0013 MOVE R7 R1 - 0x5820000C, // 0014 LDCONST R8 K12 - 0x58240005, // 0015 LDCONST R9 K5 - 0x5828000D, // 0016 LDCONST R10 K13 - 0x502C0000, // 0017 LDBOOL R11 0 0 - 0x7C140C00, // 0018 CALL R5 6 - 0x50140000, // 0019 LDBOOL R5 0 0 - 0x80040A00, // 001A RET 1 R5 - 0xB8161C00, // 001B GETNGBL R5 K14 - 0x8C140B0F, // 001C GETMET R5 R5 K15 - 0x7C140200, // 001D CALL R5 1 - 0x8C140B10, // 001E GETMET R5 R5 K16 + 0x7C100600, // 0010 CALL R4 3 + 0x8C10010A, // 0011 GETMET R4 R0 K10 + 0x5C180200, // 0012 MOVE R6 R1 + 0x581C000B, // 0013 LDCONST R7 K11 + 0x58200004, // 0014 LDCONST R8 K4 + 0x5824000C, // 0015 LDCONST R9 K12 + 0x50280000, // 0016 LDBOOL R10 0 0 + 0x7C100C00, // 0017 CALL R4 6 + 0x50100000, // 0018 LDBOOL R4 0 0 + 0x80040800, // 0019 RET 1 R4 + 0xB8121A00, // 001A GETNGBL R4 K13 + 0x8C10090E, // 001B GETMET R4 R4 K14 + 0x7C100200, // 001C CALL R4 1 + 0x8C10090F, // 001D GETMET R4 R4 K15 + 0x88180310, // 001E GETMBR R6 R1 K16 0x881C0311, // 001F GETMBR R7 R1 K17 - 0x88200312, // 0020 GETMBR R8 R1 K18 - 0x7C140600, // 0021 CALL R5 3 - 0x88180B14, // 0022 GETMBR R6 R5 K20 - 0x90122606, // 0023 SETMBR R4 K19 R6 - 0x88180B15, // 0024 GETMBR R6 R5 K21 - 0x4C1C0000, // 0025 LDNIL R7 - 0x20180C07, // 0026 NE R6 R6 R7 - 0x781A0003, // 0027 JMPF R6 #002C - 0x88180B16, // 0028 GETMBR R6 R5 K22 - 0x4C1C0000, // 0029 LDNIL R7 - 0x20180C07, // 002A NE R6 R6 R7 - 0x741A0000, // 002B JMPT R6 #002D - 0x50180001, // 002C LDBOOL R6 0 1 - 0x50180200, // 002D LDBOOL R6 1 0 - 0x50180000, // 002E LDBOOL R6 0 0 - 0x4C1C0000, // 002F LDNIL R7 - 0x781A000D, // 0030 JMPF R6 #003F - 0x88200117, // 0031 GETMBR R8 R0 K23 - 0x88201118, // 0032 GETMBR R8 R8 K24 - 0x8C201119, // 0033 GETMET R8 R8 K25 - 0x88280B15, // 0034 GETMBR R10 R5 K21 - 0x7C200400, // 0035 CALL R8 2 - 0x5C1C1000, // 0036 MOVE R7 R8 - 0x4C200000, // 0037 LDNIL R8 - 0x1C200E08, // 0038 EQ R8 R7 R8 - 0x74220003, // 0039 JMPT R8 #003E - 0x88200F1A, // 003A GETMBR R8 R7 K26 - 0x4C240000, // 003B LDNIL R9 - 0x1C201009, // 003C EQ R8 R8 R9 - 0x78220000, // 003D JMPF R8 #003F - 0x50180000, // 003E LDBOOL R6 0 0 - 0x781A00B6, // 003F JMPF R6 #00F7 - 0x88200B1B, // 0040 GETMBR R8 R5 K27 - 0x88240B15, // 0041 GETMBR R9 R5 K21 - 0x00201009, // 0042 ADD R8 R8 R9 - 0x60240015, // 0043 GETGBL R9 G21 - 0x7C240000, // 0044 CALL R9 0 - 0x8C24131C, // 0045 GETMET R9 R9 K28 - 0x582C001D, // 0046 LDCONST R11 K29 - 0x7C240400, // 0047 CALL R9 2 - 0x8C28051E, // 0048 GETMET R10 R2 K30 - 0x7C280200, // 0049 CALL R10 1 - 0x8C28151F, // 004A GETMET R10 R10 K31 - 0x88300F20, // 004B GETMBR R12 R7 K32 + 0x7C100600, // 0020 CALL R4 3 + 0x88140913, // 0021 GETMBR R5 R4 K19 + 0x900E2405, // 0022 SETMBR R3 K18 R5 + 0x88140914, // 0023 GETMBR R5 R4 K20 + 0x4C180000, // 0024 LDNIL R6 + 0x20140A06, // 0025 NE R5 R5 R6 + 0x78160003, // 0026 JMPF R5 #002B + 0x88140915, // 0027 GETMBR R5 R4 K21 + 0x4C180000, // 0028 LDNIL R6 + 0x20140A06, // 0029 NE R5 R5 R6 + 0x74160000, // 002A JMPT R5 #002C + 0x50140001, // 002B LDBOOL R5 0 1 + 0x50140200, // 002C LDBOOL R5 1 0 + 0x50140000, // 002D LDBOOL R5 0 0 + 0x4C180000, // 002E LDNIL R6 + 0x7816000D, // 002F JMPF R5 #003E + 0x881C0116, // 0030 GETMBR R7 R0 K22 + 0x881C0F17, // 0031 GETMBR R7 R7 K23 + 0x8C1C0F18, // 0032 GETMET R7 R7 K24 + 0x88240914, // 0033 GETMBR R9 R4 K20 + 0x7C1C0400, // 0034 CALL R7 2 + 0x5C180E00, // 0035 MOVE R6 R7 + 0x4C1C0000, // 0036 LDNIL R7 + 0x1C1C0C07, // 0037 EQ R7 R6 R7 + 0x741E0003, // 0038 JMPT R7 #003D + 0x881C0D19, // 0039 GETMBR R7 R6 K25 + 0x4C200000, // 003A LDNIL R8 + 0x1C1C0E08, // 003B EQ R7 R7 R8 + 0x781E0000, // 003C JMPF R7 #003E + 0x50140000, // 003D LDBOOL R5 0 0 + 0x781600B6, // 003E JMPF R5 #00F6 + 0x881C091A, // 003F GETMBR R7 R4 K26 + 0x88200914, // 0040 GETMBR R8 R4 K20 + 0x001C0E08, // 0041 ADD R7 R7 R8 + 0x60200015, // 0042 GETGBL R8 G21 + 0x7C200000, // 0043 CALL R8 0 + 0x8C20111B, // 0044 GETMET R8 R8 K27 + 0x5828001C, // 0045 LDCONST R10 K28 + 0x7C200400, // 0046 CALL R8 2 + 0x8C24051D, // 0047 GETMET R9 R2 K29 + 0x7C240200, // 0048 CALL R9 1 + 0x8C24131E, // 0049 GETMET R9 R9 K30 + 0x882C0D1F, // 004A GETMBR R11 R6 K31 + 0x5C300E00, // 004B MOVE R12 R7 0x5C341000, // 004C MOVE R13 R8 - 0x5C381200, // 004D MOVE R14 R9 - 0x543E000F, // 004E LDINT R15 16 - 0x7C280A00, // 004F CALL R10 5 - 0x602C0015, // 0050 GETGBL R11 G21 - 0x7C2C0000, // 0051 CALL R11 0 - 0x8C2C171C, // 0052 GETMET R11 R11 K28 - 0x58340021, // 0053 LDCONST R13 K33 - 0x7C2C0400, // 0054 CALL R11 2 - 0x5431FFEE, // 0055 LDINT R12 -17 - 0x40320A0C, // 0056 CONNECT R12 K5 R12 - 0x88340B16, // 0057 GETMBR R13 R5 K22 - 0x94301A0C, // 0058 GETIDX R12 R13 R12 - 0x5439FFEF, // 0059 LDINT R14 -16 - 0x40381D22, // 005A CONNECT R14 R14 K34 - 0x883C0B16, // 005B GETMBR R15 R5 K22 - 0x94341E0E, // 005C GETIDX R13 R15 R14 - 0x8C400523, // 005D GETMET R16 R2 K35 + 0x543A000F, // 004D LDINT R14 16 + 0x7C240A00, // 004E CALL R9 5 + 0x60280015, // 004F GETGBL R10 G21 + 0x7C280000, // 0050 CALL R10 0 + 0x8C28151B, // 0051 GETMET R10 R10 K27 + 0x58300020, // 0052 LDCONST R12 K32 + 0x7C280400, // 0053 CALL R10 2 + 0x542DFFEE, // 0054 LDINT R11 -17 + 0x402E080B, // 0055 CONNECT R11 K4 R11 + 0x88300915, // 0056 GETMBR R12 R4 K21 + 0x942C180B, // 0057 GETIDX R11 R12 R11 + 0x5435FFEF, // 0058 LDINT R13 -16 + 0x40341B21, // 0059 CONNECT R13 R13 K33 + 0x88380915, // 005A GETMBR R14 R4 K21 + 0x94301C0D, // 005B GETIDX R12 R14 R13 + 0x8C3C0522, // 005C GETMET R15 R2 K34 + 0x5C441200, // 005D MOVE R17 R9 0x5C481400, // 005E MOVE R18 R10 - 0x5C4C1600, // 005F MOVE R19 R11 - 0x60500015, // 0060 GETGBL R20 G21 - 0x7C500000, // 0061 CALL R20 0 - 0x6054000C, // 0062 GETGBL R21 G12 - 0x5C581800, // 0063 MOVE R22 R12 - 0x7C540200, // 0064 CALL R21 1 - 0x545A000F, // 0065 LDINT R22 16 - 0x7C400C00, // 0066 CALL R16 6 - 0x5C382000, // 0067 MOVE R14 R16 - 0x8C401D24, // 0068 GETMET R16 R14 K36 - 0x5C481800, // 0069 MOVE R18 R12 - 0x7C400400, // 006A CALL R16 2 - 0x5C3C2000, // 006B MOVE R15 R16 - 0x8C401D25, // 006C GETMET R16 R14 K37 - 0x7C400200, // 006D CALL R16 1 - 0x1C441A10, // 006E EQ R17 R13 R16 - 0x78460085, // 006F JMPF R17 #00F6 - 0x88440F1A, // 0070 GETMBR R17 R7 K26 - 0x90123411, // 0071 SETMBR R4 K26 R17 - 0x88440327, // 0072 GETMBR R17 R1 K39 - 0x90124C11, // 0073 SETMBR R4 K38 R17 - 0x8C440928, // 0074 GETMET R17 R4 K40 - 0x7C440200, // 0075 CALL R17 1 - 0x88440B2A, // 0076 GETMBR R17 R5 K42 - 0x90125211, // 0077 SETMBR R4 K41 R17 - 0x88440117, // 0078 GETMBR R17 R0 K23 - 0x88442318, // 0079 GETMBR R17 R17 K24 - 0x8C44232C, // 007A GETMET R17 R17 K44 - 0x7C440200, // 007B CALL R17 1 - 0x90125611, // 007C SETMBR R4 K43 R17 - 0xB8460E00, // 007D GETNGBL R17 K7 - 0x8C442308, // 007E GETMET R17 R17 K8 - 0x8C4C072D, // 007F GETMET R19 R3 K45 - 0x5854002E, // 0080 LDCONST R21 K46 - 0x8858092B, // 0081 GETMBR R22 R4 K43 - 0x885C032F, // 0082 GETMBR R23 R1 K47 - 0x88600330, // 0083 GETMBR R24 R1 K48 - 0x7C4C0A00, // 0084 CALL R19 5 - 0x5850000A, // 0085 LDCONST R20 K10 - 0x7C440600, // 0086 CALL R17 3 - 0x88440F20, // 0087 GETMBR R17 R7 K32 - 0x90124011, // 0088 SETMBR R4 K32 R17 - 0x8C440532, // 0089 GETMET R17 R2 K50 - 0x544E000F, // 008A LDINT R19 16 - 0x7C440400, // 008B CALL R17 2 - 0x90126211, // 008C SETMBR R4 K49 R17 - 0x60440015, // 008D GETGBL R17 G21 - 0x7C440000, // 008E CALL R17 0 - 0x8C44231C, // 008F GETMET R17 R17 K28 - 0x584C0033, // 0090 LDCONST R19 K51 - 0x7C440400, // 0091 CALL R17 2 - 0x88480B1B, // 0092 GETMBR R18 R5 K27 - 0x884C0931, // 0093 GETMBR R19 R4 K49 - 0x00482413, // 0094 ADD R18 R18 R19 - 0x8C4C051E, // 0095 GETMET R19 R2 K30 - 0x7C4C0200, // 0096 CALL R19 1 - 0x8C4C271F, // 0097 GETMET R19 R19 K31 - 0x88540920, // 0098 GETMBR R21 R4 K32 - 0x5C582400, // 0099 MOVE R22 R18 - 0x5C5C2200, // 009A MOVE R23 R17 - 0x5462000F, // 009B LDINT R24 16 - 0x7C4C0A00, // 009C CALL R19 5 - 0x8C500523, // 009D GETMET R20 R2 K35 - 0x5C582600, // 009E MOVE R22 R19 - 0x605C0015, // 009F GETGBL R23 G21 - 0x7C5C0000, // 00A0 CALL R23 0 - 0x8C5C2F1C, // 00A1 GETMET R23 R23 K28 - 0x58640034, // 00A2 LDCONST R25 K52 - 0x7C5C0400, // 00A3 CALL R23 2 - 0x60600015, // 00A4 GETGBL R24 G21 - 0x7C600000, // 00A5 CALL R24 0 - 0x58640005, // 00A6 LDCONST R25 K5 - 0x546A000F, // 00A7 LDINT R26 16 - 0x7C500C00, // 00A8 CALL R20 6 - 0x8C542925, // 00A9 GETMET R21 R20 K37 - 0x7C540200, // 00AA CALL R21 1 - 0xB85A1C00, // 00AB GETNGBL R22 K14 - 0x8C582D35, // 00AC GETMET R22 R22 K53 - 0x7C580200, // 00AD CALL R22 1 - 0x885C0931, // 00AE GETMBR R23 R4 K49 - 0x905A2A17, // 00AF SETMBR R22 K21 R23 - 0x885C092B, // 00B0 GETMBR R23 R4 K43 - 0x905A6C17, // 00B1 SETMBR R22 K54 R23 - 0x905A6E15, // 00B2 SETMBR R22 K55 R21 - 0x8C5C051E, // 00B3 GETMET R23 R2 K30 - 0x7C5C0200, // 00B4 CALL R23 1 - 0x8C5C2F1F, // 00B5 GETMET R23 R23 K31 - 0x88640920, // 00B6 GETMBR R25 R4 K32 - 0x88680B1B, // 00B7 GETMBR R26 R5 K27 - 0x886C0931, // 00B8 GETMBR R27 R4 K49 - 0x0068341B, // 00B9 ADD R26 R26 R27 - 0x606C0015, // 00BA GETGBL R27 G21 - 0x7C6C0000, // 00BB CALL R27 0 - 0x8C6C371C, // 00BC GETMET R27 R27 K28 - 0x58740038, // 00BD LDCONST R29 K56 - 0x7C6C0400, // 00BE CALL R27 2 - 0x5472002F, // 00BF LDINT R28 48 - 0x7C5C0A00, // 00C0 CALL R23 5 - 0x5462000E, // 00C1 LDINT R24 15 - 0x40620A18, // 00C2 CONNECT R24 K5 R24 - 0x94602E18, // 00C3 GETIDX R24 R23 R24 - 0x5466000F, // 00C4 LDINT R25 16 - 0x546A001E, // 00C5 LDINT R26 31 - 0x4064321A, // 00C6 CONNECT R25 R25 R26 - 0x94642E19, // 00C7 GETIDX R25 R23 R25 - 0x546A001F, // 00C8 LDINT R26 32 - 0x546E002E, // 00C9 LDINT R27 47 - 0x4068341B, // 00CA CONNECT R26 R26 R27 - 0x94682E1A, // 00CB GETIDX R26 R23 R26 - 0xB86E0E00, // 00CC GETNGBL R27 K7 - 0x8C6C3739, // 00CD GETMET R27 R27 K57 - 0x7C6C0200, // 00CE CALL R27 1 - 0x946C373A, // 00CF GETIDX R27 R27 K58 - 0x8C702D3B, // 00D0 GETMET R28 R22 K59 - 0x7C700200, // 00D1 CALL R28 1 - 0x4C740000, // 00D2 LDNIL R29 - 0x9012781D, // 00D3 SETMBR R4 K60 R29 - 0x8C74033D, // 00D4 GETMET R29 R1 K61 - 0x547E0032, // 00D5 LDINT R31 51 - 0x50800200, // 00D6 LDBOOL R32 1 0 - 0x7C740600, // 00D7 CALL R29 3 - 0x8C783B3E, // 00D8 GETMET R30 R29 K62 - 0x5C803800, // 00D9 MOVE R32 R28 - 0x7C780400, // 00DA CALL R30 2 - 0x887C013F, // 00DB GETMBR R31 R0 K63 - 0x8C7C3F40, // 00DC GETMET R31 R31 K64 - 0x5C843A00, // 00DD MOVE R33 R29 - 0x7C7C0400, // 00DE CALL R31 2 - 0x8C7C0941, // 00DF GETMET R31 R4 K65 - 0x7C7C0200, // 00E0 CALL R31 1 - 0x8C7C0942, // 00E1 GETMET R31 R4 K66 + 0x604C0015, // 005F GETGBL R19 G21 + 0x7C4C0000, // 0060 CALL R19 0 + 0x6050000C, // 0061 GETGBL R20 G12 + 0x5C541600, // 0062 MOVE R21 R11 + 0x7C500200, // 0063 CALL R20 1 + 0x5456000F, // 0064 LDINT R21 16 + 0x7C3C0C00, // 0065 CALL R15 6 + 0x5C341E00, // 0066 MOVE R13 R15 + 0x8C3C1B23, // 0067 GETMET R15 R13 K35 + 0x5C441600, // 0068 MOVE R17 R11 + 0x7C3C0400, // 0069 CALL R15 2 + 0x5C381E00, // 006A MOVE R14 R15 + 0x8C3C1B24, // 006B GETMET R15 R13 K36 + 0x7C3C0200, // 006C CALL R15 1 + 0x1C40180F, // 006D EQ R16 R12 R15 + 0x78420085, // 006E JMPF R16 #00F5 + 0x88400D19, // 006F GETMBR R16 R6 K25 + 0x900E3210, // 0070 SETMBR R3 K25 R16 + 0x88400326, // 0071 GETMBR R16 R1 K38 + 0x900E4A10, // 0072 SETMBR R3 K37 R16 + 0x8C400727, // 0073 GETMET R16 R3 K39 + 0x7C400200, // 0074 CALL R16 1 + 0x88400929, // 0075 GETMBR R16 R4 K41 + 0x900E5010, // 0076 SETMBR R3 K40 R16 + 0x88400116, // 0077 GETMBR R16 R0 K22 + 0x88402117, // 0078 GETMBR R16 R16 K23 + 0x8C40212B, // 0079 GETMET R16 R16 K43 + 0x7C400200, // 007A CALL R16 1 + 0x900E5410, // 007B SETMBR R3 K42 R16 + 0xB8420C00, // 007C GETNGBL R16 K6 + 0x8C402107, // 007D GETMET R16 R16 K7 + 0x60480018, // 007E GETGBL R18 G24 + 0x584C002C, // 007F LDCONST R19 K44 + 0x8850072A, // 0080 GETMBR R20 R3 K42 + 0x8854032D, // 0081 GETMBR R21 R1 K45 + 0x8858032E, // 0082 GETMBR R22 R1 K46 + 0x7C480800, // 0083 CALL R18 4 + 0x584C0009, // 0084 LDCONST R19 K9 + 0x7C400600, // 0085 CALL R16 3 + 0x88400D1F, // 0086 GETMBR R16 R6 K31 + 0x900E3E10, // 0087 SETMBR R3 K31 R16 + 0x8C400530, // 0088 GETMET R16 R2 K48 + 0x544A000F, // 0089 LDINT R18 16 + 0x7C400400, // 008A CALL R16 2 + 0x900E5E10, // 008B SETMBR R3 K47 R16 + 0x60400015, // 008C GETGBL R16 G21 + 0x7C400000, // 008D CALL R16 0 + 0x8C40211B, // 008E GETMET R16 R16 K27 + 0x58480031, // 008F LDCONST R18 K49 + 0x7C400400, // 0090 CALL R16 2 + 0x8844091A, // 0091 GETMBR R17 R4 K26 + 0x8848072F, // 0092 GETMBR R18 R3 K47 + 0x00442212, // 0093 ADD R17 R17 R18 + 0x8C48051D, // 0094 GETMET R18 R2 K29 + 0x7C480200, // 0095 CALL R18 1 + 0x8C48251E, // 0096 GETMET R18 R18 K30 + 0x8850071F, // 0097 GETMBR R20 R3 K31 + 0x5C542200, // 0098 MOVE R21 R17 + 0x5C582000, // 0099 MOVE R22 R16 + 0x545E000F, // 009A LDINT R23 16 + 0x7C480A00, // 009B CALL R18 5 + 0x8C4C0522, // 009C GETMET R19 R2 K34 + 0x5C542400, // 009D MOVE R21 R18 + 0x60580015, // 009E GETGBL R22 G21 + 0x7C580000, // 009F CALL R22 0 + 0x8C582D1B, // 00A0 GETMET R22 R22 K27 + 0x58600032, // 00A1 LDCONST R24 K50 + 0x7C580400, // 00A2 CALL R22 2 + 0x605C0015, // 00A3 GETGBL R23 G21 + 0x7C5C0000, // 00A4 CALL R23 0 + 0x58600004, // 00A5 LDCONST R24 K4 + 0x5466000F, // 00A6 LDINT R25 16 + 0x7C4C0C00, // 00A7 CALL R19 6 + 0x8C502724, // 00A8 GETMET R20 R19 K36 + 0x7C500200, // 00A9 CALL R20 1 + 0xB8561A00, // 00AA GETNGBL R21 K13 + 0x8C542B33, // 00AB GETMET R21 R21 K51 + 0x7C540200, // 00AC CALL R21 1 + 0x8858072F, // 00AD GETMBR R22 R3 K47 + 0x90562816, // 00AE SETMBR R21 K20 R22 + 0x8858072A, // 00AF GETMBR R22 R3 K42 + 0x90566816, // 00B0 SETMBR R21 K52 R22 + 0x90566A14, // 00B1 SETMBR R21 K53 R20 + 0x8C58051D, // 00B2 GETMET R22 R2 K29 + 0x7C580200, // 00B3 CALL R22 1 + 0x8C582D1E, // 00B4 GETMET R22 R22 K30 + 0x8860071F, // 00B5 GETMBR R24 R3 K31 + 0x8864091A, // 00B6 GETMBR R25 R4 K26 + 0x8868072F, // 00B7 GETMBR R26 R3 K47 + 0x0064321A, // 00B8 ADD R25 R25 R26 + 0x60680015, // 00B9 GETGBL R26 G21 + 0x7C680000, // 00BA CALL R26 0 + 0x8C68351B, // 00BB GETMET R26 R26 K27 + 0x58700036, // 00BC LDCONST R28 K54 + 0x7C680400, // 00BD CALL R26 2 + 0x546E002F, // 00BE LDINT R27 48 + 0x7C580A00, // 00BF CALL R22 5 + 0x545E000E, // 00C0 LDINT R23 15 + 0x405E0817, // 00C1 CONNECT R23 K4 R23 + 0x945C2C17, // 00C2 GETIDX R23 R22 R23 + 0x5462000F, // 00C3 LDINT R24 16 + 0x5466001E, // 00C4 LDINT R25 31 + 0x40603019, // 00C5 CONNECT R24 R24 R25 + 0x94602C18, // 00C6 GETIDX R24 R22 R24 + 0x5466001F, // 00C7 LDINT R25 32 + 0x546A002E, // 00C8 LDINT R26 47 + 0x4064321A, // 00C9 CONNECT R25 R25 R26 + 0x94642C19, // 00CA GETIDX R25 R22 R25 + 0xB86A0C00, // 00CB GETNGBL R26 K6 + 0x8C683537, // 00CC GETMET R26 R26 K55 + 0x7C680200, // 00CD CALL R26 1 + 0x94683538, // 00CE GETIDX R26 R26 K56 + 0x8C6C2B39, // 00CF GETMET R27 R21 K57 + 0x7C6C0200, // 00D0 CALL R27 1 + 0x4C700000, // 00D1 LDNIL R28 + 0x900E741C, // 00D2 SETMBR R3 K58 R28 + 0x8C70033B, // 00D3 GETMET R28 R1 K59 + 0x547A0032, // 00D4 LDINT R30 51 + 0x507C0200, // 00D5 LDBOOL R31 1 0 + 0x7C700600, // 00D6 CALL R28 3 + 0x8C74393C, // 00D7 GETMET R29 R28 K60 + 0x5C7C3600, // 00D8 MOVE R31 R27 + 0x7C740400, // 00D9 CALL R29 2 + 0x8878013D, // 00DA GETMBR R30 R0 K61 + 0x8C783D3E, // 00DB GETMET R30 R30 K62 + 0x5C803800, // 00DC MOVE R32 R28 + 0x7C780400, // 00DD CALL R30 2 + 0x8C78073F, // 00DE GETMET R30 R3 K63 + 0x7C780200, // 00DF CALL R30 1 + 0x8C780740, // 00E0 GETMET R30 R3 K64 + 0x5C802E00, // 00E1 MOVE R32 R23 0x5C843000, // 00E2 MOVE R33 R24 0x5C883200, // 00E3 MOVE R34 R25 0x5C8C3400, // 00E4 MOVE R35 R26 - 0x5C903600, // 00E5 MOVE R36 R27 - 0x7C7C0A00, // 00E6 CALL R31 5 - 0x90128705, // 00E7 SETMBR R4 K67 K5 - 0x8C7C0944, // 00E8 GETMET R31 R4 K68 - 0x7C7C0200, // 00E9 CALL R31 1 - 0x8C7C0945, // 00EA GETMET R31 R4 K69 - 0x50840200, // 00EB LDBOOL R33 1 0 - 0x7C7C0400, // 00EC CALL R31 2 - 0x8C7C0946, // 00ED GETMET R31 R4 K70 - 0x7C7C0200, // 00EE CALL R31 1 - 0x8C7C0947, // 00EF GETMET R31 R4 K71 - 0x7C7C0200, // 00F0 CALL R31 1 - 0x8C7C0948, // 00F1 GETMET R31 R4 K72 - 0x7C7C0200, // 00F2 CALL R31 1 - 0x507C0200, // 00F3 LDBOOL R31 1 0 - 0x80043E00, // 00F4 RET 1 R31 - 0x70020000, // 00F5 JMP #00F7 - 0x50180000, // 00F6 LDBOOL R6 0 0 - 0x5C200C00, // 00F7 MOVE R8 R6 - 0x742200E6, // 00F8 JMPT R8 #01E0 - 0x8C200149, // 00F9 GETMET R8 R0 K73 - 0x88280B4A, // 00FA GETMBR R10 R5 K74 - 0x882C0B1B, // 00FB GETMBR R11 R5 K27 - 0x7C200600, // 00FC CALL R8 3 - 0x90123408, // 00FD SETMBR R4 K26 R8 - 0x4C240000, // 00FE LDNIL R9 - 0x1C240809, // 00FF EQ R9 R4 R9 - 0x74260003, // 0100 JMPT R9 #0105 - 0x8824091A, // 0101 GETMBR R9 R4 K26 - 0x4C280000, // 0102 LDNIL R10 - 0x1C24120A, // 0103 EQ R9 R9 R10 - 0x7826000D, // 0104 JMPF R9 #0113 - 0xB8260E00, // 0105 GETNGBL R9 K7 - 0x8C241308, // 0106 GETMET R9 R9 K8 - 0x582C004B, // 0107 LDCONST R11 K75 - 0x5830000A, // 0108 LDCONST R12 K10 - 0x7C240600, // 0109 CALL R9 3 - 0x8C24010B, // 010A GETMET R9 R0 K11 - 0x5C2C0200, // 010B MOVE R11 R1 - 0x5830000C, // 010C LDCONST R12 K12 - 0x58340005, // 010D LDCONST R13 K5 - 0x5838000C, // 010E LDCONST R14 K12 - 0x503C0000, // 010F LDBOOL R15 0 0 - 0x7C240C00, // 0110 CALL R9 6 - 0x50240000, // 0111 LDBOOL R9 0 0 - 0x80041200, // 0112 RET 1 R9 - 0x88240327, // 0113 GETMBR R9 R1 K39 - 0x90124C09, // 0114 SETMBR R4 K38 R9 - 0x8C240928, // 0115 GETMET R9 R4 K40 - 0x7C240200, // 0116 CALL R9 1 - 0x88240B2A, // 0117 GETMBR R9 R5 K42 - 0x90125209, // 0118 SETMBR R4 K41 R9 - 0x88240117, // 0119 GETMBR R9 R0 K23 - 0x88241318, // 011A GETMBR R9 R9 K24 - 0x8C24132C, // 011B GETMET R9 R9 K44 - 0x7C240200, // 011C CALL R9 1 - 0x90125609, // 011D SETMBR R4 K43 R9 - 0xB8260E00, // 011E GETNGBL R9 K7 - 0x8C241308, // 011F GETMET R9 R9 K8 - 0x8C2C072D, // 0120 GETMET R11 R3 K45 - 0x5834002E, // 0121 LDCONST R13 K46 - 0x8838092B, // 0122 GETMBR R14 R4 K43 - 0x883C032F, // 0123 GETMBR R15 R1 K47 - 0x88400330, // 0124 GETMBR R16 R1 K48 - 0x7C2C0A00, // 0125 CALL R11 5 - 0x5830000A, // 0126 LDCONST R12 K10 - 0x7C240600, // 0127 CALL R9 3 - 0x8C240532, // 0128 GETMET R9 R2 K50 - 0x542E000F, // 0129 LDINT R11 16 - 0x7C240400, // 012A CALL R9 2 - 0x90126209, // 012B SETMBR R4 K49 R9 - 0x8C240532, // 012C GETMET R9 R2 K50 - 0x542E001F, // 012D LDINT R11 32 - 0x7C240400, // 012E CALL R9 2 - 0x90129809, // 012F SETMBR R4 K76 R9 - 0x8C24054E, // 0130 GETMET R9 R2 K78 - 0x7C240200, // 0131 CALL R9 1 - 0x8C24134F, // 0132 GETMET R9 R9 K79 - 0x882C094C, // 0133 GETMBR R11 R4 K76 - 0x7C240400, // 0134 CALL R9 2 - 0x90129A09, // 0135 SETMBR R4 K77 R9 - 0x8C240532, // 0136 GETMET R9 R2 K50 - 0x542E001F, // 0137 LDINT R11 32 - 0x7C240400, // 0138 CALL R9 2 - 0x8C28054E, // 0139 GETMET R10 R2 K78 - 0x7C280200, // 013A CALL R10 1 - 0x8C281550, // 013B GETMET R10 R10 K80 - 0x8830094C, // 013C GETMBR R12 R4 K76 - 0x88340B14, // 013D GETMBR R13 R5 K20 - 0x7C280600, // 013E CALL R10 3 - 0x9012400A, // 013F SETMBR R4 K32 R10 - 0xB82A1C00, // 0140 GETNGBL R10 K14 - 0x88281551, // 0141 GETMBR R10 R10 K81 - 0x8C281552, // 0142 GETMET R10 R10 K82 - 0x7C280200, // 0143 CALL R10 1 - 0x8C2C1553, // 0144 GETMET R11 R10 K83 - 0x5834000C, // 0145 LDCONST R13 K12 - 0xB83A1C00, // 0146 GETNGBL R14 K14 - 0x88381D51, // 0147 GETMBR R14 R14 K81 - 0x88381D54, // 0148 GETMBR R14 R14 K84 - 0x8C3C1155, // 0149 GETMET R15 R8 K85 - 0x7C3C0200, // 014A CALL R15 1 - 0x7C2C0800, // 014B CALL R11 4 - 0x8C2C1553, // 014C GETMET R11 R10 K83 - 0x5834000D, // 014D LDCONST R13 K13 - 0xB83A1C00, // 014E GETNGBL R14 K14 - 0x88381D51, // 014F GETMBR R14 R14 K81 - 0x88381D54, // 0150 GETMBR R14 R14 K84 - 0x8C3C1156, // 0151 GETMET R15 R8 K86 - 0x7C3C0200, // 0152 CALL R15 1 - 0x7C2C0800, // 0153 CALL R11 4 - 0x8C2C1553, // 0154 GETMET R11 R10 K83 - 0x5834000A, // 0155 LDCONST R13 K10 - 0xB83A1C00, // 0156 GETNGBL R14 K14 - 0x88381D51, // 0157 GETMBR R14 R14 K81 - 0x88381D54, // 0158 GETMBR R14 R14 K84 - 0x883C094D, // 0159 GETMBR R15 R4 K77 - 0x7C2C0800, // 015A CALL R11 4 - 0x8C2C1553, // 015B GETMET R11 R10 K83 - 0x54360003, // 015C LDINT R13 4 - 0xB83A1C00, // 015D GETNGBL R14 K14 - 0x88381D51, // 015E GETMBR R14 R14 K81 - 0x88381D54, // 015F GETMBR R14 R14 K84 - 0x883C0B14, // 0160 GETMBR R15 R5 K20 - 0x7C2C0800, // 0161 CALL R11 4 - 0x8C2C054E, // 0162 GETMET R11 R2 K78 - 0x7C2C0200, // 0163 CALL R11 1 - 0x8C2C1757, // 0164 GETMET R11 R11 K87 - 0x8C341158, // 0165 GETMET R13 R8 K88 - 0x7C340200, // 0166 CALL R13 1 - 0x8C38153B, // 0167 GETMET R14 R10 K59 - 0x7C380200, // 0168 CALL R14 1 - 0x7C2C0600, // 0169 CALL R11 3 - 0xB8321C00, // 016A GETNGBL R12 K14 - 0x88301951, // 016B GETMBR R12 R12 K81 - 0x8C301952, // 016C GETMET R12 R12 K82 - 0x7C300200, // 016D CALL R12 1 - 0x8C341953, // 016E GETMET R13 R12 K83 - 0x583C000C, // 016F LDCONST R15 K12 - 0xB8421C00, // 0170 GETNGBL R16 K14 - 0x88402151, // 0171 GETMBR R16 R16 K81 - 0x88402154, // 0172 GETMBR R16 R16 K84 - 0x8C441155, // 0173 GETMET R17 R8 K85 - 0x7C440200, // 0174 CALL R17 1 - 0x7C340800, // 0175 CALL R13 4 - 0x8C341953, // 0176 GETMET R13 R12 K83 - 0x583C000D, // 0177 LDCONST R15 K13 - 0xB8421C00, // 0178 GETNGBL R16 K14 - 0x88402151, // 0179 GETMBR R16 R16 K81 - 0x88402154, // 017A GETMBR R16 R16 K84 - 0x8C441156, // 017B GETMET R17 R8 K86 - 0x7C440200, // 017C CALL R17 1 - 0x7C340800, // 017D CALL R13 4 - 0x8C341953, // 017E GETMET R13 R12 K83 - 0x583C000A, // 017F LDCONST R15 K10 - 0xB8421C00, // 0180 GETNGBL R16 K14 - 0x88402151, // 0181 GETMBR R16 R16 K81 - 0x88402154, // 0182 GETMBR R16 R16 K84 - 0x5C441600, // 0183 MOVE R17 R11 - 0x7C340800, // 0184 CALL R13 4 - 0x8C341953, // 0185 GETMET R13 R12 K83 - 0x543E0003, // 0186 LDINT R15 4 - 0xB8421C00, // 0187 GETNGBL R16 K14 - 0x88402151, // 0188 GETMBR R16 R16 K81 - 0x88402154, // 0189 GETMBR R16 R16 K84 - 0x88440931, // 018A GETMBR R17 R4 K49 - 0x7C340800, // 018B CALL R13 4 - 0x88340B59, // 018C GETMBR R13 R5 K89 - 0x9012780D, // 018D SETMBR R4 K60 R13 - 0x8C34055A, // 018E GETMET R13 R2 K90 - 0x7C340200, // 018F CALL R13 1 - 0x8C341B5B, // 0190 GETMET R13 R13 K91 - 0x883C093C, // 0191 GETMBR R15 R4 K60 - 0x7C340400, // 0192 CALL R13 2 - 0x8C341B5C, // 0193 GETMET R13 R13 K92 - 0x7C340200, // 0194 CALL R13 1 - 0x60380015, // 0195 GETGBL R14 G21 - 0x7C380000, // 0196 CALL R14 0 - 0x8C381D1C, // 0197 GETMET R14 R14 K28 - 0x8840015D, // 0198 GETMBR R16 R0 K93 - 0x7C380400, // 0199 CALL R14 2 - 0x8C3C115E, // 019A GETMET R15 R8 K94 - 0x7C3C0200, // 019B CALL R15 1 - 0x003C1E09, // 019C ADD R15 R15 R9 - 0x8840094D, // 019D GETMBR R16 R4 K77 - 0x003C1E10, // 019E ADD R15 R15 R16 - 0x003C1E0D, // 019F ADD R15 R15 R13 - 0x8C40051E, // 01A0 GETMET R16 R2 K30 - 0x7C400200, // 01A1 CALL R16 1 - 0x8C40211F, // 01A2 GETMET R16 R16 K31 - 0x88480920, // 01A3 GETMBR R18 R4 K32 - 0x5C4C1E00, // 01A4 MOVE R19 R15 - 0x5C501C00, // 01A5 MOVE R20 R14 - 0x5456000F, // 01A6 LDINT R21 16 - 0x7C400A00, // 01A7 CALL R16 5 - 0x8C44193B, // 01A8 GETMET R17 R12 K59 - 0x7C440200, // 01A9 CALL R17 1 - 0x8C480523, // 01AA GETMET R18 R2 K35 - 0x5C502000, // 01AB MOVE R20 R16 - 0x60540015, // 01AC GETGBL R21 G21 - 0x7C540000, // 01AD CALL R21 0 - 0x8C542B1C, // 01AE GETMET R21 R21 K28 - 0x885C015F, // 01AF GETMBR R23 R0 K95 - 0x7C540400, // 01B0 CALL R21 2 - 0x60580015, // 01B1 GETGBL R22 G21 - 0x7C580000, // 01B2 CALL R22 0 - 0x605C000C, // 01B3 GETGBL R23 G12 - 0x5C602200, // 01B4 MOVE R24 R17 - 0x7C5C0200, // 01B5 CALL R23 1 - 0x5462000F, // 01B6 LDINT R24 16 - 0x7C480C00, // 01B7 CALL R18 6 - 0x8C4C2560, // 01B8 GETMET R19 R18 K96 - 0x5C542200, // 01B9 MOVE R21 R17 - 0x7C4C0400, // 01BA CALL R19 2 - 0x8C502525, // 01BB GETMET R20 R18 K37 - 0x7C500200, // 01BC CALL R20 1 - 0x004C2614, // 01BD ADD R19 R19 R20 - 0xB8521C00, // 01BE GETNGBL R20 K14 - 0x8C502961, // 01BF GETMET R20 R20 K97 - 0x7C500200, // 01C0 CALL R20 1 - 0x9052C409, // 01C1 SETMBR R20 K98 R9 - 0x8854092B, // 01C2 GETMBR R21 R4 K43 - 0x9052C615, // 01C3 SETMBR R20 K99 R21 - 0x8854094D, // 01C4 GETMBR R21 R4 K77 - 0x9052C815, // 01C5 SETMBR R20 K100 R21 - 0x9052CA13, // 01C6 SETMBR R20 K101 R19 - 0x8C54293B, // 01C7 GETMET R21 R20 K59 - 0x7C540200, // 01C8 CALL R21 1 - 0x9012CC15, // 01C9 SETMBR R4 K102 R21 - 0x8C58033D, // 01CA GETMET R22 R1 K61 - 0x54620030, // 01CB LDINT R24 49 - 0x50640200, // 01CC LDBOOL R25 1 0 - 0x7C580600, // 01CD CALL R22 3 - 0x8C5C2D3E, // 01CE GETMET R23 R22 K62 - 0x5C642A00, // 01CF MOVE R25 R21 - 0x7C5C0400, // 01D0 CALL R23 2 - 0xB8620E00, // 01D1 GETNGBL R24 K7 - 0x8C603108, // 01D2 GETMET R24 R24 K8 - 0x8C68072D, // 01D3 GETMET R26 R3 K45 - 0x58700067, // 01D4 LDCONST R28 K103 - 0x8874092B, // 01D5 GETMBR R29 R4 K43 - 0x88780968, // 01D6 GETMBR R30 R4 K104 - 0x887C0969, // 01D7 GETMBR R31 R4 K105 - 0x7C680A00, // 01D8 CALL R26 5 - 0x7C600400, // 01D9 CALL R24 2 - 0x8860013F, // 01DA GETMBR R24 R0 K63 - 0x8C603140, // 01DB GETMET R24 R24 K64 - 0x5C682C00, // 01DC MOVE R26 R22 - 0x7C600400, // 01DD CALL R24 2 - 0x50600200, // 01DE LDBOOL R24 1 0 - 0x80043000, // 01DF RET 1 R24 - 0x50200200, // 01E0 LDBOOL R8 1 0 - 0x80041000, // 01E1 RET 1 R8 + 0x7C780A00, // 00E5 CALL R30 5 + 0x900E8304, // 00E6 SETMBR R3 K65 K4 + 0x8C780742, // 00E7 GETMET R30 R3 K66 + 0x7C780200, // 00E8 CALL R30 1 + 0x8C780743, // 00E9 GETMET R30 R3 K67 + 0x50800200, // 00EA LDBOOL R32 1 0 + 0x7C780400, // 00EB CALL R30 2 + 0x8C780744, // 00EC GETMET R30 R3 K68 + 0x7C780200, // 00ED CALL R30 1 + 0x8C780745, // 00EE GETMET R30 R3 K69 + 0x7C780200, // 00EF CALL R30 1 + 0x8C780746, // 00F0 GETMET R30 R3 K70 + 0x7C780200, // 00F1 CALL R30 1 + 0x50780200, // 00F2 LDBOOL R30 1 0 + 0x80043C00, // 00F3 RET 1 R30 + 0x70020000, // 00F4 JMP #00F6 + 0x50140000, // 00F5 LDBOOL R5 0 0 + 0x5C1C0A00, // 00F6 MOVE R7 R5 + 0x741E00E6, // 00F7 JMPT R7 #01DF + 0x8C1C0147, // 00F8 GETMET R7 R0 K71 + 0x88240948, // 00F9 GETMBR R9 R4 K72 + 0x8828091A, // 00FA GETMBR R10 R4 K26 + 0x7C1C0600, // 00FB CALL R7 3 + 0x900E3207, // 00FC SETMBR R3 K25 R7 + 0x4C200000, // 00FD LDNIL R8 + 0x1C200608, // 00FE EQ R8 R3 R8 + 0x74220003, // 00FF JMPT R8 #0104 + 0x88200719, // 0100 GETMBR R8 R3 K25 + 0x4C240000, // 0101 LDNIL R9 + 0x1C201009, // 0102 EQ R8 R8 R9 + 0x7822000D, // 0103 JMPF R8 #0112 + 0xB8220C00, // 0104 GETNGBL R8 K6 + 0x8C201107, // 0105 GETMET R8 R8 K7 + 0x58280049, // 0106 LDCONST R10 K73 + 0x582C0009, // 0107 LDCONST R11 K9 + 0x7C200600, // 0108 CALL R8 3 + 0x8C20010A, // 0109 GETMET R8 R0 K10 + 0x5C280200, // 010A MOVE R10 R1 + 0x582C000B, // 010B LDCONST R11 K11 + 0x58300004, // 010C LDCONST R12 K4 + 0x5834000B, // 010D LDCONST R13 K11 + 0x50380000, // 010E LDBOOL R14 0 0 + 0x7C200C00, // 010F CALL R8 6 + 0x50200000, // 0110 LDBOOL R8 0 0 + 0x80041000, // 0111 RET 1 R8 + 0x88200326, // 0112 GETMBR R8 R1 K38 + 0x900E4A08, // 0113 SETMBR R3 K37 R8 + 0x8C200727, // 0114 GETMET R8 R3 K39 + 0x7C200200, // 0115 CALL R8 1 + 0x88200929, // 0116 GETMBR R8 R4 K41 + 0x900E5008, // 0117 SETMBR R3 K40 R8 + 0x88200116, // 0118 GETMBR R8 R0 K22 + 0x88201117, // 0119 GETMBR R8 R8 K23 + 0x8C20112B, // 011A GETMET R8 R8 K43 + 0x7C200200, // 011B CALL R8 1 + 0x900E5408, // 011C SETMBR R3 K42 R8 + 0xB8220C00, // 011D GETNGBL R8 K6 + 0x8C201107, // 011E GETMET R8 R8 K7 + 0x60280018, // 011F GETGBL R10 G24 + 0x582C002C, // 0120 LDCONST R11 K44 + 0x8830072A, // 0121 GETMBR R12 R3 K42 + 0x8834032D, // 0122 GETMBR R13 R1 K45 + 0x8838032E, // 0123 GETMBR R14 R1 K46 + 0x7C280800, // 0124 CALL R10 4 + 0x582C0009, // 0125 LDCONST R11 K9 + 0x7C200600, // 0126 CALL R8 3 + 0x8C200530, // 0127 GETMET R8 R2 K48 + 0x542A000F, // 0128 LDINT R10 16 + 0x7C200400, // 0129 CALL R8 2 + 0x900E5E08, // 012A SETMBR R3 K47 R8 + 0x8C200530, // 012B GETMET R8 R2 K48 + 0x542A001F, // 012C LDINT R10 32 + 0x7C200400, // 012D CALL R8 2 + 0x900E9408, // 012E SETMBR R3 K74 R8 + 0x8C20054C, // 012F GETMET R8 R2 K76 + 0x7C200200, // 0130 CALL R8 1 + 0x8C20114D, // 0131 GETMET R8 R8 K77 + 0x8828074A, // 0132 GETMBR R10 R3 K74 + 0x7C200400, // 0133 CALL R8 2 + 0x900E9608, // 0134 SETMBR R3 K75 R8 + 0x8C200530, // 0135 GETMET R8 R2 K48 + 0x542A001F, // 0136 LDINT R10 32 + 0x7C200400, // 0137 CALL R8 2 + 0x8C24054C, // 0138 GETMET R9 R2 K76 + 0x7C240200, // 0139 CALL R9 1 + 0x8C24134E, // 013A GETMET R9 R9 K78 + 0x882C074A, // 013B GETMBR R11 R3 K74 + 0x88300913, // 013C GETMBR R12 R4 K19 + 0x7C240600, // 013D CALL R9 3 + 0x900E3E09, // 013E SETMBR R3 K31 R9 + 0xB8261A00, // 013F GETNGBL R9 K13 + 0x8824134F, // 0140 GETMBR R9 R9 K79 + 0x8C241350, // 0141 GETMET R9 R9 K80 + 0x7C240200, // 0142 CALL R9 1 + 0x8C281351, // 0143 GETMET R10 R9 K81 + 0x5830000B, // 0144 LDCONST R12 K11 + 0xB8361A00, // 0145 GETNGBL R13 K13 + 0x88341B4F, // 0146 GETMBR R13 R13 K79 + 0x88341B52, // 0147 GETMBR R13 R13 K82 + 0x8C380F53, // 0148 GETMET R14 R7 K83 + 0x7C380200, // 0149 CALL R14 1 + 0x7C280800, // 014A CALL R10 4 + 0x8C281351, // 014B GETMET R10 R9 K81 + 0x5830000C, // 014C LDCONST R12 K12 + 0xB8361A00, // 014D GETNGBL R13 K13 + 0x88341B4F, // 014E GETMBR R13 R13 K79 + 0x88341B52, // 014F GETMBR R13 R13 K82 + 0x8C380F54, // 0150 GETMET R14 R7 K84 + 0x7C380200, // 0151 CALL R14 1 + 0x7C280800, // 0152 CALL R10 4 + 0x8C281351, // 0153 GETMET R10 R9 K81 + 0x58300009, // 0154 LDCONST R12 K9 + 0xB8361A00, // 0155 GETNGBL R13 K13 + 0x88341B4F, // 0156 GETMBR R13 R13 K79 + 0x88341B52, // 0157 GETMBR R13 R13 K82 + 0x8838074B, // 0158 GETMBR R14 R3 K75 + 0x7C280800, // 0159 CALL R10 4 + 0x8C281351, // 015A GETMET R10 R9 K81 + 0x54320003, // 015B LDINT R12 4 + 0xB8361A00, // 015C GETNGBL R13 K13 + 0x88341B4F, // 015D GETMBR R13 R13 K79 + 0x88341B52, // 015E GETMBR R13 R13 K82 + 0x88380913, // 015F GETMBR R14 R4 K19 + 0x7C280800, // 0160 CALL R10 4 + 0x8C28054C, // 0161 GETMET R10 R2 K76 + 0x7C280200, // 0162 CALL R10 1 + 0x8C281555, // 0163 GETMET R10 R10 K85 + 0x8C300F56, // 0164 GETMET R12 R7 K86 + 0x7C300200, // 0165 CALL R12 1 + 0x8C341339, // 0166 GETMET R13 R9 K57 + 0x7C340200, // 0167 CALL R13 1 + 0x7C280600, // 0168 CALL R10 3 + 0xB82E1A00, // 0169 GETNGBL R11 K13 + 0x882C174F, // 016A GETMBR R11 R11 K79 + 0x8C2C1750, // 016B GETMET R11 R11 K80 + 0x7C2C0200, // 016C CALL R11 1 + 0x8C301751, // 016D GETMET R12 R11 K81 + 0x5838000B, // 016E LDCONST R14 K11 + 0xB83E1A00, // 016F GETNGBL R15 K13 + 0x883C1F4F, // 0170 GETMBR R15 R15 K79 + 0x883C1F52, // 0171 GETMBR R15 R15 K82 + 0x8C400F53, // 0172 GETMET R16 R7 K83 + 0x7C400200, // 0173 CALL R16 1 + 0x7C300800, // 0174 CALL R12 4 + 0x8C301751, // 0175 GETMET R12 R11 K81 + 0x5838000C, // 0176 LDCONST R14 K12 + 0xB83E1A00, // 0177 GETNGBL R15 K13 + 0x883C1F4F, // 0178 GETMBR R15 R15 K79 + 0x883C1F52, // 0179 GETMBR R15 R15 K82 + 0x8C400F54, // 017A GETMET R16 R7 K84 + 0x7C400200, // 017B CALL R16 1 + 0x7C300800, // 017C CALL R12 4 + 0x8C301751, // 017D GETMET R12 R11 K81 + 0x58380009, // 017E LDCONST R14 K9 + 0xB83E1A00, // 017F GETNGBL R15 K13 + 0x883C1F4F, // 0180 GETMBR R15 R15 K79 + 0x883C1F52, // 0181 GETMBR R15 R15 K82 + 0x5C401400, // 0182 MOVE R16 R10 + 0x7C300800, // 0183 CALL R12 4 + 0x8C301751, // 0184 GETMET R12 R11 K81 + 0x543A0003, // 0185 LDINT R14 4 + 0xB83E1A00, // 0186 GETNGBL R15 K13 + 0x883C1F4F, // 0187 GETMBR R15 R15 K79 + 0x883C1F52, // 0188 GETMBR R15 R15 K82 + 0x8840072F, // 0189 GETMBR R16 R3 K47 + 0x7C300800, // 018A CALL R12 4 + 0x88300957, // 018B GETMBR R12 R4 K87 + 0x900E740C, // 018C SETMBR R3 K58 R12 + 0x8C300558, // 018D GETMET R12 R2 K88 + 0x7C300200, // 018E CALL R12 1 + 0x8C301959, // 018F GETMET R12 R12 K89 + 0x8838073A, // 0190 GETMBR R14 R3 K58 + 0x7C300400, // 0191 CALL R12 2 + 0x8C30195A, // 0192 GETMET R12 R12 K90 + 0x7C300200, // 0193 CALL R12 1 + 0x60340015, // 0194 GETGBL R13 G21 + 0x7C340000, // 0195 CALL R13 0 + 0x8C341B1B, // 0196 GETMET R13 R13 K27 + 0x883C015B, // 0197 GETMBR R15 R0 K91 + 0x7C340400, // 0198 CALL R13 2 + 0x8C380F5C, // 0199 GETMET R14 R7 K92 + 0x7C380200, // 019A CALL R14 1 + 0x00381C08, // 019B ADD R14 R14 R8 + 0x883C074B, // 019C GETMBR R15 R3 K75 + 0x00381C0F, // 019D ADD R14 R14 R15 + 0x00381C0C, // 019E ADD R14 R14 R12 + 0x8C3C051D, // 019F GETMET R15 R2 K29 + 0x7C3C0200, // 01A0 CALL R15 1 + 0x8C3C1F1E, // 01A1 GETMET R15 R15 K30 + 0x8844071F, // 01A2 GETMBR R17 R3 K31 + 0x5C481C00, // 01A3 MOVE R18 R14 + 0x5C4C1A00, // 01A4 MOVE R19 R13 + 0x5452000F, // 01A5 LDINT R20 16 + 0x7C3C0A00, // 01A6 CALL R15 5 + 0x8C401739, // 01A7 GETMET R16 R11 K57 + 0x7C400200, // 01A8 CALL R16 1 + 0x8C440522, // 01A9 GETMET R17 R2 K34 + 0x5C4C1E00, // 01AA MOVE R19 R15 + 0x60500015, // 01AB GETGBL R20 G21 + 0x7C500000, // 01AC CALL R20 0 + 0x8C50291B, // 01AD GETMET R20 R20 K27 + 0x8858015D, // 01AE GETMBR R22 R0 K93 + 0x7C500400, // 01AF CALL R20 2 + 0x60540015, // 01B0 GETGBL R21 G21 + 0x7C540000, // 01B1 CALL R21 0 + 0x6058000C, // 01B2 GETGBL R22 G12 + 0x5C5C2000, // 01B3 MOVE R23 R16 + 0x7C580200, // 01B4 CALL R22 1 + 0x545E000F, // 01B5 LDINT R23 16 + 0x7C440C00, // 01B6 CALL R17 6 + 0x8C48235E, // 01B7 GETMET R18 R17 K94 + 0x5C502000, // 01B8 MOVE R20 R16 + 0x7C480400, // 01B9 CALL R18 2 + 0x8C4C2324, // 01BA GETMET R19 R17 K36 + 0x7C4C0200, // 01BB CALL R19 1 + 0x00482413, // 01BC ADD R18 R18 R19 + 0xB84E1A00, // 01BD GETNGBL R19 K13 + 0x8C4C275F, // 01BE GETMET R19 R19 K95 + 0x7C4C0200, // 01BF CALL R19 1 + 0x904EC008, // 01C0 SETMBR R19 K96 R8 + 0x8850072A, // 01C1 GETMBR R20 R3 K42 + 0x904EC214, // 01C2 SETMBR R19 K97 R20 + 0x8850074B, // 01C3 GETMBR R20 R3 K75 + 0x904EC414, // 01C4 SETMBR R19 K98 R20 + 0x904EC612, // 01C5 SETMBR R19 K99 R18 + 0x8C502739, // 01C6 GETMET R20 R19 K57 + 0x7C500200, // 01C7 CALL R20 1 + 0x900EC814, // 01C8 SETMBR R3 K100 R20 + 0x8C54033B, // 01C9 GETMET R21 R1 K59 + 0x545E0030, // 01CA LDINT R23 49 + 0x50600200, // 01CB LDBOOL R24 1 0 + 0x7C540600, // 01CC CALL R21 3 + 0x8C582B3C, // 01CD GETMET R22 R21 K60 + 0x5C602800, // 01CE MOVE R24 R20 + 0x7C580400, // 01CF CALL R22 2 + 0xB85E0C00, // 01D0 GETNGBL R23 K6 + 0x8C5C2F07, // 01D1 GETMET R23 R23 K7 + 0x60640018, // 01D2 GETGBL R25 G24 + 0x58680065, // 01D3 LDCONST R26 K101 + 0x886C072A, // 01D4 GETMBR R27 R3 K42 + 0x88700766, // 01D5 GETMBR R28 R3 K102 + 0x88740767, // 01D6 GETMBR R29 R3 K103 + 0x7C640800, // 01D7 CALL R25 4 + 0x7C5C0400, // 01D8 CALL R23 2 + 0x885C013D, // 01D9 GETMBR R23 R0 K61 + 0x8C5C2F3E, // 01DA GETMET R23 R23 K62 + 0x5C642A00, // 01DB MOVE R25 R21 + 0x7C5C0400, // 01DC CALL R23 2 + 0x505C0200, // 01DD LDBOOL R23 1 0 + 0x80042E00, // 01DE RET 1 R23 + 0x501C0200, // 01DF LDBOOL R7 1 0 + 0x80040E00, // 01E0 RET 1 R7 }) ) ); diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Control_Message.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Control_Message.h index a7d268200..a60ffd973 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Control_Message.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Control_Message.h @@ -11,7 +11,7 @@ extern const bclass be_class_Matter_Control_Message; ********************************************************************/ be_local_closure(Matter_Control_Message_parse_MsgCounterSyncRsp, /* name */ be_nested_proto( - 11, /* nstack */ + 9, /* nstack */ 2, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -19,39 +19,36 @@ be_local_closure(Matter_Control_Message_parse_MsgCounterSyncRsp, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[11]) { /* constants */ - /* K0 */ be_nested_str_weak(string), - /* K1 */ be_nested_str_weak(session), - /* K2 */ be_nested_str_weak(tasmota), - /* K3 */ be_nested_str_weak(log), - /* K4 */ be_nested_str_weak(format), - /* K5 */ be_nested_str_weak(MTR_X3A_X20_X3EMCSyncRsp_X20_X2A_X20Not_X20implemented_X20_X25s), - /* K6 */ be_nested_str_weak(raw), - /* K7 */ be_nested_str_weak(app_payload_idx), - /* K8 */ be_const_int(2147483647), - /* K9 */ be_nested_str_weak(tohex), - /* K10 */ be_const_int(2), + ( &(const bvalue[ 9]) { /* constants */ + /* K0 */ be_nested_str_weak(session), + /* K1 */ be_nested_str_weak(tasmota), + /* K2 */ be_nested_str_weak(log), + /* K3 */ be_nested_str_weak(MTR_X3A_X20_X3EMCSyncRsp_X20_X2A_X20Not_X20implemented_X20_X25s), + /* K4 */ be_nested_str_weak(raw), + /* K5 */ be_nested_str_weak(app_payload_idx), + /* K6 */ be_const_int(2147483647), + /* K7 */ be_nested_str_weak(tohex), + /* K8 */ be_const_int(2), }), be_str_weak(parse_MsgCounterSyncRsp), &be_const_str_solidified, - ( &(const binstruction[17]) { /* code */ - 0xA40A0000, // 0000 IMPORT R2 K0 - 0x880C0301, // 0001 GETMBR R3 R1 K1 - 0xB8120400, // 0002 GETNGBL R4 K2 - 0x8C100903, // 0003 GETMET R4 R4 K3 - 0x8C180504, // 0004 GETMET R6 R2 K4 - 0x58200005, // 0005 LDCONST R8 K5 - 0x88240307, // 0006 GETMBR R9 R1 K7 - 0x40241308, // 0007 CONNECT R9 R9 K8 - 0x88280306, // 0008 GETMBR R10 R1 K6 - 0x94241409, // 0009 GETIDX R9 R10 R9 - 0x8C241309, // 000A GETMET R9 R9 K9 - 0x7C240200, // 000B CALL R9 1 - 0x7C180600, // 000C CALL R6 3 - 0x581C000A, // 000D LDCONST R7 K10 - 0x7C100600, // 000E CALL R4 3 - 0x50100000, // 000F LDBOOL R4 0 0 - 0x80040800, // 0010 RET 1 R4 + ( &(const binstruction[16]) { /* code */ + 0x88080300, // 0000 GETMBR R2 R1 K0 + 0xB80E0200, // 0001 GETNGBL R3 K1 + 0x8C0C0702, // 0002 GETMET R3 R3 K2 + 0x60140018, // 0003 GETGBL R5 G24 + 0x58180003, // 0004 LDCONST R6 K3 + 0x881C0305, // 0005 GETMBR R7 R1 K5 + 0x401C0F06, // 0006 CONNECT R7 R7 K6 + 0x88200304, // 0007 GETMBR R8 R1 K4 + 0x941C1007, // 0008 GETIDX R7 R8 R7 + 0x8C1C0F07, // 0009 GETMET R7 R7 K7 + 0x7C1C0200, // 000A CALL R7 1 + 0x7C140400, // 000B CALL R5 2 + 0x58180008, // 000C LDCONST R6 K8 + 0x7C0C0600, // 000D CALL R3 3 + 0x500C0000, // 000E LDBOOL R3 0 0 + 0x80040600, // 000F RET 1 R3 }) ) ); @@ -63,7 +60,7 @@ be_local_closure(Matter_Control_Message_parse_MsgCounterSyncRsp, /* name */ ********************************************************************/ be_local_closure(Matter_Control_Message_parse_MsgCounterSyncReq, /* name */ be_nested_proto( - 11, /* nstack */ + 9, /* nstack */ 2, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -71,39 +68,36 @@ be_local_closure(Matter_Control_Message_parse_MsgCounterSyncReq, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[11]) { /* constants */ - /* K0 */ be_nested_str_weak(string), - /* K1 */ be_nested_str_weak(session), - /* K2 */ be_nested_str_weak(tasmota), - /* K3 */ be_nested_str_weak(log), - /* K4 */ be_nested_str_weak(format), - /* K5 */ be_nested_str_weak(MTR_X3A_X20_X3EMCSyncReq_X20_X2A_X20Not_X20implemented_X20_X25s), - /* K6 */ be_nested_str_weak(raw), - /* K7 */ be_nested_str_weak(app_payload_idx), - /* K8 */ be_const_int(2147483647), - /* K9 */ be_nested_str_weak(tohex), - /* K10 */ be_const_int(2), + ( &(const bvalue[ 9]) { /* constants */ + /* K0 */ be_nested_str_weak(session), + /* K1 */ be_nested_str_weak(tasmota), + /* K2 */ be_nested_str_weak(log), + /* K3 */ be_nested_str_weak(MTR_X3A_X20_X3EMCSyncReq_X20_X2A_X20Not_X20implemented_X20_X25s), + /* K4 */ be_nested_str_weak(raw), + /* K5 */ be_nested_str_weak(app_payload_idx), + /* K6 */ be_const_int(2147483647), + /* K7 */ be_nested_str_weak(tohex), + /* K8 */ be_const_int(2), }), be_str_weak(parse_MsgCounterSyncReq), &be_const_str_solidified, - ( &(const binstruction[17]) { /* code */ - 0xA40A0000, // 0000 IMPORT R2 K0 - 0x880C0301, // 0001 GETMBR R3 R1 K1 - 0xB8120400, // 0002 GETNGBL R4 K2 - 0x8C100903, // 0003 GETMET R4 R4 K3 - 0x8C180504, // 0004 GETMET R6 R2 K4 - 0x58200005, // 0005 LDCONST R8 K5 - 0x88240307, // 0006 GETMBR R9 R1 K7 - 0x40241308, // 0007 CONNECT R9 R9 K8 - 0x88280306, // 0008 GETMBR R10 R1 K6 - 0x94241409, // 0009 GETIDX R9 R10 R9 - 0x8C241309, // 000A GETMET R9 R9 K9 - 0x7C240200, // 000B CALL R9 1 - 0x7C180600, // 000C CALL R6 3 - 0x581C000A, // 000D LDCONST R7 K10 - 0x7C100600, // 000E CALL R4 3 - 0x50100000, // 000F LDBOOL R4 0 0 - 0x80040800, // 0010 RET 1 R4 + ( &(const binstruction[16]) { /* code */ + 0x88080300, // 0000 GETMBR R2 R1 K0 + 0xB80E0200, // 0001 GETNGBL R3 K1 + 0x8C0C0702, // 0002 GETMET R3 R3 K2 + 0x60140018, // 0003 GETGBL R5 G24 + 0x58180003, // 0004 LDCONST R6 K3 + 0x881C0305, // 0005 GETMBR R7 R1 K5 + 0x401C0F06, // 0006 CONNECT R7 R7 K6 + 0x88200304, // 0007 GETMBR R8 R1 K4 + 0x941C1007, // 0008 GETIDX R7 R8 R7 + 0x8C1C0F07, // 0009 GETMET R7 R7 K7 + 0x7C1C0200, // 000A CALL R7 1 + 0x7C140400, // 000B CALL R5 2 + 0x58180008, // 000C LDCONST R6 K8 + 0x7C0C0600, // 000D CALL R3 3 + 0x500C0000, // 000E LDBOOL R3 0 0 + 0x80040600, // 000F RET 1 R3 }) ) ); @@ -147,7 +141,7 @@ be_local_closure(Matter_Control_Message_init, /* name */ ********************************************************************/ be_local_closure(Matter_Control_Message_process_incoming_control_message, /* name */ be_nested_proto( - 9, /* nstack */ + 7, /* nstack */ 2, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -155,7 +149,7 @@ be_local_closure(Matter_Control_Message_process_incoming_control_message, /* n 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[15]) { /* constants */ + ( &(const bvalue[13]) { /* constants */ /* K0 */ be_nested_str_weak(tasmota), /* K1 */ be_nested_str_weak(log), /* K2 */ be_nested_str_weak(MTR_X3A_X20received_X20control_X20message_X20), @@ -167,14 +161,12 @@ be_local_closure(Matter_Control_Message_process_incoming_control_message, /* n /* K8 */ be_nested_str_weak(parse_MsgCounterSyncReq), /* K9 */ be_const_int(1), /* K10 */ be_nested_str_weak(parse_MsgCounterSyncRsp), - /* K11 */ be_nested_str_weak(string), - /* K12 */ be_nested_str_weak(format), - /* K13 */ be_nested_str_weak(MTR_X3A_X20_X3E_X3F_X3F_X3F_X3F_X3F_X3F_X3F_X3F_X3F_X20Unknown_X20OpCode_X20_X28control_X20message_X29_X20_X2502X), - /* K14 */ be_const_int(2), + /* K11 */ be_nested_str_weak(MTR_X3A_X20_X3E_X3F_X3F_X3F_X3F_X3F_X3F_X3F_X3F_X3F_X20Unknown_X20OpCode_X20_X28control_X20message_X29_X20_X2502X), + /* K12 */ be_const_int(2), }), be_str_weak(process_incoming_control_message), &be_const_str_solidified, - ( &(const binstruction[38]) { /* code */ + ( &(const binstruction[37]) { /* code */ 0xB80A0000, // 0000 GETNGBL R2 K0 0x8C080501, // 0001 GETMET R2 R2 K1 0xB8120600, // 0002 GETNGBL R4 K3 @@ -191,7 +183,7 @@ be_local_closure(Matter_Control_Message_process_incoming_control_message, /* n 0x5C100200, // 000D MOVE R4 R1 0x7C080400, // 000E CALL R2 2 0x80040400, // 000F RET 1 R2 - 0x70020012, // 0010 JMP #0024 + 0x70020011, // 0010 JMP #0023 0x88080306, // 0011 GETMBR R2 R1 K6 0x1C080509, // 0012 EQ R2 R2 K9 0x780A0004, // 0013 JMPF R2 #0019 @@ -199,20 +191,19 @@ be_local_closure(Matter_Control_Message_process_incoming_control_message, /* n 0x5C100200, // 0015 MOVE R4 R1 0x7C080400, // 0016 CALL R2 2 0x80040400, // 0017 RET 1 R2 - 0x7002000A, // 0018 JMP #0024 - 0xA40A1600, // 0019 IMPORT R2 K11 - 0xB80E0000, // 001A GETNGBL R3 K0 - 0x8C0C0701, // 001B GETMET R3 R3 K1 - 0x8C14050C, // 001C GETMET R5 R2 K12 - 0x581C000D, // 001D LDCONST R7 K13 - 0x88200306, // 001E GETMBR R8 R1 K6 - 0x7C140600, // 001F CALL R5 3 - 0x5818000E, // 0020 LDCONST R6 K14 - 0x7C0C0600, // 0021 CALL R3 3 - 0x500C0000, // 0022 LDBOOL R3 0 0 - 0x80040600, // 0023 RET 1 R3 - 0x50080000, // 0024 LDBOOL R2 0 0 - 0x80040400, // 0025 RET 1 R2 + 0x70020009, // 0018 JMP #0023 + 0xB80A0000, // 0019 GETNGBL R2 K0 + 0x8C080501, // 001A GETMET R2 R2 K1 + 0x60100018, // 001B GETGBL R4 G24 + 0x5814000B, // 001C LDCONST R5 K11 + 0x88180306, // 001D GETMBR R6 R1 K6 + 0x7C100400, // 001E CALL R4 2 + 0x5814000C, // 001F LDCONST R5 K12 + 0x7C080600, // 0020 CALL R2 3 + 0x50080000, // 0021 LDBOOL R2 0 0 + 0x80040400, // 0022 RET 1 R2 + 0x50080000, // 0023 LDBOOL R2 0 0 + 0x80040400, // 0024 RET 1 R2 }) ) ); diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Device.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Device.h index a31d608bb..7a19bb7b8 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Device.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Device.h @@ -40,7 +40,7 @@ be_local_closure(Matter_Device_is_commissioning_open, /* name */ ********************************************************************/ be_local_closure(Matter_Device__mdns_announce_hostname, /* name */ be_nested_proto( - 15, /* nstack */ + 14, /* nstack */ 2, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -48,7 +48,7 @@ be_local_closure(Matter_Device__mdns_announce_hostname, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[27]) { /* constants */ + ( &(const bvalue[26]) { /* constants */ /* K0 */ be_nested_str_weak(mdns), /* K1 */ be_nested_str_weak(string), /* K2 */ be_nested_str_weak(start), @@ -66,16 +66,15 @@ be_local_closure(Matter_Device__mdns_announce_hostname, /* name */ /* K14 */ be_nested_str_weak(ip), /* K15 */ be_nested_str_weak(ip6), /* K16 */ be_nested_str_weak(log), - /* K17 */ be_nested_str_weak(format), - /* K18 */ be_nested_str_weak(MTR_X3A_X20calling_X20mdns_X2Eadd_hostname_X28_X25s_X2C_X20_X25s_X29), - /* K19 */ be_const_int(3), - /* K20 */ be_nested_str_weak(wifi), - /* K21 */ be_nested_str_weak(hostname_wifi), - /* K22 */ be_nested_str_weak(MTR_X3A_X20start_X20mDNS_X20on_X20_X25s_X20host_X20_X27_X25s_X2Elocal_X27), - /* K23 */ be_nested_str_weak(MTR_X3A_X20Exception), - /* K24 */ be_nested_str_weak(_X7C), - /* K25 */ be_const_int(2), - /* K26 */ be_nested_str_weak(mdns_announce_op_discovery_all_fabrics), + /* K17 */ be_nested_str_weak(MTR_X3A_X20calling_X20mdns_X2Eadd_hostname_X28_X25s_X2C_X20_X25s_X29), + /* K18 */ be_const_int(3), + /* K19 */ be_nested_str_weak(wifi), + /* K20 */ be_nested_str_weak(hostname_wifi), + /* K21 */ be_nested_str_weak(MTR_X3A_X20start_X20mDNS_X20on_X20_X25s_X20host_X20_X27_X25s_X2Elocal_X27), + /* K22 */ be_nested_str_weak(MTR_X3A_X20Exception), + /* K23 */ be_nested_str_weak(_X7C), + /* K24 */ be_const_int(2), + /* K25 */ be_nested_str_weak(mdns_announce_op_discovery_all_fabrics), }), be_str_weak(_mdns_announce_hostname), &be_const_str_solidified, @@ -117,15 +116,15 @@ be_local_closure(Matter_Device__mdns_announce_hostname, /* name */ 0x70020012, // 0022 JMP #0036 0xB8160600, // 0023 GETNGBL R5 K3 0x8C140B10, // 0024 GETMET R5 R5 K16 - 0x8C1C0711, // 0025 GETMET R7 R3 K17 - 0x58240012, // 0026 LDCONST R9 K18 - 0x88280105, // 0027 GETMBR R10 R0 K5 - 0x8C2C0907, // 0028 GETMET R11 R4 K7 - 0x5834000E, // 0029 LDCONST R13 K14 - 0x5838000A, // 002A LDCONST R14 K10 - 0x7C2C0600, // 002B CALL R11 3 - 0x7C1C0800, // 002C CALL R7 4 - 0x58200013, // 002D LDCONST R8 K19 + 0x601C0018, // 0025 GETGBL R7 G24 + 0x58200011, // 0026 LDCONST R8 K17 + 0x88240105, // 0027 GETMBR R9 R0 K5 + 0x8C280907, // 0028 GETMET R10 R4 K7 + 0x5830000E, // 0029 LDCONST R12 K14 + 0x5834000A, // 002A LDCONST R13 K10 + 0x7C280600, // 002B CALL R10 3 + 0x7C1C0600, // 002C CALL R7 3 + 0x58200012, // 002D LDCONST R8 K18 0x7C140600, // 002E CALL R5 3 0x8C14050C, // 002F GETMET R5 R2 K12 0x881C0105, // 0030 GETMBR R7 R0 K5 @@ -136,7 +135,7 @@ be_local_closure(Matter_Device__mdns_announce_hostname, /* name */ 0x7C140600, // 0035 CALL R5 3 0x7002002F, // 0036 JMP #0067 0xB8120600, // 0037 GETNGBL R4 K3 - 0x8C100914, // 0038 GETMET R4 R4 K20 + 0x8C100913, // 0038 GETMET R4 R4 K19 0x7C100200, // 0039 CALL R4 1 0x8C140706, // 003A GETMET R5 R3 K6 0x8C1C0907, // 003B GETMET R7 R4 K7 @@ -145,11 +144,11 @@ be_local_closure(Matter_Device__mdns_announce_hostname, /* name */ 0x58200009, // 003E LDCONST R8 K9 0x5824000A, // 003F LDCONST R9 K10 0x7C140800, // 0040 CALL R5 4 - 0x90022A05, // 0041 SETMBR R0 K21 R5 + 0x90022805, // 0041 SETMBR R0 K20 R5 0x8814010B, // 0042 GETMBR R5 R0 K11 0x7416000F, // 0043 JMPT R5 #0054 0x8C14050C, // 0044 GETMET R5 R2 K12 - 0x881C0115, // 0045 GETMBR R7 R0 K21 + 0x881C0114, // 0045 GETMBR R7 R0 K20 0x8C200907, // 0046 GETMET R8 R4 K7 0x5828000D, // 0047 LDCONST R10 K13 0x582C000A, // 0048 LDCONST R11 K10 @@ -166,18 +165,18 @@ be_local_closure(Matter_Device__mdns_announce_hostname, /* name */ 0x70020012, // 0053 JMP #0067 0xB8160600, // 0054 GETNGBL R5 K3 0x8C140B10, // 0055 GETMET R5 R5 K16 - 0x8C1C0711, // 0056 GETMET R7 R3 K17 - 0x58240012, // 0057 LDCONST R9 K18 - 0x88280105, // 0058 GETMBR R10 R0 K5 - 0x8C2C0907, // 0059 GETMET R11 R4 K7 - 0x5834000E, // 005A LDCONST R13 K14 - 0x5838000A, // 005B LDCONST R14 K10 - 0x7C2C0600, // 005C CALL R11 3 - 0x7C1C0800, // 005D CALL R7 4 - 0x58200013, // 005E LDCONST R8 K19 + 0x601C0018, // 0056 GETGBL R7 G24 + 0x58200011, // 0057 LDCONST R8 K17 + 0x88240105, // 0058 GETMBR R9 R0 K5 + 0x8C280907, // 0059 GETMET R10 R4 K7 + 0x5830000E, // 005A LDCONST R12 K14 + 0x5834000A, // 005B LDCONST R13 K10 + 0x7C280600, // 005C CALL R10 3 + 0x7C1C0600, // 005D CALL R7 3 + 0x58200012, // 005E LDCONST R8 K18 0x7C140600, // 005F CALL R5 3 0x8C14050C, // 0060 GETMET R5 R2 K12 - 0x881C0115, // 0061 GETMBR R7 R0 K21 + 0x881C0114, // 0061 GETMBR R7 R0 K20 0x8C200907, // 0062 GETMET R8 R4 K7 0x5828000E, // 0063 LDCONST R10 K14 0x582C000A, // 0064 LDCONST R11 K10 @@ -185,18 +184,18 @@ be_local_closure(Matter_Device__mdns_announce_hostname, /* name */ 0x7C140600, // 0066 CALL R5 3 0xB8120600, // 0067 GETNGBL R4 K3 0x8C100910, // 0068 GETMET R4 R4 K16 - 0x8C180711, // 0069 GETMET R6 R3 K17 - 0x58200016, // 006A LDCONST R8 K22 + 0x60180018, // 0069 GETGBL R6 G24 + 0x581C0015, // 006A LDCONST R7 K21 0x78060001, // 006B JMPF R1 #006E - 0x58240004, // 006C LDCONST R9 K4 + 0x58200004, // 006C LDCONST R8 K4 0x70020000, // 006D JMP #006F - 0x58240014, // 006E LDCONST R9 K20 + 0x58200013, // 006E LDCONST R8 K19 0x78060001, // 006F JMPF R1 #0072 - 0x88280105, // 0070 GETMBR R10 R0 K5 + 0x88240105, // 0070 GETMBR R9 R0 K5 0x70020000, // 0071 JMP #0073 - 0x88280115, // 0072 GETMBR R10 R0 K21 - 0x7C180800, // 0073 CALL R6 4 - 0x581C0013, // 0074 LDCONST R7 K19 + 0x88240114, // 0072 GETMBR R9 R0 K20 + 0x7C180600, // 0073 CALL R6 3 + 0x581C0012, // 0074 LDCONST R7 K18 0x7C100600, // 0075 CALL R4 3 0xA8040001, // 0076 EXBLK 1 1 0x70020010, // 0077 JMP #0089 @@ -207,17 +206,17 @@ be_local_closure(Matter_Device__mdns_announce_hostname, /* name */ 0x60200008, // 007C GETGBL R8 G8 0x5C240800, // 007D MOVE R9 R4 0x7C200200, // 007E CALL R8 1 - 0x00222E08, // 007F ADD R8 K23 R8 - 0x00201118, // 0080 ADD R8 R8 K24 + 0x00222C08, // 007F ADD R8 K22 R8 + 0x00201117, // 0080 ADD R8 R8 K23 0x60240008, // 0081 GETGBL R9 G8 0x5C280A00, // 0082 MOVE R10 R5 0x7C240200, // 0083 CALL R9 1 0x00201009, // 0084 ADD R8 R8 R9 - 0x58240019, // 0085 LDCONST R9 K25 + 0x58240018, // 0085 LDCONST R9 K24 0x7C180600, // 0086 CALL R6 3 0x70020000, // 0087 JMP #0089 0xB0080000, // 0088 RAISE 2 R0 R0 - 0x8C10011A, // 0089 GETMET R4 R0 K26 + 0x8C100119, // 0089 GETMET R4 R0 K25 0x7C100200, // 008A CALL R4 1 0x80000000, // 008B RET 0 }) @@ -262,7 +261,7 @@ be_local_closure(Matter_Device_save_before_restart, /* name */ ********************************************************************/ be_local_closure(Matter_Device_mdns_remove_op_discovery, /* name */ be_nested_proto( - 14, /* nstack */ + 12, /* nstack */ 2, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -270,117 +269,114 @@ be_local_closure(Matter_Device_mdns_remove_op_discovery, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[25]) { /* constants */ + ( &(const bvalue[23]) { /* constants */ /* K0 */ be_nested_str_weak(mdns), - /* K1 */ be_nested_str_weak(string), - /* K2 */ be_nested_str_weak(get_device_id), - /* K3 */ be_nested_str_weak(copy), - /* K4 */ be_nested_str_weak(reverse), - /* K5 */ be_nested_str_weak(get_fabric_compressed), - /* K6 */ be_nested_str_weak(tohex), - /* K7 */ be_nested_str_weak(_X2D), - /* K8 */ be_nested_str_weak(tasmota), - /* K9 */ be_nested_str_weak(eth), - /* K10 */ be_nested_str_weak(find), - /* K11 */ be_nested_str_weak(up), - /* K12 */ be_nested_str_weak(log), - /* K13 */ be_nested_str_weak(format), - /* K14 */ be_nested_str_weak(MTR_X3A_X20remove_X20mDNS_X20on_X20_X25s_X20_X27_X25s_X27), - /* K15 */ be_const_int(3), - /* K16 */ be_nested_str_weak(remove_service), - /* K17 */ be_nested_str_weak(_matter), - /* K18 */ be_nested_str_weak(_tcp), - /* K19 */ be_nested_str_weak(hostname_eth), - /* K20 */ be_nested_str_weak(wifi), - /* K21 */ be_nested_str_weak(hostname_wifi), - /* K22 */ be_nested_str_weak(MTR_X3A_X20Exception), - /* K23 */ be_nested_str_weak(_X7C), - /* K24 */ be_const_int(2), + /* K1 */ be_nested_str_weak(get_device_id), + /* K2 */ be_nested_str_weak(copy), + /* K3 */ be_nested_str_weak(reverse), + /* K4 */ be_nested_str_weak(get_fabric_compressed), + /* K5 */ be_nested_str_weak(tohex), + /* K6 */ be_nested_str_weak(_X2D), + /* K7 */ be_nested_str_weak(tasmota), + /* K8 */ be_nested_str_weak(eth), + /* K9 */ be_nested_str_weak(find), + /* K10 */ be_nested_str_weak(up), + /* K11 */ be_nested_str_weak(log), + /* K12 */ be_nested_str_weak(MTR_X3A_X20remove_X20mDNS_X20on_X20_X25s_X20_X27_X25s_X27), + /* K13 */ be_const_int(3), + /* K14 */ be_nested_str_weak(remove_service), + /* K15 */ be_nested_str_weak(_matter), + /* K16 */ be_nested_str_weak(_tcp), + /* K17 */ be_nested_str_weak(hostname_eth), + /* K18 */ be_nested_str_weak(wifi), + /* K19 */ be_nested_str_weak(hostname_wifi), + /* K20 */ be_nested_str_weak(MTR_X3A_X20Exception), + /* K21 */ be_nested_str_weak(_X7C), + /* K22 */ be_const_int(2), }), be_str_weak(mdns_remove_op_discovery), &be_const_str_solidified, - ( &(const binstruction[81]) { /* code */ + ( &(const binstruction[80]) { /* code */ 0xA40A0000, // 0000 IMPORT R2 K0 - 0xA40E0200, // 0001 IMPORT R3 K1 - 0xA802003B, // 0002 EXBLK 0 #003F - 0x8C100302, // 0003 GETMET R4 R1 K2 - 0x7C100200, // 0004 CALL R4 1 - 0x8C100903, // 0005 GETMET R4 R4 K3 - 0x7C100200, // 0006 CALL R4 1 - 0x8C100904, // 0007 GETMET R4 R4 K4 - 0x7C100200, // 0008 CALL R4 1 - 0x8C140305, // 0009 GETMET R5 R1 K5 - 0x7C140200, // 000A CALL R5 1 - 0x8C180B06, // 000B GETMET R6 R5 K6 - 0x7C180200, // 000C CALL R6 1 - 0x00180D07, // 000D ADD R6 R6 K7 - 0x8C1C0906, // 000E GETMET R7 R4 K6 - 0x7C1C0200, // 000F CALL R7 1 - 0x00180C07, // 0010 ADD R6 R6 R7 - 0xB81E1000, // 0011 GETNGBL R7 K8 - 0x8C1C0F09, // 0012 GETMET R7 R7 K9 - 0x7C1C0200, // 0013 CALL R7 1 - 0x8C1C0F0A, // 0014 GETMET R7 R7 K10 - 0x5824000B, // 0015 LDCONST R9 K11 - 0x7C1C0400, // 0016 CALL R7 2 - 0x781E000E, // 0017 JMPF R7 #0027 - 0xB81E1000, // 0018 GETNGBL R7 K8 - 0x8C1C0F0C, // 0019 GETMET R7 R7 K12 - 0x8C24070D, // 001A GETMET R9 R3 K13 - 0x582C000E, // 001B LDCONST R11 K14 - 0x58300009, // 001C LDCONST R12 K9 - 0x5C340C00, // 001D MOVE R13 R6 - 0x7C240800, // 001E CALL R9 4 - 0x5828000F, // 001F LDCONST R10 K15 - 0x7C1C0600, // 0020 CALL R7 3 - 0x8C1C0510, // 0021 GETMET R7 R2 K16 - 0x58240011, // 0022 LDCONST R9 K17 - 0x58280012, // 0023 LDCONST R10 K18 - 0x5C2C0C00, // 0024 MOVE R11 R6 - 0x88300113, // 0025 GETMBR R12 R0 K19 - 0x7C1C0A00, // 0026 CALL R7 5 - 0xB81E1000, // 0027 GETNGBL R7 K8 - 0x8C1C0F14, // 0028 GETMET R7 R7 K20 - 0x7C1C0200, // 0029 CALL R7 1 - 0x8C1C0F0A, // 002A GETMET R7 R7 K10 - 0x5824000B, // 002B LDCONST R9 K11 - 0x7C1C0400, // 002C CALL R7 2 - 0x781E000E, // 002D JMPF R7 #003D - 0xB81E1000, // 002E GETNGBL R7 K8 - 0x8C1C0F0C, // 002F GETMET R7 R7 K12 - 0x8C24070D, // 0030 GETMET R9 R3 K13 - 0x582C000E, // 0031 LDCONST R11 K14 - 0x58300014, // 0032 LDCONST R12 K20 - 0x5C340C00, // 0033 MOVE R13 R6 - 0x7C240800, // 0034 CALL R9 4 - 0x5828000F, // 0035 LDCONST R10 K15 - 0x7C1C0600, // 0036 CALL R7 3 - 0x8C1C0510, // 0037 GETMET R7 R2 K16 - 0x58240011, // 0038 LDCONST R9 K17 - 0x58280012, // 0039 LDCONST R10 K18 - 0x5C2C0C00, // 003A MOVE R11 R6 - 0x88300115, // 003B GETMBR R12 R0 K21 - 0x7C1C0A00, // 003C CALL R7 5 - 0xA8040001, // 003D EXBLK 1 1 - 0x70020010, // 003E JMP #0050 - 0xAC100002, // 003F CATCH R4 0 2 - 0x7002000D, // 0040 JMP #004F - 0xB81A1000, // 0041 GETNGBL R6 K8 - 0x8C180D0C, // 0042 GETMET R6 R6 K12 - 0x60200008, // 0043 GETGBL R8 G8 - 0x5C240800, // 0044 MOVE R9 R4 - 0x7C200200, // 0045 CALL R8 1 - 0x00222C08, // 0046 ADD R8 K22 R8 - 0x00201117, // 0047 ADD R8 R8 K23 - 0x60240008, // 0048 GETGBL R9 G8 - 0x5C280A00, // 0049 MOVE R10 R5 - 0x7C240200, // 004A CALL R9 1 - 0x00201009, // 004B ADD R8 R8 R9 - 0x58240018, // 004C LDCONST R9 K24 - 0x7C180600, // 004D CALL R6 3 - 0x70020000, // 004E JMP #0050 - 0xB0080000, // 004F RAISE 2 R0 R0 - 0x80000000, // 0050 RET 0 + 0xA802003B, // 0001 EXBLK 0 #003E + 0x8C0C0301, // 0002 GETMET R3 R1 K1 + 0x7C0C0200, // 0003 CALL R3 1 + 0x8C0C0702, // 0004 GETMET R3 R3 K2 + 0x7C0C0200, // 0005 CALL R3 1 + 0x8C0C0703, // 0006 GETMET R3 R3 K3 + 0x7C0C0200, // 0007 CALL R3 1 + 0x8C100304, // 0008 GETMET R4 R1 K4 + 0x7C100200, // 0009 CALL R4 1 + 0x8C140905, // 000A GETMET R5 R4 K5 + 0x7C140200, // 000B CALL R5 1 + 0x00140B06, // 000C ADD R5 R5 K6 + 0x8C180705, // 000D GETMET R6 R3 K5 + 0x7C180200, // 000E CALL R6 1 + 0x00140A06, // 000F ADD R5 R5 R6 + 0xB81A0E00, // 0010 GETNGBL R6 K7 + 0x8C180D08, // 0011 GETMET R6 R6 K8 + 0x7C180200, // 0012 CALL R6 1 + 0x8C180D09, // 0013 GETMET R6 R6 K9 + 0x5820000A, // 0014 LDCONST R8 K10 + 0x7C180400, // 0015 CALL R6 2 + 0x781A000E, // 0016 JMPF R6 #0026 + 0xB81A0E00, // 0017 GETNGBL R6 K7 + 0x8C180D0B, // 0018 GETMET R6 R6 K11 + 0x60200018, // 0019 GETGBL R8 G24 + 0x5824000C, // 001A LDCONST R9 K12 + 0x58280008, // 001B LDCONST R10 K8 + 0x5C2C0A00, // 001C MOVE R11 R5 + 0x7C200600, // 001D CALL R8 3 + 0x5824000D, // 001E LDCONST R9 K13 + 0x7C180600, // 001F CALL R6 3 + 0x8C18050E, // 0020 GETMET R6 R2 K14 + 0x5820000F, // 0021 LDCONST R8 K15 + 0x58240010, // 0022 LDCONST R9 K16 + 0x5C280A00, // 0023 MOVE R10 R5 + 0x882C0111, // 0024 GETMBR R11 R0 K17 + 0x7C180A00, // 0025 CALL R6 5 + 0xB81A0E00, // 0026 GETNGBL R6 K7 + 0x8C180D12, // 0027 GETMET R6 R6 K18 + 0x7C180200, // 0028 CALL R6 1 + 0x8C180D09, // 0029 GETMET R6 R6 K9 + 0x5820000A, // 002A LDCONST R8 K10 + 0x7C180400, // 002B CALL R6 2 + 0x781A000E, // 002C JMPF R6 #003C + 0xB81A0E00, // 002D GETNGBL R6 K7 + 0x8C180D0B, // 002E GETMET R6 R6 K11 + 0x60200018, // 002F GETGBL R8 G24 + 0x5824000C, // 0030 LDCONST R9 K12 + 0x58280012, // 0031 LDCONST R10 K18 + 0x5C2C0A00, // 0032 MOVE R11 R5 + 0x7C200600, // 0033 CALL R8 3 + 0x5824000D, // 0034 LDCONST R9 K13 + 0x7C180600, // 0035 CALL R6 3 + 0x8C18050E, // 0036 GETMET R6 R2 K14 + 0x5820000F, // 0037 LDCONST R8 K15 + 0x58240010, // 0038 LDCONST R9 K16 + 0x5C280A00, // 0039 MOVE R10 R5 + 0x882C0113, // 003A GETMBR R11 R0 K19 + 0x7C180A00, // 003B CALL R6 5 + 0xA8040001, // 003C EXBLK 1 1 + 0x70020010, // 003D JMP #004F + 0xAC0C0002, // 003E CATCH R3 0 2 + 0x7002000D, // 003F JMP #004E + 0xB8160E00, // 0040 GETNGBL R5 K7 + 0x8C140B0B, // 0041 GETMET R5 R5 K11 + 0x601C0008, // 0042 GETGBL R7 G8 + 0x5C200600, // 0043 MOVE R8 R3 + 0x7C1C0200, // 0044 CALL R7 1 + 0x001E2807, // 0045 ADD R7 K20 R7 + 0x001C0F15, // 0046 ADD R7 R7 K21 + 0x60200008, // 0047 GETGBL R8 G8 + 0x5C240800, // 0048 MOVE R9 R4 + 0x7C200200, // 0049 CALL R8 1 + 0x001C0E08, // 004A ADD R7 R7 R8 + 0x58200016, // 004B LDCONST R8 K22 + 0x7C140600, // 004C CALL R5 3 + 0x70020000, // 004D JMP #004F + 0xB0080000, // 004E RAISE 2 R0 R0 + 0x80000000, // 004F RET 0 }) ) ); @@ -698,7 +694,7 @@ be_local_closure(Matter_Device_every_250ms, /* name */ ********************************************************************/ be_local_closure(Matter_Device_process_attribute_expansion, /* name */ be_nested_proto( - 25, /* nstack */ + 24, /* nstack */ 3, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -773,234 +769,232 @@ be_local_closure(Matter_Device_process_attribute_expansion, /* name */ ), }), 1, /* has constants */ - ( &(const bvalue[17]) { /* constants */ - /* K0 */ be_nested_str_weak(string), - /* K1 */ be_nested_str_weak(endpoint), - /* K2 */ be_nested_str_weak(cluster), - /* K3 */ be_nested_str_weak(attribute), - /* K4 */ be_nested_str_weak(plugins), - /* K5 */ be_nested_str_weak(get_endpoint), - /* K6 */ be_nested_str_weak(contains), - /* K7 */ be_nested_str_weak(get_cluster_list), - /* K8 */ be_nested_str_weak(get_attribute_list), - /* K9 */ be_nested_str_weak(push), - /* K10 */ be_nested_str_weak(stop_iteration), - /* K11 */ be_nested_str_weak(status), - /* K12 */ be_nested_str_weak(matter), - /* K13 */ be_nested_str_weak(UNSUPPORTED_ENDPOINT), - /* K14 */ be_nested_str_weak(UNSUPPORTED_CLUSTER), - /* K15 */ be_nested_str_weak(UNSUPPORTED_ATTRIBUTE), - /* K16 */ be_nested_str_weak(UNREPORTABLE_ATTRIBUTE), + ( &(const bvalue[16]) { /* constants */ + /* K0 */ be_nested_str_weak(endpoint), + /* K1 */ be_nested_str_weak(cluster), + /* K2 */ be_nested_str_weak(attribute), + /* K3 */ be_nested_str_weak(plugins), + /* K4 */ be_nested_str_weak(get_endpoint), + /* K5 */ be_nested_str_weak(contains), + /* K6 */ be_nested_str_weak(get_cluster_list), + /* K7 */ be_nested_str_weak(get_attribute_list), + /* K8 */ be_nested_str_weak(push), + /* K9 */ be_nested_str_weak(stop_iteration), + /* K10 */ be_nested_str_weak(status), + /* K11 */ be_nested_str_weak(matter), + /* K12 */ be_nested_str_weak(UNSUPPORTED_ENDPOINT), + /* K13 */ be_nested_str_weak(UNSUPPORTED_CLUSTER), + /* K14 */ be_nested_str_weak(UNSUPPORTED_ATTRIBUTE), + /* K15 */ be_nested_str_weak(UNREPORTABLE_ATTRIBUTE), }), be_str_weak(process_attribute_expansion), &be_const_str_solidified, - ( &(const binstruction[206]) { /* code */ + ( &(const binstruction[205]) { /* code */ 0x840C0000, // 0000 CLOSURE R3 P0 - 0xA4120000, // 0001 IMPORT R4 K0 - 0x88140301, // 0002 GETMBR R5 R1 K1 - 0x50180000, // 0003 LDBOOL R6 0 0 - 0x881C0302, // 0004 GETMBR R7 R1 K2 - 0x50200000, // 0005 LDBOOL R8 0 0 - 0x88240303, // 0006 GETMBR R9 R1 K3 - 0x50280000, // 0007 LDBOOL R10 0 0 - 0x882C0301, // 0008 GETMBR R11 R1 K1 - 0x4C300000, // 0009 LDNIL R12 - 0x202C160C, // 000A NE R11 R11 R12 - 0x782E0007, // 000B JMPF R11 #0014 - 0x882C0302, // 000C GETMBR R11 R1 K2 - 0x4C300000, // 000D LDNIL R12 - 0x202C160C, // 000E NE R11 R11 R12 - 0x782E0003, // 000F JMPF R11 #0014 - 0x882C0303, // 0010 GETMBR R11 R1 K3 - 0x4C300000, // 0011 LDNIL R12 - 0x202C160C, // 0012 NE R11 R11 R12 - 0x742E0000, // 0013 JMPT R11 #0015 - 0x502C0001, // 0014 LDBOOL R11 0 1 - 0x502C0200, // 0015 LDBOOL R11 1 0 - 0x60300013, // 0016 GETGBL R12 G19 - 0x7C300000, // 0017 CALL R12 0 - 0x60340010, // 0018 GETGBL R13 G16 - 0x88380104, // 0019 GETMBR R14 R0 K4 - 0x7C340200, // 001A CALL R13 1 - 0xA8020055, // 001B EXBLK 0 #0072 - 0x5C381A00, // 001C MOVE R14 R13 - 0x7C380000, // 001D CALL R14 0 - 0x8C3C1D05, // 001E GETMET R15 R14 K5 - 0x7C3C0200, // 001F CALL R15 1 - 0x4C400000, // 0020 LDNIL R16 - 0x20400A10, // 0021 NE R16 R5 R16 - 0x78420002, // 0022 JMPF R16 #0026 - 0x20401E05, // 0023 NE R16 R15 R5 - 0x78420000, // 0024 JMPF R16 #0026 - 0x7001FFF5, // 0025 JMP #001C - 0x8C401906, // 0026 GETMET R16 R12 K6 - 0x5C481E00, // 0027 MOVE R18 R15 - 0x7C400400, // 0028 CALL R16 2 - 0x74420002, // 0029 JMPT R16 #002D - 0x60400013, // 002A GETGBL R16 G19 - 0x7C400000, // 002B CALL R16 0 - 0x98301E10, // 002C SETIDX R12 R15 R16 - 0x50180200, // 002D LDBOOL R6 1 0 - 0x8C401D07, // 002E GETMET R16 R14 K7 - 0x5C481E00, // 002F MOVE R18 R15 - 0x7C400400, // 0030 CALL R16 2 - 0x60440010, // 0031 GETGBL R17 G16 - 0x5C482000, // 0032 MOVE R18 R16 - 0x7C440200, // 0033 CALL R17 1 - 0xA8020038, // 0034 EXBLK 0 #006E - 0x5C482200, // 0035 MOVE R18 R17 - 0x7C480000, // 0036 CALL R18 0 - 0x4C4C0000, // 0037 LDNIL R19 - 0x204C0E13, // 0038 NE R19 R7 R19 - 0x784E0002, // 0039 JMPF R19 #003D - 0x204C2407, // 003A NE R19 R18 R7 - 0x784E0000, // 003B JMPF R19 #003D - 0x7001FFF7, // 003C JMP #0035 - 0x944C180F, // 003D GETIDX R19 R12 R15 - 0x8C4C2706, // 003E GETMET R19 R19 K6 - 0x5C542400, // 003F MOVE R21 R18 - 0x7C4C0400, // 0040 CALL R19 2 - 0x744E0003, // 0041 JMPT R19 #0046 - 0x944C180F, // 0042 GETIDX R19 R12 R15 - 0x60500013, // 0043 GETGBL R20 G19 - 0x7C500000, // 0044 CALL R20 0 - 0x984C2414, // 0045 SETIDX R19 R18 R20 - 0x50200200, // 0046 LDBOOL R8 1 0 - 0x8C4C1D08, // 0047 GETMET R19 R14 K8 - 0x5C541E00, // 0048 MOVE R21 R15 - 0x5C582400, // 0049 MOVE R22 R18 - 0x7C4C0600, // 004A CALL R19 3 - 0x60500010, // 004B GETGBL R20 G16 - 0x5C542600, // 004C MOVE R21 R19 - 0x7C500200, // 004D CALL R20 1 - 0xA802001A, // 004E EXBLK 0 #006A - 0x5C542800, // 004F MOVE R21 R20 - 0x7C540000, // 0050 CALL R21 0 - 0x4C580000, // 0051 LDNIL R22 - 0x20581216, // 0052 NE R22 R9 R22 - 0x785A0002, // 0053 JMPF R22 #0057 - 0x20582A09, // 0054 NE R22 R21 R9 - 0x785A0000, // 0055 JMPF R22 #0057 - 0x7001FFF7, // 0056 JMP #004F - 0x9458180F, // 0057 GETIDX R22 R12 R15 - 0x94582C12, // 0058 GETIDX R22 R22 R18 - 0x8C582D06, // 0059 GETMET R22 R22 K6 - 0x5C602A00, // 005A MOVE R24 R21 - 0x7C580400, // 005B CALL R22 2 - 0x745A0004, // 005C JMPT R22 #0062 - 0x9458180F, // 005D GETIDX R22 R12 R15 - 0x94582C12, // 005E GETIDX R22 R22 R18 - 0x605C0012, // 005F GETGBL R23 G18 - 0x7C5C0000, // 0060 CALL R23 0 - 0x98582A17, // 0061 SETIDX R22 R21 R23 - 0x50280200, // 0062 LDBOOL R10 1 0 - 0x9458180F, // 0063 GETIDX R22 R12 R15 - 0x94582C12, // 0064 GETIDX R22 R22 R18 - 0x94582C15, // 0065 GETIDX R22 R22 R21 - 0x8C582D09, // 0066 GETMET R22 R22 K9 - 0x5C601C00, // 0067 MOVE R24 R14 - 0x7C580400, // 0068 CALL R22 2 - 0x7001FFE4, // 0069 JMP #004F - 0x5850000A, // 006A LDCONST R20 K10 - 0xAC500200, // 006B CATCH R20 1 0 - 0xB0080000, // 006C RAISE 2 R0 R0 - 0x7001FFC6, // 006D JMP #0035 - 0x5844000A, // 006E LDCONST R17 K10 - 0xAC440200, // 006F CATCH R17 1 0 - 0xB0080000, // 0070 RAISE 2 R0 R0 - 0x7001FFA9, // 0071 JMP #001C - 0x5834000A, // 0072 LDCONST R13 K10 - 0xAC340200, // 0073 CATCH R13 1 0 - 0xB0080000, // 0074 RAISE 2 R0 R0 - 0x60340010, // 0075 GETGBL R13 G16 - 0x5C380600, // 0076 MOVE R14 R3 - 0x5C3C1800, // 0077 MOVE R15 R12 - 0x7C380200, // 0078 CALL R14 1 - 0x7C340200, // 0079 CALL R13 1 - 0xA8020033, // 007A EXBLK 0 #00AF - 0x5C381A00, // 007B MOVE R14 R13 - 0x7C380000, // 007C CALL R14 0 - 0x603C0010, // 007D GETGBL R15 G16 - 0x5C400600, // 007E MOVE R16 R3 - 0x9444180E, // 007F GETIDX R17 R12 R14 - 0x7C400200, // 0080 CALL R16 1 - 0x7C3C0200, // 0081 CALL R15 1 - 0xA8020027, // 0082 EXBLK 0 #00AB - 0x5C401E00, // 0083 MOVE R16 R15 - 0x7C400000, // 0084 CALL R16 0 - 0x60440010, // 0085 GETGBL R17 G16 - 0x5C480600, // 0086 MOVE R18 R3 - 0x944C180E, // 0087 GETIDX R19 R12 R14 - 0x944C2610, // 0088 GETIDX R19 R19 R16 - 0x7C480200, // 0089 CALL R18 1 - 0x7C440200, // 008A CALL R17 1 - 0xA802001A, // 008B EXBLK 0 #00A7 - 0x5C482200, // 008C MOVE R18 R17 - 0x7C480000, // 008D CALL R18 0 - 0x604C0010, // 008E GETGBL R19 G16 - 0x9450180E, // 008F GETIDX R20 R12 R14 - 0x94502810, // 0090 GETIDX R20 R20 R16 - 0x94502812, // 0091 GETIDX R20 R20 R18 - 0x7C4C0200, // 0092 CALL R19 1 - 0xA802000E, // 0093 EXBLK 0 #00A3 - 0x5C502600, // 0094 MOVE R20 R19 - 0x7C500000, // 0095 CALL R20 0 - 0x9006020E, // 0096 SETMBR R1 K1 R14 - 0x90060410, // 0097 SETMBR R1 K2 R16 - 0x90060612, // 0098 SETMBR R1 K3 R18 - 0x5C540400, // 0099 MOVE R21 R2 - 0x5C582800, // 009A MOVE R22 R20 - 0x5C5C0200, // 009B MOVE R23 R1 - 0x5C601600, // 009C MOVE R24 R11 - 0x7C540600, // 009D CALL R21 3 - 0x782E0002, // 009E JMPF R11 #00A2 - 0x78560001, // 009F JMPF R21 #00A2 - 0xA8040004, // 00A0 EXBLK 1 4 - 0x80002C00, // 00A1 RET 0 - 0x7001FFF0, // 00A2 JMP #0094 - 0x584C000A, // 00A3 LDCONST R19 K10 - 0xAC4C0200, // 00A4 CATCH R19 1 0 - 0xB0080000, // 00A5 RAISE 2 R0 R0 - 0x7001FFE4, // 00A6 JMP #008C - 0x5844000A, // 00A7 LDCONST R17 K10 - 0xAC440200, // 00A8 CATCH R17 1 0 - 0xB0080000, // 00A9 RAISE 2 R0 R0 - 0x7001FFD7, // 00AA JMP #0083 - 0x583C000A, // 00AB LDCONST R15 K10 - 0xAC3C0200, // 00AC CATCH R15 1 0 - 0xB0080000, // 00AD RAISE 2 R0 R0 - 0x7001FFCB, // 00AE JMP #007B - 0x5834000A, // 00AF LDCONST R13 K10 - 0xAC340200, // 00B0 CATCH R13 1 0 - 0xB0080000, // 00B1 RAISE 2 R0 R0 - 0x782E0019, // 00B2 JMPF R11 #00CD - 0x5C340C00, // 00B3 MOVE R13 R6 - 0x74360003, // 00B4 JMPT R13 #00B9 - 0xB8361800, // 00B5 GETNGBL R13 K12 - 0x88341B0D, // 00B6 GETMBR R13 R13 K13 - 0x9006160D, // 00B7 SETMBR R1 K11 R13 - 0x7002000E, // 00B8 JMP #00C8 - 0x5C341000, // 00B9 MOVE R13 R8 - 0x74360003, // 00BA JMPT R13 #00BF - 0xB8361800, // 00BB GETNGBL R13 K12 - 0x88341B0E, // 00BC GETMBR R13 R13 K14 - 0x9006160D, // 00BD SETMBR R1 K11 R13 - 0x70020008, // 00BE JMP #00C8 - 0x5C341400, // 00BF MOVE R13 R10 - 0x74360003, // 00C0 JMPT R13 #00C5 - 0xB8361800, // 00C1 GETNGBL R13 K12 - 0x88341B0F, // 00C2 GETMBR R13 R13 K15 - 0x9006160D, // 00C3 SETMBR R1 K11 R13 - 0x70020002, // 00C4 JMP #00C8 - 0xB8361800, // 00C5 GETNGBL R13 K12 - 0x88341B10, // 00C6 GETMBR R13 R13 K16 - 0x9006160D, // 00C7 SETMBR R1 K11 R13 - 0x5C340400, // 00C8 MOVE R13 R2 - 0x4C380000, // 00C9 LDNIL R14 - 0x5C3C0200, // 00CA MOVE R15 R1 - 0x50400200, // 00CB LDBOOL R16 1 0 - 0x7C340600, // 00CC CALL R13 3 - 0x80000000, // 00CD RET 0 + 0x88100300, // 0001 GETMBR R4 R1 K0 + 0x50140000, // 0002 LDBOOL R5 0 0 + 0x88180301, // 0003 GETMBR R6 R1 K1 + 0x501C0000, // 0004 LDBOOL R7 0 0 + 0x88200302, // 0005 GETMBR R8 R1 K2 + 0x50240000, // 0006 LDBOOL R9 0 0 + 0x88280300, // 0007 GETMBR R10 R1 K0 + 0x4C2C0000, // 0008 LDNIL R11 + 0x2028140B, // 0009 NE R10 R10 R11 + 0x782A0007, // 000A JMPF R10 #0013 + 0x88280301, // 000B GETMBR R10 R1 K1 + 0x4C2C0000, // 000C LDNIL R11 + 0x2028140B, // 000D NE R10 R10 R11 + 0x782A0003, // 000E JMPF R10 #0013 + 0x88280302, // 000F GETMBR R10 R1 K2 + 0x4C2C0000, // 0010 LDNIL R11 + 0x2028140B, // 0011 NE R10 R10 R11 + 0x742A0000, // 0012 JMPT R10 #0014 + 0x50280001, // 0013 LDBOOL R10 0 1 + 0x50280200, // 0014 LDBOOL R10 1 0 + 0x602C0013, // 0015 GETGBL R11 G19 + 0x7C2C0000, // 0016 CALL R11 0 + 0x60300010, // 0017 GETGBL R12 G16 + 0x88340103, // 0018 GETMBR R13 R0 K3 + 0x7C300200, // 0019 CALL R12 1 + 0xA8020055, // 001A EXBLK 0 #0071 + 0x5C341800, // 001B MOVE R13 R12 + 0x7C340000, // 001C CALL R13 0 + 0x8C381B04, // 001D GETMET R14 R13 K4 + 0x7C380200, // 001E CALL R14 1 + 0x4C3C0000, // 001F LDNIL R15 + 0x203C080F, // 0020 NE R15 R4 R15 + 0x783E0002, // 0021 JMPF R15 #0025 + 0x203C1C04, // 0022 NE R15 R14 R4 + 0x783E0000, // 0023 JMPF R15 #0025 + 0x7001FFF5, // 0024 JMP #001B + 0x8C3C1705, // 0025 GETMET R15 R11 K5 + 0x5C441C00, // 0026 MOVE R17 R14 + 0x7C3C0400, // 0027 CALL R15 2 + 0x743E0002, // 0028 JMPT R15 #002C + 0x603C0013, // 0029 GETGBL R15 G19 + 0x7C3C0000, // 002A CALL R15 0 + 0x982C1C0F, // 002B SETIDX R11 R14 R15 + 0x50140200, // 002C LDBOOL R5 1 0 + 0x8C3C1B06, // 002D GETMET R15 R13 K6 + 0x5C441C00, // 002E MOVE R17 R14 + 0x7C3C0400, // 002F CALL R15 2 + 0x60400010, // 0030 GETGBL R16 G16 + 0x5C441E00, // 0031 MOVE R17 R15 + 0x7C400200, // 0032 CALL R16 1 + 0xA8020038, // 0033 EXBLK 0 #006D + 0x5C442000, // 0034 MOVE R17 R16 + 0x7C440000, // 0035 CALL R17 0 + 0x4C480000, // 0036 LDNIL R18 + 0x20480C12, // 0037 NE R18 R6 R18 + 0x784A0002, // 0038 JMPF R18 #003C + 0x20482206, // 0039 NE R18 R17 R6 + 0x784A0000, // 003A JMPF R18 #003C + 0x7001FFF7, // 003B JMP #0034 + 0x9448160E, // 003C GETIDX R18 R11 R14 + 0x8C482505, // 003D GETMET R18 R18 K5 + 0x5C502200, // 003E MOVE R20 R17 + 0x7C480400, // 003F CALL R18 2 + 0x744A0003, // 0040 JMPT R18 #0045 + 0x9448160E, // 0041 GETIDX R18 R11 R14 + 0x604C0013, // 0042 GETGBL R19 G19 + 0x7C4C0000, // 0043 CALL R19 0 + 0x98482213, // 0044 SETIDX R18 R17 R19 + 0x501C0200, // 0045 LDBOOL R7 1 0 + 0x8C481B07, // 0046 GETMET R18 R13 K7 + 0x5C501C00, // 0047 MOVE R20 R14 + 0x5C542200, // 0048 MOVE R21 R17 + 0x7C480600, // 0049 CALL R18 3 + 0x604C0010, // 004A GETGBL R19 G16 + 0x5C502400, // 004B MOVE R20 R18 + 0x7C4C0200, // 004C CALL R19 1 + 0xA802001A, // 004D EXBLK 0 #0069 + 0x5C502600, // 004E MOVE R20 R19 + 0x7C500000, // 004F CALL R20 0 + 0x4C540000, // 0050 LDNIL R21 + 0x20541015, // 0051 NE R21 R8 R21 + 0x78560002, // 0052 JMPF R21 #0056 + 0x20542808, // 0053 NE R21 R20 R8 + 0x78560000, // 0054 JMPF R21 #0056 + 0x7001FFF7, // 0055 JMP #004E + 0x9454160E, // 0056 GETIDX R21 R11 R14 + 0x94542A11, // 0057 GETIDX R21 R21 R17 + 0x8C542B05, // 0058 GETMET R21 R21 K5 + 0x5C5C2800, // 0059 MOVE R23 R20 + 0x7C540400, // 005A CALL R21 2 + 0x74560004, // 005B JMPT R21 #0061 + 0x9454160E, // 005C GETIDX R21 R11 R14 + 0x94542A11, // 005D GETIDX R21 R21 R17 + 0x60580012, // 005E GETGBL R22 G18 + 0x7C580000, // 005F CALL R22 0 + 0x98542816, // 0060 SETIDX R21 R20 R22 + 0x50240200, // 0061 LDBOOL R9 1 0 + 0x9454160E, // 0062 GETIDX R21 R11 R14 + 0x94542A11, // 0063 GETIDX R21 R21 R17 + 0x94542A14, // 0064 GETIDX R21 R21 R20 + 0x8C542B08, // 0065 GETMET R21 R21 K8 + 0x5C5C1A00, // 0066 MOVE R23 R13 + 0x7C540400, // 0067 CALL R21 2 + 0x7001FFE4, // 0068 JMP #004E + 0x584C0009, // 0069 LDCONST R19 K9 + 0xAC4C0200, // 006A CATCH R19 1 0 + 0xB0080000, // 006B RAISE 2 R0 R0 + 0x7001FFC6, // 006C JMP #0034 + 0x58400009, // 006D LDCONST R16 K9 + 0xAC400200, // 006E CATCH R16 1 0 + 0xB0080000, // 006F RAISE 2 R0 R0 + 0x7001FFA9, // 0070 JMP #001B + 0x58300009, // 0071 LDCONST R12 K9 + 0xAC300200, // 0072 CATCH R12 1 0 + 0xB0080000, // 0073 RAISE 2 R0 R0 + 0x60300010, // 0074 GETGBL R12 G16 + 0x5C340600, // 0075 MOVE R13 R3 + 0x5C381600, // 0076 MOVE R14 R11 + 0x7C340200, // 0077 CALL R13 1 + 0x7C300200, // 0078 CALL R12 1 + 0xA8020033, // 0079 EXBLK 0 #00AE + 0x5C341800, // 007A MOVE R13 R12 + 0x7C340000, // 007B CALL R13 0 + 0x60380010, // 007C GETGBL R14 G16 + 0x5C3C0600, // 007D MOVE R15 R3 + 0x9440160D, // 007E GETIDX R16 R11 R13 + 0x7C3C0200, // 007F CALL R15 1 + 0x7C380200, // 0080 CALL R14 1 + 0xA8020027, // 0081 EXBLK 0 #00AA + 0x5C3C1C00, // 0082 MOVE R15 R14 + 0x7C3C0000, // 0083 CALL R15 0 + 0x60400010, // 0084 GETGBL R16 G16 + 0x5C440600, // 0085 MOVE R17 R3 + 0x9448160D, // 0086 GETIDX R18 R11 R13 + 0x9448240F, // 0087 GETIDX R18 R18 R15 + 0x7C440200, // 0088 CALL R17 1 + 0x7C400200, // 0089 CALL R16 1 + 0xA802001A, // 008A EXBLK 0 #00A6 + 0x5C442000, // 008B MOVE R17 R16 + 0x7C440000, // 008C CALL R17 0 + 0x60480010, // 008D GETGBL R18 G16 + 0x944C160D, // 008E GETIDX R19 R11 R13 + 0x944C260F, // 008F GETIDX R19 R19 R15 + 0x944C2611, // 0090 GETIDX R19 R19 R17 + 0x7C480200, // 0091 CALL R18 1 + 0xA802000E, // 0092 EXBLK 0 #00A2 + 0x5C4C2400, // 0093 MOVE R19 R18 + 0x7C4C0000, // 0094 CALL R19 0 + 0x9006000D, // 0095 SETMBR R1 K0 R13 + 0x9006020F, // 0096 SETMBR R1 K1 R15 + 0x90060411, // 0097 SETMBR R1 K2 R17 + 0x5C500400, // 0098 MOVE R20 R2 + 0x5C542600, // 0099 MOVE R21 R19 + 0x5C580200, // 009A MOVE R22 R1 + 0x5C5C1400, // 009B MOVE R23 R10 + 0x7C500600, // 009C CALL R20 3 + 0x782A0002, // 009D JMPF R10 #00A1 + 0x78520001, // 009E JMPF R20 #00A1 + 0xA8040004, // 009F EXBLK 1 4 + 0x80002A00, // 00A0 RET 0 + 0x7001FFF0, // 00A1 JMP #0093 + 0x58480009, // 00A2 LDCONST R18 K9 + 0xAC480200, // 00A3 CATCH R18 1 0 + 0xB0080000, // 00A4 RAISE 2 R0 R0 + 0x7001FFE4, // 00A5 JMP #008B + 0x58400009, // 00A6 LDCONST R16 K9 + 0xAC400200, // 00A7 CATCH R16 1 0 + 0xB0080000, // 00A8 RAISE 2 R0 R0 + 0x7001FFD7, // 00A9 JMP #0082 + 0x58380009, // 00AA LDCONST R14 K9 + 0xAC380200, // 00AB CATCH R14 1 0 + 0xB0080000, // 00AC RAISE 2 R0 R0 + 0x7001FFCB, // 00AD JMP #007A + 0x58300009, // 00AE LDCONST R12 K9 + 0xAC300200, // 00AF CATCH R12 1 0 + 0xB0080000, // 00B0 RAISE 2 R0 R0 + 0x782A0019, // 00B1 JMPF R10 #00CC + 0x5C300A00, // 00B2 MOVE R12 R5 + 0x74320003, // 00B3 JMPT R12 #00B8 + 0xB8321600, // 00B4 GETNGBL R12 K11 + 0x8830190C, // 00B5 GETMBR R12 R12 K12 + 0x9006140C, // 00B6 SETMBR R1 K10 R12 + 0x7002000E, // 00B7 JMP #00C7 + 0x5C300E00, // 00B8 MOVE R12 R7 + 0x74320003, // 00B9 JMPT R12 #00BE + 0xB8321600, // 00BA GETNGBL R12 K11 + 0x8830190D, // 00BB GETMBR R12 R12 K13 + 0x9006140C, // 00BC SETMBR R1 K10 R12 + 0x70020008, // 00BD JMP #00C7 + 0x5C301200, // 00BE MOVE R12 R9 + 0x74320003, // 00BF JMPT R12 #00C4 + 0xB8321600, // 00C0 GETNGBL R12 K11 + 0x8830190E, // 00C1 GETMBR R12 R12 K14 + 0x9006140C, // 00C2 SETMBR R1 K10 R12 + 0x70020002, // 00C3 JMP #00C7 + 0xB8321600, // 00C4 GETNGBL R12 K11 + 0x8830190F, // 00C5 GETMBR R12 R12 K15 + 0x9006140C, // 00C6 SETMBR R1 K10 R12 + 0x5C300400, // 00C7 MOVE R12 R2 + 0x4C340000, // 00C8 LDNIL R13 + 0x5C380200, // 00C9 MOVE R14 R1 + 0x503C0200, // 00CA LDBOOL R15 1 0 + 0x7C300600, // 00CB CALL R12 3 + 0x80000000, // 00CC RET 0 }) ) ); @@ -1012,7 +1006,7 @@ be_local_closure(Matter_Device_process_attribute_expansion, /* name */ ********************************************************************/ be_local_closure(Matter_Device__compute_pbkdf, /* name */ be_nested_proto( - 14, /* nstack */ + 13, /* nstack */ 4, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -1020,63 +1014,61 @@ be_local_closure(Matter_Device__compute_pbkdf, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[11]) { /* constants */ + ( &(const bvalue[10]) { /* constants */ /* K0 */ be_nested_str_weak(crypto), - /* K1 */ be_nested_str_weak(string), - /* K2 */ be_nested_str_weak(add), - /* K3 */ be_nested_str_weak(PBKDF2_HMAC_SHA256), - /* K4 */ be_nested_str_weak(derive), - /* K5 */ be_const_int(0), - /* K6 */ be_nested_str_weak(root_w0), - /* K7 */ be_nested_str_weak(EC_P256), - /* K8 */ be_nested_str_weak(mod), - /* K9 */ be_nested_str_weak(root_L), - /* K10 */ be_nested_str_weak(public_key), + /* K1 */ be_nested_str_weak(add), + /* K2 */ be_nested_str_weak(PBKDF2_HMAC_SHA256), + /* K3 */ be_nested_str_weak(derive), + /* K4 */ be_const_int(0), + /* K5 */ be_nested_str_weak(root_w0), + /* K6 */ be_nested_str_weak(EC_P256), + /* K7 */ be_nested_str_weak(mod), + /* K8 */ be_nested_str_weak(root_L), + /* K9 */ be_nested_str_weak(public_key), }), be_str_weak(_compute_pbkdf), &be_const_str_solidified, - ( &(const binstruction[41]) { /* code */ + ( &(const binstruction[40]) { /* code */ 0xA4120000, // 0000 IMPORT R4 K0 - 0xA4160200, // 0001 IMPORT R5 K1 - 0x60180015, // 0002 GETGBL R6 G21 - 0x7C180000, // 0003 CALL R6 0 - 0x8C180D02, // 0004 GETMET R6 R6 K2 - 0x5C200200, // 0005 MOVE R8 R1 - 0x54260003, // 0006 LDINT R9 4 - 0x7C180600, // 0007 CALL R6 3 - 0x8C1C0903, // 0008 GETMET R7 R4 K3 - 0x7C1C0200, // 0009 CALL R7 1 - 0x8C1C0F04, // 000A GETMET R7 R7 K4 - 0x5C240C00, // 000B MOVE R9 R6 - 0x5C280600, // 000C MOVE R10 R3 - 0x5C2C0400, // 000D MOVE R11 R2 - 0x5432004F, // 000E LDINT R12 80 - 0x7C1C0A00, // 000F CALL R7 5 - 0x54220026, // 0010 LDINT R8 39 - 0x40220A08, // 0011 CONNECT R8 K5 R8 - 0x94200E08, // 0012 GETIDX R8 R7 R8 - 0x54260027, // 0013 LDINT R9 40 - 0x542A004E, // 0014 LDINT R10 79 - 0x4024120A, // 0015 CONNECT R9 R9 R10 - 0x94240E09, // 0016 GETIDX R9 R7 R9 - 0x8C280907, // 0017 GETMET R10 R4 K7 - 0x7C280200, // 0018 CALL R10 1 - 0x8C281508, // 0019 GETMET R10 R10 K8 - 0x5C301000, // 001A MOVE R12 R8 - 0x7C280400, // 001B CALL R10 2 - 0x90020C0A, // 001C SETMBR R0 K6 R10 - 0x8C280907, // 001D GETMET R10 R4 K7 - 0x7C280200, // 001E CALL R10 1 - 0x8C281508, // 001F GETMET R10 R10 K8 - 0x5C301200, // 0020 MOVE R12 R9 - 0x7C280400, // 0021 CALL R10 2 - 0x8C2C0907, // 0022 GETMET R11 R4 K7 - 0x7C2C0200, // 0023 CALL R11 1 - 0x8C2C170A, // 0024 GETMET R11 R11 K10 - 0x5C341400, // 0025 MOVE R13 R10 - 0x7C2C0400, // 0026 CALL R11 2 - 0x9002120B, // 0027 SETMBR R0 K9 R11 - 0x80000000, // 0028 RET 0 + 0x60140015, // 0001 GETGBL R5 G21 + 0x7C140000, // 0002 CALL R5 0 + 0x8C140B01, // 0003 GETMET R5 R5 K1 + 0x5C1C0200, // 0004 MOVE R7 R1 + 0x54220003, // 0005 LDINT R8 4 + 0x7C140600, // 0006 CALL R5 3 + 0x8C180902, // 0007 GETMET R6 R4 K2 + 0x7C180200, // 0008 CALL R6 1 + 0x8C180D03, // 0009 GETMET R6 R6 K3 + 0x5C200A00, // 000A MOVE R8 R5 + 0x5C240600, // 000B MOVE R9 R3 + 0x5C280400, // 000C MOVE R10 R2 + 0x542E004F, // 000D LDINT R11 80 + 0x7C180A00, // 000E CALL R6 5 + 0x541E0026, // 000F LDINT R7 39 + 0x401E0807, // 0010 CONNECT R7 K4 R7 + 0x941C0C07, // 0011 GETIDX R7 R6 R7 + 0x54220027, // 0012 LDINT R8 40 + 0x5426004E, // 0013 LDINT R9 79 + 0x40201009, // 0014 CONNECT R8 R8 R9 + 0x94200C08, // 0015 GETIDX R8 R6 R8 + 0x8C240906, // 0016 GETMET R9 R4 K6 + 0x7C240200, // 0017 CALL R9 1 + 0x8C241307, // 0018 GETMET R9 R9 K7 + 0x5C2C0E00, // 0019 MOVE R11 R7 + 0x7C240400, // 001A CALL R9 2 + 0x90020A09, // 001B SETMBR R0 K5 R9 + 0x8C240906, // 001C GETMET R9 R4 K6 + 0x7C240200, // 001D CALL R9 1 + 0x8C241307, // 001E GETMET R9 R9 K7 + 0x5C2C1000, // 001F MOVE R11 R8 + 0x7C240400, // 0020 CALL R9 2 + 0x8C280906, // 0021 GETMET R10 R4 K6 + 0x7C280200, // 0022 CALL R10 1 + 0x8C281509, // 0023 GETMET R10 R10 K9 + 0x5C301200, // 0024 MOVE R12 R9 + 0x7C280400, // 0025 CALL R10 2 + 0x9002100A, // 0026 SETMBR R0 K8 R10 + 0x80000000, // 0027 RET 0 }) ) ); @@ -1088,7 +1080,7 @@ be_local_closure(Matter_Device__compute_pbkdf, /* name */ ********************************************************************/ be_local_closure(Matter_Device_bridge_remove_endpoint, /* name */ be_nested_proto( - 13, /* nstack */ + 11, /* nstack */ 2, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -1096,92 +1088,89 @@ be_local_closure(Matter_Device_bridge_remove_endpoint, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[20]) { /* constants */ - /* K0 */ be_nested_str_weak(string), - /* K1 */ be_nested_str_weak(json), - /* K2 */ be_nested_str_weak(plugins_config), - /* K3 */ be_nested_str_weak(contains), - /* K4 */ be_nested_str_weak(tasmota), - /* K5 */ be_nested_str_weak(log), - /* K6 */ be_nested_str_weak(MTR_X3A_X20Cannot_X20remove_X20an_X20enpoint_X20not_X20configured_X3A_X20), - /* K7 */ be_const_int(3), - /* K8 */ be_nested_str_weak(format), - /* K9 */ be_nested_str_weak(MTR_X3A_X20deleting_X20endpoint_X20_X3D_X20_X25i), - /* K10 */ be_const_int(2), - /* K11 */ be_nested_str_weak(remove), - /* K12 */ be_nested_str_weak(plugins_persist), - /* K13 */ be_nested_str_weak(save_param), - /* K14 */ be_nested_str_weak(signal_endpoints_changed), - /* K15 */ be_const_int(0), - /* K16 */ be_nested_str_weak(plugins), - /* K17 */ be_nested_str_weak(get_endpoint), - /* K18 */ be_const_int(1), - /* K19 */ be_nested_str_weak(clean_remotes), + ( &(const bvalue[18]) { /* constants */ + /* K0 */ be_nested_str_weak(json), + /* K1 */ be_nested_str_weak(plugins_config), + /* K2 */ be_nested_str_weak(contains), + /* K3 */ be_nested_str_weak(tasmota), + /* K4 */ be_nested_str_weak(log), + /* K5 */ be_nested_str_weak(MTR_X3A_X20Cannot_X20remove_X20an_X20enpoint_X20not_X20configured_X3A_X20), + /* K6 */ be_const_int(3), + /* K7 */ be_nested_str_weak(MTR_X3A_X20deleting_X20endpoint_X20_X3D_X20_X25i), + /* K8 */ be_const_int(2), + /* K9 */ be_nested_str_weak(remove), + /* K10 */ be_nested_str_weak(plugins_persist), + /* K11 */ be_nested_str_weak(save_param), + /* K12 */ be_nested_str_weak(signal_endpoints_changed), + /* K13 */ be_const_int(0), + /* K14 */ be_nested_str_weak(plugins), + /* K15 */ be_nested_str_weak(get_endpoint), + /* K16 */ be_const_int(1), + /* K17 */ be_nested_str_weak(clean_remotes), }), be_str_weak(bridge_remove_endpoint), &be_const_str_solidified, - ( &(const binstruction[61]) { /* code */ + ( &(const binstruction[60]) { /* code */ 0xA40A0000, // 0000 IMPORT R2 K0 - 0xA40E0200, // 0001 IMPORT R3 K1 - 0x60100008, // 0002 GETGBL R4 G8 - 0x5C140200, // 0003 MOVE R5 R1 - 0x7C100200, // 0004 CALL R4 1 + 0x600C0008, // 0001 GETGBL R3 G8 + 0x5C100200, // 0002 MOVE R4 R1 + 0x7C0C0200, // 0003 CALL R3 1 + 0x4C100000, // 0004 LDNIL R4 0x4C140000, // 0005 LDNIL R5 - 0x4C180000, // 0006 LDNIL R6 - 0x881C0102, // 0007 GETMBR R7 R0 K2 - 0x8C1C0F03, // 0008 GETMET R7 R7 K3 - 0x5C240800, // 0009 MOVE R9 R4 - 0x7C1C0400, // 000A CALL R7 2 - 0x741E0005, // 000B JMPT R7 #0012 - 0xB81E0800, // 000C GETNGBL R7 K4 - 0x8C1C0F05, // 000D GETMET R7 R7 K5 - 0x00260C04, // 000E ADD R9 K6 R4 - 0x58280007, // 000F LDCONST R10 K7 - 0x7C1C0600, // 0010 CALL R7 3 - 0x80000E00, // 0011 RET 0 - 0xB81E0800, // 0012 GETNGBL R7 K4 - 0x8C1C0F05, // 0013 GETMET R7 R7 K5 - 0x8C240508, // 0014 GETMET R9 R2 K8 - 0x582C0009, // 0015 LDCONST R11 K9 - 0x5C300200, // 0016 MOVE R12 R1 - 0x7C240600, // 0017 CALL R9 3 - 0x5828000A, // 0018 LDCONST R10 K10 - 0x7C1C0600, // 0019 CALL R7 3 - 0x881C0102, // 001A GETMBR R7 R0 K2 - 0x8C1C0F0B, // 001B GETMET R7 R7 K11 - 0x5C240800, // 001C MOVE R9 R4 - 0x7C1C0400, // 001D CALL R7 2 - 0x501C0200, // 001E LDBOOL R7 1 0 - 0x90021807, // 001F SETMBR R0 K12 R7 - 0x8C1C010D, // 0020 GETMET R7 R0 K13 - 0x7C1C0200, // 0021 CALL R7 1 - 0x8C1C010E, // 0022 GETMET R7 R0 K14 - 0x7C1C0200, // 0023 CALL R7 1 - 0x581C000F, // 0024 LDCONST R7 K15 - 0x6020000C, // 0025 GETGBL R8 G12 - 0x88240110, // 0026 GETMBR R9 R0 K16 - 0x7C200200, // 0027 CALL R8 1 - 0x14200E08, // 0028 LT R8 R7 R8 - 0x7822000F, // 0029 JMPF R8 #003A - 0x88200110, // 002A GETMBR R8 R0 K16 - 0x94201007, // 002B GETIDX R8 R8 R7 - 0x8C201111, // 002C GETMET R8 R8 K17 - 0x7C200200, // 002D CALL R8 1 - 0x1C200208, // 002E EQ R8 R1 R8 - 0x78220007, // 002F JMPF R8 #0038 - 0x88200110, // 0030 GETMBR R8 R0 K16 - 0x8C20110B, // 0031 GETMET R8 R8 K11 - 0x5C280E00, // 0032 MOVE R10 R7 - 0x7C200400, // 0033 CALL R8 2 - 0x8C20010E, // 0034 GETMET R8 R0 K14 - 0x7C200200, // 0035 CALL R8 1 - 0x70020002, // 0036 JMP #003A - 0x70020000, // 0037 JMP #0039 - 0x001C0F12, // 0038 ADD R7 R7 K18 - 0x7001FFEA, // 0039 JMP #0025 - 0x8C200113, // 003A GETMET R8 R0 K19 - 0x7C200200, // 003B CALL R8 1 - 0x80000000, // 003C RET 0 + 0x88180101, // 0006 GETMBR R6 R0 K1 + 0x8C180D02, // 0007 GETMET R6 R6 K2 + 0x5C200600, // 0008 MOVE R8 R3 + 0x7C180400, // 0009 CALL R6 2 + 0x741A0005, // 000A JMPT R6 #0011 + 0xB81A0600, // 000B GETNGBL R6 K3 + 0x8C180D04, // 000C GETMET R6 R6 K4 + 0x00220A03, // 000D ADD R8 K5 R3 + 0x58240006, // 000E LDCONST R9 K6 + 0x7C180600, // 000F CALL R6 3 + 0x80000C00, // 0010 RET 0 + 0xB81A0600, // 0011 GETNGBL R6 K3 + 0x8C180D04, // 0012 GETMET R6 R6 K4 + 0x60200018, // 0013 GETGBL R8 G24 + 0x58240007, // 0014 LDCONST R9 K7 + 0x5C280200, // 0015 MOVE R10 R1 + 0x7C200400, // 0016 CALL R8 2 + 0x58240008, // 0017 LDCONST R9 K8 + 0x7C180600, // 0018 CALL R6 3 + 0x88180101, // 0019 GETMBR R6 R0 K1 + 0x8C180D09, // 001A GETMET R6 R6 K9 + 0x5C200600, // 001B MOVE R8 R3 + 0x7C180400, // 001C CALL R6 2 + 0x50180200, // 001D LDBOOL R6 1 0 + 0x90021406, // 001E SETMBR R0 K10 R6 + 0x8C18010B, // 001F GETMET R6 R0 K11 + 0x7C180200, // 0020 CALL R6 1 + 0x8C18010C, // 0021 GETMET R6 R0 K12 + 0x7C180200, // 0022 CALL R6 1 + 0x5818000D, // 0023 LDCONST R6 K13 + 0x601C000C, // 0024 GETGBL R7 G12 + 0x8820010E, // 0025 GETMBR R8 R0 K14 + 0x7C1C0200, // 0026 CALL R7 1 + 0x141C0C07, // 0027 LT R7 R6 R7 + 0x781E000F, // 0028 JMPF R7 #0039 + 0x881C010E, // 0029 GETMBR R7 R0 K14 + 0x941C0E06, // 002A GETIDX R7 R7 R6 + 0x8C1C0F0F, // 002B GETMET R7 R7 K15 + 0x7C1C0200, // 002C CALL R7 1 + 0x1C1C0207, // 002D EQ R7 R1 R7 + 0x781E0007, // 002E JMPF R7 #0037 + 0x881C010E, // 002F GETMBR R7 R0 K14 + 0x8C1C0F09, // 0030 GETMET R7 R7 K9 + 0x5C240C00, // 0031 MOVE R9 R6 + 0x7C1C0400, // 0032 CALL R7 2 + 0x8C1C010C, // 0033 GETMET R7 R0 K12 + 0x7C1C0200, // 0034 CALL R7 1 + 0x70020002, // 0035 JMP #0039 + 0x70020000, // 0036 JMP #0038 + 0x00180D10, // 0037 ADD R6 R6 K16 + 0x7001FFEA, // 0038 JMP #0024 + 0x8C1C0111, // 0039 GETMET R7 R0 K17 + 0x7C1C0200, // 003A CALL R7 1 + 0x80000000, // 003B RET 0 }) ) ); @@ -1355,7 +1344,7 @@ be_local_closure(Matter_Device_remove_fabric, /* name */ ********************************************************************/ be_local_closure(Matter_Device_save_param, /* name */ be_nested_proto( - 11, /* nstack */ + 10, /* nstack */ 1, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -1363,105 +1352,102 @@ be_local_closure(Matter_Device_save_param, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[28]) { /* constants */ - /* K0 */ be_nested_str_weak(string), - /* K1 */ be_nested_str_weak(json), - /* K2 */ be_nested_str_weak(format), - /* K3 */ be_nested_str_weak(_X7B_X22distinguish_X22_X3A_X25i_X2C_X22passcode_X22_X3A_X25i_X2C_X22ipv4only_X22_X3A_X25s_X2C_X22nextep_X22_X3A_X25i), - /* K4 */ be_nested_str_weak(root_discriminator), - /* K5 */ be_nested_str_weak(root_passcode), - /* K6 */ be_nested_str_weak(ipv4only), - /* K7 */ be_nested_str_weak(true), - /* K8 */ be_nested_str_weak(false), - /* K9 */ be_nested_str_weak(next_ep), - /* K10 */ be_nested_str_weak(plugins_persist), - /* K11 */ be_nested_str_weak(_X2C_X22config_X22_X3A), - /* K12 */ be_nested_str_weak(dump), - /* K13 */ be_nested_str_weak(plugins_config), - /* K14 */ be_nested_str_weak(_X7D), - /* K15 */ be_nested_str_weak(FILENAME), - /* K16 */ be_nested_str_weak(w), - /* K17 */ be_nested_str_weak(write), - /* K18 */ be_nested_str_weak(close), - /* K19 */ be_nested_str_weak(tasmota), - /* K20 */ be_nested_str_weak(log), - /* K21 */ be_nested_str_weak(MTR_X3A_X20_X3DSaved_X20_X20_X20_X20_X20parameters_X25s), - /* K22 */ be_nested_str_weak(_X20and_X20configuration), - /* K23 */ be_nested_str_weak(), - /* K24 */ be_const_int(3), - /* K25 */ be_nested_str_weak(MTR_X3A_X20Session_Store_X3A_X3Asave_X20Exception_X3A), - /* K26 */ be_nested_str_weak(_X7C), - /* K27 */ be_const_int(2), + ( &(const bvalue[26]) { /* constants */ + /* K0 */ be_nested_str_weak(json), + /* K1 */ be_nested_str_weak(_X7B_X22distinguish_X22_X3A_X25i_X2C_X22passcode_X22_X3A_X25i_X2C_X22ipv4only_X22_X3A_X25s_X2C_X22nextep_X22_X3A_X25i), + /* K2 */ be_nested_str_weak(root_discriminator), + /* K3 */ be_nested_str_weak(root_passcode), + /* K4 */ be_nested_str_weak(ipv4only), + /* K5 */ be_nested_str_weak(true), + /* K6 */ be_nested_str_weak(false), + /* K7 */ be_nested_str_weak(next_ep), + /* K8 */ be_nested_str_weak(plugins_persist), + /* K9 */ be_nested_str_weak(_X2C_X22config_X22_X3A), + /* K10 */ be_nested_str_weak(dump), + /* K11 */ be_nested_str_weak(plugins_config), + /* K12 */ be_nested_str_weak(_X7D), + /* K13 */ be_nested_str_weak(FILENAME), + /* K14 */ be_nested_str_weak(w), + /* K15 */ be_nested_str_weak(write), + /* K16 */ be_nested_str_weak(close), + /* K17 */ be_nested_str_weak(tasmota), + /* K18 */ be_nested_str_weak(log), + /* K19 */ be_nested_str_weak(MTR_X3A_X20_X3DSaved_X20_X20_X20_X20_X20parameters_X25s), + /* K20 */ be_nested_str_weak(_X20and_X20configuration), + /* K21 */ be_nested_str_weak(), + /* K22 */ be_const_int(3), + /* K23 */ be_nested_str_weak(MTR_X3A_X20Session_Store_X3A_X3Asave_X20Exception_X3A), + /* K24 */ be_nested_str_weak(_X7C), + /* K25 */ be_const_int(2), }), be_str_weak(save_param), &be_const_str_solidified, - ( &(const binstruction[66]) { /* code */ + ( &(const binstruction[65]) { /* code */ 0xA4060000, // 0000 IMPORT R1 K0 - 0xA40A0200, // 0001 IMPORT R2 K1 - 0x8C0C0302, // 0002 GETMET R3 R1 K2 - 0x58140003, // 0003 LDCONST R5 K3 - 0x88180104, // 0004 GETMBR R6 R0 K4 - 0x881C0105, // 0005 GETMBR R7 R0 K5 - 0x88200106, // 0006 GETMBR R8 R0 K6 - 0x78220001, // 0007 JMPF R8 #000A - 0x58200007, // 0008 LDCONST R8 K7 - 0x70020000, // 0009 JMP #000B - 0x58200008, // 000A LDCONST R8 K8 - 0x88240109, // 000B GETMBR R9 R0 K9 - 0x7C0C0C00, // 000C CALL R3 6 - 0x8810010A, // 000D GETMBR R4 R0 K10 - 0x78120004, // 000E JMPF R4 #0014 - 0x000C070B, // 000F ADD R3 R3 K11 - 0x8C10050C, // 0010 GETMET R4 R2 K12 - 0x8818010D, // 0011 GETMBR R6 R0 K13 - 0x7C100400, // 0012 CALL R4 2 - 0x000C0604, // 0013 ADD R3 R3 R4 - 0x000C070E, // 0014 ADD R3 R3 K14 - 0xA8020018, // 0015 EXBLK 0 #002F - 0x60100011, // 0016 GETGBL R4 G17 - 0x8814010F, // 0017 GETMBR R5 R0 K15 - 0x58180010, // 0018 LDCONST R6 K16 - 0x7C100400, // 0019 CALL R4 2 - 0x8C140911, // 001A GETMET R5 R4 K17 - 0x5C1C0600, // 001B MOVE R7 R3 - 0x7C140400, // 001C CALL R5 2 - 0x8C140912, // 001D GETMET R5 R4 K18 - 0x7C140200, // 001E CALL R5 1 - 0xB8162600, // 001F GETNGBL R5 K19 - 0x8C140B14, // 0020 GETMET R5 R5 K20 - 0x8C1C0302, // 0021 GETMET R7 R1 K2 - 0x58240015, // 0022 LDCONST R9 K21 - 0x8828010A, // 0023 GETMBR R10 R0 K10 - 0x782A0001, // 0024 JMPF R10 #0027 - 0x58280016, // 0025 LDCONST R10 K22 - 0x70020000, // 0026 JMP #0028 - 0x58280017, // 0027 LDCONST R10 K23 - 0x7C1C0600, // 0028 CALL R7 3 - 0x58200018, // 0029 LDCONST R8 K24 - 0x7C140600, // 002A CALL R5 3 - 0xA8040001, // 002B EXBLK 1 1 - 0x80040600, // 002C RET 1 R3 - 0xA8040001, // 002D EXBLK 1 1 - 0x70020011, // 002E JMP #0041 - 0xAC100002, // 002F CATCH R4 0 2 - 0x7002000E, // 0030 JMP #0040 - 0xB81A2600, // 0031 GETNGBL R6 K19 - 0x8C180D14, // 0032 GETMET R6 R6 K20 - 0x60200008, // 0033 GETGBL R8 G8 - 0x5C240800, // 0034 MOVE R9 R4 - 0x7C200200, // 0035 CALL R8 1 - 0x00223208, // 0036 ADD R8 K25 R8 - 0x0020111A, // 0037 ADD R8 R8 K26 - 0x60240008, // 0038 GETGBL R9 G8 - 0x5C280A00, // 0039 MOVE R10 R5 - 0x7C240200, // 003A CALL R9 1 - 0x00201009, // 003B ADD R8 R8 R9 - 0x5824001B, // 003C LDCONST R9 K27 - 0x7C180600, // 003D CALL R6 3 - 0x80040600, // 003E RET 1 R3 - 0x70020000, // 003F JMP #0041 - 0xB0080000, // 0040 RAISE 2 R0 R0 - 0x80000000, // 0041 RET 0 + 0x60080018, // 0001 GETGBL R2 G24 + 0x580C0001, // 0002 LDCONST R3 K1 + 0x88100102, // 0003 GETMBR R4 R0 K2 + 0x88140103, // 0004 GETMBR R5 R0 K3 + 0x88180104, // 0005 GETMBR R6 R0 K4 + 0x781A0001, // 0006 JMPF R6 #0009 + 0x58180005, // 0007 LDCONST R6 K5 + 0x70020000, // 0008 JMP #000A + 0x58180006, // 0009 LDCONST R6 K6 + 0x881C0107, // 000A GETMBR R7 R0 K7 + 0x7C080A00, // 000B CALL R2 5 + 0x880C0108, // 000C GETMBR R3 R0 K8 + 0x780E0004, // 000D JMPF R3 #0013 + 0x00080509, // 000E ADD R2 R2 K9 + 0x8C0C030A, // 000F GETMET R3 R1 K10 + 0x8814010B, // 0010 GETMBR R5 R0 K11 + 0x7C0C0400, // 0011 CALL R3 2 + 0x00080403, // 0012 ADD R2 R2 R3 + 0x0008050C, // 0013 ADD R2 R2 K12 + 0xA8020018, // 0014 EXBLK 0 #002E + 0x600C0011, // 0015 GETGBL R3 G17 + 0x8810010D, // 0016 GETMBR R4 R0 K13 + 0x5814000E, // 0017 LDCONST R5 K14 + 0x7C0C0400, // 0018 CALL R3 2 + 0x8C10070F, // 0019 GETMET R4 R3 K15 + 0x5C180400, // 001A MOVE R6 R2 + 0x7C100400, // 001B CALL R4 2 + 0x8C100710, // 001C GETMET R4 R3 K16 + 0x7C100200, // 001D CALL R4 1 + 0xB8122200, // 001E GETNGBL R4 K17 + 0x8C100912, // 001F GETMET R4 R4 K18 + 0x60180018, // 0020 GETGBL R6 G24 + 0x581C0013, // 0021 LDCONST R7 K19 + 0x88200108, // 0022 GETMBR R8 R0 K8 + 0x78220001, // 0023 JMPF R8 #0026 + 0x58200014, // 0024 LDCONST R8 K20 + 0x70020000, // 0025 JMP #0027 + 0x58200015, // 0026 LDCONST R8 K21 + 0x7C180400, // 0027 CALL R6 2 + 0x581C0016, // 0028 LDCONST R7 K22 + 0x7C100600, // 0029 CALL R4 3 + 0xA8040001, // 002A EXBLK 1 1 + 0x80040400, // 002B RET 1 R2 + 0xA8040001, // 002C EXBLK 1 1 + 0x70020011, // 002D JMP #0040 + 0xAC0C0002, // 002E CATCH R3 0 2 + 0x7002000E, // 002F JMP #003F + 0xB8162200, // 0030 GETNGBL R5 K17 + 0x8C140B12, // 0031 GETMET R5 R5 K18 + 0x601C0008, // 0032 GETGBL R7 G8 + 0x5C200600, // 0033 MOVE R8 R3 + 0x7C1C0200, // 0034 CALL R7 1 + 0x001E2E07, // 0035 ADD R7 K23 R7 + 0x001C0F18, // 0036 ADD R7 R7 K24 + 0x60200008, // 0037 GETGBL R8 G8 + 0x5C240800, // 0038 MOVE R9 R4 + 0x7C200200, // 0039 CALL R8 1 + 0x001C0E08, // 003A ADD R7 R7 R8 + 0x58200019, // 003B LDCONST R8 K25 + 0x7C140600, // 003C CALL R5 3 + 0x80040400, // 003D RET 1 R2 + 0x70020000, // 003E JMP #0040 + 0xB0080000, // 003F RAISE 2 R0 R0 + 0x80000000, // 0040 RET 0 }) ) ); @@ -1510,7 +1496,7 @@ be_local_closure(Matter_Device_get_plugin_class_arg, /* name */ ********************************************************************/ be_local_closure(Matter_Device_mdns_remove_PASE, /* name */ be_nested_proto( - 12, /* nstack */ + 10, /* nstack */ 1, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -1518,116 +1504,113 @@ be_local_closure(Matter_Device_mdns_remove_PASE, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[22]) { /* constants */ + ( &(const bvalue[20]) { /* constants */ /* K0 */ be_nested_str_weak(mdns), - /* K1 */ be_nested_str_weak(string), - /* K2 */ be_nested_str_weak(mdns_pase_eth), - /* K3 */ be_nested_str_weak(tasmota), - /* K4 */ be_nested_str_weak(log), - /* K5 */ be_nested_str_weak(format), - /* K6 */ be_nested_str_weak(MTR_X3A_X20calling_X20mdns_X2Eremove_service_X28_X25s_X2C_X20_X25s_X2C_X20_X25s_X2C_X20_X25s_X29), - /* K7 */ be_nested_str_weak(_matterc), - /* K8 */ be_nested_str_weak(_udp), - /* K9 */ be_nested_str_weak(commissioning_instance_eth), - /* K10 */ be_nested_str_weak(hostname_eth), - /* K11 */ be_const_int(3), - /* K12 */ be_nested_str_weak(MTR_X3A_X20remove_X20mDNS_X20on_X20_X25s_X20_X27_X25s_X27), - /* K13 */ be_nested_str_weak(eth), - /* K14 */ be_nested_str_weak(remove_service), - /* K15 */ be_nested_str_weak(mdns_pase_wifi), - /* K16 */ be_nested_str_weak(commissioning_instance_wifi), - /* K17 */ be_nested_str_weak(hostname_wifi), - /* K18 */ be_nested_str_weak(wifi), - /* K19 */ be_nested_str_weak(MTR_X3A_X20Exception), - /* K20 */ be_nested_str_weak(_X7C), - /* K21 */ be_const_int(2), + /* K1 */ be_nested_str_weak(mdns_pase_eth), + /* K2 */ be_nested_str_weak(tasmota), + /* K3 */ be_nested_str_weak(log), + /* K4 */ be_nested_str_weak(MTR_X3A_X20calling_X20mdns_X2Eremove_service_X28_X25s_X2C_X20_X25s_X2C_X20_X25s_X2C_X20_X25s_X29), + /* K5 */ be_nested_str_weak(_matterc), + /* K6 */ be_nested_str_weak(_udp), + /* K7 */ be_nested_str_weak(commissioning_instance_eth), + /* K8 */ be_nested_str_weak(hostname_eth), + /* K9 */ be_const_int(3), + /* K10 */ be_nested_str_weak(MTR_X3A_X20remove_X20mDNS_X20on_X20_X25s_X20_X27_X25s_X27), + /* K11 */ be_nested_str_weak(eth), + /* K12 */ be_nested_str_weak(remove_service), + /* K13 */ be_nested_str_weak(mdns_pase_wifi), + /* K14 */ be_nested_str_weak(commissioning_instance_wifi), + /* K15 */ be_nested_str_weak(hostname_wifi), + /* K16 */ be_nested_str_weak(wifi), + /* K17 */ be_nested_str_weak(MTR_X3A_X20Exception), + /* K18 */ be_nested_str_weak(_X7C), + /* K19 */ be_const_int(2), }), be_str_weak(mdns_remove_PASE), &be_const_str_solidified, - ( &(const binstruction[83]) { /* code */ + ( &(const binstruction[82]) { /* code */ 0xA4060000, // 0000 IMPORT R1 K0 - 0xA40A0200, // 0001 IMPORT R2 K1 - 0xA802003D, // 0002 EXBLK 0 #0041 - 0x880C0102, // 0003 GETMBR R3 R0 K2 - 0x780E001B, // 0004 JMPF R3 #0021 - 0xB80E0600, // 0005 GETNGBL R3 K3 - 0x8C0C0704, // 0006 GETMET R3 R3 K4 - 0x8C140505, // 0007 GETMET R5 R2 K5 - 0x581C0006, // 0008 LDCONST R7 K6 - 0x58200007, // 0009 LDCONST R8 K7 - 0x58240008, // 000A LDCONST R9 K8 - 0x88280109, // 000B GETMBR R10 R0 K9 - 0x882C010A, // 000C GETMBR R11 R0 K10 - 0x7C140C00, // 000D CALL R5 6 - 0x5818000B, // 000E LDCONST R6 K11 - 0x7C0C0600, // 000F CALL R3 3 - 0xB80E0600, // 0010 GETNGBL R3 K3 - 0x8C0C0704, // 0011 GETMET R3 R3 K4 - 0x8C140505, // 0012 GETMET R5 R2 K5 - 0x581C000C, // 0013 LDCONST R7 K12 - 0x5820000D, // 0014 LDCONST R8 K13 - 0x88240109, // 0015 GETMBR R9 R0 K9 - 0x7C140800, // 0016 CALL R5 4 - 0x5818000B, // 0017 LDCONST R6 K11 - 0x7C0C0600, // 0018 CALL R3 3 - 0x500C0000, // 0019 LDBOOL R3 0 0 - 0x90020403, // 001A SETMBR R0 K2 R3 - 0x8C0C030E, // 001B GETMET R3 R1 K14 - 0x58140007, // 001C LDCONST R5 K7 - 0x58180008, // 001D LDCONST R6 K8 - 0x881C0109, // 001E GETMBR R7 R0 K9 - 0x8820010A, // 001F GETMBR R8 R0 K10 - 0x7C0C0A00, // 0020 CALL R3 5 - 0x880C010F, // 0021 GETMBR R3 R0 K15 - 0x780E001B, // 0022 JMPF R3 #003F - 0xB80E0600, // 0023 GETNGBL R3 K3 - 0x8C0C0704, // 0024 GETMET R3 R3 K4 - 0x8C140505, // 0025 GETMET R5 R2 K5 - 0x581C0006, // 0026 LDCONST R7 K6 - 0x58200007, // 0027 LDCONST R8 K7 - 0x58240008, // 0028 LDCONST R9 K8 - 0x88280110, // 0029 GETMBR R10 R0 K16 - 0x882C0111, // 002A GETMBR R11 R0 K17 - 0x7C140C00, // 002B CALL R5 6 - 0x5818000B, // 002C LDCONST R6 K11 - 0x7C0C0600, // 002D CALL R3 3 - 0xB80E0600, // 002E GETNGBL R3 K3 - 0x8C0C0704, // 002F GETMET R3 R3 K4 - 0x8C140505, // 0030 GETMET R5 R2 K5 - 0x581C000C, // 0031 LDCONST R7 K12 - 0x58200012, // 0032 LDCONST R8 K18 - 0x88240110, // 0033 GETMBR R9 R0 K16 - 0x7C140800, // 0034 CALL R5 4 - 0x5818000B, // 0035 LDCONST R6 K11 - 0x7C0C0600, // 0036 CALL R3 3 - 0x500C0000, // 0037 LDBOOL R3 0 0 - 0x90021E03, // 0038 SETMBR R0 K15 R3 - 0x8C0C030E, // 0039 GETMET R3 R1 K14 - 0x58140007, // 003A LDCONST R5 K7 - 0x58180008, // 003B LDCONST R6 K8 - 0x881C0110, // 003C GETMBR R7 R0 K16 - 0x88200111, // 003D GETMBR R8 R0 K17 - 0x7C0C0A00, // 003E CALL R3 5 - 0xA8040001, // 003F EXBLK 1 1 - 0x70020010, // 0040 JMP #0052 - 0xAC0C0002, // 0041 CATCH R3 0 2 - 0x7002000D, // 0042 JMP #0051 - 0xB8160600, // 0043 GETNGBL R5 K3 - 0x8C140B04, // 0044 GETMET R5 R5 K4 - 0x601C0008, // 0045 GETGBL R7 G8 - 0x5C200600, // 0046 MOVE R8 R3 - 0x7C1C0200, // 0047 CALL R7 1 - 0x001E2607, // 0048 ADD R7 K19 R7 - 0x001C0F14, // 0049 ADD R7 R7 K20 - 0x60200008, // 004A GETGBL R8 G8 - 0x5C240800, // 004B MOVE R9 R4 - 0x7C200200, // 004C CALL R8 1 - 0x001C0E08, // 004D ADD R7 R7 R8 - 0x58200015, // 004E LDCONST R8 K21 - 0x7C140600, // 004F CALL R5 3 - 0x70020000, // 0050 JMP #0052 - 0xB0080000, // 0051 RAISE 2 R0 R0 - 0x80000000, // 0052 RET 0 + 0xA802003D, // 0001 EXBLK 0 #0040 + 0x88080101, // 0002 GETMBR R2 R0 K1 + 0x780A001B, // 0003 JMPF R2 #0020 + 0xB80A0400, // 0004 GETNGBL R2 K2 + 0x8C080503, // 0005 GETMET R2 R2 K3 + 0x60100018, // 0006 GETGBL R4 G24 + 0x58140004, // 0007 LDCONST R5 K4 + 0x58180005, // 0008 LDCONST R6 K5 + 0x581C0006, // 0009 LDCONST R7 K6 + 0x88200107, // 000A GETMBR R8 R0 K7 + 0x88240108, // 000B GETMBR R9 R0 K8 + 0x7C100A00, // 000C CALL R4 5 + 0x58140009, // 000D LDCONST R5 K9 + 0x7C080600, // 000E CALL R2 3 + 0xB80A0400, // 000F GETNGBL R2 K2 + 0x8C080503, // 0010 GETMET R2 R2 K3 + 0x60100018, // 0011 GETGBL R4 G24 + 0x5814000A, // 0012 LDCONST R5 K10 + 0x5818000B, // 0013 LDCONST R6 K11 + 0x881C0107, // 0014 GETMBR R7 R0 K7 + 0x7C100600, // 0015 CALL R4 3 + 0x58140009, // 0016 LDCONST R5 K9 + 0x7C080600, // 0017 CALL R2 3 + 0x50080000, // 0018 LDBOOL R2 0 0 + 0x90020202, // 0019 SETMBR R0 K1 R2 + 0x8C08030C, // 001A GETMET R2 R1 K12 + 0x58100005, // 001B LDCONST R4 K5 + 0x58140006, // 001C LDCONST R5 K6 + 0x88180107, // 001D GETMBR R6 R0 K7 + 0x881C0108, // 001E GETMBR R7 R0 K8 + 0x7C080A00, // 001F CALL R2 5 + 0x8808010D, // 0020 GETMBR R2 R0 K13 + 0x780A001B, // 0021 JMPF R2 #003E + 0xB80A0400, // 0022 GETNGBL R2 K2 + 0x8C080503, // 0023 GETMET R2 R2 K3 + 0x60100018, // 0024 GETGBL R4 G24 + 0x58140004, // 0025 LDCONST R5 K4 + 0x58180005, // 0026 LDCONST R6 K5 + 0x581C0006, // 0027 LDCONST R7 K6 + 0x8820010E, // 0028 GETMBR R8 R0 K14 + 0x8824010F, // 0029 GETMBR R9 R0 K15 + 0x7C100A00, // 002A CALL R4 5 + 0x58140009, // 002B LDCONST R5 K9 + 0x7C080600, // 002C CALL R2 3 + 0xB80A0400, // 002D GETNGBL R2 K2 + 0x8C080503, // 002E GETMET R2 R2 K3 + 0x60100018, // 002F GETGBL R4 G24 + 0x5814000A, // 0030 LDCONST R5 K10 + 0x58180010, // 0031 LDCONST R6 K16 + 0x881C010E, // 0032 GETMBR R7 R0 K14 + 0x7C100600, // 0033 CALL R4 3 + 0x58140009, // 0034 LDCONST R5 K9 + 0x7C080600, // 0035 CALL R2 3 + 0x50080000, // 0036 LDBOOL R2 0 0 + 0x90021A02, // 0037 SETMBR R0 K13 R2 + 0x8C08030C, // 0038 GETMET R2 R1 K12 + 0x58100005, // 0039 LDCONST R4 K5 + 0x58140006, // 003A LDCONST R5 K6 + 0x8818010E, // 003B GETMBR R6 R0 K14 + 0x881C010F, // 003C GETMBR R7 R0 K15 + 0x7C080A00, // 003D CALL R2 5 + 0xA8040001, // 003E EXBLK 1 1 + 0x70020010, // 003F JMP #0051 + 0xAC080002, // 0040 CATCH R2 0 2 + 0x7002000D, // 0041 JMP #0050 + 0xB8120400, // 0042 GETNGBL R4 K2 + 0x8C100903, // 0043 GETMET R4 R4 K3 + 0x60180008, // 0044 GETGBL R6 G8 + 0x5C1C0400, // 0045 MOVE R7 R2 + 0x7C180200, // 0046 CALL R6 1 + 0x001A2206, // 0047 ADD R6 K17 R6 + 0x00180D12, // 0048 ADD R6 R6 K18 + 0x601C0008, // 0049 GETGBL R7 G8 + 0x5C200600, // 004A MOVE R8 R3 + 0x7C1C0200, // 004B CALL R7 1 + 0x00180C07, // 004C ADD R6 R6 R7 + 0x581C0013, // 004D LDCONST R7 K19 + 0x7C100600, // 004E CALL R4 3 + 0x70020000, // 004F JMP #0051 + 0xB0080000, // 0050 RAISE 2 R0 R0 + 0x80000000, // 0051 RET 0 }) ) ); @@ -1680,7 +1663,7 @@ be_local_closure(Matter_Device_event_fabrics_saved, /* name */ ********************************************************************/ be_local_closure(Matter_Device_start_commissioning_complete, /* name */ be_nested_proto( - 13, /* nstack */ + 11, /* nstack */ 2, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -1688,49 +1671,46 @@ be_local_closure(Matter_Device_start_commissioning_complete, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[13]) { /* constants */ - /* K0 */ be_nested_str_weak(string), - /* K1 */ be_nested_str_weak(get_fabric), - /* K2 */ be_nested_str_weak(get_fabric_id), - /* K3 */ be_nested_str_weak(copy), - /* K4 */ be_nested_str_weak(reverse), - /* K5 */ be_nested_str_weak(tohex), - /* K6 */ be_nested_str_weak(get_admin_vendor_name), - /* K7 */ be_nested_str_weak(tasmota), - /* K8 */ be_nested_str_weak(log), - /* K9 */ be_nested_str_weak(format), - /* K10 */ be_nested_str_weak(MTR_X3A_X20_X2D_X2D_X2D_X20Commissioning_X20complete_X20for_X20Fabric_X20_X27_X25s_X27_X20_X28Vendor_X20_X25s_X29_X20_X2D_X2D_X2D), - /* K11 */ be_const_int(2), - /* K12 */ be_nested_str_weak(stop_basic_commissioning), + ( &(const bvalue[11]) { /* constants */ + /* K0 */ be_nested_str_weak(get_fabric), + /* K1 */ be_nested_str_weak(get_fabric_id), + /* K2 */ be_nested_str_weak(copy), + /* K3 */ be_nested_str_weak(reverse), + /* K4 */ be_nested_str_weak(tohex), + /* K5 */ be_nested_str_weak(get_admin_vendor_name), + /* K6 */ be_nested_str_weak(tasmota), + /* K7 */ be_nested_str_weak(log), + /* K8 */ be_nested_str_weak(MTR_X3A_X20_X2D_X2D_X2D_X20Commissioning_X20complete_X20for_X20Fabric_X20_X27_X25s_X27_X20_X28Vendor_X20_X25s_X29_X20_X2D_X2D_X2D), + /* K9 */ be_const_int(2), + /* K10 */ be_nested_str_weak(stop_basic_commissioning), }), be_str_weak(start_commissioning_complete), &be_const_str_solidified, - ( &(const binstruction[25]) { /* code */ - 0xA40A0000, // 0000 IMPORT R2 K0 - 0x8C0C0301, // 0001 GETMET R3 R1 K1 - 0x7C0C0200, // 0002 CALL R3 1 - 0x8C100702, // 0003 GETMET R4 R3 K2 - 0x7C100200, // 0004 CALL R4 1 - 0x8C100903, // 0005 GETMET R4 R4 K3 - 0x7C100200, // 0006 CALL R4 1 - 0x8C100904, // 0007 GETMET R4 R4 K4 - 0x7C100200, // 0008 CALL R4 1 - 0x8C100905, // 0009 GETMET R4 R4 K5 - 0x7C100200, // 000A CALL R4 1 - 0x8C140706, // 000B GETMET R5 R3 K6 - 0x7C140200, // 000C CALL R5 1 - 0xB81A0E00, // 000D GETNGBL R6 K7 - 0x8C180D08, // 000E GETMET R6 R6 K8 - 0x8C200509, // 000F GETMET R8 R2 K9 - 0x5828000A, // 0010 LDCONST R10 K10 - 0x5C2C0800, // 0011 MOVE R11 R4 - 0x5C300A00, // 0012 MOVE R12 R5 - 0x7C200800, // 0013 CALL R8 4 - 0x5824000B, // 0014 LDCONST R9 K11 - 0x7C180600, // 0015 CALL R6 3 - 0x8C18010C, // 0016 GETMET R6 R0 K12 - 0x7C180200, // 0017 CALL R6 1 - 0x80000000, // 0018 RET 0 + ( &(const binstruction[24]) { /* code */ + 0x8C080300, // 0000 GETMET R2 R1 K0 + 0x7C080200, // 0001 CALL R2 1 + 0x8C0C0501, // 0002 GETMET R3 R2 K1 + 0x7C0C0200, // 0003 CALL R3 1 + 0x8C0C0702, // 0004 GETMET R3 R3 K2 + 0x7C0C0200, // 0005 CALL R3 1 + 0x8C0C0703, // 0006 GETMET R3 R3 K3 + 0x7C0C0200, // 0007 CALL R3 1 + 0x8C0C0704, // 0008 GETMET R3 R3 K4 + 0x7C0C0200, // 0009 CALL R3 1 + 0x8C100505, // 000A GETMET R4 R2 K5 + 0x7C100200, // 000B CALL R4 1 + 0xB8160C00, // 000C GETNGBL R5 K6 + 0x8C140B07, // 000D GETMET R5 R5 K7 + 0x601C0018, // 000E GETGBL R7 G24 + 0x58200008, // 000F LDCONST R8 K8 + 0x5C240600, // 0010 MOVE R9 R3 + 0x5C280800, // 0011 MOVE R10 R4 + 0x7C1C0600, // 0012 CALL R7 3 + 0x58200009, // 0013 LDCONST R8 K9 + 0x7C140600, // 0014 CALL R5 3 + 0x8C14010A, // 0015 GETMET R5 R0 K10 + 0x7C140200, // 0016 CALL R5 1 + 0x80000000, // 0017 RET 0 }) ) ); @@ -1775,7 +1755,7 @@ be_local_closure(Matter_Device_msg_received, /* name */ ********************************************************************/ be_local_closure(Matter_Device__instantiate_plugins_from_config, /* name */ be_nested_proto( - 20, /* nstack */ + 18, /* nstack */ 2, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -1783,196 +1763,193 @@ be_local_closure(Matter_Device__instantiate_plugins_from_config, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[32]) { /* constants */ - /* K0 */ be_nested_str_weak(string), - /* K1 */ be_nested_str_weak(k2l_num), - /* K2 */ be_nested_str_weak(tasmota), - /* K3 */ be_nested_str_weak(log), - /* K4 */ be_nested_str_weak(MTR_X3A_X20Configuring_X20endpoints), - /* K5 */ be_const_int(2), - /* K6 */ be_nested_str_weak(plugins), - /* K7 */ be_nested_str_weak(push), - /* K8 */ be_nested_str_weak(matter), - /* K9 */ be_nested_str_weak(Plugin_Root), - /* K10 */ be_const_int(0), - /* K11 */ be_nested_str_weak(format), - /* K12 */ be_nested_str_weak(MTR_X3A_X20_X20_X20endpoint_X20_X3D_X20_X255i_X20type_X3A_X25s_X25s), - /* K13 */ be_nested_str_weak(root), - /* K14 */ be_nested_str_weak(), - /* K15 */ be_nested_str_weak(Plugin_Aggregator), - /* K16 */ be_nested_str_weak(find), - /* K17 */ be_nested_str_weak(type), - /* K18 */ be_nested_str_weak(MTR_X3A_X20no_X20class_X20name_X2C_X20skipping), - /* K19 */ be_const_int(3), - /* K20 */ be_nested_str_weak(MTR_X3A_X20only_X20one_X20root_X20node_X20allowed), - /* K21 */ be_nested_str_weak(plugins_classes), - /* K22 */ be_nested_str_weak(MTR_X3A_X20unknown_X20class_X20name_X20_X27), - /* K23 */ be_nested_str_weak(_X27_X20skipping), - /* K24 */ be_nested_str_weak(conf_to_log), - /* K25 */ be_nested_str_weak(MTR_X3A_X20Exception), - /* K26 */ be_nested_str_weak(_X7C), - /* K27 */ be_nested_str_weak(stop_iteration), - /* K28 */ be_nested_str_weak(aggregator), - /* K29 */ be_nested_str_weak(publish_result), - /* K30 */ be_nested_str_weak(_X7B_X22Matter_X22_X3A_X7B_X22Initialized_X22_X3A1_X7D_X7D), - /* K31 */ be_nested_str_weak(Matter), + ( &(const bvalue[30]) { /* constants */ + /* K0 */ be_nested_str_weak(k2l_num), + /* K1 */ be_nested_str_weak(tasmota), + /* K2 */ be_nested_str_weak(log), + /* K3 */ be_nested_str_weak(MTR_X3A_X20Configuring_X20endpoints), + /* K4 */ be_const_int(2), + /* K5 */ be_nested_str_weak(plugins), + /* K6 */ be_nested_str_weak(push), + /* K7 */ be_nested_str_weak(matter), + /* K8 */ be_nested_str_weak(Plugin_Root), + /* K9 */ be_const_int(0), + /* K10 */ be_nested_str_weak(MTR_X3A_X20_X20_X20endpoint_X20_X3D_X20_X255i_X20type_X3A_X25s_X25s), + /* K11 */ be_nested_str_weak(root), + /* K12 */ be_nested_str_weak(), + /* K13 */ be_nested_str_weak(Plugin_Aggregator), + /* K14 */ be_nested_str_weak(find), + /* K15 */ be_nested_str_weak(type), + /* K16 */ be_nested_str_weak(MTR_X3A_X20no_X20class_X20name_X2C_X20skipping), + /* K17 */ be_const_int(3), + /* K18 */ be_nested_str_weak(MTR_X3A_X20only_X20one_X20root_X20node_X20allowed), + /* K19 */ be_nested_str_weak(plugins_classes), + /* K20 */ be_nested_str_weak(MTR_X3A_X20unknown_X20class_X20name_X20_X27), + /* K21 */ be_nested_str_weak(_X27_X20skipping), + /* K22 */ be_nested_str_weak(conf_to_log), + /* K23 */ be_nested_str_weak(MTR_X3A_X20Exception), + /* K24 */ be_nested_str_weak(_X7C), + /* K25 */ be_nested_str_weak(stop_iteration), + /* K26 */ be_nested_str_weak(aggregator), + /* K27 */ be_nested_str_weak(publish_result), + /* K28 */ be_nested_str_weak(_X7B_X22Matter_X22_X3A_X7B_X22Initialized_X22_X3A1_X7D_X7D), + /* K29 */ be_nested_str_weak(Matter), }), be_str_weak(_instantiate_plugins_from_config), &be_const_str_solidified, - ( &(const binstruction[153]) { /* code */ - 0xA40A0000, // 0000 IMPORT R2 K0 - 0x8C0C0101, // 0001 GETMET R3 R0 K1 - 0x5C140200, // 0002 MOVE R5 R1 - 0x7C0C0400, // 0003 CALL R3 2 - 0xB8120400, // 0004 GETNGBL R4 K2 - 0x8C100903, // 0005 GETMET R4 R4 K3 + ( &(const binstruction[152]) { /* code */ + 0x8C080100, // 0000 GETMET R2 R0 K0 + 0x5C100200, // 0001 MOVE R4 R1 + 0x7C080400, // 0002 CALL R2 2 + 0xB80E0200, // 0003 GETNGBL R3 K1 + 0x8C0C0702, // 0004 GETMET R3 R3 K2 + 0x58140003, // 0005 LDCONST R5 K3 0x58180004, // 0006 LDCONST R6 K4 - 0x581C0005, // 0007 LDCONST R7 K5 - 0x7C100600, // 0008 CALL R4 3 - 0x88100106, // 0009 GETMBR R4 R0 K6 - 0x8C100907, // 000A GETMET R4 R4 K7 - 0xB81A1000, // 000B GETNGBL R6 K8 - 0x8C180D09, // 000C GETMET R6 R6 K9 - 0x5C200000, // 000D MOVE R8 R0 - 0x5824000A, // 000E LDCONST R9 K10 - 0x60280013, // 000F GETGBL R10 G19 - 0x7C280000, // 0010 CALL R10 0 - 0x7C180800, // 0011 CALL R6 4 - 0x7C100400, // 0012 CALL R4 2 - 0xB8120400, // 0013 GETNGBL R4 K2 - 0x8C100903, // 0014 GETMET R4 R4 K3 - 0x8C18050B, // 0015 GETMET R6 R2 K11 - 0x5820000C, // 0016 LDCONST R8 K12 - 0x5824000A, // 0017 LDCONST R9 K10 - 0x5828000D, // 0018 LDCONST R10 K13 - 0x582C000E, // 0019 LDCONST R11 K14 - 0x7C180A00, // 001A CALL R6 5 - 0x581C0005, // 001B LDCONST R7 K5 - 0x7C100600, // 001C CALL R4 3 - 0x88100106, // 001D GETMBR R4 R0 K6 - 0x8C100907, // 001E GETMET R4 R4 K7 - 0xB81A1000, // 001F GETNGBL R6 K8 - 0x8C180D0F, // 0020 GETMET R6 R6 K15 - 0x5C200000, // 0021 MOVE R8 R0 - 0x5426FEFF, // 0022 LDINT R9 65280 - 0x60280013, // 0023 GETGBL R10 G19 - 0x7C280000, // 0024 CALL R10 0 - 0x7C180800, // 0025 CALL R6 4 - 0x7C100400, // 0026 CALL R4 2 - 0x60100010, // 0027 GETGBL R4 G16 - 0x5C140600, // 0028 MOVE R5 R3 - 0x7C100200, // 0029 CALL R4 1 - 0xA802005A, // 002A EXBLK 0 #0086 - 0x5C140800, // 002B MOVE R5 R4 - 0x7C140000, // 002C CALL R5 0 - 0x1C180B0A, // 002D EQ R6 R5 K10 - 0x781A0000, // 002E JMPF R6 #0030 - 0x7001FFFA, // 002F JMP #002B - 0xA8020042, // 0030 EXBLK 0 #0074 - 0x60180008, // 0031 GETGBL R6 G8 - 0x5C1C0A00, // 0032 MOVE R7 R5 - 0x7C180200, // 0033 CALL R6 1 - 0x94180206, // 0034 GETIDX R6 R1 R6 - 0x8C1C0D10, // 0035 GETMET R7 R6 K16 - 0x58240011, // 0036 LDCONST R9 K17 - 0x7C1C0400, // 0037 CALL R7 2 - 0x4C200000, // 0038 LDNIL R8 - 0x1C200E08, // 0039 EQ R8 R7 R8 - 0x78220006, // 003A JMPF R8 #0042 - 0xB8220400, // 003B GETNGBL R8 K2 - 0x8C201103, // 003C GETMET R8 R8 K3 - 0x58280012, // 003D LDCONST R10 K18 - 0x582C0013, // 003E LDCONST R11 K19 - 0x7C200600, // 003F CALL R8 3 - 0xA8040001, // 0040 EXBLK 1 1 - 0x7001FFE8, // 0041 JMP #002B - 0x1C200F0D, // 0042 EQ R8 R7 K13 - 0x78220006, // 0043 JMPF R8 #004B - 0xB8220400, // 0044 GETNGBL R8 K2 - 0x8C201103, // 0045 GETMET R8 R8 K3 - 0x58280014, // 0046 LDCONST R10 K20 - 0x582C0013, // 0047 LDCONST R11 K19 - 0x7C200600, // 0048 CALL R8 3 - 0xA8040001, // 0049 EXBLK 1 1 - 0x7001FFDF, // 004A JMP #002B - 0x88200115, // 004B GETMBR R8 R0 K21 - 0x8C201110, // 004C GETMET R8 R8 K16 - 0x5C280E00, // 004D MOVE R10 R7 - 0x7C200400, // 004E CALL R8 2 - 0x4C240000, // 004F LDNIL R9 - 0x1C241009, // 0050 EQ R9 R8 R9 - 0x7826000A, // 0051 JMPF R9 #005D - 0xB8260400, // 0052 GETNGBL R9 K2 - 0x8C241303, // 0053 GETMET R9 R9 K3 - 0x602C0008, // 0054 GETGBL R11 G8 - 0x5C300E00, // 0055 MOVE R12 R7 - 0x7C2C0200, // 0056 CALL R11 1 - 0x002E2C0B, // 0057 ADD R11 K22 R11 - 0x002C1717, // 0058 ADD R11 R11 K23 - 0x58300005, // 0059 LDCONST R12 K5 - 0x7C240600, // 005A CALL R9 3 - 0xA8040001, // 005B EXBLK 1 1 - 0x7001FFCD, // 005C JMP #002B - 0x5C241000, // 005D MOVE R9 R8 - 0x5C280000, // 005E MOVE R10 R0 + 0x7C0C0600, // 0007 CALL R3 3 + 0x880C0105, // 0008 GETMBR R3 R0 K5 + 0x8C0C0706, // 0009 GETMET R3 R3 K6 + 0xB8160E00, // 000A GETNGBL R5 K7 + 0x8C140B08, // 000B GETMET R5 R5 K8 + 0x5C1C0000, // 000C MOVE R7 R0 + 0x58200009, // 000D LDCONST R8 K9 + 0x60240013, // 000E GETGBL R9 G19 + 0x7C240000, // 000F CALL R9 0 + 0x7C140800, // 0010 CALL R5 4 + 0x7C0C0400, // 0011 CALL R3 2 + 0xB80E0200, // 0012 GETNGBL R3 K1 + 0x8C0C0702, // 0013 GETMET R3 R3 K2 + 0x60140018, // 0014 GETGBL R5 G24 + 0x5818000A, // 0015 LDCONST R6 K10 + 0x581C0009, // 0016 LDCONST R7 K9 + 0x5820000B, // 0017 LDCONST R8 K11 + 0x5824000C, // 0018 LDCONST R9 K12 + 0x7C140800, // 0019 CALL R5 4 + 0x58180004, // 001A LDCONST R6 K4 + 0x7C0C0600, // 001B CALL R3 3 + 0x880C0105, // 001C GETMBR R3 R0 K5 + 0x8C0C0706, // 001D GETMET R3 R3 K6 + 0xB8160E00, // 001E GETNGBL R5 K7 + 0x8C140B0D, // 001F GETMET R5 R5 K13 + 0x5C1C0000, // 0020 MOVE R7 R0 + 0x5422FEFF, // 0021 LDINT R8 65280 + 0x60240013, // 0022 GETGBL R9 G19 + 0x7C240000, // 0023 CALL R9 0 + 0x7C140800, // 0024 CALL R5 4 + 0x7C0C0400, // 0025 CALL R3 2 + 0x600C0010, // 0026 GETGBL R3 G16 + 0x5C100400, // 0027 MOVE R4 R2 + 0x7C0C0200, // 0028 CALL R3 1 + 0xA802005A, // 0029 EXBLK 0 #0085 + 0x5C100600, // 002A MOVE R4 R3 + 0x7C100000, // 002B CALL R4 0 + 0x1C140909, // 002C EQ R5 R4 K9 + 0x78160000, // 002D JMPF R5 #002F + 0x7001FFFA, // 002E JMP #002A + 0xA8020042, // 002F EXBLK 0 #0073 + 0x60140008, // 0030 GETGBL R5 G8 + 0x5C180800, // 0031 MOVE R6 R4 + 0x7C140200, // 0032 CALL R5 1 + 0x94140205, // 0033 GETIDX R5 R1 R5 + 0x8C180B0E, // 0034 GETMET R6 R5 K14 + 0x5820000F, // 0035 LDCONST R8 K15 + 0x7C180400, // 0036 CALL R6 2 + 0x4C1C0000, // 0037 LDNIL R7 + 0x1C1C0C07, // 0038 EQ R7 R6 R7 + 0x781E0006, // 0039 JMPF R7 #0041 + 0xB81E0200, // 003A GETNGBL R7 K1 + 0x8C1C0F02, // 003B GETMET R7 R7 K2 + 0x58240010, // 003C LDCONST R9 K16 + 0x58280011, // 003D LDCONST R10 K17 + 0x7C1C0600, // 003E CALL R7 3 + 0xA8040001, // 003F EXBLK 1 1 + 0x7001FFE8, // 0040 JMP #002A + 0x1C1C0D0B, // 0041 EQ R7 R6 K11 + 0x781E0006, // 0042 JMPF R7 #004A + 0xB81E0200, // 0043 GETNGBL R7 K1 + 0x8C1C0F02, // 0044 GETMET R7 R7 K2 + 0x58240012, // 0045 LDCONST R9 K18 + 0x58280011, // 0046 LDCONST R10 K17 + 0x7C1C0600, // 0047 CALL R7 3 + 0xA8040001, // 0048 EXBLK 1 1 + 0x7001FFDF, // 0049 JMP #002A + 0x881C0113, // 004A GETMBR R7 R0 K19 + 0x8C1C0F0E, // 004B GETMET R7 R7 K14 + 0x5C240C00, // 004C MOVE R9 R6 + 0x7C1C0400, // 004D CALL R7 2 + 0x4C200000, // 004E LDNIL R8 + 0x1C200E08, // 004F EQ R8 R7 R8 + 0x7822000A, // 0050 JMPF R8 #005C + 0xB8220200, // 0051 GETNGBL R8 K1 + 0x8C201102, // 0052 GETMET R8 R8 K2 + 0x60280008, // 0053 GETGBL R10 G8 + 0x5C2C0C00, // 0054 MOVE R11 R6 + 0x7C280200, // 0055 CALL R10 1 + 0x002A280A, // 0056 ADD R10 K20 R10 + 0x00281515, // 0057 ADD R10 R10 K21 + 0x582C0004, // 0058 LDCONST R11 K4 + 0x7C200600, // 0059 CALL R8 3 + 0xA8040001, // 005A EXBLK 1 1 + 0x7001FFCD, // 005B JMP #002A + 0x5C200E00, // 005C MOVE R8 R7 + 0x5C240000, // 005D MOVE R9 R0 + 0x5C280800, // 005E MOVE R10 R4 0x5C2C0A00, // 005F MOVE R11 R5 - 0x5C300C00, // 0060 MOVE R12 R6 - 0x7C240600, // 0061 CALL R9 3 - 0x88280106, // 0062 GETMBR R10 R0 K6 - 0x8C281507, // 0063 GETMET R10 R10 K7 - 0x5C301200, // 0064 MOVE R12 R9 - 0x7C280400, // 0065 CALL R10 2 - 0xB82A0400, // 0066 GETNGBL R10 K2 - 0x8C281503, // 0067 GETMET R10 R10 K3 - 0x8C30050B, // 0068 GETMET R12 R2 K11 - 0x5838000C, // 0069 LDCONST R14 K12 - 0x5C3C0A00, // 006A MOVE R15 R5 - 0x5C400E00, // 006B MOVE R16 R7 - 0x8C440118, // 006C GETMET R17 R0 K24 - 0x5C4C0C00, // 006D MOVE R19 R6 - 0x7C440400, // 006E CALL R17 2 - 0x7C300A00, // 006F CALL R12 5 - 0x58340005, // 0070 LDCONST R13 K5 - 0x7C280600, // 0071 CALL R10 3 - 0xA8040001, // 0072 EXBLK 1 1 - 0x70020010, // 0073 JMP #0085 - 0xAC180002, // 0074 CATCH R6 0 2 - 0x7002000D, // 0075 JMP #0084 - 0xB8220400, // 0076 GETNGBL R8 K2 - 0x8C201103, // 0077 GETMET R8 R8 K3 - 0x60280008, // 0078 GETGBL R10 G8 - 0x5C2C0C00, // 0079 MOVE R11 R6 - 0x7C280200, // 007A CALL R10 1 - 0x002A320A, // 007B ADD R10 K25 R10 - 0x0028151A, // 007C ADD R10 R10 K26 - 0x602C0008, // 007D GETGBL R11 G8 - 0x5C300E00, // 007E MOVE R12 R7 - 0x7C2C0200, // 007F CALL R11 1 - 0x0028140B, // 0080 ADD R10 R10 R11 - 0x582C0005, // 0081 LDCONST R11 K5 - 0x7C200600, // 0082 CALL R8 3 - 0x70020000, // 0083 JMP #0085 - 0xB0080000, // 0084 RAISE 2 R0 R0 - 0x7001FFA4, // 0085 JMP #002B - 0x5810001B, // 0086 LDCONST R4 K27 - 0xAC100200, // 0087 CATCH R4 1 0 - 0xB0080000, // 0088 RAISE 2 R0 R0 - 0xB8120400, // 0089 GETNGBL R4 K2 - 0x8C100903, // 008A GETMET R4 R4 K3 - 0x8C18050B, // 008B GETMET R6 R2 K11 - 0x5820000C, // 008C LDCONST R8 K12 - 0x5426FEFF, // 008D LDINT R9 65280 - 0x5828001C, // 008E LDCONST R10 K28 - 0x582C000E, // 008F LDCONST R11 K14 - 0x7C180A00, // 0090 CALL R6 5 - 0x581C0005, // 0091 LDCONST R7 K5 - 0x7C100600, // 0092 CALL R4 3 - 0xB8120400, // 0093 GETNGBL R4 K2 - 0x8C10091D, // 0094 GETMET R4 R4 K29 - 0x5818001E, // 0095 LDCONST R6 K30 - 0x581C001F, // 0096 LDCONST R7 K31 - 0x7C100600, // 0097 CALL R4 3 - 0x80000000, // 0098 RET 0 + 0x7C200600, // 0060 CALL R8 3 + 0x88240105, // 0061 GETMBR R9 R0 K5 + 0x8C241306, // 0062 GETMET R9 R9 K6 + 0x5C2C1000, // 0063 MOVE R11 R8 + 0x7C240400, // 0064 CALL R9 2 + 0xB8260200, // 0065 GETNGBL R9 K1 + 0x8C241302, // 0066 GETMET R9 R9 K2 + 0x602C0018, // 0067 GETGBL R11 G24 + 0x5830000A, // 0068 LDCONST R12 K10 + 0x5C340800, // 0069 MOVE R13 R4 + 0x5C380C00, // 006A MOVE R14 R6 + 0x8C3C0116, // 006B GETMET R15 R0 K22 + 0x5C440A00, // 006C MOVE R17 R5 + 0x7C3C0400, // 006D CALL R15 2 + 0x7C2C0800, // 006E CALL R11 4 + 0x58300004, // 006F LDCONST R12 K4 + 0x7C240600, // 0070 CALL R9 3 + 0xA8040001, // 0071 EXBLK 1 1 + 0x70020010, // 0072 JMP #0084 + 0xAC140002, // 0073 CATCH R5 0 2 + 0x7002000D, // 0074 JMP #0083 + 0xB81E0200, // 0075 GETNGBL R7 K1 + 0x8C1C0F02, // 0076 GETMET R7 R7 K2 + 0x60240008, // 0077 GETGBL R9 G8 + 0x5C280A00, // 0078 MOVE R10 R5 + 0x7C240200, // 0079 CALL R9 1 + 0x00262E09, // 007A ADD R9 K23 R9 + 0x00241318, // 007B ADD R9 R9 K24 + 0x60280008, // 007C GETGBL R10 G8 + 0x5C2C0C00, // 007D MOVE R11 R6 + 0x7C280200, // 007E CALL R10 1 + 0x0024120A, // 007F ADD R9 R9 R10 + 0x58280004, // 0080 LDCONST R10 K4 + 0x7C1C0600, // 0081 CALL R7 3 + 0x70020000, // 0082 JMP #0084 + 0xB0080000, // 0083 RAISE 2 R0 R0 + 0x7001FFA4, // 0084 JMP #002A + 0x580C0019, // 0085 LDCONST R3 K25 + 0xAC0C0200, // 0086 CATCH R3 1 0 + 0xB0080000, // 0087 RAISE 2 R0 R0 + 0xB80E0200, // 0088 GETNGBL R3 K1 + 0x8C0C0702, // 0089 GETMET R3 R3 K2 + 0x60140018, // 008A GETGBL R5 G24 + 0x5818000A, // 008B LDCONST R6 K10 + 0x541EFEFF, // 008C LDINT R7 65280 + 0x5820001A, // 008D LDCONST R8 K26 + 0x5824000C, // 008E LDCONST R9 K12 + 0x7C140800, // 008F CALL R5 4 + 0x58180004, // 0090 LDCONST R6 K4 + 0x7C0C0600, // 0091 CALL R3 3 + 0xB80E0200, // 0092 GETNGBL R3 K1 + 0x8C0C071B, // 0093 GETMET R3 R3 K27 + 0x5814001C, // 0094 LDCONST R5 K28 + 0x5818001D, // 0095 LDCONST R6 K29 + 0x7C0C0600, // 0096 CALL R3 3 + 0x80000000, // 0097 RET 0 }) ) ); @@ -2166,7 +2143,7 @@ be_local_closure(Matter_Device_is_root_commissioning_open, /* name */ ********************************************************************/ be_local_closure(Matter_Device_start_root_basic_commissioning, /* name */ be_nested_proto( - 14, /* nstack */ + 13, /* nstack */ 2, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -2174,72 +2151,69 @@ be_local_closure(Matter_Device_start_root_basic_commissioning, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[20]) { /* constants */ - /* K0 */ be_nested_str_weak(string), - /* K1 */ be_nested_str_weak(PASE_TIMEOUT), - /* K2 */ be_nested_str_weak(compute_manual_pairing_code), - /* K3 */ be_nested_str_weak(tasmota), - /* K4 */ be_nested_str_weak(log), - /* K5 */ be_nested_str_weak(format), - /* K6 */ be_nested_str_weak(MTR_X3A_X20Manual_X20pairing_X20code_X3A_X20_X25s), - /* K7 */ be_const_int(2), - /* K8 */ be_nested_str_weak(compute_qrcode_content), - /* K9 */ be_nested_str_weak(publish_result), - /* K10 */ be_nested_str_weak(_X7B_X22Matter_X22_X3A_X7B_X22Commissioning_X22_X3A1_X2C_X22PairingCode_X22_X3A_X22_X25s_X22_X2C_X22QRCode_X22_X3A_X22_X25s_X22_X7D_X7D), - /* K11 */ be_nested_str_weak(Matter), - /* K12 */ be_nested_str_weak(_compute_pbkdf), - /* K13 */ be_nested_str_weak(root_passcode), - /* K14 */ be_nested_str_weak(root_iterations), - /* K15 */ be_nested_str_weak(root_salt), - /* K16 */ be_nested_str_weak(start_basic_commissioning), - /* K17 */ be_nested_str_weak(root_discriminator), - /* K18 */ be_nested_str_weak(root_w0), - /* K19 */ be_nested_str_weak(root_L), + ( &(const bvalue[18]) { /* constants */ + /* K0 */ be_nested_str_weak(PASE_TIMEOUT), + /* K1 */ be_nested_str_weak(compute_manual_pairing_code), + /* K2 */ be_nested_str_weak(tasmota), + /* K3 */ be_nested_str_weak(log), + /* K4 */ be_nested_str_weak(MTR_X3A_X20Manual_X20pairing_X20code_X3A_X20_X25s), + /* K5 */ be_const_int(2), + /* K6 */ be_nested_str_weak(compute_qrcode_content), + /* K7 */ be_nested_str_weak(publish_result), + /* K8 */ be_nested_str_weak(_X7B_X22Matter_X22_X3A_X7B_X22Commissioning_X22_X3A1_X2C_X22PairingCode_X22_X3A_X22_X25s_X22_X2C_X22QRCode_X22_X3A_X22_X25s_X22_X7D_X7D), + /* K9 */ be_nested_str_weak(Matter), + /* K10 */ be_nested_str_weak(_compute_pbkdf), + /* K11 */ be_nested_str_weak(root_passcode), + /* K12 */ be_nested_str_weak(root_iterations), + /* K13 */ be_nested_str_weak(root_salt), + /* K14 */ be_nested_str_weak(start_basic_commissioning), + /* K15 */ be_nested_str_weak(root_discriminator), + /* K16 */ be_nested_str_weak(root_w0), + /* K17 */ be_nested_str_weak(root_L), }), be_str_weak(start_root_basic_commissioning), &be_const_str_solidified, - ( &(const binstruction[41]) { /* code */ - 0xA40A0000, // 0000 IMPORT R2 K0 - 0x4C0C0000, // 0001 LDNIL R3 - 0x1C0C0203, // 0002 EQ R3 R1 R3 - 0x780E0000, // 0003 JMPF R3 #0005 - 0x88040101, // 0004 GETMBR R1 R0 K1 - 0x8C0C0102, // 0005 GETMET R3 R0 K2 - 0x7C0C0200, // 0006 CALL R3 1 - 0xB8120600, // 0007 GETNGBL R4 K3 - 0x8C100904, // 0008 GETMET R4 R4 K4 - 0x8C180505, // 0009 GETMET R6 R2 K5 - 0x58200006, // 000A LDCONST R8 K6 - 0x5C240600, // 000B MOVE R9 R3 - 0x7C180600, // 000C CALL R6 3 - 0x581C0007, // 000D LDCONST R7 K7 - 0x7C100600, // 000E CALL R4 3 - 0x8C100108, // 000F GETMET R4 R0 K8 - 0x7C100200, // 0010 CALL R4 1 - 0xB8160600, // 0011 GETNGBL R5 K3 - 0x8C140B09, // 0012 GETMET R5 R5 K9 - 0x8C1C0505, // 0013 GETMET R7 R2 K5 - 0x5824000A, // 0014 LDCONST R9 K10 - 0x5C280600, // 0015 MOVE R10 R3 - 0x5C2C0800, // 0016 MOVE R11 R4 - 0x7C1C0800, // 0017 CALL R7 4 - 0x5820000B, // 0018 LDCONST R8 K11 - 0x7C140600, // 0019 CALL R5 3 - 0x8C14010C, // 001A GETMET R5 R0 K12 - 0x881C010D, // 001B GETMBR R7 R0 K13 - 0x8820010E, // 001C GETMBR R8 R0 K14 - 0x8824010F, // 001D GETMBR R9 R0 K15 - 0x7C140800, // 001E CALL R5 4 - 0x8C140110, // 001F GETMET R5 R0 K16 - 0x5C1C0200, // 0020 MOVE R7 R1 - 0x8820010E, // 0021 GETMBR R8 R0 K14 - 0x88240111, // 0022 GETMBR R9 R0 K17 - 0x8828010F, // 0023 GETMBR R10 R0 K15 - 0x882C0112, // 0024 GETMBR R11 R0 K18 - 0x88300113, // 0025 GETMBR R12 R0 K19 - 0x4C340000, // 0026 LDNIL R13 - 0x7C141000, // 0027 CALL R5 8 - 0x80000000, // 0028 RET 0 + ( &(const binstruction[40]) { /* code */ + 0x4C080000, // 0000 LDNIL R2 + 0x1C080202, // 0001 EQ R2 R1 R2 + 0x780A0000, // 0002 JMPF R2 #0004 + 0x88040100, // 0003 GETMBR R1 R0 K0 + 0x8C080101, // 0004 GETMET R2 R0 K1 + 0x7C080200, // 0005 CALL R2 1 + 0xB80E0400, // 0006 GETNGBL R3 K2 + 0x8C0C0703, // 0007 GETMET R3 R3 K3 + 0x60140018, // 0008 GETGBL R5 G24 + 0x58180004, // 0009 LDCONST R6 K4 + 0x5C1C0400, // 000A MOVE R7 R2 + 0x7C140400, // 000B CALL R5 2 + 0x58180005, // 000C LDCONST R6 K5 + 0x7C0C0600, // 000D CALL R3 3 + 0x8C0C0106, // 000E GETMET R3 R0 K6 + 0x7C0C0200, // 000F CALL R3 1 + 0xB8120400, // 0010 GETNGBL R4 K2 + 0x8C100907, // 0011 GETMET R4 R4 K7 + 0x60180018, // 0012 GETGBL R6 G24 + 0x581C0008, // 0013 LDCONST R7 K8 + 0x5C200400, // 0014 MOVE R8 R2 + 0x5C240600, // 0015 MOVE R9 R3 + 0x7C180600, // 0016 CALL R6 3 + 0x581C0009, // 0017 LDCONST R7 K9 + 0x7C100600, // 0018 CALL R4 3 + 0x8C10010A, // 0019 GETMET R4 R0 K10 + 0x8818010B, // 001A GETMBR R6 R0 K11 + 0x881C010C, // 001B GETMBR R7 R0 K12 + 0x8820010D, // 001C GETMBR R8 R0 K13 + 0x7C100800, // 001D CALL R4 4 + 0x8C10010E, // 001E GETMET R4 R0 K14 + 0x5C180200, // 001F MOVE R6 R1 + 0x881C010C, // 0020 GETMBR R7 R0 K12 + 0x8820010F, // 0021 GETMBR R8 R0 K15 + 0x8824010D, // 0022 GETMBR R9 R0 K13 + 0x88280110, // 0023 GETMBR R10 R0 K16 + 0x882C0111, // 0024 GETMBR R11 R0 K17 + 0x4C300000, // 0025 LDNIL R12 + 0x7C101000, // 0026 CALL R4 8 + 0x80000000, // 0027 RET 0 }) ) ); @@ -2429,7 +2403,7 @@ be_local_closure(Matter_Device_start, /* name */ ********************************************************************/ be_local_closure(Matter_Device_conf_to_log, /* name */ be_nested_proto( - 11, /* nstack */ + 9, /* nstack */ 1, /* argc */ 4, /* varg */ 0, /* has upvals */ @@ -2437,44 +2411,41 @@ be_local_closure(Matter_Device_conf_to_log, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[ 8]) { /* constants */ + ( &(const bvalue[ 6]) { /* constants */ /* K0 */ be_const_class(be_class_Matter_Device), - /* K1 */ be_nested_str_weak(string), - /* K2 */ be_nested_str_weak(), - /* K3 */ be_nested_str_weak(k2l), - /* K4 */ be_nested_str_weak(type), - /* K5 */ be_nested_str_weak(format), - /* K6 */ be_nested_str_weak(_X20_X25s_X3A_X25s), - /* K7 */ be_nested_str_weak(stop_iteration), + /* K1 */ be_nested_str_weak(), + /* K2 */ be_nested_str_weak(k2l), + /* K3 */ be_nested_str_weak(type), + /* K4 */ be_nested_str_weak(_X20_X25s_X3A_X25s), + /* K5 */ be_nested_str_weak(stop_iteration), }), be_str_weak(conf_to_log), &be_const_str_solidified, - ( &(const binstruction[25]) { /* code */ + ( &(const binstruction[24]) { /* code */ 0x58040000, // 0000 LDCONST R1 K0 - 0xA40A0200, // 0001 IMPORT R2 K1 - 0x580C0002, // 0002 LDCONST R3 K2 - 0x60100010, // 0003 GETGBL R4 G16 - 0x8C140303, // 0004 GETMET R5 R1 K3 - 0x5C1C0000, // 0005 MOVE R7 R0 - 0x7C140400, // 0006 CALL R5 2 - 0x7C100200, // 0007 CALL R4 1 - 0xA802000B, // 0008 EXBLK 0 #0015 - 0x5C140800, // 0009 MOVE R5 R4 - 0x7C140000, // 000A CALL R5 0 - 0x1C180B04, // 000B EQ R6 R5 K4 - 0x781A0000, // 000C JMPF R6 #000E - 0x7001FFFA, // 000D JMP #0009 - 0x8C180505, // 000E GETMET R6 R2 K5 - 0x58200006, // 000F LDCONST R8 K6 - 0x5C240A00, // 0010 MOVE R9 R5 - 0x94280005, // 0011 GETIDX R10 R0 R5 - 0x7C180800, // 0012 CALL R6 4 - 0x000C0606, // 0013 ADD R3 R3 R6 - 0x7001FFF3, // 0014 JMP #0009 - 0x58100007, // 0015 LDCONST R4 K7 - 0xAC100200, // 0016 CATCH R4 1 0 - 0xB0080000, // 0017 RAISE 2 R0 R0 - 0x80040600, // 0018 RET 1 R3 + 0x58080001, // 0001 LDCONST R2 K1 + 0x600C0010, // 0002 GETGBL R3 G16 + 0x8C100302, // 0003 GETMET R4 R1 K2 + 0x5C180000, // 0004 MOVE R6 R0 + 0x7C100400, // 0005 CALL R4 2 + 0x7C0C0200, // 0006 CALL R3 1 + 0xA802000B, // 0007 EXBLK 0 #0014 + 0x5C100600, // 0008 MOVE R4 R3 + 0x7C100000, // 0009 CALL R4 0 + 0x1C140903, // 000A EQ R5 R4 K3 + 0x78160000, // 000B JMPF R5 #000D + 0x7001FFFA, // 000C JMP #0008 + 0x60140018, // 000D GETGBL R5 G24 + 0x58180004, // 000E LDCONST R6 K4 + 0x5C1C0800, // 000F MOVE R7 R4 + 0x94200004, // 0010 GETIDX R8 R0 R4 + 0x7C140600, // 0011 CALL R5 3 + 0x00080405, // 0012 ADD R2 R2 R5 + 0x7001FFF3, // 0013 JMP #0008 + 0x580C0005, // 0014 LDCONST R3 K5 + 0xAC0C0200, // 0015 CATCH R3 1 0 + 0xB0080000, // 0016 RAISE 2 R0 R0 + 0x80040400, // 0017 RET 1 R2 }) ) ); @@ -2573,7 +2544,7 @@ be_local_closure(Matter_Device__init_basic_commissioning, /* name */ ********************************************************************/ be_local_closure(Matter_Device_init, /* name */ be_nested_proto( - 8, /* nstack */ + 7, /* nstack */ 1, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -2646,157 +2617,155 @@ be_local_closure(Matter_Device_init, /* name */ ), }), 1, /* has constants */ - ( &(const bvalue[43]) { /* constants */ + ( &(const bvalue[42]) { /* constants */ /* K0 */ be_nested_str_weak(crypto), - /* K1 */ be_nested_str_weak(string), - /* K2 */ be_nested_str_weak(tasmota), - /* K3 */ be_nested_str_weak(get_option), - /* K4 */ be_nested_str_weak(matter), - /* K5 */ be_nested_str_weak(MATTER_OPTION), - /* K6 */ be_nested_str_weak(UI), - /* K7 */ be_nested_str_weak(started), - /* K8 */ be_nested_str_weak(tick), - /* K9 */ be_const_int(0), - /* K10 */ be_nested_str_weak(plugins), - /* K11 */ be_nested_str_weak(plugins_persist), - /* K12 */ be_nested_str_weak(plugins_classes), - /* K13 */ be_nested_str_weak(register_native_classes), - /* K14 */ be_nested_str_weak(vendorid), - /* K15 */ be_nested_str_weak(VENDOR_ID), - /* K16 */ be_nested_str_weak(productid), - /* K17 */ be_nested_str_weak(PRODUCT_ID), - /* K18 */ be_nested_str_weak(root_iterations), - /* K19 */ be_nested_str_weak(PBKDF_ITERATIONS), - /* K20 */ be_nested_str_weak(next_ep), - /* K21 */ be_const_int(1), - /* K22 */ be_nested_str_weak(root_salt), - /* K23 */ be_nested_str_weak(random), - /* K24 */ be_nested_str_weak(ipv4only), - /* K25 */ be_nested_str_weak(load_param), - /* K26 */ be_nested_str_weak(sessions), - /* K27 */ be_nested_str_weak(Session_Store), - /* K28 */ be_nested_str_weak(load_fabrics), - /* K29 */ be_nested_str_weak(message_handler), - /* K30 */ be_nested_str_weak(MessageHandler), - /* K31 */ be_nested_str_weak(ui), - /* K32 */ be_nested_str_weak(wifi), - /* K33 */ be_nested_str_weak(up), - /* K34 */ be_nested_str_weak(eth), - /* K35 */ be_nested_str_weak(start), - /* K36 */ be_nested_str_weak(add_rule), - /* K37 */ be_nested_str_weak(Wifi_X23Connected), - /* K38 */ be_nested_str_weak(matter_start), - /* K39 */ be_nested_str_weak(Eth_X23Connected), - /* K40 */ be_nested_str_weak(_init_basic_commissioning), - /* K41 */ be_nested_str_weak(add_driver), - /* K42 */ be_nested_str_weak(register_commands), + /* K1 */ be_nested_str_weak(tasmota), + /* K2 */ be_nested_str_weak(get_option), + /* K3 */ be_nested_str_weak(matter), + /* K4 */ be_nested_str_weak(MATTER_OPTION), + /* K5 */ be_nested_str_weak(UI), + /* K6 */ be_nested_str_weak(started), + /* K7 */ be_nested_str_weak(tick), + /* K8 */ be_const_int(0), + /* K9 */ be_nested_str_weak(plugins), + /* K10 */ be_nested_str_weak(plugins_persist), + /* K11 */ be_nested_str_weak(plugins_classes), + /* K12 */ be_nested_str_weak(register_native_classes), + /* K13 */ be_nested_str_weak(vendorid), + /* K14 */ be_nested_str_weak(VENDOR_ID), + /* K15 */ be_nested_str_weak(productid), + /* K16 */ be_nested_str_weak(PRODUCT_ID), + /* K17 */ be_nested_str_weak(root_iterations), + /* K18 */ be_nested_str_weak(PBKDF_ITERATIONS), + /* K19 */ be_nested_str_weak(next_ep), + /* K20 */ be_const_int(1), + /* K21 */ be_nested_str_weak(root_salt), + /* K22 */ be_nested_str_weak(random), + /* K23 */ be_nested_str_weak(ipv4only), + /* K24 */ be_nested_str_weak(load_param), + /* K25 */ be_nested_str_weak(sessions), + /* K26 */ be_nested_str_weak(Session_Store), + /* K27 */ be_nested_str_weak(load_fabrics), + /* K28 */ be_nested_str_weak(message_handler), + /* K29 */ be_nested_str_weak(MessageHandler), + /* K30 */ be_nested_str_weak(ui), + /* K31 */ be_nested_str_weak(wifi), + /* K32 */ be_nested_str_weak(up), + /* K33 */ be_nested_str_weak(eth), + /* K34 */ be_nested_str_weak(start), + /* K35 */ be_nested_str_weak(add_rule), + /* K36 */ be_nested_str_weak(Wifi_X23Connected), + /* K37 */ be_nested_str_weak(matter_start), + /* K38 */ be_nested_str_weak(Eth_X23Connected), + /* K39 */ be_nested_str_weak(_init_basic_commissioning), + /* K40 */ be_nested_str_weak(add_driver), + /* K41 */ be_nested_str_weak(register_commands), }), be_str_weak(init), &be_const_str_solidified, - ( &(const binstruction[103]) { /* code */ + ( &(const binstruction[102]) { /* code */ 0xA4060000, // 0000 IMPORT R1 K0 - 0xA40A0200, // 0001 IMPORT R2 K1 - 0xB80E0400, // 0002 GETNGBL R3 K2 - 0x8C0C0703, // 0003 GETMET R3 R3 K3 - 0xB8160800, // 0004 GETNGBL R5 K4 - 0x88140B05, // 0005 GETMBR R5 R5 K5 - 0x7C0C0400, // 0006 CALL R3 2 - 0x740E0004, // 0007 JMPT R3 #000D - 0xB80E0800, // 0008 GETNGBL R3 K4 - 0x8C0C0706, // 0009 GETMET R3 R3 K6 - 0x5C140000, // 000A MOVE R5 R0 - 0x7C0C0400, // 000B CALL R3 2 - 0x80000600, // 000C RET 0 - 0x500C0000, // 000D LDBOOL R3 0 0 - 0x90020E03, // 000E SETMBR R0 K7 R3 - 0x90021109, // 000F SETMBR R0 K8 K9 - 0x600C0012, // 0010 GETGBL R3 G18 - 0x7C0C0000, // 0011 CALL R3 0 - 0x90021403, // 0012 SETMBR R0 K10 R3 - 0x500C0000, // 0013 LDBOOL R3 0 0 - 0x90021603, // 0014 SETMBR R0 K11 R3 - 0x600C0013, // 0015 GETGBL R3 G19 - 0x7C0C0000, // 0016 CALL R3 0 - 0x90021803, // 0017 SETMBR R0 K12 R3 - 0x8C0C010D, // 0018 GETMET R3 R0 K13 - 0x7C0C0200, // 0019 CALL R3 1 - 0x880C010F, // 001A GETMBR R3 R0 K15 - 0x90021C03, // 001B SETMBR R0 K14 R3 - 0x880C0111, // 001C GETMBR R3 R0 K17 - 0x90022003, // 001D SETMBR R0 K16 R3 - 0x880C0113, // 001E GETMBR R3 R0 K19 - 0x90022403, // 001F SETMBR R0 K18 R3 - 0x90022915, // 0020 SETMBR R0 K20 K21 - 0x8C0C0317, // 0021 GETMET R3 R1 K23 - 0x5416000F, // 0022 LDINT R5 16 - 0x7C0C0400, // 0023 CALL R3 2 - 0x90022C03, // 0024 SETMBR R0 K22 R3 - 0x500C0000, // 0025 LDBOOL R3 0 0 - 0x90023003, // 0026 SETMBR R0 K24 R3 - 0x8C0C0119, // 0027 GETMET R3 R0 K25 - 0x7C0C0200, // 0028 CALL R3 1 - 0xB80E0800, // 0029 GETNGBL R3 K4 - 0x8C0C071B, // 002A GETMET R3 R3 K27 - 0x5C140000, // 002B MOVE R5 R0 - 0x7C0C0400, // 002C CALL R3 2 - 0x90023403, // 002D SETMBR R0 K26 R3 - 0x880C011A, // 002E GETMBR R3 R0 K26 - 0x8C0C071C, // 002F GETMET R3 R3 K28 - 0x7C0C0200, // 0030 CALL R3 1 - 0xB80E0800, // 0031 GETNGBL R3 K4 - 0x8C0C071E, // 0032 GETMET R3 R3 K30 - 0x5C140000, // 0033 MOVE R5 R0 - 0x7C0C0400, // 0034 CALL R3 2 - 0x90023A03, // 0035 SETMBR R0 K29 R3 - 0xB80E0800, // 0036 GETNGBL R3 K4 - 0x8C0C0706, // 0037 GETMET R3 R3 K6 - 0x5C140000, // 0038 MOVE R5 R0 - 0x7C0C0400, // 0039 CALL R3 2 - 0x90023E03, // 003A SETMBR R0 K31 R3 - 0xB80E0400, // 003B GETNGBL R3 K2 - 0x8C0C0720, // 003C GETMET R3 R3 K32 - 0x7C0C0200, // 003D CALL R3 1 - 0x940C0721, // 003E GETIDX R3 R3 K33 - 0x740E0004, // 003F JMPT R3 #0045 - 0xB80E0400, // 0040 GETNGBL R3 K2 - 0x8C0C0722, // 0041 GETMET R3 R3 K34 - 0x7C0C0200, // 0042 CALL R3 1 - 0x940C0721, // 0043 GETIDX R3 R3 K33 - 0x780E0001, // 0044 JMPF R3 #0047 - 0x8C0C0123, // 0045 GETMET R3 R0 K35 - 0x7C0C0200, // 0046 CALL R3 1 - 0xB80E0400, // 0047 GETNGBL R3 K2 - 0x8C0C0720, // 0048 GETMET R3 R3 K32 - 0x7C0C0200, // 0049 CALL R3 1 - 0x940C0721, // 004A GETIDX R3 R3 K33 - 0x740E0005, // 004B JMPT R3 #0052 - 0xB80E0400, // 004C GETNGBL R3 K2 - 0x8C0C0724, // 004D GETMET R3 R3 K36 - 0x58140025, // 004E LDCONST R5 K37 - 0x84180000, // 004F CLOSURE R6 P0 - 0x581C0026, // 0050 LDCONST R7 K38 - 0x7C0C0800, // 0051 CALL R3 4 - 0xB80E0400, // 0052 GETNGBL R3 K2 - 0x8C0C0722, // 0053 GETMET R3 R3 K34 - 0x7C0C0200, // 0054 CALL R3 1 - 0x940C0721, // 0055 GETIDX R3 R3 K33 - 0x740E0005, // 0056 JMPT R3 #005D - 0xB80E0400, // 0057 GETNGBL R3 K2 - 0x8C0C0724, // 0058 GETMET R3 R3 K36 - 0x58140027, // 0059 LDCONST R5 K39 - 0x84180001, // 005A CLOSURE R6 P1 - 0x581C0026, // 005B LDCONST R7 K38 - 0x7C0C0800, // 005C CALL R3 4 - 0x8C0C0128, // 005D GETMET R3 R0 K40 - 0x7C0C0200, // 005E CALL R3 1 - 0xB80E0400, // 005F GETNGBL R3 K2 - 0x8C0C0729, // 0060 GETMET R3 R3 K41 - 0x5C140000, // 0061 MOVE R5 R0 - 0x7C0C0400, // 0062 CALL R3 2 - 0x8C0C012A, // 0063 GETMET R3 R0 K42 - 0x7C0C0200, // 0064 CALL R3 1 - 0xA0000000, // 0065 CLOSE R0 - 0x80000000, // 0066 RET 0 + 0xB80A0200, // 0001 GETNGBL R2 K1 + 0x8C080502, // 0002 GETMET R2 R2 K2 + 0xB8120600, // 0003 GETNGBL R4 K3 + 0x88100904, // 0004 GETMBR R4 R4 K4 + 0x7C080400, // 0005 CALL R2 2 + 0x740A0004, // 0006 JMPT R2 #000C + 0xB80A0600, // 0007 GETNGBL R2 K3 + 0x8C080505, // 0008 GETMET R2 R2 K5 + 0x5C100000, // 0009 MOVE R4 R0 + 0x7C080400, // 000A CALL R2 2 + 0x80000400, // 000B RET 0 + 0x50080000, // 000C LDBOOL R2 0 0 + 0x90020C02, // 000D SETMBR R0 K6 R2 + 0x90020F08, // 000E SETMBR R0 K7 K8 + 0x60080012, // 000F GETGBL R2 G18 + 0x7C080000, // 0010 CALL R2 0 + 0x90021202, // 0011 SETMBR R0 K9 R2 + 0x50080000, // 0012 LDBOOL R2 0 0 + 0x90021402, // 0013 SETMBR R0 K10 R2 + 0x60080013, // 0014 GETGBL R2 G19 + 0x7C080000, // 0015 CALL R2 0 + 0x90021602, // 0016 SETMBR R0 K11 R2 + 0x8C08010C, // 0017 GETMET R2 R0 K12 + 0x7C080200, // 0018 CALL R2 1 + 0x8808010E, // 0019 GETMBR R2 R0 K14 + 0x90021A02, // 001A SETMBR R0 K13 R2 + 0x88080110, // 001B GETMBR R2 R0 K16 + 0x90021E02, // 001C SETMBR R0 K15 R2 + 0x88080112, // 001D GETMBR R2 R0 K18 + 0x90022202, // 001E SETMBR R0 K17 R2 + 0x90022714, // 001F SETMBR R0 K19 K20 + 0x8C080316, // 0020 GETMET R2 R1 K22 + 0x5412000F, // 0021 LDINT R4 16 + 0x7C080400, // 0022 CALL R2 2 + 0x90022A02, // 0023 SETMBR R0 K21 R2 + 0x50080000, // 0024 LDBOOL R2 0 0 + 0x90022E02, // 0025 SETMBR R0 K23 R2 + 0x8C080118, // 0026 GETMET R2 R0 K24 + 0x7C080200, // 0027 CALL R2 1 + 0xB80A0600, // 0028 GETNGBL R2 K3 + 0x8C08051A, // 0029 GETMET R2 R2 K26 + 0x5C100000, // 002A MOVE R4 R0 + 0x7C080400, // 002B CALL R2 2 + 0x90023202, // 002C SETMBR R0 K25 R2 + 0x88080119, // 002D GETMBR R2 R0 K25 + 0x8C08051B, // 002E GETMET R2 R2 K27 + 0x7C080200, // 002F CALL R2 1 + 0xB80A0600, // 0030 GETNGBL R2 K3 + 0x8C08051D, // 0031 GETMET R2 R2 K29 + 0x5C100000, // 0032 MOVE R4 R0 + 0x7C080400, // 0033 CALL R2 2 + 0x90023802, // 0034 SETMBR R0 K28 R2 + 0xB80A0600, // 0035 GETNGBL R2 K3 + 0x8C080505, // 0036 GETMET R2 R2 K5 + 0x5C100000, // 0037 MOVE R4 R0 + 0x7C080400, // 0038 CALL R2 2 + 0x90023C02, // 0039 SETMBR R0 K30 R2 + 0xB80A0200, // 003A GETNGBL R2 K1 + 0x8C08051F, // 003B GETMET R2 R2 K31 + 0x7C080200, // 003C CALL R2 1 + 0x94080520, // 003D GETIDX R2 R2 K32 + 0x740A0004, // 003E JMPT R2 #0044 + 0xB80A0200, // 003F GETNGBL R2 K1 + 0x8C080521, // 0040 GETMET R2 R2 K33 + 0x7C080200, // 0041 CALL R2 1 + 0x94080520, // 0042 GETIDX R2 R2 K32 + 0x780A0001, // 0043 JMPF R2 #0046 + 0x8C080122, // 0044 GETMET R2 R0 K34 + 0x7C080200, // 0045 CALL R2 1 + 0xB80A0200, // 0046 GETNGBL R2 K1 + 0x8C08051F, // 0047 GETMET R2 R2 K31 + 0x7C080200, // 0048 CALL R2 1 + 0x94080520, // 0049 GETIDX R2 R2 K32 + 0x740A0005, // 004A JMPT R2 #0051 + 0xB80A0200, // 004B GETNGBL R2 K1 + 0x8C080523, // 004C GETMET R2 R2 K35 + 0x58100024, // 004D LDCONST R4 K36 + 0x84140000, // 004E CLOSURE R5 P0 + 0x58180025, // 004F LDCONST R6 K37 + 0x7C080800, // 0050 CALL R2 4 + 0xB80A0200, // 0051 GETNGBL R2 K1 + 0x8C080521, // 0052 GETMET R2 R2 K33 + 0x7C080200, // 0053 CALL R2 1 + 0x94080520, // 0054 GETIDX R2 R2 K32 + 0x740A0005, // 0055 JMPT R2 #005C + 0xB80A0200, // 0056 GETNGBL R2 K1 + 0x8C080523, // 0057 GETMET R2 R2 K35 + 0x58100026, // 0058 LDCONST R4 K38 + 0x84140001, // 0059 CLOSURE R5 P1 + 0x58180025, // 005A LDCONST R6 K37 + 0x7C080800, // 005B CALL R2 4 + 0x8C080127, // 005C GETMET R2 R0 K39 + 0x7C080200, // 005D CALL R2 1 + 0xB80A0200, // 005E GETNGBL R2 K1 + 0x8C080528, // 005F GETMET R2 R2 K40 + 0x5C100000, // 0060 MOVE R4 R0 + 0x7C080400, // 0061 CALL R2 2 + 0x8C080129, // 0062 GETMET R2 R0 K41 + 0x7C080200, // 0063 CALL R2 1 + 0xA0000000, // 0064 CLOSE R0 + 0x80000000, // 0065 RET 0 }) ) ); @@ -2975,7 +2944,7 @@ be_local_closure(Matter_Device_get_plugin_class_displayname, /* name */ ********************************************************************/ be_local_closure(Matter_Device_mdns_announce_op_discovery, /* name */ be_nested_proto( - 15, /* nstack */ + 14, /* nstack */ 2, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -2983,162 +2952,159 @@ be_local_closure(Matter_Device_mdns_announce_op_discovery, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[29]) { /* constants */ + ( &(const bvalue[27]) { /* constants */ /* K0 */ be_nested_str_weak(mdns), - /* K1 */ be_nested_str_weak(string), - /* K2 */ be_nested_str_weak(get_device_id), - /* K3 */ be_nested_str_weak(copy), - /* K4 */ be_nested_str_weak(reverse), - /* K5 */ be_nested_str_weak(get_fabric_compressed), - /* K6 */ be_nested_str_weak(tohex), - /* K7 */ be_nested_str_weak(_X2D), - /* K8 */ be_nested_str_weak(tasmota), - /* K9 */ be_nested_str_weak(log), - /* K10 */ be_nested_str_weak(MTR_X3A_X20Operational_X20Discovery_X20node_X20_X3D_X20), - /* K11 */ be_const_int(3), - /* K12 */ be_nested_str_weak(eth), - /* K13 */ be_nested_str_weak(find), - /* K14 */ be_nested_str_weak(up), - /* K15 */ be_nested_str_weak(format), - /* K16 */ be_nested_str_weak(MTR_X3A_X20adding_X20mDNS_X20on_X20_X25s_X20_X27_X25s_X27_X20ptr_X20to_X20_X60_X25s_X2Elocal_X60), - /* K17 */ be_nested_str_weak(hostname_eth), - /* K18 */ be_nested_str_weak(add_service), - /* K19 */ be_nested_str_weak(_matter), - /* K20 */ be_nested_str_weak(_tcp), - /* K21 */ be_nested_str_weak(_I), - /* K22 */ be_nested_str_weak(MTR_X3A_X20adding_X20subtype_X3A_X20), - /* K23 */ be_nested_str_weak(add_subtype), - /* K24 */ be_nested_str_weak(wifi), - /* K25 */ be_nested_str_weak(hostname_wifi), - /* K26 */ be_nested_str_weak(MTR_X3A_X20Exception), - /* K27 */ be_nested_str_weak(_X7C), - /* K28 */ be_const_int(2), + /* K1 */ be_nested_str_weak(get_device_id), + /* K2 */ be_nested_str_weak(copy), + /* K3 */ be_nested_str_weak(reverse), + /* K4 */ be_nested_str_weak(get_fabric_compressed), + /* K5 */ be_nested_str_weak(tohex), + /* K6 */ be_nested_str_weak(_X2D), + /* K7 */ be_nested_str_weak(tasmota), + /* K8 */ be_nested_str_weak(log), + /* K9 */ be_nested_str_weak(MTR_X3A_X20Operational_X20Discovery_X20node_X20_X3D_X20), + /* K10 */ be_const_int(3), + /* K11 */ be_nested_str_weak(eth), + /* K12 */ be_nested_str_weak(find), + /* K13 */ be_nested_str_weak(up), + /* K14 */ be_nested_str_weak(MTR_X3A_X20adding_X20mDNS_X20on_X20_X25s_X20_X27_X25s_X27_X20ptr_X20to_X20_X60_X25s_X2Elocal_X60), + /* K15 */ be_nested_str_weak(hostname_eth), + /* K16 */ be_nested_str_weak(add_service), + /* K17 */ be_nested_str_weak(_matter), + /* K18 */ be_nested_str_weak(_tcp), + /* K19 */ be_nested_str_weak(_I), + /* K20 */ be_nested_str_weak(MTR_X3A_X20adding_X20subtype_X3A_X20), + /* K21 */ be_nested_str_weak(add_subtype), + /* K22 */ be_nested_str_weak(wifi), + /* K23 */ be_nested_str_weak(hostname_wifi), + /* K24 */ be_nested_str_weak(MTR_X3A_X20Exception), + /* K25 */ be_nested_str_weak(_X7C), + /* K26 */ be_const_int(2), }), be_str_weak(mdns_announce_op_discovery), &be_const_str_solidified, - ( &(const binstruction[122]) { /* code */ + ( &(const binstruction[121]) { /* code */ 0xA40A0000, // 0000 IMPORT R2 K0 - 0xA40E0200, // 0001 IMPORT R3 K1 - 0xA8020064, // 0002 EXBLK 0 #0068 - 0x8C100302, // 0003 GETMET R4 R1 K2 - 0x7C100200, // 0004 CALL R4 1 - 0x8C100903, // 0005 GETMET R4 R4 K3 - 0x7C100200, // 0006 CALL R4 1 - 0x8C100904, // 0007 GETMET R4 R4 K4 - 0x7C100200, // 0008 CALL R4 1 - 0x8C140305, // 0009 GETMET R5 R1 K5 - 0x7C140200, // 000A CALL R5 1 - 0x8C180B06, // 000B GETMET R6 R5 K6 - 0x7C180200, // 000C CALL R6 1 - 0x00180D07, // 000D ADD R6 R6 K7 - 0x8C1C0906, // 000E GETMET R7 R4 K6 - 0x7C1C0200, // 000F CALL R7 1 - 0x00180C07, // 0010 ADD R6 R6 R7 - 0xB81E1000, // 0011 GETNGBL R7 K8 - 0x8C1C0F09, // 0012 GETMET R7 R7 K9 - 0x00261406, // 0013 ADD R9 K10 R6 - 0x5828000B, // 0014 LDCONST R10 K11 - 0x7C1C0600, // 0015 CALL R7 3 - 0xB81E1000, // 0016 GETNGBL R7 K8 - 0x8C1C0F0C, // 0017 GETMET R7 R7 K12 - 0x7C1C0200, // 0018 CALL R7 1 - 0x8C1C0F0D, // 0019 GETMET R7 R7 K13 - 0x5824000E, // 001A LDCONST R9 K14 - 0x7C1C0400, // 001B CALL R7 2 - 0x781E0020, // 001C JMPF R7 #003E - 0xB81E1000, // 001D GETNGBL R7 K8 - 0x8C1C0F09, // 001E GETMET R7 R7 K9 - 0x8C24070F, // 001F GETMET R9 R3 K15 - 0x582C0010, // 0020 LDCONST R11 K16 - 0x5830000C, // 0021 LDCONST R12 K12 - 0x5C340C00, // 0022 MOVE R13 R6 - 0x88380111, // 0023 GETMBR R14 R0 K17 - 0x7C240A00, // 0024 CALL R9 5 - 0x5828000B, // 0025 LDCONST R10 K11 - 0x7C1C0600, // 0026 CALL R7 3 - 0x8C1C0512, // 0027 GETMET R7 R2 K18 - 0x58240013, // 0028 LDCONST R9 K19 - 0x58280014, // 0029 LDCONST R10 K20 - 0x542E15A3, // 002A LDINT R11 5540 - 0x4C300000, // 002B LDNIL R12 - 0x5C340C00, // 002C MOVE R13 R6 - 0x88380111, // 002D GETMBR R14 R0 K17 - 0x7C1C0E00, // 002E CALL R7 7 - 0x8C1C0B06, // 002F GETMET R7 R5 K6 - 0x7C1C0200, // 0030 CALL R7 1 - 0x001E2A07, // 0031 ADD R7 K21 R7 - 0xB8221000, // 0032 GETNGBL R8 K8 - 0x8C201109, // 0033 GETMET R8 R8 K9 - 0x002A2C07, // 0034 ADD R10 K22 R7 - 0x582C000B, // 0035 LDCONST R11 K11 - 0x7C200600, // 0036 CALL R8 3 - 0x8C200517, // 0037 GETMET R8 R2 K23 - 0x58280013, // 0038 LDCONST R10 K19 - 0x582C0014, // 0039 LDCONST R11 K20 - 0x5C300C00, // 003A MOVE R12 R6 - 0x88340111, // 003B GETMBR R13 R0 K17 - 0x5C380E00, // 003C MOVE R14 R7 - 0x7C200C00, // 003D CALL R8 6 - 0xB81E1000, // 003E GETNGBL R7 K8 - 0x8C1C0F18, // 003F GETMET R7 R7 K24 - 0x7C1C0200, // 0040 CALL R7 1 - 0x8C1C0F0D, // 0041 GETMET R7 R7 K13 - 0x5824000E, // 0042 LDCONST R9 K14 - 0x7C1C0400, // 0043 CALL R7 2 - 0x781E0020, // 0044 JMPF R7 #0066 - 0xB81E1000, // 0045 GETNGBL R7 K8 - 0x8C1C0F09, // 0046 GETMET R7 R7 K9 - 0x8C24070F, // 0047 GETMET R9 R3 K15 - 0x582C0010, // 0048 LDCONST R11 K16 - 0x58300018, // 0049 LDCONST R12 K24 - 0x5C340C00, // 004A MOVE R13 R6 - 0x88380119, // 004B GETMBR R14 R0 K25 - 0x7C240A00, // 004C CALL R9 5 - 0x5828000B, // 004D LDCONST R10 K11 - 0x7C1C0600, // 004E CALL R7 3 - 0x8C1C0512, // 004F GETMET R7 R2 K18 - 0x58240013, // 0050 LDCONST R9 K19 - 0x58280014, // 0051 LDCONST R10 K20 - 0x542E15A3, // 0052 LDINT R11 5540 - 0x4C300000, // 0053 LDNIL R12 - 0x5C340C00, // 0054 MOVE R13 R6 - 0x88380119, // 0055 GETMBR R14 R0 K25 - 0x7C1C0E00, // 0056 CALL R7 7 - 0x8C1C0B06, // 0057 GETMET R7 R5 K6 - 0x7C1C0200, // 0058 CALL R7 1 - 0x001E2A07, // 0059 ADD R7 K21 R7 - 0xB8221000, // 005A GETNGBL R8 K8 - 0x8C201109, // 005B GETMET R8 R8 K9 - 0x002A2C07, // 005C ADD R10 K22 R7 - 0x582C000B, // 005D LDCONST R11 K11 - 0x7C200600, // 005E CALL R8 3 - 0x8C200517, // 005F GETMET R8 R2 K23 - 0x58280013, // 0060 LDCONST R10 K19 - 0x582C0014, // 0061 LDCONST R11 K20 - 0x5C300C00, // 0062 MOVE R12 R6 - 0x88340119, // 0063 GETMBR R13 R0 K25 - 0x5C380E00, // 0064 MOVE R14 R7 - 0x7C200C00, // 0065 CALL R8 6 - 0xA8040001, // 0066 EXBLK 1 1 - 0x70020010, // 0067 JMP #0079 - 0xAC100002, // 0068 CATCH R4 0 2 - 0x7002000D, // 0069 JMP #0078 - 0xB81A1000, // 006A GETNGBL R6 K8 - 0x8C180D09, // 006B GETMET R6 R6 K9 - 0x60200008, // 006C GETGBL R8 G8 - 0x5C240800, // 006D MOVE R9 R4 - 0x7C200200, // 006E CALL R8 1 - 0x00223408, // 006F ADD R8 K26 R8 - 0x0020111B, // 0070 ADD R8 R8 K27 - 0x60240008, // 0071 GETGBL R9 G8 - 0x5C280A00, // 0072 MOVE R10 R5 - 0x7C240200, // 0073 CALL R9 1 - 0x00201009, // 0074 ADD R8 R8 R9 - 0x5824001C, // 0075 LDCONST R9 K28 - 0x7C180600, // 0076 CALL R6 3 - 0x70020000, // 0077 JMP #0079 - 0xB0080000, // 0078 RAISE 2 R0 R0 - 0x80000000, // 0079 RET 0 + 0xA8020064, // 0001 EXBLK 0 #0067 + 0x8C0C0301, // 0002 GETMET R3 R1 K1 + 0x7C0C0200, // 0003 CALL R3 1 + 0x8C0C0702, // 0004 GETMET R3 R3 K2 + 0x7C0C0200, // 0005 CALL R3 1 + 0x8C0C0703, // 0006 GETMET R3 R3 K3 + 0x7C0C0200, // 0007 CALL R3 1 + 0x8C100304, // 0008 GETMET R4 R1 K4 + 0x7C100200, // 0009 CALL R4 1 + 0x8C140905, // 000A GETMET R5 R4 K5 + 0x7C140200, // 000B CALL R5 1 + 0x00140B06, // 000C ADD R5 R5 K6 + 0x8C180705, // 000D GETMET R6 R3 K5 + 0x7C180200, // 000E CALL R6 1 + 0x00140A06, // 000F ADD R5 R5 R6 + 0xB81A0E00, // 0010 GETNGBL R6 K7 + 0x8C180D08, // 0011 GETMET R6 R6 K8 + 0x00221205, // 0012 ADD R8 K9 R5 + 0x5824000A, // 0013 LDCONST R9 K10 + 0x7C180600, // 0014 CALL R6 3 + 0xB81A0E00, // 0015 GETNGBL R6 K7 + 0x8C180D0B, // 0016 GETMET R6 R6 K11 + 0x7C180200, // 0017 CALL R6 1 + 0x8C180D0C, // 0018 GETMET R6 R6 K12 + 0x5820000D, // 0019 LDCONST R8 K13 + 0x7C180400, // 001A CALL R6 2 + 0x781A0020, // 001B JMPF R6 #003D + 0xB81A0E00, // 001C GETNGBL R6 K7 + 0x8C180D08, // 001D GETMET R6 R6 K8 + 0x60200018, // 001E GETGBL R8 G24 + 0x5824000E, // 001F LDCONST R9 K14 + 0x5828000B, // 0020 LDCONST R10 K11 + 0x5C2C0A00, // 0021 MOVE R11 R5 + 0x8830010F, // 0022 GETMBR R12 R0 K15 + 0x7C200800, // 0023 CALL R8 4 + 0x5824000A, // 0024 LDCONST R9 K10 + 0x7C180600, // 0025 CALL R6 3 + 0x8C180510, // 0026 GETMET R6 R2 K16 + 0x58200011, // 0027 LDCONST R8 K17 + 0x58240012, // 0028 LDCONST R9 K18 + 0x542A15A3, // 0029 LDINT R10 5540 + 0x4C2C0000, // 002A LDNIL R11 + 0x5C300A00, // 002B MOVE R12 R5 + 0x8834010F, // 002C GETMBR R13 R0 K15 + 0x7C180E00, // 002D CALL R6 7 + 0x8C180905, // 002E GETMET R6 R4 K5 + 0x7C180200, // 002F CALL R6 1 + 0x001A2606, // 0030 ADD R6 K19 R6 + 0xB81E0E00, // 0031 GETNGBL R7 K7 + 0x8C1C0F08, // 0032 GETMET R7 R7 K8 + 0x00262806, // 0033 ADD R9 K20 R6 + 0x5828000A, // 0034 LDCONST R10 K10 + 0x7C1C0600, // 0035 CALL R7 3 + 0x8C1C0515, // 0036 GETMET R7 R2 K21 + 0x58240011, // 0037 LDCONST R9 K17 + 0x58280012, // 0038 LDCONST R10 K18 + 0x5C2C0A00, // 0039 MOVE R11 R5 + 0x8830010F, // 003A GETMBR R12 R0 K15 + 0x5C340C00, // 003B MOVE R13 R6 + 0x7C1C0C00, // 003C CALL R7 6 + 0xB81A0E00, // 003D GETNGBL R6 K7 + 0x8C180D16, // 003E GETMET R6 R6 K22 + 0x7C180200, // 003F CALL R6 1 + 0x8C180D0C, // 0040 GETMET R6 R6 K12 + 0x5820000D, // 0041 LDCONST R8 K13 + 0x7C180400, // 0042 CALL R6 2 + 0x781A0020, // 0043 JMPF R6 #0065 + 0xB81A0E00, // 0044 GETNGBL R6 K7 + 0x8C180D08, // 0045 GETMET R6 R6 K8 + 0x60200018, // 0046 GETGBL R8 G24 + 0x5824000E, // 0047 LDCONST R9 K14 + 0x58280016, // 0048 LDCONST R10 K22 + 0x5C2C0A00, // 0049 MOVE R11 R5 + 0x88300117, // 004A GETMBR R12 R0 K23 + 0x7C200800, // 004B CALL R8 4 + 0x5824000A, // 004C LDCONST R9 K10 + 0x7C180600, // 004D CALL R6 3 + 0x8C180510, // 004E GETMET R6 R2 K16 + 0x58200011, // 004F LDCONST R8 K17 + 0x58240012, // 0050 LDCONST R9 K18 + 0x542A15A3, // 0051 LDINT R10 5540 + 0x4C2C0000, // 0052 LDNIL R11 + 0x5C300A00, // 0053 MOVE R12 R5 + 0x88340117, // 0054 GETMBR R13 R0 K23 + 0x7C180E00, // 0055 CALL R6 7 + 0x8C180905, // 0056 GETMET R6 R4 K5 + 0x7C180200, // 0057 CALL R6 1 + 0x001A2606, // 0058 ADD R6 K19 R6 + 0xB81E0E00, // 0059 GETNGBL R7 K7 + 0x8C1C0F08, // 005A GETMET R7 R7 K8 + 0x00262806, // 005B ADD R9 K20 R6 + 0x5828000A, // 005C LDCONST R10 K10 + 0x7C1C0600, // 005D CALL R7 3 + 0x8C1C0515, // 005E GETMET R7 R2 K21 + 0x58240011, // 005F LDCONST R9 K17 + 0x58280012, // 0060 LDCONST R10 K18 + 0x5C2C0A00, // 0061 MOVE R11 R5 + 0x88300117, // 0062 GETMBR R12 R0 K23 + 0x5C340C00, // 0063 MOVE R13 R6 + 0x7C1C0C00, // 0064 CALL R7 6 + 0xA8040001, // 0065 EXBLK 1 1 + 0x70020010, // 0066 JMP #0078 + 0xAC0C0002, // 0067 CATCH R3 0 2 + 0x7002000D, // 0068 JMP #0077 + 0xB8160E00, // 0069 GETNGBL R5 K7 + 0x8C140B08, // 006A GETMET R5 R5 K8 + 0x601C0008, // 006B GETGBL R7 G8 + 0x5C200600, // 006C MOVE R8 R3 + 0x7C1C0200, // 006D CALL R7 1 + 0x001E3007, // 006E ADD R7 K24 R7 + 0x001C0F19, // 006F ADD R7 R7 K25 + 0x60200008, // 0070 GETGBL R8 G8 + 0x5C240800, // 0071 MOVE R9 R4 + 0x7C200200, // 0072 CALL R8 1 + 0x001C0E08, // 0073 ADD R7 R7 R8 + 0x5820001A, // 0074 LDCONST R8 K26 + 0x7C140600, // 0075 CALL R5 3 + 0x70020000, // 0076 JMP #0078 + 0xB0080000, // 0077 RAISE 2 R0 R0 + 0x80000000, // 0078 RET 0 }) ) ); @@ -3150,7 +3116,7 @@ be_local_closure(Matter_Device_mdns_announce_op_discovery, /* name */ ********************************************************************/ be_local_closure(Matter_Device_clean_remotes, /* name */ be_nested_proto( - 11, /* nstack */ + 10, /* nstack */ 1, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -3158,96 +3124,94 @@ be_local_closure(Matter_Device_clean_remotes, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[18]) { /* constants */ + ( &(const bvalue[17]) { /* constants */ /* K0 */ be_nested_str_weak(introspect), - /* K1 */ be_nested_str_weak(string), - /* K2 */ be_nested_str_weak(http_remotes), - /* K3 */ be_const_int(0), - /* K4 */ be_nested_str_weak(stop_iteration), - /* K5 */ be_nested_str_weak(plugins), - /* K6 */ be_nested_str_weak(get), - /* K7 */ be_nested_str_weak(http_remote), - /* K8 */ be_nested_str_weak(find), - /* K9 */ be_const_int(1), - /* K10 */ be_nested_str_weak(keys), - /* K11 */ be_nested_str_weak(tasmota), - /* K12 */ be_nested_str_weak(log), - /* K13 */ be_nested_str_weak(MTR_X3A_X20remove_X20unused_X20remote_X3A_X20), - /* K14 */ be_nested_str_weak(addr), - /* K15 */ be_const_int(3), - /* K16 */ be_nested_str_weak(close), - /* K17 */ be_nested_str_weak(remove), + /* K1 */ be_nested_str_weak(http_remotes), + /* K2 */ be_const_int(0), + /* K3 */ be_nested_str_weak(stop_iteration), + /* K4 */ be_nested_str_weak(plugins), + /* K5 */ be_nested_str_weak(get), + /* K6 */ be_nested_str_weak(http_remote), + /* K7 */ be_nested_str_weak(find), + /* K8 */ be_const_int(1), + /* K9 */ be_nested_str_weak(keys), + /* K10 */ be_nested_str_weak(tasmota), + /* K11 */ be_nested_str_weak(log), + /* K12 */ be_nested_str_weak(MTR_X3A_X20remove_X20unused_X20remote_X3A_X20), + /* K13 */ be_nested_str_weak(addr), + /* K14 */ be_const_int(3), + /* K15 */ be_nested_str_weak(close), + /* K16 */ be_nested_str_weak(remove), }), be_str_weak(clean_remotes), &be_const_str_solidified, - ( &(const binstruction[67]) { /* code */ + ( &(const binstruction[66]) { /* code */ 0xA4060000, // 0000 IMPORT R1 K0 - 0xA40A0200, // 0001 IMPORT R2 K1 - 0x880C0102, // 0002 GETMBR R3 R0 K2 - 0x780E003D, // 0003 JMPF R3 #0042 - 0x600C0013, // 0004 GETGBL R3 G19 - 0x7C0C0000, // 0005 CALL R3 0 - 0x60100010, // 0006 GETGBL R4 G16 - 0x88140102, // 0007 GETMBR R5 R0 K2 - 0x7C100200, // 0008 CALL R4 1 - 0xA8020003, // 0009 EXBLK 0 #000E - 0x5C140800, // 000A MOVE R5 R4 - 0x7C140000, // 000B CALL R5 0 - 0x980C0B03, // 000C SETIDX R3 R5 K3 - 0x7001FFFB, // 000D JMP #000A - 0x58100004, // 000E LDCONST R4 K4 - 0xAC100200, // 000F CATCH R4 1 0 - 0xB0080000, // 0010 RAISE 2 R0 R0 - 0x60100010, // 0011 GETGBL R4 G16 - 0x88140105, // 0012 GETMBR R5 R0 K5 - 0x7C100200, // 0013 CALL R4 1 - 0xA802000F, // 0014 EXBLK 0 #0025 - 0x5C140800, // 0015 MOVE R5 R4 - 0x7C140000, // 0016 CALL R5 0 - 0x8C180306, // 0017 GETMET R6 R1 K6 - 0x5C200A00, // 0018 MOVE R8 R5 - 0x58240007, // 0019 LDCONST R9 K7 - 0x7C180600, // 001A CALL R6 3 - 0x4C1C0000, // 001B LDNIL R7 - 0x201C0C07, // 001C NE R7 R6 R7 - 0x781E0005, // 001D JMPF R7 #0024 - 0x8C1C0708, // 001E GETMET R7 R3 K8 - 0x5C240C00, // 001F MOVE R9 R6 - 0x58280003, // 0020 LDCONST R10 K3 - 0x7C1C0600, // 0021 CALL R7 3 - 0x001C0F09, // 0022 ADD R7 R7 K9 - 0x980C0C07, // 0023 SETIDX R3 R6 R7 - 0x7001FFEF, // 0024 JMP #0015 - 0x58100004, // 0025 LDCONST R4 K4 - 0xAC100200, // 0026 CATCH R4 1 0 - 0xB0080000, // 0027 RAISE 2 R0 R0 - 0x60100010, // 0028 GETGBL R4 G16 - 0x8C14070A, // 0029 GETMET R5 R3 K10 - 0x7C140200, // 002A CALL R5 1 - 0x7C100200, // 002B CALL R4 1 - 0xA8020011, // 002C EXBLK 0 #003F - 0x5C140800, // 002D MOVE R5 R4 - 0x7C140000, // 002E CALL R5 0 - 0x94180605, // 002F GETIDX R6 R3 R5 - 0x1C180D03, // 0030 EQ R6 R6 K3 - 0x781A000B, // 0031 JMPF R6 #003E - 0xB81A1600, // 0032 GETNGBL R6 K11 - 0x8C180D0C, // 0033 GETMET R6 R6 K12 - 0x88200B0E, // 0034 GETMBR R8 R5 K14 - 0x00221A08, // 0035 ADD R8 K13 R8 - 0x5824000F, // 0036 LDCONST R9 K15 - 0x7C180600, // 0037 CALL R6 3 - 0x8C180B10, // 0038 GETMET R6 R5 K16 - 0x7C180200, // 0039 CALL R6 1 - 0x88180102, // 003A GETMBR R6 R0 K2 - 0x8C180D11, // 003B GETMET R6 R6 K17 - 0x5C200A00, // 003C MOVE R8 R5 - 0x7C180400, // 003D CALL R6 2 - 0x7001FFED, // 003E JMP #002D - 0x58100004, // 003F LDCONST R4 K4 - 0xAC100200, // 0040 CATCH R4 1 0 - 0xB0080000, // 0041 RAISE 2 R0 R0 - 0x80000000, // 0042 RET 0 + 0x88080101, // 0001 GETMBR R2 R0 K1 + 0x780A003D, // 0002 JMPF R2 #0041 + 0x60080013, // 0003 GETGBL R2 G19 + 0x7C080000, // 0004 CALL R2 0 + 0x600C0010, // 0005 GETGBL R3 G16 + 0x88100101, // 0006 GETMBR R4 R0 K1 + 0x7C0C0200, // 0007 CALL R3 1 + 0xA8020003, // 0008 EXBLK 0 #000D + 0x5C100600, // 0009 MOVE R4 R3 + 0x7C100000, // 000A CALL R4 0 + 0x98080902, // 000B SETIDX R2 R4 K2 + 0x7001FFFB, // 000C JMP #0009 + 0x580C0003, // 000D LDCONST R3 K3 + 0xAC0C0200, // 000E CATCH R3 1 0 + 0xB0080000, // 000F RAISE 2 R0 R0 + 0x600C0010, // 0010 GETGBL R3 G16 + 0x88100104, // 0011 GETMBR R4 R0 K4 + 0x7C0C0200, // 0012 CALL R3 1 + 0xA802000F, // 0013 EXBLK 0 #0024 + 0x5C100600, // 0014 MOVE R4 R3 + 0x7C100000, // 0015 CALL R4 0 + 0x8C140305, // 0016 GETMET R5 R1 K5 + 0x5C1C0800, // 0017 MOVE R7 R4 + 0x58200006, // 0018 LDCONST R8 K6 + 0x7C140600, // 0019 CALL R5 3 + 0x4C180000, // 001A LDNIL R6 + 0x20180A06, // 001B NE R6 R5 R6 + 0x781A0005, // 001C JMPF R6 #0023 + 0x8C180507, // 001D GETMET R6 R2 K7 + 0x5C200A00, // 001E MOVE R8 R5 + 0x58240002, // 001F LDCONST R9 K2 + 0x7C180600, // 0020 CALL R6 3 + 0x00180D08, // 0021 ADD R6 R6 K8 + 0x98080A06, // 0022 SETIDX R2 R5 R6 + 0x7001FFEF, // 0023 JMP #0014 + 0x580C0003, // 0024 LDCONST R3 K3 + 0xAC0C0200, // 0025 CATCH R3 1 0 + 0xB0080000, // 0026 RAISE 2 R0 R0 + 0x600C0010, // 0027 GETGBL R3 G16 + 0x8C100509, // 0028 GETMET R4 R2 K9 + 0x7C100200, // 0029 CALL R4 1 + 0x7C0C0200, // 002A CALL R3 1 + 0xA8020011, // 002B EXBLK 0 #003E + 0x5C100600, // 002C MOVE R4 R3 + 0x7C100000, // 002D CALL R4 0 + 0x94140404, // 002E GETIDX R5 R2 R4 + 0x1C140B02, // 002F EQ R5 R5 K2 + 0x7816000B, // 0030 JMPF R5 #003D + 0xB8161400, // 0031 GETNGBL R5 K10 + 0x8C140B0B, // 0032 GETMET R5 R5 K11 + 0x881C090D, // 0033 GETMBR R7 R4 K13 + 0x001E1807, // 0034 ADD R7 K12 R7 + 0x5820000E, // 0035 LDCONST R8 K14 + 0x7C140600, // 0036 CALL R5 3 + 0x8C14090F, // 0037 GETMET R5 R4 K15 + 0x7C140200, // 0038 CALL R5 1 + 0x88140101, // 0039 GETMBR R5 R0 K1 + 0x8C140B10, // 003A GETMET R5 R5 K16 + 0x5C1C0800, // 003B MOVE R7 R4 + 0x7C140400, // 003C CALL R5 2 + 0x7001FFED, // 003D JMP #002C + 0x580C0003, // 003E LDCONST R3 K3 + 0xAC0C0200, // 003F CATCH R3 1 0 + 0xB0080000, // 0040 RAISE 2 R0 R0 + 0x80000000, // 0041 RET 0 }) ) ); @@ -3661,7 +3625,7 @@ be_local_closure(Matter_Device_compute_qrcode_content, /* name */ ********************************************************************/ be_local_closure(Matter_Device_start_operational_discovery, /* name */ be_nested_proto( - 8, /* nstack */ + 7, /* nstack */ 2, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -3669,31 +3633,29 @@ be_local_closure(Matter_Device_start_operational_discovery, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[ 7]) { /* constants */ + ( &(const bvalue[ 6]) { /* constants */ /* K0 */ be_nested_str_weak(crypto), /* K1 */ be_nested_str_weak(mdns), - /* K2 */ be_nested_str_weak(string), - /* K3 */ be_nested_str_weak(stop_basic_commissioning), - /* K4 */ be_nested_str_weak(root_w0), - /* K5 */ be_nested_str_weak(root_L), - /* K6 */ be_nested_str_weak(mdns_announce_op_discovery), + /* K2 */ be_nested_str_weak(stop_basic_commissioning), + /* K3 */ be_nested_str_weak(root_w0), + /* K4 */ be_nested_str_weak(root_L), + /* K5 */ be_nested_str_weak(mdns_announce_op_discovery), }), be_str_weak(start_operational_discovery), &be_const_str_solidified, - ( &(const binstruction[13]) { /* code */ + ( &(const binstruction[12]) { /* code */ 0xA40A0000, // 0000 IMPORT R2 K0 0xA40E0200, // 0001 IMPORT R3 K1 - 0xA4120400, // 0002 IMPORT R4 K2 - 0x8C140103, // 0003 GETMET R5 R0 K3 - 0x7C140200, // 0004 CALL R5 1 - 0x4C140000, // 0005 LDNIL R5 - 0x90020805, // 0006 SETMBR R0 K4 R5 - 0x4C140000, // 0007 LDNIL R5 - 0x90020A05, // 0008 SETMBR R0 K5 R5 - 0x8C140106, // 0009 GETMET R5 R0 K6 - 0x5C1C0200, // 000A MOVE R7 R1 - 0x7C140400, // 000B CALL R5 2 - 0x80000000, // 000C RET 0 + 0x8C100102, // 0002 GETMET R4 R0 K2 + 0x7C100200, // 0003 CALL R4 1 + 0x4C100000, // 0004 LDNIL R4 + 0x90020604, // 0005 SETMBR R0 K3 R4 + 0x4C100000, // 0006 LDNIL R4 + 0x90020804, // 0007 SETMBR R0 K4 R4 + 0x8C100105, // 0008 GETMET R4 R0 K5 + 0x5C180200, // 0009 MOVE R6 R1 + 0x7C100400, // 000A CALL R4 2 + 0x80000000, // 000B RET 0 }) ) ); @@ -3814,7 +3776,7 @@ be_local_closure(Matter_Device__trigger_read_sensors, /* name */ ********************************************************************/ be_local_closure(Matter_Device_bridge_add_endpoint, /* name */ be_nested_proto( - 19, /* nstack */ + 17, /* nstack */ 3, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -3822,105 +3784,102 @@ be_local_closure(Matter_Device_bridge_add_endpoint, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[23]) { /* constants */ - /* K0 */ be_nested_str_weak(string), - /* K1 */ be_nested_str_weak(plugins_classes), - /* K2 */ be_nested_str_weak(find), - /* K3 */ be_nested_str_weak(tasmota), - /* K4 */ be_nested_str_weak(log), - /* K5 */ be_nested_str_weak(MTR_X3A_X20unknown_X20class_X20name_X20_X27), - /* K6 */ be_nested_str_weak(_X27_X20skipping), - /* K7 */ be_const_int(3), - /* K8 */ be_nested_str_weak(next_ep), - /* K9 */ be_nested_str_weak(plugins), - /* K10 */ be_nested_str_weak(push), - /* K11 */ be_nested_str_weak(type), - /* K12 */ be_nested_str_weak(keys), - /* K13 */ be_nested_str_weak(stop_iteration), - /* K14 */ be_nested_str_weak(format), - /* K15 */ be_nested_str_weak(MTR_X3A_X20adding_X20endpoint_X20_X3D_X20_X25i_X20type_X3A_X25s_X25s), - /* K16 */ be_nested_str_weak(conf_to_log), - /* K17 */ be_const_int(2), - /* K18 */ be_nested_str_weak(plugins_config), - /* K19 */ be_nested_str_weak(plugins_persist), - /* K20 */ be_const_int(1), - /* K21 */ be_nested_str_weak(save_param), - /* K22 */ be_nested_str_weak(signal_endpoints_changed), + ( &(const bvalue[21]) { /* constants */ + /* K0 */ be_nested_str_weak(plugins_classes), + /* K1 */ be_nested_str_weak(find), + /* K2 */ be_nested_str_weak(tasmota), + /* K3 */ be_nested_str_weak(log), + /* K4 */ be_nested_str_weak(MTR_X3A_X20unknown_X20class_X20name_X20_X27), + /* K5 */ be_nested_str_weak(_X27_X20skipping), + /* K6 */ be_const_int(3), + /* K7 */ be_nested_str_weak(next_ep), + /* K8 */ be_nested_str_weak(plugins), + /* K9 */ be_nested_str_weak(push), + /* K10 */ be_nested_str_weak(type), + /* K11 */ be_nested_str_weak(keys), + /* K12 */ be_nested_str_weak(stop_iteration), + /* K13 */ be_nested_str_weak(MTR_X3A_X20adding_X20endpoint_X20_X3D_X20_X25i_X20type_X3A_X25s_X25s), + /* K14 */ be_nested_str_weak(conf_to_log), + /* K15 */ be_const_int(2), + /* K16 */ be_nested_str_weak(plugins_config), + /* K17 */ be_nested_str_weak(plugins_persist), + /* K18 */ be_const_int(1), + /* K19 */ be_nested_str_weak(save_param), + /* K20 */ be_nested_str_weak(signal_endpoints_changed), }), be_str_weak(bridge_add_endpoint), &be_const_str_solidified, - ( &(const binstruction[71]) { /* code */ - 0xA40E0000, // 0000 IMPORT R3 K0 - 0x88100101, // 0001 GETMBR R4 R0 K1 - 0x8C100902, // 0002 GETMET R4 R4 K2 - 0x5C180200, // 0003 MOVE R6 R1 - 0x7C100400, // 0004 CALL R4 2 - 0x4C140000, // 0005 LDNIL R5 - 0x1C140805, // 0006 EQ R5 R4 R5 - 0x78160009, // 0007 JMPF R5 #0012 - 0xB8160600, // 0008 GETNGBL R5 K3 - 0x8C140B04, // 0009 GETMET R5 R5 K4 - 0x601C0008, // 000A GETGBL R7 G8 - 0x5C200200, // 000B MOVE R8 R1 - 0x7C1C0200, // 000C CALL R7 1 - 0x001E0A07, // 000D ADD R7 K5 R7 - 0x001C0F06, // 000E ADD R7 R7 K6 - 0x58200007, // 000F LDCONST R8 K7 - 0x7C140600, // 0010 CALL R5 3 - 0x80000A00, // 0011 RET 0 - 0x88140108, // 0012 GETMBR R5 R0 K8 - 0x60180008, // 0013 GETGBL R6 G8 - 0x5C1C0A00, // 0014 MOVE R7 R5 - 0x7C180200, // 0015 CALL R6 1 - 0x5C1C0800, // 0016 MOVE R7 R4 - 0x5C200000, // 0017 MOVE R8 R0 - 0x5C240A00, // 0018 MOVE R9 R5 - 0x5C280400, // 0019 MOVE R10 R2 - 0x7C1C0600, // 001A CALL R7 3 - 0x88200109, // 001B GETMBR R8 R0 K9 - 0x8C20110A, // 001C GETMET R8 R8 K10 - 0x5C280E00, // 001D MOVE R10 R7 - 0x7C200400, // 001E CALL R8 2 - 0x60200013, // 001F GETGBL R8 G19 - 0x7C200000, // 0020 CALL R8 0 - 0x98221601, // 0021 SETIDX R8 K11 R1 - 0x60240010, // 0022 GETGBL R9 G16 - 0x8C28050C, // 0023 GETMET R10 R2 K12 - 0x7C280200, // 0024 CALL R10 1 - 0x7C240200, // 0025 CALL R9 1 - 0xA8020004, // 0026 EXBLK 0 #002C - 0x5C281200, // 0027 MOVE R10 R9 - 0x7C280000, // 0028 CALL R10 0 - 0x942C040A, // 0029 GETIDX R11 R2 R10 - 0x9820140B, // 002A SETIDX R8 R10 R11 - 0x7001FFFA, // 002B JMP #0027 - 0x5824000D, // 002C LDCONST R9 K13 - 0xAC240200, // 002D CATCH R9 1 0 - 0xB0080000, // 002E RAISE 2 R0 R0 - 0xB8260600, // 002F GETNGBL R9 K3 - 0x8C241304, // 0030 GETMET R9 R9 K4 - 0x8C2C070E, // 0031 GETMET R11 R3 K14 - 0x5834000F, // 0032 LDCONST R13 K15 - 0x5C380A00, // 0033 MOVE R14 R5 - 0x5C3C0200, // 0034 MOVE R15 R1 - 0x8C400110, // 0035 GETMET R16 R0 K16 - 0x5C480400, // 0036 MOVE R18 R2 - 0x7C400400, // 0037 CALL R16 2 - 0x7C2C0A00, // 0038 CALL R11 5 - 0x58300011, // 0039 LDCONST R12 K17 - 0x7C240600, // 003A CALL R9 3 - 0x88240112, // 003B GETMBR R9 R0 K18 - 0x98240C08, // 003C SETIDX R9 R6 R8 - 0x50240200, // 003D LDBOOL R9 1 0 - 0x90022609, // 003E SETMBR R0 K19 R9 - 0x88240108, // 003F GETMBR R9 R0 K8 - 0x00241314, // 0040 ADD R9 R9 K20 - 0x90021009, // 0041 SETMBR R0 K8 R9 - 0x8C240115, // 0042 GETMET R9 R0 K21 - 0x7C240200, // 0043 CALL R9 1 - 0x8C240116, // 0044 GETMET R9 R0 K22 - 0x7C240200, // 0045 CALL R9 1 - 0x80040A00, // 0046 RET 1 R5 + ( &(const binstruction[70]) { /* code */ + 0x880C0100, // 0000 GETMBR R3 R0 K0 + 0x8C0C0701, // 0001 GETMET R3 R3 K1 + 0x5C140200, // 0002 MOVE R5 R1 + 0x7C0C0400, // 0003 CALL R3 2 + 0x4C100000, // 0004 LDNIL R4 + 0x1C100604, // 0005 EQ R4 R3 R4 + 0x78120009, // 0006 JMPF R4 #0011 + 0xB8120400, // 0007 GETNGBL R4 K2 + 0x8C100903, // 0008 GETMET R4 R4 K3 + 0x60180008, // 0009 GETGBL R6 G8 + 0x5C1C0200, // 000A MOVE R7 R1 + 0x7C180200, // 000B CALL R6 1 + 0x001A0806, // 000C ADD R6 K4 R6 + 0x00180D05, // 000D ADD R6 R6 K5 + 0x581C0006, // 000E LDCONST R7 K6 + 0x7C100600, // 000F CALL R4 3 + 0x80000800, // 0010 RET 0 + 0x88100107, // 0011 GETMBR R4 R0 K7 + 0x60140008, // 0012 GETGBL R5 G8 + 0x5C180800, // 0013 MOVE R6 R4 + 0x7C140200, // 0014 CALL R5 1 + 0x5C180600, // 0015 MOVE R6 R3 + 0x5C1C0000, // 0016 MOVE R7 R0 + 0x5C200800, // 0017 MOVE R8 R4 + 0x5C240400, // 0018 MOVE R9 R2 + 0x7C180600, // 0019 CALL R6 3 + 0x881C0108, // 001A GETMBR R7 R0 K8 + 0x8C1C0F09, // 001B GETMET R7 R7 K9 + 0x5C240C00, // 001C MOVE R9 R6 + 0x7C1C0400, // 001D CALL R7 2 + 0x601C0013, // 001E GETGBL R7 G19 + 0x7C1C0000, // 001F CALL R7 0 + 0x981E1401, // 0020 SETIDX R7 K10 R1 + 0x60200010, // 0021 GETGBL R8 G16 + 0x8C24050B, // 0022 GETMET R9 R2 K11 + 0x7C240200, // 0023 CALL R9 1 + 0x7C200200, // 0024 CALL R8 1 + 0xA8020004, // 0025 EXBLK 0 #002B + 0x5C241000, // 0026 MOVE R9 R8 + 0x7C240000, // 0027 CALL R9 0 + 0x94280409, // 0028 GETIDX R10 R2 R9 + 0x981C120A, // 0029 SETIDX R7 R9 R10 + 0x7001FFFA, // 002A JMP #0026 + 0x5820000C, // 002B LDCONST R8 K12 + 0xAC200200, // 002C CATCH R8 1 0 + 0xB0080000, // 002D RAISE 2 R0 R0 + 0xB8220400, // 002E GETNGBL R8 K2 + 0x8C201103, // 002F GETMET R8 R8 K3 + 0x60280018, // 0030 GETGBL R10 G24 + 0x582C000D, // 0031 LDCONST R11 K13 + 0x5C300800, // 0032 MOVE R12 R4 + 0x5C340200, // 0033 MOVE R13 R1 + 0x8C38010E, // 0034 GETMET R14 R0 K14 + 0x5C400400, // 0035 MOVE R16 R2 + 0x7C380400, // 0036 CALL R14 2 + 0x7C280800, // 0037 CALL R10 4 + 0x582C000F, // 0038 LDCONST R11 K15 + 0x7C200600, // 0039 CALL R8 3 + 0x88200110, // 003A GETMBR R8 R0 K16 + 0x98200A07, // 003B SETIDX R8 R5 R7 + 0x50200200, // 003C LDBOOL R8 1 0 + 0x90022208, // 003D SETMBR R0 K17 R8 + 0x88200107, // 003E GETMBR R8 R0 K7 + 0x00201112, // 003F ADD R8 R8 K18 + 0x90020E08, // 0040 SETMBR R0 K7 R8 + 0x8C200113, // 0041 GETMET R8 R0 K19 + 0x7C200200, // 0042 CALL R8 1 + 0x8C200114, // 0043 GETMET R8 R0 K20 + 0x7C200200, // 0044 CALL R8 1 + 0x80040800, // 0045 RET 1 R4 }) ) ); @@ -3932,7 +3891,7 @@ be_local_closure(Matter_Device_bridge_add_endpoint, /* name */ ********************************************************************/ be_local_closure(Matter_Device_load_param, /* name */ be_nested_proto( - 12, /* nstack */ + 11, /* nstack */ 1, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -3940,148 +3899,146 @@ be_local_closure(Matter_Device_load_param, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[32]) { /* constants */ - /* K0 */ be_nested_str_weak(string), - /* K1 */ be_nested_str_weak(crypto), - /* K2 */ be_nested_str_weak(FILENAME), - /* K3 */ be_nested_str_weak(read), - /* K4 */ be_nested_str_weak(close), - /* K5 */ be_nested_str_weak(json), - /* K6 */ be_nested_str_weak(load), - /* K7 */ be_nested_str_weak(root_discriminator), - /* K8 */ be_nested_str_weak(find), - /* K9 */ be_nested_str_weak(distinguish), - /* K10 */ be_nested_str_weak(root_passcode), - /* K11 */ be_nested_str_weak(passcode), - /* K12 */ be_nested_str_weak(ipv4only), - /* K13 */ be_nested_str_weak(next_ep), - /* K14 */ be_nested_str_weak(nextep), - /* K15 */ be_nested_str_weak(plugins_config), - /* K16 */ be_nested_str_weak(config), - /* K17 */ be_nested_str_weak(tasmota), - /* K18 */ be_nested_str_weak(log), - /* K19 */ be_nested_str_weak(MTR_X3A_X20load_config_X20_X3D_X20), - /* K20 */ be_const_int(3), - /* K21 */ be_nested_str_weak(adjust_next_ep), - /* K22 */ be_nested_str_weak(plugins_persist), - /* K23 */ be_nested_str_weak(io_error), - /* K24 */ be_nested_str_weak(MTR_X3A_X20Session_Store_X3A_X3Aload_X20Exception_X3A), - /* K25 */ be_nested_str_weak(_X7C), - /* K26 */ be_const_int(2), - /* K27 */ be_nested_str_weak(random), - /* K28 */ be_nested_str_weak(get), - /* K29 */ be_const_int(0), - /* K30 */ be_nested_str_weak(generate_random_passcode), - /* K31 */ be_nested_str_weak(save_param), + ( &(const bvalue[31]) { /* constants */ + /* K0 */ be_nested_str_weak(crypto), + /* K1 */ be_nested_str_weak(FILENAME), + /* K2 */ be_nested_str_weak(read), + /* K3 */ be_nested_str_weak(close), + /* K4 */ be_nested_str_weak(json), + /* K5 */ be_nested_str_weak(load), + /* K6 */ be_nested_str_weak(root_discriminator), + /* K7 */ be_nested_str_weak(find), + /* K8 */ be_nested_str_weak(distinguish), + /* K9 */ be_nested_str_weak(root_passcode), + /* K10 */ be_nested_str_weak(passcode), + /* K11 */ be_nested_str_weak(ipv4only), + /* K12 */ be_nested_str_weak(next_ep), + /* K13 */ be_nested_str_weak(nextep), + /* K14 */ be_nested_str_weak(plugins_config), + /* K15 */ be_nested_str_weak(config), + /* K16 */ be_nested_str_weak(tasmota), + /* K17 */ be_nested_str_weak(log), + /* K18 */ be_nested_str_weak(MTR_X3A_X20load_config_X20_X3D_X20), + /* K19 */ be_const_int(3), + /* K20 */ be_nested_str_weak(adjust_next_ep), + /* K21 */ be_nested_str_weak(plugins_persist), + /* K22 */ be_nested_str_weak(io_error), + /* K23 */ be_nested_str_weak(MTR_X3A_X20Session_Store_X3A_X3Aload_X20Exception_X3A), + /* K24 */ be_nested_str_weak(_X7C), + /* K25 */ be_const_int(2), + /* K26 */ be_nested_str_weak(random), + /* K27 */ be_nested_str_weak(get), + /* K28 */ be_const_int(0), + /* K29 */ be_nested_str_weak(generate_random_passcode), + /* K30 */ be_nested_str_weak(save_param), }), be_str_weak(load_param), &be_const_str_solidified, - ( &(const binstruction[105]) { /* code */ + ( &(const binstruction[104]) { /* code */ 0xA4060000, // 0000 IMPORT R1 K0 - 0xA40A0200, // 0001 IMPORT R2 K1 - 0xA8020036, // 0002 EXBLK 0 #003A - 0x600C0011, // 0003 GETGBL R3 G17 - 0x88100102, // 0004 GETMBR R4 R0 K2 - 0x7C0C0200, // 0005 CALL R3 1 - 0x8C100703, // 0006 GETMET R4 R3 K3 - 0x7C100200, // 0007 CALL R4 1 - 0x8C140704, // 0008 GETMET R5 R3 K4 - 0x7C140200, // 0009 CALL R5 1 - 0xA4160A00, // 000A IMPORT R5 K5 - 0x8C180B06, // 000B GETMET R6 R5 K6 - 0x5C200800, // 000C MOVE R8 R4 - 0x7C180400, // 000D CALL R6 2 - 0x8C1C0D08, // 000E GETMET R7 R6 K8 - 0x58240009, // 000F LDCONST R9 K9 - 0x88280107, // 0010 GETMBR R10 R0 K7 - 0x7C1C0600, // 0011 CALL R7 3 - 0x90020E07, // 0012 SETMBR R0 K7 R7 - 0x8C1C0D08, // 0013 GETMET R7 R6 K8 - 0x5824000B, // 0014 LDCONST R9 K11 - 0x8828010A, // 0015 GETMBR R10 R0 K10 - 0x7C1C0600, // 0016 CALL R7 3 - 0x90021407, // 0017 SETMBR R0 K10 R7 - 0x601C0017, // 0018 GETGBL R7 G23 - 0x8C200D08, // 0019 GETMET R8 R6 K8 - 0x5828000C, // 001A LDCONST R10 K12 - 0x502C0000, // 001B LDBOOL R11 0 0 - 0x7C200600, // 001C CALL R8 3 - 0x7C1C0200, // 001D CALL R7 1 - 0x90021807, // 001E SETMBR R0 K12 R7 - 0x8C1C0D08, // 001F GETMET R7 R6 K8 - 0x5824000E, // 0020 LDCONST R9 K14 - 0x8828010D, // 0021 GETMBR R10 R0 K13 - 0x7C1C0600, // 0022 CALL R7 3 - 0x90021A07, // 0023 SETMBR R0 K13 R7 - 0x8C1C0D08, // 0024 GETMET R7 R6 K8 - 0x58240010, // 0025 LDCONST R9 K16 - 0x7C1C0400, // 0026 CALL R7 2 - 0x90021E07, // 0027 SETMBR R0 K15 R7 - 0x881C010F, // 0028 GETMBR R7 R0 K15 - 0x4C200000, // 0029 LDNIL R8 - 0x201C0E08, // 002A NE R7 R7 R8 - 0x781E000B, // 002B JMPF R7 #0038 - 0xB81E2200, // 002C GETNGBL R7 K17 - 0x8C1C0F12, // 002D GETMET R7 R7 K18 - 0x60240008, // 002E GETGBL R9 G8 - 0x8828010F, // 002F GETMBR R10 R0 K15 - 0x7C240200, // 0030 CALL R9 1 - 0x00262609, // 0031 ADD R9 K19 R9 - 0x58280014, // 0032 LDCONST R10 K20 - 0x7C1C0600, // 0033 CALL R7 3 - 0x8C1C0115, // 0034 GETMET R7 R0 K21 - 0x7C1C0200, // 0035 CALL R7 1 - 0x501C0200, // 0036 LDBOOL R7 1 0 - 0x90022C07, // 0037 SETMBR R0 K22 R7 - 0xA8040001, // 0038 EXBLK 1 1 - 0x70020012, // 0039 JMP #004D - 0xAC0C0002, // 003A CATCH R3 0 2 - 0x7002000F, // 003B JMP #004C - 0x20140717, // 003C NE R5 R3 K23 - 0x7816000C, // 003D JMPF R5 #004B - 0xB8162200, // 003E GETNGBL R5 K17 - 0x8C140B12, // 003F GETMET R5 R5 K18 - 0x601C0008, // 0040 GETGBL R7 G8 - 0x5C200600, // 0041 MOVE R8 R3 - 0x7C1C0200, // 0042 CALL R7 1 - 0x001E3007, // 0043 ADD R7 K24 R7 - 0x001C0F19, // 0044 ADD R7 R7 K25 - 0x60200008, // 0045 GETGBL R8 G8 - 0x5C240800, // 0046 MOVE R9 R4 - 0x7C200200, // 0047 CALL R8 1 - 0x001C0E08, // 0048 ADD R7 R7 R8 - 0x5820001A, // 0049 LDCONST R8 K26 - 0x7C140600, // 004A CALL R5 3 - 0x70020000, // 004B JMP #004D - 0xB0080000, // 004C RAISE 2 R0 R0 - 0x500C0000, // 004D LDBOOL R3 0 0 - 0x88100107, // 004E GETMBR R4 R0 K7 - 0x4C140000, // 004F LDNIL R5 - 0x1C100805, // 0050 EQ R4 R4 R5 - 0x7812000A, // 0051 JMPF R4 #005D - 0x8C10051B, // 0052 GETMET R4 R2 K27 - 0x5818001A, // 0053 LDCONST R6 K26 - 0x7C100400, // 0054 CALL R4 2 - 0x8C10091C, // 0055 GETMET R4 R4 K28 - 0x5818001D, // 0056 LDCONST R6 K29 - 0x581C001A, // 0057 LDCONST R7 K26 - 0x7C100600, // 0058 CALL R4 3 - 0x54160FFE, // 0059 LDINT R5 4095 - 0x2C100805, // 005A AND R4 R4 R5 - 0x90020E04, // 005B SETMBR R0 K7 R4 - 0x500C0200, // 005C LDBOOL R3 1 0 - 0x8810010A, // 005D GETMBR R4 R0 K10 - 0x4C140000, // 005E LDNIL R5 - 0x1C100805, // 005F EQ R4 R4 R5 - 0x78120003, // 0060 JMPF R4 #0065 - 0x8C10011E, // 0061 GETMET R4 R0 K30 - 0x7C100200, // 0062 CALL R4 1 - 0x90021404, // 0063 SETMBR R0 K10 R4 - 0x500C0200, // 0064 LDBOOL R3 1 0 - 0x780E0001, // 0065 JMPF R3 #0068 - 0x8C10011F, // 0066 GETMET R4 R0 K31 - 0x7C100200, // 0067 CALL R4 1 - 0x80000000, // 0068 RET 0 + 0xA8020036, // 0001 EXBLK 0 #0039 + 0x60080011, // 0002 GETGBL R2 G17 + 0x880C0101, // 0003 GETMBR R3 R0 K1 + 0x7C080200, // 0004 CALL R2 1 + 0x8C0C0502, // 0005 GETMET R3 R2 K2 + 0x7C0C0200, // 0006 CALL R3 1 + 0x8C100503, // 0007 GETMET R4 R2 K3 + 0x7C100200, // 0008 CALL R4 1 + 0xA4120800, // 0009 IMPORT R4 K4 + 0x8C140905, // 000A GETMET R5 R4 K5 + 0x5C1C0600, // 000B MOVE R7 R3 + 0x7C140400, // 000C CALL R5 2 + 0x8C180B07, // 000D GETMET R6 R5 K7 + 0x58200008, // 000E LDCONST R8 K8 + 0x88240106, // 000F GETMBR R9 R0 K6 + 0x7C180600, // 0010 CALL R6 3 + 0x90020C06, // 0011 SETMBR R0 K6 R6 + 0x8C180B07, // 0012 GETMET R6 R5 K7 + 0x5820000A, // 0013 LDCONST R8 K10 + 0x88240109, // 0014 GETMBR R9 R0 K9 + 0x7C180600, // 0015 CALL R6 3 + 0x90021206, // 0016 SETMBR R0 K9 R6 + 0x60180017, // 0017 GETGBL R6 G23 + 0x8C1C0B07, // 0018 GETMET R7 R5 K7 + 0x5824000B, // 0019 LDCONST R9 K11 + 0x50280000, // 001A LDBOOL R10 0 0 + 0x7C1C0600, // 001B CALL R7 3 + 0x7C180200, // 001C CALL R6 1 + 0x90021606, // 001D SETMBR R0 K11 R6 + 0x8C180B07, // 001E GETMET R6 R5 K7 + 0x5820000D, // 001F LDCONST R8 K13 + 0x8824010C, // 0020 GETMBR R9 R0 K12 + 0x7C180600, // 0021 CALL R6 3 + 0x90021806, // 0022 SETMBR R0 K12 R6 + 0x8C180B07, // 0023 GETMET R6 R5 K7 + 0x5820000F, // 0024 LDCONST R8 K15 + 0x7C180400, // 0025 CALL R6 2 + 0x90021C06, // 0026 SETMBR R0 K14 R6 + 0x8818010E, // 0027 GETMBR R6 R0 K14 + 0x4C1C0000, // 0028 LDNIL R7 + 0x20180C07, // 0029 NE R6 R6 R7 + 0x781A000B, // 002A JMPF R6 #0037 + 0xB81A2000, // 002B GETNGBL R6 K16 + 0x8C180D11, // 002C GETMET R6 R6 K17 + 0x60200008, // 002D GETGBL R8 G8 + 0x8824010E, // 002E GETMBR R9 R0 K14 + 0x7C200200, // 002F CALL R8 1 + 0x00222408, // 0030 ADD R8 K18 R8 + 0x58240013, // 0031 LDCONST R9 K19 + 0x7C180600, // 0032 CALL R6 3 + 0x8C180114, // 0033 GETMET R6 R0 K20 + 0x7C180200, // 0034 CALL R6 1 + 0x50180200, // 0035 LDBOOL R6 1 0 + 0x90022A06, // 0036 SETMBR R0 K21 R6 + 0xA8040001, // 0037 EXBLK 1 1 + 0x70020012, // 0038 JMP #004C + 0xAC080002, // 0039 CATCH R2 0 2 + 0x7002000F, // 003A JMP #004B + 0x20100516, // 003B NE R4 R2 K22 + 0x7812000C, // 003C JMPF R4 #004A + 0xB8122000, // 003D GETNGBL R4 K16 + 0x8C100911, // 003E GETMET R4 R4 K17 + 0x60180008, // 003F GETGBL R6 G8 + 0x5C1C0400, // 0040 MOVE R7 R2 + 0x7C180200, // 0041 CALL R6 1 + 0x001A2E06, // 0042 ADD R6 K23 R6 + 0x00180D18, // 0043 ADD R6 R6 K24 + 0x601C0008, // 0044 GETGBL R7 G8 + 0x5C200600, // 0045 MOVE R8 R3 + 0x7C1C0200, // 0046 CALL R7 1 + 0x00180C07, // 0047 ADD R6 R6 R7 + 0x581C0019, // 0048 LDCONST R7 K25 + 0x7C100600, // 0049 CALL R4 3 + 0x70020000, // 004A JMP #004C + 0xB0080000, // 004B RAISE 2 R0 R0 + 0x50080000, // 004C LDBOOL R2 0 0 + 0x880C0106, // 004D GETMBR R3 R0 K6 + 0x4C100000, // 004E LDNIL R4 + 0x1C0C0604, // 004F EQ R3 R3 R4 + 0x780E000A, // 0050 JMPF R3 #005C + 0x8C0C031A, // 0051 GETMET R3 R1 K26 + 0x58140019, // 0052 LDCONST R5 K25 + 0x7C0C0400, // 0053 CALL R3 2 + 0x8C0C071B, // 0054 GETMET R3 R3 K27 + 0x5814001C, // 0055 LDCONST R5 K28 + 0x58180019, // 0056 LDCONST R6 K25 + 0x7C0C0600, // 0057 CALL R3 3 + 0x54120FFE, // 0058 LDINT R4 4095 + 0x2C0C0604, // 0059 AND R3 R3 R4 + 0x90020C03, // 005A SETMBR R0 K6 R3 + 0x50080200, // 005B LDBOOL R2 1 0 + 0x880C0109, // 005C GETMBR R3 R0 K9 + 0x4C100000, // 005D LDNIL R4 + 0x1C0C0604, // 005E EQ R3 R3 R4 + 0x780E0003, // 005F JMPF R3 #0064 + 0x8C0C011D, // 0060 GETMET R3 R0 K29 + 0x7C0C0200, // 0061 CALL R3 1 + 0x90021203, // 0062 SETMBR R0 K9 R3 + 0x50080200, // 0063 LDBOOL R2 1 0 + 0x780A0001, // 0064 JMPF R2 #0067 + 0x8C0C011E, // 0065 GETMET R3 R0 K30 + 0x7C0C0200, // 0066 CALL R3 1 + 0x80000000, // 0067 RET 0 }) ) ); @@ -4093,7 +4050,7 @@ be_local_closure(Matter_Device_load_param, /* name */ ********************************************************************/ be_local_closure(Matter_Device_compute_manual_pairing_code, /* name */ be_nested_proto( - 11, /* nstack */ + 9, /* nstack */ 1, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -4101,50 +4058,47 @@ be_local_closure(Matter_Device_compute_manual_pairing_code, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[ 8]) { /* constants */ - /* K0 */ be_nested_str_weak(string), - /* K1 */ be_nested_str_weak(root_discriminator), - /* K2 */ be_nested_str_weak(root_passcode), - /* K3 */ be_nested_str_weak(format), - /* K4 */ be_nested_str_weak(_X251i_X2505i_X2504i), - /* K5 */ be_nested_str_weak(matter), - /* K6 */ be_nested_str_weak(Verhoeff), - /* K7 */ be_nested_str_weak(checksum), + ( &(const bvalue[ 6]) { /* constants */ + /* K0 */ be_nested_str_weak(root_discriminator), + /* K1 */ be_nested_str_weak(root_passcode), + /* K2 */ be_nested_str_weak(_X251i_X2505i_X2504i), + /* K3 */ be_nested_str_weak(matter), + /* K4 */ be_nested_str_weak(Verhoeff), + /* K5 */ be_nested_str_weak(checksum), }), be_str_weak(compute_manual_pairing_code), &be_const_str_solidified, - ( &(const binstruction[31]) { /* code */ - 0xA4060000, // 0000 IMPORT R1 K0 - 0x88080101, // 0001 GETMBR R2 R0 K1 - 0x540E0FFE, // 0002 LDINT R3 4095 - 0x2C080403, // 0003 AND R2 R2 R3 - 0x540E0009, // 0004 LDINT R3 10 - 0x3C080403, // 0005 SHR R2 R2 R3 - 0x880C0101, // 0006 GETMBR R3 R0 K1 - 0x541202FF, // 0007 LDINT R4 768 - 0x2C0C0604, // 0008 AND R3 R3 R4 - 0x54120005, // 0009 LDINT R4 6 - 0x380C0604, // 000A SHL R3 R3 R4 - 0x88100102, // 000B GETMBR R4 R0 K2 - 0x54163FFE, // 000C LDINT R5 16383 - 0x2C100805, // 000D AND R4 R4 R5 - 0x300C0604, // 000E OR R3 R3 R4 - 0x88100102, // 000F GETMBR R4 R0 K2 - 0x5416000D, // 0010 LDINT R5 14 - 0x3C100805, // 0011 SHR R4 R4 R5 - 0x8C140303, // 0012 GETMET R5 R1 K3 - 0x581C0004, // 0013 LDCONST R7 K4 - 0x5C200400, // 0014 MOVE R8 R2 - 0x5C240600, // 0015 MOVE R9 R3 - 0x5C280800, // 0016 MOVE R10 R4 - 0x7C140A00, // 0017 CALL R5 5 - 0xB81A0A00, // 0018 GETNGBL R6 K5 - 0x88180D06, // 0019 GETMBR R6 R6 K6 - 0x8C180D07, // 001A GETMET R6 R6 K7 - 0x5C200A00, // 001B MOVE R8 R5 - 0x7C180400, // 001C CALL R6 2 - 0x00140A06, // 001D ADD R5 R5 R6 - 0x80040A00, // 001E RET 1 R5 + ( &(const binstruction[30]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x540A0FFE, // 0001 LDINT R2 4095 + 0x2C040202, // 0002 AND R1 R1 R2 + 0x540A0009, // 0003 LDINT R2 10 + 0x3C040202, // 0004 SHR R1 R1 R2 + 0x88080100, // 0005 GETMBR R2 R0 K0 + 0x540E02FF, // 0006 LDINT R3 768 + 0x2C080403, // 0007 AND R2 R2 R3 + 0x540E0005, // 0008 LDINT R3 6 + 0x38080403, // 0009 SHL R2 R2 R3 + 0x880C0101, // 000A GETMBR R3 R0 K1 + 0x54123FFE, // 000B LDINT R4 16383 + 0x2C0C0604, // 000C AND R3 R3 R4 + 0x30080403, // 000D OR R2 R2 R3 + 0x880C0101, // 000E GETMBR R3 R0 K1 + 0x5412000D, // 000F LDINT R4 14 + 0x3C0C0604, // 0010 SHR R3 R3 R4 + 0x60100018, // 0011 GETGBL R4 G24 + 0x58140002, // 0012 LDCONST R5 K2 + 0x5C180200, // 0013 MOVE R6 R1 + 0x5C1C0400, // 0014 MOVE R7 R2 + 0x5C200600, // 0015 MOVE R8 R3 + 0x7C100800, // 0016 CALL R4 4 + 0xB8160600, // 0017 GETNGBL R5 K3 + 0x88140B04, // 0018 GETMBR R5 R5 K4 + 0x8C140B05, // 0019 GETMET R5 R5 K5 + 0x5C1C0800, // 001A MOVE R7 R4 + 0x7C140400, // 001B CALL R5 2 + 0x00100805, // 001C ADD R4 R4 R5 + 0x80040800, // 001D RET 1 R4 }) ) ); @@ -4272,7 +4226,7 @@ be_local_closure(Matter_Device_start_operational_discovery_deferred, /* name * ********************************************************************/ be_local_closure(Matter_Device_autoconf_device_map, /* name */ be_nested_proto( - 22, /* nstack */ + 20, /* nstack */ 1, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -4280,249 +4234,246 @@ be_local_closure(Matter_Device_autoconf_device_map, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[38]) { /* constants */ - /* K0 */ be_nested_str_weak(string), - /* K1 */ be_nested_str_weak(json), - /* K2 */ be_const_int(1), - /* K3 */ be_nested_str_weak(light), - /* K4 */ be_nested_str_weak(get), - /* K5 */ be_nested_str_weak(find), - /* K6 */ be_nested_str_weak(channels), - /* K7 */ be_nested_str_weak(), - /* K8 */ be_const_int(0), - /* K9 */ be_nested_str_weak(type), - /* K10 */ be_nested_str_weak(light1), - /* K11 */ be_const_int(2), - /* K12 */ be_nested_str_weak(light2), - /* K13 */ be_nested_str_weak(light3), - /* K14 */ be_nested_str_weak(tasmota), - /* K15 */ be_nested_str_weak(cmd), - /* K16 */ be_nested_str_weak(Status_X2013), - /* K17 */ be_nested_str_weak(log), - /* K18 */ be_nested_str_weak(MTR_X3A_X20Status_X2013_X20_X3D_X20), - /* K19 */ be_const_int(3), - /* K20 */ be_nested_str_weak(contains), - /* K21 */ be_nested_str_weak(StatusSHT), - /* K22 */ be_nested_str_weak(SHT), - /* K23 */ be_nested_str_weak(format), - /* K24 */ be_nested_str_weak(MTR_X3A_X20_X27_X25s_X27_X20_X3D_X20_X25s), - /* K25 */ be_nested_str_weak(Relay1), - /* K26 */ be_nested_str_weak(Relay2), - /* K27 */ be_nested_str_weak(push), - /* K28 */ be_nested_str_weak(MTR_X3A_X20relay1_X20_X3D_X20_X25s_X2C_X20relay2_X20_X3D_X20_X25s), - /* K29 */ be_nested_str_weak(TiltConfig), - /* K30 */ be_nested_str_weak(shutter_X2Btilt), - /* K31 */ be_nested_str_weak(shutter), - /* K32 */ be_nested_str_weak(get_power), - /* K33 */ be_nested_str_weak(relay), - /* K34 */ be_nested_str_weak(load), - /* K35 */ be_nested_str_weak(read_sensors), - /* K36 */ be_nested_str_weak(autoconf_sensors_list), - /* K37 */ be_nested_str_weak(stop_iteration), + ( &(const bvalue[36]) { /* constants */ + /* K0 */ be_nested_str_weak(json), + /* K1 */ be_const_int(1), + /* K2 */ be_nested_str_weak(light), + /* K3 */ be_nested_str_weak(get), + /* K4 */ be_nested_str_weak(find), + /* K5 */ be_nested_str_weak(channels), + /* K6 */ be_nested_str_weak(), + /* K7 */ be_const_int(0), + /* K8 */ be_nested_str_weak(type), + /* K9 */ be_nested_str_weak(light1), + /* K10 */ be_const_int(2), + /* K11 */ be_nested_str_weak(light2), + /* K12 */ be_nested_str_weak(light3), + /* K13 */ be_nested_str_weak(tasmota), + /* K14 */ be_nested_str_weak(cmd), + /* K15 */ be_nested_str_weak(Status_X2013), + /* K16 */ be_nested_str_weak(log), + /* K17 */ be_nested_str_weak(MTR_X3A_X20Status_X2013_X20_X3D_X20), + /* K18 */ be_const_int(3), + /* K19 */ be_nested_str_weak(contains), + /* K20 */ be_nested_str_weak(StatusSHT), + /* K21 */ be_nested_str_weak(SHT), + /* K22 */ be_nested_str_weak(MTR_X3A_X20_X27_X25s_X27_X20_X3D_X20_X25s), + /* K23 */ be_nested_str_weak(Relay1), + /* K24 */ be_nested_str_weak(Relay2), + /* K25 */ be_nested_str_weak(push), + /* K26 */ be_nested_str_weak(MTR_X3A_X20relay1_X20_X3D_X20_X25s_X2C_X20relay2_X20_X3D_X20_X25s), + /* K27 */ be_nested_str_weak(TiltConfig), + /* K28 */ be_nested_str_weak(shutter_X2Btilt), + /* K29 */ be_nested_str_weak(shutter), + /* K30 */ be_nested_str_weak(get_power), + /* K31 */ be_nested_str_weak(relay), + /* K32 */ be_nested_str_weak(load), + /* K33 */ be_nested_str_weak(read_sensors), + /* K34 */ be_nested_str_weak(autoconf_sensors_list), + /* K35 */ be_nested_str_weak(stop_iteration), }), be_str_weak(autoconf_device_map), &be_const_str_solidified, - ( &(const binstruction[200]) { /* code */ + ( &(const binstruction[199]) { /* code */ 0xA4060000, // 0000 IMPORT R1 K0 - 0xA40A0200, // 0001 IMPORT R2 K1 - 0x600C0013, // 0002 GETGBL R3 G19 - 0x7C0C0000, // 0003 CALL R3 0 - 0x58100002, // 0004 LDCONST R4 K2 - 0x50140000, // 0005 LDBOOL R5 0 0 - 0xA41A0600, // 0006 IMPORT R6 K3 - 0x8C1C0D04, // 0007 GETMET R7 R6 K4 - 0x7C1C0200, // 0008 CALL R7 1 - 0x4C200000, // 0009 LDNIL R8 - 0x20200E08, // 000A NE R8 R7 R8 - 0x78220024, // 000B JMPF R8 #0031 - 0x6020000C, // 000C GETGBL R8 G12 - 0x8C240F05, // 000D GETMET R9 R7 K5 + 0x60080013, // 0001 GETGBL R2 G19 + 0x7C080000, // 0002 CALL R2 0 + 0x580C0001, // 0003 LDCONST R3 K1 + 0x50100000, // 0004 LDBOOL R4 0 0 + 0xA4160400, // 0005 IMPORT R5 K2 + 0x8C180B03, // 0006 GETMET R6 R5 K3 + 0x7C180200, // 0007 CALL R6 1 + 0x4C1C0000, // 0008 LDNIL R7 + 0x201C0C07, // 0009 NE R7 R6 R7 + 0x781E0024, // 000A JMPF R7 #0030 + 0x601C000C, // 000B GETGBL R7 G12 + 0x8C200D04, // 000C GETMET R8 R6 K4 + 0x58280005, // 000D LDCONST R10 K5 0x582C0006, // 000E LDCONST R11 K6 - 0x58300007, // 000F LDCONST R12 K7 - 0x7C240600, // 0010 CALL R9 3 - 0x7C200200, // 0011 CALL R8 1 - 0x24241108, // 0012 GT R9 R8 K8 - 0x7826001C, // 0013 JMPF R9 #0031 - 0x1C241102, // 0014 EQ R9 R8 K2 - 0x78260007, // 0015 JMPF R9 #001E - 0x60240008, // 0016 GETGBL R9 G8 - 0x5C280800, // 0017 MOVE R10 R4 - 0x7C240200, // 0018 CALL R9 1 - 0x60280013, // 0019 GETGBL R10 G19 - 0x7C280000, // 001A CALL R10 0 - 0x982A130A, // 001B SETIDX R10 K9 K10 - 0x980C120A, // 001C SETIDX R3 R9 R10 - 0x70020010, // 001D JMP #002F - 0x1C24110B, // 001E EQ R9 R8 K11 - 0x78260007, // 001F JMPF R9 #0028 - 0x60240008, // 0020 GETGBL R9 G8 - 0x5C280800, // 0021 MOVE R10 R4 - 0x7C240200, // 0022 CALL R9 1 - 0x60280013, // 0023 GETGBL R10 G19 - 0x7C280000, // 0024 CALL R10 0 - 0x982A130C, // 0025 SETIDX R10 K9 K12 - 0x980C120A, // 0026 SETIDX R3 R9 R10 - 0x70020006, // 0027 JMP #002F - 0x60240008, // 0028 GETGBL R9 G8 - 0x5C280800, // 0029 MOVE R10 R4 - 0x7C240200, // 002A CALL R9 1 - 0x60280013, // 002B GETGBL R10 G19 - 0x7C280000, // 002C CALL R10 0 - 0x982A130D, // 002D SETIDX R10 K9 K13 - 0x980C120A, // 002E SETIDX R3 R9 R10 - 0x50140200, // 002F LDBOOL R5 1 0 - 0x00100902, // 0030 ADD R4 R4 K2 - 0xB8221C00, // 0031 GETNGBL R8 K14 - 0x8C20110F, // 0032 GETMET R8 R8 K15 - 0x58280010, // 0033 LDCONST R10 K16 - 0x502C0200, // 0034 LDBOOL R11 1 0 - 0x7C200600, // 0035 CALL R8 3 - 0x60240012, // 0036 GETGBL R9 G18 - 0x7C240000, // 0037 CALL R9 0 - 0xB82A1C00, // 0038 GETNGBL R10 K14 - 0x8C281511, // 0039 GETMET R10 R10 K17 - 0x60300008, // 003A GETGBL R12 G8 - 0x5C341000, // 003B MOVE R13 R8 - 0x7C300200, // 003C CALL R12 1 - 0x0032240C, // 003D ADD R12 K18 R12 - 0x58340013, // 003E LDCONST R13 K19 - 0x7C280600, // 003F CALL R10 3 - 0x4C280000, // 0040 LDNIL R10 - 0x2028100A, // 0041 NE R10 R8 R10 - 0x782A0051, // 0042 JMPF R10 #0095 - 0x8C281114, // 0043 GETMET R10 R8 K20 - 0x58300015, // 0044 LDCONST R12 K21 - 0x7C280400, // 0045 CALL R10 2 - 0x782A004D, // 0046 JMPF R10 #0095 - 0x94201115, // 0047 GETIDX R8 R8 K21 - 0x58280008, // 0048 LDCONST R10 K8 - 0x502C0200, // 0049 LDBOOL R11 1 0 - 0x782E0049, // 004A JMPF R11 #0095 - 0x602C0008, // 004B GETGBL R11 G8 - 0x5C301400, // 004C MOVE R12 R10 - 0x7C2C0200, // 004D CALL R11 1 - 0x002E2C0B, // 004E ADD R11 K22 R11 - 0x8C301114, // 004F GETMET R12 R8 K20 - 0x5C381600, // 0050 MOVE R14 R11 - 0x7C300400, // 0051 CALL R12 2 - 0x74320000, // 0052 JMPT R12 #0054 - 0x70020040, // 0053 JMP #0095 - 0x9430100B, // 0054 GETIDX R12 R8 R11 - 0xB8361C00, // 0055 GETNGBL R13 K14 - 0x8C341B11, // 0056 GETMET R13 R13 K17 - 0x8C3C0317, // 0057 GETMET R15 R1 K23 - 0x58440018, // 0058 LDCONST R17 K24 - 0x5C481600, // 0059 MOVE R18 R11 - 0x604C0008, // 005A GETGBL R19 G8 - 0x5C501800, // 005B MOVE R20 R12 - 0x7C4C0200, // 005C CALL R19 1 - 0x7C3C0800, // 005D CALL R15 4 - 0x58400013, // 005E LDCONST R16 K19 - 0x7C340600, // 005F CALL R13 3 - 0x8C341905, // 0060 GETMET R13 R12 K5 - 0x583C0019, // 0061 LDCONST R15 K25 - 0x58400008, // 0062 LDCONST R16 K8 - 0x7C340600, // 0063 CALL R13 3 - 0x04341B02, // 0064 SUB R13 R13 K2 - 0x8C381905, // 0065 GETMET R14 R12 K5 - 0x5840001A, // 0066 LDCONST R16 K26 - 0x58440008, // 0067 LDCONST R17 K8 - 0x7C380600, // 0068 CALL R14 3 - 0x04381D02, // 0069 SUB R14 R14 K2 - 0x283C1B08, // 006A GE R15 R13 K8 - 0x783E0002, // 006B JMPF R15 #006F - 0x8C3C131B, // 006C GETMET R15 R9 K27 - 0x5C441A00, // 006D MOVE R17 R13 - 0x7C3C0400, // 006E CALL R15 2 - 0x283C1D08, // 006F GE R15 R14 K8 - 0x783E0002, // 0070 JMPF R15 #0074 - 0x8C3C131B, // 0071 GETMET R15 R9 K27 - 0x5C441C00, // 0072 MOVE R17 R14 - 0x7C3C0400, // 0073 CALL R15 2 - 0xB83E1C00, // 0074 GETNGBL R15 K14 - 0x8C3C1F11, // 0075 GETMET R15 R15 K17 - 0x8C440317, // 0076 GETMET R17 R1 K23 - 0x584C001C, // 0077 LDCONST R19 K28 - 0x5C501A00, // 0078 MOVE R20 R13 - 0x5C541C00, // 0079 MOVE R21 R14 - 0x7C440800, // 007A CALL R17 4 - 0x58480013, // 007B LDCONST R18 K19 - 0x7C3C0600, // 007C CALL R15 3 - 0x8C3C1905, // 007D GETMET R15 R12 K5 - 0x5844001D, // 007E LDCONST R17 K29 - 0x7C3C0400, // 007F CALL R15 2 - 0x783E0002, // 0080 JMPF R15 #0084 - 0x94401F0B, // 0081 GETIDX R16 R15 K11 - 0x24402108, // 0082 GT R16 R16 K8 - 0x74420000, // 0083 JMPT R16 #0085 - 0x50400001, // 0084 LDBOOL R16 0 1 - 0x50400200, // 0085 LDBOOL R16 1 0 - 0x60440008, // 0086 GETGBL R17 G8 - 0x5C480800, // 0087 MOVE R18 R4 - 0x7C440200, // 0088 CALL R17 1 - 0x60480013, // 0089 GETGBL R18 G19 - 0x7C480000, // 008A CALL R18 0 - 0x78420001, // 008B JMPF R16 #008E - 0x584C001E, // 008C LDCONST R19 K30 - 0x70020000, // 008D JMP #008F - 0x584C001F, // 008E LDCONST R19 K31 - 0x984A1213, // 008F SETIDX R18 K9 R19 - 0x984A3E0A, // 0090 SETIDX R18 K31 R10 - 0x980C2212, // 0091 SETIDX R3 R17 R18 - 0x00100902, // 0092 ADD R4 R4 K2 - 0x00281502, // 0093 ADD R10 R10 K2 - 0x7001FFB3, // 0094 JMP #0049 - 0x6028000C, // 0095 GETGBL R10 G12 - 0xB82E1C00, // 0096 GETNGBL R11 K14 - 0x8C2C1720, // 0097 GETMET R11 R11 K32 - 0x7C2C0200, // 0098 CALL R11 1 - 0x7C280200, // 0099 CALL R10 1 - 0x582C0008, // 009A LDCONST R11 K8 - 0x78160000, // 009B JMPF R5 #009D - 0x04281502, // 009C SUB R10 R10 K2 - 0x1430160A, // 009D LT R12 R11 R10 - 0x78320010, // 009E JMPF R12 #00B0 - 0x8C301305, // 009F GETMET R12 R9 K5 - 0x5C381600, // 00A0 MOVE R14 R11 - 0x7C300400, // 00A1 CALL R12 2 - 0x4C340000, // 00A2 LDNIL R13 - 0x1C30180D, // 00A3 EQ R12 R12 R13 - 0x78320008, // 00A4 JMPF R12 #00AE - 0x60300008, // 00A5 GETGBL R12 G8 - 0x5C340800, // 00A6 MOVE R13 R4 - 0x7C300200, // 00A7 CALL R12 1 - 0x60340013, // 00A8 GETGBL R13 G19 - 0x7C340000, // 00A9 CALL R13 0 - 0x98361321, // 00AA SETIDX R13 K9 K33 - 0x9836420B, // 00AB SETIDX R13 K33 R11 - 0x980C180D, // 00AC SETIDX R3 R12 R13 - 0x00100902, // 00AD ADD R4 R4 K2 - 0x002C1702, // 00AE ADD R11 R11 K2 - 0x7001FFEC, // 00AF JMP #009D - 0x8C300522, // 00B0 GETMET R12 R2 K34 - 0xB83A1C00, // 00B1 GETNGBL R14 K14 - 0x8C381D23, // 00B2 GETMET R14 R14 K35 - 0x7C380200, // 00B3 CALL R14 1 - 0x7C300400, // 00B4 CALL R12 2 - 0x8C340124, // 00B5 GETMET R13 R0 K36 - 0x5C3C1800, // 00B6 MOVE R15 R12 - 0x7C340400, // 00B7 CALL R13 2 - 0x60380010, // 00B8 GETGBL R14 G16 - 0x5C3C1A00, // 00B9 MOVE R15 R13 - 0x7C380200, // 00BA CALL R14 1 - 0xA8020007, // 00BB EXBLK 0 #00C4 - 0x5C3C1C00, // 00BC MOVE R15 R14 - 0x7C3C0000, // 00BD CALL R15 0 - 0x60400008, // 00BE GETGBL R16 G8 - 0x5C440800, // 00BF MOVE R17 R4 - 0x7C400200, // 00C0 CALL R16 1 - 0x980C200F, // 00C1 SETIDX R3 R16 R15 - 0x00100902, // 00C2 ADD R4 R4 K2 - 0x7001FFF7, // 00C3 JMP #00BC - 0x58380025, // 00C4 LDCONST R14 K37 - 0xAC380200, // 00C5 CATCH R14 1 0 - 0xB0080000, // 00C6 RAISE 2 R0 R0 - 0x80040600, // 00C7 RET 1 R3 + 0x7C200600, // 000F CALL R8 3 + 0x7C1C0200, // 0010 CALL R7 1 + 0x24200F07, // 0011 GT R8 R7 K7 + 0x7822001C, // 0012 JMPF R8 #0030 + 0x1C200F01, // 0013 EQ R8 R7 K1 + 0x78220007, // 0014 JMPF R8 #001D + 0x60200008, // 0015 GETGBL R8 G8 + 0x5C240600, // 0016 MOVE R9 R3 + 0x7C200200, // 0017 CALL R8 1 + 0x60240013, // 0018 GETGBL R9 G19 + 0x7C240000, // 0019 CALL R9 0 + 0x98261109, // 001A SETIDX R9 K8 K9 + 0x98081009, // 001B SETIDX R2 R8 R9 + 0x70020010, // 001C JMP #002E + 0x1C200F0A, // 001D EQ R8 R7 K10 + 0x78220007, // 001E JMPF R8 #0027 + 0x60200008, // 001F GETGBL R8 G8 + 0x5C240600, // 0020 MOVE R9 R3 + 0x7C200200, // 0021 CALL R8 1 + 0x60240013, // 0022 GETGBL R9 G19 + 0x7C240000, // 0023 CALL R9 0 + 0x9826110B, // 0024 SETIDX R9 K8 K11 + 0x98081009, // 0025 SETIDX R2 R8 R9 + 0x70020006, // 0026 JMP #002E + 0x60200008, // 0027 GETGBL R8 G8 + 0x5C240600, // 0028 MOVE R9 R3 + 0x7C200200, // 0029 CALL R8 1 + 0x60240013, // 002A GETGBL R9 G19 + 0x7C240000, // 002B CALL R9 0 + 0x9826110C, // 002C SETIDX R9 K8 K12 + 0x98081009, // 002D SETIDX R2 R8 R9 + 0x50100200, // 002E LDBOOL R4 1 0 + 0x000C0701, // 002F ADD R3 R3 K1 + 0xB81E1A00, // 0030 GETNGBL R7 K13 + 0x8C1C0F0E, // 0031 GETMET R7 R7 K14 + 0x5824000F, // 0032 LDCONST R9 K15 + 0x50280200, // 0033 LDBOOL R10 1 0 + 0x7C1C0600, // 0034 CALL R7 3 + 0x60200012, // 0035 GETGBL R8 G18 + 0x7C200000, // 0036 CALL R8 0 + 0xB8261A00, // 0037 GETNGBL R9 K13 + 0x8C241310, // 0038 GETMET R9 R9 K16 + 0x602C0008, // 0039 GETGBL R11 G8 + 0x5C300E00, // 003A MOVE R12 R7 + 0x7C2C0200, // 003B CALL R11 1 + 0x002E220B, // 003C ADD R11 K17 R11 + 0x58300012, // 003D LDCONST R12 K18 + 0x7C240600, // 003E CALL R9 3 + 0x4C240000, // 003F LDNIL R9 + 0x20240E09, // 0040 NE R9 R7 R9 + 0x78260051, // 0041 JMPF R9 #0094 + 0x8C240F13, // 0042 GETMET R9 R7 K19 + 0x582C0014, // 0043 LDCONST R11 K20 + 0x7C240400, // 0044 CALL R9 2 + 0x7826004D, // 0045 JMPF R9 #0094 + 0x941C0F14, // 0046 GETIDX R7 R7 K20 + 0x58240007, // 0047 LDCONST R9 K7 + 0x50280200, // 0048 LDBOOL R10 1 0 + 0x782A0049, // 0049 JMPF R10 #0094 + 0x60280008, // 004A GETGBL R10 G8 + 0x5C2C1200, // 004B MOVE R11 R9 + 0x7C280200, // 004C CALL R10 1 + 0x002A2A0A, // 004D ADD R10 K21 R10 + 0x8C2C0F13, // 004E GETMET R11 R7 K19 + 0x5C341400, // 004F MOVE R13 R10 + 0x7C2C0400, // 0050 CALL R11 2 + 0x742E0000, // 0051 JMPT R11 #0053 + 0x70020040, // 0052 JMP #0094 + 0x942C0E0A, // 0053 GETIDX R11 R7 R10 + 0xB8321A00, // 0054 GETNGBL R12 K13 + 0x8C301910, // 0055 GETMET R12 R12 K16 + 0x60380018, // 0056 GETGBL R14 G24 + 0x583C0016, // 0057 LDCONST R15 K22 + 0x5C401400, // 0058 MOVE R16 R10 + 0x60440008, // 0059 GETGBL R17 G8 + 0x5C481600, // 005A MOVE R18 R11 + 0x7C440200, // 005B CALL R17 1 + 0x7C380600, // 005C CALL R14 3 + 0x583C0012, // 005D LDCONST R15 K18 + 0x7C300600, // 005E CALL R12 3 + 0x8C301704, // 005F GETMET R12 R11 K4 + 0x58380017, // 0060 LDCONST R14 K23 + 0x583C0007, // 0061 LDCONST R15 K7 + 0x7C300600, // 0062 CALL R12 3 + 0x04301901, // 0063 SUB R12 R12 K1 + 0x8C341704, // 0064 GETMET R13 R11 K4 + 0x583C0018, // 0065 LDCONST R15 K24 + 0x58400007, // 0066 LDCONST R16 K7 + 0x7C340600, // 0067 CALL R13 3 + 0x04341B01, // 0068 SUB R13 R13 K1 + 0x28381907, // 0069 GE R14 R12 K7 + 0x783A0002, // 006A JMPF R14 #006E + 0x8C381119, // 006B GETMET R14 R8 K25 + 0x5C401800, // 006C MOVE R16 R12 + 0x7C380400, // 006D CALL R14 2 + 0x28381B07, // 006E GE R14 R13 K7 + 0x783A0002, // 006F JMPF R14 #0073 + 0x8C381119, // 0070 GETMET R14 R8 K25 + 0x5C401A00, // 0071 MOVE R16 R13 + 0x7C380400, // 0072 CALL R14 2 + 0xB83A1A00, // 0073 GETNGBL R14 K13 + 0x8C381D10, // 0074 GETMET R14 R14 K16 + 0x60400018, // 0075 GETGBL R16 G24 + 0x5844001A, // 0076 LDCONST R17 K26 + 0x5C481800, // 0077 MOVE R18 R12 + 0x5C4C1A00, // 0078 MOVE R19 R13 + 0x7C400600, // 0079 CALL R16 3 + 0x58440012, // 007A LDCONST R17 K18 + 0x7C380600, // 007B CALL R14 3 + 0x8C381704, // 007C GETMET R14 R11 K4 + 0x5840001B, // 007D LDCONST R16 K27 + 0x7C380400, // 007E CALL R14 2 + 0x783A0002, // 007F JMPF R14 #0083 + 0x943C1D0A, // 0080 GETIDX R15 R14 K10 + 0x243C1F07, // 0081 GT R15 R15 K7 + 0x743E0000, // 0082 JMPT R15 #0084 + 0x503C0001, // 0083 LDBOOL R15 0 1 + 0x503C0200, // 0084 LDBOOL R15 1 0 + 0x60400008, // 0085 GETGBL R16 G8 + 0x5C440600, // 0086 MOVE R17 R3 + 0x7C400200, // 0087 CALL R16 1 + 0x60440013, // 0088 GETGBL R17 G19 + 0x7C440000, // 0089 CALL R17 0 + 0x783E0001, // 008A JMPF R15 #008D + 0x5848001C, // 008B LDCONST R18 K28 + 0x70020000, // 008C JMP #008E + 0x5848001D, // 008D LDCONST R18 K29 + 0x98461012, // 008E SETIDX R17 K8 R18 + 0x98463A09, // 008F SETIDX R17 K29 R9 + 0x98082011, // 0090 SETIDX R2 R16 R17 + 0x000C0701, // 0091 ADD R3 R3 K1 + 0x00241301, // 0092 ADD R9 R9 K1 + 0x7001FFB3, // 0093 JMP #0048 + 0x6024000C, // 0094 GETGBL R9 G12 + 0xB82A1A00, // 0095 GETNGBL R10 K13 + 0x8C28151E, // 0096 GETMET R10 R10 K30 + 0x7C280200, // 0097 CALL R10 1 + 0x7C240200, // 0098 CALL R9 1 + 0x58280007, // 0099 LDCONST R10 K7 + 0x78120000, // 009A JMPF R4 #009C + 0x04241301, // 009B SUB R9 R9 K1 + 0x142C1409, // 009C LT R11 R10 R9 + 0x782E0010, // 009D JMPF R11 #00AF + 0x8C2C1104, // 009E GETMET R11 R8 K4 + 0x5C341400, // 009F MOVE R13 R10 + 0x7C2C0400, // 00A0 CALL R11 2 + 0x4C300000, // 00A1 LDNIL R12 + 0x1C2C160C, // 00A2 EQ R11 R11 R12 + 0x782E0008, // 00A3 JMPF R11 #00AD + 0x602C0008, // 00A4 GETGBL R11 G8 + 0x5C300600, // 00A5 MOVE R12 R3 + 0x7C2C0200, // 00A6 CALL R11 1 + 0x60300013, // 00A7 GETGBL R12 G19 + 0x7C300000, // 00A8 CALL R12 0 + 0x9832111F, // 00A9 SETIDX R12 K8 K31 + 0x98323E0A, // 00AA SETIDX R12 K31 R10 + 0x9808160C, // 00AB SETIDX R2 R11 R12 + 0x000C0701, // 00AC ADD R3 R3 K1 + 0x00281501, // 00AD ADD R10 R10 K1 + 0x7001FFEC, // 00AE JMP #009C + 0x8C2C0320, // 00AF GETMET R11 R1 K32 + 0xB8361A00, // 00B0 GETNGBL R13 K13 + 0x8C341B21, // 00B1 GETMET R13 R13 K33 + 0x7C340200, // 00B2 CALL R13 1 + 0x7C2C0400, // 00B3 CALL R11 2 + 0x8C300122, // 00B4 GETMET R12 R0 K34 + 0x5C381600, // 00B5 MOVE R14 R11 + 0x7C300400, // 00B6 CALL R12 2 + 0x60340010, // 00B7 GETGBL R13 G16 + 0x5C381800, // 00B8 MOVE R14 R12 + 0x7C340200, // 00B9 CALL R13 1 + 0xA8020007, // 00BA EXBLK 0 #00C3 + 0x5C381A00, // 00BB MOVE R14 R13 + 0x7C380000, // 00BC CALL R14 0 + 0x603C0008, // 00BD GETGBL R15 G8 + 0x5C400600, // 00BE MOVE R16 R3 + 0x7C3C0200, // 00BF CALL R15 1 + 0x98081E0E, // 00C0 SETIDX R2 R15 R14 + 0x000C0701, // 00C1 ADD R3 R3 K1 + 0x7001FFF7, // 00C2 JMP #00BB + 0x58340023, // 00C3 LDCONST R13 K35 + 0xAC340200, // 00C4 CATCH R13 1 0 + 0xB0080000, // 00C5 RAISE 2 R0 R0 + 0x80040400, // 00C6 RET 1 R2 }) ) ); @@ -4534,7 +4485,7 @@ be_local_closure(Matter_Device_autoconf_device_map, /* name */ ********************************************************************/ be_local_closure(Matter_Device_autoconf_device, /* name */ be_nested_proto( - 7, /* nstack */ + 6, /* nstack */ 1, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -4542,65 +4493,63 @@ be_local_closure(Matter_Device_autoconf_device, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[16]) { /* constants */ - /* K0 */ be_nested_str_weak(string), - /* K1 */ be_nested_str_weak(json), - /* K2 */ be_nested_str_weak(plugins), - /* K3 */ be_const_int(0), - /* K4 */ be_nested_str_weak(plugins_persist), - /* K5 */ be_nested_str_weak(plugins_config), - /* K6 */ be_nested_str_weak(autoconf_device_map), - /* K7 */ be_nested_str_weak(adjust_next_ep), - /* K8 */ be_nested_str_weak(tasmota), - /* K9 */ be_nested_str_weak(log), - /* K10 */ be_nested_str_weak(MTR_X3A_X20autoconfig_X20_X3D_X20), - /* K11 */ be_const_int(3), - /* K12 */ be_nested_str_weak(_instantiate_plugins_from_config), - /* K13 */ be_nested_str_weak(sessions), - /* K14 */ be_nested_str_weak(count_active_fabrics), - /* K15 */ be_nested_str_weak(save_param), + ( &(const bvalue[15]) { /* constants */ + /* K0 */ be_nested_str_weak(json), + /* K1 */ be_nested_str_weak(plugins), + /* K2 */ be_const_int(0), + /* K3 */ be_nested_str_weak(plugins_persist), + /* K4 */ be_nested_str_weak(plugins_config), + /* K5 */ be_nested_str_weak(autoconf_device_map), + /* K6 */ be_nested_str_weak(adjust_next_ep), + /* K7 */ be_nested_str_weak(tasmota), + /* K8 */ be_nested_str_weak(log), + /* K9 */ be_nested_str_weak(MTR_X3A_X20autoconfig_X20_X3D_X20), + /* K10 */ be_const_int(3), + /* K11 */ be_nested_str_weak(_instantiate_plugins_from_config), + /* K12 */ be_nested_str_weak(sessions), + /* K13 */ be_nested_str_weak(count_active_fabrics), + /* K14 */ be_nested_str_weak(save_param), }), be_str_weak(autoconf_device), &be_const_str_solidified, - ( &(const binstruction[38]) { /* code */ + ( &(const binstruction[37]) { /* code */ 0xA4060000, // 0000 IMPORT R1 K0 - 0xA40A0200, // 0001 IMPORT R2 K1 - 0x600C000C, // 0002 GETGBL R3 G12 - 0x88100102, // 0003 GETMBR R4 R0 K2 - 0x7C0C0200, // 0004 CALL R3 1 - 0x240C0703, // 0005 GT R3 R3 K3 - 0x780E0000, // 0006 JMPF R3 #0008 - 0x80000600, // 0007 RET 0 - 0x880C0104, // 0008 GETMBR R3 R0 K4 - 0x740E000C, // 0009 JMPT R3 #0017 - 0x8C0C0106, // 000A GETMET R3 R0 K6 - 0x7C0C0200, // 000B CALL R3 1 - 0x90020A03, // 000C SETMBR R0 K5 R3 - 0x8C0C0107, // 000D GETMET R3 R0 K7 - 0x7C0C0200, // 000E CALL R3 1 - 0xB80E1000, // 000F GETNGBL R3 K8 - 0x8C0C0709, // 0010 GETMET R3 R3 K9 - 0x60140008, // 0011 GETGBL R5 G8 - 0x88180105, // 0012 GETMBR R6 R0 K5 - 0x7C140200, // 0013 CALL R5 1 - 0x00161405, // 0014 ADD R5 K10 R5 - 0x5818000B, // 0015 LDCONST R6 K11 - 0x7C0C0600, // 0016 CALL R3 3 - 0x8C0C010C, // 0017 GETMET R3 R0 K12 - 0x88140105, // 0018 GETMBR R5 R0 K5 - 0x7C0C0400, // 0019 CALL R3 2 - 0x880C0104, // 001A GETMBR R3 R0 K4 - 0x740E0008, // 001B JMPT R3 #0025 - 0x880C010D, // 001C GETMBR R3 R0 K13 - 0x8C0C070E, // 001D GETMET R3 R3 K14 - 0x7C0C0200, // 001E CALL R3 1 - 0x240C0703, // 001F GT R3 R3 K3 - 0x780E0003, // 0020 JMPF R3 #0025 - 0x500C0200, // 0021 LDBOOL R3 1 0 - 0x90020803, // 0022 SETMBR R0 K4 R3 - 0x8C0C010F, // 0023 GETMET R3 R0 K15 - 0x7C0C0200, // 0024 CALL R3 1 - 0x80000000, // 0025 RET 0 + 0x6008000C, // 0001 GETGBL R2 G12 + 0x880C0101, // 0002 GETMBR R3 R0 K1 + 0x7C080200, // 0003 CALL R2 1 + 0x24080502, // 0004 GT R2 R2 K2 + 0x780A0000, // 0005 JMPF R2 #0007 + 0x80000400, // 0006 RET 0 + 0x88080103, // 0007 GETMBR R2 R0 K3 + 0x740A000C, // 0008 JMPT R2 #0016 + 0x8C080105, // 0009 GETMET R2 R0 K5 + 0x7C080200, // 000A CALL R2 1 + 0x90020802, // 000B SETMBR R0 K4 R2 + 0x8C080106, // 000C GETMET R2 R0 K6 + 0x7C080200, // 000D CALL R2 1 + 0xB80A0E00, // 000E GETNGBL R2 K7 + 0x8C080508, // 000F GETMET R2 R2 K8 + 0x60100008, // 0010 GETGBL R4 G8 + 0x88140104, // 0011 GETMBR R5 R0 K4 + 0x7C100200, // 0012 CALL R4 1 + 0x00121204, // 0013 ADD R4 K9 R4 + 0x5814000A, // 0014 LDCONST R5 K10 + 0x7C080600, // 0015 CALL R2 3 + 0x8C08010B, // 0016 GETMET R2 R0 K11 + 0x88100104, // 0017 GETMBR R4 R0 K4 + 0x7C080400, // 0018 CALL R2 2 + 0x88080103, // 0019 GETMBR R2 R0 K3 + 0x740A0008, // 001A JMPT R2 #0024 + 0x8808010C, // 001B GETMBR R2 R0 K12 + 0x8C08050D, // 001C GETMET R2 R2 K13 + 0x7C080200, // 001D CALL R2 1 + 0x24080502, // 001E GT R2 R2 K2 + 0x780A0003, // 001F JMPF R2 #0024 + 0x50080200, // 0020 LDBOOL R2 1 0 + 0x90020602, // 0021 SETMBR R0 K3 R2 + 0x8C08010E, // 0022 GETMET R2 R0 K14 + 0x7C080200, // 0023 CALL R2 1 + 0x80000000, // 0024 RET 0 }) ) ); @@ -4994,7 +4943,7 @@ be_local_closure(Matter_Device_start_mdns_announce_hostnames, /* name */ ********************************************************************/ be_local_closure(Matter_Device_mdns_announce_PASE, /* name */ be_nested_proto( - 13, /* nstack */ + 12, /* nstack */ 1, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -5002,291 +4951,288 @@ be_local_closure(Matter_Device_mdns_announce_PASE, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[43]) { /* constants */ + ( &(const bvalue[41]) { /* constants */ /* K0 */ be_nested_str_weak(mdns), - /* K1 */ be_nested_str_weak(string), - /* K2 */ be_nested_str_weak(crypto), - /* K3 */ be_nested_str_weak(VP), - /* K4 */ be_nested_str_weak(vendorid), - /* K5 */ be_nested_str_weak(_X2B), - /* K6 */ be_nested_str_weak(productid), - /* K7 */ be_nested_str_weak(D), - /* K8 */ be_nested_str_weak(commissioning_discriminator), - /* K9 */ be_nested_str_weak(CM), - /* K10 */ be_const_int(1), - /* K11 */ be_nested_str_weak(T), - /* K12 */ be_const_int(0), - /* K13 */ be_nested_str_weak(SII), - /* K14 */ be_nested_str_weak(SAI), - /* K15 */ be_nested_str_weak(commissioning_instance_wifi), - /* K16 */ be_nested_str_weak(random), - /* K17 */ be_nested_str_weak(tohex), - /* K18 */ be_nested_str_weak(commissioning_instance_eth), - /* K19 */ be_nested_str_weak(hostname_eth), - /* K20 */ be_nested_str_weak(add_service), - /* K21 */ be_nested_str_weak(_matterc), - /* K22 */ be_nested_str_weak(_udp), - /* K23 */ be_nested_str_weak(mdns_pase_eth), - /* K24 */ be_nested_str_weak(tasmota), - /* K25 */ be_nested_str_weak(log), - /* K26 */ be_nested_str_weak(format), - /* K27 */ be_nested_str_weak(MTR_X3A_X20announce_X20mDNS_X20on_X20_X25s_X20_X27_X25s_X27_X20ptr_X20to_X20_X60_X25s_X2Elocal_X60), - /* K28 */ be_nested_str_weak(eth), - /* K29 */ be_const_int(2), - /* K30 */ be_nested_str_weak(_L), - /* K31 */ be_nested_str_weak(MTR_X3A_X20adding_X20subtype_X3A_X20), - /* K32 */ be_const_int(3), - /* K33 */ be_nested_str_weak(add_subtype), - /* K34 */ be_nested_str_weak(_S), - /* K35 */ be_nested_str_weak(_V), - /* K36 */ be_nested_str_weak(_CM1), - /* K37 */ be_nested_str_weak(hostname_wifi), - /* K38 */ be_nested_str_weak(mdns_pase_wifi), - /* K39 */ be_nested_str_weak(MTR_X3A_X20starting_X20mDNS_X20on_X20_X25s_X20_X27_X25s_X27_X20ptr_X20to_X20_X60_X25s_X2Elocal_X60), - /* K40 */ be_nested_str_weak(wifi), - /* K41 */ be_nested_str_weak(MTR_X3A_X20Exception), - /* K42 */ be_nested_str_weak(_X7C), + /* K1 */ be_nested_str_weak(crypto), + /* K2 */ be_nested_str_weak(VP), + /* K3 */ be_nested_str_weak(vendorid), + /* K4 */ be_nested_str_weak(_X2B), + /* K5 */ be_nested_str_weak(productid), + /* K6 */ be_nested_str_weak(D), + /* K7 */ be_nested_str_weak(commissioning_discriminator), + /* K8 */ be_nested_str_weak(CM), + /* K9 */ be_const_int(1), + /* K10 */ be_nested_str_weak(T), + /* K11 */ be_const_int(0), + /* K12 */ be_nested_str_weak(SII), + /* K13 */ be_nested_str_weak(SAI), + /* K14 */ be_nested_str_weak(commissioning_instance_wifi), + /* K15 */ be_nested_str_weak(random), + /* K16 */ be_nested_str_weak(tohex), + /* K17 */ be_nested_str_weak(commissioning_instance_eth), + /* K18 */ be_nested_str_weak(hostname_eth), + /* K19 */ be_nested_str_weak(add_service), + /* K20 */ be_nested_str_weak(_matterc), + /* K21 */ be_nested_str_weak(_udp), + /* K22 */ be_nested_str_weak(mdns_pase_eth), + /* K23 */ be_nested_str_weak(tasmota), + /* K24 */ be_nested_str_weak(log), + /* K25 */ be_nested_str_weak(MTR_X3A_X20announce_X20mDNS_X20on_X20_X25s_X20_X27_X25s_X27_X20ptr_X20to_X20_X60_X25s_X2Elocal_X60), + /* K26 */ be_nested_str_weak(eth), + /* K27 */ be_const_int(2), + /* K28 */ be_nested_str_weak(_L), + /* K29 */ be_nested_str_weak(MTR_X3A_X20adding_X20subtype_X3A_X20), + /* K30 */ be_const_int(3), + /* K31 */ be_nested_str_weak(add_subtype), + /* K32 */ be_nested_str_weak(_S), + /* K33 */ be_nested_str_weak(_V), + /* K34 */ be_nested_str_weak(_CM1), + /* K35 */ be_nested_str_weak(hostname_wifi), + /* K36 */ be_nested_str_weak(mdns_pase_wifi), + /* K37 */ be_nested_str_weak(MTR_X3A_X20starting_X20mDNS_X20on_X20_X25s_X20_X27_X25s_X27_X20ptr_X20to_X20_X60_X25s_X2Elocal_X60), + /* K38 */ be_nested_str_weak(wifi), + /* K39 */ be_nested_str_weak(MTR_X3A_X20Exception), + /* K40 */ be_nested_str_weak(_X7C), }), be_str_weak(mdns_announce_PASE), &be_const_str_solidified, - ( &(const binstruction[237]) { /* code */ + ( &(const binstruction[236]) { /* code */ 0xA4060000, // 0000 IMPORT R1 K0 0xA40A0200, // 0001 IMPORT R2 K1 - 0xA40E0400, // 0002 IMPORT R3 K2 - 0x60100013, // 0003 GETGBL R4 G19 - 0x7C100000, // 0004 CALL R4 0 - 0x60140008, // 0005 GETGBL R5 G8 - 0x88180104, // 0006 GETMBR R6 R0 K4 - 0x7C140200, // 0007 CALL R5 1 - 0x00140B05, // 0008 ADD R5 R5 K5 - 0x60180008, // 0009 GETGBL R6 G8 - 0x881C0106, // 000A GETMBR R7 R0 K6 - 0x7C180200, // 000B CALL R6 1 - 0x00140A06, // 000C ADD R5 R5 R6 - 0x98120605, // 000D SETIDX R4 K3 R5 - 0x88140108, // 000E GETMBR R5 R0 K8 - 0x98120E05, // 000F SETIDX R4 K7 R5 - 0x9812130A, // 0010 SETIDX R4 K9 K10 - 0x9812170C, // 0011 SETIDX R4 K11 K12 - 0x54161387, // 0012 LDINT R5 5000 - 0x98121A05, // 0013 SETIDX R4 K13 R5 - 0x5416012B, // 0014 LDINT R5 300 - 0x98121C05, // 0015 SETIDX R4 K14 R5 - 0x8C140710, // 0016 GETMET R5 R3 K16 - 0x541E0007, // 0017 LDINT R7 8 - 0x7C140400, // 0018 CALL R5 2 - 0x8C140B11, // 0019 GETMET R5 R5 K17 - 0x7C140200, // 001A CALL R5 1 - 0x90021E05, // 001B SETMBR R0 K15 R5 - 0x8C140710, // 001C GETMET R5 R3 K16 - 0x541E0007, // 001D LDINT R7 8 - 0x7C140400, // 001E CALL R5 2 - 0x8C140B11, // 001F GETMET R5 R5 K17 - 0x7C140200, // 0020 CALL R5 1 - 0x90022405, // 0021 SETMBR R0 K18 R5 - 0xA80200B7, // 0022 EXBLK 0 #00DB - 0x88140113, // 0023 GETMBR R5 R0 K19 - 0x78160058, // 0024 JMPF R5 #007E - 0x8C140314, // 0025 GETMET R5 R1 K20 + 0x600C0013, // 0002 GETGBL R3 G19 + 0x7C0C0000, // 0003 CALL R3 0 + 0x60100008, // 0004 GETGBL R4 G8 + 0x88140103, // 0005 GETMBR R5 R0 K3 + 0x7C100200, // 0006 CALL R4 1 + 0x00100904, // 0007 ADD R4 R4 K4 + 0x60140008, // 0008 GETGBL R5 G8 + 0x88180105, // 0009 GETMBR R6 R0 K5 + 0x7C140200, // 000A CALL R5 1 + 0x00100805, // 000B ADD R4 R4 R5 + 0x980E0404, // 000C SETIDX R3 K2 R4 + 0x88100107, // 000D GETMBR R4 R0 K7 + 0x980E0C04, // 000E SETIDX R3 K6 R4 + 0x980E1109, // 000F SETIDX R3 K8 K9 + 0x980E150B, // 0010 SETIDX R3 K10 K11 + 0x54121387, // 0011 LDINT R4 5000 + 0x980E1804, // 0012 SETIDX R3 K12 R4 + 0x5412012B, // 0013 LDINT R4 300 + 0x980E1A04, // 0014 SETIDX R3 K13 R4 + 0x8C10050F, // 0015 GETMET R4 R2 K15 + 0x541A0007, // 0016 LDINT R6 8 + 0x7C100400, // 0017 CALL R4 2 + 0x8C100910, // 0018 GETMET R4 R4 K16 + 0x7C100200, // 0019 CALL R4 1 + 0x90021C04, // 001A SETMBR R0 K14 R4 + 0x8C10050F, // 001B GETMET R4 R2 K15 + 0x541A0007, // 001C LDINT R6 8 + 0x7C100400, // 001D CALL R4 2 + 0x8C100910, // 001E GETMET R4 R4 K16 + 0x7C100200, // 001F CALL R4 1 + 0x90022204, // 0020 SETMBR R0 K17 R4 + 0xA80200B7, // 0021 EXBLK 0 #00DA + 0x88100112, // 0022 GETMBR R4 R0 K18 + 0x78120058, // 0023 JMPF R4 #007D + 0x8C100313, // 0024 GETMET R4 R1 K19 + 0x58180014, // 0025 LDCONST R6 K20 0x581C0015, // 0026 LDCONST R7 K21 - 0x58200016, // 0027 LDCONST R8 K22 - 0x542615A3, // 0028 LDINT R9 5540 - 0x5C280800, // 0029 MOVE R10 R4 + 0x542215A3, // 0027 LDINT R8 5540 + 0x5C240600, // 0028 MOVE R9 R3 + 0x88280111, // 0029 GETMBR R10 R0 K17 0x882C0112, // 002A GETMBR R11 R0 K18 - 0x88300113, // 002B GETMBR R12 R0 K19 - 0x7C140E00, // 002C CALL R5 7 - 0x50140200, // 002D LDBOOL R5 1 0 - 0x90022E05, // 002E SETMBR R0 K23 R5 - 0xB8163000, // 002F GETNGBL R5 K24 - 0x8C140B19, // 0030 GETMET R5 R5 K25 - 0x8C1C051A, // 0031 GETMET R7 R2 K26 - 0x5824001B, // 0032 LDCONST R9 K27 - 0x5828001C, // 0033 LDCONST R10 K28 - 0x882C0112, // 0034 GETMBR R11 R0 K18 - 0x88300113, // 0035 GETMBR R12 R0 K19 - 0x7C1C0A00, // 0036 CALL R7 5 - 0x5820001D, // 0037 LDCONST R8 K29 - 0x7C140600, // 0038 CALL R5 3 - 0x60140008, // 0039 GETGBL R5 G8 - 0x88180108, // 003A GETMBR R6 R0 K8 - 0x541E0FFE, // 003B LDINT R7 4095 - 0x2C180C07, // 003C AND R6 R6 R7 - 0x7C140200, // 003D CALL R5 1 - 0x00163C05, // 003E ADD R5 K30 R5 - 0xB81A3000, // 003F GETNGBL R6 K24 - 0x8C180D19, // 0040 GETMET R6 R6 K25 - 0x00223E05, // 0041 ADD R8 K31 R5 - 0x58240020, // 0042 LDCONST R9 K32 - 0x7C180600, // 0043 CALL R6 3 - 0x8C180321, // 0044 GETMET R6 R1 K33 + 0x7C100E00, // 002B CALL R4 7 + 0x50100200, // 002C LDBOOL R4 1 0 + 0x90022C04, // 002D SETMBR R0 K22 R4 + 0xB8122E00, // 002E GETNGBL R4 K23 + 0x8C100918, // 002F GETMET R4 R4 K24 + 0x60180018, // 0030 GETGBL R6 G24 + 0x581C0019, // 0031 LDCONST R7 K25 + 0x5820001A, // 0032 LDCONST R8 K26 + 0x88240111, // 0033 GETMBR R9 R0 K17 + 0x88280112, // 0034 GETMBR R10 R0 K18 + 0x7C180800, // 0035 CALL R6 4 + 0x581C001B, // 0036 LDCONST R7 K27 + 0x7C100600, // 0037 CALL R4 3 + 0x60100008, // 0038 GETGBL R4 G8 + 0x88140107, // 0039 GETMBR R5 R0 K7 + 0x541A0FFE, // 003A LDINT R6 4095 + 0x2C140A06, // 003B AND R5 R5 R6 + 0x7C100200, // 003C CALL R4 1 + 0x00123804, // 003D ADD R4 K28 R4 + 0xB8162E00, // 003E GETNGBL R5 K23 + 0x8C140B18, // 003F GETMET R5 R5 K24 + 0x001E3A04, // 0040 ADD R7 K29 R4 + 0x5820001E, // 0041 LDCONST R8 K30 + 0x7C140600, // 0042 CALL R5 3 + 0x8C14031F, // 0043 GETMET R5 R1 K31 + 0x581C0014, // 0044 LDCONST R7 K20 0x58200015, // 0045 LDCONST R8 K21 - 0x58240016, // 0046 LDCONST R9 K22 + 0x88240111, // 0046 GETMBR R9 R0 K17 0x88280112, // 0047 GETMBR R10 R0 K18 - 0x882C0113, // 0048 GETMBR R11 R0 K19 - 0x5C300A00, // 0049 MOVE R12 R5 - 0x7C180C00, // 004A CALL R6 6 - 0x60180008, // 004B GETGBL R6 G8 - 0x881C0108, // 004C GETMBR R7 R0 K8 - 0x54220EFF, // 004D LDINT R8 3840 - 0x2C1C0E08, // 004E AND R7 R7 R8 - 0x54220007, // 004F LDINT R8 8 - 0x3C1C0E08, // 0050 SHR R7 R7 R8 - 0x7C180200, // 0051 CALL R6 1 - 0x001A4406, // 0052 ADD R6 K34 R6 - 0x5C140C00, // 0053 MOVE R5 R6 - 0xB81A3000, // 0054 GETNGBL R6 K24 - 0x8C180D19, // 0055 GETMET R6 R6 K25 - 0x00223E05, // 0056 ADD R8 K31 R5 - 0x58240020, // 0057 LDCONST R9 K32 - 0x7C180600, // 0058 CALL R6 3 - 0x8C180321, // 0059 GETMET R6 R1 K33 + 0x5C2C0800, // 0048 MOVE R11 R4 + 0x7C140C00, // 0049 CALL R5 6 + 0x60140008, // 004A GETGBL R5 G8 + 0x88180107, // 004B GETMBR R6 R0 K7 + 0x541E0EFF, // 004C LDINT R7 3840 + 0x2C180C07, // 004D AND R6 R6 R7 + 0x541E0007, // 004E LDINT R7 8 + 0x3C180C07, // 004F SHR R6 R6 R7 + 0x7C140200, // 0050 CALL R5 1 + 0x00164005, // 0051 ADD R5 K32 R5 + 0x5C100A00, // 0052 MOVE R4 R5 + 0xB8162E00, // 0053 GETNGBL R5 K23 + 0x8C140B18, // 0054 GETMET R5 R5 K24 + 0x001E3A04, // 0055 ADD R7 K29 R4 + 0x5820001E, // 0056 LDCONST R8 K30 + 0x7C140600, // 0057 CALL R5 3 + 0x8C14031F, // 0058 GETMET R5 R1 K31 + 0x581C0014, // 0059 LDCONST R7 K20 0x58200015, // 005A LDCONST R8 K21 - 0x58240016, // 005B LDCONST R9 K22 + 0x88240111, // 005B GETMBR R9 R0 K17 0x88280112, // 005C GETMBR R10 R0 K18 - 0x882C0113, // 005D GETMBR R11 R0 K19 - 0x5C300A00, // 005E MOVE R12 R5 - 0x7C180C00, // 005F CALL R6 6 - 0x60180008, // 0060 GETGBL R6 G8 - 0x881C0104, // 0061 GETMBR R7 R0 K4 - 0x7C180200, // 0062 CALL R6 1 - 0x001A4606, // 0063 ADD R6 K35 R6 - 0x5C140C00, // 0064 MOVE R5 R6 - 0xB81A3000, // 0065 GETNGBL R6 K24 - 0x8C180D19, // 0066 GETMET R6 R6 K25 - 0x00223E05, // 0067 ADD R8 K31 R5 - 0x58240020, // 0068 LDCONST R9 K32 - 0x7C180600, // 0069 CALL R6 3 - 0x8C180321, // 006A GETMET R6 R1 K33 + 0x5C2C0800, // 005D MOVE R11 R4 + 0x7C140C00, // 005E CALL R5 6 + 0x60140008, // 005F GETGBL R5 G8 + 0x88180103, // 0060 GETMBR R6 R0 K3 + 0x7C140200, // 0061 CALL R5 1 + 0x00164205, // 0062 ADD R5 K33 R5 + 0x5C100A00, // 0063 MOVE R4 R5 + 0xB8162E00, // 0064 GETNGBL R5 K23 + 0x8C140B18, // 0065 GETMET R5 R5 K24 + 0x001E3A04, // 0066 ADD R7 K29 R4 + 0x5820001E, // 0067 LDCONST R8 K30 + 0x7C140600, // 0068 CALL R5 3 + 0x8C14031F, // 0069 GETMET R5 R1 K31 + 0x581C0014, // 006A LDCONST R7 K20 0x58200015, // 006B LDCONST R8 K21 - 0x58240016, // 006C LDCONST R9 K22 + 0x88240111, // 006C GETMBR R9 R0 K17 0x88280112, // 006D GETMBR R10 R0 K18 - 0x882C0113, // 006E GETMBR R11 R0 K19 - 0x5C300A00, // 006F MOVE R12 R5 - 0x7C180C00, // 0070 CALL R6 6 - 0x58140024, // 0071 LDCONST R5 K36 - 0xB81A3000, // 0072 GETNGBL R6 K24 - 0x8C180D19, // 0073 GETMET R6 R6 K25 - 0x00223E05, // 0074 ADD R8 K31 R5 - 0x58240020, // 0075 LDCONST R9 K32 - 0x7C180600, // 0076 CALL R6 3 - 0x8C180321, // 0077 GETMET R6 R1 K33 + 0x5C2C0800, // 006E MOVE R11 R4 + 0x7C140C00, // 006F CALL R5 6 + 0x58100022, // 0070 LDCONST R4 K34 + 0xB8162E00, // 0071 GETNGBL R5 K23 + 0x8C140B18, // 0072 GETMET R5 R5 K24 + 0x001E3A04, // 0073 ADD R7 K29 R4 + 0x5820001E, // 0074 LDCONST R8 K30 + 0x7C140600, // 0075 CALL R5 3 + 0x8C14031F, // 0076 GETMET R5 R1 K31 + 0x581C0014, // 0077 LDCONST R7 K20 0x58200015, // 0078 LDCONST R8 K21 - 0x58240016, // 0079 LDCONST R9 K22 + 0x88240111, // 0079 GETMBR R9 R0 K17 0x88280112, // 007A GETMBR R10 R0 K18 - 0x882C0113, // 007B GETMBR R11 R0 K19 - 0x5C300A00, // 007C MOVE R12 R5 - 0x7C180C00, // 007D CALL R6 6 - 0x88140125, // 007E GETMBR R5 R0 K37 - 0x78160058, // 007F JMPF R5 #00D9 - 0x8C140314, // 0080 GETMET R5 R1 K20 + 0x5C2C0800, // 007B MOVE R11 R4 + 0x7C140C00, // 007C CALL R5 6 + 0x88100123, // 007D GETMBR R4 R0 K35 + 0x78120058, // 007E JMPF R4 #00D8 + 0x8C100313, // 007F GETMET R4 R1 K19 + 0x58180014, // 0080 LDCONST R6 K20 0x581C0015, // 0081 LDCONST R7 K21 - 0x58200016, // 0082 LDCONST R8 K22 - 0x542615A3, // 0083 LDINT R9 5540 - 0x5C280800, // 0084 MOVE R10 R4 - 0x882C010F, // 0085 GETMBR R11 R0 K15 - 0x88300125, // 0086 GETMBR R12 R0 K37 - 0x7C140E00, // 0087 CALL R5 7 - 0x50140200, // 0088 LDBOOL R5 1 0 - 0x90024C05, // 0089 SETMBR R0 K38 R5 - 0xB8163000, // 008A GETNGBL R5 K24 - 0x8C140B19, // 008B GETMET R5 R5 K25 - 0x8C1C051A, // 008C GETMET R7 R2 K26 - 0x58240027, // 008D LDCONST R9 K39 - 0x58280028, // 008E LDCONST R10 K40 - 0x882C010F, // 008F GETMBR R11 R0 K15 - 0x88300125, // 0090 GETMBR R12 R0 K37 - 0x7C1C0A00, // 0091 CALL R7 5 - 0x58200020, // 0092 LDCONST R8 K32 - 0x7C140600, // 0093 CALL R5 3 - 0x60140008, // 0094 GETGBL R5 G8 - 0x88180108, // 0095 GETMBR R6 R0 K8 - 0x541E0FFE, // 0096 LDINT R7 4095 - 0x2C180C07, // 0097 AND R6 R6 R7 - 0x7C140200, // 0098 CALL R5 1 - 0x00163C05, // 0099 ADD R5 K30 R5 - 0xB81A3000, // 009A GETNGBL R6 K24 - 0x8C180D19, // 009B GETMET R6 R6 K25 - 0x00223E05, // 009C ADD R8 K31 R5 - 0x58240020, // 009D LDCONST R9 K32 - 0x7C180600, // 009E CALL R6 3 - 0x8C180321, // 009F GETMET R6 R1 K33 + 0x542215A3, // 0082 LDINT R8 5540 + 0x5C240600, // 0083 MOVE R9 R3 + 0x8828010E, // 0084 GETMBR R10 R0 K14 + 0x882C0123, // 0085 GETMBR R11 R0 K35 + 0x7C100E00, // 0086 CALL R4 7 + 0x50100200, // 0087 LDBOOL R4 1 0 + 0x90024804, // 0088 SETMBR R0 K36 R4 + 0xB8122E00, // 0089 GETNGBL R4 K23 + 0x8C100918, // 008A GETMET R4 R4 K24 + 0x60180018, // 008B GETGBL R6 G24 + 0x581C0025, // 008C LDCONST R7 K37 + 0x58200026, // 008D LDCONST R8 K38 + 0x8824010E, // 008E GETMBR R9 R0 K14 + 0x88280123, // 008F GETMBR R10 R0 K35 + 0x7C180800, // 0090 CALL R6 4 + 0x581C001E, // 0091 LDCONST R7 K30 + 0x7C100600, // 0092 CALL R4 3 + 0x60100008, // 0093 GETGBL R4 G8 + 0x88140107, // 0094 GETMBR R5 R0 K7 + 0x541A0FFE, // 0095 LDINT R6 4095 + 0x2C140A06, // 0096 AND R5 R5 R6 + 0x7C100200, // 0097 CALL R4 1 + 0x00123804, // 0098 ADD R4 K28 R4 + 0xB8162E00, // 0099 GETNGBL R5 K23 + 0x8C140B18, // 009A GETMET R5 R5 K24 + 0x001E3A04, // 009B ADD R7 K29 R4 + 0x5820001E, // 009C LDCONST R8 K30 + 0x7C140600, // 009D CALL R5 3 + 0x8C14031F, // 009E GETMET R5 R1 K31 + 0x581C0014, // 009F LDCONST R7 K20 0x58200015, // 00A0 LDCONST R8 K21 - 0x58240016, // 00A1 LDCONST R9 K22 - 0x8828010F, // 00A2 GETMBR R10 R0 K15 - 0x882C0125, // 00A3 GETMBR R11 R0 K37 - 0x5C300A00, // 00A4 MOVE R12 R5 - 0x7C180C00, // 00A5 CALL R6 6 - 0x60180008, // 00A6 GETGBL R6 G8 - 0x881C0108, // 00A7 GETMBR R7 R0 K8 - 0x54220EFF, // 00A8 LDINT R8 3840 - 0x2C1C0E08, // 00A9 AND R7 R7 R8 - 0x54220007, // 00AA LDINT R8 8 - 0x3C1C0E08, // 00AB SHR R7 R7 R8 - 0x7C180200, // 00AC CALL R6 1 - 0x001A4406, // 00AD ADD R6 K34 R6 - 0x5C140C00, // 00AE MOVE R5 R6 - 0xB81A3000, // 00AF GETNGBL R6 K24 - 0x8C180D19, // 00B0 GETMET R6 R6 K25 - 0x00223E05, // 00B1 ADD R8 K31 R5 - 0x58240020, // 00B2 LDCONST R9 K32 - 0x7C180600, // 00B3 CALL R6 3 - 0x8C180321, // 00B4 GETMET R6 R1 K33 + 0x8824010E, // 00A1 GETMBR R9 R0 K14 + 0x88280123, // 00A2 GETMBR R10 R0 K35 + 0x5C2C0800, // 00A3 MOVE R11 R4 + 0x7C140C00, // 00A4 CALL R5 6 + 0x60140008, // 00A5 GETGBL R5 G8 + 0x88180107, // 00A6 GETMBR R6 R0 K7 + 0x541E0EFF, // 00A7 LDINT R7 3840 + 0x2C180C07, // 00A8 AND R6 R6 R7 + 0x541E0007, // 00A9 LDINT R7 8 + 0x3C180C07, // 00AA SHR R6 R6 R7 + 0x7C140200, // 00AB CALL R5 1 + 0x00164005, // 00AC ADD R5 K32 R5 + 0x5C100A00, // 00AD MOVE R4 R5 + 0xB8162E00, // 00AE GETNGBL R5 K23 + 0x8C140B18, // 00AF GETMET R5 R5 K24 + 0x001E3A04, // 00B0 ADD R7 K29 R4 + 0x5820001E, // 00B1 LDCONST R8 K30 + 0x7C140600, // 00B2 CALL R5 3 + 0x8C14031F, // 00B3 GETMET R5 R1 K31 + 0x581C0014, // 00B4 LDCONST R7 K20 0x58200015, // 00B5 LDCONST R8 K21 - 0x58240016, // 00B6 LDCONST R9 K22 - 0x8828010F, // 00B7 GETMBR R10 R0 K15 - 0x882C0125, // 00B8 GETMBR R11 R0 K37 - 0x5C300A00, // 00B9 MOVE R12 R5 - 0x7C180C00, // 00BA CALL R6 6 - 0x60180008, // 00BB GETGBL R6 G8 - 0x881C0104, // 00BC GETMBR R7 R0 K4 - 0x7C180200, // 00BD CALL R6 1 - 0x001A4606, // 00BE ADD R6 K35 R6 - 0x5C140C00, // 00BF MOVE R5 R6 - 0xB81A3000, // 00C0 GETNGBL R6 K24 - 0x8C180D19, // 00C1 GETMET R6 R6 K25 - 0x00223E05, // 00C2 ADD R8 K31 R5 - 0x58240020, // 00C3 LDCONST R9 K32 - 0x7C180600, // 00C4 CALL R6 3 - 0x8C180321, // 00C5 GETMET R6 R1 K33 + 0x8824010E, // 00B6 GETMBR R9 R0 K14 + 0x88280123, // 00B7 GETMBR R10 R0 K35 + 0x5C2C0800, // 00B8 MOVE R11 R4 + 0x7C140C00, // 00B9 CALL R5 6 + 0x60140008, // 00BA GETGBL R5 G8 + 0x88180103, // 00BB GETMBR R6 R0 K3 + 0x7C140200, // 00BC CALL R5 1 + 0x00164205, // 00BD ADD R5 K33 R5 + 0x5C100A00, // 00BE MOVE R4 R5 + 0xB8162E00, // 00BF GETNGBL R5 K23 + 0x8C140B18, // 00C0 GETMET R5 R5 K24 + 0x001E3A04, // 00C1 ADD R7 K29 R4 + 0x5820001E, // 00C2 LDCONST R8 K30 + 0x7C140600, // 00C3 CALL R5 3 + 0x8C14031F, // 00C4 GETMET R5 R1 K31 + 0x581C0014, // 00C5 LDCONST R7 K20 0x58200015, // 00C6 LDCONST R8 K21 - 0x58240016, // 00C7 LDCONST R9 K22 - 0x8828010F, // 00C8 GETMBR R10 R0 K15 - 0x882C0125, // 00C9 GETMBR R11 R0 K37 - 0x5C300A00, // 00CA MOVE R12 R5 - 0x7C180C00, // 00CB CALL R6 6 - 0x58140024, // 00CC LDCONST R5 K36 - 0xB81A3000, // 00CD GETNGBL R6 K24 - 0x8C180D19, // 00CE GETMET R6 R6 K25 - 0x00223E05, // 00CF ADD R8 K31 R5 - 0x58240020, // 00D0 LDCONST R9 K32 - 0x7C180600, // 00D1 CALL R6 3 - 0x8C180321, // 00D2 GETMET R6 R1 K33 + 0x8824010E, // 00C7 GETMBR R9 R0 K14 + 0x88280123, // 00C8 GETMBR R10 R0 K35 + 0x5C2C0800, // 00C9 MOVE R11 R4 + 0x7C140C00, // 00CA CALL R5 6 + 0x58100022, // 00CB LDCONST R4 K34 + 0xB8162E00, // 00CC GETNGBL R5 K23 + 0x8C140B18, // 00CD GETMET R5 R5 K24 + 0x001E3A04, // 00CE ADD R7 K29 R4 + 0x5820001E, // 00CF LDCONST R8 K30 + 0x7C140600, // 00D0 CALL R5 3 + 0x8C14031F, // 00D1 GETMET R5 R1 K31 + 0x581C0014, // 00D2 LDCONST R7 K20 0x58200015, // 00D3 LDCONST R8 K21 - 0x58240016, // 00D4 LDCONST R9 K22 - 0x8828010F, // 00D5 GETMBR R10 R0 K15 - 0x882C0125, // 00D6 GETMBR R11 R0 K37 - 0x5C300A00, // 00D7 MOVE R12 R5 - 0x7C180C00, // 00D8 CALL R6 6 - 0xA8040001, // 00D9 EXBLK 1 1 - 0x70020010, // 00DA JMP #00EC - 0xAC140002, // 00DB CATCH R5 0 2 - 0x7002000D, // 00DC JMP #00EB - 0xB81E3000, // 00DD GETNGBL R7 K24 - 0x8C1C0F19, // 00DE GETMET R7 R7 K25 - 0x60240008, // 00DF GETGBL R9 G8 - 0x5C280A00, // 00E0 MOVE R10 R5 - 0x7C240200, // 00E1 CALL R9 1 - 0x00265209, // 00E2 ADD R9 K41 R9 - 0x0024132A, // 00E3 ADD R9 R9 K42 - 0x60280008, // 00E4 GETGBL R10 G8 - 0x5C2C0C00, // 00E5 MOVE R11 R6 - 0x7C280200, // 00E6 CALL R10 1 - 0x0024120A, // 00E7 ADD R9 R9 R10 - 0x5828001D, // 00E8 LDCONST R10 K29 - 0x7C1C0600, // 00E9 CALL R7 3 - 0x70020000, // 00EA JMP #00EC - 0xB0080000, // 00EB RAISE 2 R0 R0 - 0x80000000, // 00EC RET 0 + 0x8824010E, // 00D4 GETMBR R9 R0 K14 + 0x88280123, // 00D5 GETMBR R10 R0 K35 + 0x5C2C0800, // 00D6 MOVE R11 R4 + 0x7C140C00, // 00D7 CALL R5 6 + 0xA8040001, // 00D8 EXBLK 1 1 + 0x70020010, // 00D9 JMP #00EB + 0xAC100002, // 00DA CATCH R4 0 2 + 0x7002000D, // 00DB JMP #00EA + 0xB81A2E00, // 00DC GETNGBL R6 K23 + 0x8C180D18, // 00DD GETMET R6 R6 K24 + 0x60200008, // 00DE GETGBL R8 G8 + 0x5C240800, // 00DF MOVE R9 R4 + 0x7C200200, // 00E0 CALL R8 1 + 0x00224E08, // 00E1 ADD R8 K39 R8 + 0x00201128, // 00E2 ADD R8 R8 K40 + 0x60240008, // 00E3 GETGBL R9 G8 + 0x5C280A00, // 00E4 MOVE R10 R5 + 0x7C240200, // 00E5 CALL R9 1 + 0x00201009, // 00E6 ADD R8 R8 R9 + 0x5824001B, // 00E7 LDCONST R9 K27 + 0x7C180600, // 00E8 CALL R6 3 + 0x70020000, // 00E9 JMP #00EB + 0xB0080000, // 00EA RAISE 2 R0 R0 + 0x80000000, // 00EB RET 0 }) ) ); diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Fabric.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Fabric.h index 7e77814f7..af3123804 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Fabric.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Fabric.h @@ -11,7 +11,7 @@ extern const bclass be_class_Matter_Fabric; ********************************************************************/ be_local_closure(Matter_Fabric_counter_group_data_snd_next, /* name */ be_nested_proto( - 9, /* nstack */ + 7, /* nstack */ 1, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -19,54 +19,51 @@ be_local_closure(Matter_Fabric_counter_group_data_snd_next, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[15]) { /* constants */ - /* K0 */ be_nested_str_weak(string), - /* K1 */ be_nested_str_weak(_counter_group_data_snd_impl), - /* K2 */ be_nested_str_weak(next), - /* K3 */ be_nested_str_weak(tasmota), - /* K4 */ be_nested_str_weak(log), - /* K5 */ be_nested_str_weak(format), - /* K6 */ be_nested_str_weak(MTR_X3A_X20_X2E_X20_X20_X20_X20_X20_X20_X20_X20_X20_X20Counter_group_data_snd_X3D_X25i), - /* K7 */ be_const_int(3), - /* K8 */ be_nested_str_weak(matter), - /* K9 */ be_nested_str_weak(Counter), - /* K10 */ be_nested_str_weak(is_greater), - /* K11 */ be_nested_str_weak(counter_group_data_snd), - /* K12 */ be_nested_str_weak(_GROUP_SND_INCR), - /* K13 */ be_nested_str_weak(does_persist), - /* K14 */ be_nested_str_weak(save), + ( &(const bvalue[13]) { /* constants */ + /* K0 */ be_nested_str_weak(_counter_group_data_snd_impl), + /* K1 */ be_nested_str_weak(next), + /* K2 */ be_nested_str_weak(tasmota), + /* K3 */ be_nested_str_weak(log), + /* K4 */ be_nested_str_weak(MTR_X3A_X20_X2E_X20_X20_X20_X20_X20_X20_X20_X20_X20_X20Counter_group_data_snd_X3D_X25i), + /* K5 */ be_const_int(3), + /* K6 */ be_nested_str_weak(matter), + /* K7 */ be_nested_str_weak(Counter), + /* K8 */ be_nested_str_weak(is_greater), + /* K9 */ be_nested_str_weak(counter_group_data_snd), + /* K10 */ be_nested_str_weak(_GROUP_SND_INCR), + /* K11 */ be_nested_str_weak(does_persist), + /* K12 */ be_nested_str_weak(save), }), be_str_weak(counter_group_data_snd_next), &be_const_str_solidified, - ( &(const binstruction[28]) { /* code */ - 0xA4060000, // 0000 IMPORT R1 K0 - 0x88080101, // 0001 GETMBR R2 R0 K1 - 0x8C080502, // 0002 GETMET R2 R2 K2 - 0x7C080200, // 0003 CALL R2 1 - 0xB80E0600, // 0004 GETNGBL R3 K3 - 0x8C0C0704, // 0005 GETMET R3 R3 K4 - 0x8C140305, // 0006 GETMET R5 R1 K5 - 0x581C0006, // 0007 LDCONST R7 K6 - 0x5C200400, // 0008 MOVE R8 R2 - 0x7C140600, // 0009 CALL R5 3 - 0x58180007, // 000A LDCONST R6 K7 - 0x7C0C0600, // 000B CALL R3 3 - 0xB80E1000, // 000C GETNGBL R3 K8 - 0x880C0709, // 000D GETMBR R3 R3 K9 - 0x8C0C070A, // 000E GETMET R3 R3 K10 - 0x5C140400, // 000F MOVE R5 R2 - 0x8818010B, // 0010 GETMBR R6 R0 K11 - 0x7C0C0600, // 0011 CALL R3 3 - 0x780E0007, // 0012 JMPF R3 #001B - 0x880C010C, // 0013 GETMBR R3 R0 K12 - 0x000C0403, // 0014 ADD R3 R2 R3 - 0x90021603, // 0015 SETMBR R0 K11 R3 - 0x8C0C010D, // 0016 GETMET R3 R0 K13 - 0x7C0C0200, // 0017 CALL R3 1 - 0x780E0001, // 0018 JMPF R3 #001B - 0x8C0C010E, // 0019 GETMET R3 R0 K14 - 0x7C0C0200, // 001A CALL R3 1 - 0x80040400, // 001B RET 1 R2 + ( &(const binstruction[27]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x8C040301, // 0001 GETMET R1 R1 K1 + 0x7C040200, // 0002 CALL R1 1 + 0xB80A0400, // 0003 GETNGBL R2 K2 + 0x8C080503, // 0004 GETMET R2 R2 K3 + 0x60100018, // 0005 GETGBL R4 G24 + 0x58140004, // 0006 LDCONST R5 K4 + 0x5C180200, // 0007 MOVE R6 R1 + 0x7C100400, // 0008 CALL R4 2 + 0x58140005, // 0009 LDCONST R5 K5 + 0x7C080600, // 000A CALL R2 3 + 0xB80A0C00, // 000B GETNGBL R2 K6 + 0x88080507, // 000C GETMBR R2 R2 K7 + 0x8C080508, // 000D GETMET R2 R2 K8 + 0x5C100200, // 000E MOVE R4 R1 + 0x88140109, // 000F GETMBR R5 R0 K9 + 0x7C080600, // 0010 CALL R2 3 + 0x780A0007, // 0011 JMPF R2 #001A + 0x8808010A, // 0012 GETMBR R2 R0 K10 + 0x00080202, // 0013 ADD R2 R1 R2 + 0x90021202, // 0014 SETMBR R0 K9 R2 + 0x8C08010B, // 0015 GETMET R2 R0 K11 + 0x7C080200, // 0016 CALL R2 1 + 0x780A0001, // 0017 JMPF R2 #001A + 0x8C08010C, // 0018 GETMET R2 R0 K12 + 0x7C080200, // 0019 CALL R2 1 + 0x80040200, // 001A RET 1 R1 }) ) ); @@ -493,7 +490,7 @@ be_local_closure(Matter_Fabric_fabric_completed, /* name */ ********************************************************************/ be_local_closure(Matter_Fabric_counter_group_ctrl_snd_next, /* name */ be_nested_proto( - 9, /* nstack */ + 7, /* nstack */ 1, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -501,54 +498,51 @@ be_local_closure(Matter_Fabric_counter_group_ctrl_snd_next, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[15]) { /* constants */ - /* K0 */ be_nested_str_weak(string), - /* K1 */ be_nested_str_weak(_counter_group_ctrl_snd_impl), - /* K2 */ be_nested_str_weak(next), - /* K3 */ be_nested_str_weak(tasmota), - /* K4 */ be_nested_str_weak(log), - /* K5 */ be_nested_str_weak(format), - /* K6 */ be_nested_str_weak(MTR_X3A_X20_X2E_X20_X20_X20_X20_X20_X20_X20_X20_X20_X20Counter_group_ctrl_snd_X3D_X25i), - /* K7 */ be_const_int(3), - /* K8 */ be_nested_str_weak(matter), - /* K9 */ be_nested_str_weak(Counter), - /* K10 */ be_nested_str_weak(is_greater), - /* K11 */ be_nested_str_weak(counter_group_ctrl_snd), - /* K12 */ be_nested_str_weak(_GROUP_SND_INCR), - /* K13 */ be_nested_str_weak(does_persist), - /* K14 */ be_nested_str_weak(save), + ( &(const bvalue[13]) { /* constants */ + /* K0 */ be_nested_str_weak(_counter_group_ctrl_snd_impl), + /* K1 */ be_nested_str_weak(next), + /* K2 */ be_nested_str_weak(tasmota), + /* K3 */ be_nested_str_weak(log), + /* K4 */ be_nested_str_weak(MTR_X3A_X20_X2E_X20_X20_X20_X20_X20_X20_X20_X20_X20_X20Counter_group_ctrl_snd_X3D_X25i), + /* K5 */ be_const_int(3), + /* K6 */ be_nested_str_weak(matter), + /* K7 */ be_nested_str_weak(Counter), + /* K8 */ be_nested_str_weak(is_greater), + /* K9 */ be_nested_str_weak(counter_group_ctrl_snd), + /* K10 */ be_nested_str_weak(_GROUP_SND_INCR), + /* K11 */ be_nested_str_weak(does_persist), + /* K12 */ be_nested_str_weak(save), }), be_str_weak(counter_group_ctrl_snd_next), &be_const_str_solidified, - ( &(const binstruction[28]) { /* code */ - 0xA4060000, // 0000 IMPORT R1 K0 - 0x88080101, // 0001 GETMBR R2 R0 K1 - 0x8C080502, // 0002 GETMET R2 R2 K2 - 0x7C080200, // 0003 CALL R2 1 - 0xB80E0600, // 0004 GETNGBL R3 K3 - 0x8C0C0704, // 0005 GETMET R3 R3 K4 - 0x8C140305, // 0006 GETMET R5 R1 K5 - 0x581C0006, // 0007 LDCONST R7 K6 - 0x5C200400, // 0008 MOVE R8 R2 - 0x7C140600, // 0009 CALL R5 3 - 0x58180007, // 000A LDCONST R6 K7 - 0x7C0C0600, // 000B CALL R3 3 - 0xB80E1000, // 000C GETNGBL R3 K8 - 0x880C0709, // 000D GETMBR R3 R3 K9 - 0x8C0C070A, // 000E GETMET R3 R3 K10 - 0x5C140400, // 000F MOVE R5 R2 - 0x8818010B, // 0010 GETMBR R6 R0 K11 - 0x7C0C0600, // 0011 CALL R3 3 - 0x780E0007, // 0012 JMPF R3 #001B - 0x880C010C, // 0013 GETMBR R3 R0 K12 - 0x000C0403, // 0014 ADD R3 R2 R3 - 0x90021603, // 0015 SETMBR R0 K11 R3 - 0x8C0C010D, // 0016 GETMET R3 R0 K13 - 0x7C0C0200, // 0017 CALL R3 1 - 0x780E0001, // 0018 JMPF R3 #001B - 0x8C0C010E, // 0019 GETMET R3 R0 K14 - 0x7C0C0200, // 001A CALL R3 1 - 0x80040400, // 001B RET 1 R2 + ( &(const binstruction[27]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x8C040301, // 0001 GETMET R1 R1 K1 + 0x7C040200, // 0002 CALL R1 1 + 0xB80A0400, // 0003 GETNGBL R2 K2 + 0x8C080503, // 0004 GETMET R2 R2 K3 + 0x60100018, // 0005 GETGBL R4 G24 + 0x58140004, // 0006 LDCONST R5 K4 + 0x5C180200, // 0007 MOVE R6 R1 + 0x7C100400, // 0008 CALL R4 2 + 0x58140005, // 0009 LDCONST R5 K5 + 0x7C080600, // 000A CALL R2 3 + 0xB80A0C00, // 000B GETNGBL R2 K6 + 0x88080507, // 000C GETMBR R2 R2 K7 + 0x8C080508, // 000D GETMET R2 R2 K8 + 0x5C100200, // 000E MOVE R4 R1 + 0x88140109, // 000F GETMBR R5 R0 K9 + 0x7C080600, // 0010 CALL R2 3 + 0x780A0007, // 0011 JMPF R2 #001A + 0x8808010A, // 0012 GETMBR R2 R0 K10 + 0x00080202, // 0013 ADD R2 R1 R2 + 0x90021202, // 0014 SETMBR R0 K9 R2 + 0x8C08010B, // 0015 GETMET R2 R0 K11 + 0x7C080200, // 0016 CALL R2 1 + 0x780A0001, // 0017 JMPF R2 #001A + 0x8C08010C, // 0018 GETMET R2 R0 K12 + 0x7C080200, // 0019 CALL R2 1 + 0x80040200, // 001A RET 1 R1 }) ) ); @@ -587,7 +581,7 @@ be_local_closure(Matter_Fabric_get_ipk_epoch_key, /* name */ ********************************************************************/ be_local_closure(Matter_Fabric_tojson, /* name */ be_nested_proto( - 18, /* nstack */ + 16, /* nstack */ 1, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -595,160 +589,157 @@ be_local_closure(Matter_Fabric_tojson, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[29]) { /* constants */ + ( &(const bvalue[27]) { /* constants */ /* K0 */ be_nested_str_weak(json), - /* K1 */ be_nested_str_weak(string), - /* K2 */ be_nested_str_weak(introspect), - /* K3 */ be_nested_str_weak(persist_pre), - /* K4 */ be_nested_str_weak(members), - /* K5 */ be_nested_str_weak(get), - /* K6 */ be_nested_str_weak(function), - /* K7 */ be_const_int(0), - /* K8 */ be_nested_str_weak(_), - /* K9 */ be_nested_str_weak(push), - /* K10 */ be_nested_str_weak(stop_iteration), - /* K11 */ be_nested_str_weak(matter), - /* K12 */ be_nested_str_weak(sort), - /* K13 */ be_nested_str_weak(_X24_X24), - /* K14 */ be_nested_str_weak(tob64), - /* K15 */ be_nested_str_weak(format), - /* K16 */ be_nested_str_weak(_X25s_X3A_X25s), - /* K17 */ be_nested_str_weak(dump), - /* K18 */ be_nested_str_weak(_sessions), - /* K19 */ be_nested_str_weak(persistables), - /* K20 */ be_nested_str_weak(tojson), - /* K21 */ be_nested_str_weak(_X5B), - /* K22 */ be_nested_str_weak(concat), - /* K23 */ be_nested_str_weak(_X2C), - /* K24 */ be_nested_str_weak(_X5D), - /* K25 */ be_nested_str_weak(_X22_sessions_X22_X3A), - /* K26 */ be_nested_str_weak(persist_post), - /* K27 */ be_nested_str_weak(_X7B), - /* K28 */ be_nested_str_weak(_X7D), + /* K1 */ be_nested_str_weak(introspect), + /* K2 */ be_nested_str_weak(persist_pre), + /* K3 */ be_nested_str_weak(members), + /* K4 */ be_nested_str_weak(get), + /* K5 */ be_nested_str_weak(function), + /* K6 */ be_const_int(0), + /* K7 */ be_nested_str_weak(_), + /* K8 */ be_nested_str_weak(push), + /* K9 */ be_nested_str_weak(stop_iteration), + /* K10 */ be_nested_str_weak(matter), + /* K11 */ be_nested_str_weak(sort), + /* K12 */ be_nested_str_weak(_X24_X24), + /* K13 */ be_nested_str_weak(tob64), + /* K14 */ be_nested_str_weak(_X25s_X3A_X25s), + /* K15 */ be_nested_str_weak(dump), + /* K16 */ be_nested_str_weak(_sessions), + /* K17 */ be_nested_str_weak(persistables), + /* K18 */ be_nested_str_weak(tojson), + /* K19 */ be_nested_str_weak(_X5B), + /* K20 */ be_nested_str_weak(concat), + /* K21 */ be_nested_str_weak(_X2C), + /* K22 */ be_nested_str_weak(_X5D), + /* K23 */ be_nested_str_weak(_X22_sessions_X22_X3A), + /* K24 */ be_nested_str_weak(persist_post), + /* K25 */ be_nested_str_weak(_X7B), + /* K26 */ be_nested_str_weak(_X7D), }), be_str_weak(tojson), &be_const_str_solidified, - ( &(const binstruction[120]) { /* code */ + ( &(const binstruction[119]) { /* code */ 0xA4060000, // 0000 IMPORT R1 K0 0xA40A0200, // 0001 IMPORT R2 K1 - 0xA40E0400, // 0002 IMPORT R3 K2 - 0x8C100103, // 0003 GETMET R4 R0 K3 - 0x7C100200, // 0004 CALL R4 1 - 0x60100012, // 0005 GETGBL R4 G18 - 0x7C100000, // 0006 CALL R4 0 - 0x60140010, // 0007 GETGBL R5 G16 - 0x8C180704, // 0008 GETMET R6 R3 K4 - 0x5C200000, // 0009 MOVE R8 R0 - 0x7C180400, // 000A CALL R6 2 - 0x7C140200, // 000B CALL R5 1 - 0xA8020011, // 000C EXBLK 0 #001F - 0x5C180A00, // 000D MOVE R6 R5 - 0x7C180000, // 000E CALL R6 0 - 0x8C1C0705, // 000F GETMET R7 R3 K5 - 0x5C240000, // 0010 MOVE R9 R0 - 0x5C280C00, // 0011 MOVE R10 R6 - 0x7C1C0600, // 0012 CALL R7 3 - 0x60200004, // 0013 GETGBL R8 G4 - 0x5C240E00, // 0014 MOVE R9 R7 - 0x7C200200, // 0015 CALL R8 1 - 0x20201106, // 0016 NE R8 R8 K6 - 0x78220005, // 0017 JMPF R8 #001E - 0x94200D07, // 0018 GETIDX R8 R6 K7 - 0x20201108, // 0019 NE R8 R8 K8 - 0x78220002, // 001A JMPF R8 #001E - 0x8C200909, // 001B GETMET R8 R4 K9 - 0x5C280C00, // 001C MOVE R10 R6 - 0x7C200400, // 001D CALL R8 2 - 0x7001FFED, // 001E JMP #000D - 0x5814000A, // 001F LDCONST R5 K10 - 0xAC140200, // 0020 CATCH R5 1 0 - 0xB0080000, // 0021 RAISE 2 R0 R0 - 0xB8161600, // 0022 GETNGBL R5 K11 - 0x8C140B0C, // 0023 GETMET R5 R5 K12 - 0x5C1C0800, // 0024 MOVE R7 R4 - 0x7C140400, // 0025 CALL R5 2 - 0x5C100A00, // 0026 MOVE R4 R5 - 0x60140012, // 0027 GETGBL R5 G18 - 0x7C140000, // 0028 CALL R5 0 - 0x60180010, // 0029 GETGBL R6 G16 - 0x5C1C0800, // 002A MOVE R7 R4 - 0x7C180200, // 002B CALL R6 1 - 0xA8020020, // 002C EXBLK 0 #004E - 0x5C1C0C00, // 002D MOVE R7 R6 - 0x7C1C0000, // 002E CALL R7 0 - 0x8C200705, // 002F GETMET R8 R3 K5 - 0x5C280000, // 0030 MOVE R10 R0 - 0x5C2C0E00, // 0031 MOVE R11 R7 - 0x7C200600, // 0032 CALL R8 3 - 0x4C240000, // 0033 LDNIL R9 - 0x1C241009, // 0034 EQ R9 R8 R9 - 0x78260000, // 0035 JMPF R9 #0037 - 0x7001FFF5, // 0036 JMP #002D - 0x6024000F, // 0037 GETGBL R9 G15 - 0x5C281000, // 0038 MOVE R10 R8 - 0x602C0015, // 0039 GETGBL R11 G21 - 0x7C240400, // 003A CALL R9 2 - 0x78260003, // 003B JMPF R9 #0040 - 0x8C24110E, // 003C GETMET R9 R8 K14 - 0x7C240200, // 003D CALL R9 1 - 0x00261A09, // 003E ADD R9 K13 R9 - 0x5C201200, // 003F MOVE R8 R9 - 0x8C240B09, // 0040 GETMET R9 R5 K9 - 0x8C2C050F, // 0041 GETMET R11 R2 K15 - 0x58340010, // 0042 LDCONST R13 K16 - 0x8C380311, // 0043 GETMET R14 R1 K17 - 0x60400008, // 0044 GETGBL R16 G8 - 0x5C440E00, // 0045 MOVE R17 R7 - 0x7C400200, // 0046 CALL R16 1 - 0x7C380400, // 0047 CALL R14 2 - 0x8C3C0311, // 0048 GETMET R15 R1 K17 - 0x5C441000, // 0049 MOVE R17 R8 - 0x7C3C0400, // 004A CALL R15 2 - 0x7C2C0800, // 004B CALL R11 4 - 0x7C240400, // 004C CALL R9 2 - 0x7001FFDE, // 004D JMP #002D - 0x5818000A, // 004E LDCONST R6 K10 - 0xAC180200, // 004F CATCH R6 1 0 - 0xB0080000, // 0050 RAISE 2 R0 R0 - 0x60180012, // 0051 GETGBL R6 G18 - 0x7C180000, // 0052 CALL R6 0 - 0x601C0010, // 0053 GETGBL R7 G16 - 0x88200112, // 0054 GETMBR R8 R0 K18 - 0x8C201113, // 0055 GETMET R8 R8 K19 - 0x7C200200, // 0056 CALL R8 1 - 0x7C1C0200, // 0057 CALL R7 1 - 0xA8020006, // 0058 EXBLK 0 #0060 - 0x5C200E00, // 0059 MOVE R8 R7 - 0x7C200000, // 005A CALL R8 0 - 0x8C240D09, // 005B GETMET R9 R6 K9 - 0x8C2C1114, // 005C GETMET R11 R8 K20 - 0x7C2C0200, // 005D CALL R11 1 - 0x7C240400, // 005E CALL R9 2 - 0x7001FFF8, // 005F JMP #0059 - 0x581C000A, // 0060 LDCONST R7 K10 - 0xAC1C0200, // 0061 CATCH R7 1 0 - 0xB0080000, // 0062 RAISE 2 R0 R0 - 0x601C000C, // 0063 GETGBL R7 G12 - 0x5C200C00, // 0064 MOVE R8 R6 - 0x7C1C0200, // 0065 CALL R7 1 - 0x241C0F07, // 0066 GT R7 R7 K7 - 0x781E0007, // 0067 JMPF R7 #0070 - 0x8C1C0D16, // 0068 GETMET R7 R6 K22 - 0x58240017, // 0069 LDCONST R9 K23 - 0x7C1C0400, // 006A CALL R7 2 - 0x001E2A07, // 006B ADD R7 K21 R7 - 0x001C0F18, // 006C ADD R7 R7 K24 - 0x8C200B09, // 006D GETMET R8 R5 K9 - 0x002A3207, // 006E ADD R10 K25 R7 - 0x7C200400, // 006F CALL R8 2 - 0x8C1C011A, // 0070 GETMET R7 R0 K26 - 0x7C1C0200, // 0071 CALL R7 1 - 0x8C1C0B16, // 0072 GETMET R7 R5 K22 - 0x58240017, // 0073 LDCONST R9 K23 - 0x7C1C0400, // 0074 CALL R7 2 - 0x001E3607, // 0075 ADD R7 K27 R7 - 0x001C0F1C, // 0076 ADD R7 R7 K28 - 0x80040E00, // 0077 RET 1 R7 + 0x8C0C0102, // 0002 GETMET R3 R0 K2 + 0x7C0C0200, // 0003 CALL R3 1 + 0x600C0012, // 0004 GETGBL R3 G18 + 0x7C0C0000, // 0005 CALL R3 0 + 0x60100010, // 0006 GETGBL R4 G16 + 0x8C140503, // 0007 GETMET R5 R2 K3 + 0x5C1C0000, // 0008 MOVE R7 R0 + 0x7C140400, // 0009 CALL R5 2 + 0x7C100200, // 000A CALL R4 1 + 0xA8020011, // 000B EXBLK 0 #001E + 0x5C140800, // 000C MOVE R5 R4 + 0x7C140000, // 000D CALL R5 0 + 0x8C180504, // 000E GETMET R6 R2 K4 + 0x5C200000, // 000F MOVE R8 R0 + 0x5C240A00, // 0010 MOVE R9 R5 + 0x7C180600, // 0011 CALL R6 3 + 0x601C0004, // 0012 GETGBL R7 G4 + 0x5C200C00, // 0013 MOVE R8 R6 + 0x7C1C0200, // 0014 CALL R7 1 + 0x201C0F05, // 0015 NE R7 R7 K5 + 0x781E0005, // 0016 JMPF R7 #001D + 0x941C0B06, // 0017 GETIDX R7 R5 K6 + 0x201C0F07, // 0018 NE R7 R7 K7 + 0x781E0002, // 0019 JMPF R7 #001D + 0x8C1C0708, // 001A GETMET R7 R3 K8 + 0x5C240A00, // 001B MOVE R9 R5 + 0x7C1C0400, // 001C CALL R7 2 + 0x7001FFED, // 001D JMP #000C + 0x58100009, // 001E LDCONST R4 K9 + 0xAC100200, // 001F CATCH R4 1 0 + 0xB0080000, // 0020 RAISE 2 R0 R0 + 0xB8121400, // 0021 GETNGBL R4 K10 + 0x8C10090B, // 0022 GETMET R4 R4 K11 + 0x5C180600, // 0023 MOVE R6 R3 + 0x7C100400, // 0024 CALL R4 2 + 0x5C0C0800, // 0025 MOVE R3 R4 + 0x60100012, // 0026 GETGBL R4 G18 + 0x7C100000, // 0027 CALL R4 0 + 0x60140010, // 0028 GETGBL R5 G16 + 0x5C180600, // 0029 MOVE R6 R3 + 0x7C140200, // 002A CALL R5 1 + 0xA8020020, // 002B EXBLK 0 #004D + 0x5C180A00, // 002C MOVE R6 R5 + 0x7C180000, // 002D CALL R6 0 + 0x8C1C0504, // 002E GETMET R7 R2 K4 + 0x5C240000, // 002F MOVE R9 R0 + 0x5C280C00, // 0030 MOVE R10 R6 + 0x7C1C0600, // 0031 CALL R7 3 + 0x4C200000, // 0032 LDNIL R8 + 0x1C200E08, // 0033 EQ R8 R7 R8 + 0x78220000, // 0034 JMPF R8 #0036 + 0x7001FFF5, // 0035 JMP #002C + 0x6020000F, // 0036 GETGBL R8 G15 + 0x5C240E00, // 0037 MOVE R9 R7 + 0x60280015, // 0038 GETGBL R10 G21 + 0x7C200400, // 0039 CALL R8 2 + 0x78220003, // 003A JMPF R8 #003F + 0x8C200F0D, // 003B GETMET R8 R7 K13 + 0x7C200200, // 003C CALL R8 1 + 0x00221808, // 003D ADD R8 K12 R8 + 0x5C1C1000, // 003E MOVE R7 R8 + 0x8C200908, // 003F GETMET R8 R4 K8 + 0x60280018, // 0040 GETGBL R10 G24 + 0x582C000E, // 0041 LDCONST R11 K14 + 0x8C30030F, // 0042 GETMET R12 R1 K15 + 0x60380008, // 0043 GETGBL R14 G8 + 0x5C3C0C00, // 0044 MOVE R15 R6 + 0x7C380200, // 0045 CALL R14 1 + 0x7C300400, // 0046 CALL R12 2 + 0x8C34030F, // 0047 GETMET R13 R1 K15 + 0x5C3C0E00, // 0048 MOVE R15 R7 + 0x7C340400, // 0049 CALL R13 2 + 0x7C280600, // 004A CALL R10 3 + 0x7C200400, // 004B CALL R8 2 + 0x7001FFDE, // 004C JMP #002C + 0x58140009, // 004D LDCONST R5 K9 + 0xAC140200, // 004E CATCH R5 1 0 + 0xB0080000, // 004F RAISE 2 R0 R0 + 0x60140012, // 0050 GETGBL R5 G18 + 0x7C140000, // 0051 CALL R5 0 + 0x60180010, // 0052 GETGBL R6 G16 + 0x881C0110, // 0053 GETMBR R7 R0 K16 + 0x8C1C0F11, // 0054 GETMET R7 R7 K17 + 0x7C1C0200, // 0055 CALL R7 1 + 0x7C180200, // 0056 CALL R6 1 + 0xA8020006, // 0057 EXBLK 0 #005F + 0x5C1C0C00, // 0058 MOVE R7 R6 + 0x7C1C0000, // 0059 CALL R7 0 + 0x8C200B08, // 005A GETMET R8 R5 K8 + 0x8C280F12, // 005B GETMET R10 R7 K18 + 0x7C280200, // 005C CALL R10 1 + 0x7C200400, // 005D CALL R8 2 + 0x7001FFF8, // 005E JMP #0058 + 0x58180009, // 005F LDCONST R6 K9 + 0xAC180200, // 0060 CATCH R6 1 0 + 0xB0080000, // 0061 RAISE 2 R0 R0 + 0x6018000C, // 0062 GETGBL R6 G12 + 0x5C1C0A00, // 0063 MOVE R7 R5 + 0x7C180200, // 0064 CALL R6 1 + 0x24180D06, // 0065 GT R6 R6 K6 + 0x781A0007, // 0066 JMPF R6 #006F + 0x8C180B14, // 0067 GETMET R6 R5 K20 + 0x58200015, // 0068 LDCONST R8 K21 + 0x7C180400, // 0069 CALL R6 2 + 0x001A2606, // 006A ADD R6 K19 R6 + 0x00180D16, // 006B ADD R6 R6 K22 + 0x8C1C0908, // 006C GETMET R7 R4 K8 + 0x00262E06, // 006D ADD R9 K23 R6 + 0x7C1C0400, // 006E CALL R7 2 + 0x8C180118, // 006F GETMET R6 R0 K24 + 0x7C180200, // 0070 CALL R6 1 + 0x8C180914, // 0071 GETMET R6 R4 K20 + 0x58200015, // 0072 LDCONST R8 K21 + 0x7C180400, // 0073 CALL R6 2 + 0x001A3206, // 0074 ADD R6 K25 R6 + 0x00180D1A, // 0075 ADD R6 R6 K26 + 0x80040C00, // 0076 RET 1 R6 }) ) ); @@ -976,7 +967,7 @@ be_local_closure(Matter_Fabric_get_newest_session, /* name */ ********************************************************************/ be_local_closure(Matter_Fabric_before_remove, /* name */ be_nested_proto( - 9, /* nstack */ + 7, /* nstack */ 1, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -984,38 +975,35 @@ be_local_closure(Matter_Fabric_before_remove, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[10]) { /* constants */ - /* K0 */ be_nested_str_weak(string), - /* K1 */ be_nested_str_weak(tasmota), - /* K2 */ be_nested_str_weak(log), - /* K3 */ be_nested_str_weak(format), - /* K4 */ be_nested_str_weak(MTR_X3A_X20_X2DFabric_X20_X20_X20_X20fab_X3D_X27_X25s_X27_X20_X28removed_X29), - /* K5 */ be_nested_str_weak(get_fabric_id), - /* K6 */ be_nested_str_weak(copy), - /* K7 */ be_nested_str_weak(reverse), - /* K8 */ be_nested_str_weak(tohex), - /* K9 */ be_const_int(3), + ( &(const bvalue[ 8]) { /* constants */ + /* K0 */ be_nested_str_weak(tasmota), + /* K1 */ be_nested_str_weak(log), + /* K2 */ be_nested_str_weak(MTR_X3A_X20_X2DFabric_X20_X20_X20_X20fab_X3D_X27_X25s_X27_X20_X28removed_X29), + /* K3 */ be_nested_str_weak(get_fabric_id), + /* K4 */ be_nested_str_weak(copy), + /* K5 */ be_nested_str_weak(reverse), + /* K6 */ be_nested_str_weak(tohex), + /* K7 */ be_const_int(3), }), be_str_weak(before_remove), &be_const_str_solidified, - ( &(const binstruction[17]) { /* code */ - 0xA4060000, // 0000 IMPORT R1 K0 - 0xB80A0200, // 0001 GETNGBL R2 K1 - 0x8C080502, // 0002 GETMET R2 R2 K2 - 0x8C100303, // 0003 GETMET R4 R1 K3 - 0x58180004, // 0004 LDCONST R6 K4 - 0x8C1C0105, // 0005 GETMET R7 R0 K5 - 0x7C1C0200, // 0006 CALL R7 1 - 0x8C1C0F06, // 0007 GETMET R7 R7 K6 - 0x7C1C0200, // 0008 CALL R7 1 - 0x8C1C0F07, // 0009 GETMET R7 R7 K7 - 0x7C1C0200, // 000A CALL R7 1 - 0x8C1C0F08, // 000B GETMET R7 R7 K8 - 0x7C1C0200, // 000C CALL R7 1 - 0x7C100600, // 000D CALL R4 3 - 0x58140009, // 000E LDCONST R5 K9 - 0x7C080600, // 000F CALL R2 3 - 0x80000000, // 0010 RET 0 + ( &(const binstruction[16]) { /* code */ + 0xB8060000, // 0000 GETNGBL R1 K0 + 0x8C040301, // 0001 GETMET R1 R1 K1 + 0x600C0018, // 0002 GETGBL R3 G24 + 0x58100002, // 0003 LDCONST R4 K2 + 0x8C140103, // 0004 GETMET R5 R0 K3 + 0x7C140200, // 0005 CALL R5 1 + 0x8C140B04, // 0006 GETMET R5 R5 K4 + 0x7C140200, // 0007 CALL R5 1 + 0x8C140B05, // 0008 GETMET R5 R5 K5 + 0x7C140200, // 0009 CALL R5 1 + 0x8C140B06, // 000A GETMET R5 R5 K6 + 0x7C140200, // 000B CALL R5 1 + 0x7C0C0400, // 000C CALL R3 2 + 0x58100007, // 000D LDCONST R4 K7 + 0x7C040600, // 000E CALL R1 3 + 0x80000000, // 000F RET 0 }) ) ); @@ -1198,7 +1186,7 @@ be_local_closure(Matter_Fabric_hydrate_post, /* name */ ********************************************************************/ be_local_closure(Matter_Fabric_get_admin_vendor_name, /* name */ be_nested_proto( - 8, /* nstack */ + 6, /* nstack */ 1, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -1206,18 +1194,16 @@ be_local_closure(Matter_Fabric_get_admin_vendor_name, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[ 7]) { /* constants */ + ( &(const bvalue[ 5]) { /* constants */ /* K0 */ be_nested_str_weak(admin_vendor), /* K1 */ be_nested_str_weak(), /* K2 */ be_nested_str_weak(matter), /* K3 */ be_nested_str_weak(get_vendor_name), - /* K4 */ be_nested_str_weak(string), - /* K5 */ be_nested_str_weak(format), - /* K6 */ be_nested_str_weak(0x_X2504X), + /* K4 */ be_nested_str_weak(0x_X2504X), }), be_str_weak(get_admin_vendor_name), &be_const_str_solidified, - ( &(const binstruction[21]) { /* code */ + ( &(const binstruction[20]) { /* code */ 0x88040100, // 0000 GETMBR R1 R0 K0 0x4C080000, // 0001 LDNIL R2 0x1C080202, // 0002 EQ R2 R1 R2 @@ -1231,14 +1217,13 @@ be_local_closure(Matter_Fabric_get_admin_vendor_name, /* name */ 0x200C0403, // 000A NE R3 R2 R3 0x780E0001, // 000B JMPF R3 #000E 0x80040400, // 000C RET 1 R2 - 0x70020005, // 000D JMP #0014 - 0xA40E0800, // 000E IMPORT R3 K4 - 0x8C100705, // 000F GETMET R4 R3 K5 - 0x58180006, // 0010 LDCONST R6 K6 - 0x5C1C0200, // 0011 MOVE R7 R1 - 0x7C100600, // 0012 CALL R4 3 - 0x80040800, // 0013 RET 1 R4 - 0x80000000, // 0014 RET 0 + 0x70020004, // 000D JMP #0013 + 0x600C0018, // 000E GETGBL R3 G24 + 0x58100004, // 000F LDCONST R4 K4 + 0x5C140200, // 0010 MOVE R5 R1 + 0x7C0C0400, // 0011 CALL R3 2 + 0x80040600, // 0012 RET 1 R3 + 0x80000000, // 0013 RET 0 }) ) ); @@ -1333,7 +1318,7 @@ be_local_closure(Matter_Fabric_set_admin_subject_vendor, /* name */ ********************************************************************/ be_local_closure(Matter_Fabric_log_new_fabric, /* name */ be_nested_proto( - 10, /* nstack */ + 8, /* nstack */ 1, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -1341,41 +1326,38 @@ be_local_closure(Matter_Fabric_log_new_fabric, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[11]) { /* constants */ - /* K0 */ be_nested_str_weak(string), - /* K1 */ be_nested_str_weak(tasmota), - /* K2 */ be_nested_str_weak(log), - /* K3 */ be_nested_str_weak(format), - /* K4 */ be_nested_str_weak(MTR_X3A_X20_X2BFabric_X20_X20_X20_X20fab_X3D_X27_X25s_X27_X20vendorid_X3D_X25s), - /* K5 */ be_nested_str_weak(get_fabric_id), - /* K6 */ be_nested_str_weak(copy), - /* K7 */ be_nested_str_weak(reverse), - /* K8 */ be_nested_str_weak(tohex), - /* K9 */ be_nested_str_weak(get_admin_vendor_name), - /* K10 */ be_const_int(3), + ( &(const bvalue[ 9]) { /* constants */ + /* K0 */ be_nested_str_weak(tasmota), + /* K1 */ be_nested_str_weak(log), + /* K2 */ be_nested_str_weak(MTR_X3A_X20_X2BFabric_X20_X20_X20_X20fab_X3D_X27_X25s_X27_X20vendorid_X3D_X25s), + /* K3 */ be_nested_str_weak(get_fabric_id), + /* K4 */ be_nested_str_weak(copy), + /* K5 */ be_nested_str_weak(reverse), + /* K6 */ be_nested_str_weak(tohex), + /* K7 */ be_nested_str_weak(get_admin_vendor_name), + /* K8 */ be_const_int(3), }), be_str_weak(log_new_fabric), &be_const_str_solidified, - ( &(const binstruction[19]) { /* code */ - 0xA4060000, // 0000 IMPORT R1 K0 - 0xB80A0200, // 0001 GETNGBL R2 K1 - 0x8C080502, // 0002 GETMET R2 R2 K2 - 0x8C100303, // 0003 GETMET R4 R1 K3 - 0x58180004, // 0004 LDCONST R6 K4 - 0x8C1C0105, // 0005 GETMET R7 R0 K5 - 0x7C1C0200, // 0006 CALL R7 1 - 0x8C1C0F06, // 0007 GETMET R7 R7 K6 - 0x7C1C0200, // 0008 CALL R7 1 - 0x8C1C0F07, // 0009 GETMET R7 R7 K7 - 0x7C1C0200, // 000A CALL R7 1 - 0x8C1C0F08, // 000B GETMET R7 R7 K8 - 0x7C1C0200, // 000C CALL R7 1 - 0x8C200109, // 000D GETMET R8 R0 K9 - 0x7C200200, // 000E CALL R8 1 - 0x7C100800, // 000F CALL R4 4 - 0x5814000A, // 0010 LDCONST R5 K10 - 0x7C080600, // 0011 CALL R2 3 - 0x80000000, // 0012 RET 0 + ( &(const binstruction[18]) { /* code */ + 0xB8060000, // 0000 GETNGBL R1 K0 + 0x8C040301, // 0001 GETMET R1 R1 K1 + 0x600C0018, // 0002 GETGBL R3 G24 + 0x58100002, // 0003 LDCONST R4 K2 + 0x8C140103, // 0004 GETMET R5 R0 K3 + 0x7C140200, // 0005 CALL R5 1 + 0x8C140B04, // 0006 GETMET R5 R5 K4 + 0x7C140200, // 0007 CALL R5 1 + 0x8C140B05, // 0008 GETMET R5 R5 K5 + 0x7C140200, // 0009 CALL R5 1 + 0x8C140B06, // 000A GETMET R5 R5 K6 + 0x7C140200, // 000B CALL R5 1 + 0x8C180107, // 000C GETMET R6 R0 K7 + 0x7C180200, // 000D CALL R6 1 + 0x7C0C0600, // 000E CALL R3 3 + 0x58100008, // 000F LDCONST R4 K8 + 0x7C040600, // 0010 CALL R1 3 + 0x80000000, // 0011 RET 0 }) ) ); diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_HTTP_async.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_HTTP_async.h index 6b4bf1ef8..8d19fac77 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_HTTP_async.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_HTTP_async.h @@ -507,7 +507,7 @@ be_local_closure(Matter_HTTP_async_parse_http_payload, /* name */ ********************************************************************/ be_local_closure(Matter_HTTP_async_send_http, /* name */ be_nested_proto( - 9, /* nstack */ + 8, /* nstack */ 1, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -515,7 +515,7 @@ be_local_closure(Matter_HTTP_async_send_http, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[18]) { /* constants */ + ( &(const bvalue[17]) { /* constants */ /* K0 */ be_nested_str_weak(string), /* K1 */ be_nested_str_weak(response), /* K2 */ be_nested_str_weak(), @@ -525,15 +525,14 @@ be_local_closure(Matter_HTTP_async_send_http, /* name */ /* K6 */ be_const_int(0), /* K7 */ be_nested_str_weak(_X5B), /* K8 */ be_nested_str_weak(_X5D), - /* K9 */ be_nested_str_weak(format), - /* K10 */ be_nested_str_weak(HTTP_GET), - /* K11 */ be_nested_str_weak(cmd), - /* K12 */ be_nested_str_weak(port), - /* K13 */ be_nested_str_weak(write), - /* K14 */ be_nested_str_weak(close), - /* K15 */ be_nested_str_weak(status), - /* K16 */ be_nested_str_weak(http_status), - /* K17 */ be_nested_str_weak(event_http_failed), + /* K9 */ be_nested_str_weak(HTTP_GET), + /* K10 */ be_nested_str_weak(cmd), + /* K11 */ be_nested_str_weak(port), + /* K12 */ be_nested_str_weak(write), + /* K13 */ be_nested_str_weak(close), + /* K14 */ be_nested_str_weak(status), + /* K15 */ be_nested_str_weak(http_status), + /* K16 */ be_nested_str_weak(event_http_failed), }), be_str_weak(send_http), &be_const_str_solidified, @@ -550,13 +549,13 @@ be_local_closure(Matter_HTTP_async_send_http, /* name */ 0x000E0E02, // 0009 ADD R3 K7 R2 0x000C0708, // 000A ADD R3 R3 K8 0x5C080600, // 000B MOVE R2 R3 - 0x8C0C0309, // 000C GETMET R3 R1 K9 - 0x8814010A, // 000D GETMBR R5 R0 K10 - 0x8818010B, // 000E GETMBR R6 R0 K11 - 0x5C1C0400, // 000F MOVE R7 R2 - 0x8820010C, // 0010 GETMBR R8 R0 K12 - 0x7C0C0A00, // 0011 CALL R3 5 - 0x8C10010D, // 0012 GETMET R4 R0 K13 + 0x600C0018, // 000C GETGBL R3 G24 + 0x88100109, // 000D GETMBR R4 R0 K9 + 0x8814010A, // 000E GETMBR R5 R0 K10 + 0x5C180400, // 000F MOVE R6 R2 + 0x881C010B, // 0010 GETMBR R7 R0 K11 + 0x7C0C0800, // 0011 CALL R3 4 + 0x8C10010C, // 0012 GETMET R4 R0 K12 0x5C180600, // 0013 MOVE R6 R3 0x7C100400, // 0014 CALL R4 2 0x6014000C, // 0015 GETGBL R5 G12 @@ -564,13 +563,13 @@ be_local_closure(Matter_HTTP_async_send_http, /* name */ 0x7C140200, // 0017 CALL R5 1 0x20140805, // 0018 NE R5 R4 R5 0x78160007, // 0019 JMPF R5 #0022 - 0x8C14010E, // 001A GETMET R5 R0 K14 + 0x8C14010D, // 001A GETMET R5 R0 K13 0x7C140200, // 001B CALL R5 1 0x5415FFFB, // 001C LDINT R5 -4 - 0x90021E05, // 001D SETMBR R0 K15 R5 + 0x90021C05, // 001D SETMBR R0 K14 R5 0x5415FFFE, // 001E LDINT R5 -1 - 0x90022005, // 001F SETMBR R0 K16 R5 - 0x8C140111, // 0020 GETMET R5 R0 K17 + 0x90021E05, // 001F SETMBR R0 K15 R5 + 0x8C140110, // 0020 GETMET R5 R0 K16 0x7C140200, // 0021 CALL R5 1 0x80000000, // 0022 RET 0 }) diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_HTTP_remote.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_HTTP_remote.h index 58b2b1bcf..915f6e6a2 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_HTTP_remote.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_HTTP_remote.h @@ -52,7 +52,7 @@ be_local_closure(Matter_HTTP_remote_device_is_alive, /* name */ ********************************************************************/ be_local_closure(Matter_HTTP_remote_call_sync, /* name */ be_nested_proto( - 17, /* nstack */ + 16, /* nstack */ 3, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -60,7 +60,7 @@ be_local_closure(Matter_HTTP_remote_call_sync, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[25]) { /* constants */ + ( &(const bvalue[24]) { /* constants */ /* K0 */ be_nested_str_weak(string), /* K1 */ be_nested_str_weak(webserver), /* K2 */ be_nested_str_weak(tasmota), @@ -73,19 +73,18 @@ be_local_closure(Matter_HTTP_remote_call_sync, /* name */ /* K9 */ be_nested_str_weak(_X20), /* K10 */ be_nested_str_weak(_X2B), /* K11 */ be_nested_str_weak(log), - /* K12 */ be_nested_str_weak(format), - /* K13 */ be_nested_str_weak(MTR_X3A_X20HTTP_X20sync_X20request_X20_X27http_X3A_X2F_X2F_X25s_X3A_X25i_X25s_X27), - /* K14 */ be_nested_str_weak(addr), - /* K15 */ be_nested_str_weak(port), - /* K16 */ be_const_int(3), - /* K17 */ be_nested_str_weak(begin_sync), - /* K18 */ be_nested_str_weak(nil), - /* K19 */ be_const_int(0), - /* K20 */ be_nested_str_weak(_X2E_X2E_X2E), - /* K21 */ be_nested_str_weak(MTR_X3A_X20HTTP_X20sync_X2Dresp_X20_X20in_X20_X25i_X20ms_X20from_X20_X25s_X3A_X20_X5B_X25i_X5D_X20_X27_X25s_X27), - /* K22 */ be_nested_str_weak(millis), - /* K23 */ be_nested_str_weak(time_start), - /* K24 */ be_nested_str_weak(payload), + /* K12 */ be_nested_str_weak(MTR_X3A_X20HTTP_X20sync_X20request_X20_X27http_X3A_X2F_X2F_X25s_X3A_X25i_X25s_X27), + /* K13 */ be_nested_str_weak(addr), + /* K14 */ be_nested_str_weak(port), + /* K15 */ be_const_int(3), + /* K16 */ be_nested_str_weak(begin_sync), + /* K17 */ be_nested_str_weak(nil), + /* K18 */ be_const_int(0), + /* K19 */ be_nested_str_weak(_X2E_X2E_X2E), + /* K20 */ be_nested_str_weak(MTR_X3A_X20HTTP_X20sync_X2Dresp_X20_X20in_X20_X25i_X20ms_X20from_X20_X25s_X3A_X20_X5B_X25i_X5D_X20_X27_X25s_X27), + /* K21 */ be_nested_str_weak(millis), + /* K22 */ be_nested_str_weak(time_start), + /* K23 */ be_nested_str_weak(payload), }), be_str_weak(call_sync), &be_const_str_solidified, @@ -114,25 +113,25 @@ be_local_closure(Matter_HTTP_remote_call_sync, /* name */ 0x00160E05, // 0015 ADD R5 K7 R5 0xB81A0400, // 0016 GETNGBL R6 K2 0x8C180D0B, // 0017 GETMET R6 R6 K11 - 0x8C20070C, // 0018 GETMET R8 R3 K12 - 0x5828000D, // 0019 LDCONST R10 K13 - 0x882C010E, // 001A GETMBR R11 R0 K14 - 0x8830010F, // 001B GETMBR R12 R0 K15 - 0x5C340A00, // 001C MOVE R13 R5 - 0x7C200A00, // 001D CALL R8 5 - 0x58240010, // 001E LDCONST R9 K16 + 0x60200018, // 0018 GETGBL R8 G24 + 0x5824000C, // 0019 LDCONST R9 K12 + 0x8828010D, // 001A GETMBR R10 R0 K13 + 0x882C010E, // 001B GETMBR R11 R0 K14 + 0x5C300A00, // 001C MOVE R12 R5 + 0x7C200800, // 001D CALL R8 4 + 0x5824000F, // 001E LDCONST R9 K15 0x7C180600, // 001F CALL R6 3 0x60180003, // 0020 GETGBL R6 G3 0x5C1C0000, // 0021 MOVE R7 R0 0x7C180200, // 0022 CALL R6 1 - 0x8C180D11, // 0023 GETMET R6 R6 K17 + 0x8C180D10, // 0023 GETMET R6 R6 K16 0x5C200A00, // 0024 MOVE R8 R5 0x5C240400, // 0025 MOVE R9 R2 0x7C180600, // 0026 CALL R6 3 0x781A0001, // 0027 JMPF R6 #002A 0x5C1C0C00, // 0028 MOVE R7 R6 0x70020000, // 0029 JMP #002B - 0x581C0012, // 002A LDCONST R7 K18 + 0x581C0011, // 002A LDCONST R7 K17 0x6020000C, // 002B GETGBL R8 G12 0x5C240E00, // 002C MOVE R9 R7 0x7C200200, // 002D CALL R8 1 @@ -140,26 +139,26 @@ be_local_closure(Matter_HTTP_remote_call_sync, /* name */ 0x24201009, // 002F GT R8 R8 R9 0x78220004, // 0030 JMPF R8 #0036 0x5422001C, // 0031 LDINT R8 29 - 0x40222608, // 0032 CONNECT R8 K19 R8 + 0x40222408, // 0032 CONNECT R8 K18 R8 0x94200E08, // 0033 GETIDX R8 R7 R8 - 0x00201114, // 0034 ADD R8 R8 K20 + 0x00201113, // 0034 ADD R8 R8 K19 0x5C1C1000, // 0035 MOVE R7 R8 0xB8220400, // 0036 GETNGBL R8 K2 0x8C20110B, // 0037 GETMET R8 R8 K11 - 0x8C28070C, // 0038 GETMET R10 R3 K12 - 0x58300015, // 0039 LDCONST R12 K21 - 0xB8360400, // 003A GETNGBL R13 K2 - 0x8C341B16, // 003B GETMET R13 R13 K22 - 0x7C340200, // 003C CALL R13 1 - 0x88380117, // 003D GETMBR R14 R0 K23 - 0x04341A0E, // 003E SUB R13 R13 R14 - 0x8838010E, // 003F GETMBR R14 R0 K14 - 0x603C000C, // 0040 GETGBL R15 G12 - 0x88400118, // 0041 GETMBR R16 R0 K24 - 0x7C3C0200, // 0042 CALL R15 1 - 0x5C400E00, // 0043 MOVE R16 R7 - 0x7C280C00, // 0044 CALL R10 6 - 0x582C0010, // 0045 LDCONST R11 K16 + 0x60280018, // 0038 GETGBL R10 G24 + 0x582C0014, // 0039 LDCONST R11 K20 + 0xB8320400, // 003A GETNGBL R12 K2 + 0x8C301915, // 003B GETMET R12 R12 K21 + 0x7C300200, // 003C CALL R12 1 + 0x88340116, // 003D GETMBR R13 R0 K22 + 0x0430180D, // 003E SUB R12 R12 R13 + 0x8834010D, // 003F GETMBR R13 R0 K13 + 0x6038000C, // 0040 GETGBL R14 G12 + 0x883C0117, // 0041 GETMBR R15 R0 K23 + 0x7C380200, // 0042 CALL R14 1 + 0x5C3C0E00, // 0043 MOVE R15 R7 + 0x7C280A00, // 0044 CALL R10 5 + 0x582C000F, // 0045 LDCONST R11 K15 0x7C200600, // 0046 CALL R8 3 0x80040C00, // 0047 RET 1 R6 }) @@ -173,7 +172,7 @@ be_local_closure(Matter_HTTP_remote_call_sync, /* name */ ********************************************************************/ be_local_closure(Matter_HTTP_remote_web_last_seen, /* name */ be_nested_proto( - 7, /* nstack */ + 6, /* nstack */ 1, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -181,38 +180,36 @@ be_local_closure(Matter_HTTP_remote_web_last_seen, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[ 8]) { /* constants */ + ( &(const bvalue[ 7]) { /* constants */ /* K0 */ be_nested_str_weak(webserver), - /* K1 */ be_nested_str_weak(string), - /* K2 */ be_nested_str_weak(reachable_utc), - /* K3 */ be_nested_str_weak(tasmota), - /* K4 */ be_nested_str_weak(rtc), - /* K5 */ be_nested_str_weak(utc), - /* K6 */ be_nested_str_weak(matter), - /* K7 */ be_nested_str_weak(seconds_to_dhm), + /* K1 */ be_nested_str_weak(reachable_utc), + /* K2 */ be_nested_str_weak(tasmota), + /* K3 */ be_nested_str_weak(rtc), + /* K4 */ be_nested_str_weak(utc), + /* K5 */ be_nested_str_weak(matter), + /* K6 */ be_nested_str_weak(seconds_to_dhm), }), be_str_weak(web_last_seen), &be_const_str_solidified, - ( &(const binstruction[19]) { /* code */ + ( &(const binstruction[18]) { /* code */ 0xA4060000, // 0000 IMPORT R1 K0 - 0xA40A0200, // 0001 IMPORT R2 K1 - 0x540DFFFE, // 0002 LDINT R3 -1 - 0x88100102, // 0003 GETMBR R4 R0 K2 - 0x4C140000, // 0004 LDNIL R5 - 0x20100805, // 0005 NE R4 R4 R5 - 0x78120006, // 0006 JMPF R4 #000E - 0xB8120600, // 0007 GETNGBL R4 K3 - 0x8C100904, // 0008 GETMET R4 R4 K4 - 0x7C100200, // 0009 CALL R4 1 - 0x94100905, // 000A GETIDX R4 R4 K5 - 0x88140102, // 000B GETMBR R5 R0 K2 - 0x04100805, // 000C SUB R4 R4 R5 - 0x5C0C0800, // 000D MOVE R3 R4 - 0xB8120C00, // 000E GETNGBL R4 K6 - 0x8C100907, // 000F GETMET R4 R4 K7 - 0x5C180600, // 0010 MOVE R6 R3 - 0x7C100400, // 0011 CALL R4 2 - 0x80040800, // 0012 RET 1 R4 + 0x5409FFFE, // 0001 LDINT R2 -1 + 0x880C0101, // 0002 GETMBR R3 R0 K1 + 0x4C100000, // 0003 LDNIL R4 + 0x200C0604, // 0004 NE R3 R3 R4 + 0x780E0006, // 0005 JMPF R3 #000D + 0xB80E0400, // 0006 GETNGBL R3 K2 + 0x8C0C0703, // 0007 GETMET R3 R3 K3 + 0x7C0C0200, // 0008 CALL R3 1 + 0x940C0704, // 0009 GETIDX R3 R3 K4 + 0x88100101, // 000A GETMBR R4 R0 K1 + 0x040C0604, // 000B SUB R3 R3 R4 + 0x5C080600, // 000C MOVE R2 R3 + 0xB80E0A00, // 000D GETNGBL R3 K5 + 0x8C0C0706, // 000E GETMET R3 R3 K6 + 0x5C140400, // 000F MOVE R5 R2 + 0x7C0C0400, // 0010 CALL R3 2 + 0x80040600, // 0011 RET 1 R3 }) ) ); @@ -380,7 +377,7 @@ be_local_closure(Matter_HTTP_remote_scheduler, /* name */ ********************************************************************/ be_local_closure(Matter_HTTP_remote_event_http_finished, /* name */ be_nested_proto( - 12, /* nstack */ + 10, /* nstack */ 1, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -388,73 +385,70 @@ be_local_closure(Matter_HTTP_remote_event_http_finished, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[16]) { /* constants */ + ( &(const bvalue[14]) { /* constants */ /* K0 */ be_nested_str_weak(current_cmd), - /* K1 */ be_nested_str_weak(string), - /* K2 */ be_nested_str_weak(payload), - /* K3 */ be_nested_str_weak(nil), - /* K4 */ be_const_int(0), - /* K5 */ be_nested_str_weak(_X2E_X2E_X2E), - /* K6 */ be_nested_str_weak(tasmota), - /* K7 */ be_nested_str_weak(log), - /* K8 */ be_nested_str_weak(format), - /* K9 */ be_nested_str_weak(MTR_X3A_X20HTTP_X20async_X2Dresp_X20in_X20_X25i_X20ms_X20from_X20_X25s_X3A_X20_X5B_X25i_X5D_X20_X27_X25s_X27), - /* K10 */ be_nested_str_weak(millis), - /* K11 */ be_nested_str_weak(time_start), - /* K12 */ be_nested_str_weak(addr), - /* K13 */ be_const_int(3), - /* K14 */ be_nested_str_weak(dispatch_cb), - /* K15 */ be_nested_str_weak(http_status), + /* K1 */ be_nested_str_weak(payload), + /* K2 */ be_nested_str_weak(nil), + /* K3 */ be_const_int(0), + /* K4 */ be_nested_str_weak(_X2E_X2E_X2E), + /* K5 */ be_nested_str_weak(tasmota), + /* K6 */ be_nested_str_weak(log), + /* K7 */ be_nested_str_weak(MTR_X3A_X20HTTP_X20async_X2Dresp_X20in_X20_X25i_X20ms_X20from_X20_X25s_X3A_X20_X5B_X25i_X5D_X20_X27_X25s_X27), + /* K8 */ be_nested_str_weak(millis), + /* K9 */ be_nested_str_weak(time_start), + /* K10 */ be_nested_str_weak(addr), + /* K11 */ be_const_int(3), + /* K12 */ be_nested_str_weak(dispatch_cb), + /* K13 */ be_nested_str_weak(http_status), }), be_str_weak(event_http_finished), &be_const_str_solidified, - ( &(const binstruction[46]) { /* code */ + ( &(const binstruction[45]) { /* code */ 0x88040100, // 0000 GETMBR R1 R0 K0 0x4C080000, // 0001 LDNIL R2 0x1C040202, // 0002 EQ R1 R1 R2 0x78060000, // 0003 JMPF R1 #0005 0x80000200, // 0004 RET 0 - 0xA4060200, // 0005 IMPORT R1 K1 - 0x88080102, // 0006 GETMBR R2 R0 K2 - 0x4C0C0000, // 0007 LDNIL R3 - 0x20080403, // 0008 NE R2 R2 R3 - 0x780A0001, // 0009 JMPF R2 #000C - 0x88080102, // 000A GETMBR R2 R0 K2 - 0x70020000, // 000B JMP #000D - 0x58080003, // 000C LDCONST R2 K3 - 0x600C000C, // 000D GETGBL R3 G12 - 0x5C100400, // 000E MOVE R4 R2 - 0x7C0C0200, // 000F CALL R3 1 - 0x5412001D, // 0010 LDINT R4 30 - 0x240C0604, // 0011 GT R3 R3 R4 - 0x780E0004, // 0012 JMPF R3 #0018 - 0x540E001C, // 0013 LDINT R3 29 - 0x400E0803, // 0014 CONNECT R3 K4 R3 - 0x940C0403, // 0015 GETIDX R3 R2 R3 - 0x000C0705, // 0016 ADD R3 R3 K5 - 0x5C080600, // 0017 MOVE R2 R3 - 0xB80E0C00, // 0018 GETNGBL R3 K6 - 0x8C0C0707, // 0019 GETMET R3 R3 K7 - 0x8C140308, // 001A GETMET R5 R1 K8 - 0x581C0009, // 001B LDCONST R7 K9 - 0xB8220C00, // 001C GETNGBL R8 K6 - 0x8C20110A, // 001D GETMET R8 R8 K10 - 0x7C200200, // 001E CALL R8 1 - 0x8824010B, // 001F GETMBR R9 R0 K11 - 0x04201009, // 0020 SUB R8 R8 R9 - 0x8824010C, // 0021 GETMBR R9 R0 K12 - 0x6028000C, // 0022 GETGBL R10 G12 - 0x882C0102, // 0023 GETMBR R11 R0 K2 - 0x7C280200, // 0024 CALL R10 1 - 0x5C2C0400, // 0025 MOVE R11 R2 - 0x7C140C00, // 0026 CALL R5 6 - 0x5818000D, // 0027 LDCONST R6 K13 - 0x7C0C0600, // 0028 CALL R3 3 - 0x8C0C010E, // 0029 GETMET R3 R0 K14 - 0x8814010F, // 002A GETMBR R5 R0 K15 - 0x88180102, // 002B GETMBR R6 R0 K2 - 0x7C0C0600, // 002C CALL R3 3 - 0x80000000, // 002D RET 0 + 0x88040101, // 0005 GETMBR R1 R0 K1 + 0x4C080000, // 0006 LDNIL R2 + 0x20040202, // 0007 NE R1 R1 R2 + 0x78060001, // 0008 JMPF R1 #000B + 0x88040101, // 0009 GETMBR R1 R0 K1 + 0x70020000, // 000A JMP #000C + 0x58040002, // 000B LDCONST R1 K2 + 0x6008000C, // 000C GETGBL R2 G12 + 0x5C0C0200, // 000D MOVE R3 R1 + 0x7C080200, // 000E CALL R2 1 + 0x540E001D, // 000F LDINT R3 30 + 0x24080403, // 0010 GT R2 R2 R3 + 0x780A0004, // 0011 JMPF R2 #0017 + 0x540A001C, // 0012 LDINT R2 29 + 0x400A0602, // 0013 CONNECT R2 K3 R2 + 0x94080202, // 0014 GETIDX R2 R1 R2 + 0x00080504, // 0015 ADD R2 R2 K4 + 0x5C040400, // 0016 MOVE R1 R2 + 0xB80A0A00, // 0017 GETNGBL R2 K5 + 0x8C080506, // 0018 GETMET R2 R2 K6 + 0x60100018, // 0019 GETGBL R4 G24 + 0x58140007, // 001A LDCONST R5 K7 + 0xB81A0A00, // 001B GETNGBL R6 K5 + 0x8C180D08, // 001C GETMET R6 R6 K8 + 0x7C180200, // 001D CALL R6 1 + 0x881C0109, // 001E GETMBR R7 R0 K9 + 0x04180C07, // 001F SUB R6 R6 R7 + 0x881C010A, // 0020 GETMBR R7 R0 K10 + 0x6020000C, // 0021 GETGBL R8 G12 + 0x88240101, // 0022 GETMBR R9 R0 K1 + 0x7C200200, // 0023 CALL R8 1 + 0x5C240200, // 0024 MOVE R9 R1 + 0x7C100A00, // 0025 CALL R4 5 + 0x5814000B, // 0026 LDCONST R5 K11 + 0x7C080600, // 0027 CALL R2 3 + 0x8C08010C, // 0028 GETMET R2 R0 K12 + 0x8810010D, // 0029 GETMBR R4 R0 K13 + 0x88140101, // 002A GETMBR R5 R0 K1 + 0x7C080600, // 002B CALL R2 3 + 0x80000000, // 002C RET 0 }) ) ); @@ -466,7 +460,7 @@ be_local_closure(Matter_HTTP_remote_event_http_finished, /* name */ ********************************************************************/ be_local_closure(Matter_HTTP_remote_probe_async, /* name */ be_nested_proto( - 13, /* nstack */ + 12, /* nstack */ 2, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -474,7 +468,7 @@ be_local_closure(Matter_HTTP_remote_probe_async, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[18]) { /* constants */ + ( &(const bvalue[17]) { /* constants */ /* K0 */ be_nested_str_weak(string), /* K1 */ be_nested_str_weak(webserver), /* K2 */ be_nested_str_weak(tasmota), @@ -487,12 +481,11 @@ be_local_closure(Matter_HTTP_remote_probe_async, /* name */ /* K9 */ be_nested_str_weak(_X20), /* K10 */ be_nested_str_weak(_X2B), /* K11 */ be_nested_str_weak(log), - /* K12 */ be_nested_str_weak(format), - /* K13 */ be_nested_str_weak(MTR_X3A_X20HTTP_X20async_X20request_X20_X27http_X3A_X2F_X2F_X25s_X3A_X25i_X25s_X27), - /* K14 */ be_nested_str_weak(addr), - /* K15 */ be_nested_str_weak(port), - /* K16 */ be_const_int(3), - /* K17 */ be_nested_str_weak(begin), + /* K12 */ be_nested_str_weak(MTR_X3A_X20HTTP_X20async_X20request_X20_X27http_X3A_X2F_X2F_X25s_X3A_X25i_X25s_X27), + /* K13 */ be_nested_str_weak(addr), + /* K14 */ be_nested_str_weak(port), + /* K15 */ be_const_int(3), + /* K16 */ be_nested_str_weak(begin), }), be_str_weak(probe_async), &be_const_str_solidified, @@ -520,15 +513,15 @@ be_local_closure(Matter_HTTP_remote_probe_async, /* name */ 0x00120E04, // 0014 ADD R4 K7 R4 0xB8160400, // 0015 GETNGBL R5 K2 0x8C140B0B, // 0016 GETMET R5 R5 K11 - 0x8C1C050C, // 0017 GETMET R7 R2 K12 - 0x5824000D, // 0018 LDCONST R9 K13 - 0x8828010E, // 0019 GETMBR R10 R0 K14 - 0x882C010F, // 001A GETMBR R11 R0 K15 - 0x5C300800, // 001B MOVE R12 R4 - 0x7C1C0A00, // 001C CALL R7 5 - 0x58200010, // 001D LDCONST R8 K16 + 0x601C0018, // 0017 GETGBL R7 G24 + 0x5820000C, // 0018 LDCONST R8 K12 + 0x8824010D, // 0019 GETMBR R9 R0 K13 + 0x8828010E, // 001A GETMBR R10 R0 K14 + 0x5C2C0800, // 001B MOVE R11 R4 + 0x7C1C0800, // 001C CALL R7 4 + 0x5820000F, // 001D LDCONST R8 K15 0x7C140600, // 001E CALL R5 3 - 0x8C140111, // 001F GETMET R5 R0 K17 + 0x8C140110, // 001F GETMET R5 R0 K16 0x5C1C0800, // 0020 MOVE R7 R4 0x7C140400, // 0021 CALL R5 2 0x80000000, // 0022 RET 0 @@ -642,7 +635,7 @@ be_local_closure(Matter_HTTP_remote_event_http_failed, /* name */ ********************************************************************/ be_local_closure(Matter_HTTP_remote_event_http_timeout, /* name */ be_nested_proto( - 12, /* nstack */ + 10, /* nstack */ 1, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -650,47 +643,44 @@ be_local_closure(Matter_HTTP_remote_event_http_timeout, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[12]) { /* constants */ - /* K0 */ be_nested_str_weak(string), - /* K1 */ be_nested_str_weak(current_cmd), - /* K2 */ be_nested_str_weak(tasmota), - /* K3 */ be_nested_str_weak(log), - /* K4 */ be_nested_str_weak(format), - /* K5 */ be_nested_str_weak(MTR_X3A_X20HTTP_X20timeout_X20http_status_X3D_X25i_X20phase_X3D_X25i_X20tcp_status_X3D_X25i_X20size_payload_X3D_X25i), - /* K6 */ be_nested_str_weak(http_status), - /* K7 */ be_nested_str_weak(phase), - /* K8 */ be_nested_str_weak(status), - /* K9 */ be_nested_str_weak(payload), - /* K10 */ be_const_int(3), - /* K11 */ be_nested_str_weak(dispatch_cb), + ( &(const bvalue[10]) { /* constants */ + /* K0 */ be_nested_str_weak(current_cmd), + /* K1 */ be_nested_str_weak(tasmota), + /* K2 */ be_nested_str_weak(log), + /* K3 */ be_nested_str_weak(MTR_X3A_X20HTTP_X20timeout_X20http_status_X3D_X25i_X20phase_X3D_X25i_X20tcp_status_X3D_X25i_X20size_payload_X3D_X25i), + /* K4 */ be_nested_str_weak(http_status), + /* K5 */ be_nested_str_weak(phase), + /* K6 */ be_nested_str_weak(status), + /* K7 */ be_nested_str_weak(payload), + /* K8 */ be_const_int(3), + /* K9 */ be_nested_str_weak(dispatch_cb), }), be_str_weak(event_http_timeout), &be_const_str_solidified, - ( &(const binstruction[24]) { /* code */ - 0xA4060000, // 0000 IMPORT R1 K0 - 0x88080101, // 0001 GETMBR R2 R0 K1 - 0x4C0C0000, // 0002 LDNIL R3 - 0x1C080403, // 0003 EQ R2 R2 R3 - 0x780A0000, // 0004 JMPF R2 #0006 - 0x80000400, // 0005 RET 0 - 0xB80A0400, // 0006 GETNGBL R2 K2 - 0x8C080503, // 0007 GETMET R2 R2 K3 - 0x8C100304, // 0008 GETMET R4 R1 K4 - 0x58180005, // 0009 LDCONST R6 K5 - 0x881C0106, // 000A GETMBR R7 R0 K6 - 0x88200107, // 000B GETMBR R8 R0 K7 - 0x88240108, // 000C GETMBR R9 R0 K8 - 0x6028000C, // 000D GETGBL R10 G12 - 0x882C0109, // 000E GETMBR R11 R0 K9 - 0x7C280200, // 000F CALL R10 1 - 0x7C100C00, // 0010 CALL R4 6 - 0x5814000A, // 0011 LDCONST R5 K10 - 0x7C080600, // 0012 CALL R2 3 - 0x8C08010B, // 0013 GETMET R2 R0 K11 - 0x88100106, // 0014 GETMBR R4 R0 K6 - 0x4C140000, // 0015 LDNIL R5 - 0x7C080600, // 0016 CALL R2 3 - 0x80000000, // 0017 RET 0 + ( &(const binstruction[23]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x4C080000, // 0001 LDNIL R2 + 0x1C040202, // 0002 EQ R1 R1 R2 + 0x78060000, // 0003 JMPF R1 #0005 + 0x80000200, // 0004 RET 0 + 0xB8060200, // 0005 GETNGBL R1 K1 + 0x8C040302, // 0006 GETMET R1 R1 K2 + 0x600C0018, // 0007 GETGBL R3 G24 + 0x58100003, // 0008 LDCONST R4 K3 + 0x88140104, // 0009 GETMBR R5 R0 K4 + 0x88180105, // 000A GETMBR R6 R0 K5 + 0x881C0106, // 000B GETMBR R7 R0 K6 + 0x6020000C, // 000C GETGBL R8 G12 + 0x88240107, // 000D GETMBR R9 R0 K7 + 0x7C200200, // 000E CALL R8 1 + 0x7C0C0A00, // 000F CALL R3 5 + 0x58100008, // 0010 LDCONST R4 K8 + 0x7C040600, // 0011 CALL R1 3 + 0x8C040109, // 0012 GETMET R1 R0 K9 + 0x880C0104, // 0013 GETMBR R3 R0 K4 + 0x4C100000, // 0014 LDNIL R4 + 0x7C040600, // 0015 CALL R1 3 + 0x80000000, // 0016 RET 0 }) ) ); diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_IM.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_IM.h index 85fde88ab..530a27590 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_IM.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_IM.h @@ -67,7 +67,7 @@ be_local_closure(Matter_IM_expire_sendqueue, /* name */ ********************************************************************/ be_local_closure(Matter_IM_process_invoke_request, /* name */ be_nested_proto( - 22, /* nstack */ + 20, /* nstack */ 3, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -75,332 +75,329 @@ be_local_closure(Matter_IM_process_invoke_request, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[45]) { /* constants */ - /* K0 */ be_nested_str_weak(string), - /* K1 */ be_nested_str_weak(matter), - /* K2 */ be_nested_str_weak(Path), - /* K3 */ be_nested_str_weak(InvokeRequestMessage), - /* K4 */ be_nested_str_weak(from_TLV), - /* K5 */ be_nested_str_weak(invoke_requests), - /* K6 */ be_nested_str_weak(InvokeResponseMessage), - /* K7 */ be_nested_str_weak(suppress_response), - /* K8 */ be_nested_str_weak(invoke_responses), - /* K9 */ be_nested_str_weak(endpoint), - /* K10 */ be_nested_str_weak(command_path), - /* K11 */ be_nested_str_weak(cluster), - /* K12 */ be_nested_str_weak(command), - /* K13 */ be_nested_str_weak(status), - /* K14 */ be_nested_str_weak(UNSUPPORTED_COMMAND), - /* K15 */ be_nested_str_weak(get_command_name), - /* K16 */ be_nested_str_weak(device), - /* K17 */ be_nested_str_weak(invoke_request), - /* K18 */ be_nested_str_weak(session), - /* K19 */ be_nested_str_weak(command_fields), - /* K20 */ be_nested_str_weak(log), - /* K21 */ be_nested_str_weak(_X28), - /* K22 */ be_nested_str_weak(_X29_X20), - /* K23 */ be_nested_str_weak(), - /* K24 */ be_nested_str_weak(tasmota), - /* K25 */ be_nested_str_weak(format), - /* K26 */ be_nested_str_weak(MTR_X3A_X20_X3ECommand_X20_X20_X20_X28_X256i_X29_X20_X25s_X20_X25s_X20_X25s), - /* K27 */ be_nested_str_weak(local_session_id), - /* K28 */ be_const_int(0), - /* K29 */ be_const_int(2), - /* K30 */ be_const_int(3), - /* K31 */ be_nested_str_weak(InvokeResponseIB), - /* K32 */ be_nested_str_weak(SUCCESS), - /* K33 */ be_nested_str_weak(CommandStatusIB), - /* K34 */ be_nested_str_weak(CommandPathIB), - /* K35 */ be_nested_str_weak(StatusIB), - /* K36 */ be_nested_str_weak(push), - /* K37 */ be_nested_str_weak(MTR_X3A_X20_X3CReplied_X20_X20_X20_X28_X256i_X29_X20OK_X20exch_X3D_X25i), - /* K38 */ be_nested_str_weak(exchange_id), - /* K39 */ be_nested_str_weak(CommandDataIB), - /* K40 */ be_nested_str_weak(MTR_X3A_X20_X3CReplied_X20_X20_X20_X28_X256i_X29_X20_X25s_X20_X25s), - /* K41 */ be_nested_str_weak(MTR_X3A_X20_X3CReplied_X20_X20_X20_X28_X256i_X29_X20Status_X3D0x_X2502X_X20exch_X3D_X25i), - /* K42 */ be_nested_str_weak(MTR_X3A_X20_Ignore_X20_X20_X20_X20_X28_X256i_X29_X20exch_X3D_X25i), - /* K43 */ be_nested_str_weak(stop_iteration), - /* K44 */ be_nested_str_weak(send_invoke_response), + ( &(const bvalue[43]) { /* constants */ + /* K0 */ be_nested_str_weak(matter), + /* K1 */ be_nested_str_weak(Path), + /* K2 */ be_nested_str_weak(InvokeRequestMessage), + /* K3 */ be_nested_str_weak(from_TLV), + /* K4 */ be_nested_str_weak(invoke_requests), + /* K5 */ be_nested_str_weak(InvokeResponseMessage), + /* K6 */ be_nested_str_weak(suppress_response), + /* K7 */ be_nested_str_weak(invoke_responses), + /* K8 */ be_nested_str_weak(endpoint), + /* K9 */ be_nested_str_weak(command_path), + /* K10 */ be_nested_str_weak(cluster), + /* K11 */ be_nested_str_weak(command), + /* K12 */ be_nested_str_weak(status), + /* K13 */ be_nested_str_weak(UNSUPPORTED_COMMAND), + /* K14 */ be_nested_str_weak(get_command_name), + /* K15 */ be_nested_str_weak(device), + /* K16 */ be_nested_str_weak(invoke_request), + /* K17 */ be_nested_str_weak(session), + /* K18 */ be_nested_str_weak(command_fields), + /* K19 */ be_nested_str_weak(log), + /* K20 */ be_nested_str_weak(_X28), + /* K21 */ be_nested_str_weak(_X29_X20), + /* K22 */ be_nested_str_weak(), + /* K23 */ be_nested_str_weak(tasmota), + /* K24 */ be_nested_str_weak(MTR_X3A_X20_X3ECommand_X20_X20_X20_X28_X256i_X29_X20_X25s_X20_X25s_X20_X25s), + /* K25 */ be_nested_str_weak(local_session_id), + /* K26 */ be_const_int(0), + /* K27 */ be_const_int(2), + /* K28 */ be_const_int(3), + /* K29 */ be_nested_str_weak(InvokeResponseIB), + /* K30 */ be_nested_str_weak(SUCCESS), + /* K31 */ be_nested_str_weak(CommandStatusIB), + /* K32 */ be_nested_str_weak(CommandPathIB), + /* K33 */ be_nested_str_weak(StatusIB), + /* K34 */ be_nested_str_weak(push), + /* K35 */ be_nested_str_weak(MTR_X3A_X20_X3CReplied_X20_X20_X20_X28_X256i_X29_X20OK_X20exch_X3D_X25i), + /* K36 */ be_nested_str_weak(exchange_id), + /* K37 */ be_nested_str_weak(CommandDataIB), + /* K38 */ be_nested_str_weak(MTR_X3A_X20_X3CReplied_X20_X20_X20_X28_X256i_X29_X20_X25s_X20_X25s), + /* K39 */ be_nested_str_weak(MTR_X3A_X20_X3CReplied_X20_X20_X20_X28_X256i_X29_X20Status_X3D0x_X2502X_X20exch_X3D_X25i), + /* K40 */ be_nested_str_weak(MTR_X3A_X20_Ignore_X20_X20_X20_X20_X28_X256i_X29_X20exch_X3D_X25i), + /* K41 */ be_nested_str_weak(stop_iteration), + /* K42 */ be_nested_str_weak(send_invoke_response), }), be_str_weak(process_invoke_request), &be_const_str_solidified, - ( &(const binstruction[276]) { /* code */ - 0xA40E0000, // 0000 IMPORT R3 K0 - 0xB8120200, // 0001 GETNGBL R4 K1 - 0x8C100902, // 0002 GETMET R4 R4 K2 - 0x7C100200, // 0003 CALL R4 1 - 0xB8160200, // 0004 GETNGBL R5 K1 - 0x8C140B03, // 0005 GETMET R5 R5 K3 - 0x7C140200, // 0006 CALL R5 1 - 0x8C140B04, // 0007 GETMET R5 R5 K4 - 0x5C1C0400, // 0008 MOVE R7 R2 - 0x7C140400, // 0009 CALL R5 2 - 0x88180B05, // 000A GETMBR R6 R5 K5 - 0x4C1C0000, // 000B LDNIL R7 - 0x20180C07, // 000C NE R6 R6 R7 - 0x781A0104, // 000D JMPF R6 #0113 - 0xB81A0200, // 000E GETNGBL R6 K1 - 0x8C180D06, // 000F GETMET R6 R6 K6 - 0x7C180200, // 0010 CALL R6 1 - 0x501C0000, // 0011 LDBOOL R7 0 0 - 0x901A0E07, // 0012 SETMBR R6 K7 R7 - 0x601C0012, // 0013 GETGBL R7 G18 - 0x7C1C0000, // 0014 CALL R7 0 - 0x901A1007, // 0015 SETMBR R6 K8 R7 - 0x601C0010, // 0016 GETGBL R7 G16 - 0x88200B05, // 0017 GETMBR R8 R5 K5 - 0x7C1C0200, // 0018 CALL R7 1 - 0xA80200E7, // 0019 EXBLK 0 #0102 - 0x5C200E00, // 001A MOVE R8 R7 - 0x7C200000, // 001B CALL R8 0 - 0x8824110A, // 001C GETMBR R9 R8 K10 - 0x88241309, // 001D GETMBR R9 R9 K9 - 0x90121209, // 001E SETMBR R4 K9 R9 - 0x8824110A, // 001F GETMBR R9 R8 K10 - 0x8824130B, // 0020 GETMBR R9 R9 K11 - 0x90121609, // 0021 SETMBR R4 K11 R9 - 0x8824110A, // 0022 GETMBR R9 R8 K10 - 0x8824130C, // 0023 GETMBR R9 R9 K12 - 0x90121809, // 0024 SETMBR R4 K12 R9 - 0xB8260200, // 0025 GETNGBL R9 K1 - 0x8824130E, // 0026 GETMBR R9 R9 K14 - 0x90121A09, // 0027 SETMBR R4 K13 R9 - 0xB8260200, // 0028 GETNGBL R9 K1 - 0x8C24130F, // 0029 GETMET R9 R9 K15 - 0x882C090B, // 002A GETMBR R11 R4 K11 - 0x8830090C, // 002B GETMBR R12 R4 K12 - 0x7C240600, // 002C CALL R9 3 - 0x60280008, // 002D GETGBL R10 G8 - 0x5C2C0800, // 002E MOVE R11 R4 - 0x7C280200, // 002F CALL R10 1 - 0x882C0110, // 0030 GETMBR R11 R0 K16 - 0x8C2C1711, // 0031 GETMET R11 R11 K17 - 0x88340312, // 0032 GETMBR R13 R1 K18 - 0x88381113, // 0033 GETMBR R14 R8 K19 - 0x5C3C0800, // 0034 MOVE R15 R4 - 0x7C2C0800, // 0035 CALL R11 4 - 0x88300914, // 0036 GETMBR R12 R4 K20 - 0x4C340000, // 0037 LDNIL R13 - 0x2030180D, // 0038 NE R12 R12 R13 - 0x78320005, // 0039 JMPF R12 #0040 - 0x60300008, // 003A GETGBL R12 G8 - 0x88340914, // 003B GETMBR R13 R4 K20 - 0x7C300200, // 003C CALL R12 1 - 0x00322A0C, // 003D ADD R12 K21 R12 - 0x00301916, // 003E ADD R12 R12 K22 - 0x70020000, // 003F JMP #0041 - 0x58300017, // 0040 LDCONST R12 K23 - 0xB8363000, // 0041 GETNGBL R13 K24 - 0x8C341B14, // 0042 GETMET R13 R13 K20 - 0x8C3C0719, // 0043 GETMET R15 R3 K25 - 0x5844001A, // 0044 LDCONST R17 K26 - 0x88480312, // 0045 GETMBR R18 R1 K18 - 0x8848251B, // 0046 GETMBR R18 R18 K27 - 0x5C4C1400, // 0047 MOVE R19 R10 - 0x78260001, // 0048 JMPF R9 #004B - 0x5C501200, // 0049 MOVE R20 R9 - 0x70020000, // 004A JMP #004C - 0x58500017, // 004B LDCONST R20 K23 - 0x5C541800, // 004C MOVE R21 R12 - 0x7C3C0C00, // 004D CALL R15 6 - 0x88400909, // 004E GETMBR R16 R4 K9 - 0x2040211C, // 004F NE R16 R16 K28 - 0x78420001, // 0050 JMPF R16 #0053 - 0x5840001D, // 0051 LDCONST R16 K29 - 0x70020000, // 0052 JMP #0054 - 0x5840001E, // 0053 LDCONST R16 K30 - 0x7C340600, // 0054 CALL R13 3 - 0x4C340000, // 0055 LDNIL R13 - 0x9012280D, // 0056 SETMBR R4 K20 R13 - 0xB8360200, // 0057 GETNGBL R13 K1 - 0x8C341B1F, // 0058 GETMET R13 R13 K31 - 0x7C340200, // 0059 CALL R13 1 - 0x50380200, // 005A LDBOOL R14 1 0 - 0x1C38160E, // 005B EQ R14 R11 R14 - 0x743A0004, // 005C JMPT R14 #0062 - 0x8838090D, // 005D GETMBR R14 R4 K13 - 0xB83E0200, // 005E GETNGBL R15 K1 - 0x883C1F20, // 005F GETMBR R15 R15 K32 - 0x1C381C0F, // 0060 EQ R14 R14 R15 - 0x783A002D, // 0061 JMPF R14 #0090 - 0xB83A0200, // 0062 GETNGBL R14 K1 - 0x8C381D21, // 0063 GETMET R14 R14 K33 - 0x7C380200, // 0064 CALL R14 1 - 0x90361A0E, // 0065 SETMBR R13 K13 R14 - 0x88381B0D, // 0066 GETMBR R14 R13 K13 - 0xB83E0200, // 0067 GETNGBL R15 K1 - 0x8C3C1F22, // 0068 GETMET R15 R15 K34 - 0x7C3C0200, // 0069 CALL R15 1 - 0x903A140F, // 006A SETMBR R14 K10 R15 - 0x88381B0D, // 006B GETMBR R14 R13 K13 - 0x88381D0A, // 006C GETMBR R14 R14 K10 - 0x883C0909, // 006D GETMBR R15 R4 K9 - 0x903A120F, // 006E SETMBR R14 K9 R15 - 0x88381B0D, // 006F GETMBR R14 R13 K13 - 0x88381D0A, // 0070 GETMBR R14 R14 K10 - 0x883C090B, // 0071 GETMBR R15 R4 K11 - 0x903A160F, // 0072 SETMBR R14 K11 R15 - 0x88381B0D, // 0073 GETMBR R14 R13 K13 - 0x88381D0A, // 0074 GETMBR R14 R14 K10 - 0x883C090C, // 0075 GETMBR R15 R4 K12 - 0x903A180F, // 0076 SETMBR R14 K12 R15 - 0x88381B0D, // 0077 GETMBR R14 R13 K13 - 0xB83E0200, // 0078 GETNGBL R15 K1 - 0x8C3C1F23, // 0079 GETMET R15 R15 K35 - 0x7C3C0200, // 007A CALL R15 1 - 0x903A1A0F, // 007B SETMBR R14 K13 R15 - 0x88381B0D, // 007C GETMBR R14 R13 K13 - 0x88381D0D, // 007D GETMBR R14 R14 K13 - 0xB83E0200, // 007E GETNGBL R15 K1 - 0x883C1F20, // 007F GETMBR R15 R15 K32 - 0x903A1A0F, // 0080 SETMBR R14 K13 R15 - 0x88380D08, // 0081 GETMBR R14 R6 K8 - 0x8C381D24, // 0082 GETMET R14 R14 K36 - 0x5C401A00, // 0083 MOVE R16 R13 - 0x7C380400, // 0084 CALL R14 2 - 0xB83A3000, // 0085 GETNGBL R14 K24 - 0x8C381D14, // 0086 GETMET R14 R14 K20 - 0x8C400719, // 0087 GETMET R16 R3 K25 - 0x58480025, // 0088 LDCONST R18 K37 - 0x884C0312, // 0089 GETMBR R19 R1 K18 - 0x884C271B, // 008A GETMBR R19 R19 K27 - 0x88500326, // 008B GETMBR R20 R1 K38 - 0x7C400800, // 008C CALL R16 4 - 0x5844001E, // 008D LDCONST R17 K30 - 0x7C380600, // 008E CALL R14 3 - 0x70020070, // 008F JMP #0101 - 0x4C380000, // 0090 LDNIL R14 - 0x2038160E, // 0091 NE R14 R11 R14 - 0x783A0031, // 0092 JMPF R14 #00C5 - 0xB83A0200, // 0093 GETNGBL R14 K1 - 0x8C381D27, // 0094 GETMET R14 R14 K39 - 0x7C380200, // 0095 CALL R14 1 - 0x9036180E, // 0096 SETMBR R13 K12 R14 - 0x88381B0C, // 0097 GETMBR R14 R13 K12 - 0xB83E0200, // 0098 GETNGBL R15 K1 - 0x8C3C1F22, // 0099 GETMET R15 R15 K34 - 0x7C3C0200, // 009A CALL R15 1 - 0x903A140F, // 009B SETMBR R14 K10 R15 - 0x88381B0C, // 009C GETMBR R14 R13 K12 - 0x88381D0A, // 009D GETMBR R14 R14 K10 - 0x883C0909, // 009E GETMBR R15 R4 K9 - 0x903A120F, // 009F SETMBR R14 K9 R15 - 0x88381B0C, // 00A0 GETMBR R14 R13 K12 - 0x88381D0A, // 00A1 GETMBR R14 R14 K10 - 0x883C090B, // 00A2 GETMBR R15 R4 K11 - 0x903A160F, // 00A3 SETMBR R14 K11 R15 - 0x88381B0C, // 00A4 GETMBR R14 R13 K12 - 0x88381D0A, // 00A5 GETMBR R14 R14 K10 - 0x883C090C, // 00A6 GETMBR R15 R4 K12 - 0x903A180F, // 00A7 SETMBR R14 K12 R15 - 0x88381B0C, // 00A8 GETMBR R14 R13 K12 - 0x903A260B, // 00A9 SETMBR R14 K19 R11 - 0x88380D08, // 00AA GETMBR R14 R6 K8 - 0x8C381D24, // 00AB GETMET R14 R14 K36 - 0x5C401A00, // 00AC MOVE R16 R13 - 0x7C380400, // 00AD CALL R14 2 - 0xB83A0200, // 00AE GETNGBL R14 K1 - 0x8C381D0F, // 00AF GETMET R14 R14 K15 - 0x8840090B, // 00B0 GETMBR R16 R4 K11 - 0x8844090C, // 00B1 GETMBR R17 R4 K12 - 0x7C380600, // 00B2 CALL R14 3 - 0x5C241C00, // 00B3 MOVE R9 R14 - 0xB83A3000, // 00B4 GETNGBL R14 K24 - 0x8C381D14, // 00B5 GETMET R14 R14 K20 - 0x8C400719, // 00B6 GETMET R16 R3 K25 - 0x58480028, // 00B7 LDCONST R18 K40 - 0x884C0312, // 00B8 GETMBR R19 R1 K18 - 0x884C271B, // 00B9 GETMBR R19 R19 K27 - 0x60500008, // 00BA GETGBL R20 G8 - 0x5C540800, // 00BB MOVE R21 R4 - 0x7C500200, // 00BC CALL R20 1 - 0x78260001, // 00BD JMPF R9 #00C0 - 0x5C541200, // 00BE MOVE R21 R9 - 0x70020000, // 00BF JMP #00C1 - 0x58540017, // 00C0 LDCONST R21 K23 - 0x7C400A00, // 00C1 CALL R16 5 - 0x5844001E, // 00C2 LDCONST R17 K30 - 0x7C380600, // 00C3 CALL R14 3 - 0x7002003B, // 00C4 JMP #0101 - 0x8838090D, // 00C5 GETMBR R14 R4 K13 - 0x4C3C0000, // 00C6 LDNIL R15 - 0x20381C0F, // 00C7 NE R14 R14 R15 - 0x783A002D, // 00C8 JMPF R14 #00F7 - 0xB83A0200, // 00C9 GETNGBL R14 K1 - 0x8C381D21, // 00CA GETMET R14 R14 K33 - 0x7C380200, // 00CB CALL R14 1 - 0x90361A0E, // 00CC SETMBR R13 K13 R14 - 0x88381B0D, // 00CD GETMBR R14 R13 K13 - 0xB83E0200, // 00CE GETNGBL R15 K1 - 0x8C3C1F22, // 00CF GETMET R15 R15 K34 - 0x7C3C0200, // 00D0 CALL R15 1 - 0x903A140F, // 00D1 SETMBR R14 K10 R15 - 0x88381B0D, // 00D2 GETMBR R14 R13 K13 - 0x88381D0A, // 00D3 GETMBR R14 R14 K10 - 0x883C0909, // 00D4 GETMBR R15 R4 K9 - 0x903A120F, // 00D5 SETMBR R14 K9 R15 - 0x88381B0D, // 00D6 GETMBR R14 R13 K13 - 0x88381D0A, // 00D7 GETMBR R14 R14 K10 - 0x883C090B, // 00D8 GETMBR R15 R4 K11 - 0x903A160F, // 00D9 SETMBR R14 K11 R15 - 0x88381B0D, // 00DA GETMBR R14 R13 K13 - 0x88381D0A, // 00DB GETMBR R14 R14 K10 - 0x883C090C, // 00DC GETMBR R15 R4 K12 - 0x903A180F, // 00DD SETMBR R14 K12 R15 - 0x88381B0D, // 00DE GETMBR R14 R13 K13 - 0xB83E0200, // 00DF GETNGBL R15 K1 - 0x8C3C1F23, // 00E0 GETMET R15 R15 K35 - 0x7C3C0200, // 00E1 CALL R15 1 - 0x903A1A0F, // 00E2 SETMBR R14 K13 R15 - 0x88381B0D, // 00E3 GETMBR R14 R13 K13 - 0x88381D0D, // 00E4 GETMBR R14 R14 K13 - 0x883C090D, // 00E5 GETMBR R15 R4 K13 - 0x903A1A0F, // 00E6 SETMBR R14 K13 R15 - 0x88380D08, // 00E7 GETMBR R14 R6 K8 - 0x8C381D24, // 00E8 GETMET R14 R14 K36 - 0x5C401A00, // 00E9 MOVE R16 R13 - 0x7C380400, // 00EA CALL R14 2 - 0xB83A3000, // 00EB GETNGBL R14 K24 - 0x8C381D14, // 00EC GETMET R14 R14 K20 - 0x8C400719, // 00ED GETMET R16 R3 K25 - 0x58480029, // 00EE LDCONST R18 K41 - 0x884C0312, // 00EF GETMBR R19 R1 K18 - 0x884C271B, // 00F0 GETMBR R19 R19 K27 - 0x8850090D, // 00F1 GETMBR R20 R4 K13 - 0x88540326, // 00F2 GETMBR R21 R1 K38 - 0x7C400A00, // 00F3 CALL R16 5 - 0x5844001E, // 00F4 LDCONST R17 K30 - 0x7C380600, // 00F5 CALL R14 3 - 0x70020009, // 00F6 JMP #0101 - 0xB83A3000, // 00F7 GETNGBL R14 K24 - 0x8C381D14, // 00F8 GETMET R14 R14 K20 - 0x8C400719, // 00F9 GETMET R16 R3 K25 - 0x5848002A, // 00FA LDCONST R18 K42 - 0x884C0312, // 00FB GETMBR R19 R1 K18 - 0x884C271B, // 00FC GETMBR R19 R19 K27 - 0x88500326, // 00FD GETMBR R20 R1 K38 - 0x7C400800, // 00FE CALL R16 4 - 0x5844001E, // 00FF LDCONST R17 K30 - 0x7C380600, // 0100 CALL R14 3 - 0x7001FF17, // 0101 JMP #001A - 0x581C002B, // 0102 LDCONST R7 K43 - 0xAC1C0200, // 0103 CATCH R7 1 0 - 0xB0080000, // 0104 RAISE 2 R0 R0 - 0x601C000C, // 0105 GETGBL R7 G12 - 0x88200D08, // 0106 GETMBR R8 R6 K8 - 0x7C1C0200, // 0107 CALL R7 1 - 0x241C0F1C, // 0108 GT R7 R7 K28 - 0x781E0004, // 0109 JMPF R7 #010F - 0x8C1C012C, // 010A GETMET R7 R0 K44 - 0x5C240200, // 010B MOVE R9 R1 - 0x5C280C00, // 010C MOVE R10 R6 - 0x7C1C0600, // 010D CALL R7 3 - 0x70020001, // 010E JMP #0111 - 0x501C0000, // 010F LDBOOL R7 0 0 - 0x80040E00, // 0110 RET 1 R7 - 0x501C0200, // 0111 LDBOOL R7 1 0 - 0x80040E00, // 0112 RET 1 R7 - 0x80000000, // 0113 RET 0 + ( &(const binstruction[275]) { /* code */ + 0xB80E0000, // 0000 GETNGBL R3 K0 + 0x8C0C0701, // 0001 GETMET R3 R3 K1 + 0x7C0C0200, // 0002 CALL R3 1 + 0xB8120000, // 0003 GETNGBL R4 K0 + 0x8C100902, // 0004 GETMET R4 R4 K2 + 0x7C100200, // 0005 CALL R4 1 + 0x8C100903, // 0006 GETMET R4 R4 K3 + 0x5C180400, // 0007 MOVE R6 R2 + 0x7C100400, // 0008 CALL R4 2 + 0x88140904, // 0009 GETMBR R5 R4 K4 + 0x4C180000, // 000A LDNIL R6 + 0x20140A06, // 000B NE R5 R5 R6 + 0x78160104, // 000C JMPF R5 #0112 + 0xB8160000, // 000D GETNGBL R5 K0 + 0x8C140B05, // 000E GETMET R5 R5 K5 + 0x7C140200, // 000F CALL R5 1 + 0x50180000, // 0010 LDBOOL R6 0 0 + 0x90160C06, // 0011 SETMBR R5 K6 R6 + 0x60180012, // 0012 GETGBL R6 G18 + 0x7C180000, // 0013 CALL R6 0 + 0x90160E06, // 0014 SETMBR R5 K7 R6 + 0x60180010, // 0015 GETGBL R6 G16 + 0x881C0904, // 0016 GETMBR R7 R4 K4 + 0x7C180200, // 0017 CALL R6 1 + 0xA80200E7, // 0018 EXBLK 0 #0101 + 0x5C1C0C00, // 0019 MOVE R7 R6 + 0x7C1C0000, // 001A CALL R7 0 + 0x88200F09, // 001B GETMBR R8 R7 K9 + 0x88201108, // 001C GETMBR R8 R8 K8 + 0x900E1008, // 001D SETMBR R3 K8 R8 + 0x88200F09, // 001E GETMBR R8 R7 K9 + 0x8820110A, // 001F GETMBR R8 R8 K10 + 0x900E1408, // 0020 SETMBR R3 K10 R8 + 0x88200F09, // 0021 GETMBR R8 R7 K9 + 0x8820110B, // 0022 GETMBR R8 R8 K11 + 0x900E1608, // 0023 SETMBR R3 K11 R8 + 0xB8220000, // 0024 GETNGBL R8 K0 + 0x8820110D, // 0025 GETMBR R8 R8 K13 + 0x900E1808, // 0026 SETMBR R3 K12 R8 + 0xB8220000, // 0027 GETNGBL R8 K0 + 0x8C20110E, // 0028 GETMET R8 R8 K14 + 0x8828070A, // 0029 GETMBR R10 R3 K10 + 0x882C070B, // 002A GETMBR R11 R3 K11 + 0x7C200600, // 002B CALL R8 3 + 0x60240008, // 002C GETGBL R9 G8 + 0x5C280600, // 002D MOVE R10 R3 + 0x7C240200, // 002E CALL R9 1 + 0x8828010F, // 002F GETMBR R10 R0 K15 + 0x8C281510, // 0030 GETMET R10 R10 K16 + 0x88300311, // 0031 GETMBR R12 R1 K17 + 0x88340F12, // 0032 GETMBR R13 R7 K18 + 0x5C380600, // 0033 MOVE R14 R3 + 0x7C280800, // 0034 CALL R10 4 + 0x882C0713, // 0035 GETMBR R11 R3 K19 + 0x4C300000, // 0036 LDNIL R12 + 0x202C160C, // 0037 NE R11 R11 R12 + 0x782E0005, // 0038 JMPF R11 #003F + 0x602C0008, // 0039 GETGBL R11 G8 + 0x88300713, // 003A GETMBR R12 R3 K19 + 0x7C2C0200, // 003B CALL R11 1 + 0x002E280B, // 003C ADD R11 K20 R11 + 0x002C1715, // 003D ADD R11 R11 K21 + 0x70020000, // 003E JMP #0040 + 0x582C0016, // 003F LDCONST R11 K22 + 0xB8322E00, // 0040 GETNGBL R12 K23 + 0x8C301913, // 0041 GETMET R12 R12 K19 + 0x60380018, // 0042 GETGBL R14 G24 + 0x583C0018, // 0043 LDCONST R15 K24 + 0x88400311, // 0044 GETMBR R16 R1 K17 + 0x88402119, // 0045 GETMBR R16 R16 K25 + 0x5C441200, // 0046 MOVE R17 R9 + 0x78220001, // 0047 JMPF R8 #004A + 0x5C481000, // 0048 MOVE R18 R8 + 0x70020000, // 0049 JMP #004B + 0x58480016, // 004A LDCONST R18 K22 + 0x5C4C1600, // 004B MOVE R19 R11 + 0x7C380A00, // 004C CALL R14 5 + 0x883C0708, // 004D GETMBR R15 R3 K8 + 0x203C1F1A, // 004E NE R15 R15 K26 + 0x783E0001, // 004F JMPF R15 #0052 + 0x583C001B, // 0050 LDCONST R15 K27 + 0x70020000, // 0051 JMP #0053 + 0x583C001C, // 0052 LDCONST R15 K28 + 0x7C300600, // 0053 CALL R12 3 + 0x4C300000, // 0054 LDNIL R12 + 0x900E260C, // 0055 SETMBR R3 K19 R12 + 0xB8320000, // 0056 GETNGBL R12 K0 + 0x8C30191D, // 0057 GETMET R12 R12 K29 + 0x7C300200, // 0058 CALL R12 1 + 0x50340200, // 0059 LDBOOL R13 1 0 + 0x1C34140D, // 005A EQ R13 R10 R13 + 0x74360004, // 005B JMPT R13 #0061 + 0x8834070C, // 005C GETMBR R13 R3 K12 + 0xB83A0000, // 005D GETNGBL R14 K0 + 0x88381D1E, // 005E GETMBR R14 R14 K30 + 0x1C341A0E, // 005F EQ R13 R13 R14 + 0x7836002D, // 0060 JMPF R13 #008F + 0xB8360000, // 0061 GETNGBL R13 K0 + 0x8C341B1F, // 0062 GETMET R13 R13 K31 + 0x7C340200, // 0063 CALL R13 1 + 0x9032180D, // 0064 SETMBR R12 K12 R13 + 0x8834190C, // 0065 GETMBR R13 R12 K12 + 0xB83A0000, // 0066 GETNGBL R14 K0 + 0x8C381D20, // 0067 GETMET R14 R14 K32 + 0x7C380200, // 0068 CALL R14 1 + 0x9036120E, // 0069 SETMBR R13 K9 R14 + 0x8834190C, // 006A GETMBR R13 R12 K12 + 0x88341B09, // 006B GETMBR R13 R13 K9 + 0x88380708, // 006C GETMBR R14 R3 K8 + 0x9036100E, // 006D SETMBR R13 K8 R14 + 0x8834190C, // 006E GETMBR R13 R12 K12 + 0x88341B09, // 006F GETMBR R13 R13 K9 + 0x8838070A, // 0070 GETMBR R14 R3 K10 + 0x9036140E, // 0071 SETMBR R13 K10 R14 + 0x8834190C, // 0072 GETMBR R13 R12 K12 + 0x88341B09, // 0073 GETMBR R13 R13 K9 + 0x8838070B, // 0074 GETMBR R14 R3 K11 + 0x9036160E, // 0075 SETMBR R13 K11 R14 + 0x8834190C, // 0076 GETMBR R13 R12 K12 + 0xB83A0000, // 0077 GETNGBL R14 K0 + 0x8C381D21, // 0078 GETMET R14 R14 K33 + 0x7C380200, // 0079 CALL R14 1 + 0x9036180E, // 007A SETMBR R13 K12 R14 + 0x8834190C, // 007B GETMBR R13 R12 K12 + 0x88341B0C, // 007C GETMBR R13 R13 K12 + 0xB83A0000, // 007D GETNGBL R14 K0 + 0x88381D1E, // 007E GETMBR R14 R14 K30 + 0x9036180E, // 007F SETMBR R13 K12 R14 + 0x88340B07, // 0080 GETMBR R13 R5 K7 + 0x8C341B22, // 0081 GETMET R13 R13 K34 + 0x5C3C1800, // 0082 MOVE R15 R12 + 0x7C340400, // 0083 CALL R13 2 + 0xB8362E00, // 0084 GETNGBL R13 K23 + 0x8C341B13, // 0085 GETMET R13 R13 K19 + 0x603C0018, // 0086 GETGBL R15 G24 + 0x58400023, // 0087 LDCONST R16 K35 + 0x88440311, // 0088 GETMBR R17 R1 K17 + 0x88442319, // 0089 GETMBR R17 R17 K25 + 0x88480324, // 008A GETMBR R18 R1 K36 + 0x7C3C0600, // 008B CALL R15 3 + 0x5840001C, // 008C LDCONST R16 K28 + 0x7C340600, // 008D CALL R13 3 + 0x70020070, // 008E JMP #0100 + 0x4C340000, // 008F LDNIL R13 + 0x2034140D, // 0090 NE R13 R10 R13 + 0x78360031, // 0091 JMPF R13 #00C4 + 0xB8360000, // 0092 GETNGBL R13 K0 + 0x8C341B25, // 0093 GETMET R13 R13 K37 + 0x7C340200, // 0094 CALL R13 1 + 0x9032160D, // 0095 SETMBR R12 K11 R13 + 0x8834190B, // 0096 GETMBR R13 R12 K11 + 0xB83A0000, // 0097 GETNGBL R14 K0 + 0x8C381D20, // 0098 GETMET R14 R14 K32 + 0x7C380200, // 0099 CALL R14 1 + 0x9036120E, // 009A SETMBR R13 K9 R14 + 0x8834190B, // 009B GETMBR R13 R12 K11 + 0x88341B09, // 009C GETMBR R13 R13 K9 + 0x88380708, // 009D GETMBR R14 R3 K8 + 0x9036100E, // 009E SETMBR R13 K8 R14 + 0x8834190B, // 009F GETMBR R13 R12 K11 + 0x88341B09, // 00A0 GETMBR R13 R13 K9 + 0x8838070A, // 00A1 GETMBR R14 R3 K10 + 0x9036140E, // 00A2 SETMBR R13 K10 R14 + 0x8834190B, // 00A3 GETMBR R13 R12 K11 + 0x88341B09, // 00A4 GETMBR R13 R13 K9 + 0x8838070B, // 00A5 GETMBR R14 R3 K11 + 0x9036160E, // 00A6 SETMBR R13 K11 R14 + 0x8834190B, // 00A7 GETMBR R13 R12 K11 + 0x9036240A, // 00A8 SETMBR R13 K18 R10 + 0x88340B07, // 00A9 GETMBR R13 R5 K7 + 0x8C341B22, // 00AA GETMET R13 R13 K34 + 0x5C3C1800, // 00AB MOVE R15 R12 + 0x7C340400, // 00AC CALL R13 2 + 0xB8360000, // 00AD GETNGBL R13 K0 + 0x8C341B0E, // 00AE GETMET R13 R13 K14 + 0x883C070A, // 00AF GETMBR R15 R3 K10 + 0x8840070B, // 00B0 GETMBR R16 R3 K11 + 0x7C340600, // 00B1 CALL R13 3 + 0x5C201A00, // 00B2 MOVE R8 R13 + 0xB8362E00, // 00B3 GETNGBL R13 K23 + 0x8C341B13, // 00B4 GETMET R13 R13 K19 + 0x603C0018, // 00B5 GETGBL R15 G24 + 0x58400026, // 00B6 LDCONST R16 K38 + 0x88440311, // 00B7 GETMBR R17 R1 K17 + 0x88442319, // 00B8 GETMBR R17 R17 K25 + 0x60480008, // 00B9 GETGBL R18 G8 + 0x5C4C0600, // 00BA MOVE R19 R3 + 0x7C480200, // 00BB CALL R18 1 + 0x78220001, // 00BC JMPF R8 #00BF + 0x5C4C1000, // 00BD MOVE R19 R8 + 0x70020000, // 00BE JMP #00C0 + 0x584C0016, // 00BF LDCONST R19 K22 + 0x7C3C0800, // 00C0 CALL R15 4 + 0x5840001C, // 00C1 LDCONST R16 K28 + 0x7C340600, // 00C2 CALL R13 3 + 0x7002003B, // 00C3 JMP #0100 + 0x8834070C, // 00C4 GETMBR R13 R3 K12 + 0x4C380000, // 00C5 LDNIL R14 + 0x20341A0E, // 00C6 NE R13 R13 R14 + 0x7836002D, // 00C7 JMPF R13 #00F6 + 0xB8360000, // 00C8 GETNGBL R13 K0 + 0x8C341B1F, // 00C9 GETMET R13 R13 K31 + 0x7C340200, // 00CA CALL R13 1 + 0x9032180D, // 00CB SETMBR R12 K12 R13 + 0x8834190C, // 00CC GETMBR R13 R12 K12 + 0xB83A0000, // 00CD GETNGBL R14 K0 + 0x8C381D20, // 00CE GETMET R14 R14 K32 + 0x7C380200, // 00CF CALL R14 1 + 0x9036120E, // 00D0 SETMBR R13 K9 R14 + 0x8834190C, // 00D1 GETMBR R13 R12 K12 + 0x88341B09, // 00D2 GETMBR R13 R13 K9 + 0x88380708, // 00D3 GETMBR R14 R3 K8 + 0x9036100E, // 00D4 SETMBR R13 K8 R14 + 0x8834190C, // 00D5 GETMBR R13 R12 K12 + 0x88341B09, // 00D6 GETMBR R13 R13 K9 + 0x8838070A, // 00D7 GETMBR R14 R3 K10 + 0x9036140E, // 00D8 SETMBR R13 K10 R14 + 0x8834190C, // 00D9 GETMBR R13 R12 K12 + 0x88341B09, // 00DA GETMBR R13 R13 K9 + 0x8838070B, // 00DB GETMBR R14 R3 K11 + 0x9036160E, // 00DC SETMBR R13 K11 R14 + 0x8834190C, // 00DD GETMBR R13 R12 K12 + 0xB83A0000, // 00DE GETNGBL R14 K0 + 0x8C381D21, // 00DF GETMET R14 R14 K33 + 0x7C380200, // 00E0 CALL R14 1 + 0x9036180E, // 00E1 SETMBR R13 K12 R14 + 0x8834190C, // 00E2 GETMBR R13 R12 K12 + 0x88341B0C, // 00E3 GETMBR R13 R13 K12 + 0x8838070C, // 00E4 GETMBR R14 R3 K12 + 0x9036180E, // 00E5 SETMBR R13 K12 R14 + 0x88340B07, // 00E6 GETMBR R13 R5 K7 + 0x8C341B22, // 00E7 GETMET R13 R13 K34 + 0x5C3C1800, // 00E8 MOVE R15 R12 + 0x7C340400, // 00E9 CALL R13 2 + 0xB8362E00, // 00EA GETNGBL R13 K23 + 0x8C341B13, // 00EB GETMET R13 R13 K19 + 0x603C0018, // 00EC GETGBL R15 G24 + 0x58400027, // 00ED LDCONST R16 K39 + 0x88440311, // 00EE GETMBR R17 R1 K17 + 0x88442319, // 00EF GETMBR R17 R17 K25 + 0x8848070C, // 00F0 GETMBR R18 R3 K12 + 0x884C0324, // 00F1 GETMBR R19 R1 K36 + 0x7C3C0800, // 00F2 CALL R15 4 + 0x5840001C, // 00F3 LDCONST R16 K28 + 0x7C340600, // 00F4 CALL R13 3 + 0x70020009, // 00F5 JMP #0100 + 0xB8362E00, // 00F6 GETNGBL R13 K23 + 0x8C341B13, // 00F7 GETMET R13 R13 K19 + 0x603C0018, // 00F8 GETGBL R15 G24 + 0x58400028, // 00F9 LDCONST R16 K40 + 0x88440311, // 00FA GETMBR R17 R1 K17 + 0x88442319, // 00FB GETMBR R17 R17 K25 + 0x88480324, // 00FC GETMBR R18 R1 K36 + 0x7C3C0600, // 00FD CALL R15 3 + 0x5840001C, // 00FE LDCONST R16 K28 + 0x7C340600, // 00FF CALL R13 3 + 0x7001FF17, // 0100 JMP #0019 + 0x58180029, // 0101 LDCONST R6 K41 + 0xAC180200, // 0102 CATCH R6 1 0 + 0xB0080000, // 0103 RAISE 2 R0 R0 + 0x6018000C, // 0104 GETGBL R6 G12 + 0x881C0B07, // 0105 GETMBR R7 R5 K7 + 0x7C180200, // 0106 CALL R6 1 + 0x24180D1A, // 0107 GT R6 R6 K26 + 0x781A0004, // 0108 JMPF R6 #010E + 0x8C18012A, // 0109 GETMET R6 R0 K42 + 0x5C200200, // 010A MOVE R8 R1 + 0x5C240A00, // 010B MOVE R9 R5 + 0x7C180600, // 010C CALL R6 3 + 0x70020001, // 010D JMP #0110 + 0x50180000, // 010E LDBOOL R6 0 0 + 0x80040C00, // 010F RET 1 R6 + 0x50180200, // 0110 LDBOOL R6 1 0 + 0x80040C00, // 0111 RET 1 R6 + 0x80000000, // 0112 RET 0 }) ) ); @@ -412,7 +409,7 @@ be_local_closure(Matter_IM_process_invoke_request, /* name */ ********************************************************************/ be_local_closure(Matter_IM_subscribe_request, /* name */ be_nested_proto( - 19, /* nstack */ + 17, /* nstack */ 3, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -420,120 +417,117 @@ be_local_closure(Matter_IM_subscribe_request, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[31]) { /* constants */ - /* K0 */ be_nested_str_weak(string), - /* K1 */ be_nested_str_weak(matter), - /* K2 */ be_nested_str_weak(SubscribeRequestMessage), - /* K3 */ be_nested_str_weak(from_TLV), - /* K4 */ be_nested_str_weak(keep_subscriptions), - /* K5 */ be_nested_str_weak(subs_shop), - /* K6 */ be_nested_str_weak(remove_by_session), - /* K7 */ be_nested_str_weak(session), - /* K8 */ be_nested_str_weak(new_subscription), - /* K9 */ be_nested_str_weak(Path), - /* K10 */ be_nested_str_weak(attributes_requests), - /* K11 */ be_nested_str_weak(endpoint), - /* K12 */ be_nested_str_weak(cluster), - /* K13 */ be_nested_str_weak(attribute), - /* K14 */ be_nested_str_weak(push), - /* K15 */ be_nested_str_weak(stop_iteration), - /* K16 */ be_nested_str_weak(tasmota), - /* K17 */ be_nested_str_weak(log), - /* K18 */ be_nested_str_weak(format), - /* K19 */ be_nested_str_weak(MTR_X3A_X20_X3ESubscribe_X20_X28_X256i_X29_X20_X25s_X20_X28min_X3D_X25i_X2C_X20max_X3D_X25i_X2C_X20keep_X3D_X25i_X29_X20sub_X3D_X25i), - /* K20 */ be_nested_str_weak(local_session_id), - /* K21 */ be_nested_str_weak(concat), - /* K22 */ be_nested_str_weak(_X20), - /* K23 */ be_nested_str_weak(min_interval), - /* K24 */ be_nested_str_weak(max_interval), - /* K25 */ be_const_int(1), - /* K26 */ be_const_int(0), - /* K27 */ be_nested_str_weak(subscription_id), - /* K28 */ be_const_int(3), - /* K29 */ be_nested_str_weak(_inner_process_read_request), - /* K30 */ be_nested_str_weak(send_subscribe_response), + ( &(const bvalue[29]) { /* constants */ + /* K0 */ be_nested_str_weak(matter), + /* K1 */ be_nested_str_weak(SubscribeRequestMessage), + /* K2 */ be_nested_str_weak(from_TLV), + /* K3 */ be_nested_str_weak(keep_subscriptions), + /* K4 */ be_nested_str_weak(subs_shop), + /* K5 */ be_nested_str_weak(remove_by_session), + /* K6 */ be_nested_str_weak(session), + /* K7 */ be_nested_str_weak(new_subscription), + /* K8 */ be_nested_str_weak(Path), + /* K9 */ be_nested_str_weak(attributes_requests), + /* K10 */ be_nested_str_weak(endpoint), + /* K11 */ be_nested_str_weak(cluster), + /* K12 */ be_nested_str_weak(attribute), + /* K13 */ be_nested_str_weak(push), + /* K14 */ be_nested_str_weak(stop_iteration), + /* K15 */ be_nested_str_weak(tasmota), + /* K16 */ be_nested_str_weak(log), + /* K17 */ be_nested_str_weak(MTR_X3A_X20_X3ESubscribe_X20_X28_X256i_X29_X20_X25s_X20_X28min_X3D_X25i_X2C_X20max_X3D_X25i_X2C_X20keep_X3D_X25i_X29_X20sub_X3D_X25i), + /* K18 */ be_nested_str_weak(local_session_id), + /* K19 */ be_nested_str_weak(concat), + /* K20 */ be_nested_str_weak(_X20), + /* K21 */ be_nested_str_weak(min_interval), + /* K22 */ be_nested_str_weak(max_interval), + /* K23 */ be_const_int(1), + /* K24 */ be_const_int(0), + /* K25 */ be_nested_str_weak(subscription_id), + /* K26 */ be_const_int(3), + /* K27 */ be_nested_str_weak(_inner_process_read_request), + /* K28 */ be_nested_str_weak(send_subscribe_response), }), be_str_weak(subscribe_request), &be_const_str_solidified, - ( &(const binstruction[78]) { /* code */ - 0xA40E0000, // 0000 IMPORT R3 K0 - 0xB8120200, // 0001 GETNGBL R4 K1 - 0x8C100902, // 0002 GETMET R4 R4 K2 - 0x7C100200, // 0003 CALL R4 1 - 0x8C100903, // 0004 GETMET R4 R4 K3 - 0x5C180400, // 0005 MOVE R6 R2 - 0x7C100400, // 0006 CALL R4 2 - 0x88140904, // 0007 GETMBR R5 R4 K4 - 0x74160003, // 0008 JMPT R5 #000D - 0x88140105, // 0009 GETMBR R5 R0 K5 - 0x8C140B06, // 000A GETMET R5 R5 K6 - 0x881C0307, // 000B GETMBR R7 R1 K7 - 0x7C140400, // 000C CALL R5 2 - 0x88140105, // 000D GETMBR R5 R0 K5 - 0x8C140B08, // 000E GETMET R5 R5 K8 - 0x881C0307, // 000F GETMBR R7 R1 K7 - 0x5C200800, // 0010 MOVE R8 R4 - 0x7C140600, // 0011 CALL R5 3 - 0x60180012, // 0012 GETGBL R6 G18 - 0x7C180000, // 0013 CALL R6 0 - 0xB81E0200, // 0014 GETNGBL R7 K1 - 0x8C1C0F09, // 0015 GETMET R7 R7 K9 - 0x7C1C0200, // 0016 CALL R7 1 - 0x60200010, // 0017 GETGBL R8 G16 - 0x8824090A, // 0018 GETMBR R9 R4 K10 - 0x7C200200, // 0019 CALL R8 1 - 0xA802000D, // 001A EXBLK 0 #0029 - 0x5C241000, // 001B MOVE R9 R8 - 0x7C240000, // 001C CALL R9 0 - 0x8828130B, // 001D GETMBR R10 R9 K11 - 0x901E160A, // 001E SETMBR R7 K11 R10 - 0x8828130C, // 001F GETMBR R10 R9 K12 - 0x901E180A, // 0020 SETMBR R7 K12 R10 - 0x8828130D, // 0021 GETMBR R10 R9 K13 - 0x901E1A0A, // 0022 SETMBR R7 K13 R10 - 0x8C280D0E, // 0023 GETMET R10 R6 K14 - 0x60300008, // 0024 GETGBL R12 G8 - 0x5C340E00, // 0025 MOVE R13 R7 - 0x7C300200, // 0026 CALL R12 1 - 0x7C280400, // 0027 CALL R10 2 - 0x7001FFF1, // 0028 JMP #001B - 0x5820000F, // 0029 LDCONST R8 K15 - 0xAC200200, // 002A CATCH R8 1 0 - 0xB0080000, // 002B RAISE 2 R0 R0 - 0xB8222000, // 002C GETNGBL R8 K16 - 0x8C201111, // 002D GETMET R8 R8 K17 - 0x8C280712, // 002E GETMET R10 R3 K18 - 0x58300013, // 002F LDCONST R12 K19 - 0x88340307, // 0030 GETMBR R13 R1 K7 - 0x88341B14, // 0031 GETMBR R13 R13 K20 - 0x8C380D15, // 0032 GETMET R14 R6 K21 - 0x58400016, // 0033 LDCONST R16 K22 - 0x7C380400, // 0034 CALL R14 2 - 0x883C0B17, // 0035 GETMBR R15 R5 K23 - 0x88400B18, // 0036 GETMBR R16 R5 K24 - 0x88440904, // 0037 GETMBR R17 R4 K4 - 0x78460001, // 0038 JMPF R17 #003B - 0x58440019, // 0039 LDCONST R17 K25 - 0x70020000, // 003A JMP #003C - 0x5844001A, // 003B LDCONST R17 K26 - 0x88480B1B, // 003C GETMBR R18 R5 K27 - 0x7C281000, // 003D CALL R10 8 - 0x582C001C, // 003E LDCONST R11 K28 - 0x7C200600, // 003F CALL R8 3 - 0x8C20011D, // 0040 GETMET R8 R0 K29 - 0x88280307, // 0041 GETMBR R10 R1 K7 - 0x5C2C0800, // 0042 MOVE R11 R4 - 0x50300200, // 0043 LDBOOL R12 1 0 - 0x7C200800, // 0044 CALL R8 4 - 0x88240B1B, // 0045 GETMBR R9 R5 K27 - 0x90223609, // 0046 SETMBR R8 K27 R9 - 0x8C24011E, // 0047 GETMET R9 R0 K30 - 0x5C2C0200, // 0048 MOVE R11 R1 - 0x5C301000, // 0049 MOVE R12 R8 - 0x5C340A00, // 004A MOVE R13 R5 - 0x7C240800, // 004B CALL R9 4 - 0x50240200, // 004C LDBOOL R9 1 0 - 0x80041200, // 004D RET 1 R9 + ( &(const binstruction[77]) { /* code */ + 0xB80E0000, // 0000 GETNGBL R3 K0 + 0x8C0C0701, // 0001 GETMET R3 R3 K1 + 0x7C0C0200, // 0002 CALL R3 1 + 0x8C0C0702, // 0003 GETMET R3 R3 K2 + 0x5C140400, // 0004 MOVE R5 R2 + 0x7C0C0400, // 0005 CALL R3 2 + 0x88100703, // 0006 GETMBR R4 R3 K3 + 0x74120003, // 0007 JMPT R4 #000C + 0x88100104, // 0008 GETMBR R4 R0 K4 + 0x8C100905, // 0009 GETMET R4 R4 K5 + 0x88180306, // 000A GETMBR R6 R1 K6 + 0x7C100400, // 000B CALL R4 2 + 0x88100104, // 000C GETMBR R4 R0 K4 + 0x8C100907, // 000D GETMET R4 R4 K7 + 0x88180306, // 000E GETMBR R6 R1 K6 + 0x5C1C0600, // 000F MOVE R7 R3 + 0x7C100600, // 0010 CALL R4 3 + 0x60140012, // 0011 GETGBL R5 G18 + 0x7C140000, // 0012 CALL R5 0 + 0xB81A0000, // 0013 GETNGBL R6 K0 + 0x8C180D08, // 0014 GETMET R6 R6 K8 + 0x7C180200, // 0015 CALL R6 1 + 0x601C0010, // 0016 GETGBL R7 G16 + 0x88200709, // 0017 GETMBR R8 R3 K9 + 0x7C1C0200, // 0018 CALL R7 1 + 0xA802000D, // 0019 EXBLK 0 #0028 + 0x5C200E00, // 001A MOVE R8 R7 + 0x7C200000, // 001B CALL R8 0 + 0x8824110A, // 001C GETMBR R9 R8 K10 + 0x901A1409, // 001D SETMBR R6 K10 R9 + 0x8824110B, // 001E GETMBR R9 R8 K11 + 0x901A1609, // 001F SETMBR R6 K11 R9 + 0x8824110C, // 0020 GETMBR R9 R8 K12 + 0x901A1809, // 0021 SETMBR R6 K12 R9 + 0x8C240B0D, // 0022 GETMET R9 R5 K13 + 0x602C0008, // 0023 GETGBL R11 G8 + 0x5C300C00, // 0024 MOVE R12 R6 + 0x7C2C0200, // 0025 CALL R11 1 + 0x7C240400, // 0026 CALL R9 2 + 0x7001FFF1, // 0027 JMP #001A + 0x581C000E, // 0028 LDCONST R7 K14 + 0xAC1C0200, // 0029 CATCH R7 1 0 + 0xB0080000, // 002A RAISE 2 R0 R0 + 0xB81E1E00, // 002B GETNGBL R7 K15 + 0x8C1C0F10, // 002C GETMET R7 R7 K16 + 0x60240018, // 002D GETGBL R9 G24 + 0x58280011, // 002E LDCONST R10 K17 + 0x882C0306, // 002F GETMBR R11 R1 K6 + 0x882C1712, // 0030 GETMBR R11 R11 K18 + 0x8C300B13, // 0031 GETMET R12 R5 K19 + 0x58380014, // 0032 LDCONST R14 K20 + 0x7C300400, // 0033 CALL R12 2 + 0x88340915, // 0034 GETMBR R13 R4 K21 + 0x88380916, // 0035 GETMBR R14 R4 K22 + 0x883C0703, // 0036 GETMBR R15 R3 K3 + 0x783E0001, // 0037 JMPF R15 #003A + 0x583C0017, // 0038 LDCONST R15 K23 + 0x70020000, // 0039 JMP #003B + 0x583C0018, // 003A LDCONST R15 K24 + 0x88400919, // 003B GETMBR R16 R4 K25 + 0x7C240E00, // 003C CALL R9 7 + 0x5828001A, // 003D LDCONST R10 K26 + 0x7C1C0600, // 003E CALL R7 3 + 0x8C1C011B, // 003F GETMET R7 R0 K27 + 0x88240306, // 0040 GETMBR R9 R1 K6 + 0x5C280600, // 0041 MOVE R10 R3 + 0x502C0200, // 0042 LDBOOL R11 1 0 + 0x7C1C0800, // 0043 CALL R7 4 + 0x88200919, // 0044 GETMBR R8 R4 K25 + 0x901E3208, // 0045 SETMBR R7 K25 R8 + 0x8C20011C, // 0046 GETMET R8 R0 K28 + 0x5C280200, // 0047 MOVE R10 R1 + 0x5C2C0E00, // 0048 MOVE R11 R7 + 0x5C300800, // 0049 MOVE R12 R4 + 0x7C200800, // 004A CALL R8 4 + 0x50200200, // 004B LDBOOL R8 1 0 + 0x80041000, // 004C RET 1 R8 }) ) ); @@ -545,7 +539,7 @@ be_local_closure(Matter_IM_subscribe_request, /* name */ ********************************************************************/ be_local_closure(Matter_IM_process_write_request, /* name */ be_nested_proto( - 20, /* nstack */ + 19, /* nstack */ 3, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -553,7 +547,7 @@ be_local_closure(Matter_IM_process_write_request, /* name */ 1, /* has sup protos */ ( &(const struct bproto*[ 2]) { be_nested_proto( - 19, /* nstack */ + 17, /* nstack */ 5, /* argc */ 0, /* varg */ 1, /* has upvals */ @@ -563,141 +557,138 @@ be_local_closure(Matter_IM_process_write_request, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[28]) { /* constants */ - /* K0 */ be_nested_str_weak(string), - /* K1 */ be_nested_str_weak(matter), - /* K2 */ be_nested_str_weak(get_attribute_name), - /* K3 */ be_nested_str_weak(cluster), - /* K4 */ be_nested_str_weak(attribute), - /* K5 */ be_nested_str_weak(_X20_X28), - /* K6 */ be_nested_str_weak(_X29), - /* K7 */ be_nested_str_weak(), - /* K8 */ be_nested_str_weak(status), - /* K9 */ be_nested_str_weak(UNSUPPORTED_WRITE), - /* K10 */ be_nested_str_weak(write_attribute), - /* K11 */ be_nested_str_weak(session), - /* K12 */ be_nested_str_weak(SUCCESS), - /* K13 */ be_nested_str_weak(AttributeStatusIB), - /* K14 */ be_nested_str_weak(path), - /* K15 */ be_nested_str_weak(AttributePathIB), - /* K16 */ be_nested_str_weak(StatusIB), - /* K17 */ be_nested_str_weak(endpoint), - /* K18 */ be_nested_str_weak(write_responses), - /* K19 */ be_nested_str_weak(push), - /* K20 */ be_nested_str_weak(tasmota), - /* K21 */ be_nested_str_weak(log), - /* K22 */ be_nested_str_weak(format), - /* K23 */ be_nested_str_weak(MTR_X3A_X20Write_Attr_X20_X25s_X25s_X20_X2D_X20STATUS_X3A_X200x_X2502X_X20_X25s), - /* K24 */ be_const_int(0), - /* K25 */ be_const_int(2), - /* K26 */ be_const_int(3), - /* K27 */ be_nested_str_weak(MTR_X3A_X20Write_Attr_X20_X25s_X25s_X20_X2D_X20IGNORED), + ( &(const bvalue[26]) { /* constants */ + /* K0 */ be_nested_str_weak(matter), + /* K1 */ be_nested_str_weak(get_attribute_name), + /* K2 */ be_nested_str_weak(cluster), + /* K3 */ be_nested_str_weak(attribute), + /* K4 */ be_nested_str_weak(_X20_X28), + /* K5 */ be_nested_str_weak(_X29), + /* K6 */ be_nested_str_weak(), + /* K7 */ be_nested_str_weak(status), + /* K8 */ be_nested_str_weak(UNSUPPORTED_WRITE), + /* K9 */ be_nested_str_weak(write_attribute), + /* K10 */ be_nested_str_weak(session), + /* K11 */ be_nested_str_weak(SUCCESS), + /* K12 */ be_nested_str_weak(AttributeStatusIB), + /* K13 */ be_nested_str_weak(path), + /* K14 */ be_nested_str_weak(AttributePathIB), + /* K15 */ be_nested_str_weak(StatusIB), + /* K16 */ be_nested_str_weak(endpoint), + /* K17 */ be_nested_str_weak(write_responses), + /* K18 */ be_nested_str_weak(push), + /* K19 */ be_nested_str_weak(tasmota), + /* K20 */ be_nested_str_weak(log), + /* K21 */ be_nested_str_weak(MTR_X3A_X20Write_Attr_X20_X25s_X25s_X20_X2D_X20STATUS_X3A_X200x_X2502X_X20_X25s), + /* K22 */ be_const_int(0), + /* K23 */ be_const_int(2), + /* K24 */ be_const_int(3), + /* K25 */ be_nested_str_weak(MTR_X3A_X20Write_Attr_X20_X25s_X25s_X20_X2D_X20IGNORED), }), be_str_weak(write_single_attribute), &be_const_str_solidified, - ( &(const binstruction[102]) { /* code */ - 0xA4160000, // 0000 IMPORT R5 K0 - 0xB81A0200, // 0001 GETNGBL R6 K1 - 0x8C180D02, // 0002 GETMET R6 R6 K2 + ( &(const binstruction[101]) { /* code */ + 0xB8160000, // 0000 GETNGBL R5 K0 + 0x8C140B01, // 0001 GETMET R5 R5 K1 + 0x881C0502, // 0002 GETMBR R7 R2 K2 0x88200503, // 0003 GETMBR R8 R2 K3 - 0x88240504, // 0004 GETMBR R9 R2 K4 - 0x7C180600, // 0005 CALL R6 3 - 0x781A0002, // 0006 JMPF R6 #000A - 0x001E0A06, // 0007 ADD R7 K5 R6 - 0x001C0F06, // 0008 ADD R7 R7 K6 - 0x70020000, // 0009 JMP #000B - 0x581C0007, // 000A LDCONST R7 K7 - 0x5C180E00, // 000B MOVE R6 R7 - 0xB81E0200, // 000C GETNGBL R7 K1 - 0x881C0F09, // 000D GETMBR R7 R7 K9 - 0x900A1007, // 000E SETMBR R2 K8 R7 - 0x4C1C0000, // 000F LDNIL R7 - 0x201C0207, // 0010 NE R7 R1 R7 - 0x781E0006, // 0011 JMPF R7 #0019 - 0x8C1C030A, // 0012 GETMET R7 R1 K10 - 0x68240000, // 0013 GETUPV R9 U0 - 0x8824130B, // 0014 GETMBR R9 R9 K11 - 0x5C280400, // 0015 MOVE R10 R2 - 0x5C2C0600, // 0016 MOVE R11 R3 - 0x7C1C0800, // 0017 CALL R7 4 - 0x70020000, // 0018 JMP #001A - 0x4C1C0000, // 0019 LDNIL R7 - 0x781E0002, // 001A JMPF R7 #001E - 0xB8220200, // 001B GETNGBL R8 K1 - 0x8820110C, // 001C GETMBR R8 R8 K12 - 0x900A1008, // 001D SETMBR R2 K8 R8 - 0x88200508, // 001E GETMBR R8 R2 K8 - 0x4C240000, // 001F LDNIL R9 - 0x20201009, // 0020 NE R8 R8 R9 - 0x78220037, // 0021 JMPF R8 #005A - 0x78120035, // 0022 JMPF R4 #0059 - 0xB8220200, // 0023 GETNGBL R8 K1 - 0x8C20110D, // 0024 GETMET R8 R8 K13 - 0x7C200200, // 0025 CALL R8 1 - 0xB8260200, // 0026 GETNGBL R9 K1 - 0x8C24130F, // 0027 GETMET R9 R9 K15 - 0x7C240200, // 0028 CALL R9 1 - 0x90221C09, // 0029 SETMBR R8 K14 R9 - 0xB8260200, // 002A GETNGBL R9 K1 - 0x8C241310, // 002B GETMET R9 R9 K16 - 0x7C240200, // 002C CALL R9 1 - 0x90221009, // 002D SETMBR R8 K8 R9 - 0x8824110E, // 002E GETMBR R9 R8 K14 - 0x88280511, // 002F GETMBR R10 R2 K17 - 0x9026220A, // 0030 SETMBR R9 K17 R10 - 0x8824110E, // 0031 GETMBR R9 R8 K14 - 0x88280503, // 0032 GETMBR R10 R2 K3 - 0x9026060A, // 0033 SETMBR R9 K3 R10 - 0x8824110E, // 0034 GETMBR R9 R8 K14 - 0x88280504, // 0035 GETMBR R10 R2 K4 - 0x9026080A, // 0036 SETMBR R9 K4 R10 - 0x88241108, // 0037 GETMBR R9 R8 K8 - 0x88280508, // 0038 GETMBR R10 R2 K8 - 0x9026100A, // 0039 SETMBR R9 K8 R10 - 0x88240112, // 003A GETMBR R9 R0 K18 - 0x8C241313, // 003B GETMET R9 R9 K19 - 0x5C2C1000, // 003C MOVE R11 R8 - 0x7C240400, // 003D CALL R9 2 - 0xB8262800, // 003E GETNGBL R9 K20 - 0x8C241315, // 003F GETMET R9 R9 K21 - 0x8C2C0B16, // 0040 GETMET R11 R5 K22 - 0x58340017, // 0041 LDCONST R13 K23 - 0x60380008, // 0042 GETGBL R14 G8 - 0x5C3C0400, // 0043 MOVE R15 R2 - 0x7C380200, // 0044 CALL R14 1 - 0x5C3C0C00, // 0045 MOVE R15 R6 - 0x88400508, // 0046 GETMBR R16 R2 K8 - 0x88440508, // 0047 GETMBR R17 R2 K8 - 0xB84A0200, // 0048 GETNGBL R18 K1 - 0x8848250C, // 0049 GETMBR R18 R18 K12 - 0x1C442212, // 004A EQ R17 R17 R18 - 0x78460001, // 004B JMPF R17 #004E - 0x5844000C, // 004C LDCONST R17 K12 - 0x70020000, // 004D JMP #004F - 0x58440007, // 004E LDCONST R17 K7 - 0x7C2C0C00, // 004F CALL R11 6 - 0x88300511, // 0050 GETMBR R12 R2 K17 - 0x20301918, // 0051 NE R12 R12 K24 - 0x78320001, // 0052 JMPF R12 #0055 - 0x58300019, // 0053 LDCONST R12 K25 - 0x70020000, // 0054 JMP #0056 - 0x5830001A, // 0055 LDCONST R12 K26 - 0x7C240600, // 0056 CALL R9 3 - 0x50240200, // 0057 LDBOOL R9 1 0 - 0x80041200, // 0058 RET 1 R9 - 0x7002000A, // 0059 JMP #0065 - 0xB8222800, // 005A GETNGBL R8 K20 - 0x8C201115, // 005B GETMET R8 R8 K21 - 0x8C280B16, // 005C GETMET R10 R5 K22 - 0x5830001B, // 005D LDCONST R12 K27 - 0x60340008, // 005E GETGBL R13 G8 - 0x5C380400, // 005F MOVE R14 R2 - 0x7C340200, // 0060 CALL R13 1 - 0x5C380C00, // 0061 MOVE R14 R6 - 0x7C280800, // 0062 CALL R10 4 - 0x582C001A, // 0063 LDCONST R11 K26 - 0x7C200600, // 0064 CALL R8 3 - 0x80000000, // 0065 RET 0 + 0x7C140600, // 0004 CALL R5 3 + 0x78160002, // 0005 JMPF R5 #0009 + 0x001A0805, // 0006 ADD R6 K4 R5 + 0x00180D05, // 0007 ADD R6 R6 K5 + 0x70020000, // 0008 JMP #000A + 0x58180006, // 0009 LDCONST R6 K6 + 0x5C140C00, // 000A MOVE R5 R6 + 0xB81A0000, // 000B GETNGBL R6 K0 + 0x88180D08, // 000C GETMBR R6 R6 K8 + 0x900A0E06, // 000D SETMBR R2 K7 R6 + 0x4C180000, // 000E LDNIL R6 + 0x20180206, // 000F NE R6 R1 R6 + 0x781A0006, // 0010 JMPF R6 #0018 + 0x8C180309, // 0011 GETMET R6 R1 K9 + 0x68200000, // 0012 GETUPV R8 U0 + 0x8820110A, // 0013 GETMBR R8 R8 K10 + 0x5C240400, // 0014 MOVE R9 R2 + 0x5C280600, // 0015 MOVE R10 R3 + 0x7C180800, // 0016 CALL R6 4 + 0x70020000, // 0017 JMP #0019 + 0x4C180000, // 0018 LDNIL R6 + 0x781A0002, // 0019 JMPF R6 #001D + 0xB81E0000, // 001A GETNGBL R7 K0 + 0x881C0F0B, // 001B GETMBR R7 R7 K11 + 0x900A0E07, // 001C SETMBR R2 K7 R7 + 0x881C0507, // 001D GETMBR R7 R2 K7 + 0x4C200000, // 001E LDNIL R8 + 0x201C0E08, // 001F NE R7 R7 R8 + 0x781E0037, // 0020 JMPF R7 #0059 + 0x78120035, // 0021 JMPF R4 #0058 + 0xB81E0000, // 0022 GETNGBL R7 K0 + 0x8C1C0F0C, // 0023 GETMET R7 R7 K12 + 0x7C1C0200, // 0024 CALL R7 1 + 0xB8220000, // 0025 GETNGBL R8 K0 + 0x8C20110E, // 0026 GETMET R8 R8 K14 + 0x7C200200, // 0027 CALL R8 1 + 0x901E1A08, // 0028 SETMBR R7 K13 R8 + 0xB8220000, // 0029 GETNGBL R8 K0 + 0x8C20110F, // 002A GETMET R8 R8 K15 + 0x7C200200, // 002B CALL R8 1 + 0x901E0E08, // 002C SETMBR R7 K7 R8 + 0x88200F0D, // 002D GETMBR R8 R7 K13 + 0x88240510, // 002E GETMBR R9 R2 K16 + 0x90222009, // 002F SETMBR R8 K16 R9 + 0x88200F0D, // 0030 GETMBR R8 R7 K13 + 0x88240502, // 0031 GETMBR R9 R2 K2 + 0x90220409, // 0032 SETMBR R8 K2 R9 + 0x88200F0D, // 0033 GETMBR R8 R7 K13 + 0x88240503, // 0034 GETMBR R9 R2 K3 + 0x90220609, // 0035 SETMBR R8 K3 R9 + 0x88200F07, // 0036 GETMBR R8 R7 K7 + 0x88240507, // 0037 GETMBR R9 R2 K7 + 0x90220E09, // 0038 SETMBR R8 K7 R9 + 0x88200111, // 0039 GETMBR R8 R0 K17 + 0x8C201112, // 003A GETMET R8 R8 K18 + 0x5C280E00, // 003B MOVE R10 R7 + 0x7C200400, // 003C CALL R8 2 + 0xB8222600, // 003D GETNGBL R8 K19 + 0x8C201114, // 003E GETMET R8 R8 K20 + 0x60280018, // 003F GETGBL R10 G24 + 0x582C0015, // 0040 LDCONST R11 K21 + 0x60300008, // 0041 GETGBL R12 G8 + 0x5C340400, // 0042 MOVE R13 R2 + 0x7C300200, // 0043 CALL R12 1 + 0x5C340A00, // 0044 MOVE R13 R5 + 0x88380507, // 0045 GETMBR R14 R2 K7 + 0x883C0507, // 0046 GETMBR R15 R2 K7 + 0xB8420000, // 0047 GETNGBL R16 K0 + 0x8840210B, // 0048 GETMBR R16 R16 K11 + 0x1C3C1E10, // 0049 EQ R15 R15 R16 + 0x783E0001, // 004A JMPF R15 #004D + 0x583C000B, // 004B LDCONST R15 K11 + 0x70020000, // 004C JMP #004E + 0x583C0006, // 004D LDCONST R15 K6 + 0x7C280A00, // 004E CALL R10 5 + 0x882C0510, // 004F GETMBR R11 R2 K16 + 0x202C1716, // 0050 NE R11 R11 K22 + 0x782E0001, // 0051 JMPF R11 #0054 + 0x582C0017, // 0052 LDCONST R11 K23 + 0x70020000, // 0053 JMP #0055 + 0x582C0018, // 0054 LDCONST R11 K24 + 0x7C200600, // 0055 CALL R8 3 + 0x50200200, // 0056 LDBOOL R8 1 0 + 0x80041000, // 0057 RET 1 R8 + 0x7002000A, // 0058 JMP #0064 + 0xB81E2600, // 0059 GETNGBL R7 K19 + 0x8C1C0F14, // 005A GETMET R7 R7 K20 + 0x60240018, // 005B GETGBL R9 G24 + 0x58280019, // 005C LDCONST R10 K25 + 0x602C0008, // 005D GETGBL R11 G8 + 0x5C300400, // 005E MOVE R12 R2 + 0x7C2C0200, // 005F CALL R11 1 + 0x5C300A00, // 0060 MOVE R12 R5 + 0x7C240600, // 0061 CALL R9 3 + 0x58280018, // 0062 LDCONST R10 K24 + 0x7C1C0600, // 0063 CALL R7 3 + 0x80000000, // 0064 RET 0 }) ), be_nested_proto( @@ -706,9 +697,9 @@ be_local_closure(Matter_IM_process_write_request, /* name */ 0, /* varg */ 1, /* has upvals */ ( &(const bupvaldesc[ 3]) { /* upvals */ - be_local_const_upval(1, 7), - be_local_const_upval(1, 9), - be_local_const_upval(1, 13), + be_local_const_upval(1, 6), + be_local_const_upval(1, 8), + be_local_const_upval(1, 12), }), 0, /* has sup protos */ NULL, /* no sub protos */ @@ -729,145 +720,143 @@ be_local_closure(Matter_IM_process_write_request, /* name */ ), }), 1, /* has constants */ - ( &(const bvalue[30]) { /* constants */ - /* K0 */ be_nested_str_weak(string), - /* K1 */ be_nested_str_weak(matter), - /* K2 */ be_nested_str_weak(WriteRequestMessage), - /* K3 */ be_nested_str_weak(from_TLV), - /* K4 */ be_nested_str_weak(suppress_response), - /* K5 */ be_nested_str_weak(device), - /* K6 */ be_nested_str_weak(get_active_endpoints), - /* K7 */ be_nested_str_weak(Path), - /* K8 */ be_nested_str_weak(write_requests), - /* K9 */ be_nested_str_weak(WriteResponseMessage), - /* K10 */ be_nested_str_weak(write_responses), - /* K11 */ be_nested_str_weak(path), - /* K12 */ be_nested_str_weak(data), - /* K13 */ be_nested_str_weak(endpoint), - /* K14 */ be_nested_str_weak(cluster), - /* K15 */ be_nested_str_weak(attribute), - /* K16 */ be_nested_str_weak(status), - /* K17 */ be_nested_str_weak(UNSUPPORTED_ATTRIBUTE), - /* K18 */ be_nested_str_weak(INVALID_ACTION), - /* K19 */ be_nested_str_weak(get_attribute_name), - /* K20 */ be_nested_str_weak(tasmota), - /* K21 */ be_nested_str_weak(log), - /* K22 */ be_nested_str_weak(MTR_X3A_X20Write_Attr_X20), - /* K23 */ be_nested_str_weak(_X20_X28), - /* K24 */ be_nested_str_weak(_X29), - /* K25 */ be_nested_str_weak(), - /* K26 */ be_const_int(3), - /* K27 */ be_nested_str_weak(process_attribute_expansion), - /* K28 */ be_nested_str_weak(stop_iteration), - /* K29 */ be_nested_str_weak(send_write_response), + ( &(const bvalue[29]) { /* constants */ + /* K0 */ be_nested_str_weak(matter), + /* K1 */ be_nested_str_weak(WriteRequestMessage), + /* K2 */ be_nested_str_weak(from_TLV), + /* K3 */ be_nested_str_weak(suppress_response), + /* K4 */ be_nested_str_weak(device), + /* K5 */ be_nested_str_weak(get_active_endpoints), + /* K6 */ be_nested_str_weak(Path), + /* K7 */ be_nested_str_weak(write_requests), + /* K8 */ be_nested_str_weak(WriteResponseMessage), + /* K9 */ be_nested_str_weak(write_responses), + /* K10 */ be_nested_str_weak(path), + /* K11 */ be_nested_str_weak(data), + /* K12 */ be_nested_str_weak(endpoint), + /* K13 */ be_nested_str_weak(cluster), + /* K14 */ be_nested_str_weak(attribute), + /* K15 */ be_nested_str_weak(status), + /* K16 */ be_nested_str_weak(UNSUPPORTED_ATTRIBUTE), + /* K17 */ be_nested_str_weak(INVALID_ACTION), + /* K18 */ be_nested_str_weak(get_attribute_name), + /* K19 */ be_nested_str_weak(tasmota), + /* K20 */ be_nested_str_weak(log), + /* K21 */ be_nested_str_weak(MTR_X3A_X20Write_Attr_X20), + /* K22 */ be_nested_str_weak(_X20_X28), + /* K23 */ be_nested_str_weak(_X29), + /* K24 */ be_nested_str_weak(), + /* K25 */ be_const_int(3), + /* K26 */ be_nested_str_weak(process_attribute_expansion), + /* K27 */ be_nested_str_weak(stop_iteration), + /* K28 */ be_nested_str_weak(send_write_response), }), be_str_weak(process_write_request), &be_const_str_solidified, - ( &(const binstruction[104]) { /* code */ - 0xA40E0000, // 0000 IMPORT R3 K0 - 0xB8120200, // 0001 GETNGBL R4 K1 - 0x8C100902, // 0002 GETMET R4 R4 K2 - 0x7C100200, // 0003 CALL R4 1 - 0x8C100903, // 0004 GETMET R4 R4 K3 - 0x5C180400, // 0005 MOVE R6 R2 - 0x7C100400, // 0006 CALL R4 2 - 0x88140904, // 0007 GETMBR R5 R4 K4 - 0x88180105, // 0008 GETMBR R6 R0 K5 - 0x8C180D06, // 0009 GETMET R6 R6 K6 - 0x7C180200, // 000A CALL R6 1 - 0x841C0000, // 000B CLOSURE R7 P0 - 0xB8220200, // 000C GETNGBL R8 K1 - 0x8C201107, // 000D GETMET R8 R8 K7 - 0x7C200200, // 000E CALL R8 1 - 0x88240908, // 000F GETMBR R9 R4 K8 - 0x4C280000, // 0010 LDNIL R10 - 0x2024120A, // 0011 NE R9 R9 R10 - 0x78260051, // 0012 JMPF R9 #0065 - 0xB8260200, // 0013 GETNGBL R9 K1 - 0x8C241309, // 0014 GETMET R9 R9 K9 - 0x7C240200, // 0015 CALL R9 1 - 0x60280012, // 0016 GETGBL R10 G18 - 0x7C280000, // 0017 CALL R10 0 - 0x9026140A, // 0018 SETMBR R9 K10 R10 - 0x60280010, // 0019 GETGBL R10 G16 - 0x882C0908, // 001A GETMBR R11 R4 K8 - 0x7C280200, // 001B CALL R10 1 - 0xA802003D, // 001C EXBLK 0 #005B - 0x5C2C1400, // 001D MOVE R11 R10 - 0x7C2C0000, // 001E CALL R11 0 - 0x8830170B, // 001F GETMBR R12 R11 K11 + ( &(const binstruction[103]) { /* code */ + 0xB80E0000, // 0000 GETNGBL R3 K0 + 0x8C0C0701, // 0001 GETMET R3 R3 K1 + 0x7C0C0200, // 0002 CALL R3 1 + 0x8C0C0702, // 0003 GETMET R3 R3 K2 + 0x5C140400, // 0004 MOVE R5 R2 + 0x7C0C0400, // 0005 CALL R3 2 + 0x88100703, // 0006 GETMBR R4 R3 K3 + 0x88140104, // 0007 GETMBR R5 R0 K4 + 0x8C140B05, // 0008 GETMET R5 R5 K5 + 0x7C140200, // 0009 CALL R5 1 + 0x84180000, // 000A CLOSURE R6 P0 + 0xB81E0000, // 000B GETNGBL R7 K0 + 0x8C1C0F06, // 000C GETMET R7 R7 K6 + 0x7C1C0200, // 000D CALL R7 1 + 0x88200707, // 000E GETMBR R8 R3 K7 + 0x4C240000, // 000F LDNIL R9 + 0x20201009, // 0010 NE R8 R8 R9 + 0x78220051, // 0011 JMPF R8 #0064 + 0xB8220000, // 0012 GETNGBL R8 K0 + 0x8C201108, // 0013 GETMET R8 R8 K8 + 0x7C200200, // 0014 CALL R8 1 + 0x60240012, // 0015 GETGBL R9 G18 + 0x7C240000, // 0016 CALL R9 0 + 0x90221209, // 0017 SETMBR R8 K9 R9 + 0x60240010, // 0018 GETGBL R9 G16 + 0x88280707, // 0019 GETMBR R10 R3 K7 + 0x7C240200, // 001A CALL R9 1 + 0xA802003D, // 001B EXBLK 0 #005A + 0x5C281200, // 001C MOVE R10 R9 + 0x7C280000, // 001D CALL R10 0 + 0x882C150A, // 001E GETMBR R11 R10 K10 + 0x8830150B, // 001F GETMBR R12 R10 K11 0x8834170C, // 0020 GETMBR R13 R11 K12 - 0x8838190D, // 0021 GETMBR R14 R12 K13 - 0x90221A0E, // 0022 SETMBR R8 K13 R14 - 0x8838190E, // 0023 GETMBR R14 R12 K14 - 0x90221C0E, // 0024 SETMBR R8 K14 R14 - 0x8838190F, // 0025 GETMBR R14 R12 K15 - 0x90221E0E, // 0026 SETMBR R8 K15 R14 - 0xB83A0200, // 0027 GETNGBL R14 K1 - 0x88381D11, // 0028 GETMBR R14 R14 K17 - 0x9022200E, // 0029 SETMBR R8 K16 R14 - 0x8838110E, // 002A GETMBR R14 R8 K14 - 0x4C3C0000, // 002B LDNIL R15 - 0x1C381C0F, // 002C EQ R14 R14 R15 - 0x743A0003, // 002D JMPT R14 #0032 - 0x8838110F, // 002E GETMBR R14 R8 K15 - 0x4C3C0000, // 002F LDNIL R15 - 0x1C381C0F, // 0030 EQ R14 R14 R15 - 0x783A000A, // 0031 JMPF R14 #003D - 0xB83A0200, // 0032 GETNGBL R14 K1 - 0x88381D12, // 0033 GETMBR R14 R14 K18 - 0x9022200E, // 0034 SETMBR R8 K16 R14 - 0x5C380E00, // 0035 MOVE R14 R7 - 0x5C3C1200, // 0036 MOVE R15 R9 - 0x4C400000, // 0037 LDNIL R16 - 0x5C441000, // 0038 MOVE R17 R8 - 0x4C480000, // 0039 LDNIL R18 - 0x504C0200, // 003A LDBOOL R19 1 0 - 0x7C380A00, // 003B CALL R14 5 - 0x7001FFDF, // 003C JMP #001D - 0x8838110D, // 003D GETMBR R14 R8 K13 - 0x4C3C0000, // 003E LDNIL R15 - 0x1C381C0F, // 003F EQ R14 R14 R15 - 0x783A0012, // 0040 JMPF R14 #0054 - 0xB83A0200, // 0041 GETNGBL R14 K1 - 0x8C381D13, // 0042 GETMET R14 R14 K19 - 0x8840110E, // 0043 GETMBR R16 R8 K14 - 0x8844110F, // 0044 GETMBR R17 R8 K15 - 0x7C380600, // 0045 CALL R14 3 - 0xB83E2800, // 0046 GETNGBL R15 K20 - 0x8C3C1F15, // 0047 GETMET R15 R15 K21 - 0x60440008, // 0048 GETGBL R17 G8 - 0x5C481000, // 0049 MOVE R18 R8 - 0x7C440200, // 004A CALL R17 1 - 0x00462C11, // 004B ADD R17 K22 R17 - 0x783A0002, // 004C JMPF R14 #0050 - 0x004A2E0E, // 004D ADD R18 K23 R14 - 0x00482518, // 004E ADD R18 R18 K24 - 0x70020000, // 004F JMP #0051 - 0x58480019, // 0050 LDCONST R18 K25 - 0x00442212, // 0051 ADD R17 R17 R18 - 0x5848001A, // 0052 LDCONST R18 K26 - 0x7C3C0600, // 0053 CALL R15 3 - 0x88380105, // 0054 GETMBR R14 R0 K5 - 0x8C381D1B, // 0055 GETMET R14 R14 K27 - 0x5C401000, // 0056 MOVE R16 R8 - 0x84440001, // 0057 CLOSURE R17 P1 - 0x7C380600, // 0058 CALL R14 3 - 0xA0280000, // 0059 CLOSE R10 - 0x7001FFC1, // 005A JMP #001D - 0x5828001C, // 005B LDCONST R10 K28 - 0xAC280200, // 005C CATCH R10 1 0 - 0xB0080000, // 005D RAISE 2 R0 R0 - 0x5C280A00, // 005E MOVE R10 R5 - 0x742A0003, // 005F JMPT R10 #0064 - 0x8C28011D, // 0060 GETMET R10 R0 K29 - 0x5C300200, // 0061 MOVE R12 R1 - 0x5C341200, // 0062 MOVE R13 R9 - 0x7C280600, // 0063 CALL R10 3 - 0xA0240000, // 0064 CLOSE R9 - 0x50240200, // 0065 LDBOOL R9 1 0 - 0xA0000000, // 0066 CLOSE R0 - 0x80041200, // 0067 RET 1 R9 + 0x901E180D, // 0021 SETMBR R7 K12 R13 + 0x8834170D, // 0022 GETMBR R13 R11 K13 + 0x901E1A0D, // 0023 SETMBR R7 K13 R13 + 0x8834170E, // 0024 GETMBR R13 R11 K14 + 0x901E1C0D, // 0025 SETMBR R7 K14 R13 + 0xB8360000, // 0026 GETNGBL R13 K0 + 0x88341B10, // 0027 GETMBR R13 R13 K16 + 0x901E1E0D, // 0028 SETMBR R7 K15 R13 + 0x88340F0D, // 0029 GETMBR R13 R7 K13 + 0x4C380000, // 002A LDNIL R14 + 0x1C341A0E, // 002B EQ R13 R13 R14 + 0x74360003, // 002C JMPT R13 #0031 + 0x88340F0E, // 002D GETMBR R13 R7 K14 + 0x4C380000, // 002E LDNIL R14 + 0x1C341A0E, // 002F EQ R13 R13 R14 + 0x7836000A, // 0030 JMPF R13 #003C + 0xB8360000, // 0031 GETNGBL R13 K0 + 0x88341B11, // 0032 GETMBR R13 R13 K17 + 0x901E1E0D, // 0033 SETMBR R7 K15 R13 + 0x5C340C00, // 0034 MOVE R13 R6 + 0x5C381000, // 0035 MOVE R14 R8 + 0x4C3C0000, // 0036 LDNIL R15 + 0x5C400E00, // 0037 MOVE R16 R7 + 0x4C440000, // 0038 LDNIL R17 + 0x50480200, // 0039 LDBOOL R18 1 0 + 0x7C340A00, // 003A CALL R13 5 + 0x7001FFDF, // 003B JMP #001C + 0x88340F0C, // 003C GETMBR R13 R7 K12 + 0x4C380000, // 003D LDNIL R14 + 0x1C341A0E, // 003E EQ R13 R13 R14 + 0x78360012, // 003F JMPF R13 #0053 + 0xB8360000, // 0040 GETNGBL R13 K0 + 0x8C341B12, // 0041 GETMET R13 R13 K18 + 0x883C0F0D, // 0042 GETMBR R15 R7 K13 + 0x88400F0E, // 0043 GETMBR R16 R7 K14 + 0x7C340600, // 0044 CALL R13 3 + 0xB83A2600, // 0045 GETNGBL R14 K19 + 0x8C381D14, // 0046 GETMET R14 R14 K20 + 0x60400008, // 0047 GETGBL R16 G8 + 0x5C440E00, // 0048 MOVE R17 R7 + 0x7C400200, // 0049 CALL R16 1 + 0x00422A10, // 004A ADD R16 K21 R16 + 0x78360002, // 004B JMPF R13 #004F + 0x00462C0D, // 004C ADD R17 K22 R13 + 0x00442317, // 004D ADD R17 R17 K23 + 0x70020000, // 004E JMP #0050 + 0x58440018, // 004F LDCONST R17 K24 + 0x00402011, // 0050 ADD R16 R16 R17 + 0x58440019, // 0051 LDCONST R17 K25 + 0x7C380600, // 0052 CALL R14 3 + 0x88340104, // 0053 GETMBR R13 R0 K4 + 0x8C341B1A, // 0054 GETMET R13 R13 K26 + 0x5C3C0E00, // 0055 MOVE R15 R7 + 0x84400001, // 0056 CLOSURE R16 P1 + 0x7C340600, // 0057 CALL R13 3 + 0xA0240000, // 0058 CLOSE R9 + 0x7001FFC1, // 0059 JMP #001C + 0x5824001B, // 005A LDCONST R9 K27 + 0xAC240200, // 005B CATCH R9 1 0 + 0xB0080000, // 005C RAISE 2 R0 R0 + 0x5C240800, // 005D MOVE R9 R4 + 0x74260003, // 005E JMPT R9 #0063 + 0x8C24011C, // 005F GETMET R9 R0 K28 + 0x5C2C0200, // 0060 MOVE R11 R1 + 0x5C301000, // 0061 MOVE R12 R8 + 0x7C240600, // 0062 CALL R9 3 + 0xA0200000, // 0063 CLOSE R8 + 0x50200200, // 0064 LDBOOL R8 1 0 + 0xA0000000, // 0065 CLOSE R0 + 0x80041000, // 0066 RET 1 R8 }) ) ); @@ -1173,7 +1162,7 @@ be_local_closure(Matter_IM_send_status, /* name */ ********************************************************************/ be_local_closure(Matter_IM_subscribe_response, /* name */ be_nested_proto( - 7, /* nstack */ + 6, /* nstack */ 3, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -1181,24 +1170,22 @@ be_local_closure(Matter_IM_subscribe_response, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[ 4]) { /* constants */ - /* K0 */ be_nested_str_weak(string), - /* K1 */ be_nested_str_weak(matter), - /* K2 */ be_nested_str_weak(SubscribeResponseMessage), - /* K3 */ be_nested_str_weak(from_TLV), + ( &(const bvalue[ 3]) { /* constants */ + /* K0 */ be_nested_str_weak(matter), + /* K1 */ be_nested_str_weak(SubscribeResponseMessage), + /* K2 */ be_nested_str_weak(from_TLV), }), be_str_weak(subscribe_response), &be_const_str_solidified, - ( &(const binstruction[ 9]) { /* code */ - 0xA40E0000, // 0000 IMPORT R3 K0 - 0xB8120200, // 0001 GETNGBL R4 K1 - 0x8C100902, // 0002 GETMET R4 R4 K2 - 0x7C100200, // 0003 CALL R4 1 - 0x8C100903, // 0004 GETMET R4 R4 K3 - 0x5C180400, // 0005 MOVE R6 R2 - 0x7C100400, // 0006 CALL R4 2 - 0x50140000, // 0007 LDBOOL R5 0 0 - 0x80040A00, // 0008 RET 1 R5 + ( &(const binstruction[ 8]) { /* code */ + 0xB80E0000, // 0000 GETNGBL R3 K0 + 0x8C0C0701, // 0001 GETMET R3 R3 K1 + 0x7C0C0200, // 0002 CALL R3 1 + 0x8C0C0702, // 0003 GETMET R3 R3 K2 + 0x5C140400, // 0004 MOVE R5 R2 + 0x7C0C0400, // 0005 CALL R3 2 + 0x50100000, // 0006 LDBOOL R4 0 0 + 0x80040800, // 0007 RET 1 R4 }) ) ); @@ -1365,7 +1352,7 @@ be_local_closure(Matter_IM_process_incoming, /* name */ ********************************************************************/ be_local_closure(Matter_IM__inner_process_read_request, /* name */ be_nested_proto( - 20, /* nstack */ + 18, /* nstack */ 4, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -1373,7 +1360,7 @@ be_local_closure(Matter_IM__inner_process_read_request, /* name */ 1, /* has sup protos */ ( &(const struct bproto*[ 2]) { be_nested_proto( - 25, /* nstack */ + 23, /* nstack */ 4, /* argc */ 0, /* varg */ 1, /* has upvals */ @@ -1384,257 +1371,254 @@ be_local_closure(Matter_IM__inner_process_read_request, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[40]) { /* constants */ - /* K0 */ be_nested_str_weak(string), - /* K1 */ be_nested_str_weak(matter), - /* K2 */ be_nested_str_weak(TLV), - /* K3 */ be_nested_str_weak(get_attribute_name), - /* K4 */ be_nested_str_weak(cluster), - /* K5 */ be_nested_str_weak(attribute), - /* K6 */ be_nested_str_weak(_X20_X28), - /* K7 */ be_nested_str_weak(_X29), - /* K8 */ be_nested_str_weak(), - /* K9 */ be_nested_str_weak(read_attribute), - /* K10 */ be_nested_str_weak(AttributeReportIB), - /* K11 */ be_nested_str_weak(attribute_data), - /* K12 */ be_nested_str_weak(AttributeDataIB), - /* K13 */ be_nested_str_weak(data_version), - /* K14 */ be_const_int(1), - /* K15 */ be_nested_str_weak(path), - /* K16 */ be_nested_str_weak(AttributePathIB), - /* K17 */ be_nested_str_weak(endpoint), - /* K18 */ be_nested_str_weak(data), - /* K19 */ be_nested_str_weak(to_TLV), - /* K20 */ be_nested_str_weak(encode_len), - /* K21 */ be_nested_str_weak(tlv2raw), - /* K22 */ be_nested_str_weak(tasmota), - /* K23 */ be_nested_str_weak(log), - /* K24 */ be_nested_str_weak(format), - /* K25 */ be_nested_str_weak(MTR_X3A_X20_X3ERead_Attr_X20_X28_X256i_X29_X20_X25s_X25s_X20_X2D_X20_X25s), - /* K26 */ be_nested_str_weak(local_session_id), - /* K27 */ be_const_int(3), - /* K28 */ be_nested_str_weak(status), - /* K29 */ be_nested_str_weak(attribute_status), - /* K30 */ be_nested_str_weak(AttributeStatusIB), - /* K31 */ be_nested_str_weak(StatusIB), - /* K32 */ be_nested_str_weak(MTR_X3A_X20_X3ERead_Attr_X20_X28_X256i_X29_X20_X25s_X25s_X20_X2D_X20STATUS_X3A_X200x_X2502X_X20_X25s), - /* K33 */ be_nested_str_weak(UNSUPPORTED_ATTRIBUTE), - /* K34 */ be_nested_str_weak(MTR_X3A_X20_X3ERead_Attr_X20_X28_X256i_X29_X20_X25s_X25s_X20_X2D_X20IGNORED), - /* K35 */ be_nested_str_weak(attribute_reports), - /* K36 */ be_const_int(0), - /* K37 */ be_nested_str_weak(push), - /* K38 */ be_nested_str_weak(IM_ReportData), - /* K39 */ be_nested_str_weak(MAX_MESSAGE), + ( &(const bvalue[38]) { /* constants */ + /* K0 */ be_nested_str_weak(matter), + /* K1 */ be_nested_str_weak(TLV), + /* K2 */ be_nested_str_weak(get_attribute_name), + /* K3 */ be_nested_str_weak(cluster), + /* K4 */ be_nested_str_weak(attribute), + /* K5 */ be_nested_str_weak(_X20_X28), + /* K6 */ be_nested_str_weak(_X29), + /* K7 */ be_nested_str_weak(), + /* K8 */ be_nested_str_weak(read_attribute), + /* K9 */ be_nested_str_weak(AttributeReportIB), + /* K10 */ be_nested_str_weak(attribute_data), + /* K11 */ be_nested_str_weak(AttributeDataIB), + /* K12 */ be_nested_str_weak(data_version), + /* K13 */ be_const_int(1), + /* K14 */ be_nested_str_weak(path), + /* K15 */ be_nested_str_weak(AttributePathIB), + /* K16 */ be_nested_str_weak(endpoint), + /* K17 */ be_nested_str_weak(data), + /* K18 */ be_nested_str_weak(to_TLV), + /* K19 */ be_nested_str_weak(encode_len), + /* K20 */ be_nested_str_weak(tlv2raw), + /* K21 */ be_nested_str_weak(tasmota), + /* K22 */ be_nested_str_weak(log), + /* K23 */ be_nested_str_weak(MTR_X3A_X20_X3ERead_Attr_X20_X28_X256i_X29_X20_X25s_X25s_X20_X2D_X20_X25s), + /* K24 */ be_nested_str_weak(local_session_id), + /* K25 */ be_const_int(3), + /* K26 */ be_nested_str_weak(status), + /* K27 */ be_nested_str_weak(attribute_status), + /* K28 */ be_nested_str_weak(AttributeStatusIB), + /* K29 */ be_nested_str_weak(StatusIB), + /* K30 */ be_nested_str_weak(MTR_X3A_X20_X3ERead_Attr_X20_X28_X256i_X29_X20_X25s_X25s_X20_X2D_X20STATUS_X3A_X200x_X2502X_X20_X25s), + /* K31 */ be_nested_str_weak(UNSUPPORTED_ATTRIBUTE), + /* K32 */ be_nested_str_weak(MTR_X3A_X20_X3ERead_Attr_X20_X28_X256i_X29_X20_X25s_X25s_X20_X2D_X20IGNORED), + /* K33 */ be_nested_str_weak(attribute_reports), + /* K34 */ be_const_int(0), + /* K35 */ be_nested_str_weak(push), + /* K36 */ be_nested_str_weak(IM_ReportData), + /* K37 */ be_nested_str_weak(MAX_MESSAGE), }), be_str_weak(read_single_attribute), &be_const_str_solidified, - ( &(const binstruction[206]) { /* code */ - 0xA4120000, // 0000 IMPORT R4 K0 - 0xB8160200, // 0001 GETNGBL R5 K1 - 0x88140B02, // 0002 GETMBR R5 R5 K2 - 0xB81A0200, // 0003 GETNGBL R6 K1 - 0x8C180D03, // 0004 GETMET R6 R6 K3 + ( &(const binstruction[205]) { /* code */ + 0xB8120000, // 0000 GETNGBL R4 K0 + 0x88100901, // 0001 GETMBR R4 R4 K1 + 0xB8160000, // 0002 GETNGBL R5 K0 + 0x8C140B02, // 0003 GETMET R5 R5 K2 + 0x881C0503, // 0004 GETMBR R7 R2 K3 0x88200504, // 0005 GETMBR R8 R2 K4 - 0x88240505, // 0006 GETMBR R9 R2 K5 - 0x7C180600, // 0007 CALL R6 3 - 0x781A0002, // 0008 JMPF R6 #000C - 0x001E0C06, // 0009 ADD R7 K6 R6 - 0x001C0F07, // 000A ADD R7 R7 K7 - 0x70020000, // 000B JMP #000D - 0x581C0008, // 000C LDCONST R7 K8 - 0x5C180E00, // 000D MOVE R6 R7 - 0x4C1C0000, // 000E LDNIL R7 - 0x201C0207, // 000F NE R7 R1 R7 - 0x781E0004, // 0010 JMPF R7 #0016 - 0x8C1C0309, // 0011 GETMET R7 R1 K9 - 0x68240000, // 0012 GETUPV R9 U0 - 0x5C280400, // 0013 MOVE R10 R2 - 0x7C1C0600, // 0014 CALL R7 3 - 0x70020000, // 0015 JMP #0017 - 0x4C1C0000, // 0016 LDNIL R7 - 0x50200200, // 0017 LDBOOL R8 1 0 + 0x7C140600, // 0006 CALL R5 3 + 0x78160002, // 0007 JMPF R5 #000B + 0x001A0A05, // 0008 ADD R6 K5 R5 + 0x00180D06, // 0009 ADD R6 R6 K6 + 0x70020000, // 000A JMP #000C + 0x58180007, // 000B LDCONST R6 K7 + 0x5C140C00, // 000C MOVE R5 R6 + 0x4C180000, // 000D LDNIL R6 + 0x20180206, // 000E NE R6 R1 R6 + 0x781A0004, // 000F JMPF R6 #0015 + 0x8C180308, // 0010 GETMET R6 R1 K8 + 0x68200000, // 0011 GETUPV R8 U0 + 0x5C240400, // 0012 MOVE R9 R2 + 0x7C180600, // 0013 CALL R6 3 + 0x70020000, // 0014 JMP #0016 + 0x4C180000, // 0015 LDNIL R6 + 0x501C0200, // 0016 LDBOOL R7 1 0 + 0x4C200000, // 0017 LDNIL R8 0x4C240000, // 0018 LDNIL R9 - 0x4C280000, // 0019 LDNIL R10 - 0x20280E0A, // 001A NE R10 R7 R10 - 0x782A003A, // 001B JMPF R10 #0057 - 0x60280008, // 001C GETGBL R10 G8 - 0x5C2C0E00, // 001D MOVE R11 R7 - 0x7C280200, // 001E CALL R10 1 - 0xB82E0200, // 001F GETNGBL R11 K1 - 0x8C2C170A, // 0020 GETMET R11 R11 K10 - 0x7C2C0200, // 0021 CALL R11 1 - 0xB8320200, // 0022 GETNGBL R12 K1 - 0x8C30190C, // 0023 GETMET R12 R12 K12 - 0x7C300200, // 0024 CALL R12 1 - 0x902E160C, // 0025 SETMBR R11 K11 R12 - 0x8830170B, // 0026 GETMBR R12 R11 K11 - 0x90321B0E, // 0027 SETMBR R12 K13 K14 - 0x8830170B, // 0028 GETMBR R12 R11 K11 - 0xB8360200, // 0029 GETNGBL R13 K1 - 0x8C341B10, // 002A GETMET R13 R13 K16 - 0x7C340200, // 002B CALL R13 1 - 0x90321E0D, // 002C SETMBR R12 K15 R13 - 0x8830170B, // 002D GETMBR R12 R11 K11 - 0x8830190F, // 002E GETMBR R12 R12 K15 - 0x88340511, // 002F GETMBR R13 R2 K17 - 0x9032220D, // 0030 SETMBR R12 K17 R13 - 0x8830170B, // 0031 GETMBR R12 R11 K11 - 0x8830190F, // 0032 GETMBR R12 R12 K15 - 0x88340504, // 0033 GETMBR R13 R2 K4 - 0x9032080D, // 0034 SETMBR R12 K4 R13 - 0x8830170B, // 0035 GETMBR R12 R11 K11 - 0x8830190F, // 0036 GETMBR R12 R12 K15 - 0x88340505, // 0037 GETMBR R13 R2 K5 - 0x90320A0D, // 0038 SETMBR R12 K5 R13 - 0x8830170B, // 0039 GETMBR R12 R11 K11 - 0x90322407, // 003A SETMBR R12 K18 R7 - 0x8C301713, // 003B GETMET R12 R11 K19 - 0x7C300200, // 003C CALL R12 1 - 0x8C341914, // 003D GETMET R13 R12 K20 - 0x7C340200, // 003E CALL R13 1 - 0x60380015, // 003F GETGBL R14 G21 - 0x5C3C1A00, // 0040 MOVE R15 R13 - 0x7C380200, // 0041 CALL R14 1 - 0x8C3C1915, // 0042 GETMET R15 R12 K21 - 0x5C441C00, // 0043 MOVE R17 R14 - 0x7C3C0400, // 0044 CALL R15 2 - 0x5C241E00, // 0045 MOVE R9 R15 - 0x683C0001, // 0046 GETUPV R15 U1 - 0x743E000D, // 0047 JMPT R15 #0056 - 0xB83E2C00, // 0048 GETNGBL R15 K22 - 0x8C3C1F17, // 0049 GETMET R15 R15 K23 - 0x8C440918, // 004A GETMET R17 R4 K24 - 0x584C0019, // 004B LDCONST R19 K25 - 0x68500000, // 004C GETUPV R20 U0 - 0x8850291A, // 004D GETMBR R20 R20 K26 - 0x60540008, // 004E GETGBL R21 G8 - 0x5C580400, // 004F MOVE R22 R2 - 0x7C540200, // 0050 CALL R21 1 - 0x5C580C00, // 0051 MOVE R22 R6 - 0x5C5C1400, // 0052 MOVE R23 R10 - 0x7C440C00, // 0053 CALL R17 6 - 0x5848001B, // 0054 LDCONST R18 K27 - 0x7C3C0600, // 0055 CALL R15 3 - 0x70020055, // 0056 JMP #00AD - 0x8828051C, // 0057 GETMBR R10 R2 K28 - 0x4C2C0000, // 0058 LDNIL R11 - 0x2028140B, // 0059 NE R10 R10 R11 - 0x782A0043, // 005A JMPF R10 #009F - 0x780E0041, // 005B JMPF R3 #009E - 0xB82A0200, // 005C GETNGBL R10 K1 - 0x8C28150A, // 005D GETMET R10 R10 K10 - 0x7C280200, // 005E CALL R10 1 - 0xB82E0200, // 005F GETNGBL R11 K1 - 0x8C2C171E, // 0060 GETMET R11 R11 K30 - 0x7C2C0200, // 0061 CALL R11 1 - 0x902A3A0B, // 0062 SETMBR R10 K29 R11 - 0x882C151D, // 0063 GETMBR R11 R10 K29 - 0xB8320200, // 0064 GETNGBL R12 K1 - 0x8C301910, // 0065 GETMET R12 R12 K16 - 0x7C300200, // 0066 CALL R12 1 - 0x902E1E0C, // 0067 SETMBR R11 K15 R12 - 0x882C151D, // 0068 GETMBR R11 R10 K29 - 0xB8320200, // 0069 GETNGBL R12 K1 - 0x8C30191F, // 006A GETMET R12 R12 K31 - 0x7C300200, // 006B CALL R12 1 - 0x902E380C, // 006C SETMBR R11 K28 R12 - 0x882C151D, // 006D GETMBR R11 R10 K29 - 0x882C170F, // 006E GETMBR R11 R11 K15 - 0x88300511, // 006F GETMBR R12 R2 K17 - 0x902E220C, // 0070 SETMBR R11 K17 R12 - 0x882C151D, // 0071 GETMBR R11 R10 K29 - 0x882C170F, // 0072 GETMBR R11 R11 K15 - 0x88300504, // 0073 GETMBR R12 R2 K4 - 0x902E080C, // 0074 SETMBR R11 K4 R12 - 0x882C151D, // 0075 GETMBR R11 R10 K29 - 0x882C170F, // 0076 GETMBR R11 R11 K15 - 0x88300505, // 0077 GETMBR R12 R2 K5 - 0x902E0A0C, // 0078 SETMBR R11 K5 R12 - 0x882C151D, // 0079 GETMBR R11 R10 K29 - 0x882C171C, // 007A GETMBR R11 R11 K28 - 0x8830051C, // 007B GETMBR R12 R2 K28 - 0x902E380C, // 007C SETMBR R11 K28 R12 - 0x8C2C1513, // 007D GETMET R11 R10 K19 - 0x7C2C0200, // 007E CALL R11 1 - 0x8C301714, // 007F GETMET R12 R11 K20 - 0x7C300200, // 0080 CALL R12 1 - 0x60340015, // 0081 GETGBL R13 G21 - 0x5C381800, // 0082 MOVE R14 R12 - 0x7C340200, // 0083 CALL R13 1 - 0x8C381715, // 0084 GETMET R14 R11 K21 - 0x5C401A00, // 0085 MOVE R16 R13 - 0x7C380400, // 0086 CALL R14 2 - 0x5C241C00, // 0087 MOVE R9 R14 - 0xB83A2C00, // 0088 GETNGBL R14 K22 - 0x8C381D17, // 0089 GETMET R14 R14 K23 - 0x8C400918, // 008A GETMET R16 R4 K24 - 0x58480020, // 008B LDCONST R18 K32 - 0x684C0000, // 008C GETUPV R19 U0 - 0x884C271A, // 008D GETMBR R19 R19 K26 - 0x60500008, // 008E GETGBL R20 G8 - 0x5C540400, // 008F MOVE R21 R2 - 0x7C500200, // 0090 CALL R20 1 - 0x5C540C00, // 0091 MOVE R21 R6 - 0x8858051C, // 0092 GETMBR R22 R2 K28 - 0x885C051C, // 0093 GETMBR R23 R2 K28 - 0xB8620200, // 0094 GETNGBL R24 K1 - 0x88603121, // 0095 GETMBR R24 R24 K33 - 0x1C5C2E18, // 0096 EQ R23 R23 R24 - 0x785E0001, // 0097 JMPF R23 #009A - 0x585C0021, // 0098 LDCONST R23 K33 - 0x70020000, // 0099 JMP #009B - 0x585C0008, // 009A LDCONST R23 K8 - 0x7C400E00, // 009B CALL R16 7 - 0x5844001B, // 009C LDCONST R17 K27 - 0x7C380600, // 009D CALL R14 3 - 0x7002000D, // 009E JMP #00AD - 0xB82A2C00, // 009F GETNGBL R10 K22 - 0x8C281517, // 00A0 GETMET R10 R10 K23 - 0x8C300918, // 00A1 GETMET R12 R4 K24 - 0x58380022, // 00A2 LDCONST R14 K34 - 0x683C0000, // 00A3 GETUPV R15 U0 - 0x883C1F1A, // 00A4 GETMBR R15 R15 K26 - 0x60400008, // 00A5 GETGBL R16 G8 - 0x5C440400, // 00A6 MOVE R17 R2 - 0x7C400200, // 00A7 CALL R16 1 - 0x5C440C00, // 00A8 MOVE R17 R6 - 0x7C300A00, // 00A9 CALL R12 5 - 0x5834001B, // 00AA LDCONST R13 K27 - 0x7C280600, // 00AB CALL R10 3 - 0x50200000, // 00AC LDBOOL R8 0 0 - 0x7826001E, // 00AD JMPF R9 #00CD - 0x6028000C, // 00AE GETGBL R10 G12 - 0x882C0123, // 00AF GETMBR R11 R0 K35 - 0x7C280200, // 00B0 CALL R10 1 - 0x1C281524, // 00B1 EQ R10 R10 K36 - 0x782A0004, // 00B2 JMPF R10 #00B8 - 0x88280123, // 00B3 GETMBR R10 R0 K35 - 0x8C281525, // 00B4 GETMET R10 R10 K37 - 0x5C301200, // 00B5 MOVE R12 R9 - 0x7C280400, // 00B6 CALL R10 2 - 0x70020014, // 00B7 JMP #00CD - 0x5429FFFE, // 00B8 LDINT R10 -1 - 0x882C0123, // 00B9 GETMBR R11 R0 K35 - 0x9428160A, // 00BA GETIDX R10 R11 R10 - 0x6030000C, // 00BB GETGBL R12 G12 - 0x5C341400, // 00BC MOVE R13 R10 - 0x7C300200, // 00BD CALL R12 1 - 0x6034000C, // 00BE GETGBL R13 G12 - 0x5C381200, // 00BF MOVE R14 R9 - 0x7C340200, // 00C0 CALL R13 1 - 0x0030180D, // 00C1 ADD R12 R12 R13 - 0xB8360200, // 00C2 GETNGBL R13 K1 - 0x88341B26, // 00C3 GETMBR R13 R13 K38 - 0x88341B27, // 00C4 GETMBR R13 R13 K39 - 0x1830180D, // 00C5 LE R12 R12 R13 - 0x78320001, // 00C6 JMPF R12 #00C9 - 0x40301409, // 00C7 CONNECT R12 R10 R9 - 0x70020003, // 00C8 JMP #00CD - 0x882C0123, // 00C9 GETMBR R11 R0 K35 - 0x8C2C1725, // 00CA GETMET R11 R11 K37 - 0x5C341200, // 00CB MOVE R13 R9 - 0x7C2C0400, // 00CC CALL R11 2 - 0x80041000, // 00CD RET 1 R8 + 0x20240C09, // 0019 NE R9 R6 R9 + 0x7826003A, // 001A JMPF R9 #0056 + 0x60240008, // 001B GETGBL R9 G8 + 0x5C280C00, // 001C MOVE R10 R6 + 0x7C240200, // 001D CALL R9 1 + 0xB82A0000, // 001E GETNGBL R10 K0 + 0x8C281509, // 001F GETMET R10 R10 K9 + 0x7C280200, // 0020 CALL R10 1 + 0xB82E0000, // 0021 GETNGBL R11 K0 + 0x8C2C170B, // 0022 GETMET R11 R11 K11 + 0x7C2C0200, // 0023 CALL R11 1 + 0x902A140B, // 0024 SETMBR R10 K10 R11 + 0x882C150A, // 0025 GETMBR R11 R10 K10 + 0x902E190D, // 0026 SETMBR R11 K12 K13 + 0x882C150A, // 0027 GETMBR R11 R10 K10 + 0xB8320000, // 0028 GETNGBL R12 K0 + 0x8C30190F, // 0029 GETMET R12 R12 K15 + 0x7C300200, // 002A CALL R12 1 + 0x902E1C0C, // 002B SETMBR R11 K14 R12 + 0x882C150A, // 002C GETMBR R11 R10 K10 + 0x882C170E, // 002D GETMBR R11 R11 K14 + 0x88300510, // 002E GETMBR R12 R2 K16 + 0x902E200C, // 002F SETMBR R11 K16 R12 + 0x882C150A, // 0030 GETMBR R11 R10 K10 + 0x882C170E, // 0031 GETMBR R11 R11 K14 + 0x88300503, // 0032 GETMBR R12 R2 K3 + 0x902E060C, // 0033 SETMBR R11 K3 R12 + 0x882C150A, // 0034 GETMBR R11 R10 K10 + 0x882C170E, // 0035 GETMBR R11 R11 K14 + 0x88300504, // 0036 GETMBR R12 R2 K4 + 0x902E080C, // 0037 SETMBR R11 K4 R12 + 0x882C150A, // 0038 GETMBR R11 R10 K10 + 0x902E2206, // 0039 SETMBR R11 K17 R6 + 0x8C2C1512, // 003A GETMET R11 R10 K18 + 0x7C2C0200, // 003B CALL R11 1 + 0x8C301713, // 003C GETMET R12 R11 K19 + 0x7C300200, // 003D CALL R12 1 + 0x60340015, // 003E GETGBL R13 G21 + 0x5C381800, // 003F MOVE R14 R12 + 0x7C340200, // 0040 CALL R13 1 + 0x8C381714, // 0041 GETMET R14 R11 K20 + 0x5C401A00, // 0042 MOVE R16 R13 + 0x7C380400, // 0043 CALL R14 2 + 0x5C201C00, // 0044 MOVE R8 R14 + 0x68380001, // 0045 GETUPV R14 U1 + 0x743A000D, // 0046 JMPT R14 #0055 + 0xB83A2A00, // 0047 GETNGBL R14 K21 + 0x8C381D16, // 0048 GETMET R14 R14 K22 + 0x60400018, // 0049 GETGBL R16 G24 + 0x58440017, // 004A LDCONST R17 K23 + 0x68480000, // 004B GETUPV R18 U0 + 0x88482518, // 004C GETMBR R18 R18 K24 + 0x604C0008, // 004D GETGBL R19 G8 + 0x5C500400, // 004E MOVE R20 R2 + 0x7C4C0200, // 004F CALL R19 1 + 0x5C500A00, // 0050 MOVE R20 R5 + 0x5C541200, // 0051 MOVE R21 R9 + 0x7C400A00, // 0052 CALL R16 5 + 0x58440019, // 0053 LDCONST R17 K25 + 0x7C380600, // 0054 CALL R14 3 + 0x70020055, // 0055 JMP #00AC + 0x8824051A, // 0056 GETMBR R9 R2 K26 + 0x4C280000, // 0057 LDNIL R10 + 0x2024120A, // 0058 NE R9 R9 R10 + 0x78260043, // 0059 JMPF R9 #009E + 0x780E0041, // 005A JMPF R3 #009D + 0xB8260000, // 005B GETNGBL R9 K0 + 0x8C241309, // 005C GETMET R9 R9 K9 + 0x7C240200, // 005D CALL R9 1 + 0xB82A0000, // 005E GETNGBL R10 K0 + 0x8C28151C, // 005F GETMET R10 R10 K28 + 0x7C280200, // 0060 CALL R10 1 + 0x9026360A, // 0061 SETMBR R9 K27 R10 + 0x8828131B, // 0062 GETMBR R10 R9 K27 + 0xB82E0000, // 0063 GETNGBL R11 K0 + 0x8C2C170F, // 0064 GETMET R11 R11 K15 + 0x7C2C0200, // 0065 CALL R11 1 + 0x902A1C0B, // 0066 SETMBR R10 K14 R11 + 0x8828131B, // 0067 GETMBR R10 R9 K27 + 0xB82E0000, // 0068 GETNGBL R11 K0 + 0x8C2C171D, // 0069 GETMET R11 R11 K29 + 0x7C2C0200, // 006A CALL R11 1 + 0x902A340B, // 006B SETMBR R10 K26 R11 + 0x8828131B, // 006C GETMBR R10 R9 K27 + 0x8828150E, // 006D GETMBR R10 R10 K14 + 0x882C0510, // 006E GETMBR R11 R2 K16 + 0x902A200B, // 006F SETMBR R10 K16 R11 + 0x8828131B, // 0070 GETMBR R10 R9 K27 + 0x8828150E, // 0071 GETMBR R10 R10 K14 + 0x882C0503, // 0072 GETMBR R11 R2 K3 + 0x902A060B, // 0073 SETMBR R10 K3 R11 + 0x8828131B, // 0074 GETMBR R10 R9 K27 + 0x8828150E, // 0075 GETMBR R10 R10 K14 + 0x882C0504, // 0076 GETMBR R11 R2 K4 + 0x902A080B, // 0077 SETMBR R10 K4 R11 + 0x8828131B, // 0078 GETMBR R10 R9 K27 + 0x8828151A, // 0079 GETMBR R10 R10 K26 + 0x882C051A, // 007A GETMBR R11 R2 K26 + 0x902A340B, // 007B SETMBR R10 K26 R11 + 0x8C281312, // 007C GETMET R10 R9 K18 + 0x7C280200, // 007D CALL R10 1 + 0x8C2C1513, // 007E GETMET R11 R10 K19 + 0x7C2C0200, // 007F CALL R11 1 + 0x60300015, // 0080 GETGBL R12 G21 + 0x5C341600, // 0081 MOVE R13 R11 + 0x7C300200, // 0082 CALL R12 1 + 0x8C341514, // 0083 GETMET R13 R10 K20 + 0x5C3C1800, // 0084 MOVE R15 R12 + 0x7C340400, // 0085 CALL R13 2 + 0x5C201A00, // 0086 MOVE R8 R13 + 0xB8362A00, // 0087 GETNGBL R13 K21 + 0x8C341B16, // 0088 GETMET R13 R13 K22 + 0x603C0018, // 0089 GETGBL R15 G24 + 0x5840001E, // 008A LDCONST R16 K30 + 0x68440000, // 008B GETUPV R17 U0 + 0x88442318, // 008C GETMBR R17 R17 K24 + 0x60480008, // 008D GETGBL R18 G8 + 0x5C4C0400, // 008E MOVE R19 R2 + 0x7C480200, // 008F CALL R18 1 + 0x5C4C0A00, // 0090 MOVE R19 R5 + 0x8850051A, // 0091 GETMBR R20 R2 K26 + 0x8854051A, // 0092 GETMBR R21 R2 K26 + 0xB85A0000, // 0093 GETNGBL R22 K0 + 0x88582D1F, // 0094 GETMBR R22 R22 K31 + 0x1C542A16, // 0095 EQ R21 R21 R22 + 0x78560001, // 0096 JMPF R21 #0099 + 0x5854001F, // 0097 LDCONST R21 K31 + 0x70020000, // 0098 JMP #009A + 0x58540007, // 0099 LDCONST R21 K7 + 0x7C3C0C00, // 009A CALL R15 6 + 0x58400019, // 009B LDCONST R16 K25 + 0x7C340600, // 009C CALL R13 3 + 0x7002000D, // 009D JMP #00AC + 0xB8262A00, // 009E GETNGBL R9 K21 + 0x8C241316, // 009F GETMET R9 R9 K22 + 0x602C0018, // 00A0 GETGBL R11 G24 + 0x58300020, // 00A1 LDCONST R12 K32 + 0x68340000, // 00A2 GETUPV R13 U0 + 0x88341B18, // 00A3 GETMBR R13 R13 K24 + 0x60380008, // 00A4 GETGBL R14 G8 + 0x5C3C0400, // 00A5 MOVE R15 R2 + 0x7C380200, // 00A6 CALL R14 1 + 0x5C3C0A00, // 00A7 MOVE R15 R5 + 0x7C2C0800, // 00A8 CALL R11 4 + 0x58300019, // 00A9 LDCONST R12 K25 + 0x7C240600, // 00AA CALL R9 3 + 0x501C0000, // 00AB LDBOOL R7 0 0 + 0x7822001E, // 00AC JMPF R8 #00CC + 0x6024000C, // 00AD GETGBL R9 G12 + 0x88280121, // 00AE GETMBR R10 R0 K33 + 0x7C240200, // 00AF CALL R9 1 + 0x1C241322, // 00B0 EQ R9 R9 K34 + 0x78260004, // 00B1 JMPF R9 #00B7 + 0x88240121, // 00B2 GETMBR R9 R0 K33 + 0x8C241323, // 00B3 GETMET R9 R9 K35 + 0x5C2C1000, // 00B4 MOVE R11 R8 + 0x7C240400, // 00B5 CALL R9 2 + 0x70020014, // 00B6 JMP #00CC + 0x5425FFFE, // 00B7 LDINT R9 -1 + 0x88280121, // 00B8 GETMBR R10 R0 K33 + 0x94241409, // 00B9 GETIDX R9 R10 R9 + 0x602C000C, // 00BA GETGBL R11 G12 + 0x5C301200, // 00BB MOVE R12 R9 + 0x7C2C0200, // 00BC CALL R11 1 + 0x6030000C, // 00BD GETGBL R12 G12 + 0x5C341000, // 00BE MOVE R13 R8 + 0x7C300200, // 00BF CALL R12 1 + 0x002C160C, // 00C0 ADD R11 R11 R12 + 0xB8320000, // 00C1 GETNGBL R12 K0 + 0x88301924, // 00C2 GETMBR R12 R12 K36 + 0x88301925, // 00C3 GETMBR R12 R12 K37 + 0x182C160C, // 00C4 LE R11 R11 R12 + 0x782E0001, // 00C5 JMPF R11 #00C8 + 0x402C1208, // 00C6 CONNECT R11 R9 R8 + 0x70020003, // 00C7 JMP #00CC + 0x88280121, // 00C8 GETMBR R10 R0 K33 + 0x8C281523, // 00C9 GETMET R10 R10 K35 + 0x5C301000, // 00CA MOVE R12 R8 + 0x7C280400, // 00CB CALL R10 2 + 0x80040E00, // 00CC RET 1 R7 }) ), be_nested_proto( @@ -1643,8 +1627,8 @@ be_local_closure(Matter_IM__inner_process_read_request, /* name */ 0, /* varg */ 1, /* has upvals */ ( &(const bupvaldesc[ 2]) { /* upvals */ - be_local_const_upval(1, 5), - be_local_const_upval(1, 8), + be_local_const_upval(1, 4), + be_local_const_upval(1, 7), }), 0, /* has sup protos */ NULL, /* no sub protos */ @@ -1664,130 +1648,127 @@ be_local_closure(Matter_IM__inner_process_read_request, /* name */ ), }), 1, /* has constants */ - ( &(const bvalue[25]) { /* constants */ - /* K0 */ be_nested_str_weak(string), - /* K1 */ be_nested_str_weak(device), - /* K2 */ be_nested_str_weak(get_active_endpoints), - /* K3 */ be_nested_str_weak(matter), - /* K4 */ be_nested_str_weak(Path), - /* K5 */ be_nested_str_weak(ReportDataMessage), - /* K6 */ be_nested_str_weak(attribute_reports), - /* K7 */ be_nested_str_weak(attributes_requests), - /* K8 */ be_nested_str_weak(endpoint), - /* K9 */ be_nested_str_weak(cluster), - /* K10 */ be_nested_str_weak(attribute), - /* K11 */ be_nested_str_weak(status), - /* K12 */ be_nested_str_weak(UNSUPPORTED_ATTRIBUTE), - /* K13 */ be_nested_str_weak(get_attribute_name), - /* K14 */ be_nested_str_weak(tasmota), - /* K15 */ be_nested_str_weak(log), - /* K16 */ be_nested_str_weak(format), - /* K17 */ be_nested_str_weak(MTR_X3A_X20_X3ERead_Attr_X20_X28_X256i_X29_X20_X25s), - /* K18 */ be_nested_str_weak(local_session_id), - /* K19 */ be_nested_str_weak(_X20_X28), - /* K20 */ be_nested_str_weak(_X29), - /* K21 */ be_nested_str_weak(), - /* K22 */ be_const_int(3), - /* K23 */ be_nested_str_weak(process_attribute_expansion), - /* K24 */ be_nested_str_weak(stop_iteration), + ( &(const bvalue[23]) { /* constants */ + /* K0 */ be_nested_str_weak(device), + /* K1 */ be_nested_str_weak(get_active_endpoints), + /* K2 */ be_nested_str_weak(matter), + /* K3 */ be_nested_str_weak(Path), + /* K4 */ be_nested_str_weak(ReportDataMessage), + /* K5 */ be_nested_str_weak(attribute_reports), + /* K6 */ be_nested_str_weak(attributes_requests), + /* K7 */ be_nested_str_weak(endpoint), + /* K8 */ be_nested_str_weak(cluster), + /* K9 */ be_nested_str_weak(attribute), + /* K10 */ be_nested_str_weak(status), + /* K11 */ be_nested_str_weak(UNSUPPORTED_ATTRIBUTE), + /* K12 */ be_nested_str_weak(get_attribute_name), + /* K13 */ be_nested_str_weak(tasmota), + /* K14 */ be_nested_str_weak(log), + /* K15 */ be_nested_str_weak(MTR_X3A_X20_X3ERead_Attr_X20_X28_X256i_X29_X20_X25s), + /* K16 */ be_nested_str_weak(local_session_id), + /* K17 */ be_nested_str_weak(_X20_X28), + /* K18 */ be_nested_str_weak(_X29), + /* K19 */ be_nested_str_weak(), + /* K20 */ be_const_int(3), + /* K21 */ be_nested_str_weak(process_attribute_expansion), + /* K22 */ be_nested_str_weak(stop_iteration), }), be_str_weak(_inner_process_read_request), &be_const_str_solidified, - ( &(const binstruction[94]) { /* code */ - 0xA4120000, // 0000 IMPORT R4 K0 - 0x84140000, // 0001 CLOSURE R5 P0 - 0x88180101, // 0002 GETMBR R6 R0 K1 - 0x8C180D02, // 0003 GETMET R6 R6 K2 - 0x7C180200, // 0004 CALL R6 1 - 0xB81E0600, // 0005 GETNGBL R7 K3 - 0x8C1C0F04, // 0006 GETMET R7 R7 K4 - 0x7C1C0200, // 0007 CALL R7 1 - 0xB8220600, // 0008 GETNGBL R8 K3 - 0x8C201105, // 0009 GETMET R8 R8 K5 - 0x7C200200, // 000A CALL R8 1 - 0x60240012, // 000B GETGBL R9 G18 - 0x7C240000, // 000C CALL R9 0 - 0x90220C09, // 000D SETMBR R8 K6 R9 - 0x60240010, // 000E GETGBL R9 G16 - 0x88280507, // 000F GETMBR R10 R2 K7 - 0x7C240200, // 0010 CALL R9 1 - 0xA8020046, // 0011 EXBLK 0 #0059 - 0x5C281200, // 0012 MOVE R10 R9 - 0x7C280000, // 0013 CALL R10 0 - 0x882C1508, // 0014 GETMBR R11 R10 K8 - 0x901E100B, // 0015 SETMBR R7 K8 R11 - 0x882C1509, // 0016 GETMBR R11 R10 K9 - 0x901E120B, // 0017 SETMBR R7 K9 R11 - 0x882C150A, // 0018 GETMBR R11 R10 K10 - 0x901E140B, // 0019 SETMBR R7 K10 R11 - 0xB82E0600, // 001A GETNGBL R11 K3 - 0x882C170C, // 001B GETMBR R11 R11 K12 - 0x901E160B, // 001C SETMBR R7 K11 R11 - 0x882C0F08, // 001D GETMBR R11 R7 K8 - 0x4C300000, // 001E LDNIL R12 - 0x1C2C160C, // 001F EQ R11 R11 R12 - 0x742E0007, // 0020 JMPT R11 #0029 - 0x882C0F09, // 0021 GETMBR R11 R7 K9 - 0x4C300000, // 0022 LDNIL R12 - 0x1C2C160C, // 0023 EQ R11 R11 R12 - 0x742E0003, // 0024 JMPT R11 #0029 - 0x882C0F0A, // 0025 GETMBR R11 R7 K10 - 0x4C300000, // 0026 LDNIL R12 - 0x1C2C160C, // 0027 EQ R11 R11 R12 - 0x782E0029, // 0028 JMPF R11 #0053 - 0x882C0F09, // 0029 GETMBR R11 R7 K9 - 0x4C300000, // 002A LDNIL R12 - 0x202C160C, // 002B NE R11 R11 R12 - 0x782E001A, // 002C JMPF R11 #0048 - 0x882C0F0A, // 002D GETMBR R11 R7 K10 - 0x4C300000, // 002E LDNIL R12 - 0x202C160C, // 002F NE R11 R11 R12 - 0x782E0016, // 0030 JMPF R11 #0048 - 0xB82E0600, // 0031 GETNGBL R11 K3 - 0x8C2C170D, // 0032 GETMET R11 R11 K13 - 0x88340F09, // 0033 GETMBR R13 R7 K9 - 0x88380F0A, // 0034 GETMBR R14 R7 K10 - 0x7C2C0600, // 0035 CALL R11 3 - 0xB8321C00, // 0036 GETNGBL R12 K14 - 0x8C30190F, // 0037 GETMET R12 R12 K15 - 0x8C380910, // 0038 GETMET R14 R4 K16 - 0x58400011, // 0039 LDCONST R16 K17 - 0x88440312, // 003A GETMBR R17 R1 K18 - 0x60480008, // 003B GETGBL R18 G8 - 0x5C4C0E00, // 003C MOVE R19 R7 - 0x7C480200, // 003D CALL R18 1 - 0x782E0002, // 003E JMPF R11 #0042 - 0x004E260B, // 003F ADD R19 K19 R11 - 0x004C2714, // 0040 ADD R19 R19 K20 - 0x70020000, // 0041 JMP #0043 - 0x584C0015, // 0042 LDCONST R19 K21 - 0x00482413, // 0043 ADD R18 R18 R19 - 0x7C380800, // 0044 CALL R14 4 - 0x583C0016, // 0045 LDCONST R15 K22 - 0x7C300600, // 0046 CALL R12 3 - 0x7002000A, // 0047 JMP #0053 - 0xB82E1C00, // 0048 GETNGBL R11 K14 - 0x8C2C170F, // 0049 GETMET R11 R11 K15 - 0x8C340910, // 004A GETMET R13 R4 K16 - 0x583C0011, // 004B LDCONST R15 K17 - 0x88400312, // 004C GETMBR R16 R1 K18 - 0x60440008, // 004D GETGBL R17 G8 - 0x5C480E00, // 004E MOVE R18 R7 - 0x7C440200, // 004F CALL R17 1 - 0x7C340800, // 0050 CALL R13 4 - 0x58380016, // 0051 LDCONST R14 K22 - 0x7C2C0600, // 0052 CALL R11 3 - 0x882C0101, // 0053 GETMBR R11 R0 K1 - 0x8C2C1717, // 0054 GETMET R11 R11 K23 - 0x5C340E00, // 0055 MOVE R13 R7 - 0x84380001, // 0056 CLOSURE R14 P1 - 0x7C2C0600, // 0057 CALL R11 3 - 0x7001FFB8, // 0058 JMP #0012 - 0x58240018, // 0059 LDCONST R9 K24 - 0xAC240200, // 005A CATCH R9 1 0 - 0xB0080000, // 005B RAISE 2 R0 R0 - 0xA0000000, // 005C CLOSE R0 - 0x80041000, // 005D RET 1 R8 + ( &(const binstruction[93]) { /* code */ + 0x84100000, // 0000 CLOSURE R4 P0 + 0x88140100, // 0001 GETMBR R5 R0 K0 + 0x8C140B01, // 0002 GETMET R5 R5 K1 + 0x7C140200, // 0003 CALL R5 1 + 0xB81A0400, // 0004 GETNGBL R6 K2 + 0x8C180D03, // 0005 GETMET R6 R6 K3 + 0x7C180200, // 0006 CALL R6 1 + 0xB81E0400, // 0007 GETNGBL R7 K2 + 0x8C1C0F04, // 0008 GETMET R7 R7 K4 + 0x7C1C0200, // 0009 CALL R7 1 + 0x60200012, // 000A GETGBL R8 G18 + 0x7C200000, // 000B CALL R8 0 + 0x901E0A08, // 000C SETMBR R7 K5 R8 + 0x60200010, // 000D GETGBL R8 G16 + 0x88240506, // 000E GETMBR R9 R2 K6 + 0x7C200200, // 000F CALL R8 1 + 0xA8020046, // 0010 EXBLK 0 #0058 + 0x5C241000, // 0011 MOVE R9 R8 + 0x7C240000, // 0012 CALL R9 0 + 0x88281307, // 0013 GETMBR R10 R9 K7 + 0x901A0E0A, // 0014 SETMBR R6 K7 R10 + 0x88281308, // 0015 GETMBR R10 R9 K8 + 0x901A100A, // 0016 SETMBR R6 K8 R10 + 0x88281309, // 0017 GETMBR R10 R9 K9 + 0x901A120A, // 0018 SETMBR R6 K9 R10 + 0xB82A0400, // 0019 GETNGBL R10 K2 + 0x8828150B, // 001A GETMBR R10 R10 K11 + 0x901A140A, // 001B SETMBR R6 K10 R10 + 0x88280D07, // 001C GETMBR R10 R6 K7 + 0x4C2C0000, // 001D LDNIL R11 + 0x1C28140B, // 001E EQ R10 R10 R11 + 0x742A0007, // 001F JMPT R10 #0028 + 0x88280D08, // 0020 GETMBR R10 R6 K8 + 0x4C2C0000, // 0021 LDNIL R11 + 0x1C28140B, // 0022 EQ R10 R10 R11 + 0x742A0003, // 0023 JMPT R10 #0028 + 0x88280D09, // 0024 GETMBR R10 R6 K9 + 0x4C2C0000, // 0025 LDNIL R11 + 0x1C28140B, // 0026 EQ R10 R10 R11 + 0x782A0029, // 0027 JMPF R10 #0052 + 0x88280D08, // 0028 GETMBR R10 R6 K8 + 0x4C2C0000, // 0029 LDNIL R11 + 0x2028140B, // 002A NE R10 R10 R11 + 0x782A001A, // 002B JMPF R10 #0047 + 0x88280D09, // 002C GETMBR R10 R6 K9 + 0x4C2C0000, // 002D LDNIL R11 + 0x2028140B, // 002E NE R10 R10 R11 + 0x782A0016, // 002F JMPF R10 #0047 + 0xB82A0400, // 0030 GETNGBL R10 K2 + 0x8C28150C, // 0031 GETMET R10 R10 K12 + 0x88300D08, // 0032 GETMBR R12 R6 K8 + 0x88340D09, // 0033 GETMBR R13 R6 K9 + 0x7C280600, // 0034 CALL R10 3 + 0xB82E1A00, // 0035 GETNGBL R11 K13 + 0x8C2C170E, // 0036 GETMET R11 R11 K14 + 0x60340018, // 0037 GETGBL R13 G24 + 0x5838000F, // 0038 LDCONST R14 K15 + 0x883C0310, // 0039 GETMBR R15 R1 K16 + 0x60400008, // 003A GETGBL R16 G8 + 0x5C440C00, // 003B MOVE R17 R6 + 0x7C400200, // 003C CALL R16 1 + 0x782A0002, // 003D JMPF R10 #0041 + 0x0046220A, // 003E ADD R17 K17 R10 + 0x00442312, // 003F ADD R17 R17 K18 + 0x70020000, // 0040 JMP #0042 + 0x58440013, // 0041 LDCONST R17 K19 + 0x00402011, // 0042 ADD R16 R16 R17 + 0x7C340600, // 0043 CALL R13 3 + 0x58380014, // 0044 LDCONST R14 K20 + 0x7C2C0600, // 0045 CALL R11 3 + 0x7002000A, // 0046 JMP #0052 + 0xB82A1A00, // 0047 GETNGBL R10 K13 + 0x8C28150E, // 0048 GETMET R10 R10 K14 + 0x60300018, // 0049 GETGBL R12 G24 + 0x5834000F, // 004A LDCONST R13 K15 + 0x88380310, // 004B GETMBR R14 R1 K16 + 0x603C0008, // 004C GETGBL R15 G8 + 0x5C400C00, // 004D MOVE R16 R6 + 0x7C3C0200, // 004E CALL R15 1 + 0x7C300600, // 004F CALL R12 3 + 0x58340014, // 0050 LDCONST R13 K20 + 0x7C280600, // 0051 CALL R10 3 + 0x88280100, // 0052 GETMBR R10 R0 K0 + 0x8C281515, // 0053 GETMET R10 R10 K21 + 0x5C300C00, // 0054 MOVE R12 R6 + 0x84340001, // 0055 CLOSURE R13 P1 + 0x7C280600, // 0056 CALL R10 3 + 0x7001FFB8, // 0057 JMP #0011 + 0x58200016, // 0058 LDCONST R8 K22 + 0xAC200200, // 0059 CATCH R8 1 0 + 0xB0080000, // 005A RAISE 2 R0 R0 + 0xA0000000, // 005B CLOSE R0 + 0x80040E00, // 005C RET 1 R7 }) ) ); @@ -1849,7 +1830,7 @@ be_local_closure(Matter_IM_find_sendqueue_by_exchangeid, /* name */ ********************************************************************/ be_local_closure(Matter_IM_process_incoming_ack, /* name */ be_nested_proto( - 7, /* nstack */ + 6, /* nstack */ 2, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -1857,26 +1838,24 @@ be_local_closure(Matter_IM_process_incoming_ack, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[ 4]) { /* constants */ - /* K0 */ be_nested_str_weak(string), - /* K1 */ be_nested_str_weak(find_sendqueue_by_exchangeid), - /* K2 */ be_nested_str_weak(exchange_id), - /* K3 */ be_nested_str_weak(ack_received), + ( &(const bvalue[ 3]) { /* constants */ + /* K0 */ be_nested_str_weak(find_sendqueue_by_exchangeid), + /* K1 */ be_nested_str_weak(exchange_id), + /* K2 */ be_nested_str_weak(ack_received), }), be_str_weak(process_incoming_ack), &be_const_str_solidified, - ( &(const binstruction[11]) { /* code */ - 0xA40A0000, // 0000 IMPORT R2 K0 - 0x8C0C0101, // 0001 GETMET R3 R0 K1 - 0x88140302, // 0002 GETMBR R5 R1 K2 - 0x7C0C0400, // 0003 CALL R3 2 - 0x780E0003, // 0004 JMPF R3 #0009 - 0x8C100703, // 0005 GETMET R4 R3 K3 - 0x5C180200, // 0006 MOVE R6 R1 - 0x7C100400, // 0007 CALL R4 2 - 0x80040800, // 0008 RET 1 R4 - 0x50100000, // 0009 LDBOOL R4 0 0 - 0x80040800, // 000A RET 1 R4 + ( &(const binstruction[10]) { /* code */ + 0x8C080100, // 0000 GETMET R2 R0 K0 + 0x88100301, // 0001 GETMBR R4 R1 K1 + 0x7C080400, // 0002 CALL R2 2 + 0x780A0003, // 0003 JMPF R2 #0008 + 0x8C0C0502, // 0004 GETMET R3 R2 K2 + 0x5C140200, // 0005 MOVE R5 R1 + 0x7C0C0400, // 0006 CALL R3 2 + 0x80040600, // 0007 RET 1 R3 + 0x500C0000, // 0008 LDBOOL R3 0 0 + 0x80040600, // 0009 RET 1 R3 }) ) ); @@ -1976,7 +1955,7 @@ be_local_closure(Matter_IM_send_report_data, /* name */ ********************************************************************/ be_local_closure(Matter_IM_process_status_response, /* name */ be_nested_proto( - 13, /* nstack */ + 11, /* nstack */ 3, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -1984,75 +1963,72 @@ be_local_closure(Matter_IM_process_status_response, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[18]) { /* constants */ - /* K0 */ be_nested_str_weak(string), - /* K1 */ be_nested_str_weak(findsubval), - /* K2 */ be_const_int(0), - /* K3 */ be_nested_str_weak(find_sendqueue_by_exchangeid), - /* K4 */ be_nested_str_weak(exchange_id), - /* K5 */ be_nested_str_weak(matter), - /* K6 */ be_nested_str_weak(SUCCESS), - /* K7 */ be_nested_str_weak(status_ok_received), - /* K8 */ be_nested_str_weak(tasmota), - /* K9 */ be_nested_str_weak(log), - /* K10 */ be_nested_str_weak(format), - /* K11 */ be_nested_str_weak(MTR_X3A_X20_X3EOK_X20_X20_X20_X20_X20_X20_X20_X20_X28_X256i_X29_X20exch_X3D_X25i_X20not_X20found), - /* K12 */ be_nested_str_weak(session), - /* K13 */ be_nested_str_weak(local_session_id), - /* K14 */ be_const_int(3), - /* K15 */ be_nested_str_weak(MTR_X3A_X20_X3EStatus_X20_X20_X20_X20ERROR_X20_X3D_X200x_X2502X), - /* K16 */ be_nested_str_weak(status_error_received), - /* K17 */ be_nested_str_weak(remove_sendqueue_by_exchangeid), + ( &(const bvalue[16]) { /* constants */ + /* K0 */ be_nested_str_weak(findsubval), + /* K1 */ be_const_int(0), + /* K2 */ be_nested_str_weak(find_sendqueue_by_exchangeid), + /* K3 */ be_nested_str_weak(exchange_id), + /* K4 */ be_nested_str_weak(matter), + /* K5 */ be_nested_str_weak(SUCCESS), + /* K6 */ be_nested_str_weak(status_ok_received), + /* K7 */ be_nested_str_weak(tasmota), + /* K8 */ be_nested_str_weak(log), + /* K9 */ be_nested_str_weak(MTR_X3A_X20_X3EOK_X20_X20_X20_X20_X20_X20_X20_X20_X28_X256i_X29_X20exch_X3D_X25i_X20not_X20found), + /* K10 */ be_nested_str_weak(session), + /* K11 */ be_nested_str_weak(local_session_id), + /* K12 */ be_const_int(3), + /* K13 */ be_nested_str_weak(MTR_X3A_X20_X3EStatus_X20_X20_X20_X20ERROR_X20_X3D_X200x_X2502X), + /* K14 */ be_nested_str_weak(status_error_received), + /* K15 */ be_nested_str_weak(remove_sendqueue_by_exchangeid), }), be_str_weak(process_status_response), &be_const_str_solidified, - ( &(const binstruction[46]) { /* code */ - 0xA40E0000, // 0000 IMPORT R3 K0 - 0x8C100501, // 0001 GETMET R4 R2 K1 - 0x58180002, // 0002 LDCONST R6 K2 - 0x541E00FE, // 0003 LDINT R7 255 - 0x7C100600, // 0004 CALL R4 3 - 0x8C140103, // 0005 GETMET R5 R0 K3 - 0x881C0304, // 0006 GETMBR R7 R1 K4 - 0x7C140400, // 0007 CALL R5 2 - 0xB81A0A00, // 0008 GETNGBL R6 K5 - 0x88180D06, // 0009 GETMBR R6 R6 K6 - 0x1C180806, // 000A EQ R6 R4 R6 - 0x781A0010, // 000B JMPF R6 #001D - 0x78160004, // 000C JMPF R5 #0012 - 0x8C180B07, // 000D GETMET R6 R5 K7 - 0x5C200200, // 000E MOVE R8 R1 - 0x7C180400, // 000F CALL R6 2 - 0x80040C00, // 0010 RET 1 R6 - 0x70020009, // 0011 JMP #001C - 0xB81A1000, // 0012 GETNGBL R6 K8 - 0x8C180D09, // 0013 GETMET R6 R6 K9 - 0x8C20070A, // 0014 GETMET R8 R3 K10 - 0x5828000B, // 0015 LDCONST R10 K11 - 0x882C030C, // 0016 GETMBR R11 R1 K12 - 0x882C170D, // 0017 GETMBR R11 R11 K13 - 0x88300304, // 0018 GETMBR R12 R1 K4 - 0x7C200800, // 0019 CALL R8 4 - 0x5824000E, // 001A LDCONST R9 K14 - 0x7C180600, // 001B CALL R6 3 - 0x7002000E, // 001C JMP #002C - 0xB81A1000, // 001D GETNGBL R6 K8 - 0x8C180D09, // 001E GETMET R6 R6 K9 - 0x8C20070A, // 001F GETMET R8 R3 K10 - 0x5828000F, // 0020 LDCONST R10 K15 - 0x5C2C0800, // 0021 MOVE R11 R4 - 0x7C200600, // 0022 CALL R8 3 - 0x5824000E, // 0023 LDCONST R9 K14 - 0x7C180600, // 0024 CALL R6 3 - 0x78160005, // 0025 JMPF R5 #002C - 0x8C180B10, // 0026 GETMET R6 R5 K16 - 0x5C200200, // 0027 MOVE R8 R1 - 0x7C180400, // 0028 CALL R6 2 - 0x8C180111, // 0029 GETMET R6 R0 K17 - 0x88200304, // 002A GETMBR R8 R1 K4 - 0x7C180400, // 002B CALL R6 2 - 0x50180000, // 002C LDBOOL R6 0 0 - 0x80040C00, // 002D RET 1 R6 + ( &(const binstruction[45]) { /* code */ + 0x8C0C0500, // 0000 GETMET R3 R2 K0 + 0x58140001, // 0001 LDCONST R5 K1 + 0x541A00FE, // 0002 LDINT R6 255 + 0x7C0C0600, // 0003 CALL R3 3 + 0x8C100102, // 0004 GETMET R4 R0 K2 + 0x88180303, // 0005 GETMBR R6 R1 K3 + 0x7C100400, // 0006 CALL R4 2 + 0xB8160800, // 0007 GETNGBL R5 K4 + 0x88140B05, // 0008 GETMBR R5 R5 K5 + 0x1C140605, // 0009 EQ R5 R3 R5 + 0x78160010, // 000A JMPF R5 #001C + 0x78120004, // 000B JMPF R4 #0011 + 0x8C140906, // 000C GETMET R5 R4 K6 + 0x5C1C0200, // 000D MOVE R7 R1 + 0x7C140400, // 000E CALL R5 2 + 0x80040A00, // 000F RET 1 R5 + 0x70020009, // 0010 JMP #001B + 0xB8160E00, // 0011 GETNGBL R5 K7 + 0x8C140B08, // 0012 GETMET R5 R5 K8 + 0x601C0018, // 0013 GETGBL R7 G24 + 0x58200009, // 0014 LDCONST R8 K9 + 0x8824030A, // 0015 GETMBR R9 R1 K10 + 0x8824130B, // 0016 GETMBR R9 R9 K11 + 0x88280303, // 0017 GETMBR R10 R1 K3 + 0x7C1C0600, // 0018 CALL R7 3 + 0x5820000C, // 0019 LDCONST R8 K12 + 0x7C140600, // 001A CALL R5 3 + 0x7002000E, // 001B JMP #002B + 0xB8160E00, // 001C GETNGBL R5 K7 + 0x8C140B08, // 001D GETMET R5 R5 K8 + 0x601C0018, // 001E GETGBL R7 G24 + 0x5820000D, // 001F LDCONST R8 K13 + 0x5C240600, // 0020 MOVE R9 R3 + 0x7C1C0400, // 0021 CALL R7 2 + 0x5820000C, // 0022 LDCONST R8 K12 + 0x7C140600, // 0023 CALL R5 3 + 0x78120005, // 0024 JMPF R4 #002B + 0x8C14090E, // 0025 GETMET R5 R4 K14 + 0x5C1C0200, // 0026 MOVE R7 R1 + 0x7C140400, // 0027 CALL R5 2 + 0x8C14010F, // 0028 GETMET R5 R0 K15 + 0x881C0303, // 0029 GETMBR R7 R1 K3 + 0x7C140400, // 002A CALL R5 2 + 0x50140000, // 002B LDBOOL R5 0 0 + 0x80040A00, // 002C RET 1 R5 }) ) ); @@ -2064,7 +2040,7 @@ be_local_closure(Matter_IM_process_status_response, /* name */ ********************************************************************/ be_local_closure(Matter_IM_process_write_response, /* name */ be_nested_proto( - 7, /* nstack */ + 6, /* nstack */ 3, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -2072,24 +2048,22 @@ be_local_closure(Matter_IM_process_write_response, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[ 4]) { /* constants */ - /* K0 */ be_nested_str_weak(string), - /* K1 */ be_nested_str_weak(matter), - /* K2 */ be_nested_str_weak(WriteResponseMessage), - /* K3 */ be_nested_str_weak(from_TLV), + ( &(const bvalue[ 3]) { /* constants */ + /* K0 */ be_nested_str_weak(matter), + /* K1 */ be_nested_str_weak(WriteResponseMessage), + /* K2 */ be_nested_str_weak(from_TLV), }), be_str_weak(process_write_response), &be_const_str_solidified, - ( &(const binstruction[ 9]) { /* code */ - 0xA40E0000, // 0000 IMPORT R3 K0 - 0xB8120200, // 0001 GETNGBL R4 K1 - 0x8C100902, // 0002 GETMET R4 R4 K2 - 0x7C100200, // 0003 CALL R4 1 - 0x8C100903, // 0004 GETMET R4 R4 K3 - 0x5C180400, // 0005 MOVE R6 R2 - 0x7C100400, // 0006 CALL R4 2 - 0x50140000, // 0007 LDBOOL R5 0 0 - 0x80040A00, // 0008 RET 1 R5 + ( &(const binstruction[ 8]) { /* code */ + 0xB80E0000, // 0000 GETNGBL R3 K0 + 0x8C0C0701, // 0001 GETMET R3 R3 K1 + 0x7C0C0200, // 0002 CALL R3 1 + 0x8C0C0702, // 0003 GETMET R3 R3 K2 + 0x5C140400, // 0004 MOVE R5 R2 + 0x7C0C0400, // 0005 CALL R3 2 + 0x50100000, // 0006 LDBOOL R4 0 0 + 0x80040800, // 0007 RET 1 R4 }) ) ); @@ -2101,7 +2075,7 @@ be_local_closure(Matter_IM_process_write_response, /* name */ ********************************************************************/ be_local_closure(Matter_IM_send_subscribe_update, /* name */ be_nested_proto( - 12, /* nstack */ + 11, /* nstack */ 2, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -2109,105 +2083,102 @@ be_local_closure(Matter_IM_send_subscribe_update, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[27]) { /* constants */ - /* K0 */ be_nested_str_weak(string), - /* K1 */ be_nested_str_weak(session), - /* K2 */ be_nested_str_weak(matter), - /* K3 */ be_nested_str_weak(ReadRequestMessage), - /* K4 */ be_nested_str_weak(fabric_filtered), - /* K5 */ be_nested_str_weak(attributes_requests), - /* K6 */ be_nested_str_weak(updates), - /* K7 */ be_nested_str_weak(AttributePathIB), - /* K8 */ be_nested_str_weak(endpoint), - /* K9 */ be_nested_str_weak(cluster), - /* K10 */ be_nested_str_weak(attribute), - /* K11 */ be_nested_str_weak(push), - /* K12 */ be_nested_str_weak(stop_iteration), - /* K13 */ be_nested_str_weak(tasmota), - /* K14 */ be_nested_str_weak(log), - /* K15 */ be_nested_str_weak(format), - /* K16 */ be_nested_str_weak(MTR_X3A_X20_X3CSub_Data_X20_X20_X28_X256i_X29_X20sub_X3D_X25i), - /* K17 */ be_nested_str_weak(local_session_id), - /* K18 */ be_nested_str_weak(subscription_id), - /* K19 */ be_const_int(3), - /* K20 */ be_nested_str_weak(is_keep_alive), - /* K21 */ be_nested_str_weak(_inner_process_read_request), - /* K22 */ be_nested_str_weak(suppress_response), - /* K23 */ be_nested_str_weak(IM_ReportDataSubscribed), - /* K24 */ be_nested_str_weak(_message_handler), - /* K25 */ be_nested_str_weak(send_queue), - /* K26 */ be_nested_str_weak(send_enqueued), + ( &(const bvalue[25]) { /* constants */ + /* K0 */ be_nested_str_weak(session), + /* K1 */ be_nested_str_weak(matter), + /* K2 */ be_nested_str_weak(ReadRequestMessage), + /* K3 */ be_nested_str_weak(fabric_filtered), + /* K4 */ be_nested_str_weak(attributes_requests), + /* K5 */ be_nested_str_weak(updates), + /* K6 */ be_nested_str_weak(AttributePathIB), + /* K7 */ be_nested_str_weak(endpoint), + /* K8 */ be_nested_str_weak(cluster), + /* K9 */ be_nested_str_weak(attribute), + /* K10 */ be_nested_str_weak(push), + /* K11 */ be_nested_str_weak(stop_iteration), + /* K12 */ be_nested_str_weak(tasmota), + /* K13 */ be_nested_str_weak(log), + /* K14 */ be_nested_str_weak(MTR_X3A_X20_X3CSub_Data_X20_X20_X28_X256i_X29_X20sub_X3D_X25i), + /* K15 */ be_nested_str_weak(local_session_id), + /* K16 */ be_nested_str_weak(subscription_id), + /* K17 */ be_const_int(3), + /* K18 */ be_nested_str_weak(is_keep_alive), + /* K19 */ be_nested_str_weak(_inner_process_read_request), + /* K20 */ be_nested_str_weak(suppress_response), + /* K21 */ be_nested_str_weak(IM_ReportDataSubscribed), + /* K22 */ be_nested_str_weak(_message_handler), + /* K23 */ be_nested_str_weak(send_queue), + /* K24 */ be_nested_str_weak(send_enqueued), }), be_str_weak(send_subscribe_update), &be_const_str_solidified, - ( &(const binstruction[67]) { /* code */ - 0xA40A0000, // 0000 IMPORT R2 K0 - 0x880C0301, // 0001 GETMBR R3 R1 K1 - 0xB8120400, // 0002 GETNGBL R4 K2 - 0x8C100903, // 0003 GETMET R4 R4 K3 - 0x7C100200, // 0004 CALL R4 1 - 0x50140000, // 0005 LDBOOL R5 0 0 - 0x90120805, // 0006 SETMBR R4 K4 R5 - 0x60140012, // 0007 GETGBL R5 G18 - 0x7C140000, // 0008 CALL R5 0 - 0x90120A05, // 0009 SETMBR R4 K5 R5 - 0x60140010, // 000A GETGBL R5 G16 - 0x88180306, // 000B GETMBR R6 R1 K6 - 0x7C140200, // 000C CALL R5 1 - 0xA802000F, // 000D EXBLK 0 #001E - 0x5C180A00, // 000E MOVE R6 R5 - 0x7C180000, // 000F CALL R6 0 - 0xB81E0400, // 0010 GETNGBL R7 K2 - 0x8C1C0F07, // 0011 GETMET R7 R7 K7 - 0x7C1C0200, // 0012 CALL R7 1 - 0x88200D08, // 0013 GETMBR R8 R6 K8 - 0x901E1008, // 0014 SETMBR R7 K8 R8 - 0x88200D09, // 0015 GETMBR R8 R6 K9 - 0x901E1208, // 0016 SETMBR R7 K9 R8 - 0x88200D0A, // 0017 GETMBR R8 R6 K10 - 0x901E1408, // 0018 SETMBR R7 K10 R8 - 0x88200905, // 0019 GETMBR R8 R4 K5 - 0x8C20110B, // 001A GETMET R8 R8 K11 - 0x5C280E00, // 001B MOVE R10 R7 - 0x7C200400, // 001C CALL R8 2 - 0x7001FFEF, // 001D JMP #000E - 0x5814000C, // 001E LDCONST R5 K12 - 0xAC140200, // 001F CATCH R5 1 0 - 0xB0080000, // 0020 RAISE 2 R0 R0 - 0xB8161A00, // 0021 GETNGBL R5 K13 - 0x8C140B0E, // 0022 GETMET R5 R5 K14 - 0x8C1C050F, // 0023 GETMET R7 R2 K15 - 0x58240010, // 0024 LDCONST R9 K16 - 0x88280711, // 0025 GETMBR R10 R3 K17 - 0x882C0312, // 0026 GETMBR R11 R1 K18 - 0x7C1C0800, // 0027 CALL R7 4 - 0x58200013, // 0028 LDCONST R8 K19 - 0x7C140600, // 0029 CALL R5 3 - 0x50140000, // 002A LDBOOL R5 0 0 - 0x90062805, // 002B SETMBR R1 K20 R5 - 0x8C140115, // 002C GETMET R5 R0 K21 + ( &(const binstruction[66]) { /* code */ + 0x88080300, // 0000 GETMBR R2 R1 K0 + 0xB80E0200, // 0001 GETNGBL R3 K1 + 0x8C0C0702, // 0002 GETMET R3 R3 K2 + 0x7C0C0200, // 0003 CALL R3 1 + 0x50100000, // 0004 LDBOOL R4 0 0 + 0x900E0604, // 0005 SETMBR R3 K3 R4 + 0x60100012, // 0006 GETGBL R4 G18 + 0x7C100000, // 0007 CALL R4 0 + 0x900E0804, // 0008 SETMBR R3 K4 R4 + 0x60100010, // 0009 GETGBL R4 G16 + 0x88140305, // 000A GETMBR R5 R1 K5 + 0x7C100200, // 000B CALL R4 1 + 0xA802000F, // 000C EXBLK 0 #001D + 0x5C140800, // 000D MOVE R5 R4 + 0x7C140000, // 000E CALL R5 0 + 0xB81A0200, // 000F GETNGBL R6 K1 + 0x8C180D06, // 0010 GETMET R6 R6 K6 + 0x7C180200, // 0011 CALL R6 1 + 0x881C0B07, // 0012 GETMBR R7 R5 K7 + 0x901A0E07, // 0013 SETMBR R6 K7 R7 + 0x881C0B08, // 0014 GETMBR R7 R5 K8 + 0x901A1007, // 0015 SETMBR R6 K8 R7 + 0x881C0B09, // 0016 GETMBR R7 R5 K9 + 0x901A1207, // 0017 SETMBR R6 K9 R7 + 0x881C0704, // 0018 GETMBR R7 R3 K4 + 0x8C1C0F0A, // 0019 GETMET R7 R7 K10 + 0x5C240C00, // 001A MOVE R9 R6 + 0x7C1C0400, // 001B CALL R7 2 + 0x7001FFEF, // 001C JMP #000D + 0x5810000B, // 001D LDCONST R4 K11 + 0xAC100200, // 001E CATCH R4 1 0 + 0xB0080000, // 001F RAISE 2 R0 R0 + 0xB8121800, // 0020 GETNGBL R4 K12 + 0x8C10090D, // 0021 GETMET R4 R4 K13 + 0x60180018, // 0022 GETGBL R6 G24 + 0x581C000E, // 0023 LDCONST R7 K14 + 0x8820050F, // 0024 GETMBR R8 R2 K15 + 0x88240310, // 0025 GETMBR R9 R1 K16 + 0x7C180600, // 0026 CALL R6 3 + 0x581C0011, // 0027 LDCONST R7 K17 + 0x7C100600, // 0028 CALL R4 3 + 0x50100000, // 0029 LDBOOL R4 0 0 + 0x90062404, // 002A SETMBR R1 K18 R4 + 0x8C100113, // 002B GETMET R4 R0 K19 + 0x5C180400, // 002C MOVE R6 R2 0x5C1C0600, // 002D MOVE R7 R3 - 0x5C200800, // 002E MOVE R8 R4 - 0x7C140600, // 002F CALL R5 3 - 0x50180000, // 0030 LDBOOL R6 0 0 - 0x90162C06, // 0031 SETMBR R5 K22 R6 - 0x88180312, // 0032 GETMBR R6 R1 K18 - 0x90162406, // 0033 SETMBR R5 K18 R6 - 0xB81A0400, // 0034 GETNGBL R6 K2 - 0x8C180D17, // 0035 GETMET R6 R6 K23 - 0x88200718, // 0036 GETMBR R8 R3 K24 - 0x5C240600, // 0037 MOVE R9 R3 - 0x5C280A00, // 0038 MOVE R10 R5 - 0x5C2C0200, // 0039 MOVE R11 R1 - 0x7C180A00, // 003A CALL R6 5 - 0x881C0119, // 003B GETMBR R7 R0 K25 - 0x8C1C0F0B, // 003C GETMET R7 R7 K11 - 0x5C240C00, // 003D MOVE R9 R6 - 0x7C1C0400, // 003E CALL R7 2 - 0x8C1C011A, // 003F GETMET R7 R0 K26 - 0x88240718, // 0040 GETMBR R9 R3 K24 - 0x7C1C0400, // 0041 CALL R7 2 - 0x80000000, // 0042 RET 0 + 0x7C100600, // 002E CALL R4 3 + 0x50140000, // 002F LDBOOL R5 0 0 + 0x90122805, // 0030 SETMBR R4 K20 R5 + 0x88140310, // 0031 GETMBR R5 R1 K16 + 0x90122005, // 0032 SETMBR R4 K16 R5 + 0xB8160200, // 0033 GETNGBL R5 K1 + 0x8C140B15, // 0034 GETMET R5 R5 K21 + 0x881C0516, // 0035 GETMBR R7 R2 K22 + 0x5C200400, // 0036 MOVE R8 R2 + 0x5C240800, // 0037 MOVE R9 R4 + 0x5C280200, // 0038 MOVE R10 R1 + 0x7C140A00, // 0039 CALL R5 5 + 0x88180117, // 003A GETMBR R6 R0 K23 + 0x8C180D0A, // 003B GETMET R6 R6 K10 + 0x5C200A00, // 003C MOVE R8 R5 + 0x7C180400, // 003D CALL R6 2 + 0x8C180118, // 003E GETMET R6 R0 K24 + 0x88200516, // 003F GETMBR R8 R2 K22 + 0x7C180400, // 0040 CALL R6 2 + 0x80000000, // 0041 RET 0 }) ) ); @@ -2289,7 +2260,7 @@ be_local_closure(Matter_IM_send_enqueued, /* name */ ********************************************************************/ be_local_closure(Matter_IM_process_timed_request, /* name */ be_nested_proto( - 12, /* nstack */ + 10, /* nstack */ 3, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -2297,49 +2268,46 @@ be_local_closure(Matter_IM_process_timed_request, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[14]) { /* constants */ - /* K0 */ be_nested_str_weak(string), - /* K1 */ be_nested_str_weak(matter), - /* K2 */ be_nested_str_weak(TimedRequestMessage), - /* K3 */ be_nested_str_weak(from_TLV), - /* K4 */ be_nested_str_weak(tasmota), - /* K5 */ be_nested_str_weak(log), - /* K6 */ be_nested_str_weak(format), - /* K7 */ be_nested_str_weak(MTR_X3A_X20_X3ECommand_X20_X20_X20_X28_X256i_X29_X20TimedRequest_X3D_X25i), - /* K8 */ be_nested_str_weak(session), - /* K9 */ be_nested_str_weak(local_session_id), - /* K10 */ be_nested_str_weak(timeout), - /* K11 */ be_const_int(3), - /* K12 */ be_nested_str_weak(send_status), - /* K13 */ be_nested_str_weak(SUCCESS), + ( &(const bvalue[12]) { /* constants */ + /* K0 */ be_nested_str_weak(matter), + /* K1 */ be_nested_str_weak(TimedRequestMessage), + /* K2 */ be_nested_str_weak(from_TLV), + /* K3 */ be_nested_str_weak(tasmota), + /* K4 */ be_nested_str_weak(log), + /* K5 */ be_nested_str_weak(MTR_X3A_X20_X3ECommand_X20_X20_X20_X28_X256i_X29_X20TimedRequest_X3D_X25i), + /* K6 */ be_nested_str_weak(session), + /* K7 */ be_nested_str_weak(local_session_id), + /* K8 */ be_nested_str_weak(timeout), + /* K9 */ be_const_int(3), + /* K10 */ be_nested_str_weak(send_status), + /* K11 */ be_nested_str_weak(SUCCESS), }), be_str_weak(process_timed_request), &be_const_str_solidified, - ( &(const binstruction[24]) { /* code */ - 0xA40E0000, // 0000 IMPORT R3 K0 - 0xB8120200, // 0001 GETNGBL R4 K1 - 0x8C100902, // 0002 GETMET R4 R4 K2 - 0x7C100200, // 0003 CALL R4 1 - 0x8C100903, // 0004 GETMET R4 R4 K3 - 0x5C180400, // 0005 MOVE R6 R2 - 0x7C100400, // 0006 CALL R4 2 - 0xB8160800, // 0007 GETNGBL R5 K4 - 0x8C140B05, // 0008 GETMET R5 R5 K5 - 0x8C1C0706, // 0009 GETMET R7 R3 K6 - 0x58240007, // 000A LDCONST R9 K7 - 0x88280308, // 000B GETMBR R10 R1 K8 - 0x88281509, // 000C GETMBR R10 R10 K9 - 0x882C090A, // 000D GETMBR R11 R4 K10 - 0x7C1C0800, // 000E CALL R7 4 - 0x5820000B, // 000F LDCONST R8 K11 - 0x7C140600, // 0010 CALL R5 3 - 0x8C14010C, // 0011 GETMET R5 R0 K12 - 0x5C1C0200, // 0012 MOVE R7 R1 - 0xB8220200, // 0013 GETNGBL R8 K1 - 0x8820110D, // 0014 GETMBR R8 R8 K13 - 0x7C140600, // 0015 CALL R5 3 - 0x50140200, // 0016 LDBOOL R5 1 0 - 0x80040A00, // 0017 RET 1 R5 + ( &(const binstruction[23]) { /* code */ + 0xB80E0000, // 0000 GETNGBL R3 K0 + 0x8C0C0701, // 0001 GETMET R3 R3 K1 + 0x7C0C0200, // 0002 CALL R3 1 + 0x8C0C0702, // 0003 GETMET R3 R3 K2 + 0x5C140400, // 0004 MOVE R5 R2 + 0x7C0C0400, // 0005 CALL R3 2 + 0xB8120600, // 0006 GETNGBL R4 K3 + 0x8C100904, // 0007 GETMET R4 R4 K4 + 0x60180018, // 0008 GETGBL R6 G24 + 0x581C0005, // 0009 LDCONST R7 K5 + 0x88200306, // 000A GETMBR R8 R1 K6 + 0x88201107, // 000B GETMBR R8 R8 K7 + 0x88240708, // 000C GETMBR R9 R3 K8 + 0x7C180600, // 000D CALL R6 3 + 0x581C0009, // 000E LDCONST R7 K9 + 0x7C100600, // 000F CALL R4 3 + 0x8C10010A, // 0010 GETMET R4 R0 K10 + 0x5C180200, // 0011 MOVE R6 R1 + 0xB81E0000, // 0012 GETNGBL R7 K0 + 0x881C0F0B, // 0013 GETMBR R7 R7 K11 + 0x7C100600, // 0014 CALL R4 3 + 0x50100200, // 0015 LDBOOL R4 1 0 + 0x80040800, // 0016 RET 1 R4 }) ) ); @@ -2351,7 +2319,7 @@ be_local_closure(Matter_IM_process_timed_request, /* name */ ********************************************************************/ be_local_closure(Matter_IM_report_data, /* name */ be_nested_proto( - 7, /* nstack */ + 6, /* nstack */ 3, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -2359,24 +2327,22 @@ be_local_closure(Matter_IM_report_data, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[ 4]) { /* constants */ - /* K0 */ be_nested_str_weak(string), - /* K1 */ be_nested_str_weak(matter), - /* K2 */ be_nested_str_weak(ReportDataMessage), - /* K3 */ be_nested_str_weak(from_TLV), + ( &(const bvalue[ 3]) { /* constants */ + /* K0 */ be_nested_str_weak(matter), + /* K1 */ be_nested_str_weak(ReportDataMessage), + /* K2 */ be_nested_str_weak(from_TLV), }), be_str_weak(report_data), &be_const_str_solidified, - ( &(const binstruction[ 9]) { /* code */ - 0xA40E0000, // 0000 IMPORT R3 K0 - 0xB8120200, // 0001 GETNGBL R4 K1 - 0x8C100902, // 0002 GETMET R4 R4 K2 - 0x7C100200, // 0003 CALL R4 1 - 0x8C100903, // 0004 GETMET R4 R4 K3 - 0x5C180400, // 0005 MOVE R6 R2 - 0x7C100400, // 0006 CALL R4 2 - 0x50140000, // 0007 LDBOOL R5 0 0 - 0x80040A00, // 0008 RET 1 R5 + ( &(const binstruction[ 8]) { /* code */ + 0xB80E0000, // 0000 GETNGBL R3 K0 + 0x8C0C0701, // 0001 GETMET R3 R3 K1 + 0x7C0C0200, // 0002 CALL R3 1 + 0x8C0C0702, // 0003 GETMET R3 R3 K2 + 0x5C140400, // 0004 MOVE R5 R2 + 0x7C0C0400, // 0005 CALL R3 2 + 0x50100000, // 0006 LDBOOL R4 0 0 + 0x80040800, // 0007 RET 1 R4 }) ) ); @@ -2388,7 +2354,7 @@ be_local_closure(Matter_IM_report_data, /* name */ ********************************************************************/ be_local_closure(Matter_IM_process_invoke_response, /* name */ be_nested_proto( - 7, /* nstack */ + 6, /* nstack */ 3, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -2396,24 +2362,22 @@ be_local_closure(Matter_IM_process_invoke_response, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[ 4]) { /* constants */ - /* K0 */ be_nested_str_weak(string), - /* K1 */ be_nested_str_weak(matter), - /* K2 */ be_nested_str_weak(InvokeResponseMessage), - /* K3 */ be_nested_str_weak(from_TLV), + ( &(const bvalue[ 3]) { /* constants */ + /* K0 */ be_nested_str_weak(matter), + /* K1 */ be_nested_str_weak(InvokeResponseMessage), + /* K2 */ be_nested_str_weak(from_TLV), }), be_str_weak(process_invoke_response), &be_const_str_solidified, - ( &(const binstruction[ 9]) { /* code */ - 0xA40E0000, // 0000 IMPORT R3 K0 - 0xB8120200, // 0001 GETNGBL R4 K1 - 0x8C100902, // 0002 GETMET R4 R4 K2 - 0x7C100200, // 0003 CALL R4 1 - 0x8C100903, // 0004 GETMET R4 R4 K3 - 0x5C180400, // 0005 MOVE R6 R2 - 0x7C100400, // 0006 CALL R4 2 - 0x50140000, // 0007 LDBOOL R5 0 0 - 0x80040A00, // 0008 RET 1 R5 + ( &(const binstruction[ 8]) { /* code */ + 0xB80E0000, // 0000 GETNGBL R3 K0 + 0x8C0C0701, // 0001 GETMET R3 R3 K1 + 0x7C0C0200, // 0002 CALL R3 1 + 0x8C0C0702, // 0003 GETMET R3 R3 K2 + 0x5C140400, // 0004 MOVE R5 R2 + 0x7C0C0400, // 0005 CALL R3 2 + 0x50100000, // 0006 LDBOOL R4 0 0 + 0x80040800, // 0007 RET 1 R4 }) ) ); @@ -2464,7 +2428,7 @@ be_local_closure(Matter_IM_init, /* name */ ********************************************************************/ be_local_closure(Matter_IM_send_subscribe_heartbeat, /* name */ be_nested_proto( - 11, /* nstack */ + 10, /* nstack */ 2, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -2472,64 +2436,61 @@ be_local_closure(Matter_IM_send_subscribe_heartbeat, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[18]) { /* constants */ - /* K0 */ be_nested_str_weak(string), - /* K1 */ be_nested_str_weak(session), - /* K2 */ be_nested_str_weak(tasmota), - /* K3 */ be_nested_str_weak(log), - /* K4 */ be_nested_str_weak(format), - /* K5 */ be_nested_str_weak(MTR_X3A_X20_X3CSub_Alive_X20_X28_X256i_X29_X20sub_X3D_X25i), - /* K6 */ be_nested_str_weak(local_session_id), - /* K7 */ be_nested_str_weak(subscription_id), - /* K8 */ be_const_int(3), - /* K9 */ be_nested_str_weak(is_keep_alive), - /* K10 */ be_nested_str_weak(matter), - /* K11 */ be_nested_str_weak(ReportDataMessage), - /* K12 */ be_nested_str_weak(suppress_response), - /* K13 */ be_nested_str_weak(IM_SubscribedHeartbeat), - /* K14 */ be_nested_str_weak(_message_handler), - /* K15 */ be_nested_str_weak(send_queue), - /* K16 */ be_nested_str_weak(push), - /* K17 */ be_nested_str_weak(send_enqueued), + ( &(const bvalue[16]) { /* constants */ + /* K0 */ be_nested_str_weak(session), + /* K1 */ be_nested_str_weak(tasmota), + /* K2 */ be_nested_str_weak(log), + /* K3 */ be_nested_str_weak(MTR_X3A_X20_X3CSub_Alive_X20_X28_X256i_X29_X20sub_X3D_X25i), + /* K4 */ be_nested_str_weak(local_session_id), + /* K5 */ be_nested_str_weak(subscription_id), + /* K6 */ be_const_int(3), + /* K7 */ be_nested_str_weak(is_keep_alive), + /* K8 */ be_nested_str_weak(matter), + /* K9 */ be_nested_str_weak(ReportDataMessage), + /* K10 */ be_nested_str_weak(suppress_response), + /* K11 */ be_nested_str_weak(IM_SubscribedHeartbeat), + /* K12 */ be_nested_str_weak(_message_handler), + /* K13 */ be_nested_str_weak(send_queue), + /* K14 */ be_nested_str_weak(push), + /* K15 */ be_nested_str_weak(send_enqueued), }), be_str_weak(send_subscribe_heartbeat), &be_const_str_solidified, - ( &(const binstruction[35]) { /* code */ - 0xA40A0000, // 0000 IMPORT R2 K0 - 0x880C0301, // 0001 GETMBR R3 R1 K1 - 0xB8120400, // 0002 GETNGBL R4 K2 - 0x8C100903, // 0003 GETMET R4 R4 K3 - 0x8C180504, // 0004 GETMET R6 R2 K4 - 0x58200005, // 0005 LDCONST R8 K5 - 0x88240706, // 0006 GETMBR R9 R3 K6 - 0x88280307, // 0007 GETMBR R10 R1 K7 - 0x7C180800, // 0008 CALL R6 4 - 0x581C0008, // 0009 LDCONST R7 K8 - 0x7C100600, // 000A CALL R4 3 - 0x50100200, // 000B LDBOOL R4 1 0 - 0x90061204, // 000C SETMBR R1 K9 R4 - 0xB8121400, // 000D GETNGBL R4 K10 - 0x8C10090B, // 000E GETMET R4 R4 K11 - 0x7C100200, // 000F CALL R4 1 - 0x50140200, // 0010 LDBOOL R5 1 0 - 0x90121805, // 0011 SETMBR R4 K12 R5 - 0x88140307, // 0012 GETMBR R5 R1 K7 - 0x90120E05, // 0013 SETMBR R4 K7 R5 - 0xB8161400, // 0014 GETNGBL R5 K10 - 0x8C140B0D, // 0015 GETMET R5 R5 K13 - 0x881C070E, // 0016 GETMBR R7 R3 K14 + ( &(const binstruction[34]) { /* code */ + 0x88080300, // 0000 GETMBR R2 R1 K0 + 0xB80E0200, // 0001 GETNGBL R3 K1 + 0x8C0C0702, // 0002 GETMET R3 R3 K2 + 0x60140018, // 0003 GETGBL R5 G24 + 0x58180003, // 0004 LDCONST R6 K3 + 0x881C0504, // 0005 GETMBR R7 R2 K4 + 0x88200305, // 0006 GETMBR R8 R1 K5 + 0x7C140600, // 0007 CALL R5 3 + 0x58180006, // 0008 LDCONST R6 K6 + 0x7C0C0600, // 0009 CALL R3 3 + 0x500C0200, // 000A LDBOOL R3 1 0 + 0x90060E03, // 000B SETMBR R1 K7 R3 + 0xB80E1000, // 000C GETNGBL R3 K8 + 0x8C0C0709, // 000D GETMET R3 R3 K9 + 0x7C0C0200, // 000E CALL R3 1 + 0x50100200, // 000F LDBOOL R4 1 0 + 0x900E1404, // 0010 SETMBR R3 K10 R4 + 0x88100305, // 0011 GETMBR R4 R1 K5 + 0x900E0A04, // 0012 SETMBR R3 K5 R4 + 0xB8121000, // 0013 GETNGBL R4 K8 + 0x8C10090B, // 0014 GETMET R4 R4 K11 + 0x8818050C, // 0015 GETMBR R6 R2 K12 + 0x5C1C0400, // 0016 MOVE R7 R2 0x5C200600, // 0017 MOVE R8 R3 - 0x5C240800, // 0018 MOVE R9 R4 - 0x5C280200, // 0019 MOVE R10 R1 - 0x7C140A00, // 001A CALL R5 5 - 0x8818010F, // 001B GETMBR R6 R0 K15 - 0x8C180D10, // 001C GETMET R6 R6 K16 - 0x5C200A00, // 001D MOVE R8 R5 - 0x7C180400, // 001E CALL R6 2 - 0x8C180111, // 001F GETMET R6 R0 K17 - 0x8820070E, // 0020 GETMBR R8 R3 K14 - 0x7C180400, // 0021 CALL R6 2 - 0x80000000, // 0022 RET 0 + 0x5C240200, // 0018 MOVE R9 R1 + 0x7C100A00, // 0019 CALL R4 5 + 0x8814010D, // 001A GETMBR R5 R0 K13 + 0x8C140B0E, // 001B GETMET R5 R5 K14 + 0x5C1C0800, // 001C MOVE R7 R4 + 0x7C140400, // 001D CALL R5 2 + 0x8C14010F, // 001E GETMET R5 R0 K15 + 0x881C050C, // 001F GETMBR R7 R2 K12 + 0x7C140400, // 0020 CALL R5 2 + 0x80000000, // 0021 RET 0 }) ) ); diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_IM_Data.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_IM_Data.h index aecff66c6..365641ecd 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_IM_Data.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_IM_Data.h @@ -307,7 +307,7 @@ be_local_closure(Matter_AttributePathIB_to_TLV, /* name */ ********************************************************************/ be_local_closure(Matter_AttributePathIB_tostring, /* name */ be_nested_proto( - 7, /* nstack */ + 6, /* nstack */ 1, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -315,89 +315,86 @@ be_local_closure(Matter_AttributePathIB_tostring, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[16]) { /* constants */ - /* K0 */ be_nested_str_weak(string), - /* K1 */ be_nested_str_weak(), - /* K2 */ be_nested_str_weak(node), - /* K3 */ be_nested_str_weak(format), - /* K4 */ be_nested_str_weak(node_X3D_X25s_X20), - /* K5 */ be_nested_str_weak(endpoint), - /* K6 */ be_nested_str_weak(_X5B_X2502X_X5D), - /* K7 */ be_nested_str_weak(_X5B_X2A_X2A_X5D), - /* K8 */ be_nested_str_weak(cluster), - /* K9 */ be_nested_str_weak(_X2504X_X2F), - /* K10 */ be_nested_str_weak(_X2A_X2A_X2A_X2A_X2F), - /* K11 */ be_nested_str_weak(attribute), - /* K12 */ be_nested_str_weak(_X2504X), - /* K13 */ be_nested_str_weak(_X2A_X2A_X2A_X2A), - /* K14 */ be_nested_str_weak(Exception_X3E_X20), - /* K15 */ be_nested_str_weak(_X2C_X20), + ( &(const bvalue[14]) { /* constants */ + /* K0 */ be_nested_str_weak(), + /* K1 */ be_nested_str_weak(node), + /* K2 */ be_nested_str_weak(node_X3D_X25s_X20), + /* K3 */ be_nested_str_weak(endpoint), + /* K4 */ be_nested_str_weak(_X5B_X2502X_X5D), + /* K5 */ be_nested_str_weak(_X5B_X2A_X2A_X5D), + /* K6 */ be_nested_str_weak(cluster), + /* K7 */ be_nested_str_weak(_X2504X_X2F), + /* K8 */ be_nested_str_weak(_X2A_X2A_X2A_X2A_X2F), + /* K9 */ be_nested_str_weak(attribute), + /* K10 */ be_nested_str_weak(_X2504X), + /* K11 */ be_nested_str_weak(_X2A_X2A_X2A_X2A), + /* K12 */ be_nested_str_weak(Exception_X3E_X20), + /* K13 */ be_nested_str_weak(_X2C_X20), }), be_str_weak(tostring), &be_const_str_solidified, - ( &(const binstruction[62]) { /* code */ - 0xA802002D, // 0000 EXBLK 0 #002F - 0xA4060000, // 0001 IMPORT R1 K0 - 0x58080001, // 0002 LDCONST R2 K1 - 0x880C0102, // 0003 GETMBR R3 R0 K2 - 0x780E0004, // 0004 JMPF R3 #000A - 0x8C0C0303, // 0005 GETMET R3 R1 K3 - 0x58140004, // 0006 LDCONST R5 K4 - 0x88180102, // 0007 GETMBR R6 R0 K2 - 0x7C0C0600, // 0008 CALL R3 3 - 0x00080403, // 0009 ADD R2 R2 R3 - 0x880C0105, // 000A GETMBR R3 R0 K5 - 0x4C100000, // 000B LDNIL R4 - 0x200C0604, // 000C NE R3 R3 R4 - 0x780E0004, // 000D JMPF R3 #0013 - 0x8C0C0303, // 000E GETMET R3 R1 K3 - 0x58140006, // 000F LDCONST R5 K6 - 0x88180105, // 0010 GETMBR R6 R0 K5 - 0x7C0C0600, // 0011 CALL R3 3 - 0x70020000, // 0012 JMP #0014 - 0x580C0007, // 0013 LDCONST R3 K7 - 0x00080403, // 0014 ADD R2 R2 R3 - 0x880C0108, // 0015 GETMBR R3 R0 K8 - 0x4C100000, // 0016 LDNIL R4 - 0x200C0604, // 0017 NE R3 R3 R4 - 0x780E0004, // 0018 JMPF R3 #001E - 0x8C0C0303, // 0019 GETMET R3 R1 K3 - 0x58140009, // 001A LDCONST R5 K9 - 0x88180108, // 001B GETMBR R6 R0 K8 - 0x7C0C0600, // 001C CALL R3 3 - 0x70020000, // 001D JMP #001F - 0x580C000A, // 001E LDCONST R3 K10 - 0x00080403, // 001F ADD R2 R2 R3 - 0x880C010B, // 0020 GETMBR R3 R0 K11 - 0x4C100000, // 0021 LDNIL R4 - 0x200C0604, // 0022 NE R3 R3 R4 - 0x780E0004, // 0023 JMPF R3 #0029 - 0x8C0C0303, // 0024 GETMET R3 R1 K3 - 0x5814000C, // 0025 LDCONST R5 K12 - 0x8818010B, // 0026 GETMBR R6 R0 K11 - 0x7C0C0600, // 0027 CALL R3 3 - 0x70020000, // 0028 JMP #002A - 0x580C000D, // 0029 LDCONST R3 K13 - 0x00080403, // 002A ADD R2 R2 R3 - 0xA8040001, // 002B EXBLK 1 1 - 0x80040400, // 002C RET 1 R2 - 0xA8040001, // 002D EXBLK 1 1 - 0x7002000D, // 002E JMP #003D - 0xAC040002, // 002F CATCH R1 0 2 - 0x7002000A, // 0030 JMP #003C - 0x600C0008, // 0031 GETGBL R3 G8 - 0x5C100200, // 0032 MOVE R4 R1 - 0x7C0C0200, // 0033 CALL R3 1 - 0x000E1C03, // 0034 ADD R3 K14 R3 - 0x000C070F, // 0035 ADD R3 R3 K15 - 0x60100008, // 0036 GETGBL R4 G8 - 0x5C140400, // 0037 MOVE R5 R2 - 0x7C100200, // 0038 CALL R4 1 - 0x000C0604, // 0039 ADD R3 R3 R4 - 0x80040600, // 003A RET 1 R3 - 0x70020000, // 003B JMP #003D - 0xB0080000, // 003C RAISE 2 R0 R0 - 0x80000000, // 003D RET 0 + ( &(const binstruction[61]) { /* code */ + 0xA802002C, // 0000 EXBLK 0 #002E + 0x58040000, // 0001 LDCONST R1 K0 + 0x88080101, // 0002 GETMBR R2 R0 K1 + 0x780A0004, // 0003 JMPF R2 #0009 + 0x60080018, // 0004 GETGBL R2 G24 + 0x580C0002, // 0005 LDCONST R3 K2 + 0x88100101, // 0006 GETMBR R4 R0 K1 + 0x7C080400, // 0007 CALL R2 2 + 0x00040202, // 0008 ADD R1 R1 R2 + 0x88080103, // 0009 GETMBR R2 R0 K3 + 0x4C0C0000, // 000A LDNIL R3 + 0x20080403, // 000B NE R2 R2 R3 + 0x780A0004, // 000C JMPF R2 #0012 + 0x60080018, // 000D GETGBL R2 G24 + 0x580C0004, // 000E LDCONST R3 K4 + 0x88100103, // 000F GETMBR R4 R0 K3 + 0x7C080400, // 0010 CALL R2 2 + 0x70020000, // 0011 JMP #0013 + 0x58080005, // 0012 LDCONST R2 K5 + 0x00040202, // 0013 ADD R1 R1 R2 + 0x88080106, // 0014 GETMBR R2 R0 K6 + 0x4C0C0000, // 0015 LDNIL R3 + 0x20080403, // 0016 NE R2 R2 R3 + 0x780A0004, // 0017 JMPF R2 #001D + 0x60080018, // 0018 GETGBL R2 G24 + 0x580C0007, // 0019 LDCONST R3 K7 + 0x88100106, // 001A GETMBR R4 R0 K6 + 0x7C080400, // 001B CALL R2 2 + 0x70020000, // 001C JMP #001E + 0x58080008, // 001D LDCONST R2 K8 + 0x00040202, // 001E ADD R1 R1 R2 + 0x88080109, // 001F GETMBR R2 R0 K9 + 0x4C0C0000, // 0020 LDNIL R3 + 0x20080403, // 0021 NE R2 R2 R3 + 0x780A0004, // 0022 JMPF R2 #0028 + 0x60080018, // 0023 GETGBL R2 G24 + 0x580C000A, // 0024 LDCONST R3 K10 + 0x88100109, // 0025 GETMBR R4 R0 K9 + 0x7C080400, // 0026 CALL R2 2 + 0x70020000, // 0027 JMP #0029 + 0x5808000B, // 0028 LDCONST R2 K11 + 0x00040202, // 0029 ADD R1 R1 R2 + 0xA8040001, // 002A EXBLK 1 1 + 0x80040200, // 002B RET 1 R1 + 0xA8040001, // 002C EXBLK 1 1 + 0x7002000D, // 002D JMP #003C + 0xAC040002, // 002E CATCH R1 0 2 + 0x7002000A, // 002F JMP #003B + 0x600C0008, // 0030 GETGBL R3 G8 + 0x5C100200, // 0031 MOVE R4 R1 + 0x7C0C0200, // 0032 CALL R3 1 + 0x000E1803, // 0033 ADD R3 K12 R3 + 0x000C070D, // 0034 ADD R3 R3 K13 + 0x60100008, // 0035 GETGBL R4 G8 + 0x5C140400, // 0036 MOVE R5 R2 + 0x7C100200, // 0037 CALL R4 1 + 0x000C0604, // 0038 ADD R3 R3 R4 + 0x80040600, // 0039 RET 1 R3 + 0x70020000, // 003A JMP #003C + 0xB0080000, // 003B RAISE 2 R0 R0 + 0x80000000, // 003C RET 0 }) ) ); diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_IM_Message.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_IM_Message.h index cbf37c1b9..58a362bcb 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_IM_Message.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_IM_Message.h @@ -35,7 +35,7 @@ be_local_closure(Matter_IM_Message_status_error_received, /* name */ ********************************************************************/ be_local_closure(Matter_IM_Message_send_im, /* name */ be_nested_proto( - 13, /* nstack */ + 11, /* nstack */ 2, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -43,66 +43,63 @@ be_local_closure(Matter_IM_Message_send_im, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[20]) { /* constants */ - /* K0 */ be_nested_str_weak(string), - /* K1 */ be_nested_str_weak(ready), - /* K2 */ be_nested_str_weak(resp), - /* K3 */ be_nested_str_weak(encode_frame), - /* K4 */ be_nested_str_weak(data), - /* K5 */ be_nested_str_weak(to_TLV), - /* K6 */ be_nested_str_weak(tlv2raw), - /* K7 */ be_nested_str_weak(encrypt), - /* K8 */ be_nested_str_weak(tasmota), - /* K9 */ be_nested_str_weak(log), - /* K10 */ be_nested_str_weak(format), - /* K11 */ be_nested_str_weak(MTR_X3A_X20_X3Csnd_X20_X20_X20_X20_X20_X20_X20_X28_X256i_X29_X20id_X3D_X25i_X20exch_X3D_X25i_X20rack_X3D_X25s), - /* K12 */ be_nested_str_weak(session), - /* K13 */ be_nested_str_weak(local_session_id), - /* K14 */ be_nested_str_weak(message_counter), - /* K15 */ be_nested_str_weak(exchange_id), - /* K16 */ be_nested_str_weak(ack_message_counter), - /* K17 */ be_nested_str_weak(send_response_frame), - /* K18 */ be_nested_str_weak(last_counter), - /* K19 */ be_nested_str_weak(finish), + ( &(const bvalue[18]) { /* constants */ + /* K0 */ be_nested_str_weak(ready), + /* K1 */ be_nested_str_weak(resp), + /* K2 */ be_nested_str_weak(encode_frame), + /* K3 */ be_nested_str_weak(data), + /* K4 */ be_nested_str_weak(to_TLV), + /* K5 */ be_nested_str_weak(tlv2raw), + /* K6 */ be_nested_str_weak(encrypt), + /* K7 */ be_nested_str_weak(tasmota), + /* K8 */ be_nested_str_weak(log), + /* K9 */ be_nested_str_weak(MTR_X3A_X20_X3Csnd_X20_X20_X20_X20_X20_X20_X20_X28_X256i_X29_X20id_X3D_X25i_X20exch_X3D_X25i_X20rack_X3D_X25s), + /* K10 */ be_nested_str_weak(session), + /* K11 */ be_nested_str_weak(local_session_id), + /* K12 */ be_nested_str_weak(message_counter), + /* K13 */ be_nested_str_weak(exchange_id), + /* K14 */ be_nested_str_weak(ack_message_counter), + /* K15 */ be_nested_str_weak(send_response_frame), + /* K16 */ be_nested_str_weak(last_counter), + /* K17 */ be_nested_str_weak(finish), }), be_str_weak(send_im), &be_const_str_solidified, - ( &(const binstruction[35]) { /* code */ - 0xA40A0000, // 0000 IMPORT R2 K0 - 0x880C0101, // 0001 GETMBR R3 R0 K1 - 0x740E0001, // 0002 JMPT R3 #0005 - 0x500C0000, // 0003 LDBOOL R3 0 0 - 0x80040600, // 0004 RET 1 R3 - 0x880C0102, // 0005 GETMBR R3 R0 K2 - 0x8C100703, // 0006 GETMET R4 R3 K3 - 0x88180104, // 0007 GETMBR R6 R0 K4 - 0x8C180D05, // 0008 GETMET R6 R6 K5 - 0x7C180200, // 0009 CALL R6 1 - 0x8C180D06, // 000A GETMET R6 R6 K6 - 0x7C180200, // 000B CALL R6 1 - 0x7C100400, // 000C CALL R4 2 - 0x8C100707, // 000D GETMET R4 R3 K7 - 0x7C100200, // 000E CALL R4 1 - 0xB8121000, // 000F GETNGBL R4 K8 - 0x8C100909, // 0010 GETMET R4 R4 K9 - 0x8C18050A, // 0011 GETMET R6 R2 K10 - 0x5820000B, // 0012 LDCONST R8 K11 - 0x8824070C, // 0013 GETMBR R9 R3 K12 - 0x8824130D, // 0014 GETMBR R9 R9 K13 - 0x8828070E, // 0015 GETMBR R10 R3 K14 - 0x882C070F, // 0016 GETMBR R11 R3 K15 - 0x88300710, // 0017 GETMBR R12 R3 K16 - 0x7C180C00, // 0018 CALL R6 6 - 0x541E0003, // 0019 LDINT R7 4 - 0x7C100600, // 001A CALL R4 3 - 0x8C100311, // 001B GETMET R4 R1 K17 - 0x5C180600, // 001C MOVE R6 R3 - 0x7C100400, // 001D CALL R4 2 - 0x8810070E, // 001E GETMBR R4 R3 K14 - 0x90022404, // 001F SETMBR R0 K18 R4 - 0x50100200, // 0020 LDBOOL R4 1 0 - 0x90022604, // 0021 SETMBR R0 K19 R4 - 0x80000000, // 0022 RET 0 + ( &(const binstruction[34]) { /* code */ + 0x88080100, // 0000 GETMBR R2 R0 K0 + 0x740A0001, // 0001 JMPT R2 #0004 + 0x50080000, // 0002 LDBOOL R2 0 0 + 0x80040400, // 0003 RET 1 R2 + 0x88080101, // 0004 GETMBR R2 R0 K1 + 0x8C0C0502, // 0005 GETMET R3 R2 K2 + 0x88140103, // 0006 GETMBR R5 R0 K3 + 0x8C140B04, // 0007 GETMET R5 R5 K4 + 0x7C140200, // 0008 CALL R5 1 + 0x8C140B05, // 0009 GETMET R5 R5 K5 + 0x7C140200, // 000A CALL R5 1 + 0x7C0C0400, // 000B CALL R3 2 + 0x8C0C0506, // 000C GETMET R3 R2 K6 + 0x7C0C0200, // 000D CALL R3 1 + 0xB80E0E00, // 000E GETNGBL R3 K7 + 0x8C0C0708, // 000F GETMET R3 R3 K8 + 0x60140018, // 0010 GETGBL R5 G24 + 0x58180009, // 0011 LDCONST R6 K9 + 0x881C050A, // 0012 GETMBR R7 R2 K10 + 0x881C0F0B, // 0013 GETMBR R7 R7 K11 + 0x8820050C, // 0014 GETMBR R8 R2 K12 + 0x8824050D, // 0015 GETMBR R9 R2 K13 + 0x8828050E, // 0016 GETMBR R10 R2 K14 + 0x7C140A00, // 0017 CALL R5 5 + 0x541A0003, // 0018 LDINT R6 4 + 0x7C0C0600, // 0019 CALL R3 3 + 0x8C0C030F, // 001A GETMET R3 R1 K15 + 0x5C140400, // 001B MOVE R5 R2 + 0x7C0C0400, // 001C CALL R3 2 + 0x880C050C, // 001D GETMBR R3 R2 K12 + 0x90022003, // 001E SETMBR R0 K16 R3 + 0x500C0200, // 001F LDBOOL R3 1 0 + 0x90022203, // 0020 SETMBR R0 K17 R3 + 0x80000000, // 0021 RET 0 }) ) ); @@ -254,7 +251,7 @@ be_local_closure(Matter_IM_Message_reached_timeout, /* name */ ********************************************************************/ be_local_closure(Matter_IM_Message_status_ok_received, /* name */ be_nested_proto( - 8, /* nstack */ + 7, /* nstack */ 2, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -262,41 +259,39 @@ be_local_closure(Matter_IM_Message_status_ok_received, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[10]) { /* constants */ - /* K0 */ be_nested_str_weak(string), - /* K1 */ be_nested_str_weak(expiration), - /* K2 */ be_nested_str_weak(tasmota), - /* K3 */ be_nested_str_weak(millis), - /* K4 */ be_nested_str_weak(MSG_TIMEOUT), - /* K5 */ be_nested_str_weak(resp), - /* K6 */ be_nested_str_weak(build_response), - /* K7 */ be_nested_str_weak(opcode), - /* K8 */ be_nested_str_weak(x_flag_r), - /* K9 */ be_nested_str_weak(ready), + ( &(const bvalue[ 9]) { /* constants */ + /* K0 */ be_nested_str_weak(expiration), + /* K1 */ be_nested_str_weak(tasmota), + /* K2 */ be_nested_str_weak(millis), + /* K3 */ be_nested_str_weak(MSG_TIMEOUT), + /* K4 */ be_nested_str_weak(resp), + /* K5 */ be_nested_str_weak(build_response), + /* K6 */ be_nested_str_weak(opcode), + /* K7 */ be_nested_str_weak(x_flag_r), + /* K8 */ be_nested_str_weak(ready), }), be_str_weak(status_ok_received), &be_const_str_solidified, - ( &(const binstruction[20]) { /* code */ - 0xA40A0000, // 0000 IMPORT R2 K0 - 0xB80E0400, // 0001 GETNGBL R3 K2 - 0x8C0C0703, // 0002 GETMET R3 R3 K3 - 0x7C0C0200, // 0003 CALL R3 1 - 0x88100104, // 0004 GETMBR R4 R0 K4 - 0x000C0604, // 0005 ADD R3 R3 R4 - 0x90020203, // 0006 SETMBR R0 K1 R3 - 0x78060007, // 0007 JMPF R1 #0010 - 0x8C0C0306, // 0008 GETMET R3 R1 K6 - 0x88140105, // 0009 GETMBR R5 R0 K5 - 0x88140B07, // 000A GETMBR R5 R5 K7 - 0x88180105, // 000B GETMBR R6 R0 K5 - 0x88180D08, // 000C GETMBR R6 R6 K8 - 0x881C0105, // 000D GETMBR R7 R0 K5 - 0x7C0C0800, // 000E CALL R3 4 - 0x90020A03, // 000F SETMBR R0 K5 R3 - 0x500C0200, // 0010 LDBOOL R3 1 0 - 0x90021203, // 0011 SETMBR R0 K9 R3 - 0x500C0200, // 0012 LDBOOL R3 1 0 - 0x80040600, // 0013 RET 1 R3 + ( &(const binstruction[19]) { /* code */ + 0xB80A0200, // 0000 GETNGBL R2 K1 + 0x8C080502, // 0001 GETMET R2 R2 K2 + 0x7C080200, // 0002 CALL R2 1 + 0x880C0103, // 0003 GETMBR R3 R0 K3 + 0x00080403, // 0004 ADD R2 R2 R3 + 0x90020002, // 0005 SETMBR R0 K0 R2 + 0x78060007, // 0006 JMPF R1 #000F + 0x8C080305, // 0007 GETMET R2 R1 K5 + 0x88100104, // 0008 GETMBR R4 R0 K4 + 0x88100906, // 0009 GETMBR R4 R4 K6 + 0x88140104, // 000A GETMBR R5 R0 K4 + 0x88140B07, // 000B GETMBR R5 R5 K7 + 0x88180104, // 000C GETMBR R6 R0 K4 + 0x7C080800, // 000D CALL R2 4 + 0x90020802, // 000E SETMBR R0 K4 R2 + 0x50080200, // 000F LDBOOL R2 1 0 + 0x90021002, // 0010 SETMBR R0 K8 R2 + 0x50080200, // 0011 LDBOOL R2 1 0 + 0x80040400, // 0012 RET 1 R2 }) ) ); @@ -528,7 +523,7 @@ extern const bclass be_class_Matter_IM_ReportData; ********************************************************************/ be_local_closure(Matter_IM_ReportData_send_im, /* name */ be_nested_proto( - 13, /* nstack */ + 12, /* nstack */ 2, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -536,97 +531,95 @@ be_local_closure(Matter_IM_ReportData_send_im, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[18]) { /* constants */ - /* K0 */ be_nested_str_weak(string), - /* K1 */ be_nested_str_weak(ready), - /* K2 */ be_nested_str_weak(resp), - /* K3 */ be_nested_str_weak(data), - /* K4 */ be_nested_str_weak(more_chunked_messages), - /* K5 */ be_const_int(1), - /* K6 */ be_nested_str_weak(attribute_reports), - /* K7 */ be_const_int(2147483647), - /* K8 */ be_const_int(0), - /* K9 */ be_nested_str_weak(to_TLV), - /* K10 */ be_nested_str_weak(tlv2raw), - /* K11 */ be_nested_str_weak(MAX_MESSAGE), - /* K12 */ be_nested_str_weak(encode_frame), - /* K13 */ be_nested_str_weak(encrypt), - /* K14 */ be_nested_str_weak(send_response_frame), - /* K15 */ be_nested_str_weak(last_counter), - /* K16 */ be_nested_str_weak(message_counter), - /* K17 */ be_nested_str_weak(finish), + ( &(const bvalue[17]) { /* constants */ + /* K0 */ be_nested_str_weak(ready), + /* K1 */ be_nested_str_weak(resp), + /* K2 */ be_nested_str_weak(data), + /* K3 */ be_nested_str_weak(more_chunked_messages), + /* K4 */ be_const_int(1), + /* K5 */ be_nested_str_weak(attribute_reports), + /* K6 */ be_const_int(2147483647), + /* K7 */ be_const_int(0), + /* K8 */ be_nested_str_weak(to_TLV), + /* K9 */ be_nested_str_weak(tlv2raw), + /* K10 */ be_nested_str_weak(MAX_MESSAGE), + /* K11 */ be_nested_str_weak(encode_frame), + /* K12 */ be_nested_str_weak(encrypt), + /* K13 */ be_nested_str_weak(send_response_frame), + /* K14 */ be_nested_str_weak(last_counter), + /* K15 */ be_nested_str_weak(message_counter), + /* K16 */ be_nested_str_weak(finish), }), be_str_weak(send_im), &be_const_str_solidified, - ( &(const binstruction[68]) { /* code */ - 0xA40A0000, // 0000 IMPORT R2 K0 - 0x880C0101, // 0001 GETMBR R3 R0 K1 - 0x740E0001, // 0002 JMPT R3 #0005 - 0x500C0000, // 0003 LDBOOL R3 0 0 - 0x80040600, // 0004 RET 1 R3 + ( &(const binstruction[67]) { /* code */ + 0x88080100, // 0000 GETMBR R2 R0 K0 + 0x740A0001, // 0001 JMPT R2 #0004 + 0x50080000, // 0002 LDBOOL R2 0 0 + 0x80040400, // 0003 RET 1 R2 + 0x88080101, // 0004 GETMBR R2 R0 K1 0x880C0102, // 0005 GETMBR R3 R0 K2 - 0x88100103, // 0006 GETMBR R4 R0 K3 - 0x88140904, // 0007 GETMBR R5 R4 K4 - 0x58180005, // 0008 LDCONST R6 K5 - 0x4C1C0000, // 0009 LDNIL R7 - 0x88200906, // 000A GETMBR R8 R4 K6 - 0x4C240000, // 000B LDNIL R9 - 0x20201009, // 000C NE R8 R8 R9 - 0x7822000D, // 000D JMPF R8 #001C - 0x40200D07, // 000E CONNECT R8 R6 K7 - 0x88240906, // 000F GETMBR R9 R4 K6 - 0x941C1208, // 0010 GETIDX R7 R9 R8 - 0x04280D05, // 0011 SUB R10 R6 K5 - 0x402A100A, // 0012 CONNECT R10 K8 R10 - 0x882C0906, // 0013 GETMBR R11 R4 K6 - 0x9428160A, // 0014 GETIDX R10 R11 R10 - 0x90120C0A, // 0015 SETMBR R4 K6 R10 - 0x6028000C, // 0016 GETGBL R10 G12 - 0x5C2C0E00, // 0017 MOVE R11 R7 - 0x7C280200, // 0018 CALL R10 1 - 0x24281508, // 0019 GT R10 R10 K8 - 0x9012080A, // 001A SETMBR R4 K4 R10 - 0x70020001, // 001B JMP #001E - 0x50200000, // 001C LDBOOL R8 0 0 - 0x90120808, // 001D SETMBR R4 K4 R8 - 0x7815FFFF, // 001E JMPF R5 #001F - 0x88200904, // 001F GETMBR R8 R4 K4 - 0x78220001, // 0020 JMPF R8 #0023 - 0x5C200A00, // 0021 MOVE R8 R5 - 0x7421FFFF, // 0022 JMPT R8 #0023 - 0x88200103, // 0023 GETMBR R8 R0 K3 - 0x8C201109, // 0024 GETMET R8 R8 K9 - 0x7C200200, // 0025 CALL R8 1 - 0x8C24110A, // 0026 GETMET R9 R8 K10 - 0x602C0015, // 0027 GETGBL R11 G21 - 0x8830010B, // 0028 GETMBR R12 R0 K11 - 0x7C2C0200, // 0029 CALL R11 1 - 0x7C240400, // 002A CALL R9 2 - 0x8C28070C, // 002B GETMET R10 R3 K12 - 0x5C301200, // 002C MOVE R12 R9 - 0x7C280400, // 002D CALL R10 2 - 0x8C28070D, // 002E GETMET R10 R3 K13 - 0x7C280200, // 002F CALL R10 1 - 0x8C28030E, // 0030 GETMET R10 R1 K14 - 0x5C300600, // 0031 MOVE R12 R3 - 0x7C280400, // 0032 CALL R10 2 - 0x88280710, // 0033 GETMBR R10 R3 K16 - 0x90021E0A, // 0034 SETMBR R0 K15 R10 - 0x4C280000, // 0035 LDNIL R10 - 0x20280E0A, // 0036 NE R10 R7 R10 - 0x782A0008, // 0037 JMPF R10 #0041 - 0x6028000C, // 0038 GETGBL R10 G12 - 0x5C2C0E00, // 0039 MOVE R11 R7 - 0x7C280200, // 003A CALL R10 1 - 0x24281508, // 003B GT R10 R10 K8 - 0x782A0003, // 003C JMPF R10 #0041 - 0x90120C07, // 003D SETMBR R4 K6 R7 - 0x50280000, // 003E LDBOOL R10 0 0 - 0x9002020A, // 003F SETMBR R0 K1 R10 - 0x70020001, // 0040 JMP #0043 - 0x50280200, // 0041 LDBOOL R10 1 0 - 0x9002220A, // 0042 SETMBR R0 K17 R10 - 0x80000000, // 0043 RET 0 + 0x88100703, // 0006 GETMBR R4 R3 K3 + 0x58140004, // 0007 LDCONST R5 K4 + 0x4C180000, // 0008 LDNIL R6 + 0x881C0705, // 0009 GETMBR R7 R3 K5 + 0x4C200000, // 000A LDNIL R8 + 0x201C0E08, // 000B NE R7 R7 R8 + 0x781E000D, // 000C JMPF R7 #001B + 0x401C0B06, // 000D CONNECT R7 R5 K6 + 0x88200705, // 000E GETMBR R8 R3 K5 + 0x94181007, // 000F GETIDX R6 R8 R7 + 0x04240B04, // 0010 SUB R9 R5 K4 + 0x40260E09, // 0011 CONNECT R9 K7 R9 + 0x88280705, // 0012 GETMBR R10 R3 K5 + 0x94241409, // 0013 GETIDX R9 R10 R9 + 0x900E0A09, // 0014 SETMBR R3 K5 R9 + 0x6024000C, // 0015 GETGBL R9 G12 + 0x5C280C00, // 0016 MOVE R10 R6 + 0x7C240200, // 0017 CALL R9 1 + 0x24241307, // 0018 GT R9 R9 K7 + 0x900E0609, // 0019 SETMBR R3 K3 R9 + 0x70020001, // 001A JMP #001D + 0x501C0000, // 001B LDBOOL R7 0 0 + 0x900E0607, // 001C SETMBR R3 K3 R7 + 0x7811FFFF, // 001D JMPF R4 #001E + 0x881C0703, // 001E GETMBR R7 R3 K3 + 0x781E0001, // 001F JMPF R7 #0022 + 0x5C1C0800, // 0020 MOVE R7 R4 + 0x741DFFFF, // 0021 JMPT R7 #0022 + 0x881C0102, // 0022 GETMBR R7 R0 K2 + 0x8C1C0F08, // 0023 GETMET R7 R7 K8 + 0x7C1C0200, // 0024 CALL R7 1 + 0x8C200F09, // 0025 GETMET R8 R7 K9 + 0x60280015, // 0026 GETGBL R10 G21 + 0x882C010A, // 0027 GETMBR R11 R0 K10 + 0x7C280200, // 0028 CALL R10 1 + 0x7C200400, // 0029 CALL R8 2 + 0x8C24050B, // 002A GETMET R9 R2 K11 + 0x5C2C1000, // 002B MOVE R11 R8 + 0x7C240400, // 002C CALL R9 2 + 0x8C24050C, // 002D GETMET R9 R2 K12 + 0x7C240200, // 002E CALL R9 1 + 0x8C24030D, // 002F GETMET R9 R1 K13 + 0x5C2C0400, // 0030 MOVE R11 R2 + 0x7C240400, // 0031 CALL R9 2 + 0x8824050F, // 0032 GETMBR R9 R2 K15 + 0x90021C09, // 0033 SETMBR R0 K14 R9 + 0x4C240000, // 0034 LDNIL R9 + 0x20240C09, // 0035 NE R9 R6 R9 + 0x78260008, // 0036 JMPF R9 #0040 + 0x6024000C, // 0037 GETGBL R9 G12 + 0x5C280C00, // 0038 MOVE R10 R6 + 0x7C240200, // 0039 CALL R9 1 + 0x24241307, // 003A GT R9 R9 K7 + 0x78260003, // 003B JMPF R9 #0040 + 0x900E0A06, // 003C SETMBR R3 K5 R6 + 0x50240000, // 003D LDBOOL R9 0 0 + 0x90020009, // 003E SETMBR R0 K0 R9 + 0x70020001, // 003F JMP #0042 + 0x50240200, // 0040 LDBOOL R9 1 0 + 0x90022009, // 0041 SETMBR R0 K16 R9 + 0x80000000, // 0042 RET 0 }) ) ); @@ -748,7 +741,7 @@ be_local_closure(Matter_IM_ReportDataSubscribed_ack_received, /* name */ ********************************************************************/ be_local_closure(Matter_IM_ReportDataSubscribed_send_im, /* name */ be_nested_proto( - 12, /* nstack */ + 10, /* nstack */ 2, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -756,103 +749,100 @@ be_local_closure(Matter_IM_ReportDataSubscribed_send_im, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[22]) { /* constants */ - /* K0 */ be_nested_str_weak(string), - /* K1 */ be_nested_str_weak(ready), - /* K2 */ be_nested_str_weak(data), - /* K3 */ be_nested_str_weak(attribute_reports), - /* K4 */ be_const_int(0), - /* K5 */ be_nested_str_weak(report_data_phase), - /* K6 */ be_nested_str_weak(send_im), - /* K7 */ be_nested_str_weak(finish), - /* K8 */ be_nested_str_weak(resp), - /* K9 */ be_nested_str_weak(build_standalone_ack), - /* K10 */ be_nested_str_weak(encode_frame), - /* K11 */ be_nested_str_weak(encrypt), - /* K12 */ be_nested_str_weak(tasmota), - /* K13 */ be_nested_str_weak(log), - /* K14 */ be_nested_str_weak(format), - /* K15 */ be_nested_str_weak(MTR_X3A_X20_X3CAck_X20_X20_X20_X20_X20_X20_X20_X28_X256i_X29_X20ack_X3D_X25i_X20id_X3D_X25i), - /* K16 */ be_nested_str_weak(session), - /* K17 */ be_nested_str_weak(local_session_id), - /* K18 */ be_nested_str_weak(ack_message_counter), - /* K19 */ be_nested_str_weak(message_counter), - /* K20 */ be_nested_str_weak(send_response_frame), - /* K21 */ be_nested_str_weak(last_counter), + ( &(const bvalue[20]) { /* constants */ + /* K0 */ be_nested_str_weak(ready), + /* K1 */ be_nested_str_weak(data), + /* K2 */ be_nested_str_weak(attribute_reports), + /* K3 */ be_const_int(0), + /* K4 */ be_nested_str_weak(report_data_phase), + /* K5 */ be_nested_str_weak(send_im), + /* K6 */ be_nested_str_weak(finish), + /* K7 */ be_nested_str_weak(resp), + /* K8 */ be_nested_str_weak(build_standalone_ack), + /* K9 */ be_nested_str_weak(encode_frame), + /* K10 */ be_nested_str_weak(encrypt), + /* K11 */ be_nested_str_weak(tasmota), + /* K12 */ be_nested_str_weak(log), + /* K13 */ be_nested_str_weak(MTR_X3A_X20_X3CAck_X20_X20_X20_X20_X20_X20_X20_X28_X256i_X29_X20ack_X3D_X25i_X20id_X3D_X25i), + /* K14 */ be_nested_str_weak(session), + /* K15 */ be_nested_str_weak(local_session_id), + /* K16 */ be_nested_str_weak(ack_message_counter), + /* K17 */ be_nested_str_weak(message_counter), + /* K18 */ be_nested_str_weak(send_response_frame), + /* K19 */ be_nested_str_weak(last_counter), }), be_str_weak(send_im), &be_const_str_solidified, - ( &(const binstruction[70]) { /* code */ - 0xA40A0000, // 0000 IMPORT R2 K0 - 0x880C0101, // 0001 GETMBR R3 R0 K1 - 0x740E0001, // 0002 JMPT R3 #0005 - 0x500C0000, // 0003 LDBOOL R3 0 0 - 0x80040600, // 0004 RET 1 R3 - 0x600C000C, // 0005 GETGBL R3 G12 - 0x88100102, // 0006 GETMBR R4 R0 K2 - 0x88100903, // 0007 GETMBR R4 R4 K3 - 0x7C0C0200, // 0008 CALL R3 1 - 0x240C0704, // 0009 GT R3 R3 K4 - 0x780E002C, // 000A JMPF R3 #0038 - 0x880C0105, // 000B GETMBR R3 R0 K5 - 0x780E000F, // 000C JMPF R3 #001D - 0x600C0003, // 000D GETGBL R3 G3 - 0x5C100000, // 000E MOVE R4 R0 - 0x7C0C0200, // 000F CALL R3 1 - 0x8C0C0706, // 0010 GETMET R3 R3 K6 - 0x5C140200, // 0011 MOVE R5 R1 - 0x7C0C0400, // 0012 CALL R3 2 - 0x880C0107, // 0013 GETMBR R3 R0 K7 - 0x740E0000, // 0014 JMPT R3 #0016 - 0x80000600, // 0015 RET 0 - 0x500C0000, // 0016 LDBOOL R3 0 0 - 0x90020A03, // 0017 SETMBR R0 K5 R3 - 0x500C0000, // 0018 LDBOOL R3 0 0 - 0x90020203, // 0019 SETMBR R0 K1 R3 - 0x500C0000, // 001A LDBOOL R3 0 0 - 0x90020E03, // 001B SETMBR R0 K7 R3 - 0x70020019, // 001C JMP #0037 - 0x880C0108, // 001D GETMBR R3 R0 K8 - 0x8C0C0709, // 001E GETMET R3 R3 K9 - 0x50140000, // 001F LDBOOL R5 0 0 - 0x7C0C0400, // 0020 CALL R3 2 - 0x8C10070A, // 0021 GETMET R4 R3 K10 - 0x7C100200, // 0022 CALL R4 1 - 0x8C10070B, // 0023 GETMET R4 R3 K11 - 0x7C100200, // 0024 CALL R4 1 - 0xB8121800, // 0025 GETNGBL R4 K12 - 0x8C10090D, // 0026 GETMET R4 R4 K13 - 0x8C18050E, // 0027 GETMET R6 R2 K14 - 0x5820000F, // 0028 LDCONST R8 K15 - 0x88240710, // 0029 GETMBR R9 R3 K16 - 0x88241311, // 002A GETMBR R9 R9 K17 - 0x88280712, // 002B GETMBR R10 R3 K18 - 0x882C0713, // 002C GETMBR R11 R3 K19 - 0x7C180A00, // 002D CALL R6 5 - 0x541E0003, // 002E LDINT R7 4 - 0x7C100600, // 002F CALL R4 3 - 0x8C100314, // 0030 GETMET R4 R1 K20 - 0x5C180600, // 0031 MOVE R6 R3 - 0x7C100400, // 0032 CALL R4 2 - 0x88100713, // 0033 GETMBR R4 R3 K19 - 0x90022A04, // 0034 SETMBR R0 K21 R4 - 0x50100200, // 0035 LDBOOL R4 1 0 - 0x90020E04, // 0036 SETMBR R0 K7 R4 - 0x7002000C, // 0037 JMP #0045 - 0x880C0105, // 0038 GETMBR R3 R0 K5 - 0x780E0008, // 0039 JMPF R3 #0043 - 0x600C0003, // 003A GETGBL R3 G3 - 0x5C100000, // 003B MOVE R4 R0 - 0x7C0C0200, // 003C CALL R3 1 - 0x8C0C0706, // 003D GETMET R3 R3 K6 - 0x5C140200, // 003E MOVE R5 R1 - 0x7C0C0400, // 003F CALL R3 2 - 0x500C0000, // 0040 LDBOOL R3 0 0 - 0x90020A03, // 0041 SETMBR R0 K5 R3 - 0x70020001, // 0042 JMP #0045 - 0x500C0200, // 0043 LDBOOL R3 1 0 - 0x90020E03, // 0044 SETMBR R0 K7 R3 - 0x80000000, // 0045 RET 0 + ( &(const binstruction[69]) { /* code */ + 0x88080100, // 0000 GETMBR R2 R0 K0 + 0x740A0001, // 0001 JMPT R2 #0004 + 0x50080000, // 0002 LDBOOL R2 0 0 + 0x80040400, // 0003 RET 1 R2 + 0x6008000C, // 0004 GETGBL R2 G12 + 0x880C0101, // 0005 GETMBR R3 R0 K1 + 0x880C0702, // 0006 GETMBR R3 R3 K2 + 0x7C080200, // 0007 CALL R2 1 + 0x24080503, // 0008 GT R2 R2 K3 + 0x780A002C, // 0009 JMPF R2 #0037 + 0x88080104, // 000A GETMBR R2 R0 K4 + 0x780A000F, // 000B JMPF R2 #001C + 0x60080003, // 000C GETGBL R2 G3 + 0x5C0C0000, // 000D MOVE R3 R0 + 0x7C080200, // 000E CALL R2 1 + 0x8C080505, // 000F GETMET R2 R2 K5 + 0x5C100200, // 0010 MOVE R4 R1 + 0x7C080400, // 0011 CALL R2 2 + 0x88080106, // 0012 GETMBR R2 R0 K6 + 0x740A0000, // 0013 JMPT R2 #0015 + 0x80000400, // 0014 RET 0 + 0x50080000, // 0015 LDBOOL R2 0 0 + 0x90020802, // 0016 SETMBR R0 K4 R2 + 0x50080000, // 0017 LDBOOL R2 0 0 + 0x90020002, // 0018 SETMBR R0 K0 R2 + 0x50080000, // 0019 LDBOOL R2 0 0 + 0x90020C02, // 001A SETMBR R0 K6 R2 + 0x70020019, // 001B JMP #0036 + 0x88080107, // 001C GETMBR R2 R0 K7 + 0x8C080508, // 001D GETMET R2 R2 K8 + 0x50100000, // 001E LDBOOL R4 0 0 + 0x7C080400, // 001F CALL R2 2 + 0x8C0C0509, // 0020 GETMET R3 R2 K9 + 0x7C0C0200, // 0021 CALL R3 1 + 0x8C0C050A, // 0022 GETMET R3 R2 K10 + 0x7C0C0200, // 0023 CALL R3 1 + 0xB80E1600, // 0024 GETNGBL R3 K11 + 0x8C0C070C, // 0025 GETMET R3 R3 K12 + 0x60140018, // 0026 GETGBL R5 G24 + 0x5818000D, // 0027 LDCONST R6 K13 + 0x881C050E, // 0028 GETMBR R7 R2 K14 + 0x881C0F0F, // 0029 GETMBR R7 R7 K15 + 0x88200510, // 002A GETMBR R8 R2 K16 + 0x88240511, // 002B GETMBR R9 R2 K17 + 0x7C140800, // 002C CALL R5 4 + 0x541A0003, // 002D LDINT R6 4 + 0x7C0C0600, // 002E CALL R3 3 + 0x8C0C0312, // 002F GETMET R3 R1 K18 + 0x5C140400, // 0030 MOVE R5 R2 + 0x7C0C0400, // 0031 CALL R3 2 + 0x880C0511, // 0032 GETMBR R3 R2 K17 + 0x90022603, // 0033 SETMBR R0 K19 R3 + 0x500C0200, // 0034 LDBOOL R3 1 0 + 0x90020C03, // 0035 SETMBR R0 K6 R3 + 0x7002000C, // 0036 JMP #0044 + 0x88080104, // 0037 GETMBR R2 R0 K4 + 0x780A0008, // 0038 JMPF R2 #0042 + 0x60080003, // 0039 GETGBL R2 G3 + 0x5C0C0000, // 003A MOVE R3 R0 + 0x7C080200, // 003B CALL R2 1 + 0x8C080505, // 003C GETMET R2 R2 K5 + 0x5C100200, // 003D MOVE R4 R1 + 0x7C080400, // 003E CALL R2 2 + 0x50080000, // 003F LDBOOL R2 0 0 + 0x90020802, // 0040 SETMBR R0 K4 R2 + 0x70020001, // 0041 JMP #0044 + 0x50080200, // 0042 LDBOOL R2 1 0 + 0x90020C02, // 0043 SETMBR R0 K6 R2 + 0x80000000, // 0044 RET 0 }) ) ); @@ -1345,7 +1335,7 @@ be_local_closure(Matter_IM_SubscribeResponse_init, /* name */ ********************************************************************/ be_local_closure(Matter_IM_SubscribeResponse_status_ok_received, /* name */ be_nested_proto( - 10, /* nstack */ + 8, /* nstack */ 2, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -1353,41 +1343,38 @@ be_local_closure(Matter_IM_SubscribeResponse_status_ok_received, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[11]) { /* constants */ - /* K0 */ be_nested_str_weak(string), - /* K1 */ be_nested_str_weak(tasmota), - /* K2 */ be_nested_str_weak(log), - /* K3 */ be_nested_str_weak(format), - /* K4 */ be_nested_str_weak(MTR_X3A_X20_X3ESub_OK_X20_X20_X20_X20_X28_X256i_X29_X20sub_X3D_X25i), - /* K5 */ be_nested_str_weak(session), - /* K6 */ be_nested_str_weak(local_session_id), - /* K7 */ be_nested_str_weak(sub), - /* K8 */ be_nested_str_weak(subscription_id), - /* K9 */ be_const_int(3), - /* K10 */ be_nested_str_weak(status_ok_received), + ( &(const bvalue[ 9]) { /* constants */ + /* K0 */ be_nested_str_weak(tasmota), + /* K1 */ be_nested_str_weak(log), + /* K2 */ be_nested_str_weak(MTR_X3A_X20_X3ESub_OK_X20_X20_X20_X20_X28_X256i_X29_X20sub_X3D_X25i), + /* K3 */ be_nested_str_weak(session), + /* K4 */ be_nested_str_weak(local_session_id), + /* K5 */ be_nested_str_weak(sub), + /* K6 */ be_nested_str_weak(subscription_id), + /* K7 */ be_const_int(3), + /* K8 */ be_nested_str_weak(status_ok_received), }), be_str_weak(status_ok_received), &be_const_str_solidified, - ( &(const binstruction[19]) { /* code */ - 0xA40A0000, // 0000 IMPORT R2 K0 - 0xB80E0200, // 0001 GETNGBL R3 K1 - 0x8C0C0702, // 0002 GETMET R3 R3 K2 - 0x8C140503, // 0003 GETMET R5 R2 K3 - 0x581C0004, // 0004 LDCONST R7 K4 - 0x88200305, // 0005 GETMBR R8 R1 K5 - 0x88201106, // 0006 GETMBR R8 R8 K6 - 0x88240107, // 0007 GETMBR R9 R0 K7 - 0x88241308, // 0008 GETMBR R9 R9 K8 - 0x7C140800, // 0009 CALL R5 4 - 0x58180009, // 000A LDCONST R6 K9 - 0x7C0C0600, // 000B CALL R3 3 - 0x600C0003, // 000C GETGBL R3 G3 - 0x5C100000, // 000D MOVE R4 R0 - 0x7C0C0200, // 000E CALL R3 1 - 0x8C0C070A, // 000F GETMET R3 R3 K10 - 0x5C140200, // 0010 MOVE R5 R1 - 0x7C0C0400, // 0011 CALL R3 2 - 0x80040600, // 0012 RET 1 R3 + ( &(const binstruction[18]) { /* code */ + 0xB80A0000, // 0000 GETNGBL R2 K0 + 0x8C080501, // 0001 GETMET R2 R2 K1 + 0x60100018, // 0002 GETGBL R4 G24 + 0x58140002, // 0003 LDCONST R5 K2 + 0x88180303, // 0004 GETMBR R6 R1 K3 + 0x88180D04, // 0005 GETMBR R6 R6 K4 + 0x881C0105, // 0006 GETMBR R7 R0 K5 + 0x881C0F06, // 0007 GETMBR R7 R7 K6 + 0x7C100600, // 0008 CALL R4 3 + 0x58140007, // 0009 LDCONST R5 K7 + 0x7C080600, // 000A CALL R2 3 + 0x60080003, // 000B GETGBL R2 G3 + 0x5C0C0000, // 000C MOVE R3 R0 + 0x7C080200, // 000D CALL R2 1 + 0x8C080508, // 000E GETMET R2 R2 K8 + 0x5C100200, // 000F MOVE R4 R1 + 0x7C080400, // 0010 CALL R2 2 + 0x80040400, // 0011 RET 1 R2 }) ) ); diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_IM_Subscription.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_IM_Subscription.h index bfaf77df8..63b370196 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_IM_Subscription.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_IM_Subscription.h @@ -323,7 +323,7 @@ be_local_closure(Matter_IM_Subscription_attribute_updated_ctx, /* name */ ********************************************************************/ be_local_closure(Matter_IM_Subscription_re_arm, /* name */ be_nested_proto( - 9, /* nstack */ + 7, /* nstack */ 1, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -331,57 +331,54 @@ be_local_closure(Matter_IM_Subscription_re_arm, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[16]) { /* constants */ - /* K0 */ be_nested_str_weak(string), - /* K1 */ be_nested_str_weak(wait_status), - /* K2 */ be_nested_str_weak(tasmota), - /* K3 */ be_nested_str_weak(millis), - /* K4 */ be_nested_str_weak(expiration), - /* K5 */ be_nested_str_weak(max_interval), - /* K6 */ be_nested_str_weak(MAX_INTERVAL_MARGIN), - /* K7 */ be_nested_str_weak(not_before), - /* K8 */ be_nested_str_weak(min_interval), - /* K9 */ be_const_int(1), - /* K10 */ be_nested_str_weak(is_keep_alive), - /* K11 */ be_nested_str_weak(log), - /* K12 */ be_nested_str_weak(format), - /* K13 */ be_nested_str_weak(MTR_X3A_X20_X2ESub_Done_X20_X20_X28_X20_X20_X20_X20_X20_X20_X29_X20sub_X3D_X25i), - /* K14 */ be_nested_str_weak(subscription_id), - /* K15 */ be_const_int(3), + ( &(const bvalue[14]) { /* constants */ + /* K0 */ be_nested_str_weak(wait_status), + /* K1 */ be_nested_str_weak(tasmota), + /* K2 */ be_nested_str_weak(millis), + /* K3 */ be_nested_str_weak(expiration), + /* K4 */ be_nested_str_weak(max_interval), + /* K5 */ be_nested_str_weak(MAX_INTERVAL_MARGIN), + /* K6 */ be_nested_str_weak(not_before), + /* K7 */ be_nested_str_weak(min_interval), + /* K8 */ be_const_int(1), + /* K9 */ be_nested_str_weak(is_keep_alive), + /* K10 */ be_nested_str_weak(log), + /* K11 */ be_nested_str_weak(MTR_X3A_X20_X2ESub_Done_X20_X20_X28_X20_X20_X20_X20_X20_X20_X29_X20sub_X3D_X25i), + /* K12 */ be_nested_str_weak(subscription_id), + /* K13 */ be_const_int(3), }), be_str_weak(re_arm), &be_const_str_solidified, - ( &(const binstruction[30]) { /* code */ - 0xA4060000, // 0000 IMPORT R1 K0 - 0x50080000, // 0001 LDBOOL R2 0 0 - 0x90020202, // 0002 SETMBR R0 K1 R2 - 0xB80A0400, // 0003 GETNGBL R2 K2 - 0x8C080503, // 0004 GETMET R2 R2 K3 - 0x7C080200, // 0005 CALL R2 1 + ( &(const binstruction[29]) { /* code */ + 0x50040000, // 0000 LDBOOL R1 0 0 + 0x90020001, // 0001 SETMBR R0 K0 R1 + 0xB8060200, // 0002 GETNGBL R1 K1 + 0x8C040302, // 0003 GETMET R1 R1 K2 + 0x7C040200, // 0004 CALL R1 1 + 0x88080104, // 0005 GETMBR R2 R0 K4 0x880C0105, // 0006 GETMBR R3 R0 K5 - 0x88100106, // 0007 GETMBR R4 R0 K6 - 0x040C0604, // 0008 SUB R3 R3 R4 - 0x541203E7, // 0009 LDINT R4 1000 - 0x080C0604, // 000A MUL R3 R3 R4 - 0x000C0403, // 000B ADD R3 R2 R3 - 0x90020803, // 000C SETMBR R0 K4 R3 - 0x880C0108, // 000D GETMBR R3 R0 K8 - 0x541203E7, // 000E LDINT R4 1000 - 0x080C0604, // 000F MUL R3 R3 R4 - 0x000C0403, // 0010 ADD R3 R2 R3 - 0x040C0709, // 0011 SUB R3 R3 K9 - 0x90020E03, // 0012 SETMBR R0 K7 R3 - 0x880C010A, // 0013 GETMBR R3 R0 K10 - 0x740E0007, // 0014 JMPT R3 #001D - 0xB80E0400, // 0015 GETNGBL R3 K2 - 0x8C0C070B, // 0016 GETMET R3 R3 K11 - 0x8C14030C, // 0017 GETMET R5 R1 K12 - 0x581C000D, // 0018 LDCONST R7 K13 - 0x8820010E, // 0019 GETMBR R8 R0 K14 - 0x7C140600, // 001A CALL R5 3 - 0x5818000F, // 001B LDCONST R6 K15 - 0x7C0C0600, // 001C CALL R3 3 - 0x80000000, // 001D RET 0 + 0x04080403, // 0007 SUB R2 R2 R3 + 0x540E03E7, // 0008 LDINT R3 1000 + 0x08080403, // 0009 MUL R2 R2 R3 + 0x00080202, // 000A ADD R2 R1 R2 + 0x90020602, // 000B SETMBR R0 K3 R2 + 0x88080107, // 000C GETMBR R2 R0 K7 + 0x540E03E7, // 000D LDINT R3 1000 + 0x08080403, // 000E MUL R2 R2 R3 + 0x00080202, // 000F ADD R2 R1 R2 + 0x04080508, // 0010 SUB R2 R2 K8 + 0x90020C02, // 0011 SETMBR R0 K6 R2 + 0x88080109, // 0012 GETMBR R2 R0 K9 + 0x740A0007, // 0013 JMPT R2 #001C + 0xB80A0200, // 0014 GETNGBL R2 K1 + 0x8C08050A, // 0015 GETMET R2 R2 K10 + 0x60100018, // 0016 GETGBL R4 G24 + 0x5814000B, // 0017 LDCONST R5 K11 + 0x8818010C, // 0018 GETMBR R6 R0 K12 + 0x7C100400, // 0019 CALL R4 2 + 0x5814000D, // 001A LDCONST R5 K13 + 0x7C080600, // 001B CALL R2 3 + 0x80000000, // 001C RET 0 }) ) ); diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Message.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Message.h index 1b67e8236..f4c65420e 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Message.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Message.h @@ -348,7 +348,7 @@ be_local_closure(Matter_Frame_debug, /* name */ ********************************************************************/ be_local_closure(Matter_Frame_build_standalone_ack, /* name */ be_nested_proto( - 6, /* nstack */ + 5, /* nstack */ 2, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -356,79 +356,77 @@ be_local_closure(Matter_Frame_build_standalone_ack, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[22]) { /* constants */ - /* K0 */ be_nested_str_weak(string), - /* K1 */ be_nested_str_weak(message_handler), - /* K2 */ be_nested_str_weak(remote_ip), - /* K3 */ be_nested_str_weak(remote_port), - /* K4 */ be_nested_str_weak(flag_s), - /* K5 */ be_nested_str_weak(flag_dsiz), - /* K6 */ be_const_int(1), - /* K7 */ be_nested_str_weak(dest_node_id_8), - /* K8 */ be_nested_str_weak(source_node_id), - /* K9 */ be_const_int(0), - /* K10 */ be_nested_str_weak(session), - /* K11 */ be_nested_str_weak(message_counter), - /* K12 */ be_nested_str_weak(counter_snd_next), - /* K13 */ be_nested_str_weak(local_session_id), - /* K14 */ be_nested_str_weak(initiator_session_id), - /* K15 */ be_nested_str_weak(x_flag_i), - /* K16 */ be_nested_str_weak(opcode), - /* K17 */ be_nested_str_weak(exchange_id), - /* K18 */ be_nested_str_weak(protocol_id), - /* K19 */ be_nested_str_weak(x_flag_a), - /* K20 */ be_nested_str_weak(ack_message_counter), - /* K21 */ be_nested_str_weak(x_flag_r), + ( &(const bvalue[21]) { /* constants */ + /* K0 */ be_nested_str_weak(message_handler), + /* K1 */ be_nested_str_weak(remote_ip), + /* K2 */ be_nested_str_weak(remote_port), + /* K3 */ be_nested_str_weak(flag_s), + /* K4 */ be_nested_str_weak(flag_dsiz), + /* K5 */ be_const_int(1), + /* K6 */ be_nested_str_weak(dest_node_id_8), + /* K7 */ be_nested_str_weak(source_node_id), + /* K8 */ be_const_int(0), + /* K9 */ be_nested_str_weak(session), + /* K10 */ be_nested_str_weak(message_counter), + /* K11 */ be_nested_str_weak(counter_snd_next), + /* K12 */ be_nested_str_weak(local_session_id), + /* K13 */ be_nested_str_weak(initiator_session_id), + /* K14 */ be_nested_str_weak(x_flag_i), + /* K15 */ be_nested_str_weak(opcode), + /* K16 */ be_nested_str_weak(exchange_id), + /* K17 */ be_nested_str_weak(protocol_id), + /* K18 */ be_nested_str_weak(x_flag_a), + /* K19 */ be_nested_str_weak(ack_message_counter), + /* K20 */ be_nested_str_weak(x_flag_r), }), be_str_weak(build_standalone_ack), &be_const_str_solidified, - ( &(const binstruction[46]) { /* code */ - 0xA40A0000, // 0000 IMPORT R2 K0 - 0x600C0006, // 0001 GETGBL R3 G6 - 0x5C100000, // 0002 MOVE R4 R0 - 0x7C0C0200, // 0003 CALL R3 1 - 0x88100101, // 0004 GETMBR R4 R0 K1 - 0x7C0C0200, // 0005 CALL R3 1 - 0x88100102, // 0006 GETMBR R4 R0 K2 - 0x900E0404, // 0007 SETMBR R3 K2 R4 - 0x88100103, // 0008 GETMBR R4 R0 K3 - 0x900E0604, // 0009 SETMBR R3 K3 R4 - 0x88100104, // 000A GETMBR R4 R0 K4 - 0x78120003, // 000B JMPF R4 #0010 - 0x900E0B06, // 000C SETMBR R3 K5 K6 - 0x88100108, // 000D GETMBR R4 R0 K8 - 0x900E0E04, // 000E SETMBR R3 K7 R4 - 0x70020000, // 000F JMP #0011 - 0x900E0B09, // 0010 SETMBR R3 K5 K9 - 0x8810010A, // 0011 GETMBR R4 R0 K10 - 0x900E1404, // 0012 SETMBR R3 K10 R4 - 0x8810010A, // 0013 GETMBR R4 R0 K10 - 0x8C10090C, // 0014 GETMET R4 R4 K12 - 0x7C100200, // 0015 CALL R4 1 - 0x900E1604, // 0016 SETMBR R3 K11 R4 - 0x8810010A, // 0017 GETMBR R4 R0 K10 - 0x8810090E, // 0018 GETMBR R4 R4 K14 - 0x900E1A04, // 0019 SETMBR R3 K13 R4 - 0x8810010F, // 001A GETMBR R4 R0 K15 - 0x78120001, // 001B JMPF R4 #001E - 0x58100009, // 001C LDCONST R4 K9 - 0x70020000, // 001D JMP #001F - 0x58100006, // 001E LDCONST R4 K6 - 0x900E1E04, // 001F SETMBR R3 K15 R4 - 0x5412000F, // 0020 LDINT R4 16 - 0x900E2004, // 0021 SETMBR R3 K16 R4 - 0x88100111, // 0022 GETMBR R4 R0 K17 - 0x900E2204, // 0023 SETMBR R3 K17 R4 - 0x900E2509, // 0024 SETMBR R3 K18 K9 - 0x900E2706, // 0025 SETMBR R3 K19 K6 - 0x8810010B, // 0026 GETMBR R4 R0 K11 - 0x900E2804, // 0027 SETMBR R3 K20 R4 - 0x78060001, // 0028 JMPF R1 #002B - 0x58100006, // 0029 LDCONST R4 K6 - 0x70020000, // 002A JMP #002C - 0x58100009, // 002B LDCONST R4 K9 - 0x900E2A04, // 002C SETMBR R3 K21 R4 - 0x80040600, // 002D RET 1 R3 + ( &(const binstruction[45]) { /* code */ + 0x60080006, // 0000 GETGBL R2 G6 + 0x5C0C0000, // 0001 MOVE R3 R0 + 0x7C080200, // 0002 CALL R2 1 + 0x880C0100, // 0003 GETMBR R3 R0 K0 + 0x7C080200, // 0004 CALL R2 1 + 0x880C0101, // 0005 GETMBR R3 R0 K1 + 0x900A0203, // 0006 SETMBR R2 K1 R3 + 0x880C0102, // 0007 GETMBR R3 R0 K2 + 0x900A0403, // 0008 SETMBR R2 K2 R3 + 0x880C0103, // 0009 GETMBR R3 R0 K3 + 0x780E0003, // 000A JMPF R3 #000F + 0x900A0905, // 000B SETMBR R2 K4 K5 + 0x880C0107, // 000C GETMBR R3 R0 K7 + 0x900A0C03, // 000D SETMBR R2 K6 R3 + 0x70020000, // 000E JMP #0010 + 0x900A0908, // 000F SETMBR R2 K4 K8 + 0x880C0109, // 0010 GETMBR R3 R0 K9 + 0x900A1203, // 0011 SETMBR R2 K9 R3 + 0x880C0109, // 0012 GETMBR R3 R0 K9 + 0x8C0C070B, // 0013 GETMET R3 R3 K11 + 0x7C0C0200, // 0014 CALL R3 1 + 0x900A1403, // 0015 SETMBR R2 K10 R3 + 0x880C0109, // 0016 GETMBR R3 R0 K9 + 0x880C070D, // 0017 GETMBR R3 R3 K13 + 0x900A1803, // 0018 SETMBR R2 K12 R3 + 0x880C010E, // 0019 GETMBR R3 R0 K14 + 0x780E0001, // 001A JMPF R3 #001D + 0x580C0008, // 001B LDCONST R3 K8 + 0x70020000, // 001C JMP #001E + 0x580C0005, // 001D LDCONST R3 K5 + 0x900A1C03, // 001E SETMBR R2 K14 R3 + 0x540E000F, // 001F LDINT R3 16 + 0x900A1E03, // 0020 SETMBR R2 K15 R3 + 0x880C0110, // 0021 GETMBR R3 R0 K16 + 0x900A2003, // 0022 SETMBR R2 K16 R3 + 0x900A2308, // 0023 SETMBR R2 K17 K8 + 0x900A2505, // 0024 SETMBR R2 K18 K5 + 0x880C010A, // 0025 GETMBR R3 R0 K10 + 0x900A2603, // 0026 SETMBR R2 K19 R3 + 0x78060001, // 0027 JMPF R1 #002A + 0x580C0005, // 0028 LDCONST R3 K5 + 0x70020000, // 0029 JMP #002B + 0x580C0008, // 002A LDCONST R3 K8 + 0x900A2803, // 002B SETMBR R2 K20 R3 + 0x80040400, // 002C RET 1 R2 }) ) ); @@ -440,7 +438,7 @@ be_local_closure(Matter_Frame_build_standalone_ack, /* name */ ********************************************************************/ be_local_closure(Matter_Frame_build_response, /* name */ be_nested_proto( - 13, /* nstack */ + 11, /* nstack */ 4, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -448,135 +446,132 @@ be_local_closure(Matter_Frame_build_response, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[32]) { /* constants */ - /* K0 */ be_nested_str_weak(string), - /* K1 */ be_nested_str_weak(message_handler), - /* K2 */ be_nested_str_weak(remote_ip), - /* K3 */ be_nested_str_weak(remote_port), - /* K4 */ be_nested_str_weak(flag_s), - /* K5 */ be_nested_str_weak(flag_dsiz), - /* K6 */ be_const_int(1), - /* K7 */ be_nested_str_weak(dest_node_id_8), - /* K8 */ be_nested_str_weak(source_node_id), - /* K9 */ be_const_int(0), - /* K10 */ be_nested_str_weak(session), - /* K11 */ be_nested_str_weak(local_session_id), - /* K12 */ be_nested_str_weak(initiator_session_id), - /* K13 */ be_nested_str_weak(message_counter), - /* K14 */ be_nested_str_weak(counter_snd_next), - /* K15 */ be_nested_str_weak(_counter_insecure_snd), - /* K16 */ be_nested_str_weak(next), - /* K17 */ be_nested_str_weak(x_flag_i), - /* K18 */ be_nested_str_weak(opcode), - /* K19 */ be_nested_str_weak(exchange_id), - /* K20 */ be_nested_str_weak(protocol_id), - /* K21 */ be_nested_str_weak(x_flag_r), - /* K22 */ be_nested_str_weak(x_flag_a), - /* K23 */ be_nested_str_weak(ack_message_counter), - /* K24 */ be_nested_str_weak(matter), - /* K25 */ be_nested_str_weak(get_opcode_name), - /* K26 */ be_nested_str_weak(format), - /* K27 */ be_nested_str_weak(0x_X2502X), - /* K28 */ be_nested_str_weak(tasmota), - /* K29 */ be_nested_str_weak(log), - /* K30 */ be_nested_str_weak(MTR_X3A_X20_X3CReplied_X20_X20_X20_X28_X256i_X29_X20_X25s), - /* K31 */ be_const_int(3), + ( &(const bvalue[30]) { /* constants */ + /* K0 */ be_nested_str_weak(message_handler), + /* K1 */ be_nested_str_weak(remote_ip), + /* K2 */ be_nested_str_weak(remote_port), + /* K3 */ be_nested_str_weak(flag_s), + /* K4 */ be_nested_str_weak(flag_dsiz), + /* K5 */ be_const_int(1), + /* K6 */ be_nested_str_weak(dest_node_id_8), + /* K7 */ be_nested_str_weak(source_node_id), + /* K8 */ be_const_int(0), + /* K9 */ be_nested_str_weak(session), + /* K10 */ be_nested_str_weak(local_session_id), + /* K11 */ be_nested_str_weak(initiator_session_id), + /* K12 */ be_nested_str_weak(message_counter), + /* K13 */ be_nested_str_weak(counter_snd_next), + /* K14 */ be_nested_str_weak(_counter_insecure_snd), + /* K15 */ be_nested_str_weak(next), + /* K16 */ be_nested_str_weak(x_flag_i), + /* K17 */ be_nested_str_weak(opcode), + /* K18 */ be_nested_str_weak(exchange_id), + /* K19 */ be_nested_str_weak(protocol_id), + /* K20 */ be_nested_str_weak(x_flag_r), + /* K21 */ be_nested_str_weak(x_flag_a), + /* K22 */ be_nested_str_weak(ack_message_counter), + /* K23 */ be_nested_str_weak(matter), + /* K24 */ be_nested_str_weak(get_opcode_name), + /* K25 */ be_nested_str_weak(0x_X2502X), + /* K26 */ be_nested_str_weak(tasmota), + /* K27 */ be_nested_str_weak(log), + /* K28 */ be_nested_str_weak(MTR_X3A_X20_X3CReplied_X20_X20_X20_X28_X256i_X29_X20_X25s), + /* K29 */ be_const_int(3), }), be_str_weak(build_response), &be_const_str_solidified, - ( &(const binstruction[92]) { /* code */ - 0xA4120000, // 0000 IMPORT R4 K0 - 0x4C140000, // 0001 LDNIL R5 - 0x1C140605, // 0002 EQ R5 R3 R5 - 0x78160005, // 0003 JMPF R5 #000A - 0x60140006, // 0004 GETGBL R5 G6 - 0x5C180000, // 0005 MOVE R6 R0 - 0x7C140200, // 0006 CALL R5 1 - 0x88180101, // 0007 GETMBR R6 R0 K1 - 0x7C140200, // 0008 CALL R5 1 - 0x5C0C0A00, // 0009 MOVE R3 R5 - 0x88140102, // 000A GETMBR R5 R0 K2 - 0x900E0405, // 000B SETMBR R3 K2 R5 - 0x88140103, // 000C GETMBR R5 R0 K3 - 0x900E0605, // 000D SETMBR R3 K3 R5 - 0x88140104, // 000E GETMBR R5 R0 K4 - 0x78160003, // 000F JMPF R5 #0014 - 0x900E0B06, // 0010 SETMBR R3 K5 K6 - 0x88140108, // 0011 GETMBR R5 R0 K8 - 0x900E0E05, // 0012 SETMBR R3 K7 R5 - 0x70020000, // 0013 JMP #0015 - 0x900E0B09, // 0014 SETMBR R3 K5 K9 - 0x8814010A, // 0015 GETMBR R5 R0 K10 - 0x900E1405, // 0016 SETMBR R3 K10 R5 - 0x8814010B, // 0017 GETMBR R5 R0 K11 - 0x20140B09, // 0018 NE R5 R5 K9 - 0x7816000D, // 0019 JMPF R5 #0028 - 0x8814010A, // 001A GETMBR R5 R0 K10 - 0x7816000B, // 001B JMPF R5 #0028 - 0x8814010A, // 001C GETMBR R5 R0 K10 - 0x88140B0C, // 001D GETMBR R5 R5 K12 - 0x20140B09, // 001E NE R5 R5 K9 - 0x78160007, // 001F JMPF R5 #0028 - 0x8814010A, // 0020 GETMBR R5 R0 K10 - 0x8C140B0E, // 0021 GETMET R5 R5 K14 - 0x7C140200, // 0022 CALL R5 1 - 0x900E1A05, // 0023 SETMBR R3 K13 R5 - 0x8814010A, // 0024 GETMBR R5 R0 K10 - 0x88140B0C, // 0025 GETMBR R5 R5 K12 - 0x900E1605, // 0026 SETMBR R3 K11 R5 - 0x70020005, // 0027 JMP #002E - 0x8814010A, // 0028 GETMBR R5 R0 K10 - 0x88140B0F, // 0029 GETMBR R5 R5 K15 - 0x8C140B10, // 002A GETMET R5 R5 K16 - 0x7C140200, // 002B CALL R5 1 - 0x900E1A05, // 002C SETMBR R3 K13 R5 - 0x900E1709, // 002D SETMBR R3 K11 K9 - 0x88140111, // 002E GETMBR R5 R0 K17 - 0x78160001, // 002F JMPF R5 #0032 - 0x58140009, // 0030 LDCONST R5 K9 - 0x70020000, // 0031 JMP #0033 - 0x58140006, // 0032 LDCONST R5 K6 - 0x900E2205, // 0033 SETMBR R3 K17 R5 - 0x900E2401, // 0034 SETMBR R3 K18 R1 - 0x88140113, // 0035 GETMBR R5 R0 K19 - 0x900E2605, // 0036 SETMBR R3 K19 R5 - 0x88140114, // 0037 GETMBR R5 R0 K20 - 0x900E2805, // 0038 SETMBR R3 K20 R5 - 0x88140115, // 0039 GETMBR R5 R0 K21 - 0x78160002, // 003A JMPF R5 #003E - 0x900E2D06, // 003B SETMBR R3 K22 K6 - 0x8814010D, // 003C GETMBR R5 R0 K13 - 0x900E2E05, // 003D SETMBR R3 K23 R5 - 0x780A0001, // 003E JMPF R2 #0041 - 0x58140006, // 003F LDCONST R5 K6 - 0x70020000, // 0040 JMP #0042 - 0x58140009, // 0041 LDCONST R5 K9 - 0x900E2A05, // 0042 SETMBR R3 K21 R5 - 0x8814070B, // 0043 GETMBR R5 R3 K11 - 0x1C140B09, // 0044 EQ R5 R5 K9 - 0x78160014, // 0045 JMPF R5 #005B - 0xB8163000, // 0046 GETNGBL R5 K24 - 0x8C140B19, // 0047 GETMET R5 R5 K25 - 0x881C0712, // 0048 GETMBR R7 R3 K18 - 0x7C140400, // 0049 CALL R5 2 - 0x5C180A00, // 004A MOVE R6 R5 - 0x741A0004, // 004B JMPT R6 #0051 - 0x8C18091A, // 004C GETMET R6 R4 K26 - 0x5820001B, // 004D LDCONST R8 K27 - 0x88240712, // 004E GETMBR R9 R3 K18 - 0x7C180600, // 004F CALL R6 3 - 0x5C140C00, // 0050 MOVE R5 R6 - 0xB81A3800, // 0051 GETNGBL R6 K28 - 0x8C180D1D, // 0052 GETMET R6 R6 K29 - 0x8C20091A, // 0053 GETMET R8 R4 K26 - 0x5828001E, // 0054 LDCONST R10 K30 - 0x882C070A, // 0055 GETMBR R11 R3 K10 - 0x882C170B, // 0056 GETMBR R11 R11 K11 - 0x5C300A00, // 0057 MOVE R12 R5 - 0x7C200800, // 0058 CALL R8 4 - 0x5824001F, // 0059 LDCONST R9 K31 - 0x7C180600, // 005A CALL R6 3 - 0x80040600, // 005B RET 1 R3 + ( &(const binstruction[91]) { /* code */ + 0x4C100000, // 0000 LDNIL R4 + 0x1C100604, // 0001 EQ R4 R3 R4 + 0x78120005, // 0002 JMPF R4 #0009 + 0x60100006, // 0003 GETGBL R4 G6 + 0x5C140000, // 0004 MOVE R5 R0 + 0x7C100200, // 0005 CALL R4 1 + 0x88140100, // 0006 GETMBR R5 R0 K0 + 0x7C100200, // 0007 CALL R4 1 + 0x5C0C0800, // 0008 MOVE R3 R4 + 0x88100101, // 0009 GETMBR R4 R0 K1 + 0x900E0204, // 000A SETMBR R3 K1 R4 + 0x88100102, // 000B GETMBR R4 R0 K2 + 0x900E0404, // 000C SETMBR R3 K2 R4 + 0x88100103, // 000D GETMBR R4 R0 K3 + 0x78120003, // 000E JMPF R4 #0013 + 0x900E0905, // 000F SETMBR R3 K4 K5 + 0x88100107, // 0010 GETMBR R4 R0 K7 + 0x900E0C04, // 0011 SETMBR R3 K6 R4 + 0x70020000, // 0012 JMP #0014 + 0x900E0908, // 0013 SETMBR R3 K4 K8 + 0x88100109, // 0014 GETMBR R4 R0 K9 + 0x900E1204, // 0015 SETMBR R3 K9 R4 + 0x8810010A, // 0016 GETMBR R4 R0 K10 + 0x20100908, // 0017 NE R4 R4 K8 + 0x7812000D, // 0018 JMPF R4 #0027 + 0x88100109, // 0019 GETMBR R4 R0 K9 + 0x7812000B, // 001A JMPF R4 #0027 + 0x88100109, // 001B GETMBR R4 R0 K9 + 0x8810090B, // 001C GETMBR R4 R4 K11 + 0x20100908, // 001D NE R4 R4 K8 + 0x78120007, // 001E JMPF R4 #0027 + 0x88100109, // 001F GETMBR R4 R0 K9 + 0x8C10090D, // 0020 GETMET R4 R4 K13 + 0x7C100200, // 0021 CALL R4 1 + 0x900E1804, // 0022 SETMBR R3 K12 R4 + 0x88100109, // 0023 GETMBR R4 R0 K9 + 0x8810090B, // 0024 GETMBR R4 R4 K11 + 0x900E1404, // 0025 SETMBR R3 K10 R4 + 0x70020005, // 0026 JMP #002D + 0x88100109, // 0027 GETMBR R4 R0 K9 + 0x8810090E, // 0028 GETMBR R4 R4 K14 + 0x8C10090F, // 0029 GETMET R4 R4 K15 + 0x7C100200, // 002A CALL R4 1 + 0x900E1804, // 002B SETMBR R3 K12 R4 + 0x900E1508, // 002C SETMBR R3 K10 K8 + 0x88100110, // 002D GETMBR R4 R0 K16 + 0x78120001, // 002E JMPF R4 #0031 + 0x58100008, // 002F LDCONST R4 K8 + 0x70020000, // 0030 JMP #0032 + 0x58100005, // 0031 LDCONST R4 K5 + 0x900E2004, // 0032 SETMBR R3 K16 R4 + 0x900E2201, // 0033 SETMBR R3 K17 R1 + 0x88100112, // 0034 GETMBR R4 R0 K18 + 0x900E2404, // 0035 SETMBR R3 K18 R4 + 0x88100113, // 0036 GETMBR R4 R0 K19 + 0x900E2604, // 0037 SETMBR R3 K19 R4 + 0x88100114, // 0038 GETMBR R4 R0 K20 + 0x78120002, // 0039 JMPF R4 #003D + 0x900E2B05, // 003A SETMBR R3 K21 K5 + 0x8810010C, // 003B GETMBR R4 R0 K12 + 0x900E2C04, // 003C SETMBR R3 K22 R4 + 0x780A0001, // 003D JMPF R2 #0040 + 0x58100005, // 003E LDCONST R4 K5 + 0x70020000, // 003F JMP #0041 + 0x58100008, // 0040 LDCONST R4 K8 + 0x900E2804, // 0041 SETMBR R3 K20 R4 + 0x8810070A, // 0042 GETMBR R4 R3 K10 + 0x1C100908, // 0043 EQ R4 R4 K8 + 0x78120014, // 0044 JMPF R4 #005A + 0xB8122E00, // 0045 GETNGBL R4 K23 + 0x8C100918, // 0046 GETMET R4 R4 K24 + 0x88180711, // 0047 GETMBR R6 R3 K17 + 0x7C100400, // 0048 CALL R4 2 + 0x5C140800, // 0049 MOVE R5 R4 + 0x74160004, // 004A JMPT R5 #0050 + 0x60140018, // 004B GETGBL R5 G24 + 0x58180019, // 004C LDCONST R6 K25 + 0x881C0711, // 004D GETMBR R7 R3 K17 + 0x7C140400, // 004E CALL R5 2 + 0x5C100A00, // 004F MOVE R4 R5 + 0xB8163400, // 0050 GETNGBL R5 K26 + 0x8C140B1B, // 0051 GETMET R5 R5 K27 + 0x601C0018, // 0052 GETGBL R7 G24 + 0x5820001C, // 0053 LDCONST R8 K28 + 0x88240709, // 0054 GETMBR R9 R3 K9 + 0x8824130A, // 0055 GETMBR R9 R9 K10 + 0x5C280800, // 0056 MOVE R10 R4 + 0x7C1C0600, // 0057 CALL R7 3 + 0x5820001D, // 0058 LDCONST R8 K29 + 0x7C140600, // 0059 CALL R5 3 + 0x80040600, // 005A RET 1 R3 }) ) ); @@ -588,7 +583,7 @@ be_local_closure(Matter_Frame_build_response, /* name */ ********************************************************************/ be_local_closure(Matter_Frame_initiate_response, /* name */ be_nested_proto( - 10, /* nstack */ + 9, /* nstack */ 5, /* argc */ 4, /* varg */ 0, /* has upvals */ @@ -596,82 +591,80 @@ be_local_closure(Matter_Frame_initiate_response, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[24]) { /* constants */ + ( &(const bvalue[23]) { /* constants */ /* K0 */ be_const_class(be_class_Matter_Frame), - /* K1 */ be_nested_str_weak(string), - /* K2 */ be_nested_str_weak(matter), - /* K3 */ be_nested_str_weak(Frame), - /* K4 */ be_nested_str_weak(remote_ip), - /* K5 */ be_nested_str_weak(_ip), - /* K6 */ be_nested_str_weak(remote_port), - /* K7 */ be_nested_str_weak(_port), - /* K8 */ be_nested_str_weak(flag_dsiz), - /* K9 */ be_const_int(0), - /* K10 */ be_nested_str_weak(session), - /* K11 */ be_nested_str_weak(initiator_session_id), - /* K12 */ be_nested_str_weak(message_counter), - /* K13 */ be_nested_str_weak(counter_snd_next), - /* K14 */ be_nested_str_weak(local_session_id), - /* K15 */ be_nested_str_weak(_counter_insecure_snd), - /* K16 */ be_nested_str_weak(next), - /* K17 */ be_nested_str_weak(x_flag_i), - /* K18 */ be_const_int(1), - /* K19 */ be_nested_str_weak(opcode), - /* K20 */ be_nested_str_weak(_exchange_id), - /* K21 */ be_nested_str_weak(exchange_id), - /* K22 */ be_nested_str_weak(protocol_id), - /* K23 */ be_nested_str_weak(x_flag_r), + /* K1 */ be_nested_str_weak(matter), + /* K2 */ be_nested_str_weak(Frame), + /* K3 */ be_nested_str_weak(remote_ip), + /* K4 */ be_nested_str_weak(_ip), + /* K5 */ be_nested_str_weak(remote_port), + /* K6 */ be_nested_str_weak(_port), + /* K7 */ be_nested_str_weak(flag_dsiz), + /* K8 */ be_const_int(0), + /* K9 */ be_nested_str_weak(session), + /* K10 */ be_nested_str_weak(initiator_session_id), + /* K11 */ be_nested_str_weak(message_counter), + /* K12 */ be_nested_str_weak(counter_snd_next), + /* K13 */ be_nested_str_weak(local_session_id), + /* K14 */ be_nested_str_weak(_counter_insecure_snd), + /* K15 */ be_nested_str_weak(next), + /* K16 */ be_nested_str_weak(x_flag_i), + /* K17 */ be_const_int(1), + /* K18 */ be_nested_str_weak(opcode), + /* K19 */ be_nested_str_weak(_exchange_id), + /* K20 */ be_nested_str_weak(exchange_id), + /* K21 */ be_nested_str_weak(protocol_id), + /* K22 */ be_nested_str_weak(x_flag_r), }), be_str_weak(initiate_response), &be_const_str_solidified, - ( &(const binstruction[47]) { /* code */ + ( &(const binstruction[46]) { /* code */ 0x58140000, // 0000 LDCONST R5 K0 - 0xA41A0200, // 0001 IMPORT R6 K1 - 0x4C1C0000, // 0002 LDNIL R7 - 0x1C1C0807, // 0003 EQ R7 R4 R7 - 0x781E0004, // 0004 JMPF R7 #000A - 0xB81E0400, // 0005 GETNGBL R7 K2 - 0x8C1C0F03, // 0006 GETMET R7 R7 K3 - 0x5C240000, // 0007 MOVE R9 R0 - 0x7C1C0400, // 0008 CALL R7 2 - 0x5C100E00, // 0009 MOVE R4 R7 - 0x881C0305, // 000A GETMBR R7 R1 K5 - 0x90120807, // 000B SETMBR R4 K4 R7 - 0x881C0307, // 000C GETMBR R7 R1 K7 - 0x90120C07, // 000D SETMBR R4 K6 R7 - 0x90121109, // 000E SETMBR R4 K8 K9 - 0x90121401, // 000F SETMBR R4 K10 R1 - 0x78060008, // 0010 JMPF R1 #001A - 0x881C030B, // 0011 GETMBR R7 R1 K11 - 0x201C0F09, // 0012 NE R7 R7 K9 - 0x781E0005, // 0013 JMPF R7 #001A - 0x8C1C030D, // 0014 GETMET R7 R1 K13 - 0x7C1C0200, // 0015 CALL R7 1 - 0x90121807, // 0016 SETMBR R4 K12 R7 - 0x881C030B, // 0017 GETMBR R7 R1 K11 - 0x90121C07, // 0018 SETMBR R4 K14 R7 - 0x70020004, // 0019 JMP #001F - 0x881C030F, // 001A GETMBR R7 R1 K15 - 0x8C1C0F10, // 001B GETMET R7 R7 K16 - 0x7C1C0200, // 001C CALL R7 1 - 0x90121807, // 001D SETMBR R4 K12 R7 - 0x90121D09, // 001E SETMBR R4 K14 K9 - 0x90122312, // 001F SETMBR R4 K17 K18 - 0x90122602, // 0020 SETMBR R4 K19 R2 - 0x881C0314, // 0021 GETMBR R7 R1 K20 - 0x001C0F12, // 0022 ADD R7 R7 K18 - 0x90062807, // 0023 SETMBR R1 K20 R7 - 0x881C0314, // 0024 GETMBR R7 R1 K20 - 0x5422FFFF, // 0025 LDINT R8 65536 - 0x301C0E08, // 0026 OR R7 R7 R8 - 0x90122A07, // 0027 SETMBR R4 K21 R7 - 0x90122D12, // 0028 SETMBR R4 K22 K18 - 0x780E0001, // 0029 JMPF R3 #002C - 0x581C0012, // 002A LDCONST R7 K18 - 0x70020000, // 002B JMP #002D - 0x581C0009, // 002C LDCONST R7 K9 - 0x90122E07, // 002D SETMBR R4 K23 R7 - 0x80040800, // 002E RET 1 R4 + 0x4C180000, // 0001 LDNIL R6 + 0x1C180806, // 0002 EQ R6 R4 R6 + 0x781A0004, // 0003 JMPF R6 #0009 + 0xB81A0200, // 0004 GETNGBL R6 K1 + 0x8C180D02, // 0005 GETMET R6 R6 K2 + 0x5C200000, // 0006 MOVE R8 R0 + 0x7C180400, // 0007 CALL R6 2 + 0x5C100C00, // 0008 MOVE R4 R6 + 0x88180304, // 0009 GETMBR R6 R1 K4 + 0x90120606, // 000A SETMBR R4 K3 R6 + 0x88180306, // 000B GETMBR R6 R1 K6 + 0x90120A06, // 000C SETMBR R4 K5 R6 + 0x90120F08, // 000D SETMBR R4 K7 K8 + 0x90121201, // 000E SETMBR R4 K9 R1 + 0x78060008, // 000F JMPF R1 #0019 + 0x8818030A, // 0010 GETMBR R6 R1 K10 + 0x20180D08, // 0011 NE R6 R6 K8 + 0x781A0005, // 0012 JMPF R6 #0019 + 0x8C18030C, // 0013 GETMET R6 R1 K12 + 0x7C180200, // 0014 CALL R6 1 + 0x90121606, // 0015 SETMBR R4 K11 R6 + 0x8818030A, // 0016 GETMBR R6 R1 K10 + 0x90121A06, // 0017 SETMBR R4 K13 R6 + 0x70020004, // 0018 JMP #001E + 0x8818030E, // 0019 GETMBR R6 R1 K14 + 0x8C180D0F, // 001A GETMET R6 R6 K15 + 0x7C180200, // 001B CALL R6 1 + 0x90121606, // 001C SETMBR R4 K11 R6 + 0x90121B08, // 001D SETMBR R4 K13 K8 + 0x90122111, // 001E SETMBR R4 K16 K17 + 0x90122402, // 001F SETMBR R4 K18 R2 + 0x88180313, // 0020 GETMBR R6 R1 K19 + 0x00180D11, // 0021 ADD R6 R6 K17 + 0x90062606, // 0022 SETMBR R1 K19 R6 + 0x88180313, // 0023 GETMBR R6 R1 K19 + 0x541EFFFF, // 0024 LDINT R7 65536 + 0x30180C07, // 0025 OR R6 R6 R7 + 0x90122806, // 0026 SETMBR R4 K20 R6 + 0x90122B11, // 0027 SETMBR R4 K21 K17 + 0x780E0001, // 0028 JMPF R3 #002B + 0x58180011, // 0029 LDCONST R6 K17 + 0x70020000, // 002A JMP #002C + 0x58180008, // 002B LDCONST R6 K8 + 0x90122C06, // 002C SETMBR R4 K22 R6 + 0x80040800, // 002D RET 1 R4 }) ) ); diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_MessageHandler.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_MessageHandler.h index 21f9a31e8..c420713a7 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_MessageHandler.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_MessageHandler.h @@ -42,7 +42,7 @@ be_local_closure(Matter_MessageHandler_send_response_frame, /* name */ ********************************************************************/ be_local_closure(Matter_MessageHandler_send_encrypted_ack, /* name */ be_nested_proto( - 14, /* nstack */ + 12, /* nstack */ 3, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -50,56 +50,53 @@ be_local_closure(Matter_MessageHandler_send_encrypted_ack, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[16]) { /* constants */ - /* K0 */ be_nested_str_weak(string), - /* K1 */ be_nested_str_weak(x_flag_r), - /* K2 */ be_nested_str_weak(build_standalone_ack), - /* K3 */ be_nested_str_weak(encode_frame), - /* K4 */ be_nested_str_weak(encrypt), - /* K5 */ be_nested_str_weak(tasmota), - /* K6 */ be_nested_str_weak(log), - /* K7 */ be_nested_str_weak(format), - /* K8 */ be_nested_str_weak(MTR_X3A_X20_X3CAck_X2A_X20_X20_X20_X20_X20_X20_X28_X256i_X29_X20ack_X3D_X25i_X20id_X3D_X25i_X20_X25s), - /* K9 */ be_nested_str_weak(session), - /* K10 */ be_nested_str_weak(local_session_id), - /* K11 */ be_nested_str_weak(ack_message_counter), - /* K12 */ be_nested_str_weak(message_counter), - /* K13 */ be_nested_str_weak(_X7Breliable_X7D), - /* K14 */ be_nested_str_weak(), - /* K15 */ be_nested_str_weak(send_response_frame), + ( &(const bvalue[14]) { /* constants */ + /* K0 */ be_nested_str_weak(x_flag_r), + /* K1 */ be_nested_str_weak(build_standalone_ack), + /* K2 */ be_nested_str_weak(encode_frame), + /* K3 */ be_nested_str_weak(encrypt), + /* K4 */ be_nested_str_weak(tasmota), + /* K5 */ be_nested_str_weak(log), + /* K6 */ be_nested_str_weak(MTR_X3A_X20_X3CAck_X2A_X20_X20_X20_X20_X20_X20_X28_X256i_X29_X20ack_X3D_X25i_X20id_X3D_X25i_X20_X25s), + /* K7 */ be_nested_str_weak(session), + /* K8 */ be_nested_str_weak(local_session_id), + /* K9 */ be_nested_str_weak(ack_message_counter), + /* K10 */ be_nested_str_weak(message_counter), + /* K11 */ be_nested_str_weak(_X7Breliable_X7D), + /* K12 */ be_nested_str_weak(), + /* K13 */ be_nested_str_weak(send_response_frame), }), be_str_weak(send_encrypted_ack), &be_const_str_solidified, - ( &(const binstruction[29]) { /* code */ - 0xA40E0000, // 0000 IMPORT R3 K0 - 0x88100301, // 0001 GETMBR R4 R1 K1 - 0x78120018, // 0002 JMPF R4 #001C - 0x8C100302, // 0003 GETMET R4 R1 K2 - 0x5C180400, // 0004 MOVE R6 R2 - 0x7C100400, // 0005 CALL R4 2 - 0x8C140903, // 0006 GETMET R5 R4 K3 - 0x7C140200, // 0007 CALL R5 1 - 0x8C140904, // 0008 GETMET R5 R4 K4 - 0x7C140200, // 0009 CALL R5 1 - 0xB8160A00, // 000A GETNGBL R5 K5 - 0x8C140B06, // 000B GETMET R5 R5 K6 - 0x8C1C0707, // 000C GETMET R7 R3 K7 - 0x58240008, // 000D LDCONST R9 K8 - 0x88280909, // 000E GETMBR R10 R4 K9 - 0x8828150A, // 000F GETMBR R10 R10 K10 - 0x882C090B, // 0010 GETMBR R11 R4 K11 - 0x8830090C, // 0011 GETMBR R12 R4 K12 - 0x780A0001, // 0012 JMPF R2 #0015 - 0x5834000D, // 0013 LDCONST R13 K13 - 0x70020000, // 0014 JMP #0016 - 0x5834000E, // 0015 LDCONST R13 K14 - 0x7C1C0C00, // 0016 CALL R7 6 - 0x54220003, // 0017 LDINT R8 4 - 0x7C140600, // 0018 CALL R5 3 - 0x8C14010F, // 0019 GETMET R5 R0 K15 - 0x5C1C0800, // 001A MOVE R7 R4 - 0x7C140400, // 001B CALL R5 2 - 0x80000000, // 001C RET 0 + ( &(const binstruction[28]) { /* code */ + 0x880C0300, // 0000 GETMBR R3 R1 K0 + 0x780E0018, // 0001 JMPF R3 #001B + 0x8C0C0301, // 0002 GETMET R3 R1 K1 + 0x5C140400, // 0003 MOVE R5 R2 + 0x7C0C0400, // 0004 CALL R3 2 + 0x8C100702, // 0005 GETMET R4 R3 K2 + 0x7C100200, // 0006 CALL R4 1 + 0x8C100703, // 0007 GETMET R4 R3 K3 + 0x7C100200, // 0008 CALL R4 1 + 0xB8120800, // 0009 GETNGBL R4 K4 + 0x8C100905, // 000A GETMET R4 R4 K5 + 0x60180018, // 000B GETGBL R6 G24 + 0x581C0006, // 000C LDCONST R7 K6 + 0x88200707, // 000D GETMBR R8 R3 K7 + 0x88201108, // 000E GETMBR R8 R8 K8 + 0x88240709, // 000F GETMBR R9 R3 K9 + 0x8828070A, // 0010 GETMBR R10 R3 K10 + 0x780A0001, // 0011 JMPF R2 #0014 + 0x582C000B, // 0012 LDCONST R11 K11 + 0x70020000, // 0013 JMP #0015 + 0x582C000C, // 0014 LDCONST R11 K12 + 0x7C180A00, // 0015 CALL R6 5 + 0x541E0003, // 0016 LDINT R7 4 + 0x7C100600, // 0017 CALL R4 3 + 0x8C10010D, // 0018 GETMET R4 R0 K13 + 0x5C180600, // 0019 MOVE R6 R3 + 0x7C100400, // 001A CALL R4 2 + 0x80000000, // 001B RET 0 }) ) ); @@ -145,7 +142,7 @@ be_local_closure(Matter_MessageHandler_every_second, /* name */ ********************************************************************/ be_local_closure(Matter_MessageHandler_send_simple_ack, /* name */ be_nested_proto( - 14, /* nstack */ + 12, /* nstack */ 3, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -153,53 +150,50 @@ be_local_closure(Matter_MessageHandler_send_simple_ack, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[15]) { /* constants */ - /* K0 */ be_nested_str_weak(string), - /* K1 */ be_nested_str_weak(x_flag_r), - /* K2 */ be_nested_str_weak(build_standalone_ack), - /* K3 */ be_nested_str_weak(encode_frame), - /* K4 */ be_nested_str_weak(tasmota), - /* K5 */ be_nested_str_weak(log), - /* K6 */ be_nested_str_weak(format), - /* K7 */ be_nested_str_weak(MTR_X3A_X20_X3CAck_X20_X20_X20_X20_X20_X20_X20_X28_X256i_X29_X20ack_X3D_X25i_X20id_X3D_X25i_X20_X25s), - /* K8 */ be_nested_str_weak(session), - /* K9 */ be_nested_str_weak(local_session_id), - /* K10 */ be_nested_str_weak(ack_message_counter), - /* K11 */ be_nested_str_weak(message_counter), - /* K12 */ be_nested_str_weak(_X7Breliable_X7D), - /* K13 */ be_nested_str_weak(), - /* K14 */ be_nested_str_weak(send_response_frame), + ( &(const bvalue[13]) { /* constants */ + /* K0 */ be_nested_str_weak(x_flag_r), + /* K1 */ be_nested_str_weak(build_standalone_ack), + /* K2 */ be_nested_str_weak(encode_frame), + /* K3 */ be_nested_str_weak(tasmota), + /* K4 */ be_nested_str_weak(log), + /* K5 */ be_nested_str_weak(MTR_X3A_X20_X3CAck_X20_X20_X20_X20_X20_X20_X20_X28_X256i_X29_X20ack_X3D_X25i_X20id_X3D_X25i_X20_X25s), + /* K6 */ be_nested_str_weak(session), + /* K7 */ be_nested_str_weak(local_session_id), + /* K8 */ be_nested_str_weak(ack_message_counter), + /* K9 */ be_nested_str_weak(message_counter), + /* K10 */ be_nested_str_weak(_X7Breliable_X7D), + /* K11 */ be_nested_str_weak(), + /* K12 */ be_nested_str_weak(send_response_frame), }), be_str_weak(send_simple_ack), &be_const_str_solidified, - ( &(const binstruction[27]) { /* code */ - 0xA40E0000, // 0000 IMPORT R3 K0 - 0x88100301, // 0001 GETMBR R4 R1 K1 - 0x78120016, // 0002 JMPF R4 #001A - 0x8C100302, // 0003 GETMET R4 R1 K2 - 0x5C180400, // 0004 MOVE R6 R2 - 0x7C100400, // 0005 CALL R4 2 - 0x8C140903, // 0006 GETMET R5 R4 K3 - 0x7C140200, // 0007 CALL R5 1 - 0xB8160800, // 0008 GETNGBL R5 K4 - 0x8C140B05, // 0009 GETMET R5 R5 K5 - 0x8C1C0706, // 000A GETMET R7 R3 K6 - 0x58240007, // 000B LDCONST R9 K7 - 0x88280908, // 000C GETMBR R10 R4 K8 - 0x88281509, // 000D GETMBR R10 R10 K9 - 0x882C090A, // 000E GETMBR R11 R4 K10 - 0x8830090B, // 000F GETMBR R12 R4 K11 - 0x780A0001, // 0010 JMPF R2 #0013 - 0x5834000C, // 0011 LDCONST R13 K12 - 0x70020000, // 0012 JMP #0014 - 0x5834000D, // 0013 LDCONST R13 K13 - 0x7C1C0C00, // 0014 CALL R7 6 - 0x54220003, // 0015 LDINT R8 4 - 0x7C140600, // 0016 CALL R5 3 - 0x8C14010E, // 0017 GETMET R5 R0 K14 - 0x5C1C0800, // 0018 MOVE R7 R4 - 0x7C140400, // 0019 CALL R5 2 - 0x80000000, // 001A RET 0 + ( &(const binstruction[26]) { /* code */ + 0x880C0300, // 0000 GETMBR R3 R1 K0 + 0x780E0016, // 0001 JMPF R3 #0019 + 0x8C0C0301, // 0002 GETMET R3 R1 K1 + 0x5C140400, // 0003 MOVE R5 R2 + 0x7C0C0400, // 0004 CALL R3 2 + 0x8C100702, // 0005 GETMET R4 R3 K2 + 0x7C100200, // 0006 CALL R4 1 + 0xB8120600, // 0007 GETNGBL R4 K3 + 0x8C100904, // 0008 GETMET R4 R4 K4 + 0x60180018, // 0009 GETGBL R6 G24 + 0x581C0005, // 000A LDCONST R7 K5 + 0x88200706, // 000B GETMBR R8 R3 K6 + 0x88201107, // 000C GETMBR R8 R8 K7 + 0x88240708, // 000D GETMBR R9 R3 K8 + 0x88280709, // 000E GETMBR R10 R3 K9 + 0x780A0001, // 000F JMPF R2 #0012 + 0x582C000A, // 0010 LDCONST R11 K10 + 0x70020000, // 0011 JMP #0013 + 0x582C000B, // 0012 LDCONST R11 K11 + 0x7C180A00, // 0013 CALL R6 5 + 0x541E0003, // 0014 LDINT R7 4 + 0x7C100600, // 0015 CALL R4 3 + 0x8C10010C, // 0016 GETMET R4 R0 K12 + 0x5C180600, // 0017 MOVE R6 R3 + 0x7C100400, // 0018 CALL R4 2 + 0x80000000, // 0019 RET 0 }) ) ); @@ -211,7 +205,7 @@ be_local_closure(Matter_MessageHandler_send_simple_ack, /* name */ ********************************************************************/ be_local_closure(Matter_MessageHandler_msg_received, /* name */ be_nested_proto( - 21, /* nstack */ + 19, /* nstack */ 4, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -219,403 +213,400 @@ be_local_closure(Matter_MessageHandler_msg_received, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[68]) { /* constants */ - /* K0 */ be_nested_str_weak(string), - /* K1 */ be_nested_str_weak(matter), - /* K2 */ be_nested_str_weak(Frame), - /* K3 */ be_nested_str_weak(decode_header), - /* K4 */ be_nested_str_weak(sec_p), - /* K5 */ be_nested_str_weak(device), - /* K6 */ be_nested_str_weak(sessions), - /* K7 */ be_nested_str_weak(find_session_source_id_unsecure), - /* K8 */ be_nested_str_weak(source_node_id), - /* K9 */ be_nested_str_weak(control_message), - /* K10 */ be_nested_str_weak(process_incoming_control_message), - /* K11 */ be_nested_str_weak(local_session_id), - /* K12 */ be_const_int(0), - /* K13 */ be_nested_str_weak(sec_sesstype), - /* K14 */ be_nested_str_weak(_ip), - /* K15 */ be_nested_str_weak(_port), - /* K16 */ be_nested_str_weak(_message_handler), - /* K17 */ be_nested_str_weak(session), - /* K18 */ be_nested_str_weak(_counter_insecure_rcv), - /* K19 */ be_nested_str_weak(validate), - /* K20 */ be_nested_str_weak(message_counter), - /* K21 */ be_nested_str_weak(tasmota), - /* K22 */ be_nested_str_weak(log), - /* K23 */ be_nested_str_weak(format), - /* K24 */ be_nested_str_weak(MTR_X3A_X20_X2E_X20_X20_X20_X20_X20_X20_X20_X20_X20_X20Duplicate_X20unencrypted_X20message_X20_X3D_X20_X25i_X20ref_X20_X3D_X20_X25i), - /* K25 */ be_nested_str_weak(val), - /* K26 */ be_nested_str_weak(send_simple_ack), - /* K27 */ be_nested_str_weak(decode_payload), - /* K28 */ be_nested_str_weak(received_ack), - /* K29 */ be_nested_str_weak(opcode), - /* K30 */ be_nested_str_weak(get_opcode_name), - /* K31 */ be_nested_str_weak(0x_X2502X), - /* K32 */ be_nested_str_weak(MTR_X3A_X20_X3EReceived_X20_X20_X28_X256i_X29_X20_X25s_X20rid_X3D_X25i_X20exch_X3D_X25i_X20from_X20_X5B_X25s_X5D_X3A_X25i), - /* K33 */ be_nested_str_weak(exchange_id), - /* K34 */ be_const_int(3), - /* K35 */ be_nested_str_weak(MTR_X3A_X20_X3Ercv_X20Ack_X20_X20_X20_X28_X256i_X29_X20rid_X3D_X25i_X20exch_X3D_X25i_X20ack_X3D_X25s_X20_X25sfrom_X20_X5B_X25s_X5D_X3A_X25i), - /* K36 */ be_nested_str_weak(x_flag_r), - /* K37 */ be_nested_str_weak(_X7Breliable_X7D_X20), - /* K38 */ be_nested_str_weak(), - /* K39 */ be_nested_str_weak(ack_message_counter), - /* K40 */ be_nested_str_weak(commissioning), - /* K41 */ be_nested_str_weak(process_incoming), - /* K42 */ be_nested_str_weak(MTR_X3A_X20decode_X20header_X3A_X20local_session_id_X3D_X25i_X20message_counter_X3D_X25i), - /* K43 */ be_nested_str_weak(get_session_by_local_session_id), - /* K44 */ be_nested_str_weak(MTR_X3A_X20unknown_X20local_session_id_X3D), - /* K45 */ be_nested_str_weak(counter_rcv_validate), - /* K46 */ be_nested_str_weak(MTR_X3A_X20_X2E_X20_X20_X20_X20_X20_X20_X20_X20_X20_X20Duplicate_X20encrypted_X20message_X20_X3D_X20), - /* K47 */ be_nested_str_weak(_X20counter_X3D), - /* K48 */ be_nested_str_weak(counter_rcv), - /* K49 */ be_nested_str_weak(send_encrypted_ack), - /* K50 */ be_nested_str_weak(decrypt), - /* K51 */ be_nested_str_weak(raw), - /* K52 */ be_nested_str_weak(payload_idx), - /* K53 */ be_const_int(1), - /* K54 */ be_nested_str_weak(MTR_X3A_X20_X3E_X20_X20_X20_X20_X20_X20_X20_X20_X20_X20Decrypted_X20message_X3A_X20protocol_id_X3A), - /* K55 */ be_nested_str_weak(protocol_id), - /* K56 */ be_nested_str_weak(_X20opcode_X3D), - /* K57 */ be_nested_str_weak(_X20exchange_id_X3D), - /* K58 */ be_nested_str_weak(im), - /* K59 */ be_nested_str_weak(process_incoming_ack), - /* K60 */ be_nested_str_weak(send_enqueued), - /* K61 */ be_nested_str_weak(MTR_X3A_X20ignoring_X20unhandled_X20protocol_id_X3A), - /* K62 */ be_nested_str_weak(MTR_X3A_X20MessageHandler_X3A_X3Amsg_received_X20exception_X3A_X20), - /* K63 */ be_nested_str_weak(_X3B), - /* K64 */ be_const_int(2), - /* K65 */ be_nested_str_weak(_debug_present), - /* K66 */ be_nested_str_weak(debug), - /* K67 */ be_nested_str_weak(traceback), + ( &(const bvalue[66]) { /* constants */ + /* K0 */ be_nested_str_weak(matter), + /* K1 */ be_nested_str_weak(Frame), + /* K2 */ be_nested_str_weak(decode_header), + /* K3 */ be_nested_str_weak(sec_p), + /* K4 */ be_nested_str_weak(device), + /* K5 */ be_nested_str_weak(sessions), + /* K6 */ be_nested_str_weak(find_session_source_id_unsecure), + /* K7 */ be_nested_str_weak(source_node_id), + /* K8 */ be_nested_str_weak(control_message), + /* K9 */ be_nested_str_weak(process_incoming_control_message), + /* K10 */ be_nested_str_weak(local_session_id), + /* K11 */ be_const_int(0), + /* K12 */ be_nested_str_weak(sec_sesstype), + /* K13 */ be_nested_str_weak(_ip), + /* K14 */ be_nested_str_weak(_port), + /* K15 */ be_nested_str_weak(_message_handler), + /* K16 */ be_nested_str_weak(session), + /* K17 */ be_nested_str_weak(_counter_insecure_rcv), + /* K18 */ be_nested_str_weak(validate), + /* K19 */ be_nested_str_weak(message_counter), + /* K20 */ be_nested_str_weak(tasmota), + /* K21 */ be_nested_str_weak(log), + /* K22 */ be_nested_str_weak(MTR_X3A_X20_X2E_X20_X20_X20_X20_X20_X20_X20_X20_X20_X20Duplicate_X20unencrypted_X20message_X20_X3D_X20_X25i_X20ref_X20_X3D_X20_X25i), + /* K23 */ be_nested_str_weak(val), + /* K24 */ be_nested_str_weak(send_simple_ack), + /* K25 */ be_nested_str_weak(decode_payload), + /* K26 */ be_nested_str_weak(received_ack), + /* K27 */ be_nested_str_weak(opcode), + /* K28 */ be_nested_str_weak(get_opcode_name), + /* K29 */ be_nested_str_weak(0x_X2502X), + /* K30 */ be_nested_str_weak(MTR_X3A_X20_X3EReceived_X20_X20_X28_X256i_X29_X20_X25s_X20rid_X3D_X25i_X20exch_X3D_X25i_X20from_X20_X5B_X25s_X5D_X3A_X25i), + /* K31 */ be_nested_str_weak(exchange_id), + /* K32 */ be_const_int(3), + /* K33 */ be_nested_str_weak(MTR_X3A_X20_X3Ercv_X20Ack_X20_X20_X20_X28_X256i_X29_X20rid_X3D_X25i_X20exch_X3D_X25i_X20ack_X3D_X25s_X20_X25sfrom_X20_X5B_X25s_X5D_X3A_X25i), + /* K34 */ be_nested_str_weak(x_flag_r), + /* K35 */ be_nested_str_weak(_X7Breliable_X7D_X20), + /* K36 */ be_nested_str_weak(), + /* K37 */ be_nested_str_weak(ack_message_counter), + /* K38 */ be_nested_str_weak(commissioning), + /* K39 */ be_nested_str_weak(process_incoming), + /* K40 */ be_nested_str_weak(MTR_X3A_X20decode_X20header_X3A_X20local_session_id_X3D_X25i_X20message_counter_X3D_X25i), + /* K41 */ be_nested_str_weak(get_session_by_local_session_id), + /* K42 */ be_nested_str_weak(MTR_X3A_X20unknown_X20local_session_id_X3D), + /* K43 */ be_nested_str_weak(counter_rcv_validate), + /* K44 */ be_nested_str_weak(MTR_X3A_X20_X2E_X20_X20_X20_X20_X20_X20_X20_X20_X20_X20Duplicate_X20encrypted_X20message_X20_X3D_X20), + /* K45 */ be_nested_str_weak(_X20counter_X3D), + /* K46 */ be_nested_str_weak(counter_rcv), + /* K47 */ be_nested_str_weak(send_encrypted_ack), + /* K48 */ be_nested_str_weak(decrypt), + /* K49 */ be_nested_str_weak(raw), + /* K50 */ be_nested_str_weak(payload_idx), + /* K51 */ be_const_int(1), + /* K52 */ be_nested_str_weak(MTR_X3A_X20_X3E_X20_X20_X20_X20_X20_X20_X20_X20_X20_X20Decrypted_X20message_X3A_X20protocol_id_X3A), + /* K53 */ be_nested_str_weak(protocol_id), + /* K54 */ be_nested_str_weak(_X20opcode_X3D), + /* K55 */ be_nested_str_weak(_X20exchange_id_X3D), + /* K56 */ be_nested_str_weak(im), + /* K57 */ be_nested_str_weak(process_incoming_ack), + /* K58 */ be_nested_str_weak(send_enqueued), + /* K59 */ be_nested_str_weak(MTR_X3A_X20ignoring_X20unhandled_X20protocol_id_X3A), + /* K60 */ be_nested_str_weak(MTR_X3A_X20MessageHandler_X3A_X3Amsg_received_X20exception_X3A_X20), + /* K61 */ be_nested_str_weak(_X3B), + /* K62 */ be_const_int(2), + /* K63 */ be_nested_str_weak(_debug_present), + /* K64 */ be_nested_str_weak(debug), + /* K65 */ be_nested_str_weak(traceback), }), be_str_weak(msg_received), &be_const_str_solidified, - ( &(const binstruction[324]) { /* code */ - 0xA4120000, // 0000 IMPORT R4 K0 - 0x50140000, // 0001 LDBOOL R5 0 0 - 0xA8020126, // 0002 EXBLK 0 #012A - 0xB81A0200, // 0003 GETNGBL R6 K1 - 0x8C180D02, // 0004 GETMET R6 R6 K2 - 0x5C200000, // 0005 MOVE R8 R0 - 0x5C240200, // 0006 MOVE R9 R1 - 0x5C280400, // 0007 MOVE R10 R2 - 0x5C2C0600, // 0008 MOVE R11 R3 - 0x7C180A00, // 0009 CALL R6 5 - 0x8C1C0D03, // 000A GETMET R7 R6 K3 - 0x7C1C0200, // 000B CALL R7 1 - 0x5C200E00, // 000C MOVE R8 R7 - 0x74220002, // 000D JMPT R8 #0011 - 0x50200000, // 000E LDBOOL R8 0 0 - 0xA8040001, // 000F EXBLK 1 1 - 0x80041000, // 0010 RET 1 R8 - 0x88200D04, // 0011 GETMBR R8 R6 K4 - 0x7822000C, // 0012 JMPF R8 #0020 - 0x88200105, // 0013 GETMBR R8 R0 K5 - 0x88201106, // 0014 GETMBR R8 R8 K6 - 0x8C201107, // 0015 GETMET R8 R8 K7 - 0x88280D08, // 0016 GETMBR R10 R6 K8 - 0x542E0059, // 0017 LDINT R11 90 - 0x7C200600, // 0018 CALL R8 3 - 0x88240109, // 0019 GETMBR R9 R0 K9 - 0x8C24130A, // 001A GETMET R9 R9 K10 - 0x5C2C0C00, // 001B MOVE R11 R6 - 0x7C240400, // 001C CALL R9 2 - 0xA8040001, // 001D EXBLK 1 1 - 0x80041200, // 001E RET 1 R9 - 0x70020105, // 001F JMP #0126 - 0x88200D0B, // 0020 GETMBR R8 R6 K11 - 0x1C20110C, // 0021 EQ R8 R8 K12 - 0x78220070, // 0022 JMPF R8 #0094 - 0x88200D0D, // 0023 GETMBR R8 R6 K13 - 0x1C20110C, // 0024 EQ R8 R8 K12 - 0x7822006D, // 0025 JMPF R8 #0094 - 0x88200105, // 0026 GETMBR R8 R0 K5 - 0x88201106, // 0027 GETMBR R8 R8 K6 - 0x8C201107, // 0028 GETMET R8 R8 K7 - 0x88280D08, // 0029 GETMBR R10 R6 K8 - 0x542E0059, // 002A LDINT R11 90 - 0x7C200600, // 002B CALL R8 3 - 0x780A0000, // 002C JMPF R2 #002E - 0x90221C02, // 002D SETMBR R8 K14 R2 - 0x780E0000, // 002E JMPF R3 #0030 - 0x90221E03, // 002F SETMBR R8 K15 R3 - 0x90222000, // 0030 SETMBR R8 K16 R0 - 0x901A2208, // 0031 SETMBR R6 K17 R8 - 0x88241112, // 0032 GETMBR R9 R8 K18 - 0x8C241313, // 0033 GETMET R9 R9 K19 - 0x882C0D14, // 0034 GETMBR R11 R6 K20 - 0x50300000, // 0035 LDBOOL R12 0 0 - 0x7C240600, // 0036 CALL R9 3 - 0x74260011, // 0037 JMPT R9 #004A - 0xB8262A00, // 0038 GETNGBL R9 K21 - 0x8C241316, // 0039 GETMET R9 R9 K22 - 0x8C2C0917, // 003A GETMET R11 R4 K23 - 0x58340018, // 003B LDCONST R13 K24 - 0x88380D14, // 003C GETMBR R14 R6 K20 - 0x883C1112, // 003D GETMBR R15 R8 K18 - 0x8C3C1F19, // 003E GETMET R15 R15 K25 - 0x7C3C0200, // 003F CALL R15 1 - 0x7C2C0800, // 0040 CALL R11 4 - 0x54320003, // 0041 LDINT R12 4 - 0x7C240600, // 0042 CALL R9 3 - 0x8C24011A, // 0043 GETMET R9 R0 K26 - 0x5C2C0C00, // 0044 MOVE R11 R6 - 0x50300000, // 0045 LDBOOL R12 0 0 - 0x7C240600, // 0046 CALL R9 3 - 0x50240000, // 0047 LDBOOL R9 0 0 - 0xA8040001, // 0048 EXBLK 1 1 - 0x80041200, // 0049 RET 1 R9 - 0x8C240D1B, // 004A GETMET R9 R6 K27 - 0x7C240200, // 004B CALL R9 1 - 0x74260002, // 004C JMPT R9 #0050 - 0x50240000, // 004D LDBOOL R9 0 0 - 0xA8040001, // 004E EXBLK 1 1 - 0x80041200, // 004F RET 1 R9 - 0x88240105, // 0050 GETMBR R9 R0 K5 - 0x8C24131C, // 0051 GETMET R9 R9 K28 - 0x5C2C0C00, // 0052 MOVE R11 R6 - 0x7C240400, // 0053 CALL R9 2 - 0x88240D1D, // 0054 GETMBR R9 R6 K29 - 0x542A000F, // 0055 LDINT R10 16 - 0x2024120A, // 0056 NE R9 R9 R10 - 0x78260018, // 0057 JMPF R9 #0071 - 0xB8260200, // 0058 GETNGBL R9 K1 - 0x8C24131E, // 0059 GETMET R9 R9 K30 - 0x882C0D1D, // 005A GETMBR R11 R6 K29 - 0x7C240400, // 005B CALL R9 2 - 0x5C281200, // 005C MOVE R10 R9 - 0x742A0004, // 005D JMPT R10 #0063 - 0x8C280917, // 005E GETMET R10 R4 K23 - 0x5830001F, // 005F LDCONST R12 K31 - 0x88340D1D, // 0060 GETMBR R13 R6 K29 - 0x7C280600, // 0061 CALL R10 3 - 0x5C241400, // 0062 MOVE R9 R10 - 0xB82A2A00, // 0063 GETNGBL R10 K21 - 0x8C281516, // 0064 GETMET R10 R10 K22 - 0x8C300917, // 0065 GETMET R12 R4 K23 - 0x58380020, // 0066 LDCONST R14 K32 - 0x883C110B, // 0067 GETMBR R15 R8 K11 - 0x5C401200, // 0068 MOVE R16 R9 - 0x88440D14, // 0069 GETMBR R17 R6 K20 - 0x88480D21, // 006A GETMBR R18 R6 K33 - 0x5C4C0400, // 006B MOVE R19 R2 - 0x5C500600, // 006C MOVE R20 R3 - 0x7C301000, // 006D CALL R12 8 - 0x58340022, // 006E LDCONST R13 K34 - 0x7C280600, // 006F CALL R10 3 - 0x70020013, // 0070 JMP #0085 - 0xB8262A00, // 0071 GETNGBL R9 K21 - 0x8C241316, // 0072 GETMET R9 R9 K22 - 0x8C2C0917, // 0073 GETMET R11 R4 K23 - 0x58340023, // 0074 LDCONST R13 K35 - 0x8838110B, // 0075 GETMBR R14 R8 K11 - 0x883C0D14, // 0076 GETMBR R15 R6 K20 - 0x88400D24, // 0077 GETMBR R16 R6 K36 - 0x78420001, // 0078 JMPF R16 #007B - 0x58400025, // 0079 LDCONST R16 K37 - 0x70020000, // 007A JMP #007C - 0x58400026, // 007B LDCONST R16 K38 - 0x88440D21, // 007C GETMBR R17 R6 K33 - 0x60480008, // 007D GETGBL R18 G8 - 0x884C0D27, // 007E GETMBR R19 R6 K39 - 0x7C480200, // 007F CALL R18 1 - 0x5C4C0400, // 0080 MOVE R19 R2 - 0x5C500600, // 0081 MOVE R20 R3 - 0x7C2C1200, // 0082 CALL R11 9 - 0x54320003, // 0083 LDINT R12 4 - 0x7C240600, // 0084 CALL R9 3 - 0x88240128, // 0085 GETMBR R9 R0 K40 - 0x8C241329, // 0086 GETMET R9 R9 K41 - 0x5C2C0C00, // 0087 MOVE R11 R6 - 0x7C240400, // 0088 CALL R9 2 - 0x5C141200, // 0089 MOVE R5 R9 - 0x5C240A00, // 008A MOVE R9 R5 - 0x74260003, // 008B JMPT R9 #0090 - 0x8C24011A, // 008C GETMET R9 R0 K26 - 0x5C2C0C00, // 008D MOVE R11 R6 - 0x50300000, // 008E LDBOOL R12 0 0 - 0x7C240600, // 008F CALL R9 3 - 0x50240200, // 0090 LDBOOL R9 1 0 - 0xA8040001, // 0091 EXBLK 1 1 - 0x80041200, // 0092 RET 1 R9 - 0x70020091, // 0093 JMP #0126 - 0xB8222A00, // 0094 GETNGBL R8 K21 - 0x8C201116, // 0095 GETMET R8 R8 K22 - 0x8C280917, // 0096 GETMET R10 R4 K23 - 0x5830002A, // 0097 LDCONST R12 K42 - 0x88340D0B, // 0098 GETMBR R13 R6 K11 - 0x88380D14, // 0099 GETMBR R14 R6 K20 - 0x7C280800, // 009A CALL R10 4 - 0x542E0003, // 009B LDINT R11 4 - 0x7C200600, // 009C CALL R8 3 - 0x88200105, // 009D GETMBR R8 R0 K5 - 0x88201106, // 009E GETMBR R8 R8 K6 - 0x8C20112B, // 009F GETMET R8 R8 K43 - 0x88280D0B, // 00A0 GETMBR R10 R6 K11 - 0x7C200400, // 00A1 CALL R8 2 - 0x4C240000, // 00A2 LDNIL R9 - 0x1C241009, // 00A3 EQ R9 R8 R9 - 0x7826000A, // 00A4 JMPF R9 #00B0 - 0xB8262A00, // 00A5 GETNGBL R9 K21 - 0x8C241316, // 00A6 GETMET R9 R9 K22 - 0x602C0008, // 00A7 GETGBL R11 G8 - 0x88300D0B, // 00A8 GETMBR R12 R6 K11 - 0x7C2C0200, // 00A9 CALL R11 1 - 0x002E580B, // 00AA ADD R11 K44 R11 - 0x58300022, // 00AB LDCONST R12 K34 - 0x7C240600, // 00AC CALL R9 3 - 0x50240000, // 00AD LDBOOL R9 0 0 - 0xA8040001, // 00AE EXBLK 1 1 - 0x80041200, // 00AF RET 1 R9 - 0x780A0000, // 00B0 JMPF R2 #00B2 - 0x90221C02, // 00B1 SETMBR R8 K14 R2 - 0x780E0000, // 00B2 JMPF R3 #00B4 - 0x90221E03, // 00B3 SETMBR R8 K15 R3 - 0x90222000, // 00B4 SETMBR R8 K16 R0 - 0x901A2208, // 00B5 SETMBR R6 K17 R8 - 0x8C24112D, // 00B6 GETMET R9 R8 K45 - 0x882C0D14, // 00B7 GETMBR R11 R6 K20 - 0x50300200, // 00B8 LDBOOL R12 1 0 - 0x7C240600, // 00B9 CALL R9 3 - 0x74260013, // 00BA JMPT R9 #00CF - 0xB8262A00, // 00BB GETNGBL R9 K21 - 0x8C241316, // 00BC GETMET R9 R9 K22 - 0x602C0008, // 00BD GETGBL R11 G8 - 0x88300D14, // 00BE GETMBR R12 R6 K20 - 0x7C2C0200, // 00BF CALL R11 1 - 0x002E5C0B, // 00C0 ADD R11 K46 R11 - 0x002C172F, // 00C1 ADD R11 R11 K47 - 0x60300008, // 00C2 GETGBL R12 G8 - 0x88341130, // 00C3 GETMBR R13 R8 K48 - 0x7C300200, // 00C4 CALL R12 1 - 0x002C160C, // 00C5 ADD R11 R11 R12 - 0x54320003, // 00C6 LDINT R12 4 - 0x7C240600, // 00C7 CALL R9 3 - 0x8C240131, // 00C8 GETMET R9 R0 K49 - 0x5C2C0C00, // 00C9 MOVE R11 R6 - 0x50300000, // 00CA LDBOOL R12 0 0 - 0x7C240600, // 00CB CALL R9 3 - 0x50240000, // 00CC LDBOOL R9 0 0 - 0xA8040001, // 00CD EXBLK 1 1 - 0x80041200, // 00CE RET 1 R9 - 0x8C240D32, // 00CF GETMET R9 R6 K50 - 0x7C240200, // 00D0 CALL R9 1 - 0x5C281200, // 00D1 MOVE R10 R9 - 0x742A0002, // 00D2 JMPT R10 #00D6 - 0x50280000, // 00D3 LDBOOL R10 0 0 - 0xA8040001, // 00D4 EXBLK 1 1 - 0x80041400, // 00D5 RET 1 R10 - 0x88280D34, // 00D6 GETMBR R10 R6 K52 - 0x04281535, // 00D7 SUB R10 R10 K53 - 0x402A180A, // 00D8 CONNECT R10 K12 R10 - 0x882C0D33, // 00D9 GETMBR R11 R6 K51 - 0x9428160A, // 00DA GETIDX R10 R11 R10 - 0x901A660A, // 00DB SETMBR R6 K51 R10 - 0x88280D33, // 00DC GETMBR R10 R6 K51 - 0x40281409, // 00DD CONNECT R10 R10 R9 - 0x8C280D1B, // 00DE GETMET R10 R6 K27 - 0x7C280200, // 00DF CALL R10 1 - 0xB82A2A00, // 00E0 GETNGBL R10 K21 - 0x8C281516, // 00E1 GETMET R10 R10 K22 - 0x60300008, // 00E2 GETGBL R12 G8 - 0x88340D37, // 00E3 GETMBR R13 R6 K55 - 0x7C300200, // 00E4 CALL R12 1 - 0x00326C0C, // 00E5 ADD R12 K54 R12 - 0x00301938, // 00E6 ADD R12 R12 K56 - 0x60340008, // 00E7 GETGBL R13 G8 - 0x88380D1D, // 00E8 GETMBR R14 R6 K29 - 0x7C340200, // 00E9 CALL R13 1 - 0x0030180D, // 00EA ADD R12 R12 R13 - 0x00301939, // 00EB ADD R12 R12 K57 - 0x60340008, // 00EC GETGBL R13 G8 - 0x88380D21, // 00ED GETMBR R14 R6 K33 - 0x543EFFFE, // 00EE LDINT R15 65535 - 0x2C381C0F, // 00EF AND R14 R14 R15 - 0x7C340200, // 00F0 CALL R13 1 - 0x0030180D, // 00F1 ADD R12 R12 R13 - 0x54360003, // 00F2 LDINT R13 4 - 0x7C280600, // 00F3 CALL R10 3 - 0x88280105, // 00F4 GETMBR R10 R0 K5 - 0x8C28151C, // 00F5 GETMET R10 R10 K28 - 0x5C300C00, // 00F6 MOVE R12 R6 - 0x7C280400, // 00F7 CALL R10 2 - 0x88280D37, // 00F8 GETMBR R10 R6 K55 - 0x1C2C150C, // 00F9 EQ R11 R10 K12 - 0x782E000F, // 00FA JMPF R11 #010B - 0x882C0D1D, // 00FB GETMBR R11 R6 K29 - 0x5432000F, // 00FC LDINT R12 16 - 0x1C2C160C, // 00FD EQ R11 R11 R12 - 0x782E0009, // 00FE JMPF R11 #0109 - 0x882C013A, // 00FF GETMBR R11 R0 K58 - 0x8C2C173B, // 0100 GETMET R11 R11 K59 - 0x5C340C00, // 0101 MOVE R13 R6 - 0x7C2C0400, // 0102 CALL R11 2 - 0x5C141600, // 0103 MOVE R5 R11 - 0x78160003, // 0104 JMPF R5 #0109 - 0x882C013A, // 0105 GETMBR R11 R0 K58 - 0x8C2C173C, // 0106 GETMET R11 R11 K60 - 0x5C340000, // 0107 MOVE R13 R0 - 0x7C2C0400, // 0108 CALL R11 2 - 0x50140200, // 0109 LDBOOL R5 1 0 - 0x7002001A, // 010A JMP #0126 - 0x1C2C1535, // 010B EQ R11 R10 K53 - 0x782E0010, // 010C JMPF R11 #011E - 0x882C013A, // 010D GETMBR R11 R0 K58 - 0x8C2C1729, // 010E GETMET R11 R11 K41 - 0x5C340C00, // 010F MOVE R13 R6 - 0x7C2C0400, // 0110 CALL R11 2 - 0x5C141600, // 0111 MOVE R5 R11 - 0x78160004, // 0112 JMPF R5 #0118 - 0x882C013A, // 0113 GETMBR R11 R0 K58 - 0x8C2C173C, // 0114 GETMET R11 R11 K60 - 0x5C340000, // 0115 MOVE R13 R0 - 0x7C2C0400, // 0116 CALL R11 2 - 0x70020003, // 0117 JMP #011C - 0x8C2C0131, // 0118 GETMET R11 R0 K49 - 0x5C340C00, // 0119 MOVE R13 R6 - 0x50380200, // 011A LDBOOL R14 1 0 - 0x7C2C0600, // 011B CALL R11 3 - 0x50140200, // 011C LDBOOL R5 1 0 - 0x70020007, // 011D JMP #0126 - 0xB82E2A00, // 011E GETNGBL R11 K21 - 0x8C2C1716, // 011F GETMET R11 R11 K22 - 0x60340008, // 0120 GETGBL R13 G8 - 0x5C381400, // 0121 MOVE R14 R10 - 0x7C340200, // 0122 CALL R13 1 - 0x00367A0D, // 0123 ADD R13 K61 R13 - 0x58380022, // 0124 LDCONST R14 K34 - 0x7C2C0600, // 0125 CALL R11 3 - 0xA8040001, // 0126 EXBLK 1 1 - 0x80040A00, // 0127 RET 1 R5 - 0xA8040001, // 0128 EXBLK 1 1 - 0x70020018, // 0129 JMP #0143 - 0xAC180002, // 012A CATCH R6 0 2 - 0x70020015, // 012B JMP #0142 - 0xB8222A00, // 012C GETNGBL R8 K21 - 0x8C201116, // 012D GETMET R8 R8 K22 - 0x60280008, // 012E GETGBL R10 G8 - 0x5C2C0C00, // 012F MOVE R11 R6 - 0x7C280200, // 0130 CALL R10 1 - 0x002A7C0A, // 0131 ADD R10 K62 R10 - 0x0028153F, // 0132 ADD R10 R10 K63 - 0x602C0008, // 0133 GETGBL R11 G8 - 0x5C300E00, // 0134 MOVE R12 R7 - 0x7C2C0200, // 0135 CALL R11 1 - 0x0028140B, // 0136 ADD R10 R10 R11 - 0x582C0040, // 0137 LDCONST R11 K64 - 0x7C200600, // 0138 CALL R8 3 - 0xB8222A00, // 0139 GETNGBL R8 K21 - 0x88201141, // 013A GETMBR R8 R8 K65 - 0x78220002, // 013B JMPF R8 #013F - 0xA4228400, // 013C IMPORT R8 K66 - 0x8C241143, // 013D GETMET R9 R8 K67 - 0x7C240200, // 013E CALL R9 1 - 0x50200000, // 013F LDBOOL R8 0 0 - 0x80041000, // 0140 RET 1 R8 - 0x70020000, // 0141 JMP #0143 - 0xB0080000, // 0142 RAISE 2 R0 R0 - 0x80000000, // 0143 RET 0 + ( &(const binstruction[323]) { /* code */ + 0x50100000, // 0000 LDBOOL R4 0 0 + 0xA8020126, // 0001 EXBLK 0 #0129 + 0xB8160000, // 0002 GETNGBL R5 K0 + 0x8C140B01, // 0003 GETMET R5 R5 K1 + 0x5C1C0000, // 0004 MOVE R7 R0 + 0x5C200200, // 0005 MOVE R8 R1 + 0x5C240400, // 0006 MOVE R9 R2 + 0x5C280600, // 0007 MOVE R10 R3 + 0x7C140A00, // 0008 CALL R5 5 + 0x8C180B02, // 0009 GETMET R6 R5 K2 + 0x7C180200, // 000A CALL R6 1 + 0x5C1C0C00, // 000B MOVE R7 R6 + 0x741E0002, // 000C JMPT R7 #0010 + 0x501C0000, // 000D LDBOOL R7 0 0 + 0xA8040001, // 000E EXBLK 1 1 + 0x80040E00, // 000F RET 1 R7 + 0x881C0B03, // 0010 GETMBR R7 R5 K3 + 0x781E000C, // 0011 JMPF R7 #001F + 0x881C0104, // 0012 GETMBR R7 R0 K4 + 0x881C0F05, // 0013 GETMBR R7 R7 K5 + 0x8C1C0F06, // 0014 GETMET R7 R7 K6 + 0x88240B07, // 0015 GETMBR R9 R5 K7 + 0x542A0059, // 0016 LDINT R10 90 + 0x7C1C0600, // 0017 CALL R7 3 + 0x88200108, // 0018 GETMBR R8 R0 K8 + 0x8C201109, // 0019 GETMET R8 R8 K9 + 0x5C280A00, // 001A MOVE R10 R5 + 0x7C200400, // 001B CALL R8 2 + 0xA8040001, // 001C EXBLK 1 1 + 0x80041000, // 001D RET 1 R8 + 0x70020105, // 001E JMP #0125 + 0x881C0B0A, // 001F GETMBR R7 R5 K10 + 0x1C1C0F0B, // 0020 EQ R7 R7 K11 + 0x781E0070, // 0021 JMPF R7 #0093 + 0x881C0B0C, // 0022 GETMBR R7 R5 K12 + 0x1C1C0F0B, // 0023 EQ R7 R7 K11 + 0x781E006D, // 0024 JMPF R7 #0093 + 0x881C0104, // 0025 GETMBR R7 R0 K4 + 0x881C0F05, // 0026 GETMBR R7 R7 K5 + 0x8C1C0F06, // 0027 GETMET R7 R7 K6 + 0x88240B07, // 0028 GETMBR R9 R5 K7 + 0x542A0059, // 0029 LDINT R10 90 + 0x7C1C0600, // 002A CALL R7 3 + 0x780A0000, // 002B JMPF R2 #002D + 0x901E1A02, // 002C SETMBR R7 K13 R2 + 0x780E0000, // 002D JMPF R3 #002F + 0x901E1C03, // 002E SETMBR R7 K14 R3 + 0x901E1E00, // 002F SETMBR R7 K15 R0 + 0x90162007, // 0030 SETMBR R5 K16 R7 + 0x88200F11, // 0031 GETMBR R8 R7 K17 + 0x8C201112, // 0032 GETMET R8 R8 K18 + 0x88280B13, // 0033 GETMBR R10 R5 K19 + 0x502C0000, // 0034 LDBOOL R11 0 0 + 0x7C200600, // 0035 CALL R8 3 + 0x74220011, // 0036 JMPT R8 #0049 + 0xB8222800, // 0037 GETNGBL R8 K20 + 0x8C201115, // 0038 GETMET R8 R8 K21 + 0x60280018, // 0039 GETGBL R10 G24 + 0x582C0016, // 003A LDCONST R11 K22 + 0x88300B13, // 003B GETMBR R12 R5 K19 + 0x88340F11, // 003C GETMBR R13 R7 K17 + 0x8C341B17, // 003D GETMET R13 R13 K23 + 0x7C340200, // 003E CALL R13 1 + 0x7C280600, // 003F CALL R10 3 + 0x542E0003, // 0040 LDINT R11 4 + 0x7C200600, // 0041 CALL R8 3 + 0x8C200118, // 0042 GETMET R8 R0 K24 + 0x5C280A00, // 0043 MOVE R10 R5 + 0x502C0000, // 0044 LDBOOL R11 0 0 + 0x7C200600, // 0045 CALL R8 3 + 0x50200000, // 0046 LDBOOL R8 0 0 + 0xA8040001, // 0047 EXBLK 1 1 + 0x80041000, // 0048 RET 1 R8 + 0x8C200B19, // 0049 GETMET R8 R5 K25 + 0x7C200200, // 004A CALL R8 1 + 0x74220002, // 004B JMPT R8 #004F + 0x50200000, // 004C LDBOOL R8 0 0 + 0xA8040001, // 004D EXBLK 1 1 + 0x80041000, // 004E RET 1 R8 + 0x88200104, // 004F GETMBR R8 R0 K4 + 0x8C20111A, // 0050 GETMET R8 R8 K26 + 0x5C280A00, // 0051 MOVE R10 R5 + 0x7C200400, // 0052 CALL R8 2 + 0x88200B1B, // 0053 GETMBR R8 R5 K27 + 0x5426000F, // 0054 LDINT R9 16 + 0x20201009, // 0055 NE R8 R8 R9 + 0x78220018, // 0056 JMPF R8 #0070 + 0xB8220000, // 0057 GETNGBL R8 K0 + 0x8C20111C, // 0058 GETMET R8 R8 K28 + 0x88280B1B, // 0059 GETMBR R10 R5 K27 + 0x7C200400, // 005A CALL R8 2 + 0x5C241000, // 005B MOVE R9 R8 + 0x74260004, // 005C JMPT R9 #0062 + 0x60240018, // 005D GETGBL R9 G24 + 0x5828001D, // 005E LDCONST R10 K29 + 0x882C0B1B, // 005F GETMBR R11 R5 K27 + 0x7C240400, // 0060 CALL R9 2 + 0x5C201200, // 0061 MOVE R8 R9 + 0xB8262800, // 0062 GETNGBL R9 K20 + 0x8C241315, // 0063 GETMET R9 R9 K21 + 0x602C0018, // 0064 GETGBL R11 G24 + 0x5830001E, // 0065 LDCONST R12 K30 + 0x88340F0A, // 0066 GETMBR R13 R7 K10 + 0x5C381000, // 0067 MOVE R14 R8 + 0x883C0B13, // 0068 GETMBR R15 R5 K19 + 0x88400B1F, // 0069 GETMBR R16 R5 K31 + 0x5C440400, // 006A MOVE R17 R2 + 0x5C480600, // 006B MOVE R18 R3 + 0x7C2C0E00, // 006C CALL R11 7 + 0x58300020, // 006D LDCONST R12 K32 + 0x7C240600, // 006E CALL R9 3 + 0x70020013, // 006F JMP #0084 + 0xB8222800, // 0070 GETNGBL R8 K20 + 0x8C201115, // 0071 GETMET R8 R8 K21 + 0x60280018, // 0072 GETGBL R10 G24 + 0x582C0021, // 0073 LDCONST R11 K33 + 0x88300F0A, // 0074 GETMBR R12 R7 K10 + 0x88340B13, // 0075 GETMBR R13 R5 K19 + 0x88380B22, // 0076 GETMBR R14 R5 K34 + 0x783A0001, // 0077 JMPF R14 #007A + 0x58380023, // 0078 LDCONST R14 K35 + 0x70020000, // 0079 JMP #007B + 0x58380024, // 007A LDCONST R14 K36 + 0x883C0B1F, // 007B GETMBR R15 R5 K31 + 0x60400008, // 007C GETGBL R16 G8 + 0x88440B25, // 007D GETMBR R17 R5 K37 + 0x7C400200, // 007E CALL R16 1 + 0x5C440400, // 007F MOVE R17 R2 + 0x5C480600, // 0080 MOVE R18 R3 + 0x7C281000, // 0081 CALL R10 8 + 0x542E0003, // 0082 LDINT R11 4 + 0x7C200600, // 0083 CALL R8 3 + 0x88200126, // 0084 GETMBR R8 R0 K38 + 0x8C201127, // 0085 GETMET R8 R8 K39 + 0x5C280A00, // 0086 MOVE R10 R5 + 0x7C200400, // 0087 CALL R8 2 + 0x5C101000, // 0088 MOVE R4 R8 + 0x5C200800, // 0089 MOVE R8 R4 + 0x74220003, // 008A JMPT R8 #008F + 0x8C200118, // 008B GETMET R8 R0 K24 + 0x5C280A00, // 008C MOVE R10 R5 + 0x502C0000, // 008D LDBOOL R11 0 0 + 0x7C200600, // 008E CALL R8 3 + 0x50200200, // 008F LDBOOL R8 1 0 + 0xA8040001, // 0090 EXBLK 1 1 + 0x80041000, // 0091 RET 1 R8 + 0x70020091, // 0092 JMP #0125 + 0xB81E2800, // 0093 GETNGBL R7 K20 + 0x8C1C0F15, // 0094 GETMET R7 R7 K21 + 0x60240018, // 0095 GETGBL R9 G24 + 0x58280028, // 0096 LDCONST R10 K40 + 0x882C0B0A, // 0097 GETMBR R11 R5 K10 + 0x88300B13, // 0098 GETMBR R12 R5 K19 + 0x7C240600, // 0099 CALL R9 3 + 0x542A0003, // 009A LDINT R10 4 + 0x7C1C0600, // 009B CALL R7 3 + 0x881C0104, // 009C GETMBR R7 R0 K4 + 0x881C0F05, // 009D GETMBR R7 R7 K5 + 0x8C1C0F29, // 009E GETMET R7 R7 K41 + 0x88240B0A, // 009F GETMBR R9 R5 K10 + 0x7C1C0400, // 00A0 CALL R7 2 + 0x4C200000, // 00A1 LDNIL R8 + 0x1C200E08, // 00A2 EQ R8 R7 R8 + 0x7822000A, // 00A3 JMPF R8 #00AF + 0xB8222800, // 00A4 GETNGBL R8 K20 + 0x8C201115, // 00A5 GETMET R8 R8 K21 + 0x60280008, // 00A6 GETGBL R10 G8 + 0x882C0B0A, // 00A7 GETMBR R11 R5 K10 + 0x7C280200, // 00A8 CALL R10 1 + 0x002A540A, // 00A9 ADD R10 K42 R10 + 0x582C0020, // 00AA LDCONST R11 K32 + 0x7C200600, // 00AB CALL R8 3 + 0x50200000, // 00AC LDBOOL R8 0 0 + 0xA8040001, // 00AD EXBLK 1 1 + 0x80041000, // 00AE RET 1 R8 + 0x780A0000, // 00AF JMPF R2 #00B1 + 0x901E1A02, // 00B0 SETMBR R7 K13 R2 + 0x780E0000, // 00B1 JMPF R3 #00B3 + 0x901E1C03, // 00B2 SETMBR R7 K14 R3 + 0x901E1E00, // 00B3 SETMBR R7 K15 R0 + 0x90162007, // 00B4 SETMBR R5 K16 R7 + 0x8C200F2B, // 00B5 GETMET R8 R7 K43 + 0x88280B13, // 00B6 GETMBR R10 R5 K19 + 0x502C0200, // 00B7 LDBOOL R11 1 0 + 0x7C200600, // 00B8 CALL R8 3 + 0x74220013, // 00B9 JMPT R8 #00CE + 0xB8222800, // 00BA GETNGBL R8 K20 + 0x8C201115, // 00BB GETMET R8 R8 K21 + 0x60280008, // 00BC GETGBL R10 G8 + 0x882C0B13, // 00BD GETMBR R11 R5 K19 + 0x7C280200, // 00BE CALL R10 1 + 0x002A580A, // 00BF ADD R10 K44 R10 + 0x0028152D, // 00C0 ADD R10 R10 K45 + 0x602C0008, // 00C1 GETGBL R11 G8 + 0x88300F2E, // 00C2 GETMBR R12 R7 K46 + 0x7C2C0200, // 00C3 CALL R11 1 + 0x0028140B, // 00C4 ADD R10 R10 R11 + 0x542E0003, // 00C5 LDINT R11 4 + 0x7C200600, // 00C6 CALL R8 3 + 0x8C20012F, // 00C7 GETMET R8 R0 K47 + 0x5C280A00, // 00C8 MOVE R10 R5 + 0x502C0000, // 00C9 LDBOOL R11 0 0 + 0x7C200600, // 00CA CALL R8 3 + 0x50200000, // 00CB LDBOOL R8 0 0 + 0xA8040001, // 00CC EXBLK 1 1 + 0x80041000, // 00CD RET 1 R8 + 0x8C200B30, // 00CE GETMET R8 R5 K48 + 0x7C200200, // 00CF CALL R8 1 + 0x5C241000, // 00D0 MOVE R9 R8 + 0x74260002, // 00D1 JMPT R9 #00D5 + 0x50240000, // 00D2 LDBOOL R9 0 0 + 0xA8040001, // 00D3 EXBLK 1 1 + 0x80041200, // 00D4 RET 1 R9 + 0x88240B32, // 00D5 GETMBR R9 R5 K50 + 0x04241333, // 00D6 SUB R9 R9 K51 + 0x40261609, // 00D7 CONNECT R9 K11 R9 + 0x88280B31, // 00D8 GETMBR R10 R5 K49 + 0x94241409, // 00D9 GETIDX R9 R10 R9 + 0x90166209, // 00DA SETMBR R5 K49 R9 + 0x88240B31, // 00DB GETMBR R9 R5 K49 + 0x40241208, // 00DC CONNECT R9 R9 R8 + 0x8C240B19, // 00DD GETMET R9 R5 K25 + 0x7C240200, // 00DE CALL R9 1 + 0xB8262800, // 00DF GETNGBL R9 K20 + 0x8C241315, // 00E0 GETMET R9 R9 K21 + 0x602C0008, // 00E1 GETGBL R11 G8 + 0x88300B35, // 00E2 GETMBR R12 R5 K53 + 0x7C2C0200, // 00E3 CALL R11 1 + 0x002E680B, // 00E4 ADD R11 K52 R11 + 0x002C1736, // 00E5 ADD R11 R11 K54 + 0x60300008, // 00E6 GETGBL R12 G8 + 0x88340B1B, // 00E7 GETMBR R13 R5 K27 + 0x7C300200, // 00E8 CALL R12 1 + 0x002C160C, // 00E9 ADD R11 R11 R12 + 0x002C1737, // 00EA ADD R11 R11 K55 + 0x60300008, // 00EB GETGBL R12 G8 + 0x88340B1F, // 00EC GETMBR R13 R5 K31 + 0x543AFFFE, // 00ED LDINT R14 65535 + 0x2C341A0E, // 00EE AND R13 R13 R14 + 0x7C300200, // 00EF CALL R12 1 + 0x002C160C, // 00F0 ADD R11 R11 R12 + 0x54320003, // 00F1 LDINT R12 4 + 0x7C240600, // 00F2 CALL R9 3 + 0x88240104, // 00F3 GETMBR R9 R0 K4 + 0x8C24131A, // 00F4 GETMET R9 R9 K26 + 0x5C2C0A00, // 00F5 MOVE R11 R5 + 0x7C240400, // 00F6 CALL R9 2 + 0x88240B35, // 00F7 GETMBR R9 R5 K53 + 0x1C28130B, // 00F8 EQ R10 R9 K11 + 0x782A000F, // 00F9 JMPF R10 #010A + 0x88280B1B, // 00FA GETMBR R10 R5 K27 + 0x542E000F, // 00FB LDINT R11 16 + 0x1C28140B, // 00FC EQ R10 R10 R11 + 0x782A0009, // 00FD JMPF R10 #0108 + 0x88280138, // 00FE GETMBR R10 R0 K56 + 0x8C281539, // 00FF GETMET R10 R10 K57 + 0x5C300A00, // 0100 MOVE R12 R5 + 0x7C280400, // 0101 CALL R10 2 + 0x5C101400, // 0102 MOVE R4 R10 + 0x78120003, // 0103 JMPF R4 #0108 + 0x88280138, // 0104 GETMBR R10 R0 K56 + 0x8C28153A, // 0105 GETMET R10 R10 K58 + 0x5C300000, // 0106 MOVE R12 R0 + 0x7C280400, // 0107 CALL R10 2 + 0x50100200, // 0108 LDBOOL R4 1 0 + 0x7002001A, // 0109 JMP #0125 + 0x1C281333, // 010A EQ R10 R9 K51 + 0x782A0010, // 010B JMPF R10 #011D + 0x88280138, // 010C GETMBR R10 R0 K56 + 0x8C281527, // 010D GETMET R10 R10 K39 + 0x5C300A00, // 010E MOVE R12 R5 + 0x7C280400, // 010F CALL R10 2 + 0x5C101400, // 0110 MOVE R4 R10 + 0x78120004, // 0111 JMPF R4 #0117 + 0x88280138, // 0112 GETMBR R10 R0 K56 + 0x8C28153A, // 0113 GETMET R10 R10 K58 + 0x5C300000, // 0114 MOVE R12 R0 + 0x7C280400, // 0115 CALL R10 2 + 0x70020003, // 0116 JMP #011B + 0x8C28012F, // 0117 GETMET R10 R0 K47 + 0x5C300A00, // 0118 MOVE R12 R5 + 0x50340200, // 0119 LDBOOL R13 1 0 + 0x7C280600, // 011A CALL R10 3 + 0x50100200, // 011B LDBOOL R4 1 0 + 0x70020007, // 011C JMP #0125 + 0xB82A2800, // 011D GETNGBL R10 K20 + 0x8C281515, // 011E GETMET R10 R10 K21 + 0x60300008, // 011F GETGBL R12 G8 + 0x5C341200, // 0120 MOVE R13 R9 + 0x7C300200, // 0121 CALL R12 1 + 0x0032760C, // 0122 ADD R12 K59 R12 + 0x58340020, // 0123 LDCONST R13 K32 + 0x7C280600, // 0124 CALL R10 3 + 0xA8040001, // 0125 EXBLK 1 1 + 0x80040800, // 0126 RET 1 R4 + 0xA8040001, // 0127 EXBLK 1 1 + 0x70020018, // 0128 JMP #0142 + 0xAC140002, // 0129 CATCH R5 0 2 + 0x70020015, // 012A JMP #0141 + 0xB81E2800, // 012B GETNGBL R7 K20 + 0x8C1C0F15, // 012C GETMET R7 R7 K21 + 0x60240008, // 012D GETGBL R9 G8 + 0x5C280A00, // 012E MOVE R10 R5 + 0x7C240200, // 012F CALL R9 1 + 0x00267809, // 0130 ADD R9 K60 R9 + 0x0024133D, // 0131 ADD R9 R9 K61 + 0x60280008, // 0132 GETGBL R10 G8 + 0x5C2C0C00, // 0133 MOVE R11 R6 + 0x7C280200, // 0134 CALL R10 1 + 0x0024120A, // 0135 ADD R9 R9 R10 + 0x5828003E, // 0136 LDCONST R10 K62 + 0x7C1C0600, // 0137 CALL R7 3 + 0xB81E2800, // 0138 GETNGBL R7 K20 + 0x881C0F3F, // 0139 GETMBR R7 R7 K63 + 0x781E0002, // 013A JMPF R7 #013E + 0xA41E8000, // 013B IMPORT R7 K64 + 0x8C200F41, // 013C GETMET R8 R7 K65 + 0x7C200200, // 013D CALL R8 1 + 0x501C0000, // 013E LDBOOL R7 0 0 + 0x80040E00, // 013F RET 1 R7 + 0x70020000, // 0140 JMP #0142 + 0xB0080000, // 0141 RAISE 2 R0 R0 + 0x80000000, // 0142 RET 0 }) ) ); diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Path.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Path.h index 1916265ee..b81e7a973 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Path.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Path.h @@ -11,7 +11,7 @@ extern const bclass be_class_Matter_Path; ********************************************************************/ be_local_closure(Matter_Path_tostring, /* name */ be_nested_proto( - 7, /* nstack */ + 6, /* nstack */ 1, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -19,101 +19,98 @@ be_local_closure(Matter_Path_tostring, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[15]) { /* constants */ - /* K0 */ be_nested_str_weak(string), - /* K1 */ be_nested_str_weak(), - /* K2 */ be_nested_str_weak(endpoint), - /* K3 */ be_nested_str_weak(format), - /* K4 */ be_nested_str_weak(_X5B_X2502X_X5D), - /* K5 */ be_nested_str_weak(_X5B_X2A_X2A_X5D), - /* K6 */ be_nested_str_weak(cluster), - /* K7 */ be_nested_str_weak(_X2504X_X2F), - /* K8 */ be_nested_str_weak(_X2A_X2A_X2A_X2A_X2F), - /* K9 */ be_nested_str_weak(attribute), - /* K10 */ be_nested_str_weak(_X2504X), - /* K11 */ be_nested_str_weak(command), - /* K12 */ be_nested_str_weak(_X2A_X2A_X2A_X2A), - /* K13 */ be_nested_str_weak(Exception_X3E_X20), - /* K14 */ be_nested_str_weak(_X2C_X20), + ( &(const bvalue[13]) { /* constants */ + /* K0 */ be_nested_str_weak(), + /* K1 */ be_nested_str_weak(endpoint), + /* K2 */ be_nested_str_weak(_X5B_X2502X_X5D), + /* K3 */ be_nested_str_weak(_X5B_X2A_X2A_X5D), + /* K4 */ be_nested_str_weak(cluster), + /* K5 */ be_nested_str_weak(_X2504X_X2F), + /* K6 */ be_nested_str_weak(_X2A_X2A_X2A_X2A_X2F), + /* K7 */ be_nested_str_weak(attribute), + /* K8 */ be_nested_str_weak(_X2504X), + /* K9 */ be_nested_str_weak(command), + /* K10 */ be_nested_str_weak(_X2A_X2A_X2A_X2A), + /* K11 */ be_nested_str_weak(Exception_X3E_X20), + /* K12 */ be_nested_str_weak(_X2C_X20), }), be_str_weak(tostring), &be_const_str_solidified, - ( &(const binstruction[75]) { /* code */ - 0xA802003A, // 0000 EXBLK 0 #003C - 0xA4060000, // 0001 IMPORT R1 K0 - 0x58080001, // 0002 LDCONST R2 K1 - 0x880C0102, // 0003 GETMBR R3 R0 K2 - 0x4C100000, // 0004 LDNIL R4 - 0x200C0604, // 0005 NE R3 R3 R4 - 0x780E0004, // 0006 JMPF R3 #000C - 0x8C0C0303, // 0007 GETMET R3 R1 K3 - 0x58140004, // 0008 LDCONST R5 K4 - 0x88180102, // 0009 GETMBR R6 R0 K2 - 0x7C0C0600, // 000A CALL R3 3 - 0x70020000, // 000B JMP #000D - 0x580C0005, // 000C LDCONST R3 K5 - 0x00080403, // 000D ADD R2 R2 R3 - 0x880C0106, // 000E GETMBR R3 R0 K6 - 0x4C100000, // 000F LDNIL R4 - 0x200C0604, // 0010 NE R3 R3 R4 - 0x780E0004, // 0011 JMPF R3 #0017 - 0x8C0C0303, // 0012 GETMET R3 R1 K3 - 0x58140007, // 0013 LDCONST R5 K7 - 0x88180106, // 0014 GETMBR R6 R0 K6 - 0x7C0C0600, // 0015 CALL R3 3 - 0x70020000, // 0016 JMP #0018 - 0x580C0008, // 0017 LDCONST R3 K8 - 0x00080403, // 0018 ADD R2 R2 R3 - 0x880C0109, // 0019 GETMBR R3 R0 K9 - 0x4C100000, // 001A LDNIL R4 - 0x200C0604, // 001B NE R3 R3 R4 - 0x780E0004, // 001C JMPF R3 #0022 - 0x8C0C0303, // 001D GETMET R3 R1 K3 - 0x5814000A, // 001E LDCONST R5 K10 - 0x88180109, // 001F GETMBR R6 R0 K9 - 0x7C0C0600, // 0020 CALL R3 3 - 0x70020000, // 0021 JMP #0023 - 0x580C0001, // 0022 LDCONST R3 K1 - 0x00080403, // 0023 ADD R2 R2 R3 - 0x880C010B, // 0024 GETMBR R3 R0 K11 - 0x4C100000, // 0025 LDNIL R4 - 0x200C0604, // 0026 NE R3 R3 R4 - 0x780E0004, // 0027 JMPF R3 #002D - 0x8C0C0303, // 0028 GETMET R3 R1 K3 - 0x5814000A, // 0029 LDCONST R5 K10 - 0x8818010B, // 002A GETMBR R6 R0 K11 - 0x7C0C0600, // 002B CALL R3 3 - 0x70020000, // 002C JMP #002E - 0x580C0001, // 002D LDCONST R3 K1 - 0x00080403, // 002E ADD R2 R2 R3 - 0x880C0109, // 002F GETMBR R3 R0 K9 - 0x4C100000, // 0030 LDNIL R4 - 0x1C0C0604, // 0031 EQ R3 R3 R4 - 0x780E0004, // 0032 JMPF R3 #0038 - 0x880C010B, // 0033 GETMBR R3 R0 K11 - 0x4C100000, // 0034 LDNIL R4 - 0x1C0C0604, // 0035 EQ R3 R3 R4 - 0x780E0000, // 0036 JMPF R3 #0038 - 0x0008050C, // 0037 ADD R2 R2 K12 - 0xA8040001, // 0038 EXBLK 1 1 - 0x80040400, // 0039 RET 1 R2 - 0xA8040001, // 003A EXBLK 1 1 - 0x7002000D, // 003B JMP #004A - 0xAC040002, // 003C CATCH R1 0 2 - 0x7002000A, // 003D JMP #0049 - 0x600C0008, // 003E GETGBL R3 G8 - 0x5C100200, // 003F MOVE R4 R1 - 0x7C0C0200, // 0040 CALL R3 1 - 0x000E1A03, // 0041 ADD R3 K13 R3 - 0x000C070E, // 0042 ADD R3 R3 K14 - 0x60100008, // 0043 GETGBL R4 G8 - 0x5C140400, // 0044 MOVE R5 R2 - 0x7C100200, // 0045 CALL R4 1 - 0x000C0604, // 0046 ADD R3 R3 R4 - 0x80040600, // 0047 RET 1 R3 - 0x70020000, // 0048 JMP #004A - 0xB0080000, // 0049 RAISE 2 R0 R0 - 0x80000000, // 004A RET 0 + ( &(const binstruction[74]) { /* code */ + 0xA8020039, // 0000 EXBLK 0 #003B + 0x58040000, // 0001 LDCONST R1 K0 + 0x88080101, // 0002 GETMBR R2 R0 K1 + 0x4C0C0000, // 0003 LDNIL R3 + 0x20080403, // 0004 NE R2 R2 R3 + 0x780A0004, // 0005 JMPF R2 #000B + 0x60080018, // 0006 GETGBL R2 G24 + 0x580C0002, // 0007 LDCONST R3 K2 + 0x88100101, // 0008 GETMBR R4 R0 K1 + 0x7C080400, // 0009 CALL R2 2 + 0x70020000, // 000A JMP #000C + 0x58080003, // 000B LDCONST R2 K3 + 0x00040202, // 000C ADD R1 R1 R2 + 0x88080104, // 000D GETMBR R2 R0 K4 + 0x4C0C0000, // 000E LDNIL R3 + 0x20080403, // 000F NE R2 R2 R3 + 0x780A0004, // 0010 JMPF R2 #0016 + 0x60080018, // 0011 GETGBL R2 G24 + 0x580C0005, // 0012 LDCONST R3 K5 + 0x88100104, // 0013 GETMBR R4 R0 K4 + 0x7C080400, // 0014 CALL R2 2 + 0x70020000, // 0015 JMP #0017 + 0x58080006, // 0016 LDCONST R2 K6 + 0x00040202, // 0017 ADD R1 R1 R2 + 0x88080107, // 0018 GETMBR R2 R0 K7 + 0x4C0C0000, // 0019 LDNIL R3 + 0x20080403, // 001A NE R2 R2 R3 + 0x780A0004, // 001B JMPF R2 #0021 + 0x60080018, // 001C GETGBL R2 G24 + 0x580C0008, // 001D LDCONST R3 K8 + 0x88100107, // 001E GETMBR R4 R0 K7 + 0x7C080400, // 001F CALL R2 2 + 0x70020000, // 0020 JMP #0022 + 0x58080000, // 0021 LDCONST R2 K0 + 0x00040202, // 0022 ADD R1 R1 R2 + 0x88080109, // 0023 GETMBR R2 R0 K9 + 0x4C0C0000, // 0024 LDNIL R3 + 0x20080403, // 0025 NE R2 R2 R3 + 0x780A0004, // 0026 JMPF R2 #002C + 0x60080018, // 0027 GETGBL R2 G24 + 0x580C0008, // 0028 LDCONST R3 K8 + 0x88100109, // 0029 GETMBR R4 R0 K9 + 0x7C080400, // 002A CALL R2 2 + 0x70020000, // 002B JMP #002D + 0x58080000, // 002C LDCONST R2 K0 + 0x00040202, // 002D ADD R1 R1 R2 + 0x88080107, // 002E GETMBR R2 R0 K7 + 0x4C0C0000, // 002F LDNIL R3 + 0x1C080403, // 0030 EQ R2 R2 R3 + 0x780A0004, // 0031 JMPF R2 #0037 + 0x88080109, // 0032 GETMBR R2 R0 K9 + 0x4C0C0000, // 0033 LDNIL R3 + 0x1C080403, // 0034 EQ R2 R2 R3 + 0x780A0000, // 0035 JMPF R2 #0037 + 0x0004030A, // 0036 ADD R1 R1 K10 + 0xA8040001, // 0037 EXBLK 1 1 + 0x80040200, // 0038 RET 1 R1 + 0xA8040001, // 0039 EXBLK 1 1 + 0x7002000D, // 003A JMP #0049 + 0xAC040002, // 003B CATCH R1 0 2 + 0x7002000A, // 003C JMP #0048 + 0x600C0008, // 003D GETGBL R3 G8 + 0x5C100200, // 003E MOVE R4 R1 + 0x7C0C0200, // 003F CALL R3 1 + 0x000E1603, // 0040 ADD R3 K11 R3 + 0x000C070C, // 0041 ADD R3 R3 K12 + 0x60100008, // 0042 GETGBL R4 G8 + 0x5C140400, // 0043 MOVE R5 R2 + 0x7C100200, // 0044 CALL R4 1 + 0x000C0604, // 0045 ADD R3 R3 R4 + 0x80040600, // 0046 RET 1 R3 + 0x70020000, // 0047 JMP #0049 + 0xB0080000, // 0048 RAISE 2 R0 R0 + 0x80000000, // 0049 RET 0 }) ) ); diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Aggregator.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Aggregator.h index 40d603f9b..79fc33df1 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Aggregator.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Aggregator.h @@ -11,7 +11,7 @@ extern const bclass be_class_Matter_Plugin_Aggregator; ********************************************************************/ be_local_closure(Matter_Plugin_Aggregator_read_attribute, /* name */ be_nested_proto( - 16, /* nstack */ + 15, /* nstack */ 3, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -19,78 +19,76 @@ be_local_closure(Matter_Plugin_Aggregator_read_attribute, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[13]) { /* constants */ - /* K0 */ be_nested_str_weak(string), - /* K1 */ be_nested_str_weak(matter), - /* K2 */ be_nested_str_weak(TLV), - /* K3 */ be_nested_str_weak(cluster), - /* K4 */ be_nested_str_weak(attribute), - /* K5 */ be_const_int(3), - /* K6 */ be_nested_str_weak(Matter_TLV_array), - /* K7 */ be_nested_str_weak(device), - /* K8 */ be_nested_str_weak(get_active_endpoints), - /* K9 */ be_nested_str_weak(add_TLV), - /* K10 */ be_nested_str_weak(U2), - /* K11 */ be_nested_str_weak(stop_iteration), - /* K12 */ be_nested_str_weak(read_attribute), + ( &(const bvalue[12]) { /* constants */ + /* K0 */ be_nested_str_weak(matter), + /* K1 */ be_nested_str_weak(TLV), + /* K2 */ be_nested_str_weak(cluster), + /* K3 */ be_nested_str_weak(attribute), + /* K4 */ be_const_int(3), + /* K5 */ be_nested_str_weak(Matter_TLV_array), + /* K6 */ be_nested_str_weak(device), + /* K7 */ be_nested_str_weak(get_active_endpoints), + /* K8 */ be_nested_str_weak(add_TLV), + /* K9 */ be_nested_str_weak(U2), + /* K10 */ be_nested_str_weak(stop_iteration), + /* K11 */ be_nested_str_weak(read_attribute), }), be_str_weak(read_attribute), &be_const_str_solidified, - ( &(const binstruction[54]) { /* code */ - 0xA40E0000, // 0000 IMPORT R3 K0 - 0xB8120200, // 0001 GETNGBL R4 K1 - 0x88100902, // 0002 GETMBR R4 R4 K2 + ( &(const binstruction[53]) { /* code */ + 0xB80E0000, // 0000 GETNGBL R3 K0 + 0x880C0701, // 0001 GETMBR R3 R3 K1 + 0x88100502, // 0002 GETMBR R4 R2 K2 0x88140503, // 0003 GETMBR R5 R2 K3 - 0x88180504, // 0004 GETMBR R6 R2 K4 - 0x541E001C, // 0005 LDINT R7 29 - 0x1C1C0A07, // 0006 EQ R7 R5 R7 - 0x781E0024, // 0007 JMPF R7 #002D - 0x1C1C0D05, // 0008 EQ R7 R6 K5 - 0x781E0019, // 0009 JMPF R7 #0024 - 0x8C1C0906, // 000A GETMET R7 R4 K6 - 0x7C1C0200, // 000B CALL R7 1 - 0x88200107, // 000C GETMBR R8 R0 K7 - 0x8C201108, // 000D GETMET R8 R8 K8 - 0x50280200, // 000E LDBOOL R10 1 0 - 0x7C200400, // 000F CALL R8 2 - 0x60240010, // 0010 GETGBL R9 G16 - 0x5C281000, // 0011 MOVE R10 R8 - 0x7C240200, // 0012 CALL R9 1 - 0xA802000A, // 0013 EXBLK 0 #001F - 0x5C281200, // 0014 MOVE R10 R9 - 0x7C280000, // 0015 CALL R10 0 - 0x542EFEFF, // 0016 LDINT R11 65280 - 0x142C140B, // 0017 LT R11 R10 R11 - 0x782E0004, // 0018 JMPF R11 #001E - 0x8C2C0F09, // 0019 GETMET R11 R7 K9 - 0x4C340000, // 001A LDNIL R13 - 0x8838090A, // 001B GETMBR R14 R4 K10 - 0x5C3C1400, // 001C MOVE R15 R10 - 0x7C2C0800, // 001D CALL R11 4 - 0x7001FFF4, // 001E JMP #0014 - 0x5824000B, // 001F LDCONST R9 K11 - 0xAC240200, // 0020 CATCH R9 1 0 - 0xB0080000, // 0021 RAISE 2 R0 R0 - 0x80040E00, // 0022 RET 1 R7 - 0x70020007, // 0023 JMP #002C - 0x601C0003, // 0024 GETGBL R7 G3 - 0x5C200000, // 0025 MOVE R8 R0 - 0x7C1C0200, // 0026 CALL R7 1 - 0x8C1C0F0C, // 0027 GETMET R7 R7 K12 - 0x5C240200, // 0028 MOVE R9 R1 - 0x5C280400, // 0029 MOVE R10 R2 - 0x7C1C0600, // 002A CALL R7 3 - 0x80040E00, // 002B RET 1 R7 - 0x70020007, // 002C JMP #0035 - 0x601C0003, // 002D GETGBL R7 G3 - 0x5C200000, // 002E MOVE R8 R0 - 0x7C1C0200, // 002F CALL R7 1 - 0x8C1C0F0C, // 0030 GETMET R7 R7 K12 - 0x5C240200, // 0031 MOVE R9 R1 - 0x5C280400, // 0032 MOVE R10 R2 - 0x7C1C0600, // 0033 CALL R7 3 - 0x80040E00, // 0034 RET 1 R7 - 0x80000000, // 0035 RET 0 + 0x541A001C, // 0004 LDINT R6 29 + 0x1C180806, // 0005 EQ R6 R4 R6 + 0x781A0024, // 0006 JMPF R6 #002C + 0x1C180B04, // 0007 EQ R6 R5 K4 + 0x781A0019, // 0008 JMPF R6 #0023 + 0x8C180705, // 0009 GETMET R6 R3 K5 + 0x7C180200, // 000A CALL R6 1 + 0x881C0106, // 000B GETMBR R7 R0 K6 + 0x8C1C0F07, // 000C GETMET R7 R7 K7 + 0x50240200, // 000D LDBOOL R9 1 0 + 0x7C1C0400, // 000E CALL R7 2 + 0x60200010, // 000F GETGBL R8 G16 + 0x5C240E00, // 0010 MOVE R9 R7 + 0x7C200200, // 0011 CALL R8 1 + 0xA802000A, // 0012 EXBLK 0 #001E + 0x5C241000, // 0013 MOVE R9 R8 + 0x7C240000, // 0014 CALL R9 0 + 0x542AFEFF, // 0015 LDINT R10 65280 + 0x1428120A, // 0016 LT R10 R9 R10 + 0x782A0004, // 0017 JMPF R10 #001D + 0x8C280D08, // 0018 GETMET R10 R6 K8 + 0x4C300000, // 0019 LDNIL R12 + 0x88340709, // 001A GETMBR R13 R3 K9 + 0x5C381200, // 001B MOVE R14 R9 + 0x7C280800, // 001C CALL R10 4 + 0x7001FFF4, // 001D JMP #0013 + 0x5820000A, // 001E LDCONST R8 K10 + 0xAC200200, // 001F CATCH R8 1 0 + 0xB0080000, // 0020 RAISE 2 R0 R0 + 0x80040C00, // 0021 RET 1 R6 + 0x70020007, // 0022 JMP #002B + 0x60180003, // 0023 GETGBL R6 G3 + 0x5C1C0000, // 0024 MOVE R7 R0 + 0x7C180200, // 0025 CALL R6 1 + 0x8C180D0B, // 0026 GETMET R6 R6 K11 + 0x5C200200, // 0027 MOVE R8 R1 + 0x5C240400, // 0028 MOVE R9 R2 + 0x7C180600, // 0029 CALL R6 3 + 0x80040C00, // 002A RET 1 R6 + 0x70020007, // 002B JMP #0034 + 0x60180003, // 002C GETGBL R6 G3 + 0x5C1C0000, // 002D MOVE R7 R0 + 0x7C180200, // 002E CALL R6 1 + 0x8C180D0B, // 002F GETMET R6 R6 K11 + 0x5C200200, // 0030 MOVE R8 R1 + 0x5C240400, // 0031 MOVE R9 R2 + 0x7C180600, // 0032 CALL R6 3 + 0x80040C00, // 0033 RET 1 R6 + 0x80000000, // 0034 RET 0 }) ) ); diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_HTTP.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_HTTP.h index ecdabf1c1..0d86bf090 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_HTTP.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_HTTP.h @@ -231,7 +231,7 @@ extern const bclass be_class_Matter_Plugin_Bridge_HTTP; ********************************************************************/ be_local_closure(Matter_Plugin_Bridge_HTTP_init, /* name */ be_nested_proto( - 10, /* nstack */ + 9, /* nstack */ 4, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -239,41 +239,39 @@ be_local_closure(Matter_Plugin_Bridge_HTTP_init, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[ 9]) { /* constants */ - /* K0 */ be_nested_str_weak(string), - /* K1 */ be_nested_str_weak(init), - /* K2 */ be_nested_str_weak(find), - /* K3 */ be_nested_str_weak(ARG_HTTP), - /* K4 */ be_nested_str_weak(http_remote), - /* K5 */ be_nested_str_weak(device), - /* K6 */ be_nested_str_weak(register_http_remote), - /* K7 */ be_nested_str_weak(PROBE_TIMEOUT), - /* K8 */ be_nested_str_weak(register_cmd_cb), + ( &(const bvalue[ 8]) { /* constants */ + /* K0 */ be_nested_str_weak(init), + /* K1 */ be_nested_str_weak(find), + /* K2 */ be_nested_str_weak(ARG_HTTP), + /* K3 */ be_nested_str_weak(http_remote), + /* K4 */ be_nested_str_weak(device), + /* K5 */ be_nested_str_weak(register_http_remote), + /* K6 */ be_nested_str_weak(PROBE_TIMEOUT), + /* K7 */ be_nested_str_weak(register_cmd_cb), }), be_str_weak(init), &be_const_str_solidified, - ( &(const binstruction[21]) { /* code */ - 0xA4120000, // 0000 IMPORT R4 K0 - 0x60140003, // 0001 GETGBL R5 G3 - 0x5C180000, // 0002 MOVE R6 R0 - 0x7C140200, // 0003 CALL R5 1 - 0x8C140B01, // 0004 GETMET R5 R5 K1 - 0x5C1C0200, // 0005 MOVE R7 R1 - 0x5C200400, // 0006 MOVE R8 R2 - 0x5C240600, // 0007 MOVE R9 R3 - 0x7C140800, // 0008 CALL R5 4 - 0x8C140702, // 0009 GETMET R5 R3 K2 - 0x881C0103, // 000A GETMBR R7 R0 K3 - 0x7C140400, // 000B CALL R5 2 - 0x88180105, // 000C GETMBR R6 R0 K5 - 0x8C180D06, // 000D GETMET R6 R6 K6 - 0x5C200A00, // 000E MOVE R8 R5 - 0x88240107, // 000F GETMBR R9 R0 K7 - 0x7C180600, // 0010 CALL R6 3 - 0x90020806, // 0011 SETMBR R0 K4 R6 - 0x8C180108, // 0012 GETMET R6 R0 K8 - 0x7C180200, // 0013 CALL R6 1 - 0x80000000, // 0014 RET 0 + ( &(const binstruction[20]) { /* code */ + 0x60100003, // 0000 GETGBL R4 G3 + 0x5C140000, // 0001 MOVE R5 R0 + 0x7C100200, // 0002 CALL R4 1 + 0x8C100900, // 0003 GETMET R4 R4 K0 + 0x5C180200, // 0004 MOVE R6 R1 + 0x5C1C0400, // 0005 MOVE R7 R2 + 0x5C200600, // 0006 MOVE R8 R3 + 0x7C100800, // 0007 CALL R4 4 + 0x8C100701, // 0008 GETMET R4 R3 K1 + 0x88180102, // 0009 GETMBR R6 R0 K2 + 0x7C100400, // 000A CALL R4 2 + 0x88140104, // 000B GETMBR R5 R0 K4 + 0x8C140B05, // 000C GETMET R5 R5 K5 + 0x5C1C0800, // 000D MOVE R7 R4 + 0x88200106, // 000E GETMBR R8 R0 K6 + 0x7C140600, // 000F CALL R5 3 + 0x90020605, // 0010 SETMBR R0 K3 R5 + 0x8C140107, // 0011 GETMET R5 R0 K7 + 0x7C140200, // 0012 CALL R5 1 + 0x80000000, // 0013 RET 0 }) ) ); @@ -352,7 +350,7 @@ be_local_closure(Matter_Plugin_Bridge_HTTP_web_value_onoff, /* name */ ********************************************************************/ be_local_closure(Matter_Plugin_Bridge_HTTP_call_remote_sync, /* name */ be_nested_proto( - 11, /* nstack */ + 10, /* nstack */ 3, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -360,69 +358,67 @@ be_local_closure(Matter_Plugin_Bridge_HTTP_call_remote_sync, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[15]) { /* constants */ - /* K0 */ be_nested_str_weak(string), - /* K1 */ be_nested_str_weak(json), - /* K2 */ be_const_int(2), - /* K3 */ be_nested_str_weak(_X20), - /* K4 */ be_const_int(0), - /* K5 */ be_nested_str_weak(http_remote), - /* K6 */ be_nested_str_weak(call_sync), - /* K7 */ be_nested_str_weak(SYNC_TIMEOUT), - /* K8 */ be_nested_str_weak(device_is_alive), - /* K9 */ be_nested_str_weak(load), - /* K10 */ be_const_int(1), - /* K11 */ be_nested_str_weak(tasmota), - /* K12 */ be_nested_str_weak(log), - /* K13 */ be_nested_str_weak(MTR_X3A_X20HTTP_X20GET_X20retrying), - /* K14 */ be_const_int(3), + ( &(const bvalue[14]) { /* constants */ + /* K0 */ be_nested_str_weak(json), + /* K1 */ be_const_int(2), + /* K2 */ be_nested_str_weak(_X20), + /* K3 */ be_const_int(0), + /* K4 */ be_nested_str_weak(http_remote), + /* K5 */ be_nested_str_weak(call_sync), + /* K6 */ be_nested_str_weak(SYNC_TIMEOUT), + /* K7 */ be_nested_str_weak(device_is_alive), + /* K8 */ be_nested_str_weak(load), + /* K9 */ be_const_int(1), + /* K10 */ be_nested_str_weak(tasmota), + /* K11 */ be_nested_str_weak(log), + /* K12 */ be_nested_str_weak(MTR_X3A_X20HTTP_X20GET_X20retrying), + /* K13 */ be_const_int(3), }), be_str_weak(call_remote_sync), &be_const_str_solidified, - ( &(const binstruction[43]) { /* code */ + ( &(const binstruction[42]) { /* code */ 0xA40E0000, // 0000 IMPORT R3 K0 - 0xA4120200, // 0001 IMPORT R4 K1 - 0x58140002, // 0002 LDCONST R5 K2 - 0x4C180000, // 0003 LDNIL R6 - 0x20180406, // 0004 NE R6 R2 R6 - 0x781A0005, // 0005 JMPF R6 #000C - 0x00180303, // 0006 ADD R6 R1 K3 - 0x601C0008, // 0007 GETGBL R7 G8 - 0x5C200400, // 0008 MOVE R8 R2 - 0x7C1C0200, // 0009 CALL R7 1 - 0x00180C07, // 000A ADD R6 R6 R7 - 0x5C040C00, // 000B MOVE R1 R6 - 0x24180B04, // 000C GT R6 R5 K4 - 0x781A0016, // 000D JMPF R6 #0025 - 0x88180105, // 000E GETMBR R6 R0 K5 - 0x8C180D06, // 000F GETMET R6 R6 K6 - 0x5C200200, // 0010 MOVE R8 R1 - 0x88240107, // 0011 GETMBR R9 R0 K7 - 0x7C180600, // 0012 CALL R6 3 - 0x4C1C0000, // 0013 LDNIL R7 - 0x201C0C07, // 0014 NE R7 R6 R7 - 0x781E0007, // 0015 JMPF R7 #001E - 0x881C0105, // 0016 GETMBR R7 R0 K5 - 0x8C1C0F08, // 0017 GETMET R7 R7 K8 - 0x50240200, // 0018 LDBOOL R9 1 0 - 0x7C1C0400, // 0019 CALL R7 2 - 0x8C1C0909, // 001A GETMET R7 R4 K9 - 0x5C240C00, // 001B MOVE R9 R6 - 0x7C1C0400, // 001C CALL R7 2 - 0x80040E00, // 001D RET 1 R7 - 0x04140B0A, // 001E SUB R5 R5 K10 - 0xB81E1600, // 001F GETNGBL R7 K11 - 0x8C1C0F0C, // 0020 GETMET R7 R7 K12 + 0x58100001, // 0001 LDCONST R4 K1 + 0x4C140000, // 0002 LDNIL R5 + 0x20140405, // 0003 NE R5 R2 R5 + 0x78160005, // 0004 JMPF R5 #000B + 0x00140302, // 0005 ADD R5 R1 K2 + 0x60180008, // 0006 GETGBL R6 G8 + 0x5C1C0400, // 0007 MOVE R7 R2 + 0x7C180200, // 0008 CALL R6 1 + 0x00140A06, // 0009 ADD R5 R5 R6 + 0x5C040A00, // 000A MOVE R1 R5 + 0x24140903, // 000B GT R5 R4 K3 + 0x78160016, // 000C JMPF R5 #0024 + 0x88140104, // 000D GETMBR R5 R0 K4 + 0x8C140B05, // 000E GETMET R5 R5 K5 + 0x5C1C0200, // 000F MOVE R7 R1 + 0x88200106, // 0010 GETMBR R8 R0 K6 + 0x7C140600, // 0011 CALL R5 3 + 0x4C180000, // 0012 LDNIL R6 + 0x20180A06, // 0013 NE R6 R5 R6 + 0x781A0007, // 0014 JMPF R6 #001D + 0x88180104, // 0015 GETMBR R6 R0 K4 + 0x8C180D07, // 0016 GETMET R6 R6 K7 + 0x50200200, // 0017 LDBOOL R8 1 0 + 0x7C180400, // 0018 CALL R6 2 + 0x8C180708, // 0019 GETMET R6 R3 K8 + 0x5C200A00, // 001A MOVE R8 R5 + 0x7C180400, // 001B CALL R6 2 + 0x80040C00, // 001C RET 1 R6 + 0x04100909, // 001D SUB R4 R4 K9 + 0xB81A1400, // 001E GETNGBL R6 K10 + 0x8C180D0B, // 001F GETMET R6 R6 K11 + 0x5820000C, // 0020 LDCONST R8 K12 0x5824000D, // 0021 LDCONST R9 K13 - 0x5828000E, // 0022 LDCONST R10 K14 - 0x7C1C0600, // 0023 CALL R7 3 - 0x7001FFE6, // 0024 JMP #000C - 0x88180105, // 0025 GETMBR R6 R0 K5 - 0x8C180D08, // 0026 GETMET R6 R6 K8 - 0x50200000, // 0027 LDBOOL R8 0 0 - 0x7C180400, // 0028 CALL R6 2 - 0x4C180000, // 0029 LDNIL R6 - 0x80040C00, // 002A RET 1 R6 + 0x7C180600, // 0022 CALL R6 3 + 0x7001FFE6, // 0023 JMP #000B + 0x88140104, // 0024 GETMBR R5 R0 K4 + 0x8C140B07, // 0025 GETMET R5 R5 K7 + 0x501C0000, // 0026 LDBOOL R7 0 0 + 0x7C140400, // 0027 CALL R5 2 + 0x4C140000, // 0028 LDNIL R5 + 0x80040A00, // 0029 RET 1 R5 }) ) ); @@ -526,7 +522,7 @@ be_local_closure(Matter_Plugin_Bridge_HTTP_parse_update, /* name */ ********************************************************************/ be_local_closure(Matter_Plugin_Bridge_HTTP_web_values_prefix, /* name */ be_nested_proto( - 12, /* nstack */ + 10, /* nstack */ 1, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -534,35 +530,32 @@ be_local_closure(Matter_Plugin_Bridge_HTTP_web_values_prefix, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[ 8]) { /* constants */ + ( &(const bvalue[ 6]) { /* constants */ /* K0 */ be_nested_str_weak(webserver), - /* K1 */ be_nested_str_weak(string), - /* K2 */ be_nested_str_weak(get_name), - /* K3 */ be_nested_str_weak(content_send), - /* K4 */ be_nested_str_weak(format), - /* K5 */ be_nested_str_weak(PREFIX), - /* K6 */ be_nested_str_weak(html_escape), - /* K7 */ be_nested_str_weak(), + /* K1 */ be_nested_str_weak(get_name), + /* K2 */ be_nested_str_weak(content_send), + /* K3 */ be_nested_str_weak(PREFIX), + /* K4 */ be_nested_str_weak(html_escape), + /* K5 */ be_nested_str_weak(), }), be_str_weak(web_values_prefix), &be_const_str_solidified, - ( &(const binstruction[16]) { /* code */ + ( &(const binstruction[15]) { /* code */ 0xA4060000, // 0000 IMPORT R1 K0 - 0xA40A0200, // 0001 IMPORT R2 K1 - 0x8C0C0102, // 0002 GETMET R3 R0 K2 - 0x7C0C0200, // 0003 CALL R3 1 - 0x8C100303, // 0004 GETMET R4 R1 K3 - 0x8C180504, // 0005 GETMET R6 R2 K4 - 0x88200105, // 0006 GETMBR R8 R0 K5 - 0x780E0003, // 0007 JMPF R3 #000C - 0x8C240306, // 0008 GETMET R9 R1 K6 - 0x5C2C0600, // 0009 MOVE R11 R3 - 0x7C240400, // 000A CALL R9 2 - 0x70020000, // 000B JMP #000D - 0x58240007, // 000C LDCONST R9 K7 - 0x7C180600, // 000D CALL R6 3 - 0x7C100400, // 000E CALL R4 2 - 0x80000000, // 000F RET 0 + 0x8C080101, // 0001 GETMET R2 R0 K1 + 0x7C080200, // 0002 CALL R2 1 + 0x8C0C0302, // 0003 GETMET R3 R1 K2 + 0x60140018, // 0004 GETGBL R5 G24 + 0x88180103, // 0005 GETMBR R6 R0 K3 + 0x780A0003, // 0006 JMPF R2 #000B + 0x8C1C0304, // 0007 GETMET R7 R1 K4 + 0x5C240400, // 0008 MOVE R9 R2 + 0x7C1C0400, // 0009 CALL R7 2 + 0x70020000, // 000A JMP #000C + 0x581C0005, // 000B LDCONST R7 K5 + 0x7C140400, // 000C CALL R5 2 + 0x7C0C0400, // 000D CALL R3 2 + 0x80000000, // 000E RET 0 }) ) ); @@ -642,7 +635,7 @@ be_local_closure(Matter_Plugin_Bridge_HTTP_read_attribute, /* name */ ********************************************************************/ be_local_closure(Matter_Plugin_Bridge_HTTP_web_values, /* name */ be_nested_proto( - 6, /* nstack */ + 5, /* nstack */ 1, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -650,28 +643,26 @@ be_local_closure(Matter_Plugin_Bridge_HTTP_web_values, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[ 7]) { /* constants */ + ( &(const bvalue[ 6]) { /* constants */ /* K0 */ be_nested_str_weak(webserver), - /* K1 */ be_nested_str_weak(string), - /* K2 */ be_nested_str_weak(web_values_prefix), - /* K3 */ be_nested_str_weak(content_send), - /* K4 */ be_nested_str_weak(_X26lt_X3B_X2D_X2D_X20_X28), - /* K5 */ be_nested_str_weak(NAME), - /* K6 */ be_nested_str_weak(_X29_X20_X2D_X2D_X26gt_X3B), + /* K1 */ be_nested_str_weak(web_values_prefix), + /* K2 */ be_nested_str_weak(content_send), + /* K3 */ be_nested_str_weak(_X26lt_X3B_X2D_X2D_X20_X28), + /* K4 */ be_nested_str_weak(NAME), + /* K5 */ be_nested_str_weak(_X29_X20_X2D_X2D_X26gt_X3B), }), be_str_weak(web_values), &be_const_str_solidified, - ( &(const binstruction[10]) { /* code */ + ( &(const binstruction[ 9]) { /* code */ 0xA4060000, // 0000 IMPORT R1 K0 - 0xA40A0200, // 0001 IMPORT R2 K1 - 0x8C0C0102, // 0002 GETMET R3 R0 K2 - 0x7C0C0200, // 0003 CALL R3 1 - 0x8C0C0303, // 0004 GETMET R3 R1 K3 - 0x88140105, // 0005 GETMBR R5 R0 K5 - 0x00160805, // 0006 ADD R5 K4 R5 - 0x00140B06, // 0007 ADD R5 R5 K6 - 0x7C0C0400, // 0008 CALL R3 2 - 0x80000000, // 0009 RET 0 + 0x8C080101, // 0001 GETMET R2 R0 K1 + 0x7C080200, // 0002 CALL R2 1 + 0x8C080302, // 0003 GETMET R2 R1 K2 + 0x88100104, // 0004 GETMBR R4 R0 K4 + 0x00120604, // 0005 ADD R4 K3 R4 + 0x00100905, // 0006 ADD R4 R4 K5 + 0x7C080400, // 0007 CALL R2 2 + 0x80000000, // 0008 RET 0 }) ) ); diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Light0.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Light0.h index 7b4bdd29a..c27611d23 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Light0.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Light0.h @@ -139,7 +139,7 @@ be_local_closure(Matter_Plugin_Bridge_Light0_init, /* name */ ********************************************************************/ be_local_closure(Matter_Plugin_Bridge_Light0_read_attribute, /* name */ be_nested_proto( - 11, /* nstack */ + 10, /* nstack */ 3, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -147,68 +147,66 @@ be_local_closure(Matter_Plugin_Bridge_Light0_read_attribute, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[12]) { /* constants */ - /* K0 */ be_nested_str_weak(string), - /* K1 */ be_nested_str_weak(matter), - /* K2 */ be_nested_str_weak(TLV), - /* K3 */ be_nested_str_weak(cluster), - /* K4 */ be_nested_str_weak(attribute), - /* K5 */ be_nested_str_weak(update_shadow_lazy), - /* K6 */ be_const_int(0), - /* K7 */ be_nested_str_weak(create_TLV), - /* K8 */ be_nested_str_weak(BOOL), - /* K9 */ be_nested_str_weak(shadow_onoff), - /* K10 */ be_nested_str_weak(U4), - /* K11 */ be_nested_str_weak(read_attribute), + ( &(const bvalue[11]) { /* constants */ + /* K0 */ be_nested_str_weak(matter), + /* K1 */ be_nested_str_weak(TLV), + /* K2 */ be_nested_str_weak(cluster), + /* K3 */ be_nested_str_weak(attribute), + /* K4 */ be_nested_str_weak(update_shadow_lazy), + /* K5 */ be_const_int(0), + /* K6 */ be_nested_str_weak(create_TLV), + /* K7 */ be_nested_str_weak(BOOL), + /* K8 */ be_nested_str_weak(shadow_onoff), + /* K9 */ be_nested_str_weak(U4), + /* K10 */ be_nested_str_weak(read_attribute), }), be_str_weak(read_attribute), &be_const_str_solidified, - ( &(const binstruction[45]) { /* code */ - 0xA40E0000, // 0000 IMPORT R3 K0 - 0xB8120200, // 0001 GETNGBL R4 K1 - 0x88100902, // 0002 GETMBR R4 R4 K2 + ( &(const binstruction[44]) { /* code */ + 0xB80E0000, // 0000 GETNGBL R3 K0 + 0x880C0701, // 0001 GETMBR R3 R3 K1 + 0x88100502, // 0002 GETMBR R4 R2 K2 0x88140503, // 0003 GETMBR R5 R2 K3 - 0x88180504, // 0004 GETMBR R6 R2 K4 - 0x541E0005, // 0005 LDINT R7 6 - 0x1C1C0A07, // 0006 EQ R7 R5 R7 - 0x781E001B, // 0007 JMPF R7 #0024 - 0x8C1C0105, // 0008 GETMET R7 R0 K5 - 0x7C1C0200, // 0009 CALL R7 1 - 0x1C1C0D06, // 000A EQ R7 R6 K6 - 0x781E0005, // 000B JMPF R7 #0012 - 0x8C1C0907, // 000C GETMET R7 R4 K7 - 0x88240908, // 000D GETMBR R9 R4 K8 - 0x88280109, // 000E GETMBR R10 R0 K9 - 0x7C1C0600, // 000F CALL R7 3 - 0x80040E00, // 0010 RET 1 R7 - 0x70020010, // 0011 JMP #0023 - 0x541EFFFB, // 0012 LDINT R7 65532 - 0x1C1C0C07, // 0013 EQ R7 R6 R7 - 0x781E0005, // 0014 JMPF R7 #001B - 0x8C1C0907, // 0015 GETMET R7 R4 K7 - 0x8824090A, // 0016 GETMBR R9 R4 K10 - 0x58280006, // 0017 LDCONST R10 K6 - 0x7C1C0600, // 0018 CALL R7 3 - 0x80040E00, // 0019 RET 1 R7 - 0x70020007, // 001A JMP #0023 - 0x541EFFFC, // 001B LDINT R7 65533 - 0x1C1C0C07, // 001C EQ R7 R6 R7 - 0x781E0004, // 001D JMPF R7 #0023 - 0x8C1C0907, // 001E GETMET R7 R4 K7 - 0x8824090A, // 001F GETMBR R9 R4 K10 - 0x542A0003, // 0020 LDINT R10 4 - 0x7C1C0600, // 0021 CALL R7 3 - 0x80040E00, // 0022 RET 1 R7 - 0x70020007, // 0023 JMP #002C - 0x601C0003, // 0024 GETGBL R7 G3 - 0x5C200000, // 0025 MOVE R8 R0 - 0x7C1C0200, // 0026 CALL R7 1 - 0x8C1C0F0B, // 0027 GETMET R7 R7 K11 - 0x5C240200, // 0028 MOVE R9 R1 - 0x5C280400, // 0029 MOVE R10 R2 - 0x7C1C0600, // 002A CALL R7 3 - 0x80040E00, // 002B RET 1 R7 - 0x80000000, // 002C RET 0 + 0x541A0005, // 0004 LDINT R6 6 + 0x1C180806, // 0005 EQ R6 R4 R6 + 0x781A001B, // 0006 JMPF R6 #0023 + 0x8C180104, // 0007 GETMET R6 R0 K4 + 0x7C180200, // 0008 CALL R6 1 + 0x1C180B05, // 0009 EQ R6 R5 K5 + 0x781A0005, // 000A JMPF R6 #0011 + 0x8C180706, // 000B GETMET R6 R3 K6 + 0x88200707, // 000C GETMBR R8 R3 K7 + 0x88240108, // 000D GETMBR R9 R0 K8 + 0x7C180600, // 000E CALL R6 3 + 0x80040C00, // 000F RET 1 R6 + 0x70020010, // 0010 JMP #0022 + 0x541AFFFB, // 0011 LDINT R6 65532 + 0x1C180A06, // 0012 EQ R6 R5 R6 + 0x781A0005, // 0013 JMPF R6 #001A + 0x8C180706, // 0014 GETMET R6 R3 K6 + 0x88200709, // 0015 GETMBR R8 R3 K9 + 0x58240005, // 0016 LDCONST R9 K5 + 0x7C180600, // 0017 CALL R6 3 + 0x80040C00, // 0018 RET 1 R6 + 0x70020007, // 0019 JMP #0022 + 0x541AFFFC, // 001A LDINT R6 65533 + 0x1C180A06, // 001B EQ R6 R5 R6 + 0x781A0004, // 001C JMPF R6 #0022 + 0x8C180706, // 001D GETMET R6 R3 K6 + 0x88200709, // 001E GETMBR R8 R3 K9 + 0x54260003, // 001F LDINT R9 4 + 0x7C180600, // 0020 CALL R6 3 + 0x80040C00, // 0021 RET 1 R6 + 0x70020007, // 0022 JMP #002B + 0x60180003, // 0023 GETGBL R6 G3 + 0x5C1C0000, // 0024 MOVE R7 R0 + 0x7C180200, // 0025 CALL R6 1 + 0x8C180D0A, // 0026 GETMET R6 R6 K10 + 0x5C200200, // 0027 MOVE R8 R1 + 0x5C240400, // 0028 MOVE R9 R2 + 0x7C180600, // 0029 CALL R6 3 + 0x80040C00, // 002A RET 1 R6 + 0x80000000, // 002B RET 0 }) ) ); @@ -364,7 +362,7 @@ be_local_closure(Matter_Plugin_Bridge_Light0_invoke_request, /* name */ ********************************************************************/ be_local_closure(Matter_Plugin_Bridge_Light0_web_values, /* name */ be_nested_proto( - 11, /* nstack */ + 9, /* nstack */ 1, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -372,32 +370,29 @@ be_local_closure(Matter_Plugin_Bridge_Light0_web_values, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[ 8]) { /* constants */ + ( &(const bvalue[ 6]) { /* constants */ /* K0 */ be_nested_str_weak(webserver), - /* K1 */ be_nested_str_weak(string), - /* K2 */ be_nested_str_weak(web_values_prefix), - /* K3 */ be_nested_str_weak(content_send), - /* K4 */ be_nested_str_weak(format), - /* K5 */ be_nested_str_weak(_X25s), - /* K6 */ be_nested_str_weak(web_value_onoff), - /* K7 */ be_nested_str_weak(shadow_onoff), + /* K1 */ be_nested_str_weak(web_values_prefix), + /* K2 */ be_nested_str_weak(content_send), + /* K3 */ be_nested_str_weak(_X25s), + /* K4 */ be_nested_str_weak(web_value_onoff), + /* K5 */ be_nested_str_weak(shadow_onoff), }), be_str_weak(web_values), &be_const_str_solidified, - ( &(const binstruction[13]) { /* code */ + ( &(const binstruction[12]) { /* code */ 0xA4060000, // 0000 IMPORT R1 K0 - 0xA40A0200, // 0001 IMPORT R2 K1 - 0x8C0C0102, // 0002 GETMET R3 R0 K2 - 0x7C0C0200, // 0003 CALL R3 1 - 0x8C0C0303, // 0004 GETMET R3 R1 K3 - 0x8C140504, // 0005 GETMET R5 R2 K4 - 0x581C0005, // 0006 LDCONST R7 K5 - 0x8C200106, // 0007 GETMET R8 R0 K6 - 0x88280107, // 0008 GETMBR R10 R0 K7 - 0x7C200400, // 0009 CALL R8 2 - 0x7C140600, // 000A CALL R5 3 - 0x7C0C0400, // 000B CALL R3 2 - 0x80000000, // 000C RET 0 + 0x8C080101, // 0001 GETMET R2 R0 K1 + 0x7C080200, // 0002 CALL R2 1 + 0x8C080302, // 0003 GETMET R2 R1 K2 + 0x60100018, // 0004 GETGBL R4 G24 + 0x58140003, // 0005 LDCONST R5 K3 + 0x8C180104, // 0006 GETMET R6 R0 K4 + 0x88200105, // 0007 GETMBR R8 R0 K5 + 0x7C180400, // 0008 CALL R6 2 + 0x7C100400, // 0009 CALL R4 2 + 0x7C080400, // 000A CALL R2 2 + 0x80000000, // 000B RET 0 }) ) ); @@ -409,7 +404,7 @@ be_local_closure(Matter_Plugin_Bridge_Light0_web_values, /* name */ ********************************************************************/ be_local_closure(Matter_Plugin_Bridge_Light0_web_values_prefix, /* name */ be_nested_proto( - 12, /* nstack */ + 10, /* nstack */ 1, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -417,44 +412,41 @@ be_local_closure(Matter_Plugin_Bridge_Light0_web_values_prefix, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[10]) { /* constants */ + ( &(const bvalue[ 8]) { /* constants */ /* K0 */ be_nested_str_weak(webserver), - /* K1 */ be_nested_str_weak(string), - /* K2 */ be_nested_str_weak(get_name), - /* K3 */ be_nested_str_weak(Power), - /* K4 */ be_nested_str_weak(tasmota_relay_index), - /* K5 */ be_nested_str_weak(content_send), - /* K6 */ be_nested_str_weak(format), - /* K7 */ be_nested_str_weak(PREFIX), - /* K8 */ be_nested_str_weak(html_escape), - /* K9 */ be_nested_str_weak(), + /* K1 */ be_nested_str_weak(get_name), + /* K2 */ be_nested_str_weak(Power), + /* K3 */ be_nested_str_weak(tasmota_relay_index), + /* K4 */ be_nested_str_weak(content_send), + /* K5 */ be_nested_str_weak(PREFIX), + /* K6 */ be_nested_str_weak(html_escape), + /* K7 */ be_nested_str_weak(), }), be_str_weak(web_values_prefix), &be_const_str_solidified, - ( &(const binstruction[23]) { /* code */ + ( &(const binstruction[22]) { /* code */ 0xA4060000, // 0000 IMPORT R1 K0 - 0xA40A0200, // 0001 IMPORT R2 K1 - 0x8C0C0102, // 0002 GETMET R3 R0 K2 - 0x7C0C0200, // 0003 CALL R3 1 - 0x5C100600, // 0004 MOVE R4 R3 - 0x74120004, // 0005 JMPT R4 #000B - 0x60100008, // 0006 GETGBL R4 G8 - 0x88140104, // 0007 GETMBR R5 R0 K4 - 0x7C100200, // 0008 CALL R4 1 - 0x00120604, // 0009 ADD R4 K3 R4 - 0x5C0C0800, // 000A MOVE R3 R4 - 0x8C100305, // 000B GETMET R4 R1 K5 - 0x8C180506, // 000C GETMET R6 R2 K6 - 0x88200107, // 000D GETMBR R8 R0 K7 - 0x780E0003, // 000E JMPF R3 #0013 - 0x8C240308, // 000F GETMET R9 R1 K8 - 0x5C2C0600, // 0010 MOVE R11 R3 - 0x7C240400, // 0011 CALL R9 2 - 0x70020000, // 0012 JMP #0014 - 0x58240009, // 0013 LDCONST R9 K9 - 0x7C180600, // 0014 CALL R6 3 - 0x7C100400, // 0015 CALL R4 2 - 0x80000000, // 0016 RET 0 + 0x8C080101, // 0001 GETMET R2 R0 K1 + 0x7C080200, // 0002 CALL R2 1 + 0x5C0C0400, // 0003 MOVE R3 R2 + 0x740E0004, // 0004 JMPT R3 #000A + 0x600C0008, // 0005 GETGBL R3 G8 + 0x88100103, // 0006 GETMBR R4 R0 K3 + 0x7C0C0200, // 0007 CALL R3 1 + 0x000E0403, // 0008 ADD R3 K2 R3 + 0x5C080600, // 0009 MOVE R2 R3 + 0x8C0C0304, // 000A GETMET R3 R1 K4 + 0x60140018, // 000B GETGBL R5 G24 + 0x88180105, // 000C GETMBR R6 R0 K5 + 0x780A0003, // 000D JMPF R2 #0012 + 0x8C1C0306, // 000E GETMET R7 R1 K6 + 0x5C240400, // 000F MOVE R9 R2 + 0x7C1C0400, // 0010 CALL R7 2 + 0x70020000, // 0011 JMP #0013 + 0x581C0007, // 0012 LDCONST R7 K7 + 0x7C140400, // 0013 CALL R5 2 + 0x7C0C0400, // 0014 CALL R3 2 + 0x80000000, // 0015 RET 0 }) ) ); diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Light1.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Light1.h index 654603201..79242c156 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Light1.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Light1.h @@ -139,7 +139,7 @@ be_local_closure(Matter_Plugin_Bridge_Light1_invoke_request, /* name */ ********************************************************************/ be_local_closure(Matter_Plugin_Bridge_Light1_read_attribute, /* name */ be_nested_proto( - 11, /* nstack */ + 10, /* nstack */ 3, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -147,126 +147,124 @@ be_local_closure(Matter_Plugin_Bridge_Light1_read_attribute, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[16]) { /* constants */ - /* K0 */ be_nested_str_weak(string), - /* K1 */ be_nested_str_weak(matter), - /* K2 */ be_nested_str_weak(TLV), - /* K3 */ be_nested_str_weak(cluster), - /* K4 */ be_nested_str_weak(attribute), - /* K5 */ be_nested_str_weak(update_shadow_lazy), - /* K6 */ be_const_int(0), - /* K7 */ be_nested_str_weak(shadow_bri), - /* K8 */ be_nested_str_weak(create_TLV), - /* K9 */ be_nested_str_weak(U1), - /* K10 */ be_nested_str_weak(NULL), - /* K11 */ be_const_int(2), - /* K12 */ be_const_int(3), - /* K13 */ be_nested_str_weak(U4), - /* K14 */ be_const_int(1), - /* K15 */ be_nested_str_weak(read_attribute), + ( &(const bvalue[15]) { /* constants */ + /* K0 */ be_nested_str_weak(matter), + /* K1 */ be_nested_str_weak(TLV), + /* K2 */ be_nested_str_weak(cluster), + /* K3 */ be_nested_str_weak(attribute), + /* K4 */ be_nested_str_weak(update_shadow_lazy), + /* K5 */ be_const_int(0), + /* K6 */ be_nested_str_weak(shadow_bri), + /* K7 */ be_nested_str_weak(create_TLV), + /* K8 */ be_nested_str_weak(U1), + /* K9 */ be_nested_str_weak(NULL), + /* K10 */ be_const_int(2), + /* K11 */ be_const_int(3), + /* K12 */ be_nested_str_weak(U4), + /* K13 */ be_const_int(1), + /* K14 */ be_nested_str_weak(read_attribute), }), be_str_weak(read_attribute), &be_const_str_solidified, - ( &(const binstruction[99]) { /* code */ - 0xA40E0000, // 0000 IMPORT R3 K0 - 0xB8120200, // 0001 GETNGBL R4 K1 - 0x88100902, // 0002 GETMBR R4 R4 K2 + ( &(const binstruction[98]) { /* code */ + 0xB80E0000, // 0000 GETNGBL R3 K0 + 0x880C0701, // 0001 GETMBR R3 R3 K1 + 0x88100502, // 0002 GETMBR R4 R2 K2 0x88140503, // 0003 GETMBR R5 R2 K3 - 0x88180504, // 0004 GETMBR R6 R2 K4 - 0x541E0007, // 0005 LDINT R7 8 - 0x1C1C0A07, // 0006 EQ R7 R5 R7 - 0x781E0051, // 0007 JMPF R7 #005A - 0x8C1C0105, // 0008 GETMET R7 R0 K5 - 0x7C1C0200, // 0009 CALL R7 1 - 0x1C1C0D06, // 000A EQ R7 R6 K6 - 0x781E000F, // 000B JMPF R7 #001C - 0x881C0107, // 000C GETMBR R7 R0 K7 - 0x4C200000, // 000D LDNIL R8 - 0x201C0E08, // 000E NE R7 R7 R8 - 0x781E0005, // 000F JMPF R7 #0016 - 0x8C1C0908, // 0010 GETMET R7 R4 K8 - 0x88240909, // 0011 GETMBR R9 R4 K9 - 0x88280107, // 0012 GETMBR R10 R0 K7 - 0x7C1C0600, // 0013 CALL R7 3 - 0x80040E00, // 0014 RET 1 R7 - 0x70020004, // 0015 JMP #001B - 0x8C1C0908, // 0016 GETMET R7 R4 K8 - 0x8824090A, // 0017 GETMBR R9 R4 K10 - 0x4C280000, // 0018 LDNIL R10 - 0x7C1C0600, // 0019 CALL R7 3 - 0x80040E00, // 001A RET 1 R7 - 0x7002003C, // 001B JMP #0059 - 0x1C1C0D0B, // 001C EQ R7 R6 K11 - 0x781E0005, // 001D JMPF R7 #0024 - 0x8C1C0908, // 001E GETMET R7 R4 K8 - 0x88240909, // 001F GETMBR R9 R4 K9 - 0x58280006, // 0020 LDCONST R10 K6 - 0x7C1C0600, // 0021 CALL R7 3 - 0x80040E00, // 0022 RET 1 R7 - 0x70020034, // 0023 JMP #0059 - 0x1C1C0D0C, // 0024 EQ R7 R6 K12 - 0x781E0005, // 0025 JMPF R7 #002C - 0x8C1C0908, // 0026 GETMET R7 R4 K8 - 0x88240909, // 0027 GETMBR R9 R4 K9 - 0x542A00FD, // 0028 LDINT R10 254 - 0x7C1C0600, // 0029 CALL R7 3 - 0x80040E00, // 002A RET 1 R7 - 0x7002002C, // 002B JMP #0059 - 0x541E000E, // 002C LDINT R7 15 - 0x1C1C0C07, // 002D EQ R7 R6 R7 - 0x781E0005, // 002E JMPF R7 #0035 - 0x8C1C0908, // 002F GETMET R7 R4 K8 - 0x88240909, // 0030 GETMBR R9 R4 K9 - 0x58280006, // 0031 LDCONST R10 K6 - 0x7C1C0600, // 0032 CALL R7 3 - 0x80040E00, // 0033 RET 1 R7 - 0x70020023, // 0034 JMP #0059 - 0x541E0010, // 0035 LDINT R7 17 - 0x1C1C0C07, // 0036 EQ R7 R6 R7 - 0x781E000F, // 0037 JMPF R7 #0048 - 0x881C0107, // 0038 GETMBR R7 R0 K7 - 0x4C200000, // 0039 LDNIL R8 - 0x201C0E08, // 003A NE R7 R7 R8 - 0x781E0005, // 003B JMPF R7 #0042 - 0x8C1C0908, // 003C GETMET R7 R4 K8 - 0x88240909, // 003D GETMBR R9 R4 K9 - 0x88280107, // 003E GETMBR R10 R0 K7 - 0x7C1C0600, // 003F CALL R7 3 - 0x80040E00, // 0040 RET 1 R7 - 0x70020004, // 0041 JMP #0047 - 0x8C1C0908, // 0042 GETMET R7 R4 K8 - 0x8824090A, // 0043 GETMBR R9 R4 K10 - 0x4C280000, // 0044 LDNIL R10 - 0x7C1C0600, // 0045 CALL R7 3 - 0x80040E00, // 0046 RET 1 R7 - 0x70020010, // 0047 JMP #0059 - 0x541EFFFB, // 0048 LDINT R7 65532 - 0x1C1C0C07, // 0049 EQ R7 R6 R7 - 0x781E0005, // 004A JMPF R7 #0051 - 0x8C1C0908, // 004B GETMET R7 R4 K8 - 0x8824090D, // 004C GETMBR R9 R4 K13 - 0x5828000E, // 004D LDCONST R10 K14 - 0x7C1C0600, // 004E CALL R7 3 - 0x80040E00, // 004F RET 1 R7 - 0x70020007, // 0050 JMP #0059 - 0x541EFFFC, // 0051 LDINT R7 65533 - 0x1C1C0C07, // 0052 EQ R7 R6 R7 - 0x781E0004, // 0053 JMPF R7 #0059 - 0x8C1C0908, // 0054 GETMET R7 R4 K8 - 0x8824090D, // 0055 GETMBR R9 R4 K13 - 0x542A0004, // 0056 LDINT R10 5 - 0x7C1C0600, // 0057 CALL R7 3 - 0x80040E00, // 0058 RET 1 R7 - 0x70020007, // 0059 JMP #0062 - 0x601C0003, // 005A GETGBL R7 G3 - 0x5C200000, // 005B MOVE R8 R0 - 0x7C1C0200, // 005C CALL R7 1 - 0x8C1C0F0F, // 005D GETMET R7 R7 K15 - 0x5C240200, // 005E MOVE R9 R1 - 0x5C280400, // 005F MOVE R10 R2 - 0x7C1C0600, // 0060 CALL R7 3 - 0x80040E00, // 0061 RET 1 R7 - 0x80000000, // 0062 RET 0 + 0x541A0007, // 0004 LDINT R6 8 + 0x1C180806, // 0005 EQ R6 R4 R6 + 0x781A0051, // 0006 JMPF R6 #0059 + 0x8C180104, // 0007 GETMET R6 R0 K4 + 0x7C180200, // 0008 CALL R6 1 + 0x1C180B05, // 0009 EQ R6 R5 K5 + 0x781A000F, // 000A JMPF R6 #001B + 0x88180106, // 000B GETMBR R6 R0 K6 + 0x4C1C0000, // 000C LDNIL R7 + 0x20180C07, // 000D NE R6 R6 R7 + 0x781A0005, // 000E JMPF R6 #0015 + 0x8C180707, // 000F GETMET R6 R3 K7 + 0x88200708, // 0010 GETMBR R8 R3 K8 + 0x88240106, // 0011 GETMBR R9 R0 K6 + 0x7C180600, // 0012 CALL R6 3 + 0x80040C00, // 0013 RET 1 R6 + 0x70020004, // 0014 JMP #001A + 0x8C180707, // 0015 GETMET R6 R3 K7 + 0x88200709, // 0016 GETMBR R8 R3 K9 + 0x4C240000, // 0017 LDNIL R9 + 0x7C180600, // 0018 CALL R6 3 + 0x80040C00, // 0019 RET 1 R6 + 0x7002003C, // 001A JMP #0058 + 0x1C180B0A, // 001B EQ R6 R5 K10 + 0x781A0005, // 001C JMPF R6 #0023 + 0x8C180707, // 001D GETMET R6 R3 K7 + 0x88200708, // 001E GETMBR R8 R3 K8 + 0x58240005, // 001F LDCONST R9 K5 + 0x7C180600, // 0020 CALL R6 3 + 0x80040C00, // 0021 RET 1 R6 + 0x70020034, // 0022 JMP #0058 + 0x1C180B0B, // 0023 EQ R6 R5 K11 + 0x781A0005, // 0024 JMPF R6 #002B + 0x8C180707, // 0025 GETMET R6 R3 K7 + 0x88200708, // 0026 GETMBR R8 R3 K8 + 0x542600FD, // 0027 LDINT R9 254 + 0x7C180600, // 0028 CALL R6 3 + 0x80040C00, // 0029 RET 1 R6 + 0x7002002C, // 002A JMP #0058 + 0x541A000E, // 002B LDINT R6 15 + 0x1C180A06, // 002C EQ R6 R5 R6 + 0x781A0005, // 002D JMPF R6 #0034 + 0x8C180707, // 002E GETMET R6 R3 K7 + 0x88200708, // 002F GETMBR R8 R3 K8 + 0x58240005, // 0030 LDCONST R9 K5 + 0x7C180600, // 0031 CALL R6 3 + 0x80040C00, // 0032 RET 1 R6 + 0x70020023, // 0033 JMP #0058 + 0x541A0010, // 0034 LDINT R6 17 + 0x1C180A06, // 0035 EQ R6 R5 R6 + 0x781A000F, // 0036 JMPF R6 #0047 + 0x88180106, // 0037 GETMBR R6 R0 K6 + 0x4C1C0000, // 0038 LDNIL R7 + 0x20180C07, // 0039 NE R6 R6 R7 + 0x781A0005, // 003A JMPF R6 #0041 + 0x8C180707, // 003B GETMET R6 R3 K7 + 0x88200708, // 003C GETMBR R8 R3 K8 + 0x88240106, // 003D GETMBR R9 R0 K6 + 0x7C180600, // 003E CALL R6 3 + 0x80040C00, // 003F RET 1 R6 + 0x70020004, // 0040 JMP #0046 + 0x8C180707, // 0041 GETMET R6 R3 K7 + 0x88200709, // 0042 GETMBR R8 R3 K9 + 0x4C240000, // 0043 LDNIL R9 + 0x7C180600, // 0044 CALL R6 3 + 0x80040C00, // 0045 RET 1 R6 + 0x70020010, // 0046 JMP #0058 + 0x541AFFFB, // 0047 LDINT R6 65532 + 0x1C180A06, // 0048 EQ R6 R5 R6 + 0x781A0005, // 0049 JMPF R6 #0050 + 0x8C180707, // 004A GETMET R6 R3 K7 + 0x8820070C, // 004B GETMBR R8 R3 K12 + 0x5824000D, // 004C LDCONST R9 K13 + 0x7C180600, // 004D CALL R6 3 + 0x80040C00, // 004E RET 1 R6 + 0x70020007, // 004F JMP #0058 + 0x541AFFFC, // 0050 LDINT R6 65533 + 0x1C180A06, // 0051 EQ R6 R5 R6 + 0x781A0004, // 0052 JMPF R6 #0058 + 0x8C180707, // 0053 GETMET R6 R3 K7 + 0x8820070C, // 0054 GETMBR R8 R3 K12 + 0x54260004, // 0055 LDINT R9 5 + 0x7C180600, // 0056 CALL R6 3 + 0x80040C00, // 0057 RET 1 R6 + 0x70020007, // 0058 JMP #0061 + 0x60180003, // 0059 GETGBL R6 G3 + 0x5C1C0000, // 005A MOVE R7 R0 + 0x7C180200, // 005B CALL R6 1 + 0x8C180D0E, // 005C GETMET R6 R6 K14 + 0x5C200200, // 005D MOVE R8 R1 + 0x5C240400, // 005E MOVE R9 R2 + 0x7C180600, // 005F CALL R6 3 + 0x80040C00, // 0060 RET 1 R6 + 0x80000000, // 0061 RET 0 }) ) ); @@ -278,7 +276,7 @@ be_local_closure(Matter_Plugin_Bridge_Light1_read_attribute, /* name */ ********************************************************************/ be_local_closure(Matter_Plugin_Bridge_Light1_web_values, /* name */ be_nested_proto( - 11, /* nstack */ + 9, /* nstack */ 1, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -286,35 +284,32 @@ be_local_closure(Matter_Plugin_Bridge_Light1_web_values, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[ 9]) { /* constants */ + ( &(const bvalue[ 7]) { /* constants */ /* K0 */ be_nested_str_weak(webserver), - /* K1 */ be_nested_str_weak(string), - /* K2 */ be_nested_str_weak(web_values_prefix), - /* K3 */ be_nested_str_weak(content_send), - /* K4 */ be_nested_str_weak(format), - /* K5 */ be_nested_str_weak(_X25s_X20_X25s), - /* K6 */ be_nested_str_weak(web_value_onoff), - /* K7 */ be_nested_str_weak(shadow_onoff), - /* K8 */ be_nested_str_weak(web_value_dimmer), + /* K1 */ be_nested_str_weak(web_values_prefix), + /* K2 */ be_nested_str_weak(content_send), + /* K3 */ be_nested_str_weak(_X25s_X20_X25s), + /* K4 */ be_nested_str_weak(web_value_onoff), + /* K5 */ be_nested_str_weak(shadow_onoff), + /* K6 */ be_nested_str_weak(web_value_dimmer), }), be_str_weak(web_values), &be_const_str_solidified, - ( &(const binstruction[15]) { /* code */ + ( &(const binstruction[14]) { /* code */ 0xA4060000, // 0000 IMPORT R1 K0 - 0xA40A0200, // 0001 IMPORT R2 K1 - 0x8C0C0102, // 0002 GETMET R3 R0 K2 - 0x7C0C0200, // 0003 CALL R3 1 - 0x8C0C0303, // 0004 GETMET R3 R1 K3 - 0x8C140504, // 0005 GETMET R5 R2 K4 - 0x581C0005, // 0006 LDCONST R7 K5 - 0x8C200106, // 0007 GETMET R8 R0 K6 - 0x88280107, // 0008 GETMBR R10 R0 K7 - 0x7C200400, // 0009 CALL R8 2 - 0x8C240108, // 000A GETMET R9 R0 K8 - 0x7C240200, // 000B CALL R9 1 - 0x7C140800, // 000C CALL R5 4 - 0x7C0C0400, // 000D CALL R3 2 - 0x80000000, // 000E RET 0 + 0x8C080101, // 0001 GETMET R2 R0 K1 + 0x7C080200, // 0002 CALL R2 1 + 0x8C080302, // 0003 GETMET R2 R1 K2 + 0x60100018, // 0004 GETGBL R4 G24 + 0x58140003, // 0005 LDCONST R5 K3 + 0x8C180104, // 0006 GETMET R6 R0 K4 + 0x88200105, // 0007 GETMBR R8 R0 K5 + 0x7C180400, // 0008 CALL R6 2 + 0x8C1C0106, // 0009 GETMET R7 R0 K6 + 0x7C1C0200, // 000A CALL R7 1 + 0x7C100600, // 000B CALL R4 3 + 0x7C080400, // 000C CALL R2 2 + 0x80000000, // 000D RET 0 }) ) ); @@ -445,7 +440,7 @@ be_local_closure(Matter_Plugin_Bridge_Light1_parse_update, /* name */ ********************************************************************/ be_local_closure(Matter_Plugin_Bridge_Light1_web_value_dimmer, /* name */ be_nested_proto( - 10, /* nstack */ + 9, /* nstack */ 1, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -453,41 +448,38 @@ be_local_closure(Matter_Plugin_Bridge_Light1_web_value_dimmer, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[ 9]) { /* constants */ - /* K0 */ be_nested_str_weak(string), - /* K1 */ be_nested_str_weak(), - /* K2 */ be_nested_str_weak(shadow_bri), - /* K3 */ be_nested_str_weak(tasmota), - /* K4 */ be_nested_str_weak(scale_uint), - /* K5 */ be_const_int(0), - /* K6 */ be_nested_str_weak(format), - /* K7 */ be_nested_str_weak(_X25i_X25_X25), - /* K8 */ be_nested_str_weak(_X26_X23128261_X3B_X20), + ( &(const bvalue[ 7]) { /* constants */ + /* K0 */ be_nested_str_weak(), + /* K1 */ be_nested_str_weak(shadow_bri), + /* K2 */ be_nested_str_weak(tasmota), + /* K3 */ be_nested_str_weak(scale_uint), + /* K4 */ be_const_int(0), + /* K5 */ be_nested_str_weak(_X25i_X25_X25), + /* K6 */ be_nested_str_weak(_X26_X23128261_X3B_X20), }), be_str_weak(web_value_dimmer), &be_const_str_solidified, - ( &(const binstruction[21]) { /* code */ - 0xA4060000, // 0000 IMPORT R1 K0 - 0x58080001, // 0001 LDCONST R2 K1 - 0x880C0102, // 0002 GETMBR R3 R0 K2 - 0x4C100000, // 0003 LDNIL R4 - 0x200C0604, // 0004 NE R3 R3 R4 - 0x780E000C, // 0005 JMPF R3 #0013 - 0xB80E0600, // 0006 GETNGBL R3 K3 - 0x8C0C0704, // 0007 GETMET R3 R3 K4 - 0x88140102, // 0008 GETMBR R5 R0 K2 - 0x58180005, // 0009 LDCONST R6 K5 - 0x541E00FD, // 000A LDINT R7 254 - 0x58200005, // 000B LDCONST R8 K5 - 0x54260063, // 000C LDINT R9 100 - 0x7C0C0C00, // 000D CALL R3 6 - 0x8C100306, // 000E GETMET R4 R1 K6 - 0x58180007, // 000F LDCONST R6 K7 - 0x5C1C0600, // 0010 MOVE R7 R3 - 0x7C100600, // 0011 CALL R4 3 - 0x5C080800, // 0012 MOVE R2 R4 - 0x000E1002, // 0013 ADD R3 K8 R2 - 0x80040600, // 0014 RET 1 R3 + ( &(const binstruction[20]) { /* code */ + 0x58040000, // 0000 LDCONST R1 K0 + 0x88080101, // 0001 GETMBR R2 R0 K1 + 0x4C0C0000, // 0002 LDNIL R3 + 0x20080403, // 0003 NE R2 R2 R3 + 0x780A000C, // 0004 JMPF R2 #0012 + 0xB80A0400, // 0005 GETNGBL R2 K2 + 0x8C080503, // 0006 GETMET R2 R2 K3 + 0x88100101, // 0007 GETMBR R4 R0 K1 + 0x58140004, // 0008 LDCONST R5 K4 + 0x541A00FD, // 0009 LDINT R6 254 + 0x581C0004, // 000A LDCONST R7 K4 + 0x54220063, // 000B LDINT R8 100 + 0x7C080C00, // 000C CALL R2 6 + 0x600C0018, // 000D GETGBL R3 G24 + 0x58100005, // 000E LDCONST R4 K5 + 0x5C140400, // 000F MOVE R5 R2 + 0x7C0C0400, // 0010 CALL R3 2 + 0x5C040600, // 0011 MOVE R1 R3 + 0x000A0C01, // 0012 ADD R2 K6 R1 + 0x80040400, // 0013 RET 1 R2 }) ) ); diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Light2.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Light2.h index b851dc1e3..b38775852 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Light2.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Light2.h @@ -114,7 +114,7 @@ be_local_closure(Matter_Plugin_Bridge_Light2_parse_update, /* name */ ********************************************************************/ be_local_closure(Matter_Plugin_Bridge_Light2_web_values, /* name */ be_nested_proto( - 12, /* nstack */ + 10, /* nstack */ 1, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -122,38 +122,35 @@ be_local_closure(Matter_Plugin_Bridge_Light2_web_values, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[10]) { /* constants */ + ( &(const bvalue[ 8]) { /* constants */ /* K0 */ be_nested_str_weak(webserver), - /* K1 */ be_nested_str_weak(string), - /* K2 */ be_nested_str_weak(web_values_prefix), - /* K3 */ be_nested_str_weak(content_send), - /* K4 */ be_nested_str_weak(format), - /* K5 */ be_nested_str_weak(_X25s_X20_X25s_X20_X25s), - /* K6 */ be_nested_str_weak(web_value_onoff), - /* K7 */ be_nested_str_weak(shadow_onoff), - /* K8 */ be_nested_str_weak(web_value_dimmer), - /* K9 */ be_nested_str_weak(web_value_ct), + /* K1 */ be_nested_str_weak(web_values_prefix), + /* K2 */ be_nested_str_weak(content_send), + /* K3 */ be_nested_str_weak(_X25s_X20_X25s_X20_X25s), + /* K4 */ be_nested_str_weak(web_value_onoff), + /* K5 */ be_nested_str_weak(shadow_onoff), + /* K6 */ be_nested_str_weak(web_value_dimmer), + /* K7 */ be_nested_str_weak(web_value_ct), }), be_str_weak(web_values), &be_const_str_solidified, - ( &(const binstruction[17]) { /* code */ + ( &(const binstruction[16]) { /* code */ 0xA4060000, // 0000 IMPORT R1 K0 - 0xA40A0200, // 0001 IMPORT R2 K1 - 0x8C0C0102, // 0002 GETMET R3 R0 K2 - 0x7C0C0200, // 0003 CALL R3 1 - 0x8C0C0303, // 0004 GETMET R3 R1 K3 - 0x8C140504, // 0005 GETMET R5 R2 K4 - 0x581C0005, // 0006 LDCONST R7 K5 - 0x8C200106, // 0007 GETMET R8 R0 K6 - 0x88280107, // 0008 GETMBR R10 R0 K7 - 0x7C200400, // 0009 CALL R8 2 - 0x8C240108, // 000A GETMET R9 R0 K8 - 0x7C240200, // 000B CALL R9 1 - 0x8C280109, // 000C GETMET R10 R0 K9 - 0x7C280200, // 000D CALL R10 1 - 0x7C140A00, // 000E CALL R5 5 - 0x7C0C0400, // 000F CALL R3 2 - 0x80000000, // 0010 RET 0 + 0x8C080101, // 0001 GETMET R2 R0 K1 + 0x7C080200, // 0002 CALL R2 1 + 0x8C080302, // 0003 GETMET R2 R1 K2 + 0x60100018, // 0004 GETGBL R4 G24 + 0x58140003, // 0005 LDCONST R5 K3 + 0x8C180104, // 0006 GETMET R6 R0 K4 + 0x88200105, // 0007 GETMBR R8 R0 K5 + 0x7C180400, // 0008 CALL R6 2 + 0x8C1C0106, // 0009 GETMET R7 R0 K6 + 0x7C1C0200, // 000A CALL R7 1 + 0x8C200107, // 000B GETMET R8 R0 K7 + 0x7C200200, // 000C CALL R8 1 + 0x7C100800, // 000D CALL R4 4 + 0x7C080400, // 000E CALL R2 2 + 0x80000000, // 000F RET 0 }) ) ); @@ -165,7 +162,7 @@ be_local_closure(Matter_Plugin_Bridge_Light2_web_values, /* name */ ********************************************************************/ be_local_closure(Matter_Plugin_Bridge_Light2_web_value_ct, /* name */ be_nested_proto( - 8, /* nstack */ + 6, /* nstack */ 1, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -173,39 +170,36 @@ be_local_closure(Matter_Plugin_Bridge_Light2_web_value_ct, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[ 7]) { /* constants */ - /* K0 */ be_nested_str_weak(string), - /* K1 */ be_nested_str_weak(), - /* K2 */ be_nested_str_weak(shadow_ct), - /* K3 */ be_const_int(1000000), - /* K4 */ be_nested_str_weak(format), - /* K5 */ be_nested_str_weak(_X25iK), - /* K6 */ be_nested_str_weak(_X26_X239898_X3B_X20), + ( &(const bvalue[ 5]) { /* constants */ + /* K0 */ be_nested_str_weak(), + /* K1 */ be_nested_str_weak(shadow_ct), + /* K2 */ be_const_int(1000000), + /* K3 */ be_nested_str_weak(_X25iK), + /* K4 */ be_nested_str_weak(_X26_X239898_X3B_X20), }), be_str_weak(web_value_ct), &be_const_str_solidified, - ( &(const binstruction[21]) { /* code */ - 0xA4060000, // 0000 IMPORT R1 K0 - 0x58080001, // 0001 LDCONST R2 K1 - 0x880C0102, // 0002 GETMBR R3 R0 K2 - 0x4C100000, // 0003 LDNIL R4 - 0x200C0604, // 0004 NE R3 R3 R4 - 0x780E000C, // 0005 JMPF R3 #0013 - 0x880C0102, // 0006 GETMBR R3 R0 K2 - 0x0C0E0603, // 0007 DIV R3 K3 R3 - 0x54120018, // 0008 LDINT R4 25 - 0x000C0604, // 0009 ADD R3 R3 R4 - 0x54120031, // 000A LDINT R4 50 - 0x0C0C0604, // 000B DIV R3 R3 R4 - 0x54120031, // 000C LDINT R4 50 - 0x080C0604, // 000D MUL R3 R3 R4 - 0x8C100304, // 000E GETMET R4 R1 K4 - 0x58180005, // 000F LDCONST R6 K5 - 0x5C1C0600, // 0010 MOVE R7 R3 - 0x7C100600, // 0011 CALL R4 3 - 0x5C080800, // 0012 MOVE R2 R4 - 0x000E0C02, // 0013 ADD R3 K6 R2 - 0x80040600, // 0014 RET 1 R3 + ( &(const binstruction[20]) { /* code */ + 0x58040000, // 0000 LDCONST R1 K0 + 0x88080101, // 0001 GETMBR R2 R0 K1 + 0x4C0C0000, // 0002 LDNIL R3 + 0x20080403, // 0003 NE R2 R2 R3 + 0x780A000C, // 0004 JMPF R2 #0012 + 0x88080101, // 0005 GETMBR R2 R0 K1 + 0x0C0A0402, // 0006 DIV R2 K2 R2 + 0x540E0018, // 0007 LDINT R3 25 + 0x00080403, // 0008 ADD R2 R2 R3 + 0x540E0031, // 0009 LDINT R3 50 + 0x0C080403, // 000A DIV R2 R2 R3 + 0x540E0031, // 000B LDINT R3 50 + 0x08080403, // 000C MUL R2 R2 R3 + 0x600C0018, // 000D GETGBL R3 G24 + 0x58100003, // 000E LDCONST R4 K3 + 0x5C140400, // 000F MOVE R5 R2 + 0x7C0C0400, // 0010 CALL R3 2 + 0x5C040600, // 0011 MOVE R1 R3 + 0x000A0801, // 0012 ADD R2 K4 R1 + 0x80040400, // 0013 RET 1 R2 }) ) ); @@ -400,7 +394,7 @@ be_local_closure(Matter_Plugin_Bridge_Light2_update_ct_minmax, /* name */ ********************************************************************/ be_local_closure(Matter_Plugin_Bridge_Light2_read_attribute, /* name */ be_nested_proto( - 11, /* nstack */ + 10, /* nstack */ 3, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -408,128 +402,126 @@ be_local_closure(Matter_Plugin_Bridge_Light2_read_attribute, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[16]) { /* constants */ - /* K0 */ be_nested_str_weak(string), - /* K1 */ be_nested_str_weak(matter), - /* K2 */ be_nested_str_weak(TLV), - /* K3 */ be_nested_str_weak(cluster), - /* K4 */ be_nested_str_weak(attribute), - /* K5 */ be_nested_str_weak(update_shadow_lazy), - /* K6 */ be_nested_str_weak(shadow_ct), - /* K7 */ be_nested_str_weak(create_TLV), - /* K8 */ be_nested_str_weak(U1), - /* K9 */ be_nested_str_weak(NULL), - /* K10 */ be_const_int(2), - /* K11 */ be_const_int(0), - /* K12 */ be_nested_str_weak(ct_min), - /* K13 */ be_nested_str_weak(ct_max), - /* K14 */ be_nested_str_weak(U4), - /* K15 */ be_nested_str_weak(read_attribute), + ( &(const bvalue[15]) { /* constants */ + /* K0 */ be_nested_str_weak(matter), + /* K1 */ be_nested_str_weak(TLV), + /* K2 */ be_nested_str_weak(cluster), + /* K3 */ be_nested_str_weak(attribute), + /* K4 */ be_nested_str_weak(update_shadow_lazy), + /* K5 */ be_nested_str_weak(shadow_ct), + /* K6 */ be_nested_str_weak(create_TLV), + /* K7 */ be_nested_str_weak(U1), + /* K8 */ be_nested_str_weak(NULL), + /* K9 */ be_const_int(2), + /* K10 */ be_const_int(0), + /* K11 */ be_nested_str_weak(ct_min), + /* K12 */ be_nested_str_weak(ct_max), + /* K13 */ be_nested_str_weak(U4), + /* K14 */ be_nested_str_weak(read_attribute), }), be_str_weak(read_attribute), &be_const_str_solidified, - ( &(const binstruction[101]) { /* code */ - 0xA40E0000, // 0000 IMPORT R3 K0 - 0xB8120200, // 0001 GETNGBL R4 K1 - 0x88100902, // 0002 GETMBR R4 R4 K2 + ( &(const binstruction[100]) { /* code */ + 0xB80E0000, // 0000 GETNGBL R3 K0 + 0x880C0701, // 0001 GETMBR R3 R3 K1 + 0x88100502, // 0002 GETMBR R4 R2 K2 0x88140503, // 0003 GETMBR R5 R2 K3 - 0x88180504, // 0004 GETMBR R6 R2 K4 - 0x541E02FF, // 0005 LDINT R7 768 - 0x1C1C0A07, // 0006 EQ R7 R5 R7 - 0x781E0053, // 0007 JMPF R7 #005C - 0x8C1C0105, // 0008 GETMET R7 R0 K5 - 0x7C1C0200, // 0009 CALL R7 1 - 0x541E0006, // 000A LDINT R7 7 - 0x1C1C0C07, // 000B EQ R7 R6 R7 - 0x781E000F, // 000C JMPF R7 #001D - 0x881C0106, // 000D GETMBR R7 R0 K6 - 0x4C200000, // 000E LDNIL R8 - 0x201C0E08, // 000F NE R7 R7 R8 - 0x781E0005, // 0010 JMPF R7 #0017 - 0x8C1C0907, // 0011 GETMET R7 R4 K7 - 0x88240908, // 0012 GETMBR R9 R4 K8 - 0x88280106, // 0013 GETMBR R10 R0 K6 - 0x7C1C0600, // 0014 CALL R7 3 - 0x80040E00, // 0015 RET 1 R7 - 0x70020004, // 0016 JMP #001C - 0x8C1C0907, // 0017 GETMET R7 R4 K7 - 0x88240909, // 0018 GETMBR R9 R4 K9 - 0x4C280000, // 0019 LDNIL R10 - 0x7C1C0600, // 001A CALL R7 3 - 0x80040E00, // 001B RET 1 R7 - 0x7002003D, // 001C JMP #005B - 0x541E0007, // 001D LDINT R7 8 - 0x1C1C0C07, // 001E EQ R7 R6 R7 - 0x781E0005, // 001F JMPF R7 #0026 - 0x8C1C0907, // 0020 GETMET R7 R4 K7 - 0x88240908, // 0021 GETMBR R9 R4 K8 - 0x5828000A, // 0022 LDCONST R10 K10 - 0x7C1C0600, // 0023 CALL R7 3 - 0x80040E00, // 0024 RET 1 R7 - 0x70020034, // 0025 JMP #005B - 0x541E000E, // 0026 LDINT R7 15 - 0x1C1C0C07, // 0027 EQ R7 R6 R7 - 0x781E0005, // 0028 JMPF R7 #002F - 0x8C1C0907, // 0029 GETMET R7 R4 K7 - 0x88240908, // 002A GETMBR R9 R4 K8 - 0x5828000B, // 002B LDCONST R10 K11 - 0x7C1C0600, // 002C CALL R7 3 - 0x80040E00, // 002D RET 1 R7 - 0x7002002B, // 002E JMP #005B - 0x541E400A, // 002F LDINT R7 16395 - 0x1C1C0C07, // 0030 EQ R7 R6 R7 - 0x781E0005, // 0031 JMPF R7 #0038 - 0x8C1C0907, // 0032 GETMET R7 R4 K7 - 0x88240908, // 0033 GETMBR R9 R4 K8 - 0x8828010C, // 0034 GETMBR R10 R0 K12 - 0x7C1C0600, // 0035 CALL R7 3 - 0x80040E00, // 0036 RET 1 R7 - 0x70020022, // 0037 JMP #005B - 0x541E400B, // 0038 LDINT R7 16396 - 0x1C1C0C07, // 0039 EQ R7 R6 R7 - 0x781E0005, // 003A JMPF R7 #0041 - 0x8C1C0907, // 003B GETMET R7 R4 K7 - 0x88240908, // 003C GETMBR R9 R4 K8 - 0x8828010D, // 003D GETMBR R10 R0 K13 - 0x7C1C0600, // 003E CALL R7 3 - 0x80040E00, // 003F RET 1 R7 - 0x70020019, // 0040 JMP #005B - 0x541E4009, // 0041 LDINT R7 16394 - 0x1C1C0C07, // 0042 EQ R7 R6 R7 - 0x781E0005, // 0043 JMPF R7 #004A - 0x8C1C0907, // 0044 GETMET R7 R4 K7 - 0x8824090E, // 0045 GETMBR R9 R4 K14 - 0x542A000F, // 0046 LDINT R10 16 - 0x7C1C0600, // 0047 CALL R7 3 - 0x80040E00, // 0048 RET 1 R7 - 0x70020010, // 0049 JMP #005B - 0x541EFFFB, // 004A LDINT R7 65532 - 0x1C1C0C07, // 004B EQ R7 R6 R7 - 0x781E0005, // 004C JMPF R7 #0053 - 0x8C1C0907, // 004D GETMET R7 R4 K7 - 0x8824090E, // 004E GETMBR R9 R4 K14 - 0x542A000F, // 004F LDINT R10 16 - 0x7C1C0600, // 0050 CALL R7 3 - 0x80040E00, // 0051 RET 1 R7 - 0x70020007, // 0052 JMP #005B - 0x541EFFFC, // 0053 LDINT R7 65533 - 0x1C1C0C07, // 0054 EQ R7 R6 R7 - 0x781E0004, // 0055 JMPF R7 #005B - 0x8C1C0907, // 0056 GETMET R7 R4 K7 - 0x8824090E, // 0057 GETMBR R9 R4 K14 - 0x542A0004, // 0058 LDINT R10 5 - 0x7C1C0600, // 0059 CALL R7 3 - 0x80040E00, // 005A RET 1 R7 - 0x70020007, // 005B JMP #0064 - 0x601C0003, // 005C GETGBL R7 G3 - 0x5C200000, // 005D MOVE R8 R0 - 0x7C1C0200, // 005E CALL R7 1 - 0x8C1C0F0F, // 005F GETMET R7 R7 K15 - 0x5C240200, // 0060 MOVE R9 R1 - 0x5C280400, // 0061 MOVE R10 R2 - 0x7C1C0600, // 0062 CALL R7 3 - 0x80040E00, // 0063 RET 1 R7 - 0x80000000, // 0064 RET 0 + 0x541A02FF, // 0004 LDINT R6 768 + 0x1C180806, // 0005 EQ R6 R4 R6 + 0x781A0053, // 0006 JMPF R6 #005B + 0x8C180104, // 0007 GETMET R6 R0 K4 + 0x7C180200, // 0008 CALL R6 1 + 0x541A0006, // 0009 LDINT R6 7 + 0x1C180A06, // 000A EQ R6 R5 R6 + 0x781A000F, // 000B JMPF R6 #001C + 0x88180105, // 000C GETMBR R6 R0 K5 + 0x4C1C0000, // 000D LDNIL R7 + 0x20180C07, // 000E NE R6 R6 R7 + 0x781A0005, // 000F JMPF R6 #0016 + 0x8C180706, // 0010 GETMET R6 R3 K6 + 0x88200707, // 0011 GETMBR R8 R3 K7 + 0x88240105, // 0012 GETMBR R9 R0 K5 + 0x7C180600, // 0013 CALL R6 3 + 0x80040C00, // 0014 RET 1 R6 + 0x70020004, // 0015 JMP #001B + 0x8C180706, // 0016 GETMET R6 R3 K6 + 0x88200708, // 0017 GETMBR R8 R3 K8 + 0x4C240000, // 0018 LDNIL R9 + 0x7C180600, // 0019 CALL R6 3 + 0x80040C00, // 001A RET 1 R6 + 0x7002003D, // 001B JMP #005A + 0x541A0007, // 001C LDINT R6 8 + 0x1C180A06, // 001D EQ R6 R5 R6 + 0x781A0005, // 001E JMPF R6 #0025 + 0x8C180706, // 001F GETMET R6 R3 K6 + 0x88200707, // 0020 GETMBR R8 R3 K7 + 0x58240009, // 0021 LDCONST R9 K9 + 0x7C180600, // 0022 CALL R6 3 + 0x80040C00, // 0023 RET 1 R6 + 0x70020034, // 0024 JMP #005A + 0x541A000E, // 0025 LDINT R6 15 + 0x1C180A06, // 0026 EQ R6 R5 R6 + 0x781A0005, // 0027 JMPF R6 #002E + 0x8C180706, // 0028 GETMET R6 R3 K6 + 0x88200707, // 0029 GETMBR R8 R3 K7 + 0x5824000A, // 002A LDCONST R9 K10 + 0x7C180600, // 002B CALL R6 3 + 0x80040C00, // 002C RET 1 R6 + 0x7002002B, // 002D JMP #005A + 0x541A400A, // 002E LDINT R6 16395 + 0x1C180A06, // 002F EQ R6 R5 R6 + 0x781A0005, // 0030 JMPF R6 #0037 + 0x8C180706, // 0031 GETMET R6 R3 K6 + 0x88200707, // 0032 GETMBR R8 R3 K7 + 0x8824010B, // 0033 GETMBR R9 R0 K11 + 0x7C180600, // 0034 CALL R6 3 + 0x80040C00, // 0035 RET 1 R6 + 0x70020022, // 0036 JMP #005A + 0x541A400B, // 0037 LDINT R6 16396 + 0x1C180A06, // 0038 EQ R6 R5 R6 + 0x781A0005, // 0039 JMPF R6 #0040 + 0x8C180706, // 003A GETMET R6 R3 K6 + 0x88200707, // 003B GETMBR R8 R3 K7 + 0x8824010C, // 003C GETMBR R9 R0 K12 + 0x7C180600, // 003D CALL R6 3 + 0x80040C00, // 003E RET 1 R6 + 0x70020019, // 003F JMP #005A + 0x541A4009, // 0040 LDINT R6 16394 + 0x1C180A06, // 0041 EQ R6 R5 R6 + 0x781A0005, // 0042 JMPF R6 #0049 + 0x8C180706, // 0043 GETMET R6 R3 K6 + 0x8820070D, // 0044 GETMBR R8 R3 K13 + 0x5426000F, // 0045 LDINT R9 16 + 0x7C180600, // 0046 CALL R6 3 + 0x80040C00, // 0047 RET 1 R6 + 0x70020010, // 0048 JMP #005A + 0x541AFFFB, // 0049 LDINT R6 65532 + 0x1C180A06, // 004A EQ R6 R5 R6 + 0x781A0005, // 004B JMPF R6 #0052 + 0x8C180706, // 004C GETMET R6 R3 K6 + 0x8820070D, // 004D GETMBR R8 R3 K13 + 0x5426000F, // 004E LDINT R9 16 + 0x7C180600, // 004F CALL R6 3 + 0x80040C00, // 0050 RET 1 R6 + 0x70020007, // 0051 JMP #005A + 0x541AFFFC, // 0052 LDINT R6 65533 + 0x1C180A06, // 0053 EQ R6 R5 R6 + 0x781A0004, // 0054 JMPF R6 #005A + 0x8C180706, // 0055 GETMET R6 R3 K6 + 0x8820070D, // 0056 GETMBR R8 R3 K13 + 0x54260004, // 0057 LDINT R9 5 + 0x7C180600, // 0058 CALL R6 3 + 0x80040C00, // 0059 RET 1 R6 + 0x70020007, // 005A JMP #0063 + 0x60180003, // 005B GETGBL R6 G3 + 0x5C1C0000, // 005C MOVE R7 R0 + 0x7C180200, // 005D CALL R6 1 + 0x8C180D0E, // 005E GETMET R6 R6 K14 + 0x5C200200, // 005F MOVE R8 R1 + 0x5C240400, // 0060 MOVE R9 R2 + 0x7C180600, // 0061 CALL R6 3 + 0x80040C00, // 0062 RET 1 R6 + 0x80000000, // 0063 RET 0 }) ) ); diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Light3.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Light3.h index ce1f28520..c4ce2b977 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Light3.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Light3.h @@ -168,7 +168,7 @@ be_local_closure(Matter_Plugin_Bridge_Light3_parse_update, /* name */ ********************************************************************/ be_local_closure(Matter_Plugin_Bridge_Light3_web_values, /* name */ be_nested_proto( - 12, /* nstack */ + 10, /* nstack */ 1, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -176,38 +176,35 @@ be_local_closure(Matter_Plugin_Bridge_Light3_web_values, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[10]) { /* constants */ + ( &(const bvalue[ 8]) { /* constants */ /* K0 */ be_nested_str_weak(webserver), - /* K1 */ be_nested_str_weak(string), - /* K2 */ be_nested_str_weak(web_values_prefix), - /* K3 */ be_nested_str_weak(content_send), - /* K4 */ be_nested_str_weak(format), - /* K5 */ be_nested_str_weak(_X25s_X20_X25s_X20_X25s), - /* K6 */ be_nested_str_weak(web_value_onoff), - /* K7 */ be_nested_str_weak(shadow_onoff), - /* K8 */ be_nested_str_weak(web_value_dimmer), - /* K9 */ be_nested_str_weak(web_value_RGB), + /* K1 */ be_nested_str_weak(web_values_prefix), + /* K2 */ be_nested_str_weak(content_send), + /* K3 */ be_nested_str_weak(_X25s_X20_X25s_X20_X25s), + /* K4 */ be_nested_str_weak(web_value_onoff), + /* K5 */ be_nested_str_weak(shadow_onoff), + /* K6 */ be_nested_str_weak(web_value_dimmer), + /* K7 */ be_nested_str_weak(web_value_RGB), }), be_str_weak(web_values), &be_const_str_solidified, - ( &(const binstruction[17]) { /* code */ + ( &(const binstruction[16]) { /* code */ 0xA4060000, // 0000 IMPORT R1 K0 - 0xA40A0200, // 0001 IMPORT R2 K1 - 0x8C0C0102, // 0002 GETMET R3 R0 K2 - 0x7C0C0200, // 0003 CALL R3 1 - 0x8C0C0303, // 0004 GETMET R3 R1 K3 - 0x8C140504, // 0005 GETMET R5 R2 K4 - 0x581C0005, // 0006 LDCONST R7 K5 - 0x8C200106, // 0007 GETMET R8 R0 K6 - 0x88280107, // 0008 GETMBR R10 R0 K7 - 0x7C200400, // 0009 CALL R8 2 - 0x8C240108, // 000A GETMET R9 R0 K8 - 0x7C240200, // 000B CALL R9 1 - 0x8C280109, // 000C GETMET R10 R0 K9 - 0x7C280200, // 000D CALL R10 1 - 0x7C140A00, // 000E CALL R5 5 - 0x7C0C0400, // 000F CALL R3 2 - 0x80000000, // 0010 RET 0 + 0x8C080101, // 0001 GETMET R2 R0 K1 + 0x7C080200, // 0002 CALL R2 1 + 0x8C080302, // 0003 GETMET R2 R1 K2 + 0x60100018, // 0004 GETGBL R4 G24 + 0x58140003, // 0005 LDCONST R5 K3 + 0x8C180104, // 0006 GETMET R6 R0 K4 + 0x88200105, // 0007 GETMBR R8 R0 K5 + 0x7C180400, // 0008 CALL R6 2 + 0x8C1C0106, // 0009 GETMET R7 R0 K6 + 0x7C1C0200, // 000A CALL R7 1 + 0x8C200107, // 000B GETMET R8 R0 K7 + 0x7C200200, // 000C CALL R8 1 + 0x7C100800, // 000D CALL R4 4 + 0x7C080400, // 000E CALL R2 2 + 0x80000000, // 000F RET 0 }) ) ); @@ -219,7 +216,7 @@ be_local_closure(Matter_Plugin_Bridge_Light3_web_values, /* name */ ********************************************************************/ be_local_closure(Matter_Plugin_Bridge_Light3_web_value_RGB, /* name */ be_nested_proto( - 13, /* nstack */ + 12, /* nstack */ 1, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -227,74 +224,71 @@ be_local_closure(Matter_Plugin_Bridge_Light3_web_value_RGB, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[17]) { /* constants */ - /* K0 */ be_nested_str_weak(string), - /* K1 */ be_nested_str_weak(shadow_hue), - /* K2 */ be_nested_str_weak(shadow_sat), - /* K3 */ be_nested_str_weak(light_state), - /* K4 */ be_const_int(3), - /* K5 */ be_nested_str_weak(set_bri), - /* K6 */ be_nested_str_weak(set_huesat), - /* K7 */ be_nested_str_weak(tasmota), - /* K8 */ be_nested_str_weak(scale_uint), - /* K9 */ be_const_int(0), - /* K10 */ be_nested_str_weak(format), - /* K11 */ be_nested_str_weak(_X23_X2502X_X2502X_X2502X), - /* K12 */ be_nested_str_weak(r), - /* K13 */ be_nested_str_weak(g), - /* K14 */ be_nested_str_weak(b), - /* K15 */ be_nested_str_weak(_X3Ci_X20class_X3D_X22bxm_X22_X20style_X3D_X22_X2D_X2Dcl_X3A_X25s_X22_X3E_X3C_X2Fi_X3E_X25s), - /* K16 */ be_nested_str_weak(), + ( &(const bvalue[15]) { /* constants */ + /* K0 */ be_nested_str_weak(shadow_hue), + /* K1 */ be_nested_str_weak(shadow_sat), + /* K2 */ be_nested_str_weak(light_state), + /* K3 */ be_const_int(3), + /* K4 */ be_nested_str_weak(set_bri), + /* K5 */ be_nested_str_weak(set_huesat), + /* K6 */ be_nested_str_weak(tasmota), + /* K7 */ be_nested_str_weak(scale_uint), + /* K8 */ be_const_int(0), + /* K9 */ be_nested_str_weak(_X23_X2502X_X2502X_X2502X), + /* K10 */ be_nested_str_weak(r), + /* K11 */ be_nested_str_weak(g), + /* K12 */ be_nested_str_weak(b), + /* K13 */ be_nested_str_weak(_X3Ci_X20class_X3D_X22bxm_X22_X20style_X3D_X22_X2D_X2Dcl_X3A_X25s_X22_X3E_X3C_X2Fi_X3E_X25s), + /* K14 */ be_nested_str_weak(), }), be_str_weak(web_value_RGB), &be_const_str_solidified, - ( &(const binstruction[46]) { /* code */ - 0xA4060000, // 0000 IMPORT R1 K0 - 0x88080101, // 0001 GETMBR R2 R0 K1 - 0x4C0C0000, // 0002 LDNIL R3 - 0x20080403, // 0003 NE R2 R2 R3 - 0x780A0027, // 0004 JMPF R2 #002D - 0x88080102, // 0005 GETMBR R2 R0 K2 - 0x4C0C0000, // 0006 LDNIL R3 - 0x20080403, // 0007 NE R2 R2 R3 - 0x780A0023, // 0008 JMPF R2 #002D - 0xB80A0600, // 0009 GETNGBL R2 K3 - 0x580C0004, // 000A LDCONST R3 K4 - 0x7C080200, // 000B CALL R2 1 - 0x8C0C0505, // 000C GETMET R3 R2 K5 - 0x541600FE, // 000D LDINT R5 255 - 0x7C0C0400, // 000E CALL R3 2 - 0x8C0C0506, // 000F GETMET R3 R2 K6 - 0xB8160E00, // 0010 GETNGBL R5 K7 - 0x8C140B08, // 0011 GETMET R5 R5 K8 - 0x881C0101, // 0012 GETMBR R7 R0 K1 - 0x58200009, // 0013 LDCONST R8 K9 - 0x542600FD, // 0014 LDINT R9 254 - 0x58280009, // 0015 LDCONST R10 K9 - 0x542E0167, // 0016 LDINT R11 360 - 0x7C140C00, // 0017 CALL R5 6 - 0xB81A0E00, // 0018 GETNGBL R6 K7 - 0x8C180D08, // 0019 GETMET R6 R6 K8 - 0x88200102, // 001A GETMBR R8 R0 K2 - 0x58240009, // 001B LDCONST R9 K9 - 0x542A00FD, // 001C LDINT R10 254 - 0x582C0009, // 001D LDCONST R11 K9 - 0x543200FE, // 001E LDINT R12 255 - 0x7C180C00, // 001F CALL R6 6 - 0x7C0C0600, // 0020 CALL R3 3 - 0x8C0C030A, // 0021 GETMET R3 R1 K10 - 0x5814000B, // 0022 LDCONST R5 K11 - 0x8818050C, // 0023 GETMBR R6 R2 K12 - 0x881C050D, // 0024 GETMBR R7 R2 K13 - 0x8820050E, // 0025 GETMBR R8 R2 K14 - 0x7C0C0A00, // 0026 CALL R3 5 - 0x8C10030A, // 0027 GETMET R4 R1 K10 - 0x5818000F, // 0028 LDCONST R6 K15 - 0x5C1C0600, // 0029 MOVE R7 R3 - 0x5C200600, // 002A MOVE R8 R3 - 0x7C100800, // 002B CALL R4 4 - 0x80040800, // 002C RET 1 R4 - 0x80062000, // 002D RET 1 K16 + ( &(const binstruction[45]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x4C080000, // 0001 LDNIL R2 + 0x20040202, // 0002 NE R1 R1 R2 + 0x78060027, // 0003 JMPF R1 #002C + 0x88040101, // 0004 GETMBR R1 R0 K1 + 0x4C080000, // 0005 LDNIL R2 + 0x20040202, // 0006 NE R1 R1 R2 + 0x78060023, // 0007 JMPF R1 #002C + 0xB8060400, // 0008 GETNGBL R1 K2 + 0x58080003, // 0009 LDCONST R2 K3 + 0x7C040200, // 000A CALL R1 1 + 0x8C080304, // 000B GETMET R2 R1 K4 + 0x541200FE, // 000C LDINT R4 255 + 0x7C080400, // 000D CALL R2 2 + 0x8C080305, // 000E GETMET R2 R1 K5 + 0xB8120C00, // 000F GETNGBL R4 K6 + 0x8C100907, // 0010 GETMET R4 R4 K7 + 0x88180100, // 0011 GETMBR R6 R0 K0 + 0x581C0008, // 0012 LDCONST R7 K8 + 0x542200FD, // 0013 LDINT R8 254 + 0x58240008, // 0014 LDCONST R9 K8 + 0x542A0167, // 0015 LDINT R10 360 + 0x7C100C00, // 0016 CALL R4 6 + 0xB8160C00, // 0017 GETNGBL R5 K6 + 0x8C140B07, // 0018 GETMET R5 R5 K7 + 0x881C0101, // 0019 GETMBR R7 R0 K1 + 0x58200008, // 001A LDCONST R8 K8 + 0x542600FD, // 001B LDINT R9 254 + 0x58280008, // 001C LDCONST R10 K8 + 0x542E00FE, // 001D LDINT R11 255 + 0x7C140C00, // 001E CALL R5 6 + 0x7C080600, // 001F CALL R2 3 + 0x60080018, // 0020 GETGBL R2 G24 + 0x580C0009, // 0021 LDCONST R3 K9 + 0x8810030A, // 0022 GETMBR R4 R1 K10 + 0x8814030B, // 0023 GETMBR R5 R1 K11 + 0x8818030C, // 0024 GETMBR R6 R1 K12 + 0x7C080800, // 0025 CALL R2 4 + 0x600C0018, // 0026 GETGBL R3 G24 + 0x5810000D, // 0027 LDCONST R4 K13 + 0x5C140400, // 0028 MOVE R5 R2 + 0x5C180400, // 0029 MOVE R6 R2 + 0x7C0C0600, // 002A CALL R3 3 + 0x80040600, // 002B RET 1 R3 + 0x80061C00, // 002C RET 1 K14 }) ) ); @@ -454,7 +448,7 @@ be_local_closure(Matter_Plugin_Bridge_Light3_invoke_request, /* name */ ********************************************************************/ be_local_closure(Matter_Plugin_Bridge_Light3_read_attribute, /* name */ be_nested_proto( - 11, /* nstack */ + 10, /* nstack */ 3, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -462,153 +456,151 @@ be_local_closure(Matter_Plugin_Bridge_Light3_read_attribute, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[15]) { /* constants */ - /* K0 */ be_nested_str_weak(string), - /* K1 */ be_nested_str_weak(matter), - /* K2 */ be_nested_str_weak(TLV), - /* K3 */ be_nested_str_weak(cluster), - /* K4 */ be_nested_str_weak(attribute), - /* K5 */ be_nested_str_weak(update_shadow_lazy), - /* K6 */ be_const_int(0), - /* K7 */ be_nested_str_weak(shadow_hue), - /* K8 */ be_nested_str_weak(create_TLV), - /* K9 */ be_nested_str_weak(U1), - /* K10 */ be_nested_str_weak(NULL), - /* K11 */ be_const_int(1), - /* K12 */ be_nested_str_weak(shadow_sat), - /* K13 */ be_nested_str_weak(U4), - /* K14 */ be_nested_str_weak(read_attribute), + ( &(const bvalue[14]) { /* constants */ + /* K0 */ be_nested_str_weak(matter), + /* K1 */ be_nested_str_weak(TLV), + /* K2 */ be_nested_str_weak(cluster), + /* K3 */ be_nested_str_weak(attribute), + /* K4 */ be_nested_str_weak(update_shadow_lazy), + /* K5 */ be_const_int(0), + /* K6 */ be_nested_str_weak(shadow_hue), + /* K7 */ be_nested_str_weak(create_TLV), + /* K8 */ be_nested_str_weak(U1), + /* K9 */ be_nested_str_weak(NULL), + /* K10 */ be_const_int(1), + /* K11 */ be_nested_str_weak(shadow_sat), + /* K12 */ be_nested_str_weak(U4), + /* K13 */ be_nested_str_weak(read_attribute), }), be_str_weak(read_attribute), &be_const_str_solidified, - ( &(const binstruction[127]) { /* code */ - 0xA40E0000, // 0000 IMPORT R3 K0 - 0xB8120200, // 0001 GETNGBL R4 K1 - 0x88100902, // 0002 GETMBR R4 R4 K2 + ( &(const binstruction[126]) { /* code */ + 0xB80E0000, // 0000 GETNGBL R3 K0 + 0x880C0701, // 0001 GETMBR R3 R3 K1 + 0x88100502, // 0002 GETMBR R4 R2 K2 0x88140503, // 0003 GETMBR R5 R2 K3 - 0x88180504, // 0004 GETMBR R6 R2 K4 - 0x541E02FF, // 0005 LDINT R7 768 - 0x1C1C0A07, // 0006 EQ R7 R5 R7 - 0x781E006D, // 0007 JMPF R7 #0076 - 0x8C1C0105, // 0008 GETMET R7 R0 K5 - 0x7C1C0200, // 0009 CALL R7 1 - 0x1C1C0D06, // 000A EQ R7 R6 K6 - 0x781E000F, // 000B JMPF R7 #001C - 0x881C0107, // 000C GETMBR R7 R0 K7 - 0x4C200000, // 000D LDNIL R8 - 0x201C0E08, // 000E NE R7 R7 R8 - 0x781E0005, // 000F JMPF R7 #0016 - 0x8C1C0908, // 0010 GETMET R7 R4 K8 - 0x88240909, // 0011 GETMBR R9 R4 K9 - 0x88280107, // 0012 GETMBR R10 R0 K7 - 0x7C1C0600, // 0013 CALL R7 3 - 0x80040E00, // 0014 RET 1 R7 - 0x70020004, // 0015 JMP #001B - 0x8C1C0908, // 0016 GETMET R7 R4 K8 - 0x8824090A, // 0017 GETMBR R9 R4 K10 - 0x4C280000, // 0018 LDNIL R10 - 0x7C1C0600, // 0019 CALL R7 3 - 0x80040E00, // 001A RET 1 R7 - 0x70020058, // 001B JMP #0075 - 0x1C1C0D0B, // 001C EQ R7 R6 K11 - 0x781E000F, // 001D JMPF R7 #002E - 0x881C010C, // 001E GETMBR R7 R0 K12 - 0x4C200000, // 001F LDNIL R8 - 0x201C0E08, // 0020 NE R7 R7 R8 - 0x781E0005, // 0021 JMPF R7 #0028 - 0x8C1C0908, // 0022 GETMET R7 R4 K8 - 0x88240909, // 0023 GETMBR R9 R4 K9 - 0x8828010C, // 0024 GETMBR R10 R0 K12 - 0x7C1C0600, // 0025 CALL R7 3 - 0x80040E00, // 0026 RET 1 R7 - 0x70020004, // 0027 JMP #002D - 0x8C1C0908, // 0028 GETMET R7 R4 K8 - 0x8824090A, // 0029 GETMBR R9 R4 K10 - 0x4C280000, // 002A LDNIL R10 - 0x7C1C0600, // 002B CALL R7 3 - 0x80040E00, // 002C RET 1 R7 - 0x70020046, // 002D JMP #0075 - 0x541E0006, // 002E LDINT R7 7 - 0x1C1C0C07, // 002F EQ R7 R6 R7 - 0x781E0005, // 0030 JMPF R7 #0037 - 0x8C1C0908, // 0031 GETMET R7 R4 K8 - 0x88240909, // 0032 GETMBR R9 R4 K9 - 0x58280006, // 0033 LDCONST R10 K6 - 0x7C1C0600, // 0034 CALL R7 3 - 0x80040E00, // 0035 RET 1 R7 - 0x7002003D, // 0036 JMP #0075 - 0x541E0007, // 0037 LDINT R7 8 - 0x1C1C0C07, // 0038 EQ R7 R6 R7 - 0x781E0005, // 0039 JMPF R7 #0040 - 0x8C1C0908, // 003A GETMET R7 R4 K8 - 0x88240909, // 003B GETMBR R9 R4 K9 - 0x58280006, // 003C LDCONST R10 K6 - 0x7C1C0600, // 003D CALL R7 3 - 0x80040E00, // 003E RET 1 R7 - 0x70020034, // 003F JMP #0075 - 0x541E000E, // 0040 LDINT R7 15 - 0x1C1C0C07, // 0041 EQ R7 R6 R7 - 0x781E0005, // 0042 JMPF R7 #0049 - 0x8C1C0908, // 0043 GETMET R7 R4 K8 - 0x88240909, // 0044 GETMBR R9 R4 K9 - 0x58280006, // 0045 LDCONST R10 K6 - 0x7C1C0600, // 0046 CALL R7 3 - 0x80040E00, // 0047 RET 1 R7 - 0x7002002B, // 0048 JMP #0075 - 0x541E4000, // 0049 LDINT R7 16385 - 0x1C1C0C07, // 004A EQ R7 R6 R7 - 0x781E0005, // 004B JMPF R7 #0052 - 0x8C1C0908, // 004C GETMET R7 R4 K8 - 0x88240909, // 004D GETMBR R9 R4 K9 - 0x58280006, // 004E LDCONST R10 K6 - 0x7C1C0600, // 004F CALL R7 3 - 0x80040E00, // 0050 RET 1 R7 - 0x70020022, // 0051 JMP #0075 - 0x541E4009, // 0052 LDINT R7 16394 - 0x1C1C0C07, // 0053 EQ R7 R6 R7 - 0x781E0005, // 0054 JMPF R7 #005B - 0x8C1C0908, // 0055 GETMET R7 R4 K8 - 0x8824090D, // 0056 GETMBR R9 R4 K13 - 0x5828000B, // 0057 LDCONST R10 K11 - 0x7C1C0600, // 0058 CALL R7 3 - 0x80040E00, // 0059 RET 1 R7 - 0x70020019, // 005A JMP #0075 - 0x541E000F, // 005B LDINT R7 16 - 0x1C1C0C07, // 005C EQ R7 R6 R7 - 0x781E0005, // 005D JMPF R7 #0064 - 0x8C1C0908, // 005E GETMET R7 R4 K8 - 0x88240909, // 005F GETMBR R9 R4 K9 - 0x58280006, // 0060 LDCONST R10 K6 - 0x7C1C0600, // 0061 CALL R7 3 - 0x80040E00, // 0062 RET 1 R7 - 0x70020010, // 0063 JMP #0075 - 0x541EFFFB, // 0064 LDINT R7 65532 - 0x1C1C0C07, // 0065 EQ R7 R6 R7 - 0x781E0005, // 0066 JMPF R7 #006D - 0x8C1C0908, // 0067 GETMET R7 R4 K8 - 0x8824090D, // 0068 GETMBR R9 R4 K13 - 0x5828000B, // 0069 LDCONST R10 K11 - 0x7C1C0600, // 006A CALL R7 3 - 0x80040E00, // 006B RET 1 R7 - 0x70020007, // 006C JMP #0075 - 0x541EFFFC, // 006D LDINT R7 65533 - 0x1C1C0C07, // 006E EQ R7 R6 R7 - 0x781E0004, // 006F JMPF R7 #0075 - 0x8C1C0908, // 0070 GETMET R7 R4 K8 - 0x8824090D, // 0071 GETMBR R9 R4 K13 - 0x542A0004, // 0072 LDINT R10 5 - 0x7C1C0600, // 0073 CALL R7 3 - 0x80040E00, // 0074 RET 1 R7 - 0x70020007, // 0075 JMP #007E - 0x601C0003, // 0076 GETGBL R7 G3 - 0x5C200000, // 0077 MOVE R8 R0 - 0x7C1C0200, // 0078 CALL R7 1 - 0x8C1C0F0E, // 0079 GETMET R7 R7 K14 - 0x5C240200, // 007A MOVE R9 R1 - 0x5C280400, // 007B MOVE R10 R2 - 0x7C1C0600, // 007C CALL R7 3 - 0x80040E00, // 007D RET 1 R7 - 0x80000000, // 007E RET 0 + 0x541A02FF, // 0004 LDINT R6 768 + 0x1C180806, // 0005 EQ R6 R4 R6 + 0x781A006D, // 0006 JMPF R6 #0075 + 0x8C180104, // 0007 GETMET R6 R0 K4 + 0x7C180200, // 0008 CALL R6 1 + 0x1C180B05, // 0009 EQ R6 R5 K5 + 0x781A000F, // 000A JMPF R6 #001B + 0x88180106, // 000B GETMBR R6 R0 K6 + 0x4C1C0000, // 000C LDNIL R7 + 0x20180C07, // 000D NE R6 R6 R7 + 0x781A0005, // 000E JMPF R6 #0015 + 0x8C180707, // 000F GETMET R6 R3 K7 + 0x88200708, // 0010 GETMBR R8 R3 K8 + 0x88240106, // 0011 GETMBR R9 R0 K6 + 0x7C180600, // 0012 CALL R6 3 + 0x80040C00, // 0013 RET 1 R6 + 0x70020004, // 0014 JMP #001A + 0x8C180707, // 0015 GETMET R6 R3 K7 + 0x88200709, // 0016 GETMBR R8 R3 K9 + 0x4C240000, // 0017 LDNIL R9 + 0x7C180600, // 0018 CALL R6 3 + 0x80040C00, // 0019 RET 1 R6 + 0x70020058, // 001A JMP #0074 + 0x1C180B0A, // 001B EQ R6 R5 K10 + 0x781A000F, // 001C JMPF R6 #002D + 0x8818010B, // 001D GETMBR R6 R0 K11 + 0x4C1C0000, // 001E LDNIL R7 + 0x20180C07, // 001F NE R6 R6 R7 + 0x781A0005, // 0020 JMPF R6 #0027 + 0x8C180707, // 0021 GETMET R6 R3 K7 + 0x88200708, // 0022 GETMBR R8 R3 K8 + 0x8824010B, // 0023 GETMBR R9 R0 K11 + 0x7C180600, // 0024 CALL R6 3 + 0x80040C00, // 0025 RET 1 R6 + 0x70020004, // 0026 JMP #002C + 0x8C180707, // 0027 GETMET R6 R3 K7 + 0x88200709, // 0028 GETMBR R8 R3 K9 + 0x4C240000, // 0029 LDNIL R9 + 0x7C180600, // 002A CALL R6 3 + 0x80040C00, // 002B RET 1 R6 + 0x70020046, // 002C JMP #0074 + 0x541A0006, // 002D LDINT R6 7 + 0x1C180A06, // 002E EQ R6 R5 R6 + 0x781A0005, // 002F JMPF R6 #0036 + 0x8C180707, // 0030 GETMET R6 R3 K7 + 0x88200708, // 0031 GETMBR R8 R3 K8 + 0x58240005, // 0032 LDCONST R9 K5 + 0x7C180600, // 0033 CALL R6 3 + 0x80040C00, // 0034 RET 1 R6 + 0x7002003D, // 0035 JMP #0074 + 0x541A0007, // 0036 LDINT R6 8 + 0x1C180A06, // 0037 EQ R6 R5 R6 + 0x781A0005, // 0038 JMPF R6 #003F + 0x8C180707, // 0039 GETMET R6 R3 K7 + 0x88200708, // 003A GETMBR R8 R3 K8 + 0x58240005, // 003B LDCONST R9 K5 + 0x7C180600, // 003C CALL R6 3 + 0x80040C00, // 003D RET 1 R6 + 0x70020034, // 003E JMP #0074 + 0x541A000E, // 003F LDINT R6 15 + 0x1C180A06, // 0040 EQ R6 R5 R6 + 0x781A0005, // 0041 JMPF R6 #0048 + 0x8C180707, // 0042 GETMET R6 R3 K7 + 0x88200708, // 0043 GETMBR R8 R3 K8 + 0x58240005, // 0044 LDCONST R9 K5 + 0x7C180600, // 0045 CALL R6 3 + 0x80040C00, // 0046 RET 1 R6 + 0x7002002B, // 0047 JMP #0074 + 0x541A4000, // 0048 LDINT R6 16385 + 0x1C180A06, // 0049 EQ R6 R5 R6 + 0x781A0005, // 004A JMPF R6 #0051 + 0x8C180707, // 004B GETMET R6 R3 K7 + 0x88200708, // 004C GETMBR R8 R3 K8 + 0x58240005, // 004D LDCONST R9 K5 + 0x7C180600, // 004E CALL R6 3 + 0x80040C00, // 004F RET 1 R6 + 0x70020022, // 0050 JMP #0074 + 0x541A4009, // 0051 LDINT R6 16394 + 0x1C180A06, // 0052 EQ R6 R5 R6 + 0x781A0005, // 0053 JMPF R6 #005A + 0x8C180707, // 0054 GETMET R6 R3 K7 + 0x8820070C, // 0055 GETMBR R8 R3 K12 + 0x5824000A, // 0056 LDCONST R9 K10 + 0x7C180600, // 0057 CALL R6 3 + 0x80040C00, // 0058 RET 1 R6 + 0x70020019, // 0059 JMP #0074 + 0x541A000F, // 005A LDINT R6 16 + 0x1C180A06, // 005B EQ R6 R5 R6 + 0x781A0005, // 005C JMPF R6 #0063 + 0x8C180707, // 005D GETMET R6 R3 K7 + 0x88200708, // 005E GETMBR R8 R3 K8 + 0x58240005, // 005F LDCONST R9 K5 + 0x7C180600, // 0060 CALL R6 3 + 0x80040C00, // 0061 RET 1 R6 + 0x70020010, // 0062 JMP #0074 + 0x541AFFFB, // 0063 LDINT R6 65532 + 0x1C180A06, // 0064 EQ R6 R5 R6 + 0x781A0005, // 0065 JMPF R6 #006C + 0x8C180707, // 0066 GETMET R6 R3 K7 + 0x8820070C, // 0067 GETMBR R8 R3 K12 + 0x5824000A, // 0068 LDCONST R9 K10 + 0x7C180600, // 0069 CALL R6 3 + 0x80040C00, // 006A RET 1 R6 + 0x70020007, // 006B JMP #0074 + 0x541AFFFC, // 006C LDINT R6 65533 + 0x1C180A06, // 006D EQ R6 R5 R6 + 0x781A0004, // 006E JMPF R6 #0074 + 0x8C180707, // 006F GETMET R6 R3 K7 + 0x8820070C, // 0070 GETMBR R8 R3 K12 + 0x54260004, // 0071 LDINT R9 5 + 0x7C180600, // 0072 CALL R6 3 + 0x80040C00, // 0073 RET 1 R6 + 0x70020007, // 0074 JMP #007D + 0x60180003, // 0075 GETGBL R6 G3 + 0x5C1C0000, // 0076 MOVE R7 R0 + 0x7C180200, // 0077 CALL R6 1 + 0x8C180D0D, // 0078 GETMET R6 R6 K13 + 0x5C200200, // 0079 MOVE R8 R1 + 0x5C240400, // 007A MOVE R9 R2 + 0x7C180600, // 007B CALL R6 3 + 0x80040C00, // 007C RET 1 R6 + 0x80000000, // 007D RET 0 }) ) ); diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_OnOff.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_OnOff.h index 120db92c9..2c86b4398 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_OnOff.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_OnOff.h @@ -11,7 +11,7 @@ extern const bclass be_class_Matter_Plugin_Bridge_OnOff; ********************************************************************/ be_local_closure(Matter_Plugin_Bridge_OnOff_web_values, /* name */ be_nested_proto( - 12, /* nstack */ + 10, /* nstack */ 1, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -19,34 +19,31 @@ be_local_closure(Matter_Plugin_Bridge_OnOff_web_values, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[ 9]) { /* constants */ + ( &(const bvalue[ 7]) { /* constants */ /* K0 */ be_nested_str_weak(webserver), - /* K1 */ be_nested_str_weak(string), - /* K2 */ be_nested_str_weak(web_values_prefix), - /* K3 */ be_nested_str_weak(content_send), - /* K4 */ be_nested_str_weak(format), - /* K5 */ be_nested_str_weak(Relay_X20_X25i_X20_X25s), - /* K6 */ be_nested_str_weak(tasmota_relay_index), - /* K7 */ be_nested_str_weak(web_value_onoff), - /* K8 */ be_nested_str_weak(shadow_onoff), + /* K1 */ be_nested_str_weak(web_values_prefix), + /* K2 */ be_nested_str_weak(content_send), + /* K3 */ be_nested_str_weak(Relay_X20_X25i_X20_X25s), + /* K4 */ be_nested_str_weak(tasmota_relay_index), + /* K5 */ be_nested_str_weak(web_value_onoff), + /* K6 */ be_nested_str_weak(shadow_onoff), }), be_str_weak(web_values), &be_const_str_solidified, - ( &(const binstruction[14]) { /* code */ + ( &(const binstruction[13]) { /* code */ 0xA4060000, // 0000 IMPORT R1 K0 - 0xA40A0200, // 0001 IMPORT R2 K1 - 0x8C0C0102, // 0002 GETMET R3 R0 K2 - 0x7C0C0200, // 0003 CALL R3 1 - 0x8C0C0303, // 0004 GETMET R3 R1 K3 - 0x8C140504, // 0005 GETMET R5 R2 K4 - 0x581C0005, // 0006 LDCONST R7 K5 - 0x88200106, // 0007 GETMBR R8 R0 K6 - 0x8C240107, // 0008 GETMET R9 R0 K7 - 0x882C0108, // 0009 GETMBR R11 R0 K8 - 0x7C240400, // 000A CALL R9 2 - 0x7C140800, // 000B CALL R5 4 - 0x7C0C0400, // 000C CALL R3 2 - 0x80000000, // 000D RET 0 + 0x8C080101, // 0001 GETMET R2 R0 K1 + 0x7C080200, // 0002 CALL R2 1 + 0x8C080302, // 0003 GETMET R2 R1 K2 + 0x60100018, // 0004 GETGBL R4 G24 + 0x58140003, // 0005 LDCONST R5 K3 + 0x88180104, // 0006 GETMBR R6 R0 K4 + 0x8C1C0105, // 0007 GETMET R7 R0 K5 + 0x88240106, // 0008 GETMBR R9 R0 K6 + 0x7C1C0400, // 0009 CALL R7 2 + 0x7C100600, // 000A CALL R4 3 + 0x7C080400, // 000B CALL R2 2 + 0x80000000, // 000C RET 0 }) ) ); diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Sensor.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Sensor.h index 383498411..97d255b37 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Sensor.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Sensor.h @@ -11,7 +11,7 @@ extern const bclass be_class_Matter_Plugin_Bridge_Sensor; ********************************************************************/ be_local_closure(Matter_Plugin_Bridge_Sensor_web_values_prefix, /* name */ be_nested_proto( - 12, /* nstack */ + 10, /* nstack */ 1, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -19,41 +19,38 @@ be_local_closure(Matter_Plugin_Bridge_Sensor_web_values_prefix, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[ 9]) { /* constants */ + ( &(const bvalue[ 7]) { /* constants */ /* K0 */ be_nested_str_weak(webserver), - /* K1 */ be_nested_str_weak(string), - /* K2 */ be_nested_str_weak(get_name), - /* K3 */ be_nested_str_weak(filter_name_html), - /* K4 */ be_nested_str_weak(content_send), - /* K5 */ be_nested_str_weak(format), - /* K6 */ be_nested_str_weak(PREFIX), - /* K7 */ be_nested_str_weak(html_escape), - /* K8 */ be_nested_str_weak(), + /* K1 */ be_nested_str_weak(get_name), + /* K2 */ be_nested_str_weak(filter_name_html), + /* K3 */ be_nested_str_weak(content_send), + /* K4 */ be_nested_str_weak(PREFIX), + /* K5 */ be_nested_str_weak(html_escape), + /* K6 */ be_nested_str_weak(), }), be_str_weak(web_values_prefix), &be_const_str_solidified, - ( &(const binstruction[21]) { /* code */ + ( &(const binstruction[20]) { /* code */ 0xA4060000, // 0000 IMPORT R1 K0 - 0xA40A0200, // 0001 IMPORT R2 K1 - 0x8C0C0102, // 0002 GETMET R3 R0 K2 - 0x7C0C0200, // 0003 CALL R3 1 - 0x5C100600, // 0004 MOVE R4 R3 - 0x74120002, // 0005 JMPT R4 #0009 - 0x8C100103, // 0006 GETMET R4 R0 K3 - 0x7C100200, // 0007 CALL R4 1 - 0x5C0C0800, // 0008 MOVE R3 R4 - 0x8C100304, // 0009 GETMET R4 R1 K4 - 0x8C180505, // 000A GETMET R6 R2 K5 - 0x88200106, // 000B GETMBR R8 R0 K6 - 0x780E0003, // 000C JMPF R3 #0011 - 0x8C240307, // 000D GETMET R9 R1 K7 - 0x5C2C0600, // 000E MOVE R11 R3 - 0x7C240400, // 000F CALL R9 2 - 0x70020000, // 0010 JMP #0012 - 0x58240008, // 0011 LDCONST R9 K8 - 0x7C180600, // 0012 CALL R6 3 - 0x7C100400, // 0013 CALL R4 2 - 0x80000000, // 0014 RET 0 + 0x8C080101, // 0001 GETMET R2 R0 K1 + 0x7C080200, // 0002 CALL R2 1 + 0x5C0C0400, // 0003 MOVE R3 R2 + 0x740E0002, // 0004 JMPT R3 #0008 + 0x8C0C0102, // 0005 GETMET R3 R0 K2 + 0x7C0C0200, // 0006 CALL R3 1 + 0x5C080600, // 0007 MOVE R2 R3 + 0x8C0C0303, // 0008 GETMET R3 R1 K3 + 0x60140018, // 0009 GETGBL R5 G24 + 0x88180104, // 000A GETMBR R6 R0 K4 + 0x780A0003, // 000B JMPF R2 #0010 + 0x8C1C0305, // 000C GETMET R7 R1 K5 + 0x5C240400, // 000D MOVE R9 R2 + 0x7C1C0400, // 000E CALL R7 2 + 0x70020000, // 000F JMP #0011 + 0x581C0006, // 0010 LDCONST R7 K6 + 0x7C140400, // 0011 CALL R5 2 + 0x7C0C0400, // 0012 CALL R3 2 + 0x80000000, // 0013 RET 0 }) ) ); diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Sensor_Contact.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Sensor_Contact.h index b79822f04..1b781aebe 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Sensor_Contact.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Sensor_Contact.h @@ -88,7 +88,7 @@ be_local_closure(Matter_Plugin_Bridge_Sensor_Contact_init, /* name */ ********************************************************************/ be_local_closure(Matter_Plugin_Bridge_Sensor_Contact_web_values_prefix, /* name */ be_nested_proto( - 12, /* nstack */ + 10, /* nstack */ 1, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -96,44 +96,41 @@ be_local_closure(Matter_Plugin_Bridge_Sensor_Contact_web_values_prefix, /* nam 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[10]) { /* constants */ + ( &(const bvalue[ 8]) { /* constants */ /* K0 */ be_nested_str_weak(webserver), - /* K1 */ be_nested_str_weak(string), - /* K2 */ be_nested_str_weak(get_name), - /* K3 */ be_nested_str_weak(Switch), - /* K4 */ be_nested_str_weak(tasmota_switch_index), - /* K5 */ be_nested_str_weak(content_send), - /* K6 */ be_nested_str_weak(format), - /* K7 */ be_nested_str_weak(PREFIX), - /* K8 */ be_nested_str_weak(html_escape), - /* K9 */ be_nested_str_weak(), + /* K1 */ be_nested_str_weak(get_name), + /* K2 */ be_nested_str_weak(Switch), + /* K3 */ be_nested_str_weak(tasmota_switch_index), + /* K4 */ be_nested_str_weak(content_send), + /* K5 */ be_nested_str_weak(PREFIX), + /* K6 */ be_nested_str_weak(html_escape), + /* K7 */ be_nested_str_weak(), }), be_str_weak(web_values_prefix), &be_const_str_solidified, - ( &(const binstruction[23]) { /* code */ + ( &(const binstruction[22]) { /* code */ 0xA4060000, // 0000 IMPORT R1 K0 - 0xA40A0200, // 0001 IMPORT R2 K1 - 0x8C0C0102, // 0002 GETMET R3 R0 K2 - 0x7C0C0200, // 0003 CALL R3 1 - 0x5C100600, // 0004 MOVE R4 R3 - 0x74120004, // 0005 JMPT R4 #000B - 0x60100008, // 0006 GETGBL R4 G8 - 0x88140104, // 0007 GETMBR R5 R0 K4 - 0x7C100200, // 0008 CALL R4 1 - 0x00120604, // 0009 ADD R4 K3 R4 - 0x5C0C0800, // 000A MOVE R3 R4 - 0x8C100305, // 000B GETMET R4 R1 K5 - 0x8C180506, // 000C GETMET R6 R2 K6 - 0x88200107, // 000D GETMBR R8 R0 K7 - 0x780E0003, // 000E JMPF R3 #0013 - 0x8C240308, // 000F GETMET R9 R1 K8 - 0x5C2C0600, // 0010 MOVE R11 R3 - 0x7C240400, // 0011 CALL R9 2 - 0x70020000, // 0012 JMP #0014 - 0x58240009, // 0013 LDCONST R9 K9 - 0x7C180600, // 0014 CALL R6 3 - 0x7C100400, // 0015 CALL R4 2 - 0x80000000, // 0016 RET 0 + 0x8C080101, // 0001 GETMET R2 R0 K1 + 0x7C080200, // 0002 CALL R2 1 + 0x5C0C0400, // 0003 MOVE R3 R2 + 0x740E0004, // 0004 JMPT R3 #000A + 0x600C0008, // 0005 GETGBL R3 G8 + 0x88100103, // 0006 GETMBR R4 R0 K3 + 0x7C0C0200, // 0007 CALL R3 1 + 0x000E0403, // 0008 ADD R3 K2 R3 + 0x5C080600, // 0009 MOVE R2 R3 + 0x8C0C0304, // 000A GETMET R3 R1 K4 + 0x60140018, // 000B GETGBL R5 G24 + 0x88180105, // 000C GETMBR R6 R0 K5 + 0x780A0003, // 000D JMPF R2 #0012 + 0x8C1C0306, // 000E GETMET R7 R1 K6 + 0x5C240400, // 000F MOVE R9 R2 + 0x7C1C0400, // 0010 CALL R7 2 + 0x70020000, // 0011 JMP #0013 + 0x581C0007, // 0012 LDCONST R7 K7 + 0x7C140400, // 0013 CALL R5 2 + 0x7C0C0400, // 0014 CALL R3 2 + 0x80000000, // 0015 RET 0 }) ) ); @@ -204,7 +201,7 @@ be_local_closure(Matter_Plugin_Bridge_Sensor_Contact_parse_update, /* name */ ********************************************************************/ be_local_closure(Matter_Plugin_Bridge_Sensor_Contact_read_attribute, /* name */ be_nested_proto( - 11, /* nstack */ + 10, /* nstack */ 3, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -212,77 +209,75 @@ be_local_closure(Matter_Plugin_Bridge_Sensor_Contact_read_attribute, /* name * 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[13]) { /* constants */ - /* K0 */ be_nested_str_weak(string), - /* K1 */ be_nested_str_weak(matter), - /* K2 */ be_nested_str_weak(TLV), - /* K3 */ be_nested_str_weak(cluster), - /* K4 */ be_nested_str_weak(attribute), - /* K5 */ be_const_int(0), - /* K6 */ be_nested_str_weak(shadow_contact), - /* K7 */ be_nested_str_weak(create_TLV), - /* K8 */ be_nested_str_weak(BOOL), - /* K9 */ be_nested_str_weak(NULL), - /* K10 */ be_nested_str_weak(U4), - /* K11 */ be_const_int(1), - /* K12 */ be_nested_str_weak(read_attribute), + ( &(const bvalue[12]) { /* constants */ + /* K0 */ be_nested_str_weak(matter), + /* K1 */ be_nested_str_weak(TLV), + /* K2 */ be_nested_str_weak(cluster), + /* K3 */ be_nested_str_weak(attribute), + /* K4 */ be_const_int(0), + /* K5 */ be_nested_str_weak(shadow_contact), + /* K6 */ be_nested_str_weak(create_TLV), + /* K7 */ be_nested_str_weak(BOOL), + /* K8 */ be_nested_str_weak(NULL), + /* K9 */ be_nested_str_weak(U4), + /* K10 */ be_const_int(1), + /* K11 */ be_nested_str_weak(read_attribute), }), be_str_weak(read_attribute), &be_const_str_solidified, - ( &(const binstruction[53]) { /* code */ - 0xA40E0000, // 0000 IMPORT R3 K0 - 0xB8120200, // 0001 GETNGBL R4 K1 - 0x88100902, // 0002 GETMBR R4 R4 K2 + ( &(const binstruction[52]) { /* code */ + 0xB80E0000, // 0000 GETNGBL R3 K0 + 0x880C0701, // 0001 GETMBR R3 R3 K1 + 0x88100502, // 0002 GETMBR R4 R2 K2 0x88140503, // 0003 GETMBR R5 R2 K3 - 0x88180504, // 0004 GETMBR R6 R2 K4 - 0x541E0044, // 0005 LDINT R7 69 - 0x1C1C0A07, // 0006 EQ R7 R5 R7 - 0x781E0023, // 0007 JMPF R7 #002C - 0x1C1C0D05, // 0008 EQ R7 R6 K5 - 0x781E000F, // 0009 JMPF R7 #001A - 0x881C0106, // 000A GETMBR R7 R0 K6 - 0x4C200000, // 000B LDNIL R8 - 0x201C0E08, // 000C NE R7 R7 R8 - 0x781E0005, // 000D JMPF R7 #0014 - 0x8C1C0907, // 000E GETMET R7 R4 K7 - 0x88240908, // 000F GETMBR R9 R4 K8 - 0x88280106, // 0010 GETMBR R10 R0 K6 - 0x7C1C0600, // 0011 CALL R7 3 - 0x80040E00, // 0012 RET 1 R7 - 0x70020004, // 0013 JMP #0019 - 0x8C1C0907, // 0014 GETMET R7 R4 K7 - 0x88240909, // 0015 GETMBR R9 R4 K9 - 0x4C280000, // 0016 LDNIL R10 - 0x7C1C0600, // 0017 CALL R7 3 - 0x80040E00, // 0018 RET 1 R7 - 0x70020010, // 0019 JMP #002B - 0x541EFFFB, // 001A LDINT R7 65532 - 0x1C1C0C07, // 001B EQ R7 R6 R7 - 0x781E0005, // 001C JMPF R7 #0023 - 0x8C1C0907, // 001D GETMET R7 R4 K7 - 0x8824090A, // 001E GETMBR R9 R4 K10 - 0x58280005, // 001F LDCONST R10 K5 - 0x7C1C0600, // 0020 CALL R7 3 - 0x80040E00, // 0021 RET 1 R7 - 0x70020007, // 0022 JMP #002B - 0x541EFFFC, // 0023 LDINT R7 65533 - 0x1C1C0C07, // 0024 EQ R7 R6 R7 - 0x781E0004, // 0025 JMPF R7 #002B - 0x8C1C0907, // 0026 GETMET R7 R4 K7 - 0x8824090A, // 0027 GETMBR R9 R4 K10 - 0x5828000B, // 0028 LDCONST R10 K11 - 0x7C1C0600, // 0029 CALL R7 3 - 0x80040E00, // 002A RET 1 R7 - 0x70020007, // 002B JMP #0034 - 0x601C0003, // 002C GETGBL R7 G3 - 0x5C200000, // 002D MOVE R8 R0 - 0x7C1C0200, // 002E CALL R7 1 - 0x8C1C0F0C, // 002F GETMET R7 R7 K12 - 0x5C240200, // 0030 MOVE R9 R1 - 0x5C280400, // 0031 MOVE R10 R2 - 0x7C1C0600, // 0032 CALL R7 3 - 0x80040E00, // 0033 RET 1 R7 - 0x80000000, // 0034 RET 0 + 0x541A0044, // 0004 LDINT R6 69 + 0x1C180806, // 0005 EQ R6 R4 R6 + 0x781A0023, // 0006 JMPF R6 #002B + 0x1C180B04, // 0007 EQ R6 R5 K4 + 0x781A000F, // 0008 JMPF R6 #0019 + 0x88180105, // 0009 GETMBR R6 R0 K5 + 0x4C1C0000, // 000A LDNIL R7 + 0x20180C07, // 000B NE R6 R6 R7 + 0x781A0005, // 000C JMPF R6 #0013 + 0x8C180706, // 000D GETMET R6 R3 K6 + 0x88200707, // 000E GETMBR R8 R3 K7 + 0x88240105, // 000F GETMBR R9 R0 K5 + 0x7C180600, // 0010 CALL R6 3 + 0x80040C00, // 0011 RET 1 R6 + 0x70020004, // 0012 JMP #0018 + 0x8C180706, // 0013 GETMET R6 R3 K6 + 0x88200708, // 0014 GETMBR R8 R3 K8 + 0x4C240000, // 0015 LDNIL R9 + 0x7C180600, // 0016 CALL R6 3 + 0x80040C00, // 0017 RET 1 R6 + 0x70020010, // 0018 JMP #002A + 0x541AFFFB, // 0019 LDINT R6 65532 + 0x1C180A06, // 001A EQ R6 R5 R6 + 0x781A0005, // 001B JMPF R6 #0022 + 0x8C180706, // 001C GETMET R6 R3 K6 + 0x88200709, // 001D GETMBR R8 R3 K9 + 0x58240004, // 001E LDCONST R9 K4 + 0x7C180600, // 001F CALL R6 3 + 0x80040C00, // 0020 RET 1 R6 + 0x70020007, // 0021 JMP #002A + 0x541AFFFC, // 0022 LDINT R6 65533 + 0x1C180A06, // 0023 EQ R6 R5 R6 + 0x781A0004, // 0024 JMPF R6 #002A + 0x8C180706, // 0025 GETMET R6 R3 K6 + 0x88200709, // 0026 GETMBR R8 R3 K9 + 0x5824000A, // 0027 LDCONST R9 K10 + 0x7C180600, // 0028 CALL R6 3 + 0x80040C00, // 0029 RET 1 R6 + 0x70020007, // 002A JMP #0033 + 0x60180003, // 002B GETGBL R6 G3 + 0x5C1C0000, // 002C MOVE R7 R0 + 0x7C180200, // 002D CALL R6 1 + 0x8C180D0B, // 002E GETMET R6 R6 K11 + 0x5C200200, // 002F MOVE R8 R1 + 0x5C240400, // 0030 MOVE R9 R2 + 0x7C180600, // 0031 CALL R6 3 + 0x80040C00, // 0032 RET 1 R6 + 0x80000000, // 0033 RET 0 }) ) ); @@ -294,7 +289,7 @@ be_local_closure(Matter_Plugin_Bridge_Sensor_Contact_read_attribute, /* name * ********************************************************************/ be_local_closure(Matter_Plugin_Bridge_Sensor_Contact_web_values, /* name */ be_nested_proto( - 12, /* nstack */ + 10, /* nstack */ 1, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -302,34 +297,31 @@ be_local_closure(Matter_Plugin_Bridge_Sensor_Contact_web_values, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[ 9]) { /* constants */ + ( &(const bvalue[ 7]) { /* constants */ /* K0 */ be_nested_str_weak(webserver), - /* K1 */ be_nested_str_weak(string), - /* K2 */ be_nested_str_weak(web_values_prefix), - /* K3 */ be_nested_str_weak(content_send), - /* K4 */ be_nested_str_weak(format), - /* K5 */ be_nested_str_weak(Contact_X25i_X20_X25s), - /* K6 */ be_nested_str_weak(tasmota_switch_index), - /* K7 */ be_nested_str_weak(web_value_onoff), - /* K8 */ be_nested_str_weak(shadow_contact), + /* K1 */ be_nested_str_weak(web_values_prefix), + /* K2 */ be_nested_str_weak(content_send), + /* K3 */ be_nested_str_weak(Contact_X25i_X20_X25s), + /* K4 */ be_nested_str_weak(tasmota_switch_index), + /* K5 */ be_nested_str_weak(web_value_onoff), + /* K6 */ be_nested_str_weak(shadow_contact), }), be_str_weak(web_values), &be_const_str_solidified, - ( &(const binstruction[14]) { /* code */ + ( &(const binstruction[13]) { /* code */ 0xA4060000, // 0000 IMPORT R1 K0 - 0xA40A0200, // 0001 IMPORT R2 K1 - 0x8C0C0102, // 0002 GETMET R3 R0 K2 - 0x7C0C0200, // 0003 CALL R3 1 - 0x8C0C0303, // 0004 GETMET R3 R1 K3 - 0x8C140504, // 0005 GETMET R5 R2 K4 - 0x581C0005, // 0006 LDCONST R7 K5 - 0x88200106, // 0007 GETMBR R8 R0 K6 - 0x8C240107, // 0008 GETMET R9 R0 K7 - 0x882C0108, // 0009 GETMBR R11 R0 K8 - 0x7C240400, // 000A CALL R9 2 - 0x7C140800, // 000B CALL R5 4 - 0x7C0C0400, // 000C CALL R3 2 - 0x80000000, // 000D RET 0 + 0x8C080101, // 0001 GETMET R2 R0 K1 + 0x7C080200, // 0002 CALL R2 1 + 0x8C080302, // 0003 GETMET R2 R1 K2 + 0x60100018, // 0004 GETGBL R4 G24 + 0x58140003, // 0005 LDCONST R5 K3 + 0x88180104, // 0006 GETMBR R6 R0 K4 + 0x8C1C0105, // 0007 GETMET R7 R0 K5 + 0x88240106, // 0008 GETMBR R9 R0 K6 + 0x7C1C0400, // 0009 CALL R7 2 + 0x7C100600, // 000A CALL R4 3 + 0x7C080400, // 000B CALL R2 2 + 0x80000000, // 000C RET 0 }) ) ); diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Sensor_Humidity.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Sensor_Humidity.h index 7fce231a2..a1f03d75c 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Sensor_Humidity.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Sensor_Humidity.h @@ -44,7 +44,7 @@ be_local_closure(Matter_Plugin_Bridge_Sensor_Humidity_pre_value, /* name */ ********************************************************************/ be_local_closure(Matter_Plugin_Bridge_Sensor_Humidity_read_attribute, /* name */ be_nested_proto( - 12, /* nstack */ + 11, /* nstack */ 3, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -52,97 +52,95 @@ be_local_closure(Matter_Plugin_Bridge_Sensor_Humidity_read_attribute, /* name 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[15]) { /* constants */ - /* K0 */ be_nested_str_weak(string), - /* K1 */ be_nested_str_weak(matter), - /* K2 */ be_nested_str_weak(TLV), - /* K3 */ be_nested_str_weak(cluster), - /* K4 */ be_nested_str_weak(attribute), - /* K5 */ be_const_int(0), - /* K6 */ be_nested_str_weak(shadow_value), - /* K7 */ be_nested_str_weak(create_TLV), - /* K8 */ be_nested_str_weak(U2), - /* K9 */ be_nested_str_weak(NULL), - /* K10 */ be_const_int(1), - /* K11 */ be_const_int(2), - /* K12 */ be_nested_str_weak(U4), - /* K13 */ be_const_int(3), - /* K14 */ be_nested_str_weak(read_attribute), + ( &(const bvalue[14]) { /* constants */ + /* K0 */ be_nested_str_weak(matter), + /* K1 */ be_nested_str_weak(TLV), + /* K2 */ be_nested_str_weak(cluster), + /* K3 */ be_nested_str_weak(attribute), + /* K4 */ be_const_int(0), + /* K5 */ be_nested_str_weak(shadow_value), + /* K6 */ be_nested_str_weak(create_TLV), + /* K7 */ be_nested_str_weak(U2), + /* K8 */ be_nested_str_weak(NULL), + /* K9 */ be_const_int(1), + /* K10 */ be_const_int(2), + /* K11 */ be_nested_str_weak(U4), + /* K12 */ be_const_int(3), + /* K13 */ be_nested_str_weak(read_attribute), }), be_str_weak(read_attribute), &be_const_str_solidified, - ( &(const binstruction[71]) { /* code */ - 0xA40E0000, // 0000 IMPORT R3 K0 - 0xB8120200, // 0001 GETNGBL R4 K1 - 0x88100902, // 0002 GETMBR R4 R4 K2 + ( &(const binstruction[70]) { /* code */ + 0xB80E0000, // 0000 GETNGBL R3 K0 + 0x880C0701, // 0001 GETMBR R3 R3 K1 + 0x88100502, // 0002 GETMBR R4 R2 K2 0x88140503, // 0003 GETMBR R5 R2 K3 - 0x88180504, // 0004 GETMBR R6 R2 K4 - 0x541E0404, // 0005 LDINT R7 1029 - 0x1C1C0A07, // 0006 EQ R7 R5 R7 - 0x781E0035, // 0007 JMPF R7 #003E - 0x1C1C0D05, // 0008 EQ R7 R6 K5 - 0x781E0011, // 0009 JMPF R7 #001C - 0x881C0106, // 000A GETMBR R7 R0 K6 - 0x4C200000, // 000B LDNIL R8 - 0x201C0E08, // 000C NE R7 R7 R8 - 0x781E0007, // 000D JMPF R7 #0016 - 0x8C1C0907, // 000E GETMET R7 R4 K7 - 0x88240908, // 000F GETMBR R9 R4 K8 - 0x60280009, // 0010 GETGBL R10 G9 - 0x882C0106, // 0011 GETMBR R11 R0 K6 - 0x7C280200, // 0012 CALL R10 1 - 0x7C1C0600, // 0013 CALL R7 3 - 0x80040E00, // 0014 RET 1 R7 - 0x70020004, // 0015 JMP #001B - 0x8C1C0907, // 0016 GETMET R7 R4 K7 - 0x88240909, // 0017 GETMBR R9 R4 K9 - 0x4C280000, // 0018 LDNIL R10 - 0x7C1C0600, // 0019 CALL R7 3 - 0x80040E00, // 001A RET 1 R7 - 0x70020020, // 001B JMP #003D - 0x1C1C0D0A, // 001C EQ R7 R6 K10 - 0x781E0005, // 001D JMPF R7 #0024 - 0x8C1C0907, // 001E GETMET R7 R4 K7 - 0x88240908, // 001F GETMBR R9 R4 K8 - 0x542A01F3, // 0020 LDINT R10 500 - 0x7C1C0600, // 0021 CALL R7 3 - 0x80040E00, // 0022 RET 1 R7 - 0x70020018, // 0023 JMP #003D - 0x1C1C0D0B, // 0024 EQ R7 R6 K11 - 0x781E0005, // 0025 JMPF R7 #002C - 0x8C1C0907, // 0026 GETMET R7 R4 K7 - 0x88240908, // 0027 GETMBR R9 R4 K8 - 0x542A270F, // 0028 LDINT R10 10000 - 0x7C1C0600, // 0029 CALL R7 3 - 0x80040E00, // 002A RET 1 R7 - 0x70020010, // 002B JMP #003D - 0x541EFFFB, // 002C LDINT R7 65532 - 0x1C1C0C07, // 002D EQ R7 R6 R7 - 0x781E0005, // 002E JMPF R7 #0035 - 0x8C1C0907, // 002F GETMET R7 R4 K7 - 0x8824090C, // 0030 GETMBR R9 R4 K12 - 0x58280005, // 0031 LDCONST R10 K5 - 0x7C1C0600, // 0032 CALL R7 3 - 0x80040E00, // 0033 RET 1 R7 - 0x70020007, // 0034 JMP #003D - 0x541EFFFC, // 0035 LDINT R7 65533 - 0x1C1C0C07, // 0036 EQ R7 R6 R7 - 0x781E0004, // 0037 JMPF R7 #003D - 0x8C1C0907, // 0038 GETMET R7 R4 K7 - 0x8824090C, // 0039 GETMBR R9 R4 K12 - 0x5828000D, // 003A LDCONST R10 K13 - 0x7C1C0600, // 003B CALL R7 3 - 0x80040E00, // 003C RET 1 R7 - 0x70020007, // 003D JMP #0046 - 0x601C0003, // 003E GETGBL R7 G3 - 0x5C200000, // 003F MOVE R8 R0 - 0x7C1C0200, // 0040 CALL R7 1 - 0x8C1C0F0E, // 0041 GETMET R7 R7 K14 - 0x5C240200, // 0042 MOVE R9 R1 - 0x5C280400, // 0043 MOVE R10 R2 - 0x7C1C0600, // 0044 CALL R7 3 - 0x80040E00, // 0045 RET 1 R7 - 0x80000000, // 0046 RET 0 + 0x541A0404, // 0004 LDINT R6 1029 + 0x1C180806, // 0005 EQ R6 R4 R6 + 0x781A0035, // 0006 JMPF R6 #003D + 0x1C180B04, // 0007 EQ R6 R5 K4 + 0x781A0011, // 0008 JMPF R6 #001B + 0x88180105, // 0009 GETMBR R6 R0 K5 + 0x4C1C0000, // 000A LDNIL R7 + 0x20180C07, // 000B NE R6 R6 R7 + 0x781A0007, // 000C JMPF R6 #0015 + 0x8C180706, // 000D GETMET R6 R3 K6 + 0x88200707, // 000E GETMBR R8 R3 K7 + 0x60240009, // 000F GETGBL R9 G9 + 0x88280105, // 0010 GETMBR R10 R0 K5 + 0x7C240200, // 0011 CALL R9 1 + 0x7C180600, // 0012 CALL R6 3 + 0x80040C00, // 0013 RET 1 R6 + 0x70020004, // 0014 JMP #001A + 0x8C180706, // 0015 GETMET R6 R3 K6 + 0x88200708, // 0016 GETMBR R8 R3 K8 + 0x4C240000, // 0017 LDNIL R9 + 0x7C180600, // 0018 CALL R6 3 + 0x80040C00, // 0019 RET 1 R6 + 0x70020020, // 001A JMP #003C + 0x1C180B09, // 001B EQ R6 R5 K9 + 0x781A0005, // 001C JMPF R6 #0023 + 0x8C180706, // 001D GETMET R6 R3 K6 + 0x88200707, // 001E GETMBR R8 R3 K7 + 0x542601F3, // 001F LDINT R9 500 + 0x7C180600, // 0020 CALL R6 3 + 0x80040C00, // 0021 RET 1 R6 + 0x70020018, // 0022 JMP #003C + 0x1C180B0A, // 0023 EQ R6 R5 K10 + 0x781A0005, // 0024 JMPF R6 #002B + 0x8C180706, // 0025 GETMET R6 R3 K6 + 0x88200707, // 0026 GETMBR R8 R3 K7 + 0x5426270F, // 0027 LDINT R9 10000 + 0x7C180600, // 0028 CALL R6 3 + 0x80040C00, // 0029 RET 1 R6 + 0x70020010, // 002A JMP #003C + 0x541AFFFB, // 002B LDINT R6 65532 + 0x1C180A06, // 002C EQ R6 R5 R6 + 0x781A0005, // 002D JMPF R6 #0034 + 0x8C180706, // 002E GETMET R6 R3 K6 + 0x8820070B, // 002F GETMBR R8 R3 K11 + 0x58240004, // 0030 LDCONST R9 K4 + 0x7C180600, // 0031 CALL R6 3 + 0x80040C00, // 0032 RET 1 R6 + 0x70020007, // 0033 JMP #003C + 0x541AFFFC, // 0034 LDINT R6 65533 + 0x1C180A06, // 0035 EQ R6 R5 R6 + 0x781A0004, // 0036 JMPF R6 #003C + 0x8C180706, // 0037 GETMET R6 R3 K6 + 0x8820070B, // 0038 GETMBR R8 R3 K11 + 0x5824000C, // 0039 LDCONST R9 K12 + 0x7C180600, // 003A CALL R6 3 + 0x80040C00, // 003B RET 1 R6 + 0x70020007, // 003C JMP #0045 + 0x60180003, // 003D GETGBL R6 G3 + 0x5C1C0000, // 003E MOVE R7 R0 + 0x7C180200, // 003F CALL R6 1 + 0x8C180D0D, // 0040 GETMET R6 R6 K13 + 0x5C200200, // 0041 MOVE R8 R1 + 0x5C240400, // 0042 MOVE R9 R2 + 0x7C180600, // 0043 CALL R6 3 + 0x80040C00, // 0044 RET 1 R6 + 0x80000000, // 0045 RET 0 }) ) ); @@ -185,7 +183,7 @@ be_local_closure(Matter_Plugin_Bridge_Sensor_Humidity_value_changed, /* name * ********************************************************************/ be_local_closure(Matter_Plugin_Bridge_Sensor_Humidity_web_values, /* name */ be_nested_proto( - 10, /* nstack */ + 8, /* nstack */ 1, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -193,39 +191,36 @@ be_local_closure(Matter_Plugin_Bridge_Sensor_Humidity_web_values, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[ 7]) { /* constants */ + ( &(const bvalue[ 5]) { /* constants */ /* K0 */ be_nested_str_weak(webserver), - /* K1 */ be_nested_str_weak(string), - /* K2 */ be_nested_str_weak(web_values_prefix), - /* K3 */ be_nested_str_weak(content_send), - /* K4 */ be_nested_str_weak(format), - /* K5 */ be_nested_str_weak(_X26_X23x1F4A7_X3B_X20_X252_X2E0f_X25_X25), - /* K6 */ be_nested_str_weak(shadow_value), + /* K1 */ be_nested_str_weak(web_values_prefix), + /* K2 */ be_nested_str_weak(content_send), + /* K3 */ be_nested_str_weak(_X26_X23x1F4A7_X3B_X20_X252_X2E0f_X25_X25), + /* K4 */ be_nested_str_weak(shadow_value), }), be_str_weak(web_values), &be_const_str_solidified, - ( &(const binstruction[21]) { /* code */ + ( &(const binstruction[20]) { /* code */ 0xA4060000, // 0000 IMPORT R1 K0 - 0xA40A0200, // 0001 IMPORT R2 K1 - 0x8C0C0102, // 0002 GETMET R3 R0 K2 - 0x7C0C0200, // 0003 CALL R3 1 - 0x8C0C0303, // 0004 GETMET R3 R1 K3 - 0x8C140504, // 0005 GETMET R5 R2 K4 - 0x581C0005, // 0006 LDCONST R7 K5 - 0x88200106, // 0007 GETMBR R8 R0 K6 - 0x4C240000, // 0008 LDNIL R9 - 0x20201009, // 0009 NE R8 R8 R9 - 0x78220005, // 000A JMPF R8 #0011 - 0x6020000A, // 000B GETGBL R8 G10 - 0x88240106, // 000C GETMBR R9 R0 K6 - 0x7C200200, // 000D CALL R8 1 - 0x54260063, // 000E LDINT R9 100 - 0x0C201009, // 000F DIV R8 R8 R9 - 0x70020000, // 0010 JMP #0012 - 0x4C200000, // 0011 LDNIL R8 - 0x7C140600, // 0012 CALL R5 3 - 0x7C0C0400, // 0013 CALL R3 2 - 0x80000000, // 0014 RET 0 + 0x8C080101, // 0001 GETMET R2 R0 K1 + 0x7C080200, // 0002 CALL R2 1 + 0x8C080302, // 0003 GETMET R2 R1 K2 + 0x60100018, // 0004 GETGBL R4 G24 + 0x58140003, // 0005 LDCONST R5 K3 + 0x88180104, // 0006 GETMBR R6 R0 K4 + 0x4C1C0000, // 0007 LDNIL R7 + 0x20180C07, // 0008 NE R6 R6 R7 + 0x781A0005, // 0009 JMPF R6 #0010 + 0x6018000A, // 000A GETGBL R6 G10 + 0x881C0104, // 000B GETMBR R7 R0 K4 + 0x7C180200, // 000C CALL R6 1 + 0x541E0063, // 000D LDINT R7 100 + 0x0C180C07, // 000E DIV R6 R6 R7 + 0x70020000, // 000F JMP #0011 + 0x4C180000, // 0010 LDNIL R6 + 0x7C100400, // 0011 CALL R4 2 + 0x7C080400, // 0012 CALL R2 2 + 0x80000000, // 0013 RET 0 }) ) ); diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Sensor_Illuminance.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Sensor_Illuminance.h index 9a222e77b..e732c9cf3 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Sensor_Illuminance.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Sensor_Illuminance.h @@ -56,7 +56,7 @@ be_local_closure(Matter_Plugin_Bridge_Sensor_Illuminance_pre_value, /* name */ ********************************************************************/ be_local_closure(Matter_Plugin_Bridge_Sensor_Illuminance_read_attribute, /* name */ be_nested_proto( - 12, /* nstack */ + 11, /* nstack */ 3, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -64,97 +64,95 @@ be_local_closure(Matter_Plugin_Bridge_Sensor_Illuminance_read_attribute, /* na 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[15]) { /* constants */ - /* K0 */ be_nested_str_weak(string), - /* K1 */ be_nested_str_weak(matter), - /* K2 */ be_nested_str_weak(TLV), - /* K3 */ be_nested_str_weak(cluster), - /* K4 */ be_nested_str_weak(attribute), - /* K5 */ be_const_int(0), - /* K6 */ be_nested_str_weak(shadow_value), - /* K7 */ be_nested_str_weak(create_TLV), - /* K8 */ be_nested_str_weak(U2), - /* K9 */ be_nested_str_weak(NULL), - /* K10 */ be_const_int(1), - /* K11 */ be_const_int(2), - /* K12 */ be_nested_str_weak(U4), - /* K13 */ be_const_int(3), - /* K14 */ be_nested_str_weak(read_attribute), + ( &(const bvalue[14]) { /* constants */ + /* K0 */ be_nested_str_weak(matter), + /* K1 */ be_nested_str_weak(TLV), + /* K2 */ be_nested_str_weak(cluster), + /* K3 */ be_nested_str_weak(attribute), + /* K4 */ be_const_int(0), + /* K5 */ be_nested_str_weak(shadow_value), + /* K6 */ be_nested_str_weak(create_TLV), + /* K7 */ be_nested_str_weak(U2), + /* K8 */ be_nested_str_weak(NULL), + /* K9 */ be_const_int(1), + /* K10 */ be_const_int(2), + /* K11 */ be_nested_str_weak(U4), + /* K12 */ be_const_int(3), + /* K13 */ be_nested_str_weak(read_attribute), }), be_str_weak(read_attribute), &be_const_str_solidified, - ( &(const binstruction[71]) { /* code */ - 0xA40E0000, // 0000 IMPORT R3 K0 - 0xB8120200, // 0001 GETNGBL R4 K1 - 0x88100902, // 0002 GETMBR R4 R4 K2 + ( &(const binstruction[70]) { /* code */ + 0xB80E0000, // 0000 GETNGBL R3 K0 + 0x880C0701, // 0001 GETMBR R3 R3 K1 + 0x88100502, // 0002 GETMBR R4 R2 K2 0x88140503, // 0003 GETMBR R5 R2 K3 - 0x88180504, // 0004 GETMBR R6 R2 K4 - 0x541E03FF, // 0005 LDINT R7 1024 - 0x1C1C0A07, // 0006 EQ R7 R5 R7 - 0x781E0035, // 0007 JMPF R7 #003E - 0x1C1C0D05, // 0008 EQ R7 R6 K5 - 0x781E0011, // 0009 JMPF R7 #001C - 0x881C0106, // 000A GETMBR R7 R0 K6 - 0x4C200000, // 000B LDNIL R8 - 0x201C0E08, // 000C NE R7 R7 R8 - 0x781E0007, // 000D JMPF R7 #0016 - 0x8C1C0907, // 000E GETMET R7 R4 K7 - 0x88240908, // 000F GETMBR R9 R4 K8 - 0x60280009, // 0010 GETGBL R10 G9 - 0x882C0106, // 0011 GETMBR R11 R0 K6 - 0x7C280200, // 0012 CALL R10 1 - 0x7C1C0600, // 0013 CALL R7 3 - 0x80040E00, // 0014 RET 1 R7 - 0x70020004, // 0015 JMP #001B - 0x8C1C0907, // 0016 GETMET R7 R4 K7 - 0x88240909, // 0017 GETMBR R9 R4 K9 - 0x4C280000, // 0018 LDNIL R10 - 0x7C1C0600, // 0019 CALL R7 3 - 0x80040E00, // 001A RET 1 R7 - 0x70020020, // 001B JMP #003D - 0x1C1C0D0A, // 001C EQ R7 R6 K10 - 0x781E0005, // 001D JMPF R7 #0024 - 0x8C1C0907, // 001E GETMET R7 R4 K7 - 0x88240908, // 001F GETMBR R9 R4 K8 - 0x5828000A, // 0020 LDCONST R10 K10 - 0x7C1C0600, // 0021 CALL R7 3 - 0x80040E00, // 0022 RET 1 R7 - 0x70020018, // 0023 JMP #003D - 0x1C1C0D0B, // 0024 EQ R7 R6 K11 - 0x781E0005, // 0025 JMPF R7 #002C - 0x8C1C0907, // 0026 GETMET R7 R4 K7 - 0x88240908, // 0027 GETMBR R9 R4 K8 - 0x542AFFFD, // 0028 LDINT R10 65534 - 0x7C1C0600, // 0029 CALL R7 3 - 0x80040E00, // 002A RET 1 R7 - 0x70020010, // 002B JMP #003D - 0x541EFFFB, // 002C LDINT R7 65532 - 0x1C1C0C07, // 002D EQ R7 R6 R7 - 0x781E0005, // 002E JMPF R7 #0035 - 0x8C1C0907, // 002F GETMET R7 R4 K7 - 0x8824090C, // 0030 GETMBR R9 R4 K12 - 0x58280005, // 0031 LDCONST R10 K5 - 0x7C1C0600, // 0032 CALL R7 3 - 0x80040E00, // 0033 RET 1 R7 - 0x70020007, // 0034 JMP #003D - 0x541EFFFC, // 0035 LDINT R7 65533 - 0x1C1C0C07, // 0036 EQ R7 R6 R7 - 0x781E0004, // 0037 JMPF R7 #003D - 0x8C1C0907, // 0038 GETMET R7 R4 K7 - 0x8824090C, // 0039 GETMBR R9 R4 K12 - 0x5828000D, // 003A LDCONST R10 K13 - 0x7C1C0600, // 003B CALL R7 3 - 0x80040E00, // 003C RET 1 R7 - 0x70020007, // 003D JMP #0046 - 0x601C0003, // 003E GETGBL R7 G3 - 0x5C200000, // 003F MOVE R8 R0 - 0x7C1C0200, // 0040 CALL R7 1 - 0x8C1C0F0E, // 0041 GETMET R7 R7 K14 - 0x5C240200, // 0042 MOVE R9 R1 - 0x5C280400, // 0043 MOVE R10 R2 - 0x7C1C0600, // 0044 CALL R7 3 - 0x80040E00, // 0045 RET 1 R7 - 0x80000000, // 0046 RET 0 + 0x541A03FF, // 0004 LDINT R6 1024 + 0x1C180806, // 0005 EQ R6 R4 R6 + 0x781A0035, // 0006 JMPF R6 #003D + 0x1C180B04, // 0007 EQ R6 R5 K4 + 0x781A0011, // 0008 JMPF R6 #001B + 0x88180105, // 0009 GETMBR R6 R0 K5 + 0x4C1C0000, // 000A LDNIL R7 + 0x20180C07, // 000B NE R6 R6 R7 + 0x781A0007, // 000C JMPF R6 #0015 + 0x8C180706, // 000D GETMET R6 R3 K6 + 0x88200707, // 000E GETMBR R8 R3 K7 + 0x60240009, // 000F GETGBL R9 G9 + 0x88280105, // 0010 GETMBR R10 R0 K5 + 0x7C240200, // 0011 CALL R9 1 + 0x7C180600, // 0012 CALL R6 3 + 0x80040C00, // 0013 RET 1 R6 + 0x70020004, // 0014 JMP #001A + 0x8C180706, // 0015 GETMET R6 R3 K6 + 0x88200708, // 0016 GETMBR R8 R3 K8 + 0x4C240000, // 0017 LDNIL R9 + 0x7C180600, // 0018 CALL R6 3 + 0x80040C00, // 0019 RET 1 R6 + 0x70020020, // 001A JMP #003C + 0x1C180B09, // 001B EQ R6 R5 K9 + 0x781A0005, // 001C JMPF R6 #0023 + 0x8C180706, // 001D GETMET R6 R3 K6 + 0x88200707, // 001E GETMBR R8 R3 K7 + 0x58240009, // 001F LDCONST R9 K9 + 0x7C180600, // 0020 CALL R6 3 + 0x80040C00, // 0021 RET 1 R6 + 0x70020018, // 0022 JMP #003C + 0x1C180B0A, // 0023 EQ R6 R5 K10 + 0x781A0005, // 0024 JMPF R6 #002B + 0x8C180706, // 0025 GETMET R6 R3 K6 + 0x88200707, // 0026 GETMBR R8 R3 K7 + 0x5426FFFD, // 0027 LDINT R9 65534 + 0x7C180600, // 0028 CALL R6 3 + 0x80040C00, // 0029 RET 1 R6 + 0x70020010, // 002A JMP #003C + 0x541AFFFB, // 002B LDINT R6 65532 + 0x1C180A06, // 002C EQ R6 R5 R6 + 0x781A0005, // 002D JMPF R6 #0034 + 0x8C180706, // 002E GETMET R6 R3 K6 + 0x8820070B, // 002F GETMBR R8 R3 K11 + 0x58240004, // 0030 LDCONST R9 K4 + 0x7C180600, // 0031 CALL R6 3 + 0x80040C00, // 0032 RET 1 R6 + 0x70020007, // 0033 JMP #003C + 0x541AFFFC, // 0034 LDINT R6 65533 + 0x1C180A06, // 0035 EQ R6 R5 R6 + 0x781A0004, // 0036 JMPF R6 #003C + 0x8C180706, // 0037 GETMET R6 R3 K6 + 0x8820070B, // 0038 GETMBR R8 R3 K11 + 0x5824000C, // 0039 LDCONST R9 K12 + 0x7C180600, // 003A CALL R6 3 + 0x80040C00, // 003B RET 1 R6 + 0x70020007, // 003C JMP #0045 + 0x60180003, // 003D GETGBL R6 G3 + 0x5C1C0000, // 003E MOVE R7 R0 + 0x7C180200, // 003F CALL R6 1 + 0x8C180D0D, // 0040 GETMET R6 R6 K13 + 0x5C200200, // 0041 MOVE R8 R1 + 0x5C240400, // 0042 MOVE R9 R2 + 0x7C180600, // 0043 CALL R6 3 + 0x80040C00, // 0044 RET 1 R6 + 0x80000000, // 0045 RET 0 }) ) ); @@ -197,7 +195,7 @@ be_local_closure(Matter_Plugin_Bridge_Sensor_Illuminance_value_changed, /* nam ********************************************************************/ be_local_closure(Matter_Plugin_Bridge_Sensor_Illuminance_web_values, /* name */ be_nested_proto( - 10, /* nstack */ + 8, /* nstack */ 1, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -205,31 +203,28 @@ be_local_closure(Matter_Plugin_Bridge_Sensor_Illuminance_web_values, /* name * 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[ 7]) { /* constants */ + ( &(const bvalue[ 5]) { /* constants */ /* K0 */ be_nested_str_weak(webserver), - /* K1 */ be_nested_str_weak(string), - /* K2 */ be_nested_str_weak(web_values_prefix), - /* K3 */ be_nested_str_weak(content_send), - /* K4 */ be_nested_str_weak(format), - /* K5 */ be_nested_str_weak(_X26_X23128261_X3B_X20_X25ilux), - /* K6 */ be_nested_str_weak(shadow_value), + /* K1 */ be_nested_str_weak(web_values_prefix), + /* K2 */ be_nested_str_weak(content_send), + /* K3 */ be_nested_str_weak(_X26_X23128261_X3B_X20_X25ilux), + /* K4 */ be_nested_str_weak(shadow_value), }), be_str_weak(web_values), &be_const_str_solidified, - ( &(const binstruction[13]) { /* code */ + ( &(const binstruction[12]) { /* code */ 0xA4060000, // 0000 IMPORT R1 K0 - 0xA40A0200, // 0001 IMPORT R2 K1 - 0x8C0C0102, // 0002 GETMET R3 R0 K2 - 0x7C0C0200, // 0003 CALL R3 1 - 0x8C0C0303, // 0004 GETMET R3 R1 K3 - 0x8C140504, // 0005 GETMET R5 R2 K4 - 0x581C0005, // 0006 LDCONST R7 K5 - 0x60200009, // 0007 GETGBL R8 G9 - 0x88240106, // 0008 GETMBR R9 R0 K6 - 0x7C200200, // 0009 CALL R8 1 - 0x7C140600, // 000A CALL R5 3 - 0x7C0C0400, // 000B CALL R3 2 - 0x80000000, // 000C RET 0 + 0x8C080101, // 0001 GETMET R2 R0 K1 + 0x7C080200, // 0002 CALL R2 1 + 0x8C080302, // 0003 GETMET R2 R1 K2 + 0x60100018, // 0004 GETGBL R4 G24 + 0x58140003, // 0005 LDCONST R5 K3 + 0x60180009, // 0006 GETGBL R6 G9 + 0x881C0104, // 0007 GETMBR R7 R0 K4 + 0x7C180200, // 0008 CALL R6 1 + 0x7C100400, // 0009 CALL R4 2 + 0x7C080400, // 000A CALL R2 2 + 0x80000000, // 000B RET 0 }) ) ); diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Sensor_Occupancy.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Sensor_Occupancy.h index 471a246ee..79d895a75 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Sensor_Occupancy.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Sensor_Occupancy.h @@ -147,7 +147,7 @@ be_local_closure(Matter_Plugin_Bridge_Sensor_Occupancy_parse_update, /* name * ********************************************************************/ be_local_closure(Matter_Plugin_Bridge_Sensor_Occupancy_web_values_prefix, /* name */ be_nested_proto( - 12, /* nstack */ + 10, /* nstack */ 1, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -155,44 +155,41 @@ be_local_closure(Matter_Plugin_Bridge_Sensor_Occupancy_web_values_prefix, /* n 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[10]) { /* constants */ + ( &(const bvalue[ 8]) { /* constants */ /* K0 */ be_nested_str_weak(webserver), - /* K1 */ be_nested_str_weak(string), - /* K2 */ be_nested_str_weak(get_name), - /* K3 */ be_nested_str_weak(Switch), - /* K4 */ be_nested_str_weak(tasmota_switch_index), - /* K5 */ be_nested_str_weak(content_send), - /* K6 */ be_nested_str_weak(format), - /* K7 */ be_nested_str_weak(PREFIX), - /* K8 */ be_nested_str_weak(html_escape), - /* K9 */ be_nested_str_weak(), + /* K1 */ be_nested_str_weak(get_name), + /* K2 */ be_nested_str_weak(Switch), + /* K3 */ be_nested_str_weak(tasmota_switch_index), + /* K4 */ be_nested_str_weak(content_send), + /* K5 */ be_nested_str_weak(PREFIX), + /* K6 */ be_nested_str_weak(html_escape), + /* K7 */ be_nested_str_weak(), }), be_str_weak(web_values_prefix), &be_const_str_solidified, - ( &(const binstruction[23]) { /* code */ + ( &(const binstruction[22]) { /* code */ 0xA4060000, // 0000 IMPORT R1 K0 - 0xA40A0200, // 0001 IMPORT R2 K1 - 0x8C0C0102, // 0002 GETMET R3 R0 K2 - 0x7C0C0200, // 0003 CALL R3 1 - 0x5C100600, // 0004 MOVE R4 R3 - 0x74120004, // 0005 JMPT R4 #000B - 0x60100008, // 0006 GETGBL R4 G8 - 0x88140104, // 0007 GETMBR R5 R0 K4 - 0x7C100200, // 0008 CALL R4 1 - 0x00120604, // 0009 ADD R4 K3 R4 - 0x5C0C0800, // 000A MOVE R3 R4 - 0x8C100305, // 000B GETMET R4 R1 K5 - 0x8C180506, // 000C GETMET R6 R2 K6 - 0x88200107, // 000D GETMBR R8 R0 K7 - 0x780E0003, // 000E JMPF R3 #0013 - 0x8C240308, // 000F GETMET R9 R1 K8 - 0x5C2C0600, // 0010 MOVE R11 R3 - 0x7C240400, // 0011 CALL R9 2 - 0x70020000, // 0012 JMP #0014 - 0x58240009, // 0013 LDCONST R9 K9 - 0x7C180600, // 0014 CALL R6 3 - 0x7C100400, // 0015 CALL R4 2 - 0x80000000, // 0016 RET 0 + 0x8C080101, // 0001 GETMET R2 R0 K1 + 0x7C080200, // 0002 CALL R2 1 + 0x5C0C0400, // 0003 MOVE R3 R2 + 0x740E0004, // 0004 JMPT R3 #000A + 0x600C0008, // 0005 GETGBL R3 G8 + 0x88100103, // 0006 GETMBR R4 R0 K3 + 0x7C0C0200, // 0007 CALL R3 1 + 0x000E0403, // 0008 ADD R3 K2 R3 + 0x5C080600, // 0009 MOVE R2 R3 + 0x8C0C0304, // 000A GETMET R3 R1 K4 + 0x60140018, // 000B GETGBL R5 G24 + 0x88180105, // 000C GETMBR R6 R0 K5 + 0x780A0003, // 000D JMPF R2 #0012 + 0x8C1C0306, // 000E GETMET R7 R1 K6 + 0x5C240400, // 000F MOVE R9 R2 + 0x7C1C0400, // 0010 CALL R7 2 + 0x70020000, // 0011 JMP #0013 + 0x581C0007, // 0012 LDCONST R7 K7 + 0x7C140400, // 0013 CALL R5 2 + 0x7C0C0400, // 0014 CALL R3 2 + 0x80000000, // 0015 RET 0 }) ) ); @@ -204,7 +201,7 @@ be_local_closure(Matter_Plugin_Bridge_Sensor_Occupancy_web_values_prefix, /* n ********************************************************************/ be_local_closure(Matter_Plugin_Bridge_Sensor_Occupancy_read_attribute, /* name */ be_nested_proto( - 11, /* nstack */ + 10, /* nstack */ 3, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -212,95 +209,93 @@ be_local_closure(Matter_Plugin_Bridge_Sensor_Occupancy_read_attribute, /* name 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[15]) { /* constants */ - /* K0 */ be_nested_str_weak(string), - /* K1 */ be_nested_str_weak(matter), - /* K2 */ be_nested_str_weak(TLV), - /* K3 */ be_nested_str_weak(cluster), - /* K4 */ be_nested_str_weak(attribute), - /* K5 */ be_const_int(0), - /* K6 */ be_nested_str_weak(shadow_occupancy), - /* K7 */ be_nested_str_weak(create_TLV), - /* K8 */ be_nested_str_weak(U1), - /* K9 */ be_nested_str_weak(NULL), - /* K10 */ be_const_int(1), - /* K11 */ be_const_int(3), - /* K12 */ be_const_int(2), - /* K13 */ be_nested_str_weak(U4), - /* K14 */ be_nested_str_weak(read_attribute), + ( &(const bvalue[14]) { /* constants */ + /* K0 */ be_nested_str_weak(matter), + /* K1 */ be_nested_str_weak(TLV), + /* K2 */ be_nested_str_weak(cluster), + /* K3 */ be_nested_str_weak(attribute), + /* K4 */ be_const_int(0), + /* K5 */ be_nested_str_weak(shadow_occupancy), + /* K6 */ be_nested_str_weak(create_TLV), + /* K7 */ be_nested_str_weak(U1), + /* K8 */ be_nested_str_weak(NULL), + /* K9 */ be_const_int(1), + /* K10 */ be_const_int(3), + /* K11 */ be_const_int(2), + /* K12 */ be_nested_str_weak(U4), + /* K13 */ be_nested_str_weak(read_attribute), }), be_str_weak(read_attribute), &be_const_str_solidified, - ( &(const binstruction[69]) { /* code */ - 0xA40E0000, // 0000 IMPORT R3 K0 - 0xB8120200, // 0001 GETNGBL R4 K1 - 0x88100902, // 0002 GETMBR R4 R4 K2 + ( &(const binstruction[68]) { /* code */ + 0xB80E0000, // 0000 GETNGBL R3 K0 + 0x880C0701, // 0001 GETMBR R3 R3 K1 + 0x88100502, // 0002 GETMBR R4 R2 K2 0x88140503, // 0003 GETMBR R5 R2 K3 - 0x88180504, // 0004 GETMBR R6 R2 K4 - 0x541E0405, // 0005 LDINT R7 1030 - 0x1C1C0A07, // 0006 EQ R7 R5 R7 - 0x781E0033, // 0007 JMPF R7 #003C - 0x1C1C0D05, // 0008 EQ R7 R6 K5 - 0x781E000F, // 0009 JMPF R7 #001A - 0x881C0106, // 000A GETMBR R7 R0 K6 - 0x4C200000, // 000B LDNIL R8 - 0x201C0E08, // 000C NE R7 R7 R8 - 0x781E0005, // 000D JMPF R7 #0014 - 0x8C1C0907, // 000E GETMET R7 R4 K7 - 0x88240908, // 000F GETMBR R9 R4 K8 - 0x88280106, // 0010 GETMBR R10 R0 K6 - 0x7C1C0600, // 0011 CALL R7 3 - 0x80040E00, // 0012 RET 1 R7 - 0x70020004, // 0013 JMP #0019 - 0x8C1C0907, // 0014 GETMET R7 R4 K7 - 0x88240909, // 0015 GETMBR R9 R4 K9 - 0x4C280000, // 0016 LDNIL R10 - 0x7C1C0600, // 0017 CALL R7 3 - 0x80040E00, // 0018 RET 1 R7 - 0x70020020, // 0019 JMP #003B - 0x1C1C0D0A, // 001A EQ R7 R6 K10 - 0x781E0005, // 001B JMPF R7 #0022 - 0x8C1C0907, // 001C GETMET R7 R4 K7 - 0x88240908, // 001D GETMBR R9 R4 K8 - 0x5828000B, // 001E LDCONST R10 K11 - 0x7C1C0600, // 001F CALL R7 3 - 0x80040E00, // 0020 RET 1 R7 - 0x70020018, // 0021 JMP #003B - 0x1C1C0D0C, // 0022 EQ R7 R6 K12 - 0x781E0005, // 0023 JMPF R7 #002A - 0x8C1C0907, // 0024 GETMET R7 R4 K7 - 0x88240908, // 0025 GETMBR R9 R4 K8 - 0x58280005, // 0026 LDCONST R10 K5 - 0x7C1C0600, // 0027 CALL R7 3 - 0x80040E00, // 0028 RET 1 R7 - 0x70020010, // 0029 JMP #003B - 0x541EFFFB, // 002A LDINT R7 65532 - 0x1C1C0C07, // 002B EQ R7 R6 R7 - 0x781E0005, // 002C JMPF R7 #0033 - 0x8C1C0907, // 002D GETMET R7 R4 K7 - 0x8824090D, // 002E GETMBR R9 R4 K13 - 0x58280005, // 002F LDCONST R10 K5 - 0x7C1C0600, // 0030 CALL R7 3 - 0x80040E00, // 0031 RET 1 R7 - 0x70020007, // 0032 JMP #003B - 0x541EFFFC, // 0033 LDINT R7 65533 - 0x1C1C0C07, // 0034 EQ R7 R6 R7 - 0x781E0004, // 0035 JMPF R7 #003B - 0x8C1C0907, // 0036 GETMET R7 R4 K7 - 0x8824090D, // 0037 GETMBR R9 R4 K13 - 0x5828000B, // 0038 LDCONST R10 K11 - 0x7C1C0600, // 0039 CALL R7 3 - 0x80040E00, // 003A RET 1 R7 - 0x70020007, // 003B JMP #0044 - 0x601C0003, // 003C GETGBL R7 G3 - 0x5C200000, // 003D MOVE R8 R0 - 0x7C1C0200, // 003E CALL R7 1 - 0x8C1C0F0E, // 003F GETMET R7 R7 K14 - 0x5C240200, // 0040 MOVE R9 R1 - 0x5C280400, // 0041 MOVE R10 R2 - 0x7C1C0600, // 0042 CALL R7 3 - 0x80040E00, // 0043 RET 1 R7 - 0x80000000, // 0044 RET 0 + 0x541A0405, // 0004 LDINT R6 1030 + 0x1C180806, // 0005 EQ R6 R4 R6 + 0x781A0033, // 0006 JMPF R6 #003B + 0x1C180B04, // 0007 EQ R6 R5 K4 + 0x781A000F, // 0008 JMPF R6 #0019 + 0x88180105, // 0009 GETMBR R6 R0 K5 + 0x4C1C0000, // 000A LDNIL R7 + 0x20180C07, // 000B NE R6 R6 R7 + 0x781A0005, // 000C JMPF R6 #0013 + 0x8C180706, // 000D GETMET R6 R3 K6 + 0x88200707, // 000E GETMBR R8 R3 K7 + 0x88240105, // 000F GETMBR R9 R0 K5 + 0x7C180600, // 0010 CALL R6 3 + 0x80040C00, // 0011 RET 1 R6 + 0x70020004, // 0012 JMP #0018 + 0x8C180706, // 0013 GETMET R6 R3 K6 + 0x88200708, // 0014 GETMBR R8 R3 K8 + 0x4C240000, // 0015 LDNIL R9 + 0x7C180600, // 0016 CALL R6 3 + 0x80040C00, // 0017 RET 1 R6 + 0x70020020, // 0018 JMP #003A + 0x1C180B09, // 0019 EQ R6 R5 K9 + 0x781A0005, // 001A JMPF R6 #0021 + 0x8C180706, // 001B GETMET R6 R3 K6 + 0x88200707, // 001C GETMBR R8 R3 K7 + 0x5824000A, // 001D LDCONST R9 K10 + 0x7C180600, // 001E CALL R6 3 + 0x80040C00, // 001F RET 1 R6 + 0x70020018, // 0020 JMP #003A + 0x1C180B0B, // 0021 EQ R6 R5 K11 + 0x781A0005, // 0022 JMPF R6 #0029 + 0x8C180706, // 0023 GETMET R6 R3 K6 + 0x88200707, // 0024 GETMBR R8 R3 K7 + 0x58240004, // 0025 LDCONST R9 K4 + 0x7C180600, // 0026 CALL R6 3 + 0x80040C00, // 0027 RET 1 R6 + 0x70020010, // 0028 JMP #003A + 0x541AFFFB, // 0029 LDINT R6 65532 + 0x1C180A06, // 002A EQ R6 R5 R6 + 0x781A0005, // 002B JMPF R6 #0032 + 0x8C180706, // 002C GETMET R6 R3 K6 + 0x8820070C, // 002D GETMBR R8 R3 K12 + 0x58240004, // 002E LDCONST R9 K4 + 0x7C180600, // 002F CALL R6 3 + 0x80040C00, // 0030 RET 1 R6 + 0x70020007, // 0031 JMP #003A + 0x541AFFFC, // 0032 LDINT R6 65533 + 0x1C180A06, // 0033 EQ R6 R5 R6 + 0x781A0004, // 0034 JMPF R6 #003A + 0x8C180706, // 0035 GETMET R6 R3 K6 + 0x8820070C, // 0036 GETMBR R8 R3 K12 + 0x5824000A, // 0037 LDCONST R9 K10 + 0x7C180600, // 0038 CALL R6 3 + 0x80040C00, // 0039 RET 1 R6 + 0x70020007, // 003A JMP #0043 + 0x60180003, // 003B GETGBL R6 G3 + 0x5C1C0000, // 003C MOVE R7 R0 + 0x7C180200, // 003D CALL R6 1 + 0x8C180D0D, // 003E GETMET R6 R6 K13 + 0x5C200200, // 003F MOVE R8 R1 + 0x5C240400, // 0040 MOVE R9 R2 + 0x7C180600, // 0041 CALL R6 3 + 0x80040C00, // 0042 RET 1 R6 + 0x80000000, // 0043 RET 0 }) ) ); @@ -312,7 +307,7 @@ be_local_closure(Matter_Plugin_Bridge_Sensor_Occupancy_read_attribute, /* name ********************************************************************/ be_local_closure(Matter_Plugin_Bridge_Sensor_Occupancy_web_values, /* name */ be_nested_proto( - 12, /* nstack */ + 10, /* nstack */ 1, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -320,34 +315,31 @@ be_local_closure(Matter_Plugin_Bridge_Sensor_Occupancy_web_values, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[ 9]) { /* constants */ + ( &(const bvalue[ 7]) { /* constants */ /* K0 */ be_nested_str_weak(webserver), - /* K1 */ be_nested_str_weak(string), - /* K2 */ be_nested_str_weak(web_values_prefix), - /* K3 */ be_nested_str_weak(content_send), - /* K4 */ be_nested_str_weak(format), - /* K5 */ be_nested_str_weak(Occupancy_X25i_X20_X25s), - /* K6 */ be_nested_str_weak(tasmota_switch_index), - /* K7 */ be_nested_str_weak(web_value_onoff), - /* K8 */ be_nested_str_weak(shadow_occupancy), + /* K1 */ be_nested_str_weak(web_values_prefix), + /* K2 */ be_nested_str_weak(content_send), + /* K3 */ be_nested_str_weak(Occupancy_X25i_X20_X25s), + /* K4 */ be_nested_str_weak(tasmota_switch_index), + /* K5 */ be_nested_str_weak(web_value_onoff), + /* K6 */ be_nested_str_weak(shadow_occupancy), }), be_str_weak(web_values), &be_const_str_solidified, - ( &(const binstruction[14]) { /* code */ + ( &(const binstruction[13]) { /* code */ 0xA4060000, // 0000 IMPORT R1 K0 - 0xA40A0200, // 0001 IMPORT R2 K1 - 0x8C0C0102, // 0002 GETMET R3 R0 K2 - 0x7C0C0200, // 0003 CALL R3 1 - 0x8C0C0303, // 0004 GETMET R3 R1 K3 - 0x8C140504, // 0005 GETMET R5 R2 K4 - 0x581C0005, // 0006 LDCONST R7 K5 - 0x88200106, // 0007 GETMBR R8 R0 K6 - 0x8C240107, // 0008 GETMET R9 R0 K7 - 0x882C0108, // 0009 GETMBR R11 R0 K8 - 0x7C240400, // 000A CALL R9 2 - 0x7C140800, // 000B CALL R5 4 - 0x7C0C0400, // 000C CALL R3 2 - 0x80000000, // 000D RET 0 + 0x8C080101, // 0001 GETMET R2 R0 K1 + 0x7C080200, // 0002 CALL R2 1 + 0x8C080302, // 0003 GETMET R2 R1 K2 + 0x60100018, // 0004 GETGBL R4 G24 + 0x58140003, // 0005 LDCONST R5 K3 + 0x88180104, // 0006 GETMBR R6 R0 K4 + 0x8C1C0105, // 0007 GETMET R7 R0 K5 + 0x88240106, // 0008 GETMBR R9 R0 K6 + 0x7C1C0400, // 0009 CALL R7 2 + 0x7C100600, // 000A CALL R4 3 + 0x7C080400, // 000B CALL R2 2 + 0x80000000, // 000C RET 0 }) ) ); diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Sensor_Pressure.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Sensor_Pressure.h index fa53c0e01..1e89935ec 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Sensor_Pressure.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Sensor_Pressure.h @@ -43,7 +43,7 @@ be_local_closure(Matter_Plugin_Bridge_Sensor_Pressure_pre_value, /* name */ ********************************************************************/ be_local_closure(Matter_Plugin_Bridge_Sensor_Pressure_read_attribute, /* name */ be_nested_proto( - 12, /* nstack */ + 11, /* nstack */ 3, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -51,97 +51,95 @@ be_local_closure(Matter_Plugin_Bridge_Sensor_Pressure_read_attribute, /* name 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[15]) { /* constants */ - /* K0 */ be_nested_str_weak(string), - /* K1 */ be_nested_str_weak(matter), - /* K2 */ be_nested_str_weak(TLV), - /* K3 */ be_nested_str_weak(cluster), - /* K4 */ be_nested_str_weak(attribute), - /* K5 */ be_const_int(0), - /* K6 */ be_nested_str_weak(shadow_value), - /* K7 */ be_nested_str_weak(create_TLV), - /* K8 */ be_nested_str_weak(I2), - /* K9 */ be_nested_str_weak(NULL), - /* K10 */ be_const_int(1), - /* K11 */ be_const_int(2), - /* K12 */ be_nested_str_weak(U4), - /* K13 */ be_const_int(3), - /* K14 */ be_nested_str_weak(read_attribute), + ( &(const bvalue[14]) { /* constants */ + /* K0 */ be_nested_str_weak(matter), + /* K1 */ be_nested_str_weak(TLV), + /* K2 */ be_nested_str_weak(cluster), + /* K3 */ be_nested_str_weak(attribute), + /* K4 */ be_const_int(0), + /* K5 */ be_nested_str_weak(shadow_value), + /* K6 */ be_nested_str_weak(create_TLV), + /* K7 */ be_nested_str_weak(I2), + /* K8 */ be_nested_str_weak(NULL), + /* K9 */ be_const_int(1), + /* K10 */ be_const_int(2), + /* K11 */ be_nested_str_weak(U4), + /* K12 */ be_const_int(3), + /* K13 */ be_nested_str_weak(read_attribute), }), be_str_weak(read_attribute), &be_const_str_solidified, - ( &(const binstruction[71]) { /* code */ - 0xA40E0000, // 0000 IMPORT R3 K0 - 0xB8120200, // 0001 GETNGBL R4 K1 - 0x88100902, // 0002 GETMBR R4 R4 K2 + ( &(const binstruction[70]) { /* code */ + 0xB80E0000, // 0000 GETNGBL R3 K0 + 0x880C0701, // 0001 GETMBR R3 R3 K1 + 0x88100502, // 0002 GETMBR R4 R2 K2 0x88140503, // 0003 GETMBR R5 R2 K3 - 0x88180504, // 0004 GETMBR R6 R2 K4 - 0x541E0402, // 0005 LDINT R7 1027 - 0x1C1C0A07, // 0006 EQ R7 R5 R7 - 0x781E0035, // 0007 JMPF R7 #003E - 0x1C1C0D05, // 0008 EQ R7 R6 K5 - 0x781E0011, // 0009 JMPF R7 #001C - 0x881C0106, // 000A GETMBR R7 R0 K6 - 0x4C200000, // 000B LDNIL R8 - 0x201C0E08, // 000C NE R7 R7 R8 - 0x781E0007, // 000D JMPF R7 #0016 - 0x8C1C0907, // 000E GETMET R7 R4 K7 - 0x88240908, // 000F GETMBR R9 R4 K8 - 0x60280009, // 0010 GETGBL R10 G9 - 0x882C0106, // 0011 GETMBR R11 R0 K6 - 0x7C280200, // 0012 CALL R10 1 - 0x7C1C0600, // 0013 CALL R7 3 - 0x80040E00, // 0014 RET 1 R7 - 0x70020004, // 0015 JMP #001B - 0x8C1C0907, // 0016 GETMET R7 R4 K7 - 0x88240909, // 0017 GETMBR R9 R4 K9 - 0x4C280000, // 0018 LDNIL R10 - 0x7C1C0600, // 0019 CALL R7 3 - 0x80040E00, // 001A RET 1 R7 - 0x70020020, // 001B JMP #003D - 0x1C1C0D0A, // 001C EQ R7 R6 K10 - 0x781E0005, // 001D JMPF R7 #0024 - 0x8C1C0907, // 001E GETMET R7 R4 K7 - 0x88240908, // 001F GETMBR R9 R4 K8 - 0x542A01F3, // 0020 LDINT R10 500 - 0x7C1C0600, // 0021 CALL R7 3 - 0x80040E00, // 0022 RET 1 R7 - 0x70020018, // 0023 JMP #003D - 0x1C1C0D0B, // 0024 EQ R7 R6 K11 - 0x781E0005, // 0025 JMPF R7 #002C - 0x8C1C0907, // 0026 GETMET R7 R4 K7 - 0x88240908, // 0027 GETMBR R9 R4 K8 - 0x542A05DB, // 0028 LDINT R10 1500 - 0x7C1C0600, // 0029 CALL R7 3 - 0x80040E00, // 002A RET 1 R7 - 0x70020010, // 002B JMP #003D - 0x541EFFFB, // 002C LDINT R7 65532 - 0x1C1C0C07, // 002D EQ R7 R6 R7 - 0x781E0005, // 002E JMPF R7 #0035 - 0x8C1C0907, // 002F GETMET R7 R4 K7 - 0x8824090C, // 0030 GETMBR R9 R4 K12 - 0x58280005, // 0031 LDCONST R10 K5 - 0x7C1C0600, // 0032 CALL R7 3 - 0x80040E00, // 0033 RET 1 R7 - 0x70020007, // 0034 JMP #003D - 0x541EFFFC, // 0035 LDINT R7 65533 - 0x1C1C0C07, // 0036 EQ R7 R6 R7 - 0x781E0004, // 0037 JMPF R7 #003D - 0x8C1C0907, // 0038 GETMET R7 R4 K7 - 0x8824090C, // 0039 GETMBR R9 R4 K12 - 0x5828000D, // 003A LDCONST R10 K13 - 0x7C1C0600, // 003B CALL R7 3 - 0x80040E00, // 003C RET 1 R7 - 0x70020007, // 003D JMP #0046 - 0x601C0003, // 003E GETGBL R7 G3 - 0x5C200000, // 003F MOVE R8 R0 - 0x7C1C0200, // 0040 CALL R7 1 - 0x8C1C0F0E, // 0041 GETMET R7 R7 K14 - 0x5C240200, // 0042 MOVE R9 R1 - 0x5C280400, // 0043 MOVE R10 R2 - 0x7C1C0600, // 0044 CALL R7 3 - 0x80040E00, // 0045 RET 1 R7 - 0x80000000, // 0046 RET 0 + 0x541A0402, // 0004 LDINT R6 1027 + 0x1C180806, // 0005 EQ R6 R4 R6 + 0x781A0035, // 0006 JMPF R6 #003D + 0x1C180B04, // 0007 EQ R6 R5 K4 + 0x781A0011, // 0008 JMPF R6 #001B + 0x88180105, // 0009 GETMBR R6 R0 K5 + 0x4C1C0000, // 000A LDNIL R7 + 0x20180C07, // 000B NE R6 R6 R7 + 0x781A0007, // 000C JMPF R6 #0015 + 0x8C180706, // 000D GETMET R6 R3 K6 + 0x88200707, // 000E GETMBR R8 R3 K7 + 0x60240009, // 000F GETGBL R9 G9 + 0x88280105, // 0010 GETMBR R10 R0 K5 + 0x7C240200, // 0011 CALL R9 1 + 0x7C180600, // 0012 CALL R6 3 + 0x80040C00, // 0013 RET 1 R6 + 0x70020004, // 0014 JMP #001A + 0x8C180706, // 0015 GETMET R6 R3 K6 + 0x88200708, // 0016 GETMBR R8 R3 K8 + 0x4C240000, // 0017 LDNIL R9 + 0x7C180600, // 0018 CALL R6 3 + 0x80040C00, // 0019 RET 1 R6 + 0x70020020, // 001A JMP #003C + 0x1C180B09, // 001B EQ R6 R5 K9 + 0x781A0005, // 001C JMPF R6 #0023 + 0x8C180706, // 001D GETMET R6 R3 K6 + 0x88200707, // 001E GETMBR R8 R3 K7 + 0x542601F3, // 001F LDINT R9 500 + 0x7C180600, // 0020 CALL R6 3 + 0x80040C00, // 0021 RET 1 R6 + 0x70020018, // 0022 JMP #003C + 0x1C180B0A, // 0023 EQ R6 R5 K10 + 0x781A0005, // 0024 JMPF R6 #002B + 0x8C180706, // 0025 GETMET R6 R3 K6 + 0x88200707, // 0026 GETMBR R8 R3 K7 + 0x542605DB, // 0027 LDINT R9 1500 + 0x7C180600, // 0028 CALL R6 3 + 0x80040C00, // 0029 RET 1 R6 + 0x70020010, // 002A JMP #003C + 0x541AFFFB, // 002B LDINT R6 65532 + 0x1C180A06, // 002C EQ R6 R5 R6 + 0x781A0005, // 002D JMPF R6 #0034 + 0x8C180706, // 002E GETMET R6 R3 K6 + 0x8820070B, // 002F GETMBR R8 R3 K11 + 0x58240004, // 0030 LDCONST R9 K4 + 0x7C180600, // 0031 CALL R6 3 + 0x80040C00, // 0032 RET 1 R6 + 0x70020007, // 0033 JMP #003C + 0x541AFFFC, // 0034 LDINT R6 65533 + 0x1C180A06, // 0035 EQ R6 R5 R6 + 0x781A0004, // 0036 JMPF R6 #003C + 0x8C180706, // 0037 GETMET R6 R3 K6 + 0x8820070B, // 0038 GETMBR R8 R3 K11 + 0x5824000C, // 0039 LDCONST R9 K12 + 0x7C180600, // 003A CALL R6 3 + 0x80040C00, // 003B RET 1 R6 + 0x70020007, // 003C JMP #0045 + 0x60180003, // 003D GETGBL R6 G3 + 0x5C1C0000, // 003E MOVE R7 R0 + 0x7C180200, // 003F CALL R6 1 + 0x8C180D0D, // 0040 GETMET R6 R6 K13 + 0x5C200200, // 0041 MOVE R8 R1 + 0x5C240400, // 0042 MOVE R9 R2 + 0x7C180600, // 0043 CALL R6 3 + 0x80040C00, // 0044 RET 1 R6 + 0x80000000, // 0045 RET 0 }) ) ); @@ -184,7 +182,7 @@ be_local_closure(Matter_Plugin_Bridge_Sensor_Pressure_value_changed, /* name * ********************************************************************/ be_local_closure(Matter_Plugin_Bridge_Sensor_Pressure_web_values, /* name */ be_nested_proto( - 10, /* nstack */ + 8, /* nstack */ 1, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -192,31 +190,28 @@ be_local_closure(Matter_Plugin_Bridge_Sensor_Pressure_web_values, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[ 7]) { /* constants */ + ( &(const bvalue[ 5]) { /* constants */ /* K0 */ be_nested_str_weak(webserver), - /* K1 */ be_nested_str_weak(string), - /* K2 */ be_nested_str_weak(web_values_prefix), - /* K3 */ be_nested_str_weak(content_send), - /* K4 */ be_nested_str_weak(format), - /* K5 */ be_nested_str_weak(_X26_X23x26C5_X3B_X20_X25i_X20hPa), - /* K6 */ be_nested_str_weak(shadow_value), + /* K1 */ be_nested_str_weak(web_values_prefix), + /* K2 */ be_nested_str_weak(content_send), + /* K3 */ be_nested_str_weak(_X26_X23x26C5_X3B_X20_X25i_X20hPa), + /* K4 */ be_nested_str_weak(shadow_value), }), be_str_weak(web_values), &be_const_str_solidified, - ( &(const binstruction[13]) { /* code */ + ( &(const binstruction[12]) { /* code */ 0xA4060000, // 0000 IMPORT R1 K0 - 0xA40A0200, // 0001 IMPORT R2 K1 - 0x8C0C0102, // 0002 GETMET R3 R0 K2 - 0x7C0C0200, // 0003 CALL R3 1 - 0x8C0C0303, // 0004 GETMET R3 R1 K3 - 0x8C140504, // 0005 GETMET R5 R2 K4 - 0x581C0005, // 0006 LDCONST R7 K5 - 0x60200009, // 0007 GETGBL R8 G9 - 0x88240106, // 0008 GETMBR R9 R0 K6 - 0x7C200200, // 0009 CALL R8 1 - 0x7C140600, // 000A CALL R5 3 - 0x7C0C0400, // 000B CALL R3 2 - 0x80000000, // 000C RET 0 + 0x8C080101, // 0001 GETMET R2 R0 K1 + 0x7C080200, // 0002 CALL R2 1 + 0x8C080302, // 0003 GETMET R2 R1 K2 + 0x60100018, // 0004 GETGBL R4 G24 + 0x58140003, // 0005 LDCONST R5 K3 + 0x60180009, // 0006 GETGBL R6 G9 + 0x881C0104, // 0007 GETMBR R7 R0 K4 + 0x7C180200, // 0008 CALL R6 1 + 0x7C100400, // 0009 CALL R4 2 + 0x7C080400, // 000A CALL R2 2 + 0x80000000, // 000B RET 0 }) ) ); diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Sensor_Temp.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Sensor_Temp.h index b7b79c2d3..e93c299dd 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Sensor_Temp.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Sensor_Temp.h @@ -44,7 +44,7 @@ be_local_closure(Matter_Plugin_Bridge_Sensor_Temp_pre_value, /* name */ ********************************************************************/ be_local_closure(Matter_Plugin_Bridge_Sensor_Temp_read_attribute, /* name */ be_nested_proto( - 11, /* nstack */ + 10, /* nstack */ 3, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -52,94 +52,92 @@ be_local_closure(Matter_Plugin_Bridge_Sensor_Temp_read_attribute, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[14]) { /* constants */ - /* K0 */ be_nested_str_weak(string), - /* K1 */ be_nested_str_weak(matter), - /* K2 */ be_nested_str_weak(TLV), - /* K3 */ be_nested_str_weak(cluster), - /* K4 */ be_nested_str_weak(attribute), - /* K5 */ be_const_int(0), - /* K6 */ be_nested_str_weak(shadow_value), - /* K7 */ be_nested_str_weak(create_TLV), - /* K8 */ be_nested_str_weak(I2), - /* K9 */ be_nested_str_weak(NULL), - /* K10 */ be_const_int(1), - /* K11 */ be_const_int(2), - /* K12 */ be_nested_str_weak(U4), - /* K13 */ be_nested_str_weak(read_attribute), + ( &(const bvalue[13]) { /* constants */ + /* K0 */ be_nested_str_weak(matter), + /* K1 */ be_nested_str_weak(TLV), + /* K2 */ be_nested_str_weak(cluster), + /* K3 */ be_nested_str_weak(attribute), + /* K4 */ be_const_int(0), + /* K5 */ be_nested_str_weak(shadow_value), + /* K6 */ be_nested_str_weak(create_TLV), + /* K7 */ be_nested_str_weak(I2), + /* K8 */ be_nested_str_weak(NULL), + /* K9 */ be_const_int(1), + /* K10 */ be_const_int(2), + /* K11 */ be_nested_str_weak(U4), + /* K12 */ be_nested_str_weak(read_attribute), }), be_str_weak(read_attribute), &be_const_str_solidified, - ( &(const binstruction[69]) { /* code */ - 0xA40E0000, // 0000 IMPORT R3 K0 - 0xB8120200, // 0001 GETNGBL R4 K1 - 0x88100902, // 0002 GETMBR R4 R4 K2 + ( &(const binstruction[68]) { /* code */ + 0xB80E0000, // 0000 GETNGBL R3 K0 + 0x880C0701, // 0001 GETMBR R3 R3 K1 + 0x88100502, // 0002 GETMBR R4 R2 K2 0x88140503, // 0003 GETMBR R5 R2 K3 - 0x88180504, // 0004 GETMBR R6 R2 K4 - 0x541E0401, // 0005 LDINT R7 1026 - 0x1C1C0A07, // 0006 EQ R7 R5 R7 - 0x781E0033, // 0007 JMPF R7 #003C - 0x1C1C0D05, // 0008 EQ R7 R6 K5 - 0x781E000F, // 0009 JMPF R7 #001A - 0x881C0106, // 000A GETMBR R7 R0 K6 - 0x4C200000, // 000B LDNIL R8 - 0x201C0E08, // 000C NE R7 R7 R8 - 0x781E0005, // 000D JMPF R7 #0014 - 0x8C1C0907, // 000E GETMET R7 R4 K7 - 0x88240908, // 000F GETMBR R9 R4 K8 - 0x88280106, // 0010 GETMBR R10 R0 K6 - 0x7C1C0600, // 0011 CALL R7 3 - 0x80040E00, // 0012 RET 1 R7 - 0x70020004, // 0013 JMP #0019 - 0x8C1C0907, // 0014 GETMET R7 R4 K7 - 0x88240909, // 0015 GETMBR R9 R4 K9 - 0x4C280000, // 0016 LDNIL R10 - 0x7C1C0600, // 0017 CALL R7 3 - 0x80040E00, // 0018 RET 1 R7 - 0x70020020, // 0019 JMP #003B - 0x1C1C0D0A, // 001A EQ R7 R6 K10 - 0x781E0005, // 001B JMPF R7 #0022 - 0x8C1C0907, // 001C GETMET R7 R4 K7 - 0x88240908, // 001D GETMBR R9 R4 K8 - 0x5429EC77, // 001E LDINT R10 -5000 - 0x7C1C0600, // 001F CALL R7 3 - 0x80040E00, // 0020 RET 1 R7 - 0x70020018, // 0021 JMP #003B - 0x1C1C0D0B, // 0022 EQ R7 R6 K11 - 0x781E0005, // 0023 JMPF R7 #002A - 0x8C1C0907, // 0024 GETMET R7 R4 K7 - 0x88240908, // 0025 GETMBR R9 R4 K8 - 0x542A3A97, // 0026 LDINT R10 15000 - 0x7C1C0600, // 0027 CALL R7 3 - 0x80040E00, // 0028 RET 1 R7 - 0x70020010, // 0029 JMP #003B - 0x541EFFFB, // 002A LDINT R7 65532 - 0x1C1C0C07, // 002B EQ R7 R6 R7 - 0x781E0005, // 002C JMPF R7 #0033 - 0x8C1C0907, // 002D GETMET R7 R4 K7 - 0x8824090C, // 002E GETMBR R9 R4 K12 - 0x58280005, // 002F LDCONST R10 K5 - 0x7C1C0600, // 0030 CALL R7 3 - 0x80040E00, // 0031 RET 1 R7 - 0x70020007, // 0032 JMP #003B - 0x541EFFFC, // 0033 LDINT R7 65533 - 0x1C1C0C07, // 0034 EQ R7 R6 R7 - 0x781E0004, // 0035 JMPF R7 #003B - 0x8C1C0907, // 0036 GETMET R7 R4 K7 - 0x8824090C, // 0037 GETMBR R9 R4 K12 - 0x542A0003, // 0038 LDINT R10 4 - 0x7C1C0600, // 0039 CALL R7 3 - 0x80040E00, // 003A RET 1 R7 - 0x70020007, // 003B JMP #0044 - 0x601C0003, // 003C GETGBL R7 G3 - 0x5C200000, // 003D MOVE R8 R0 - 0x7C1C0200, // 003E CALL R7 1 - 0x8C1C0F0D, // 003F GETMET R7 R7 K13 - 0x5C240200, // 0040 MOVE R9 R1 - 0x5C280400, // 0041 MOVE R10 R2 - 0x7C1C0600, // 0042 CALL R7 3 - 0x80040E00, // 0043 RET 1 R7 - 0x80000000, // 0044 RET 0 + 0x541A0401, // 0004 LDINT R6 1026 + 0x1C180806, // 0005 EQ R6 R4 R6 + 0x781A0033, // 0006 JMPF R6 #003B + 0x1C180B04, // 0007 EQ R6 R5 K4 + 0x781A000F, // 0008 JMPF R6 #0019 + 0x88180105, // 0009 GETMBR R6 R0 K5 + 0x4C1C0000, // 000A LDNIL R7 + 0x20180C07, // 000B NE R6 R6 R7 + 0x781A0005, // 000C JMPF R6 #0013 + 0x8C180706, // 000D GETMET R6 R3 K6 + 0x88200707, // 000E GETMBR R8 R3 K7 + 0x88240105, // 000F GETMBR R9 R0 K5 + 0x7C180600, // 0010 CALL R6 3 + 0x80040C00, // 0011 RET 1 R6 + 0x70020004, // 0012 JMP #0018 + 0x8C180706, // 0013 GETMET R6 R3 K6 + 0x88200708, // 0014 GETMBR R8 R3 K8 + 0x4C240000, // 0015 LDNIL R9 + 0x7C180600, // 0016 CALL R6 3 + 0x80040C00, // 0017 RET 1 R6 + 0x70020020, // 0018 JMP #003A + 0x1C180B09, // 0019 EQ R6 R5 K9 + 0x781A0005, // 001A JMPF R6 #0021 + 0x8C180706, // 001B GETMET R6 R3 K6 + 0x88200707, // 001C GETMBR R8 R3 K7 + 0x5425EC77, // 001D LDINT R9 -5000 + 0x7C180600, // 001E CALL R6 3 + 0x80040C00, // 001F RET 1 R6 + 0x70020018, // 0020 JMP #003A + 0x1C180B0A, // 0021 EQ R6 R5 K10 + 0x781A0005, // 0022 JMPF R6 #0029 + 0x8C180706, // 0023 GETMET R6 R3 K6 + 0x88200707, // 0024 GETMBR R8 R3 K7 + 0x54263A97, // 0025 LDINT R9 15000 + 0x7C180600, // 0026 CALL R6 3 + 0x80040C00, // 0027 RET 1 R6 + 0x70020010, // 0028 JMP #003A + 0x541AFFFB, // 0029 LDINT R6 65532 + 0x1C180A06, // 002A EQ R6 R5 R6 + 0x781A0005, // 002B JMPF R6 #0032 + 0x8C180706, // 002C GETMET R6 R3 K6 + 0x8820070B, // 002D GETMBR R8 R3 K11 + 0x58240004, // 002E LDCONST R9 K4 + 0x7C180600, // 002F CALL R6 3 + 0x80040C00, // 0030 RET 1 R6 + 0x70020007, // 0031 JMP #003A + 0x541AFFFC, // 0032 LDINT R6 65533 + 0x1C180A06, // 0033 EQ R6 R5 R6 + 0x781A0004, // 0034 JMPF R6 #003A + 0x8C180706, // 0035 GETMET R6 R3 K6 + 0x8820070B, // 0036 GETMBR R8 R3 K11 + 0x54260003, // 0037 LDINT R9 4 + 0x7C180600, // 0038 CALL R6 3 + 0x80040C00, // 0039 RET 1 R6 + 0x70020007, // 003A JMP #0043 + 0x60180003, // 003B GETGBL R6 G3 + 0x5C1C0000, // 003C MOVE R7 R0 + 0x7C180200, // 003D CALL R6 1 + 0x8C180D0C, // 003E GETMET R6 R6 K12 + 0x5C200200, // 003F MOVE R8 R1 + 0x5C240400, // 0040 MOVE R9 R2 + 0x7C180600, // 0041 CALL R6 3 + 0x80040C00, // 0042 RET 1 R6 + 0x80000000, // 0043 RET 0 }) ) ); @@ -182,7 +180,7 @@ be_local_closure(Matter_Plugin_Bridge_Sensor_Temp_value_changed, /* name */ ********************************************************************/ be_local_closure(Matter_Plugin_Bridge_Sensor_Temp_web_values, /* name */ be_nested_proto( - 10, /* nstack */ + 8, /* nstack */ 1, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -190,39 +188,36 @@ be_local_closure(Matter_Plugin_Bridge_Sensor_Temp_web_values, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[ 7]) { /* constants */ + ( &(const bvalue[ 5]) { /* constants */ /* K0 */ be_nested_str_weak(webserver), - /* K1 */ be_nested_str_weak(string), - /* K2 */ be_nested_str_weak(web_values_prefix), - /* K3 */ be_nested_str_weak(content_send), - /* K4 */ be_nested_str_weak(format), - /* K5 */ be_nested_str_weak(_X26_X23x2600_X3B_X26_X23xFE0F_X3B_X20_X25_X2E1f_X20_XC2_XB0C), - /* K6 */ be_nested_str_weak(shadow_value), + /* K1 */ be_nested_str_weak(web_values_prefix), + /* K2 */ be_nested_str_weak(content_send), + /* K3 */ be_nested_str_weak(_X26_X23x2600_X3B_X26_X23xFE0F_X3B_X20_X25_X2E1f_X20_XC2_XB0C), + /* K4 */ be_nested_str_weak(shadow_value), }), be_str_weak(web_values), &be_const_str_solidified, - ( &(const binstruction[21]) { /* code */ + ( &(const binstruction[20]) { /* code */ 0xA4060000, // 0000 IMPORT R1 K0 - 0xA40A0200, // 0001 IMPORT R2 K1 - 0x8C0C0102, // 0002 GETMET R3 R0 K2 - 0x7C0C0200, // 0003 CALL R3 1 - 0x8C0C0303, // 0004 GETMET R3 R1 K3 - 0x8C140504, // 0005 GETMET R5 R2 K4 - 0x581C0005, // 0006 LDCONST R7 K5 - 0x88200106, // 0007 GETMBR R8 R0 K6 - 0x4C240000, // 0008 LDNIL R9 - 0x20201009, // 0009 NE R8 R8 R9 - 0x78220005, // 000A JMPF R8 #0011 - 0x6020000A, // 000B GETGBL R8 G10 - 0x88240106, // 000C GETMBR R9 R0 K6 - 0x7C200200, // 000D CALL R8 1 - 0x54260063, // 000E LDINT R9 100 - 0x0C201009, // 000F DIV R8 R8 R9 - 0x70020000, // 0010 JMP #0012 - 0x4C200000, // 0011 LDNIL R8 - 0x7C140600, // 0012 CALL R5 3 - 0x7C0C0400, // 0013 CALL R3 2 - 0x80000000, // 0014 RET 0 + 0x8C080101, // 0001 GETMET R2 R0 K1 + 0x7C080200, // 0002 CALL R2 1 + 0x8C080302, // 0003 GETMET R2 R1 K2 + 0x60100018, // 0004 GETGBL R4 G24 + 0x58140003, // 0005 LDCONST R5 K3 + 0x88180104, // 0006 GETMBR R6 R0 K4 + 0x4C1C0000, // 0007 LDNIL R7 + 0x20180C07, // 0008 NE R6 R6 R7 + 0x781A0005, // 0009 JMPF R6 #0010 + 0x6018000A, // 000A GETGBL R6 G10 + 0x881C0104, // 000B GETMBR R7 R0 K4 + 0x7C180200, // 000C CALL R6 1 + 0x541E0063, // 000D LDINT R7 100 + 0x0C180C07, // 000E DIV R6 R6 R7 + 0x70020000, // 000F JMP #0011 + 0x4C180000, // 0010 LDNIL R6 + 0x7C100400, // 0011 CALL R4 2 + 0x7C080400, // 0012 CALL R2 2 + 0x80000000, // 0013 RET 0 }) ) ); diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Device.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Device.h index 9680603b4..ff0d819af 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Device.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Device.h @@ -202,7 +202,7 @@ be_local_closure(Matter_Plugin_Device_invoke_request, /* name */ ********************************************************************/ be_local_closure(Matter_Plugin_Device_read_attribute, /* name */ be_nested_proto( - 17, /* nstack */ + 16, /* nstack */ 3, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -210,216 +210,214 @@ be_local_closure(Matter_Plugin_Device_read_attribute, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[24]) { /* constants */ - /* K0 */ be_nested_str_weak(string), - /* K1 */ be_nested_str_weak(matter), - /* K2 */ be_nested_str_weak(TLV), - /* K3 */ be_nested_str_weak(cluster), - /* K4 */ be_nested_str_weak(attribute), - /* K5 */ be_const_int(3), - /* K6 */ be_const_int(0), - /* K7 */ be_nested_str_weak(create_TLV), - /* K8 */ be_nested_str_weak(U2), - /* K9 */ be_const_int(1), - /* K10 */ be_nested_str_weak(U1), - /* K11 */ be_nested_str_weak(U4), - /* K12 */ be_nested_str_weak(Matter_TLV_array), - /* K13 */ be_nested_str_weak(TYPES), - /* K14 */ be_nested_str_weak(keys), - /* K15 */ be_nested_str_weak(add_struct), - /* K16 */ be_nested_str_weak(add_TLV), - /* K17 */ be_nested_str_weak(stop_iteration), - /* K18 */ be_nested_str_weak(NON_BRIDGE_VENDOR), - /* K19 */ be_nested_str_weak(find), - /* K20 */ be_nested_str_weak(get_admin_vendor), - /* K21 */ be_nested_str_weak(read_attribute), - /* K22 */ be_nested_str_weak(UTF1), - /* K23 */ be_nested_str_weak(get_name), + ( &(const bvalue[23]) { /* constants */ + /* K0 */ be_nested_str_weak(matter), + /* K1 */ be_nested_str_weak(TLV), + /* K2 */ be_nested_str_weak(cluster), + /* K3 */ be_nested_str_weak(attribute), + /* K4 */ be_const_int(3), + /* K5 */ be_const_int(0), + /* K6 */ be_nested_str_weak(create_TLV), + /* K7 */ be_nested_str_weak(U2), + /* K8 */ be_const_int(1), + /* K9 */ be_nested_str_weak(U1), + /* K10 */ be_nested_str_weak(U4), + /* K11 */ be_nested_str_weak(Matter_TLV_array), + /* K12 */ be_nested_str_weak(TYPES), + /* K13 */ be_nested_str_weak(keys), + /* K14 */ be_nested_str_weak(add_struct), + /* K15 */ be_nested_str_weak(add_TLV), + /* K16 */ be_nested_str_weak(stop_iteration), + /* K17 */ be_nested_str_weak(NON_BRIDGE_VENDOR), + /* K18 */ be_nested_str_weak(find), + /* K19 */ be_nested_str_weak(get_admin_vendor), + /* K20 */ be_nested_str_weak(read_attribute), + /* K21 */ be_nested_str_weak(UTF1), + /* K22 */ be_nested_str_weak(get_name), }), be_str_weak(read_attribute), &be_const_str_solidified, - ( &(const binstruction[181]) { /* code */ - 0xA40E0000, // 0000 IMPORT R3 K0 - 0xB8120200, // 0001 GETNGBL R4 K1 - 0x88100902, // 0002 GETMBR R4 R4 K2 + ( &(const binstruction[180]) { /* code */ + 0xB80E0000, // 0000 GETNGBL R3 K0 + 0x880C0701, // 0001 GETMBR R3 R3 K1 + 0x88100502, // 0002 GETMBR R4 R2 K2 0x88140503, // 0003 GETMBR R5 R2 K3 - 0x88180504, // 0004 GETMBR R6 R2 K4 - 0x1C1C0B05, // 0005 EQ R7 R5 K5 - 0x781E0021, // 0006 JMPF R7 #0029 - 0x1C1C0D06, // 0007 EQ R7 R6 K6 - 0x781E0005, // 0008 JMPF R7 #000F - 0x8C1C0907, // 0009 GETMET R7 R4 K7 - 0x88240908, // 000A GETMBR R9 R4 K8 - 0x58280006, // 000B LDCONST R10 K6 - 0x7C1C0600, // 000C CALL R7 3 - 0x80040E00, // 000D RET 1 R7 - 0x70020018, // 000E JMP #0028 - 0x1C1C0D09, // 000F EQ R7 R6 K9 - 0x781E0005, // 0010 JMPF R7 #0017 - 0x8C1C0907, // 0011 GETMET R7 R4 K7 - 0x8824090A, // 0012 GETMBR R9 R4 K10 - 0x58280006, // 0013 LDCONST R10 K6 - 0x7C1C0600, // 0014 CALL R7 3 - 0x80040E00, // 0015 RET 1 R7 - 0x70020010, // 0016 JMP #0028 - 0x541EFFFB, // 0017 LDINT R7 65532 - 0x1C1C0C07, // 0018 EQ R7 R6 R7 - 0x781E0005, // 0019 JMPF R7 #0020 - 0x8C1C0907, // 001A GETMET R7 R4 K7 - 0x8824090B, // 001B GETMBR R9 R4 K11 - 0x58280006, // 001C LDCONST R10 K6 - 0x7C1C0600, // 001D CALL R7 3 - 0x80040E00, // 001E RET 1 R7 - 0x70020007, // 001F JMP #0028 - 0x541EFFFC, // 0020 LDINT R7 65533 - 0x1C1C0C07, // 0021 EQ R7 R6 R7 - 0x781E0004, // 0022 JMPF R7 #0028 - 0x8C1C0907, // 0023 GETMET R7 R4 K7 - 0x8824090B, // 0024 GETMBR R9 R4 K11 - 0x542A0003, // 0025 LDINT R10 4 - 0x7C1C0600, // 0026 CALL R7 3 - 0x80040E00, // 0027 RET 1 R7 - 0x7002008A, // 0028 JMP #00B4 - 0x541E0003, // 0029 LDINT R7 4 - 0x1C1C0A07, // 002A EQ R7 R5 R7 - 0x781E0016, // 002B JMPF R7 #0043 - 0x1C1C0D06, // 002C EQ R7 R6 K6 - 0x781E0002, // 002D JMPF R7 #0031 - 0x4C1C0000, // 002E LDNIL R7 - 0x80040E00, // 002F RET 1 R7 - 0x70020010, // 0030 JMP #0042 - 0x541EFFFB, // 0031 LDINT R7 65532 - 0x1C1C0C07, // 0032 EQ R7 R6 R7 - 0x781E0005, // 0033 JMPF R7 #003A - 0x8C1C0907, // 0034 GETMET R7 R4 K7 - 0x8824090B, // 0035 GETMBR R9 R4 K11 - 0x58280006, // 0036 LDCONST R10 K6 - 0x7C1C0600, // 0037 CALL R7 3 - 0x80040E00, // 0038 RET 1 R7 - 0x70020007, // 0039 JMP #0042 - 0x541EFFFC, // 003A LDINT R7 65533 - 0x1C1C0C07, // 003B EQ R7 R6 R7 - 0x781E0004, // 003C JMPF R7 #0042 - 0x8C1C0907, // 003D GETMET R7 R4 K7 - 0x8824090B, // 003E GETMBR R9 R4 K11 - 0x542A0003, // 003F LDINT R10 4 - 0x7C1C0600, // 0040 CALL R7 3 - 0x80040E00, // 0041 RET 1 R7 - 0x70020070, // 0042 JMP #00B4 - 0x541E0004, // 0043 LDINT R7 5 - 0x1C1C0A07, // 0044 EQ R7 R5 R7 - 0x781E0011, // 0045 JMPF R7 #0058 - 0x541EFFFB, // 0046 LDINT R7 65532 - 0x1C1C0C07, // 0047 EQ R7 R6 R7 - 0x781E0005, // 0048 JMPF R7 #004F - 0x8C1C0907, // 0049 GETMET R7 R4 K7 - 0x8824090B, // 004A GETMBR R9 R4 K11 - 0x58280006, // 004B LDCONST R10 K6 - 0x7C1C0600, // 004C CALL R7 3 - 0x80040E00, // 004D RET 1 R7 - 0x70020007, // 004E JMP #0057 - 0x541EFFFC, // 004F LDINT R7 65533 - 0x1C1C0C07, // 0050 EQ R7 R6 R7 - 0x781E0004, // 0051 JMPF R7 #0057 - 0x8C1C0907, // 0052 GETMET R7 R4 K7 - 0x8824090B, // 0053 GETMBR R9 R4 K11 - 0x542A0003, // 0054 LDINT R10 4 - 0x7C1C0600, // 0055 CALL R7 3 - 0x80040E00, // 0056 RET 1 R7 - 0x7002005B, // 0057 JMP #00B4 - 0x541E001C, // 0058 LDINT R7 29 - 0x1C1C0A07, // 0059 EQ R7 R5 R7 - 0x781E003A, // 005A JMPF R7 #0096 - 0x1C1C0D06, // 005B EQ R7 R6 K6 - 0x781E002F, // 005C JMPF R7 #008D - 0x8C1C090C, // 005D GETMET R7 R4 K12 - 0x7C1C0200, // 005E CALL R7 1 - 0x8820010D, // 005F GETMBR R8 R0 K13 - 0x60240010, // 0060 GETGBL R9 G16 - 0x8C28110E, // 0061 GETMET R10 R8 K14 - 0x7C280200, // 0062 CALL R10 1 - 0x7C240200, // 0063 CALL R9 1 - 0xA802000E, // 0064 EXBLK 0 #0074 - 0x5C281200, // 0065 MOVE R10 R9 - 0x7C280000, // 0066 CALL R10 0 - 0x8C2C0F0F, // 0067 GETMET R11 R7 K15 - 0x7C2C0200, // 0068 CALL R11 1 - 0x8C301710, // 0069 GETMET R12 R11 K16 - 0x58380006, // 006A LDCONST R14 K6 - 0x883C0908, // 006B GETMBR R15 R4 K8 - 0x5C401400, // 006C MOVE R16 R10 - 0x7C300800, // 006D CALL R12 4 - 0x8C301710, // 006E GETMET R12 R11 K16 - 0x58380009, // 006F LDCONST R14 K9 - 0x883C0908, // 0070 GETMBR R15 R4 K8 - 0x9440100A, // 0071 GETIDX R16 R8 R10 - 0x7C300800, // 0072 CALL R12 4 - 0x7001FFF0, // 0073 JMP #0065 - 0x58240011, // 0074 LDCONST R9 K17 - 0xAC240200, // 0075 CATCH R9 1 0 - 0xB0080000, // 0076 RAISE 2 R0 R0 - 0x88240112, // 0077 GETMBR R9 R0 K18 - 0x8C241313, // 0078 GETMET R9 R9 K19 - 0x8C2C0314, // 0079 GETMET R11 R1 K20 - 0x7C2C0200, // 007A CALL R11 1 - 0x7C240400, // 007B CALL R9 2 - 0x4C280000, // 007C LDNIL R10 - 0x1C24120A, // 007D EQ R9 R9 R10 - 0x7826000B, // 007E JMPF R9 #008B - 0x8C240F0F, // 007F GETMET R9 R7 K15 - 0x7C240200, // 0080 CALL R9 1 - 0x8C281310, // 0081 GETMET R10 R9 K16 - 0x58300006, // 0082 LDCONST R12 K6 - 0x88340908, // 0083 GETMBR R13 R4 K8 - 0x543A0012, // 0084 LDINT R14 19 - 0x7C280800, // 0085 CALL R10 4 - 0x8C281310, // 0086 GETMET R10 R9 K16 - 0x58300009, // 0087 LDCONST R12 K9 - 0x88340908, // 0088 GETMBR R13 R4 K8 - 0x58380009, // 0089 LDCONST R14 K9 - 0x7C280800, // 008A CALL R10 4 - 0x80040E00, // 008B RET 1 R7 - 0x70020007, // 008C JMP #0095 - 0x601C0003, // 008D GETGBL R7 G3 - 0x5C200000, // 008E MOVE R8 R0 - 0x7C1C0200, // 008F CALL R7 1 - 0x8C1C0F15, // 0090 GETMET R7 R7 K21 - 0x5C240200, // 0091 MOVE R9 R1 - 0x5C280400, // 0092 MOVE R10 R2 - 0x7C1C0600, // 0093 CALL R7 3 - 0x80040E00, // 0094 RET 1 R7 - 0x7002001D, // 0095 JMP #00B4 - 0x541E0038, // 0096 LDINT R7 57 - 0x1C1C0A07, // 0097 EQ R7 R5 R7 - 0x781E0012, // 0098 JMPF R7 #00AC - 0x541E0004, // 0099 LDINT R7 5 - 0x1C1C0C07, // 009A EQ R7 R6 R7 - 0x781E0006, // 009B JMPF R7 #00A3 - 0x8C1C0907, // 009C GETMET R7 R4 K7 - 0x88240916, // 009D GETMBR R9 R4 K22 - 0x8C280117, // 009E GETMET R10 R0 K23 - 0x7C280200, // 009F CALL R10 1 - 0x7C1C0600, // 00A0 CALL R7 3 - 0x80040E00, // 00A1 RET 1 R7 - 0x70020007, // 00A2 JMP #00AB - 0x601C0003, // 00A3 GETGBL R7 G3 - 0x5C200000, // 00A4 MOVE R8 R0 - 0x7C1C0200, // 00A5 CALL R7 1 - 0x8C1C0F15, // 00A6 GETMET R7 R7 K21 - 0x5C240200, // 00A7 MOVE R9 R1 - 0x5C280400, // 00A8 MOVE R10 R2 - 0x7C1C0600, // 00A9 CALL R7 3 - 0x80040E00, // 00AA RET 1 R7 - 0x70020007, // 00AB JMP #00B4 - 0x601C0003, // 00AC GETGBL R7 G3 - 0x5C200000, // 00AD MOVE R8 R0 - 0x7C1C0200, // 00AE CALL R7 1 - 0x8C1C0F15, // 00AF GETMET R7 R7 K21 - 0x5C240200, // 00B0 MOVE R9 R1 - 0x5C280400, // 00B1 MOVE R10 R2 - 0x7C1C0600, // 00B2 CALL R7 3 - 0x80040E00, // 00B3 RET 1 R7 - 0x80000000, // 00B4 RET 0 + 0x1C180904, // 0004 EQ R6 R4 K4 + 0x781A0021, // 0005 JMPF R6 #0028 + 0x1C180B05, // 0006 EQ R6 R5 K5 + 0x781A0005, // 0007 JMPF R6 #000E + 0x8C180706, // 0008 GETMET R6 R3 K6 + 0x88200707, // 0009 GETMBR R8 R3 K7 + 0x58240005, // 000A LDCONST R9 K5 + 0x7C180600, // 000B CALL R6 3 + 0x80040C00, // 000C RET 1 R6 + 0x70020018, // 000D JMP #0027 + 0x1C180B08, // 000E EQ R6 R5 K8 + 0x781A0005, // 000F JMPF R6 #0016 + 0x8C180706, // 0010 GETMET R6 R3 K6 + 0x88200709, // 0011 GETMBR R8 R3 K9 + 0x58240005, // 0012 LDCONST R9 K5 + 0x7C180600, // 0013 CALL R6 3 + 0x80040C00, // 0014 RET 1 R6 + 0x70020010, // 0015 JMP #0027 + 0x541AFFFB, // 0016 LDINT R6 65532 + 0x1C180A06, // 0017 EQ R6 R5 R6 + 0x781A0005, // 0018 JMPF R6 #001F + 0x8C180706, // 0019 GETMET R6 R3 K6 + 0x8820070A, // 001A GETMBR R8 R3 K10 + 0x58240005, // 001B LDCONST R9 K5 + 0x7C180600, // 001C CALL R6 3 + 0x80040C00, // 001D RET 1 R6 + 0x70020007, // 001E JMP #0027 + 0x541AFFFC, // 001F LDINT R6 65533 + 0x1C180A06, // 0020 EQ R6 R5 R6 + 0x781A0004, // 0021 JMPF R6 #0027 + 0x8C180706, // 0022 GETMET R6 R3 K6 + 0x8820070A, // 0023 GETMBR R8 R3 K10 + 0x54260003, // 0024 LDINT R9 4 + 0x7C180600, // 0025 CALL R6 3 + 0x80040C00, // 0026 RET 1 R6 + 0x7002008A, // 0027 JMP #00B3 + 0x541A0003, // 0028 LDINT R6 4 + 0x1C180806, // 0029 EQ R6 R4 R6 + 0x781A0016, // 002A JMPF R6 #0042 + 0x1C180B05, // 002B EQ R6 R5 K5 + 0x781A0002, // 002C JMPF R6 #0030 + 0x4C180000, // 002D LDNIL R6 + 0x80040C00, // 002E RET 1 R6 + 0x70020010, // 002F JMP #0041 + 0x541AFFFB, // 0030 LDINT R6 65532 + 0x1C180A06, // 0031 EQ R6 R5 R6 + 0x781A0005, // 0032 JMPF R6 #0039 + 0x8C180706, // 0033 GETMET R6 R3 K6 + 0x8820070A, // 0034 GETMBR R8 R3 K10 + 0x58240005, // 0035 LDCONST R9 K5 + 0x7C180600, // 0036 CALL R6 3 + 0x80040C00, // 0037 RET 1 R6 + 0x70020007, // 0038 JMP #0041 + 0x541AFFFC, // 0039 LDINT R6 65533 + 0x1C180A06, // 003A EQ R6 R5 R6 + 0x781A0004, // 003B JMPF R6 #0041 + 0x8C180706, // 003C GETMET R6 R3 K6 + 0x8820070A, // 003D GETMBR R8 R3 K10 + 0x54260003, // 003E LDINT R9 4 + 0x7C180600, // 003F CALL R6 3 + 0x80040C00, // 0040 RET 1 R6 + 0x70020070, // 0041 JMP #00B3 + 0x541A0004, // 0042 LDINT R6 5 + 0x1C180806, // 0043 EQ R6 R4 R6 + 0x781A0011, // 0044 JMPF R6 #0057 + 0x541AFFFB, // 0045 LDINT R6 65532 + 0x1C180A06, // 0046 EQ R6 R5 R6 + 0x781A0005, // 0047 JMPF R6 #004E + 0x8C180706, // 0048 GETMET R6 R3 K6 + 0x8820070A, // 0049 GETMBR R8 R3 K10 + 0x58240005, // 004A LDCONST R9 K5 + 0x7C180600, // 004B CALL R6 3 + 0x80040C00, // 004C RET 1 R6 + 0x70020007, // 004D JMP #0056 + 0x541AFFFC, // 004E LDINT R6 65533 + 0x1C180A06, // 004F EQ R6 R5 R6 + 0x781A0004, // 0050 JMPF R6 #0056 + 0x8C180706, // 0051 GETMET R6 R3 K6 + 0x8820070A, // 0052 GETMBR R8 R3 K10 + 0x54260003, // 0053 LDINT R9 4 + 0x7C180600, // 0054 CALL R6 3 + 0x80040C00, // 0055 RET 1 R6 + 0x7002005B, // 0056 JMP #00B3 + 0x541A001C, // 0057 LDINT R6 29 + 0x1C180806, // 0058 EQ R6 R4 R6 + 0x781A003A, // 0059 JMPF R6 #0095 + 0x1C180B05, // 005A EQ R6 R5 K5 + 0x781A002F, // 005B JMPF R6 #008C + 0x8C18070B, // 005C GETMET R6 R3 K11 + 0x7C180200, // 005D CALL R6 1 + 0x881C010C, // 005E GETMBR R7 R0 K12 + 0x60200010, // 005F GETGBL R8 G16 + 0x8C240F0D, // 0060 GETMET R9 R7 K13 + 0x7C240200, // 0061 CALL R9 1 + 0x7C200200, // 0062 CALL R8 1 + 0xA802000E, // 0063 EXBLK 0 #0073 + 0x5C241000, // 0064 MOVE R9 R8 + 0x7C240000, // 0065 CALL R9 0 + 0x8C280D0E, // 0066 GETMET R10 R6 K14 + 0x7C280200, // 0067 CALL R10 1 + 0x8C2C150F, // 0068 GETMET R11 R10 K15 + 0x58340005, // 0069 LDCONST R13 K5 + 0x88380707, // 006A GETMBR R14 R3 K7 + 0x5C3C1200, // 006B MOVE R15 R9 + 0x7C2C0800, // 006C CALL R11 4 + 0x8C2C150F, // 006D GETMET R11 R10 K15 + 0x58340008, // 006E LDCONST R13 K8 + 0x88380707, // 006F GETMBR R14 R3 K7 + 0x943C0E09, // 0070 GETIDX R15 R7 R9 + 0x7C2C0800, // 0071 CALL R11 4 + 0x7001FFF0, // 0072 JMP #0064 + 0x58200010, // 0073 LDCONST R8 K16 + 0xAC200200, // 0074 CATCH R8 1 0 + 0xB0080000, // 0075 RAISE 2 R0 R0 + 0x88200111, // 0076 GETMBR R8 R0 K17 + 0x8C201112, // 0077 GETMET R8 R8 K18 + 0x8C280313, // 0078 GETMET R10 R1 K19 + 0x7C280200, // 0079 CALL R10 1 + 0x7C200400, // 007A CALL R8 2 + 0x4C240000, // 007B LDNIL R9 + 0x1C201009, // 007C EQ R8 R8 R9 + 0x7822000B, // 007D JMPF R8 #008A + 0x8C200D0E, // 007E GETMET R8 R6 K14 + 0x7C200200, // 007F CALL R8 1 + 0x8C24110F, // 0080 GETMET R9 R8 K15 + 0x582C0005, // 0081 LDCONST R11 K5 + 0x88300707, // 0082 GETMBR R12 R3 K7 + 0x54360012, // 0083 LDINT R13 19 + 0x7C240800, // 0084 CALL R9 4 + 0x8C24110F, // 0085 GETMET R9 R8 K15 + 0x582C0008, // 0086 LDCONST R11 K8 + 0x88300707, // 0087 GETMBR R12 R3 K7 + 0x58340008, // 0088 LDCONST R13 K8 + 0x7C240800, // 0089 CALL R9 4 + 0x80040C00, // 008A RET 1 R6 + 0x70020007, // 008B JMP #0094 + 0x60180003, // 008C GETGBL R6 G3 + 0x5C1C0000, // 008D MOVE R7 R0 + 0x7C180200, // 008E CALL R6 1 + 0x8C180D14, // 008F GETMET R6 R6 K20 + 0x5C200200, // 0090 MOVE R8 R1 + 0x5C240400, // 0091 MOVE R9 R2 + 0x7C180600, // 0092 CALL R6 3 + 0x80040C00, // 0093 RET 1 R6 + 0x7002001D, // 0094 JMP #00B3 + 0x541A0038, // 0095 LDINT R6 57 + 0x1C180806, // 0096 EQ R6 R4 R6 + 0x781A0012, // 0097 JMPF R6 #00AB + 0x541A0004, // 0098 LDINT R6 5 + 0x1C180A06, // 0099 EQ R6 R5 R6 + 0x781A0006, // 009A JMPF R6 #00A2 + 0x8C180706, // 009B GETMET R6 R3 K6 + 0x88200715, // 009C GETMBR R8 R3 K21 + 0x8C240116, // 009D GETMET R9 R0 K22 + 0x7C240200, // 009E CALL R9 1 + 0x7C180600, // 009F CALL R6 3 + 0x80040C00, // 00A0 RET 1 R6 + 0x70020007, // 00A1 JMP #00AA + 0x60180003, // 00A2 GETGBL R6 G3 + 0x5C1C0000, // 00A3 MOVE R7 R0 + 0x7C180200, // 00A4 CALL R6 1 + 0x8C180D14, // 00A5 GETMET R6 R6 K20 + 0x5C200200, // 00A6 MOVE R8 R1 + 0x5C240400, // 00A7 MOVE R9 R2 + 0x7C180600, // 00A8 CALL R6 3 + 0x80040C00, // 00A9 RET 1 R6 + 0x70020007, // 00AA JMP #00B3 + 0x60180003, // 00AB GETGBL R6 G3 + 0x5C1C0000, // 00AC MOVE R7 R0 + 0x7C180200, // 00AD CALL R6 1 + 0x8C180D14, // 00AE GETMET R6 R6 K20 + 0x5C200200, // 00AF MOVE R8 R1 + 0x5C240400, // 00B0 MOVE R9 R2 + 0x7C180600, // 00B1 CALL R6 3 + 0x80040C00, // 00B2 RET 1 R6 + 0x80000000, // 00B3 RET 0 }) ) ); diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Light0.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Light0.h index 1cdb57d29..a9fd5b727 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Light0.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Light0.h @@ -67,7 +67,7 @@ be_local_closure(Matter_Plugin_Light0_update_shadow, /* name */ ********************************************************************/ be_local_closure(Matter_Plugin_Light0_read_attribute, /* name */ be_nested_proto( - 11, /* nstack */ + 10, /* nstack */ 3, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -75,68 +75,66 @@ be_local_closure(Matter_Plugin_Light0_read_attribute, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[12]) { /* constants */ - /* K0 */ be_nested_str_weak(string), - /* K1 */ be_nested_str_weak(matter), - /* K2 */ be_nested_str_weak(TLV), - /* K3 */ be_nested_str_weak(cluster), - /* K4 */ be_nested_str_weak(attribute), - /* K5 */ be_nested_str_weak(update_shadow_lazy), - /* K6 */ be_const_int(0), - /* K7 */ be_nested_str_weak(create_TLV), - /* K8 */ be_nested_str_weak(BOOL), - /* K9 */ be_nested_str_weak(shadow_onoff), - /* K10 */ be_nested_str_weak(U4), - /* K11 */ be_nested_str_weak(read_attribute), + ( &(const bvalue[11]) { /* constants */ + /* K0 */ be_nested_str_weak(matter), + /* K1 */ be_nested_str_weak(TLV), + /* K2 */ be_nested_str_weak(cluster), + /* K3 */ be_nested_str_weak(attribute), + /* K4 */ be_nested_str_weak(update_shadow_lazy), + /* K5 */ be_const_int(0), + /* K6 */ be_nested_str_weak(create_TLV), + /* K7 */ be_nested_str_weak(BOOL), + /* K8 */ be_nested_str_weak(shadow_onoff), + /* K9 */ be_nested_str_weak(U4), + /* K10 */ be_nested_str_weak(read_attribute), }), be_str_weak(read_attribute), &be_const_str_solidified, - ( &(const binstruction[45]) { /* code */ - 0xA40E0000, // 0000 IMPORT R3 K0 - 0xB8120200, // 0001 GETNGBL R4 K1 - 0x88100902, // 0002 GETMBR R4 R4 K2 + ( &(const binstruction[44]) { /* code */ + 0xB80E0000, // 0000 GETNGBL R3 K0 + 0x880C0701, // 0001 GETMBR R3 R3 K1 + 0x88100502, // 0002 GETMBR R4 R2 K2 0x88140503, // 0003 GETMBR R5 R2 K3 - 0x88180504, // 0004 GETMBR R6 R2 K4 - 0x541E0005, // 0005 LDINT R7 6 - 0x1C1C0A07, // 0006 EQ R7 R5 R7 - 0x781E001B, // 0007 JMPF R7 #0024 - 0x8C1C0105, // 0008 GETMET R7 R0 K5 - 0x7C1C0200, // 0009 CALL R7 1 - 0x1C1C0D06, // 000A EQ R7 R6 K6 - 0x781E0005, // 000B JMPF R7 #0012 - 0x8C1C0907, // 000C GETMET R7 R4 K7 - 0x88240908, // 000D GETMBR R9 R4 K8 - 0x88280109, // 000E GETMBR R10 R0 K9 - 0x7C1C0600, // 000F CALL R7 3 - 0x80040E00, // 0010 RET 1 R7 - 0x70020010, // 0011 JMP #0023 - 0x541EFFFB, // 0012 LDINT R7 65532 - 0x1C1C0C07, // 0013 EQ R7 R6 R7 - 0x781E0005, // 0014 JMPF R7 #001B - 0x8C1C0907, // 0015 GETMET R7 R4 K7 - 0x8824090A, // 0016 GETMBR R9 R4 K10 - 0x58280006, // 0017 LDCONST R10 K6 - 0x7C1C0600, // 0018 CALL R7 3 - 0x80040E00, // 0019 RET 1 R7 - 0x70020007, // 001A JMP #0023 - 0x541EFFFC, // 001B LDINT R7 65533 - 0x1C1C0C07, // 001C EQ R7 R6 R7 - 0x781E0004, // 001D JMPF R7 #0023 - 0x8C1C0907, // 001E GETMET R7 R4 K7 - 0x8824090A, // 001F GETMBR R9 R4 K10 - 0x542A0003, // 0020 LDINT R10 4 - 0x7C1C0600, // 0021 CALL R7 3 - 0x80040E00, // 0022 RET 1 R7 - 0x70020007, // 0023 JMP #002C - 0x601C0003, // 0024 GETGBL R7 G3 - 0x5C200000, // 0025 MOVE R8 R0 - 0x7C1C0200, // 0026 CALL R7 1 - 0x8C1C0F0B, // 0027 GETMET R7 R7 K11 - 0x5C240200, // 0028 MOVE R9 R1 - 0x5C280400, // 0029 MOVE R10 R2 - 0x7C1C0600, // 002A CALL R7 3 - 0x80040E00, // 002B RET 1 R7 - 0x80000000, // 002C RET 0 + 0x541A0005, // 0004 LDINT R6 6 + 0x1C180806, // 0005 EQ R6 R4 R6 + 0x781A001B, // 0006 JMPF R6 #0023 + 0x8C180104, // 0007 GETMET R6 R0 K4 + 0x7C180200, // 0008 CALL R6 1 + 0x1C180B05, // 0009 EQ R6 R5 K5 + 0x781A0005, // 000A JMPF R6 #0011 + 0x8C180706, // 000B GETMET R6 R3 K6 + 0x88200707, // 000C GETMBR R8 R3 K7 + 0x88240108, // 000D GETMBR R9 R0 K8 + 0x7C180600, // 000E CALL R6 3 + 0x80040C00, // 000F RET 1 R6 + 0x70020010, // 0010 JMP #0022 + 0x541AFFFB, // 0011 LDINT R6 65532 + 0x1C180A06, // 0012 EQ R6 R5 R6 + 0x781A0005, // 0013 JMPF R6 #001A + 0x8C180706, // 0014 GETMET R6 R3 K6 + 0x88200709, // 0015 GETMBR R8 R3 K9 + 0x58240005, // 0016 LDCONST R9 K5 + 0x7C180600, // 0017 CALL R6 3 + 0x80040C00, // 0018 RET 1 R6 + 0x70020007, // 0019 JMP #0022 + 0x541AFFFC, // 001A LDINT R6 65533 + 0x1C180A06, // 001B EQ R6 R5 R6 + 0x781A0004, // 001C JMPF R6 #0022 + 0x8C180706, // 001D GETMET R6 R3 K6 + 0x88200709, // 001E GETMBR R8 R3 K9 + 0x54260003, // 001F LDINT R9 4 + 0x7C180600, // 0020 CALL R6 3 + 0x80040C00, // 0021 RET 1 R6 + 0x70020007, // 0022 JMP #002B + 0x60180003, // 0023 GETGBL R6 G3 + 0x5C1C0000, // 0024 MOVE R7 R0 + 0x7C180200, // 0025 CALL R6 1 + 0x8C180D0A, // 0026 GETMET R6 R6 K10 + 0x5C200200, // 0027 MOVE R8 R1 + 0x5C240400, // 0028 MOVE R9 R2 + 0x7C180600, // 0029 CALL R6 3 + 0x80040C00, // 002A RET 1 R6 + 0x80000000, // 002B RET 0 }) ) ); diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Light1.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Light1.h index df604d067..ca1b20831 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Light1.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Light1.h @@ -237,7 +237,7 @@ be_local_closure(Matter_Plugin_Light1_invoke_request, /* name */ ********************************************************************/ be_local_closure(Matter_Plugin_Light1_read_attribute, /* name */ be_nested_proto( - 11, /* nstack */ + 10, /* nstack */ 3, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -245,105 +245,103 @@ be_local_closure(Matter_Plugin_Light1_read_attribute, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[15]) { /* constants */ - /* K0 */ be_nested_str_weak(string), - /* K1 */ be_nested_str_weak(matter), - /* K2 */ be_nested_str_weak(TLV), - /* K3 */ be_nested_str_weak(cluster), - /* K4 */ be_nested_str_weak(attribute), - /* K5 */ be_nested_str_weak(update_shadow_lazy), - /* K6 */ be_const_int(0), - /* K7 */ be_nested_str_weak(create_TLV), - /* K8 */ be_nested_str_weak(U1), - /* K9 */ be_nested_str_weak(shadow_bri), - /* K10 */ be_const_int(2), - /* K11 */ be_const_int(3), - /* K12 */ be_nested_str_weak(U4), - /* K13 */ be_const_int(1), - /* K14 */ be_nested_str_weak(read_attribute), + ( &(const bvalue[14]) { /* constants */ + /* K0 */ be_nested_str_weak(matter), + /* K1 */ be_nested_str_weak(TLV), + /* K2 */ be_nested_str_weak(cluster), + /* K3 */ be_nested_str_weak(attribute), + /* K4 */ be_nested_str_weak(update_shadow_lazy), + /* K5 */ be_const_int(0), + /* K6 */ be_nested_str_weak(create_TLV), + /* K7 */ be_nested_str_weak(U1), + /* K8 */ be_nested_str_weak(shadow_bri), + /* K9 */ be_const_int(2), + /* K10 */ be_const_int(3), + /* K11 */ be_nested_str_weak(U4), + /* K12 */ be_const_int(1), + /* K13 */ be_nested_str_weak(read_attribute), }), be_str_weak(read_attribute), &be_const_str_solidified, - ( &(const binstruction[79]) { /* code */ - 0xA40E0000, // 0000 IMPORT R3 K0 - 0xB8120200, // 0001 GETNGBL R4 K1 - 0x88100902, // 0002 GETMBR R4 R4 K2 + ( &(const binstruction[78]) { /* code */ + 0xB80E0000, // 0000 GETNGBL R3 K0 + 0x880C0701, // 0001 GETMBR R3 R3 K1 + 0x88100502, // 0002 GETMBR R4 R2 K2 0x88140503, // 0003 GETMBR R5 R2 K3 - 0x88180504, // 0004 GETMBR R6 R2 K4 - 0x541E0007, // 0005 LDINT R7 8 - 0x1C1C0A07, // 0006 EQ R7 R5 R7 - 0x781E003D, // 0007 JMPF R7 #0046 - 0x8C1C0105, // 0008 GETMET R7 R0 K5 - 0x7C1C0200, // 0009 CALL R7 1 - 0x1C1C0D06, // 000A EQ R7 R6 K6 - 0x781E0005, // 000B JMPF R7 #0012 - 0x8C1C0907, // 000C GETMET R7 R4 K7 - 0x88240908, // 000D GETMBR R9 R4 K8 - 0x88280109, // 000E GETMBR R10 R0 K9 - 0x7C1C0600, // 000F CALL R7 3 - 0x80040E00, // 0010 RET 1 R7 - 0x70020032, // 0011 JMP #0045 - 0x1C1C0D0A, // 0012 EQ R7 R6 K10 - 0x781E0005, // 0013 JMPF R7 #001A - 0x8C1C0907, // 0014 GETMET R7 R4 K7 - 0x88240908, // 0015 GETMBR R9 R4 K8 - 0x58280006, // 0016 LDCONST R10 K6 - 0x7C1C0600, // 0017 CALL R7 3 - 0x80040E00, // 0018 RET 1 R7 - 0x7002002A, // 0019 JMP #0045 - 0x1C1C0D0B, // 001A EQ R7 R6 K11 - 0x781E0005, // 001B JMPF R7 #0022 - 0x8C1C0907, // 001C GETMET R7 R4 K7 - 0x88240908, // 001D GETMBR R9 R4 K8 - 0x542A00FD, // 001E LDINT R10 254 - 0x7C1C0600, // 001F CALL R7 3 - 0x80040E00, // 0020 RET 1 R7 - 0x70020022, // 0021 JMP #0045 - 0x541E000E, // 0022 LDINT R7 15 - 0x1C1C0C07, // 0023 EQ R7 R6 R7 - 0x781E0005, // 0024 JMPF R7 #002B - 0x8C1C0907, // 0025 GETMET R7 R4 K7 - 0x88240908, // 0026 GETMBR R9 R4 K8 - 0x58280006, // 0027 LDCONST R10 K6 - 0x7C1C0600, // 0028 CALL R7 3 - 0x80040E00, // 0029 RET 1 R7 - 0x70020019, // 002A JMP #0045 - 0x541E0010, // 002B LDINT R7 17 - 0x1C1C0C07, // 002C EQ R7 R6 R7 - 0x781E0005, // 002D JMPF R7 #0034 - 0x8C1C0907, // 002E GETMET R7 R4 K7 - 0x88240908, // 002F GETMBR R9 R4 K8 - 0x88280109, // 0030 GETMBR R10 R0 K9 - 0x7C1C0600, // 0031 CALL R7 3 - 0x80040E00, // 0032 RET 1 R7 - 0x70020010, // 0033 JMP #0045 - 0x541EFFFB, // 0034 LDINT R7 65532 - 0x1C1C0C07, // 0035 EQ R7 R6 R7 - 0x781E0005, // 0036 JMPF R7 #003D - 0x8C1C0907, // 0037 GETMET R7 R4 K7 - 0x8824090C, // 0038 GETMBR R9 R4 K12 - 0x5828000D, // 0039 LDCONST R10 K13 - 0x7C1C0600, // 003A CALL R7 3 - 0x80040E00, // 003B RET 1 R7 - 0x70020007, // 003C JMP #0045 - 0x541EFFFC, // 003D LDINT R7 65533 - 0x1C1C0C07, // 003E EQ R7 R6 R7 - 0x781E0004, // 003F JMPF R7 #0045 - 0x8C1C0907, // 0040 GETMET R7 R4 K7 - 0x8824090C, // 0041 GETMBR R9 R4 K12 - 0x542A0004, // 0042 LDINT R10 5 - 0x7C1C0600, // 0043 CALL R7 3 - 0x80040E00, // 0044 RET 1 R7 - 0x70020007, // 0045 JMP #004E - 0x601C0003, // 0046 GETGBL R7 G3 - 0x5C200000, // 0047 MOVE R8 R0 - 0x7C1C0200, // 0048 CALL R7 1 - 0x8C1C0F0E, // 0049 GETMET R7 R7 K14 - 0x5C240200, // 004A MOVE R9 R1 - 0x5C280400, // 004B MOVE R10 R2 - 0x7C1C0600, // 004C CALL R7 3 - 0x80040E00, // 004D RET 1 R7 - 0x80000000, // 004E RET 0 + 0x541A0007, // 0004 LDINT R6 8 + 0x1C180806, // 0005 EQ R6 R4 R6 + 0x781A003D, // 0006 JMPF R6 #0045 + 0x8C180104, // 0007 GETMET R6 R0 K4 + 0x7C180200, // 0008 CALL R6 1 + 0x1C180B05, // 0009 EQ R6 R5 K5 + 0x781A0005, // 000A JMPF R6 #0011 + 0x8C180706, // 000B GETMET R6 R3 K6 + 0x88200707, // 000C GETMBR R8 R3 K7 + 0x88240108, // 000D GETMBR R9 R0 K8 + 0x7C180600, // 000E CALL R6 3 + 0x80040C00, // 000F RET 1 R6 + 0x70020032, // 0010 JMP #0044 + 0x1C180B09, // 0011 EQ R6 R5 K9 + 0x781A0005, // 0012 JMPF R6 #0019 + 0x8C180706, // 0013 GETMET R6 R3 K6 + 0x88200707, // 0014 GETMBR R8 R3 K7 + 0x58240005, // 0015 LDCONST R9 K5 + 0x7C180600, // 0016 CALL R6 3 + 0x80040C00, // 0017 RET 1 R6 + 0x7002002A, // 0018 JMP #0044 + 0x1C180B0A, // 0019 EQ R6 R5 K10 + 0x781A0005, // 001A JMPF R6 #0021 + 0x8C180706, // 001B GETMET R6 R3 K6 + 0x88200707, // 001C GETMBR R8 R3 K7 + 0x542600FD, // 001D LDINT R9 254 + 0x7C180600, // 001E CALL R6 3 + 0x80040C00, // 001F RET 1 R6 + 0x70020022, // 0020 JMP #0044 + 0x541A000E, // 0021 LDINT R6 15 + 0x1C180A06, // 0022 EQ R6 R5 R6 + 0x781A0005, // 0023 JMPF R6 #002A + 0x8C180706, // 0024 GETMET R6 R3 K6 + 0x88200707, // 0025 GETMBR R8 R3 K7 + 0x58240005, // 0026 LDCONST R9 K5 + 0x7C180600, // 0027 CALL R6 3 + 0x80040C00, // 0028 RET 1 R6 + 0x70020019, // 0029 JMP #0044 + 0x541A0010, // 002A LDINT R6 17 + 0x1C180A06, // 002B EQ R6 R5 R6 + 0x781A0005, // 002C JMPF R6 #0033 + 0x8C180706, // 002D GETMET R6 R3 K6 + 0x88200707, // 002E GETMBR R8 R3 K7 + 0x88240108, // 002F GETMBR R9 R0 K8 + 0x7C180600, // 0030 CALL R6 3 + 0x80040C00, // 0031 RET 1 R6 + 0x70020010, // 0032 JMP #0044 + 0x541AFFFB, // 0033 LDINT R6 65532 + 0x1C180A06, // 0034 EQ R6 R5 R6 + 0x781A0005, // 0035 JMPF R6 #003C + 0x8C180706, // 0036 GETMET R6 R3 K6 + 0x8820070B, // 0037 GETMBR R8 R3 K11 + 0x5824000C, // 0038 LDCONST R9 K12 + 0x7C180600, // 0039 CALL R6 3 + 0x80040C00, // 003A RET 1 R6 + 0x70020007, // 003B JMP #0044 + 0x541AFFFC, // 003C LDINT R6 65533 + 0x1C180A06, // 003D EQ R6 R5 R6 + 0x781A0004, // 003E JMPF R6 #0044 + 0x8C180706, // 003F GETMET R6 R3 K6 + 0x8820070B, // 0040 GETMBR R8 R3 K11 + 0x54260004, // 0041 LDINT R9 5 + 0x7C180600, // 0042 CALL R6 3 + 0x80040C00, // 0043 RET 1 R6 + 0x70020007, // 0044 JMP #004D + 0x60180003, // 0045 GETGBL R6 G3 + 0x5C1C0000, // 0046 MOVE R7 R0 + 0x7C180200, // 0047 CALL R6 1 + 0x8C180D0D, // 0048 GETMET R6 R6 K13 + 0x5C200200, // 0049 MOVE R8 R1 + 0x5C240400, // 004A MOVE R9 R2 + 0x7C180600, // 004B CALL R6 3 + 0x80040C00, // 004C RET 1 R6 + 0x80000000, // 004D RET 0 }) ) ); diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Light2.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Light2.h index 51ed67fe8..55b734a1d 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Light2.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Light2.h @@ -11,7 +11,7 @@ extern const bclass be_class_Matter_Plugin_Light2; ********************************************************************/ be_local_closure(Matter_Plugin_Light2_read_attribute, /* name */ be_nested_proto( - 11, /* nstack */ + 10, /* nstack */ 3, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -19,108 +19,106 @@ be_local_closure(Matter_Plugin_Light2_read_attribute, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[15]) { /* constants */ - /* K0 */ be_nested_str_weak(string), - /* K1 */ be_nested_str_weak(matter), - /* K2 */ be_nested_str_weak(TLV), - /* K3 */ be_nested_str_weak(cluster), - /* K4 */ be_nested_str_weak(attribute), - /* K5 */ be_nested_str_weak(update_shadow_lazy), - /* K6 */ be_nested_str_weak(create_TLV), - /* K7 */ be_nested_str_weak(U1), - /* K8 */ be_nested_str_weak(shadow_ct), - /* K9 */ be_const_int(2), - /* K10 */ be_const_int(0), - /* K11 */ be_nested_str_weak(ct_min), - /* K12 */ be_nested_str_weak(ct_max), - /* K13 */ be_nested_str_weak(U4), - /* K14 */ be_nested_str_weak(read_attribute), + ( &(const bvalue[14]) { /* constants */ + /* K0 */ be_nested_str_weak(matter), + /* K1 */ be_nested_str_weak(TLV), + /* K2 */ be_nested_str_weak(cluster), + /* K3 */ be_nested_str_weak(attribute), + /* K4 */ be_nested_str_weak(update_shadow_lazy), + /* K5 */ be_nested_str_weak(create_TLV), + /* K6 */ be_nested_str_weak(U1), + /* K7 */ be_nested_str_weak(shadow_ct), + /* K8 */ be_const_int(2), + /* K9 */ be_const_int(0), + /* K10 */ be_nested_str_weak(ct_min), + /* K11 */ be_nested_str_weak(ct_max), + /* K12 */ be_nested_str_weak(U4), + /* K13 */ be_nested_str_weak(read_attribute), }), be_str_weak(read_attribute), &be_const_str_solidified, - ( &(const binstruction[82]) { /* code */ - 0xA40E0000, // 0000 IMPORT R3 K0 - 0xB8120200, // 0001 GETNGBL R4 K1 - 0x88100902, // 0002 GETMBR R4 R4 K2 + ( &(const binstruction[81]) { /* code */ + 0xB80E0000, // 0000 GETNGBL R3 K0 + 0x880C0701, // 0001 GETMBR R3 R3 K1 + 0x88100502, // 0002 GETMBR R4 R2 K2 0x88140503, // 0003 GETMBR R5 R2 K3 - 0x88180504, // 0004 GETMBR R6 R2 K4 - 0x541E02FF, // 0005 LDINT R7 768 - 0x1C1C0A07, // 0006 EQ R7 R5 R7 - 0x781E0040, // 0007 JMPF R7 #0049 - 0x8C1C0105, // 0008 GETMET R7 R0 K5 - 0x7C1C0200, // 0009 CALL R7 1 - 0x541E0006, // 000A LDINT R7 7 - 0x1C1C0C07, // 000B EQ R7 R6 R7 - 0x781E0005, // 000C JMPF R7 #0013 - 0x8C1C0906, // 000D GETMET R7 R4 K6 - 0x88240907, // 000E GETMBR R9 R4 K7 - 0x88280108, // 000F GETMBR R10 R0 K8 - 0x7C1C0600, // 0010 CALL R7 3 - 0x80040E00, // 0011 RET 1 R7 - 0x70020034, // 0012 JMP #0048 - 0x541E0007, // 0013 LDINT R7 8 - 0x1C1C0C07, // 0014 EQ R7 R6 R7 - 0x781E0005, // 0015 JMPF R7 #001C - 0x8C1C0906, // 0016 GETMET R7 R4 K6 - 0x88240907, // 0017 GETMBR R9 R4 K7 - 0x58280009, // 0018 LDCONST R10 K9 - 0x7C1C0600, // 0019 CALL R7 3 - 0x80040E00, // 001A RET 1 R7 - 0x7002002B, // 001B JMP #0048 - 0x541E000E, // 001C LDINT R7 15 - 0x1C1C0C07, // 001D EQ R7 R6 R7 - 0x781E0005, // 001E JMPF R7 #0025 - 0x8C1C0906, // 001F GETMET R7 R4 K6 - 0x88240907, // 0020 GETMBR R9 R4 K7 - 0x5828000A, // 0021 LDCONST R10 K10 - 0x7C1C0600, // 0022 CALL R7 3 - 0x80040E00, // 0023 RET 1 R7 - 0x70020022, // 0024 JMP #0048 - 0x541E400A, // 0025 LDINT R7 16395 - 0x1C1C0C07, // 0026 EQ R7 R6 R7 - 0x781E0005, // 0027 JMPF R7 #002E - 0x8C1C0906, // 0028 GETMET R7 R4 K6 - 0x88240907, // 0029 GETMBR R9 R4 K7 - 0x8828010B, // 002A GETMBR R10 R0 K11 - 0x7C1C0600, // 002B CALL R7 3 - 0x80040E00, // 002C RET 1 R7 - 0x70020019, // 002D JMP #0048 - 0x541E400B, // 002E LDINT R7 16396 - 0x1C1C0C07, // 002F EQ R7 R6 R7 - 0x781E0005, // 0030 JMPF R7 #0037 - 0x8C1C0906, // 0031 GETMET R7 R4 K6 - 0x88240907, // 0032 GETMBR R9 R4 K7 - 0x8828010C, // 0033 GETMBR R10 R0 K12 - 0x7C1C0600, // 0034 CALL R7 3 - 0x80040E00, // 0035 RET 1 R7 - 0x70020010, // 0036 JMP #0048 - 0x541EFFFB, // 0037 LDINT R7 65532 - 0x1C1C0C07, // 0038 EQ R7 R6 R7 - 0x781E0005, // 0039 JMPF R7 #0040 - 0x8C1C0906, // 003A GETMET R7 R4 K6 - 0x8824090D, // 003B GETMBR R9 R4 K13 - 0x542A000F, // 003C LDINT R10 16 - 0x7C1C0600, // 003D CALL R7 3 - 0x80040E00, // 003E RET 1 R7 - 0x70020007, // 003F JMP #0048 - 0x541EFFFC, // 0040 LDINT R7 65533 - 0x1C1C0C07, // 0041 EQ R7 R6 R7 - 0x781E0004, // 0042 JMPF R7 #0048 - 0x8C1C0906, // 0043 GETMET R7 R4 K6 - 0x8824090D, // 0044 GETMBR R9 R4 K13 - 0x542A0004, // 0045 LDINT R10 5 - 0x7C1C0600, // 0046 CALL R7 3 - 0x80040E00, // 0047 RET 1 R7 - 0x70020007, // 0048 JMP #0051 - 0x601C0003, // 0049 GETGBL R7 G3 - 0x5C200000, // 004A MOVE R8 R0 - 0x7C1C0200, // 004B CALL R7 1 - 0x8C1C0F0E, // 004C GETMET R7 R7 K14 - 0x5C240200, // 004D MOVE R9 R1 - 0x5C280400, // 004E MOVE R10 R2 - 0x7C1C0600, // 004F CALL R7 3 - 0x80040E00, // 0050 RET 1 R7 - 0x80000000, // 0051 RET 0 + 0x541A02FF, // 0004 LDINT R6 768 + 0x1C180806, // 0005 EQ R6 R4 R6 + 0x781A0040, // 0006 JMPF R6 #0048 + 0x8C180104, // 0007 GETMET R6 R0 K4 + 0x7C180200, // 0008 CALL R6 1 + 0x541A0006, // 0009 LDINT R6 7 + 0x1C180A06, // 000A EQ R6 R5 R6 + 0x781A0005, // 000B JMPF R6 #0012 + 0x8C180705, // 000C GETMET R6 R3 K5 + 0x88200706, // 000D GETMBR R8 R3 K6 + 0x88240107, // 000E GETMBR R9 R0 K7 + 0x7C180600, // 000F CALL R6 3 + 0x80040C00, // 0010 RET 1 R6 + 0x70020034, // 0011 JMP #0047 + 0x541A0007, // 0012 LDINT R6 8 + 0x1C180A06, // 0013 EQ R6 R5 R6 + 0x781A0005, // 0014 JMPF R6 #001B + 0x8C180705, // 0015 GETMET R6 R3 K5 + 0x88200706, // 0016 GETMBR R8 R3 K6 + 0x58240008, // 0017 LDCONST R9 K8 + 0x7C180600, // 0018 CALL R6 3 + 0x80040C00, // 0019 RET 1 R6 + 0x7002002B, // 001A JMP #0047 + 0x541A000E, // 001B LDINT R6 15 + 0x1C180A06, // 001C EQ R6 R5 R6 + 0x781A0005, // 001D JMPF R6 #0024 + 0x8C180705, // 001E GETMET R6 R3 K5 + 0x88200706, // 001F GETMBR R8 R3 K6 + 0x58240009, // 0020 LDCONST R9 K9 + 0x7C180600, // 0021 CALL R6 3 + 0x80040C00, // 0022 RET 1 R6 + 0x70020022, // 0023 JMP #0047 + 0x541A400A, // 0024 LDINT R6 16395 + 0x1C180A06, // 0025 EQ R6 R5 R6 + 0x781A0005, // 0026 JMPF R6 #002D + 0x8C180705, // 0027 GETMET R6 R3 K5 + 0x88200706, // 0028 GETMBR R8 R3 K6 + 0x8824010A, // 0029 GETMBR R9 R0 K10 + 0x7C180600, // 002A CALL R6 3 + 0x80040C00, // 002B RET 1 R6 + 0x70020019, // 002C JMP #0047 + 0x541A400B, // 002D LDINT R6 16396 + 0x1C180A06, // 002E EQ R6 R5 R6 + 0x781A0005, // 002F JMPF R6 #0036 + 0x8C180705, // 0030 GETMET R6 R3 K5 + 0x88200706, // 0031 GETMBR R8 R3 K6 + 0x8824010B, // 0032 GETMBR R9 R0 K11 + 0x7C180600, // 0033 CALL R6 3 + 0x80040C00, // 0034 RET 1 R6 + 0x70020010, // 0035 JMP #0047 + 0x541AFFFB, // 0036 LDINT R6 65532 + 0x1C180A06, // 0037 EQ R6 R5 R6 + 0x781A0005, // 0038 JMPF R6 #003F + 0x8C180705, // 0039 GETMET R6 R3 K5 + 0x8820070C, // 003A GETMBR R8 R3 K12 + 0x5426000F, // 003B LDINT R9 16 + 0x7C180600, // 003C CALL R6 3 + 0x80040C00, // 003D RET 1 R6 + 0x70020007, // 003E JMP #0047 + 0x541AFFFC, // 003F LDINT R6 65533 + 0x1C180A06, // 0040 EQ R6 R5 R6 + 0x781A0004, // 0041 JMPF R6 #0047 + 0x8C180705, // 0042 GETMET R6 R3 K5 + 0x8820070C, // 0043 GETMBR R8 R3 K12 + 0x54260004, // 0044 LDINT R9 5 + 0x7C180600, // 0045 CALL R6 3 + 0x80040C00, // 0046 RET 1 R6 + 0x70020007, // 0047 JMP #0050 + 0x60180003, // 0048 GETGBL R6 G3 + 0x5C1C0000, // 0049 MOVE R7 R0 + 0x7C180200, // 004A CALL R6 1 + 0x8C180D0D, // 004B GETMET R6 R6 K13 + 0x5C200200, // 004C MOVE R8 R1 + 0x5C240400, // 004D MOVE R9 R2 + 0x7C180600, // 004E CALL R6 3 + 0x80040C00, // 004F RET 1 R6 + 0x80000000, // 0050 RET 0 }) ) ); diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Light3.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Light3.h index 462c93f88..97ac6cc6b 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Light3.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Light3.h @@ -112,7 +112,7 @@ be_local_closure(Matter_Plugin_Light3_update_shadow, /* name */ ********************************************************************/ be_local_closure(Matter_Plugin_Light3_read_attribute, /* name */ be_nested_proto( - 11, /* nstack */ + 10, /* nstack */ 3, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -120,132 +120,130 @@ be_local_closure(Matter_Plugin_Light3_read_attribute, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[14]) { /* constants */ - /* K0 */ be_nested_str_weak(string), - /* K1 */ be_nested_str_weak(matter), - /* K2 */ be_nested_str_weak(TLV), - /* K3 */ be_nested_str_weak(cluster), - /* K4 */ be_nested_str_weak(attribute), - /* K5 */ be_nested_str_weak(update_shadow_lazy), - /* K6 */ be_const_int(0), - /* K7 */ be_nested_str_weak(create_TLV), - /* K8 */ be_nested_str_weak(U1), - /* K9 */ be_nested_str_weak(shadow_hue), - /* K10 */ be_const_int(1), - /* K11 */ be_nested_str_weak(shadow_sat), - /* K12 */ be_nested_str_weak(U4), - /* K13 */ be_nested_str_weak(read_attribute), + ( &(const bvalue[13]) { /* constants */ + /* K0 */ be_nested_str_weak(matter), + /* K1 */ be_nested_str_weak(TLV), + /* K2 */ be_nested_str_weak(cluster), + /* K3 */ be_nested_str_weak(attribute), + /* K4 */ be_nested_str_weak(update_shadow_lazy), + /* K5 */ be_const_int(0), + /* K6 */ be_nested_str_weak(create_TLV), + /* K7 */ be_nested_str_weak(U1), + /* K8 */ be_nested_str_weak(shadow_hue), + /* K9 */ be_const_int(1), + /* K10 */ be_nested_str_weak(shadow_sat), + /* K11 */ be_nested_str_weak(U4), + /* K12 */ be_nested_str_weak(read_attribute), }), be_str_weak(read_attribute), &be_const_str_solidified, - ( &(const binstruction[107]) { /* code */ - 0xA40E0000, // 0000 IMPORT R3 K0 - 0xB8120200, // 0001 GETNGBL R4 K1 - 0x88100902, // 0002 GETMBR R4 R4 K2 + ( &(const binstruction[106]) { /* code */ + 0xB80E0000, // 0000 GETNGBL R3 K0 + 0x880C0701, // 0001 GETMBR R3 R3 K1 + 0x88100502, // 0002 GETMBR R4 R2 K2 0x88140503, // 0003 GETMBR R5 R2 K3 - 0x88180504, // 0004 GETMBR R6 R2 K4 - 0x541E02FF, // 0005 LDINT R7 768 - 0x1C1C0A07, // 0006 EQ R7 R5 R7 - 0x781E0059, // 0007 JMPF R7 #0062 - 0x8C1C0105, // 0008 GETMET R7 R0 K5 - 0x7C1C0200, // 0009 CALL R7 1 - 0x1C1C0D06, // 000A EQ R7 R6 K6 - 0x781E0005, // 000B JMPF R7 #0012 - 0x8C1C0907, // 000C GETMET R7 R4 K7 - 0x88240908, // 000D GETMBR R9 R4 K8 - 0x88280109, // 000E GETMBR R10 R0 K9 - 0x7C1C0600, // 000F CALL R7 3 - 0x80040E00, // 0010 RET 1 R7 - 0x7002004E, // 0011 JMP #0061 - 0x1C1C0D0A, // 0012 EQ R7 R6 K10 - 0x781E0005, // 0013 JMPF R7 #001A - 0x8C1C0907, // 0014 GETMET R7 R4 K7 - 0x88240908, // 0015 GETMBR R9 R4 K8 - 0x8828010B, // 0016 GETMBR R10 R0 K11 - 0x7C1C0600, // 0017 CALL R7 3 - 0x80040E00, // 0018 RET 1 R7 - 0x70020046, // 0019 JMP #0061 - 0x541E0006, // 001A LDINT R7 7 - 0x1C1C0C07, // 001B EQ R7 R6 R7 - 0x781E0005, // 001C JMPF R7 #0023 - 0x8C1C0907, // 001D GETMET R7 R4 K7 - 0x88240908, // 001E GETMBR R9 R4 K8 - 0x58280006, // 001F LDCONST R10 K6 - 0x7C1C0600, // 0020 CALL R7 3 - 0x80040E00, // 0021 RET 1 R7 - 0x7002003D, // 0022 JMP #0061 - 0x541E0007, // 0023 LDINT R7 8 - 0x1C1C0C07, // 0024 EQ R7 R6 R7 - 0x781E0005, // 0025 JMPF R7 #002C - 0x8C1C0907, // 0026 GETMET R7 R4 K7 - 0x88240908, // 0027 GETMBR R9 R4 K8 - 0x58280006, // 0028 LDCONST R10 K6 - 0x7C1C0600, // 0029 CALL R7 3 - 0x80040E00, // 002A RET 1 R7 - 0x70020034, // 002B JMP #0061 - 0x541E000E, // 002C LDINT R7 15 - 0x1C1C0C07, // 002D EQ R7 R6 R7 - 0x781E0005, // 002E JMPF R7 #0035 - 0x8C1C0907, // 002F GETMET R7 R4 K7 - 0x88240908, // 0030 GETMBR R9 R4 K8 - 0x58280006, // 0031 LDCONST R10 K6 - 0x7C1C0600, // 0032 CALL R7 3 - 0x80040E00, // 0033 RET 1 R7 - 0x7002002B, // 0034 JMP #0061 - 0x541E4000, // 0035 LDINT R7 16385 - 0x1C1C0C07, // 0036 EQ R7 R6 R7 - 0x781E0005, // 0037 JMPF R7 #003E - 0x8C1C0907, // 0038 GETMET R7 R4 K7 - 0x88240908, // 0039 GETMBR R9 R4 K8 - 0x58280006, // 003A LDCONST R10 K6 - 0x7C1C0600, // 003B CALL R7 3 - 0x80040E00, // 003C RET 1 R7 - 0x70020022, // 003D JMP #0061 - 0x541E4009, // 003E LDINT R7 16394 - 0x1C1C0C07, // 003F EQ R7 R6 R7 - 0x781E0005, // 0040 JMPF R7 #0047 - 0x8C1C0907, // 0041 GETMET R7 R4 K7 - 0x88240908, // 0042 GETMBR R9 R4 K8 - 0x5828000A, // 0043 LDCONST R10 K10 - 0x7C1C0600, // 0044 CALL R7 3 - 0x80040E00, // 0045 RET 1 R7 - 0x70020019, // 0046 JMP #0061 - 0x541E000F, // 0047 LDINT R7 16 - 0x1C1C0C07, // 0048 EQ R7 R6 R7 - 0x781E0005, // 0049 JMPF R7 #0050 - 0x8C1C0907, // 004A GETMET R7 R4 K7 - 0x88240908, // 004B GETMBR R9 R4 K8 - 0x58280006, // 004C LDCONST R10 K6 - 0x7C1C0600, // 004D CALL R7 3 - 0x80040E00, // 004E RET 1 R7 - 0x70020010, // 004F JMP #0061 - 0x541EFFFB, // 0050 LDINT R7 65532 - 0x1C1C0C07, // 0051 EQ R7 R6 R7 - 0x781E0005, // 0052 JMPF R7 #0059 - 0x8C1C0907, // 0053 GETMET R7 R4 K7 - 0x8824090C, // 0054 GETMBR R9 R4 K12 - 0x5828000A, // 0055 LDCONST R10 K10 - 0x7C1C0600, // 0056 CALL R7 3 - 0x80040E00, // 0057 RET 1 R7 - 0x70020007, // 0058 JMP #0061 - 0x541EFFFC, // 0059 LDINT R7 65533 - 0x1C1C0C07, // 005A EQ R7 R6 R7 - 0x781E0004, // 005B JMPF R7 #0061 - 0x8C1C0907, // 005C GETMET R7 R4 K7 - 0x8824090C, // 005D GETMBR R9 R4 K12 - 0x542A0004, // 005E LDINT R10 5 - 0x7C1C0600, // 005F CALL R7 3 - 0x80040E00, // 0060 RET 1 R7 - 0x70020007, // 0061 JMP #006A - 0x601C0003, // 0062 GETGBL R7 G3 - 0x5C200000, // 0063 MOVE R8 R0 - 0x7C1C0200, // 0064 CALL R7 1 - 0x8C1C0F0D, // 0065 GETMET R7 R7 K13 - 0x5C240200, // 0066 MOVE R9 R1 - 0x5C280400, // 0067 MOVE R10 R2 - 0x7C1C0600, // 0068 CALL R7 3 - 0x80040E00, // 0069 RET 1 R7 - 0x80000000, // 006A RET 0 + 0x541A02FF, // 0004 LDINT R6 768 + 0x1C180806, // 0005 EQ R6 R4 R6 + 0x781A0059, // 0006 JMPF R6 #0061 + 0x8C180104, // 0007 GETMET R6 R0 K4 + 0x7C180200, // 0008 CALL R6 1 + 0x1C180B05, // 0009 EQ R6 R5 K5 + 0x781A0005, // 000A JMPF R6 #0011 + 0x8C180706, // 000B GETMET R6 R3 K6 + 0x88200707, // 000C GETMBR R8 R3 K7 + 0x88240108, // 000D GETMBR R9 R0 K8 + 0x7C180600, // 000E CALL R6 3 + 0x80040C00, // 000F RET 1 R6 + 0x7002004E, // 0010 JMP #0060 + 0x1C180B09, // 0011 EQ R6 R5 K9 + 0x781A0005, // 0012 JMPF R6 #0019 + 0x8C180706, // 0013 GETMET R6 R3 K6 + 0x88200707, // 0014 GETMBR R8 R3 K7 + 0x8824010A, // 0015 GETMBR R9 R0 K10 + 0x7C180600, // 0016 CALL R6 3 + 0x80040C00, // 0017 RET 1 R6 + 0x70020046, // 0018 JMP #0060 + 0x541A0006, // 0019 LDINT R6 7 + 0x1C180A06, // 001A EQ R6 R5 R6 + 0x781A0005, // 001B JMPF R6 #0022 + 0x8C180706, // 001C GETMET R6 R3 K6 + 0x88200707, // 001D GETMBR R8 R3 K7 + 0x58240005, // 001E LDCONST R9 K5 + 0x7C180600, // 001F CALL R6 3 + 0x80040C00, // 0020 RET 1 R6 + 0x7002003D, // 0021 JMP #0060 + 0x541A0007, // 0022 LDINT R6 8 + 0x1C180A06, // 0023 EQ R6 R5 R6 + 0x781A0005, // 0024 JMPF R6 #002B + 0x8C180706, // 0025 GETMET R6 R3 K6 + 0x88200707, // 0026 GETMBR R8 R3 K7 + 0x58240005, // 0027 LDCONST R9 K5 + 0x7C180600, // 0028 CALL R6 3 + 0x80040C00, // 0029 RET 1 R6 + 0x70020034, // 002A JMP #0060 + 0x541A000E, // 002B LDINT R6 15 + 0x1C180A06, // 002C EQ R6 R5 R6 + 0x781A0005, // 002D JMPF R6 #0034 + 0x8C180706, // 002E GETMET R6 R3 K6 + 0x88200707, // 002F GETMBR R8 R3 K7 + 0x58240005, // 0030 LDCONST R9 K5 + 0x7C180600, // 0031 CALL R6 3 + 0x80040C00, // 0032 RET 1 R6 + 0x7002002B, // 0033 JMP #0060 + 0x541A4000, // 0034 LDINT R6 16385 + 0x1C180A06, // 0035 EQ R6 R5 R6 + 0x781A0005, // 0036 JMPF R6 #003D + 0x8C180706, // 0037 GETMET R6 R3 K6 + 0x88200707, // 0038 GETMBR R8 R3 K7 + 0x58240005, // 0039 LDCONST R9 K5 + 0x7C180600, // 003A CALL R6 3 + 0x80040C00, // 003B RET 1 R6 + 0x70020022, // 003C JMP #0060 + 0x541A4009, // 003D LDINT R6 16394 + 0x1C180A06, // 003E EQ R6 R5 R6 + 0x781A0005, // 003F JMPF R6 #0046 + 0x8C180706, // 0040 GETMET R6 R3 K6 + 0x88200707, // 0041 GETMBR R8 R3 K7 + 0x58240009, // 0042 LDCONST R9 K9 + 0x7C180600, // 0043 CALL R6 3 + 0x80040C00, // 0044 RET 1 R6 + 0x70020019, // 0045 JMP #0060 + 0x541A000F, // 0046 LDINT R6 16 + 0x1C180A06, // 0047 EQ R6 R5 R6 + 0x781A0005, // 0048 JMPF R6 #004F + 0x8C180706, // 0049 GETMET R6 R3 K6 + 0x88200707, // 004A GETMBR R8 R3 K7 + 0x58240005, // 004B LDCONST R9 K5 + 0x7C180600, // 004C CALL R6 3 + 0x80040C00, // 004D RET 1 R6 + 0x70020010, // 004E JMP #0060 + 0x541AFFFB, // 004F LDINT R6 65532 + 0x1C180A06, // 0050 EQ R6 R5 R6 + 0x781A0005, // 0051 JMPF R6 #0058 + 0x8C180706, // 0052 GETMET R6 R3 K6 + 0x8820070B, // 0053 GETMBR R8 R3 K11 + 0x58240009, // 0054 LDCONST R9 K9 + 0x7C180600, // 0055 CALL R6 3 + 0x80040C00, // 0056 RET 1 R6 + 0x70020007, // 0057 JMP #0060 + 0x541AFFFC, // 0058 LDINT R6 65533 + 0x1C180A06, // 0059 EQ R6 R5 R6 + 0x781A0004, // 005A JMPF R6 #0060 + 0x8C180706, // 005B GETMET R6 R3 K6 + 0x8820070B, // 005C GETMBR R8 R3 K11 + 0x54260004, // 005D LDINT R9 5 + 0x7C180600, // 005E CALL R6 3 + 0x80040C00, // 005F RET 1 R6 + 0x70020007, // 0060 JMP #0069 + 0x60180003, // 0061 GETGBL R6 G3 + 0x5C1C0000, // 0062 MOVE R7 R0 + 0x7C180200, // 0063 CALL R6 1 + 0x8C180D0C, // 0064 GETMET R6 R6 K12 + 0x5C200200, // 0065 MOVE R8 R1 + 0x5C240400, // 0066 MOVE R9 R2 + 0x7C180600, // 0067 CALL R6 3 + 0x80040C00, // 0068 RET 1 R6 + 0x80000000, // 0069 RET 0 }) ) ); diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_OnOff.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_OnOff.h index 7d4ac79ea..d18b1dbb7 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_OnOff.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_OnOff.h @@ -190,7 +190,7 @@ be_local_closure(Matter_Plugin_OnOff_parse_configuration, /* name */ ********************************************************************/ be_local_closure(Matter_Plugin_OnOff_read_attribute, /* name */ be_nested_proto( - 11, /* nstack */ + 10, /* nstack */ 3, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -198,68 +198,66 @@ be_local_closure(Matter_Plugin_OnOff_read_attribute, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[12]) { /* constants */ - /* K0 */ be_nested_str_weak(string), - /* K1 */ be_nested_str_weak(matter), - /* K2 */ be_nested_str_weak(TLV), - /* K3 */ be_nested_str_weak(cluster), - /* K4 */ be_nested_str_weak(attribute), - /* K5 */ be_nested_str_weak(update_shadow_lazy), - /* K6 */ be_const_int(0), - /* K7 */ be_nested_str_weak(create_TLV), - /* K8 */ be_nested_str_weak(BOOL), - /* K9 */ be_nested_str_weak(shadow_onoff), - /* K10 */ be_nested_str_weak(U4), - /* K11 */ be_nested_str_weak(read_attribute), + ( &(const bvalue[11]) { /* constants */ + /* K0 */ be_nested_str_weak(matter), + /* K1 */ be_nested_str_weak(TLV), + /* K2 */ be_nested_str_weak(cluster), + /* K3 */ be_nested_str_weak(attribute), + /* K4 */ be_nested_str_weak(update_shadow_lazy), + /* K5 */ be_const_int(0), + /* K6 */ be_nested_str_weak(create_TLV), + /* K7 */ be_nested_str_weak(BOOL), + /* K8 */ be_nested_str_weak(shadow_onoff), + /* K9 */ be_nested_str_weak(U4), + /* K10 */ be_nested_str_weak(read_attribute), }), be_str_weak(read_attribute), &be_const_str_solidified, - ( &(const binstruction[45]) { /* code */ - 0xA40E0000, // 0000 IMPORT R3 K0 - 0xB8120200, // 0001 GETNGBL R4 K1 - 0x88100902, // 0002 GETMBR R4 R4 K2 + ( &(const binstruction[44]) { /* code */ + 0xB80E0000, // 0000 GETNGBL R3 K0 + 0x880C0701, // 0001 GETMBR R3 R3 K1 + 0x88100502, // 0002 GETMBR R4 R2 K2 0x88140503, // 0003 GETMBR R5 R2 K3 - 0x88180504, // 0004 GETMBR R6 R2 K4 - 0x541E0005, // 0005 LDINT R7 6 - 0x1C1C0A07, // 0006 EQ R7 R5 R7 - 0x781E001B, // 0007 JMPF R7 #0024 - 0x8C1C0105, // 0008 GETMET R7 R0 K5 - 0x7C1C0200, // 0009 CALL R7 1 - 0x1C1C0D06, // 000A EQ R7 R6 K6 - 0x781E0005, // 000B JMPF R7 #0012 - 0x8C1C0907, // 000C GETMET R7 R4 K7 - 0x88240908, // 000D GETMBR R9 R4 K8 - 0x88280109, // 000E GETMBR R10 R0 K9 - 0x7C1C0600, // 000F CALL R7 3 - 0x80040E00, // 0010 RET 1 R7 - 0x70020010, // 0011 JMP #0023 - 0x541EFFFB, // 0012 LDINT R7 65532 - 0x1C1C0C07, // 0013 EQ R7 R6 R7 - 0x781E0005, // 0014 JMPF R7 #001B - 0x8C1C0907, // 0015 GETMET R7 R4 K7 - 0x8824090A, // 0016 GETMBR R9 R4 K10 - 0x58280006, // 0017 LDCONST R10 K6 - 0x7C1C0600, // 0018 CALL R7 3 - 0x80040E00, // 0019 RET 1 R7 - 0x70020007, // 001A JMP #0023 - 0x541EFFFC, // 001B LDINT R7 65533 - 0x1C1C0C07, // 001C EQ R7 R6 R7 - 0x781E0004, // 001D JMPF R7 #0023 - 0x8C1C0907, // 001E GETMET R7 R4 K7 - 0x8824090A, // 001F GETMBR R9 R4 K10 - 0x542A0003, // 0020 LDINT R10 4 - 0x7C1C0600, // 0021 CALL R7 3 - 0x80040E00, // 0022 RET 1 R7 - 0x70020007, // 0023 JMP #002C - 0x601C0003, // 0024 GETGBL R7 G3 - 0x5C200000, // 0025 MOVE R8 R0 - 0x7C1C0200, // 0026 CALL R7 1 - 0x8C1C0F0B, // 0027 GETMET R7 R7 K11 - 0x5C240200, // 0028 MOVE R9 R1 - 0x5C280400, // 0029 MOVE R10 R2 - 0x7C1C0600, // 002A CALL R7 3 - 0x80040E00, // 002B RET 1 R7 - 0x80000000, // 002C RET 0 + 0x541A0005, // 0004 LDINT R6 6 + 0x1C180806, // 0005 EQ R6 R4 R6 + 0x781A001B, // 0006 JMPF R6 #0023 + 0x8C180104, // 0007 GETMET R6 R0 K4 + 0x7C180200, // 0008 CALL R6 1 + 0x1C180B05, // 0009 EQ R6 R5 K5 + 0x781A0005, // 000A JMPF R6 #0011 + 0x8C180706, // 000B GETMET R6 R3 K6 + 0x88200707, // 000C GETMBR R8 R3 K7 + 0x88240108, // 000D GETMBR R9 R0 K8 + 0x7C180600, // 000E CALL R6 3 + 0x80040C00, // 000F RET 1 R6 + 0x70020010, // 0010 JMP #0022 + 0x541AFFFB, // 0011 LDINT R6 65532 + 0x1C180A06, // 0012 EQ R6 R5 R6 + 0x781A0005, // 0013 JMPF R6 #001A + 0x8C180706, // 0014 GETMET R6 R3 K6 + 0x88200709, // 0015 GETMBR R8 R3 K9 + 0x58240005, // 0016 LDCONST R9 K5 + 0x7C180600, // 0017 CALL R6 3 + 0x80040C00, // 0018 RET 1 R6 + 0x70020007, // 0019 JMP #0022 + 0x541AFFFC, // 001A LDINT R6 65533 + 0x1C180A06, // 001B EQ R6 R5 R6 + 0x781A0004, // 001C JMPF R6 #0022 + 0x8C180706, // 001D GETMET R6 R3 K6 + 0x88200709, // 001E GETMBR R8 R3 K9 + 0x54260003, // 001F LDINT R9 4 + 0x7C180600, // 0020 CALL R6 3 + 0x80040C00, // 0021 RET 1 R6 + 0x70020007, // 0022 JMP #002B + 0x60180003, // 0023 GETGBL R6 G3 + 0x5C1C0000, // 0024 MOVE R7 R0 + 0x7C180200, // 0025 CALL R6 1 + 0x8C180D0A, // 0026 GETMET R6 R6 K10 + 0x5C200200, // 0027 MOVE R8 R1 + 0x5C240400, // 0028 MOVE R9 R2 + 0x7C180600, // 0029 CALL R6 3 + 0x80040C00, // 002A RET 1 R6 + 0x80000000, // 002B RET 0 }) ) ); diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Root.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Root.h index a695431fd..641d19ba4 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Root.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Root.h @@ -11,7 +11,7 @@ extern const bclass be_class_Matter_Plugin_Root; ********************************************************************/ be_local_closure(Matter_Plugin_Root_invoke_request, /* name */ be_nested_proto( - 31, /* nstack */ + 30, /* nstack */ 4, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -25,7 +25,7 @@ be_local_closure(Matter_Plugin_Root_invoke_request, /* name */ 1, /* has upvals */ ( &(const bupvaldesc[ 2]) { /* upvals */ be_local_const_upval(1, 0), - be_local_const_upval(1, 11), + be_local_const_upval(1, 10), }), 0, /* has sup protos */ NULL, /* no sub protos */ @@ -47,822 +47,819 @@ be_local_closure(Matter_Plugin_Root_invoke_request, /* name */ ), }), 1, /* has constants */ - ( &(const bvalue[102]) { /* constants */ + ( &(const bvalue[100]) { /* constants */ /* K0 */ be_nested_str_weak(crypto), - /* K1 */ be_nested_str_weak(string), - /* K2 */ be_nested_str_weak(matter), - /* K3 */ be_nested_str_weak(TLV), - /* K4 */ be_nested_str_weak(cluster), - /* K5 */ be_nested_str_weak(command), - /* K6 */ be_const_int(0), - /* K7 */ be_nested_str_weak(findsubval), - /* K8 */ be_const_int(1), - /* K9 */ be_nested_str_weak(_breadcrumb), - /* K10 */ be_nested_str_weak(Matter_TLV_struct), - /* K11 */ be_nested_str_weak(add_TLV), - /* K12 */ be_nested_str_weak(U1), - /* K13 */ be_nested_str_weak(UTF1), - /* K14 */ be_nested_str_weak(), - /* K15 */ be_const_int(2), - /* K16 */ be_nested_str_weak(XX), - /* K17 */ be_const_int(3), - /* K18 */ be_nested_str_weak(_fabric), - /* K19 */ be_nested_str_weak(fabric_completed), - /* K20 */ be_nested_str_weak(set_no_expiration), - /* K21 */ be_nested_str_weak(save), - /* K22 */ be_nested_str_weak(device), - /* K23 */ be_nested_str_weak(start_commissioning_complete_deferred), - /* K24 */ be_nested_str_weak(context_error), - /* K25 */ be_nested_str_weak(CommissioningComplete_X3A_X20no_X20fabric_X20attached), - /* K26 */ be_nested_str_weak(status), - /* K27 */ be_nested_str_weak(UNSUPPORTED_COMMAND), - /* K28 */ be_nested_str_weak(B2), - /* K29 */ be_nested_str_weak(DAC_Cert_FFF1_8000), - /* K30 */ be_nested_str_weak(PAI_Cert_FFF1), - /* K31 */ be_nested_str_weak(CD_FFF1_8000), - /* K32 */ be_nested_str_weak(B1), - /* K33 */ be_nested_str_weak(U4), - /* K34 */ be_nested_str_weak(tasmota), - /* K35 */ be_nested_str_weak(rtc), - /* K36 */ be_nested_str_weak(utc), - /* K37 */ be_nested_str_weak(tlv2raw), - /* K38 */ be_nested_str_weak(get_ac), - /* K39 */ be_nested_str_weak(EC_P256), - /* K40 */ be_nested_str_weak(ecdsa_sign_sha256), - /* K41 */ be_nested_str_weak(DAC_Priv_FFF1_8000), - /* K42 */ be_nested_str_weak(gen_CSR), - /* K43 */ be_nested_str_weak(set_temp_ca), - /* K44 */ be_nested_str_weak(SUCCESS), - /* K45 */ be_nested_str_weak(log), - /* K46 */ be_nested_str_weak(MTR_X3A_X20AddNoc_X20Args_X3D), - /* K47 */ be_nested_str_weak(get_temp_ca), - /* K48 */ be_nested_str_weak(MTR_X3A_X20Error_X3A_X20AdNOC_X20without_X20CA), - /* K49 */ be_nested_str_weak(sessions), - /* K50 */ be_nested_str_weak(create_fabric), - /* K51 */ be_nested_str_weak(set_ca), - /* K52 */ be_nested_str_weak(set_noc_icac), - /* K53 */ be_nested_str_weak(set_ipk_epoch_key), - /* K54 */ be_nested_str_weak(set_admin_subject_vendor), - /* K55 */ be_nested_str_weak(set_pk), - /* K56 */ be_nested_str_weak(get_pk), - /* K57 */ be_nested_str_weak(parse), - /* K58 */ be_nested_str_weak(findsub), - /* K59 */ be_nested_str_weak(MTR_X3A_X20Error_X3A_X20no_X20fabricid_X20nor_X20deviceid_X20in_X20NOC_X20certificate), - /* K60 */ be_nested_str_weak(int), - /* K61 */ be_nested_str_weak(int64), - /* K62 */ be_nested_str_weak(fromu32), - /* K63 */ be_nested_str_weak(tobytes), - /* K64 */ be_nested_str_weak(get_temp_ca_pub), - /* K65 */ be_const_int(2147483647), - /* K66 */ be_nested_str_weak(fromstring), - /* K67 */ be_nested_str_weak(CompressedFabric), - /* K68 */ be_nested_str_weak(HKDF_SHA256), - /* K69 */ be_nested_str_weak(copy), - /* K70 */ be_nested_str_weak(reverse), - /* K71 */ be_nested_str_weak(derive), - /* K72 */ be_nested_str_weak(commissioning_admin_fabric), - /* K73 */ be_nested_str_weak(set_fabric_device), - /* K74 */ be_nested_str_weak(fabric_candidate), - /* K75 */ be_nested_str_weak(start_operational_discovery_deferred), - /* K76 */ be_nested_str_weak(is_PASE), - /* K77 */ be_nested_str_weak(set_expire_in_seconds), - /* K78 */ be_nested_str_weak(log_new_fabric), - /* K79 */ be_nested_str_weak(set_fabric_label), - /* K80 */ be_nested_str_weak(format), - /* K81 */ be_nested_str_weak(MTR_X3A_X20_X2E_X20_X20_X20_X20_X20_X20_X20_X20_X20_X20Update_X20fabric_X20_X27_X25s_X27_X20label_X3D_X27_X25s_X27), - /* K82 */ be_nested_str_weak(get_fabric_id), - /* K83 */ be_nested_str_weak(tohex), - /* K84 */ be_nested_str_weak(fabric_index_X3A), - /* K85 */ be_nested_str_weak(active_fabrics), - /* K86 */ be_nested_str_weak(get_fabric_index), - /* K87 */ be_nested_str_weak(set_timer), - /* K88 */ be_nested_str_weak(stop_iteration), - /* K89 */ be_nested_str_weak(MTR_X3A_X20RemoveFabric_X20fabric_X28), - /* K90 */ be_nested_str_weak(_X29_X20not_X20found), - /* K91 */ be_nested_str_weak(INVALID_ACTION), - /* K92 */ be_nested_str_weak(MTR_X3A_X20OpenCommissioningWindow_X28timeout_X3D_X25i_X2C_X20passcode_X3D_X25s_X2C_X20discriminator_X3D_X25i_X2C_X20iterations_X3D_X25i_X2C_X20salt_X3D_X25s_X29), - /* K93 */ be_nested_str_weak(INVALID_DATA_TYPE), - /* K94 */ be_nested_str_weak(MTR_X3A_X20wrong_X20size_X20for_X20PAKE_X20parameters), - /* K95 */ be_nested_str_weak(CONSTRAINT_ERROR), - /* K96 */ be_nested_str_weak(start_basic_commissioning), - /* K97 */ be_nested_str_weak(get_fabric), - /* K98 */ be_nested_str_weak(MTR_X3A_X20OpenBasicCommissioningWindow_X20commissioning_timeout_X3D), - /* K99 */ be_nested_str_weak(start_root_basic_commissioning), - /* K100 */ be_nested_str_weak(stop_basic_commissioning), - /* K101 */ be_nested_str_weak(invoke_request), + /* K1 */ be_nested_str_weak(matter), + /* K2 */ be_nested_str_weak(TLV), + /* K3 */ be_nested_str_weak(cluster), + /* K4 */ be_nested_str_weak(command), + /* K5 */ be_const_int(0), + /* K6 */ be_nested_str_weak(findsubval), + /* K7 */ be_const_int(1), + /* K8 */ be_nested_str_weak(_breadcrumb), + /* K9 */ be_nested_str_weak(Matter_TLV_struct), + /* K10 */ be_nested_str_weak(add_TLV), + /* K11 */ be_nested_str_weak(U1), + /* K12 */ be_nested_str_weak(UTF1), + /* K13 */ be_nested_str_weak(), + /* K14 */ be_const_int(2), + /* K15 */ be_nested_str_weak(XX), + /* K16 */ be_const_int(3), + /* K17 */ be_nested_str_weak(_fabric), + /* K18 */ be_nested_str_weak(fabric_completed), + /* K19 */ be_nested_str_weak(set_no_expiration), + /* K20 */ be_nested_str_weak(save), + /* K21 */ be_nested_str_weak(device), + /* K22 */ be_nested_str_weak(start_commissioning_complete_deferred), + /* K23 */ be_nested_str_weak(context_error), + /* K24 */ be_nested_str_weak(CommissioningComplete_X3A_X20no_X20fabric_X20attached), + /* K25 */ be_nested_str_weak(status), + /* K26 */ be_nested_str_weak(UNSUPPORTED_COMMAND), + /* K27 */ be_nested_str_weak(B2), + /* K28 */ be_nested_str_weak(DAC_Cert_FFF1_8000), + /* K29 */ be_nested_str_weak(PAI_Cert_FFF1), + /* K30 */ be_nested_str_weak(CD_FFF1_8000), + /* K31 */ be_nested_str_weak(B1), + /* K32 */ be_nested_str_weak(U4), + /* K33 */ be_nested_str_weak(tasmota), + /* K34 */ be_nested_str_weak(rtc), + /* K35 */ be_nested_str_weak(utc), + /* K36 */ be_nested_str_weak(tlv2raw), + /* K37 */ be_nested_str_weak(get_ac), + /* K38 */ be_nested_str_weak(EC_P256), + /* K39 */ be_nested_str_weak(ecdsa_sign_sha256), + /* K40 */ be_nested_str_weak(DAC_Priv_FFF1_8000), + /* K41 */ be_nested_str_weak(gen_CSR), + /* K42 */ be_nested_str_weak(set_temp_ca), + /* K43 */ be_nested_str_weak(SUCCESS), + /* K44 */ be_nested_str_weak(log), + /* K45 */ be_nested_str_weak(MTR_X3A_X20AddNoc_X20Args_X3D), + /* K46 */ be_nested_str_weak(get_temp_ca), + /* K47 */ be_nested_str_weak(MTR_X3A_X20Error_X3A_X20AdNOC_X20without_X20CA), + /* K48 */ be_nested_str_weak(sessions), + /* K49 */ be_nested_str_weak(create_fabric), + /* K50 */ be_nested_str_weak(set_ca), + /* K51 */ be_nested_str_weak(set_noc_icac), + /* K52 */ be_nested_str_weak(set_ipk_epoch_key), + /* K53 */ be_nested_str_weak(set_admin_subject_vendor), + /* K54 */ be_nested_str_weak(set_pk), + /* K55 */ be_nested_str_weak(get_pk), + /* K56 */ be_nested_str_weak(parse), + /* K57 */ be_nested_str_weak(findsub), + /* K58 */ be_nested_str_weak(MTR_X3A_X20Error_X3A_X20no_X20fabricid_X20nor_X20deviceid_X20in_X20NOC_X20certificate), + /* K59 */ be_nested_str_weak(int), + /* K60 */ be_nested_str_weak(int64), + /* K61 */ be_nested_str_weak(fromu32), + /* K62 */ be_nested_str_weak(tobytes), + /* K63 */ be_nested_str_weak(get_temp_ca_pub), + /* K64 */ be_const_int(2147483647), + /* K65 */ be_nested_str_weak(fromstring), + /* K66 */ be_nested_str_weak(CompressedFabric), + /* K67 */ be_nested_str_weak(HKDF_SHA256), + /* K68 */ be_nested_str_weak(copy), + /* K69 */ be_nested_str_weak(reverse), + /* K70 */ be_nested_str_weak(derive), + /* K71 */ be_nested_str_weak(commissioning_admin_fabric), + /* K72 */ be_nested_str_weak(set_fabric_device), + /* K73 */ be_nested_str_weak(fabric_candidate), + /* K74 */ be_nested_str_weak(start_operational_discovery_deferred), + /* K75 */ be_nested_str_weak(is_PASE), + /* K76 */ be_nested_str_weak(set_expire_in_seconds), + /* K77 */ be_nested_str_weak(log_new_fabric), + /* K78 */ be_nested_str_weak(set_fabric_label), + /* K79 */ be_nested_str_weak(MTR_X3A_X20_X2E_X20_X20_X20_X20_X20_X20_X20_X20_X20_X20Update_X20fabric_X20_X27_X25s_X27_X20label_X3D_X27_X25s_X27), + /* K80 */ be_nested_str_weak(get_fabric_id), + /* K81 */ be_nested_str_weak(tohex), + /* K82 */ be_nested_str_weak(fabric_index_X3A), + /* K83 */ be_nested_str_weak(active_fabrics), + /* K84 */ be_nested_str_weak(get_fabric_index), + /* K85 */ be_nested_str_weak(set_timer), + /* K86 */ be_nested_str_weak(stop_iteration), + /* K87 */ be_nested_str_weak(MTR_X3A_X20RemoveFabric_X20fabric_X28), + /* K88 */ be_nested_str_weak(_X29_X20not_X20found), + /* K89 */ be_nested_str_weak(INVALID_ACTION), + /* K90 */ be_nested_str_weak(MTR_X3A_X20OpenCommissioningWindow_X28timeout_X3D_X25i_X2C_X20passcode_X3D_X25s_X2C_X20discriminator_X3D_X25i_X2C_X20iterations_X3D_X25i_X2C_X20salt_X3D_X25s_X29), + /* K91 */ be_nested_str_weak(INVALID_DATA_TYPE), + /* K92 */ be_nested_str_weak(MTR_X3A_X20wrong_X20size_X20for_X20PAKE_X20parameters), + /* K93 */ be_nested_str_weak(CONSTRAINT_ERROR), + /* K94 */ be_nested_str_weak(start_basic_commissioning), + /* K95 */ be_nested_str_weak(get_fabric), + /* K96 */ be_nested_str_weak(MTR_X3A_X20OpenBasicCommissioningWindow_X20commissioning_timeout_X3D), + /* K97 */ be_nested_str_weak(start_root_basic_commissioning), + /* K98 */ be_nested_str_weak(stop_basic_commissioning), + /* K99 */ be_nested_str_weak(invoke_request), }), be_str_weak(invoke_request), &be_const_str_solidified, - ( &(const binstruction[709]) { /* code */ + ( &(const binstruction[708]) { /* code */ 0xA4120000, // 0000 IMPORT R4 K0 - 0xA4160200, // 0001 IMPORT R5 K1 - 0xB81A0400, // 0002 GETNGBL R6 K2 - 0x88180D03, // 0003 GETMBR R6 R6 K3 + 0xB8160200, // 0001 GETNGBL R5 K1 + 0x88140B02, // 0002 GETMBR R5 R5 K2 + 0x88180703, // 0003 GETMBR R6 R3 K3 0x881C0704, // 0004 GETMBR R7 R3 K4 - 0x88200705, // 0005 GETMBR R8 R3 K5 - 0x5426002F, // 0006 LDINT R9 48 - 0x1C240E09, // 0007 EQ R9 R7 R9 - 0x78260059, // 0008 JMPF R9 #0063 - 0x1C241106, // 0009 EQ R9 R8 K6 - 0x78260017, // 000A JMPF R9 #0023 - 0x8C240507, // 000B GETMET R9 R2 K7 - 0x582C0006, // 000C LDCONST R11 K6 - 0x54320383, // 000D LDINT R12 900 - 0x7C240600, // 000E CALL R9 3 - 0x8C280507, // 000F GETMET R10 R2 K7 - 0x58300008, // 0010 LDCONST R12 K8 - 0x58340006, // 0011 LDCONST R13 K6 - 0x7C280600, // 0012 CALL R10 3 - 0x9006120A, // 0013 SETMBR R1 K9 R10 - 0x8C2C0D0A, // 0014 GETMET R11 R6 K10 - 0x7C2C0200, // 0015 CALL R11 1 - 0x8C30170B, // 0016 GETMET R12 R11 K11 - 0x58380006, // 0017 LDCONST R14 K6 - 0x883C0D0C, // 0018 GETMBR R15 R6 K12 - 0x58400006, // 0019 LDCONST R16 K6 - 0x7C300800, // 001A CALL R12 4 - 0x8C30170B, // 001B GETMET R12 R11 K11 - 0x58380008, // 001C LDCONST R14 K8 - 0x883C0D0D, // 001D GETMBR R15 R6 K13 - 0x5840000E, // 001E LDCONST R16 K14 - 0x7C300800, // 001F CALL R12 4 - 0x900E0B08, // 0020 SETMBR R3 K5 K8 - 0x80041600, // 0021 RET 1 R11 - 0x7002003E, // 0022 JMP #0062 - 0x1C24110F, // 0023 EQ R9 R8 K15 - 0x7826001A, // 0024 JMPF R9 #0040 - 0x8C240507, // 0025 GETMET R9 R2 K7 - 0x582C0006, // 0026 LDCONST R11 K6 - 0x7C240400, // 0027 CALL R9 2 - 0x8C280507, // 0028 GETMET R10 R2 K7 - 0x58300008, // 0029 LDCONST R12 K8 - 0x58340010, // 002A LDCONST R13 K16 - 0x7C280600, // 002B CALL R10 3 - 0x8C2C0507, // 002C GETMET R11 R2 K7 - 0x5834000F, // 002D LDCONST R13 K15 - 0x58380006, // 002E LDCONST R14 K6 - 0x7C2C0600, // 002F CALL R11 3 - 0x9006120B, // 0030 SETMBR R1 K9 R11 - 0x8C300D0A, // 0031 GETMET R12 R6 K10 - 0x7C300200, // 0032 CALL R12 1 - 0x8C34190B, // 0033 GETMET R13 R12 K11 - 0x583C0006, // 0034 LDCONST R15 K6 - 0x88400D0C, // 0035 GETMBR R16 R6 K12 - 0x58440006, // 0036 LDCONST R17 K6 - 0x7C340800, // 0037 CALL R13 4 - 0x8C34190B, // 0038 GETMET R13 R12 K11 - 0x583C0008, // 0039 LDCONST R15 K8 - 0x88400D0D, // 003A GETMBR R16 R6 K13 - 0x5844000E, // 003B LDCONST R17 K14 - 0x7C340800, // 003C CALL R13 4 - 0x900E0B11, // 003D SETMBR R3 K5 K17 - 0x80041800, // 003E RET 1 R12 - 0x70020021, // 003F JMP #0062 - 0x54260003, // 0040 LDINT R9 4 - 0x1C241009, // 0041 EQ R9 R8 R9 - 0x7826001E, // 0042 JMPF R9 #0062 - 0x88240312, // 0043 GETMBR R9 R1 K18 - 0x7826001B, // 0044 JMPF R9 #0061 - 0x90061306, // 0045 SETMBR R1 K9 K6 - 0x88240312, // 0046 GETMBR R9 R1 K18 - 0x8C241313, // 0047 GETMET R9 R9 K19 - 0x7C240200, // 0048 CALL R9 1 - 0x8C240314, // 0049 GETMET R9 R1 K20 - 0x7C240200, // 004A CALL R9 1 - 0x8C240315, // 004B GETMET R9 R1 K21 - 0x7C240200, // 004C CALL R9 1 - 0x8C240D0A, // 004D GETMET R9 R6 K10 - 0x7C240200, // 004E CALL R9 1 - 0x8C28130B, // 004F GETMET R10 R9 K11 - 0x58300006, // 0050 LDCONST R12 K6 - 0x88340D0C, // 0051 GETMBR R13 R6 K12 - 0x58380006, // 0052 LDCONST R14 K6 - 0x7C280800, // 0053 CALL R10 4 - 0x8C28130B, // 0054 GETMET R10 R9 K11 - 0x58300008, // 0055 LDCONST R12 K8 - 0x88340D0D, // 0056 GETMBR R13 R6 K13 - 0x5838000E, // 0057 LDCONST R14 K14 - 0x7C280800, // 0058 CALL R10 4 - 0x542A0004, // 0059 LDINT R10 5 - 0x900E0A0A, // 005A SETMBR R3 K5 R10 - 0x88280116, // 005B GETMBR R10 R0 K22 - 0x8C281517, // 005C GETMET R10 R10 K23 - 0x5C300200, // 005D MOVE R12 R1 - 0x7C280400, // 005E CALL R10 2 - 0x80041200, // 005F RET 1 R9 - 0x70020000, // 0060 JMP #0062 - 0xB0063119, // 0061 RAISE 1 K24 K25 - 0x7002025F, // 0062 JMP #02C3 - 0x5426003D, // 0063 LDINT R9 62 - 0x1C240E09, // 0064 EQ R9 R7 R9 - 0x782601C0, // 0065 JMPF R9 #0227 - 0x1C24110F, // 0066 EQ R9 R8 K15 - 0x7826001D, // 0067 JMPF R9 #0086 - 0x8C240507, // 0068 GETMET R9 R2 K7 - 0x582C0006, // 0069 LDCONST R11 K6 - 0x7C240400, // 006A CALL R9 2 - 0x20281308, // 006B NE R10 R9 K8 - 0x782A0006, // 006C JMPF R10 #0074 - 0x2028130F, // 006D NE R10 R9 K15 - 0x782A0004, // 006E JMPF R10 #0074 - 0xB82A0400, // 006F GETNGBL R10 K2 - 0x8828151B, // 0070 GETMBR R10 R10 K27 - 0x900E340A, // 0071 SETMBR R3 K26 R10 - 0x4C280000, // 0072 LDNIL R10 - 0x80041400, // 0073 RET 1 R10 - 0x8C280D0A, // 0074 GETMET R10 R6 K10 - 0x7C280200, // 0075 CALL R10 1 - 0x8C2C150B, // 0076 GETMET R11 R10 K11 - 0x58340006, // 0077 LDCONST R13 K6 - 0x88380D1C, // 0078 GETMBR R14 R6 K28 - 0x1C3C1308, // 0079 EQ R15 R9 K8 - 0x783E0003, // 007A JMPF R15 #007F - 0xB83E0400, // 007B GETNGBL R15 K2 - 0x8C3C1F1D, // 007C GETMET R15 R15 K29 - 0x7C3C0200, // 007D CALL R15 1 - 0x70020002, // 007E JMP #0082 - 0xB83E0400, // 007F GETNGBL R15 K2 - 0x8C3C1F1E, // 0080 GETMET R15 R15 K30 - 0x7C3C0200, // 0081 CALL R15 1 - 0x7C2C0800, // 0082 CALL R11 4 - 0x900E0B11, // 0083 SETMBR R3 K5 K17 - 0x80041400, // 0084 RET 1 R10 - 0x7002019F, // 0085 JMP #0226 - 0x1C241106, // 0086 EQ R9 R8 K6 - 0x7826003D, // 0087 JMPF R9 #00C6 - 0x8C240507, // 0088 GETMET R9 R2 K7 - 0x582C0006, // 0089 LDCONST R11 K6 - 0x7C240400, // 008A CALL R9 2 - 0x6028000C, // 008B GETGBL R10 G12 - 0x5C2C1200, // 008C MOVE R11 R9 - 0x7C280200, // 008D CALL R10 1 - 0x542E001F, // 008E LDINT R11 32 - 0x2028140B, // 008F NE R10 R10 R11 - 0x782A0001, // 0090 JMPF R10 #0093 - 0x4C280000, // 0091 LDNIL R10 - 0x80041400, // 0092 RET 1 R10 - 0x900E0B08, // 0093 SETMBR R3 K5 K8 - 0x8C280D0A, // 0094 GETMET R10 R6 K10 - 0x7C280200, // 0095 CALL R10 1 - 0x8C2C150B, // 0096 GETMET R11 R10 K11 - 0x58340008, // 0097 LDCONST R13 K8 - 0x88380D1C, // 0098 GETMBR R14 R6 K28 - 0xB83E0400, // 0099 GETNGBL R15 K2 - 0x8C3C1F1F, // 009A GETMET R15 R15 K31 - 0x7C3C0200, // 009B CALL R15 1 - 0x7C2C0800, // 009C CALL R11 4 - 0x8C2C150B, // 009D GETMET R11 R10 K11 - 0x5834000F, // 009E LDCONST R13 K15 - 0x88380D20, // 009F GETMBR R14 R6 K32 - 0x5C3C1200, // 00A0 MOVE R15 R9 - 0x7C2C0800, // 00A1 CALL R11 4 - 0x8C2C150B, // 00A2 GETMET R11 R10 K11 - 0x58340011, // 00A3 LDCONST R13 K17 - 0x88380D21, // 00A4 GETMBR R14 R6 K33 - 0xB83E4400, // 00A5 GETNGBL R15 K34 - 0x8C3C1F23, // 00A6 GETMET R15 R15 K35 - 0x7C3C0200, // 00A7 CALL R15 1 - 0x943C1F24, // 00A8 GETIDX R15 R15 K36 - 0x7C2C0800, // 00A9 CALL R11 4 - 0x8C2C1525, // 00AA GETMET R11 R10 K37 - 0x7C2C0200, // 00AB CALL R11 1 - 0x8C300326, // 00AC GETMET R12 R1 K38 - 0x7C300200, // 00AD CALL R12 1 - 0x0034160C, // 00AE ADD R13 R11 R12 - 0x8C380927, // 00AF GETMET R14 R4 K39 - 0x7C380200, // 00B0 CALL R14 1 - 0x8C381D28, // 00B1 GETMET R14 R14 K40 - 0xB8420400, // 00B2 GETNGBL R16 K2 - 0x8C402129, // 00B3 GETMET R16 R16 K41 - 0x7C400200, // 00B4 CALL R16 1 - 0x5C441A00, // 00B5 MOVE R17 R13 - 0x7C380600, // 00B6 CALL R14 3 - 0x8C3C0D0A, // 00B7 GETMET R15 R6 K10 - 0x7C3C0200, // 00B8 CALL R15 1 - 0x8C401F0B, // 00B9 GETMET R16 R15 K11 - 0x58480006, // 00BA LDCONST R18 K6 - 0x884C0D1C, // 00BB GETMBR R19 R6 K28 - 0x5C501600, // 00BC MOVE R20 R11 - 0x7C400800, // 00BD CALL R16 4 - 0x8C401F0B, // 00BE GETMET R16 R15 K11 - 0x58480008, // 00BF LDCONST R18 K8 - 0x884C0D20, // 00C0 GETMBR R19 R6 K32 - 0x5C501C00, // 00C1 MOVE R20 R14 - 0x7C400800, // 00C2 CALL R16 4 - 0x900E0B08, // 00C3 SETMBR R3 K5 K8 - 0x80041E00, // 00C4 RET 1 R15 - 0x7002015F, // 00C5 JMP #0226 - 0x54260003, // 00C6 LDINT R9 4 - 0x1C241009, // 00C7 EQ R9 R8 R9 - 0x78260039, // 00C8 JMPF R9 #0103 - 0x8C240507, // 00C9 GETMET R9 R2 K7 - 0x582C0006, // 00CA LDCONST R11 K6 - 0x7C240400, // 00CB CALL R9 2 - 0x6028000C, // 00CC GETGBL R10 G12 - 0x5C2C1200, // 00CD MOVE R11 R9 - 0x7C280200, // 00CE CALL R10 1 - 0x542E001F, // 00CF LDINT R11 32 - 0x2028140B, // 00D0 NE R10 R10 R11 - 0x782A0001, // 00D1 JMPF R10 #00D4 - 0x4C280000, // 00D2 LDNIL R10 - 0x80041400, // 00D3 RET 1 R10 - 0x8C280507, // 00D4 GETMET R10 R2 K7 - 0x58300008, // 00D5 LDCONST R12 K8 - 0x50340000, // 00D6 LDBOOL R13 0 0 - 0x7C280600, // 00D7 CALL R10 3 - 0x8C2C032A, // 00D8 GETMET R11 R1 K42 - 0x7C2C0200, // 00D9 CALL R11 1 - 0x8C300D0A, // 00DA GETMET R12 R6 K10 - 0x7C300200, // 00DB CALL R12 1 - 0x8C34190B, // 00DC GETMET R13 R12 K11 - 0x583C0008, // 00DD LDCONST R15 K8 - 0x88400D1C, // 00DE GETMBR R16 R6 K28 - 0x5C441600, // 00DF MOVE R17 R11 - 0x7C340800, // 00E0 CALL R13 4 - 0x8C34190B, // 00E1 GETMET R13 R12 K11 - 0x583C000F, // 00E2 LDCONST R15 K15 - 0x88400D20, // 00E3 GETMBR R16 R6 K32 - 0x5C441200, // 00E4 MOVE R17 R9 - 0x7C340800, // 00E5 CALL R13 4 - 0x8C341925, // 00E6 GETMET R13 R12 K37 - 0x7C340200, // 00E7 CALL R13 1 - 0x8C380326, // 00E8 GETMET R14 R1 K38 - 0x7C380200, // 00E9 CALL R14 1 - 0x00381A0E, // 00EA ADD R14 R13 R14 - 0x8C3C0927, // 00EB GETMET R15 R4 K39 - 0x7C3C0200, // 00EC CALL R15 1 - 0x8C3C1F28, // 00ED GETMET R15 R15 K40 - 0xB8460400, // 00EE GETNGBL R17 K2 - 0x8C442329, // 00EF GETMET R17 R17 K41 - 0x7C440200, // 00F0 CALL R17 1 - 0x5C481C00, // 00F1 MOVE R18 R14 - 0x7C3C0600, // 00F2 CALL R15 3 - 0x8C400D0A, // 00F3 GETMET R16 R6 K10 - 0x7C400200, // 00F4 CALL R16 1 - 0x8C44210B, // 00F5 GETMET R17 R16 K11 - 0x584C0006, // 00F6 LDCONST R19 K6 - 0x88500D1C, // 00F7 GETMBR R20 R6 K28 - 0x5C541A00, // 00F8 MOVE R21 R13 - 0x7C440800, // 00F9 CALL R17 4 - 0x8C44210B, // 00FA GETMET R17 R16 K11 - 0x584C0008, // 00FB LDCONST R19 K8 - 0x88500D20, // 00FC GETMBR R20 R6 K32 - 0x5C541E00, // 00FD MOVE R21 R15 - 0x7C440800, // 00FE CALL R17 4 - 0x54460004, // 00FF LDINT R17 5 - 0x900E0A11, // 0100 SETMBR R3 K5 R17 - 0x80042000, // 0101 RET 1 R16 - 0x70020122, // 0102 JMP #0226 - 0x5426000A, // 0103 LDINT R9 11 - 0x1C241009, // 0104 EQ R9 R8 R9 - 0x7826000B, // 0105 JMPF R9 #0112 - 0x8C240507, // 0106 GETMET R9 R2 K7 - 0x582C0006, // 0107 LDCONST R11 K6 - 0x7C240400, // 0108 CALL R9 2 - 0x8C28032B, // 0109 GETMET R10 R1 K43 - 0x5C301200, // 010A MOVE R12 R9 - 0x7C280400, // 010B CALL R10 2 - 0xB82A0400, // 010C GETNGBL R10 K2 - 0x8828152C, // 010D GETMBR R10 R10 K44 - 0x900E340A, // 010E SETMBR R3 K26 R10 - 0x4C280000, // 010F LDNIL R10 - 0x80041400, // 0110 RET 1 R10 - 0x70020113, // 0111 JMP #0226 - 0x54260005, // 0112 LDINT R9 6 - 0x1C241009, // 0113 EQ R9 R8 R9 - 0x782600B9, // 0114 JMPF R9 #01CF - 0xB8264400, // 0115 GETNGBL R9 K34 - 0x8C24132D, // 0116 GETMET R9 R9 K45 - 0x602C0008, // 0117 GETGBL R11 G8 - 0x5C300400, // 0118 MOVE R12 R2 - 0x7C2C0200, // 0119 CALL R11 1 - 0x002E5C0B, // 011A ADD R11 K46 R11 - 0x54320003, // 011B LDINT R12 4 - 0x7C240600, // 011C CALL R9 3 - 0x8C240507, // 011D GETMET R9 R2 K7 - 0x582C0006, // 011E LDCONST R11 K6 - 0x7C240400, // 011F CALL R9 2 - 0x8C280507, // 0120 GETMET R10 R2 K7 - 0x58300008, // 0121 LDCONST R12 K8 - 0x7C280400, // 0122 CALL R10 2 - 0x602C000C, // 0123 GETGBL R11 G12 - 0x5C301400, // 0124 MOVE R12 R10 - 0x7C2C0200, // 0125 CALL R11 1 - 0x1C2C1706, // 0126 EQ R11 R11 K6 - 0x782E0000, // 0127 JMPF R11 #0129 - 0x4C280000, // 0128 LDNIL R10 - 0x8C2C0507, // 0129 GETMET R11 R2 K7 - 0x5834000F, // 012A LDCONST R13 K15 - 0x7C2C0400, // 012B CALL R11 2 - 0x8C300507, // 012C GETMET R12 R2 K7 - 0x58380011, // 012D LDCONST R14 K17 - 0x7C300400, // 012E CALL R12 2 - 0x8C340507, // 012F GETMET R13 R2 K7 - 0x543E0003, // 0130 LDINT R15 4 - 0x7C340400, // 0131 CALL R13 2 - 0x8C38032F, // 0132 GETMET R14 R1 K47 - 0x7C380200, // 0133 CALL R14 1 - 0x4C3C0000, // 0134 LDNIL R15 - 0x1C381C0F, // 0135 EQ R14 R14 R15 - 0x783A0006, // 0136 JMPF R14 #013E - 0xB83A4400, // 0137 GETNGBL R14 K34 - 0x8C381D2D, // 0138 GETMET R14 R14 K45 - 0x58400030, // 0139 LDCONST R16 K48 - 0x5844000F, // 013A LDCONST R17 K15 - 0x7C380600, // 013B CALL R14 3 - 0x4C380000, // 013C LDNIL R14 - 0x80041C00, // 013D RET 1 R14 - 0x88380116, // 013E GETMBR R14 R0 K22 - 0x88381D31, // 013F GETMBR R14 R14 K49 - 0x8C381D32, // 0140 GETMET R14 R14 K50 - 0x7C380200, // 0141 CALL R14 1 - 0x8C3C1D33, // 0142 GETMET R15 R14 K51 - 0x8C44032F, // 0143 GETMET R17 R1 K47 - 0x7C440200, // 0144 CALL R17 1 - 0x7C3C0400, // 0145 CALL R15 2 - 0x8C3C1D34, // 0146 GETMET R15 R14 K52 + 0x5422002F, // 0005 LDINT R8 48 + 0x1C200C08, // 0006 EQ R8 R6 R8 + 0x78220059, // 0007 JMPF R8 #0062 + 0x1C200F05, // 0008 EQ R8 R7 K5 + 0x78220017, // 0009 JMPF R8 #0022 + 0x8C200506, // 000A GETMET R8 R2 K6 + 0x58280005, // 000B LDCONST R10 K5 + 0x542E0383, // 000C LDINT R11 900 + 0x7C200600, // 000D CALL R8 3 + 0x8C240506, // 000E GETMET R9 R2 K6 + 0x582C0007, // 000F LDCONST R11 K7 + 0x58300005, // 0010 LDCONST R12 K5 + 0x7C240600, // 0011 CALL R9 3 + 0x90061009, // 0012 SETMBR R1 K8 R9 + 0x8C280B09, // 0013 GETMET R10 R5 K9 + 0x7C280200, // 0014 CALL R10 1 + 0x8C2C150A, // 0015 GETMET R11 R10 K10 + 0x58340005, // 0016 LDCONST R13 K5 + 0x88380B0B, // 0017 GETMBR R14 R5 K11 + 0x583C0005, // 0018 LDCONST R15 K5 + 0x7C2C0800, // 0019 CALL R11 4 + 0x8C2C150A, // 001A GETMET R11 R10 K10 + 0x58340007, // 001B LDCONST R13 K7 + 0x88380B0C, // 001C GETMBR R14 R5 K12 + 0x583C000D, // 001D LDCONST R15 K13 + 0x7C2C0800, // 001E CALL R11 4 + 0x900E0907, // 001F SETMBR R3 K4 K7 + 0x80041400, // 0020 RET 1 R10 + 0x7002003E, // 0021 JMP #0061 + 0x1C200F0E, // 0022 EQ R8 R7 K14 + 0x7822001A, // 0023 JMPF R8 #003F + 0x8C200506, // 0024 GETMET R8 R2 K6 + 0x58280005, // 0025 LDCONST R10 K5 + 0x7C200400, // 0026 CALL R8 2 + 0x8C240506, // 0027 GETMET R9 R2 K6 + 0x582C0007, // 0028 LDCONST R11 K7 + 0x5830000F, // 0029 LDCONST R12 K15 + 0x7C240600, // 002A CALL R9 3 + 0x8C280506, // 002B GETMET R10 R2 K6 + 0x5830000E, // 002C LDCONST R12 K14 + 0x58340005, // 002D LDCONST R13 K5 + 0x7C280600, // 002E CALL R10 3 + 0x9006100A, // 002F SETMBR R1 K8 R10 + 0x8C2C0B09, // 0030 GETMET R11 R5 K9 + 0x7C2C0200, // 0031 CALL R11 1 + 0x8C30170A, // 0032 GETMET R12 R11 K10 + 0x58380005, // 0033 LDCONST R14 K5 + 0x883C0B0B, // 0034 GETMBR R15 R5 K11 + 0x58400005, // 0035 LDCONST R16 K5 + 0x7C300800, // 0036 CALL R12 4 + 0x8C30170A, // 0037 GETMET R12 R11 K10 + 0x58380007, // 0038 LDCONST R14 K7 + 0x883C0B0C, // 0039 GETMBR R15 R5 K12 + 0x5840000D, // 003A LDCONST R16 K13 + 0x7C300800, // 003B CALL R12 4 + 0x900E0910, // 003C SETMBR R3 K4 K16 + 0x80041600, // 003D RET 1 R11 + 0x70020021, // 003E JMP #0061 + 0x54220003, // 003F LDINT R8 4 + 0x1C200E08, // 0040 EQ R8 R7 R8 + 0x7822001E, // 0041 JMPF R8 #0061 + 0x88200311, // 0042 GETMBR R8 R1 K17 + 0x7822001B, // 0043 JMPF R8 #0060 + 0x90061105, // 0044 SETMBR R1 K8 K5 + 0x88200311, // 0045 GETMBR R8 R1 K17 + 0x8C201112, // 0046 GETMET R8 R8 K18 + 0x7C200200, // 0047 CALL R8 1 + 0x8C200313, // 0048 GETMET R8 R1 K19 + 0x7C200200, // 0049 CALL R8 1 + 0x8C200314, // 004A GETMET R8 R1 K20 + 0x7C200200, // 004B CALL R8 1 + 0x8C200B09, // 004C GETMET R8 R5 K9 + 0x7C200200, // 004D CALL R8 1 + 0x8C24110A, // 004E GETMET R9 R8 K10 + 0x582C0005, // 004F LDCONST R11 K5 + 0x88300B0B, // 0050 GETMBR R12 R5 K11 + 0x58340005, // 0051 LDCONST R13 K5 + 0x7C240800, // 0052 CALL R9 4 + 0x8C24110A, // 0053 GETMET R9 R8 K10 + 0x582C0007, // 0054 LDCONST R11 K7 + 0x88300B0C, // 0055 GETMBR R12 R5 K12 + 0x5834000D, // 0056 LDCONST R13 K13 + 0x7C240800, // 0057 CALL R9 4 + 0x54260004, // 0058 LDINT R9 5 + 0x900E0809, // 0059 SETMBR R3 K4 R9 + 0x88240115, // 005A GETMBR R9 R0 K21 + 0x8C241316, // 005B GETMET R9 R9 K22 + 0x5C2C0200, // 005C MOVE R11 R1 + 0x7C240400, // 005D CALL R9 2 + 0x80041000, // 005E RET 1 R8 + 0x70020000, // 005F JMP #0061 + 0xB0062F18, // 0060 RAISE 1 K23 K24 + 0x7002025F, // 0061 JMP #02C2 + 0x5422003D, // 0062 LDINT R8 62 + 0x1C200C08, // 0063 EQ R8 R6 R8 + 0x782201C0, // 0064 JMPF R8 #0226 + 0x1C200F0E, // 0065 EQ R8 R7 K14 + 0x7822001D, // 0066 JMPF R8 #0085 + 0x8C200506, // 0067 GETMET R8 R2 K6 + 0x58280005, // 0068 LDCONST R10 K5 + 0x7C200400, // 0069 CALL R8 2 + 0x20241107, // 006A NE R9 R8 K7 + 0x78260006, // 006B JMPF R9 #0073 + 0x2024110E, // 006C NE R9 R8 K14 + 0x78260004, // 006D JMPF R9 #0073 + 0xB8260200, // 006E GETNGBL R9 K1 + 0x8824131A, // 006F GETMBR R9 R9 K26 + 0x900E3209, // 0070 SETMBR R3 K25 R9 + 0x4C240000, // 0071 LDNIL R9 + 0x80041200, // 0072 RET 1 R9 + 0x8C240B09, // 0073 GETMET R9 R5 K9 + 0x7C240200, // 0074 CALL R9 1 + 0x8C28130A, // 0075 GETMET R10 R9 K10 + 0x58300005, // 0076 LDCONST R12 K5 + 0x88340B1B, // 0077 GETMBR R13 R5 K27 + 0x1C381107, // 0078 EQ R14 R8 K7 + 0x783A0003, // 0079 JMPF R14 #007E + 0xB83A0200, // 007A GETNGBL R14 K1 + 0x8C381D1C, // 007B GETMET R14 R14 K28 + 0x7C380200, // 007C CALL R14 1 + 0x70020002, // 007D JMP #0081 + 0xB83A0200, // 007E GETNGBL R14 K1 + 0x8C381D1D, // 007F GETMET R14 R14 K29 + 0x7C380200, // 0080 CALL R14 1 + 0x7C280800, // 0081 CALL R10 4 + 0x900E0910, // 0082 SETMBR R3 K4 K16 + 0x80041200, // 0083 RET 1 R9 + 0x7002019F, // 0084 JMP #0225 + 0x1C200F05, // 0085 EQ R8 R7 K5 + 0x7822003D, // 0086 JMPF R8 #00C5 + 0x8C200506, // 0087 GETMET R8 R2 K6 + 0x58280005, // 0088 LDCONST R10 K5 + 0x7C200400, // 0089 CALL R8 2 + 0x6024000C, // 008A GETGBL R9 G12 + 0x5C281000, // 008B MOVE R10 R8 + 0x7C240200, // 008C CALL R9 1 + 0x542A001F, // 008D LDINT R10 32 + 0x2024120A, // 008E NE R9 R9 R10 + 0x78260001, // 008F JMPF R9 #0092 + 0x4C240000, // 0090 LDNIL R9 + 0x80041200, // 0091 RET 1 R9 + 0x900E0907, // 0092 SETMBR R3 K4 K7 + 0x8C240B09, // 0093 GETMET R9 R5 K9 + 0x7C240200, // 0094 CALL R9 1 + 0x8C28130A, // 0095 GETMET R10 R9 K10 + 0x58300007, // 0096 LDCONST R12 K7 + 0x88340B1B, // 0097 GETMBR R13 R5 K27 + 0xB83A0200, // 0098 GETNGBL R14 K1 + 0x8C381D1E, // 0099 GETMET R14 R14 K30 + 0x7C380200, // 009A CALL R14 1 + 0x7C280800, // 009B CALL R10 4 + 0x8C28130A, // 009C GETMET R10 R9 K10 + 0x5830000E, // 009D LDCONST R12 K14 + 0x88340B1F, // 009E GETMBR R13 R5 K31 + 0x5C381000, // 009F MOVE R14 R8 + 0x7C280800, // 00A0 CALL R10 4 + 0x8C28130A, // 00A1 GETMET R10 R9 K10 + 0x58300010, // 00A2 LDCONST R12 K16 + 0x88340B20, // 00A3 GETMBR R13 R5 K32 + 0xB83A4200, // 00A4 GETNGBL R14 K33 + 0x8C381D22, // 00A5 GETMET R14 R14 K34 + 0x7C380200, // 00A6 CALL R14 1 + 0x94381D23, // 00A7 GETIDX R14 R14 K35 + 0x7C280800, // 00A8 CALL R10 4 + 0x8C281324, // 00A9 GETMET R10 R9 K36 + 0x7C280200, // 00AA CALL R10 1 + 0x8C2C0325, // 00AB GETMET R11 R1 K37 + 0x7C2C0200, // 00AC CALL R11 1 + 0x0030140B, // 00AD ADD R12 R10 R11 + 0x8C340926, // 00AE GETMET R13 R4 K38 + 0x7C340200, // 00AF CALL R13 1 + 0x8C341B27, // 00B0 GETMET R13 R13 K39 + 0xB83E0200, // 00B1 GETNGBL R15 K1 + 0x8C3C1F28, // 00B2 GETMET R15 R15 K40 + 0x7C3C0200, // 00B3 CALL R15 1 + 0x5C401800, // 00B4 MOVE R16 R12 + 0x7C340600, // 00B5 CALL R13 3 + 0x8C380B09, // 00B6 GETMET R14 R5 K9 + 0x7C380200, // 00B7 CALL R14 1 + 0x8C3C1D0A, // 00B8 GETMET R15 R14 K10 + 0x58440005, // 00B9 LDCONST R17 K5 + 0x88480B1B, // 00BA GETMBR R18 R5 K27 + 0x5C4C1400, // 00BB MOVE R19 R10 + 0x7C3C0800, // 00BC CALL R15 4 + 0x8C3C1D0A, // 00BD GETMET R15 R14 K10 + 0x58440007, // 00BE LDCONST R17 K7 + 0x88480B1F, // 00BF GETMBR R18 R5 K31 + 0x5C4C1A00, // 00C0 MOVE R19 R13 + 0x7C3C0800, // 00C1 CALL R15 4 + 0x900E0907, // 00C2 SETMBR R3 K4 K7 + 0x80041C00, // 00C3 RET 1 R14 + 0x7002015F, // 00C4 JMP #0225 + 0x54220003, // 00C5 LDINT R8 4 + 0x1C200E08, // 00C6 EQ R8 R7 R8 + 0x78220039, // 00C7 JMPF R8 #0102 + 0x8C200506, // 00C8 GETMET R8 R2 K6 + 0x58280005, // 00C9 LDCONST R10 K5 + 0x7C200400, // 00CA CALL R8 2 + 0x6024000C, // 00CB GETGBL R9 G12 + 0x5C281000, // 00CC MOVE R10 R8 + 0x7C240200, // 00CD CALL R9 1 + 0x542A001F, // 00CE LDINT R10 32 + 0x2024120A, // 00CF NE R9 R9 R10 + 0x78260001, // 00D0 JMPF R9 #00D3 + 0x4C240000, // 00D1 LDNIL R9 + 0x80041200, // 00D2 RET 1 R9 + 0x8C240506, // 00D3 GETMET R9 R2 K6 + 0x582C0007, // 00D4 LDCONST R11 K7 + 0x50300000, // 00D5 LDBOOL R12 0 0 + 0x7C240600, // 00D6 CALL R9 3 + 0x8C280329, // 00D7 GETMET R10 R1 K41 + 0x7C280200, // 00D8 CALL R10 1 + 0x8C2C0B09, // 00D9 GETMET R11 R5 K9 + 0x7C2C0200, // 00DA CALL R11 1 + 0x8C30170A, // 00DB GETMET R12 R11 K10 + 0x58380007, // 00DC LDCONST R14 K7 + 0x883C0B1B, // 00DD GETMBR R15 R5 K27 + 0x5C401400, // 00DE MOVE R16 R10 + 0x7C300800, // 00DF CALL R12 4 + 0x8C30170A, // 00E0 GETMET R12 R11 K10 + 0x5838000E, // 00E1 LDCONST R14 K14 + 0x883C0B1F, // 00E2 GETMBR R15 R5 K31 + 0x5C401000, // 00E3 MOVE R16 R8 + 0x7C300800, // 00E4 CALL R12 4 + 0x8C301724, // 00E5 GETMET R12 R11 K36 + 0x7C300200, // 00E6 CALL R12 1 + 0x8C340325, // 00E7 GETMET R13 R1 K37 + 0x7C340200, // 00E8 CALL R13 1 + 0x0034180D, // 00E9 ADD R13 R12 R13 + 0x8C380926, // 00EA GETMET R14 R4 K38 + 0x7C380200, // 00EB CALL R14 1 + 0x8C381D27, // 00EC GETMET R14 R14 K39 + 0xB8420200, // 00ED GETNGBL R16 K1 + 0x8C402128, // 00EE GETMET R16 R16 K40 + 0x7C400200, // 00EF CALL R16 1 + 0x5C441A00, // 00F0 MOVE R17 R13 + 0x7C380600, // 00F1 CALL R14 3 + 0x8C3C0B09, // 00F2 GETMET R15 R5 K9 + 0x7C3C0200, // 00F3 CALL R15 1 + 0x8C401F0A, // 00F4 GETMET R16 R15 K10 + 0x58480005, // 00F5 LDCONST R18 K5 + 0x884C0B1B, // 00F6 GETMBR R19 R5 K27 + 0x5C501800, // 00F7 MOVE R20 R12 + 0x7C400800, // 00F8 CALL R16 4 + 0x8C401F0A, // 00F9 GETMET R16 R15 K10 + 0x58480007, // 00FA LDCONST R18 K7 + 0x884C0B1F, // 00FB GETMBR R19 R5 K31 + 0x5C501C00, // 00FC MOVE R20 R14 + 0x7C400800, // 00FD CALL R16 4 + 0x54420004, // 00FE LDINT R16 5 + 0x900E0810, // 00FF SETMBR R3 K4 R16 + 0x80041E00, // 0100 RET 1 R15 + 0x70020122, // 0101 JMP #0225 + 0x5422000A, // 0102 LDINT R8 11 + 0x1C200E08, // 0103 EQ R8 R7 R8 + 0x7822000B, // 0104 JMPF R8 #0111 + 0x8C200506, // 0105 GETMET R8 R2 K6 + 0x58280005, // 0106 LDCONST R10 K5 + 0x7C200400, // 0107 CALL R8 2 + 0x8C24032A, // 0108 GETMET R9 R1 K42 + 0x5C2C1000, // 0109 MOVE R11 R8 + 0x7C240400, // 010A CALL R9 2 + 0xB8260200, // 010B GETNGBL R9 K1 + 0x8824132B, // 010C GETMBR R9 R9 K43 + 0x900E3209, // 010D SETMBR R3 K25 R9 + 0x4C240000, // 010E LDNIL R9 + 0x80041200, // 010F RET 1 R9 + 0x70020113, // 0110 JMP #0225 + 0x54220005, // 0111 LDINT R8 6 + 0x1C200E08, // 0112 EQ R8 R7 R8 + 0x782200B9, // 0113 JMPF R8 #01CE + 0xB8224200, // 0114 GETNGBL R8 K33 + 0x8C20112C, // 0115 GETMET R8 R8 K44 + 0x60280008, // 0116 GETGBL R10 G8 + 0x5C2C0400, // 0117 MOVE R11 R2 + 0x7C280200, // 0118 CALL R10 1 + 0x002A5A0A, // 0119 ADD R10 K45 R10 + 0x542E0003, // 011A LDINT R11 4 + 0x7C200600, // 011B CALL R8 3 + 0x8C200506, // 011C GETMET R8 R2 K6 + 0x58280005, // 011D LDCONST R10 K5 + 0x7C200400, // 011E CALL R8 2 + 0x8C240506, // 011F GETMET R9 R2 K6 + 0x582C0007, // 0120 LDCONST R11 K7 + 0x7C240400, // 0121 CALL R9 2 + 0x6028000C, // 0122 GETGBL R10 G12 + 0x5C2C1200, // 0123 MOVE R11 R9 + 0x7C280200, // 0124 CALL R10 1 + 0x1C281505, // 0125 EQ R10 R10 K5 + 0x782A0000, // 0126 JMPF R10 #0128 + 0x4C240000, // 0127 LDNIL R9 + 0x8C280506, // 0128 GETMET R10 R2 K6 + 0x5830000E, // 0129 LDCONST R12 K14 + 0x7C280400, // 012A CALL R10 2 + 0x8C2C0506, // 012B GETMET R11 R2 K6 + 0x58340010, // 012C LDCONST R13 K16 + 0x7C2C0400, // 012D CALL R11 2 + 0x8C300506, // 012E GETMET R12 R2 K6 + 0x543A0003, // 012F LDINT R14 4 + 0x7C300400, // 0130 CALL R12 2 + 0x8C34032E, // 0131 GETMET R13 R1 K46 + 0x7C340200, // 0132 CALL R13 1 + 0x4C380000, // 0133 LDNIL R14 + 0x1C341A0E, // 0134 EQ R13 R13 R14 + 0x78360006, // 0135 JMPF R13 #013D + 0xB8364200, // 0136 GETNGBL R13 K33 + 0x8C341B2C, // 0137 GETMET R13 R13 K44 + 0x583C002F, // 0138 LDCONST R15 K47 + 0x5840000E, // 0139 LDCONST R16 K14 + 0x7C340600, // 013A CALL R13 3 + 0x4C340000, // 013B LDNIL R13 + 0x80041A00, // 013C RET 1 R13 + 0x88340115, // 013D GETMBR R13 R0 K21 + 0x88341B30, // 013E GETMBR R13 R13 K48 + 0x8C341B31, // 013F GETMET R13 R13 K49 + 0x7C340200, // 0140 CALL R13 1 + 0x8C381B32, // 0141 GETMET R14 R13 K50 + 0x8C40032E, // 0142 GETMET R16 R1 K46 + 0x7C400200, // 0143 CALL R16 1 + 0x7C380400, // 0144 CALL R14 2 + 0x8C381B33, // 0145 GETMET R14 R13 K51 + 0x5C401000, // 0146 MOVE R16 R8 0x5C441200, // 0147 MOVE R17 R9 - 0x5C481400, // 0148 MOVE R18 R10 - 0x7C3C0600, // 0149 CALL R15 3 - 0x8C3C1D35, // 014A GETMET R15 R14 K53 - 0x5C441600, // 014B MOVE R17 R11 - 0x7C3C0400, // 014C CALL R15 2 - 0x8C3C1D36, // 014D GETMET R15 R14 K54 + 0x7C380600, // 0148 CALL R14 3 + 0x8C381B34, // 0149 GETMET R14 R13 K52 + 0x5C401400, // 014A MOVE R16 R10 + 0x7C380400, // 014B CALL R14 2 + 0x8C381B35, // 014C GETMET R14 R13 K53 + 0x5C401600, // 014D MOVE R16 R11 0x5C441800, // 014E MOVE R17 R12 - 0x5C481A00, // 014F MOVE R18 R13 - 0x7C3C0600, // 0150 CALL R15 3 - 0x8C3C1D37, // 0151 GETMET R15 R14 K55 - 0x8C440338, // 0152 GETMET R17 R1 K56 - 0x7C440200, // 0153 CALL R17 1 - 0x7C3C0400, // 0154 CALL R15 2 - 0xB83E0400, // 0155 GETNGBL R15 K2 - 0x883C1F03, // 0156 GETMBR R15 R15 K3 - 0x8C3C1F39, // 0157 GETMET R15 R15 K57 - 0x5C441200, // 0158 MOVE R17 R9 - 0x7C3C0400, // 0159 CALL R15 2 - 0x8C401F3A, // 015A GETMET R16 R15 K58 - 0x544A0005, // 015B LDINT R18 6 - 0x7C400400, // 015C CALL R16 2 - 0x8C442107, // 015D GETMET R17 R16 K7 - 0x544E0014, // 015E LDINT R19 21 - 0x7C440400, // 015F CALL R17 2 - 0x8C482107, // 0160 GETMET R18 R16 K7 - 0x54520010, // 0161 LDINT R20 17 - 0x7C480400, // 0162 CALL R18 2 - 0x5C4C2200, // 0163 MOVE R19 R17 - 0x784E0001, // 0164 JMPF R19 #0167 - 0x5C4C2400, // 0165 MOVE R19 R18 - 0x744E0006, // 0166 JMPT R19 #016E - 0xB84E4400, // 0167 GETNGBL R19 K34 - 0x8C4C272D, // 0168 GETMET R19 R19 K45 - 0x5854003B, // 0169 LDCONST R21 K59 - 0x5858000F, // 016A LDCONST R22 K15 - 0x7C4C0600, // 016B CALL R19 3 - 0x504C0000, // 016C LDBOOL R19 0 0 - 0x80042600, // 016D RET 1 R19 - 0x604C0004, // 016E GETGBL R19 G4 - 0x5C502200, // 016F MOVE R20 R17 - 0x7C4C0200, // 0170 CALL R19 1 - 0x1C4C273C, // 0171 EQ R19 R19 K60 - 0x784E0007, // 0172 JMPF R19 #017B - 0xB84E7A00, // 0173 GETNGBL R19 K61 - 0x8C4C273E, // 0174 GETMET R19 R19 K62 - 0x5C542200, // 0175 MOVE R21 R17 - 0x7C4C0400, // 0176 CALL R19 2 - 0x8C4C273F, // 0177 GETMET R19 R19 K63 - 0x7C4C0200, // 0178 CALL R19 1 - 0x5C442600, // 0179 MOVE R17 R19 - 0x70020002, // 017A JMP #017E - 0x8C4C233F, // 017B GETMET R19 R17 K63 - 0x7C4C0200, // 017C CALL R19 1 - 0x5C442600, // 017D MOVE R17 R19 - 0x604C0004, // 017E GETGBL R19 G4 - 0x5C502400, // 017F MOVE R20 R18 - 0x7C4C0200, // 0180 CALL R19 1 - 0x1C4C273C, // 0181 EQ R19 R19 K60 - 0x784E0007, // 0182 JMPF R19 #018B - 0xB84E7A00, // 0183 GETNGBL R19 K61 - 0x8C4C273E, // 0184 GETMET R19 R19 K62 - 0x5C542400, // 0185 MOVE R21 R18 - 0x7C4C0400, // 0186 CALL R19 2 - 0x8C4C273F, // 0187 GETMET R19 R19 K63 - 0x7C4C0200, // 0188 CALL R19 1 - 0x5C482600, // 0189 MOVE R18 R19 - 0x70020002, // 018A JMP #018E - 0x8C4C253F, // 018B GETMET R19 R18 K63 - 0x7C4C0200, // 018C CALL R19 1 - 0x5C482600, // 018D MOVE R18 R19 - 0x8C4C0340, // 018E GETMET R19 R1 K64 - 0x7C4C0200, // 018F CALL R19 1 - 0x40521141, // 0190 CONNECT R20 K8 K65 - 0x944C2614, // 0191 GETIDX R19 R19 R20 - 0x60540015, // 0192 GETGBL R21 G21 - 0x7C540000, // 0193 CALL R21 0 - 0x8C542B42, // 0194 GETMET R21 R21 K66 - 0x585C0043, // 0195 LDCONST R23 K67 - 0x7C540400, // 0196 CALL R21 2 - 0x5C502A00, // 0197 MOVE R20 R21 - 0x8C540944, // 0198 GETMET R21 R4 K68 - 0x7C540200, // 0199 CALL R21 1 - 0x8C582345, // 019A GETMET R22 R17 K69 - 0x7C580200, // 019B CALL R22 1 - 0x8C582D46, // 019C GETMET R22 R22 K70 - 0x7C580200, // 019D CALL R22 1 - 0x8C5C2B47, // 019E GETMET R23 R21 K71 - 0x5C642600, // 019F MOVE R25 R19 - 0x5C682C00, // 01A0 MOVE R26 R22 - 0x5C6C2800, // 01A1 MOVE R27 R20 - 0x54720007, // 01A2 LDINT R28 8 - 0x7C5C0A00, // 01A3 CALL R23 5 - 0x88600312, // 01A4 GETMBR R24 R1 K18 - 0x78620001, // 01A5 JMPF R24 #01A8 - 0x88600312, // 01A6 GETMBR R24 R1 K18 - 0x70020001, // 01A7 JMP #01AA - 0x88600116, // 01A8 GETMBR R24 R0 K22 - 0x88603148, // 01A9 GETMBR R24 R24 K72 - 0x8C641D49, // 01AA GETMET R25 R14 K73 + 0x7C380600, // 014F CALL R14 3 + 0x8C381B36, // 0150 GETMET R14 R13 K54 + 0x8C400337, // 0151 GETMET R16 R1 K55 + 0x7C400200, // 0152 CALL R16 1 + 0x7C380400, // 0153 CALL R14 2 + 0xB83A0200, // 0154 GETNGBL R14 K1 + 0x88381D02, // 0155 GETMBR R14 R14 K2 + 0x8C381D38, // 0156 GETMET R14 R14 K56 + 0x5C401000, // 0157 MOVE R16 R8 + 0x7C380400, // 0158 CALL R14 2 + 0x8C3C1D39, // 0159 GETMET R15 R14 K57 + 0x54460005, // 015A LDINT R17 6 + 0x7C3C0400, // 015B CALL R15 2 + 0x8C401F06, // 015C GETMET R16 R15 K6 + 0x544A0014, // 015D LDINT R18 21 + 0x7C400400, // 015E CALL R16 2 + 0x8C441F06, // 015F GETMET R17 R15 K6 + 0x544E0010, // 0160 LDINT R19 17 + 0x7C440400, // 0161 CALL R17 2 + 0x5C482000, // 0162 MOVE R18 R16 + 0x784A0001, // 0163 JMPF R18 #0166 + 0x5C482200, // 0164 MOVE R18 R17 + 0x744A0006, // 0165 JMPT R18 #016D + 0xB84A4200, // 0166 GETNGBL R18 K33 + 0x8C48252C, // 0167 GETMET R18 R18 K44 + 0x5850003A, // 0168 LDCONST R20 K58 + 0x5854000E, // 0169 LDCONST R21 K14 + 0x7C480600, // 016A CALL R18 3 + 0x50480000, // 016B LDBOOL R18 0 0 + 0x80042400, // 016C RET 1 R18 + 0x60480004, // 016D GETGBL R18 G4 + 0x5C4C2000, // 016E MOVE R19 R16 + 0x7C480200, // 016F CALL R18 1 + 0x1C48253B, // 0170 EQ R18 R18 K59 + 0x784A0007, // 0171 JMPF R18 #017A + 0xB84A7800, // 0172 GETNGBL R18 K60 + 0x8C48253D, // 0173 GETMET R18 R18 K61 + 0x5C502000, // 0174 MOVE R20 R16 + 0x7C480400, // 0175 CALL R18 2 + 0x8C48253E, // 0176 GETMET R18 R18 K62 + 0x7C480200, // 0177 CALL R18 1 + 0x5C402400, // 0178 MOVE R16 R18 + 0x70020002, // 0179 JMP #017D + 0x8C48213E, // 017A GETMET R18 R16 K62 + 0x7C480200, // 017B CALL R18 1 + 0x5C402400, // 017C MOVE R16 R18 + 0x60480004, // 017D GETGBL R18 G4 + 0x5C4C2200, // 017E MOVE R19 R17 + 0x7C480200, // 017F CALL R18 1 + 0x1C48253B, // 0180 EQ R18 R18 K59 + 0x784A0007, // 0181 JMPF R18 #018A + 0xB84A7800, // 0182 GETNGBL R18 K60 + 0x8C48253D, // 0183 GETMET R18 R18 K61 + 0x5C502200, // 0184 MOVE R20 R17 + 0x7C480400, // 0185 CALL R18 2 + 0x8C48253E, // 0186 GETMET R18 R18 K62 + 0x7C480200, // 0187 CALL R18 1 + 0x5C442400, // 0188 MOVE R17 R18 + 0x70020002, // 0189 JMP #018D + 0x8C48233E, // 018A GETMET R18 R17 K62 + 0x7C480200, // 018B CALL R18 1 + 0x5C442400, // 018C MOVE R17 R18 + 0x8C48033F, // 018D GETMET R18 R1 K63 + 0x7C480200, // 018E CALL R18 1 + 0x404E0F40, // 018F CONNECT R19 K7 K64 + 0x94482413, // 0190 GETIDX R18 R18 R19 + 0x60500015, // 0191 GETGBL R20 G21 + 0x7C500000, // 0192 CALL R20 0 + 0x8C502941, // 0193 GETMET R20 R20 K65 + 0x58580042, // 0194 LDCONST R22 K66 + 0x7C500400, // 0195 CALL R20 2 + 0x5C4C2800, // 0196 MOVE R19 R20 + 0x8C500943, // 0197 GETMET R20 R4 K67 + 0x7C500200, // 0198 CALL R20 1 + 0x8C542144, // 0199 GETMET R21 R16 K68 + 0x7C540200, // 019A CALL R21 1 + 0x8C542B45, // 019B GETMET R21 R21 K69 + 0x7C540200, // 019C CALL R21 1 + 0x8C582946, // 019D GETMET R22 R20 K70 + 0x5C602400, // 019E MOVE R24 R18 + 0x5C642A00, // 019F MOVE R25 R21 + 0x5C682600, // 01A0 MOVE R26 R19 + 0x546E0007, // 01A1 LDINT R27 8 + 0x7C580A00, // 01A2 CALL R22 5 + 0x885C0311, // 01A3 GETMBR R23 R1 K17 + 0x785E0001, // 01A4 JMPF R23 #01A7 + 0x885C0311, // 01A5 GETMBR R23 R1 K17 + 0x70020001, // 01A6 JMP #01A9 + 0x885C0115, // 01A7 GETMBR R23 R0 K21 + 0x885C2F47, // 01A8 GETMBR R23 R23 K71 + 0x8C601B48, // 01A9 GETMET R24 R13 K72 + 0x5C682000, // 01AA MOVE R26 R16 0x5C6C2200, // 01AB MOVE R27 R17 - 0x5C702400, // 01AC MOVE R28 R18 + 0x5C702C00, // 01AC MOVE R28 R22 0x5C742E00, // 01AD MOVE R29 R23 - 0x5C783000, // 01AE MOVE R30 R24 - 0x7C640A00, // 01AF CALL R25 5 - 0x8C641D4A, // 01B0 GETMET R25 R14 K74 - 0x7C640200, // 01B1 CALL R25 1 - 0x88640116, // 01B2 GETMBR R25 R0 K22 - 0x8C64334B, // 01B3 GETMET R25 R25 K75 - 0x5C6C1C00, // 01B4 MOVE R27 R14 - 0x7C640400, // 01B5 CALL R25 2 - 0x8C64034C, // 01B6 GETMET R25 R1 K76 - 0x7C640200, // 01B7 CALL R25 1 - 0x78660002, // 01B8 JMPF R25 #01BC - 0x8C64034D, // 01B9 GETMET R25 R1 K77 - 0x546E003B, // 01BA LDINT R27 60 - 0x7C640400, // 01BB CALL R25 2 - 0x8C641D4E, // 01BC GETMET R25 R14 K78 - 0x7C640200, // 01BD CALL R25 1 - 0x8C640D0A, // 01BE GETMET R25 R6 K10 - 0x7C640200, // 01BF CALL R25 1 - 0x8C68330B, // 01C0 GETMET R26 R25 K11 - 0x58700006, // 01C1 LDCONST R28 K6 - 0x88740D0C, // 01C2 GETMBR R29 R6 K12 - 0xB87A0400, // 01C3 GETNGBL R30 K2 - 0x88783D2C, // 01C4 GETMBR R30 R30 K44 - 0x7C680800, // 01C5 CALL R26 4 - 0x8C68330B, // 01C6 GETMET R26 R25 K11 - 0x58700008, // 01C7 LDCONST R28 K8 - 0x88740D0C, // 01C8 GETMBR R29 R6 K12 - 0x58780008, // 01C9 LDCONST R30 K8 - 0x7C680800, // 01CA CALL R26 4 - 0x546A0007, // 01CB LDINT R26 8 - 0x900E0A1A, // 01CC SETMBR R3 K5 R26 - 0x80043200, // 01CD RET 1 R25 - 0x70020056, // 01CE JMP #0226 - 0x54260008, // 01CF LDINT R9 9 - 0x1C241009, // 01D0 EQ R9 R8 R9 - 0x7826001E, // 01D1 JMPF R9 #01F1 - 0x8C240507, // 01D2 GETMET R9 R2 K7 - 0x582C0006, // 01D3 LDCONST R11 K6 - 0x7C240400, // 01D4 CALL R9 2 - 0x8C28034F, // 01D5 GETMET R10 R1 K79 - 0x5C301200, // 01D6 MOVE R12 R9 - 0x7C280400, // 01D7 CALL R10 2 - 0xB82A4400, // 01D8 GETNGBL R10 K34 - 0x8C28152D, // 01D9 GETMET R10 R10 K45 - 0x8C300B50, // 01DA GETMET R12 R5 K80 - 0x58380051, // 01DB LDCONST R14 K81 - 0x883C0312, // 01DC GETMBR R15 R1 K18 - 0x8C3C1F52, // 01DD GETMET R15 R15 K82 - 0x7C3C0200, // 01DE CALL R15 1 - 0x8C3C1F45, // 01DF GETMET R15 R15 K69 - 0x7C3C0200, // 01E0 CALL R15 1 - 0x8C3C1F46, // 01E1 GETMET R15 R15 K70 - 0x7C3C0200, // 01E2 CALL R15 1 - 0x8C3C1F53, // 01E3 GETMET R15 R15 K83 - 0x7C3C0200, // 01E4 CALL R15 1 - 0x60400008, // 01E5 GETGBL R16 G8 - 0x5C441200, // 01E6 MOVE R17 R9 - 0x7C400200, // 01E7 CALL R16 1 - 0x7C300800, // 01E8 CALL R12 4 - 0x58340011, // 01E9 LDCONST R13 K17 - 0x7C280600, // 01EA CALL R10 3 - 0xB82A0400, // 01EB GETNGBL R10 K2 - 0x8828152C, // 01EC GETMBR R10 R10 K44 - 0x900E340A, // 01ED SETMBR R3 K26 R10 - 0x4C280000, // 01EE LDNIL R10 - 0x80041400, // 01EF RET 1 R10 - 0x70020034, // 01F0 JMP #0226 - 0x54260009, // 01F1 LDINT R9 10 - 0x1C241009, // 01F2 EQ R9 R8 R9 - 0x78260031, // 01F3 JMPF R9 #0226 - 0x8C240507, // 01F4 GETMET R9 R2 K7 - 0x582C0006, // 01F5 LDCONST R11 K6 - 0x7C240400, // 01F6 CALL R9 2 - 0x60280008, // 01F7 GETGBL R10 G8 - 0x5C2C1200, // 01F8 MOVE R11 R9 - 0x7C280200, // 01F9 CALL R10 1 - 0x002AA80A, // 01FA ADD R10 K84 R10 - 0x900E5A0A, // 01FB SETMBR R3 K45 R10 - 0x60280010, // 01FC GETGBL R10 G16 - 0x882C0116, // 01FD GETMBR R11 R0 K22 - 0x882C1731, // 01FE GETMBR R11 R11 K49 - 0x8C2C1755, // 01FF GETMET R11 R11 K85 - 0x7C2C0200, // 0200 CALL R11 1 - 0x7C280200, // 0201 CALL R10 1 - 0xA8020010, // 0202 EXBLK 0 #0214 - 0x5C2C1400, // 0203 MOVE R11 R10 - 0x7C2C0000, // 0204 CALL R11 0 - 0x8C301756, // 0205 GETMET R12 R11 K86 - 0x7C300200, // 0206 CALL R12 1 - 0x1C301809, // 0207 EQ R12 R12 R9 - 0x78320008, // 0208 JMPF R12 #0212 - 0xB8324400, // 0209 GETNGBL R12 K34 - 0x8C301957, // 020A GETMET R12 R12 K87 - 0x543A07CF, // 020B LDINT R14 2000 - 0x843C0000, // 020C CLOSURE R15 P0 - 0x7C300600, // 020D CALL R12 3 - 0x50300200, // 020E LDBOOL R12 1 0 - 0xA0000000, // 020F CLOSE R0 - 0xA8040001, // 0210 EXBLK 1 1 - 0x80041800, // 0211 RET 1 R12 - 0xA0280000, // 0212 CLOSE R10 - 0x7001FFEE, // 0213 JMP #0203 - 0x58280058, // 0214 LDCONST R10 K88 - 0xAC280200, // 0215 CATCH R10 1 0 - 0xB0080000, // 0216 RAISE 2 R0 R0 - 0xB82A4400, // 0217 GETNGBL R10 K34 - 0x8C28152D, // 0218 GETMET R10 R10 K45 - 0x60300008, // 0219 GETGBL R12 G8 - 0x5C341200, // 021A MOVE R13 R9 - 0x7C300200, // 021B CALL R12 1 - 0x0032B20C, // 021C ADD R12 K89 R12 - 0x0030195A, // 021D ADD R12 R12 K90 - 0x5834000F, // 021E LDCONST R13 K15 - 0x7C280600, // 021F CALL R10 3 - 0xB82A0400, // 0220 GETNGBL R10 K2 - 0x8828155B, // 0221 GETMBR R10 R10 K91 - 0x900E340A, // 0222 SETMBR R3 K26 R10 - 0x4C280000, // 0223 LDNIL R10 - 0xA0000000, // 0224 CLOSE R0 - 0x80041400, // 0225 RET 1 R10 - 0x7002009B, // 0226 JMP #02C3 - 0x5426003B, // 0227 LDINT R9 60 - 0x1C240E09, // 0228 EQ R9 R7 R9 - 0x78260085, // 0229 JMPF R9 #02B0 - 0x1C241106, // 022A EQ R9 R8 K6 - 0x78260065, // 022B JMPF R9 #0292 - 0x8C240507, // 022C GETMET R9 R2 K7 - 0x582C0006, // 022D LDCONST R11 K6 - 0x7C240400, // 022E CALL R9 2 - 0x8C280507, // 022F GETMET R10 R2 K7 - 0x58300008, // 0230 LDCONST R12 K8 - 0x7C280400, // 0231 CALL R10 2 - 0x8C2C0507, // 0232 GETMET R11 R2 K7 - 0x5834000F, // 0233 LDCONST R13 K15 - 0x7C2C0400, // 0234 CALL R11 2 - 0x8C300507, // 0235 GETMET R12 R2 K7 - 0x58380011, // 0236 LDCONST R14 K17 - 0x7C300400, // 0237 CALL R12 2 - 0x8C340507, // 0238 GETMET R13 R2 K7 - 0x543E0003, // 0239 LDINT R15 4 - 0x7C340400, // 023A CALL R13 2 - 0xB83A4400, // 023B GETNGBL R14 K34 - 0x8C381D2D, // 023C GETMET R14 R14 K45 - 0x8C400B50, // 023D GETMET R16 R5 K80 - 0x5848005C, // 023E LDCONST R18 K92 - 0x5C4C1200, // 023F MOVE R19 R9 - 0x8C501553, // 0240 GETMET R20 R10 K83 - 0x7C500200, // 0241 CALL R20 1 - 0x5C541600, // 0242 MOVE R21 R11 - 0x5C581800, // 0243 MOVE R22 R12 - 0x8C5C1B53, // 0244 GETMET R23 R13 K83 - 0x7C5C0200, // 0245 CALL R23 1 - 0x7C400E00, // 0246 CALL R16 7 - 0x54460003, // 0247 LDINT R17 4 - 0x7C380600, // 0248 CALL R14 3 - 0x4C380000, // 0249 LDNIL R14 - 0x1C38120E, // 024A EQ R14 R9 R14 - 0x743A000B, // 024B JMPT R14 #0258 - 0x4C380000, // 024C LDNIL R14 - 0x1C38140E, // 024D EQ R14 R10 R14 - 0x743A0008, // 024E JMPT R14 #0258 - 0x4C380000, // 024F LDNIL R14 - 0x1C38160E, // 0250 EQ R14 R11 R14 - 0x743A0005, // 0251 JMPT R14 #0258 - 0x4C380000, // 0252 LDNIL R14 - 0x1C38180E, // 0253 EQ R14 R12 R14 - 0x743A0002, // 0254 JMPT R14 #0258 - 0x4C380000, // 0255 LDNIL R14 - 0x1C381A0E, // 0256 EQ R14 R13 R14 - 0x783A0005, // 0257 JMPF R14 #025E - 0xB83A0400, // 0258 GETNGBL R14 K2 - 0x88381D5D, // 0259 GETMBR R14 R14 K93 - 0x900E340E, // 025A SETMBR R3 K26 R14 - 0x4C380000, // 025B LDNIL R14 - 0xA0000000, // 025C CLOSE R0 - 0x80041C00, // 025D RET 1 R14 - 0x6038000C, // 025E GETGBL R14 G12 - 0x5C3C1400, // 025F MOVE R15 R10 - 0x7C380200, // 0260 CALL R14 1 - 0x543E001F, // 0261 LDINT R15 32 - 0x54420040, // 0262 LDINT R16 65 - 0x003C1E10, // 0263 ADD R15 R15 R16 - 0x20381C0F, // 0264 NE R14 R14 R15 - 0x743A000B, // 0265 JMPT R14 #0272 - 0x6038000C, // 0266 GETGBL R14 G12 - 0x5C3C1A00, // 0267 MOVE R15 R13 - 0x7C380200, // 0268 CALL R14 1 - 0x543E000F, // 0269 LDINT R15 16 - 0x14381C0F, // 026A LT R14 R14 R15 - 0x743A0005, // 026B JMPT R14 #0272 - 0x6038000C, // 026C GETGBL R14 G12 - 0x5C3C1A00, // 026D MOVE R15 R13 - 0x7C380200, // 026E CALL R14 1 - 0x543E001F, // 026F LDINT R15 32 - 0x24381C0F, // 0270 GT R14 R14 R15 - 0x783A000A, // 0271 JMPF R14 #027D - 0xB83A4400, // 0272 GETNGBL R14 K34 - 0x8C381D2D, // 0273 GETMET R14 R14 K45 - 0x5840005E, // 0274 LDCONST R16 K94 - 0x5844000F, // 0275 LDCONST R17 K15 - 0x7C380600, // 0276 CALL R14 3 - 0xB83A0400, // 0277 GETNGBL R14 K2 - 0x88381D5F, // 0278 GETMBR R14 R14 K95 - 0x900E340E, // 0279 SETMBR R3 K26 R14 - 0x4C380000, // 027A LDNIL R14 - 0xA0000000, // 027B CLOSE R0 - 0x80041C00, // 027C RET 1 R14 - 0x543A001E, // 027D LDINT R14 31 - 0x403A0C0E, // 027E CONNECT R14 K6 R14 - 0x9438140E, // 027F GETIDX R14 R10 R14 - 0x543E001F, // 0280 LDINT R15 32 - 0x403C1F41, // 0281 CONNECT R15 R15 K65 - 0x943C140F, // 0282 GETIDX R15 R10 R15 - 0x88400116, // 0283 GETMBR R16 R0 K22 - 0x8C402160, // 0284 GETMET R16 R16 K96 - 0x5C481200, // 0285 MOVE R18 R9 - 0x5C4C1800, // 0286 MOVE R19 R12 - 0x5C501600, // 0287 MOVE R20 R11 + 0x7C600A00, // 01AE CALL R24 5 + 0x8C601B49, // 01AF GETMET R24 R13 K73 + 0x7C600200, // 01B0 CALL R24 1 + 0x88600115, // 01B1 GETMBR R24 R0 K21 + 0x8C60314A, // 01B2 GETMET R24 R24 K74 + 0x5C681A00, // 01B3 MOVE R26 R13 + 0x7C600400, // 01B4 CALL R24 2 + 0x8C60034B, // 01B5 GETMET R24 R1 K75 + 0x7C600200, // 01B6 CALL R24 1 + 0x78620002, // 01B7 JMPF R24 #01BB + 0x8C60034C, // 01B8 GETMET R24 R1 K76 + 0x546A003B, // 01B9 LDINT R26 60 + 0x7C600400, // 01BA CALL R24 2 + 0x8C601B4D, // 01BB GETMET R24 R13 K77 + 0x7C600200, // 01BC CALL R24 1 + 0x8C600B09, // 01BD GETMET R24 R5 K9 + 0x7C600200, // 01BE CALL R24 1 + 0x8C64310A, // 01BF GETMET R25 R24 K10 + 0x586C0005, // 01C0 LDCONST R27 K5 + 0x88700B0B, // 01C1 GETMBR R28 R5 K11 + 0xB8760200, // 01C2 GETNGBL R29 K1 + 0x88743B2B, // 01C3 GETMBR R29 R29 K43 + 0x7C640800, // 01C4 CALL R25 4 + 0x8C64310A, // 01C5 GETMET R25 R24 K10 + 0x586C0007, // 01C6 LDCONST R27 K7 + 0x88700B0B, // 01C7 GETMBR R28 R5 K11 + 0x58740007, // 01C8 LDCONST R29 K7 + 0x7C640800, // 01C9 CALL R25 4 + 0x54660007, // 01CA LDINT R25 8 + 0x900E0819, // 01CB SETMBR R3 K4 R25 + 0x80043000, // 01CC RET 1 R24 + 0x70020056, // 01CD JMP #0225 + 0x54220008, // 01CE LDINT R8 9 + 0x1C200E08, // 01CF EQ R8 R7 R8 + 0x7822001E, // 01D0 JMPF R8 #01F0 + 0x8C200506, // 01D1 GETMET R8 R2 K6 + 0x58280005, // 01D2 LDCONST R10 K5 + 0x7C200400, // 01D3 CALL R8 2 + 0x8C24034E, // 01D4 GETMET R9 R1 K78 + 0x5C2C1000, // 01D5 MOVE R11 R8 + 0x7C240400, // 01D6 CALL R9 2 + 0xB8264200, // 01D7 GETNGBL R9 K33 + 0x8C24132C, // 01D8 GETMET R9 R9 K44 + 0x602C0018, // 01D9 GETGBL R11 G24 + 0x5830004F, // 01DA LDCONST R12 K79 + 0x88340311, // 01DB GETMBR R13 R1 K17 + 0x8C341B50, // 01DC GETMET R13 R13 K80 + 0x7C340200, // 01DD CALL R13 1 + 0x8C341B44, // 01DE GETMET R13 R13 K68 + 0x7C340200, // 01DF CALL R13 1 + 0x8C341B45, // 01E0 GETMET R13 R13 K69 + 0x7C340200, // 01E1 CALL R13 1 + 0x8C341B51, // 01E2 GETMET R13 R13 K81 + 0x7C340200, // 01E3 CALL R13 1 + 0x60380008, // 01E4 GETGBL R14 G8 + 0x5C3C1000, // 01E5 MOVE R15 R8 + 0x7C380200, // 01E6 CALL R14 1 + 0x7C2C0600, // 01E7 CALL R11 3 + 0x58300010, // 01E8 LDCONST R12 K16 + 0x7C240600, // 01E9 CALL R9 3 + 0xB8260200, // 01EA GETNGBL R9 K1 + 0x8824132B, // 01EB GETMBR R9 R9 K43 + 0x900E3209, // 01EC SETMBR R3 K25 R9 + 0x4C240000, // 01ED LDNIL R9 + 0x80041200, // 01EE RET 1 R9 + 0x70020034, // 01EF JMP #0225 + 0x54220009, // 01F0 LDINT R8 10 + 0x1C200E08, // 01F1 EQ R8 R7 R8 + 0x78220031, // 01F2 JMPF R8 #0225 + 0x8C200506, // 01F3 GETMET R8 R2 K6 + 0x58280005, // 01F4 LDCONST R10 K5 + 0x7C200400, // 01F5 CALL R8 2 + 0x60240008, // 01F6 GETGBL R9 G8 + 0x5C281000, // 01F7 MOVE R10 R8 + 0x7C240200, // 01F8 CALL R9 1 + 0x0026A409, // 01F9 ADD R9 K82 R9 + 0x900E5809, // 01FA SETMBR R3 K44 R9 + 0x60240010, // 01FB GETGBL R9 G16 + 0x88280115, // 01FC GETMBR R10 R0 K21 + 0x88281530, // 01FD GETMBR R10 R10 K48 + 0x8C281553, // 01FE GETMET R10 R10 K83 + 0x7C280200, // 01FF CALL R10 1 + 0x7C240200, // 0200 CALL R9 1 + 0xA8020010, // 0201 EXBLK 0 #0213 + 0x5C281200, // 0202 MOVE R10 R9 + 0x7C280000, // 0203 CALL R10 0 + 0x8C2C1554, // 0204 GETMET R11 R10 K84 + 0x7C2C0200, // 0205 CALL R11 1 + 0x1C2C1608, // 0206 EQ R11 R11 R8 + 0x782E0008, // 0207 JMPF R11 #0211 + 0xB82E4200, // 0208 GETNGBL R11 K33 + 0x8C2C1755, // 0209 GETMET R11 R11 K85 + 0x543607CF, // 020A LDINT R13 2000 + 0x84380000, // 020B CLOSURE R14 P0 + 0x7C2C0600, // 020C CALL R11 3 + 0x502C0200, // 020D LDBOOL R11 1 0 + 0xA0000000, // 020E CLOSE R0 + 0xA8040001, // 020F EXBLK 1 1 + 0x80041600, // 0210 RET 1 R11 + 0xA0240000, // 0211 CLOSE R9 + 0x7001FFEE, // 0212 JMP #0202 + 0x58240056, // 0213 LDCONST R9 K86 + 0xAC240200, // 0214 CATCH R9 1 0 + 0xB0080000, // 0215 RAISE 2 R0 R0 + 0xB8264200, // 0216 GETNGBL R9 K33 + 0x8C24132C, // 0217 GETMET R9 R9 K44 + 0x602C0008, // 0218 GETGBL R11 G8 + 0x5C301000, // 0219 MOVE R12 R8 + 0x7C2C0200, // 021A CALL R11 1 + 0x002EAE0B, // 021B ADD R11 K87 R11 + 0x002C1758, // 021C ADD R11 R11 K88 + 0x5830000E, // 021D LDCONST R12 K14 + 0x7C240600, // 021E CALL R9 3 + 0xB8260200, // 021F GETNGBL R9 K1 + 0x88241359, // 0220 GETMBR R9 R9 K89 + 0x900E3209, // 0221 SETMBR R3 K25 R9 + 0x4C240000, // 0222 LDNIL R9 + 0xA0000000, // 0223 CLOSE R0 + 0x80041200, // 0224 RET 1 R9 + 0x7002009B, // 0225 JMP #02C2 + 0x5422003B, // 0226 LDINT R8 60 + 0x1C200C08, // 0227 EQ R8 R6 R8 + 0x78220085, // 0228 JMPF R8 #02AF + 0x1C200F05, // 0229 EQ R8 R7 K5 + 0x78220065, // 022A JMPF R8 #0291 + 0x8C200506, // 022B GETMET R8 R2 K6 + 0x58280005, // 022C LDCONST R10 K5 + 0x7C200400, // 022D CALL R8 2 + 0x8C240506, // 022E GETMET R9 R2 K6 + 0x582C0007, // 022F LDCONST R11 K7 + 0x7C240400, // 0230 CALL R9 2 + 0x8C280506, // 0231 GETMET R10 R2 K6 + 0x5830000E, // 0232 LDCONST R12 K14 + 0x7C280400, // 0233 CALL R10 2 + 0x8C2C0506, // 0234 GETMET R11 R2 K6 + 0x58340010, // 0235 LDCONST R13 K16 + 0x7C2C0400, // 0236 CALL R11 2 + 0x8C300506, // 0237 GETMET R12 R2 K6 + 0x543A0003, // 0238 LDINT R14 4 + 0x7C300400, // 0239 CALL R12 2 + 0xB8364200, // 023A GETNGBL R13 K33 + 0x8C341B2C, // 023B GETMET R13 R13 K44 + 0x603C0018, // 023C GETGBL R15 G24 + 0x5840005A, // 023D LDCONST R16 K90 + 0x5C441000, // 023E MOVE R17 R8 + 0x8C481351, // 023F GETMET R18 R9 K81 + 0x7C480200, // 0240 CALL R18 1 + 0x5C4C1400, // 0241 MOVE R19 R10 + 0x5C501600, // 0242 MOVE R20 R11 + 0x8C541951, // 0243 GETMET R21 R12 K81 + 0x7C540200, // 0244 CALL R21 1 + 0x7C3C0C00, // 0245 CALL R15 6 + 0x54420003, // 0246 LDINT R16 4 + 0x7C340600, // 0247 CALL R13 3 + 0x4C340000, // 0248 LDNIL R13 + 0x1C34100D, // 0249 EQ R13 R8 R13 + 0x7436000B, // 024A JMPT R13 #0257 + 0x4C340000, // 024B LDNIL R13 + 0x1C34120D, // 024C EQ R13 R9 R13 + 0x74360008, // 024D JMPT R13 #0257 + 0x4C340000, // 024E LDNIL R13 + 0x1C34140D, // 024F EQ R13 R10 R13 + 0x74360005, // 0250 JMPT R13 #0257 + 0x4C340000, // 0251 LDNIL R13 + 0x1C34160D, // 0252 EQ R13 R11 R13 + 0x74360002, // 0253 JMPT R13 #0257 + 0x4C340000, // 0254 LDNIL R13 + 0x1C34180D, // 0255 EQ R13 R12 R13 + 0x78360005, // 0256 JMPF R13 #025D + 0xB8360200, // 0257 GETNGBL R13 K1 + 0x88341B5B, // 0258 GETMBR R13 R13 K91 + 0x900E320D, // 0259 SETMBR R3 K25 R13 + 0x4C340000, // 025A LDNIL R13 + 0xA0000000, // 025B CLOSE R0 + 0x80041A00, // 025C RET 1 R13 + 0x6034000C, // 025D GETGBL R13 G12 + 0x5C381200, // 025E MOVE R14 R9 + 0x7C340200, // 025F CALL R13 1 + 0x543A001F, // 0260 LDINT R14 32 + 0x543E0040, // 0261 LDINT R15 65 + 0x00381C0F, // 0262 ADD R14 R14 R15 + 0x20341A0E, // 0263 NE R13 R13 R14 + 0x7436000B, // 0264 JMPT R13 #0271 + 0x6034000C, // 0265 GETGBL R13 G12 + 0x5C381800, // 0266 MOVE R14 R12 + 0x7C340200, // 0267 CALL R13 1 + 0x543A000F, // 0268 LDINT R14 16 + 0x14341A0E, // 0269 LT R13 R13 R14 + 0x74360005, // 026A JMPT R13 #0271 + 0x6034000C, // 026B GETGBL R13 G12 + 0x5C381800, // 026C MOVE R14 R12 + 0x7C340200, // 026D CALL R13 1 + 0x543A001F, // 026E LDINT R14 32 + 0x24341A0E, // 026F GT R13 R13 R14 + 0x7836000A, // 0270 JMPF R13 #027C + 0xB8364200, // 0271 GETNGBL R13 K33 + 0x8C341B2C, // 0272 GETMET R13 R13 K44 + 0x583C005C, // 0273 LDCONST R15 K92 + 0x5840000E, // 0274 LDCONST R16 K14 + 0x7C340600, // 0275 CALL R13 3 + 0xB8360200, // 0276 GETNGBL R13 K1 + 0x88341B5D, // 0277 GETMBR R13 R13 K93 + 0x900E320D, // 0278 SETMBR R3 K25 R13 + 0x4C340000, // 0279 LDNIL R13 + 0xA0000000, // 027A CLOSE R0 + 0x80041A00, // 027B RET 1 R13 + 0x5436001E, // 027C LDINT R13 31 + 0x40360A0D, // 027D CONNECT R13 K5 R13 + 0x9434120D, // 027E GETIDX R13 R9 R13 + 0x543A001F, // 027F LDINT R14 32 + 0x40381D40, // 0280 CONNECT R14 R14 K64 + 0x9438120E, // 0281 GETIDX R14 R9 R14 + 0x883C0115, // 0282 GETMBR R15 R0 K21 + 0x8C3C1F5E, // 0283 GETMET R15 R15 K94 + 0x5C441000, // 0284 MOVE R17 R8 + 0x5C481600, // 0285 MOVE R18 R11 + 0x5C4C1400, // 0286 MOVE R19 R10 + 0x5C501800, // 0287 MOVE R20 R12 0x5C541A00, // 0288 MOVE R21 R13 0x5C581C00, // 0289 MOVE R22 R14 - 0x5C5C1E00, // 028A MOVE R23 R15 - 0x8C600361, // 028B GETMET R24 R1 K97 - 0x7C600200, // 028C CALL R24 1 - 0x7C401000, // 028D CALL R16 8 - 0x50400200, // 028E LDBOOL R16 1 0 - 0xA0000000, // 028F CLOSE R0 - 0x80042000, // 0290 RET 1 R16 - 0x7002001C, // 0291 JMP #02AF - 0x1C241108, // 0292 EQ R9 R8 K8 - 0x78260012, // 0293 JMPF R9 #02A7 - 0x8C240507, // 0294 GETMET R9 R2 K7 - 0x582C0006, // 0295 LDCONST R11 K6 - 0x7C240400, // 0296 CALL R9 2 - 0xB82A4400, // 0297 GETNGBL R10 K34 - 0x8C28152D, // 0298 GETMET R10 R10 K45 - 0x60300008, // 0299 GETGBL R12 G8 - 0x5C341200, // 029A MOVE R13 R9 - 0x7C300200, // 029B CALL R12 1 - 0x0032C40C, // 029C ADD R12 K98 R12 - 0x58340011, // 029D LDCONST R13 K17 - 0x7C280600, // 029E CALL R10 3 - 0x88280116, // 029F GETMBR R10 R0 K22 - 0x8C281563, // 02A0 GETMET R10 R10 K99 - 0x5C301200, // 02A1 MOVE R12 R9 - 0x7C280400, // 02A2 CALL R10 2 - 0x50280200, // 02A3 LDBOOL R10 1 0 - 0xA0000000, // 02A4 CLOSE R0 - 0x80041400, // 02A5 RET 1 R10 - 0x70020007, // 02A6 JMP #02AF - 0x1C24110F, // 02A7 EQ R9 R8 K15 - 0x78260005, // 02A8 JMPF R9 #02AF - 0x88240116, // 02A9 GETMBR R9 R0 K22 - 0x8C241364, // 02AA GETMET R9 R9 K100 - 0x7C240200, // 02AB CALL R9 1 - 0x50240200, // 02AC LDBOOL R9 1 0 - 0xA0000000, // 02AD CLOSE R0 - 0x80041200, // 02AE RET 1 R9 - 0x70020012, // 02AF JMP #02C3 - 0x54260029, // 02B0 LDINT R9 42 - 0x1C240E09, // 02B1 EQ R9 R7 R9 - 0x78260005, // 02B2 JMPF R9 #02B9 - 0x1C241106, // 02B3 EQ R9 R8 K6 - 0x78260002, // 02B4 JMPF R9 #02B8 - 0x50240200, // 02B5 LDBOOL R9 1 0 - 0xA0000000, // 02B6 CLOSE R0 - 0x80041200, // 02B7 RET 1 R9 - 0x70020009, // 02B8 JMP #02C3 - 0x60240003, // 02B9 GETGBL R9 G3 - 0x5C280000, // 02BA MOVE R10 R0 - 0x7C240200, // 02BB CALL R9 1 - 0x8C241365, // 02BC GETMET R9 R9 K101 - 0x5C2C0200, // 02BD MOVE R11 R1 - 0x5C300400, // 02BE MOVE R12 R2 - 0x5C340600, // 02BF MOVE R13 R3 - 0x7C240800, // 02C0 CALL R9 4 - 0xA0000000, // 02C1 CLOSE R0 - 0x80041200, // 02C2 RET 1 R9 - 0xA0000000, // 02C3 CLOSE R0 - 0x80000000, // 02C4 RET 0 + 0x8C5C035F, // 028A GETMET R23 R1 K95 + 0x7C5C0200, // 028B CALL R23 1 + 0x7C3C1000, // 028C CALL R15 8 + 0x503C0200, // 028D LDBOOL R15 1 0 + 0xA0000000, // 028E CLOSE R0 + 0x80041E00, // 028F RET 1 R15 + 0x7002001C, // 0290 JMP #02AE + 0x1C200F07, // 0291 EQ R8 R7 K7 + 0x78220012, // 0292 JMPF R8 #02A6 + 0x8C200506, // 0293 GETMET R8 R2 K6 + 0x58280005, // 0294 LDCONST R10 K5 + 0x7C200400, // 0295 CALL R8 2 + 0xB8264200, // 0296 GETNGBL R9 K33 + 0x8C24132C, // 0297 GETMET R9 R9 K44 + 0x602C0008, // 0298 GETGBL R11 G8 + 0x5C301000, // 0299 MOVE R12 R8 + 0x7C2C0200, // 029A CALL R11 1 + 0x002EC00B, // 029B ADD R11 K96 R11 + 0x58300010, // 029C LDCONST R12 K16 + 0x7C240600, // 029D CALL R9 3 + 0x88240115, // 029E GETMBR R9 R0 K21 + 0x8C241361, // 029F GETMET R9 R9 K97 + 0x5C2C1000, // 02A0 MOVE R11 R8 + 0x7C240400, // 02A1 CALL R9 2 + 0x50240200, // 02A2 LDBOOL R9 1 0 + 0xA0000000, // 02A3 CLOSE R0 + 0x80041200, // 02A4 RET 1 R9 + 0x70020007, // 02A5 JMP #02AE + 0x1C200F0E, // 02A6 EQ R8 R7 K14 + 0x78220005, // 02A7 JMPF R8 #02AE + 0x88200115, // 02A8 GETMBR R8 R0 K21 + 0x8C201162, // 02A9 GETMET R8 R8 K98 + 0x7C200200, // 02AA CALL R8 1 + 0x50200200, // 02AB LDBOOL R8 1 0 + 0xA0000000, // 02AC CLOSE R0 + 0x80041000, // 02AD RET 1 R8 + 0x70020012, // 02AE JMP #02C2 + 0x54220029, // 02AF LDINT R8 42 + 0x1C200C08, // 02B0 EQ R8 R6 R8 + 0x78220005, // 02B1 JMPF R8 #02B8 + 0x1C200F05, // 02B2 EQ R8 R7 K5 + 0x78220002, // 02B3 JMPF R8 #02B7 + 0x50200200, // 02B4 LDBOOL R8 1 0 + 0xA0000000, // 02B5 CLOSE R0 + 0x80041000, // 02B6 RET 1 R8 + 0x70020009, // 02B7 JMP #02C2 + 0x60200003, // 02B8 GETGBL R8 G3 + 0x5C240000, // 02B9 MOVE R9 R0 + 0x7C200200, // 02BA CALL R8 1 + 0x8C201163, // 02BB GETMET R8 R8 K99 + 0x5C280200, // 02BC MOVE R10 R1 + 0x5C2C0400, // 02BD MOVE R11 R2 + 0x5C300600, // 02BE MOVE R12 R3 + 0x7C200800, // 02BF CALL R8 4 + 0xA0000000, // 02C0 CLOSE R0 + 0x80041000, // 02C1 RET 1 R8 + 0xA0000000, // 02C2 CLOSE R0 + 0x80000000, // 02C3 RET 0 }) ) ); @@ -1873,7 +1870,7 @@ be_local_closure(Matter_Plugin_Root_read_attribute, /* name */ ********************************************************************/ be_local_closure(Matter_Plugin_Root_write_attribute, /* name */ be_nested_proto( - 12, /* nstack */ + 11, /* nstack */ 4, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -1881,126 +1878,124 @@ be_local_closure(Matter_Plugin_Root_write_attribute, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[14]) { /* constants */ - /* K0 */ be_nested_str_weak(string), - /* K1 */ be_nested_str_weak(matter), - /* K2 */ be_nested_str_weak(TLV), - /* K3 */ be_nested_str_weak(cluster), - /* K4 */ be_nested_str_weak(attribute), - /* K5 */ be_const_int(0), - /* K6 */ be_nested_str_weak(int), - /* K7 */ be_nested_str_weak(int64), - /* K8 */ be_nested_str_weak(_breadcrumb), - /* K9 */ be_nested_str_weak(attribute_updated), - /* K10 */ be_nested_str_weak(status), - /* K11 */ be_nested_str_weak(CONSTRAINT_ERROR), - /* K12 */ be_const_int(1), - /* K13 */ be_nested_str_weak(INVALID_ACTION), + ( &(const bvalue[13]) { /* constants */ + /* K0 */ be_nested_str_weak(matter), + /* K1 */ be_nested_str_weak(TLV), + /* K2 */ be_nested_str_weak(cluster), + /* K3 */ be_nested_str_weak(attribute), + /* K4 */ be_const_int(0), + /* K5 */ be_nested_str_weak(int), + /* K6 */ be_nested_str_weak(int64), + /* K7 */ be_nested_str_weak(_breadcrumb), + /* K8 */ be_nested_str_weak(attribute_updated), + /* K9 */ be_nested_str_weak(status), + /* K10 */ be_nested_str_weak(CONSTRAINT_ERROR), + /* K11 */ be_const_int(1), + /* K12 */ be_nested_str_weak(INVALID_ACTION), }), be_str_weak(write_attribute), &be_const_str_solidified, - ( &(const binstruction[101]) { /* code */ - 0xA4120000, // 0000 IMPORT R4 K0 - 0xB8160200, // 0001 GETNGBL R5 K1 - 0x88140B02, // 0002 GETMBR R5 R5 K2 + ( &(const binstruction[100]) { /* code */ + 0xB8120000, // 0000 GETNGBL R4 K0 + 0x88100901, // 0001 GETMBR R4 R4 K1 + 0x88140502, // 0002 GETMBR R5 R2 K2 0x88180503, // 0003 GETMBR R6 R2 K3 - 0x881C0504, // 0004 GETMBR R7 R2 K4 - 0x5422002F, // 0005 LDINT R8 48 - 0x1C200C08, // 0006 EQ R8 R6 R8 - 0x78220019, // 0007 JMPF R8 #0022 - 0x1C200F05, // 0008 EQ R8 R7 K5 - 0x78220016, // 0009 JMPF R8 #0021 - 0x60200004, // 000A GETGBL R8 G4 - 0x5C240600, // 000B MOVE R9 R3 - 0x7C200200, // 000C CALL R8 1 - 0x1C201106, // 000D EQ R8 R8 K6 - 0x74220004, // 000E JMPT R8 #0014 - 0x6020000F, // 000F GETGBL R8 G15 - 0x5C240600, // 0010 MOVE R9 R3 - 0xB82A0E00, // 0011 GETNGBL R10 K7 - 0x7C200400, // 0012 CALL R8 2 - 0x78220007, // 0013 JMPF R8 #001C - 0x90061003, // 0014 SETMBR R1 K8 R3 - 0x8C200109, // 0015 GETMET R8 R0 K9 + 0x541E002F, // 0004 LDINT R7 48 + 0x1C1C0A07, // 0005 EQ R7 R5 R7 + 0x781E0019, // 0006 JMPF R7 #0021 + 0x1C1C0D04, // 0007 EQ R7 R6 K4 + 0x781E0016, // 0008 JMPF R7 #0020 + 0x601C0004, // 0009 GETGBL R7 G4 + 0x5C200600, // 000A MOVE R8 R3 + 0x7C1C0200, // 000B CALL R7 1 + 0x1C1C0F05, // 000C EQ R7 R7 K5 + 0x741E0004, // 000D JMPT R7 #0013 + 0x601C000F, // 000E GETGBL R7 G15 + 0x5C200600, // 000F MOVE R8 R3 + 0xB8260C00, // 0010 GETNGBL R9 K6 + 0x7C1C0400, // 0011 CALL R7 2 + 0x781E0007, // 0012 JMPF R7 #001B + 0x90060E03, // 0013 SETMBR R1 K7 R3 + 0x8C1C0108, // 0014 GETMET R7 R0 K8 + 0x88240502, // 0015 GETMBR R9 R2 K2 0x88280503, // 0016 GETMBR R10 R2 K3 - 0x882C0504, // 0017 GETMBR R11 R2 K4 - 0x7C200600, // 0018 CALL R8 3 - 0x50200200, // 0019 LDBOOL R8 1 0 - 0x80041000, // 001A RET 1 R8 - 0x70020004, // 001B JMP #0021 - 0xB8220200, // 001C GETNGBL R8 K1 - 0x8820110B, // 001D GETMBR R8 R8 K11 - 0x900A1408, // 001E SETMBR R2 K10 R8 - 0x50200000, // 001F LDBOOL R8 0 0 - 0x80041000, // 0020 RET 1 R8 - 0x70020041, // 0021 JMP #0064 - 0x5422001E, // 0022 LDINT R8 31 - 0x1C200C08, // 0023 EQ R8 R6 R8 - 0x78220004, // 0024 JMPF R8 #002A - 0x1C200F05, // 0025 EQ R8 R7 K5 - 0x78220001, // 0026 JMPF R8 #0029 - 0x50200200, // 0027 LDBOOL R8 1 0 - 0x80041000, // 0028 RET 1 R8 - 0x70020039, // 0029 JMP #0064 - 0x54220027, // 002A LDINT R8 40 - 0x1C200C08, // 002B EQ R8 R6 R8 - 0x7822000B, // 002C JMPF R8 #0039 - 0x54220004, // 002D LDINT R8 5 - 0x1C200E08, // 002E EQ R8 R7 R8 - 0x78220002, // 002F JMPF R8 #0033 - 0x50200200, // 0030 LDBOOL R8 1 0 - 0x80041000, // 0031 RET 1 R8 - 0x70020004, // 0032 JMP #0038 - 0x54220005, // 0033 LDINT R8 6 - 0x1C200E08, // 0034 EQ R8 R7 R8 - 0x78220001, // 0035 JMPF R8 #0038 - 0x50200200, // 0036 LDBOOL R8 1 0 - 0x80041000, // 0037 RET 1 R8 - 0x7002002A, // 0038 JMP #0064 - 0x54220029, // 0039 LDINT R8 42 - 0x1C200C08, // 003A EQ R8 R6 R8 - 0x78220004, // 003B JMPF R8 #0041 - 0x1C200F05, // 003C EQ R8 R7 K5 - 0x78220001, // 003D JMPF R8 #0040 - 0x50200200, // 003E LDBOOL R8 1 0 - 0x80041000, // 003F RET 1 R8 - 0x70020022, // 0040 JMP #0064 - 0x5422002A, // 0041 LDINT R8 43 - 0x1C200C08, // 0042 EQ R8 R6 R8 - 0x78220007, // 0043 JMPF R8 #004C - 0x1C200F05, // 0044 EQ R8 R7 K5 - 0x78220004, // 0045 JMPF R8 #004B - 0xB8220200, // 0046 GETNGBL R8 K1 - 0x8820110B, // 0047 GETMBR R8 R8 K11 - 0x900A1408, // 0048 SETMBR R2 K10 R8 - 0x50200000, // 0049 LDBOOL R8 0 0 - 0x80041000, // 004A RET 1 R8 - 0x70020017, // 004B JMP #0064 - 0x5422002B, // 004C LDINT R8 44 - 0x1C200C08, // 004D EQ R8 R6 R8 - 0x78220009, // 004E JMPF R8 #0059 - 0x1C200F05, // 004F EQ R8 R7 K5 - 0x78220002, // 0050 JMPF R8 #0054 - 0x50200200, // 0051 LDBOOL R8 1 0 - 0x80041000, // 0052 RET 1 R8 - 0x70020003, // 0053 JMP #0058 - 0x1C200F0C, // 0054 EQ R8 R7 K12 - 0x78220001, // 0055 JMPF R8 #0058 - 0x50200200, // 0056 LDBOOL R8 1 0 - 0x80041000, // 0057 RET 1 R8 - 0x7002000A, // 0058 JMP #0064 - 0x54220030, // 0059 LDINT R8 49 - 0x1C200C08, // 005A EQ R8 R6 R8 - 0x78220007, // 005B JMPF R8 #0064 - 0x54220003, // 005C LDINT R8 4 - 0x1C200E08, // 005D EQ R8 R7 R8 - 0x78220004, // 005E JMPF R8 #0064 - 0xB8220200, // 005F GETNGBL R8 K1 - 0x8820110D, // 0060 GETMBR R8 R8 K13 - 0x900A1408, // 0061 SETMBR R2 K10 R8 - 0x50200000, // 0062 LDBOOL R8 0 0 - 0x80041000, // 0063 RET 1 R8 - 0x80000000, // 0064 RET 0 + 0x7C1C0600, // 0017 CALL R7 3 + 0x501C0200, // 0018 LDBOOL R7 1 0 + 0x80040E00, // 0019 RET 1 R7 + 0x70020004, // 001A JMP #0020 + 0xB81E0000, // 001B GETNGBL R7 K0 + 0x881C0F0A, // 001C GETMBR R7 R7 K10 + 0x900A1207, // 001D SETMBR R2 K9 R7 + 0x501C0000, // 001E LDBOOL R7 0 0 + 0x80040E00, // 001F RET 1 R7 + 0x70020041, // 0020 JMP #0063 + 0x541E001E, // 0021 LDINT R7 31 + 0x1C1C0A07, // 0022 EQ R7 R5 R7 + 0x781E0004, // 0023 JMPF R7 #0029 + 0x1C1C0D04, // 0024 EQ R7 R6 K4 + 0x781E0001, // 0025 JMPF R7 #0028 + 0x501C0200, // 0026 LDBOOL R7 1 0 + 0x80040E00, // 0027 RET 1 R7 + 0x70020039, // 0028 JMP #0063 + 0x541E0027, // 0029 LDINT R7 40 + 0x1C1C0A07, // 002A EQ R7 R5 R7 + 0x781E000B, // 002B JMPF R7 #0038 + 0x541E0004, // 002C LDINT R7 5 + 0x1C1C0C07, // 002D EQ R7 R6 R7 + 0x781E0002, // 002E JMPF R7 #0032 + 0x501C0200, // 002F LDBOOL R7 1 0 + 0x80040E00, // 0030 RET 1 R7 + 0x70020004, // 0031 JMP #0037 + 0x541E0005, // 0032 LDINT R7 6 + 0x1C1C0C07, // 0033 EQ R7 R6 R7 + 0x781E0001, // 0034 JMPF R7 #0037 + 0x501C0200, // 0035 LDBOOL R7 1 0 + 0x80040E00, // 0036 RET 1 R7 + 0x7002002A, // 0037 JMP #0063 + 0x541E0029, // 0038 LDINT R7 42 + 0x1C1C0A07, // 0039 EQ R7 R5 R7 + 0x781E0004, // 003A JMPF R7 #0040 + 0x1C1C0D04, // 003B EQ R7 R6 K4 + 0x781E0001, // 003C JMPF R7 #003F + 0x501C0200, // 003D LDBOOL R7 1 0 + 0x80040E00, // 003E RET 1 R7 + 0x70020022, // 003F JMP #0063 + 0x541E002A, // 0040 LDINT R7 43 + 0x1C1C0A07, // 0041 EQ R7 R5 R7 + 0x781E0007, // 0042 JMPF R7 #004B + 0x1C1C0D04, // 0043 EQ R7 R6 K4 + 0x781E0004, // 0044 JMPF R7 #004A + 0xB81E0000, // 0045 GETNGBL R7 K0 + 0x881C0F0A, // 0046 GETMBR R7 R7 K10 + 0x900A1207, // 0047 SETMBR R2 K9 R7 + 0x501C0000, // 0048 LDBOOL R7 0 0 + 0x80040E00, // 0049 RET 1 R7 + 0x70020017, // 004A JMP #0063 + 0x541E002B, // 004B LDINT R7 44 + 0x1C1C0A07, // 004C EQ R7 R5 R7 + 0x781E0009, // 004D JMPF R7 #0058 + 0x1C1C0D04, // 004E EQ R7 R6 K4 + 0x781E0002, // 004F JMPF R7 #0053 + 0x501C0200, // 0050 LDBOOL R7 1 0 + 0x80040E00, // 0051 RET 1 R7 + 0x70020003, // 0052 JMP #0057 + 0x1C1C0D0B, // 0053 EQ R7 R6 K11 + 0x781E0001, // 0054 JMPF R7 #0057 + 0x501C0200, // 0055 LDBOOL R7 1 0 + 0x80040E00, // 0056 RET 1 R7 + 0x7002000A, // 0057 JMP #0063 + 0x541E0030, // 0058 LDINT R7 49 + 0x1C1C0A07, // 0059 EQ R7 R5 R7 + 0x781E0007, // 005A JMPF R7 #0063 + 0x541E0003, // 005B LDINT R7 4 + 0x1C1C0C07, // 005C EQ R7 R6 R7 + 0x781E0004, // 005D JMPF R7 #0063 + 0xB81E0000, // 005E GETNGBL R7 K0 + 0x881C0F0C, // 005F GETMBR R7 R7 K12 + 0x900A1207, // 0060 SETMBR R2 K9 R7 + 0x501C0000, // 0061 LDBOOL R7 0 0 + 0x80040E00, // 0062 RET 1 R7 + 0x80000000, // 0063 RET 0 }) ) ); diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor_Contact.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor_Contact.h index 7ef3173cd..7587e80b6 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor_Contact.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor_Contact.h @@ -79,7 +79,7 @@ be_local_closure(Matter_Plugin_Sensor_Contact_parse_configuration, /* name */ ********************************************************************/ be_local_closure(Matter_Plugin_Sensor_Contact_read_attribute, /* name */ be_nested_proto( - 11, /* nstack */ + 10, /* nstack */ 3, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -87,77 +87,75 @@ be_local_closure(Matter_Plugin_Sensor_Contact_read_attribute, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[13]) { /* constants */ - /* K0 */ be_nested_str_weak(string), - /* K1 */ be_nested_str_weak(matter), - /* K2 */ be_nested_str_weak(TLV), - /* K3 */ be_nested_str_weak(cluster), - /* K4 */ be_nested_str_weak(attribute), - /* K5 */ be_const_int(0), - /* K6 */ be_nested_str_weak(shadow_contact), - /* K7 */ be_nested_str_weak(create_TLV), - /* K8 */ be_nested_str_weak(BOOL), - /* K9 */ be_nested_str_weak(NULL), - /* K10 */ be_nested_str_weak(U4), - /* K11 */ be_const_int(1), - /* K12 */ be_nested_str_weak(read_attribute), + ( &(const bvalue[12]) { /* constants */ + /* K0 */ be_nested_str_weak(matter), + /* K1 */ be_nested_str_weak(TLV), + /* K2 */ be_nested_str_weak(cluster), + /* K3 */ be_nested_str_weak(attribute), + /* K4 */ be_const_int(0), + /* K5 */ be_nested_str_weak(shadow_contact), + /* K6 */ be_nested_str_weak(create_TLV), + /* K7 */ be_nested_str_weak(BOOL), + /* K8 */ be_nested_str_weak(NULL), + /* K9 */ be_nested_str_weak(U4), + /* K10 */ be_const_int(1), + /* K11 */ be_nested_str_weak(read_attribute), }), be_str_weak(read_attribute), &be_const_str_solidified, - ( &(const binstruction[53]) { /* code */ - 0xA40E0000, // 0000 IMPORT R3 K0 - 0xB8120200, // 0001 GETNGBL R4 K1 - 0x88100902, // 0002 GETMBR R4 R4 K2 + ( &(const binstruction[52]) { /* code */ + 0xB80E0000, // 0000 GETNGBL R3 K0 + 0x880C0701, // 0001 GETMBR R3 R3 K1 + 0x88100502, // 0002 GETMBR R4 R2 K2 0x88140503, // 0003 GETMBR R5 R2 K3 - 0x88180504, // 0004 GETMBR R6 R2 K4 - 0x541E0044, // 0005 LDINT R7 69 - 0x1C1C0A07, // 0006 EQ R7 R5 R7 - 0x781E0023, // 0007 JMPF R7 #002C - 0x1C1C0D05, // 0008 EQ R7 R6 K5 - 0x781E000F, // 0009 JMPF R7 #001A - 0x881C0106, // 000A GETMBR R7 R0 K6 - 0x4C200000, // 000B LDNIL R8 - 0x201C0E08, // 000C NE R7 R7 R8 - 0x781E0005, // 000D JMPF R7 #0014 - 0x8C1C0907, // 000E GETMET R7 R4 K7 - 0x88240908, // 000F GETMBR R9 R4 K8 - 0x88280106, // 0010 GETMBR R10 R0 K6 - 0x7C1C0600, // 0011 CALL R7 3 - 0x80040E00, // 0012 RET 1 R7 - 0x70020004, // 0013 JMP #0019 - 0x8C1C0907, // 0014 GETMET R7 R4 K7 - 0x88240909, // 0015 GETMBR R9 R4 K9 - 0x4C280000, // 0016 LDNIL R10 - 0x7C1C0600, // 0017 CALL R7 3 - 0x80040E00, // 0018 RET 1 R7 - 0x70020010, // 0019 JMP #002B - 0x541EFFFB, // 001A LDINT R7 65532 - 0x1C1C0C07, // 001B EQ R7 R6 R7 - 0x781E0005, // 001C JMPF R7 #0023 - 0x8C1C0907, // 001D GETMET R7 R4 K7 - 0x8824090A, // 001E GETMBR R9 R4 K10 - 0x58280005, // 001F LDCONST R10 K5 - 0x7C1C0600, // 0020 CALL R7 3 - 0x80040E00, // 0021 RET 1 R7 - 0x70020007, // 0022 JMP #002B - 0x541EFFFC, // 0023 LDINT R7 65533 - 0x1C1C0C07, // 0024 EQ R7 R6 R7 - 0x781E0004, // 0025 JMPF R7 #002B - 0x8C1C0907, // 0026 GETMET R7 R4 K7 - 0x8824090A, // 0027 GETMBR R9 R4 K10 - 0x5828000B, // 0028 LDCONST R10 K11 - 0x7C1C0600, // 0029 CALL R7 3 - 0x80040E00, // 002A RET 1 R7 - 0x70020007, // 002B JMP #0034 - 0x601C0003, // 002C GETGBL R7 G3 - 0x5C200000, // 002D MOVE R8 R0 - 0x7C1C0200, // 002E CALL R7 1 - 0x8C1C0F0C, // 002F GETMET R7 R7 K12 - 0x5C240200, // 0030 MOVE R9 R1 - 0x5C280400, // 0031 MOVE R10 R2 - 0x7C1C0600, // 0032 CALL R7 3 - 0x80040E00, // 0033 RET 1 R7 - 0x80000000, // 0034 RET 0 + 0x541A0044, // 0004 LDINT R6 69 + 0x1C180806, // 0005 EQ R6 R4 R6 + 0x781A0023, // 0006 JMPF R6 #002B + 0x1C180B04, // 0007 EQ R6 R5 K4 + 0x781A000F, // 0008 JMPF R6 #0019 + 0x88180105, // 0009 GETMBR R6 R0 K5 + 0x4C1C0000, // 000A LDNIL R7 + 0x20180C07, // 000B NE R6 R6 R7 + 0x781A0005, // 000C JMPF R6 #0013 + 0x8C180706, // 000D GETMET R6 R3 K6 + 0x88200707, // 000E GETMBR R8 R3 K7 + 0x88240105, // 000F GETMBR R9 R0 K5 + 0x7C180600, // 0010 CALL R6 3 + 0x80040C00, // 0011 RET 1 R6 + 0x70020004, // 0012 JMP #0018 + 0x8C180706, // 0013 GETMET R6 R3 K6 + 0x88200708, // 0014 GETMBR R8 R3 K8 + 0x4C240000, // 0015 LDNIL R9 + 0x7C180600, // 0016 CALL R6 3 + 0x80040C00, // 0017 RET 1 R6 + 0x70020010, // 0018 JMP #002A + 0x541AFFFB, // 0019 LDINT R6 65532 + 0x1C180A06, // 001A EQ R6 R5 R6 + 0x781A0005, // 001B JMPF R6 #0022 + 0x8C180706, // 001C GETMET R6 R3 K6 + 0x88200709, // 001D GETMBR R8 R3 K9 + 0x58240004, // 001E LDCONST R9 K4 + 0x7C180600, // 001F CALL R6 3 + 0x80040C00, // 0020 RET 1 R6 + 0x70020007, // 0021 JMP #002A + 0x541AFFFC, // 0022 LDINT R6 65533 + 0x1C180A06, // 0023 EQ R6 R5 R6 + 0x781A0004, // 0024 JMPF R6 #002A + 0x8C180706, // 0025 GETMET R6 R3 K6 + 0x88200709, // 0026 GETMBR R8 R3 K9 + 0x5824000A, // 0027 LDCONST R9 K10 + 0x7C180600, // 0028 CALL R6 3 + 0x80040C00, // 0029 RET 1 R6 + 0x70020007, // 002A JMP #0033 + 0x60180003, // 002B GETGBL R6 G3 + 0x5C1C0000, // 002C MOVE R7 R0 + 0x7C180200, // 002D CALL R6 1 + 0x8C180D0B, // 002E GETMET R6 R6 K11 + 0x5C200200, // 002F MOVE R8 R1 + 0x5C240400, // 0030 MOVE R9 R2 + 0x7C180600, // 0031 CALL R6 3 + 0x80040C00, // 0032 RET 1 R6 + 0x80000000, // 0033 RET 0 }) ) ); diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor_Humidity.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor_Humidity.h index 179384ac0..3cb1f9110 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor_Humidity.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor_Humidity.h @@ -11,7 +11,7 @@ extern const bclass be_class_Matter_Plugin_Sensor_Humidity; ********************************************************************/ be_local_closure(Matter_Plugin_Sensor_Humidity_read_attribute, /* name */ be_nested_proto( - 12, /* nstack */ + 11, /* nstack */ 3, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -19,97 +19,95 @@ be_local_closure(Matter_Plugin_Sensor_Humidity_read_attribute, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[15]) { /* constants */ - /* K0 */ be_nested_str_weak(string), - /* K1 */ be_nested_str_weak(matter), - /* K2 */ be_nested_str_weak(TLV), - /* K3 */ be_nested_str_weak(cluster), - /* K4 */ be_nested_str_weak(attribute), - /* K5 */ be_const_int(0), - /* K6 */ be_nested_str_weak(shadow_value), - /* K7 */ be_nested_str_weak(create_TLV), - /* K8 */ be_nested_str_weak(U2), - /* K9 */ be_nested_str_weak(NULL), - /* K10 */ be_const_int(1), - /* K11 */ be_const_int(2), - /* K12 */ be_nested_str_weak(U4), - /* K13 */ be_const_int(3), - /* K14 */ be_nested_str_weak(read_attribute), + ( &(const bvalue[14]) { /* constants */ + /* K0 */ be_nested_str_weak(matter), + /* K1 */ be_nested_str_weak(TLV), + /* K2 */ be_nested_str_weak(cluster), + /* K3 */ be_nested_str_weak(attribute), + /* K4 */ be_const_int(0), + /* K5 */ be_nested_str_weak(shadow_value), + /* K6 */ be_nested_str_weak(create_TLV), + /* K7 */ be_nested_str_weak(U2), + /* K8 */ be_nested_str_weak(NULL), + /* K9 */ be_const_int(1), + /* K10 */ be_const_int(2), + /* K11 */ be_nested_str_weak(U4), + /* K12 */ be_const_int(3), + /* K13 */ be_nested_str_weak(read_attribute), }), be_str_weak(read_attribute), &be_const_str_solidified, - ( &(const binstruction[71]) { /* code */ - 0xA40E0000, // 0000 IMPORT R3 K0 - 0xB8120200, // 0001 GETNGBL R4 K1 - 0x88100902, // 0002 GETMBR R4 R4 K2 + ( &(const binstruction[70]) { /* code */ + 0xB80E0000, // 0000 GETNGBL R3 K0 + 0x880C0701, // 0001 GETMBR R3 R3 K1 + 0x88100502, // 0002 GETMBR R4 R2 K2 0x88140503, // 0003 GETMBR R5 R2 K3 - 0x88180504, // 0004 GETMBR R6 R2 K4 - 0x541E0404, // 0005 LDINT R7 1029 - 0x1C1C0A07, // 0006 EQ R7 R5 R7 - 0x781E0035, // 0007 JMPF R7 #003E - 0x1C1C0D05, // 0008 EQ R7 R6 K5 - 0x781E0011, // 0009 JMPF R7 #001C - 0x881C0106, // 000A GETMBR R7 R0 K6 - 0x4C200000, // 000B LDNIL R8 - 0x201C0E08, // 000C NE R7 R7 R8 - 0x781E0007, // 000D JMPF R7 #0016 - 0x8C1C0907, // 000E GETMET R7 R4 K7 - 0x88240908, // 000F GETMBR R9 R4 K8 - 0x60280009, // 0010 GETGBL R10 G9 - 0x882C0106, // 0011 GETMBR R11 R0 K6 - 0x7C280200, // 0012 CALL R10 1 - 0x7C1C0600, // 0013 CALL R7 3 - 0x80040E00, // 0014 RET 1 R7 - 0x70020004, // 0015 JMP #001B - 0x8C1C0907, // 0016 GETMET R7 R4 K7 - 0x88240909, // 0017 GETMBR R9 R4 K9 - 0x4C280000, // 0018 LDNIL R10 - 0x7C1C0600, // 0019 CALL R7 3 - 0x80040E00, // 001A RET 1 R7 - 0x70020020, // 001B JMP #003D - 0x1C1C0D0A, // 001C EQ R7 R6 K10 - 0x781E0005, // 001D JMPF R7 #0024 - 0x8C1C0907, // 001E GETMET R7 R4 K7 - 0x88240908, // 001F GETMBR R9 R4 K8 - 0x542A01F3, // 0020 LDINT R10 500 - 0x7C1C0600, // 0021 CALL R7 3 - 0x80040E00, // 0022 RET 1 R7 - 0x70020018, // 0023 JMP #003D - 0x1C1C0D0B, // 0024 EQ R7 R6 K11 - 0x781E0005, // 0025 JMPF R7 #002C - 0x8C1C0907, // 0026 GETMET R7 R4 K7 - 0x88240908, // 0027 GETMBR R9 R4 K8 - 0x542A270F, // 0028 LDINT R10 10000 - 0x7C1C0600, // 0029 CALL R7 3 - 0x80040E00, // 002A RET 1 R7 - 0x70020010, // 002B JMP #003D - 0x541EFFFB, // 002C LDINT R7 65532 - 0x1C1C0C07, // 002D EQ R7 R6 R7 - 0x781E0005, // 002E JMPF R7 #0035 - 0x8C1C0907, // 002F GETMET R7 R4 K7 - 0x8824090C, // 0030 GETMBR R9 R4 K12 - 0x58280005, // 0031 LDCONST R10 K5 - 0x7C1C0600, // 0032 CALL R7 3 - 0x80040E00, // 0033 RET 1 R7 - 0x70020007, // 0034 JMP #003D - 0x541EFFFC, // 0035 LDINT R7 65533 - 0x1C1C0C07, // 0036 EQ R7 R6 R7 - 0x781E0004, // 0037 JMPF R7 #003D - 0x8C1C0907, // 0038 GETMET R7 R4 K7 - 0x8824090C, // 0039 GETMBR R9 R4 K12 - 0x5828000D, // 003A LDCONST R10 K13 - 0x7C1C0600, // 003B CALL R7 3 - 0x80040E00, // 003C RET 1 R7 - 0x70020007, // 003D JMP #0046 - 0x601C0003, // 003E GETGBL R7 G3 - 0x5C200000, // 003F MOVE R8 R0 - 0x7C1C0200, // 0040 CALL R7 1 - 0x8C1C0F0E, // 0041 GETMET R7 R7 K14 - 0x5C240200, // 0042 MOVE R9 R1 - 0x5C280400, // 0043 MOVE R10 R2 - 0x7C1C0600, // 0044 CALL R7 3 - 0x80040E00, // 0045 RET 1 R7 - 0x80000000, // 0046 RET 0 + 0x541A0404, // 0004 LDINT R6 1029 + 0x1C180806, // 0005 EQ R6 R4 R6 + 0x781A0035, // 0006 JMPF R6 #003D + 0x1C180B04, // 0007 EQ R6 R5 K4 + 0x781A0011, // 0008 JMPF R6 #001B + 0x88180105, // 0009 GETMBR R6 R0 K5 + 0x4C1C0000, // 000A LDNIL R7 + 0x20180C07, // 000B NE R6 R6 R7 + 0x781A0007, // 000C JMPF R6 #0015 + 0x8C180706, // 000D GETMET R6 R3 K6 + 0x88200707, // 000E GETMBR R8 R3 K7 + 0x60240009, // 000F GETGBL R9 G9 + 0x88280105, // 0010 GETMBR R10 R0 K5 + 0x7C240200, // 0011 CALL R9 1 + 0x7C180600, // 0012 CALL R6 3 + 0x80040C00, // 0013 RET 1 R6 + 0x70020004, // 0014 JMP #001A + 0x8C180706, // 0015 GETMET R6 R3 K6 + 0x88200708, // 0016 GETMBR R8 R3 K8 + 0x4C240000, // 0017 LDNIL R9 + 0x7C180600, // 0018 CALL R6 3 + 0x80040C00, // 0019 RET 1 R6 + 0x70020020, // 001A JMP #003C + 0x1C180B09, // 001B EQ R6 R5 K9 + 0x781A0005, // 001C JMPF R6 #0023 + 0x8C180706, // 001D GETMET R6 R3 K6 + 0x88200707, // 001E GETMBR R8 R3 K7 + 0x542601F3, // 001F LDINT R9 500 + 0x7C180600, // 0020 CALL R6 3 + 0x80040C00, // 0021 RET 1 R6 + 0x70020018, // 0022 JMP #003C + 0x1C180B0A, // 0023 EQ R6 R5 K10 + 0x781A0005, // 0024 JMPF R6 #002B + 0x8C180706, // 0025 GETMET R6 R3 K6 + 0x88200707, // 0026 GETMBR R8 R3 K7 + 0x5426270F, // 0027 LDINT R9 10000 + 0x7C180600, // 0028 CALL R6 3 + 0x80040C00, // 0029 RET 1 R6 + 0x70020010, // 002A JMP #003C + 0x541AFFFB, // 002B LDINT R6 65532 + 0x1C180A06, // 002C EQ R6 R5 R6 + 0x781A0005, // 002D JMPF R6 #0034 + 0x8C180706, // 002E GETMET R6 R3 K6 + 0x8820070B, // 002F GETMBR R8 R3 K11 + 0x58240004, // 0030 LDCONST R9 K4 + 0x7C180600, // 0031 CALL R6 3 + 0x80040C00, // 0032 RET 1 R6 + 0x70020007, // 0033 JMP #003C + 0x541AFFFC, // 0034 LDINT R6 65533 + 0x1C180A06, // 0035 EQ R6 R5 R6 + 0x781A0004, // 0036 JMPF R6 #003C + 0x8C180706, // 0037 GETMET R6 R3 K6 + 0x8820070B, // 0038 GETMBR R8 R3 K11 + 0x5824000C, // 0039 LDCONST R9 K12 + 0x7C180600, // 003A CALL R6 3 + 0x80040C00, // 003B RET 1 R6 + 0x70020007, // 003C JMP #0045 + 0x60180003, // 003D GETGBL R6 G3 + 0x5C1C0000, // 003E MOVE R7 R0 + 0x7C180200, // 003F CALL R6 1 + 0x8C180D0D, // 0040 GETMET R6 R6 K13 + 0x5C200200, // 0041 MOVE R8 R1 + 0x5C240400, // 0042 MOVE R9 R2 + 0x7C180600, // 0043 CALL R6 3 + 0x80040C00, // 0044 RET 1 R6 + 0x80000000, // 0045 RET 0 }) ) ); diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor_Illuminance.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor_Illuminance.h index 9a6a7c240..01b62792a 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor_Illuminance.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor_Illuminance.h @@ -11,7 +11,7 @@ extern const bclass be_class_Matter_Plugin_Sensor_Illuminance; ********************************************************************/ be_local_closure(Matter_Plugin_Sensor_Illuminance_read_attribute, /* name */ be_nested_proto( - 12, /* nstack */ + 11, /* nstack */ 3, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -19,97 +19,95 @@ be_local_closure(Matter_Plugin_Sensor_Illuminance_read_attribute, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[15]) { /* constants */ - /* K0 */ be_nested_str_weak(string), - /* K1 */ be_nested_str_weak(matter), - /* K2 */ be_nested_str_weak(TLV), - /* K3 */ be_nested_str_weak(cluster), - /* K4 */ be_nested_str_weak(attribute), - /* K5 */ be_const_int(0), - /* K6 */ be_nested_str_weak(shadow_value), - /* K7 */ be_nested_str_weak(create_TLV), - /* K8 */ be_nested_str_weak(U2), - /* K9 */ be_nested_str_weak(NULL), - /* K10 */ be_const_int(1), - /* K11 */ be_const_int(2), - /* K12 */ be_nested_str_weak(U4), - /* K13 */ be_const_int(3), - /* K14 */ be_nested_str_weak(read_attribute), + ( &(const bvalue[14]) { /* constants */ + /* K0 */ be_nested_str_weak(matter), + /* K1 */ be_nested_str_weak(TLV), + /* K2 */ be_nested_str_weak(cluster), + /* K3 */ be_nested_str_weak(attribute), + /* K4 */ be_const_int(0), + /* K5 */ be_nested_str_weak(shadow_value), + /* K6 */ be_nested_str_weak(create_TLV), + /* K7 */ be_nested_str_weak(U2), + /* K8 */ be_nested_str_weak(NULL), + /* K9 */ be_const_int(1), + /* K10 */ be_const_int(2), + /* K11 */ be_nested_str_weak(U4), + /* K12 */ be_const_int(3), + /* K13 */ be_nested_str_weak(read_attribute), }), be_str_weak(read_attribute), &be_const_str_solidified, - ( &(const binstruction[71]) { /* code */ - 0xA40E0000, // 0000 IMPORT R3 K0 - 0xB8120200, // 0001 GETNGBL R4 K1 - 0x88100902, // 0002 GETMBR R4 R4 K2 + ( &(const binstruction[70]) { /* code */ + 0xB80E0000, // 0000 GETNGBL R3 K0 + 0x880C0701, // 0001 GETMBR R3 R3 K1 + 0x88100502, // 0002 GETMBR R4 R2 K2 0x88140503, // 0003 GETMBR R5 R2 K3 - 0x88180504, // 0004 GETMBR R6 R2 K4 - 0x541E03FF, // 0005 LDINT R7 1024 - 0x1C1C0A07, // 0006 EQ R7 R5 R7 - 0x781E0035, // 0007 JMPF R7 #003E - 0x1C1C0D05, // 0008 EQ R7 R6 K5 - 0x781E0011, // 0009 JMPF R7 #001C - 0x881C0106, // 000A GETMBR R7 R0 K6 - 0x4C200000, // 000B LDNIL R8 - 0x201C0E08, // 000C NE R7 R7 R8 - 0x781E0007, // 000D JMPF R7 #0016 - 0x8C1C0907, // 000E GETMET R7 R4 K7 - 0x88240908, // 000F GETMBR R9 R4 K8 - 0x60280009, // 0010 GETGBL R10 G9 - 0x882C0106, // 0011 GETMBR R11 R0 K6 - 0x7C280200, // 0012 CALL R10 1 - 0x7C1C0600, // 0013 CALL R7 3 - 0x80040E00, // 0014 RET 1 R7 - 0x70020004, // 0015 JMP #001B - 0x8C1C0907, // 0016 GETMET R7 R4 K7 - 0x88240909, // 0017 GETMBR R9 R4 K9 - 0x4C280000, // 0018 LDNIL R10 - 0x7C1C0600, // 0019 CALL R7 3 - 0x80040E00, // 001A RET 1 R7 - 0x70020020, // 001B JMP #003D - 0x1C1C0D0A, // 001C EQ R7 R6 K10 - 0x781E0005, // 001D JMPF R7 #0024 - 0x8C1C0907, // 001E GETMET R7 R4 K7 - 0x88240908, // 001F GETMBR R9 R4 K8 - 0x5828000A, // 0020 LDCONST R10 K10 - 0x7C1C0600, // 0021 CALL R7 3 - 0x80040E00, // 0022 RET 1 R7 - 0x70020018, // 0023 JMP #003D - 0x1C1C0D0B, // 0024 EQ R7 R6 K11 - 0x781E0005, // 0025 JMPF R7 #002C - 0x8C1C0907, // 0026 GETMET R7 R4 K7 - 0x88240908, // 0027 GETMBR R9 R4 K8 - 0x542AFFFD, // 0028 LDINT R10 65534 - 0x7C1C0600, // 0029 CALL R7 3 - 0x80040E00, // 002A RET 1 R7 - 0x70020010, // 002B JMP #003D - 0x541EFFFB, // 002C LDINT R7 65532 - 0x1C1C0C07, // 002D EQ R7 R6 R7 - 0x781E0005, // 002E JMPF R7 #0035 - 0x8C1C0907, // 002F GETMET R7 R4 K7 - 0x8824090C, // 0030 GETMBR R9 R4 K12 - 0x58280005, // 0031 LDCONST R10 K5 - 0x7C1C0600, // 0032 CALL R7 3 - 0x80040E00, // 0033 RET 1 R7 - 0x70020007, // 0034 JMP #003D - 0x541EFFFC, // 0035 LDINT R7 65533 - 0x1C1C0C07, // 0036 EQ R7 R6 R7 - 0x781E0004, // 0037 JMPF R7 #003D - 0x8C1C0907, // 0038 GETMET R7 R4 K7 - 0x8824090C, // 0039 GETMBR R9 R4 K12 - 0x5828000D, // 003A LDCONST R10 K13 - 0x7C1C0600, // 003B CALL R7 3 - 0x80040E00, // 003C RET 1 R7 - 0x70020007, // 003D JMP #0046 - 0x601C0003, // 003E GETGBL R7 G3 - 0x5C200000, // 003F MOVE R8 R0 - 0x7C1C0200, // 0040 CALL R7 1 - 0x8C1C0F0E, // 0041 GETMET R7 R7 K14 - 0x5C240200, // 0042 MOVE R9 R1 - 0x5C280400, // 0043 MOVE R10 R2 - 0x7C1C0600, // 0044 CALL R7 3 - 0x80040E00, // 0045 RET 1 R7 - 0x80000000, // 0046 RET 0 + 0x541A03FF, // 0004 LDINT R6 1024 + 0x1C180806, // 0005 EQ R6 R4 R6 + 0x781A0035, // 0006 JMPF R6 #003D + 0x1C180B04, // 0007 EQ R6 R5 K4 + 0x781A0011, // 0008 JMPF R6 #001B + 0x88180105, // 0009 GETMBR R6 R0 K5 + 0x4C1C0000, // 000A LDNIL R7 + 0x20180C07, // 000B NE R6 R6 R7 + 0x781A0007, // 000C JMPF R6 #0015 + 0x8C180706, // 000D GETMET R6 R3 K6 + 0x88200707, // 000E GETMBR R8 R3 K7 + 0x60240009, // 000F GETGBL R9 G9 + 0x88280105, // 0010 GETMBR R10 R0 K5 + 0x7C240200, // 0011 CALL R9 1 + 0x7C180600, // 0012 CALL R6 3 + 0x80040C00, // 0013 RET 1 R6 + 0x70020004, // 0014 JMP #001A + 0x8C180706, // 0015 GETMET R6 R3 K6 + 0x88200708, // 0016 GETMBR R8 R3 K8 + 0x4C240000, // 0017 LDNIL R9 + 0x7C180600, // 0018 CALL R6 3 + 0x80040C00, // 0019 RET 1 R6 + 0x70020020, // 001A JMP #003C + 0x1C180B09, // 001B EQ R6 R5 K9 + 0x781A0005, // 001C JMPF R6 #0023 + 0x8C180706, // 001D GETMET R6 R3 K6 + 0x88200707, // 001E GETMBR R8 R3 K7 + 0x58240009, // 001F LDCONST R9 K9 + 0x7C180600, // 0020 CALL R6 3 + 0x80040C00, // 0021 RET 1 R6 + 0x70020018, // 0022 JMP #003C + 0x1C180B0A, // 0023 EQ R6 R5 K10 + 0x781A0005, // 0024 JMPF R6 #002B + 0x8C180706, // 0025 GETMET R6 R3 K6 + 0x88200707, // 0026 GETMBR R8 R3 K7 + 0x5426FFFD, // 0027 LDINT R9 65534 + 0x7C180600, // 0028 CALL R6 3 + 0x80040C00, // 0029 RET 1 R6 + 0x70020010, // 002A JMP #003C + 0x541AFFFB, // 002B LDINT R6 65532 + 0x1C180A06, // 002C EQ R6 R5 R6 + 0x781A0005, // 002D JMPF R6 #0034 + 0x8C180706, // 002E GETMET R6 R3 K6 + 0x8820070B, // 002F GETMBR R8 R3 K11 + 0x58240004, // 0030 LDCONST R9 K4 + 0x7C180600, // 0031 CALL R6 3 + 0x80040C00, // 0032 RET 1 R6 + 0x70020007, // 0033 JMP #003C + 0x541AFFFC, // 0034 LDINT R6 65533 + 0x1C180A06, // 0035 EQ R6 R5 R6 + 0x781A0004, // 0036 JMPF R6 #003C + 0x8C180706, // 0037 GETMET R6 R3 K6 + 0x8820070B, // 0038 GETMBR R8 R3 K11 + 0x5824000C, // 0039 LDCONST R9 K12 + 0x7C180600, // 003A CALL R6 3 + 0x80040C00, // 003B RET 1 R6 + 0x70020007, // 003C JMP #0045 + 0x60180003, // 003D GETGBL R6 G3 + 0x5C1C0000, // 003E MOVE R7 R0 + 0x7C180200, // 003F CALL R6 1 + 0x8C180D0D, // 0040 GETMET R6 R6 K13 + 0x5C200200, // 0041 MOVE R8 R1 + 0x5C240400, // 0042 MOVE R9 R2 + 0x7C180600, // 0043 CALL R6 3 + 0x80040C00, // 0044 RET 1 R6 + 0x80000000, // 0045 RET 0 }) ) ); diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor_Occupancy.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor_Occupancy.h index 6cdac12e9..812d0bde9 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor_Occupancy.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor_Occupancy.h @@ -79,7 +79,7 @@ be_local_closure(Matter_Plugin_Sensor_Occupancy_parse_configuration, /* name * ********************************************************************/ be_local_closure(Matter_Plugin_Sensor_Occupancy_read_attribute, /* name */ be_nested_proto( - 11, /* nstack */ + 10, /* nstack */ 3, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -87,95 +87,93 @@ be_local_closure(Matter_Plugin_Sensor_Occupancy_read_attribute, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[15]) { /* constants */ - /* K0 */ be_nested_str_weak(string), - /* K1 */ be_nested_str_weak(matter), - /* K2 */ be_nested_str_weak(TLV), - /* K3 */ be_nested_str_weak(cluster), - /* K4 */ be_nested_str_weak(attribute), - /* K5 */ be_const_int(0), - /* K6 */ be_nested_str_weak(shadow_occupancy), - /* K7 */ be_nested_str_weak(create_TLV), - /* K8 */ be_nested_str_weak(U1), - /* K9 */ be_nested_str_weak(NULL), - /* K10 */ be_const_int(1), - /* K11 */ be_const_int(3), - /* K12 */ be_const_int(2), - /* K13 */ be_nested_str_weak(U4), - /* K14 */ be_nested_str_weak(read_attribute), + ( &(const bvalue[14]) { /* constants */ + /* K0 */ be_nested_str_weak(matter), + /* K1 */ be_nested_str_weak(TLV), + /* K2 */ be_nested_str_weak(cluster), + /* K3 */ be_nested_str_weak(attribute), + /* K4 */ be_const_int(0), + /* K5 */ be_nested_str_weak(shadow_occupancy), + /* K6 */ be_nested_str_weak(create_TLV), + /* K7 */ be_nested_str_weak(U1), + /* K8 */ be_nested_str_weak(NULL), + /* K9 */ be_const_int(1), + /* K10 */ be_const_int(3), + /* K11 */ be_const_int(2), + /* K12 */ be_nested_str_weak(U4), + /* K13 */ be_nested_str_weak(read_attribute), }), be_str_weak(read_attribute), &be_const_str_solidified, - ( &(const binstruction[69]) { /* code */ - 0xA40E0000, // 0000 IMPORT R3 K0 - 0xB8120200, // 0001 GETNGBL R4 K1 - 0x88100902, // 0002 GETMBR R4 R4 K2 + ( &(const binstruction[68]) { /* code */ + 0xB80E0000, // 0000 GETNGBL R3 K0 + 0x880C0701, // 0001 GETMBR R3 R3 K1 + 0x88100502, // 0002 GETMBR R4 R2 K2 0x88140503, // 0003 GETMBR R5 R2 K3 - 0x88180504, // 0004 GETMBR R6 R2 K4 - 0x541E0405, // 0005 LDINT R7 1030 - 0x1C1C0A07, // 0006 EQ R7 R5 R7 - 0x781E0033, // 0007 JMPF R7 #003C - 0x1C1C0D05, // 0008 EQ R7 R6 K5 - 0x781E000F, // 0009 JMPF R7 #001A - 0x881C0106, // 000A GETMBR R7 R0 K6 - 0x4C200000, // 000B LDNIL R8 - 0x201C0E08, // 000C NE R7 R7 R8 - 0x781E0005, // 000D JMPF R7 #0014 - 0x8C1C0907, // 000E GETMET R7 R4 K7 - 0x88240908, // 000F GETMBR R9 R4 K8 - 0x88280106, // 0010 GETMBR R10 R0 K6 - 0x7C1C0600, // 0011 CALL R7 3 - 0x80040E00, // 0012 RET 1 R7 - 0x70020004, // 0013 JMP #0019 - 0x8C1C0907, // 0014 GETMET R7 R4 K7 - 0x88240909, // 0015 GETMBR R9 R4 K9 - 0x4C280000, // 0016 LDNIL R10 - 0x7C1C0600, // 0017 CALL R7 3 - 0x80040E00, // 0018 RET 1 R7 - 0x70020020, // 0019 JMP #003B - 0x1C1C0D0A, // 001A EQ R7 R6 K10 - 0x781E0005, // 001B JMPF R7 #0022 - 0x8C1C0907, // 001C GETMET R7 R4 K7 - 0x88240908, // 001D GETMBR R9 R4 K8 - 0x5828000B, // 001E LDCONST R10 K11 - 0x7C1C0600, // 001F CALL R7 3 - 0x80040E00, // 0020 RET 1 R7 - 0x70020018, // 0021 JMP #003B - 0x1C1C0D0C, // 0022 EQ R7 R6 K12 - 0x781E0005, // 0023 JMPF R7 #002A - 0x8C1C0907, // 0024 GETMET R7 R4 K7 - 0x88240908, // 0025 GETMBR R9 R4 K8 - 0x58280005, // 0026 LDCONST R10 K5 - 0x7C1C0600, // 0027 CALL R7 3 - 0x80040E00, // 0028 RET 1 R7 - 0x70020010, // 0029 JMP #003B - 0x541EFFFB, // 002A LDINT R7 65532 - 0x1C1C0C07, // 002B EQ R7 R6 R7 - 0x781E0005, // 002C JMPF R7 #0033 - 0x8C1C0907, // 002D GETMET R7 R4 K7 - 0x8824090D, // 002E GETMBR R9 R4 K13 - 0x58280005, // 002F LDCONST R10 K5 - 0x7C1C0600, // 0030 CALL R7 3 - 0x80040E00, // 0031 RET 1 R7 - 0x70020007, // 0032 JMP #003B - 0x541EFFFC, // 0033 LDINT R7 65533 - 0x1C1C0C07, // 0034 EQ R7 R6 R7 - 0x781E0004, // 0035 JMPF R7 #003B - 0x8C1C0907, // 0036 GETMET R7 R4 K7 - 0x8824090D, // 0037 GETMBR R9 R4 K13 - 0x5828000B, // 0038 LDCONST R10 K11 - 0x7C1C0600, // 0039 CALL R7 3 - 0x80040E00, // 003A RET 1 R7 - 0x70020007, // 003B JMP #0044 - 0x601C0003, // 003C GETGBL R7 G3 - 0x5C200000, // 003D MOVE R8 R0 - 0x7C1C0200, // 003E CALL R7 1 - 0x8C1C0F0E, // 003F GETMET R7 R7 K14 - 0x5C240200, // 0040 MOVE R9 R1 - 0x5C280400, // 0041 MOVE R10 R2 - 0x7C1C0600, // 0042 CALL R7 3 - 0x80040E00, // 0043 RET 1 R7 - 0x80000000, // 0044 RET 0 + 0x541A0405, // 0004 LDINT R6 1030 + 0x1C180806, // 0005 EQ R6 R4 R6 + 0x781A0033, // 0006 JMPF R6 #003B + 0x1C180B04, // 0007 EQ R6 R5 K4 + 0x781A000F, // 0008 JMPF R6 #0019 + 0x88180105, // 0009 GETMBR R6 R0 K5 + 0x4C1C0000, // 000A LDNIL R7 + 0x20180C07, // 000B NE R6 R6 R7 + 0x781A0005, // 000C JMPF R6 #0013 + 0x8C180706, // 000D GETMET R6 R3 K6 + 0x88200707, // 000E GETMBR R8 R3 K7 + 0x88240105, // 000F GETMBR R9 R0 K5 + 0x7C180600, // 0010 CALL R6 3 + 0x80040C00, // 0011 RET 1 R6 + 0x70020004, // 0012 JMP #0018 + 0x8C180706, // 0013 GETMET R6 R3 K6 + 0x88200708, // 0014 GETMBR R8 R3 K8 + 0x4C240000, // 0015 LDNIL R9 + 0x7C180600, // 0016 CALL R6 3 + 0x80040C00, // 0017 RET 1 R6 + 0x70020020, // 0018 JMP #003A + 0x1C180B09, // 0019 EQ R6 R5 K9 + 0x781A0005, // 001A JMPF R6 #0021 + 0x8C180706, // 001B GETMET R6 R3 K6 + 0x88200707, // 001C GETMBR R8 R3 K7 + 0x5824000A, // 001D LDCONST R9 K10 + 0x7C180600, // 001E CALL R6 3 + 0x80040C00, // 001F RET 1 R6 + 0x70020018, // 0020 JMP #003A + 0x1C180B0B, // 0021 EQ R6 R5 K11 + 0x781A0005, // 0022 JMPF R6 #0029 + 0x8C180706, // 0023 GETMET R6 R3 K6 + 0x88200707, // 0024 GETMBR R8 R3 K7 + 0x58240004, // 0025 LDCONST R9 K4 + 0x7C180600, // 0026 CALL R6 3 + 0x80040C00, // 0027 RET 1 R6 + 0x70020010, // 0028 JMP #003A + 0x541AFFFB, // 0029 LDINT R6 65532 + 0x1C180A06, // 002A EQ R6 R5 R6 + 0x781A0005, // 002B JMPF R6 #0032 + 0x8C180706, // 002C GETMET R6 R3 K6 + 0x8820070C, // 002D GETMBR R8 R3 K12 + 0x58240004, // 002E LDCONST R9 K4 + 0x7C180600, // 002F CALL R6 3 + 0x80040C00, // 0030 RET 1 R6 + 0x70020007, // 0031 JMP #003A + 0x541AFFFC, // 0032 LDINT R6 65533 + 0x1C180A06, // 0033 EQ R6 R5 R6 + 0x781A0004, // 0034 JMPF R6 #003A + 0x8C180706, // 0035 GETMET R6 R3 K6 + 0x8820070C, // 0036 GETMBR R8 R3 K12 + 0x5824000A, // 0037 LDCONST R9 K10 + 0x7C180600, // 0038 CALL R6 3 + 0x80040C00, // 0039 RET 1 R6 + 0x70020007, // 003A JMP #0043 + 0x60180003, // 003B GETGBL R6 G3 + 0x5C1C0000, // 003C MOVE R7 R0 + 0x7C180200, // 003D CALL R6 1 + 0x8C180D0D, // 003E GETMET R6 R6 K13 + 0x5C200200, // 003F MOVE R8 R1 + 0x5C240400, // 0040 MOVE R9 R2 + 0x7C180600, // 0041 CALL R6 3 + 0x80040C00, // 0042 RET 1 R6 + 0x80000000, // 0043 RET 0 }) ) ); diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor_OnOff.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor_OnOff.h index 864e3fc3e..b9eb6d333 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor_OnOff.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor_OnOff.h @@ -79,7 +79,7 @@ be_local_closure(Matter_Plugin_Sensor_OnOff_parse_configuration, /* name */ ********************************************************************/ be_local_closure(Matter_Plugin_Sensor_OnOff_read_attribute, /* name */ be_nested_proto( - 11, /* nstack */ + 10, /* nstack */ 3, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -87,68 +87,66 @@ be_local_closure(Matter_Plugin_Sensor_OnOff_read_attribute, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[12]) { /* constants */ - /* K0 */ be_nested_str_weak(string), - /* K1 */ be_nested_str_weak(matter), - /* K2 */ be_nested_str_weak(TLV), - /* K3 */ be_nested_str_weak(cluster), - /* K4 */ be_nested_str_weak(attribute), - /* K5 */ be_nested_str_weak(update_shadow_lazy), - /* K6 */ be_const_int(0), - /* K7 */ be_nested_str_weak(create_TLV), - /* K8 */ be_nested_str_weak(BOOL), - /* K9 */ be_nested_str_weak(shadow_onoff), - /* K10 */ be_nested_str_weak(U4), - /* K11 */ be_nested_str_weak(read_attribute), + ( &(const bvalue[11]) { /* constants */ + /* K0 */ be_nested_str_weak(matter), + /* K1 */ be_nested_str_weak(TLV), + /* K2 */ be_nested_str_weak(cluster), + /* K3 */ be_nested_str_weak(attribute), + /* K4 */ be_nested_str_weak(update_shadow_lazy), + /* K5 */ be_const_int(0), + /* K6 */ be_nested_str_weak(create_TLV), + /* K7 */ be_nested_str_weak(BOOL), + /* K8 */ be_nested_str_weak(shadow_onoff), + /* K9 */ be_nested_str_weak(U4), + /* K10 */ be_nested_str_weak(read_attribute), }), be_str_weak(read_attribute), &be_const_str_solidified, - ( &(const binstruction[45]) { /* code */ - 0xA40E0000, // 0000 IMPORT R3 K0 - 0xB8120200, // 0001 GETNGBL R4 K1 - 0x88100902, // 0002 GETMBR R4 R4 K2 + ( &(const binstruction[44]) { /* code */ + 0xB80E0000, // 0000 GETNGBL R3 K0 + 0x880C0701, // 0001 GETMBR R3 R3 K1 + 0x88100502, // 0002 GETMBR R4 R2 K2 0x88140503, // 0003 GETMBR R5 R2 K3 - 0x88180504, // 0004 GETMBR R6 R2 K4 - 0x541E0005, // 0005 LDINT R7 6 - 0x1C1C0A07, // 0006 EQ R7 R5 R7 - 0x781E001B, // 0007 JMPF R7 #0024 - 0x8C1C0105, // 0008 GETMET R7 R0 K5 - 0x7C1C0200, // 0009 CALL R7 1 - 0x1C1C0D06, // 000A EQ R7 R6 K6 - 0x781E0005, // 000B JMPF R7 #0012 - 0x8C1C0907, // 000C GETMET R7 R4 K7 - 0x88240908, // 000D GETMBR R9 R4 K8 - 0x88280109, // 000E GETMBR R10 R0 K9 - 0x7C1C0600, // 000F CALL R7 3 - 0x80040E00, // 0010 RET 1 R7 - 0x70020010, // 0011 JMP #0023 - 0x541EFFFB, // 0012 LDINT R7 65532 - 0x1C1C0C07, // 0013 EQ R7 R6 R7 - 0x781E0005, // 0014 JMPF R7 #001B - 0x8C1C0907, // 0015 GETMET R7 R4 K7 - 0x8824090A, // 0016 GETMBR R9 R4 K10 - 0x58280006, // 0017 LDCONST R10 K6 - 0x7C1C0600, // 0018 CALL R7 3 - 0x80040E00, // 0019 RET 1 R7 - 0x70020007, // 001A JMP #0023 - 0x541EFFFC, // 001B LDINT R7 65533 - 0x1C1C0C07, // 001C EQ R7 R6 R7 - 0x781E0004, // 001D JMPF R7 #0023 - 0x8C1C0907, // 001E GETMET R7 R4 K7 - 0x8824090A, // 001F GETMBR R9 R4 K10 - 0x542A0003, // 0020 LDINT R10 4 - 0x7C1C0600, // 0021 CALL R7 3 - 0x80040E00, // 0022 RET 1 R7 - 0x70020007, // 0023 JMP #002C - 0x601C0003, // 0024 GETGBL R7 G3 - 0x5C200000, // 0025 MOVE R8 R0 - 0x7C1C0200, // 0026 CALL R7 1 - 0x8C1C0F0B, // 0027 GETMET R7 R7 K11 - 0x5C240200, // 0028 MOVE R9 R1 - 0x5C280400, // 0029 MOVE R10 R2 - 0x7C1C0600, // 002A CALL R7 3 - 0x80040E00, // 002B RET 1 R7 - 0x80000000, // 002C RET 0 + 0x541A0005, // 0004 LDINT R6 6 + 0x1C180806, // 0005 EQ R6 R4 R6 + 0x781A001B, // 0006 JMPF R6 #0023 + 0x8C180104, // 0007 GETMET R6 R0 K4 + 0x7C180200, // 0008 CALL R6 1 + 0x1C180B05, // 0009 EQ R6 R5 K5 + 0x781A0005, // 000A JMPF R6 #0011 + 0x8C180706, // 000B GETMET R6 R3 K6 + 0x88200707, // 000C GETMBR R8 R3 K7 + 0x88240108, // 000D GETMBR R9 R0 K8 + 0x7C180600, // 000E CALL R6 3 + 0x80040C00, // 000F RET 1 R6 + 0x70020010, // 0010 JMP #0022 + 0x541AFFFB, // 0011 LDINT R6 65532 + 0x1C180A06, // 0012 EQ R6 R5 R6 + 0x781A0005, // 0013 JMPF R6 #001A + 0x8C180706, // 0014 GETMET R6 R3 K6 + 0x88200709, // 0015 GETMBR R8 R3 K9 + 0x58240005, // 0016 LDCONST R9 K5 + 0x7C180600, // 0017 CALL R6 3 + 0x80040C00, // 0018 RET 1 R6 + 0x70020007, // 0019 JMP #0022 + 0x541AFFFC, // 001A LDINT R6 65533 + 0x1C180A06, // 001B EQ R6 R5 R6 + 0x781A0004, // 001C JMPF R6 #0022 + 0x8C180706, // 001D GETMET R6 R3 K6 + 0x88200709, // 001E GETMBR R8 R3 K9 + 0x54260003, // 001F LDINT R9 4 + 0x7C180600, // 0020 CALL R6 3 + 0x80040C00, // 0021 RET 1 R6 + 0x70020007, // 0022 JMP #002B + 0x60180003, // 0023 GETGBL R6 G3 + 0x5C1C0000, // 0024 MOVE R7 R0 + 0x7C180200, // 0025 CALL R6 1 + 0x8C180D0A, // 0026 GETMET R6 R6 K10 + 0x5C200200, // 0027 MOVE R8 R1 + 0x5C240400, // 0028 MOVE R9 R2 + 0x7C180600, // 0029 CALL R6 3 + 0x80040C00, // 002A RET 1 R6 + 0x80000000, // 002B RET 0 }) ) ); diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor_Pressure.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor_Pressure.h index d3e645510..d3761e562 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor_Pressure.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor_Pressure.h @@ -11,7 +11,7 @@ extern const bclass be_class_Matter_Plugin_Sensor_Pressure; ********************************************************************/ be_local_closure(Matter_Plugin_Sensor_Pressure_read_attribute, /* name */ be_nested_proto( - 12, /* nstack */ + 11, /* nstack */ 3, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -19,97 +19,95 @@ be_local_closure(Matter_Plugin_Sensor_Pressure_read_attribute, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[15]) { /* constants */ - /* K0 */ be_nested_str_weak(string), - /* K1 */ be_nested_str_weak(matter), - /* K2 */ be_nested_str_weak(TLV), - /* K3 */ be_nested_str_weak(cluster), - /* K4 */ be_nested_str_weak(attribute), - /* K5 */ be_const_int(0), - /* K6 */ be_nested_str_weak(shadow_value), - /* K7 */ be_nested_str_weak(create_TLV), - /* K8 */ be_nested_str_weak(I2), - /* K9 */ be_nested_str_weak(NULL), - /* K10 */ be_const_int(1), - /* K11 */ be_const_int(2), - /* K12 */ be_nested_str_weak(U4), - /* K13 */ be_const_int(3), - /* K14 */ be_nested_str_weak(read_attribute), + ( &(const bvalue[14]) { /* constants */ + /* K0 */ be_nested_str_weak(matter), + /* K1 */ be_nested_str_weak(TLV), + /* K2 */ be_nested_str_weak(cluster), + /* K3 */ be_nested_str_weak(attribute), + /* K4 */ be_const_int(0), + /* K5 */ be_nested_str_weak(shadow_value), + /* K6 */ be_nested_str_weak(create_TLV), + /* K7 */ be_nested_str_weak(I2), + /* K8 */ be_nested_str_weak(NULL), + /* K9 */ be_const_int(1), + /* K10 */ be_const_int(2), + /* K11 */ be_nested_str_weak(U4), + /* K12 */ be_const_int(3), + /* K13 */ be_nested_str_weak(read_attribute), }), be_str_weak(read_attribute), &be_const_str_solidified, - ( &(const binstruction[71]) { /* code */ - 0xA40E0000, // 0000 IMPORT R3 K0 - 0xB8120200, // 0001 GETNGBL R4 K1 - 0x88100902, // 0002 GETMBR R4 R4 K2 + ( &(const binstruction[70]) { /* code */ + 0xB80E0000, // 0000 GETNGBL R3 K0 + 0x880C0701, // 0001 GETMBR R3 R3 K1 + 0x88100502, // 0002 GETMBR R4 R2 K2 0x88140503, // 0003 GETMBR R5 R2 K3 - 0x88180504, // 0004 GETMBR R6 R2 K4 - 0x541E0402, // 0005 LDINT R7 1027 - 0x1C1C0A07, // 0006 EQ R7 R5 R7 - 0x781E0035, // 0007 JMPF R7 #003E - 0x1C1C0D05, // 0008 EQ R7 R6 K5 - 0x781E0011, // 0009 JMPF R7 #001C - 0x881C0106, // 000A GETMBR R7 R0 K6 - 0x4C200000, // 000B LDNIL R8 - 0x201C0E08, // 000C NE R7 R7 R8 - 0x781E0007, // 000D JMPF R7 #0016 - 0x8C1C0907, // 000E GETMET R7 R4 K7 - 0x88240908, // 000F GETMBR R9 R4 K8 - 0x60280009, // 0010 GETGBL R10 G9 - 0x882C0106, // 0011 GETMBR R11 R0 K6 - 0x7C280200, // 0012 CALL R10 1 - 0x7C1C0600, // 0013 CALL R7 3 - 0x80040E00, // 0014 RET 1 R7 - 0x70020004, // 0015 JMP #001B - 0x8C1C0907, // 0016 GETMET R7 R4 K7 - 0x88240909, // 0017 GETMBR R9 R4 K9 - 0x4C280000, // 0018 LDNIL R10 - 0x7C1C0600, // 0019 CALL R7 3 - 0x80040E00, // 001A RET 1 R7 - 0x70020020, // 001B JMP #003D - 0x1C1C0D0A, // 001C EQ R7 R6 K10 - 0x781E0005, // 001D JMPF R7 #0024 - 0x8C1C0907, // 001E GETMET R7 R4 K7 - 0x88240908, // 001F GETMBR R9 R4 K8 - 0x542A01F3, // 0020 LDINT R10 500 - 0x7C1C0600, // 0021 CALL R7 3 - 0x80040E00, // 0022 RET 1 R7 - 0x70020018, // 0023 JMP #003D - 0x1C1C0D0B, // 0024 EQ R7 R6 K11 - 0x781E0005, // 0025 JMPF R7 #002C - 0x8C1C0907, // 0026 GETMET R7 R4 K7 - 0x88240908, // 0027 GETMBR R9 R4 K8 - 0x542A05DB, // 0028 LDINT R10 1500 - 0x7C1C0600, // 0029 CALL R7 3 - 0x80040E00, // 002A RET 1 R7 - 0x70020010, // 002B JMP #003D - 0x541EFFFB, // 002C LDINT R7 65532 - 0x1C1C0C07, // 002D EQ R7 R6 R7 - 0x781E0005, // 002E JMPF R7 #0035 - 0x8C1C0907, // 002F GETMET R7 R4 K7 - 0x8824090C, // 0030 GETMBR R9 R4 K12 - 0x58280005, // 0031 LDCONST R10 K5 - 0x7C1C0600, // 0032 CALL R7 3 - 0x80040E00, // 0033 RET 1 R7 - 0x70020007, // 0034 JMP #003D - 0x541EFFFC, // 0035 LDINT R7 65533 - 0x1C1C0C07, // 0036 EQ R7 R6 R7 - 0x781E0004, // 0037 JMPF R7 #003D - 0x8C1C0907, // 0038 GETMET R7 R4 K7 - 0x8824090C, // 0039 GETMBR R9 R4 K12 - 0x5828000D, // 003A LDCONST R10 K13 - 0x7C1C0600, // 003B CALL R7 3 - 0x80040E00, // 003C RET 1 R7 - 0x70020007, // 003D JMP #0046 - 0x601C0003, // 003E GETGBL R7 G3 - 0x5C200000, // 003F MOVE R8 R0 - 0x7C1C0200, // 0040 CALL R7 1 - 0x8C1C0F0E, // 0041 GETMET R7 R7 K14 - 0x5C240200, // 0042 MOVE R9 R1 - 0x5C280400, // 0043 MOVE R10 R2 - 0x7C1C0600, // 0044 CALL R7 3 - 0x80040E00, // 0045 RET 1 R7 - 0x80000000, // 0046 RET 0 + 0x541A0402, // 0004 LDINT R6 1027 + 0x1C180806, // 0005 EQ R6 R4 R6 + 0x781A0035, // 0006 JMPF R6 #003D + 0x1C180B04, // 0007 EQ R6 R5 K4 + 0x781A0011, // 0008 JMPF R6 #001B + 0x88180105, // 0009 GETMBR R6 R0 K5 + 0x4C1C0000, // 000A LDNIL R7 + 0x20180C07, // 000B NE R6 R6 R7 + 0x781A0007, // 000C JMPF R6 #0015 + 0x8C180706, // 000D GETMET R6 R3 K6 + 0x88200707, // 000E GETMBR R8 R3 K7 + 0x60240009, // 000F GETGBL R9 G9 + 0x88280105, // 0010 GETMBR R10 R0 K5 + 0x7C240200, // 0011 CALL R9 1 + 0x7C180600, // 0012 CALL R6 3 + 0x80040C00, // 0013 RET 1 R6 + 0x70020004, // 0014 JMP #001A + 0x8C180706, // 0015 GETMET R6 R3 K6 + 0x88200708, // 0016 GETMBR R8 R3 K8 + 0x4C240000, // 0017 LDNIL R9 + 0x7C180600, // 0018 CALL R6 3 + 0x80040C00, // 0019 RET 1 R6 + 0x70020020, // 001A JMP #003C + 0x1C180B09, // 001B EQ R6 R5 K9 + 0x781A0005, // 001C JMPF R6 #0023 + 0x8C180706, // 001D GETMET R6 R3 K6 + 0x88200707, // 001E GETMBR R8 R3 K7 + 0x542601F3, // 001F LDINT R9 500 + 0x7C180600, // 0020 CALL R6 3 + 0x80040C00, // 0021 RET 1 R6 + 0x70020018, // 0022 JMP #003C + 0x1C180B0A, // 0023 EQ R6 R5 K10 + 0x781A0005, // 0024 JMPF R6 #002B + 0x8C180706, // 0025 GETMET R6 R3 K6 + 0x88200707, // 0026 GETMBR R8 R3 K7 + 0x542605DB, // 0027 LDINT R9 1500 + 0x7C180600, // 0028 CALL R6 3 + 0x80040C00, // 0029 RET 1 R6 + 0x70020010, // 002A JMP #003C + 0x541AFFFB, // 002B LDINT R6 65532 + 0x1C180A06, // 002C EQ R6 R5 R6 + 0x781A0005, // 002D JMPF R6 #0034 + 0x8C180706, // 002E GETMET R6 R3 K6 + 0x8820070B, // 002F GETMBR R8 R3 K11 + 0x58240004, // 0030 LDCONST R9 K4 + 0x7C180600, // 0031 CALL R6 3 + 0x80040C00, // 0032 RET 1 R6 + 0x70020007, // 0033 JMP #003C + 0x541AFFFC, // 0034 LDINT R6 65533 + 0x1C180A06, // 0035 EQ R6 R5 R6 + 0x781A0004, // 0036 JMPF R6 #003C + 0x8C180706, // 0037 GETMET R6 R3 K6 + 0x8820070B, // 0038 GETMBR R8 R3 K11 + 0x5824000C, // 0039 LDCONST R9 K12 + 0x7C180600, // 003A CALL R6 3 + 0x80040C00, // 003B RET 1 R6 + 0x70020007, // 003C JMP #0045 + 0x60180003, // 003D GETGBL R6 G3 + 0x5C1C0000, // 003E MOVE R7 R0 + 0x7C180200, // 003F CALL R6 1 + 0x8C180D0D, // 0040 GETMET R6 R6 K13 + 0x5C200200, // 0041 MOVE R8 R1 + 0x5C240400, // 0042 MOVE R9 R2 + 0x7C180600, // 0043 CALL R6 3 + 0x80040C00, // 0044 RET 1 R6 + 0x80000000, // 0045 RET 0 }) ) ); diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor_Temp.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor_Temp.h index 13569d9e4..3ad3b033c 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor_Temp.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor_Temp.h @@ -11,7 +11,7 @@ extern const bclass be_class_Matter_Plugin_Sensor_Temp; ********************************************************************/ be_local_closure(Matter_Plugin_Sensor_Temp_read_attribute, /* name */ be_nested_proto( - 11, /* nstack */ + 10, /* nstack */ 3, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -19,94 +19,92 @@ be_local_closure(Matter_Plugin_Sensor_Temp_read_attribute, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[14]) { /* constants */ - /* K0 */ be_nested_str_weak(string), - /* K1 */ be_nested_str_weak(matter), - /* K2 */ be_nested_str_weak(TLV), - /* K3 */ be_nested_str_weak(cluster), - /* K4 */ be_nested_str_weak(attribute), - /* K5 */ be_const_int(0), - /* K6 */ be_nested_str_weak(shadow_value), - /* K7 */ be_nested_str_weak(create_TLV), - /* K8 */ be_nested_str_weak(I2), - /* K9 */ be_nested_str_weak(NULL), - /* K10 */ be_const_int(1), - /* K11 */ be_const_int(2), - /* K12 */ be_nested_str_weak(U4), - /* K13 */ be_nested_str_weak(read_attribute), + ( &(const bvalue[13]) { /* constants */ + /* K0 */ be_nested_str_weak(matter), + /* K1 */ be_nested_str_weak(TLV), + /* K2 */ be_nested_str_weak(cluster), + /* K3 */ be_nested_str_weak(attribute), + /* K4 */ be_const_int(0), + /* K5 */ be_nested_str_weak(shadow_value), + /* K6 */ be_nested_str_weak(create_TLV), + /* K7 */ be_nested_str_weak(I2), + /* K8 */ be_nested_str_weak(NULL), + /* K9 */ be_const_int(1), + /* K10 */ be_const_int(2), + /* K11 */ be_nested_str_weak(U4), + /* K12 */ be_nested_str_weak(read_attribute), }), be_str_weak(read_attribute), &be_const_str_solidified, - ( &(const binstruction[69]) { /* code */ - 0xA40E0000, // 0000 IMPORT R3 K0 - 0xB8120200, // 0001 GETNGBL R4 K1 - 0x88100902, // 0002 GETMBR R4 R4 K2 + ( &(const binstruction[68]) { /* code */ + 0xB80E0000, // 0000 GETNGBL R3 K0 + 0x880C0701, // 0001 GETMBR R3 R3 K1 + 0x88100502, // 0002 GETMBR R4 R2 K2 0x88140503, // 0003 GETMBR R5 R2 K3 - 0x88180504, // 0004 GETMBR R6 R2 K4 - 0x541E0401, // 0005 LDINT R7 1026 - 0x1C1C0A07, // 0006 EQ R7 R5 R7 - 0x781E0033, // 0007 JMPF R7 #003C - 0x1C1C0D05, // 0008 EQ R7 R6 K5 - 0x781E000F, // 0009 JMPF R7 #001A - 0x881C0106, // 000A GETMBR R7 R0 K6 - 0x4C200000, // 000B LDNIL R8 - 0x201C0E08, // 000C NE R7 R7 R8 - 0x781E0005, // 000D JMPF R7 #0014 - 0x8C1C0907, // 000E GETMET R7 R4 K7 - 0x88240908, // 000F GETMBR R9 R4 K8 - 0x88280106, // 0010 GETMBR R10 R0 K6 - 0x7C1C0600, // 0011 CALL R7 3 - 0x80040E00, // 0012 RET 1 R7 - 0x70020004, // 0013 JMP #0019 - 0x8C1C0907, // 0014 GETMET R7 R4 K7 - 0x88240909, // 0015 GETMBR R9 R4 K9 - 0x4C280000, // 0016 LDNIL R10 - 0x7C1C0600, // 0017 CALL R7 3 - 0x80040E00, // 0018 RET 1 R7 - 0x70020020, // 0019 JMP #003B - 0x1C1C0D0A, // 001A EQ R7 R6 K10 - 0x781E0005, // 001B JMPF R7 #0022 - 0x8C1C0907, // 001C GETMET R7 R4 K7 - 0x88240908, // 001D GETMBR R9 R4 K8 - 0x5429EC77, // 001E LDINT R10 -5000 - 0x7C1C0600, // 001F CALL R7 3 - 0x80040E00, // 0020 RET 1 R7 - 0x70020018, // 0021 JMP #003B - 0x1C1C0D0B, // 0022 EQ R7 R6 K11 - 0x781E0005, // 0023 JMPF R7 #002A - 0x8C1C0907, // 0024 GETMET R7 R4 K7 - 0x88240908, // 0025 GETMBR R9 R4 K8 - 0x542A3A97, // 0026 LDINT R10 15000 - 0x7C1C0600, // 0027 CALL R7 3 - 0x80040E00, // 0028 RET 1 R7 - 0x70020010, // 0029 JMP #003B - 0x541EFFFB, // 002A LDINT R7 65532 - 0x1C1C0C07, // 002B EQ R7 R6 R7 - 0x781E0005, // 002C JMPF R7 #0033 - 0x8C1C0907, // 002D GETMET R7 R4 K7 - 0x8824090C, // 002E GETMBR R9 R4 K12 - 0x58280005, // 002F LDCONST R10 K5 - 0x7C1C0600, // 0030 CALL R7 3 - 0x80040E00, // 0031 RET 1 R7 - 0x70020007, // 0032 JMP #003B - 0x541EFFFC, // 0033 LDINT R7 65533 - 0x1C1C0C07, // 0034 EQ R7 R6 R7 - 0x781E0004, // 0035 JMPF R7 #003B - 0x8C1C0907, // 0036 GETMET R7 R4 K7 - 0x8824090C, // 0037 GETMBR R9 R4 K12 - 0x542A0003, // 0038 LDINT R10 4 - 0x7C1C0600, // 0039 CALL R7 3 - 0x80040E00, // 003A RET 1 R7 - 0x70020007, // 003B JMP #0044 - 0x601C0003, // 003C GETGBL R7 G3 - 0x5C200000, // 003D MOVE R8 R0 - 0x7C1C0200, // 003E CALL R7 1 - 0x8C1C0F0D, // 003F GETMET R7 R7 K13 - 0x5C240200, // 0040 MOVE R9 R1 - 0x5C280400, // 0041 MOVE R10 R2 - 0x7C1C0600, // 0042 CALL R7 3 - 0x80040E00, // 0043 RET 1 R7 - 0x80000000, // 0044 RET 0 + 0x541A0401, // 0004 LDINT R6 1026 + 0x1C180806, // 0005 EQ R6 R4 R6 + 0x781A0033, // 0006 JMPF R6 #003B + 0x1C180B04, // 0007 EQ R6 R5 K4 + 0x781A000F, // 0008 JMPF R6 #0019 + 0x88180105, // 0009 GETMBR R6 R0 K5 + 0x4C1C0000, // 000A LDNIL R7 + 0x20180C07, // 000B NE R6 R6 R7 + 0x781A0005, // 000C JMPF R6 #0013 + 0x8C180706, // 000D GETMET R6 R3 K6 + 0x88200707, // 000E GETMBR R8 R3 K7 + 0x88240105, // 000F GETMBR R9 R0 K5 + 0x7C180600, // 0010 CALL R6 3 + 0x80040C00, // 0011 RET 1 R6 + 0x70020004, // 0012 JMP #0018 + 0x8C180706, // 0013 GETMET R6 R3 K6 + 0x88200708, // 0014 GETMBR R8 R3 K8 + 0x4C240000, // 0015 LDNIL R9 + 0x7C180600, // 0016 CALL R6 3 + 0x80040C00, // 0017 RET 1 R6 + 0x70020020, // 0018 JMP #003A + 0x1C180B09, // 0019 EQ R6 R5 K9 + 0x781A0005, // 001A JMPF R6 #0021 + 0x8C180706, // 001B GETMET R6 R3 K6 + 0x88200707, // 001C GETMBR R8 R3 K7 + 0x5425EC77, // 001D LDINT R9 -5000 + 0x7C180600, // 001E CALL R6 3 + 0x80040C00, // 001F RET 1 R6 + 0x70020018, // 0020 JMP #003A + 0x1C180B0A, // 0021 EQ R6 R5 K10 + 0x781A0005, // 0022 JMPF R6 #0029 + 0x8C180706, // 0023 GETMET R6 R3 K6 + 0x88200707, // 0024 GETMBR R8 R3 K7 + 0x54263A97, // 0025 LDINT R9 15000 + 0x7C180600, // 0026 CALL R6 3 + 0x80040C00, // 0027 RET 1 R6 + 0x70020010, // 0028 JMP #003A + 0x541AFFFB, // 0029 LDINT R6 65532 + 0x1C180A06, // 002A EQ R6 R5 R6 + 0x781A0005, // 002B JMPF R6 #0032 + 0x8C180706, // 002C GETMET R6 R3 K6 + 0x8820070B, // 002D GETMBR R8 R3 K11 + 0x58240004, // 002E LDCONST R9 K4 + 0x7C180600, // 002F CALL R6 3 + 0x80040C00, // 0030 RET 1 R6 + 0x70020007, // 0031 JMP #003A + 0x541AFFFC, // 0032 LDINT R6 65533 + 0x1C180A06, // 0033 EQ R6 R5 R6 + 0x781A0004, // 0034 JMPF R6 #003A + 0x8C180706, // 0035 GETMET R6 R3 K6 + 0x8820070B, // 0036 GETMBR R8 R3 K11 + 0x54260003, // 0037 LDINT R9 4 + 0x7C180600, // 0038 CALL R6 3 + 0x80040C00, // 0039 RET 1 R6 + 0x70020007, // 003A JMP #0043 + 0x60180003, // 003B GETGBL R6 G3 + 0x5C1C0000, // 003C MOVE R7 R0 + 0x7C180200, // 003D CALL R6 1 + 0x8C180D0C, // 003E GETMET R6 R6 K12 + 0x5C200200, // 003F MOVE R8 R1 + 0x5C240400, // 0040 MOVE R9 R2 + 0x7C180600, // 0041 CALL R6 3 + 0x80040C00, // 0042 RET 1 R6 + 0x80000000, // 0043 RET 0 }) ) ); diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Shutter.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Shutter.h index 982d994c8..89d2d2552 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Shutter.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Shutter.h @@ -11,7 +11,7 @@ extern const bclass be_class_Matter_Plugin_Shutter; ********************************************************************/ be_local_closure(Matter_Plugin_Shutter_read_attribute, /* name */ be_nested_proto( - 13, /* nstack */ + 12, /* nstack */ 3, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -19,182 +19,180 @@ be_local_closure(Matter_Plugin_Shutter_read_attribute, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[19]) { /* constants */ - /* K0 */ be_nested_str_weak(string), - /* K1 */ be_nested_str_weak(matter), - /* K2 */ be_nested_str_weak(TLV), - /* K3 */ be_nested_str_weak(cluster), - /* K4 */ be_nested_str_weak(attribute), - /* K5 */ be_nested_str_weak(update_shadow_lazy), - /* K6 */ be_nested_str_weak(update_inverted), - /* K7 */ be_const_int(0), - /* K8 */ be_nested_str_weak(create_TLV), - /* K9 */ be_nested_str_weak(U1), - /* K10 */ be_nested_str_weak(U2), - /* K11 */ be_const_int(1), - /* K12 */ be_nested_str_weak(shadow_shutter_inverted), - /* K13 */ be_nested_str_weak(shadow_shutter_pos), - /* K14 */ be_nested_str_weak(shadow_shutter_direction), - /* K15 */ be_const_int(2), - /* K16 */ be_nested_str_weak(shadow_shutter_target), - /* K17 */ be_nested_str_weak(U4), - /* K18 */ be_nested_str_weak(read_attribute), + ( &(const bvalue[18]) { /* constants */ + /* K0 */ be_nested_str_weak(matter), + /* K1 */ be_nested_str_weak(TLV), + /* K2 */ be_nested_str_weak(cluster), + /* K3 */ be_nested_str_weak(attribute), + /* K4 */ be_nested_str_weak(update_shadow_lazy), + /* K5 */ be_nested_str_weak(update_inverted), + /* K6 */ be_const_int(0), + /* K7 */ be_nested_str_weak(create_TLV), + /* K8 */ be_nested_str_weak(U1), + /* K9 */ be_nested_str_weak(U2), + /* K10 */ be_const_int(1), + /* K11 */ be_nested_str_weak(shadow_shutter_inverted), + /* K12 */ be_nested_str_weak(shadow_shutter_pos), + /* K13 */ be_nested_str_weak(shadow_shutter_direction), + /* K14 */ be_const_int(2), + /* K15 */ be_nested_str_weak(shadow_shutter_target), + /* K16 */ be_nested_str_weak(U4), + /* K17 */ be_nested_str_weak(read_attribute), }), be_str_weak(read_attribute), &be_const_str_solidified, - ( &(const binstruction[152]) { /* code */ - 0xA40E0000, // 0000 IMPORT R3 K0 - 0xB8120200, // 0001 GETNGBL R4 K1 - 0x88100902, // 0002 GETMBR R4 R4 K2 + ( &(const binstruction[151]) { /* code */ + 0xB80E0000, // 0000 GETNGBL R3 K0 + 0x880C0701, // 0001 GETMBR R3 R3 K1 + 0x88100502, // 0002 GETMBR R4 R2 K2 0x88140503, // 0003 GETMBR R5 R2 K3 - 0x88180504, // 0004 GETMBR R6 R2 K4 - 0x4C1C0000, // 0005 LDNIL R7 - 0x54220101, // 0006 LDINT R8 258 - 0x1C200A08, // 0007 EQ R8 R5 R8 - 0x78220085, // 0008 JMPF R8 #008F - 0x8C200105, // 0009 GETMET R8 R0 K5 - 0x7C200200, // 000A CALL R8 1 - 0x8C200106, // 000B GETMET R8 R0 K6 - 0x7C200200, // 000C CALL R8 1 - 0x1C200D07, // 000D EQ R8 R6 K7 - 0x78220005, // 000E JMPF R8 #0015 - 0x8C200908, // 000F GETMET R8 R4 K8 - 0x88280909, // 0010 GETMBR R10 R4 K9 - 0x542E00FE, // 0011 LDINT R11 255 - 0x7C200600, // 0012 CALL R8 3 - 0x80041000, // 0013 RET 1 R8 - 0x70020078, // 0014 JMP #008E - 0x54220004, // 0015 LDINT R8 5 - 0x1C200C08, // 0016 EQ R8 R6 R8 - 0x78220005, // 0017 JMPF R8 #001E - 0x8C200908, // 0018 GETMET R8 R4 K8 - 0x8828090A, // 0019 GETMBR R10 R4 K10 - 0x582C0007, // 001A LDCONST R11 K7 - 0x7C200600, // 001B CALL R8 3 - 0x80041000, // 001C RET 1 R8 - 0x7002006F, // 001D JMP #008E - 0x54220006, // 001E LDINT R8 7 - 0x1C200C08, // 001F EQ R8 R6 R8 - 0x78220006, // 0020 JMPF R8 #0028 - 0x8C200908, // 0021 GETMET R8 R4 K8 - 0x88280909, // 0022 GETMBR R10 R4 K9 - 0x542E0007, // 0023 LDINT R11 8 - 0x002E160B, // 0024 ADD R11 K11 R11 - 0x7C200600, // 0025 CALL R8 3 - 0x80041000, // 0026 RET 1 R8 - 0x70020065, // 0027 JMP #008E - 0x5422000C, // 0028 LDINT R8 13 - 0x1C200C08, // 0029 EQ R8 R6 R8 - 0x78220005, // 002A JMPF R8 #0031 - 0x8C200908, // 002B GETMET R8 R4 K8 - 0x88280909, // 002C GETMBR R10 R4 K9 - 0x542E00FE, // 002D LDINT R11 255 - 0x7C200600, // 002E CALL R8 3 - 0x80041000, // 002F RET 1 R8 - 0x7002005C, // 0030 JMP #008E - 0x5422000D, // 0031 LDINT R8 14 - 0x1C200C08, // 0032 EQ R8 R6 R8 - 0x78220013, // 0033 JMPF R8 #0048 - 0x8820010C, // 0034 GETMBR R8 R0 K12 - 0x1C201107, // 0035 EQ R8 R8 K7 - 0x78220006, // 0036 JMPF R8 #003E - 0x54220063, // 0037 LDINT R8 100 - 0x8824010D, // 0038 GETMBR R9 R0 K13 - 0x04201009, // 0039 SUB R8 R8 R9 - 0x54260063, // 003A LDINT R9 100 - 0x08201009, // 003B MUL R8 R8 R9 - 0x5C1C1000, // 003C MOVE R7 R8 - 0x70020003, // 003D JMP #0042 - 0x8820010D, // 003E GETMBR R8 R0 K13 - 0x54260063, // 003F LDINT R9 100 - 0x08201009, // 0040 MUL R8 R8 R9 - 0x5C1C1000, // 0041 MOVE R7 R8 - 0x8C200908, // 0042 GETMET R8 R4 K8 - 0x8828090A, // 0043 GETMBR R10 R4 K10 - 0x5C2C0E00, // 0044 MOVE R11 R7 - 0x7C200600, // 0045 CALL R8 3 - 0x80041000, // 0046 RET 1 R8 - 0x70020045, // 0047 JMP #008E - 0x54220009, // 0048 LDINT R8 10 - 0x1C200C08, // 0049 EQ R8 R6 R8 - 0x78220010, // 004A JMPF R8 #005C - 0x8820010E, // 004B GETMBR R8 R0 K14 - 0x1C201107, // 004C EQ R8 R8 K7 - 0x78220001, // 004D JMPF R8 #0050 - 0x58200007, // 004E LDCONST R8 K7 - 0x70020005, // 004F JMP #0056 - 0x8820010E, // 0050 GETMBR R8 R0 K14 - 0x24201107, // 0051 GT R8 R8 K7 - 0x78220001, // 0052 JMPF R8 #0055 - 0x5820000B, // 0053 LDCONST R8 K11 - 0x70020000, // 0054 JMP #0056 - 0x5820000F, // 0055 LDCONST R8 K15 - 0x8C240908, // 0056 GETMET R9 R4 K8 - 0x882C0909, // 0057 GETMBR R11 R4 K9 - 0x5C301000, // 0058 MOVE R12 R8 - 0x7C240600, // 0059 CALL R9 3 - 0x80041200, // 005A RET 1 R9 - 0x70020031, // 005B JMP #008E - 0x5422000A, // 005C LDINT R8 11 - 0x1C200C08, // 005D EQ R8 R6 R8 - 0x78220013, // 005E JMPF R8 #0073 - 0x8820010C, // 005F GETMBR R8 R0 K12 - 0x1C201107, // 0060 EQ R8 R8 K7 - 0x78220006, // 0061 JMPF R8 #0069 - 0x54220063, // 0062 LDINT R8 100 - 0x88240110, // 0063 GETMBR R9 R0 K16 - 0x04201009, // 0064 SUB R8 R8 R9 - 0x54260063, // 0065 LDINT R9 100 - 0x08201009, // 0066 MUL R8 R8 R9 - 0x5C1C1000, // 0067 MOVE R7 R8 - 0x70020003, // 0068 JMP #006D - 0x88200110, // 0069 GETMBR R8 R0 K16 - 0x54260063, // 006A LDINT R9 100 - 0x08201009, // 006B MUL R8 R8 R9 - 0x5C1C1000, // 006C MOVE R7 R8 - 0x8C200908, // 006D GETMET R8 R4 K8 - 0x8828090A, // 006E GETMBR R10 R4 K10 - 0x5C2C0E00, // 006F MOVE R11 R7 - 0x7C200600, // 0070 CALL R8 3 - 0x80041000, // 0071 RET 1 R8 - 0x7002001A, // 0072 JMP #008E - 0x54220016, // 0073 LDINT R8 23 - 0x1C200C08, // 0074 EQ R8 R6 R8 - 0x78220005, // 0075 JMPF R8 #007C - 0x8C200908, // 0076 GETMET R8 R4 K8 - 0x88280909, // 0077 GETMBR R10 R4 K9 - 0x582C0007, // 0078 LDCONST R11 K7 - 0x7C200600, // 0079 CALL R8 3 - 0x80041000, // 007A RET 1 R8 - 0x70020011, // 007B JMP #008E - 0x5422FFFB, // 007C LDINT R8 65532 - 0x1C200C08, // 007D EQ R8 R6 R8 - 0x78220006, // 007E JMPF R8 #0086 - 0x8C200908, // 007F GETMET R8 R4 K8 - 0x88280911, // 0080 GETMBR R10 R4 K17 - 0x542E0003, // 0081 LDINT R11 4 - 0x002E160B, // 0082 ADD R11 K11 R11 - 0x7C200600, // 0083 CALL R8 3 - 0x80041000, // 0084 RET 1 R8 - 0x70020007, // 0085 JMP #008E - 0x5422FFFC, // 0086 LDINT R8 65533 - 0x1C200C08, // 0087 EQ R8 R6 R8 - 0x78220004, // 0088 JMPF R8 #008E - 0x8C200908, // 0089 GETMET R8 R4 K8 - 0x88280911, // 008A GETMBR R10 R4 K17 - 0x542E0004, // 008B LDINT R11 5 - 0x7C200600, // 008C CALL R8 3 - 0x80041000, // 008D RET 1 R8 - 0x70020007, // 008E JMP #0097 - 0x60200003, // 008F GETGBL R8 G3 - 0x5C240000, // 0090 MOVE R9 R0 - 0x7C200200, // 0091 CALL R8 1 - 0x8C201112, // 0092 GETMET R8 R8 K18 - 0x5C280200, // 0093 MOVE R10 R1 - 0x5C2C0400, // 0094 MOVE R11 R2 - 0x7C200600, // 0095 CALL R8 3 - 0x80041000, // 0096 RET 1 R8 - 0x80000000, // 0097 RET 0 + 0x4C180000, // 0004 LDNIL R6 + 0x541E0101, // 0005 LDINT R7 258 + 0x1C1C0807, // 0006 EQ R7 R4 R7 + 0x781E0085, // 0007 JMPF R7 #008E + 0x8C1C0104, // 0008 GETMET R7 R0 K4 + 0x7C1C0200, // 0009 CALL R7 1 + 0x8C1C0105, // 000A GETMET R7 R0 K5 + 0x7C1C0200, // 000B CALL R7 1 + 0x1C1C0B06, // 000C EQ R7 R5 K6 + 0x781E0005, // 000D JMPF R7 #0014 + 0x8C1C0707, // 000E GETMET R7 R3 K7 + 0x88240708, // 000F GETMBR R9 R3 K8 + 0x542A00FE, // 0010 LDINT R10 255 + 0x7C1C0600, // 0011 CALL R7 3 + 0x80040E00, // 0012 RET 1 R7 + 0x70020078, // 0013 JMP #008D + 0x541E0004, // 0014 LDINT R7 5 + 0x1C1C0A07, // 0015 EQ R7 R5 R7 + 0x781E0005, // 0016 JMPF R7 #001D + 0x8C1C0707, // 0017 GETMET R7 R3 K7 + 0x88240709, // 0018 GETMBR R9 R3 K9 + 0x58280006, // 0019 LDCONST R10 K6 + 0x7C1C0600, // 001A CALL R7 3 + 0x80040E00, // 001B RET 1 R7 + 0x7002006F, // 001C JMP #008D + 0x541E0006, // 001D LDINT R7 7 + 0x1C1C0A07, // 001E EQ R7 R5 R7 + 0x781E0006, // 001F JMPF R7 #0027 + 0x8C1C0707, // 0020 GETMET R7 R3 K7 + 0x88240708, // 0021 GETMBR R9 R3 K8 + 0x542A0007, // 0022 LDINT R10 8 + 0x002A140A, // 0023 ADD R10 K10 R10 + 0x7C1C0600, // 0024 CALL R7 3 + 0x80040E00, // 0025 RET 1 R7 + 0x70020065, // 0026 JMP #008D + 0x541E000C, // 0027 LDINT R7 13 + 0x1C1C0A07, // 0028 EQ R7 R5 R7 + 0x781E0005, // 0029 JMPF R7 #0030 + 0x8C1C0707, // 002A GETMET R7 R3 K7 + 0x88240708, // 002B GETMBR R9 R3 K8 + 0x542A00FE, // 002C LDINT R10 255 + 0x7C1C0600, // 002D CALL R7 3 + 0x80040E00, // 002E RET 1 R7 + 0x7002005C, // 002F JMP #008D + 0x541E000D, // 0030 LDINT R7 14 + 0x1C1C0A07, // 0031 EQ R7 R5 R7 + 0x781E0013, // 0032 JMPF R7 #0047 + 0x881C010B, // 0033 GETMBR R7 R0 K11 + 0x1C1C0F06, // 0034 EQ R7 R7 K6 + 0x781E0006, // 0035 JMPF R7 #003D + 0x541E0063, // 0036 LDINT R7 100 + 0x8820010C, // 0037 GETMBR R8 R0 K12 + 0x041C0E08, // 0038 SUB R7 R7 R8 + 0x54220063, // 0039 LDINT R8 100 + 0x081C0E08, // 003A MUL R7 R7 R8 + 0x5C180E00, // 003B MOVE R6 R7 + 0x70020003, // 003C JMP #0041 + 0x881C010C, // 003D GETMBR R7 R0 K12 + 0x54220063, // 003E LDINT R8 100 + 0x081C0E08, // 003F MUL R7 R7 R8 + 0x5C180E00, // 0040 MOVE R6 R7 + 0x8C1C0707, // 0041 GETMET R7 R3 K7 + 0x88240709, // 0042 GETMBR R9 R3 K9 + 0x5C280C00, // 0043 MOVE R10 R6 + 0x7C1C0600, // 0044 CALL R7 3 + 0x80040E00, // 0045 RET 1 R7 + 0x70020045, // 0046 JMP #008D + 0x541E0009, // 0047 LDINT R7 10 + 0x1C1C0A07, // 0048 EQ R7 R5 R7 + 0x781E0010, // 0049 JMPF R7 #005B + 0x881C010D, // 004A GETMBR R7 R0 K13 + 0x1C1C0F06, // 004B EQ R7 R7 K6 + 0x781E0001, // 004C JMPF R7 #004F + 0x581C0006, // 004D LDCONST R7 K6 + 0x70020005, // 004E JMP #0055 + 0x881C010D, // 004F GETMBR R7 R0 K13 + 0x241C0F06, // 0050 GT R7 R7 K6 + 0x781E0001, // 0051 JMPF R7 #0054 + 0x581C000A, // 0052 LDCONST R7 K10 + 0x70020000, // 0053 JMP #0055 + 0x581C000E, // 0054 LDCONST R7 K14 + 0x8C200707, // 0055 GETMET R8 R3 K7 + 0x88280708, // 0056 GETMBR R10 R3 K8 + 0x5C2C0E00, // 0057 MOVE R11 R7 + 0x7C200600, // 0058 CALL R8 3 + 0x80041000, // 0059 RET 1 R8 + 0x70020031, // 005A JMP #008D + 0x541E000A, // 005B LDINT R7 11 + 0x1C1C0A07, // 005C EQ R7 R5 R7 + 0x781E0013, // 005D JMPF R7 #0072 + 0x881C010B, // 005E GETMBR R7 R0 K11 + 0x1C1C0F06, // 005F EQ R7 R7 K6 + 0x781E0006, // 0060 JMPF R7 #0068 + 0x541E0063, // 0061 LDINT R7 100 + 0x8820010F, // 0062 GETMBR R8 R0 K15 + 0x041C0E08, // 0063 SUB R7 R7 R8 + 0x54220063, // 0064 LDINT R8 100 + 0x081C0E08, // 0065 MUL R7 R7 R8 + 0x5C180E00, // 0066 MOVE R6 R7 + 0x70020003, // 0067 JMP #006C + 0x881C010F, // 0068 GETMBR R7 R0 K15 + 0x54220063, // 0069 LDINT R8 100 + 0x081C0E08, // 006A MUL R7 R7 R8 + 0x5C180E00, // 006B MOVE R6 R7 + 0x8C1C0707, // 006C GETMET R7 R3 K7 + 0x88240709, // 006D GETMBR R9 R3 K9 + 0x5C280C00, // 006E MOVE R10 R6 + 0x7C1C0600, // 006F CALL R7 3 + 0x80040E00, // 0070 RET 1 R7 + 0x7002001A, // 0071 JMP #008D + 0x541E0016, // 0072 LDINT R7 23 + 0x1C1C0A07, // 0073 EQ R7 R5 R7 + 0x781E0005, // 0074 JMPF R7 #007B + 0x8C1C0707, // 0075 GETMET R7 R3 K7 + 0x88240708, // 0076 GETMBR R9 R3 K8 + 0x58280006, // 0077 LDCONST R10 K6 + 0x7C1C0600, // 0078 CALL R7 3 + 0x80040E00, // 0079 RET 1 R7 + 0x70020011, // 007A JMP #008D + 0x541EFFFB, // 007B LDINT R7 65532 + 0x1C1C0A07, // 007C EQ R7 R5 R7 + 0x781E0006, // 007D JMPF R7 #0085 + 0x8C1C0707, // 007E GETMET R7 R3 K7 + 0x88240710, // 007F GETMBR R9 R3 K16 + 0x542A0003, // 0080 LDINT R10 4 + 0x002A140A, // 0081 ADD R10 K10 R10 + 0x7C1C0600, // 0082 CALL R7 3 + 0x80040E00, // 0083 RET 1 R7 + 0x70020007, // 0084 JMP #008D + 0x541EFFFC, // 0085 LDINT R7 65533 + 0x1C1C0A07, // 0086 EQ R7 R5 R7 + 0x781E0004, // 0087 JMPF R7 #008D + 0x8C1C0707, // 0088 GETMET R7 R3 K7 + 0x88240710, // 0089 GETMBR R9 R3 K16 + 0x542A0004, // 008A LDINT R10 5 + 0x7C1C0600, // 008B CALL R7 3 + 0x80040E00, // 008C RET 1 R7 + 0x70020007, // 008D JMP #0096 + 0x601C0003, // 008E GETGBL R7 G3 + 0x5C200000, // 008F MOVE R8 R0 + 0x7C1C0200, // 0090 CALL R7 1 + 0x8C1C0F11, // 0091 GETMET R7 R7 K17 + 0x5C240200, // 0092 MOVE R9 R1 + 0x5C280400, // 0093 MOVE R10 R2 + 0x7C1C0600, // 0094 CALL R7 3 + 0x80040E00, // 0095 RET 1 R7 + 0x80000000, // 0096 RET 0 }) ) ); @@ -206,7 +204,7 @@ be_local_closure(Matter_Plugin_Shutter_read_attribute, /* name */ ********************************************************************/ be_local_closure(Matter_Plugin_Shutter_parse_sensors, /* name */ be_nested_proto( - 12, /* nstack */ + 11, /* nstack */ 2, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -214,78 +212,76 @@ be_local_closure(Matter_Plugin_Shutter_parse_sensors, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[13]) { /* constants */ - /* K0 */ be_nested_str_weak(string), - /* K1 */ be_nested_str_weak(Shutter), - /* K2 */ be_nested_str_weak(tasmota_shutter_index), - /* K3 */ be_const_int(1), - /* K4 */ be_nested_str_weak(contains), - /* K5 */ be_nested_str_weak(find), - /* K6 */ be_nested_str_weak(Position), - /* K7 */ be_nested_str_weak(shadow_shutter_pos), - /* K8 */ be_nested_str_weak(attribute_updated), - /* K9 */ be_nested_str_weak(Direction), - /* K10 */ be_nested_str_weak(shadow_shutter_direction), - /* K11 */ be_nested_str_weak(Target), - /* K12 */ be_nested_str_weak(shadow_shutter_target), + ( &(const bvalue[12]) { /* constants */ + /* K0 */ be_nested_str_weak(Shutter), + /* K1 */ be_nested_str_weak(tasmota_shutter_index), + /* K2 */ be_const_int(1), + /* K3 */ be_nested_str_weak(contains), + /* K4 */ be_nested_str_weak(find), + /* K5 */ be_nested_str_weak(Position), + /* K6 */ be_nested_str_weak(shadow_shutter_pos), + /* K7 */ be_nested_str_weak(attribute_updated), + /* K8 */ be_nested_str_weak(Direction), + /* K9 */ be_nested_str_weak(shadow_shutter_direction), + /* K10 */ be_nested_str_weak(Target), + /* K11 */ be_nested_str_weak(shadow_shutter_target), }), be_str_weak(parse_sensors), &be_const_str_solidified, - ( &(const binstruction[54]) { /* code */ - 0xA40A0000, // 0000 IMPORT R2 K0 - 0x600C0008, // 0001 GETGBL R3 G8 - 0x88100102, // 0002 GETMBR R4 R0 K2 - 0x00100903, // 0003 ADD R4 R4 K3 - 0x7C0C0200, // 0004 CALL R3 1 - 0x000E0203, // 0005 ADD R3 K1 R3 - 0x8C100304, // 0006 GETMET R4 R1 K4 - 0x5C180600, // 0007 MOVE R6 R3 - 0x7C100400, // 0008 CALL R4 2 - 0x7812002A, // 0009 JMPF R4 #0035 - 0x94100203, // 000A GETIDX R4 R1 R3 - 0x8C140905, // 000B GETMET R5 R4 K5 - 0x581C0006, // 000C LDCONST R7 K6 - 0x7C140400, // 000D CALL R5 2 - 0x4C180000, // 000E LDNIL R6 - 0x20180A06, // 000F NE R6 R5 R6 - 0x781A0007, // 0010 JMPF R6 #0019 - 0x88180107, // 0011 GETMBR R6 R0 K7 - 0x20180A06, // 0012 NE R6 R5 R6 - 0x781A0003, // 0013 JMPF R6 #0018 - 0x8C180108, // 0014 GETMET R6 R0 K8 - 0x54220101, // 0015 LDINT R8 258 - 0x5426000D, // 0016 LDINT R9 14 - 0x7C180600, // 0017 CALL R6 3 - 0x90020E05, // 0018 SETMBR R0 K7 R5 - 0x8C180905, // 0019 GETMET R6 R4 K5 - 0x58200009, // 001A LDCONST R8 K9 - 0x7C180400, // 001B CALL R6 2 - 0x4C1C0000, // 001C LDNIL R7 - 0x201C0C07, // 001D NE R7 R6 R7 - 0x781E0007, // 001E JMPF R7 #0027 - 0x881C010A, // 001F GETMBR R7 R0 K10 - 0x201C0C07, // 0020 NE R7 R6 R7 - 0x781E0003, // 0021 JMPF R7 #0026 - 0x8C1C0108, // 0022 GETMET R7 R0 K8 - 0x54260101, // 0023 LDINT R9 258 - 0x542A0009, // 0024 LDINT R10 10 - 0x7C1C0600, // 0025 CALL R7 3 - 0x90021406, // 0026 SETMBR R0 K10 R6 - 0x8C1C0905, // 0027 GETMET R7 R4 K5 - 0x5824000B, // 0028 LDCONST R9 K11 - 0x7C1C0400, // 0029 CALL R7 2 - 0x4C200000, // 002A LDNIL R8 - 0x20200E08, // 002B NE R8 R7 R8 - 0x78220007, // 002C JMPF R8 #0035 - 0x8820010C, // 002D GETMBR R8 R0 K12 - 0x20200E08, // 002E NE R8 R7 R8 - 0x78220003, // 002F JMPF R8 #0034 - 0x8C200108, // 0030 GETMET R8 R0 K8 - 0x542A0101, // 0031 LDINT R10 258 - 0x542E000A, // 0032 LDINT R11 11 - 0x7C200600, // 0033 CALL R8 3 - 0x90021807, // 0034 SETMBR R0 K12 R7 - 0x80000000, // 0035 RET 0 + ( &(const binstruction[53]) { /* code */ + 0x60080008, // 0000 GETGBL R2 G8 + 0x880C0101, // 0001 GETMBR R3 R0 K1 + 0x000C0702, // 0002 ADD R3 R3 K2 + 0x7C080200, // 0003 CALL R2 1 + 0x000A0002, // 0004 ADD R2 K0 R2 + 0x8C0C0303, // 0005 GETMET R3 R1 K3 + 0x5C140400, // 0006 MOVE R5 R2 + 0x7C0C0400, // 0007 CALL R3 2 + 0x780E002A, // 0008 JMPF R3 #0034 + 0x940C0202, // 0009 GETIDX R3 R1 R2 + 0x8C100704, // 000A GETMET R4 R3 K4 + 0x58180005, // 000B LDCONST R6 K5 + 0x7C100400, // 000C CALL R4 2 + 0x4C140000, // 000D LDNIL R5 + 0x20140805, // 000E NE R5 R4 R5 + 0x78160007, // 000F JMPF R5 #0018 + 0x88140106, // 0010 GETMBR R5 R0 K6 + 0x20140805, // 0011 NE R5 R4 R5 + 0x78160003, // 0012 JMPF R5 #0017 + 0x8C140107, // 0013 GETMET R5 R0 K7 + 0x541E0101, // 0014 LDINT R7 258 + 0x5422000D, // 0015 LDINT R8 14 + 0x7C140600, // 0016 CALL R5 3 + 0x90020C04, // 0017 SETMBR R0 K6 R4 + 0x8C140704, // 0018 GETMET R5 R3 K4 + 0x581C0008, // 0019 LDCONST R7 K8 + 0x7C140400, // 001A CALL R5 2 + 0x4C180000, // 001B LDNIL R6 + 0x20180A06, // 001C NE R6 R5 R6 + 0x781A0007, // 001D JMPF R6 #0026 + 0x88180109, // 001E GETMBR R6 R0 K9 + 0x20180A06, // 001F NE R6 R5 R6 + 0x781A0003, // 0020 JMPF R6 #0025 + 0x8C180107, // 0021 GETMET R6 R0 K7 + 0x54220101, // 0022 LDINT R8 258 + 0x54260009, // 0023 LDINT R9 10 + 0x7C180600, // 0024 CALL R6 3 + 0x90021205, // 0025 SETMBR R0 K9 R5 + 0x8C180704, // 0026 GETMET R6 R3 K4 + 0x5820000A, // 0027 LDCONST R8 K10 + 0x7C180400, // 0028 CALL R6 2 + 0x4C1C0000, // 0029 LDNIL R7 + 0x201C0C07, // 002A NE R7 R6 R7 + 0x781E0007, // 002B JMPF R7 #0034 + 0x881C010B, // 002C GETMBR R7 R0 K11 + 0x201C0C07, // 002D NE R7 R6 R7 + 0x781E0003, // 002E JMPF R7 #0033 + 0x8C1C0107, // 002F GETMET R7 R0 K7 + 0x54260101, // 0030 LDINT R9 258 + 0x542A000A, // 0031 LDINT R10 11 + 0x7C1C0600, // 0032 CALL R7 3 + 0x90021606, // 0033 SETMBR R0 K11 R6 + 0x80000000, // 0034 RET 0 }) ) ); diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_ShutterTilt.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_ShutterTilt.h index 2d6d0445e..9e89d19d9 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_ShutterTilt.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_ShutterTilt.h @@ -207,7 +207,7 @@ be_local_closure(Matter_Plugin_ShutterTilt_invoke_request, /* name */ ********************************************************************/ be_local_closure(Matter_Plugin_ShutterTilt_read_attribute, /* name */ be_nested_proto( - 14, /* nstack */ + 13, /* nstack */ 3, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -215,145 +215,143 @@ be_local_closure(Matter_Plugin_ShutterTilt_read_attribute, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[21]) { /* constants */ - /* K0 */ be_nested_str_weak(string), - /* K1 */ be_nested_str_weak(matter), - /* K2 */ be_nested_str_weak(TLV), - /* K3 */ be_nested_str_weak(cluster), - /* K4 */ be_nested_str_weak(attribute), - /* K5 */ be_nested_str_weak(update_shadow_lazy), - /* K6 */ be_nested_str_weak(create_TLV), - /* K7 */ be_nested_str_weak(U1), - /* K8 */ be_const_int(1), - /* K9 */ be_nested_str_weak(update_tilt_min_max), - /* K10 */ be_nested_str_weak(tilt_min), - /* K11 */ be_nested_str_weak(tilt_max), - /* K12 */ be_nested_str_weak(tasmota), - /* K13 */ be_nested_str_weak(scale_uint), - /* K14 */ be_nested_str_weak(shadow_shutter_tilt), - /* K15 */ be_const_int(0), - /* K16 */ be_nested_str_weak(U2), - /* K17 */ be_nested_str_weak(NULL), - /* K18 */ be_nested_str_weak(U4), - /* K19 */ be_const_int(3), - /* K20 */ be_nested_str_weak(read_attribute), + ( &(const bvalue[20]) { /* constants */ + /* K0 */ be_nested_str_weak(matter), + /* K1 */ be_nested_str_weak(TLV), + /* K2 */ be_nested_str_weak(cluster), + /* K3 */ be_nested_str_weak(attribute), + /* K4 */ be_nested_str_weak(update_shadow_lazy), + /* K5 */ be_nested_str_weak(create_TLV), + /* K6 */ be_nested_str_weak(U1), + /* K7 */ be_const_int(1), + /* K8 */ be_nested_str_weak(update_tilt_min_max), + /* K9 */ be_nested_str_weak(tilt_min), + /* K10 */ be_nested_str_weak(tilt_max), + /* K11 */ be_nested_str_weak(tasmota), + /* K12 */ be_nested_str_weak(scale_uint), + /* K13 */ be_nested_str_weak(shadow_shutter_tilt), + /* K14 */ be_const_int(0), + /* K15 */ be_nested_str_weak(U2), + /* K16 */ be_nested_str_weak(NULL), + /* K17 */ be_nested_str_weak(U4), + /* K18 */ be_const_int(3), + /* K19 */ be_nested_str_weak(read_attribute), }), be_str_weak(read_attribute), &be_const_str_solidified, - ( &(const binstruction[113]) { /* code */ - 0xA40E0000, // 0000 IMPORT R3 K0 - 0xB8120200, // 0001 GETNGBL R4 K1 - 0x88100902, // 0002 GETMBR R4 R4 K2 + ( &(const binstruction[112]) { /* code */ + 0xB80E0000, // 0000 GETNGBL R3 K0 + 0x880C0701, // 0001 GETMBR R3 R3 K1 + 0x88100502, // 0002 GETMBR R4 R2 K2 0x88140503, // 0003 GETMBR R5 R2 K3 - 0x88180504, // 0004 GETMBR R6 R2 K4 - 0x541E0101, // 0005 LDINT R7 258 - 0x1C1C0A07, // 0006 EQ R7 R5 R7 - 0x781E0060, // 0007 JMPF R7 #0069 - 0x8C1C0105, // 0008 GETMET R7 R0 K5 - 0x7C1C0200, // 0009 CALL R7 1 - 0x541E0006, // 000A LDINT R7 7 - 0x1C1C0C07, // 000B EQ R7 R6 R7 - 0x781E0008, // 000C JMPF R7 #0016 - 0x8C1C0906, // 000D GETMET R7 R4 K6 - 0x88240907, // 000E GETMBR R9 R4 K7 - 0x542A0007, // 000F LDINT R10 8 - 0x002A100A, // 0010 ADD R10 K8 R10 - 0x542E000F, // 0011 LDINT R11 16 - 0x0028140B, // 0012 ADD R10 R10 R11 - 0x7C1C0600, // 0013 CALL R7 3 - 0x80040E00, // 0014 RET 1 R7 - 0x70020052, // 0015 JMP #0069 - 0x541E000E, // 0016 LDINT R7 15 - 0x1C1C0C07, // 0017 EQ R7 R6 R7 - 0x781E0021, // 0018 JMPF R7 #003B - 0x8C1C0109, // 0019 GETMET R7 R0 K9 - 0x7C1C0200, // 001A CALL R7 1 - 0x881C010A, // 001B GETMBR R7 R0 K10 - 0x4C200000, // 001C LDNIL R8 - 0x201C0E08, // 001D NE R7 R7 R8 - 0x781E0015, // 001E JMPF R7 #0035 - 0x881C010B, // 001F GETMBR R7 R0 K11 - 0x4C200000, // 0020 LDNIL R8 - 0x201C0E08, // 0021 NE R7 R7 R8 - 0x781E0011, // 0022 JMPF R7 #0035 - 0xB81E1800, // 0023 GETNGBL R7 K12 - 0x8C1C0F0D, // 0024 GETMET R7 R7 K13 - 0x8824010E, // 0025 GETMBR R9 R0 K14 - 0x8828010A, // 0026 GETMBR R10 R0 K10 - 0x0424120A, // 0027 SUB R9 R9 R10 - 0x5828000F, // 0028 LDCONST R10 K15 - 0x882C010B, // 0029 GETMBR R11 R0 K11 - 0x8830010A, // 002A GETMBR R12 R0 K10 - 0x042C160C, // 002B SUB R11 R11 R12 - 0x5830000F, // 002C LDCONST R12 K15 - 0x5436270F, // 002D LDINT R13 10000 - 0x7C1C0C00, // 002E CALL R7 6 - 0x8C200906, // 002F GETMET R8 R4 K6 - 0x88280910, // 0030 GETMBR R10 R4 K16 - 0x5C2C0E00, // 0031 MOVE R11 R7 - 0x7C200600, // 0032 CALL R8 3 - 0x80041000, // 0033 RET 1 R8 - 0x70020004, // 0034 JMP #003A - 0x8C1C0906, // 0035 GETMET R7 R4 K6 - 0x88240911, // 0036 GETMBR R9 R4 K17 - 0x4C280000, // 0037 LDNIL R10 - 0x7C1C0600, // 0038 CALL R7 3 - 0x80040E00, // 0039 RET 1 R7 - 0x7002002D, // 003A JMP #0069 - 0x541E000B, // 003B LDINT R7 12 - 0x1C1C0C07, // 003C EQ R7 R6 R7 - 0x781E001F, // 003D JMPF R7 #005E - 0x881C010A, // 003E GETMBR R7 R0 K10 - 0x4C200000, // 003F LDNIL R8 - 0x201C0E08, // 0040 NE R7 R7 R8 - 0x781E0015, // 0041 JMPF R7 #0058 - 0x881C010B, // 0042 GETMBR R7 R0 K11 - 0x4C200000, // 0043 LDNIL R8 - 0x201C0E08, // 0044 NE R7 R7 R8 - 0x781E0011, // 0045 JMPF R7 #0058 - 0xB81E1800, // 0046 GETNGBL R7 K12 - 0x8C1C0F0D, // 0047 GETMET R7 R7 K13 - 0x8824010E, // 0048 GETMBR R9 R0 K14 - 0x8828010A, // 0049 GETMBR R10 R0 K10 - 0x0424120A, // 004A SUB R9 R9 R10 - 0x5828000F, // 004B LDCONST R10 K15 - 0x882C010B, // 004C GETMBR R11 R0 K11 - 0x8830010A, // 004D GETMBR R12 R0 K10 - 0x042C160C, // 004E SUB R11 R11 R12 - 0x5830000F, // 004F LDCONST R12 K15 - 0x5436270F, // 0050 LDINT R13 10000 - 0x7C1C0C00, // 0051 CALL R7 6 - 0x8C200906, // 0052 GETMET R8 R4 K6 - 0x88280910, // 0053 GETMBR R10 R4 K16 - 0x5C2C0E00, // 0054 MOVE R11 R7 - 0x7C200600, // 0055 CALL R8 3 - 0x80041000, // 0056 RET 1 R8 - 0x70020004, // 0057 JMP #005D - 0x8C1C0906, // 0058 GETMET R7 R4 K6 - 0x88240911, // 0059 GETMBR R9 R4 K17 - 0x4C280000, // 005A LDNIL R10 - 0x7C1C0600, // 005B CALL R7 3 - 0x80040E00, // 005C RET 1 R7 - 0x7002000A, // 005D JMP #0069 - 0x541EFFFB, // 005E LDINT R7 65532 - 0x1C1C0C07, // 005F EQ R7 R6 R7 - 0x781E0007, // 0060 JMPF R7 #0069 - 0x8C1C0906, // 0061 GETMET R7 R4 K6 - 0x88240912, // 0062 GETMBR R9 R4 K18 - 0x542A0003, // 0063 LDINT R10 4 - 0x002A260A, // 0064 ADD R10 K19 R10 - 0x542E000F, // 0065 LDINT R11 16 - 0x0028140B, // 0066 ADD R10 R10 R11 - 0x7C1C0600, // 0067 CALL R7 3 - 0x80040E00, // 0068 RET 1 R7 - 0x601C0003, // 0069 GETGBL R7 G3 - 0x5C200000, // 006A MOVE R8 R0 - 0x7C1C0200, // 006B CALL R7 1 - 0x8C1C0F14, // 006C GETMET R7 R7 K20 - 0x5C240200, // 006D MOVE R9 R1 - 0x5C280400, // 006E MOVE R10 R2 - 0x7C1C0600, // 006F CALL R7 3 - 0x80040E00, // 0070 RET 1 R7 + 0x541A0101, // 0004 LDINT R6 258 + 0x1C180806, // 0005 EQ R6 R4 R6 + 0x781A0060, // 0006 JMPF R6 #0068 + 0x8C180104, // 0007 GETMET R6 R0 K4 + 0x7C180200, // 0008 CALL R6 1 + 0x541A0006, // 0009 LDINT R6 7 + 0x1C180A06, // 000A EQ R6 R5 R6 + 0x781A0008, // 000B JMPF R6 #0015 + 0x8C180705, // 000C GETMET R6 R3 K5 + 0x88200706, // 000D GETMBR R8 R3 K6 + 0x54260007, // 000E LDINT R9 8 + 0x00260E09, // 000F ADD R9 K7 R9 + 0x542A000F, // 0010 LDINT R10 16 + 0x0024120A, // 0011 ADD R9 R9 R10 + 0x7C180600, // 0012 CALL R6 3 + 0x80040C00, // 0013 RET 1 R6 + 0x70020052, // 0014 JMP #0068 + 0x541A000E, // 0015 LDINT R6 15 + 0x1C180A06, // 0016 EQ R6 R5 R6 + 0x781A0021, // 0017 JMPF R6 #003A + 0x8C180108, // 0018 GETMET R6 R0 K8 + 0x7C180200, // 0019 CALL R6 1 + 0x88180109, // 001A GETMBR R6 R0 K9 + 0x4C1C0000, // 001B LDNIL R7 + 0x20180C07, // 001C NE R6 R6 R7 + 0x781A0015, // 001D JMPF R6 #0034 + 0x8818010A, // 001E GETMBR R6 R0 K10 + 0x4C1C0000, // 001F LDNIL R7 + 0x20180C07, // 0020 NE R6 R6 R7 + 0x781A0011, // 0021 JMPF R6 #0034 + 0xB81A1600, // 0022 GETNGBL R6 K11 + 0x8C180D0C, // 0023 GETMET R6 R6 K12 + 0x8820010D, // 0024 GETMBR R8 R0 K13 + 0x88240109, // 0025 GETMBR R9 R0 K9 + 0x04201009, // 0026 SUB R8 R8 R9 + 0x5824000E, // 0027 LDCONST R9 K14 + 0x8828010A, // 0028 GETMBR R10 R0 K10 + 0x882C0109, // 0029 GETMBR R11 R0 K9 + 0x0428140B, // 002A SUB R10 R10 R11 + 0x582C000E, // 002B LDCONST R11 K14 + 0x5432270F, // 002C LDINT R12 10000 + 0x7C180C00, // 002D CALL R6 6 + 0x8C1C0705, // 002E GETMET R7 R3 K5 + 0x8824070F, // 002F GETMBR R9 R3 K15 + 0x5C280C00, // 0030 MOVE R10 R6 + 0x7C1C0600, // 0031 CALL R7 3 + 0x80040E00, // 0032 RET 1 R7 + 0x70020004, // 0033 JMP #0039 + 0x8C180705, // 0034 GETMET R6 R3 K5 + 0x88200710, // 0035 GETMBR R8 R3 K16 + 0x4C240000, // 0036 LDNIL R9 + 0x7C180600, // 0037 CALL R6 3 + 0x80040C00, // 0038 RET 1 R6 + 0x7002002D, // 0039 JMP #0068 + 0x541A000B, // 003A LDINT R6 12 + 0x1C180A06, // 003B EQ R6 R5 R6 + 0x781A001F, // 003C JMPF R6 #005D + 0x88180109, // 003D GETMBR R6 R0 K9 + 0x4C1C0000, // 003E LDNIL R7 + 0x20180C07, // 003F NE R6 R6 R7 + 0x781A0015, // 0040 JMPF R6 #0057 + 0x8818010A, // 0041 GETMBR R6 R0 K10 + 0x4C1C0000, // 0042 LDNIL R7 + 0x20180C07, // 0043 NE R6 R6 R7 + 0x781A0011, // 0044 JMPF R6 #0057 + 0xB81A1600, // 0045 GETNGBL R6 K11 + 0x8C180D0C, // 0046 GETMET R6 R6 K12 + 0x8820010D, // 0047 GETMBR R8 R0 K13 + 0x88240109, // 0048 GETMBR R9 R0 K9 + 0x04201009, // 0049 SUB R8 R8 R9 + 0x5824000E, // 004A LDCONST R9 K14 + 0x8828010A, // 004B GETMBR R10 R0 K10 + 0x882C0109, // 004C GETMBR R11 R0 K9 + 0x0428140B, // 004D SUB R10 R10 R11 + 0x582C000E, // 004E LDCONST R11 K14 + 0x5432270F, // 004F LDINT R12 10000 + 0x7C180C00, // 0050 CALL R6 6 + 0x8C1C0705, // 0051 GETMET R7 R3 K5 + 0x8824070F, // 0052 GETMBR R9 R3 K15 + 0x5C280C00, // 0053 MOVE R10 R6 + 0x7C1C0600, // 0054 CALL R7 3 + 0x80040E00, // 0055 RET 1 R7 + 0x70020004, // 0056 JMP #005C + 0x8C180705, // 0057 GETMET R6 R3 K5 + 0x88200710, // 0058 GETMBR R8 R3 K16 + 0x4C240000, // 0059 LDNIL R9 + 0x7C180600, // 005A CALL R6 3 + 0x80040C00, // 005B RET 1 R6 + 0x7002000A, // 005C JMP #0068 + 0x541AFFFB, // 005D LDINT R6 65532 + 0x1C180A06, // 005E EQ R6 R5 R6 + 0x781A0007, // 005F JMPF R6 #0068 + 0x8C180705, // 0060 GETMET R6 R3 K5 + 0x88200711, // 0061 GETMBR R8 R3 K17 + 0x54260003, // 0062 LDINT R9 4 + 0x00262409, // 0063 ADD R9 K18 R9 + 0x542A000F, // 0064 LDINT R10 16 + 0x0024120A, // 0065 ADD R9 R9 R10 + 0x7C180600, // 0066 CALL R6 3 + 0x80040C00, // 0067 RET 1 R6 + 0x60180003, // 0068 GETGBL R6 G3 + 0x5C1C0000, // 0069 MOVE R7 R0 + 0x7C180200, // 006A CALL R6 1 + 0x8C180D13, // 006B GETMET R6 R6 K19 + 0x5C200200, // 006C MOVE R8 R1 + 0x5C240400, // 006D MOVE R9 R2 + 0x7C180600, // 006E CALL R6 3 + 0x80040C00, // 006F RET 1 R6 }) ) ); @@ -365,7 +363,7 @@ be_local_closure(Matter_Plugin_ShutterTilt_read_attribute, /* name */ ********************************************************************/ be_local_closure(Matter_Plugin_ShutterTilt_parse_sensors, /* name */ be_nested_proto( - 10, /* nstack */ + 9, /* nstack */ 2, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -373,53 +371,51 @@ be_local_closure(Matter_Plugin_ShutterTilt_parse_sensors, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[10]) { /* constants */ - /* K0 */ be_nested_str_weak(string), - /* K1 */ be_nested_str_weak(Shutter), - /* K2 */ be_nested_str_weak(tasmota_shutter_index), - /* K3 */ be_const_int(1), - /* K4 */ be_nested_str_weak(contains), - /* K5 */ be_nested_str_weak(find), - /* K6 */ be_nested_str_weak(Tilt), - /* K7 */ be_nested_str_weak(shadow_shutter_tilt), - /* K8 */ be_nested_str_weak(attribute_updated), - /* K9 */ be_nested_str_weak(parse_sensors), + ( &(const bvalue[ 9]) { /* constants */ + /* K0 */ be_nested_str_weak(Shutter), + /* K1 */ be_nested_str_weak(tasmota_shutter_index), + /* K2 */ be_const_int(1), + /* K3 */ be_nested_str_weak(contains), + /* K4 */ be_nested_str_weak(find), + /* K5 */ be_nested_str_weak(Tilt), + /* K6 */ be_nested_str_weak(shadow_shutter_tilt), + /* K7 */ be_nested_str_weak(attribute_updated), + /* K8 */ be_nested_str_weak(parse_sensors), }), be_str_weak(parse_sensors), &be_const_str_solidified, - ( &(const binstruction[32]) { /* code */ - 0xA40A0000, // 0000 IMPORT R2 K0 - 0x600C0008, // 0001 GETGBL R3 G8 - 0x88100102, // 0002 GETMBR R4 R0 K2 - 0x00100903, // 0003 ADD R4 R4 K3 - 0x7C0C0200, // 0004 CALL R3 1 - 0x000E0203, // 0005 ADD R3 K1 R3 - 0x8C100304, // 0006 GETMET R4 R1 K4 - 0x5C180600, // 0007 MOVE R6 R3 - 0x7C100400, // 0008 CALL R4 2 - 0x7812000E, // 0009 JMPF R4 #0019 - 0x94100203, // 000A GETIDX R4 R1 R3 - 0x8C140905, // 000B GETMET R5 R4 K5 - 0x581C0006, // 000C LDCONST R7 K6 - 0x7C140400, // 000D CALL R5 2 - 0x4C180000, // 000E LDNIL R6 - 0x20180A06, // 000F NE R6 R5 R6 - 0x781A0007, // 0010 JMPF R6 #0019 - 0x88180107, // 0011 GETMBR R6 R0 K7 - 0x20180A06, // 0012 NE R6 R5 R6 - 0x781A0003, // 0013 JMPF R6 #0018 - 0x8C180108, // 0014 GETMET R6 R0 K8 - 0x54220101, // 0015 LDINT R8 258 - 0x5426000E, // 0016 LDINT R9 15 - 0x7C180600, // 0017 CALL R6 3 - 0x90020E05, // 0018 SETMBR R0 K7 R5 - 0x60100003, // 0019 GETGBL R4 G3 - 0x5C140000, // 001A MOVE R5 R0 - 0x7C100200, // 001B CALL R4 1 - 0x8C100909, // 001C GETMET R4 R4 K9 - 0x5C180200, // 001D MOVE R6 R1 - 0x7C100400, // 001E CALL R4 2 - 0x80000000, // 001F RET 0 + ( &(const binstruction[31]) { /* code */ + 0x60080008, // 0000 GETGBL R2 G8 + 0x880C0101, // 0001 GETMBR R3 R0 K1 + 0x000C0702, // 0002 ADD R3 R3 K2 + 0x7C080200, // 0003 CALL R2 1 + 0x000A0002, // 0004 ADD R2 K0 R2 + 0x8C0C0303, // 0005 GETMET R3 R1 K3 + 0x5C140400, // 0006 MOVE R5 R2 + 0x7C0C0400, // 0007 CALL R3 2 + 0x780E000E, // 0008 JMPF R3 #0018 + 0x940C0202, // 0009 GETIDX R3 R1 R2 + 0x8C100704, // 000A GETMET R4 R3 K4 + 0x58180005, // 000B LDCONST R6 K5 + 0x7C100400, // 000C CALL R4 2 + 0x4C140000, // 000D LDNIL R5 + 0x20140805, // 000E NE R5 R4 R5 + 0x78160007, // 000F JMPF R5 #0018 + 0x88140106, // 0010 GETMBR R5 R0 K6 + 0x20140805, // 0011 NE R5 R4 R5 + 0x78160003, // 0012 JMPF R5 #0017 + 0x8C140107, // 0013 GETMET R5 R0 K7 + 0x541E0101, // 0014 LDINT R7 258 + 0x5422000E, // 0015 LDINT R8 15 + 0x7C140600, // 0016 CALL R5 3 + 0x90020C04, // 0017 SETMBR R0 K6 R4 + 0x600C0003, // 0018 GETGBL R3 G3 + 0x5C100000, // 0019 MOVE R4 R0 + 0x7C0C0200, // 001A CALL R3 1 + 0x8C0C0708, // 001B GETMET R3 R3 K8 + 0x5C140200, // 001C MOVE R5 R1 + 0x7C0C0400, // 001D CALL R3 2 + 0x80000000, // 001E RET 0 }) ) ); diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Session.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Session.h index c44344ce3..b65e1f6fd 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Session.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Session.h @@ -11,7 +11,7 @@ extern const bclass be_class_Matter_Session; ********************************************************************/ be_local_closure(Matter_Session_before_remove, /* name */ be_nested_proto( - 8, /* nstack */ + 6, /* nstack */ 1, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -19,28 +19,25 @@ be_local_closure(Matter_Session_before_remove, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[ 7]) { /* constants */ - /* K0 */ be_nested_str_weak(string), - /* K1 */ be_nested_str_weak(tasmota), - /* K2 */ be_nested_str_weak(log), - /* K3 */ be_nested_str_weak(format), - /* K4 */ be_nested_str_weak(MTR_X3A_X20_X2DSession_X20_X20_X20_X28_X256i_X29_X20_X28removed_X29), - /* K5 */ be_nested_str_weak(local_session_id), - /* K6 */ be_const_int(3), + ( &(const bvalue[ 5]) { /* constants */ + /* K0 */ be_nested_str_weak(tasmota), + /* K1 */ be_nested_str_weak(log), + /* K2 */ be_nested_str_weak(MTR_X3A_X20_X2DSession_X20_X20_X20_X28_X256i_X29_X20_X28removed_X29), + /* K3 */ be_nested_str_weak(local_session_id), + /* K4 */ be_const_int(3), }), be_str_weak(before_remove), &be_const_str_solidified, - ( &(const binstruction[10]) { /* code */ - 0xA4060000, // 0000 IMPORT R1 K0 - 0xB80A0200, // 0001 GETNGBL R2 K1 - 0x8C080502, // 0002 GETMET R2 R2 K2 - 0x8C100303, // 0003 GETMET R4 R1 K3 - 0x58180004, // 0004 LDCONST R6 K4 - 0x881C0105, // 0005 GETMBR R7 R0 K5 - 0x7C100600, // 0006 CALL R4 3 - 0x58140006, // 0007 LDCONST R5 K6 - 0x7C080600, // 0008 CALL R2 3 - 0x80000000, // 0009 RET 0 + ( &(const binstruction[ 9]) { /* code */ + 0xB8060000, // 0000 GETNGBL R1 K0 + 0x8C040301, // 0001 GETMET R1 R1 K1 + 0x600C0018, // 0002 GETGBL R3 G24 + 0x58100002, // 0003 LDCONST R4 K2 + 0x88140103, // 0004 GETMBR R5 R0 K3 + 0x7C0C0400, // 0005 CALL R3 2 + 0x58100004, // 0006 LDCONST R4 K4 + 0x7C040600, // 0007 CALL R1 3 + 0x80000000, // 0008 RET 0 }) ) ); @@ -406,7 +403,7 @@ be_local_closure(Matter_Session_get_r2i, /* name */ ********************************************************************/ be_local_closure(Matter_Session_tojson, /* name */ be_nested_proto( - 18, /* nstack */ + 16, /* nstack */ 1, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -414,131 +411,128 @@ be_local_closure(Matter_Session_tojson, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[24]) { /* constants */ + ( &(const bvalue[22]) { /* constants */ /* K0 */ be_nested_str_weak(json), - /* K1 */ be_nested_str_weak(string), - /* K2 */ be_nested_str_weak(introspect), - /* K3 */ be_nested_str_weak(persist_pre), - /* K4 */ be_nested_str_weak(members), - /* K5 */ be_nested_str_weak(get), - /* K6 */ be_nested_str_weak(function), - /* K7 */ be_const_int(0), - /* K8 */ be_nested_str_weak(_), - /* K9 */ be_nested_str_weak(push), - /* K10 */ be_nested_str_weak(stop_iteration), - /* K11 */ be_nested_str_weak(matter), - /* K12 */ be_nested_str_weak(sort), - /* K13 */ be_nested_str_weak(_X24_X24), - /* K14 */ be_nested_str_weak(tob64), - /* K15 */ be_nested_str_weak(instance), - /* K16 */ be_nested_str_weak(format), - /* K17 */ be_nested_str_weak(_X25s_X3A_X25s), - /* K18 */ be_nested_str_weak(dump), - /* K19 */ be_nested_str_weak(persist_post), - /* K20 */ be_nested_str_weak(_X7B), - /* K21 */ be_nested_str_weak(concat), - /* K22 */ be_nested_str_weak(_X2C), - /* K23 */ be_nested_str_weak(_X7D), + /* K1 */ be_nested_str_weak(introspect), + /* K2 */ be_nested_str_weak(persist_pre), + /* K3 */ be_nested_str_weak(members), + /* K4 */ be_nested_str_weak(get), + /* K5 */ be_nested_str_weak(function), + /* K6 */ be_const_int(0), + /* K7 */ be_nested_str_weak(_), + /* K8 */ be_nested_str_weak(push), + /* K9 */ be_nested_str_weak(stop_iteration), + /* K10 */ be_nested_str_weak(matter), + /* K11 */ be_nested_str_weak(sort), + /* K12 */ be_nested_str_weak(_X24_X24), + /* K13 */ be_nested_str_weak(tob64), + /* K14 */ be_nested_str_weak(instance), + /* K15 */ be_nested_str_weak(_X25s_X3A_X25s), + /* K16 */ be_nested_str_weak(dump), + /* K17 */ be_nested_str_weak(persist_post), + /* K18 */ be_nested_str_weak(_X7B), + /* K19 */ be_nested_str_weak(concat), + /* K20 */ be_nested_str_weak(_X2C), + /* K21 */ be_nested_str_weak(_X7D), }), be_str_weak(tojson), &be_const_str_solidified, - ( &(const binstruction[96]) { /* code */ + ( &(const binstruction[95]) { /* code */ 0xA4060000, // 0000 IMPORT R1 K0 0xA40A0200, // 0001 IMPORT R2 K1 - 0xA40E0400, // 0002 IMPORT R3 K2 - 0x8C100103, // 0003 GETMET R4 R0 K3 - 0x7C100200, // 0004 CALL R4 1 - 0x60100012, // 0005 GETGBL R4 G18 - 0x7C100000, // 0006 CALL R4 0 - 0x60140010, // 0007 GETGBL R5 G16 - 0x8C180704, // 0008 GETMET R6 R3 K4 - 0x5C200000, // 0009 MOVE R8 R0 - 0x7C180400, // 000A CALL R6 2 - 0x7C140200, // 000B CALL R5 1 - 0xA8020011, // 000C EXBLK 0 #001F - 0x5C180A00, // 000D MOVE R6 R5 - 0x7C180000, // 000E CALL R6 0 - 0x8C1C0705, // 000F GETMET R7 R3 K5 - 0x5C240000, // 0010 MOVE R9 R0 - 0x5C280C00, // 0011 MOVE R10 R6 - 0x7C1C0600, // 0012 CALL R7 3 - 0x60200004, // 0013 GETGBL R8 G4 - 0x5C240E00, // 0014 MOVE R9 R7 - 0x7C200200, // 0015 CALL R8 1 - 0x20201106, // 0016 NE R8 R8 K6 - 0x78220005, // 0017 JMPF R8 #001E - 0x94200D07, // 0018 GETIDX R8 R6 K7 - 0x20201108, // 0019 NE R8 R8 K8 - 0x78220002, // 001A JMPF R8 #001E - 0x8C200909, // 001B GETMET R8 R4 K9 - 0x5C280C00, // 001C MOVE R10 R6 - 0x7C200400, // 001D CALL R8 2 - 0x7001FFED, // 001E JMP #000D - 0x5814000A, // 001F LDCONST R5 K10 - 0xAC140200, // 0020 CATCH R5 1 0 - 0xB0080000, // 0021 RAISE 2 R0 R0 - 0xB8161600, // 0022 GETNGBL R5 K11 - 0x8C140B0C, // 0023 GETMET R5 R5 K12 - 0x5C1C0800, // 0024 MOVE R7 R4 - 0x7C140400, // 0025 CALL R5 2 - 0x5C100A00, // 0026 MOVE R4 R5 - 0x60140012, // 0027 GETGBL R5 G18 - 0x7C140000, // 0028 CALL R5 0 - 0x60180010, // 0029 GETGBL R6 G16 - 0x5C1C0800, // 002A MOVE R7 R4 - 0x7C180200, // 002B CALL R6 1 - 0xA8020027, // 002C EXBLK 0 #0055 - 0x5C1C0C00, // 002D MOVE R7 R6 - 0x7C1C0000, // 002E CALL R7 0 - 0x8C200705, // 002F GETMET R8 R3 K5 - 0x5C280000, // 0030 MOVE R10 R0 - 0x5C2C0E00, // 0031 MOVE R11 R7 - 0x7C200600, // 0032 CALL R8 3 - 0x4C240000, // 0033 LDNIL R9 - 0x1C241009, // 0034 EQ R9 R8 R9 - 0x78260000, // 0035 JMPF R9 #0037 - 0x7001FFF5, // 0036 JMP #002D - 0x6024000F, // 0037 GETGBL R9 G15 - 0x5C281000, // 0038 MOVE R10 R8 - 0x602C0015, // 0039 GETGBL R11 G21 - 0x7C240400, // 003A CALL R9 2 - 0x78260004, // 003B JMPF R9 #0041 - 0x8C24110E, // 003C GETMET R9 R8 K14 - 0x7C240200, // 003D CALL R9 1 - 0x00261A09, // 003E ADD R9 K13 R9 - 0x5C201200, // 003F MOVE R8 R9 - 0x70020005, // 0040 JMP #0047 - 0x60240004, // 0041 GETGBL R9 G4 - 0x5C281000, // 0042 MOVE R10 R8 - 0x7C240200, // 0043 CALL R9 1 - 0x1C24130F, // 0044 EQ R9 R9 K15 - 0x78260000, // 0045 JMPF R9 #0047 - 0x7001FFE5, // 0046 JMP #002D - 0x8C240B09, // 0047 GETMET R9 R5 K9 - 0x8C2C0510, // 0048 GETMET R11 R2 K16 - 0x58340011, // 0049 LDCONST R13 K17 - 0x8C380312, // 004A GETMET R14 R1 K18 - 0x60400008, // 004B GETGBL R16 G8 - 0x5C440E00, // 004C MOVE R17 R7 - 0x7C400200, // 004D CALL R16 1 - 0x7C380400, // 004E CALL R14 2 - 0x8C3C0312, // 004F GETMET R15 R1 K18 - 0x5C441000, // 0050 MOVE R17 R8 - 0x7C3C0400, // 0051 CALL R15 2 - 0x7C2C0800, // 0052 CALL R11 4 - 0x7C240400, // 0053 CALL R9 2 - 0x7001FFD7, // 0054 JMP #002D - 0x5818000A, // 0055 LDCONST R6 K10 - 0xAC180200, // 0056 CATCH R6 1 0 - 0xB0080000, // 0057 RAISE 2 R0 R0 - 0x8C180113, // 0058 GETMET R6 R0 K19 - 0x7C180200, // 0059 CALL R6 1 - 0x8C180B15, // 005A GETMET R6 R5 K21 - 0x58200016, // 005B LDCONST R8 K22 - 0x7C180400, // 005C CALL R6 2 - 0x001A2806, // 005D ADD R6 K20 R6 - 0x00180D17, // 005E ADD R6 R6 K23 - 0x80040C00, // 005F RET 1 R6 + 0x8C0C0102, // 0002 GETMET R3 R0 K2 + 0x7C0C0200, // 0003 CALL R3 1 + 0x600C0012, // 0004 GETGBL R3 G18 + 0x7C0C0000, // 0005 CALL R3 0 + 0x60100010, // 0006 GETGBL R4 G16 + 0x8C140503, // 0007 GETMET R5 R2 K3 + 0x5C1C0000, // 0008 MOVE R7 R0 + 0x7C140400, // 0009 CALL R5 2 + 0x7C100200, // 000A CALL R4 1 + 0xA8020011, // 000B EXBLK 0 #001E + 0x5C140800, // 000C MOVE R5 R4 + 0x7C140000, // 000D CALL R5 0 + 0x8C180504, // 000E GETMET R6 R2 K4 + 0x5C200000, // 000F MOVE R8 R0 + 0x5C240A00, // 0010 MOVE R9 R5 + 0x7C180600, // 0011 CALL R6 3 + 0x601C0004, // 0012 GETGBL R7 G4 + 0x5C200C00, // 0013 MOVE R8 R6 + 0x7C1C0200, // 0014 CALL R7 1 + 0x201C0F05, // 0015 NE R7 R7 K5 + 0x781E0005, // 0016 JMPF R7 #001D + 0x941C0B06, // 0017 GETIDX R7 R5 K6 + 0x201C0F07, // 0018 NE R7 R7 K7 + 0x781E0002, // 0019 JMPF R7 #001D + 0x8C1C0708, // 001A GETMET R7 R3 K8 + 0x5C240A00, // 001B MOVE R9 R5 + 0x7C1C0400, // 001C CALL R7 2 + 0x7001FFED, // 001D JMP #000C + 0x58100009, // 001E LDCONST R4 K9 + 0xAC100200, // 001F CATCH R4 1 0 + 0xB0080000, // 0020 RAISE 2 R0 R0 + 0xB8121400, // 0021 GETNGBL R4 K10 + 0x8C10090B, // 0022 GETMET R4 R4 K11 + 0x5C180600, // 0023 MOVE R6 R3 + 0x7C100400, // 0024 CALL R4 2 + 0x5C0C0800, // 0025 MOVE R3 R4 + 0x60100012, // 0026 GETGBL R4 G18 + 0x7C100000, // 0027 CALL R4 0 + 0x60140010, // 0028 GETGBL R5 G16 + 0x5C180600, // 0029 MOVE R6 R3 + 0x7C140200, // 002A CALL R5 1 + 0xA8020027, // 002B EXBLK 0 #0054 + 0x5C180A00, // 002C MOVE R6 R5 + 0x7C180000, // 002D CALL R6 0 + 0x8C1C0504, // 002E GETMET R7 R2 K4 + 0x5C240000, // 002F MOVE R9 R0 + 0x5C280C00, // 0030 MOVE R10 R6 + 0x7C1C0600, // 0031 CALL R7 3 + 0x4C200000, // 0032 LDNIL R8 + 0x1C200E08, // 0033 EQ R8 R7 R8 + 0x78220000, // 0034 JMPF R8 #0036 + 0x7001FFF5, // 0035 JMP #002C + 0x6020000F, // 0036 GETGBL R8 G15 + 0x5C240E00, // 0037 MOVE R9 R7 + 0x60280015, // 0038 GETGBL R10 G21 + 0x7C200400, // 0039 CALL R8 2 + 0x78220004, // 003A JMPF R8 #0040 + 0x8C200F0D, // 003B GETMET R8 R7 K13 + 0x7C200200, // 003C CALL R8 1 + 0x00221808, // 003D ADD R8 K12 R8 + 0x5C1C1000, // 003E MOVE R7 R8 + 0x70020005, // 003F JMP #0046 + 0x60200004, // 0040 GETGBL R8 G4 + 0x5C240E00, // 0041 MOVE R9 R7 + 0x7C200200, // 0042 CALL R8 1 + 0x1C20110E, // 0043 EQ R8 R8 K14 + 0x78220000, // 0044 JMPF R8 #0046 + 0x7001FFE5, // 0045 JMP #002C + 0x8C200908, // 0046 GETMET R8 R4 K8 + 0x60280018, // 0047 GETGBL R10 G24 + 0x582C000F, // 0048 LDCONST R11 K15 + 0x8C300310, // 0049 GETMET R12 R1 K16 + 0x60380008, // 004A GETGBL R14 G8 + 0x5C3C0C00, // 004B MOVE R15 R6 + 0x7C380200, // 004C CALL R14 1 + 0x7C300400, // 004D CALL R12 2 + 0x8C340310, // 004E GETMET R13 R1 K16 + 0x5C3C0E00, // 004F MOVE R15 R7 + 0x7C340400, // 0050 CALL R13 2 + 0x7C280600, // 0051 CALL R10 3 + 0x7C200400, // 0052 CALL R8 2 + 0x7001FFD7, // 0053 JMP #002C + 0x58140009, // 0054 LDCONST R5 K9 + 0xAC140200, // 0055 CATCH R5 1 0 + 0xB0080000, // 0056 RAISE 2 R0 R0 + 0x8C140111, // 0057 GETMET R5 R0 K17 + 0x7C140200, // 0058 CALL R5 1 + 0x8C140913, // 0059 GETMET R5 R4 K19 + 0x581C0014, // 005A LDCONST R7 K20 + 0x7C140400, // 005B CALL R5 2 + 0x00162405, // 005C ADD R5 K18 R5 + 0x00140B15, // 005D ADD R5 R5 K21 + 0x80040A00, // 005E RET 1 R5 }) ) ); @@ -1535,7 +1529,7 @@ be_local_closure(Matter_Session_get_ac, /* name */ ********************************************************************/ be_local_closure(Matter_Session_counter_snd_next, /* name */ be_nested_proto( - 7, /* nstack */ + 6, /* nstack */ 1, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -1543,41 +1537,39 @@ be_local_closure(Matter_Session_counter_snd_next, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[10]) { /* constants */ - /* K0 */ be_nested_str_weak(string), - /* K1 */ be_nested_str_weak(_counter_snd_impl), - /* K2 */ be_nested_str_weak(next), - /* K3 */ be_nested_str_weak(matter), - /* K4 */ be_nested_str_weak(Counter), - /* K5 */ be_nested_str_weak(is_greater), - /* K6 */ be_nested_str_weak(counter_snd), - /* K7 */ be_nested_str_weak(_COUNTER_SND_INCR), - /* K8 */ be_nested_str_weak(does_persist), - /* K9 */ be_nested_str_weak(save), + ( &(const bvalue[ 9]) { /* constants */ + /* K0 */ be_nested_str_weak(_counter_snd_impl), + /* K1 */ be_nested_str_weak(next), + /* K2 */ be_nested_str_weak(matter), + /* K3 */ be_nested_str_weak(Counter), + /* K4 */ be_nested_str_weak(is_greater), + /* K5 */ be_nested_str_weak(counter_snd), + /* K6 */ be_nested_str_weak(_COUNTER_SND_INCR), + /* K7 */ be_nested_str_weak(does_persist), + /* K8 */ be_nested_str_weak(save), }), be_str_weak(counter_snd_next), &be_const_str_solidified, - ( &(const binstruction[20]) { /* code */ - 0xA4060000, // 0000 IMPORT R1 K0 - 0x88080101, // 0001 GETMBR R2 R0 K1 - 0x8C080502, // 0002 GETMET R2 R2 K2 - 0x7C080200, // 0003 CALL R2 1 - 0xB80E0600, // 0004 GETNGBL R3 K3 - 0x880C0704, // 0005 GETMBR R3 R3 K4 - 0x8C0C0705, // 0006 GETMET R3 R3 K5 - 0x5C140400, // 0007 MOVE R5 R2 - 0x88180106, // 0008 GETMBR R6 R0 K6 - 0x7C0C0600, // 0009 CALL R3 3 - 0x780E0007, // 000A JMPF R3 #0013 - 0x880C0107, // 000B GETMBR R3 R0 K7 - 0x000C0403, // 000C ADD R3 R2 R3 - 0x90020C03, // 000D SETMBR R0 K6 R3 - 0x8C0C0108, // 000E GETMET R3 R0 K8 - 0x7C0C0200, // 000F CALL R3 1 - 0x780E0001, // 0010 JMPF R3 #0013 - 0x8C0C0109, // 0011 GETMET R3 R0 K9 - 0x7C0C0200, // 0012 CALL R3 1 - 0x80040400, // 0013 RET 1 R2 + ( &(const binstruction[19]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x8C040301, // 0001 GETMET R1 R1 K1 + 0x7C040200, // 0002 CALL R1 1 + 0xB80A0400, // 0003 GETNGBL R2 K2 + 0x88080503, // 0004 GETMBR R2 R2 K3 + 0x8C080504, // 0005 GETMET R2 R2 K4 + 0x5C100200, // 0006 MOVE R4 R1 + 0x88140105, // 0007 GETMBR R5 R0 K5 + 0x7C080600, // 0008 CALL R2 3 + 0x780A0007, // 0009 JMPF R2 #0012 + 0x88080106, // 000A GETMBR R2 R0 K6 + 0x00080202, // 000B ADD R2 R1 R2 + 0x90020A02, // 000C SETMBR R0 K5 R2 + 0x8C080107, // 000D GETMET R2 R0 K7 + 0x7C080200, // 000E CALL R2 1 + 0x780A0001, // 000F JMPF R2 #0012 + 0x8C080108, // 0010 GETMET R2 R0 K8 + 0x7C080200, // 0011 CALL R2 1 + 0x80040200, // 0012 RET 1 R1 }) ) ); diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Session_Store.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Session_Store.h index 8cf3022f2..13f83bca6 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Session_Store.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Session_Store.h @@ -332,7 +332,7 @@ be_local_closure(Matter_Session_Store_next_fabric_idx, /* name */ ********************************************************************/ be_local_closure(Matter_Session_Store_load_fabrics, /* name */ be_nested_proto( - 17, /* nstack */ + 16, /* nstack */ 1, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -340,158 +340,155 @@ be_local_closure(Matter_Session_Store_load_fabrics, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[29]) { /* constants */ - /* K0 */ be_nested_str_weak(string), - /* K1 */ be_nested_str_weak(sessions), - /* K2 */ be_nested_str_weak(matter), - /* K3 */ be_nested_str_weak(Expirable_list), - /* K4 */ be_nested_str_weak(fabrics), - /* K5 */ be_nested_str_weak(_FABRICS), - /* K6 */ be_nested_str_weak(read), - /* K7 */ be_nested_str_weak(close), - /* K8 */ be_nested_str_weak(json), - /* K9 */ be_nested_str_weak(load), - /* K10 */ be_nested_str_weak(tasmota), - /* K11 */ be_nested_str_weak(gc), - /* K12 */ be_nested_str_weak(Fabric), - /* K13 */ be_nested_str_weak(fromjson), - /* K14 */ be_nested_str_weak(set_no_expiration), - /* K15 */ be_nested_str_weak(set_persist), - /* K16 */ be_nested_str_weak(find), - /* K17 */ be_nested_str_weak(_sessions), - /* K18 */ be_nested_str_weak(Session), - /* K19 */ be_nested_str_weak(add_session), - /* K20 */ be_nested_str_weak(stop_iteration), - /* K21 */ be_nested_str_weak(push), - /* K22 */ be_nested_str_weak(log), - /* K23 */ be_nested_str_weak(format), - /* K24 */ be_nested_str_weak(MTR_X3A_X20Loaded_X20_X25i_X20fabric_X28s_X29), - /* K25 */ be_const_int(2), - /* K26 */ be_nested_str_weak(io_error), - /* K27 */ be_nested_str_weak(MTR_X3A_X20Session_Store_X3A_X3Aload_X20Exception_X3A), - /* K28 */ be_nested_str_weak(_X7C), + ( &(const bvalue[27]) { /* constants */ + /* K0 */ be_nested_str_weak(sessions), + /* K1 */ be_nested_str_weak(matter), + /* K2 */ be_nested_str_weak(Expirable_list), + /* K3 */ be_nested_str_weak(fabrics), + /* K4 */ be_nested_str_weak(_FABRICS), + /* K5 */ be_nested_str_weak(read), + /* K6 */ be_nested_str_weak(close), + /* K7 */ be_nested_str_weak(json), + /* K8 */ be_nested_str_weak(load), + /* K9 */ be_nested_str_weak(tasmota), + /* K10 */ be_nested_str_weak(gc), + /* K11 */ be_nested_str_weak(Fabric), + /* K12 */ be_nested_str_weak(fromjson), + /* K13 */ be_nested_str_weak(set_no_expiration), + /* K14 */ be_nested_str_weak(set_persist), + /* K15 */ be_nested_str_weak(find), + /* K16 */ be_nested_str_weak(_sessions), + /* K17 */ be_nested_str_weak(Session), + /* K18 */ be_nested_str_weak(add_session), + /* K19 */ be_nested_str_weak(stop_iteration), + /* K20 */ be_nested_str_weak(push), + /* K21 */ be_nested_str_weak(log), + /* K22 */ be_nested_str_weak(MTR_X3A_X20Loaded_X20_X25i_X20fabric_X28s_X29), + /* K23 */ be_const_int(2), + /* K24 */ be_nested_str_weak(io_error), + /* K25 */ be_nested_str_weak(MTR_X3A_X20Session_Store_X3A_X3Aload_X20Exception_X3A), + /* K26 */ be_nested_str_weak(_X7C), }), be_str_weak(load_fabrics), &be_const_str_solidified, - ( &(const binstruction[118]) { /* code */ - 0xA4060000, // 0000 IMPORT R1 K0 - 0xA802005F, // 0001 EXBLK 0 #0062 - 0xB80A0400, // 0002 GETNGBL R2 K2 - 0x8C080503, // 0003 GETMET R2 R2 K3 - 0x7C080200, // 0004 CALL R2 1 - 0x90020202, // 0005 SETMBR R0 K1 R2 - 0xB80A0400, // 0006 GETNGBL R2 K2 - 0x8C080503, // 0007 GETMET R2 R2 K3 - 0x7C080200, // 0008 CALL R2 1 - 0x90020802, // 0009 SETMBR R0 K4 R2 - 0x60080011, // 000A GETGBL R2 G17 - 0x880C0105, // 000B GETMBR R3 R0 K5 - 0x7C080200, // 000C CALL R2 1 - 0x8C0C0506, // 000D GETMET R3 R2 K6 - 0x7C0C0200, // 000E CALL R3 1 - 0x8C100507, // 000F GETMET R4 R2 K7 - 0x7C100200, // 0010 CALL R4 1 - 0xA4121000, // 0011 IMPORT R4 K8 - 0x8C140909, // 0012 GETMET R5 R4 K9 - 0x5C1C0600, // 0013 MOVE R7 R3 - 0x7C140400, // 0014 CALL R5 2 - 0x4C0C0000, // 0015 LDNIL R3 - 0xB81A1400, // 0016 GETNGBL R6 K10 - 0x8C180D0B, // 0017 GETMET R6 R6 K11 - 0x7C180200, // 0018 CALL R6 1 - 0x60180010, // 0019 GETGBL R6 G16 - 0x5C1C0A00, // 001A MOVE R7 R5 - 0x7C180200, // 001B CALL R6 1 - 0xA8020035, // 001C EXBLK 0 #0053 - 0x5C1C0C00, // 001D MOVE R7 R6 - 0x7C1C0000, // 001E CALL R7 0 - 0xB8220400, // 001F GETNGBL R8 K2 - 0x8820110C, // 0020 GETMBR R8 R8 K12 - 0x8C20110D, // 0021 GETMET R8 R8 K13 - 0x5C280000, // 0022 MOVE R10 R0 - 0x5C2C0E00, // 0023 MOVE R11 R7 - 0x7C200600, // 0024 CALL R8 3 - 0x8C24110E, // 0025 GETMET R9 R8 K14 - 0x7C240200, // 0026 CALL R9 1 - 0x8C24110F, // 0027 GETMET R9 R8 K15 - 0x502C0200, // 0028 LDBOOL R11 1 0 - 0x7C240400, // 0029 CALL R9 2 - 0x8C240F10, // 002A GETMET R9 R7 K16 - 0x582C0011, // 002B LDCONST R11 K17 - 0x60300012, // 002C GETGBL R12 G18 - 0x7C300000, // 002D CALL R12 0 - 0x7C240600, // 002E CALL R9 3 - 0x60280010, // 002F GETGBL R10 G16 - 0x5C2C1200, // 0030 MOVE R11 R9 - 0x7C280200, // 0031 CALL R10 1 - 0xA8020017, // 0032 EXBLK 0 #004B - 0x5C2C1400, // 0033 MOVE R11 R10 - 0x7C2C0000, // 0034 CALL R11 0 - 0xB8320400, // 0035 GETNGBL R12 K2 - 0x88301912, // 0036 GETMBR R12 R12 K18 - 0x8C30190D, // 0037 GETMET R12 R12 K13 - 0x5C380000, // 0038 MOVE R14 R0 - 0x5C3C1600, // 0039 MOVE R15 R11 - 0x5C401000, // 003A MOVE R16 R8 - 0x7C300800, // 003B CALL R12 4 - 0x4C340000, // 003C LDNIL R13 - 0x2034180D, // 003D NE R13 R12 R13 - 0x7836000A, // 003E JMPF R13 #004A - 0x8C34190E, // 003F GETMET R13 R12 K14 - 0x7C340200, // 0040 CALL R13 1 - 0x8C34190F, // 0041 GETMET R13 R12 K15 - 0x503C0200, // 0042 LDBOOL R15 1 0 - 0x7C340400, // 0043 CALL R13 2 - 0x8C340113, // 0044 GETMET R13 R0 K19 - 0x5C3C1800, // 0045 MOVE R15 R12 - 0x7C340400, // 0046 CALL R13 2 - 0x8C341113, // 0047 GETMET R13 R8 K19 - 0x5C3C1800, // 0048 MOVE R15 R12 - 0x7C340400, // 0049 CALL R13 2 - 0x7001FFE7, // 004A JMP #0033 - 0x58280014, // 004B LDCONST R10 K20 - 0xAC280200, // 004C CATCH R10 1 0 - 0xB0080000, // 004D RAISE 2 R0 R0 - 0x88280104, // 004E GETMBR R10 R0 K4 - 0x8C281515, // 004F GETMET R10 R10 K21 - 0x5C301000, // 0050 MOVE R12 R8 - 0x7C280400, // 0051 CALL R10 2 - 0x7001FFC9, // 0052 JMP #001D - 0x58180014, // 0053 LDCONST R6 K20 - 0xAC180200, // 0054 CATCH R6 1 0 - 0xB0080000, // 0055 RAISE 2 R0 R0 - 0xB81A1400, // 0056 GETNGBL R6 K10 - 0x8C180D16, // 0057 GETMET R6 R6 K22 - 0x8C200317, // 0058 GETMET R8 R1 K23 - 0x58280018, // 0059 LDCONST R10 K24 - 0x602C000C, // 005A GETGBL R11 G12 - 0x88300104, // 005B GETMBR R12 R0 K4 - 0x7C2C0200, // 005C CALL R11 1 - 0x7C200600, // 005D CALL R8 3 - 0x58240019, // 005E LDCONST R9 K25 - 0x7C180600, // 005F CALL R6 3 - 0xA8040001, // 0060 EXBLK 1 1 - 0x70020012, // 0061 JMP #0075 - 0xAC080002, // 0062 CATCH R2 0 2 - 0x7002000F, // 0063 JMP #0074 - 0x2010051A, // 0064 NE R4 R2 K26 - 0x7812000C, // 0065 JMPF R4 #0073 - 0xB8121400, // 0066 GETNGBL R4 K10 - 0x8C100916, // 0067 GETMET R4 R4 K22 - 0x60180008, // 0068 GETGBL R6 G8 - 0x5C1C0400, // 0069 MOVE R7 R2 - 0x7C180200, // 006A CALL R6 1 - 0x001A3606, // 006B ADD R6 K27 R6 - 0x00180D1C, // 006C ADD R6 R6 K28 - 0x601C0008, // 006D GETGBL R7 G8 - 0x5C200600, // 006E MOVE R8 R3 - 0x7C1C0200, // 006F CALL R7 1 - 0x00180C07, // 0070 ADD R6 R6 R7 - 0x581C0019, // 0071 LDCONST R7 K25 - 0x7C100600, // 0072 CALL R4 3 - 0x70020000, // 0073 JMP #0075 - 0xB0080000, // 0074 RAISE 2 R0 R0 - 0x80000000, // 0075 RET 0 + ( &(const binstruction[117]) { /* code */ + 0xA802005F, // 0000 EXBLK 0 #0061 + 0xB8060200, // 0001 GETNGBL R1 K1 + 0x8C040302, // 0002 GETMET R1 R1 K2 + 0x7C040200, // 0003 CALL R1 1 + 0x90020001, // 0004 SETMBR R0 K0 R1 + 0xB8060200, // 0005 GETNGBL R1 K1 + 0x8C040302, // 0006 GETMET R1 R1 K2 + 0x7C040200, // 0007 CALL R1 1 + 0x90020601, // 0008 SETMBR R0 K3 R1 + 0x60040011, // 0009 GETGBL R1 G17 + 0x88080104, // 000A GETMBR R2 R0 K4 + 0x7C040200, // 000B CALL R1 1 + 0x8C080305, // 000C GETMET R2 R1 K5 + 0x7C080200, // 000D CALL R2 1 + 0x8C0C0306, // 000E GETMET R3 R1 K6 + 0x7C0C0200, // 000F CALL R3 1 + 0xA40E0E00, // 0010 IMPORT R3 K7 + 0x8C100708, // 0011 GETMET R4 R3 K8 + 0x5C180400, // 0012 MOVE R6 R2 + 0x7C100400, // 0013 CALL R4 2 + 0x4C080000, // 0014 LDNIL R2 + 0xB8161200, // 0015 GETNGBL R5 K9 + 0x8C140B0A, // 0016 GETMET R5 R5 K10 + 0x7C140200, // 0017 CALL R5 1 + 0x60140010, // 0018 GETGBL R5 G16 + 0x5C180800, // 0019 MOVE R6 R4 + 0x7C140200, // 001A CALL R5 1 + 0xA8020035, // 001B EXBLK 0 #0052 + 0x5C180A00, // 001C MOVE R6 R5 + 0x7C180000, // 001D CALL R6 0 + 0xB81E0200, // 001E GETNGBL R7 K1 + 0x881C0F0B, // 001F GETMBR R7 R7 K11 + 0x8C1C0F0C, // 0020 GETMET R7 R7 K12 + 0x5C240000, // 0021 MOVE R9 R0 + 0x5C280C00, // 0022 MOVE R10 R6 + 0x7C1C0600, // 0023 CALL R7 3 + 0x8C200F0D, // 0024 GETMET R8 R7 K13 + 0x7C200200, // 0025 CALL R8 1 + 0x8C200F0E, // 0026 GETMET R8 R7 K14 + 0x50280200, // 0027 LDBOOL R10 1 0 + 0x7C200400, // 0028 CALL R8 2 + 0x8C200D0F, // 0029 GETMET R8 R6 K15 + 0x58280010, // 002A LDCONST R10 K16 + 0x602C0012, // 002B GETGBL R11 G18 + 0x7C2C0000, // 002C CALL R11 0 + 0x7C200600, // 002D CALL R8 3 + 0x60240010, // 002E GETGBL R9 G16 + 0x5C281000, // 002F MOVE R10 R8 + 0x7C240200, // 0030 CALL R9 1 + 0xA8020017, // 0031 EXBLK 0 #004A + 0x5C281200, // 0032 MOVE R10 R9 + 0x7C280000, // 0033 CALL R10 0 + 0xB82E0200, // 0034 GETNGBL R11 K1 + 0x882C1711, // 0035 GETMBR R11 R11 K17 + 0x8C2C170C, // 0036 GETMET R11 R11 K12 + 0x5C340000, // 0037 MOVE R13 R0 + 0x5C381400, // 0038 MOVE R14 R10 + 0x5C3C0E00, // 0039 MOVE R15 R7 + 0x7C2C0800, // 003A CALL R11 4 + 0x4C300000, // 003B LDNIL R12 + 0x2030160C, // 003C NE R12 R11 R12 + 0x7832000A, // 003D JMPF R12 #0049 + 0x8C30170D, // 003E GETMET R12 R11 K13 + 0x7C300200, // 003F CALL R12 1 + 0x8C30170E, // 0040 GETMET R12 R11 K14 + 0x50380200, // 0041 LDBOOL R14 1 0 + 0x7C300400, // 0042 CALL R12 2 + 0x8C300112, // 0043 GETMET R12 R0 K18 + 0x5C381600, // 0044 MOVE R14 R11 + 0x7C300400, // 0045 CALL R12 2 + 0x8C300F12, // 0046 GETMET R12 R7 K18 + 0x5C381600, // 0047 MOVE R14 R11 + 0x7C300400, // 0048 CALL R12 2 + 0x7001FFE7, // 0049 JMP #0032 + 0x58240013, // 004A LDCONST R9 K19 + 0xAC240200, // 004B CATCH R9 1 0 + 0xB0080000, // 004C RAISE 2 R0 R0 + 0x88240103, // 004D GETMBR R9 R0 K3 + 0x8C241314, // 004E GETMET R9 R9 K20 + 0x5C2C0E00, // 004F MOVE R11 R7 + 0x7C240400, // 0050 CALL R9 2 + 0x7001FFC9, // 0051 JMP #001C + 0x58140013, // 0052 LDCONST R5 K19 + 0xAC140200, // 0053 CATCH R5 1 0 + 0xB0080000, // 0054 RAISE 2 R0 R0 + 0xB8161200, // 0055 GETNGBL R5 K9 + 0x8C140B15, // 0056 GETMET R5 R5 K21 + 0x601C0018, // 0057 GETGBL R7 G24 + 0x58200016, // 0058 LDCONST R8 K22 + 0x6024000C, // 0059 GETGBL R9 G12 + 0x88280103, // 005A GETMBR R10 R0 K3 + 0x7C240200, // 005B CALL R9 1 + 0x7C1C0400, // 005C CALL R7 2 + 0x58200017, // 005D LDCONST R8 K23 + 0x7C140600, // 005E CALL R5 3 + 0xA8040001, // 005F EXBLK 1 1 + 0x70020012, // 0060 JMP #0074 + 0xAC040002, // 0061 CATCH R1 0 2 + 0x7002000F, // 0062 JMP #0073 + 0x200C0318, // 0063 NE R3 R1 K24 + 0x780E000C, // 0064 JMPF R3 #0072 + 0xB80E1200, // 0065 GETNGBL R3 K9 + 0x8C0C0715, // 0066 GETMET R3 R3 K21 + 0x60140008, // 0067 GETGBL R5 G8 + 0x5C180200, // 0068 MOVE R6 R1 + 0x7C140200, // 0069 CALL R5 1 + 0x00163205, // 006A ADD R5 K25 R5 + 0x00140B1A, // 006B ADD R5 R5 K26 + 0x60180008, // 006C GETGBL R6 G8 + 0x5C1C0400, // 006D MOVE R7 R2 + 0x7C180200, // 006E CALL R6 1 + 0x00140A06, // 006F ADD R5 R5 R6 + 0x58180017, // 0070 LDCONST R6 K23 + 0x7C0C0600, // 0071 CALL R3 3 + 0x70020000, // 0072 JMP #0074 + 0xB0080000, // 0073 RAISE 2 R0 R0 + 0x80000000, // 0074 RET 0 }) ) ); @@ -1088,7 +1085,7 @@ be_local_closure(Matter_Session_Store_sessions_active, /* name */ ********************************************************************/ be_local_closure(Matter_Session_Store_find_session_by_resumption_id, /* name */ be_nested_proto( - 14, /* nstack */ + 12, /* nstack */ 2, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -1096,61 +1093,58 @@ be_local_closure(Matter_Session_Store_find_session_by_resumption_id, /* name * 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[11]) { /* constants */ - /* K0 */ be_nested_str_weak(string), - /* K1 */ be_const_int(0), - /* K2 */ be_nested_str_weak(sessions), - /* K3 */ be_nested_str_weak(tasmota), - /* K4 */ be_nested_str_weak(log), - /* K5 */ be_nested_str_weak(format), - /* K6 */ be_nested_str_weak(MTR_X3A_X20session_X2Eresumption_id_X3D_X25s_X20vs_X20_X25s), - /* K7 */ be_nested_str_weak(resumption_id), - /* K8 */ be_nested_str_weak(shared_secret), - /* K9 */ be_nested_str_weak(update), - /* K10 */ be_const_int(1), + ( &(const bvalue[ 9]) { /* constants */ + /* K0 */ be_const_int(0), + /* K1 */ be_nested_str_weak(sessions), + /* K2 */ be_nested_str_weak(tasmota), + /* K3 */ be_nested_str_weak(log), + /* K4 */ be_nested_str_weak(MTR_X3A_X20session_X2Eresumption_id_X3D_X25s_X20vs_X20_X25s), + /* K5 */ be_nested_str_weak(resumption_id), + /* K6 */ be_nested_str_weak(shared_secret), + /* K7 */ be_nested_str_weak(update), + /* K8 */ be_const_int(1), }), be_str_weak(find_session_by_resumption_id), &be_const_str_solidified, - ( &(const binstruction[39]) { /* code */ - 0xA40A0000, // 0000 IMPORT R2 K0 - 0x5C0C0200, // 0001 MOVE R3 R1 - 0x740E0001, // 0002 JMPT R3 #0005 - 0x4C0C0000, // 0003 LDNIL R3 - 0x80040600, // 0004 RET 1 R3 - 0x580C0001, // 0005 LDCONST R3 K1 - 0x88100102, // 0006 GETMBR R4 R0 K2 - 0x6014000C, // 0007 GETGBL R5 G12 - 0x5C180800, // 0008 MOVE R6 R4 - 0x7C140200, // 0009 CALL R5 1 - 0x14140605, // 000A LT R5 R3 R5 - 0x78160019, // 000B JMPF R5 #0026 - 0x94140803, // 000C GETIDX R5 R4 R3 - 0xB81A0600, // 000D GETNGBL R6 K3 - 0x8C180D04, // 000E GETMET R6 R6 K4 - 0x8C200505, // 000F GETMET R8 R2 K5 - 0x58280006, // 0010 LDCONST R10 K6 - 0x602C0008, // 0011 GETGBL R11 G8 - 0x88300B07, // 0012 GETMBR R12 R5 K7 - 0x7C2C0200, // 0013 CALL R11 1 - 0x60300008, // 0014 GETGBL R12 G8 - 0x5C340200, // 0015 MOVE R13 R1 - 0x7C300200, // 0016 CALL R12 1 - 0x7C200800, // 0017 CALL R8 4 - 0x54260003, // 0018 LDINT R9 4 - 0x7C180600, // 0019 CALL R6 3 - 0x88180B07, // 001A GETMBR R6 R5 K7 - 0x1C180C01, // 001B EQ R6 R6 R1 - 0x781A0006, // 001C JMPF R6 #0024 - 0x88180B08, // 001D GETMBR R6 R5 K8 - 0x4C1C0000, // 001E LDNIL R7 - 0x20180C07, // 001F NE R6 R6 R7 - 0x781A0002, // 0020 JMPF R6 #0024 - 0x8C180B09, // 0021 GETMET R6 R5 K9 - 0x7C180200, // 0022 CALL R6 1 - 0x80040A00, // 0023 RET 1 R5 - 0x000C070A, // 0024 ADD R3 R3 K10 - 0x7001FFE0, // 0025 JMP #0007 - 0x80000000, // 0026 RET 0 + ( &(const binstruction[38]) { /* code */ + 0x5C080200, // 0000 MOVE R2 R1 + 0x740A0001, // 0001 JMPT R2 #0004 + 0x4C080000, // 0002 LDNIL R2 + 0x80040400, // 0003 RET 1 R2 + 0x58080000, // 0004 LDCONST R2 K0 + 0x880C0101, // 0005 GETMBR R3 R0 K1 + 0x6010000C, // 0006 GETGBL R4 G12 + 0x5C140600, // 0007 MOVE R5 R3 + 0x7C100200, // 0008 CALL R4 1 + 0x14100404, // 0009 LT R4 R2 R4 + 0x78120019, // 000A JMPF R4 #0025 + 0x94100602, // 000B GETIDX R4 R3 R2 + 0xB8160400, // 000C GETNGBL R5 K2 + 0x8C140B03, // 000D GETMET R5 R5 K3 + 0x601C0018, // 000E GETGBL R7 G24 + 0x58200004, // 000F LDCONST R8 K4 + 0x60240008, // 0010 GETGBL R9 G8 + 0x88280905, // 0011 GETMBR R10 R4 K5 + 0x7C240200, // 0012 CALL R9 1 + 0x60280008, // 0013 GETGBL R10 G8 + 0x5C2C0200, // 0014 MOVE R11 R1 + 0x7C280200, // 0015 CALL R10 1 + 0x7C1C0600, // 0016 CALL R7 3 + 0x54220003, // 0017 LDINT R8 4 + 0x7C140600, // 0018 CALL R5 3 + 0x88140905, // 0019 GETMBR R5 R4 K5 + 0x1C140A01, // 001A EQ R5 R5 R1 + 0x78160006, // 001B JMPF R5 #0023 + 0x88140906, // 001C GETMBR R5 R4 K6 + 0x4C180000, // 001D LDNIL R6 + 0x20140A06, // 001E NE R5 R5 R6 + 0x78160002, // 001F JMPF R5 #0023 + 0x8C140907, // 0020 GETMET R5 R4 K7 + 0x7C140200, // 0021 CALL R5 1 + 0x80040800, // 0022 RET 1 R4 + 0x00080508, // 0023 ADD R2 R2 K8 + 0x7001FFE0, // 0024 JMP #0006 + 0x80000000, // 0025 RET 0 }) ) ); @@ -1162,7 +1156,7 @@ be_local_closure(Matter_Session_Store_find_session_by_resumption_id, /* name * ********************************************************************/ be_local_closure(Matter_Session_Store_save_fabrics, /* name */ be_nested_proto( - 14, /* nstack */ + 12, /* nstack */ 1, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -1170,7 +1164,7 @@ be_local_closure(Matter_Session_Store_save_fabrics, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[29]) { /* constants */ + ( &(const bvalue[27]) { /* constants */ /* K0 */ be_nested_str_weak(json), /* K1 */ be_nested_str_weak(remove_expired), /* K2 */ be_const_int(0), @@ -1185,25 +1179,23 @@ be_local_closure(Matter_Session_Store_save_fabrics, /* name */ /* K11 */ be_nested_str_weak(concat), /* K12 */ be_nested_str_weak(_X2C), /* K13 */ be_nested_str_weak(_X5D), - /* K14 */ be_nested_str_weak(string), - /* K15 */ be_nested_str_weak(_FABRICS), - /* K16 */ be_nested_str_weak(w), - /* K17 */ be_nested_str_weak(write), - /* K18 */ be_nested_str_weak(close), - /* K19 */ be_nested_str_weak(tasmota), - /* K20 */ be_nested_str_weak(log), - /* K21 */ be_nested_str_weak(format), - /* K22 */ be_nested_str_weak(MTR_X3A_X20_X3DSaved_X20_X20_X20_X20_X20_X25i_X20fabric_X28s_X29_X20and_X20_X25i_X20session_X28s_X29), - /* K23 */ be_const_int(3), - /* K24 */ be_nested_str_weak(device), - /* K25 */ be_nested_str_weak(event_fabrics_saved), - /* K26 */ be_nested_str_weak(MTR_X3A_X20Session_Store_X3A_X3Asave_X20Exception_X3A), - /* K27 */ be_nested_str_weak(_X7C), - /* K28 */ be_const_int(2), + /* K14 */ be_nested_str_weak(_FABRICS), + /* K15 */ be_nested_str_weak(w), + /* K16 */ be_nested_str_weak(write), + /* K17 */ be_nested_str_weak(close), + /* K18 */ be_nested_str_weak(tasmota), + /* K19 */ be_nested_str_weak(log), + /* K20 */ be_nested_str_weak(MTR_X3A_X20_X3DSaved_X20_X20_X20_X20_X20_X25i_X20fabric_X28s_X29_X20and_X20_X25i_X20session_X28s_X29), + /* K21 */ be_const_int(3), + /* K22 */ be_nested_str_weak(device), + /* K23 */ be_nested_str_weak(event_fabrics_saved), + /* K24 */ be_nested_str_weak(MTR_X3A_X20Session_Store_X3A_X3Asave_X20Exception_X3A), + /* K25 */ be_nested_str_weak(_X7C), + /* K26 */ be_const_int(2), }), be_str_weak(save_fabrics), &be_const_str_solidified, - ( &(const binstruction[87]) { /* code */ + ( &(const binstruction[86]) { /* code */ 0xA4060000, // 0000 IMPORT R1 K0 0x8C080101, // 0001 GETMET R2 R0 K1 0x7C080200, // 0002 CALL R2 1 @@ -1248,49 +1240,48 @@ be_local_closure(Matter_Session_Store_save_fabrics, /* name */ 0x00161405, // 0029 ADD R5 K10 R5 0x00140B0D, // 002A ADD R5 R5 K13 0x5C0C0A00, // 002B MOVE R3 R5 - 0xA8020017, // 002C EXBLK 0 #0045 - 0xA4161C00, // 002D IMPORT R5 K14 - 0x60180011, // 002E GETGBL R6 G17 - 0x881C010F, // 002F GETMBR R7 R0 K15 - 0x58200010, // 0030 LDCONST R8 K16 - 0x7C180400, // 0031 CALL R6 2 - 0x8C1C0D11, // 0032 GETMET R7 R6 K17 - 0x5C240600, // 0033 MOVE R9 R3 - 0x7C1C0400, // 0034 CALL R7 2 - 0x8C1C0D12, // 0035 GETMET R7 R6 K18 - 0x7C1C0200, // 0036 CALL R7 1 - 0xB81E2600, // 0037 GETNGBL R7 K19 - 0x8C1C0F14, // 0038 GETMET R7 R7 K20 - 0x8C240B15, // 0039 GETMET R9 R5 K21 - 0x582C0016, // 003A LDCONST R11 K22 - 0x5C300800, // 003B MOVE R12 R4 - 0x5C340400, // 003C MOVE R13 R2 - 0x7C240800, // 003D CALL R9 4 - 0x58280017, // 003E LDCONST R10 K23 - 0x7C1C0600, // 003F CALL R7 3 - 0x881C0118, // 0040 GETMBR R7 R0 K24 - 0x8C1C0F19, // 0041 GETMET R7 R7 K25 - 0x7C1C0200, // 0042 CALL R7 1 - 0xA8040001, // 0043 EXBLK 1 1 - 0x70020010, // 0044 JMP #0056 - 0xAC140002, // 0045 CATCH R5 0 2 - 0x7002000D, // 0046 JMP #0055 - 0xB81E2600, // 0047 GETNGBL R7 K19 - 0x8C1C0F14, // 0048 GETMET R7 R7 K20 - 0x60240008, // 0049 GETGBL R9 G8 - 0x5C280A00, // 004A MOVE R10 R5 - 0x7C240200, // 004B CALL R9 1 - 0x00263409, // 004C ADD R9 K26 R9 - 0x0024131B, // 004D ADD R9 R9 K27 - 0x60280008, // 004E GETGBL R10 G8 - 0x5C2C0C00, // 004F MOVE R11 R6 - 0x7C280200, // 0050 CALL R10 1 - 0x0024120A, // 0051 ADD R9 R9 R10 - 0x5828001C, // 0052 LDCONST R10 K28 - 0x7C1C0600, // 0053 CALL R7 3 - 0x70020000, // 0054 JMP #0056 - 0xB0080000, // 0055 RAISE 2 R0 R0 - 0x80000000, // 0056 RET 0 + 0xA8020016, // 002C EXBLK 0 #0044 + 0x60140011, // 002D GETGBL R5 G17 + 0x8818010E, // 002E GETMBR R6 R0 K14 + 0x581C000F, // 002F LDCONST R7 K15 + 0x7C140400, // 0030 CALL R5 2 + 0x8C180B10, // 0031 GETMET R6 R5 K16 + 0x5C200600, // 0032 MOVE R8 R3 + 0x7C180400, // 0033 CALL R6 2 + 0x8C180B11, // 0034 GETMET R6 R5 K17 + 0x7C180200, // 0035 CALL R6 1 + 0xB81A2400, // 0036 GETNGBL R6 K18 + 0x8C180D13, // 0037 GETMET R6 R6 K19 + 0x60200018, // 0038 GETGBL R8 G24 + 0x58240014, // 0039 LDCONST R9 K20 + 0x5C280800, // 003A MOVE R10 R4 + 0x5C2C0400, // 003B MOVE R11 R2 + 0x7C200600, // 003C CALL R8 3 + 0x58240015, // 003D LDCONST R9 K21 + 0x7C180600, // 003E CALL R6 3 + 0x88180116, // 003F GETMBR R6 R0 K22 + 0x8C180D17, // 0040 GETMET R6 R6 K23 + 0x7C180200, // 0041 CALL R6 1 + 0xA8040001, // 0042 EXBLK 1 1 + 0x70020010, // 0043 JMP #0055 + 0xAC140002, // 0044 CATCH R5 0 2 + 0x7002000D, // 0045 JMP #0054 + 0xB81E2400, // 0046 GETNGBL R7 K18 + 0x8C1C0F13, // 0047 GETMET R7 R7 K19 + 0x60240008, // 0048 GETGBL R9 G8 + 0x5C280A00, // 0049 MOVE R10 R5 + 0x7C240200, // 004A CALL R9 1 + 0x00263009, // 004B ADD R9 K24 R9 + 0x00241319, // 004C ADD R9 R9 K25 + 0x60280008, // 004D GETGBL R10 G8 + 0x5C2C0C00, // 004E MOVE R11 R6 + 0x7C280200, // 004F CALL R10 1 + 0x0024120A, // 0050 ADD R9 R9 R10 + 0x5828001A, // 0051 LDCONST R10 K26 + 0x7C1C0600, // 0052 CALL R7 3 + 0x70020000, // 0053 JMP #0055 + 0xB0080000, // 0054 RAISE 2 R0 R0 + 0x80000000, // 0055 RET 0 }) ) ); diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_TCP_async.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_TCP_async.h index 6893bc3ce..aa854e2c7 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_TCP_async.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_TCP_async.h @@ -46,7 +46,7 @@ be_local_closure(Matter_TCP_async_read, /* name */ ********************************************************************/ be_local_closure(Matter_TCP_async_begin, /* name */ be_nested_proto( - 9, /* nstack */ + 7, /* nstack */ 1, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -54,7 +54,7 @@ be_local_closure(Matter_TCP_async_begin, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[25]) { /* constants */ + ( &(const bvalue[23]) { /* constants */ /* K0 */ be_nested_str_weak(reset), /* K1 */ be_nested_str_weak(tasmota), /* K2 */ be_nested_str_weak(wifi), @@ -72,18 +72,16 @@ be_local_closure(Matter_TCP_async_begin, /* name */ /* K14 */ be_nested_str_weak(remove_fast_loop), /* K15 */ be_nested_str_weak(add_fast_loop), /* K16 */ be_nested_str_weak(add_driver), - /* K17 */ be_nested_str_weak(string), - /* K18 */ be_nested_str_weak(log), - /* K19 */ be_nested_str_weak(format), - /* K20 */ be_nested_str_weak(BRY_X3A_X20failed_X20to_X20resolve_X20_X5B_X25s_X5D_X3A_X25i), - /* K21 */ be_const_int(3), - /* K22 */ be_nested_str_weak(close), - /* K23 */ be_nested_str_weak(tcp_connected), - /* K24 */ be_nested_str_weak(event_dnsfailed), + /* K17 */ be_nested_str_weak(log), + /* K18 */ be_nested_str_weak(BRY_X3A_X20failed_X20to_X20resolve_X20_X5B_X25s_X5D_X3A_X25i), + /* K19 */ be_const_int(3), + /* K20 */ be_nested_str_weak(close), + /* K21 */ be_nested_str_weak(tcp_connected), + /* K22 */ be_nested_str_weak(event_dnsfailed), }), be_str_weak(begin), &be_const_str_solidified, - ( &(const binstruction[64]) { /* code */ + ( &(const binstruction[63]) { /* code */ 0x8C040100, // 0000 GETMET R1 R0 K0 0x7C040200, // 0001 CALL R1 1 0xB8060200, // 0002 GETNGBL R1 K1 @@ -126,28 +124,27 @@ be_local_closure(Matter_TCP_async_begin, /* name */ 0x7C040400, // 0027 CALL R1 2 0x50040200, // 0028 LDBOOL R1 1 0 0x80040200, // 0029 RET 1 R1 - 0x70020013, // 002A JMP #003F - 0xA4062200, // 002B IMPORT R1 K17 - 0xB80A0200, // 002C GETNGBL R2 K1 - 0x8C080512, // 002D GETMET R2 R2 K18 - 0x8C100313, // 002E GETMET R4 R1 K19 - 0x58180014, // 002F LDCONST R6 K20 - 0x881C010B, // 0030 GETMBR R7 R0 K11 - 0x8820010C, // 0031 GETMBR R8 R0 K12 - 0x7C100800, // 0032 CALL R4 4 - 0x58140015, // 0033 LDCONST R5 K21 - 0x7C080600, // 0034 CALL R2 3 - 0x8C080116, // 0035 GETMET R2 R0 K22 - 0x7C080200, // 0036 CALL R2 1 - 0x5409FFFE, // 0037 LDINT R2 -1 - 0x90020E02, // 0038 SETMBR R0 K7 R2 - 0x50080000, // 0039 LDBOOL R2 0 0 - 0x90022E02, // 003A SETMBR R0 K23 R2 - 0x8C080118, // 003B GETMET R2 R0 K24 - 0x7C080200, // 003C CALL R2 1 - 0x50080000, // 003D LDBOOL R2 0 0 - 0x80040400, // 003E RET 1 R2 - 0x80000000, // 003F RET 0 + 0x70020012, // 002A JMP #003E + 0xB8060200, // 002B GETNGBL R1 K1 + 0x8C040311, // 002C GETMET R1 R1 K17 + 0x600C0018, // 002D GETGBL R3 G24 + 0x58100012, // 002E LDCONST R4 K18 + 0x8814010B, // 002F GETMBR R5 R0 K11 + 0x8818010C, // 0030 GETMBR R6 R0 K12 + 0x7C0C0600, // 0031 CALL R3 3 + 0x58100013, // 0032 LDCONST R4 K19 + 0x7C040600, // 0033 CALL R1 3 + 0x8C040114, // 0034 GETMET R1 R0 K20 + 0x7C040200, // 0035 CALL R1 1 + 0x5405FFFE, // 0036 LDINT R1 -1 + 0x90020E01, // 0037 SETMBR R0 K7 R1 + 0x50040000, // 0038 LDBOOL R1 0 0 + 0x90022A01, // 0039 SETMBR R0 K21 R1 + 0x8C040116, // 003A GETMET R1 R0 K22 + 0x7C040200, // 003B CALL R1 1 + 0x50040000, // 003C LDBOOL R1 0 0 + 0x80040200, // 003D RET 1 R1 + 0x80000000, // 003E RET 0 }) ) ); diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_TLV.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_TLV.h index b1e3292f3..f5bce6577 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_TLV.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_TLV.h @@ -795,7 +795,7 @@ be_local_closure(Matter_TLV_item_set_fulltag, /* name */ ********************************************************************/ be_local_closure(Matter_TLV_item_tostring, /* name */ be_nested_proto( - 8, /* nstack */ + 6, /* nstack */ 1, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -803,211 +803,209 @@ be_local_closure(Matter_TLV_item_tostring, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[35]) { /* constants */ - /* K0 */ be_nested_str_weak(string), - /* K1 */ be_nested_str_weak(), - /* K2 */ be_nested_str_weak(tag_profile), - /* K3 */ be_nested_str_weak(Matter_X3A_X3A), - /* K4 */ be_nested_str_weak(tag_number), - /* K5 */ be_nested_str_weak(format), - /* K6 */ be_nested_str_weak(0x_X2508X_X20), - /* K7 */ be_nested_str_weak(tag_vendor), - /* K8 */ be_nested_str_weak(0x_X2504X_X3A_X3A), - /* K9 */ be_nested_str_weak(0x_X2504X_X3A), - /* K10 */ be_nested_str_weak(tag_sub), - /* K11 */ be_nested_str_weak(_X25i_X20), - /* K12 */ be_const_int(0), - /* K13 */ be_nested_str_weak(_X3D_X20), - /* K14 */ be_nested_str_weak(val), - /* K15 */ be_nested_str_weak(int), - /* K16 */ be_nested_str_weak(_X25i), - /* K17 */ be_nested_str_weak(typ), - /* K18 */ be_nested_str_weak(TLV), - /* K19 */ be_nested_str_weak(U1), - /* K20 */ be_nested_str_weak(U8), - /* K21 */ be_nested_str_weak(U), - /* K22 */ be_nested_str_weak(bool), - /* K23 */ be_nested_str_weak(true), - /* K24 */ be_nested_str_weak(false), - /* K25 */ be_nested_str_weak(null), - /* K26 */ be_nested_str_weak(real), - /* K27 */ be_nested_str_weak(_X25g), - /* K28 */ be_nested_str_weak(_X22_X25s_X22), - /* K29 */ be_nested_str_weak(int64), - /* K30 */ be_nested_str_weak(tostring), - /* K31 */ be_nested_str_weak(instance), - /* K32 */ be_nested_str_weak(_X25s), - /* K33 */ be_nested_str_weak(tohex), - /* K34 */ be_nested_str_weak(_X20), + ( &(const bvalue[34]) { /* constants */ + /* K0 */ be_nested_str_weak(), + /* K1 */ be_nested_str_weak(tag_profile), + /* K2 */ be_nested_str_weak(Matter_X3A_X3A), + /* K3 */ be_nested_str_weak(tag_number), + /* K4 */ be_nested_str_weak(0x_X2508X_X20), + /* K5 */ be_nested_str_weak(tag_vendor), + /* K6 */ be_nested_str_weak(0x_X2504X_X3A_X3A), + /* K7 */ be_nested_str_weak(0x_X2504X_X3A), + /* K8 */ be_nested_str_weak(tag_sub), + /* K9 */ be_nested_str_weak(_X25i_X20), + /* K10 */ be_const_int(0), + /* K11 */ be_nested_str_weak(_X3D_X20), + /* K12 */ be_nested_str_weak(val), + /* K13 */ be_nested_str_weak(int), + /* K14 */ be_nested_str_weak(_X25i), + /* K15 */ be_nested_str_weak(typ), + /* K16 */ be_nested_str_weak(TLV), + /* K17 */ be_nested_str_weak(U1), + /* K18 */ be_nested_str_weak(U8), + /* K19 */ be_nested_str_weak(U), + /* K20 */ be_nested_str_weak(bool), + /* K21 */ be_nested_str_weak(true), + /* K22 */ be_nested_str_weak(false), + /* K23 */ be_nested_str_weak(null), + /* K24 */ be_nested_str_weak(real), + /* K25 */ be_nested_str_weak(_X25g), + /* K26 */ be_nested_str_weak(string), + /* K27 */ be_nested_str_weak(_X22_X25s_X22), + /* K28 */ be_nested_str_weak(int64), + /* K29 */ be_nested_str_weak(tostring), + /* K30 */ be_nested_str_weak(instance), + /* K31 */ be_nested_str_weak(_X25s), + /* K32 */ be_nested_str_weak(tohex), + /* K33 */ be_nested_str_weak(_X20), }), be_str_weak(tostring), &be_const_str_solidified, - ( &(const binstruction[165]) { /* code */ - 0xA4060000, // 0000 IMPORT R1 K0 - 0x58080001, // 0001 LDCONST R2 K1 - 0xA8020099, // 0002 EXBLK 0 #009D - 0x880C0102, // 0003 GETMBR R3 R0 K2 - 0x5411FFFE, // 0004 LDINT R4 -1 - 0x1C0C0604, // 0005 EQ R3 R3 R4 - 0x780E000A, // 0006 JMPF R3 #0012 - 0x00080503, // 0007 ADD R2 R2 K3 - 0x880C0104, // 0008 GETMBR R3 R0 K4 - 0x4C100000, // 0009 LDNIL R4 - 0x200C0604, // 000A NE R3 R3 R4 - 0x780E0004, // 000B JMPF R3 #0011 - 0x8C0C0305, // 000C GETMET R3 R1 K5 - 0x58140006, // 000D LDCONST R5 K6 - 0x88180104, // 000E GETMBR R6 R0 K4 - 0x7C0C0600, // 000F CALL R3 3 - 0x00080403, // 0010 ADD R2 R2 R3 - 0x70020023, // 0011 JMP #0036 - 0x880C0107, // 0012 GETMBR R3 R0 K7 - 0x4C100000, // 0013 LDNIL R4 - 0x200C0604, // 0014 NE R3 R3 R4 - 0x780E0004, // 0015 JMPF R3 #001B - 0x8C0C0305, // 0016 GETMET R3 R1 K5 - 0x58140008, // 0017 LDCONST R5 K8 - 0x88180107, // 0018 GETMBR R6 R0 K7 - 0x7C0C0600, // 0019 CALL R3 3 - 0x00080403, // 001A ADD R2 R2 R3 - 0x880C0102, // 001B GETMBR R3 R0 K2 - 0x4C100000, // 001C LDNIL R4 - 0x200C0604, // 001D NE R3 R3 R4 - 0x780E0004, // 001E JMPF R3 #0024 - 0x8C0C0305, // 001F GETMET R3 R1 K5 - 0x58140009, // 0020 LDCONST R5 K9 - 0x88180102, // 0021 GETMBR R6 R0 K2 - 0x7C0C0600, // 0022 CALL R3 3 - 0x00080403, // 0023 ADD R2 R2 R3 - 0x880C0104, // 0024 GETMBR R3 R0 K4 - 0x4C100000, // 0025 LDNIL R4 - 0x200C0604, // 0026 NE R3 R3 R4 - 0x780E0004, // 0027 JMPF R3 #002D - 0x8C0C0305, // 0028 GETMET R3 R1 K5 - 0x58140006, // 0029 LDCONST R5 K6 - 0x88180104, // 002A GETMBR R6 R0 K4 - 0x7C0C0600, // 002B CALL R3 3 - 0x00080403, // 002C ADD R2 R2 R3 - 0x880C010A, // 002D GETMBR R3 R0 K10 - 0x4C100000, // 002E LDNIL R4 - 0x200C0604, // 002F NE R3 R3 R4 - 0x780E0004, // 0030 JMPF R3 #0036 - 0x8C0C0305, // 0031 GETMET R3 R1 K5 - 0x5814000B, // 0032 LDCONST R5 K11 - 0x8818010A, // 0033 GETMBR R6 R0 K10 - 0x7C0C0600, // 0034 CALL R3 3 - 0x00080403, // 0035 ADD R2 R2 R3 - 0x600C000C, // 0036 GETGBL R3 G12 - 0x5C100400, // 0037 MOVE R4 R2 - 0x7C0C0200, // 0038 CALL R3 1 - 0x240C070C, // 0039 GT R3 R3 K12 - 0x780E0000, // 003A JMPF R3 #003C - 0x0008050D, // 003B ADD R2 R2 K13 - 0x600C0004, // 003C GETGBL R3 G4 - 0x8810010E, // 003D GETMBR R4 R0 K14 - 0x7C0C0200, // 003E CALL R3 1 - 0x1C0C070F, // 003F EQ R3 R3 K15 - 0x780E0010, // 0040 JMPF R3 #0052 - 0x8C0C0305, // 0041 GETMET R3 R1 K5 - 0x58140010, // 0042 LDCONST R5 K16 - 0x8818010E, // 0043 GETMBR R6 R0 K14 - 0x7C0C0600, // 0044 CALL R3 3 - 0x00080403, // 0045 ADD R2 R2 R3 - 0x880C0111, // 0046 GETMBR R3 R0 K17 - 0x88100112, // 0047 GETMBR R4 R0 K18 - 0x88100913, // 0048 GETMBR R4 R4 K19 - 0x280C0604, // 0049 GE R3 R3 R4 - 0x780E0005, // 004A JMPF R3 #0051 - 0x880C0111, // 004B GETMBR R3 R0 K17 - 0x88100112, // 004C GETMBR R4 R0 K18 - 0x88100914, // 004D GETMBR R4 R4 K20 - 0x180C0604, // 004E LE R3 R3 R4 - 0x780E0000, // 004F JMPF R3 #0051 - 0x00080515, // 0050 ADD R2 R2 K21 - 0x70020048, // 0051 JMP #009B - 0x600C0004, // 0052 GETGBL R3 G4 - 0x8810010E, // 0053 GETMBR R4 R0 K14 - 0x7C0C0200, // 0054 CALL R3 1 - 0x1C0C0716, // 0055 EQ R3 R3 K22 - 0x780E0006, // 0056 JMPF R3 #005E - 0x880C010E, // 0057 GETMBR R3 R0 K14 - 0x780E0001, // 0058 JMPF R3 #005B - 0x580C0017, // 0059 LDCONST R3 K23 - 0x70020000, // 005A JMP #005C - 0x580C0018, // 005B LDCONST R3 K24 - 0x00080403, // 005C ADD R2 R2 R3 - 0x7002003C, // 005D JMP #009B - 0x880C010E, // 005E GETMBR R3 R0 K14 - 0x4C100000, // 005F LDNIL R4 - 0x1C0C0604, // 0060 EQ R3 R3 R4 - 0x780E0001, // 0061 JMPF R3 #0064 - 0x00080519, // 0062 ADD R2 R2 K25 - 0x70020036, // 0063 JMP #009B - 0x600C0004, // 0064 GETGBL R3 G4 - 0x8810010E, // 0065 GETMBR R4 R0 K14 - 0x7C0C0200, // 0066 CALL R3 1 - 0x1C0C071A, // 0067 EQ R3 R3 K26 - 0x780E0005, // 0068 JMPF R3 #006F - 0x8C0C0305, // 0069 GETMET R3 R1 K5 - 0x5814001B, // 006A LDCONST R5 K27 - 0x8818010E, // 006B GETMBR R6 R0 K14 - 0x7C0C0600, // 006C CALL R3 3 - 0x00080403, // 006D ADD R2 R2 R3 - 0x7002002B, // 006E JMP #009B - 0x600C0004, // 006F GETGBL R3 G4 - 0x8810010E, // 0070 GETMBR R4 R0 K14 - 0x7C0C0200, // 0071 CALL R3 1 - 0x1C0C0700, // 0072 EQ R3 R3 K0 - 0x780E0005, // 0073 JMPF R3 #007A - 0x8C0C0305, // 0074 GETMET R3 R1 K5 - 0x5814001C, // 0075 LDCONST R5 K28 - 0x8818010E, // 0076 GETMBR R6 R0 K14 - 0x7C0C0600, // 0077 CALL R3 3 - 0x00080403, // 0078 ADD R2 R2 R3 - 0x70020020, // 0079 JMP #009B - 0x600C000F, // 007A GETGBL R3 G15 - 0x8810010E, // 007B GETMBR R4 R0 K14 - 0xB8163A00, // 007C GETNGBL R5 K29 - 0x7C0C0400, // 007D CALL R3 2 - 0x780E000F, // 007E JMPF R3 #008F - 0x880C010E, // 007F GETMBR R3 R0 K14 - 0x8C0C071E, // 0080 GETMET R3 R3 K30 - 0x7C0C0200, // 0081 CALL R3 1 - 0x00080403, // 0082 ADD R2 R2 R3 - 0x880C0111, // 0083 GETMBR R3 R0 K17 - 0x88100112, // 0084 GETMBR R4 R0 K18 - 0x88100913, // 0085 GETMBR R4 R4 K19 - 0x280C0604, // 0086 GE R3 R3 R4 - 0x780E0005, // 0087 JMPF R3 #008E - 0x880C0111, // 0088 GETMBR R3 R0 K17 - 0x88100112, // 0089 GETMBR R4 R0 K18 - 0x88100914, // 008A GETMBR R4 R4 K20 - 0x180C0604, // 008B LE R3 R3 R4 - 0x780E0000, // 008C JMPF R3 #008E - 0x00080515, // 008D ADD R2 R2 K21 - 0x7002000B, // 008E JMP #009B - 0x600C0004, // 008F GETGBL R3 G4 - 0x8810010E, // 0090 GETMBR R4 R0 K14 - 0x7C0C0200, // 0091 CALL R3 1 - 0x1C0C071F, // 0092 EQ R3 R3 K31 - 0x780E0006, // 0093 JMPF R3 #009B - 0x8C0C0305, // 0094 GETMET R3 R1 K5 - 0x58140020, // 0095 LDCONST R5 K32 - 0x8818010E, // 0096 GETMBR R6 R0 K14 - 0x8C180D21, // 0097 GETMET R6 R6 K33 - 0x7C180200, // 0098 CALL R6 1 - 0x7C0C0600, // 0099 CALL R3 3 - 0x00080403, // 009A ADD R2 R2 R3 - 0xA8040001, // 009B EXBLK 1 1 - 0x70020006, // 009C JMP #00A4 - 0xAC0C0002, // 009D CATCH R3 0 2 - 0x70020003, // 009E JMP #00A3 - 0x00140722, // 009F ADD R5 R3 K34 - 0x00140A04, // 00A0 ADD R5 R5 R4 - 0x80040A00, // 00A1 RET 1 R5 - 0x70020000, // 00A2 JMP #00A4 - 0xB0080000, // 00A3 RAISE 2 R0 R0 - 0x80040400, // 00A4 RET 1 R2 + ( &(const binstruction[164]) { /* code */ + 0x58040000, // 0000 LDCONST R1 K0 + 0xA8020099, // 0001 EXBLK 0 #009C + 0x88080101, // 0002 GETMBR R2 R0 K1 + 0x540DFFFE, // 0003 LDINT R3 -1 + 0x1C080403, // 0004 EQ R2 R2 R3 + 0x780A000A, // 0005 JMPF R2 #0011 + 0x00040302, // 0006 ADD R1 R1 K2 + 0x88080103, // 0007 GETMBR R2 R0 K3 + 0x4C0C0000, // 0008 LDNIL R3 + 0x20080403, // 0009 NE R2 R2 R3 + 0x780A0004, // 000A JMPF R2 #0010 + 0x60080018, // 000B GETGBL R2 G24 + 0x580C0004, // 000C LDCONST R3 K4 + 0x88100103, // 000D GETMBR R4 R0 K3 + 0x7C080400, // 000E CALL R2 2 + 0x00040202, // 000F ADD R1 R1 R2 + 0x70020023, // 0010 JMP #0035 + 0x88080105, // 0011 GETMBR R2 R0 K5 + 0x4C0C0000, // 0012 LDNIL R3 + 0x20080403, // 0013 NE R2 R2 R3 + 0x780A0004, // 0014 JMPF R2 #001A + 0x60080018, // 0015 GETGBL R2 G24 + 0x580C0006, // 0016 LDCONST R3 K6 + 0x88100105, // 0017 GETMBR R4 R0 K5 + 0x7C080400, // 0018 CALL R2 2 + 0x00040202, // 0019 ADD R1 R1 R2 + 0x88080101, // 001A GETMBR R2 R0 K1 + 0x4C0C0000, // 001B LDNIL R3 + 0x20080403, // 001C NE R2 R2 R3 + 0x780A0004, // 001D JMPF R2 #0023 + 0x60080018, // 001E GETGBL R2 G24 + 0x580C0007, // 001F LDCONST R3 K7 + 0x88100101, // 0020 GETMBR R4 R0 K1 + 0x7C080400, // 0021 CALL R2 2 + 0x00040202, // 0022 ADD R1 R1 R2 + 0x88080103, // 0023 GETMBR R2 R0 K3 + 0x4C0C0000, // 0024 LDNIL R3 + 0x20080403, // 0025 NE R2 R2 R3 + 0x780A0004, // 0026 JMPF R2 #002C + 0x60080018, // 0027 GETGBL R2 G24 + 0x580C0004, // 0028 LDCONST R3 K4 + 0x88100103, // 0029 GETMBR R4 R0 K3 + 0x7C080400, // 002A CALL R2 2 + 0x00040202, // 002B ADD R1 R1 R2 + 0x88080108, // 002C GETMBR R2 R0 K8 + 0x4C0C0000, // 002D LDNIL R3 + 0x20080403, // 002E NE R2 R2 R3 + 0x780A0004, // 002F JMPF R2 #0035 + 0x60080018, // 0030 GETGBL R2 G24 + 0x580C0009, // 0031 LDCONST R3 K9 + 0x88100108, // 0032 GETMBR R4 R0 K8 + 0x7C080400, // 0033 CALL R2 2 + 0x00040202, // 0034 ADD R1 R1 R2 + 0x6008000C, // 0035 GETGBL R2 G12 + 0x5C0C0200, // 0036 MOVE R3 R1 + 0x7C080200, // 0037 CALL R2 1 + 0x2408050A, // 0038 GT R2 R2 K10 + 0x780A0000, // 0039 JMPF R2 #003B + 0x0004030B, // 003A ADD R1 R1 K11 + 0x60080004, // 003B GETGBL R2 G4 + 0x880C010C, // 003C GETMBR R3 R0 K12 + 0x7C080200, // 003D CALL R2 1 + 0x1C08050D, // 003E EQ R2 R2 K13 + 0x780A0010, // 003F JMPF R2 #0051 + 0x60080018, // 0040 GETGBL R2 G24 + 0x580C000E, // 0041 LDCONST R3 K14 + 0x8810010C, // 0042 GETMBR R4 R0 K12 + 0x7C080400, // 0043 CALL R2 2 + 0x00040202, // 0044 ADD R1 R1 R2 + 0x8808010F, // 0045 GETMBR R2 R0 K15 + 0x880C0110, // 0046 GETMBR R3 R0 K16 + 0x880C0711, // 0047 GETMBR R3 R3 K17 + 0x28080403, // 0048 GE R2 R2 R3 + 0x780A0005, // 0049 JMPF R2 #0050 + 0x8808010F, // 004A GETMBR R2 R0 K15 + 0x880C0110, // 004B GETMBR R3 R0 K16 + 0x880C0712, // 004C GETMBR R3 R3 K18 + 0x18080403, // 004D LE R2 R2 R3 + 0x780A0000, // 004E JMPF R2 #0050 + 0x00040313, // 004F ADD R1 R1 K19 + 0x70020048, // 0050 JMP #009A + 0x60080004, // 0051 GETGBL R2 G4 + 0x880C010C, // 0052 GETMBR R3 R0 K12 + 0x7C080200, // 0053 CALL R2 1 + 0x1C080514, // 0054 EQ R2 R2 K20 + 0x780A0006, // 0055 JMPF R2 #005D + 0x8808010C, // 0056 GETMBR R2 R0 K12 + 0x780A0001, // 0057 JMPF R2 #005A + 0x58080015, // 0058 LDCONST R2 K21 + 0x70020000, // 0059 JMP #005B + 0x58080016, // 005A LDCONST R2 K22 + 0x00040202, // 005B ADD R1 R1 R2 + 0x7002003C, // 005C JMP #009A + 0x8808010C, // 005D GETMBR R2 R0 K12 + 0x4C0C0000, // 005E LDNIL R3 + 0x1C080403, // 005F EQ R2 R2 R3 + 0x780A0001, // 0060 JMPF R2 #0063 + 0x00040317, // 0061 ADD R1 R1 K23 + 0x70020036, // 0062 JMP #009A + 0x60080004, // 0063 GETGBL R2 G4 + 0x880C010C, // 0064 GETMBR R3 R0 K12 + 0x7C080200, // 0065 CALL R2 1 + 0x1C080518, // 0066 EQ R2 R2 K24 + 0x780A0005, // 0067 JMPF R2 #006E + 0x60080018, // 0068 GETGBL R2 G24 + 0x580C0019, // 0069 LDCONST R3 K25 + 0x8810010C, // 006A GETMBR R4 R0 K12 + 0x7C080400, // 006B CALL R2 2 + 0x00040202, // 006C ADD R1 R1 R2 + 0x7002002B, // 006D JMP #009A + 0x60080004, // 006E GETGBL R2 G4 + 0x880C010C, // 006F GETMBR R3 R0 K12 + 0x7C080200, // 0070 CALL R2 1 + 0x1C08051A, // 0071 EQ R2 R2 K26 + 0x780A0005, // 0072 JMPF R2 #0079 + 0x60080018, // 0073 GETGBL R2 G24 + 0x580C001B, // 0074 LDCONST R3 K27 + 0x8810010C, // 0075 GETMBR R4 R0 K12 + 0x7C080400, // 0076 CALL R2 2 + 0x00040202, // 0077 ADD R1 R1 R2 + 0x70020020, // 0078 JMP #009A + 0x6008000F, // 0079 GETGBL R2 G15 + 0x880C010C, // 007A GETMBR R3 R0 K12 + 0xB8123800, // 007B GETNGBL R4 K28 + 0x7C080400, // 007C CALL R2 2 + 0x780A000F, // 007D JMPF R2 #008E + 0x8808010C, // 007E GETMBR R2 R0 K12 + 0x8C08051D, // 007F GETMET R2 R2 K29 + 0x7C080200, // 0080 CALL R2 1 + 0x00040202, // 0081 ADD R1 R1 R2 + 0x8808010F, // 0082 GETMBR R2 R0 K15 + 0x880C0110, // 0083 GETMBR R3 R0 K16 + 0x880C0711, // 0084 GETMBR R3 R3 K17 + 0x28080403, // 0085 GE R2 R2 R3 + 0x780A0005, // 0086 JMPF R2 #008D + 0x8808010F, // 0087 GETMBR R2 R0 K15 + 0x880C0110, // 0088 GETMBR R3 R0 K16 + 0x880C0712, // 0089 GETMBR R3 R3 K18 + 0x18080403, // 008A LE R2 R2 R3 + 0x780A0000, // 008B JMPF R2 #008D + 0x00040313, // 008C ADD R1 R1 K19 + 0x7002000B, // 008D JMP #009A + 0x60080004, // 008E GETGBL R2 G4 + 0x880C010C, // 008F GETMBR R3 R0 K12 + 0x7C080200, // 0090 CALL R2 1 + 0x1C08051E, // 0091 EQ R2 R2 K30 + 0x780A0006, // 0092 JMPF R2 #009A + 0x60080018, // 0093 GETGBL R2 G24 + 0x580C001F, // 0094 LDCONST R3 K31 + 0x8810010C, // 0095 GETMBR R4 R0 K12 + 0x8C100920, // 0096 GETMET R4 R4 K32 + 0x7C100200, // 0097 CALL R4 1 + 0x7C080400, // 0098 CALL R2 2 + 0x00040202, // 0099 ADD R1 R1 R2 + 0xA8040001, // 009A EXBLK 1 1 + 0x70020006, // 009B JMP #00A3 + 0xAC080002, // 009C CATCH R2 0 2 + 0x70020003, // 009D JMP #00A2 + 0x00100521, // 009E ADD R4 R2 K33 + 0x00100803, // 009F ADD R4 R4 R3 + 0x80040800, // 00A0 RET 1 R4 + 0x70020000, // 00A1 JMP #00A3 + 0xB0080000, // 00A2 RAISE 2 R0 R0 + 0x80040200, // 00A3 RET 1 R1 }) ) ); @@ -2162,7 +2160,7 @@ be_local_closure(Matter_TLV_list_add_list, /* name */ ********************************************************************/ be_local_closure(Matter_TLV_list_tostring_inner, /* name */ be_nested_proto( - 10, /* nstack */ + 9, /* nstack */ 4, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -2170,114 +2168,111 @@ be_local_closure(Matter_TLV_list_tostring_inner, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[20]) { /* constants */ - /* K0 */ be_nested_str_weak(string), - /* K1 */ be_nested_str_weak(), - /* K2 */ be_nested_str_weak(tag_profile), - /* K3 */ be_nested_str_weak(Matter_X3A_X3A), - /* K4 */ be_nested_str_weak(tag_number), - /* K5 */ be_nested_str_weak(format), - /* K6 */ be_nested_str_weak(0x_X2508X_X20), - /* K7 */ be_nested_str_weak(tag_vendor), - /* K8 */ be_nested_str_weak(0x_X2504X_X3A_X3A), - /* K9 */ be_nested_str_weak(0x_X2504X_X3A), - /* K10 */ be_nested_str_weak(tag_sub), - /* K11 */ be_nested_str_weak(_X25i_X20), - /* K12 */ be_const_int(0), - /* K13 */ be_nested_str_weak(_X3D_X20), - /* K14 */ be_nested_str_weak(val), - /* K15 */ be_nested_str_weak(copy), - /* K16 */ be_nested_str_weak(sort), - /* K17 */ be_nested_str_weak(concat), - /* K18 */ be_nested_str_weak(_X2C_X20), - /* K19 */ be_nested_str_weak(_X20), + ( &(const bvalue[18]) { /* constants */ + /* K0 */ be_nested_str_weak(), + /* K1 */ be_nested_str_weak(tag_profile), + /* K2 */ be_nested_str_weak(Matter_X3A_X3A), + /* K3 */ be_nested_str_weak(tag_number), + /* K4 */ be_nested_str_weak(0x_X2508X_X20), + /* K5 */ be_nested_str_weak(tag_vendor), + /* K6 */ be_nested_str_weak(0x_X2504X_X3A_X3A), + /* K7 */ be_nested_str_weak(0x_X2504X_X3A), + /* K8 */ be_nested_str_weak(tag_sub), + /* K9 */ be_nested_str_weak(_X25i_X20), + /* K10 */ be_const_int(0), + /* K11 */ be_nested_str_weak(_X3D_X20), + /* K12 */ be_nested_str_weak(val), + /* K13 */ be_nested_str_weak(copy), + /* K14 */ be_nested_str_weak(sort), + /* K15 */ be_nested_str_weak(concat), + /* K16 */ be_nested_str_weak(_X2C_X20), + /* K17 */ be_nested_str_weak(_X20), }), be_str_weak(tostring_inner), &be_const_str_solidified, - ( &(const binstruction[83]) { /* code */ - 0xA4120000, // 0000 IMPORT R4 K0 - 0x58140001, // 0001 LDCONST R5 K1 - 0xA8020047, // 0002 EXBLK 0 #004B - 0x88180102, // 0003 GETMBR R6 R0 K2 - 0x541DFFFE, // 0004 LDINT R7 -1 - 0x1C180C07, // 0005 EQ R6 R6 R7 - 0x781A000A, // 0006 JMPF R6 #0012 - 0x00140B03, // 0007 ADD R5 R5 K3 - 0x88180104, // 0008 GETMBR R6 R0 K4 - 0x4C1C0000, // 0009 LDNIL R7 - 0x20180C07, // 000A NE R6 R6 R7 - 0x781A0004, // 000B JMPF R6 #0011 - 0x8C180905, // 000C GETMET R6 R4 K5 - 0x58200006, // 000D LDCONST R8 K6 - 0x88240104, // 000E GETMBR R9 R0 K4 - 0x7C180600, // 000F CALL R6 3 - 0x00140A06, // 0010 ADD R5 R5 R6 - 0x70020023, // 0011 JMP #0036 - 0x88180107, // 0012 GETMBR R6 R0 K7 - 0x4C1C0000, // 0013 LDNIL R7 - 0x20180C07, // 0014 NE R6 R6 R7 - 0x781A0004, // 0015 JMPF R6 #001B - 0x8C180905, // 0016 GETMET R6 R4 K5 - 0x58200008, // 0017 LDCONST R8 K8 - 0x88240107, // 0018 GETMBR R9 R0 K7 - 0x7C180600, // 0019 CALL R6 3 - 0x00140A06, // 001A ADD R5 R5 R6 - 0x88180102, // 001B GETMBR R6 R0 K2 - 0x4C1C0000, // 001C LDNIL R7 - 0x20180C07, // 001D NE R6 R6 R7 - 0x781A0004, // 001E JMPF R6 #0024 - 0x8C180905, // 001F GETMET R6 R4 K5 - 0x58200009, // 0020 LDCONST R8 K9 - 0x88240102, // 0021 GETMBR R9 R0 K2 - 0x7C180600, // 0022 CALL R6 3 - 0x00140A06, // 0023 ADD R5 R5 R6 - 0x88180104, // 0024 GETMBR R6 R0 K4 - 0x4C1C0000, // 0025 LDNIL R7 - 0x20180C07, // 0026 NE R6 R6 R7 - 0x781A0004, // 0027 JMPF R6 #002D - 0x8C180905, // 0028 GETMET R6 R4 K5 - 0x58200006, // 0029 LDCONST R8 K6 - 0x88240104, // 002A GETMBR R9 R0 K4 - 0x7C180600, // 002B CALL R6 3 - 0x00140A06, // 002C ADD R5 R5 R6 - 0x8818010A, // 002D GETMBR R6 R0 K10 - 0x4C1C0000, // 002E LDNIL R7 - 0x20180C07, // 002F NE R6 R6 R7 - 0x781A0004, // 0030 JMPF R6 #0036 - 0x8C180905, // 0031 GETMET R6 R4 K5 - 0x5820000B, // 0032 LDCONST R8 K11 - 0x8824010A, // 0033 GETMBR R9 R0 K10 - 0x7C180600, // 0034 CALL R6 3 - 0x00140A06, // 0035 ADD R5 R5 R6 - 0x6018000C, // 0036 GETGBL R6 G12 - 0x5C1C0A00, // 0037 MOVE R7 R5 - 0x7C180200, // 0038 CALL R6 1 - 0x24180D0C, // 0039 GT R6 R6 K12 - 0x781A0000, // 003A JMPF R6 #003C - 0x00140B0D, // 003B ADD R5 R5 K13 - 0x00140A02, // 003C ADD R5 R5 R2 - 0x8818010E, // 003D GETMBR R6 R0 K14 - 0x8C180D0F, // 003E GETMET R6 R6 K15 - 0x7C180200, // 003F CALL R6 1 - 0x78060002, // 0040 JMPF R1 #0044 - 0x8C1C0110, // 0041 GETMET R7 R0 K16 - 0x5C240C00, // 0042 MOVE R9 R6 - 0x7C1C0400, // 0043 CALL R7 2 - 0x8C1C0D11, // 0044 GETMET R7 R6 K17 - 0x58240012, // 0045 LDCONST R9 K18 - 0x7C1C0400, // 0046 CALL R7 2 - 0x00140A07, // 0047 ADD R5 R5 R7 - 0x00140A03, // 0048 ADD R5 R5 R3 - 0xA8040001, // 0049 EXBLK 1 1 - 0x70020006, // 004A JMP #0052 - 0xAC180002, // 004B CATCH R6 0 2 - 0x70020003, // 004C JMP #0051 - 0x00200D13, // 004D ADD R8 R6 K19 - 0x00201007, // 004E ADD R8 R8 R7 - 0x80041000, // 004F RET 1 R8 - 0x70020000, // 0050 JMP #0052 - 0xB0080000, // 0051 RAISE 2 R0 R0 - 0x80040A00, // 0052 RET 1 R5 + ( &(const binstruction[82]) { /* code */ + 0x58100000, // 0000 LDCONST R4 K0 + 0xA8020047, // 0001 EXBLK 0 #004A + 0x88140101, // 0002 GETMBR R5 R0 K1 + 0x5419FFFE, // 0003 LDINT R6 -1 + 0x1C140A06, // 0004 EQ R5 R5 R6 + 0x7816000A, // 0005 JMPF R5 #0011 + 0x00100902, // 0006 ADD R4 R4 K2 + 0x88140103, // 0007 GETMBR R5 R0 K3 + 0x4C180000, // 0008 LDNIL R6 + 0x20140A06, // 0009 NE R5 R5 R6 + 0x78160004, // 000A JMPF R5 #0010 + 0x60140018, // 000B GETGBL R5 G24 + 0x58180004, // 000C LDCONST R6 K4 + 0x881C0103, // 000D GETMBR R7 R0 K3 + 0x7C140400, // 000E CALL R5 2 + 0x00100805, // 000F ADD R4 R4 R5 + 0x70020023, // 0010 JMP #0035 + 0x88140105, // 0011 GETMBR R5 R0 K5 + 0x4C180000, // 0012 LDNIL R6 + 0x20140A06, // 0013 NE R5 R5 R6 + 0x78160004, // 0014 JMPF R5 #001A + 0x60140018, // 0015 GETGBL R5 G24 + 0x58180006, // 0016 LDCONST R6 K6 + 0x881C0105, // 0017 GETMBR R7 R0 K5 + 0x7C140400, // 0018 CALL R5 2 + 0x00100805, // 0019 ADD R4 R4 R5 + 0x88140101, // 001A GETMBR R5 R0 K1 + 0x4C180000, // 001B LDNIL R6 + 0x20140A06, // 001C NE R5 R5 R6 + 0x78160004, // 001D JMPF R5 #0023 + 0x60140018, // 001E GETGBL R5 G24 + 0x58180007, // 001F LDCONST R6 K7 + 0x881C0101, // 0020 GETMBR R7 R0 K1 + 0x7C140400, // 0021 CALL R5 2 + 0x00100805, // 0022 ADD R4 R4 R5 + 0x88140103, // 0023 GETMBR R5 R0 K3 + 0x4C180000, // 0024 LDNIL R6 + 0x20140A06, // 0025 NE R5 R5 R6 + 0x78160004, // 0026 JMPF R5 #002C + 0x60140018, // 0027 GETGBL R5 G24 + 0x58180004, // 0028 LDCONST R6 K4 + 0x881C0103, // 0029 GETMBR R7 R0 K3 + 0x7C140400, // 002A CALL R5 2 + 0x00100805, // 002B ADD R4 R4 R5 + 0x88140108, // 002C GETMBR R5 R0 K8 + 0x4C180000, // 002D LDNIL R6 + 0x20140A06, // 002E NE R5 R5 R6 + 0x78160004, // 002F JMPF R5 #0035 + 0x60140018, // 0030 GETGBL R5 G24 + 0x58180009, // 0031 LDCONST R6 K9 + 0x881C0108, // 0032 GETMBR R7 R0 K8 + 0x7C140400, // 0033 CALL R5 2 + 0x00100805, // 0034 ADD R4 R4 R5 + 0x6014000C, // 0035 GETGBL R5 G12 + 0x5C180800, // 0036 MOVE R6 R4 + 0x7C140200, // 0037 CALL R5 1 + 0x24140B0A, // 0038 GT R5 R5 K10 + 0x78160000, // 0039 JMPF R5 #003B + 0x0010090B, // 003A ADD R4 R4 K11 + 0x00100802, // 003B ADD R4 R4 R2 + 0x8814010C, // 003C GETMBR R5 R0 K12 + 0x8C140B0D, // 003D GETMET R5 R5 K13 + 0x7C140200, // 003E CALL R5 1 + 0x78060002, // 003F JMPF R1 #0043 + 0x8C18010E, // 0040 GETMET R6 R0 K14 + 0x5C200A00, // 0041 MOVE R8 R5 + 0x7C180400, // 0042 CALL R6 2 + 0x8C180B0F, // 0043 GETMET R6 R5 K15 + 0x58200010, // 0044 LDCONST R8 K16 + 0x7C180400, // 0045 CALL R6 2 + 0x00100806, // 0046 ADD R4 R4 R6 + 0x00100803, // 0047 ADD R4 R4 R3 + 0xA8040001, // 0048 EXBLK 1 1 + 0x70020006, // 0049 JMP #0051 + 0xAC140002, // 004A CATCH R5 0 2 + 0x70020003, // 004B JMP #0050 + 0x001C0B11, // 004C ADD R7 R5 K17 + 0x001C0E06, // 004D ADD R7 R7 R6 + 0x80040E00, // 004E RET 1 R7 + 0x70020000, // 004F JMP #0051 + 0xB0080000, // 0050 RAISE 2 R0 R0 + 0x80040800, // 0051 RET 1 R4 }) ) ); diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_UDPServer.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_UDPServer.h index d9e482693..1db6ad008 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_UDPServer.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_UDPServer.h @@ -211,7 +211,7 @@ be_local_closure(Matter_UDPServer__backoff_time, /* name */ ********************************************************************/ be_local_closure(Matter_UDPServer__resend_packets, /* name */ be_nested_proto( - 13, /* nstack */ + 11, /* nstack */ 1, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -219,7 +219,7 @@ be_local_closure(Matter_UDPServer__resend_packets, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[22]) { /* constants */ + ( &(const bvalue[20]) { /* constants */ /* K0 */ be_const_int(0), /* K1 */ be_nested_str_weak(packets_sent), /* K2 */ be_nested_str_weak(tasmota), @@ -234,31 +234,29 @@ be_local_closure(Matter_UDPServer__resend_packets, /* name */ /* K11 */ be_nested_str_weak(millis), /* K12 */ be_nested_str_weak(_backoff_time), /* K13 */ be_const_int(1), - /* K14 */ be_nested_str_weak(string), - /* K15 */ be_nested_str_weak(remove), - /* K16 */ be_nested_str_weak(format), - /* K17 */ be_nested_str_weak(MTR_X3A_X20_X2E_X20_X20_X20_X20_X20_X20_X20_X20_X20_X20_X28_X256i_X29_X20Unacked_X20packet_X20_X27_X5B_X25s_X5D_X3A_X25i_X27_X20msg_id_X3D_X25i), - /* K18 */ be_nested_str_weak(session_id), - /* K19 */ be_nested_str_weak(addr), - /* K20 */ be_nested_str_weak(port), - /* K21 */ be_const_int(3), + /* K14 */ be_nested_str_weak(remove), + /* K15 */ be_nested_str_weak(MTR_X3A_X20_X2E_X20_X20_X20_X20_X20_X20_X20_X20_X20_X20_X28_X256i_X29_X20Unacked_X20packet_X20_X27_X5B_X25s_X5D_X3A_X25i_X27_X20msg_id_X3D_X25i), + /* K16 */ be_nested_str_weak(session_id), + /* K17 */ be_nested_str_weak(addr), + /* K18 */ be_nested_str_weak(port), + /* K19 */ be_const_int(3), }), be_str_weak(_resend_packets), &be_const_str_solidified, - ( &(const binstruction[61]) { /* code */ + ( &(const binstruction[60]) { /* code */ 0x58040000, // 0000 LDCONST R1 K0 0x6008000C, // 0001 GETGBL R2 G12 0x880C0101, // 0002 GETMBR R3 R0 K1 0x7C080200, // 0003 CALL R2 1 0x14080202, // 0004 LT R2 R1 R2 - 0x780A0035, // 0005 JMPF R2 #003C + 0x780A0034, // 0005 JMPF R2 #003B 0x88080101, // 0006 GETMBR R2 R0 K1 0x94080401, // 0007 GETIDX R2 R2 R1 0xB80E0400, // 0008 GETNGBL R3 K2 0x8C0C0703, // 0009 GETMET R3 R3 K3 0x88140504, // 000A GETMBR R5 R2 K4 0x7C0C0400, // 000B CALL R3 2 - 0x780E002C, // 000C JMPF R3 #003A + 0x780E002B, // 000C JMPF R3 #0039 0x880C0505, // 000D GETMBR R3 R2 K5 0x88100106, // 000E GETMBR R4 R0 K6 0x180C0604, // 000F LE R3 R3 R4 @@ -286,27 +284,26 @@ be_local_closure(Matter_UDPServer__resend_packets, /* name */ 0x000C070D, // 0025 ADD R3 R3 K13 0x900A0A03, // 0026 SETMBR R2 K5 R3 0x0004030D, // 0027 ADD R1 R1 K13 - 0x7002000F, // 0028 JMP #0039 - 0xA40E1C00, // 0029 IMPORT R3 K14 - 0x88100101, // 002A GETMBR R4 R0 K1 - 0x8C10090F, // 002B GETMET R4 R4 K15 - 0x5C180200, // 002C MOVE R6 R1 - 0x7C100400, // 002D CALL R4 2 - 0xB8120400, // 002E GETNGBL R4 K2 - 0x8C100907, // 002F GETMET R4 R4 K7 - 0x8C180710, // 0030 GETMET R6 R3 K16 - 0x58200011, // 0031 LDCONST R8 K17 - 0x88240512, // 0032 GETMBR R9 R2 K18 - 0x88280513, // 0033 GETMBR R10 R2 K19 - 0x882C0514, // 0034 GETMBR R11 R2 K20 - 0x88300509, // 0035 GETMBR R12 R2 K9 - 0x7C180C00, // 0036 CALL R6 6 - 0x581C0015, // 0037 LDCONST R7 K21 - 0x7C100600, // 0038 CALL R4 3 - 0x70020000, // 0039 JMP #003B - 0x0004030D, // 003A ADD R1 R1 K13 - 0x7001FFC4, // 003B JMP #0001 - 0x80000000, // 003C RET 0 + 0x7002000E, // 0028 JMP #0038 + 0x880C0101, // 0029 GETMBR R3 R0 K1 + 0x8C0C070E, // 002A GETMET R3 R3 K14 + 0x5C140200, // 002B MOVE R5 R1 + 0x7C0C0400, // 002C CALL R3 2 + 0xB80E0400, // 002D GETNGBL R3 K2 + 0x8C0C0707, // 002E GETMET R3 R3 K7 + 0x60140018, // 002F GETGBL R5 G24 + 0x5818000F, // 0030 LDCONST R6 K15 + 0x881C0510, // 0031 GETMBR R7 R2 K16 + 0x88200511, // 0032 GETMBR R8 R2 K17 + 0x88240512, // 0033 GETMBR R9 R2 K18 + 0x88280509, // 0034 GETMBR R10 R2 K9 + 0x7C140A00, // 0035 CALL R5 5 + 0x58180013, // 0036 LDCONST R6 K19 + 0x7C0C0600, // 0037 CALL R3 3 + 0x70020000, // 0038 JMP #003A + 0x0004030D, // 0039 ADD R1 R1 K13 + 0x7001FFC5, // 003A JMP #0001 + 0x80000000, // 003B RET 0 }) ) ); @@ -386,7 +383,7 @@ be_local_closure(Matter_UDPServer_send_UDP, /* name */ ********************************************************************/ be_local_closure(Matter_UDPServer_every_50ms, /* name */ be_nested_proto( - 13, /* nstack */ + 11, /* nstack */ 1, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -394,72 +391,69 @@ be_local_closure(Matter_UDPServer_every_50ms, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[14]) { /* constants */ - /* K0 */ be_nested_str_weak(string), - /* K1 */ be_const_int(0), - /* K2 */ be_nested_str_weak(udp_socket), - /* K3 */ be_nested_str_weak(read), - /* K4 */ be_const_int(1), - /* K5 */ be_nested_str_weak(remote_ip), - /* K6 */ be_nested_str_weak(remote_port), - /* K7 */ be_nested_str_weak(tasmota), - /* K8 */ be_nested_str_weak(log), - /* K9 */ be_nested_str_weak(format), - /* K10 */ be_nested_str_weak(MTR_X3A_X20UDP_X20received_X20from_X20_X5B_X25s_X5D_X3A_X25i), - /* K11 */ be_nested_str_weak(dispatch_cb), - /* K12 */ be_nested_str_weak(MAX_PACKETS_READ), - /* K13 */ be_nested_str_weak(_resend_packets), + ( &(const bvalue[12]) { /* constants */ + /* K0 */ be_const_int(0), + /* K1 */ be_nested_str_weak(udp_socket), + /* K2 */ be_nested_str_weak(read), + /* K3 */ be_const_int(1), + /* K4 */ be_nested_str_weak(remote_ip), + /* K5 */ be_nested_str_weak(remote_port), + /* K6 */ be_nested_str_weak(tasmota), + /* K7 */ be_nested_str_weak(log), + /* K8 */ be_nested_str_weak(MTR_X3A_X20UDP_X20received_X20from_X20_X5B_X25s_X5D_X3A_X25i), + /* K9 */ be_nested_str_weak(dispatch_cb), + /* K10 */ be_nested_str_weak(MAX_PACKETS_READ), + /* K11 */ be_nested_str_weak(_resend_packets), }), be_str_weak(every_50ms), &be_const_str_solidified, - ( &(const binstruction[47]) { /* code */ - 0xA4060000, // 0000 IMPORT R1 K0 - 0x58080001, // 0001 LDCONST R2 K1 - 0x880C0102, // 0002 GETMBR R3 R0 K2 - 0x4C100000, // 0003 LDNIL R4 - 0x1C0C0604, // 0004 EQ R3 R3 R4 - 0x780E0000, // 0005 JMPF R3 #0007 - 0x80000600, // 0006 RET 0 - 0x880C0102, // 0007 GETMBR R3 R0 K2 - 0x8C0C0703, // 0008 GETMET R3 R3 K3 - 0x7C0C0200, // 0009 CALL R3 1 - 0x4C100000, // 000A LDNIL R4 - 0x20100604, // 000B NE R4 R3 R4 - 0x7812001E, // 000C JMPF R4 #002C - 0x00080504, // 000D ADD R2 R2 K4 - 0x88100102, // 000E GETMBR R4 R0 K2 - 0x88100905, // 000F GETMBR R4 R4 K5 - 0x88140102, // 0010 GETMBR R5 R0 K2 - 0x88140B06, // 0011 GETMBR R5 R5 K6 - 0xB81A0E00, // 0012 GETNGBL R6 K7 - 0x8C180D08, // 0013 GETMET R6 R6 K8 - 0x8C200309, // 0014 GETMET R8 R1 K9 - 0x5828000A, // 0015 LDCONST R10 K10 - 0x5C2C0800, // 0016 MOVE R11 R4 - 0x5C300A00, // 0017 MOVE R12 R5 - 0x7C200800, // 0018 CALL R8 4 - 0x54260003, // 0019 LDINT R9 4 - 0x7C180600, // 001A CALL R6 3 - 0x8818010B, // 001B GETMBR R6 R0 K11 - 0x781A0004, // 001C JMPF R6 #0022 - 0x8C18010B, // 001D GETMET R6 R0 K11 + ( &(const binstruction[46]) { /* code */ + 0x58040000, // 0000 LDCONST R1 K0 + 0x88080101, // 0001 GETMBR R2 R0 K1 + 0x4C0C0000, // 0002 LDNIL R3 + 0x1C080403, // 0003 EQ R2 R2 R3 + 0x780A0000, // 0004 JMPF R2 #0006 + 0x80000400, // 0005 RET 0 + 0x88080101, // 0006 GETMBR R2 R0 K1 + 0x8C080502, // 0007 GETMET R2 R2 K2 + 0x7C080200, // 0008 CALL R2 1 + 0x4C0C0000, // 0009 LDNIL R3 + 0x200C0403, // 000A NE R3 R2 R3 + 0x780E001E, // 000B JMPF R3 #002B + 0x00040303, // 000C ADD R1 R1 K3 + 0x880C0101, // 000D GETMBR R3 R0 K1 + 0x880C0704, // 000E GETMBR R3 R3 K4 + 0x88100101, // 000F GETMBR R4 R0 K1 + 0x88100905, // 0010 GETMBR R4 R4 K5 + 0xB8160C00, // 0011 GETNGBL R5 K6 + 0x8C140B07, // 0012 GETMET R5 R5 K7 + 0x601C0018, // 0013 GETGBL R7 G24 + 0x58200008, // 0014 LDCONST R8 K8 + 0x5C240600, // 0015 MOVE R9 R3 + 0x5C280800, // 0016 MOVE R10 R4 + 0x7C1C0600, // 0017 CALL R7 3 + 0x54220003, // 0018 LDINT R8 4 + 0x7C140600, // 0019 CALL R5 3 + 0x88140109, // 001A GETMBR R5 R0 K9 + 0x78160004, // 001B JMPF R5 #0021 + 0x8C140109, // 001C GETMET R5 R0 K9 + 0x5C1C0400, // 001D MOVE R7 R2 0x5C200600, // 001E MOVE R8 R3 0x5C240800, // 001F MOVE R9 R4 - 0x5C280A00, // 0020 MOVE R10 R5 - 0x7C180800, // 0021 CALL R6 4 - 0x8818010C, // 0022 GETMBR R6 R0 K12 - 0x14180406, // 0023 LT R6 R2 R6 - 0x781A0004, // 0024 JMPF R6 #002A - 0x88180102, // 0025 GETMBR R6 R0 K2 - 0x8C180D03, // 0026 GETMET R6 R6 K3 - 0x7C180200, // 0027 CALL R6 1 - 0x5C0C0C00, // 0028 MOVE R3 R6 - 0x70020000, // 0029 JMP #002B - 0x4C0C0000, // 002A LDNIL R3 - 0x7001FFDD, // 002B JMP #000A - 0x8C10010D, // 002C GETMET R4 R0 K13 - 0x7C100200, // 002D CALL R4 1 - 0x80000000, // 002E RET 0 + 0x7C140800, // 0020 CALL R5 4 + 0x8814010A, // 0021 GETMBR R5 R0 K10 + 0x14140205, // 0022 LT R5 R1 R5 + 0x78160004, // 0023 JMPF R5 #0029 + 0x88140101, // 0024 GETMBR R5 R0 K1 + 0x8C140B02, // 0025 GETMET R5 R5 K2 + 0x7C140200, // 0026 CALL R5 1 + 0x5C080A00, // 0027 MOVE R2 R5 + 0x70020000, // 0028 JMP #002A + 0x4C080000, // 0029 LDNIL R2 + 0x7001FFDD, // 002A JMP #0009 + 0x8C0C010B, // 002B GETMET R3 R0 K11 + 0x7C0C0200, // 002C CALL R3 1 + 0x80000000, // 002D RET 0 }) ) ); @@ -683,7 +677,7 @@ be_local_closure(Matter_UDPServer_init, /* name */ ********************************************************************/ be_local_closure(Matter_UDPServer_send, /* name */ be_nested_proto( - 11, /* nstack */ + 9, /* nstack */ 2, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -691,63 +685,60 @@ be_local_closure(Matter_UDPServer_send, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[14]) { /* constants */ - /* K0 */ be_nested_str_weak(string), - /* K1 */ be_nested_str_weak(udp_socket), - /* K2 */ be_nested_str_weak(send), - /* K3 */ be_nested_str_weak(addr), - /* K4 */ be_nested_str_weak(remote_ip), - /* K5 */ be_nested_str_weak(port), - /* K6 */ be_nested_str_weak(remote_port), - /* K7 */ be_nested_str_weak(raw), - /* K8 */ be_nested_str_weak(tasmota), - /* K9 */ be_nested_str_weak(log), - /* K10 */ be_nested_str_weak(format), - /* K11 */ be_nested_str_weak(MTR_X3A_X20sending_X20packet_X20to_X20_X27_X5B_X25s_X5D_X3A_X25i_X27), - /* K12 */ be_nested_str_weak(MTR_X3A_X20error_X20sending_X20packet_X20to_X20_X27_X5B_X25s_X5D_X3A_X25i_X27), - /* K13 */ be_const_int(3), + ( &(const bvalue[12]) { /* constants */ + /* K0 */ be_nested_str_weak(udp_socket), + /* K1 */ be_nested_str_weak(send), + /* K2 */ be_nested_str_weak(addr), + /* K3 */ be_nested_str_weak(remote_ip), + /* K4 */ be_nested_str_weak(port), + /* K5 */ be_nested_str_weak(remote_port), + /* K6 */ be_nested_str_weak(raw), + /* K7 */ be_nested_str_weak(tasmota), + /* K8 */ be_nested_str_weak(log), + /* K9 */ be_nested_str_weak(MTR_X3A_X20sending_X20packet_X20to_X20_X27_X5B_X25s_X5D_X3A_X25i_X27), + /* K10 */ be_nested_str_weak(MTR_X3A_X20error_X20sending_X20packet_X20to_X20_X27_X5B_X25s_X5D_X3A_X25i_X27), + /* K11 */ be_const_int(3), }), be_str_weak(send), &be_const_str_solidified, - ( &(const binstruction[38]) { /* code */ - 0xA40A0000, // 0000 IMPORT R2 K0 - 0x880C0101, // 0001 GETMBR R3 R0 K1 - 0x8C0C0702, // 0002 GETMET R3 R3 K2 - 0x88140303, // 0003 GETMBR R5 R1 K3 - 0x78160001, // 0004 JMPF R5 #0007 - 0x88140303, // 0005 GETMBR R5 R1 K3 - 0x70020001, // 0006 JMP #0009 - 0x88140101, // 0007 GETMBR R5 R0 K1 - 0x88140B04, // 0008 GETMBR R5 R5 K4 - 0x88180305, // 0009 GETMBR R6 R1 K5 - 0x781A0001, // 000A JMPF R6 #000D - 0x88180305, // 000B GETMBR R6 R1 K5 - 0x70020001, // 000C JMP #000F - 0x88180101, // 000D GETMBR R6 R0 K1 - 0x88180D06, // 000E GETMBR R6 R6 K6 - 0x881C0307, // 000F GETMBR R7 R1 K7 - 0x7C0C0800, // 0010 CALL R3 4 - 0x780E0009, // 0011 JMPF R3 #001C - 0xB8121000, // 0012 GETNGBL R4 K8 - 0x8C100909, // 0013 GETMET R4 R4 K9 - 0x8C18050A, // 0014 GETMET R6 R2 K10 - 0x5820000B, // 0015 LDCONST R8 K11 - 0x88240303, // 0016 GETMBR R9 R1 K3 - 0x88280305, // 0017 GETMBR R10 R1 K5 - 0x7C180800, // 0018 CALL R6 4 - 0x541E0003, // 0019 LDINT R7 4 - 0x7C100600, // 001A CALL R4 3 - 0x70020008, // 001B JMP #0025 - 0xB8121000, // 001C GETNGBL R4 K8 - 0x8C100909, // 001D GETMET R4 R4 K9 - 0x8C18050A, // 001E GETMET R6 R2 K10 - 0x5820000C, // 001F LDCONST R8 K12 - 0x88240303, // 0020 GETMBR R9 R1 K3 - 0x88280305, // 0021 GETMBR R10 R1 K5 - 0x7C180800, // 0022 CALL R6 4 - 0x581C000D, // 0023 LDCONST R7 K13 - 0x7C100600, // 0024 CALL R4 3 - 0x80040600, // 0025 RET 1 R3 + ( &(const binstruction[37]) { /* code */ + 0x88080100, // 0000 GETMBR R2 R0 K0 + 0x8C080501, // 0001 GETMET R2 R2 K1 + 0x88100302, // 0002 GETMBR R4 R1 K2 + 0x78120001, // 0003 JMPF R4 #0006 + 0x88100302, // 0004 GETMBR R4 R1 K2 + 0x70020001, // 0005 JMP #0008 + 0x88100100, // 0006 GETMBR R4 R0 K0 + 0x88100903, // 0007 GETMBR R4 R4 K3 + 0x88140304, // 0008 GETMBR R5 R1 K4 + 0x78160001, // 0009 JMPF R5 #000C + 0x88140304, // 000A GETMBR R5 R1 K4 + 0x70020001, // 000B JMP #000E + 0x88140100, // 000C GETMBR R5 R0 K0 + 0x88140B05, // 000D GETMBR R5 R5 K5 + 0x88180306, // 000E GETMBR R6 R1 K6 + 0x7C080800, // 000F CALL R2 4 + 0x780A0009, // 0010 JMPF R2 #001B + 0xB80E0E00, // 0011 GETNGBL R3 K7 + 0x8C0C0708, // 0012 GETMET R3 R3 K8 + 0x60140018, // 0013 GETGBL R5 G24 + 0x58180009, // 0014 LDCONST R6 K9 + 0x881C0302, // 0015 GETMBR R7 R1 K2 + 0x88200304, // 0016 GETMBR R8 R1 K4 + 0x7C140600, // 0017 CALL R5 3 + 0x541A0003, // 0018 LDINT R6 4 + 0x7C0C0600, // 0019 CALL R3 3 + 0x70020008, // 001A JMP #0024 + 0xB80E0E00, // 001B GETNGBL R3 K7 + 0x8C0C0708, // 001C GETMET R3 R3 K8 + 0x60140018, // 001D GETGBL R5 G24 + 0x5818000A, // 001E LDCONST R6 K10 + 0x881C0302, // 001F GETMBR R7 R1 K2 + 0x88200304, // 0020 GETMBR R8 R1 K4 + 0x7C140600, // 0021 CALL R5 3 + 0x5818000B, // 0022 LDCONST R6 K11 + 0x7C0C0600, // 0023 CALL R3 3 + 0x80040400, // 0024 RET 1 R2 }) ) ); diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_UI.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_UI.h index 5aec20876..daaef0f88 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_UI.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_UI.h @@ -92,7 +92,7 @@ be_local_closure(Matter_UI_equal_map, /* name */ ********************************************************************/ be_local_closure(Matter_UI_page_part_mgr_adv, /* name */ be_nested_proto( - 6, /* nstack */ + 5, /* nstack */ 1, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -100,48 +100,46 @@ be_local_closure(Matter_UI_page_part_mgr_adv, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[12]) { /* constants */ + ( &(const bvalue[11]) { /* constants */ /* K0 */ be_nested_str_weak(webserver), - /* K1 */ be_nested_str_weak(string), - /* K2 */ be_nested_str_weak(check_privileged_access), - /* K3 */ be_nested_str_weak(content_start), - /* K4 */ be_nested_str_weak(Matter_X20Advanced_X20Configuration), - /* K5 */ be_nested_str_weak(content_send_style), - /* K6 */ be_nested_str_weak(matter_enabled), - /* K7 */ be_nested_str_weak(show_passcode_form), - /* K8 */ be_nested_str_weak(show_fabric_info), - /* K9 */ be_nested_str_weak(content_button), - /* K10 */ be_nested_str_weak(BUTTON_CONFIGURATION), - /* K11 */ be_nested_str_weak(content_stop), + /* K1 */ be_nested_str_weak(check_privileged_access), + /* K2 */ be_nested_str_weak(content_start), + /* K3 */ be_nested_str_weak(Matter_X20Advanced_X20Configuration), + /* K4 */ be_nested_str_weak(content_send_style), + /* K5 */ be_nested_str_weak(matter_enabled), + /* K6 */ be_nested_str_weak(show_passcode_form), + /* K7 */ be_nested_str_weak(show_fabric_info), + /* K8 */ be_nested_str_weak(content_button), + /* K9 */ be_nested_str_weak(BUTTON_CONFIGURATION), + /* K10 */ be_nested_str_weak(content_stop), }), be_str_weak(page_part_mgr_adv), &be_const_str_solidified, - ( &(const binstruction[25]) { /* code */ + ( &(const binstruction[24]) { /* code */ 0xA4060000, // 0000 IMPORT R1 K0 - 0xA40A0200, // 0001 IMPORT R2 K1 - 0x8C0C0302, // 0002 GETMET R3 R1 K2 - 0x7C0C0200, // 0003 CALL R3 1 - 0x740E0001, // 0004 JMPT R3 #0007 - 0x4C0C0000, // 0005 LDNIL R3 - 0x80040600, // 0006 RET 1 R3 - 0x8C0C0303, // 0007 GETMET R3 R1 K3 - 0x58140004, // 0008 LDCONST R5 K4 - 0x7C0C0400, // 0009 CALL R3 2 - 0x8C0C0305, // 000A GETMET R3 R1 K5 - 0x7C0C0200, // 000B CALL R3 1 - 0x8C0C0106, // 000C GETMET R3 R0 K6 - 0x7C0C0200, // 000D CALL R3 1 - 0x780E0003, // 000E JMPF R3 #0013 - 0x8C0C0107, // 000F GETMET R3 R0 K7 - 0x7C0C0200, // 0010 CALL R3 1 - 0x8C0C0108, // 0011 GETMET R3 R0 K8 - 0x7C0C0200, // 0012 CALL R3 1 - 0x8C0C0309, // 0013 GETMET R3 R1 K9 - 0x8814030A, // 0014 GETMBR R5 R1 K10 - 0x7C0C0400, // 0015 CALL R3 2 - 0x8C0C030B, // 0016 GETMET R3 R1 K11 - 0x7C0C0200, // 0017 CALL R3 1 - 0x80000000, // 0018 RET 0 + 0x8C080301, // 0001 GETMET R2 R1 K1 + 0x7C080200, // 0002 CALL R2 1 + 0x740A0001, // 0003 JMPT R2 #0006 + 0x4C080000, // 0004 LDNIL R2 + 0x80040400, // 0005 RET 1 R2 + 0x8C080302, // 0006 GETMET R2 R1 K2 + 0x58100003, // 0007 LDCONST R4 K3 + 0x7C080400, // 0008 CALL R2 2 + 0x8C080304, // 0009 GETMET R2 R1 K4 + 0x7C080200, // 000A CALL R2 1 + 0x8C080105, // 000B GETMET R2 R0 K5 + 0x7C080200, // 000C CALL R2 1 + 0x780A0003, // 000D JMPF R2 #0012 + 0x8C080106, // 000E GETMET R2 R0 K6 + 0x7C080200, // 000F CALL R2 1 + 0x8C080107, // 0010 GETMET R2 R0 K7 + 0x7C080200, // 0011 CALL R2 1 + 0x8C080308, // 0012 GETMET R2 R1 K8 + 0x88100309, // 0013 GETMBR R4 R1 K9 + 0x7C080400, // 0014 CALL R2 2 + 0x8C08030A, // 0015 GETMET R2 R1 K10 + 0x7C080200, // 0016 CALL R2 1 + 0x80000000, // 0017 RET 0 }) ) ); @@ -153,7 +151,7 @@ be_local_closure(Matter_UI_page_part_mgr_adv, /* name */ ********************************************************************/ be_local_closure(Matter_UI_page_part_mgr, /* name */ be_nested_proto( - 6, /* nstack */ + 5, /* nstack */ 1, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -161,57 +159,55 @@ be_local_closure(Matter_UI_page_part_mgr, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[15]) { /* constants */ + ( &(const bvalue[14]) { /* constants */ /* K0 */ be_nested_str_weak(webserver), - /* K1 */ be_nested_str_weak(string), - /* K2 */ be_nested_str_weak(check_privileged_access), - /* K3 */ be_nested_str_weak(content_start), - /* K4 */ be_nested_str_weak(Matter), - /* K5 */ be_nested_str_weak(content_send_style), - /* K6 */ be_nested_str_weak(show_enable), - /* K7 */ be_nested_str_weak(matter_enabled), - /* K8 */ be_nested_str_weak(show_plugins_configuration), - /* K9 */ be_nested_str_weak(content_send), - /* K10 */ be_nested_str_weak(_X3Cdiv_X20style_X3D_X27display_X3A_X20block_X3B_X27_X3E_X3C_X2Fdiv_X3E), - /* K11 */ be_nested_str_weak(_X3Cp_X3E_X3C_X2Fp_X3E_X3Cform_X20id_X3D_X27butmat_X27_X20style_X3D_X27display_X3A_X20block_X3B_X27_X20action_X3D_X27mattera_X27_X20method_X3D_X27get_X27_X3E_X3Cbutton_X20name_X3D_X27_X27_X3EAdvanced_X20Configuration_X3C_X2Fbutton_X3E_X3C_X2Fform_X3E), - /* K12 */ be_nested_str_weak(content_button), - /* K13 */ be_nested_str_weak(BUTTON_CONFIGURATION), - /* K14 */ be_nested_str_weak(content_stop), + /* K1 */ be_nested_str_weak(check_privileged_access), + /* K2 */ be_nested_str_weak(content_start), + /* K3 */ be_nested_str_weak(Matter), + /* K4 */ be_nested_str_weak(content_send_style), + /* K5 */ be_nested_str_weak(show_enable), + /* K6 */ be_nested_str_weak(matter_enabled), + /* K7 */ be_nested_str_weak(show_plugins_configuration), + /* K8 */ be_nested_str_weak(content_send), + /* K9 */ be_nested_str_weak(_X3Cdiv_X20style_X3D_X27display_X3A_X20block_X3B_X27_X3E_X3C_X2Fdiv_X3E), + /* K10 */ be_nested_str_weak(_X3Cp_X3E_X3C_X2Fp_X3E_X3Cform_X20id_X3D_X27butmat_X27_X20style_X3D_X27display_X3A_X20block_X3B_X27_X20action_X3D_X27mattera_X27_X20method_X3D_X27get_X27_X3E_X3Cbutton_X20name_X3D_X27_X27_X3EAdvanced_X20Configuration_X3C_X2Fbutton_X3E_X3C_X2Fform_X3E), + /* K11 */ be_nested_str_weak(content_button), + /* K12 */ be_nested_str_weak(BUTTON_CONFIGURATION), + /* K13 */ be_nested_str_weak(content_stop), }), be_str_weak(page_part_mgr), &be_const_str_solidified, - ( &(const binstruction[31]) { /* code */ + ( &(const binstruction[30]) { /* code */ 0xA4060000, // 0000 IMPORT R1 K0 - 0xA40A0200, // 0001 IMPORT R2 K1 - 0x8C0C0302, // 0002 GETMET R3 R1 K2 - 0x7C0C0200, // 0003 CALL R3 1 - 0x740E0001, // 0004 JMPT R3 #0007 - 0x4C0C0000, // 0005 LDNIL R3 - 0x80040600, // 0006 RET 1 R3 - 0x8C0C0303, // 0007 GETMET R3 R1 K3 - 0x58140004, // 0008 LDCONST R5 K4 - 0x7C0C0400, // 0009 CALL R3 2 - 0x8C0C0305, // 000A GETMET R3 R1 K5 - 0x7C0C0200, // 000B CALL R3 1 - 0x8C0C0106, // 000C GETMET R3 R0 K6 - 0x7C0C0200, // 000D CALL R3 1 - 0x8C0C0107, // 000E GETMET R3 R0 K7 - 0x7C0C0200, // 000F CALL R3 1 - 0x780E0001, // 0010 JMPF R3 #0013 - 0x8C0C0108, // 0011 GETMET R3 R0 K8 - 0x7C0C0200, // 0012 CALL R3 1 - 0x8C0C0309, // 0013 GETMET R3 R1 K9 - 0x5814000A, // 0014 LDCONST R5 K10 - 0x7C0C0400, // 0015 CALL R3 2 - 0x8C0C0309, // 0016 GETMET R3 R1 K9 - 0x5814000B, // 0017 LDCONST R5 K11 - 0x7C0C0400, // 0018 CALL R3 2 - 0x8C0C030C, // 0019 GETMET R3 R1 K12 - 0x8814030D, // 001A GETMBR R5 R1 K13 - 0x7C0C0400, // 001B CALL R3 2 - 0x8C0C030E, // 001C GETMET R3 R1 K14 - 0x7C0C0200, // 001D CALL R3 1 - 0x80000000, // 001E RET 0 + 0x8C080301, // 0001 GETMET R2 R1 K1 + 0x7C080200, // 0002 CALL R2 1 + 0x740A0001, // 0003 JMPT R2 #0006 + 0x4C080000, // 0004 LDNIL R2 + 0x80040400, // 0005 RET 1 R2 + 0x8C080302, // 0006 GETMET R2 R1 K2 + 0x58100003, // 0007 LDCONST R4 K3 + 0x7C080400, // 0008 CALL R2 2 + 0x8C080304, // 0009 GETMET R2 R1 K4 + 0x7C080200, // 000A CALL R2 1 + 0x8C080105, // 000B GETMET R2 R0 K5 + 0x7C080200, // 000C CALL R2 1 + 0x8C080106, // 000D GETMET R2 R0 K6 + 0x7C080200, // 000E CALL R2 1 + 0x780A0001, // 000F JMPF R2 #0012 + 0x8C080107, // 0010 GETMET R2 R0 K7 + 0x7C080200, // 0011 CALL R2 1 + 0x8C080308, // 0012 GETMET R2 R1 K8 + 0x58100009, // 0013 LDCONST R4 K9 + 0x7C080400, // 0014 CALL R2 2 + 0x8C080308, // 0015 GETMET R2 R1 K8 + 0x5810000A, // 0016 LDCONST R4 K10 + 0x7C080400, // 0017 CALL R2 2 + 0x8C08030B, // 0018 GETMET R2 R1 K11 + 0x8810030C, // 0019 GETMBR R4 R1 K12 + 0x7C080400, // 001A CALL R2 2 + 0x8C08030D, // 001B GETMET R2 R1 K13 + 0x7C080200, // 001C CALL R2 1 + 0x80000000, // 001D RET 0 }) ) ); @@ -431,7 +427,7 @@ be_local_closure(Matter_UI_generate_config_from_status, /* name */ ********************************************************************/ be_local_closure(Matter_UI_web_sensor, /* name */ be_nested_proto( - 12, /* nstack */ + 10, /* nstack */ 1, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -439,73 +435,70 @@ be_local_closure(Matter_UI_web_sensor, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[19]) { /* constants */ + ( &(const bvalue[17]) { /* constants */ /* K0 */ be_nested_str_weak(webserver), - /* K1 */ be_nested_str_weak(string), - /* K2 */ be_nested_str_weak(matter_enabled), - /* K3 */ be_nested_str_weak(device), - /* K4 */ be_nested_str_weak(sessions), - /* K5 */ be_nested_str_weak(count_active_fabrics), - /* K6 */ be_const_int(0), - /* K7 */ be_nested_str_weak(content_send), - /* K8 */ be_nested_str_weak(format), - /* K9 */ be_nested_str_weak(_X3Cdiv_X20style_X3D_X27text_X2Dalign_X3Aright_X3Bfont_X2Dsize_X3A11px_X3Bcolor_X3A_X23aaa_X3Bpadding_X3A0px_X3B_X27_X3E_X25s_X3C_X2Fdiv_X3E), - /* K10 */ be_nested_str_weak(Matter_X3A_X20No_X20active_X20association), - /* K11 */ be_const_int(1), - /* K12 */ be_nested_str_weak(Matter_X3A_X20), - /* K13 */ be_nested_str_weak(_X20active_X20association), - /* K14 */ be_nested_str_weak(s), - /* K15 */ be_nested_str_weak(), - /* K16 */ be_nested_str_weak(show_bridge_status), - /* K17 */ be_nested_str_weak(is_root_commissioning_open), - /* K18 */ be_nested_str_weak(show_commissioning_info), + /* K1 */ be_nested_str_weak(matter_enabled), + /* K2 */ be_nested_str_weak(device), + /* K3 */ be_nested_str_weak(sessions), + /* K4 */ be_nested_str_weak(count_active_fabrics), + /* K5 */ be_const_int(0), + /* K6 */ be_nested_str_weak(content_send), + /* K7 */ be_nested_str_weak(_X3Cdiv_X20style_X3D_X27text_X2Dalign_X3Aright_X3Bfont_X2Dsize_X3A11px_X3Bcolor_X3A_X23aaa_X3Bpadding_X3A0px_X3B_X27_X3E_X25s_X3C_X2Fdiv_X3E), + /* K8 */ be_nested_str_weak(Matter_X3A_X20No_X20active_X20association), + /* K9 */ be_const_int(1), + /* K10 */ be_nested_str_weak(Matter_X3A_X20), + /* K11 */ be_nested_str_weak(_X20active_X20association), + /* K12 */ be_nested_str_weak(s), + /* K13 */ be_nested_str_weak(), + /* K14 */ be_nested_str_weak(show_bridge_status), + /* K15 */ be_nested_str_weak(is_root_commissioning_open), + /* K16 */ be_nested_str_weak(show_commissioning_info), }), be_str_weak(web_sensor), &be_const_str_solidified, - ( &(const binstruction[43]) { /* code */ + ( &(const binstruction[42]) { /* code */ 0xA4060000, // 0000 IMPORT R1 K0 - 0xA40A0200, // 0001 IMPORT R2 K1 - 0x8C0C0102, // 0002 GETMET R3 R0 K2 - 0x7C0C0200, // 0003 CALL R3 1 - 0x780E0024, // 0004 JMPF R3 #002A - 0x880C0103, // 0005 GETMBR R3 R0 K3 - 0x880C0704, // 0006 GETMBR R3 R3 K4 - 0x8C0C0705, // 0007 GETMET R3 R3 K5 - 0x7C0C0200, // 0008 CALL R3 1 - 0x1C100706, // 0009 EQ R4 R3 K6 - 0x78120006, // 000A JMPF R4 #0012 - 0x8C100307, // 000B GETMET R4 R1 K7 - 0x8C180508, // 000C GETMET R6 R2 K8 - 0x58200009, // 000D LDCONST R8 K9 - 0x5824000A, // 000E LDCONST R9 K10 - 0x7C180600, // 000F CALL R6 3 - 0x7C100400, // 0010 CALL R4 2 - 0x7002000F, // 0011 JMP #0022 - 0x2410070B, // 0012 GT R4 R3 K11 - 0x8C140307, // 0013 GETMET R5 R1 K7 - 0x8C1C0508, // 0014 GETMET R7 R2 K8 - 0x58240009, // 0015 LDCONST R9 K9 - 0x60280008, // 0016 GETGBL R10 G8 - 0x5C2C0600, // 0017 MOVE R11 R3 - 0x7C280200, // 0018 CALL R10 1 - 0x002A180A, // 0019 ADD R10 K12 R10 - 0x0028150D, // 001A ADD R10 R10 K13 - 0x78120001, // 001B JMPF R4 #001E - 0x582C000E, // 001C LDCONST R11 K14 - 0x70020000, // 001D JMP #001F - 0x582C000F, // 001E LDCONST R11 K15 - 0x0028140B, // 001F ADD R10 R10 R11 - 0x7C1C0600, // 0020 CALL R7 3 - 0x7C140400, // 0021 CALL R5 2 - 0x8C100110, // 0022 GETMET R4 R0 K16 - 0x7C100200, // 0023 CALL R4 1 - 0x88100103, // 0024 GETMBR R4 R0 K3 - 0x8C100911, // 0025 GETMET R4 R4 K17 - 0x7C100200, // 0026 CALL R4 1 - 0x78120001, // 0027 JMPF R4 #002A - 0x8C100112, // 0028 GETMET R4 R0 K18 - 0x7C100200, // 0029 CALL R4 1 - 0x80000000, // 002A RET 0 + 0x8C080101, // 0001 GETMET R2 R0 K1 + 0x7C080200, // 0002 CALL R2 1 + 0x780A0024, // 0003 JMPF R2 #0029 + 0x88080102, // 0004 GETMBR R2 R0 K2 + 0x88080503, // 0005 GETMBR R2 R2 K3 + 0x8C080504, // 0006 GETMET R2 R2 K4 + 0x7C080200, // 0007 CALL R2 1 + 0x1C0C0505, // 0008 EQ R3 R2 K5 + 0x780E0006, // 0009 JMPF R3 #0011 + 0x8C0C0306, // 000A GETMET R3 R1 K6 + 0x60140018, // 000B GETGBL R5 G24 + 0x58180007, // 000C LDCONST R6 K7 + 0x581C0008, // 000D LDCONST R7 K8 + 0x7C140400, // 000E CALL R5 2 + 0x7C0C0400, // 000F CALL R3 2 + 0x7002000F, // 0010 JMP #0021 + 0x240C0509, // 0011 GT R3 R2 K9 + 0x8C100306, // 0012 GETMET R4 R1 K6 + 0x60180018, // 0013 GETGBL R6 G24 + 0x581C0007, // 0014 LDCONST R7 K7 + 0x60200008, // 0015 GETGBL R8 G8 + 0x5C240400, // 0016 MOVE R9 R2 + 0x7C200200, // 0017 CALL R8 1 + 0x00221408, // 0018 ADD R8 K10 R8 + 0x0020110B, // 0019 ADD R8 R8 K11 + 0x780E0001, // 001A JMPF R3 #001D + 0x5824000C, // 001B LDCONST R9 K12 + 0x70020000, // 001C JMP #001E + 0x5824000D, // 001D LDCONST R9 K13 + 0x00201009, // 001E ADD R8 R8 R9 + 0x7C180400, // 001F CALL R6 2 + 0x7C100400, // 0020 CALL R4 2 + 0x8C0C010E, // 0021 GETMET R3 R0 K14 + 0x7C0C0200, // 0022 CALL R3 1 + 0x880C0102, // 0023 GETMBR R3 R0 K2 + 0x8C0C070F, // 0024 GETMET R3 R3 K15 + 0x7C0C0200, // 0025 CALL R3 1 + 0x780E0001, // 0026 JMPF R3 #0029 + 0x8C0C0110, // 0027 GETMET R3 R0 K16 + 0x7C0C0200, // 0028 CALL R3 1 + 0x80000000, // 0029 RET 0 }) ) ); @@ -517,7 +510,7 @@ be_local_closure(Matter_UI_web_sensor, /* name */ ********************************************************************/ be_local_closure(Matter_UI_page_part_mgr_add, /* name */ be_nested_proto( - 7, /* nstack */ + 6, /* nstack */ 1, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -525,51 +518,49 @@ be_local_closure(Matter_UI_page_part_mgr_add, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[13]) { /* constants */ + ( &(const bvalue[12]) { /* constants */ /* K0 */ be_nested_str_weak(webserver), - /* K1 */ be_nested_str_weak(string), - /* K2 */ be_nested_str_weak(check_privileged_access), - /* K3 */ be_nested_str_weak(content_start), - /* K4 */ be_nested_str_weak(Matter_X20Create_X20new_X20endpoint), - /* K5 */ be_nested_str_weak(content_send_style), - /* K6 */ be_nested_str_weak(arg), - /* K7 */ be_nested_str_weak(url), - /* K8 */ be_nested_str_weak(matter_enabled), - /* K9 */ be_nested_str_weak(show_remote_autoconf), - /* K10 */ be_nested_str_weak(content_button), - /* K11 */ be_nested_str_weak(BUTTON_CONFIGURATION), - /* K12 */ be_nested_str_weak(content_stop), + /* K1 */ be_nested_str_weak(check_privileged_access), + /* K2 */ be_nested_str_weak(content_start), + /* K3 */ be_nested_str_weak(Matter_X20Create_X20new_X20endpoint), + /* K4 */ be_nested_str_weak(content_send_style), + /* K5 */ be_nested_str_weak(arg), + /* K6 */ be_nested_str_weak(url), + /* K7 */ be_nested_str_weak(matter_enabled), + /* K8 */ be_nested_str_weak(show_remote_autoconf), + /* K9 */ be_nested_str_weak(content_button), + /* K10 */ be_nested_str_weak(BUTTON_CONFIGURATION), + /* K11 */ be_nested_str_weak(content_stop), }), be_str_weak(page_part_mgr_add), &be_const_str_solidified, - ( &(const binstruction[27]) { /* code */ + ( &(const binstruction[26]) { /* code */ 0xA4060000, // 0000 IMPORT R1 K0 - 0xA40A0200, // 0001 IMPORT R2 K1 - 0x8C0C0302, // 0002 GETMET R3 R1 K2 - 0x7C0C0200, // 0003 CALL R3 1 - 0x740E0001, // 0004 JMPT R3 #0007 - 0x4C0C0000, // 0005 LDNIL R3 - 0x80040600, // 0006 RET 1 R3 - 0x8C0C0303, // 0007 GETMET R3 R1 K3 - 0x58140004, // 0008 LDCONST R5 K4 - 0x7C0C0400, // 0009 CALL R3 2 - 0x8C0C0305, // 000A GETMET R3 R1 K5 - 0x7C0C0200, // 000B CALL R3 1 - 0x8C0C0306, // 000C GETMET R3 R1 K6 - 0x58140007, // 000D LDCONST R5 K7 - 0x7C0C0400, // 000E CALL R3 2 - 0x8C100108, // 000F GETMET R4 R0 K8 - 0x7C100200, // 0010 CALL R4 1 - 0x78120002, // 0011 JMPF R4 #0015 - 0x8C100109, // 0012 GETMET R4 R0 K9 - 0x5C180600, // 0013 MOVE R6 R3 - 0x7C100400, // 0014 CALL R4 2 - 0x8C10030A, // 0015 GETMET R4 R1 K10 - 0x8818030B, // 0016 GETMBR R6 R1 K11 - 0x7C100400, // 0017 CALL R4 2 - 0x8C10030C, // 0018 GETMET R4 R1 K12 - 0x7C100200, // 0019 CALL R4 1 - 0x80000000, // 001A RET 0 + 0x8C080301, // 0001 GETMET R2 R1 K1 + 0x7C080200, // 0002 CALL R2 1 + 0x740A0001, // 0003 JMPT R2 #0006 + 0x4C080000, // 0004 LDNIL R2 + 0x80040400, // 0005 RET 1 R2 + 0x8C080302, // 0006 GETMET R2 R1 K2 + 0x58100003, // 0007 LDCONST R4 K3 + 0x7C080400, // 0008 CALL R2 2 + 0x8C080304, // 0009 GETMET R2 R1 K4 + 0x7C080200, // 000A CALL R2 1 + 0x8C080305, // 000B GETMET R2 R1 K5 + 0x58100006, // 000C LDCONST R4 K6 + 0x7C080400, // 000D CALL R2 2 + 0x8C0C0107, // 000E GETMET R3 R0 K7 + 0x7C0C0200, // 000F CALL R3 1 + 0x780E0002, // 0010 JMPF R3 #0014 + 0x8C0C0108, // 0011 GETMET R3 R0 K8 + 0x5C140400, // 0012 MOVE R5 R2 + 0x7C0C0400, // 0013 CALL R3 2 + 0x8C0C0309, // 0014 GETMET R3 R1 K9 + 0x8814030A, // 0015 GETMBR R5 R1 K10 + 0x7C0C0400, // 0016 CALL R3 2 + 0x8C0C030B, // 0017 GETMET R3 R1 K11 + 0x7C0C0200, // 0018 CALL R3 1 + 0x80000000, // 0019 RET 0 }) ) ); @@ -1107,7 +1098,7 @@ be_local_closure(Matter_UI_show_commissioning_info, /* name */ ********************************************************************/ be_local_closure(Matter_UI_show_remote_autoconf, /* name */ be_nested_proto( - 26, /* nstack */ + 24, /* nstack */ 2, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -1115,289 +1106,286 @@ be_local_closure(Matter_UI_show_remote_autoconf, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[49]) { /* constants */ + ( &(const bvalue[47]) { /* constants */ /* K0 */ be_nested_str_weak(webserver), - /* K1 */ be_nested_str_weak(string), - /* K2 */ be_nested_str_weak(json), - /* K3 */ be_nested_str_weak(), - /* K4 */ be_nested_str_weak(matter), - /* K5 */ be_nested_str_weak(Plugin_Bridge_HTTP), - /* K6 */ be_nested_str_weak(PROBE_TIMEOUT), - /* K7 */ be_nested_str_weak(HTTP_remote), - /* K8 */ be_nested_str_weak(call_sync), - /* K9 */ be_nested_str_weak(Status_X208), - /* K10 */ be_nested_str_weak(load), - /* K11 */ be_nested_str_weak(find), - /* K12 */ be_nested_str_weak(StatusSNS), - /* K13 */ be_nested_str_weak(Status_X2011), - /* K14 */ be_nested_str_weak(StatusSTS), - /* K15 */ be_nested_str_weak(tasmota), - /* K16 */ be_nested_str_weak(log), - /* K17 */ be_nested_str_weak(format), - /* K18 */ be_nested_str_weak(MTR_X3A_X20probed_X20_X27_X25s_X27_X20status8_X3D_X25s_X20satus11_X3D_X25s), - /* K19 */ be_const_int(3), - /* K20 */ be_nested_str_weak(generate_config_from_status), - /* K21 */ be_nested_str_weak(show_plugins_hints_js), - /* K22 */ be_nested_str_weak(_CLASSES_TYPES2), - /* K23 */ be_nested_str_weak(content_send), - /* K24 */ be_nested_str_weak(_X3Cfieldset_X3E_X3Clegend_X3E_X3Cb_X3E_X26nbsp_X3BMatter_X20Remote_X20Device_X26nbsp_X3B_X3C_X2Fb_X3E_X3C_X2Flegend_X3E_X3Cp_X3E_X3C_X2Fp_X3E_X3Cp_X3E_X3Cb_X3EAdd_X20Remote_X20sensor_X20or_X20device_X3C_X2Fb_X3E_X3C_X2Fp_X3E), - /* K25 */ be_nested_str_weak(_X3Cp_X3E_X26_X23x1F517_X3B_X20_X3Ca_X20target_X3D_X27_blank_X27_X20href_X3D_X22http_X3A_X2F_X2F_X25s_X2F_X3F_X22_X3E_X25s_X3C_X2Fa_X3E_X3C_X2Fp_X3E), - /* K26 */ be_nested_str_weak(html_escape), - /* K27 */ be_nested_str_weak(_X3Cform_X20action_X3D_X27_X2Fmatterc_X27_X20method_X3D_X27post_X27_X3E_X3Ctable_X20style_X3D_X27width_X3A100_X25_X27_X3E_X3Ctr_X3E_X3Ctd_X20width_X3D_X27100_X27_X20style_X3D_X27font_X2Dsize_X3Asmaller_X3B_X27_X3EName_X3C_X2Ftd_X3E_X3Ctd_X20width_X3D_X27115_X27_X20style_X3D_X27font_X2Dsize_X3Asmaller_X3B_X27_X3EType_X3C_X2Ftd_X3E_X3Ctd_X20style_X3D_X27font_X2Dsize_X3Asmaller_X3B_X27_X3EParameter_X3C_X2Ftd_X3E_X3C_X2Ftr_X3E), - /* K28 */ be_nested_str_weak(_X3Cinput_X20name_X3D_X27url_X27_X20type_X3D_X27hidden_X27_X20value_X3D_X27_X25s_X27_X3E), - /* K29 */ be_const_int(0), - /* K30 */ be_nested_str_weak(type), - /* K31 */ be_nested_str_weak(http_), - /* K32 */ be_nested_str_weak(device), - /* K33 */ be_nested_str_weak(plugins_classes), - /* K34 */ be_nested_str_weak(ui_conf_to_string), - /* K35 */ be_nested_str_weak(_X3Ctr_X3E_X3Ctd_X20style_X3D_X27font_X2Dsize_X3Asmaller_X3B_X27_X3E_X3Cinput_X20type_X3D_X27text_X27_X20name_X3D_X27nam_X25i_X27_X20size_X3D_X271_X27_X20value_X3D_X27_X27_X20placeholder_X3D_X27_X28optional_X29_X27_X3E_X3C_X2Ftd_X3E), - /* K36 */ be_nested_str_weak(_X3Ctd_X20style_X3D_X27font_X2Dsize_X3Asmaller_X3B_X27_X3E_X3Cselect_X20name_X3D_X27pi_X25i_X27_X20onchange_X3D_X27otm_X28_X22arg_X25i_X22_X2Cthis_X2Evalue_X29_X27_X3E), - /* K37 */ be_nested_str_weak(plugin_option), - /* K38 */ be_nested_str_weak(_X3C_X2Fselect_X3E_X3C_X2Ftd_X3E_X3Ctd_X20style_X3D_X27font_X2Dsize_X3Asmaller_X3B_X27_X3E), - /* K39 */ be_nested_str_weak(_X3Cinput_X20type_X3D_X27text_X27_X20id_X3D_X27arg_X25i_X27_X20name_X3D_X27arg_X25i_X27_X20size_X3D_X271_X27_X20value_X3D_X27_X25s_X27_X20placeholder_X3D_X27_X25s_X27_X3E), - /* K40 */ be_nested_str_weak(ARG_HINT), - /* K41 */ be_nested_str_weak(_X3C_X2Ftd_X3E_X3C_X2Ftr_X3E), - /* K42 */ be_const_int(1), - /* K43 */ be_nested_str_weak(_X3Cinput_X20type_X3D_X27text_X27_X20id_X3D_X27arg_X25i_X27_X20name_X3D_X27arg_X25i_X27_X20size_X3D_X271_X27_X20value_X3D_X27_X25s_X27_X3E), - /* K44 */ be_nested_str_weak(_X3C_X2Ftable_X3E), - /* K45 */ be_nested_str_weak(_X3Cdiv_X20style_X3D_X27display_X3A_X20block_X3B_X27_X3E_X3C_X2Fdiv_X3E), - /* K46 */ be_nested_str_weak(_X3Cbutton_X20name_X3D_X27addrem_X27_X20class_X3D_X27button_X20bgrn_X27_X3EAdd_X20endpoints_X3C_X2Fbutton_X3E_X3C_X2Fform_X3E), - /* K47 */ be_nested_str_weak(_X3C_X2Fform_X3E_X3C_X2Ffieldset_X3E), - /* K48 */ be_nested_str_weak(_X3Cp_X3E_X3Cb_X3EUnable_X20to_X20connect_X20to_X20_X27_X25s_X27_X3C_X2Fb_X3E_X3C_X2Fp_X3E), + /* K1 */ be_nested_str_weak(json), + /* K2 */ be_nested_str_weak(), + /* K3 */ be_nested_str_weak(matter), + /* K4 */ be_nested_str_weak(Plugin_Bridge_HTTP), + /* K5 */ be_nested_str_weak(PROBE_TIMEOUT), + /* K6 */ be_nested_str_weak(HTTP_remote), + /* K7 */ be_nested_str_weak(call_sync), + /* K8 */ be_nested_str_weak(Status_X208), + /* K9 */ be_nested_str_weak(load), + /* K10 */ be_nested_str_weak(find), + /* K11 */ be_nested_str_weak(StatusSNS), + /* K12 */ be_nested_str_weak(Status_X2011), + /* K13 */ be_nested_str_weak(StatusSTS), + /* K14 */ be_nested_str_weak(tasmota), + /* K15 */ be_nested_str_weak(log), + /* K16 */ be_nested_str_weak(MTR_X3A_X20probed_X20_X27_X25s_X27_X20status8_X3D_X25s_X20satus11_X3D_X25s), + /* K17 */ be_const_int(3), + /* K18 */ be_nested_str_weak(generate_config_from_status), + /* K19 */ be_nested_str_weak(show_plugins_hints_js), + /* K20 */ be_nested_str_weak(_CLASSES_TYPES2), + /* K21 */ be_nested_str_weak(content_send), + /* K22 */ be_nested_str_weak(_X3Cfieldset_X3E_X3Clegend_X3E_X3Cb_X3E_X26nbsp_X3BMatter_X20Remote_X20Device_X26nbsp_X3B_X3C_X2Fb_X3E_X3C_X2Flegend_X3E_X3Cp_X3E_X3C_X2Fp_X3E_X3Cp_X3E_X3Cb_X3EAdd_X20Remote_X20sensor_X20or_X20device_X3C_X2Fb_X3E_X3C_X2Fp_X3E), + /* K23 */ be_nested_str_weak(_X3Cp_X3E_X26_X23x1F517_X3B_X20_X3Ca_X20target_X3D_X27_blank_X27_X20href_X3D_X22http_X3A_X2F_X2F_X25s_X2F_X3F_X22_X3E_X25s_X3C_X2Fa_X3E_X3C_X2Fp_X3E), + /* K24 */ be_nested_str_weak(html_escape), + /* K25 */ be_nested_str_weak(_X3Cform_X20action_X3D_X27_X2Fmatterc_X27_X20method_X3D_X27post_X27_X3E_X3Ctable_X20style_X3D_X27width_X3A100_X25_X27_X3E_X3Ctr_X3E_X3Ctd_X20width_X3D_X27100_X27_X20style_X3D_X27font_X2Dsize_X3Asmaller_X3B_X27_X3EName_X3C_X2Ftd_X3E_X3Ctd_X20width_X3D_X27115_X27_X20style_X3D_X27font_X2Dsize_X3Asmaller_X3B_X27_X3EType_X3C_X2Ftd_X3E_X3Ctd_X20style_X3D_X27font_X2Dsize_X3Asmaller_X3B_X27_X3EParameter_X3C_X2Ftd_X3E_X3C_X2Ftr_X3E), + /* K26 */ be_nested_str_weak(_X3Cinput_X20name_X3D_X27url_X27_X20type_X3D_X27hidden_X27_X20value_X3D_X27_X25s_X27_X3E), + /* K27 */ be_const_int(0), + /* K28 */ be_nested_str_weak(type), + /* K29 */ be_nested_str_weak(http_), + /* K30 */ be_nested_str_weak(device), + /* K31 */ be_nested_str_weak(plugins_classes), + /* K32 */ be_nested_str_weak(ui_conf_to_string), + /* K33 */ be_nested_str_weak(_X3Ctr_X3E_X3Ctd_X20style_X3D_X27font_X2Dsize_X3Asmaller_X3B_X27_X3E_X3Cinput_X20type_X3D_X27text_X27_X20name_X3D_X27nam_X25i_X27_X20size_X3D_X271_X27_X20value_X3D_X27_X27_X20placeholder_X3D_X27_X28optional_X29_X27_X3E_X3C_X2Ftd_X3E), + /* K34 */ be_nested_str_weak(_X3Ctd_X20style_X3D_X27font_X2Dsize_X3Asmaller_X3B_X27_X3E_X3Cselect_X20name_X3D_X27pi_X25i_X27_X20onchange_X3D_X27otm_X28_X22arg_X25i_X22_X2Cthis_X2Evalue_X29_X27_X3E), + /* K35 */ be_nested_str_weak(plugin_option), + /* K36 */ be_nested_str_weak(_X3C_X2Fselect_X3E_X3C_X2Ftd_X3E_X3Ctd_X20style_X3D_X27font_X2Dsize_X3Asmaller_X3B_X27_X3E), + /* K37 */ be_nested_str_weak(_X3Cinput_X20type_X3D_X27text_X27_X20id_X3D_X27arg_X25i_X27_X20name_X3D_X27arg_X25i_X27_X20size_X3D_X271_X27_X20value_X3D_X27_X25s_X27_X20placeholder_X3D_X27_X25s_X27_X3E), + /* K38 */ be_nested_str_weak(ARG_HINT), + /* K39 */ be_nested_str_weak(_X3C_X2Ftd_X3E_X3C_X2Ftr_X3E), + /* K40 */ be_const_int(1), + /* K41 */ be_nested_str_weak(_X3Cinput_X20type_X3D_X27text_X27_X20id_X3D_X27arg_X25i_X27_X20name_X3D_X27arg_X25i_X27_X20size_X3D_X271_X27_X20value_X3D_X27_X25s_X27_X3E), + /* K42 */ be_nested_str_weak(_X3C_X2Ftable_X3E), + /* K43 */ be_nested_str_weak(_X3Cdiv_X20style_X3D_X27display_X3A_X20block_X3B_X27_X3E_X3C_X2Fdiv_X3E), + /* K44 */ be_nested_str_weak(_X3Cbutton_X20name_X3D_X27addrem_X27_X20class_X3D_X27button_X20bgrn_X27_X3EAdd_X20endpoints_X3C_X2Fbutton_X3E_X3C_X2Fform_X3E), + /* K45 */ be_nested_str_weak(_X3C_X2Fform_X3E_X3C_X2Ffieldset_X3E), + /* K46 */ be_nested_str_weak(_X3Cp_X3E_X3Cb_X3EUnable_X20to_X20connect_X20to_X20_X27_X25s_X27_X3C_X2Fb_X3E_X3C_X2Fp_X3E), }), be_str_weak(show_remote_autoconf), &be_const_str_solidified, - ( &(const binstruction[229]) { /* code */ + ( &(const binstruction[228]) { /* code */ 0xA40A0000, // 0000 IMPORT R2 K0 0xA40E0200, // 0001 IMPORT R3 K1 - 0xA4120400, // 0002 IMPORT R4 K2 - 0x1C140303, // 0003 EQ R5 R1 K3 - 0x78160000, // 0004 JMPF R5 #0006 - 0x80000A00, // 0005 RET 0 - 0xB8160800, // 0006 GETNGBL R5 K4 - 0x88140B05, // 0007 GETMBR R5 R5 K5 - 0x88140B06, // 0008 GETMBR R5 R5 K6 - 0xB81A0800, // 0009 GETNGBL R6 K4 - 0x8C180D07, // 000A GETMET R6 R6 K7 - 0x5C200200, // 000B MOVE R8 R1 - 0x5C240A00, // 000C MOVE R9 R5 - 0x7C180600, // 000D CALL R6 3 - 0x8C1C0D08, // 000E GETMET R7 R6 K8 - 0x58240009, // 000F LDCONST R9 K9 - 0x5C280A00, // 0010 MOVE R10 R5 - 0x7C1C0600, // 0011 CALL R7 3 - 0x4C200000, // 0012 LDNIL R8 - 0x20200E08, // 0013 NE R8 R7 R8 - 0x78220003, // 0014 JMPF R8 #0019 - 0x8C20090A, // 0015 GETMET R8 R4 K10 - 0x5C280E00, // 0016 MOVE R10 R7 - 0x7C200400, // 0017 CALL R8 2 - 0x5C1C1000, // 0018 MOVE R7 R8 - 0x4C200000, // 0019 LDNIL R8 - 0x20200E08, // 001A NE R8 R7 R8 - 0x78220003, // 001B JMPF R8 #0020 - 0x8C200F0B, // 001C GETMET R8 R7 K11 - 0x5828000C, // 001D LDCONST R10 K12 - 0x7C200400, // 001E CALL R8 2 - 0x5C1C1000, // 001F MOVE R7 R8 + 0x1C100302, // 0002 EQ R4 R1 K2 + 0x78120000, // 0003 JMPF R4 #0005 + 0x80000800, // 0004 RET 0 + 0xB8120600, // 0005 GETNGBL R4 K3 + 0x88100904, // 0006 GETMBR R4 R4 K4 + 0x88100905, // 0007 GETMBR R4 R4 K5 + 0xB8160600, // 0008 GETNGBL R5 K3 + 0x8C140B06, // 0009 GETMET R5 R5 K6 + 0x5C1C0200, // 000A MOVE R7 R1 + 0x5C200800, // 000B MOVE R8 R4 + 0x7C140600, // 000C CALL R5 3 + 0x8C180B07, // 000D GETMET R6 R5 K7 + 0x58200008, // 000E LDCONST R8 K8 + 0x5C240800, // 000F MOVE R9 R4 + 0x7C180600, // 0010 CALL R6 3 + 0x4C1C0000, // 0011 LDNIL R7 + 0x201C0C07, // 0012 NE R7 R6 R7 + 0x781E0003, // 0013 JMPF R7 #0018 + 0x8C1C0709, // 0014 GETMET R7 R3 K9 + 0x5C240C00, // 0015 MOVE R9 R6 + 0x7C1C0400, // 0016 CALL R7 2 + 0x5C180E00, // 0017 MOVE R6 R7 + 0x4C1C0000, // 0018 LDNIL R7 + 0x201C0C07, // 0019 NE R7 R6 R7 + 0x781E0003, // 001A JMPF R7 #001F + 0x8C1C0D0A, // 001B GETMET R7 R6 K10 + 0x5824000B, // 001C LDCONST R9 K11 + 0x7C1C0400, // 001D CALL R7 2 + 0x5C180E00, // 001E MOVE R6 R7 + 0x4C1C0000, // 001F LDNIL R7 0x4C200000, // 0020 LDNIL R8 - 0x4C240000, // 0021 LDNIL R9 - 0x20240E09, // 0022 NE R9 R7 R9 - 0x78260012, // 0023 JMPF R9 #0037 - 0x8C240D08, // 0024 GETMET R9 R6 K8 - 0x582C000D, // 0025 LDCONST R11 K13 - 0x5C300A00, // 0026 MOVE R12 R5 - 0x7C240600, // 0027 CALL R9 3 - 0x5C201200, // 0028 MOVE R8 R9 - 0x4C240000, // 0029 LDNIL R9 - 0x20241009, // 002A NE R9 R8 R9 - 0x78260003, // 002B JMPF R9 #0030 - 0x8C24090A, // 002C GETMET R9 R4 K10 - 0x5C2C1000, // 002D MOVE R11 R8 - 0x7C240400, // 002E CALL R9 2 - 0x5C201200, // 002F MOVE R8 R9 - 0x4C240000, // 0030 LDNIL R9 - 0x20241009, // 0031 NE R9 R8 R9 - 0x78260003, // 0032 JMPF R9 #0037 - 0x8C24110B, // 0033 GETMET R9 R8 K11 - 0x582C000E, // 0034 LDCONST R11 K14 - 0x7C240400, // 0035 CALL R9 2 - 0x5C201200, // 0036 MOVE R8 R9 - 0x4C240000, // 0037 LDNIL R9 - 0x20240E09, // 0038 NE R9 R7 R9 - 0x782600A1, // 0039 JMPF R9 #00DC - 0x4C240000, // 003A LDNIL R9 - 0x20241009, // 003B NE R9 R8 R9 - 0x7826009E, // 003C JMPF R9 #00DC - 0xB8261E00, // 003D GETNGBL R9 K15 - 0x8C241310, // 003E GETMET R9 R9 K16 - 0x8C2C0711, // 003F GETMET R11 R3 K17 - 0x58340012, // 0040 LDCONST R13 K18 - 0x5C380200, // 0041 MOVE R14 R1 - 0x603C0008, // 0042 GETGBL R15 G8 - 0x5C400E00, // 0043 MOVE R16 R7 - 0x7C3C0200, // 0044 CALL R15 1 - 0x60400008, // 0045 GETGBL R16 G8 - 0x5C441000, // 0046 MOVE R17 R8 - 0x7C400200, // 0047 CALL R16 1 - 0x7C2C0A00, // 0048 CALL R11 5 - 0x58300013, // 0049 LDCONST R12 K19 - 0x7C240600, // 004A CALL R9 3 - 0x8C240114, // 004B GETMET R9 R0 K20 + 0x20200C08, // 0021 NE R8 R6 R8 + 0x78220012, // 0022 JMPF R8 #0036 + 0x8C200B07, // 0023 GETMET R8 R5 K7 + 0x5828000C, // 0024 LDCONST R10 K12 + 0x5C2C0800, // 0025 MOVE R11 R4 + 0x7C200600, // 0026 CALL R8 3 + 0x5C1C1000, // 0027 MOVE R7 R8 + 0x4C200000, // 0028 LDNIL R8 + 0x20200E08, // 0029 NE R8 R7 R8 + 0x78220003, // 002A JMPF R8 #002F + 0x8C200709, // 002B GETMET R8 R3 K9 + 0x5C280E00, // 002C MOVE R10 R7 + 0x7C200400, // 002D CALL R8 2 + 0x5C1C1000, // 002E MOVE R7 R8 + 0x4C200000, // 002F LDNIL R8 + 0x20200E08, // 0030 NE R8 R7 R8 + 0x78220003, // 0031 JMPF R8 #0036 + 0x8C200F0A, // 0032 GETMET R8 R7 K10 + 0x5828000D, // 0033 LDCONST R10 K13 + 0x7C200400, // 0034 CALL R8 2 + 0x5C1C1000, // 0035 MOVE R7 R8 + 0x4C200000, // 0036 LDNIL R8 + 0x20200C08, // 0037 NE R8 R6 R8 + 0x782200A1, // 0038 JMPF R8 #00DB + 0x4C200000, // 0039 LDNIL R8 + 0x20200E08, // 003A NE R8 R7 R8 + 0x7822009E, // 003B JMPF R8 #00DB + 0xB8221C00, // 003C GETNGBL R8 K14 + 0x8C20110F, // 003D GETMET R8 R8 K15 + 0x60280018, // 003E GETGBL R10 G24 + 0x582C0010, // 003F LDCONST R11 K16 + 0x5C300200, // 0040 MOVE R12 R1 + 0x60340008, // 0041 GETGBL R13 G8 + 0x5C380C00, // 0042 MOVE R14 R6 + 0x7C340200, // 0043 CALL R13 1 + 0x60380008, // 0044 GETGBL R14 G8 + 0x5C3C0E00, // 0045 MOVE R15 R7 + 0x7C380200, // 0046 CALL R14 1 + 0x7C280800, // 0047 CALL R10 4 + 0x582C0011, // 0048 LDCONST R11 K17 + 0x7C200600, // 0049 CALL R8 3 + 0x8C200112, // 004A GETMET R8 R0 K18 + 0x5C280C00, // 004B MOVE R10 R6 0x5C2C0E00, // 004C MOVE R11 R7 - 0x5C301000, // 004D MOVE R12 R8 - 0x7C240600, // 004E CALL R9 3 - 0x8C280115, // 004F GETMET R10 R0 K21 - 0x88300116, // 0050 GETMBR R12 R0 K22 - 0x7C280400, // 0051 CALL R10 2 - 0x8C280517, // 0052 GETMET R10 R2 K23 - 0x58300018, // 0053 LDCONST R12 K24 - 0x7C280400, // 0054 CALL R10 2 - 0x8C280517, // 0055 GETMET R10 R2 K23 - 0x8C300711, // 0056 GETMET R12 R3 K17 - 0x58380019, // 0057 LDCONST R14 K25 - 0x8C3C051A, // 0058 GETMET R15 R2 K26 - 0x5C440200, // 0059 MOVE R17 R1 - 0x7C3C0400, // 005A CALL R15 2 - 0x8C40051A, // 005B GETMET R16 R2 K26 - 0x5C480200, // 005C MOVE R18 R1 - 0x7C400400, // 005D CALL R16 2 - 0x7C300800, // 005E CALL R12 4 - 0x7C280400, // 005F CALL R10 2 - 0x8C280517, // 0060 GETMET R10 R2 K23 - 0x5830001B, // 0061 LDCONST R12 K27 - 0x7C280400, // 0062 CALL R10 2 - 0x8C280517, // 0063 GETMET R10 R2 K23 - 0x8C300711, // 0064 GETMET R12 R3 K17 - 0x5838001C, // 0065 LDCONST R14 K28 - 0x8C3C051A, // 0066 GETMET R15 R2 K26 - 0x5C440200, // 0067 MOVE R17 R1 - 0x7C3C0400, // 0068 CALL R15 2 - 0x7C300600, // 0069 CALL R12 3 - 0x7C280400, // 006A CALL R10 2 - 0x5828001D, // 006B LDCONST R10 K29 - 0x602C000C, // 006C GETGBL R11 G12 - 0x5C301200, // 006D MOVE R12 R9 - 0x7C2C0200, // 006E CALL R11 1 - 0x142C140B, // 006F LT R11 R10 R11 - 0x782E003E, // 0070 JMPF R11 #00B0 - 0x942C120A, // 0071 GETIDX R11 R9 R10 - 0x8C30170B, // 0072 GETMET R12 R11 K11 - 0x5838001E, // 0073 LDCONST R14 K30 - 0x583C0003, // 0074 LDCONST R15 K3 - 0x7C300600, // 0075 CALL R12 3 - 0x20341903, // 0076 NE R13 R12 K3 - 0x78360000, // 0077 JMPF R13 #0079 - 0x00323E0C, // 0078 ADD R12 K31 R12 - 0x88340120, // 0079 GETMBR R13 R0 K32 - 0x88341B21, // 007A GETMBR R13 R13 K33 - 0x8C341B0B, // 007B GETMET R13 R13 K11 - 0x5C3C1800, // 007C MOVE R15 R12 - 0x7C340400, // 007D CALL R13 2 - 0x58380003, // 007E LDCONST R14 K3 - 0x4C3C0000, // 007F LDNIL R15 - 0x203C1A0F, // 0080 NE R15 R13 R15 - 0x783E0004, // 0081 JMPF R15 #0087 - 0x8C3C1B22, // 0082 GETMET R15 R13 K34 - 0x5C441A00, // 0083 MOVE R17 R13 - 0x5C481600, // 0084 MOVE R18 R11 - 0x7C3C0600, // 0085 CALL R15 3 - 0x5C381E00, // 0086 MOVE R14 R15 - 0x8C3C0517, // 0087 GETMET R15 R2 K23 - 0x8C440711, // 0088 GETMET R17 R3 K17 - 0x584C0023, // 0089 LDCONST R19 K35 - 0x5C501400, // 008A MOVE R20 R10 - 0x7C440600, // 008B CALL R17 3 - 0x7C3C0400, // 008C CALL R15 2 - 0x8C3C0517, // 008D GETMET R15 R2 K23 - 0x8C440711, // 008E GETMET R17 R3 K17 - 0x584C0024, // 008F LDCONST R19 K36 - 0x5C501400, // 0090 MOVE R20 R10 - 0x5C541400, // 0091 MOVE R21 R10 - 0x7C440800, // 0092 CALL R17 4 - 0x7C3C0400, // 0093 CALL R15 2 - 0x8C3C0125, // 0094 GETMET R15 R0 K37 - 0x5C441800, // 0095 MOVE R17 R12 - 0x88480116, // 0096 GETMBR R18 R0 K22 - 0x7C3C0600, // 0097 CALL R15 3 - 0x8C3C0517, // 0098 GETMET R15 R2 K23 - 0x58440026, // 0099 LDCONST R17 K38 - 0x7C3C0400, // 009A CALL R15 2 - 0x8C3C0517, // 009B GETMET R15 R2 K23 - 0x8C440711, // 009C GETMET R17 R3 K17 - 0x584C0027, // 009D LDCONST R19 K39 - 0x5C501400, // 009E MOVE R20 R10 - 0x5C541400, // 009F MOVE R21 R10 - 0x8C58051A, // 00A0 GETMET R22 R2 K26 - 0x5C601C00, // 00A1 MOVE R24 R14 - 0x7C580400, // 00A2 CALL R22 2 - 0x78360003, // 00A3 JMPF R13 #00A8 - 0x8C5C051A, // 00A4 GETMET R23 R2 K26 - 0x88641B28, // 00A5 GETMBR R25 R13 K40 - 0x7C5C0400, // 00A6 CALL R23 2 - 0x70020000, // 00A7 JMP #00A9 - 0x585C0003, // 00A8 LDCONST R23 K3 - 0x7C440C00, // 00A9 CALL R17 6 - 0x7C3C0400, // 00AA CALL R15 2 - 0x8C3C0517, // 00AB GETMET R15 R2 K23 - 0x58440029, // 00AC LDCONST R17 K41 - 0x7C3C0400, // 00AD CALL R15 2 - 0x0028152A, // 00AE ADD R10 R10 K42 - 0x7001FFBB, // 00AF JMP #006C - 0x8C2C0517, // 00B0 GETMET R11 R2 K23 - 0x8C340711, // 00B1 GETMET R13 R3 K17 - 0x583C0023, // 00B2 LDCONST R15 K35 - 0x5C401400, // 00B3 MOVE R16 R10 - 0x7C340600, // 00B4 CALL R13 3 - 0x7C2C0400, // 00B5 CALL R11 2 - 0x8C2C0517, // 00B6 GETMET R11 R2 K23 - 0x8C340711, // 00B7 GETMET R13 R3 K17 - 0x583C0024, // 00B8 LDCONST R15 K36 - 0x5C401400, // 00B9 MOVE R16 R10 - 0x5C441400, // 00BA MOVE R17 R10 - 0x7C340800, // 00BB CALL R13 4 - 0x7C2C0400, // 00BC CALL R11 2 - 0x8C2C0125, // 00BD GETMET R11 R0 K37 - 0x58340003, // 00BE LDCONST R13 K3 - 0x88380116, // 00BF GETMBR R14 R0 K22 - 0x7C2C0600, // 00C0 CALL R11 3 - 0x8C2C0517, // 00C1 GETMET R11 R2 K23 - 0x58340026, // 00C2 LDCONST R13 K38 - 0x7C2C0400, // 00C3 CALL R11 2 - 0x8C2C0517, // 00C4 GETMET R11 R2 K23 - 0x8C340711, // 00C5 GETMET R13 R3 K17 - 0x583C002B, // 00C6 LDCONST R15 K43 - 0x5C401400, // 00C7 MOVE R16 R10 - 0x5C441400, // 00C8 MOVE R17 R10 - 0x58480003, // 00C9 LDCONST R18 K3 - 0x7C340A00, // 00CA CALL R13 5 - 0x7C2C0400, // 00CB CALL R11 2 - 0x8C2C0517, // 00CC GETMET R11 R2 K23 - 0x58340029, // 00CD LDCONST R13 K41 - 0x7C2C0400, // 00CE CALL R11 2 - 0x8C2C0517, // 00CF GETMET R11 R2 K23 - 0x5834002C, // 00D0 LDCONST R13 K44 - 0x7C2C0400, // 00D1 CALL R11 2 - 0x8C2C0517, // 00D2 GETMET R11 R2 K23 - 0x5834002D, // 00D3 LDCONST R13 K45 - 0x7C2C0400, // 00D4 CALL R11 2 - 0x8C2C0517, // 00D5 GETMET R11 R2 K23 - 0x5834002E, // 00D6 LDCONST R13 K46 - 0x7C2C0400, // 00D7 CALL R11 2 - 0x8C2C0517, // 00D8 GETMET R11 R2 K23 - 0x5834002F, // 00D9 LDCONST R13 K47 - 0x7C2C0400, // 00DA CALL R11 2 - 0x70020007, // 00DB JMP #00E4 - 0x8C240517, // 00DC GETMET R9 R2 K23 - 0x8C2C0711, // 00DD GETMET R11 R3 K17 - 0x58340030, // 00DE LDCONST R13 K48 - 0x8C38051A, // 00DF GETMET R14 R2 K26 - 0x5C400200, // 00E0 MOVE R16 R1 - 0x7C380400, // 00E1 CALL R14 2 - 0x7C2C0600, // 00E2 CALL R11 3 - 0x7C240400, // 00E3 CALL R9 2 - 0x80000000, // 00E4 RET 0 + 0x7C200600, // 004D CALL R8 3 + 0x8C240113, // 004E GETMET R9 R0 K19 + 0x882C0114, // 004F GETMBR R11 R0 K20 + 0x7C240400, // 0050 CALL R9 2 + 0x8C240515, // 0051 GETMET R9 R2 K21 + 0x582C0016, // 0052 LDCONST R11 K22 + 0x7C240400, // 0053 CALL R9 2 + 0x8C240515, // 0054 GETMET R9 R2 K21 + 0x602C0018, // 0055 GETGBL R11 G24 + 0x58300017, // 0056 LDCONST R12 K23 + 0x8C340518, // 0057 GETMET R13 R2 K24 + 0x5C3C0200, // 0058 MOVE R15 R1 + 0x7C340400, // 0059 CALL R13 2 + 0x8C380518, // 005A GETMET R14 R2 K24 + 0x5C400200, // 005B MOVE R16 R1 + 0x7C380400, // 005C CALL R14 2 + 0x7C2C0600, // 005D CALL R11 3 + 0x7C240400, // 005E CALL R9 2 + 0x8C240515, // 005F GETMET R9 R2 K21 + 0x582C0019, // 0060 LDCONST R11 K25 + 0x7C240400, // 0061 CALL R9 2 + 0x8C240515, // 0062 GETMET R9 R2 K21 + 0x602C0018, // 0063 GETGBL R11 G24 + 0x5830001A, // 0064 LDCONST R12 K26 + 0x8C340518, // 0065 GETMET R13 R2 K24 + 0x5C3C0200, // 0066 MOVE R15 R1 + 0x7C340400, // 0067 CALL R13 2 + 0x7C2C0400, // 0068 CALL R11 2 + 0x7C240400, // 0069 CALL R9 2 + 0x5824001B, // 006A LDCONST R9 K27 + 0x6028000C, // 006B GETGBL R10 G12 + 0x5C2C1000, // 006C MOVE R11 R8 + 0x7C280200, // 006D CALL R10 1 + 0x1428120A, // 006E LT R10 R9 R10 + 0x782A003E, // 006F JMPF R10 #00AF + 0x94281009, // 0070 GETIDX R10 R8 R9 + 0x8C2C150A, // 0071 GETMET R11 R10 K10 + 0x5834001C, // 0072 LDCONST R13 K28 + 0x58380002, // 0073 LDCONST R14 K2 + 0x7C2C0600, // 0074 CALL R11 3 + 0x20301702, // 0075 NE R12 R11 K2 + 0x78320000, // 0076 JMPF R12 #0078 + 0x002E3A0B, // 0077 ADD R11 K29 R11 + 0x8830011E, // 0078 GETMBR R12 R0 K30 + 0x8830191F, // 0079 GETMBR R12 R12 K31 + 0x8C30190A, // 007A GETMET R12 R12 K10 + 0x5C381600, // 007B MOVE R14 R11 + 0x7C300400, // 007C CALL R12 2 + 0x58340002, // 007D LDCONST R13 K2 + 0x4C380000, // 007E LDNIL R14 + 0x2038180E, // 007F NE R14 R12 R14 + 0x783A0004, // 0080 JMPF R14 #0086 + 0x8C381920, // 0081 GETMET R14 R12 K32 + 0x5C401800, // 0082 MOVE R16 R12 + 0x5C441400, // 0083 MOVE R17 R10 + 0x7C380600, // 0084 CALL R14 3 + 0x5C341C00, // 0085 MOVE R13 R14 + 0x8C380515, // 0086 GETMET R14 R2 K21 + 0x60400018, // 0087 GETGBL R16 G24 + 0x58440021, // 0088 LDCONST R17 K33 + 0x5C481200, // 0089 MOVE R18 R9 + 0x7C400400, // 008A CALL R16 2 + 0x7C380400, // 008B CALL R14 2 + 0x8C380515, // 008C GETMET R14 R2 K21 + 0x60400018, // 008D GETGBL R16 G24 + 0x58440022, // 008E LDCONST R17 K34 + 0x5C481200, // 008F MOVE R18 R9 + 0x5C4C1200, // 0090 MOVE R19 R9 + 0x7C400600, // 0091 CALL R16 3 + 0x7C380400, // 0092 CALL R14 2 + 0x8C380123, // 0093 GETMET R14 R0 K35 + 0x5C401600, // 0094 MOVE R16 R11 + 0x88440114, // 0095 GETMBR R17 R0 K20 + 0x7C380600, // 0096 CALL R14 3 + 0x8C380515, // 0097 GETMET R14 R2 K21 + 0x58400024, // 0098 LDCONST R16 K36 + 0x7C380400, // 0099 CALL R14 2 + 0x8C380515, // 009A GETMET R14 R2 K21 + 0x60400018, // 009B GETGBL R16 G24 + 0x58440025, // 009C LDCONST R17 K37 + 0x5C481200, // 009D MOVE R18 R9 + 0x5C4C1200, // 009E MOVE R19 R9 + 0x8C500518, // 009F GETMET R20 R2 K24 + 0x5C581A00, // 00A0 MOVE R22 R13 + 0x7C500400, // 00A1 CALL R20 2 + 0x78320003, // 00A2 JMPF R12 #00A7 + 0x8C540518, // 00A3 GETMET R21 R2 K24 + 0x885C1926, // 00A4 GETMBR R23 R12 K38 + 0x7C540400, // 00A5 CALL R21 2 + 0x70020000, // 00A6 JMP #00A8 + 0x58540002, // 00A7 LDCONST R21 K2 + 0x7C400A00, // 00A8 CALL R16 5 + 0x7C380400, // 00A9 CALL R14 2 + 0x8C380515, // 00AA GETMET R14 R2 K21 + 0x58400027, // 00AB LDCONST R16 K39 + 0x7C380400, // 00AC CALL R14 2 + 0x00241328, // 00AD ADD R9 R9 K40 + 0x7001FFBB, // 00AE JMP #006B + 0x8C280515, // 00AF GETMET R10 R2 K21 + 0x60300018, // 00B0 GETGBL R12 G24 + 0x58340021, // 00B1 LDCONST R13 K33 + 0x5C381200, // 00B2 MOVE R14 R9 + 0x7C300400, // 00B3 CALL R12 2 + 0x7C280400, // 00B4 CALL R10 2 + 0x8C280515, // 00B5 GETMET R10 R2 K21 + 0x60300018, // 00B6 GETGBL R12 G24 + 0x58340022, // 00B7 LDCONST R13 K34 + 0x5C381200, // 00B8 MOVE R14 R9 + 0x5C3C1200, // 00B9 MOVE R15 R9 + 0x7C300600, // 00BA CALL R12 3 + 0x7C280400, // 00BB CALL R10 2 + 0x8C280123, // 00BC GETMET R10 R0 K35 + 0x58300002, // 00BD LDCONST R12 K2 + 0x88340114, // 00BE GETMBR R13 R0 K20 + 0x7C280600, // 00BF CALL R10 3 + 0x8C280515, // 00C0 GETMET R10 R2 K21 + 0x58300024, // 00C1 LDCONST R12 K36 + 0x7C280400, // 00C2 CALL R10 2 + 0x8C280515, // 00C3 GETMET R10 R2 K21 + 0x60300018, // 00C4 GETGBL R12 G24 + 0x58340029, // 00C5 LDCONST R13 K41 + 0x5C381200, // 00C6 MOVE R14 R9 + 0x5C3C1200, // 00C7 MOVE R15 R9 + 0x58400002, // 00C8 LDCONST R16 K2 + 0x7C300800, // 00C9 CALL R12 4 + 0x7C280400, // 00CA CALL R10 2 + 0x8C280515, // 00CB GETMET R10 R2 K21 + 0x58300027, // 00CC LDCONST R12 K39 + 0x7C280400, // 00CD CALL R10 2 + 0x8C280515, // 00CE GETMET R10 R2 K21 + 0x5830002A, // 00CF LDCONST R12 K42 + 0x7C280400, // 00D0 CALL R10 2 + 0x8C280515, // 00D1 GETMET R10 R2 K21 + 0x5830002B, // 00D2 LDCONST R12 K43 + 0x7C280400, // 00D3 CALL R10 2 + 0x8C280515, // 00D4 GETMET R10 R2 K21 + 0x5830002C, // 00D5 LDCONST R12 K44 + 0x7C280400, // 00D6 CALL R10 2 + 0x8C280515, // 00D7 GETMET R10 R2 K21 + 0x5830002D, // 00D8 LDCONST R12 K45 + 0x7C280400, // 00D9 CALL R10 2 + 0x70020007, // 00DA JMP #00E3 + 0x8C200515, // 00DB GETMET R8 R2 K21 + 0x60280018, // 00DC GETGBL R10 G24 + 0x582C002E, // 00DD LDCONST R11 K46 + 0x8C300518, // 00DE GETMET R12 R2 K24 + 0x5C380200, // 00DF MOVE R14 R1 + 0x7C300400, // 00E0 CALL R12 2 + 0x7C280400, // 00E1 CALL R10 2 + 0x7C200400, // 00E2 CALL R8 2 + 0x80000000, // 00E3 RET 0 }) ) ); @@ -1409,7 +1397,7 @@ be_local_closure(Matter_UI_show_remote_autoconf, /* name */ ********************************************************************/ be_local_closure(Matter_UI_show_fabric_info, /* name */ be_nested_proto( - 15, /* nstack */ + 14, /* nstack */ 1, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -1417,141 +1405,139 @@ be_local_closure(Matter_UI_show_fabric_info, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[29]) { /* constants */ + ( &(const bvalue[28]) { /* constants */ /* K0 */ be_nested_str_weak(webserver), - /* K1 */ be_nested_str_weak(string), - /* K2 */ be_nested_str_weak(content_send), - /* K3 */ be_nested_str_weak(_X3Cfieldset_X3E_X3Clegend_X3E_X3Cb_X3E_X26nbsp_X3BFabrics_X26nbsp_X3B_X3C_X2Fb_X3E_X3C_X2Flegend_X3E_X3Cp_X3E_X3C_X2Fp_X3E_X3Cp_X3EAssociated_X20fabrics_X3A_X3C_X2Fp_X3E), - /* K4 */ be_nested_str_weak(device), - /* K5 */ be_nested_str_weak(sessions), - /* K6 */ be_const_int(0), - /* K7 */ be_nested_str_weak(_X3Cp_X3E_X3Cb_X3ENone_X3C_X2Fb_X3E_X3C_X2Fp_X3E), - /* K8 */ be_nested_str_weak(fabrics), - /* K9 */ be_nested_str_weak(persistables), - /* K10 */ be_nested_str_weak(_X3Chr_X3E), - /* K11 */ be_nested_str_weak(fabric_label), - /* K12 */ be_nested_str_weak(_X3CNo_X20label_X3E), - /* K13 */ be_nested_str_weak(html_escape), - /* K14 */ be_nested_str_weak(_X3Cfieldset_X3E_X3Clegend_X3E_X3Cb_X3E_X26nbsp_X3B_X23_X25i_X20_X25s_X3C_X2Fb_X3E_X20_X28_X25s_X29_X26nbsp_X3B_X3C_X2Flegend_X3E_X3Cp_X3E_X3C_X2Fp_X3E), - /* K15 */ be_nested_str_weak(get_fabric_index), - /* K16 */ be_nested_str_weak(get_admin_vendor_name), - /* K17 */ be_nested_str_weak(get_fabric_id), - /* K18 */ be_nested_str_weak(copy), - /* K19 */ be_nested_str_weak(reverse), - /* K20 */ be_nested_str_weak(get_device_id), - /* K21 */ be_nested_str_weak(Fabric_X3A_X20_X25s_X3Cbr_X3E), - /* K22 */ be_nested_str_weak(tohex), - /* K23 */ be_nested_str_weak(Device_X3A_X20_X25s_X3Cbr_X3E_X26nbsp_X3B), - /* K24 */ be_nested_str_weak(_X3Cform_X20action_X3D_X27_X2Fmatterc_X27_X20method_X3D_X27post_X27_X20onsubmit_X3D_X27return_X20confirm_X28_X22Are_X20you_X20sure_X3F_X22_X29_X3B_X27_X3E), - /* K25 */ be_nested_str_weak(_X3Cinput_X20name_X3D_X27del_fabric_X27_X20type_X3D_X27hidden_X27_X20value_X3D_X27_X25i_X27_X3E), - /* K26 */ be_nested_str_weak(_X3Cbutton_X20name_X3D_X27del_X27_X20class_X3D_X27button_X20bgrn_X27_X3EDelete_X20Fabric_X3C_X2Fbutton_X3E_X3C_X2Fform_X3E_X3C_X2Fp_X3E), - /* K27 */ be_nested_str_weak(_X3Cp_X3E_X3C_X2Fp_X3E_X3C_X2Ffieldset_X3E_X3Cp_X3E_X3C_X2Fp_X3E), - /* K28 */ be_nested_str_weak(stop_iteration), + /* K1 */ be_nested_str_weak(content_send), + /* K2 */ be_nested_str_weak(_X3Cfieldset_X3E_X3Clegend_X3E_X3Cb_X3E_X26nbsp_X3BFabrics_X26nbsp_X3B_X3C_X2Fb_X3E_X3C_X2Flegend_X3E_X3Cp_X3E_X3C_X2Fp_X3E_X3Cp_X3EAssociated_X20fabrics_X3A_X3C_X2Fp_X3E), + /* K3 */ be_nested_str_weak(device), + /* K4 */ be_nested_str_weak(sessions), + /* K5 */ be_const_int(0), + /* K6 */ be_nested_str_weak(_X3Cp_X3E_X3Cb_X3ENone_X3C_X2Fb_X3E_X3C_X2Fp_X3E), + /* K7 */ be_nested_str_weak(fabrics), + /* K8 */ be_nested_str_weak(persistables), + /* K9 */ be_nested_str_weak(_X3Chr_X3E), + /* K10 */ be_nested_str_weak(fabric_label), + /* K11 */ be_nested_str_weak(_X3CNo_X20label_X3E), + /* K12 */ be_nested_str_weak(html_escape), + /* K13 */ be_nested_str_weak(_X3Cfieldset_X3E_X3Clegend_X3E_X3Cb_X3E_X26nbsp_X3B_X23_X25i_X20_X25s_X3C_X2Fb_X3E_X20_X28_X25s_X29_X26nbsp_X3B_X3C_X2Flegend_X3E_X3Cp_X3E_X3C_X2Fp_X3E), + /* K14 */ be_nested_str_weak(get_fabric_index), + /* K15 */ be_nested_str_weak(get_admin_vendor_name), + /* K16 */ be_nested_str_weak(get_fabric_id), + /* K17 */ be_nested_str_weak(copy), + /* K18 */ be_nested_str_weak(reverse), + /* K19 */ be_nested_str_weak(get_device_id), + /* K20 */ be_nested_str_weak(Fabric_X3A_X20_X25s_X3Cbr_X3E), + /* K21 */ be_nested_str_weak(tohex), + /* K22 */ be_nested_str_weak(Device_X3A_X20_X25s_X3Cbr_X3E_X26nbsp_X3B), + /* K23 */ be_nested_str_weak(_X3Cform_X20action_X3D_X27_X2Fmatterc_X27_X20method_X3D_X27post_X27_X20onsubmit_X3D_X27return_X20confirm_X28_X22Are_X20you_X20sure_X3F_X22_X29_X3B_X27_X3E), + /* K24 */ be_nested_str_weak(_X3Cinput_X20name_X3D_X27del_fabric_X27_X20type_X3D_X27hidden_X27_X20value_X3D_X27_X25i_X27_X3E), + /* K25 */ be_nested_str_weak(_X3Cbutton_X20name_X3D_X27del_X27_X20class_X3D_X27button_X20bgrn_X27_X3EDelete_X20Fabric_X3C_X2Fbutton_X3E_X3C_X2Fform_X3E_X3C_X2Fp_X3E), + /* K26 */ be_nested_str_weak(_X3Cp_X3E_X3C_X2Fp_X3E_X3C_X2Ffieldset_X3E_X3Cp_X3E_X3C_X2Fp_X3E), + /* K27 */ be_nested_str_weak(stop_iteration), }), be_str_weak(show_fabric_info), &be_const_str_solidified, - ( &(const binstruction[101]) { /* code */ + ( &(const binstruction[100]) { /* code */ 0xA4060000, // 0000 IMPORT R1 K0 - 0xA40A0200, // 0001 IMPORT R2 K1 - 0x8C0C0302, // 0002 GETMET R3 R1 K2 - 0x58140003, // 0003 LDCONST R5 K3 - 0x7C0C0400, // 0004 CALL R3 2 - 0x600C000C, // 0005 GETGBL R3 G12 - 0x88100104, // 0006 GETMBR R4 R0 K4 - 0x88100905, // 0007 GETMBR R4 R4 K5 - 0x88100905, // 0008 GETMBR R4 R4 K5 - 0x7C0C0200, // 0009 CALL R3 1 - 0x1C0C0706, // 000A EQ R3 R3 K6 - 0x780E0003, // 000B JMPF R3 #0010 - 0x8C0C0302, // 000C GETMET R3 R1 K2 - 0x58140007, // 000D LDCONST R5 K7 - 0x7C0C0400, // 000E CALL R3 2 - 0x70020050, // 000F JMP #0061 - 0x500C0200, // 0010 LDBOOL R3 1 0 - 0x60100010, // 0011 GETGBL R4 G16 - 0x88140104, // 0012 GETMBR R5 R0 K4 - 0x88140B05, // 0013 GETMBR R5 R5 K5 - 0x88140B08, // 0014 GETMBR R5 R5 K8 - 0x8C140B09, // 0015 GETMET R5 R5 K9 - 0x7C140200, // 0016 CALL R5 1 - 0x7C100200, // 0017 CALL R4 1 - 0xA8020044, // 0018 EXBLK 0 #005E - 0x5C140800, // 0019 MOVE R5 R4 - 0x7C140000, // 001A CALL R5 0 - 0x5C180600, // 001B MOVE R6 R3 - 0x741A0002, // 001C JMPT R6 #0020 - 0x8C180302, // 001D GETMET R6 R1 K2 - 0x5820000A, // 001E LDCONST R8 K10 - 0x7C180400, // 001F CALL R6 2 - 0x500C0000, // 0020 LDBOOL R3 0 0 - 0x88180B0B, // 0021 GETMBR R6 R5 K11 - 0x5C1C0C00, // 0022 MOVE R7 R6 - 0x741E0000, // 0023 JMPT R7 #0025 - 0x5818000C, // 0024 LDCONST R6 K12 - 0x8C1C030D, // 0025 GETMET R7 R1 K13 - 0x5C240C00, // 0026 MOVE R9 R6 - 0x7C1C0400, // 0027 CALL R7 2 - 0x5C180E00, // 0028 MOVE R6 R7 - 0x8C1C0302, // 0029 GETMET R7 R1 K2 - 0x60240018, // 002A GETGBL R9 G24 - 0x5828000E, // 002B LDCONST R10 K14 - 0x8C2C0B0F, // 002C GETMET R11 R5 K15 - 0x7C2C0200, // 002D CALL R11 1 - 0x5C300C00, // 002E MOVE R12 R6 - 0x8C340B10, // 002F GETMET R13 R5 K16 - 0x7C340200, // 0030 CALL R13 1 - 0x7C240800, // 0031 CALL R9 4 - 0x7C1C0400, // 0032 CALL R7 2 - 0x8C1C0B11, // 0033 GETMET R7 R5 K17 - 0x7C1C0200, // 0034 CALL R7 1 - 0x8C1C0F12, // 0035 GETMET R7 R7 K18 - 0x7C1C0200, // 0036 CALL R7 1 - 0x8C1C0F13, // 0037 GETMET R7 R7 K19 - 0x7C1C0200, // 0038 CALL R7 1 - 0x8C200B14, // 0039 GETMET R8 R5 K20 - 0x7C200200, // 003A CALL R8 1 - 0x8C201112, // 003B GETMET R8 R8 K18 - 0x7C200200, // 003C CALL R8 1 - 0x8C201113, // 003D GETMET R8 R8 K19 - 0x7C200200, // 003E CALL R8 1 - 0x8C240302, // 003F GETMET R9 R1 K2 - 0x602C0018, // 0040 GETGBL R11 G24 - 0x58300015, // 0041 LDCONST R12 K21 - 0x8C340F16, // 0042 GETMET R13 R7 K22 - 0x7C340200, // 0043 CALL R13 1 - 0x7C2C0400, // 0044 CALL R11 2 - 0x7C240400, // 0045 CALL R9 2 - 0x8C240302, // 0046 GETMET R9 R1 K2 - 0x602C0018, // 0047 GETGBL R11 G24 - 0x58300017, // 0048 LDCONST R12 K23 - 0x8C341116, // 0049 GETMET R13 R8 K22 - 0x7C340200, // 004A CALL R13 1 - 0x7C2C0400, // 004B CALL R11 2 - 0x7C240400, // 004C CALL R9 2 - 0x8C240302, // 004D GETMET R9 R1 K2 - 0x582C0018, // 004E LDCONST R11 K24 - 0x7C240400, // 004F CALL R9 2 - 0x8C240302, // 0050 GETMET R9 R1 K2 - 0x602C0018, // 0051 GETGBL R11 G24 - 0x58300019, // 0052 LDCONST R12 K25 - 0x8C340B0F, // 0053 GETMET R13 R5 K15 - 0x7C340200, // 0054 CALL R13 1 - 0x7C2C0400, // 0055 CALL R11 2 - 0x7C240400, // 0056 CALL R9 2 - 0x8C240302, // 0057 GETMET R9 R1 K2 - 0x582C001A, // 0058 LDCONST R11 K26 - 0x7C240400, // 0059 CALL R9 2 - 0x8C240302, // 005A GETMET R9 R1 K2 - 0x582C001B, // 005B LDCONST R11 K27 - 0x7C240400, // 005C CALL R9 2 - 0x7001FFBA, // 005D JMP #0019 - 0x5810001C, // 005E LDCONST R4 K28 - 0xAC100200, // 005F CATCH R4 1 0 - 0xB0080000, // 0060 RAISE 2 R0 R0 - 0x8C0C0302, // 0061 GETMET R3 R1 K2 - 0x5814001B, // 0062 LDCONST R5 K27 - 0x7C0C0400, // 0063 CALL R3 2 - 0x80000000, // 0064 RET 0 + 0x8C080301, // 0001 GETMET R2 R1 K1 + 0x58100002, // 0002 LDCONST R4 K2 + 0x7C080400, // 0003 CALL R2 2 + 0x6008000C, // 0004 GETGBL R2 G12 + 0x880C0103, // 0005 GETMBR R3 R0 K3 + 0x880C0704, // 0006 GETMBR R3 R3 K4 + 0x880C0704, // 0007 GETMBR R3 R3 K4 + 0x7C080200, // 0008 CALL R2 1 + 0x1C080505, // 0009 EQ R2 R2 K5 + 0x780A0003, // 000A JMPF R2 #000F + 0x8C080301, // 000B GETMET R2 R1 K1 + 0x58100006, // 000C LDCONST R4 K6 + 0x7C080400, // 000D CALL R2 2 + 0x70020050, // 000E JMP #0060 + 0x50080200, // 000F LDBOOL R2 1 0 + 0x600C0010, // 0010 GETGBL R3 G16 + 0x88100103, // 0011 GETMBR R4 R0 K3 + 0x88100904, // 0012 GETMBR R4 R4 K4 + 0x88100907, // 0013 GETMBR R4 R4 K7 + 0x8C100908, // 0014 GETMET R4 R4 K8 + 0x7C100200, // 0015 CALL R4 1 + 0x7C0C0200, // 0016 CALL R3 1 + 0xA8020044, // 0017 EXBLK 0 #005D + 0x5C100600, // 0018 MOVE R4 R3 + 0x7C100000, // 0019 CALL R4 0 + 0x5C140400, // 001A MOVE R5 R2 + 0x74160002, // 001B JMPT R5 #001F + 0x8C140301, // 001C GETMET R5 R1 K1 + 0x581C0009, // 001D LDCONST R7 K9 + 0x7C140400, // 001E CALL R5 2 + 0x50080000, // 001F LDBOOL R2 0 0 + 0x8814090A, // 0020 GETMBR R5 R4 K10 + 0x5C180A00, // 0021 MOVE R6 R5 + 0x741A0000, // 0022 JMPT R6 #0024 + 0x5814000B, // 0023 LDCONST R5 K11 + 0x8C18030C, // 0024 GETMET R6 R1 K12 + 0x5C200A00, // 0025 MOVE R8 R5 + 0x7C180400, // 0026 CALL R6 2 + 0x5C140C00, // 0027 MOVE R5 R6 + 0x8C180301, // 0028 GETMET R6 R1 K1 + 0x60200018, // 0029 GETGBL R8 G24 + 0x5824000D, // 002A LDCONST R9 K13 + 0x8C28090E, // 002B GETMET R10 R4 K14 + 0x7C280200, // 002C CALL R10 1 + 0x5C2C0A00, // 002D MOVE R11 R5 + 0x8C30090F, // 002E GETMET R12 R4 K15 + 0x7C300200, // 002F CALL R12 1 + 0x7C200800, // 0030 CALL R8 4 + 0x7C180400, // 0031 CALL R6 2 + 0x8C180910, // 0032 GETMET R6 R4 K16 + 0x7C180200, // 0033 CALL R6 1 + 0x8C180D11, // 0034 GETMET R6 R6 K17 + 0x7C180200, // 0035 CALL R6 1 + 0x8C180D12, // 0036 GETMET R6 R6 K18 + 0x7C180200, // 0037 CALL R6 1 + 0x8C1C0913, // 0038 GETMET R7 R4 K19 + 0x7C1C0200, // 0039 CALL R7 1 + 0x8C1C0F11, // 003A GETMET R7 R7 K17 + 0x7C1C0200, // 003B CALL R7 1 + 0x8C1C0F12, // 003C GETMET R7 R7 K18 + 0x7C1C0200, // 003D CALL R7 1 + 0x8C200301, // 003E GETMET R8 R1 K1 + 0x60280018, // 003F GETGBL R10 G24 + 0x582C0014, // 0040 LDCONST R11 K20 + 0x8C300D15, // 0041 GETMET R12 R6 K21 + 0x7C300200, // 0042 CALL R12 1 + 0x7C280400, // 0043 CALL R10 2 + 0x7C200400, // 0044 CALL R8 2 + 0x8C200301, // 0045 GETMET R8 R1 K1 + 0x60280018, // 0046 GETGBL R10 G24 + 0x582C0016, // 0047 LDCONST R11 K22 + 0x8C300F15, // 0048 GETMET R12 R7 K21 + 0x7C300200, // 0049 CALL R12 1 + 0x7C280400, // 004A CALL R10 2 + 0x7C200400, // 004B CALL R8 2 + 0x8C200301, // 004C GETMET R8 R1 K1 + 0x58280017, // 004D LDCONST R10 K23 + 0x7C200400, // 004E CALL R8 2 + 0x8C200301, // 004F GETMET R8 R1 K1 + 0x60280018, // 0050 GETGBL R10 G24 + 0x582C0018, // 0051 LDCONST R11 K24 + 0x8C30090E, // 0052 GETMET R12 R4 K14 + 0x7C300200, // 0053 CALL R12 1 + 0x7C280400, // 0054 CALL R10 2 + 0x7C200400, // 0055 CALL R8 2 + 0x8C200301, // 0056 GETMET R8 R1 K1 + 0x58280019, // 0057 LDCONST R10 K25 + 0x7C200400, // 0058 CALL R8 2 + 0x8C200301, // 0059 GETMET R8 R1 K1 + 0x5828001A, // 005A LDCONST R10 K26 + 0x7C200400, // 005B CALL R8 2 + 0x7001FFBA, // 005C JMP #0018 + 0x580C001B, // 005D LDCONST R3 K27 + 0xAC0C0200, // 005E CATCH R3 1 0 + 0xB0080000, // 005F RAISE 2 R0 R0 + 0x8C080301, // 0060 GETMET R2 R1 K1 + 0x5810001A, // 0061 LDCONST R4 K26 + 0x7C080400, // 0062 CALL R2 2 + 0x80000000, // 0063 RET 0 }) ) ); @@ -1611,7 +1597,7 @@ be_local_closure(Matter_UI_web_get_arg, /* name */ ********************************************************************/ be_local_closure(Matter_UI_plugin_option, /* name */ be_nested_proto( - 17, /* nstack */ + 16, /* nstack */ 3, /* argc */ 3, /* varg */ 0, /* has upvals */ @@ -1619,7 +1605,7 @@ be_local_closure(Matter_UI_plugin_option, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[17]) { /* constants */ + ( &(const bvalue[16]) { /* constants */ /* K0 */ be_nested_str_weak(webserver), /* K1 */ be_nested_str_weak(string), /* K2 */ be_nested_str_weak(split), @@ -1633,10 +1619,9 @@ be_local_closure(Matter_UI_plugin_option, /* name */ /* K10 */ be_nested_str_weak(_X3Coption_X20value_X3D_X27_X27_X20disabled_X3E_X2D_X2D_X2D_X20Tasmota_X20Remote_X20_X2D_X2D_X2D_X3C_X2Foption_X3E), /* K11 */ be_nested_str_weak(device), /* K12 */ be_nested_str_weak(get_plugin_class_displayname), - /* K13 */ be_nested_str_weak(format), - /* K14 */ be_nested_str_weak(_X3Coption_X20value_X3D_X27_X25s_X27_X25s_X3E_X25s_X3C_X2Foption_X3E), - /* K15 */ be_nested_str_weak(_X20selected), - /* K16 */ be_const_int(1), + /* K13 */ be_nested_str_weak(_X3Coption_X20value_X3D_X27_X25s_X27_X25s_X3E_X25s_X3C_X2Foption_X3E), + /* K14 */ be_nested_str_weak(_X20selected), + /* K15 */ be_const_int(1), }), be_str_weak(plugin_option), &be_const_str_solidified, @@ -1684,18 +1669,18 @@ be_local_closure(Matter_UI_plugin_option, /* name */ 0x5C280E00, // 0028 MOVE R10 R7 0x7C200400, // 0029 CALL R8 2 0x8C240707, // 002A GETMET R9 R3 K7 - 0x8C2C090D, // 002B GETMET R11 R4 K13 - 0x5834000E, // 002C LDCONST R13 K14 - 0x5C380E00, // 002D MOVE R14 R7 - 0x1C3C0E01, // 002E EQ R15 R7 R1 - 0x783E0001, // 002F JMPF R15 #0032 - 0x583C000F, // 0030 LDCONST R15 K15 + 0x602C0018, // 002B GETGBL R11 G24 + 0x5830000D, // 002C LDCONST R12 K13 + 0x5C340E00, // 002D MOVE R13 R7 + 0x1C380E01, // 002E EQ R14 R7 R1 + 0x783A0001, // 002F JMPF R14 #0032 + 0x5838000E, // 0030 LDCONST R14 K14 0x70020000, // 0031 JMP #0033 - 0x583C0006, // 0032 LDCONST R15 K6 - 0x5C401000, // 0033 MOVE R16 R8 - 0x7C2C0A00, // 0034 CALL R11 5 + 0x58380006, // 0032 LDCONST R14 K6 + 0x5C3C1000, // 0033 MOVE R15 R8 + 0x7C2C0800, // 0034 CALL R11 4 0x7C240400, // 0035 CALL R9 2 - 0x00180D10, // 0036 ADD R6 R6 K16 + 0x00180D0F, // 0036 ADD R6 R6 K15 0x7001FFDB, // 0037 JMP #0014 0x80000000, // 0038 RET 0 }) @@ -1784,7 +1769,7 @@ be_local_closure(Matter_UI_init, /* name */ ********************************************************************/ be_local_closure(Matter_UI_show_bridge_status, /* name */ be_nested_proto( - 16, /* nstack */ + 14, /* nstack */ 1, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -1792,144 +1777,141 @@ be_local_closure(Matter_UI_show_bridge_status, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[26]) { /* constants */ + ( &(const bvalue[24]) { /* constants */ /* K0 */ be_nested_str_weak(webserver), - /* K1 */ be_nested_str_weak(string), - /* K2 */ be_const_int(0), - /* K3 */ be_nested_str_weak(device), - /* K4 */ be_nested_str_weak(plugins), - /* K5 */ be_nested_str_weak(matter), - /* K6 */ be_nested_str_weak(Plugin_Bridge_HTTP), - /* K7 */ be_nested_str_weak(http_remote), - /* K8 */ be_nested_str_weak(addr), - /* K9 */ be_nested_str_weak(contains), - /* K10 */ be_nested_str_weak(push), - /* K11 */ be_const_int(1), - /* K12 */ be_nested_str_weak(content_send), - /* K13 */ be_nested_str_weak(_X3Chr_X3E), - /* K14 */ be_nested_str_weak(_X3Ctable_X20style_X3D_X27width_X3A100_X25_X27_X3E), - /* K15 */ be_nested_str_weak(_STYLESHEET), - /* K16 */ be_nested_str_weak(k2l), - /* K17 */ be_nested_str_weak(html_escape), - /* K18 */ be_nested_str_weak(format), - /* K19 */ be_nested_str_weak(_X3Ctr_X20class_X3D_X27ztdm_X20htrm_X27_X3E_X3Ctd_X3E_X26_X23x1F517_X3B_X20_X3Ca_X20target_X3D_X27_blank_X27_X20title_X3D_X27http_X3A_X2F_X2F_X25s_X2F_X27_X20href_X3D_X22http_X3A_X2F_X2F_X25s_X2F_X3F_X22_X27_X3E_X25s_X3C_X2Fa_X3E_X3C_X2Ftd_X3E), - /* K20 */ be_nested_str_weak(web_last_seen), - /* K21 */ be_nested_str_weak(_X3Ctr_X20class_X3D_X27htrm_X27_X3E_X3Ctd_X20colspan_X3D_X272_X27_X3E), - /* K22 */ be_nested_str_weak(web_values), - /* K23 */ be_nested_str_weak(_X3C_X2Ftd_X3E_X3C_X2Ftr_X3E), - /* K24 */ be_nested_str_weak(stop_iteration), - /* K25 */ be_nested_str_weak(_X3C_X2Ftable_X3E_X3Chr_X3E), + /* K1 */ be_const_int(0), + /* K2 */ be_nested_str_weak(device), + /* K3 */ be_nested_str_weak(plugins), + /* K4 */ be_nested_str_weak(matter), + /* K5 */ be_nested_str_weak(Plugin_Bridge_HTTP), + /* K6 */ be_nested_str_weak(http_remote), + /* K7 */ be_nested_str_weak(addr), + /* K8 */ be_nested_str_weak(contains), + /* K9 */ be_nested_str_weak(push), + /* K10 */ be_const_int(1), + /* K11 */ be_nested_str_weak(content_send), + /* K12 */ be_nested_str_weak(_X3Chr_X3E), + /* K13 */ be_nested_str_weak(_X3Ctable_X20style_X3D_X27width_X3A100_X25_X27_X3E), + /* K14 */ be_nested_str_weak(_STYLESHEET), + /* K15 */ be_nested_str_weak(k2l), + /* K16 */ be_nested_str_weak(html_escape), + /* K17 */ be_nested_str_weak(_X3Ctr_X20class_X3D_X27ztdm_X20htrm_X27_X3E_X3Ctd_X3E_X26_X23x1F517_X3B_X20_X3Ca_X20target_X3D_X27_blank_X27_X20title_X3D_X27http_X3A_X2F_X2F_X25s_X2F_X27_X20href_X3D_X22http_X3A_X2F_X2F_X25s_X2F_X3F_X22_X27_X3E_X25s_X3C_X2Fa_X3E_X3C_X2Ftd_X3E), + /* K18 */ be_nested_str_weak(web_last_seen), + /* K19 */ be_nested_str_weak(_X3Ctr_X20class_X3D_X27htrm_X27_X3E_X3Ctd_X20colspan_X3D_X272_X27_X3E), + /* K20 */ be_nested_str_weak(web_values), + /* K21 */ be_nested_str_weak(_X3C_X2Ftd_X3E_X3C_X2Ftr_X3E), + /* K22 */ be_nested_str_weak(stop_iteration), + /* K23 */ be_nested_str_weak(_X3C_X2Ftable_X3E_X3Chr_X3E), }), be_str_weak(show_bridge_status), &be_const_str_solidified, - ( &(const binstruction[107]) { /* code */ + ( &(const binstruction[106]) { /* code */ 0xA4060000, // 0000 IMPORT R1 K0 - 0xA40A0200, // 0001 IMPORT R2 K1 - 0x4C0C0000, // 0002 LDNIL R3 - 0x58100002, // 0003 LDCONST R4 K2 - 0x6014000C, // 0004 GETGBL R5 G12 - 0x88180103, // 0005 GETMBR R6 R0 K3 - 0x88180D04, // 0006 GETMBR R6 R6 K4 - 0x7C140200, // 0007 CALL R5 1 - 0x14140805, // 0008 LT R5 R4 R5 - 0x7816001D, // 0009 JMPF R5 #0028 - 0x88140103, // 000A GETMBR R5 R0 K3 - 0x88140B04, // 000B GETMBR R5 R5 K4 - 0x94140A04, // 000C GETIDX R5 R5 R4 - 0x6018000F, // 000D GETGBL R6 G15 - 0x5C1C0A00, // 000E MOVE R7 R5 - 0xB8220A00, // 000F GETNGBL R8 K5 - 0x88201106, // 0010 GETMBR R8 R8 K6 - 0x7C180400, // 0011 CALL R6 2 - 0x781A0012, // 0012 JMPF R6 #0026 - 0x4C180000, // 0013 LDNIL R6 - 0x1C180606, // 0014 EQ R6 R3 R6 - 0x781A0002, // 0015 JMPF R6 #0019 - 0x60180013, // 0016 GETGBL R6 G19 - 0x7C180000, // 0017 CALL R6 0 - 0x5C0C0C00, // 0018 MOVE R3 R6 - 0x88180B07, // 0019 GETMBR R6 R5 K7 - 0x88180D08, // 001A GETMBR R6 R6 K8 - 0x8C1C0709, // 001B GETMET R7 R3 K9 - 0x5C240C00, // 001C MOVE R9 R6 - 0x7C1C0400, // 001D CALL R7 2 - 0x741E0002, // 001E JMPT R7 #0022 - 0x601C0012, // 001F GETGBL R7 G18 - 0x7C1C0000, // 0020 CALL R7 0 - 0x980C0C07, // 0021 SETIDX R3 R6 R7 - 0x941C0606, // 0022 GETIDX R7 R3 R6 - 0x8C1C0F0A, // 0023 GETMET R7 R7 K10 - 0x5C240A00, // 0024 MOVE R9 R5 - 0x7C1C0400, // 0025 CALL R7 2 - 0x0010090B, // 0026 ADD R4 R4 K11 - 0x7001FFDB, // 0027 JMP #0004 - 0x4C140000, // 0028 LDNIL R5 - 0x1C140605, // 0029 EQ R5 R3 R5 - 0x78160000, // 002A JMPF R5 #002C - 0x80000A00, // 002B RET 0 - 0x8C14030C, // 002C GETMET R5 R1 K12 - 0x581C000D, // 002D LDCONST R7 K13 - 0x7C140400, // 002E CALL R5 2 - 0x8C14030C, // 002F GETMET R5 R1 K12 - 0x581C000E, // 0030 LDCONST R7 K14 - 0x7C140400, // 0031 CALL R5 2 - 0x8C14030C, // 0032 GETMET R5 R1 K12 - 0xB81E0A00, // 0033 GETNGBL R7 K5 - 0x881C0F0F, // 0034 GETMBR R7 R7 K15 - 0x7C140400, // 0035 CALL R5 2 - 0x60140010, // 0036 GETGBL R5 G16 - 0x88180103, // 0037 GETMBR R6 R0 K3 - 0x8C180D10, // 0038 GETMET R6 R6 K16 - 0x5C200600, // 0039 MOVE R8 R3 - 0x7C180400, // 003A CALL R6 2 - 0x7C140200, // 003B CALL R5 1 - 0xA8020026, // 003C EXBLK 0 #0064 - 0x5C180A00, // 003D MOVE R6 R5 - 0x7C180000, // 003E CALL R6 0 - 0x8C1C0311, // 003F GETMET R7 R1 K17 - 0x5C240C00, // 0040 MOVE R9 R6 - 0x7C1C0400, // 0041 CALL R7 2 - 0x8C20030C, // 0042 GETMET R8 R1 K12 - 0x8C280512, // 0043 GETMET R10 R2 K18 - 0x58300013, // 0044 LDCONST R12 K19 - 0x5C340E00, // 0045 MOVE R13 R7 - 0x5C380E00, // 0046 MOVE R14 R7 - 0x5C3C0E00, // 0047 MOVE R15 R7 - 0x7C280A00, // 0048 CALL R10 5 - 0x7C200400, // 0049 CALL R8 2 - 0x94200606, // 004A GETIDX R8 R3 R6 - 0x94201102, // 004B GETIDX R8 R8 K2 - 0x88201107, // 004C GETMBR R8 R8 K7 - 0x8C24030C, // 004D GETMET R9 R1 K12 - 0x8C2C1114, // 004E GETMET R11 R8 K20 - 0x7C2C0200, // 004F CALL R11 1 - 0x7C240400, // 0050 CALL R9 2 - 0x60240010, // 0051 GETGBL R9 G16 - 0x94280606, // 0052 GETIDX R10 R3 R6 - 0x7C240200, // 0053 CALL R9 1 - 0xA802000A, // 0054 EXBLK 0 #0060 - 0x5C281200, // 0055 MOVE R10 R9 - 0x7C280000, // 0056 CALL R10 0 - 0x8C2C030C, // 0057 GETMET R11 R1 K12 - 0x58340015, // 0058 LDCONST R13 K21 - 0x7C2C0400, // 0059 CALL R11 2 - 0x8C2C1516, // 005A GETMET R11 R10 K22 - 0x7C2C0200, // 005B CALL R11 1 - 0x8C2C030C, // 005C GETMET R11 R1 K12 - 0x58340017, // 005D LDCONST R13 K23 - 0x7C2C0400, // 005E CALL R11 2 - 0x7001FFF4, // 005F JMP #0055 - 0x58240018, // 0060 LDCONST R9 K24 - 0xAC240200, // 0061 CATCH R9 1 0 - 0xB0080000, // 0062 RAISE 2 R0 R0 - 0x7001FFD8, // 0063 JMP #003D - 0x58140018, // 0064 LDCONST R5 K24 - 0xAC140200, // 0065 CATCH R5 1 0 - 0xB0080000, // 0066 RAISE 2 R0 R0 - 0x8C14030C, // 0067 GETMET R5 R1 K12 - 0x581C0019, // 0068 LDCONST R7 K25 - 0x7C140400, // 0069 CALL R5 2 - 0x80000000, // 006A RET 0 + 0x4C080000, // 0001 LDNIL R2 + 0x580C0001, // 0002 LDCONST R3 K1 + 0x6010000C, // 0003 GETGBL R4 G12 + 0x88140102, // 0004 GETMBR R5 R0 K2 + 0x88140B03, // 0005 GETMBR R5 R5 K3 + 0x7C100200, // 0006 CALL R4 1 + 0x14100604, // 0007 LT R4 R3 R4 + 0x7812001D, // 0008 JMPF R4 #0027 + 0x88100102, // 0009 GETMBR R4 R0 K2 + 0x88100903, // 000A GETMBR R4 R4 K3 + 0x94100803, // 000B GETIDX R4 R4 R3 + 0x6014000F, // 000C GETGBL R5 G15 + 0x5C180800, // 000D MOVE R6 R4 + 0xB81E0800, // 000E GETNGBL R7 K4 + 0x881C0F05, // 000F GETMBR R7 R7 K5 + 0x7C140400, // 0010 CALL R5 2 + 0x78160012, // 0011 JMPF R5 #0025 + 0x4C140000, // 0012 LDNIL R5 + 0x1C140405, // 0013 EQ R5 R2 R5 + 0x78160002, // 0014 JMPF R5 #0018 + 0x60140013, // 0015 GETGBL R5 G19 + 0x7C140000, // 0016 CALL R5 0 + 0x5C080A00, // 0017 MOVE R2 R5 + 0x88140906, // 0018 GETMBR R5 R4 K6 + 0x88140B07, // 0019 GETMBR R5 R5 K7 + 0x8C180508, // 001A GETMET R6 R2 K8 + 0x5C200A00, // 001B MOVE R8 R5 + 0x7C180400, // 001C CALL R6 2 + 0x741A0002, // 001D JMPT R6 #0021 + 0x60180012, // 001E GETGBL R6 G18 + 0x7C180000, // 001F CALL R6 0 + 0x98080A06, // 0020 SETIDX R2 R5 R6 + 0x94180405, // 0021 GETIDX R6 R2 R5 + 0x8C180D09, // 0022 GETMET R6 R6 K9 + 0x5C200800, // 0023 MOVE R8 R4 + 0x7C180400, // 0024 CALL R6 2 + 0x000C070A, // 0025 ADD R3 R3 K10 + 0x7001FFDB, // 0026 JMP #0003 + 0x4C100000, // 0027 LDNIL R4 + 0x1C100404, // 0028 EQ R4 R2 R4 + 0x78120000, // 0029 JMPF R4 #002B + 0x80000800, // 002A RET 0 + 0x8C10030B, // 002B GETMET R4 R1 K11 + 0x5818000C, // 002C LDCONST R6 K12 + 0x7C100400, // 002D CALL R4 2 + 0x8C10030B, // 002E GETMET R4 R1 K11 + 0x5818000D, // 002F LDCONST R6 K13 + 0x7C100400, // 0030 CALL R4 2 + 0x8C10030B, // 0031 GETMET R4 R1 K11 + 0xB81A0800, // 0032 GETNGBL R6 K4 + 0x88180D0E, // 0033 GETMBR R6 R6 K14 + 0x7C100400, // 0034 CALL R4 2 + 0x60100010, // 0035 GETGBL R4 G16 + 0x88140102, // 0036 GETMBR R5 R0 K2 + 0x8C140B0F, // 0037 GETMET R5 R5 K15 + 0x5C1C0400, // 0038 MOVE R7 R2 + 0x7C140400, // 0039 CALL R5 2 + 0x7C100200, // 003A CALL R4 1 + 0xA8020026, // 003B EXBLK 0 #0063 + 0x5C140800, // 003C MOVE R5 R4 + 0x7C140000, // 003D CALL R5 0 + 0x8C180310, // 003E GETMET R6 R1 K16 + 0x5C200A00, // 003F MOVE R8 R5 + 0x7C180400, // 0040 CALL R6 2 + 0x8C1C030B, // 0041 GETMET R7 R1 K11 + 0x60240018, // 0042 GETGBL R9 G24 + 0x58280011, // 0043 LDCONST R10 K17 + 0x5C2C0C00, // 0044 MOVE R11 R6 + 0x5C300C00, // 0045 MOVE R12 R6 + 0x5C340C00, // 0046 MOVE R13 R6 + 0x7C240800, // 0047 CALL R9 4 + 0x7C1C0400, // 0048 CALL R7 2 + 0x941C0405, // 0049 GETIDX R7 R2 R5 + 0x941C0F01, // 004A GETIDX R7 R7 K1 + 0x881C0F06, // 004B GETMBR R7 R7 K6 + 0x8C20030B, // 004C GETMET R8 R1 K11 + 0x8C280F12, // 004D GETMET R10 R7 K18 + 0x7C280200, // 004E CALL R10 1 + 0x7C200400, // 004F CALL R8 2 + 0x60200010, // 0050 GETGBL R8 G16 + 0x94240405, // 0051 GETIDX R9 R2 R5 + 0x7C200200, // 0052 CALL R8 1 + 0xA802000A, // 0053 EXBLK 0 #005F + 0x5C241000, // 0054 MOVE R9 R8 + 0x7C240000, // 0055 CALL R9 0 + 0x8C28030B, // 0056 GETMET R10 R1 K11 + 0x58300013, // 0057 LDCONST R12 K19 + 0x7C280400, // 0058 CALL R10 2 + 0x8C281314, // 0059 GETMET R10 R9 K20 + 0x7C280200, // 005A CALL R10 1 + 0x8C28030B, // 005B GETMET R10 R1 K11 + 0x58300015, // 005C LDCONST R12 K21 + 0x7C280400, // 005D CALL R10 2 + 0x7001FFF4, // 005E JMP #0054 + 0x58200016, // 005F LDCONST R8 K22 + 0xAC200200, // 0060 CATCH R8 1 0 + 0xB0080000, // 0061 RAISE 2 R0 R0 + 0x7001FFD8, // 0062 JMP #003C + 0x58100016, // 0063 LDCONST R4 K22 + 0xAC100200, // 0064 CATCH R4 1 0 + 0xB0080000, // 0065 RAISE 2 R0 R0 + 0x8C10030B, // 0066 GETMET R4 R1 K11 + 0x58180017, // 0067 LDCONST R6 K23 + 0x7C100400, // 0068 CALL R4 2 + 0x80000000, // 0069 RET 0 }) ) ); @@ -2167,7 +2149,7 @@ be_local_closure(Matter_UI_show_passcode_form, /* name */ ********************************************************************/ be_local_closure(Matter_UI_page_part_ctl, /* name */ be_nested_proto( - 25, /* nstack */ + 24, /* nstack */ 1, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -2175,7 +2157,7 @@ be_local_closure(Matter_UI_page_part_ctl, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[100]) { /* constants */ + ( &(const bvalue[99]) { /* constants */ /* K0 */ be_nested_str_weak(webserver), /* K1 */ be_nested_str_weak(check_privileged_access), /* K2 */ be_nested_str_weak(string), @@ -2186,96 +2168,95 @@ be_local_closure(Matter_UI_page_part_ctl, /* name */ /* K7 */ be_const_int(1), /* K8 */ be_nested_str_weak(tasmota), /* K9 */ be_nested_str_weak(log), - /* K10 */ be_nested_str_weak(format), - /* K11 */ be_nested_str_weak(MTR_X3A_X20Arg_X25i_X20_X27_X25s_X27_X20_X3D_X20_X27_X25s_X27), - /* K12 */ be_nested_str_weak(arg_name), - /* K13 */ be_nested_str_weak(arg), - /* K14 */ be_nested_str_weak(stop_iteration), - /* K15 */ be_nested_str_weak(has_arg), - /* K16 */ be_nested_str_weak(passcode), - /* K17 */ be_nested_str_weak(discriminator), - /* K18 */ be_nested_str_weak(MTR_X3A_X20_X2Fmatterc_X20received_X20_X27_X25s_X27_X20command), - /* K19 */ be_const_int(3), - /* K20 */ be_nested_str_weak(device), - /* K21 */ be_nested_str_weak(root_passcode), - /* K22 */ be_nested_str_weak(root_discriminator), - /* K23 */ be_nested_str_weak(ipv4only), - /* K24 */ be_nested_str_weak(ipv4), - /* K25 */ be_nested_str_weak(on), - /* K26 */ be_nested_str_weak(save_param), - /* K27 */ be_nested_str_weak(redirect), - /* K28 */ be_nested_str_weak(_X2F_X3Frst_X3D), - /* K29 */ be_nested_str_weak(save), - /* K30 */ be_nested_str_weak(menable), - /* K31 */ be_nested_str_weak(comm), - /* K32 */ be_nested_str_weak(matter_enabled), - /* K33 */ be_nested_str_weak(enable), - /* K34 */ be_nested_str_weak(cmd), - /* K35 */ be_nested_str_weak(SetOption), - /* K36 */ be_nested_str_weak(matter), - /* K37 */ be_nested_str_weak(MATTER_OPTION), - /* K38 */ be_nested_str_weak(_X201), - /* K39 */ be_nested_str_weak(disable), - /* K40 */ be_nested_str_weak(_X200), - /* K41 */ be_nested_str_weak(commissioning_open), - /* K42 */ be_nested_str_weak(start_root_basic_commissioning), - /* K43 */ be_nested_str_weak(stop_basic_commissioning), - /* K44 */ be_nested_str_weak(_X2F), - /* K45 */ be_nested_str_weak(del_fabric), - /* K46 */ be_nested_str_weak(sessions), - /* K47 */ be_nested_str_weak(fabrics), - /* K48 */ be_nested_str_weak(get_fabric_index), - /* K49 */ be_nested_str_weak(remove_fabric), - /* K50 */ be_nested_str_weak(_X2Fmatterc_X3F), - /* K51 */ be_nested_str_weak(auto), - /* K52 */ be_nested_str_weak(plugins_persist), - /* K53 */ be_nested_str_weak(config), - /* K54 */ be_nested_str_weak(find), - /* K55 */ be_const_int(2147483647), - /* K56 */ be_nested_str_weak(plugins_config), - /* K57 */ be_nested_str_weak(plugins_classes), - /* K58 */ be_nested_str_weak(type), - /* K59 */ be_nested_str_weak(), - /* K60 */ be_nested_str_weak(MTR_X3A_X20ep_X3D_X25i_X20arg_X3D_X25s), - /* K61 */ be_nested_str_weak(ui_conf_to_string), - /* K62 */ be_nested_str_weak(MTR_X3A_X20ep_X3D_X25i_X20prev_arg_X3D_X27_X25s_X27_X20arg_X3D_X27_X25s_X27_X20_X25s), - /* K63 */ be_nested_str_weak(changed), - /* K64 */ be_nested_str_weak(ui_string_to_conf), - /* K65 */ be_nested_str_weak(find_plugin_by_endpoint), - /* K66 */ be_nested_str_weak(MTR_X3A_X20apply_X20conf_X20_X27_X25s_X27_X20_X28_X25i_X29_X20to_X20_X25s), - /* K67 */ be_nested_str_weak(parse_configuration), - /* K68 */ be_nested_str_weak(MTR_X3A_X20ep_X3D_X25i_X20not_X20found), - /* K69 */ be_nested_str_weak(nam), - /* K70 */ be_nested_str_weak(name), - /* K71 */ be_nested_str_weak(set_name), - /* K72 */ be_nested_str_weak(remove), - /* K73 */ be_nested_str_weak(MTR_X3A_X20apply_X20name_X20_X27_X25s_X27_X20_X28_X25i_X29_X20to_X20_X25s), - /* K74 */ be_nested_str_weak(MTR_X3A_X20config_X20_X3D_X20_X25s), - /* K75 */ be_nested_str_weak(MTR_X3A_X20config_X20error_X20_X3D_X20_X25s), - /* K76 */ be_nested_str_weak(addep), - /* K77 */ be_nested_str_weak(pi), - /* K78 */ be_nested_str_weak(MTR_X3A_X20add_X20endpoint_X20typ_X3D_X27_X25s_X27_X20arg_X3D_X27_X25s_X27), - /* K79 */ be_nested_str_weak(bridge_add_endpoint), - /* K80 */ be_nested_str_weak(addrem), - /* K81 */ be_nested_str_weak(url), - /* K82 */ be_nested_str_weak(value_error), - /* K83 */ be_nested_str_weak(url_X20shouldn_X27t_X20be_X20null), - /* K84 */ be_nested_str_weak(equal_map), - /* K85 */ be_nested_str_weak(MTR_X3A_X20remote_X20add_X20url_X3D_X27_X25s_X27_X20type_X3D_X27_X25s_X27_X20arg_X3D_X27_X25s_X27), - /* K86 */ be_nested_str_weak(del), - /* K87 */ be_nested_str_weak(bridge_remove_endpoint), - /* K88 */ be_nested_str_weak(content_start), - /* K89 */ be_nested_str_weak(Parameter_X20error), - /* K90 */ be_nested_str_weak(content_send_style), - /* K91 */ be_nested_str_weak(content_send), - /* K92 */ be_nested_str_weak(_X3Cp_X20style_X3D_X27width_X3A340px_X3B_X27_X3E_X3Cb_X3EError_X3A_X3C_X2Fb_X3E_X25s_X3C_X2Fp_X3E), - /* K93 */ be_nested_str_weak(html_escape), - /* K94 */ be_nested_str_weak(content_button), - /* K95 */ be_nested_str_weak(BUTTON_CONFIGURATION), - /* K96 */ be_nested_str_weak(content_stop), - /* K97 */ be_nested_str_weak(BRY_X3A_X20Exception_X3E_X20_X27_X25s_X27_X20_X2D_X20_X25s), - /* K98 */ be_const_int(2), - /* K99 */ be_nested_str_weak(_X3Cp_X20style_X3D_X27width_X3A340px_X3B_X27_X3E_X3Cb_X3EException_X3A_X3C_X2Fb_X3E_X3Cbr_X3E_X27_X25s_X27_X3Cbr_X3E_X25s_X3C_X2Fp_X3E), + /* K10 */ be_nested_str_weak(MTR_X3A_X20Arg_X25i_X20_X27_X25s_X27_X20_X3D_X20_X27_X25s_X27), + /* K11 */ be_nested_str_weak(arg_name), + /* K12 */ be_nested_str_weak(arg), + /* K13 */ be_nested_str_weak(stop_iteration), + /* K14 */ be_nested_str_weak(has_arg), + /* K15 */ be_nested_str_weak(passcode), + /* K16 */ be_nested_str_weak(discriminator), + /* K17 */ be_nested_str_weak(MTR_X3A_X20_X2Fmatterc_X20received_X20_X27_X25s_X27_X20command), + /* K18 */ be_const_int(3), + /* K19 */ be_nested_str_weak(device), + /* K20 */ be_nested_str_weak(root_passcode), + /* K21 */ be_nested_str_weak(root_discriminator), + /* K22 */ be_nested_str_weak(ipv4only), + /* K23 */ be_nested_str_weak(ipv4), + /* K24 */ be_nested_str_weak(on), + /* K25 */ be_nested_str_weak(save_param), + /* K26 */ be_nested_str_weak(redirect), + /* K27 */ be_nested_str_weak(_X2F_X3Frst_X3D), + /* K28 */ be_nested_str_weak(save), + /* K29 */ be_nested_str_weak(menable), + /* K30 */ be_nested_str_weak(comm), + /* K31 */ be_nested_str_weak(matter_enabled), + /* K32 */ be_nested_str_weak(enable), + /* K33 */ be_nested_str_weak(cmd), + /* K34 */ be_nested_str_weak(SetOption), + /* K35 */ be_nested_str_weak(matter), + /* K36 */ be_nested_str_weak(MATTER_OPTION), + /* K37 */ be_nested_str_weak(_X201), + /* K38 */ be_nested_str_weak(disable), + /* K39 */ be_nested_str_weak(_X200), + /* K40 */ be_nested_str_weak(commissioning_open), + /* K41 */ be_nested_str_weak(start_root_basic_commissioning), + /* K42 */ be_nested_str_weak(stop_basic_commissioning), + /* K43 */ be_nested_str_weak(_X2F), + /* K44 */ be_nested_str_weak(del_fabric), + /* K45 */ be_nested_str_weak(sessions), + /* K46 */ be_nested_str_weak(fabrics), + /* K47 */ be_nested_str_weak(get_fabric_index), + /* K48 */ be_nested_str_weak(remove_fabric), + /* K49 */ be_nested_str_weak(_X2Fmatterc_X3F), + /* K50 */ be_nested_str_weak(auto), + /* K51 */ be_nested_str_weak(plugins_persist), + /* K52 */ be_nested_str_weak(config), + /* K53 */ be_nested_str_weak(find), + /* K54 */ be_const_int(2147483647), + /* K55 */ be_nested_str_weak(plugins_config), + /* K56 */ be_nested_str_weak(plugins_classes), + /* K57 */ be_nested_str_weak(type), + /* K58 */ be_nested_str_weak(), + /* K59 */ be_nested_str_weak(MTR_X3A_X20ep_X3D_X25i_X20arg_X3D_X25s), + /* K60 */ be_nested_str_weak(ui_conf_to_string), + /* K61 */ be_nested_str_weak(MTR_X3A_X20ep_X3D_X25i_X20prev_arg_X3D_X27_X25s_X27_X20arg_X3D_X27_X25s_X27_X20_X25s), + /* K62 */ be_nested_str_weak(changed), + /* K63 */ be_nested_str_weak(ui_string_to_conf), + /* K64 */ be_nested_str_weak(find_plugin_by_endpoint), + /* K65 */ be_nested_str_weak(MTR_X3A_X20apply_X20conf_X20_X27_X25s_X27_X20_X28_X25i_X29_X20to_X20_X25s), + /* K66 */ be_nested_str_weak(parse_configuration), + /* K67 */ be_nested_str_weak(MTR_X3A_X20ep_X3D_X25i_X20not_X20found), + /* K68 */ be_nested_str_weak(nam), + /* K69 */ be_nested_str_weak(name), + /* K70 */ be_nested_str_weak(set_name), + /* K71 */ be_nested_str_weak(remove), + /* K72 */ be_nested_str_weak(MTR_X3A_X20apply_X20name_X20_X27_X25s_X27_X20_X28_X25i_X29_X20to_X20_X25s), + /* K73 */ be_nested_str_weak(MTR_X3A_X20config_X20_X3D_X20_X25s), + /* K74 */ be_nested_str_weak(MTR_X3A_X20config_X20error_X20_X3D_X20_X25s), + /* K75 */ be_nested_str_weak(addep), + /* K76 */ be_nested_str_weak(pi), + /* K77 */ be_nested_str_weak(MTR_X3A_X20add_X20endpoint_X20typ_X3D_X27_X25s_X27_X20arg_X3D_X27_X25s_X27), + /* K78 */ be_nested_str_weak(bridge_add_endpoint), + /* K79 */ be_nested_str_weak(addrem), + /* K80 */ be_nested_str_weak(url), + /* K81 */ be_nested_str_weak(value_error), + /* K82 */ be_nested_str_weak(url_X20shouldn_X27t_X20be_X20null), + /* K83 */ be_nested_str_weak(equal_map), + /* K84 */ be_nested_str_weak(MTR_X3A_X20remote_X20add_X20url_X3D_X27_X25s_X27_X20type_X3D_X27_X25s_X27_X20arg_X3D_X27_X25s_X27), + /* K85 */ be_nested_str_weak(del), + /* K86 */ be_nested_str_weak(bridge_remove_endpoint), + /* K87 */ be_nested_str_weak(content_start), + /* K88 */ be_nested_str_weak(Parameter_X20error), + /* K89 */ be_nested_str_weak(content_send_style), + /* K90 */ be_nested_str_weak(content_send), + /* K91 */ be_nested_str_weak(_X3Cp_X20style_X3D_X27width_X3A340px_X3B_X27_X3E_X3Cb_X3EError_X3A_X3C_X2Fb_X3E_X25s_X3C_X2Fp_X3E), + /* K92 */ be_nested_str_weak(html_escape), + /* K93 */ be_nested_str_weak(content_button), + /* K94 */ be_nested_str_weak(BUTTON_CONFIGURATION), + /* K95 */ be_nested_str_weak(content_stop), + /* K96 */ be_nested_str_weak(BRY_X3A_X20Exception_X3E_X20_X27_X25s_X27_X20_X2D_X20_X25s), + /* K97 */ be_const_int(2), + /* K98 */ be_nested_str_weak(_X3Cp_X20style_X3D_X27width_X3A340px_X3B_X27_X3E_X3Cb_X3EException_X3A_X3C_X2Fb_X3E_X3Cbr_X3E_X27_X25s_X27_X3Cbr_X3E_X25s_X3C_X2Fp_X3E), }), be_str_weak(page_part_ctl), &be_const_str_solidified, @@ -2302,224 +2283,224 @@ be_local_closure(Matter_UI_page_part_ctl, /* name */ 0x7C1C0000, // 0013 CALL R7 0 0xB8221000, // 0014 GETNGBL R8 K8 0x8C201109, // 0015 GETMET R8 R8 K9 - 0x8C28050A, // 0016 GETMET R10 R2 K10 - 0x5830000B, // 0017 LDCONST R12 K11 - 0x5C340E00, // 0018 MOVE R13 R7 - 0x8C38030C, // 0019 GETMET R14 R1 K12 - 0x5C400E00, // 001A MOVE R16 R7 - 0x7C380400, // 001B CALL R14 2 - 0x8C3C030D, // 001C GETMET R15 R1 K13 - 0x5C440E00, // 001D MOVE R17 R7 - 0x7C3C0400, // 001E CALL R15 2 - 0x7C280A00, // 001F CALL R10 5 + 0x60280018, // 0016 GETGBL R10 G24 + 0x582C000A, // 0017 LDCONST R11 K10 + 0x5C300E00, // 0018 MOVE R12 R7 + 0x8C34030B, // 0019 GETMET R13 R1 K11 + 0x5C3C0E00, // 001A MOVE R15 R7 + 0x7C340400, // 001B CALL R13 2 + 0x8C38030C, // 001C GETMET R14 R1 K12 + 0x5C400E00, // 001D MOVE R16 R7 + 0x7C380400, // 001E CALL R14 2 + 0x7C280800, // 001F CALL R10 4 0x7C200400, // 0020 CALL R8 2 0x7001FFEF, // 0021 JMP #0012 - 0x5818000E, // 0022 LDCONST R6 K14 + 0x5818000D, // 0022 LDCONST R6 K13 0xAC180200, // 0023 CATCH R6 1 0 0xB0080000, // 0024 RAISE 2 R0 R0 - 0x8C18030F, // 0025 GETMET R6 R1 K15 - 0x58200010, // 0026 LDCONST R8 K16 + 0x8C18030E, // 0025 GETMET R6 R1 K14 + 0x5820000F, // 0026 LDCONST R8 K15 0x7C180400, // 0027 CALL R6 2 0x741A0003, // 0028 JMPT R6 #002D - 0x8C18030F, // 0029 GETMET R6 R1 K15 - 0x58200011, // 002A LDCONST R8 K17 + 0x8C18030E, // 0029 GETMET R6 R1 K14 + 0x58200010, // 002A LDCONST R8 K16 0x7C180400, // 002B CALL R6 2 0x781A002A, // 002C JMPF R6 #0058 0xB81A1000, // 002D GETNGBL R6 K8 0x8C180D09, // 002E GETMET R6 R6 K9 - 0x8C20050A, // 002F GETMET R8 R2 K10 - 0x58280012, // 0030 LDCONST R10 K18 - 0x582C0010, // 0031 LDCONST R11 K16 - 0x7C200600, // 0032 CALL R8 3 - 0x58240013, // 0033 LDCONST R9 K19 + 0x60200018, // 002F GETGBL R8 G24 + 0x58240011, // 0030 LDCONST R9 K17 + 0x5828000F, // 0031 LDCONST R10 K15 + 0x7C200400, // 0032 CALL R8 2 + 0x58240012, // 0033 LDCONST R9 K18 0x7C180600, // 0034 CALL R6 3 - 0x8C18030F, // 0035 GETMET R6 R1 K15 - 0x58200010, // 0036 LDCONST R8 K16 + 0x8C18030E, // 0035 GETMET R6 R1 K14 + 0x5820000F, // 0036 LDCONST R8 K15 0x7C180400, // 0037 CALL R6 2 0x781A0006, // 0038 JMPF R6 #0040 - 0x88180114, // 0039 GETMBR R6 R0 K20 + 0x88180113, // 0039 GETMBR R6 R0 K19 0x601C0009, // 003A GETGBL R7 G9 - 0x8C20030D, // 003B GETMET R8 R1 K13 - 0x58280010, // 003C LDCONST R10 K16 + 0x8C20030C, // 003B GETMET R8 R1 K12 + 0x5828000F, // 003C LDCONST R10 K15 0x7C200400, // 003D CALL R8 2 0x7C1C0200, // 003E CALL R7 1 - 0x901A2A07, // 003F SETMBR R6 K21 R7 - 0x8C18030F, // 0040 GETMET R6 R1 K15 - 0x58200011, // 0041 LDCONST R8 K17 + 0x901A2807, // 003F SETMBR R6 K20 R7 + 0x8C18030E, // 0040 GETMET R6 R1 K14 + 0x58200010, // 0041 LDCONST R8 K16 0x7C180400, // 0042 CALL R6 2 0x781A0006, // 0043 JMPF R6 #004B - 0x88180114, // 0044 GETMBR R6 R0 K20 + 0x88180113, // 0044 GETMBR R6 R0 K19 0x601C0009, // 0045 GETGBL R7 G9 - 0x8C20030D, // 0046 GETMET R8 R1 K13 - 0x58280011, // 0047 LDCONST R10 K17 + 0x8C20030C, // 0046 GETMET R8 R1 K12 + 0x58280010, // 0047 LDCONST R10 K16 0x7C200400, // 0048 CALL R8 2 0x7C1C0200, // 0049 CALL R7 1 - 0x901A2C07, // 004A SETMBR R6 K22 R7 - 0x88180114, // 004B GETMBR R6 R0 K20 - 0x8C1C030D, // 004C GETMET R7 R1 K13 - 0x58240018, // 004D LDCONST R9 K24 + 0x901A2A07, // 004A SETMBR R6 K21 R7 + 0x88180113, // 004B GETMBR R6 R0 K19 + 0x8C1C030C, // 004C GETMET R7 R1 K12 + 0x58240017, // 004D LDCONST R9 K23 0x7C1C0400, // 004E CALL R7 2 - 0x1C1C0F19, // 004F EQ R7 R7 K25 - 0x901A2E07, // 0050 SETMBR R6 K23 R7 - 0x88180114, // 0051 GETMBR R6 R0 K20 - 0x8C180D1A, // 0052 GETMET R6 R6 K26 + 0x1C1C0F18, // 004F EQ R7 R7 K24 + 0x901A2C07, // 0050 SETMBR R6 K22 R7 + 0x88180113, // 0051 GETMBR R6 R0 K19 + 0x8C180D19, // 0052 GETMET R6 R6 K25 0x7C180200, // 0053 CALL R6 1 - 0x8C18031B, // 0054 GETMET R6 R1 K27 - 0x5820001C, // 0055 LDCONST R8 K28 + 0x8C18031A, // 0054 GETMET R6 R1 K26 + 0x5820001B, // 0055 LDCONST R8 K27 0x7C180400, // 0056 CALL R6 2 0x70020223, // 0057 JMP #027C - 0x8C18030F, // 0058 GETMET R6 R1 K15 - 0x5820001D, // 0059 LDCONST R8 K29 + 0x8C18030E, // 0058 GETMET R6 R1 K14 + 0x5820001C, // 0059 LDCONST R8 K28 0x7C180400, // 005A CALL R6 2 0x781A0047, // 005B JMPF R6 #00A4 - 0x8C18030F, // 005C GETMET R6 R1 K15 - 0x5820001E, // 005D LDCONST R8 K30 + 0x8C18030E, // 005C GETMET R6 R1 K14 + 0x5820001D, // 005D LDCONST R8 K29 0x7C180400, // 005E CALL R6 2 - 0x8C1C030F, // 005F GETMET R7 R1 K15 - 0x5824001F, // 0060 LDCONST R9 K31 + 0x8C1C030E, // 005F GETMET R7 R1 K14 + 0x5824001E, // 0060 LDCONST R9 K30 0x7C1C0400, // 0061 CALL R7 2 - 0x8C200120, // 0062 GETMET R8 R0 K32 + 0x8C20011F, // 0062 GETMET R8 R0 K31 0x7C200200, // 0063 CALL R8 1 0x20200C08, // 0064 NE R8 R6 R8 0x78220027, // 0065 JMPF R8 #008E 0x781A0011, // 0066 JMPF R6 #0079 0xB8221000, // 0067 GETNGBL R8 K8 0x8C201109, // 0068 GETMET R8 R8 K9 - 0x8C28050A, // 0069 GETMET R10 R2 K10 - 0x58300012, // 006A LDCONST R12 K18 - 0x58340021, // 006B LDCONST R13 K33 - 0x7C280600, // 006C CALL R10 3 - 0x582C0013, // 006D LDCONST R11 K19 + 0x60280018, // 0069 GETGBL R10 G24 + 0x582C0011, // 006A LDCONST R11 K17 + 0x58300020, // 006B LDCONST R12 K32 + 0x7C280400, // 006C CALL R10 2 + 0x582C0012, // 006D LDCONST R11 K18 0x7C200600, // 006E CALL R8 3 0xB8221000, // 006F GETNGBL R8 K8 - 0x8C201122, // 0070 GETMET R8 R8 K34 + 0x8C201121, // 0070 GETMET R8 R8 K33 0x60280008, // 0071 GETGBL R10 G8 - 0xB82E4800, // 0072 GETNGBL R11 K36 - 0x882C1725, // 0073 GETMBR R11 R11 K37 + 0xB82E4600, // 0072 GETNGBL R11 K35 + 0x882C1724, // 0073 GETMBR R11 R11 K36 0x7C280200, // 0074 CALL R10 1 - 0x002A460A, // 0075 ADD R10 K35 R10 - 0x00281526, // 0076 ADD R10 R10 K38 + 0x002A440A, // 0075 ADD R10 K34 R10 + 0x00281525, // 0076 ADD R10 R10 K37 0x7C200400, // 0077 CALL R8 2 0x70020010, // 0078 JMP #008A 0xB8221000, // 0079 GETNGBL R8 K8 0x8C201109, // 007A GETMET R8 R8 K9 - 0x8C28050A, // 007B GETMET R10 R2 K10 - 0x58300012, // 007C LDCONST R12 K18 - 0x58340027, // 007D LDCONST R13 K39 - 0x7C280600, // 007E CALL R10 3 - 0x582C0013, // 007F LDCONST R11 K19 + 0x60280018, // 007B GETGBL R10 G24 + 0x582C0011, // 007C LDCONST R11 K17 + 0x58300026, // 007D LDCONST R12 K38 + 0x7C280400, // 007E CALL R10 2 + 0x582C0012, // 007F LDCONST R11 K18 0x7C200600, // 0080 CALL R8 3 0xB8221000, // 0081 GETNGBL R8 K8 - 0x8C201122, // 0082 GETMET R8 R8 K34 + 0x8C201121, // 0082 GETMET R8 R8 K33 0x60280008, // 0083 GETGBL R10 G8 - 0xB82E4800, // 0084 GETNGBL R11 K36 - 0x882C1725, // 0085 GETMBR R11 R11 K37 + 0xB82E4600, // 0084 GETNGBL R11 K35 + 0x882C1724, // 0085 GETMBR R11 R11 K36 0x7C280200, // 0086 CALL R10 1 - 0x002A460A, // 0087 ADD R10 K35 R10 - 0x00281528, // 0088 ADD R10 R10 K40 + 0x002A440A, // 0087 ADD R10 K34 R10 + 0x00281527, // 0088 ADD R10 R10 K39 0x7C200400, // 0089 CALL R8 2 - 0x8C20031B, // 008A GETMET R8 R1 K27 - 0x5828001C, // 008B LDCONST R10 K28 + 0x8C20031A, // 008A GETMET R8 R1 K26 + 0x5828001B, // 008B LDCONST R10 K27 0x7C200400, // 008C CALL R8 2 0x70020014, // 008D JMP #00A3 - 0x88200114, // 008E GETMBR R8 R0 K20 - 0x88201129, // 008F GETMBR R8 R8 K41 + 0x88200113, // 008E GETMBR R8 R0 K19 + 0x88201128, // 008F GETMBR R8 R8 K40 0x4C240000, // 0090 LDNIL R9 0x20201009, // 0091 NE R8 R8 R9 0x20200E08, // 0092 NE R8 R7 R8 0x7822000B, // 0093 JMPF R8 #00A0 0x781E0003, // 0094 JMPF R7 #0099 - 0x88200114, // 0095 GETMBR R8 R0 K20 - 0x8C20112A, // 0096 GETMET R8 R8 K42 + 0x88200113, // 0095 GETMBR R8 R0 K19 + 0x8C201129, // 0096 GETMET R8 R8 K41 0x7C200200, // 0097 CALL R8 1 0x70020002, // 0098 JMP #009C - 0x88200114, // 0099 GETMBR R8 R0 K20 - 0x8C20112B, // 009A GETMET R8 R8 K43 + 0x88200113, // 0099 GETMBR R8 R0 K19 + 0x8C20112A, // 009A GETMET R8 R8 K42 0x7C200200, // 009B CALL R8 1 - 0x8C20031B, // 009C GETMET R8 R1 K27 - 0x5828002C, // 009D LDCONST R10 K44 + 0x8C20031A, // 009C GETMET R8 R1 K26 + 0x5828002B, // 009D LDCONST R10 K43 0x7C200400, // 009E CALL R8 2 0x70020002, // 009F JMP #00A3 - 0x8C20031B, // 00A0 GETMET R8 R1 K27 - 0x5828002C, // 00A1 LDCONST R10 K44 + 0x8C20031A, // 00A0 GETMET R8 R1 K26 + 0x5828002B, // 00A1 LDCONST R10 K43 0x7C200400, // 00A2 CALL R8 2 0x700201D7, // 00A3 JMP #027C - 0x8C18030F, // 00A4 GETMET R6 R1 K15 - 0x5820002D, // 00A5 LDCONST R8 K45 + 0x8C18030E, // 00A4 GETMET R6 R1 K14 + 0x5820002C, // 00A5 LDCONST R8 K44 0x7C180400, // 00A6 CALL R6 2 0x781A0026, // 00A7 JMPF R6 #00CF 0xB81A1000, // 00A8 GETNGBL R6 K8 0x8C180D09, // 00A9 GETMET R6 R6 K9 - 0x8C20050A, // 00AA GETMET R8 R2 K10 - 0x58280012, // 00AB LDCONST R10 K18 - 0x582C002D, // 00AC LDCONST R11 K45 - 0x7C200600, // 00AD CALL R8 3 - 0x58240013, // 00AE LDCONST R9 K19 + 0x60200018, // 00AA GETGBL R8 G24 + 0x58240011, // 00AB LDCONST R9 K17 + 0x5828002C, // 00AC LDCONST R10 K44 + 0x7C200400, // 00AD CALL R8 2 + 0x58240012, // 00AE LDCONST R9 K18 0x7C180600, // 00AF CALL R6 3 0x60180009, // 00B0 GETGBL R6 G9 - 0x8C1C030D, // 00B1 GETMET R7 R1 K13 - 0x5824002D, // 00B2 LDCONST R9 K45 + 0x8C1C030C, // 00B1 GETMET R7 R1 K12 + 0x5824002C, // 00B2 LDCONST R9 K44 0x7C1C0400, // 00B3 CALL R7 2 0x7C180200, // 00B4 CALL R6 1 0x581C0005, // 00B5 LDCONST R7 K5 - 0x88200114, // 00B6 GETMBR R8 R0 K20 - 0x8820112E, // 00B7 GETMBR R8 R8 K46 - 0x8820112F, // 00B8 GETMBR R8 R8 K47 + 0x88200113, // 00B6 GETMBR R8 R0 K19 + 0x8820112D, // 00B7 GETMBR R8 R8 K45 + 0x8820112E, // 00B8 GETMBR R8 R8 K46 0x6024000C, // 00B9 GETGBL R9 G12 0x5C281000, // 00BA MOVE R10 R8 0x7C240200, // 00BB CALL R9 1 0x14240E09, // 00BC LT R9 R7 R9 0x7826000C, // 00BD JMPF R9 #00CB 0x94241007, // 00BE GETIDX R9 R8 R7 - 0x8C241330, // 00BF GETMET R9 R9 K48 + 0x8C24132F, // 00BF GETMET R9 R9 K47 0x7C240200, // 00C0 CALL R9 1 0x1C241206, // 00C1 EQ R9 R9 R6 0x78260005, // 00C2 JMPF R9 #00C9 - 0x88240114, // 00C3 GETMBR R9 R0 K20 - 0x8C241331, // 00C4 GETMET R9 R9 K49 + 0x88240113, // 00C3 GETMBR R9 R0 K19 + 0x8C241330, // 00C4 GETMET R9 R9 K48 0x942C1007, // 00C5 GETIDX R11 R8 R7 0x7C240400, // 00C6 CALL R9 2 0x70020002, // 00C7 JMP #00CB 0x70020000, // 00C8 JMP #00CA 0x001C0F07, // 00C9 ADD R7 R7 K7 0x7001FFED, // 00CA JMP #00B9 - 0x8C24031B, // 00CB GETMET R9 R1 K27 - 0x582C0032, // 00CC LDCONST R11 K50 + 0x8C24031A, // 00CB GETMET R9 R1 K26 + 0x582C0031, // 00CC LDCONST R11 K49 0x7C240400, // 00CD CALL R9 2 0x700201AC, // 00CE JMP #027C - 0x8C18030F, // 00CF GETMET R6 R1 K15 - 0x58200033, // 00D0 LDCONST R8 K51 + 0x8C18030E, // 00CF GETMET R6 R1 K14 + 0x58200032, // 00D0 LDCONST R8 K50 0x7C180400, // 00D1 CALL R6 2 0x781A0011, // 00D2 JMPF R6 #00E5 0xB81A1000, // 00D3 GETNGBL R6 K8 0x8C180D09, // 00D4 GETMET R6 R6 K9 - 0x8C20050A, // 00D5 GETMET R8 R2 K10 - 0x58280012, // 00D6 LDCONST R10 K18 - 0x582C0033, // 00D7 LDCONST R11 K51 - 0x7C200600, // 00D8 CALL R8 3 - 0x58240013, // 00D9 LDCONST R9 K19 + 0x60200018, // 00D5 GETGBL R8 G24 + 0x58240011, // 00D6 LDCONST R9 K17 + 0x58280032, // 00D7 LDCONST R10 K50 + 0x7C200400, // 00D8 CALL R8 2 + 0x58240012, // 00D9 LDCONST R9 K18 0x7C180600, // 00DA CALL R6 3 - 0x88180114, // 00DB GETMBR R6 R0 K20 + 0x88180113, // 00DB GETMBR R6 R0 K19 0x501C0000, // 00DC LDBOOL R7 0 0 - 0x901A6807, // 00DD SETMBR R6 K52 R7 - 0x88180114, // 00DE GETMBR R6 R0 K20 - 0x8C180D1A, // 00DF GETMET R6 R6 K26 + 0x901A6607, // 00DD SETMBR R6 K51 R7 + 0x88180113, // 00DE GETMBR R6 R0 K19 + 0x8C180D19, // 00DF GETMET R6 R6 K25 0x7C180200, // 00E0 CALL R6 1 - 0x8C18031B, // 00E1 GETMET R6 R1 K27 - 0x5820001C, // 00E2 LDCONST R8 K28 + 0x8C18031A, // 00E1 GETMET R6 R1 K26 + 0x5820001B, // 00E2 LDCONST R8 K27 0x7C180400, // 00E3 CALL R6 2 0x70020196, // 00E4 JMP #027C - 0x8C18030F, // 00E5 GETMET R6 R1 K15 - 0x58200035, // 00E6 LDCONST R8 K53 + 0x8C18030E, // 00E5 GETMET R6 R1 K14 + 0x58200034, // 00E6 LDCONST R8 K52 0x7C180400, // 00E7 CALL R6 2 0x781A00D6, // 00E8 JMPF R6 #01C0 0xB81A1000, // 00E9 GETNGBL R6 K8 0x8C180D09, // 00EA GETMET R6 R6 K9 - 0x8C20050A, // 00EB GETMET R8 R2 K10 - 0x58280012, // 00EC LDCONST R10 K18 - 0x582C0035, // 00ED LDCONST R11 K53 - 0x7C200600, // 00EE CALL R8 3 - 0x58240013, // 00EF LDCONST R9 K19 + 0x60200018, // 00EB GETGBL R8 G24 + 0x58240011, // 00EC LDCONST R9 K17 + 0x58280034, // 00ED LDCONST R10 K52 + 0x7C200400, // 00EE CALL R8 2 + 0x58240012, // 00EF LDCONST R9 K18 0x7C180600, // 00F0 CALL R6 3 0x50180000, // 00F1 LDBOOL R6 0 0 0x601C0010, // 00F2 GETGBL R7 G16 @@ -2531,25 +2512,25 @@ be_local_closure(Matter_UI_page_part_ctl, /* name */ 0xA80200A0, // 00F8 EXBLK 0 #019A 0x5C200E00, // 00F9 MOVE R8 R7 0x7C200000, // 00FA CALL R8 0 - 0x8C24030C, // 00FB GETMET R9 R1 K12 + 0x8C24030B, // 00FB GETMET R9 R1 K11 0x5C2C1000, // 00FC MOVE R11 R8 0x7C240400, // 00FD CALL R9 2 - 0x8C280536, // 00FE GETMET R10 R2 K54 + 0x8C280535, // 00FE GETMET R10 R2 K53 0x5C301200, // 00FF MOVE R12 R9 - 0x5834000D, // 0100 LDCONST R13 K13 + 0x5834000C, // 0100 LDCONST R13 K12 0x7C280600, // 0101 CALL R10 3 0x1C281505, // 0102 EQ R10 R10 K5 0x782A005B, // 0103 JMPF R10 #0160 0x60280009, // 0104 GETGBL R10 G9 - 0x402E2737, // 0105 CONNECT R11 K19 K55 + 0x402E2536, // 0105 CONNECT R11 K18 K54 0x942C120B, // 0106 GETIDX R11 R9 R11 0x7C280200, // 0107 CALL R10 1 - 0x8C2C030D, // 0108 GETMET R11 R1 K13 + 0x8C2C030C, // 0108 GETMET R11 R1 K12 0x5C341000, // 0109 MOVE R13 R8 0x7C2C0400, // 010A CALL R11 2 - 0x88300114, // 010B GETMBR R12 R0 K20 - 0x88301938, // 010C GETMBR R12 R12 K56 - 0x8C301936, // 010D GETMET R12 R12 K54 + 0x88300113, // 010B GETMBR R12 R0 K19 + 0x88301937, // 010C GETMBR R12 R12 K55 + 0x8C301935, // 010D GETMET R12 R12 K53 0x60380008, // 010E GETGBL R14 G8 0x5C3C1400, // 010F MOVE R15 R10 0x7C380200, // 0110 CALL R14 1 @@ -2557,12 +2538,12 @@ be_local_closure(Matter_UI_page_part_ctl, /* name */ 0x4C340000, // 0112 LDNIL R13 0x2034180D, // 0113 NE R13 R12 R13 0x78360041, // 0114 JMPF R13 #0157 - 0x88340114, // 0115 GETMBR R13 R0 K20 - 0x88341B39, // 0116 GETMBR R13 R13 K57 - 0x8C341B36, // 0117 GETMET R13 R13 K54 - 0x8C3C1936, // 0118 GETMET R15 R12 K54 - 0x5844003A, // 0119 LDCONST R17 K58 - 0x5848003B, // 011A LDCONST R18 K59 + 0x88340113, // 0115 GETMBR R13 R0 K19 + 0x88341B38, // 0116 GETMBR R13 R13 K56 + 0x8C341B35, // 0117 GETMET R13 R13 K53 + 0x8C3C1935, // 0118 GETMET R15 R12 K53 + 0x58440039, // 0119 LDCONST R17 K57 + 0x5848003A, // 011A LDCONST R18 K58 0x7C3C0600, // 011B CALL R15 3 0x7C340400, // 011C CALL R13 2 0x4C380000, // 011D LDNIL R14 @@ -2570,84 +2551,84 @@ be_local_closure(Matter_UI_page_part_ctl, /* name */ 0x783A0035, // 011F JMPF R14 #0156 0xB83A1000, // 0120 GETNGBL R14 K8 0x8C381D09, // 0121 GETMET R14 R14 K9 - 0x8C40050A, // 0122 GETMET R16 R2 K10 - 0x5848003C, // 0123 LDCONST R18 K60 - 0x5C4C1400, // 0124 MOVE R19 R10 - 0x5C501600, // 0125 MOVE R20 R11 - 0x7C400800, // 0126 CALL R16 4 - 0x58440013, // 0127 LDCONST R17 K19 + 0x60400018, // 0122 GETGBL R16 G24 + 0x5844003B, // 0123 LDCONST R17 K59 + 0x5C481400, // 0124 MOVE R18 R10 + 0x5C4C1600, // 0125 MOVE R19 R11 + 0x7C400600, // 0126 CALL R16 3 + 0x58440012, // 0127 LDCONST R17 K18 0x7C380600, // 0128 CALL R14 3 - 0x8C381B3D, // 0129 GETMET R14 R13 K61 + 0x8C381B3C, // 0129 GETMET R14 R13 K60 0x5C401A00, // 012A MOVE R16 R13 0x5C441800, // 012B MOVE R17 R12 0x7C380600, // 012C CALL R14 3 0x203C1C0B, // 012D NE R15 R14 R11 0xB8421000, // 012E GETNGBL R16 K8 0x8C402109, // 012F GETMET R16 R16 K9 - 0x8C48050A, // 0130 GETMET R18 R2 K10 - 0x5850003E, // 0131 LDCONST R20 K62 - 0x5C541400, // 0132 MOVE R21 R10 - 0x5C581C00, // 0133 MOVE R22 R14 - 0x5C5C1600, // 0134 MOVE R23 R11 - 0x20601C0B, // 0135 NE R24 R14 R11 - 0x78620001, // 0136 JMPF R24 #0139 - 0x5860003F, // 0137 LDCONST R24 K63 + 0x60480018, // 0130 GETGBL R18 G24 + 0x584C003D, // 0131 LDCONST R19 K61 + 0x5C501400, // 0132 MOVE R20 R10 + 0x5C541C00, // 0133 MOVE R21 R14 + 0x5C581600, // 0134 MOVE R22 R11 + 0x205C1C0B, // 0135 NE R23 R14 R11 + 0x785E0001, // 0136 JMPF R23 #0139 + 0x585C003E, // 0137 LDCONST R23 K62 0x70020000, // 0138 JMP #013A - 0x5860003B, // 0139 LDCONST R24 K59 - 0x7C480C00, // 013A CALL R18 6 - 0x584C0013, // 013B LDCONST R19 K19 + 0x585C003A, // 0139 LDCONST R23 K58 + 0x7C480A00, // 013A CALL R18 5 + 0x584C0012, // 013B LDCONST R19 K18 0x7C400600, // 013C CALL R16 3 0x783E0017, // 013D JMPF R15 #0156 0x50180200, // 013E LDBOOL R6 1 0 - 0x8C401B40, // 013F GETMET R16 R13 K64 + 0x8C401B3F, // 013F GETMET R16 R13 K63 0x5C481A00, // 0140 MOVE R18 R13 0x5C4C1800, // 0141 MOVE R19 R12 0x5C501600, // 0142 MOVE R20 R11 0x7C400800, // 0143 CALL R16 4 - 0x88400114, // 0144 GETMBR R16 R0 K20 - 0x8C402141, // 0145 GETMET R16 R16 K65 + 0x88400113, // 0144 GETMBR R16 R0 K19 + 0x8C402140, // 0145 GETMET R16 R16 K64 0x5C481400, // 0146 MOVE R18 R10 0x7C400400, // 0147 CALL R16 2 0x7842000C, // 0148 JMPF R16 #0156 0xB8461000, // 0149 GETNGBL R17 K8 0x8C442309, // 014A GETMET R17 R17 K9 - 0x8C4C050A, // 014B GETMET R19 R2 K10 - 0x58540042, // 014C LDCONST R21 K66 - 0x5C581800, // 014D MOVE R22 R12 - 0x5C5C1400, // 014E MOVE R23 R10 - 0x5C602000, // 014F MOVE R24 R16 - 0x7C4C0A00, // 0150 CALL R19 5 - 0x58500013, // 0151 LDCONST R20 K19 + 0x604C0018, // 014B GETGBL R19 G24 + 0x58500041, // 014C LDCONST R20 K65 + 0x5C541800, // 014D MOVE R21 R12 + 0x5C581400, // 014E MOVE R22 R10 + 0x5C5C2000, // 014F MOVE R23 R16 + 0x7C4C0800, // 0150 CALL R19 4 + 0x58500012, // 0151 LDCONST R20 K18 0x7C440600, // 0152 CALL R17 3 - 0x8C442143, // 0153 GETMET R17 R16 K67 + 0x8C442142, // 0153 GETMET R17 R16 K66 0x5C4C1800, // 0154 MOVE R19 R12 0x7C440400, // 0155 CALL R17 2 0x70020007, // 0156 JMP #015F 0xB8361000, // 0157 GETNGBL R13 K8 0x8C341B09, // 0158 GETMET R13 R13 K9 - 0x8C3C050A, // 0159 GETMET R15 R2 K10 - 0x58440044, // 015A LDCONST R17 K68 - 0x5C481400, // 015B MOVE R18 R10 - 0x7C3C0600, // 015C CALL R15 3 - 0x58400013, // 015D LDCONST R16 K19 + 0x603C0018, // 0159 GETGBL R15 G24 + 0x58400043, // 015A LDCONST R16 K67 + 0x5C441400, // 015B MOVE R17 R10 + 0x7C3C0400, // 015C CALL R15 2 + 0x58400012, // 015D LDCONST R16 K18 0x7C340600, // 015E CALL R13 3 0x70020038, // 015F JMP #0199 - 0x8C280536, // 0160 GETMET R10 R2 K54 + 0x8C280535, // 0160 GETMET R10 R2 K53 0x5C301200, // 0161 MOVE R12 R9 - 0x58340045, // 0162 LDCONST R13 K69 + 0x58340044, // 0162 LDCONST R13 K68 0x7C280600, // 0163 CALL R10 3 0x1C281505, // 0164 EQ R10 R10 K5 0x782A0032, // 0165 JMPF R10 #0199 0x60280009, // 0166 GETGBL R10 G9 - 0x402E2737, // 0167 CONNECT R11 K19 K55 + 0x402E2536, // 0167 CONNECT R11 K18 K54 0x942C120B, // 0168 GETIDX R11 R9 R11 0x7C280200, // 0169 CALL R10 1 - 0x8C2C030D, // 016A GETMET R11 R1 K13 + 0x8C2C030C, // 016A GETMET R11 R1 K12 0x5C341000, // 016B MOVE R13 R8 0x7C2C0400, // 016C CALL R11 2 - 0x88300114, // 016D GETMBR R12 R0 K20 - 0x88301938, // 016E GETMBR R12 R12 K56 - 0x8C301936, // 016F GETMET R12 R12 K54 + 0x88300113, // 016D GETMBR R12 R0 K19 + 0x88301937, // 016E GETMBR R12 R12 K55 + 0x8C301935, // 016F GETMET R12 R12 K53 0x60380008, // 0170 GETGBL R14 G8 0x5C3C1400, // 0171 MOVE R15 R10 0x7C380200, // 0172 CALL R14 1 @@ -2655,104 +2636,104 @@ be_local_closure(Matter_UI_page_part_ctl, /* name */ 0x4C340000, // 0174 LDNIL R13 0x2034180D, // 0175 NE R13 R12 R13 0x78360021, // 0176 JMPF R13 #0199 - 0x8C341936, // 0177 GETMET R13 R12 K54 - 0x583C0046, // 0178 LDCONST R15 K70 - 0x5840003B, // 0179 LDCONST R16 K59 + 0x8C341935, // 0177 GETMET R13 R12 K53 + 0x583C0045, // 0178 LDCONST R15 K69 + 0x5840003A, // 0179 LDCONST R16 K58 0x7C340600, // 017A CALL R13 3 0x20381A0B, // 017B NE R14 R13 R11 0x783A001B, // 017C JMPF R14 #0199 0x50180200, // 017D LDBOOL R6 1 0 - 0x883C0114, // 017E GETMBR R15 R0 K20 - 0x8C3C1F41, // 017F GETMET R15 R15 K65 + 0x883C0113, // 017E GETMBR R15 R0 K19 + 0x8C3C1F40, // 017F GETMET R15 R15 K64 0x5C441400, // 0180 MOVE R17 R10 0x7C3C0400, // 0181 CALL R15 2 0x783E0015, // 0182 JMPF R15 #0199 - 0x8C401F47, // 0183 GETMET R16 R15 K71 + 0x8C401F46, // 0183 GETMET R16 R15 K70 0x5C481600, // 0184 MOVE R18 R11 0x7C400400, // 0185 CALL R16 2 0x782E0001, // 0186 JMPF R11 #0189 - 0x98328C0B, // 0187 SETIDX R12 K70 R11 + 0x98328A0B, // 0187 SETIDX R12 K69 R11 0x70020002, // 0188 JMP #018C - 0x8C401948, // 0189 GETMET R16 R12 K72 - 0x58480046, // 018A LDCONST R18 K70 + 0x8C401947, // 0189 GETMET R16 R12 K71 + 0x58480045, // 018A LDCONST R18 K69 0x7C400400, // 018B CALL R16 2 0xB8421000, // 018C GETNGBL R16 K8 0x8C402109, // 018D GETMET R16 R16 K9 - 0x8C48050A, // 018E GETMET R18 R2 K10 - 0x58500049, // 018F LDCONST R20 K73 - 0x5C541800, // 0190 MOVE R21 R12 - 0x5C581400, // 0191 MOVE R22 R10 - 0x5C5C1E00, // 0192 MOVE R23 R15 - 0x7C480A00, // 0193 CALL R18 5 - 0x584C0013, // 0194 LDCONST R19 K19 + 0x60480018, // 018E GETGBL R18 G24 + 0x584C0048, // 018F LDCONST R19 K72 + 0x5C501800, // 0190 MOVE R20 R12 + 0x5C541400, // 0191 MOVE R21 R10 + 0x5C581E00, // 0192 MOVE R22 R15 + 0x7C480800, // 0193 CALL R18 4 + 0x584C0012, // 0194 LDCONST R19 K18 0x7C400600, // 0195 CALL R16 3 - 0x8C401F43, // 0196 GETMET R16 R15 K67 + 0x8C401F42, // 0196 GETMET R16 R15 K66 0x5C481800, // 0197 MOVE R18 R12 0x7C400400, // 0198 CALL R16 2 0x7001FF5E, // 0199 JMP #00F9 - 0x581C000E, // 019A LDCONST R7 K14 + 0x581C000D, // 019A LDCONST R7 K13 0xAC1C0200, // 019B CATCH R7 1 0 0xB0080000, // 019C RAISE 2 R0 R0 0xB81E1000, // 019D GETNGBL R7 K8 0x8C1C0F09, // 019E GETMET R7 R7 K9 - 0x8C24050A, // 019F GETMET R9 R2 K10 - 0x582C004A, // 01A0 LDCONST R11 K74 - 0x60300008, // 01A1 GETGBL R12 G8 - 0x88340114, // 01A2 GETMBR R13 R0 K20 - 0x88341B38, // 01A3 GETMBR R13 R13 K56 - 0x7C300200, // 01A4 CALL R12 1 - 0x7C240600, // 01A5 CALL R9 3 - 0x58280013, // 01A6 LDCONST R10 K19 + 0x60240018, // 019F GETGBL R9 G24 + 0x58280049, // 01A0 LDCONST R10 K73 + 0x602C0008, // 01A1 GETGBL R11 G8 + 0x88300113, // 01A2 GETMBR R12 R0 K19 + 0x88301937, // 01A3 GETMBR R12 R12 K55 + 0x7C2C0200, // 01A4 CALL R11 1 + 0x7C240400, // 01A5 CALL R9 2 + 0x58280012, // 01A6 LDCONST R10 K18 0x7C1C0600, // 01A7 CALL R7 3 0x78160008, // 01A8 JMPF R5 #01B2 0xB81E1000, // 01A9 GETNGBL R7 K8 0x8C1C0F09, // 01AA GETMET R7 R7 K9 - 0x8C24050A, // 01AB GETMET R9 R2 K10 - 0x582C004B, // 01AC LDCONST R11 K75 - 0x5C300A00, // 01AD MOVE R12 R5 - 0x7C240600, // 01AE CALL R9 3 - 0x58280013, // 01AF LDCONST R10 K19 + 0x60240018, // 01AB GETGBL R9 G24 + 0x5828004A, // 01AC LDCONST R10 K74 + 0x5C2C0A00, // 01AD MOVE R11 R5 + 0x7C240400, // 01AE CALL R9 2 + 0x58280012, // 01AF LDCONST R10 K18 0x7C1C0600, // 01B0 CALL R7 3 0x7002000C, // 01B1 JMP #01BF 0x741A0002, // 01B2 JMPT R6 #01B6 - 0x881C0114, // 01B3 GETMBR R7 R0 K20 - 0x881C0F34, // 01B4 GETMBR R7 R7 K52 + 0x881C0113, // 01B3 GETMBR R7 R0 K19 + 0x881C0F33, // 01B4 GETMBR R7 R7 K51 0x741E0005, // 01B5 JMPT R7 #01BC - 0x881C0114, // 01B6 GETMBR R7 R0 K20 + 0x881C0113, // 01B6 GETMBR R7 R0 K19 0x50200200, // 01B7 LDBOOL R8 1 0 - 0x901E6808, // 01B8 SETMBR R7 K52 R8 - 0x881C0114, // 01B9 GETMBR R7 R0 K20 - 0x8C1C0F1A, // 01BA GETMET R7 R7 K26 + 0x901E6608, // 01B8 SETMBR R7 K51 R8 + 0x881C0113, // 01B9 GETMBR R7 R0 K19 + 0x8C1C0F19, // 01BA GETMET R7 R7 K25 0x7C1C0200, // 01BB CALL R7 1 - 0x8C1C031B, // 01BC GETMET R7 R1 K27 - 0x58240032, // 01BD LDCONST R9 K50 + 0x8C1C031A, // 01BC GETMET R7 R1 K26 + 0x58240031, // 01BD LDCONST R9 K49 0x7C1C0400, // 01BE CALL R7 2 0x700200BB, // 01BF JMP #027C - 0x8C18030F, // 01C0 GETMET R6 R1 K15 - 0x5820004C, // 01C1 LDCONST R8 K76 + 0x8C18030E, // 01C0 GETMET R6 R1 K14 + 0x5820004B, // 01C1 LDCONST R8 K75 0x7C180400, // 01C2 CALL R6 2 0x781A002B, // 01C3 JMPF R6 #01F0 - 0x8C18030D, // 01C4 GETMET R6 R1 K13 - 0x5820004D, // 01C5 LDCONST R8 K77 + 0x8C18030C, // 01C4 GETMET R6 R1 K12 + 0x5820004C, // 01C5 LDCONST R8 K76 0x7C180400, // 01C6 CALL R6 2 - 0x8C1C030D, // 01C7 GETMET R7 R1 K13 - 0x5824000D, // 01C8 LDCONST R9 K13 + 0x8C1C030C, // 01C7 GETMET R7 R1 K12 + 0x5824000C, // 01C8 LDCONST R9 K12 0x7C1C0400, // 01C9 CALL R7 2 - 0x8C20030D, // 01CA GETMET R8 R1 K13 - 0x58280045, // 01CB LDCONST R10 K69 + 0x8C20030C, // 01CA GETMET R8 R1 K12 + 0x58280044, // 01CB LDCONST R10 K68 0x7C200400, // 01CC CALL R8 2 0xB8261000, // 01CD GETNGBL R9 K8 0x8C241309, // 01CE GETMET R9 R9 K9 - 0x8C2C050A, // 01CF GETMET R11 R2 K10 - 0x5834004E, // 01D0 LDCONST R13 K78 - 0x5C380C00, // 01D1 MOVE R14 R6 - 0x5C3C0E00, // 01D2 MOVE R15 R7 - 0x7C2C0800, // 01D3 CALL R11 4 - 0x58300013, // 01D4 LDCONST R12 K19 + 0x602C0018, // 01CF GETGBL R11 G24 + 0x5830004D, // 01D0 LDCONST R12 K77 + 0x5C340C00, // 01D1 MOVE R13 R6 + 0x5C380E00, // 01D2 MOVE R14 R7 + 0x7C2C0600, // 01D3 CALL R11 3 + 0x58300012, // 01D4 LDCONST R12 K18 0x7C240600, // 01D5 CALL R9 3 - 0x88240114, // 01D6 GETMBR R9 R0 K20 - 0x88241339, // 01D7 GETMBR R9 R9 K57 - 0x8C241336, // 01D8 GETMET R9 R9 K54 + 0x88240113, // 01D6 GETMBR R9 R0 K19 + 0x88241338, // 01D7 GETMBR R9 R9 K56 + 0x8C241335, // 01D8 GETMET R9 R9 K53 0x5C2C0C00, // 01D9 MOVE R11 R6 0x7C240400, // 01DA CALL R9 2 0x4C280000, // 01DB LDNIL R10 @@ -2761,56 +2742,56 @@ be_local_closure(Matter_UI_page_part_ctl, /* name */ 0x60280013, // 01DE GETGBL R10 G19 0x7C280000, // 01DF CALL R10 0 0x78220000, // 01E0 JMPF R8 #01E2 - 0x982A8C08, // 01E1 SETIDX R10 K70 R8 - 0x8C2C1340, // 01E2 GETMET R11 R9 K64 + 0x982A8A08, // 01E1 SETIDX R10 K69 R8 + 0x8C2C133F, // 01E2 GETMET R11 R9 K63 0x5C341200, // 01E3 MOVE R13 R9 0x5C381400, // 01E4 MOVE R14 R10 0x5C3C0E00, // 01E5 MOVE R15 R7 0x7C2C0800, // 01E6 CALL R11 4 - 0x882C0114, // 01E7 GETMBR R11 R0 K20 - 0x8C2C174F, // 01E8 GETMET R11 R11 K79 + 0x882C0113, // 01E7 GETMBR R11 R0 K19 + 0x8C2C174E, // 01E8 GETMET R11 R11 K78 0x5C340C00, // 01E9 MOVE R13 R6 0x5C381400, // 01EA MOVE R14 R10 0x7C2C0600, // 01EB CALL R11 3 - 0x8C28031B, // 01EC GETMET R10 R1 K27 - 0x58300032, // 01ED LDCONST R12 K50 + 0x8C28031A, // 01EC GETMET R10 R1 K26 + 0x58300031, // 01ED LDCONST R12 K49 0x7C280400, // 01EE CALL R10 2 0x7002008B, // 01EF JMP #027C - 0x8C18030F, // 01F0 GETMET R6 R1 K15 - 0x58200050, // 01F1 LDCONST R8 K80 + 0x8C18030E, // 01F0 GETMET R6 R1 K14 + 0x5820004F, // 01F1 LDCONST R8 K79 0x7C180400, // 01F2 CALL R6 2 0x781A005E, // 01F3 JMPF R6 #0253 - 0x8C18030D, // 01F4 GETMET R6 R1 K13 - 0x58200051, // 01F5 LDCONST R8 K81 + 0x8C18030C, // 01F4 GETMET R6 R1 K12 + 0x58200050, // 01F5 LDCONST R8 K80 0x7C180400, // 01F6 CALL R6 2 0x4C1C0000, // 01F7 LDNIL R7 0x1C1C0C07, // 01F8 EQ R7 R6 R7 0x741E0001, // 01F9 JMPT R7 #01FC - 0x1C1C0D3B, // 01FA EQ R7 R6 K59 + 0x1C1C0D3A, // 01FA EQ R7 R6 K58 0x781E0000, // 01FB JMPF R7 #01FD - 0xB006A553, // 01FC RAISE 1 K82 K83 + 0xB006A352, // 01FC RAISE 1 K81 K82 0x581C0005, // 01FD LDCONST R7 K5 0x60200008, // 01FE GETGBL R8 G8 0x5C240E00, // 01FF MOVE R9 R7 0x7C200200, // 0200 CALL R8 1 - 0x8C24030F, // 0201 GETMET R9 R1 K15 - 0x002E9A08, // 0202 ADD R11 K77 R8 + 0x8C24030E, // 0201 GETMET R9 R1 K14 + 0x002E9808, // 0202 ADD R11 K76 R8 0x7C240400, // 0203 CALL R9 2 0x78260049, // 0204 JMPF R9 #024F - 0x8C24030D, // 0205 GETMET R9 R1 K13 - 0x002E9A08, // 0206 ADD R11 K77 R8 + 0x8C24030C, // 0205 GETMET R9 R1 K12 + 0x002E9808, // 0206 ADD R11 K76 R8 0x7C240400, // 0207 CALL R9 2 - 0x8C28030D, // 0208 GETMET R10 R1 K13 - 0x00321A08, // 0209 ADD R12 K13 R8 + 0x8C28030C, // 0208 GETMET R10 R1 K12 + 0x00321808, // 0209 ADD R12 K12 R8 0x7C280400, // 020A CALL R10 2 - 0x8C2C030D, // 020B GETMET R11 R1 K13 - 0x00368A08, // 020C ADD R13 K69 R8 + 0x8C2C030C, // 020B GETMET R11 R1 K12 + 0x00368808, // 020C ADD R13 K68 R8 0x7C2C0400, // 020D CALL R11 2 - 0x2030133B, // 020E NE R12 R9 K59 + 0x2030133A, // 020E NE R12 R9 K58 0x78320038, // 020F JMPF R12 #0249 - 0x88300114, // 0210 GETMBR R12 R0 K20 - 0x88301939, // 0211 GETMBR R12 R12 K57 - 0x8C301936, // 0212 GETMET R12 R12 K54 + 0x88300113, // 0210 GETMBR R12 R0 K19 + 0x88301938, // 0211 GETMBR R12 R12 K56 + 0x8C301935, // 0212 GETMET R12 R12 K53 0x5C381200, // 0213 MOVE R14 R9 0x7C300400, // 0214 CALL R12 2 0x4C340000, // 0215 LDNIL R13 @@ -2818,24 +2799,24 @@ be_local_closure(Matter_UI_page_part_ctl, /* name */ 0x78360030, // 0217 JMPF R13 #0249 0x60340013, // 0218 GETGBL R13 G19 0x7C340000, // 0219 CALL R13 0 - 0x9836A206, // 021A SETIDX R13 K81 R6 - 0x98367409, // 021B SETIDX R13 K58 R9 + 0x9836A006, // 021A SETIDX R13 K80 R6 + 0x98367209, // 021B SETIDX R13 K57 R9 0x782E0000, // 021C JMPF R11 #021E - 0x98368C0B, // 021D SETIDX R13 K70 R11 - 0x8C381940, // 021E GETMET R14 R12 K64 + 0x98368A0B, // 021D SETIDX R13 K69 R11 + 0x8C38193F, // 021E GETMET R14 R12 K63 0x5C401800, // 021F MOVE R16 R12 0x5C441A00, // 0220 MOVE R17 R13 0x5C481400, // 0221 MOVE R18 R10 0x7C380800, // 0222 CALL R14 4 0x50380000, // 0223 LDBOOL R14 0 0 0x603C0010, // 0224 GETGBL R15 G16 - 0x88400114, // 0225 GETMBR R16 R0 K20 - 0x88402138, // 0226 GETMBR R16 R16 K56 + 0x88400113, // 0225 GETMBR R16 R0 K19 + 0x88402137, // 0226 GETMBR R16 R16 K55 0x7C3C0200, // 0227 CALL R15 1 0xA802000B, // 0228 EXBLK 0 #0235 0x5C401E00, // 0229 MOVE R16 R15 0x7C400000, // 022A CALL R16 0 - 0x8C440154, // 022B GETMET R17 R0 K84 + 0x8C440153, // 022B GETMET R17 R0 K83 0x5C4C2000, // 022C MOVE R19 R16 0x5C501A00, // 022D MOVE R20 R13 0x7C440600, // 022E CALL R17 3 @@ -2845,23 +2826,23 @@ be_local_closure(Matter_UI_page_part_ctl, /* name */ 0x7001FFF5, // 0232 JMP #0229 0xA8040001, // 0233 EXBLK 1 1 0x70020002, // 0234 JMP #0238 - 0x583C000E, // 0235 LDCONST R15 K14 + 0x583C000D, // 0235 LDCONST R15 K13 0xAC3C0200, // 0236 CATCH R15 1 0 0xB0080000, // 0237 RAISE 2 R0 R0 0x5C3C1C00, // 0238 MOVE R15 R14 0x743E000E, // 0239 JMPT R15 #0249 0xB83E1000, // 023A GETNGBL R15 K8 0x8C3C1F09, // 023B GETMET R15 R15 K9 - 0x8C44050A, // 023C GETMET R17 R2 K10 - 0x584C0055, // 023D LDCONST R19 K85 - 0x5C500C00, // 023E MOVE R20 R6 - 0x5C541200, // 023F MOVE R21 R9 - 0x5C581400, // 0240 MOVE R22 R10 - 0x7C440A00, // 0241 CALL R17 5 - 0x58480013, // 0242 LDCONST R18 K19 + 0x60440018, // 023C GETGBL R17 G24 + 0x58480054, // 023D LDCONST R18 K84 + 0x5C4C0C00, // 023E MOVE R19 R6 + 0x5C501200, // 023F MOVE R20 R9 + 0x5C541400, // 0240 MOVE R21 R10 + 0x7C440800, // 0241 CALL R17 4 + 0x58480012, // 0242 LDCONST R18 K18 0x7C3C0600, // 0243 CALL R15 3 - 0x883C0114, // 0244 GETMBR R15 R0 K20 - 0x8C3C1F4F, // 0245 GETMET R15 R15 K79 + 0x883C0113, // 0244 GETMBR R15 R0 K19 + 0x8C3C1F4E, // 0245 GETMET R15 R15 K78 0x5C441200, // 0246 MOVE R17 R9 0x5C481A00, // 0247 MOVE R18 R13 0x7C3C0600, // 0248 CALL R15 3 @@ -2871,8 +2852,8 @@ be_local_closure(Matter_UI_page_part_ctl, /* name */ 0x7C300200, // 024C CALL R12 1 0x5C201800, // 024D MOVE R8 R12 0x7001FFB1, // 024E JMP #0201 - 0x8C24031B, // 024F GETMET R9 R1 K27 - 0x582C0032, // 0250 LDCONST R11 K50 + 0x8C24031A, // 024F GETMET R9 R1 K26 + 0x582C0031, // 0250 LDCONST R11 K49 0x7C240400, // 0251 CALL R9 2 0x70020028, // 0252 JMP #027C 0x4C180000, // 0253 LDNIL R6 @@ -2885,17 +2866,17 @@ be_local_closure(Matter_UI_page_part_ctl, /* name */ 0xA8020013, // 025A EXBLK 0 #026F 0x5C200E00, // 025B MOVE R8 R7 0x7C200000, // 025C CALL R8 0 - 0x8C24030C, // 025D GETMET R9 R1 K12 + 0x8C24030B, // 025D GETMET R9 R1 K11 0x5C2C1000, // 025E MOVE R11 R8 0x7C240400, // 025F CALL R9 2 - 0x8C280536, // 0260 GETMET R10 R2 K54 + 0x8C280535, // 0260 GETMET R10 R2 K53 0x5C301200, // 0261 MOVE R12 R9 - 0x58340056, // 0262 LDCONST R13 K86 + 0x58340055, // 0262 LDCONST R13 K85 0x7C280600, // 0263 CALL R10 3 0x1C281505, // 0264 EQ R10 R10 K5 0x782A0005, // 0265 JMPF R10 #026C 0x60280009, // 0266 GETGBL R10 G9 - 0x402E2737, // 0267 CONNECT R11 K19 K55 + 0x402E2536, // 0267 CONNECT R11 K18 K54 0x942C120B, // 0268 GETIDX R11 R9 R11 0x7C280200, // 0269 CALL R10 1 0x5C181400, // 026A MOVE R6 R10 @@ -2903,37 +2884,37 @@ be_local_closure(Matter_UI_page_part_ctl, /* name */ 0x7001FFED, // 026C JMP #025B 0xA8040001, // 026D EXBLK 1 1 0x70020002, // 026E JMP #0272 - 0x581C000E, // 026F LDCONST R7 K14 + 0x581C000D, // 026F LDCONST R7 K13 0xAC1C0200, // 0270 CATCH R7 1 0 0xB0080000, // 0271 RAISE 2 R0 R0 0x4C1C0000, // 0272 LDNIL R7 0x201C0C07, // 0273 NE R7 R6 R7 0x781E0006, // 0274 JMPF R7 #027C - 0x881C0114, // 0275 GETMBR R7 R0 K20 - 0x8C1C0F57, // 0276 GETMET R7 R7 K87 + 0x881C0113, // 0275 GETMBR R7 R0 K19 + 0x8C1C0F56, // 0276 GETMET R7 R7 K86 0x5C240C00, // 0277 MOVE R9 R6 0x7C1C0400, // 0278 CALL R7 2 - 0x8C1C031B, // 0279 GETMET R7 R1 K27 - 0x58240032, // 027A LDCONST R9 K50 + 0x8C1C031A, // 0279 GETMET R7 R1 K26 + 0x58240031, // 027A LDCONST R9 K49 0x7C1C0400, // 027B CALL R7 2 0x78160011, // 027C JMPF R5 #028F - 0x8C180358, // 027D GETMET R6 R1 K88 - 0x58200059, // 027E LDCONST R8 K89 + 0x8C180357, // 027D GETMET R6 R1 K87 + 0x58200058, // 027E LDCONST R8 K88 0x7C180400, // 027F CALL R6 2 - 0x8C18035A, // 0280 GETMET R6 R1 K90 + 0x8C180359, // 0280 GETMET R6 R1 K89 0x7C180200, // 0281 CALL R6 1 - 0x8C18035B, // 0282 GETMET R6 R1 K91 - 0x8C20050A, // 0283 GETMET R8 R2 K10 - 0x5828005C, // 0284 LDCONST R10 K92 - 0x8C2C035D, // 0285 GETMET R11 R1 K93 - 0x5C340A00, // 0286 MOVE R13 R5 - 0x7C2C0400, // 0287 CALL R11 2 - 0x7C200600, // 0288 CALL R8 3 + 0x8C18035A, // 0282 GETMET R6 R1 K90 + 0x60200018, // 0283 GETGBL R8 G24 + 0x5824005B, // 0284 LDCONST R9 K91 + 0x8C28035C, // 0285 GETMET R10 R1 K92 + 0x5C300A00, // 0286 MOVE R12 R5 + 0x7C280400, // 0287 CALL R10 2 + 0x7C200400, // 0288 CALL R8 2 0x7C180400, // 0289 CALL R6 2 - 0x8C18035E, // 028A GETMET R6 R1 K94 - 0x8820035F, // 028B GETMBR R8 R1 K95 + 0x8C18035D, // 028A GETMET R6 R1 K93 + 0x8820035E, // 028B GETMBR R8 R1 K94 0x7C180400, // 028C CALL R6 2 - 0x8C180360, // 028D GETMET R6 R1 K96 + 0x8C18035F, // 028D GETMET R6 R1 K95 0x7C180200, // 028E CALL R6 1 0xA8040001, // 028F EXBLK 1 1 0x7002001D, // 0290 JMP #02AF @@ -2941,29 +2922,29 @@ be_local_closure(Matter_UI_page_part_ctl, /* name */ 0x7002001A, // 0292 JMP #02AE 0xB8221000, // 0293 GETNGBL R8 K8 0x8C201109, // 0294 GETMET R8 R8 K9 - 0x8C28050A, // 0295 GETMET R10 R2 K10 - 0x58300061, // 0296 LDCONST R12 K97 - 0x5C340C00, // 0297 MOVE R13 R6 - 0x5C380E00, // 0298 MOVE R14 R7 - 0x7C280800, // 0299 CALL R10 4 - 0x582C0062, // 029A LDCONST R11 K98 + 0x60280018, // 0295 GETGBL R10 G24 + 0x582C0060, // 0296 LDCONST R11 K96 + 0x5C300C00, // 0297 MOVE R12 R6 + 0x5C340E00, // 0298 MOVE R13 R7 + 0x7C280600, // 0299 CALL R10 3 + 0x582C0061, // 029A LDCONST R11 K97 0x7C200600, // 029B CALL R8 3 - 0x8C200358, // 029C GETMET R8 R1 K88 - 0x58280059, // 029D LDCONST R10 K89 + 0x8C200357, // 029C GETMET R8 R1 K87 + 0x58280058, // 029D LDCONST R10 K88 0x7C200400, // 029E CALL R8 2 - 0x8C20035A, // 029F GETMET R8 R1 K90 + 0x8C200359, // 029F GETMET R8 R1 K89 0x7C200200, // 02A0 CALL R8 1 - 0x8C20035B, // 02A1 GETMET R8 R1 K91 - 0x8C28050A, // 02A2 GETMET R10 R2 K10 - 0x58300063, // 02A3 LDCONST R12 K99 - 0x5C340C00, // 02A4 MOVE R13 R6 - 0x5C380E00, // 02A5 MOVE R14 R7 - 0x7C280800, // 02A6 CALL R10 4 + 0x8C20035A, // 02A1 GETMET R8 R1 K90 + 0x60280018, // 02A2 GETGBL R10 G24 + 0x582C0062, // 02A3 LDCONST R11 K98 + 0x5C300C00, // 02A4 MOVE R12 R6 + 0x5C340E00, // 02A5 MOVE R13 R7 + 0x7C280600, // 02A6 CALL R10 3 0x7C200400, // 02A7 CALL R8 2 - 0x8C20035E, // 02A8 GETMET R8 R1 K94 - 0x8828035F, // 02A9 GETMBR R10 R1 K95 + 0x8C20035D, // 02A8 GETMET R8 R1 K93 + 0x8828035E, // 02A9 GETMBR R10 R1 K94 0x7C200400, // 02AA CALL R8 2 - 0x8C200360, // 02AB GETMET R8 R1 K96 + 0x8C20035F, // 02AB GETMET R8 R1 K95 0x7C200200, // 02AC CALL R8 1 0x70020000, // 02AD JMP #02AF 0xB0080000, // 02AE RAISE 2 R0 R0 diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_inspect.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_inspect.h index ffd15d643..65b17a3ec 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_inspect.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_inspect.h @@ -110,7 +110,7 @@ be_local_closure(matter_jitter, /* name */ ********************************************************************/ be_local_closure(matter_inspect, /* name */ be_nested_proto( - 16, /* nstack */ + 14, /* nstack */ 1, /* argc */ 0, /* varg */ 0, /* has upvals */ @@ -118,113 +118,110 @@ be_local_closure(matter_inspect, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[17]) { /* constants */ - /* K0 */ be_nested_str_weak(string), - /* K1 */ be_nested_str_weak(introspect), - /* K2 */ be_nested_str_weak(members), - /* K3 */ be_nested_str_weak(get), - /* K4 */ be_nested_str_weak(function), - /* K5 */ be_nested_str_weak(push), - /* K6 */ be_nested_str_weak(stop_iteration), - /* K7 */ be_nested_str_weak(matter), - /* K8 */ be_nested_str_weak(sort), - /* K9 */ be_nested_str_weak(format), - /* K10 */ be_nested_str_weak(_X27_X25s_X27_X3A_X20_X25s), - /* K11 */ be_nested_str_weak(_X7B), - /* K12 */ be_nested_str_weak(concat), - /* K13 */ be_nested_str_weak(_X2C_X20), - /* K14 */ be_nested_str_weak(_X7D), - /* K15 */ be_nested_str_weak(Exception_X3A), - /* K16 */ be_nested_str_weak(_X7C), + ( &(const bvalue[15]) { /* constants */ + /* K0 */ be_nested_str_weak(introspect), + /* K1 */ be_nested_str_weak(members), + /* K2 */ be_nested_str_weak(get), + /* K3 */ be_nested_str_weak(function), + /* K4 */ be_nested_str_weak(push), + /* K5 */ be_nested_str_weak(stop_iteration), + /* K6 */ be_nested_str_weak(matter), + /* K7 */ be_nested_str_weak(sort), + /* K8 */ be_nested_str_weak(_X27_X25s_X27_X3A_X20_X25s), + /* K9 */ be_nested_str_weak(_X7B), + /* K10 */ be_nested_str_weak(concat), + /* K11 */ be_nested_str_weak(_X2C_X20), + /* K12 */ be_nested_str_weak(_X7D), + /* K13 */ be_nested_str_weak(Exception_X3A), + /* K14 */ be_nested_str_weak(_X7C), }), be_str_weak(inspect), &be_const_str_solidified, - ( &(const binstruction[85]) { /* code */ - 0xA8020044, // 0000 EXBLK 0 #0046 + ( &(const binstruction[84]) { /* code */ + 0xA8020043, // 0000 EXBLK 0 #0045 0xA4060000, // 0001 IMPORT R1 K0 - 0xA40A0200, // 0002 IMPORT R2 K1 - 0x600C0012, // 0003 GETGBL R3 G18 - 0x7C0C0000, // 0004 CALL R3 0 - 0x60100010, // 0005 GETGBL R4 G16 - 0x8C140502, // 0006 GETMET R5 R2 K2 - 0x5C1C0000, // 0007 MOVE R7 R0 - 0x7C140400, // 0008 CALL R5 2 - 0x7C100200, // 0009 CALL R4 1 - 0xA802000E, // 000A EXBLK 0 #001A - 0x5C140800, // 000B MOVE R5 R4 - 0x7C140000, // 000C CALL R5 0 - 0x8C180503, // 000D GETMET R6 R2 K3 - 0x5C200000, // 000E MOVE R8 R0 - 0x5C240A00, // 000F MOVE R9 R5 - 0x7C180600, // 0010 CALL R6 3 - 0x601C0004, // 0011 GETGBL R7 G4 - 0x5C200C00, // 0012 MOVE R8 R6 - 0x7C1C0200, // 0013 CALL R7 1 - 0x201C0F04, // 0014 NE R7 R7 K4 - 0x781E0002, // 0015 JMPF R7 #0019 - 0x8C1C0705, // 0016 GETMET R7 R3 K5 - 0x5C240A00, // 0017 MOVE R9 R5 - 0x7C1C0400, // 0018 CALL R7 2 - 0x7001FFF0, // 0019 JMP #000B - 0x58100006, // 001A LDCONST R4 K6 - 0xAC100200, // 001B CATCH R4 1 0 - 0xB0080000, // 001C RAISE 2 R0 R0 - 0xB8120E00, // 001D GETNGBL R4 K7 - 0x8C100908, // 001E GETMET R4 R4 K8 - 0x5C180600, // 001F MOVE R6 R3 - 0x7C100400, // 0020 CALL R4 2 - 0x5C0C0800, // 0021 MOVE R3 R4 - 0x60100012, // 0022 GETGBL R4 G18 - 0x7C100000, // 0023 CALL R4 0 - 0x60140010, // 0024 GETGBL R5 G16 - 0x5C180600, // 0025 MOVE R6 R3 - 0x7C140200, // 0026 CALL R5 1 - 0xA8020011, // 0027 EXBLK 0 #003A - 0x5C180A00, // 0028 MOVE R6 R5 - 0x7C180000, // 0029 CALL R6 0 - 0x8C1C0503, // 002A GETMET R7 R2 K3 - 0x5C240000, // 002B MOVE R9 R0 - 0x5C280C00, // 002C MOVE R10 R6 - 0x7C1C0600, // 002D CALL R7 3 - 0x8C200905, // 002E GETMET R8 R4 K5 - 0x8C280309, // 002F GETMET R10 R1 K9 - 0x5830000A, // 0030 LDCONST R12 K10 - 0x60340008, // 0031 GETGBL R13 G8 - 0x5C380C00, // 0032 MOVE R14 R6 - 0x7C340200, // 0033 CALL R13 1 - 0x60380008, // 0034 GETGBL R14 G8 - 0x5C3C0E00, // 0035 MOVE R15 R7 - 0x7C380200, // 0036 CALL R14 1 - 0x7C280800, // 0037 CALL R10 4 - 0x7C200400, // 0038 CALL R8 2 - 0x7001FFED, // 0039 JMP #0028 - 0x58140006, // 003A LDCONST R5 K6 - 0xAC140200, // 003B CATCH R5 1 0 - 0xB0080000, // 003C RAISE 2 R0 R0 - 0x8C14090C, // 003D GETMET R5 R4 K12 - 0x581C000D, // 003E LDCONST R7 K13 - 0x7C140400, // 003F CALL R5 2 - 0x00161605, // 0040 ADD R5 K11 R5 - 0x00140B0E, // 0041 ADD R5 R5 K14 - 0xA8040001, // 0042 EXBLK 1 1 - 0x80040A00, // 0043 RET 1 R5 - 0xA8040001, // 0044 EXBLK 1 1 - 0x7002000D, // 0045 JMP #0054 - 0xAC040002, // 0046 CATCH R1 0 2 - 0x7002000A, // 0047 JMP #0053 - 0x600C0008, // 0048 GETGBL R3 G8 - 0x5C100200, // 0049 MOVE R4 R1 - 0x7C0C0200, // 004A CALL R3 1 - 0x000E1E03, // 004B ADD R3 K15 R3 - 0x000C0710, // 004C ADD R3 R3 K16 - 0x60100008, // 004D GETGBL R4 G8 - 0x5C140400, // 004E MOVE R5 R2 - 0x7C100200, // 004F CALL R4 1 - 0x000C0604, // 0050 ADD R3 R3 R4 - 0x80040600, // 0051 RET 1 R3 - 0x70020000, // 0052 JMP #0054 - 0xB0080000, // 0053 RAISE 2 R0 R0 - 0x80000000, // 0054 RET 0 + 0x60080012, // 0002 GETGBL R2 G18 + 0x7C080000, // 0003 CALL R2 0 + 0x600C0010, // 0004 GETGBL R3 G16 + 0x8C100301, // 0005 GETMET R4 R1 K1 + 0x5C180000, // 0006 MOVE R6 R0 + 0x7C100400, // 0007 CALL R4 2 + 0x7C0C0200, // 0008 CALL R3 1 + 0xA802000E, // 0009 EXBLK 0 #0019 + 0x5C100600, // 000A MOVE R4 R3 + 0x7C100000, // 000B CALL R4 0 + 0x8C140302, // 000C GETMET R5 R1 K2 + 0x5C1C0000, // 000D MOVE R7 R0 + 0x5C200800, // 000E MOVE R8 R4 + 0x7C140600, // 000F CALL R5 3 + 0x60180004, // 0010 GETGBL R6 G4 + 0x5C1C0A00, // 0011 MOVE R7 R5 + 0x7C180200, // 0012 CALL R6 1 + 0x20180D03, // 0013 NE R6 R6 K3 + 0x781A0002, // 0014 JMPF R6 #0018 + 0x8C180504, // 0015 GETMET R6 R2 K4 + 0x5C200800, // 0016 MOVE R8 R4 + 0x7C180400, // 0017 CALL R6 2 + 0x7001FFF0, // 0018 JMP #000A + 0x580C0005, // 0019 LDCONST R3 K5 + 0xAC0C0200, // 001A CATCH R3 1 0 + 0xB0080000, // 001B RAISE 2 R0 R0 + 0xB80E0C00, // 001C GETNGBL R3 K6 + 0x8C0C0707, // 001D GETMET R3 R3 K7 + 0x5C140400, // 001E MOVE R5 R2 + 0x7C0C0400, // 001F CALL R3 2 + 0x5C080600, // 0020 MOVE R2 R3 + 0x600C0012, // 0021 GETGBL R3 G18 + 0x7C0C0000, // 0022 CALL R3 0 + 0x60100010, // 0023 GETGBL R4 G16 + 0x5C140400, // 0024 MOVE R5 R2 + 0x7C100200, // 0025 CALL R4 1 + 0xA8020011, // 0026 EXBLK 0 #0039 + 0x5C140800, // 0027 MOVE R5 R4 + 0x7C140000, // 0028 CALL R5 0 + 0x8C180302, // 0029 GETMET R6 R1 K2 + 0x5C200000, // 002A MOVE R8 R0 + 0x5C240A00, // 002B MOVE R9 R5 + 0x7C180600, // 002C CALL R6 3 + 0x8C1C0704, // 002D GETMET R7 R3 K4 + 0x60240018, // 002E GETGBL R9 G24 + 0x58280008, // 002F LDCONST R10 K8 + 0x602C0008, // 0030 GETGBL R11 G8 + 0x5C300A00, // 0031 MOVE R12 R5 + 0x7C2C0200, // 0032 CALL R11 1 + 0x60300008, // 0033 GETGBL R12 G8 + 0x5C340C00, // 0034 MOVE R13 R6 + 0x7C300200, // 0035 CALL R12 1 + 0x7C240600, // 0036 CALL R9 3 + 0x7C1C0400, // 0037 CALL R7 2 + 0x7001FFED, // 0038 JMP #0027 + 0x58100005, // 0039 LDCONST R4 K5 + 0xAC100200, // 003A CATCH R4 1 0 + 0xB0080000, // 003B RAISE 2 R0 R0 + 0x8C10070A, // 003C GETMET R4 R3 K10 + 0x5818000B, // 003D LDCONST R6 K11 + 0x7C100400, // 003E CALL R4 2 + 0x00121204, // 003F ADD R4 K9 R4 + 0x0010090C, // 0040 ADD R4 R4 K12 + 0xA8040001, // 0041 EXBLK 1 1 + 0x80040800, // 0042 RET 1 R4 + 0xA8040001, // 0043 EXBLK 1 1 + 0x7002000D, // 0044 JMP #0053 + 0xAC040002, // 0045 CATCH R1 0 2 + 0x7002000A, // 0046 JMP #0052 + 0x600C0008, // 0047 GETGBL R3 G8 + 0x5C100200, // 0048 MOVE R4 R1 + 0x7C0C0200, // 0049 CALL R3 1 + 0x000E1A03, // 004A ADD R3 K13 R3 + 0x000C070E, // 004B ADD R3 R3 K14 + 0x60100008, // 004C GETGBL R4 G8 + 0x5C140400, // 004D MOVE R5 R2 + 0x7C100200, // 004E CALL R4 1 + 0x000C0604, // 004F ADD R3 R3 R4 + 0x80040600, // 0050 RET 1 R3 + 0x70020000, // 0051 JMP #0053 + 0xB0080000, // 0052 RAISE 2 R0 R0 + 0x80000000, // 0053 RET 0 }) ) ); From 36de0079096691f7251cccf07b1145925822b0ca Mon Sep 17 00:00:00 2001 From: s-hadinger <49731213+s-hadinger@users.noreply.github.com> Date: Fri, 23 Jun 2023 18:33:31 +0200 Subject: [PATCH 282/289] Berry replace `string.format`with `format` (#18945) * Berry replace `string.format`with `format` * remove import.string --- .../berry_matter/tools/vendor_to_c.be | 2 +- lib/libesp32/berry_tasmota/solidify_all.be | 2 +- .../src/embedded/autoconf_module.be | 43 +- .../berry_tasmota/src/embedded/hue_bridge.be | 1 - .../berry_tasmota/src/embedded/i2c_axp192.be | 6 +- .../berry_tasmota/src/embedded/i2c_axp202.be | 6 +- .../src/embedded/lv_tasmota_widgets.be | 3 +- .../berry_tasmota/src/embedded/mqtt.be | 3 +- .../src/embedded/partition_core.be | 29 +- .../berry_tasmota/src/embedded/tapp.be | 2 +- .../src/embedded/tasmota_class.be | 21 +- .../src/embedded/trigger_class.be | 3 +- .../berry_tasmota/src/embedded/uuid.be | 3 +- .../berry_tasmota/src/embedded/zigbee.be | 3 +- .../src/embedded/zigbee_zb_coord.be | 5 +- .../src/embedded/zigbee_zcl_attribute.be | 32 +- .../src/embedded/zigbee_zcl_frame.be | 3 +- .../src/solidify/solidified_autoconf_module.h | 1053 ++++++++--------- .../src/solidify/solidified_hue_bridge.h | 102 +- .../src/solidify/solidified_i2c_axp192.h | 134 +-- .../src/solidify/solidified_i2c_axp202.h | 2 +- .../solidify/solidified_lv_tasmota_widgets.h | 77 +- .../src/solidify/solidified_mqtt.h | 29 +- .../src/solidify/solidified_partition_core.h | 541 ++++----- .../src/solidify/solidified_tapp.h | 31 +- .../src/solidify/solidified_tasmota_class.h | 478 ++++---- .../src/solidify/solidified_trigger_class.h | 53 +- .../src/solidify/solidified_uuid.h | 71 +- .../src/solidify/solidified_zigbee.h | 65 +- .../src/solidify/solidified_zigbee_zb_coord.h | 157 ++- .../solidified_zigbee_zcl_attribute.h | 632 +++++----- .../solidify/solidified_zigbee_zcl_frame.h | 45 +- .../lv_binding_berry/solidify_all.be | 2 +- tasmota/berry/artnet/artnet.be | 3 +- tasmota/berry/artnet/artnet_ui.be | 46 +- tasmota/berry/drivers/CHSC6540.be | 3 +- tasmota/berry/drivers/MPU6886_9250.be | 6 +- tasmota/berry/drivers/Shift595.be | 1 - tasmota/berry/drivers/tm1637.be | 2 +- tasmota/berry/examples/web_button_demo.be | 3 +- .../haspmota_src/haspmota_core/haspmota.be | 35 +- tasmota/berry/lvgl_examples/widget_test.be | 31 +- tasmota/berry/modules/bootloader.be | 3 +- tasmota/berry/modules/partition.be | 70 +- tasmota/berry/modules/partition_wizard.be | 71 +- .../modules/ts_calibrate/ts_calibrate.be | 10 +- tasmota/berry/zigbee/cc2652_flasher.be | 15 +- tasmota/berry/zigbee/intelhex.be | 3 +- tasmota/berry/zigbee/sonoff_zb_pro_flasher.be | 10 +- tasmota/berry/zigbee/tubezb_cc2652_flasher.be | 10 +- .../xdrv_52_3_berry_crypto.ino | 3 +- 51 files changed, 1888 insertions(+), 2076 deletions(-) diff --git a/lib/libesp32/berry_matter/tools/vendor_to_c.be b/lib/libesp32/berry_matter/tools/vendor_to_c.be index bff47fb42..924f7e9f9 100644 --- a/lib/libesp32/berry_matter/tools/vendor_to_c.be +++ b/lib/libesp32/berry_matter/tools/vendor_to_c.be @@ -8,7 +8,7 @@ f.close() for elt: j["vendorInfo"] - print(string.format(' { 0x%04X, "%s"},', elt['vendorID'], elt['vendorName'])) + print(format(' { 0x%04X, "%s"},', elt['vendorID'], elt['vendorName'])) end diff --git a/lib/libesp32/berry_tasmota/solidify_all.be b/lib/libesp32/berry_tasmota/solidify_all.be index 8f2575595..bf2ebfc6a 100755 --- a/lib/libesp32/berry_tasmota/solidify_all.be +++ b/lib/libesp32/berry_tasmota/solidify_all.be @@ -46,7 +46,7 @@ def parse_file(fname, prefix_out) # output solidified var fname_h = string.split(fname, '.be')[0] + '.h' # take whatever is before the first '.be' var fout = open(prefix_out + "solidified_" + fname_h, "w") - fout.write(string.format("/* Solidification of %s */\n", fname_h)) + fout.write(format("/* Solidification of %s */\n", fname_h)) fout.write("/********************************************************************\\\n") fout.write("* Generated code, don't edit *\n") fout.write("\\********************************************************************/\n") diff --git a/lib/libesp32/berry_tasmota/src/embedded/autoconf_module.be b/lib/libesp32/berry_tasmota/src/embedded/autoconf_module.be index 42d573306..9620d358a 100644 --- a/lib/libesp32/berry_tasmota/src/embedded/autoconf_module.be +++ b/lib/libesp32/berry_tasmota/src/embedded/autoconf_module.be @@ -23,7 +23,7 @@ autoconf_module.init = def (m) if string.find(dir[i], ".autoconf") > 0 # does the file contain '*.autoconf', >0 to skip `.autoconf` if entry != nil # we have multiple configuration files, not allowed - tasmota.log(string.format("CFG: multiple autoconf files found, aborting ('%s' + '%s')", entry, dir[i]), 2) + tasmota.log(format("CFG: multiple autoconf files found, aborting ('%s' + '%s')", entry, dir[i]), 2) self._error = true return nil end @@ -88,24 +88,23 @@ autoconf_module.init = def (m) # Load templates from Github ##################################################################################################### def load_templates() - import string import json try - var url = string.format("https://raw.githubusercontent.com/tasmota/autoconf/main/%s_manifest.json", tasmota.arch()) - tasmota.log(string.format("CFG: loading '%s'", url), 3) + var url = format("https://raw.githubusercontent.com/tasmota/autoconf/main/%s_manifest.json", tasmota.arch()) + tasmota.log(format("CFG: loading '%s'", url), 3) # load the template var cl = webclient() cl.begin(url) var r = cl.GET() if r != 200 - tasmota.log(string.format("CFG: return_code=%i", r), 2) + tasmota.log(format("CFG: return_code=%i", r), 2) return nil end var s = cl.get_string() cl.close() # convert to json var j = json.load(s) - tasmota.log(string.format("CFG: loaded '%s'", str(j)), 3) + tasmota.log(format("CFG: loaded '%s'", str(j)), 3) var t = j.find("files") if isinstance(t, list) @@ -114,7 +113,7 @@ autoconf_module.init = def (m) return nil except .. as e, m - tasmota.log(string.format("CFG: exception '%s' - '%s'", e, m), 2) + tasmota.log(format("CFG: exception '%s' - '%s'", e, m), 2) return nil end end @@ -143,8 +142,8 @@ autoconf_module.init = def (m) var cur_module_display = cur_module ? string.tr(self.get_current_module_name(), "_", " ") : self._error ? "<Error: apply new or remove>" : "<None>" webserver.content_send("
    ") - webserver.content_send(string.format(" Current auto-configuration")) - webserver.content_send(string.format("

    Current configuration:

    %s

    ", cur_module_display)) + webserver.content_send(format(" Current auto-configuration")) + webserver.content_send(format("

    Current configuration:

    %s

    ", cur_module_display)) if cur_module # add button to reapply template @@ -156,7 +155,7 @@ autoconf_module.init = def (m) webserver.content_send("

    ") webserver.content_send("
    ") - webserver.content_send(string.format(" Select new auto-configuration")) + webserver.content_send(format(" Select new auto-configuration")) webserver.content_send("

    ") @@ -166,13 +165,13 @@ autoconf_module.init = def (m) var templates = self.load_templates() webserver.content_send("") for t:templates - webserver.content_send(string.format("", t, string.tr(t, "_", " "))) + webserver.content_send(format("", t, string.tr(t, "_", " "))) end webserver.content_send("

    ") webserver.content_send("") - # webserver.content_send(string.format("", ota_num)) + # webserver.content_send(format("", ota_num)) webserver.content_send("

    ") @@ -189,7 +188,6 @@ autoconf_module.init = def (m) # This HTTP POST manager handles the submitted web form data def page_autoconf_ctl() import webserver - import string import path if !webserver.check_privileged_access() return nil end @@ -211,16 +209,16 @@ autoconf_module.init = def (m) var arch_name = webserver.arg("zip") if arch_name != "reset" - var url = string.format("https://raw.githubusercontent.com/tasmota/autoconf/main/%s/%s.autoconf", tasmota.arch(), arch_name) - tasmota.log(string.format("CFG: downloading '%s'", url), 2); + var url = format("https://raw.githubusercontent.com/tasmota/autoconf/main/%s/%s.autoconf", tasmota.arch(), arch_name) + tasmota.log(format("CFG: downloading '%s'", url), 2); - var local_file = string.format("%s.autoconf", arch_name) + var local_file = format("%s.autoconf", arch_name) # download file and write directly to file system var cl = webclient() cl.begin(url) var r = cl.GET() - if r != 200 raise "connection_error", string.format("return code=%i", r) end + if r != 200 raise "connection_error", format("return code=%i", r) end cl.write_file(local_file) cl.close() end @@ -234,12 +232,12 @@ autoconf_module.init = def (m) raise "value_error", "Unknown command" end except .. as e, m - print(string.format("CFG: Exception> '%s' - %s", e, m)) + print(format("CFG: Exception> '%s' - %s", e, m)) #- display error page -# webserver.content_start("Parameter error") #- title of the web page -# webserver.content_send_style() #- send standard Tasmota styles -# - webserver.content_send(string.format("

    Exception:
    '%s'
    %s

    ", e, m)) + webserver.content_send(format("

    Exception:
    '%s'
    %s

    ", e, m)) webserver.content_button(webserver.BUTTON_CONFIGURATION) #- button back to management page -# webserver.content_stop() #- end of web page -# @@ -268,7 +266,7 @@ autoconf_module.init = def (m) var fname = dir[i] if string.find(fname, ".autoconf") > 0 # does the file contain '*.autoconf' path.remove(fname) - print(string.format("CFG: removed file '%s'", fname)) + print(format("CFG: removed file '%s'", fname)) end i += 1 end @@ -300,7 +298,6 @@ autoconf_module.init = def (m) # load and run `.bat` file as Tasmota commands ##################################################################################################### def run_bat(fname) # read a '*.bat' file and run each command - import string var f try f = open(fname, "r") # open file in read-only mode, it is expected to exist @@ -315,7 +312,7 @@ autoconf_module.init = def (m) end f.close() # close, we don't expect exception with read-only, could be added later though except .. as e, m - tasmota.log(string.format('CFG: could not run %s (%s - %s)', fname, e, m), 1) + tasmota.log(format('CFG: could not run %s (%s - %s)', fname, e, m), 1) if f != nil f.close() end end end @@ -368,7 +365,7 @@ autoconf_module.init = def (m) reboot = true tasmota.log("CFG: 'display.ini' extracted, restarting", 2) except .. as e, m - print(string.format("CFG: could not copy 'display.ini' (%s - %s)'", e, m)) + print(format("CFG: could not copy 'display.ini' (%s - %s)'", e, m)) if f != nil f.close() end if f_out != nil f_out.close() end end diff --git a/lib/libesp32/berry_tasmota/src/embedded/hue_bridge.be b/lib/libesp32/berry_tasmota/src/embedded/hue_bridge.be index 740fd169d..a950c8570 100644 --- a/lib/libesp32/berry_tasmota/src/embedded/hue_bridge.be +++ b/lib/libesp32/berry_tasmota/src/embedded/hue_bridge.be @@ -60,7 +60,6 @@ hue_bridge.init = def (m) def discover() import hue_ntv import json - import string var fragments = [] # store json elements for id: self.lights.keys() diff --git a/lib/libesp32/berry_tasmota/src/embedded/i2c_axp192.be b/lib/libesp32/berry_tasmota/src/embedded/i2c_axp192.be index 82550b46d..56ce22147 100644 --- a/lib/libesp32/berry_tasmota/src/embedded/i2c_axp192.be +++ b/lib/libesp32/berry_tasmota/src/embedded/i2c_axp192.be @@ -159,8 +159,7 @@ class AXP192 : I2C_Driver #- display sensor value in the web UI -# def web_sensor() if !self.wire return nil end #- exit if not initialized -# - import string - var msg = string.format( + var msg = format( "{s}VBus Voltage{m}%.3f V{e}".. "{s}VBus Current{m}%.1f mA{e}".. "{s}Batt Voltage{m}%.3f V{e}".. @@ -178,8 +177,7 @@ class AXP192 : I2C_Driver #- add sensor value to teleperiod -# def json_append() if !self.wire return nil end #- exit if not initialized -# - import string - var msg = string.format(",\"AXP192\":{\"VBusVoltage\":%.3f,\"VBusCurrent\":%.1f,\"BattVoltage\":%.3f,\"BattCurrent\":%.1f,\"Temperature\":%.1f}", + var msg = format(",\"AXP192\":{\"VBusVoltage\":%.3f,\"VBusCurrent\":%.1f,\"BattVoltage\":%.3f,\"BattCurrent\":%.1f,\"Temperature\":%.1f}", self.get_vbus_voltage(), self.get_vbus_voltage(), self.get_bat_voltage(), self.get_bat_current(), #self.get_bat_power(), diff --git a/lib/libesp32/berry_tasmota/src/embedded/i2c_axp202.be b/lib/libesp32/berry_tasmota/src/embedded/i2c_axp202.be index eee7f2bac..e6b6f6d80 100644 --- a/lib/libesp32/berry_tasmota/src/embedded/i2c_axp202.be +++ b/lib/libesp32/berry_tasmota/src/embedded/i2c_axp202.be @@ -163,8 +163,7 @@ class AXP202 : I2C_Driver # #- display sensor value in the web UI -# # def web_sensor() # if !self.wire return nil end #- exit if not initialized -# -# import string -# var msg = string.format( +# var msg = format( # "{s}VBus Voltage{m}%.3f V{e}".. # "{s}VBus Current{m}%.1f mA{e}".. # "{s}Batt Voltage{m}%.3f V{e}".. @@ -182,11 +181,10 @@ class AXP202 : I2C_Driver # #- add sensor value to teleperiod -# # def json_append() # if !self.wire return nil end #- exit if not initialized -# -# # import string # # var ax = int(self.accel[0] * 1000) # # var ay = int(self.accel[1] * 1000) # # var az = int(self.accel[2] * 1000) -# # var msg = string.format(",\"MPU6886\":{\"AX\":%i,\"AY\":%i,\"AZ\":%i,\"GX\":%i,\"GY\":%i,\"GZ\":%i}", +# # var msg = format(",\"MPU6886\":{\"AX\":%i,\"AY\":%i,\"AZ\":%i,\"GX\":%i,\"GY\":%i,\"GZ\":%i}", # # ax, ay, az, self.gyro[0], self.gyro[1], self.gyro[2]) # # tasmota.response_append(msg) # end diff --git a/lib/libesp32/berry_tasmota/src/embedded/lv_tasmota_widgets.be b/lib/libesp32/berry_tasmota/src/embedded/lv_tasmota_widgets.be index d4bd2d51e..7c65815e5 100644 --- a/lib/libesp32/berry_tasmota/src/embedded/lv_tasmota_widgets.be +++ b/lib/libesp32/berry_tasmota/src/embedded/lv_tasmota_widgets.be @@ -37,9 +37,8 @@ class lv_clock: lv_label end def set_time(hour, minute, sec) - import string if hour != self.hour || minute != self.minute || sec != self.sec - var txt = string.format("%02d%s%02d", hour, sec % 2 ? ":" : " ", minute) + var txt = format("%02d%s%02d", hour, sec % 2 ? ":" : " ", minute) self.hour = hour self.minute = minute self.sec = sec diff --git a/lib/libesp32/berry_tasmota/src/embedded/mqtt.be b/lib/libesp32/berry_tasmota/src/embedded/mqtt.be index 07d42e86f..5d64ff8b0 100644 --- a/lib/libesp32/berry_tasmota/src/embedded/mqtt.be +++ b/lib/libesp32/berry_tasmota/src/embedded/mqtt.be @@ -46,8 +46,7 @@ class MQTT : MQTT_ntv end def tostring() - import string - return string.format("", classname(self), self.fulltopic) + return format("", classname(self), self.fulltopic) end def mqtt_data(topic, idx, payload_s, payload_b) diff --git a/lib/libesp32/berry_tasmota/src/embedded/partition_core.be b/lib/libesp32/berry_tasmota/src/embedded/partition_core.be index b80f23ca7..abf48e813 100644 --- a/lib/libesp32/berry_tasmota/src/embedded/partition_core.be +++ b/lib/libesp32/berry_tasmota/src/embedded/partition_core.be @@ -76,8 +76,7 @@ class Partition_info # elif magic == 0xEBEB #- MD5 -# else - import string - raise "internal_error", string.format("invalid magic number %02X", magic) + raise "internal_error", format("invalid magic number %02X", magic) end end @@ -121,11 +120,11 @@ class Partition_info var seg_num = 0 while seg_num < seg_count - # print(string.format("Reading 0x%08X", seg_offset)) + # print(format("Reading 0x%08X", seg_offset)) var segment_header = flash.read(seg_offset - 8, 8) var seg_start_addr = segment_header.get(0, 4) var seg_size = segment_header.get(4,4) - # print(string.format("Segment %i: flash_offset=0x%08X start_addr=0x%08X sz=0x%08X", seg_num, seg_offset, seg_start_addr, seg_size)) + # print(format("Segment %i: flash_offset=0x%08X start_addr=0x%08X sz=0x%08X", seg_num, seg_offset, seg_start_addr, seg_size)) seg_offset += seg_size + 8 # add segment_length + sizeof(esp_image_segment_header_t) if seg_offset >= (addr + sz) return -1 end @@ -134,7 +133,7 @@ class Partition_info end var total_size = seg_offset - addr + 1 # add 1KB for safety - # print(string.format("Total size = %i KB", total_size/1024)) + # print(format("Total size = %i KB", total_size/1024)) return total_size except .. as e, m @@ -147,8 +146,7 @@ class Partition_info if self.type == 0 return "app" elif self.type == 1 return "data" end - import string - return string.format("0x%02X", self.type) + return format("0x%02X", self.type) end def subtype_to_string() @@ -169,22 +167,20 @@ class Partition_info elif self.subtype == 0x82 return "spiffs" end end - import string - return string.format("0x%02X", self.subtype) + return format("0x%02X", self.subtype) end # Human readable version of Partition information # this method is not included in the solidified version to save space, # it is included only in the optional application `tapp` version def tostring() - import string var type_s = self.type_to_string() var subtype_s = self.subtype_to_string() # reformat strings if type_s != "" type_s = " (" + type_s + ")" end if subtype_s != "" subtype_s = " (" + subtype_s + ")" end - return string.format("", + return format("", self.type, type_s, self.subtype, subtype_s, self.start, self.sz, @@ -361,8 +357,7 @@ class Partition_otadata # Produce a human-readable representation of the object with relevant information def tostring() - import string - return string.format("", + return format("", self.active_otadata >= 0 ? "ota_" + str(self.active_otadata) : "factory", self.seq0, self.seq1, self.maxota) end @@ -552,7 +547,6 @@ class Partition var flash_definition_sector = self.get_flash_definition_sector() if (flash_size_k != flash_size_real_k) && flash_definition_sector != nil import flash - import string flash_size_k = flash_size_real_k # try to expand the flash size definition @@ -576,7 +570,7 @@ class Partition var old_def = flash_def[3] flash_def[3] = (flash_def[3] & 0x0F) | flash_size_code flash.write(flash_definition_sector, flash_def) - tasmota.log(string.format("UPL: changing flash definition from 0x02X to 0x%02X", old_def, flash_def[3]), 3) + tasmota.log(format("UPL: changing flash definition from 0x02X to 0x%02X", old_def, flash_def[3]), 3) else raise "internal_error", "wrong flash size "+str(flash_size_real_m) end @@ -586,12 +580,11 @@ class Partition # Called at first boot # Try to expand FS to max of flash size def resize_fs_to_max() - import string try var unallocated = self.get_unallocated_k() if unallocated <= 0 return nil end - tasmota.log(string.format("BRY: Trying to expand FS by %i kB", unallocated), 2) + tasmota.log(format("BRY: Trying to expand FS by %i kB", unallocated), 2) self.resize_max_flash_size_k() # resize if needed # since unallocated succeeded, we know the last slot is FS @@ -604,7 +597,7 @@ class Partition tasmota.global.restart_flag = 2 tasmota.log("BRY: Successfully resized FS, restarting", 2) except .. as e, m - tasmota.log(string.format("BRY: Exception> '%s' - %s", e, m), 2) + tasmota.log(format("BRY: Exception> '%s' - %s", e, m), 2) end end diff --git a/lib/libesp32/berry_tasmota/src/embedded/tapp.be b/lib/libesp32/berry_tasmota/src/embedded/tapp.be index a107f50f6..095d9ff2c 100644 --- a/lib/libesp32/berry_tasmota/src/embedded/tapp.be +++ b/lib/libesp32/berry_tasmota/src/embedded/tapp.be @@ -20,7 +20,7 @@ tapp_module.init = def (m) for d: dir if string.find(d, ".tapp") > 0 - tasmota.log(string.format("TAP: Loaded Tasmota App '%s'", d), 2) + tasmota.log(format("TAP: Loaded Tasmota App '%s'", d), 2) tasmota.load(d + "#autoexec.be") end end diff --git a/lib/libesp32/berry_tasmota/src/embedded/tasmota_class.be b/lib/libesp32/berry_tasmota/src/embedded/tasmota_class.be index a119f9973..a9bad3416 100644 --- a/lib/libesp32/berry_tasmota/src/embedded/tasmota_class.be +++ b/lib/libesp32/berry_tasmota/src/embedded/tasmota_class.be @@ -336,9 +336,8 @@ class Tasmota end def time_str(time) - import string var tm = self.time_dump(time) - return string.format("%04d-%02d-%02dT%02d:%02d:%02d", tm['year'], tm['month'], tm['day'], tm['hour'], tm['min'], tm['sec']) + return format("%04d-%02d-%02dT%02d:%02d:%02d", tm['year'], tm['month'], tm['day'], tm['hour'], tm['min'], tm['sec']) end def load(f) @@ -376,8 +375,7 @@ class Tasmota f.close() except .. as e if f != nil f.close() end - import string - print(string.format('BRY: failed to load compiled \'%s\' (%s)',fname_bec,e)) + print(format('BRY: failed to load compiled \'%s\' (%s)',fname_bec,e)) end return nil end @@ -399,8 +397,7 @@ class Tasmota var compiled = compile(f_name, 'file') return compiled except .. as e, m - import string - print(string.format('BRY: failed to load \'%s\' (%s - %s)',f_name,e,m)) + print(format('BRY: failed to load \'%s\' (%s - %s)',f_name,e,m)) end return nil end @@ -413,8 +410,7 @@ class Tasmota compiled_code() return true except .. as e, m - import string - print(string.format("BRY: failed to run compiled code '%s' - %s", e, m)) + print(format("BRY: failed to run compiled code '%s' - %s", e, m)) end end return false @@ -487,10 +483,10 @@ class Tasmota var bec_version = try_get_bec_version(f_name_bec) var version_ok = true if bec_version == nil - print(string.format('BRY: corrupt bytecode \'%s\'',f_name_bec)) + print(format('BRY: corrupt bytecode \'%s\'',f_name_bec)) version_ok = false elif bec_version != 0x04 # -- this is the currenlty supported version - print(string.format('BRY: bytecode has wrong version \'%s\' (%i)',f_name_bec,bec_version)) + print(format('BRY: bytecode has wrong version \'%s\' (%i)',f_name_bec,bec_version)) version_ok = false end @@ -516,7 +512,7 @@ class Tasmota try self.save(f_name_bec, compiled_code) except .. as e - print(string.format('BRY: could not save compiled file %s (%s)',f_name_bec,e)) + print(format('BRY: could not save compiled file %s (%s)',f_name_bec,e)) end end # call the compiled code @@ -566,7 +562,6 @@ class Tasmota def event(event_type, cmd, idx, payload, raw) import introspect - import string if event_type=='every_50ms' self.run_deferred() end #- first run deferred events -# @@ -596,7 +591,7 @@ class Tasmota done = f(d, cmd, idx, payload, raw) || done if done && !keep_going break end except .. as e,m - print(string.format("BRY: Exception> '%s' - %s", e, m)) + print(format("BRY: Exception> '%s' - %s", e, m)) if self._debug_present import debug debug.traceback() diff --git a/lib/libesp32/berry_tasmota/src/embedded/trigger_class.be b/lib/libesp32/berry_tasmota/src/embedded/trigger_class.be index 83a52556a..ecdd5c111 100644 --- a/lib/libesp32/berry_tasmota/src/embedded/trigger_class.be +++ b/lib/libesp32/berry_tasmota/src/embedded/trigger_class.be @@ -20,8 +20,7 @@ class Trigger end def tostring() - import string - return string.format("", + return format("", classname(self), self.shortaddr, la.get(4,4), la.get(0,4), self.name, self.model, self.manufacturer) diff --git a/lib/libesp32/berry_tasmota/src/embedded/zigbee_zb_coord.be b/lib/libesp32/berry_tasmota/src/embedded/zigbee_zb_coord.be index 58a81ca60..f49ce273c 100644 --- a/lib/libesp32/berry_tasmota/src/embedded/zigbee_zb_coord.be +++ b/lib/libesp32/berry_tasmota/src/embedded/zigbee_zb_coord.be @@ -49,7 +49,6 @@ class zb_coord : zb_coord_ntv if self._handlers == nil return end import introspect - import string var frame var attr_list @@ -61,7 +60,7 @@ class zb_coord : zb_coord_ntv attr_list = self.zcl_attribute_list(zcl_attribute_list_ptr) end - #print(string.format(">ZIG: cmd=%s data_type=%s data=%s idx=%i", event_type, data_type, str(data), idx)) + #print(format(">ZIG: cmd=%s data_type=%s data=%s idx=%i", event_type, data_type, str(data), idx)) var i = 0 while i < size(self._handlers) @@ -71,7 +70,7 @@ class zb_coord : zb_coord_ntv try f(h, event_type, frame, attr_list, idx) except .. as e,m - print(string.format("BRY: Exception> '%s' - %s", e, m)) + print(format("BRY: Exception> '%s' - %s", e, m)) if tasmota._debug_present import debug debug.traceback() diff --git a/lib/libesp32/berry_tasmota/src/embedded/zigbee_zcl_attribute.be b/lib/libesp32/berry_tasmota/src/embedded/zigbee_zcl_attribute.be index 361826787..0d557728d 100644 --- a/lib/libesp32/berry_tasmota/src/embedded/zigbee_zcl_attribute.be +++ b/lib/libesp32/berry_tasmota/src/embedded/zigbee_zcl_attribute.be @@ -103,7 +103,6 @@ class zcl_attribute : zcl_attribute_ntv end def key_tostring() - import string var s = "" var key = self.key @@ -113,12 +112,12 @@ class zcl_attribute : zcl_attribute_ntv s += str(self.key_suffix) end elif (self.cluster != nil) && (self.attr_id != nil) - s = string.format("%04X/%04X", self.cluster, self.attr_id) + s = format("%04X/%04X", self.cluster, self.attr_id) if self.key_suffix > 1 s += "+" + str(self.key_suffix) end elif (self.cluster != nil) && (self.cmd != nil) && (self.direction != nil) - s = string.format("%04X%s%02X", self.cluster, self.direction ? "?" : "!" ,self.cmd) + s = format("%04X%s%02X", self.cluster, self.direction ? "?" : "!" ,self.cmd) if self.key_suffix > 1 s += "+" + str(self.key_suffix) end @@ -130,7 +129,6 @@ class zcl_attribute : zcl_attribute_ntv def tostring() import introspect import json - import string var s = json.dump(self.key_tostring()) s += ":" @@ -142,8 +140,8 @@ class zcl_attribute : zcl_attribute_ntv if (self.cluster != nil) && (self.attr_id != nil) && (self.key != nil) # we have an alias - var key_alias = string.format("(%s)", self.key_tostring()) - s += string.format(',%s:"%04X/%04X"', json.dump(key_alias), self.cluster, self.attr_id) + var key_alias = format("(%s)", self.key_tostring()) + s += format(',%s:"%04X/%04X"', json.dump(key_alias), self.cluster, self.attr_id) end return s @@ -200,7 +198,6 @@ class zcl_attribute_list : zcl_attribute_list_ntv end def tostring() - import string import json var items = [] @@ -208,11 +205,11 @@ class zcl_attribute_list : zcl_attribute_list_ntv # shortaddr if self.shortaddr != nil - items.push(string.format('"Device":"0x%04X"', self.shortaddr)) + items.push(format('"Device":"0x%04X"', self.shortaddr)) end # groupaddr if self.groupaddr != nil - items.push(string.format('"Group":"0x%04X"', self.groupaddr)) + items.push(format('"Group":"0x%04X"', self.groupaddr)) end # attributes @@ -226,18 +223,18 @@ class zcl_attribute_list : zcl_attribute_list_ntv # Endpoint if self.src_ep != nil - items.push(string.format('"Endpoint":%i', self.src_ep)) + items.push(format('"Endpoint":%i', self.src_ep)) end # LQI if self.lqi != nil - items.push(string.format('"LinkQuality":%i', self.lqi)) + items.push(format('"LinkQuality":%i', self.lqi)) end var s = "{" + items.concat(",") + "}" return s - # return string.format("shortaddr:0x%04X groupaddr:0x%04X %s", self.shortaddr, self.groupaddr, str(self.attr_list)) + # return format("shortaddr:0x%04X groupaddr:0x%04X %s", self.shortaddr, self.groupaddr, str(self.attr_list)) end end @@ -266,7 +263,6 @@ class zcl_attributes end def tostring() - import string import json var items = [] @@ -274,11 +270,11 @@ class zcl_attributes # shortaddr if self.shortaddr != nil - items.push(string.format('"Device":"0x%04X"', self.shortaddr)) + items.push(format('"Device":"0x%04X"', self.shortaddr)) end # groupaddr if self.shortaddr != nil - items.push(string.format('"Group":"0x%04X"', self.groupaddr)) + items.push(format('"Group":"0x%04X"', self.groupaddr)) end # attributes @@ -288,18 +284,18 @@ class zcl_attributes # Endpoint if self.src_ep != nil - items.push(string.format('"Endpoint":%i', self.src_ep)) + items.push(format('"Endpoint":%i', self.src_ep)) end # Endpoint if self.lqi != nil - items.push(string.format('"LinkQuality":%i', self.lqi)) + items.push(format('"LinkQuality":%i', self.lqi)) end var s = "{" + items.concat(",") + "}" return s - # return string.format("shortaddr:0x%04X groupaddr:0x%04X %s", self.shortaddr, self.groupaddr, str(self.attr_list)) + # return format("shortaddr:0x%04X groupaddr:0x%04X %s", self.shortaddr, self.groupaddr, str(self.attr_list)) end end diff --git a/lib/libesp32/berry_tasmota/src/embedded/zigbee_zcl_frame.be b/lib/libesp32/berry_tasmota/src/embedded/zigbee_zcl_frame.be index 044ed43f8..6b9d8e116 100644 --- a/lib/libesp32/berry_tasmota/src/embedded/zigbee_zcl_frame.be +++ b/lib/libesp32/berry_tasmota/src/embedded/zigbee_zcl_frame.be @@ -30,9 +30,8 @@ class zcl_frame : zcl_frame_ntv end def tomap() - import string var m = super(self).tomap() - m["shortaddr_hex"] = string.format("0x%04X", self.shortaddr) + m["shortaddr_hex"] = format("0x%04X", self.shortaddr) m["payload"] = self.payload # add payload object which is a synthetic attribute not included in tomap() return m end diff --git a/lib/libesp32/berry_tasmota/src/solidify/solidified_autoconf_module.h b/lib/libesp32/berry_tasmota/src/solidify/solidified_autoconf_module.h index c427f18dd..c37329631 100644 --- a/lib/libesp32/berry_tasmota/src/solidify/solidified_autoconf_module.h +++ b/lib/libesp32/berry_tasmota/src/solidify/solidified_autoconf_module.h @@ -11,7 +11,7 @@ extern const bclass be_class_Autoconf; ********************************************************************/ be_local_closure(Autoconf_page_autoconf_ctl, /* name */ be_nested_proto( - 13, /* nstack */ + 11, /* nstack */ 1, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -19,169 +19,166 @@ be_local_closure(Autoconf_page_autoconf_ctl, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[41]) { /* constants */ + ( &(const bvalue[39]) { /* constants */ /* K0 */ be_nested_str(webserver), - /* K1 */ be_nested_str(string), - /* K2 */ be_nested_str(path), - /* K3 */ be_nested_str(check_privileged_access), - /* K4 */ be_nested_str(has_arg), - /* K5 */ be_nested_str(reapply), - /* K6 */ be_nested_str(tasmota), - /* K7 */ be_nested_str(log), - /* K8 */ be_nested_str(CFG_X3A_X20removing_X20first_X20time_X20marker), - /* K9 */ be_const_int(2), - /* K10 */ be_nested_str(clear_first_time), - /* K11 */ be_nested_str(redirect), - /* K12 */ be_nested_str(_X2F_X3Frst_X3D), - /* K13 */ be_nested_str(zip), - /* K14 */ be_nested_str(CFG_X3A_X20removing_X20autoconf_X20files), - /* K15 */ be_nested_str(delete_all_configs), - /* K16 */ be_nested_str(arg), - /* K17 */ be_nested_str(reset), - /* K18 */ be_nested_str(format), - /* K19 */ be_nested_str(https_X3A_X2F_X2Fraw_X2Egithubusercontent_X2Ecom_X2Ftasmota_X2Fautoconf_X2Fmain_X2F_X25s_X2F_X25s_X2Eautoconf), - /* K20 */ be_nested_str(arch), - /* K21 */ be_nested_str(CFG_X3A_X20downloading_X20_X27_X25s_X27), - /* K22 */ be_nested_str(_X25s_X2Eautoconf), - /* K23 */ be_nested_str(webclient), - /* K24 */ be_nested_str(begin), - /* K25 */ be_nested_str(GET), - /* K26 */ be_nested_str(return_X20code_X3D_X25i), - /* K27 */ be_nested_str(connection_error), - /* K28 */ be_nested_str(write_file), - /* K29 */ be_nested_str(close), - /* K30 */ be_nested_str(value_error), - /* K31 */ be_nested_str(Unknown_X20command), - /* K32 */ be_nested_str(CFG_X3A_X20Exception_X3E_X20_X27_X25s_X27_X20_X2D_X20_X25s), - /* K33 */ be_nested_str(content_start), - /* K34 */ be_nested_str(Parameter_X20error), - /* K35 */ be_nested_str(content_send_style), - /* K36 */ be_nested_str(content_send), - /* K37 */ be_nested_str(_X3Cp_X20style_X3D_X27width_X3A340px_X3B_X27_X3E_X3Cb_X3EException_X3A_X3C_X2Fb_X3E_X3Cbr_X3E_X27_X25s_X27_X3Cbr_X3E_X25s_X3C_X2Fp_X3E), - /* K38 */ be_nested_str(content_button), - /* K39 */ be_nested_str(BUTTON_CONFIGURATION), - /* K40 */ be_nested_str(content_stop), + /* K1 */ be_nested_str(path), + /* K2 */ be_nested_str(check_privileged_access), + /* K3 */ be_nested_str(has_arg), + /* K4 */ be_nested_str(reapply), + /* K5 */ be_nested_str(tasmota), + /* K6 */ be_nested_str(log), + /* K7 */ be_nested_str(CFG_X3A_X20removing_X20first_X20time_X20marker), + /* K8 */ be_const_int(2), + /* K9 */ be_nested_str(clear_first_time), + /* K10 */ be_nested_str(redirect), + /* K11 */ be_nested_str(_X2F_X3Frst_X3D), + /* K12 */ be_nested_str(zip), + /* K13 */ be_nested_str(CFG_X3A_X20removing_X20autoconf_X20files), + /* K14 */ be_nested_str(delete_all_configs), + /* K15 */ be_nested_str(arg), + /* K16 */ be_nested_str(reset), + /* K17 */ be_nested_str(https_X3A_X2F_X2Fraw_X2Egithubusercontent_X2Ecom_X2Ftasmota_X2Fautoconf_X2Fmain_X2F_X25s_X2F_X25s_X2Eautoconf), + /* K18 */ be_nested_str(arch), + /* K19 */ be_nested_str(CFG_X3A_X20downloading_X20_X27_X25s_X27), + /* K20 */ be_nested_str(_X25s_X2Eautoconf), + /* K21 */ be_nested_str(webclient), + /* K22 */ be_nested_str(begin), + /* K23 */ be_nested_str(GET), + /* K24 */ be_nested_str(return_X20code_X3D_X25i), + /* K25 */ be_nested_str(connection_error), + /* K26 */ be_nested_str(write_file), + /* K27 */ be_nested_str(close), + /* K28 */ be_nested_str(value_error), + /* K29 */ be_nested_str(Unknown_X20command), + /* K30 */ be_nested_str(CFG_X3A_X20Exception_X3E_X20_X27_X25s_X27_X20_X2D_X20_X25s), + /* K31 */ be_nested_str(content_start), + /* K32 */ be_nested_str(Parameter_X20error), + /* K33 */ be_nested_str(content_send_style), + /* K34 */ be_nested_str(content_send), + /* K35 */ be_nested_str(_X3Cp_X20style_X3D_X27width_X3A340px_X3B_X27_X3E_X3Cb_X3EException_X3A_X3C_X2Fb_X3E_X3Cbr_X3E_X27_X25s_X27_X3Cbr_X3E_X25s_X3C_X2Fp_X3E), + /* K36 */ be_nested_str(content_button), + /* K37 */ be_nested_str(BUTTON_CONFIGURATION), + /* K38 */ be_nested_str(content_stop), }), &be_const_str_page_autoconf_ctl, &be_const_str_solidified, - ( &(const binstruction[117]) { /* code */ + ( &(const binstruction[116]) { /* code */ 0xA4060000, // 0000 IMPORT R1 K0 0xA40A0200, // 0001 IMPORT R2 K1 - 0xA40E0400, // 0002 IMPORT R3 K2 - 0x8C100303, // 0003 GETMET R4 R1 K3 - 0x7C100200, // 0004 CALL R4 1 - 0x74120001, // 0005 JMPT R4 #0008 - 0x4C100000, // 0006 LDNIL R4 - 0x80040800, // 0007 RET 1 R4 - 0xA802004E, // 0008 EXBLK 0 #0058 - 0x8C100304, // 0009 GETMET R4 R1 K4 - 0x58180005, // 000A LDCONST R6 K5 - 0x7C100400, // 000B CALL R4 2 - 0x7812000A, // 000C JMPF R4 #0018 - 0xB8120C00, // 000D GETNGBL R4 K6 - 0x8C100907, // 000E GETMET R4 R4 K7 + 0x8C0C0302, // 0002 GETMET R3 R1 K2 + 0x7C0C0200, // 0003 CALL R3 1 + 0x740E0001, // 0004 JMPT R3 #0007 + 0x4C0C0000, // 0005 LDNIL R3 + 0x80040600, // 0006 RET 1 R3 + 0xA802004E, // 0007 EXBLK 0 #0057 + 0x8C0C0303, // 0008 GETMET R3 R1 K3 + 0x58140004, // 0009 LDCONST R5 K4 + 0x7C0C0400, // 000A CALL R3 2 + 0x780E000A, // 000B JMPF R3 #0017 + 0xB80E0A00, // 000C GETNGBL R3 K5 + 0x8C0C0706, // 000D GETMET R3 R3 K6 + 0x58140007, // 000E LDCONST R5 K7 0x58180008, // 000F LDCONST R6 K8 - 0x581C0009, // 0010 LDCONST R7 K9 - 0x7C100600, // 0011 CALL R4 3 - 0x8C10010A, // 0012 GETMET R4 R0 K10 - 0x7C100200, // 0013 CALL R4 1 - 0x8C10030B, // 0014 GETMET R4 R1 K11 - 0x5818000C, // 0015 LDCONST R6 K12 - 0x7C100400, // 0016 CALL R4 2 - 0x7002003D, // 0017 JMP #0056 - 0x8C100304, // 0018 GETMET R4 R1 K4 - 0x5818000D, // 0019 LDCONST R6 K13 - 0x7C100400, // 001A CALL R4 2 - 0x78120038, // 001B JMPF R4 #0055 - 0xB8120C00, // 001C GETNGBL R4 K6 - 0x8C100907, // 001D GETMET R4 R4 K7 - 0x5818000E, // 001E LDCONST R6 K14 - 0x581C0009, // 001F LDCONST R7 K9 - 0x7C100600, // 0020 CALL R4 3 - 0x8C10010F, // 0021 GETMET R4 R0 K15 - 0x7C100200, // 0022 CALL R4 1 - 0x8C100310, // 0023 GETMET R4 R1 K16 - 0x5818000D, // 0024 LDCONST R6 K13 - 0x7C100400, // 0025 CALL R4 2 - 0x20140911, // 0026 NE R5 R4 K17 - 0x78160026, // 0027 JMPF R5 #004F - 0x8C140512, // 0028 GETMET R5 R2 K18 - 0x581C0013, // 0029 LDCONST R7 K19 - 0xB8220C00, // 002A GETNGBL R8 K6 - 0x8C201114, // 002B GETMET R8 R8 K20 - 0x7C200200, // 002C CALL R8 1 - 0x5C240800, // 002D MOVE R9 R4 - 0x7C140800, // 002E CALL R5 4 - 0xB81A0C00, // 002F GETNGBL R6 K6 - 0x8C180D07, // 0030 GETMET R6 R6 K7 - 0x8C200512, // 0031 GETMET R8 R2 K18 - 0x58280015, // 0032 LDCONST R10 K21 - 0x5C2C0A00, // 0033 MOVE R11 R5 - 0x7C200600, // 0034 CALL R8 3 - 0x58240009, // 0035 LDCONST R9 K9 - 0x7C180600, // 0036 CALL R6 3 - 0x8C180512, // 0037 GETMET R6 R2 K18 - 0x58200016, // 0038 LDCONST R8 K22 - 0x5C240800, // 0039 MOVE R9 R4 - 0x7C180600, // 003A CALL R6 3 - 0xB81E2E00, // 003B GETNGBL R7 K23 - 0x7C1C0000, // 003C CALL R7 0 - 0x8C200F18, // 003D GETMET R8 R7 K24 - 0x5C280A00, // 003E MOVE R10 R5 - 0x7C200400, // 003F CALL R8 2 - 0x8C200F19, // 0040 GETMET R8 R7 K25 - 0x7C200200, // 0041 CALL R8 1 - 0x542600C7, // 0042 LDINT R9 200 - 0x20241009, // 0043 NE R9 R8 R9 - 0x78260004, // 0044 JMPF R9 #004A - 0x8C240512, // 0045 GETMET R9 R2 K18 - 0x582C001A, // 0046 LDCONST R11 K26 - 0x5C301000, // 0047 MOVE R12 R8 - 0x7C240600, // 0048 CALL R9 3 - 0xB0063609, // 0049 RAISE 1 K27 R9 - 0x8C240F1C, // 004A GETMET R9 R7 K28 - 0x5C2C0C00, // 004B MOVE R11 R6 - 0x7C240400, // 004C CALL R9 2 - 0x8C240F1D, // 004D GETMET R9 R7 K29 - 0x7C240200, // 004E CALL R9 1 - 0x8C14010A, // 004F GETMET R5 R0 K10 - 0x7C140200, // 0050 CALL R5 1 - 0x8C14030B, // 0051 GETMET R5 R1 K11 - 0x581C000C, // 0052 LDCONST R7 K12 - 0x7C140400, // 0053 CALL R5 2 - 0x70020000, // 0054 JMP #0056 - 0xB0063D1F, // 0055 RAISE 1 K30 K31 - 0xA8040001, // 0056 EXBLK 1 1 - 0x7002001B, // 0057 JMP #0074 - 0xAC100002, // 0058 CATCH R4 0 2 - 0x70020018, // 0059 JMP #0073 - 0x60180001, // 005A GETGBL R6 G1 - 0x8C1C0512, // 005B GETMET R7 R2 K18 - 0x58240020, // 005C LDCONST R9 K32 - 0x5C280800, // 005D MOVE R10 R4 - 0x5C2C0A00, // 005E MOVE R11 R5 - 0x7C1C0800, // 005F CALL R7 4 - 0x7C180200, // 0060 CALL R6 1 - 0x8C180321, // 0061 GETMET R6 R1 K33 - 0x58200022, // 0062 LDCONST R8 K34 - 0x7C180400, // 0063 CALL R6 2 - 0x8C180323, // 0064 GETMET R6 R1 K35 - 0x7C180200, // 0065 CALL R6 1 - 0x8C180324, // 0066 GETMET R6 R1 K36 - 0x8C200512, // 0067 GETMET R8 R2 K18 - 0x58280025, // 0068 LDCONST R10 K37 - 0x5C2C0800, // 0069 MOVE R11 R4 - 0x5C300A00, // 006A MOVE R12 R5 - 0x7C200800, // 006B CALL R8 4 - 0x7C180400, // 006C CALL R6 2 - 0x8C180326, // 006D GETMET R6 R1 K38 - 0x88200327, // 006E GETMBR R8 R1 K39 - 0x7C180400, // 006F CALL R6 2 - 0x8C180328, // 0070 GETMET R6 R1 K40 - 0x7C180200, // 0071 CALL R6 1 - 0x70020000, // 0072 JMP #0074 - 0xB0080000, // 0073 RAISE 2 R0 R0 - 0x80000000, // 0074 RET 0 + 0x7C0C0600, // 0010 CALL R3 3 + 0x8C0C0109, // 0011 GETMET R3 R0 K9 + 0x7C0C0200, // 0012 CALL R3 1 + 0x8C0C030A, // 0013 GETMET R3 R1 K10 + 0x5814000B, // 0014 LDCONST R5 K11 + 0x7C0C0400, // 0015 CALL R3 2 + 0x7002003D, // 0016 JMP #0055 + 0x8C0C0303, // 0017 GETMET R3 R1 K3 + 0x5814000C, // 0018 LDCONST R5 K12 + 0x7C0C0400, // 0019 CALL R3 2 + 0x780E0038, // 001A JMPF R3 #0054 + 0xB80E0A00, // 001B GETNGBL R3 K5 + 0x8C0C0706, // 001C GETMET R3 R3 K6 + 0x5814000D, // 001D LDCONST R5 K13 + 0x58180008, // 001E LDCONST R6 K8 + 0x7C0C0600, // 001F CALL R3 3 + 0x8C0C010E, // 0020 GETMET R3 R0 K14 + 0x7C0C0200, // 0021 CALL R3 1 + 0x8C0C030F, // 0022 GETMET R3 R1 K15 + 0x5814000C, // 0023 LDCONST R5 K12 + 0x7C0C0400, // 0024 CALL R3 2 + 0x20100710, // 0025 NE R4 R3 K16 + 0x78120026, // 0026 JMPF R4 #004E + 0x60100018, // 0027 GETGBL R4 G24 + 0x58140011, // 0028 LDCONST R5 K17 + 0xB81A0A00, // 0029 GETNGBL R6 K5 + 0x8C180D12, // 002A GETMET R6 R6 K18 + 0x7C180200, // 002B CALL R6 1 + 0x5C1C0600, // 002C MOVE R7 R3 + 0x7C100600, // 002D CALL R4 3 + 0xB8160A00, // 002E GETNGBL R5 K5 + 0x8C140B06, // 002F GETMET R5 R5 K6 + 0x601C0018, // 0030 GETGBL R7 G24 + 0x58200013, // 0031 LDCONST R8 K19 + 0x5C240800, // 0032 MOVE R9 R4 + 0x7C1C0400, // 0033 CALL R7 2 + 0x58200008, // 0034 LDCONST R8 K8 + 0x7C140600, // 0035 CALL R5 3 + 0x60140018, // 0036 GETGBL R5 G24 + 0x58180014, // 0037 LDCONST R6 K20 + 0x5C1C0600, // 0038 MOVE R7 R3 + 0x7C140400, // 0039 CALL R5 2 + 0xB81A2A00, // 003A GETNGBL R6 K21 + 0x7C180000, // 003B CALL R6 0 + 0x8C1C0D16, // 003C GETMET R7 R6 K22 + 0x5C240800, // 003D MOVE R9 R4 + 0x7C1C0400, // 003E CALL R7 2 + 0x8C1C0D17, // 003F GETMET R7 R6 K23 + 0x7C1C0200, // 0040 CALL R7 1 + 0x542200C7, // 0041 LDINT R8 200 + 0x20200E08, // 0042 NE R8 R7 R8 + 0x78220004, // 0043 JMPF R8 #0049 + 0x60200018, // 0044 GETGBL R8 G24 + 0x58240018, // 0045 LDCONST R9 K24 + 0x5C280E00, // 0046 MOVE R10 R7 + 0x7C200400, // 0047 CALL R8 2 + 0xB0063208, // 0048 RAISE 1 K25 R8 + 0x8C200D1A, // 0049 GETMET R8 R6 K26 + 0x5C280A00, // 004A MOVE R10 R5 + 0x7C200400, // 004B CALL R8 2 + 0x8C200D1B, // 004C GETMET R8 R6 K27 + 0x7C200200, // 004D CALL R8 1 + 0x8C100109, // 004E GETMET R4 R0 K9 + 0x7C100200, // 004F CALL R4 1 + 0x8C10030A, // 0050 GETMET R4 R1 K10 + 0x5818000B, // 0051 LDCONST R6 K11 + 0x7C100400, // 0052 CALL R4 2 + 0x70020000, // 0053 JMP #0055 + 0xB006391D, // 0054 RAISE 1 K28 K29 + 0xA8040001, // 0055 EXBLK 1 1 + 0x7002001B, // 0056 JMP #0073 + 0xAC0C0002, // 0057 CATCH R3 0 2 + 0x70020018, // 0058 JMP #0072 + 0x60140001, // 0059 GETGBL R5 G1 + 0x60180018, // 005A GETGBL R6 G24 + 0x581C001E, // 005B LDCONST R7 K30 + 0x5C200600, // 005C MOVE R8 R3 + 0x5C240800, // 005D MOVE R9 R4 + 0x7C180600, // 005E CALL R6 3 + 0x7C140200, // 005F CALL R5 1 + 0x8C14031F, // 0060 GETMET R5 R1 K31 + 0x581C0020, // 0061 LDCONST R7 K32 + 0x7C140400, // 0062 CALL R5 2 + 0x8C140321, // 0063 GETMET R5 R1 K33 + 0x7C140200, // 0064 CALL R5 1 + 0x8C140322, // 0065 GETMET R5 R1 K34 + 0x601C0018, // 0066 GETGBL R7 G24 + 0x58200023, // 0067 LDCONST R8 K35 + 0x5C240600, // 0068 MOVE R9 R3 + 0x5C280800, // 0069 MOVE R10 R4 + 0x7C1C0600, // 006A CALL R7 3 + 0x7C140400, // 006B CALL R5 2 + 0x8C140324, // 006C GETMET R5 R1 K36 + 0x881C0325, // 006D GETMBR R7 R1 K37 + 0x7C140400, // 006E CALL R5 2 + 0x8C140326, // 006F GETMET R5 R1 K38 + 0x7C140200, // 0070 CALL R5 1 + 0x70020000, // 0071 JMP #0073 + 0xB0080000, // 0072 RAISE 2 R0 R0 + 0x80000000, // 0073 RET 0 }) ) ); @@ -193,7 +190,7 @@ be_local_closure(Autoconf_page_autoconf_ctl, /* name */ ********************************************************************/ be_local_closure(Autoconf_autoexec, /* name */ be_nested_proto( - 14, /* nstack */ + 13, /* nstack */ 1, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -201,7 +198,7 @@ be_local_closure(Autoconf_autoexec, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[32]) { /* constants */ + ( &(const bvalue[30]) { /* constants */ /* K0 */ be_nested_str(_archive), /* K1 */ be_nested_str(path), /* K2 */ be_nested_str(_X23init_X2Ebat), @@ -221,23 +218,21 @@ be_local_closure(Autoconf_autoexec, /* name */ /* K16 */ be_nested_str(write), /* K17 */ be_nested_str(close), /* K18 */ be_nested_str(CFG_X3A_X20_X27display_X2Eini_X27_X20extracted_X2C_X20restarting), - /* K19 */ be_nested_str(string), - /* K20 */ be_nested_str(format), - /* K21 */ be_nested_str(CFG_X3A_X20could_X20not_X20copy_X20_X27display_X2Eini_X27_X20_X28_X25s_X20_X2D_X20_X25s_X29_X27), - /* K22 */ be_nested_str(cmd), - /* K23 */ be_nested_str(Restart_X201), - /* K24 */ be_nested_str(_X23autoexec_X2Ebat), - /* K25 */ be_nested_str(CFG_X3A_X20running_X20), - /* K26 */ be_const_int(3), - /* K27 */ be_nested_str(CFG_X3A_X20ran_X20_X20), - /* K28 */ be_nested_str(_X23autoexec_X2Ebe), - /* K29 */ be_nested_str(CFG_X3A_X20loading_X20), - /* K30 */ be_nested_str(load), - /* K31 */ be_nested_str(CFG_X3A_X20loaded_X20_X20), + /* K19 */ be_nested_str(CFG_X3A_X20could_X20not_X20copy_X20_X27display_X2Eini_X27_X20_X28_X25s_X20_X2D_X20_X25s_X29_X27), + /* K20 */ be_nested_str(cmd), + /* K21 */ be_nested_str(Restart_X201), + /* K22 */ be_nested_str(_X23autoexec_X2Ebat), + /* K23 */ be_nested_str(CFG_X3A_X20running_X20), + /* K24 */ be_const_int(3), + /* K25 */ be_nested_str(CFG_X3A_X20ran_X20_X20), + /* K26 */ be_nested_str(_X23autoexec_X2Ebe), + /* K27 */ be_nested_str(CFG_X3A_X20loading_X20), + /* K28 */ be_nested_str(load), + /* K29 */ be_nested_str(CFG_X3A_X20loaded_X20_X20), }), &be_const_str_autoexec, &be_const_str_solidified, - ( &(const binstruction[148]) { /* code */ + ( &(const binstruction[147]) { /* code */ 0x88040100, // 0000 GETMBR R1 R0 K0 0x4C080000, // 0001 LDNIL R2 0x1C040202, // 0002 EQ R1 R1 R2 @@ -272,14 +267,14 @@ be_local_closure(Autoconf_autoexec, /* name */ 0x8C100304, // 001F GETMET R4 R1 K4 0x5C180600, // 0020 MOVE R6 R3 0x7C100400, // 0021 CALL R4 2 - 0x78120041, // 0022 JMPF R4 #0065 + 0x78120040, // 0022 JMPF R4 #0064 0x8C100103, // 0023 GETMET R4 R0 K3 0x7C100200, // 0024 CALL R4 1 0x74120003, // 0025 JMPT R4 #002A 0x8C100304, // 0026 GETMET R4 R1 K4 0x5818000C, // 0027 LDCONST R6 K12 0x7C100400, // 0028 CALL R4 2 - 0x7412003A, // 0029 JMPT R4 #0065 + 0x74120039, // 0029 JMPT R4 #0064 0x8C100103, // 002A GETMET R4 R0 K3 0x7C100200, // 002B CALL R4 1 0x78120003, // 002C JMPF R4 #0031 @@ -316,76 +311,75 @@ be_local_closure(Autoconf_autoexec, /* name */ 0x5828000A, // 004B LDCONST R10 K10 0x7C1C0600, // 004C CALL R7 3 0xA8040001, // 004D EXBLK 1 1 - 0x70020015, // 004E JMP #0065 + 0x70020014, // 004E JMP #0064 0xAC180002, // 004F CATCH R6 0 2 - 0x70020012, // 0050 JMP #0064 + 0x70020011, // 0050 JMP #0063 0x60200001, // 0051 GETGBL R8 G1 - 0xB8262600, // 0052 GETNGBL R9 K19 - 0x8C241314, // 0053 GETMET R9 R9 K20 - 0x582C0015, // 0054 LDCONST R11 K21 - 0x5C300C00, // 0055 MOVE R12 R6 - 0x5C340E00, // 0056 MOVE R13 R7 - 0x7C240800, // 0057 CALL R9 4 - 0x7C200200, // 0058 CALL R8 1 - 0x4C200000, // 0059 LDNIL R8 - 0x20200808, // 005A NE R8 R4 R8 - 0x78220001, // 005B JMPF R8 #005E - 0x8C200911, // 005C GETMET R8 R4 K17 - 0x7C200200, // 005D CALL R8 1 - 0x4C200000, // 005E LDNIL R8 - 0x20200A08, // 005F NE R8 R5 R8 - 0x78220001, // 0060 JMPF R8 #0063 - 0x8C200B11, // 0061 GETMET R8 R5 K17 - 0x7C200200, // 0062 CALL R8 1 - 0x70020000, // 0063 JMP #0065 - 0xB0080000, // 0064 RAISE 2 R0 R0 - 0x780A0004, // 0065 JMPF R2 #006B - 0xB8120E00, // 0066 GETNGBL R4 K7 - 0x8C100916, // 0067 GETMET R4 R4 K22 - 0x58180017, // 0068 LDCONST R6 K23 - 0x7C100400, // 0069 CALL R4 2 - 0x80000800, // 006A RET 0 - 0x88100100, // 006B GETMBR R4 R0 K0 - 0x00100918, // 006C ADD R4 R4 K24 - 0x5C0C0800, // 006D MOVE R3 R4 - 0x8C100304, // 006E GETMET R4 R1 K4 - 0x5C180600, // 006F MOVE R6 R3 - 0x7C100400, // 0070 CALL R4 2 - 0x7812000C, // 0071 JMPF R4 #007F - 0xB8120E00, // 0072 GETNGBL R4 K7 - 0x8C100908, // 0073 GETMET R4 R4 K8 - 0x001A3203, // 0074 ADD R6 K25 R3 - 0x581C001A, // 0075 LDCONST R7 K26 - 0x7C100600, // 0076 CALL R4 3 - 0x8C100106, // 0077 GETMET R4 R0 K6 - 0x5C180600, // 0078 MOVE R6 R3 - 0x7C100400, // 0079 CALL R4 2 - 0xB8120E00, // 007A GETNGBL R4 K7 - 0x8C100908, // 007B GETMET R4 R4 K8 - 0x001A3603, // 007C ADD R6 K27 R3 - 0x581C001A, // 007D LDCONST R7 K26 - 0x7C100600, // 007E CALL R4 3 - 0x88100100, // 007F GETMBR R4 R0 K0 - 0x0010091C, // 0080 ADD R4 R4 K28 - 0x5C0C0800, // 0081 MOVE R3 R4 - 0x8C100304, // 0082 GETMET R4 R1 K4 - 0x5C180600, // 0083 MOVE R6 R3 - 0x7C100400, // 0084 CALL R4 2 - 0x7812000C, // 0085 JMPF R4 #0093 - 0xB8120E00, // 0086 GETNGBL R4 K7 - 0x8C100908, // 0087 GETMET R4 R4 K8 - 0x001A3A03, // 0088 ADD R6 K29 R3 - 0x581C001A, // 0089 LDCONST R7 K26 - 0x7C100600, // 008A CALL R4 3 - 0xB8123C00, // 008B GETNGBL R4 K30 - 0x5C140600, // 008C MOVE R5 R3 - 0x7C100200, // 008D CALL R4 1 - 0xB8120E00, // 008E GETNGBL R4 K7 - 0x8C100908, // 008F GETMET R4 R4 K8 - 0x001A3E03, // 0090 ADD R6 K31 R3 - 0x581C001A, // 0091 LDCONST R7 K26 - 0x7C100600, // 0092 CALL R4 3 - 0x80000000, // 0093 RET 0 + 0x60240018, // 0052 GETGBL R9 G24 + 0x58280013, // 0053 LDCONST R10 K19 + 0x5C2C0C00, // 0054 MOVE R11 R6 + 0x5C300E00, // 0055 MOVE R12 R7 + 0x7C240600, // 0056 CALL R9 3 + 0x7C200200, // 0057 CALL R8 1 + 0x4C200000, // 0058 LDNIL R8 + 0x20200808, // 0059 NE R8 R4 R8 + 0x78220001, // 005A JMPF R8 #005D + 0x8C200911, // 005B GETMET R8 R4 K17 + 0x7C200200, // 005C CALL R8 1 + 0x4C200000, // 005D LDNIL R8 + 0x20200A08, // 005E NE R8 R5 R8 + 0x78220001, // 005F JMPF R8 #0062 + 0x8C200B11, // 0060 GETMET R8 R5 K17 + 0x7C200200, // 0061 CALL R8 1 + 0x70020000, // 0062 JMP #0064 + 0xB0080000, // 0063 RAISE 2 R0 R0 + 0x780A0004, // 0064 JMPF R2 #006A + 0xB8120E00, // 0065 GETNGBL R4 K7 + 0x8C100914, // 0066 GETMET R4 R4 K20 + 0x58180015, // 0067 LDCONST R6 K21 + 0x7C100400, // 0068 CALL R4 2 + 0x80000800, // 0069 RET 0 + 0x88100100, // 006A GETMBR R4 R0 K0 + 0x00100916, // 006B ADD R4 R4 K22 + 0x5C0C0800, // 006C MOVE R3 R4 + 0x8C100304, // 006D GETMET R4 R1 K4 + 0x5C180600, // 006E MOVE R6 R3 + 0x7C100400, // 006F CALL R4 2 + 0x7812000C, // 0070 JMPF R4 #007E + 0xB8120E00, // 0071 GETNGBL R4 K7 + 0x8C100908, // 0072 GETMET R4 R4 K8 + 0x001A2E03, // 0073 ADD R6 K23 R3 + 0x581C0018, // 0074 LDCONST R7 K24 + 0x7C100600, // 0075 CALL R4 3 + 0x8C100106, // 0076 GETMET R4 R0 K6 + 0x5C180600, // 0077 MOVE R6 R3 + 0x7C100400, // 0078 CALL R4 2 + 0xB8120E00, // 0079 GETNGBL R4 K7 + 0x8C100908, // 007A GETMET R4 R4 K8 + 0x001A3203, // 007B ADD R6 K25 R3 + 0x581C0018, // 007C LDCONST R7 K24 + 0x7C100600, // 007D CALL R4 3 + 0x88100100, // 007E GETMBR R4 R0 K0 + 0x0010091A, // 007F ADD R4 R4 K26 + 0x5C0C0800, // 0080 MOVE R3 R4 + 0x8C100304, // 0081 GETMET R4 R1 K4 + 0x5C180600, // 0082 MOVE R6 R3 + 0x7C100400, // 0083 CALL R4 2 + 0x7812000C, // 0084 JMPF R4 #0092 + 0xB8120E00, // 0085 GETNGBL R4 K7 + 0x8C100908, // 0086 GETMET R4 R4 K8 + 0x001A3603, // 0087 ADD R6 K27 R3 + 0x581C0018, // 0088 LDCONST R7 K24 + 0x7C100600, // 0089 CALL R4 3 + 0xB8123800, // 008A GETNGBL R4 K28 + 0x5C140600, // 008B MOVE R5 R3 + 0x7C100200, // 008C CALL R4 1 + 0xB8120E00, // 008D GETNGBL R4 K7 + 0x8C100908, // 008E GETMET R4 R4 K8 + 0x001A3A03, // 008F ADD R6 K29 R3 + 0x581C0018, // 0090 LDCONST R7 K24 + 0x7C100600, // 0091 CALL R4 3 + 0x80000000, // 0092 RET 0 }) ) ); @@ -397,7 +391,7 @@ be_local_closure(Autoconf_autoexec, /* name */ ********************************************************************/ be_local_closure(Autoconf_run_bat, /* name */ be_nested_proto( - 14, /* nstack */ + 12, /* nstack */ 2, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -405,93 +399,90 @@ be_local_closure(Autoconf_run_bat, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[13]) { /* constants */ - /* K0 */ be_nested_str(string), - /* K1 */ be_nested_str(r), - /* K2 */ be_nested_str(readline), - /* K3 */ be_const_int(0), - /* K4 */ be_nested_str(_X0A), - /* K5 */ be_nested_str(_X0D), - /* K6 */ be_nested_str(tasmota), - /* K7 */ be_nested_str(cmd), - /* K8 */ be_nested_str(close), - /* K9 */ be_nested_str(log), - /* K10 */ be_nested_str(format), - /* K11 */ be_nested_str(CFG_X3A_X20could_X20not_X20run_X20_X25s_X20_X28_X25s_X20_X2D_X20_X25s_X29), - /* K12 */ be_const_int(1), + ( &(const bvalue[11]) { /* constants */ + /* K0 */ be_nested_str(r), + /* K1 */ be_nested_str(readline), + /* K2 */ be_const_int(0), + /* K3 */ be_nested_str(_X0A), + /* K4 */ be_nested_str(_X0D), + /* K5 */ be_nested_str(tasmota), + /* K6 */ be_nested_str(cmd), + /* K7 */ be_nested_str(close), + /* K8 */ be_nested_str(log), + /* K9 */ be_nested_str(CFG_X3A_X20could_X20not_X20run_X20_X25s_X20_X28_X25s_X20_X2D_X20_X25s_X29), + /* K10 */ be_const_int(1), }), &be_const_str_run_bat, &be_const_str_solidified, - ( &(const binstruction[69]) { /* code */ - 0xA40A0000, // 0000 IMPORT R2 K0 - 0x4C0C0000, // 0001 LDNIL R3 - 0xA802002D, // 0002 EXBLK 0 #0031 - 0x60100011, // 0003 GETGBL R4 G17 - 0x5C140200, // 0004 MOVE R5 R1 - 0x58180001, // 0005 LDCONST R6 K1 - 0x7C100400, // 0006 CALL R4 2 - 0x5C0C0800, // 0007 MOVE R3 R4 - 0x50100200, // 0008 LDBOOL R4 1 0 - 0x78120022, // 0009 JMPF R4 #002D - 0x8C100702, // 000A GETMET R4 R3 K2 - 0x7C100200, // 000B CALL R4 1 - 0x6014000C, // 000C GETGBL R5 G12 - 0x5C180800, // 000D MOVE R6 R4 - 0x7C140200, // 000E CALL R5 1 - 0x1C140B03, // 000F EQ R5 R5 K3 - 0x78160000, // 0010 JMPF R5 #0012 - 0x7002001A, // 0011 JMP #002D - 0x6014000C, // 0012 GETGBL R5 G12 - 0x5C180800, // 0013 MOVE R6 R4 - 0x7C140200, // 0014 CALL R5 1 - 0x24140B03, // 0015 GT R5 R5 K3 - 0x7816000B, // 0016 JMPF R5 #0023 - 0x5415FFFE, // 0017 LDINT R5 -1 - 0x94140805, // 0018 GETIDX R5 R4 R5 - 0x1C140B04, // 0019 EQ R5 R5 K4 - 0x74160003, // 001A JMPT R5 #001F - 0x5415FFFE, // 001B LDINT R5 -1 - 0x94140805, // 001C GETIDX R5 R4 R5 - 0x1C140B05, // 001D EQ R5 R5 K5 - 0x78160003, // 001E JMPF R5 #0023 - 0x5415FFFD, // 001F LDINT R5 -2 - 0x40160605, // 0020 CONNECT R5 K3 R5 - 0x94100805, // 0021 GETIDX R4 R4 R5 - 0x7001FFEE, // 0022 JMP #0012 - 0x6014000C, // 0023 GETGBL R5 G12 - 0x5C180800, // 0024 MOVE R6 R4 - 0x7C140200, // 0025 CALL R5 1 - 0x24140B03, // 0026 GT R5 R5 K3 - 0x78160003, // 0027 JMPF R5 #002C - 0xB8160C00, // 0028 GETNGBL R5 K6 - 0x8C140B07, // 0029 GETMET R5 R5 K7 - 0x5C1C0800, // 002A MOVE R7 R4 - 0x7C140400, // 002B CALL R5 2 - 0x7001FFDA, // 002C JMP #0008 - 0x8C100708, // 002D GETMET R4 R3 K8 - 0x7C100200, // 002E CALL R4 1 - 0xA8040001, // 002F EXBLK 1 1 - 0x70020012, // 0030 JMP #0044 - 0xAC100002, // 0031 CATCH R4 0 2 - 0x7002000F, // 0032 JMP #0043 - 0xB81A0C00, // 0033 GETNGBL R6 K6 - 0x8C180D09, // 0034 GETMET R6 R6 K9 - 0x8C20050A, // 0035 GETMET R8 R2 K10 - 0x5828000B, // 0036 LDCONST R10 K11 - 0x5C2C0200, // 0037 MOVE R11 R1 - 0x5C300800, // 0038 MOVE R12 R4 - 0x5C340A00, // 0039 MOVE R13 R5 - 0x7C200A00, // 003A CALL R8 5 - 0x5824000C, // 003B LDCONST R9 K12 - 0x7C180600, // 003C CALL R6 3 - 0x4C180000, // 003D LDNIL R6 - 0x20180606, // 003E NE R6 R3 R6 - 0x781A0001, // 003F JMPF R6 #0042 - 0x8C180708, // 0040 GETMET R6 R3 K8 - 0x7C180200, // 0041 CALL R6 1 - 0x70020000, // 0042 JMP #0044 - 0xB0080000, // 0043 RAISE 2 R0 R0 - 0x80000000, // 0044 RET 0 + ( &(const binstruction[68]) { /* code */ + 0x4C080000, // 0000 LDNIL R2 + 0xA802002D, // 0001 EXBLK 0 #0030 + 0x600C0011, // 0002 GETGBL R3 G17 + 0x5C100200, // 0003 MOVE R4 R1 + 0x58140000, // 0004 LDCONST R5 K0 + 0x7C0C0400, // 0005 CALL R3 2 + 0x5C080600, // 0006 MOVE R2 R3 + 0x500C0200, // 0007 LDBOOL R3 1 0 + 0x780E0022, // 0008 JMPF R3 #002C + 0x8C0C0501, // 0009 GETMET R3 R2 K1 + 0x7C0C0200, // 000A CALL R3 1 + 0x6010000C, // 000B GETGBL R4 G12 + 0x5C140600, // 000C MOVE R5 R3 + 0x7C100200, // 000D CALL R4 1 + 0x1C100902, // 000E EQ R4 R4 K2 + 0x78120000, // 000F JMPF R4 #0011 + 0x7002001A, // 0010 JMP #002C + 0x6010000C, // 0011 GETGBL R4 G12 + 0x5C140600, // 0012 MOVE R5 R3 + 0x7C100200, // 0013 CALL R4 1 + 0x24100902, // 0014 GT R4 R4 K2 + 0x7812000B, // 0015 JMPF R4 #0022 + 0x5411FFFE, // 0016 LDINT R4 -1 + 0x94100604, // 0017 GETIDX R4 R3 R4 + 0x1C100903, // 0018 EQ R4 R4 K3 + 0x74120003, // 0019 JMPT R4 #001E + 0x5411FFFE, // 001A LDINT R4 -1 + 0x94100604, // 001B GETIDX R4 R3 R4 + 0x1C100904, // 001C EQ R4 R4 K4 + 0x78120003, // 001D JMPF R4 #0022 + 0x5411FFFD, // 001E LDINT R4 -2 + 0x40120404, // 001F CONNECT R4 K2 R4 + 0x940C0604, // 0020 GETIDX R3 R3 R4 + 0x7001FFEE, // 0021 JMP #0011 + 0x6010000C, // 0022 GETGBL R4 G12 + 0x5C140600, // 0023 MOVE R5 R3 + 0x7C100200, // 0024 CALL R4 1 + 0x24100902, // 0025 GT R4 R4 K2 + 0x78120003, // 0026 JMPF R4 #002B + 0xB8120A00, // 0027 GETNGBL R4 K5 + 0x8C100906, // 0028 GETMET R4 R4 K6 + 0x5C180600, // 0029 MOVE R6 R3 + 0x7C100400, // 002A CALL R4 2 + 0x7001FFDA, // 002B JMP #0007 + 0x8C0C0507, // 002C GETMET R3 R2 K7 + 0x7C0C0200, // 002D CALL R3 1 + 0xA8040001, // 002E EXBLK 1 1 + 0x70020012, // 002F JMP #0043 + 0xAC0C0002, // 0030 CATCH R3 0 2 + 0x7002000F, // 0031 JMP #0042 + 0xB8160A00, // 0032 GETNGBL R5 K5 + 0x8C140B08, // 0033 GETMET R5 R5 K8 + 0x601C0018, // 0034 GETGBL R7 G24 + 0x58200009, // 0035 LDCONST R8 K9 + 0x5C240200, // 0036 MOVE R9 R1 + 0x5C280600, // 0037 MOVE R10 R3 + 0x5C2C0800, // 0038 MOVE R11 R4 + 0x7C1C0800, // 0039 CALL R7 4 + 0x5820000A, // 003A LDCONST R8 K10 + 0x7C140600, // 003B CALL R5 3 + 0x4C140000, // 003C LDNIL R5 + 0x20140405, // 003D NE R5 R2 R5 + 0x78160001, // 003E JMPF R5 #0041 + 0x8C140507, // 003F GETMET R5 R2 K7 + 0x7C140200, // 0040 CALL R5 1 + 0x70020000, // 0041 JMP #0043 + 0xB0080000, // 0042 RAISE 2 R0 R0 + 0x80000000, // 0043 RET 0 }) ) ); @@ -503,7 +494,7 @@ be_local_closure(Autoconf_run_bat, /* name */ ********************************************************************/ be_local_closure(Autoconf_page_autoconf_mgr, /* name */ be_nested_proto( - 19, /* nstack */ + 18, /* nstack */ 1, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -511,7 +502,7 @@ be_local_closure(Autoconf_page_autoconf_mgr, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[39]) { /* constants */ + ( &(const bvalue[38]) { /* constants */ /* K0 */ be_nested_str(webserver), /* K1 */ be_nested_str(string), /* K2 */ be_nested_str(check_privileged_access), @@ -529,28 +520,27 @@ be_local_closure(Autoconf_page_autoconf_mgr, /* name */ /* K14 */ be_nested_str(_X26lt_X3BError_X3A_X20apply_X20new_X20or_X20remove_X26gt_X3B), /* K15 */ be_nested_str(_X26lt_X3BNone_X26gt_X3B), /* K16 */ be_nested_str(_X3Cfieldset_X3E_X3Cstyle_X3E_X2Ebdis_X7Bbackground_X3A_X23888_X3B_X7D_X2Ebdis_X3Ahover_X7Bbackground_X3A_X23888_X3B_X7D_X3C_X2Fstyle_X3E), - /* K17 */ be_nested_str(format), - /* K18 */ be_nested_str(_X3Clegend_X3E_X3Cb_X20title_X3D_X27Autoconfiguration_X27_X3E_X26nbsp_X3BCurrent_X20auto_X2Dconfiguration_X3C_X2Fb_X3E_X3C_X2Flegend_X3E), - /* K19 */ be_nested_str(_X3Cp_X3ECurrent_X20configuration_X3A_X20_X3C_X2Fp_X3E_X3Cp_X3E_X3Cb_X3E_X25s_X3C_X2Fb_X3E_X3C_X2Fp_X3E), - /* K20 */ be_nested_str(_X3Cp_X3E_X3Cform_X20id_X3Dreapply_X20style_X3D_X27display_X3A_X20block_X3B_X27_X20action_X3D_X27_X2Fac_X27_X20method_X3D_X27post_X27_X20), - /* K21 */ be_nested_str(onsubmit_X3D_X27return_X20confirm_X28_X22This_X20will_X20cause_X20a_X20restart_X2E_X22_X29_X3B_X27_X3E), - /* K22 */ be_nested_str(_X3Cbutton_X20name_X3D_X27reapply_X27_X20class_X3D_X27button_X20bgrn_X27_X3ERe_X2Dapply_X20current_X20configuration_X3C_X2Fbutton_X3E), - /* K23 */ be_nested_str(_X3C_X2Fform_X3E_X3C_X2Fp_X3E), - /* K24 */ be_nested_str(_X3Cp_X3E_X3C_X2Fp_X3E_X3C_X2Ffieldset_X3E_X3Cp_X3E_X3C_X2Fp_X3E), - /* K25 */ be_nested_str(_X3Clegend_X3E_X3Cb_X20title_X3D_X27New_X20autoconf_X27_X3E_X26nbsp_X3BSelect_X20new_X20auto_X2Dconfiguration_X3C_X2Fb_X3E_X3C_X2Flegend_X3E), - /* K26 */ be_nested_str(_X3Cp_X3E_X3Cform_X20id_X3Dzip_X20style_X3D_X27display_X3A_X20block_X3B_X27_X20action_X3D_X27_X2Fac_X27_X20method_X3D_X27post_X27_X20), - /* K27 */ be_nested_str(onsubmit_X3D_X27return_X20confirm_X28_X22This_X20will_X20change_X20the_X20current_X20configuration_X20and_X20cause_X20a_X20restart_X2E_X22_X29_X3B_X27_X3E), - /* K28 */ be_nested_str(_X3Clabel_X3EChoose_X20a_X20device_X20configuration_X3A_X3C_X2Flabel_X3E_X3Cbr_X3E), - /* K29 */ be_nested_str(_X3Cselect_X20name_X3D_X27zip_X27_X3E), - /* K30 */ be_nested_str(load_templates), - /* K31 */ be_nested_str(_X3Coption_X20value_X3D_X27reset_X27_X3E_X26lt_X3BRemove_X20autoconf_X26gt_X3B_X3C_X2Foption_X3E), - /* K32 */ be_nested_str(_X3Coption_X20value_X3D_X27_X25s_X27_X3E_X25s_X3C_X2Foption_X3E), - /* K33 */ be_nested_str(stop_iteration), - /* K34 */ be_nested_str(_X3C_X2Fselect_X3E_X3Cp_X3E_X3C_X2Fp_X3E), - /* K35 */ be_nested_str(_X3Cbutton_X20name_X3D_X27zipapply_X27_X20class_X3D_X27button_X20bgrn_X27_X3EApply_X20configuration_X3C_X2Fbutton_X3E), - /* K36 */ be_nested_str(content_button), - /* K37 */ be_nested_str(BUTTON_CONFIGURATION), - /* K38 */ be_nested_str(content_stop), + /* K17 */ be_nested_str(_X3Clegend_X3E_X3Cb_X20title_X3D_X27Autoconfiguration_X27_X3E_X26nbsp_X3BCurrent_X20auto_X2Dconfiguration_X3C_X2Fb_X3E_X3C_X2Flegend_X3E), + /* K18 */ be_nested_str(_X3Cp_X3ECurrent_X20configuration_X3A_X20_X3C_X2Fp_X3E_X3Cp_X3E_X3Cb_X3E_X25s_X3C_X2Fb_X3E_X3C_X2Fp_X3E), + /* K19 */ be_nested_str(_X3Cp_X3E_X3Cform_X20id_X3Dreapply_X20style_X3D_X27display_X3A_X20block_X3B_X27_X20action_X3D_X27_X2Fac_X27_X20method_X3D_X27post_X27_X20), + /* K20 */ be_nested_str(onsubmit_X3D_X27return_X20confirm_X28_X22This_X20will_X20cause_X20a_X20restart_X2E_X22_X29_X3B_X27_X3E), + /* K21 */ be_nested_str(_X3Cbutton_X20name_X3D_X27reapply_X27_X20class_X3D_X27button_X20bgrn_X27_X3ERe_X2Dapply_X20current_X20configuration_X3C_X2Fbutton_X3E), + /* K22 */ be_nested_str(_X3C_X2Fform_X3E_X3C_X2Fp_X3E), + /* K23 */ be_nested_str(_X3Cp_X3E_X3C_X2Fp_X3E_X3C_X2Ffieldset_X3E_X3Cp_X3E_X3C_X2Fp_X3E), + /* K24 */ be_nested_str(_X3Clegend_X3E_X3Cb_X20title_X3D_X27New_X20autoconf_X27_X3E_X26nbsp_X3BSelect_X20new_X20auto_X2Dconfiguration_X3C_X2Fb_X3E_X3C_X2Flegend_X3E), + /* K25 */ be_nested_str(_X3Cp_X3E_X3Cform_X20id_X3Dzip_X20style_X3D_X27display_X3A_X20block_X3B_X27_X20action_X3D_X27_X2Fac_X27_X20method_X3D_X27post_X27_X20), + /* K26 */ be_nested_str(onsubmit_X3D_X27return_X20confirm_X28_X22This_X20will_X20change_X20the_X20current_X20configuration_X20and_X20cause_X20a_X20restart_X2E_X22_X29_X3B_X27_X3E), + /* K27 */ be_nested_str(_X3Clabel_X3EChoose_X20a_X20device_X20configuration_X3A_X3C_X2Flabel_X3E_X3Cbr_X3E), + /* K28 */ be_nested_str(_X3Cselect_X20name_X3D_X27zip_X27_X3E), + /* K29 */ be_nested_str(load_templates), + /* K30 */ be_nested_str(_X3Coption_X20value_X3D_X27reset_X27_X3E_X26lt_X3BRemove_X20autoconf_X26gt_X3B_X3C_X2Foption_X3E), + /* K31 */ be_nested_str(_X3Coption_X20value_X3D_X27_X25s_X27_X3E_X25s_X3C_X2Foption_X3E), + /* K32 */ be_nested_str(stop_iteration), + /* K33 */ be_nested_str(_X3C_X2Fselect_X3E_X3Cp_X3E_X3C_X2Fp_X3E), + /* K34 */ be_nested_str(_X3Cbutton_X20name_X3D_X27zipapply_X27_X20class_X3D_X27button_X20bgrn_X27_X3EApply_X20configuration_X3C_X2Fbutton_X3E), + /* K35 */ be_nested_str(content_button), + /* K36 */ be_nested_str(BUTTON_CONFIGURATION), + /* K37 */ be_nested_str(content_stop), }), &be_const_str_page_autoconf_mgr, &be_const_str_solidified, @@ -589,56 +579,56 @@ be_local_closure(Autoconf_page_autoconf_mgr, /* name */ 0x581C0010, // 001F LDCONST R7 K16 0x7C140400, // 0020 CALL R5 2 0x8C140306, // 0021 GETMET R5 R1 K6 - 0x8C1C0511, // 0022 GETMET R7 R2 K17 - 0x58240012, // 0023 LDCONST R9 K18 - 0x7C1C0400, // 0024 CALL R7 2 + 0x601C0018, // 0022 GETGBL R7 G24 + 0x58200011, // 0023 LDCONST R8 K17 + 0x7C1C0200, // 0024 CALL R7 1 0x7C140400, // 0025 CALL R5 2 0x8C140306, // 0026 GETMET R5 R1 K6 - 0x8C1C0511, // 0027 GETMET R7 R2 K17 - 0x58240013, // 0028 LDCONST R9 K19 - 0x5C280800, // 0029 MOVE R10 R4 - 0x7C1C0600, // 002A CALL R7 3 + 0x601C0018, // 0027 GETGBL R7 G24 + 0x58200012, // 0028 LDCONST R8 K18 + 0x5C240800, // 0029 MOVE R9 R4 + 0x7C1C0400, // 002A CALL R7 2 0x7C140400, // 002B CALL R5 2 0x780E000B, // 002C JMPF R3 #0039 0x8C140306, // 002D GETMET R5 R1 K6 - 0x581C0014, // 002E LDCONST R7 K20 + 0x581C0013, // 002E LDCONST R7 K19 0x7C140400, // 002F CALL R5 2 0x8C140306, // 0030 GETMET R5 R1 K6 - 0x581C0015, // 0031 LDCONST R7 K21 + 0x581C0014, // 0031 LDCONST R7 K20 0x7C140400, // 0032 CALL R5 2 0x8C140306, // 0033 GETMET R5 R1 K6 - 0x581C0016, // 0034 LDCONST R7 K22 + 0x581C0015, // 0034 LDCONST R7 K21 0x7C140400, // 0035 CALL R5 2 0x8C140306, // 0036 GETMET R5 R1 K6 - 0x581C0017, // 0037 LDCONST R7 K23 + 0x581C0016, // 0037 LDCONST R7 K22 0x7C140400, // 0038 CALL R5 2 0x8C140306, // 0039 GETMET R5 R1 K6 - 0x581C0018, // 003A LDCONST R7 K24 + 0x581C0017, // 003A LDCONST R7 K23 0x7C140400, // 003B CALL R5 2 0x8C140306, // 003C GETMET R5 R1 K6 0x581C0010, // 003D LDCONST R7 K16 0x7C140400, // 003E CALL R5 2 0x8C140306, // 003F GETMET R5 R1 K6 - 0x8C1C0511, // 0040 GETMET R7 R2 K17 - 0x58240019, // 0041 LDCONST R9 K25 - 0x7C1C0400, // 0042 CALL R7 2 + 0x601C0018, // 0040 GETGBL R7 G24 + 0x58200018, // 0041 LDCONST R8 K24 + 0x7C1C0200, // 0042 CALL R7 1 0x7C140400, // 0043 CALL R5 2 0x8C140306, // 0044 GETMET R5 R1 K6 - 0x581C001A, // 0045 LDCONST R7 K26 + 0x581C0019, // 0045 LDCONST R7 K25 0x7C140400, // 0046 CALL R5 2 0x8C140306, // 0047 GETMET R5 R1 K6 - 0x581C001B, // 0048 LDCONST R7 K27 + 0x581C001A, // 0048 LDCONST R7 K26 0x7C140400, // 0049 CALL R5 2 0x8C140306, // 004A GETMET R5 R1 K6 - 0x581C001C, // 004B LDCONST R7 K28 + 0x581C001B, // 004B LDCONST R7 K27 0x7C140400, // 004C CALL R5 2 0x8C140306, // 004D GETMET R5 R1 K6 - 0x581C001D, // 004E LDCONST R7 K29 + 0x581C001C, // 004E LDCONST R7 K28 0x7C140400, // 004F CALL R5 2 - 0x8C14011E, // 0050 GETMET R5 R0 K30 + 0x8C14011D, // 0050 GETMET R5 R0 K29 0x7C140200, // 0051 CALL R5 1 0x8C180306, // 0052 GETMET R6 R1 K6 - 0x5820001F, // 0053 LDCONST R8 K31 + 0x5820001E, // 0053 LDCONST R8 K30 0x7C180400, // 0054 CALL R6 2 0x60180010, // 0055 GETGBL R6 G16 0x5C1C0A00, // 0056 MOVE R7 R5 @@ -647,36 +637,36 @@ be_local_closure(Autoconf_page_autoconf_mgr, /* name */ 0x5C1C0C00, // 0059 MOVE R7 R6 0x7C1C0000, // 005A CALL R7 0 0x8C200306, // 005B GETMET R8 R1 K6 - 0x8C280511, // 005C GETMET R10 R2 K17 - 0x58300020, // 005D LDCONST R12 K32 - 0x5C340E00, // 005E MOVE R13 R7 - 0x8C380509, // 005F GETMET R14 R2 K9 - 0x5C400E00, // 0060 MOVE R16 R7 - 0x5844000B, // 0061 LDCONST R17 K11 - 0x5848000C, // 0062 LDCONST R18 K12 - 0x7C380800, // 0063 CALL R14 4 - 0x7C280800, // 0064 CALL R10 4 + 0x60280018, // 005C GETGBL R10 G24 + 0x582C001F, // 005D LDCONST R11 K31 + 0x5C300E00, // 005E MOVE R12 R7 + 0x8C340509, // 005F GETMET R13 R2 K9 + 0x5C3C0E00, // 0060 MOVE R15 R7 + 0x5840000B, // 0061 LDCONST R16 K11 + 0x5844000C, // 0062 LDCONST R17 K12 + 0x7C340800, // 0063 CALL R13 4 + 0x7C280600, // 0064 CALL R10 3 0x7C200400, // 0065 CALL R8 2 0x7001FFF1, // 0066 JMP #0059 - 0x58180021, // 0067 LDCONST R6 K33 + 0x58180020, // 0067 LDCONST R6 K32 0xAC180200, // 0068 CATCH R6 1 0 0xB0080000, // 0069 RAISE 2 R0 R0 0x8C180306, // 006A GETMET R6 R1 K6 - 0x58200022, // 006B LDCONST R8 K34 + 0x58200021, // 006B LDCONST R8 K33 0x7C180400, // 006C CALL R6 2 0x8C180306, // 006D GETMET R6 R1 K6 - 0x58200023, // 006E LDCONST R8 K35 + 0x58200022, // 006E LDCONST R8 K34 0x7C180400, // 006F CALL R6 2 0x8C180306, // 0070 GETMET R6 R1 K6 - 0x58200017, // 0071 LDCONST R8 K23 + 0x58200016, // 0071 LDCONST R8 K22 0x7C180400, // 0072 CALL R6 2 0x8C180306, // 0073 GETMET R6 R1 K6 - 0x58200018, // 0074 LDCONST R8 K24 + 0x58200017, // 0074 LDCONST R8 K23 0x7C180400, // 0075 CALL R6 2 - 0x8C180324, // 0076 GETMET R6 R1 K36 - 0x88200325, // 0077 GETMBR R8 R1 K37 + 0x8C180323, // 0076 GETMET R6 R1 K35 + 0x88200324, // 0077 GETMBR R8 R1 K36 0x7C180400, // 0078 CALL R6 2 - 0x8C180326, // 0079 GETMET R6 R1 K38 + 0x8C180325, // 0079 GETMET R6 R1 K37 0x7C180200, // 007A CALL R6 1 0x80000000, // 007B RET 0 }) @@ -813,7 +803,7 @@ be_local_closure(Autoconf_set_first_time, /* name */ ********************************************************************/ be_local_closure(Autoconf_load_templates, /* name */ be_nested_proto( - 15, /* nstack */ + 13, /* nstack */ 1, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -821,118 +811,115 @@ be_local_closure(Autoconf_load_templates, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[21]) { /* constants */ - /* K0 */ be_nested_str(string), - /* K1 */ be_nested_str(json), - /* K2 */ be_nested_str(format), - /* K3 */ be_nested_str(https_X3A_X2F_X2Fraw_X2Egithubusercontent_X2Ecom_X2Ftasmota_X2Fautoconf_X2Fmain_X2F_X25s_manifest_X2Ejson), - /* K4 */ be_nested_str(tasmota), - /* K5 */ be_nested_str(arch), - /* K6 */ be_nested_str(log), - /* K7 */ be_nested_str(CFG_X3A_X20loading_X20_X27_X25s_X27), - /* K8 */ be_const_int(3), - /* K9 */ be_nested_str(webclient), - /* K10 */ be_nested_str(begin), - /* K11 */ be_nested_str(GET), - /* K12 */ be_nested_str(CFG_X3A_X20return_code_X3D_X25i), - /* K13 */ be_const_int(2), - /* K14 */ be_nested_str(get_string), - /* K15 */ be_nested_str(close), - /* K16 */ be_nested_str(load), - /* K17 */ be_nested_str(CFG_X3A_X20loaded_X20_X27_X25s_X27), - /* K18 */ be_nested_str(find), - /* K19 */ be_nested_str(files), - /* K20 */ be_nested_str(CFG_X3A_X20exception_X20_X27_X25s_X27_X20_X2D_X20_X27_X25s_X27), + ( &(const bvalue[19]) { /* constants */ + /* K0 */ be_nested_str(json), + /* K1 */ be_nested_str(https_X3A_X2F_X2Fraw_X2Egithubusercontent_X2Ecom_X2Ftasmota_X2Fautoconf_X2Fmain_X2F_X25s_manifest_X2Ejson), + /* K2 */ be_nested_str(tasmota), + /* K3 */ be_nested_str(arch), + /* K4 */ be_nested_str(log), + /* K5 */ be_nested_str(CFG_X3A_X20loading_X20_X27_X25s_X27), + /* K6 */ be_const_int(3), + /* K7 */ be_nested_str(webclient), + /* K8 */ be_nested_str(begin), + /* K9 */ be_nested_str(GET), + /* K10 */ be_nested_str(CFG_X3A_X20return_code_X3D_X25i), + /* K11 */ be_const_int(2), + /* K12 */ be_nested_str(get_string), + /* K13 */ be_nested_str(close), + /* K14 */ be_nested_str(load), + /* K15 */ be_nested_str(CFG_X3A_X20loaded_X20_X27_X25s_X27), + /* K16 */ be_nested_str(find), + /* K17 */ be_nested_str(files), + /* K18 */ be_nested_str(CFG_X3A_X20exception_X20_X27_X25s_X27_X20_X2D_X20_X27_X25s_X27), }), &be_const_str_load_templates, &be_const_str_solidified, - ( &(const binstruction[86]) { /* code */ + ( &(const binstruction[85]) { /* code */ 0xA4060000, // 0000 IMPORT R1 K0 - 0xA40A0200, // 0001 IMPORT R2 K1 - 0xA8020042, // 0002 EXBLK 0 #0046 - 0x8C0C0302, // 0003 GETMET R3 R1 K2 - 0x58140003, // 0004 LDCONST R5 K3 - 0xB81A0800, // 0005 GETNGBL R6 K4 - 0x8C180D05, // 0006 GETMET R6 R6 K5 - 0x7C180200, // 0007 CALL R6 1 - 0x7C0C0600, // 0008 CALL R3 3 - 0xB8120800, // 0009 GETNGBL R4 K4 - 0x8C100906, // 000A GETMET R4 R4 K6 - 0x8C180302, // 000B GETMET R6 R1 K2 - 0x58200007, // 000C LDCONST R8 K7 - 0x5C240600, // 000D MOVE R9 R3 - 0x7C180600, // 000E CALL R6 3 - 0x581C0008, // 000F LDCONST R7 K8 - 0x7C100600, // 0010 CALL R4 3 - 0xB8121200, // 0011 GETNGBL R4 K9 - 0x7C100000, // 0012 CALL R4 0 - 0x8C14090A, // 0013 GETMET R5 R4 K10 - 0x5C1C0600, // 0014 MOVE R7 R3 - 0x7C140400, // 0015 CALL R5 2 - 0x8C14090B, // 0016 GETMET R5 R4 K11 - 0x7C140200, // 0017 CALL R5 1 - 0x541A00C7, // 0018 LDINT R6 200 - 0x20180A06, // 0019 NE R6 R5 R6 - 0x781A000A, // 001A JMPF R6 #0026 - 0xB81A0800, // 001B GETNGBL R6 K4 - 0x8C180D06, // 001C GETMET R6 R6 K6 - 0x8C200302, // 001D GETMET R8 R1 K2 - 0x5828000C, // 001E LDCONST R10 K12 - 0x5C2C0A00, // 001F MOVE R11 R5 - 0x7C200600, // 0020 CALL R8 3 - 0x5824000D, // 0021 LDCONST R9 K13 - 0x7C180600, // 0022 CALL R6 3 - 0x4C180000, // 0023 LDNIL R6 - 0xA8040001, // 0024 EXBLK 1 1 - 0x80040C00, // 0025 RET 1 R6 - 0x8C18090E, // 0026 GETMET R6 R4 K14 - 0x7C180200, // 0027 CALL R6 1 - 0x8C1C090F, // 0028 GETMET R7 R4 K15 - 0x7C1C0200, // 0029 CALL R7 1 - 0x8C1C0510, // 002A GETMET R7 R2 K16 - 0x5C240C00, // 002B MOVE R9 R6 - 0x7C1C0400, // 002C CALL R7 2 - 0xB8220800, // 002D GETNGBL R8 K4 - 0x8C201106, // 002E GETMET R8 R8 K6 - 0x8C280302, // 002F GETMET R10 R1 K2 - 0x58300011, // 0030 LDCONST R12 K17 - 0x60340008, // 0031 GETGBL R13 G8 - 0x5C380E00, // 0032 MOVE R14 R7 - 0x7C340200, // 0033 CALL R13 1 - 0x7C280600, // 0034 CALL R10 3 - 0x582C0008, // 0035 LDCONST R11 K8 - 0x7C200600, // 0036 CALL R8 3 - 0x8C200F12, // 0037 GETMET R8 R7 K18 - 0x58280013, // 0038 LDCONST R10 K19 - 0x7C200400, // 0039 CALL R8 2 - 0x6024000F, // 003A GETGBL R9 G15 - 0x5C281000, // 003B MOVE R10 R8 - 0x602C0012, // 003C GETGBL R11 G18 - 0x7C240400, // 003D CALL R9 2 - 0x78260001, // 003E JMPF R9 #0041 - 0xA8040001, // 003F EXBLK 1 1 - 0x80041000, // 0040 RET 1 R8 - 0x4C240000, // 0041 LDNIL R9 - 0xA8040001, // 0042 EXBLK 1 1 - 0x80041200, // 0043 RET 1 R9 - 0xA8040001, // 0044 EXBLK 1 1 - 0x7002000E, // 0045 JMP #0055 - 0xAC0C0002, // 0046 CATCH R3 0 2 - 0x7002000B, // 0047 JMP #0054 - 0xB8160800, // 0048 GETNGBL R5 K4 - 0x8C140B06, // 0049 GETMET R5 R5 K6 - 0x8C1C0302, // 004A GETMET R7 R1 K2 - 0x58240014, // 004B LDCONST R9 K20 - 0x5C280600, // 004C MOVE R10 R3 - 0x5C2C0800, // 004D MOVE R11 R4 - 0x7C1C0800, // 004E CALL R7 4 - 0x5820000D, // 004F LDCONST R8 K13 - 0x7C140600, // 0050 CALL R5 3 - 0x4C140000, // 0051 LDNIL R5 - 0x80040A00, // 0052 RET 1 R5 - 0x70020000, // 0053 JMP #0055 - 0xB0080000, // 0054 RAISE 2 R0 R0 - 0x80000000, // 0055 RET 0 + 0xA8020042, // 0001 EXBLK 0 #0045 + 0x60080018, // 0002 GETGBL R2 G24 + 0x580C0001, // 0003 LDCONST R3 K1 + 0xB8120400, // 0004 GETNGBL R4 K2 + 0x8C100903, // 0005 GETMET R4 R4 K3 + 0x7C100200, // 0006 CALL R4 1 + 0x7C080400, // 0007 CALL R2 2 + 0xB80E0400, // 0008 GETNGBL R3 K2 + 0x8C0C0704, // 0009 GETMET R3 R3 K4 + 0x60140018, // 000A GETGBL R5 G24 + 0x58180005, // 000B LDCONST R6 K5 + 0x5C1C0400, // 000C MOVE R7 R2 + 0x7C140400, // 000D CALL R5 2 + 0x58180006, // 000E LDCONST R6 K6 + 0x7C0C0600, // 000F CALL R3 3 + 0xB80E0E00, // 0010 GETNGBL R3 K7 + 0x7C0C0000, // 0011 CALL R3 0 + 0x8C100708, // 0012 GETMET R4 R3 K8 + 0x5C180400, // 0013 MOVE R6 R2 + 0x7C100400, // 0014 CALL R4 2 + 0x8C100709, // 0015 GETMET R4 R3 K9 + 0x7C100200, // 0016 CALL R4 1 + 0x541600C7, // 0017 LDINT R5 200 + 0x20140805, // 0018 NE R5 R4 R5 + 0x7816000A, // 0019 JMPF R5 #0025 + 0xB8160400, // 001A GETNGBL R5 K2 + 0x8C140B04, // 001B GETMET R5 R5 K4 + 0x601C0018, // 001C GETGBL R7 G24 + 0x5820000A, // 001D LDCONST R8 K10 + 0x5C240800, // 001E MOVE R9 R4 + 0x7C1C0400, // 001F CALL R7 2 + 0x5820000B, // 0020 LDCONST R8 K11 + 0x7C140600, // 0021 CALL R5 3 + 0x4C140000, // 0022 LDNIL R5 + 0xA8040001, // 0023 EXBLK 1 1 + 0x80040A00, // 0024 RET 1 R5 + 0x8C14070C, // 0025 GETMET R5 R3 K12 + 0x7C140200, // 0026 CALL R5 1 + 0x8C18070D, // 0027 GETMET R6 R3 K13 + 0x7C180200, // 0028 CALL R6 1 + 0x8C18030E, // 0029 GETMET R6 R1 K14 + 0x5C200A00, // 002A MOVE R8 R5 + 0x7C180400, // 002B CALL R6 2 + 0xB81E0400, // 002C GETNGBL R7 K2 + 0x8C1C0F04, // 002D GETMET R7 R7 K4 + 0x60240018, // 002E GETGBL R9 G24 + 0x5828000F, // 002F LDCONST R10 K15 + 0x602C0008, // 0030 GETGBL R11 G8 + 0x5C300C00, // 0031 MOVE R12 R6 + 0x7C2C0200, // 0032 CALL R11 1 + 0x7C240400, // 0033 CALL R9 2 + 0x58280006, // 0034 LDCONST R10 K6 + 0x7C1C0600, // 0035 CALL R7 3 + 0x8C1C0D10, // 0036 GETMET R7 R6 K16 + 0x58240011, // 0037 LDCONST R9 K17 + 0x7C1C0400, // 0038 CALL R7 2 + 0x6020000F, // 0039 GETGBL R8 G15 + 0x5C240E00, // 003A MOVE R9 R7 + 0x60280012, // 003B GETGBL R10 G18 + 0x7C200400, // 003C CALL R8 2 + 0x78220001, // 003D JMPF R8 #0040 + 0xA8040001, // 003E EXBLK 1 1 + 0x80040E00, // 003F RET 1 R7 + 0x4C200000, // 0040 LDNIL R8 + 0xA8040001, // 0041 EXBLK 1 1 + 0x80041000, // 0042 RET 1 R8 + 0xA8040001, // 0043 EXBLK 1 1 + 0x7002000E, // 0044 JMP #0054 + 0xAC080002, // 0045 CATCH R2 0 2 + 0x7002000B, // 0046 JMP #0053 + 0xB8120400, // 0047 GETNGBL R4 K2 + 0x8C100904, // 0048 GETMET R4 R4 K4 + 0x60180018, // 0049 GETGBL R6 G24 + 0x581C0012, // 004A LDCONST R7 K18 + 0x5C200400, // 004B MOVE R8 R2 + 0x5C240600, // 004C MOVE R9 R3 + 0x7C180600, // 004D CALL R6 3 + 0x581C000B, // 004E LDCONST R7 K11 + 0x7C100600, // 004F CALL R4 3 + 0x4C100000, // 0050 LDNIL R4 + 0x80040800, // 0051 RET 1 R4 + 0x70020000, // 0052 JMP #0054 + 0xB0080000, // 0053 RAISE 2 R0 R0 + 0x80000000, // 0054 RET 0 }) ) ); @@ -1011,7 +998,7 @@ be_local_closure(Autoconf_is_first_time, /* name */ ********************************************************************/ be_local_closure(Autoconf_init, /* name */ be_nested_proto( - 13, /* nstack */ + 12, /* nstack */ 1, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -1019,7 +1006,7 @@ be_local_closure(Autoconf_init, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[18]) { /* constants */ + ( &(const bvalue[17]) { /* constants */ /* K0 */ be_nested_str(path), /* K1 */ be_nested_str(string), /* K2 */ be_nested_str(listdir), @@ -1030,14 +1017,13 @@ be_local_closure(Autoconf_init, /* name */ /* K7 */ be_nested_str(find), /* K8 */ be_nested_str(_X2Eautoconf), /* K9 */ be_nested_str(log), - /* K10 */ be_nested_str(format), - /* K11 */ be_nested_str(CFG_X3A_X20multiple_X20autoconf_X20files_X20found_X2C_X20aborting_X20_X28_X27_X25s_X27_X20_X2B_X20_X27_X25s_X27_X29), - /* K12 */ be_const_int(2), - /* K13 */ be_nested_str(_error), - /* K14 */ be_const_int(1), - /* K15 */ be_nested_str(CFG_X3A_X20No_X20_X27_X2A_X2Eautoconf_X27_X20file_X20found), - /* K16 */ be_const_int(3), - /* K17 */ be_nested_str(_archive), + /* K10 */ be_nested_str(CFG_X3A_X20multiple_X20autoconf_X20files_X20found_X2C_X20aborting_X20_X28_X27_X25s_X27_X20_X2B_X20_X27_X25s_X27_X29), + /* K11 */ be_const_int(2), + /* K12 */ be_nested_str(_error), + /* K13 */ be_const_int(1), + /* K14 */ be_nested_str(CFG_X3A_X20No_X20_X27_X2A_X2Eautoconf_X27_X20file_X20found), + /* K15 */ be_const_int(3), + /* K16 */ be_nested_str(_archive), }), &be_const_str_init, &be_const_str_solidified, @@ -1069,31 +1055,31 @@ be_local_closure(Autoconf_init, /* name */ 0x781A000C, // 0018 JMPF R6 #0026 0xB81A0800, // 0019 GETNGBL R6 K4 0x8C180D09, // 001A GETMET R6 R6 K9 - 0x8C20050A, // 001B GETMET R8 R2 K10 - 0x5828000B, // 001C LDCONST R10 K11 - 0x5C2C0800, // 001D MOVE R11 R4 - 0x94300605, // 001E GETIDX R12 R3 R5 - 0x7C200800, // 001F CALL R8 4 - 0x5824000C, // 0020 LDCONST R9 K12 + 0x60200018, // 001B GETGBL R8 G24 + 0x5824000A, // 001C LDCONST R9 K10 + 0x5C280800, // 001D MOVE R10 R4 + 0x942C0605, // 001E GETIDX R11 R3 R5 + 0x7C200600, // 001F CALL R8 3 + 0x5824000B, // 0020 LDCONST R9 K11 0x7C180600, // 0021 CALL R6 3 0x50180200, // 0022 LDBOOL R6 1 0 - 0x90021A06, // 0023 SETMBR R0 K13 R6 + 0x90021806, // 0023 SETMBR R0 K12 R6 0x4C180000, // 0024 LDNIL R6 0x80040C00, // 0025 RET 1 R6 0x94100605, // 0026 GETIDX R4 R3 R5 - 0x00140B0E, // 0027 ADD R5 R5 K14 + 0x00140B0D, // 0027 ADD R5 R5 K13 0x7001FFE1, // 0028 JMP #000B 0x4C180000, // 0029 LDNIL R6 0x1C180806, // 002A EQ R6 R4 R6 0x781A0006, // 002B JMPF R6 #0033 0xB81A0800, // 002C GETNGBL R6 K4 0x8C180D09, // 002D GETMET R6 R6 K9 - 0x5820000F, // 002E LDCONST R8 K15 - 0x58240010, // 002F LDCONST R9 K16 + 0x5820000E, // 002E LDCONST R8 K14 + 0x5824000F, // 002F LDCONST R9 K15 0x7C180600, // 0030 CALL R6 3 0x4C180000, // 0031 LDNIL R6 0x80040C00, // 0032 RET 1 R6 - 0x90022204, // 0033 SETMBR R0 K17 R4 + 0x90022004, // 0033 SETMBR R0 K16 R4 0x80000000, // 0034 RET 0 }) ) @@ -1166,7 +1152,7 @@ be_local_closure(Autoconf_preinit, /* name */ ********************************************************************/ be_local_closure(Autoconf_reset, /* name */ be_nested_proto( - 12, /* nstack */ + 11, /* nstack */ 1, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -1174,7 +1160,7 @@ be_local_closure(Autoconf_reset, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[13]) { /* constants */ + ( &(const bvalue[12]) { /* constants */ /* K0 */ be_nested_str(path), /* K1 */ be_nested_str(string), /* K2 */ be_nested_str(listdir), @@ -1183,11 +1169,10 @@ be_local_closure(Autoconf_reset, /* name */ /* K5 */ be_nested_str(find), /* K6 */ be_nested_str(_X2Eautoconf), /* K7 */ be_nested_str(remove), - /* K8 */ be_nested_str(format), - /* K9 */ be_nested_str(CFG_X3A_X20removed_X20file_X20_X27_X25s_X27), - /* K10 */ be_const_int(1), - /* K11 */ be_nested_str(_archive), - /* K12 */ be_nested_str(_error), + /* K8 */ be_nested_str(CFG_X3A_X20removed_X20file_X20_X27_X25s_X27), + /* K9 */ be_const_int(1), + /* K10 */ be_nested_str(_archive), + /* K11 */ be_nested_str(_error), }), &be_const_str_reset, &be_const_str_solidified, @@ -1215,17 +1200,17 @@ be_local_closure(Autoconf_reset, /* name */ 0x5C240C00, // 0014 MOVE R9 R6 0x7C1C0400, // 0015 CALL R7 2 0x601C0001, // 0016 GETGBL R7 G1 - 0x8C200508, // 0017 GETMET R8 R2 K8 - 0x58280009, // 0018 LDCONST R10 K9 - 0x5C2C0C00, // 0019 MOVE R11 R6 - 0x7C200600, // 001A CALL R8 3 + 0x60200018, // 0017 GETGBL R8 G24 + 0x58240008, // 0018 LDCONST R9 K8 + 0x5C280C00, // 0019 MOVE R10 R6 + 0x7C200400, // 001A CALL R8 2 0x7C1C0200, // 001B CALL R7 1 - 0x00140B0A, // 001C ADD R5 R5 K10 + 0x00140B09, // 001C ADD R5 R5 K9 0x7001FFE8, // 001D JMP #0007 0x4C180000, // 001E LDNIL R6 - 0x90021606, // 001F SETMBR R0 K11 R6 + 0x90021406, // 001F SETMBR R0 K10 R6 0x4C180000, // 0020 LDNIL R6 - 0x90021806, // 0021 SETMBR R0 K12 R6 + 0x90021606, // 0021 SETMBR R0 K11 R6 0x80000000, // 0022 RET 0 }) ) diff --git a/lib/libesp32/berry_tasmota/src/solidify/solidified_hue_bridge.h b/lib/libesp32/berry_tasmota/src/solidify/solidified_hue_bridge.h index caad7d225..1b026afda 100644 --- a/lib/libesp32/berry_tasmota/src/solidify/solidified_hue_bridge.h +++ b/lib/libesp32/berry_tasmota/src/solidify/solidified_hue_bridge.h @@ -243,7 +243,7 @@ be_local_closure(hue_bridge_monad_init, /* name */ ********************************************************************/ be_local_closure(hue_bridge_monad_discover, /* name */ be_nested_proto( - 11, /* nstack */ + 10, /* nstack */ 1, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -251,64 +251,62 @@ be_local_closure(hue_bridge_monad_discover, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[13]) { /* constants */ + ( &(const bvalue[12]) { /* constants */ /* K0 */ be_nested_str(hue_ntv), /* K1 */ be_nested_str(json), - /* K2 */ be_nested_str(string), - /* K3 */ be_nested_str(lights), - /* K4 */ be_nested_str(keys), - /* K5 */ be_nested_str(full_status), - /* K6 */ be_nested_str(_X22), - /* K7 */ be_nested_str(_X22_X3A), - /* K8 */ be_nested_str(push), - /* K9 */ be_nested_str(stop_iteration), - /* K10 */ be_const_int(0), - /* K11 */ be_nested_str(concat), - /* K12 */ be_nested_str(_X2C), + /* K2 */ be_nested_str(lights), + /* K3 */ be_nested_str(keys), + /* K4 */ be_nested_str(full_status), + /* K5 */ be_nested_str(_X22), + /* K6 */ be_nested_str(_X22_X3A), + /* K7 */ be_nested_str(push), + /* K8 */ be_nested_str(stop_iteration), + /* K9 */ be_const_int(0), + /* K10 */ be_nested_str(concat), + /* K11 */ be_nested_str(_X2C), }), &be_const_str_discover, &be_const_str_solidified, - ( &(const binstruction[40]) { /* code */ + ( &(const binstruction[39]) { /* code */ 0xA4060000, // 0000 IMPORT R1 K0 0xA40A0200, // 0001 IMPORT R2 K1 - 0xA40E0400, // 0002 IMPORT R3 K2 - 0x60100012, // 0003 GETGBL R4 G18 - 0x7C100000, // 0004 CALL R4 0 - 0x60140010, // 0005 GETGBL R5 G16 - 0x88180103, // 0006 GETMBR R6 R0 K3 - 0x8C180D04, // 0007 GETMET R6 R6 K4 - 0x7C180200, // 0008 CALL R6 1 - 0x7C140200, // 0009 CALL R5 1 - 0xA802000F, // 000A EXBLK 0 #001B - 0x5C180A00, // 000B MOVE R6 R5 - 0x7C180000, // 000C CALL R6 0 - 0x8C1C0105, // 000D GETMET R7 R0 K5 - 0x5C240C00, // 000E MOVE R9 R6 - 0x7C1C0400, // 000F CALL R7 2 - 0x781E0008, // 0010 JMPF R7 #001A - 0x60200008, // 0011 GETGBL R8 G8 - 0x5C240C00, // 0012 MOVE R9 R6 - 0x7C200200, // 0013 CALL R8 1 - 0x00220C08, // 0014 ADD R8 K6 R8 - 0x00201107, // 0015 ADD R8 R8 K7 - 0x001C1007, // 0016 ADD R7 R8 R7 - 0x8C200908, // 0017 GETMET R8 R4 K8 - 0x5C280E00, // 0018 MOVE R10 R7 - 0x7C200400, // 0019 CALL R8 2 - 0x7001FFEF, // 001A JMP #000B - 0x58140009, // 001B LDCONST R5 K9 - 0xAC140200, // 001C CATCH R5 1 0 - 0xB0080000, // 001D RAISE 2 R0 R0 - 0x6014000C, // 001E GETGBL R5 G12 - 0x5C180800, // 001F MOVE R6 R4 - 0x7C140200, // 0020 CALL R5 1 - 0x24140B0A, // 0021 GT R5 R5 K10 - 0x78160003, // 0022 JMPF R5 #0027 - 0x8C14090B, // 0023 GETMET R5 R4 K11 - 0x581C000C, // 0024 LDCONST R7 K12 - 0x7C140400, // 0025 CALL R5 2 - 0x80040A00, // 0026 RET 1 R5 - 0x80000000, // 0027 RET 0 + 0x600C0012, // 0002 GETGBL R3 G18 + 0x7C0C0000, // 0003 CALL R3 0 + 0x60100010, // 0004 GETGBL R4 G16 + 0x88140102, // 0005 GETMBR R5 R0 K2 + 0x8C140B03, // 0006 GETMET R5 R5 K3 + 0x7C140200, // 0007 CALL R5 1 + 0x7C100200, // 0008 CALL R4 1 + 0xA802000F, // 0009 EXBLK 0 #001A + 0x5C140800, // 000A MOVE R5 R4 + 0x7C140000, // 000B CALL R5 0 + 0x8C180104, // 000C GETMET R6 R0 K4 + 0x5C200A00, // 000D MOVE R8 R5 + 0x7C180400, // 000E CALL R6 2 + 0x781A0008, // 000F JMPF R6 #0019 + 0x601C0008, // 0010 GETGBL R7 G8 + 0x5C200A00, // 0011 MOVE R8 R5 + 0x7C1C0200, // 0012 CALL R7 1 + 0x001E0A07, // 0013 ADD R7 K5 R7 + 0x001C0F06, // 0014 ADD R7 R7 K6 + 0x00180E06, // 0015 ADD R6 R7 R6 + 0x8C1C0707, // 0016 GETMET R7 R3 K7 + 0x5C240C00, // 0017 MOVE R9 R6 + 0x7C1C0400, // 0018 CALL R7 2 + 0x7001FFEF, // 0019 JMP #000A + 0x58100008, // 001A LDCONST R4 K8 + 0xAC100200, // 001B CATCH R4 1 0 + 0xB0080000, // 001C RAISE 2 R0 R0 + 0x6010000C, // 001D GETGBL R4 G12 + 0x5C140600, // 001E MOVE R5 R3 + 0x7C100200, // 001F CALL R4 1 + 0x24100909, // 0020 GT R4 R4 K9 + 0x78120003, // 0021 JMPF R4 #0026 + 0x8C10070A, // 0022 GETMET R4 R3 K10 + 0x5818000B, // 0023 LDCONST R6 K11 + 0x7C100400, // 0024 CALL R4 2 + 0x80040800, // 0025 RET 1 R4 + 0x80000000, // 0026 RET 0 }) ) ); diff --git a/lib/libesp32/berry_tasmota/src/solidify/solidified_i2c_axp192.h b/lib/libesp32/berry_tasmota/src/solidify/solidified_i2c_axp192.h index 2ef43a553..efad30e7a 100644 --- a/lib/libesp32/berry_tasmota/src/solidify/solidified_i2c_axp192.h +++ b/lib/libesp32/berry_tasmota/src/solidify/solidified_i2c_axp192.h @@ -72,7 +72,7 @@ be_local_closure(AXP192_get_bat_power, /* name */ 1, /* has constants */ ( &(const bvalue[ 2]) { /* constants */ /* K0 */ be_nested_str(read24), - /* K1 */ be_const_real_hex(0x3A102DE0), + /* K1 */ be_const_real_hex(0x3A102DE1), }), &be_const_str_get_bat_power, &be_const_str_solidified, @@ -516,7 +516,7 @@ be_local_closure(AXP192_set_ldo_voltage, /* name */ ********************************************************************/ be_local_closure(AXP192_json_append, /* name */ be_nested_proto( - 11, /* nstack */ + 9, /* nstack */ 1, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -524,44 +524,41 @@ be_local_closure(AXP192_json_append, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[10]) { /* constants */ + ( &(const bvalue[ 8]) { /* constants */ /* K0 */ be_nested_str(wire), - /* K1 */ be_nested_str(string), - /* K2 */ be_nested_str(format), - /* K3 */ be_nested_str(_X2C_X22AXP192_X22_X3A_X7B_X22VBusVoltage_X22_X3A_X25_X2E3f_X2C_X22VBusCurrent_X22_X3A_X25_X2E1f_X2C_X22BattVoltage_X22_X3A_X25_X2E3f_X2C_X22BattCurrent_X22_X3A_X25_X2E1f_X2C_X22Temperature_X22_X3A_X25_X2E1f_X7D), - /* K4 */ be_nested_str(get_vbus_voltage), - /* K5 */ be_nested_str(get_bat_voltage), - /* K6 */ be_nested_str(get_bat_current), - /* K7 */ be_nested_str(get_temp), - /* K8 */ be_nested_str(tasmota), - /* K9 */ be_nested_str(response_append), + /* K1 */ be_nested_str(_X2C_X22AXP192_X22_X3A_X7B_X22VBusVoltage_X22_X3A_X25_X2E3f_X2C_X22VBusCurrent_X22_X3A_X25_X2E1f_X2C_X22BattVoltage_X22_X3A_X25_X2E3f_X2C_X22BattCurrent_X22_X3A_X25_X2E1f_X2C_X22Temperature_X22_X3A_X25_X2E1f_X7D), + /* K2 */ be_nested_str(get_vbus_voltage), + /* K3 */ be_nested_str(get_bat_voltage), + /* K4 */ be_nested_str(get_bat_current), + /* K5 */ be_nested_str(get_temp), + /* K6 */ be_nested_str(tasmota), + /* K7 */ be_nested_str(response_append), }), &be_const_str_json_append, &be_const_str_solidified, - ( &(const binstruction[23]) { /* code */ + ( &(const binstruction[22]) { /* code */ 0x88040100, // 0000 GETMBR R1 R0 K0 0x74060001, // 0001 JMPT R1 #0004 0x4C040000, // 0002 LDNIL R1 0x80040200, // 0003 RET 1 R1 - 0xA4060200, // 0004 IMPORT R1 K1 - 0x8C080302, // 0005 GETMET R2 R1 K2 - 0x58100003, // 0006 LDCONST R4 K3 - 0x8C140104, // 0007 GETMET R5 R0 K4 - 0x7C140200, // 0008 CALL R5 1 - 0x8C180104, // 0009 GETMET R6 R0 K4 - 0x7C180200, // 000A CALL R6 1 - 0x8C1C0105, // 000B GETMET R7 R0 K5 - 0x7C1C0200, // 000C CALL R7 1 - 0x8C200106, // 000D GETMET R8 R0 K6 - 0x7C200200, // 000E CALL R8 1 - 0x8C240107, // 000F GETMET R9 R0 K7 - 0x7C240200, // 0010 CALL R9 1 - 0x7C080E00, // 0011 CALL R2 7 - 0xB80E1000, // 0012 GETNGBL R3 K8 - 0x8C0C0709, // 0013 GETMET R3 R3 K9 - 0x5C140400, // 0014 MOVE R5 R2 - 0x7C0C0400, // 0015 CALL R3 2 - 0x80000000, // 0016 RET 0 + 0x60040018, // 0004 GETGBL R1 G24 + 0x58080001, // 0005 LDCONST R2 K1 + 0x8C0C0102, // 0006 GETMET R3 R0 K2 + 0x7C0C0200, // 0007 CALL R3 1 + 0x8C100102, // 0008 GETMET R4 R0 K2 + 0x7C100200, // 0009 CALL R4 1 + 0x8C140103, // 000A GETMET R5 R0 K3 + 0x7C140200, // 000B CALL R5 1 + 0x8C180104, // 000C GETMET R6 R0 K4 + 0x7C180200, // 000D CALL R6 1 + 0x8C1C0105, // 000E GETMET R7 R0 K5 + 0x7C1C0200, // 000F CALL R7 1 + 0x7C040C00, // 0010 CALL R1 6 + 0xB80A0C00, // 0011 GETNGBL R2 K6 + 0x8C080507, // 0012 GETMET R2 R2 K7 + 0x5C100200, // 0013 MOVE R4 R1 + 0x7C080400, // 0014 CALL R2 2 + 0x80000000, // 0015 RET 0 }) ) ); @@ -644,7 +641,7 @@ be_local_closure(AXP192_get_bat_current, /* name */ ********************************************************************/ be_local_closure(AXP192_web_sensor, /* name */ be_nested_proto( - 11, /* nstack */ + 9, /* nstack */ 1, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -652,51 +649,48 @@ be_local_closure(AXP192_web_sensor, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[14]) { /* constants */ + ( &(const bvalue[12]) { /* constants */ /* K0 */ be_nested_str(wire), - /* K1 */ be_nested_str(string), - /* K2 */ be_nested_str(format), - /* K3 */ be_nested_str(_X7Bs_X7DVBus_X20Voltage_X7Bm_X7D_X25_X2E3f_X20V_X7Be_X7D), - /* K4 */ be_nested_str(_X7Bs_X7DVBus_X20Current_X7Bm_X7D_X25_X2E1f_X20mA_X7Be_X7D), - /* K5 */ be_nested_str(_X7Bs_X7DBatt_X20Voltage_X7Bm_X7D_X25_X2E3f_X20V_X7Be_X7D), - /* K6 */ be_nested_str(_X7Bs_X7DBatt_X20Current_X7Bm_X7D_X25_X2E1f_X20mA_X7Be_X7D), - /* K7 */ be_nested_str(_X7Bs_X7DTemp_X20AXP_X7Bm_X7D_X25_X2E1f_X20_X26deg_X3BC_X7Be_X7D), - /* K8 */ be_nested_str(get_vbus_voltage), - /* K9 */ be_nested_str(get_bat_voltage), - /* K10 */ be_nested_str(get_bat_current), - /* K11 */ be_nested_str(get_temp), - /* K12 */ be_nested_str(tasmota), - /* K13 */ be_nested_str(web_send_decimal), + /* K1 */ be_nested_str(_X7Bs_X7DVBus_X20Voltage_X7Bm_X7D_X25_X2E3f_X20V_X7Be_X7D), + /* K2 */ be_nested_str(_X7Bs_X7DVBus_X20Current_X7Bm_X7D_X25_X2E1f_X20mA_X7Be_X7D), + /* K3 */ be_nested_str(_X7Bs_X7DBatt_X20Voltage_X7Bm_X7D_X25_X2E3f_X20V_X7Be_X7D), + /* K4 */ be_nested_str(_X7Bs_X7DBatt_X20Current_X7Bm_X7D_X25_X2E1f_X20mA_X7Be_X7D), + /* K5 */ be_nested_str(_X7Bs_X7DTemp_X20AXP_X7Bm_X7D_X25_X2E1f_X20_X26deg_X3BC_X7Be_X7D), + /* K6 */ be_nested_str(get_vbus_voltage), + /* K7 */ be_nested_str(get_bat_voltage), + /* K8 */ be_nested_str(get_bat_current), + /* K9 */ be_nested_str(get_temp), + /* K10 */ be_nested_str(tasmota), + /* K11 */ be_nested_str(web_send_decimal), }), &be_const_str_web_sensor, &be_const_str_solidified, - ( &(const binstruction[26]) { /* code */ + ( &(const binstruction[25]) { /* code */ 0x88040100, // 0000 GETMBR R1 R0 K0 0x74060001, // 0001 JMPT R1 #0004 0x4C040000, // 0002 LDNIL R1 0x80040200, // 0003 RET 1 R1 - 0xA4060200, // 0004 IMPORT R1 K1 - 0x8C080302, // 0005 GETMET R2 R1 K2 - 0x40120704, // 0006 CONNECT R4 K3 K4 - 0x40100905, // 0007 CONNECT R4 R4 K5 - 0x40100906, // 0008 CONNECT R4 R4 K6 - 0x40100907, // 0009 CONNECT R4 R4 K7 - 0x8C140108, // 000A GETMET R5 R0 K8 - 0x7C140200, // 000B CALL R5 1 - 0x8C180108, // 000C GETMET R6 R0 K8 - 0x7C180200, // 000D CALL R6 1 - 0x8C1C0109, // 000E GETMET R7 R0 K9 - 0x7C1C0200, // 000F CALL R7 1 - 0x8C20010A, // 0010 GETMET R8 R0 K10 - 0x7C200200, // 0011 CALL R8 1 - 0x8C24010B, // 0012 GETMET R9 R0 K11 - 0x7C240200, // 0013 CALL R9 1 - 0x7C080E00, // 0014 CALL R2 7 - 0xB80E1800, // 0015 GETNGBL R3 K12 - 0x8C0C070D, // 0016 GETMET R3 R3 K13 - 0x5C140400, // 0017 MOVE R5 R2 - 0x7C0C0400, // 0018 CALL R3 2 - 0x80000000, // 0019 RET 0 + 0x60040018, // 0004 GETGBL R1 G24 + 0x400A0302, // 0005 CONNECT R2 K1 K2 + 0x40080503, // 0006 CONNECT R2 R2 K3 + 0x40080504, // 0007 CONNECT R2 R2 K4 + 0x40080505, // 0008 CONNECT R2 R2 K5 + 0x8C0C0106, // 0009 GETMET R3 R0 K6 + 0x7C0C0200, // 000A CALL R3 1 + 0x8C100106, // 000B GETMET R4 R0 K6 + 0x7C100200, // 000C CALL R4 1 + 0x8C140107, // 000D GETMET R5 R0 K7 + 0x7C140200, // 000E CALL R5 1 + 0x8C180108, // 000F GETMET R6 R0 K8 + 0x7C180200, // 0010 CALL R6 1 + 0x8C1C0109, // 0011 GETMET R7 R0 K9 + 0x7C1C0200, // 0012 CALL R7 1 + 0x7C040C00, // 0013 CALL R1 6 + 0xB80A1400, // 0014 GETNGBL R2 K10 + 0x8C08050B, // 0015 GETMET R2 R2 K11 + 0x5C100200, // 0016 MOVE R4 R1 + 0x7C080400, // 0017 CALL R2 2 + 0x80000000, // 0018 RET 0 }) ) ); diff --git a/lib/libesp32/berry_tasmota/src/solidify/solidified_i2c_axp202.h b/lib/libesp32/berry_tasmota/src/solidify/solidified_i2c_axp202.h index a912b0660..4d8199e1d 100644 --- a/lib/libesp32/berry_tasmota/src/solidify/solidified_i2c_axp202.h +++ b/lib/libesp32/berry_tasmota/src/solidify/solidified_i2c_axp202.h @@ -172,7 +172,7 @@ be_local_closure(AXP202_get_bat_power, /* name */ 1, /* has constants */ ( &(const bvalue[ 2]) { /* constants */ /* K0 */ be_nested_str(read24), - /* K1 */ be_const_real_hex(0x3A102DE0), + /* K1 */ be_const_real_hex(0x3A102DE1), }), &be_const_str_get_bat_power, &be_const_str_solidified, diff --git a/lib/libesp32/berry_tasmota/src/solidify/solidified_lv_tasmota_widgets.h b/lib/libesp32/berry_tasmota/src/solidify/solidified_lv_tasmota_widgets.h index bd85dbbb2..380bbc756 100644 --- a/lib/libesp32/berry_tasmota/src/solidify/solidified_lv_tasmota_widgets.h +++ b/lib/libesp32/berry_tasmota/src/solidify/solidified_lv_tasmota_widgets.h @@ -11,7 +11,7 @@ extern const bclass be_class_lv_clock; ********************************************************************/ be_local_closure(lv_clock_set_time, /* name */ be_nested_proto( - 11, /* nstack */ + 9, /* nstack */ 4, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -19,48 +19,45 @@ be_local_closure(lv_clock_set_time, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[10]) { /* constants */ - /* K0 */ be_nested_str_weak(string), - /* K1 */ be_nested_str_weak(hour), - /* K2 */ be_nested_str_weak(minute), - /* K3 */ be_nested_str_weak(sec), - /* K4 */ be_nested_str_weak(format), - /* K5 */ be_nested_str_weak(_X2502d_X25s_X2502d), - /* K6 */ be_const_int(2), - /* K7 */ be_nested_str_weak(_X3A), - /* K8 */ be_nested_str_weak(_X20), - /* K9 */ be_nested_str_weak(set_text), + ( &(const bvalue[ 8]) { /* constants */ + /* K0 */ be_nested_str_weak(hour), + /* K1 */ be_nested_str_weak(minute), + /* K2 */ be_nested_str_weak(sec), + /* K3 */ be_nested_str_weak(_X2502d_X25s_X2502d), + /* K4 */ be_const_int(2), + /* K5 */ be_nested_str_weak(_X3A), + /* K6 */ be_nested_str_weak(_X20), + /* K7 */ be_nested_str_weak(set_text), }), be_str_weak(set_time), &be_const_str_solidified, - ( &(const binstruction[27]) { /* code */ - 0xA4120000, // 0000 IMPORT R4 K0 - 0x88140101, // 0001 GETMBR R5 R0 K1 - 0x20140205, // 0002 NE R5 R1 R5 - 0x74160005, // 0003 JMPT R5 #000A - 0x88140102, // 0004 GETMBR R5 R0 K2 - 0x20140405, // 0005 NE R5 R2 R5 - 0x74160002, // 0006 JMPT R5 #000A - 0x88140103, // 0007 GETMBR R5 R0 K3 - 0x20140605, // 0008 NE R5 R3 R5 - 0x7816000F, // 0009 JMPF R5 #001A - 0x8C140904, // 000A GETMET R5 R4 K4 - 0x581C0005, // 000B LDCONST R7 K5 - 0x5C200200, // 000C MOVE R8 R1 - 0x10240706, // 000D MOD R9 R3 K6 - 0x78260001, // 000E JMPF R9 #0011 - 0x58240007, // 000F LDCONST R9 K7 - 0x70020000, // 0010 JMP #0012 - 0x58240008, // 0011 LDCONST R9 K8 - 0x5C280400, // 0012 MOVE R10 R2 - 0x7C140A00, // 0013 CALL R5 5 - 0x90020201, // 0014 SETMBR R0 K1 R1 - 0x90020402, // 0015 SETMBR R0 K2 R2 - 0x90020603, // 0016 SETMBR R0 K3 R3 - 0x8C180109, // 0017 GETMET R6 R0 K9 - 0x5C200A00, // 0018 MOVE R8 R5 - 0x7C180400, // 0019 CALL R6 2 - 0x80000000, // 001A RET 0 + ( &(const binstruction[26]) { /* code */ + 0x88100100, // 0000 GETMBR R4 R0 K0 + 0x20100204, // 0001 NE R4 R1 R4 + 0x74120005, // 0002 JMPT R4 #0009 + 0x88100101, // 0003 GETMBR R4 R0 K1 + 0x20100404, // 0004 NE R4 R2 R4 + 0x74120002, // 0005 JMPT R4 #0009 + 0x88100102, // 0006 GETMBR R4 R0 K2 + 0x20100604, // 0007 NE R4 R3 R4 + 0x7812000F, // 0008 JMPF R4 #0019 + 0x60100018, // 0009 GETGBL R4 G24 + 0x58140003, // 000A LDCONST R5 K3 + 0x5C180200, // 000B MOVE R6 R1 + 0x101C0704, // 000C MOD R7 R3 K4 + 0x781E0001, // 000D JMPF R7 #0010 + 0x581C0005, // 000E LDCONST R7 K5 + 0x70020000, // 000F JMP #0011 + 0x581C0006, // 0010 LDCONST R7 K6 + 0x5C200400, // 0011 MOVE R8 R2 + 0x7C100800, // 0012 CALL R4 4 + 0x90020001, // 0013 SETMBR R0 K0 R1 + 0x90020202, // 0014 SETMBR R0 K1 R2 + 0x90020403, // 0015 SETMBR R0 K2 R3 + 0x8C140107, // 0016 GETMET R5 R0 K7 + 0x5C1C0800, // 0017 MOVE R7 R4 + 0x7C140400, // 0018 CALL R5 2 + 0x80000000, // 0019 RET 0 }) ) ); diff --git a/lib/libesp32/berry_tasmota/src/solidify/solidified_mqtt.h b/lib/libesp32/berry_tasmota/src/solidify/solidified_mqtt.h index 48d49ae2e..ee62524d6 100644 --- a/lib/libesp32/berry_tasmota/src/solidify/solidified_mqtt.h +++ b/lib/libesp32/berry_tasmota/src/solidify/solidified_mqtt.h @@ -268,7 +268,7 @@ extern const bclass be_class_mqtt_listener; ********************************************************************/ be_local_closure(mqtt_listener_tostring, /* name */ be_nested_proto( - 7, /* nstack */ + 5, /* nstack */ 1, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -276,24 +276,21 @@ be_local_closure(mqtt_listener_tostring, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[ 4]) { /* constants */ - /* K0 */ be_nested_str(string), - /* K1 */ be_nested_str(format), - /* K2 */ be_nested_str(_X3Cinstance_X3A_X20_X25s_X28_X27_X25s_X27_X29_X3E), - /* K3 */ be_nested_str(fulltopic), + ( &(const bvalue[ 2]) { /* constants */ + /* K0 */ be_nested_str(_X3Cinstance_X3A_X20_X25s_X28_X27_X25s_X27_X29_X3E), + /* K1 */ be_nested_str(fulltopic), }), &be_const_str_tostring, &be_const_str_solidified, - ( &(const binstruction[ 9]) { /* code */ - 0xA4060000, // 0000 IMPORT R1 K0 - 0x8C080301, // 0001 GETMET R2 R1 K1 - 0x58100002, // 0002 LDCONST R4 K2 - 0x60140005, // 0003 GETGBL R5 G5 - 0x5C180000, // 0004 MOVE R6 R0 - 0x7C140200, // 0005 CALL R5 1 - 0x88180103, // 0006 GETMBR R6 R0 K3 - 0x7C080800, // 0007 CALL R2 4 - 0x80040400, // 0008 RET 1 R2 + ( &(const binstruction[ 8]) { /* code */ + 0x60040018, // 0000 GETGBL R1 G24 + 0x58080000, // 0001 LDCONST R2 K0 + 0x600C0005, // 0002 GETGBL R3 G5 + 0x5C100000, // 0003 MOVE R4 R0 + 0x7C0C0200, // 0004 CALL R3 1 + 0x88100101, // 0005 GETMBR R4 R0 K1 + 0x7C040600, // 0006 CALL R1 3 + 0x80040200, // 0007 RET 1 R1 }) ) ); diff --git a/lib/libesp32/berry_tasmota/src/solidify/solidified_partition_core.h b/lib/libesp32/berry_tasmota/src/solidify/solidified_partition_core.h index 2f0cb689d..d523d1331 100644 --- a/lib/libesp32/berry_tasmota/src/solidify/solidified_partition_core.h +++ b/lib/libesp32/berry_tasmota/src/solidify/solidified_partition_core.h @@ -99,7 +99,7 @@ be_local_closure(Partition_otadata_save, /* name */ ********************************************************************/ be_local_closure(Partition_otadata_tostring, /* name */ be_nested_proto( - 9, /* nstack */ + 7, /* nstack */ 1, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -107,38 +107,35 @@ be_local_closure(Partition_otadata_tostring, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[10]) { /* constants */ - /* K0 */ be_nested_str(string), - /* K1 */ be_nested_str(format), - /* K2 */ be_nested_str(_X3Cinstance_X3A_X20Partition_otadata_X28ota_active_X3A_X25s_X2C_X20ota_seq_X3D_X5B_X25d_X2C_X25d_X5D_X2C_X20ota_max_X3D_X25d_X29_X3E), - /* K3 */ be_nested_str(active_otadata), - /* K4 */ be_const_int(0), - /* K5 */ be_nested_str(ota_), - /* K6 */ be_nested_str(factory), - /* K7 */ be_nested_str(seq0), - /* K8 */ be_nested_str(seq1), - /* K9 */ be_nested_str(maxota), + ( &(const bvalue[ 8]) { /* constants */ + /* K0 */ be_nested_str(_X3Cinstance_X3A_X20Partition_otadata_X28ota_active_X3A_X25s_X2C_X20ota_seq_X3D_X5B_X25d_X2C_X25d_X5D_X2C_X20ota_max_X3D_X25d_X29_X3E), + /* K1 */ be_nested_str(active_otadata), + /* K2 */ be_const_int(0), + /* K3 */ be_nested_str(ota_), + /* K4 */ be_nested_str(factory), + /* K5 */ be_nested_str(seq0), + /* K6 */ be_nested_str(seq1), + /* K7 */ be_nested_str(maxota), }), &be_const_str_tostring, &be_const_str_solidified, - ( &(const binstruction[17]) { /* code */ - 0xA4060000, // 0000 IMPORT R1 K0 - 0x8C080301, // 0001 GETMET R2 R1 K1 - 0x58100002, // 0002 LDCONST R4 K2 - 0x88140103, // 0003 GETMBR R5 R0 K3 - 0x28140B04, // 0004 GE R5 R5 K4 - 0x78160004, // 0005 JMPF R5 #000B - 0x60140008, // 0006 GETGBL R5 G8 - 0x88180103, // 0007 GETMBR R6 R0 K3 - 0x7C140200, // 0008 CALL R5 1 - 0x00160A05, // 0009 ADD R5 K5 R5 - 0x70020000, // 000A JMP #000C - 0x58140006, // 000B LDCONST R5 K6 - 0x88180107, // 000C GETMBR R6 R0 K7 - 0x881C0108, // 000D GETMBR R7 R0 K8 - 0x88200109, // 000E GETMBR R8 R0 K9 - 0x7C080C00, // 000F CALL R2 6 - 0x80040400, // 0010 RET 1 R2 + ( &(const binstruction[16]) { /* code */ + 0x60040018, // 0000 GETGBL R1 G24 + 0x58080000, // 0001 LDCONST R2 K0 + 0x880C0101, // 0002 GETMBR R3 R0 K1 + 0x280C0702, // 0003 GE R3 R3 K2 + 0x780E0004, // 0004 JMPF R3 #000A + 0x600C0008, // 0005 GETGBL R3 G8 + 0x88100101, // 0006 GETMBR R4 R0 K1 + 0x7C0C0200, // 0007 CALL R3 1 + 0x000E0603, // 0008 ADD R3 K3 R3 + 0x70020000, // 0009 JMP #000B + 0x580C0004, // 000A LDCONST R3 K4 + 0x88100105, // 000B GETMBR R4 R0 K5 + 0x88140106, // 000C GETMBR R5 R0 K6 + 0x88180107, // 000D GETMBR R6 R0 K7 + 0x7C040A00, // 000E CALL R1 5 + 0x80040200, // 000F RET 1 R1 }) ) ); @@ -797,7 +794,7 @@ be_local_closure(Partition_get_max_flash_size_k, /* name */ ********************************************************************/ be_local_closure(Partition_resize_max_flash_size_k, /* name */ be_nested_proto( - 18, /* nstack */ + 16, /* nstack */ 1, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -805,29 +802,27 @@ be_local_closure(Partition_resize_max_flash_size_k, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[18]) { /* constants */ + ( &(const bvalue[16]) { /* constants */ /* K0 */ be_nested_str(tasmota), /* K1 */ be_nested_str(memory), /* K2 */ be_nested_str(flash), /* K3 */ be_nested_str(find), /* K4 */ be_nested_str(flash_real), /* K5 */ be_nested_str(get_flash_definition_sector), - /* K6 */ be_nested_str(string), - /* K7 */ be_nested_str(read), - /* K8 */ be_const_int(3), - /* K9 */ be_const_int(1), - /* K10 */ be_const_int(0), - /* K11 */ be_const_int(2), - /* K12 */ be_nested_str(write), - /* K13 */ be_nested_str(log), - /* K14 */ be_nested_str(format), - /* K15 */ be_nested_str(UPL_X3A_X20changing_X20flash_X20definition_X20from_X200x02X_X20to_X200x_X2502X), - /* K16 */ be_nested_str(wrong_X20flash_X20size_X20), - /* K17 */ be_nested_str(internal_error), + /* K6 */ be_nested_str(read), + /* K7 */ be_const_int(3), + /* K8 */ be_const_int(1), + /* K9 */ be_const_int(0), + /* K10 */ be_const_int(2), + /* K11 */ be_nested_str(write), + /* K12 */ be_nested_str(log), + /* K13 */ be_nested_str(UPL_X3A_X20changing_X20flash_X20definition_X20from_X200x02X_X20to_X200x_X2502X), + /* K14 */ be_nested_str(wrong_X20flash_X20size_X20), + /* K15 */ be_nested_str(internal_error), }), &be_const_str_resize_max_flash_size_k, &be_const_str_solidified, - ( &(const binstruction[95]) { /* code */ + ( &(const binstruction[94]) { /* code */ 0xB8060000, // 0000 GETNGBL R1 K0 0x8C040301, // 0001 GETMET R1 R1 K1 0x7C040200, // 0002 CALL R1 1 @@ -842,87 +837,86 @@ be_local_closure(Partition_resize_max_flash_size_k, /* name */ 0x8C0C0105, // 000B GETMET R3 R0 K5 0x7C0C0200, // 000C CALL R3 1 0x20100202, // 000D NE R4 R1 R2 - 0x7812004E, // 000E JMPF R4 #005E + 0x7812004D, // 000E JMPF R4 #005D 0x4C100000, // 000F LDNIL R4 0x20100604, // 0010 NE R4 R3 R4 - 0x7812004B, // 0011 JMPF R4 #005E + 0x7812004A, // 0011 JMPF R4 #005D 0xA4120400, // 0012 IMPORT R4 K2 - 0xA4160C00, // 0013 IMPORT R5 K6 - 0x5C040400, // 0014 MOVE R1 R2 - 0x8C180907, // 0015 GETMET R6 R4 K7 - 0x5C200600, // 0016 MOVE R8 R3 - 0x54260003, // 0017 LDINT R9 4 - 0x7C180600, // 0018 CALL R6 3 - 0x941C0D08, // 0019 GETIDX R7 R6 K8 - 0x4C200000, // 001A LDNIL R8 - 0x542603FF, // 001B LDINT R9 1024 - 0x0C240409, // 001C DIV R9 R2 R9 - 0x1C281309, // 001D EQ R10 R9 K9 - 0x782A0001, // 001E JMPF R10 #0021 - 0x5820000A, // 001F LDCONST R8 K10 - 0x70020020, // 0020 JMP #0042 - 0x1C28130B, // 0021 EQ R10 R9 K11 - 0x782A0001, // 0022 JMPF R10 #0025 - 0x5422000F, // 0023 LDINT R8 16 - 0x7002001C, // 0024 JMP #0042 - 0x542A0003, // 0025 LDINT R10 4 - 0x1C28120A, // 0026 EQ R10 R9 R10 - 0x782A0001, // 0027 JMPF R10 #002A - 0x5422001F, // 0028 LDINT R8 32 - 0x70020017, // 0029 JMP #0042 - 0x542A0007, // 002A LDINT R10 8 - 0x1C28120A, // 002B EQ R10 R9 R10 - 0x782A0001, // 002C JMPF R10 #002F - 0x5422002F, // 002D LDINT R8 48 - 0x70020012, // 002E JMP #0042 - 0x542A000F, // 002F LDINT R10 16 - 0x1C28120A, // 0030 EQ R10 R9 R10 - 0x782A0001, // 0031 JMPF R10 #0034 - 0x5422003F, // 0032 LDINT R8 64 - 0x7002000D, // 0033 JMP #0042 - 0x542A001F, // 0034 LDINT R10 32 - 0x1C28120A, // 0035 EQ R10 R9 R10 - 0x782A0001, // 0036 JMPF R10 #0039 - 0x5422004F, // 0037 LDINT R8 80 - 0x70020008, // 0038 JMP #0042 - 0x542A003F, // 0039 LDINT R10 64 - 0x1C28120A, // 003A EQ R10 R9 R10 - 0x782A0001, // 003B JMPF R10 #003E - 0x5422005F, // 003C LDINT R8 96 - 0x70020003, // 003D JMP #0042 - 0x542A007F, // 003E LDINT R10 128 - 0x1C28120A, // 003F EQ R10 R9 R10 - 0x782A0000, // 0040 JMPF R10 #0042 - 0x5422006F, // 0041 LDINT R8 112 - 0x4C280000, // 0042 LDNIL R10 - 0x2028100A, // 0043 NE R10 R8 R10 - 0x782A0013, // 0044 JMPF R10 #0059 - 0x94280D08, // 0045 GETIDX R10 R6 K8 - 0x942C0D08, // 0046 GETIDX R11 R6 K8 - 0x5432000E, // 0047 LDINT R12 15 - 0x2C2C160C, // 0048 AND R11 R11 R12 - 0x302C1608, // 0049 OR R11 R11 R8 - 0x981A100B, // 004A SETIDX R6 K8 R11 - 0x8C2C090C, // 004B GETMET R11 R4 K12 - 0x5C340600, // 004C MOVE R13 R3 - 0x5C380C00, // 004D MOVE R14 R6 - 0x7C2C0600, // 004E CALL R11 3 - 0xB82E0000, // 004F GETNGBL R11 K0 - 0x8C2C170D, // 0050 GETMET R11 R11 K13 - 0x8C340B0E, // 0051 GETMET R13 R5 K14 - 0x583C000F, // 0052 LDCONST R15 K15 - 0x5C401400, // 0053 MOVE R16 R10 - 0x94440D08, // 0054 GETIDX R17 R6 K8 - 0x7C340800, // 0055 CALL R13 4 - 0x58380008, // 0056 LDCONST R14 K8 - 0x7C2C0600, // 0057 CALL R11 3 - 0x70020004, // 0058 JMP #005E - 0x60280008, // 0059 GETGBL R10 G8 - 0x5C2C1200, // 005A MOVE R11 R9 - 0x7C280200, // 005B CALL R10 1 - 0x002A200A, // 005C ADD R10 K16 R10 - 0xB006220A, // 005D RAISE 1 K17 R10 - 0x80000000, // 005E RET 0 + 0x5C040400, // 0013 MOVE R1 R2 + 0x8C140906, // 0014 GETMET R5 R4 K6 + 0x5C1C0600, // 0015 MOVE R7 R3 + 0x54220003, // 0016 LDINT R8 4 + 0x7C140600, // 0017 CALL R5 3 + 0x94180B07, // 0018 GETIDX R6 R5 K7 + 0x4C1C0000, // 0019 LDNIL R7 + 0x542203FF, // 001A LDINT R8 1024 + 0x0C200408, // 001B DIV R8 R2 R8 + 0x1C241108, // 001C EQ R9 R8 K8 + 0x78260001, // 001D JMPF R9 #0020 + 0x581C0009, // 001E LDCONST R7 K9 + 0x70020020, // 001F JMP #0041 + 0x1C24110A, // 0020 EQ R9 R8 K10 + 0x78260001, // 0021 JMPF R9 #0024 + 0x541E000F, // 0022 LDINT R7 16 + 0x7002001C, // 0023 JMP #0041 + 0x54260003, // 0024 LDINT R9 4 + 0x1C241009, // 0025 EQ R9 R8 R9 + 0x78260001, // 0026 JMPF R9 #0029 + 0x541E001F, // 0027 LDINT R7 32 + 0x70020017, // 0028 JMP #0041 + 0x54260007, // 0029 LDINT R9 8 + 0x1C241009, // 002A EQ R9 R8 R9 + 0x78260001, // 002B JMPF R9 #002E + 0x541E002F, // 002C LDINT R7 48 + 0x70020012, // 002D JMP #0041 + 0x5426000F, // 002E LDINT R9 16 + 0x1C241009, // 002F EQ R9 R8 R9 + 0x78260001, // 0030 JMPF R9 #0033 + 0x541E003F, // 0031 LDINT R7 64 + 0x7002000D, // 0032 JMP #0041 + 0x5426001F, // 0033 LDINT R9 32 + 0x1C241009, // 0034 EQ R9 R8 R9 + 0x78260001, // 0035 JMPF R9 #0038 + 0x541E004F, // 0036 LDINT R7 80 + 0x70020008, // 0037 JMP #0041 + 0x5426003F, // 0038 LDINT R9 64 + 0x1C241009, // 0039 EQ R9 R8 R9 + 0x78260001, // 003A JMPF R9 #003D + 0x541E005F, // 003B LDINT R7 96 + 0x70020003, // 003C JMP #0041 + 0x5426007F, // 003D LDINT R9 128 + 0x1C241009, // 003E EQ R9 R8 R9 + 0x78260000, // 003F JMPF R9 #0041 + 0x541E006F, // 0040 LDINT R7 112 + 0x4C240000, // 0041 LDNIL R9 + 0x20240E09, // 0042 NE R9 R7 R9 + 0x78260013, // 0043 JMPF R9 #0058 + 0x94240B07, // 0044 GETIDX R9 R5 K7 + 0x94280B07, // 0045 GETIDX R10 R5 K7 + 0x542E000E, // 0046 LDINT R11 15 + 0x2C28140B, // 0047 AND R10 R10 R11 + 0x30281407, // 0048 OR R10 R10 R7 + 0x98160E0A, // 0049 SETIDX R5 K7 R10 + 0x8C28090B, // 004A GETMET R10 R4 K11 + 0x5C300600, // 004B MOVE R12 R3 + 0x5C340A00, // 004C MOVE R13 R5 + 0x7C280600, // 004D CALL R10 3 + 0xB82A0000, // 004E GETNGBL R10 K0 + 0x8C28150C, // 004F GETMET R10 R10 K12 + 0x60300018, // 0050 GETGBL R12 G24 + 0x5834000D, // 0051 LDCONST R13 K13 + 0x5C381200, // 0052 MOVE R14 R9 + 0x943C0B07, // 0053 GETIDX R15 R5 K7 + 0x7C300600, // 0054 CALL R12 3 + 0x58340007, // 0055 LDCONST R13 K7 + 0x7C280600, // 0056 CALL R10 3 + 0x70020004, // 0057 JMP #005D + 0x60240008, // 0058 GETGBL R9 G8 + 0x5C281000, // 0059 MOVE R10 R8 + 0x7C240200, // 005A CALL R9 1 + 0x00261C09, // 005B ADD R9 K14 R9 + 0xB0061E09, // 005C RAISE 1 K15 R9 + 0x80000000, // 005D RET 0 }) ) ); @@ -991,7 +985,7 @@ be_local_closure(Partition_get_flash_definition_sector, /* name */ ********************************************************************/ be_local_closure(Partition_resize_fs_to_max, /* name */ be_nested_proto( - 11, /* nstack */ + 9, /* nstack */ 1, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -999,83 +993,80 @@ be_local_closure(Partition_resize_fs_to_max, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[17]) { /* constants */ - /* K0 */ be_nested_str(string), - /* K1 */ be_nested_str(get_unallocated_k), - /* K2 */ be_const_int(0), - /* K3 */ be_nested_str(tasmota), - /* K4 */ be_nested_str(log), - /* K5 */ be_nested_str(format), - /* K6 */ be_nested_str(BRY_X3A_X20Trying_X20to_X20expand_X20FS_X20by_X20_X25i_X20kB), - /* K7 */ be_const_int(2), - /* K8 */ be_nested_str(resize_max_flash_size_k), - /* K9 */ be_nested_str(slots), - /* K10 */ be_nested_str(sz), - /* K11 */ be_nested_str(save), - /* K12 */ be_nested_str(invalidate_spiffs), - /* K13 */ be_nested_str(global), - /* K14 */ be_nested_str(restart_flag), - /* K15 */ be_nested_str(BRY_X3A_X20Successfully_X20resized_X20FS_X2C_X20restarting), - /* K16 */ be_nested_str(BRY_X3A_X20Exception_X3E_X20_X27_X25s_X27_X20_X2D_X20_X25s), + ( &(const bvalue[15]) { /* constants */ + /* K0 */ be_nested_str(get_unallocated_k), + /* K1 */ be_const_int(0), + /* K2 */ be_nested_str(tasmota), + /* K3 */ be_nested_str(log), + /* K4 */ be_nested_str(BRY_X3A_X20Trying_X20to_X20expand_X20FS_X20by_X20_X25i_X20kB), + /* K5 */ be_const_int(2), + /* K6 */ be_nested_str(resize_max_flash_size_k), + /* K7 */ be_nested_str(slots), + /* K8 */ be_nested_str(sz), + /* K9 */ be_nested_str(save), + /* K10 */ be_nested_str(invalidate_spiffs), + /* K11 */ be_nested_str(global), + /* K12 */ be_nested_str(restart_flag), + /* K13 */ be_nested_str(BRY_X3A_X20Successfully_X20resized_X20FS_X2C_X20restarting), + /* K14 */ be_nested_str(BRY_X3A_X20Exception_X3E_X20_X27_X25s_X27_X20_X2D_X20_X25s), }), &be_const_str_resize_fs_to_max, &be_const_str_solidified, - ( &(const binstruction[55]) { /* code */ - 0xA4060000, // 0000 IMPORT R1 K0 - 0xA8020026, // 0001 EXBLK 0 #0029 - 0x8C080101, // 0002 GETMET R2 R0 K1 - 0x7C080200, // 0003 CALL R2 1 - 0x180C0502, // 0004 LE R3 R2 K2 - 0x780E0002, // 0005 JMPF R3 #0009 - 0x4C0C0000, // 0006 LDNIL R3 - 0xA8040001, // 0007 EXBLK 1 1 - 0x80040600, // 0008 RET 1 R3 - 0xB80E0600, // 0009 GETNGBL R3 K3 - 0x8C0C0704, // 000A GETMET R3 R3 K4 - 0x8C140305, // 000B GETMET R5 R1 K5 - 0x581C0006, // 000C LDCONST R7 K6 - 0x5C200400, // 000D MOVE R8 R2 - 0x7C140600, // 000E CALL R5 3 - 0x58180007, // 000F LDCONST R6 K7 - 0x7C0C0600, // 0010 CALL R3 3 - 0x8C0C0108, // 0011 GETMET R3 R0 K8 - 0x7C0C0200, // 0012 CALL R3 1 - 0x540DFFFE, // 0013 LDINT R3 -1 - 0x88100109, // 0014 GETMBR R4 R0 K9 - 0x940C0803, // 0015 GETIDX R3 R4 R3 - 0x541A03FF, // 0016 LDINT R6 1024 - 0x08180406, // 0017 MUL R6 R2 R6 - 0x8814070A, // 0018 GETMBR R5 R3 K10 - 0x00140A06, // 0019 ADD R5 R5 R6 - 0x900E1405, // 001A SETMBR R3 K10 R5 - 0x8C14010B, // 001B GETMET R5 R0 K11 - 0x7C140200, // 001C CALL R5 1 - 0x8C10010C, // 001D GETMET R4 R0 K12 - 0x7C100200, // 001E CALL R4 1 - 0xB8120600, // 001F GETNGBL R4 K3 - 0x8810090D, // 0020 GETMBR R4 R4 K13 - 0x90121D07, // 0021 SETMBR R4 K14 K7 - 0xB8120600, // 0022 GETNGBL R4 K3 - 0x8C100904, // 0023 GETMET R4 R4 K4 - 0x5818000F, // 0024 LDCONST R6 K15 - 0x581C0007, // 0025 LDCONST R7 K7 - 0x7C100600, // 0026 CALL R4 3 - 0xA8040001, // 0027 EXBLK 1 1 - 0x7002000C, // 0028 JMP #0036 - 0xAC080002, // 0029 CATCH R2 0 2 - 0x70020009, // 002A JMP #0035 - 0xB8120600, // 002B GETNGBL R4 K3 - 0x8C100904, // 002C GETMET R4 R4 K4 - 0x8C180305, // 002D GETMET R6 R1 K5 - 0x58200010, // 002E LDCONST R8 K16 - 0x5C240400, // 002F MOVE R9 R2 - 0x5C280600, // 0030 MOVE R10 R3 - 0x7C180800, // 0031 CALL R6 4 - 0x581C0007, // 0032 LDCONST R7 K7 - 0x7C100600, // 0033 CALL R4 3 - 0x70020000, // 0034 JMP #0036 - 0xB0080000, // 0035 RAISE 2 R0 R0 - 0x80000000, // 0036 RET 0 + ( &(const binstruction[54]) { /* code */ + 0xA8020026, // 0000 EXBLK 0 #0028 + 0x8C040100, // 0001 GETMET R1 R0 K0 + 0x7C040200, // 0002 CALL R1 1 + 0x18080301, // 0003 LE R2 R1 K1 + 0x780A0002, // 0004 JMPF R2 #0008 + 0x4C080000, // 0005 LDNIL R2 + 0xA8040001, // 0006 EXBLK 1 1 + 0x80040400, // 0007 RET 1 R2 + 0xB80A0400, // 0008 GETNGBL R2 K2 + 0x8C080503, // 0009 GETMET R2 R2 K3 + 0x60100018, // 000A GETGBL R4 G24 + 0x58140004, // 000B LDCONST R5 K4 + 0x5C180200, // 000C MOVE R6 R1 + 0x7C100400, // 000D CALL R4 2 + 0x58140005, // 000E LDCONST R5 K5 + 0x7C080600, // 000F CALL R2 3 + 0x8C080106, // 0010 GETMET R2 R0 K6 + 0x7C080200, // 0011 CALL R2 1 + 0x5409FFFE, // 0012 LDINT R2 -1 + 0x880C0107, // 0013 GETMBR R3 R0 K7 + 0x94080602, // 0014 GETIDX R2 R3 R2 + 0x541603FF, // 0015 LDINT R5 1024 + 0x08140205, // 0016 MUL R5 R1 R5 + 0x88100508, // 0017 GETMBR R4 R2 K8 + 0x00100805, // 0018 ADD R4 R4 R5 + 0x900A1004, // 0019 SETMBR R2 K8 R4 + 0x8C100109, // 001A GETMET R4 R0 K9 + 0x7C100200, // 001B CALL R4 1 + 0x8C0C010A, // 001C GETMET R3 R0 K10 + 0x7C0C0200, // 001D CALL R3 1 + 0xB80E0400, // 001E GETNGBL R3 K2 + 0x880C070B, // 001F GETMBR R3 R3 K11 + 0x900E1905, // 0020 SETMBR R3 K12 K5 + 0xB80E0400, // 0021 GETNGBL R3 K2 + 0x8C0C0703, // 0022 GETMET R3 R3 K3 + 0x5814000D, // 0023 LDCONST R5 K13 + 0x58180005, // 0024 LDCONST R6 K5 + 0x7C0C0600, // 0025 CALL R3 3 + 0xA8040001, // 0026 EXBLK 1 1 + 0x7002000C, // 0027 JMP #0035 + 0xAC040002, // 0028 CATCH R1 0 2 + 0x70020009, // 0029 JMP #0034 + 0xB80E0400, // 002A GETNGBL R3 K2 + 0x8C0C0703, // 002B GETMET R3 R3 K3 + 0x60140018, // 002C GETGBL R5 G24 + 0x5818000E, // 002D LDCONST R6 K14 + 0x5C1C0200, // 002E MOVE R7 R1 + 0x5C200400, // 002F MOVE R8 R2 + 0x7C140600, // 0030 CALL R5 3 + 0x58180005, // 0031 LDCONST R6 K5 + 0x7C0C0600, // 0032 CALL R3 3 + 0x70020000, // 0033 JMP #0035 + 0xB0080000, // 0034 RAISE 2 R0 R0 + 0x80000000, // 0035 RET 0 }) ) ); @@ -1711,7 +1702,7 @@ be_local_closure(Partition_info_is_factory, /* name */ ********************************************************************/ be_local_closure(Partition_info_type_to_string, /* name */ be_nested_proto( - 6, /* nstack */ + 4, /* nstack */ 1, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -1719,19 +1710,17 @@ be_local_closure(Partition_info_type_to_string, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[ 8]) { /* constants */ + ( &(const bvalue[ 6]) { /* constants */ /* K0 */ be_nested_str(type), /* K1 */ be_const_int(0), /* K2 */ be_nested_str(app), /* K3 */ be_const_int(1), /* K4 */ be_nested_str(data), - /* K5 */ be_nested_str(string), - /* K6 */ be_nested_str(format), - /* K7 */ be_nested_str(0x_X2502X), + /* K5 */ be_nested_str(0x_X2502X), }), &be_const_str_type_to_string, &be_const_str_solidified, - ( &(const binstruction[15]) { /* code */ + ( &(const binstruction[14]) { /* code */ 0x88040100, // 0000 GETMBR R1 R0 K0 0x1C040301, // 0001 EQ R1 R1 K1 0x78060001, // 0002 JMPF R1 #0005 @@ -1741,12 +1730,11 @@ be_local_closure(Partition_info_type_to_string, /* name */ 0x1C040303, // 0006 EQ R1 R1 K3 0x78060000, // 0007 JMPF R1 #0009 0x80060800, // 0008 RET 1 K4 - 0xA4060A00, // 0009 IMPORT R1 K5 - 0x8C080306, // 000A GETMET R2 R1 K6 - 0x58100007, // 000B LDCONST R4 K7 - 0x88140100, // 000C GETMBR R5 R0 K0 - 0x7C080600, // 000D CALL R2 3 - 0x80040400, // 000E RET 1 R2 + 0x60040018, // 0009 GETGBL R1 G24 + 0x58080005, // 000A LDCONST R2 K5 + 0x880C0100, // 000B GETMBR R3 R0 K0 + 0x7C040400, // 000C CALL R1 2 + 0x80040200, // 000D RET 1 R1 }) ) ); @@ -1758,7 +1746,7 @@ be_local_closure(Partition_info_type_to_string, /* name */ ********************************************************************/ be_local_closure(Partition_info_init, /* name */ be_nested_proto( - 8, /* nstack */ + 7, /* nstack */ 2, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -1766,7 +1754,7 @@ be_local_closure(Partition_info_init, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[18]) { /* constants */ + ( &(const bvalue[16]) { /* constants */ /* K0 */ be_nested_str(type), /* K1 */ be_const_int(0), /* K2 */ be_nested_str(subtype), @@ -1781,14 +1769,12 @@ be_local_closure(Partition_info_init, /* name */ /* K11 */ be_const_int(3), /* K12 */ be_nested_str(remove_trailing_zeroes), /* K13 */ be_nested_str(asstring), - /* K14 */ be_nested_str(string), - /* K15 */ be_nested_str(format), - /* K16 */ be_nested_str(invalid_X20magic_X20number_X20_X2502X), - /* K17 */ be_nested_str(internal_error), + /* K14 */ be_nested_str(invalid_X20magic_X20number_X20_X2502X), + /* K15 */ be_nested_str(internal_error), }), &be_const_str_init, &be_const_str_solidified, - ( &(const binstruction[61]) { /* code */ + ( &(const binstruction[60]) { /* code */ 0x90020101, // 0000 SETMBR R0 K0 K1 0x90020501, // 0001 SETMBR R0 K2 K1 0x90020701, // 0002 SETMBR R0 K3 K1 @@ -1842,14 +1828,13 @@ be_local_closure(Partition_info_init, /* name */ 0x541A0003, // 0032 LDINT R6 4 0x7C0C0600, // 0033 CALL R3 3 0x90020E03, // 0034 SETMBR R0 K7 R3 - 0x70020005, // 0035 JMP #003C - 0xA40E1C00, // 0036 IMPORT R3 K14 - 0x8C10070F, // 0037 GETMET R4 R3 K15 - 0x58180010, // 0038 LDCONST R6 K16 - 0x5C1C0400, // 0039 MOVE R7 R2 - 0x7C100600, // 003A CALL R4 3 - 0xB0062204, // 003B RAISE 1 K17 R4 - 0x80000000, // 003C RET 0 + 0x70020004, // 0035 JMP #003B + 0x600C0018, // 0036 GETGBL R3 G24 + 0x5810000E, // 0037 LDCONST R4 K14 + 0x5C140400, // 0038 MOVE R5 R2 + 0x7C0C0400, // 0039 CALL R3 2 + 0xB0061E03, // 003A RAISE 1 K15 R3 + 0x80000000, // 003B RET 0 }) ) ); @@ -1861,7 +1846,7 @@ be_local_closure(Partition_info_init, /* name */ ********************************************************************/ be_local_closure(Partition_info_subtype_to_string, /* name */ be_nested_proto( - 6, /* nstack */ + 4, /* nstack */ 1, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -1869,7 +1854,7 @@ be_local_closure(Partition_info_subtype_to_string, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[21]) { /* constants */ + ( &(const bvalue[19]) { /* constants */ /* K0 */ be_nested_str(type), /* K1 */ be_const_int(0), /* K2 */ be_nested_str(subtype), @@ -1888,13 +1873,11 @@ be_local_closure(Partition_info_subtype_to_string, /* name */ /* K15 */ be_nested_str(esphttpd), /* K16 */ be_nested_str(fat), /* K17 */ be_nested_str(spiffs), - /* K18 */ be_nested_str(string), - /* K19 */ be_nested_str(format), - /* K20 */ be_nested_str(0x_X2502X), + /* K18 */ be_nested_str(0x_X2502X), }), &be_const_str_subtype_to_string, &be_const_str_solidified, - ( &(const binstruction[88]) { /* code */ + ( &(const binstruction[87]) { /* code */ 0x88040100, // 0000 GETMBR R1 R0 K0 0x1C040301, // 0001 EQ R1 R1 K1 0x7806001A, // 0002 JMPF R1 #001E @@ -1977,12 +1960,11 @@ be_local_closure(Partition_info_subtype_to_string, /* name */ 0x1C040202, // 004F EQ R1 R1 R2 0x78060000, // 0050 JMPF R1 #0052 0x80062200, // 0051 RET 1 K17 - 0xA4062400, // 0052 IMPORT R1 K18 - 0x8C080313, // 0053 GETMET R2 R1 K19 - 0x58100014, // 0054 LDCONST R4 K20 - 0x88140102, // 0055 GETMBR R5 R0 K2 - 0x7C080600, // 0056 CALL R2 3 - 0x80040400, // 0057 RET 1 R2 + 0x60040018, // 0052 GETGBL R1 G24 + 0x58080012, // 0053 LDCONST R2 K18 + 0x880C0102, // 0054 GETMBR R3 R0 K2 + 0x7C040400, // 0055 CALL R1 2 + 0x80040200, // 0056 RET 1 R1 }) ) ); @@ -1994,7 +1976,7 @@ be_local_closure(Partition_info_subtype_to_string, /* name */ ********************************************************************/ be_local_closure(Partition_info_tostring, /* name */ be_nested_proto( - 15, /* nstack */ + 13, /* nstack */ 1, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -2002,52 +1984,49 @@ be_local_closure(Partition_info_tostring, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[14]) { /* constants */ - /* K0 */ be_nested_str(string), - /* K1 */ be_nested_str(type_to_string), - /* K2 */ be_nested_str(subtype_to_string), - /* K3 */ be_nested_str(), - /* K4 */ be_nested_str(_X20_X28), - /* K5 */ be_nested_str(_X29), - /* K6 */ be_nested_str(format), - /* K7 */ be_nested_str(_X3Cinstance_X3A_X20Partition_info_X28_X25d_X25s_X2C_X25d_X25s_X2C0x_X2508X_X2C0x_X2508X_X2C_X27_X25s_X27_X2C0x_X25X_X29_X3E), - /* K8 */ be_nested_str(type), - /* K9 */ be_nested_str(subtype), - /* K10 */ be_nested_str(start), - /* K11 */ be_nested_str(sz), - /* K12 */ be_nested_str(label), - /* K13 */ be_nested_str(flags), + ( &(const bvalue[12]) { /* constants */ + /* K0 */ be_nested_str(type_to_string), + /* K1 */ be_nested_str(subtype_to_string), + /* K2 */ be_nested_str(), + /* K3 */ be_nested_str(_X20_X28), + /* K4 */ be_nested_str(_X29), + /* K5 */ be_nested_str(_X3Cinstance_X3A_X20Partition_info_X28_X25d_X25s_X2C_X25d_X25s_X2C0x_X2508X_X2C0x_X2508X_X2C_X27_X25s_X27_X2C0x_X25X_X29_X3E), + /* K6 */ be_nested_str(type), + /* K7 */ be_nested_str(subtype), + /* K8 */ be_nested_str(start), + /* K9 */ be_nested_str(sz), + /* K10 */ be_nested_str(label), + /* K11 */ be_nested_str(flags), }), &be_const_str_tostring, &be_const_str_solidified, - ( &(const binstruction[27]) { /* code */ - 0xA4060000, // 0000 IMPORT R1 K0 - 0x8C080101, // 0001 GETMET R2 R0 K1 - 0x7C080200, // 0002 CALL R2 1 - 0x8C0C0102, // 0003 GETMET R3 R0 K2 - 0x7C0C0200, // 0004 CALL R3 1 - 0x20100503, // 0005 NE R4 R2 K3 - 0x78120002, // 0006 JMPF R4 #000A - 0x00120802, // 0007 ADD R4 K4 R2 - 0x00100905, // 0008 ADD R4 R4 K5 - 0x5C080800, // 0009 MOVE R2 R4 - 0x20100703, // 000A NE R4 R3 K3 - 0x78120002, // 000B JMPF R4 #000F - 0x00120803, // 000C ADD R4 K4 R3 - 0x00100905, // 000D ADD R4 R4 K5 - 0x5C0C0800, // 000E MOVE R3 R4 - 0x8C100306, // 000F GETMET R4 R1 K6 - 0x58180007, // 0010 LDCONST R6 K7 - 0x881C0108, // 0011 GETMBR R7 R0 K8 - 0x5C200400, // 0012 MOVE R8 R2 - 0x88240109, // 0013 GETMBR R9 R0 K9 - 0x5C280600, // 0014 MOVE R10 R3 - 0x882C010A, // 0015 GETMBR R11 R0 K10 - 0x8830010B, // 0016 GETMBR R12 R0 K11 - 0x8834010C, // 0017 GETMBR R13 R0 K12 - 0x8838010D, // 0018 GETMBR R14 R0 K13 - 0x7C101400, // 0019 CALL R4 10 - 0x80040800, // 001A RET 1 R4 + ( &(const binstruction[26]) { /* code */ + 0x8C040100, // 0000 GETMET R1 R0 K0 + 0x7C040200, // 0001 CALL R1 1 + 0x8C080101, // 0002 GETMET R2 R0 K1 + 0x7C080200, // 0003 CALL R2 1 + 0x200C0302, // 0004 NE R3 R1 K2 + 0x780E0002, // 0005 JMPF R3 #0009 + 0x000E0601, // 0006 ADD R3 K3 R1 + 0x000C0704, // 0007 ADD R3 R3 K4 + 0x5C040600, // 0008 MOVE R1 R3 + 0x200C0502, // 0009 NE R3 R2 K2 + 0x780E0002, // 000A JMPF R3 #000E + 0x000E0602, // 000B ADD R3 K3 R2 + 0x000C0704, // 000C ADD R3 R3 K4 + 0x5C080600, // 000D MOVE R2 R3 + 0x600C0018, // 000E GETGBL R3 G24 + 0x58100005, // 000F LDCONST R4 K5 + 0x88140106, // 0010 GETMBR R5 R0 K6 + 0x5C180200, // 0011 MOVE R6 R1 + 0x881C0107, // 0012 GETMBR R7 R0 K7 + 0x5C200400, // 0013 MOVE R8 R2 + 0x88240108, // 0014 GETMBR R9 R0 K8 + 0x88280109, // 0015 GETMBR R10 R0 K9 + 0x882C010A, // 0016 GETMBR R11 R0 K10 + 0x8830010B, // 0017 GETMBR R12 R0 K11 + 0x7C0C1200, // 0018 CALL R3 9 + 0x80040600, // 0019 RET 1 R3 }) ) ); diff --git a/lib/libesp32/berry_tasmota/src/solidify/solidified_tapp.h b/lib/libesp32/berry_tasmota/src/solidify/solidified_tapp.h index 67cacbde3..77f4f1f03 100644 --- a/lib/libesp32/berry_tasmota/src/solidify/solidified_tapp.h +++ b/lib/libesp32/berry_tasmota/src/solidify/solidified_tapp.h @@ -42,7 +42,7 @@ be_local_closure(Tapp_init, /* name */ ********************************************************************/ be_local_closure(Tapp_autoexec, /* name */ be_nested_proto( - 12, /* nstack */ + 11, /* nstack */ 1, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -50,7 +50,7 @@ be_local_closure(Tapp_autoexec, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[15]) { /* constants */ + ( &(const bvalue[14]) { /* constants */ /* K0 */ be_nested_str(path), /* K1 */ be_nested_str(string), /* K2 */ be_nested_str(listdir), @@ -60,12 +60,11 @@ be_local_closure(Tapp_autoexec, /* name */ /* K6 */ be_const_int(0), /* K7 */ be_nested_str(tasmota), /* K8 */ be_nested_str(log), - /* K9 */ be_nested_str(format), - /* K10 */ be_nested_str(TAP_X3A_X20Loaded_X20Tasmota_X20App_X20_X27_X25s_X27), - /* K11 */ be_const_int(2), - /* K12 */ be_nested_str(load), - /* K13 */ be_nested_str(_X23autoexec_X2Ebe), - /* K14 */ be_nested_str(stop_iteration), + /* K9 */ be_nested_str(TAP_X3A_X20Loaded_X20Tasmota_X20App_X20_X27_X25s_X27), + /* K10 */ be_const_int(2), + /* K11 */ be_nested_str(load), + /* K12 */ be_nested_str(_X23autoexec_X2Ebe), + /* K13 */ be_nested_str(stop_iteration), }), &be_const_str_autoexec, &be_const_str_solidified, @@ -89,18 +88,18 @@ be_local_closure(Tapp_autoexec, /* name */ 0x781A000B, // 0010 JMPF R6 #001D 0xB81A0E00, // 0011 GETNGBL R6 K7 0x8C180D08, // 0012 GETMET R6 R6 K8 - 0x8C200509, // 0013 GETMET R8 R2 K9 - 0x5828000A, // 0014 LDCONST R10 K10 - 0x5C2C0A00, // 0015 MOVE R11 R5 - 0x7C200600, // 0016 CALL R8 3 - 0x5824000B, // 0017 LDCONST R9 K11 + 0x60200018, // 0013 GETGBL R8 G24 + 0x58240009, // 0014 LDCONST R9 K9 + 0x5C280A00, // 0015 MOVE R10 R5 + 0x7C200400, // 0016 CALL R8 2 + 0x5824000A, // 0017 LDCONST R9 K10 0x7C180600, // 0018 CALL R6 3 0xB81A0E00, // 0019 GETNGBL R6 K7 - 0x8C180D0C, // 001A GETMET R6 R6 K12 - 0x00200B0D, // 001B ADD R8 R5 K13 + 0x8C180D0B, // 001A GETMET R6 R6 K11 + 0x00200B0C, // 001B ADD R8 R5 K12 0x7C180400, // 001C CALL R6 2 0x7001FFEA, // 001D JMP #0009 - 0x5810000E, // 001E LDCONST R4 K14 + 0x5810000D, // 001E LDCONST R4 K13 0xAC100200, // 001F CATCH R4 1 0 0xB0080000, // 0020 RAISE 2 R0 R0 0x80000000, // 0021 RET 0 diff --git a/lib/libesp32/berry_tasmota/src/solidify/solidified_tasmota_class.h b/lib/libesp32/berry_tasmota/src/solidify/solidified_tasmota_class.h index 96045d1eb..f40650349 100644 --- a/lib/libesp32/berry_tasmota/src/solidify/solidified_tasmota_class.h +++ b/lib/libesp32/berry_tasmota/src/solidify/solidified_tasmota_class.h @@ -1104,7 +1104,7 @@ be_local_closure(Tasmota_add_driver, /* name */ ********************************************************************/ be_local_closure(Tasmota_load, /* name */ be_nested_proto( - 27, /* nstack */ + 26, /* nstack */ 2, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -1178,7 +1178,7 @@ be_local_closure(Tasmota_load, /* name */ }) ), be_nested_proto( - 10, /* nstack */ + 8, /* nstack */ 1, /* argc */ 0, /* varg */ 0, /* has upvals */ @@ -1186,7 +1186,7 @@ be_local_closure(Tasmota_load, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[10]) { /* constants */ + ( &(const bvalue[ 8]) { /* constants */ /* K0 */ be_nested_str(r), /* K1 */ be_nested_str(readbytes), /* K2 */ be_const_int(3), @@ -1194,13 +1194,11 @@ be_local_closure(Tasmota_load, /* name */ /* K4 */ be_nested_str(BECDFE), /* K5 */ be_const_int(0), /* K6 */ be_nested_str(close), - /* K7 */ be_nested_str(string), - /* K8 */ be_nested_str(format), - /* K9 */ be_nested_str(BRY_X3A_X20failed_X20to_X20load_X20compiled_X20_X27_X25s_X27_X20_X28_X25s_X29), + /* K7 */ be_nested_str(BRY_X3A_X20failed_X20to_X20load_X20compiled_X20_X27_X25s_X27_X20_X28_X25s_X29), }), &be_const_str_try_get_bec_version, &be_const_str_solidified, - ( &(const binstruction[44]) { /* code */ + ( &(const binstruction[43]) { /* code */ 0x4C040000, // 0000 LDNIL R1 0xA8020016, // 0001 EXBLK 0 #0019 0x60080011, // 0002 GETGBL R2 G17 @@ -1225,26 +1223,25 @@ be_local_closure(Tasmota_load, /* name */ 0x8C100306, // 0015 GETMET R4 R1 K6 0x7C100200, // 0016 CALL R4 1 0xA8040001, // 0017 EXBLK 1 1 - 0x70020010, // 0018 JMP #002A + 0x7002000F, // 0018 JMP #0029 0xAC080001, // 0019 CATCH R2 0 1 - 0x7002000D, // 001A JMP #0029 + 0x7002000C, // 001A JMP #0028 0x4C0C0000, // 001B LDNIL R3 0x200C0203, // 001C NE R3 R1 R3 0x780E0001, // 001D JMPF R3 #0020 0x8C0C0306, // 001E GETMET R3 R1 K6 0x7C0C0200, // 001F CALL R3 1 - 0xA40E0E00, // 0020 IMPORT R3 K7 - 0x60100001, // 0021 GETGBL R4 G1 - 0x8C140708, // 0022 GETMET R5 R3 K8 - 0x581C0009, // 0023 LDCONST R7 K9 - 0x5C200000, // 0024 MOVE R8 R0 - 0x5C240400, // 0025 MOVE R9 R2 - 0x7C140800, // 0026 CALL R5 4 - 0x7C100200, // 0027 CALL R4 1 - 0x70020000, // 0028 JMP #002A - 0xB0080000, // 0029 RAISE 2 R0 R0 - 0x4C080000, // 002A LDNIL R2 - 0x80040400, // 002B RET 1 R2 + 0x600C0001, // 0020 GETGBL R3 G1 + 0x60100018, // 0021 GETGBL R4 G24 + 0x58140007, // 0022 LDCONST R5 K7 + 0x5C180000, // 0023 MOVE R6 R0 + 0x5C1C0400, // 0024 MOVE R7 R2 + 0x7C100600, // 0025 CALL R4 3 + 0x7C0C0200, // 0026 CALL R3 1 + 0x70020000, // 0027 JMP #0029 + 0xB0080000, // 0028 RAISE 2 R0 R0 + 0x4C080000, // 0029 LDNIL R2 + 0x80040400, // 002A RET 1 R2 }) ), be_nested_proto( @@ -1281,7 +1278,7 @@ be_local_closure(Tasmota_load, /* name */ }) ), be_nested_proto( - 11, /* nstack */ + 9, /* nstack */ 1, /* argc */ 0, /* varg */ 0, /* has upvals */ @@ -1289,15 +1286,13 @@ be_local_closure(Tasmota_load, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[ 4]) { /* constants */ + ( &(const bvalue[ 2]) { /* constants */ /* K0 */ be_nested_str(file), - /* K1 */ be_nested_str(string), - /* K2 */ be_nested_str(format), - /* K3 */ be_nested_str(BRY_X3A_X20failed_X20to_X20load_X20_X27_X25s_X27_X20_X28_X25s_X20_X2D_X20_X25s_X29), + /* K1 */ be_nested_str(BRY_X3A_X20failed_X20to_X20load_X20_X27_X25s_X27_X20_X28_X25s_X20_X2D_X20_X25s_X29), }), &be_const_str_try_compile, &be_const_str_solidified, - ( &(const binstruction[24]) { /* code */ + ( &(const binstruction[23]) { /* code */ 0xA8020007, // 0000 EXBLK 0 #0009 0x6004000D, // 0001 GETGBL R1 G13 0x5C080000, // 0002 MOVE R2 R0 @@ -1306,26 +1301,25 @@ be_local_closure(Tasmota_load, /* name */ 0xA8040001, // 0005 EXBLK 1 1 0x80040200, // 0006 RET 1 R1 0xA8040001, // 0007 EXBLK 1 1 - 0x7002000C, // 0008 JMP #0016 + 0x7002000B, // 0008 JMP #0015 0xAC040002, // 0009 CATCH R1 0 2 - 0x70020009, // 000A JMP #0015 - 0xA40E0200, // 000B IMPORT R3 K1 - 0x60100001, // 000C GETGBL R4 G1 - 0x8C140702, // 000D GETMET R5 R3 K2 - 0x581C0003, // 000E LDCONST R7 K3 - 0x5C200000, // 000F MOVE R8 R0 - 0x5C240200, // 0010 MOVE R9 R1 - 0x5C280400, // 0011 MOVE R10 R2 - 0x7C140A00, // 0012 CALL R5 5 - 0x7C100200, // 0013 CALL R4 1 - 0x70020000, // 0014 JMP #0016 - 0xB0080000, // 0015 RAISE 2 R0 R0 - 0x4C040000, // 0016 LDNIL R1 - 0x80040200, // 0017 RET 1 R1 + 0x70020008, // 000A JMP #0014 + 0x600C0001, // 000B GETGBL R3 G1 + 0x60100018, // 000C GETGBL R4 G24 + 0x58140001, // 000D LDCONST R5 K1 + 0x5C180000, // 000E MOVE R6 R0 + 0x5C1C0200, // 000F MOVE R7 R1 + 0x5C200400, // 0010 MOVE R8 R2 + 0x7C100800, // 0011 CALL R4 4 + 0x7C0C0200, // 0012 CALL R3 1 + 0x70020000, // 0013 JMP #0015 + 0xB0080000, // 0014 RAISE 2 R0 R0 + 0x4C040000, // 0015 LDNIL R1 + 0x80040200, // 0016 RET 1 R1 }) ), be_nested_proto( - 10, /* nstack */ + 8, /* nstack */ 1, /* argc */ 0, /* varg */ 0, /* has upvals */ @@ -1333,17 +1327,15 @@ be_local_closure(Tasmota_load, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[ 3]) { /* constants */ - /* K0 */ be_nested_str(string), - /* K1 */ be_nested_str(format), - /* K2 */ be_nested_str(BRY_X3A_X20failed_X20to_X20run_X20compiled_X20code_X20_X27_X25s_X27_X20_X2D_X20_X25s), + ( &(const bvalue[ 1]) { /* constants */ + /* K0 */ be_nested_str(BRY_X3A_X20failed_X20to_X20run_X20compiled_X20code_X20_X27_X25s_X27_X20_X2D_X20_X25s), }), &be_const_str_try_run_compiled, &be_const_str_solidified, - ( &(const binstruction[25]) { /* code */ + ( &(const binstruction[24]) { /* code */ 0x4C040000, // 0000 LDNIL R1 0x20040001, // 0001 NE R1 R0 R1 - 0x78060013, // 0002 JMPF R1 #0017 + 0x78060012, // 0002 JMPF R1 #0016 0xA8020006, // 0003 EXBLK 0 #000B 0x5C040000, // 0004 MOVE R1 R0 0x7C040000, // 0005 CALL R1 0 @@ -1351,26 +1343,25 @@ be_local_closure(Tasmota_load, /* name */ 0xA8040001, // 0007 EXBLK 1 1 0x80040200, // 0008 RET 1 R1 0xA8040001, // 0009 EXBLK 1 1 - 0x7002000B, // 000A JMP #0017 + 0x7002000A, // 000A JMP #0016 0xAC040002, // 000B CATCH R1 0 2 - 0x70020008, // 000C JMP #0016 - 0xA40E0000, // 000D IMPORT R3 K0 - 0x60100001, // 000E GETGBL R4 G1 - 0x8C140701, // 000F GETMET R5 R3 K1 - 0x581C0002, // 0010 LDCONST R7 K2 - 0x5C200200, // 0011 MOVE R8 R1 - 0x5C240400, // 0012 MOVE R9 R2 - 0x7C140800, // 0013 CALL R5 4 - 0x7C100200, // 0014 CALL R4 1 - 0x70020000, // 0015 JMP #0017 - 0xB0080000, // 0016 RAISE 2 R0 R0 - 0x50040000, // 0017 LDBOOL R1 0 0 - 0x80040200, // 0018 RET 1 R1 + 0x70020007, // 000C JMP #0015 + 0x600C0001, // 000D GETGBL R3 G1 + 0x60100018, // 000E GETGBL R4 G24 + 0x58140000, // 000F LDCONST R5 K0 + 0x5C180200, // 0010 MOVE R6 R1 + 0x5C1C0400, // 0011 MOVE R7 R2 + 0x7C100600, // 0012 CALL R4 3 + 0x7C0C0200, // 0013 CALL R3 1 + 0x70020000, // 0014 JMP #0016 + 0xB0080000, // 0015 RAISE 2 R0 R0 + 0x50040000, // 0016 LDBOOL R1 0 0 + 0x80040200, // 0017 RET 1 R1 }) ), }), 1, /* has constants */ - ( &(const bvalue[22]) { /* constants */ + ( &(const bvalue[21]) { /* constants */ /* K0 */ be_nested_str(string), /* K1 */ be_nested_str(path), /* K2 */ be_const_int(0), @@ -1388,11 +1379,10 @@ be_local_closure(Tasmota_load, /* name */ /* K14 */ be_nested_str(c), /* K15 */ be_nested_str(wd), /* K16 */ be_nested_str(), - /* K17 */ be_nested_str(format), - /* K18 */ be_nested_str(BRY_X3A_X20corrupt_X20bytecode_X20_X27_X25s_X27), - /* K19 */ be_nested_str(BRY_X3A_X20bytecode_X20has_X20wrong_X20version_X20_X27_X25s_X27_X20_X28_X25i_X29), - /* K20 */ be_nested_str(save), - /* K21 */ be_nested_str(BRY_X3A_X20could_X20not_X20save_X20compiled_X20file_X20_X25s_X20_X28_X25s_X29), + /* K17 */ be_nested_str(BRY_X3A_X20corrupt_X20bytecode_X20_X27_X25s_X27), + /* K18 */ be_nested_str(BRY_X3A_X20bytecode_X20has_X20wrong_X20version_X20_X27_X25s_X27_X20_X28_X25i_X29), + /* K19 */ be_nested_str(save), + /* K20 */ be_nested_str(BRY_X3A_X20could_X20not_X20save_X20compiled_X20file_X20_X25s_X20_X28_X25s_X29), }), &be_const_str_load, &be_const_str_solidified, @@ -1502,10 +1492,10 @@ be_local_closure(Tasmota_load, /* name */ 0x1C542615, // 0066 EQ R21 R19 R21 0x78560007, // 0067 JMPF R21 #0070 0x60540001, // 0068 GETGBL R21 G1 - 0x8C581111, // 0069 GETMET R22 R8 K17 - 0x58600012, // 006A LDCONST R24 K18 - 0x5C642200, // 006B MOVE R25 R17 - 0x7C580600, // 006C CALL R22 3 + 0x60580018, // 0069 GETGBL R22 G24 + 0x585C0011, // 006A LDCONST R23 K17 + 0x5C602200, // 006B MOVE R24 R17 + 0x7C580400, // 006C CALL R22 2 0x7C540200, // 006D CALL R21 1 0x50500000, // 006E LDBOOL R20 0 0 0x7002000A, // 006F JMP #007B @@ -1513,11 +1503,11 @@ be_local_closure(Tasmota_load, /* name */ 0x20542615, // 0071 NE R21 R19 R21 0x78560007, // 0072 JMPF R21 #007B 0x60540001, // 0073 GETGBL R21 G1 - 0x8C581111, // 0074 GETMET R22 R8 K17 - 0x58600013, // 0075 LDCONST R24 K19 - 0x5C642200, // 0076 MOVE R25 R17 - 0x5C682600, // 0077 MOVE R26 R19 - 0x7C580800, // 0078 CALL R22 4 + 0x60580018, // 0074 GETGBL R22 G24 + 0x585C0012, // 0075 LDCONST R23 K18 + 0x5C602200, // 0076 MOVE R24 R17 + 0x5C642600, // 0077 MOVE R25 R19 + 0x7C580600, // 0078 CALL R22 3 0x7C540200, // 0079 CALL R21 1 0x50500000, // 007A LDBOOL R20 0 0 0x78520003, // 007B JMPF R20 #0080 @@ -1548,7 +1538,7 @@ be_local_closure(Tasmota_load, /* name */ 0x5C4C1A00, // 0094 MOVE R19 R13 0x744E0011, // 0095 JMPT R19 #00A8 0xA8020005, // 0096 EXBLK 0 #009D - 0x8C4C0114, // 0097 GETMET R19 R0 K20 + 0x8C4C0113, // 0097 GETMET R19 R0 K19 0x5C542200, // 0098 MOVE R21 R17 0x5C582400, // 0099 MOVE R22 R18 0x7C4C0600, // 009A CALL R19 3 @@ -1557,11 +1547,11 @@ be_local_closure(Tasmota_load, /* name */ 0xAC4C0001, // 009D CATCH R19 0 1 0x70020007, // 009E JMP #00A7 0x60500001, // 009F GETGBL R20 G1 - 0x8C541111, // 00A0 GETMET R21 R8 K17 - 0x585C0015, // 00A1 LDCONST R23 K21 - 0x5C602200, // 00A2 MOVE R24 R17 - 0x5C642600, // 00A3 MOVE R25 R19 - 0x7C540800, // 00A4 CALL R21 4 + 0x60540018, // 00A0 GETGBL R21 G24 + 0x58580014, // 00A1 LDCONST R22 K20 + 0x5C5C2200, // 00A2 MOVE R23 R17 + 0x5C602600, // 00A3 MOVE R24 R19 + 0x7C540600, // 00A4 CALL R21 3 0x7C500200, // 00A5 CALL R20 1 0x70020000, // 00A6 JMP #00A8 0xB0080000, // 00A7 RAISE 2 R0 R0 @@ -1750,7 +1740,7 @@ be_local_closure(Tasmota_exec_tele, /* name */ ********************************************************************/ be_local_closure(Tasmota_time_str, /* name */ be_nested_proto( - 13, /* nstack */ + 11, /* nstack */ 2, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -1758,35 +1748,32 @@ be_local_closure(Tasmota_time_str, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[10]) { /* constants */ - /* K0 */ be_nested_str(string), - /* K1 */ be_nested_str(time_dump), - /* K2 */ be_nested_str(format), - /* K3 */ be_nested_str(_X2504d_X2D_X2502d_X2D_X2502dT_X2502d_X3A_X2502d_X3A_X2502d), - /* K4 */ be_nested_str(year), - /* K5 */ be_nested_str(month), - /* K6 */ be_nested_str(day), - /* K7 */ be_nested_str(hour), - /* K8 */ be_nested_str(min), - /* K9 */ be_nested_str(sec), + ( &(const bvalue[ 8]) { /* constants */ + /* K0 */ be_nested_str(time_dump), + /* K1 */ be_nested_str(_X2504d_X2D_X2502d_X2D_X2502dT_X2502d_X3A_X2502d_X3A_X2502d), + /* K2 */ be_nested_str(year), + /* K3 */ be_nested_str(month), + /* K4 */ be_nested_str(day), + /* K5 */ be_nested_str(hour), + /* K6 */ be_nested_str(min), + /* K7 */ be_nested_str(sec), }), &be_const_str_time_str, &be_const_str_solidified, - ( &(const binstruction[14]) { /* code */ - 0xA40A0000, // 0000 IMPORT R2 K0 - 0x8C0C0101, // 0001 GETMET R3 R0 K1 - 0x5C140200, // 0002 MOVE R5 R1 - 0x7C0C0400, // 0003 CALL R3 2 - 0x8C100502, // 0004 GETMET R4 R2 K2 - 0x58180003, // 0005 LDCONST R6 K3 - 0x941C0704, // 0006 GETIDX R7 R3 K4 - 0x94200705, // 0007 GETIDX R8 R3 K5 - 0x94240706, // 0008 GETIDX R9 R3 K6 - 0x94280707, // 0009 GETIDX R10 R3 K7 - 0x942C0708, // 000A GETIDX R11 R3 K8 - 0x94300709, // 000B GETIDX R12 R3 K9 - 0x7C101000, // 000C CALL R4 8 - 0x80040800, // 000D RET 1 R4 + ( &(const binstruction[13]) { /* code */ + 0x8C080100, // 0000 GETMET R2 R0 K0 + 0x5C100200, // 0001 MOVE R4 R1 + 0x7C080400, // 0002 CALL R2 2 + 0x600C0018, // 0003 GETGBL R3 G24 + 0x58100001, // 0004 LDCONST R4 K1 + 0x94140502, // 0005 GETIDX R5 R2 K2 + 0x94180503, // 0006 GETIDX R6 R2 K3 + 0x941C0504, // 0007 GETIDX R7 R2 K4 + 0x94200505, // 0008 GETIDX R8 R2 K5 + 0x94240506, // 0009 GETIDX R9 R2 K6 + 0x94280507, // 000A GETIDX R10 R2 K7 + 0x7C0C0E00, // 000B CALL R3 7 + 0x80040600, // 000C RET 1 R3 }) ) ); @@ -2315,7 +2302,7 @@ be_local_closure(Tasmota_gen_cb, /* name */ ********************************************************************/ be_local_closure(Tasmota_event, /* name */ be_nested_proto( - 21, /* nstack */ + 19, /* nstack */ 6, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -2323,147 +2310,144 @@ be_local_closure(Tasmota_event, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[27]) { /* constants */ + ( &(const bvalue[25]) { /* constants */ /* K0 */ be_nested_str(introspect), - /* K1 */ be_nested_str(string), - /* K2 */ be_nested_str(every_50ms), - /* K3 */ be_nested_str(run_deferred), - /* K4 */ be_nested_str(every_250ms), - /* K5 */ be_nested_str(run_cron), - /* K6 */ be_nested_str(mqtt_data), - /* K7 */ be_nested_str(cmd), - /* K8 */ be_nested_str(exec_cmd), - /* K9 */ be_nested_str(tele), - /* K10 */ be_nested_str(exec_tele), - /* K11 */ be_nested_str(rule), - /* K12 */ be_nested_str(exec_rules), - /* K13 */ be_nested_str(gc), - /* K14 */ be_nested_str(_drivers), - /* K15 */ be_const_int(0), - /* K16 */ be_nested_str(get), - /* K17 */ be_nested_str(function), - /* K18 */ be_nested_str(format), - /* K19 */ be_nested_str(BRY_X3A_X20Exception_X3E_X20_X27_X25s_X27_X20_X2D_X20_X25s), - /* K20 */ be_nested_str(_debug_present), - /* K21 */ be_nested_str(debug), - /* K22 */ be_nested_str(traceback), - /* K23 */ be_const_int(1), - /* K24 */ be_nested_str(save_before_restart), - /* K25 */ be_nested_str(persist), - /* K26 */ be_nested_str(save), + /* K1 */ be_nested_str(every_50ms), + /* K2 */ be_nested_str(run_deferred), + /* K3 */ be_nested_str(every_250ms), + /* K4 */ be_nested_str(run_cron), + /* K5 */ be_nested_str(mqtt_data), + /* K6 */ be_nested_str(cmd), + /* K7 */ be_nested_str(exec_cmd), + /* K8 */ be_nested_str(tele), + /* K9 */ be_nested_str(exec_tele), + /* K10 */ be_nested_str(rule), + /* K11 */ be_nested_str(exec_rules), + /* K12 */ be_nested_str(gc), + /* K13 */ be_nested_str(_drivers), + /* K14 */ be_const_int(0), + /* K15 */ be_nested_str(get), + /* K16 */ be_nested_str(function), + /* K17 */ be_nested_str(BRY_X3A_X20Exception_X3E_X20_X27_X25s_X27_X20_X2D_X20_X25s), + /* K18 */ be_nested_str(_debug_present), + /* K19 */ be_nested_str(debug), + /* K20 */ be_nested_str(traceback), + /* K21 */ be_const_int(1), + /* K22 */ be_nested_str(save_before_restart), + /* K23 */ be_nested_str(persist), + /* K24 */ be_nested_str(save), }), &be_const_str_event, &be_const_str_solidified, - ( &(const binstruction[109]) { /* code */ + ( &(const binstruction[108]) { /* code */ 0xA41A0000, // 0000 IMPORT R6 K0 - 0xA41E0200, // 0001 IMPORT R7 K1 - 0x1C200302, // 0002 EQ R8 R1 K2 - 0x78220001, // 0003 JMPF R8 #0006 - 0x8C200103, // 0004 GETMET R8 R0 K3 - 0x7C200200, // 0005 CALL R8 1 - 0x1C200304, // 0006 EQ R8 R1 K4 - 0x78220001, // 0007 JMPF R8 #000A - 0x8C200105, // 0008 GETMET R8 R0 K5 - 0x7C200200, // 0009 CALL R8 1 + 0x1C1C0301, // 0001 EQ R7 R1 K1 + 0x781E0001, // 0002 JMPF R7 #0005 + 0x8C1C0102, // 0003 GETMET R7 R0 K2 + 0x7C1C0200, // 0004 CALL R7 1 + 0x1C1C0303, // 0005 EQ R7 R1 K3 + 0x781E0001, // 0006 JMPF R7 #0009 + 0x8C1C0104, // 0007 GETMET R7 R0 K4 + 0x7C1C0200, // 0008 CALL R7 1 + 0x501C0000, // 0009 LDBOOL R7 0 0 0x50200000, // 000A LDBOOL R8 0 0 - 0x50240000, // 000B LDBOOL R9 0 0 - 0x1C280306, // 000C EQ R10 R1 K6 - 0x782A0000, // 000D JMPF R10 #000F - 0x50240200, // 000E LDBOOL R9 1 0 - 0x1C280307, // 000F EQ R10 R1 K7 - 0x782A0006, // 0010 JMPF R10 #0018 - 0x8C280108, // 0011 GETMET R10 R0 K8 - 0x5C300400, // 0012 MOVE R12 R2 - 0x5C340600, // 0013 MOVE R13 R3 - 0x5C380800, // 0014 MOVE R14 R4 - 0x7C280800, // 0015 CALL R10 4 - 0x80041400, // 0016 RET 1 R10 - 0x7002004E, // 0017 JMP #0067 - 0x1C280309, // 0018 EQ R10 R1 K9 - 0x782A0004, // 0019 JMPF R10 #001F - 0x8C28010A, // 001A GETMET R10 R0 K10 - 0x5C300800, // 001B MOVE R12 R4 - 0x7C280400, // 001C CALL R10 2 - 0x80041400, // 001D RET 1 R10 - 0x70020047, // 001E JMP #0067 - 0x1C28030B, // 001F EQ R10 R1 K11 - 0x782A0007, // 0020 JMPF R10 #0029 - 0x8C28010C, // 0021 GETMET R10 R0 K12 - 0x5C300800, // 0022 MOVE R12 R4 - 0x60340017, // 0023 GETGBL R13 G23 - 0x5C380600, // 0024 MOVE R14 R3 - 0x7C340200, // 0025 CALL R13 1 - 0x7C280600, // 0026 CALL R10 3 - 0x80041400, // 0027 RET 1 R10 - 0x7002003D, // 0028 JMP #0067 - 0x1C28030D, // 0029 EQ R10 R1 K13 - 0x782A0003, // 002A JMPF R10 #002F - 0x8C28010D, // 002B GETMET R10 R0 K13 - 0x7C280200, // 002C CALL R10 1 - 0x80041400, // 002D RET 1 R10 - 0x70020037, // 002E JMP #0067 - 0x8828010E, // 002F GETMBR R10 R0 K14 - 0x782A0035, // 0030 JMPF R10 #0067 - 0x5828000F, // 0031 LDCONST R10 K15 - 0x602C000C, // 0032 GETGBL R11 G12 - 0x8830010E, // 0033 GETMBR R12 R0 K14 - 0x7C2C0200, // 0034 CALL R11 1 - 0x142C140B, // 0035 LT R11 R10 R11 - 0x782E002F, // 0036 JMPF R11 #0067 - 0x882C010E, // 0037 GETMBR R11 R0 K14 - 0x942C160A, // 0038 GETIDX R11 R11 R10 - 0x8C300D10, // 0039 GETMET R12 R6 K16 - 0x5C381600, // 003A MOVE R14 R11 - 0x5C3C0200, // 003B MOVE R15 R1 - 0x7C300600, // 003C CALL R12 3 - 0x60340004, // 003D GETGBL R13 G4 - 0x5C381800, // 003E MOVE R14 R12 - 0x7C340200, // 003F CALL R13 1 - 0x1C341B11, // 0040 EQ R13 R13 K17 - 0x78360022, // 0041 JMPF R13 #0065 - 0xA8020011, // 0042 EXBLK 0 #0055 - 0x5C341800, // 0043 MOVE R13 R12 - 0x5C381600, // 0044 MOVE R14 R11 - 0x5C3C0400, // 0045 MOVE R15 R2 - 0x5C400600, // 0046 MOVE R16 R3 - 0x5C440800, // 0047 MOVE R17 R4 - 0x5C480A00, // 0048 MOVE R18 R5 - 0x7C340A00, // 0049 CALL R13 5 - 0x74360001, // 004A JMPT R13 #004D - 0x74220000, // 004B JMPT R8 #004D - 0x50200001, // 004C LDBOOL R8 0 1 - 0x50200200, // 004D LDBOOL R8 1 0 - 0x78220003, // 004E JMPF R8 #0053 - 0x5C341200, // 004F MOVE R13 R9 - 0x74360001, // 0050 JMPT R13 #0053 - 0xA8040001, // 0051 EXBLK 1 1 - 0x70020013, // 0052 JMP #0067 - 0xA8040001, // 0053 EXBLK 1 1 - 0x7002000F, // 0054 JMP #0065 - 0xAC340002, // 0055 CATCH R13 0 2 - 0x7002000C, // 0056 JMP #0064 - 0x603C0001, // 0057 GETGBL R15 G1 - 0x8C400F12, // 0058 GETMET R16 R7 K18 - 0x58480013, // 0059 LDCONST R18 K19 - 0x5C4C1A00, // 005A MOVE R19 R13 - 0x5C501C00, // 005B MOVE R20 R14 - 0x7C400800, // 005C CALL R16 4 - 0x7C3C0200, // 005D CALL R15 1 - 0x883C0114, // 005E GETMBR R15 R0 K20 - 0x783E0002, // 005F JMPF R15 #0063 - 0xA43E2A00, // 0060 IMPORT R15 K21 - 0x8C401F16, // 0061 GETMET R16 R15 K22 - 0x7C400200, // 0062 CALL R16 1 - 0x70020000, // 0063 JMP #0065 - 0xB0080000, // 0064 RAISE 2 R0 R0 - 0x00281517, // 0065 ADD R10 R10 K23 - 0x7001FFCA, // 0066 JMP #0032 - 0x1C280318, // 0067 EQ R10 R1 K24 - 0x782A0002, // 0068 JMPF R10 #006C - 0xA42A3200, // 0069 IMPORT R10 K25 - 0x8C2C151A, // 006A GETMET R11 R10 K26 - 0x7C2C0200, // 006B CALL R11 1 - 0x80041000, // 006C RET 1 R8 + 0x1C240305, // 000B EQ R9 R1 K5 + 0x78260000, // 000C JMPF R9 #000E + 0x50200200, // 000D LDBOOL R8 1 0 + 0x1C240306, // 000E EQ R9 R1 K6 + 0x78260006, // 000F JMPF R9 #0017 + 0x8C240107, // 0010 GETMET R9 R0 K7 + 0x5C2C0400, // 0011 MOVE R11 R2 + 0x5C300600, // 0012 MOVE R12 R3 + 0x5C340800, // 0013 MOVE R13 R4 + 0x7C240800, // 0014 CALL R9 4 + 0x80041200, // 0015 RET 1 R9 + 0x7002004E, // 0016 JMP #0066 + 0x1C240308, // 0017 EQ R9 R1 K8 + 0x78260004, // 0018 JMPF R9 #001E + 0x8C240109, // 0019 GETMET R9 R0 K9 + 0x5C2C0800, // 001A MOVE R11 R4 + 0x7C240400, // 001B CALL R9 2 + 0x80041200, // 001C RET 1 R9 + 0x70020047, // 001D JMP #0066 + 0x1C24030A, // 001E EQ R9 R1 K10 + 0x78260007, // 001F JMPF R9 #0028 + 0x8C24010B, // 0020 GETMET R9 R0 K11 + 0x5C2C0800, // 0021 MOVE R11 R4 + 0x60300017, // 0022 GETGBL R12 G23 + 0x5C340600, // 0023 MOVE R13 R3 + 0x7C300200, // 0024 CALL R12 1 + 0x7C240600, // 0025 CALL R9 3 + 0x80041200, // 0026 RET 1 R9 + 0x7002003D, // 0027 JMP #0066 + 0x1C24030C, // 0028 EQ R9 R1 K12 + 0x78260003, // 0029 JMPF R9 #002E + 0x8C24010C, // 002A GETMET R9 R0 K12 + 0x7C240200, // 002B CALL R9 1 + 0x80041200, // 002C RET 1 R9 + 0x70020037, // 002D JMP #0066 + 0x8824010D, // 002E GETMBR R9 R0 K13 + 0x78260035, // 002F JMPF R9 #0066 + 0x5824000E, // 0030 LDCONST R9 K14 + 0x6028000C, // 0031 GETGBL R10 G12 + 0x882C010D, // 0032 GETMBR R11 R0 K13 + 0x7C280200, // 0033 CALL R10 1 + 0x1428120A, // 0034 LT R10 R9 R10 + 0x782A002F, // 0035 JMPF R10 #0066 + 0x8828010D, // 0036 GETMBR R10 R0 K13 + 0x94281409, // 0037 GETIDX R10 R10 R9 + 0x8C2C0D0F, // 0038 GETMET R11 R6 K15 + 0x5C341400, // 0039 MOVE R13 R10 + 0x5C380200, // 003A MOVE R14 R1 + 0x7C2C0600, // 003B CALL R11 3 + 0x60300004, // 003C GETGBL R12 G4 + 0x5C341600, // 003D MOVE R13 R11 + 0x7C300200, // 003E CALL R12 1 + 0x1C301910, // 003F EQ R12 R12 K16 + 0x78320022, // 0040 JMPF R12 #0064 + 0xA8020011, // 0041 EXBLK 0 #0054 + 0x5C301600, // 0042 MOVE R12 R11 + 0x5C341400, // 0043 MOVE R13 R10 + 0x5C380400, // 0044 MOVE R14 R2 + 0x5C3C0600, // 0045 MOVE R15 R3 + 0x5C400800, // 0046 MOVE R16 R4 + 0x5C440A00, // 0047 MOVE R17 R5 + 0x7C300A00, // 0048 CALL R12 5 + 0x74320001, // 0049 JMPT R12 #004C + 0x741E0000, // 004A JMPT R7 #004C + 0x501C0001, // 004B LDBOOL R7 0 1 + 0x501C0200, // 004C LDBOOL R7 1 0 + 0x781E0003, // 004D JMPF R7 #0052 + 0x5C301000, // 004E MOVE R12 R8 + 0x74320001, // 004F JMPT R12 #0052 + 0xA8040001, // 0050 EXBLK 1 1 + 0x70020013, // 0051 JMP #0066 + 0xA8040001, // 0052 EXBLK 1 1 + 0x7002000F, // 0053 JMP #0064 + 0xAC300002, // 0054 CATCH R12 0 2 + 0x7002000C, // 0055 JMP #0063 + 0x60380001, // 0056 GETGBL R14 G1 + 0x603C0018, // 0057 GETGBL R15 G24 + 0x58400011, // 0058 LDCONST R16 K17 + 0x5C441800, // 0059 MOVE R17 R12 + 0x5C481A00, // 005A MOVE R18 R13 + 0x7C3C0600, // 005B CALL R15 3 + 0x7C380200, // 005C CALL R14 1 + 0x88380112, // 005D GETMBR R14 R0 K18 + 0x783A0002, // 005E JMPF R14 #0062 + 0xA43A2600, // 005F IMPORT R14 K19 + 0x8C3C1D14, // 0060 GETMET R15 R14 K20 + 0x7C3C0200, // 0061 CALL R15 1 + 0x70020000, // 0062 JMP #0064 + 0xB0080000, // 0063 RAISE 2 R0 R0 + 0x00241315, // 0064 ADD R9 R9 K21 + 0x7001FFCA, // 0065 JMP #0031 + 0x1C240316, // 0066 EQ R9 R1 K22 + 0x78260002, // 0067 JMPF R9 #006B + 0xA4262E00, // 0068 IMPORT R9 K23 + 0x8C281318, // 0069 GETMET R10 R9 K24 + 0x7C280200, // 006A CALL R10 1 + 0x80040E00, // 006B RET 1 R7 }) ) ); diff --git a/lib/libesp32/berry_tasmota/src/solidify/solidified_trigger_class.h b/lib/libesp32/berry_tasmota/src/solidify/solidified_trigger_class.h index 5a42d66bf..8373c3722 100644 --- a/lib/libesp32/berry_tasmota/src/solidify/solidified_trigger_class.h +++ b/lib/libesp32/berry_tasmota/src/solidify/solidified_trigger_class.h @@ -44,7 +44,7 @@ be_local_closure(Trigger_init, /* name */ ********************************************************************/ be_local_closure(Trigger_tostring, /* name */ be_nested_proto( - 10, /* nstack */ + 8, /* nstack */ 1, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -52,36 +52,33 @@ be_local_closure(Trigger_tostring, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[ 6]) { /* constants */ - /* K0 */ be_nested_str(string), - /* K1 */ be_nested_str(format), - /* K2 */ be_nested_str(_X3Cinstance_X3A_X20_X25s_X28_X25s_X2C_X20_X25s_X2C_X20_X25s_X29), - /* K3 */ be_nested_str(trig), - /* K4 */ be_nested_str(f), - /* K5 */ be_nested_str(id), + ( &(const bvalue[ 4]) { /* constants */ + /* K0 */ be_nested_str(_X3Cinstance_X3A_X20_X25s_X28_X25s_X2C_X20_X25s_X2C_X20_X25s_X29), + /* K1 */ be_nested_str(trig), + /* K2 */ be_nested_str(f), + /* K3 */ be_nested_str(id), }), &be_const_str_tostring, &be_const_str_solidified, - ( &(const binstruction[19]) { /* code */ - 0xA4060000, // 0000 IMPORT R1 K0 - 0x8C080301, // 0001 GETMET R2 R1 K1 - 0x58100002, // 0002 LDCONST R4 K2 - 0x60140008, // 0003 GETGBL R5 G8 - 0x60180006, // 0004 GETGBL R6 G6 - 0x5C1C0000, // 0005 MOVE R7 R0 - 0x7C180200, // 0006 CALL R6 1 - 0x7C140200, // 0007 CALL R5 1 - 0x60180008, // 0008 GETGBL R6 G8 - 0x881C0103, // 0009 GETMBR R7 R0 K3 - 0x7C180200, // 000A CALL R6 1 - 0x601C0008, // 000B GETGBL R7 G8 - 0x88200104, // 000C GETMBR R8 R0 K4 - 0x7C1C0200, // 000D CALL R7 1 - 0x60200008, // 000E GETGBL R8 G8 - 0x88240105, // 000F GETMBR R9 R0 K5 - 0x7C200200, // 0010 CALL R8 1 - 0x7C080C00, // 0011 CALL R2 6 - 0x80040400, // 0012 RET 1 R2 + ( &(const binstruction[18]) { /* code */ + 0x60040018, // 0000 GETGBL R1 G24 + 0x58080000, // 0001 LDCONST R2 K0 + 0x600C0008, // 0002 GETGBL R3 G8 + 0x60100006, // 0003 GETGBL R4 G6 + 0x5C140000, // 0004 MOVE R5 R0 + 0x7C100200, // 0005 CALL R4 1 + 0x7C0C0200, // 0006 CALL R3 1 + 0x60100008, // 0007 GETGBL R4 G8 + 0x88140101, // 0008 GETMBR R5 R0 K1 + 0x7C100200, // 0009 CALL R4 1 + 0x60140008, // 000A GETGBL R5 G8 + 0x88180102, // 000B GETMBR R6 R0 K2 + 0x7C140200, // 000C CALL R5 1 + 0x60180008, // 000D GETGBL R6 G8 + 0x881C0103, // 000E GETMBR R7 R0 K3 + 0x7C180200, // 000F CALL R6 1 + 0x7C040A00, // 0010 CALL R1 5 + 0x80040200, // 0011 RET 1 R1 }) ) ); diff --git a/lib/libesp32/berry_tasmota/src/solidify/solidified_uuid.h b/lib/libesp32/berry_tasmota/src/solidify/solidified_uuid.h index 804384612..b02da5c7c 100644 --- a/lib/libesp32/berry_tasmota/src/solidify/solidified_uuid.h +++ b/lib/libesp32/berry_tasmota/src/solidify/solidified_uuid.h @@ -9,7 +9,7 @@ ********************************************************************/ be_local_closure(uuid__anonymous_, /* name */ be_nested_proto( - 12, /* nstack */ + 10, /* nstack */ 0, /* argc */ 0, /* varg */ 0, /* has upvals */ @@ -17,46 +17,43 @@ be_local_closure(uuid__anonymous_, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[ 5]) { /* constants */ - /* K0 */ be_nested_str(string), - /* K1 */ be_nested_str(math), - /* K2 */ be_nested_str(format), - /* K3 */ be_nested_str(_X2508x_X2D_X2504x_X2D_X2504x_X2D_X2504x_X2D_X2504x_X2508x), - /* K4 */ be_nested_str(rand), + ( &(const bvalue[ 3]) { /* constants */ + /* K0 */ be_nested_str(math), + /* K1 */ be_nested_str(_X2508x_X2D_X2504x_X2D_X2504x_X2D_X2504x_X2D_X2504x_X2508x), + /* K2 */ be_nested_str(rand), }), &be_const_str__anonymous_, &be_const_str_solidified, - ( &(const binstruction[30]) { /* code */ + ( &(const binstruction[29]) { /* code */ 0xA4020000, // 0000 IMPORT R0 K0 - 0xA4060200, // 0001 IMPORT R1 K1 - 0x8C080102, // 0002 GETMET R2 R0 K2 - 0x58100003, // 0003 LDCONST R4 K3 - 0x8C140304, // 0004 GETMET R5 R1 K4 - 0x7C140200, // 0005 CALL R5 1 - 0x8C180304, // 0006 GETMET R6 R1 K4 - 0x7C180200, // 0007 CALL R6 1 - 0x541EFFFE, // 0008 LDINT R7 65535 - 0x2C180C07, // 0009 AND R6 R6 R7 - 0x8C1C0304, // 000A GETMET R7 R1 K4 - 0x7C1C0200, // 000B CALL R7 1 - 0x54220FFE, // 000C LDINT R8 4095 - 0x2C1C0E08, // 000D AND R7 R7 R8 - 0x54223FFF, // 000E LDINT R8 16384 - 0x301C0E08, // 000F OR R7 R7 R8 - 0x8C200304, // 0010 GETMET R8 R1 K4 - 0x7C200200, // 0011 CALL R8 1 - 0x54263FFE, // 0012 LDINT R9 16383 - 0x2C201009, // 0013 AND R8 R8 R9 - 0x54267FFF, // 0014 LDINT R9 32768 - 0x30201009, // 0015 OR R8 R8 R9 - 0x8C240304, // 0016 GETMET R9 R1 K4 - 0x7C240200, // 0017 CALL R9 1 - 0x542AFFFE, // 0018 LDINT R10 65535 - 0x2C24120A, // 0019 AND R9 R9 R10 - 0x8C280304, // 001A GETMET R10 R1 K4 - 0x7C280200, // 001B CALL R10 1 - 0x7C081000, // 001C CALL R2 8 - 0x80040400, // 001D RET 1 R2 + 0x60040018, // 0001 GETGBL R1 G24 + 0x58080001, // 0002 LDCONST R2 K1 + 0x8C0C0102, // 0003 GETMET R3 R0 K2 + 0x7C0C0200, // 0004 CALL R3 1 + 0x8C100102, // 0005 GETMET R4 R0 K2 + 0x7C100200, // 0006 CALL R4 1 + 0x5416FFFE, // 0007 LDINT R5 65535 + 0x2C100805, // 0008 AND R4 R4 R5 + 0x8C140102, // 0009 GETMET R5 R0 K2 + 0x7C140200, // 000A CALL R5 1 + 0x541A0FFE, // 000B LDINT R6 4095 + 0x2C140A06, // 000C AND R5 R5 R6 + 0x541A3FFF, // 000D LDINT R6 16384 + 0x30140A06, // 000E OR R5 R5 R6 + 0x8C180102, // 000F GETMET R6 R0 K2 + 0x7C180200, // 0010 CALL R6 1 + 0x541E3FFE, // 0011 LDINT R7 16383 + 0x2C180C07, // 0012 AND R6 R6 R7 + 0x541E7FFF, // 0013 LDINT R7 32768 + 0x30180C07, // 0014 OR R6 R6 R7 + 0x8C1C0102, // 0015 GETMET R7 R0 K2 + 0x7C1C0200, // 0016 CALL R7 1 + 0x5422FFFE, // 0017 LDINT R8 65535 + 0x2C1C0E08, // 0018 AND R7 R7 R8 + 0x8C200102, // 0019 GETMET R8 R0 K2 + 0x7C200200, // 001A CALL R8 1 + 0x7C040E00, // 001B CALL R1 7 + 0x80040200, // 001C RET 1 R1 }) ) ); diff --git a/lib/libesp32/berry_tasmota/src/solidify/solidified_zigbee.h b/lib/libesp32/berry_tasmota/src/solidify/solidified_zigbee.h index 04e8bf1dd..0c1dc7c27 100644 --- a/lib/libesp32/berry_tasmota/src/solidify/solidified_zigbee.h +++ b/lib/libesp32/berry_tasmota/src/solidify/solidified_zigbee.h @@ -9,7 +9,7 @@ ********************************************************************/ be_local_closure(zb_device_tostring, /* name */ be_nested_proto( - 14, /* nstack */ + 12, /* nstack */ 1, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -17,44 +17,41 @@ be_local_closure(zb_device_tostring, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[11]) { /* constants */ + ( &(const bvalue[ 9]) { /* constants */ /* K0 */ be_nested_str_weak(json), - /* K1 */ be_nested_str_weak(string), - /* K2 */ be_nested_str_weak(longaddr), - /* K3 */ be_nested_str_weak(format), - /* K4 */ be_nested_str_weak(_X3Cinstance_X3A_X20_X25s_X280x_X2504X_X2C_X200x_X2508X_X2508X_X2C_X20name_X3A_X27_X25s_X27_X2C_X20model_X3A_X27_X25s_X27_X2C_X20manufacturer_X3A_X27_X25s_X27_X29_X3E), - /* K5 */ be_nested_str_weak(shortaddr), - /* K6 */ be_nested_str_weak(get), - /* K7 */ be_const_int(0), - /* K8 */ be_nested_str_weak(name), - /* K9 */ be_nested_str_weak(model), - /* K10 */ be_nested_str_weak(manufacturer), + /* K1 */ be_nested_str_weak(longaddr), + /* K2 */ be_nested_str_weak(_X3Cinstance_X3A_X20_X25s_X280x_X2504X_X2C_X200x_X2508X_X2508X_X2C_X20name_X3A_X27_X25s_X27_X2C_X20model_X3A_X27_X25s_X27_X2C_X20manufacturer_X3A_X27_X25s_X27_X29_X3E), + /* K3 */ be_nested_str_weak(shortaddr), + /* K4 */ be_nested_str_weak(get), + /* K5 */ be_const_int(0), + /* K6 */ be_nested_str_weak(name), + /* K7 */ be_nested_str_weak(model), + /* K8 */ be_nested_str_weak(manufacturer), }), be_str_weak(tostring), &be_const_str_solidified, - ( &(const binstruction[22]) { /* code */ + ( &(const binstruction[21]) { /* code */ 0xA4060000, // 0000 IMPORT R1 K0 - 0xA40A0200, // 0001 IMPORT R2 K1 - 0x880C0102, // 0002 GETMBR R3 R0 K2 - 0x8C100503, // 0003 GETMET R4 R2 K3 - 0x58180004, // 0004 LDCONST R6 K4 - 0x601C0005, // 0005 GETGBL R7 G5 - 0x5C200000, // 0006 MOVE R8 R0 - 0x7C1C0200, // 0007 CALL R7 1 - 0x88200105, // 0008 GETMBR R8 R0 K5 - 0x8C240706, // 0009 GETMET R9 R3 K6 - 0x542E0003, // 000A LDINT R11 4 - 0x54320003, // 000B LDINT R12 4 - 0x7C240600, // 000C CALL R9 3 - 0x8C280706, // 000D GETMET R10 R3 K6 - 0x58300007, // 000E LDCONST R12 K7 - 0x54360003, // 000F LDINT R13 4 - 0x7C280600, // 0010 CALL R10 3 - 0x882C0108, // 0011 GETMBR R11 R0 K8 - 0x88300109, // 0012 GETMBR R12 R0 K9 - 0x8834010A, // 0013 GETMBR R13 R0 K10 - 0x7C101200, // 0014 CALL R4 9 - 0x80040800, // 0015 RET 1 R4 + 0x88080101, // 0001 GETMBR R2 R0 K1 + 0x600C0018, // 0002 GETGBL R3 G24 + 0x58100002, // 0003 LDCONST R4 K2 + 0x60140005, // 0004 GETGBL R5 G5 + 0x5C180000, // 0005 MOVE R6 R0 + 0x7C140200, // 0006 CALL R5 1 + 0x88180103, // 0007 GETMBR R6 R0 K3 + 0x8C1C0504, // 0008 GETMET R7 R2 K4 + 0x54260003, // 0009 LDINT R9 4 + 0x542A0003, // 000A LDINT R10 4 + 0x7C1C0600, // 000B CALL R7 3 + 0x8C200504, // 000C GETMET R8 R2 K4 + 0x58280005, // 000D LDCONST R10 K5 + 0x542E0003, // 000E LDINT R11 4 + 0x7C200600, // 000F CALL R8 3 + 0x88240106, // 0010 GETMBR R9 R0 K6 + 0x88280107, // 0011 GETMBR R10 R0 K7 + 0x882C0108, // 0012 GETMBR R11 R0 K8 + 0x7C0C1000, // 0013 CALL R3 8 + 0x80040600, // 0014 RET 1 R3 }) ) ); diff --git a/lib/libesp32/berry_tasmota/src/solidify/solidified_zigbee_zb_coord.h b/lib/libesp32/berry_tasmota/src/solidify/solidified_zigbee_zb_coord.h index 425e256a3..b39885b98 100644 --- a/lib/libesp32/berry_tasmota/src/solidify/solidified_zigbee_zb_coord.h +++ b/lib/libesp32/berry_tasmota/src/solidify/solidified_zigbee_zb_coord.h @@ -97,7 +97,7 @@ be_local_closure(zb_coord_add_handler, /* name */ ********************************************************************/ be_local_closure(zb_coord_dispatch, /* name */ be_nested_proto( - 21, /* nstack */ + 19, /* nstack */ 5, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -105,98 +105,95 @@ be_local_closure(zb_coord_dispatch, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[16]) { /* constants */ + ( &(const bvalue[14]) { /* constants */ /* K0 */ be_nested_str_weak(_handlers), /* K1 */ be_nested_str_weak(introspect), - /* K2 */ be_nested_str_weak(string), - /* K3 */ be_nested_str_weak(toptr), - /* K4 */ be_const_int(0), - /* K5 */ be_nested_str_weak(zcl_frame), - /* K6 */ be_nested_str_weak(zcl_attribute_list), - /* K7 */ be_nested_str_weak(get), - /* K8 */ be_nested_str_weak(function), - /* K9 */ be_nested_str_weak(format), - /* K10 */ be_nested_str_weak(BRY_X3A_X20Exception_X3E_X20_X27_X25s_X27_X20_X2D_X20_X25s), - /* K11 */ be_nested_str_weak(tasmota), - /* K12 */ be_nested_str_weak(_debug_present), - /* K13 */ be_nested_str_weak(debug), - /* K14 */ be_nested_str_weak(traceback), - /* K15 */ be_const_int(1), + /* K2 */ be_nested_str_weak(toptr), + /* K3 */ be_const_int(0), + /* K4 */ be_nested_str_weak(zcl_frame), + /* K5 */ be_nested_str_weak(zcl_attribute_list), + /* K6 */ be_nested_str_weak(get), + /* K7 */ be_nested_str_weak(function), + /* K8 */ be_nested_str_weak(BRY_X3A_X20Exception_X3E_X20_X27_X25s_X27_X20_X2D_X20_X25s), + /* K9 */ be_nested_str_weak(tasmota), + /* K10 */ be_nested_str_weak(_debug_present), + /* K11 */ be_nested_str_weak(debug), + /* K12 */ be_nested_str_weak(traceback), + /* K13 */ be_const_int(1), }), be_str_weak(dispatch), &be_const_str_solidified, - ( &(const binstruction[71]) { /* code */ + ( &(const binstruction[70]) { /* code */ 0x88140100, // 0000 GETMBR R5 R0 K0 0x4C180000, // 0001 LDNIL R6 0x1C140A06, // 0002 EQ R5 R5 R6 0x78160000, // 0003 JMPF R5 #0005 0x80000A00, // 0004 RET 0 0xA4160200, // 0005 IMPORT R5 K1 - 0xA41A0400, // 0006 IMPORT R6 K2 + 0x4C180000, // 0006 LDNIL R6 0x4C1C0000, // 0007 LDNIL R7 - 0x4C200000, // 0008 LDNIL R8 - 0x8C240B03, // 0009 GETMET R9 R5 K3 - 0x582C0004, // 000A LDCONST R11 K4 - 0x7C240400, // 000B CALL R9 2 - 0x20280409, // 000C NE R10 R2 R9 - 0x782A0003, // 000D JMPF R10 #0012 - 0x8C280105, // 000E GETMET R10 R0 K5 - 0x5C300400, // 000F MOVE R12 R2 - 0x7C280400, // 0010 CALL R10 2 - 0x5C1C1400, // 0011 MOVE R7 R10 - 0x20280609, // 0012 NE R10 R3 R9 - 0x782A0003, // 0013 JMPF R10 #0018 - 0x8C280106, // 0014 GETMET R10 R0 K6 - 0x5C300600, // 0015 MOVE R12 R3 - 0x7C280400, // 0016 CALL R10 2 - 0x5C201400, // 0017 MOVE R8 R10 - 0x58280004, // 0018 LDCONST R10 K4 - 0x602C000C, // 0019 GETGBL R11 G12 - 0x88300100, // 001A GETMBR R12 R0 K0 - 0x7C2C0200, // 001B CALL R11 1 - 0x142C140B, // 001C LT R11 R10 R11 - 0x782E0027, // 001D JMPF R11 #0046 - 0x882C0100, // 001E GETMBR R11 R0 K0 - 0x942C160A, // 001F GETIDX R11 R11 R10 - 0x8C300B07, // 0020 GETMET R12 R5 K7 - 0x5C381600, // 0021 MOVE R14 R11 - 0x5C3C0200, // 0022 MOVE R15 R1 - 0x7C300600, // 0023 CALL R12 3 - 0x60340004, // 0024 GETGBL R13 G4 - 0x5C381800, // 0025 MOVE R14 R12 - 0x7C340200, // 0026 CALL R13 1 - 0x1C341B08, // 0027 EQ R13 R13 K8 - 0x7836001A, // 0028 JMPF R13 #0044 - 0xA8020008, // 0029 EXBLK 0 #0033 - 0x5C341800, // 002A MOVE R13 R12 - 0x5C381600, // 002B MOVE R14 R11 - 0x5C3C0200, // 002C MOVE R15 R1 + 0x8C200B02, // 0008 GETMET R8 R5 K2 + 0x58280003, // 0009 LDCONST R10 K3 + 0x7C200400, // 000A CALL R8 2 + 0x20240408, // 000B NE R9 R2 R8 + 0x78260003, // 000C JMPF R9 #0011 + 0x8C240104, // 000D GETMET R9 R0 K4 + 0x5C2C0400, // 000E MOVE R11 R2 + 0x7C240400, // 000F CALL R9 2 + 0x5C181200, // 0010 MOVE R6 R9 + 0x20240608, // 0011 NE R9 R3 R8 + 0x78260003, // 0012 JMPF R9 #0017 + 0x8C240105, // 0013 GETMET R9 R0 K5 + 0x5C2C0600, // 0014 MOVE R11 R3 + 0x7C240400, // 0015 CALL R9 2 + 0x5C1C1200, // 0016 MOVE R7 R9 + 0x58240003, // 0017 LDCONST R9 K3 + 0x6028000C, // 0018 GETGBL R10 G12 + 0x882C0100, // 0019 GETMBR R11 R0 K0 + 0x7C280200, // 001A CALL R10 1 + 0x1428120A, // 001B LT R10 R9 R10 + 0x782A0027, // 001C JMPF R10 #0045 + 0x88280100, // 001D GETMBR R10 R0 K0 + 0x94281409, // 001E GETIDX R10 R10 R9 + 0x8C2C0B06, // 001F GETMET R11 R5 K6 + 0x5C341400, // 0020 MOVE R13 R10 + 0x5C380200, // 0021 MOVE R14 R1 + 0x7C2C0600, // 0022 CALL R11 3 + 0x60300004, // 0023 GETGBL R12 G4 + 0x5C341600, // 0024 MOVE R13 R11 + 0x7C300200, // 0025 CALL R12 1 + 0x1C301907, // 0026 EQ R12 R12 K7 + 0x7832001A, // 0027 JMPF R12 #0043 + 0xA8020008, // 0028 EXBLK 0 #0032 + 0x5C301600, // 0029 MOVE R12 R11 + 0x5C341400, // 002A MOVE R13 R10 + 0x5C380200, // 002B MOVE R14 R1 + 0x5C3C0C00, // 002C MOVE R15 R6 0x5C400E00, // 002D MOVE R16 R7 - 0x5C441000, // 002E MOVE R17 R8 - 0x5C480800, // 002F MOVE R18 R4 - 0x7C340A00, // 0030 CALL R13 5 - 0xA8040001, // 0031 EXBLK 1 1 - 0x70020010, // 0032 JMP #0044 - 0xAC340002, // 0033 CATCH R13 0 2 - 0x7002000D, // 0034 JMP #0043 - 0x603C0001, // 0035 GETGBL R15 G1 - 0x8C400D09, // 0036 GETMET R16 R6 K9 - 0x5848000A, // 0037 LDCONST R18 K10 - 0x5C4C1A00, // 0038 MOVE R19 R13 - 0x5C501C00, // 0039 MOVE R20 R14 - 0x7C400800, // 003A CALL R16 4 - 0x7C3C0200, // 003B CALL R15 1 - 0xB83E1600, // 003C GETNGBL R15 K11 - 0x883C1F0C, // 003D GETMBR R15 R15 K12 - 0x783E0002, // 003E JMPF R15 #0042 - 0xA43E1A00, // 003F IMPORT R15 K13 - 0x8C401F0E, // 0040 GETMET R16 R15 K14 - 0x7C400200, // 0041 CALL R16 1 - 0x70020000, // 0042 JMP #0044 - 0xB0080000, // 0043 RAISE 2 R0 R0 - 0x0028150F, // 0044 ADD R10 R10 K15 - 0x7001FFD2, // 0045 JMP #0019 - 0x80000000, // 0046 RET 0 + 0x5C440800, // 002E MOVE R17 R4 + 0x7C300A00, // 002F CALL R12 5 + 0xA8040001, // 0030 EXBLK 1 1 + 0x70020010, // 0031 JMP #0043 + 0xAC300002, // 0032 CATCH R12 0 2 + 0x7002000D, // 0033 JMP #0042 + 0x60380001, // 0034 GETGBL R14 G1 + 0x603C0018, // 0035 GETGBL R15 G24 + 0x58400008, // 0036 LDCONST R16 K8 + 0x5C441800, // 0037 MOVE R17 R12 + 0x5C481A00, // 0038 MOVE R18 R13 + 0x7C3C0600, // 0039 CALL R15 3 + 0x7C380200, // 003A CALL R14 1 + 0xB83A1200, // 003B GETNGBL R14 K9 + 0x88381D0A, // 003C GETMBR R14 R14 K10 + 0x783A0002, // 003D JMPF R14 #0041 + 0xA43A1600, // 003E IMPORT R14 K11 + 0x8C3C1D0C, // 003F GETMET R15 R14 K12 + 0x7C3C0200, // 0040 CALL R15 1 + 0x70020000, // 0041 JMP #0043 + 0xB0080000, // 0042 RAISE 2 R0 R0 + 0x0024130D, // 0043 ADD R9 R9 K13 + 0x7001FFD2, // 0044 JMP #0018 + 0x80000000, // 0045 RET 0 }) ) ); diff --git a/lib/libesp32/berry_tasmota/src/solidify/solidified_zigbee_zcl_attribute.h b/lib/libesp32/berry_tasmota/src/solidify/solidified_zigbee_zcl_attribute.h index d2e4cc847..01c75933f 100644 --- a/lib/libesp32/berry_tasmota/src/solidify/solidified_zigbee_zcl_attribute.h +++ b/lib/libesp32/berry_tasmota/src/solidify/solidified_zigbee_zcl_attribute.h @@ -60,7 +60,7 @@ be_local_closure(zcl_attribute_tomap, /* name */ ********************************************************************/ be_local_closure(zcl_attribute_key_tostring, /* name */ be_nested_proto( - 10, /* nstack */ + 8, /* nstack */ 1, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -68,96 +68,93 @@ be_local_closure(zcl_attribute_key_tostring, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[15]) { /* constants */ - /* K0 */ be_nested_str_weak(string), - /* K1 */ be_nested_str_weak(_X3Cundefined_X3E), - /* K2 */ be_nested_str_weak(key), - /* K3 */ be_nested_str_weak(key_suffix), - /* K4 */ be_const_int(1), - /* K5 */ be_nested_str_weak(cluster), - /* K6 */ be_nested_str_weak(attr_id), - /* K7 */ be_nested_str_weak(format), - /* K8 */ be_nested_str_weak(_X2504X_X2F_X2504X), - /* K9 */ be_nested_str_weak(_X2B), - /* K10 */ be_nested_str_weak(cmd), - /* K11 */ be_nested_str_weak(direction), - /* K12 */ be_nested_str_weak(_X2504X_X25s_X2502X), - /* K13 */ be_nested_str_weak(_X3F), - /* K14 */ be_nested_str_weak(_X21), + ( &(const bvalue[13]) { /* constants */ + /* K0 */ be_nested_str_weak(_X3Cundefined_X3E), + /* K1 */ be_nested_str_weak(key), + /* K2 */ be_nested_str_weak(key_suffix), + /* K3 */ be_const_int(1), + /* K4 */ be_nested_str_weak(cluster), + /* K5 */ be_nested_str_weak(attr_id), + /* K6 */ be_nested_str_weak(_X2504X_X2F_X2504X), + /* K7 */ be_nested_str_weak(_X2B), + /* K8 */ be_nested_str_weak(cmd), + /* K9 */ be_nested_str_weak(direction), + /* K10 */ be_nested_str_weak(_X2504X_X25s_X2502X), + /* K11 */ be_nested_str_weak(_X3F), + /* K12 */ be_nested_str_weak(_X21), }), be_str_weak(key_tostring), &be_const_str_solidified, - ( &(const binstruction[70]) { /* code */ - 0xA4060000, // 0000 IMPORT R1 K0 - 0x58080001, // 0001 LDCONST R2 K1 - 0x880C0102, // 0002 GETMBR R3 R0 K2 - 0x4C100000, // 0003 LDNIL R4 - 0x20100604, // 0004 NE R4 R3 R4 - 0x78120008, // 0005 JMPF R4 #000F - 0x5C080600, // 0006 MOVE R2 R3 - 0x88100103, // 0007 GETMBR R4 R0 K3 - 0x24100904, // 0008 GT R4 R4 K4 - 0x78120003, // 0009 JMPF R4 #000E - 0x60100008, // 000A GETGBL R4 G8 - 0x88140103, // 000B GETMBR R5 R0 K3 - 0x7C100200, // 000C CALL R4 1 - 0x00080404, // 000D ADD R2 R2 R4 - 0x70020035, // 000E JMP #0045 - 0x88100105, // 000F GETMBR R4 R0 K5 - 0x4C140000, // 0010 LDNIL R5 - 0x20100805, // 0011 NE R4 R4 R5 - 0x78120012, // 0012 JMPF R4 #0026 - 0x88100106, // 0013 GETMBR R4 R0 K6 - 0x4C140000, // 0014 LDNIL R5 - 0x20100805, // 0015 NE R4 R4 R5 - 0x7812000E, // 0016 JMPF R4 #0026 - 0x8C100307, // 0017 GETMET R4 R1 K7 - 0x58180008, // 0018 LDCONST R6 K8 - 0x881C0105, // 0019 GETMBR R7 R0 K5 - 0x88200106, // 001A GETMBR R8 R0 K6 - 0x7C100800, // 001B CALL R4 4 - 0x5C080800, // 001C MOVE R2 R4 - 0x88100103, // 001D GETMBR R4 R0 K3 - 0x24100904, // 001E GT R4 R4 K4 - 0x78120004, // 001F JMPF R4 #0025 - 0x60100008, // 0020 GETGBL R4 G8 - 0x88140103, // 0021 GETMBR R5 R0 K3 - 0x7C100200, // 0022 CALL R4 1 - 0x00121204, // 0023 ADD R4 K9 R4 - 0x00080404, // 0024 ADD R2 R2 R4 - 0x7002001E, // 0025 JMP #0045 - 0x88100105, // 0026 GETMBR R4 R0 K5 - 0x4C140000, // 0027 LDNIL R5 - 0x20100805, // 0028 NE R4 R4 R5 - 0x7812001A, // 0029 JMPF R4 #0045 - 0x8810010A, // 002A GETMBR R4 R0 K10 - 0x4C140000, // 002B LDNIL R5 - 0x20100805, // 002C NE R4 R4 R5 - 0x78120016, // 002D JMPF R4 #0045 - 0x8810010B, // 002E GETMBR R4 R0 K11 - 0x4C140000, // 002F LDNIL R5 - 0x20100805, // 0030 NE R4 R4 R5 - 0x78120012, // 0031 JMPF R4 #0045 - 0x8C100307, // 0032 GETMET R4 R1 K7 - 0x5818000C, // 0033 LDCONST R6 K12 - 0x881C0105, // 0034 GETMBR R7 R0 K5 - 0x8820010B, // 0035 GETMBR R8 R0 K11 - 0x78220001, // 0036 JMPF R8 #0039 - 0x5820000D, // 0037 LDCONST R8 K13 - 0x70020000, // 0038 JMP #003A - 0x5820000E, // 0039 LDCONST R8 K14 - 0x8824010A, // 003A GETMBR R9 R0 K10 - 0x7C100A00, // 003B CALL R4 5 - 0x5C080800, // 003C MOVE R2 R4 - 0x88100103, // 003D GETMBR R4 R0 K3 - 0x24100904, // 003E GT R4 R4 K4 - 0x78120004, // 003F JMPF R4 #0045 - 0x60100008, // 0040 GETGBL R4 G8 - 0x88140103, // 0041 GETMBR R5 R0 K3 - 0x7C100200, // 0042 CALL R4 1 - 0x00121204, // 0043 ADD R4 K9 R4 - 0x00080404, // 0044 ADD R2 R2 R4 - 0x80040400, // 0045 RET 1 R2 + ( &(const binstruction[69]) { /* code */ + 0x58040000, // 0000 LDCONST R1 K0 + 0x88080101, // 0001 GETMBR R2 R0 K1 + 0x4C0C0000, // 0002 LDNIL R3 + 0x200C0403, // 0003 NE R3 R2 R3 + 0x780E0008, // 0004 JMPF R3 #000E + 0x5C040400, // 0005 MOVE R1 R2 + 0x880C0102, // 0006 GETMBR R3 R0 K2 + 0x240C0703, // 0007 GT R3 R3 K3 + 0x780E0003, // 0008 JMPF R3 #000D + 0x600C0008, // 0009 GETGBL R3 G8 + 0x88100102, // 000A GETMBR R4 R0 K2 + 0x7C0C0200, // 000B CALL R3 1 + 0x00040203, // 000C ADD R1 R1 R3 + 0x70020035, // 000D JMP #0044 + 0x880C0104, // 000E GETMBR R3 R0 K4 + 0x4C100000, // 000F LDNIL R4 + 0x200C0604, // 0010 NE R3 R3 R4 + 0x780E0012, // 0011 JMPF R3 #0025 + 0x880C0105, // 0012 GETMBR R3 R0 K5 + 0x4C100000, // 0013 LDNIL R4 + 0x200C0604, // 0014 NE R3 R3 R4 + 0x780E000E, // 0015 JMPF R3 #0025 + 0x600C0018, // 0016 GETGBL R3 G24 + 0x58100006, // 0017 LDCONST R4 K6 + 0x88140104, // 0018 GETMBR R5 R0 K4 + 0x88180105, // 0019 GETMBR R6 R0 K5 + 0x7C0C0600, // 001A CALL R3 3 + 0x5C040600, // 001B MOVE R1 R3 + 0x880C0102, // 001C GETMBR R3 R0 K2 + 0x240C0703, // 001D GT R3 R3 K3 + 0x780E0004, // 001E JMPF R3 #0024 + 0x600C0008, // 001F GETGBL R3 G8 + 0x88100102, // 0020 GETMBR R4 R0 K2 + 0x7C0C0200, // 0021 CALL R3 1 + 0x000E0E03, // 0022 ADD R3 K7 R3 + 0x00040203, // 0023 ADD R1 R1 R3 + 0x7002001E, // 0024 JMP #0044 + 0x880C0104, // 0025 GETMBR R3 R0 K4 + 0x4C100000, // 0026 LDNIL R4 + 0x200C0604, // 0027 NE R3 R3 R4 + 0x780E001A, // 0028 JMPF R3 #0044 + 0x880C0108, // 0029 GETMBR R3 R0 K8 + 0x4C100000, // 002A LDNIL R4 + 0x200C0604, // 002B NE R3 R3 R4 + 0x780E0016, // 002C JMPF R3 #0044 + 0x880C0109, // 002D GETMBR R3 R0 K9 + 0x4C100000, // 002E LDNIL R4 + 0x200C0604, // 002F NE R3 R3 R4 + 0x780E0012, // 0030 JMPF R3 #0044 + 0x600C0018, // 0031 GETGBL R3 G24 + 0x5810000A, // 0032 LDCONST R4 K10 + 0x88140104, // 0033 GETMBR R5 R0 K4 + 0x88180109, // 0034 GETMBR R6 R0 K9 + 0x781A0001, // 0035 JMPF R6 #0038 + 0x5818000B, // 0036 LDCONST R6 K11 + 0x70020000, // 0037 JMP #0039 + 0x5818000C, // 0038 LDCONST R6 K12 + 0x881C0108, // 0039 GETMBR R7 R0 K8 + 0x7C0C0800, // 003A CALL R3 4 + 0x5C040600, // 003B MOVE R1 R3 + 0x880C0102, // 003C GETMBR R3 R0 K2 + 0x240C0703, // 003D GT R3 R3 K3 + 0x780E0004, // 003E JMPF R3 #0044 + 0x600C0008, // 003F GETGBL R3 G8 + 0x88100102, // 0040 GETMBR R4 R0 K2 + 0x7C0C0200, // 0041 CALL R3 1 + 0x000E0E03, // 0042 ADD R3 K7 R3 + 0x00040203, // 0043 ADD R1 R1 R3 + 0x80040200, // 0044 RET 1 R1 }) ) ); @@ -275,7 +272,7 @@ be_local_closure(zcl_attribute_setmember, /* name */ ********************************************************************/ be_local_closure(zcl_attribute_tostring, /* name */ be_nested_proto( - 12, /* nstack */ + 10, /* nstack */ 1, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -283,77 +280,74 @@ be_local_closure(zcl_attribute_tostring, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[15]) { /* constants */ + ( &(const bvalue[13]) { /* constants */ /* K0 */ be_nested_str_weak(introspect), /* K1 */ be_nested_str_weak(json), - /* K2 */ be_nested_str_weak(string), - /* K3 */ be_nested_str_weak(dump), - /* K4 */ be_nested_str_weak(key_tostring), - /* K5 */ be_nested_str_weak(_X3A), - /* K6 */ be_nested_str_weak(get), - /* K7 */ be_nested_str_weak(val), - /* K8 */ be_nested_str_weak(tojson), - /* K9 */ be_nested_str_weak(cluster), - /* K10 */ be_nested_str_weak(attr_id), - /* K11 */ be_nested_str_weak(key), - /* K12 */ be_nested_str_weak(format), - /* K13 */ be_nested_str_weak(_X28_X25s_X29), - /* K14 */ be_nested_str_weak(_X2C_X25s_X3A_X22_X2504X_X2F_X2504X_X22), + /* K2 */ be_nested_str_weak(dump), + /* K3 */ be_nested_str_weak(key_tostring), + /* K4 */ be_nested_str_weak(_X3A), + /* K5 */ be_nested_str_weak(get), + /* K6 */ be_nested_str_weak(val), + /* K7 */ be_nested_str_weak(tojson), + /* K8 */ be_nested_str_weak(cluster), + /* K9 */ be_nested_str_weak(attr_id), + /* K10 */ be_nested_str_weak(key), + /* K11 */ be_nested_str_weak(_X28_X25s_X29), + /* K12 */ be_nested_str_weak(_X2C_X25s_X3A_X22_X2504X_X2F_X2504X_X22), }), be_str_weak(tostring), &be_const_str_solidified, - ( &(const binstruction[51]) { /* code */ + ( &(const binstruction[50]) { /* code */ 0xA4060000, // 0000 IMPORT R1 K0 0xA40A0200, // 0001 IMPORT R2 K1 - 0xA40E0400, // 0002 IMPORT R3 K2 - 0x8C100503, // 0003 GETMET R4 R2 K3 - 0x8C180104, // 0004 GETMET R6 R0 K4 - 0x7C180200, // 0005 CALL R6 1 - 0x7C100400, // 0006 CALL R4 2 - 0x00100905, // 0007 ADD R4 R4 K5 - 0x8C140306, // 0008 GETMET R5 R1 K6 - 0x881C0107, // 0009 GETMBR R7 R0 K7 - 0x58200008, // 000A LDCONST R8 K8 - 0x7C140600, // 000B CALL R5 3 - 0x4C180000, // 000C LDNIL R6 - 0x20140A06, // 000D NE R5 R5 R6 - 0x78160004, // 000E JMPF R5 #0014 - 0x88140107, // 000F GETMBR R5 R0 K7 - 0x8C140B08, // 0010 GETMET R5 R5 K8 - 0x7C140200, // 0011 CALL R5 1 - 0x00100805, // 0012 ADD R4 R4 R5 - 0x70020003, // 0013 JMP #0018 - 0x8C140503, // 0014 GETMET R5 R2 K3 - 0x881C0107, // 0015 GETMBR R7 R0 K7 - 0x7C140400, // 0016 CALL R5 2 - 0x00100805, // 0017 ADD R4 R4 R5 - 0x88140109, // 0018 GETMBR R5 R0 K9 - 0x4C180000, // 0019 LDNIL R6 - 0x20140A06, // 001A NE R5 R5 R6 - 0x78160015, // 001B JMPF R5 #0032 - 0x8814010A, // 001C GETMBR R5 R0 K10 - 0x4C180000, // 001D LDNIL R6 - 0x20140A06, // 001E NE R5 R5 R6 - 0x78160011, // 001F JMPF R5 #0032 - 0x8814010B, // 0020 GETMBR R5 R0 K11 - 0x4C180000, // 0021 LDNIL R6 - 0x20140A06, // 0022 NE R5 R5 R6 - 0x7816000D, // 0023 JMPF R5 #0032 - 0x8C14070C, // 0024 GETMET R5 R3 K12 - 0x581C000D, // 0025 LDCONST R7 K13 - 0x8C200104, // 0026 GETMET R8 R0 K4 - 0x7C200200, // 0027 CALL R8 1 - 0x7C140600, // 0028 CALL R5 3 - 0x8C18070C, // 0029 GETMET R6 R3 K12 - 0x5820000E, // 002A LDCONST R8 K14 - 0x8C240503, // 002B GETMET R9 R2 K3 - 0x5C2C0A00, // 002C MOVE R11 R5 - 0x7C240400, // 002D CALL R9 2 - 0x88280109, // 002E GETMBR R10 R0 K9 - 0x882C010A, // 002F GETMBR R11 R0 K10 - 0x7C180A00, // 0030 CALL R6 5 - 0x00100806, // 0031 ADD R4 R4 R6 - 0x80040800, // 0032 RET 1 R4 + 0x8C0C0502, // 0002 GETMET R3 R2 K2 + 0x8C140103, // 0003 GETMET R5 R0 K3 + 0x7C140200, // 0004 CALL R5 1 + 0x7C0C0400, // 0005 CALL R3 2 + 0x000C0704, // 0006 ADD R3 R3 K4 + 0x8C100305, // 0007 GETMET R4 R1 K5 + 0x88180106, // 0008 GETMBR R6 R0 K6 + 0x581C0007, // 0009 LDCONST R7 K7 + 0x7C100600, // 000A CALL R4 3 + 0x4C140000, // 000B LDNIL R5 + 0x20100805, // 000C NE R4 R4 R5 + 0x78120004, // 000D JMPF R4 #0013 + 0x88100106, // 000E GETMBR R4 R0 K6 + 0x8C100907, // 000F GETMET R4 R4 K7 + 0x7C100200, // 0010 CALL R4 1 + 0x000C0604, // 0011 ADD R3 R3 R4 + 0x70020003, // 0012 JMP #0017 + 0x8C100502, // 0013 GETMET R4 R2 K2 + 0x88180106, // 0014 GETMBR R6 R0 K6 + 0x7C100400, // 0015 CALL R4 2 + 0x000C0604, // 0016 ADD R3 R3 R4 + 0x88100108, // 0017 GETMBR R4 R0 K8 + 0x4C140000, // 0018 LDNIL R5 + 0x20100805, // 0019 NE R4 R4 R5 + 0x78120015, // 001A JMPF R4 #0031 + 0x88100109, // 001B GETMBR R4 R0 K9 + 0x4C140000, // 001C LDNIL R5 + 0x20100805, // 001D NE R4 R4 R5 + 0x78120011, // 001E JMPF R4 #0031 + 0x8810010A, // 001F GETMBR R4 R0 K10 + 0x4C140000, // 0020 LDNIL R5 + 0x20100805, // 0021 NE R4 R4 R5 + 0x7812000D, // 0022 JMPF R4 #0031 + 0x60100018, // 0023 GETGBL R4 G24 + 0x5814000B, // 0024 LDCONST R5 K11 + 0x8C180103, // 0025 GETMET R6 R0 K3 + 0x7C180200, // 0026 CALL R6 1 + 0x7C100400, // 0027 CALL R4 2 + 0x60140018, // 0028 GETGBL R5 G24 + 0x5818000C, // 0029 LDCONST R6 K12 + 0x8C1C0502, // 002A GETMET R7 R2 K2 + 0x5C240800, // 002B MOVE R9 R4 + 0x7C1C0400, // 002C CALL R7 2 + 0x88200108, // 002D GETMBR R8 R0 K8 + 0x88240109, // 002E GETMBR R9 R0 K9 + 0x7C140800, // 002F CALL R5 4 + 0x000C0605, // 0030 ADD R3 R3 R5 + 0x80040600, // 0031 RET 1 R3 }) ) ); @@ -791,7 +785,7 @@ be_local_closure(zcl_attribute_list_deinit, /* name */ ********************************************************************/ be_local_closure(zcl_attribute_list_tostring, /* name */ be_nested_proto( - 12, /* nstack */ + 10, /* nstack */ 1, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -799,93 +793,90 @@ be_local_closure(zcl_attribute_list_tostring, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[20]) { /* constants */ - /* K0 */ be_nested_str_weak(string), - /* K1 */ be_nested_str_weak(json), - /* K2 */ be_nested_str_weak(shortaddr), - /* K3 */ be_nested_str_weak(push), - /* K4 */ be_nested_str_weak(format), - /* K5 */ be_nested_str_weak(_X22Device_X22_X3A_X220x_X2504X_X22), - /* K6 */ be_nested_str_weak(groupaddr), - /* K7 */ be_nested_str_weak(_X22Group_X22_X3A_X220x_X2504X_X22), - /* K8 */ be_const_int(0), - /* K9 */ be_nested_str_weak(size), - /* K10 */ be_nested_str_weak(tostring), - /* K11 */ be_const_int(1), - /* K12 */ be_nested_str_weak(src_ep), - /* K13 */ be_nested_str_weak(_X22Endpoint_X22_X3A_X25i), - /* K14 */ be_nested_str_weak(lqi), - /* K15 */ be_nested_str_weak(_X22LinkQuality_X22_X3A_X25i), - /* K16 */ be_nested_str_weak(_X7B), - /* K17 */ be_nested_str_weak(concat), - /* K18 */ be_nested_str_weak(_X2C), - /* K19 */ be_nested_str_weak(_X7D), + ( &(const bvalue[18]) { /* constants */ + /* K0 */ be_nested_str_weak(json), + /* K1 */ be_nested_str_weak(shortaddr), + /* K2 */ be_nested_str_weak(push), + /* K3 */ be_nested_str_weak(_X22Device_X22_X3A_X220x_X2504X_X22), + /* K4 */ be_nested_str_weak(groupaddr), + /* K5 */ be_nested_str_weak(_X22Group_X22_X3A_X220x_X2504X_X22), + /* K6 */ be_const_int(0), + /* K7 */ be_nested_str_weak(size), + /* K8 */ be_nested_str_weak(tostring), + /* K9 */ be_const_int(1), + /* K10 */ be_nested_str_weak(src_ep), + /* K11 */ be_nested_str_weak(_X22Endpoint_X22_X3A_X25i), + /* K12 */ be_nested_str_weak(lqi), + /* K13 */ be_nested_str_weak(_X22LinkQuality_X22_X3A_X25i), + /* K14 */ be_nested_str_weak(_X7B), + /* K15 */ be_nested_str_weak(concat), + /* K16 */ be_nested_str_weak(_X2C), + /* K17 */ be_nested_str_weak(_X7D), }), be_str_weak(tostring), &be_const_str_solidified, - ( &(const binstruction[62]) { /* code */ + ( &(const binstruction[61]) { /* code */ 0xA4060000, // 0000 IMPORT R1 K0 - 0xA40A0200, // 0001 IMPORT R2 K1 - 0x600C0012, // 0002 GETGBL R3 G18 - 0x7C0C0000, // 0003 CALL R3 0 - 0x88100102, // 0004 GETMBR R4 R0 K2 - 0x4C140000, // 0005 LDNIL R5 - 0x20100805, // 0006 NE R4 R4 R5 - 0x78120005, // 0007 JMPF R4 #000E - 0x8C100703, // 0008 GETMET R4 R3 K3 - 0x8C180304, // 0009 GETMET R6 R1 K4 - 0x58200005, // 000A LDCONST R8 K5 - 0x88240102, // 000B GETMBR R9 R0 K2 - 0x7C180600, // 000C CALL R6 3 - 0x7C100400, // 000D CALL R4 2 - 0x88100106, // 000E GETMBR R4 R0 K6 - 0x4C140000, // 000F LDNIL R5 - 0x20100805, // 0010 NE R4 R4 R5 - 0x78120005, // 0011 JMPF R4 #0018 - 0x8C100703, // 0012 GETMET R4 R3 K3 - 0x8C180304, // 0013 GETMET R6 R1 K4 - 0x58200007, // 0014 LDCONST R8 K7 - 0x88240106, // 0015 GETMBR R9 R0 K6 - 0x7C180600, // 0016 CALL R6 3 - 0x7C100400, // 0017 CALL R4 2 - 0x58100008, // 0018 LDCONST R4 K8 - 0x8C140109, // 0019 GETMET R5 R0 K9 - 0x7C140200, // 001A CALL R5 1 - 0x14180805, // 001B LT R6 R4 R5 - 0x781A0006, // 001C JMPF R6 #0024 - 0x8C180703, // 001D GETMET R6 R3 K3 - 0x94200004, // 001E GETIDX R8 R0 R4 - 0x8C20110A, // 001F GETMET R8 R8 K10 - 0x7C200200, // 0020 CALL R8 1 - 0x7C180400, // 0021 CALL R6 2 - 0x0010090B, // 0022 ADD R4 R4 K11 - 0x7001FFF6, // 0023 JMP #001B - 0x8818010C, // 0024 GETMBR R6 R0 K12 - 0x4C1C0000, // 0025 LDNIL R7 - 0x20180C07, // 0026 NE R6 R6 R7 - 0x781A0005, // 0027 JMPF R6 #002E - 0x8C180703, // 0028 GETMET R6 R3 K3 - 0x8C200304, // 0029 GETMET R8 R1 K4 - 0x5828000D, // 002A LDCONST R10 K13 - 0x882C010C, // 002B GETMBR R11 R0 K12 - 0x7C200600, // 002C CALL R8 3 - 0x7C180400, // 002D CALL R6 2 - 0x8818010E, // 002E GETMBR R6 R0 K14 - 0x4C1C0000, // 002F LDNIL R7 - 0x20180C07, // 0030 NE R6 R6 R7 - 0x781A0005, // 0031 JMPF R6 #0038 - 0x8C180703, // 0032 GETMET R6 R3 K3 - 0x8C200304, // 0033 GETMET R8 R1 K4 - 0x5828000F, // 0034 LDCONST R10 K15 - 0x882C010E, // 0035 GETMBR R11 R0 K14 - 0x7C200600, // 0036 CALL R8 3 - 0x7C180400, // 0037 CALL R6 2 - 0x8C180711, // 0038 GETMET R6 R3 K17 - 0x58200012, // 0039 LDCONST R8 K18 - 0x7C180400, // 003A CALL R6 2 - 0x001A2006, // 003B ADD R6 K16 R6 - 0x00180D13, // 003C ADD R6 R6 K19 - 0x80040C00, // 003D RET 1 R6 + 0x60080012, // 0001 GETGBL R2 G18 + 0x7C080000, // 0002 CALL R2 0 + 0x880C0101, // 0003 GETMBR R3 R0 K1 + 0x4C100000, // 0004 LDNIL R4 + 0x200C0604, // 0005 NE R3 R3 R4 + 0x780E0005, // 0006 JMPF R3 #000D + 0x8C0C0502, // 0007 GETMET R3 R2 K2 + 0x60140018, // 0008 GETGBL R5 G24 + 0x58180003, // 0009 LDCONST R6 K3 + 0x881C0101, // 000A GETMBR R7 R0 K1 + 0x7C140400, // 000B CALL R5 2 + 0x7C0C0400, // 000C CALL R3 2 + 0x880C0104, // 000D GETMBR R3 R0 K4 + 0x4C100000, // 000E LDNIL R4 + 0x200C0604, // 000F NE R3 R3 R4 + 0x780E0005, // 0010 JMPF R3 #0017 + 0x8C0C0502, // 0011 GETMET R3 R2 K2 + 0x60140018, // 0012 GETGBL R5 G24 + 0x58180005, // 0013 LDCONST R6 K5 + 0x881C0104, // 0014 GETMBR R7 R0 K4 + 0x7C140400, // 0015 CALL R5 2 + 0x7C0C0400, // 0016 CALL R3 2 + 0x580C0006, // 0017 LDCONST R3 K6 + 0x8C100107, // 0018 GETMET R4 R0 K7 + 0x7C100200, // 0019 CALL R4 1 + 0x14140604, // 001A LT R5 R3 R4 + 0x78160006, // 001B JMPF R5 #0023 + 0x8C140502, // 001C GETMET R5 R2 K2 + 0x941C0003, // 001D GETIDX R7 R0 R3 + 0x8C1C0F08, // 001E GETMET R7 R7 K8 + 0x7C1C0200, // 001F CALL R7 1 + 0x7C140400, // 0020 CALL R5 2 + 0x000C0709, // 0021 ADD R3 R3 K9 + 0x7001FFF6, // 0022 JMP #001A + 0x8814010A, // 0023 GETMBR R5 R0 K10 + 0x4C180000, // 0024 LDNIL R6 + 0x20140A06, // 0025 NE R5 R5 R6 + 0x78160005, // 0026 JMPF R5 #002D + 0x8C140502, // 0027 GETMET R5 R2 K2 + 0x601C0018, // 0028 GETGBL R7 G24 + 0x5820000B, // 0029 LDCONST R8 K11 + 0x8824010A, // 002A GETMBR R9 R0 K10 + 0x7C1C0400, // 002B CALL R7 2 + 0x7C140400, // 002C CALL R5 2 + 0x8814010C, // 002D GETMBR R5 R0 K12 + 0x4C180000, // 002E LDNIL R6 + 0x20140A06, // 002F NE R5 R5 R6 + 0x78160005, // 0030 JMPF R5 #0037 + 0x8C140502, // 0031 GETMET R5 R2 K2 + 0x601C0018, // 0032 GETGBL R7 G24 + 0x5820000D, // 0033 LDCONST R8 K13 + 0x8824010C, // 0034 GETMBR R9 R0 K12 + 0x7C1C0400, // 0035 CALL R7 2 + 0x7C140400, // 0036 CALL R5 2 + 0x8C14050F, // 0037 GETMET R5 R2 K15 + 0x581C0010, // 0038 LDCONST R7 K16 + 0x7C140400, // 0039 CALL R5 2 + 0x00161C05, // 003A ADD R5 K14 R5 + 0x00140B11, // 003B ADD R5 R5 K17 + 0x80040A00, // 003C RET 1 R5 }) ) ); @@ -969,7 +960,7 @@ be_local_closure(zcl_attributes_init, /* name */ ********************************************************************/ be_local_closure(zcl_attributes_tostring, /* name */ be_nested_proto( - 10, /* nstack */ + 9, /* nstack */ 1, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -977,94 +968,91 @@ be_local_closure(zcl_attributes_tostring, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[19]) { /* constants */ - /* K0 */ be_nested_str_weak(string), - /* K1 */ be_nested_str_weak(json), - /* K2 */ be_nested_str_weak(shortaddr), - /* K3 */ be_nested_str_weak(push), - /* K4 */ be_nested_str_weak(format), - /* K5 */ be_nested_str_weak(_X22Device_X22_X3A_X220x_X2504X_X22), - /* K6 */ be_nested_str_weak(_X22Group_X22_X3A_X220x_X2504X_X22), - /* K7 */ be_nested_str_weak(groupaddr), - /* K8 */ be_nested_str_weak(attr_list), - /* K9 */ be_nested_str_weak(tostring), - /* K10 */ be_nested_str_weak(stop_iteration), - /* K11 */ be_nested_str_weak(src_ep), - /* K12 */ be_nested_str_weak(_X22Endpoint_X22_X3A_X25i), - /* K13 */ be_nested_str_weak(lqi), - /* K14 */ be_nested_str_weak(_X22LinkQuality_X22_X3A_X25i), - /* K15 */ be_nested_str_weak(_X7B), - /* K16 */ be_nested_str_weak(concat), - /* K17 */ be_nested_str_weak(_X2C), - /* K18 */ be_nested_str_weak(_X7D), + ( &(const bvalue[17]) { /* constants */ + /* K0 */ be_nested_str_weak(json), + /* K1 */ be_nested_str_weak(shortaddr), + /* K2 */ be_nested_str_weak(push), + /* K3 */ be_nested_str_weak(_X22Device_X22_X3A_X220x_X2504X_X22), + /* K4 */ be_nested_str_weak(_X22Group_X22_X3A_X220x_X2504X_X22), + /* K5 */ be_nested_str_weak(groupaddr), + /* K6 */ be_nested_str_weak(attr_list), + /* K7 */ be_nested_str_weak(tostring), + /* K8 */ be_nested_str_weak(stop_iteration), + /* K9 */ be_nested_str_weak(src_ep), + /* K10 */ be_nested_str_weak(_X22Endpoint_X22_X3A_X25i), + /* K11 */ be_nested_str_weak(lqi), + /* K12 */ be_nested_str_weak(_X22LinkQuality_X22_X3A_X25i), + /* K13 */ be_nested_str_weak(_X7B), + /* K14 */ be_nested_str_weak(concat), + /* K15 */ be_nested_str_weak(_X2C), + /* K16 */ be_nested_str_weak(_X7D), }), be_str_weak(tostring), &be_const_str_solidified, - ( &(const binstruction[64]) { /* code */ + ( &(const binstruction[63]) { /* code */ 0xA4060000, // 0000 IMPORT R1 K0 - 0xA40A0200, // 0001 IMPORT R2 K1 - 0x600C0012, // 0002 GETGBL R3 G18 - 0x7C0C0000, // 0003 CALL R3 0 - 0x88100102, // 0004 GETMBR R4 R0 K2 - 0x4C140000, // 0005 LDNIL R5 - 0x20100805, // 0006 NE R4 R4 R5 - 0x78120005, // 0007 JMPF R4 #000E - 0x8C100703, // 0008 GETMET R4 R3 K3 - 0x8C180304, // 0009 GETMET R6 R1 K4 - 0x58200005, // 000A LDCONST R8 K5 - 0x88240102, // 000B GETMBR R9 R0 K2 - 0x7C180600, // 000C CALL R6 3 - 0x7C100400, // 000D CALL R4 2 - 0x88100102, // 000E GETMBR R4 R0 K2 - 0x4C140000, // 000F LDNIL R5 - 0x20100805, // 0010 NE R4 R4 R5 - 0x78120005, // 0011 JMPF R4 #0018 - 0x8C100703, // 0012 GETMET R4 R3 K3 - 0x8C180304, // 0013 GETMET R6 R1 K4 - 0x58200006, // 0014 LDCONST R8 K6 - 0x88240107, // 0015 GETMBR R9 R0 K7 - 0x7C180600, // 0016 CALL R6 3 - 0x7C100400, // 0017 CALL R4 2 - 0x60100010, // 0018 GETGBL R4 G16 - 0x88140108, // 0019 GETMBR R5 R0 K8 - 0x7C100200, // 001A CALL R4 1 - 0xA8020006, // 001B EXBLK 0 #0023 - 0x5C140800, // 001C MOVE R5 R4 - 0x7C140000, // 001D CALL R5 0 - 0x8C180703, // 001E GETMET R6 R3 K3 - 0x8C200B09, // 001F GETMET R8 R5 K9 - 0x7C200200, // 0020 CALL R8 1 - 0x7C180400, // 0021 CALL R6 2 - 0x7001FFF8, // 0022 JMP #001C - 0x5810000A, // 0023 LDCONST R4 K10 - 0xAC100200, // 0024 CATCH R4 1 0 - 0xB0080000, // 0025 RAISE 2 R0 R0 - 0x8810010B, // 0026 GETMBR R4 R0 K11 - 0x4C140000, // 0027 LDNIL R5 - 0x20100805, // 0028 NE R4 R4 R5 - 0x78120005, // 0029 JMPF R4 #0030 - 0x8C100703, // 002A GETMET R4 R3 K3 - 0x8C180304, // 002B GETMET R6 R1 K4 - 0x5820000C, // 002C LDCONST R8 K12 - 0x8824010B, // 002D GETMBR R9 R0 K11 - 0x7C180600, // 002E CALL R6 3 - 0x7C100400, // 002F CALL R4 2 - 0x8810010D, // 0030 GETMBR R4 R0 K13 - 0x4C140000, // 0031 LDNIL R5 - 0x20100805, // 0032 NE R4 R4 R5 - 0x78120005, // 0033 JMPF R4 #003A - 0x8C100703, // 0034 GETMET R4 R3 K3 - 0x8C180304, // 0035 GETMET R6 R1 K4 - 0x5820000E, // 0036 LDCONST R8 K14 - 0x8824010D, // 0037 GETMBR R9 R0 K13 - 0x7C180600, // 0038 CALL R6 3 - 0x7C100400, // 0039 CALL R4 2 - 0x8C100710, // 003A GETMET R4 R3 K16 - 0x58180011, // 003B LDCONST R6 K17 - 0x7C100400, // 003C CALL R4 2 - 0x00121E04, // 003D ADD R4 K15 R4 - 0x00100912, // 003E ADD R4 R4 K18 - 0x80040800, // 003F RET 1 R4 + 0x60080012, // 0001 GETGBL R2 G18 + 0x7C080000, // 0002 CALL R2 0 + 0x880C0101, // 0003 GETMBR R3 R0 K1 + 0x4C100000, // 0004 LDNIL R4 + 0x200C0604, // 0005 NE R3 R3 R4 + 0x780E0005, // 0006 JMPF R3 #000D + 0x8C0C0502, // 0007 GETMET R3 R2 K2 + 0x60140018, // 0008 GETGBL R5 G24 + 0x58180003, // 0009 LDCONST R6 K3 + 0x881C0101, // 000A GETMBR R7 R0 K1 + 0x7C140400, // 000B CALL R5 2 + 0x7C0C0400, // 000C CALL R3 2 + 0x880C0101, // 000D GETMBR R3 R0 K1 + 0x4C100000, // 000E LDNIL R4 + 0x200C0604, // 000F NE R3 R3 R4 + 0x780E0005, // 0010 JMPF R3 #0017 + 0x8C0C0502, // 0011 GETMET R3 R2 K2 + 0x60140018, // 0012 GETGBL R5 G24 + 0x58180004, // 0013 LDCONST R6 K4 + 0x881C0105, // 0014 GETMBR R7 R0 K5 + 0x7C140400, // 0015 CALL R5 2 + 0x7C0C0400, // 0016 CALL R3 2 + 0x600C0010, // 0017 GETGBL R3 G16 + 0x88100106, // 0018 GETMBR R4 R0 K6 + 0x7C0C0200, // 0019 CALL R3 1 + 0xA8020006, // 001A EXBLK 0 #0022 + 0x5C100600, // 001B MOVE R4 R3 + 0x7C100000, // 001C CALL R4 0 + 0x8C140502, // 001D GETMET R5 R2 K2 + 0x8C1C0907, // 001E GETMET R7 R4 K7 + 0x7C1C0200, // 001F CALL R7 1 + 0x7C140400, // 0020 CALL R5 2 + 0x7001FFF8, // 0021 JMP #001B + 0x580C0008, // 0022 LDCONST R3 K8 + 0xAC0C0200, // 0023 CATCH R3 1 0 + 0xB0080000, // 0024 RAISE 2 R0 R0 + 0x880C0109, // 0025 GETMBR R3 R0 K9 + 0x4C100000, // 0026 LDNIL R4 + 0x200C0604, // 0027 NE R3 R3 R4 + 0x780E0005, // 0028 JMPF R3 #002F + 0x8C0C0502, // 0029 GETMET R3 R2 K2 + 0x60140018, // 002A GETGBL R5 G24 + 0x5818000A, // 002B LDCONST R6 K10 + 0x881C0109, // 002C GETMBR R7 R0 K9 + 0x7C140400, // 002D CALL R5 2 + 0x7C0C0400, // 002E CALL R3 2 + 0x880C010B, // 002F GETMBR R3 R0 K11 + 0x4C100000, // 0030 LDNIL R4 + 0x200C0604, // 0031 NE R3 R3 R4 + 0x780E0005, // 0032 JMPF R3 #0039 + 0x8C0C0502, // 0033 GETMET R3 R2 K2 + 0x60140018, // 0034 GETGBL R5 G24 + 0x5818000C, // 0035 LDCONST R6 K12 + 0x881C010B, // 0036 GETMBR R7 R0 K11 + 0x7C140400, // 0037 CALL R5 2 + 0x7C0C0400, // 0038 CALL R3 2 + 0x8C0C050E, // 0039 GETMET R3 R2 K14 + 0x5814000F, // 003A LDCONST R5 K15 + 0x7C0C0400, // 003B CALL R3 2 + 0x000E1A03, // 003C ADD R3 K13 R3 + 0x000C0710, // 003D ADD R3 R3 K16 + 0x80040600, // 003E RET 1 R3 }) ) ); diff --git a/lib/libesp32/berry_tasmota/src/solidify/solidified_zigbee_zcl_frame.h b/lib/libesp32/berry_tasmota/src/solidify/solidified_zigbee_zcl_frame.h index f979a3066..33405b7c1 100644 --- a/lib/libesp32/berry_tasmota/src/solidify/solidified_zigbee_zcl_frame.h +++ b/lib/libesp32/berry_tasmota/src/solidify/solidified_zigbee_zcl_frame.h @@ -135,7 +135,7 @@ be_local_closure(zcl_frame_init, /* name */ ********************************************************************/ be_local_closure(zcl_frame_tomap, /* name */ be_nested_proto( - 7, /* nstack */ + 5, /* nstack */ 1, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -143,32 +143,29 @@ be_local_closure(zcl_frame_tomap, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[ 7]) { /* constants */ - /* K0 */ be_nested_str_weak(string), - /* K1 */ be_nested_str_weak(tomap), - /* K2 */ be_nested_str_weak(shortaddr_hex), - /* K3 */ be_nested_str_weak(format), - /* K4 */ be_nested_str_weak(0x_X2504X), - /* K5 */ be_nested_str_weak(shortaddr), - /* K6 */ be_nested_str_weak(payload), + ( &(const bvalue[ 5]) { /* constants */ + /* K0 */ be_nested_str_weak(tomap), + /* K1 */ be_nested_str_weak(shortaddr_hex), + /* K2 */ be_nested_str_weak(0x_X2504X), + /* K3 */ be_nested_str_weak(shortaddr), + /* K4 */ be_nested_str_weak(payload), }), be_str_weak(tomap), &be_const_str_solidified, - ( &(const binstruction[14]) { /* code */ - 0xA4060000, // 0000 IMPORT R1 K0 - 0x60080003, // 0001 GETGBL R2 G3 - 0x5C0C0000, // 0002 MOVE R3 R0 - 0x7C080200, // 0003 CALL R2 1 - 0x8C080501, // 0004 GETMET R2 R2 K1 - 0x7C080200, // 0005 CALL R2 1 - 0x8C0C0303, // 0006 GETMET R3 R1 K3 - 0x58140004, // 0007 LDCONST R5 K4 - 0x88180105, // 0008 GETMBR R6 R0 K5 - 0x7C0C0600, // 0009 CALL R3 3 - 0x980A0403, // 000A SETIDX R2 K2 R3 - 0x880C0106, // 000B GETMBR R3 R0 K6 - 0x980A0C03, // 000C SETIDX R2 K6 R3 - 0x80040400, // 000D RET 1 R2 + ( &(const binstruction[13]) { /* code */ + 0x60040003, // 0000 GETGBL R1 G3 + 0x5C080000, // 0001 MOVE R2 R0 + 0x7C040200, // 0002 CALL R1 1 + 0x8C040300, // 0003 GETMET R1 R1 K0 + 0x7C040200, // 0004 CALL R1 1 + 0x60080018, // 0005 GETGBL R2 G24 + 0x580C0002, // 0006 LDCONST R3 K2 + 0x88100103, // 0007 GETMBR R4 R0 K3 + 0x7C080400, // 0008 CALL R2 2 + 0x98060202, // 0009 SETIDX R1 K1 R2 + 0x88080104, // 000A GETMBR R2 R0 K4 + 0x98060802, // 000B SETIDX R1 K4 R2 + 0x80040200, // 000C RET 1 R1 }) ) ); diff --git a/lib/libesp32_lvgl/lv_binding_berry/solidify_all.be b/lib/libesp32_lvgl/lv_binding_berry/solidify_all.be index 17332c091..9f2e0f15e 100755 --- a/lib/libesp32_lvgl/lv_binding_berry/solidify_all.be +++ b/lib/libesp32_lvgl/lv_binding_berry/solidify_all.be @@ -47,7 +47,7 @@ def parse_file(fname, prefix_out) # output solidified var fname_h = string.split(fname, '.be')[0] + '.h' # take whatever is before the first '.be' var fout = open(prefix_out + "solidified_" + fname_h, "w") - fout.write(string.format("/* Solidification of %s */\n", fname_h)) + fout.write(format("/* Solidification of %s */\n", fname_h)) fout.write("/********************************************************************\\\n") fout.write("* Generated code, don't edit *\n") fout.write("\\********************************************************************/\n") diff --git a/tasmota/berry/artnet/artnet.be b/tasmota/berry/artnet/artnet.be index b4f36f98b..6e2f03e2b 100644 --- a/tasmota/berry/artnet/artnet.be +++ b/tasmota/berry/artnet/artnet.be @@ -74,8 +74,7 @@ class ArtNet self.matrix.set_bytes(universe, packet, 18, data_len) dirty = true end - # import string - # tasmota.log(string.format("DMX: opcode=0x%04X protocol=%i seq=%i phy=%i universe=%i data_len=%i data=%s", + # tasmota.log(format("DMX: opcode=0x%04X protocol=%i seq=%i phy=%i universe=%i data_len=%i data=%s", # opcode, protocol, seq, phy, universe, data_len, packet[18..-1].tohex())) end end diff --git a/tasmota/berry/artnet/artnet_ui.be b/tasmota/berry/artnet/artnet_ui.be index 05869a6c4..3839a2a37 100644 --- a/tasmota/berry/artnet/artnet_ui.be +++ b/tasmota/berry/artnet/artnet_ui.be @@ -87,7 +87,6 @@ class ArtNet_UI ####################################################################### def page_artnet_ui() import webserver - import string if !webserver.check_privileged_access() return nil end # read configuration @@ -100,13 +99,13 @@ class ArtNet_UI # webserver.content_send("

     (This feature requires an internet connection)

    ") webserver.content_send("
    ") - webserver.content_send(string.format(" ArtNet configuration")) + webserver.content_send(format(" ArtNet configuration")) webserver.content_send("

    ") # WS2812 bus configuration - webserver.content_send(string.format("

    WS2812 configuration:

    ")) - webserver.content_send(string.format( + webserver.content_send(format("

    WS2812 configuration:

    ")) + webserver.content_send(format( "
    #NameTypeParameter
    %i%sParameter
    ") - webserver.content_send(string.format("", + webserver.content_send(format("", i, i, webserver.html_escape(arg), cl ? webserver.html_escape(cl.ARG_HINT) : '')) webserver.content_send("
    ") - webserver.content_send(string.format("", + webserver.content_send(format("", i, i, '')) webserver.content_send("
    🔗 %s
    🔗 %s
    " "") - webserver.content_send(string.format("") - webserver.content_send(string.format("") - webserver.content_send(string.format("") - webserver.content_send(string.format("") webserver.content_send("") - webserver.content_send(string.format("") # description webserver.content_send("
    GPIO")) @@ -117,29 +116,29 @@ class ArtNet_UI else webserver.content_send("") end webserver.content_send("
    Rows")) - webserver.content_send(string.format("", conf.rows)) + webserver.content_send(format("
    Rows")) + webserver.content_send(format("", conf.rows)) webserver.content_send("
    Columns")) - webserver.content_send(string.format("", conf.cols)) + webserver.content_send(format("
    Columns")) + webserver.content_send(format("", conf.cols)) webserver.content_send("
    Offset")) - webserver.content_send(string.format("", conf.offs)) + webserver.content_send(format("
    Offset")) + webserver.content_send(format("", conf.offs)) webserver.content_send("
    Alternate rows")) - webserver.content_send(string.format("

    ", conf.alt ? " checked" : "")) + webserver.content_send(format("
    Alternate rows")) + webserver.content_send(format("

    ", conf.alt ? " checked" : "")) webserver.content_send("
     
    DMX universe")) - webserver.content_send(string.format("", conf.univ)) + webserver.content_send(format("
    DMX universe")) + webserver.content_send(format("", conf.univ)) webserver.content_send("
    ") @@ -149,23 +148,23 @@ class ArtNet_UI webserver.content_send("

    ") # IP configuration - webserver.content_send(string.format("

    IP listener:

    ")) + webserver.content_send(format("

    IP listener:

    ")) webserver.content_send("") # "") webserver.content_send("") webserver.content_send("
    IP mode")) # webserver.content_send("") # webserver.content_send("
    Port") - # webserver.content_send(string.format("
    Port")) - webserver.content_send(string.format("", conf.port)) + # webserver.content_send(format("
    Port")) + webserver.content_send(format("", conf.port)) webserver.content_send("

    ") # auto-run - webserver.content_send(string.format("

    Auto-run at boot:

    ", conf.auto ? " checked" : "")) + webserver.content_send(format("

    Auto-run at boot:

    ", conf.auto ? " checked" : "")) # button webserver.content_send("") @@ -183,7 +182,6 @@ class ArtNet_UI import webserver if !webserver.check_privileged_access() return nil end - import string import persist import introspect @@ -241,12 +239,12 @@ class ArtNet_UI raise "value_error", "Unknown command" end except .. as e, m - print(string.format("BRY: Exception> '%s' - %s", e, m)) + print(format("BRY: Exception> '%s' - %s", e, m)) #- display error page -# webserver.content_start("Parameter error") #- title of the web page -# webserver.content_send_style() #- send standard Tasmota styles -# - webserver.content_send(string.format("

    Exception:
    '%s'
    %s

    ", e, m)) + webserver.content_send(format("

    Exception:
    '%s'
    %s

    ", e, m)) webserver.content_button(webserver.BUTTON_CONFIGURATION) #- button back to management page -# webserver.content_stop() #- end of web page -# diff --git a/tasmota/berry/drivers/CHSC6540.be b/tasmota/berry/drivers/CHSC6540.be index 7fd1cf785..41586918b 100644 --- a/tasmota/berry/drivers/CHSC6540.be +++ b/tasmota/berry/drivers/CHSC6540.be @@ -55,7 +55,6 @@ self.touched = self.is_pressed() # tasmota.log("DEBUG> int="+str(self.tp_int)+" touched="+str(self.touched), 2) if self.touched - import string var raw_read = self.wire.read_bytes(self.addr, 0x02, 11) # read a series of 11 bytes at from register 0x02 var pts = raw_read[0] if pts <= 0 || pts > 2 return end # wrong @@ -63,7 +62,7 @@ #var p0f = (raw_read[4] & 0x10) != 0 # unused for now self.x = raw_read.get(1,-2) & 0x0FFF self.y = raw_read.get(3,-2) & 0x0FFF - # tasmota.log(string.format("I2C: screen pressed x=%i y=%i", self.x, self.y), 2) + # tasmota.log(format("I2C: screen pressed x=%i y=%i", self.x, self.y), 2) # var p1x = raw_read.get(7,2) & 0x0FFF # var p1y = raw_read.get(9,2) & 0x0FFF end diff --git a/tasmota/berry/drivers/MPU6886_9250.be b/tasmota/berry/drivers/MPU6886_9250.be index 9e5cb400c..56695c676 100644 --- a/tasmota/berry/drivers/MPU6886_9250.be +++ b/tasmota/berry/drivers/MPU6886_9250.be @@ -108,8 +108,7 @@ class MPU6886_9250 : I2C_Driver #- display sensor value in the web UI -# def web_sensor() if !self.wire return nil end #- exit if not initialized -# - import string - var msg = string.format( + var msg = format( "{s}MPU%d acc_x{m}%.3f G{e}".. "{s}MPU%d acc_y{m}%.3f G{e}".. "{s}MPU%d acc_z{m}%.3f G{e}".. @@ -124,11 +123,10 @@ class MPU6886_9250 : I2C_Driver #- add sensor value to teleperiod -# def json_append() if !self.wire return nil end #- exit if not initialized -# - import string var ax = int(self.accel[0] * 1000) var ay = int(self.accel[1] * 1000) var az = int(self.accel[2] * 1000) - var msg = string.format(",\"MPU%d\":{\"AX\":%i,\"AY\":%i,\"AZ\":%i,\"GX\":%i,\"GY\":%i,\"GZ\":%i}", + var msg = format(",\"MPU%d\":{\"AX\":%i,\"AY\":%i,\"AZ\":%i,\"GX\":%i,\"GY\":%i,\"GZ\":%i}", self.device, ax, ay, az, self.gyro[0], self.gyro[1], self.gyro[2]) tasmota.response_append(msg) end diff --git a/tasmota/berry/drivers/Shift595.be b/tasmota/berry/drivers/Shift595.be index 55082165d..7a83f87cc 100644 --- a/tasmota/berry/drivers/Shift595.be +++ b/tasmota/berry/drivers/Shift595.be @@ -18,7 +18,6 @@ # QH' output of first '595 to SER input of 2nd '595 and so on # ------------------------------------------------------------------------- -import string import gpio class Shift595 diff --git a/tasmota/berry/drivers/tm1637.be b/tasmota/berry/drivers/tm1637.be index 9e7b572f0..e4355a78e 100644 --- a/tasmota/berry/drivers/tm1637.be +++ b/tasmota/berry/drivers/tm1637.be @@ -146,7 +146,7 @@ class Tm1637 if size(num) > max_str_len num = string.split(num, max_str_len)[0] end - num = string.format('%4s', num) + num = format('%4s', num) var payload = bytes(-5) payload[0] = self.CMD_ADDR var int_offset = 1 diff --git a/tasmota/berry/examples/web_button_demo.be b/tasmota/berry/examples/web_button_demo.be index ad145ade4..05a4e04ff 100644 --- a/tasmota/berry/examples/web_button_demo.be +++ b/tasmota/berry/examples/web_button_demo.be @@ -25,8 +25,7 @@ class Button_counter_demo : Driver end #- display the counter in its own line -# - import string - webserver.content_send(string.format("{s}Counter{m}%i{e}", self.counter)) + webserver.content_send(format("{s}Counter{m}%i{e}", self.counter)) end #- display button for Increase Counter and trigger 'incr_counter=1' when pressed -# diff --git a/tasmota/berry/haspmota_src/haspmota_core/haspmota.be b/tasmota/berry/haspmota_src/haspmota_core/haspmota.be index ee9a4a169..17ddd2f02 100644 --- a/tasmota/berry/haspmota_src/haspmota_core/haspmota.be +++ b/tasmota/berry/haspmota_src/haspmota_core/haspmota.be @@ -337,7 +337,6 @@ class lvh_obj var event_hasp = self._event_map.find(code) if event_hasp != nil - import string import json var tas_event_more = "" # complementary data @@ -345,7 +344,7 @@ class lvh_obj try # try to get the new val var val = self.val - if val != nil tas_event_more = string.format(',"val":%s', json.dump(val)) end + if val != nil tas_event_more = format(',"val":%s', json.dump(val)) end var text = self.text if text != nil tas_event_more += ',"text":' @@ -354,7 +353,7 @@ class lvh_obj except .. end end - var tas_event = string.format('{"hasp":{"p%ib%i":{"event":"%s"%s}}}', self._page._page_id, self.id, event_hasp, tas_event_more) + var tas_event = format('{"hasp":{"p%ib%i":{"event":"%s"%s}}}', self._page._page_id, self.id, event_hasp, tas_event_more) # print("val=",val) tasmota.set_timer(0, /-> tasmota.publish_rule(tas_event)) end @@ -413,7 +412,6 @@ class lvh_obj #==================================================================== def set_toggle(t) if type(t) == 'string' - import string t = string.toupper(str(t)) if t == "TRUE" t = true elif t == "FALSE" t = false @@ -798,7 +796,7 @@ class lvh_obj # `val_rule_formula`: formula in Berry to transform the value # Ex: `val * 10` # `text_rule`: rule pattern to grab a value for text, ex: `ESP32#Temparature` - # `text_rule_format`: format used by `string.format()` + # `text_rule_format`: format used by `format()` # Ex: `%.1f °C` #==================================================================== def set_val_rule(t) @@ -840,8 +838,7 @@ class lvh_obj var func = compile(code) self._val_rule_function = func() except .. as e, m - import string - print(string.format("HSP: failed to compile '%s' - %s (%s)", code, e, m)) + print(format("HSP: failed to compile '%s' - %s (%s)", code, e, m)) end end def get_val_rule_formula() @@ -855,8 +852,7 @@ class lvh_obj var func = compile(code) self._text_rule_function = func() except .. as e, m - import string - print(string.format("HSP: failed to compile '%s' - %s (%s)", code, e, m)) + print(format("HSP: failed to compile '%s' - %s (%s)", code, e, m)) end end def get_text_rule_formula() @@ -873,8 +869,7 @@ class lvh_obj try val_n = func(val_n) except .. as e, m - import string - print(string.format("HSP: failed to run self._val_rule_function - %s (%s)", e, m)) + print(format("HSP: failed to run self._val_rule_function - %s (%s)", e, m)) end end @@ -894,15 +889,13 @@ class lvh_obj try val = func(val) except .. as e, m - import string - print(string.format("HSP: failed to run self._text_rule_function - %s (%s)", e, m)) + print(format("HSP: failed to run self._text_rule_function - %s (%s)", e, m)) end end var format = self._text_rule_format if type(format) == 'string' - import string - format = string.format(format, val) + format = format(format, val) else format = "" end @@ -1348,10 +1341,9 @@ class lvh_page end # send page events - import string - var event_str_in = string.format('{"hasp":{"p%i":"out"}}', self._oh.lvh_page_cur_idx) + var event_str_in = format('{"hasp":{"p%i":"out"}}', self._oh.lvh_page_cur_idx) tasmota.set_timer(0, /-> tasmota.publish_rule(event_str_in)) - var event_str_out = string.format('{"hasp":{"p%i":"in"}}', self._page_id) + var event_str_out = format('{"hasp":{"p%i":"in"}}', self._page_id) tasmota.set_timer(0, /-> tasmota.publish_rule(event_str_out)) # change current page @@ -1728,7 +1720,6 @@ class HASPmota #==================================================================== def parse_obj(jline, page) import global - import string import introspect var obj_id = int(jline.find("id")) # id number or nil @@ -1743,7 +1734,7 @@ class HASPmota try func_compiled = compile(berry_run) except .. as e,m - print(string.format("HSP: unable to compile berry code \"%s\" - '%s' - %s", berry_run, e, m)) + print(format("HSP: unable to compile berry code \"%s\" - '%s' - %s", berry_run, e, m)) end end @@ -1805,7 +1796,7 @@ class HASPmota lvh_page_cur.set_obj(obj_id, obj_lvh) # create a global variable for this object of form pb, ex p1b2 - var glob_name = string.format("p%ib%i", lvh_page_cur.id(), obj_id) + var glob_name = format("p%ib%i", lvh_page_cur.id(), obj_id) global.(glob_name) = obj_lvh end @@ -1818,7 +1809,7 @@ class HASPmota f_ret(obj_lvh) end except .. as e,m - print(string.format("HSP: unable to run berry code \"%s\" - '%s' - %s", berry_run, e, m)) + print(format("HSP: unable to run berry code \"%s\" - '%s' - %s", berry_run, e, m)) end end diff --git a/tasmota/berry/lvgl_examples/widget_test.be b/tasmota/berry/lvgl_examples/widget_test.be index 3fa2ee7e8..bd93d9f84 100644 --- a/tasmota/berry/lvgl_examples/widget_test.be +++ b/tasmota/berry/lvgl_examples/widget_test.be @@ -1,26 +1,21 @@ #- start LVGL and init environment -# lv.start() -import string - scr = lv.scr_act() # default screean object def ctorcb(class_p, obj) - import string - print(string.format("> ctorcb class_p=0x%08X obj=0x%08X", class_p, obj)) + print(format("> ctorcb class_p=0x%08X obj=0x%08X", class_p, obj)) end def dtorcb(class_p, obj) - import string - print(string.format("> dtorcb class_p=0x%08X obj=0x%08X", class_p, obj)) + print(format("> dtorcb class_p=0x%08X obj=0x%08X", class_p, obj)) end def eventcb(class_p, e) - import string import introspect var event = lv_event(e) var obj = introspect.fromptr(event.user_data) var event_code = event.code var target = event.target - print(string.format("> event class_p=0x%08X event=%s obj=%s code=%i", + print(format("> event class_p=0x%08X event=%s obj=%s code=%i", class_p, str(event), str(obj), event_code)) end import cb @@ -33,16 +28,16 @@ var cb_event = cb.gen_cb(eventcb) #- class_def = lv_obj_class(lv_obj._class).copy() print(class_def) -print(string.format("base_class = 0x%08X", class_def.base_class)) -print(string.format("constructor_cb = 0x%08X", class_def.constructor_cb)) -print(string.format("destructor_cb = 0x%08X", class_def.destructor_cb)) -print(string.format("user_data = 0x%08X", class_def.user_data)) -print(string.format("event_cb = 0x%08X", class_def.event_cb)) -print(string.format("width_def = %i", class_def.width_def)) -print(string.format("height_def = %i", class_def.height_def)) -print(string.format("editable = %i", class_def.editable)) -print(string.format("group_def = %i", class_def.group_def)) -print(string.format("instance_size = %i", class_def.instance_size)) +print(format("base_class = 0x%08X", class_def.base_class)) +print(format("constructor_cb = 0x%08X", class_def.constructor_cb)) +print(format("destructor_cb = 0x%08X", class_def.destructor_cb)) +print(format("user_data = 0x%08X", class_def.user_data)) +print(format("event_cb = 0x%08X", class_def.event_cb)) +print(format("width_def = %i", class_def.width_def)) +print(format("height_def = %i", class_def.height_def)) +print(format("editable = %i", class_def.editable)) +print(format("group_def = %i", class_def.group_def)) +print(format("instance_size = %i", class_def.instance_size)) -# import introspect diff --git a/tasmota/berry/modules/bootloader.be b/tasmota/berry/modules/bootloader.be index 5124a5b60..47a43bf26 100644 --- a/tasmota/berry/modules/bootloader.be +++ b/tasmota/berry/modules/bootloader.be @@ -92,8 +92,7 @@ bootloader().flash('https://raw.githubusercontent.com/espressif/arduino-esp32/ma #bootloader().flash('https://raw.githubusercontent.com/espressif/arduino-esp32/master/tools/sdk/esp32/bin/bootloader_dout_40m.bin') #### debug only -import string bl = bootloader() -print(string.format("0x%04X", bl.get_bootloader_address())) +print(format("0x%04X", bl.get_bootloader_address())) -# \ No newline at end of file diff --git a/tasmota/berry/modules/partition.be b/tasmota/berry/modules/partition.be index 8652f238c..7862de404 100644 --- a/tasmota/berry/modules/partition.be +++ b/tasmota/berry/modules/partition.be @@ -65,8 +65,7 @@ class Partition_info elif magic == 0xEBEB #- MD5 -# else - import string - raise "internal_error", string.format("invalid magic number %02X", magic) + raise "internal_error", format("invalid magic number %02X", magic) end end @@ -102,17 +101,17 @@ class Partition_info var seg_offset = addr + 0x20 # sizeof(esp_image_header_t) + sizeof(esp_image_segment_header_t) = 24 + 8 for seg_num:0..seg_count-1 - # print(string.format("Reading 0x%08X", seg_offset)) + # print(format("Reading 0x%08X", seg_offset)) var segment_header = flash.read(seg_offset - 8, 8) var seg_start_addr = segment_header.get(0, 4) var seg_size = segment_header.get(4,4) - # print(string.format("Segment %i: flash_offset=0x%08X start_addr=0x%08X size=0x%08X", seg_num, seg_offset, seg_start_addr, seg_size)) + # print(format("Segment %i: flash_offset=0x%08X start_addr=0x%08X size=0x%08X", seg_num, seg_offset, seg_start_addr, seg_size)) seg_offset += seg_size + 8 # add segment_length + sizeof(esp_image_segment_header_t) end var total_size = seg_offset - addr + 1 # add 1KB for safety - # print(string.format("Total size = %i KB", total_size/1024)) + # print(format("Total size = %i KB", total_size/1024)) return total_size except .. as e, m @@ -122,7 +121,6 @@ class Partition_info end def tostring() - import string var type_s = "" var subtype_s = "" if self.type == 0 type_s = "app" @@ -146,7 +144,7 @@ class Partition_info #- reformat strings -# if type_s != "" type_s = " (" + type_s + ")" end if subtype_s != "" subtype_s = " (" + subtype_s + ")" end - return string.format("", + return format("", self.type, type_s, self.subtype, subtype_s, self.start, self.sz, @@ -351,8 +349,7 @@ class Partition_otadata # Produce a human-readable representation of the object with relevant information def tostring() - import string - return string.format("", + return format("", self.active_otadata, self.seq0, self.seq1, self.maxota) end end @@ -519,18 +516,17 @@ class Partition_manager_UI #- ---------------------------------------------------------------------- -# def page_show_partition(slot, active, ota_num, maxota) import webserver - import string #- define `bdis` style for gray disabled buttons -# webserver.content_send("
    ") - webserver.content_send(string.format(" %s%s ", + webserver.content_send(format(" %s%s ", slot.start / 0x1000, slot.label, active ? " (active)" : "")) - webserver.content_send(string.format("

    Partition size: %i KB

    ", slot.sz / 1024)) + webserver.content_send(format("

    Partition size: %i KB

    ", slot.sz / 1024)) var used = slot.get_image_size() if used > slot.sz slot.used = -1 end # we may have a leftover of a previous firmware but the slot shrank - in this case the slot is inknown if used >= 0 - webserver.content_send(string.format("

    Used: %i KB

    ", used / 1024)) - webserver.content_send(string.format("

    Free: %i KB

    ", (slot.sz - used) / 1024)) + webserver.content_send(format("

    Used: %i KB

    ", used / 1024)) + webserver.content_send(format("

    Free: %i KB

    ", (slot.sz - used) / 1024)) else webserver.content_send("

    Used: unknown

    ") webserver.content_send("

    Free: unknown

    ") @@ -540,7 +536,7 @@ class Partition_manager_UI webserver.content_send("

    ") webserver.content_send("") - webserver.content_send(string.format("", ota_num)) + webserver.content_send(format("", ota_num)) webserver.content_send("

    ") else # put a fake disabled button @@ -563,22 +559,21 @@ class Partition_manager_UI #- ---------------------------------------------------------------------- -# def page_show_spiffs(slot, free_mem) import webserver - import string - webserver.content_send(string.format("
     filesystem ", + webserver.content_send(format("
     filesystem ", slot.start / 0x1000)) - webserver.content_send(string.format("

    Partition size: %i KB

    ", slot.sz / 1024)) + webserver.content_send(format("

    Partition size: %i KB

    ", slot.sz / 1024)) if free_mem != nil - webserver.content_send(string.format("

    Max size: %i KB

    ", (slot.sz + free_mem) / 1024)) - webserver.content_send(string.format("

    Unallocated: %i KB

    ", free_mem / 1024)) + webserver.content_send(format("

    Max size: %i KB

    ", (slot.sz + free_mem) / 1024)) + webserver.content_send(format("

    Unallocated: %i KB

    ", free_mem / 1024)) end #- display Resize button -# webserver.content_send("

    New size: (multiple of 16 KB)

    ") webserver.content_send("
    ") - webserver.content_send(string.format("", (slot.sz + free_mem) / 1024, ((slot.sz + free_mem) / 1024 / 16)*16)) + webserver.content_send(format("", (slot.sz + free_mem) / 1024, ((slot.sz + free_mem) / 1024 / 16)*16)) webserver.content_send("

    ") webserver.content_send("

    ") end @@ -609,7 +604,6 @@ class Partition_manager_UI #- ---------------------------------------------------------------------- -# def page_show_repartition_asym(p) import webserver - import string if p.get_active() != 0 webserver.content_send("

    Re-partition can be done only if 'app0' is active.

    ") else @@ -630,16 +624,16 @@ class Partition_manager_UI webserver.content_send("onsubmit='return confirm(\"This will DELETE the content of the file system and cause a restart.\");'>") webserver.content_send("

    app0:

    ") - webserver.content_send(string.format("

    Min: %i KB

    ", app0_used_kb)) - webserver.content_send(string.format("

    Max: %i KB

    ", self.app_size_max)) + webserver.content_send(format("

    Min: %i KB

    ", app0_used_kb)) + webserver.content_send(format("

    Max: %i KB

    ", self.app_size_max)) webserver.content_send("

    New: (multiple of 64 KB)

    ") - webserver.content_send(string.format("", app0_used_kb, self.app_size_max, app0_size_kb)) + webserver.content_send(format("", app0_used_kb, self.app_size_max, app0_size_kb)) webserver.content_send("

    app1:

    ") - webserver.content_send(string.format("

    Min: %i KB

    ", self.app_size_min)) - webserver.content_send(string.format("

    Max: %i KB

    ", self.app_size_max)) + webserver.content_send(format("

    Min: %i KB

    ", self.app_size_min)) + webserver.content_send(format("

    Max: %i KB

    ", self.app_size_max)) webserver.content_send("

    New: (multiple of 64 KB)

    ") - webserver.content_send(string.format("", self.app_size_min, self.app_size_max, app1_size_kb)) + webserver.content_send(format("", self.app_size_min, self.app_size_max, app1_size_kb)) webserver.content_send("

    ") @@ -650,7 +644,6 @@ class Partition_manager_UI ####################################################################### def page_part_mgr() import webserver - import string import partition_core if !webserver.check_privileged_access() return nil end var p = partition_core.Partition() @@ -679,7 +672,6 @@ class Partition_manager_UI ####################################################################### def page_part_ctl() import webserver - import string import partition_core if !webserver.check_privileged_access() return nil end @@ -693,14 +685,14 @@ class Partition_manager_UI if webserver.has_arg("ota") #- OTA switch partition -# var ota_target = int(webserver.arg("ota")) - if ota_target < 0 || ota_target > p.ota_max() raise "value_error", string.format("Invalid partition #%d", ota_target) end + if ota_target < 0 || ota_target > p.ota_max() raise "value_error", format("Invalid partition #%d", ota_target) end var ota_slot = p.get_ota_slot(ota_target) if ota_slot == nil || ota_slot.get_image_size() < 0 - raise "value_error", string.format("Invalid OTA slot #%d", ota_target) + raise "value_error", format("Invalid OTA slot #%d", ota_target) end - print(string.format("Trying to change active partition to %d", ota_target)) + print(format("Trying to change active partition to %d", ota_target)) #- do the change -# p.set_active(ota_target) p.otadata.save() #- write to disk -# @@ -721,7 +713,7 @@ class Partition_manager_UI if spiffs_slot == nil || !spiffs_slot.is_spiffs() raise "value_error", "Last slot is not FS type" end var flash_size_kb = tasmota.memory()['flash'] if spiffs_size_kb < 0 || spiffs_size_kb > spiffs_max_size - raise "value_error", string.format("Invalid fs_size %i, should be between 0 and %i", spiffs_size_kb, spiffs_max_size) + raise "value_error", format("Invalid fs_size %i, should be between 0 and %i", spiffs_size_kb, spiffs_max_size) end if spiffs_size_kb == spiffs_slot.sz/1024 raise "value_error", "FS size unchanged, abort" end @@ -756,7 +748,7 @@ class Partition_manager_UI var part_size_kb = int(webserver.arg("repartition")) if part_size_kb < app0_used_kb || part_size_kb > self.app_size_max - raise "value_error", string.printf("Invalid partition size %i KB, should be between %i and %i", part_size_kb, app0_used_kb, self.app_size_max) + raise "value_error", format("Invalid partition size %i KB, should be between %i and %i", part_size_kb, app0_used_kb, self.app_size_max) end if part_size_kb == app0_size_kb raise "value_error", "No change to partition size, abort" end @@ -799,11 +791,11 @@ class Partition_manager_UI var part0_size_kb = int(webserver.arg("app0")) if part0_size_kb < app0_used_kb || part0_size_kb > self.app_size_max - raise "value_error", string.printf("Invalid partition size app%i %i KB, should be between %i and %i", 0, part0_size_kb, app0_used_kb, self.app_size_max) + raise "value_error", format("Invalid partition size app%i %i KB, should be between %i and %i", 0, part0_size_kb, app0_used_kb, self.app_size_max) end var part1_size_kb = int(webserver.arg("app1")) if part1_size_kb < self.app_size_min || part1_size_kb > self.app_size_max - raise "value_error", string.printf("Invalid partition size app%i %i KB, should be between %i and %i", 1, part1_size_kb, self.app_size_min, self.app_size_max) + raise "value_error", format("Invalid partition size app%i %i KB, should be between %i and %i", 1, part1_size_kb, self.app_size_min, self.app_size_max) end if part0_size_kb == app0_size_kb && part1_size_kb == app1_size_kb raise "value_error", "No change to partition sizes, abort" end @@ -826,12 +818,12 @@ class Partition_manager_UI raise "value_error", "Unknown command" end except .. as e, m - print(string.format("BRY: Exception> '%s' - %s", e, m)) + print(format("BRY: Exception> '%s' - %s", e, m)) #- display error page -# webserver.content_start("Parameter error") #- title of the web page -# webserver.content_send_style() #- send standard Tasmota styles -# - webserver.content_send(string.format("

    Exception:
    '%s'
    %s

    ", e, m)) + webserver.content_send(format("

    Exception:
    '%s'
    %s

    ", e, m)) # webserver.content_send("

    ") webserver.content_button(webserver.BUTTON_MANAGEMENT) #- button back to management page -# diff --git a/tasmota/berry/modules/partition_wizard.be b/tasmota/berry/modules/partition_wizard.be index 28022691b..500b15fff 100644 --- a/tasmota/berry/modules/partition_wizard.be +++ b/tasmota/berry/modules/partition_wizard.be @@ -38,12 +38,11 @@ class Partition_wizard_UI end def default_safeboot_URL() - import string var arch_sub = tasmota.arch() if arch_sub[0..4] == "esp32" arch_sub = arch_sub[5..] # get the esp32 variant end - return string.format(self._default_safeboot_URL, arch_sub) + return format(self._default_safeboot_URL, arch_sub) end # create a method for adding a button to the main menu @@ -109,7 +108,6 @@ class Partition_wizard_UI var flash_definition_sector = self.get_flash_definition_sector(p) if (flash_size_k != flash_size_real_k) && flash_definition_sector != nil import flash - import string flash_size_k = flash_size_real_k # try to expand the flash size definition @@ -133,7 +131,7 @@ class Partition_wizard_UI var old_def = flash_def[3] flash_def[3] = (flash_def[3] & 0x0F) | flash_size_code flash.write(flash_definition_sector, flash_def) - tasmota.log(string.format("UPL: changing flash definition from 0x02X to 0x%02X", old_def, flash_def[3]), 3) + tasmota.log(format("UPL: changing flash definition from 0x02X to 0x%02X", old_def, flash_def[3]), 3) else raise "internal_error", "wrong flash size "+str(flash_size_real_m) end @@ -173,14 +171,13 @@ class Partition_wizard_UI #- ---------------------------------------------------------------------- -# def show_resize_fs(p) import webserver - import string var unallocated = self.get_unallocated_k(p) # if there is unallocated space, propose only to claim it if unallocated > 0 webserver.content_send("
     Resize FS to max 

    ") - webserver.content_send(string.format("

    You can expand the file system by %i KB.
    Its content will be lost.

    ", unallocated)) + webserver.content_send(format("

    You can expand the file system by %i KB.
    Its content will be lost.

    ", unallocated)) webserver.content_send("
    ") @@ -193,7 +190,7 @@ class Partition_wizard_UI var flash_size_k = self.get_max_flash_size_k() var fs_max_size_k = flash_size_k - max_fs_start_k var current_fs_size_k = self.get_cur_fs_size_k(p) - #print(string.format(">>> max_fs_start_k=0x%X flash_size_k=0x%X fs_max_size_k=%i current_fs_size_k=%i", max_fs_start_k, flash_size_k, fs_max_size_k, current_fs_size_k)) + #print(format(">>> max_fs_start_k=0x%X flash_size_k=0x%X fs_max_size_k=%i current_fs_size_k=%i", max_fs_start_k, flash_size_k, fs_max_size_k, current_fs_size_k)) if max_fs_start_k > 0 && fs_max_size_k > 64 webserver.content_send("
     Resize FS 

    ") @@ -202,7 +199,7 @@ class Partition_wizard_UI webserver.content_send("") - webserver.content_send(string.format("", fs_max_size_k, current_fs_size_k)) + webserver.content_send(format("", fs_max_size_k, current_fs_size_k)) webserver.content_send("

    ") webserver.content_send("

    ") @@ -257,12 +254,11 @@ class Partition_wizard_UI # - true if DONE # - string if ERROR, indicating the error def test_step_1(p) - import string if !self.factory_migrate_eligible(p) return "not eligible to migration" end var cur_part = p.otadata.active_otadata # -1=factory 0=ota_0 1=ota_1... if cur_part == 1 return true end - if cur_part != 0 return string.format("active_otadata=%i", cur_part) end # unsupported configuration + if cur_part != 0 return format("active_otadata=%i", cur_part) end # unsupported configuration # current partition is `app0` # get size of firmware in `app0` and check if it fits on `app1` var app0 = p.get_ota_slot(0) @@ -294,7 +290,6 @@ class Partition_wizard_UI # - true if DONE # - string if ERROR, indicating the error def test_step_2(p) - import string if !self.factory_migrate_eligible(p) return "not eligible to migration" end var app0 = p.get_ota_slot(0) @@ -325,7 +320,6 @@ class Partition_wizard_UI # - true if DONE # - string if ERROR, indicating the error def test_step_3(p) - import string if !self.factory_migrate_eligible(p) return "not eligible to migration" end return false @@ -343,7 +337,6 @@ class Partition_wizard_UI # - true if DONE # - string if ERROR, indicating the error def test_step_4(p) - import string return false # var app0 = p.get_ota_slot(0) @@ -352,11 +345,10 @@ class Partition_wizard_UI static def copy_ota(from_addr, to_addr, sz) import flash - import string var size_left = sz var offset = 0 - tasmota.log(string.format("UPL: Copy flash from 0x%06X to 0x%06X (size: %ikB)", from_addr, to_addr, sz / 1024), 2) + tasmota.log(format("UPL: Copy flash from 0x%06X to 0x%06X (size: %ikB)", from_addr, to_addr, sz / 1024), 2) while size_left > 0 var b = flash.read(from_addr + offset, 4096) flash.erase(to_addr + offset, 4096) @@ -364,7 +356,7 @@ class Partition_wizard_UI size_left -= 4096 offset += 4096 if ((offset-4096) / 102400) < (offset / 102400) - tasmota.log(string.format("UPL: Progress %ikB", offset/1024), 3) + tasmota.log(format("UPL: Progress %ikB", offset/1024), 3) end end tasmota.log("UPL: done", 2) @@ -390,7 +382,6 @@ class Partition_wizard_UI end def do_step_2(p, safeboot_url) - import string if safeboot_url == nil || safeboot_url == "" safeboot_url = self.default_safeboot_URL() tasmota.log("UPL: no `safeboot` URL, defaulting to "+safeboot_url, 2) @@ -408,7 +399,7 @@ class Partition_wizard_UI var safeboot_size = cl.get_size() if safeboot_size <= 500000 raise "internal_error", "wrong safeboot size "+str(safeboot_size) end if safeboot_size > (self.app_size_min * 1024) raise "internal_error", "safeboot is too large "+str(safeboot_size / 1024)+"kB" end - tasmota.log(string.format("UPL: flashing `safeboot` from %s %ikB", safeboot_url, (safeboot_size / 1024) + 1), 2) + tasmota.log(format("UPL: flashing `safeboot` from %s %ikB", safeboot_url, (safeboot_size / 1024) + 1), 2) var app0 = p.get_ota_slot(0) if app0.start != 0x10000 raise "internal_error", "`app0` offset is not 0x10000" end cl.write_flash(app0.start) @@ -418,7 +409,6 @@ class Partition_wizard_UI def do_step_3(p) - import string import flash var step3_state = self.test_step_3(p) @@ -476,7 +466,6 @@ class Partition_wizard_UI def show_migrate_to_factory(p) # display ota partitions import webserver - import string if !self.factory_migrate_eligible(p) return end @@ -486,20 +475,20 @@ class Partition_wizard_UI webserver.content_send("

    Please see Safeboot layout documentation

    ") webserver.content_send("

     

    ") - webserver.content_send(string.format("

    Step 1: %s

    ", self.display_step_state(self.test_step_1(p), "boot on `app1`"))) - webserver.content_send(string.format("

    Step 2: %s

    ", self.display_step_state(self.test_step_2(p), "flash `safeboot` to `app0`"))) - webserver.content_send(string.format("

    Step 3: %s

    ", self.display_step_state(self.test_step_3(p), "change partition map"))) - webserver.content_send(string.format("

    Step 4: %s

    ", self.display_step_state(self.test_step_4(p), "flash final firmware"))) + webserver.content_send(format("

    Step 1: %s

    ", self.display_step_state(self.test_step_1(p), "boot on `app1`"))) + webserver.content_send(format("

    Step 2: %s

    ", self.display_step_state(self.test_step_2(p), "flash `safeboot` to `app0`"))) + webserver.content_send(format("

    Step 3: %s

    ", self.display_step_state(self.test_step_3(p), "change partition map"))) + webserver.content_send(format("

    Step 4: %s

    ", self.display_step_state(self.test_step_4(p), "flash final firmware"))) webserver.content_send("
    ") var ota_url = tasmota.cmd("OtaUrl").find("OtaUrl", "") - webserver.content_send(string.format("
    OTA Url

    ", + webserver.content_send(format("
    OTA Url

    ", ota_url)) import persist var safeboot_url = persist.find("safeboot_url", self.default_safeboot_URL()) - webserver.content_send(string.format("
    SAFEBOOT Url (don't change)
    ", + webserver.content_send(format("
    SAFEBOOT Url (don't change)
    ", safeboot_url)) webserver.content_send("

    ") @@ -513,7 +502,6 @@ class Partition_wizard_UI def show_current_partitions(p) # display ota partitions import webserver - import string var cur_part = p.otadata.active_otadata # -1=factory 0=ota_0 1=ota_1... webserver.content_send("
     Current partitions 

    ") @@ -530,22 +518,22 @@ class Partition_wizard_UI var usage_str = "unknown" var used = slot.get_image_size() if (used >= 0) && (used <= slot.sz) - usage_str = string.format("used %i%%", ((used / 1024) * 100) / (slot.sz / 1024)) + usage_str = format("used %i%%", ((used / 1024) * 100) / (slot.sz / 1024)) end - var title = string.format("%ssubtype:%s offset:0x%06X size:0x%06X", current_boot_partition ? "booted " : "", slot.subtype_to_string(), slot.start, slot.sz) + var title = format("%ssubtype:%s offset:0x%06X size:0x%06X", current_boot_partition ? "booted " : "", slot.subtype_to_string(), slot.start, slot.sz) var col_before = "" var col_after = "" if current_boot_partition col_before = "[" col_after = "]" end - # webserver.content_send(string.format("

    %s [%s]: %i KB (%s)

    ", slot.label, slot.subtype_to_string(), slot.size / 1024, usage_str)) - webserver.content_send(string.format("", + # webserver.content_send(format("

    %s [%s]: %i KB (%s)

    ", slot.label, slot.subtype_to_string(), slot.size / 1024, usage_str)) + webserver.content_send(format("", title, col_before, slot.label, col_after, slot.sz / 1024, usage_str)) elif slot.is_spiffs() # spiffs partition - var title = string.format("subtype:%s offset:0x%06X size:0x%06X", slot.subtype_to_string(), slot.start, slot.sz) - webserver.content_send(string.format("", title, slot.sz / 1024)) + var title = format("subtype:%s offset:0x%06X size:0x%06X", slot.subtype_to_string(), slot.start, slot.sz) + webserver.content_send(format("", title, slot.sz / 1024)) end end @@ -554,7 +542,7 @@ class Partition_wizard_UI var last_slot = p.slots[-1] # verify that last slot is file-system var partition_end_k = (last_slot.start + last_slot.sz) / 1024 # last kb used for fs - webserver.content_send(string.format("", + webserver.content_send(format("", partition_end_k * 1024, unallocated * 1024, unallocated)) end webserver.content_send("
    %s%s%s %i KB  (%s)
    %s%s%s %i KB  (%s)
    fs %i KB
    fs %i KB
    <free>:  %i KB
    <free>:  %i KB
    ") @@ -573,7 +561,6 @@ class Partition_wizard_UI ####################################################################### def page_part_mgr() import webserver - import string import partition_core if !webserver.check_privileged_access() return nil end var p = partition_core.Partition() # load partition layout @@ -603,7 +590,6 @@ class Partition_wizard_UI import webserver if !webserver.check_privileged_access() return nil end - import string import partition_core import persist @@ -648,7 +634,7 @@ class Partition_wizard_UI var current_fs_size_k = self.get_cur_fs_size_k(p) var fs_target = int(webserver.arg("fs_size")) - if (fs_target < 64) || (fs_target > fs_max_size_k) raise "value_error", string.format("Invalid FS #%d", fs_target) end + if (fs_target < 64) || (fs_target > fs_max_size_k) raise "value_error", format("Invalid FS #%d", fs_target) end # apply the change # shrink last OTA App @@ -686,12 +672,12 @@ class Partition_wizard_UI raise "value_error", "Unknown command" end except .. as e, m - tasmota.log(string.format("BRY: Exception> '%s' - %s", e, m), 2) + tasmota.log(format("BRY: Exception> '%s' - %s", e, m), 2) #- display error page -# webserver.content_start("Parameter error") #- title of the web page -# webserver.content_send_style() #- send standard Tasmota styles -# - webserver.content_send(string.format("

    Exception:
    '%s'
    %s

    ", e, m)) + webserver.content_send(format("

    Exception:
    '%s'
    %s

    ", e, m)) # webserver.content_send("

    ") webserver.content_button(webserver.BUTTON_MANAGEMENT) #- button back to management page -# @@ -710,7 +696,6 @@ class Partition_wizard_UI # string: error with description of error def do_safeboot_partitioning() import webserver - import string import partition_core var p = partition_core.Partition() # load partition layout @@ -725,7 +710,7 @@ class Partition_wizard_UI try self.do_step_1(p) except .. as e, m - tasmota.log(string.format("UPL: error (%s) %s", e, m), 2) + tasmota.log(format("UPL: error (%s) %s", e, m), 2) return m end persist.factory_migrate = true @@ -744,7 +729,7 @@ class Partition_wizard_UI try self.do_step_2(p, safeboot_url) except .. as e, m - tasmota.log(string.format("UPL: error (%s) %s", e, m), 2) + tasmota.log(format("UPL: error (%s) %s", e, m), 2) return m end end @@ -758,7 +743,7 @@ class Partition_wizard_UI try self.do_step_3(p) except .. as e, m - tasmota.log(string.format("UPL: error (%s) %s", e, m), 2) + tasmota.log(format("UPL: error (%s) %s", e, m), 2) return m end end diff --git a/tasmota/berry/modules/ts_calibrate/ts_calibrate.be b/tasmota/berry/modules/ts_calibrate/ts_calibrate.be index 04cddf69c..7891e6770 100644 --- a/tasmota/berry/modules/ts_calibrate/ts_calibrate.be +++ b/tasmota/berry/modules/ts_calibrate/ts_calibrate.be @@ -165,7 +165,6 @@ ts_calibrate.init = def (m) # All values are computed and correct, log results and store to 'display.ini' def finish() # calibration is finished, do the housekeeping - import string var p0x = real(self.raw_pts[0].x) var p0y = real(self.raw_pts[0].y) var p1x = real(self.raw_pts[1].x) @@ -174,7 +173,7 @@ ts_calibrate.init = def (m) var p2y = real(self.raw_pts[2].y) var p3x = real(self.raw_pts[3].x) var p3y = real(self.raw_pts[3].y) - tasmota.log(string.format("TS : Calibration (%i,%i) - (%i,%i) - (%i,%i) - (%i,%i)", + tasmota.log(format("TS : Calibration (%i,%i) - (%i,%i) - (%i,%i) - (%i,%i)", int(p0x), int(p0y), int(p1x), int(p1y), int(p2x), int(p2y), int(p3x), int(p3y)) , 2) var m_line = self.calc_geometry(p0x, p0y, p1x, p1y, p2x, p2y, p3x, p3y, self.hres, self.vres, 20) @@ -254,9 +253,8 @@ ts_calibrate.init = def (m) def calc_geometry(p0x, p0y, p1x, p1y, p2x, p2y, p3x, p3y, hres, vres, padding) import math - import string - tasmota.log(string.format("TS : Geometry (%i,%i) (%i,%i) (%i,%i) (%i,%i) - %ix%i pad %i", + tasmota.log(format("TS : Geometry (%i,%i) (%i,%i) (%i,%i) (%i,%i) - %ix%i pad %i", int(p0x), int(p0y), int(p1x), int(p1y), int(p2x), int(p2y), @@ -314,8 +312,8 @@ ts_calibrate.init = def (m) ymax += extend_y tasmota.log("final xmin=" + str(xmin) + " xmax=" + str(xmax) + " ymin=" + str(ymin) + " ymax=" + str(ymax), 4) - var M_string = string.format(":M,%i,%i,%i,%i", int(xmin), int(xmax), int(ymin), int(ymax)) - tasmota.log(string.format("TS : Add this to display.ini '%s'", M_string)) + var M_string = format(":M,%i,%i,%i,%i", int(xmin), int(xmax), int(ymin), int(ymax)) + tasmota.log(format("TS : Add this to display.ini '%s'", M_string)) return M_string end end diff --git a/tasmota/berry/zigbee/cc2652_flasher.be b/tasmota/berry/zigbee/cc2652_flasher.be index 994105340..1d24b6f9a 100644 --- a/tasmota/berry/zigbee/cc2652_flasher.be +++ b/tasmota/berry/zigbee/cc2652_flasher.be @@ -58,11 +58,10 @@ #- Example -import string import cc2652_flasher as cc cc.start() cc.ping() -print(string.format("0x%08X", cc.cmd_get_chip_id())) +print(format("0x%08X", cc.cmd_get_chip_id())) # output: 0x3202F000 # Dumping CC2652 flash into filesystem @@ -82,8 +81,6 @@ class cc2652_flasher # init - abort zigbee operations and starts the serial driver # args are optional def init(rx, tx, rst, bsl) - import string - self.debug = false self.rx = (rx == nil) ? -1 : rx self.tx = (tx == nil) ? -1 : tx @@ -96,8 +93,8 @@ class cc2652_flasher if self.tx < 0 self.tx = gpio.pin(gpio.TCP_TX) end if self.rst < 0 self.rst = gpio.pin(gpio.ZIGBEE_RST, 0) end if self.bsl < 0 self.bsl = gpio.pin(gpio.ZIGBEE_RST, 1) end - print(string.format("FLH: cc2652_flasher rx=%i tx=%i rst=%i bsl=%i", self.rx, self.tx, self.rst, self.bsl)) - # tasmota.log(string.format("FLH: cc2652_flasher rx=%i tx=%i rst=%i bsl=%i", self.rx, self.tx, self.rst, self.bsl), 3) + print(format("FLH: cc2652_flasher rx=%i tx=%i rst=%i bsl=%i", self.rx, self.tx, self.rst, self.bsl)) + # tasmota.log(format("FLH: cc2652_flasher rx=%i tx=%i rst=%i bsl=%i", self.rx, self.tx, self.rst, self.bsl), 3) if self.rx < 0 || self.tx < 0 || self.rst < 0 || self.bsl < 0 raise "value_error", "cc2652_flasher unspecified GPIOs" end @@ -338,8 +335,6 @@ class cc2652_flasher # higher level def flash_write(addr, data) - import string - var sz = size(data) if (sz % 4 != 0) raise "value_error", "len must be a multiple of 4" end if sz > 128 raise "value_error", "len is bigger than 128" end @@ -351,12 +346,12 @@ class cc2652_flasher var ack ack = self.cmd_get_status() - if ack != 0x40 raise "serial_error", string.format("command failed: 0x%02X - 0x%06X (%i)", ack, addr, sz) end + if ack != 0x40 raise "serial_error", format("command failed: 0x%02X - 0x%06X (%i)", ack, addr, sz) end ret = self.cmd_send_data(data) ack = self.cmd_get_status() - if ack != 0x40 raise "serial_error", string.format("command failed: 0x%02X - 0x%06X (%i)", ack, addr, sz) end + if ack != 0x40 raise "serial_error", format("command failed: 0x%02X - 0x%06X (%i)", ack, addr, sz) end end diff --git a/tasmota/berry/zigbee/intelhex.be b/tasmota/berry/zigbee/intelhex.be index 08393b585..110208382 100644 --- a/tasmota/berry/zigbee/intelhex.be +++ b/tasmota/berry/zigbee/intelhex.be @@ -118,8 +118,7 @@ class intelhex # OK # do whatever needed - import string - # print(string.format("addr=0x%06X len=0x%02X", address, sz)) + # print(format("addr=0x%06X len=0x%02X", address, sz)) elif record_type == 4 if offset_low != 0 raise "value_error", "offset_low not null for cmd 04" end offset_high = b_get(b, 4, -2) # b.get(4,-2) diff --git a/tasmota/berry/zigbee/sonoff_zb_pro_flasher.be b/tasmota/berry/zigbee/sonoff_zb_pro_flasher.be index 7eb9f1cd5..97b1ec332 100644 --- a/tasmota/berry/zigbee/sonoff_zb_pro_flasher.be +++ b/tasmota/berry/zigbee/sonoff_zb_pro_flasher.be @@ -125,23 +125,19 @@ class sonoff_zb_pro_flasher # don't flash so ignore data # check CCFG at location 0x57FD8 (4 bytes) def _check_cb(addr, sz, data, offset) - # import string - # check than sz is a multiple of 4 if (sz % 4 != 0) - import string - raise "value_error", string.format("size of payload is not a mutliple of 4: 0x%06X", addr) + raise "value_error", format("size of payload is not a mutliple of 4: 0x%06X", addr) end - # print(string.format("> addr=0x%06X sz=0x%02X data=%s", addr, sz, data[offset..offset+sz-1])) + # print(format("> addr=0x%06X sz=0x%02X data=%s", addr, sz, data[offset..offset+sz-1])) var CCFG = self.CCFG_address if addr <= CCFG && addr+sz > CCFG+4 # we have CCFG in the buffer var ccfg_bytes = data.get(4 + CCFG - addr, 4) if ccfg_bytes != self.CCFG_reference - import string - raise "value_error", string.format("incorrect CCFG, BSL is not set to DIO_8 LOW (0x%08X expected 0x%08X)", ccfg_bytes, self.CCFG_reference) end + raise "value_error", format("incorrect CCFG, BSL is not set to DIO_8 LOW (0x%08X expected 0x%08X)", ccfg_bytes, self.CCFG_reference) end self.file_validated = true # if we are here, it means that the file looks correct end end diff --git a/tasmota/berry/zigbee/tubezb_cc2652_flasher.be b/tasmota/berry/zigbee/tubezb_cc2652_flasher.be index f96d7b8a6..e988ebd66 100644 --- a/tasmota/berry/zigbee/tubezb_cc2652_flasher.be +++ b/tasmota/berry/zigbee/tubezb_cc2652_flasher.be @@ -125,23 +125,19 @@ class tubezb_cc2652_flasher # don't flash so ignore data # check CCFG at location 0x57FD8 (4 bytes) def _check_cb(addr, sz, data, offset) - # import string - # check than sz is a multiple of 4 if (sz % 4 != 0) - import string - raise "value_error", string.format("size of payload is not a mutliple of 4: 0x%06X", addr) + raise "value_error", format("size of payload is not a mutliple of 4: 0x%06X", addr) end - # print(string.format("> addr=0x%06X sz=0x%02X data=%s", addr, sz, data[offset..offset+sz-1])) + # print(format("> addr=0x%06X sz=0x%02X data=%s", addr, sz, data[offset..offset+sz-1])) var CCFG = self.CCFG_address if addr <= CCFG && addr+sz > CCFG+4 # we have CCFG in the buffer var ccfg_bytes = data.get(4 + CCFG - addr, 4) if ccfg_bytes != self.CCFG_reference - import string - raise "value_error", string.format("incorrect CCFG, BSL is not set to DIO_8 LOW (0x%08X expected 0x%08X)", ccfg_bytes, self.CCFG_reference) end + raise "value_error", format("incorrect CCFG, BSL is not set to DIO_8 LOW (0x%08X expected 0x%08X)", ccfg_bytes, self.CCFG_reference) end self.file_validated = true # if we are here, it means that the file looks correct end end diff --git a/tasmota/tasmota_xdrv_driver/xdrv_52_3_berry_crypto.ino b/tasmota/tasmota_xdrv_driver/xdrv_52_3_berry_crypto.ino index d422f09d8..eff06901e 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_52_3_berry_crypto.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_52_3_berry_crypto.ino @@ -772,11 +772,10 @@ extern "C" { // 11015125C6780B2BCE1D4F68F362692B7D73BC7FFF7FFF7FFF7FFF0F00000040FF7FFF7F0100 // N=bytes('11015125C6780B2BCE1D4F68F362692B7D73BC7FFF7FFF7FFF7FFF0F00000040FF7FFF7F0100') - // import string // s = '' // while size(N) > 0 // var n = N.get(0, 2) - // s += string.format("0x%04X, ", n) + // s += format("0x%04X, ", n) // N = N[2..] // end // print(s) From 7d68c55b380c2b317fa6b77ee64b59fd6eb1721f Mon Sep 17 00:00:00 2001 From: s-hadinger Date: Fri, 23 Jun 2023 16:34:47 +0000 Subject: [PATCH 283/289] Solidified Code updated --- lib/libesp32/berry_tasmota/src/solidify/solidified_i2c_axp192.h | 2 +- lib/libesp32/berry_tasmota/src/solidify/solidified_i2c_axp202.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/libesp32/berry_tasmota/src/solidify/solidified_i2c_axp192.h b/lib/libesp32/berry_tasmota/src/solidify/solidified_i2c_axp192.h index efad30e7a..27a7bf5a7 100644 --- a/lib/libesp32/berry_tasmota/src/solidify/solidified_i2c_axp192.h +++ b/lib/libesp32/berry_tasmota/src/solidify/solidified_i2c_axp192.h @@ -72,7 +72,7 @@ be_local_closure(AXP192_get_bat_power, /* name */ 1, /* has constants */ ( &(const bvalue[ 2]) { /* constants */ /* K0 */ be_nested_str(read24), - /* K1 */ be_const_real_hex(0x3A102DE1), + /* K1 */ be_const_real_hex(0x3A102DE0), }), &be_const_str_get_bat_power, &be_const_str_solidified, diff --git a/lib/libesp32/berry_tasmota/src/solidify/solidified_i2c_axp202.h b/lib/libesp32/berry_tasmota/src/solidify/solidified_i2c_axp202.h index 4d8199e1d..a912b0660 100644 --- a/lib/libesp32/berry_tasmota/src/solidify/solidified_i2c_axp202.h +++ b/lib/libesp32/berry_tasmota/src/solidify/solidified_i2c_axp202.h @@ -172,7 +172,7 @@ be_local_closure(AXP202_get_bat_power, /* name */ 1, /* has constants */ ( &(const bvalue[ 2]) { /* constants */ /* K0 */ be_nested_str(read24), - /* K1 */ be_const_real_hex(0x3A102DE1), + /* K1 */ be_const_real_hex(0x3A102DE0), }), &be_const_str_get_bat_power, &be_const_str_solidified, From 5792dad12bb56f3cfb155f5f2c55b977074a6145 Mon Sep 17 00:00:00 2001 From: s-hadinger <49731213+s-hadinger@users.noreply.github.com> Date: Fri, 23 Jun 2023 19:34:42 +0200 Subject: [PATCH 284/289] Berry reduce bproto structure by 8 bytes (#18946) --- lib/libesp32/berry/src/be_object.h | 6 +++--- lib/libesp32/berry/src/berry.h | 12 ++++++------ 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/lib/libesp32/berry/src/be_object.h b/lib/libesp32/berry/src/be_object.h index f8bd27e3f..72627f65c 100644 --- a/lib/libesp32/berry/src/be_object.h +++ b/lib/libesp32/berry/src/be_object.h @@ -151,15 +151,15 @@ typedef struct bproto { bbyte nupvals; /* upvalue count */ bbyte argc; /* argument count */ bbyte varg; /* variable argument position + 1 */ + int16_t codesize; /* code size */ + int16_t nconst; /* constants count */ + int16_t nproto; /* proto count */ bgcobject *gray; /* for gc gray list */ bupvaldesc *upvals; bvalue *ktab; /* constants table */ struct bproto **ptab; /* proto table */ binstruction *code; /* instructions sequence */ bstring *name; /* function name */ - int codesize; /* code size */ - int nconst; /* constants count */ - int nproto; /* proto count */ bstring *source; /* source file name */ #if BE_DEBUG_RUNTIME_INFO /* debug information */ blineinfo *lineinfo; diff --git a/lib/libesp32/berry/src/berry.h b/lib/libesp32/berry/src/berry.h index 1a99b9190..98c589aef 100644 --- a/lib/libesp32/berry/src/berry.h +++ b/lib/libesp32/berry/src/berry.h @@ -517,15 +517,15 @@ typedef bclass_ptr bclass_array[]; BE_IIF(_is_upval)(sizeof(_name##_upvals)/sizeof(bupvaldesc),0), /**< nupvals */ \ (_argc), /**< argc */ \ 0, /**< varg */ \ + sizeof(_name##_code)/sizeof(uint32_t), /**< codesize */ \ + BE_IIF(_is_const)(sizeof(_name##_ktab)/sizeof(bvalue),0), /**< nconst */ \ + BE_IIF(_is_subproto)(sizeof(_name##_subproto)/sizeof(bproto*),0), /**< proto */ \ NULL, /**< bgcobject *gray */ \ BE_IIF(_is_upval)((bupvaldesc*)&_name##_upvals,NULL), /**< bupvaldesc *upvals */ \ BE_IIF(_is_const)((bvalue*)&_name##_ktab,NULL), /**< ktab */ \ BE_IIF(_is_subproto)((struct bproto**)&_name##_subproto,NULL), /**< bproto **ptab */ \ (binstruction*) &_name##_code, /**< code */ \ be_local_const_str(_name##_str_name), /**< name */ \ - sizeof(_name##_code)/sizeof(uint32_t), /**< codesize */ \ - BE_IIF(_is_const)(sizeof(_name##_ktab)/sizeof(bvalue),0), /**< nconst */ \ - BE_IIF(_is_subproto)(sizeof(_name##_subproto)/sizeof(bproto*),0), /**< proto */ \ be_local_const_str(_name##_str_source), /**< source */ \ PROTO_RUNTIME_BLOCK /**< */ \ PROTO_VAR_INFO_BLOCK /**< */ \ @@ -545,15 +545,15 @@ typedef bclass_ptr bclass_array[]; BE_IIF(_has_upval)(sizeof(*_upvals)/sizeof(bupvaldesc),0), /**< nupvals */ \ (_argc), /**< argc */ \ (_varg), /**< varg */ \ + sizeof(*_code)/sizeof(binstruction), /**< codesize */ \ + BE_IIF(_has_const)(sizeof(*_ktab)/sizeof(bvalue),0), /**< nconst */ \ + BE_IIF(_has_subproto)(sizeof(*_protos)/sizeof(bproto*),0), /**< proto */ \ NULL, /**< bgcobject *gray */ \ (bupvaldesc*) _upvals, /**< bupvaldesc *upvals */ \ (bvalue*) _ktab, /**< ktab */ \ (struct bproto**) _protos, /**< bproto **ptab */ \ (binstruction*) _code, /**< code */ \ ((bstring*) _fname), /**< name */ \ - sizeof(*_code)/sizeof(binstruction), /**< codesize */ \ - BE_IIF(_has_const)(sizeof(*_ktab)/sizeof(bvalue),0), /**< nconst */ \ - BE_IIF(_has_subproto)(sizeof(*_protos)/sizeof(bproto*),0), /**< proto */ \ ((bstring*) _source), /**< source */ \ PROTO_RUNTIME_BLOCK /**< */ \ PROTO_VAR_INFO_BLOCK /**< */ \ From 0ac5d0945b6d1d8a1cacb5bf3f9d5cd360180093 Mon Sep 17 00:00:00 2001 From: s-hadinger <49731213+s-hadinger@users.noreply.github.com> Date: Fri, 23 Jun 2023 23:14:51 +0200 Subject: [PATCH 285/289] Berry add option to remove source file name and save flash space (#18948) --- CHANGELOG.md | 1 + lib/libesp32/berry/default/berry_conf.h | 8 ++++++++ lib/libesp32/berry/src/be_bytecode.c | 10 ++++++++++ lib/libesp32/berry/src/be_debug.c | 4 ++++ lib/libesp32/berry/src/be_func.c | 2 ++ lib/libesp32/berry/src/be_gc.c | 2 ++ lib/libesp32/berry/src/be_module.c | 4 ++++ lib/libesp32/berry/src/be_object.h | 2 ++ lib/libesp32/berry/src/be_parser.c | 4 ++++ lib/libesp32/berry/src/berry.h | 14 +++++++++++++- 10 files changed, 50 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 16cd6dec1..006537d3e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -21,6 +21,7 @@ All notable changes to this project will be documented in this file. - Berry `webclient.url_encode()` is now a static class method, no change required to existing code (#18775) - Matter Bridge mode always on - ESP32 Framework (Core) from v2.0.9 to v2.0.10 +- Berry code size optimizations ### Fixed - Interaction of ``SetOption92``, ``VirtualCT``, and ``RGBWWTable`` (#18768) diff --git a/lib/libesp32/berry/default/berry_conf.h b/lib/libesp32/berry/default/berry_conf.h index 18d64ad81..13200f530 100644 --- a/lib/libesp32/berry/default/berry_conf.h +++ b/lib/libesp32/berry/default/berry_conf.h @@ -60,6 +60,14 @@ **/ #define BE_USE_PRECOMPILED_OBJECT 1 +/* Macro: BE_DEBUG_SOURCE_FILE + * Indicate if each function remembers its source file name + * 0: do not keep the file name (saves 4 bytes per function) + * 1: keep the source file name + * Default: 1 + **/ +#define BE_DEBUG_SOURCE_FILE 0 + /* Macro: BE_DEBUG_RUNTIME_INFO * Set runtime error debugging information. * 0: unable to output source file and line number at runtime. diff --git a/lib/libesp32/berry/src/be_bytecode.c b/lib/libesp32/berry/src/be_bytecode.c index 14a5950fc..133a96618 100644 --- a/lib/libesp32/berry/src/be_bytecode.c +++ b/lib/libesp32/berry/src/be_bytecode.c @@ -114,6 +114,8 @@ static void save_string(void *fp, bstring *s) const char *data = str(s); save_word(fp, length); be_fwrite(fp, data, length); + } else { + save_word(fp, 0); } } @@ -247,7 +249,11 @@ static void save_proto(bvm *vm, void *fp, bproto *proto) { if (proto) { save_string(fp, proto->name); /* name */ +#if BE_DEBUG_SOURCE_FILE save_string(fp, proto->source); /* source */ +#else + save_string(fp, NULL); /* source */ +#endif save_byte(fp, proto->argc); /* argc */ save_byte(fp, proto->nstack); /* nstack */ save_byte(fp, proto->varg); /* varg */ @@ -551,7 +557,11 @@ static bbool load_proto(bvm *vm, void *fp, bproto **proto, int info, int version if (str_len(name)) { *proto = be_newproto(vm); (*proto)->name = name; +#if BE_DEBUG_SOURCE_FILE (*proto)->source = load_string(vm, fp); +#else + load_string(vm, fp); /* discard name */ +#endif (*proto)->argc = load_byte(fp); (*proto)->nstack = load_byte(fp); if (version > 1) { diff --git a/lib/libesp32/berry/src/be_debug.c b/lib/libesp32/berry/src/be_debug.c index 887872cae..39a4cd61c 100644 --- a/lib/libesp32/berry/src/be_debug.c +++ b/lib/libesp32/berry/src/be_debug.c @@ -156,7 +156,9 @@ void be_dumpclosure(bclosure *cl) #if BE_DEBUG_RUNTIME_INFO blineinfo *lineinfo = proto->lineinfo; #endif +#if BE_DEBUG_SOURCE_FILE logfmt("source '%s', ", str(proto->source)); +#endif logfmt("function '%s':\n", str(proto->name)); #if BE_DEBUG_RUNTIME_INFO if (lineinfo) { /* first line */ @@ -185,7 +187,9 @@ static void sourceinfo(bproto *proto, binstruction *ip) int pc = cast_int(ip - proto->code - 1); /* now vm->ip has been increased */ for (; it < end && pc > it->endpc; ++it); snprintf(buf, sizeof(buf), ":%d:", it->linenumber); +#if BE_DEBUG_SOURCE_FILE be_writestring(str(proto->source)); +#endif be_writestring(buf); } else { be_writestring(":"); diff --git a/lib/libesp32/berry/src/be_func.c b/lib/libesp32/berry/src/be_func.c index d49229954..b1280d9ec 100644 --- a/lib/libesp32/berry/src/be_func.c +++ b/lib/libesp32/berry/src/be_func.c @@ -108,7 +108,9 @@ bproto* be_newproto(bvm *vm) p->codesize = 0; p->argc = 0; p->varg = 0; +#if BE_DEBUG_SOURCE_FILE p->source = NULL; +#endif #if BE_DEBUG_RUNTIME_INFO p->lineinfo = NULL; p->nlineinfo = 0; diff --git a/lib/libesp32/berry/src/be_gc.c b/lib/libesp32/berry/src/be_gc.c index f7532e239..e66afa56d 100644 --- a/lib/libesp32/berry/src/be_gc.c +++ b/lib/libesp32/berry/src/be_gc.c @@ -231,7 +231,9 @@ static void mark_proto(bvm *vm, bgcobject *obj) mark_gray(vm, gc_object(*ptab)); } gc_setdark_safe(p->name); +#if BE_DEBUG_SOURCE_FILE gc_setdark_safe(p->source); +#endif #if BE_DEBUG_VAR_INFO if (p->nvarinfo) { bvarinfo *vinfo = p->varinfo; diff --git a/lib/libesp32/berry/src/be_module.c b/lib/libesp32/berry/src/be_module.c index ff5503011..99b9bbc08 100644 --- a/lib/libesp32/berry/src/be_module.c +++ b/lib/libesp32/berry/src/be_module.c @@ -128,11 +128,15 @@ static char* fixpath(bvm *vm, bstring *path, size_t *size) const char *split, *base; bvalue *func = vm->cf->func; bclosure *cl = var_toobj(func); +#if BE_DEBUG_SOURCE_FILE if (var_isclosure(func)) { base = str(cl->proto->source); /* get the source file path */ } else { base = "/"; } +#else + base = "/"; +#endif split = be_splitpath(base); *size = split - base + (size_t)str_len(path) + SUFFIX_LEN; buffer = be_malloc(vm, *size); diff --git a/lib/libesp32/berry/src/be_object.h b/lib/libesp32/berry/src/be_object.h index 72627f65c..fd29090ad 100644 --- a/lib/libesp32/berry/src/be_object.h +++ b/lib/libesp32/berry/src/be_object.h @@ -160,7 +160,9 @@ typedef struct bproto { struct bproto **ptab; /* proto table */ binstruction *code; /* instructions sequence */ bstring *name; /* function name */ +#if BE_DEBUG_SOURCE_FILE bstring *source; /* source file name */ +#endif #if BE_DEBUG_RUNTIME_INFO /* debug information */ blineinfo *lineinfo; int nlineinfo; diff --git a/lib/libesp32/berry/src/be_parser.c b/lib/libesp32/berry/src/be_parser.c index 107ae5522..59e57d067 100644 --- a/lib/libesp32/berry/src/be_parser.c +++ b/lib/libesp32/berry/src/be_parser.c @@ -228,9 +228,11 @@ static void end_block(bparser *parser) `stdin` or the name of the current function */ static bstring* parser_source(bparser *parser) { +#if BE_DEBUG_SOURCE_FILE if (parser->finfo) { return parser->finfo->proto->source; } +#endif return be_newstr(parser->vm, parser->lexer.fname); } @@ -250,7 +252,9 @@ static void begin_func(bparser *parser, bfuncinfo *finfo, bblockinfo *binfo) be_vector_init(vm, &finfo->pvec, sizeof(bproto*)); /* vector for subprotos */ proto->ptab = be_vector_data(&finfo->pvec); proto->nproto = be_vector_capacity(&finfo->pvec); +#if BE_DEBUG_SOURCE_FILE proto->source = parser_source(parser); /* keep a copy of source for function */ +#endif finfo->local = be_list_new(vm); /* list for local variables */ var_setlist(vm->top, finfo->local); /* push list of local variables on the stack (avoid gc) */ be_stackpush(vm); diff --git a/lib/libesp32/berry/src/berry.h b/lib/libesp32/berry/src/berry.h index 98c589aef..206d35437 100644 --- a/lib/libesp32/berry/src/berry.h +++ b/lib/libesp32/berry/src/berry.h @@ -477,6 +477,18 @@ typedef bclass_ptr bclass_array[]; #define be_local_const_upval(ins, idx) { ins, idx } #endif +/** + * @def PROTO_RUNTIME_BLOCK + * @brief conditional block in bproto depending on compilation options + * + */ +#if BE_SOURCE_FILE + #define PROTO_SOURCE_FILE(n) \ + ((bstring*) _source), /**< source */ +#else + #define PROTO_SOURCE_FILE(n) +#endif + /** * @def PROTO_RUNTIME_BLOCK * @brief conditional block in bproto depending on compilation options @@ -554,7 +566,7 @@ typedef bclass_ptr bclass_array[]; (struct bproto**) _protos, /**< bproto **ptab */ \ (binstruction*) _code, /**< code */ \ ((bstring*) _fname), /**< name */ \ - ((bstring*) _source), /**< source */ \ + PROTO_SOURCE_FILE(_source) /**< source */ \ PROTO_RUNTIME_BLOCK /**< */ \ PROTO_VAR_INFO_BLOCK /**< */ \ } From 1f1669366482c1c52785e94bc57a73be0cf1e041 Mon Sep 17 00:00:00 2001 From: Davide Beatrici Date: Sat, 24 Jun 2023 10:24:48 +0200 Subject: [PATCH 286/289] "Tamota" -> "Tasmota" (#18950) --- lib/lib_ssl/bearssl-esp8266/library.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/lib_ssl/bearssl-esp8266/library.properties b/lib/lib_ssl/bearssl-esp8266/library.properties index 032d4d247..7728af80c 100644 --- a/lib/lib_ssl/bearssl-esp8266/library.properties +++ b/lib/lib_ssl/bearssl-esp8266/library.properties @@ -2,7 +2,7 @@ name=BearSSL version=0.6 author=Thomas Pornin maintainer=Earle F. Philhower, III -sentence=BearSSL implementation of the SSL/TLS protocol optimized for ESP8266 by Earle F. Philhower, optimized for Tamota by Stephan Hadinger +sentence=BearSSL implementation of the SSL/TLS protocol optimized for ESP8266 by Earle F. Philhower, optimized for Tasmota by Stephan Hadinger paragraph= category=Other url=https://github.com/earlephilhower/bearssl-esp8266.git From 9a3d3988a2ceeaf35eab30b8bf42e238049667d9 Mon Sep 17 00:00:00 2001 From: s-hadinger <49731213+s-hadinger@users.noreply.github.com> Date: Sat, 24 Jun 2023 10:52:37 +0200 Subject: [PATCH 287/289] Matter remove unused clusters labels (#18951) --- .../generate/be_matter_clusters.h | 32 +++++++++---------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/lib/libesp32/berry_matter/generate/be_matter_clusters.h b/lib/libesp32/berry_matter/generate/be_matter_clusters.h index e25982844..350d8b9fc 100644 --- a/lib/libesp32/berry_matter/generate/be_matter_clusters.h +++ b/lib/libesp32/berry_matter/generate/be_matter_clusters.h @@ -1528,7 +1528,7 @@ const matter_cluster_t matterAllClusters[] = { { 0x0032, "DiagnosticLogs", matter_Attributes_0032, matter_Commands_0032 }, { 0x0033, "GeneralDiagnostics", matter_Attributes_0033, matter_Commands_0033 }, { 0x0034, "SoftwareDiagnostics", matter_Attributes_0034, matter_Commands_0034 }, - { 0x0035, "ThreadNetworkDiagnostics", matter_Attributes_0035, matter_Commands_0035 }, + // { 0x0035, "ThreadNetworkDiagnostics", matter_Attributes_0035, matter_Commands_0035 }, { 0x0036, "WiFiNetworkDiagnostics", matter_Attributes_0036, matter_Commands_0036 }, { 0x0037, "EthernetNetworkDiagnostics", matter_Attributes_0037, matter_Commands_0037 }, { 0x0039, "BridgedDeviceBasic", matter_Attributes_0039, matter_Commands_0039 }, @@ -1542,31 +1542,31 @@ const matter_cluster_t matterAllClusters[] = { { 0x0050, "ModeSelect", matter_Attributes_0050, matter_Commands_0050 }, { 0x0101, "DoorLock", matter_Attributes_0101, matter_Commands_0101 }, { 0x0102, "WindowCovering", matter_Attributes_0102, matter_Commands_0102 }, - { 0x0103, "BarrierControl", matter_Attributes_0103, matter_Commands_0103 }, + // { 0x0103, "BarrierControl", matter_Attributes_0103, matter_Commands_0103 }, { 0x0200, "PumpConfigurationAndControl", matter_Attributes_0200, matter_Commands_0200 }, { 0x0201, "Thermostat", matter_Attributes_0201, matter_Commands_0201 }, { 0x0202, "FanControl", matter_Attributes_0202, matter_Commands_0202 }, { 0x0204, "ThermostatUserInterfaceConfiguration", matter_Attributes_0204, matter_Commands_0204 }, { 0x0300, "ColorControl", matter_Attributes_0300, matter_Commands_0300 }, - { 0x0301, "BallastConfiguration", matter_Attributes_0301, matter_Commands_0301 }, + // { 0x0301, "BallastConfiguration", matter_Attributes_0301, matter_Commands_0301 }, { 0x0400, "IlluminanceMeasurement", matter_Attributes_0400, matter_Commands_0400 }, { 0x0402, "TemperatureMeasurement", matter_Attributes_0402, matter_Commands_0402 }, { 0x0403, "PressureMeasurement", matter_Attributes_0403, matter_Commands_0403 }, { 0x0404, "FlowMeasurement", matter_Attributes_0404, matter_Commands_0404 }, { 0x0405, "RelativeHumidityMeasurement", matter_Attributes_0405, matter_Commands_0405 }, { 0x0406, "OccupancySensing", matter_Attributes_0406, matter_Commands_0406 }, - { 0x0503, "WakeOnLan", matter_Attributes_0503, matter_Commands_0503 }, - { 0x0504, "Channel", matter_Attributes_0504, matter_Commands_0504 }, - { 0x0505, "TargetNavigator", matter_Attributes_0505, matter_Commands_0505 }, - { 0x0506, "MediaPlayback", matter_Attributes_0506, matter_Commands_0506 }, - { 0x0507, "MediaInput", matter_Attributes_0507, matter_Commands_0507 }, - { 0x0508, "LowPower", matter_Attributes_0508, matter_Commands_0508 }, - { 0x0509, "KeypadInput", matter_Attributes_0509, matter_Commands_0509 }, - { 0x050A, "ContentLauncher", matter_Attributes_050A, matter_Commands_050A }, - { 0x050B, "AudioOutput", matter_Attributes_050B, matter_Commands_050B }, - { 0x050C, "ApplicationLauncher", matter_Attributes_050C, matter_Commands_050C }, - { 0x050D, "ApplicationBasic", matter_Attributes_050D, matter_Commands_050D }, - { 0x050E, "AccountLogin", matter_Attributes_050E, matter_Commands_050E }, - { 0x0B04, "ElectricalMeasurement", matter_Attributes_0B04, matter_Commands_0B04 }, + // { 0x0503, "WakeOnLan", matter_Attributes_0503, matter_Commands_0503 }, + // { 0x0504, "Channel", matter_Attributes_0504, matter_Commands_0504 }, + // { 0x0505, "TargetNavigator", matter_Attributes_0505, matter_Commands_0505 }, + // { 0x0506, "MediaPlayback", matter_Attributes_0506, matter_Commands_0506 }, + // { 0x0507, "MediaInput", matter_Attributes_0507, matter_Commands_0507 }, + // { 0x0508, "LowPower", matter_Attributes_0508, matter_Commands_0508 }, + // { 0x0509, "KeypadInput", matter_Attributes_0509, matter_Commands_0509 }, + // { 0x050A, "ContentLauncher", matter_Attributes_050A, matter_Commands_050A }, + // { 0x050B, "AudioOutput", matter_Attributes_050B, matter_Commands_050B }, + // { 0x050C, "ApplicationLauncher", matter_Attributes_050C, matter_Commands_050C }, + // { 0x050D, "ApplicationBasic", matter_Attributes_050D, matter_Commands_050D }, + // { 0x050E, "AccountLogin", matter_Attributes_050E, matter_Commands_050E }, + // { 0x0B04, "ElectricalMeasurement", matter_Attributes_0B04, matter_Commands_0B04 }, { 0xFFFF, NULL, NULL }, }; From b419ae3a92bcf87e9a50d5bf572ddebad7280370 Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Sat, 24 Jun 2023 11:39:26 +0200 Subject: [PATCH 288/289] add matter as a default option in most env (#18942) --- tasmota/include/tasmota_configurations_ESP32.h | 3 +++ 1 file changed, 3 insertions(+) diff --git a/tasmota/include/tasmota_configurations_ESP32.h b/tasmota/include/tasmota_configurations_ESP32.h index 7120d7d18..0bb651734 100644 --- a/tasmota/include/tasmota_configurations_ESP32.h +++ b/tasmota/include/tasmota_configurations_ESP32.h @@ -288,6 +288,7 @@ #undef FALLBACK_MODULE #define FALLBACK_MODULE WEMOS // [Module2] Select default module on fast reboot where USER_MODULE is user template +#define USE_MATTER_DEVICE #undef USE_DOMOTICZ #undef USE_HOME_ASSISTANT #define USE_TASMOTA_DISCOVERY // Enable Tasmota Discovery support (+2k code) @@ -557,6 +558,8 @@ #define CODE_IMAGE_STR "tasmota32" #endif +#define USE_MATTER_DEVICE + #define USE_INFLUXDB // Enable influxdb support (+5k code) #define USE_ENHANCED_GUI_WIFI_SCAN From 01abf97410f5df22468f3d59c376e6f00b08c0cd Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Sat, 24 Jun 2023 11:41:57 +0200 Subject: [PATCH 289/289] Revert "add matter builds to the env and gh actions (#18932)" (#18952) This reverts commit 8ae819d7d9ad010df4f4a7835ab3cd3e2dfc4770. --- .github/workflows/Tasmota_build_devel.yml | 5 -- .github/workflows/Tasmota_build_master.yml | 5 -- .github/workflows/build_all_the_things.yml | 3 -- platformio_tasmota_env32.ini | 63 ---------------------- 4 files changed, 76 deletions(-) diff --git a/.github/workflows/Tasmota_build_devel.yml b/.github/workflows/Tasmota_build_devel.yml index be75ce913..1d7d24852 100644 --- a/.github/workflows/Tasmota_build_devel.yml +++ b/.github/workflows/Tasmota_build_devel.yml @@ -157,11 +157,6 @@ jobs: matrix: variant: - tasmota32 - - tasmota32-matter - - tasmota32c3-matter - - tasmota32s3-matter - - tasmota32c3cdc-matter - - tasmota32s3cdc-matter - tasmota32-zbbrdgpro - tasmota32-webcam - tasmota32-bluetooth diff --git a/.github/workflows/Tasmota_build_master.yml b/.github/workflows/Tasmota_build_master.yml index 71ee36db0..7f46ee44b 100644 --- a/.github/workflows/Tasmota_build_master.yml +++ b/.github/workflows/Tasmota_build_master.yml @@ -156,11 +156,6 @@ jobs: matrix: variant: - tasmota32 - - tasmota32-matter - - tasmota32c3-matter - - tasmota32s3-matter - - tasmota32c3cdc-matter - - tasmota32s3cdc-matter - tasmota32-zbbrdgpro - tasmota32-webcam - tasmota32-bluetooth diff --git a/.github/workflows/build_all_the_things.yml b/.github/workflows/build_all_the_things.yml index 9f68b4b30..3f89214e3 100644 --- a/.github/workflows/build_all_the_things.yml +++ b/.github/workflows/build_all_the_things.yml @@ -93,9 +93,6 @@ jobs: - tasmota32c3 - tasmota32s2 - tasmota32s3 - - tasmota32-matter - - tasmota32c3-matter - - tasmota32s3-matter - tasmota32-zbbrdgpro - tasmota-zigbee - tasmota32-bluetooth diff --git a/platformio_tasmota_env32.ini b/platformio_tasmota_env32.ini index 8db151d42..337255131 100644 --- a/platformio_tasmota_env32.ini +++ b/platformio_tasmota_env32.ini @@ -161,69 +161,6 @@ build_flags = ${env:tasmota32_base.build_flags} -DFRAMEWORK_ARDUINO_ITEAD -DOTA_URL='"http://ota.tasmota.com/tasmota32/release/tasmota32-nspanel.bin"' -[env:tasmota32-matter] -extends = env:tasmota32_base -board_build.f_flash = 80000000L -board_build.f_cpu = 240000000L -build_flags = ${env:tasmota32_base.build_flags} - -DFIRMWARE_TASMOTA32 - -DUSE_MATTER_DEVICE - -DCODE_IMAGE_STR='"matter"' - -DOTA_URL='"http://ota.tasmota.com/tasmota32/release/tasmota32-matter.bin"' - -[env:tasmota32c3-matter] -extends = env:tasmota32c3 -board = esp32c3 -board_build.flash_mode = qio -build_flags = ${env:tasmota32_base.build_flags} - -fno-lto - -DFIRMWARE_TASMOTA32 - -DUSE_MATTER_DEVICE - -DCODE_IMAGE_STR='"matter"' - -DOTA_URL='"http://ota.tasmota.com/tasmota32/release/tasmota32c3-matter.bin"' - -[env:tasmota32s3-matter] -extends = env:tasmota32_base -board_build.f_flash = 80000000L -board_build.f_cpu = 240000000L -board_build.flash_mode = qio -board = esp32s3-qio_qspi -build_flags = ${env:tasmota32_base.build_flags} - -DFIRMWARE_TASMOTA32 - -DUSE_MATTER_DEVICE - -DCODE_IMAGE_STR='"matter"' - -DOTA_URL='"http://ota.tasmota.com/tasmota32/release/tasmota32s3-matter.bin"' -lib_ignore = - TTGO TWatch Library - Micro-RTSP - epdiy - -[env:tasmota32c3cdc-matter] -extends = env:tasmota32c3 -board = esp32c3cdc -build_flags = ${env:tasmota32_base.build_flags} - -fno-lto - -DFIRMWARE_TASMOTA32 - -DUSE_MATTER_DEVICE - -DCODE_IMAGE_STR='"matter"' - -DOTA_URL='"http://ota.tasmota.com/tasmota32/release/tasmota32c3cdc-matter.bin"' - -[env:tasmota32s3cdc-matter] -extends = env:tasmota32_base -board_build.f_flash = 80000000L -board_build.f_cpu = 240000000L -board_build.flash_mode = qio -board = esp32s3cdc-qio_qspi -build_flags = ${env:tasmota32_base.build_flags} - -DFIRMWARE_TASMOTA32 - -DUSE_MATTER_DEVICE - -DCODE_IMAGE_STR='"matter"' - -DOTA_URL='"http://ota.tasmota.com/tasmota32/release/tasmota32s3cdc-matter.bin"' -lib_ignore = - TTGO TWatch Library - Micro-RTSP - epdiy - [env:tasmota32c3-safeboot] extends = env:tasmota32_base board = esp32c3